Initialize Tizen 2.3 tizen_2.3 2.3a_release submit/tizen_2.3/20140531.104859
authorSehong Na <sehong.na@samsung.com>
Sat, 31 May 2014 03:58:08 +0000 (12:58 +0900)
committerSehong Na <sehong.na@samsung.com>
Sat, 31 May 2014 03:58:08 +0000 (12:58 +0900)
639 files changed:
AUTHORS [new file with mode: 0644]
CMakeLists.txt [new file with mode: 0644]
COPYING [new file with mode: 0644]
ChangeLog [new file with mode: 0644]
ConfigureChecks.cmake [new file with mode: 0644]
INSTALL [new file with mode: 0644]
Makefile.am [new file with mode: 0644]
Makefile.in [new file with mode: 0644]
NEWS [new file with mode: 0644]
README [new file with mode: 0644]
README-XPDF [new file with mode: 0644]
TODO [new file with mode: 0644]
aclocal.m4 [new file with mode: 0644]
cmake/modules/COPYING-CMAKE-SCRIPTS [new file with mode: 0644]
cmake/modules/FindCairo.cmake [new file with mode: 0644]
cmake/modules/FindFontconfig.cmake [new file with mode: 0644]
cmake/modules/FindGLIB.cmake [new file with mode: 0644]
cmake/modules/FindGObjectIntrospection.cmake [new file with mode: 0644]
cmake/modules/FindGTK.cmake [new file with mode: 0644]
cmake/modules/FindIconv.cmake [new file with mode: 0644]
cmake/modules/FindLCMS.cmake [new file with mode: 0644]
cmake/modules/FindLCMS2.cmake [new file with mode: 0644]
cmake/modules/FindLIBOPENJPEG.cmake [new file with mode: 0644]
cmake/modules/FindQt4.cmake [new file with mode: 0644]
cmake/modules/GObjectIntrospectionMacros.cmake [new file with mode: 0644]
cmake/modules/MacroBoolTo01.cmake [new file with mode: 0644]
cmake/modules/MacroEnsureVersion.cmake [new file with mode: 0644]
cmake/modules/MacroOptionalFindPackage.cmake [new file with mode: 0644]
cmake/modules/MacroPushRequiredVars.cmake [new file with mode: 0644]
cmake/modules/PopplerDefaults.cmake [new file with mode: 0644]
cmake/modules/PopplerMacros.cmake [new file with mode: 0644]
config.guess [new file with mode: 0755]
config.h.cmake [new file with mode: 0644]
config.h.in [new file with mode: 0644]
config.sub [new file with mode: 0755]
configure [new file with mode: 0755]
configure.ac [new file with mode: 0644]
cpp/CMakeLists.txt [new file with mode: 0644]
cpp/Makefile.am [new file with mode: 0644]
cpp/Makefile.in [new file with mode: 0644]
cpp/PNMWriter.cc [new file with mode: 0644]
cpp/PNMWriter.h [new file with mode: 0644]
cpp/poppler-document-private.h [new file with mode: 0644]
cpp/poppler-document.cpp [new file with mode: 0644]
cpp/poppler-document.h [new file with mode: 0644]
cpp/poppler-embedded-file-private.h [new file with mode: 0644]
cpp/poppler-embedded-file.cpp [new file with mode: 0644]
cpp/poppler-embedded-file.h [new file with mode: 0644]
cpp/poppler-font.cpp [new file with mode: 0644]
cpp/poppler-font.h [new file with mode: 0644]
cpp/poppler-global.cpp [new file with mode: 0644]
cpp/poppler-global.h [new file with mode: 0644]
cpp/poppler-image-private.h [new file with mode: 0644]
cpp/poppler-image.cpp [new file with mode: 0644]
cpp/poppler-image.h [new file with mode: 0644]
cpp/poppler-page-private.h [new file with mode: 0644]
cpp/poppler-page-renderer.cpp [new file with mode: 0644]
cpp/poppler-page-renderer.h [new file with mode: 0644]
cpp/poppler-page-transition.cpp [new file with mode: 0644]
cpp/poppler-page-transition.h [new file with mode: 0644]
cpp/poppler-page.cpp [new file with mode: 0644]
cpp/poppler-page.h [new file with mode: 0644]
cpp/poppler-private.cpp [new file with mode: 0644]
cpp/poppler-private.h [new file with mode: 0644]
cpp/poppler-rectangle.cpp [new file with mode: 0644]
cpp/poppler-rectangle.h [new file with mode: 0644]
cpp/poppler-toc-private.h [new file with mode: 0644]
cpp/poppler-toc.cpp [new file with mode: 0644]
cpp/poppler-toc.h [new file with mode: 0644]
cpp/poppler-version.cpp [new file with mode: 0644]
cpp/poppler-version.h [new file with mode: 0644]
cpp/poppler-version.h.in [new file with mode: 0644]
cpp/tests/CMakeLists.txt [new file with mode: 0644]
cpp/tests/Makefile.am [new file with mode: 0644]
cpp/tests/Makefile.in [new file with mode: 0644]
cpp/tests/poppler-dump.cpp [new file with mode: 0644]
cpp/tests/poppler-render.cpp [new file with mode: 0644]
debian/changelog [new file with mode: 0644]
debian/compat [new file with mode: 0644]
debian/control [new file with mode: 0644]
debian/copyright [new file with mode: 0644]
debian/docs [new file with mode: 0644]
debian/gir1.2-poppler-0.18.install [new file with mode: 0644]
debian/libpoppler-cpp-dev.install [new file with mode: 0644]
debian/libpoppler-cpp0.install [new file with mode: 0644]
debian/libpoppler-dev.install [new file with mode: 0644]
debian/libpoppler-glib-dev.install [new file with mode: 0644]
debian/libpoppler-glib-dev.links [new file with mode: 0644]
debian/libpoppler-glib8.install [new file with mode: 0644]
debian/libpoppler-private-dev.lintian-overrides [new file with mode: 0644]
debian/libpoppler-qt4-3.install [new file with mode: 0644]
debian/libpoppler-qt4-dev.install [new file with mode: 0644]
debian/libpoppler25.install [new file with mode: 0644]
debian/poppler-utils.install [new file with mode: 0644]
debian/rules [new file with mode: 0755]
debian/rules.org [new file with mode: 0755]
debian/source/format [new file with mode: 0644]
debian/watch [new file with mode: 0644]
depcomp [new file with mode: 0755]
fofi/FoFiBase.cc [new file with mode: 0644]
fofi/FoFiBase.h [new file with mode: 0644]
fofi/FoFiEncodings.cc [new file with mode: 0644]
fofi/FoFiEncodings.h [new file with mode: 0644]
fofi/FoFiIdentifier.cc [new file with mode: 0644]
fofi/FoFiIdentifier.h [new file with mode: 0644]
fofi/FoFiTrueType.cc [new file with mode: 0644]
fofi/FoFiTrueType.h [new file with mode: 0644]
fofi/FoFiType1.cc [new file with mode: 0644]
fofi/FoFiType1.h [new file with mode: 0644]
fofi/FoFiType1C.cc [new file with mode: 0644]
fofi/FoFiType1C.h [new file with mode: 0644]
fofi/Makefile.am [new file with mode: 0644]
fofi/Makefile.in [new file with mode: 0644]
glib/CMakeLists.txt [new file with mode: 0644]
glib/Makefile.am [new file with mode: 0644]
glib/Makefile.in [new file with mode: 0644]
glib/Poppler-0.18.gir [new file with mode: 0644]
glib/demo/CMakeLists.txt [new file with mode: 0644]
glib/demo/Makefile.am [new file with mode: 0644]
glib/demo/Makefile.in [new file with mode: 0644]
glib/demo/annots.c [new file with mode: 0644]
glib/demo/annots.h [new file with mode: 0644]
glib/demo/attachments.c [new file with mode: 0644]
glib/demo/attachments.h [new file with mode: 0644]
glib/demo/find.c [new file with mode: 0644]
glib/demo/find.h [new file with mode: 0644]
glib/demo/fonts.c [new file with mode: 0644]
glib/demo/fonts.h [new file with mode: 0644]
glib/demo/forms.c [new file with mode: 0644]
glib/demo/forms.h [new file with mode: 0644]
glib/demo/images.c [new file with mode: 0644]
glib/demo/images.h [new file with mode: 0644]
glib/demo/info.cc [new file with mode: 0644]
glib/demo/info.h [new file with mode: 0644]
glib/demo/layers.c [new file with mode: 0644]
glib/demo/layers.h [new file with mode: 0644]
glib/demo/links.c [new file with mode: 0644]
glib/demo/links.h [new file with mode: 0644]
glib/demo/main.c [new file with mode: 0644]
glib/demo/outline.c [new file with mode: 0644]
glib/demo/outline.h [new file with mode: 0644]
glib/demo/page.c [new file with mode: 0644]
glib/demo/page.h [new file with mode: 0644]
glib/demo/print.c [new file with mode: 0644]
glib/demo/print.h [new file with mode: 0644]
glib/demo/render.c [new file with mode: 0644]
glib/demo/render.h [new file with mode: 0644]
glib/demo/selections.c [new file with mode: 0644]
glib/demo/selections.h [new file with mode: 0644]
glib/demo/text.c [new file with mode: 0644]
glib/demo/text.h [new file with mode: 0644]
glib/demo/transitions.c [new file with mode: 0644]
glib/demo/transitions.h [new file with mode: 0644]
glib/demo/utils.c [new file with mode: 0644]
glib/demo/utils.h [new file with mode: 0644]
glib/poppler-action.cc [new file with mode: 0644]
glib/poppler-action.h [new file with mode: 0644]
glib/poppler-annot.cc [new file with mode: 0644]
glib/poppler-annot.h [new file with mode: 0644]
glib/poppler-attachment.cc [new file with mode: 0644]
glib/poppler-attachment.h [new file with mode: 0644]
glib/poppler-date.cc [new file with mode: 0644]
glib/poppler-date.h [new file with mode: 0644]
glib/poppler-document.cc [new file with mode: 0644]
glib/poppler-document.h [new file with mode: 0644]
glib/poppler-enums.c [new file with mode: 0644]
glib/poppler-enums.c.template [new file with mode: 0644]
glib/poppler-enums.h [new file with mode: 0644]
glib/poppler-enums.h.template [new file with mode: 0644]
glib/poppler-features.h.cmake [new file with mode: 0644]
glib/poppler-features.h.in [new file with mode: 0644]
glib/poppler-form-field.cc [new file with mode: 0644]
glib/poppler-form-field.h [new file with mode: 0644]
glib/poppler-layer.cc [new file with mode: 0644]
glib/poppler-layer.h [new file with mode: 0644]
glib/poppler-media.cc [new file with mode: 0644]
glib/poppler-media.h [new file with mode: 0644]
glib/poppler-movie.cc [new file with mode: 0644]
glib/poppler-movie.h [new file with mode: 0644]
glib/poppler-page.cc [new file with mode: 0644]
glib/poppler-page.h [new file with mode: 0644]
glib/poppler-private.h [new file with mode: 0644]
glib/poppler.cc [new file with mode: 0644]
glib/poppler.h [new file with mode: 0644]
glib/reference/Makefile.am [new file with mode: 0644]
glib/reference/Makefile.in [new file with mode: 0644]
glib/reference/html/PopplerAnnot.html [new file with mode: 0644]
glib/reference/html/PopplerAttachment.html [new file with mode: 0644]
glib/reference/html/PopplerDocument.html [new file with mode: 0644]
glib/reference/html/PopplerFormField.html [new file with mode: 0644]
glib/reference/html/PopplerLayer.html [new file with mode: 0644]
glib/reference/html/PopplerMedia.html [new file with mode: 0644]
glib/reference/html/PopplerMovie.html [new file with mode: 0644]
glib/reference/html/PopplerPage.html [new file with mode: 0644]
glib/reference/html/annotation-glossary.html [new file with mode: 0644]
glib/reference/html/api-index-0-12.html [new file with mode: 0644]
glib/reference/html/api-index-0-14.html [new file with mode: 0644]
glib/reference/html/api-index-0-16.html [new file with mode: 0644]
glib/reference/html/api-index-0-18.html [new file with mode: 0644]
glib/reference/html/api-index-0-20.html [new file with mode: 0644]
glib/reference/html/api-index-deprecated.html [new file with mode: 0644]
glib/reference/html/api-index-full.html [new file with mode: 0644]
glib/reference/html/ch01.html [new file with mode: 0644]
glib/reference/html/home.png [new file with mode: 0644]
glib/reference/html/index.html [new file with mode: 0644]
glib/reference/html/index.sgml [new file with mode: 0644]
glib/reference/html/left.png [new file with mode: 0644]
glib/reference/html/poppler-PopplerAction.html [new file with mode: 0644]
glib/reference/html/poppler-Version-and-Features-Information.html [new file with mode: 0644]
glib/reference/html/poppler-poppler.html [new file with mode: 0644]
glib/reference/html/poppler.devhelp2 [new file with mode: 0644]
glib/reference/html/right.png [new file with mode: 0644]
glib/reference/html/style.css [new file with mode: 0644]
glib/reference/html/up.png [new file with mode: 0644]
glib/reference/poppler-docs.sgml [new file with mode: 0644]
glib/reference/poppler-overrides.txt [new file with mode: 0644]
glib/reference/poppler-sections.txt [new file with mode: 0644]
glib/reference/poppler.types [new file with mode: 0644]
glib/reference/version.xml [new file with mode: 0644]
glib/reference/version.xml.in [new file with mode: 0644]
goo/FixedPoint.cc [new file with mode: 0644]
goo/FixedPoint.h [new file with mode: 0644]
goo/GooHash.cc [new file with mode: 0644]
goo/GooHash.h [new file with mode: 0644]
goo/GooLikely.h [new file with mode: 0644]
goo/GooList.cc [new file with mode: 0644]
goo/GooList.h [new file with mode: 0644]
goo/GooMutex.h [new file with mode: 0644]
goo/GooString.cc [new file with mode: 0644]
goo/GooString.h [new file with mode: 0644]
goo/GooTimer.cc [new file with mode: 0644]
goo/GooTimer.h [new file with mode: 0644]
goo/ImgWriter.cc [new file with mode: 0644]
goo/ImgWriter.h [new file with mode: 0644]
goo/JpegWriter.cc [new file with mode: 0644]
goo/JpegWriter.h [new file with mode: 0644]
goo/Makefile.am [new file with mode: 0644]
goo/Makefile.in [new file with mode: 0644]
goo/PNGWriter.cc [new file with mode: 0644]
goo/PNGWriter.h [new file with mode: 0644]
goo/TiffWriter.cc [new file with mode: 0644]
goo/TiffWriter.h [new file with mode: 0644]
goo/gfile.cc [new file with mode: 0644]
goo/gfile.h [new file with mode: 0644]
goo/gmem.cc [new file with mode: 0644]
goo/gmem.h [new file with mode: 0644]
goo/gmempp.cc [new file with mode: 0644]
goo/gstrtod.cc [new file with mode: 0644]
goo/gstrtod.h [new file with mode: 0644]
goo/gtypes.h [new file with mode: 0644]
goo/gtypes_p.h [new file with mode: 0644]
gtk-doc.make [new file with mode: 0644]
install-sh [new file with mode: 0755]
libpoppler-cpp.manifest [new file with mode: 0644]
libpoppler-glib.manifest [new file with mode: 0644]
libpoppler.manifest [new file with mode: 0644]
ltmain.sh [new file with mode: 0644]
m4/acx_pthread.m4 [new file with mode: 0644]
m4/define-dir.m4 [new file with mode: 0644]
m4/gtk-doc.m4 [new file with mode: 0644]
m4/iconv.m4 [new file with mode: 0644]
m4/introspection.m4 [new file with mode: 0644]
m4/libjpeg.m4 [new file with mode: 0644]
m4/libtool.m4 [new file with mode: 0644]
m4/ltoptions.m4 [new file with mode: 0644]
m4/ltsugar.m4 [new file with mode: 0644]
m4/ltversion.m4 [new file with mode: 0644]
m4/lt~obsolete.m4 [new file with mode: 0644]
missing [new file with mode: 0755]
packaging/poppler-0.12.4-annot-appearance.patch [new file with mode: 0644]
packaging/poppler-0.20.1-empty-password.patch [new file with mode: 0644]
packaging/poppler-0.20.2-ps-conversion.patch [new file with mode: 0644]
packaging/poppler-0.20.2-scale-init.patch [new file with mode: 0644]
packaging/poppler.spec [new file with mode: 0644]
poppler-cairo-uninstalled.pc.in [new file with mode: 0644]
poppler-cairo.pc.cmake [new file with mode: 0644]
poppler-cairo.pc.in [new file with mode: 0644]
poppler-cpp-uninstalled.pc.in [new file with mode: 0644]
poppler-cpp.pc.cmake [new file with mode: 0644]
poppler-cpp.pc.in [new file with mode: 0644]
poppler-glib-uninstalled.pc.in [new file with mode: 0644]
poppler-glib.pc.cmake [new file with mode: 0644]
poppler-glib.pc.in [new file with mode: 0644]
poppler-qt4-uninstalled.pc.in [new file with mode: 0644]
poppler-qt4.pc.cmake [new file with mode: 0644]
poppler-qt4.pc.in [new file with mode: 0644]
poppler-splash-uninstalled.pc.in [new file with mode: 0644]
poppler-splash.pc.cmake [new file with mode: 0644]
poppler-splash.pc.in [new file with mode: 0644]
poppler-tools.manifest [new file with mode: 0644]
poppler-uninstalled.pc.in [new file with mode: 0644]
poppler.pc.cmake [new file with mode: 0644]
poppler.pc.in [new file with mode: 0644]
poppler/Annot.cc [new file with mode: 0644]
poppler/Annot.h [new file with mode: 0644]
poppler/Array.cc [new file with mode: 0644]
poppler/Array.h [new file with mode: 0644]
poppler/ArthurOutputDev.cc [new file with mode: 0644]
poppler/ArthurOutputDev.h [new file with mode: 0644]
poppler/BuiltinFont.cc [new file with mode: 0644]
poppler/BuiltinFont.h [new file with mode: 0644]
poppler/BuiltinFontTables.cc [new file with mode: 0644]
poppler/BuiltinFontTables.h [new file with mode: 0644]
poppler/CMap.cc [new file with mode: 0644]
poppler/CMap.h [new file with mode: 0644]
poppler/CachedFile.cc [new file with mode: 0644]
poppler/CachedFile.h [new file with mode: 0644]
poppler/CairoFontEngine.cc [new file with mode: 0644]
poppler/CairoFontEngine.h [new file with mode: 0644]
poppler/CairoOutputDev.cc [new file with mode: 0644]
poppler/CairoOutputDev.h [new file with mode: 0644]
poppler/CairoRescaleBox.cc [new file with mode: 0644]
poppler/CairoRescaleBox.h [new file with mode: 0644]
poppler/Catalog.cc [new file with mode: 0644]
poppler/Catalog.h [new file with mode: 0644]
poppler/CharCodeToUnicode.cc [new file with mode: 0644]
poppler/CharCodeToUnicode.h [new file with mode: 0644]
poppler/CharTypes.h [new file with mode: 0644]
poppler/CompactFontTables.h [new file with mode: 0644]
poppler/CurlCachedFile.cc [new file with mode: 0644]
poppler/CurlCachedFile.h [new file with mode: 0644]
poppler/CurlPDFDocBuilder.cc [new file with mode: 0644]
poppler/CurlPDFDocBuilder.h [new file with mode: 0644]
poppler/DCTStream.cc [new file with mode: 0644]
poppler/DCTStream.h [new file with mode: 0644]
poppler/DateInfo.cc [new file with mode: 0644]
poppler/DateInfo.h [new file with mode: 0644]
poppler/Decrypt.cc [new file with mode: 0644]
poppler/Decrypt.h [new file with mode: 0644]
poppler/Dict.cc [new file with mode: 0644]
poppler/Dict.h [new file with mode: 0644]
poppler/Error.cc [new file with mode: 0644]
poppler/Error.h [new file with mode: 0644]
poppler/ErrorCodes.h [new file with mode: 0644]
poppler/FileSpec.cc [new file with mode: 0644]
poppler/FileSpec.h [new file with mode: 0644]
poppler/FlateStream.cc [new file with mode: 0644]
poppler/FlateStream.h [new file with mode: 0644]
poppler/FontEncodingTables.cc [new file with mode: 0644]
poppler/FontEncodingTables.h [new file with mode: 0644]
poppler/FontInfo.cc [new file with mode: 0644]
poppler/FontInfo.h [new file with mode: 0644]
poppler/Form.cc [new file with mode: 0644]
poppler/Form.h [new file with mode: 0644]
poppler/Function.cc [new file with mode: 0644]
poppler/Function.h [new file with mode: 0644]
poppler/Gfx.cc [new file with mode: 0644]
poppler/Gfx.h [new file with mode: 0644]
poppler/GfxFont.cc [new file with mode: 0644]
poppler/GfxFont.h [new file with mode: 0644]
poppler/GfxState.cc [new file with mode: 0644]
poppler/GfxState.h [new file with mode: 0644]
poppler/GfxState_helpers.h [new file with mode: 0644]
poppler/GlobalParams.cc [new file with mode: 0644]
poppler/GlobalParams.h [new file with mode: 0644]
poppler/GlobalParamsWin.cc [new file with mode: 0644]
poppler/Hints.cc [new file with mode: 0644]
poppler/Hints.h [new file with mode: 0644]
poppler/JArithmeticDecoder.cc [new file with mode: 0644]
poppler/JArithmeticDecoder.h [new file with mode: 0644]
poppler/JBIG2Stream.cc [new file with mode: 0644]
poppler/JBIG2Stream.h [new file with mode: 0644]
poppler/JPEG2000Stream.cc [new file with mode: 0644]
poppler/JPEG2000Stream.h [new file with mode: 0644]
poppler/JPXStream.cc [new file with mode: 0644]
poppler/JPXStream.h [new file with mode: 0644]
poppler/Lexer.cc [new file with mode: 0644]
poppler/Lexer.h [new file with mode: 0644]
poppler/Linearization.cc [new file with mode: 0644]
poppler/Linearization.h [new file with mode: 0644]
poppler/Link.cc [new file with mode: 0644]
poppler/Link.h [new file with mode: 0644]
poppler/LocalPDFDocBuilder.cc [new file with mode: 0644]
poppler/LocalPDFDocBuilder.h [new file with mode: 0644]
poppler/Makefile.am [new file with mode: 0644]
poppler/Makefile.in [new file with mode: 0644]
poppler/Movie.cc [new file with mode: 0644]
poppler/Movie.h [new file with mode: 0644]
poppler/NameToCharCode.cc [new file with mode: 0644]
poppler/NameToCharCode.h [new file with mode: 0644]
poppler/NameToUnicodeTable.h [new file with mode: 0644]
poppler/Object.cc [new file with mode: 0644]
poppler/Object.h [new file with mode: 0644]
poppler/OptionalContent.cc [new file with mode: 0644]
poppler/OptionalContent.h [new file with mode: 0644]
poppler/Outline.cc [new file with mode: 0644]
poppler/Outline.h [new file with mode: 0644]
poppler/OutputDev.cc [new file with mode: 0644]
poppler/OutputDev.h [new file with mode: 0644]
poppler/PDFDoc.cc [new file with mode: 0644]
poppler/PDFDoc.h [new file with mode: 0644]
poppler/PDFDocBuilder.h [new file with mode: 0644]
poppler/PDFDocEncoding.cc [new file with mode: 0644]
poppler/PDFDocEncoding.h [new file with mode: 0644]
poppler/PDFDocFactory.cc [new file with mode: 0644]
poppler/PDFDocFactory.h [new file with mode: 0644]
poppler/PSOutputDev.cc [new file with mode: 0644]
poppler/PSOutputDev.h [new file with mode: 0644]
poppler/PSTokenizer.cc [new file with mode: 0644]
poppler/PSTokenizer.h [new file with mode: 0644]
poppler/Page.cc [new file with mode: 0644]
poppler/Page.h [new file with mode: 0644]
poppler/PageLabelInfo.cc [new file with mode: 0644]
poppler/PageLabelInfo.h [new file with mode: 0644]
poppler/PageTransition.cc [new file with mode: 0644]
poppler/PageTransition.h [new file with mode: 0644]
poppler/Parser.cc [new file with mode: 0644]
poppler/Parser.h [new file with mode: 0644]
poppler/PopplerCache.cc [new file with mode: 0644]
poppler/PopplerCache.h [new file with mode: 0644]
poppler/PreScanOutputDev.cc [new file with mode: 0644]
poppler/PreScanOutputDev.h [new file with mode: 0644]
poppler/ProfileData.cc [new file with mode: 0644]
poppler/ProfileData.h [new file with mode: 0644]
poppler/Rendition.cc [new file with mode: 0644]
poppler/Rendition.h [new file with mode: 0644]
poppler/SecurityHandler.cc [new file with mode: 0644]
poppler/SecurityHandler.h [new file with mode: 0644]
poppler/Sound.cc [new file with mode: 0644]
poppler/Sound.h [new file with mode: 0644]
poppler/SplashOutputDev.cc [new file with mode: 0644]
poppler/SplashOutputDev.h [new file with mode: 0644]
poppler/StdinCachedFile.cc [new file with mode: 0644]
poppler/StdinCachedFile.h [new file with mode: 0644]
poppler/StdinPDFDocBuilder.cc [new file with mode: 0644]
poppler/StdinPDFDocBuilder.h [new file with mode: 0644]
poppler/Stream-CCITT.h [new file with mode: 0644]
poppler/Stream.cc [new file with mode: 0644]
poppler/Stream.h [new file with mode: 0644]
poppler/TextOutputDev.cc [new file with mode: 0644]
poppler/TextOutputDev.h [new file with mode: 0644]
poppler/UTF8.h [new file with mode: 0644]
poppler/UnicodeCClassTables.h [new file with mode: 0644]
poppler/UnicodeCompTables.h [new file with mode: 0644]
poppler/UnicodeDecompTables.h [new file with mode: 0644]
poppler/UnicodeMap.cc [new file with mode: 0644]
poppler/UnicodeMap.h [new file with mode: 0644]
poppler/UnicodeMapTables.h [new file with mode: 0644]
poppler/UnicodeTypeTable.cc [new file with mode: 0644]
poppler/UnicodeTypeTable.h [new file with mode: 0644]
poppler/ViewerPreferences.cc [new file with mode: 0644]
poppler/ViewerPreferences.h [new file with mode: 0644]
poppler/XRef.cc [new file with mode: 0644]
poppler/XRef.h [new file with mode: 0644]
poppler/XpdfPluginAPI.cc [new file with mode: 0644]
poppler/XpdfPluginAPI.h [new file with mode: 0644]
poppler/gen-unicode-tables.py [new file with mode: 0644]
poppler/poppler-config.h.cmake [new file with mode: 0644]
poppler/poppler-config.h.in [new file with mode: 0644]
poppler/strtok_r.cpp [new file with mode: 0644]
qt4/CMakeLists.txt [new file with mode: 0644]
qt4/Makefile.am [new file with mode: 0644]
qt4/Makefile.in [new file with mode: 0644]
qt4/demos/CMakeLists.txt [new file with mode: 0644]
qt4/demos/Makefile.am [new file with mode: 0644]
qt4/demos/Makefile.in [new file with mode: 0644]
qt4/demos/abstractinfodock.cpp [new file with mode: 0644]
qt4/demos/abstractinfodock.h [new file with mode: 0644]
qt4/demos/documentobserver.cpp [new file with mode: 0644]
qt4/demos/documentobserver.h [new file with mode: 0644]
qt4/demos/embeddedfiles.cpp [new file with mode: 0644]
qt4/demos/embeddedfiles.h [new file with mode: 0644]
qt4/demos/fonts.cpp [new file with mode: 0644]
qt4/demos/fonts.h [new file with mode: 0644]
qt4/demos/info.cpp [new file with mode: 0644]
qt4/demos/info.h [new file with mode: 0644]
qt4/demos/main_viewer.cpp [new file with mode: 0644]
qt4/demos/metadata.cpp [new file with mode: 0644]
qt4/demos/metadata.h [new file with mode: 0644]
qt4/demos/navigationtoolbar.cpp [new file with mode: 0644]
qt4/demos/navigationtoolbar.h [new file with mode: 0644]
qt4/demos/optcontent.cpp [new file with mode: 0644]
qt4/demos/optcontent.h [new file with mode: 0644]
qt4/demos/pageview.cpp [new file with mode: 0644]
qt4/demos/pageview.h [new file with mode: 0644]
qt4/demos/permissions.cpp [new file with mode: 0644]
qt4/demos/permissions.h [new file with mode: 0644]
qt4/demos/thumbnails.cpp [new file with mode: 0644]
qt4/demos/thumbnails.h [new file with mode: 0644]
qt4/demos/toc.cpp [new file with mode: 0644]
qt4/demos/toc.h [new file with mode: 0644]
qt4/demos/viewer.cpp [new file with mode: 0644]
qt4/demos/viewer.h [new file with mode: 0644]
qt4/src/CMakeLists.txt [new file with mode: 0644]
qt4/src/Makefile.am [new file with mode: 0644]
qt4/src/Makefile.in [new file with mode: 0644]
qt4/src/poppler-annotation-helper.h [new file with mode: 0644]
qt4/src/poppler-annotation-private.h [new file with mode: 0644]
qt4/src/poppler-annotation.cc [new file with mode: 0644]
qt4/src/poppler-annotation.h [new file with mode: 0644]
qt4/src/poppler-base-converter.cc [new file with mode: 0644]
qt4/src/poppler-converter-private.h [new file with mode: 0644]
qt4/src/poppler-document.cc [new file with mode: 0644]
qt4/src/poppler-embeddedfile-private.h [new file with mode: 0644]
qt4/src/poppler-embeddedfile.cc [new file with mode: 0644]
qt4/src/poppler-export.h [new file with mode: 0644]
qt4/src/poppler-fontinfo.cc [new file with mode: 0644]
qt4/src/poppler-form.cc [new file with mode: 0644]
qt4/src/poppler-form.h [new file with mode: 0644]
qt4/src/poppler-link-extractor-private.h [new file with mode: 0644]
qt4/src/poppler-link-extractor.cc [new file with mode: 0644]
qt4/src/poppler-link.cc [new file with mode: 0644]
qt4/src/poppler-link.h [new file with mode: 0644]
qt4/src/poppler-media.cc [new file with mode: 0644]
qt4/src/poppler-media.h [new file with mode: 0644]
qt4/src/poppler-movie.cc [new file with mode: 0644]
qt4/src/poppler-optcontent-private.h [new file with mode: 0644]
qt4/src/poppler-optcontent.cc [new file with mode: 0644]
qt4/src/poppler-optcontent.h [new file with mode: 0644]
qt4/src/poppler-page-private.h [new file with mode: 0644]
qt4/src/poppler-page-transition-private.h [new file with mode: 0644]
qt4/src/poppler-page-transition.cc [new file with mode: 0644]
qt4/src/poppler-page-transition.h [new file with mode: 0644]
qt4/src/poppler-page.cc [new file with mode: 0644]
qt4/src/poppler-pdf-converter.cc [new file with mode: 0644]
qt4/src/poppler-private.cc [new file with mode: 0644]
qt4/src/poppler-private.h [new file with mode: 0644]
qt4/src/poppler-ps-converter.cc [new file with mode: 0644]
qt4/src/poppler-qiodeviceoutstream-private.h [new file with mode: 0644]
qt4/src/poppler-qiodeviceoutstream.cc [new file with mode: 0644]
qt4/src/poppler-qt4.h [new file with mode: 0644]
qt4/src/poppler-sound.cc [new file with mode: 0644]
qt4/src/poppler-textbox.cc [new file with mode: 0644]
qt4/tests/CMakeLists.txt [new file with mode: 0644]
qt4/tests/Makefile.am [new file with mode: 0644]
qt4/tests/Makefile.in [new file with mode: 0644]
qt4/tests/check_actualtext.cpp [new file with mode: 0644]
qt4/tests/check_attachments.cpp [new file with mode: 0644]
qt4/tests/check_dateConversion.cpp [new file with mode: 0644]
qt4/tests/check_fonts.cpp [new file with mode: 0644]
qt4/tests/check_links.cpp [new file with mode: 0644]
qt4/tests/check_metadata.cpp [new file with mode: 0644]
qt4/tests/check_optcontent.cpp [new file with mode: 0644]
qt4/tests/check_pagelayout.cpp [new file with mode: 0644]
qt4/tests/check_pagemode.cpp [new file with mode: 0644]
qt4/tests/check_password.cpp [new file with mode: 0644]
qt4/tests/check_permissions.cpp [new file with mode: 0644]
qt4/tests/check_search.cpp [new file with mode: 0644]
qt4/tests/check_strings.cpp [new file with mode: 0644]
qt4/tests/poppler-attachments.cpp [new file with mode: 0644]
qt4/tests/poppler-fonts.cpp [new file with mode: 0644]
qt4/tests/poppler-texts.cpp [new file with mode: 0644]
qt4/tests/stress-poppler-dir.cpp [new file with mode: 0644]
qt4/tests/stress-poppler-qt4.cpp [new file with mode: 0644]
qt4/tests/test-password-qt4.cpp [new file with mode: 0644]
qt4/tests/test-poppler-qt4.cpp [new file with mode: 0644]
splash/Makefile.am [new file with mode: 0644]
splash/Makefile.in [new file with mode: 0644]
splash/Splash.cc [new file with mode: 0644]
splash/Splash.h [new file with mode: 0644]
splash/SplashBitmap.cc [new file with mode: 0644]
splash/SplashBitmap.h [new file with mode: 0644]
splash/SplashClip.cc [new file with mode: 0644]
splash/SplashClip.h [new file with mode: 0644]
splash/SplashErrorCodes.h [new file with mode: 0644]
splash/SplashFTFont.cc [new file with mode: 0644]
splash/SplashFTFont.h [new file with mode: 0644]
splash/SplashFTFontEngine.cc [new file with mode: 0644]
splash/SplashFTFontEngine.h [new file with mode: 0644]
splash/SplashFTFontFile.cc [new file with mode: 0644]
splash/SplashFTFontFile.h [new file with mode: 0644]
splash/SplashFont.cc [new file with mode: 0644]
splash/SplashFont.h [new file with mode: 0644]
splash/SplashFontEngine.cc [new file with mode: 0644]
splash/SplashFontEngine.h [new file with mode: 0644]
splash/SplashFontFile.cc [new file with mode: 0644]
splash/SplashFontFile.h [new file with mode: 0644]
splash/SplashFontFileID.cc [new file with mode: 0644]
splash/SplashFontFileID.h [new file with mode: 0644]
splash/SplashGlyphBitmap.h [new file with mode: 0644]
splash/SplashMath.h [new file with mode: 0644]
splash/SplashPath.cc [new file with mode: 0644]
splash/SplashPath.h [new file with mode: 0644]
splash/SplashPattern.cc [new file with mode: 0644]
splash/SplashPattern.h [new file with mode: 0644]
splash/SplashScreen.cc [new file with mode: 0644]
splash/SplashScreen.h [new file with mode: 0644]
splash/SplashState.cc [new file with mode: 0644]
splash/SplashState.h [new file with mode: 0644]
splash/SplashT1Font.cc [new file with mode: 0644]
splash/SplashT1Font.h [new file with mode: 0644]
splash/SplashT1FontEngine.cc [new file with mode: 0644]
splash/SplashT1FontEngine.h [new file with mode: 0644]
splash/SplashT1FontFile.cc [new file with mode: 0644]
splash/SplashT1FontFile.h [new file with mode: 0644]
splash/SplashTypes.h [new file with mode: 0644]
splash/SplashXPath.cc [new file with mode: 0644]
splash/SplashXPath.h [new file with mode: 0644]
splash/SplashXPathScanner.cc [new file with mode: 0644]
splash/SplashXPathScanner.h [new file with mode: 0644]
test/CMakeLists.txt [new file with mode: 0644]
test/Makefile.am [new file with mode: 0644]
test/Makefile.in [new file with mode: 0644]
test/gtk-test.cc [new file with mode: 0644]
test/pdf-fullrewrite.cc [new file with mode: 0644]
test/pdf-inspector.cc [new file with mode: 0644]
test/pdf-inspector.ui [new file with mode: 0644]
test/pdf-operators.c [new file with mode: 0644]
test/perf-test-preview-dummy.cc [new file with mode: 0644]
test/perf-test.cc [new file with mode: 0644]
utils/CMakeLists.txt [new file with mode: 0644]
utils/HtmlFonts.cc [new file with mode: 0644]
utils/HtmlFonts.h [new file with mode: 0644]
utils/HtmlLinks.cc [new file with mode: 0644]
utils/HtmlLinks.h [new file with mode: 0644]
utils/HtmlOutputDev.cc [new file with mode: 0644]
utils/HtmlOutputDev.h [new file with mode: 0644]
utils/HtmlUtils.h [new file with mode: 0644]
utils/ImageOutputDev.cc [new file with mode: 0644]
utils/ImageOutputDev.h [new file with mode: 0644]
utils/Makefile.am [new file with mode: 0644]
utils/Makefile.in [new file with mode: 0644]
utils/parseargs.cc [new file with mode: 0644]
utils/parseargs.h [new file with mode: 0644]
utils/pdf2xml.dtd [new file with mode: 0644]
utils/pdfdetach.1 [new file with mode: 0644]
utils/pdfdetach.cc [new file with mode: 0644]
utils/pdffonts.1 [new file with mode: 0644]
utils/pdffonts.cc [new file with mode: 0644]
utils/pdfimages.1 [new file with mode: 0644]
utils/pdfimages.cc [new file with mode: 0644]
utils/pdfinfo.1 [new file with mode: 0644]
utils/pdfinfo.cc [new file with mode: 0644]
utils/pdfseparate.1 [new file with mode: 0644]
utils/pdfseparate.cc [new file with mode: 0644]
utils/pdftocairo.1 [new file with mode: 0644]
utils/pdftocairo.cc [new file with mode: 0644]
utils/pdftohtml.1 [new file with mode: 0644]
utils/pdftohtml.cc [new file with mode: 0644]
utils/pdftoppm.1 [new file with mode: 0644]
utils/pdftoppm.cc [new file with mode: 0644]
utils/pdftops.1 [new file with mode: 0644]
utils/pdftops.cc [new file with mode: 0644]
utils/pdftotext.1 [new file with mode: 0644]
utils/pdftotext.cc [new file with mode: 0644]
utils/pdfunite.1 [new file with mode: 0644]
utils/pdfunite.cc [new file with mode: 0644]
utils/printencodings.cc [new file with mode: 0644]
utils/printencodings.h [new file with mode: 0644]

diff --git a/AUTHORS b/AUTHORS
new file mode 100644 (file)
index 0000000..a785e40
--- /dev/null
+++ b/AUTHORS
@@ -0,0 +1,5 @@
+xpdf is written by Derek Noonburg <derekn@foolabs.com>
+
+libpoppler is a fork of xpdf-3.00
+
+Current Maintainer: Albert Astals Cid <aacid@kde.org>
diff --git a/CMakeLists.txt b/CMakeLists.txt
new file mode 100644 (file)
index 0000000..6b1782c
--- /dev/null
@@ -0,0 +1,623 @@
+project(poppler)
+
+cmake_minimum_required(VERSION 2.6.0 FATAL_ERROR)
+
+set(CMAKE_MODULE_PATH ${CMAKE_SOURCE_DIR}/cmake/modules)
+
+include(PopplerDefaults)
+include(PopplerMacros)
+include(MacroOptionalFindPackage)
+find_package(PkgConfig)
+include(MacroEnsureVersion)
+include(MacroBoolTo01)
+find_package(Threads)
+include(TestBigEndian)
+test_big_endian(WORDS_BIGENDIAN)
+
+set(POPPLER_MAJOR_VERSION "0")
+set(POPPLER_MINOR_VERSION "20")
+set(POPPLER_MICRO_VERSION "4")
+set(POPPLER_VERSION "${POPPLER_MAJOR_VERSION}.${POPPLER_MINOR_VERSION}.${POPPLER_MICRO_VERSION}")
+
+# command line switches
+option(ENABLE_XPDF_HEADERS "Install unsupported xpdf headers." OFF)
+option(BUILD_GTK_TESTS "Whether compile the GTK+ test programs." ON)
+option(BUILD_QT4_TESTS "Whether compile the Qt4 test programs." ON)
+option(BUILD_CPP_TESTS "Whether compile the CPP test programs." ON)
+option(ENABLE_SPLASH "Build the Splash graphics backend." ON)
+option(ENABLE_UTILS "Compile poppler command line utils." ON)
+option(ENABLE_CPP "Compile poppler cpp wrapper." ON)
+option(ENABLE_LIBOPENJPEG "Use libopenjpeg for JPX streams." ON)
+option(ENABLE_LCMS "Use liblcms for color management." ON)
+option(ENABLE_LIBCURL "Build libcurl based HTTP support." OFF)
+option(ENABLE_ZLIB "Build with zlib (not totally safe)." OFF)
+option(USE_FIXEDPOINT "Use fixed point arithmetic in the Splash backend" OFF)
+option(USE_FLOAT "Use single precision arithmetic in the Splash backend" OFF)
+if(WIN32)
+  option(ENABLE_RELOCATABLE "Do not hardcode the poppler library location (on Windows)." ON)
+else(WIN32)
+  set(ENABLE_RELOCATABLE OFF)
+endif(WIN32)
+
+set(LIB_SUFFIX "" CACHE STRING "Define suffix of directory name (32/64)")
+
+set(TESTDATADIR "${CMAKE_SOURCE_DIR}/../test" CACHE STRING "Specify test data dir.")
+if(NOT (EXISTS ${TESTDATADIR} AND EXISTS ${TESTDATADIR}/test-poppler.c))
+  message(WARNING "
+ No test data found in $testdatadir.
+ You will not be able to run 'make test' successfully.
+
+ The test data is not included in the source packages
+ and is also not part of the main git repository. Instead,
+ you can checkout the test data from its own git
+ repository with:
+
+   git clone git://git.freedesktop.org/git/poppler/test
+
+ You should checkout the test data as a sibling of your
+ poppler source folder or specify the location of your
+ checkout with -DTESTDATADIR=/path/to/checkoutdir/test.
+  ")
+endif()
+
+if(WIN32)
+  set(_default_fontconfiguration "win32")
+else(WIN32)
+  set(_default_fontconfiguration "fontconfig")
+endif(WIN32)
+set(FONT_CONFIGURATION "${_default_fontconfiguration}" CACHE STRING "The font configuration backend (win32|fontconfig).")
+string(TOLOWER "${FONT_CONFIGURATION}" font_configuration)
+set(WITH_FONTCONFIGURATION_WIN32 OFF)
+set(WITH_FONTCONFIGURATION_FONTCONFIG OFF)
+if(font_configuration STREQUAL "win32")
+  set(WITH_FONTCONFIGURATION_WIN32 ON)
+elseif(font_configuration STREQUAL "fontconfig")
+  set(WITH_FONTCONFIGURATION_FONTCONFIG ON)
+else(font_configuration STREQUAL "win32")
+  message(FATAL_ERROR "Invalid font configuration setting: ${FONT_CONFIGURATION}")
+endif(font_configuration STREQUAL "win32")
+
+# Enable these unconditionally.
+set(MULTITHREADED ON)
+set(OPI_SUPPORT ON)
+set(TEXTOUT_WORD_LIST ON)
+
+# setting the minimum required versions for some components
+set(QT4_MIN_VERSION "4.4.0")
+set(CAIRO_VERSION "1.10.0")
+set(GLIB_REQUIRED "2.18")
+
+macro_bool_to_01(ENABLE_SPLASH HAVE_SPLASH)
+find_package(Freetype REQUIRED)
+if(WITH_FONTCONFIGURATION_FONTCONFIG)
+  find_package(Fontconfig REQUIRED)
+endif(WITH_FONTCONFIGURATION_FONTCONFIG)
+macro_optional_find_package(JPEG)
+macro_optional_find_package(PNG)
+macro_optional_find_package(TIFF)
+if(JPEG_FOUND)
+  set(ENABLE_LIBJPEG ${JPEG_FOUND})
+endif(JPEG_FOUND)
+macro_optional_find_package(Qt4)
+macro_optional_find_package(Cairo ${CAIRO_VERSION})
+if(CAIRO_FOUND)
+  set(HAVE_CAIRO ${CAIRO_FOUND})
+  set(CAIRO_FEATURE "#define POPPLER_HAS_CAIRO 1")
+  set(CAIRO_REQ "cairo")
+  set(POPPLER_GLIB_DISABLE_DEPRECATED "")
+  set(POPPLER_GLIB_DISABLE_SINGLE_INCLUDES "")
+  macro_optional_find_package(GLIB)
+  if(GLIB_FOUND)
+    set(ENABLE_GLIB ON)
+    # Check for introspection
+    macro_optional_find_package(GObjectIntrospection 0.9.12)
+    set(HAVE_INTROSPECTION ${INTROSPECTION_FOUND})
+    set(POPPLER_GLIB_DISABLE_DEPRECATED "${POPPLER_GLIB_DISABLE_DEPRECATED} -DG_DISABLE_DEPRECATED")
+    set(POPPLER_GLIB_DISABLE_SINGLE_INCLUDES "${POPPLER_GLIB_DISABLE_SINGLE_INCLUDES} -DG_DISABLE_SINGLE_INCLUDES")
+    macro_optional_find_package(GTK)
+  endif(GLIB_FOUND)
+else(CAIRO_FOUND)
+  set(CAIRO_FEATURE "#undef POPPLER_HAS_CAIRO")
+endif(CAIRO_FOUND)
+if(ENABLE_CPP)
+  macro_optional_find_package(Iconv)
+  set(ENABLE_CPP ${ICONV_FOUND})
+  set(HAVE_ICONV ${ICONV_FOUND})
+endif(ENABLE_CPP)
+if(ENABLE_ZLIB)
+  find_package(ZLIB)
+  if(ZLIB_FOUND)
+    set(HAVE_LIBZ ${ZLIB_FOUND})
+  endif(ZLIB_FOUND)
+  set(ENABLE_ZLIB ${ZLIB_FOUND})
+endif(ENABLE_ZLIB)
+if(ENABLE_LIBOPENJPEG)
+  find_package(LIBOPENJPEG)
+  set(ENABLE_LIBOPENJPEG ${LIBOPENJPEG_FOUND})
+  set(HAVE_OPENJPEG_H ON)
+endif(ENABLE_LIBOPENJPEG)
+if(ENABLE_LCMS)
+  find_package(LCMS2)
+  if(LCMS2_FOUND)
+    set(USE_CMS ${LCMS2_FOUND})
+  else(LCMS2_FOUND)
+    find_package(LCMS)
+    set(USE_CMS ${LCMS_FOUND})
+    set(USE_LCMS1 ${LCMS_FOUND})
+  endif(LCMS2_FOUND)
+endif(ENABLE_LCMS)
+if(ENABLE_LIBCURL)
+  find_package(CURL)
+  include_directories(${CURL_INCLUDE_DIR})
+  set(POPPLER_HAS_CURL_SUPPORT ON)
+endif(ENABLE_LIBCURL)
+
+add_definitions(-DHAVE_CONFIG_H=1)
+if(FONTCONFIG_FOUND)
+  add_definitions(${FONTCONFIG_DEFINITIONS})
+  include_directories(${FONTCONFIG_INCLUDE_DIR})
+endif(FONTCONFIG_FOUND)
+if(WITH_FONTCONFIGURATION_WIN32)
+  if(MINGW)
+    # Set the minimum required Internet Explorer version to 5.0
+    add_definitions(-D_WIN32_IE=0x0500)
+  endif(MINGW)
+endif(WITH_FONTCONFIGURATION_WIN32)
+include_directories(
+  ${CMAKE_CURRENT_SOURCE_DIR}
+  ${CMAKE_CURRENT_SOURCE_DIR}/fofi
+  ${CMAKE_CURRENT_SOURCE_DIR}/goo
+  ${CMAKE_CURRENT_SOURCE_DIR}/poppler
+  ${CMAKE_CURRENT_BINARY_DIR}
+  ${CMAKE_CURRENT_BINARY_DIR}/poppler
+  ${FREETYPE_INCLUDE_DIRS}
+)
+set(HAVE_FREETYPE_H ON)
+if(CMAKE_USE_PTHREADS_INIT)
+  set(HAVE_PTHREAD ON)
+endif(CMAKE_USE_PTHREADS_INIT)
+
+if(ENABLE_ZLIB)
+  include_directories(${ZLIB_INCLUDE_DIR})
+endif(ENABLE_ZLIB)
+if(JPEG_FOUND)
+  include_directories(${JPEG_INCLUDE_DIR})
+  set(ENABLE_LIBJPEG ON)
+endif(JPEG_FOUND)
+if(PNG_FOUND)
+  include_directories(${PNG_INCLUDE_DIR})
+  set(ENABLE_LIBPNG ON)
+endif(PNG_FOUND)
+if(TIFF_FOUND)
+  include_directories(${TIFF_INCLUDE_DIR})
+  set(ENABLE_LIBTIFF ON)
+endif(TIFF_FOUND)
+if(LIBOPENJPEG_FOUND)
+  include_directories(${LIBOPENJPEG_INCLUDE_DIR})
+endif(LIBOPENJPEG_FOUND)
+if(LCMS_FOUND)
+  include_directories(${LCMS_INCLUDE_DIR})
+endif(LCMS_FOUND)
+if(LCMS2_FOUND)
+  include_directories(${LCMS2_INCLUDE_DIR})
+endif(LCMS2_FOUND)
+
+if(DEFINED COMPILE_WARNINGS)
+else(DEFINED COMPILE_WARNINGS)
+  set(COMPILE_WARNINGS "yes")
+endif(DEFINED COMPILE_WARNINGS)
+string(TOLOWER "${COMPILE_WARNINGS}" _comp_warnings)
+if(_comp_warnings STREQUAL "no")
+  set(CMAKE_CXX_FLAGS "${DEFAULT_COMPILE_WARNINGS_NO} ${CMAKE_CXX_FLAGS}")
+endif(_comp_warnings STREQUAL "no")
+if(_comp_warnings STREQUAL "yes")
+  set(CMAKE_CXX_FLAGS "${DEFAULT_COMPILE_WARNINGS_YES} ${CMAKE_CXX_FLAGS}")
+endif(_comp_warnings STREQUAL "yes")
+if(_comp_warnings STREQUAL "kde")
+  set(CMAKE_CXX_FLAGS "${DEFAULT_COMPILE_WARNINGS_KDE} ${CMAKE_CXX_FLAGS}")
+endif(_comp_warnings STREQUAL "kde")
+
+
+include(ConfigureChecks.cmake)
+configure_file(config.h.cmake ${CMAKE_CURRENT_BINARY_DIR}/config.h)
+configure_file(poppler/poppler-config.h.cmake ${CMAKE_CURRENT_BINARY_DIR}/poppler/poppler-config.h)
+
+
+set(poppler_SRCS
+  goo/gfile.cc
+  goo/gmempp.cc
+  goo/GooHash.cc
+  goo/GooList.cc
+  goo/GooTimer.cc
+  goo/GooString.cc
+  goo/gmem.cc
+  goo/FixedPoint.cc
+  goo/PNGWriter.cc
+  goo/TiffWriter.cc
+  goo/JpegWriter.cc
+  goo/ImgWriter.cc
+  goo/gstrtod.cc
+  fofi/FoFiBase.cc
+  fofi/FoFiEncodings.cc
+  fofi/FoFiTrueType.cc
+  fofi/FoFiType1.cc
+  fofi/FoFiType1C.cc
+  fofi/FoFiIdentifier.cc
+  poppler/Annot.cc
+  poppler/Array.cc
+  poppler/BuiltinFont.cc
+  poppler/BuiltinFontTables.cc
+  poppler/CachedFile.cc
+  poppler/Catalog.cc
+  poppler/CharCodeToUnicode.cc
+  poppler/CMap.cc
+  poppler/DateInfo.cc
+  poppler/Decrypt.cc
+  poppler/Dict.cc
+  poppler/Error.cc
+  poppler/FileSpec.cc
+  poppler/FontEncodingTables.cc
+  poppler/Form.cc
+  poppler/FontInfo.cc
+  poppler/Function.cc
+  poppler/Gfx.cc
+  poppler/GfxFont.cc
+  poppler/GfxState.cc
+  poppler/GlobalParams.cc
+  poppler/Hints.cc
+  poppler/JArithmeticDecoder.cc
+  poppler/JBIG2Stream.cc
+  poppler/Lexer.cc
+  poppler/Link.cc
+  poppler/Linearization.cc
+  poppler/LocalPDFDocBuilder.cc
+  poppler/NameToCharCode.cc
+  poppler/Object.cc
+  poppler/OptionalContent.cc
+  poppler/Outline.cc
+  poppler/OutputDev.cc
+  poppler/Page.cc
+  poppler/PageTransition.cc
+  poppler/Parser.cc
+  poppler/PDFDoc.cc
+  poppler/PDFDocEncoding.cc
+  poppler/PDFDocFactory.cc
+  poppler/PopplerCache.cc
+  poppler/ProfileData.cc
+  poppler/PreScanOutputDev.cc
+  poppler/PSTokenizer.cc
+  poppler/Stream.cc
+  poppler/strtok_r.cpp
+  poppler/UnicodeMap.cc
+  poppler/UnicodeTypeTable.cc
+  poppler/XRef.cc
+  poppler/PSOutputDev.cc
+  poppler/TextOutputDev.cc
+  poppler/PageLabelInfo.cc
+  poppler/SecurityHandler.cc
+  poppler/StdinCachedFile.cc
+  poppler/StdinPDFDocBuilder.cc
+  poppler/Sound.cc
+  poppler/ViewerPreferences.cc
+  poppler/XpdfPluginAPI.cc
+  poppler/Movie.cc
+  poppler/Rendition.cc
+)
+set(poppler_LIBS ${FREETYPE_LIBRARIES})
+if(ENABLE_SPLASH)
+  set(poppler_SRCS ${poppler_SRCS}
+    poppler/SplashOutputDev.cc
+    splash/Splash.cc
+    splash/SplashBitmap.cc
+    splash/SplashClip.cc
+    splash/SplashFTFont.cc
+    splash/SplashFTFontEngine.cc
+    splash/SplashFTFontFile.cc
+    splash/SplashFont.cc
+    splash/SplashFontEngine.cc
+    splash/SplashFontFile.cc
+    splash/SplashFontFileID.cc
+    splash/SplashPath.cc
+    splash/SplashPattern.cc
+    splash/SplashScreen.cc
+    splash/SplashState.cc
+    splash/SplashT1Font.cc
+    splash/SplashT1FontEngine.cc
+    splash/SplashT1FontFile.cc
+    splash/SplashXPath.cc
+    splash/SplashXPathScanner.cc
+  )
+endif(ENABLE_SPLASH)
+if(FONTCONFIG_FOUND)
+  set(poppler_LIBS ${poppler_LIBS} ${FONTCONFIG_LIBRARIES})
+endif(FONTCONFIG_FOUND)
+if(JPEG_FOUND)
+  set(poppler_SRCS ${poppler_SRCS}
+    poppler/DCTStream.cc
+  )
+  set(poppler_LIBS ${poppler_LIBS} ${JPEG_LIBRARIES})
+endif(JPEG_FOUND)
+if(ENABLE_ZLIB)
+  set(poppler_SRCS ${poppler_SRCS}
+    poppler/FlateStream.cc
+  )
+  set(poppler_LIBS ${poppler_LIBS} ${ZLIB_LIBRARIES})
+endif(ENABLE_ZLIB)
+if(ENABLE_LIBCURL)
+  set(poppler_SRCS ${poppler_SRCS}
+    poppler/CurlCachedFile.cc
+    poppler/CurlPDFDocBuilder.cc
+  )
+  set(poppler_LIBS ${poppler_LIBS} ${CURL_LIBRARIES})
+endif(ENABLE_LIBCURL)
+if(LIBOPENJPEG_FOUND)
+  set(poppler_SRCS ${poppler_SRCS}
+    poppler/JPEG2000Stream.cc
+  )
+  set(poppler_LIBS ${poppler_LIBS} ${LIBOPENJPEG_LIBRARIES})
+else (LIBOPENJPEG_FOUND)
+  set(poppler_SRCS ${poppler_SRCS}
+    poppler/JPXStream.cc
+  )
+endif(LIBOPENJPEG_FOUND)
+if(USE_CMS)
+  if(LCMS_FOUND)
+    set(poppler_LIBS ${poppler_LIBS} ${LCMS_LIBRARIES})
+  endif(LCMS_FOUND)
+  if(LCMS2_FOUND)
+    set(poppler_LIBS ${poppler_LIBS} ${LCMS2_LIBRARIES})
+  endif(LCMS2_FOUND)
+endif(USE_CMS)
+if(WIN32)
+  # gdi32 is needed under win32
+  set(poppler_LIBS ${poppler_LIBS} gdi32)
+endif(WIN32)
+if(PNG_FOUND)
+  set(poppler_LIBS ${poppler_LIBS} ${PNG_LIBRARIES})
+endif(PNG_FOUND)
+if(TIFF_FOUND)
+  set(poppler_LIBS ${poppler_LIBS} ${TIFF_LIBRARIES})
+endif(TIFF_FOUND)
+
+if(MSVC)
+add_definitions(-D_CRT_SECURE_NO_WARNINGS)
+set(CMAKE_CXX_FLAGS "/Zc:wchar_t- ${CMAKE_CXX_FLAGS}")
+add_library(poppler STATIC ${poppler_SRCS})
+else(MSVC)
+add_library(poppler SHARED ${poppler_SRCS})
+endif(MSVC)
+set_target_properties(poppler PROPERTIES VERSION 27.0.0 SOVERSION 27)
+target_link_libraries(poppler ${poppler_LIBS})
+target_link_libraries(poppler LINK_INTERFACE_LIBRARIES "")
+install(TARGETS poppler RUNTIME DESTINATION bin LIBRARY DESTINATION lib${LIB_SUFFIX} ARCHIVE DESTINATION lib${LIB_SUFFIX})
+
+if(ENABLE_XPDF_HEADERS)
+  install(FILES
+    poppler/Annot.h
+    poppler/Array.h
+    poppler/BuiltinFont.h
+    poppler/BuiltinFontTables.h
+    poppler/CachedFile.h
+    poppler/Catalog.h
+    poppler/CharCodeToUnicode.h
+    poppler/CMap.h
+    poppler/DateInfo.h
+    poppler/Decrypt.h
+    poppler/Dict.h
+    poppler/Error.h
+    poppler/FileSpec.h
+    poppler/FontEncodingTables.h
+    poppler/FontInfo.h
+    poppler/Form.h
+    poppler/Function.cc
+    poppler/Function.h
+    poppler/Gfx.h
+    poppler/GfxFont.h
+    poppler/GfxState.h
+    poppler/GfxState_helpers.h
+    poppler/GlobalParams.h
+    poppler/Hints.h
+    poppler/JArithmeticDecoder.h
+    poppler/JBIG2Stream.h
+    poppler/Lexer.h
+    poppler/Link.h
+    poppler/Linearization.h
+    poppler/LocalPDFDocBuilder.h
+    poppler/Movie.h
+    poppler/NameToCharCode.h
+    poppler/Object.h
+    poppler/OptionalContent.h
+    poppler/Outline.h
+    poppler/OutputDev.h
+    poppler/Page.h
+    poppler/PageTransition.h
+    poppler/Parser.h
+    poppler/PDFDoc.h
+    poppler/PDFDocBuilder.h
+    poppler/PDFDocEncoding.h
+    poppler/PDFDocFactory.h
+    poppler/PopplerCache.h
+    poppler/ProfileData.h
+    poppler/PreScanOutputDev.h
+    poppler/PSTokenizer.h
+    poppler/Rendition.h
+    poppler/Stream-CCITT.h
+    poppler/Stream.h
+    poppler/UnicodeMap.h
+    poppler/UnicodeMapTables.h
+    poppler/UnicodeTypeTable.h
+    poppler/UnicodeCClassTables.h
+    poppler/UnicodeCompTables.h
+    poppler/UnicodeDecompTables.h
+    poppler/ViewerPreferences.h
+    poppler/XRef.h
+    poppler/CharTypes.h
+    poppler/CompactFontTables.h
+    poppler/ErrorCodes.h
+    poppler/NameToUnicodeTable.h
+    poppler/PSOutputDev.h
+    poppler/TextOutputDev.h
+    poppler/SecurityHandler.h
+    poppler/StdinCachedFile.h
+    poppler/StdinPDFDocBuilder.h
+    poppler/UTF8.h
+    poppler/XpdfPluginAPI.h
+    poppler/Sound.h
+    ${CMAKE_CURRENT_BINARY_DIR}/poppler/poppler-config.h
+    DESTINATION include/poppler)
+  install(FILES
+    goo/GooHash.h
+    goo/GooList.h
+    goo/GooTimer.h
+    goo/GooMutex.h
+    goo/GooString.h
+    goo/gtypes.h
+    goo/gmem.h
+    goo/gfile.h
+    goo/FixedPoint.h
+    goo/ImgWriter.h
+    goo/GooLikely.h
+    goo/gstrtod.h
+    DESTINATION include/poppler/goo)
+  if(PNG_FOUND)
+    install(FILES
+      goo/PNGWriter.h
+      DESTINATION include/poppler/goo)
+  endif(PNG_FOUND)
+  if(TIFF_FOUND)
+    install(FILES
+      goo/TiffWriter.h
+      DESTINATION include/poppler/goo)
+  endif(TIFF_FOUND)
+  install(FILES
+    fofi/FoFiBase.h
+    fofi/FoFiEncodings.h
+    fofi/FoFiTrueType.h
+    fofi/FoFiType1.h
+    fofi/FoFiType1C.h
+    fofi/FoFiIdentifier.h
+    DESTINATION include/poppler/fofi)
+  if(ENABLE_LIBCURL)
+    install(FILES
+      poppler/CurlCachedFile.h
+      poppler/CurlPDFDocBuilder.h
+      DESTINATION include/poppler)
+  endif(ENABLE_LIBCURL)
+  if(LIBOPENJPEG_FOUND)
+    install(FILES
+      poppler/JPEG2000Stream.h
+      DESTINATION include/poppler)
+    install(FILES
+      goo/JpegWriter.h
+      DESTINATION include/poppler/goo)
+  else(LIBOPENJPEG_FOUND)
+    install(FILES
+      poppler/JPXStream.h
+      DESTINATION include/poppler)
+  endif(LIBOPENJPEG_FOUND)
+  if(ENABLE_SPLASH)
+    install(FILES
+      poppler/SplashOutputDev.h
+      DESTINATION include/poppler)
+    install(FILES
+      splash/Splash.h
+      splash/SplashBitmap.h
+      splash/SplashClip.h
+      splash/SplashErrorCodes.h
+      splash/SplashFTFont.h
+      splash/SplashFTFontEngine.h
+      splash/SplashFTFontFile.h
+      splash/SplashFont.h
+      splash/SplashFontEngine.h
+      splash/SplashFontFile.h
+      splash/SplashFontFileID.h
+      splash/SplashGlyphBitmap.h
+      splash/SplashMath.h
+      splash/SplashPath.h
+      splash/SplashPattern.h
+      splash/SplashScreen.h
+      splash/SplashState.h
+      splash/SplashT1Font.h
+      splash/SplashT1FontEngine.h
+      splash/SplashT1FontFile.h
+      splash/SplashTypes.h
+      splash/SplashXPath.h
+      splash/SplashXPathScanner.h
+      DESTINATION include/poppler/splash)
+  endif(ENABLE_SPLASH)
+endif(ENABLE_XPDF_HEADERS)
+
+
+if(ENABLE_UTILS)
+  add_subdirectory(utils)
+endif(ENABLE_UTILS)
+if(ENABLE_GLIB)
+  add_subdirectory(glib)
+endif(ENABLE_GLIB)
+add_subdirectory(test)
+if(QT4_FOUND)
+  add_subdirectory(qt4)
+endif(QT4_FOUND)
+if(ENABLE_CPP)
+  add_subdirectory(cpp)
+endif(ENABLE_CPP)
+
+set(PKG_CONFIG_VERSION_0_18 TRUE)
+if(PKG_CONFIG_EXECUTABLE)
+  exec_program(${PKG_CONFIG_EXECUTABLE} ARGS --version RETURN_VALUE _return_VALUE OUTPUT_VARIABLE _output_VAR)
+  macro_ensure_version("0.18" "${_output_VAR}" PKG_CONFIG_VERSION_0_18)
+endif(PKG_CONFIG_EXECUTABLE)
+if(PKG_CONFIG_VERSION_0_18)
+  set(PC_REQUIRES "")
+  set(PC_REQUIRES_PRIVATE "Requires.private: poppler = ${POPPLER_VERSION}")
+else(PKG_CONFIG_VERSION_0_18)
+  set(PC_REQUIRES "poppler = ${POPPLER_VERSION}")
+  set(PC_REQUIRES_PRIVATE "")
+endif(PKG_CONFIG_VERSION_0_18)
+
+poppler_create_install_pkgconfig(poppler.pc lib${LIB_SUFFIX}/pkgconfig)
+if(ENABLE_SPLASH)
+  poppler_create_install_pkgconfig(poppler-splash.pc lib${LIB_SUFFIX}/pkgconfig)
+endif(ENABLE_SPLASH)
+if(QT4_FOUND)
+  poppler_create_install_pkgconfig(poppler-qt4.pc lib${LIB_SUFFIX}/pkgconfig)
+endif(QT4_FOUND)
+if(ENABLE_GLIB)
+  poppler_create_install_pkgconfig(poppler-glib.pc lib${LIB_SUFFIX}/pkgconfig)
+endif(ENABLE_GLIB)
+if(CAIRO_FOUND)
+  poppler_create_install_pkgconfig(poppler-cairo.pc lib${LIB_SUFFIX}/pkgconfig)
+endif(CAIRO_FOUND)
+if(ENABLE_CPP)
+  poppler_create_install_pkgconfig(poppler-cpp.pc lib${LIB_SUFFIX}/pkgconfig)
+endif(ENABLE_CPP)
+
+
+message("Building Poppler with support for:")
+show_end_message("font configuration" ${font_configuration})
+show_end_message_yesno("splash output" ENABLE_SPLASH)
+show_end_message_yesno("cairo output" CAIRO_FOUND)
+show_end_message_yesno("qt4 wrapper" QT4_FOUND)
+show_end_message_yesno("glib wrapper" ENABLE_GLIB)
+show_end_message_yesno("  introspection" INTROSPECTION_FOUND)
+show_end_message_yesno("cpp wrapper" ENABLE_CPP)
+show_end_message("use gtk-doc" "not supported with this CMake build system")
+show_end_message_yesno("use libjpeg" ENABLE_LIBJPEG)
+show_end_message_yesno("use libpng" ENABLE_LIBPNG)
+show_end_message_yesno("use libtiff" ENABLE_LIBTIFF)
+show_end_message_yesno("use zlib" ENABLE_ZLIB)
+show_end_message_yesno("use curl" ENABLE_LIBCURL)
+show_end_message_yesno("use libopenjpeg" LIBOPENJPEG_FOUND)
+show_end_message_yesno("use cms" USE_CMS)
+if(LCMS_FOUND)
+  message("      with lcms1")
+endif(LCMS_FOUND)
+if(LCMS2_FOUND)
+  message("      with lcms2")
+endif(LCMS2_FOUND)
+show_end_message_yesno("command line utils" ENABLE_UTILS)
+show_end_message("test data dir" ${TESTDATADIR})
+
+if(USE_FIXEDPOINT AND USE_FLOAT)
+  message("Warning: Single precision and fixed point options should not be enabled at the same time")
+endif(USE_FIXEDPOINT AND USE_FLOAT)
diff --git a/COPYING b/COPYING
new file mode 100644 (file)
index 0000000..d511905
--- /dev/null
+++ b/COPYING
@@ -0,0 +1,339 @@
+                   GNU GENERAL PUBLIC LICENSE
+                      Version 2, June 1991
+
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.,
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+                           Preamble
+
+  The licenses for most software are designed to take away your
+freedom to share and change it.  By contrast, the GNU General Public
+License is intended to guarantee your freedom to share and change free
+software--to make sure the software is free for all its users.  This
+General Public License applies to most of the Free Software
+Foundation's software and to any other program whose authors commit to
+using it.  (Some other Free Software Foundation software is covered by
+the GNU Lesser General Public License instead.)  You can apply it to
+your programs, too.
+
+  When we speak of free software, we are referring to freedom, not
+price.  Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+this service if you wish), that you receive source code or can get it
+if you want it, that you can change the software or use pieces of it
+in new free programs; and that you know you can do these things.
+
+  To protect your rights, we need to make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if you
+distribute copies of the software, or if you modify it.
+
+  For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must give the recipients all the rights that
+you have.  You must make sure that they, too, receive or can get the
+source code.  And you must show them these terms so they know their
+rights.
+
+  We protect your rights with two steps: (1) copyright the software, and
+(2) offer you this license which gives you legal permission to copy,
+distribute and/or modify the software.
+
+  Also, for each author's protection and ours, we want to make certain
+that everyone understands that there is no warranty for this free
+software.  If the software is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original, so
+that any problems introduced by others will not reflect on the original
+authors' reputations.
+
+  Finally, any free program is threatened constantly by software
+patents.  We wish to avoid the danger that redistributors of a free
+program will individually obtain patent licenses, in effect making the
+program proprietary.  To prevent this, we have made it clear that any
+patent must be licensed for everyone's free use or not licensed at all.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.
+
+                   GNU GENERAL PUBLIC LICENSE
+   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+  0. This License applies to any program or other work which contains
+a notice placed by the copyright holder saying it may be distributed
+under the terms of this General Public License.  The "Program", below,
+refers to any such program or work, and a "work based on the Program"
+means either the Program or any derivative work under copyright law:
+that is to say, a work containing the Program or a portion of it,
+either verbatim or with modifications and/or translated into another
+language.  (Hereinafter, translation is included without limitation in
+the term "modification".)  Each licensee is addressed as "you".
+
+Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope.  The act of
+running the Program is not restricted, and the output from the Program
+is covered only if its contents constitute a work based on the
+Program (independent of having been made by running the Program).
+Whether that is true depends on what the Program does.
+
+  1. You may copy and distribute verbatim copies of the Program's
+source code as you receive it, in any medium, provided that you
+conspicuously and appropriately publish on each copy an appropriate
+copyright notice and disclaimer of warranty; keep intact all the
+notices that refer to this License and to the absence of any warranty;
+and give any other recipients of the Program a copy of this License
+along with the Program.
+
+You may charge a fee for the physical act of transferring a copy, and
+you may at your option offer warranty protection in exchange for a fee.
+
+  2. You may modify your copy or copies of the Program or any portion
+of it, thus forming a work based on the Program, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+    a) You must cause the modified files to carry prominent notices
+    stating that you changed the files and the date of any change.
+
+    b) You must cause any work that you distribute or publish, that in
+    whole or in part contains or is derived from the Program or any
+    part thereof, to be licensed as a whole at no charge to all third
+    parties under the terms of this License.
+
+    c) If the modified program normally reads commands interactively
+    when run, you must cause it, when started running for such
+    interactive use in the most ordinary way, to print or display an
+    announcement including an appropriate copyright notice and a
+    notice that there is no warranty (or else, saying that you provide
+    a warranty) and that users may redistribute the program under
+    these conditions, and telling the user how to view a copy of this
+    License.  (Exception: if the Program itself is interactive but
+    does not normally print such an announcement, your work based on
+    the Program is not required to print an announcement.)
+
+These requirements apply to the modified work as a whole.  If
+identifiable sections of that work are not derived from the Program,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works.  But when you
+distribute the same sections as part of a whole which is a work based
+on the Program, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Program.
+
+In addition, mere aggregation of another work not based on the Program
+with the Program (or with a work based on the Program) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+  3. You may copy and distribute the Program (or a work based on it,
+under Section 2) in object code or executable form under the terms of
+Sections 1 and 2 above provided that you also do one of the following:
+
+    a) Accompany it with the complete corresponding machine-readable
+    source code, which must be distributed under the terms of Sections
+    1 and 2 above on a medium customarily used for software interchange; or,
+
+    b) Accompany it with a written offer, valid for at least three
+    years, to give any third party, for a charge no more than your
+    cost of physically performing source distribution, a complete
+    machine-readable copy of the corresponding source code, to be
+    distributed under the terms of Sections 1 and 2 above on a medium
+    customarily used for software interchange; or,
+
+    c) Accompany it with the information you received as to the offer
+    to distribute corresponding source code.  (This alternative is
+    allowed only for noncommercial distribution and only if you
+    received the program in object code or executable form with such
+    an offer, in accord with Subsection b above.)
+
+The source code for a work means the preferred form of the work for
+making modifications to it.  For an executable work, complete source
+code means all the source code for all modules it contains, plus any
+associated interface definition files, plus the scripts used to
+control compilation and installation of the executable.  However, as a
+special exception, the source code distributed need not include
+anything that is normally distributed (in either source or binary
+form) with the major components (compiler, kernel, and so on) of the
+operating system on which the executable runs, unless that component
+itself accompanies the executable.
+
+If distribution of executable or object code is made by offering
+access to copy from a designated place, then offering equivalent
+access to copy the source code from the same place counts as
+distribution of the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+  4. You may not copy, modify, sublicense, or distribute the Program
+except as expressly provided under this License.  Any attempt
+otherwise to copy, modify, sublicense or distribute the Program is
+void, and will automatically terminate your rights under this License.
+However, parties who have received copies, or rights, from you under
+this License will not have their licenses terminated so long as such
+parties remain in full compliance.
+
+  5. You are not required to accept this License, since you have not
+signed it.  However, nothing else grants you permission to modify or
+distribute the Program or its derivative works.  These actions are
+prohibited by law if you do not accept this License.  Therefore, by
+modifying or distributing the Program (or any work based on the
+Program), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Program or works based on it.
+
+  6. Each time you redistribute the Program (or any work based on the
+Program), the recipient automatically receives a license from the
+original licensor to copy, distribute or modify the Program subject to
+these terms and conditions.  You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties to
+this License.
+
+  7. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License.  If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Program at all.  For example, if a patent
+license would not permit royalty-free redistribution of the Program by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Program.
+
+If any portion of this section is held invalid or unenforceable under
+any particular circumstance, the balance of the section is intended to
+apply and the section as a whole is intended to apply in other
+circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system, which is
+implemented by public license practices.  Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+  8. If the distribution and/or use of the Program is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Program under this License
+may add an explicit geographical distribution limitation excluding
+those countries, so that distribution is permitted only in or among
+countries not thus excluded.  In such case, this License incorporates
+the limitation as if written in the body of this License.
+
+  9. The Free Software Foundation may publish revised and/or new versions
+of the General Public License from time to time.  Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+Each version is given a distinguishing version number.  If the Program
+specifies a version number of this License which applies to it and "any
+later version", you have the option of following the terms and conditions
+either of that version or of any later version published by the Free
+Software Foundation.  If the Program does not specify a version number of
+this License, you may choose any version ever published by the Free Software
+Foundation.
+
+  10. If you wish to incorporate parts of the Program into other free
+programs whose distribution conditions are different, write to the author
+to ask for permission.  For software which is copyrighted by the Free
+Software Foundation, write to the Free Software Foundation; we sometimes
+make exceptions for this.  Our decision will be guided by the two goals
+of preserving the free status of all derivatives of our free software and
+of promoting the sharing and reuse of software generally.
+
+                           NO WARRANTY
+
+  11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
+FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW.  EXCEPT WHEN
+OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
+PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
+OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.  THE ENTIRE RISK AS
+TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU.  SHOULD THE
+PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
+REPAIR OR CORRECTION.
+
+  12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
+REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
+INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
+OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
+TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
+YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
+PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGES.
+
+                    END OF TERMS AND CONDITIONS
+
+           How to Apply These Terms to Your New Programs
+
+  If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+  To do so, attach the following notices to the program.  It is safest
+to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+    <one line to give the program's name and a brief idea of what it does.>
+    Copyright (C) <year>  <name of author>
+
+    This program is free software; you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation; either version 2 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License along
+    with this program; if not, write to the Free Software Foundation, Inc.,
+    51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+
+Also add information on how to contact you by electronic and paper mail.
+
+If the program is interactive, make it output a short notice like this
+when it starts in an interactive mode:
+
+    Gnomovision version 69, Copyright (C) year name of author
+    Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+    This is free software, and you are welcome to redistribute it
+    under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License.  Of course, the commands you use may
+be called something other than `show w' and `show c'; they could even be
+mouse-clicks or menu items--whatever suits your program.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the program, if
+necessary.  Here is a sample; alter the names:
+
+  Yoyodyne, Inc., hereby disclaims all copyright interest in the program
+  `Gnomovision' (which makes passes at compilers) written by James Hacker.
+
+  <signature of Ty Coon>, 1 April 1989
+  Ty Coon, President of Vice
+
+This General Public License does not permit incorporating your program into
+proprietary programs.  If your program is a subroutine library, you may
+consider it more useful to permit linking proprietary applications with the
+library.  If this is what you want to do, use the GNU Lesser General
+Public License instead of this License.
diff --git a/ChangeLog b/ChangeLog
new file mode 100644 (file)
index 0000000..f7cdff1
--- /dev/null
+++ b/ChangeLog
@@ -0,0 +1,44241 @@
+commit 5fd691dc58aac817bca81c87c4820afcf53989d1
+Author: Albert Astals Cid <aacid@kde.org>
+Date:   Mon Sep 10 19:29:01 2012 +0200
+
+    0.20.40.20.40.20.40.20.4
+
+ CMakeLists.txt      |    4 ++--
+ NEWS                |   13 +++++++++++++
+ configure.ac        |    2 +-
+ cpp/Doxyfile        |    2 +-
+ poppler/Makefile.am |    2 +-
+ qt4/src/Doxyfile    |    2 +-
+ 6 files changed, 19 insertions(+), 6 deletions(-)
+
+commit b3e86dbdba82956f125e37f69176072e2d0127f2
+Author: Thomas Freitag <Thomas.Freitag@kabelmail.de>
+Date:   Sun Sep 9 23:35:45 2012 +0200
+
+    Try to find another rootNum if actual rootNum doesn't point to a dict
+
+    Bug #14303
+
+ poppler/XRef.cc |   14 ++++++++++++--
+ poppler/XRef.h  |    4 ++--
+ 2 files changed, 14 insertions(+), 4 deletions(-)
+
+commit 558a7d9b046bbbe185dea263b48a3cb2664378fc
+Author: Thomas Freitag <Thomas.Freitag@alfa.de>
+Date:   Sun Sep 9 23:25:47 2012 +0200
+
+    Fix invalid memory access in solves 1066.pdf.asan.38.75
+
+ splash/SplashClip.cc         |   23 +++++++++++++++++++++++
+ splash/SplashXPathScanner.cc |    3 +++
+ 2 files changed, 26 insertions(+)
+
+commit d0df8e54512f584ca2b3edbae1c19e167948e5c3
+Author: Thomas Freitag <Thomas.Freitag@alfa.de>
+Date:   Sun Sep 9 23:21:38 2012 +0200
+
+    Fix invalid memory access in 1106.pdf.asan.30.120.patch
+
+ poppler/Function.cc |    5 +++++
+ 1 file changed, 5 insertions(+)
+
+commit 86b89864396a1dcf027e5793e6ac75411977bcf9
+Author: Thomas Freitag <Thomas.Freitag@kabelmail.de>
+Date:   Sun Sep 9 23:08:49 2012 +0200
+
+    Fix crash in 1255.pdf.SIGSEGV.56f.285
+
+ poppler/XRef.cc |    6 ++++++
+ 1 file changed, 6 insertions(+)
+
+commit 96931732f343d2bbda9af9488b485da031866c3b
+Author: Thomas Freitag <Thomas.Freitag@alfa.de>
+Date:   Sun Sep 9 22:47:57 2012 +0200
+
+    Fix invalid memory access in 61.pdf.asan.13.95
+
+ fofi/FoFiType1C.cc |   25 +++++++++++++++++--------
+ fofi/FoFiType1C.h  |    2 ++
+ 2 files changed, 19 insertions(+), 8 deletions(-)
+
+commit 26917d69c4da6a110db02b120133c36579fbb17c
+Author: Albert Astals Cid <aacid@kde.org>
+Date:   Sun Sep 9 22:23:36 2012 +0200
+
+    Add unlikely
+
+ poppler/Gfx.cc |    2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit e6a3c797c01aa343f640f2e6f45de5bf379aa8ad
+Author: Thomas Freitag <Thomas.Freitag@alfa.de>
+Date:   Sun Sep 9 22:22:59 2012 +0200
+
+    Fix wrong memory access in 68.pdf.asan.7.1030
+
+ poppler/Gfx.cc |    4 ++++
+ 1 file changed, 4 insertions(+)
+
+commit 48fe18cf277cd2a4e665c74b3a594482f762f4b6
+Author: Albert Astals Cid <aacid@kde.org>
+Date:   Sun Sep 9 22:09:44 2012 +0200
+
+    Fix memory leak
+
+ poppler/Gfx.cc |    1 +
+ 1 file changed, 1 insertion(+)
+
+commit b87aafc0cdb36c3555053f2684c45f1a9d7b2f94
+Author: Albert Astals Cid <aacid@kde.org>
+Date:   Sun Sep 9 21:42:48 2012 +0200
+
+    Add unlikelys to the ifs
+
+ poppler/DCTStream.cc   |    4 ++--
+ poppler/JBIG2Stream.cc |    2 +-
+ 2 files changed, 3 insertions(+), 3 deletions(-)
+
+commit a019eef2f8ca53addd7ccab7f9c47657f4e52286
+Author: Thomas Freitag <Thomas.Freitag@alfa.de>
+Date:   Sun Sep 9 21:41:09 2012 +0200
+
+    Fix crash in 1162.pdf.SIGSEGV.28e.182
+
+ poppler/DCTStream.cc |    4 ++++
+ 1 file changed, 4 insertions(+)
+
+commit ad7c6ac88f2315c9ce003308d1b4988592d4434b
+Author: William Bader <williambader@hotmail.com>
+Date:   Sun Sep 9 21:31:58 2012 +0200
+
+    Fix crash in 1028.pdf.SIGSEGV.ae6.33
+
+ poppler/JBIG2Stream.cc |    8 ++++++++
+ 1 file changed, 8 insertions(+)
+
+commit b861af714daee4125e54b250dddf82106f5a8ce8
+Author: Albert Astals Cid <aacid@kde.org>
+Date:   Sun Sep 9 21:15:06 2012 +0200
+
+    Fix memory leak
+
+ poppler/Form.cc |    2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit a4f59113574a8d7460c6ce5000cb09d20fe52b74
+Author: Albert Astals Cid <aacid@kde.org>
+Date:   Sun Sep 9 12:49:43 2012 +0200
+
+    Fix memory leak
+
+ poppler/Annot.cc |    3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+commit 28240046f8fe37ca96f9a80cb1ea3a59af9c66f3
+Author: Thomas Freitag <Thomas.Freitag@alfa.de>
+Date:   Sun Sep 9 12:48:26 2012 +0200
+
+    Fix crash in 589.pdf.SIGSEGV.8b1.929
+
+ poppler/Annot.cc |    8 ++++++++
+ 1 file changed, 8 insertions(+)
+
+commit ccd3db5a7723ddb692f6dc85ed9d0f5e3dde189f
+Author: Albert Astals Cid <aacid@kde.org>
+Date:   Sat Sep 8 18:10:14 2012 +0200
+
+    Only complain when the malloc really failed
+
+ poppler/JBIG2Stream.cc |    2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 6356c0bbae47db291a3585d31c7727bc3f8d97a4
+Author: Albert Astals Cid <aacid@kde.org>
+Date:   Thu Aug 30 00:57:51 2012 +0200
+
+    qt4: unbreak spacing
+
+ qt4/src/poppler-embeddedfile.cc |    6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
+
+commit 46948868dee6d4e68b658c68d7df482590e34da3
+Author: Albert Astals Cid <aacid@kde.org>
+Date:   Thu Aug 30 00:43:45 2012 +0200
+
+    Accept FileSpec as Dict too and not only as Ref
+
+    File to try in KDE bug #306008
+
+ poppler/Catalog.cc |    4 +++-
+ 1 file changed, 3 insertions(+), 1 deletion(-)
+
+commit debc8fb497bc22c0f9f34d785852981a87475c30
+Author: Albert Astals Cid <aacid@kde.org>
+Date:   Thu Aug 30 00:35:40 2012 +0200
+
+    Take into account the embFile returned by the core may be NULL
+
+ qt4/src/poppler-embeddedfile-private.h |    4 +++-
+ qt4/src/poppler-embeddedfile.cc        |   19 ++++++++++++-------
+ 2 files changed, 15 insertions(+), 8 deletions(-)
+
+commit 3ca67a59fc15782abb1e479eb2b8916de5b1b6ed
+Author: Albert Astals Cid <aacid@kde.org>
+Date:   Thu Aug 30 00:34:06 2012 +0200
+
+    Return NULL EmbFile if the FileSpec is not ok
+
+    Otherwise we might end up asserting
+
+ poppler/FileSpec.cc |    4 ++++
+ 1 file changed, 4 insertions(+)
+
+commit 686ec0cc92e25f74eaa9e09a328724cbdf939bca
+Author: Albert Astals Cid <aacid@kde.org>
+Date:   Wed Aug 15 20:02:05 2012 +0200
+
+    Remove declared but not implemented function
+
+ poppler/XRef.h |    1 -
+ 1 file changed, 1 deletion(-)
+
+commit e83568065f77ba722b147b3b10faed1ff66f22dc
+Author: Pino Toscano <pino@kde.org>
+Date:   Sat Aug 11 01:38:08 2012 +0200
+
+    remove extra execution permissions
+
+    (cherry picked from commit 9a5a19ee2f9cd536c3527b30c0256ca9dce3638c)
+
+ 0 files changed
+
+commit 1b2903c104012fdd3c982d57898910945dff9a15
+Author: Albert Astals Cid <aacid@kde.org>
+Date:   Sat Aug 11 00:05:10 2012 +0200
+
+    0.20.3
+
+ CMakeLists.txt      |    4 ++--
+ NEWS                |   16 ++++++++++++++++
+ configure.ac        |    2 +-
+ cpp/Doxyfile        |    2 +-
+ poppler/Makefile.am |    2 +-
+ qt4/src/Doxyfile    |    2 +-
+ 6 files changed, 22 insertions(+), 6 deletions(-)
+
+commit 40e7b744d32152ab4c6201b8bda7fb7caf6bfd4e
+Author: Albert Astals Cid <aacid@kde.org>
+Date:   Sun Aug 5 15:07:16 2012 +0200
+
+    If NULL, NULL fails as password try EMPTY, EMPTY before failing
+
+    Reviewed by Jose Aliste
+    Bug #3498
+
+ poppler/SecurityHandler.cc |    7 ++++++-
+ 1 file changed, 6 insertions(+), 1 deletion(-)
+
+commit 3ca2bc0d3abdf92741b7921ea402c9de09e531f6
+Author: Markus Trippelsdorf <markus@trippelsdorf.de>
+Date:   Fri Aug 3 00:48:12 2012 +0200
+
+    Fix segfault when scaleImage returns NULL
+
+    Bug 52488
+
+ splash/Splash.cc |    7 +++++++
+ 1 file changed, 7 insertions(+)
+
+commit 768cf5877f48f8cee80fe96e2ee52f42f230dfdf
+Author: Thomas Freitag <Thomas.Freitag@alfa.de>
+Date:   Thu Aug 2 00:22:19 2012 +0200
+
+    PSOutputDev: Fix Bitmaps in level2sep or level3sep
+
+    Bug #52384
+
+ poppler/PSOutputDev.cc |    4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 315447843a368556a8536bc30e579c9bf338682e
+Author: Thomas Freitag <Thomas.Freitag@alfa.de>
+Date:   Wed Aug 1 22:56:49 2012 +0200
+
+    Splash: Blend mode enhancements for CMYK
+
+ poppler/SplashOutputDev.cc |   76
+ +++++++++++++++++++++++++++++++-------------
+ splash/Splash.cc           |   22 -------------
+ 2 files changed, 54 insertions(+), 44 deletions(-)
+
+commit c0c88b3707fc7337e814ae4252d80002641a19ee
+Author: Albert Astals Cid <aacid@kde.org>
+Date:   Tue Jul 31 23:32:19 2012 +0200
+
+    Replace c++ style includes with c style ones
+
+    Fixes build in Solaris 10
+    Bug #52426
+
+ goo/gstrtod.cc |   10 +++++-----
+ 1 file changed, 5 insertions(+), 5 deletions(-)
+
+commit dcbc923bd3592a81876f84005fbaddcea18641cc
+Author: Thomas Freitag <Thomas.Freitag@alfa.de>
+Date:   Sun Jul 22 18:40:46 2012 +0200
+
+    Make sure xScale and yScale are always initialized
+
+    Bug #52215
+
+ poppler/PSOutputDev.cc |    5 +----
+ 1 file changed, 1 insertion(+), 4 deletions(-)
+
+commit ef7c2418e12d3e6a79f1d89a0051b005fadbc344
+Author: Thomas Freitag <Thomas.Freitag@alfa.de>
+Date:   Sat Jul 21 00:01:49 2012 +0200
+
+    Fix conversion to ps when having multiple strips
+
+    Bug 51982
+
+ poppler/PSOutputDev.cc |    4 +++-
+ 1 file changed, 3 insertions(+), 1 deletion(-)
+
+commit 349b21acc249c130fb053bc4a0c75019f75bd35b
+Author: Torsten Kasch <tk@CeBiTec.Uni-Bielefeld.DE>
+Date:   Thu Jul 19 00:18:14 2012 +0200
+
+    Unify poppler-config.h includes in core "installed" headers
+
+    Bug 52193
+
+ goo/FixedPoint.h      |    2 +-
+ goo/GooTimer.h        |    2 +-
+ goo/JpegWriter.h      |    2 +-
+ goo/PNGWriter.h       |    2 +-
+ goo/TiffWriter.h      |    2 +-
+ goo/gfile.h           |    2 +-
+ goo/gmem.h            |    2 +-
+ splash/SplashFTFont.h |    2 +-
+ splash/SplashMath.h   |    2 +-
+ 9 files changed, 9 insertions(+), 9 deletions(-)
+
+commit 15c6ae699f083ea6c9716c1098ae9833a56eeb3e
+Author: Torsten Kasch <tk@CeBiTec.Uni-Bielefeld.DE>
+Date:   Thu Jul 19 00:06:45 2012 +0200
+
+    autoconf: Do not assume the shell is bash compatible
+
+    Bug 52197
+
+ configure.ac |    2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit f5311da76ec7cd7c1e6cdfc4e18df6dd56e8398b
+Author: Albert Astals Cid <aacid@kde.org>
+Date:   Thu Jul 19 00:01:49 2012 +0200
+
+    pdfseparate: Return 0 on success
+
+ utils/pdfseparate.cc |    6 +++++-
+ 1 file changed, 5 insertions(+), 1 deletion(-)
+
+commit 51f22ca0badfc41c19cba66cabd63184244f81c7
+Author: Thomas Freitag <Thomas.Freitag@alfa.de>
+Date:   Mon Jul 16 23:32:23 2012 +0200
+
+    PSOutputDev: Fix DeviceN images with alternate Lab colorspace in
+    level 3 PostScript
+
+    Bug #51822
+
+ poppler/PSOutputDev.cc |   54
+ +++++++++++++++++++++++++++++++++++++++++-------
+ poppler/PSOutputDev.h  |    2 +-
+ 2 files changed, 48 insertions(+), 8 deletions(-)
+
+commit 950d5f3dec4bff5d3c523d55689d7b70215dc110
+Author: Thomas Freitag <Thomas.Freitag@alfa.de>
+Date:   Fri Jul 13 00:56:48 2012 +0200
+
+    Fix Splash::arbitraryTransformImage causes bogus memory allocation
+    size
+
+    Bug #49523
+
+ poppler/SplashOutputDev.cc |    2 +-
+ splash/Splash.cc           |   79
+ +++++++++++++++++++++++++-------------------
+ splash/Splash.h            |    4 +--
+ 3 files changed, 48 insertions(+), 37 deletions(-)
+
+commit e09be3bc6ba1290fd31bde0c3d19c4ffcbadbf00
+Author: Albert Astals Cid <aacid@kde.org>
+Date:   Tue Jul 10 23:06:53 2012 +0200
+
+    0.20.2
+
+ CMakeLists.txt   |    2 +-
+ NEWS             |   11 +++++++++++
+ configure.ac     |    2 +-
+ cpp/Doxyfile     |    2 +-
+ qt4/src/Doxyfile |    2 +-
+ 5 files changed, 15 insertions(+), 4 deletions(-)
+
+commit e15fe0e1e6accf779caeb1179a8d62161c0aa650
+Author: Thomas Freitag <Thomas.Freitag@alfa.de>
+Date:   Thu Jul 5 17:44:02 2012 +0200
+
+    Fix handling of DeviceN images in level 3 PostScript
+
+    bug #51548
+
+ poppler/PSOutputDev.cc |   14 --------------
+ 1 file changed, 14 deletions(-)
+
+commit 02c4e6bf4cc0f5535946fe31815081a40b1de986
+Author: Albert Astals Cid <aacid@kde.org>
+Date:   Fri Jun 29 01:56:55 2012 +0200
+
+    PSOutputDev: Correct %%DocumentCustomColors
+
+    Bug 51479
+
+ poppler/PSOutputDev.cc |   20 ++++++++++++++++++++
+ 1 file changed, 20 insertions(+)
+
+commit f7990386d268a444c297958e9c50ed27a0825a00
+Author: Albert Astals Cid <aacid@kde.org>
+Date:   Thu Jun 28 00:18:07 2012 +0200
+
+    Add some security checks to JPXStream decoding
+
+    Fixes crash in broken/fuzzed pdf sent by Mateusz "j00ru" Jurczyk
+    and Gynvael Coldwind
+
+ poppler/JPXStream.cc |   14 ++++++++++++--
+ 1 file changed, 12 insertions(+), 2 deletions(-)
+
+commit c5c6eed1623506e1206e89cee0b7c887d815ba62
+Author: Albert Astals Cid <aacid@kde.org>
+Date:   Sun Jun 24 23:43:03 2012 +0200
+
+    Change SplashBitmap gmallocn to gmallocn_checkoverflow
+
+    Fixes abort in KDE bug #302372
+
+ splash/Splash.cc       |   37 +++++++++++++++++++++++--------------
+ splash/SplashBitmap.cc |   18 +++++++++++-------
+ 2 files changed, 34 insertions(+), 21 deletions(-)
+
+commit c87738ee234aafc6eda5a263ad789205037020e1
+Author: Thomas Freitag <Thomas.Freitag@alfa.de>
+Date:   Sun Jun 24 20:20:38 2012 +0200
+
+    copy resources content defined in the pages dict
+
+    Fixes bug #51369
+
+ poppler/PDFDoc.cc |   16 ++++++++++++++--
+ 1 file changed, 14 insertions(+), 2 deletions(-)
+
+commit 6cdf879e389f05abba30b3fad8083b7fff23056e
+Author: Fabio D'Urso <fabiodurso@hotmail.it>
+Date:   Sun Jun 24 11:48:04 2012 +0200
+
+    qt4: Do not hang on malformed /Annots objects
+
+    Don't recurse infinitely if the /Annots object contains annotation
+    dictionaries (according to specs, /Annots must contain *references*
+    to annotation dictionaries).
+
+    Fixes bug #51361
+
+ qt4/src/poppler-annotation.cc |    5 +++++
+ 1 file changed, 5 insertions(+)
+
+commit 3575becd60585324bcefc0631b1bac47c1db3c5c
+Author: Mark Brand <mabrand@mabrand.nl>
+Date:   Thu Jun 14 20:31:26 2012 +0200
+
+    fix typo to compile in Windows
+
+ poppler/GlobalParamsWin.cc |    3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+commit 06618065c8a97a5bec125560546b98edfc1210f3
+Author: Albert Astals Cid <aacid@kde.org>
+Date:   Mon Jun 11 15:17:59 2012 +0200
+
+    Add some security checks to JBIG2Stream decoding
+
+    Fixes crash in broken/fuzzed pdf sent by Mateusz "j00ru" Jurczyk
+    and Gynvael Coldwind
+
+ poppler/JBIG2Stream.cc |   58
+ ++++++++++++++++++++++++++++++++++++------------
+ 1 file changed, 44 insertions(+), 14 deletions(-)
+
+commit e3fe88df3646a80945210ba426eb4681a98b55e9
+Author: Hib Eris <hib@hiberis.nl>
+Date:   Sun Jun 10 19:44:18 2012 +0200
+
+    Check value of first page in linearization table
+
+    Fixes crash in broken/fuzzed pdf sent by Mateusz "j00ru" Jurczyk
+    and Gynvael Coldwind
+
+ poppler/Linearization.cc |    4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 1240eee8c0d0d01113443e0fda87721775a76da9
+Author: Albert Astals Cid <aacid@kde.org>
+Date:   Sun Jun 10 20:42:55 2012 +0200
+
+    0.20.1
+
+ CMakeLists.txt      |    4 ++--
+ NEWS                |   25 +++++++++++++++++++++++++
+ configure.ac        |    2 +-
+ cpp/Doxyfile        |    2 +-
+ poppler/Makefile.am |    2 +-
+ qt4/src/Doxyfile    |    2 +-
+ 6 files changed, 31 insertions(+), 6 deletions(-)
+
+commit c783037619e2b4c101e8ecd7e61c94ee077b4be2
+Author: Albert Astals Cid <aacid@kde.org>
+Date:   Sun Jun 10 20:15:01 2012 +0200
+
+    Update copyrights
+
+ poppler/GlobalParamsWin.cc |    1 +
+ 1 file changed, 1 insertion(+)
+
+commit f3f9d8f28a97338da92c842d5668b0ef3495ef13
+Author: Albert Astals Cid <aacid@kde.org>
+Date:   Sun Jun 10 19:09:17 2012 +0200
+
+    Do use NULL function
+
+    Fixes crash in broken/fuzzed pdf sent by Mateusz "j00ru" Jurczyk
+    and Gynvael Coldwind
+
+ poppler/Gfx.cc |    5 +++--
+ 1 file changed, 3 insertions(+), 2 deletions(-)
+
+commit 92ef16e3699da949c80716c3fd4b438fe79c134d
+Author: Thomas Freitag <Thomas.Freitag@alfa.de>
+Date:   Sun Jun 10 16:58:54 2012 +0200
+
+    use setoverprintmode only if rip knows it
+
+ poppler/PSOutputDev.cc |    6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
+
+commit 99aa734ae2d3ba51f840d4c8ef450488fb702a31
+Author: Fabio D'Urso <fabiodurso@hotmail.it>
+Date:   Thu May 24 23:17:27 2012 +0200
+
+    qt4: Keep page rotation into account when normalizing annotation
+    coords
+
+    If the page is rotated by 90 or 270 degrees, width and height need
+    to be swapped
+
+ qt4/src/poppler-annotation.cc |   16 ++++++++++++++--
+ 1 file changed, 14 insertions(+), 2 deletions(-)
+
+commit bde31ce7b223abc86d25e06f3d73668b792c70df
+Author: Fabio D'Urso <fabiodurso@hotmail.it>
+Date:   Sat Jun 9 01:31:29 2012 +0200
+
+    Fix saving to xml
+
+    The default icon is Note not comment
+
+ qt4/src/poppler-annotation.cc |    2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 9904b8f10abf068a7816bd90976ccbb320387645
+Author: Adrian Johnson <ajohnson@redneon.com>
+Date:   Thu May 24 18:24:48 2012 +0930
+
+    glib docs: fix typo
+
+ glib/poppler-document.cc |    4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 028f580056f99719cfb8af7bbe8184ceac02cb16
+Author: Adrian Johnson <ajohnson@redneon.com>
+Date:   Sun May 13 21:36:36 2012 +0930
+
+    add sustitute font name to GlobalParamsWin32 to fix compilation
+
+ poppler/GlobalParamsWin.cc |    5 ++++-
+ 1 file changed, 4 insertions(+), 1 deletion(-)
+
+commit 1916d000a86336213ffd6e9bd44ce873e8955895
+Author: Adrian Johnson <ajohnson@redneon.com>
+Date:   Sat May 12 16:31:38 2012 +0930
+
+    Include substitute font name in system font cache
+
+    Bug 49826
+
+ poppler/FontInfo.cc     |    1 +
+ poppler/GlobalParams.cc |   58
+ ++++++++++++++++++++++++++---------------------
+ 2 files changed, 33 insertions(+), 26 deletions(-)
+
+commit 1c6e84555572a6bf3a2e3fbe9a54b40f11c122ad
+Author: Fabio D'Urso <fabiodurso@hotmail.it>
+Date:   Fri May 18 16:22:46 2012 +0200
+
+    qt4: Make TextAnnotation ctor public
+
+ qt4/src/poppler-annotation.h |    2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 8e504bf2543621973fdaddbd29055ce435540146
+Author: Ville Skyttä <ville.skytta@iki.fi>
+Date:   Wed May 16 23:49:01 2012 +0300
+
+    pdfseparate.1: Syntax fixes.
+
+ utils/pdfseparate.1 |    6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
+
+commit 9f7d919e68a26bb7dd809986d8394fe20b750bd0
+Author: Anthony Wesley <awesley@smartnetworks.com.au>
+Date:   Thu May 17 19:54:47 2012 +0200
+
+    Fix logic on SplashBitmap::writeImgFile
+
+ splash/SplashBitmap.cc |    3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+commit 7e7997e12faccf4c0513811b324a2fd0fa960a96
+Author: Igor Slepchin <igor.slepchin@gmail.com>
+Date:   Tue May 15 23:16:27 2012 +0200
+
+    Determine if font is bold or italic based on FontDescriptor.
+
+    Bug #49758
+
+ utils/HtmlFonts.cc     |   24 ++++++++++++++++++------
+ utils/HtmlFonts.h      |    3 ++-
+ utils/HtmlOutputDev.cc |    4 +---
+ 3 files changed, 21 insertions(+), 10 deletions(-)
+
+commit 329bb1e2b4f4b58832847bcf805d19ac0fd5ef02
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:   Sun May 13 19:45:55 2012 +0200
+
+    glib: Make sure password is always converted to latin1
+
+    Remove the utf8 validation since glib API is supposed to always
+    receive
+    utf8 strings.
+
+ glib/poppler-document.cc |   38 +++++++++++++++++++-------------------
+ 1 file changed, 19 insertions(+), 19 deletions(-)
+
+commit 7714b4e319c48ee915061a172208245ae7c4141b
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:   Sun May 13 19:30:17 2012 +0200
+
+    glib: Fix memory leak when document fails to load
+
+ glib/poppler-document.cc |    3 +--
+ 1 file changed, 1 insertion(+), 2 deletions(-)
+
+commit 13d2aa303eb1fd900f1045efec14af8002477b02
+Author: Thomas Freitag <Thomas.Freitag@alfa.de>
+Date:   Sun May 13 17:25:15 2012 +0200
+
+    remove unnecesary transparency group handling in splash
+
+    Bug #13487
+
+ poppler/Gfx.cc             |   64
+ +++++++++++++++++++++++++++++++++++++++++++-
+ poppler/Gfx.h              |    4 ++-
+ poppler/GfxState.cc        |    4 ++-
+ poppler/OutputDev.h        |    1 +
+ poppler/SplashOutputDev.cc |   11 ++++++++
+ poppler/SplashOutputDev.h  |    1 +
+ 6 files changed, 82 insertions(+), 3 deletions(-)
+
+commit a76867003a7bff5ab03016156c75b4c928788d50
+Author: Albert Astals Cid <aacid@kde.org>
+Date:   Sun May 13 13:10:40 2012 +0200
+
+    Distribute cmake/modules/FindLCMS2.cmake
+
+    Bug #49818
+
+ Makefile.am |    1 +
+ 1 file changed, 1 insertion(+)
+
+commit 4114c928fa2560937e02319f57937f1c267a9817
+Author: Albert Astals Cid <aacid@kde.org>
+Date:   Thu May 10 21:09:14 2012 +0200
+
+    0.20.0
+
+ CMakeLists.txt      |    6 +++---
+ NEWS                |   16 ++++++++++++++++
+ configure.ac        |    4 ++--
+ cpp/Doxyfile        |    2 +-
+ poppler/Makefile.am |    2 +-
+ qt4/src/Doxyfile    |    2 +-
+ 6 files changed, 24 insertions(+), 8 deletions(-)
+
+commit df05d084cb26807c39695280cd8ea52d13aa1255
+Author: Albert Astals Cid <aacid@kde.org>
+Date:   Thu May 10 20:54:13 2012 +0200
+
+    Bring back the begin/endMarkedContent virtuals
+
+    For those evil people that keep using poppler internals
+
+ poppler/Gfx.cc       |    8 ++++++++
+ poppler/OutputDev.cc |    8 +++++++-
+ poppler/OutputDev.h  |    4 +++-
+ 3 files changed, 18 insertions(+), 2 deletions(-)
+
+commit b6159fea4a13ecfd1c38b3a666a797c5147dd952
+Author: William Bader <williambader@hotmail.com>
+Date:   Thu May 10 20:02:19 2012 +0200
+
+    splash uses cmykTransferC for M, Y and K in two places
+
+ splash/Splash.cc |   14 +++++++-------
+ 1 file changed, 7 insertions(+), 7 deletions(-)
+
+commit c2146219d555cab277906daefd2589f9056f536c
+Author: Peter Breitenlohner <peb@mppmu.mpg.de>
+Date:   Thu May 10 13:26:18 2012 +0200
+
+    Add missing function parameter
+
+ poppler/GlobalParams.cc |    4 +++-
+ 1 file changed, 3 insertions(+), 1 deletion(-)
+
+commit 753f6ab9347f972223ec21b7ed4b4f7ebed3d420
+Author: Albert Astals Cid <aacid@kde.org>
+Date:   Thu May 3 15:29:57 2012 -0700
+
+    Compile with ENABLE_PLUGINS defined
+
+ poppler/SecurityHandler.cc |    4 ++--
+ poppler/SecurityHandler.h  |   16 ++++++++++++++++
+ poppler/XpdfPluginAPI.cc   |   35 +----------------------------------
+ poppler/XpdfPluginAPI.h    |   34 +++++++++++++++-------------------
+ 4 files changed, 34 insertions(+), 55 deletions(-)
+
+commit 23df93aaf495428b580bafd0fd1f41515828b08d
+Author: Albert Astals Cid <aacid@kde.org>
+Date:   Thu May 3 14:50:09 2012 -0700
+
+    We don't support the keyBinding concept
+
+    remove wrong merge
+
+ poppler/GlobalParams.cc |    1 -
+ 1 file changed, 1 deletion(-)
+
+commit e55838b41959acc311e9b00dc390c9816a9afac2
+Author: Jason <jasongross9+bugzilla@gmail.com>
+Date:   Wed May 2 19:35:26 2012 +0200
+
+    glib: Use delete[] to free array allocated with new[]
+
+    https://bugs.freedesktop.org/show_bug.cgi?id=48447
+
+ glib/poppler-document.cc |    2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit dec873463b06bfe76ff48e36282877e6ac11b59d
+Author: Albert Astals Cid <aacid@kde.org>
+Date:   Sun Apr 29 23:36:57 2012 +0200
+
+    Add the objUint type
+
+ poppler/Object.cc |    5 +++--
+ 1 file changed, 3 insertions(+), 2 deletions(-)
+
+commit 50c0b294d08114920a5db711876e20d991f474a6
+Author: Albert Astals Cid <aacid@kde.org>
+Date:   Sun Apr 29 22:33:09 2012 +0200
+
+    Make sure the index to dcHuffTables and acHuffTables is in bounds
+
+    Found in a fuzzed pdf sent by Mateusz "j00ru" Jurczyk and Gynvael
+    Coldwind
+
+ poppler/Stream.cc |    3 +++
+ 1 file changed, 3 insertions(+)
+
+commit 9e36206465289c96cb189c648a6f5121714c647b
+Author: Albert Astals Cid <aacid@kde.org>
+Date:   Sun Apr 29 22:18:12 2012 +0200
+
+    include for memcpy
+
+ splash/SplashBitmap.cc |    3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+commit 931051fe0bb445545355027d999515bc3d4b32ef
+Author: Albert Astals Cid <aacid@kde.org>
+Date:   Sun Apr 29 22:07:34 2012 +0200
+
+    Make sure the index for refLine is in bounds
+
+    Found in a fuzzed pdf sent by Mateusz "j00ru" Jurczyk and Gynvael
+    Coldwind
+
+ poppler/Stream.cc |   10 ++++++----
+ 1 file changed, 6 insertions(+), 4 deletions(-)
+
+commit 53b9c2e2806320d0d0e35134b75da5da72514742
+Author: Albert Astals Cid <aacid@kde.org>
+Date:   Sun Apr 29 22:00:18 2012 +0200
+
+    Just call getNum if isNum is true
+
+    Found in a fuzzed pdf sent by Mateusz "j00ru" Jurczyk and Gynvael
+    Coldwind
+
+ poppler/Link.cc |   17 ++++++++++-------
+ 1 file changed, 10 insertions(+), 7 deletions(-)
+
+commit da8d858c4fc610718a5f14b14dc3a4a11564a73d
+Author: Albert Astals Cid <aacid@kde.org>
+Date:   Sun Apr 29 20:28:37 2012 +0200
+
+    Do not access args[-1]
+
+    Found in a fuzzed pdf sent by Mateusz "j00ru" Jurczyk and Gynvael
+    Coldwind
+
+ poppler/Gfx.cc |   10 ++++++----
+ 1 file changed, 6 insertions(+), 4 deletions(-)
+
+commit 934b1a7cd502fe5537a350cdfc650989992693f7
+Author: Albert Astals Cid <aacid@kde.org>
+Date:   Sun Apr 29 19:59:15 2012 +0200
+
+    Do not access invalid lookup indexes
+
+    Found by Mateusz "j00ru" Jurczyk and Gynvael Coldwind
+
+ poppler/GfxState.cc |   13 ++++++++++---
+ 1 file changed, 10 insertions(+), 3 deletions(-)
+
+commit e80fd082914fe29fad7e60c321a747eb8634e413
+Author: Albert Astals Cid <aacid@kde.org>
+Date:   Sun Apr 29 18:27:41 2012 +0200
+
+    [qt4] the qualified name may be unicode encoded
+
+ qt4/src/poppler-form.cc |    4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 251be1787a2a003862691f5a825eb3468eceb6a2
+Author: Albert Astals Cid <aacid@kde.org>
+Date:   Sun Apr 29 18:26:42 2012 +0200
+
+    Fix getFullyQualifiedName with unicode field names
+
+    Based on a patch from Mark Riedesel.
+    Bug #49256
+
+ poppler/Form.cc |   71
+ +++++++++++++++++++++++++++++++++++++++++++++++--------
+ 1 file changed, 61 insertions(+), 10 deletions(-)
+
+commit be41f1c7905d695d17e19ced83a1018531d00199
+Author: Albert Astals Cid <aacid@kde.org>
+Date:   Sun Apr 29 16:02:45 2012 +0200
+
+    SplashOutputDev: Fix rendering of knockout groups
+
+    Bug #12185
+
+ poppler/SplashOutputDev.cc |   31 ++++++++++++++++++++++++++++---
+ splash/Splash.cc           |   21 ++++++++++++++++++---
+ splash/Splash.h            |    6 ++++--
+ splash/SplashBitmap.cc     |   22 +++++++++++++++++++++-
+ splash/SplashBitmap.h      |    2 ++
+ 5 files changed, 73 insertions(+), 9 deletions(-)
+
+commit 800cb9ec7189a539d64b99fa181cd4126496c1ec
+Author: Thomas Freitag <Thomas.Freitag@kabelmail.de>
+Date:   Sat Apr 28 17:15:30 2012 +0200
+
+    Reconstruct xref table if xref needed but missing
+
+    Bug #40719
+
+ poppler/XRef.cc |    2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 410822d7013ce1f61325afdb61d75ea64666755e
+Author: Albert Astals Cid <aacid@kde.org>
+Date:   Fri Apr 27 01:10:22 2012 +0200
+
+    0.19.4
+
+ CMakeLists.txt      |    4 ++--
+ NEWS                |   17 +++++++++++++++++
+ configure.ac        |    2 +-
+ cpp/Doxyfile        |    2 +-
+ poppler/Makefile.am |    2 +-
+ qt4/src/Doxyfile    |    2 +-
+ 6 files changed, 23 insertions(+), 6 deletions(-)
+
+commit b1d5c6c0a20a4a24b42de66db23e0f63d10ca52d
+Author: Fabio D'Urso <fabiodurso@hotmail.it>
+Date:   Tue Apr 24 21:00:11 2012 +0200
+
+    Output XRef stream when incrementally updating if there's already
+    a XRef stream
+
+ poppler/PDFDoc.cc |   45 +++++++++++++++++++++++++++++--
+ poppler/XRef.cc   |   76
+ +++++++++++++++++++++++++++++++++++++++++++++--------
+ poppler/XRef.h    |   34 ++++++++++++++++++++++++
+ 3 files changed, 142 insertions(+), 13 deletions(-)
+
+commit 2ecf3b2e49a4c35e995d25016b810592260edfeb
+Author: Fabio D'Urso <fabiodurso@hotmail.it>
+Date:   Tue Apr 24 18:10:15 2012 +0200
+
+    Refactoring of XRef table write support (in preparation for XRef
+    stream write support)
+
+     - Trailer dictionary creation now lives in its own function
+     "createTrailerDict"
+       (that will be used by XRef stream creation too)
+     - writeXRefTableTrailer (WAS writeTrailer) now takes care of writing
+     the XRef
+       table too (previously it was demanded to the caller)
+
+ poppler/PDFDoc.cc |   61
+ ++++++++++++++++++++++++++---------------------------
+ poppler/PDFDoc.h  |   14 +++++++++---
+ poppler/XRef.cc   |    2 +-
+ poppler/XRef.h    |    2 +-
+ utils/pdfunite.cc |   10 +++++----
+ 5 files changed, 49 insertions(+), 40 deletions(-)
+
+commit cf7a20adbd15f901d414ce06825459c33eeef3f5
+Author: Thomas Freitag <Thomas.Freitag@alfa.de>
+Date:   Wed Apr 25 18:51:23 2012 +0200
+
+    Fix slow rendering of pdf with a lot of image masks in pattern
+    colorspace
+
+    Makes it around 8 times faster
+
+ poppler/CairoOutputDev.cc  |    6 +++---
+ poppler/CairoOutputDev.h   |    6 +++---
+ poppler/Gfx.cc             |    4 ++--
+ poppler/OutputDev.cc       |    5 +++--
+ poppler/OutputDev.h        |    6 +++---
+ poppler/PSOutputDev.cc     |    4 ++--
+ poppler/PSOutputDev.h      |    4 ++--
+ poppler/SplashOutputDev.cc |   35 +++++++++++------------------------
+ poppler/SplashOutputDev.h  |    4 ++--
+ 9 files changed, 31 insertions(+), 43 deletions(-)
+
+commit 26fd142a3608283fd41e07b54067a51a9db76e93
+Author: Fabio D'Urso <fabiodurso@hotmail.it>
+Date:   Sat Apr 21 18:16:46 2012 +0200
+
+    Preserve z-index after annotation removal
+
+ poppler/Annot.cc |    5 +++--
+ 1 file changed, 3 insertions(+), 2 deletions(-)
+
+commit 7b10014c1fe9ef1cba57fd6b01c63129ac31386a
+Author: Fabio D'Urso <fabiodurso@hotmail.it>
+Date:   Sat Apr 21 17:53:22 2012 +0200
+
+    Do not remove appearance stream if it's shared with other annotations
+
+ poppler/Annot.cc |   78
+ +++++++++++++++++++++++++++++++++++++++++++++++++++---
+ poppler/Annot.h  |    6 +++++
+ 2 files changed, 80 insertions(+), 4 deletions(-)
+
+commit 7684c325929493ad9de01a891de0aef197e176dd
+Author: Fabio D'Urso <fabiodurso@hotmail.it>
+Date:   Sat Apr 21 20:26:49 2012 +0200
+
+    AnnotText: Always force 24x24 size with custom stamps, not only on
+    first rendering
+
+ poppler/Annot.cc |   21 ++++++++++++---------
+ 1 file changed, 12 insertions(+), 9 deletions(-)
+
+commit 44cd46a6e04a87bd702dab4a662042f69f16c4ad
+Author: Albert Astals Cid <aacid@kde.org>
+Date:   Mon Apr 23 20:02:55 2012 +0200
+
+    Do not try to access nPatches - 1 if nPatches is 0
+
+    Found by Mateusz "j00ru" Jurczyk and Gynvael Coldwind
+
+ poppler/GfxState.cc |   20 +++++++++++++++++++-
+ 1 file changed, 19 insertions(+), 1 deletion(-)
+
+commit a92f87b83e3c6c9078508c644aa09f4f2b14e9cc
+Author: Albert Astals Cid <aacid@kde.org>
+Date:   Mon Apr 23 00:06:18 2012 +0200
+
+    Do not complain if the entry is missing
+
+    Since we are actually looking for non existing entries :D
+
+ poppler/XRef.cc |    2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 114e113e3278d02baaffd6c0da7fda266283c176
+Author: Fabio D'Urso <fabiodurso@hotmail.it>
+Date:   Sat Apr 21 21:08:55 2012 +0200
+
+    Do not allocate XRef entries whose generation number is 65535
+
+ poppler/XRef.cc |    5 ++++-
+ 1 file changed, 4 insertions(+), 1 deletion(-)
+
+commit ad8785b053aa115b593b2f20073e2989d59a77c9
+Author: Albert Astals Cid <aacid@kde.org>
+Date:   Wed Apr 18 22:51:33 2012 +0200
+
+    Remove duplicate call
+
+ utils/pdftohtml.cc |    1 -
+ 1 file changed, 1 deletion(-)
+
+commit 80d4e1843c56801508f476fed64ecb3201ba18c8
+Author: Fabio D'Urso <fabiodurso@hotmail.it>
+Date:   Tue Apr 17 20:25:57 2012 +0200
+
+    Do not draw border in AnnotText::draw
+
+ poppler/Annot.cc |    2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit a1e3d868ccd7fb84d52d94754d8681c97119fb6e
+Author: Fabio D'Urso <fabiodurso@hotmail.it>
+Date:   Fri Mar 30 21:52:04 2012 +0200
+
+    Save/restore gfx state when drawing annot border
+
+ poppler/Gfx.cc |    3 +++
+ 1 file changed, 3 insertions(+)
+
+commit 7fbeaac5c0d0240564add6c252c1ba7c14639d98
+Author: Albert Astals Cid <aacid@kde.org>
+Date:   Tue Apr 17 20:36:51 2012 +0200
+
+    Be sure we are checking a non free entry
+
+ poppler/XRef.cc |    2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit d1254c7e8e995302542093968a0c2967f3c0b5ff
+Author: Thomas Freitag <Thomas.Freitag@kabelmail.de>
+Date:   Tue Apr 17 20:36:03 2012 +0200
+
+    Do not complain if the entry does not exist
+
+    XRef::getNumEntry is only trying to find which entry a given stream
+    pos belongs so no need to cry if the entry is not there
+    Bug 48679
+
+ poppler/XRef.cc |   10 ++++++----
+ poppler/XRef.h  |    2 +-
+ 2 files changed, 7 insertions(+), 5 deletions(-)
+
+commit bcbe9497a4fa50b41852abd538ad139c7b6693e5
+Author: suzuki toshiya <mpsuzuki@hiroshima-u.ac.jp>
+Date:   Tue Apr 17 20:21:58 2012 +0200
+
+    Copying graphics library CFLAGS to cpp frontend Makefile.am.
+
+    Because poppler-image.cpp includes PNGWriter.h, JpegWriter.h,
+    TiffWriter.h,
+    CFLAGS to include libpng, libjpeg and libtiff headers are expected.
+
+ cpp/Makefile.am |   22 +++++++++++++++++++++-
+ 1 file changed, 21 insertions(+), 1 deletion(-)
+
+commit 44c9df8277877ee1021317a3b6c253f80310f826
+Author: suzuki toshiya <mpsuzuki@hiroshima-u.ac.jp>
+Date:   Tue Apr 17 20:21:00 2012 +0200
+
+    Do not clear FREETYPE_CFLAGS, FREETYPE_LIBS before PKG_CHECK_MODULES()
+
+    Although configure --help says as if environmental variables
+    FREETYPE_CFLAGS and FREETYPE_LIBS will overwrite the values obtained
+    by pkg-config. But it is not. These help messages are automatically
+    given
+    by pkg-config macro (so I guess no poppler developer designed so
+    intentionally).
+
+    In current configure, FREETYPE_CFLAGS, FREETYPE_LIBS are cleared
+    before
+    PKG_CONFIG_MODULES(), like:
+
+            dnl Check for freetype headers
+            FREETYPE_LIBS=
+            FREETYPE_CFLAGS=
+
+            PKG_CHECK_MODULES(FREETYPE, freetype2,
+                              [freetype_pkgconfig=yes],
+                              [freetype_pkgconfig=no])
+
+            if test "x$freetype_pkgconfig" = "xyes"; then
+
+              AC_DEFINE(HAVE_FREETYPE_H, 1, [Have FreeType2 include
+              files])
+
+            else
+
+              AC_PATH_PROG(FREETYPE_CONFIG, freetype-config, no)
+            [...]
+
+    Checking the history why these values are cleared, it seems that
+    the initial revision of poppler did not use pkg-config to detect
+    FREETYPE_CFLAGS, _LIBS. At that time, only freetype-config is used.
+    In later, when PKG_CHECK_MODULES is introduced, it was accidentally
+    introduced AFTER the clearning of FREETYPE_CFLAGS,_LIBS. As a result,
+    the inconsistency between "configure --help" and what configure does
+    really. I propose to move the clearance of FREETYPE_CFLAGS,_LIBS
+    just before AC_PATH_PROG, to make PKG_CHECK_MODULES catch the
+    environmental
+    values.
+
+ configure.ac |    5 +++--
+ 1 file changed, 3 insertions(+), 2 deletions(-)
+
+commit 9e0f0368e543df46b40cbd7bed6fdc1abf846e7d
+Author: suzuki toshiya <mpsuzuki@hiroshima-u.ac.jp>
+Date:   Tue Apr 17 20:19:41 2012 +0200
+
+    Do not append "-ansi" to CXXFLAG, if "-std=XXX" is already specified.
+
+    SplashOutputDev.cc uses isfinite() function (defined by math.h).
+    isfinite() was standardized in C99, and imported to C++0x in later.
+
+    In QNX header file system, isfinite() is disabled by default,
+    the definition of __STDC_VERSION__ > 199901 is required to enable it.
+    In the case of GCC, "-std=c99" (for C) or "-std=gnu++0x" (for C++)
+    is expected.
+
+    But, current configure of poppler appends "-ansi" flag for CXXFLAGS,
+    if the compiler is known to be GNU. "-ansi" is C89 or C++98,
+    so isfinite()
+    is unavailable. I propose a patch NOT to "-ansi" flag, if CXXFLAGS
+    includes "-std=XXX" already.
+
+ configure.ac |    8 +++++++-
+ 1 file changed, 7 insertions(+), 1 deletion(-)
+
+commit 2f1e7ef252b8d1f7ee6004825c2926f0f5e181a5
+Author: Albert Astals Cid <aacid@kde.org>
+Date:   Thu Apr 12 23:11:41 2012 +0200
+
+    Do not crash in broken documents
+
+    They might trigger an xref reconstruct and then i could not be in
+    bounds anymore
+    Crash found by Joel Voss of Leviathan Security Group
+
+ poppler/XRef.cc |   11 +++++++++++
+ 1 file changed, 11 insertions(+)
+
+commit 19fb9caecb1b265a8b8651e9bcf4b779f593fefd
+Author: Albert Astals Cid <aacid@kde.org>
+Date:   Thu Apr 12 22:24:50 2012 +0200
+
+    Fix crash when the destination file does not exist
+
+    Issue found by Joel Voss of Leviathan Security Group
+
+ utils/HtmlOutputDev.cc |   18 ++++++++++--------
+ 1 file changed, 10 insertions(+), 8 deletions(-)
+
+commit fa4848eae370437ab1b9863124e9a340830f66c7
+Author: Adrian Johnson <ajohnson@redneon.com>
+Date:   Fri Apr 13 22:11:01 2012 +0930
+
+    man pages: add missing section heading
+
+ utils/pdftotext.1 |    1 +
+ 1 file changed, 1 insertion(+)
+
+commit 08a14aa37b177bb4586869857ae678cb4bcd4039
+Author: Albert Astals Cid <aacid@kde.org>
+Date:   Thu Apr 12 21:52:30 2012 +0200
+
+    0.19.3
+
+ CMakeLists.txt         |    4 ++--
+ NEWS                   |   26 +++++++++++++++++++++++++-
+ configure.ac           |    2 +-
+ cpp/Doxyfile           |    2 +-
+ poppler/Makefile.am    |    2 +-
+ qt4/src/CMakeLists.txt |    2 +-
+ qt4/src/Doxyfile       |    2 +-
+ qt4/src/Makefile.am    |    2 +-
+ 8 files changed, 33 insertions(+), 9 deletions(-)
+
+commit 52227b59d1fa2a2029bfff2f8a167efd81faebbb
+Author: Albert Astals Cid <aacid@kde.org>
+Date:   Thu Apr 12 20:52:55 2012 +0200
+
+    Update (C)
+
+ poppler/CairoFontEngine.cc |    2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 40cb3f27f4dcad4fe8c48f0b638eac7913fc3722
+Author: Albert Astals Cid <aacid@kde.org>
+Date:   Thu Apr 12 20:50:38 2012 +0200
+
+    Do not pass those params to createGfx since they aren't used
+
+ glib/poppler-page.cc |    4 ++--
+ poppler/Page.cc      |    9 +++------
+ poppler/Page.h       |    5 ++---
+ 3 files changed, 7 insertions(+), 11 deletions(-)
+
+commit 9a10d31fca7f060f24bae9efe15662f02a9684ca
+Author: Fabio D'Urso <fabiodurso@hotmail.it>
+Date:   Thu Apr 12 20:31:23 2012 +0200
+
+    qt4: Remove unimplemented revision setters from public API
+
+ qt4/src/poppler-annotation-private.h |    2 ++
+ qt4/src/poppler-annotation.cc        |   62
+ ++++++++--------------------------
+ qt4/src/poppler-annotation.h         |   13 -------
+ 3 files changed, 16 insertions(+), 61 deletions(-)
+
+commit 0531329aeb8783c48f056929e6e81cebda33500f
+Author: Albert Astals Cid <aacid@kde.org>
+Date:   Thu Apr 12 20:07:13 2012 +0200
+
+    [qt4] Mark the dummy stuff as deprecated
+
+ qt4/src/poppler-annotation.h |    4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 67b7b2bdd0943680437d96349c3415aa40082cbb
+Author: Albert Astals Cid <aacid@kde.org>
+Date:   Thu Apr 12 20:06:52 2012 +0200
+
+    [qt4] initialize the dummy members here too
+
+ qt4/src/poppler-annotation.cc |    4 +++-
+ 1 file changed, 3 insertions(+), 1 deletion(-)
+
+commit bf171382afb6b50284c3855e3a1815a15ec34366
+Author: Albert Astals Cid <aacid@kde.org>
+Date:   Thu Apr 12 19:24:42 2012 +0200
+
+    Add since markers
+
+ qt4/src/poppler-annotation.h |    7 ++++---
+ 1 file changed, 4 insertions(+), 3 deletions(-)
+
+commit e36fd775394ee752c0f62f789359c72b52094975
+Author: Albert Astals Cid <aacid@kde.org>
+Date:   Thu Apr 12 18:58:29 2012 +0200
+
+    Remove unneeded forward declaration
+
+ qt4/src/poppler-qt4.h |    3 +--
+ 1 file changed, 1 insertion(+), 2 deletions(-)
+
+commit c1aa4a8c0aa9d46757e3849776acac42731e02d1
+Author: Fabio D'Urso <fabiodurso@hotmail.it>
+Date:   Thu Apr 12 00:39:33 2012 +0200
+
+    qt4: Annotation appearance invalidation
+
+    Call Annot::invalidateAppearance every time the visual aspect
+    is changed
+
+ qt4/src/poppler-annotation.cc |   34 ++++++++++++++++++++++++++++++++++
+ 1 file changed, 34 insertions(+)
+
+commit 4338ae354c66e4df8d7d70a156517e27b3b80539
+Author: Fabio D'Urso <fabiodurso@hotmail.it>
+Date:   Sun Mar 25 22:58:33 2012 +0200
+
+    qt4: Added HideAnnotations option to PSConverter
+
+ qt4/src/poppler-ps-converter.cc |   23 ++++++++++++++++++++++-
+ qt4/src/poppler-qt4.h           |    3 ++-
+ 2 files changed, 24 insertions(+), 2 deletions(-)
+
+commit e50993b3b47a759c93ccdeeaef289d6985b05bb1
+Author: Fabio D'Urso <fabiodurso@hotmail.it>
+Date:   Thu Mar 22 19:58:12 2012 +0100
+
+    qt4: DOM annotation store - Black color is different than invalid
+    color
+
+ qt4/src/poppler-annotation.cc |    2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 4739a6a02097f110c37defdfa616351459902806
+Author: Fabio D'Urso <fabiodurso@hotmail.it>
+Date:   Mon Mar 19 19:17:33 2012 +0100
+
+    qt4: Annotation removal
+
+ qt4/src/poppler-annotation-private.h |    3 +++
+ qt4/src/poppler-annotation.cc        |   29 +++++++++++++++++++++++++++++
+ qt4/src/poppler-page.cc              |    5 +++++
+ qt4/src/poppler-qt4.h                |    8 ++++++++
+ 4 files changed, 45 insertions(+)
+
+commit 25a64d69aaab61c8cf944107e649e19920244a2b
+Author: Fabio D'Urso <fabiodurso@hotmail.it>
+Date:   Tue Mar 20 01:46:07 2012 +0100
+
+    qt4: TextAnnotation write support + basic textFont getter
+
+    Also makes inplaceText a synoym for contents
+
+ qt4/src/poppler-annotation.cc |  159
+ ++++++++++++++++++++++++++++++++---------
+ 1 file changed, 124 insertions(+), 35 deletions(-)
+
+commit a31a8118ba07aa7f90c69130476fb7d86f8614ad
+Author: Fabio D'Urso <fabiodurso@hotmail.it>
+Date:   Sun Mar 11 23:57:51 2012 +0100
+
+    qt4: GeomAnnotation, InkAnnotation and CaretAnnotation write support
+
+ qt4/src/poppler-annotation.cc |  103
+ +++++++++++++++++++++++++++++++++++++----
+ qt4/src/poppler-annotation.h  |    6 +--
+ 2 files changed, 96 insertions(+), 13 deletions(-)
+
+commit e4052b52002447772e24571fd13f0f22fd2bfb16
+Author: Fabio D'Urso <fabiodurso@hotmail.it>
+Date:   Sat Mar 10 17:48:56 2012 +0100
+
+    qt4: HighlightAnnotation and StampAnnotation write support
+
+ qt4/src/poppler-annotation.cc |   96
+ ++++++++++++++++++++++++++++++++++++++---
+ qt4/src/poppler-annotation.h  |    4 +-
+ 2 files changed, 91 insertions(+), 9 deletions(-)
+
+commit b5e948b6130cdb04387a8244179337c7904dcd03
+Author: Fabio D'Urso <fabiodurso@hotmail.it>
+Date:   Wed Mar 14 17:44:50 2012 +0100
+
+    qt4: Annotation insertion and LineAnnotation support
+
+    This patch adds Page::addAnnotation to insert new annotations in
+    a page.
+    The only annotation type that can be added is LineAnnotation. Support
+    for other
+    types will be added in the next patches.
+
+ qt4/src/poppler-annotation-private.h |   12 ++
+ qt4/src/poppler-annotation.cc        |  297
+ ++++++++++++++++++++++++++++++++--
+ qt4/src/poppler-annotation.h         |    4 +-
+ qt4/src/poppler-page.cc              |    5 +
+ qt4/src/poppler-qt4.h                |    9 ++
+ 5 files changed, 316 insertions(+), 11 deletions(-)
+
+commit 20b4feec612448be8a800173ddadbf257657477e
+Author: Fabio D'Urso <fabiodurso@hotmail.it>
+Date:   Fri Mar 9 19:31:16 2012 +0100
+
+    qt4: Basic setters to edit annotations
+
+ qt4/src/poppler-annotation-helper.h  |   15 ++++
+ qt4/src/poppler-annotation-private.h |    1 +
+ qt4/src/poppler-annotation.cc        |  128
+ +++++++++++++++++++++++++++++++---
+ 3 files changed, 135 insertions(+), 9 deletions(-)
+
+commit 0e8c35b59f0fba926b30c9a87823c92ae03bf116
+Author: Fabio D'Urso <fabiodurso@hotmail.it>
+Date:   Fri Mar 9 01:04:28 2012 +0100
+
+    qt4: Changes to Annotation API (part 2/2)
+
+    1) Moved annotation data retrieval logic to getters for types of
+    annotations
+    that will be made editable in next patches.
+    Others (Link, FileAttachment, Sound, Movie and Screen) are still
+    entirely filled
+    at creation time.
+
+    2) TextAnnotation's callout points setter now takes an array, not just
+    individual points.
+
+    3) AnnotationPrivate::pdfObjectReference replaced with a getter
+    method that
+    directly queries the tied Annot object (if any)
+
+ qt4/src/poppler-annotation-helper.h  |   31 +-
+ qt4/src/poppler-annotation-private.h |   23 +-
+ qt4/src/poppler-annotation.cc        | 1254
+ +++++++++++++++++++++++++++++++---
+ qt4/src/poppler-annotation.h         |   58 +-
+ qt4/src/poppler-link.cc              |    2 +-
+ qt4/src/poppler-page.cc              |  778 +--------------------
+ qt4/src/poppler-qt4.h                |    4 +-
+ 7 files changed, 1217 insertions(+), 933 deletions(-)
+
+commit 73b91207649a81740183e2288809d3b84b52f595
+Author: Fabio D'Urso <fabiodurso@hotmail.it>
+Date:   Wed Mar 7 17:05:50 2012 +0100
+
+    qt4: Changes to Annotation API (part 1/2)
+
+    This is part 1/2 of a change in annotation API. It breaks both source
+    and binary
+    compatibility.
+
+    Note that, even though DOM methods are partially modified by this
+    patch, their
+    output is 100% backward compatible. Therefore code relying only on
+    DOM methods
+    (i.e. AnnotationUtils methods) will keep working.
+
+    1) Style and Popup container classes
+
+    Style and Popup (previously known as Window) properties are now
+    wrapped in
+    container classes. In both of them, private data is implicitly shared.
+    The old Window structure is removed, but an undocumented window
+    field is still
+    exported to make Okular 4.8.0 compile. It must not be used.
+
+    2) Revisions
+
+    The Annotation::Revision structure was removed, because it added an
+    extra layer
+    of indirection that can be avoided. Now revision scope and type
+    are stored
+    directly in the target Annotation, and Annotation::revisions()
+    returns a list
+    of pointers to child annotations.
+
+    3) All constructors are temporarily made private
+
+    This patch hides all constructors from user code. Subsequent
+    patches will
+    restore them in the same patch as their type-specific creation
+    support.
+
+    4) Minor fixes
+        - Popup size was incorrectly stored as an integer value, now
+        it's part of
+          a QRectF.
+        - Typo: LinkAnnotation::linkDestionation() --> linkDestination
+        - Dash array is now exported as QVector<doubles> instead of
+        a marks/spaces
+          integer pair
+        - GeomAnnotation's geometricalPointWidth removed, because it
+        was never
+          referenced and it doesn't exist in PDF specs
+
+    5) AnnotationPrivate data is now explicitly shared
+    Annotation private data has been rearranged so that it's now
+    possible to
+    uniformly give ownership of all Annotation objects to the caller.
+    Previously Page::annotations() did leave ownership to user, but
+    Annotation::revisions() didn't. Now both of them give ownership
+    to user.
+
+ qt4/src/poppler-annotation-private.h |   19 +-
+ qt4/src/poppler-annotation.cc        | 1022
+ ++++++++++++++++++++++++----------
+ qt4/src/poppler-annotation.h         |  292 +++++++---
+ qt4/src/poppler-page.cc              |   92 ++-
+ qt4/src/poppler-qt4.h                |    6 +
+ 5 files changed, 997 insertions(+), 434 deletions(-)
+
+commit 7f0f080277d35f6f2e426ca2a3ff76c2856daeaf
+Author: Adrian Johnson <ajohnson@redneon.com>
+Date:   Tue Apr 10 00:08:49 2012 +0930
+
+    cairo: fix stroke pattern with transparency group
+
+    Cairo copy path/append path with device offsets is broken. Use GfxPath
+    instead.
+
+    Bug 48468
+
+ poppler/CairoOutputDev.cc |   15 ++++++---------
+ poppler/CairoOutputDev.h  |    4 ++--
+ 2 files changed, 8 insertions(+), 11 deletions(-)
+
+commit 5ea305c3924cead302092378ab67300c3099afd9
+Author: Adrian Johnson <ajohnson@redneon.com>
+Date:   Sun Apr 8 23:11:30 2012 +0930
+
+    cairo: only align stroke coords for horizontal and vertical lines
+
+    Bug 48318
+
+ poppler/CairoOutputDev.cc |   80
+ ++++++++++++++++++++++++++++++++++-----------
+ poppler/CairoOutputDev.h  |    2 +-
+ 2 files changed, 62 insertions(+), 20 deletions(-)
+
+commit 8414d8f621b8abb018e80f2255cfb511a1e558d4
+Author: Adrian Johnson <ajohnson@redneon.com>
+Date:   Mon Apr 9 12:08:20 2012 +0930
+
+    cairo: ensure 0 width lines with stroke_adjust are aligned
+
+    Previously the code path for 0 width lines ignored the stroke_adjust
+    setting. Rearrange the code so the code path for stroke_adjust == TRUE
+    is performed first (this will also set 0 width lines to 1 pixel wide).
+
+ poppler/CairoOutputDev.cc |   42
+ +++++++++++++++++++++---------------------
+ 1 file changed, 21 insertions(+), 21 deletions(-)
+
+commit af1a84eb90656de68bb14f2c4ae4f813c51bc3a3
+Author: Adrian Johnson <ajohnson@redneon.com>
+Date:   Mon Apr 9 17:17:29 2012 +0930
+
+    cairo: fix paintTransparencyGroup when both mask and fill opacity
+    are required
+
+    Bug 48453
+
+ poppler/CairoOutputDev.cc |    8 +++++++-
+ 1 file changed, 7 insertions(+), 1 deletion(-)
+
+commit 46b3a70cae3b37cb4270a83afaddd6734442b752
+Author: Fabio D'Urso <fabiodurso@hotmail.it>
+Date:   Mon Apr 9 19:32:24 2012 +0200
+
+    Caption text rendering in AnnotLine
+
+ poppler/Annot.cc |  262
+ +++++++++++++++++++++++++++++++++++++-----------------
+ poppler/Annot.h  |    2 +
+ 2 files changed, 183 insertions(+), 81 deletions(-)
+
+commit 855607828447ecec2c8444650d015e21bd17d2e2
+Author: Fabio D'Urso <fabiodurso@hotmail.it>
+Date:   Mon Apr 9 16:45:50 2012 +0200
+
+    AnnotFreeText rendering improvements (auto word-wrap, quadding,
+    border style, font/border color)
+
+ poppler/Annot.cc |  146
+ ++++++++++++++++++++++++++++++++++++++++++------------
+ poppler/Annot.h  |    1 +
+ 2 files changed, 115 insertions(+), 32 deletions(-)
+
+commit 80f662162698c1ec27771d9cf5e2e6bc3d21c4df
+Author: Ihar Filipau <thephilips@gmail.com>
+Date:   Thu Apr 12 00:19:26 2012 +0200
+
+    Fix the mask inversion
+
+ utils/HtmlOutputDev.cc |    2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 06591d848e53598973f7d5fddac50785a46e8027
+Author: Thomas Freitag <Thomas.Freitag@alfa.de>
+Date:   Wed Apr 11 23:49:29 2012 +0200
+
+    Fix Splash CMYK merge error
+
+    Mail says
+    ******
+    Hi,
+
+    playing around with the attached PDF to get a better CMYK support for
+    the blend mode soft light, I encountered that I made a big mistake
+    during merge in the CMYK part of splash. I fixed that. The attached
+    patch also includes the small enhancement I made in soft light
+    routine.
+    ******
+
+ poppler/SplashOutputDev.cc |    9 +++++++++
+ splash/Splash.cc           |    2 +-
+ 2 files changed, 10 insertions(+), 1 deletion(-)
+
+commit 1f45afde6410f03c79fcf4b66d5834079879d38f
+Author: Ihar Filipau <thephilips@gmail.com>
+Date:   Mon Apr 9 19:17:41 2012 +0200
+
+    Add producer and version to xml output
+
+ utils/HtmlOutputDev.cc |    2 +-
+ utils/pdf2xml.dtd      |    4 ++++
+ 2 files changed, 5 insertions(+), 1 deletion(-)
+
+commit cef6ac0ebbf8451beaadb3ddb6c991bbb7239432
+Author: Fabio D'Urso <fabiodurso@hotmail.it>
+Date:   Sun Apr 8 23:15:15 2012 +0200
+
+    FIX: Do not append a NUL character to Unicode page labels
+
+ poppler/PageLabelInfo.cc |    3 +--
+ 1 file changed, 1 insertion(+), 2 deletions(-)
+
+commit 3d4985f14e54ddcc64ea654b23e931b7e6acfbdc
+Author: Fabio D'Urso <fabiodurso@hotmail.it>
+Date:   Sat Apr 7 11:28:36 2012 +0200
+
+    Do not trust the rect of AnnotTextMarkup when drawing
+
+ poppler/Annot.cc |   43 +++++++++++++++++++++++++++++--------------
+ 1 file changed, 29 insertions(+), 14 deletions(-)
+
+commit c6296cd8c1ca398beac20f1e88c87b9082386247
+Author: Fabio D'Urso <fabiodurso@hotmail.it>
+Date:   Sat Apr 7 00:30:54 2012 +0200
+
+    Do not trust the rect of AnnotLine, AnnotPolygon and AnnotInk
+    when drawing
+
+ poppler/Annot.cc |  126
+ +++++++++++++++++++++++++++++++++++++++++++-----------
+ poppler/Annot.h  |   27 ++++++++++++
+ 2 files changed, 128 insertions(+), 25 deletions(-)
+
+commit 503620ae74d719da52e3374725e490c62f7be7a3
+Author: Fabio D'Urso <fabiodurso@hotmail.it>
+Date:   Thu Mar 29 19:07:05 2012 +0200
+
+    Do not recreate Annots when writing to PS, Export poppler-generated
+    Annot appearance resource dict
+
+    1) With previous code each Annot object was reconstructed from the
+    pdf object when
+    writing to PS, leading to the fact that writeDocSetup couldn't see the
+    generated appearance.
+    This patch makes writeDocSetup use the same Annots object returned by
+    Page::getAnnots.
+
+    2) This patch also enables each Annot subtype to control the exported
+    resources. AnnotFreeText uses this new method to export font
+    information.
+
+    3) Comment fixed in Page.h: Page::getAnnots does *not* give away
+    ownership, in
+    fact the returned object is destroyed by ~Page.
+
+ poppler/Annot.cc       |   28 ++++++++++++++++++++++++++++
+ poppler/Annot.h        |    5 +++--
+ poppler/FontInfo.cc    |   11 ++++-------
+ poppler/PSOutputDev.cc |   12 +++---------
+ poppler/Page.h         |    2 +-
+ 5 files changed, 39 insertions(+), 19 deletions(-)
+
+commit 2733504890333b0925d95e01310726d11fed44d8
+Author: Fabio D'Urso <fabiodurso@hotmail.it>
+Date:   Fri Mar 23 20:54:58 2012 +0100
+
+    Basic AnnotFreeText rendering (hardcoded font, WinAnsi characters
+    only)
+
+    This patch also moves layoutText and writeString from AnnotWidget
+    to Annot
+
+ poppler/Annot.cc |  137
+ +++++++++++++++++++++++++++++++++++++++++++++++++++++-
+ poppler/Annot.h  |   11 +++--
+ 2 files changed, 142 insertions(+), 6 deletions(-)
+
+commit 3023a59c0a1a5974b232f6f8cb629eabb6797616
+Author: Fabio D'Urso <fabiodurso@hotmail.it>
+Date:   Sun Mar 25 22:04:11 2012 +0200
+
+    AnnotTextMarkup rendering improvements
+
+    1) FIX: Wrong coords in typeUnderline and typeStrikeout
+    2) Implementation of typeSquiggly
+    3) FIX: Form creation is common to all markup types
+
+ poppler/Annot.cc |   92
+ +++++++++++++++++++++++++++++++++---------------------
+ 1 file changed, 56 insertions(+), 36 deletions(-)
+
+commit 8927ddc448edc016043107e88e3bc3b2b8b03269
+Author: Fabio D'Urso <fabiodurso@hotmail.it>
+Date:   Thu Mar 22 17:33:01 2012 +0100
+
+    Improvements to AnnotLine::draw
+
+ poppler/Annot.cc |   50
+ ++++++++++++++++++++++++++++++++++++++++++++++----
+ 1 file changed, 46 insertions(+), 4 deletions(-)
+
+commit bd7a40fd0312c753d1871558b566376304f1ff35
+Author: Fabio D'Urso <fabiodurso@hotmail.it>
+Date:   Wed Mar 21 22:48:05 2012 +0100
+
+    AnnotInk rendering
+
+ poppler/Annot.cc |   62
+ ++++++++++++++++++++++++++++++++++++++++++++++++++++++
+ poppler/Annot.h  |    2 ++
+ 2 files changed, 64 insertions(+)
+
+commit 6a8794abe639db8284db079e028cbcd66e138884
+Author: Fabio D'Urso <fabiodurso@hotmail.it>
+Date:   Wed Mar 21 22:33:13 2012 +0100
+
+    AnnotPolygon rendering
+
+ poppler/Annot.cc |   87
+ ++++++++++++++++++++++++++++++++++++++++++++++++++++++
+ poppler/Annot.h  |    2 ++
+ 2 files changed, 89 insertions(+)
+
+commit f389c50458079f24164b1c12b1151c8617485acb
+Author: Fabio D'Urso <fabiodurso@hotmail.it>
+Date:   Wed Mar 21 21:12:59 2012 +0100
+
+    Do not fill AnnotGeometry with transparent color
+
+    Previously it was filled with black.
+
+ poppler/Annot.cc |    2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit c63cc22dd82f827305ad57f241ad49998f2a1c23
+Author: Albert Astals Cid <aacid@kde.org>
+Date:   Sun Apr 8 12:28:17 2012 +0200
+
+    Remove extra copy() (memleak)
+
+ poppler/GlobalParams.cc |    3 +--
+ 1 file changed, 1 insertion(+), 2 deletions(-)
+
+commit ed0c9640abcbea459e3a276ee0b27631b01c32c4
+Author: Albert Astals Cid <aacid@kde.org>
+Date:   Sun Apr 8 12:24:20 2012 +0200
+
+    Do not crash if mallocing too much memory
+
+    Fixes crash in
+    https://ritdml.rit.edu/bitstream/handle/1850/11220/TYehThesis1992.pdf?sequence=1
+    even though the page is still unrendered
+
+ poppler/JBIG2Stream.cc |    9 +++++++--
+ 1 file changed, 7 insertions(+), 2 deletions(-)
+
+commit f1e621adbbb74ec709022b2a31195331651c83fa
+Author: Adrian Johnson <ajohnson@redneon.com>
+Date:   Sun Apr 8 19:42:05 2012 +0930
+
+    cairo: use correct userfont font bbox
+
+    cairo 1.12 started clipping text to the font bbox
+
+    Bug 48399
+
+ poppler/CairoFontEngine.cc |   24 ++++++++++++++++++++++++
+ 1 file changed, 24 insertions(+)
+
+commit f5b708c3e04ba50756cd9f9530cf82f547443ce9
+Author: Suzuki Toshiya <mpsuzuki@hiroshima-u.ac.jp>
+Date:   Fri Apr 6 15:22:36 2012 +0200
+
+    ttc<->ttf fallback is expected for CJK font list in GlobalParamsWin.cc
+
+    Bug 48046
+
+ poppler/GlobalParamsWin.cc |  224
+ +++++++++++++++++++++++++-------------------
+ 1 file changed, 128 insertions(+), 96 deletions(-)
+
+commit 4e940b14a6fddde9a1714976ff8045e26cbf7d40
+Author: Adrian Johnson <ajohnson@redneon.com>
+Date:   Mon Apr 2 20:03:11 2012 +0930
+
+    cairo: fix regression caused by mesh gradients
+
+ poppler/CairoOutputDev.cc |    6 ++++--
+ 1 file changed, 4 insertions(+), 2 deletions(-)
+
+commit 74a7d963de75c0097eedcf4224d13cf275a64757
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:   Sun Apr 1 19:35:48 2012 +0200
+
+    regtest: remove debug print to show bisect exit status in Bisect.py
+
+ regtest/Bisect.py |    1 -
+ 1 file changed, 1 deletion(-)
+
+commit 2749db77eb8ccdbc4b0771163c8942f882f259f4
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:   Sun Apr 1 19:20:37 2012 +0200
+
+    regtest: Fix crash when creating HTML report for a single test
+
+ regtest/commands/create-report.py |    5 +----
+ 1 file changed, 1 insertion(+), 4 deletions(-)
+
+commit 1c8e1bb637347d0d31945f9d265b29e7b49396e2
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:   Sun Apr 1 19:11:57 2012 +0200
+
+    regtest: Don't show results for crashed or failed to run tests in
+    HTML report
+
+ regtest/HTMLReport.py |    2 ++
+ 1 file changed, 2 insertions(+)
+
+commit a5f4936dfb3e60ca37f932cc066aa10765f3cbc9
+Author: Fabio D'Urso <fabiodurso@hotmail.it>
+Date:   Sat Mar 24 23:13:48 2012 +0100
+
+    Fix: annotDisplayDecideCbk was not propagated
+
+ poppler/OutputDev.h    |    6 +++++-
+ poppler/PSOutputDev.cc |   11 ++++++++---
+ poppler/PSOutputDev.h  |    5 ++++-
+ poppler/Page.cc        |    3 ++-
+ utils/HtmlOutputDev.h  |    5 ++++-
+ 5 files changed, 23 insertions(+), 7 deletions(-)
+
+commit aab8c9a026f781da47ecedd453e225f906361444
+Author: Albert Astals Cid <aacid@kde.org>
+Date:   Thu Mar 29 21:49:38 2012 +0200
+
+    Increase version
+
+ CMakeLists.txt      |    4 ++--
+ configure.ac        |    2 +-
+ cpp/Doxyfile        |    2 +-
+ poppler/Makefile.am |    2 +-
+ qt4/src/Doxyfile    |    2 +-
+ 5 files changed, 6 insertions(+), 6 deletions(-)
+
+commit f7e65b62480631d0485167a81a588a176630dd8d
+Author: Albert Astals Cid <aacid@kde.org>
+Date:   Thu Mar 29 21:48:11 2012 +0200
+
+    0.19.2 news
+
+ NEWS |   23 ++++++++++++++++++++++-
+ 1 file changed, 22 insertions(+), 1 deletion(-)
+
+commit 627e072eb1edbfabf549656e9abf10100ed7340c
+Author: Albert Astals Cid <aacid@kde.org>
+Date:   Thu Mar 29 21:40:13 2012 +0200
+
+    Update copyrights
+
+ poppler/TextOutputDev.cc |    1 +
+ 1 file changed, 1 insertion(+)
+
+commit e9ad888b003d343d8ca60f044c7cf10a8df81cf4
+Author: Albert Astals Cid <aacid@kde.org>
+Date:   Thu Mar 29 19:49:34 2012 +0200
+
+    Add quotes to the poppler version define
+
+ poppler/poppler-config.h.cmake |    2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 8172bb03b6e8f1c16e1a152fb251b10446f54129
+Author: Peter Breitenlohner <peb@mppmu.mpg.de>
+Date:   Mon Mar 26 11:13:34 2012 +0200
+
+    define POPPLER_VERSION as C string
+
+    Signed-off-by: Peter Breitenlohner <peb@mppmu.mpg.de>
+
+ configure.ac |    2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 4a38d933d06d189317b1b9028c3fa4ae2a1551af
+Author: Suzuki Toshiya <mpsuzuki@hiroshima-u.ac.jp>
+Date:   Thu Mar 29 19:34:25 2012 +0200
+
+    per-collection fallback for missing CID-keyed fonts on Win32
+
+ poppler/GlobalParamsWin.cc |   38 ++++++++++++++++++++++++++++++++++----
+ 1 file changed, 34 insertions(+), 4 deletions(-)
+
+commit a0b3e0938e08847d10c5d7b7528c7c5d43a7a3b8
+Author: Hib Eris <hib@hiberis.nl>
+Date:   Thu Mar 29 07:52:30 2012 +0200
+
+    Fix help message
+
+    Partial credit goes to suzuki toshiya <mpsuzuki@hiroshima-u.ac.jp>
+
+ configure.ac |    4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 631224dc0c721119c91984f1940c9e51edf17eca
+Author: Fabio D'Urso <fabiodurso@hotmail.it>
+Date:   Tue Mar 20 00:56:50 2012 +0100
+
+    Annotation removal
+
+ poppler/Annot.cc |   17 +++++++++++++++++
+ poppler/Annot.h  |    1 +
+ poppler/Page.cc  |   36 ++++++++++++++++++++++++++++++++++++
+ poppler/Page.h   |    3 +++
+ 4 files changed, 57 insertions(+)
+
+commit 20476370a445a26f1fae9db6ad58727ee3c63550
+Author: Fabio D'Urso <fabiodurso@hotmail.it>
+Date:   Wed Mar 28 23:16:37 2012 +0200
+
+    Basic support for Annot appearance stream removal and invalidation
+
+ poppler/Annot.cc |  190
+ ++++++++++++++++++++++++++++++++++++++++--------------
+ poppler/Annot.h  |   29 +++++++--
+ 2 files changed, 168 insertions(+), 51 deletions(-)
+
+commit e9a066c3a53cc1cb73dd43a243390ae4e3c76ca3
+Author: Albert Astals Cid <aacid@kde.org>
+Date:   Wed Mar 28 23:33:37 2012 +0200
+
+    Fix another typo in macGlyphNames
+
+ fofi/FoFiTrueType.cc |    4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 3d277b230e806a648fcc6d9e7af39370aa89c2ae
+Author: Adrian Johnson <ajohnson@redneon.com>
+Date:   Sat Feb 18 09:19:51 2012 +1030
+
+    Fix typo in "mu" glyph name in truetype 'post' table standard mac
+    ordering
+
+    The standard mac ordering table is at:
+
+    https://developer.apple.com/fonts/ttrefman/rm06/Chap6post.html
+
+ fofi/FoFiTrueType.cc |    3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+commit 47b910d35b2cf5914ed4c07f751c5e8c304be7fc
+Author: suzuki toshiya <mpsuzuki@hiroshima-u.ac.jp>
+Date:   Wed Mar 28 20:21:44 2012 +0200
+
+    Add quotes
+
+    this is quite small fix. In poppler's configure, basically the shell
+    variables are not enclosed, and not quoted, aslike
+            if test x$use_glib = x; then
+    This syntax make the test command confused when use_glib is multi-word
+    value, as, "no (required cairo output)". In such case, test cannot
+    know
+    how to evaluate the token "no" "(required" "cairo", so some "syntax
+    error"
+    messages are given. Thus, quoting of the variable would be safer.
+
+ configure.ac |    4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 78224609f6c1d87deee72b60a8f8f9f6c36ac75f
+Author: Albert Astals Cid <aacid@kde.org>
+Date:   Wed Mar 28 20:21:11 2012 +0200
+
+    Workaround Windows problem with libjpeg
+
+    In libjpeg6b, there is a type definition conflict issue in jmorecfg.h.
+    jmorecfg.h typedefs INT16 as short, INT32 as long. The latter conflict
+    with basetsd.h of Microsoft Windows SDK or MinGW that typedefs INT32
+    as int. basetsd.h is included by windows.h, so, if the users work with
+    ANSI C features only, the conflict does not appear, it would be the
+    background why such fundamental error has been preserved.
+    Anyway, jmorecfg.h designer was aware about the conflict with
+    X11 headers
+    (Xmd.h defines INT16, INT32, etc), so if we pretend as if Xmd.h were
+    included (by defining XMD_H), this issue can be bypassed. Attached
+    patch
+    checks the conflict, then, if there is a conflict, tries XMD_H
+    trick, and
+    uses it if it works. If jmorecfg.h or basetsd.h was manually fixed to
+    prevent this issue, this trick is not used.
+
+ configure.ac |   42 ++++++++++++++++++++++++++++++++++++++++++
+ 1 file changed, 42 insertions(+)
+
+commit d8cf31f8c7e190939525ad68cd4617fb48fea60e
+Author: suzuki toshiya <mpsuzuki@hiroshima-u.ac.jp>
+Date:   Wed Mar 28 20:20:43 2012 +0200
+
+    update Makefile.am to reflect LIBJPEG_CFLAGS, LIBTIFF_CFLAGS,
+    LIBPNG_CFLAGS for related sources.
+
+ goo/Makefile.am     |   15 +++++++++++++++
+ poppler/Makefile.am |    6 ++++++
+ splash/Makefile.am  |   16 ++++++++++++++++
+ utils/Makefile.am   |    6 ++++++
+ 4 files changed, 43 insertions(+)
+
+commit f0c13f5efc641c63627b8f0b0815b6b511d8d196
+Author: suzuki toshiya <mpsuzuki@hiroshima-u.ac.jp>
+Date:   Wed Mar 28 20:20:06 2012 +0200
+
+    Configure improvements for libs in non default paths
+
+    evaluate pkg-config-like environmental variables like LIBJPEG_CFLAGS,
+    LIBJPEG_LIBS, LIBTIFF_CFLAGS and LIBTIFF_LIBS in configuration.
+
+ configure.ac |   50 ++++++++++++++++++++++++++++++++++++++++++++------
+ 1 file changed, 44 insertions(+), 6 deletions(-)
+
+commit e55f485d803cb1f82e0d8a53d1998e1887c7920f
+Author: suzuki toshiya <mpsuzuki@hiroshima-u.ac.jp>
+Date:   Wed Mar 28 20:19:08 2012 +0200
+
+    Improve m4/libjpeg.m4
+
+    m4/libjpeg.m4 uses USER_INCLUDES and USER_LDFLAGS in it, but
+    USER_INCLUDES is not reflected when jpeglib.h is searched.
+    this patch modifies m4/libjpeg.m4 to reflect USER_INCLUDES
+    when jpeglib.h is searched.
+
+ m4/libjpeg.m4 |    6 ++++++
+ 1 file changed, 6 insertions(+)
+
+commit e88c17d45220eea60a3dd7fab26a067616388c5f
+Author: Albert Astals Cid <aacid@kde.org>
+Date:   Wed Mar 28 20:05:45 2012 +0200
+
+    Fix compile in windows
+
+ poppler/GlobalParamsWin.cc |   35 ++++++++++++++++++++++++++++++-----
+ 1 file changed, 30 insertions(+), 5 deletions(-)
+
+commit ee0eaabe24019d2af226ef03e3f456787525e040
+Author: Fabio D'Urso <fabiodurso@hotmail.it>
+Date:   Mon Mar 19 00:05:49 2012 +0100
+
+    Added Array::remove (and Object::arrayRemove)
+
+ poppler/Array.cc |   13 +++++++++++++
+ poppler/Array.h  |    4 ++++
+ poppler/Object.h |    5 +++++
+ 3 files changed, 22 insertions(+)
+
+commit d6a1b7dcaeac1e49533519b9f8a279fd64d04c67
+Author: Thomas Freitag <Thomas.Freitag@alfa.de>
+Date:   Tue Mar 27 00:00:05 2012 +0200
+
+    Some regression fixes/improvements
+
+    I just finished the patch for these regressions, they had differents
+    reasons
+    1. In CharCodeToUnicode::mapToUnicode the identity support was missing
+    2. The new algorithms for axial and radial shading caused problems in
+    cairo. I revert these changes but removed the examination of hidden
+    content (this is already done in the calling function)
+    3. The examination of optional hidden content in showing text
+    was wrong:
+    of course hidden text should not be shown, but text parameters
+    like text
+    position in the state must be changed!
+    4. Searching and finding fonts especially with base14 fonts should be
+    more exact than just looking at the base14 name (i.e. fixed width
+    and so
+    on) when using fontconfig. I implement that to find the best font
+    fitting to the needs.
+
+ poppler/CharCodeToUnicode.cc |    5 +
+ poppler/Gfx.cc               |  329
+ +++++++++++++++++++-----------------------
+ poppler/GfxFont.cc           |    3 +-
+ poppler/GlobalParams.cc      |   78 +++++++---
+ poppler/GlobalParams.h       |    6 +-
+ 5 files changed, 218 insertions(+), 203 deletions(-)
+
+commit a5257efe00d0fe850b1abe5c552f7581027ac64c
+Author: Fabio D'Urso <fabiodurso@hotmail.it>
+Date:   Mon Mar 26 19:28:55 2012 +0200
+
+    Re-added forceRasterize to PSOutputDev (and qt4 fix too)‏
+
+    The patch restores the forceRasterize argument in PSOutputDev ctors.
+    Commit 6ee907f291427b8751a872b31210bf32e8d2b722 had removed it,
+    turning it
+    into a global param.
+    As a side effect, this patch also fixes qt4/poppler-ps-converter,
+    which had
+    not been updated to the new signature, and thus produced corrupted
+    output if
+    forceRasterization was set.
+
+ glib/poppler-page.cc    |    2 +-
+ poppler/GlobalParams.cc |   16 ----------------
+ poppler/GlobalParams.h  |    3 ---
+ poppler/PSOutputDev.cc  |    6 +++++-
+ poppler/PSOutputDev.h   |    3 +++
+ 5 files changed, 9 insertions(+), 21 deletions(-)
+
+commit 55d039ada063a9427de6dd59846ce1570ab26e9f
+Author: Suzuki Toshiya <mpsuzuki@hiroshima-u.ac.jp>
+Date:   Mon Mar 26 22:31:29 2012 +0200
+
+    CJK improvements
+
+    More info in the mailing list threads
+     * script names for vertical writing mode should be differentiated
+     for CJK
+     * 2 workarounds for a Korean font on Microsoft Windows
+
+ fofi/FoFiTrueType.cc |   47
+ ++++++++++++++++++++++++++++++++++++-----------
+ fofi/FoFiTrueType.h  |    8 +++++++-
+ poppler/GfxFont.cc   |   14 ++++++++------
+ 3 files changed, 51 insertions(+), 18 deletions(-)
+
+commit a8b0fa4d07480242afba7751995e38eaf3147ac5
+Author: Horst Prote <prote@fmi.uni-stuttgart.de>
+Date:   Mon Mar 26 21:04:32 2012 +1030
+
+    don't add newline to last line extracted by TextSelectionDumper
+
+    Bug 45955
+
+ poppler/TextOutputDev.cc |    4 +++-
+ 1 file changed, 3 insertions(+), 1 deletion(-)
+
+commit c40e2315cd796ba928969d13a761f5f19d8438fc
+Author: Adrian Johnson <ajohnson@redneon.com>
+Date:   Fri Mar 23 21:49:42 2012 +1030
+
+    cairo: use a transparency group with
+    setSoftMaskFromImageMask/unsetSoftMaskFromImageMask
+
+    Drawing a tiling pattern between setSoftMaskFromImageMask and
+    unsetSoftMaskFromImageMask clears the softmask.
+
+    Similar to Splash, create a transparency group in
+    setSoftMaskFromImageMask. Pop and paint the group in
+    unsetSoftMaskFromImageMask. The saveState/restoreState is to ensure
+    the softmask is restored before painting the group.
+
+    Bug 47739
+
+ poppler/CairoOutputDev.cc |   16 ++++++++++++++++
+ 1 file changed, 16 insertions(+)
+
+commit 7b57afea2e433fc7b6f359a62b1289f0e1da3267
+Author: Adrian Johnson <ajohnson@redneon.com>
+Date:   Sat Mar 24 08:27:34 2012 +1030
+
+    cairo: update cairo mesh pattern to 1.12 api
+
+    Now that a stable version of cairo with mesh gradient support is
+    released update poppler to use this api.
+
+ poppler/CairoOutputDev.cc |   40 ++++++++++++++++++++--------------------
+ poppler/CairoOutputDev.h  |    4 ++--
+ 2 files changed, 22 insertions(+), 22 deletions(-)
+
+commit 2f156b34fc8755ddd2a32cac830f3073d6b2c481
+Author: Suzuki Toshiya <mpsuzuki@hiroshima-u.ac.jp>
+Date:   Fri Mar 23 20:00:18 2012 +0100
+
+    Fix compile in mingw-gcc
+
+ poppler/GlobalParamsWin.cc |    3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+commit 06b6db92dd1ec32f9a55347073f8b533aa074ee1
+Author: Fabio D'Urso <fabiodurso@hotmail.it>
+Date:   Sun Mar 18 23:58:05 2012 +0100
+
+    Added XRef::removeIndirectObject
+
+ poppler/PDFDoc.cc |   15 ++++++++++-----
+ poppler/XRef.cc   |   15 +++++++++++++++
+ poppler/XRef.h    |    2 ++
+ 3 files changed, 27 insertions(+), 5 deletions(-)
+
+commit a2e9b7c02ffa0e5edc4da18cc726993bc92fc684
+Author: Fabio D'Urso <fabiodurso@hotmail.it>
+Date:   Mon Mar 19 19:17:09 2012 +0100
+
+    Fix in AnnotMarkup's popup window handling
+
+    AnnotPopup's ref was previously set to the *parent* annot, now
+    it's correctly
+    set to the *popup* annot's own.
+
+ poppler/Annot.cc |    6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
+
+commit 05641304df67beae546a2fe18071f3be52707aa8
+Author: Fabio D'Urso <fabiodurso@hotmail.it>
+Date:   Mon Mar 19 20:56:45 2012 +0100
+
+    Basic Annot border editing support
+
+ poppler/Annot.cc |   23 +++++++++++++++++++++++
+ poppler/Annot.h  |    9 +++++++++
+ 2 files changed, 32 insertions(+)
+
+commit 3e6275a05066c152b265cc27275d9e4107c089e9
+Author: Fabio D'Urso <fabiodurso@hotmail.it>
+Date:   Fri Mar 16 21:47:02 2012 +0100
+
+    Yet new setters to AnnotFreeText
+
+ poppler/Annot.cc |   45 +++++++++++++++++++++++++++++++++++++++++++++
+ poppler/Annot.h  |    2 ++
+ 2 files changed, 47 insertions(+)
+
+commit f69f41056fc8cd8a70b38024f255e9074af20bdc
+Author: Pino Toscano <pino@kde.org>
+Date:   Tue Mar 20 15:18:33 2012 +0100
+
+    cmake: reset CMAKE_REQUIRED_INCLUDES/CMAKE_REQUIRED_LIBRARIES
+
+ cmake/modules/FindLIBOPENJPEG.cmake |    3 +++
+ 1 file changed, 3 insertions(+)
+
+commit 4a9238441a5317c3304296e4e6430cccefe8322c
+Author: Ihar Filipau <thephilips@gmail.com>
+Date:   Fri Mar 16 00:07:45 2012 +0100
+
+    Flip images if they need to
+
+    Bug 32340
+
+ utils/HtmlOutputDev.cc |   50
+ ++++++++++++++++++++++++++++++++++++++++++++++--
+ 1 file changed, 48 insertions(+), 2 deletions(-)
+
+commit 6d68d0d3acc8c8e0d9d310b2e1ba2b07d6bfe942
+Author: Ihar Filipau <thephilips@gmail.com>
+Date:   Thu Mar 15 22:56:10 2012 +0100
+
+    pdftohtml: extract mask images even if they are not JPEG
+
+    Bug #47186
+
+ utils/HtmlOutputDev.cc |  203
+ ++++++++++++++++++++++++++++++------------------
+ utils/HtmlOutputDev.h  |    3 +
+ 2 files changed, 131 insertions(+), 75 deletions(-)
+
+commit 60155e0fc7224a6b479bf62133f72c460fe48078
+Author: Albert Astals Cid <aacid@kde.org>
+Date:   Thu Mar 15 20:46:53 2012 +0100
+
+    Install poppler-media.h
+
+ qt4/src/Makefile.am |    1 +
+ 1 file changed, 1 insertion(+)
+
+commit 6a173844d5ca6f32e188406ab14cae6a7548fc1d
+Author: Albert Astals Cid <aacid@kde.org>
+Date:   Thu Mar 15 20:44:12 2012 +0100
+
+    Add the export
+
+ qt4/src/poppler-media.h |    5 ++++-
+ 1 file changed, 4 insertions(+), 1 deletion(-)
+
+commit e401f8e6ba3e18d5a3a4920cd111b2174c75f415
+Author: Albert Astals Cid <aacid@kde.org>
+Date:   Thu Mar 15 20:32:12 2012 +0100
+
+    Increase version and sonames
+
+ CMakeLists.txt         |    4 ++--
+ configure.ac           |    2 +-
+ cpp/Doxyfile           |    2 +-
+ glib/CMakeLists.txt    |    2 +-
+ glib/Makefile.am       |    2 +-
+ poppler/Makefile.am    |    2 +-
+ qt4/src/CMakeLists.txt |    2 +-
+ qt4/src/Doxyfile       |    2 +-
+ qt4/src/Makefile.am    |    2 +-
+ 9 files changed, 10 insertions(+), 10 deletions(-)
+
+commit ce059698e8c5097f75e7a0f828af0936aa104af0
+Author: Albert Astals Cid <aacid@kde.org>
+Date:   Thu Mar 15 20:27:45 2012 +0100
+
+    0.19.1 news
+
+    Also inclusing 0.18.x ones
+
+ NEWS |  110
+ ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+ 1 file changed, 110 insertions(+)
+
+commit 2041d5721871adb2a23999c16ecbdc60abb7b1c4
+Author: Albert Astals Cid <aacid@kde.org>
+Date:   Thu Mar 15 20:20:31 2012 +0100
+
+    Update C years
+
+ poppler/CMap.h       |    1 +
+ poppler/GfxFont.h    |    2 +-
+ poppler/Rendition.cc |    1 +
+ 3 files changed, 3 insertions(+), 1 deletion(-)
+
+commit 95d684aa2a87d01296f5e93516f2ac3f54adbec8
+Author: Guillermo Amaral <gamaral@kde.org>
+Date:   Thu Mar 15 20:13:20 2012 +0100
+
+    Remove the QIODevice and go with a not so good but more safer
+    QByteArray
+
+    Bug #47336
+
+ qt4/src/CMakeLists.txt                           |    1 -
+ qt4/src/Makefile.am                              |    1 -
+ qt4/src/poppler-media.cc                         |   35 +++++++++-----
+ qt4/src/poppler-media.h                          |    4 +-
+ qt4/src/poppler-page.cc                          |    1 -
+ qt4/src/poppler-streamsequentialdevice-private.h |   51
+ --------------------
+ qt4/src/poppler-streamsequentialdevice.cc        |   56
+ ----------------------
+ 7 files changed, 26 insertions(+), 123 deletions(-)
+
+commit 9fee12f9bee7252db0974ef69870b69ff1452053
+Author: Albert Astals Cid <aacid@kde.org>
+Date:   Thu Mar 15 19:23:47 2012 +0100
+
+    Compile++
+
+ qt4/src/Makefile.am |    2 ++
+ 1 file changed, 2 insertions(+)
+
+commit aa1e6d12d063a64a22841f7996101b45aa680ec7
+Author: Guillermo Amaral <gamaral@kdab.com>
+Date:   Thu Mar 15 00:35:31 2012 +0100
+
+    Added media rendition support for Qt4
+
+ qt4/src/CMakeLists.txt                           |    3 +
+ qt4/src/poppler-annotation.cc                    |   66 ++++++++++
+ qt4/src/poppler-annotation.h                     |   47 ++++++-
+ qt4/src/poppler-link.cc                          |   44 +++++++
+ qt4/src/poppler-link.h                           |   38 +++++-
+ qt4/src/poppler-media.cc                         |  149
+ ++++++++++++++++++++++
+ qt4/src/poppler-media.h                          |   94 ++++++++++++++
+ qt4/src/poppler-page.cc                          |   32 ++++-
+ qt4/src/poppler-qt4.h                            |    2 +
+ qt4/src/poppler-streamsequentialdevice-private.h |   51 ++++++++
+ qt4/src/poppler-streamsequentialdevice.cc        |   56 ++++++++
+ 11 files changed, 579 insertions(+), 3 deletions(-)
+
+commit 258e2197afa49e60b0b13a05408fc8d484dd8147
+Author: Fabio D'Urso <fabiodurso@hotmail.it>
+Date:   Wed Mar 14 23:25:00 2012 +0100
+
+    Added some new setters to AnnotFreeText
+
+ poppler/Annot.cc |   39 +++++++++++++++++++++++++++++++++++++++
+ poppler/Annot.h  |    4 ++++
+ 2 files changed, 43 insertions(+)
+
+commit 84a62ac157e03880c1c1eda60c3927bd4414640e
+Author: Fabio D'Urso <fabiodurso@hotmail.it>
+Date:   Wed Mar 14 23:24:28 2012 +0100
+
+    Added some new setters to AnnotGeometry, AnnotInk and AnnotCaret
+
+ poppler/Annot.cc |  116
+ ++++++++++++++++++++++++++++++++++++++++--------------
+ poppler/Annot.h  |   10 +++++
+ 2 files changed, 96 insertions(+), 30 deletions(-)
+
+commit 233c9a097bdc382f6a2eb6319ee15528c72e9632
+Author: Fabio D'Urso <fabiodurso@hotmail.it>
+Date:   Wed Mar 14 23:23:59 2012 +0100
+
+    Added some new setters to AnnotTextMarkup and AnnotStamp
+
+ poppler/Annot.cc |   61
+ ++++++++++++++++++++++++++++++++++++++++++++++++++++++
+ poppler/Annot.h  |   11 ++++++++--
+ 2 files changed, 70 insertions(+), 2 deletions(-)
+
+commit 8fb3ac6cf66233b80959ba99a2c706111050f5f1
+Author: Fabio D'Urso <fabiodurso@hotmail.it>
+Date:   Wed Mar 14 23:23:23 2012 +0100
+
+    Added Page::getDoc()
+
+ poppler/Page.h |    2 ++
+ 1 file changed, 2 insertions(+)
+
+commit dc4cb07c1e735006d5168e0e65f5143d7fc53e12
+Author: Fabio D'Urso <fabiodurso@hotmail.it>
+Date:   Wed Mar 14 23:22:10 2012 +0100
+
+    Added some new setters to AnnotLine and AnnotPolygon
+
+ poppler/Annot.cc |  201
+ ++++++++++++++++++++++++++++++++++++++++++++++++++++--
+ poppler/Annot.h  |   16 +++++
+ 2 files changed, 211 insertions(+), 6 deletions(-)
+
+commit 4931018eecc37dbbe0df1a456347ab200f1b057a
+Author: Fabio D'Urso <fabiodurso@hotmail.it>
+Date:   Wed Mar 14 23:21:07 2012 +0100
+
+    Make Dict::set remove the entry if object is Null
+
+ poppler/Dict.cc |    5 +++++
+ 1 file changed, 5 insertions(+)
+
+commit 13ac2c0bed3fa5515a3c068488cb6a0b17410a97
+Author: Fabio D'Urso <fabiodurso@hotmail.it>
+Date:   Wed Mar 14 23:20:13 2012 +0100
+
+    Added some new setters to Annot and AnnotMarkup
+
+ poppler/Annot.cc |   94
+ ++++++++++++++++++++++++++++++++++++++++++++++++++----
+ poppler/Annot.h  |    8 +++++
+ 2 files changed, 96 insertions(+), 6 deletions(-)
+
+commit aa2b5ffa7961aac0aea33ae9a42bf1f38a756b1b
+Author: Pino Toscano <pino@kde.org>
+Date:   Wed Mar 14 16:25:35 2012 +0100
+
+    qt4: replace ObjectReference with simplier Ref
+
+    instead of roll out a new (still private) version of Ref, just use
+    it for private annotation and link data;
+    this needed a couple of explicit initializations of Ref (since it's
+    a simple struct with no methods) and a private operator== for it
+
+ qt4/src/CMakeLists.txt               |    1 -
+ qt4/src/poppler-annotation-private.h |    4 +-
+ qt4/src/poppler-annotation.cc        |    1 +
+ qt4/src/poppler-link.cc              |   16 +++---
+ qt4/src/poppler-link.h               |    5 +-
+ qt4/src/poppler-objectreference.cc   |   89
+ ----------------------------------
+ qt4/src/poppler-objectreference_p.h  |   77 -----------------------------
+ qt4/src/poppler-page.cc              |    7 ++-
+ 8 files changed, 21 insertions(+), 179 deletions(-)
+
+commit e5b914b2bfbb5e95ecde5f1ce148374b1d58dadd
+Author: Ihar Filipau <thephilips@gmail.com>
+Date:   Tue Mar 13 23:54:26 2012 +0100
+
+    Add possibilty of controlling word breaks percentage
+
+    Bug #47022
+
+ utils/HtmlOutputDev.cc |    7 +++++--
+ utils/pdftohtml.1      |    5 +++++
+ utils/pdftohtml.cc     |    7 +++++++
+ 3 files changed, 17 insertions(+), 2 deletions(-)
+
+commit 4388cb69114e406ec29e8b6976d1a900e4ab1b7d
+Author: Albert Astals Cid <aacid@kde.org>
+Date:   Sun Mar 11 23:37:39 2012 +0100
+
+    Make doUpdateFont protected
+
+    So that people inheriting from SplashOutputDev *yuck* can use it
+    more easily
+    Bug 46622
+
+ poppler/SplashOutputDev.h |    5 ++++-
+ 1 file changed, 4 insertions(+), 1 deletion(-)
+
+commit 448cfc431b7067af38da51e725ac0f1b2a0bc8f8
+Author: Tobias Koenig <tokoe@kdab.com>
+Date:   Sun Mar 11 23:22:18 2012 +0100
+
+    support for LinkMovie object in Qt4 frontend
+
+    Bug #40561
+
+ qt4/src/CMakeLists.txt               |    1 +
+ qt4/src/poppler-annotation-private.h |    4 ++
+ qt4/src/poppler-annotation.h         |    4 ++
+ qt4/src/poppler-link.cc              |   42 ++++++++++++----
+ qt4/src/poppler-link.h               |   43 ++++++++++++++--
+ qt4/src/poppler-objectreference.cc   |   89
+ ++++++++++++++++++++++++++++++++++
+ qt4/src/poppler-objectreference_p.h  |   77 +++++++++++++++++++++++++++++
+ qt4/src/poppler-page.cc              |   39 +++++++++++----
+ 8 files changed, 276 insertions(+), 23 deletions(-)
+
+commit a0d151deabf8243c98ff9953f8a43bb56fbf95a9
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:   Sun Mar 11 16:05:15 2012 +0100
+
+    regtest: Add find-regression command to run git bisect automatically
+
+ regtest/Bisect.py                   |  113
+ +++++++++++++++++++++++++++++++++++
+ regtest/builder/__init__.py         |   86 ++++++++++++++++++++++++++
+ regtest/builder/autotools.py        |   63 +++++++++++++++++++
+ regtest/commands/find-regression.py |   77 ++++++++++++++++++++++++
+ 4 files changed, 339 insertions(+)
+
+commit 856768c380ecea30ce9727b81c4c44b4f9489626
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:   Sat Mar 10 18:15:58 2012 +0100
+
+    regtest: Add information about skipped tests in the summary
+
+ regtest/TestRun.py |   12 +++++++++---
+ 1 file changed, 9 insertions(+), 3 deletions(-)
+
+commit 508c7c3ef1f22459daa822f8287cab382119e753
+Author: Tobias Koenig <tobias.koenig@kdab.com>
+Date:   Wed Mar 7 18:35:05 2012 +0100
+
+    Fix logic error in Rendition parsing code
+
+    Make the rendition object invalid when both P an C entries are not
+    present or are invalid in Media Rendition dictionary.
+
+    https://bugs.freedesktop.org/show_bug.cgi?id=47063
+
+ poppler/Rendition.cc |    2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 68625258ab3cfc3e8e10a727e397f80bed0d1f5c
+Author: Adrian Johnson <ajohnson@redneon.com>
+Date:   Sun Mar 4 18:37:53 2012 +1030
+
+    glib demo: make ctrl-q quit the demo
+
+ glib/demo/main.c |    9 +++++++++
+ 1 file changed, 9 insertions(+)
+
+commit 684b47727ba810ad6bf239e2838aa65b6f6cec36
+Author: Adrian Johnson <ajohnson@redneon.com>
+Date:   Sun Mar 4 18:10:49 2012 +1030
+
+    glib demo: show font encoding in font demo
+
+ glib/demo/fonts.c |    9 +++++++--
+ 1 file changed, 7 insertions(+), 2 deletions(-)
+
+commit 48c08d28645d82ab9d67433a0150f6e1ba24b7c6
+Author: Adrian Johnson <ajohnson@redneon.com>
+Date:   Sun Mar 4 17:49:56 2012 +1030
+
+    glib: add poppler_fonts_iter_get_encoding
+
+ glib/poppler-document.cc            |   26 ++++++++++++++++++++++++++
+ glib/poppler-document.h             |    1 +
+ glib/reference/poppler-sections.txt |    1 +
+ 3 files changed, 28 insertions(+)
+
+commit 8d935569a977675afac35cf1bd5f2611b6a771b6
+Author: Albert Astals Cid <aacid@kde.org>
+Date:   Mon Mar 5 21:59:09 2012 +0100
+
+    Fix regression in some PSOutputDev array sizing
+
+ poppler/PSOutputDev.cc |    2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 2484bc0f29aef74c45ea39ef1e24804ed736154c
+Author: Albert Astals Cid <aacid@kde.org>
+Date:   Sun Mar 4 23:47:24 2012 +0100
+
+    Fix mismatch in some functions declarations
+
+ goo/GooString.h |    6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
+
+commit 35c960d198d2efa97d15e962662114c5c31b8d20
+Author: Even Rouault <even.rouault@mines-paris.org>
+Date:   Sun Mar 4 20:32:42 2012 +0100
+
+    Do not crash on malformed files with 0 bits in the color map of
+    an image
+
+ poppler/Gfx.cc |    4 ++++
+ 1 file changed, 4 insertions(+)
+
+commit dae29c6c201cd69cbf4f008de865cc19a36f29b3
+Author: Thomas Freitag <Thomas.Freitag@alfa.de>
+Date:   Sun Mar 4 15:22:02 2012 +0100
+
+    CJK substitute implementation on WIndows platforms.
+
+    When You install ghostscript on WIndows You're able to switch on CJK
+    support. This will create a  cidfmap file in the gs-lib directory. The
+    ps file which creates it (mkcidfm.ps) runs over the windows font
+    directory and tries to create a suitable substitution table for
+    missing
+    CJK fonts. The cidfmap file is more or less PDF like, so it's
+    quite easy
+    to parse it with our parser and create a substitution table in
+    GlobalParamsWin and use that table. But I expect it in the poppler
+    data
+    dir instead of searching for ghostscript installation. If it is not
+    there, it always returns the default CID font of point 2.
+    You can either copy it from the gs lib directory or create it with the
+    ghostscript tool calling
+
+    gswin32c -q -dBATCH -sFONTDIR=<windows font directory>
+    -sCIDFMAP=<popper data dir>/cidfmap mkcidfm.ps
+
+ poppler/GlobalParams.cc    |    5 +++
+ poppler/GlobalParams.h     |    2 +
+ poppler/GlobalParamsWin.cc |  106
+ +++++++++++++++++++++++++++++++++++++++-----
+ 3 files changed, 103 insertions(+), 10 deletions(-)
+
+commit 32e47ee03840cc8f21c00497025864d77edb75f5
+Author: Thomas Freitag <Thomas.Freitag@alfa.de>
+Date:   Sun Mar 4 15:21:13 2012 +0100
+
+    Improve CJK suport in PSOutputDev
+
+    1. Adapt bug fix for bug 11413 to the postscript device
+    2. A small bug fix when locateFont doesn't find a suitable font and
+    returns a null pointer
+
+    to 1.:
+    Adapting the implementation of the bug fix for splash and cairo to the
+    postscript device was quite easy. But my first proofs of the
+    output with
+    ghostscript 8.71 shows some regressions where the CJK chars have a
+    smaller height than the default square of the font. But the "48"
+    in the
+    output of bug-poppler11413.pdf which is set in a "normal" font but
+    rotated was at the right position. Then I stepped to ghostscript 9.04,
+    and now the CJK chars were shown correctly, but the 48 was positioned
+    wrong. But because of these different tests I think that it is still a
+    problem in ghostscript when using a mix of CJK fonts and "normal"
+    fonts.
+    BTW, also Acrobat X distiller has problems with the position of the
+    "48"!
+
+    to 2.:
+    On my first tests with PDF which uses non embedded CJK fonts on
+    Windows
+    I got crashes. Reason for it was that GlobalParamWin returns
+    Helvetica,
+    which is not a CID font, but locateFont accepts here only CID
+    fonts and
+    therefore returns a NULL pointer. I first fixed that and then
+    decided to
+    return as default MS Mincho if a CID font is expected.
+
+ poppler/PSOutputDev.cc |  203
+ ++++++++++++++++++++++--------------------------
+ 1 file changed, 92 insertions(+), 111 deletions(-)
+
+commit 61037a6de157e39331ae7a8b12ee5a115fd7e936
+Author: Adrian Johnson <ajohnson@redneon.com>
+Date:   Sun Mar 4 17:40:40 2012 +1030
+
+    glib demo: fix typo
+
+ glib/demo/selections.c |    4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit aff5b0a4f04c12ad7733aedbc9997367f5873aa1
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:   Sat Mar 3 20:10:17 2012 +0100
+
+    regtest: Ignore backends with no results when creating html report
+
+ regtest/HTMLReport.py |    5 +++++
+ 1 file changed, 5 insertions(+)
+
+commit 9d28b8db3561845f4ca94c29479a259ceaf78bc5
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:   Sat Mar 3 14:42:51 2012 +0100
+
+    regtest: Add --pretty-diff option to create-report command
+
+    It includes a pretty-diff link to make a bit easier to check
+    differences
+    in test results. For images it creates a html with javascript that
+    toggles actual and expected image, using the same code than WebKit
+    layout test results. For text files it uses HtmlDiff class from python
+    difflib. It's an option disabled by default because pretty diff
+    for text
+    files is very slow.
+
+ regtest/HTMLReport.py             |  128
+ ++++++++++++++++++++++++++++++++++++-
+ regtest/commands/create-report.py |    4 ++
+ 2 files changed, 129 insertions(+), 3 deletions(-)
+
+commit 670ea176495b8b580daba061840c914714bf422d
+Author: Adrian Johnson <ajohnson@redneon.com>
+Date:   Fri Mar 2 22:22:16 2012 +1030
+
+    pdffonts: list the encoding of each font
+
+    Bug 46888
+
+ poppler/CMap.h      |    2 ++
+ poppler/FontInfo.cc |    3 +++
+ poppler/FontInfo.h  |    2 ++
+ poppler/GfxFont.cc  |   26 ++++++++++++++++++++++++++
+ poppler/GfxFont.h   |    4 ++++
+ utils/pdffonts.1    |    3 +++
+ utils/pdffonts.cc   |    7 ++++---
+ 7 files changed, 44 insertions(+), 3 deletions(-)
+
+commit 3ab6b5ebf3b6c0d59bcb2ec68eae1aa95cab1d0e
+Author: William Bader <williambader@hotmail.com>
+Date:   Fri Mar 2 19:40:44 2012 +0100
+
+    Fix pdftops -passfonts regression
+
+    This patch fixes pdftops -passfonts by using the new psFontPassthrough
+    variable
+    consistently and removing the old psSubstFonts and its setter and
+    getter in
+    GlobalParams.
+
+    Bug 46744
+
+ poppler/GlobalParams.cc |    9 +--------
+ poppler/GlobalParams.h  |    4 +---
+ utils/pdftops.cc        |   10 +++++-----
+ 3 files changed, 7 insertions(+), 16 deletions(-)
+
+commit 6c1ee34424b1122c0a2222b776d8d475f7c555cd
+Author: Adrian Johnson <ajohnson@redneon.com>
+Date:   Fri Mar 2 18:41:58 2012 +1030
+
+    Update poppler copyright
+
+ poppler/poppler-config.h.cmake |    2 +-
+ poppler/poppler-config.h.in    |    2 +-
+ 2 files changed, 2 insertions(+), 2 deletions(-)
+
+commit cdb1350d1e28cf3bceda75736ca91e13d193de84
+Author: Albert Astals Cid <aacid@kde.org>
+Date:   Thu Mar 1 18:58:02 2012 +0100
+
+    Increase versions
+
+ CMakeLists.txt         |    4 ++--
+ configure.ac           |    2 +-
+ cpp/Doxyfile           |    2 +-
+ glib/CMakeLists.txt    |    2 +-
+ glib/Makefile.am       |    2 +-
+ poppler/Makefile.am    |    2 +-
+ qt4/src/CMakeLists.txt |    2 +-
+ qt4/src/Doxyfile       |    2 +-
+ qt4/src/Makefile.am    |    2 +-
+ 9 files changed, 10 insertions(+), 10 deletions(-)
+
+commit 2c9e6fa5b3bc6cd01618c3fb4f46533bfce97466
+Author: Albert Astals Cid <aacid@kde.org>
+Date:   Thu Mar 1 18:48:17 2012 +0100
+
+    0.19.0 news file
+
+ NEWS |   48 ++++++++++++++++++++++++++++++++++++++++++++++++
+ 1 file changed, 48 insertions(+)
+
+commit 14f6abfcb83f91755e6de05cd33870934bba3cfb
+Author: Albert Astals Cid <aacid@kde.org>
+Date:   Thu Mar 1 17:53:25 2012 +0100
+
+    Update copyrights
+
+ goo/JpegWriter.cc            |    2 +-
+ poppler/CairoFontEngine.cc   |    1 +
+ poppler/CairoOutputDev.cc    |    3 ++-
+ poppler/CairoOutputDev.h     |    2 +-
+ poppler/CairoRescaleBox.cc   |   15 +++++++++++++++
+ poppler/FontInfo.cc          |    2 +-
+ poppler/FontInfo.h           |    1 +
+ poppler/Gfx.cc               |    2 +-
+ poppler/GfxFont.cc           |    1 +
+ poppler/GlobalParams.cc      |    2 ++
+ poppler/GlobalParams.h       |    1 +
+ poppler/Lexer.cc             |    1 +
+ poppler/NameToUnicodeTable.h |    2 +-
+ utils/ImageOutputDev.cc      |    1 +
+ utils/ImageOutputDev.h       |    1 +
+ utils/parseargs.cc           |    1 +
+ utils/parseargs.h            |    1 +
+ utils/pdffonts.cc            |    1 +
+ utils/pdfimages.cc           |    1 +
+ utils/pdftocairo.cc          |    2 +-
+ utils/pdftoppm.cc            |    2 +-
+ 21 files changed, 37 insertions(+), 8 deletions(-)
+
+commit e63ca8184168f824575be9bbb64e9b1eac1eff94
+Author: Adrian Johnson <ajohnson@redneon.com>
+Date:   Thu Mar 1 21:46:12 2012 +1030
+
+    pdftocairo: document that -scale-to will preserve aspect ratio
+
+    based on pdftpppm patch 7ec31b8dc40ec8a3534fbb89964aa011aeb81f5e
+
+ utils/pdftocairo.1 |    4 +++-
+ 1 file changed, 3 insertions(+), 1 deletion(-)
+
+commit fa82a7ce1372e5976ad95624115fcd7a4d9bd22c
+Author: Adrian Johnson <ajohnson@redneon.com>
+Date:   Thu Mar 1 21:43:32 2012 +1030
+
+    pdftocairo: allow one of -scale-to-[xy] = -1 to mean the aspect
+    ratio is to be preserved
+
+    based on pdftoppm patch 38ace7db5de0b2b247fd520e48a8f26e5d28c9d7
+
+ utils/pdftocairo.1  |    8 ++++++--
+ utils/pdftocairo.cc |    8 ++++++--
+ 2 files changed, 12 insertions(+), 4 deletions(-)
+
+commit a2b008223ad6887f00d76c535f2b0b0f13f52b76
+Author: Adrian Johnson <ajohnson@redneon.com>
+Date:   Tue Feb 28 21:38:19 2012 +1030
+
+    glib: add copy button to selections demo
+
+ glib/demo/selections.c |   20 ++++++++++++++++++++
+ 1 file changed, 20 insertions(+)
+
+commit b666d19308a043206e405c7e9d4ad709d68d331b
+Author: Adrian Johnson <ajohnson@redneon.com>
+Date:   Tue Feb 28 21:07:06 2012 +1030
+
+    glib: show substitute font name in demo
+
+ glib/demo/fonts.c |    6 ++++--
+ 1 file changed, 4 insertions(+), 2 deletions(-)
+
+commit 18bc59fcf5a59b1fd51a631c02e900790c3a6dc0
+Author: Adrian Johnson <ajohnson@redneon.com>
+Date:   Tue Feb 28 21:06:38 2012 +1030
+
+    glib: add poppler_fonts_iter_get_substitute_name
+
+ glib/poppler-document.cc            |   27 +++++++++++++++++++++++++++
+ glib/poppler-document.h             |    1 +
+ glib/reference/poppler-docs.sgml    |    4 ++++
+ glib/reference/poppler-sections.txt |    1 +
+ 4 files changed, 33 insertions(+)
+
+commit 4eaafe67de79fb63ebf61f031a97bbc0ed6a8891
+Author: Albert Astals Cid <aacid@kde.org>
+Date:   Wed Feb 29 23:22:34 2012 +0100
+
+    Change nnnnnn to number
+
+    This way people won't expect it to be six fixed digits
+    Bug #46708
+
+ utils/pdftoppm.1 |    4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit aec6cb67951e56e4557a11c4fdf301e585268fe4
+Author: William Bader <williambader@hotmail.com>
+Date:   Wed Feb 29 23:18:16 2012 +0100
+
+    Fix stuff lost when merging xpdf303
+
+    restore the implementation of -binary
+    restore the fix that level2sep and level3sep must write cmyk instead
+    of rgb
+    restore the conversion of bitmaps with all gray to mono8
+    fixed the CMYK misspelling in Stream.
+
+ poppler/PSOutputDev.cc |  284
+ ++++++++++++++++++++++++++++++++++++++++--------
+ poppler/Stream.cc      |   55 +++++++++-
+ poppler/Stream.h       |   39 ++++++-
+ 3 files changed, 320 insertions(+), 58 deletions(-)
+
+commit e977925a1eb15083e6b020b31da77ddef9d5df02
+Author: William Bader <williambader@hotmail.com>
+Date:   Wed Feb 29 23:12:24 2012 +0100
+
+    Fix double alloc
+
+    xpdf303 merge glitch
+
+ poppler/PSOutputDev.cc |    1 -
+ 1 file changed, 1 deletion(-)
+
+commit e13efe04facdc10f3acffece3b057544f018f40c
+Author: William Bader <williambader@hotmail.com>
+Date:   Wed Feb 29 23:10:43 2012 +0100
+
+    Fix memory leak
+
+    Wrong merge from xpdf303
+
+ poppler/GfxState.cc |    3 +++
+ 1 file changed, 3 insertions(+)
+
+commit adfc03e441b2a86dab5216dc560fd79343dfbe4f
+Author: Hib Eris <hib@hiberis.nl>
+Date:   Wed Feb 29 21:10:56 2012 +0100
+
+    Only use Hints table when there are no parse errors
+
+    Fixes bug #46459.
+
+ poppler/Hints.cc  |    6 ++++--
+ poppler/Parser.cc |   30 ++++++++++++++++++++++++------
+ poppler/Parser.h  |    7 +++++--
+ 3 files changed, 33 insertions(+), 10 deletions(-)
+
+commit 7ec31b8dc40ec8a3534fbb89964aa011aeb81f5e
+Author: Adrian Johnson <ajohnson@redneon.com>
+Date:   Mon Feb 27 21:15:39 2012 +1030
+
+    pdftoppm: document that -scale-to will preserve aspect ratio
+
+ utils/pdftoppm.1 |    4 +++-
+ 1 file changed, 3 insertions(+), 1 deletion(-)
+
+commit 38ace7db5de0b2b247fd520e48a8f26e5d28c9d7
+Author: Adrian Johnson <ajohnson@redneon.com>
+Date:   Sat Feb 25 20:02:22 2012 +1030
+
+    pdftoppm: allow one of -scale-to-[xy] = -1 to mean the aspect ratio
+    is to be preserved
+
+    bug 43393
+
+ utils/pdftoppm.1  |    8 ++++++--
+ utils/pdftoppm.cc |    8 ++++++--
+ 2 files changed, 12 insertions(+), 4 deletions(-)
+
+commit 738b879ebb536cc84d7ec96543d484023b69e6d3
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:   Sat Feb 25 20:53:58 2012 +0100
+
+    regtest: Add create-report command to generate html report of
+    test results
+
+ regtest/HTMLReport.py             |  197
+ +++++++++++++++++++++++++++++++++++++
+ regtest/backends/__init__.py      |   20 +++-
+ regtest/commands/create-report.py |   57 +++++++++++
+ 3 files changed, 273 insertions(+), 1 deletion(-)
+
+commit d5faabd509c2860ab199ee89b8ef9d4c14fa5118
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:   Sat Feb 25 20:50:53 2012 +0100
+
+    regtest: Use diff.png extension for image diff files
+
+    So that they are recognized as images
+
+ regtest/backends/__init__.py |   16 ++++++++++++++--
+ regtest/backends/cairo.py    |    2 +-
+ regtest/backends/splash.py   |    2 +-
+ regtest/backends/text.py     |    2 +-
+ 4 files changed, 17 insertions(+), 5 deletions(-)
+
+commit 2a5f1594a23cf521497f904b502fbadf56a9e780
+Author: William Bader <williambader@hotmail.com>
+Date:   Sat Feb 25 16:32:33 2012 +0100
+
+    Fix PSOutputDev regression with -level1
+
+ poppler/PSOutputDev.cc |    4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 6a5deb0a86ad227cce3f85b1f58a9b86755cd812
+Author: Adrian Johnson <ajohnson@redneon.com>
+Date:   Sat Feb 25 19:39:02 2012 +1030
+
+    autoconf: PKG_CHECK_EXISTS should not have the variable prefix in
+    the first argument
+
+ configure.ac |    4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 8f4566c14a727fb75c4c353989cf5eb96516c2e3
+Author: Adrian Johnson <ajohnson@redneon.com>
+Date:   Wed Feb 22 21:21:52 2012 +1030
+
+    autoconf: replace openjpeg compile test with a version test
+
+    Now that openjpeg 1.5 is released and supports pkg-config the compile
+    test can be replaced with a pkg-config version check.
+
+ configure.ac |   11 +++--------
+ 1 file changed, 3 insertions(+), 8 deletions(-)
+
+commit 30f38bf425e2f76b3f6cc4c080137ac7219a9dbe
+Author: Adrian Johnson <ajohnson@redneon.com>
+Date:   Wed Feb 22 21:01:59 2012 +1030
+
+    autoconf: Use pkgconfig to check for libopenjpeg
+
+    and if not found fallback to using AC_CHECK_LIB/AC_CHECK_HEADERS
+
+    openjpeg >= 1.4 installs a pkgconfig file
+
+    Bug 21789
+
+ configure.ac |   28 +++++++++++++++++-----------
+ 1 file changed, 17 insertions(+), 11 deletions(-)
+
+commit 466340d257ff0fe7e3a88a4e013e3feec3f7b70a
+Author: Albert Astals Cid <aacid@kde.org>
+Date:   Thu Feb 23 23:47:15 2012 +0100
+
+    Combine UTF16 surrogate pairs
+
+    Bug 46521
+
+ utils/HtmlOutputDev.cc |   14 +++++++++++++-
+ 1 file changed, 13 insertions(+), 1 deletion(-)
+
+commit 675ef2bda3c4e06b39e2ba09b3b19d99cfb001b6
+Author: Oliver Sander <sander@mi.fu-berlin.de>
+Date:   Thu Feb 23 23:22:50 2012 +0100
+
+    Compile
+
+ poppler/Stream.cc |    3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+commit 7705e65c231cc3af296bf19f5cba110cabb72e7d
+Author: Albert Astals Cid <aacid@kde.org>
+Date:   Thu Feb 23 23:09:23 2012 +0100
+
+    Generate outlines in pdftohtml in -xml mode.
+
+    Bug 56993
+
+ utils/HtmlOutputDev.cc |  130
+ +++++++++++++++++++++++++++++++++++-------------
+ utils/HtmlOutputDev.h  |    7 ++-
+ utils/pdf2xml.dtd      |    7 ++-
+ utils/pdftohtml.cc     |    5 +-
+ 4 files changed, 108 insertions(+), 41 deletions(-)
+
+commit 30446bdd7e202eed88d131e04477c76861fd145c
+Author: Albert Astals Cid <aacid@kde.org>
+Date:   Thu Feb 23 22:56:17 2012 +0100
+
+    Use an Identity CharCodeToUnicode for Adobe-Identity and Adobe-UCS
+    collections
+
+    Also fix Identity CharCodeToUnicode code
+
+    Bug #35468
+
+ poppler/CharCodeToUnicode.cc |   18 +++++++++++++-----
+ poppler/CharCodeToUnicode.h  |    7 +++++--
+ poppler/GfxFont.cc           |   13 +++++++------
+ 3 files changed, 25 insertions(+), 13 deletions(-)
+
+commit 71104f1ec55d3be999afaa1b62405454b31066a9
+Author: Albert Astals Cid <aacid@kde.org>
+Date:   Thu Feb 23 19:34:57 2012 +0100
+
+    Remove unneded CharCodeToUnicode includes
+
+ poppler/ArthurOutputDev.cc |    3 +--
+ poppler/CairoFontEngine.cc |    3 +--
+ poppler/CairoOutputDev.cc  |    3 +--
+ poppler/SplashOutputDev.cc |    3 +--
+ 4 files changed, 4 insertions(+), 8 deletions(-)
+
+commit c0c8cc1592ee6aa13157e34f8083b951d487a413
+Author: Adrian Johnson <ajohnson@redneon.com>
+Date:   Thu Feb 23 21:13:23 2012 +1030
+
+    glib docs: fix typo
+
+ glib/poppler.h |    2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit fde3bed0f400a50f31f1f6bcee44ac1b2c17ddc6
+Author: Albert Astals Cid <aacid@kde.org>
+Date:   Wed Feb 22 00:03:37 2012 +0100
+
+    pdfinfo: decode utf-16 surrogate pairs
+
+    Based on a patch by Adrian Johnson
+    Bug 23075
+
+ utils/pdfinfo.cc |   14 ++++++++++++--
+ 1 file changed, 12 insertions(+), 2 deletions(-)
+
+commit 3361564364a1799fc3d6c6df9f208c5531c407dc
+Author: Adrian Johnson <ajohnson@redneon.com>
+Date:   Tue Feb 21 22:20:02 2012 +0100
+
+    Expand glyph name ligatures such as "ff", "ffi" etc to normal form
+
+    Bug 7002
+
+ poppler/GfxFont.cc          |   14 +++++++++++++-
+ poppler/UnicodeTypeTable.cc |    9 +++++++++
+ poppler/UnicodeTypeTable.h  |    3 +++
+ 3 files changed, 25 insertions(+), 1 deletion(-)
+
+commit d0186c558f4a84a9317687ad50b460d34fb5fdf0
+Author: Pino Toscano <pino@kde.org>
+Date:   Mon Feb 20 22:18:00 2012 +0100
+
+    cmake: support for lcms2
+
+    followup of e48c22d3b70412015b9cc07a9a6ce07845274e13 also for the
+    CMake build system,
+    importing the FindLCMS2.cmake from kdelibs
+
+ CMakeLists.txt                |   26 +++++++++++++--
+ cmake/modules/FindLCMS2.cmake |   73
+ +++++++++++++++++++++++++++++++++++++++++
+ config.h.cmake                |    3 ++
+ utils/CMakeLists.txt          |    3 ++
+ 4 files changed, 102 insertions(+), 3 deletions(-)
+
+commit e48c22d3b70412015b9cc07a9a6ce07845274e13
+Author: Koji Otani <sho@bbr.jp>
+Date:   Mon Feb 20 22:04:01 2012 +0100
+
+    Add support for lcms2
+
+ configure.ac                |   24 ++++++-
+ poppler/GfxState.cc         |  159
+ +++++++++++++++++++++++++++----------------
+ qt4/src/poppler-document.cc |    5 ++
+ utils/pdftocairo.cc         |   17 +++++
+ 4 files changed, 143 insertions(+), 62 deletions(-)
+
+commit 1bcae7aa8f87cc85ee6b477bf0abb49452e46505
+Author: Igor Slepchin <igor.redhat@gmail.com>
+Date:   Sun Feb 19 23:40:50 2012 +0100
+
+    Consistently check if pdftohtml needs to generate outlines.
+
+ utils/pdftohtml.cc |    9 ++++++++-
+ 1 file changed, 8 insertions(+), 1 deletion(-)
+
+commit 126bf08105e319f9216654782e5a63f99f1d1825
+Author: Albert Astals Cid <aacid@kde.org>
+Date:   Sun Feb 19 23:18:25 2012 +0100
+
+    Update glyph names to Unicode values mapping
+
+    Added Zapf Dingbat names and fixed copyrightsans, copyrightserif,
+    registersans, registerserif, trademarksans, trademarkserif
+    Kudos to Adrian Johnson for find what was missing :-)
+    Bug #13131
+
+ poppler/NameToUnicodeTable.h |  213
+ ++++++++++++++++++++++++++++++++++++++++--
+ 1 file changed, 207 insertions(+), 6 deletions(-)
+
+commit c0fec84312a37f62bdbfdee7c8e9b520af28330a
+Author: Pino Toscano <pino@kde.org>
+Date:   Sun Feb 19 14:47:24 2012 +0100
+
+    fix typo, GString -> GooString
+
+ goo/GooString.h |    2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit aaae8996766f259dcc329755c7cccde7c916c1fb
+Author: Adrian Johnson <ajohnson@redneon.com>
+Date:   Thu Feb 16 22:22:15 2012 +1030
+
+    cairo: set mask matrix before drawing an image with a mask
+
+    Bug 40828
+
+ poppler/CairoOutputDev.cc |    1 +
+ 1 file changed, 1 insertion(+)
+
+commit fff439f25d9bbd199db5646deccd80733138898e
+Author: Adrian Johnson <ajohnson@redneon.com>
+Date:   Sun Feb 19 15:45:31 2012 +1030
+
+    update .gitignore
+
+ utils/.gitignore |    1 +
+ 1 file changed, 1 insertion(+)
+
+commit 1cc3e152d6e879eb13fbdf2964ede3e01d13d097
+Author: Adrian Johnson <ajohnson@redneon.com>
+Date:   Sun Feb 19 15:43:09 2012 +1030
+
+    glib docs: fix typo
+
+ glib/poppler-page.cc |    2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 4f4db591276ec156c55b3a3c2020a1cf82f1519b
+Author: Adrian Johnson <ajohnson@redneon.com>
+Date:   Sun Feb 19 15:37:04 2012 +1030
+
+    cairo: fix pdftocairo crash when pdf document uses actualText
+
+ poppler/CairoOutputDev.cc |    2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 9b72ee4e4c8658b2f7cd542d601a5c3be621d3fc
+Author: Thomas Freitag <Thomas.Freitag@alfa.de>
+Date:   Sat Feb 18 17:34:12 2012 +0100
+
+    Make some of the unfilteredResets be really unfiltered
+
+ poppler/Stream.cc |   26 ++++++++++++++++++++------
+ poppler/Stream.h  |    3 +++
+ 2 files changed, 23 insertions(+), 6 deletions(-)
+
+commit 33aded82fbd98832eaab7cb7487fe6a1c7ef15f5
+Author: Albert Astals Cid <aacid@kde.org>
+Date:   Sat Feb 18 17:21:10 2012 +0100
+
+    Rework XRef getNumObjects and getSize
+
+    Kill XRef::last since we do not maintain it correctly, now
+    getNumObjects returns size as it did
+    Kill getSize as it just returns the same as getNumObjects
+
+ poppler/PDFDoc.cc |   10 +++++-----
+ poppler/XRef.cc   |   12 +-----------
+ poppler/XRef.h    |    6 ++----
+ 3 files changed, 8 insertions(+), 20 deletions(-)
+
+commit 521d3740e9b7d2cfacf29f089a4a8f6c962de807
+Author: Adrian Johnson <ajohnson@redneon.com>
+Date:   Mon Feb 13 22:05:18 2012 +1030
+
+    pdfimages: add -list option to list all images
+
+    Bug 46066
+
+ utils/ImageOutputDev.cc |  204
+ +++++++++++++++++++++++++++++++++++++++++------
+ utils/ImageOutputDev.h  |   20 ++++-
+ utils/pdfimages.1       |  101 +++++++++++++++++++++++
+ utils/pdfimages.cc      |   12 ++-
+ 4 files changed, 307 insertions(+), 30 deletions(-)
+
+commit 119b6b752314c9b13440eddf5bd1d5cef2966e80
+Author: Adrian Johnson <ajohnson@redneon.com>
+Date:   Mon Feb 6 16:50:11 2012 +1030
+
+    cairo: don't read inline image streams twice
+
+    Bug 45668
+
+ poppler/CairoOutputDev.cc |    3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+commit a76135391555145ec740d49a7141e60da0ea5dee
+Author: Hib Eris <hib@hiberis.nl>
+Date:   Tue Feb 14 20:11:19 2012 +0100
+
+    Add a configuration option for the test data dir
+
+    This makes 'make distcheck' run succesfully.
+
+ CMakeLists.txt                  |   20 +++++++++++++++++++
+ Makefile.am                     |    2 +-
+ configure.ac                    |   42
+ +++++++++++++++++++++++++++++++++++++++
+ qt4/tests/CMakeLists.txt        |    1 +
+ qt4/tests/Makefile.am           |    1 +
+ qt4/tests/check_actualtext.cpp  |    2 +-
+ qt4/tests/check_attachments.cpp |   14 ++++++-------
+ qt4/tests/check_fonts.cpp       |   18 ++++++++---------
+ qt4/tests/check_links.cpp       |    6 +++---
+ qt4/tests/check_metadata.cpp    |   32 ++++++++++++++---------------
+ qt4/tests/check_optcontent.cpp  |   12 +++++------
+ qt4/tests/check_pagelayout.cpp  |    6 +++---
+ qt4/tests/check_pagemode.cpp    |   10 +++++-----
+ qt4/tests/check_password.cpp    |   12 +++++------
+ qt4/tests/check_permissions.cpp |    2 +-
+ qt4/tests/check_search.cpp      |    4 ++--
+ 16 files changed, 124 insertions(+), 60 deletions(-)
+
+commit 59946e0c34e762eb5f5a13b4ae8c9ec7fb21379a
+Author: Thomas Freitag <Thomas.Freitag@alfa.de>
+Date:   Tue Feb 14 19:37:21 2012 +0100
+
+    Overprint implementation in postscript and splash device
+
+    It is an enhancement patch, a
+    merge fix and a bug fix in one: an enhancement, because it now
+    completes
+    the implementation overprint mode and devicen in postscript, a merge
+    fix, because it fixes some bugs in the overprint implementation in
+    splash of xpdf 3.0.3 and has now the complete functionality (and
+    more!)
+    of my implementation back again and a bug fix, because it fixes
+    the use
+    of splash cmyk in postscript which never had worked.
+
+    1. Overprint implementation in postscript
+    To have a complete overprint implementation in the (pure) postscript
+    device there were just two things missing: overprint mode and the
+    implementation of the DeviceN colorspace in PostScript. I double
+    checked
+    my implementation with the Ghent Test Suite with GhostScript (device
+    pdfwrite) and Acrobat X distiller, and all the tests now succeeds,
+    either in Acrobat X distiller or in GhostScript. As overprint is a
+    device dependent feature, it is up to the output device if it supports
+    overprint and what features of overprint are supported, and often You
+    have various configuration possibilities there. Nearly all PostScript
+    output of the Ghent tests show now the desired results if converting
+    it
+    back to PDF with ghostscript pdfwrite, the implementation in
+    ghostscript
+    is complete. On the other hand a few tests failed when using Acrobat X
+    distiller, all of them with the overprint mode switch. Funny, because
+    overprint mode 1 is often also called the illustrator overprint mode
+    because it was introduced by illustrator, but probably the destiller
+    only handles EPS correctly which comes from illustrator
+
+    2. Overprint implementation in postscript if using splash
+    rasterization
+    Of course the postscript overprint implementation will only work if
+    pdftops doesn't decide to use splash to rasterize it because of
+    the use
+    of transparencies in the PDF. But because overprint is device
+    dependent
+    I decided to spend an additional parameter "overprint" to pdftops
+    (simular to pdftoppm). Switching it on (only available if compiled
+    with
+    SPLASH_CMYK, because overprint is only in CMYK colorspace showable)
+    will
+    use the overprint implementation in splash also if rasterizing
+    the PDF.
+
+    3. Overprint implementation in splash
+    The overprint implementation in splash now uses the better designed
+    interface of xpdf and therefore now also works in transparency groups.
+    Thanks to the developper team of xpdf. I just fixed a small bug in it,
+    where it defies the technical specification. Of course it is still in
+    the nature of the splash implementation that it fails if CMYK values
+    should overprint spot colors, because spot colors are converted
+    immediately in their CMYK alternates. And in the implementation of
+    overprinting spot colors over CMYK colors I made a small assumption to
+    get it running which causes undesired results if this assumption
+    fails,
+    but I didn't want to implement more and more configuration switches. I
+    still plan to implement a DeviceN output in splash and make a complete
+    implementation there, but this is of course a bigger task (but
+    doable).
+    The overprint switch in pdftoppm is still only available if compiled
+    with the SPLASH_CMYK directive.
+
+ poppler/PSOutputDev.cc     |   67 ++++++++++--
+ poppler/PSOutputDev.h      |    3 +-
+ poppler/SplashOutputDev.cc |   62 +++++++++--
+ poppler/SplashOutputDev.h  |    4 +-
+ splash/Splash.cc           |   70 +++++++++----
+ splash/Splash.h            |    4 +-
+ splash/SplashState.cc      |    5 +-
+ splash/SplashState.h       |  247
+ ++++++++++++++++++++++----------------------
+ utils/pdftops.cc           |   13 +++
+ 9 files changed, 308 insertions(+), 167 deletions(-)
+
+commit b505920db6d3dac58c7e9f4f8917f4c4449b08a0
+Merge: 9250449 a631281
+Author: Albert Astals Cid <aacid@kde.org>
+Date:   Tue Feb 14 19:18:54 2012 +0100
+
+    Merge remote-tracking branch 'origin/xpdf303merge'
+
+    Conflicts:
+       utils/HtmlOutputDev.cc
+       utils/HtmlOutputDev.h
+
+commit 9250449aaa279840d789b3a7cef75d06a0fd88e7
+Author: Hib Eris <hib@hiberis.nl>
+Date:  Sun Feb 12 23:16:41 2012 +0100
+
+    Improve moc detection when cross compiling
+
+ configure.ac |    6 ++++--
+ 1 file changed, 4 insertions(+), 2 deletions(-)
+
+commit 66cf1fdb3ba6894f61d9078f5c30046b464347ae
+Author: Pino Toscano <pino@kde.org>
+Date:  Sun Feb 12 22:27:58 2012 +0100
+
+    qt4: remove non-existing 'qt' include dirs
+
+ qt4/demos/Makefile.am |    1 -
+ qt4/src/Makefile.am   |    1 -
+ qt4/tests/Makefile.am |    1 -
+ 3 files changed, 3 deletions(-)
+
+commit 53d8fc4d2978b70e8926e3df71facd1f39de9348
+Author: Pino Toscano <pino@kde.org>
+Date:  Sun Feb 12 17:36:55 2012 +0100
+
+    man pages: fix minor issues with hypens and %
+
+ utils/pdfseparate.1 |   6 +++---
+ utils/pdftocairo.1  |   4 ++--
+ 2 files changed, 5 insertions(+), 5 deletions(-)
+
+commit a63128179c65b5d9d6d9d41fa601a593b0a05d94
+Author: Thomas Freitag <Thomas.Freitag@kabelmail.de>
+Date:  Thu Feb 9 22:02:52 2012 +0100
+
+    [xpdf303] Fix merge issue
+
+ utils/pdftoppm.cc |   2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit cd5a6a4d02e579e543067d1847164aff90363f16
+Author: Thomas Freitag <Thomas.Freitag@kabelmail.de>
+Date:  Thu Feb 9 22:01:42 2012 +0100
+
+    [xpdf303] Fix merge bug
+
+ poppler/GfxState.cc |   2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 597fa37cacec928c40d0491174ce843fe01f26d9
+Author: Igor Slepchin <igor.slepchin@gmail.com>
+Date:  Wed Feb 8 19:22:13 2012 -0500
+
+    Close li tags in generated outlines.
+
+    Also, add newlines after ul tags for better readability.
+    Bug #45807
+    (cherry picked from commit bf81250ff7d0968852fc7559fafb6389cd695b91)
+
+ utils/HtmlOutputDev.cc |    9 ++++++---
+ 1 file changed, 6 insertions(+), 3 deletions(-)
+
+commit 2fc36dba5f63703896722adb5127896e4c2840e7
+Author: Igor Slepchin <igor.slepchin@gmail.com>
+Date:  Thu Feb 9 00:15:13 2012 +0100
+
+    Get rid of static data members; merge duplicated jpeg dumping code.
+
+    HtmlPage::pgNum is never used;
+    imgNum is always equal to imgList->getLength()+1
+    imgList is now maintained in HtmlPage.
+
+ utils/HtmlOutputDev.cc |  143
+ +++++++++++++++++++-----------------------------
+ utils/HtmlOutputDev.h |   15 +++--
+ 2 files changed, 65 insertions(+), 93 deletions(-)
+
+commit f655efe327ddd3b6a68353a62589d4e4f8a318a8
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Wed Feb 8 23:58:27 2012 +0100
+
+    Fix memory leak when using HtmlOutputDev::mapEncodingToHtml
+
+    Bug #45805
+    (cherry picked from commit 53a0c2043dfd56f6da7780f1a049f75af368b84b)
+
+ utils/HtmlOutputDev.cc |   47
+ ++++++++++++++++++++++++-----------------------
+ utils/HtmlOutputDev.h |    7 ++++---
+ 2 files changed, 28 insertions(+), 26 deletions(-)
+
+commit 68f02d19c571fce956c7f4af6ccd0ff9ba8b1b03
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Wed Feb 8 23:47:46 2012 +0100
+
+    Fix leak in pdftohtml getInfoString
+
+    Bug #45805
+    (cherry picked from commit 4afe4d827a342a847e8b89aba5b4164ed3b4cc32)
+
+ utils/pdftohtml.cc |   3 +--
+ 1 file changed, 1 insertion(+), 2 deletions(-)
+
+commit 2b7ba166c28e32653db4ae7acf90e06e0dd5975b
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Wed Feb 8 19:12:52 2012 +0100
+
+    [xpdf303] Compile fixes
+
+ poppler/GlobalParamsWin.cc |   2 +-
+ poppler/SplashOutputDev.cc |  10 ----------
+ 2 files changed, 1 insertion(+), 11 deletions(-)
+
+commit b8c9b179c9491cf6755b07bfdec4174e78b7d241
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Mon Feb 6 19:55:07 2012 +0100
+
+    [xpdf303] Adapt better to what we did and what xpdf303 does
+
+ poppler/ArthurOutputDev.cc   |    1 -
+ poppler/GlobalParams.cc      |   10 ----------
+ poppler/GlobalParams.h       |    1 -
+ poppler/SplashOutputDev.cc   |    3 ---
+ poppler/SplashOutputDev.h    |    1 -
+ splash/SplashFTFont.cc       |   40
+ +++++++++++++++++++---------------------
+ splash/SplashFTFont.h       |    1 -
+ splash/SplashFTFontEngine.cc |    7 +++----
+ splash/SplashFTFontEngine.h  |    5 ++---
+ splash/SplashFontEngine.cc   |    3 +--
+ splash/SplashFontEngine.h    |    1 -
+ utils/pdftoppm.cc           |    2 +-
+ 12 files changed, 26 insertions(+), 49 deletions(-)
+
+commit ea6bc19564865e04431d9154802ae7fba975a716
+Merge: e17f095 92ce79f
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Mon Feb 6 01:18:25 2012 +0100
+
+    Merge branch 'master' into xpdf303merge
+
+    Conflicts:
+       poppler/CairoOutputDev.cc
+       poppler/CairoOutputDev.h
+       poppler/FontInfo.cc
+       poppler/GfxFont.cc
+       poppler/GfxState.cc
+       poppler/GlobalParams.cc
+       poppler/GlobalParams.h
+       poppler/Lexer.cc
+
+commit e17f09563276ee25b6acfc127b6ea360da650030
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Mon Feb 6 00:25:53 2012 +0100
+
+    [xpdf303] TextOutputDev and associated changes
+
+ cpp/poppler-page.cpp      |   10 +-
+ glib/poppler-page.cc      |    5 +-
+ poppler/ArthurOutputDev.cc |   1 +
+ poppler/CairoOutputDev.cc  |   2 +-
+ poppler/Gfx.cc                    |    6 +-
+ poppler/PSOutputDev.cc     |   6 +-
+ poppler/TextOutputDev.cc   |  360
+ +++++++++++++++++++++++++++-----------------
+ poppler/TextOutputDev.h    |  18 ++-
+ qt4/src/poppler-page.cc    |  12 +-
+ test/perf-test.cc         |    2 +-
+ utils/pdftotext.1         |    4 +
+ utils/pdftotext.cc        |   10 +-
+ 12 files changed, 270 insertions(+), 166 deletions(-)
+
+commit 548648bf29dc1551443eb1925814342e7aadee46
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Sun Feb 5 23:08:44 2012 +0100
+
+    [xpdf303] Merge PDFDoc encryption related code
+
+ poppler/PDFDoc.cc |   5 ++++-
+ 1 file changed, 4 insertions(+), 1 deletion(-)
+
+commit 6ee907f291427b8751a872b31210bf32e8d2b722
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Sun Feb 5 22:57:25 2012 +0100
+
+    [xpdf303] More merges from Thomas, basically PSOutputDev and some
+    other small stuff
+
+ poppler/GfxFont.cc         |    4 +-
+ poppler/GlobalParams.cc     |  95 ++-
+ poppler/GlobalParams.h      |  18 +-
+ poppler/GlobalParamsWin.cc  |  16 +-
+ poppler/Hints.cc           |    2 +-
+ poppler/PSOutputDev.cc      | 1814
+ ++++++++++++++++++++++---------------------
+ poppler/PSOutputDev.h      |   51 +-
+ poppler/Parser.cc          |   13 +-
+ poppler/Parser.h           |    7 +-
+ poppler/PreScanOutputDev.cc |  70 +-
+ poppler/PreScanOutputDev.h  |  16 +-
+ poppler/XRef.cc            |   91 ++-
+ poppler/XRef.h                     |    3 +-
+ utils/pdftops.cc           |    2 +-
+ 14 files changed, 1231 insertions(+), 971 deletions(-)
+
+commit 92ce79f47f929392f48737612a9690088573f63d
+Author: Igor Slepchin <igor.redhat@gmail.com>
+Date:  Sun Feb 5 15:55:39 2012 +0100
+
+    Proper unicode support when dumping PDF outline.
+
+    Also use of already existing Outline class rather than parsing the
+    outline anew.
+
+    Bug 45572
+    (cherry picked from commit 40f7289ab04787734b856c53d5c0139445b52635)
+
+    Conflicts:
+
+       utils/HtmlOutputDev.cc
+
+ utils/HtmlOutputDev.cc |  197
+ ++++++++++++++++++++++++++----------------------
+ utils/HtmlOutputDev.h |    6 +-
+ utils/pdftohtml.cc    |    3 +-
+ 3 files changed, 112 insertions(+), 94 deletions(-)
+
+commit 38ec58ed1cb54722aece875287b847643aa2c4b8
+Author: Adrian Johnson <ajohnson@redneon.com>
+Date:  Sat Feb 4 17:13:30 2012 +1030
+
+    Lexer: convert integer to real when overflow occurs
+
+    Bug 45605
+
+ poppler/Lexer.cc |    6 ++++--
+ 1 file changed, 4 insertions(+), 2 deletions(-)
+
+commit df89de61b7d01f0f816e773cdb809faa3053e962
+Author: Hib Eris <hib@hiberis.nl>
+Date:  Tue Jan 31 20:01:30 2012 +0100
+
+    glib: Exclude poppler-private.h from introspection files
+
+    Fixes bug #45455.
+
+ glib/CMakeLists.txt |   2 +-
+ glib/Makefile.am    |   2 +-
+ 2 files changed, 2 insertions(+), 2 deletions(-)
+
+commit 88cb6d9360bc943fc2cdda262dc46bf831641541
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Sat Feb 4 12:04:03 2012 +0100
+
+    glib: Update gtk-doc makefile and m4 file
+
+ gtk-doc.make  |  112
+ ++++++++++++++++++++++++++++++++-------------------------
+ m4/gtk-doc.m4 |    6 ++++
+ 2 files changed, 70 insertions(+), 48 deletions(-)
+
+commit 3f4164f84bbf748a2f919741669ef20db0fbda9f
+Author: Hib Eris <hib@hiberis.nl>
+Date:  Wed Feb 1 10:44:17 2012 +0100
+
+    gtk-doc: Fix build when builddir != srcdir
+
+    Bug #45549.
+
+ glib/reference/Makefile.am |  10 +++++-----
+ 1 file changed, 5 insertions(+), 5 deletions(-)
+
+commit 8daeb82f982eba25fe8c7d07358f0a6593ddc89a
+Author: Hib Eris <hib@hiberis.nl>
+Date:  Thu Feb 2 13:01:45 2012 +0100
+
+    gtk-doc: Fix API documentation for poppler_page_free_annot_mapping()
+
+    Remove reference to non existent method poppler_annot_free() and use
+    ref/unref instead of copy/free.
+
+    Bug #45549.
+
+ glib/poppler-page.cc |    4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit f8ce9966e4f480949799a26c01bd861f4011b587
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Sat Feb 4 11:51:34 2012 +0100
+
+    gtk-doc: Remove reference to non existent method poppler_layer_free()
+
+    Bug #45549.
+
+ glib/poppler-document.cc |    7 +++----
+ 1 file changed, 3 insertions(+), 4 deletions(-)
+
+commit f58f3525f135bc47e89c23c33e96e43db10d4853
+Author: Hib Eris <hib@hiberis.nl>
+Date:  Thu Feb 2 15:59:47 2012 +0100
+
+    gtk-doc: Add more glib API documentation for poppler-document
+
+    Fixes several gtk-doc warnings.
+
+    Bug #45549.
+
+ glib/poppler-document.h |   26 +++++++++++++-------------
+ 1 file changed, 13 insertions(+), 13 deletions(-)
+
+commit 080247f6a47bc929b25f6e000f4474801af74b1f
+Author: Hib Eris <hib@hiberis.nl>
+Date:  Thu Feb 2 15:45:37 2012 +0100
+
+    gtk-doc: remove references to removed pixbuf functions
+
+    Bug #45549.
+
+ glib/poppler-page.cc               |    6 ++----
+ glib/reference/poppler-sections.txt |   4 ----
+ 2 files changed, 2 insertions(+), 8 deletions(-)
+
+commit 47780d9ed1fd69068fdb9b9782e2cb37e2a5b217
+Author: Hib Eris <hib@hiberis.nl>
+Date:  Thu Feb 2 15:43:30 2012 +0100
+
+    gtk-doc: do not build doc for glib-demo
+
+    Fixes glib-demo symbols in poppler-unused.txt
+
+    Bug #45549.
+
+ glib/reference/Makefile.am |   2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit e320f335cc6e54c60bd2436799dd1f05beb060ba
+Author: Hib Eris <hib@hiberis.nl>
+Date:  Sat Feb 4 11:32:50 2012 +0100
+
+    gtk-doc: Fix typo's
+
+    Bug #45549.
+
+ glib/poppler-annot.cc              |    6 +++---
+ glib/poppler-annot.h               |    2 +-
+ glib/poppler-document.cc           |    2 +-
+ glib/poppler-media.cc              |    2 +-
+ glib/poppler-page.cc               |    3 +--
+ glib/poppler-page.h                |    4 ++--
+ glib/reference/poppler-sections.txt |   4 +++-
+ 7 files changed, 12 insertions(+), 11 deletions(-)
+
+commit 1fe27b07975e9a9455708563118fb73cce696f81
+Author: Hib Eris <hib@hiberis.nl>
+Date:  Tue Jan 31 12:49:01 2012 +0100
+
+    cairo: Remove unused variable in CairoFontEngine.cc
+
+    Fixes bug #45442.
+
+ poppler/CairoFontEngine.cc |   3 +--
+ 1 file changed, 1 insertion(+), 2 deletions(-)
+
+commit e3d80c79815ce46daf3c3f2b944f49eaf19bfea5
+Author: Hib Eris <hib@hiberis.nl>
+Date:  Tue Jan 31 14:42:04 2012 +0100
+
+    Fix return value of downscale_box_filter()
+
+    Fixes bug #45441.
+
+ poppler/CairoRescaleBox.cc |   2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit e074e526fa206403b84da5ce0f27d7357223c7ac
+Author: Hib Eris <hib@hiberis.nl>
+Date:  Tue Jan 31 13:02:16 2012 +0100
+
+    Fix return value of poppler_attachment_save
+
+    Fixes bug #45440.
+
+ glib/poppler-attachment.cc |   2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit bc389cff91c350d7da186d4cf707c389c77bbc29
+Author: Hib Eris <hib@hiberis.nl>
+Date:  Tue Jan 31 14:03:08 2012 +0100
+
+    glib-demo: Do not use deprecated gtk_dialog_set_has_separator()
+
+    Bug #45439
+
+ glib/demo/main.c |    2 ++
+ 1 file changed, 2 insertions(+)
+
+commit e52e3c24663edaa630d9187e832223b474b74089
+Author: Hib Eris <hib@hiberis.nl>
+Date:  Tue Jan 31 13:39:05 2012 +0100
+
+    glib-demo: Do not use deprecated GtkComboBox API
+
+    Bug #45439.
+
+ glib/demo/annots.c    |    6 ++++++
+ glib/demo/print.c     |    9 ++++++++-
+ glib/demo/render.c    |   16 ++++++++++++++++
+ glib/demo/selections.c |    8 ++++++++
+ 4 files changed, 38 insertions(+), 1 deletion(-)
+
+commit 165ab4ec122d0e1a6f30dcfba80aefc422cd83b7
+Author: Hib Eris <hib@hiberis.nl>
+Date:  Tue Jan 31 12:15:51 2012 +0100
+
+    Fix build for builddir != srcdir
+
+    Fixes bug #45434.
+
+ glib/Makefile.am |    2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit e424a13bb516464d59ad76fd0933e92f3307b21b
+Author: Thomas Freitag <Thomas.Freitag@kabelmail.de>
+Date:  Fri Feb 3 00:12:10 2012 +0100
+
+    pdfseparate fixes by Thomas after his last commit
+
+ poppler/PDFDoc.cc |   8 +++++++-
+ 1 file changed, 7 insertions(+), 1 deletion(-)
+
+commit 4fcd42cfa4424992cd4b36af38bc6230ce0706c9
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Wed Feb 1 22:53:03 2012 +0100
+
+    [xpdf303] More merges from Thomas (with minor fixes from me)
+
+    Basically fonts related and some other small stuff
+
+ poppler/Annot.cc           |    6 +-
+ poppler/ArthurOutputDev.cc  |  47 +--
+ poppler/CMap.cc            |  153 ++++++++
+ poppler/CMap.h                     |   16 +
+ poppler/CairoFontEngine.cc  |  43 +--
+ poppler/CharCodeToUnicode.h |   1 +
+ poppler/FontInfo.cc        |    8 +-
+ poppler/Gfx.cc                     |  363 +++++++++++--------
+ poppler/GfxFont.cc         |  831
+ +++++++++++++++++++++++++++++--------------
+ poppler/GfxFont.h          |   34 +-
+ poppler/GfxState.cc        |   81 +++--
+ poppler/GfxState.h         |    2 +
+ poppler/GlobalParams.cc     | 738 ++++++++++++++++++++++----------------
+ poppler/GlobalParams.h      | 112 +++---
+ poppler/GlobalParamsWin.cc  | 180 ++++++++--
+ poppler/PSOutputDev.cc      | 591 +++++++++++++++---------------
+ poppler/PSOutputDev.h      |   12 +-
+ poppler/PreScanOutputDev.cc |  10 +-
+ poppler/SplashOutputDev.cc  |  59 ++-
+ poppler/XRef.cc            |   16 +-
+ 20 files changed, 2008 insertions(+), 1295 deletions(-)
+
+commit 0089357de8ea96f3e394ea9cb37e8182ccf15ae2
+Author: Thomas Freitag <Thomas.Freitag@kabelmail.de>
+Date:  Wed Feb 1 19:17:38 2012 +0100
+
+    pdfseparate: Produce PDF/X conformant pdf pages if the original PDF
+    was PDF/X conformant.
+
+ poppler/PDFDoc.cc |   63
+ +++++++++++++++++++++++++++++++++--------------------
+ poppler/XRef.cc   |   9 +++++++-
+ poppler/XRef.h    |   5 ++++-
+ 3 files changed, 51 insertions(+), 26 deletions(-)
+
+commit be62a4f2e7d5db3b6d85d1b3026979f9561e6e15
+Author: Hib Eris <hib@hiberis.nl>
+Date:  Mon Jan 30 17:07:28 2012 +0100
+
+    Fix build with latest mingw-w64 headers
+
+    Fixes bug #45407.
+    (cherry picked from commit 58c17c3a61f18a6808ec9ba37e82734a655090ac)
+
+ glib/poppler-annot.cc   |    1 +
+ glib/poppler-document.cc |    1 +
+ 2 files changed, 2 insertions(+)
+
+commit acbc63348ce5e279e4d66ed4f240dc8d61df4e57
+Author: Suzuki Toshiya <mpsuzuki@hiroshima-u.ac.jp>
+Date:  Mon Jan 30 20:46:04 2012 +1030
+
+    pdftocairo/automake: link with lcms
+
+ utils/Makefile.am |   5 +++++
+ 1 file changed, 5 insertions(+)
+
+commit 9548573a16629fecdbd44c9aac8b626ec6f53b81
+Author: Pino Toscano <pino@kde.org>
+Date:  Mon Jan 30 00:32:52 2012 +0100
+
+    glib/cmake: various minor introspection improvements
+
+    "port" to CMake of the automake equivalents of
+    4765c3289635fe4fb006e7df4f83d7056eb42855
+
+ glib/CMakeLists.txt |   3 +++
+ 1 file changed, 3 insertions(+)
+
+commit bf2ffb1cc76bcf569419ac495f524c41bb6f1650
+Author: Pino Toscano <pino@kde.org>
+Date:  Mon Jan 30 00:21:31 2012 +0100
+
+    cmake: support $(gir_name)_EXPORT_PACKAGES for g-ir-scanner
+
+ cmake/modules/GObjectIntrospectionMacros.cmake |    2 ++
+ 1 file changed, 2 insertions(+)
+
+commit cbe7131e63c5896010e7e1ad5c0c3aa91611704d
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Fri Jan 27 00:36:18 2012 +0100
+
+    Set OPJ_DPARAMETERS_IGNORE_PCLR_CMAP_CDEF_FLAG if you have it
+
+    Fixes/workarounds bug 43414 with openjpeg 1.5 (unreleased)
+    (cherry picked from commit de6415af1a39ec7dfa4f149c6c5e311b86352cec)
+
+ cmake/modules/FindLIBOPENJPEG.cmake |  13 +++++++++++++
+ config.h.cmake                             |    3 +++
+ configure.ac                       |    8 ++++++++
+ poppler/JPEG2000Stream.cc          |    7 ++++++-
+ 4 files changed, 30 insertions(+), 1 deletion(-)
+
+commit 641526d1a7e8032ea8f7b8ac42c5ad8c20448d9b
+Author: Adrian Johnson <ajohnson@redneon.com>
+Date:  Wed Jan 25 22:44:27 2012 +1030
+
+    jpeg: set image parameters after jpeg_set_defaults()
+
+    so the resolution does not get overwritten by the defaults.
+
+    The libjpeg documentation for jpeg_set_defaults() states: "This
+    routine sets all JPEG parameters to reasonable defaults, using only
+    the input image's color space (field in_color_space, which must
+    already be set in cinfo)"
+
+    Bug 45224
+
+ goo/JpegWriter.cc |   6 ++++--
+ 1 file changed, 4 insertions(+), 2 deletions(-)
+
+commit f7356a88fe983c2ddd7d5a50400768310a26c4d2
+Author: Adrian Johnson <ajohnson@redneon.com>
+Date:  Thu Jan 26 11:33:28 2012 +1030
+
+    glib: add section in docs for new symbols in 0.18
+
+ glib/reference/poppler-docs.sgml |    4 ++++
+ 1 file changed, 4 insertions(+)
+
+commit b42c171de93dba56859beb21cfe5312d825fedd6
+Author: Alexander Saprykin <xelfium@gmail.com>
+Date:  Mon Jan 23 22:07:15 2012 +0100
+
+    Do not use 50Kb of stack in SplashXPath::addCurve
+
+    Bug 44905
+
+ splash/SplashXPath.cc |   69
+ +++++++++++++++++++++++++++++++++++--------------
+ 1 file changed, 49 insertions(+), 20 deletions(-)
+
+commit a04fca6266bda6d04068f38f16fe492cb6b8677b
+Author: Adrian Johnson <ajohnson@redneon.com>
+Date:  Sat Jan 21 09:41:12 2012 +1030
+
+    cairo: use fabs when comparing the transformed line width
+
+    as the transform may cause a negative width.
+
+    Bug 43441
+
+ poppler/CairoOutputDev.cc |   2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit ce1b6c7ca16847f07eeafc29c6503be6fa5a9a3d
+Author: Patrick Pfeifer <p2000@mailinator.com>
+Date:  Thu Jan 19 14:54:48 2012 +0100
+
+    cairo: Fix test for rotation
+
+    Fixes bug #14619.
+
+ poppler/CairoOutputDev.cc |   8 +++++++-
+ 1 file changed, 7 insertions(+), 1 deletion(-)
+
+commit 4765c3289635fe4fb006e7df4f83d7056eb42855
+Author: Evan Nemerson <evan@coeus-group.com>
+Date:  Sun Jan 15 11:02:50 2012 -0800
+
+    glib: various minor introspection and documentation improvements
+
+    Bug 44790
+
+ glib/Makefile.am         |    4 +++-
+ glib/poppler-annot.cc    |    8 ++++----
+ glib/poppler-attachment.h |   7 ++++---
+ glib/poppler-document.cc  |   6 ++++--
+ glib/poppler-media.h     |    7 ++++---
+ glib/poppler-page.cc     |   23 +++++++++++++++--------
+ 6 files changed, 34 insertions(+), 21 deletions(-)
+
+commit e8e42988c5cebab2ffa5fe020f30a3a645e90b5f
+Author: Adrian Johnson <ajohnson@redneon.com>
+Date:  Mon Jan 16 21:25:19 2012 +1030
+
+    cairo: ensure paintTransparencyGroup uses same ctm as
+    beginTransparencyGroup
+
+    Bug 29968
+
+ poppler/CairoOutputDev.cc |   8 ++++++--
+ poppler/CairoOutputDev.h  |   1 +
+ 2 files changed, 7 insertions(+), 2 deletions(-)
+
+commit f6c7aa752f9455bba1aa3c72e0998e7911c1d43e
+Author: Adrian Johnson <ajohnson@redneon.com>
+Date:  Wed Jan 18 21:19:43 2012 +1030
+
+    configure.ac: print the glib version required if not found
+
+ configure.ac |   10 ++++++++--
+ 1 file changed, 8 insertions(+), 2 deletions(-)
+
+commit 100488ec7db2d1f3e25bfda42c1603ca86696195
+Author: Adrian Johnson <ajohnson@redneon.com>
+Date:  Sun Jan 15 23:52:28 2012 +1030
+
+    cairo: restore temporary clip used in CairoOutputDev::fill when
+    painting a mask
+
+    The clip is only used to clip the paint to the fill path so it should
+    be moved inside the save/restore.
+
+ poppler/CairoOutputDev.cc |   2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 9c092e17e8f0cf0335b431a223e6e44bddc27e64
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Sun Jan 15 23:28:51 2012 +0100
+
+    [xpdf] More Splash and Gfx changes from Thomas
+
+    1. merge of blend changes
+    Here I had not only merged the changed in blend modes, I made also
+    a few
+    changes in the SPLASH_CMYK area, so that the already sent PDF now also
+    be rendered correctly with the -jpegcmyk option
+    2. merge of font handling in SplashOutputDev.cc
+    There were a few changes left in font handling, I took them over
+    3. merge of getcolor-changes
+    The getcolor changes win a price for well defined C++ code. I wouldn't
+    have merged them, if there were not a lot of other things to merge.
+    4. merge of image handling in SplashOutputDev.cc
+    I merged the left changes in image handling including colorizing masks
+    in pattern colorspace
+    5. cleanup of overprint
+    I tested the overprint implementation of Derek. They succeed only
+    in 70
+    % percent of the PDF where my solution had success, but Derek's
+    solution
+    is much cleaner, and I'm sure that I could also fix the rest in
+    it. BUT:
+    as I already considered, when I implemented overprint, there are some
+    overprint situations, which can not be solved in a CMYK colorspace, we
+    have to implement a DeviceN colorpace when also overprint from CMYK
+    colors over spot colors should work. Therefore I decided to remove my
+    overprint implementation completely from the code and let Derek's
+    solution in, even if there could be done some enhancements in it.
+    6. colorizing text in pattern colorspace
+    When I saw Derek's implementation with a clean interface only at one
+    place in Gfx.cc, I first was very surprised. My solution had a lot of
+    places in Gfx.cc, where I looked if the current colorspace is
+    a pattern
+    colorspace. Therefore I first had a look into the PDF specification
+    again, and really, it can be done in the way of Derek. Therefore I
+    merged it and removed the fragments of my code.
+
+    On this step I started a regtest against the version after the fourth
+    patch. There were a lot of enhancements, especially in texts with
+    symbolic chars like mathematical and so on, but there was one
+    (and ONLY
+    one) regression, shown in bug-poppler27482.pdf
+    I examined that (that is also the reason for the delay) and
+    encountered
+    that on merging I removed my solution for this bug, therefore
+
+    7. insert enhancements for colorizing masks in pattern colorspace
+    I adapt the bug fix from bug 27482 to the merge.
+
+ poppler/CairoOutputDev.cc   | 101 ++--
+ poppler/CairoOutputDev.h    |  21 +-
+ poppler/Gfx.cc                     |  705 +++++++++++++++-----------
+ poppler/Gfx.h              |   22 +-
+ poppler/GfxState.cc        |  208 +++++---
+ poppler/GfxState.h         |   37 +-
+ poppler/GlobalParams.cc     |  17 +
+ poppler/GlobalParams.h      |   3 +
+ poppler/OutputDev.cc       |   13 +-
+ poppler/OutputDev.h        |   25 +-
+ poppler/PSOutputDev.cc      |  87 ++--
+ poppler/PSOutputDev.h      |   21 +-
+ poppler/PreScanOutputDev.cc |   2 +-
+ poppler/SplashOutputDev.cc  | 1179
+ +++++++++++++++++++++----------------------
+ poppler/SplashOutputDev.h   |  80 +--
+ poppler/TextOutputDev.cc    |   8 +
+ poppler/TextOutputDev.h     |   8 +
+ splash/Splash.cc           |   11 +-
+ splash/Splash.h            |  122 ++---
+ splash/SplashPattern.cc     |  14 -
+ splash/SplashPattern.h      |   7 -
+ utils/pdftoppm.cc          |    1 +
+ 22 files changed, 1390 insertions(+), 1302 deletions(-)
+
+commit 69df13c49cea2390f2c5036f3d450f134f7a2656
+Author: Thomas Freitag <Thomas.Freitag@alfa.de>
+Date:  Sun Jan 15 15:07:18 2012 +0100
+
+    Fix stack overflow in PDFDoc::markObject()
+
+    Bug 44660
+
+ poppler/PDFDoc.cc |   4 +++-
+ 1 file changed, 3 insertions(+), 1 deletion(-)
+
+commit cdb56567c60b492ad08befff54f2ff70620b86fe
+Author: Thomas Freitag <Thomas.Freitag@alfa.de>
+Date:  Sun Jan 15 15:04:51 2012 +0100
+
+    Correctly initialize globalParams
+
+ utils/pdfseparate.cc |    5 ++++-
+ 1 file changed, 4 insertions(+), 1 deletion(-)
+
+commit 4e205a6625431dcf95375de009b4354746a4f0b7
+Author: Adrian Johnson <ajohnson@redneon.com>
+Date:  Sun Jan 15 22:18:30 2012 +1030
+
+    parseargs: don't use arg->size with GooString argument
+
+    40b56994 added GooString arguments but incorrectly used arg->size as
+    the string length. arg->size is always 0 for GooString arguments. This
+    worked because the arg->size - 1 string length passed to
+    GooString::Set() just happened to be the the same value as the
+    CALC_STRING_LEN default argument indicating the string length is to be
+    calculated with strlen.
+
+ utils/parseargs.cc |   3 +--
+ 1 file changed, 1 insertion(+), 2 deletions(-)
+
+commit a7210a7ebc3d3ca88643bfbc2f0d660a5553a668
+Author: Arseny Solokha <asolokha@gmx.com>
+Date:  Fri Jan 13 18:52:17 2012 +0100
+
+    Properly initialize globalParams
+
+    Bug 44659
+
+ utils/pdfunite.cc |   4 ++++
+ 1 file changed, 4 insertions(+)
+
+commit baaf93f0e47a1978f9ea80e9394543a25b763d77
+Author: Adrian Johnson <ajohnson@redneon.com>
+Date:  Thu Jan 12 01:05:07 2012 +1030
+
+    configure.ac: print the cairo version required if not found
+
+    Bug 44619
+
+ configure.ac |    9 +++++++--
+ 1 file changed, 7 insertions(+), 2 deletions(-)
+
+commit 9b8b4232587831fdada37de033c272a3c5049c34
+Author: Adrian Johnson <ajohnson@redneon.com>
+Date:  Thu Jan 12 00:26:03 2012 +1030
+
+    cairo: avoid setting huge clip area when printing
+
+    Bug 44002
+
+ poppler/CairoOutputDev.cc |   21 ++++++++++++---------
+ 1 file changed, 12 insertions(+), 9 deletions(-)
+
+commit efe115f22f8f00a2863ef265ad6f4e7cc2e0336c
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Tue Jan 10 23:41:54 2012 +0100
+
+    compile
+
+ poppler/ArthurOutputDev.cc |   1 +
+ 1 file changed, 1 insertion(+)
+
+commit 52d190d8ff962a57a59218f6871c3a63a443ea53
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Tue Jan 10 23:33:40 2012 +0100
+
+    [xpdf303] tiling "merges" from Thomas, using mostly our "old" code
+    instead of xpdf's
+
+ poppler/CairoOutputDev.cc   |   2 +-
+ poppler/CairoOutputDev.h    |   4 ++--
+ poppler/Gfx.cc                     |   45
+ +++++++++++++++++++++++++++++++------------
+ poppler/Gfx.h              |   15 +++++++++------
+ poppler/GfxState.cc        |    5 ++++-
+ poppler/GfxState.h         |    7 ++++---
+ poppler/OutputDev.h        |    3 ++-
+ poppler/PSOutputDev.cc      |   2 +-
+ poppler/PSOutputDev.h      |    2 +-
+ poppler/PreScanOutputDev.cc |  15 +++++++--------
+ poppler/PreScanOutputDev.h  |   2 +-
+ poppler/SplashOutputDev.cc  |   8 ++++++--
+ poppler/SplashOutputDev.h   |   3 ++-
+ splash/Splash.cc           |   32 ++++++++++++++++++++++--------
+ utils/ImageOutputDev.cc     |   2 +-
+ utils/ImageOutputDev.h      |   2 +-
+ 16 files changed, 99 insertions(+), 50 deletions(-)
+
+commit bf75a957650dd5208ecf1f6db1555a3d00b7949c
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Tue Jan 10 23:31:27 2012 +0100
+
+    [xpdf303] Splash::blitTransparent merges from Thomas
+
+ splash/Splash.cc |   10 +++++++---
+ 1 file changed, 7 insertions(+), 3 deletions(-)
+
+commit 296244ab74e56b2781daae0a664617d1da30527c
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Tue Jan 10 23:30:34 2012 +0100
+
+    [xpdf303] Merge xpath Splash stuff from Thomas
+
+ splash/SplashXPath.cc |   22 +++++++++++++---------
+ 1 file changed, 13 insertions(+), 9 deletions(-)
+
+commit e1ae7b900b01db7c7703da68ad94aa9bda1938f6
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Tue Jan 10 23:29:38 2012 +0100
+
+    [xpdf303] Merge splash font stuff from Thomas
+
+ poppler/GlobalParams.cc      |   17 +++++++++++++++++
+ poppler/GlobalParams.h       |    3 +++
+ poppler/SplashOutputDev.cc   |    3 +++
+ poppler/SplashOutputDev.h    |    1 +
+ splash/SplashFTFont.cc       |   34 ++++++++++++++++++++++++++++------
+ splash/SplashFTFont.h       |    1 +
+ splash/SplashFTFontEngine.cc |    7 ++++---
+ splash/SplashFTFontEngine.h  |    5 +++--
+ splash/SplashFontEngine.cc   |    3 ++-
+ splash/SplashFontEngine.h    |    1 +
+ 10 files changed, 63 insertions(+), 12 deletions(-)
+
+commit d46b673c46a72132fb3918b64733be552e35952f
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Tue Jan 10 23:28:43 2012 +0100
+
+    [xpdf303] More merges from Thomas
+
+ splash/Splash.cc | 2800
+ ++++++++++++++++++++++++++++++++++++------------------
+ splash/Splash.h  |   60 ++
+ 2 files changed, 1943 insertions(+), 917 deletions(-)
+
+commit 2cb40bab3b8c49d54c2a49554b30268ccb32899b
+Author: Adrian Johnson <ajohnson@redneon.com>
+Date:  Sun Jan 8 21:35:41 2012 +1030
+
+    Fix typo in pdffonts man page
+
+ utils/pdffonts.1 |    2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 34ae382915d9d9b2b3c015fee3c24907a6b52b8b
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Sat Jan 7 17:14:05 2012 +0100
+
+    xpdf303: Merge some stuff in Splash [Thomas Freitag]
+
+    1. merge the complete pipe changes
+    a) including the overprint implementation from Derek used by pipe
+    b) including the transfer function implementation
+    2. Two changes (not really a merge) to get it compiled under windows
+    (in
+    GlobalParams.cc & PDFDoc.cc)
+    3. merge fill and stroke changes
+    a) including merge of SplashClip.cc
+    b) including merge of SplashXPathScanner.cc
+
+ poppler/GfxState.cc         |   94 ++-
+ poppler/GfxState.h          |   17 +-
+ poppler/GlobalParams.cc      |    7 +
+ poppler/GlobalParams.h       |    3 +
+ poppler/GlobalParamsWin.cc   |    2 +-
+ poppler/PDFDoc.cc           |    2 +-
+ poppler/SplashOutputDev.cc   |  134 +++-
+ poppler/SplashOutputDev.h    |    8 +-
+ splash/Splash.cc            | 1658
+ ++++++++++++++++++++++++++++++------------
+ splash/Splash.h             |   42 +-
+ splash/SplashClip.cc        |   57 +-
+ splash/SplashState.cc       |   49 ++
+ splash/SplashState.h        |   12 +
+ splash/SplashXPathScanner.cc |  474 +++++++-----
+ splash/SplashXPathScanner.h  |   24 +-
+ 15 files changed, 1845 insertions(+), 738 deletions(-)
+
+commit c2378609ae52523beb64e0f040fc79dce4877e03
+Author: Thomas Freitag <thomas.freitag@kabelmail.de>
+Date:  Sat Jan 7 11:47:19 2012 +0100
+
+    regtest: read stderr output before calling wait to fix a possible
+    deadlock
+
+    In the way the scripts starts it subprocesses, stderr becomes buffered
+    for the subprocesses. And unforunately, when the buffer limit is
+    reached, the subprocess suspends it work until it can print again on
+    stderr. That's why the python script runs into a deadlock when the
+    subprocess produces a lot of error messages. A small rearrange of the
+    commands, first read the stderr output and then wait that the
+    subprocess
+    ends, will remove this deadlock.
+
+ regtest/backends/__init__.py |    8 ++++----
+ 1 file changed, 4 insertions(+), 4 deletions(-)
+
+commit da6bfacb0f858f27bd47f247a25d6bc9ab778411
+Author: Adrian Johnson <ajohnson@redneon.com>
+Date:  Sat Jan 7 10:35:17 2012 +1030
+
+    Add -subst option to pdffonts to list the substitute font name
+    and filename
+
+    Bug 44416
+
+ poppler/FontInfo.cc    |    8 ++++--
+ poppler/FontInfo.h     |    2 ++
+ poppler/GlobalParams.cc |   29 ++++++++++++++++++--
+ poppler/GlobalParams.h  |    3 ++-
+ utils/pdffonts.1       |    3 +++
+ utils/pdffonts.cc      |   67
+ +++++++++++++++++++++++++++++++++--------------
+ 6 files changed, 88 insertions(+), 24 deletions(-)
+
+commit 9979b1b3e36dc8085d8c684692fece463fa474b1
+Author: Yi Yang <ahyangyi@gmail.com>
+Date:  Sat Jan 7 09:44:42 2012 +1030
+
+    Include .otf fonts when finding substitute fonts
+
+    Bug 44412
+
+ poppler/GfxFont.cc     |    2 +-
+ poppler/GlobalParams.cc |    2 +-
+ 2 files changed, 2 insertions(+), 2 deletions(-)
+
+commit ebfab832ab4f2642b9ab2ededd25de670a3c7147
+Author: Adrian Johnson <ajohnson@redneon.com>
+Date:  Fri Dec 23 09:55:20 2011 +1030
+
+    autoconf: Check for cairo-ft and other cairo backends
+
+    so that CAIRO_LIBS includes the freetype dependency and pdftocairo
+    includes the dependencies for optional cairo backends.
+
+    Bug 43969
+
+ configure.ac     |   14 ++++++++++++--
+ utils/Makefile.am |   4 ++--
+ 2 files changed, 14 insertions(+), 4 deletions(-)
+
+commit 51ca2b7c7dec5430d29860fd887ad5c5d9b3f574
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Thu Dec 15 00:26:09 2011 +0100
+
+    [xpdf303] Some more changes in TextOutputDev
+
+ poppler/TextOutputDev.cc |   23 ++++++++++++++++-------
+ 1 file changed, 16 insertions(+), 7 deletions(-)
+
+commit c5ce12993a4d2bcd3b3e95b1f08d00dc8960678c
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Wed Dec 14 22:49:33 2011 +0100
+
+    [xpdf303] Merge some stuff from TextOutputDev
+
+    Yes, this is the best commit log i could think of
+
+ poppler/TextOutputDev.cc |  268
+ +++++++++++++++++++++++++++++-----------------
+ poppler/TextOutputDev.h  |   19 ++--
+ 2 files changed, 180 insertions(+), 107 deletions(-)
+
+commit 388d72ac27ae98fe3a1ebd21760f2b0fa0249a9b
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Tue Dec 6 23:21:15 2011 +0100
+
+    include strings.h as we use memcpy
+
+    Fixes bug 43558
+
+ goo/PNGWriter.cc |    3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+commit 743f70f594bf3c9a58d1ff0738b9a2bc3ea03382
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Tue Dec 6 20:27:03 2011 +0100
+
+    xpdf303: Use xpdf method against recursion while parsing
+
+    Ours detected loops correctly, but not "valid" files containing lots
+    of arrays one inside the other [[[[[[[[[[[[[[[[[[[
+    So go to this more crude "fix" used in xpdf
+
+ poppler/Dict.cc   |   4 ++--
+ poppler/Dict.h    |   2 +-
+ poppler/Object.cc |   4 ++--
+ poppler/Object.h  |   8 ++++----
+ poppler/Parser.cc |   32 +++++++++++++++-----------------
+ poppler/Parser.h  |   10 +++-------
+ poppler/XRef.cc   |   33 +++++++--------------------------
+ poppler/XRef.h    |   2 +-
+ 8 files changed, 35 insertions(+), 60 deletions(-)
+
+commit 63c942a45227ef28fb94ef4765171d9812fffafa
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Sun Dec 4 17:29:45 2011 +0100
+
+    Do not fail if we are trying to save a file with Encrypt but that
+    we have not modified at all
+
+    Fixes KDE bug #288045
+
+ poppler/PDFDoc.cc |   49
+ +++++++++++++++++++++++++++++--------------------
+ 1 file changed, 29 insertions(+), 20 deletions(-)
+
+commit 0937d775e59a963b72fa7924e0f7be484f8345fc
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Sun Dec 4 15:37:20 2011 +0100
+
+    update name and copyright
+    (cherry picked from commit 22601c2a64f094ede8085a3ccca3de9daaa556e7)
+
+ utils/pdftocairo.cc |   3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+commit bdb439ac5a751d6146204ae0d61fdbf7828c89c3
+Author: Axel Strübing <axel.struebing@freenet.de>
+Date:  Thu Nov 24 22:32:57 2011 +0100
+
+    Fix typo/regression introduced in
+    f6d026bfa18624ccd321e102bb39ba744998de1e
+
+ poppler/Gfx.cc |    3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+commit 74e11d8c912dd95d235e44e7b34b8ea1be082b9f
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Thu Nov 24 18:54:27 2011 +0100
+
+    Fix typo
+
+ qt4/src/poppler-qt4.h |    4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit ec2a1c3fca92a28c56911729927838f7aacf1078
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Wed Nov 16 23:13:52 2011 +0100
+
+    xpdf303: Use the correct sizeof() for the greallocn
+
+ poppler/XRef.cc |    2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 544440b9d19ce99f3a7fcacdea70999b1efc217f
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Wed Nov 16 23:09:23 2011 +0100
+
+    xpdf303: Add XRef::getPermFlags
+
+ poppler/XRef.h |    1 +
+ 1 file changed, 1 insertion(+)
+
+commit b2e43e531edcecaeacf02a627c98cf7ef57f3e3c
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Wed Nov 16 23:04:04 2011 +0100
+
+    xpdf303: make strToUnsigned "safer"
+
+ poppler/PDFDoc.cc |   11 +++++++----
+ 1 file changed, 7 insertions(+), 4 deletions(-)
+
+commit bd1513742182ed4c80d21401dd30180981879f24
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Wed Nov 16 22:59:12 2011 +0100
+
+    xpdf303: Check xrefEntryCompressed entries to be of correct type
+    and in bounds
+
+ poppler/XRef.cc |    5 +++++
+ 1 file changed, 5 insertions(+)
+
+commit 3bf3e82d1f3eb19a454239d8c7641fc68ff4e462
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Wed Nov 16 22:54:17 2011 +0100
+
+    xpdf303: Adobe apparently ignores the generation number on compressed
+    objects
+
+ poppler/XRef.cc |    2 ++
+ 1 file changed, 2 insertions(+)
+
+commit 73e6f19c4e76762eb5131b168e3b24167ba126cb
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Wed Nov 16 22:29:11 2011 +0100
+
+    xpdf303: Add PDFDoc::fileNameU to windows builds
+
+ poppler/PDFDoc.cc |   43 +++++++++++++++++++++++++++++++++++--------
+ poppler/PDFDoc.h  |   6 ++++++
+ 2 files changed, 41 insertions(+), 8 deletions(-)
+
+commit 65388b1aaf9a78efcf9486d5e2d4bdce76f11194
+Author: Igor Slepchin <igor.slepchin@gmail.com>
+Date:  Tue Nov 15 21:53:40 2011 +0100
+
+    Output images in pdftohtml -xml mode if no -i option is specified.
+
+    Comes with an attached update to pdf2xml.dtd
+
+ utils/HtmlOutputDev.cc |   48
+ ++++++++++++++++++++++++++++++++++++++++--------
+ utils/pdf2xml.dtd     |   22 +++++++++++++++++-----
+ 2 files changed, 57 insertions(+), 13 deletions(-)
+
+commit a4c78946bc1fc3d52152af2e319051050ab05e28
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Mon Nov 14 13:22:53 2011 +0100
+
+    Make GfxColorSpace::parse accept dicts too
+
+ poppler/GfxState.cc |  14 +++++++++++++-
+ 1 file changed, 13 insertions(+), 1 deletion(-)
+
+commit f6d026bfa18624ccd321e102bb39ba744998de1e
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Fri Nov 11 16:37:27 2011 +0100
+
+    Do not crash if failing to parse the colorspace
+
+    Fixes bug 42793
+
+ poppler/Gfx.cc |   52
+ +++++++++++++++++++++++++++++-----------------------
+ 1 file changed, 29 insertions(+), 23 deletions(-)
+
+commit c9da140bb476dcbb3928950ae9b506de82695cd2
+Author: David King <amigadave@amigadave.com>
+Date:  Thu Oct 20 11:31:10 2011 +0200
+
+    glib-demo: Conditionally initialise threading
+
+    In GLib 2.24.0 and above, threading is enabled by default, and the
+    thread initialization functions are deprecated since GLib 2.31.0.
+
+    Fixes bug #42036.
+
+ glib/demo/main.c |    3 +++
+ 1 file changed, 3 insertions(+)
+
+commit a0db250bbdefff6361551cf9db344bd5268fea11
+Author: Vittal Aithal <vittal.aithal@cognidox.com>
+Date:  Wed Nov 9 20:07:58 2011 +0100
+
+    pdfinfo: report page rotation
+
+ utils/pdfinfo.cc |    8 ++++++++
+ 1 file changed, 8 insertions(+)
+
+commit e7dbd17ff07afa465636a90f526cd7ac8c731862
+Author: Kenji Uno <ku@digitaldolphins.jp>
+Date:  Wed Nov 9 12:39:41 2011 +0100
+
+    Fix leak in GooString when resizing
+
+    If resizing from "long" to shorter
+
+ goo/GooString.cc |    3 +++
+ 1 file changed, 3 insertions(+)
+
+commit 6a4f0c32b6723b127034d59a34bf076942e9935f
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Sun Nov 6 15:44:06 2011 +0100
+
+    regtest: Skip tests with results when creating refs
+
+    Not only tests that have md5, but also crashed or failed tests.
+
+ regtest/TestReferences.py    |    4 ++--
+ regtest/backends/__init__.py |    3 +++
+ 2 files changed, 5 insertions(+), 2 deletions(-)
+
+commit eab952d121c7ab88a0d41587cfa449c0978bea04
+Author: Pino Toscano <pino@kde.org>
+Date:  Thu Nov 3 21:58:11 2011 +0100
+
+    qt4: remove unused variable
+
+ qt4/src/poppler-embeddedfile.cc |    1 -
+ 1 file changed, 1 deletion(-)
+
+commit 85615f04e040dd38792533a4522e437644e97548
+Author: Pino Toscano <pino@kde.org>
+Date:  Thu Nov 3 16:15:40 2011 +0100
+
+    qt4: get rid of the own F and Ff flags reading
+
+    no more useful now, as they are available either directly or as
+    parsed values in both Annot and FormField
+
+ qt4/src/poppler-form.cc   |   16 ----------------
+ qt4/src/poppler-private.h |   4 +---
+ 2 files changed, 1 insertion(+), 19 deletions(-)
+
+commit 43347b43eeb66b5c8dc9637c36436baacc626bc4
+Author: Pino Toscano <pino@kde.org>
+Date:  Thu Nov 3 16:10:57 2011 +0100
+
+    qt4: use the flags of the associated Annot object
+
+ qt4/src/poppler-form.cc |    2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 6c9492202de9b3b43da9eac3e40dc7fe218f21da
+Author: Pino Toscano <pino@kde.org>
+Date:  Thu Nov 3 16:03:11 2011 +0100
+
+    qt4: remove old commented code
+
+ qt4/src/poppler-form.cc |    1 -
+ 1 file changed, 1 deletion(-)
+
+commit f0eca54131f7cdf6c1e0e78a18be0bf642567af4
+Author: Pino Toscano <pino@kde.org>
+Date:  Thu Nov 3 15:46:33 2011 +0100
+
+    qt4: use the quadding read already in FormField
+
+    ... instead of reading it again
+
+ qt4/src/poppler-form.cc |   24 ++++++++----------------
+ 1 file changed, 8 insertions(+), 16 deletions(-)
+
+commit d92bce1ae87d2f351bb1b972c64466502fb212aa
+Author: Pino Toscano <pino@kde.org>
+Date:  Thu Nov 3 15:30:45 2011 +0100
+
+    qt4: include <QFile>
+
+ qt4/src/poppler-private.h |   1 +
+ 1 file changed, 1 insertion(+)
+
+commit 955cd0c7bd3a72340deba098f4242a4904adc60f
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Wed Nov 2 20:20:41 2011 +0100
+
+    Compile with MSVC needed for last change in the qt4 frontend
+
+ CMakeLists.txt |    1 +
+ 1 file changed, 1 insertion(+)
+
+commit e0f5bc1deebaa9861baffd7c9ba31ea31585cd1d
+Author: Hib Eris <hib@hiberis.nl>
+Date:  Tue Nov 1 14:15:09 2011 +0100
+
+    qt4: Use PDFDoc(wchar_t *, ...) on Windows
+
+    Bug 35378
+
+ qt4/src/poppler-document.cc |   6 +++---
+ qt4/src/poppler-private.h   |  17 +++++++++++++++--
+ 2 files changed, 18 insertions(+), 5 deletions(-)
+
+commit 52c1e9c5109299255d13b5b1e7d3eedaab512084
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Tue Nov 1 14:13:10 2011 +0100
+
+    regtest: Add --update-refs command line option to run-tests command
+
+    It allows to update the references of failing tests.
+
+ regtest/TestRun.py           |    2 +-
+ regtest/backends/__init__.py  |   34 ++++++++++++++++++++++++++++++++--
+ regtest/commands/run-tests.py |    4 ++++
+ 3 files changed, 37 insertions(+), 3 deletions(-)
+
+commit b4896a416b1df14a81b944b3c577fec85c9c7f7d
+Author: Rex Dieter <rdieter@math.unl.edu>
+Date:  Tue Nov 1 09:40:53 2011 +0100
+
+    Fix pkg-config files
+
+    We were using $FOO_REQUIRED instead of @FOO_REQUIRED@
+
+ configure.ac                  |    1 +
+ poppler-glib-uninstalled.pc.in |    2 +-
+ poppler-glib.pc.cmake         |    2 +-
+ poppler-glib.pc.in            |    2 +-
+ 4 files changed, 4 insertions(+), 3 deletions(-)
+
+commit 53f1b0c5edfdbef817bff31566893ac4e111516a
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Sun Oct 30 16:02:19 2011 +0100
+
+    pdftocairo: Make sure beginDocument() is always called
+
+    This fixes a crash when rendering only odd/even pages in a printing
+    format.
+
+ utils/pdftocairo.cc |   4 ++++
+ 1 file changed, 4 insertions(+)
+
+commit 8b0dfe9537082eaccd982530f1eddc2fcfc92f8e
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Thu Oct 27 19:58:31 2011 +0200
+
+    xpdf303: Use splashDist instead of splashSqrt and USE_FIXEDPOINT
+    enhacements
+
+ splash/SplashFTFont.cc |   70
+ +++++++++++++++++++++++++++++++++++++++++++-----
+ splash/SplashFTFont.h |    2 +-
+ 2 files changed, 65 insertions(+), 7 deletions(-)
+
+commit b021bce2583c8e1e3a4c129106d80e7a4e223600
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Thu Oct 27 19:54:22 2011 +0200
+
+    xpdf303: wops, make it compile
+
+ poppler/Lexer.cc |    2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 76295f4d401c36bdef3b2a20d18ac57a3b976410
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Thu Oct 27 19:42:42 2011 +0200
+
+    xpdf303: Adopt xpdf solution for the name too long problem
+
+ poppler/Lexer.cc |   37 +++++++++++++++++--------------------
+ 1 file changed, 17 insertions(+), 20 deletions(-)
+
+commit be6d4c19b8ce1515ce995eee408dc5752012c649
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Thu Oct 27 19:34:38 2011 +0200
+
+    xpdf303: Add brackets
+
+ poppler/Lexer.cc |    6 ++++--
+ 1 file changed, 4 insertions(+), 2 deletions(-)
+
+commit 904ae1385e93155a55008977c89aa664b7c8cb9b
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Wed Oct 26 14:22:28 2011 +0200
+
+    Expose POPPLER_VERSION in poppler-config.h
+
+ configure.ac                  |    3 +++
+ poppler/poppler-config.h.cmake |    5 +++++
+ poppler/poppler-config.h.in   |    5 +++++
+ 3 files changed, 13 insertions(+)
+
+commit aa83d4fe942ef0685c5990ddf3eccc2fbdf82292
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Thu Oct 20 00:59:57 2011 +0200
+
+    xpdf303: Add readFromStream
+
+ poppler/GfxFont.cc |   6 ++++++
+ 1 file changed, 6 insertions(+)
+
+commit 74d771d58a4d1868669117709eb6811ec28bf840
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Thu Oct 20 00:56:58 2011 +0200
+
+    xpdf303: Add base14SubstFonts
+
+ poppler/GfxFont.cc |  24 ++++++++++++++++++++++++
+ 1 file changed, 24 insertions(+)
+
+commit 71260f987161d5b122caced6af14e9d64be46e4d
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Thu Oct 20 00:55:42 2011 +0200
+
+    xpdf303: GfxFontLoc implementation
+
+ poppler/GfxFont.cc |  20 ++++++++++++++++++++
+ 1 file changed, 20 insertions(+)
+
+commit 586430137985fd303ce87bdb9b902ee9a01341e8
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Thu Oct 20 00:54:09 2011 +0200
+
+    xpdf303: More stuff into base14FontMap
+
+ poppler/GfxFont.cc |  16 +++++++++++++++-
+ 1 file changed, 15 insertions(+), 1 deletion(-)
+
+commit c0affb1845c339f89ca67608cb9fd9134ff902f5
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Thu Oct 20 00:51:31 2011 +0200
+
+    xpdf303: GfxFont::getOrignName/getName rework
+
+ poppler/FontInfo.cc     |    4 ++--
+ poppler/GfxFont.cc      |    4 ----
+ poppler/GfxFont.h       |    6 +-----
+ poppler/PSOutputDev.cc   |    8 ++++----
+ poppler/TextOutputDev.cc |    5 ++---
+ 5 files changed, 9 insertions(+), 18 deletions(-)
+
+commit c5c513b5b72e03f6f0a94d04f7d8a22fe9bdaa80
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Thu Oct 20 00:45:30 2011 +0200
+
+    xpdf303: GfxFontLoc
+
+ poppler/GfxFont.h |   35 +++++++++++++++++++++++++++++++++++
+ 1 file changed, 35 insertions(+)
+
+commit 4ec5e5e6d4785eb7a60744ae7e33c7ba3f603e8e
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Thu Oct 20 00:34:10 2011 +0200
+
+    xpdf303: StdFontMapEntry renaming
+
+ poppler/GfxFont.cc |  26 +++++++++++---------------
+ poppler/GfxFont.h  |   2 ++
+ 2 files changed, 13 insertions(+), 15 deletions(-)
+
+commit e71088dc5087303b1ae5f3e72af287ec4e0a1342
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Mon Oct 17 13:42:06 2011 +0200
+
+    remove useless #if
+
+ poppler/Page.cc |    4 +---
+ 1 file changed, 1 insertion(+), 3 deletions(-)
+
+commit 40b56994dda79653c902977423f349efa55cf21e
+Author: Adrian Johnson <ajohnson@redneon.com>
+Date:  Mon Oct 17 20:33:03 2011 +1030
+
+    utils: Add GooString arg to parseargs and use for paths in pdftocairo
+
+    <sys/param.h> and MAXPATHLEN is not available on windows. Avoid the
+    need to know the max path length by using GooString for the path.
+
+ utils/parseargs.cc  |  12 ++++++++++++
+ utils/parseargs.h   |   2 ++
+ utils/pdftocairo.cc |  17 ++++++++---------
+ 3 files changed, 22 insertions(+), 9 deletions(-)
+
+commit 4bb34757dbbff780baba053371274c05b29771e1
+Author: Adrian Johnson <ajohnson@redneon.com>
+Date:  Mon Sep 19 21:11:44 2011 +0930
+
+    cairo: fix setSoftMask bugs
+
+    - Getting the clip extents in device space requires transforming all
+      four corners of the clip extents and translating by the group device
+      offset other wise the device extents will not be correct for rotated
+      ctm.
+
+    - Adjust matrix to include translation of the clip extents origin
+      since the mask surface does not start at (0,0).
+
+    - the ctm when called cairo_mask() needs to be the same as the
+    ctm when
+      the mask was created.
+
+    - implement transfer function in setSoftMask
+
+    Bug 41005
+
+ poppler/CairoOutputDev.cc |   97
+ ++++++++++++++++++++++++++++-----------------
+ poppler/CairoOutputDev.h  |   6 ++-
+ 2 files changed, 65 insertions(+), 38 deletions(-)
+
+commit 50adbed183e9bf70eb4c41e8858cf464c3042e45
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Sun Oct 16 12:40:27 2011 +0200
+
+    Remove poppler-cairo dependency from poppler-glib pkg-config file
+
+    poppler-glib links to poppler-cairo statically, so it doesn'tm
+    depend on
+    the dynamic library.
+
+ CMakeLists.txt                        |    1 -
+ configure.ac                  |    2 --
+ poppler-glib-uninstalled.pc.in |    2 +-
+ poppler-glib.pc.cmake         |    2 +-
+ poppler-glib.pc.in            |    2 +-
+ 5 files changed, 3 insertions(+), 6 deletions(-)
+
+commit acd8ecc9121db58851f73764f046a4f54bd80581
+Author: Adrian Johnson <ajohnson@redneon.com>
+Date:  Sat Oct 8 15:03:24 2011 +1030
+
+    ps: fix uncolored tiling patterns
+
+    Uncolored patterns and type 3 chars must not use color setting
+    operators. When emitting an uncolored pattern:
+     - disable the update color space functions
+     - disable the update color functions
+     - set pdfLastFill and pdfLastStroke to true to ensure the the sCol
+       and fCol procedures that is used by some of the PS procedures that
+       emulate PDF operators do not update the color.
+
+    Bug 41462
+
+ poppler/PSOutputDev.cc |   41 +++++++++++++++++++++++++++++++++++++++++
+ poppler/PSOutputDev.h |    1 +
+ 2 files changed, 42 insertions(+)
+
+commit 6e1326b11f98f2b277e53a6cdbcb373ce6c29958
+Author: Adrian Johnson <ajohnson@redneon.com>
+Date:  Fri Oct 7 20:29:36 2011 +1030
+
+    ps: emit non repeating patterns in PSOutput with inType3Char = true
+
+    instead of falling back to Gfx. This avoids emitting the image data
+    twice.
+
+ poppler/PSOutputDev.cc |   23 +++++++++++++++++++++++
+ 1 file changed, 23 insertions(+)
+
+commit ed05fcb8c442b716c5e382c98f2625701926c86a
+Author: Adrian Johnson <ajohnson@redneon.com>
+Date:  Sat Oct 1 20:19:19 2011 +0930
+
+    ps: fix tiling pattern fill matrix
+
+    In PS the pattern matrix maps the pattern space to user space. In PDF
+    the pattern matrix maps the pattern space to the default ctm of the
+    content stream (baseMatrix in Gfx). The matrix mat already contains
+    the
+    correct pattern->baseMatrix so use it instead of pmat.
+
+    Bug 41374
+
+ poppler/PSOutputDev.cc |    9 ++-------
+ 1 file changed, 2 insertions(+), 7 deletions(-)
+
+commit 087757866de13b6164967a1d241d3c0e47065f1a
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Thu Oct 13 12:18:52 2011 +0200
+
+    xpdf303: Merge SplashT1Font::getGlyphPath changes
+
+ splash/SplashT1Font.cc |   39 +++++++++++++++++++++------------------
+ 1 file changed, 21 insertions(+), 18 deletions(-)
+
+commit c84f46ee16a8dcc6e2cad2359df621cc6cdb8fa5
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Thu Oct 13 12:16:14 2011 +0200
+
+    xpdf303: Add GBool type1 to SplashFTFontFile
+
+ splash/SplashFTFontFile.cc |   9 +++++----
+ splash/SplashFTFontFile.h  |   3 ++-
+ 2 files changed, 7 insertions(+), 5 deletions(-)
+
+commit d845da2c3c1acbeaa4b9bb3125f9143e785210ff
+Author: Yury G. Kudryashov <urkud.urkud@gmail.com>
+Date:  Thu Oct 6 14:49:19 2011 +0200
+
+    Okular moved to git, fix docs
+
+    Fix URLs in poppler-qt4 documentation
+
+ qt4/src/Mainpage.dox |    6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
+
+commit bb40c980f7ab7a6eb9735af17103f87bc65893d6
+Author: Yury G. Kudryashov <urkud.urkud@gmail.com>
+Date:  Thu Oct 6 14:49:08 2011 +0200
+
+    Explicitly include fontconfig include dir
+
+    This fixes cmake-driven build on systems where fontconfig is
+    installed in
+    non-standard location.
+
+ CMakeLists.txt |    1 +
+ 1 file changed, 1 insertion(+)
+
+commit 776ca137984556530ba938265714934bdc3d6443
+Author: Yury G. Kudryashov <urkud.urkud@gmail.com>
+Date:  Thu Oct 6 14:48:46 2011 +0200
+
+    Fix typo in cmake option documentation
+
+    Relocatable build does *not* (was missing in docs) hardcode library
+    location.
+
+ CMakeLists.txt |    2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit ab8616dcb637ac1aeb4d5f142c3c4bff9aecd041
+Author: Adrian Johnson <ajohnson@redneon.com>
+Date:  Thu Oct 6 14:21:10 2011 +0200
+
+    close the file or flush stdout
+
+ utils/pdftocairo.cc |   2 ++
+ 1 file changed, 2 insertions(+)
+
+commit 72c2d563684ab6937a98a0c1c79be3639d29c9ce
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Tue Oct 4 17:46:11 2011 +0200
+
+    xpdf303: Make sure array length is > 0
+
+    This is not scritcly necessary since Array::get already returns a
+    null object in case
+    the index is out of range but let's merge it for the sake of being
+    more closer to xpdf
+
+ poppler/GfxState.cc |   2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit c814c2452c7f60623fdd0fee6f915adeaf5b49e3
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Tue Oct 4 17:40:27 2011 +0200
+
+    xpdf303: Limit recursion in GfxColorSpace parsing
+
+    I think we could do it better, but it'd take more time and it's not
+    what we are doing in this branch anyway
+
+ poppler/GfxState.cc |  43 +++++++++++++++++++++++++++----------------
+ poppler/GfxState.h  |  14 +++++++-------
+ 2 files changed, 34 insertions(+), 23 deletions(-)
+
+commit 0e53ba5709296dc2ba1399f885af200d2041f0cd
+Author: Glad Deschrijver <glad.deschrijver@gmail.com>
+Date:  Sat Oct 1 15:41:51 2011 +0200
+
+    qt4: Add the option of PSConverter creating EPS
+
+ qt4/src/poppler-ps-converter.cc |    3 ++-
+ qt4/src/poppler-qt4.h          |    6 ++++--
+ 2 files changed, 6 insertions(+), 3 deletions(-)
+
+commit 04e271a0c10807c9c3967daa1f656e87b97b9901
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Sat Oct 1 14:34:50 2011 +0200
+
+    Fix typo in documentation
+
+    Reported by Glad Deschrijver
+    (cherry picked from commit 1346caac6c564035d368617a329b361d0253fbf6)
+
+ qt4/src/poppler-qt4.h |    2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 9855529e8e1a83c6d77a9e4221ea2132d44e9fb1
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Sat Oct 1 14:27:44 2011 +0200
+
+    Remove space after % as it confuses libspectre
+
+    Discussed with Adrian Johnson
+    Problem found by Glad Deschrijver
+
+ poppler/PSOutputDev.cc |    4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 8e8cde6f374b59222d834e2e7f08fb4a6a4d55a5
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Wed Sep 28 23:32:24 2011 +0200
+
+    xpdf303: More manpage merging
+
+ utils/pdftotext.1 |   9 +++++----
+ 1 file changed, 5 insertions(+), 4 deletions(-)
+
+commit f798f00c9ec55bff2eb93938424c436ba2663e7a
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Wed Sep 28 23:30:55 2011 +0200
+
+    xpdf303: mention pdfdetach in non xpdf tools
+
+ utils/pdftocairo.1 |   1 +
+ utils/pdftohtml.1  |   1 +
+ 2 files changed, 2 insertions(+)
+
+commit 3fc46ac1c046460ccf46ba4b8a92f728e775694a
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Wed Sep 28 23:30:00 2011 +0200
+
+    xpdf303: Fix pdfdetach man page references
+
+ utils/pdfdetach.1 |   14 ++++++--------
+ 1 file changed, 6 insertions(+), 8 deletions(-)
+
+commit 79e1d77fb00a7c7f0bda4ae76328c4211c7f16e6
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Wed Sep 28 23:27:53 2011 +0200
+
+    xpdf303: Merge some more manpages
+
+ utils/pdfinfo.1  |   15 +++++++++++----
+ utils/pdftoppm.1 |    9 +++++----
+ 2 files changed, 16 insertions(+), 8 deletions(-)
+
+commit 841c96be59ddad32f51d4d114ba1dcc42285ab55
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Wed Sep 28 23:23:25 2011 +0200
+
+    xpdf303: Merge some man pages
+
+ utils/pdffonts.1  |   9 +++++----
+ utils/pdfimages.1 |   9 +++++----
+ utils/pdftops.1   |   9 +++++----
+ 3 files changed, 15 insertions(+), 12 deletions(-)
+
+commit d2706a05513134f961e2500e0e596f2769707ce5
+Author: Adrian Johnson <ajohnson@redneon.com>
+Date:  Wed Sep 28 21:20:23 2011 +0930
+
+    cairo: fix crash when using poppler_page_get_image()
+
+ poppler/CairoOutputDev.h |    1 +
+ 1 file changed, 1 insertion(+)
+
+commit 0c0591fa23441c54c9443072615273ea65482d76
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Tue Sep 27 00:45:59 2011 +0200
+
+    0.18.0
+
+ CMakeLists.txt      |   6 +--
+ NEWS               |   14 +++++++
+ configure.ac       |    4 +-
+ cpp/Doxyfile       |    2 +-
+ gtk-doc.make       |  102
+ +++++++++++++++++++++------------------------------
+ poppler/Makefile.am |   2 +-
+ qt4/src/Doxyfile    |   2 +-
+ 7 files changed, 64 insertions(+), 68 deletions(-)
+
+commit 19f5db7acd64330d198f18695175df02141794d7
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Tue Sep 27 00:15:15 2011 +0200
+
+    Update Carlos (C) year
+
+ poppler/Gfx.cc |    2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 6d34d4af90b8b41360de4dabb000bbcc894775d0
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Tue Sep 27 00:09:54 2011 +0200
+
+    Rename pdfmerge and pdfextract
+
+    To pdfunite and pdfseparate, the old names were taken
+
+ utils/.gitignore     |    4 +-
+ utils/CMakeLists.txt |   28 ++++----
+ utils/Makefile.am    |   16 ++---
+ utils/pdfextract.1   |   49 --------------
+ utils/pdfextract.cc  |  115 ---------------------------------
+ utils/pdfmerge.1     |   33 ----------
+ utils/pdfmerge.cc    |  176
+ --------------------------------------------------
+ utils/pdfseparate.1  |   49 ++++++++++++++
+ utils/pdfseparate.cc |  115 +++++++++++++++++++++++++++++++++
+ utils/pdfunite.1     |   33 ++++++++++
+ utils/pdfunite.cc    |  176
+ ++++++++++++++++++++++++++++++++++++++++++++++++++
+ 11 files changed, 397 insertions(+), 397 deletions(-)
+
+commit baf54c2876edd476ffc68da6518598847bb7ec8a
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Mon Sep 26 15:54:46 2011 +0200
+
+    Remove getRawStream
+
+    Since it does exactly the same as getNextStream
+
+ poppler/DCTStream.h    |    1 -
+ poppler/Stream.h       |    1 -
+ utils/HtmlOutputDev.cc  |    7 ++-----
+ utils/ImageOutputDev.cc |    9 +++------
+ 4 files changed, 5 insertions(+), 13 deletions(-)
+
+commit bba57e588fd1ee3a61f18405d1d1bf89fceb5b96
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Sun Sep 25 12:21:02 2011 +0200
+
+    xpdf303: Added the pdfdetach tool
+
+    I haven't merged xpdf code for embedded files, I think our
+    implementation is better and more complete. I've adapated pdfdetach
+    code to use our code and return also embedded files of file attachment
+    annotations to match what xpdf does.
+
+ poppler/FileSpec.cc  |   22 ++++
+ poppler/FileSpec.h   |    3 +
+ utils/CMakeLists.txt |    9 ++
+ utils/Makefile.am    |    6 +
+ utils/pdfdetach.1    |  105 +++++++++++++++++
+ utils/pdfdetach.cc   |  318
+ ++++++++++++++++++++++++++++++++++++++++++++++++++
+ 6 files changed, 463 insertions(+)
+
+commit f62c2f002c782d3a7887525f031d266aca6eb582
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Sat Sep 24 11:20:13 2011 +0200
+
+    xpdf303: Parse ActualText in Gfx instead of output devices
+
+    Remove beginMarkedContent and endMarkedcontent and add beginActualText
+    and endActualText. ActualText is parsed in Gfx, that already
+    handles the
+    marked content stack, so that text output dev doesn't need to
+    handle it
+    too. The text string is passed to beginActualText(). This change
+    is not
+    an exact merge of xpdf code, I've tried to keep our implementation.
+
+ poppler/CairoOutputDev.cc |   8 +--
+ poppler/CairoOutputDev.h  |   6 +-
+ poppler/Gfx.cc                   |   40 +++++++++----
+ poppler/OutputDev.cc     |    6 --
+ poppler/OutputDev.h      |    4 +-
+ poppler/TextOutputDev.cc  |  145
+ +++++++++++++++++++--------------------------
+ poppler/TextOutputDev.h   |   21 ++++---
+ 7 files changed, 108 insertions(+), 122 deletions(-)
+
+commit a097447ed13cb021003425f85597e2628935feb2
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Sat Sep 24 09:43:05 2011 +0200
+
+    Use new error syntax in pdfextract
+
+ utils/pdfextract.cc |   2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 718c735aed540aa49b8dde250ca886c6ad93f5b6
+Merge: 6721916 69707f0
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Sat Sep 24 09:38:52 2011 +0200
+
+    Merge branch 'master' into xpdf303merge
+
+commit 69707f0a9b5a94c80817039db943fb4f26e743e3
+Author: Adrian Johnson <ajohnson@redneon.com>
+Date:  Mon Sep 19 22:00:34 2011 +0930
+
+    Update .gitignore
+
+ regtest/.gitignore |   1 +
+ utils/.gitignore   |   2 ++
+ 2 files changed, 3 insertions(+)
+
+commit 0de477817e424078cfcfcae114e7745809f0848d
+Author: Adrian Johnson <ajohnson@redneon.com>
+Date:  Mon Sep 19 21:57:07 2011 +0930
+
+    utils: Add Glyph & Cog copyright to pdfmerge and pdfextract man pages
+
+ utils/pdfextract.1 |   3 ++-
+ utils/pdfmerge.1   |   3 ++-
+ 2 files changed, 4 insertions(+), 2 deletions(-)
+
+commit ce7372db64ee807dc2b491e121fbe557dbf697e8
+Author: Adrian Johnson <ajohnson@redneon.com>
+Date:  Mon Sep 19 22:04:27 2011 +0930
+
+    regtest: render cairo at 72ppi
+
+    For consistency with splash. It is faster and easier to compare with
+    splash results.
+
+ regtest/backends/cairo.py |   4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 6cf7330089c4dcc1099906d9c37c3607a2a1eeba
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Mon Sep 19 18:42:35 2011 +0200
+
+    regtest: Ignore checksums of crashed, failed and stderr files
+
+    They shouldn't have a checksum, but it might happen with md5 files
+    generated with previous versions.
+
+ regtest/backends/__init__.py |    6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
+
+commit 6512bf1c5dab37058460882fec3407b396830981
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Sun Sep 18 18:38:32 2011 +0200
+
+    Render at 72 instead of 150, it's faster :D
+
+ regtest/backends/splash.py |   4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit b828f63ed3896a22f3fe7ddbe2ec2f549d7a2c62
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Sun Sep 18 18:20:47 2011 +0200
+
+    install pdfextract and pdfmerge manpages
+
+ utils/CMakeLists.txt |    2 ++
+ 1 file changed, 2 insertions(+)
+
+commit 986759dfbe85998c85ee9b0825c7522395567531
+Author: Thomas Freitag <Thomas.Freitag@kabelmail.de>
+Date:  Sun Sep 18 18:19:30 2011 +0200
+
+    pdfextract and pdfmerge man pages
+
+ utils/Makefile.am  |   2 ++
+ utils/pdfextract.1 |  48
+ ++++++++++++++++++++++++++++++++++++++++++++++++
+ utils/pdfmerge.1   |  32 ++++++++++++++++++++++++++++++++
+ 3 files changed, 82 insertions(+)
+
+commit 90da1af542fd7f3cecef31b15da6971345b38209
+Author: Thomas Freitag <Thomas.Freitag@kabelmail.de>
+Date:  Sun Sep 18 18:19:04 2011 +0200
+
+    Complain if %d is not present and it should
+
+ utils/pdfextract.cc |   4 ++++
+ 1 file changed, 4 insertions(+)
+
+commit 40e066a84ddb3a5c41805c095659af5f5704d6d8
+Author: suzuki toshiya <mpsuzuki@hiroshima-u.ac.jp>
+Date:  Sun Sep 18 18:16:14 2011 +0200
+
+    qt_subdir is unneeded
+
+ Makefile.am |   2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 6721916c92d720947b3285c85fdbe6610c6bf013
+Merge: 8456a6e e23f6b9
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Sun Sep 18 16:31:10 2011 +0200
+
+    Merge branch 'master' into xpdf303merge
+
+    Conflicts:
+       poppler/Gfx.cc
+
+commit e23f6b9cade804136bd4bb58182f4fe0b072fbf2
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Sun Sep 18 16:27:50 2011 +0200
+
+    regtest: Do not create checksums for crashed, failed and stderr files
+
+ regtest/backends/__init__.py |   12 +++++++++++-
+ 1 file changed, 11 insertions(+), 1 deletion(-)
+
+commit 110b8be1d9f2694b42bd12dcb6af02bfca9866dd
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Sun Sep 18 16:26:58 2011 +0200
+
+    Fix memory leak
+
+ poppler/Gfx.cc |    3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+commit 8456a6e1354126dc98357fb806595bd3bc198522
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Sun Sep 18 16:07:54 2011 +0200
+
+    xpdf303: Add OCDisplayNode
+
+    It's not used by poppler yet, but we might want to use it from the
+    frontends after the merge.
+
+ poppler/OptionalContent.cc |  127
+ ++++++++++++++++++++++++++++++++++++++++++++
+ poppler/OptionalContent.h  |  36 ++++++++++++-
+ 2 files changed, 162 insertions(+), 1 deletion(-)
+
+commit 06c6660dc9fe326f185ff323e643af6714b32ec8
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Sun Sep 18 15:08:44 2011 +0200
+
+    xpdf303: Parse usage dictionary of optional content groups
+
+ poppler/OptionalContent.cc |  28 ++++++++++++++++++++++++++++
+ poppler/OptionalContent.h  |  14 +++++++++++++-
+ 2 files changed, 41 insertions(+), 1 deletion(-)
+
+commit 528d5b0d40302b3fee3aec69b85bdd1daa4db568
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Sun Sep 18 14:03:36 2011 +0200
+
+    xpdf303: Image XObjects can have a OC entry too
+
+ poppler/Gfx.cc |   11 ++++++++++-
+ 1 file changed, 10 insertions(+), 1 deletion(-)
+
+commit c40353d3bb761f5be8ddbd2bf5341e83901fb132
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Sun Sep 18 13:32:07 2011 +0200
+
+    xpdf303: OC entry is specific to form XObjects
+
+ poppler/Gfx.cc |   17 +++++++++--------
+ 1 file changed, 9 insertions(+), 8 deletions(-)
+
+commit 6ddb51d81b064346dc85d2ae72570a956a184d74
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Sun Sep 18 12:59:28 2011 +0200
+
+    xpdf303: The spec doesn't say OC must be null or ref
+
+ poppler/Annot.cc |    5 +----
+ poppler/Gfx.cc   |   22 +++++++---------------
+ 2 files changed, 8 insertions(+), 19 deletions(-)
+
+commit 434bb9b38319edc7282be22044bd7761403a38a6
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Sun Sep 18 12:45:12 2011 +0200
+
+    xpdf303: OC entry can be an optional content group too
+
+    Not only an optional content membership dictionary.
+
+ poppler/OptionalContent.cc |  10 ++++++++++
+ 1 file changed, 10 insertions(+)
+
+commit 56410b80fdabb99e2de0c6589de6ee745936c523
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Sun Sep 18 12:44:02 2011 +0200
+
+    xpdf303: Not finding an oc group is not necessarily a syntax error
+
+ poppler/OptionalContent.cc |   2 --
+ 1 file changed, 2 deletions(-)
+
+commit 4bb4439450e342479375cb56d10561457475bd13
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Sun Sep 18 12:42:15 2011 +0200
+
+    xpdf303: Fix check of OptionalContentGroup::getState()
+
+    We use an enum, not a boolean.
+
+ poppler/OptionalContent.cc |   2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit d737e3098e02e46525c0edf2165462e03ac7a0e6
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Sun Sep 18 11:36:11 2011 +0200
+
+    xpdf303: Add support for visibility expressions in OptContent
+
+ poppler/OptionalContent.cc |  113
+ ++++++++++++++++++++++++++++++++++----------
+ poppler/OptionalContent.h  |   3 +-
+ 2 files changed, 91 insertions(+), 25 deletions(-)
+
+commit 258d56ba85902a8ab50eec3fe66dd6425226fa59
+Merge: 72a7736 12c6239
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Sun Sep 18 11:12:38 2011 +0200
+
+    Merge branch 'master' into xpdf303merge
+
+commit 12c6239ca4f1f6a5de72aebd755f9d1354ea5837
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Sun Sep 18 11:08:06 2011 +0200
+
+    regtest: Fix checksum check for tests containing spaces in filename
+
+ regtest/backends/__init__.py |    2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 72a7736389cbe36c1f8a526f1a659cae1a3f85a3
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Sun Sep 18 10:47:51 2011 +0200
+
+    xpdf303: No need to cache optContentConfig object in Annot
+
+ poppler/Annot.cc |    2 +-
+ poppler/Annot.h  |    2 --
+ 2 files changed, 1 insertion(+), 3 deletions(-)
+
+commit 93ba92db0a3af35f197a4faa5a528af98ea0f624
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Wed Sep 14 00:58:44 2011 +0200
+
+    Make it work with Python3
+
+ regtest/Config.py              |    4 ++--
+ regtest/TestReferences.py      |    8 ++++----
+ regtest/TestRun.py             |   32 ++++++++++++++++----------------
+ regtest/Timer.py               |    8 ++++----
+ regtest/backends/__init__.py   |   12 ++++++------
+ regtest/commands/__init__.py   |    6 +++---
+ regtest/commands/create-refs.py |    2 +-
+ regtest/commands/run-tests.py  |    2 +-
+ regtest/main.py                |    2 +-
+ 9 files changed, 38 insertions(+), 38 deletions(-)
+
+commit da1b5437148e1e6317246b16f7235c8bc280be97
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Tue Sep 13 20:09:56 2011 +0200
+
+    regtest: Add a way to skip files
+
+    A new command line option --skip has been added to give a file
+    with the
+    list of test to skip. When --skip is not used, it look for a file
+    named
+    Skipped in the tests dir. Lines starting with '#' are considered
+    comments and are ignored.
+
+ regtest/TestReferences.py |   9 +++++++--
+ regtest/TestRun.py       |    9 +++++++--
+ regtest/Utils.py         |   20 ++++++++++++++++++++
+ regtest/main.py          |    6 +++++-
+ 4 files changed, 39 insertions(+), 5 deletions(-)
+
+commit b730b2c1d9666f62f940762663c8318e64049d61
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Tue Sep 13 19:04:04 2011 +0200
+
+    regtest: Limit the number of arguments to 1
+
+    It's easier to run poppler-regtest more than once if you need to run
+    different tests.
+
+ regtest/commands/create-refs.py |   24 ++++++++++++------------
+ regtest/commands/run-tests.py  |   26 +++++++++++++-------------
+ regtest/main.py                |    2 +-
+ 3 files changed, 26 insertions(+), 26 deletions(-)
+
+commit 5ce045d0358318859c844340c639483485b69c58
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Tue Sep 13 18:18:21 2011 +0200
+
+    regtest: Sort tests before create-refs/run-tests and show progress
+
+ regtest/TestReferences.py |   20 ++++++++------------
+ regtest/TestRun.py       |   21 ++++++++++-----------
+ regtest/Utils.py         |   35 +++++++++++++++++++++++++++++++++++
+ 3 files changed, 53 insertions(+), 23 deletions(-)
+
+commit 10801b6faee9037af054fe74cc4a03620ea41d45
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Mon Sep 12 20:13:17 2011 +0200
+
+    Add initial poppler regressions test program
+
+ regtest/Config.py              |   32 ++++++
+ regtest/TestReferences.py      |   73 +++++++++++++
+ regtest/TestRun.py             |  156 +++++++++++++++++++++++++++
+ regtest/Timer.py               |   73 +++++++++++++
+ regtest/backends/__init__.py   |  220
+ +++++++++++++++++++++++++++++++++++++++
+ regtest/backends/cairo.py      |   39 +++++++
+ regtest/backends/postscript.py  |   35 +++++++
+ regtest/backends/splash.py     |   39 +++++++
+ regtest/backends/text.py       |   48 +++++++++
+ regtest/commands/__init__.py   |   93 +++++++++++++++++
+ regtest/commands/create-refs.py |   65 ++++++++++++
+ regtest/commands/run-tests.py  |   69 ++++++++++++
+ regtest/main.py                |   77 ++++++++++++++
+ regtest/poppler-regtest        |    6 ++
+ 14 files changed, 1025 insertions(+)
+
+commit 245e331a14e11a615bf47abbeb34a3561e393b41
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Mon Sep 12 13:43:49 2011 +0200
+
+    0.17.4
+
+ CMakeLists.txt   |    2 +-
+ NEWS            |    5 +++++
+ configure.ac    |    2 +-
+ cpp/Doxyfile    |    2 +-
+ qt4/src/Doxyfile |    2 +-
+ 5 files changed, 9 insertions(+), 4 deletions(-)
+
+commit 194b2413eb2c6a1641508aec63336aaf89ec3b51
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Mon Sep 12 13:43:35 2011 +0200
+
+    gir 0.18
+
+ glib/CMakeLists.txt |  12 ++++++------
+ glib/Makefile.am    |  12 ++++++------
+ 2 files changed, 12 insertions(+), 12 deletions(-)
+
+commit 61c06d2efad20880e1e0b399cf797dd55f6c8dab
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Mon Sep 12 00:32:38 2011 +0200
+
+    xpdf303: Useless NULL assignments
+
+ poppler/SplashOutputDev.cc |   2 ++
+ 1 file changed, 2 insertions(+)
+
+commit 4fbcbf1ffb8a98fe8c12643fdab2cbd90b4e60f9
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Mon Sep 12 00:30:52 2011 +0200
+
+    xpdf303: Set size to 64 instead of 100
+
+ poppler/SplashOutputDev.cc |   4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 1c7203e57e9c7c264f5cada6362a6b449dd8689c
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Mon Sep 12 00:21:03 2011 +0200
+
+    xpdf303: Avoid calling a "slow" function
+
+ poppler/PSOutputDev.cc |    9 ++++++---
+ 1 file changed, 6 insertions(+), 3 deletions(-)
+
+commit db4c5789bf95af9f45a7911153acc20a26a447f1
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Mon Sep 12 00:19:49 2011 +0200
+
+    xpdf303: fix spacing
+
+ poppler/PSOutputDev.cc |    2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 10c3d15f841865929d2f66353cb01d0d321e8b82
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Mon Sep 12 00:03:13 2011 +0200
+
+    xpdf303: make limit smaller
+
+ poppler/PSOutputDev.cc |    2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 1d4e6e739701ba817576752ced169b24c5e95156
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Sun Sep 11 23:57:22 2011 +0200
+
+    xpdf303: Remove 512 limit in pdftoppm
+
+ utils/pdftoppm.cc |   13 ++++++-------
+ 1 file changed, 6 insertions(+), 7 deletions(-)
+
+commit e4e843f1115d95c54967f0386bfb28f685d6c88d
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Sun Sep 11 22:49:34 2011 +0200
+
+    xpdf303: Rework nComps != colorSpace->getNComps() handling
+
+ poppler/GfxState.cc |   6 +++++-
+ 1 file changed, 5 insertions(+), 1 deletion(-)
+
+commit dda45b6a67f3f97705e5d806eaf7d37171789e66
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Sun Sep 11 22:46:51 2011 +0200
+
+    xpdf303: NULL GfxICCBasedColorSpace if array does not have 2 elements
+
+ poppler/GfxState.cc |   4 ++++
+ 1 file changed, 4 insertions(+)
+
+commit 760e814a6d26db8eba567520aad771002e11357a
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Sun Sep 11 22:21:40 2011 +0200
+
+    xpdf303: increase formDepth limit
+
+ poppler/Gfx.cc |    2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 59442e5994f3b94d5221cbc90f79fad235fe2611
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Sun Sep 11 22:10:41 2011 +0200
+
+    xpdf303: Remove flags that were never used
+
+ splash/Splash.cc      |    6 +-----
+ splash/SplashXPath.cc |   34 ++++------------------------------
+ splash/SplashXPath.h  |   13 ++++---------
+ 3 files changed, 9 insertions(+), 44 deletions(-)
+
+commit 41a620ef60507ceda42a14d06d6587ed10016468
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Thu Sep 8 16:18:01 2011 +0200
+
+    xpdf303: Adapt use of getBlock to our use of getChars
+
+ poppler/Stream.cc |   58
+ ++++++++++++++++++++++++++++++++---------------------
+ poppler/Stream.h  |   2 ++
+ 2 files changed, 37 insertions(+), 23 deletions(-)
+
+commit 2f7701fe730a648d0a1d181c5b20e4802640dc52
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Thu Sep 8 15:59:27 2011 +0200
+
+    xpdf303: Adapt xpdf getBlock to our getChars
+
+ poppler/JBIG2Stream.cc |   17 ++++++++
+ poppler/JBIG2Stream.h |    2 +
+ poppler/Stream.cc     |  113
+ +++++++++++++++++++++++++++++++++++++++++++-----
+ poppler/Stream.h      |   55 ++++++++++++-----------
+ 4 files changed, 152 insertions(+), 35 deletions(-)
+
+commit 3a1988db40def1655ec638cd521ed40eadc0acca
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Thu Sep 8 15:40:12 2011 +0200
+
+    xpdf303: empty pages need to call dump to do any setup required by
+    the OutputDev
+
+ poppler/Page.cc |    4 ++++
+ 1 file changed, 4 insertions(+)
+
+commit 4cddaed21592ac491519a81a003035bc4e618705
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Thu Sep 8 15:35:33 2011 +0200
+
+    xpdf303: Don't clip the other page boxes to the MediaBox at the
+    intermediate nodes
+
+    only do it at the leaf (Page) nodes - the other boxes can be specified
+    before the MediaBox is specified.
+    I think we already had that change, we checked isPage before clipping,
+    I've merged this way just to make future merges a bit easier.
+
+ poppler/Page.cc |   16 ++++++++--------
+ poppler/Page.h  |    3 +++
+ 2 files changed, 11 insertions(+), 8 deletions(-)
+
+commit 3538ac89bfea750de8907847d1d5e3515d0b8be7
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Thu Sep 8 15:07:21 2011 +0200
+
+    xpdf303: compile
+
+ poppler/ArthurOutputDev.cc |  12 +++++++++++-
+ 1 file changed, 11 insertions(+), 1 deletion(-)
+
+commit 89d95d0f254a828d28d943b698eeaec51f03686f
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Thu Sep 8 12:38:36 2011 +0200
+
+    xpdf303: Add codeToGID and codeToGIDLen params to
+    loadOpenTypeCFFFont()
+
+ poppler/SplashOutputDev.cc   |   12 +++++++++++-
+ splash/SplashFTFontEngine.cc |   29 +++++++++++++++++------------
+ splash/SplashFTFontEngine.h  |    3 ++-
+ splash/SplashFontEngine.cc   |    6 ++++--
+ splash/SplashFontEngine.h    |    3 ++-
+ 5 files changed, 36 insertions(+), 17 deletions(-)
+
+commit d768204e51e6bdbcac4d6b43537297616cbedbf3
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Tue Sep 6 21:56:43 2011 +0200
+
+    xpdf303: Revert b36d150931cd555b84ee996d505e8b91e2afde19
+
+    Breaks bug164568-2.pdf so our fix was better :-)
+
+ poppler/JBIG2Stream.cc |   91
+ +++++++++++++++++++++---------------------------
+ poppler/JBIG2Stream.h |    1 -
+ 2 files changed, 40 insertions(+), 52 deletions(-)
+
+commit 2230b8f2128edf4994d8a742f562e1b5acf96b74
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Tue Sep 6 00:05:53 2011 +0200
+
+    xpdf303: Merge JPXStream changes
+
+ poppler/JPXStream.cc | 1000
+ +++++++++++++++++++++++++++++++-------------------
+ poppler/JPXStream.h  |   43 +--
+ 2 files changed, 632 insertions(+), 411 deletions(-)
+
+commit 35bb53feaa2e469253368f03a9835d73aeb1a240
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Mon Sep 5 23:20:09 2011 +0200
+
+    xpdf303: Add BufStream
+
+ poppler/Stream.cc |   46 ++++++++++++++++++++++++++++++++++++++++++++++
+ poppler/Stream.h  |   25 +++++++++++++++++++++++++
+ 2 files changed, 71 insertions(+)
+
+commit 8a9d92fcf05285c1f06bc153aa79d0200d05bbd9
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Mon Sep 5 22:57:02 2011 +0200
+
+    xpdf303: CCITTFaxStream header misc fixes
+
+ poppler/Stream.h |    6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
+
+commit 22d370c0a1f8c016ebc5a6d8320fe55bfd31c8a7
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Mon Sep 5 22:53:45 2011 +0200
+
+    xpdf303: DCTStream misc fixes
+
+ poppler/Stream.cc |   32 ++++++++++++++++++++++++++------
+ 1 file changed, 26 insertions(+), 6 deletions(-)
+
+commit 36d3057546b5a1d717c71b8dcb9773f91e3b5960
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Mon Sep 5 22:46:59 2011 +0200
+
+    xpdf303: Add some {}
+
+ poppler/Stream.cc |   3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+commit 308654eb5dfbb783f29bd645f60c79d5b5fe42c9
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Mon Sep 5 22:45:50 2011 +0200
+
+    xpdf303: code1 changed to int in CCITTFaxStream::reset
+
+ poppler/Stream.cc |   2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit f097dc1f9d580eb1cdc8180d3920fe795493cf89
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Mon Sep 5 22:43:16 2011 +0200
+
+    xpdf303: Use 32 bits in CCITTFaxStream::lookBits
+
+ poppler/Stream.cc |   4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit b5417659042c95891aa549cae396ba4cc6604030
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Mon Sep 5 22:40:02 2011 +0200
+
+    xpdf303: Check against lookBits returning EOF
+
+ poppler/Stream.cc |   17 ++++++++++-------
+ 1 file changed, 10 insertions(+), 7 deletions(-)
+
+commit eaf9d31c97a3cc06f4ce94d9190ae1a337634749
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Mon Sep 5 22:38:05 2011 +0200
+
+    xpdf303: Set endOfLine to true if code1 is 1
+
+ poppler/Stream.cc |   1 +
+ 1 file changed, 1 insertion(+)
+
+commit a654a77e26a6c7d76c318636303f8c636a3d2495
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Mon Sep 5 22:36:58 2011 +0200
+
+    xpdf303: Tweaks to CCITTFaxStream::lookChar
+
+ poppler/Stream.cc |   55
+ +++++++++++++++++++++++++++++++++++++++++------------
+ 1 file changed, 43 insertions(+), 12 deletions(-)
+
+commit abdf828449cd543e66f326ba862efcb3ca6d342d
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Mon Sep 5 22:19:30 2011 +0200
+
+    xpdf303: Remove cygwin workaround
+
+ poppler/Stream.cc |   4 ----
+ 1 file changed, 4 deletions(-)
+
+commit 05ef4227d09381e3a9e8050e447770f44d532386
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Mon Sep 5 22:18:33 2011 +0200
+
+    xpdf303: Return false if getLine fails
+
+ poppler/Stream.cc |   4 +++-
+ 1 file changed, 3 insertions(+), 1 deletion(-)
+
+commit c2d6158bd56328754d77ab8f1bf84d46e6ede773
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Mon Sep 5 22:14:39 2011 +0200
+
+    xpdf303: Return NULL if size < 0
+
+ poppler/Stream.cc |   2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 04947e1dca858b890302a5a1005b84b34255d670
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Mon Sep 5 22:11:24 2011 +0200
+
+    xpdf303: Add -rawdates and print Form information
+
+ utils/pdfinfo.cc |   30 +++++++++++++++++++++++++++---
+ 1 file changed, 27 insertions(+), 3 deletions(-)
+
+commit 9529e776e53e71069ba4215cdb8b84592d37b555
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Mon Sep 5 21:19:58 2011 +0200
+
+    xpdf303: Other fixes in PostScriptFunction
+
+ poppler/Function.cc |   5 +++--
+ 1 file changed, 3 insertions(+), 2 deletions(-)
+
+commit 071f983f461ba0b872dd93d7f1a24d325312799d
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Mon Sep 5 21:19:13 2011 +0200
+
+    xpdf303: Fixed a bug in the PostScript-type function parser
+
+    Real numbers that start with a decimal point weren't being handled
+    correctly.
+
+ poppler/Function.cc |   2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit da0eff1aaa31c2bf357a64b6275645100c9629d4
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Mon Sep 5 21:12:02 2011 +0200
+
+    xpdf303: Fixes in StitchingFunction
+
+ poppler/Function.cc |   6 ++----
+ 1 file changed, 2 insertions(+), 4 deletions(-)
+
+commit b655316706ec394fa6c8ad076d9d9d96ac8ed563
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Mon Sep 5 21:05:55 2011 +0200
+
+    xpdf303: Rework LinkURI decoding
+
+ poppler/Link.cc |   35 +++++++++++++++++++----------------
+ 1 file changed, 19 insertions(+), 16 deletions(-)
+
+commit abad9b4e44d81a206bccff8a109ceb9a7effa2ad
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Mon Sep 5 21:00:31 2011 +0200
+
+    xpdf303: Cache the last transform for PostScript-type functions
+
+ poppler/Function.cc |  37 ++++++++++++++++++++++++++++++++++---
+ poppler/Function.h  |   2 ++
+ 2 files changed, 36 insertions(+), 3 deletions(-)
+
+commit e1c6b4c6e6df0854b040c9af9ef2d3f6789e24b2
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Mon Sep 5 21:02:31 2011 +0200
+
+    xpdf303: Only call getNum if isNum
+
+ poppler/Link.cc |    5 +++--
+ 1 file changed, 3 insertions(+), 2 deletions(-)
+
+commit e5661e1a08c38d4c8d69976a8c1c02c1102bc88c
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Mon Sep 5 20:49:13 2011 +0200
+
+    Optimize SampledFunction
+
+    Pull index computation code out of the transform function; cache the
+    last transform.
+
+ poppler/Function.cc |  87
+ ++++++++++++++++++++++++++++++++++++++++++---------
+ poppler/Function.h  |   4 ++-
+ 2 files changed, 75 insertions(+), 16 deletions(-)
+
+commit b36d150931cd555b84ee996d505e8b91e2afde19
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Mon Sep 5 20:52:05 2011 +0200
+
+    xpdf303: Take xpdf way of handling bug 6500
+
+ poppler/JBIG2Stream.cc |   91
+ +++++++++++++++++++++++++++---------------------
+ poppler/JBIG2Stream.h |    1 +
+ 2 files changed, 52 insertions(+), 40 deletions(-)
+
+commit 065565a67c7826b64d89fac9719049d0a57da721
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Mon Sep 5 20:39:50 2011 +0200
+
+    xpdf303: Merge ¿speed? improvements in JBIG2Stream::readGenericBitmap
+
+ poppler/JBIG2Stream.cc |  586
+ ++++++++++++++++++++++++++++++++++++++----------
+ 1 file changed, 471 insertions(+), 115 deletions(-)
+
+commit 28adb3884dafcf1d36aae1ec05855b10b22aa4ae
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Mon Sep 5 20:26:57 2011 +0200
+
+    xpdf303: Change bpp calculation
+
+ poppler/JBIG2Stream.cc |   16 +++++++++++-----
+ 1 file changed, 11 insertions(+), 5 deletions(-)
+
+commit c163a82f45d869b7c35a1a7141ab237507671f82
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Mon Sep 5 20:25:04 2011 +0200
+
+    xpdf303: Change symCodeLen calculation
+
+ poppler/JBIG2Stream.cc |   16 +++++++++++-----
+ 1 file changed, 11 insertions(+), 5 deletions(-)
+
+commit 1d1a985101c26f90bde8340dcfae3d6a1e0a08ba
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Mon Sep 5 20:20:03 2011 +0200
+
+    xpdf303: symCodeLen calculation fix
+
+ poppler/JBIG2Stream.cc |   12 ++++++++----
+ 1 file changed, 8 insertions(+), 4 deletions(-)
+
+commit 5c0274572c65972434293a30f3ba5afd3905005f
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Mon Sep 5 20:07:54 2011 +0200
+
+    xpdf303: add line accessor
+
+ poppler/JBIG2Stream.cc |    1 +
+ 1 file changed, 1 insertion(+)
+
+commit 7b77a264b5c21ba693677b1249a2122743e4e395
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Mon Sep 5 19:46:16 2011 +0200
+
+    xpdf303: segments with unspecified length
+
+ poppler/JBIG2Stream.cc |    8 +++++++-
+ 1 file changed, 7 insertions(+), 1 deletion(-)
+
+commit 23066e8e8309babd61ade9f50ef7d82c9e275055
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Mon Sep 5 19:41:16 2011 +0200
+
+    xpdf303: More EOF detection
+
+ poppler/JBIG2Stream.cc |   12 +++++++++---
+ 1 file changed, 9 insertions(+), 3 deletions(-)
+
+commit bc6eded798d6e5dc7a58f88afbe4ab2904698db5
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Mon Sep 5 19:38:29 2011 +0200
+
+    xpdf303: Comment++
+
+ poppler/JBIG2Stream.cc |    2 ++
+ 1 file changed, 2 insertions(+)
+
+commit adb98856a745340b4ffb34ffd2ed701600cfc82f
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Mon Sep 5 19:38:02 2011 +0200
+
+    xpdf303: Exit loop in case of EOF
+
+ poppler/JBIG2Stream.cc |   11 ++++++++---
+ 1 file changed, 8 insertions(+), 3 deletions(-)
+
+commit 112154567ebcab63959294533b00075d6ca6ea65
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Mon Sep 5 19:33:27 2011 +0200
+
+    xpdf303: Initialize to NULL
+
+ poppler/JBIG2Stream.cc |    5 +++++
+ 1 file changed, 5 insertions(+)
+
+commit b9ecfdf4cb27a19e65817af51c048e8030825035
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Mon Sep 5 19:27:36 2011 +0200
+
+    xpdf303: Delay memory allocation up to when it is really needed
+
+ poppler/CMap.cc |   58
+ ++++++++-----------------------------------------------
+ poppler/CMap.h  |    2 --
+ 2 files changed, 8 insertions(+), 52 deletions(-)
+
+commit 7af7b4b2d1941ee9dcd575535d4fc31f29026d8d
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Mon Sep 5 19:05:31 2011 +0200
+
+    xpdf303: Rework initialization of appearance state
+
+    Merged a slightly different patch, adding an error when the AS
+    entry is
+    missing and the AP contains one or more subdictionaries.
+
+ poppler/Annot.cc |   62
+ ++++++++++++++++++++++++++++++------------------------
+ 1 file changed, 34 insertions(+), 28 deletions(-)
+
+commit f7d307b818bca9553a05b5d43deb429abbf04824
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Sun Sep 4 13:56:35 2011 +0200
+
+    xpdf303: Rewrote the code that handles annotation transforms
+
+    It was not handling non-rectangular transforms correctly.
+
+ poppler/Gfx.cc |  143
+ +++++++++++++++++++++++++++++---------------------------
+ 1 file changed, 75 insertions(+), 68 deletions(-)
+
+commit 4609f9feeca22620c6e143962a3717784a843a68
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Sun Sep 4 13:09:50 2011 +0200
+
+    xpdf303: Implement rotation in the form field appearance regeneration
+
+ poppler/Annot.cc |   51
+ ++++++++++++++++++++++++++++++++++++++-------------
+ 1 file changed, 38 insertions(+), 13 deletions(-)
+
+commit ca7d77a27e2f3a692842968f08dcb9fa5379bf0f
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Sun Sep 4 11:53:40 2011 +0200
+
+    Create forms with a PDFDoc instead of XRef too
+
+ poppler/Form.cc |   79
+ ++++++++++++++++++++++++++++---------------------------
+ poppler/Form.h  |   28 +++++++++++---------
+ 2 files changed, 55 insertions(+), 52 deletions(-)
+
+commit ec52e46e309a0307fdf12113a1b7d41a760f9d6c
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Sun Sep 4 11:32:38 2011 +0200
+
+    xpdf303: Create annots with a doc instead of xref + catalog
+
+ glib/poppler-action.cc |    2 +-
+ glib/poppler-annot.cc |    4 +-
+ poppler/Annot.cc      |  364
+ ++++++++++++++++++++++++------------------------
+ poppler/Annot.h       |  128 ++++++++---------
+ poppler/Catalog.cc    |    9 +-
+ poppler/Form.cc       |   22 +--
+ poppler/Form.h                |   11 +-
+ poppler/PSOutputDev.cc |    2 +-
+ poppler/Page.cc       |    2 +-
+ 9 files changed, 274 insertions(+), 270 deletions(-)
+
+commit ce5e620f07e984927610866467705bb526f9ad8d
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Sat Sep 3 11:05:42 2011 +0200
+
+    xpdf303: Handle the case where sid < 0
+
+ fofi/FoFiType1C.cc |   4 +++-
+ 1 file changed, 3 insertions(+), 1 deletion(-)
+
+commit 9d77f999de973f3c547245bca0568f8984faa5d7
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Sat Sep 3 11:02:55 2011 +0200
+
+    xpdf303: Initialize nFDs in FoFiType1C::parse()
+
+ fofi/FoFiType1C.cc |   1 +
+ 1 file changed, 1 insertion(+)
+
+commit d9594c95713ac79b46e313ecf2875196ea076ef4
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Sat Sep 3 11:01:28 2011 +0200
+
+    xpdf303: Check whether fdSelect is NULL before using it
+
+ fofi/FoFiType1C.cc |  10 ++++++----
+ 1 file changed, 6 insertions(+), 4 deletions(-)
+
+commit 4e4a8ec52c5662e21036f219636a39fc97a32353
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Sat Sep 3 10:52:14 2011 +0200
+
+    xpdf303: Add writePSString() helper function to FoFiType1C
+
+ fofi/FoFiType1C.cc |  68
+ ++++++++++++++++++++++++++++++++++++++--------------
+ fofi/FoFiType1C.h  |   1 +
+ 2 files changed, 51 insertions(+), 18 deletions(-)
+
+commit ff03811db1ef833df4bab12fe3bf3a8c1534c174
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Sat Sep 3 10:40:15 2011 +0200
+
+    xpdf303: More checks in GooString
+
+ goo/GooString.cc |    5 ++++-
+ 1 file changed, 4 insertions(+), 1 deletion(-)
+
+commit 0029efbe2a8a97ff34353f8028ac649b2fd07013
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Sat Sep 3 10:32:14 2011 +0200
+
+    xpdf303: Use a double instead of an int with a cast
+
+ goo/GooString.cc |    2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 419ee8c30ba0df02e9f0281b321fbe38387e5a21
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Fri Sep 2 18:44:04 2011 +0200
+
+    xpdf303: Add more formats to GooString
+
+ goo/GooString.cc |  102
+ +++++++++++++++++++++++++++++++++++++++++++++++++-----
+ goo/GooString.h  |   21 +++++++++--
+ 2 files changed, 111 insertions(+), 12 deletions(-)
+
+commit 738a6954da01fd3fc8c1cd5baa49fc7b8c959169
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Fri Sep 2 18:24:04 2011 +0200
+
+    xpdf303: Add getGlyphName() to FoFiType1C
+
+ fofi/FoFiType1C.cc |  12 ++++++++++++
+ fofi/FoFiType1C.h  |   4 ++++
+ 2 files changed, 16 insertions(+)
+
+commit 39b77a193996b0916690a246f4a9874dad596b2f
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Fri Sep 2 18:17:51 2011 +0200
+
+    xpdf303: Improvements in FoFiType1 parser
+
+ fofi/FoFiType1.cc |   75
+ +++++++++++++++++++++++++----------------------------
+ 1 file changed, 35 insertions(+), 40 deletions(-)
+
+commit 44dbb28a07125f92a0835aea7ad3403310bc451d
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Fri Sep 2 18:08:39 2011 +0200
+
+    xpdf303: Handle PFB headers in Type 1 font files
+
+ fofi/FoFiType1.cc |   36 ++++++++++++++++++++++++++++++++++++
+ fofi/FoFiType1.h  |   1 +
+ 2 files changed, 37 insertions(+)
+
+commit 9531a52b227a994ab8e0d66aeaff2b21358ca73e
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Fri Sep 2 18:01:35 2011 +0200
+
+    xpdf303: New signature of methods convertToCIDType0() and
+    convertToType0()
+
+ fofi/FoFiTrueType.cc  |    8 ++---
+ fofi/FoFiTrueType.h   |    4 +--
+ fofi/FoFiType1C.cc    |   84
+ ++++++++++++++++++++++++++++++++++--------------
+ fofi/FoFiType1C.h     |   19 ++++++++---
+ poppler/PSOutputDev.cc |   13 ++++++--
+ 5 files changed, 91 insertions(+), 37 deletions(-)
+
+commit 830d2b40770333489a08f23a3b16a372770a8d19
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Thu Sep 1 23:23:57 2011 +0200
+
+    xpdf303: Use openFile
+
+ poppler/CharCodeToUnicode.cc |    4 ++--
+ poppler/GlobalParams.cc      |   10 +++++-----
+ 2 files changed, 7 insertions(+), 7 deletions(-)
+
+commit ddf9d6e35b40b902519cbaa8cb664ba6dfdfd510
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Thu Sep 1 23:21:26 2011 +0200
+
+    xpdf303: openFile + minor fixes for openTempFile in Windows
+
+ goo/gfile.cc |  108
+ ++++++++++++++++++++++++++++++++++++++++++++++++++++++++--
+ goo/gfile.h  |   13 +++++++
+ 2 files changed, 118 insertions(+), 3 deletions(-)
+
+commit 68e8fa9ff4f13b6703148b3eb6ea628418211243
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Thu Sep 1 23:17:59 2011 +0200
+
+    xpdf303: make gcc happy
+
+ fofi/FoFiType1C.cc |   2 ++
+ 1 file changed, 2 insertions(+)
+
+commit 876021b1aa16ad38767a91e1be31c392f368fde2
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Thu Sep 1 19:07:01 2011 +0200
+
+    xpdf303: Add getFontMatrix()
+
+ fofi/FoFiTrueType.cc |   76
+ ++++++++++++++++++++++++++++++--------------------
+ fofi/FoFiTrueType.h  |    9 ++++++
+ fofi/FoFiType1.cc    |   37 ++++++++++++++++++++++++
+ fofi/FoFiType1.h     |    4 +++
+ fofi/FoFiType1C.cc   |   29 +++++++++++++++++++
+ fofi/FoFiType1C.h    |    3 ++
+ 6 files changed, 127 insertions(+), 31 deletions(-)
+
+commit 1369862ed61ef8b0f81c52fce36f6c1602d82ddb
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Thu Sep 1 18:27:51 2011 +0200
+
+    xpdf303: Ignore entries that have an invalid tag too
+
+ fofi/FoFiTrueType.cc |    8 ++++++--
+ 1 file changed, 6 insertions(+), 2 deletions(-)
+
+commit 0fe7cc82e84dc2a3b79248b111656e5e7df9fdc2
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Thu Sep 1 18:21:33 2011 +0200
+
+    xpdf303: Update cmap, name, post and os2 tables in FoFiTrueType
+
+ fofi/FoFiTrueType.cc |   29 ++++++++++++++++-------------
+ 1 file changed, 16 insertions(+), 13 deletions(-)
+
+commit 0feebf5f3c9da8d7a1154456a00492a623340cec
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Thu Sep 1 18:16:59 2011 +0200
+
+    xpdf303: Ignore any bogus entries in the table directory
+
+    It's a different approach to fix the same issue we had already fixed,
+    added just to make future merge easier. We were also reallocating the
+    tables array, I've kept that but doing it only when the size actually
+    changes.
+
+ fofi/FoFiTrueType.cc |   25 +++++++++++++------------
+ 1 file changed, 13 insertions(+), 12 deletions(-)
+
+commit 68c6ebc78b89eec94a9c3538fe6e27561a21b680
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Thu Sep 1 17:49:46 2011 +0200
+
+    xpdf303: codeToGID items can be < 0 now
+
+ fofi/FoFiTrueType.cc  |   12 ++++++++++--
+ poppler/PSOutputDev.cc |    2 +-
+ splash/SplashFTFont.cc |    2 +-
+ 3 files changed, 12 insertions(+), 4 deletions(-)
+
+commit 19204ed5cd5cb64809f1a1f51dd5ffdef2b9417a
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Thu Sep 1 17:28:39 2011 +0200
+
+    xpdf303: CMap::getCID signature change
+
+ poppler/CMap.cc    |  47 +++++++++++++++++++++++++++++++----------------
+ poppler/CMap.h     |   8 +++++---
+ poppler/GfxFont.cc |   6 ++++--
+ 3 files changed, 40 insertions(+), 21 deletions(-)
+
+commit 9c74bef77e7e1d7a8464dff43cae16bb1206665e
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Thu Sep 1 17:04:04 2011 +0200
+
+    xpdf303: Use splashDist instead of splashSqrt
+
+ splash/SplashT1Font.cc |    2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 0568d0dc3c42b68b715226e5ce0ff98d73a94ac7
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Thu Sep 1 17:01:30 2011 +0200
+
+    xpdf303: Do the multiplication the other way around
+
+    No idea why :-D
+
+ splash/SplashFTFont.cc |    8 ++++----
+ 1 file changed, 4 insertions(+), 4 deletions(-)
+
+commit 3c0da502aa1d5b1acae01cf1e43fb96f5ecc11da
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Thu Sep 1 17:00:31 2011 +0200
+
+    xpdf303: Use splashCheckDet isntead of splashAbs
+
+ splash/SplashFontEngine.cc |   2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 2b4303c66f8de9a267413465898897fd6b0ebb17
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Thu Sep 1 16:51:53 2011 +0200
+
+    xpdf303: Bigger fileKey
+
+ poppler/XRef.h |    2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 53060857e31a01413936fbe33b7032a0a325b384
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Thu Sep 1 16:50:08 2011 +0200
+
+    xpdf303: Merge JArithmeticDecoder.*
+
+ poppler/JArithmeticDecoder.cc |   47
+ +++++++++++++++++++++++++++++++++++------
+ poppler/JArithmeticDecoder.h  |    4 ++++
+ 2 files changed, 44 insertions(+), 7 deletions(-)
+
+commit 0722960b4cf4ce40b6bd278ac7287d64a1d70bf2
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Thu Sep 1 16:48:31 2011 +0200
+
+    xpdf303: Do not crash if imgStr->getLine() is NULL
+
+ utils/ImageOutputDev.cc |   21 ++++++++++++++-------
+ 1 file changed, 14 insertions(+), 7 deletions(-)
+
+commit f848edab849910b8291c7974e484ef5d02b2234c
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Thu Sep 1 16:42:30 2011 +0200
+
+    xpdf303: Do not extract the million tiles of a pattern
+
+ utils/ImageOutputDev.cc |    9 +++++++++
+ utils/ImageOutputDev.h  |   12 ++++++++++++
+ 2 files changed, 21 insertions(+)
+
+commit 01adb7ef6a524d7313a45e7c5f441da4fd0250bd
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Thu Sep 1 16:31:50 2011 +0200
+
+    xpdf303: Assembler for some functions
+
+ splash/SplashMath.h | 110
+ +++++++++++++++++++++++++++++++++++++++++++++++++++
+ 1 file changed, 110 insertions(+)
+
+commit 4f87a3163f133565e8774ef416e67d05f906723d
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Thu Sep 1 16:25:19 2011 +0200
+
+    xpdf303: Add splashAvg
+
+ splash/SplashMath.h |   8 ++++++++
+ 1 file changed, 8 insertions(+)
+
+commit 64cf42f89939763d105be4948a20e9ecb81a64c1
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Thu Sep 1 16:23:08 2011 +0200
+
+    xpdf303: Add getters to SplashClip
+
+ splash/SplashClip.h |   6 ++++++
+ 1 file changed, 6 insertions(+)
+
+commit 28c6a55742f55a719ef63b8e0eff7c242653cf36
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Thu Sep 1 16:17:56 2011 +0200
+
+    xpdf303: unneeded forward declare
+
+ poppler/Page.h |    1 -
+ 1 file changed, 1 deletion(-)
+
+commit 38ebe8c568aafbe5f248f9e0a654f46829e0b659
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Thu Sep 1 16:13:53 2011 +0200
+
+    xpdf303: Page functions do not need Catalog * anymore
+
+ glib/poppler-document.cc                |    2 +-
+ glib/poppler-page.cc                    |   11 ++++-----
+ poppler/FontInfo.cc                     |    2 +-
+ poppler/OutputDev.h                     |    4 ++--
+ poppler/PDFDoc.cc                       |    8 +++----
+ poppler/PSOutputDev.cc                          |    6 ++---
+ poppler/PSOutputDev.h                   |    2 +-
+ poppler/Page.cc                         |   36
+ +++++++++++++++---------------
+ poppler/Page.h                                  |   16 ++++++-------
+ poppler/TextOutputDev.cc                |    2 +-
+ poppler/TextOutputDev.h                 |    2 +-
+ qt4/src/poppler-link-extractor-private.h |    2 +-
+ qt4/src/poppler-link-extractor.cc       |    4 ++--
+ qt4/src/poppler-page.cc                 |    4 ++--
+ utils/HtmlOutputDev.cc                          |    9 ++++----
+ utils/HtmlOutputDev.h                   |    7 +++---
+ utils/pdftohtml.cc                      |    2 +-
+ 17 files changed, 58 insertions(+), 61 deletions(-)
+
+commit 7d794f6411499fb8f26778bf2b54cb9734d004af
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Thu Sep 1 15:47:32 2011 +0200
+
+    xpdf303: API rework, Gfx wants a PDFDoc instead of an XRef
+
+ cpp/poppler-page-renderer.cpp  |    2 +-
+ glib/poppler-document.cc       |    2 +-
+ glib/poppler-page.cc           |    2 --
+ poppler/CairoFontEngine.cc     |   28 ++++++++++++----------------
+ poppler/CairoFontEngine.h      |   13 ++++++-------
+ poppler/CairoOutputDev.cc      |   12 +++++-------
+ poppler/CairoOutputDev.h       |    6 +++---
+ poppler/Catalog.cc             |    8 +++++---
+ poppler/Catalog.h              |    4 +++-
+ poppler/Gfx.cc                         |   15 +++++++++------
+ poppler/Gfx.h                  |    6 ++++--
+ poppler/PDFDoc.cc              |    6 +++---
+ poppler/PSOutputDev.cc                 |   29 +++++++++++++++--------------
+ poppler/PSOutputDev.h          |    9 ++++-----
+ poppler/Page.cc                |    8 +++++---
+ poppler/Page.h                         |    4 +++-
+ poppler/PreScanOutputDev.cc    |    6 +++---
+ poppler/PreScanOutputDev.h     |    4 ++--
+ poppler/SplashOutputDev.cc     |   13 +++++++------
+ poppler/SplashOutputDev.h      |    5 +++--
+ qt4/src/poppler-private.h      |    2 +-
+ qt4/src/poppler-ps-converter.cc |    2 --
+ test/gtk-test.cc               |    2 +-
+ test/pdf-inspector.cc          |    2 +-
+ test/perf-test.cc              |    2 +-
+ utils/pdftocairo.cc            |    2 +-
+ utils/pdftohtml.cc             |    6 +++---
+ utils/pdftoppm.cc              |    2 +-
+ utils/pdftops.cc               |    4 ++--
+ 29 files changed, 105 insertions(+), 101 deletions(-)
+
+commit 52fb80a7b3f98eb8322a7ba84e2900f044b3a18a
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Thu Sep 1 13:27:01 2011 +0200
+
+    xpdf303: compile++
+
+ poppler/ArthurOutputDev.cc |   4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 37ca8dc4215693ec657d165ebdb6c315a0ae92c9
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Thu Sep 1 12:34:32 2011 +0200
+
+    xpdf303: Use int instead of Gushort for gid/cid maps
+
+ fofi/FoFiTrueType.cc        |   18 +++++++++---------
+ fofi/FoFiTrueType.h         |   14 +++++++-------
+ fofi/FoFiType1C.cc          |    8 ++++----
+ fofi/FoFiType1C.h           |    2 +-
+ poppler/CairoFontEngine.cc   |   22 +++++++++++-----------
+ poppler/CairoFontEngine.h    |    8 ++++----
+ poppler/GfxFont.cc          |   22 +++++++++++-----------
+ poppler/GfxFont.h           |   10 +++++-----
+ poppler/PSOutputDev.cc       |   14 +++++++-------
+ poppler/SplashOutputDev.cc   |    6 +++---
+ splash/SplashFTFontEngine.cc |    6 +++---
+ splash/SplashFTFontEngine.h  |    2 +-
+ splash/SplashFTFontFile.cc   |   12 ++++++------
+ splash/SplashFTFontFile.h    |    8 ++++----
+ splash/SplashFontEngine.cc   |    2 +-
+ splash/SplashFontEngine.h    |    2 +-
+ 16 files changed, 78 insertions(+), 78 deletions(-)
+
+commit df942e25bff9b014bde0ff69c8a01fa3c1963015
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Thu Sep 1 01:08:10 2011 +0200
+
+    xpdf303: More parsing flexibility
+
+ poppler/CharCodeToUnicode.cc |   18 ++++++------------
+ 1 file changed, 6 insertions(+), 12 deletions(-)
+
+commit 5305dfc5702e8004e5ae35697c6aebd0b1a5c96e
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Thu Sep 1 01:05:02 2011 +0200
+
+    xpdf303: Make sure codes are inside the range
+
+ poppler/CharCodeToUnicode.cc |   17 ++++++++++++++++-
+ 1 file changed, 16 insertions(+), 1 deletion(-)
+
+commit 45212483572c68abd612b5c62b21cbb545e10143
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Thu Sep 1 01:01:13 2011 +0200
+
+    xpdf303: change mapLen growing stragegy
+
+ poppler/CharCodeToUnicode.cc |    5 ++++-
+ 1 file changed, 4 insertions(+), 1 deletion(-)
+
+commit 75d70f190e97f69047cdbe97a872a936788392d9
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Thu Sep 1 01:00:23 2011 +0200
+
+    xpdf303: Limit code to  0xffffff
+
+ poppler/CharCodeToUnicode.cc |    5 +++++
+ 1 file changed, 5 insertions(+)
+
+commit b4180a187f9246b6390df112e5536ead9ef9bcbe
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Thu Sep 1 00:59:09 2011 +0200
+
+    xpdf303: Use parseHex instead of sscanf
+
+ poppler/CharCodeToUnicode.cc |   18 ++++++++----------
+ 1 file changed, 8 insertions(+), 10 deletions(-)
+
+commit 121f648f233adcdc631c7e29d67b60baa922e29a
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Thu Sep 1 00:28:40 2011 +0200
+
+    Add helper parseHex function
+
+ poppler/CharCodeToUnicode.cc |   35 +++++++++++++++++++++++++++++++++++
+ 1 file changed, 35 insertions(+)
+
+commit be0436ace671070bab4304efee607f40c959bc55
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Thu Sep 1 00:26:57 2011 +0200
+
+    xpdf303: CharCodeToUnicode::makeIdentityMapping & friends
+
+ poppler/CharCodeToUnicode.cc |   25 +++++++++++++++++++++++++
+ poppler/CharCodeToUnicode.h  |    4 ++++
+ 2 files changed, 29 insertions(+)
+
+commit 5dd94447b14db1894f06ad0590187dae7575e33a
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Thu Sep 1 00:15:59 2011 +0200
+
+    xpdf303: Remove unused constructor
+
+ splash/SplashXPath.cc |    5 -----
+ splash/SplashXPath.h  |    1 -
+ 2 files changed, 6 deletions(-)
+
+commit d00d56e4a46e8534378534de0d94ce0551d75d84
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Thu Sep 1 00:11:49 2011 +0200
+
+    xpdf303: Speedup SplashScreen
+
+    By using << instead of * and by putting some functions on the header
+    so they can be inlined
+
+ splash/SplashScreen.cc |   89
+ ++++++++++++++++--------------------------------
+ splash/SplashScreen.h |   14 ++++++--
+ 2 files changed, 42 insertions(+), 61 deletions(-)
+
+commit 5e8debf96ab1bb9db31a0332a482d08c181d52ea
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Wed Aug 31 23:56:52 2011 +0200
+
+    xpdf303: Add splashCheckDet helper
+
+ splash/SplashMath.h |  10 ++++++++++
+ 1 file changed, 10 insertions(+)
+
+commit 4cef5a52b33b1afba28d890bbe48000b734ac357
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Wed Aug 31 21:09:50 2011 +0200
+
+    xpdf303: Protect against NULL from lexer->getStream()
+
+ poppler/Parser.cc |   5 ++++-
+ 1 file changed, 4 insertions(+), 1 deletion(-)
+
+commit 2547ec60db6d954e5c8318e30fcc54f70bcfa95c
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Wed Aug 31 21:05:11 2011 +0200
+
+    xpdf303: Add GBool force = gFalse to SplashPath::close
+
+ splash/SplashPath.cc |    5 +++--
+ splash/SplashPath.h  |    6 ++++--
+ 2 files changed, 7 insertions(+), 4 deletions(-)
+
+commit 9370f9640a24c7b944f3da7c10e070a960bdd8f9
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Wed Aug 31 21:01:32 2011 +0200
+
+    xpdf303: Add guards to the header
+
+ poppler/Stream-CCITT.h |    5 +++++
+ 1 file changed, 5 insertions(+)
+
+commit ab9dea663a4df5af8f54c1ff5149254adfd72ce9
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Wed Aug 31 20:34:17 2011 +0200
+
+    xpdf303: Add SplashBitmap::writeAlphaPGMFile and
+    SplashBitmap::takeData
+
+ splash/SplashBitmap.cc |   22 ++++++++++++++++++++++
+ splash/SplashBitmap.h |    6 ++++++
+ 2 files changed, 28 insertions(+)
+
+commit 6558d735c65a3dca9b9e16de5588c8b8c482f04f
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Wed Aug 31 20:30:27 2011 +0200
+
+    xpdf303: Write faster
+
+ splash/SplashBitmap.cc |   14 ++------------
+ 1 file changed, 2 insertions(+), 12 deletions(-)
+
+commit a9b26d9c35fccc7b46a96acdb2064a9976bd49bd
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Wed Aug 31 20:29:58 2011 +0200
+
+    xpdf303: Only free data if there is data to free
+
+ splash/SplashBitmap.cc |   11 ++++++-----
+ 1 file changed, 6 insertions(+), 5 deletions(-)
+
+commit 8f6e0285d7e80d8c1a8defaad9d0f87a2e054151
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Wed Aug 31 20:20:47 2011 +0200
+
+    xpdf303: PDFDocEncoding changes
+
+    This overwrites Michael Vrable's changes of using U+FFFD to actually
+    using the order, i'm taking Derek's change here
+
+ poppler/PDFDocEncoding.cc |   6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
+
+commit 9c8f30fb4a2a0dd2cf359610e33749e1682921c7
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Wed Aug 31 20:17:38 2011 +0200
+
+    xpdf303: comment changes
+
+ poppler/Link.h |    6 ++++--
+ 1 file changed, 4 insertions(+), 2 deletions(-)
+
+commit b78046057657b44c5cc9353d9e3dde356eb7fcbd
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Wed Aug 31 19:32:03 2011 +0200
+
+    xpdf303: Introduce unicodeTypeNum and unicodeTypeAlphaNum
+
+ poppler/UnicodeTypeTable.cc |  11 +++++++++++
+ poppler/UnicodeTypeTable.h  |   4 ++++
+ 2 files changed, 15 insertions(+)
+
+commit 0ec4b390ddb7fa7d028b8f0515ecd3e61c488c9f
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Wed Aug 31 19:30:55 2011 +0200
+
+    xpdf303: UnicodeTypeTable tables changes
+
+ poppler/UnicodeTypeTable.cc |  28 ++++++++++++++--------------
+ 1 file changed, 14 insertions(+), 14 deletions(-)
+
+commit f331c009f94703d6007fce9570ee19c6e4822339
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Wed Aug 31 19:20:12 2011 +0200
+
+    xpdf303: Remove warning() from Error.h
+
+ poppler/CairoOutputDev.cc |   6 +++---
+ poppler/Error.cc         |    7 -------
+ poppler/Error.h          |    1 -
+ 3 files changed, 3 insertions(+), 11 deletions(-)
+
+commit 53f94df2ce21793914ccc153ba6b2fe5cbeb8371
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Wed Aug 31 19:17:13 2011 +0200
+
+    Port to setErrorCallback
+
+ cpp/poppler-document.cpp   |   2 +-
+ cpp/poppler-private.cpp    |   6 ++----
+ cpp/poppler-private.h     |    3 ++-
+ qt4/src/poppler-private.cc |   8 +++-----
+ test/perf-test.cc         |    4 ++--
+ 5 files changed, 10 insertions(+), 13 deletions(-)
+
+commit 95a52f06a98f49f7c8f2b92634b75af96b4eee1d
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Wed Aug 31 19:07:22 2011 +0200
+
+    xpdf303: Forgot this when doing the char * -> const char *
+
+ poppler/JPXStream.cc |    2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 00549400f155d8e36b4ac718603fc945858fe50d
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Wed Aug 31 19:04:14 2011 +0200
+
+    xpdf303: error() changes, new param and formatting
+
+ fofi/FoFiBase.cc            |    8 +--
+ fofi/FoFiTrueType.cc        |    2 +-
+ fofi/FoFiType1.cc           |    4 +-
+ goo/JpegWriter.cc           |    2 +-
+ goo/PNGWriter.cc            |   16 ++---
+ poppler/Annot.cc            |   40 +++++------
+ poppler/ArthurOutputDev.cc   |   16 ++---
+ poppler/CMap.cc             |   26 +++----
+ poppler/CachedFile.cc       |    2 +-
+ poppler/CairoFontEngine.cc   |   10 +--
+ poppler/Catalog.cc          |   50 ++++++-------
+ poppler/CharCodeToUnicode.cc |   54 +++++++-------
+ poppler/CurlCachedFile.cc    |    2 +-
+ poppler/DCTStream.cc        |    2 +-
+ poppler/Decrypt.cc          |    2 +-
+ poppler/Error.cc            |   55 +++++++++-----
+ poppler/Error.h             |   23 +++++-
+ poppler/FileSpec.cc         |    8 +--
+ poppler/Form.cc             |   44 ++++++------
+ poppler/Function.cc         |  107 ++++++++++++++-------------
+ poppler/Gfx.cc                      |  161
+ ++++++++++++++++++++---------------------
+ poppler/GfxFont.cc          |  102 +++++++++++++-------------
+ poppler/GfxState.cc         |  128 ++++++++++++++++-----------------
+ poppler/GfxState.h          |    8 +--
+ poppler/GlobalParams.cc      |   38 +++++-----
+ poppler/GlobalParamsWin.cc   |    4 +-
+ poppler/Hints.cc            |   22 +++---
+ poppler/JBIG2Stream.cc       |   88 +++++++++++------------
+ poppler/JPEG2000Stream.cc    |   10 +--
+ poppler/JPXStream.cc        |  164
+ +++++++++++++++++++++---------------------
+ poppler/Lexer.cc            |   24 +++----
+ poppler/Linearization.cc     |   20 +++---
+ poppler/Link.cc             |   77 ++++++++++----------
+ poppler/Movie.cc            |    2 +-
+ poppler/Object.h            |    8 +--
+ poppler/OptionalContent.cc   |   14 ++--
+ poppler/PDFDoc.cc           |   43 ++++++-----
+ poppler/PDFDocFactory.cc     |    2 +-
+ poppler/PSOutputDev.cc       |   45 ++++++------
+ poppler/Page.cc             |   12 ++--
+ poppler/Parser.cc           |   10 +--
+ poppler/Rendition.cc        |    6 +-
+ poppler/SecurityHandler.cc   |   12 ++--
+ poppler/SplashOutputDev.cc   |   28 ++++----
+ poppler/Stream.cc           |  116 +++++++++++++++++-------------
+ poppler/TextOutputDev.cc     |    2 +-
+ poppler/UnicodeMap.cc       |   15 ++--
+ poppler/XRef.cc             |   32 ++++-----
+ splash/Splash.cc            |    2 +-
+ splash/SplashBitmap.cc       |    6 +-
+ test/perf-test.cc           |    4 +-
+ utils/HtmlOutputDev.cc       |   18 ++---
+ utils/ImageOutputDev.cc      |   10 +--
+ utils/pdfextract.cc         |    4 +-
+ utils/pdfimages.cc          |    2 +-
+ utils/pdfinfo.cc            |    6 +-
+ utils/pdfmerge.cc           |    6 +-
+ utils/pdftocairo.cc         |    6 +-
+ utils/pdftohtml.cc          |    6 +-
+ utils/pdftops.cc            |    6 +-
+ utils/pdftotext.cc          |   12 ++--
+ 61 files changed, 912 insertions(+), 842 deletions(-)
+
+commit cd0764921064bfd455e9df52dc9bda6fbd2c2db2
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Wed Aug 31 17:23:28 2011 +0200
+
+    xpdf303: Always define at least 256 glyphs for Type 0 fonts
+
+ fofi/FoFiTrueType.cc |   41 ++++++++++++++++++++++++++++++++++-------
+ fofi/FoFiTrueType.h  |    3 ++-
+ 2 files changed, 36 insertions(+), 8 deletions(-)
+
+commit 4d4318e258fb68704b1a51a14fa89134606e2aa7
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Wed Aug 31 17:07:25 2011 +0200
+
+    xpdf303: Different growing strategy for vmtxTab in FoFiTrueType
+
+ fofi/FoFiTrueType.cc |    2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit c8c7fcef9bc8f802be2d376c9d2099971f159317
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Wed Aug 31 17:05:16 2011 +0200
+
+    xpdf303: Fix memory leak in FoFiTrueType
+
+ fofi/FoFiTrueType.cc |    4 +++-
+ 1 file changed, 3 insertions(+), 1 deletion(-)
+
+commit 655b1a97db5449c009e5b63fc7c12233e6fae450
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Wed Aug 31 16:54:05 2011 +0200
+
+    xpdf303: Check for an invalid loca format field in the head table
+    in FoFiTrueType
+
+ fofi/FoFiTrueType.cc |    7 +++++++
+ 1 file changed, 7 insertions(+)
+
+commit 9710ab96f1cf26394cc473952a3331d60c149451
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Wed Aug 31 16:49:54 2011 +0200
+
+    Fix the build
+
+ fofi/FoFiIdentifier.cc |    2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 36b733a3165fd26aa8c25ba57faa5d2277aa31ec
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Tue Aug 30 16:31:52 2011 +0200
+
+    xpdf303: Handle bogus loca table entries in FoFiTrueType
+
+    where the offset is past the end of the glyf table. This part was
+    missing in previous commit.
+
+ fofi/FoFiTrueType.cc |    9 +++++++--
+ 1 file changed, 7 insertions(+), 2 deletions(-)
+
+commit a288bdb417582f07a5a0cb13d5218946a1d0ccc8
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Tue Aug 30 21:55:43 2011 +0200
+
+    xpdf303: Increase max keyLength to 32
+
+ poppler/XRef.cc |    4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 12e0acd9d393df76e297bb3fde323092c428be21
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Tue Aug 30 21:03:05 2011 +0200
+
+    xpdf303: GfxXXXpath different growing strategy
+
+ poppler/GfxState.cc |  10 +++++-----
+ 1 file changed, 5 insertions(+), 5 deletions(-)
+
+commit 7c5e496715f56498fb1aa08371d2b8d4d0e73d25
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Tue Aug 30 20:59:36 2011 +0200
+
+    xpdf303: No need for 4 Guint when 1 is enough
+
+ poppler/GfxState.cc |   6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
+
+commit e7e8082901e108130d5c98cc7648f143978c9562
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Tue Aug 30 20:50:17 2011 +0200
+
+    xpdf303: GooList::copy, GooList::reverse and GooList::put
+
+ goo/GooList.cc |   22 ++++++++++++++++++++++
+ goo/GooList.h |   10 ++++++++++
+ 2 files changed, 32 insertions(+)
+
+commit 8a119cf205467c20269e7beffde9497ffd277c15
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Tue Aug 30 20:48:40 2011 +0200
+
+    xpdf303: Inserting with a negative i means prepending
+
+ goo/GooList.cc |    3 +++
+ 1 file changed, 3 insertions(+)
+
+commit 95142a8e63e476324e368785001a23d4f1d462b9
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Tue Aug 30 20:47:12 2011 +0200
+
+    xpdf303: If size is 0 reserve 8 anyway
+
+ goo/GooList.cc |    2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit bd1076da03f76fb62998a9409d366412f4aa5d13
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Tue Aug 30 20:45:36 2011 +0200
+
+    xpdf303: Complain for gmalloc and grealloc < 0
+
+ goo/gmem.cc |  28 ++++++++++++++++++++++++----
+ 1 file changed, 24 insertions(+), 4 deletions(-)
+
+commit 5a42b3693a9e501a27d790d4aeafcb68f63cb950
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Tue Aug 30 20:38:39 2011 +0200
+
+    xpdf303: Honor the deleteKeys setting
+
+ goo/GooHash.cc |    8 ++++++--
+ 1 file changed, 6 insertions(+), 2 deletions(-)
+
+commit d584b54eff52c47f983947b2aff0967dfed0ccf9
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Tue Aug 30 20:36:03 2011 +0200
+
+    xpdf303: set to NULL on failure
+
+ goo/gfile.cc |    2 ++
+ 1 file changed, 2 insertions(+)
+
+commit bf2cb5c9c47b4a61192101f0a48771657228e383
+Author: Adrian Johnson <ajohnson@redneon.com>
+Date:  Tue Aug 30 19:08:40 2011 +0930
+
+    Fix compile error with libpng >= 1.5.0
+
+    libpng 1.5.0 changed one of the types in the png_set_iCCP() function
+    prototype.
+
+ goo/PNGWriter.cc |    9 ++++++++-
+ 1 file changed, 8 insertions(+), 1 deletion(-)
+
+commit 6364c50ffb4053cc30cecbefff7a3142cab8c50b
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Tue Aug 30 18:27:09 2011 +0200
+
+    xpdf303: Support for aes256 et all in Decrypt/SecurityHandler
+
+ poppler/Decrypt.cc        |  488
+ ++++++++++++++++++++++++++++++++++++++------
+ poppler/Decrypt.h         |   19 +-
+ poppler/PDFDoc.cc         |    2 +-
+ poppler/SecurityHandler.cc |  238 ++++++++++++---------
+ poppler/SecurityHandler.h  |   7 +-
+ poppler/Stream.h          |    3 +-
+ 6 files changed, 595 insertions(+), 162 deletions(-)
+
+commit 39ce4575f96953b499d09074e847d492d18379fa
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Tue Aug 30 17:39:30 2011 +0200
+
+    xpdf303: Add FoFiIdentifier
+
+ CMakeLists.txt                |    2 +
+ fofi/FoFiIdentifier.cc |  630
+ ++++++++++++++++++++++++++++++++++++++++++++++++
+ fofi/FoFiIdentifier.h |   42 ++++
+ fofi/Makefile.am      |    2 +
+ 4 files changed, 676 insertions(+)
+
+commit 33e7d54b4a29d297108ef3dc6008190625125ec8
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Tue Aug 30 17:36:22 2011 +0200
+
+    xpdf303: Also check against INT_MAX in FoFiBase
+
+ fofi/FoFiBase.cc |   10 +++++-----
+ 1 file changed, 5 insertions(+), 5 deletions(-)
+
+commit fb1f56f091e5329b30279916b182f64134f3b2e6
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Tue Aug 30 17:34:50 2011 +0200
+
+    xpdf303: Introduce FoFiBase::getU32LE
+
+ fofi/FoFiBase.cc |   15 +++++++++++++++
+ fofi/FoFiBase.h  |    1 +
+ 2 files changed, 16 insertions(+)
+
+commit a79bc3359586cbc2c235d20dfa934dab1f475561
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Tue Aug 30 16:59:08 2011 +0200
+
+    xpdf303: Check for a zero-entry cmap table in FoFiTrueType
+
+ fofi/FoFiTrueType.cc |   28 +++++++++++++++++-----------
+ 1 file changed, 17 insertions(+), 11 deletions(-)
+
+commit efce014e39d0d13157b21a10ff8d483b5cfc561a
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Tue Aug 30 17:02:16 2011 +0200
+
+    xpdf303: upddate xpdfCopyright
+
+ poppler/poppler-config.h.cmake |    4 ++--
+ poppler/poppler-config.h.in   |    4 ++--
+ 2 files changed, 4 insertions(+), 4 deletions(-)
+
+commit 2eb388ccc6c7526e66da804d9d800cf29a027914
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Tue Aug 30 16:50:39 2011 +0200
+
+    xpdf303: Merge README
+
+ README      |   2 +-
+ README-XPDF | 153
+ ++++++++++++++++++++++++++++++++++++++---------------------
+ 2 files changed, 101 insertions(+), 54 deletions(-)
+
+commit 331b0f1c16c4f636fc616569bab030969aa848f2
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Tue Aug 30 16:42:33 2011 +0200
+
+    xpdf303: Check for entries in the table directory with bogus tags
+    in FoFiTrueType
+
+    This handles the case where the number of tables given in the
+    header is
+    too high.
+
+ fofi/FoFiTrueType.cc |   30 +++++++++++++++++++++++++-----
+ 1 file changed, 25 insertions(+), 5 deletions(-)
+
+commit faaba717046ba87ef5ded614e2bcab6260a9f7c2
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Tue Aug 30 16:36:24 2011 +0200
+
+    xpdf303: FixedPoint improvements
+
+ goo/FixedPoint.cc     |   51
+ +++++++++++++++++++++++++++++++-----------------
+ goo/FixedPoint.h      |   15 ++++++++++++--
+ splash/Splash.cc      |   12 ++++++++++++
+ splash/SplashFTFont.cc |   16 +++++++--------
+ splash/SplashMath.h   |    8 +++++---
+ splash/SplashXPath.cc |    9 +++++++++
+ 6 files changed, 80 insertions(+), 31 deletions(-)
+
+commit 73efc96eef6bd32a7c058b7dda8101f4f23c454f
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Tue Aug 30 16:31:52 2011 +0200
+
+    xpdf303: Handle bogus loca table entries in FoFiTrueType
+
+    where the offset is past the end of the glyf table.
+
+ fofi/FoFiTrueType.cc |    4 ++++
+ 1 file changed, 4 insertions(+)
+
+commit 1df3489392a77e2b75adbafcc2fa10de829c172e
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Tue Aug 30 16:21:40 2011 +0200
+
+    xpdf303: Use std::sort (with functors) in place of qsort
+
+    It can be significantly faster. Not included changes in
+    SplashXPathScanner.cc since they depend on other changes not yet
+    merged.
+
+ fofi/FoFiTrueType.cc  |   55
+ ++++++++++++++++++++++--------------------------
+ poppler/GfxFont.cc    |   24 ++++++++++++++-------
+ splash/SplashScreen.cc |   12 +++++++----
+ splash/SplashXPath.cc |   44 ++++++++++++++++++--------------------
+ 4 files changed, 69 insertions(+), 66 deletions(-)
+
+commit f298e7f844105f2d9a36144e59be86c341e37507
+Merge: 2a6bd7a 0ca5453
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Tue Aug 30 16:21:58 2011 +0200
+
+    Merge branch 'master' into xpdf303merge
+
+commit 0ca5453fea9e5342188f772acd6f31af1778f236
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Tue Aug 30 16:20:17 2011 +0200
+
+    Compile when defining USE_FIXEDPOINT
+
+ splash/Splash.cc |    5 +++--
+ 1 file changed, 3 insertions(+), 2 deletions(-)
+
+commit bd7a53bc2f27fc3979f8de306e2dcaca53d4570a
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Tue Aug 30 16:20:08 2011 +0200
+
+    match function definition
+
+ poppler/SplashOutputDev.cc |   2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 2a6bd7aae37f73a94bf1a84f699f310177661611
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Tue Aug 30 15:13:17 2011 +0200
+
+    xpdf303: Expand latin1UnicodeMapRanges and ascii7UnicodeMapRanges
+
+ poppler/UnicodeMapTables.h |  10 +++++++---
+ 1 file changed, 7 insertions(+), 3 deletions(-)
+
+commit 4d31785409e464d0e96dcf11167ecdffd64026d1
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Tue Aug 30 15:09:01 2011 +0200
+
+    xpdf303: More entries for nameToUnicodeTab
+
+ poppler/NameToUnicodeTable.h | 3159
+ ++++++++++++++++++++++++++++++++++++++++++
+ 1 file changed, 3159 insertions(+)
+
+commit 2658030836f3a15dadadd7f1989dfaa858bf876f
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Tue Aug 30 14:49:23 2011 +0200
+
+    xpdf303: char * -> const char *
+
+ cmake/modules/PopplerMacros.cmake |   2 +-
+ configure.ac                     |    2 +-
+ cpp/poppler-private.cpp          |    2 +-
+ cpp/poppler-private.h            |    2 +-
+ fofi/FoFiBase.h                  |    2 +-
+ fofi/FoFiEncodings.cc            |    6 ++---
+ fofi/FoFiEncodings.h             |    6 ++---
+ fofi/FoFiTrueType.cc             |   10 ++++----
+ fofi/FoFiTrueType.h              |    4 ++--
+ fofi/FoFiType1.cc                |    4 ++--
+ fofi/FoFiType1.h                 |    2 +-
+ fofi/FoFiType1C.cc               |   14 +++++------
+ fofi/FoFiType1C.h                |    6 ++---
+ goo/GooHash.cc                           |   16 ++++++-------
+ goo/GooHash.h                    |   12 +++++-----
+ goo/GooString.cc                 |   22 +++++++++---------
+ goo/GooString.h                  |   16 ++++++-------
+ goo/gfile.cc                     |    4 ++--
+ goo/gfile.h                      |    4 ++--
+ goo/gmem.cc                      |    2 +-
+ goo/gmem.h                       |    2 +-
+ poppler/Annot.cc                 |    8 +++----
+ poppler/Annot.h                  |    6 ++---
+ poppler/ArthurOutputDev.cc       |    6 ++---
+ poppler/BuiltinFont.cc                   |    6 ++---
+ poppler/BuiltinFont.h            |   10 ++++----
+ poppler/DCTStream.cc             |    2 +-
+ poppler/DCTStream.h              |    2 +-
+ poppler/Dict.cc                  |   14 +++++------
+ poppler/Dict.h                           |   14 +++++------
+ poppler/Error.cc                 |   10 ++++----
+ poppler/Error.h                  |    6 ++---
+ poppler/FileSpec.cc              |    2 +-
+ poppler/FlateStream.cc                   |    2 +-
+ poppler/FlateStream.h            |    2 +-
+ poppler/FontEncodingTables.cc    |   14 +++++------
+ poppler/FontEncodingTables.h     |   14 +++++------
+ poppler/FontInfo.cc              |    2 +-
+ poppler/Form.cc                  |    6 ++---
+ poppler/Form.h                           |    4 ++--
+ poppler/Gfx.cc                           |    2 +-
+ poppler/Gfx.h                    |    2 +-
+ poppler/GfxFont.cc               |   46
+ ++++++++++++++++++-------------------
+ poppler/GfxFont.h                |    8 +++----
+ poppler/GfxState.cc              |    6 ++---
+ poppler/GfxState.h               |    2 +-
+ poppler/GlobalParams.cc          |   21 ++++++++---------
+ poppler/GlobalParams.h                   |    8 +++----
+ poppler/GlobalParamsWin.cc       |    6 ++---
+ poppler/JBIG2Stream.cc                   |    2 +-
+ poppler/JBIG2Stream.h            |    2 +-
+ poppler/JPEG2000Stream.cc        |    2 +-
+ poppler/JPEG2000Stream.h         |    2 +-
+ poppler/JPXStream.h              |    2 +-
+ poppler/NameToCharCode.cc        |    8 +++----
+ poppler/NameToCharCode.h         |    6 ++---
+ poppler/NameToUnicodeTable.h     |    2 +-
+ poppler/Object.cc                |    4 ++--
+ poppler/Object.h                 |   28 +++++++++++-----------
+ poppler/PDFDoc.cc                |    2 +-
+ poppler/PSOutputDev.cc                   |   24 +++++++++----------
+ poppler/PSOutputDev.h            |    8 +++----
+ poppler/Page.cc                  |    2 +-
+ poppler/Page.h                           |    2 +-
+ poppler/SplashOutputDev.cc       |    6 ++---
+ poppler/Stream.cc                |   16 ++++++-------
+ poppler/Stream.h                 |   28 +++++++++++-----------
+ poppler/TextOutputDev.cc         |    2 +-
+ poppler/TextOutputDev.h          |    2 +-
+ poppler/UnicodeMap.cc            |    4 ++--
+ poppler/UnicodeMap.h             |    4 ++--
+ poppler/UnicodeTypeTable.cc      |    4 ++--
+ qt4/src/poppler-private.cc       |    2 +-
+ qt4/src/poppler-ps-converter.cc   |   2 +-
+ splash/SplashFTFontEngine.cc     |    8 +++----
+ splash/SplashFTFontEngine.h      |    6 ++---
+ splash/SplashFTFontFile.cc       |    6 ++---
+ splash/SplashFTFontFile.h        |    2 +-
+ splash/SplashFontEngine.cc       |    6 ++---
+ splash/SplashFontEngine.h        |    6 ++---
+ splash/SplashT1FontEngine.cc     |    6 ++---
+ splash/SplashT1FontEngine.h      |    4 ++--
+ splash/SplashT1FontFile.cc       |   10 ++++----
+ splash/SplashT1FontFile.h        |    6 ++---
+ test/pdf-operators.c             |    4 ++--
+ test/perf-test.cc                |    4 ++--
+ utils/HtmlFonts.cc               |    4 ++--
+ utils/HtmlOutputDev.cc                   |   12 +++++-----
+ utils/HtmlOutputDev.h            |    4 ++--
+ utils/parseargs.cc               |    4 ++--
+ utils/parseargs.h                |    6 ++---
+ utils/pdffonts.cc                |    2 +-
+ utils/pdfinfo.cc                 |   12 +++++-----
+ utils/pdftocairo.cc              |    4 ++--
+ utils/pdftohtml.cc               |   10 ++++----
+ utils/pdftotext.cc               |   12 +++++-----
+ 96 files changed, 337 insertions(+), 338 deletions(-)
+
+commit c899d26e0f7a61db99925179330c28df015a676b
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Tue Aug 30 00:31:00 2011 +0200
+
+    Add COPYING3 from xpdf3.03
+
+ COPYING3 |  674
+ ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+ 1 file changed, 674 insertions(+)
+
+commit 508517a35cb3bc5195682a9cd89fb50a801eddc2
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Mon Aug 29 23:55:42 2011 +0200
+
+    0.17.3
+
+ CMakeLists.txt                |    4 ++--
+ NEWS                  |   32 ++++++++++++++++++++++++++++++++
+ configure.ac          |    2 +-
+ cpp/Doxyfile          |    2 +-
+ glib/CMakeLists.txt   |    2 +-
+ glib/Makefile.am      |    2 +-
+ poppler/Makefile.am   |    2 +-
+ qt4/src/CMakeLists.txt |    2 +-
+ qt4/src/Doxyfile      |    2 +-
+ qt4/src/Makefile.am   |    2 +-
+ 10 files changed, 42 insertions(+), 10 deletions(-)
+
+commit 1431564f3363a63a8669c8dd15970db814f4969f
+Author: Thomas Freitag <Thomas.Freitag@alfa.de>
+Date:  Mon Aug 29 22:22:02 2011 +0200
+
+    Add pdfextract and pdfmerge
+
+    See "Creating PDF with poppler ?" thread for more info
+
+ utils/CMakeLists.txt |   15 +++++
+ utils/Makefile.am    |   10 +++
+ utils/pdfextract.cc  |  111 +++++++++++++++++++++++++++++++
+ utils/pdfmerge.cc    |  176
+ ++++++++++++++++++++++++++++++++++++++++++++++++++
+ 4 files changed, 312 insertions(+)
+
+commit 8ca2f41089bc6402baf9b24428af04314c037b54
+Author: Thomas Freitag <Thomas.Freitag@alfa.de>
+Date:  Mon Aug 29 22:20:52 2011 +0200
+
+    Rework writing of PDF files
+
+    Makes it more compatible with other PDF readers
+    See "Creating PDF with poppler ?" thread in the mailing list for
+    more info
+
+ poppler/PDFDoc.cc |  389
+ +++++++++++++++++++++++++++++++++++++++++++++++------
+ poppler/PDFDoc.h  |   30 ++++-
+ 2 files changed, 375 insertions(+), 44 deletions(-)
+
+commit 33da7e270431e8e4c500e7573b3ca0dddd9f237e
+Author: suzuki toshiya <mpsuzuki@hiroshima-u.ac.jp>
+Date:  Sun Aug 28 22:07:38 2011 +0200
+
+    Fix building static-linked pdftocairo
+
+ utils/Makefile.am |   5 +++--
+ 1 file changed, 3 insertions(+), 2 deletions(-)
+
+commit 91fafce028ca6620c0eb22e370fb4c6fd3404e3c
+Author: Adrian Johnson <ajohnson@redneon.com>
+Date:  Tue Aug 23 21:02:02 2011 +0930
+
+    cairo: align strokes when Stroke Adjust is true and line width <= 1
+
+    If the stroke coordinates are not aligned, lines in cairo may be up to
+    1 pixel wider than the requested width. This is most obvious when the
+    line width is 1 and the rendered line is 2 pixels.
+
+    When Stroke Adjust is true, the PDF standard requires that stroke
+    coordinates be adjusted to ensure the stroke width is within half a
+    pixel of the requested width.
+
+    If Stroke Adjust is enabled and the width is <= 1 pixel (the previous
+    commit adjusts the width to be at least 1 pixel), use the method
+    documented at http://www.cairographics.org/FAQ/#sharp_lines to align
+    the coordinates to ensure the rendered width is 1 pixel.
+
+    Fixes bug #4536.
+
+ poppler/CairoOutputDev.cc |   40 +++++++++++++++++++++++++++++++++++-----
+ poppler/CairoOutputDev.h  |   3 +++
+ 2 files changed, 38 insertions(+), 5 deletions(-)
+
+commit cfc67afe80b963ba662018674cadf3085466bb9f
+Author: Adrian Johnson <ajohnson@redneon.com>
+Date:  Tue Aug 23 20:46:24 2011 +0930
+
+    cairo: fix stroking of very thin lines
+
+    Lines with a width less than 1.0 are almost invisible in cairo output
+    due to antialising. The PDF standard states that when the Stroke
+    Adjust graphics parameter is true, all lines must be at least one
+    pixel wide.
+
+    Add a stroke_adjust flag to the CairoOuputDev. Like splash, use the
+    globalParam strokeAdjust setting (which defaults to true) to
+    initialize the flag and ignore the Stroke Adjust settng in PDF
+    files. This emulates Acrobat behavior.
+
+    When stroke_adjust is true, find the line width in device pixels and
+    if less than 0.5 set the line width to 0.5 device pixels. The value
+    0.5 pixels seems to make horizontal and vertical lines look better
+    because integer aligned 1.0 wide lines in cairo are rendered two
+    pixels wide which looks too fat.
+
+ poppler/CairoOutputDev.cc |   20 +++++++++++++++++++-
+ poppler/CairoOutputDev.h  |   1 +
+ 2 files changed, 20 insertions(+), 1 deletion(-)
+
+commit 7a7c932e09796b944dda69df1b339c889ee1d63a
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Thu Aug 25 00:23:40 2011 +0200
+
+    Add a way to get the fully qualified name
+
+ qt4/src/poppler-form.cc |   12 +++++++++++-
+ qt4/src/poppler-form.h  |    8 +++++++-
+ 2 files changed, 18 insertions(+), 2 deletions(-)
+
+commit e001871d927f9cc86b4327d64e4c66ad00172ad0
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Wed Aug 24 23:44:18 2011 +0200
+
+    Clarify ownership
+
+ qt4/src/poppler-qt4.h |    3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+commit 87c48fdc175be4d852b953778f915ea93cd50194
+Author: Adrian Johnson <ajohnson@redneon.com>
+Date:  Wed Aug 24 19:53:48 2011 +0930
+
+    cairo: fix unique id mime data
+
+    The unique id string was copied before the object number was appended
+    resulting in all images in pdf output being the same.
+
+ poppler/CairoOutputDev.cc |   3 +--
+ 1 file changed, 1 insertion(+), 2 deletions(-)
+
+commit 08a2ba6f1603246651f0d5e697b88d38363d7df2
+Author: Pino Toscano <pino@kde.org>
+Date:  Tue Aug 23 20:20:32 2011 +0200
+
+    pdftocairo/cmake: need to link to freetype
+
+ utils/CMakeLists.txt |    2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 82496b18dc4aff66cc29f2b6607c8f894afe8b49
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Mon Aug 22 16:42:28 2011 +0200
+
+    Update Adrian (C)
+
+ poppler/GfxFont.h |   1 +
+ 1 file changed, 1 insertion(+)
+
+commit 2576e3a6d9746e2272c620a775e11295932eb5f2
+Author: Adrian Johnson <ajohnson@redneon.com>
+Date:  Mon Aug 22 21:41:36 2011 +0930
+
+    update SEE ALSO section of man pages
+
+    - ensure each man page references all other utils
+    - sort list of utils in alphabetical order
+
+ utils/pdffonts.1   |   8 +++++---
+ utils/pdfimages.1  |   8 +++++---
+ utils/pdfinfo.1    |   8 +++++---
+ utils/pdftocairo.1 |   2 +-
+ utils/pdftohtml.1  |   8 ++++++++
+ utils/pdftoppm.1   |   8 +++++---
+ utils/pdftops.1    |   8 +++++---
+ utils/pdftotext.1  |   9 +++++----
+ 8 files changed, 39 insertions(+), 20 deletions(-)
+
+commit 23ec5c8d394beb632ee45f6308215646cd1a0195
+Author: Adrian Johnson <ajohnson@redneon.com>
+Date:  Mon Aug 22 21:26:24 2011 +0930
+
+    cairo: only use show_text_glyphs if the surface supports it and the
+    font has toUnicode
+
+    When generating pdf output, fonts that do not have toUnicode cause an
+    excessive number of empty text ActualText entries to be written due to
+    glyphs that do not have have a mapping.
+
+ poppler/CairoOutputDev.cc |   12 ++++++++----
+ poppler/CairoOutputDev.h  |   1 +
+ poppler/GfxFont.h        |    3 +++
+ 3 files changed, 12 insertions(+), 4 deletions(-)
+
+commit 3a574f13fa22b7c31eda0d0437f4094a5a39ff34
+Author: Adrian Johnson <ajohnson@redneon.com>
+Date:  Fri Aug 19 23:23:24 2011 +0930
+
+    cairo: fix stroke patterns
+
+    Since cairo still does not yet have cairo_stroke_to_path(), this
+    implements a workaround for stroke patterns. In clipToStrokePath, the
+    stroke path and stroke parameters are saved. In tilingPatternFill and
+    fill (used to draw shading patterns) if a stroke path clip has been
+    saved, the current pattern is stroked instead of filled using the
+    saved stroke.
+    Fixes bug #11719.
+
+ poppler/CairoOutputDev.cc |   52
+ ++++++++++++++++++++++++++++++++++++++++++++-
+ poppler/CairoOutputDev.h  |   17 +++++++++++++--
+ 2 files changed, 66 insertions(+), 3 deletions(-)
+
+commit eb740dac838d2a1e32899327ca6d25c3dca641df
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Mon Aug 22 13:41:56 2011 +0200
+
+    glib-demo: Add text attributes information to text demo
+
+ glib/demo/text.c |  103
+ ++++++++++++++++++++++++++++++++++++++++++++++++++----
+ 1 file changed, 97 insertions(+), 6 deletions(-)
+
+commit cda4aefaa136ae07778de3b1593808a5aaa2db5b
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Mon Aug 22 13:40:49 2011 +0200
+
+    glib-demo: Add pgd_pixbuf_new_for_color() to utils
+
+    To get a pixbuf for a given poppler color.
+
+ glib/demo/annots.c |  22 +---------------------
+ glib/demo/utils.c  |  27 +++++++++++++++++++++++++++
+ glib/demo/utils.h  |   1 +
+ 3 files changed, 29 insertions(+), 21 deletions(-)
+
+commit 2a11b2963a548186654722a393db1e19d57828f1
+Author: danigm <danigm@wadobo.com>
+Date:  Mon Aug 22 12:51:50 2011 +0200
+
+    glib: Add poppler_page_get_text_attributes()
+
+    It returns a list of text attributes that apply to a range of text as
+    returned by poppler_page_get_text(). Text attributes are represented
+    by
+    a PopplerTextAttributes struct that contains font name, font size,
+    whether text is undrlined and foreground color for a range of text.
+    Fixes bug #33269.
+
+ glib/poppler-page.cc               |  202
+ +++++++++++++++++++++++++++++++++++
+ glib/poppler-page.h                |   33 ++++++
+ glib/poppler.h                             |    1 +
+ glib/reference/poppler-sections.txt |   7 ++
+ 4 files changed, 243 insertions(+)
+
+commit 15f99157cf3900bf20cf619e204ae53085af497d
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Mon Aug 22 12:43:12 2011 +0200
+
+    textoutputdev: Add TextFontInfo::matches()
+
+    It checks whether two TextFontInfo objects contain the same font.
+
+ poppler/TextOutputDev.cc |    4 ++++
+ poppler/TextOutputDev.h  |    1 +
+ 2 files changed, 5 insertions(+)
+
+commit 5b554b39fca634c8ba58915c14522cb2920fe280
+Author: Pino Toscano <pino@kde.org>
+Date:  Mon Aug 22 13:16:23 2011 +0200
+
+    pdftocairo/cmake: link to lcms library if available
+
+ utils/CMakeLists.txt |    3 +++
+ 1 file changed, 3 insertions(+)
+
+commit f7cd236fea8740ef05635d1fd7917a778cc373f0
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Mon Aug 22 00:00:32 2011 +0200
+
+    Ship HtmlUtils.h
+
+ utils/Makefile.am |   1 +
+ 1 file changed, 1 insertion(+)
+
+commit a128a858c50287cfba74c69996276ea44370dc26
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Sun Aug 21 23:52:06 2011 +0200
+
+    Update Adrian's (C)
+
+ goo/PNGWriter.cc |    2 +-
+ goo/PNGWriter.h  |    2 +-
+ 2 files changed, 2 insertions(+), 2 deletions(-)
+
+commit b78134314107d8344360c3313478115ed291630d
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Sun Aug 21 23:46:09 2011 +0200
+
+    Fix copyright
+
+    c&p is evil
+
+ goo/gtypes_p.h |    2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit ade53277546cef4ba19d982518c0cd83a4bb9c12
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Sun Aug 21 23:42:53 2011 +0200
+
+    Move HAVE_STDINT_H use to a private header
+
+    This way we do not need to expose it in poppler-config.h since
+    gtypes.h is a half public header
+
+ goo/Makefile.am           |    1 +
+ goo/gtypes.h              |   18 ------------------
+ goo/gtypes_p.h                    |   30 ++++++++++++++++++++++++++++++
+ poppler/CairoOutputDev.cc  |   1 +
+ poppler/CairoRescaleBox.cc |   1 +
+ utils/pdftocairo.cc       |    1 +
+ 6 files changed, 34 insertions(+), 18 deletions(-)
+
+commit 6166c3a37a4d6307d4f23ee272ea07c95bbba74a
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Sun Aug 21 23:31:30 2011 +0200
+
+    Silence silly gcc
+
+ goo/PNGWriter.cc |    5 +++--
+ 1 file changed, 3 insertions(+), 2 deletions(-)
+
+commit eb5b228c4c24152e632c931b63c64ffb1e10d45d
+Author: Adrian Johnson <ajohnson@redneon.com>
+Date:  Sat Aug 20 21:13:18 2011 +0930
+
+    pdftocairo: fix writing to stdout for ps/pdf/svg
+
+ utils/pdftocairo.cc |  23 ++++++++++++++++++++---
+ 1 file changed, 20 insertions(+), 3 deletions(-)
+
+commit 1beac5896a301be68de22240017fef11e7d27d40
+Author: Adrian Johnson <ajohnson@redneon.com>
+Date:  Sat Aug 13 00:23:23 2011 +0930
+
+    Add poppler version to PSOutputDev ouput
+
+ poppler/PSOutputDev.cc |    1 +
+ 1 file changed, 1 insertion(+)
+
+commit b35fd3651fd3dbaa876fc64b8c5cfe77ae67335f
+Author: Adrian Johnson <ajohnson@redneon.com>
+Date:  Fri Aug 5 23:01:51 2011 +0930
+
+    cairo: use cairo_show_text_glyphs() when printing
+
+    This will allow cairo to setup the correct toUnicode or glyph names to
+    ensure text can be extracted.
+
+ poppler/CairoOutputDev.cc |   41
+ ++++++++++++++++++++++++++++++++++++++---
+ poppler/CairoOutputDev.h  |   5 +++++
+ 2 files changed, 43 insertions(+), 3 deletions(-)
+
+commit 51ade078bc1fa737e20120ae4cb3bf693a219823
+Author: Stefan Thomas <thomas@txtbear.com>
+Date:  Thu Jul 15 16:24:55 2010 +0100
+
+    pdftocairo: Added to CMake build system.
+
+ utils/CMakeLists.txt |   20 ++++++++++++++++++++
+ 1 file changed, 20 insertions(+)
+
+commit 5a8745cdf428e22641937977eedfc1d605f6ff07
+Author: Adrian Johnson <ajohnson@redneon.com>
+Date:  Fri Aug 12 23:57:01 2011 +0930
+
+    Add pdftocairo man page
+
+ utils/Makefile.am  |   5 +-
+ utils/pdftocairo.1 |  254
+ ++++++++++++++++++++++++++++++++++++++++++++++++++++
+ 2 files changed, 258 insertions(+), 1 deletion(-)
+
+commit b67a12b2b26692e2ccec7ff2e6df18fee05be535
+Author: Adrian Johnson <ajohnson@redneon.com>
+Date:  Thu Aug 11 21:34:11 2011 +0930
+
+    pdftocairo - utility for creating png/jpeg/ps/eps/pdf/svg using
+    CairoOutputDev
+
+ utils/.gitignore    |   2 +-
+ utils/Makefile.am   |  20 +-
+ utils/pdftocairo.cc | 970
+ +++++++++++++++++++++++++++++++++++++++++++++++++++
+ 3 files changed, 989 insertions(+), 3 deletions(-)
+
+commit 4f2d774826bf7bb7b3825e02c5ca4c2928643950
+Author: Adrian Johnson <ajohnson@redneon.com>
+Date:  Thu Aug 11 21:32:53 2011 +0930
+
+    png: add support for embedding ICC profile
+
+ goo/PNGWriter.cc |   28 ++++++++++++++++++++++++++++
+ goo/PNGWriter.h  |    8 ++++++++
+ 2 files changed, 36 insertions(+)
+
+commit 1091f47310bf0fc71bac5dd4ec81dad50b2f2537
+Author: Adrian Johnson <ajohnson@redneon.com>
+Date:  Wed Aug 10 18:48:15 2011 +0930
+
+    png: Add additional pixel formats
+
+    RGBA is required for images with transparency. GRAY and MONOCHROME
+    allow PNGWriter write more compact PNG files when the images is known
+    to be all gray or monochrome.
+
+ goo/PNGWriter.cc |   30 ++++++++++++++++++++++++++----
+ goo/PNGWriter.h  |   11 ++++++++++-
+ 2 files changed, 36 insertions(+), 5 deletions(-)
+
+commit c6f26915db568f12892d48005746ad2922c19000
+Author: Adrian Johnson <ajohnson@redneon.com>
+Date:  Wed Aug 10 18:45:24 2011 +0930
+
+    png: use PNG_RESOLUTION_METER instead of PNG_RESOLUTION_UNKNOWN to
+    set resolution
+
+    gimp does not show the correct resolution unless PNG_RESOLUTION_METER
+    is used
+
+ goo/PNGWriter.cc |    3 +--
+ 1 file changed, 1 insertion(+), 2 deletions(-)
+
+commit 2667d2a5b34e1bbf322aea42876e7e81aa06dc29
+Author: Adrian Johnson <ajohnson@redneon.com>
+Date:  Tue Aug 9 22:05:53 2011 +0930
+
+    Use stdint.h instead of assuming the size of types
+
+ configure.ac              |    1 +
+ goo/gtypes.h              |   18 ++++++++++++++++++
+ poppler/CairoOutputDev.cc  |   2 --
+ poppler/CairoRescaleBox.cc |   2 --
+ 4 files changed, 19 insertions(+), 4 deletions(-)
+
+commit c043f298e68bdfffcb7505ec354ec7487b5bd7b2
+Author: Adrian Johnson <ajohnson@redneon.com>
+Date:  Fri Jul 8 21:13:36 2011 +0930
+
+    cairo: assume printer pixel size is 1/600" when stroking 0 width lines
+
+    Fixes bug #39067.
+
+ poppler/CairoOutputDev.cc |   5 +++++
+ 1 file changed, 5 insertions(+)
+
+commit 961adf0b767be78d3556b7315de3761d3d46b107
+Author: Adrian Johnson <ajohnson@redneon.com>
+Date:  Thu Aug 18 17:44:35 2011 +0930
+
+    cairo: set mime data for soft masked images
+
+    Fixes bug #40192.
+
+ poppler/CairoOutputDev.cc |   3 +++
+ 1 file changed, 3 insertions(+)
+
+commit 86271e4810f714d4ba7a2a6651a9b1d04f653262
+Author: Joshua Richardson <jric@chegg.com>
+Date:  Thu Aug 18 18:48:40 2011 +0200
+
+    pdftohtml: Support text rotation
+
+    Includes a few other fixlets.
+    See bug 38586 for more info
+
+ utils/HtmlFonts.cc    |   64 +++++++++---------
+ utils/HtmlFonts.h     |   10 ++-
+ utils/HtmlOutputDev.cc |  170
+ +++++++++++++++++++++++++++++++++---------------
+ utils/HtmlOutputDev.h |    8 ++-
+ utils/HtmlUtils.h     |   51 +++++++++++++++
+ 5 files changed, 218 insertions(+), 85 deletions(-)
+
+commit 56248b84e2185483dd54704c13838e8f78029d49
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Thu Aug 18 12:40:51 2011 +0200
+
+    Only declare overprint if we are going to use it
+
+ utils/pdftoppm.cc |   4 +++-
+ 1 file changed, 3 insertions(+), 1 deletion(-)
+
+commit a1093aae9f64cb6768164551d50cafaef52876c1
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Thu Aug 18 12:30:29 2011 +0200
+
+    Fix Adrian's (C)
+
+ poppler/PSOutputDev.cc      |   2 +-
+ poppler/PSOutputDev.h      |    3 ++-
+ poppler/PreScanOutputDev.cc |   1 +
+ poppler/PreScanOutputDev.h  |   1 +
+ poppler/SplashOutputDev.cc  |   1 +
+ poppler/SplashOutputDev.h   |   1 +
+ 6 files changed, 7 insertions(+), 2 deletions(-)
+
+commit 7741b24d05f50c134cf15361d52f5df7ae3c3115
+Author: Adrian Johnson <ajohnson@redneon.com>
+Date:  Sun Aug 14 22:06:22 2011 +0930
+
+    ps: Avoid using /PatternType if only one instance of the pattern
+    is used
+
+    this optimization makes pages print faster on my LaserJet
+
+ poppler/PSOutputDev.cc |    3 +++
+ 1 file changed, 3 insertions(+)
+
+commit a60e61ac64634dc59c80d8e6b0288c1269fc0154
+Author: Adrian Johnson <ajohnson@redneon.com>
+Date:  Sun Aug 14 21:55:24 2011 +0930
+
+    ps: use PS Patterns for tiling fill when PS level >= 2
+
+ poppler/CairoOutputDev.cc   |   2 +-
+ poppler/CairoOutputDev.h    |   4 +--
+ poppler/Gfx.cc                     |    4 +--
+ poppler/OutputDev.h        |    2 +-
+ poppler/PSOutputDev.cc      |  59
+ +++++++++++++++++++++++++++++++++++++++----
+ poppler/PSOutputDev.h      |   13 +++++++++-
+ poppler/PreScanOutputDev.cc |   2 +-
+ poppler/PreScanOutputDev.h  |   2 +-
+ poppler/SplashOutputDev.cc  |   2 +-
+ poppler/SplashOutputDev.h   |   2 +-
+ 10 files changed, 76 insertions(+), 16 deletions(-)
+
+commit 9938770e737b2fcec8269147e70663517f848925
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Mon Aug 15 13:17:24 2011 +0200
+
+    0.17.2
+
+ CMakeLists.txt                |    4 ++--
+ NEWS                  |   37 +++++++++++++++++++++++++++++++++++++
+ configure.ac          |    2 +-
+ cpp/Doxyfile          |    2 +-
+ glib/CMakeLists.txt   |    2 +-
+ glib/Makefile.am      |    2 +-
+ poppler/Makefile.am   |    2 +-
+ qt4/src/CMakeLists.txt |    2 +-
+ qt4/src/Doxyfile      |    2 +-
+ qt4/src/Makefile.am   |    5 +++--
+ 10 files changed, 49 insertions(+), 11 deletions(-)
+
+commit 378fc06c574b85b5c003ca842aa743f0ffe5587e
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Mon Aug 1 22:14:12 2011 +0200
+
+    Only assume the OC is not visible if it exists and is set to no
+
+    Similar to commit e2def20a45c1d8307fd62fabb9769121af975abf
+    but in the other branch of the if, fixes bug 39637
+
+ poppler/OptionalContent.cc |   4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 861a7bfb9431609e1e148240447f23c8e83b9d0f
+Author: Thomas Freitag <Thomas.Freitag@alfa.de>
+Date:  Fri Jul 29 00:30:58 2011 +0200
+
+    Implement overprint in Splash
+
+    See the "Implementing overprint in Splash" thread in the mailing
+    list for more info
+
+ goo/ImgWriter.h           |    2 +
+ goo/JpegWriter.cc         |   54 ++++++--
+ goo/JpegWriter.h          |    7 +-
+ poppler/Gfx.cc                    |   98 ++++++++++++--
+ poppler/GfxState.cc       |    1 +
+ poppler/GfxState.h        |    4 +
+ poppler/OutputDev.h       |    1 +
+ poppler/SplashOutputDev.cc |  307
+ ++++++++++++++++++++++++++++++++++++++------
+ poppler/SplashOutputDev.h  |  51 +++++++-
+ splash/Splash.cc          |   86 ++++++++++---
+ splash/Splash.h           |    9 +-
+ splash/SplashBitmap.cc     |  64 ++++++++-
+ splash/SplashBitmap.h     |    1 +
+ splash/SplashPattern.cc    |  16 ++-
+ splash/SplashPattern.h     |   7 +
+ splash/SplashState.cc     |   11 +-
+ splash/SplashState.h      |   22 ++++
+ splash/SplashTypes.h      |    5 +-
+ utils/pdftoppm.cc         |   36 +++++-
+ 19 files changed, 686 insertions(+), 96 deletions(-)
+
+commit e2fa8a2ca8459d19c0f9dca445a2399b9a3d483d
+Author: Koji Otani <sho@bbr.jp>
+Date:  Thu Jul 28 12:43:57 2011 +0200
+
+    Parse the "Medium" modifier when asking fontconfig for a font
+
+ poppler/GlobalParams.cc |    2 ++
+ 1 file changed, 2 insertions(+)
+
+commit 0a677dd8dc9c55936530ea1fee901cab831c52af
+Author: Koji Otani <sho@bbr.jp>
+Date:  Thu Jul 28 12:42:16 2011 +0200
+
+    Improve selection of CJK fonts
+
+    Seems we need to do some more fontconfig magic for some special
+    fontconfig configurations
+    More info at bug 36474
+
+ poppler/GlobalParams.cc |  137
+ ++++++++++++++++++++++++++++++-----------------
+ 1 file changed, 89 insertions(+), 48 deletions(-)
+
+commit e78aff6796a5d5a0a4f2fe8c7ceb33c506e2c8f5
+Author: William Bader <williambader@hotmail.com>
+Date:  Tue Jul 26 00:10:34 2011 +0200
+
+    make -level1sep write gray instead of cmyk
+
+    If it is a gray only image
+    Bug 39012
+
+ poppler/PSOutputDev.cc |   63
+ +++++++++++++++++++++++++++++++++++++++++++++---
+ 1 file changed, 60 insertions(+), 3 deletions(-)
+
+commit ea31309487aab6ed407a086dff1f350b6e4bdbc9
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Tue Jul 26 00:09:27 2011 +0200
+
+    Update (C)
+
+ poppler/PDFDoc.cc |   2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit a945641497946a825dc880f94200ea1d5409332b
+Author: Hib Eris <hib@hiberis.nl>
+Date:  Sat Jul 23 08:44:06 2011 +0200
+
+    Handle missing startxref properly
+
+    Bug 38209
+
+ poppler/PDFDoc.cc |   5 +++--
+ 1 file changed, 3 insertions(+), 2 deletions(-)
+
+commit 2c1b25ef2592367f4c18e204ab5d102f15cf272f
+Author: William Bader <williambader@hotmail.com>
+Date:  Mon Jul 25 23:43:27 2011 +0200
+
+    Fix a bad memory access
+
+    When not using antialias and the character starts to the left/top
+    of the image
+    Bug 37189
+
+ splash/Splash.cc |   14 ++++++++++----
+ 1 file changed, 10 insertions(+), 4 deletions(-)
+
+commit 300900afa2140141748a7571270be5d850274072
+Author: Daniel Glöckner <daniel-gl@gmx.net>
+Date:  Sat Jul 23 19:49:15 2011 +0200
+
+    Fix numerical overflow in libopenjpeg JPXStream::doLookChar()
+
+    It also includes a speed optimization. Bug 39361
+
+ poppler/JPEG2000Stream.cc |   37 ++++++++++++++++++++++++++++++++++++-
+ poppler/JPEG2000Stream.h  |   36 +++++++++++-------------------------
+ 2 files changed, 47 insertions(+), 26 deletions(-)
+
+commit ec6ea621b066a3b332a8099341664889d2ff3743
+Author: Axel Struebing <axel.struebing@freenet.de>
+Date:  Thu Jul 21 23:12:36 2011 +0200
+
+    Fix calculation of startXRefPos
+
+    Reviewed by Hib Eris
+    See "another problem with saving linearized files" in the mailing
+    list for more info
+
+ poppler/PDFDoc.cc |   9 ++++++---
+ 1 file changed, 6 insertions(+), 3 deletions(-)
+
+commit ce97cfcd6373c98fb8c63e9b3ef6c51738f22a50
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Wed Jul 20 00:24:52 2011 +0200
+
+    Render dots for 0 length dashed lines
+
+    Bug 34150
+
+ splash/Splash.cc |   13 +++++++++++++
+ 1 file changed, 13 insertions(+)
+
+commit 42c1b1c4af6b07f488d1b2b02a4700f19b0ab0ef
+Author: Tomas Hoger <thoger@redhat.com>
+Date:  Wed Jul 20 00:23:15 2011 +0200
+
+    Fix crash on truncated JPEG/DCT stream
+
+    Bug 36693
+
+ poppler/DCTStream.cc |    6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
+
+commit 091b570c63694e475c24bb8805638ac70c654892
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Wed Jul 20 00:19:43 2011 +0200
+
+    Make sure the dict is a page dict
+
+    Fixes second part of 35925 and 39072
+
+ poppler/PDFDoc.cc |   2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit ac566c887ffae9d384587f7587609642aef7a016
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Wed Jul 20 00:17:49 2011 +0200
+
+    Do not crash if can not get page 0 for some reason
+
+ qt4/tests/test-poppler-qt4.cpp |    7 +++++--
+ 1 file changed, 5 insertions(+), 2 deletions(-)
+
+commit 6ad95e7b8b9766aa19f01f06f02eb430e4a4a899
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Mon Jul 11 15:04:49 2011 +0100
+
+    Complete the list of preprocessor defines that we never define
+
+    When using any of the two sanctioned build systems
+
+ poppler/poppler-config.h.cmake |    6 ++++--
+ poppler/poppler-config.h.in   |    6 ++++--
+ 2 files changed, 8 insertions(+), 4 deletions(-)
+
+commit edcc84ef0137a733cf3fab79b919af309d87325c
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Mon Jul 11 15:00:39 2011 +0100
+
+    Harmonize all SPLASH_CMYK to use #if
+
+ poppler/SplashOutputDev.cc |  24 ++++++++++++------------
+ 1 file changed, 12 insertions(+), 12 deletions(-)
+
+commit a8fca630d592941c033ca6a380bf46b6e733a748
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Mon Jul 11 14:57:33 2011 +0100
+
+    Sanitize headers a big
+
+     * Remove includes to config.h as that file does not exist
+     * Add to poppler-config.h all the defines we define in the
+       configure/cmake process and are used in headers
+     * Include poppker-config.h where needed
+
+ goo/GooTimer.h                        |    2 ++
+ goo/ImgWriter.h               |    3 +-
+ goo/JpegWriter.h              |    3 +-
+ goo/PNGWriter.h               |    4 +--
+ goo/TiffWriter.h              |    3 +-
+ goo/gfile.h                   |    3 +-
+ poppler/DCTStream.h           |    5 ++--
+ poppler/FlateStream.h         |    5 ++--
+ poppler/Gfx.h                 |    3 +-
+ poppler/GfxState.h            |    2 ++
+ poppler/Stream.h              |    3 +-
+ poppler/poppler-config.h.cmake |   63
+ ++++++++++++++++++++++++++++++++++++++++
+ poppler/poppler-config.h.in   |   63
+ ++++++++++++++++++++++++++++++++++++++++
+ splash/SplashFTFont.h         |    4 ++-
+ splash/SplashMath.h           |    4 ++-
+ 15 files changed, 153 insertions(+), 17 deletions(-)
+
+commit 214322f3c66a9aad4e2a46f6e305a3dacaa4f8b1
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Sun Jul 10 01:20:21 2011 +0100
+
+    And 3 years later, Ed has answered :-)
+
+    Now all our changes are GPLv2+
+
+ poppler/GfxFont.cc         |    3 +++
+ poppler/GlobalParams.cc     |   3 +++
+ poppler/TextOutputDev.cc    |   3 +++
+ poppler/TextOutputDev.h     |   3 +++
+ poppler/UnicodeTypeTable.cc |   3 +++
+ poppler/UnicodeTypeTable.h  |   3 +++
+ 6 files changed, 18 insertions(+)
+
+commit 37cc1344672f480d4062aafbd2f3245ca1392279
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Sun Jul 10 01:15:44 2011 +0100
+
+    Fix header
+
+    The file was modified in 2009 and README.contributors stating
+    everything is GPLv2+ is from 2008
+
+ poppler/XpdfPluginAPI.cc |    3 +++
+ 1 file changed, 3 insertions(+)
+
+commit 230ab66f52a992557464e325d18f88573ec52423
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Sun Jul 10 01:06:41 2011 +0100
+
+    make files easier to include by themselves
+
+ fofi/FoFiTrueType.h      |    2 ++
+ splash/Splash.h          |    3 ++-
+ splash/SplashFontEngine.h |   3 ++-
+ 3 files changed, 6 insertions(+), 2 deletions(-)
+
+commit 866c6d1b0daa8b28f259e1faba075026cf9007e0
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Sun Jul 10 00:55:25 2011 +0100
+
+    Name most of the classes in poppler/ includable by themselves
+
+ poppler/Annot.h             |    4 +++-
+ poppler/Catalog.h           |    2 ++
+ poppler/CharCodeToUnicode.h  |    4 +++-
+ poppler/CompactFontTables.h  |   16 ++++++++++++++++
+ poppler/FontInfo.h          |    6 +++++-
+ poppler/GfxState_helpers.h   |    4 +++-
+ poppler/NameToUnicodeTable.h |   18 ++++++++++++++++++
+ 7 files changed, 50 insertions(+), 4 deletions(-)
+
+commit 6b62fb7e9bd7de7f79b9b9a6fe36a5f5da099133
+Author: William Bader <williambader@hotmail.com>
+Date:  Mon Jun 27 19:38:52 2011 +0100
+
+    Remove unused variable
+
+ poppler/PSOutputDev.cc |    5 +----
+ 1 file changed, 1 insertion(+), 4 deletions(-)
+
+commit 4bc6c5bd3a001bb4eb9f61488e3d4f356638e391
+Author: Adrian Bunk <bunk@stusta.de>
+Date:  Tue Jul 5 15:21:06 2011 +0300
+
+    .gitignore tests additions
+
+    The following files were missing in .gitignore:
+    - cpp/tests/poppler-render
+    - qt4/tests/poppler-texts
+    - test/gtk-test
+
+ cpp/tests/.gitignore |    1 +
+ qt4/tests/.gitignore |    1 +
+ test/.gitignore      |    1 +
+ 3 files changed, 3 insertions(+)
+
+commit 00076bc308ae320244c47777fe351c1c2bef2da8
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Fri Jun 24 22:51:55 2011 +0100
+
+    Forgot William's (C) here
+
+ poppler/Stream.cc |   1 +
+ poppler/Stream.h  |   1 +
+ 2 files changed, 2 insertions(+)
+
+commit 7e244fde4ec03da08d81af3402b21646c803bd31
+Author: William Bader <williambader@hotmail.com>
+Date:  Fri Jun 24 22:39:13 2011 +0100
+
+    patch to make -level2sep and -level3sep write gray instead of cmyk
+
+    If they are only gray of course :D
+
+ poppler/PSOutputDev.cc |   34 ++++++++++++++++++++++++++++++----
+ poppler/Stream.cc     |   43 +++++++++++++++++++++++++++++++++++++++++++
+ poppler/Stream.h      |   29 +++++++++++++++++++++++++++++
+ 3 files changed, 102 insertions(+), 4 deletions(-)
+
+commit abba8140a9972197faaca96ec590af7dc9408fb0
+Author: William Bader <williambader@hotmail.com>
+Date:  Fri Jun 24 22:38:33 2011 +0100
+
+    patch to make -level2sep and -level3sep write cmyk instead of rgb
+
+ poppler/PSOutputDev.cc |   59
+ ++++++++++++++++++++++++++++++++++++++++++++----
+ 1 file changed, 54 insertions(+), 5 deletions(-)
+
+commit 706007431325b1e8c9bf4cba35c89511b10ebf0c
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Mon Jun 20 23:30:50 2011 +0100
+
+    (C) for Jim
+
+ fofi/FoFiBase.cc |    1 +
+ 1 file changed, 1 insertion(+)
+
+commit e23384fbb3542941d2cf59ce6560913255ca2b01
+Author: Jim Meyering <meyering@redhat.com>
+Date:  Mon Jun 20 11:09:01 2011 +0200
+
+    don't gmalloc(-1) upon ftell failure
+
+    * fofi/FoFiBase.cc: Diagnose ftell failure.
+
+ fofi/FoFiBase.cc |    5 +++++
+ 1 file changed, 5 insertions(+)
+
+commit c5601bde9d8f3f56e558a6f63e563c9d337810eb
+Author: Steven Murdoch <Steven.Murdoch@cl.cam.ac.uk>
+Date:  Mon Jun 20 23:25:43 2011 +0100
+
+    Fix encoding of PDF document metadata in output of pdftohtml
+
+    pdftohtml simply copies the PDF document title into the <title> HTML
+    tag, which fails when the title is UCS-2 encoded, or if it contains
+    characters which are in pdfDocEncoding (a ISO 8859-1 superset),
+    but not
+    in ISO 8859-1.  This patch fixes the problem by decoding UCS-2 or
+    pdfDocEncoding into Unicode, then encoding this in the desired output
+    encoding.  HTML escaping wasn't being done either, so I have used the
+    existing function HtmlFont::HtmlFilter to perform both HTML escaping
+    and character set encoding. This static method had to be made public
+    to call it from pdftohtml. See bug #37900.
+
+ utils/HtmlFonts.h  |   3 ++-
+ utils/pdftohtml.cc |  41 ++++++++++++++++++++++++++++++++++++++---
+ 2 files changed, 40 insertions(+), 4 deletions(-)
+
+commit d4af1c4ef46abf1f11b7215c7b144ce7bb7912eb
+Author: Joshua Richardson <joshuarbox-junk1@yahoo.com>
+Date:  Sat Jun 18 13:39:54 2011 +0100
+
+    Fix vertical spacing issues in pdftohtml output.
+
+    Bug 38019
+
+ utils/HtmlFonts.cc    |    3 ++-
+ utils/HtmlOutputDev.cc |   21 +++++++++++++++++++--
+ 2 files changed, 21 insertions(+), 3 deletions(-)
+
+commit 589933ef105b60e8d48854cce15a7548c2850116
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Mon Jun 13 21:24:39 2011 +0100
+
+    Forgot my (C)
+
+ poppler/PreScanOutputDev.cc |   2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit f5d2ddd13d27078355dee63207671885bf9b0926
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Mon Jun 13 18:57:29 2011 +0100
+
+    We need to include config.h here
+
+    Fixes crash after patch to fix bug 13518
+
+ poppler/PreScanOutputDev.cc |   2 ++
+ 1 file changed, 2 insertions(+)
+
+commit 147ae4bf76a85768c9ed729ca10ee3dae93b8876
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Wed Jun 8 23:36:14 2011 +0100
+
+    Do not crash if link does not have an action
+
+ utils/HtmlOutputDev.cc |    2 ++
+ 1 file changed, 2 insertions(+)
+
+commit 5d9489bf566b700ef38e5e33665a2648b535e1e7
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Sat Jun 4 21:46:10 2011 +0100
+
+    forgot to update the C
+
+ utils/pdftotext.cc |   1 +
+ 1 file changed, 1 insertion(+)
+
+commit 7b123bf2b11ac81f24a966186a06de739d3c8f02
+Author: Steven Murdoch <Steven.Murdoch@cl.cam.ac.uk>
+Date:  Sat Jun 4 20:22:52 2011 +0100
+
+    Fix pdftotext -htmlmeta to correctly output U+2019 in PDF metadata
+
+    In PDF documents, right single quotation mark (U+2019) may be
+    encoded as
+    0x90 because PDFDocEncoding uses some of the reserved characters in
+    ISO 8859-1. However, pdftotext -htmlmeta assumes that characters
+    are either
+    UCS-2 or ISO 8859-1. Thus when a right single quotation mark is
+    encoded as
+    0x90, it is output as unicode 0x90 (which is a control
+    character). pdfinfo
+    does the right thing by first converting from PDFDocEncoding to
+    Unicode
+    with pdfDocEncoding[], before encoding it in the desired character
+    set.
+    This patch applies the same logic to pdftotext. pdftohtml is broken
+    in the
+    same way, but this patch does not attempt to fix it.
+
+    Bug 37900
+
+ utils/pdftotext.cc |   3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+commit db2ae1bdbb7fcb64ba4c91dfc574d9f970bebdf6
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Sat Jun 4 13:23:11 2011 +0100
+
+    Make sure catDict is a dict
+
+ poppler/Catalog.cc |   5 +++++
+ 1 file changed, 5 insertions(+)
+
+commit 58915affbdf1b5780f25d172a582c69fb2413230
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Sat Jun 4 13:20:02 2011 +0100
+
+    Make sure catDict is a dict before using it
+
+    KDE Bug 274888 shows it's possible to get aborts because of that
+
+ poppler/Catalog.cc |  26 ++++++++++++++++----------
+ 1 file changed, 16 insertions(+), 10 deletions(-)
+
+commit 4ebc7e364409fe303e7a5729b568913e3c92e7d4
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Sat Jun 4 13:19:34 2011 +0100
+
+    We need to free catDict on failure
+
+ poppler/Catalog.cc |   1 +
+ 1 file changed, 1 insertion(+)
+
+commit 335a7fc6d98f5facc1ff098a91ac968387473cb3
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Tue May 31 23:18:26 2011 +0100
+
+    Make parse() private
+
+ poppler/Catalog.h |   4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 311d69ef2222409859817737c44b8e741289d897
+Author: Axel Strübing <axel.struebing@freenet.de>
+Date:  Sun May 29 16:12:29 2011 +0100
+
+    Needs to be freed
+
+    As i said in my last commit comment :D
+
+ poppler/PDFDoc.cc |   6 ++++--
+ 1 file changed, 4 insertions(+), 2 deletions(-)
+
+commit 66c7d0199b45bc7c81c88a9989c9515398d30d43
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Sat May 28 17:32:02 2011 +0100
+
+    No need to check for NULL
+
+    We probably need to free obj4 but i don't have the stamina to properly
+    test it
+
+ poppler/PDFDoc.cc |   21 ++++++++++-----------
+ 1 file changed, 10 insertions(+), 11 deletions(-)
+
+commit 450934619a1c5b2a58f65649f567274af8d24ea7
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Sat May 28 12:37:08 2011 +0100
+
+    Parse that as unicode
+
+    Fixes KDE Bug #274055
+
+ qt4/src/poppler-page.cc |    4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 04dfb2c984b3c9949466e2b70e26b58029c5a7d3
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Sat May 7 12:55:34 2011 +0200
+
+    Make FileSpec a class and move EmbFile from Catalog to FileSpec
+
+    Qt and cpp frontends adapted by Pino Toscano
+
+ cpp/poppler-document.cpp              |    4 +-
+ cpp/poppler-embedded-file-private.h   |   10 +--
+ cpp/poppler-embedded-file.cpp         |   42 +++++++----
+ glib/poppler-annot.cc                 |    6 +-
+ glib/poppler-attachment.cc            |   33 ++++----
+ glib/poppler-document.cc              |    5 +-
+ glib/poppler-private.h                        |    3 +-
+ poppler/Catalog.cc                    |  118
+ ++---------------------------
+ poppler/Catalog.h                     |   55 +-------------
+ poppler/FileSpec.cc                   |  128
+ ++++++++++++++++++++++++++++++++
+ poppler/FileSpec.h                    |   51 ++++++++++++-
+ qt4/src/poppler-embeddedfile-private.h |    6 +-
+ qt4/src/poppler-embeddedfile.cc       |   34 +++++----
+ qt4/src/poppler-page.cc               |    5 +-
+ qt4/src/poppler-private.h             |    4 +-
+ qt4/tests/check_attachments.cpp       |   12 +--
+ 16 files changed, 284 insertions(+), 232 deletions(-)
+
+commit 74f9befddd4b5848c4af0c1b2848a1322f8cd0a2
+Author: Pino Toscano <pino@kde.org>
+Date:  Wed May 25 16:46:15 2011 +0200
+
+    [qt4] Page needs to be a friend of EmbeddedFile, too
+
+ qt4/src/poppler-qt4.h |    1 +
+ 1 file changed, 1 insertion(+)
+
+commit 74853614d617486b7b62e9c08be39a6e58bc7d9b
+Author: Pino Toscano <pino@kde.org>
+Date:  Wed May 25 16:40:49 2011 +0200
+
+    update copyrights
+
+ qt4/src/poppler-embeddedfile-private.h |    2 +-
+ qt4/src/poppler-embeddedfile.cc       |    2 +-
+ qt4/src/poppler-qt4.h                 |    2 +-
+ 3 files changed, 3 insertions(+), 3 deletions(-)
+
+commit e6b2dec502c02f9fbaed480f227cf7145249a98e
+Author: Pino Toscano <pino@kde.org>
+Date:  Wed May 25 16:39:09 2011 +0200
+
+    [qt4] one more usage of the new EmbeddedFile ctor
+
+    followup of a264e5385b2d0fee5126b3d0e57d42d34cafa45d
+
+ qt4/src/poppler-page.cc |    2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit a264e5385b2d0fee5126b3d0e57d42d34cafa45d
+Author: Pino Toscano <pino@kde.org>
+Date:  Wed May 25 16:12:02 2011 +0200
+
+    [qt4] create EmbeddedFile by EmbeddedFileData only
+
+    - create the private class and pass it to the EmbeddedFile ctor,
+    reducing the amount of poppler code API exposed to the outside
+    - turn the old private EmbeddedFile(EmbFile*) ctor in a death machine
+
+ qt4/src/poppler-embeddedfile-private.h |    3 +++
+ qt4/src/poppler-embeddedfile.cc       |   21 ++++++++++++++++++---
+ qt4/src/poppler-private.h             |    3 ++-
+ qt4/src/poppler-qt4.h                 |    2 ++
+ 4 files changed, 25 insertions(+), 4 deletions(-)
+
+commit 232bfa1c59013637fd7e858e22194becb636ad21
+Author: Pino Toscano <pino@kde.org>
+Date:  Wed May 25 15:55:48 2011 +0200
+
+    [Qt4] split EmbeddedFileData in an own file
+
+ qt4/src/poppler-embeddedfile-private.h |   37
+ ++++++++++++++++++++++++++++++++
+ qt4/src/poppler-embeddedfile.cc       |    7 +-----
+ 2 files changed, 38 insertions(+), 6 deletions(-)
+
+commit a7242b78b3c9a64cf38ac150e6a914d7abce3355
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Sat May 7 11:10:11 2011 +0100
+
+    Do not free a shallow copy of an object we'll free later
+
+    Make sure we have our own copy we can free
+    Fixes KDE BUG #268816
+    (cherry picked from commit dab9cdf795d6caead555326958e86e844ace067b)
+
+ poppler/Catalog.cc |  12 +++++-------
+ poppler/Catalog.h  |   2 +-
+ 2 files changed, 6 insertions(+), 8 deletions(-)
+
+commit 4db2452b3d345d9531987998e6b5532a59137e1d
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Fri May 6 14:57:51 2011 +0200
+
+    glib: Add poppler_document_get_n_attachments()
+
+ glib/poppler-document.cc           |   34
+ ++++++++++++++++++++++++----------
+ glib/poppler-document.h            |    1 +
+ glib/reference/poppler-sections.txt |   1 +
+ 3 files changed, 26 insertions(+), 10 deletions(-)
+
+commit 3e3284de3fe1916d7f8161ede7bf49c76d01f303
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Fri May 6 14:49:05 2011 +0200
+
+    glib: Update gtk-doc.make
+
+ gtk-doc.make |  151
+ +++++++++++++++++++++++++++++++++++++---------------------
+ 1 file changed, 98 insertions(+), 53 deletions(-)
+
+commit 9a77bd7706a08d9aeabe600e3500c14493ac8519
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Fri May 6 14:48:38 2011 +0200
+
+    glib-demo: Add missing permission flags to info demo
+
+ glib/demo/info.cc |   39 ++++++++++++++++++++++++++++++++++++---
+ 1 file changed, 36 insertions(+), 3 deletions(-)
+
+commit 091c155f8a7bc79da84cd21877be389de1f2b1a3
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Fri May 6 14:47:36 2011 +0200
+
+    glib: Add missing permissions flags to PopplerPermissions
+
+ glib/poppler-document.cc |    6 ++++++
+ glib/poppler-document.h  |   10 +++++++++-
+ 2 files changed, 15 insertions(+), 1 deletion(-)
+
+commit 632d6a40ce3a5d3d8e10bf7e93e8eb578beae907
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Tue May 3 21:54:59 2011 +0100
+
+    0.17.1
+
+ CMakeLists.txt      |   4 ++--
+ NEWS               |   12 ++++++++++++
+ configure.ac       |    2 +-
+ cpp/Doxyfile       |    2 +-
+ poppler/Makefile.am |   2 +-
+ qt4/src/Doxyfile    |   2 +-
+ 6 files changed, 18 insertions(+), 6 deletions(-)
+
+commit ecb136b9927a454df9360a307ccd741eaea3ca93
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Tue May 3 21:42:45 2011 +0100
+
+    remove unused vars
+
+ poppler/Annot.cc          |    9 ++-------
+ poppler/ArthurOutputDev.cc |  12 ++----------
+ 2 files changed, 4 insertions(+), 17 deletions(-)
+
+commit ad131763640b2e27dde75c42b514386284b6a60d
+Author: Pino Toscano <pino@kde.org>
+Date:  Wed Apr 27 22:36:13 2011 +0200
+
+    [qt4/tests] turn some assignments to bool into QVERIFY checks
+
+ qt4/tests/check_optcontent.cpp |    6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
+
+commit be08dd69d9dd4fcb22400f2f0aea331222e88e4a
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Wed Apr 27 20:45:36 2011 +0100
+
+    update copyright years
+    (cherry picked from commit 2fbd493197309de5700f71f09967c9d23add88d3)
+
+ poppler/Annot.cc   |   1 +
+ utils/pdftotext.cc |   1 +
+ 2 files changed, 2 insertions(+)
+
+commit 39bcce0c8ed378aafb1019ffd1ae40330f6bb63f
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Wed Apr 27 19:39:01 2011 +0100
+
+    Remove more variables that are set but then unused
+
+ poppler/SplashOutputDev.cc |  11 +------
+ utils/HtmlOutputDev.cc     |  75
+ +-------------------------------------------
+ 2 files changed, 2 insertions(+), 84 deletions(-)
+
+commit 6656cf657b62d626910a02dfae9b6a1eb77772dd
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Wed Apr 27 08:46:37 2011 +0100
+
+    Remove unused vars
+
+ poppler/TextOutputDev.cc |    6 +-----
+ 1 file changed, 1 insertion(+), 5 deletions(-)
+
+commit ce55510f4dd10dfec2fc5b1c211c4a546c6ebc98
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Wed Apr 27 08:42:34 2011 +0100
+
+    Remove unused vars
+
+ splash/Splash.cc            |    5 ++---
+ splash/SplashFTFontEngine.cc |    4 +---
+ splash/SplashXPath.cc       |    6 ++----
+ 3 files changed, 5 insertions(+), 10 deletions(-)
+
+commit 49d199fd1ea14383638739d95d019adb33b17768
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Wed Apr 27 08:38:17 2011 +0100
+
+    Fix page_transition::operator=
+
+ cpp/poppler-page-transition.cpp |    3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+commit 807c1df2bf79c7c6378390b41dc230d80533ae3f
+Author: Tom Gleason <tom@buildadam.com>
+Date:  Tue Apr 26 17:06:07 2011 +0100
+
+    bbox coordinates are relative to MediaBox size, not CropBox size
+
+ utils/pdftotext.cc |   2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 813f41367a681702ae7a155d5c2f3195124a9096
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Sun Apr 3 20:40:15 2011 +0200
+
+    forms: fix mem leak in case of error
+
+ poppler/Form.cc |    2 ++
+ 1 file changed, 2 insertions(+)
+
+commit 722baf8baf42e2c7a49e1560aae5235677d1ddee
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Sun Apr 3 20:17:57 2011 +0200
+
+    forms: check form field is actually terminal before creating the
+    widget
+
+ poppler/Form.cc |    4 ++++
+ 1 file changed, 4 insertions(+)
+
+commit 5f6f7fc569d1c891956a3c37b3e328504635ab33
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Sun Apr 3 15:06:45 2011 +0100
+
+    Properly initialize pageObjectNum to 0
+
+    Bug 35925
+
+ poppler/Hints.cc |    3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+commit d6786edc2549164214342a50782b72c2fd904b63
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Sun Apr 3 13:11:18 2011 +0200
+
+    forms: Remove unused parameter
+
+ poppler/Form.cc |    2 +-
+ poppler/Form.h  |    2 +-
+ 2 files changed, 2 insertions(+), 2 deletions(-)
+
+commit 62692ff381f3b7907b330bfc2019416ed058ea46
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Sun Apr 3 13:01:42 2011 +0200
+
+    forms: rework the way form fields tree is built
+
+    Now we build the tree as described by the doc, without ignoring
+    container fields and always creating a child widget for composed
+    (field
+    + annot) dictionaries. The way check and radio buttons are set
+    has been
+    reworked too, since now it's possible to have a set of buttons where
+    children are not widgets, but form fields with a child widget.
+
+ poppler/Annot.cc |    4 +-
+ poppler/Form.cc  |  237
+ +++++++++++++++++++++++++++++-------------------------
+ poppler/Form.h   |   17 ++--
+ 3 files changed, 137 insertions(+), 121 deletions(-)
+
+commit a6802301d9c3ab8bf68bd8821f562f8ecced8491
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Mon Mar 28 17:42:37 2011 +0200
+
+    forms: Add debug methods to print the forms tree
+
+ poppler/Form.cc |   78
+ +++++++++++++++++++++++++++++++++++++++++++++++++++++++
+ poppler/Form.h  |   25 ++++++++++++++++++
+ 2 files changed, 103 insertions(+)
+
+commit 46f87da04700cdd1afa634f9c554e376f6f6f752
+Author: José Aliste <jaliste@src.gnome.org>
+Date:  Thu Mar 31 08:09:41 2011 -0400
+
+    Fix a memleak in AnnotScreen::initialize
+
+ poppler/Annot.cc |    1 +
+ 1 file changed, 1 insertion(+)
+
+commit b64178eaa5dd01f914649d6faa870fa140ddaf9b
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Wed Mar 30 15:17:54 2011 +0200
+
+    glib: docs: Add PopplerActionJavascript to poppler-sections.txt
+
+ glib/reference/poppler-sections.txt |   1 +
+ 1 file changed, 1 insertion(+)
+
+commit 3d777181ddee8f7ab2cc9e4684879cb5b52b065c
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Wed Mar 30 15:16:04 2011 +0200
+
+    glib: Use Javascript instead of JavaScript for consistency
+
+ glib/poppler-action.h |    6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
+
+commit c4774fecfe3d523f32d5980f50e31daa798c9692
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Wed Mar 30 15:08:59 2011 +0200
+
+    glib-demo: show javascript actions in actions view
+
+ glib/demo/utils.c |   25 +++++++++++++++++++++++++
+ 1 file changed, 25 insertions(+)
+
+commit 68bbbe1a3f68d242b35027ae41f5751b02a2a700
+Author: José Aliste <jaliste@src.gnome.org>
+Date:  Tue Mar 29 04:56:37 2011 -0400
+
+    glib: add JavaScript actions
+
+ glib/poppler-action.cc |   24 ++++++++++++++++++++++++
+ glib/poppler-action.h |   14 +++++++++++++-
+ 2 files changed, 37 insertions(+), 1 deletion(-)
+
+commit 3dd934088a06f246718382601030c9b093d04160
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Wed Mar 30 00:03:58 2011 +0100
+
+    Need to create the globalParams
+
+ qt4/tests/check_optcontent.cpp |    5 +++++
+ 1 file changed, 5 insertions(+)
+
+commit ce0d4278a32b3ba19c2002ed0c481c58b1854d59
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Tue Mar 29 23:47:33 2011 +0100
+
+    Long gone
+
+ Makefile.am |   2 --
+ 1 file changed, 2 deletions(-)
+
+commit 12337026533aa59bb66022ce8a119f37aafd4fad
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Tue Mar 29 23:40:57 2011 +0100
+
+    increase sonames
+
+ CMakeLists.txt                |    2 +-
+ glib/CMakeLists.txt   |    2 +-
+ glib/Makefile.am      |    2 +-
+ poppler/Makefile.am   |    2 +-
+ qt4/src/CMakeLists.txt |    2 +-
+ qt4/src/Makefile.am   |    2 +-
+ 6 files changed, 6 insertions(+), 6 deletions(-)
+
+commit a6e613b01698c6b38deff5248fcf7c0b17d041c3
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Tue Mar 29 23:40:38 2011 +0100
+
+    more typos
+
+ NEWS |    6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
+
+commit e3ee037ede67212836be158b935deb7ea974b7f7
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Tue Mar 29 23:38:24 2011 +0100
+
+    typo
+
+ NEWS |    4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 8bcd94964f0af17a3f5b6edf71127df3daa00b1a
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Tue Mar 29 23:30:30 2011 +0100
+
+    typo
+
+ NEWS |    2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit a05b9dacbe5dbd4337fdbb3e7d7d364ad5fbaeab
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Tue Mar 29 23:28:49 2011 +0100
+
+    0.17.0 version number
+
+ CMakeLists.txt   |    2 +-
+ configure.ac    |    2 +-
+ cpp/Doxyfile    |    2 +-
+ qt4/src/Doxyfile |    2 +-
+ 4 files changed, 4 insertions(+), 4 deletions(-)
+
+commit 4637b737b4735c70017b46a3ed6c0ee069c02c9b
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Tue Mar 29 23:28:41 2011 +0100
+
+    0.17.0 news
+
+ NEWS |  108
+ ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+ 1 file changed, 108 insertions(+)
+
+commit a55cc5d9c67ede1d96f6e5a58179ddd9f563c53f
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Tue Mar 29 22:51:40 2011 +0100
+
+    Update years
+
+ poppler/Catalog.cc |   2 +-
+ poppler/Catalog.h  |   2 +-
+ 2 files changed, 2 insertions(+), 2 deletions(-)
+
+commit d96efb6c1af621be78e998ba1a228022c3c076fc
+Author: Pino Toscano <pino@kde.org>
+Date:  Tue Mar 29 11:13:03 2011 +0200
+
+    fix comment
+
+ poppler/ViewerPreferences.h |   2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 74ec81d66d4d5bc45cccc4aa8794df1c517f2d74
+Author: Pino Toscano <pino@kde.org>
+Date:  Tue Mar 29 11:07:36 2011 +0200
+
+    viewer preferences: read PrintScaling and Duplex
+
+ poppler/ViewerPreferences.cc |   24 ++++++++++++++++++++++++
+ poppler/ViewerPreferences.h  |   14 ++++++++++++++
+ 2 files changed, 38 insertions(+)
+
+commit b41bcd484dd7a93a339270926c57caa524059d8f
+Author: Pino Toscano <pino@kde.org>
+Date:  Tue Mar 29 10:58:46 2011 +0200
+
+    free the viewerPreferences Object
+
+ poppler/Catalog.cc |   1 +
+ 1 file changed, 1 insertion(+)
+
+commit 1dd88d0b6b7cbfda76e81902a351c89457a061a8
+Author: Pino Toscano <pino@kde.org>
+Date:  Tue Mar 29 09:58:10 2011 +0200
+
+    read the ViewerPreferences dict once, and construct ViewerPreferences
+    on demand
+
+    this way it is possible to know whether the ViewerPreferences
+    dictionary is present in the Catalog
+
+ poppler/Catalog.cc |  24 +++++++++---------------
+ poppler/Catalog.h  |   3 ++-
+ 2 files changed, 11 insertions(+), 16 deletions(-)
+
+commit f10b0b8c88a7df83ada09f32b6cb6fd930fcb748
+Author: Pino Toscano <pino@kde.org>
+Date:  Tue Mar 29 09:57:46 2011 +0200
+
+    assume the prefDict is not null
+
+ poppler/ViewerPreferences.cc |    4 ----
+ 1 file changed, 4 deletions(-)
+
+commit d4a5ea45057cad531a8979cf9861ac05cdd56613
+Author: Pino Toscano <pino@kde.org>
+Date:  Tue Mar 29 09:54:22 2011 +0200
+
+    fix variable name for DisplayDocTitle
+
+ poppler/ViewerPreferences.cc |    2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit cf84a05ae524aa9b266463cc23cccc3860ff1ba3
+Author: Pino Toscano <pino@kde.org>
+Date:  Mon Mar 28 23:18:02 2011 +0200
+
+    viewer preferences: read NonFullScreenPageMode and Direction
+
+ poppler/ViewerPreferences.cc |   26 ++++++++++++++++++++++++++
+ poppler/ViewerPreferences.h  |   15 +++++++++++++++
+ 2 files changed, 41 insertions(+)
+
+commit 460253a6705a227ff7c36e9c31cceb93cce4d78b
+Author: Pino Toscano <pino@kde.org>
+Date:  Mon Mar 28 22:37:54 2011 +0200
+
+    read some boolean viewer preferences
+
+    - HideToolbar
+    - HideMenubar
+    - HideWindowUI
+    - FitWindow
+    - CenterWindow
+    - DisplayDocTitle
+
+ poppler/ViewerPreferences.cc |   41
+ +++++++++++++++++++++++++++++++++++++++++
+ poppler/ViewerPreferences.h  |   13 +++++++++++++
+ 2 files changed, 54 insertions(+)
+
+commit 9fa9ac3546674120532bb512b82af6471cbebf01
+Author: Pino Toscano <pino@kde.org>
+Date:  Mon Mar 28 19:58:16 2011 +0200
+
+    add skeleton for ViewerPreferences
+
+    a small class for handling the ViewerPreferences dictionary of
+    a Catalog,
+    created on demand and in any occasion (so defaults are in one
+    place only)
+
+ CMakeLists.txt                      |    2 ++
+ poppler/Catalog.cc          |   23 +++++++++++++++++++++++
+ poppler/Catalog.h           |    4 ++++
+ poppler/Makefile.am         |    2 ++
+ poppler/ViewerPreferences.cc |   30 ++++++++++++++++++++++++++++++
+ poppler/ViewerPreferences.h  |   34 ++++++++++++++++++++++++++++++++++
+ 6 files changed, 95 insertions(+)
+
+commit c6081f0bf00d7dcdfa1d09e91e4c9a1fe5a54ad6
+Author: Pino Toscano <pino@kde.org>
+Date:  Mon Mar 28 19:55:00 2011 +0200
+
+    delete the temporary buffers created by pdfDocEncodingToUTF16()
+
+ poppler/Form.cc |    2 ++
+ 1 file changed, 2 insertions(+)
+
+commit d94d5056d5570e2f5cb578736eba12317ea63fa4
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Mon Mar 28 18:20:31 2011 +0200
+
+    glib-demo: show the activation action of form fields if there's one
+
+ glib/demo/forms.c |   21 ++++++++++++++++-----
+ 1 file changed, 16 insertions(+), 5 deletions(-)
+
+commit ba0f36b76d0c2fd4ef39f3013fc125a53747c03f
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Mon Mar 28 18:17:52 2011 +0200
+
+    glib: Add poppler_form_field_get_action()
+
+    Fixes bug #33174.
+
+ glib/poppler-form-field.cc         |   34
+ ++++++++++++++++++++++++++++++++++
+ glib/poppler-form-field.h          |    1 +
+ glib/poppler-private.h                     |    1 +
+ glib/reference/poppler-sections.txt |   1 +
+ 4 files changed, 37 insertions(+)
+
+commit ae5b9cf884ce38dde409c3e5b0f6c46f7d6327d2
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Mon Mar 28 17:43:53 2011 +0200
+
+    Revert "Patch for embedding videos in to the pdf"
+
+    This reverts commit 66575c990f379871e4b796befc899de178332670.
+
+    It introduces new API to glib frontend that is wrong and will be
+    changed soon.
+
+ glib/poppler-annot.cc |   33 -----
+ glib/poppler-annot.h  |    5 -
+ poppler/Annot.cc      |  377
+ -------------------------------------------------
+ poppler/Annot.h       |    2 -
+ 4 files changed, 417 deletions(-)
+
+commit b7edd4c93539585652961ecf2db9c4462415c8bc
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Sun Mar 27 12:31:19 2011 +0200
+
+    annot: Always create appearance streams when NeedAppearances is true
+
+    Fixes regression in document example_054.pdf
+
+ poppler/Annot.cc |    6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
+
+commit e9350899e77c28452c48b56349ad7758b3fd47ba
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Thu Mar 24 20:09:18 2011 +0000
+
+    Introduce splash-friendly getRGBLine functions
+
+    So it does not need to pack and unpack the color again and again
+
+ poppler/GfxState.cc       |  248
+ +++++++++++++++++++++++++++++++++++++++++---
+ poppler/GfxState.h        |   22 +++-
+ poppler/SplashOutputDev.cc |  43 ++------
+ 3 files changed, 265 insertions(+), 48 deletions(-)
+
+commit 7b08795a9541e9fa01836b4c7fd63f6fe295ad80
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Thu Mar 24 12:16:07 2011 +0100
+
+    glib: Add g_return macros to make sure index is correct in form
+    field choice methods
+
+ glib/poppler-form-field.cc |   4 ++++
+ 1 file changed, 4 insertions(+)
+
+commit f1102fccd2899bc7f97414b1e2a295c59f03da22
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Thu Mar 24 12:15:30 2011 +0100
+
+    glib-demo: Fix a crash when a choice form field has no items selected
+
+ glib/demo/forms.c |   4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit b3971ee6bca6b14b75f046c831a31ac1e5e3241e
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Tue Mar 22 22:08:27 2011 +0000
+
+    kill this TODO, n is too small
+
+ poppler/SplashOutputDev.cc |   6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
+
+commit 1064d75817401fe24f728c189b450e9e906beb56
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Tue Mar 22 20:43:05 2011 +0000
+
+    kill unmaintained abiword backend
+
+ CMakeLists.txt                 |   16 -
+ configure.ac           |   16 -
+ poppler/ABWOutputDev.cc | 1179
+ -----------------------------------------------
+ poppler/ABWOutputDev.h  |  141 ------
+ poppler/Makefile.am    |   17 -
+ utils/CMakeLists.txt   |   10 -
+ utils/Makefile.am      |   18 +-
+ utils/pdftoabw.cc      |  201 --------
+ 8 files changed, 2 insertions(+), 1596 deletions(-)
+
+commit abf167af8b15e5f3b510275ce619e6fdb42edd40
+Author: Thomas Freitag <Thomas.Freitag@alfa.de>
+Date:  Mon Mar 21 21:34:46 2011 +0000
+
+    Implement tiling/patterns in SplashOutputDev
+
+    Fixes bug 13518
+
+ poppler/CairoOutputDev.cc   |   5 +-
+ poppler/CairoOutputDev.h    |  10 +-
+ poppler/Gfx.cc                     |    6 +-
+ poppler/OutputDev.h        |    6 +-
+ poppler/PSOutputDev.cc      |   8 +-
+ poppler/PSOutputDev.h      |    6 +-
+ poppler/PreScanOutputDev.cc |  22 +++-
+ poppler/PreScanOutputDev.h  |  16 ++-
+ poppler/SplashOutputDev.cc  | 265
+ +++++++++++++++++++++++++++++++++++++++++++
+ poppler/SplashOutputDev.h   |  12 ++
+ 10 files changed, 334 insertions(+), 22 deletions(-)
+
+commit 66575c990f379871e4b796befc899de178332670
+Author: Srinivas Adicherla <srinivas.adicherla@gmail.com>
+Date:  Thu Mar 17 20:14:05 2011 +0000
+
+    Patch for embedding videos in to the pdf
+
+ glib/poppler-annot.cc |   33 +++++
+ glib/poppler-annot.h  |    5 +
+ poppler/Annot.cc      |  377
+ +++++++++++++++++++++++++++++++++++++++++++++++++
+ poppler/Annot.h       |    2 +
+ 4 files changed, 417 insertions(+)
+
+commit ec1917968d2f1c7a00772a0829b3fcc6957d8f3c
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Mon Mar 14 00:13:26 2011 +0000
+
+    Only build gtk-test if we have to build gtk-test
+
+ test/Makefile.am |    6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
+
+commit 1acbb01e72a22f70f00dc058ff206e3bc05bc0ab
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Sun Mar 13 14:49:48 2011 +0000
+
+    (C) years
+
+ poppler/CachedFile.cc    |    2 +-
+ poppler/CurlCachedFile.cc |   2 +-
+ 2 files changed, 2 insertions(+), 2 deletions(-)
+
+commit bc8aeb269aa92406081f749064ceff75bb3145e7
+Author: Hib Eris <hib@hiberis.nl>
+Date:  Sat Mar 12 23:17:59 2011 +0100
+
+    Check response code of libcurl call
+
+ poppler/CachedFile.cc    |    8 +++++++-
+ poppler/CurlCachedFile.cc |   12 +++++++++---
+ 2 files changed, 16 insertions(+), 4 deletions(-)
+
+commit 0268cedee5b460835a4747d0ea41bbe12269310d
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Sat Mar 12 15:24:30 2011 +0100
+
+    cairo: Fix typo
+
+ poppler/CairoFontEngine.cc |   2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 5aa369e68e5c9f14efc888c7b26da06aa8bd2a78
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Sat Mar 12 13:47:34 2011 +0000
+
+    Remove unused variable
+
+ poppler/CurlCachedFile.cc |   2 --
+ 1 file changed, 2 deletions(-)
+
+commit c0dffbe28f91b30b36310ab0b9a9b948610550ae
+Author: Pino Toscano <pino@kde.org>
+Date:  Sat Mar 12 12:15:58 2011 +0100
+
+    update copyright years
+
+ cpp/poppler-document-private.h |    2 +-
+ cpp/poppler-document.cpp      |    2 +-
+ 2 files changed, 2 insertions(+), 2 deletions(-)
+
+commit b8fab173ffdd1e62a34b530228d08bc5ec6725ac
+Author: Pino Toscano <pino@kde.org>
+Date:  Sat Mar 12 12:13:05 2011 +0100
+
+    [cpp] init the globalParams early in the document loading
+
+    introduce a small RAII class to init/deinit the globalParams, and
+    make document_private inherit from it
+
+ cpp/poppler-document-private.h |   17 ++++++++-----
+ cpp/poppler-document.cpp      |   52
+ +++++++++++++++++++++-------------------
+ 2 files changed, 39 insertions(+), 30 deletions(-)
+
+commit a97a54cb22def2a9fc381fb81842dad9e5c3931f
+Author: Pino Toscano <pino@kde.org>
+Date:  Sat Mar 12 12:12:11 2011 +0100
+
+    forms: delete tmp_str after being converted to GooString
+
+ poppler/Form.cc |    1 +
+ 1 file changed, 1 insertion(+)
+
+commit 9671fe07f8c9ade956742cb141b99518c3b12bad
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Fri Mar 11 00:05:52 2011 +0000
+
+    getForm can return NULL, do not crash if that happens
+
+ poppler/Annot.cc |   10 ++++++----
+ 1 file changed, 6 insertions(+), 4 deletions(-)
+
+commit bd32672899f5ca4509ec9311de8092d14bec8ab1
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Thu Mar 10 23:33:15 2011 +0000
+
+    update copyright years
+
+ poppler/Catalog.cc     |    2 +-
+ qt4/src/poppler-form.cc |    1 +
+ 2 files changed, 2 insertions(+), 1 deletion(-)
+
+commit 841f3bbca37015ec2c58d7b85a73cef5681294f8
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Thu Mar 10 23:30:51 2011 +0000
+
+    Do not infinite loop
+
+ poppler/Form.cc |    4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit f2fcafdc2b982d9bbed3c01bc7d45c8bd0603f19
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Thu Mar 10 23:27:41 2011 +0000
+
+    Create the globalParams before the pdfdoc
+
+ qt4/src/poppler-private.cc |   5 +----
+ qt4/src/poppler-private.h  |  12 ++++++++----
+ 2 files changed, 9 insertions(+), 8 deletions(-)
+
+commit f956b03604b195623ab034a06942a39547adf905
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Thu Mar 10 00:01:18 2011 +0000
+
+    compile
+
+ qt4/src/poppler-form.cc |    4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit f0ec3bedc5490aa35e54563019fcf2c3f8b7647d
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Wed Mar 9 20:54:15 2011 +0100
+
+    forms: Remove unused method FormWidget::updateField()
+
+ poppler/Form.cc |   22 ----------------------
+ poppler/Form.h  |    2 --
+ 2 files changed, 24 deletions(-)
+
+commit 93c25e100ae2564b9a866b95bed16d2fac619bd7
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Wed Mar 9 20:49:32 2011 +0100
+
+    forms: Rename FormField::createActivationAction() to
+    FormField::getActivationAction()
+
+    And use the existing action from the AnnotWidget instead of creating a
+    new one.
+
+ poppler/Form.cc        |   11 ++---------
+ poppler/Form.h                 |    2 +-
+ qt4/src/poppler-form.cc |    3 +--
+ 3 files changed, 4 insertions(+), 12 deletions(-)
+
+commit 59fb0489bfabfd8acccafdcd0361ce005664962a
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Wed Mar 9 20:19:24 2011 +0100
+
+    annots: Check whether we need to create an appearance stream in
+    AnnotWidget::draw()
+
+    And never modify the AP entry since it breaks check and radio buttons
+    that doesn't have an appearance for the Off state.
+
+ poppler/Annot.cc |   79
+ +++++++++---------------------------------------------
+ poppler/Annot.h  |    1 -
+ 2 files changed, 13 insertions(+), 67 deletions(-)
+
+commit f3b00ef51ceef6d9b7a1aa7e0f19249abf8ca6f3
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Wed Mar 9 18:19:12 2011 +0100
+
+    annots: Add Annot::setAppearanceState() and use it from FormWidget
+
+    This method not only updates the current appearance state, but
+    also the
+    appearance stream corresponding to the new state.
+
+ poppler/Annot.cc |   43 ++++++++++++++++++++++++++++++++++++-------
+ poppler/Annot.h  |    2 ++
+ poppler/Form.cc  |    7 +++----
+ 3 files changed, 41 insertions(+), 11 deletions(-)
+
+commit d59561212253302d4dcb23392bb8306b8e5c68d1
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Wed Mar 9 17:35:28 2011 +0100
+
+    forms: Make FormWidget use a real widget annotation instead of
+    duplicating code
+
+    When creating annotations, if it's a widget annotation, look first
+    whether it has already been created by a FormWidget and reuse
+    it instead
+    of duplicating it.
+
+ poppler/Annot.cc   |  42 +++++++++++++--------
+ poppler/Annot.h    |   2 +-
+ poppler/Catalog.cc |   2 +-
+ poppler/Form.cc    |  107
+ ++++++++++++++++++++++++----------------------------
+ poppler/Form.h     |  23 ++++++-----
+ 5 files changed, 89 insertions(+), 87 deletions(-)
+
+commit 2dd7e1ba09d4501adf9d10ab4cb8ee003cace74a
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Wed Mar 9 10:25:00 2011 +0100
+
+    forms: Move modified flag from FormWidget to FormField
+
+ poppler/Form.cc |   16 ++++++++--------
+ poppler/Form.h  |    6 ++++--
+ 2 files changed, 12 insertions(+), 10 deletions(-)
+
+commit b04f03be7e43e309af5f164ef71788e7b8915841
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Wed Mar 9 10:17:57 2011 +0100
+
+    forms: Move field names handling from FormWidget to FormField
+
+ poppler/Form.cc |  149
+ ++++++++++++++++++++++++++++++-------------------------
+ poppler/Form.h  |   20 +++++---
+ 2 files changed, 95 insertions(+), 74 deletions(-)
+
+commit abe1e0d5a37bcdb4376901306d3adccfb33ff3b4
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Tue Mar 8 21:39:00 2011 +0100
+
+    annots: Make sure no border is drawn for invalid border arrays
+
+    Fixes regression on ClassSchedule_2091_ENGL.pdf
+
+ poppler/Annot.cc |    8 ++++++--
+ poppler/Annot.h  |    2 +-
+ 2 files changed, 7 insertions(+), 3 deletions(-)
+
+commit 14d145371e86ccb92f09b1ca750ced52171b2885
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Tue Mar 8 20:14:57 2011 +0100
+
+    forms: Remove loadDefaults method
+
+    Moving the code to initialize form field stuff to form field
+    constructors and widget stuff to form widget constructors. Clean up an
+    simplify the code.
+
+ poppler/Form.cc |  227
+ +++++++++++++++++++++----------------------------------
+ poppler/Form.h  |   21 ++---
+ 2 files changed, 91 insertions(+), 157 deletions(-)
+
+commit 0585d7820455c93fe5b732b7a9a20d423df47075
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Tue Mar 8 15:36:45 2011 +0100
+
+    forms: Handle field values (V entry) by field objects
+
+    Rather than AnnotWidget or FormWidget, and use the form field object
+    from AnnotWidget to get the values.
+
+ poppler/Annot.cc |   52 ++++---
+ poppler/Form.cc  |  400
+ ++++++++++++++++++++++++++----------------------------
+ poppler/Form.h   |   21 +--
+ 3 files changed, 230 insertions(+), 243 deletions(-)
+
+commit dc100eb9080fb58164fc94c86bfb1728cecd21c3
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Mon Mar 7 20:14:27 2011 +0100
+
+    annots: Use the field object to get MaxLen instead of parsing the
+    field dict
+
+ poppler/Annot.cc |   10 ++++------
+ 1 file changed, 4 insertions(+), 6 deletions(-)
+
+commit 7149634f184dc3f07f2a70c296aac207ef24952c
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Mon Mar 7 19:55:45 2011 +0100
+
+    forms: Parse the default resources dictionary in Form
+
+    And use it in AnnotWidget instead of parsing the dictionary again.
+
+ poppler/Annot.cc |   65
+ +++++++++++++++++++++---------------------------------
+ poppler/Annot.h  |   12 +++++-----
+ poppler/Form.cc  |   16 ++++++++++++++
+ poppler/Form.h   |    5 +++++
+ 4 files changed, 52 insertions(+), 46 deletions(-)
+
+commit 2e73f17975811177c0b3c16b8bd97c7eb912bc44
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Mon Mar 7 18:41:48 2011 +0100
+
+    forms: Parse field variable text entries (DA, Q) in FormField()
+
+    And use them from AnnotWidget instead of parsing the field dictionary
+    again.
+
+ poppler/Annot.cc |   28 +++++-----------------------
+ poppler/Form.cc  |   17 +++++++++++++++++
+ poppler/Form.h   |    9 +++++++++
+ 3 files changed, 31 insertions(+), 23 deletions(-)
+
+commit 8677a34911563a712b2dcf0b6e411cee0bad9c44
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Mon Mar 7 18:24:07 2011 +0100
+
+    forms: Parse default variable text entries (DA, Q) on Form
+    construction
+
+    And use them from AnnotWidget instead of parsing the acroForm
+    dictionary
+    again.
+
+ poppler/Annot.cc |   99
+ ++++++++++++++++++++++++++----------------------------
+ poppler/Form.cc  |   11 ++++++
+ poppler/Form.h   |   12 +++++++
+ 3 files changed, 70 insertions(+), 52 deletions(-)
+
+commit 41420bfd88685d9b1ac44dc7444ea3abee92097c
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Mon Mar 7 09:18:25 2011 +0100
+
+    annots: Only parse the dash array for dashed borders
+
+ poppler/Annot.cc |   16 +++++++++-------
+ 1 file changed, 9 insertions(+), 7 deletions(-)
+
+commit c198a3f83d8508ddaf84564871d9202ffba8096c
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Sun Mar 6 17:52:01 2011 +0100
+
+    annots: Use the field object to get the top index of a form field
+    choice
+
+    Instead of parsing the field dictionary again.
+
+ poppler/Annot.cc |   14 ++------------
+ poppler/Annot.h  |    1 -
+ 2 files changed, 2 insertions(+), 13 deletions(-)
+
+commit 5cf803ec181dbf1112f67b4f4a9c77b88d102e3b
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Sun Mar 6 17:47:18 2011 +0100
+
+    forms: Add FormFieldChoice::getTopIndex()
+
+ poppler/Form.cc |    5 +++++
+ poppler/Form.h  |    5 ++++-
+ 2 files changed, 9 insertions(+), 1 deletion(-)
+
+commit 1248f59e2045749ece1f5a5e579b866b8330a752
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Sun Mar 6 17:41:33 2011 +0100
+
+    annots: Draw widget background using the existing appearance
+    characteristics
+
+    Instead of parsing the appearance characteristics dictionary again
+
+ poppler/Annot.cc |   23 +++++++----------------
+ 1 file changed, 7 insertions(+), 16 deletions(-)
+
+commit dc249ad4529997001ae1f96dcfd7351766ca8e8d
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Sun Mar 6 17:34:33 2011 +0100
+
+    annots: Factor out generateFieldAppearance()
+
+    Adding methods to render every form field type and using the field
+    object when possible instead of parsing the field dictionary again.
+
+ poppler/Annot.cc |  312
+ +++++++++++++++++++++++-------------------------------
+ poppler/Annot.h  |    8 +-
+ 2 files changed, 138 insertions(+), 182 deletions(-)
+
+commit f98b3540db731026e0febf1f010548f0f0ef9142
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Sun Mar 6 15:57:22 2011 +0100
+
+    annots: Move code to draw the border of an AnnotWidget to a new method
+
+    And use the field object instead of parsing the field dictionary
+    again.
+
+ poppler/Annot.cc |  242
+ +++++++++++++++++++++++++++---------------------------
+ poppler/Annot.h  |    3 +
+ 2 files changed, 124 insertions(+), 121 deletions(-)
+
+commit 9854f3173f994bbe3f57d33bd1d0e045833859c2
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Sun Mar 6 15:56:06 2011 +0100
+
+    annots: Add AnnotColor::adjustColor() to be able to adjust an
+    existing AnnotColor
+
+ poppler/Annot.cc |    7 +++++++
+ poppler/Annot.h  |    2 ++
+ 2 files changed, 9 insertions(+)
+
+commit 2bf82f27bd9c8f97e5484ea97be661f65221163d
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Sat Mar 5 15:30:01 2011 +0100
+
+    annots: Remove unused class AnnotBorderStyle
+
+ poppler/Annot.cc |   22 ----------------------
+ poppler/Annot.h  |   36 ------------------------------------
+ 2 files changed, 58 deletions(-)
+
+commit 128dcaf282f418d8c45cea4df6ad4d3167b3e39c
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Sat Mar 5 13:12:49 2011 +0100
+
+    annots: Add AnnotBorder::parseDashArray() to parse dash arrays
+
+    The code was duplicated in AnnotBorderArray and AnnotBorderBS
+
+ poppler/Annot.cc |   91
+ +++++++++++++++++++-----------------------------------
+ poppler/Annot.h  |    4 ++-
+ 2 files changed, 34 insertions(+), 61 deletions(-)
+
+commit ec2643d311e0ce55f0ff5309c0c420140d053a50
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Tue Mar 1 19:50:55 2011 +0000
+
+    fix copyright years
+
+ poppler/Annot.cc                        |    2 +-
+ poppler/Annot.h                         |    2 +-
+ poppler/ArthurOutputDev.cc              |    2 +-
+ poppler/ArthurOutputDev.h               |    2 +-
+ poppler/FontInfo.cc                     |    1 +
+ poppler/Form.cc                         |    4 ++--
+ poppler/Form.h                                  |    3 ++-
+ poppler/GlobalParams.cc                 |    1 +
+ poppler/GlobalParams.h                          |    1 +
+ poppler/Link.cc                         |    2 +-
+ poppler/Link.h                                  |    2 +-
+ poppler/OutputDev.h                     |    2 +-
+ poppler/PDFDoc.cc                       |    2 +-
+ poppler/Page.cc                         |    2 +-
+ poppler/Page.h                                  |    2 +-
+ poppler/TextOutputDev.cc                |    2 +-
+ poppler/TextOutputDev.h                 |    2 +-
+ qt4/src/poppler-form.cc                 |    2 +-
+ qt4/src/poppler-link-extractor-private.h |    2 +-
+ qt4/src/poppler-link-extractor.cc       |    2 +-
+ qt4/src/poppler-page.cc                 |    2 +-
+ qt4/src/poppler-private.h               |    2 +-
+ utils/HtmlOutputDev.cc                          |    2 +-
+ utils/HtmlOutputDev.h                   |    4 ++--
+ 24 files changed, 27 insertions(+), 23 deletions(-)
+
+commit 900974ebfbe6ab7ae21ed151ff79f9578d2bdae2
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Tue Mar 1 19:42:22 2011 +0000
+
+    Fix years
+
+ poppler/poppler-config.h.cmake |    2 +-
+ poppler/poppler-config.h.in   |    2 +-
+ 2 files changed, 2 insertions(+), 2 deletions(-)
+
+commit c804db4d8261274b013f8c340abfc921c77bb3cf
+Author: Pino Toscano <pino@kde.org>
+Date:  Tue Mar 1 19:22:31 2011 +0100
+
+    move the fontconfig.h inclusion from GlobalParams.h to GlobalParams.cc
+
+    this avoids a dependency on the fontconfig headers to the users of
+    the core
+
+ poppler/GlobalParams.cc |    4 ++++
+ poppler/GlobalParams.h  |    3 ---
+ 2 files changed, 4 insertions(+), 3 deletions(-)
+
+commit 2d77c7f9c41f1121354413bcdc3beded35a247f9
+Author: Pino Toscano <pino@kde.org>
+Date:  Tue Mar 1 16:51:04 2011 +0100
+
+    create the GooString on stack, not in heap
+
+ poppler/Annot.cc |    5 ++---
+ poppler/Form.cc  |    5 ++---
+ 2 files changed, 4 insertions(+), 6 deletions(-)
+
+commit 5dc2ef0e27ac48c81739cdfe8e8070ebbc410c87
+Author: Pino Toscano <pino@kde.org>
+Date:  Tue Mar 1 16:39:36 2011 +0100
+
+    annots: avoid temporary GooString's just for comparisons, just
+    use strcmp
+
+    other than reducing few GooString allocations, strcmp should be much
+    faster than GooString::cmp
+
+ poppler/Annot.cc |  128
+ ++++++++++++++++++++++++------------------------------
+ 1 file changed, 56 insertions(+), 72 deletions(-)
+
+commit 535e48ab764ee4e377451ddd032044b51b842c4a
+Author: Pino Toscano <pino@kde.org>
+Date:  Tue Mar 1 16:07:34 2011 +0100
+
+    [qt4] ignore "Widget" annotations
+
+    they usually are forms or something else we do not support, so do
+    not complain about them for now
+
+ qt4/src/poppler-page.cc |    4 +++-
+ 1 file changed, 3 insertions(+), 1 deletion(-)
+
+commit f0e5c36e7f1c5d0f0f51e3a6a6acd6c423f86df7
+Author: Pino Toscano <pino@kde.org>
+Date:  Tue Mar 1 16:02:54 2011 +0100
+
+    annots: avoid a temporary GooString just for comparisons, just
+    use strcmp
+
+    other than reducing few GooString allocations, strcmp should be much
+    faster than GooString::cmp
+
+ poppler/Annot.cc |   54
+ ++++++++++++++++++++++++++----------------------------
+ 1 file changed, 26 insertions(+), 28 deletions(-)
+
+commit 58a3b83a8fbd8b13eb98c4f677f4ed19b6ae44cd
+Author: Pino Toscano <pino@kde.org>
+Date:  Tue Mar 1 15:35:45 2011 +0100
+
+    fix appendAnnot() invocation on annotations reading
+
+    1) check that the annot is actually a non-NULL pointer (otherwise
+    doing anything else is pointless)
+    2) call appendAnnot() only if the annotation isOk() (that will
+    increase the annot refcount), but always decrement the refcount
+    (so valid annotation will have it at 1, while invalid will be deleted)
+
+ poppler/Annot.cc |    8 ++++++--
+ 1 file changed, 6 insertions(+), 2 deletions(-)
+
+commit 664865a2ddca9c20ac36a41aef52ebf12eab838d
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Tue Mar 1 10:56:40 2011 +0100
+
+    Merge Link and AnnotLink code
+
+    Annotations now belong to the Page and are created only once on
+    demand.
+    Annots are now ref counted and Links is a list of AnnotLink objects,
+    Link object has been removed. The AnnotLink API is mostly the
+    same than
+    Link and frontends APIs are not affected.
+    Qt4 changes made by Pino Toscano.
+
+ glib/poppler-document.cc                |    2 +-
+ glib/poppler-page.cc                    |   29 ++++---
+ glib/poppler-private.h                          |    1 -
+ poppler/Annot.cc                        |   79 ++++++++++++-------
+ poppler/Annot.h                         |   24 ++++--
+ poppler/ArthurOutputDev.cc              |    4 -
+ poppler/ArthurOutputDev.h               |    3 -
+ poppler/CairoOutputDev.cc               |    3 -
+ poppler/CairoOutputDev.h                |    6 --
+ poppler/FontInfo.cc                     |    4 +-
+ poppler/Form.cc                         |   36 ++++-----
+ poppler/Form.h                                  |    5 +-
+ poppler/Link.cc                         |  124
+ +++++-------------------------
+ poppler/Link.h                                  |   43 ++---------
+ poppler/OutputDev.h                     |    4 +-
+ poppler/PDFDoc.cc                       |    4 +-
+ poppler/Page.cc                         |   63 +++++++--------
+ poppler/Page.h                                  |   11 +--
+ poppler/TextOutputDev.cc                |    9 ++-
+ poppler/TextOutputDev.h                 |   10 +--
+ qt4/src/poppler-link-extractor-private.h |    2 +-
+ qt4/src/poppler-link-extractor.cc       |    3 +-
+ qt4/src/poppler-page.cc                 |   12 ++-
+ utils/HtmlOutputDev.cc                          |    7 +-
+ utils/HtmlOutputDev.h                   |    4 +-
+ 25 files changed, 188 insertions(+), 304 deletions(-)
+
+commit 1f6573e949aaba0eb0a4c2f9cd73d7ad45ba67be
+Author: Pino Toscano <pino@kde.org>
+Date:  Sun Feb 27 21:53:32 2011 +0100
+
+    small fixes to the pdftohtml manpage
+
+    - capitalize HTML, PDF, XML, PNG
+    - dont -> do not
+    - fix UTF-8 character
+    - fix hypens used as minus
+
+ utils/pdftohtml.1 |   18 +++++++++---------
+ 1 file changed, 9 insertions(+), 9 deletions(-)
+
+commit e927384897595f1bda5f7e41b552602f9cc8ed95
+Author: Pino Toscano <pino@kde.org>
+Date:  Sun Feb 27 16:39:59 2011 +0100
+
+    [qt4] fix caption of push button fields
+
+    instead of asking the 'onStr' of the underlying form widget,
+    take (if available) the 'MK' entry, i.e. the appearance
+    characteristics dictionary,
+    and use the normal caption of that
+
+ qt4/src/poppler-form.cc |   25 +++++++++++++++++++++++--
+ 1 file changed, 23 insertions(+), 2 deletions(-)
+
+commit 5b24ee2c934feea1b7d46c8ec423d1c547258be2
+Author: Pino Toscano <pino@kde.org>
+Date:  Sun Feb 27 16:24:22 2011 +0100
+
+    annots: 'CA', 'RC' and 'AC' are strings, not names
+
+ poppler/Annot.cc |   12 ++++++------
+ 1 file changed, 6 insertions(+), 6 deletions(-)
+
+commit e64f6cb23e9a564b3f80daea9abcfe8bb29189eb
+Author: Pino Toscano <pino@kde.org>
+Date:  Sun Feb 27 15:22:32 2011 +0100
+
+    make getOnStr() return the GooString* instead of its char*
+
+    ... and modify its use accordingly
+    this way it is easier to check for a numm onStr, without the risk
+    of dereferencing a NULL pointer
+
+ poppler/Form.cc        |    6 +++---
+ poppler/Form.h                 |    2 +-
+ qt4/src/poppler-form.cc |    7 ++-----
+ 3 files changed, 6 insertions(+), 9 deletions(-)
+
+commit f9c978fc2ab8a1f901f2136ae95deb9d41076155
+Author: Pino Toscano <pino@kde.org>
+Date:  Sun Feb 27 14:39:52 2011 +0100
+
+    [qt4] directly use the dict
+
+ qt4/src/poppler-form.cc |    6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
+
+commit 071966e48577c515b17a424baeae85ae4fc80a20
+Author: Pino Toscano <pino@kde.org>
+Date:  Sun Feb 27 14:21:11 2011 +0100
+
+    [qt4] move textAlignment() as a private function
+
+ qt4/src/poppler-form.cc   |   33 +++++++++++++++++++++++++++++++--
+ qt4/src/poppler-private.h |   25 -------------------------
+ 2 files changed, 31 insertions(+), 27 deletions(-)
+
+commit adc236771f11eeb4197064747836e8ed3fbfeba9
+Author: Pino Toscano <pino@kde.org>
+Date:  Sun Feb 27 14:13:50 2011 +0100
+
+    [qt4] use FormWidget::getAlternateUiName()
+
+    ... instead of read the value on our own
+
+ qt4/src/poppler-form.cc |    9 ++-------
+ 1 file changed, 2 insertions(+), 7 deletions(-)
+
+commit 9f111483cf6196dedf3cee380c3e5224776203ea
+Author: Pino Toscano <pino@kde.org>
+Date:  Sun Feb 27 14:12:16 2011 +0100
+
+    forms: read the TU field as alternateUiName
+
+ poppler/Form.cc |    8 ++++++++
+ poppler/Form.h  |    2 ++
+ 2 files changed, 10 insertions(+)
+
+commit cfaadaa9e4a857fcea3b5a2cadacd352de6c469d
+Author: Pino Toscano <pino@kde.org>
+Date:  Sun Feb 27 14:07:35 2011 +0100
+
+    [qt4] use FormWidget::getPartialName()
+
+    ... instead of read the value on our own
+
+ qt4/src/poppler-form.cc |    9 ++-------
+ 1 file changed, 2 insertions(+), 7 deletions(-)
+
+commit 2478896a0c1f6e5842f3d8b172e4cc7e6bd58cd8
+Author: Pino Toscano <pino@kde.org>
+Date:  Sun Feb 27 13:24:09 2011 +0100
+
+    [qt4] use the new FormWidget::createActivationAction()
+
+ qt4/src/poppler-form.cc |   13 +++----------
+ 1 file changed, 3 insertions(+), 10 deletions(-)
+
+commit 1dcb683a5c2dd6a1de654e90a4394f65d63dc296
+Author: Pino Toscano <pino@kde.org>
+Date:  Sun Feb 27 13:22:48 2011 +0100
+
+    add FormWidget::createActivationAction()
+
+    used to get and create a new activation action object of a form widget
+
+ poppler/Form.cc |   12 ++++++++++++
+ poppler/Form.h  |    3 +++
+ 2 files changed, 15 insertions(+)
+
+commit bd4cc73e438a7d4d4a10c50c69e65b5bdc63ddf2
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Sun Feb 27 11:04:45 2011 +0000
+
+    Some more missing copyrights
+
+ poppler/CairoOutputDev.cc |   2 +-
+ poppler/CairoOutputDev.h  |   2 +-
+ poppler/Gfx.cc                   |    2 +-
+ poppler/OutputDev.h      |    2 +-
+ poppler/TextOutputDev.cc  |   1 +
+ 5 files changed, 5 insertions(+), 4 deletions(-)
+
+commit 6c2ed4781d8ecfffdf24e1459aafd554b3527686
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Sun Feb 27 10:55:22 2011 +0000
+
+    Add 2011 years
+
+ poppler/Annot.cc          |    2 +-
+ poppler/CairoFontEngine.cc |   2 +-
+ 2 files changed, 2 insertions(+), 2 deletions(-)
+
+commit b297fb9de0779ac84d5b7ef68c792afefe598320
+Author: William Bader <williambader@hotmail.com>
+Date:  Sun Feb 27 01:48:55 2011 +0000
+
+    access the pixels directly
+
+    Faster, bug 34005
+
+ splash/Splash.cc |   21 +++++++++++----------
+ 1 file changed, 11 insertions(+), 10 deletions(-)
+
+commit de77e26759f1c33698abe248ad29b75c329a043c
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Sun Feb 27 01:39:23 2011 +0000
+
+    Fix crash in some pdf
+
+    Has to be 3 and not nComps since it's a output buffer, a the input one
+    Bug 34357
+
+ poppler/GfxState.cc |   2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 4f82a2e08cb2c930956c6b38030fa7b015a0de5a
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Sun Feb 27 01:38:33 2011 +0000
+
+    Implement GfxDeviceCMYKColorSpace::getRGBLine
+
+ poppler/GfxState.cc |  22 +++++++++++++++++++++-
+ poppler/GfxState.h  |  12 +++++++++++-
+ 2 files changed, 32 insertions(+), 2 deletions(-)
+
+commit 4980b99214281dcab8f82b5b618aadc24de371f4
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Sat Feb 26 14:00:33 2011 +0100
+
+    annots: Don't assume y1 > y3 for quad points of a highlight annotation
+
+    Fixes https://bugzilla.gnome.org/show_bug.cgi?id=643028
+
+ poppler/Annot.cc |    2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit e6ae0f8609cd66e9e124af59adefdff9d610dcd4
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Sat Feb 26 13:23:47 2011 +0100
+
+    cairo: Handle font type fontCIDType2OT when creating freetype font
+
+    Fixes https://bugzilla.gnome.org/show_bug.cgi?id=643273
+
+ poppler/CairoFontEngine.cc |   2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 22eb01d305ea2560d26417ca8df9c0465d4e9a82
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Sat Feb 26 12:17:49 2011 +0100
+
+    cairo: Fix a crash when rendering a document with inline images
+
+ poppler/CairoOutputDev.cc |   28 ++++++++++++++++------------
+ poppler/CairoOutputDev.h  |   2 +-
+ 2 files changed, 17 insertions(+), 13 deletions(-)
+
+commit a6599dd1fda37186b876b5b2de80be1731dd5946
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Sat Feb 26 11:59:03 2011 +0100
+
+    glib: Add some more introspection annotations
+
+ glib/poppler-attachment.cc |   2 +-
+ glib/poppler-document.cc   |   4 ++--
+ glib/poppler-media.cc     |    2 +-
+ glib/poppler-page.cc      |    6 +++---
+ 4 files changed, 7 insertions(+), 7 deletions(-)
+
+commit 89c66f236c85ac5a53ae12b01cdebc30e27b78d3
+Author: Peter Ward <peteraward@gmail.com>
+Date:  Sat Feb 26 11:39:58 2011 +0100
+
+    glib: Add missing "out" annotation to poppler_page_get_size()
+
+ glib/poppler-page.cc |    4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 7a68199b342eb3f33733f7d7446ede8f94130fba
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Sat Feb 26 11:09:27 2011 +0100
+
+    cairo: Check if cairo version is == 1.11.2 to use mesh gradients api
+
+    Cairo API has changed in 1.11.3.
+
+ poppler/CairoOutputDev.cc |   4 ++--
+ poppler/CairoOutputDev.h  |   4 ++--
+ 2 files changed, 4 insertions(+), 4 deletions(-)
+
+commit 97e7ab1a4eea2160f3f0847d10f6c16f2d66ef11
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Fri Feb 25 20:33:39 2011 +0000
+
+    Do not ask freetype for a font of size 0x0
+
+    Fixes rendering bug at 34602
+
+ splash/SplashFTFont.cc |    5 ++++-
+ 1 file changed, 4 insertions(+), 1 deletion(-)
+
+commit 3590a2d38082fc705040cdb31bf0b22ff12dd3e4
+Author: Adrian Johnson <ajohnson@redneon.com>
+Date:  Thu Feb 24 18:47:35 2011 +0000
+
+    Fix rendering of some substituted fonts
+
+    More info in bug 34522
+
+ poppler/GfxFont.cc |   3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+commit 384753f1f9f780687bdead99a6548ef8598b898a
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Mon Feb 21 19:19:48 2011 +0000
+
+    Use gfree since we allocate with gmalloc
+
+    Bug 34512
+
+ goo/GooString.cc |    4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit d775420c3c6cb5a29ff74712d3fc210fcb4b4627
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Sat Feb 19 11:19:57 2011 +0000
+
+    Do not delete textOut twice when using -bbox
+
+ utils/pdftotext.cc |   3 +--
+ 1 file changed, 1 insertion(+), 2 deletions(-)
+
+commit e1a56d73b066e7152ccf6ccf36206def7956cb00
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Wed Feb 16 00:06:45 2011 +0000
+
+    Lots of rendering improvements by Thomas and Andrea
+
+    Function.cc: Stitching functions incorrectly reported 0 as output
+    size.
+    Function.cc: Remove cache from PostScriptFunction
+    Function.cc: Make PSStack stack allocated
+    GfxState.cc & GfxState.h: Abstract GfxSimpleShading, add Matrix::norm
+    method, add simple caching, parameter range computation
+    SplashOutputDev.cc & SplashOutputDev..h & Splash.cc & SplashPattern.h:
+    Improve splash rendering, implement radial and abstract simple
+    shadings
+    in splash
+
+    And maybe something more, look at the
+    Followup Bug 32349 & Poppler: More shading fun ;-)
+    thread for more info
+
+ poppler/Function.cc       |  122 +--------
+ poppler/Function.h        |    3 +-
+ poppler/GfxState.cc       |  634
+ +++++++++++++++++++++++++++++++++++++++-----
+ poppler/GfxState.h        |   90 +++++--
+ poppler/SplashOutputDev.cc |  253 +++++++++++++++---
+ poppler/SplashOutputDev.h  |  67 ++++-
+ splash/Splash.cc          |  126 ++++++---
+ splash/SplashPattern.h     |   7 +-
+ 8 files changed, 1006 insertions(+), 296 deletions(-)
+
+commit 675b3505f963a0110dac7f865654232cbb865ef5
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Sun Feb 13 16:21:52 2011 +0100
+
+    tests: Merge splash and cairo tests into a single gtk-test tool
+
+    With a command line option to use cairo or splash backends.
+
+ test/CMakeLists.txt    |   20 +--
+ test/Makefile.am       |   29 ++--
+ test/gtk-cairo-test.cc  |  190 -----------------------
+ test/gtk-splash-test.cc |  311 -------------------------------------
+ test/gtk-test.cc       |  397
+ +++++++++++++++++++++++++++++++++++++++++++++++
+ 5 files changed, 412 insertions(+), 535 deletions(-)
+
+commit 728c022cdc1ea12aa54077d44276f9d7714930d4
+Author: Pino Toscano <pino@kde.org>
+Date:  Sun Feb 13 13:25:51 2011 +0100
+
+    remove more references to the qt3 frontend
+
+    followup of d82f98a274bfa008c218e265a080c4af7ce95131
+
+ Makefile.am |   3 ---
+ 1 file changed, 3 deletions(-)
+
+commit 15e5b3f16015361754fdc14da4a0dde5af887568
+Author: Pino Toscano <pino@kde.org>
+Date:  Sun Feb 13 13:23:06 2011 +0100
+
+    remove more GDK-related stuff
+
+    followup of 149b7fec472beda9d1538e0f26607c9498d504c2
+
+ Makefile.am                        |    1 -
+ cmake/modules/FindGDK.cmake        |   22 ----------------------
+ config.h.cmake                             |    3 ---
+ glib/reference/Makefile.am         |    1 -
+ glib/reference/poppler-sections.txt |   1 -
+ 5 files changed, 28 deletions(-)
+
+commit 50aa15a0bd7100fc9b9243de1d6e6f4b59df1488
+Author: Pino Toscano <pino@kde.org>
+Date:  Sun Feb 13 13:07:19 2011 +0100
+
+    remove GDK API here too
+
+    followup of 149b7fec472beda9d1538e0f26607c9498d504c2
+
+ glib/poppler-features.h.cmake |    1 -
+ 1 file changed, 1 deletion(-)
+
+commit f410cd11268254b9d0422201c9860d775f73fdd8
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Sun Feb 13 12:55:37 2011 +0100
+
+    gtk-splash-test: Don't use GDK deprecated API
+
+ test/gtk-splash-test.cc |   28 +++++++++++++++-------------
+ 1 file changed, 15 insertions(+), 13 deletions(-)
+
+commit a0568e449061d6b6af5485e340cd6f9d3e54ef7c
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Sun Feb 13 12:27:22 2011 +0100
+
+    glib: remove gdk referenes from pkg-config files
+
+ poppler-glib-uninstalled.pc.in |    2 +-
+ poppler-glib.pc.cmake         |    2 +-
+ poppler-glib.pc.in            |    2 +-
+ 3 files changed, 3 insertions(+), 3 deletions(-)
+
+commit 149b7fec472beda9d1538e0f26607c9498d504c2
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Sun Feb 13 11:51:57 2011 +0100
+
+    glib: Remove deprecated GDK API
+
+    It removes the GDK dependency so that poppler-glib now only depends on
+    glib and cairo.
+
+ CMakeLists.txt                    |    9 --
+ configure.ac              |   44 +------
+ glib/CMakeLists.txt       |   14 +--
+ glib/Makefile.am          |    8 +-
+ glib/poppler-features.h.in |   6 -
+ glib/poppler-page.cc      |  296
+ --------------------------------------------
+ glib/poppler-page.h       |   34 -----
+ 7 files changed, 4 insertions(+), 407 deletions(-)
+
+commit a5482d64472a81206dd8d0c5bb80007f6d5bb893
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Sun Feb 13 11:40:23 2011 +0100
+
+    glib: Remove test-poppler-glib, poppler-glib-demo does the same
+    and more
+
+ glib/CMakeLists.txt      |    8 -
+ glib/Makefile.am         |   14 -
+ glib/test-poppler-glib.cc |  657
+ ---------------------------------------------
+ 3 files changed, 679 deletions(-)
+
+commit cab0cf028a192772dcb5c3f4aefa0a421e73e9e7
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Fri Feb 11 19:42:34 2011 +0000
+
+    Do not infinite loop in some broken files
+
+ poppler/JBIG2Stream.cc |    3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+commit 1125cc8ccf386d8e0a0679aa73614bc2cb8037b0
+Author: William Bader <williambader@hotmail.com>
+Date:  Tue Feb 8 20:27:16 2011 +0000
+
+    Allow setting the rasterization resolution
+
+    More info at bug 34001
+
+ poppler/GlobalParams.cc |   15 +++++++++++++++
+ poppler/GlobalParams.h  |    3 +++
+ poppler/PSOutputDev.cc  |    7 ++++++-
+ utils/pdftops.1        |    6 ++++++
+ utils/pdftops.cc       |    6 ++++++
+ 5 files changed, 36 insertions(+), 1 deletion(-)
+
+commit 96e169b0eca31891f3cd564365d4a2a5c6e2a2c0
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Tue Feb 8 19:58:31 2011 +0000
+
+    Make really sure the uMap static pointer is valid
+
+    It might happen you are extremely unlucky and get the same
+    globalParams after a new delete/creation
+
+ qt4/src/poppler-private.cc |  51
+ ++++++++++++++++++++++++++++++++++++++------
+ qt4/src/poppler-private.h  |  34 +++--------------------------
+ 2 files changed, 47 insertions(+), 38 deletions(-)
+
+commit c3470145f95791167c19a438934a923eab8a93cf
+Author: William Bader <williambader@hotmail.com>
+Date:  Tue Feb 8 19:54:48 2011 +0000
+
+    Add PS level1 non standard binary output option
+
+    More info at bug 34003
+
+ poppler/GlobalParams.cc |   18 +++-
+ poppler/GlobalParams.h  |    5 +-
+ poppler/PSOutputDev.cc  |  227
+ ++++++++++++++++++++++++++++++++++-------------
+ utils/pdftops.1        |    7 ++
+ utils/pdftops.cc       |    8 +-
+ 5 files changed, 198 insertions(+), 67 deletions(-)
+
+commit 37077aa475d2dee81f87daa05297b201eeb99c87
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Mon Feb 7 19:48:28 2011 +0000
+
+    Make sure tx is inside the bitmap
+
+    Seems to be what the code tried to do, fixes crash in bug 33948
+    depending on
+    the resolution you render it
+
+ poppler/SplashOutputDev.cc |  10 +++++-----
+ 1 file changed, 5 insertions(+), 5 deletions(-)
+
+commit 5aa854f70c8f563efe56dafa8bd6b3cdd5c95451
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Sun Feb 6 13:24:35 2011 +0100
+
+    cairo: Use the new cairo unique id to set the surface id when printing
+
+    Set the unique surface id when attaching jpeg images to the surface so
+    that cairo can reuse the mime data even when a new surface is created
+    with the same mime data. This reduces the size of the output file when
+    printing.
+
+ poppler/CairoOutputDev.cc |   18 ++++++++++++++++--
+ poppler/CairoOutputDev.h  |   2 +-
+ 2 files changed, 17 insertions(+), 3 deletions(-)
+
+commit fe7b8aa4fc78aacf3226d019db74146ceaebd63c
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Wed Feb 2 22:35:40 2011 +0000
+
+    Workaround bug when converting pdf to ps with level1
+
+    See bug 31926 for more info
+
+ poppler/PSOutputDev.cc      |   2 +-
+ poppler/PreScanOutputDev.cc |   7 +++++++
+ poppler/PreScanOutputDev.h  |   7 +++++++
+ 3 files changed, 15 insertions(+), 1 deletion(-)
+
+commit 5984ad081cd609f3146e0da5e22097ef073eb519
+Author: William Bader <williambader@hotmail.com>
+Date:  Sun Jan 30 17:02:02 2011 +0000
+
+    Increase precision
+
+    Fixes some issues with pdf from bug 27482
+
+ poppler/PSOutputDev.cc |  200
+ ++++++++++++++++++++++++------------------------
+ 1 file changed, 100 insertions(+), 100 deletions(-)
+
+commit c60d5afbeb986c1b335357202c5f551a3c146a76
+Author: Jim Meyering <meyering@redhat.com>
+Date:  Mon Jan 24 15:51:20 2011 +0100
+
+    demo: don't use an uninitialized local variable
+
+    * text.c (pgd_text_get_text): Before this change, when
+    poppler_page_get_text returned NULL, we'd use "n_recs" uninitialized.
+
+ glib/demo/text.c |    1 +
+ 1 file changed, 1 insertion(+)
+
+commit a3bdc56e2f086444419eddfcda5d2010a9a6b5c0
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Sat Jan 29 11:23:33 2011 +0100
+
+    glib-demo: Add a tooltip with current selected character in text demo
+
+    To make sure that the offset of the text returned by
+    poppler_page_get_text() matches
+    the list of rectangles returned by poppler_page_get_text_layout().
+
+ glib/demo/text.c |   60
+ ++++++++++++++++++++++++++++++++++++++++++++++++++++++
+ 1 file changed, 60 insertions(+)
+
+commit bf2d86c8db430595fb3c55edd3f6c8d289bdaeb5
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Fri Jan 28 20:34:08 2011 +0000
+
+    Make sure uMap is still valid before using it
+
+    Fixes KDE bug 264667
+
+ qt4/src/poppler-private.cc |   6 ++++--
+ 1 file changed, 4 insertions(+), 2 deletions(-)
+
+commit e6fb20d7b3bf8ea8aedc1bcd910e035059835b5f
+Author: Axel Strübing <axel.struebing@freenet.de>
+Date:  Fri Jan 28 19:20:15 2011 +0000
+
+    Extract text of a pdf correctly
+
+    See "[poppler] text extraction does not work" in the mailing list
+    for more info
+
+ poppler/GfxFont.cc |  14 +++++++++++++-
+ poppler/GfxFont.h  |   2 ++
+ 2 files changed, 15 insertions(+), 1 deletion(-)
+
+commit 4829d36a3b005585db8c8115f7ee81a4e2384780
+Author: Simon Kellner <kellner@kit.edu>
+Date:  Wed Jan 26 22:59:49 2011 +0000
+
+    fix labelToIndex on multiple prefixes
+
+    A PDF document can use page label prefixes, for example, to label
+    only inside a chapter ("A-1" .. "A-<n>", "B-1" .. "B-<m>" et cetera).
+    When calculating a page index for a given label, poppler would
+    disregard the page range for all preceding prefixes that do not
+    match the given prefix.
+
+ poppler/PageLabelInfo.cc |    7 +++----
+ 1 file changed, 3 insertions(+), 4 deletions(-)
+
+commit e57c75fbd95ef8399b0785500f6893465bc808c3
+Author: Adrian Johnson <ajohnson@redneon.com>
+Date:  Mon Jan 24 19:48:09 2011 +1030
+
+    cairo: Implement Type 4,5,6,7 shadings using cairo mesh gradients
+
+    Fixes bugs #19076 and #32791.
+
+ poppler/CairoOutputDev.cc |  139
+ +++++++++++++++++++++++++++++++++++++++++++++
+ poppler/CairoOutputDev.h  |   12 ++++
+ poppler/Gfx.cc                   |   10 +++-
+ poppler/OutputDev.h      |    2 +
+ 4 files changed, 161 insertions(+), 2 deletions(-)
+
+commit 5081356fcc69012e9df95dbf1e3c36e7c1e751c4
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Tue Jan 25 20:26:25 2011 +0000
+
+    Fix leak in SplashOutputDev::axialShadedFill
+
+ poppler/SplashOutputDev.cc |   3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+commit 19dc283c3af597deab297341a37495c06988948b
+Author: Thomas Klausner <wiz@danbala.tuwien.ac.at>
+Date:  Mon Jan 24 19:05:08 2011 +0000
+
+    Include zlib header since we use things defined there
+
+ goo/PNGWriter.cc |    3 +++
+ 1 file changed, 3 insertions(+)
+
+commit 5056e33e01ce0f7db1a5401b7b38d30e84eedf69
+Author: Sam Liao <phyomh@gmail.com>
+Date:  Mon Jan 17 13:07:22 2011 +0800
+
+    Poppler: Fix line selection, dont check y for Line selection
+
+    When a line is selected while the Y values of selection is
+    not in the y range of words, the render will render the
+    line with reverse color while the words does not show up.
+
+    This fix neglect the Y vaules to make sure that the words
+    also displayed when line is selected.
+
+ poppler/TextOutputDev.cc |   16 ++++++++--------
+ 1 file changed, 8 insertions(+), 8 deletions(-)
+
+commit 88812e716c1a0c87a504118d47eb4cc6f52962fa
+Author: Andreas Hartmetz <ahartmetz@gmail.com>
+Date:  Fri Jan 21 23:33:47 2011 +0000
+
+    Add Hinting API to ArthurOutputDev
+
+ poppler/ArthurOutputDev.cc |  11 +++++++++--
+ poppler/ArthurOutputDev.h  |  15 ++++++++++++++-
+ 2 files changed, 23 insertions(+), 3 deletions(-)
+
+commit dc5ec4668bdfe3b6ba41f0a2e551bbc07f8839ba
+Author: Andreas Hartmetz <ahartmetz@gmail.com>
+Date:  Fri Jan 21 23:32:50 2011 +0000
+
+    support slight hinting in Splash backend
+
+ cpp/poppler-page-renderer.cpp |    2 +-
+ poppler/SplashOutputDev.cc    |    6 +++++-
+ poppler/SplashOutputDev.h     |    4 +++-
+ qt4/src/poppler-private.h     |    3 ++-
+ qt4/src/poppler-qt4.h        |    4 +++-
+ splash/SplashFTFont.cc        |   27 ++++++++++++++++++---------
+ splash/SplashFTFont.h        |    2 ++
+ splash/SplashFTFontEngine.cc  |   10 +++++++---
+ splash/SplashFTFontEngine.h   |    6 ++++--
+ splash/SplashFontEngine.cc    |    4 +++-
+ splash/SplashFontEngine.h     |    2 ++
+ 11 files changed, 50 insertions(+), 20 deletions(-)
+
+commit 0c5b1bef9f3f98001cee20061b1eaf20b965c5a9
+Author: William Bader <williambader@hotmail.com>
+Date:  Fri Jan 21 19:01:45 2011 +0000
+
+    Fix rendering for some pdf with -level1sep
+
+    Also some speed improvemensts. Bug #32365
+
+ poppler/PSOutputDev.cc |  207
+ +++++++++++++++++++++++++++++++++++++-----------
+ poppler/PSOutputDev.h |   13 ++-
+ 2 files changed, 170 insertions(+), 50 deletions(-)
+
+commit 6cb8965fb8bce6da2a4460e86f592c1ea3a84a5c
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Fri Jan 21 18:43:21 2011 +0000
+
+    fix (C) years
+
+ poppler/CairoOutputDev.cc   |   2 +-
+ poppler/CairoOutputDev.h    |   2 +-
+ qt4/src/poppler-private.cc  |   2 +-
+ qt4/tests/check_strings.cpp |   2 +-
+ 4 files changed, 4 insertions(+), 4 deletions(-)
+
+commit 24f9c8924b2135da616386d0fa691fe790b4e7a4
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Fri Jan 21 08:43:34 2011 +0000
+
+    Access the correct variable
+
+    Fixes asert on bug 33063
+
+ poppler/Annot.cc |    4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 07a8808c22445c421f3064da7e5227dcbf40358b
+Author: Pino Toscano <pino@kde.org>
+Date:  Mon Jan 17 21:34:23 2011 +0100
+
+    fix unicodeToQString() to correctly decode the Unicode sequence
+
+    Use a UnicodeMap to convert the sequence to UTF-8, and convert from
+    that to QString.
+    Also, ignore the last character of the Unicode sequence if it is 0x0.
+
+    Add a couple of testcases for it.
+
+ qt4/src/poppler-private.cc  |  30 ++++++++++++++++++++++++------
+ qt4/tests/check_strings.cpp |  21 +++++++++++++++++++++
+ 2 files changed, 45 insertions(+), 6 deletions(-)
+
+commit ed367c08d788c88c49de770019bf826cfebb3e2c
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Sun Jan 16 17:25:02 2011 +0000
+
+    Don't need this either
+
+ configure.ac |    1 -
+ 1 file changed, 1 deletion(-)
+
+commit 76ab657dc81ed0af7d9f2efaca2e68d570063001
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Sun Jan 16 17:22:56 2011 +0000
+
+    And this is the last bit of qt3 cleaning?
+
+ configure.ac |    1 -
+ 1 file changed, 1 deletion(-)
+
+commit 9a02856c2762e65b8f03e443e728e05e5a86f65b
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Sun Jan 16 17:21:00 2011 +0000
+
+    Another qt3 unused file
+
+ m4/qt.m4 |   16 ----------------
+ 1 file changed, 16 deletions(-)
+
+commit 26da7a52d31eb677ab6399de2c07140aa272b35e
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Sun Jan 16 17:17:59 2011 +0000
+
+    Yet more qt3 cleaning
+
+ configure.ac |    2 --
+ 1 file changed, 2 deletions(-)
+
+commit 8dc9c693abb0033247a338d0f7d1f3f7a57c1a55
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Sun Jan 16 17:14:34 2011 +0000
+
+    Some more qt3 thigs i forgot to kill
+
+ CMakeLists.txt                     |    5 -
+ Makefile.am                |    1 -
+ cmake/modules/FindQt3.cmake | 319
+ -------------------------------------------
+ 3 files changed, 325 deletions(-)
+
+commit d82f98a274bfa008c218e265a080c4af7ce95131
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Sun Jan 16 17:13:06 2011 +0000
+
+    Kill qt3 frontend
+
+ CMakeLists.txt                              |    5 -
+ Makefile.am                         |    5 -
+ configure.ac                        |   18 --
+ poppler-qt-uninstalled.pc.in        |    7 -
+ poppler-qt.pc.cmake                 |   13 --
+ poppler-qt.pc.in                    |   13 --
+ qt/.gitignore                       |    7 -
+ qt/CMakeLists.txt                   |   34 ----
+ qt/Makefile.am                              |   48 -----
+ qt/poppler-document.cc                      |  344
+ --------------------------------
+ qt/poppler-fontinfo.cc                      |   83 --------
+ qt/poppler-link-qt3.h               |  188 ------------------
+ qt/poppler-link.cc                  |  267 -------------------------
+ qt/poppler-page-transition-private.h |   28 ---
+ qt/poppler-page-transition.cc       |   95 ---------
+ qt/poppler-page-transition.h        |  146 --------------
+ qt/poppler-page.cc                  |  357
+ ----------------------------------
+ qt/poppler-private.cc               |  147 --------------
+ qt/poppler-private.h                |  102 ----------
+ qt/poppler-qt.h                     |  311 -----------------------------
+ qt/test-poppler-qt.cpp                      |  122 ------------
+ 21 files changed, 2340 deletions(-)
+
+commit 301352e5585d4ab6e7b609b4ab79b4d8b8656092
+Author: Daiki Ueno <ueno@unixuser.org>
+Date:  Sun Jan 9 18:48:50 2011 +0000
+
+    Do not crash in case jpeg_create_decompress fails
+
+    Bug 32890
+
+ poppler/DCTStream.cc |   21 ++++++++++++---------
+ poppler/DCTStream.h  |    8 ++++++--
+ 2 files changed, 18 insertions(+), 11 deletions(-)
+
+commit 17baf0498485720b4ea5952bb46287f533139d0a
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Sat Jan 8 13:03:31 2011 +0000
+
+    Remove declaration of function without implementation
+
+ poppler/XRef.h |    3 +--
+ 1 file changed, 1 insertion(+), 2 deletions(-)
+
+commit a9e280508f5d669c8b6e1a6bb888b9369d868ab3
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Sat Jan 8 10:39:41 2011 +0100
+
+    glib: Fix memory leak when calling poppler_page_get_text_layout()
+    for pages with no text
+
+ glib/poppler-page.cc |    5 ++++-
+ 1 file changed, 4 insertions(+), 1 deletion(-)
+
+commit 5d62d18941810ef7d668eafa8b001085133fb169
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Sat Jan 8 10:33:32 2011 +0100
+
+    glib: Use NULL instead of FALSE in g_return_val_if_fail() for
+    functions returning a pointer
+
+ glib/poppler-page.cc |   12 ++++++------
+ 1 file changed, 6 insertions(+), 6 deletions(-)
+
+commit 1324ae13f1fc2fa28951c2c7f7d63d4756537229
+Author: Pino Toscano <pino@kde.org>
+Date:  Thu Jan 6 01:15:30 2011 +0100
+
+    [cpp/apidox] advertize the 'pnm' image format
+
+ cpp/poppler-image.cpp |    1 +
+ 1 file changed, 1 insertion(+)
+
+commit b192363960c26111167b1b08db9910e5f39dcf8b
+Author: Pino Toscano <pino@kde.org>
+Date:  Thu Jan 6 01:09:09 2011 +0100
+
+    [cpp] Add PNM (PBM/PGM/PPM) exporting to 'image'.
+
+    Introduce a custom ImgWriter (PNMWriter) for exporting in the PNM
+    variants,
+    and use it choosing the output format matching as close as possible
+    the format of the image.
+
+ cpp/CMakeLists.txt    |    1 +
+ cpp/Makefile.am       |    2 +
+ cpp/PNMWriter.cc      |  119
+ +++++++++++++++++++++++++++++++++++++++++++++++++
+ cpp/PNMWriter.h       |   43 ++++++++++++++++++
+ cpp/poppler-image.cpp |   22 ++++++++-
+ 5 files changed, 186 insertions(+), 1 deletion(-)
+
+commit bebc530cbde7898759e1bd3629d2836ce0fb1d08
+Author: Adrian Johnson <ajohnson@redneon.com>
+Date:  Fri Dec 31 12:11:40 2010 +1030
+
+    cairo: Don't set JPX mime data if the stream specifies a colorspace
+
+    The stream colorspace overides, and may be different to, the
+    colorspace in the JPX data.
+
+    https://bugs.freedesktop.org/show_bug.cgi?id=32746
+
+ poppler/CairoOutputDev.cc |   46
+ ++++++++++++++++++++++++++++++---------------
+ poppler/CairoOutputDev.h  |   1 +
+ 2 files changed, 32 insertions(+), 15 deletions(-)
+
+commit 1399b9ab14b19f25583c75af2b36f63a6a01129a
+Author: Pino Toscano <pino@kde.org>
+Date:  Wed Dec 29 15:56:45 2010 +0100
+
+    [cpp] add TIFF output to 'image'
+
+ cpp/poppler-image.cpp |   12 ++++++++++++
+ 1 file changed, 12 insertions(+)
+
+commit 1c7937dbc3c577ffc12cacc8de33d320e2f30ce9
+Author: William Bader <williambader@hotmail.com>
+Date:  Wed Dec 29 14:47:06 2010 +0000
+
+    Make pdftoppm be able of writing tif files
+
+    BUG 32027
+
+ CMakeLists.txt                |   15 ++++
+ config.h.cmake                |    3 +
+ configure.ac          |   32 ++++++++
+ goo/Makefile.am       |    2 +
+ goo/TiffWriter.cc     |  202
+ ++++++++++++++++++++++++++++++++++++++++++++++++
+ goo/TiffWriter.h      |   53 +++++++++++++
+ poppler/Makefile.am   |   11 +++
+ splash/SplashBitmap.cc |   18 ++++-
+ splash/SplashBitmap.h |    5 +-
+ splash/SplashTypes.h  |    4 +-
+ utils/pdftoppm.1      |    6 ++
+ utils/pdftoppm.cc     |   14 +++-
+ 12 files changed, 358 insertions(+), 7 deletions(-)
+
+commit bae91ecb638fcfee001e5c9a86a754610da796e4
+Author: William Bader <williambader@hotmail.com>
+Date:  Tue Dec 28 11:53:54 2010 +0000
+
+    Add -singlefile option to pdftoppm
+
+    Bug 32025
+
+ utils/pdftoppm.1  |   3 +++
+ utils/pdftoppm.cc |   26 +++++++++++++++++++++++---
+ 2 files changed, 26 insertions(+), 3 deletions(-)
+
+commit ff58ee66c27da09a370a3000ab55eb1a24921852
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Mon Dec 27 20:07:21 2010 +0000
+
+    bump soname just in case the getPage change is not BC
+
+ qt/CMakeLists.txt |   2 +-
+ qt/Makefile.am    |   2 +-
+ 2 files changed, 2 insertions(+), 2 deletions(-)
+
+commit 453df02e195a96d0210f297c21c8ffba646659da
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Mon Dec 27 19:51:13 2010 +0000
+
+    Make distcheck work
+
+ glib/Makefile.am |    2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 6a34cec72c1a1b6576858a7836aae4a902fb5ed7
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Mon Dec 27 19:29:52 2010 +0000
+
+    increase core soname
+
+ CMakeLists.txt      |   2 +-
+ poppler/Makefile.am |   2 +-
+ 2 files changed, 2 insertions(+), 2 deletions(-)
+
+commit 8c11e9d68dceb609d04b3b383d22c307b5981d86
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Mon Dec 27 19:23:29 2010 +0000
+
+    0.16.0 project version increase
+
+ CMakeLists.txt   |    4 ++--
+ configure.ac    |    4 ++--
+ cpp/Doxyfile    |    2 +-
+ qt4/src/Doxyfile |    2 +-
+ 4 files changed, 6 insertions(+), 6 deletions(-)
+
+commit 8c1fd83c6061279af00c1172fe41cee61f19d917
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Mon Dec 27 19:22:22 2010 +0000
+
+    0.16.0 NEWS
+
+ NEWS |   24 ++++++++++++++++++++++++
+ 1 file changed, 24 insertions(+)
+
+commit 0294d6e50691a3e40fad0d6e4fa9056944a91efd
+Author: Thomas Freitag <Thomas.Freitag@alfa.de>
+Date:  Thu Dec 23 15:56:32 2010 +0000
+
+    Be more correct when drawing radial shadings
+
+    Fixes 32349
+
+ poppler/Gfx.cc |   25 ++++++++++++++++---------
+ 1 file changed, 16 insertions(+), 9 deletions(-)
+
+commit 3aa08e378927889b35b6fa858d6da568250ba6ec
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Sun Dec 19 22:36:47 2010 +0000
+
+    Seems to work with this version, so enable it
+
+ CMakeLists.txt |    4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 93cf184b7573980bf2e56342e64f9b99c5d0b415
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Sun Dec 19 14:16:25 2010 +0000
+
+    Fix last commit
+
+    Applying patches by hand is bad
+
+ poppler/PDFDoc.cc |   4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit ebb580d756a8321de87814f05ab572564732c15e
+Author: Philip Lorenz <lorenzph+freedesktop@gmail.com>
+Date:  Sun Dec 19 14:08:31 2010 +0000
+
+    Windows fixes
+
+ poppler/PDFDoc.cc |   5 +++--
+ 1 file changed, 3 insertions(+), 2 deletions(-)
+
+commit 88a4154420e016d93c5ce05b5b8e09b6bddcadc9
+Author: Philip Lorenz <lorenzph+freedesktop@gmail.com>
+Date:  Sun Dec 19 13:03:01 2010 +0000
+
+    build on newer MSVC
+
+ qt4/src/poppler-annotation.h |    7 ++++---
+ 1 file changed, 4 insertions(+), 3 deletions(-)
+
+commit 18cd9f6aeb48266c551952c395eb9cd662bc27f5
+Author: Thomas Freitag <Thomas.Freitag@alfa.de>
+Date:  Sat Dec 18 17:59:54 2010 +0000
+
+    compile in windows
+
+ poppler/FontInfo.cc |   3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+commit 471102ef68b439dfa13e20e3b0f2e143f8d0dc85
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Fri Dec 17 00:36:36 2010 +0000
+
+    Remove -resolution
+
+    Actually use -zoom that is there for a reason
+
+ utils/pdftohtml.1  |   3 ---
+ utils/pdftohtml.cc |  15 ++++++---------
+ 2 files changed, 6 insertions(+), 12 deletions(-)
+
+commit edf6c47feb5b7658e585bcce196e465245e1dc98
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Thu Dec 16 22:56:40 2010 +0000
+
+    kill useless code
+
+ utils/pdftohtml.cc |   8 --------
+ 1 file changed, 8 deletions(-)
+
+commit 185a2f81485e19f96393a431be5523a277747b94
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Thu Dec 16 22:56:15 2010 +0000
+
+    static-ify some vars
+
+ utils/HtmlOutputDev.cc |    9 ---------
+ utils/pdftohtml.cc    |    8 ++++----
+ 2 files changed, 4 insertions(+), 13 deletions(-)
+
+commit e4dfc548c57b690db9122d1db3342ed0a785c8bb
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Tue Dec 14 19:45:46 2010 +0000
+
+    We need this to make the define really be defined
+
+ config.h.cmake |    3 +++
+ 1 file changed, 3 insertions(+)
+
+commit 06da4b46c442778c67b788b747f04b386b5247ac
+Author: Adrian Johnson <ajohnson@redneon.com>
+Date:  Tue Dec 14 09:06:57 2010 +1030
+
+    cairo: Use A1 instead of A8 for imagemask
+
+    The cairo PDF surface now optimizes the case of cairo_mask() with
+    solid source and A1 mask to use a PDF stencil mask.
+
+    Fixes https://bugs.launchpad.net/ubuntu/+source/libcairo/+bug/680628
+    where a 65K PDF printed to PDF using poppler-cairo turns into an 8MB
+    PDF.
+
+ CMakeLists.txt                   |    2 ++
+ configure.ac             |    1 +
+ poppler/CairoOutputDev.cc |   25 ++++++++++++++++++-------
+ 3 files changed, 21 insertions(+), 7 deletions(-)
+
+commit 6ef457dc818e7e241e5d2e264bc2d78b132ae638
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Mon Dec 13 14:08:29 2010 +0000
+
+    Move -fno-exceptions -fno-check-new to default flags
+
+    Makes sense since we decided not to support the exception path in
+    gmem a
+    while ago
+
+ cmake/modules/PopplerMacros.cmake |   2 +-
+ configure.ac                     |    2 +-
+ 2 files changed, 2 insertions(+), 2 deletions(-)
+
+commit 86e469600b58ae05cb6ede1b4017fbdac99cc556
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Mon Dec 13 14:04:00 2010 +0000
+
+    More gcc flags movement
+
+    -Wchar-subscripts is part of -Wall so remove it
+    Move -fno-common to default options since it makes sense to use it
+
+ cmake/modules/PopplerMacros.cmake |   4 ++--
+ configure.ac                     |    4 ++--
+ 2 files changed, 4 insertions(+), 4 deletions(-)
+
+commit 2b74241d8b1fd1ec9fab4f6f673bbaaa1cb3d949
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Mon Dec 13 13:56:52 2010 +0000
+
+    Promote -Wcast-align to the general warnings we ask gcc to give
+
+ cmake/modules/PopplerMacros.cmake |   2 +-
+ configure.ac                     |    2 +-
+ 2 files changed, 2 insertions(+), 2 deletions(-)
+
+commit 7313e0a4de6f2146c1dcb3d235f18a3c844d12d5
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Sun Dec 12 23:28:18 2010 +0000
+
+    Do not return 99 (or 1) with -h, -v and -printenc
+
+    Bug 32149
+
+ utils/pdffonts.cc  |   2 ++
+ utils/pdfimages.cc |   2 ++
+ utils/pdfinfo.cc   |   3 +++
+ utils/pdftoppm.cc  |   2 ++
+ utils/pdftops.cc   |   5 ++++-
+ utils/pdftotext.cc |   3 +++
+ 6 files changed, 16 insertions(+), 1 deletion(-)
+
+commit 669cbfc9fd78a22d4f14b0af43143e1f5dc28cd5
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Sat Dec 11 19:04:22 2010 +0000
+
+    Fix the preliminary bbox/clip calculation
+
+    Code based in code posted by Suzuki Toshiya in the freetype mailing
+    list
+
+ splash/SplashFTFont.cc |   15 +++++++++------
+ 1 file changed, 9 insertions(+), 6 deletions(-)
+
+commit 2984002a64acca7014edeadd900dd52cdf7d9eac
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Sat Dec 11 18:57:52 2010 +0000
+
+    Remove the * we just need to increase the pointer
+
+    Gives a warning with newer gcc's
+
+ splash/Splash.cc |    6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
+
+commit 9b45fa072198da4a5032004ac943cf2227aa97ea
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Fri Dec 10 12:05:58 2010 +0000
+
+    Make PreScanOutputDev be less agressive when deciding to rasterize
+
+    BUG 30107
+
+ poppler/PreScanOutputDev.cc |  14 +++++++++++++-
+ poppler/PreScanOutputDev.h  |   4 ++++
+ 2 files changed, 17 insertions(+), 1 deletion(-)
+
+commit f96f6a06cdc33b4654669ac74d5abd0d546a127d
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Sun Dec 5 12:06:21 2010 +0000
+
+    Adapt the zlib-base FlateStream code to API changes
+
+    Bug 32065
+
+ poppler/FlateStream.cc |    9 ++++++---
+ poppler/FlateStream.h |    9 +++++++++
+ 2 files changed, 15 insertions(+), 3 deletions(-)
+
+commit 7b1f83990a1f68306daf5f7dbeabcd38f4382e3b
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Mon Nov 29 22:27:46 2010 +0000
+
+    0.15.3
+
+ CMakeLists.txt      |   4 ++--
+ NEWS               |   18 ++++++++++++++++++
+ configure.ac       |    2 +-
+ cpp/Doxyfile       |    2 +-
+ poppler/Makefile.am |   2 +-
+ qt4/src/Doxyfile    |   2 +-
+ 6 files changed, 24 insertions(+), 6 deletions(-)
+
+commit 7c23a993193aaaa4d4b5b6d1161a0455d1e2a8c0
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Mon Nov 29 21:33:31 2010 +0000
+
+    Add some more isNum before calling getNum
+
+ poppler/GfxState.cc |  48
+ ++++++++++++++++++++++++++++++++----------------
+ 1 file changed, 32 insertions(+), 16 deletions(-)
+
+commit 62ec4f591c258e702ee79b519919a931517220bf
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Mon Nov 29 20:50:43 2010 +0000
+
+    pass fetchOriginatorNums in some more calls
+
+    Fixes some more crashes in broken files
+
+ poppler/Parser.cc |   7 ++++++-
+ poppler/Parser.h  |   1 +
+ poppler/XRef.cc   |   6 +++---
+ 3 files changed, 10 insertions(+), 4 deletions(-)
+
+commit d2a0e2ca723142478858f7edfb7c98807d554578
+Author: Hib Eris <hib@hiberis.nl>
+Date:  Thu Nov 25 10:36:38 2010 +0000
+
+    Skip over loops in Pages tree
+
+ poppler/Catalog.cc |  15 ++++++++++-----
+ 1 file changed, 10 insertions(+), 5 deletions(-)
+
+commit 7abd371364e6e4aaef932f26b0664f7f9d760c42
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Sun Nov 28 13:57:50 2010 +0000
+
+    this var is not about xobjects only anymroe
+
+ poppler/FontInfo.cc |   6 +++---
+ poppler/FontInfo.h  |   2 +-
+ 2 files changed, 4 insertions(+), 4 deletions(-)
+
+commit 1ac14df61d711097837e44d80a9332f0a854b95e
+Author: Adrian Johnson <ajohnson@redneon.com>
+Date:  Sun Nov 28 13:49:41 2010 +0000
+
+    find fonts inside patterns
+
+    Bug 31948
+
+ poppler/FontInfo.cc |  50
+ +++++++++++++++++++++++++++-----------------------
+ 1 file changed, 27 insertions(+), 23 deletions(-)
+
+commit d30dd8c6f6491beac9750447126930168394cd9f
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Sun Nov 28 13:25:39 2010 +0000
+
+    Use sets instead of arrays
+
+ poppler/FontInfo.cc |  46 ++++++++--------------------------------------
+ poppler/FontInfo.h  |  11 +++--------
+ 2 files changed, 11 insertions(+), 46 deletions(-)
+
+commit 4c20bf14c0b1d7f1d5e530ded890186487da32b5
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Sun Nov 28 12:50:24 2010 +0000
+
+    Use FontInfoScanner
+
+    No idea why we didn't do this before, duplicate code is evil and now
+    pdffonts doesn't crash on pdf from bug 20486
+
+ utils/pdffonts.cc |  185
+ ++++++++---------------------------------------------
+ 1 file changed, 26 insertions(+), 159 deletions(-)
+
+commit d915f3d5a9e9e2e5dcd6be4cf8fac1b5849a13e9
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Wed Nov 24 21:51:46 2010 +0000
+
+    protect against null ref here
+
+ poppler/Catalog.cc |   2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit cf32faaa16d763561fb9dfc4469345e4b3ba2369
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Wed Nov 24 21:48:54 2010 +0000
+
+    Protect against NULL values here
+
+ poppler/JPEG2000Stream.h |    2 ++
+ 1 file changed, 2 insertions(+)
+
+commit 46a6cc5952c59504863baed3ad2870093c462f12
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Wed Nov 24 19:42:59 2010 +0000
+
+    Check the objects are numbers before using them
+
+    Bug 31895
+
+ poppler/GfxState.cc |  26 ++++++++++++++++++--------
+ 1 file changed, 18 insertions(+), 8 deletions(-)
+
+commit 52e25cca7e75a8b8eac95a3cec258f1cd9f8ecaa
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Tue Nov 23 20:31:14 2010 +0000
+
+    If it is not a Page but has no Kids either let's just pretend it's
+    a page
+
+    Fixes broken PDF at bug 31861
+
+ poppler/Catalog.cc |   2 +-
+ poppler/Dict.cc    |   4 ++++
+ poppler/Dict.h     |   2 ++
+ 3 files changed, 7 insertions(+), 1 deletion(-)
+
+commit c6127898b13311197971b1c6b1b306b91e28cf0e
+Author: Hib Eris <hib@hiberis.nl>
+Date:  Mon Nov 22 13:08:48 2010 +0000
+
+    Use gmallocn_checkoverflow when parsing Hints table
+
+    Prevents running out of memory with malicious documents.
+
+ poppler/Hints.cc |   26 +++++++++++++-------------
+ 1 file changed, 13 insertions(+), 13 deletions(-)
+
+commit 6a17cc89eda52f08cbacbf9bfaaeda22cf041e82
+Author: Thomas Freitag <Thomas.Freitag@alfa.de>
+Date:  Mon Nov 22 19:20:56 2010 +0000
+
+    Improve rendering of radial shadings
+
+    Improves the duck rendering in bug 22098
+
+ poppler/Gfx.cc |   71
+ +++++++++++++++++++++++++++-----------------------------
+ 1 file changed, 34 insertions(+), 37 deletions(-)
+
+commit 9093adede4f9ad6fb2962dcefcb09c1d8c357715
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Sun Nov 21 23:49:12 2010 +0000
+
+    pedantic ;
+
+ poppler/CurlPDFDocBuilder.cc |    2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 61445f5af749510fb647059af01abf1faf664195
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Sat Nov 20 22:19:35 2010 +0000
+
+    forgot to upadte year here
+
+ poppler/Parser.h |    2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 3628837febb21bcd1b54f3fb737628ea59e5d95d
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Sat Nov 20 22:15:08 2010 +0000
+
+    And now generalize the previous fix
+
+    Works for loops of more than one item as in bug 28784
+
+ poppler/Dict.cc   |   4 ++--
+ poppler/Dict.h    |   2 +-
+ poppler/Object.cc |   4 ++--
+ poppler/Object.h  |   9 +++++----
+ poppler/Parser.cc |   19 +++++++++++++------
+ poppler/Parser.h  |   7 ++++++-
+ poppler/XRef.cc   |   30 +++++++++++++++++++++++++-----
+ poppler/XRef.h    |   2 +-
+ 8 files changed, 55 insertions(+), 22 deletions(-)
+
+commit b0555189a7fbd7f6a899e582783b9e0df44d5d6a
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Sat Nov 20 21:32:24 2010 +0000
+
+    Protect against more loops when parsing
+
+ poppler/Dict.cc   |   4 ++--
+ poppler/Dict.h    |   2 +-
+ poppler/Object.cc |   4 ++--
+ poppler/Object.h  |   8 ++++----
+ poppler/Parser.cc |   2 +-
+ poppler/XRef.cc   |   4 ++--
+ poppler/XRef.h    |   2 +-
+ 7 files changed, 13 insertions(+), 13 deletions(-)
+
+commit 555fa897b275ca7195f22a727b049c8c4f2d74cd
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Sat Nov 20 19:14:38 2010 +0000
+
+    Detect loops in FormField creation
+
+ poppler/Form.cc |   88
+ +++++++++++++++++++++++++++++++------------------------
+ poppler/Form.h  |   14 +++++----
+ 2 files changed, 58 insertions(+), 44 deletions(-)
+
+commit 1802ddef374cb1451975480b2427e5d23ee2c737
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Sat Nov 20 18:58:17 2010 +0000
+
+    Forgot to port this away from GooVector :-S
+
+ poppler/CurlCachedFile.cc |   3 +--
+ poppler/CurlCachedFile.h  |   2 +-
+ 2 files changed, 2 insertions(+), 3 deletions(-)
+
+commit 32e53c5436b8c3654e7043f1d86596a79511a4cf
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Sat Nov 20 18:54:59 2010 +0000
+
+    fix spacing
+
+ poppler/Form.cc |    8 ++++----
+ 1 file changed, 4 insertions(+), 4 deletions(-)
+
+commit 1cb3d5d94a1d89ccded96d977bcabfbe438fb81f
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Sat Nov 20 18:08:45 2010 +0000
+
+    fix the memset
+
+    Fixes crash in broken pdf
+
+ poppler/Hints.cc |    2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 22e8cebaa15adb4b19c9556cdca43cc3e77832b7
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Sat Nov 20 17:20:34 2010 +0000
+
+    Ensure the obj are num before reading them
+
+ poppler/GfxState.cc |  32 ++++++++++++++++++++++----------
+ 1 file changed, 22 insertions(+), 10 deletions(-)
+
+commit 08b2db36db4e011ebe36d2d945cb1a0498f1c5fb
+Author: Pino Toscano <pino@kde.org>
+Date:  Sat Nov 20 14:00:36 2010 +0100
+
+    add my copyright here
+
+ poppler/Hints.cc |    1 +
+ 1 file changed, 1 insertion(+)
+
+commit 91aa4b02aa93ffe3828479194067de42d52be465
+Author: Pino Toscano <pino@kde.org>
+Date:  Sat Nov 20 13:13:46 2010 +0100
+
+    [cpp] include <ios> for std::hex() and std::left()
+
+ cpp/poppler-global.cpp     |   1 +
+ cpp/tests/poppler-dump.cpp |   1 +
+ 2 files changed, 2 insertions(+)
+
+commit 1c924412923cb01f2cb95b0943cb7bbaf7e8cfb6
+Author: Pino Toscano <pino@kde.org>
+Date:  Sat Nov 20 13:02:36 2010 +0100
+
+    [cpp] include <iterator> for std::back_inserter()
+
+ cpp/poppler-document.cpp |    1 +
+ 1 file changed, 1 insertion(+)
+
+commit 95b551025a34f3a7bcff2852eac6d186bc8a7cb0
+Author: Pino Toscano <pino@kde.org>
+Date:  Sat Nov 20 12:54:21 2010 +0100
+
+    use a std::vector<char> instead of a var-length-array of char's
+
+ poppler/Hints.cc |    6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
+
+commit 4faaff893515c80cb69b02e431a0f8483274a497
+Author: Hib Eris <hib@hiberis.nl>
+Date:  Fri Nov 19 23:53:35 2010 +0000
+
+    [win32] Simplify strtok_r implementation
+
+    The previous implementation did not compile with mingw64.
+
+ poppler/strtok_r.cpp |  137
+ +-------------------------------------------------
+ 1 file changed, 1 insertion(+), 136 deletions(-)
+
+commit 255f84927a649d980f047fe755c9c308535a3779
+Author: Hib Eris <hib@hiberis.nl>
+Date:  Fri Nov 19 23:45:33 2010 +0000
+
+    Correct parsing of linearization table
+
+    Fixes bug #31627
+
+ poppler/Linearization.cc |    4 +---
+ 1 file changed, 1 insertion(+), 3 deletions(-)
+
+commit 9d05138f0b7d15945f546564036bc67815593db0
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Sun Nov 14 16:05:28 2010 +0000
+
+    0.15.2
+
+ CMakeLists.txt      |   4 ++--
+ NEWS               |   22 ++++++++++++++++++++++
+ configure.ac       |    2 +-
+ cpp/Doxyfile       |    2 +-
+ poppler/Makefile.am |   2 +-
+ qt4/src/Doxyfile    |   2 +-
+ 6 files changed, 28 insertions(+), 6 deletions(-)
+
+commit 2d18543bd6b3a5a9ff2dfab63339d5bfcccd0b2f
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Sun Nov 14 15:41:56 2010 +0000
+
+    This does actually work now :D
+
+ qt4/tests/check_metadata.cpp |    1 -
+ 1 file changed, 1 deletion(-)
+
+commit d772364b8a5858cbd98e256547d319260fa9d084
+Author: Pino Toscano <pino@kde.org>
+Date:  Thu Nov 11 21:52:25 2010 +0100
+
+    [Qt4] New function setDebugErrorFunction().
+
+    This new function + typedef can be useful to direct the ebug/error
+    messages
+    to a different place than the default qDebug()'s one.
+
+    Base on an idea of Albert, added closure and polish by me.
+
+ qt4/src/poppler-private.cc |  20 +++++++++++++++++++-
+ qt4/src/poppler-qt4.h     |   24 ++++++++++++++++++++++++
+ 2 files changed, 43 insertions(+), 1 deletion(-)
+
+commit ce929cf33f4b6b6421f9d327b4bb792816d47aac
+Author: Jakob Voss <jakob.voss@gbv.de>
+Date:  Wed Nov 10 23:41:44 2010 +0000
+
+    Add -p flag to pdfimages
+
+    Adds the page the image is in to the image filename
+
+ utils/ImageOutputDev.cc |   25 ++++++++++++++++++-------
+ utils/ImageOutputDev.h  |   19 +++++++++++++++----
+ utils/pdfimages.1      |    3 +++
+ utils/pdfimages.cc     |    6 +++++-
+ 4 files changed, 41 insertions(+), 12 deletions(-)
+
+commit 6296c28968613aadb7ea084092945a54005eca9b
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Wed Nov 10 23:28:45 2010 +0000
+
+    Kill GooVector
+
+    std::vector does the same and GooVector is not part of xpdf so
+    we don't
+    need to maintain it in case we ever get a new xpdf release we want to
+    merge with
+
+ CMakeLists.txt                    |    1 -
+ goo/GooVector.h           |  159
+ --------------------------------------------
+ goo/Makefile.am           |    1 -
+ poppler/CachedFile.cc     |   19 +++---
+ poppler/CachedFile.h      |   15 +++--
+ poppler/Catalog.cc        |   12 ++--
+ poppler/Catalog.h         |   10 +--
+ poppler/Form.h                    |    3 +-
+ poppler/Gfx.h             |    7 +-
+ poppler/Hints.cc          |    5 +-
+ poppler/Hints.h           |    6 +-
+ poppler/StdinCachedFile.cc |   2 +-
+ poppler/StdinCachedFile.h  |   2 +-
+ poppler/Stream.h          |    1 -
+ poppler/XRef.cc           |   10 +--
+ poppler/XRef.h                    |    7 +-
+ utils/HtmlFonts.cc        |    8 +--
+ utils/HtmlFonts.h         |   12 ++--
+ utils/HtmlLinks.cc        |    8 +--
+ utils/HtmlLinks.h         |    4 +-
+ 20 files changed, 66 insertions(+), 226 deletions(-)
+
+commit 5934c320aa136c1a6e97fb9bf54bdfdccfcab521
+Author: Hib Eris <hib@hiberis.nl>
+Date:  Wed Nov 10 22:50:36 2010 +0000
+
+    Linearization improvements
+
+    Read
+    http://lists.freedesktop.org/archives/poppler/2010-November/006642.html
+    for the detailed patch description
+
+ CMakeLists.txt                         |    4 +
+ glib/poppler-action.cc                 |    4 +-
+ glib/poppler-document.cc       |   17 +-
+ glib/poppler-page.cc           |    1 +
+ poppler/CachedFile.h           |    2 +-
+ poppler/Catalog.cc             |  352 ++++++++++++++++++++-----------
+ poppler/Catalog.h              |   14 +-
+ poppler/FontInfo.cc            |    5 +-
+ poppler/Hints.cc               |  439
+ +++++++++++++++++++++++++++++++++++++++
+ poppler/Hints.h                |   95 +++++++++
+ poppler/Linearization.cc       |  224 ++++++++++++++++++++
+ poppler/Linearization.h        |   45 ++++
+ poppler/Makefile.am            |    4 +
+ poppler/PDFDoc.cc              |  284 +++++++++++++++++++++----
+ poppler/PDFDoc.h               |   38 +++-
+ poppler/PSOutputDev.cc                 |   39 ++--
+ poppler/PSOutputDev.h          |   14 +-
+ poppler/Stream.cc              |   13 +-
+ poppler/Stream.h               |   11 +-
+ poppler/XRef.cc                |  351 ++++++++++++++++++-------------
+ poppler/XRef.h                         |   25 ++-
+ qt/poppler-document.cc                 |   14 +-
+ qt/poppler-page.cc             |   19 +-
+ qt/poppler-private.h           |   14 +-
+ qt/poppler-qt.h                |    3 +-
+ qt4/src/poppler-document.cc    |   12 +-
+ qt4/src/poppler-link.cc        |    7 +-
+ qt4/src/poppler-page.cc        |    3 +-
+ qt4/src/poppler-ps-converter.cc |    2 +
+ utils/HtmlOutputDev.cc                 |    2 +-
+ utils/HtmlOutputDev.h          |    3 +
+ utils/pdffonts.cc              |    6 +-
+ utils/pdfinfo.cc               |   22 +-
+ utils/pdftohtml.cc             |    2 +-
+ utils/pdftops.cc               |    3 +-
+ 35 files changed, 1690 insertions(+), 403 deletions(-)
+
+commit abb1313ae40ab7efb073406f47fa53bf7afe0b88
+Author: Pino Toscano <pino@kde.org>
+Date:  Mon Nov 8 01:54:03 2010 +0100
+
+    [cpp/apidox] add the minimum version of 'image'
+
+ cpp/poppler-image.cpp |    2 ++
+ 1 file changed, 2 insertions(+)
+
+commit f559e77cb7d76c5fe6a79be9086667a29613c912
+Author: Pino Toscano <pino@kde.org>
+Date:  Mon Nov 8 01:52:48 2010 +0100
+
+    [cpp] add image::bytes_per_row()
+
+ cpp/poppler-image.cpp |    8 ++++++++
+ cpp/poppler-image.h   |    1 +
+ 2 files changed, 9 insertions(+)
+
+commit 14dea4d74698d5d7d994e687f8176652d790dba7
+Author: Pino Toscano <pino@kde.org>
+Date:  Sun Nov 7 22:57:31 2010 +0100
+
+    [arthur] use the untransformed line width, not the transformed one
+
+    ... as the painter will do the transformation itself already;
+    seems to product better results
+
+ poppler/ArthurOutputDev.cc |   2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit f077e82af0724be88d28c896a3c208f1d50ccff9
+Author: Pino Toscano <pino@kde.org>
+Date:  Sun Nov 7 21:50:48 2010 +0100
+
+    [qt4] New Page::renderToPainter()
+
+    This new painter-based painting function ican be used for painting
+    (with Arthur only for now) without getting an image first.
+    Also add a new flag type for it, with a single item telling whether
+    do not save+restore the provided painter.
+
+    Mostly based on a patch by Matthias Fauconneau
+    (matthias.fauconneau@gmail.com), thanks!
+
+ qt4/src/poppler-page.cc |   62
+ ++++++++++++++++++++++++++++++--------------
+ qt4/src/poppler-qt4.h  |   65
+ ++++++++++++++++++++++++++++++++++++++++++++++-
+ 2 files changed, 107 insertions(+), 20 deletions(-)
+
+commit df02d1fc9e65422121e5e8f493c13229552ec0e7
+Author: Pino Toscano <pino@kde.org>
+Date:  Sun Nov 7 19:47:56 2010 +0100
+
+    [arthur] remove unused 'm_image' attribute
+
+ poppler/ArthurOutputDev.cc |   1 -
+ poppler/ArthurOutputDev.h  |   2 +-
+ 2 files changed, 1 insertion(+), 2 deletions(-)
+
+commit b29582cd0d542a3e70dbca3fb75770daa4cc91ca
+Author: Matthias Fauconneau <matthias.fauconneau@gmail.com>
+Date:  Sun Nov 7 19:44:11 2010 +0100
+
+    [arthur] small fixes and memory leaks
+
+    - fix font rendering (transforming the glyph path and not only the
+    glyph origin)
+    - fix image rendering (alpha was set to zero)
+
+ poppler/ArthurOutputDev.cc |  122
+ ++++++++++++++++++++------------------------
+ 1 file changed, 54 insertions(+), 68 deletions(-)
+
+commit 970f075569bf9be5e5ddc3a9ad1fabec5435dfaf
+Author: Pino Toscano <pino@kde.org>
+Date:  Sun Nov 7 16:31:02 2010 +0100
+
+    [cpp/tests] add a simple poppler-render test
+
+    ... to ease testing the render capabilities of poppler-cpp.
+    quite minimal at the moment.
+
+ cpp/tests/CMakeLists.txt     |    3 ++
+ cpp/tests/Makefile.am       |    9 +++-
+ cpp/tests/poppler-render.cpp |  113
+ ++++++++++++++++++++++++++++++++++++++++++
+ 3 files changed, 124 insertions(+), 1 deletion(-)
+
+commit bfe4139c742cb0a669f5504df7e22e3e57243d9a
+Author: Pino Toscano <pino@kde.org>
+Date:  Sun Nov 7 16:23:26 2010 +0100
+
+    [cpp] Add page_renderer, to render pages over images.
+
+    This new class introduces a very simple way to render a page, using
+    the Splash backend,
+    giving an 'image' as result.
+    It can hold a color for the "paper" of the pages, and some hints
+    for the actual rendering.
+
+ cpp/CMakeLists.txt           |    2 +
+ cpp/Makefile.am              |    2 +
+ cpp/poppler-page-renderer.cpp |  212
+ +++++++++++++++++++++++++++++++++++++++++
+ cpp/poppler-page-renderer.h   |   66 +++++++++++++
+ 4 files changed, 282 insertions(+)
+
+commit 91e3f7b4ea42a5821fd78e1edf55e95250c9bc68
+Author: Pino Toscano <pino@kde.org>
+Date:  Sun Nov 7 16:19:34 2010 +0100
+
+    [cpp] add an internal way to get a 'page_private' of a 'page'
+
+    useful for getting a 'page_private' in the implementation of other
+    cpp classes
+    without the need to add friends to 'page'
+
+ cpp/poppler-page-private.h |   5 +++++
+ 1 file changed, 5 insertions(+)
+
+commit fa7c41cb9c52ecd3d7c574455b1258a3021b8c75
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Thu Nov 4 20:55:34 2010 +0000
+
+    Improvements to the splash backend
+
+    Antialias and shadings.
+    Code by Thomas Freitag <Thomas.Freitag@alfa.de> and Christian
+    Feuersänger <cfeuersaenger@googlemail.com>
+    More info at bug 30436
+
+ poppler/CairoOutputDev.h   |   5 +-
+ poppler/Function.cc       |    4 +-
+ poppler/Function.h        |    2 +
+ poppler/Gfx.cc                    |   12 +-
+ poppler/OutputDev.h       |   16 +-
+ poppler/PSOutputDev.h     |    4 +-
+ poppler/SplashOutputDev.cc |  182 +++++++++++++++++++-
+ poppler/SplashOutputDev.h  |  68 +++++++-
+ splash/Splash.cc          |  395
+ +++++++++++++++++++++++++++++++++++++++++++-
+ splash/Splash.h           |   11 +-
+ splash/SplashBitmap.cc     |   4 +-
+ splash/SplashBitmap.h     |    3 +
+ splash/SplashPattern.cc    |  17 +-
+ splash/SplashPattern.h     |  36 +++-
+ 14 files changed, 735 insertions(+), 24 deletions(-)
+
+commit 0aa040163741ab8ba093a742e556bba2a5ab7edf
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Wed Nov 3 20:40:24 2010 +0000
+
+    Do not add sibling children as parents
+
+    Fixes c2ff94b1600b8a5841a5e4627f014560ac460f1a
+
+ poppler/Function.cc |   7 ++++---
+ 1 file changed, 4 insertions(+), 3 deletions(-)
+
+commit c2ff94b1600b8a5841a5e4627f014560ac460f1a
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Wed Nov 3 00:02:02 2010 +0000
+
+    Do not loop forever in broken documents
+
+    StitchingFunctions that have themselves up in the parent chain
+    are wrong
+
+ poppler/Function.cc |  22 +++++++++++++++++++---
+ poppler/Function.h  |   6 ++++--
+ 2 files changed, 23 insertions(+), 5 deletions(-)
+
+commit cad66a7d25abdb6aa15f3aa94a35737b119b2659
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Tue Nov 2 19:14:34 2010 +0000
+
+    Fix crash in broken documents
+
+    mapLen = (code + 256) & ~255; can wrap and you end up with mapLen
+    < code
+    that is not what you wanted
+
+ poppler/CharCodeToUnicode.cc |   16 +++++++++++-----
+ 1 file changed, 11 insertions(+), 5 deletions(-)
+
+commit 7e5f31c1c41193c6e49355970e6d027b91d45825
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Tue Nov 2 00:32:01 2010 +0000
+
+    make some more fields private
+
+ splash/SplashFontFile.h |    5 +++--
+ 1 file changed, 3 insertions(+), 2 deletions(-)
+
+commit 6751eb48dc49890f7ad8b732b3fc29a2db746ec4
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Tue Nov 2 00:26:08 2010 +0000
+
+    Make the destructor private
+
+    You are not supposed to call it, you should call unref
+
+ splash/SplashFontFile.h |    5 +++--
+ 1 file changed, 3 insertions(+), 2 deletions(-)
+
+commit b718e821d5f21ea5b0c44c6c2b59769c9b94892a
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Thu Oct 28 08:46:09 2010 +0100
+
+    Revert fdfffc9c68314d3f64dee7e0ef8617105e3198dd
+
+    It is not a leak and makes things crash :D
+
+ poppler/SplashOutputDev.cc |   1 -
+ 1 file changed, 1 deletion(-)
+
+commit 15b9aeac5a20c544db1aebe00113ebc2f7ba52c7
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Thu Oct 28 00:37:29 2010 +0100
+
+    if reallocn fails, free p
+
+ goo/gmem.cc |   8 ++++++--
+ 1 file changed, 6 insertions(+), 2 deletions(-)
+
+commit 561c0567a5741d7c49903c51c8020187dccaa0d9
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Wed Oct 27 22:43:51 2010 +0100
+
+    fix comment
+
+ poppler/SplashOutputDev.cc |   4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 4ef38cc99a879202e717447a422272cf85eeccfc
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Wed Oct 27 22:36:07 2010 +0100
+
+    Fix memory leaks that can happen with broken documents
+
+ poppler/SplashOutputDev.cc |  10 ++++++++++
+ 1 file changed, 10 insertions(+)
+
+commit fdfffc9c68314d3f64dee7e0ef8617105e3198dd
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Wed Oct 27 20:40:19 2010 +0100
+
+    Fix memory leak
+
+ poppler/SplashOutputDev.cc |   1 +
+ 1 file changed, 1 insertion(+)
+
+commit 90d479d9d5c947175e60ab689f440ae9c24f0b2b
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Wed Oct 27 20:39:48 2010 +0100
+
+    Do not crash if bitmap->alpha == NULL
+
+    Happens in broken files
+
+ splash/Splash.cc |    6 ++++++
+ 1 file changed, 6 insertions(+)
+
+commit 6ad36277971ec46d4a4ef0c45625e60f8c5f1247
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Mon Oct 25 18:59:49 2010 +0100
+
+    Initialze movie to NULL on broken pdf files
+
+ poppler/Annot.cc |    1 +
+ 1 file changed, 1 insertion(+)
+
+commit 2d0b6e2956a81164bca6adc9aacad0e620480957
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Sun Oct 24 00:23:21 2010 +0100
+
+    Here the chars to read is the increment size not the initialSize
+
+    Fixes crash in file provided by Robert Święcki
+
+ poppler/Stream.h |    2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit dcb02d2100136b6035485be3be214ce3d9f1c102
+Author: Vincent Torri <vtorri@univ-evry.fr>
+Date:  Sat Oct 23 23:45:05 2010 +0100
+
+    remove -ansi flag for cywin and mingw
+
+ configure.ac |    8 +++++++-
+ 1 file changed, 7 insertions(+), 1 deletion(-)
+
+commit 17cdc81224c72f7b58de61734c9ead337ff7b42b
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Sat Oct 23 23:37:59 2010 +0100
+
+    update my C year
+
+ poppler/SplashOutputDev.cc |   2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit e09ddce7e21bbd62b384d9d59fbd1e0f14f7d05f
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Sat Oct 23 23:33:00 2010 +0100
+
+    Fix crash in malformed documents
+
+ poppler/SplashOutputDev.cc |   5 +++++
+ 1 file changed, 5 insertions(+)
+
+commit 906e4e15421d8f3f0a825ca767e5eac3169853d6
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Sat Oct 23 23:12:44 2010 +0100
+
+    Do not leak attrs1
+
+ poppler/Catalog.cc |   1 +
+ 1 file changed, 1 insertion(+)
+
+commit ec32bb45a57a8a839156c946fcde1270aa6019d9
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Sat Oct 23 23:00:03 2010 +0100
+
+    Do not crash if n is 0
+
+ poppler/Function.cc |   3 +++
+ 1 file changed, 3 insertions(+)
+
+commit 9edf7e4fefb37989af9a2558aaa83d7cd4694ec6
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Sat Oct 23 22:59:50 2010 +0100
+
+    add unlikely marker
+
+ poppler/Decrypt.cc |   2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit c46e863b7b94dc2f83a7d89f4afb8fe3bc8ec35c
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Sat Oct 23 22:55:49 2010 +0100
+
+    Do not divide by 0 in rc4InitKey
+
+ poppler/Decrypt.cc |   4 ++++
+ 1 file changed, 4 insertions(+)
+
+commit bcb13ed5828e2a855efd5e38b2acd15ca37a9991
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Sat Oct 23 22:40:17 2010 +0100
+
+    Check obj2 is a num before reading it
+
+ poppler/Gfx.cc |    8 +++++++-
+ 1 file changed, 7 insertions(+), 1 deletion(-)
+
+commit c64a49307782299cb7a950a66419f9d59707f38b
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Wed Oct 20 22:29:29 2010 +0100
+
+    0.15.1
+
+ CMakeLists.txt      |   4 ++--
+ NEWS               |   46 ++++++++++++++++++++++++++++++++++++++++++++++
+ configure.ac       |    2 +-
+ cpp/Doxyfile       |    2 +-
+ poppler/Makefile.am |   2 +-
+ qt4/src/Doxyfile    |   2 +-
+ 6 files changed, 52 insertions(+), 6 deletions(-)
+
+commit 3b45c66de91243d7419657512cf726c9e1c26dfb
+Author: Kenneth Berland <ken@hero.com>
+Date:  Sun Oct 17 14:24:16 2010 +0100
+
+    Add -bbox option to pdftotext
+
+ utils/pdftotext.1  |   4 ++
+ utils/pdftotext.cc |  125
+ +++++++++++++++++++++++++++++++++++++++++-----------
+ 2 files changed, 103 insertions(+), 26 deletions(-)
+
+commit 71ec4c7a6715a40d536d1e4b911dae48d1bba7b9
+Author: Pino Toscano <pino@kde.org>
+Date:  Sun Oct 17 14:57:43 2010 +0200
+
+    [CMake] update MacroOptionalFindPackage.cmake from KDE SVN
+
+    no radical changes, just a minor improvement for the "explicitly
+    disabled" case
+
+ cmake/modules/MacroOptionalFindPackage.cmake |   40
+ +++++++++++++++++++-------
+ 1 file changed, 30 insertions(+), 10 deletions(-)
+
+commit ab0049d8be5dfe1989c4aa33c2732915c62fecb2
+Author: Pino Toscano <pino@kde.org>
+Date:  Sun Oct 17 14:29:22 2010 +0200
+
+    [CMake] Cairo package: make the version check really working
+
+ cmake/modules/FindCairo.cmake |    8 ++++----
+ 1 file changed, 4 insertions(+), 4 deletions(-)
+
+commit 1cea33717c92631ee9c417d9f89e32b03695c75a
+Author: Pino Toscano <pino@kde.org>
+Date:  Sun Oct 17 13:55:58 2010 +0200
+
+    [CMake] Bump cairo dependency to 1.10
+
+    followup of fc9b85894754d175af916eaf6cb127efd601df7e
+
+ CMakeLists.txt |    2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit d6f49aa2da15cd2e9cf775d6b1d2d04a005c8cdd
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Sun Oct 17 14:22:57 2010 +0200
+
+    [cairo] Fix a crash when redering documents with invalid type 3 fonts
+
+ poppler/CairoFontEngine.cc |   2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit e2fad550c3cbf86541730582151e1bb6470ed9c1
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Sun Oct 17 13:47:33 2010 +0200
+
+    [glib-demo] Use poppler_page_get_selected_region() in selections demo
+
+ glib/demo/selections.c |   73
+ +++++++++++++++---------------------------------
+ 1 file changed, 22 insertions(+), 51 deletions(-)
+
+commit 88013458e141de58ed801480707ae0dfe92b9aa2
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Sun Oct 17 13:46:26 2010 +0200
+
+    [glib] Add poppler_page_get_selected_region()
+
+    that returns a cairo_region_t, and deprecate
+    poppler_page_get_selection_region().
+
+ glib/poppler-page.cc               |   81
+ +++++++++++++++++++++++++++++++++++
+ glib/poppler-page.h                |    4 ++
+ glib/reference/poppler-sections.txt |   1 +
+ 3 files changed, 86 insertions(+)
+
+commit fc9b85894754d175af916eaf6cb127efd601df7e
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Sun Oct 17 12:54:18 2010 +0200
+
+    [configure] Bump cairo dependency to 1.10
+
+ configure.ac             |    2 +-
+ poppler/CairoOutputDev.cc |   4 ----
+ 2 files changed, 1 insertion(+), 5 deletions(-)
+
+commit dd14ef6b211ac1c8a4f16bb6094dbfd6a09cbef9
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Sun Oct 17 12:46:55 2010 +0100
+
+    Improve dict lookup speed for big dicts
+
+    Based on a patch by Paweł Wiejacha <pawel.wiejacha@gmail.com>
+
+ poppler/Dict.cc |   98
+ +++++++++++++++++++++++++++++++++++++++++++------------
+ poppler/Dict.h  |    2 ++
+ 2 files changed, 80 insertions(+), 20 deletions(-)
+
+commit bb38a0c71434413f2728109c73278de1b8a58571
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Sun Oct 17 12:52:01 2010 +0200
+
+    [glib-demo] Make glib demo program installable
+
+    It's a useful tool for testing and debugging not only for people who
+    install from sources.
+
+ glib/demo/Makefile.am |    2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit d26d0fab2ddfff853f6681a3518813a2d65a4112
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Sun Oct 17 12:36:46 2010 +0200
+
+    [glib-demo] Use printing options in print demo
+
+ glib/demo/print.c |   96
+ +++++++++++++++++++++++++++++++++++++++++++++++++++--
+ 1 file changed, 93 insertions(+), 3 deletions(-)
+
+commit 4a71dcdd350d0c0515ca349f0b875b33289d25ee
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Sun Oct 17 12:31:41 2010 +0200
+
+    [glib] Add poppler_page_render_for_printing_with_options()
+
+    It allows to print with the same options acroread has:
+
+     - Print document
+     - Print document and markup
+     - Print document and stamps
+
+ glib/poppler-page.cc               |   77
+ +++++++++++++++++++++++++++++++----
+ glib/poppler-page.h                |    3 ++
+ glib/poppler.h                             |   19 +++++++++
+ glib/reference/poppler-sections.txt |   4 ++
+ 4 files changed, 94 insertions(+), 9 deletions(-)
+
+commit 0b3b2ebc3930bd46fb13fb2158fc695b0962f7c5
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Sat Oct 16 15:09:05 2010 +0100
+
+    Add a callback to know which page has been printed
+
+ qt4/src/poppler-ps-converter.cc |   16 ++++++++++++++--
+ qt4/src/poppler-qt4.h          |   10 ++++++++++
+ 2 files changed, 24 insertions(+), 2 deletions(-)
+
+commit 4bd25223c4d15dfa91965a6e86eaa444a5a81f71
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Sat Oct 16 15:08:05 2010 +0100
+
+    Do not omit this character
+
+    Mimics Cairo backend and Adode Reader behaviour
+
+ splash/SplashFTFont.cc |    4 ----
+ 1 file changed, 4 deletions(-)
+
+commit b604a008a2a379a21e5fdfa0799886f80d893a08
+Author: Christian Feuersänger <cfeuersaenger@googlemail.com>
+Date:  Thu Oct 14 23:56:36 2010 +0100
+
+    Improve rendering of Shading Type 6 and 7
+
+ poppler/Gfx.cc      | 214
+ ++++++++++++++++++++++++++++++++++++++++-----------
+ poppler/Gfx.h      |    9 ++-
+ poppler/GfxState.cc |  96 ++++++++++++++++++++++-
+ poppler/GfxState.h  | 127 +++++++++++++++++++++++++++++-
+ 4 files changed, 398 insertions(+), 48 deletions(-)
+
+commit c6bb63b31c268e4e842532e6839b15edb31cf25c
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Thu Oct 14 23:33:13 2010 +0100
+
+    Only clip boxes to mediabox if we are at the page level
+
+    Fixes bug 30784
+
+ poppler/Page.cc |   19 +++++++++++--------
+ 1 file changed, 11 insertions(+), 8 deletions(-)
+
+commit 4a248b3f523209ec16ace587229412653b2276d0
+Author: Pino Toscano <pino@kde.org>
+Date:  Thu Oct 14 18:32:05 2010 +0200
+
+    [cpp] make it compile also when there are no image formats available
+
+    including the ImgWirter.h is enough to get the definition of ImgWriter
+
+ cpp/poppler-image.cpp |    1 +
+ 1 file changed, 1 insertion(+)
+
+commit de1501d87549269f9214c9e3fba4cbf39960826e
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Wed Oct 13 19:18:36 2010 +0100
+
+    remove windows eol
+
+ poppler/Gfx.cc |   38 +++++++++++++++++++-------------------
+ 1 file changed, 19 insertions(+), 19 deletions(-)
+
+commit 12e68b49feef10b654944dd71eab0852cfeceb89
+Author: Pino Toscano <pino@kde.org>
+Date:  Sun Oct 10 23:04:57 2010 +0200
+
+    [cpp] Add a new 'image' class.
+
+    This implicitely shared class represents the data buffer of an
+    "image",
+    with direct access to the data.
+    It also has a function to save to file (png/jpeg).
+
+    Still a FIXME in the copy() method and in the save() (for mono
+    images only).
+
+ cpp/CMakeLists.txt         |    2 +
+ cpp/Makefile.am            |    3 +
+ cpp/poppler-image-private.h |  48 +++++
+ cpp/poppler-image.cpp      |  431
+ +++++++++++++++++++++++++++++++++++++++++++
+ cpp/poppler-image.h        |   70 +++++++
+ 5 files changed, 554 insertions(+)
+
+commit db31687ba476e272b72625a8a78b50780522ee7d
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Sat Oct 9 10:33:06 2010 +0200
+
+    [glib] docs: Document poppler_annot_markup_get_date()
+
+ glib/poppler-annot.cc |    9 +++++++++
+ 1 file changed, 9 insertions(+)
+
+commit a7cf8d322a4a687c9810a577cc92ff6b9725ecdc
+Author: Fernando Herrera <fherrera@onirica.com>
+Date:  Thu Oct 7 17:28:31 2010 +0200
+
+    [glib] Fix introspection annotations for poppler_document_get_page*()
+
+    Return value should be transfer full since the caller owns the only
+    reference.
+
+ glib/poppler-document.cc |    6 ++----
+ 1 file changed, 2 insertions(+), 4 deletions(-)
+
+commit d690bea929553d1a4392d42d949843e9467ba8cb
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Tue Oct 5 22:18:22 2010 +0100
+
+    Make sure obj is a num before reading it
+
+    Not sure if using a 0 is correct otherwise, but if your matrix is
+    broken you're probably going to get a wrong rendering anyway, so who
+    cares. Bug #30590
+
+ poppler/Gfx.cc |    6 ++++--
+ 1 file changed, 4 insertions(+), 2 deletions(-)
+
+commit b17be2bc32cf71bac0473bf4ac16359e3027b4fc
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Sun Oct 3 12:14:11 2010 +0200
+
+    [annots] Fix a crash when drawing square/circle annots without
+    a border
+
+    Fixes bug #30580
+
+ poppler/Annot.cc |  121
+ +++++++++++++++++++++++++++---------------------------
+ 1 file changed, 61 insertions(+), 60 deletions(-)
+
+commit e3d3944c1988343704e3ba3a5d60609719466afb
+Author: Tomas Hoger <thoger@redhat.com>
+Date:  Wed Sep 29 20:03:45 2010 +0100
+
+    Fix uninitialized uses on DCTScanInfo
+
+ poppler/Stream.cc |   3 +++
+ 1 file changed, 3 insertions(+)
+
+commit f380647f09d88339c936184bbe86c70c0d47de4b
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Wed Sep 29 20:02:10 2010 +0100
+
+    Free names
+
+ poppler/Catalog.cc |   1 +
+ 1 file changed, 1 insertion(+)
+
+commit aa0fd32a8501473832bce1b8b804dd3f9a45735b
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Mon Sep 27 22:39:09 2010 +0100
+
+    Consider render value when colorizing text
+
+    Fixes bug 2807
+
+ poppler/CairoOutputDev.cc  |  18 +++---------------
+ poppler/CairoOutputDev.h   |   2 --
+ poppler/Gfx.cc                    |   21 +++++++++++++++++----
+ poppler/PSOutputDev.cc     |  26 ++++++++++----------------
+ poppler/PSOutputDev.h     |    3 +--
+ poppler/SplashOutputDev.cc |  18 +++---------------
+ poppler/SplashOutputDev.h  |   4 +---
+ 7 files changed, 35 insertions(+), 57 deletions(-)
+
+commit cf710b999b510203e9348ea9f04360be1fe957b8
+Author: Pino Toscano <pino@kde.org>
+Date:  Fri Sep 24 00:50:37 2010 +0200
+
+    [Qt4] enable the generation of the QCH file
+
+    ... usable in Qt Assistant
+
+ qt4/src/Doxyfile |   14 +++++++-------
+ 1 file changed, 7 insertions(+), 7 deletions(-)
+
+commit be6d933071c9ab043f01f374a884472c4ce3007e
+Author: Pino Toscano <pino@kde.org>
+Date:  Thu Sep 23 15:55:45 2010 +0200
+
+    update Doxyfile's for qt4 and cpp
+
+    no changes in the actual configuration values
+
+ cpp/Doxyfile    |  155 ++++--
+ qt4/src/Doxyfile | 1469
+ +++++++++++++++++++++++++++++++++---------------------
+ 2 files changed, 1018 insertions(+), 606 deletions(-)
+
+commit 721da3d542ab9b234b058f3c14ea9303d748107e
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Thu Sep 23 14:09:11 2010 +0200
+
+    [glib] Use g_memdup instead of g_strdup in poppler_document_get_id()
+
+    Ids are not null-terminated strings, but fixed size byte arrays.
+
+ glib/demo/info.cc       |    8 ++++++--
+ glib/poppler-document.cc |   33 ++++++++++++++-------------------
+ 2 files changed, 20 insertions(+), 21 deletions(-)
+
+commit 4ffc0ed73397e4e58f04c3577b093a3fd39c22bd
+Author: Pino Toscano <pino@kde.org>
+Date:  Thu Sep 23 02:21:12 2010 +0200
+
+    [cpp] small clarification in document::load_from_data() apidox
+
+ cpp/poppler-document.cpp |    4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 9491dc4a10706109d0f2b4d15f21b9a1db51d8c9
+Author: Pino Toscano <pino@kde.org>
+Date:  Thu Sep 23 02:18:07 2010 +0200
+
+    [cpp] add document::load_from_raw_data()
+
+    ... to be able to load a document from an external data buffer,
+    with no need to copy the data.
+
+    add as well a new document_private constructor to handle the new
+    situation,
+    and make sure to properly use the raw data when unlocking the document
+
+ cpp/poppler-document-private.h |    5 ++++
+ cpp/poppler-document.cpp      |   53
+ ++++++++++++++++++++++++++++++++++++++++
+ cpp/poppler-document.h                |    4 +++
+ 3 files changed, 62 insertions(+)
+
+commit a3c1f2d5ea1de969e9aaaa84ee38866938b4ce0c
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Wed Sep 22 20:14:27 2010 +0100
+
+    fix copyright
+
+ poppler/Form.cc |    1 +
+ poppler/Form.h  |    1 +
+ 2 files changed, 2 insertions(+)
+
+commit 1aad013e353a9e59bdab8a1b4ce93f2ad7aaf4f2
+Author: Pino Toscano <pino@kde.org>
+Date:  Wed Sep 22 17:07:38 2010 +0200
+
+    update copyrights
+
+ cpp/poppler-document.h                 |    2 +-
+ cpp/poppler-page-transition.cpp |    2 +-
+ cpp/poppler-private.cpp        |    2 +-
+ cpp/poppler-rectangle.cpp      |    2 +-
+ 4 files changed, 4 insertions(+), 4 deletions(-)
+
+commit 2d6d66ebe0215df66e33cb5974c58c324fab50b6
+Author: Pino Toscano <pino@kde.org>
+Date:  Wed Sep 22 17:07:13 2010 +0200
+
+    [cpp/tests] poppler-dump: show the PDF IDs, if available
+
+ cpp/tests/poppler-dump.cpp |   6 ++++++
+ 1 file changed, 6 insertions(+)
+
+commit e39fde1b62544b90e73a2fc3609a260991db3a47
+Author: Pino Toscano <pino@kde.org>
+Date:  Wed Sep 22 16:52:08 2010 +0200
+
+    [cpp] add document::get_pdf_id()
+
+    ... to get the IDs of a PDF document, if present.
+
+ cpp/poppler-document.cpp |   29 +++++++++++++++++++++++++++++
+ cpp/poppler-document.h   |    1 +
+ 2 files changed, 30 insertions(+)
+
+commit 299a1849a148fa0a7b3171c45ec68b9901aa93bb
+Author: Pino Toscano <pino@kde.org>
+Date:  Wed Sep 22 16:36:30 2010 +0200
+
+    [Qt4] add Document::getPdfId()
+
+    ... to get the IDs of a PDF document, if present.
+
+    also, add two test cases for it in the metadata unit test
+
+ qt4/src/poppler-document.cc  |   16 ++++++++++++++
+ qt4/src/poppler-qt4.h       |   14 ++++++++++++
+ qt4/tests/check_metadata.cpp |   50
+ ++++++++++++++++++++++++++++++++++++++++++
+ 3 files changed, 80 insertions(+)
+
+commit dd9bcdb720ac1bf8a022635bcbb3b56e4b75bb15
+Author: Pino Toscano <pino@kde.org>
+Date:  Wed Sep 22 16:29:46 2010 +0200
+
+    Make the internal get_id() not fail because of null bytes in the ID.
+
+    Passing the const char* of the byte string to convert is not enough
+    if its length must be checked,
+    as it might fail when the string of the ID contains null bytes.
+    Instead, pass the original GooString so its size is properly checked.
+
+    Also, remove an hardcoded 16 and make it dependent on pdfIdLength,
+    as used elsewhere in get_id() function.
+
+ poppler/PDFDoc.cc |   11 ++++++-----
+ 1 file changed, 6 insertions(+), 5 deletions(-)
+
+commit 9554cbc3cb4fc0cd7ad2295f5d27a18e030c6aee
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Wed Sep 22 12:54:25 2010 +0200
+
+    [glib-demo] Show form field names in forms demo
+
+ glib/demo/forms.c |   26 ++++++++++++++++++++------
+ 1 file changed, 20 insertions(+), 6 deletions(-)
+
+commit 257634b26b682628dba5ee5f94cb0bad030bcb4f
+Author: Mark Riedesel <mark@klowner.com>
+Date:  Wed Sep 22 12:52:49 2010 +0200
+
+    [glib] Add methods to get mapping, partial an fully qualified form
+    field names
+
+    See bug #28780.
+
+ glib/poppler-form-field.cc         |   68
+ +++++++++++++++++++++++++++++++++++
+ glib/poppler-form-field.h          |    3 ++
+ glib/reference/poppler-sections.txt |   3 ++
+ 3 files changed, 74 insertions(+)
+
+commit 6db98abc59c154dcb18d69fc37e44ce804c3ccc9
+Author: Mark Riedesel <mark@klowner.com>
+Date:  Wed Sep 22 12:41:16 2010 +0200
+
+    Add getLabel method to FormWidget
+
+    See bug #28780.
+
+ poppler/Form.cc |   64
+ +++++++++++++++++++++++++++++++++++++++++++++++++++++++
+ poppler/Form.h  |    8 +++++++
+ 2 files changed, 72 insertions(+)
+
+commit bcdca66fd57439735e0b9aa182ab7cfce29e9ed0
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Tue Sep 21 11:49:37 2010 +0200
+
+    [glib] Fix minimum value of creation and modification date properties
+
+    It should be -1 which means there's no date specified
+
+ glib/poppler-document.cc |    4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit d2578bd66129466b2dd114b6407c147598e09d2b
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Tue Sep 21 19:19:27 2010 +0100
+
+    Avoid loops in Form::fieldLookup
+
+    Fixes crash in broken pdf provided by Joel Voss of Leviathan
+    Security Group
+
+ poppler/Dict.h  |    3 +++
+ poppler/Form.cc |   27 ++++++++++++++++++++++++---
+ 2 files changed, 27 insertions(+), 3 deletions(-)
+
+commit 2fe825deac055be82b220d0127169cb3d61387a8
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Tue Sep 21 19:15:25 2010 +0100
+
+    Make sure obj1 is a num before reading it
+
+    Fixes crash in broken pdf provided by Joel Voss of Leviathan
+    Security Group
+
+ poppler/Gfx.cc |   20 ++++++++++++++++----
+ 1 file changed, 16 insertions(+), 4 deletions(-)
+
+commit 473de6f88a055bb03470b4af5fa584be8cb5fda4
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Tue Sep 21 19:11:42 2010 +0100
+
+    Fix memory leak if obj2 is not a dict
+
+    Found thanks to PDF provided by Joel Voss of Leviathan Security Group
+
+ poppler/Form.cc |    5 +++--
+ 1 file changed, 3 insertions(+), 2 deletions(-)
+
+commit 9706e28657ff7ea52aa69d9efb3f91d0cfaee70b
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Tue Sep 21 19:09:37 2010 +0100
+
+    Fix crash when idx is out of range
+
+    Found thanks to PDF provided by Joel Voss of Leviathan Security Group
+
+ poppler/Function.cc |   2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 26a5817ffec9f05ac63db6c5cd5b1f0871d271c7
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Tue Sep 21 19:08:54 2010 +0100
+
+    Fix crash when idx is out of range
+
+    Fixes crash in broken pdf provided by Joel Voss of Leviathan
+    Security Group
+
+ poppler/Function.cc |   6 +++++-
+ 1 file changed, 5 insertions(+), 1 deletion(-)
+
+commit dfdf3602bde47d1be7788a44722c258bfa0c6d6e
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Tue Sep 21 19:07:12 2010 +0100
+
+    Give a value to color.c[i]
+
+    Might not be the better solution but it's better than having a random
+    value there
+
+    Found thanks to PDF provided by Joel Voss of Leviathan Security Group
+
+ poppler/Gfx.cc |    8 ++++++++
+ 1 file changed, 8 insertions(+)
+
+commit 01c85c08305bae16242f5979ab107fa5bb5f5100
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Tue Sep 21 19:04:37 2010 +0100
+
+    Forgot my (C) here
+
+ poppler/Decrypt.cc |   2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit bf2055088a3a2d3bb3d3c37d464954ec1a25771f
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Tue Sep 21 19:03:19 2010 +0100
+
+    Properly initialize stack
+
+    Fixes crash in broken pdf provided by Joel Voss of Leviathan
+    Security Group
+
+ poppler/Function.cc |   1 +
+ 1 file changed, 1 insertion(+)
+
+commit e853106b58d6b4b0467dbd6436c9bb1cfbd372cf
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Tue Sep 21 19:01:36 2010 +0100
+
+    Properly initialize parser
+
+    Fixes crash in broken pdf provided by Joel Voss of Leviathan
+    Security Group
+
+ poppler/Gfx.cc |    2 ++
+ 1 file changed, 2 insertions(+)
+
+commit 3422638b2a39cbdd33a114a7d7debc0a5f688501
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Tue Sep 21 18:58:43 2010 +0100
+
+    Fix crash in broken pdf (parser->getStream() is 0)
+
+    Found thanks to PDF provided by Joel Voss of Leviathan Security Group
+
+ poppler/Gfx.cc |    9 +++++++--
+ 1 file changed, 7 insertions(+), 2 deletions(-)
+
+commit a2dab0238a69240dad08eca2083110b52ce488b7
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Tue Sep 21 18:55:51 2010 +0100
+
+    Initialize properly charactersRead
+
+    It is possible that there are calls to getPos before reset
+    Found thanks to PDF provided by Joel Voss of Leviathan Security Group
+
+ poppler/Decrypt.cc |   2 ++
+ 1 file changed, 2 insertions(+)
+
+commit 39d140bfc0b8239bdd96d6a55842034ae5c05473
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Tue Sep 21 18:54:31 2010 +0100
+
+    Fix crash in broken pdf (code < 0)
+
+    Found thanks to PDF provided by Joel Voss of Leviathan Security Group
+
+ fofi/FoFiType1.cc |   5 +++--
+ 1 file changed, 3 insertions(+), 2 deletions(-)
+
+commit c6a091512745771894b54a71613fd6b5ca1adcb3
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Tue Sep 21 18:50:25 2010 +0100
+
+    Fix memory leak
+
+    Found thanks to PDF provided by Joel Voss of Leviathan Security Group
+
+ poppler/Stream.cc |   1 +
+ 1 file changed, 1 insertion(+)
+
+commit 9b6ddb68b80ef19cd2615900bd24da76374003d9
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Mon Sep 20 19:47:47 2010 +0100
+
+    Fix copyright
+
+ poppler/PDFDoc.cc |   1 +
+ poppler/PDFDoc.h  |   1 +
+ 2 files changed, 2 insertions(+)
+
+commit fa3abc23656204eedd022ee1c73d9e5af758cdac
+Author: Pino Toscano <pino@kde.org>
+Date:  Fri Sep 17 22:20:09 2010 +0200
+
+    [cpp] More bits of API documentation.
+
+ cpp/poppler-global.cpp                 |  124
+ +++++++++++++++++++++++++++++++++++++++
+ cpp/poppler-page-transition.cpp |   32 ++++++++++
+ cpp/poppler-rectangle.cpp      |   19 ++++++
+ 3 files changed, 175 insertions(+)
+
+commit c5f7b5becc9993c05b67a470d5a1e431806b98d6
+Author: Pino Toscano <pino@kde.org>
+Date:  Fri Sep 17 20:26:37 2010 +0200
+
+    update copyrights
+
+ qt4/src/poppler-private.cc  |   2 +-
+ qt4/tests/check_strings.cpp |  18 ++++++++++++++++++
+ 2 files changed, 19 insertions(+), 1 deletion(-)
+
+commit ae517042570327b860c1db6b68f9697d5c104657
+Author: Pino Toscano <pino@kde.org>
+Date:  Fri Sep 17 19:39:10 2010 +0200
+
+    [cpp] improve a bit the Unicode* -> ustring conversion
+
+    (although IMHO not yet solved)
+
+ cpp/poppler-private.cpp |    8 ++++----
+ 1 file changed, 4 insertions(+), 4 deletions(-)
+
+commit f4c6ef88f01f6763943a3e6e006e52dbea0b149c
+Author: Pino Toscano <pino@kde.org>
+Date:  Fri Sep 17 16:07:05 2010 +0200
+
+    [Qt4/tests] check_strings: add a new test case for
+    QStringToUnicodeGooString
+
+    not much test data at the moment though
+
+ qt4/tests/check_strings.cpp |  37 +++++++++++++++++++++++++++++++++++++
+ 1 file changed, 37 insertions(+)
+
+commit ffd227b7669895325d752009d5185973cf86ce5b
+Author: Pino Toscano <pino@kde.org>
+Date:  Fri Sep 17 14:25:57 2010 +0200
+
+    [Qt4] optimize UnicodeParsedString using less memory from QString
+
+    - reserve() the right number of chars in the result string, so there
+    is less possibility to make it gr
+    ow its buffer
+    - do not call unicodeToQString() just to create a 1 character string,
+    but directly append a QChar crea
+    ted with the resulting unicode value (always belonging to the BMP)
+
+    this should reduce of a very little bit the memory usage, while give
+    a sensible speedup of UnicodeParsedString invocations
+
+ qt4/src/poppler-private.cc |   4 +++-
+ 1 file changed, 3 insertions(+), 1 deletion(-)
+
+commit 6180890008f2b1814f092f50b8f75376399905ba
+Author: Pino Toscano <pino@kde.org>
+Date:  Fri Sep 17 13:23:25 2010 +0200
+
+    [Qt4/tests] check_strings: add a test case for UnicodeParsedString
+
+    very simple test data for it, at the moment
+
+ qt4/tests/check_strings.cpp |  48
+ +++++++++++++++++++++++++++++++++++++++++++
+ 1 file changed, 48 insertions(+)
+
+commit c5f78d7d3953d62a746c6f5a90085ea020fe5ec7
+Author: Pino Toscano <pino@kde.org>
+Date:  Fri Sep 17 12:54:32 2010 +0200
+
+    [Qt4/tests] check_string: use a pool of GooString
+
+    this way we can reuse the GooString in a data set even after a test
+    run (eg in benchmarks),
+    making sure they all are properly freed
+
+ qt4/tests/check_strings.cpp |  35 ++++++++++++++++++++++++++++++-----
+ 1 file changed, 30 insertions(+), 5 deletions(-)
+
+commit 0cd5a256bdf7778c0c720941a611ad8ab56fa2e9
+Author: Pino Toscano <pino@kde.org>
+Date:  Fri Sep 17 00:27:53 2010 +0200
+
+    [Qt4/tests] first version of a unit test for strings
+
+    this is used for testing the various string conversions:
+    - unicodeToQString
+    - UnicodeParsedString
+    - QStringToUnicodeGooString
+    - QStringToGooString
+    the 1st and the 4th have basic tests
+
+    given private symbols are used, this unit test is not compiled on
+    windows (at least, it supposed to be so)
+
+ qt4/tests/CMakeLists.txt    |   3 ++
+ qt4/tests/Makefile.am      |    7 ++-
+ qt4/tests/check_strings.cpp | 101
+ +++++++++++++++++++++++++++++++++++++++++++
+ 3 files changed, 110 insertions(+), 1 deletion(-)
+
+commit c6e8b21c9829672e6ca42e6cdc0ca631a06af73f
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Fri Sep 17 13:44:38 2010 +0200
+
+    [glib] docs: Document PopplerDocument properties
+
+ glib/poppler-document.cc |  380
+ +++++++++++++++++++++++++++-------------------
+ 1 file changed, 223 insertions(+), 157 deletions(-)
+
+commit d4a6c17255821925906c17b79b88eebed9edfee1
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Fri Sep 17 13:04:33 2010 +0200
+
+    [glib] Add accessor for all PopplerDocument properties
+
+    PopplerDocument:linearized is now a boolean value rather than string,
+    so this commit breaks the API again.
+
+ glib/demo/info.cc                  |    8 +-
+ glib/poppler-document.cc           |  532
+ ++++++++++++++++++++++++++++-------
+ glib/poppler-document.h            |   74 +++--
+ glib/reference/poppler-sections.txt |  16 ++
+ 4 files changed, 498 insertions(+), 132 deletions(-)
+
+commit a5fec843dbb40fdd2007b926405b96789b21496d
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Fri Sep 17 10:38:14 2010 +0200
+
+    [glib-demo] Show permanent/update ID in document info demo
+
+ glib/demo/info.cc |   9 +++++++++
+ 1 file changed, 9 insertions(+)
+
+commit bfaf8f3cc62f28c6255d42680b9464ab9973737e
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Fri Sep 17 10:37:32 2010 +0200
+
+    [glib] Add poppler_document_get_id() to get the PDF file identifier
+
+ glib/poppler-document.cc           |   52
+ +++++++++++++++++++++++++++++++++++
+ glib/poppler-document.h            |    3 ++
+ glib/reference/poppler-sections.txt |   1 +
+ 3 files changed, 56 insertions(+)
+
+commit b15641677447b2e89853a667fc34bcca1383a97a
+Author: srinivas adicherla <srinivas.adicherla@gmail.com>
+Date:  Fri Sep 17 10:36:22 2010 +0200
+
+    Add a method to get the PDF file identifier
+
+ poppler/PDFDoc.cc |   65
+ +++++++++++++++++++++++++++++++++++++++++++++++++++++
+ poppler/PDFDoc.h  |   3 +++
+ 2 files changed, 68 insertions(+)
+
+commit 3b4a901a4431814590449b6cd5ea418f4d6c1172
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Thu Sep 16 23:23:03 2010 +0100
+
+    Add -s option
+
+    Writes a single html file
+    Since git does not allow multiple authors i'm adding them here
+    OSSD CDAC Mumbai by Leena Chourey (leenac@cdacmumbai.in) and Onkar
+    Potdar (onkar@cdacmumbai.in)
+
+ utils/HtmlFonts.cc    |   11 +++++--
+ utils/HtmlFonts.h     |   18 +++++++++--
+ utils/HtmlOutputDev.cc |   84
+ ++++++++++++++++++++++++++++++------------------
+ utils/pdftohtml.1     |    3 ++
+ utils/pdftohtml.cc    |   15 +++++++--
+ 5 files changed, 93 insertions(+), 38 deletions(-)
+
+commit 2792330f6caeeb42e2996271456b562489215c4c
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Wed Sep 15 22:42:09 2010 +0100
+
+    new soversions
+
+ CMakeLists.txt                |    2 +-
+ cpp/CMakeLists.txt    |    2 +-
+ cpp/Makefile.am       |    2 +-
+ glib/CMakeLists.txt   |    2 +-
+ glib/Makefile.am      |    4 ++--
+ poppler/Makefile.am   |    2 +-
+ qt4/src/CMakeLists.txt |    2 +-
+ qt4/src/Makefile.am   |    2 +-
+ 8 files changed, 9 insertions(+), 9 deletions(-)
+
+commit 1cf56c732b63d0a310bc45b8e4b3f3f357a42cb1
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Wed Sep 15 20:56:42 2010 +0100
+
+    0.15.0 in the versions
+
+ CMakeLists.txt   |    2 +-
+ configure.ac    |    2 +-
+ cpp/Doxyfile    |    2 +-
+ qt4/src/Doxyfile |    2 +-
+ 4 files changed, 4 insertions(+), 4 deletions(-)
+
+commit 4ec0be498b557c3cf631e43823c6d7004304dff3
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Wed Sep 15 20:56:34 2010 +0100
+
+    0.15.0 NEWS
+
+ NEWS |   90
+ ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+ 1 file changed, 90 insertions(+)
+
+commit c01a17745c04aef3e6f2225679c867a03e731e83
+Author: Pino Toscano <pino@kde.org>
+Date:  Thu Sep 16 20:55:56 2010 +0200
+
+    [CMake] disable the GObject introspection system
+
+    it cannot complete the scanning propecure correctly without libtool
+    it seems
+
+ CMakeLists.txt |    4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 9be7d3143b12f291409f88f3d725a239934b205e
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Wed Sep 15 19:19:30 2010 +0100
+
+    update copyright
+
+ poppler/OptionalContent.cc |   2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit b9333529bba43a71655fdbf1919ba515f7df9ca3
+Author: Pino Toscano <pino@kde.org>
+Date:  Wed Sep 15 17:23:54 2010 +0200
+
+    [cpp/tests] poppler-dump: convert out_ustring() to an
+    operator<<(std::ostream&)
+
+    so we have a chance to better output the bytearray of a string to
+    the stream
+
+ cpp/tests/poppler-dump.cpp |  26 ++++++++++++++++++--------
+ 1 file changed, 18 insertions(+), 8 deletions(-)
+
+commit a44f711b4412332875337e9fb7509f18db806ddc
+Author: Pino Toscano <pino@kde.org>
+Date:  Wed Sep 15 16:44:30 2010 +0200
+
+    [cpp/tests] poppler-dump: add a "--show-text <physical|raw>" option
+
+    ... to show the text of a page in the specified layout
+
+ cpp/tests/poppler-dump.cpp |  29 +++++++++++++++++++++++++++++
+ 1 file changed, 29 insertions(+)
+
+commit 0094c9372b5b439af2564d83d6fb7439f4bdba88
+Author: Pino Toscano <pino@kde.org>
+Date:  Wed Sep 15 13:19:13 2010 +0200
+
+    [cpp] add a new page::text() for specifying a layout mode
+
+    add a new text_layout_enum enum for the layout mode, used by the
+    new text()
+    make the old text() implementation call the new one with the old value
+    (= physical)
+    add & adapt the apidox accordingly
+
+ cpp/poppler-page.cpp |   27 +++++++++++++++++++++++++--
+ cpp/poppler-page.h   |    5 +++++
+ 2 files changed, 30 insertions(+), 2 deletions(-)
+
+commit 4ec3e7784cdba5c0720b1992ba500e97a7e0ed2b
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Wed Sep 15 11:24:07 2010 +0200
+
+    Set initial state of optional content groups based on BaseState field
+
+    There's a test case using BaseState attached to bug #30106
+
+ poppler/OptionalContent.cc |  14 +++++++++-----
+ 1 file changed, 9 insertions(+), 5 deletions(-)
+
+commit f49aa86812ed8ad91d41c675bc670b3d88d3444a
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Mon Sep 13 14:37:10 2010 +0200
+
+    [glib] doc: Document PopplerPage:label property
+
+ glib/poppler-page.cc |    5 +++++
+ 1 file changed, 5 insertions(+)
+
+commit f41fe7ae6e374100574c49d1bb7a3ddc646786c8
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Mon Sep 13 14:36:43 2010 +0200
+
+    [glib] doc: Add poppler_page_get_label to poppler-sections.txt
+
+ glib/reference/poppler-sections.txt |   1 +
+ 1 file changed, 1 insertion(+)
+
+commit 91b8246766a8e5d9cca385b5854667d7967a9d71
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Mon Sep 13 14:22:56 2010 +0200
+
+    [glib-demo] Use poppler_page_get_label() instead of g_object_get()
+
+ glib/demo/page.c |    2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit b82412ef86091f4d249c818cebf00e4c59bae311
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Mon Sep 13 14:22:03 2010 +0200
+
+    [glib] Add poppler_page_get_label()
+
+    It's just an accessor for the property label
+
+ glib/poppler-page.cc |   47
+ ++++++++++++++++++++++++++++++++++-------------
+ glib/poppler-page.h  |    1 +
+ 2 files changed, 35 insertions(+), 13 deletions(-)
+
+commit ff88abf61f4bf90ad276a8593be1818d39c8ecac
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Mon Sep 13 10:05:45 2010 +0200
+
+    [glib] Avoid core headers to be parsed by the g-i scanner
+
+ glib/poppler-document.cc |    2 ++
+ glib/poppler-page.cc    |    2 ++
+ glib/poppler-private.h   |    3 +++
+ 3 files changed, 7 insertions(+)
+
+commit 53324502898ae5fbbb21a4fb819e4a84acdc1a64
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Sun Sep 12 11:42:03 2010 +0200
+
+    [glib] Fix a crash when building layer actions
+
+    Some layers are just the parent of others, but not actually a layer so
+    they don't have an optional content object. Fixes bug #30106.
+
+ glib/poppler-action.cc |   15 +++++++++------
+ 1 file changed, 9 insertions(+), 6 deletions(-)
+
+commit dfc6ea7877635212aa7c5f7ade07af4aa9467e96
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Sun Sep 12 11:36:58 2010 +0200
+
+    [glib] Fix layers array generation when it contains multiple arrays
+
+    Fixes layers for document attached to bug #30106.
+
+ glib/poppler-document.cc |    1 +
+ 1 file changed, 1 insertion(+)
+
+commit 7574912b6c0ff0421c69b6e8c6835957d5126d7d
+Author: Jonathan Liu <net147@gmail.com>
+Date:  Thu Sep 9 20:34:03 2010 +0100
+
+    Fix checking whether _WIN32 is defined
+
+    Bug 29329
+
+ poppler/StdinCachedFile.cc |   2 +-
+ utils/pdftoppm.cc         |    2 +-
+ 2 files changed, 2 insertions(+), 2 deletions(-)
+
+commit 2fc83068c32e09fa3de03a157a420490431ea706
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Sun Sep 5 14:26:27 2010 +0100
+
+    Increase the number of cached glyphs for small sizes
+
+    Should not increase memory usage much and gives me a 17% speed
+    increase
+    in the firefox nytimes advertisment pdf
+
+ splash/SplashFont.cc |    8 ++++++--
+ 1 file changed, 6 insertions(+), 2 deletions(-)
+
+commit 0d96f74f31171c58a55e4ac36d492ce36dd5e7c5
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Sun Sep 5 12:31:57 2010 +0100
+
+    Use std::sort instead of qsort
+
+    Gives a nice speed improvement without any real code change
+    Passes regression tests
+    Based on Paweł Wiejacha patches
+
+ poppler/GfxFont.cc          |   17 ++++++---------
+ splash/SplashXPath.cc       |   48
+ +++++++++++++++++++++++++++---------------
+ splash/SplashXPathScanner.cc |   10 +++++----
+ 3 files changed, 44 insertions(+), 31 deletions(-)
+
+commit 3b4816b2b8caa0e2baafbe4c0eb1e45e452d01ce
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Wed Sep 1 20:43:35 2010 +0100
+
+    forgot the file
+
+ qt4/tests/poppler-texts.cpp |  40
+ ++++++++++++++++++++++++++++++++++++++++
+ 1 file changed, 40 insertions(+)
+
+commit b0db93c71a83946aa3e02bae6b396223dcca19d1
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Wed Sep 1 20:43:14 2010 +0100
+
+    add since and rename enum
+
+ qt4/src/poppler-page.cc |    2 +-
+ qt4/src/poppler-qt4.h  |    5 ++++-
+ 2 files changed, 5 insertions(+), 2 deletions(-)
+
+commit a86f9d90be99a36c41c6932fb4d9a202c4ff6d05
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Wed Sep 1 20:20:48 2010 +0100
+
+    Clarify the ownership
+
+ qt4/src/poppler-qt4.h |    2 ++
+ 1 file changed, 2 insertions(+)
+
+commit 33ad3a17ac26879fcd6a7fad2023dd219bc5919f
+Author: Suzuki Toshiya <mpsuzuki@hiroshima-u.ac.jp>
+Date:  Wed Sep 1 20:19:54 2010 +0100
+
+    Add a way to access the raw text
+
+ poppler/TextOutputDev.cc |   23 ++++++++++++++++++++---
+ qt4/src/poppler-page.cc  |   11 +++++++++--
+ qt4/src/poppler-qt4.h   |   19 +++++++++++++++++++
+ qt4/tests/CMakeLists.txt |    1 +
+ qt4/tests/Makefile.am   |    7 ++++++-
+ 5 files changed, 55 insertions(+), 6 deletions(-)
+
+commit 46e89248b3c5b1789baa3bd9bfa012570720ddb5
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Wed Sep 1 19:54:02 2010 +0100
+
+    quadding is not a GBool but an int
+
+ poppler/Annot.cc |    2 +-
+ poppler/Annot.h  |    4 ++--
+ 2 files changed, 3 insertions(+), 3 deletions(-)
+
+commit ae79fc504c5424be2fa21dbc5498ced4db6e5dd3
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Tue Aug 31 22:14:57 2010 +0100
+
+    Make GBool a bool instead of an int
+
+    Passes the regression tests and might make things faster and use a bit
+    less memory
+
+ cpp/tests/CMakeLists.txt |    2 +-
+ cpp/tests/Makefile.am   |    2 +-
+ goo/gtypes.h            |    7 +-
+ utils/CMakeLists.txt    |    2 +-
+ utils/Makefile.am       |    2 +-
+ utils/parseargs.c       |  208
+ ----------------------------------------------
+ utils/parseargs.cc      |  208
+ ++++++++++++++++++++++++++++++++++++++++++++++
+ 7 files changed, 216 insertions(+), 215 deletions(-)
+
+commit d3f32f2c4f9f46620c0287c44bef686f340461f3
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Tue Aug 31 18:51:17 2010 +0100
+
+    Read from the correct variable
+
+    Fixes crash on KDE bug 249586
+
+ poppler/Movie.cc |    3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+commit 681bb38eafc720b309172ed7c650439c559663a0
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Thu Aug 26 23:55:58 2010 +0100
+
+    Make declaration match what there is in the .cc file
+
+ poppler/TextOutputDev.h |    4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit c91e869304fc263c52f21ee484a57a6f1900f6b2
+Author: Suzuki Toshiya <mpsuzuki@hiroshima-u.ac.jp>
+Date:  Thu Aug 26 19:40:46 2010 +0100
+
+    Add -r option to pdftohtml
+
+    Fixes bug 29551
+
+ utils/pdftohtml.1  |   3 +++
+ utils/pdftohtml.cc |  18 +++++++++++++-----
+ 2 files changed, 16 insertions(+), 5 deletions(-)
+
+commit 9b4be586640b4ad344b1b3ed4c9cda8351257f0c
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Wed Aug 25 19:26:30 2010 +0100
+
+    Use 3 not nComps
+
+ poppler/GfxState.cc |   2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 218f67c527fb41babf2703ba068d072f8326e37b
+Author: Paweł Wiejacha <pawel.wiejacha@gmail.com>
+Date:  Tue Aug 24 23:47:06 2010 +0100
+
+    Make SplashOutputDev::imageSrc faster
+
+    By using getRGBLine when possible
+
+ poppler/SplashOutputDev.cc |  39 ++++++++++++++++++++++++++++++---------
+ 1 file changed, 30 insertions(+), 9 deletions(-)
+
+commit 868f4a1f22051b7978f47a0614f23fd66dbb7ca8
+Author: Paweł Wiejacha <pawel.wiejacha@gmail.com>
+Date:  Tue Aug 24 23:35:21 2010 +0100
+
+    Make GfxICCBasedColorSpace::getRGBLine faster
+
+    By calling doTransform less
+
+ poppler/GfxState.cc |  15 +++++++--------
+ poppler/GfxState.h  |   4 +++-
+ 2 files changed, 10 insertions(+), 9 deletions(-)
+
+commit 46e37c54c6365cf37dc1e223a3c146e7b96a56af
+Author: Paweł Wiejacha <pawel.wiejacha@gmail.com>
+Date:  Tue Aug 24 21:23:34 2010 +0100
+
+    Do not call pow three times when one is enough
+
+ poppler/GfxState.cc |  12 ++++++------
+ 1 file changed, 6 insertions(+), 6 deletions(-)
+
+commit 8591c804598576556c6d24a66b6648de8ed1c4eb
+Author: Mike Slegeir <tehpola@yahoo.com>
+Date:  Sun Aug 22 22:01:03 2010 +0100
+
+    Use splash instead of external gs invocation to render the background
+
+    Patch in bug 19404, should fix 9746 too
+
+ utils/pdftohtml.1  |   8 +-
+ utils/pdftohtml.cc |  210
+ +++++++++++++++++++++++++++++++++++++---------------
+ 2 files changed, 158 insertions(+), 60 deletions(-)
+
+commit 7fc3c21a8c5d6cf8517100427b182887a9569ed0
+Author: Ilya Gorenbein <igorenbein@finjan.com>
+Date:  Fri Aug 20 20:24:31 2010 +0100
+
+    Fix failure to parse PDF with damaged internal structure
+
+    Patch in bug 29189, fixes bug 3870
+
+ poppler/PDFDoc.cc |   24 ++++++++++++----
+ poppler/XRef.cc   |   80
+ ++++++++++++++++++++++++++++++-----------------------
+ poppler/XRef.h    |   5 ++--
+ 3 files changed, 68 insertions(+), 41 deletions(-)
+
+commit bedf48d4397ae412a6d28fc8fea16cc23a29f07c
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Tue Aug 17 22:02:59 2010 +0100
+
+    use memset instead of a for
+
+ splash/Splash.cc |    4 +---
+ 1 file changed, 1 insertion(+), 3 deletions(-)
+
+commit 03ca5b4a5c9964d9c0e9913eb2061692848c4b95
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Tue Aug 10 19:55:31 2010 +0100
+
+    Update copyrights
+
+ goo/GooTimer.cc              |    1 +
+ goo/GooTimer.h                       |    1 +
+ goo/gfile.cc                 |    2 +-
+ poppler/DCTStream.cc         |    1 +
+ poppler/DCTStream.h          |    1 +
+ poppler/GfxState.cc          |    2 +-
+ poppler/Page.cc              |    2 +-
+ qt4/src/poppler-annotation.cc |    2 +-
+ 8 files changed, 8 insertions(+), 4 deletions(-)
+
+commit 3bca8ddc10bf4291bf0c0e39c67341a05953e949
+Author: Jonathan Liu <net147@gmail.com>
+Date:  Tue Aug 10 19:42:40 2010 +0100
+
+    Tell windows we are writing/reading binary data
+
+    Bug #29329
+
+ poppler/StdinCachedFile.cc |   9 +++++++++
+ utils/pdftoppm.cc         |    9 +++++++++
+ 2 files changed, 18 insertions(+)
+
+commit bdd617f2177a7836f6b6686fde892664513a32a7
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Tue Aug 3 13:05:26 2010 +0200
+
+    [glib] Fix a crash when a layer doesn't have a name
+
+    Fixes bug #28842.
+
+ glib/poppler-layer.cc |    4 +++-
+ 1 file changed, 3 insertions(+), 1 deletion(-)
+
+commit e9f0646ca664cc27825f7e084f8419fe0de1fcfc
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Tue Aug 3 13:02:52 2010 +0200
+
+    Catalog page array might contain NULL for some pages in invalid
+    documents
+
+    Fixes a crash reproducible with gtk-splash-test when opening document
+    attached to bug #28842.
+
+ poppler/PDFDoc.cc |   27 +++++++++++++++------------
+ 1 file changed, 15 insertions(+), 12 deletions(-)
+
+commit 842209782ca3ba8c1c783cccf565372a18b3fda5
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Fri Jul 30 19:29:12 2010 +0100
+
+    Do not crash when using pdftops in some files
+
+    Fixes crash in file in kde bug 246269. The output is still wrong
+    though
+
+ fofi/FoFiType1C.cc |  12 +++++++-----
+ 1 file changed, 7 insertions(+), 5 deletions(-)
+
+commit 0dd7c80b7baf2622eb4780a867c4dc6291773f3b
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Mon Jul 26 23:58:26 2010 +0100
+
+    Do not overwrite the rgb values
+
+    Recommended by Koji Otani in Re: [poppler] Question about code
+    Passed the regression testing in my files
+
+ poppler/GfxState.cc |   1 -
+ 1 file changed, 1 deletion(-)
+
+commit 627edf88c8f5c073a68bd05990df56e1af547292
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Sun Jul 25 13:56:03 2010 +0200
+
+    [annots] Fix a crash when adding a new annotation and annots object
+    is an array
+
+    When annots object is an array instead of a ref, the modified
+    object is
+    actually de page object.
+
+ poppler/Page.cc |    5 ++++-
+ 1 file changed, 4 insertions(+), 1 deletion(-)
+
+commit 5d86f9b600b1e10de93bcaf1b925fadbc2a47522
+Author: mpsuzuki <mpsuzuki@hiroshima-u.ac.jp>
+Date:  Sat Jul 24 15:12:05 2010 +0100
+
+    reindent correctly
+
+ poppler/TextOutputDev.cc |   34 +++++++++++++++++-----------------
+ 1 file changed, 17 insertions(+), 17 deletions(-)
+
+commit d0a6f9abdab88ec43004b6766337db304cbf6a25
+Author: Pino Toscano <pino@kde.org>
+Date:  Thu Jul 22 21:28:55 2010 +0200
+
+    [CMake] improve the way include dirs and cflags for gdk and gtk
+    are set
+
+    correctly include_directories() for the include dirs, while add the
+    cflags which are not include dirs as definitions
+
+ glib/CMakeLists.txt     |    5 +++--
+ glib/demo/CMakeLists.txt |    5 ++++-
+ 2 files changed, 7 insertions(+), 3 deletions(-)
+
+commit 02d85dd2cc154dbb6caa04a349532033d833edd1
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Tue Jul 20 13:53:56 2010 +0200
+
+    [glib-demo] Add support for adding annots in annot demo
+
+ glib/demo/annots.c |  114
+ ++++++++++++++++++++++++++++++++++++++++++++++++++++
+ 1 file changed, 114 insertions(+)
+
+commit 969cb850f5c2bc31de82c591b2b3210b5cfabf5f
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Tue Jul 20 13:53:29 2010 +0200
+
+    [glib] docs: Add new symbols to poppler-sections.txt
+
+ glib/reference/poppler-sections.txt |  18 ++++++++++++++++++
+ 1 file changed, 18 insertions(+)
+
+commit 251959438b6257fe71ed58e79eec60cda68a66cf
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Tue Jul 20 13:53:00 2010 +0200
+
+    [glib] Add poppler_page_add_annot()
+
+ glib/poppler-document.cc |    7 ++++---
+ glib/poppler-page.cc    |   19 +++++++++++++++++++
+ glib/poppler-page.h     |    2 ++
+ 3 files changed, 25 insertions(+), 3 deletions(-)
+
+commit 78a4f6976e708f2cc23aac49fbff0faf00e74bc3
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Tue Jul 20 13:51:16 2010 +0200
+
+    [glib] annots: Add several setter methods
+
+ glib/poppler-annot.cc |  278
+ +++++++++++++++++++++++++++++++++++++++++++-----
+ glib/poppler-annot.h  |   26 +++++
+ glib/poppler-private.h |    6 ++
+ 3 files changed, 285 insertions(+), 25 deletions(-)
+
+commit fee488c9db60ab691ce9ff5eef284be2af897aee
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Sun Jul 18 11:26:59 2010 +0200
+
+    [annots] Add AnnotMarkup::setOpacity
+
+ poppler/Annot.cc |    8 ++++++++
+ poppler/Annot.h  |    1 +
+ 2 files changed, 9 insertions(+)
+
+commit d15a355ede2d8510c4df847ea0b92b5357b29914
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Sun Jul 18 09:57:35 2010 +0200
+
+    Set the page reference (P in annot dict) when adding a new annot to
+    a page
+
+ poppler/Annot.cc |    9 +++++++++
+ poppler/Annot.h  |    3 +++
+ poppler/Page.cc  |    2 ++
+ 3 files changed, 14 insertions(+)
+
+commit 49ffb46db3118db874d2d9830bb034762d625c61
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Mon Jul 19 16:31:54 2010 +0100
+
+    Remove exception support
+
+    We don't use it and don't even support it properly
+
+ CMakeLists.txt                        |    1 -
+ config.h.cmake                        |    3 ---
+ configure.ac                  |    4 ---
+ goo/gmem.cc                   |   56
+ ++++++++++++----------------------------
+ goo/gmem.h                    |   38 ++++++++-------------------
+ poppler/poppler-config.h.cmake |    5 ----
+ poppler/poppler-config.h.in   |    5 ----
+ 7 files changed, 27 insertions(+), 85 deletions(-)
+
+commit dd2e9399868e3dbf2fa4ede050f8d74d29ebbbb4
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Mon Jul 19 16:31:43 2010 +0100
+
+    add uninstalled.pc to ignore
+
+ .gitignore |   7 +++++++
+ 1 file changed, 7 insertions(+)
+
+commit d1033006aae381a0f075e02d54638a1af997caf3
+Author: Pino Toscano <pino@kde.org>
+Date:  Sat Jul 17 21:46:14 2010 +0200
+
+    add FindGObjectIntrospection.cmake and
+    GObjectIntrospectionMacros.cmake to the dist
+
+ Makefile.am |   2 ++
+ 1 file changed, 2 insertions(+)
+
+commit ce8d03950736cc35d035a44a7d88e5f2a9defa74
+Author: Pino Toscano <pino@kde.org>
+Date:  Sat Jul 17 21:39:08 2010 +0200
+
+    [CMake/glib] add support for gobject-introspection
+
+    other than a module to find (using pkg-config) gobject-introspection,
+    this adds a macro (gir_add_introspections) to add new introspections
+    in a directory.
+    its working is much similar (even the variable names used) to
+    the Makefile version provided by gobject-repository itself, with
+    the notable difference of a disabled libtool in the g-ir-scanner
+    invocation.
+    the only additional step needed is adding two custom targets, compiled
+    by ALL, which have the gir and the typelib files as dependencies,
+    to make them build with the usual `make all'.
+
+ CMakeLists.txt                                        |    5 +-
+ cmake/modules/FindGObjectIntrospection.cmake  |   61 +++++++++++++++
+ cmake/modules/GObjectIntrospectionMacros.cmake |   94
+ ++++++++++++++++++++++++
+ glib/CMakeLists.txt                           |   36 +++++++++
+ 4 files changed, 194 insertions(+), 2 deletions(-)
+
+commit 78bf43d8e11aa52db9862af118c597e117d31083
+Author: Pino Toscano <pino@kde.org>
+Date:  Sat Jul 17 20:28:58 2010 +0200
+
+    [CMake] properly use the glib2 include dirs
+
+    properly use GLIB2_INCLUDE_DIRS (pkg-config result) for the glib
+    include dirs,
+    while turn GLIB2_CFLAGS into GLIB2_CFLAGS_OTHERS to add the remaining
+    CFLAGS as definitions
+
+ glib/CMakeLists.txt |   3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+commit 6f3082d677bc62aa3f8124132e3e337c01be2629
+Author: Pino Toscano <pino@kde.org>
+Date:  Sat Jul 17 19:28:09 2010 +0200
+
+    [CMake] split the generated sources of poppler_glib_SRCS in an own
+    poppler_glib_generated_SRCS
+
+ glib/CMakeLists.txt |   4 +++-
+ 1 file changed, 3 insertions(+), 1 deletion(-)
+
+commit 2a252dd9b05857bbd10dee235e873886fc74ec17
+Author: Pino Toscano <pino@kde.org>
+Date:  Sat Jul 17 14:57:38 2010 +0200
+
+    [CMake] add stub message and TODO for the gobject-introspection
+    support
+
+ CMakeLists.txt |    3 +++
+ 1 file changed, 3 insertions(+)
+
+commit 8a3d1794a8ef5d525bb454755fec018e3fcb3816
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Fri Jul 16 14:00:32 2010 +0100
+
+    update
+
+ TODO |    2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 31ac578942b82cbd16b064abca586ccb89dfa7ce
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Thu Jul 15 15:05:10 2010 +0200
+
+    Rework ChangeLog generation to fix make distcheck
+
+ Makefile.am |  22 +++++++++++++++++++---
+ 1 file changed, 19 insertions(+), 3 deletions(-)
+
+commit 5da5825ecab63089a19aac694826271019a94e6d
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Thu Jul 15 15:03:20 2010 +0200
+
+    [glib] docs: Add version.xml to content_files var
+
+ glib/reference/Makefile.am |   2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit fe69b474ae63c9d5d2538db9e51e666dd6ea9fb3
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Thu Jul 15 10:51:21 2010 +0100
+
+    Fix padding of names
+
+    The previous method returned 2 for documents with 100 pages, which
+    is wrong as 100 needs 3
+    characters, not 2
+
+ utils/pdftoppm.cc |   14 +++++++++++++-
+ 1 file changed, 13 insertions(+), 1 deletion(-)
+
+commit e265ae2d8a46df00ab1bbd863f01f652068d265f
+Author: Brian Cameron <brian.cameron@oracle.com>
+Date:  Wed Jul 14 20:26:25 2010 +0100
+
+    Add uninstalled .pc file for poppler when using autoconf
+
+ Makefile.am                     |    9 ++++++++-
+ configure.ac                    |    9 ++++++++-
+ poppler-cairo-uninstalled.pc.in  |    6 ++++++
+ poppler-cpp-uninstalled.pc.in   |    7 +++++++
+ poppler-glib-uninstalled.pc.in   |    7 +++++++
+ poppler-qt-uninstalled.pc.in    |    7 +++++++
+ poppler-qt4-uninstalled.pc.in   |    7 +++++++
+ poppler-splash-uninstalled.pc.in |    7 +++++++
+ poppler-uninstalled.pc.in       |    6 ++++++
+ 9 files changed, 63 insertions(+), 2 deletions(-)
+
+commit 552ab99e60fe4068be8e4e415924e4be289e47cd
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Tue Jul 13 10:18:01 2010 +0200
+
+    Handle ColorTransform in DCT streams when using libjpeg
+
+    Fixes bug #28873.
+
+ poppler/DCTStream.cc |   30 ++++++++++++++++++++++++++++++
+ poppler/DCTStream.h  |    1 +
+ 2 files changed, 31 insertions(+)
+
+commit 8a6697f89625106f3c373dbc7b4dc521e22502f7
+Author: Hib Eris <hib@hiberis.nl>
+Date:  Sat Jul 3 16:42:04 2010 +0200
+
+    Only define findModifier() when used
+
+    Prevents a warning when building with win32 font backend.
+
+ poppler/GlobalParams.cc |    2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit b1fdb87a4ebb5079c731256cce1870de8c54c65d
+Author: Hib Eris <hib@hiberis.nl>
+Date:  Fri Jul 2 10:53:20 2010 +0200
+
+    Fix compile warnings on auto imports for mingw compiler
+
+ cpp/Makefile.am       |    2 +-
+ cpp/tests/Makefile.am |    2 ++
+ glib/Makefile.am      |    2 ++
+ poppler/Makefile.am   |    2 +-
+ qt4/demos/Makefile.am |    2 ++
+ qt4/src/Makefile.am   |    2 +-
+ qt4/tests/Makefile.am |    2 ++
+ 7 files changed, 11 insertions(+), 3 deletions(-)
+
+commit 9e577110134eb1e093e697b7504efca759000086
+Author: Hib Eris <hib@hiberis.nl>
+Date:  Fri Jul 2 10:51:24 2010 +0200
+
+    Check for declaration of gettimeofday()
+
+    The function gettimeofday() is not declared in ansi mode with the
+    mingw compiler, even though the function exists. Therefore,
+    configure must
+    not only check with AC_CHECK_FUNC, but also with AC_CHECK_DECL.
+
+    Also, the checks must run in a C++ context because that is where
+    gettimeofday() is used.
+
+ configure.ac |    7 ++++---
+ 1 file changed, 4 insertions(+), 3 deletions(-)
+
+commit 58c8430ac584f3ba5e97aceb148e6287bfc45f95
+Author: Hib Eris <hib@hiberis.nl>
+Date:  Wed Jun 30 15:06:44 2010 +0200
+
+    Set -ansi compiler flag early in configure.ac
+
+    The -ansi compiler flag does not enable warnings, but turns of certain
+    features of GCC. To force feature tests to use this flag, it should be
+    set early in configure.ac
+
+    This is important for the mingw compiler where header files refrain
+    from declaring certain function (e.g. gettimeofday()) when the -ansi
+    flag is set.
+
+ configure.ac |    7 +++++--
+ 1 file changed, 5 insertions(+), 2 deletions(-)
+
+commit e3663a855a9c86f0a3988a7a50fa40d37d0ea069
+Author: Hib Eris <hib@hiberis.nl>
+Date:  Fri Jul 2 14:45:15 2010 +0200
+
+    Use MAX_PATH instead of _MAX_PATH everywhere
+
+    _MAX_PATH is compiler specific and not availble with the mingw
+    compiler
+    in ansi mode. MAX_PATH is in the Windows api and thus always available
+    when windows.h is included.
+
+ goo/gfile.cc           |    4 ++--
+ poppler/GlobalParams.cc |    2 +-
+ poppler/PDFDoc.cc      |    4 ++--
+ 3 files changed, 5 insertions(+), 5 deletions(-)
+
+commit 7227c407d23a37f5d95e6c01cb7411be2f82ca85
+Author: Hib Eris <hib@hiberis.nl>
+Date:  Wed Jun 30 16:15:06 2010 +0200
+
+    Check for _WIN32 instead of _MSC_VER
+
+ goo/GooTimer.cc |    6 +++---
+ goo/GooTimer.h  |    4 ++--
+ 2 files changed, 5 insertions(+), 5 deletions(-)
+
+commit 34e727e011529be312313a1f4d4fa1ba9c545888
+Author: Hib Eris <hib@hiberis.nl>
+Date:  Tue Jun 29 16:43:31 2010 +0200
+
+    Fix cross compiling for Windows with autotools
+
+    When cross compiling for Windows with autotools, libtool creates
+    libpoppler_qt4_la-poppler-optcontent.lo instead of
+    poppler-optcontent.lo. Thus, explicitly using poppler-optcontent.lo to
+    create poppler-optcontent.moc does not work well.
+
+ qt4/src/Makefile.am |   2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 1bc2f4501ea4e56ca99ae4d94d6cf34cf33c2c7a
+Author: Hib Eris <hib@hiberis.nl>
+Date:  Tue Jun 29 15:34:22 2010 +0200
+
+    define poppler_qt4_EXPORTS when building with autotools
+
+    Lets you build the qt4 bindings for Windows with automake/autoconf.
+
+ qt4/src/Makefile.am |   3 +++
+ 1 file changed, 3 insertions(+)
+
+commit 5825114a26cc6eece2e556063f640dda53ea1e11
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Sun Jul 11 12:24:20 2010 +0100
+
+    Compile++
+
+ glib/demo/CMakeLists.txt |    1 +
+ 1 file changed, 1 insertion(+)
+
+commit 5e4d8eeea0b9dba68420c164975418c76a53be85
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Sat Jul 10 15:54:28 2010 +0200
+
+    [pdf-inspector] Do not render for printing
+
+ test/pdf-inspector.cc |    3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+commit e6824972a213a888ca0185b7ae0a75fc23f75797
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Sat Jul 10 15:52:15 2010 +0200
+
+    [annots] Use a transparency group for markup annots without AP and
+    opacity != 1
+
+    Fixes bug #623616.
+
+ poppler/Annot.cc |  346
+ +++++++++++++++++++++++++-----------------------------
+ poppler/Annot.h  |    3 +
+ poppler/Gfx.cc   |    9 +-
+ poppler/Gfx.h   |    2 +-
+ 4 files changed, 165 insertions(+), 195 deletions(-)
+
+commit 70ce0b6ea1a0d61f5048d2ae49c639d74a643b29
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Fri Jul 9 17:04:00 2010 +0200
+
+    [annots] Clamp QuadPoints coords to annot rectangle instead of
+    ignore points
+
+    Fixes appearance stream generation for document attached to bug
+    #623616.
+
+ poppler/Annot.cc |   38 +++++++++++++++++++++-----------------
+ 1 file changed, 21 insertions(+), 17 deletions(-)
+
+commit 8a9e561bfe64f71e9f38c43e5c6be7e5069b2349
+Author: Hib Eris <hib@hiberis.nl>
+Date:  Fri Jul 2 21:07:53 2010 +0200
+
+    Nicer autogen.sh output
+
+ autogen.sh |   1 +
+ 1 file changed, 1 insertion(+)
+
+commit ce4d328294cea73f4b7368691dc1fed6bd45d569
+Author: Hib Eris <hib@hiberis.nl>
+Date:  Fri Jul 2 20:51:47 2010 +0200
+
+    Add option for autogen.sh to skip configure
+
+    If you do not want to automatically run configure when calling
+    autogen.sh, run it with:
+
+    $ NOCONFIGURE=1 ./autogen.sh
+
+    This feature is modeled after gnome-autogen.sh behaviour.
+
+ autogen.sh |   8 +++++++-
+ 1 file changed, 7 insertions(+), 1 deletion(-)
+
+commit d7ee87c5d0a35c8d4fcc88bde4b8496c49f397c6
+Author: Hib Eris <hib@hiberis.nl>
+Date:  Tue Jul 6 15:16:08 2010 +0100
+
+    warnings-=2
+
+ poppler/GfxFont.cc    |    3 ++-
+ utils/HtmlOutputDev.cc |    3 ++-
+ 2 files changed, 4 insertions(+), 2 deletions(-)
+
+commit 1e7f457ca1617fd8c958feef8dd7e694476dedd9
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Fri Jul 9 12:29:14 2010 +0200
+
+    [cairo] Use ceil to convert double to int in tilingPatternFill()
+
+    Fixes rendering of page 2 of document attached to bug #28954.
+
+ poppler/CairoOutputDev.cc |   8 ++++++--
+ 1 file changed, 6 insertions(+), 2 deletions(-)
+
+commit 91a7605eb51144f2e7dea69aa9454fff47c49bd2
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Fri Jul 9 11:42:56 2010 +0200
+
+    [glib] Fix build when GDK is enabled
+
+ glib/test-poppler-glib.cc |   8 +-------
+ 1 file changed, 1 insertion(+), 7 deletions(-)
+
+commit 09e3e0e9c5134688c4ed2af5cd3a12aa2986474c
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Thu Jul 8 18:56:38 2010 +0200
+
+    [glib] Fix poppler_page_find_tex() when called more than once
+
+    Fixes bug #27927
+
+ glib/poppler-page.cc |    2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 25427bdecb219ffe6f0592d2ac36de60c247bfd9
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Thu Jul 8 17:46:22 2010 +0200
+
+    Fix build when compiling without glib frontend
+
+ configure.ac |    1 +
+ 1 file changed, 1 insertion(+)
+
+commit 550684731356a66753ec19f5a8ca4b572db6d2d5
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Thu Jul 8 17:16:02 2010 +0200
+
+    [glib-demo] Add selections demo
+
+ glib/demo/Makefile.am |    2 +
+ glib/demo/main.c      |    4 +-
+ glib/demo/selections.c |  687
+ ++++++++++++++++++++++++++++++++++++++++++++++++
+ glib/demo/selections.h |   31 +++
+ 4 files changed, 723 insertions(+), 1 deletion(-)
+
+commit b257428150e2c13dcc24fd8f75e4ee2c679ab414
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Thu Jul 8 14:45:29 2010 +0200
+
+    [glib] Add poppler_page_get_selected_text()
+
+    And change poppler_page_get_text() to return the text of the whole
+    page. For consistency with poppler_page_get_selection_region()
+    get_seletect_text() doesn't invert the y coords as get_text()
+    did. This
+    change breaks the API. Users of poppler_page_get_text should:
+
+     - Use the new poppler_page_get_text() if they want the text of the
+       whole page
+
+     - Use poppler_page_get_selected_text() if they want the text of the
+       selected area. In this case they shouldn't invert the y coords
+       anymore
+       before calling the method.
+
+ glib/demo/text.c                   |    9 +-------
+ glib/poppler-page.cc               |   43
+ ++++++++++++++++++++++++++---------
+ glib/poppler-page.h                |    3 ++-
+ glib/reference/poppler-sections.txt |   1 +
+ 4 files changed, 36 insertions(+), 20 deletions(-)
+
+commit bedc88225c948ad1288b69c6c106adce36233442
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Wed Jul 7 11:55:47 2010 +0200
+
+    [cairo] Fix warning on signed/unsigned comparison
+
+ poppler/CairoFontEngine.cc |  12 ++++++------
+ poppler/CairoFontEngine.h  |   8 ++++----
+ 2 files changed, 10 insertions(+), 10 deletions(-)
+
+commit 092aa901b9ec35a48bc1fb229ad16a3b00eef5f2
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Mon Jul 5 11:16:49 2010 +0200
+
+    [glib] docs: add some more introspection annotations
+
+ glib/poppler-attachment.cc |   4 ++--
+ glib/poppler-document.cc   |  12 ++++++------
+ glib/poppler-media.cc     |    4 ++--
+ glib/poppler-page.cc      |    4 ++--
+ 4 files changed, 12 insertions(+), 12 deletions(-)
+
+commit 6c4e14fd90d5ef2d6670a980ab2476b6fab58df7
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Mon Jul 5 10:49:59 2010 +0200
+
+    [glib] docs: fix POPPLER_CHECK_VERSION() docs
+
+ glib/poppler-features.h.in |   6 ++++--
+ 1 file changed, 4 insertions(+), 2 deletions(-)
+
+commit ed324a867ecf1f616c4b2dc575f01d5cf1b67c38
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Fri Jul 2 18:28:45 2010 +0200
+
+    [glib] Rename instrospection files as 0.16 instead of 0.14
+
+ glib/Makefile.am |   14 +++++++-------
+ 1 file changed, 7 insertions(+), 7 deletions(-)
+
+commit a55f567ff1ea0858eda13a024ed765a016f3bff0
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Fri Jul 2 18:23:03 2010 +0200
+
+    [glib] docs: Remove unneeded empty line in doc comment
+
+ glib/poppler-features.h.in |   1 -
+ 1 file changed, 1 deletion(-)
+
+commit f16015303422280eaa21c3144eca0f1a330dce8a
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Fri Jul 2 18:19:13 2010 +0200
+
+    [glib] docs: Add GObject introspection annotations
+
+ glib/poppler-annot.cc           |   45
+ +++++++++++++++++++-------------------
+ glib/poppler-document.cc        |    8 +++----
+ glib/poppler-page.cc            |   23 ++++++++++++-------
+ glib/reference/poppler-docs.sgml |    2 ++
+ 4 files changed, 43 insertions(+), 35 deletions(-)
+
+commit 60242038e4dce7f0c90f2bfa0e771120247dbc9d
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Wed Jun 30 09:35:29 2010 +0200
+
+    [glib] Add GObject introspection support
+
+ configure.ac       |    5 +++
+ glib/Makefile.am    |  29 ++++++++++++++++
+ m4/introspection.m4 |  94
+ +++++++++++++++++++++++++++++++++++++++++++++++++++
+ 3 files changed, 128 insertions(+)
+
+commit 3160950a7d7161457405c9084c31af230329b3f0
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Fri Jul 2 12:47:04 2010 +0200
+
+    [glib] docs: Add index of deprecated symbols
+
+ glib/reference/poppler-docs.sgml |    4 ++++
+ 1 file changed, 4 insertions(+)
+
+commit 593db7acf6edce1267f69d12310bf4098ff24c97
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Fri Jul 2 12:44:39 2010 +0200
+
+    [glib] docs: deprecate GDK API
+
+ glib/poppler-page.cc |    8 ++++++++
+ 1 file changed, 8 insertions(+)
+
+commit 6facefb3fa8f97a9d330545308fb2d89c7f57fa0
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Thu Jul 1 18:01:45 2010 +0200
+
+    [glib] docs: Add index of new symbols for versions 0.12, 0.14 and 0.16
+
+ glib/poppler-action.h           |   10 +++++++---
+ glib/poppler-annot.cc           |   17 +++++++++++++++++
+ glib/poppler-date.cc            |    2 ++
+ glib/poppler-document.cc        |   16 +++++++++++++++-
+ glib/poppler-layer.cc           |   12 ++++++++++++
+ glib/poppler-media.cc           |   14 ++++++++++++--
+ glib/poppler-media.h            |    3 +++
+ glib/poppler-movie.cc           |    6 ++++++
+ glib/poppler-page.cc            |    2 ++
+ glib/reference/poppler-docs.sgml |   12 ++++++++++++
+ 10 files changed, 88 insertions(+), 6 deletions(-)
+
+commit 166b78c0ce8a4536873c4f60b392c24c8a68e7aa
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Thu Jul 1 17:25:03 2010 +0200
+
+    [glib] docs: document PopplerMediaSaveFunc
+
+ glib/poppler-media.h |   18 +++++++++++++++++-
+ 1 file changed, 17 insertions(+), 1 deletion(-)
+
+commit 5cc0a51f88580c65ac2d5c6ff02b8cf14697b70c
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Thu Jul 1 17:20:13 2010 +0200
+
+    [glib] Use the same name for parameter in function prototype
+
+ glib/poppler-media.h |   10 +++++-----
+ glib/poppler-movie.h |    6 +++---
+ 2 files changed, 8 insertions(+), 8 deletions(-)
+
+commit 6793fd8fd2d33d3d58c6556b5dbe6d0497e56646
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Thu Jul 1 15:49:49 2010 +0200
+
+    [glib] docs: document some enums in poppler-action
+
+ glib/poppler-action.h |   92
+ +++++++++++++++++++++++++++++++++++++++++++++++++
+ 1 file changed, 92 insertions(+)
+
+commit 8e139696dbe19f54ad54364a711b929146f11080
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Thu Jul 1 15:02:58 2010 +0200
+
+    [glib] docs: mark structures in poppler-private.h as private
+
+ glib/poppler-private.h |    7 +++++++
+ 1 file changed, 7 insertions(+)
+
+commit ccae7e574047d66c638003cc36fa1edeef4d35ed
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Thu Jul 1 14:59:50 2010 +0200
+
+    [glib] docs: document PopplerDocument enums
+
+ glib/poppler-document.h |   65
+ +++++++++++++++++++++++++++++++++++++++++++++++
+ 1 file changed, 65 insertions(+)
+
+commit 4fbff172693c38cdc4ae8070a55ceb706aa213cd
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Thu Jul 1 14:26:53 2010 +0200
+
+    [glib] docs: document PopplerFontInfo
+
+ glib/poppler-document.cc |  106
+ ++++++++++++++++++++++++++++++++++++++++++++++
+ 1 file changed, 106 insertions(+)
+
+commit 465dd4897ff603a6fd96503cf4746fc808b0f827
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Thu Jul 1 12:59:39 2010 +0200
+
+    [glib] docs: document some enums
+
+ glib/poppler.h |   55
+ +++++++++++++++++++++++++++++++++++++++++++++++++++++++
+ 1 file changed, 55 insertions(+)
+
+commit de3d599ea9e948867cfe395f42ed659670110c4c
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Thu Jul 1 12:31:10 2010 +0200
+
+    [glib] docs: document boxed types defined in poppler-page
+
+ glib/poppler-page.cc |  147
+ ++++++++++++++++++++++++++++++++++++++++++++++++++
+ glib/poppler-page.h  |   79 +++++++++++++++++++++++++++
+ 2 files changed, 226 insertions(+)
+
+commit 34c52190e1dbf4d3effa44b4408faa1fbae0d12d
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Thu Jul 1 09:33:08 2010 +0200
+
+    [glib] Remove splash header file
+
+ glib/poppler-page.cc |    1 -
+ 1 file changed, 1 deletion(-)
+
+commit 6910545a487f206ccd059bb295d2312228dbf2ba
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Wed Jun 30 19:03:04 2010 +0200
+
+    [glib] docs: Remove invalid symbol from poppler-sections.txt
+
+ glib/reference/poppler-sections.txt |   1 -
+ 1 file changed, 1 deletion(-)
+
+commit 65ea3b636cb5a38660e526a483a4d95f5acdf8db
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Wed Jun 30 19:02:32 2010 +0200
+
+    [glib] docs: fix typo
+
+ glib/poppler-form-field.cc |   2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 689bfec40b5b3030c2819cb4aac42c3ab6279278
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Wed Jun 30 19:01:47 2010 +0200
+
+    [glib] docs: Add missing doc for parameter
+
+ glib/poppler-document.cc |    1 +
+ 1 file changed, 1 insertion(+)
+
+commit 0b3d77627f255a4bf3da6ee875ad8d9eb931c96e
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Wed Jun 30 19:00:59 2010 +0200
+
+    [glib] Use the same name for parameter in function prototype
+
+ glib/poppler-page.h |   2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 19e1944c00ac2da6b18b015721fc3a8d1898a23a
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Wed Jun 30 18:01:52 2010 +0200
+
+    [glib] docs: Add media and movie to docs
+
+ glib/poppler-media.cc           |    6 ++++++
+ glib/poppler-movie.cc           |    6 ++++++
+ glib/reference/poppler-docs.sgml |    3 ++-
+ 3 files changed, 14 insertions(+), 1 deletion(-)
+
+commit ca48bee07e6b4a20ea7b40b472a335e75feb4739
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Wed Jun 30 17:56:50 2010 +0200
+
+    [glib] docs: Add missing types to poppler.types
+
+ glib/reference/poppler.types |    4 ++++
+ 1 file changed, 4 insertions(+)
+
+commit 613ccf81317a007ed5017ee788466613a6699bb5
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Wed Jun 30 17:54:22 2010 +0200
+
+    [glib] docs: rework poppler-sections.txt
+
+     - Better organization of sections and contents
+     - Use of Standard and Private subsections
+     - Add missing sections
+     - Remove enums section
+
+ glib/reference/poppler-sections.txt | 424
+ ++++++++++++++++++++++++-----------
+ 1 file changed, 295 insertions(+), 129 deletions(-)
+
+commit b37556a32b79f8711ed7eca24abf19511872a70a
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Wed Jun 30 12:01:44 2010 +0200
+
+    [glib] docs: Add index of symbols
+
+ glib/reference/poppler-docs.sgml |    5 +++++
+ 1 file changed, 5 insertions(+)
+
+commit 7f5fa4e19b4e324a396d64261b9125c1a557ac84
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Wed Jun 30 12:00:35 2010 +0200
+
+    [glib] docs: Add version information
+
+ configure.ac                    |    1 +
+ glib/reference/Makefile.am      |    2 +-
+ glib/reference/poppler-docs.sgml |    7 ++++++-
+ glib/reference/version.xml.in   |    1 +
+ 4 files changed, 9 insertions(+), 2 deletions(-)
+
+commit 848d5e158fa9eadd19a658db314ba3fff9d026e8
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Wed Jun 30 11:30:41 2010 +0200
+
+    [glib] docs: do not use gtk-doc templates
+
+ configure.ac                                |    2 +-
+ glib/poppler-action.cc                              |    6 +
+ glib/poppler-annot.cc                       |    6 +
+ glib/poppler-attachment.cc                  |    6 +
+ glib/poppler-attachment.h                   |   16 +
+ glib/poppler-document.cc                    |    8 +
+ glib/poppler-features.h.in                  |   59 ++++
+ glib/poppler-form-field.cc                  |    6 +
+ glib/poppler-layer.cc                       |    6 +
+ glib/poppler-page.cc                        |    6 +
+ glib/reference/tmpl/poppler-action.sgml      |  216 ------------
+ glib/reference/tmpl/poppler-annot.sgml       |  377 --------------------
+ glib/reference/tmpl/poppler-attachment.sgml  |   68 ----
+ glib/reference/tmpl/poppler-document.sgml    |  410
+ ----------------------
+ glib/reference/tmpl/poppler-enums.sgml       |  246 -------------
+ glib/reference/tmpl/poppler-features.sgml    |   83 -----
+ glib/reference/tmpl/poppler-form-field.sgml  |  318 -----------------
+ glib/reference/tmpl/poppler-layer.sgml       |   83 -----
+ glib/reference/tmpl/poppler-page.sgml       |  483
+ --------------------------
+ glib/reference/tmpl/poppler-private.sgml     |  148 --------
+ glib/reference/tmpl/poppler-unused.sgml      |    8 -
+ glib/reference/tmpl/poppler.sgml            |  285 ---------------
+ glib/reference/tmpl/stamp-poppler-enums.sgml |   22 --
+ gtk-doc.make                                |   78 +++--
+ m4/gtk-doc.m4                               |    2 +-
+ 25 files changed, 171 insertions(+), 2777 deletions(-)
+
+commit 16e15ac845206217086e2adac9f220e75c0c630d
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Tue Jun 29 21:44:02 2010 +0100
+
+    bitmap can be null at this stage, check it isn't
+
+ poppler/JBIG2Stream.cc |    3 +++
+ 1 file changed, 3 insertions(+)
+
+commit 38e5d28a184d0ca8df71a7ea910ce85d7a225e4e
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Mon Jun 21 20:38:00 2010 +0100
+
+    more pow 0.5 -> sqrt
+
+ poppler/GfxState.cc |  12 ++++++------
+ 1 file changed, 6 insertions(+), 6 deletions(-)
+
+commit 58a53ca0a4e8434e8478f8fe121067dcf05c017d
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Mon Jun 21 19:24:20 2010 +0100
+
+    sqrt is much faster than pow 0.5
+
+ poppler/GfxState.cc |   6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
+
+commit bf86a9fc464aca57ebec207a213dcc2cc6031940
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Mon Jun 21 19:20:47 2010 +0100
+
+    introduce getChars to save some method calls
+
+    Can give us a decent speedup when we go a lot though this methods
+
+ poppler/Catalog.cc       |   12 +----
+ poppler/DCTStream.cc     |   51 ++++++++++++++------
+ poppler/DCTStream.h      |    3 ++
+ poppler/GfxFont.cc       |   22 ++-------
+ poppler/GfxState.cc      |   30 +++---------
+ poppler/JPEG2000Stream.cc |   67 +++++++------------------
+ poppler/JPEG2000Stream.h  |   38 ++++++++++++++-
+ poppler/Link.cc          |   14 ++----
+ poppler/Object.h         |    4 ++
+ poppler/Stream.cc        |   90 ++++++++++++++++++----------------
+ poppler/Stream.h         |  118
+ ++++++++++++++++++++++++++++++++++++++++++++-
+ 11 files changed, 279 insertions(+), 170 deletions(-)
+
+commit 65c14073a3b1035ca5fe3bd6667abd315272841e
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Mon Jun 21 17:19:22 2010 +0200
+
+    Reduce pow operations in GfxCalRGBColorSpace::getXYZ()
+
+    We were doing the same pow operation 3 times!. It makes document
+    attached to bug #28591 render a little faster.
+
+ poppler/GfxState.cc |  12 ++++++------
+ 1 file changed, 6 insertions(+), 6 deletions(-)
+
+commit 9365c05c1f66b3000febf32c45cef2ffe79e041a
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Sat Jun 19 10:36:39 2010 +0200
+
+    [glib] Fix links/annots area for rotated documents with page CropBox
+    not starting at 0,0
+
+    Fixes bug #28588.
+
+ glib/poppler-page.cc |   25 ++++++++++---------------
+ 1 file changed, 10 insertions(+), 15 deletions(-)
+
+commit d9504c0a288c84b68a516f715505d6bc94b911f5
+Author: Pino Toscano <pino@kde.org>
+Date:  Fri Jun 18 23:59:04 2010 +0200
+
+    [autotools] link the 'cpp' tests against libpoppler as well
+
+    ... this way gatof() can be found correctly
+    should fix bug #28605
+
+ cpp/tests/Makefile.am |    1 +
+ 1 file changed, 1 insertion(+)
+
+commit 62975737bcaa6e0a2ecab981aa3e0c8f2ff10571
+Author: Brian Cameron <brian.cameron@oracle.com>
+Date:  Fri Jun 18 19:22:17 2010 +0100
+
+    Compile with Sun Studio
+
+ goo/ImgWriter.h           |    3 ++-
+ goo/JpegWriter.h          |    3 ++-
+ poppler/SplashOutputDev.cc |   6 ++++++
+ 3 files changed, 10 insertions(+), 2 deletions(-)
+
+commit 7cbe3d1521aea8b484efb8663e75684e05b6fb61
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Thu Jun 17 23:01:21 2010 +0100
+
+    Optimize Splash::compositeBackground
+
+    Optimization takes into account the two most common cases, the
+    pixel not
+    being painted at all (alpha == 0) meaning we just copy the paperColor
+    and the pixel being opage meaning we have to do nothing
+
+ splash/Splash.cc |   34 ++++++++++++++++++++++++++--------
+ 1 file changed, 26 insertions(+), 8 deletions(-)
+
+commit f323e5e4cdcc20075ee7c722f7adc088c0772249
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Thu Jun 17 22:59:37 2010 +0100
+
+    Check the objects are num before reading them
+
+    Might have caused the kde bug #241995
+
+ poppler/GfxState.cc |  11 +++++++----
+ 1 file changed, 7 insertions(+), 4 deletions(-)
+
+commit 35e87d2062b1d82db0d765de5a6187122a0fa99c
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Wed Jun 16 11:52:25 2010 +0200
+
+    [gib-demo] Add demo for poppler_page_get_text_layout()
+
+ glib/demo/text.c |  182
+ ++++++++++++++++++++++++++++++++++++++++++++++++------
+ 1 file changed, 164 insertions(+), 18 deletions(-)
+
+commit ddcea568b3a7334e062d6214f43d0a2c2ec95be4
+Author: Daniel Garcia <danigm@yaco.es>
+Date:  Tue Jun 15 16:57:32 2010 +0200
+
+    [glib] Add poppler_page_get_text_layout()
+
+    Returns an array of PopplerRectangle items and each Rectangle is a
+    text character position.
+
+    The position in this array represent the offset in text returned by
+    poppler_page_get_text
+
+ glib/poppler-page.cc |   91
+ ++++++++++++++++++++++++++++++++++++++++++++++++++
+ glib/poppler-page.h  |    4 ++-
+ 2 files changed, 94 insertions(+), 1 deletion(-)
+
+commit 6e9fe8832c37b560ac4d0b0e32d618bde70ee117
+Author: Pino Toscano <pino@kde.org>
+Date:  Wed Jun 16 00:22:59 2010 +0200
+
+    [Qt4] and support 'Print' named action here too...
+
+ qt4/src/poppler-annotation.cc |    2 ++
+ 1 file changed, 2 insertions(+)
+
+commit 53c003f36af5d77f50fe238eaec4c5f7c3a485c7
+Author: Pino Toscano <pino@kde.org>
+Date:  Wed Jun 16 00:18:13 2010 +0200
+
+    [CMake] install the new goo/GooLikely.h
+
+ CMakeLists.txt |    1 +
+ 1 file changed, 1 insertion(+)
+
+commit 2ba752aabc8dad4bb35a351697b1590795c54ca4
+Author: Pino Toscano <pino@kde.org>
+Date:  Wed Jun 16 00:06:30 2010 +0200
+
+    update copyrights
+
+ qt4/src/poppler-link.h  |    3 ++-
+ qt4/src/poppler-page.cc |    1 +
+ 2 files changed, 3 insertions(+), 1 deletion(-)
+
+commit 38bf54bbad40288be763c6a1a89d90477c9ef89d
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Tue Jun 15 23:05:43 2010 +0100
+
+    move the declaration of likely/unlikely to an own file in goo/
+
+ goo/GooLikely.h  |   22 ++++++++++++++++++++++
+ goo/Makefile.am  |    1 +
+ poppler/Object.h |    9 +--------
+ splash/Splash.cc |    4 +---
+ 4 files changed, 25 insertions(+), 11 deletions(-)
+
+commit 9838edf8c7497858e3bac2743784a3259f61cfdd
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Tue Jun 15 22:54:34 2010 +0100
+
+    Protect us against negative y coordinates
+
+    Happens very rarely, like in bug 28480
+
+ splash/Splash.cc |    6 ++++++
+ 1 file changed, 6 insertions(+)
+
+commit 8b32c3e9826d4462fd9d16fab4200ebb23251046
+Author: Pino Toscano <pino@kde.org>
+Date:  Tue Jun 15 23:55:01 2010 +0200
+
+    [Qt4/apidox] ok, now the *proper* version for 'Print'...
+
+ qt4/src/poppler-link.h |    2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit b54e5ac49f69bd1c906e517edcb436e042199cd5
+Author: Pino Toscano <pino@kde.org>
+Date:  Tue Jun 15 23:53:50 2010 +0200
+
+    [Qt4/apidox] add the proper version for the new 'Print'
+
+ qt4/src/poppler-link.h |    3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+commit 71ad18c3b6b73e23d71600d07ce00bdfaf0bef60
+Author: Pino Toscano <pino@kde.org>
+Date:  Tue Jun 15 23:51:01 2010 +0200
+
+    [Qt4] recognize the 'Print' named action here too
+
+ qt4/src/poppler-annotation.cc |    3 +++
+ 1 file changed, 3 insertions(+)
+
+commit 96f60f2748ba76de0d296a9838dbd7181f506e36
+Author: Guillermo Amaral <gamaral@kdab.com>
+Date:  Tue Jun 15 23:47:46 2010 +0200
+
+    [Qt4] recognize 'Print' as name in named actions
+
+ qt4/src/poppler-link.h  |    3 ++-
+ qt4/src/poppler-page.cc |    2 ++
+ 2 files changed, 4 insertions(+), 1 deletion(-)
+
+commit 25494311c5b8eb88d43df420ec91a1aedad20d05
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Tue Jun 15 17:44:23 2010 +0200
+
+    [glib] Add some G_UNLIKELY()
+
+ glib/poppler-document.cc |   12 ++++++------
+ glib/poppler-page.cc    |   17 ++++++++++-------
+ 2 files changed, 16 insertions(+), 13 deletions(-)
+
+commit 52f133fb962256edb577b7f639c5c13221c6365d
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Tue Jun 15 14:20:49 2010 +0200
+
+    [glib] Use g_slice for actions and destinations
+
+ glib/poppler-action.cc |   21 +++++++++------------
+ 1 file changed, 9 insertions(+), 12 deletions(-)
+
+commit f035c94d8b5b34c0c3bb47b8cfc2f9c720a4fc71
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Tue Jun 15 14:01:07 2010 +0200
+
+    [glib] Use g_slice_dup in _copy() function for iterators
+
+ glib/poppler-document.cc |    9 +++------
+ 1 file changed, 3 insertions(+), 6 deletions(-)
+
+commit c84f69681828c7e3b969f666f9b84f1531976c6f
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Tue Jun 15 13:57:18 2010 +0200
+
+    [glib] Use g_slice for mappings and PopplerRectangle
+
+ glib/poppler-page.cc |   50
+ ++++++++++++++++++--------------------------------
+ 1 file changed, 18 insertions(+), 32 deletions(-)
+
+commit e12b9ab105f3b56b47ded871693b939ed421c853
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Tue Jun 15 13:49:27 2010 +0200
+
+    [glib] Use poppler_image_mapping_free() instead of g_free()
+
+ glib/poppler-page.cc |    2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit fb791a15f7472042fb2174e6f5df6924dd4eeb9b
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Tue Jun 15 13:37:52 2010 +0200
+
+    [glib] Remove poppler_mapping_free and use poppler_link_mapping_free
+    instead
+
+ glib/poppler-page.cc |    9 +--------
+ 1 file changed, 1 insertion(+), 8 deletions(-)
+
+commit 6186d7220e545eb89597626933a10acd0cd25173
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Tue Jun 15 13:16:59 2010 +0200
+
+    [glib] Use _new() methods instead of g_new() to create boxed structs
+
+ glib/poppler-page.cc |    6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
+
+commit 44639cb7b10ab6d66122ae2b6b7f3e5745f933bd
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Tue Jun 15 10:39:00 2010 +0200
+
+    [glib-demo] Use poppler_rectangle_free() instead of g_free()
+
+ glib/demo/find.c |    2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 3ca304f3837af27ae49541a5f441d8729264a945
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Mon Jun 14 19:16:41 2010 +0100
+
+    Add more caching to ObjectStreams
+
+    Makes opening of file from bug 26759 ten times faster
+
+ poppler/XRef.cc |   62
+ +++++++++++++++++++++++++++++++++++++++++++++++--------
+ poppler/XRef.h  |    4 ++--
+ 2 files changed, 55 insertions(+), 11 deletions(-)
+
+commit cc2e5f190e19ee8169f67df2541302a2816873d3
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Mon Jun 14 18:17:01 2010 +0200
+
+    [glib-demo] Support password protected documents
+
+ glib/demo/main.c |  175
+ ++++++++++++++++++++++++++++++++++++++++++++++++++++--
+ 1 file changed, 170 insertions(+), 5 deletions(-)
+
+commit 34b2dbb6bbaf0189c92eea6b7924999ab2b6ad11
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Mon Jun 14 17:41:51 2010 +0200
+
+    [glib-demo] Remove GLIB_CHECK_VERSION(), we already depend on
+    glib 2.18
+
+ glib/demo/attachments.c |    5 -----
+ glib/demo/main.c       |   32 +-------------------------------
+ 2 files changed, 1 insertion(+), 36 deletions(-)
+
+commit a52670a46c0561025d8b86cd2865603f0720c695
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Sun Jun 13 15:31:15 2010 +0100
+
+    do not distribute these two files
+
+    they are generated on configure/cmake time and depend on the machine
+
+ glib/Makefile.am    |   7 +++----
+ poppler/Makefile.am |   4 ++--
+ 2 files changed, 5 insertions(+), 6 deletions(-)
+
+commit eb0206ba8458f1dba004ac7bef856dcbb2ccbba5
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Wed Jun 9 18:56:16 2010 +0100
+
+    we need to ship these two files
+
+    Bug 28458
+
+ Makefile.am |   2 ++
+ 1 file changed, 2 insertions(+)
+
+commit 7dfdf1ee293b7d36a049a90d8a17462ed0e50f2c
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Tue Jun 8 21:54:52 2010 +0100
+
+    Typo--
+
+ utils/pdftoppm.1 |    2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 57cc04ee1a122794b338c0d9818dbdaea46a42d6
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Tue Jun 8 21:49:40 2010 +0100
+
+    Add cropbox to the manpage
+
+ utils/pdftoppm.1 |    3 +++
+ 1 file changed, 3 insertions(+)
+
+commit f9e6cb9647981f7afbb20261b3ccedaf003657d2
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Tue Jun 8 20:43:11 2010 +0100
+
+    0.14.0
+
+ CMakeLists.txt   |    4 ++--
+ NEWS            |   18 ++++++++++++++++++
+ configure.ac    |    4 ++--
+ cpp/Doxyfile    |    2 +-
+ qt4/src/Doxyfile |    2 +-
+ 5 files changed, 24 insertions(+), 6 deletions(-)
+
+commit 963afdc39153fee69ecb939c98deeef4f64638de
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Tue Jun 8 20:29:58 2010 +0100
+
+    libpoppler-qt4.so.3.2.0 -> libpoppler-qt4.so.3.3.0
+
+ qt4/src/CMakeLists.txt |    2 +-
+ qt4/src/Makefile.am   |    2 +-
+ 2 files changed, 2 insertions(+), 2 deletions(-)
+
+commit c1629be8011f3bddbf619246090640d62136d521
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Tue Jun 8 20:23:00 2010 +0100
+
+    Increase soname as _PopplerActionMovie struct grew
+
+ glib/CMakeLists.txt |   2 +-
+ glib/Makefile.am    |   2 +-
+ 2 files changed, 2 insertions(+), 2 deletions(-)
+
+commit 5ef45b1e72aed88ece0905b1204edee641f3c8fc
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Tue Jun 8 19:35:20 2010 +0100
+
+    Do not exit when trying to allocate memory for the XRef fails
+
+    See bug 28406
+
+ poppler/XRef.cc |    6 +++++-
+ 1 file changed, 5 insertions(+), 1 deletion(-)
+
+commit e7a5e9f70ee1283a2ca6734552d905279c97989b
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Fri Jun 4 08:46:33 2010 +0100
+
+    a bit of docu
+
+ poppler/Object.h |    2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 9ff4dab2558f7c2700fd7fcaccacdad9619dbdda
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Fri Jun 4 08:44:34 2010 +0100
+
+    Add support for unsigned integer numbers
+
+    So files store their P as a 32 bit unsigned instead of as a 32 bit
+    signed, making us to overflow our objInt parsing and rejecting to open
+    the file, this patch introduces objUint that only happens when the
+    number is not real, does not fit in a 32 bit integer but still fits
+    in a
+    32 bit unsigned integer
+
+ poppler/Lexer.cc          |   32 +++++++++++++++++++++++++-------
+ poppler/Object.cc         |    5 ++++-
+ poppler/Object.h          |   14 +++++++++++---
+ poppler/SecurityHandler.cc |  22 ++++++++++++++++++++++
+ 4 files changed, 62 insertions(+), 11 deletions(-)
+
+commit 41e9af7f505dbfbda36f6ac97df90f2a42ab3160
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Tue Jun 1 21:40:07 2010 +0100
+
+    If the document is not encrypted it is ok to print
+
+ poppler/XRef.cc |   16 ++++++++++------
+ 1 file changed, 10 insertions(+), 6 deletions(-)
+
+commit b15c793a8a58b17a7fe7b32c1037726e1e0e1bf0
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Tue Jun 1 20:57:16 2010 +0100
+
+    Check it is a stream, not that it is not none
+
+    People is reporting aborts, e.g. KDE bug 240208
+    but can not check if this really fixes it since he can not share the
+    document
+
+ poppler/Lexer.h |    8 ++++----
+ 1 file changed, 4 insertions(+), 4 deletions(-)
+
+commit a72c68117ba05f3934e2df227cdcaf53a375f0ce
+Author: Pino Toscano <pino@kde.org>
+Date:  Fri May 28 18:11:02 2010 +0200
+
+    [cpp apidox] add a start of API documentation for the 'page' class
+
+ cpp/poppler-page.cpp |   68
+ ++++++++++++++++++++++++++++++++++++++++++++++++++
+ 1 file changed, 68 insertions(+)
+
+commit acf7729e8e270e1b4b2a552272dc280ae6d7b352
+Author: Pino Toscano <pino@kde.org>
+Date:  Fri May 28 17:38:35 2010 +0200
+
+    [cpp] fix the font_iterator current page status
+
+ cpp/poppler-font.cpp |    8 ++++++--
+ 1 file changed, 6 insertions(+), 2 deletions(-)
+
+commit 4e017ff24a01cbbf1b39eedc3d7697f8b180fdd9
+Author: Pino Toscano <pino@kde.org>
+Date:  Fri May 28 17:15:28 2010 +0200
+
+    [cpp apidox] add API documentation for the 'font_info' and
+    'font_iterator' classes
+
+ cpp/poppler-font.cpp |   71
+ ++++++++++++++++++++++++++++++++++++++++++++++++++
+ 1 file changed, 71 insertions(+)
+
+commit 2ff840b62e41e2fc98e9fcff7330f40216de58a5
+Author: Pino Toscano <pino@kde.org>
+Date:  Fri May 28 14:34:37 2010 +0200
+
+    [cpp] move the actual convert_date(const char*) implementation in
+    the detail
+
+    this way it is possible to call it from inside poppler-cpp without
+    an implicit conversion to std::string
+
+ cpp/poppler-document.cpp      |    2 +-
+ cpp/poppler-embedded-file.cpp |    4 ++--
+ cpp/poppler-global.cpp        |   23 ++---------------------
+ cpp/poppler-private.cpp       |   25 +++++++++++++++++++++++++
+ cpp/poppler-private.h        |    2 ++
+ 5 files changed, 32 insertions(+), 24 deletions(-)
+
+commit 8112e9111313eaded4cd2e89d0e67efb0f3e29db
+Author: Pino Toscano <pino@kde.org>
+Date:  Fri May 28 13:13:50 2010 +0200
+
+    [cpp] add a time_type typedef
+
+    ... defined as unsigned int, and use it all around
+    (it changes nothing for client code)
+
+ cpp/poppler-document.cpp      |    8 ++++----
+ cpp/poppler-document.h        |    2 +-
+ cpp/poppler-embedded-file.cpp |    4 ++--
+ cpp/poppler-embedded-file.h   |    4 ++--
+ cpp/poppler-global.cpp        |    4 ++--
+ cpp/poppler-global.h         |    4 +++-
+ 6 files changed, 14 insertions(+), 12 deletions(-)
+
+commit bc5bdb43b12437e00aaddc27a74b9ac4b6498446
+Author: Pino Toscano <pino@kde.org>
+Date:  Fri May 28 13:01:53 2010 +0200
+
+    use the proper type for iterating on a GooVector
+
+ poppler/XRef.cc |    2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 87128ab0dfec6be1a034361512ee41301b078831
+Author: Maciej Mrozowski <reavertm@gmail.com>
+Date:  Thu May 27 17:31:00 2010 +0200
+
+    [CMake] Do not force -O2, preserve compiler flags instead.
+
+ cmake/modules/PopplerMacros.cmake |   4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 241c338facb45641ef1a271c904355a014bbf28d
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Thu May 27 20:37:55 2010 +0100
+
+    Allow quality & progressive mode to be utilised in JpegWriter
+
+ goo/JpegWriter.cc     |   15 +++++++++++++--
+ goo/JpegWriter.h      |    4 ++++
+ splash/SplashBitmap.cc |   18 +++++++++---------
+ splash/SplashBitmap.h |    4 ++++
+ 4 files changed, 30 insertions(+), 11 deletions(-)
+
+commit 9eda6e8aaae412a9882141d1b5b8c7bf0c823c68
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Tue May 25 23:44:30 2010 +0100
+
+    Do not follow loops blindly
+
+    Fixes crash in pdf in bug 28172
+
+ poppler/XRef.cc |   21 +++++++++++++++------
+ poppler/XRef.h  |    7 ++++---
+ 2 files changed, 19 insertions(+), 9 deletions(-)
+
+commit bbee6e0c8c9b181f8d19c167c867d74a765685fb
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Tue May 25 23:13:38 2010 +0100
+
+    update copyright
+
+ poppler/JBIG2Stream.cc |    2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 80b72b9f2fd70395580205b8b176e0576e132cf5
+Author: Hib Eris <hib@hiberis.nl>
+Date:  Wed May 26 13:07:57 2010 +0200
+
+    [autotools] sync autotool build with cmake build
+
+    In addition to commit 69c2cf76cef9c190ac07726f60f1dccd3df5cb6d
+
+ poppler/poppler-config.h.in |   4 ++++
+ 1 file changed, 4 insertions(+)
+
+commit 30ea3ab8a1eecafb3366aef193910098fdb7ccc8
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Tue May 25 23:07:56 2010 +0100
+
+    Fix crash when parsing pdf in bug 28170
+
+    This code is a can of crashing worms :-7
+
+ poppler/JBIG2Stream.cc |   23 ++++++++++++++++-------
+ 1 file changed, 16 insertions(+), 7 deletions(-)
+
+commit b5a9021037c4e6cbbfd622433f3de693d1f47671
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Tue May 25 20:00:57 2010 +0100
+
+    0.13.4
+
+ CMakeLists.txt                                      |    2 +-
+ NEWS                                        |   16 ++++++++++++++++
+ configure.ac                                |    2 +-
+ cpp/Doxyfile                                |    2 +-
+ glib/reference/tmpl/poppler-action.sgml      |    5 +++++
+ glib/reference/tmpl/poppler-annot.sgml       |   18 ++++++++++++++++++
+ glib/reference/tmpl/poppler-attachment.sgml  |    3 +++
+ glib/reference/tmpl/poppler-document.sgml    |    5 +++++
+ glib/reference/tmpl/poppler-enums.sgml       |   17 +++++++++++++++++
+ glib/reference/tmpl/poppler-features.sgml    |    3 +++
+ glib/reference/tmpl/poppler-form-field.sgml  |    3 +++
+ glib/reference/tmpl/poppler-layer.sgml       |    4 ++++
+ glib/reference/tmpl/poppler-page.sgml       |   13 +++++++++++++
+ glib/reference/tmpl/poppler-private.sgml     |    3 +++
+ glib/reference/tmpl/poppler.sgml            |    6 ++++++
+ glib/reference/tmpl/stamp-poppler-enums.sgml |    3 +++
+ qt4/src/Doxyfile                            |    2 +-
+ 17 files changed, 103 insertions(+), 4 deletions(-)
+
+commit 57ab0ebe993d79fe551bba58e0a70d55d32828f8
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Wed May 12 20:49:31 2010 +0100
+
+    better copyright
+
+ poppler/strtok_r.cpp |   23 +++++++++++++++++++++++
+ 1 file changed, 23 insertions(+)
+
+commit 69c2cf76cef9c190ac07726f60f1dccd3df5cb6d
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Wed May 12 20:47:25 2010 +0100
+
+    mingw does not provide strtok_r
+
+    Copy the glibc implementation
+
+ CMakeLists.txt                        |    1 +
+ poppler/Makefile.am           |    1 +
+ poppler/poppler-config.h.cmake |    4 +
+ poppler/strtok_r.cpp          |  189
+ ++++++++++++++++++++++++++++++++++++++++
+ 4 files changed, 195 insertions(+)
+
+commit 9e9b5e0d87a7450bd2223538673321ecec720c36
+Author: Marek Kasik <mkasik@redhat.com>
+Date:  Tue May 11 12:06:17 2010 +0200
+
+    Better check of overlapping of table cells when selecting text
+
+    Add check for overlapping of upper right cell with lower left cell
+    of assumed table (related to #3188).
+
+ poppler/TextOutputDev.cc |    5 ++++-
+ 1 file changed, 4 insertions(+), 1 deletion(-)
+
+commit a3e40b460b7690ef73ccf143b10da07e91d9ee7f
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Mon May 10 17:41:04 2010 +0200
+
+    [annots] Adjust bbox for line annots when y1 = y2
+
+    Some documents like pdf_commenting_new.pdf, have y1 = y2 but
+    line_width > 0, acroread renders the lines in such cases even
+    though the
+    annot bbox is empty.
+
+ poppler/Annot.cc |   10 ++++++++++
+ 1 file changed, 10 insertions(+)
+
+commit e30d24c506a9ff742f8af5d6c71273abeddaa265
+Author: Pino Toscano <pino@kde.org>
+Date:  Tue May 4 15:19:26 2010 +0200
+
+    [cpp] ustring::{from,to}_utf8(): fix in/out buffer sizes
+
+ cpp/poppler-global.cpp |    4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit aaa19a673020e12dbfceb4d25ade0ece7875fd83
+Author: Pino Toscano <pino@kde.org>
+Date:  Tue May 4 12:07:43 2010 +0200
+
+    [cpp] make the pkg-config files really working
+
+ poppler-cpp.pc.cmake |    6 +++++-
+ poppler-cpp.pc.in    |    6 +++++-
+ 2 files changed, 10 insertions(+), 2 deletions(-)
+
+commit 8f963ccde41ef1faa719254fccc5bdfe75e9fa87
+Author: Patrick Spendrin <ps_ml@gmx.de>
+Date:  Sun May 2 18:42:10 2010 +0200
+
+    Windows: define strtok_r as strtok_s
+
+ poppler/poppler-config.h.cmake |    4 ++++
+ poppler/poppler-config.h.in   |    4 ++++
+ 2 files changed, 8 insertions(+)
+
+commit c9d8df51c96e50ad72f7954baba2254259fc894c
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Sat May 1 19:52:51 2010 +0100
+
+    2010 in these copyrights
+
+ poppler/poppler-config.h.cmake |    2 +-
+ poppler/poppler-config.h.in   |    2 +-
+ 2 files changed, 2 insertions(+), 2 deletions(-)
+
+commit 9ce71fb35fdd66c55872956432160a5c76a62080
+Author: Jakub Wilk <ubanus@users.sf.net>
+Date:  Sat May 1 19:50:54 2010 +0100
+
+    Use strtok_r instead strtok
+
+    strtok is not thread safe
+
+ fofi/FoFiType1.cc           |    8 +++++---
+ poppler/CharCodeToUnicode.cc |    6 ++++--
+ poppler/GlobalParams.cc      |    6 ++++--
+ poppler/PDFDoc.cc           |    4 +++-
+ poppler/UnicodeMap.cc       |   21 ++++++++++++++++++---
+ 5 files changed, 34 insertions(+), 11 deletions(-)
+
+commit 6b2983f89e87792a393880dab6dc1fedb748db2c
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Fri Apr 30 14:48:50 2010 +0200
+
+    [cairo] Set device offset and matrix to smask depending on the
+    group target
+
+    It seems to fix all of my test cases. Fixes bug #27208.
+
+ poppler/CairoOutputDev.cc |   21 +++++++++++++++------
+ 1 file changed, 15 insertions(+), 6 deletions(-)
+
+commit ac32021704178721ee007a6b6831283e323e500f
+Author: Pino Toscano <pino@kde.org>
+Date:  Fri Apr 30 01:14:14 2010 +0200
+
+    demote the #warning to a simple FIXME comment
+
+ poppler/ArthurOutputDev.cc |   4 +---
+ 1 file changed, 1 insertion(+), 3 deletions(-)
+
+commit 8c1bc17552c989c15f318d9d109607a9a594ca6b
+Author: Pino Toscano <pino@kde.org>
+Date:  Fri Apr 30 01:12:19 2010 +0200
+
+    MSVC: define fmax() and fmin()
+
+    MSVC does not provide those functions, so we need to define them to
+    the existing max()/mix() macros.
+    Thanks to Patrick Spendrin for the hint!
+
+ poppler/poppler-config.h.cmake |    5 +++++
+ poppler/poppler-config.h.in   |    5 +++++
+ 2 files changed, 10 insertions(+)
+
+commit 71063d51a45835b0267a7e3f823ef49689cfd06f
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Thu Apr 29 20:28:07 2010 +0200
+
+    Make sure we are drawing text before calling endTextObject()
+
+    This is actually the right fix for the previous commit.
+
+ poppler/Gfx.cc |   10 +++++-----
+ 1 file changed, 5 insertions(+), 5 deletions(-)
+
+commit e909219d8e92994bd52976f9676015fa6ca9fc91
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Thu Apr 29 18:34:22 2010 +0200
+
+    Set textHaveCSPattern=false again before filling the pattern in
+    opEndText()
+
+    Fixes cairo backend regressions caused by commit
+    ccf238b32e236f69c0507a5421ac2649dfa8d865.
+
+ poppler/Gfx.cc |    4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 29572d6ac7829b60efce2d8e489473c55e370f26
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Tue Apr 27 23:39:23 2010 +0100
+
+    fabs for doubles
+
+ poppler/TextOutputDev.cc |   24 ++++++++++++------------
+ 1 file changed, 12 insertions(+), 12 deletions(-)
+
+commit 4905e2bd764ea601e3bf9c5195c740e5bf186af5
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Tue Apr 27 23:34:34 2010 +0100
+
+    fix include
+
+ splash/SplashBitmap.cc |    1 +
+ 1 file changed, 1 insertion(+)
+
+commit f9f0e4b747a1527bd6354897cdba7954d58651de
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Tue Apr 27 14:26:23 2010 +0200
+
+    Fix first color stop offset of linear gradients
+
+    Fixes bug #27837.
+
+ poppler/Gfx.cc |    2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 5b822011029f3721fbafd4a7bf01b9d6fee35d25
+Author: Pino Toscano <pino@kde.org>
+Date:  Sat Apr 24 18:18:08 2010 +0200
+
+    include standard float.h instead of unportable values.h
+
+ poppler/TextOutputDev.cc |    2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit dee7cb8691528293bb5b8f266970cdb6771e301b
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Sat Apr 24 15:39:23 2010 +0100
+
+    0.13.3
+
+ CMakeLists.txt   |    2 +-
+ NEWS            |   31 +++++++++++++++++++++++++++++++
+ configure.ac    |    2 +-
+ cpp/Doxyfile    |    2 +-
+ qt4/src/Doxyfile |    2 +-
+ 5 files changed, 35 insertions(+), 4 deletions(-)
+
+commit 07864c9e2a7a32b48bdbab92c8b2f79bce1d9f5b
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Sat Apr 24 13:07:02 2010 +0100
+
+    minor cleanups
+
+ utils/HtmlLinks.cc |  15 ++-------------
+ utils/HtmlLinks.h  |  16 ++++++++++++++--
+ 2 files changed, 16 insertions(+), 15 deletions(-)
+
+commit e501eabb2f0775444a2bf64005a3a3f1ffa281b4
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Sat Apr 24 13:06:12 2010 +0100
+
+    Do not assume the parameter will have more than 5 chars
+
+ utils/pdftohtml.cc |  30 ++++++++++++++++++------------
+ 1 file changed, 18 insertions(+), 12 deletions(-)
+
+commit 6cc4d571339214e9eeeb682ba48fb220cef905f9
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Sat Apr 24 13:04:05 2010 +0100
+
+    Fix end() to return the correct last valid value
+
+ goo/GooVector.h |    5 +++--
+ 1 file changed, 3 insertions(+), 2 deletions(-)
+
+commit 4ed53e30e735b79c46eab9d54883531c6e187b17
+Author: William Bader <williambader@hotmail.com>
+Date:  Fri Apr 23 22:52:24 2010 +0100
+
+    Silence some Illegal entry in bfrange block in ToUnicode CMap
+
+    Fixes #27728
+
+ poppler/CharCodeToUnicode.cc |    7 +++++--
+ 1 file changed, 5 insertions(+), 2 deletions(-)
+
+commit 16a004784043e2a8587c0c3c6d23889df8a80470
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Thu Apr 22 19:39:01 2010 +0100
+
+    Avoid the usage of std::
+
+ poppler/TextOutputDev.cc |   25 +++++++++++--------------
+ 1 file changed, 11 insertions(+), 14 deletions(-)
+
+commit a7dcb2b4ffee57b7f78529cbaeaab647ab93de86
+Author: Pino Toscano <pino@kde.org>
+Date:  Thu Apr 22 13:31:41 2010 +0200
+
+    Windows: include config.h in GlobalParamsWin.cc only if not included
+    already
+
+    GlobalParamsWin.cc is not compiled standalone but only #include'd by
+    GlobalParams.cc (on Windows only), so config.h has already included
+    already
+    as safety check, check for PACKAGE_NAME (#define'd in config.h)
+    before #include'ing it again
+
+ poppler/GlobalParamsWin.cc |   2 ++
+ 1 file changed, 2 insertions(+)
+
+commit fba076e17af24a9c9883504282316bba119a908c
+Author: Pino Toscano <pino@kde.org>
+Date:  Thu Apr 22 13:24:04 2010 +0200
+
+    avoid accidental max() macro replacement with some compilers (eg MSVC)
+
+    defining an empty macro and using it between "max" and "(", such
+    compilers won't try to replace their macro max(a, b) there; in any
+    case, empty spaces are just fine
+
+ poppler/TextOutputDev.cc |   11 +++++++----
+ 1 file changed, 7 insertions(+), 4 deletions(-)
+
+commit ccf238b32e236f69c0507a5421ac2649dfa8d865
+Author: Thomas Freitag <Thomas.Freitag@alfa.de>
+Date:  Wed Apr 21 19:21:37 2010 +0100
+
+    Improve colorizing text and masks in pattern colorspace
+
+    Bug #27482
+
+ poppler/Gfx.cc                    |  137
+ +++++++++++++++++++++-----------------------
+ poppler/Gfx.h             |    4 +-
+ poppler/SplashOutputDev.cc |  41 +++++++++++--
+ poppler/SplashOutputDev.h  |   3 +-
+ 4 files changed, 106 insertions(+), 79 deletions(-)
+
+commit 8e86dfb328d94939ecf390d34af533b831b2837b
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Wed Apr 21 19:19:53 2010 +0100
+
+    Add copyright
+
+ poppler/TextOutputDev.cc |    1 +
+ poppler/TextOutputDev.h  |    1 +
+ 2 files changed, 2 insertions(+)
+
+commit 6f9f3d33ff8058e28243ba45b8547e21ad0d088a
+Author: Andre Klapper <a9016009@gmx.de>
+Date:  Wed Apr 21 19:57:15 2010 +0200
+
+    [glib-demo] Compile with -DGSEAL_ENABLE
+
+    Fixes bug #27579.
+
+ glib/demo/images.c |   2 +-
+ glib/demo/layers.c |   4 ++--
+ glib/demo/render.c |   8 ++++----
+ 3 files changed, 7 insertions(+), 7 deletions(-)
+
+commit 6b14c18d60cae130869f9a5c7688dfe880602224
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Wed Apr 21 19:56:49 2010 +0200
+
+    [cairo] Make sure we always use a new path in doPath()
+
+    Fixes document
+    http://acroeng.adobe.com/Test_Files/images/transparency/Untitled-2.pdf
+    when rendering with cairo backend.
+
+ poppler/CairoOutputDev.cc |   1 +
+ 1 file changed, 1 insertion(+)
+
+commit 4f71d64c69500ed78daf4d797c8af6cfbd3d970e
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Wed Apr 21 11:44:49 2010 +0200
+
+    [cairo] Fix pattern size when bbox is not at 0,0
+
+ poppler/CairoOutputDev.cc |   11 +++++++++--
+ 1 file changed, 9 insertions(+), 2 deletions(-)
+
+commit 9c5612f6e013a8698eff6531ec388a7e6c1fb89a
+Author: Marek Kasik <mkasik@redhat.com>
+Date:  Fri Feb 12 14:31:01 2010 +0100
+
+    Distinguish between columns and tables when selecting text
+
+    This commit add ability to detect tables in text by checking borders
+    of 4 neighbouring text blocks for arrangement (to the left, to
+    the right,
+    center, ...). Detected border of whole table is then stored in
+    ExMin, ExMax,
+    EyMin and EyMax of each block together with id of detected
+    table. Sorting
+    of blocks is then performed on the these borders to be able to
+    distinguish
+    tables from columns.
+    Pasting of selected text was modified so that tables are pasted
+    correctly
+    (even with multi line cells).
+
+ poppler/TextOutputDev.cc |  490
+ ++++++++++++++++++++++++++++++++++++++++------
+ poppler/TextOutputDev.h  |    5 +
+ 2 files changed, 437 insertions(+), 58 deletions(-)
+
+commit db014ffb357e760d9397544c5a8fe747cdb497ab
+Author: Brian Ewins <brian.ewins@gmail.com>
+Date:  Mon Nov 23 08:58:19 2009 +0000
+
+    Select top right to bottom left in RTL mode
+
+    This makes pure RTL selection work. Bidi is not handled at all.
+    Rendering of the selection is poor and the dumped text appears
+    to still be in reverse order to me.
+
+ poppler/TextOutputDev.cc |   57
+ ++++++++++++++++++++++++++++++++++------------
+ 1 file changed, 43 insertions(+), 14 deletions(-)
+
+commit b1d43fa052d9160c4f319a67415ecf3ebf2cf9b3
+Author: Brian Ewins <brian.ewins@gmail.com>
+Date:  Sun Nov 22 09:47:40 2009 +0000
+
+    Make pdftotext newlines match copy and paste
+
+    The output of pdftotext didn't insert line breaks,
+    resulting in jumbled text. Change the rules to
+    emit a newline at the end of each line unless
+    a hyphenation is being supressed, and an extra
+    newline at the end of each flow.
+
+ poppler/TextOutputDev.cc |   17 +++--------------
+ 1 file changed, 3 insertions(+), 14 deletions(-)
+
+commit f83b677a8eb44d65698b77edb13a5c7de3a72c0f
+Author: Brian Ewins <brian.ewins@gmail.com>
+Date:  Thu Nov 12 02:50:29 2009 +0000
+
+    Use a reading-order sort to order blocks
+
+    This switches the block sort from XY to reading order,
+    using the rules from T. Breuel's "High Performance
+    Document Layout Analysis".
+
+    Signed-off-by: Brian Ewins <brian.ewins@gmail.com>
+
+ poppler/TextOutputDev.cc |  164
+ ++++++++++++++++++++++++++++++++++++++++++++--
+ poppler/TextOutputDev.h  |    8 +++
+ 2 files changed, 167 insertions(+), 5 deletions(-)
+
+commit a2191a4d45e0abaec97c19aacae37c4c5824bd36
+Author: Brian Ewins <brian.ewins@gmail.com>
+Date:  Mon Nov 9 06:24:51 2009 +0000
+
+    Separate flow construction from reading order
+
+    If the blocks were already in reading order, then
+    constructing flows is simplified, since blocks
+    cannot be picked out-of-order. Make this change
+    first in preparation for adding a reading-order
+    sort.
+
+    Signed-off-by: Brian Ewins <brian.ewins@gmail.com>
+
+ poppler/TextOutputDev.cc |   96
+ ++++++++--------------------------------------
+ 1 file changed, 17 insertions(+), 79 deletions(-)
+
+commit 345ed51af9b9e7ea53af42727b91ed68dcc52370
+Author: Brian Ewins <brian.ewins@gmail.com>
+Date:  Thu Oct 29 01:46:29 2009 +0000
+
+    Fix bug 3188, text selection across table cells
+
+    Bug 3188. When selecting text, poppler goes across the whole
+    page then down, rather than across each cell, down that cell,
+    then across to the next cell. This leads to illegible paste
+    results.
+
+    Teach TextPage to visit the selection in flow order rather than
+    block order.
+
+    Signed-off-by: Brian Ewins <brian.ewins@gmail.com>
+
+ poppler/TextOutputDev.cc |  334
+ ++++++++++++++++++++++++----------------------
+ 1 file changed, 178 insertions(+), 156 deletions(-)
+
+commit 12d83931ae1b899b70c7ea5c01f03f123b1bb9a8
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Sun Apr 18 17:53:48 2010 +0200
+
+    [cairo] Check pattern status after setting matrix when rendering
+    images
+
+    Fixes rendering of document attached to kde bug
+    http://bugs.kde.org/show_bug.cgi?id=135417.
+
+ poppler/CairoOutputDev.cc |   34 ++++++++++++++++++++++++++++++++++
+ 1 file changed, 34 insertions(+)
+
+commit ff6d501a2fc887fd49a985161f756d6d6b8e6c0d
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Sun Apr 18 17:51:42 2010 +0200
+
+    [cairo] Fix a crash when rendering 0x0 images
+
+    See kde bug http://bugs.kde.org/show_bug.cgi?id=135417
+
+ poppler/CairoOutputDev.cc |   3 +++
+ 1 file changed, 3 insertions(+)
+
+commit 84cd2186861436fbaa7c29aa691e69fcd543a1c2
+Author: Hib Eris <hib@hiberis.nl>
+Date:  Tue Apr 13 23:42:28 2010 +0200
+
+    Properly initialize variable
+
+ poppler/CachedFile.cc |    1 +
+ 1 file changed, 1 insertion(+)
+
+commit 24f244f486f332b0bd76c6525c5d9d03168a76e6
+Author: Hib Eris <hib@hiberis.nl>
+Date:  Tue Apr 13 23:54:28 2010 +0200
+
+    pdftops: require output filename when reading from stdin
+
+ utils/pdftops.cc |    3 +++
+ 1 file changed, 3 insertions(+)
+
+commit 955f9f53ff225f6794a494fdd0f0fe5ee1a41d88
+Author: Hib Eris <hib@hiberis.nl>
+Date:  Tue Apr 13 23:47:40 2010 +0200
+
+    pdftotext: require output filename when reading from stdin
+
+ utils/pdftotext.cc |   3 +++
+ 1 file changed, 3 insertions(+)
+
+commit 31388aa8b5117619878431b7fed2d033000af541
+Author: Hib Eris <hib@hiberis.nl>
+Date:  Tue Apr 13 23:27:20 2010 +0200
+
+    pdftohtml: require output filename when reading from stdin
+
+ utils/pdftohtml.cc |   3 +++
+ 1 file changed, 3 insertions(+)
+
+commit a8d43ec1c7f5448a7f63d9bbd9062d56ee1c7c58
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Wed Apr 14 19:21:33 2010 +0100
+
+    update XOPEN_SOURCE to 600 in non standard compile options
+
+    it seems helps compiling on some BSD
+
+ cmake/modules/PopplerMacros.cmake |   2 +-
+ configure.ac                     |    2 +-
+ 2 files changed, 2 insertions(+), 2 deletions(-)
+
+commit 4cce1f14e964edf1bf2d9fb8286ee002a67dc212
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Tue Apr 13 21:57:16 2010 +0100
+
+    include strings.h on non windows platforms
+
+ poppler/GlobalParams.cc |    2 ++
+ test/perf-test.cc      |    2 ++
+ 2 files changed, 4 insertions(+)
+
+commit 55c76069c52f9f51c6b8c60fe1aa8de499012ea8
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Mon Apr 12 19:32:46 2010 +0200
+
+    [glib] Use existing cairo api when rendering to a pixbuf
+
+    I should fix bug #5589 for the GDK api too.
+
+ glib/poppler-page.cc |  227
+ +++++++++++++++++++++-----------------------------
+ 1 file changed, 93 insertions(+), 134 deletions(-)
+
+commit 51aefe1423a068e8c119c21a8791d265aecbeaf5
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Fri Apr 9 12:50:00 2010 +0200
+
+    [cairo] Implement colorizing image masks with pattern colorspace
+
+ poppler/CairoOutputDev.cc |   9 +++++++++
+ 1 file changed, 9 insertions(+)
+
+commit bd8f44289770175a17ac45e4788b0d374cc93d5a
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Fri Apr 9 12:02:38 2010 +0200
+
+    Partially revert "[cairo] Do not change device offset of mask surface"
+
+    This partially reverts commit
+    a32f6f9ebaed3e4827b9dc6cb37e307c2798f521.
+    It fixed bug #27208, but it's causing regressions on other documents.
+
+ poppler/CairoOutputDev.cc |   11 ++++++++++-
+ 1 file changed, 10 insertions(+), 1 deletion(-)
+
+commit bcb405c43fb7140f5d601d00de4d30913a0050ef
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Thu Apr 8 12:02:48 2010 +0200
+
+    Pages were always created without forms by Catalog
+
+    Use getForm() instead of form when creating a page object.
+
+ poppler/Catalog.cc |   2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit d46581c574b3088a82555cbc3b76e95e2571b9c0
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Wed Apr 7 20:25:23 2010 +0100
+
+    Fix destructor
+
+ poppler/Catalog.cc |  19 +++++++------------
+ poppler/Catalog.h  |   3 +--
+ 2 files changed, 8 insertions(+), 14 deletions(-)
+
+commit ab14433f8b3d7c67f279cece65dfdd40c6675ac0
+Author: Hib Eris <hib@hiberis.nl>
+Date:  Thu Mar 25 15:33:33 2010 +0100
+
+    Parse Form on demand
+
+ poppler/Catalog.cc |  21 +++++++++++++--------
+ poppler/Catalog.h  |   2 +-
+ 2 files changed, 14 insertions(+), 9 deletions(-)
+
+commit c72a2c7f70b13a7b7b531b3c983d9a9bc104bac7
+Author: Hib Eris <hib@hiberis.nl>
+Date:  Thu Mar 25 17:33:11 2010 +0100
+
+    Parse Names on demand
+
+ poppler/Catalog.cc |  112
+ ++++++++++++++++++++++++++++++++++++++++++----------
+ poppler/Catalog.h  |  18 ++++++---
+ 2 files changed, 104 insertions(+), 26 deletions(-)
+
+commit 32053360c93607cf9bdc092257cefad5d4df9ec5
+Author: Hib Eris <hib@hiberis.nl>
+Date:  Thu Mar 25 16:32:22 2010 +0100
+
+    Parse Dests on demand
+
+ poppler/Catalog.cc |  27 +++++++++++++++++++++------
+ poppler/Catalog.h  |   2 +-
+ 2 files changed, 22 insertions(+), 7 deletions(-)
+
+commit da0f8e69eecb944e128474f62829f729eeabd189
+Author: Hib Eris <hib@hiberis.nl>
+Date:  Thu Mar 25 16:48:07 2010 +0100
+
+    Parse Outline on demand in PDFDoc
+
+ poppler/PDFDoc.cc |   17 ++++++++++++-----
+ poppler/PDFDoc.h  |   2 +-
+ 2 files changed, 13 insertions(+), 6 deletions(-)
+
+commit d7a69c8cad112cb6616d0192d8a4028fdaee2f73
+Author: Hib Eris <hib@hiberis.nl>
+Date:  Thu Mar 25 16:05:02 2010 +0100
+
+    Parse Outline on demand
+
+ poppler/Catalog.cc |  23 ++++++++++++++++++++---
+ poppler/Catalog.h  |   2 +-
+ 2 files changed, 21 insertions(+), 4 deletions(-)
+
+commit c149e027fa76824221a78fe6d3bf9bfe953491d4
+Author: Hib Eris <hib@hiberis.nl>
+Date:  Thu Mar 25 15:51:51 2010 +0100
+
+    Parse StructTreeRoot on demand
+
+ poppler/Catalog.cc |  22 +++++++++++++++++++---
+ poppler/Catalog.h  |   2 +-
+ 2 files changed, 20 insertions(+), 4 deletions(-)
+
+commit 3c6effe44d6d97f175c2ee7f3913d8c4ba34d612
+Author: Hib Eris <hib@hiberis.nl>
+Date:  Thu Mar 25 14:55:22 2010 +0100
+
+    Parse Metadata on demand
+
+ poppler/Catalog.cc |  16 +++++++++++++---
+ 1 file changed, 13 insertions(+), 3 deletions(-)
+
+commit 749d67ea2346a3453ef41dc37ba59d419ad900b0
+Author: Hib Eris <hib@hiberis.nl>
+Date:  Thu Mar 25 15:09:58 2010 +0100
+
+    Parse PageLabelInfo on demand
+
+ poppler/Catalog.cc |  37 +++++++++++++++++++++++++++++--------
+ poppler/Catalog.h  |   3 +++
+ 2 files changed, 32 insertions(+), 8 deletions(-)
+
+commit 78f7d106714fa489a66c39410163a6902ba24856
+Author: Hib Eris <hib@hiberis.nl>
+Date:  Sat Mar 27 14:43:57 2010 +0100
+
+    Parse PageMode and PageLayout on demand
+
+ poppler/Catalog.cc |  109
+ +++++++++++++++++++++++++++++++++++-----------------
+ poppler/Catalog.h  |  11 ++++--
+ 2 files changed, 81 insertions(+), 39 deletions(-)
+
+commit f5dd5be64d09186ee289632c1a61979d15edd605
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Wed Apr 7 19:48:39 2010 +0200
+
+    Fix saving update docs that have a compressed xref table
+
+     - Use the original xref table size as Size field in the trailer
+       dictionary to make sure size = maxObjId + 1
+
+     - Use the right generation number for compressed objects that which
+       must be 0. gen field in xref entry for compressed objects is the
+       index of the object in the stream, not the generation number.
+
+    Fixes bug #27450.
+
+ poppler/PDFDoc.cc |   9 ++++-----
+ 1 file changed, 4 insertions(+), 5 deletions(-)
+
+commit 3f302fdd78cd78873bf5376af84e83741a8daadb
+Author: Pino Toscano <pino@kde.org>
+Date:  Tue Apr 6 23:58:46 2010 +0200
+
+    use a GooVector<bool> instead of a non-standard variable-length-array
+
+ poppler/CachedFile.cc |    6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
+
+commit 425a62b5fa8e4e69bfc1c64ed126b5baac06d78a
+Author: Hib Eris <hib@hiberis.nl>
+Date:  Tue Apr 6 10:57:30 2010 +0200
+
+    pdfutils: fix deleting fileName
+
+ utils/pdfinfo.cc  |   2 +-
+ utils/pdftoabw.cc |   2 +-
+ 2 files changed, 2 insertions(+), 2 deletions(-)
+
+commit 198c9d61ba93ba62ea2da44a23cd948d43556c3e
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Tue Apr 6 22:00:14 2010 +0100
+
+    Use the topleft of the Rect of text annots to draw
+
+    Not use the full rect when we are drawing "our" notes
+
+ poppler/Annot.cc |    9 +++++++--
+ 1 file changed, 7 insertions(+), 2 deletions(-)
+
+commit 1422802f029483ad3e62a3a13e66b2d3990ac58f
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Tue Apr 6 12:32:12 2010 +0200
+
+    [cairo] Use current fill_opacity when drawing soft masked images
+
+    Fixes GNOME Bug https://bugzilla.gnome.org/show_bug.cgi?id=614915
+
+ poppler/CairoOutputDev.cc |   27 ++++++++++++++++++++-------
+ 1 file changed, 20 insertions(+), 7 deletions(-)
+
+commit c152d30f879e6cde45de58bb9249035e127e84e7
+Author: Hib Eris <hib@hiberis.nl>
+Date:  Mon Apr 5 18:55:29 2010 +0200
+
+    delete fileName in utils
+
+ utils/pdftohtml.cc |   1 +
+ utils/pdftops.cc   |   1 +
+ utils/pdftotext.cc |   1 +
+ 3 files changed, 3 insertions(+)
+
+commit f091c83414ab32a4ecf1fa2bd15f13a3cf113a86
+Author: Hib Eris <hib@hiberis.nl>
+Date:  Mon Apr 5 20:12:01 2010 +0100
+
+    add some docu
+
+ poppler/CachedFile.h        |   30 ++++++++++++++++++++++++++++++
+ poppler/CurlPDFDocBuilder.h  |    2 ++
+ poppler/LocalPDFDocBuilder.h |    2 ++
+ poppler/PDFDocBuilder.h      |    9 +++++++++
+ poppler/PDFDocFactory.h      |   12 ++++++++++++
+ poppler/StdinPDFDocBuilder.h |    2 ++
+ 6 files changed, 57 insertions(+)
+
+commit fc071d800cb4329a3ccf898d7bf16b4db7323ad8
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Mon Apr 5 19:11:26 2010 +0100
+
+    Rework DCTStream error handling, should work better now
+
+    Fixes bug 26280
+
+ poppler/DCTStream.cc  |   35 ++++++++++++++---------------------
+ poppler/DCTStream.h   |    5 +++--
+ utils/HtmlOutputDev.cc |    4 ++--
+ 3 files changed, 19 insertions(+), 25 deletions(-)
+
+commit a9d801b2db20ecb08734ee5cdb703abf11994b6e
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Mon Apr 5 16:55:02 2010 +0100
+
+    Make some paremeters const & to clearly show we just read them
+
+ poppler/CachedFile.cc        |   18 ++++++++++--------
+ poppler/CachedFile.h         |    8 +++++---
+ poppler/CurlCachedFile.cc     |    9 +++++----
+ poppler/CurlCachedFile.h      |    3 ++-
+ poppler/CurlPDFDocBuilder.cc  |    9 +++++----
+ poppler/CurlPDFDocBuilder.h   |    5 +++--
+ poppler/LocalPDFDocBuilder.cc |   15 ++++++++-------
+ poppler/LocalPDFDocBuilder.h  |    5 +++--
+ poppler/PDFDocBuilder.h       |    5 +++--
+ poppler/PDFDocFactory.cc      |    7 ++++---
+ poppler/PDFDocFactory.h       |    3 ++-
+ poppler/StdinCachedFile.cc    |    3 ++-
+ poppler/StdinCachedFile.h     |    3 ++-
+ poppler/StdinPDFDocBuilder.cc |    7 ++++---
+ poppler/StdinPDFDocBuilder.h  |    5 +++--
+ utils/pdffonts.cc            |    4 ++--
+ utils/pdfimages.cc           |    4 ++--
+ utils/pdfinfo.cc             |    4 ++--
+ utils/pdftoabw.cc            |    4 ++--
+ utils/pdftohtml.cc           |    4 ++--
+ utils/pdftoppm.cc            |    2 +-
+ utils/pdftops.cc             |    4 ++--
+ utils/pdftotext.cc           |    4 ++--
+ 23 files changed, 76 insertions(+), 59 deletions(-)
+
+commit a04ee3ea6066c97d41fc40d5d97c600a1870855a
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Mon Apr 5 16:50:58 2010 +0100
+
+    forgot my (C)
+
+ poppler/Form.cc |    2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit ed723c8ac4a21a50d7d236cdcf7a635defd8dffb
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Mon Apr 5 16:50:15 2010 +0100
+
+    The copy constructor of GooString never worked, so do not use it
+
+ poppler/Form.cc |    2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit a28be8e4009b86fdfd92da928def194225a736c6
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Mon Apr 5 16:49:06 2010 +0100
+
+    Add some const correctnes to GooString
+
+ goo/GooString.cc |   12 ++++++------
+ goo/GooString.h  |   21 ++++++++++++---------
+ 2 files changed, 18 insertions(+), 15 deletions(-)
+
+commit 46aee9e4d225b88a3dfd4afbe57259f337bb15d3
+Author: Hib Eris <hib@hiberis.nl>
+Date:  Mon Apr 5 14:36:09 2010 +0200
+
+    Use PDFDocFactory in utils
+
+ utils/pdffonts.cc  |  16 ++++++++--------
+ utils/pdfimages.cc |  11 ++++++++++-
+ utils/pdfinfo.cc   |  31 +++++++------------------------
+ utils/pdftoabw.cc  |  10 +++++++++-
+ utils/pdftohtml.cc |  10 +++++++++-
+ utils/pdftoppm.cc  |  17 +++++++++++------
+ utils/pdftops.cc   |   9 ++++++++-
+ utils/pdftotext.cc |  14 +++++++-------
+ 8 files changed, 69 insertions(+), 49 deletions(-)
+
+commit d487a90688c4431075c9e4db040b3b02625e208f
+Author: Hib Eris <hib@hiberis.nl>
+Date:  Mon Apr 5 14:35:52 2010 +0200
+
+    Add PDFDocFactory
+
+ CMakeLists.txt                  |    2 ++
+ poppler/Makefile.am     |    2 ++
+ poppler/PDFDocFactory.cc |   71
+ ++++++++++++++++++++++++++++++++++++++++++++++
+ poppler/PDFDocFactory.h  |   42 +++++++++++++++++++++++++++
+ 4 files changed, 117 insertions(+)
+
+commit 869135920831fb0d15db734f3dcd7a67146cc241
+Author: Hib Eris <hib@hiberis.nl>
+Date:  Wed Feb 24 15:24:26 2010 +0100
+
+    Add CurlPDFDocBuilder
+
+ CMakeLists.txt                      |    2 ++
+ poppler/CurlPDFDocBuilder.cc |   46
+ ++++++++++++++++++++++++++++++++++++++++++
+ poppler/CurlPDFDocBuilder.h  |   30 +++++++++++++++++++++++++++
+ poppler/Makefile.am         |    6 ++++--
+ 4 files changed, 82 insertions(+), 2 deletions(-)
+
+commit ec5c6117a64f9cb03560091c4d7948d4287b6975
+Author: Hib Eris <hib@hiberis.nl>
+Date:  Thu Feb 25 11:23:28 2010 +0100
+
+    Add LocalPDFDocBuilder and StdinPDFDocBuilder
+
+ CMakeLists.txt                       |    4 ++++
+ poppler/LocalPDFDocBuilder.cc |   45
+ +++++++++++++++++++++++++++++++++++++++++
+ poppler/LocalPDFDocBuilder.h  |   30 +++++++++++++++++++++++++++
+ poppler/Makefile.am          |    4 ++++
+ poppler/StdinPDFDocBuilder.cc |   42
+ ++++++++++++++++++++++++++++++++++++++
+ poppler/StdinPDFDocBuilder.h  |   30 +++++++++++++++++++++++++++
+ 6 files changed, 155 insertions(+)
+
+commit 919b735d1c0b99bf72280aff8db87ba503954498
+Author: Hib Eris <hib@hiberis.nl>
+Date:  Sun Apr 4 11:05:35 2010 +0200
+
+    Add PDFDocBuilder
+
+ CMakeLists.txt                 |    1 +
+ poppler/Makefile.am    |    1 +
+ poppler/PDFDocBuilder.h |   32 ++++++++++++++++++++++++++++++++
+ 3 files changed, 34 insertions(+)
+
+commit 1ab07faf05661d6d92186974c4b1c279b6178747
+Author: Hib Eris <hib@hiberis.nl>
+Date:  Sun Apr 4 11:29:53 2010 +0200
+
+    Add PDFDoc::ErrorPDFDoc
+
+ poppler/PDFDoc.cc |   14 ++++++++++++++
+ poppler/PDFDoc.h  |   3 +++
+ 2 files changed, 17 insertions(+)
+
+commit efc7e5efeddd8f70b7c74573d3194aba0a7d4631
+Author: Hib Eris <hib@hiberis.nl>
+Date:  Sun Apr 4 11:17:37 2010 +0200
+
+    Cleanup PDFDoc
+
+ poppler/PDFDoc.cc |   40 +++++++++++++++-------------------------
+ poppler/PDFDoc.h  |   3 ++-
+ 2 files changed, 17 insertions(+), 26 deletions(-)
+
+commit 08a3435e67ebf21beac2fefcbd21ad65f9293fd1
+Author: Hib Eris <hib@hiberis.nl>
+Date:  Tue Feb 23 02:29:26 2010 +0100
+
+    Add HTTP support using libcurl
+
+    With libcurl, poppler can handle documents over http.
+
+ CMakeLists.txt                        |   18 ++++++++
+ config.h.cmake                        |    6 +++
+ configure.ac                  |   16 +++++++
+ poppler/CurlCachedFile.cc     |   95
+ ++++++++++++++++++++++++++++++++++++++++
+ poppler/CurlCachedFile.h      |   39 +++++++++++++++++
+ poppler/Makefile.am           |   20 +++++++++
+ poppler/poppler-config.h.cmake |    5 +++
+ poppler/poppler-config.h.in   |    5 +++
+ utils/pdfinfo.cc              |   16 ++++++-
+ 9 files changed, 219 insertions(+), 1 deletion(-)
+
+commit a87abf6ad9fb66d35a70c9412adc5d8ba2889b96
+Author: Hib Eris <hib@hiberis.nl>
+Date:  Wed Feb 24 14:46:59 2010 +0100
+
+    Use cached files to read from stdin in pdfinfo
+
+    This fixes reading from stdin.
+
+ utils/pdfinfo.cc |    6 +++++-
+ 1 file changed, 5 insertions(+), 1 deletion(-)
+
+commit 958b04b14baf03c07492fa1cbd225d9968b9efc1
+Author: Hib Eris <hib@hiberis.nl>
+Date:  Tue Feb 23 02:02:10 2010 +0100
+
+    Add support for reading a cached file from stdin
+
+ CMakeLists.txt                    |    2 ++
+ poppler/Makefile.am       |    2 ++
+ poppler/StdinCachedFile.cc |  37 +++++++++++++++++++++++++++++++++++++
+ poppler/StdinCachedFile.h  |  26 ++++++++++++++++++++++++++
+ 4 files changed, 67 insertions(+)
+
+commit 9539f75bd06150a3868209c5b04a75f5253722cc
+Author: Hib Eris <hib@hiberis.nl>
+Date:  Sat Apr 3 15:08:20 2010 +0200
+
+    Add support for cached files
+
+ CMakeLists.txt        |    2 +
+ poppler/CachedFile.cc |  246
+ +++++++++++++++++++++++++++++++++++++++++++++++++
+ poppler/CachedFile.h  |  113 +++++++++++++++++++++++
+ poppler/Makefile.am   |    2 +
+ poppler/Stream.cc     |  102 ++++++++++++++++++++
+ poppler/Stream.h      |   58 ++++++++++++
+ 6 files changed, 523 insertions(+)
+
+commit 8c6aefb8aa8929b9c47791d3062ed3ac8512626f
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Sun Apr 4 16:08:12 2010 +0200
+
+    [lexer] Correctly parse numbers with '+' sign
+
+    See GNOME Bug: https://bugzilla.gnome.org/show_bug.cgi?id=614549
+
+ poppler/Lexer.cc |    5 +++--
+ 1 file changed, 3 insertions(+), 2 deletions(-)
+
+commit ab5044e451e3714d385295f0b4ce9a15c8f2562c
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Sun Apr 4 12:32:42 2010 +0100
+
+    Add the -o[dd] and -e[ven] options to pdftoppm
+
+    I've been using this patch forever and it's a pain to apply and
+    unapply
+    it each time
+
+ utils/pdftoppm.1  |   6 ++++++
+ utils/pdftoppm.cc |   8 ++++++++
+ 2 files changed, 14 insertions(+)
+
+commit 0e371fb628a7e7d0cc1656e6405af4c97dbebf5d
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Sun Apr 4 12:30:34 2010 +0100
+
+    Fix my roll optimization
+
+    Thanks Carlos for noticing
+
+ poppler/Function.cc |  12 +++++++-----
+ 1 file changed, 7 insertions(+), 5 deletions(-)
+
+commit a32f6f9ebaed3e4827b9dc6cb37e307c2798f521
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Sun Mar 28 18:43:14 2010 +0200
+
+    [cairo] Do not change device offset of mask surface
+
+    Also call cairo_paint() after set_source_rgb() to paint the
+    background.
+    Fixes bug #27208.
+
+ poppler/CairoOutputDev.cc |   13 ++-----------
+ 1 file changed, 2 insertions(+), 11 deletions(-)
+
+commit efa5d9544d29252e3df36cc4e65c3d880b3c5172
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Sat Mar 27 22:11:49 2010 +0000
+
+    remove empty section
+
+ NEWS |    2 --
+ 1 file changed, 2 deletions(-)
+
+commit 5722df7a5387e43ec73f659ca58d2d07b9c4be3b
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Sat Mar 27 22:04:43 2010 +0000
+
+    poppler 0.13.2
+
+ CMakeLists.txt   |    2 +-
+ NEWS            |   39 +++++++++++++++++++++++++++++++++++++++
+ configure.ac    |    2 +-
+ cpp/Doxyfile    |    2 +-
+ qt4/src/Doxyfile |    2 +-
+ 5 files changed, 43 insertions(+), 4 deletions(-)
+
+commit b82fd707747b9d87ebf3c8f7ce5ab70ccdf82809
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Sat Mar 27 22:00:58 2010 +0000
+
+    gtk-doc changes
+
+ glib/reference/tmpl/poppler-action.sgml  |    7 +++----
+ glib/reference/tmpl/poppler-annot.sgml   |    9 ---------
+ glib/reference/tmpl/poppler-private.sgml |   10 ++++++++++
+ glib/reference/tmpl/poppler-unused.sgml  |    8 ++++++++
+ glib/reference/tmpl/poppler.sgml        |   10 ++++++++++
+ 5 files changed, 31 insertions(+), 13 deletions(-)
+
+commit ed0354be4eac615b80e7a868984cc527853788b4
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Sat Mar 27 21:44:59 2010 +0000
+
+    some forgotten copyrights
+
+ qt/poppler-page.cc         |    2 +-
+ qt4/src/poppler-document.cc |   2 +-
+ qt4/src/poppler-movie.cc    |   3 ++-
+ qt4/src/poppler-page.cc     |   2 +-
+ 4 files changed, 5 insertions(+), 4 deletions(-)
+
+commit 2aedeedf9ef2e2d3eb17bc36d728e68c2f7af762
+Author: Hib Eris <hib@hiberis.nl>
+Date:  Sat Mar 27 14:38:27 2010 +0000
+
+    Correctly initialize actualText
+
+ poppler/TextOutputDev.cc |    3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+commit b53f9b203598555d6d706c3804aba013b8566921
+Author: Jan Engelhardt <jengelh@medozas.de>
+Date:  Sat Mar 27 13:23:42 2010 +0000
+
+    make qt3 detection use pkgconfig
+
+ m4/qt.m4      |  101
+ +++++---------------------------------------------------
+ qt/Makefile.am |    4 +--
+ 2 files changed, 10 insertions(+), 95 deletions(-)
+
+commit 320d4cee46e108498440179d8f9eab22cd5383d9
+Author: Pino Toscano <pino@kde.org>
+Date:  Wed Mar 24 21:51:58 2010 +0100
+
+    Revert "no more needed"
+
+    This reverts commit 24d6bc8c78cb3148db2098ae4d69bd744340cf52.
+    It is actually needed.
+
+ cpp/tests/CMakeLists.txt |    1 +
+ 1 file changed, 1 insertion(+)
+
+commit af21b5ab366bfdda203c26a77f4ae6ed0e70f64e
+Author: Pino Toscano <pino@kde.org>
+Date:  Tue Mar 23 00:13:21 2010 +0100
+
+    [CMake] remove the (now) unneeded stuff from Find{GLIB,GDK,GTK}.cmake,
+    and search for them
+
+    this way each bit (GLIB, GDK, and GTK) can be enabled/disabled
+    independently from the others
+
+ CMakeLists.txt                      |    4 +++-
+ cmake/modules/FindGDK.cmake  |   14 +-------------
+ cmake/modules/FindGLIB.cmake |   14 +-------------
+ cmake/modules/FindGTK.cmake  |   14 +-------------
+ 4 files changed, 6 insertions(+), 40 deletions(-)
+
+commit 9b93ed5ce6712ec4cdf58148628e95685c289ef5
+Author: Pino Toscano <pino@kde.org>
+Date:  Tue Mar 23 00:02:27 2010 +0100
+
+    [CMake] copy FindGTK.cmake as FindGLIB.cmake and FindGDK.cmake
+
+    this way FindGTK.cmake can be split in the various parts
+
+ cmake/modules/FindGDK.cmake  |   34 ++++++++++++++++++++++++++++++++++
+ cmake/modules/FindGLIB.cmake |   34 ++++++++++++++++++++++++++++++++++
+ 2 files changed, 68 insertions(+)
+
+commit 0ec21cae0b4623644c3efca1d2836a9f38f25737
+Author: Pino Toscano <pino@kde.org>
+Date:  Mon Mar 22 22:11:04 2010 +0100
+
+    [Qt] add the unhandled cases for 'actionOCGState'
+
+ qt/poppler-page.cc |   1 +
+ 1 file changed, 1 insertion(+)
+
+commit 5211e09595135b8e6c68efd1b8b689b518092b84
+Author: Pino Toscano <pino@kde.org>
+Date:  Mon Mar 22 22:07:44 2010 +0100
+
+    [CMake/cpp] move the BUILD_CPP_TESTS option to the main CMakeLists.txt
+
+ CMakeLists.txt                  |    1 +
+ cpp/tests/CMakeLists.txt |    3 ---
+ 2 files changed, 1 insertion(+), 3 deletions(-)
+
+commit 24d6bc8c78cb3148db2098ae4d69bd744340cf52
+Author: Pino Toscano <pino@kde.org>
+Date:  Mon Mar 22 22:00:55 2010 +0100
+
+    no more needed
+
+ cpp/tests/CMakeLists.txt |    1 -
+ 1 file changed, 1 deletion(-)
+
+commit a07ef8f703ab896f89ed211a5780e4a669b04fc7
+Author: Pino Toscano <pino@kde.org>
+Date:  Mon Mar 22 22:00:15 2010 +0100
+
+    [CMake] revert addition of "-Wl,--no-add-needed" to the link flags,
+    if available
+
+    for now it is safer without it
+
+ cmake/modules/PopplerMacros.cmake |   6 ------
+ 1 file changed, 6 deletions(-)
+
+commit 86debcc9bba28a7c86f01ca9e63bde5fcd541846
+Author: Pino Toscano <pino@kde.org>
+Date:  Mon Mar 22 21:49:22 2010 +0100
+
+    [CMake] add "-ansi" to the CXXFLAGS only on Linux
+
+ cmake/modules/PopplerMacros.cmake |   9 +++++++--
+ 1 file changed, 7 insertions(+), 2 deletions(-)
+
+commit 0819acd52a2ce74f0e176626d7b2233e10232d53
+Merge: c4ddbe8 92738eb
+Author: Pino Toscano <pino@kde.org>
+Date:  Mon Mar 22 21:43:01 2010 +0100
+
+    Merge branch 'master' of ssh://git.freedesktop.org/git/poppler/poppler
+
+commit 92738ebb8a9c7cfc879aae59c2cbdf3159f03cd3
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Mon Mar 22 20:28:15 2010 +0000
+
+    Add a search overload that takes doubles
+
+    QRectF is evil and is float in some arch and causes search to loop
+    infinitely because of double->float conversion
+
+ qt4/src/poppler-page.cc |   22 +++++++++++++++-------
+ qt4/src/poppler-qt4.h  |   16 ++++++++++++++--
+ 2 files changed, 29 insertions(+), 9 deletions(-)
+
+commit 0a895f14c8125c5de7b97e8e799459c431eb51cb
+Author: Thomas Freitag <Thomas.Freitag@alfa.de>
+Date:  Mon Mar 22 19:03:54 2010 +0000
+
+    correctly initialize the grayscale softmask color
+
+    Fixes file with sha1sum e6e1576803a1bd74ad822eebbd750ee7b8357d25
+
+ poppler/SplashOutputDev.cc |   9 +++++++--
+ 1 file changed, 7 insertions(+), 2 deletions(-)
+
+commit c4ddbe89df9e48343a9606728b7c182080d87ece
+Author: Patrick Spendrin <ps_ml@gmx.de>
+Date:  Sat Mar 20 21:55:17 2010 +0100
+
+    [CMake] when the conf configuration backend is "win32", set the
+    required Internet Explorer version to 5.0
+
+    ... as done with autotools as well
+
+ CMakeLists.txt |    6 ++++++
+ 1 file changed, 6 insertions(+)
+
+commit 97da1f9d060493d9fb54a20e980c3f6e2b82c97e
+Author: Pino Toscano <pino@kde.org>
+Date:  Sat Mar 20 17:51:07 2010 +0100
+
+    [CMake] check whether a link flag is supported before adding it to
+    the link flags
+
+    this way we can add -Wl,--as-needed and -Wl,--no-add-needed only if
+    the current GCC/LD supports them
+
+ cmake/modules/PopplerMacros.cmake |   23 ++++++++++++++++++++---
+ 1 file changed, 20 insertions(+), 3 deletions(-)
+
+commit 223bce6d14e632f457a81b2ec091fe16369d2eb6
+Author: Pino Toscano <pino@kde.org>
+Date:  Sat Mar 20 14:08:58 2010 +0100
+
+    [CMake] with GCC, pass --as-needed and --no-add-needed to the linker
+
+    --as-needed allows to avoid overlinking, linking only to the libraries
+    whose symbols are actually used
+    --no-add-needed makes the linker not use the NEEDED libraries
+    automatically, so we have to always make sure we specify all the
+    libraries actually used in a exe/lib
+
+ cmake/modules/PopplerMacros.cmake |   4 ++++
+ 1 file changed, 4 insertions(+)
+
+commit fc761f0d385708daaef1b95968532795b04f11b0
+Author: Pino Toscano <pino@kde.org>
+Date:  Sat Mar 20 14:05:59 2010 +0100
+
+    [CMake] poppler-dump uses parseargs.c which uses the poppler core API,
+    so it must link to it
+
+ cpp/tests/CMakeLists.txt |    1 +
+ 1 file changed, 1 insertion(+)
+
+commit a210440b05d14efc53224a10e8b3ac7d508043b5
+Author: Pino Toscano <pino@kde.org>
+Date:  Sat Mar 20 14:04:02 2010 +0100
+
+    [CMake] poppler-glib uses the freetype API, so it must explicitly
+    link to it
+
+ glib/CMakeLists.txt |   2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit f5d352666b92cee0390470d7b892ec8dcbf046a5
+Author: Pino Toscano <pino@kde.org>
+Date:  Sat Mar 20 14:03:19 2010 +0100
+
+    [CMake] pdftoabw uses the libxml2 API, so it must explicitly link
+    to it
+
+ utils/CMakeLists.txt |    2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 3fc2c4affe825f4aabcee161ec794338bd359403
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Thu Mar 18 13:52:52 2010 +0100
+
+    [glib] Use g_slice_new/free instead of g_new/free to alloc/free
+    iterators
+
+ glib/poppler-document.cc |   27 +++++++++++++--------------
+ 1 file changed, 13 insertions(+), 14 deletions(-)
+
+commit 7bd6a8558646983669ce699f83d5ed42d7fce476
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Thu Mar 18 13:34:03 2010 +0100
+
+    [glib] Move find_annot_movie_for_action() from page to action
+
+    And remove _poppler_action_movie_set_movie().
+
+ glib/poppler-action.cc |   93
+ ++++++++++++++++++++++++++++++++++++++++++------
+ glib/poppler-page.cc  |   79 ----------------------------------------
+ glib/poppler-private.h |    2 --
+ 3 files changed, 82 insertions(+), 92 deletions(-)
+
+commit e5e3d310aa488638431dd85ac3383a12056674bf
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Thu Mar 18 12:20:26 2010 +0100
+
+    Update copyright header
+
+ poppler/Link.cc |    2 +-
+ poppler/Link.h  |    1 +
+ 2 files changed, 2 insertions(+), 1 deletion(-)
+
+commit c76870178a031e437de3f9ed7baa64efb96955d6
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Thu Mar 18 12:13:36 2010 +0100
+
+    [glib-demo] OCG State Actions demo
+
+ glib/demo/utils.c |   64
+ +++++++++++++++++++++++++++++++++++++++++++++++++++++
+ 1 file changed, 64 insertions(+)
+
+commit 456e42f91dfbf73b71a5dbdde13d7ccdb5637d79
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Thu Mar 18 12:12:51 2010 +0100
+
+    [glib] Add support for OCG State actions
+
+ glib/poppler-action.cc |  125
+ ++++++++++++++++++++++++++++++++++++++++++++++++
+ glib/poppler-action.h |   25 +++++++++-
+ glib/poppler.h                |    1 +
+ 3 files changed, 150 insertions(+), 1 deletion(-)
+
+commit 4b109899e0732bbf65cacd875829e869e61eda48
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Thu Mar 18 12:10:19 2010 +0100
+
+    [glib] Make get_layer_rbgroup() and get_layers() doc funcs public
+    for internal use
+
+ glib/poppler-document.cc |   12 ++++++------
+ glib/poppler-private.h   |    3 +++
+ 2 files changed, 9 insertions(+), 6 deletions(-)
+
+commit 38a55f6118debf994ce1fc41e987b0e3766047ba
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Thu Mar 18 12:08:30 2010 +0100
+
+    Add support for Set-OCG-State actions
+
+    Fixes bug #23522.
+
+ poppler/Link.cc |   80
+ +++++++++++++++++++++++++++++++++++++++++++++++++++++++
+ poppler/Link.h  |   31 +++++++++++++++++++++
+ 2 files changed, 111 insertions(+)
+
+commit bf398e53b0823d0a6272679858b67c5ffd704425
+Author: Pino Toscano <pino@kde.org>
+Date:  Wed Mar 17 23:06:44 2010 +0100
+
+    [CMake] fix pkg-config executable variable name
+
+ CMakeLists.txt |    6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
+
+commit ab1a37666704d6b15c19b694ee191327847c23da
+Author: Pino Toscano <pino@kde.org>
+Date:  Wed Mar 17 23:04:01 2010 +0100
+
+    [CMake] proper way of looking for pkg-config
+
+ cmake/modules/FindGTK.cmake |   2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 7f07a7dcea031f99a9a6d7c424184a2e69ee0062
+Author: Pino Toscano <pino@kde.org>
+Date:  Wed Mar 17 22:58:08 2010 +0100
+
+    [CMake] update FindFontconfig.cmake with a more recent version
+
+    ... present in KDE (as before)
+
+ cmake/modules/FindFontconfig.cmake |  15 +++++++++------
+ 1 file changed, 9 insertions(+), 6 deletions(-)
+
+commit beee143ffbdc699ab19f10a01e5747200ea1927a
+Author: Pino Toscano <pino@kde.org>
+Date:  Wed Mar 17 18:36:32 2010 +0100
+
+    [CMake] set the LINK_INTERFACE_LIBRARIES for the poppler and
+    poppler-cpp libraries
+
+    this should reduce the libraries linked by frontends and utility
+    applications
+
+ CMakeLists.txt     |   1 +
+ cpp/CMakeLists.txt |   1 +
+ 2 files changed, 2 insertions(+)
+
+commit 5ab791cb2a029edcde84b00a47165adfe4d98a98
+Author: Pino Toscano <pino@kde.org>
+Date:  Wed Mar 17 16:39:38 2010 +0100
+
+    [CMake] small cleanups in FindGTK.cmake
+
+    - update the header will all the stuff found and the variables set
+    - add my copyright for this year
+    - remove no more useful UsePkgConfig inclusion
+
+ cmake/modules/FindGTK.cmake |  17 ++++++++++++-----
+ 1 file changed, 12 insertions(+), 5 deletions(-)
+
+commit fcbc76d82e3059c8288fbdc8da117ac9b38a70f2
+Author: Pino Toscano <pino@kde.org>
+Date:  Wed Mar 17 16:36:41 2010 +0100
+
+    [CMake] switch gtk2 (gtk+, gdk-pixbuf, gthread, gio) search to use
+    the new pkg_check_modules() way
+
+ cmake/modules/FindGTK.cmake |  27 ++-------------------------
+ 1 file changed, 2 insertions(+), 25 deletions(-)
+
+commit 5b8135e0899aa3578045eca40940a3495c48d895
+Author: Pino Toscano <pino@kde.org>
+Date:  Wed Mar 17 16:27:40 2010 +0100
+
+    [CMake] link poppler-glib to the gdk2 libraries, if gdk2 was found
+
+ glib/CMakeLists.txt |   3 +++
+ 1 file changed, 3 insertions(+)
+
+commit 3dc4979d72048e81ae3b2d60dab11e791ac95696
+Author: Pino Toscano <pino@kde.org>
+Date:  Wed Mar 17 16:26:04 2010 +0100
+
+    [CMake] switch gdk2 search to use the new pkg_check_modules() way
+
+ cmake/modules/FindGTK.cmake |  13 +------------
+ 1 file changed, 1 insertion(+), 12 deletions(-)
+
+commit 0ef3d899cb8dea75c97ae1038cac5006f97bc0d2
+Author: Pino Toscano <pino@kde.org>
+Date:  Wed Mar 17 16:05:07 2010 +0100
+
+    [CMake] switch glib2 search to use the new pkg_check_modules() way
+
+ cmake/modules/FindGTK.cmake |  18 ++----------------
+ 1 file changed, 2 insertions(+), 16 deletions(-)
+
+commit d2dc83cb8de481e44ea584eee77881978af920fa
+Author: Pino Toscano <pino@kde.org>
+Date:  Wed Mar 17 15:56:16 2010 +0100
+
+    [CMake] rename GLIB_VERSION to GLIB_REQUIRED
+
+    this way it matches autotools, and it is going to not conflict with
+    my next changes
+
+ CMakeLists.txt                     |    4 ++--
+ cmake/modules/FindGTK.cmake |   2 +-
+ 2 files changed, 3 insertions(+), 3 deletions(-)
+
+commit 34accfe27305cae18e09243ab2a607287b86fa47
+Author: Pino Toscano <pino@kde.org>
+Date:  Wed Mar 17 13:55:09 2010 +0100
+
+    [CMake] set all the definitions for poppler-glib in a single place
+
+ glib/CMakeLists.txt |   4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 3d93daf50c61019ca70f42e7ccf33897800b262a
+Author: Pino Toscano <pino@kde.org>
+Date:  Wed Mar 17 13:49:22 2010 +0100
+
+    [CMake] no need to check for BUILD_GTK_TESTS for single tests
+
+    poppler_add_test(... BUILD_GTK_TESTS ...) takes care of that already
+
+ glib/CMakeLists.txt |   4 ++--
+ test/CMakeLists.txt |   4 ++--
+ 2 files changed, 4 insertions(+), 4 deletions(-)
+
+commit 946a11345d01d39538d22114e50aa3e179059883
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Mon Mar 15 20:24:25 2010 +0100
+
+    [build] Update cmake files
+
+ CMakeLists.txt      |   2 ++
+ glib/CMakeLists.txt |   4 ++++
+ 2 files changed, 6 insertions(+)
+
+commit 922c0fe392ba439453edb5b2e88b74f0caa586b3
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Mon Mar 15 20:08:23 2010 +0100
+
+    [glib-demo] Rendition actions demo
+
+ glib/demo/utils.c |  112
+ +++++++++++++++++++++++++++++++++++++++++++++++++++++
+ 1 file changed, 112 insertions(+)
+
+commit 163b3f79d67543bc37b64875e30dcc9b7053e1d5
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Mon Mar 15 20:08:00 2010 +0100
+
+    [glib] Add support for rendition actions
+
+ glib/poppler-action.cc |   22 ++++++++++++++++++++++
+ glib/poppler-action.h |   14 +++++++++++++-
+ 2 files changed, 35 insertions(+), 1 deletion(-)
+
+commit d9b1e40751beddf48a8694b20bfcc4b4cb41060a
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Mon Mar 15 20:06:45 2010 +0100
+
+    [glib] Add PopplerMedia representing a Rendition Media Clip
+
+ glib/Makefile.am      |    2 +
+ glib/poppler-media.cc |  302
+ ++++++++++++++++++++++++++++++++++++++++++++++++
+ glib/poppler-media.h  |   53 +++++++++
+ glib/poppler-private.h |    2 +
+ glib/poppler.h                |    2 +
+ 5 files changed, 361 insertions(+)
+
+commit 0224b81c4729a98a56b7a68054422ea655018d6a
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Mon Mar 15 17:54:03 2010 +0100
+
+    [glib-demo] Add page number to annots demo
+
+ glib/demo/annots.c |   4 ++++
+ 1 file changed, 4 insertions(+)
+
+commit 0153b892c63e4fccd0819150cf7b4213857a11c5
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Mon Mar 15 17:49:51 2010 +0100
+
+    [glib] Add poppler_annot_get_page_index() to get the page associated
+    to annot
+
+ glib/poppler-annot.cc |   19 +++++++++++++++++++
+ glib/poppler-annot.h  |    1 +
+ 2 files changed, 20 insertions(+)
+
+commit b47337ea91696fea8f42a68a6fa160681ab284b2
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Mon Mar 15 17:49:17 2010 +0100
+
+    [annots] Checks screen annots associated with a rendition action
+    have a valid page ref
+
+ poppler/Annot.cc |    6 ++++++
+ 1 file changed, 6 insertions(+)
+
+commit 9417fd793ec8d806822669aa614193073e7dfe50
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Mon Mar 15 16:52:30 2010 +0100
+
+    [annots] Save page index of the page associated with the annot
+
+ poppler/Annot.cc |   14 +++++---------
+ poppler/Annot.h  |    4 ++--
+ 2 files changed, 7 insertions(+), 11 deletions(-)
+
+commit 36b76a5d01b74c6381433b6f6f7ffb9f02696a60
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Mon Mar 15 14:12:11 2010 +0100
+
+    Rework LinkRendition to follow the spec
+
+ poppler/Link.cc |   68
+ ++++++++++++++++++++++++++++++++++---------------------
+ poppler/Link.h  |   12 ++++++----
+ 2 files changed, 50 insertions(+), 30 deletions(-)
+
+commit 7b5885ee7d2026df9a6e87327b6d02f37d79b8b2
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Mon Mar 15 12:25:12 2010 +0100
+
+    [glib-demo] Annot screen demo
+
+ glib/demo/annots.c |  17 +++++++++++++++++
+ 1 file changed, 17 insertions(+)
+
+commit bdb76c7cb89bcb6fb139b0ef348d96b7780d57ed
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Mon Mar 15 12:24:19 2010 +0100
+
+    [glib] Add support for screen annotation
+
+    Based on patch by Sam Kaplan.
+
+ glib/poppler-annot.cc |   75
+ ++++++++++++++++++++++++++++++++++++++++++++++++
+ glib/poppler-annot.h  |    8 ++++++
+ glib/poppler-page.cc  |    3 ++
+ glib/poppler-private.h |    1 +
+ glib/poppler.h                |    1 +
+ 5 files changed, 88 insertions(+)
+
+commit 54892b1375e360113432b07c6ba058f861d21fe8
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Mon Mar 15 12:21:30 2010 +0100
+
+    [annots] Save the action already parsed in AnnotScreen
+
+ poppler/Annot.cc |    9 +++++++--
+ poppler/Annot.h  |    5 +++--
+ 2 files changed, 10 insertions(+), 4 deletions(-)
+
+commit 5a84a2d749478f19631dbfad2be06ec4ea85038c
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Mon Mar 15 11:16:17 2010 +0100
+
+    [glib-demo] Annot and links movie demo
+
+ glib/demo/annots.c |  20 +++++++++
+ glib/demo/utils.c  |  115
+ +++++++++++++++++++++++++++++++++++++++++++++++++++-
+ glib/demo/utils.h  |   3 ++
+ 3 files changed, 137 insertions(+), 1 deletion(-)
+
+commit 2cf5ee4f62089df099f78cd4d39a4eb7589d1b47
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Mon Mar 15 11:04:17 2010 +0100
+
+    [glib] Add support for movie actions
+
+    Based on patch by Hugo Mercier.
+
+ glib/poppler-action.cc |   35 ++++++++++++++++++---
+ glib/poppler-action.h |   15 +++++++--
+ glib/poppler-page.cc  |   81
+ +++++++++++++++++++++++++++++++++++++++++++++++-
+ glib/poppler-private.h |    2 ++
+ 4 files changed, 125 insertions(+), 8 deletions(-)
+
+commit 132b6f072fefd231d42f31626f1b5009c4e8319e
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Mon Mar 15 10:56:23 2010 +0100
+
+    [glib] Add support for movie annotations
+
+    Based on patch by Hugo Mercier.
+
+ glib/poppler-annot.cc |   97
+ ++++++++++++++++++++++++++++++++++++++++++++++++
+ glib/poppler-annot.h  |   10 +++++
+ glib/poppler-page.cc  |    3 ++
+ glib/poppler-private.h |    1 +
+ glib/poppler.h                |    1 +
+ 5 files changed, 112 insertions(+)
+
+commit aecad2bb12be44825d273e364ec6a0444dac5605
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Mon Mar 15 10:48:03 2010 +0100
+
+    [glib] Add PopplerMovie class
+
+ glib/Makefile.am      |    2 +
+ glib/poppler-movie.cc |  140
+ ++++++++++++++++++++++++++++++++++++++++++++++++
+ glib/poppler-movie.h  |   42 +++++++++++++++
+ glib/poppler-private.h |    2 +
+ glib/poppler.h                |    2 +
+ 5 files changed, 188 insertions(+)
+
+commit 5b3234a16e0d465bff2b5e277cb64b4f4b0a8dbd
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Sun Mar 14 16:10:26 2010 +0100
+
+    Split Movie class into Rendition and Movie classes to follow the spec
+
+ poppler/Annot.cc        |   16 +-
+ poppler/Link.cc         |   10 +-
+ poppler/Link.h                  |    6 +-
+ poppler/Makefile.am     |    2 +
+ poppler/Movie.cc        |  438
+ +++++-----------------------------------------
+ poppler/Movie.h         |  138 +++------------
+ poppler/Rendition.cc    |  400
+ ++++++++++++++++++++++++++++++++++++++++++
+ poppler/Rendition.h     |  157 +++++++++++++++++
+ qt4/src/poppler-movie.cc |    9 +-
+ 9 files changed, 657 insertions(+), 519 deletions(-)
+
+commit f9c163730478e3b6d8a1e73dbae6c52c28ae1e84
+Author: Pino Toscano <pino@kde.org>
+Date:  Mon Mar 8 14:49:12 2010 +0100
+
+    [Qt4] include Object.h and Annot.h, now needed
+
+ qt4/src/poppler-movie.cc |    2 ++
+ 1 file changed, 2 insertions(+)
+
+commit a00532f509c19c5455e0db5068db95dd4583e8dd
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Mon Mar 8 14:22:53 2010 +0100
+
+    Check for Null instead of None to know whether a dict entry is present
+
+    Dict::lookup returns obj->initNull() when the key is not found.
+
+ poppler/Movie.cc |    6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
+
+commit b51e66c9a7e2f7f39ae1edf8bda02a7bc1ad4ebd
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Mon Mar 8 14:15:22 2010 +0100
+
+    [annots] Create appearance stream for Movie Annotations when not
+    defined
+
+    See bug #23108
+
+ poppler/Annot.cc |  103
+ +++++++++++++++++++++++++++++++++++++++++++++++++++++-
+ poppler/Annot.h  |    4 ++-
+ 2 files changed, 105 insertions(+), 2 deletions(-)
+
+commit fae59411852e5c2c45825c5ea963318f1ed5dc6a
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Mon Mar 8 14:07:09 2010 +0100
+
+    Fix handling of poster in Movie
+
+    Poster is not always a stream, it can be a boolean too. Also, get the
+    reference when available instead of fetching the stream.
+
+ poppler/Movie.cc |   25 ++++++++++++-------------
+ poppler/Movie.h  |    6 ++++--
+ 2 files changed, 16 insertions(+), 15 deletions(-)
+
+commit a451f83d101bf265a1e7e2a17c0b320895e70f4e
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Sun Mar 7 12:22:57 2010 +0100
+
+    Save width, height (aspect) in Movie object and provide getAspect()
+    method
+
+ poppler/Movie.cc |    3 ++-
+ poppler/Movie.h  |    4 ++++
+ 2 files changed, 6 insertions(+), 1 deletion(-)
+
+commit f88d469f860da17055fc4b98b64aef241fcf0185
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Sat Mar 6 12:33:40 2010 +0100
+
+    Move Movie objects parsing code from Annot to Movie
+
+ poppler/Annot.cc        |  244
+ ++------------------------------------------
+ poppler/Annot.h         |   73 +------------
+ poppler/Link.cc         |    4 +-
+ poppler/Movie.cc        |  255
+ ++++++++++++++++++++++++++++++++++++++--------
+ poppler/Movie.h         |   25 +++--
+ qt4/src/poppler-movie.cc |   11 +-
+ 6 files changed, 246 insertions(+), 366 deletions(-)
+
+commit ec9138b574c7226ad733880d3d43b86bb72073f4
+Author: Pino Toscano <pino@kde.org>
+Date:  Sun Mar 7 23:17:50 2010 +0100
+
+    [autotools] add also cpp/tests/CMakeLists.txt to the "dist files"
+
+ Makefile.am |   1 +
+ 1 file changed, 1 insertion(+)
+
+commit ef3258d6fc57e7a62d951cc826804e50e8e1b526
+Author: Pino Toscano <pino@kde.org>
+Date:  Sun Mar 7 23:14:12 2010 +0100
+
+    [autotools] fix location of poppler-config.h.cmake
+
+ Makefile.am |   2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit fd1d9c882997ff35acd5a458e9dfeba3ad6c8b25
+Author: Pino Toscano <pino@kde.org>
+Date:  Sun Mar 7 22:42:06 2010 +0100
+
+    [CMake] just enable what needed each time
+
+ CMakeLists.txt |    4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 476bde472a7e694afde96a04ea335fe9582d6fad
+Author: Pino Toscano <pino@kde.org>
+Date:  Sun Mar 7 22:39:45 2010 +0100
+
+    [CMake] add small description for the zlib option
+
+    taken from two bits in configure.ac
+
+ CMakeLists.txt |    2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 1267d7e0c36e262984070a3b55fea46e7289a4b4
+Author: Pino Toscano <pino@kde.org>
+Date:  Sun Mar 7 19:34:03 2010 +0100
+
+    [CMake] add a note about gtk-doc not supported yet
+
+ CMakeLists.txt |    2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 201b18ad0837e84d874b56e1b0469d1b2d45378b
+Author: Pino Toscano <pino@kde.org>
+Date:  Sun Mar 7 19:30:36 2010 +0100
+
+    [CMake] sync with poppler-config.h.in: add
+    WITH_FONTCONFIGURATION_{FONTCONFIG,WIN32}
+
+ poppler/poppler-config.h.cmake |   10 ++++++++++
+ 1 file changed, 10 insertions(+)
+
+commit 0d0044e8cc2d406f066338102ec73e1b56214cc3
+Author: Pino Toscano <pino@kde.org>
+Date:  Sun Mar 7 19:25:27 2010 +0100
+
+    [CMake] move poppler-config.h.cmake in the poppler subdirectory,
+    where poppler-config.h.in is
+
+ CMakeLists.txt                        |    2 +-
+ poppler-config.h.cmake                |   90
+ ----------------------------------------
+ poppler/poppler-config.h.cmake |   90
+ ++++++++++++++++++++++++++++++++++++++++
+ 3 files changed, 91 insertions(+), 91 deletions(-)
+
+commit f785e29a901d2c76204dd26e9585446fdd817ebd
+Author: Pino Toscano <pino@kde.org>
+Date:  Sun Mar 7 18:35:34 2010 +0100
+
+    [CMake] remove the generated poppler-enums.{c,h} in the clean target
+
+    ie usually when doing `make clean'
+
+ glib/CMakeLists.txt |   4 ++++
+ 1 file changed, 4 insertions(+)
+
+commit 369604603375dbe3516136b6f8f9d0c26e0b744f
+Author: Pino Toscano <pino@kde.org>
+Date:  Sun Mar 7 18:26:45 2010 +0100
+
+    [CMake] use the --template option of glib-mkenums (like done with
+    autotools)
+
+ glib/CMakeLists.txt |  24 ++++--------------------
+ 1 file changed, 4 insertions(+), 20 deletions(-)
+
+commit bbcbb34fec10c90edd5960bdbcc6849bc8f39526
+Author: Pino Toscano <pino@kde.org>
+Date:  Sun Mar 7 17:34:40 2010 +0100
+
+    [CMake] set POPPLER_GLIB_DISABLE_DEPRECATED and
+    POPPLER_GLIB_DISABLE_SINGLE_INCLUDES as done with autotools
+
+ CMakeLists.txt      |   6 ++++++
+ glib/CMakeLists.txt |   6 +++++-
+ 2 files changed, 11 insertions(+), 1 deletion(-)
+
+commit 190fa971c12ca1b3007f6ba349a77a7c15c47490
+Author: Pino Toscano <pino@kde.org>
+Date:  Sun Mar 7 17:24:25 2010 +0100
+
+    reorder to match what's in the correspondent .in
+
+ glib/poppler-features.h.cmake |    2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit ff46def8b178420a86a974ec2ce767a538bba8be
+Author: Pino Toscano <pino@kde.org>
+Date:  Sun Mar 7 17:23:16 2010 +0100
+
+    [CMake] GDK_FEATURE is no more needed here
+
+ glib/CMakeLists.txt |   1 -
+ 1 file changed, 1 deletion(-)
+
+commit 1eb8026a3060ef61a88c535177510f7ac7e7fc25
+Author: Pino Toscano <pino@kde.org>
+Date:  Sun Mar 7 17:19:58 2010 +0100
+
+    [CMake] set in one place whether to build the glib frontend
+
+ CMakeLists.txt |   11 ++++++-----
+ 1 file changed, 6 insertions(+), 5 deletions(-)
+
+commit a1a6f23e2345814e147a72211ce9139555385223
+Author: Pino Toscano <pino@kde.org>
+Date:  Sun Mar 7 17:09:58 2010 +0100
+
+    [CMake] correctly set the GLIB_REQ stuff
+
+ CMakeLists.txt        |    1 +
+ poppler-glib.pc.cmake |    2 +-
+ 2 files changed, 2 insertions(+), 1 deletion(-)
+
+commit 0f2e5d6925c5938281d9bafc297a43867c4a915b
+Author: Pino Toscano <pino@kde.org>
+Date:  Sun Mar 7 17:03:21 2010 +0100
+
+    [CMake] move the minimum GLib version to the main CMakeLists.txt
+
+ CMakeLists.txt                     |    1 +
+ cmake/modules/FindGTK.cmake |   2 +-
+ 2 files changed, 2 insertions(+), 1 deletion(-)
+
+commit efdffba45d15b538dbfb294403e99f3a6470b4d9
+Author: Pino Toscano <pino@kde.org>
+Date:  Sun Mar 7 16:58:27 2010 +0100
+
+    [CMake] align the GDK stuff (GDK_{FEATURE,REQ}) to what done with
+    autotools
+
+ CMakeLists.txt        |    6 +++++-
+ poppler-glib.pc.cmake |    2 +-
+ 2 files changed, 6 insertions(+), 2 deletions(-)
+
+commit cfecc69b7f05920f543ee7e9aafeafaa4c3506fb
+Author: Pino Toscano <pino@kde.org>
+Date:  Sun Mar 7 16:49:14 2010 +0100
+
+    [CMake] apparently there's not a minimum version requirement for GDK,
+    so drop the check
+
+ cmake/modules/FindGTK.cmake |   5 +----
+ 1 file changed, 1 insertion(+), 4 deletions(-)
+
+commit 8ff1cf03d2607b0f13bbbbf272f2b03d8927bd24
+Author: Pino Toscano <pino@kde.org>
+Date:  Sun Mar 7 16:47:21 2010 +0100
+
+    [CMake] first look for Cairo, then for GLib/GDK/GTK
+
+    this starts to align to the searches done with autotools
+    also, move the CAIRO_FEATURE to the main CMakeLists.txt
+
+ CMakeLists.txt      |  19 +++++++++++--------
+ glib/CMakeLists.txt |   1 -
+ 2 files changed, 11 insertions(+), 9 deletions(-)
+
+commit bcaf62b8e252594530d3050761ba563cf3b1fb6e
+Author: Pino Toscano <pino@kde.org>
+Date:  Sun Mar 7 16:00:03 2010 +0100
+
+    [CMake] enhance/rewrite a bit the FindCairo module
+
+    make use of some features of CMake 2.6 (as we require it):
+    - newer pkg-config handling (aka pkg_check_modules())
+    - version checking for modules (PACKAGE_FIND_VERSION*)
+    - find_package_handle_standard_args()
+    also, after the pkg-config search to win32, search for cairo again
+    (double-check plus real search for win32)
+    furthermore, introduce CAIRO_INCLUDE_DIRS with the include paths
+    requires (kind of "obsoletes" CAIRO_CFLAGS, left there in case it
+    is used again)
+
+    apply the changes to the rest of the build system (specify the
+    version needed, use the correct variable for includes)
+
+ CMakeLists.txt                       |    2 +-
+ cmake/modules/FindCairo.cmake |   64
+ ++++++++++++++++++++++++++---------------
+ glib/CMakeLists.txt          |    2 +-
+ 3 files changed, 43 insertions(+), 25 deletions(-)
+
+commit c96aa0f5fc74ae04f483485b787aaf65f1791991
+Author: Pino Toscano <pino@kde.org>
+Date:  Sun Mar 7 02:01:13 2010 +0100
+
+    add Patrick's copyright notices
+
+ cpp/poppler-global.h      |    1 +
+ goo/gtypes.h              |   14 ++++++++++++++
+ poppler/GlobalParams.cc    |   1 +
+ poppler/SplashOutputDev.cc |   1 +
+ 4 files changed, 17 insertions(+)
+
+commit 3311bedd2eb831ef1fd553f3f50960331cf6885f
+Author: Patrick Spendrin <ps_ml@gmx.de>
+Date:  Sun Mar 7 01:56:15 2010 +0100
+
+    MSVC: disable for the 'ustring' class the warning C4251 (which does
+    not apply)
+
+ cpp/poppler-global.h |    8 ++++++++
+ 1 file changed, 8 insertions(+)
+
+commit 9efa18397bd05fbd27c7811fa6e0f34ce94012e0
+Author: Patrick Spendrin <ps_ml@gmx.de>
+Date:  Sun Mar 7 01:48:03 2010 +0100
+
+    MSVC: disable warning C4800, which is of no use for now
+
+ goo/gtypes.h |    4 ++++
+ 1 file changed, 4 insertions(+)
+
+commit 3a88d1bf8d2c5a9e8014e0d46e24c9ec06556469
+Author: Patrick Spendrin <ps_ml@gmx.de>
+Date:  Sun Mar 7 01:26:10 2010 +0100
+
+    MSVC: no isfinite(), so provide it using _finite()
+
+ poppler/SplashOutputDev.cc |   5 +++++
+ 1 file changed, 5 insertions(+)
+
+commit 7774912c46f832f25c51b4cfc0e9430b1cd7fa1f
+Author: Patrick Spendrin <ps_ml@gmx.de>
+Date:  Sun Mar 7 01:22:31 2010 +0100
+
+    MSVC: do not force constness here, so the right overload will
+    be chosen
+
+ poppler/GlobalParams.cc |    4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit cf07a5d85b402b6956c9605fbdc88bddcb94a3cf
+Author: Pino Toscano <pino@kde.org>
+Date:  Sun Mar 7 00:49:07 2010 +0100
+
+    [CMake] show end yes/no message about the GDK usage
+
+    just like done with autotools
+
+ CMakeLists.txt |    1 +
+ 1 file changed, 1 insertion(+)
+
+commit 42c98f8eabe304d5e3dc8c1ebdd5b0b6c221e696
+Author: Pino Toscano <pino@kde.org>
+Date:  Sat Mar 6 17:18:08 2010 +0100
+
+    [CMake] make the font configuration backend selection take a string
+    (like with autotools)
+
+    this way it is possible to set the cmake variable FONT_CONFIGURATION
+    to either "win32" (default on windows) or "fontconfig" (default
+    elsewhere) to the font backend to use
+    as a consequence, make fontconfig a requirement only if the font
+    backend chosen is "fontconfig"
+
+ CMakeLists.txt |   39 +++++++++++++++++++++++++++++----------
+ 1 file changed, 29 insertions(+), 10 deletions(-)
+
+commit bda6e7cd089f2970af2e9540b4415633ffcf0ebb
+Author: Pino Toscano <pino@kde.org>
+Date:  Sat Mar 6 17:13:30 2010 +0100
+
+    [CMake] add a show_end_message() macro to show a generic string
+    as value
+
+    make show_end_message_yesno() call it with the proper "yes" or
+    "no" string
+
+ cmake/modules/PopplerMacros.cmake |   9 +++++++--
+ 1 file changed, 7 insertions(+), 2 deletions(-)
+
+commit d313c0f508711b3b7166b84608c43ebf1f07194b
+Author: Pino Toscano <pino@kde.org>
+Date:  Sat Mar 6 17:08:59 2010 +0100
+
+    [CMake] rename the show_end_message() macro to
+    show_end_message_yesno()
+
+ CMakeLists.txt                           |   26 +++++++++++++-------------
+ cmake/modules/PopplerMacros.cmake |   4 ++--
+ 2 files changed, 15 insertions(+), 15 deletions(-)
+
+commit 0425ff835fa26df5e25e628a6c56f3a180713905
+Author: Pino Toscano <pino@kde.org>
+Date:  Fri Mar 5 22:21:56 2010 +0100
+
+    update copyright
+
+ poppler/ArthurOutputDev.cc |   2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit c5ea135ca58e112110be3ae10d887f3188172765
+Author: Pino Toscano <pino@kde.org>
+Date:  Fri Mar 5 22:14:57 2010 +0100
+
+    [arthur] update the miter limit
+
+ poppler/ArthurOutputDev.cc |   4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 552f344b3e3df7c796afa6946149b0a5590cc4f7
+Author: Pino Toscano <pino@kde.org>
+Date:  Fri Mar 5 22:04:39 2010 +0100
+
+    [arthur] update the line dash style
+
+ poppler/ArthurOutputDev.cc |  12 +++++++++++-
+ 1 file changed, 11 insertions(+), 1 deletion(-)
+
+commit bc42ee05fceef0d0dd2ab0587c184dfc37cf29bf
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Fri Mar 5 18:54:32 2010 +0000
+
+    fix copyright year
+
+ poppler/CairoOutputDev.cc |   2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit b21461e91ed671ef29fd3cf4780fda44f82a0679
+Author: Adrian Johnson <ajohnson@redneon.com>
+Date:  Fri Mar 5 15:14:08 2010 +0100
+
+    [cairo] Close image stream before resetting it again
+
+ poppler/CairoOutputDev.cc |   2 ++
+ 1 file changed, 2 insertions(+)
+
+commit 866bcc7edb47fe11355081045e2d316a4d530649
+Author: Pino Toscano <pino@kde.org>
+Date:  Thu Mar 4 14:19:50 2010 +0100
+
+    [Qt4] no need to save&restore on a newly created painter
+
+ qt4/src/poppler-page.cc |    2 --
+ 1 file changed, 2 deletions(-)
+
+commit 654698b556eb53eab7c2d55fc6b3fdd9e35173bb
+Author: Pino Toscano <pino@kde.org>
+Date:  Thu Mar 4 13:16:11 2010 +0100
+
+    [Qt4] use Arthur unconditionally
+
+    arthur is no more tied to splash, so can be used in an occasion
+
+ qt4/src/poppler-document.cc |   2 +-
+ qt4/src/poppler-page.cc     |   4 +---
+ 2 files changed, 2 insertions(+), 4 deletions(-)
+
+commit 41931b6310d2ae81e622db904246f019ceb8410d
+Author: Pino Toscano <pino@kde.org>
+Date:  Thu Mar 4 13:13:11 2010 +0100
+
+    [Qt4] compile Arthur unconditionally
+
+    as the arthur output dev does not require splash anymore, we can
+    always compile it with poppler-qt4
+
+ poppler/Makefile.am   |    4 ++--
+ qt4/src/CMakeLists.txt |    6 +-----
+ qt4/src/Makefile.am   |    6 +-----
+ 3 files changed, 4 insertions(+), 12 deletions(-)
+
+commit 48a29e2bbc9aa9bd0cb2775a2365c0ffdeb6ce87
+Author: Pino Toscano <pino@kde.org>
+Date:  Thu Mar 4 13:11:43 2010 +0100
+
+    [Arthur] make ArthurOutputDev compile even with Splash disabled
+
+    text rendering is disabled in that case for now
+
+ poppler/ArthurOutputDev.cc |  11 ++++++++++-
+ 1 file changed, 10 insertions(+), 1 deletion(-)
+
+commit 2013a19b6457753890affad8c4049f2ce4627df7
+Author: Pino Toscano <pino@kde.org>
+Date:  Thu Mar 4 13:02:43 2010 +0100
+
+    [CMake/tests] compile gtk-splash-test only if splash is enabled
+
+ test/CMakeLists.txt |  14 +++++++++-----
+ 1 file changed, 9 insertions(+), 5 deletions(-)
+
+commit ae740c5cfefbae13f82b750e39fa3dbbdc94858b
+Author: Pino Toscano <pino@kde.org>
+Date:  Tue Mar 2 23:22:06 2010 +0100
+
+    [cpp] update the copyrights
+
+ cpp/poppler-document-private.h |    2 +-
+ cpp/poppler-document.cpp      |    2 +-
+ cpp/poppler-embedded-file.cpp |    2 +-
+ cpp/poppler-embedded-file.h   |    2 +-
+ cpp/poppler-global.cpp                |    3 ++-
+ cpp/poppler-global.h          |    2 +-
+ cpp/poppler-page.cpp          |    2 +-
+ cpp/poppler-page.h            |    2 +-
+ cpp/poppler-rectangle.h       |    2 +-
+ cpp/poppler-toc.cpp           |    2 +-
+ cpp/poppler-version.cpp       |    2 +-
+ cpp/tests/poppler-dump.cpp    |    2 +-
+ 12 files changed, 13 insertions(+), 12 deletions(-)
+
+commit 24b1d8d0b4ae7cea9fbc331f19cd5ce3917b8b4d
+Author: Pino Toscano <pino@kde.org>
+Date:  Tue Mar 2 23:15:56 2010 +0100
+
+    [cpp] {from,to}_utf_8() -> {from,to}_utf8()
+
+ cpp/poppler-global.cpp |    4 ++--
+ cpp/poppler-global.h  |    4 ++--
+ cpp/poppler-page.cpp  |    2 +-
+ 3 files changed, 5 insertions(+), 5 deletions(-)
+
+commit 690af1bc58de1ebe710c5e599f1cb635e4838fc8
+Author: Hib Eris <hib@hiberis.nl>
+Date:  Tue Mar 2 16:33:04 2010 +0100
+
+    [cpp] define poppler_cpp_EXPORTS when building with autotools as well
+
+    fixes building on Windows
+
+ cpp/Makefile.am |    3 +++
+ 1 file changed, 3 insertions(+)
+
+commit 7492a376e7e5ec35534276ac15485123645617b0
+Author: Pino Toscano <pino@kde.org>
+Date:  Tue Mar 2 22:16:07 2010 +0100
+
+    [cpp/tests] use gmtime() when gmtime_r() is not available
+
+ cpp/tests/poppler-dump.cpp |   9 ++++++++-
+ 1 file changed, 8 insertions(+), 1 deletion(-)
+
+commit de013cc14a0621782c53f481ed7e559f241855a3
+Author: Pino Toscano <pino@kde.org>
+Date:  Tue Mar 2 22:05:25 2010 +0100
+
+    [cpp] include config.h _after_ the other includes
+
+ cpp/poppler-global.cpp |    4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 388e5d6aebcabbfc90894c86248159c63701cb0a
+Author: Hib Eris <hib@hiberis.nl>
+Date:  Tue Mar 2 15:51:23 2010 +0100
+
+    Use ICONV_CONST when necessary
+
+ cpp/poppler-global.cpp |   10 ++++++----
+ 1 file changed, 6 insertions(+), 4 deletions(-)
+
+commit aaa58b26733a2f7c778632da4942b588050cf33f
+Author: Pino Toscano <pino@kde.org>
+Date:  Tue Mar 2 21:53:55 2010 +0100
+
+    [CMake] properly define ICONV_CONST
+
+ CMakeLists.txt                       |    1 -
+ cmake/modules/FindIconv.cmake |    3 +++
+ config.h.cmake                       |    2 +-
+ 3 files changed, 4 insertions(+), 2 deletions(-)
+
+commit 6304b0d8959fccf96b030c757d78e845d04757e4
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Sun Feb 28 15:33:53 2010 +0100
+
+    poppler 0.13.1
+
+ CMakeLists.txt   |    2 +-
+ NEWS            |   33 +++++++++++++++++++++++++++++++++
+ configure.ac    |    2 +-
+ cpp/Doxyfile    |    2 +-
+ qt4/src/Doxyfile |    2 +-
+ 5 files changed, 37 insertions(+), 4 deletions(-)
+
+commit 9eac71862915c851c07075e3ca3af82eb9e4e775
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Sun Feb 28 15:33:19 2010 +0100
+
+    Make sure the private headers end up in the tarball on make dist
+
+ cpp/Makefile.am |    5 +++++
+ 1 file changed, 5 insertions(+)
+
+commit b488172311c2921ab4c365d71ad8b1ab7f596c71
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Sun Feb 28 14:25:36 2010 +0100
+
+    Add copyright notices
+
+ poppler/CairoFontEngine.cc |   3 ++-
+ poppler/CairoFontEngine.h  |   2 +-
+ 2 files changed, 3 insertions(+), 2 deletions(-)
+
+commit 5453cff5b7cb47cadfdae585a58409117af8c1f1
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Sun Feb 28 13:51:22 2010 +0100
+
+    [cairo] Select filter for images based on scale factor
+
+    When rendering images and interpolate flag is disabled or missing, we
+    always interpolate unless scale factor is >= 400%
+
+    See bugs #25268, #9860
+
+ poppler/CairoOutputDev.cc |   64
+ +++++++++++++++++++++++++++++++++------------
+ poppler/CairoOutputDev.h  |   2 ++
+ 2 files changed, 49 insertions(+), 17 deletions(-)
+
+commit e65456cbd5cae2750426aabeb2d66a10537616f0
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Sun Feb 28 13:13:13 2010 +0100
+
+    [cairo] Refactor scaled size computation into a new method
+
+ poppler/CairoOutputDev.cc |   52
+ ++++++++++++++++++++++-----------------------
+ poppler/CairoOutputDev.h  |   2 ++
+ 2 files changed, 28 insertions(+), 26 deletions(-)
+
+commit 32aa9ae7d0087298661829265de00e93398272b3
+Author: Jan Kümmel <jan+freedesktop@snorc.org>
+Date:  Sat Feb 27 17:58:46 2010 +0100
+
+    [cairo] Omit writing of embedded fonts into tempary files
+
+    Fixes bug #26694.
+
+ poppler/CairoFontEngine.cc |  146
+ ++++++++++++++++++++++++--------------------
+ 1 file changed, 80 insertions(+), 66 deletions(-)
+
+commit 7ba52a32343ca73730a80b64c136e3f03348e7d9
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Sat Feb 27 17:42:46 2010 +0100
+
+    [cairo] Remove unused 'face' from CairoFreeTypeFont class
+
+ poppler/CairoFontEngine.cc |   6 ++----
+ poppler/CairoFontEngine.h  |   3 +--
+ 2 files changed, 3 insertions(+), 6 deletions(-)
+
+commit 7c3140c88c00282e10888143fffe3c402d48fb05
+Author: Adrian Johnson <ajohnson@redneon.com>
+Date:  Sat Feb 27 13:13:47 2010 +0100
+
+    Don't use '\' character in PostScript names
+
+ poppler/PSOutputDev.cc |    4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 8e354a15a1861719c00799937ad9f9bb1bb71e9f
+Author: Thomas Freitag <Thomas.Freitag@alfa.de>
+Date:  Wed Feb 24 18:58:11 2010 +0000
+
+    Fix remaining part of 26243
+
+    Thomas says: The "gn" is colored with a shading pattern, but the
+    shading has a bbox,
+    so it is clipped to this bbox, too. But when coloring text or masks in
+    pattern colorspace, this is definely wrong.
+
+ poppler/Gfx.cc |    3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+commit fcbc571a98775b1daa8f562fc8674fb2d15b6626
+Author: Pino Toscano <pino@kde.org>
+Date:  Tue Feb 23 17:02:47 2010 +0100
+
+    [cpp] make checksum() return an array of data, instead of a string
+
+    a checksum is a sequence of values after all, so just return it as
+    such instead of pretending it is a string
+    accordingly adapt the mini dump application
+
+ cpp/poppler-embedded-file.cpp |   10 ++++++++--
+ cpp/poppler-embedded-file.h   |    2 +-
+ cpp/tests/poppler-dump.cpp    |    4 ++--
+ 3 files changed, 11 insertions(+), 5 deletions(-)
+
+commit fbefb9bef9f7a099d51919255a98f412d1e1d696
+Author: Pino Toscano <pino@kde.org>
+Date:  Tue Feb 23 16:56:47 2010 +0100
+
+    [cpp apidox] add API documentation for the 'embedded_file' class
+
+ cpp/poppler-embedded-file.cpp |   43
+ +++++++++++++++++++++++++++++++++++++++++
+ 1 file changed, 43 insertions(+)
+
+commit 6d39cca0a035fc656d3b86ba66dedaccee532fcb
+Author: Pino Toscano <pino@kde.org>
+Date:  Tue Feb 23 16:41:56 2010 +0100
+
+    [cpp apidox] add API documentation for the 'toc' and 'toc_item'
+    classes
+
+ cpp/poppler-toc.cpp |  57
+ +++++++++++++++++++++++++++++++++++++++++++++++++++
+ 1 file changed, 57 insertions(+)
+
+commit 857e4ceb26d959c48c7af6bff53ca1bfe5307236
+Author: Pino Toscano <pino@kde.org>
+Date:  Tue Feb 23 15:39:58 2010 +0100
+
+    [cpp] when the loading of the document fails, put back the data
+    where it was before
+
+ cpp/poppler-document-private.h |    2 +-
+ cpp/poppler-document.cpp      |   10 +++++++---
+ 2 files changed, 8 insertions(+), 4 deletions(-)
+
+commit 7838b182143086192ac8dcf571da0ce1743619e2
+Author: Pino Toscano <pino@kde.org>
+Date:  Tue Feb 23 00:04:09 2010 +0100
+
+    [cpp] add the directory of the generated html apidox to the ignore
+    list
+
+ cpp/.gitignore |    1 +
+ 1 file changed, 1 insertion(+)
+
+commit 71a38a23a9db5cac872c666283b7abcb1462210c
+Author: Pino Toscano <pino@kde.org>
+Date:  Mon Feb 22 23:43:34 2010 +0100
+
+    [cpp] add page::text() to get the text inside a page region
+
+ cpp/poppler-page.cpp |   16 ++++++++++++++++
+ cpp/poppler-page.h   |    1 +
+ 2 files changed, 17 insertions(+)
+
+commit 4c75360233bc67f097551980a46ecce976927220
+Author: Pino Toscano <pino@kde.org>
+Date:  Mon Feb 22 23:05:53 2010 +0100
+
+    [cpp] add page::search()
+
+ cpp/poppler-page.cpp |   51
+ ++++++++++++++++++++++++++++++++++++++++++++++++++
+ cpp/poppler-page.h   |    8 ++++++++
+ 2 files changed, 59 insertions(+)
+
+commit 8932c53a084083eb42d109dd17bac3ad41ce65b5
+Author: Pino Toscano <pino@kde.org>
+Date:  Mon Feb 22 22:39:36 2010 +0100
+
+    [cpp] add getters and setters for left/top/right/bottom
+
+ cpp/poppler-rectangle.h |   18 ++++++++++++++++++
+ 1 file changed, 18 insertions(+)
+
+commit 8e1ea57f558fa3a1702a17d79b5aaffc486c6a56
+Author: Pino Toscano <pino@kde.org>
+Date:  Mon Feb 22 22:19:51 2010 +0100
+
+    [cpp] add a global enum for case sensitivity
+
+ cpp/poppler-global.h |    2 ++
+ 1 file changed, 2 insertions(+)
+
+commit ae41b087de8f0a7d525320dcf1d64ff22fe982b6
+Author: Pino Toscano <pino@kde.org>
+Date:  Mon Feb 22 19:06:21 2010 +0100
+
+    [cpp apidox] doxygen configuration for poppler-cpp
+
+ cpp/Doxyfile | 1551
+ ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+ 1 file changed, 1551 insertions(+)
+
+commit 1a36a7bcc684065478a3ade2c2938f0e3672140a
+Author: Pino Toscano <pino@kde.org>
+Date:  Mon Feb 22 19:05:49 2010 +0100
+
+    [cpp apidox] very small start of intro page
+
+ cpp/Mainpage.dox |    9 +++++++++
+ 1 file changed, 9 insertions(+)
+
+commit 85e052ab7a4c462143325ecf60eebba35411b790
+Author: Pino Toscano <pino@kde.org>
+Date:  Mon Feb 22 18:53:20 2010 +0100
+
+    [cpp apidox] start adding API documentation for the global 'poppler'
+    namespace
+
+    ... including the 'convert_date' function and faking the 'noncopyable'
+    class
+
+ cpp/poppler-global.cpp |   16 ++++++++++++++++
+ 1 file changed, 16 insertions(+)
+
+commit b01608f91fb6cf6e9c4fb6e6ee3cb57517a766bf
+Author: Pino Toscano <pino@kde.org>
+Date:  Mon Feb 22 18:52:24 2010 +0100
+
+    [cpp apidox] exclude the 'detail' namespace from apidox extraction
+
+    this includes also the 'noncopyable' typedef, but that will be
+    handled differently
+
+ cpp/poppler-global.h |    2 ++
+ 1 file changed, 2 insertions(+)
+
+commit f17a7a8cfdeabb3ced3ba8d42c869d892c528e13
+Author: Pino Toscano <pino@kde.org>
+Date:  Mon Feb 22 18:51:30 2010 +0100
+
+    [cpp apidox] add API documentation for the version functions
+
+ cpp/poppler-version.cpp |   12 ++++++++++++
+ 1 file changed, 12 insertions(+)
+
+commit f6c4bbddc7d04c0b1a6b25c41cbf6d81ae40cc0c
+Author: Pino Toscano <pino@kde.org>
+Date:  Mon Feb 22 18:50:54 2010 +0100
+
+    [cpp apidox] start adding API documentation for 'document'
+
+ cpp/poppler-document.cpp |  182
+ ++++++++++++++++++++++++++++++++++++++++++++++
+ 1 file changed, 182 insertions(+)
+
+commit cbb7519904d9b6395d0128e16a79324e4b8bfcc0
+Author: Pino Toscano <pino@kde.org>
+Date:  Mon Feb 22 13:15:11 2010 +0100
+
+    [CMake] no more need to build system check for the Cairo blend modes
+
+    followup of 880890c14e99a954b365a3a6b59deeffa5304d30 for the cmake
+    build system
+
+ cmake/modules/FindCairo.cmake |   18 ------------------
+ config.h.cmake                       |    3 ---
+ 2 files changed, 21 deletions(-)
+
+commit 80f47bbf45faf751c661c1d0931e8e1da622b8ca
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Mon Feb 22 12:43:06 2010 +0100
+
+    [cairo] Use cairo_surface_set_mime_data() when printing
+
+    When rendering a jpeg image for printing, using
+    cairo_surface_set_mime_data() to attach the jpeg stream to the
+    surface reduces drastically the size of the output file.
+
+ poppler/CairoOutputDev.cc |   42
+ ++++++++++++++++++++++++++++++++++++++++++
+ poppler/CairoOutputDev.h  |   1 +
+ 2 files changed, 43 insertions(+)
+
+commit d63293af6dbff65f160be0118b1580c03a1aab56
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Fri Nov 27 09:52:23 2009 +0100
+
+    [cairo] Turn EXTEND_PAD off when printing
+
+ poppler/CairoOutputDev.cc |   98
+ +++++++++++++++++++++++++++++++--------------
+ 1 file changed, 67 insertions(+), 31 deletions(-)
+
+commit 880890c14e99a954b365a3a6b59deeffa5304d30
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Mon Feb 22 11:01:05 2010 +0100
+
+    [cairo] Use CAIRO_VERSION macros to check whether blend modes are
+    available
+
+ configure.ac             |   24 ------------------------
+ poppler/CairoOutputDev.cc |   4 ++--
+ 2 files changed, 2 insertions(+), 26 deletions(-)
+
+commit 5c300ce00b5c59da767ca1ffec12f96f0ebbe701
+Author: Pino Toscano <pino@kde.org>
+Date:  Sun Feb 21 21:20:10 2010 +0100
+
+    [Qt4/apidox] fix typo
+
+ qt4/src/poppler-qt4.h |    2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 3f89ccf871e2f4a14129ad3e986b8cd19cdf129c
+Author: Pino Toscano <pino@kde.org>
+Date:  Sun Feb 21 21:06:31 2010 +0100
+
+    [CMake] set the CXXFLAGS in a better way
+
+ CMakeLists.txt |    4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit a18dab9e53a20a76eb46fa3a868fffdd3c754ce2
+Merge: fa09892 f3862f7
+Author: Pino Toscano <pino@kde.org>
+Date:  Sun Feb 21 19:56:38 2010 +0100
+
+    Merge remote branch 'origin/cpp-frontend'
+
+    * origin/cpp-frontend: (34 commits)
+      [cpp/tests] poppler-dump: show a string for the font type
+      [cpp/tests] poppler-dump: show the orientation of the pages
+      [cpp/tests] poppler-dump: a bit less output in permissions lines
+      [cpp/tests] poppler-dump: add --show-all to show all the information
+      [cpp] use iconv for the utf8 <-> utf16 conversions
+      [cpp] add the build system stuff for iconv, mandatory for cpp
+      [cpp] fixup unicode GooString <-> ustring conversions
+      [cpp] fix installation of poppler-version.h with autotools and
+      builddir != srcdir
+      simplify
+      [cpp/tests] add a simple poppler-dump test
+      [cpp] use the correct index (instead of an uninitialized variable)
+      [cpp] properly delete the children of a toc item
+      [cpp] actually implement toc::root()
+      [cpp] fix the reference to the vector data
+      [cpp] fix the reference to the vector data
+      [cpp] add destructor for 'rectangle'
+      [cpp] add out stream operators for rect and rectf
+      [cpp] add namespace to namespace functiond to link properly
+      [cpp] add default empty parameters for the passwords of the document
+      loading functions
+      [cpp] add "human friendly" output representation for byte_array
+      ...
+
+    Conflicts:
+       config.h.cmake
+
+commit fa0989297e95b6adebed71336ea206d1b279ab24
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Sun Feb 21 16:59:57 2010 +0000
+
+    Detect the need for nanosleep in solaris
+
+    Fixes bug 26650
+
+ ConfigureChecks.cmake |    5 +++++
+ test/CMakeLists.txt   |   17 +++++++++++------
+ 2 files changed, 16 insertions(+), 6 deletions(-)
+
+commit d074485aa9d9fac6b715382002f53e3303bbc519
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Sat Feb 20 10:08:33 2010 +0000
+
+    Do not call getPixel if we know how to access the data
+
+    Gives a 20% speed increase in some pdf
+
+ splash/Splash.cc |   19 ++++++++++---------
+ 1 file changed, 10 insertions(+), 9 deletions(-)
+
+commit d4cafe357bd86feb4b56e5dfbf5b7822e237a2ee
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Sat Feb 20 10:07:20 2010 +0000
+
+    Only call getPixel when really needed
+
+    Gives a 8% speed increase in some pdf
+
+ splash/Splash.cc |    6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
+
+commit c3122cfbe090f3a4045269222f941cd5ce77c171
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Sat Feb 20 10:04:37 2010 +0000
+
+    Move test code to the header to it can be inlined
+
+    Gives a 10% speed increase in some documents
+
+ splash/SplashClip.cc |   40 ++++++++++++++--------------------------
+ splash/SplashClip.h  |   43 +++++++++++++++++++++++++++++++++++++++++--
+ 2 files changed, 55 insertions(+), 28 deletions(-)
+
+commit d987fb9b77e6da454eb898cc6c8baaf747b7ac4f
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Fri Feb 19 23:59:03 2010 +0000
+
+    implement writeImgFile for splashModeXBGR8
+
+ splash/SplashBitmap.cc |   25 +++++++++++++++++++++++--
+ 1 file changed, 23 insertions(+), 2 deletions(-)
+
+commit f9425c0b5b112ac673d0499f79a743afce719593
+Author: Hib Eris <hib@hiberis.nl>
+Date:  Fri Feb 19 20:18:13 2010 +0000
+
+    use pkgconfig to detect libpng on autotools too
+
+ configure.ac       |   12 ++++---
+ goo/Makefile.am     |   7 +++-
+ m4/libpng.m4       |   99
+ ---------------------------------------------------
+ poppler/Makefile.am |   3 ++
+ 4 files changed, 17 insertions(+), 104 deletions(-)
+
+commit 0cb07d645527f25997f5e1b104a6be92441d8ffa
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Thu Feb 18 23:27:20 2010 +0000
+
+    Only swap w with h if rotation is 90 or 270
+
+ utils/pdftoppm.cc |   4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 35015ed11090d67cab69443e607d4d80ca03c619
+Author: Nils Höglund <nils.hoglund@gmail.com>
+Date:  Thu Feb 18 23:14:51 2010 +0000
+
+    Match the number of calls to beginMarkedContent and endMarkedContent
+
+ poppler/Gfx.cc |    3 +++
+ 1 file changed, 3 insertions(+)
+
+commit ee265760e6ecec93fe26fb8e02848872555daefd
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Thu Feb 18 23:13:48 2010 +0000
+
+    make sure properties exists before using it
+
+ poppler/TextOutputDev.cc |    4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit eab7a55815c06525c7aeba254b66498ab147a958
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Wed Feb 17 21:54:31 2010 +0000
+
+    if malloc failed return false
+
+ splash/SplashFTFont.cc |    5 ++++-
+ 1 file changed, 4 insertions(+), 1 deletion(-)
+
+commit e2def20a45c1d8307fd62fabb9769121af975abf
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Tue Feb 16 23:31:05 2010 +0000
+
+    Only assume the OC is not visible if it exists and is set to no
+
+    Fixes bug 26532 and a small line that was not drawn in 15899
+
+ poppler/OptionalContent.cc |   4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 5edd175bdd0f7c2fc3aecb72384de4cb0788fc4e
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Tue Feb 16 20:57:22 2010 +0000
+
+    Add and fix copyright years
+
+ poppler/CairoOutputDev.cc |   2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 0f0fba1b04589061449f98b9dcd8a0c4e7ad2d74
+Author: Pino Toscano <pino@kde.org>
+Date:  Tue Feb 16 22:00:51 2010 +0100
+
+    make the descriptions specify they refer to the Splash backend
+
+ config.h.cmake |    4 ++--
+ configure.ac  |    4 ++--
+ 2 files changed, 4 insertions(+), 4 deletions(-)
+
+commit 39b4699020b5cfa1a10e5ef00f0e355e27b21c9f
+Author: Pino Toscano <pino@kde.org>
+Date:  Tue Feb 16 21:56:30 2010 +0100
+
+    [CMake] reflect that poppler-glib needs cairo now
+
+ poppler-glib.pc.cmake |    2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 5c66c775bcd686c61ea136bcd8f261fb631c5e71
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Tue Feb 16 20:52:15 2010 +0000
+
+    We don't need to pass anything to FontConfig
+
+    Makes it much easier to manage and also fixes bug 26544
+
+ poppler/GlobalParams.cc |   11 +++--------
+ poppler/GlobalParams.h  |    6 +-----
+ 2 files changed, 4 insertions(+), 13 deletions(-)
+
+commit 582b5259b3c65ee1bef99dbdfccf00f37269b76f
+Author: Pino Toscano <pino@kde.org>
+Date:  Tue Feb 16 16:36:24 2010 +0100
+
+    [CMake] find the system threads, and define in the config.h if we
+    have pthreads
+
+ CMakeLists.txt |    4 ++++
+ config.h.cmake |    3 +++
+ 2 files changed, 7 insertions(+)
+
+commit 1dff9d440556a155fb5ca7bed15fc6a1f77a1c97
+Author: Pino Toscano <pino@kde.org>
+Date:  Tue Feb 16 16:10:44 2010 +0100
+
+    [CMake] add the HAVE_LIBOPENJPEG and HAVE_OPENJPEG_H defines, to
+    match autotools' ones
+
+ CMakeLists.txt |    1 +
+ config.h.cmake |    6 ++++++
+ 2 files changed, 7 insertions(+)
+
+commit 4a0bcaa83e6e6533cd48c63449a08467d51c13ea
+Author: Pino Toscano <pino@kde.org>
+Date:  Tue Feb 16 16:01:53 2010 +0100
+
+    [CMake] config.h.cmake: change some comments to match autotools' ones
+
+ config.h.cmake |   10 ++++++----
+ 1 file changed, 6 insertions(+), 4 deletions(-)
+
+commit 9e38082c3e571d035f0152d65661e5dd97fdd5d8
+Author: Pino Toscano <pino@kde.org>
+Date:  Tue Feb 16 15:58:30 2010 +0100
+
+    [CMake] add the Win32-specific ENABLE_RELOCATABLE option, matching
+    autotools' one
+
+ CMakeLists.txt |    5 +++++
+ config.h.cmake |    3 +++
+ 2 files changed, 8 insertions(+)
+
+commit eb03020893ed591c18817d75d427a1296cb1f233
+Author: Pino Toscano <pino@kde.org>
+Date:  Tue Feb 16 15:49:50 2010 +0100
+
+    [CMake] config.h.cmake: move POPPLER_WITH_GDK in the same place of
+    autotools' generated one, and with the same comment
+
+ config.h.cmake |    6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
+
+commit ba65b3af047b758094b999b2939065c5127508dd
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Wed Feb 10 23:08:04 2010 +0000
+
+    Wrap #include <jpeglib.h> in extern "C" to fix build
+
+    Fixes bug 26351
+
+ goo/JpegWriter.h |    6 +++++-
+ 1 file changed, 5 insertions(+), 1 deletion(-)
+
+commit d3d2a3ee0a3505f44d1196823716b768d434ba73
+Author: Pino Toscano <pino@kde.org>
+Date:  Wed Feb 10 23:16:27 2010 +0100
+
+    [CMake] fix typo: "MULTITHREAD" -> "MULTITHREADED"
+
+ CMakeLists.txt |    2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 0dae2294cf8a2f312d8e6504be4e1be516b34b1b
+Author: Thomas Freitag <Thomas.Freitag@alfa.de>
+Date:  Tue Feb 9 21:44:07 2010 +0000
+
+    Fix regression in painting. Fixes bug 26243
+
+ poppler/Gfx.cc |    9 ++++++++-
+ 1 file changed, 8 insertions(+), 1 deletion(-)
+
+commit aa9c3acbc73bafb33c8a797701ed0488a4a74263
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Thu Jan 28 17:23:18 2010 +0100
+
+    [cairo] Add clipToStrokePath() method
+
+    It's unimplemented, it just contains a log message to help when
+    debugging.
+
+ poppler/CairoOutputDev.cc |   4 ++++
+ poppler/CairoOutputDev.h  |   1 +
+ 2 files changed, 5 insertions(+)
+
+commit 41a450c8db45fd064798d15c3d8fe5ab536a7b30
+Author: David Benjamin <davidben@mit.edu>
+Date:  Fri Jan 22 00:26:59 2010 -0500
+
+    [cairo] Avoid leaving pointers to free'd memory
+
+    Fixes potential free'd memory access introduced by
+    3a94e8ce90c0a4d11c5c5aa8805c167c8a0434e5. I don't think this is
+    actually
+    possible in the current code; we push/pop before and after rendering a
+    PDF, so the bottom state should never have a mask.
+
+    Still, better to clean this up.
+
+ poppler/CairoOutputDev.cc |   5 ++---
+ 1 file changed, 2 insertions(+), 3 deletions(-)
+
+commit 309228404710debee4337cc53c641dfef64ad86c
+Author: David Benjamin <davidben@mit.edu>
+Date:  Wed Jan 27 22:41:16 2010 +0000
+
+    Allow commands to abort the current stream
+
+    In many instances, the sensible response (and what acroread does) in
+    case of an error is abort the PDF stream. To avoid changing the return
+    value of every function and using C++ exceptions, we communicate via a
+    commandAborted variable.
+
+    This patch, matching acroread's behavior aborts the current stream
+    when
+    there are too few arguments or we pop too many times. Implementation
+    note 39 in Appendix H of the PDF reference contradicts the former, but
+    hand-crafted test PDFs as well as the file in #24575 suggest
+    otherwise.
+
+    Unlike all the other attempts, this patch actually fixes the PDF in
+    bug #24575.
+
+ poppler/Gfx.cc |   11 +++++++++++
+ poppler/Gfx.h |    1 +
+ 2 files changed, 12 insertions(+)
+
+commit 8284008aa8230a92ba08d547864353d3290e9bf9
+Author: David Benjamin <davidben@mit.edu>
+Date:  Wed Jan 27 22:40:33 2010 +0000
+
+    Add a stack of stateGuards to Gfx
+
+    While a stack of states is a good way to maintain graphics contexts,
+    if
+    the command stream you are interpreting is untrusted, we must place
+    appropriate guards to be sure that, not only do we not pop past
+    the end
+    of the stack, but we do not pop past the stack as it was when we began
+    rendering.
+
+ poppler/Gfx.cc |   30 +++++++++++++++++++++++++++++-
+ poppler/Gfx.h |   11 +++++++++++
+ 2 files changed, 40 insertions(+), 1 deletion(-)
+
+commit 4ae84c830f842d100cbb702b32970951a5a5769f
+Author: David Benjamin <davidben@mit.edu>
+Date:  Wed Jan 27 22:39:20 2010 +0000
+
+    Maintain the height of the stack in Gfx
+
+    Introduces a new variable Gfx::stackHeight that maintains up-to-date
+    information about the current height of the stack.
+
+ poppler/Gfx.cc |    4 ++++
+ poppler/Gfx.h |    1 +
+ 2 files changed, 5 insertions(+)
+
+commit 120fe6ef673c648ae7b19ad2a7e9aef22ee25810
+Author: David Benjamin <davidben@mit.edu>
+Date:  Wed Jan 27 22:38:43 2010 +0000
+
+    Do not use objects just after deleting them
+
+    The error condition in GfxCIDFont::GfxCIDFont references cMapName and
+    collection, so they should not be deleted yet.
+
+ poppler/GfxFont.cc |   8 +++++---
+ 1 file changed, 5 insertions(+), 3 deletions(-)
+
+commit 3375fa96c7a7dbbb98f5a7b3df9e840a5f30bc80
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Wed Jan 27 22:32:29 2010 +0000
+
+    GooVector rewrite, old version had "unknown" origins/license
+
+ goo/GooVector.h |  237
+ +++++++++++++++++++++++++++++++++----------------------
+ 1 file changed, 141 insertions(+), 96 deletions(-)
+
+commit a945fe64e16ac9aa2577c5db05fc7f3fd4955b7b
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Wed Jan 27 16:15:40 2010 +0100
+
+    [cairo] Fix downscaling images when document is rotated
+
+    Fixes bug #26264.
+
+ poppler/CairoOutputDev.cc |   37 +++++++++++++++++++++++++++++++++++--
+ 1 file changed, 35 insertions(+), 2 deletions(-)
+
+commit 428cc965c17f167ea00540beeaeaac5c3e426686
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Tue Jan 26 21:01:32 2010 +0000
+
+    Add POPPLER_WITH_GDK in cmake build system
+
+    Bug 26247
+
+ glib/CMakeLists.txt          |    1 +
+ glib/poppler-features.h.cmake |    1 +
+ 2 files changed, 2 insertions(+)
+
+commit 0af1ae75fd4c8031343f668bed5d8ca6588ee652
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Tue Jan 26 20:49:17 2010 +0100
+
+    [cairo] Use the right matrix for the mask in drawMaskedImage()
+
+    Fixes bug #16906.
+
+ poppler/CairoOutputDev.cc |   7 +++++--
+ 1 file changed, 5 insertions(+), 2 deletions(-)
+
+commit d8ceaff39f5b80624b6bdc703c2a180dfc3d73ee
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Tue Jan 26 11:57:06 2010 +0100
+
+    [cairo] Add some more LOG messages
+
+ poppler/CairoOutputDev.cc |   18 +++++++++++++++---
+ 1 file changed, 15 insertions(+), 3 deletions(-)
+
+commit 778e764b3cb77526260c3c8b46acf19ad06fc61d
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Mon Jan 25 22:40:20 2010 +0000
+
+    poppler 0.13.0
+
+ CMakeLists.txt      |   4 +--
+ NEWS               |   99
+ +++++++++++++++++++++++++++++++++++++++++++++++++++
+ configure.ac       |    2 +-
+ poppler/Makefile.am |   2 +-
+ qt4/src/Doxyfile    |   2 +-
+ 5 files changed, 104 insertions(+), 5 deletions(-)
+
+commit 1b5333f2685b8ab85bb1f5b899332c5a0ac99a3d
+Author: Pino Toscano <pino@kde.org>
+Date:  Mon Jan 25 02:19:00 2010 +0100
+
+    [CMake] allow multiple targets with the same name
+
+    this is needed for building the unit tests later without explicitly
+    having
+    enabling them at configure time (thus compile them on-demand)
+    for this, set the cmake policy 0003 as OLD (allow), and consecuently
+    0011 for
+    setting the former from an include()d script
+
+ cmake/modules/PopplerDefaults.cmake |   7 +++++++
+ 1 file changed, 7 insertions(+)
+
+commit 92e1f46866c063c370ef1d6324f6a6c01aed6680
+Author: Pino Toscano <pino@kde.org>
+Date:  Mon Jan 25 02:15:27 2010 +0100
+
+    [CMake] do not add the fake buildtests target for the MSVC IDE
+
+ cmake/modules/PopplerMacros.cmake |   4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit dea5aa37de079196fa916b1db9af782cf25045f9
+Author: Maciej Mrozowski <reavertm@gmail.com>
+Date:  Mon Jan 25 00:51:20 2010 +0000
+
+    Install some more goo files
+
+ CMakeLists.txt |    9 +++++++++
+ 1 file changed, 9 insertions(+)
+
+commit 671a971c45a1e8ce8f6daade82117a9a137034d6
+Author: Maciej Mrozowski <reavertm@gmail.com>
+Date:  Mon Jan 25 00:48:31 2010 +0000
+
+    do not install a private header
+
+ qt4/src/Makefile.am |   6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
+
+commit 54c86e53a143a8f9d196e4bef2a733c6f00f6026
+Author: Maciej Mrozowski <reavertm@gmail.com>
+Date:  Mon Jan 25 00:33:07 2010 +0000
+
+    Only build tests if told to
+
+ test/CMakeLists.txt |   4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit eb082274694aadb80dd16caea65d7f0a1adf8b46
+Author: Maciej Mrozowski <reavertm@gmail.com>
+Date:  Mon Jan 25 00:29:55 2010 +0000
+
+    Only build demos and test if told so. Install poppler-layer.h
+
+ glib/CMakeLists.txt |   9 +++++----
+ 1 file changed, 5 insertions(+), 4 deletions(-)
+
+commit 73fcc310cd7d6ef435b453485c1c99a33f77212a
+Author: Maciej Mrozowski <reavertm@gmail.com>
+Date:  Mon Jan 25 00:29:09 2010 +0000
+
+    install man pages
+
+ utils/CMakeLists.txt |    7 +++++++
+ 1 file changed, 7 insertions(+)
+
+commit 8672217af4cf88d5506572c2b40fbb0d1d0dbd87
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Mon Jan 25 00:11:50 2010 +0000
+
+    Make the poppler object cache params be a ref
+
+    And make sure what we was is a ref, otherwise we abort
+
+ poppler/Gfx.cc                 |   14 ++++++++------
+ poppler/PopplerCache.cc |   12 ++++++------
+ poppler/PopplerCache.h  |    6 +++---
+ 3 files changed, 17 insertions(+), 15 deletions(-)
+
+commit 9567fd8d3d905897d0abacd77885102ae86ba8a9
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Sun Jan 24 20:15:49 2010 +0000
+
+    ImgWriter is a header too
+
+ goo/Makefile.am |    1 +
+ 1 file changed, 1 insertion(+)
+
+commit 735e8a690d0bd3ab4bec90bdad975d19ac3d4689
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Sun Jan 24 19:51:19 2010 +0000
+
+    noone maintains this either
+
+ msvc/config.h                |   62 ---------------------------------
+ msvc/poppler/poppler-config.h |   77
+ -----------------------------------------
+ 2 files changed, 139 deletions(-)
+
+commit d485564f0dc86f62b996380bfbd570cf3f543e4f
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Sun Jan 24 19:22:33 2010 +0000
+
+    remove files noone maintains
+
+ README.windows |   63 ------------------------
+ makefile.vc   |  150
+ --------------------------------------------------------
+ 2 files changed, 213 deletions(-)
+
+commit 38467f2738c88f060ae1d30332e34da743a888a5
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Sun Jan 24 19:18:44 2010 +0000
+
+    only compile glib frontend if cairo is found
+
+ CMakeLists.txt      |   4 ++--
+ glib/CMakeLists.txt |  25 +++++++------------------
+ 2 files changed, 9 insertions(+), 20 deletions(-)
+
+commit cf045acf46307d51fb6d9959451b53681e6cac03
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Sun Jan 24 19:01:52 2010 +0000
+
+    compile
+
+ glib/CMakeLists.txt |   1 +
+ 1 file changed, 1 insertion(+)
+
+commit 0397cf4f193015286464ae70ab202ed400110e30
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Sun Jan 24 19:00:09 2010 +0000
+
+    Add and fix copyright years
+
+ poppler/CairoFontEngine.cc |   1 +
+ poppler/CairoOutputDev.cc  |   2 +-
+ poppler/CairoOutputDev.h   |   2 +-
+ poppler/Gfx.cc                    |    2 +-
+ poppler/Gfx.h             |    2 +-
+ poppler/PopplerCache.cc    |   1 +
+ poppler/PopplerCache.h     |   1 +
+ 7 files changed, 7 insertions(+), 4 deletions(-)
+
+commit 9c9f18b6ceea546dfb21ef0aab29ba99733dcb52
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Sun Jan 24 19:27:29 2010 +0100
+
+    [glib-demo] Remove #ifdef HAVE_CAIRO macros from several demos
+
+ glib/demo/images.c |   2 --
+ glib/demo/layers.c |  71
+ +++-------------------------------------------------
+ glib/demo/render.c |  29 ++++-----------------
+ 3 files changed, 9 insertions(+), 93 deletions(-)
+
+commit 4e938c1f81add2162ced0e97b24fe588f15f178d
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Sun Jan 24 19:15:06 2010 +0100
+
+    [glib] Make glib frontend unconditionally use cairo output device
+
+    Splash support has been removed.
+
+ configure.ac             |   74 +++++++-------
+ glib/Makefile.am         |   20 +---
+ glib/poppler-document.cc  |   9 --
+ glib/poppler-page.cc     |  237
+ +--------------------------------------------
+ glib/poppler-page.h      |    7 --
+ glib/poppler-private.h    |   14 ---
+ glib/poppler.cc          |    6 --
+ glib/test-poppler-glib.cc |   6 +-
+ poppler-glib.pc.in       |    2 +-
+ 9 files changed, 51 insertions(+), 324 deletions(-)
+
+commit 59ff9d66fc3b0c9612b1c12fc1ae4dbb8dc85b39
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Sun Jan 24 17:57:48 2010 +0100
+
+    Use a small object cache in GfxResources to cache GState objects
+
+    It drastically improves performance with some documents like page
+    742 of
+    PDF32000_2008.pdf
+
+ poppler/Gfx.cc |   19 +++++++++++++++++--
+ poppler/Gfx.h |    2 ++
+ 2 files changed, 19 insertions(+), 2 deletions(-)
+
+commit 880a4a9a60a10f7aa7d3dc7c2802b31b7ef01e06
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Sun Jan 24 17:56:35 2010 +0100
+
+    Add a generic cache to store objects by its reference
+
+ poppler/PopplerCache.cc |   60
+ +++++++++++++++++++++++++++++++++++++++++++++++
+ poppler/PopplerCache.h  |   16 +++++++++++++
+ 2 files changed, 76 insertions(+)
+
+commit 5ad492df75c0c2394719e85db4c8b43f15b52110
+Author: mpsuzuki <mpsuzuki@hiroshima-u.ac.jp>
+Date:  Sun Jan 24 13:34:41 2010 +0100
+
+    [cairo] Fix memory leak
+
+ poppler/CairoFontEngine.cc |   1 +
+ 1 file changed, 1 insertion(+)
+
+commit 3160464b4b70c714c36234320878acab81b866cc
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Thu Nov 26 13:17:19 2009 +0100
+
+    [cairo] Use our own implementation to scale down images instead
+    of cairo
+
+    This is a workaround for the low quality downscaling of pixman.
+    Rescaler implementation is a box filter that supports non-integer box
+    sizes written by Jeff Muizelaar.
+    Fixes bug #5589.
+
+ poppler/CairoOutputDev.cc  |  89 +++++++++++
+ poppler/CairoOutputDev.h   |   1 +
+ poppler/CairoRescaleBox.cc |  352
+ ++++++++++++++++++++++++++++++++++++++++++++
+ poppler/CairoRescaleBox.h  |  12 ++
+ poppler/Makefile.am       |    4 +-
+ 5 files changed, 457 insertions(+), 1 deletion(-)
+
+commit 6825a219f0bc0ac6fd469fb8a6ebb86df774375f
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Sat Jan 23 11:24:15 2010 +0100
+
+    [glib] Use TextOutputDev to get TextPage when we haven't rendered
+    the page
+
+ glib/poppler-page.cc |   27 ++++++++++++++++++---------
+ 1 file changed, 18 insertions(+), 9 deletions(-)
+
+commit 6c61a457e9a8ec10945bc1e0700c8e4d121faa58
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Wed Jan 20 21:59:05 2010 +0000
+
+    Fix GfxRadialShading::GfxRadialShading
+
+    Fixes crash in KDE bug 223359
+
+ poppler/GfxState.cc |   4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 442894d371879a6bf2adb5a39b9dd0a49e76e4ac
+Author: Pino Toscano <pino@kde.org>
+Date:  Fri Jan 15 21:28:42 2010 +0100
+
+    [glib-demo/cmake] compile print.c
+
+    followup of b64d4bd46b052feb0b143f1348773afbd93e5e33
+
+ glib/demo/CMakeLists.txt |    1 +
+ 1 file changed, 1 insertion(+)
+
+commit b64d4bd46b052feb0b143f1348773afbd93e5e33
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Fri Nov 27 11:47:22 2009 +0100
+
+    [glib-demo] Add print demo
+
+ glib/demo/Makefile.am |    2 +
+ glib/demo/main.c      |    4 +-
+ glib/demo/print.c     |  135
+ +++++++++++++++++++++++++++++++++++++++++++++++++
+ glib/demo/print.h     |   31 ++++++++++++
+ 4 files changed, 171 insertions(+), 1 deletion(-)
+
+commit ba2c746f358a5785d8cbaaf03d8628ee3754c388
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Fri Nov 27 09:52:50 2009 +0100
+
+    [glib-demo] Add render for printing option to render demo
+
+ glib/demo/render.c |  47 ++++++++++++++++++++++++++++++++++++++---------
+ 1 file changed, 38 insertions(+), 9 deletions(-)
+
+commit 9a478008ccb61641f09bd77eaa55033cca266c43
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Fri Jan 15 12:03:11 2010 +0100
+
+    Add FONTCONFIGURATION macros to poppler-config.h
+
+    They are used in a header file (GlobalParams.h). It fixes a crash
+    when opening any document.
+
+ poppler/poppler-config.h.in |  10 ++++++++++
+ 1 file changed, 10 insertions(+)
+
+commit 1f80f874d8e132411816302465f04bc59d404d89
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Thu Jan 14 08:43:11 2010 +0000
+
+    Fix Uncover and Fade to return correct values
+
+    Bug 26034
+
+ poppler/PageTransition.cc |   5 +++--
+ 1 file changed, 3 insertions(+), 2 deletions(-)
+
+commit 350ff407e06a961f2a5b9d203cb8e78ce09313a0
+Author: Hib Eris <hib@hiberis.nl>
+Date:  Wed Jan 13 22:20:41 2010 +0000
+
+    Make poppler (optionally) relocatable on Windows
+
+ configure.ac           |   26 +++++++++++++++++++++
+ poppler/GlobalParams.cc |   57
+ +++++++++++++++++++++++++++++++++++++++++++++++
+ 2 files changed, 83 insertions(+)
+
+commit 36b67b002db802bfad553720e2114b76b07bb614
+Author: Hib Eris <hib@hiberis.nl>
+Date:  Wed Jan 13 22:17:03 2010 +0000
+
+    Make fontconfig optional with mingw compiler
+
+ CMakeLists.txt                    |    8 +++++++-
+ config.h.cmake                    |    6 ++++++
+ configure.ac              |   39 ++++++++++++++++++++++++++++++++++++++-
+ makefile.vc               |    2 +-
+ poppler/GlobalParams.cc    |  10 +++++++---
+ poppler/GlobalParams.h     |   7 ++++---
+ poppler/GlobalParamsWin.cc |   5 +++++
+ 7 files changed, 68 insertions(+), 9 deletions(-)
+
+commit 9c0b20ab8c104c2f5398a5a3b8409ca554f5fa39
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Tue Jan 12 22:55:06 2010 +0000
+
+    Add the possibility of using float for splash variables instead
+    of double
+
+    Based on a patch by Marius Vollmer marius.vollmer@nokia.com
+    See bug 25578 for more info
+
+ CMakeLists.txt       |    7 ++++++-
+ config.h.cmake       |    5 ++++-
+ configure.ac        |   10 +++++++++-
+ splash/SplashMath.h  |   14 ++++++++++++--
+ splash/SplashTypes.h |    4 +++-
+ 5 files changed, 34 insertions(+), 6 deletions(-)
+
+commit 30e5f76e372114339fa1d37c335e6bbade8b6d8a
+Author: Pino Toscano <pino@kde.org>
+Date:  Thu Jan 7 11:18:36 2010 +0100
+
+    [CMake] followup recent glib/gtk+ version requirements
+
+    - glib to 2.18, see ce9404b1999f81b3f9e5a89bcd6e715463f89024
+    - gtk+ to 2.14, see e338643f2cebb1203f7ff0646f87b3dea8318757
+
+ cmake/modules/FindGTK.cmake |   6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
+
+commit e338643f2cebb1203f7ff0646f87b3dea8318757
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Thu Jan 7 11:08:31 2010 +0100
+
+    [tests] Bump GTK+ requirements to 2.14
+
+    Fixes bug #22090.
+
+ configure.ac |    4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit ce9404b1999f81b3f9e5a89bcd6e715463f89024
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Thu Jan 7 11:06:19 2010 +0100
+
+    Bump glib requirements to 2.18
+
+ configure.ac |    2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 526c8871cbdfbc119e013ee96887a79f65403790
+Author: Hib Eris <hib@hiberis.nl>
+Date:  Thu Dec 31 17:52:33 2009 +0100
+
+    [glib] Use PDFDoc(wchar_t *, ...) on Windows
+
+    Fixes bug #25032
+
+ glib/poppler-document.cc |   22 +++++++++++++++++++---
+ 1 file changed, 19 insertions(+), 3 deletions(-)
+
+commit e0c8188136958b853269179079efefdd3488dc22
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Mon Jan 4 18:36:01 2010 +0000
+
+    Require Qt 4.4
+
+    This updates the requirement to real requirement
+
+ CMakeLists.txt |    2 +-
+ configure.ac  |    8 ++++----
+ 2 files changed, 5 insertions(+), 5 deletions(-)
+
+commit f9accdb878b23ebd2152dd05d61cfcc71d46cd03
+Author: Pino Toscano <pino@kde.org>
+Date:  Mon Jan 4 14:13:13 2010 +0100
+
+    [Qt4/tests] use getPdfVersion() instead of the deprecated pdfVersion()
+
+ qt4/tests/stress-poppler-dir.cpp |    3 ++-
+ qt4/tests/stress-poppler-qt4.cpp |    3 ++-
+ qt4/tests/test-password-qt4.cpp  |    4 +++-
+ qt4/tests/test-poppler-qt4.cpp   |    4 +++-
+ 4 files changed, 10 insertions(+), 4 deletions(-)
+
+commit 898e939d8c0ac74cc7ee3f5d42d83083ed31036e
+Author: Adrian Johnson <ajohnson@redneon.com>
+Date:  Sat Jan 2 02:33:58 2010 +0100
+
+    Make pdftoppm embed correct resolution in PNG and JPEG files
+
+ goo/ImgWriter.h       |    3 ++-
+ goo/JpegWriter.cc     |    6 +++++-
+ goo/JpegWriter.h      |    3 ++-
+ goo/PNGWriter.cc      |    6 +++++-
+ goo/PNGWriter.h       |    3 ++-
+ splash/SplashBitmap.cc |    9 +++++----
+ splash/SplashBitmap.h |    5 +++--
+ utils/HtmlOutputDev.cc |    4 +++-
+ utils/pdftoppm.cc     |    9 +++++----
+ 9 files changed, 32 insertions(+), 16 deletions(-)
+
+commit df569dc2fb89d7e0780bbf7a687ce2464ff5cb43
+Author: Adrian Johnson <ajohnson@redneon.com>
+Date:  Sat Jan 2 01:19:50 2010 +0100
+
+    enable AM_SILENT_RULES by default
+
+ configure.ac |    2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit f3862f7d987aae52a1fd2bb0af27d1cd803a5b84
+Author: Pino Toscano <pino@kde.org>
+Date:  Thu Dec 31 00:20:11 2009 +0100
+
+    [cpp/tests] poppler-dump: show a string for the font type
+
+ cpp/tests/poppler-dump.cpp |  23 ++++++++++++++++++++++-
+ 1 file changed, 22 insertions(+), 1 deletion(-)
+
+commit 9c343c821593ebae51ac47b58ad007a82f198652
+Author: Pino Toscano <pino@kde.org>
+Date:  Thu Dec 31 00:13:09 2009 +0100
+
+    [cpp/tests] poppler-dump: show the orientation of the pages
+
+ cpp/tests/poppler-dump.cpp |  16 ++++++++++++++++
+ 1 file changed, 16 insertions(+)
+
+commit bc91fe3824f37cd17a38aac85c817e8ada1b2f43
+Author: Pino Toscano <pino@kde.org>
+Date:  Wed Dec 30 23:53:31 2009 +0100
+
+    [cpp/tests] poppler-dump: a bit less output in permissions lines
+
+ cpp/tests/poppler-dump.cpp |   2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 1199de8f097a78edb831313841ac0ed3f9ec9905
+Author: Pino Toscano <pino@kde.org>
+Date:  Wed Dec 30 23:50:36 2009 +0100
+
+    [cpp/tests] poppler-dump: add --show-all to show all the information
+
+ cpp/tests/poppler-dump.cpp |  13 +++++++++++++
+ 1 file changed, 13 insertions(+)
+
+commit 9522f830b59942adfc91d5f03c274415a4737ccc
+Author: Pino Toscano <pino@kde.org>
+Date:  Wed Dec 30 23:38:40 2009 +0100
+
+    [cpp] use iconv for the utf8 <-> utf16 conversions
+
+ cpp/poppler-global.cpp |   92
+ +++++++++++++++++++++++++++++++++---------------
+ 1 file changed, 64 insertions(+), 28 deletions(-)
+
+commit b156b4031f5daf658f40db8efa2a3016d95b98b5
+Author: Pino Toscano <pino@kde.org>
+Date:  Wed Dec 30 23:24:23 2009 +0100
+
+    [cpp] add the build system stuff for iconv, mandatory for cpp
+
+ CMakeLists.txt                       |    6 ++
+ Makefile.am                  |    1 +
+ cmake/modules/FindIconv.cmake |   57 +++++++++++++
+ config.h.cmake                       |    6 ++
+ configure.ac                 |    6 ++
+ cpp/CMakeLists.txt           |    2 +-
+ cpp/Makefile.am              |    3 +-
+ m4/iconv.m4                  |  180
+ +++++++++++++++++++++++++++++++++++++++++
+ 8 files changed, 259 insertions(+), 2 deletions(-)
+
+commit a0cffb8b69e0595a2afe15ecc4928e0df1eeb063
+Author: Pino Toscano <pino@kde.org>
+Date:  Wed Dec 30 18:57:09 2009 +0100
+
+    [cpp] fixup unicode GooString <-> ustring conversions
+
+    better make them use the "hand-made" code, it is more correct for them
+
+ cpp/poppler-private.cpp |   44
+ +++++++++++++++++++++++++++++++++++++++++---
+ 1 file changed, 41 insertions(+), 3 deletions(-)
+
+commit 3b6e3605209d5db453725b9ce4e6e54679d9c5da
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Sun Dec 27 15:30:22 2009 +0100
+
+    Do not crop the transformation matrix at an arbitrary value
+
+    Fixes bug 25763 and gave no regression on my test suite
+
+ poppler/GfxState.cc       |   21 ---------------------
+ poppler/SplashOutputDev.cc |  15 +++++++++++++++
+ 2 files changed, 15 insertions(+), 21 deletions(-)
+
+commit ea44c60645001ffea7d297f8549aaa4f5ce5e16c
+Author: Ilya Gorenbein <igorenbein@finjan.com>
+Date:  Sun Dec 27 15:27:00 2009 +0100
+
+    Try to work on streams without Length
+
+    We have code that finds the Length if it's wrong so let that code
+    do its job
+    instead of returning a NULL stream
+
+ poppler/Parser.cc |   3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+commit 283dd326a00c804b6332ee3ca1aaa0d86377b3f3
+Author: Pino Toscano <pino@kde.org>
+Date:  Sat Dec 19 12:50:10 2009 +0100
+
+    [cpp] fix installation of poppler-version.h with autotools and
+    builddir != srcdir
+
+ cpp/Makefile.am |    2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit df0ccddb7f784b4a8564beda51b3047cb9e3611a
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Fri Dec 18 20:23:48 2009 +0000
+
+    move the retrieval of the bitmap after rendering the page as it can
+    change on render time
+
+ utils/pdftoppm.cc |   6 ++++--
+ 1 file changed, 4 insertions(+), 2 deletions(-)
+
+commit ab88a02f7efefc950a316d7a5edf88dad8f3e4d0
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Thu Dec 17 18:24:20 2009 +0100
+
+    [annots] QuadPoints is required in Text Markup annotations
+
+    Show an error message and mark annotation as invalid when it's
+    missing.
+
+ poppler/Annot.cc |    2 ++
+ 1 file changed, 2 insertions(+)
+
+commit 39dc99431b3ea9e00f6f645dd7169c0319571dc9
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Thu Dec 17 18:17:20 2009 +0100
+
+    [annots] Create appearance stream for Sound Annotations when not
+    defined
+
+    See bug #23108.
+
+ poppler/Annot.cc |  112
+ ++++++++++++++++++++++++++++++++++++++++++++++++++++++
+ poppler/Annot.h  |    2 +
+ 2 files changed, 114 insertions(+)
+
+commit e4f5a78a853b88b1586ef59fc8893a321ea23736
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Thu Dec 17 17:39:39 2009 +0100
+
+    [annots] Add Tag and Graph icons for File Attachment annotations
+
+    See bug #23108.
+
+ poppler/Annot.cc |   70
+ ++++++++++++++++++++++++++++++++++++++++++++++++++++++
+ 1 file changed, 70 insertions(+)
+
+commit 752b14857cfb0669fd6d7dfef2ea73c13a2369fc
+Author: Pino Toscano <pino@kde.org>
+Date:  Thu Dec 17 17:16:01 2009 +0100
+
+    simplify
+
+ cpp/poppler-toc.cpp |   2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit a26e4b7903fabc667d7d16c23ca2c7a535dd05fa
+Author: Pino Toscano <pino@kde.org>
+Date:  Thu Dec 17 17:09:35 2009 +0100
+
+    [cpp/tests] add a simple poppler-dump test
+
+    this small test executable can dump various features of the document,
+    like the general info, permissions, metadata, toc, fonts,
+    embedded files, pages, etc
+
+    also add the necessary autotools+cmake machinery to compile it
+
+ configure.ac              |    1 +
+ cpp/CMakeLists.txt        |    2 +
+ cpp/Makefile.am           |    1 +
+ cpp/tests/.gitignore      |    1 +
+ cpp/tests/CMakeLists.txt   |  24 ++++
+ cpp/tests/Makefile.am     |   17 +++
+ cpp/tests/poppler-dump.cpp |  293
+ ++++++++++++++++++++++++++++++++++++++++++++
+ 7 files changed, 339 insertions(+)
+
+commit 86c871cc625d00b8ee7f93dc8c0f9ef8462bba5a
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Thu Dec 17 17:05:45 2009 +0100
+
+    [annots] Create appearance stream for Text Markup Annotations when
+    not defined
+
+    Highlight annotations are an exception, we always ignore the
+    appearance stream to use our own, since for most of the documents the
+    appearance stream provided by the annotation is not enough. That's why
+    it's currently broken. This is what acroread does indeed and Leonard
+    Rosenthol recommended us to do the same.
+    See bug #23108.
+
+ poppler/Annot.cc |  199
+ ++++++++++++++++++++++++++++++++++++++++++++++++++++++
+ poppler/Annot.h  |    2 +
+ 2 files changed, 201 insertions(+)
+
+commit 904ecd929c6acbbad6d782b950c53c0a80e1f39c
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Thu Dec 17 12:49:20 2009 +0100
+
+    [annots] Fix memory leaks
+
+ poppler/Annot.cc |    6 +++++-
+ 1 file changed, 5 insertions(+), 1 deletion(-)
+
+commit ef7954b86f9b1a762c4f77a48d5f42f8db4bbed7
+Author: Pino Toscano <pino@kde.org>
+Date:  Tue Dec 15 02:20:18 2009 +0100
+
+    [cpp] use the correct index (instead of an uninitialized variable)
+
+ cpp/poppler-page.cpp |    2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 2547b5e53e7799cf7299838ae9bd882c21a228ae
+Author: Pino Toscano <pino@kde.org>
+Date:  Tue Dec 15 02:14:57 2009 +0100
+
+    [cpp] properly delete the children of a toc item
+
+ cpp/poppler-toc.cpp |   1 +
+ 1 file changed, 1 insertion(+)
+
+commit 771bd3594740fe16bd030dbe73928a8b1d4d113f
+Author: Pino Toscano <pino@kde.org>
+Date:  Tue Dec 15 02:04:24 2009 +0100
+
+    [cpp] actually implement toc::root()
+
+ cpp/poppler-toc.cpp |   5 +++++
+ 1 file changed, 5 insertions(+)
+
+commit ca1d2ec4588b2437b58b4448ae2fc5ebd0f130d3
+Author: Pino Toscano <pino@kde.org>
+Date:  Tue Dec 15 00:54:29 2009 +0100
+
+    [cpp] fix the reference to the vector data
+
+ cpp/poppler-global.cpp  |    2 +-
+ cpp/poppler-private.cpp |    2 +-
+ 2 files changed, 2 insertions(+), 2 deletions(-)
+
+commit 16c946e7658b0e9cff701ce1d6bbf7d3828cbe08
+Author: Pino Toscano <pino@kde.org>
+Date:  Tue Dec 15 00:35:25 2009 +0100
+
+    [cpp] fix the reference to the vector data
+
+ cpp/poppler-document.cpp |    2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 9bb90c99b65e0e9d9b65c7dbeb5b4d66377ceb21
+Author: Pino Toscano <pino@kde.org>
+Date:  Mon Dec 14 23:43:12 2009 +0100
+
+    [cpp] add destructor for 'rectangle'
+
+ cpp/poppler-rectangle.h |    3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+commit 61ccdc9ab3b816174896fcae0899ff34f11eee80
+Author: Pino Toscano <pino@kde.org>
+Date:  Mon Dec 14 23:40:51 2009 +0100
+
+    [cpp] add out stream operators for rect and rectf
+
+ cpp/CMakeLists.txt       |    1 +
+ cpp/Makefile.am          |    1 +
+ cpp/poppler-rectangle.cpp |   35 +++++++++++++++++++++++++++++++++++
+ cpp/poppler-rectangle.h   |   5 +++++
+ 4 files changed, 42 insertions(+)
+
+commit 69dd51fed3de41f8b799b811ae5ee59c0d5f59c2
+Author: Pino Toscano <pino@kde.org>
+Date:  Mon Dec 14 22:24:07 2009 +0100
+
+    [cpp] add namespace to namespace functiond to link properly
+
+ cpp/poppler-global.cpp  |    4 ++--
+ cpp/poppler-version.cpp |    8 ++++----
+ 2 files changed, 6 insertions(+), 6 deletions(-)
+
+commit 3923fa4890984d8616d86016f4f4a94e8ef3e992
+Author: Pino Toscano <pino@kde.org>
+Date:  Mon Dec 14 22:23:15 2009 +0100
+
+    [cpp] add default empty parameters for the passwords of the document
+    loading functions
+
+ cpp/poppler-document.h |    8 ++++----
+ 1 file changed, 4 insertions(+), 4 deletions(-)
+
+commit 1d23cc677e9b0a9f61c53e0ea365537f33abe5bf
+Author: Pino Toscano <pino@kde.org>
+Date:  Mon Dec 14 21:44:56 2009 +0100
+
+    [cpp] add "human friendly" output representation for byte_array
+
+ cpp/poppler-global.cpp |   23 +++++++++++++++++++++++
+ cpp/poppler-global.h  |    3 +++
+ 2 files changed, 26 insertions(+)
+
+commit 82954ea5f8ba880276328765f104690a05adbd9e
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Mon Dec 7 12:05:54 2009 +0100
+
+    [annot] Create appearance stream for Attachment Annotations when
+    not defined
+
+    See bug #23108.
+
+ poppler/Annot.cc |   94
+ ++++++++++++++++++++++++++++++++++++++++++++++++++++++
+ poppler/Annot.h  |    2 ++
+ 2 files changed, 96 insertions(+)
+
+commit c6195472326c183fcfd8a3e9da1ee7f6fa8b7c3d
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Sun Dec 6 17:09:23 2009 +0100
+
+    [annots] Use opacity when drawing Markup Annotations
+
+    According to the spec:
+
+    "The constant opacity value that shall be used in painting the
+    annotation. This value shall apply to all visible elements of the
+    annotation in its closed state (including its background and border)
+    but
+    not to the pop-up window that appears when the annotation is opened.
+
+    The specified value shall not used if the annotation has an appearance
+    stream in that case, the appearance stream shall specify any
+    transparency.
+
+    If no explicit appearance stream is defined for the annotation, it may
+    be painted by implementation-dependent means that do not necessarily
+    conform to the PDF imaging model; in this case, the effect of
+    this entry
+    is implementation-dependent as well."
+
+ poppler/Annot.cc |   21 +++++++++++++++------
+ poppler/Gfx.cc   |    9 ++++++++-
+ poppler/Gfx.h   |    2 +-
+ 3 files changed, 24 insertions(+), 8 deletions(-)
+
+commit a337c1d757d52c1c238229d2f0cd3a41694b0e08
+Author: Pino Toscano <pino@kde.org>
+Date:  Mon Dec 14 16:18:22 2009 +0100
+
+    [cpp] add document metadata reading
+
+ cpp/poppler-document.cpp |    9 +++++++++
+ cpp/poppler-document.h   |    1 +
+ 2 files changed, 10 insertions(+)
+
+commit 6c4fa513e60dbdd5ab693434f239d82d95756994
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Sun Dec 6 16:56:22 2009 +0100
+
+    [annot] Create appearance stream for Geometry Annotations when
+    not defined
+
+    See bug #23108.
+
+ poppler/Annot.cc |  120
+ ++++++++++++++++++++++++++++++++++++++++++++++++++++++
+ poppler/Annot.h  |    2 +
+ 2 files changed, 122 insertions(+)
+
+commit eed94b8bd2855dce1fd39b835e3280cbd0ccd1cf
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Sun Dec 6 16:51:37 2009 +0100
+
+    [annot] Create appearance stream for Line Annotations when not defined
+
+    See bug #23108.
+
+ poppler/Annot.cc |   62
+ ++++++++++++++++++++++++++++++++++++++++++++++++++++++
+ poppler/Annot.h  |    2 ++
+ 2 files changed, 64 insertions(+)
+
+commit 1c7a5f5e89c4c51e31b6de345d4862ef8dcc2bc0
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Sun Dec 6 16:40:14 2009 +0100
+
+    [annot] Create appearance stream for Text Annotations when not defined
+
+    Streams have been created by using the svg icons created by mac_v and
+    ulisse. See bug #23108.
+
+ poppler/Annot.cc |  305
+ ++++++++++++++++++++++++++++++++++++++++++++++++++++++
+ poppler/Annot.h  |    2 +
+ 2 files changed, 307 insertions(+)
+
+commit c9cb6353ad5279d09615eb2c944b2b053cdf5ccc
+Author: Pino Toscano <pino@kde.org>
+Date:  Mon Dec 14 15:52:25 2009 +0100
+
+    [cpp] add function to query for document "permissions"
+
+ cpp/poppler-document.cpp |   23 +++++++++++++++++++++++
+ cpp/poppler-document.h   |    1 +
+ cpp/poppler-global.h    |    4 ++++
+ 3 files changed, 28 insertions(+)
+
+commit 30e90c7c1b41c62ddc21905e7ccdea4c95547e80
+Author: Pino Toscano <pino@kde.org>
+Date:  Mon Dec 14 15:33:36 2009 +0100
+
+    [cpp] add is_encrypted and is_linearized for document
+
+ cpp/poppler-document.cpp |   10 ++++++++++
+ cpp/poppler-document.h   |    2 ++
+ 2 files changed, 12 insertions(+)
+
+commit 93fd588c519958a1f66231c111ea8a6b0a759be1
+Author: Pino Toscano <pino@kde.org>
+Date:  Mon Dec 14 13:19:24 2009 +0100
+
+    [cpp] add the possibility to load a document from raw data
+
+ cpp/poppler-document-private.h |    5 +++++
+ cpp/poppler-document.cpp      |   35 ++++++++++++++++++++++++++++++++++-
+ cpp/poppler-document.h                |    3 +++
+ 3 files changed, 42 insertions(+), 1 deletion(-)
+
+commit 53996365b159cf84adf2cac56c76b8bda8dfb12e
+Author: Pino Toscano <pino@kde.org>
+Date:  Mon Dec 14 12:57:41 2009 +0100
+
+    [cpp] use the byte_array typedef
+
+ cpp/poppler-embedded-file.cpp |    6 +++---
+ cpp/poppler-embedded-file.h   |    2 +-
+ 2 files changed, 4 insertions(+), 4 deletions(-)
+
+commit e4969c1aaed4a8eb770d8b54920f2476129bbcb7
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Sun Dec 6 16:19:36 2009 +0100
+
+    [annots] Refactor Annot::setColor to receive an AnnotColor
+
+    Removes duplicated code since color arrays are already parsed in
+    AnnotColor
+
+ poppler/Annot.cc |  136
+ ++++++++++++++++++++++++++++--------------------------
+ poppler/Annot.h  |    4 +-
+ 2 files changed, 73 insertions(+), 67 deletions(-)
+
+commit cfb4f5dfabf31de22d68aa0d5796cb7a33d8b462
+Author: Pino Toscano <pino@kde.org>
+Date:  Mon Dec 14 11:06:36 2009 +0100
+
+    [cpp] add a byte_array typedef, and use it for utf8 string data
+
+ cpp/poppler-global.cpp  |   12 +++---------
+ cpp/poppler-global.h   |    5 ++++-
+ cpp/poppler-private.cpp |    5 ++---
+ 3 files changed, 9 insertions(+), 13 deletions(-)
+
+commit 2d13ac31671b2007e44a90f45a82cb3adfa9c80c
+Author: Pino Toscano <pino@kde.org>
+Date:  Mon Dec 14 02:30:06 2009 +0100
+
+    update ignore files
+
+ .gitignore    |    1 +
+ cpp/.gitignore |    1 +
+ 2 files changed, 2 insertions(+)
+
+commit 01e902e40ca15acf0319e37d39a271d6875bfce9
+Author: Pino Toscano <pino@kde.org>
+Date:  Mon Dec 14 02:02:47 2009 +0100
+
+    [cpp] add a version header+functions
+
+    this way, it is possible to get (either at build time and at runtime)
+    the version of the current poppler-cpp library
+
+    poppler-config.h is generated by the build system (autotools or cmake)
+    with the correct version information
+
+ configure.ac            |    2 ++
+ cpp/CMakeLists.txt      |    5 +++++
+ cpp/Makefile.am         |    6 ++++--
+ cpp/poppler-version.cpp  |   41 +++++++++++++++++++++++++++++++++++++++++
+ cpp/poppler-version.h.in |   39 +++++++++++++++++++++++++++++++++++++++
+ 5 files changed, 91 insertions(+), 2 deletions(-)
+
+commit b3f5e5d60bc9109da961940f6216722f9db4a87b
+Author: Pino Toscano <pino@kde.org>
+Date:  Mon Dec 14 00:56:15 2009 +0100
+
+    [CMake] add the configure check for the Cairo blend modes support
+    (as in autotools)
+
+ cmake/modules/FindCairo.cmake |   18 ++++++++++++++++++
+ config.h.cmake                       |    3 +++
+ 2 files changed, 21 insertions(+)
+
+commit f6ba877e0c22538cfe34d32d69814f660de59d2c
+Author: Pino Toscano <pino@kde.org>
+Date:  Mon Dec 14 00:44:55 2009 +0100
+
+    [CMake] add configure check for sys/mman.h (as in autotools)
+
+ ConfigureChecks.cmake |    1 +
+ config.h.cmake        |    3 +++
+ 2 files changed, 4 insertions(+)
+
+commit e12801320ae030628fc62c073983c06b39ee13d7
+Author: Pino Toscano <pino@kde.org>
+Date:  Mon Dec 14 00:42:20 2009 +0100
+
+    minor spello
+
+ config.h.cmake |    2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 6428907ebcf33d4391673aadcfa71c3061f6d352
+Author: Pino Toscano <pino@kde.org>
+Date:  Mon Dec 14 00:41:49 2009 +0100
+
+    [CMake] add configure check for fcntl.h (as in autotools)
+
+ ConfigureChecks.cmake |    1 +
+ config.h.cmake        |    3 +++
+ 2 files changed, 4 insertions(+)
+
+commit 916ab7163249e23bd5ba00922fdcad9caaf92c75
+Author: Pino Toscano <pino@kde.org>
+Date:  Mon Dec 14 00:34:59 2009 +0100
+
+    [CMake] oops, those should have been '#cmakedefine' and not '#define'
+
+ config.h.cmake |    4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit ea655d8c7e24e97ee710110a783ed9c209cf76e3
+Author: Pino Toscano <pino@kde.org>
+Date:  Mon Dec 14 00:33:51 2009 +0100
+
+    [CMake] move and rename to match more the autotools output
+
+ config.h.cmake |   21 ++++++++++++++-------
+ 1 file changed, 14 insertions(+), 7 deletions(-)
+
+commit 9f0146c5b2f9326e834104b89791f66b18f85adc
+Author: Pino Toscano <pino@kde.org>
+Date:  Mon Dec 14 00:28:04 2009 +0100
+
+    [CMake] add checks for gmtime_r and localtime_r
+
+ ConfigureChecks.cmake |    2 ++
+ config.h.cmake        |    6 ++++++
+ 2 files changed, 8 insertions(+)
+
+commit 9d0cf201e96044dd679c26bea6255d986a6cd246
+Author: Pino Toscano <pino@kde.org>
+Date:  Sun Dec 13 23:45:39 2009 +0100
+
+    [cpp] add ignore file
+
+ cpp/.gitignore |    6 ++++++
+ 1 file changed, 6 insertions(+)
+
+commit d783e92b863d8b22de6ca326328115fec63193ed
+Author: Pino Toscano <pino@kde.org>
+Date:  Sun Dec 13 23:42:33 2009 +0100
+
+    [cpp] don't forget the cmake stuff when packing with the autotools
+
+ Makefile.am |   2 ++
+ 1 file changed, 2 insertions(+)
+
+commit 0105caefe860e7a45fc7d3a1bd1162fe56bcfe6a
+Author: Pino Toscano <pino@kde.org>
+Date:  Sun Dec 13 23:40:55 2009 +0100
+
+    [cpp] add the pkg-config stuff
+
+ CMakeLists.txt       |    3 +++
+ Makefile.am         |    7 +++++--
+ configure.ac        |    3 ++-
+ poppler-cpp.pc.cmake |    9 +++++++++
+ poppler-cpp.pc.in    |    9 +++++++++
+ 5 files changed, 28 insertions(+), 3 deletions(-)
+
+commit d5a74f78df0dca24fd537b30424fd2ebb3efe3e2
+Author: Pino Toscano <pino@kde.org>
+Date:  Sun Dec 13 23:35:06 2009 +0100
+
+    [cpp] add the (rest of the) CMake build system for it
+
+ CMakeLists.txt |    5 +++++
+ 1 file changed, 5 insertions(+)
+
+commit 0e41f937946e4e4c1b660406bd74e4afe8825b5f
+Author: Pino Toscano <pino@kde.org>
+Date:  Sun Dec 13 23:31:46 2009 +0100
+
+    [cpp] add the autotools buildsystem for it
+
+ Makefile.am    |    6 +++++-
+ configure.ac   |   15 +++++++++++++++
+ cpp/Makefile.am |   32 ++++++++++++++++++++++++++++++++
+ 3 files changed, 52 insertions(+), 1 deletion(-)
+
+commit 9727fdc0c682742335e44ddc2f32d60e4c59983a
+Author: Pino Toscano <pino@kde.org>
+Date:  Sun Dec 13 22:55:28 2009 +0100
+
+    Start of a pure C++ frontend for Poppler.
+
+    This initial version (called 'poppler-cpp') includes preliminary
+    support for:
+    - document (loading from file name, some query methods, unlocking,
+    font listing, embedded files)
+    - page (some query methods) with page transitions
+    - TOC
+
+    Modelled a bit on the Qt4 API, it provides also an own "ustring"
+    typedef representing UTF-16 strings,
+    with methods to convert back/to UTF-8 and Latin 1.
+
+    Most probably it has bugs, but nevertheless worth testing and
+    developing.
+
+ cpp/CMakeLists.txt                 |   34 ++++
+ cpp/poppler-document-private.h      |  55 ++++++
+ cpp/poppler-document.cpp           |  316
+ +++++++++++++++++++++++++++++++++++
+ cpp/poppler-document.h                     |   92 ++++++++++
+ cpp/poppler-embedded-file-private.h |  40 +++++
+ cpp/poppler-embedded-file.cpp      |  116 +++++++++++++
+ cpp/poppler-embedded-file.h        |   55 ++++++
+ cpp/poppler-font.cpp               |  166 ++++++++++++++++++
+ cpp/poppler-font.h                 |   91 ++++++++++
+ cpp/poppler-global.cpp                     |  162 ++++++++++++++++++
+ cpp/poppler-global.h               |   86 ++++++++++
+ cpp/poppler-page-private.h         |   44 +++++
+ cpp/poppler-page-transition.cpp     |  95 +++++++++++
+ cpp/poppler-page-transition.h      |   82 +++++++++
+ cpp/poppler-page.cpp               |  121 ++++++++++++++
+ cpp/poppler-page.h                 |   62 +++++++
+ cpp/poppler-private.cpp            |   70 ++++++++
+ cpp/poppler-private.h              |   66 ++++++++
+ cpp/poppler-rectangle.h            |   60 +++++++
+ cpp/poppler-toc-private.h          |   62 +++++++
+ cpp/poppler-toc.cpp                |  136 +++++++++++++++
+ cpp/poppler-toc.h                  |   74 ++++++++
+ 22 files changed, 2085 insertions(+)
+
+commit 62854051f4e47028147cc93a5faac39e2fa2c9fd
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Sat Dec 12 17:22:08 2009 +0100
+
+    Initialize profileCommands in Gfx constructor
+
+ poppler/Gfx.cc |    1 +
+ 1 file changed, 1 insertion(+)
+
+commit 4e6af25a028d16608111634c5467420e31fa399b
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Wed Dec 9 19:45:40 2009 +0100
+
+    [cairo] Update font of TextPage in CairoOutputDev::updateAll()
+
+    Fixes a crash with some documents, see Evince bug
+    https://bugzilla.gnome.org/show_bug.cgi?id=603934
+
+ poppler/CairoOutputDev.cc |   2 ++
+ 1 file changed, 2 insertions(+)
+
+commit 6798d3e52e36e91bceff3a1a96372e9d9c6f3813
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Sun Dec 6 15:34:36 2009 +0100
+
+    Use fixed size array in AnnotColor
+
+ glib/poppler-annot.cc        |    2 +-
+ poppler/Annot.cc             |   24 +++++-------------------
+ poppler/Annot.h              |    5 ++---
+ poppler/Gfx.cc                       |    2 +-
+ qt4/src/poppler-annotation.cc |    2 +-
+ 5 files changed, 10 insertions(+), 25 deletions(-)
+
+commit 92fab93bee3748a73c09429cc8a105c16f21fed0
+Author: Axel Struebing <axel.struebing@freenet.de>
+Date:  Sat Dec 5 22:31:29 2009 +0000
+
+    Add a empty space after null
+
+    Fixes bug 25465
+
+ poppler/PDFDoc.cc |   3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+commit 32103f45d0193b31e95269ea9123b8011d93e994
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Sat Dec 5 10:14:18 2009 +0100
+
+    [annots] Add isVisible() to check whether annot is visible before
+    drawing it
+
+    It takes into account annot flags and optional content.
+
+ poppler/Annot.cc |   29 ++++++++++++++---------------
+ poppler/Annot.h  |    1 +
+ 2 files changed, 15 insertions(+), 15 deletions(-)
+
+commit c14dfc7102341f5e1ed67a05c0738d55befab1ec
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Sat Dec 5 10:07:46 2009 +0100
+
+    [annots] Do not check if annot is a link in Annot::draw()
+
+    AnnotLink already implements draw()
+
+ poppler/Annot.cc |    2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit ddf85d4a51f605eed998c633857b8bb5c74ab590
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Fri Dec 4 14:59:41 2009 +0100
+
+    Make the code a bit more resilient
+
+    By checking the GooString we are going to use really exists
+
+ poppler/PSOutputDev.cc |   24 ++++++++++++++++--------
+ 1 file changed, 16 insertions(+), 8 deletions(-)
+
+commit 78b4afa0a44048b8d40438d400652dbae4cb99b1
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Fri Dec 4 14:57:10 2009 +0100
+
+    Accept Fontname if FontName is not present
+
+    Fixes KDE bug 217013
+
+ poppler/GfxFont.cc |   9 +++++++++
+ 1 file changed, 9 insertions(+)
+
+commit fee5cb0eec2ddb8d596289e9a6285cf04d97632e
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Fri Dec 4 13:26:42 2009 +0100
+
+    [annots] Remove redundant flags definition
+
+ poppler/Annot.cc |   22 +++++++++-------------
+ 1 file changed, 9 insertions(+), 13 deletions(-)
+
+commit 3a94e8ce90c0a4d11c5c5aa8805c167c8a0434e5
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Fri Nov 27 15:23:11 2009 +0100
+
+    [cairo] Revert commit 77c2e154c2cb57300116ecd4295f1e67b06b411f
+
+    And fix bug #24575 jut by checking pointer is not null before
+    using it.
+
+ poppler/CairoOutputDev.cc |   12 +++++-------
+ 1 file changed, 5 insertions(+), 7 deletions(-)
+
+commit a093b768e64d477ebdd5f6b519d80a6c45706e7e
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Sun Nov 22 20:23:49 2009 +0100
+
+    Add copyrights
+
+ poppler/CairoFontEngine.cc |   2 +-
+ poppler/CairoOutputDev.cc  |   4 ++--
+ poppler/CairoOutputDev.h   |   2 +-
+ 3 files changed, 4 insertions(+), 4 deletions(-)
+
+commit 77c2e154c2cb57300116ecd4295f1e67b06b411f
+Author: David Benjamin <davidben@mit.edu>
+Date:  Sun Nov 22 20:19:29 2009 +0100
+
+    Do not crash on malformed files
+
+    bug 24575
+
+ poppler/CairoOutputDev.cc |   5 +++++
+ 1 file changed, 5 insertions(+)
+
+commit 1d0cb9b2cfd4d4d9aa9b0ad83ad6408544263a09
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Sun Nov 22 19:59:34 2009 +0100
+
+    [cairo] Initialize fill_color and stroke_color
+
+ poppler/CairoOutputDev.cc |   2 ++
+ 1 file changed, 2 insertions(+)
+
+commit 32de2ac62fb87570e1a59152f37b86e571a01180
+Author: Ilya Gorenbein <igorenbein@finjan.com>
+Date:  Sun Nov 22 19:51:54 2009 +0100
+
+    Improve the reconstruction of the XRef
+
+    Makes load a file Ilya can't share
+
+ poppler/XRef.cc |  165
+ ++++++++++++++++++++++++++++++++-----------------------
+ 1 file changed, 95 insertions(+), 70 deletions(-)
+
+commit 039c6dffbfbed46a11e207048a3247d6921d6b02
+Author: Ilya Gorenbein <igorenbein@finjan.com>
+Date:  Sun Nov 22 15:14:20 2009 +0100
+
+    Correctly initialize fileName
+
+ poppler/Link.cc |    2 ++
+ 1 file changed, 2 insertions(+)
+
+commit b905caf1785ee207cc0480953da69be302d3d4e9
+Author: David Benjamin <davidben@mit.edu>
+Date:  Sat Nov 21 02:43:21 2009 +0100
+
+    Be more lenient with /Decode key on images
+
+    The spec requires the field be [1 0] or [0 1]. Adobe accepts
+    floating point
+    values as well. This fixes bug #17439.
+
+ poppler/Gfx.cc |    9 +++++++--
+ 1 file changed, 7 insertions(+), 2 deletions(-)
+
+commit d99e7a88845a5f4b35e2c538c597316b2ad541ca
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Fri Nov 20 22:09:44 2009 +0100
+
+    Check for openjpeg in the C++ part as it uses bool in the header
+
+    Bug 25103
+
+ configure.ac |   61
+ +++++++++++++++++++++++++++++-----------------------------
+ 1 file changed, 30 insertions(+), 31 deletions(-)
+
+commit 55261a2dc86241c8d132e590e76e7398b3ca5090
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Wed Nov 18 22:26:01 2009 +0100
+
+    replace floor with a cast to int for numbers > 0
+
+    bug-poppler13487.pdf gets a 15% faster rendering
+
+ splash/SplashMath.h |  19 +++++++++++++++++--
+ 1 file changed, 17 insertions(+), 2 deletions(-)
+
+commit 28df9fb323f14dc632c9502655abf69984b7d67e
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Wed Nov 18 21:57:02 2009 +0100
+
+    Remove unused label
+
+ poppler/Catalog.cc |   1 -
+ 1 file changed, 1 deletion(-)
+
+commit 037979a01a6fcafc61360e758dbc4a5eb056825e
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Tue Nov 17 19:12:30 2009 +0100
+
+    [cairo] If there's a soft mask available when filling, apply the
+    mask instead of filling
+
+    Fixes bug #8474.
+
+ poppler/CairoOutputDev.cc |   7 ++++++-
+ 1 file changed, 6 insertions(+), 1 deletion(-)
+
+commit 46380d36f004d71dd2c2e7bc82836af248684b51
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Tue Nov 17 20:48:22 2009 +0100
+
+    i didn't want to commit this
+
+ configure.ac       |   60
+ ++++++++++++++++++++++++++-------------------------
+ splash/SplashMath.h |   5 ++---
+ utils/pdftoppm.cc   |   8 -------
+ 3 files changed, 33 insertions(+), 40 deletions(-)
+
+commit 1844e0927ae89824f59b2b3378bf5e00a51a251c
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Tue Nov 17 20:34:24 2009 +0100
+
+    do not use setAttribute with doubles
+
+    it is evil and locale dependant, we do NOT want that so use
+    QString::number
+
+ configure.ac                 |   60 +++++++++++++++---------------
+ qt4/src/poppler-annotation.cc |   82
+ ++++++++++++++++++++---------------------
+ splash/SplashMath.h          |    5 ++-
+ utils/pdftoppm.cc            |    8 ++++
+ 4 files changed, 81 insertions(+), 74 deletions(-)
+
+commit 572d79f4b8a7bf1717b88dbd2609d8fa9b036dee
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Sun Nov 15 20:40:56 2009 +0100
+
+    Only calculate the matrix when it is really needed
+
+    That only happens when outputting to 1 bit images
+    Speeds out rendering on some pdf up to 40%
+
+ splash/SplashScreen.cc |   35 +++++++++++++++++++++++++++++++++--
+ splash/SplashScreen.h |   16 ++++++++++++++++
+ 2 files changed, 49 insertions(+), 2 deletions(-)
+
+commit 1c3113361fa376093e6fedfbf48feee7dcbc46b7
+Author: Adrian Johnson <ajohnson@redneon.com>
+Date:  Sun Nov 15 19:43:18 2009 +0100
+
+    Write out fixed-content portion of Type 1 fonts in PSOutputDev
+
+    If /Length3 of a Type 1 FontFile is > 0 the fixed-content from the
+    FontFile should be used instead of adding the generic 512 zeros and
+    cleartomark.
+
+ poppler/PSOutputDev.cc |   18 +++++++++++++-----
+ 1 file changed, 13 insertions(+), 5 deletions(-)
+
+commit 2d30dc605cd984f6c32124af9aa7b877d416d141
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Sun Nov 15 17:31:36 2009 +0100
+
+    [glib-demo] Show attachment name in FileAttachment annot properties
+    table
+
+ glib/demo/annots.c |   5 +++++
+ 1 file changed, 5 insertions(+)
+
+commit 6c8ae140256818401351a331787c83e043fdba09
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Sun Nov 15 17:31:13 2009 +0100
+
+    [glib] Add poppler_annot_file_attachment_get_name()
+
+ glib/poppler-annot.cc |   36 +++++++++++++++++++++++++++++-------
+ glib/poppler-annot.h  |    1 +
+ 2 files changed, 30 insertions(+), 7 deletions(-)
+
+commit ecf5173eb288187a1f076fd4b116f1212fa9e203
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Sun Nov 15 17:14:29 2009 +0100
+
+    [glib-demo] Add properties of FileAttachment annotations
+
+ glib/demo/annots.c |  67
+ ++++++++++++++++++++++++++++++++++++++++++++++++++++
+ 1 file changed, 67 insertions(+)
+
+commit 8f4fdd864d79e4fa83951a3eb006ea8287c3a1ba
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Sun Nov 15 17:12:43 2009 +0100
+
+    [glib-demo] Add pgd_table_add_property_with_custom_widget()
+
+    To be able to add properties to a table that are not labels
+
+ glib/demo/utils.c |   31 +++++++++++++++++++++----------
+ glib/demo/utils.h |   30 +++++++++++++++++-------------
+ 2 files changed, 38 insertions(+), 23 deletions(-)
+
+commit 061b85f7a442107cda67e385bd772ec8565a936e
+Author: Thomas Viehmann <tv@beamnet.de>
+Date:  Sun Nov 15 17:11:43 2009 +0100
+
+    [glib] Add support for file attachment annotations
+
+ glib/poppler-annot.cc |   69
+ +++++++++++++++++++++++++++++++++++++++++++++---
+ glib/poppler-annot.h  |    8 ++++++
+ glib/poppler-page.cc  |    3 +++
+ glib/poppler-private.h |    1 +
+ glib/poppler.h                |   49 +++++++++++++++++-----------------
+ 5 files changed, 102 insertions(+), 28 deletions(-)
+
+commit 189c45332991bce51e40bcaf65da67d2d644045a
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Sun Nov 15 16:42:21 2009 +0100
+
+    [glib] Remove PopplerDocument from PopplerAttachment
+
+    Since we are duplicating the stream we don't need to hold a
+    reference of
+    PopplerDocument anymore.
+
+ glib/poppler-attachment.cc |  13 +------------
+ glib/poppler-document.cc   |   2 +-
+ glib/poppler-private.h     |   3 +--
+ 3 files changed, 3 insertions(+), 15 deletions(-)
+
+commit e55bfeb1ddc60053c5ee5fef840c409891781ce6
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Fri Nov 13 00:55:37 2009 +0100
+
+    jpeg_start_decompress can fail, check it
+
+    Fixes KDE bug #214317
+
+ poppler/DCTStream.cc |    6 +++++-
+ 1 file changed, 5 insertions(+), 1 deletion(-)
+
+commit c59d93061cf71d13916872a20aed37ecfbb3bfa4
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Mon Nov 9 18:32:55 2009 +0100
+
+    [cairo] Do nothing when image mask is 1x1 and the pixel is 0
+
+ poppler/CairoOutputDev.cc |   14 ++++++++++++++
+ 1 file changed, 14 insertions(+)
+
+commit 448f03cfc429d33bfa5527e3dc964ef5da10ee94
+Author: Adrian Johnson <ajohnson@redneon.com>
+Date:  Mon Nov 9 22:52:39 2009 +1030
+
+    Don't render the color white in type 3 glyphs in the cairo backend
+
+    PDF allows the "g" operator in Type 3 charprocs but cairo user fonts
+    will render any stroke or fill in the font color.
+
+    As the only PDFs I've seen with "g" in the charprocs are only using
+    the gray values 0 or 1, a workaround is to disable strokes and fills
+    of the charproc when the gray level is > 0.5.
+
+ poppler/CairoOutputDev.cc |   14 ++++++++++++++
+ 1 file changed, 14 insertions(+)
+
+commit 3fead2a3b53681ef95116f18f17f1a9febec6e48
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Mon Nov 9 11:25:24 2009 +0100
+
+    Transitions dictionary can be a Ref too
+
+ poppler/Page.cc |    2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit ac4955d03a532cab1933698aeb667d44300e52d0
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Mon Nov 9 11:12:48 2009 +0100
+
+    [glib-demo] Explicitely add gio as dependency for GTK+ tests
+
+ configure.ac    |    4 ++--
+ glib/demo/main.c |    1 +
+ 2 files changed, 3 insertions(+), 2 deletions(-)
+
+commit 32ea667ec8f18311539123c7b80c7ab4767070cb
+Author: Chris Wilson <chris@chris-wilson.co.uk>
+Date:  Tue Aug 11 19:17:52 2009 +0100
+
+    [cairo] Mark images dirty
+
+    After directly manipulating the pixel values we need to mark the
+    surface
+    as dirty. This means that cairo will refresh any caches it may
+    have taken
+    of the surface will the new data.
+
+ poppler/CairoOutputDev.cc |   8 ++++++++
+ 1 file changed, 8 insertions(+)
+
+commit 10a41150c4067bb3ab85e25dae76e0968a6cd586
+Author: Chris Wilson <chris@chris-wilson.co.uk>
+Date:  Tue Aug 11 19:17:06 2009 +0100
+
+    [cairo] Use colToDbl() to avoid rounding error.
+
+ poppler/CairoOutputDev.cc |   37 +++++++++++++++++++------------------
+ 1 file changed, 19 insertions(+), 18 deletions(-)
+
+commit c9491319689f04edd57adda7ee85f84f17fd1c47
+Author: Chris Wilson <chris@chris-wilson.co.uk>
+Date:  Tue Aug 11 18:07:17 2009 +0100
+
+    [cairo] Reduce the number of redundant pattern creations
+
+ poppler/CairoOutputDev.cc |   84
+ +++++++++++++++++++++++++++------------------
+ 1 file changed, 51 insertions(+), 33 deletions(-)
+
+commit ead78d9f703c8b2d556c94be3c47dbae7469eda8
+Author: Reece Dunn <msclrhd@gmail.com>
+Date:  Thu Nov 5 22:25:14 2009 +0100
+
+    fontpos is never set to -1, so remove the checks in HtmlOutputDev.
+
+ utils/HtmlOutputDev.cc |   11 +++--------
+ 1 file changed, 3 insertions(+), 8 deletions(-)
+
+commit 55dd6024a4672a1787e8b1a8276bd78fff94e2cd
+Author: Ilya Gorenbein <igorenbein@finjan.com>
+Date:  Wed Nov 4 22:07:18 2009 +0100
+
+    Do not error on files without "Count" and "Kids"
+
+    It is not spec compliant not to have those fields but Adobe Reader and
+    FoxIt seems to allow it so try to behave like them. See bug 24720
+    to see why one would want such file
+
+ poppler/Catalog.cc |  10 +++++-----
+ 1 file changed, 5 insertions(+), 5 deletions(-)
+
+commit 58a1d42aed7352c008d201b8f355f6e4146f71e5
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Thu Oct 29 18:38:22 2009 +0100
+
+    [cairo] Don't render patterns when using CairoImageOutputDev
+
+ poppler/CairoOutputDev.h |   15 +++++++++++++--
+ 1 file changed, 13 insertions(+), 2 deletions(-)
+
+commit 7670cc48dcf3ffd77e3ffa29056a3e13b2926709
+Author: Ilya Gorenbein <igorenbein@finjan.com>
+Date:  Wed Oct 28 19:20:41 2009 +0100
+
+    There are some pdf where Aspect values are reals, use getNum
+
+    Fixes bug 24733
+
+ poppler/Annot.cc |    8 ++++++--
+ 1 file changed, 6 insertions(+), 2 deletions(-)
+
+commit 4fe89e520a04a6ab6d6ec6a8294896b2f427c7da
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Sun Oct 25 21:55:55 2009 +0100
+
+    do not accept negative interval lengths in the page labels tree
+
+    See bug 24721
+
+ poppler/PageLabelInfo.cc |    3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+commit b174ebd6b323c7a58a19d59c1a9e4ac4e6cba7d9
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Fri Oct 23 21:57:42 2009 +0200
+
+    Move the iccColorSpaceCache from a static in GfxState to a member
+    of Gfx
+
+    Fixes the problem that the keys are per document but we had a static
+    that lived as much as the library. Now the cache only lives the
+    rendering
+    of a page so it's a bit slower but at least it's correct. Fixes
+    bug 24686
+
+ poppler/Gfx.cc      |  49 +++++++++++++++++----------
+ poppler/Gfx.h      |   13 +++++--
+ poppler/GfxState.cc |  94
+ +++++++++++++++++++++++++--------------------------
+ poppler/GfxState.h  |  33 +++++++++---------
+ poppler/Page.cc     |   4 +--
+ 5 files changed, 107 insertions(+), 86 deletions(-)
+
+commit 4a9bdd30dc353865685e03eb1c1ac6093797695a
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Thu Oct 22 21:26:29 2009 +0200
+
+    initialize len at 0 when reading the font fails
+
+    See bug 24525 for more info
+
+ poppler/GfxFont.cc |   1 +
+ 1 file changed, 1 insertion(+)
+
+commit c839b706092583f6b12ed3cc634bf5af34b7a2bb
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Tue Oct 20 10:09:13 2009 +0200
+
+    [glib] Fix CVE-2009-3607
+
+ glib/poppler-page.cc |   20 ++++++++++----------
+ 1 file changed, 10 insertions(+), 10 deletions(-)
+
+commit 44462e0ca39392e5629020226b901e4026089b46
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Mon Oct 19 23:33:58 2009 +0200
+
+    fix memory leak
+
+ poppler/PSOutputDev.cc |    1 +
+ 1 file changed, 1 insertion(+)
+
+commit d701aaa9eaa62567210070129f5feffe24bf1936
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Sun Oct 18 01:22:16 2009 +0200
+
+    This include is needed as this file uses Ref
+
+ poppler/OutputDev.h |   1 +
+ 1 file changed, 1 insertion(+)
+
+commit d4202536e1b62c326c301d5088fa0e176c523e85
+Author: Pino Toscano <pino@kde.org>
+Date:  Sat Oct 17 01:35:11 2009 +0200
+
+    SplashGlyphBitmap is a struct and not a class
+
+ poppler/ArthurOutputDev.h |   2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 654176dee7c9325aa5a24a2de3c070faa16e8a9c
+Author: Michael Jansen <kde@michael-jansen.biz>
+Date:  Sat Oct 17 01:30:40 2009 +0200
+
+    CMake: add the possibility to pass LIB_SUFFIX.
+
+    This allows to tune the installation libdir by adding a suffix for it
+    (making it eg lib, lib32, or lib64)
+
+ CMakeLists.txt                 |   16 +++++++++-------
+ glib/CMakeLists.txt    |    2 +-
+ poppler-cairo.pc.cmake  |    2 +-
+ poppler-glib.pc.cmake  |    2 +-
+ poppler-qt.pc.cmake    |    2 +-
+ poppler-qt4.pc.cmake   |    2 +-
+ poppler-splash.pc.cmake |    2 +-
+ poppler.pc.cmake       |    2 +-
+ qt/CMakeLists.txt      |    2 +-
+ qt4/src/CMakeLists.txt  |    2 +-
+ 10 files changed, 18 insertions(+), 16 deletions(-)
+
+commit 43829ae4b25a88ace06f05fa6750e5732539f4be
+Author: Pino Toscano <pino@kde.org>
+Date:  Sat Oct 17 01:21:39 2009 +0200
+
+    put a space so MSVC won't try to see it as comment
+
+ poppler/GfxState.h |   4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit f64086ea22a4e8cb3d4e7116db2a9541ac2fb19f
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Sat Oct 17 00:48:58 2009 +0200
+
+    check the document is not locked when printing
+
+ qt4/src/poppler-ps-converter.cc |    6 ++++++
+ 1 file changed, 6 insertions(+)
+
+commit 85d1015480b7ab3f21cc5f78dc53d4c5efdc6e60
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Sat Oct 17 00:48:27 2009 +0200
+
+    fix file name comment
+
+ qt4/src/poppler-ps-converter.cc |    2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 270764ad1bf2cfe95aed0b6850d2347361b4268d
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Sat Oct 17 00:47:34 2009 +0200
+
+    Add a way for converters to return more exact errors they had when
+    converting
+
+ qt4/src/poppler-base-converter.cc   |   8 +++++++-
+ qt4/src/poppler-converter-private.h |   3 ++-
+ qt4/src/poppler-pdf-converter.cc    |  11 ++++++++++-
+ qt4/src/poppler-ps-converter.cc     |   6 +++++-
+ qt4/src/poppler-qt4.h              |   14 ++++++++++++++
+ 5 files changed, 38 insertions(+), 4 deletions(-)
+
+commit 1082e1671afd8ab91583dabc876304008acb021c
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Fri Oct 16 23:17:22 2009 +0200
+
+    Some "security" fixes based on newly released Xpdf 3.02pl4
+
+ poppler/Stream.cc        |    4 ++++
+ poppler/XRef.cc          |   19 +++++++++++++++----
+ splash/Splash.cc         |    7 +++++++
+ splash/SplashBitmap.cc    |   37 ++++++++++++++++++++++++++++++-------
+ splash/SplashErrorCodes.h |   4 +++-
+ 5 files changed, 59 insertions(+), 12 deletions(-)
+
+commit c2458275e02f56226779b82d73c13defcbbda563
+Author: Glenn Ganz <glenn.ganz@uptime.ch>
+Date:  Fri Oct 16 20:54:32 2009 +0200
+
+    fix constructor of DCTStream
+
+ poppler/Stream.cc |   3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+commit fd91b79c053bb5cd01a766032b90981dbc5e5dd3
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Sat Oct 10 14:53:42 2009 +0200
+
+    fix compiling with automake
+
+ goo/Makefile.am |    2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit c3031b4318af6f85256f2478c8678dedd0d6acd1
+Author: Pino Toscano <pino@kde.org>
+Date:  Fri Oct 9 16:17:16 2009 +0200
+
+    cmake: simplify the linking to libpng
+
+ CMakeLists.txt |    7 +++----
+ 1 file changed, 3 insertions(+), 4 deletions(-)
+
+commit 96688dd7a091f8fa141fad2b3d05bae04b0b86fb
+Author: Patrick Spendrin <ps_ml@gmx.de>
+Date:  Fri Oct 9 16:09:46 2009 +0200
+
+    MSVC: add _CRT_SECURE_NO_WARNINGS to the define's
+
+ CMakeLists.txt |    1 +
+ 1 file changed, 1 insertion(+)
+
+commit f346c1f6b55f87ebd6bb0b0932462d5514aa40ff
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Fri Oct 9 00:29:06 2009 +0200
+
+    add -ansi flag to default warnings
+
+ cmake/modules/PopplerMacros.cmake |   2 +-
+ configure.ac                     |    2 +-
+ utils/parseargs.c                |   30 +++++++++++++++---------------
+ utils/parseargs.h                |   26 +++++++++++++-------------
+ 4 files changed, 30 insertions(+), 30 deletions(-)
+
+commit 53e0016b772f1b78d998506e2f3106011d32cef3
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Fri Oct 9 00:15:52 2009 +0200
+
+    Add virtual destructor to ImgWriter
+
+ CMakeLists.txt   |    1 +
+ goo/ImgWriter.cc |   15 +++++++++++++++
+ goo/ImgWriter.h  |    2 ++
+ goo/Makefile.am  |    1 +
+ 4 files changed, 19 insertions(+)
+
+commit 699dcacced7be05b788c414c231dc2b5c07de06e
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Fri Oct 9 00:13:11 2009 +0200
+
+    Add -Wnon-virtual-dtor flag
+
+ cmake/modules/PopplerMacros.cmake |   4 ++--
+ configure.ac                     |    2 +-
+ 2 files changed, 3 insertions(+), 3 deletions(-)
+
+commit d1e4fca4a8602994b010fae4f4fea5cd4df9276e
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Fri Oct 9 00:10:03 2009 +0200
+
+    build on cmake too
+
+ CMakeLists.txt |    1 +
+ 1 file changed, 1 insertion(+)
+
+commit d67511c92022121066f43003f01b955962ddcd33
+Author: Stefan Thomas <thomas@eload24.com>
+Date:  Fri Oct 9 00:09:23 2009 +0200
+
+    Add -jpeg to pdftoppm
+
+ goo/ImgWriter.h       |   28 +++++++++++++++
+ goo/JpegWriter.cc     |   92
+ ++++++++++++++++++++++++++++++++++++++++++++++++
+ goo/JpegWriter.h      |   42 ++++++++++++++++++++++
+ goo/Makefile.am       |    2 ++
+ goo/PNGWriter.cc      |    5 +--
+ goo/PNGWriter.h       |   10 +++---
+ splash/SplashBitmap.cc |   46 ++++++++++++++++--------
+ splash/SplashBitmap.h |    5 +--
+ splash/SplashTypes.h  |   11 ++++++
+ utils/pdftoppm.1      |    3 ++
+ utils/pdftoppm.cc     |   22 +++++++++---
+ 11 files changed, 239 insertions(+), 27 deletions(-)
+
+commit 388196df1fb05fb2d88ae82bd81e823a23588ec1
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Wed Oct 7 17:11:58 2009 +0200
+
+    [glib-demo] Show some of the annot flags in annots treeview
+
+ glib/demo/annots.c |  35 +++++++++++++++++++++++++++++++++--
+ 1 file changed, 33 insertions(+), 2 deletions(-)
+
+commit 034907c6582c1f50782ec9c58a29b140c6fc0688
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Tue Oct 6 00:52:10 2009 +0200
+
+    Forgot to update the year here
+
+ qt4/src/poppler-private.h |   2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit fef89acebf5312324c104fb52e629563fbc2de76
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Tue Oct 6 00:42:52 2009 +0200
+
+    Add the possibility of enabling hinting
+
+ qt4/src/poppler-document.cc |   2 +-
+ qt4/src/poppler-private.h   |   1 +
+ qt4/src/poppler-qt4.h      |    3 ++-
+ 3 files changed, 4 insertions(+), 2 deletions(-)
+
+commit 485252844b5e0964ee724b74e2a7ba2b820b259e
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Tue Oct 6 00:41:57 2009 +0200
+
+    rework how hinting is used in the splash backend
+
+    Basically we default to no hinting now with the possibility to
+    enable it
+
+ poppler/ArthurOutputDev.cc   |    2 +-
+ poppler/GlobalParams.cc      |   19 -------------
+ poppler/GlobalParams.h       |    3 --
+ poppler/SplashOutputDev.cc   |    8 +++++-
+ poppler/SplashOutputDev.h    |    3 ++
+ splash/SplashFTFont.cc       |   64
+ +++++++++---------------------------------
+ splash/SplashFTFont.h       |    4 +--
+ splash/SplashFTFontEngine.cc |    8 +++---
+ splash/SplashFTFontEngine.h  |    7 +++--
+ splash/SplashFontEngine.cc   |    5 ++--
+ splash/SplashFontEngine.h    |    3 +-
+ 11 files changed, 40 insertions(+), 86 deletions(-)
+
+commit 8194c156cf2167834779e1690a89b5068baf8d58
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Mon Oct 5 00:55:55 2009 +0200
+
+    Fix includes for those using internal headers
+
+ goo/FixedPoint.h       |    2 +-
+ goo/gmem.h             |    2 +-
+ poppler/OutputDev.h    |    2 +-
+ poppler/PSOutputDev.h  |    2 +-
+ poppler/PageLabelInfo.h |    2 +-
+ utils/ImageOutputDev.h  |    2 +-
+ 6 files changed, 6 insertions(+), 6 deletions(-)
+
+commit 091f68ccd59413d6890dfbfcf8911f112e690b50
+Author: Kovid Goyal <kovid@kovidgoyal.net>
+Date:  Mon Oct 5 00:39:36 2009 +0200
+
+    Use _WIN32 instead of WIN32
+
+    More info at http://bugs.freedesktop.org/show_bug.cgi?id=24259
+
+ goo/GooMutex.h                       |   16 +++++++++++++++-
+ goo/gfile.cc                 |   33 +++++++++++++++++----------------
+ goo/gfile.h                  |    5 +++--
+ msvc/poppler/poppler-config.h |    2 +-
+ poppler-config.h.cmake        |    2 +-
+ poppler/ABWOutputDev.h        |    3 ++-
+ poppler/FileSpec.cc          |    7 ++++---
+ poppler/GlobalParams.cc       |   37
+ +++++++++++++++++++------------------
+ poppler/GlobalParams.h        |    4 ++--
+ poppler/Link.cc              |    3 ++-
+ poppler/PDFDoc.cc            |    4 ++--
+ poppler/PDFDoc.h             |    3 ++-
+ poppler/PSOutputDev.cc        |    5 +++--
+ poppler/TextOutputDev.cc      |    5 +++--
+ poppler/XpdfPluginAPI.cc      |   13 ++++++++++++-
+ poppler/poppler-config.h.in   |    2 +-
+ splash/SplashFontEngine.cc    |    9 +++++----
+ test/perf-test.cc            |   24 ++++++++++++------------
+ utils/HtmlOutputDev.h        |    3 ++-
+ 19 files changed, 108 insertions(+), 72 deletions(-)
+
+commit 7fd8bdfa450db4e323e4e5d12159359fbc47f9ed
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Mon Oct 5 00:21:15 2009 +0200
+
+    Remove spurious ;
+
+    Found by -Wextra i think we should add more warnings to our default
+    flags
+
+ qt4/src/poppler-annotation.cc |    2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit d46f7343e446331489d3fe6711a7cf778e0bd902
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Fri Oct 2 22:04:46 2009 +0200
+
+    Strings can have 0 inside so use the length
+
+    Fixes saving some files
+
+ poppler/PDFDoc.cc |   2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 2bc2040081919340415f576ce8266356deadbfcd
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Fri Oct 2 22:04:03 2009 +0200
+
+    Increase decimals from 5 to 10, a double has that precision
+
+    Makes saving more faithful for some files
+
+ poppler/PDFDoc.cc |   2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 05eb7342d5234732f27c9c67b7fc1f9e40a4e075
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Fri Oct 2 22:03:40 2009 +0200
+
+    If the stream was wrongly formed save the correct length
+
+    Fixes saving of some files
+
+ poppler/PDFDoc.cc |   12 ++++++++++++
+ 1 file changed, 12 insertions(+)
+
+commit b98faa4c162392d9416a5a93c9042b41f82d8657
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Fri Oct 2 22:02:13 2009 +0200
+
+    Return the save status as program status
+
+ test/pdf-fullrewrite.cc |    3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+commit f73f59f2c7bb7c7d57eb70cdc1bc30b80a92d0b7
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Fri Oct 2 22:01:45 2009 +0200
+
+    If the Length entry of the stream is wrong, fix it
+
+    Fixes saving some files
+
+ poppler/Parser.cc |   5 +++++
+ 1 file changed, 5 insertions(+)
+
+commit 91135c7e788bc32e414e1a9c9ab43b326a07e970
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Fri Oct 2 22:00:12 2009 +0200
+
+    increase the range of characters we sanitize
+
+    Fixes saving of some files
+
+ goo/GooString.cc |    4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 9dcb3e8be2cd52a795605548e43d6bfc149b2ea5
+Author: Yaakov Selkowitz <yselkowitz@users.sourceforge.net>
+Date:  Sun Sep 27 17:17:32 2009 +0200
+
+    Fix the linking not to use the .so directly but the lib
+
+    Fixes check on cygwin
+
+ m4/qt.m4 |    4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit ed4a6f1cfc7ccd2717d939841c092347c3307547
+Author: Kovid Goyal <kovid@kovidgoyal.net>
+Date:  Sat Sep 26 19:26:19 2009 +0200
+
+    Do not crash when saving files that come from a stream without name
+
+    Bug 24090
+
+ poppler/PDFDoc.cc |   6 +++++-
+ 1 file changed, 5 insertions(+), 1 deletion(-)
+
+commit 04b232d48930af9bc614d7fef47f79ce247713a4
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Sat Sep 26 18:30:41 2009 +0200
+
+    Write the Info into the trailer dict if there is one
+
+    Bug 24091
+
+ poppler/PDFDoc.cc |   8 +++++++-
+ 1 file changed, 7 insertions(+), 1 deletion(-)
+
+commit 343e4f9aceb935eb393ad94bbef4dbb1b1a450ee
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Sat Sep 26 18:28:40 2009 +0200
+
+    Plug leak
+
+ test/pdf-fullrewrite.cc |    1 +
+ 1 file changed, 1 insertion(+)
+
+commit 2ea0032283c4717f1bb285fab7956fc38f375e87
+Author: Yaakov Selkowitz <yselkowitz@users.sourceforge.net>
+Date:  Sat Sep 26 15:01:35 2009 +0200
+
+    Patch to make poppler work on Cygwin
+
+    Bug 4195
+
+ configure.ac       |    3 +++
+ qt/Makefile.am      |   2 +-
+ qt4/src/Makefile.am |   2 +-
+ 3 files changed, 5 insertions(+), 2 deletions(-)
+
+commit 074dc5e5e39cebc1fbe9bf6a15b2cae2391006c1
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Sat Sep 26 14:56:38 2009 +0200
+
+    Improve realibility for Streams with broken Length
+
+    Fixes bug 6841
+
+ poppler/Parser.cc |   17 +++++++++++++----
+ 1 file changed, 13 insertions(+), 4 deletions(-)
+
+commit b7702820245fb6cdbf77afba37c53c03d4362a25
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Mon Sep 21 21:58:26 2009 +0200
+
+    Print with a . and not with a , in all locales
+
+    This is a regression after the removal of setting LC_NUMERIC
+
+ poppler/PDFDoc.cc |   6 +++++-
+ 1 file changed, 5 insertions(+), 1 deletion(-)
+
+commit d31080d8195694cef740d4e77484179bb38d1f26
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Sun Sep 20 17:21:13 2009 +0200
+
+    CharCodeToUnicode is not mandatory in fonts, don't crash one fonts
+    that do not have it
+
+    Fixes bug #24036
+
+ poppler/Annot.cc |   33 ++++++++++++++++++++-------------
+ 1 file changed, 20 insertions(+), 13 deletions(-)
+
+commit a729d005a7204791fa8415de5aa0834136073ce8
+Author: Pino Toscano <pino@kde.org>
+Date:  Thu Sep 17 20:12:20 2009 +0200
+
+    Windows32/MSVC: initialize the font list once per GlobalParams,
+    instead of once at all
+
+    this fixes the font list being empty at the second (and following)
+    GlobalParams creation
+    thanks for Christian Ehrlicher for reporting the bug and testing
+    its fix
+
+ poppler/GlobalParams.cc    |   1 +
+ poppler/GlobalParams.h     |   1 +
+ poppler/GlobalParamsWin.cc |   1 -
+ 3 files changed, 2 insertions(+), 1 deletion(-)
+
+commit 68711d8494e2765c4a24ea59ce8d904981f0f917
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Wed Sep 9 23:24:22 2009 +0200
+
+    uint -> Guint
+
+    some compilers don't know about uint
+
+ poppler/Gfx.cc |    4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 943a13c9354dec18cb023642aebbe5d3bb920ed7
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Wed Sep 9 20:04:06 2009 +0200
+
+    poppler 0.12.0
+
+ CMakeLists.txt   |    4 ++--
+ NEWS            |   18 ++++++++++++++++++
+ configure.ac    |    4 ++--
+ msvc/config.h   |    6 +++---
+ qt4/src/Doxyfile |    2 +-
+ 5 files changed, 26 insertions(+), 8 deletions(-)
+
+commit e8ed7210346cb18f6e4588ad557f993c6d42f4a3
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Wed Sep 9 19:21:21 2009 +0200
+
+    increase library to 3.2.0
+
+ qt4/src/CMakeLists.txt |    2 +-
+ qt4/src/Makefile.am   |    2 +-
+ 2 files changed, 2 insertions(+), 2 deletions(-)
+
+commit e950107006a3b1889646d3705323c1b3d41eaa49
+Author: David Benjamin <davidben@mit.edu>
+Date:  Wed Sep 9 01:19:38 2009 +0200
+
+    Fix infinite loop in JBIG2Decoder
+
+    Bug 23025
+    Also fixes problems in bug-poppler6881-2.pdf and bug-poppler6500.pdf
+
+ poppler/JBIG2Stream.cc |   13 ++++++++-----
+ 1 file changed, 8 insertions(+), 5 deletions(-)
+
+commit 1cb25a4adaaf3e2da50724312a3db6928991f425
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Sun Sep 6 10:45:56 2009 +0200
+
+    [glib] Ignore attachments with an invalid embedded file
+
+    Fixes bug #10386
+
+ glib/poppler-document.cc |    4 ++++
+ 1 file changed, 4 insertions(+)
+
+commit 842e00f3114666609ef4dec6fa613d46f330a40c
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Sat Sep 5 15:20:35 2009 +0200
+
+    Add EmbeddedFile::isValid
+
+    Also do not crash if data() is called on an invalid file
+
+ qt4/src/poppler-embeddedfile.cc |   10 +++++++++-
+ qt4/src/poppler-qt4.h          |    9 ++++++++-
+ 2 files changed, 17 insertions(+), 2 deletions(-)
+
+commit 9d40b268f5a9a9a0fb79da0e1627dd8eebc4db6a
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Sat Sep 5 15:19:27 2009 +0200
+
+    Add EmbFile::isOk
+
+    At the moment returns false if the object stream is not really
+    a stream
+
+ poppler/Catalog.h |   3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+commit 642650b6f70425c8fff2df978ae71249a5ae07f3
+Author: David Benjamin <davidben@mit.edu>
+Date:  Sat Sep 5 01:12:49 2009 +0200
+
+    Better fallback when there's a type mismatch
+
+    Bug #17252
+
+ poppler/GfxFont.cc |  38 ++++++++++++++++++++++++++++++++------
+ 1 file changed, 32 insertions(+), 6 deletions(-)
+
+commit bf5811f5331292ccf30f1b0f089fe43d351d96be
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Wed Aug 26 00:43:46 2009 +0200
+
+    Improve shading color rendering
+
+    Shading is not necessarily lineal so require another bisection to
+    assume all the area in between have the same color. Fixes bug #20238
+
+ poppler/Gfx.cc |   17 ++++++++++++++++-
+ 1 file changed, 16 insertions(+), 1 deletion(-)
+
+commit e94430b790fde6ce7b7cb163c2e0adf2d071c81d
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Wed Aug 26 00:42:49 2009 +0200
+
+    Make code a bit more readable
+
+ poppler/Gfx.cc |   23 +++++++++++------------
+ 1 file changed, 11 insertions(+), 12 deletions(-)
+
+commit 465212780557705fd939dfe54f96913505bfc96e
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Tue Aug 25 21:55:45 2009 +0200
+
+    forgot to update my copyright
+
+ poppler/JPEG2000Stream.cc |   2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 4f6016d01ced32002bef22b9b5d5426a74e55842
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Tue Aug 25 21:10:07 2009 +0200
+
+    Fix format security warnings
+
+    Don't just directly print strings of unknown content; use "%s".
+
+ poppler/JPEG2000Stream.cc |   4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 4616b23382b5d155f8b2f1942733037cf5730844
+Author: Christian Persch <chpe@gnome.org>
+Date:  Tue Aug 25 21:09:40 2009 +0200
+
+    Fix format security warnings
+
+    Don't just directly print strings of unknown content; use "%s".
+
+ poppler/GfxState.cc |   3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+commit 6c5c8d008456d1e4f3d60bc182209747c2a175dc
+Author: Christian Persch <chpe@gnome.org>
+Date:  Tue Aug 25 21:03:16 2009 +0200
+
+    Support AM_SILENT_RULES
+
+    When using automake 1.11, should support silent build rules.
+
+ Makefile.am          |    2 +-
+ configure.ac         |    1 +
+ glib/Makefile.am      |    4 ++--
+ qt4/demos/Makefile.am |    2 +-
+ qt4/src/Makefile.am   |    2 +-
+ qt4/tests/Makefile.am |    2 +-
+ 6 files changed, 7 insertions(+), 6 deletions(-)
+
+commit e7dd1c47b01d8f31599ee686eafbe7c54d7c023a
+Author: Christian Persch <chpe@gnome.org>
+Date:  Tue Aug 25 21:01:13 2009 +0200
+
+    Fix automake check, and add automake 1.11 support
+
+    Fix the automake checks to take the *newest* version available,
+    not the
+    oldest one. Add support for automake 1.11. FDO#23473.
+
+ autogen.sh |  13 +++++++------
+ 1 file changed, 7 insertions(+), 6 deletions(-)
+
+commit 493d2c5aa78a3241e70108c5d7eccba9ac72f834
+Author: Rex Dieter <rdieter@math.unl.edu>
+Date:  Mon Aug 24 20:08:46 2009 +0200
+
+    Use Requires.private if available
+
+    The following patch minimizes pkg-config deps similar to how the
+    glib-related pkg-config deps are done.
+
+ poppler-qt.pc.cmake  |    3 ++-
+ poppler-qt.pc.in     |    3 ++-
+ poppler-qt4.pc.cmake |    3 ++-
+ poppler-qt4.pc.in    |    3 ++-
+ 4 files changed, 8 insertions(+), 4 deletions(-)
+
+commit 341cd3ecd08a39cd146c1c57f356b50a2881c03f
+Author: Jakub Wilk <ubanus@users.sf.net>
+Date:  Mon Aug 24 19:51:34 2009 +0200
+
+    common options for pdftoabw
+
+    The attached patch fixes command line handling for pdftoabw and
+    implements some
+    common options (e.g., --help) that are already found in other
+    pdftosomething
+    utilities.
+
+ utils/pdftoabw.cc |   39 ++++++++++++++++++++++++++++++++-------
+ 1 file changed, 32 insertions(+), 7 deletions(-)
+
+commit 365683d5faea6e0a7570b139d1f3366c22271f8e
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Tue Aug 18 21:18:13 2009 +0200
+
+    0.11.3
+
+ CMakeLists.txt   |    2 +-
+ NEWS            |   22 ++++++++++++++++++++++
+ configure.ac    |    2 +-
+ msvc/config.h   |    6 +++---
+ qt4/src/Doxyfile |    2 +-
+ 5 files changed, 28 insertions(+), 6 deletions(-)
+
+commit cb28bc8a637d300664b3c7569263445275333878
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Mon Aug 17 14:14:03 2009 +0200
+
+    [glib] Add FORMAT_MAJOR/MINOR properties to get the PDF version
+
+    See bug #23076.
+
+ glib/poppler-document.cc |   26 ++++++++++++++++++++++++++
+ 1 file changed, 26 insertions(+)
+
+commit 1b5612841b0c663f6d391d4581f65f68a2975db0
+Author: Pino Toscano <pino@kde.org>
+Date:  Mon Aug 17 01:04:04 2009 +0200
+
+    [Qt] add Document::getPdfVersion(int *major, int *minor) for the
+    document PDF version numbers
+
+    This new function reads the version of the PDF specification of the
+    document, putting major and minor numbers in own variables.
+
+ qt/poppler-document.cc |    8 ++++++++
+ qt/poppler-qt.h       |   12 ++++++++++++
+ 2 files changed, 20 insertions(+)
+
+commit aef8ecda1e80b921228f415a53c9c5a52df87d94
+Author: Pino Toscano <pino@kde.org>
+Date:  Mon Aug 17 00:57:08 2009 +0200
+
+    [Qt4] deprecate Document::pdfVersion()
+
+    ... in favour of getPdfVersion()
+
+ qt4/src/poppler-qt4.h |    5 ++++-
+ 1 file changed, 4 insertions(+), 1 deletion(-)
+
+commit 830140f70e48e8033ad4411b6bd405d5ad7358a3
+Author: Pino Toscano <pino@kde.org>
+Date:  Mon Aug 17 00:51:13 2009 +0200
+
+    [Qt4] add Document::getPdfVersion(int *major, int *minor) for the
+    document PDF version numbers
+
+    This new function reads the version of the PDF specification of the
+    document, putting major and minor numbers in own variables.
+    Add them to the relative unit test.
+
+ qt4/src/poppler-document.cc  |    8 ++++++++
+ qt4/src/poppler-qt4.h       |   13 +++++++++++++
+ qt4/tests/check_metadata.cpp |    4 ++++
+ 3 files changed, 25 insertions(+)
+
+commit 5491d16dfbd73f0256c62e49d02622dc3185012e
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Mon Aug 17 00:24:41 2009 +0200
+
+    Move poppler core away from using a double as PDF file version
+
+    Frontends are yet to come
+
+ glib/poppler-document.cc    |   2 +-
+ poppler/PDFDoc.cc          |    7 ++++---
+ poppler/PDFDoc.h           |    8 +++++---
+ qt/poppler-document.cc      |   4 ++--
+ qt4/src/poppler-document.cc |   4 ++--
+ utils/pdfinfo.cc           |    4 ++--
+ 6 files changed, 16 insertions(+), 13 deletions(-)
+
+commit efd5dd63a5b08249529d9a9f5906aefe806fb3aa
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Mon Aug 17 00:21:22 2009 +0200
+
+    Forgot to update copyright info
+
+ fofi/FoFiType1C.cc |  14 ++++++++++++++
+ poppler/PDFDoc.cc  |   2 +-
+ utils/parseargs.c  |   2 +-
+ 3 files changed, 16 insertions(+), 2 deletions(-)
+
+commit 25ff4be0b4521cc3d2de386cdeb589beb245d435
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Mon Aug 17 00:15:10 2009 +0200
+
+    No need to change the locale since we use gatof that does the
+    right thing
+
+ poppler/PDFDoc.cc |   6 +-----
+ 1 file changed, 1 insertion(+), 5 deletions(-)
+
+commit a6f698b4edc42c0414dd4690e1e037088321db2c
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Mon Aug 17 00:14:35 2009 +0200
+
+    Use gatof instead of atof
+
+ fofi/FoFiType1C.cc  |   3 ++-
+ poppler/Annot.cc    |   5 +++--
+ poppler/Function.cc |   3 ++-
+ poppler/PDFDoc.cc   |   3 ++-
+ utils/parseargs.c   |   4 +++-
+ 5 files changed, 12 insertions(+), 6 deletions(-)
+
+commit 807b121cae45832d2e5832bad19c31e77420bfec
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Mon Aug 17 00:10:30 2009 +0200
+
+    Add a custom strtod that comes from libspectre
+
+    Works over C locale integers without changing locale settings
+
+ CMakeLists.txt  |    2 +
+ goo/Makefile.am |    6 ++-
+ goo/gstrtod.cc  |  147
+ +++++++++++++++++++++++++++++++++++++++++++++++++++++++
+ goo/gstrtod.h  |   43 ++++++++++++++++
+ 4 files changed, 196 insertions(+), 2 deletions(-)
+
+commit 914bf7677a14494b69857b1d8070092a9999fe79
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Sun Aug 16 20:50:02 2009 +0200
+
+    When writing the cm matrix write 4 significant digits not 4 decimals
+
+    This fixes bug 23332
+    Maybe we want to make this the default behaviour of 'g' instead of
+    a new 'gs' case, but i prefer to be on the safe side for the moment
+
+ goo/GooString.cc      |   27 +++++++++++++++++++++++++--
+ goo/GooString.h       |    4 +++-
+ poppler/PSOutputDev.cc |    4 ++--
+ 3 files changed, 30 insertions(+), 5 deletions(-)
+
+commit b7dfca1aa52b825eb3b8f1cc0470398c31615b30
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Sun Aug 16 19:28:37 2009 +0200
+
+    [cairo] CairoImageOutputDev doesn't implement patterns
+
+ poppler/CairoOutputDev.h |   13 +++++++++++++
+ 1 file changed, 13 insertions(+)
+
+commit d20d65111aee2ee4b8cdea2962ed1bb149122ba9
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Sun Aug 16 17:36:14 2009 +0200
+
+    [cairo] Implement tiling patterns in cairo backend
+
+    Fixes bug #13518 for the cairo backend.
+
+ poppler/CairoOutputDev.cc |   56
+ +++++++++++++++++++++++++++++++++++++++++++++
+ poppler/CairoOutputDev.h  |   10 ++++++++
+ 2 files changed, 66 insertions(+)
+
+commit e965d0686d979c775b64a93f8e2f775f81885417
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Thu Aug 13 14:48:10 2009 +0200
+
+    Change OutputDev::tilingPatternFill to return a GBool
+
+    It allows outputdevs to decide whether render the pattern or not
+    depending
+    on the parameters, like shaded patterns currently do.
+
+ poppler/Gfx.cc                |   37 +++++++++++++++++++------------------
+ poppler/OutputDev.h   |   11 ++++++-----
+ poppler/PSOutputDev.cc |   12 +++++++-----
+ poppler/PSOutputDev.h |   10 +++++-----
+ 4 files changed, 37 insertions(+), 33 deletions(-)
+
+commit ce70ef7d6afc800e24031dae43da301e9e542f0e
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Sat Aug 15 17:45:57 2009 +0200
+
+    Fix backwards search
+
+ qt4/src/poppler-page.cc |    4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 5b7b1cdc5c3b8652d3ae583b4d7b8b6de625adc2
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Sat Aug 15 17:45:05 2009 +0200
+
+    Add an autotest showing previousresult fails
+
+ qt4/tests/check_search.cpp |  51
+ ++++++++++++++++++++++++++++++++++++++++++++
+ 1 file changed, 51 insertions(+)
+
+commit 2484b0dcb8eb62f8e2c147498c58871ec04630b5
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Fri Aug 14 11:47:11 2009 +0200
+
+    Implement the alpha path
+
+    I wonder if this is the correct fix why it was not implemented
+    but if fixes rendering of files in KDE bug 145868, KDE bug 193657,
+    poppler bug 17473.pdf, poppler bug 21651, poppler bug 22143 and
+    poppler bug 22152 and causes no regression in all the other files
+    i have in my test dir so i'm commiting it
+
+ poppler/SplashOutputDev.cc |   4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 03970d8b6d7624444664320470baa6d1b1299622
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Tue Aug 11 12:01:07 2009 +0200
+
+    [build] Fix build with autotools
+
+ utils/Makefile.am |   1 +
+ 1 file changed, 1 insertion(+)
+
+commit 15752b7cd5c94620e3ad3b6afd9c70ccc754c9b3
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Mon Aug 10 20:02:13 2009 +0200
+
+    [cairo] Add empty updateBlendMode to CairoImageOutputDev
+
+    Fixes a crash when using CairoImageOutputDev with a document with
+    blend
+    modes.
+
+ poppler/CairoOutputDev.h |    1 +
+ 1 file changed, 1 insertion(+)
+
+commit 45dae4e66b2b833f95656850b5f1b0ffd1d96f1d
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Mon Aug 10 20:00:04 2009 +0200
+
+    [cairo] Use current fill_opacity when drawing images
+
+    Fixes launchpad bug #342282 (page 2 of the attached document)
+
+ poppler/CairoOutputDev.cc |   16 +++++++++++++---
+ 1 file changed, 13 insertions(+), 3 deletions(-)
+
+commit b1cd54546844f2f7cd6bf7cc14b7584c84c3fc14
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Mon Aug 10 19:55:44 2009 +0200
+
+    [cairo] Do not save the font file twice for FreeType fonts
+
+    Fixes bug #20491.
+
+ poppler/CairoFontEngine.cc |  19 ++-----------------
+ 1 file changed, 2 insertions(+), 17 deletions(-)
+
+commit 4181a0ff11195eb7a56d76be23994b843e20b483
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Mon Aug 10 19:58:09 2009 +0200
+
+    this branch is unlikely to happen
+
+ poppler/Lexer.cc |    2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 2a3025f32951ce7b7343aeef111902615d71595e
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Mon Aug 10 19:55:40 2009 +0200
+
+    fix overflow calculation not to depend on the variable overflowing
+
+ poppler/Lexer.cc |   12 ++++++++----
+ 1 file changed, 8 insertions(+), 4 deletions(-)
+
+commit a38001f724f78231c2fdadd28e647a35b41bab74
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Sun Aug 9 23:26:02 2009 +0200
+
+    Check for overflow when parsing integers
+
+    Fixes bug 23078
+
+ poppler/Lexer.cc |   28 ++++++++++++++++++++++------
+ 1 file changed, 22 insertions(+), 6 deletions(-)
+
+commit 4c4c0e44452d07bea88d98b7df0c01fadd7693cc
+Author: Jakub Wilk <ubanus@users.sf.net>
+Date:  Sat Aug 8 17:26:14 2009 +0200
+
+    Silence some warnings when using internal headers and not compiling
+    with -Wno-write-strings
+
+    People should not be using internal headers but it's just two lines
+
+ poppler/Object.h |    5 +++--
+ 1 file changed, 3 insertions(+), 2 deletions(-)
+
+commit e2c319ba18ab473fd969db9519a9231be67538c3
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Sat Aug 8 00:48:18 2009 +0200
+
+    Also implement mono so that -mono in pdftoppm -png works
+
+    Totally not optimized
+
+ splash/SplashBitmap.cc |   23 ++++++++++++++++++++++-
+ 1 file changed, 22 insertions(+), 1 deletion(-)
+
+commit c669e7f3ca421265e78161cc3fdecd2a0c7510c9
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Sat Aug 8 00:38:50 2009 +0200
+
+    Support splashModeMono8 in writePNGFile
+
+    Works though is non optimal
+
+ splash/SplashBitmap.cc |   55
+ ++++++++++++++++++++++++++++++++++--------------
+ 1 file changed, 39 insertions(+), 16 deletions(-)
+
+commit 92744b72df9084fd2d69ba78406898378884aed8
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Sat Aug 8 00:20:52 2009 +0200
+
+    Add the -png flag to pdftoppm to output to PNG
+
+    Based on a patch by Shen Liang <shenzhuxi@gmail.com>
+    Also factored common PNG code from HtmlOutputDev to PNGWriter
+
+ CMakeLists.txt                   |    5 +++
+ goo/Makefile.am          |    9 +++-
+ goo/PNGWriter.cc         |  110
+ +++++++++++++++++++++++++++++++++++++++++++++
+ goo/PNGWriter.h          |   43 ++++++++++++++++++
+ poppler/Makefile.am      |    8 ++++
+ splash/SplashBitmap.cc    |   70 +++++++++++++++++++++++++++++
+ splash/SplashBitmap.h    |    5 +++
+ splash/SplashErrorCodes.h |   4 +-
+ utils/CMakeLists.txt     |    4 --
+ utils/HtmlOutputDev.cc    |   66 +++++----------------------
+ utils/Makefile.am        |    4 --
+ utils/pdftoppm.1         |    3 ++
+ utils/pdftoppm.cc        |   21 +++++++--
+ 13 files changed, 283 insertions(+), 69 deletions(-)
+
+commit e4439ff527bb202d0239f78e647452983b733411
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Fri Aug 7 15:23:57 2009 +0200
+
+    [cairo] Don't apply masks when fill color space mode is csPattern
+
+    In that case the mask is used for clipping when drawing images. Fixes
+    bug #22216.
+
+ poppler/CairoOutputDev.cc |   59
+ +++++++++++++++++++++++++++++----------------
+ 1 file changed, 38 insertions(+), 21 deletions(-)
+
+commit 7194f59a18e4f6997ae560af3db1bd101d6f726e
+Author: Chris Wilson <chris@chris-wilson.co.uk>
+Date:  Thu Aug 6 11:24:22 2009 +0100
+
+    [cairo] Use FT_New_Memory_Face() for mmapped  fonts
+
+    If we hold a mapping for the font, then we can pass that memory to
+    FreeType for it to use as well. This saves on FreeType having to
+    read the
+    file into a fresh block of memory.
+
+ poppler/CairoFontEngine.cc |   5 ++++-
+ 1 file changed, 4 insertions(+), 1 deletion(-)
+
+commit 7e2bbcf6f85111d1006b0d5bc1503cadaba83c9f
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Tue Aug 4 00:10:58 2009 +0200
+
+    Set KDAB via gamaral copyright
+
+ poppler/Form.cc |    3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+commit ed5918e16dafebc9ecf6db8ce0186f407ecbf7d5
+Author: Pino Toscano <pino@kde.org>
+Date:  Sat Aug 1 20:00:22 2009 +0200
+
+    [Qt4 apidox] make example for FontIterator... not leak ;)
+
+ qt4/src/poppler-qt4.h |    2 ++
+ 1 file changed, 2 insertions(+)
+
+commit f3b36d9c992491e614e88dbf1a84b5433a7647f4
+Author: Pino Toscano <pino@kde.org>
+Date:  Sat Aug 1 19:54:52 2009 +0200
+
+    [Qt4] Add color management API.
+
+    Add few wrapper functions to get/set color profiles.
+    Add a function to know whether the color management functions actually
+    do anything (ie support compiled or not).
+    Add few basic API docs for the new functions.
+    Based on an initial patch by Hal V. Engel <hvengel@astound.net>,
+    heavily reindented, polished and massaged in its API by me.
+
+ qt4/src/poppler-document.cc |  52
+ +++++++++++++++++++++++++++++++++++++++++++
+ qt4/src/poppler-qt4.h      |   50
+ +++++++++++++++++++++++++++++++++++++++++
+ 2 files changed, 102 insertions(+)
+
+commit 78a1969d040018c0c2bb74c94f5507f786e4666e
+Author: Pino Toscano <pino@kde.org>
+Date:  Sat Aug 1 18:00:06 2009 +0200
+
+    [Qt] add unhandled cases and remove unused code
+
+ qt/poppler-page.cc |  12 ++----------
+ 1 file changed, 2 insertions(+), 10 deletions(-)
+
+commit bddebec0712e92e13b57d3d05d652673fe737866
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Sat Aug 1 17:12:22 2009 +0200
+
+    0.11.2
+
+ CMakeLists.txt   |    2 +-
+ NEWS            |   30 ++++++++++++++++++++++++++++++
+ configure.ac    |    2 +-
+ msvc/config.h   |    6 +++---
+ qt4/src/Doxyfile |    2 +-
+ 5 files changed, 36 insertions(+), 6 deletions(-)
+
+commit 87e2af3454348f5568d155c15af5d85268e47f1b
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Sat Aug 1 15:48:02 2009 +0200
+
+    [glib-demo] Add cast to make sure the comparison is always valid
+
+ glib/demo/attachments.c |    2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 464e95ef451103daddc9a30cd26b986291f02176
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Sat Aug 1 15:47:25 2009 +0200
+
+    [glib-demo] Add missing return
+
+ glib/demo/attachments.c |    2 ++
+ 1 file changed, 2 insertions(+)
+
+commit 7f48369e4d29b2a71abffa9e1966e3a2252de895
+Author: Guillermo Antonio Amaral Bastidas <gamaral@amaral.com.mx>
+Date:  Sat Aug 1 15:41:34 2009 +0200
+
+    Call fillChildrenSiblingsID in fillChildrenSiblingsID instaed of
+    loadChildrenDefaults
+
+ poppler/Form.cc |    2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit e21a3e40bf6f4365064cea751ae186580d8f81f5
+Author: William Bader <williambader@hotmail.com>
+Date:  Sat Aug 1 15:23:03 2009 +0200
+
+    Add the possibility of disabling font substitution in pdftops
+
+    Bug #23030
+
+ poppler/GlobalParams.cc |   17 ++++++++++++++
+ poppler/GlobalParams.h  |    4 ++++
+ poppler/PSOutputDev.cc  |   59
+ ++++++++++++++++++++++++++---------------------
+ poppler/PSOutputDev.h  |    2 ++
+ utils/pdftops.1        |    8 ++++++-
+ utils/pdftops.cc       |    7 ++++++
+ 6 files changed, 70 insertions(+), 27 deletions(-)
+
+commit bd68c90338cbf16f468e5db59722610300a629e1
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Sat Aug 1 15:19:48 2009 +0200
+
+    Forgot to add my copyright
+
+ poppler/GfxState.h |   1 +
+ 1 file changed, 1 insertion(+)
+
+commit 173451730948c320f16a0f5924a58302603eca0b
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Sat Aug 1 15:13:35 2009 +0200
+
+    Try to workaround some incorrect PDF
+
+    Fixes rendering of PDF where forms/patterns have more q than Q. Fixes
+    rendering in splash of pdf in bugs #22835, #21899 and #16402
+
+ poppler/Gfx.cc     |  13 +++++++++++++
+ poppler/GfxState.h |   1 +
+ 2 files changed, 14 insertions(+)
+
+commit 35c408ca49be08144bcf14aa112505fd556725d2
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Fri Jul 31 23:27:02 2009 +0200
+
+    add the overloaded virtual warning also the autotools based build
+
+ configure.ac |    2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 1c32bd2d101e5dfb37e28276ecad699f121b27b7
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Fri Jul 31 23:22:25 2009 +0200
+
+    Add my copyright to files i just edited
+
+ poppler/OutputDev.cc  |    1 +
+ poppler/OutputDev.h   |    1 +
+ utils/HtmlOutputDev.h |    2 +-
+ 3 files changed, 3 insertions(+), 1 deletion(-)
+
+commit 10717a48c85f1dbeff1c6bcd094006a9ecc92efc
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Fri Jul 31 23:22:10 2009 +0200
+
+    Add -Woverloaded-virtual as default CXX flag
+
+ cmake/modules/PopplerMacros.cmake |   1 +
+ 1 file changed, 1 insertion(+)
+
+commit db5f736655f01575ac5d7c524cbf131924ae91fa
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Fri Jul 31 23:12:00 2009 +0200
+
+    rename the function
+
+    That way the name is different from the OutputDev function and does
+    not seem like a wrong overload
+
+ utils/HtmlOutputDev.cc |    4 ++--
+ utils/HtmlOutputDev.h |    2 +-
+ 2 files changed, 3 insertions(+), 3 deletions(-)
+
+commit 4be87f87509b93c4fe4025f9bd788e9412416663
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Fri Jul 31 23:11:32 2009 +0200
+
+    Remove Outputdev::beginMarkedContent as noone uses it
+
+ poppler/Gfx.cc       |    2 --
+ poppler/OutputDev.cc |    3 ---
+ poppler/OutputDev.h  |    1 -
+ 3 files changed, 6 deletions(-)
+
+commit 6ab2ec8a89519d2bd1576c8d62f8aec51b04479a
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Fri Jul 31 23:10:56 2009 +0200
+
+    Warning--
+
+ poppler/PSOutputDev.cc |    2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 53c3d636ad645a350b576160e1498726238a7bd1
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Fri Jul 31 18:23:57 2009 +0200
+
+    [cairo] Implement radialShadedFill in cairo backend using cairo
+    gradients
+
+    Fixes bugs #10942, #14160
+
+ poppler/CairoOutputDev.cc |   28 +++++++++
+ poppler/CairoOutputDev.h  |   2 +
+ poppler/Gfx.cc                   |  141
+ +++++++++++++++++++++++++++------------------
+ poppler/OutputDev.h      |    2 +-
+ poppler/PSOutputDev.cc    |   3 +-
+ poppler/PSOutputDev.h    |    2 +-
+ 6 files changed, 117 insertions(+), 61 deletions(-)
+
+commit 2ba937545d1a2b9fa798f04fee755ccdf0e74ec7
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Fri Jul 31 17:49:18 2009 +0200
+
+    [cairo] Use cairo_pattern_set_extend for linear gradients
+
+ poppler/CairoOutputDev.cc |   9 +++++++++
+ poppler/CairoOutputDev.h  |   1 +
+ poppler/Gfx.cc                   |   34 ++++++++++++++++++++++++++++------
+ poppler/OutputDev.h      |    4 ++++
+ 4 files changed, 42 insertions(+), 6 deletions(-)
+
+commit b054756113f0df6b59935823882f412486e96db5
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Wed Jun 17 11:10:15 2009 +0200
+
+    [cairo] Implement blend mdoes in cairo backend
+
+    It requires cairo from git master to work at the moment. Fixes bugs
+     #22384, #12979, #13603, #17919, #22255
+
+ configure.ac             |   27 +++++++++++++++++++++
+ poppler/CairoOutputDev.cc |   59
+ +++++++++++++++++++++++++++++++++++++++++++++
+ poppler/CairoOutputDev.h  |   1 +
+ 3 files changed, 87 insertions(+)
+
+commit bf8964726c9311e7e82b1faf49cc2272e5c1e339
+Author: William Bader <williambader@hotmail.com>
+Date:  Thu Jul 30 22:08:43 2009 +0200
+
+    Fix some double to int warnings by explicit casting
+
+ poppler/Gfx.cc |    7 ++++---
+ 1 file changed, 4 insertions(+), 3 deletions(-)
+
+commit fdbd0c548e963461b2bc4bdf1beaa1577cafcea7
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Thu Jul 30 21:05:18 2009 +0200
+
+    Update gtk-doc build files
+
+ gtk-doc.make  |  102
+ ++++++++++++++++++++++++++++++++++++++-------------------
+ m4/gtk-doc.m4 |   74 ++++++++++++++++++++++-------------------
+ 2 files changed, 110 insertions(+), 66 deletions(-)
+
+commit ae84dce5cea4d249526a6ed5b2feb2d3f241da1b
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Thu Jul 30 20:45:39 2009 +0200
+
+    Revert "Remove unneeded files from repo"
+
+    This reverts commit 4cc9dee35e03d7b295a476f937ec0f2c43bb6592.
+
+    See bug #22697.
+
+ configure.ac              |    2 +-
+ glib/reference/Makefile.am |   4 +-
+ gtk-doc.make              |  155
+ ++++++++++++++++++++++++++++++++++++++++++++
+ m4/gtk-doc.m4             |   53 +++++++++++++++
+ 4 files changed, 211 insertions(+), 3 deletions(-)
+
+commit 7e14516a78b16453c747eb92b08665632e5f6844
+Author: Sanjoy Mahajan <sanjoy@mit.edu>
+Date:  Mon Jul 27 23:20:50 2009 +0200
+
+    Fix displayPages call
+
+    Parameters are outputdev, first, last, dpi, dpi, rotate, usemediabox,
+    crop, printing
+    and we were doing
+    usemediabox = !noCrop
+    crop = gFasle
+    the correct is
+    usemediabox = noCrop
+    crop = !noCrop
+
+ utils/pdftops.cc |    3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+commit 3d53a0eb14420d54c0ebf8590e34c018b8da105d
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Sun Jul 19 16:02:33 2009 +0200
+
+    Copy byte_lookup in copy constructor
+
+ poppler/GfxState.cc |   6 ++++++
+ 1 file changed, 6 insertions(+)
+
+commit 8f7271acf17c46e663cd48d90c382b04a834fba2
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Sun Jul 19 15:53:49 2009 +0200
+
+    Don't use byte_lookup table when color space doesn't support getLine
+    methods
+
+    For color spaces that don't implement getRGBLine or getGrayLine
+    methods,
+    getRGB or getGray are called for every pixel, however we were
+    allocating
+    the byte_lookup table and converting colors in those cases
+    too. Instead
+    of falling back to generic methods in the base class, the new methods
+    useGetRGBLine and useGetGrayLine have been added to he base class,
+    so that
+    when they are not suopported in the current color space byte_lookup
+    table is
+    not used at all.
+
+    Fixes bug #11027.
+
+ poppler/GfxState.cc | 125
+ ++++++++++++++++++++++++++++++---------------------
+ poppler/GfxState.h  |  21 +++++++--
+ 2 files changed, 91 insertions(+), 55 deletions(-)
+
+commit 1bc737796bef1c65289a101b2d4c367267b9c974
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Sun Jul 19 15:51:43 2009 +0200
+
+    Remove unused variable
+
+ poppler/GfxState.h |   1 -
+ 1 file changed, 1 deletion(-)
+
+commit 512b2c654fd80c83b82e7adc828a478a18de17ab
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Sun Jul 26 19:35:06 2009 +0200
+
+    [cairo] Use CAIRO_EXTEND_PAD in drawImageMaskPrescaled too
+
+ poppler/CairoOutputDev.cc |   32 +++++++++++++++-----------------
+ 1 file changed, 15 insertions(+), 17 deletions(-)
+
+commit ad26e34bede53cb6300bc463cbdcc2b5adf101c2
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Sun Jul 26 18:36:06 2009 +0200
+
+    [cairo] Use rectangle + clip instead of invert + tranform
+
+    This is just for consistency of drawImage methods
+
+ poppler/CairoOutputDev.cc |   30 ++++++++++++++----------------
+ 1 file changed, 14 insertions(+), 16 deletions(-)
+
+commit ee6b761a55baef4c3bbe4614b0c3b3d761a3111f
+Author: Chris Wilson <chris@chris-wilson.co.uk>
+Date:  Sun Jul 26 16:19:15 2009 +0200
+
+    [cairo] Apply a clip for masked drawImage
+
+    In order to use EXTEND_PAD with a mask, we need to apply a clip (to
+    constrain the image to the appropriate region). The complicating
+    factor for
+    drawSoftImage() is that mask size is independent of the image size,
+    so we
+    need to compute the intersection of the mask with in the image
+    in userspace.
+
+ poppler/CairoOutputDev.cc |   21 ++++++++++++++-------
+ 1 file changed, 14 insertions(+), 7 deletions(-)
+
+commit 499c6c972bac14936b5370276da723a6e98861b3
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Sun Jul 26 11:30:08 2009 +0200
+
+    [cairo] Use CAIRO_EXTEND_PAD when drawing images
+
+ poppler/CairoOutputDev.cc |  306
+ +++++++++++++++++++++------------------------
+ 1 file changed, 140 insertions(+), 166 deletions(-)
+
+commit f91eb7d01cef0897727c63267db309bc92297d37
+Author: Koji Otani <sho@bbr.jp>
+Date:  Sat Jul 25 16:34:12 2009 +0200
+
+    Fix generation of ps for some files
+
+    For example fixes second pdf in bug 18908
+
+ poppler/PSOutputDev.cc |   68
+ ++++++++++++++++++++++++++++++++++++------------
+ 1 file changed, 51 insertions(+), 17 deletions(-)
+
+commit f93f5e17d8f23f3e2862f3411f43a95b334e6c91
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Mon Jul 20 17:10:37 2009 +0200
+
+    [cairo] Improve performance when rendering one-channel images
+
+    It implements the same idea already used in SplashOutputDev, for
+    one-channel (monochrome/gray/separation) images we build a lookup
+    table
+    so that we won't need to call colorMap->getRGBLine when filling the
+    image buffer. Fixes bug #18017.
+
+ poppler/CairoOutputDev.cc |   36 ++++++++++++++++++++++++++++++++++--
+ 1 file changed, 34 insertions(+), 2 deletions(-)
+
+commit e7475062b6ae5c495fa72faaf8fb3d97391f8544
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Tue Jul 14 17:22:52 2009 +0200
+
+    [cairo] Handle fontType1COT fonts in CairoFontEngine
+
+ poppler/CairoFontEngine.cc |   3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+commit d42b9425fb2f98fa79e7a60e4f71ef14f5bacfe9
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Sun Jul 12 19:55:14 2009 +0200
+
+    glade is not used anymore
+
+ cmake/modules/FindGTK.cmake |   9 ++++-----
+ 1 file changed, 4 insertions(+), 5 deletions(-)
+
+commit 454f7468c6a6a442a5064b5daa24d65ebf4fc6b6
+Author: Chris Wilson <chris@chris-wilson.co.uk>
+Date:  Thu Jul 9 10:43:00 2009 +0100
+
+    [cairo] Fix drawImage() for non-1x1 images
+
+    Carlos noticed a nasty bug with converting drawImage() to use PAD
+    + fill,
+    instead of NONE + paint. That is the image was being padded out
+    far beyond
+    the correct output extents. The cause is that the caller pre-scales
+    the
+    context for the image, so the output rectangle was many times the true
+    image size - obliterating large amounts of the page. The temporary
+    fix is
+    to counter-act the scaling on the context. Longer term, after
+    fixing all
+    painters to use PAD correctly, we need to review the callers to remove
+    unnecessary pre-scaling.
+
+ poppler/CairoOutputDev.cc |   16 ++++++++++++----
+ 1 file changed, 12 insertions(+), 4 deletions(-)
+
+commit f8d93eae3c7b9388feabac71f2380d0b42a855e7
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Wed Jul 8 20:14:35 2009 +0200
+
+    Lookup UF and F entries before Unix, MAC and DOS in getFileSpec
+
+ poppler/FileSpec.cc |  24 ++++++++++++------------
+ 1 file changed, 12 insertions(+), 12 deletions(-)
+
+commit 767c534f5fdf6ccbccfd85a0086d72c215c278f1
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Wed Jul 8 19:13:54 2009 +0200
+
+    Use UF entry when present in dict in getFileSpecName() too
+
+ poppler/FileSpec.cc |   5 +++++
+ 1 file changed, 5 insertions(+)
+
+commit 569627ac4d56ddd58e109ce2a37179a85e042030
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Wed Jul 8 13:02:16 2009 +0200
+
+    Implement axialShadedFill in cairo backend using cairo gradients
+
+    See bug #10942.
+
+ poppler/CairoOutputDev.cc |   29 +++++++++++++++++++++++++++++
+ poppler/CairoOutputDev.h  |   10 ++++++++++
+ poppler/Gfx.cc                   |   29 ++++++++++++++++++++---------
+ poppler/OutputDev.h      |    6 +++++-
+ poppler/PSOutputDev.cc    |   2 +-
+ poppler/PSOutputDev.h    |    2 +-
+ 6 files changed, 66 insertions(+), 12 deletions(-)
+
+commit 6ae0a6c0044713affa23eb1ee6a070785ed6c2f3
+Author: Chris Wilson <chris@chris-wilson.co.uk>
+Date:  Wed Jul 8 16:48:26 2009 +0100
+
+    [cairo] premultiply image mask
+
+    Cairo uses a premultiplied colour-space, so when creating the
+    image mask
+    in drawImage() we need to remember to multiply by the alpha. In
+    this case
+    it just requires zeroing out the masked pixels.
+
+ poppler/CairoOutputDev.cc |   9 +++++++--
+ 1 file changed, 7 insertions(+), 2 deletions(-)
+
+commit 646e5884e748ecce7094c673400484aa1d902bdd
+Author: Chris Wilson <chris@chris-wilson.co.uk>
+Date:  Wed Jul 8 17:00:34 2009 +0100
+
+    [cairo] maskColors is an array of ints, no scaling required
+
+    drawImage() was erroneously scaling the maskColors from what it
+    believed
+    to be [0:1] to [0:255]. However maskColors is already an integer
+    array,
+    [0:255].
+
+ poppler/CairoOutputDev.cc |   4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit d75feb1ee84385a9f94308cf47a43f4583092ddf
+Author: Chris Wilson <chris@chris-wilson.co.uk>
+Date:  Wed Jul 8 16:37:19 2009 +0100
+
+    [cairo] cleanse DrawImage()
+
+    Just a small bit of code rearrangement to reduce repetition and
+    invalid checks.
+
+ poppler/CairoOutputDev.cc |  102
+ ++++++++++++++++++---------------------------
+ 1 file changed, 41 insertions(+), 61 deletions(-)
+
+commit 52f3704fed16cfc1e9dd85f72dde7922371e4099
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Wed Jul 8 11:40:52 2009 +0200
+
+    [TODO] Update TODO file
+
+ TODO |    6 ++++++
+ 1 file changed, 6 insertions(+)
+
+commit ef261f5f72d37a0aa2709611ee2bad7d55340ed8
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Tue Jul 7 10:57:31 2009 +0200
+
+    Do not use F and UF entries if Unix or DOS are present in FileSpec
+    dict
+
+ poppler/FileSpec.cc | 114
+ +++++++++++++++++++++++----------------------------
+ 1 file changed, 51 insertions(+), 63 deletions(-)
+
+commit cafd4653dc6c7574214e80aa09489dcd24e347a6
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Wed Jul 1 11:41:32 2009 +0200
+
+    [glib-demo] Fix a typo
+
+ glib/demo/utils.c |   2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit a3c9c6d0c0ee55dccd2d03f20d5683ae300cdc6b
+Author: Pino Toscano <pino@kde.org>
+Date:  Wed Jul 8 02:01:39 2009 +0200
+
+    start updating the TODO file
+
+    TODO file had quite some rust and dust in it, making quite "difficult"
+    for others to understand what can be done for helping.
+    First step has been removing all the items done.
+    Next is grouping items by areas, so it is more clear what should be
+    done in what area; current areas are:
+    - general items: for general stuff to be done, not specific to some
+    area; an example could have been "use littlecms for color management?"
+    - core: stuff which is specific to the core library
+    - Qt4/Qt/glib/etc frontend: stuff specific for that frontend
+    - new frontends: ideas for possible new frontends
+
+    I was not sure about some items and Jeff Muizelaar's TODO, so I left
+    them there.
+
+ TODO |   47 +++++++++++++++--------------------------------
+ 1 file changed, 15 insertions(+), 32 deletions(-)
+
+commit 92ad0ef89fe7690d83854b4821178dfdb2e22897
+Author: Pino Toscano <pino@kde.org>
+Date:  Sat Jul 4 00:19:23 2009 +0200
+
+    [Qt4 demo] hopefully fix the page size on zoom change
+
+ qt4/demos/pageview.cpp |    5 +----
+ 1 file changed, 1 insertion(+), 4 deletions(-)
+
+commit 97094d13bc0f144b25e13c1de7a5328608ab13e3
+Author: Pino Toscano <pino@kde.org>
+Date:  Sat Jul 4 00:07:12 2009 +0200
+
+    [Qt4 demo] show a list of checked/unchecked items for the document
+    permissions
+
+ qt4/demos/permissions.cpp |   25 ++++++++-----------------
+ qt4/demos/permissions.h   |   6 +++---
+ 2 files changed, 11 insertions(+), 20 deletions(-)
+
+commit 0d8f2ee0f03a14e7b8477c4b787c3441a758f26b
+Author: Pino Toscano <pino@kde.org>
+Date:  Fri Jul 3 23:55:42 2009 +0200
+
+    [Qt4 demo] show page numbers in the toolbar as 1..n
+
+ qt4/demos/navigationtoolbar.cpp |    2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit b0d48df9121c55f8162ddf0ee63832f9adebf37b
+Author: Pino Toscano <pino@kde.org>
+Date:  Fri Jul 3 17:55:31 2009 +0200
+
+    [Qt4 demo] correctly use DPI values for the page sizes
+
+ qt4/demos/pageview.cpp |   12 +++++++++---
+ qt4/demos/pageview.h  |    2 ++
+ 2 files changed, 11 insertions(+), 3 deletions(-)
+
+commit dcc3c384919f1562b8f312ad3ac847e23f3e83ab
+Author: Sebastien Bacher <seb128@ubuntu.com>
+Date:  Wed Jul 1 10:09:12 2009 +0200
+
+    [test] Use gtkbuilder rather than libglade
+
+    Fixes bug #21673
+
+ cmake/modules/FindGTK.cmake |   1 -
+ configure.ac               |    4 +-
+ test/Makefile.am           |    2 +-
+ test/pdf-inspector.cc      |   34 ++--
+ test/pdf-inspector.glade    | 434
+ -------------------------------------------
+ test/pdf-inspector.ui      |  416
+ +++++++++++++++++++++++++++++++++++++++++
+ 6 files changed, 439 insertions(+), 452 deletions(-)
+
+commit 28208d1c9b8afbb769a5f4d9b0655b99fd4af16e
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Wed Jul 1 09:52:12 2009 +0200
+
+    [glib-demo] Do not use gio if glib < 2.15
+
+    Fixes bug #22530.
+
+ glib/demo/main.c |   33 +++++++++++++++++++++++++++++++--
+ 1 file changed, 31 insertions(+), 2 deletions(-)
+
+commit 6ef83414ab55294cf46b6b05813927bb04066986
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Tue Jun 30 23:07:00 2009 +0200
+
+    Check getFileSpecNameForPlatform succeeded before using it's return
+    value
+
+    Fixes crash on bug 22551
+
+ poppler/Annot.cc |    7 ++++---
+ poppler/Link.cc  |   30 +++++++++++++++++-------------
+ poppler/Sound.cc |    8 +++++---
+ 3 files changed, 26 insertions(+), 19 deletions(-)
+
+commit 4b9db83841a8b97df1e0991c1b853897b7095777
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Tue Jun 30 11:24:29 2009 +0200
+
+    [glib-demo] Do not fill the surface before rendering
+
+    The surface is guaranteed to be cleared
+
+ glib/demo/render.c |  11 ++---------
+ 1 file changed, 2 insertions(+), 9 deletions(-)
+
+commit 5deb6db5d340c08f337d2ba67aa1fd690e4eedd8
+Author: William Bader <williambader@hotmail.com>
+Date:  Mon Jun 29 21:55:49 2009 +0200
+
+    Fix interpolate parameter position
+
+ poppler/SplashOutputDev.cc |   3 ++-
+ utils/ImageOutputDev.cc    |   5 +++--
+ 2 files changed, 5 insertions(+), 3 deletions(-)
+
+commit e1e9ae2826eff1665d798b4b50b5c63e8282246b
+Author: Pino Toscano <pino@kde.org>
+Date:  Sun Jun 28 20:11:42 2009 +0200
+
+    [Qt4 demo] do not crash when changing the zoom with no document
+
+ qt4/demos/pageview.cpp |    3 +++
+ 1 file changed, 3 insertions(+)
+
+commit a98de97137cb343182bd03c443fc08ff4e0fd9a5
+Author: Pino Toscano <pino@kde.org>
+Date:  Sun Jun 28 19:08:02 2009 +0200
+
+    [Qt4 demo] add a zoom combobox
+
+ qt4/demos/navigationtoolbar.cpp |   33 ++++++++++++++++++++++++++++++++-
+ qt4/demos/navigationtoolbar.h  |    7 ++++++-
+ qt4/demos/pageview.cpp                 |   14 ++++++++++++--
+ qt4/demos/pageview.h           |    6 +++++-
+ qt4/demos/viewer.cpp           |    2 ++
+ 5 files changed, 57 insertions(+), 5 deletions(-)
+
+commit 40002d2c765398869a3b7d8d92715f0608e39ab3
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Sun Jun 28 16:45:19 2009 +0200
+
+    Make sure the array is big enough to read from it
+
+ poppler/Gfx.cc |    2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 0a1b41ff6de5a41e3450ecbcb1ba754dc06c29d9
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Fri Jun 26 19:31:22 2009 +0200
+
+    Do not crash when we can't find onStr
+
+    Fixes crash in bug #22485
+    Not sure this is the best solution, but Adobe doesn't even open
+    the file
+
+ poppler/Form.cc |    1 +
+ 1 file changed, 1 insertion(+)
+
+commit 6cb846664e57b02c99f1e6ad2b4e9128c9622e0a
+Author: Ilya Gorenbein <igorenbein@finjan.com>
+Date:  Thu Jun 25 20:13:29 2009 +0200
+
+    Initilize AnnotColot properly when the Array is not correct
+
+ poppler/Annot.cc |    3 +++
+ 1 file changed, 3 insertions(+)
+
+commit 5fdc3acb8dded2e7d08e6ef30f4c5ae1a4a11b5e
+Author: Till Kamppeter <till.kamppeter@gmail.com>
+Date:  Mon Jun 22 21:38:23 2009 +0200
+
+    Only change the page size when it really changes, otherwise duplex
+    commands are lost
+
+ poppler/PSOutputDev.cc |   10 +++++++++-
+ poppler/PSOutputDev.h |    4 ++++
+ 2 files changed, 13 insertions(+), 1 deletion(-)
+
+commit bf69beeb257cfd750c6ddc8b68aeb859b36380b2
+Author: David Benjamin <davidben@mit.edu>
+Date:  Sat Jun 20 23:51:09 2009 +0200
+
+    Make DecryptStream return sane values for getPos()
+
+    Many streams (notably JBIG2Stream) expect wrapped streams to return
+    correct
+    values for getPos(), i.e. increments by 1 when readChar() called, etc.
+    Fixes bug #19706.
+
+ poppler/Decrypt.cc |   8 ++++++++
+ poppler/Decrypt.h  |   3 +++
+ 2 files changed, 11 insertions(+)
+
+commit 5ee4ff2aaf98e2eaa1ec2dc9f7e659b3b01ba7bf
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Sat Jun 20 15:00:16 2009 +0200
+
+    [glib-demo] Allow using relative paths in demo application
+
+ glib/demo/main.c |   17 +++++------------
+ 1 file changed, 5 insertions(+), 12 deletions(-)
+
+commit a568248d3255407fcaa7368c4925c20e95619d20
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Fri Jun 19 21:07:39 2009 +0200
+
+    0.11.1
+
+ CMakeLists.txt   |    2 +-
+ NEWS            |   50
+ ++++++++++++++++++++++++++++++++++++++++++++++++--
+ configure.ac    |    2 +-
+ msvc/config.h   |    6 +++---
+ qt4/src/Doxyfile |    2 +-
+ 5 files changed, 54 insertions(+), 8 deletions(-)
+
+commit ac99e239f2726db32617ff03174a6ce74361ea1b
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Fri Jun 19 21:03:29 2009 +0200
+
+    ship PopplerCache.h
+
+ CMakeLists.txt |    1 +
+ 1 file changed, 1 insertion(+)
+
+commit 84984d2aa25917d68c9971cefe636e626eada13d
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Fri Jun 19 20:54:15 2009 +0200
+
+    Ship PopplerCache.h too
+
+ poppler/Makefile.am |   1 +
+ 1 file changed, 1 insertion(+)
+
+commit 3a52d46e5df8eb926b550d7f7a82f316dbf6808f
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Fri Jun 19 17:45:44 2009 +0200
+
+    [glib-demo] Destroy pattern after using it
+
+ glib/demo/render.c |   1 +
+ 1 file changed, 1 insertion(+)
+
+commit 2e97524e5d82a4c33a4e6410fead444681db6749
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Fri Jun 19 14:20:16 2009 +0200
+
+    [glib-demo] Use a transparent surface and fill it in white after
+    rendering
+
+ glib/demo/render.c |  12 +++++++++---
+ 1 file changed, 9 insertions(+), 3 deletions(-)
+
+commit 009937842d5a8bfc12394e9e3ab71b7c33340a85
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Fri Jun 19 14:10:05 2009 +0200
+
+    [glib-demo] Use cairo_paint instead of rectangle + fill
+
+ glib/demo/render.c |   3 +--
+ 1 file changed, 1 insertion(+), 2 deletions(-)
+
+commit 7248da095f67d57c3999cee7d980e62fd8a7cf49
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Fri Jun 19 09:37:02 2009 +0200
+
+    Use Interpolate flag to decide whether applying image interpolation
+    during rendering
+
+    Fixes bug #9860
+
+ poppler/ArthurOutputDev.cc  |   4 +-
+ poppler/ArthurOutputDev.h   |   5 ++-
+ poppler/CairoOutputDev.cc   |  92
+ +++++++++++++++++++++++++------------------
+ poppler/CairoOutputDev.h    |  48 ++++++++++++----------
+ poppler/Gfx.cc                     |   49 +++++++++++++++++++----
+ poppler/OutputDev.cc       |   17 +++++---
+ poppler/OutputDev.h        |   13 +++---
+ poppler/PSOutputDev.cc      |   8 ++--
+ poppler/PSOutputDev.h      |    8 ++--
+ poppler/PreScanOutputDev.cc |  25 ++++++++++--
+ poppler/PreScanOutputDev.h  |  25 ++++++++++--
+ poppler/SplashOutputDev.cc  |  16 +++++---
+ poppler/SplashOutputDev.h   |  12 ++++--
+ utils/HtmlOutputDev.cc      |  16 ++++----
+ utils/HtmlOutputDev.h      |    7 ++--
+ utils/ImageOutputDev.cc     |  20 +++++-----
+ utils/ImageOutputDev.h      |  12 ++++--
+ 17 files changed, 248 insertions(+), 129 deletions(-)
+
+commit 37e3f877ee725648734ff41e1e83870a210bcbd7
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Fri Jun 19 00:37:21 2009 +0200
+
+    Handle Streams in CMap definitions
+
+    Fixes bug 22334
+
+ poppler/CMap.cc        |   50
+ +++++++++++++++++++++++++++++------------------
+ poppler/CMap.h                 |   17 +++++++++++-----
+ poppler/GfxFont.cc     |   41 ++++++++++++++++++++++++++------------
+ poppler/GlobalParams.cc |    6 +++---
+ poppler/GlobalParams.h  |    5 +++--
+ 5 files changed, 77 insertions(+), 42 deletions(-)
+
+commit 47de8eef46300832556ce5ed869e391e477fd843
+Author: David Benjamin <davidben@mit.edu>
+Date:  Fri Jun 19 00:30:35 2009 +0200
+
+    Fix some bugs in JBIG2Stream handling
+
+    For more info see bug 12014 and [poppler] Bug in JBIG2Stream from
+    08-June-2009
+
+ poppler/JBIG2Stream.cc |   88
+ ++++++++++++++++++++++++++----------------------
+ poppler/JBIG2Stream.h |   15 +++++++++
+ 2 files changed, 63 insertions(+), 40 deletions(-)
+
+commit d30b1013ea3ce45b5ea942fe7357c0fd07ff47f4
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Tue Jun 2 11:44:08 2009 +0200
+
+    Add setOpen() and setIcon() in AnnotText
+
+ poppler/Annot.cc |   25 +++++++++++++++++++++++++
+ poppler/Annot.h  |    3 +++
+ 2 files changed, 28 insertions(+)
+
+commit 287feffc1c1c0aa42a398fc071b489acef9ef22e
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Tue Jun 2 11:26:40 2009 +0200
+
+    Add setLabel() and setPopup() to AnnotMarkup
+
+ poppler/Annot.cc |   36 ++++++++++++++++++++++++++++++++++++
+ poppler/Annot.h  |    4 ++++
+ 2 files changed, 40 insertions(+)
+
+commit 2a938af5624fbc79316dd6bee5e550f2b4270a76
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Tue Jun 2 10:59:44 2009 +0200
+
+    Add setParent() and setOpen() to AnnotPopup
+
+ poppler/Annot.cc |   19 +++++++++++++++++++
+ poppler/Annot.h  |    4 ++++
+ 2 files changed, 23 insertions(+)
+
+commit 0af5464352dfa51f0458c57a3590c847a45964c7
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Tue Jun 2 10:37:49 2009 +0200
+
+    Save parent reference of popup annotations
+
+ poppler/Annot.cc |   16 +++++-----------
+ poppler/Annot.h  |    4 ++--
+ 2 files changed, 7 insertions(+), 13 deletions(-)
+
+commit fc4bc43dcd6f6871a47b9198e8c2571a5d448c3e
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Mon Jun 1 14:52:21 2009 +0200
+
+    Fix a crash in pdf-inspector
+
+ test/pdf-inspector.cc |   11 +++++++++++
+ 1 file changed, 11 insertions(+)
+
+commit 3da7a2657892fde52b62e1f73476cb33d6c75e96
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Fri May 29 13:35:39 2009 +0200
+
+    Add Annot::setColor()
+
+ poppler/Annot.cc |   19 ++++++++++++++++++-
+ poppler/Annot.h  |    6 +++++-
+ 2 files changed, 23 insertions(+), 2 deletions(-)
+
+commit 3eabdf57729852205855cf74ff2d2f9d7bc03f73
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Fri May 29 13:23:26 2009 +0200
+
+    Add construtors to create AnnotColor objects directly from color
+    values
+
+ poppler/Annot.cc |   26 ++++++++++++++++++++++++++
+ poppler/Annot.h  |    3 +++
+ 2 files changed, 29 insertions(+)
+
+commit 8045e7a1a84a3d54a1c9415ac63b5b9df5ecc349
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Fri May 29 13:06:40 2009 +0200
+
+    Add Page::addAnnot() to add a new annotation to the page
+
+ poppler/Page.cc |   28 ++++++++++++++++++++++++++++
+ poppler/Page.h  |    2 ++
+ 2 files changed, 30 insertions(+)
+
+commit fe80eb84ec711b7400cef95e791a74c8fd259af7
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Fri May 29 13:00:19 2009 +0200
+
+    Add getRef() to get the annotation reference
+
+ poppler/Annot.h |    1 +
+ 1 file changed, 1 insertion(+)
+
+commit 1c92657be72c44dba7185808ffb00dd85c5ab289
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Fri May 29 12:14:02 2009 +0200
+
+    Save page object and ref in Page class
+
+    This is needed to be able to modify the page object.
+
+ poppler/Catalog.cc |   2 +-
+ poppler/Page.cc    |   6 +++++-
+ poppler/Page.h     |   4 +++-
+ 3 files changed, 9 insertions(+), 3 deletions(-)
+
+commit 4ad2d663262008e4b97342c4ed67c686ff5abd13
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Fri May 29 11:43:30 2009 +0200
+
+    Add annot constructors to create annot objects without a dict
+
+    This allows to create annotation objects to be added to the document.
+    Required fields on the annotation dictionary are constructor
+    arguments,
+    setters will be added for the other fields.
+
+ poppler/Annot.cc |  300
+ ++++++++++++++++++++++++++++++++++++++++++++++++++++--
+ poppler/Annot.h  |   22 +++-
+ 2 files changed, 315 insertions(+), 7 deletions(-)
+
+commit e5c4862b0c1b08a0fab47070cb9c862026e93567
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Wed Jun 10 23:28:03 2009 +0200
+
+    ignore++
+
+ m4/.gitignore |    5 +++++
+ 1 file changed, 5 insertions(+)
+
+commit 572779f8037763c1e0ee64c47a3dad6df0d3b693
+Author: Koji Otani <sho@bbr.jp>
+Date:  Wed Jun 10 22:55:26 2009 +0200
+
+    Fix dashed line in page 1 of bug 20011
+
+ poppler/Gfx.cc |    6 ++----
+ 1 file changed, 2 insertions(+), 4 deletions(-)
+
+commit b97591672e0d9c31a3d044fe52e34cc80a491221
+Author: Koji Otani <sho@bbr.jp>
+Date:  Wed Jun 10 22:54:57 2009 +0200
+
+    Fix "Conditional jump or move depends on uninitialised value"
+
+    When stroking with a pattern, set strokeColor with a copy of
+    fillColor.
+    This is wrong and the fillColor may be uninitialized.
+    See bug 20011
+
+ poppler/Gfx.cc |   13 +++++++++++--
+ 1 file changed, 11 insertions(+), 2 deletions(-)
+
+commit a92b38836b1e4475d5a7a1b9cb8f3e9429cef275
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Tue Jun 9 22:39:19 2009 +0200
+
+    Correctly duplicate the cache on PostScriptFunction(PostScriptFunction
+    *func)
+
+ poppler/Function.cc    |   28 ++++++++++++++++++++++++++++
+ poppler/PopplerCache.cc |   20 ++++++++++++++++++++
+ poppler/PopplerCache.h  |   14 ++++++++++++++
+ 3 files changed, 62 insertions(+)
+
+commit 2cecdf922f4c8178b0e55d3ddf86c31f8be3313a
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Tue Jun 9 11:04:39 2009 +0200
+
+    [glib] Fix a crash when a destination points to an invalid page
+
+ glib/poppler-action.cc |   21 +++++++++++++--------
+ 1 file changed, 13 insertions(+), 8 deletions(-)
+
+commit 831288c13c3a7502bbccd1313c6e376283be367c
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Sun Jun 7 18:37:20 2009 +0200
+
+    Optimize roll() a bit
+
+    If the number of times to roll is > than half the number of items
+    rotate in the reverse direction
+    Makes it be 33% of exec() instead of 42%
+
+ poppler/Function.cc |  19 ++++++++++++++-----
+ 1 file changed, 14 insertions(+), 5 deletions(-)
+
+commit 3d40dcad850a2bc0e28845a15722db0c79920135
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Sun Jun 7 13:38:50 2009 +0200
+
+    Move the GfxState cache to the new poppler cache class
+
+ poppler/GfxState.cc |  97
+ ++++++++++++++++++++++++---------------------------
+ poppler/GfxState.h  |  19 ++--------
+ 2 files changed, 49 insertions(+), 67 deletions(-)
+
+commit 2619e09833f421fb3d8cc68d41d15081ae6824e4
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Sun Jun 7 13:37:40 2009 +0200
+
+    Implement a cache for PostscriptFunction transforms
+
+    Makes time of rendering of bug 21562 go down from 24 to 8 seconds
+
+ poppler/Function.cc |  76
+ +++++++++++++++++++++++++++++++++++++++++++++++++++
+ poppler/Function.h  |   2 ++
+ 2 files changed, 78 insertions(+)
+
+commit 588bfe3c14f42be492066c2a98e30482475a6926
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Sun Jun 7 13:36:39 2009 +0200
+
+    Add a code to a generic cache based on Koji's code for GfxState cache
+
+ CMakeLists.txt                 |    1 +
+ poppler/Makefile.am    |    1 +
+ poppler/PopplerCache.cc |   82
+ +++++++++++++++++++++++++++++++++++++++++++++++
+ poppler/PopplerCache.h  |   47 +++++++++++++++++++++++++++
+ 4 files changed, 131 insertions(+)
+
+commit d09478fcc44b5c594f1803fc24654af5e10fa129
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Sun Jun 7 01:34:01 2009 +0200
+
+    Move index and pop to class definition too
+
+ poppler/Function.cc |  32 +++++++++++++++-----------------
+ 1 file changed, 15 insertions(+), 17 deletions(-)
+
+commit 2083264e8ab0fd9976294de08a18de615d5a1168
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Sun Jun 7 01:21:19 2009 +0200
+
+    Move the implementations to the class definition
+
+    Make gcc inline the functions and time to render a heavy PSFunction
+    doc goes from 28 to 20 secs
+
+ poppler/Function.cc | 151
+ ++++++++++++++++++++++++---------------------------
+ 1 file changed, 71 insertions(+), 80 deletions(-)
+
+commit 24580fcd2be74db5f3140bdb2ebff8431b7d3f1e
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Sat Jun 6 16:17:26 2009 +0200
+
+    Add a debug saying how much rendering took
+
+ qt4/tests/test-poppler-qt4.cpp |    2 ++
+ 1 file changed, 2 insertions(+)
+
+commit 50cf7cffff760e41774957ad8f1f92803142438e
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Sat Jun 6 16:04:54 2009 +0200
+
+    Use g_path_get_basename instead of g_basename in gtk-cairo-test
+
+    Fixes bug #21361.
+
+ test/gtk-cairo-test.cc |    4 +++-
+ 1 file changed, 3 insertions(+), 1 deletion(-)
+
+commit 4cc9dee35e03d7b295a476f937ec0f2c43bb6592
+Author: Christian Persch <chpe@gnome.org>
+Date:  Sat Jun 6 12:13:48 2009 +0200
+
+    Remove unneeded files from repo
+
+    See bug #22094
+
+ configure.ac              |    2 +-
+ glib/reference/Makefile.am |   4 +-
+ gtk-doc.make              |  155
+ --------------------------------------------
+ m4/gtk-doc.m4             |   53 ---------------
+ 4 files changed, 3 insertions(+), 211 deletions(-)
+
+commit c94e476dbff9e527c72e52377d830f35f29ba3d6
+Author: Pino Toscano <pino@kde.org>
+Date:  Fri Jun 5 11:09:44 2009 +0200
+
+    when showing the tooltip for a text rect, show also its index in
+    the page text boxes list
+
+ qt4/tests/test-poppler-qt4.cpp |    6 +++++-
+ 1 file changed, 5 insertions(+), 1 deletion(-)
+
+commit 2298acac267257b1916c802bdb902428e69e683b
+Author: Pino Toscano <pino@kde.org>
+Date:  Fri Jun 5 11:08:51 2009 +0200
+
+    [Qt4 apidox] FontInterator is new in 0.12
+
+ qt4/src/poppler-qt4.h |    2 ++
+ 1 file changed, 2 insertions(+)
+
+commit 37c48c2521c623c485841472c4a174a1841aea33
+Author: Pino Toscano <pino@kde.org>
+Date:  Fri Jun 5 10:54:30 2009 +0200
+
+    [CMake] Add poppler version defines and version check macro
+
+    Add POPPLER_[MAJOR|MINOR|MICRO]_VERSION defines and
+    POPPLER_CHECK_VERSION macro. FDO bug #22091.
+
+ CMakeLists.txt                       |    5 ++++-
+ glib/poppler-features.h.cmake |    9 +++++++++
+ 2 files changed, 13 insertions(+), 1 deletion(-)
+
+commit 26f6fb1d79c2589829cd896d57da63d16641f307
+Author: Pino Toscano <pino@kde.org>
+Date:  Fri Jun 5 10:51:26 2009 +0200
+
+    [CMake] switch poppler-features.h.cmake to a more autotools-like
+    syntax
+
+ glib/CMakeLists.txt          |    2 +-
+ glib/poppler-features.h.cmake |    2 +-
+ 2 files changed, 2 insertions(+), 2 deletions(-)
+
+commit 89704635b727db42f6c72ba101091eb7eddb967a
+Author: Pino Toscano <pino@kde.org>
+Date:  Fri Jun 5 10:39:17 2009 +0200
+
+    [Qt4 demo] compile the new thumbnail module with autotools as well
+
+ qt4/demos/Makefile.am |    3 +++
+ 1 file changed, 3 insertions(+)
+
+commit 291bafe64c8755fe5f85a51b184ac6e3d3170e1d
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Fri Jun 5 10:07:16 2009 +0200
+
+    [glib] Use g_strerror instead of strerror
+
+    Fixes bug #22095.
+
+ glib/poppler-document.cc |    2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 0ca7e214fb5f9c9fb59792149bd23c1617d38cac
+Author: Christian Persch <chpe@gnome.org>
+Date:  Thu Jun 4 22:35:40 2009 +0200
+
+    Add poppler version defines and version check macro
+
+    Add POPPLER_[MAJOR|MINOR|MICRO]_VERSION defines and
+    POPPLER_CHECK_VERSION macro. FDO bug #22091.
+
+ configure.ac                             |   11 +++-
+ glib/poppler-features.h.in               |    9 ++++
+ glib/reference/poppler-docs.sgml         |    1 +
+ glib/reference/poppler-sections.txt      |   10 ++++
+ glib/reference/tmpl/poppler-features.sgml |   80
+ +++++++++++++++++++++++++++++
+ 5 files changed, 110 insertions(+), 1 deletion(-)
+
+commit 4ce04da0040e5a2626c110f94a128e2d272401b9
+Author: Matthias Drochner <M.Drochner@fz-juelich.de>
+Date:  Thu Jun 4 23:05:22 2009 +0200
+
+    Use the correct value when creating the V field
+
+    PDF Spec says:
+    For items represented in the Opt array by a two-element array,
+    the name string is the second of the two array elements.
+
+ poppler/Form.cc |    5 +++--
+ 1 file changed, 3 insertions(+), 2 deletions(-)
+
+commit 7e01e37a834bfdd75d739ea2b48e9127ca7f259e
+Author: Till Kamppeter <till.kamppeter@gmail.com>
+Date:  Thu Jun 4 20:25:55 2009 +0200
+
+    Add part of fix for bug 20420, the other part was checked in with
+    Thomas patches
+
+ poppler/PSOutputDev.cc |    3 +++
+ 1 file changed, 3 insertions(+)
+
+commit 50a7b4bcaa6e5f56cc25fe6936f9dc537a1b4b37
+Author: Jeremy C. Reed <reed@reedmedia.net>
+Date:  Thu Jun 4 20:19:03 2009 +0200
+
+    [glib] Hyphenate UTF-8 and UTF-16BE
+
+    Fixes bug #21953.
+
+    where iconv() is called to fill in a text field, use "UTF-8" and
+    "UTF-16BE" as encoding names rather than the less portable
+    "UTF8" and "UTF16BE" -- this makes it work on NetBSD.
+
+ glib/poppler-annot.cc     |    2 +-
+ glib/poppler-form-field.cc |   4 ++--
+ 2 files changed, 3 insertions(+), 3 deletions(-)
+
+commit 2cf9e6a2318b770ae62572944c687576d1801d31
+Author: Till Kamppeter <till.kamppeter@gmail.com>
+Date:  Thu Jun 4 19:48:42 2009 +0200
+
+    Support multiple page sizes when converting to PS
+
+    Fixes byg #19777
+
+ poppler/PSOutputDev.cc |   31 +++++++++++++++++++++++++++++--
+ poppler/PSOutputDev.h |    4 +++-
+ utils/pdftops.1       |   26 +++++++++++++++++++++-----
+ utils/pdftops.cc      |   17 ++++++++++++-----
+ 4 files changed, 65 insertions(+), 13 deletions(-)
+
+commit 30fb7cb7e47cf6a8008c5083c8d0978fdfdf8e62
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Thu Jun 4 19:25:22 2009 +0200
+
+    Add missing { }
+
+ poppler/Gfx.cc |    4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 1beec21ed3a016998fee3849d460166895db9047
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Wed Jun 3 22:37:43 2009 +0200
+
+    Give an error when using level1sep without having CMYK support
+
+    Fixes bug #22026
+
+ poppler/PSOutputDev.cc |    4 ++++
+ 1 file changed, 4 insertions(+)
+
+commit e80d645c34c7d44d1f35da0a25669d1c4cde6e7f
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Wed Jun 3 22:00:49 2009 +0200
+
+    Also accept tokens with to leading 00
+
+    Fixes bug 22025, based on a patch by William Bader
+
+ poppler/CharCodeToUnicode.cc |    9 ++++++---
+ 1 file changed, 6 insertions(+), 3 deletions(-)
+
+commit e521c1efaeba3f35d10e46bca3d9650dabd2d889
+Author: Adrian Johnson <ajohnson@redneon.com>
+Date:  Wed Jun 3 22:08:57 2009 +0930
+
+    Implement text in pattern colorspace for the cairo backend
+
+ poppler/CairoOutputDev.cc |   47
+ +++++++++++++++++++++++++++++++++++++++++++++
+ poppler/CairoOutputDev.h  |   19 ++++++++++++++++++
+ 2 files changed, 66 insertions(+)
+
+commit a87978b09a026b2db6b0f80271d87b44b336a121
+Author: Pino Toscano <pino@kde.org>
+Date:  Wed Jun 3 13:49:56 2009 +0200
+
+    [Qt4 demo] show the checksum for embedded files
+
+ qt4/demos/embeddedfiles.cpp |   4 +++-
+ 1 file changed, 3 insertions(+), 1 deletion(-)
+
+commit db5102842494a124d813db1696bb60820db3442b
+Author: Pino Toscano <pino@kde.org>
+Date:  Wed Jun 3 13:21:22 2009 +0200
+
+    [Qt4 demo] remove checks for Qt >= 4.2
+
+    poppler-qt4 requires Qt 4.3, so checking for 4.2 is no more needed
+
+ qt4/demos/embeddedfiles.cpp |   2 --
+ qt4/demos/fonts.cpp        |    2 --
+ qt4/demos/info.cpp         |    2 --
+ qt4/demos/optcontent.cpp    |   2 --
+ qt4/demos/permissions.cpp   |   2 --
+ qt4/demos/toc.cpp          |    2 --
+ 6 files changed, 12 deletions(-)
+
+commit e8d897581656ee4a20e9bb87dd999425663ace3b
+Author: Pino Toscano <pino@kde.org>
+Date:  Wed Jun 3 02:54:29 2009 +0200
+
+    [Qt4 demo] simplier way to change page from the thumbnail view
+
+ qt4/demos/pageview.cpp   |    5 -----
+ qt4/demos/pageview.h    |    3 ---
+ qt4/demos/thumbnails.cpp |    2 +-
+ qt4/demos/thumbnails.h   |    3 ---
+ qt4/demos/viewer.cpp    |    1 -
+ 5 files changed, 1 insertion(+), 13 deletions(-)
+
+commit f69a4fe47d3478cccbc03e4ac0929c7eada681c0
+Author: Pino Toscano <pino@kde.org>
+Date:  Wed Jun 3 01:24:21 2009 +0200
+
+    [Qt4 demo] Add a thumbnail dock widget
+
+    Useful to show the embedded page thumbnails in the document, if any.
+    Based on a patch by Shawn Rutledge <shawn.t.rutledge@gmail.com>,
+    reworked by me to be a QListWidget showing the page items at their
+    full size.
+
+ qt4/demos/CMakeLists.txt |    1 +
+ qt4/demos/thumbnails.cpp |   84
+ ++++++++++++++++++++++++++++++++++++++++++++++
+ qt4/demos/thumbnails.h   |   51 ++++++++++++++++++++++++++++
+ qt4/demos/viewer.cpp    |   11 +++++-
+ 4 files changed, 146 insertions(+), 1 deletion(-)
+
+commit 2f24ac0f4bbd6de1c9f137110b3ac2bd3b23b0b9
+Author: Shawn Rutledge <shawn.t.rutledge@gmail.com>
+Date:  Wed Jun 3 01:22:31 2009 +0200
+
+    [Qt4 demo] add a public slot to set the current page
+
+ qt4/demos/pageview.cpp |    5 +++++
+ qt4/demos/pageview.h  |    3 +++
+ 2 files changed, 8 insertions(+)
+
+commit 1f1baf186f9e37606765e51ec5b9893ddfbfa893
+Author: Shawn Rutledge <shawn.t.rutledge@gmail.com>
+Date:  Wed Jun 3 01:19:16 2009 +0200
+
+    [Qt4] Add Page::thumbnail()
+
+    This function can be used to get the embedded thumbnail of the page,
+    present in the document.
+    Reindented by me, and avoid a memory leak because of non-freed data.
+
+ qt4/src/poppler-page.cc |   21 ++++++++++++++++++++-
+ qt4/src/poppler-qt4.h  |   11 +++++++++++
+ 2 files changed, 31 insertions(+), 1 deletion(-)
+
+commit 5cc24be1e9af0a27ab88ffa719bcabc2378868e4
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Wed Jun 3 00:05:54 2009 +0200
+
+    Remove unused variables
+
+ poppler/SplashOutputDev.cc |   3 ---
+ 1 file changed, 3 deletions(-)
+
+commit 45823bf8f4abacbbf257f6708264de074eda3cf4
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Wed Jun 3 00:02:54 2009 +0200
+
+    Make it compile :-/
+
+ poppler/SplashOutputDev.cc |   8 ++++++--
+ 1 file changed, 6 insertions(+), 2 deletions(-)
+
+commit f5ae14907261a46c121f3ed7aea9d7ad9b9c55de
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Tue Jun 2 23:52:59 2009 +0200
+
+    Really fix the typo
+
+ README |    2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 5d4b1995cdd57db7cef3d88704850aaf66ed7fff
+Author: William Bader <williambader@hotmail.com>
+Date:  Tue Jun 2 23:10:53 2009 +0200
+
+    Fix three typos in README
+
+ README |    6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
+
+commit 104f9286ceb5fcb5f4795bca7633029142d5f6a4
+Author: Thomas Freitag <Thomas.Freitag@alfa.de>
+Date:  Tue Jun 2 22:59:42 2009 +0200
+
+    Support colorizing text in pattern colorspace
+
+    This implements commits the final patches for bug 19670 and 19994
+    Also fixes bugs 15819 and 2807
+    Also implements blending for SPLASH_CMYK in Splash
+    It's a quite big change but i've done regression testing over my whole
+    pdf suite and did not fit anything that went worse, just improvements
+    Missing the Cairo support
+
+ CMakeLists.txt                    |    1 +
+ poppler/Gfx.cc                    |  135 ++++++++++++---
+ poppler/Gfx.h             |    7 +
+ poppler/GfxState.cc       |   58 +------
+ poppler/GfxState_helpers.h |  80 +++++++++
+ poppler/Makefile.am       |    1 +
+ poppler/OutputDev.h       |   14 ++
+ poppler/PSOutputDev.cc     |  285 ++++++++++++++++++-------------
+ poppler/PSOutputDev.h     |   18 ++
+ poppler/SplashOutputDev.cc |  404
+ +++++++++++++++++++++++++++++++++++++-------
+ poppler/SplashOutputDev.h  |  19 +++
+ 11 files changed, 766 insertions(+), 256 deletions(-)
+
+commit d3e4563146cbff4cb507522783e60462461c7524
+Author: Thomas Freitag <Thomas.Freitag@alfa.de>
+Date:  Sun May 31 23:23:07 2009 +0200
+
+    Set memory to 0 after allocation, fixes problems on Sun machines,
+    should not hurt for others
+
+ poppler/GfxState.cc |   5 +++++
+ 1 file changed, 5 insertions(+)
+
+commit 78a58931b4347ecb505bad5a51104382ef5f91c7
+Author: Thomas Freitag <Thomas.Freitag@alfa.de>
+Date:  Sun May 31 22:52:23 2009 +0200
+
+    Add splashClearColor that assigns white to the given colorptr
+
+ splash/SplashTypes.h |   10 ++++++++++
+ 1 file changed, 10 insertions(+)
+
+commit 47c26747b32c242ec8ac60e7b93150a67eb22e31
+Author: Thomas Freitag <Thomas.Freitag@alfa.de>
+Date:  Sun May 31 22:51:22 2009 +0200
+
+    Fix splashColorModeNComps to correctly include all values for each
+    SplashColorMode
+
+ splash/SplashState.cc |   17 +++++++++++++++++
+ 1 file changed, 17 insertions(+)
+
+commit 41775d8c0b44bf591d8ff5ede7fad276e8fa9eef
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Mon Jun 1 15:24:24 2009 +0200
+
+    [glib-demo] Use poppler_annot_markup_has_popup()
+
+ glib/demo/annots.c |   7 ++++---
+ 1 file changed, 4 insertions(+), 3 deletions(-)
+
+commit f542c5294394e837298cb7e7d1d94bb336bfd09d
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Mon Jun 1 15:24:04 2009 +0200
+
+    [glib] Add poppler_annot_markup_has_popup()
+
+ glib/poppler-annot.cc |   20 ++++++++++++++++++++
+ glib/poppler-annot.h  |    1 +
+ 2 files changed, 21 insertions(+)
+
+commit af32d56af779edcc539b680e634755941d1bf45c
+Author: Petr Gajdos <pgajdos@novell.com>
+Date:  Thu May 21 00:37:18 2009 +0200
+
+    Add the possibility of forcing no hinting of fonts
+
+ poppler/ArthurOutputDev.cc   |    2 ++
+ poppler/GlobalParams.cc      |   20 +++++++++++
+ poppler/GlobalParams.h       |    4 +++
+ poppler/SplashOutputDev.cc   |    2 ++
+ splash/SplashFTFont.cc       |   76
+ ++++++++++++++++++++++++++----------------
+ splash/SplashFTFont.h       |    2 ++
+ splash/SplashFTFontEngine.cc |    8 +++--
+ splash/SplashFTFontEngine.h  |    6 ++--
+ splash/SplashFontEngine.cc   |    4 ++-
+ splash/SplashFontEngine.h    |    2 ++
+ 10 files changed, 91 insertions(+), 35 deletions(-)
+
+commit 1a69d9638214943b3c2278f570694d9722a5de15
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Wed May 20 23:58:44 2009 +0200
+
+    Do not create the GfxColorTransform if the lcms could not be created
+
+    Fixes crash on pdf from bug 20108
+
+ poppler/GfxState.cc |   8 ++++++--
+ 1 file changed, 6 insertions(+), 2 deletions(-)
+
+commit 95246d39c1289111a4ba3eb2ffbec50d7702e5eb
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Wed May 20 23:20:20 2009 +0200
+
+    Check Mask entries are int before using them, also if they are real
+    cast to int and try to use them
+
+    Fixes bug #21841
+
+ poppler/Gfx.cc |   11 ++++++++++-
+ 1 file changed, 10 insertions(+), 1 deletion(-)
+
+commit 0c3517bfb4e1e1a28962f8d490ad69ec5766b6a1
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Wed May 20 23:08:41 2009 +0200
+
+    Fix pdftops crash on file from KDE bug 174899
+
+    Still does not generate a correct ps file, but at least the program
+    does not crash now
+
+ fofi/FoFiTrueType.cc |    5 ++++-
+ 1 file changed, 4 insertions(+), 1 deletion(-)
+
+commit 548c72600b8a5e076647041660ed5031feedc7cc
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Wed May 20 22:43:11 2009 +0200
+
+    Do not exit(1) on a pdf i have lying around
+
+    PDF is 0f03b3539a436a9f18d7e4e29d410f89  6607907.pdf
+
+ poppler/JBIG2Stream.cc |    8 +++++++-
+ 1 file changed, 7 insertions(+), 1 deletion(-)
+
+commit f78d3a7ff5ef4b500d76d84ebc45aac3be162dab
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Mon May 18 20:44:40 2009 +0200
+
+    Move lcms.h include to GfxState.cc, replace lcms typedefs by void *
+
+ poppler/GfxState.cc |  70
+ ++++++++++++++++++++++++++++++++++++++++++++-------
+ poppler/GfxState.h  |  64 +++++++++++-----------------------------------
+ 2 files changed, 75 insertions(+), 59 deletions(-)
+
+commit ec2467f9981b7e7c23d5dcd8eabf2e7c8cdf8930
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Sun May 17 20:00:53 2009 +0200
+
+    Use the lcms include dir
+
+ CMakeLists.txt      |   3 +++
+ poppler/Makefile.am |   2 ++
+ 2 files changed, 5 insertions(+)
+
+commit e0fcf7055af480498a81a000dcd9f977a783df66
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Sun May 17 12:07:05 2009 +0200
+
+    Use pkgconfig for autotools cms check
+
+ configure.ac       |   12 +++++++-----
+ poppler/Makefile.am |   2 +-
+ 2 files changed, 8 insertions(+), 6 deletions(-)
+
+commit 657734c19274ab281328cba9297eca45e48777aa
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Sun May 17 12:06:47 2009 +0200
+
+    Better lcms check comming from kdelibs
+
+ cmake/modules/FindLCMS.cmake |   95
+ +++++++++++++++++++++++++++++++-----------
+ 1 file changed, 71 insertions(+), 24 deletions(-)
+
+commit 0974b7b4bfe3f8cf3a1408741ddf01c667c28044
+Author: Patrick Spendrin <ps_ml@gmx.de>
+Date:  Thu May 14 16:15:22 2009 +0200
+
+    [Win32] Build fix for MSVC.
+
+ poppler-config.h.cmake      |   2 +-
+ poppler/poppler-config.h.in |   2 +-
+ 2 files changed, 2 insertions(+), 2 deletions(-)
+
+commit d1c0e8a6c63361304cd453bb4c51e84a1aab7efa
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Thu May 14 00:29:18 2009 +0200
+
+    Kill support for specifying extension in openTmpFile
+
+    We don't use it and it would not work anyway, see bug #21713
+
+ goo/gfile.cc                |   58
+ ++++++++++--------------------------------
+ goo/gfile.h                 |    3 ++-
+ poppler/CairoFontEngine.cc   |    6 ++---
+ splash/SplashFTFontEngine.cc |    3 ++-
+ splash/SplashT1FontEngine.cc |    3 ++-
+ splash/SplashT1FontFile.cc   |    3 ++-
+ 6 files changed, 24 insertions(+), 52 deletions(-)
+
+commit e237d8b5c2ae8805487a0790d9fb218263686712
+Author: Pino Toscano <pino@kde.org>
+Date:  Wed May 13 18:37:07 2009 +0200
+
+    [Qt4] we don't need an output device anymore (since long, even)
+    for resolving destinations
+
+ qt4/src/poppler-document.cc |   3 ---
+ 1 file changed, 3 deletions(-)
+
+commit 9a2a851da93ef1a0c291fc9523a468e808ffd08e
+Author: Pino Toscano <pino@kde.org>
+Date:  Wed May 13 18:19:11 2009 +0200
+
+    [Qt4] Do not try to resolve named destinations for GoTo links pointing
+    to external documents.
+
+    In such cases, the named destination is a destination in the external
+    document, so we would try to look up a destination which is not in
+    the current document (thus the look up is unuseful).
+    It is task of the users of poppler-qt4 detect such
+    situations, and resolve the named when necessary, using
+    Document::linkDestination(QString).
+
+ qt4/src/poppler-document.cc |   2 +-
+ qt4/src/poppler-link.cc     |   2 +-
+ qt4/src/poppler-page.cc     |   6 ++++--
+ qt4/src/poppler-private.cc  |   4 ++--
+ qt4/src/poppler-private.h   |   5 +++--
+ 5 files changed, 11 insertions(+), 8 deletions(-)
+
+commit 51f6cc26fc5fdccce1ba4d4816dec374ce85d67a
+Author: Pino Toscano <pino@kde.org>
+Date:  Wed May 13 17:38:00 2009 +0200
+
+    [Qt4] start a (basic) unit test for links & destinations
+
+ qt4/tests/CMakeLists.txt  |   1 +
+ qt4/tests/Makefile.am    |    5 +++
+ qt4/tests/check_links.cpp |   96
+ +++++++++++++++++++++++++++++++++++++++++++++
+ 3 files changed, 102 insertions(+)
+
+commit 174f8087f5e09c5d1915de128b7a15acf47c1e13
+Author: Pino Toscano <pino@kde.org>
+Date:  Wed May 13 16:44:59 2009 +0200
+
+    [Qt4] set the destination name only when it is not resolved
+
+ qt4/src/poppler-link.cc |    9 +++++----
+ 1 file changed, 5 insertions(+), 4 deletions(-)
+
+commit fb0cb2add9443992f166acdf744fbec875faaabf
+Author: Pino Toscano <pino@kde.org>
+Date:  Tue May 12 01:53:43 2009 +0200
+
+    [Qt4] Add LinkDestination::destinationName() that returns the name
+    of the current destination.
+
+ qt4/src/poppler-link.cc |   10 ++++++++++
+ qt4/src/poppler-link.h  |    7 +++++++
+ 2 files changed, 17 insertions(+)
+
+commit b8bd44f1302f7b6a6923d41c98ec74c118a5abb8
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Mon May 11 20:49:34 2009 +0200
+
+    Poppler 0.11.0 aka 0.12 Alpha 1
+
+ CMakeLists.txt      |   4 +-
+ NEWS               |  142
+ +++++++++++++++++++++++++++++++++++++++++++++++++++
+ configure.ac       |    2 +-
+ msvc/config.h      |    6 +--
+ poppler/Makefile.am |   2 +-
+ qt4/src/Doxyfile    |   2 +-
+ 6 files changed, 150 insertions(+), 8 deletions(-)
+
+commit 79bcedd5602729b959f21aed222445de621e7ecb
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Mon May 11 19:59:57 2009 +0200
+
+    Update copyright headers for previous patches
+
+ poppler/ArthurOutputDev.cc |   1 +
+ poppler/CairoOutputDev.cc  |   2 +-
+ poppler/Page.cc           |    2 +-
+ poppler/Stream.cc         |    1 +
+ poppler/Stream.h          |    1 +
+ utils/HtmlOutputDev.cc     |   1 +
+ utils/ImageOutputDev.cc    |   1 +
+ 7 files changed, 7 insertions(+), 2 deletions(-)
+
+commit f16e36df3a74e1adf14513a6340be2e8665f8d65
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Sun May 10 19:24:32 2009 +0200
+
+    Don't include popups annots with a parent in annots list
+
+ poppler/Annot.cc |   13 +++++++++++++
+ 1 file changed, 13 insertions(+)
+
+commit 5051ebed1477ff3f7721606f79d66d56a80c1145
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Sun May 10 19:10:51 2009 +0200
+
+    Make sure ImageStream::close() is called after ImageStream::reset()
+
+ poppler/ArthurOutputDev.cc |   1 +
+ poppler/CairoOutputDev.cc  |  20 +++++++++++++++++---
+ poppler/Page.cc           |    1 +
+ poppler/Stream.cc         |    4 ++++
+ poppler/Stream.h          |    3 +++
+ utils/HtmlOutputDev.cc     |   1 +
+ utils/ImageOutputDev.cc    |   1 +
+ 7 files changed, 28 insertions(+), 3 deletions(-)
+
+commit 829ed964374676ddfa4a9048c940dc20a309ca47
+Author: M Joonas Pihlaja <jpihlaja@cc.helsinki.fi>
+Date:  Sun May 10 23:39:11 2009 +0200
+
+    Fix axial shading fix to ensure the painting passes by the four
+    edges of the bbox
+
+    When j and teoricalj are the same, just change the value of ta[]
+    not the next[] ones
+
+ poppler/Gfx.cc |   23 ++++++++++++++++-------
+ 1 file changed, 16 insertions(+), 7 deletions(-)
+
+commit 68d9644499676ed1553b2bfcdbfc9a5677c75345
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Sat May 9 22:25:12 2009 +0200
+
+    Hidden property depends on parent being hidden, not only yourself
+
+    Fixes bug #16093
+
+ poppler/Gfx.cc |    8 +++++++-
+ 1 file changed, 7 insertions(+), 1 deletion(-)
+
+commit 810a71ea66f0e07d9849a5e9bf28911472482d1b
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Fri May 8 09:36:31 2009 +0200
+
+    [glib] Add poppler_annot_markup_get_popup_rectangle
+
+ glib/demo/annots.c    |    8 ++++++++
+ glib/poppler-annot.cc |   35 +++++++++++++++++++++++++++++++++++
+ glib/poppler-annot.h  |    2 ++
+ 3 files changed, 45 insertions(+)
+
+commit 5d328282da4713356fbe4283bd992ac2fc9010a2
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Thu May 7 23:11:55 2009 +0200
+
+    bitmap->h can be 0, move to _checkoverflow variant, code already
+    knows how to deal with NULL
+
+ splash/SplashFTFont.cc |    2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 5b0fb6f94d6d54b1b0c97762db61e2ab0dd07c85
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Wed May 6 22:59:55 2009 +0200
+
+    Fix format printing
+
+ poppler/JBIG2Stream.cc |    4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit c21b08a254f42f53d4b59ad4fb308c7c68c32d15
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Wed May 6 15:56:21 2009 +0200
+
+    [glib] Several fixes in poppler_annot_get_color()
+
+    PopplerColor is compatible with GdkColor where every component is
+    in the
+    range of 0 to 65535, we were returning values between 0 and 1 but
+    converted to guint16.
+    We were also showing a warning when AnnotColor::colorTransparent is
+    used, but we decided to return a PopplerColor * to be able to
+    represent
+    transparent color returning NULL, so it's actually supported.
+
+ glib/demo/annots.c    |   25 +++++++++++--------------
+ glib/poppler-annot.cc |   36 +++++++++++++++++++++---------------
+ 2 files changed, 32 insertions(+), 29 deletions(-)
+
+commit 63cc40ec02498e1ec249d5f74e23f574c665872e
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Sat May 2 14:08:23 2009 +0200
+
+    Link pdftoabw to abiword libs
+
+    Fixes bug #21520
+
+ utils/Makefile.am |   22 ++++++++++++----------
+ 1 file changed, 12 insertions(+), 10 deletions(-)
+
+commit 70e06e9ae28d08bb7495a7f2eb03b0b5714a1e54
+Author: Kouhei Sutou <kou@cozmixng.org>
+Date:  Wed Apr 29 09:52:21 2009 +0900
+
+    PopplerAttachment refers its document.
+
+ glib/poppler-attachment.cc |  41
+ +++++++++++++++++++++++++++++++++++------
+ 1 file changed, 35 insertions(+), 6 deletions(-)
+
+commit 977a13f1091700bf7e7b31859e0e6632dc323462
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Sat Apr 25 19:07:01 2009 +0200
+
+    [glib] Only create checksum string for valid checksums
+
+ glib/poppler-attachment.cc |   5 +++--
+ 1 file changed, 3 insertions(+), 2 deletions(-)
+
+commit fb6e7141e3008ae230ae5819e2c7a0425296d8d2
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Fri Apr 24 10:13:53 2009 +0200
+
+    Update copyright headers
+
+ glib/poppler-annot.cc |    1 +
+ glib/poppler-annot.h  |    1 +
+ poppler/Annot.cc      |    2 +-
+ poppler/Annot.h       |    2 +-
+ poppler/DateInfo.cc   |    1 +
+ poppler/DateInfo.h    |    1 +
+ 6 files changed, 6 insertions(+), 2 deletions(-)
+
+commit fc7e52fef0317f9c85ead2c4f8a0e9b688decca3
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Fri Apr 24 09:53:41 2009 +0200
+
+    Fix typos in Annot::setContents() documentation
+
+ poppler/Annot.h |    2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit df0032cf5f6e5dc44bad056c659180e4065d32e2
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Thu Apr 23 13:19:25 2009 +0200
+
+    Document Annot::setContents() method
+
+ poppler/Annot.h |    2 ++
+ 1 file changed, 2 insertions(+)
+
+commit 86a37a8f3f93e3378b446f8d81d80571267c7660
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Thu Apr 23 13:16:04 2009 +0200
+
+    Update the annotation last modified time when it's modified
+
+ poppler/Annot.cc |   26 ++++++++++++++++----------
+ poppler/Annot.h  |    7 ++++---
+ 2 files changed, 20 insertions(+), 13 deletions(-)
+
+commit 9662bfa2b4b2282d0fc29d2a327b62d8bde56ff2
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Thu Apr 23 13:13:07 2009 +0200
+
+    Add timeToDateString() to DateInfo
+
+    This function converts a time_t into a string in PDF date format.
+
+ configure.ac       |    1 +
+ poppler/DateInfo.cc |  47
+ +++++++++++++++++++++++++++++++++++++++++++++++
+ poppler/DateInfo.h  |   7 +++++++
+ 3 files changed, 55 insertions(+)
+
+commit dc4cf0c29b53cda5c1c2badc5026af3429502e3a
+Author: Pino Toscano <pino@kde.org>
+Date:  Tue Apr 21 21:51:52 2009 +0200
+
+    add poppler-date.{cc,h}
+
+ glib/CMakeLists.txt |   2 ++
+ 1 file changed, 2 insertions(+)
+
+commit 0750c6502faeabff571f5730b567097e793dca64
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Tue Apr 21 20:04:27 2009 +0200
+
+    [glib-demo] Fix dates handling in annots demo
+
+ glib/demo/annots.c |  69
+ +++++++++++-----------------------------------------
+ 1 file changed, 14 insertions(+), 55 deletions(-)
+
+commit fe73bf9771e8294af4c8a11ec4c2891ff8f8d859
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Tue Apr 21 20:02:25 2009 +0200
+
+    [glib-demo] GTime is deprecated, use time_t instead
+
+ glib/demo/utils.c |   2 +-
+ glib/demo/utils.h |   2 +-
+ 2 files changed, 2 insertions(+), 2 deletions(-)
+
+commit 6d468cfa0cb89760e5d6cca43521cde6d99aa52e
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Tue Apr 21 20:00:20 2009 +0200
+
+    [glib-demo] Use format_date from utils and remove duplicated code
+
+ glib/demo/info.cc |   27 ++-------------------------
+ 1 file changed, 2 insertions(+), 25 deletions(-)
+
+commit e5f5ea01d0da4c4d877b93755523dc2a7f2ec049
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Tue Apr 21 19:57:11 2009 +0200
+
+    [glib] Fix poppler_annot_markup_get_date()
+
+    Date field in Markup annots is also a PDF format date string, so it
+    should be parsed and the resulting time_t used to create a correct
+    GDate.
+
+ glib/poppler-annot.cc |   22 +++++++++++-----------
+ 1 file changed, 11 insertions(+), 11 deletions(-)
+
+commit 876ad1bcc8a7b2f37656bf15cee7eb888fd46ed4
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Tue Apr 21 19:36:33 2009 +0200
+
+    [glib] Add info about the return value in poppler_annot_get_modified()
+    doc
+
+ glib/poppler-annot.cc |    4 +++-
+ 1 file changed, 3 insertions(+), 1 deletion(-)
+
+commit 8c54a15e1715721ee7af7e82c90b8dda3689c65f
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Tue Apr 21 19:35:14 2009 +0200
+
+    [glib] Fix a typo in poppler_date_parse documentation
+
+ glib/poppler-date.cc |    2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 39d09fa237d06fa93b02eb916d2c0242c4e8fe85
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Tue Apr 21 19:29:32 2009 +0200
+
+    [glib] Add poppler_date_parse to parse PDF format date strings
+
+    We need to make this public because the field M in the Annot
+    dictionary
+    might be a Date string (in PDF date format) or a text
+    string. According
+    to the PDF spec: "The preferred format is a date string as described
+    in
+    Section 3.8.3, “Dates,” but viewer applications should be
+    prepared to
+    accept and display a string in any format". The only way to know
+    whether
+    it's a PDF date string or not, is by trying to parse it. For this
+    reason
+    poppler_annot_get_modified() returns a gchar * instead of a
+    time_t. So,
+    viewers should try to parse the string in order to convert it to a
+    time_t, and if it fails to parse, use the date string as provided
+    by the
+    document.
+
+ glib/Makefile.am          |    2 ++
+ glib/poppler-attachment.cc |   4 +--
+ glib/poppler-date.cc      |   66
+ ++++++++++++++++++++++++++++++++++++++++++++
+ glib/poppler-date.h       |   30 ++++++++++++++++++++
+ glib/poppler-document.cc   |  45 ++++++------------------------
+ glib/poppler-private.h     |   2 +-
+ glib/poppler.h                    |    1 +
+ 7 files changed, 110 insertions(+), 40 deletions(-)
+
+commit 9c2714a3e1c02f445661618e24bcd27f1392b2b7
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Tue Apr 21 18:08:06 2009 +0200
+
+    [glib] Implement poppler_annot_set_contents()
+
+ glib/poppler-annot.cc |   25 +++++++++++++++++++++++++
+ glib/poppler-annot.h  |    2 ++
+ 2 files changed, 27 insertions(+)
+
+commit eec550e8b3cf96aefed9b03a78d365c2848fb8f2
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Tue Apr 21 18:06:34 2009 +0200
+
+    Add setContents() to modify the annot contents
+
+ poppler/Annot.cc |   26 +++++++++++++++++++++++++-
+ poppler/Annot.h  |    4 ++++
+ 2 files changed, 29 insertions(+), 1 deletion(-)
+
+commit 047a8870a8cea9b680080e0d3bf68d0685431233
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Mon Apr 20 23:38:53 2009 +0200
+
+    In case of err3 or err2 in readPageTree we need to free kidRef too
+
+ poppler/Catalog.cc |   3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+commit cb61b555f2c4db8685dec5491ca86570c962aab6
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Sat Apr 18 18:30:04 2009 +0200
+
+    Extend test-poppler-glib to show more page annotations and actions
+
+    Based on path by Thomas Viehmann <tv@beamnet.de>
+
+ glib/test-poppler-glib.cc |   68
+ +++++++++++++++++++++++++++++++++++++++++++++
+ 1 file changed, 68 insertions(+)
+
+commit 2221b8a9ae5e986c79ea3f6c9f3b0246d328c7ab
+Author: Matthias Franz <matthias@ktug.or.kr>
+Date:  Sun Apr 19 23:29:18 2009 +0200
+
+    Fix decryption using owner password on some pdf
+
+    See bug #21270
+
+ poppler/Decrypt.cc |   3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+commit e20efbf6cc676758b8ef7d2ad607560fcdbbf89e
+Author: Peter Kerzum <kerzum@yandex-team.ru>
+Date:  Fri Apr 17 22:14:26 2009 +0200
+
+    Fix typo in GfxFont.cc
+
+ poppler/GfxFont.cc |  11 ++++++-----
+ 1 file changed, 6 insertions(+), 5 deletions(-)
+
+commit b760debea03380280d72cd39d792cbc1a380a87c
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Fri Apr 17 21:04:26 2009 +0200
+
+    Fix rendering of axial shadings
+
+    Fixes bug #19896
+
+ poppler/Gfx.cc |  102
+ ++++++++++++++++++++++++++++++++++----------------------
+ 1 file changed, 62 insertions(+), 40 deletions(-)
+
+commit 9f1312f3d7dfa7e536606a7c7296b7c876b11c00
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Thu Apr 16 22:13:26 2009 +0200
+
+    Fix problems that happen when parsing broken JBIG2 files
+
+    Fixes
+    CVE-2009-0799 xpdf OOB Read
+    CVE-2009-0800 xpdf Multiple Input Validation Flaws
+    CVE-2009-1179 xpdf Integer Overflow
+    CVE-2009-1180 xpdf Invalid free()
+    CVE-2009-1181 xpdf NULL dereference DoS
+    CVE-2009-1182 xpdf MMR Decoder Buffer Overflows
+    CVE-2009-1183 xpdf MMR Infinite Loop DoS
+
+    Patch based on a patch by Derek Noonburg
+    Some files still hit the exit(1) in goo.c but at least none is
+    really crashing
+
+ poppler/JBIG2Stream.cc |  447
+ ++++++++++++++++++++++++++++++++++--------------
+ poppler/JBIG2Stream.h |    4 +
+ 2 files changed, 324 insertions(+), 127 deletions(-)
+
+commit 284a92899602daa4a7f429e61849e794569310b5
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Mon Apr 13 21:51:12 2009 +0200
+
+    Did a mistake in the gmalloc -> gmallocn commit, it's a 4 here not a 3
+
+ poppler/SplashOutputDev.cc |   2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 9cf2325fb22f812b31858e519411f57747d39bd8
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Sat Apr 11 00:31:57 2009 +0200
+
+    More gmalloc → gmallocn
+
+ glib/poppler-page.cc  |    2 +-
+ splash/Splash.cc      |    8 ++++----
+ splash/SplashBitmap.cc |    6 +++---
+ splash/SplashFTFont.cc |    2 +-
+ 4 files changed, 9 insertions(+), 9 deletions(-)
+
+commit c399b2d512aa073b0d7cd8eb5413a4b43f0d6aef
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Sat Apr 11 00:26:23 2009 +0200
+
+    Revert part of last commit, i need more math classes :D
+
+ poppler/JBIG2Stream.cc |    4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 7b2d314a61fd0e12f47c62996cb49ec0d1ba747a
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Sat Apr 11 00:23:04 2009 +0200
+
+    Be paranoid, use gmallocn or gmallocn3 in all gmalloc with *
+
+ poppler/ArthurOutputDev.cc |   4 ++--
+ poppler/CairoOutputDev.cc  |  14 +++++++-------
+ poppler/GfxState.cc       |    8 ++++----
+ poppler/JBIG2Stream.cc     |   4 ++--
+ poppler/PSOutputDev.cc     |   6 +++---
+ poppler/SplashOutputDev.cc |  20 ++++++++++----------
+ 6 files changed, 28 insertions(+), 28 deletions(-)
+
+commit 0131f0a01cba8691d10a18de1137a4744988b346
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Sat Apr 11 00:20:55 2009 +0200
+
+    Add gmallocn3 that does the same as gmallocn but with 3 arguments
+
+ goo/gmem.cc |  22 ++++++++++++++++++++++
+ goo/gmem.h  |   2 ++
+ 2 files changed, 24 insertions(+)
+
+commit 75c3466ba2e4980802e80b939495981240261cd5
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Fri Apr 10 18:05:54 2009 +0200
+
+    Make it compile in Solaris
+
+    See bug #21080
+
+ poppler/CairoFontEngine.cc |  14 ++++++++++++++
+ 1 file changed, 14 insertions(+)
+
+commit 3210970dc1d6faf51bce59bb7ecb6b881f9c0fe6
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Fri Apr 10 13:09:37 2009 +0200
+
+    [glib] Print annotations with the print flag enabled
+
+ glib/poppler-page.cc |    2 ++
+ 1 file changed, 2 insertions(+)
+
+commit b0b9798c85c7c6d6f336f73135a98974897b9f60
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Mon Mar 30 23:26:39 2009 +0200
+
+    Fix clip test for fonts
+
+    Fixes bug 20950
+    I really don't remember why i put that -1 maybe i got mislead by
+    SplashClip::testRect
+    having a +1, but the idea of the +1 is correct because it's ints
+    vs floats
+
+ splash/SplashFTFont.cc |    4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 5c08f57aa80092954746d722bb13655aee3f162c
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Sun Mar 29 23:52:31 2009 +0200
+
+    Forgot Ross copyright
+
+ poppler/TextOutputDev.cc |    1 +
+ 1 file changed, 1 insertion(+)
+
+commit c6d3e7884010ebdcc961d81ca8c692870fc9b139
+Author: Ross Moore <ross@maths.mq.edu.au>
+Date:  Sun Mar 29 23:46:09 2009 +0200
+
+    Fix extraction of some ActualText content
+
+    Fixes bug #20013
+
+ poppler/TextOutputDev.cc |    2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit e4b3f7cbcb6ccdfa8b18d8da5f7074f4140b776a
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Wed Mar 25 22:16:07 2009 +0100
+
+    Fix getGlyphAdvance to behave correctly on font size changes
+
+    Fixes bug #20769
+
+ splash/SplashFTFont.cc |    3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+commit 4acde05ac4d0b03466c949138321cc3445a14158
+Author: Eric Toombs <ewtoombs@uwaterloo.ca>
+Date:  Wed Mar 25 21:11:03 2009 +0100
+
+    Remove case-insensitive matching of filenames in PDFDoc constructor
+
+ poppler/PDFDoc.cc |   39 ++++++++++-----------------------------
+ 1 file changed, 10 insertions(+), 29 deletions(-)
+
+commit 120c7f6697ed1edaff6e17ae1ed202c69f03a73c
+Author: Pino Toscano <pino@kde.org>
+Date:  Tue Mar 24 22:56:33 2009 +0100
+
+    declare the matrix at the beginning
+
+ poppler/ArthurOutputDev.cc |   2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 441a9cd56935bfe2d8fddc5d3bc2c0104aeffaca
+Author: Eric Toombs <ewtoombs@uwaterloo.ca>
+Date:  Sun Mar 22 22:50:14 2009 +0100
+
+    Improved error reporting of ErrOpenFile errors
+
+    See bug #20660 for more information
+
+ glib/poppler-document.cc |   14 +++++++++---
+ poppler/PDFDoc.cc       |   54
+ +++++++++++++++++++++++++++-------------------
+ poppler/PDFDoc.h        |    8 +++++++
+ 3 files changed, 51 insertions(+), 25 deletions(-)
+
+commit 16af0ced4a0762f2f538135bd8dd72b469f6fdca
+Author: Michael K. Johnson <a1237@danlj.org>
+Date:  Sat Mar 21 16:14:06 2009 +0100
+
+    Support rendering non-square pixels in pdftoppm
+
+    Bug #20702
+
+ utils/pdftoppm.1  |   16 ++++++++++++++--
+ utils/pdftoppm.cc |   37 ++++++++++++++++++++++++++++++++-----
+ 2 files changed, 46 insertions(+), 7 deletions(-)
+
+commit a103c60abd5fe4c721b099c005daf22d6350c355
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Sat Mar 21 15:47:12 2009 +0100
+
+    Update version we need of Qt4
+
+ CMakeLists.txt |    2 +-
+ configure.ac  |    8 ++++----
+ 2 files changed, 5 insertions(+), 5 deletions(-)
+
+commit c4b1754fdd3a4649551556de2655c8291daafddf
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Sat Mar 21 13:29:38 2009 +0100
+
+    Bump cairo dependency to 1.8.4
+
+    Cairo 1.8.4 fixes and important bug that affects the Type 3 font
+    rendering
+
+ CMakeLists.txt |    2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 50c4ee413929e5a70133839e3cde039da738fab2
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Wed Mar 18 22:00:05 2009 +0100
+
+    Add more _checkoverflow variants, rework internals
+
+ goo/gmem.cc |  92
+ +++++++++++++++++++++++++++++------------------------------
+ goo/gmem.h  |   4 ++-
+ 2 files changed, 48 insertions(+), 48 deletions(-)
+
+commit 121c44db0884f0d70ba1470a66aa78441257c421
+Author: Adrian Johnson <ajohnson@redneon.com>
+Date:  Fri Mar 20 23:25:19 2009 +1030
+
+    Fix cairo luminosity smask when cairo ctm != identity
+
+ poppler/CairoOutputDev.cc |   16 +++++++++++++++-
+ 1 file changed, 15 insertions(+), 1 deletion(-)
+
+commit 3f55aff56a1d2002ba79f3efba5eb77e94575439
+Author: Adrian Johnson <ajohnson@redneon.com>
+Date:  Thu Mar 19 22:34:23 2009 +1030
+
+    Fix bug in cairo backend with nested masks
+
+    The previous smask was not restored after a q/Q pair or form xobject.
+
+ poppler/CairoOutputDev.cc |   18 +++++++++++++++++-
+ poppler/CairoOutputDev.h  |   5 +++++
+ 2 files changed, 22 insertions(+), 1 deletion(-)
+
+commit 4cc3cb8992ac554352d68e97563823b9bbd556ce
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Fri Mar 20 12:38:28 2009 +0100
+
+    Bump cairo dependency to 1.8.4
+
+    Cairo 1.8.4 fixes and important bug that affects the Type 3 font
+    rendering
+
+ configure.ac |    2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit da94fe717a1ab60fb074fae61d582d1ee7151fc2
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Mon Mar 16 22:54:27 2009 +0100
+
+    Fix parsing of border arrays
+
+    Fixes 19761
+
+ poppler/Annot.cc |   54
+ ++++++++++++++++++++++++++++++++++++------------------
+ 1 file changed, 36 insertions(+), 18 deletions(-)
+
+commit 8df0323f1ca4548a5d5824ece8736b356ce7ca42
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Thu Mar 12 00:09:03 2009 +0100
+
+    Really fix jpeg lib init order?
+
+ poppler/DCTStream.cc |    2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 12aac6774fc6f92def3d5567051117951cc32223
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Wed Mar 11 23:00:37 2009 +0100
+
+    fontCIDType2OT fonts can also have a CIDToGIDMap
+
+    Fixes bug #20605
+
+ poppler/GfxFont.cc |   4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 0ca9ae2848808d15e7a2b00f5eb33bb8f990c887
+Author: Vincent Torri <vtorri@univ-evry.fr>
+Date:  Wed Mar 11 00:39:59 2009 +0100
+
+    remove the fortran check during the initialisation of libtool
+
+ configure.ac |    1 +
+ 1 file changed, 1 insertion(+)
+
+commit 710e329a3a6a9ee2eed997c9eeaea21c44237423
+Author: Vincent Torri <vtorri@univ-evry.fr>
+Date:  Wed Mar 11 00:37:11 2009 +0100
+
+    Add AC_CONFIG_MACRO_DIR([m4])
+
+    It is used by autoreconf to trace changes in m4 macros that are in
+    the m4/ subdirectory.
+
+ configure.ac |    1 +
+ 1 file changed, 1 insertion(+)
+
+commit d15e47158ae31909212d3875159046afb208de97
+Author: Vincent Torri <vtorri@univ-evry.fr>
+Date:  Wed Mar 11 00:36:27 2009 +0100
+
+    Better check for pkg-config
+
+ configure.ac |    5 +----
+ 1 file changed, 1 insertion(+), 4 deletions(-)
+
+commit b3f569f9a6c117c097acac52ae6552209fcd2101
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Wed Mar 11 00:25:07 2009 +0100
+
+    Check there is an optional content config before using it
+
+    Fixes bug #20587
+
+ poppler/Gfx.cc |    4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 7a5d1e57b2757c986da17f7238415b927e73127f
+Author: Brian Ewins <Brian.Ewins@gmail.com>
+Date:  Mon Mar 9 22:54:58 2009 +0100
+
+    Check for pkgconfig before using it
+
+    At the moment if pkgconfig is not installed, an unhelpful syntax
+    error appears when testing for freetype. Identify the problem
+    earlier on
+
+ configure.ac |    6 ++++++
+ 1 file changed, 6 insertions(+)
+
+commit 8dc9e4d57a4759de2b56a87d9bace80d5d563fef
+Author: Marc Kleine-Budde <mkl@pengutronix.de>
+Date:  Sun Mar 8 15:29:02 2009 +0100
+
+    use AC_CHECK_HEADER to find headers
+
+    The original m4/libjpeg.m4 used AC_FIND_FILE to look for jpeg
+    header file.
+    This test is not cross-compiling save. This patch uses the autoconf
+    function
+    AC_CHECK_HEADER to look for the jpeg header, which works in the
+    native and
+    the cross compiling scenaria.
+    Bug #20538
+
+ m4/libjpeg.m4 |    3 +--
+ 1 file changed, 1 insertion(+), 2 deletions(-)
+
+commit bf2e2f056cadbc488cd3e9576b44beb34689ec81
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Sun Mar 8 13:44:44 2009 +0100
+
+    Add the new croptting options explanations
+
+ utils/pdftotext.1 |   15 +++++++++++++++
+ 1 file changed, 15 insertions(+)
+
+commit 663d9e5a448641421d290dd228be692a0f236b9c
+Author: Jan Jockusch <jan@jockusch.de>
+Date:  Sun Mar 8 13:44:20 2009 +0100
+
+    Make pdftotext to accept cropping options like pdftoppm
+
+    Bug #20331
+
+ utils/pdftotext.cc |  29 ++++++++++++++++++++++++++++-
+ 1 file changed, 28 insertions(+), 1 deletion(-)
+
+commit cc4b61f19b69c31d9a73ae7361c4b6a94345d1c2
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Sun Mar 8 12:55:45 2009 +0100
+
+    Fix the previous fix
+
+    I should stop listening to people without checking that what they
+    say is
+    correct
+
+ poppler/DCTStream.cc |    4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit a4a73cd9f9ee9767d74fbb44ffe083d2057a9d61
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Sun Mar 8 12:44:06 2009 +0100
+
+    I should compile before commiting :-/
+
+ poppler/DCTStream.cc |    1 -
+ 1 file changed, 1 deletion(-)
+
+commit 6a6b3cc91053e771a67dffa979076d130f87ff11
+Author: Ryszard Trojnacki <rysiek@menel.com>
+Date:  Sun Mar 8 12:38:42 2009 +0100
+
+    set up the error-manager before calling jpeg_create_decompress
+
+    Bug #20484
+
+ poppler/DCTStream.cc |   11 +++++++----
+ 1 file changed, 7 insertions(+), 4 deletions(-)
+
+commit 4dfa7460ddc4b5684d5ef8db17efa50b95b7b735
+Author: Nick Jones <nick.jones@network-box.com>
+Date:  Tue Mar 3 00:55:53 2009 +0100
+
+    Do not blindly follow loops parsing OutlineItem
+
+    More details in bug 18364
+
+ poppler/Outline.cc |  15 ++++++++++++++-
+ 1 file changed, 14 insertions(+), 1 deletion(-)
+
+commit de3131ae38fc9442b198d4d7b0c57c6939ad66ce
+Author: Pino Toscano <pino@kde.org>
+Date:  Mon Mar 2 15:20:07 2009 +0100
+
+    [Qt4] adapt to the new PDFDoc saving API
+
+    store the error code instead of the bool
+
+ qt4/src/poppler-pdf-converter.cc |   12 +++++++-----
+ 1 file changed, 7 insertions(+), 5 deletions(-)
+
+commit dac0542eb793603090416f1b7712ca08253f1e7f
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Mon Mar 2 09:54:22 2009 +0100
+
+    [glib] Correctly handle doc->saveAs() error code.
+
+    Fixes bug #19915.
+
+ glib/poppler-document.cc |   37 +++++++++++++++++++++++++++++++++----
+ 1 file changed, 33 insertions(+), 4 deletions(-)
+
+commit bfc6572614727565d883b9545d4b6665f3c2fdfe
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Sat Feb 28 13:16:49 2009 +0100
+
+    Return an error code instead of a GBool when saving
+
+ poppler/PDFDoc.cc |   22 +++++++++++-----------
+ poppler/PDFDoc.h  |   8 ++++----
+ 2 files changed, 15 insertions(+), 15 deletions(-)
+
+commit f7c88148fdb671736d81dd5f01a3fb68f944510c
+Author: Koji Otani <sho@bbr.jp>
+Date:  Wed Feb 25 23:38:35 2009 +0100
+
+    Fix cache shifting
+
+ poppler/GfxState.cc |   2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 305af8cdb6822858e152e1f930bba2ce3904bf1b
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Wed Feb 25 22:40:24 2009 +0100
+
+    Make JBIG2Stream not crash in 2009-41414141.pdf
+
+ poppler/JBIG2Stream.cc |  151
+ +++++++++++++++++++++++++++---------------------
+ 1 file changed, 85 insertions(+), 66 deletions(-)
+
+commit 26a8217160c1eaeeadb92023b27e68f402e38dd0
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Sun Feb 22 18:14:15 2009 +0100
+
+    Check if cairo_shape is not NULL before using it.
+
+    We were checking shape instead. It fixes a crash with some documents.
+    See bug #17337.
+
+ poppler/CairoOutputDev.cc |   2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 5e68e52da65b4d8c3817e5fbb6f1a937da321d48
+Author: Pino Toscano <pino@kde.org>
+Date:  Sat Feb 21 18:03:15 2009 +0100
+
+    [Qt4] do not assume the destination file name for links is ASCII
+
+ qt4/src/poppler-page.cc |    4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 439cb397fed33df627a09c70788d72bef20dc872
+Author: Pino Toscano <pino@kde.org>
+Date:  Sat Feb 21 18:02:36 2009 +0100
+
+    [Qt] do not assume the destination file name for links is ASCII
+
+ qt/poppler-page.cc |   4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 3ea5f45ad3e5a55e577a2e45f61b55932ed17013
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Sat Feb 21 17:46:30 2009 +0100
+
+    [glib] Make sure filename is valid utf-8 for remote dests
+
+ glib/poppler-action.cc |    3 +--
+ 1 file changed, 1 insertion(+), 2 deletions(-)
+
+commit b5989e4ffece6c1831610ee163d05fd80386a001
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Sat Feb 21 17:45:18 2009 +0100
+
+    Use the UF entry when present in Filespec dictionary
+
+ poppler/FileSpec.cc |  14 +++++++-------
+ 1 file changed, 7 insertions(+), 7 deletions(-)
+
+commit 943fca42b5fa815fad650e42da4ad6e806adc3b1
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Sat Feb 21 12:08:00 2009 +0100
+
+    [glib] Add a macro to define boxed types
+
+ glib/poppler-action.cc   |   26 +-----------
+ glib/poppler-annot.cc   |   15 ++-----
+ glib/poppler-document.cc |   44 +++++----------------
+ glib/poppler-page.cc    |   99
+ +++++++++-------------------------------------
+ glib/poppler-private.h   |   20 ++++++++++
+ 5 files changed, 53 insertions(+), 151 deletions(-)
+
+commit 7406337ed2d38a86308f20f8273a152538e524de
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Sat Feb 21 11:11:20 2009 +0100
+
+    [glib] Use template files to create poppler-enums
+
+ glib/Makefile.am             |   43
+ ++++++++++++----------------------------
+ glib/poppler-enums.c.template |   44
+ +++++++++++++++++++++++++++++++++++++++++
+ glib/poppler-enums.h.template |   25 +++++++++++++++++++++++
+ 3 files changed, 82 insertions(+), 30 deletions(-)
+
+commit 29bc9d1dd115b5d400975533c3924993c3adae30
+Author: Thomas Viehmann <tv@beamnet.de>
+Date:  Sat Jan 17 13:16:38 2009 +0100
+
+    glib small doc comment corrections
+
+ glib/poppler-attachment.cc |   2 +-
+ glib/poppler-layer.cc     |    2 ++
+ glib/poppler.cc           |    2 --
+ 3 files changed, 3 insertions(+), 3 deletions(-)
+
+commit a06e715d89a99b909b8e7b73b733066c67b1ade3
+Author: Thomas Viehmann <tv@beamnet.de>
+Date:  Sat Jan 17 12:58:20 2009 +0100
+
+    Make glib API reference more complete
+
+ glib/reference/poppler-docs.sgml       |    2 +
+ glib/reference/poppler-sections.txt    |   55 +++++
+ glib/reference/tmpl/poppler-action.sgml |    9 +-
+ glib/reference/tmpl/poppler-annot.sgml  |  368
+ +++++++++++++++++++++++++++++++
+ glib/reference/tmpl/poppler-layer.sgml  |   79 +++++++
+ 5 files changed, 511 insertions(+), 2 deletions(-)
+
+commit 3a21dafa46d42d86daec440a85b9d63b292a3c88
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Tue Feb 3 21:33:00 2009 +0100
+
+    Fix cache shifting
+
+    If we do
+      for (i = 0;i < GFX_ICCBASED_CACHE_SIZE-1 && cache[i].num > 0;i++) {
+       cache[i+1] = cache[i];
+    what we do at the end is copy position 0 to all others so
+    we need to do it in the reverse order
+
+ poppler/GfxState.cc |  10 +++++-----
+ 1 file changed, 5 insertions(+), 5 deletions(-)
+
+commit 0ed3fd52bb2d3375ed302285b18f076721b8028e
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Sun Feb 1 10:37:25 2009 +0100
+
+    [glib-demo] Fix a typo in format string
+
+ glib/demo/page.c |    2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 2df6d530cd9acd8648a6196031218ef10e7b3891
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Thu Jan 29 00:51:13 2009 +0100
+
+    Add line that for some reason was not imported from xpdf file
+
+    Fixes bug 19789
+
+ utils/ImageOutputDev.cc |    3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+commit 1fc342eadcbbb41302f190b215c5daf23c9ec9b1
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Wed Jan 28 22:53:43 2009 +0100
+
+    Fix crash on unexepcted Form Opt value
+
+    Fixes crash on bug 19790
+
+ poppler/Form.cc |    4 +++-
+ 1 file changed, 3 insertions(+), 1 deletion(-)
+
+commit b1d4efb082ac3dadd7752a557e5aeb6651e17471
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Tue Jan 27 00:26:08 2009 +0100
+
+    PostScriptFunction::transform optimization
+
+    Do not create and destroy a PSStack each time
+    PostScriptFunction::transform is called gives a 7% speedup on heavy
+    PostScriptFunction::transform pdf like nytimes firefox ad
+
+ poppler/Function.cc |  12 ++++++++----
+ poppler/Function.h  |  15 +++++++++++++++
+ 2 files changed, 23 insertions(+), 4 deletions(-)
+
+commit 90f95127d8d89cfcadeb7d701437ab07ce4a8a61
+Author: Koji Otani <sho@bbr.jp>
+Date:  Sun Jan 25 23:17:39 2009 +0100
+
+    Cache last 5 GfxICCBasedColorSpace
+
+ poppler/GfxState.cc |  60
+ +++++++++++++++++++++++++++++++++++++++++++++++++++
+ poppler/GfxState.h  |  15 +++++++++++++
+ 2 files changed, 75 insertions(+)
+
+commit d3f04f537fb3e963c149a7e2d8d83c7cb19da8c0
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Fri Jan 23 23:08:46 2009 +0100
+
+    Do not crash in some PDF we don't parse correctly
+
+    Fixes bug 19702
+
+ poppler/JBIG2Stream.cc |    7 ++++++-
+ 1 file changed, 6 insertions(+), 1 deletion(-)
+
+commit 3990c9e52da7b17215506857c792c90a37ebac79
+Author: Koji Otani <sho@bbr.jp>
+Date:  Mon Jan 19 09:53:00 2009 +0100
+
+    Fix a problem in cairo backend when using a CMYK Profile
+
+ poppler/GfxState.cc |   2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 6e51ae7fe8b9dc8ad52b735f2fe056f8ea8f1dcb
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Thu Jan 15 22:33:04 2009 +0100
+
+    calculate the limit in a way that one does not access an invalid
+    index of the matrix
+
+ poppler/DCTStream.cc |    2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit ea2aa7bd1ceb0e3282398f52683e4f52ef401f74
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Thu Jan 15 22:18:48 2009 +0100
+
+    Forgot my copyrights
+
+ poppler/DCTStream.cc |    2 +-
+ poppler/DCTStream.h  |    2 +-
+ poppler/Stream.cc    |    2 +-
+ 3 files changed, 3 insertions(+), 3 deletions(-)
+
+commit d65dd23752ec14635d0d224afa7dd605f98a10a4
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Thu Jan 15 22:17:14 2009 +0100
+
+    Minor optimizations
+
+ poppler/DCTStream.cc |   17 ++++++++---------
+ poppler/DCTStream.h  |    3 ++-
+ poppler/Stream.cc    |    3 ++-
+ 3 files changed, 12 insertions(+), 11 deletions(-)
+
+commit d3d2910f757dfc3e141aed62aa970136f9d7186f
+Author: Pino Toscano <pino@kde.org>
+Date:  Sun Jan 11 00:40:46 2009 +0100
+
+    fix a (relatively small) memory leak when asking for a document-level
+    JS
+
+ poppler/Catalog.cc |   1 +
+ 1 file changed, 1 insertion(+)
+
+commit 869584a84eed507775ff1c3183fe484c14b6f77b
+Author: Jonathan Kew <jonathan_kew@sil.org>
+Date:  Sat Jan 10 18:28:47 2009 +0100
+
+    Add the possibility of setting the datadir on runtime
+
+ poppler/GlobalParams.cc |   27 ++++++++++++++++++++-------
+ poppler/GlobalParams.h  |    5 ++++-
+ 2 files changed, 24 insertions(+), 8 deletions(-)
+
+commit cf112dceb1d6653beae73ce2fac6fb5eee48ff33
+Author: Koji Otani <sho@bbr.jp>
+Date:  Sat Jan 10 18:11:20 2009 +0100
+
+    Fix some problems with color management in CMYK Color Profile.
+
+    Fixes bug 19483
+
+ poppler/GfxState.cc | 106
+ +++++++++++++++++++++++++--------------------------
+ 1 file changed, 53 insertions(+), 53 deletions(-)
+
+commit 6dd77338d16f80760ae32ff9f3e2be9768fc0c49
+Author: Pino Toscano <pino@kde.org>
+Date:  Thu Jan 8 11:49:45 2009 +0100
+
+    [Qt4] use the cropbox for the annotations coordinates
+
+    Fixes bug #18558.
+
+ qt4/src/poppler-page.cc |    2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 69c07c031159d36dde52609bffa6d48c3c56cef5
+Author: Pino Toscano <pino@kde.org>
+Date:  Thu Jan 8 00:59:19 2009 +0100
+
+    update Poppler copyright to 2009
+
+ msvc/poppler/poppler-config.h |    2 +-
+ poppler-config.h.cmake        |    2 +-
+ poppler/poppler-config.h.in   |    2 +-
+ 3 files changed, 3 insertions(+), 3 deletions(-)
+
+commit 79e0eea85cf063c6323caafbec97f3d71fc04ca2
+Author: Pino Toscano <pino@kde.org>
+Date:  Thu Jan 8 00:57:03 2009 +0100
+
+    remove old cmake modules, add a new one
+
+ Makefile.am |   3 +--
+ 1 file changed, 1 insertion(+), 2 deletions(-)
+
+commit 0e6420ece2d6fcc046d5814b48a2754fb86771e2
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Wed Jan 7 23:33:02 2009 +0100
+
+    Require cmake 2.6.0, remove two cmake files provided upstream
+
+ CMakeLists.txt                                           |    4 +-
+ cmake/modules/FindFreetype.cmake                 |   74
+ ---------------------
+ cmake/modules/FindPackageHandleStandardArgs.cmake |   58 ----------------
+ glib/CMakeLists.txt                              |    2 +-
+ 4 files changed, 3 insertions(+), 135 deletions(-)
+
+commit a69add73bf7bef17c677c735db77934ba67188a5
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Wed Jan 7 19:06:13 2009 +0100
+
+    Update copyright notices
+
+ poppler/FontInfo.cc        |    1 +
+ poppler/FontInfo.h         |    1 +
+ qt4/src/poppler-document.cc |   2 +-
+ qt4/src/poppler-fontinfo.cc |   2 +-
+ qt4/src/poppler-form.cc     |   1 +
+ qt4/src/poppler-form.h      |   1 +
+ qt4/src/poppler-private.h   |   2 +-
+ qt4/src/poppler-qt4.h      |    2 +-
+ 8 files changed, 8 insertions(+), 4 deletions(-)
+
+commit 18d584158a781fecb4f696b01fb4d17803ce7d7a
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Wed Jan 7 17:55:48 2009 +0100
+
+    Add lcms option to cmake buildsystem
+
+ CMakeLists.txt                      |    9 +++++++++
+ cmake/modules/FindLCMS.cmake |   37 +++++++++++++++++++++++++++++++++++++
+ config.h.cmake                      |    3 +++
+ 3 files changed, 49 insertions(+)
+
+commit 140b8ed97416f9c2ec02eb749ca45ca50bd651a8
+Author: Koji Otani <sho@bbr.jp>
+Date:  Wed Jan 7 17:43:44 2009 +0100
+
+    Add initial support for color management
+
+ configure.ac       |   19 ++
+ poppler/GfxState.cc | 697
+ +++++++++++++++++++++++++++++++++++++++++++++++----
+ poppler/GfxState.h  |  74 +++++-
+ poppler/Makefile.am |   5 +
+ 4 files changed, 738 insertions(+), 57 deletions(-)
+
+commit bdc76dc811a6e4d5fd929bbdc8cd3300aeaea31f
+Author: Pino Toscano <pino@kde.org>
+Date:  Tue Jan 6 15:45:37 2009 +0100
+
+    [Qt4] apidox improvements for the font functions of Document; mark
+    scanForFonts() as deprecated
+
+ qt4/src/poppler-qt4.h |   22 ++++++++++++++++++----
+ 1 file changed, 18 insertions(+), 4 deletions(-)
+
+commit 6630e715714161cd803fc064f5d3cf880f42b0a5
+Author: Pino Toscano <pino@kde.org>
+Date:  Tue Jan 6 15:36:19 2009 +0100
+
+    tell Doxygen to consider Q_DECL_DEPRECATED as empty
+
+ qt4/src/Doxyfile |    1 +
+ 1 file changed, 1 insertion(+)
+
+commit d748d430b106580b8be29ca3ec75caf05b55812e
+Author: Pino Toscano <pino@kde.org>
+Date:  Tue Jan 6 15:24:25 2009 +0100
+
+    [Qt4] Add a FontIterator for iterating through the fonts of the
+    document, page by page.
+
+    This new iterator class is the new preferred way for getting the
+    fonts of a document in a page-by-page mode.
+    * Document::fonts() is adapted to use it, instead of relying on
+    scanForFonts()
+    * scanForFonts() is ported to FontIterator, but keeping the old
+    behaviour ("i can scan the document only once")
+    * added unit tests for fonts(), scanForFonts() and FontIterator
+
+ qt4/src/poppler-document.cc |  27 +++++---
+ qt4/src/poppler-fontinfo.cc |  36 +++++++++++
+ qt4/src/poppler-private.h   |  27 ++++++--
+ qt4/src/poppler-qt4.h      |   65 +++++++++++++++++++
+ qt4/tests/check_fonts.cpp   | 149
+ +++++++++++++++++++++++++++++++++++++++++++
+ 5 files changed, 291 insertions(+), 13 deletions(-)
+
+commit b9804542bb50216786dc11ca16efd84304f4b832
+Author: Pino Toscano <pino@kde.org>
+Date:  Tue Jan 6 15:16:53 2009 +0100
+
+    Add the possibility to set the first page to scan.
+
+    The default value is 0 (= first page), so it should be compatible
+    with any usage so far.
+
+ poppler/FontInfo.cc |   4 ++--
+ poppler/FontInfo.h  |   2 +-
+ 2 files changed, 3 insertions(+), 3 deletions(-)
+
+commit af74fef03bfbd79334da5612c63c7793952542f9
+Author: Warren Toomey <poppler@tuhs.org>
+Date:  Tue Jan 6 01:36:31 2009 +0100
+
+    Add forgotten file to let the autotools based system build
+
+ m4/libpng.m4 |   99
+ ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+ 1 file changed, 99 insertions(+)
+
+commit ae588500f62bab5666174ff3b1564c414c5a76c5
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Tue Jan 6 01:35:38 2009 +0100
+
+    Fix the cmake buildsystem
+
+ CMakeLists.txt       |    6 ++++++
+ config.h.cmake       |    3 +++
+ utils/CMakeLists.txt |    4 ++++
+ 3 files changed, 13 insertions(+)
+
+commit 940d060a14712c09da427e2fac4ec579f7291b0f
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Tue Jan 6 01:27:06 2009 +0100
+
+    do not leak fName if fopen fails
+
+ utils/HtmlOutputDev.cc |    3 +++
+ 1 file changed, 3 insertions(+)
+
+commit 7be9198adb940ad7c5fffc6db0158cf7042e1b8f
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Tue Jan 6 01:24:15 2009 +0100
+
+    Do not leak pgNum and imgnum if fopen fails
+
+ utils/HtmlOutputDev.cc |   16 +++++++++-------
+ 1 file changed, 9 insertions(+), 7 deletions(-)
+
+commit dfba6c022b150553cb2b18b027e661b3b4625ce7
+Author: Warren Toomey <poppler@tuhs.org>
+Date:  Tue Jan 6 01:16:31 2009 +0100
+
+    Make pdftohtml output png images when the image stream is not a jpeg
+
+ configure.ac          |   14 ++++++
+ utils/HtmlOutputDev.cc |  126
+ +++++++++++++++++++++++++++++++++++++++++++++---
+ utils/HtmlOutputDev.h |    3 +-
+ utils/Makefile.am     |    4 ++
+ 4 files changed, 140 insertions(+), 7 deletions(-)
+
+commit 0963c276ba972a36c2895e4fe1c7475acd489738
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Sun Jan 4 16:54:32 2009 +0100
+
+    Fix some checked checkboxes not rendering correctly
+
+    If we are forcing ZaDb/ZapfDingbats to correctly draw a checkmark
+    in the checkbox, but the file does not have such font defined we
+    need to create a fake one so the system really renders it
+    Fixes bug 19359
+
+ poppler/Annot.cc |   49 +++++++++++++++++++++++++++++++++++++++++++++++--
+ poppler/Annot.h  |    2 ++
+ poppler/Gfx.h   |    7 ++++---
+ 3 files changed, 53 insertions(+), 5 deletions(-)
+
+commit 46128cf83b322c112eb0c409c20052bdb2ea4a37
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Sun Jan 4 14:21:15 2009 +0100
+
+    Remove wrong and unused FormWidget(FormWidget *dest) contructor
+
+ poppler/Form.cc |   11 -----------
+ poppler/Form.h  |    3 +--
+ 2 files changed, 1 insertion(+), 13 deletions(-)
+
+commit 5203aefc41fa47c461812cc46f28281edd226515
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Sun Jan 4 14:03:16 2009 +0100
+
+    Plug some memory leaks
+
+ poppler/Annot.cc |    5 ++++-
+ poppler/Form.cc  |    4 +++-
+ 2 files changed, 7 insertions(+), 2 deletions(-)
+
+commit 5fb7ec7e6af4cfb2b256a5b9b9752e68330b4aec
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Tue Dec 30 23:46:59 2008 +0100
+
+    If Length2 is zero just write until we find EOF of the stream
+
+    Fixes exporting to PS of the two pdf i have that have fonts with
+    Length2 set to 0
+
+ poppler/PSOutputDev.cc |   26 +++++++++++++++++++++-----
+ 1 file changed, 21 insertions(+), 5 deletions(-)
+
+commit ca35fdbc7c31dae432d775b6c087a83fa9b897fc
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Tue Dec 30 23:03:57 2008 +0100
+
+    We need spaces here too to satify other consumer parsers
+
+ poppler/PDFDoc.cc |   4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 3c07c73e07a9cb59ee4c23ca60d2adce92de45f7
+Author: Pino Toscano <pino@kde.org>
+Date:  Tue Dec 30 22:21:27 2008 +0100
+
+    [Qt4-demo] load a document when passed via command line
+
+ qt4/demos/main_viewer.cpp |   4 ++++
+ 1 file changed, 4 insertions(+)
+
+commit aba0aaa896d634a51fbb3a3e6eae411be462f930
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Mon Dec 29 00:31:18 2008 +0100
+
+    More improvements in document writing
+
+    Dictionary keys are names so need to be sanitized
+    Add a space after num gen obj
+
+ poppler/PDFDoc.cc |   7 +++++--
+ 1 file changed, 5 insertions(+), 2 deletions(-)
+
+commit e5b93a847ae4e20a77fecef0938da4f14dfbe3eb
+Author: Hib Eris <hib@hiberis.nl>
+Date:  Sun Dec 28 22:59:14 2008 +0100
+
+    Let compiler figure out CDECL
+
+    CDECL is a compiler specific macro to specify C calling convention.
+
+    On Windows, some functions must be forced to use this calling
+    convention.
+    To do this, you can use the macro CDECL, which is defined in windef.h.
+
+    Poppler should not try to be smarter than the compiler and try
+    to guess
+    the correct definition for CDECL. Instead it should rely on the
+    definitions in the windef.h file provided by the compiler.
+
+    On Unix, specifying a calling convention is not nescessary, so
+    CDECL can
+    be an empty definition.
+
+ poppler-config.h.cmake      |   8 ++------
+ poppler/poppler-config.h.in |   8 ++------
+ 2 files changed, 4 insertions(+), 12 deletions(-)
+
+commit de70c0aeb37d788f595b0574796844f51ddedec1
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Sun Dec 28 21:21:12 2008 +0100
+
+    [qt4] improve doc a bit
+
+ qt4/src/poppler-form.h |    2 +-
+ qt4/src/poppler-qt4.h |    4 ++--
+ 2 files changed, 3 insertions(+), 3 deletions(-)
+
+commit effb32658019e09dc86c017e39154fd554fc94f8
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Sun Dec 28 02:56:30 2008 +0100
+
+    Form Rects are against the cropbox, not the media box
+
+    Fixes second pdf at kde bug 161327
+
+ qt4/src/poppler-form.cc |    2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 0f10561f3b1c90acc030d973399316bfca5f495e
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Sun Dec 28 01:44:25 2008 +0100
+
+    Fix my last commit, copy&paste is really evil
+
+ goo/GooString.cc |    9 +++++----
+ goo/GooString.h  |    2 +-
+ 2 files changed, 6 insertions(+), 5 deletions(-)
+
+commit 217b46484ff56bfd5906b293ebee70b82cc0263d
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Sun Dec 28 01:29:41 2008 +0100
+
+    Move PSOutputDev::filterPSName to GooString::sanitizedName so i can
+    use it from PDFDoc::writeObject
+
+ goo/GooString.cc      |   36 +++++++++++++++++++++++++++++++++++
+ goo/GooString.h       |    7 +++++++
+ poppler/PDFDoc.cc     |    7 ++++++-
+ poppler/PSOutputDev.cc |   49
+ +++++++++---------------------------------------
+ poppler/PSOutputDev.h |    3 +--
+ 5 files changed, 59 insertions(+), 43 deletions(-)
+
+commit f41fa9ee71aef5539cf9976c79b32bf1713c8167
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Fri Dec 26 22:56:12 2008 +0100
+
+    Change the overflow check to the same used in gmem.cc, much more
+    easy to understand
+
+ poppler/XRef.cc |   12 ++++++------
+ 1 file changed, 6 insertions(+), 6 deletions(-)
+
+commit b8ae7d91dedc9a75200b6050628ec2740af84b98
+Author: Hib Eris <hib@hiberis.nl>
+Date:  Fri Dec 26 22:28:09 2008 +0100
+
+    Fix compile warnings on auto imports for mingw32
+
+ configure.ac         |    3 +++
+ glib/Makefile.am      |    2 +-
+ glib/demo/Makefile.am |    2 ++
+ test/Makefile.am      |    2 ++
+ utils/Makefile.am     |    2 ++
+ 5 files changed, 10 insertions(+), 1 deletion(-)
+
+commit ba47bd2ba05f883306606eda30bff17bd4a8eec6
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Fri Dec 26 19:47:42 2008 +0100
+
+    BaseFile.h has never been used and it fact it's not part of xpdf
+    sources
+
+    Fixes bug 19298
+
+ CMakeLists.txt      |   1 -
+ poppler/BaseFile.h  |  82
+ ---------------------------------------------------
+ poppler/Makefile.am |   1 -
+ 3 files changed, 84 deletions(-)
+
+commit 84366d9e63b0d6a5ee1aae2463648cfc2ff5e1b8
+Author: Hib Eris <hib@hiberis.nl>
+Date:  Wed Dec 24 19:27:19 2008 +0100
+
+    Let libtool build DLLs on windows too
+
+ configure.ac |    5 ++++-
+ 1 file changed, 4 insertions(+), 1 deletion(-)
+
+commit 08cef528f2e51cc62cff4125f179021ad9555317
+Author: Hib Eris <hib@hiberis.nl>
+Date:  Wed Dec 24 17:48:46 2008 +0100
+
+    Fix compile warning on string literal format
+
+ test/pdf-inspector.cc |    2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 0606b4bba8e889204c7b7c9d376f63b659f83a4f
+Author: Hib Eris <hib@hiberis.nl>
+Date:  Wed Dec 24 17:48:10 2008 +0100
+
+    Fix compile warnings on parentheses and/or
+
+ poppler/CairoOutputDev.cc |   13 +++++++------
+ 1 file changed, 7 insertions(+), 6 deletions(-)
+
+commit eba2232cabd5fb1e177db2a6053f0d1a0aee882b
+Author: Hib Eris <hib@hiberis.nl>
+Date:  Wed Dec 24 17:46:32 2008 +0100
+
+    Fix some more warnings
+
+ test/gtk-cairo-test.cc |   11 -----------
+ test/pdf-inspector.cc |    9 +++++----
+ 2 files changed, 5 insertions(+), 15 deletions(-)
+
+commit c80431eb1626d89e7b615e5a5149d3436b554b66
+Author: Hib Eris <hib@hiberis.nl>
+Date:  Mon Dec 22 09:28:47 2008 +0100
+
+    Fix compile warning on format type
+
+ glib/test-poppler-glib.cc |   2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit fda181c35b7c7500b6d3c6ca9d454addd54929c5
+Author: Pino Toscano <pino@kde.org>
+Date:  Mon Dec 22 00:53:44 2008 +0100
+
+    group condition within brackets
+
+ poppler/ArthurOutputDev.cc |   4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit c1beeecbd6cbf82811d70c75cb24059b4b492abe
+Author: Pino Toscano <pino@kde.org>
+Date:  Mon Dec 22 00:46:49 2008 +0100
+
+    [demo] use the proper format field for gsize types
+
+ glib/demo/attachments.c |    2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit bfb975466f0ff78e9e292b6af7cac66e4c331456
+Merge: 3e27892 ea3546f
+Author: Pino Toscano <pino@kde.org>
+Date:  Mon Dec 22 00:29:38 2008 +0100
+
+    Merge branch 'master' of
+    ssh://pino@git.freedesktop.org/git/poppler/poppler
+
+commit 3e2789257f5fc4ae0573a0c62ea380d8e83a5bb5
+Author: Pino Toscano <pino@kde.org>
+Date:  Mon Dec 22 00:24:23 2008 +0100
+
+    [Qt] deserialize also the value of 'right'
+
+ qt/poppler-link.cc |  11 ++++++-----
+ 1 file changed, 6 insertions(+), 5 deletions(-)
+
+commit 7c053ab7623cea1ac650d3e960d2d91a1ef21557
+Author: Pino Toscano <pino@kde.org>
+Date:  Mon Dec 22 00:19:02 2008 +0100
+
+    [Qt] move in a .cc file the implementation of the QString<->GooString
+    functions and DocumentData::addTocChildren()
+
+ qt/CMakeLists.txt     |    1 +
+ qt/Makefile.am                |    1 +
+ qt/poppler-document.cc |   10 ----
+ qt/poppler-page.cc    |    1 +
+ qt/poppler-private.cc |  147
+ ++++++++++++++++++++++++++++++++++++++++++++++++
+ qt/poppler-private.h  |  106 +++-------------------------------
+ 6 files changed, 157 insertions(+), 109 deletions(-)
+
+commit ea3546f84c5335c58cdb2906b1a1a4656be9c8ea
+Author: Hib Eris <hib@hiberis.nl>
+Date:  Sun Dec 21 23:33:49 2008 +0100
+
+    Fix compile warnings on signed/unsigned comparison
+
+ goo/gfile.cc |    3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+commit ca672ae51d2c1fa59a891717b418ba86b5e7345c
+Author: Hib Eris <hib@hiberis.nl>
+Date:  Sun Dec 21 23:33:00 2008 +0100
+
+    Fix compile warnings on ignored pragma with mingw compiler
+
+ poppler/Gfx.cc |    5 +++--
+ 1 file changed, 3 insertions(+), 2 deletions(-)
+
+commit 86cfe8ab2b4e0b600f3f6682701c2fcfbe5d0ca9
+Author: Hib Eris <hib@hiberis.nl>
+Date:  Sun Dec 21 23:08:56 2008 +0100
+
+    Fix compile warnings on signed/unsigned comparison
+
+ poppler/GfxFont.cc |   6 ++++--
+ 1 file changed, 4 insertions(+), 2 deletions(-)
+
+commit e34af7ffe0a4024e2eb39314bdb09eb9a662e53e
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Sun Dec 21 22:16:39 2008 +0100
+
+    Update copyright of last commits
+
+ poppler/TextOutputDev.cc |    1 +
+ poppler/TextOutputDev.h  |    2 +-
+ qt4/src/poppler-page.cc  |    1 +
+ 3 files changed, 3 insertions(+), 1 deletion(-)
+
+commit f6d84dcfc9cc587c7408af79b1ee7658d456f8d8
+Author: Hib Eris <hib@hiberis.nl>
+Date:  Sun Dec 21 22:09:00 2008 +0100
+
+    Fix compile warning to suggest parentheses and/or
+
+ poppler/TextOutputDev.cc |   14 ++++++++------
+ 1 file changed, 8 insertions(+), 6 deletions(-)
+
+commit 15205403eaa95d6fba0e36983de993877dd3a983
+Author: Hib Eris <hib@hiberis.nl>
+Date:  Sun Dec 21 21:59:45 2008 +0100
+
+    Fix warning to suggest parentheses inside shift
+
+ poppler/PSOutputDev.cc |    3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+commit cc24f37e582bfc0069faf286da97a48fe4794db1
+Author: Hib Eris <hib@hiberis.nl>
+Date:  Sun Dec 21 21:35:29 2008 +0100
+
+    Fix compile warning on ambiguous else
+
+ test/perf-test.cc |   3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+commit a8cc4ad8c2da804f25db8cca1c85433d5a63307c
+Author: Hib Eris <hib@hiberis.nl>
+Date:  Sun Dec 21 21:34:28 2008 +0100
+
+    Fix compile warning on format not a string literal
+
+ test/perf-test.cc |   3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+commit 3cbbf8226730aa7ee6273e154e4a9d58670a3cda
+Author: Hib Eris <hib@hiberis.nl>
+Date:  Sun Dec 21 21:30:54 2008 +0100
+
+    Fix compile warning about uninitialized variable
+
+ poppler/ABWOutputDev.cc |    3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+commit f675916277cb76cd1293225a1271f835a02148fb
+Author: Pino Toscano <pino@kde.org>
+Date:  Sat Dec 20 23:23:10 2008 +0100
+
+    reset to NULL after being deleted
+
+    found with poppler-qt4 unit tests =)
+
+ poppler/TextOutputDev.cc |    1 +
+ 1 file changed, 1 insertion(+)
+
+commit c976770c64e4c991fff27e413414473583b6fd86
+Author: Pino Toscano <pino@kde.org>
+Date:  Sat Dec 20 22:25:55 2008 +0100
+
+    [Qt4] use QHash instead of QMap where applicable
+
+    using a hash table instead of a map mapes lookup faster;
+    in these cases we don't need the sorting a map gives
+
+ qt4/src/poppler-page.cc |    7 ++++---
+ 1 file changed, 4 insertions(+), 3 deletions(-)
+
+commit 944f6049a50eb3be9fb29174d67adc4ad1d0b9fe
+Author: Pino Toscano <pino@kde.org>
+Date:  Sat Dec 20 20:13:43 2008 +0100
+
+    add find.c and text.c
+
+ glib/demo/CMakeLists.txt |    2 ++
+ 1 file changed, 2 insertions(+)
+
+commit ba91b889c3b50239e339938f3c9d31fffcd87d44
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Sat Dec 20 19:29:40 2008 +0100
+
+    Make destructor private in TextPage
+
+ poppler/TextOutputDev.h |    8 ++++----
+ 1 file changed, 4 insertions(+), 4 deletions(-)
+
+commit 0da16537aa83f6ed6d8895c7e54266263a71c1cf
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Fri Dec 19 19:08:21 2008 +0100
+
+    Refactor actual text code adding a new ActualText class
+
+    It's used by both Text and Cairo ouput devices avoiding duplicated
+    code
+    in such classes.
+
+ poppler/CairoOutputDev.cc |  108 +++---------------------
+ poppler/CairoOutputDev.h  |   7 +-
+ poppler/TextOutputDev.cc  |  206
+ ++++++++++++++++++++++++++-------------------
+ poppler/TextOutputDev.h   |   34 ++++++--
+ 4 files changed, 160 insertions(+), 195 deletions(-)
+
+commit 0f8ab301c633133eea3dbd4f2254f31c50e3c4a9
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Sun Dec 14 13:12:34 2008 +0100
+
+    [glib-demo] Add find demo
+
+ glib/demo/Makefile.am |    2 +
+ glib/demo/find.c      |  282
+ +++++++++++++++++++++++++++++++++++++++++++++++++
+ glib/demo/find.h      |   31 ++++++
+ glib/demo/main.c      |    4 +-
+ 4 files changed, 318 insertions(+), 1 deletion(-)
+
+commit 88df9e9aa9adb53f0a9714ea404d46f111495df3
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Sun Dec 14 11:54:35 2008 +0100
+
+    [glib-demo] Add Text demo
+
+ glib/demo/Makefile.am |    2 +
+ glib/demo/main.c      |    4 +-
+ glib/demo/text.c      |  175
+ +++++++++++++++++++++++++++++++++++++++++++++++++
+ glib/demo/text.h      |   31 +++++++++
+ 4 files changed, 211 insertions(+), 1 deletion(-)
+
+commit 5b0f2355d55a5104820fd0bf16b4e76b25959de4
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Sun Dec 14 11:49:00 2008 +0100
+
+    [glib] Use TextPage instead of TextOutputDev when cairo is enabled
+
+ glib/poppler-page.cc  |  148
+ +++++++++++++++++++++++++++++++++---------------
+ glib/poppler-private.h |    4 ++
+ 2 files changed, 107 insertions(+), 45 deletions(-)
+
+commit 3ced71fb68d62308db7b9535367eafefb55d1cde
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Sun Dec 14 11:18:00 2008 +0100
+
+    Add optionally text support to CairoOutputDev
+
+    If a TextPage is set, it'll be used when rendering so that we
+    don't need
+    to use TextOutputDev and render again.
+
+ poppler/CairoOutputDev.cc |  144
+ +++++++++++++++++++++++++++++++++++++++++++--
+ poppler/CairoOutputDev.h  |   19 +++++-
+ 2 files changed, 155 insertions(+), 8 deletions(-)
+
+commit 0bdad35cc4cfdb8da5acaf44678920b7a0025f99
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Sun Dec 14 11:14:12 2008 +0100
+
+    Add refcount support to TextPage
+
+ poppler/TextOutputDev.cc |   12 +++++++++++-
+ poppler/TextOutputDev.h  |    5 +++++
+ qt4/src/poppler-page.cc  |    2 +-
+ 3 files changed, 17 insertions(+), 2 deletions(-)
+
+commit f86514c3fbc867fc6457feacba23451e89993524
+Author: Koji Otani <sho@bbr.jp>
+Date:  Wed Dec 17 00:36:39 2008 +0100
+
+    Fix wrong PS generation when a large image is in Patterns
+
+    Bug 18908
+
+ poppler/PSOutputDev.cc |  114
+ ++++++++++++++++++++++++++++++------------------
+ 1 file changed, 72 insertions(+), 42 deletions(-)
+
+commit fc395eb90b418e43453acefb42cd04baf0b7ad40
+Author: Richard Airlie <richard.airlie@maglabs.net>
+Date:  Tue Dec 16 21:11:53 2008 +0100
+
+    Allow the use of cropbox in pdftoppm
+
+ utils/pdftoppm.cc |   16 +++++++++++++---
+ 1 file changed, 13 insertions(+), 3 deletions(-)
+
+commit 80f415176952635a485356cf36048eee53396c25
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Tue Dec 16 20:37:39 2008 +0100
+
+    Make destructors private/protected since you are not supposed to
+    use them
+
+ poppler/GfxFont.cc |   2 +-
+ poppler/GfxFont.h  |  11 +++++------
+ 2 files changed, 6 insertions(+), 7 deletions(-)
+
+commit dbcebda953cb36a45a125aada68e85249fb73f43
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Mon Dec 15 20:10:31 2008 +0100
+
+    Do not leak on AnnotScreen destructor
+
+    Fixes bug 19095
+
+ poppler/Annot.cc |    4 ++++
+ 1 file changed, 4 insertions(+)
+
+commit aaeb0d137232bf1cb11dc5e37b8b45b50c6f9c6a
+Author: Pino Toscano <pino@kde.org>
+Date:  Fri Dec 12 00:43:19 2008 +0100
+
+    update the xpdf headers installation
+
+ CMakeLists.txt |   32 +++++++++++++++++++++-----------
+ 1 file changed, 21 insertions(+), 11 deletions(-)
+
+commit 7c6527fa05389f705872aaaaff12e739b5d1577e
+Author: Pino Toscano <pino@kde.org>
+Date:  Fri Dec 12 00:41:21 2008 +0100
+
+    don't install Function.cc, as it is not an header
+
+ poppler/Makefile.am |   1 -
+ 1 file changed, 1 deletion(-)
+
+commit 0179e21b128ffccb5afd13203137ab8435197609
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Fri Dec 12 00:16:38 2008 +0100
+
+    Be more helpful with bad boys that want to use poppler core directly
+
+ fofi/Makefile.am     |   10 ++++++++++
+ splash/SplashClip.h  |    2 +-
+ splash/SplashPath.h  |    2 +-
+ splash/SplashXPath.h |    2 +-
+ 4 files changed, 13 insertions(+), 3 deletions(-)
+
+commit 401632e4eeb4b10b1183a820f32461da77e8e4f2
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Fri Dec 12 00:14:04 2008 +0100
+
+    Try harder to look for openjpeg
+
+ cmake/modules/FindLIBOPENJPEG.cmake |   2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit ab539f46089702f60b96b1ba2b2bc1544173c264
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Thu Dec 11 23:15:45 2008 +0100
+
+    Fix crash when reading outline
+
+    Fixes bug 19024. Last as reference is required if the item has
+    children (Table 8.4) so if there is no last reference, don't try to
+    read children.
+
+ poppler/Outline.cc |   4 ++++
+ 1 file changed, 4 insertions(+)
+
+commit c9a755f9fd14511f43a2ca7fcda36bdd64bb1d87
+Author: Ilya Gorenbein <igorenbein@finjan.com>
+Date:  Sun Dec 7 17:59:19 2008 +0100
+
+    Fix memory leak
+
+    Bug 18924
+
+ poppler/Page.cc |    4 ++++
+ 1 file changed, 4 insertions(+)
+
+commit 4cd364c179ae91ed383a8237ba1ad263952fd7aa
+Author: Pino Toscano <pino@kde.org>
+Date:  Sun Nov 30 16:57:52 2008 +0100
+
+    add my copyright here
+
+ qt4/src/poppler-private.cc |   1 +
+ 1 file changed, 1 insertion(+)
+
+commit 6b1676deb773675d90469adc84c3de8dcdaf174c
+Author: Pino Toscano <pino@kde.org>
+Date:  Sun Nov 30 16:56:43 2008 +0100
+
+    [Qt4] support URI actions for TOC items
+
+ qt4/src/poppler-private.cc |   5 +++++
+ 1 file changed, 5 insertions(+)
+
+commit b5cd58b5565055fd0c13771461245ddcd80edfcf
+Author: Pino Toscano <pino@kde.org>
+Date:  Sun Nov 30 16:34:57 2008 +0100
+
+    extract the LinkAction "serialization" in an own function, and make
+    it more safe
+
+ qt4/src/poppler-private.cc |  85
+ ++++++++++++++++++++++++++++++--------------
+ 1 file changed, 59 insertions(+), 26 deletions(-)
+
+commit ee191363e22940ae7b06945e68c4738b17c78348
+Author: Pino Toscano <pino@kde.org>
+Date:  Sun Nov 30 16:17:32 2008 +0100
+
+    move the addTocChildren() implementation in the cpp
+
+ qt4/src/poppler-form.cc    |   1 +
+ qt4/src/poppler-page.cc    |   1 +
+ qt4/src/poppler-private.cc |  65
+ ++++++++++++++++++++++++++++++++++++++++++++
+ qt4/src/poppler-private.h  |  64
+ ++-----------------------------------------
+ 4 files changed, 69 insertions(+), 62 deletions(-)
+
+commit f8eaabf1aa7e384619129a7509be85d0c3bfb825
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Sun Nov 30 13:33:12 2008 +0100
+
+    Update copyrights of the last commits
+
+ poppler/TextOutputDev.cc |    2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 5f4fedfae6098e25644ffe5d4b1ed0bac043841d
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Sat Nov 29 19:51:27 2008 +0100
+
+    Use the Length specified in the Stream as initial bufSize
+
+    This is a optimization to save a few reallocations, if the Length
+    value is incorrect it will still work
+
+ poppler/JPEG2000Stream.cc |   10 ++++++++--
+ 1 file changed, 8 insertions(+), 2 deletions(-)
+
+commit 12f6d6ba2052fbdc8ea4ba7c7c9277e75bf170a5
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Sun Nov 23 18:20:14 2008 +0100
+
+    Fix a crash when the second argument of opMarkPoint is not a
+    dictionary
+
+    According to the spec "If any of the values are indirect references to
+    objects outside the content stream, the property list dictionary must
+    instead be defined as a named resource.
+
+ poppler/Gfx.cc |    2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 817e123a28e9f6b7e5be23f7ac2ba3bcec5e3f3f
+Author: Adrian Johnson <ajohnson@redneon.com>
+Date:  Sat Nov 22 21:48:37 2008 +1030
+
+    Don't compare print flag for non Type 3 fonts in cairo font cache
+
+ poppler/CairoFontEngine.cc |   7 ++++++-
+ poppler/CairoFontEngine.h  |   4 +++-
+ 2 files changed, 9 insertions(+), 2 deletions(-)
+
+commit 68f8ade28764855d4f663607c50c8202b1268296
+Author: Albert Astals Cid <tsdgeos@samsung.localdomain>
+Date:  Sun Nov 23 10:54:46 2008 +0100
+
+    Compile with -pedantic
+
+    Thanks to Bernard Leak for notifying
+
+ test/pdf-inspector.cc |    2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 4a4fa7ed44a87e47a6078a1f7bb6f41071672ea7
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Tue Nov 18 20:11:07 2008 +0100
+
+    Fix a crash when selecting text in word mode
+
+ poppler/TextOutputDev.cc |    2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit a6f5032ab0d6edbf3879f39efff7916b1f7233da
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Sun Nov 16 18:24:06 2008 +0100
+
+    optContentConfig is not actually stored in PDFDoc but in Catalog
+
+ poppler/PDFDoc.h |    1 -
+ 1 file changed, 1 deletion(-)
+
+commit b843ac34c6c4ca1580f99fa2220c59dfcd91f026
+Author: Pino Toscano <pino@kde.org>
+Date:  Sat Nov 15 14:49:02 2008 +0100
+
+    [Qt4] deserialize the value of the 'right' coordinate, too
+
+ qt4/src/poppler-link.cc |   11 ++++++-----
+ 1 file changed, 6 insertions(+), 5 deletions(-)
+
+commit 03061fdae49842556c9ff48e61914fc88502e1d8
+Author: Tim Mooney <enchanter@users.sourceforge.net>
+Date:  Thu Nov 13 22:32:22 2008 +0100
+
+    Fix build on Solaris 10 + Sun Studio 12.
+
+    Fixes bug 17496
+
+ configure.ac    |   14 ++++++++++++++
+ test/Makefile.am |    6 ++++--
+ 2 files changed, 18 insertions(+), 2 deletions(-)
+
+commit 17b18be4fd25f2ca2b4ed7382d9fda50410c44f1
+Author: Adrian Johnson <ajohnson@redneon.com>
+Date:  Wed Nov 12 20:40:57 2008 +1030
+
+    Ensure cairo font matrix is invertable
+
+    Fixes bugs #18254 and #18429
+
+ poppler/CairoOutputDev.cc |   15 ++++++++++++++-
+ 1 file changed, 14 insertions(+), 1 deletion(-)
+
+commit e2257e6916cd1067d43db9ed45f944413c61ed64
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Sun Nov 9 22:44:48 2008 +0100
+
+    Update copyrights of the last commits
+
+ poppler/CairoFontEngine.cc    |    1 +
+ poppler/CairoFontEngine.h     |    1 +
+ poppler/Form.cc              |    2 +-
+ poppler/Gfx.h                |    1 +
+ poppler/OptionalContent.h     |    1 +
+ qt4/src/poppler-optcontent.cc |    1 +
+ 6 files changed, 6 insertions(+), 1 deletion(-)
+
+commit 069f8ad9453e612e907b561aa50983c34400193d
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Sun Nov 9 20:36:06 2008 +0100
+
+    MakeItBuild
+
+ glib/CMakeLists.txt     |    1 +
+ glib/demo/CMakeLists.txt |    1 +
+ 2 files changed, 2 insertions(+)
+
+commit 04025c4f65bbb7e4330f6d17d917a035c0906f3d
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Sun Nov 9 17:03:20 2008 +0100
+
+    Fix a crash when initializing an Annot with a null catalog
+
+    Forms crate a temp annot just to get the font size of the form field
+    passing a NULL catalog.
+
+ poppler/Annot.cc |    2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 471255c5a3850984997d91c7850759eb0c7e8a9c
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Sat Nov 8 20:58:57 2008 +0100
+
+    [glib-demo] Add Optional Content demo
+
+ glib/demo/Makefile.am |    2 +
+ glib/demo/layers.c    |  511
+ +++++++++++++++++++++++++++++++++++++++++++++++++
+ glib/demo/layers.h    |   31 +++
+ glib/demo/main.c      |    4 +-
+ 4 files changed, 547 insertions(+), 1 deletion(-)
+
+commit 7363c25e1d83332932d9b4fe16d7fb4e364da628
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Sun Oct 26 19:47:35 2008 +0100
+
+    [glib] Add Optional Content support
+
+ glib/Makefile.am         |    2 +
+ glib/poppler-document.cc  |  377
+ +++++++++++++++++++++++++++++++++++++++++++++
+ glib/poppler-document.h   |   12 ++
+ glib/poppler-layer.cc    |  201 ++++++++++++++++++++++++
+ glib/poppler-layer.h     |   43 ++++++
+ glib/poppler-private.h    |   21 +++
+ glib/poppler.h                   |    3 +
+ glib/test-poppler-glib.cc |   52 ++++++-
+ 8 files changed, 710 insertions(+), 1 deletion(-)
+
+commit c674566f458b54097f21aae0d4bf8637146565c5
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Sun Oct 26 19:42:53 2008 +0100
+
+    Fix memory leaks in OptionalContent
+
+ poppler/OptionalContent.cc |  13 +++----------
+ poppler/OptionalContent.h  |  10 ++++++----
+ 2 files changed, 9 insertions(+), 14 deletions(-)
+
+commit 06ca313b8ecb8abb8dec3b418d118525b7bb0fdf
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Sun Oct 26 19:11:45 2008 +0100
+
+    Check annotation optional content properties before drawing it
+
+ poppler/Annot.cc |   20 ++++++++++++--------
+ poppler/Annot.h  |    4 ++--
+ 2 files changed, 14 insertions(+), 10 deletions(-)
+
+commit a6d58927b048aa043cb6b6ed3ee9aeb213578924
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Sat Nov 8 20:50:40 2008 +0100
+
+    Do not show hidden optional content
+
+    Before any draw operation we first check whether we are inside an
+    optional marked content element that is currently hidden.
+
+ poppler/Gfx.cc |  113
+ +++++++++++++++++++++++++++++++++++++++-----------------
+ poppler/Gfx.h |    7 +++-
+ 2 files changed, 84 insertions(+), 36 deletions(-)
+
+commit 5f168f991477e291290350a28f4a60a565e187b9
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Mon Oct 20 17:56:11 2008 +0200
+
+    [glib] Show action titles when printing the index in test program
+
+ glib/test-poppler-glib.cc |   13 ++++++++-----
+ 1 file changed, 8 insertions(+), 5 deletions(-)
+
+commit a906d12e16748d9a40c0db4043a576fd3d004341
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Sat Nov 8 20:20:00 2008 +0100
+
+    Minor code cleanup and consistency issues
+
+ poppler/OptionalContent.cc    |   22 +++++++++++-----------
+ poppler/OptionalContent.h     |    8 ++++----
+ qt4/src/poppler-optcontent.cc |    6 +++---
+ qt4/tests/check_optcontent.cpp |    8 ++++----
+ 4 files changed, 22 insertions(+), 22 deletions(-)
+
+commit e73c2ce906b7e1f06d641f7e0733aad6336b4091
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Sun Oct 19 12:44:13 2008 +0200
+
+    Delete the optContent object if it's invalid
+
+ poppler/Catalog.cc        |    4 ++++
+ poppler/OptionalContent.cc |   3 +++
+ poppler/OptionalContent.h  |   5 +++++
+ 3 files changed, 12 insertions(+)
+
+commit 2900e7e4c920d735d5a727e9e39f71df97bd7b93
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Sat Nov 8 18:12:47 2008 +0100
+
+    A new cairo is needed
+
+ CMakeLists.txt |    2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit aaaecd2e86769d3a99e21577448a193711985958
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Wed Nov 5 22:47:30 2008 +0100
+
+    Do not abort if indexHighA is 'invalid', move it to the closest
+    valid value and try with it
+
+    For the bug 18374 it works and does not seem a security problem
+
+ poppler/GfxState.cc |   7 ++++---
+ 1 file changed, 4 insertions(+), 3 deletions(-)
+
+commit 82f4228a50efe6447c68f7f6d34a7805b7e4b75e
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Wed Nov 5 20:57:17 2008 +0100
+
+    Add myself here
+
+ qt4/demos/viewer.cpp |    1 +
+ 1 file changed, 1 insertion(+)
+
+commit 8df7d83439f0e9ab200840f912f1c08bbf44bd6e
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Wed Nov 5 20:49:01 2008 +0100
+
+    [Qt4Demo] Fix leak
+
+ qt4/demos/viewer.cpp |    1 +
+ 1 file changed, 1 insertion(+)
+
+commit d3c424e0362f53bda5c4e2e415823d78ace76253
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Wed Nov 5 20:14:17 2008 +0100
+
+    Rename i to j so that code is more clear by not shadowing the
+    function parameter
+
+ poppler/Catalog.cc |   8 ++++----
+ 1 file changed, 4 insertions(+), 4 deletions(-)
+
+commit 9d12de9b59de4336eabb423f7bf0363b6a35e2a8
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Wed Nov 5 20:00:01 2008 +0100
+
+    Fix crash in case indices is NULL
+
+    Putting more than one "logical line" per "real line" is evil, we
+    think if will group it, but does not
+
+ poppler/UnicodeTypeTable.cc |   7 +++++--
+ 1 file changed, 5 insertions(+), 2 deletions(-)
+
+commit fc61dad9daa15f83802ffa5c3cd9b59d80bb310b
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Wed Nov 5 19:52:00 2008 +0100
+
+    [Qt] Fix leak
+
+ qt/poppler-link.cc |   8 +++++++-
+ 1 file changed, 7 insertions(+), 1 deletion(-)
+
+commit 981fb857b0afb1cda7836744dcf37906285512b4
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Wed Nov 5 19:49:18 2008 +0100
+
+    [Qt] Fix memory leak
+
+ qt/poppler-document.cc |    4 +++-
+ 1 file changed, 3 insertions(+), 1 deletion(-)
+
+commit e925e92d5cbfc009c138ece117227a3b0894ead6
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Wed Nov 5 19:44:40 2008 +0100
+
+    Do not leak uBuf in the error case
+
+ poppler/CharCodeToUnicode.cc |    1 +
+ 1 file changed, 1 insertion(+)
+
+commit 0741a402632ec5a8641ff11707142bf2731c1833
+Author: Adrian Johnson <ajohnson@redneon.com>
+Date:  Sat Nov 1 22:27:48 2008 +1030
+
+    Restore the cairo Type3 font image prescaling funtionality
+
+ poppler/CairoFontEngine.cc |  49
+ ++++++++++++++++++++++++++------------------
+ poppler/CairoFontEngine.h  |  20 ++++++++++--------
+ poppler/CairoOutputDev.cc  |   2 +-
+ poppler/CairoOutputDev.h   |   2 +-
+ 4 files changed, 43 insertions(+), 30 deletions(-)
+
+commit 91a7c3fdd44f30b0b50ed05a3313bbb1b5c86e71
+Author: Adrian Johnson <ajohnson@redneon.com>
+Date:  Sat Nov 1 20:57:24 2008 +1030
+
+    Remove cairo font matrix y flip when inside a Type 3 char
+
+    Not sure why this was previously required but it now produces
+    incorrect results.
+
+ poppler/CairoOutputDev.cc |   5 -----
+ 1 file changed, 5 deletions(-)
+
+commit 3bf4d7d75b455a9a0b5ee3a8c78b218e5af5185a
+Author: Adrian Johnson <ajohnson@redneon.com>
+Date:  Sat Nov 1 20:50:07 2008 +1030
+
+    Transform the glyph advance by the font matrix
+
+ poppler/CairoFontEngine.cc |   1 +
+ 1 file changed, 1 insertion(+)
+
+commit 4aa32bad61d008a854fdc9e902d6834bb1687d7e
+Author: Adrian Johnson <ajohnson@redneon.com>
+Date:  Sat Nov 1 20:49:04 2008 +1030
+
+    Use the font BBox, not the font matrix to set the Gfx BBox
+
+ poppler/CairoFontEngine.cc |   1 +
+ 1 file changed, 1 insertion(+)
+
+commit 987955440c7711f440c3d2b5cc8c05ec07228a77
+Author: Adrian Johnson <ajohnson@redneon.com>
+Date:  Sat Nov 1 20:47:05 2008 +1030
+
+    Ensure both the font matrix and y-axis flip are in the matrix
+
+    we use for transforming the glyph metrics.
+
+ poppler/CairoFontEngine.cc |   6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
+
+commit 5c051aa117477cba5d350adfc539acb4b5f2a56a
+Author: Adrian Johnson <ajohnson@redneon.com>
+Date:  Sat Nov 1 01:59:07 2008 +1030
+
+    Require cairo 1.8.2 for user-font support
+
+ configure.ac |    2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit a3edfa30680864b95a5196c5619846de42980857
+Author: Adrian Johnson <ajohnson@redneon.com>
+Date:  Sat Nov 1 01:57:32 2008 +1030
+
+    Implement Type 3 fonts in cairo backend using cairo user-fonts
+
+ poppler/CairoFontEngine.cc |  174
+ ++++++++++++++++++++++++++++++++++++++++++--
+ poppler/CairoFontEngine.h  |  18 +++++
+ poppler/CairoOutputDev.cc  |   9 ++-
+ poppler/CairoOutputDev.h   |   4 +-
+ 4 files changed, 194 insertions(+), 11 deletions(-)
+
+commit feab1e982a2ee39bb372d593633a06b6a499822f
+Author: Adrian Johnson <ajohnson@redneon.com>
+Date:  Sat Nov 1 01:21:39 2008 +1030
+
+    Add CairoOutputDev functions for getting Type 3 glyph metrics
+
+ poppler/CairoOutputDev.cc |   10 ++++++++++
+ poppler/CairoOutputDev.h  |   7 +++++++
+ 2 files changed, 17 insertions(+)
+
+commit a75efe208d899d4a23d5e2fcef200e4225721636
+Author: Adrian Johnson <ajohnson@redneon.com>
+Date:  Sat Nov 1 00:26:40 2008 +1030
+
+    Make the catalog available to CairoFontEngine
+
+ glib/poppler-document.cc   |   3 ++-
+ poppler/CairoFontEngine.cc |   2 +-
+ poppler/CairoFontEngine.h  |   3 ++-
+ poppler/CairoOutputDev.cc  |   7 +++++--
+ poppler/CairoOutputDev.h   |   3 ++-
+ test/pdf-inspector.cc     |    2 +-
+ 6 files changed, 13 insertions(+), 7 deletions(-)
+
+commit 941d3976c496b75a3c5a9d19b80044fc2b57bd98
+Author: Adrian Johnson <ajohnson@redneon.com>
+Date:  Fri Oct 31 22:44:41 2008 +1030
+
+    Allow multiple instances of CairoOutputDev to be created
+
+    for the same document that shares the same CairoFontEngine.
+
+ poppler/CairoOutputDev.cc |   16 +++++++++++-----
+ poppler/CairoOutputDev.h  |   4 +++-
+ 2 files changed, 14 insertions(+), 6 deletions(-)
+
+commit 94cff513d8589f51b243fcb078f82cb931bb6d35
+Author: Adrian Johnson <ajohnson@redneon.com>
+Date:  Fri Oct 31 21:11:01 2008 +1030
+
+    Use correct return type in _ft_new_face
+
+ poppler/CairoFontEngine.cc |   2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 0b5ee897a24ce1edfca19a3b843f9b7ee7026d07
+Author: Adrian Johnson <ajohnson@redneon.com>
+Date:  Fri Oct 31 20:55:14 2008 +1030
+
+    Refactor CairoFont
+
+    Create a CairoFreeType subclass and move the FreeType specific code
+    into it.
+
+ poppler/CairoFontEngine.cc |  197
+ +++++++++++++++++++++++++-------------------
+ poppler/CairoFontEngine.h  |  26 ++++--
+ 2 files changed, 131 insertions(+), 92 deletions(-)
+
+commit a5865dae5b414de5f6dbda2a512101050c374e06
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Tue Oct 28 10:30:59 2008 +0100
+
+    [glib] Add DISABLE_SINGLE_INCLUDES flags and fix glib-demo
+
+ configure.ac           |    4 ++++
+ glib/Makefile.am       |    3 ++-
+ glib/demo/Makefile.am  |    3 ++-
+ glib/demo/annots.h     |    2 +-
+ glib/demo/attachments.h |    2 +-
+ glib/demo/fonts.h      |    2 +-
+ glib/demo/forms.h      |    2 +-
+ glib/demo/images.h     |    2 +-
+ glib/demo/info.h       |    2 +-
+ glib/demo/links.h      |    2 +-
+ glib/demo/outline.h    |    2 +-
+ glib/demo/page.h       |    2 +-
+ glib/demo/render.h     |    2 +-
+ glib/demo/transitions.h |    2 +-
+ glib/demo/utils.h      |    2 +-
+ 15 files changed, 20 insertions(+), 14 deletions(-)
+
+commit e07bfb54b77430e10e50c33151cf0afc9854006c
+Author: Christian Persch <chpe@gnome.org>
+Date:  Tue Oct 28 10:29:51 2008 +0100
+
+    [glib] Fix build when compiling with GTK_DISABLE_SINGLE_INCLUDES
+
+ glib/poppler-page.h |   3 +--
+ 1 file changed, 1 insertion(+), 2 deletions(-)
+
+commit a84d272ffd2b593ac98148e71b83fba299c60fea
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Tue Oct 28 10:01:00 2008 +0100
+
+    [glib] Add disable deprecated compile flags and fix compile warnings
+
+ configure.ac           |    6 ++++++
+ glib/Makefile.am       |    3 ++-
+ glib/demo/Makefile.am  |    4 +++-
+ glib/demo/attachments.c |    4 ++--
+ 4 files changed, 13 insertions(+), 4 deletions(-)
+
+commit 43f2b84a81625abee84c93cdced7fb92c99cd944
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Tue Oct 21 23:00:55 2008 +0200
+
+    [Qt4] Small docu improvement
+
+ qt4/src/poppler-qt4.h |    3 +++
+ 1 file changed, 3 insertions(+)
+
+commit 00f9995b4960575cd1f392474c585f2140c8e587
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Sun Oct 12 14:20:01 2008 +0200
+
+    Do not crash if there is not font
+
+    See bug 18023 for more info
+
+ poppler/TextOutputDev.cc |    4 +++-
+ 1 file changed, 3 insertions(+), 1 deletion(-)
+
+commit 084cc4335cfe2c0e66219eba4c1177ee7ff018c5
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Fri Oct 10 23:15:35 2008 +0200
+
+    obj4 should be the index 1 on the Array, not the 0, that's already
+    obj3
+
+ poppler/Form.cc |    2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit d7442c90206d4b7a8ebc58f995647eb87ac35f42
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Thu Oct 9 22:53:00 2008 +0200
+
+    If Name is a Ref we want to get the String it references, not the Ref
+
+ poppler/OptionalContent.cc |   2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 93f8dd9e837557bbfc0f058a664c356e3d6e82c0
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Thu Oct 9 21:28:27 2008 +0200
+
+    Poppler 0.10.0
+
+ CMakeLists.txt   |    2 +-
+ NEWS            |   16 ++++++++++++++++
+ configure.ac    |    2 +-
+ msvc/config.h   |    6 +++---
+ qt4/src/Doxyfile |    2 +-
+ 5 files changed, 22 insertions(+), 6 deletions(-)
+
+commit cdd9bf016de0d3f96b1d5e304c9d02f2bf71ff18
+Author: Mark Kaplan <mkaplan@finjan.com>
+Date:  Wed Oct 8 22:29:11 2008 +0200
+
+    Initialize properly OptionalContentGroup::m_name
+
+ poppler/OptionalContent.cc |   3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+commit c7b87f3b8cbbcca29a1974debc2233f621a2e33b
+Author: Carlo Bramini <carlo.bramix@libero.it>
+Date:  Mon Oct 6 19:32:27 2008 +0200
+
+    Fix link on Mingw+Msys
+
+ test/Makefile.am |    2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit e92255296511cae9cbbac8de800d8b26e5f681f1
+Author: Pino Toscano <pino@kde.org>
+Date:  Sun Oct 5 15:57:06 2008 +0200
+
+    [Qt4] when the PDF exporting fails, delete the file if it was
+    created by
+    the (failed) exporting
+
+ qt4/src/poppler-pdf-converter.cc |   13 +++++++++++++
+ 1 file changed, 13 insertions(+)
+
+commit 360f470b852e37d400949343763a18bf598820e8
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Sat Oct 4 20:04:44 2008 +0200
+
+    Remove unused var
+
+ poppler/Annot.cc |    2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit df7317f1320513b4f66cb6618d753b82042671f5
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Sat Oct 4 19:48:57 2008 +0200
+
+    free the object
+
+ poppler/PDFDoc.cc |   4 ++++
+ 1 file changed, 4 insertions(+)
+
+commit 9946d9af9dd5d5b96d5c777413a3e253dfd1f291
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Sat Oct 4 19:39:46 2008 +0200
+
+    If we try saving a document that was encrypted, we break everything,
+    so just fail early
+
+ poppler/PDFDoc.cc |   7 +++++++
+ 1 file changed, 7 insertions(+)
+
+commit 108959432af7714cb8ffe42d98d40c97f936a2e6
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Sat Oct 4 19:39:24 2008 +0200
+
+    Correctly return wheter it was saved or not
+
+ qt4/src/poppler-pdf-converter.cc |    8 +++++---
+ 1 file changed, 5 insertions(+), 3 deletions(-)
+
+commit 4c6cb1c204d782e2ac2113b57f6d372b4716017d
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Sat Oct 4 01:46:58 2008 +0200
+
+    Remove spurious //
+
+ fofi/FoFiType1.cc |   2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit e8e7809ab4b115cbe67251da12989fc024912514
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Sat Oct 4 01:43:02 2008 +0200
+
+    There are files that have more than one encoding definition per line,
+    make them work
+
+    Fixes bug 17018, while at it, i've added some comments and some
+    error() to make things a bit clearer
+
+ fofi/FoFiType1.cc |   28 ++++++++++++++++++++++++----
+ 1 file changed, 24 insertions(+), 4 deletions(-)
+
+commit 7604e025038fee24c2cb3001f2100d5d1e48efe1
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Sat Oct 4 00:35:46 2008 +0200
+
+    Fix Poppler::Link::linkArea for rotated pages
+
+    we suck :-( Fixes kde bug 172105
+
+ qt4/src/poppler-link-extractor.cc |   3 +++
+ 1 file changed, 3 insertions(+)
+
+commit 450b21e4528a8e890d3dda37ecb0a68602f8efaa
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Wed Oct 1 00:46:29 2008 +0200
+
+    I've changed these files this year too, update copyright
+
+ goo/gmem.cc |   2 +-
+ goo/gmem.h  |   2 +-
+ 2 files changed, 2 insertions(+), 2 deletions(-)
+
+commit 98310ca24841789cf53b10d34e271ceb4e054001
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Tue Sep 30 23:59:43 2008 +0200
+
+    Fix StitchingFunction(StitchingFunction *func) and
+    GfxAxialShading(GfxAxialShading *shading)
+
+    Fixes bug 17852
+
+ poppler/Function.cc |   2 ++
+ poppler/GfxState.cc |   2 +-
+ 2 files changed, 3 insertions(+), 1 deletion(-)
+
+commit d12f5f4395eb18f8d29182e24acddd3e2b5cfe88
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Tue Sep 30 23:20:26 2008 +0200
+
+    0.9.3
+
+ CMakeLists.txt   |    2 +-
+ NEWS            |   17 +++++++++++++++++
+ configure.ac    |    2 +-
+ msvc/config.h   |    6 +++---
+ qt4/src/Doxyfile |    2 +-
+ 5 files changed, 23 insertions(+), 6 deletions(-)
+
+commit d61e464754521555a06ed0901955f49be4def29a
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Tue Sep 30 19:26:17 2008 +0200
+
+    Timothy also agreed, now Ed Catmur is the last one missing to answer
+
+ utils/ImageOutputDev.cc |    3 +++
+ utils/ImageOutputDev.h  |    3 +++
+ 2 files changed, 6 insertions(+)
+
+commit 3225f54fea7cbb6b25d7223268cdeccfdd823375
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Tue Sep 30 00:27:49 2008 +0200
+
+    And Marco said yes to GPLv2+
+
+    Only Timothy Lee and Ed Catmur left :-)
+
+ poppler/Catalog.cc |   3 +++
+ poppler/Outline.cc |   3 +++
+ poppler/Outline.h  |   3 +++
+ splash/Splash.cc   |   3 +++
+ splash/Splash.h    |   3 +++
+ 5 files changed, 15 insertions(+)
+
+commit 268d803c9dd67b7f78f8dcdc3c7653c8b2c2d08f
+Author: Warren Toomey <wkt@tuhs.org>
+Date:  Mon Sep 29 21:14:40 2008 +0200
+
+    Let HmtlOutputDev process images
+
+ utils/HtmlOutputDev.h |    3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+commit a29984ab777c64a1cb286b667a6a91ad9b191f40
+Merge: f399afe 6865872
+Author: Pino Toscano <pino@kde.org>
+Date:  Sun Sep 28 23:39:08 2008 +0200
+
+    Merge branch 'master' of
+    ssh://pino@git.freedesktop.org/git/poppler/poppler
+
+commit f399afe6f6b9c250327d0e4c5b3f2839889d7095
+Author: Pino Toscano <pino@kde.org>
+Date:  Sun Sep 28 23:38:34 2008 +0200
+
+    [Qt4] various apidox improvements
+
+ qt4/src/Mainpage.dox  |   10 +---
+ qt4/src/poppler-link.h |   92 ++++++++++++++++++++++++++++++++----
+ qt4/src/poppler-qt4.h |  121
+ ++++++++++++++++++++++++++++++++----------------
+ 3 files changed, 168 insertions(+), 55 deletions(-)
+
+commit 68658721583b05ebacb1165ac36e91d49735bbd9
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Sun Sep 28 19:29:06 2008 +0200
+
+    If tables is null, don't try to write to file as it'll crash, fixes
+    crash on 17811 when using cairooutputdev
+
+ fofi/FoFiTrueType.cc |    4 ++++
+ 1 file changed, 4 insertions(+)
+
+commit 3cb5b7fc5ae168ef58fd1905f61c1b9abe6cb86c
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Sun Sep 28 19:25:53 2008 +0200
+
+    Introduce greallocn_checkoverflow and use it in FoFiTrueType::parse
+
+    Fixes the other part of bug 17811
+
+ fofi/FoFiTrueType.cc |    4 ++--
+ goo/gmem.cc         |   21 +++++++++++++++++++++
+ goo/gmem.h          |    1 +
+ 3 files changed, 24 insertions(+), 2 deletions(-)
+
+commit aa7ef03af49f74ed558dcbab8ad4c594bb2b7d53
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Sun Sep 28 19:24:43 2008 +0200
+
+    If libjpeg tells us to abort, let's abort :D
+
+    Fixes part of bug 17811
+
+ poppler/DCTStream.cc |    1 +
+ 1 file changed, 1 insertion(+)
+
+commit e2461c9aa4d74b5511621d7222979948e31541ad
+Author: Pino Toscano <pino@kde.org>
+Date:  Sun Sep 28 18:07:25 2008 +0200
+
+    [Qt4] Activate the 'printing' flag by default in the PSConverter.
+
+ qt4/src/poppler-ps-converter.cc |    2 +-
+ qt4/src/poppler-qt4.h          |    2 ++
+ 2 files changed, 3 insertions(+), 1 deletion(-)
+
+commit 957d7acb66635e9748c6bc7a31cdbbcbb8da9011
+Author: Carlo Bramini <carlo.bramix@libero.it>
+Date:  Sat Sep 27 17:23:20 2008 +0200
+
+    Misc mingw fixes
+
+ configure.ac     |    2 +-
+ glib/Makefile.am  |   2 +-
+ glib/demo/info.cc |   1 +
+ m4/libjpeg.m4    |    2 +-
+ 4 files changed, 4 insertions(+), 3 deletions(-)
+
+commit b3828203c4e594754957033ea826e8e22164fd5b
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Fri Sep 26 23:08:14 2008 +0200
+
+    Carl agreed too, so CairoOutputDev.cc is done
+
+    Only miss, Marco Pesenti Gritti, Timothy Lee and Ed Catmur
+
+ poppler/CairoOutputDev.cc |   3 +++
+ 1 file changed, 3 insertions(+)
+
+commit a197a07728d19abc2708979c95b4ef53e88fcb55
+Author: Carlo Bramini <carlo.bramix@libero.it>
+Date:  Fri Sep 26 18:42:05 2008 +0200
+
+    Compile where localtime_r is not available
+
+ glib/demo/info.cc |   10 ++++++++--
+ 1 file changed, 8 insertions(+), 2 deletions(-)
+
+commit 38884e1722ac7e15c62cece20035c5fb0020f4b3
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Wed Sep 24 14:18:38 2008 +0200
+
+    Do what Jeff really want to do, mark the font as invalid if it matches
+    any of the known collections that Identity is not a good fallback
+
+    Fixes pdf on KDE bug 171365
+
+ poppler/GfxFont.cc |   2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 0e080aaf44816e5d5b9008f3c2fb54868932f0ac
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Wed Sep 24 13:12:13 2008 +0200
+
+    Remove non-needed X includes
+
+    Spotted by Carlo Bramini
+
+ test/gtk-cairo-test.cc |    3 ---
+ test/pdf-inspector.cc |    3 ---
+ 2 files changed, 6 deletions(-)
+
+commit 6888b023fdb199d3c5fb705bd928aedf68eeffdb
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Tue Sep 23 23:28:04 2008 +0200
+
+    Only do the scale to 'm' size trick on non embedded fonts as it was
+    meant to be
+
+    Fixes bug 17744
+
+ poppler/SplashOutputDev.cc |   4 +++-
+ 1 file changed, 3 insertions(+), 1 deletion(-)
+
+commit 539d29f4f3b24b98c9fc5f88d3477e427fbe409d
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Tue Sep 23 22:39:50 2008 +0200
+
+    0.9.2
+
+ CMakeLists.txt   |    2 +-
+ NEWS            |   19 +++++++++++++++++++
+ configure.ac    |    2 +-
+ msvc/config.h   |    6 +++---
+ qt4/src/Doxyfile |    2 +-
+ 5 files changed, 25 insertions(+), 6 deletions(-)
+
+commit abd070a79d8345bda3853395a39e4e2882c4ff8a
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Mon Sep 22 20:23:11 2008 +0200
+
+    Check the types here too
+
+    Benchmarking in release mode, both in "human feel" and callgrind
+    the benefit/lost is almost inexistant
+
+ poppler/Object.h |   36 ++++++++++++++++++++++--------------
+ 1 file changed, 22 insertions(+), 14 deletions(-)
+
+commit df47e4c441e4ec79b1bb40de7044c9501f243b76
+Author: Chris Wilson <chris@chris-wilson.co.uk>
+Date:  Tue Sep 16 12:56:04 2008 +0100
+
+    Check for duplicate open fonts.
+
+    Before creating a new FT_Face for a font, check to see if there is a
+    duplicate amongst the list of open fonts, kept alive by either
+    Poppler's
+    or Cairo's font cache .
+
+    A quick example of the benefit of this check is that it reduces the
+    RSS of
+    the Poppler converter in the Cairo test suite from over 900 MiB to
+    just 90
+    MiB.
+
+ configure.ac              |    1 +
+ poppler/CairoFontEngine.cc |  214
+ ++++++++++++++++++++++++++++++++++++++------
+ 2 files changed, 190 insertions(+), 25 deletions(-)
+
+commit 41d1edddcf84ca23c0fc39c5f4f3a49e408a9f1a
+Author: Kouhei Sutou <kou@cozmixng.org>
+Date:  Sun Sep 21 16:33:33 2008 +0200
+
+    [glib-demo] Fix a crash in forms demo
+
+ glib/demo/forms.c |   12 +++++++-----
+ 1 file changed, 7 insertions(+), 5 deletions(-)
+
+commit fe26075353226be9a02c8cf1a6a29586de15ce86
+Author: Pino Toscano <pino@kde.org>
+Date:  Sun Sep 21 12:03:21 2008 +0200
+
+    really use the key passed to it
+
+ poppler/Form.cc |    2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 8aa531cb478d6ae838a94f9f31e6a0bbd0dd957c
+Author: Pino Toscano <pino@kde.org>
+Date:  Sun Sep 21 11:18:22 2008 +0200
+
+    Read the 'readOnly' attribute directly in the FormField constructor.
+
+ poppler/Form.cc |   12 +++---------
+ 1 file changed, 3 insertions(+), 9 deletions(-)
+
+commit b56f64d676bdabd4a3ebe0eb2237f4c202a3707d
+Author: Pino Toscano <pino@kde.org>
+Date:  Sun Sep 21 00:53:54 2008 +0200
+
+    Handle streams as entries for the catalog JS name tree.
+
+ poppler/Catalog.cc |  18 +++++++++++++-----
+ 1 file changed, 13 insertions(+), 5 deletions(-)
+
+commit 93386d67b3d7adbd87547e9742e4df1c10eadbc1
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Sat Sep 20 16:20:03 2008 +0200
+
+    Compile with -pedantic
+
+ poppler/Form.h                         |    4 ++--
+ qt4/src/poppler-embeddedfile.cc |    4 ++--
+ qt4/src/poppler-movie.cc       |    3 ++-
+ qt4/src/poppler-sound.cc       |    3 ++-
+ qt4/src/poppler-textbox.cc     |    2 +-
+ 5 files changed, 9 insertions(+), 7 deletions(-)
+
+commit 6961fd8efe3db6ee7077dc2ed072498696dae31a
+Author: Tomas Are Haavet <tomasare@gmail.com>
+Date:  Sat Sep 20 16:13:37 2008 +0200
+
+    Remove some warnings and errors when compiling with gcc and -pedantic
+
+ fofi/FoFiTrueType.cc      |    3 ++-
+ glib/poppler-annot.cc     |    8 ++++----
+ glib/poppler-attachment.cc |   2 +-
+ glib/poppler-document.cc   |   6 +++---
+ glib/poppler-form-field.cc |   2 +-
+ glib/poppler-page.cc      |    2 +-
+ poppler/Annot.h           |    5 +++--
+ splash/SplashTypes.h      |    3 ++-
+ 8 files changed, 17 insertions(+), 14 deletions(-)
+
+commit 4e9a04da358b1527a08102e601a52f07930532f2
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Sat Sep 20 16:10:50 2008 +0200
+
+    Add mention of GPLv2 or later in poppler changes to all files except
+    Splash.cc and Splash.h, i've still no answer from Marco :-(
+
+ splash/SplashBitmap.cc       |    3 +++
+ splash/SplashBitmap.h       |    3 +++
+ splash/SplashErrorCodes.h    |    3 +++
+ splash/SplashFTFont.cc       |    3 +++
+ splash/SplashFTFont.h       |    3 +++
+ splash/SplashFTFontEngine.cc |    3 +++
+ splash/SplashFTFontEngine.h  |    3 +++
+ splash/SplashFTFontFile.cc   |    3 +++
+ splash/SplashFTFontFile.h    |    3 +++
+ splash/SplashFont.cc        |    3 +++
+ splash/SplashFont.h         |    3 +++
+ splash/SplashFontEngine.cc   |    3 +++
+ splash/SplashFontEngine.h    |    3 +++
+ splash/SplashFontFile.cc     |    3 +++
+ splash/SplashFontFile.h      |    3 +++
+ splash/SplashT1Font.cc       |    3 +++
+ splash/SplashT1Font.h       |    3 +++
+ splash/SplashT1FontEngine.cc |    3 +++
+ splash/SplashT1FontFile.cc   |    3 +++
+ splash/SplashT1FontFile.h    |    3 +++
+ splash/SplashTypes.h        |    3 +++
+ splash/SplashXPathScanner.cc |    3 +++
+ 22 files changed, 66 insertions(+)
+
+commit beb87362072d5b480cf6b2c02445ec17c119ff56
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Sat Sep 20 15:47:25 2008 +0200
+
+    Add Tomas' Copyright
+
+ utils/HtmlFonts.cc |   1 +
+ 1 file changed, 1 insertion(+)
+
+commit 8ccb1bb651b129875ef802356c4a229b2ce31973
+Author: Tomas Are Haavet <tomasare@gmail.com>
+Date:  Sat Sep 20 15:45:47 2008 +0200
+
+    Initialize pos the correct value to not have crashes
+
+ utils/HtmlFonts.cc |   3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+commit 77bf8ec94e36fef7e120f1dc4bb1390be71cfb97
+Author: Tomas Are Haavet <tomasare@gmail.com>
+Date:  Sat Sep 20 14:17:06 2008 +0200
+
+    Fix memory leak
+
+ utils/HtmlOutputDev.cc |    1 +
+ 1 file changed, 1 insertion(+)
+
+commit b22be54dc2205269974315ca748d835d0990d6da
+Author: Tomas Are Haavet <tomasare@gmail.com>
+Date:  Sat Sep 20 14:16:26 2008 +0200
+
+    Fix mismatched free/delete
+
+ utils/HtmlOutputDev.cc |    3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+commit ac16174da1d6f19445f78e7cd7c4a18cb9524dde
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Sat Sep 20 00:52:19 2008 +0200
+
+    make sure the image is setup before using it, otherwise some things
+    don't print correctly like PDF from bug 17645
+
+ poppler/PSOutputDev.cc |    6 ++++++
+ 1 file changed, 6 insertions(+)
+
+commit ffa4ffdf7fe83035c72addd8c4c8ee566621ba06
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Wed Sep 17 23:27:30 2008 +0200
+
+    0.9.1
+
+ CMakeLists.txt   |    2 +-
+ NEWS            |   13 +++++++++++++
+ configure.ac    |    2 +-
+ msvc/config.h   |    6 +++---
+ qt4/src/Doxyfile |    2 +-
+ 5 files changed, 19 insertions(+), 6 deletions(-)
+
+commit f57cbe32bcde0808943b9be2456dd69fa5b6dd27
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Sun Sep 14 22:18:38 2008 +0200
+
+    If when looking for an object we get objSomeNumberAfter assume it
+    was an int of SomeNumberAfter
+
+    Fixes bug 17568 and i don't see how it can break existing things
+    because it's already on an error path
+
+ poppler/XRef.cc |   25 +++++++++++++++++++++++++
+ 1 file changed, 25 insertions(+)
+
+commit 1a852064ff5a1a15bc315ddca472a0ad74292581
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Sat Sep 13 12:11:41 2008 +0200
+
+    [glib-demo] Do not try to get info about remote destinations
+
+ glib/demo/utils.c |   11 ++++++-----
+ 1 file changed, 6 insertions(+), 5 deletions(-)
+
+commit 951cffeb2cbff4e179043033b5ac7f5eb764d6dc
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Fri Sep 12 12:05:53 2008 +0200
+
+    Make sure DecryptAESState::bufIdx is never bigger than 16, otherwise
+    we crash
+
+    I am not sure this is the correct fix, but fixes crash on files of
+    bugs 13972, 16092 and 17523 and they seem to work ok
+
+ poppler/Decrypt.cc |   6 ++++++
+ 1 file changed, 6 insertions(+)
+
+commit 491109edbe827860e764b5fcb67456867923858d
+Author: Haruyuki Kawabe <Haruyuki.Kawabe@unisys.co.jp>
+Date:  Wed Sep 10 23:00:32 2008 +0200
+
+    Generate the outline file at the same place the other files are
+    generated
+
+    Fixes bug 17504
+
+ utils/HtmlOutputDev.cc |    3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+commit 7dfc1e4c9348d537896bda7b0f2ae591afc72866
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Wed Sep 10 00:03:50 2008 +0200
+
+    we want to distribute this file too
+
+ qt4/src/Makefile.am |   3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+commit ddb73e8dc1ccbddf3b170e12c7153ccaf716d7cc
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Tue Sep 9 23:47:33 2008 +0200
+
+    We want to distribute cmake/modules/FindLIBOPENJPEG.cmake too
+
+ Makefile.am |   1 +
+ 1 file changed, 1 insertion(+)
+
+commit 646ccc2bb8563d411dc25bdbab53725ae08572ba
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Tue Sep 9 23:22:17 2008 +0200
+
+    m_doc->doc->getOptContentConfig() can be null, so check for it
+
+ qt4/src/poppler-document.cc |   2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit d7f0bce67101f37f8d3e69d7d701388bcdc7200f
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Tue Sep 9 23:18:49 2008 +0200
+
+    Qt4 frontend had timezone parsing that got lost when moving to the
+    common function, i suck
+
+ glib/poppler-document.cc    |   6 ++++--
+ poppler/DateInfo.cc        |   20 ++++++++++++++------
+ poppler/DateInfo.h         |    2 +-
+ qt/poppler-document.cc      |   6 ++++--
+ qt4/src/poppler-document.cc |  22 +++++++++++++++++++---
+ utils/pdfinfo.cc           |    6 ++++--
+ utils/pdftohtml.cc         |    6 ++++--
+ 7 files changed, 50 insertions(+), 18 deletions(-)
+
+commit 0af8609e6c932de2d85168cc9147854ee84b3a1b
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Tue Sep 9 20:55:27 2008 +0200
+
+    i want this packaged too
+
+ utils/Makefile.am |   2 ++
+ 1 file changed, 2 insertions(+)
+
+commit dd0f4c1510382e17cf33d3fe163e384da1d6d289
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Tue Sep 9 20:48:04 2008 +0200
+
+    Fix includepath
+
+ fofi/FoFiTrueType.cc |    2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 16c0842c3e01608a72709af55cc5cb8b567efedf
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Tue Sep 9 20:36:18 2008 +0200
+
+    API changed, so increase soname
+
+ glib/CMakeLists.txt |   2 +-
+ glib/Makefile.am    |   2 +-
+ 2 files changed, 2 insertions(+), 2 deletions(-)
+
+commit 217c0d1f80a78713977a7bfbe680fce90f1c6b36
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Mon Sep 8 23:56:28 2008 +0200
+
+    change version to 0.9.0
+
+    Now only need to wait for Carlos and Iñigo's answer to a BIC change
+    in glib/ and we'll have 0.9.0 :-)
+
+ CMakeLists.txt   |    2 +-
+ configure.ac    |    2 +-
+ msvc/config.h   |    6 +++---
+ qt4/src/Doxyfile |    2 +-
+ 4 files changed, 6 insertions(+), 6 deletions(-)
+
+commit e34022a8fcfb9fe211dd6b561377d855972b2087
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Mon Sep 8 23:36:04 2008 +0200
+
+    Increase soname for libpoppler, i'm almost sure we broke BC there
+
+ CMakeLists.txt      |   2 +-
+ poppler/Makefile.am |   2 +-
+ 2 files changed, 2 insertions(+), 2 deletions(-)
+
+commit bc275049d6ef083daf71a043ccf23fd0634f5c4d
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Mon Sep 8 23:33:24 2008 +0200
+
+    soname 3.1.0 for qt4 libs, we are BC/SC but got new API
+
+ qt4/src/CMakeLists.txt |    2 +-
+ qt4/src/Makefile.am   |    2 +-
+ 2 files changed, 2 insertions(+), 2 deletions(-)
+
+commit 06743a25a73adc3fba95f7b4ad74a6dde1a54ead
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Mon Sep 8 23:23:06 2008 +0200
+
+    added news for 0.9.0
+
+ NEWS |  115
+ ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+ 1 file changed, 115 insertions(+)
+
+commit d35ca2ce5df12d40e295873e44b1f18ea40ba897
+Author: Pino Toscano <pino@kde.org>
+Date:  Sun Sep 7 01:13:33 2008 +0200
+
+    [Qt4] apidox improvements
+
+ qt4/src/poppler-annotation.h |   70
+ +++++++++++++++++++++++++++++++++++++++---
+ qt4/src/poppler-link.h       |   12 +++++---
+ qt4/src/poppler-qt4.h       |   22 +++++++++++--
+ 3 files changed, 93 insertions(+), 11 deletions(-)
+
+commit 796d4c002d47c85716775d173eddfb2ae8866eaf
+Author: Pino Toscano <pino@kde.org>
+Date:  Sat Sep 6 22:48:13 2008 +0200
+
+    no more need for including the qt3 paths
+
+ qt4/demos/CMakeLists.txt |    1 -
+ qt4/src/CMakeLists.txt   |    1 -
+ qt4/tests/CMakeLists.txt |    1 -
+ 3 files changed, 3 deletions(-)
+
+commit db7ee3b3ae0f42155f9245691e4bfdef98a8ed6f
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Sat Sep 6 23:16:05 2008 +0200
+
+    [Qt4] Fix docu
+
+ qt4/src/poppler-qt4.h |    2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 3366059a25611f19ab592cda18c5efe0b9359771
+Author: Pino Toscano <pino@kde.org>
+Date:  Sat Sep 6 16:34:58 2008 +0200
+
+    [Qt4] add option flags for the PS converter
+
+    - map the 'strictMargins' and 'forceRasterize' bool options as flags
+    - add a flag for setting the "printing" mode
+
+ qt4/src/poppler-ps-converter.cc |   34 ++++++++++++++++++++++++++--------
+ qt4/src/poppler-qt4.h          |   26 ++++++++++++++++++++++++++
+ 2 files changed, 52 insertions(+), 8 deletions(-)
+
+commit afa26d5c9ac9feb61aad30eb65dc00c9854d7f2e
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Sat Sep 6 15:46:12 2008 +0200
+
+    we are printing so pass the print flag as true
+
+ qt/poppler-document.cc |    2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit f5d1eb5eaabaf3ab4bb87b8b4b901bbf30b20b29
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Sat Sep 6 15:43:32 2008 +0200
+
+    We are pringint here, so pass the printing flag as true
+
+    Fixes KDE bug 170459, you'd wonder how many times i've made the
+    same mistake...
+
+ qt4/src/poppler-ps-converter.cc |    2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 58e828d732f06bae9133dd518d89fa4348f1cca8
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Fri Sep 5 18:45:23 2008 +0200
+
+    Only like QtTest to the tests, not to the lib itself
+
+ configure.ac         |   13 +++++++++++--
+ qt4/tests/Makefile.am |   22 +++++++++++-----------
+ 2 files changed, 22 insertions(+), 13 deletions(-)
+
+commit 49b3e4560f62a9a7db350d94d50e229f5e1208bf
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Fri Sep 5 18:17:45 2008 +0200
+
+    Movie filename is not a string, but a File Specification
+
+    Fixes a crash when filename is a dictionary
+
+ poppler/Annot.cc |    8 +++++---
+ 1 file changed, 5 insertions(+), 3 deletions(-)
+
+commit 996d2e176057e22acbc374cff7a712ce6fd92d93
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Fri Sep 5 18:17:25 2008 +0200
+
+    Unify multiple File Specification parsers
+
+ CMakeLists.txt                |    2 +
+ poppler/FileSpec.cc   |  146
+ ++++++++++++++++++++++++++++++++++++++++++++++++
+ poppler/FileSpec.h    |   24 ++++++++
+ poppler/Link.cc       |  104 +++++-----------------------------
+ poppler/Link.h                |    4 --
+ poppler/Makefile.am   |    2 +
+ poppler/PSOutputDev.cc |   35 +-----------
+ poppler/PSOutputDev.h |    1 -
+ poppler/Sound.cc      |    7 ++-
+ 9 files changed, 197 insertions(+), 128 deletions(-)
+
+commit 31f3eb2d6b43f7fbf4d978730d109b08b1563989
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Wed Sep 3 21:49:23 2008 +0200
+
+    Only set the state to true if the AS value is the same as parent's V
+
+    Fixes bug 16121 and 15535
+
+ poppler/Form.cc |    8 ++++++--
+ 1 file changed, 6 insertions(+), 2 deletions(-)
+
+commit c75abac7ba07990ef54a46fa0d429eea580a71ef
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Tue Sep 2 19:16:55 2008 +0200
+
+    Kjartan was missing and just agreed
+
+ utils/HtmlOutputDev.cc |    3 +++
+ 1 file changed, 3 insertions(+)
+
+commit 630aa133017d15ddc7bf96c79f43c5b60fa9749a
+Merge: b2bc9b3 de82255
+Author: Pino Toscano <pino@kde.org>
+Date:  Tue Sep 2 01:25:55 2008 +0200
+
+    Merge branch 'master' of
+    ssh://pino@git.freedesktop.org/git/poppler/poppler
+
+commit b2bc9b3f59ef8e5fea18f0bc91b71fc9eb9a4157
+Author: Pino Toscano <pino@kde.org>
+Date:  Tue Sep 2 01:24:39 2008 +0200
+
+    [Qt4] small apidox improvements
+
+    mostly the start of the \since marker addition, plus few other
+    documentation addition/improvements
+
+ qt4/src/poppler-annotation.h |    9 +++++++
+ qt4/src/poppler-form.h       |    8 ++++++
+ qt4/src/poppler-link.h       |   14 +++++++---
+ qt4/src/poppler-optcontent.h |   11 ++++++++
+ qt4/src/poppler-qt4.h       |   59
+ ++++++++++++++++++++++++++++++++++++------
+ 5 files changed, 90 insertions(+), 11 deletions(-)
+
+commit 6bc4881477ea15d70d420e57b5663052f2f9df76
+Author: Pino Toscano <pino@kde.org>
+Date:  Tue Sep 2 00:47:56 2008 +0200
+
+    expand the macros, extract poppler-optcontent.h
+
+    enable the macro expansion and define POPPLER_QT4_EXPORT to be
+    empty, so
+    we don't have it in the apidox
+
+ qt4/src/Doxyfile |    8 +++++---
+ 1 file changed, 5 insertions(+), 3 deletions(-)
+
+commit de822554acdb1b2bc9e70c0668c43a10c0ec129a
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Mon Sep 1 23:50:37 2008 +0200
+
+    Initialize widget to null before calling initialize not after :-(
+
+ poppler/Annot.cc |    2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 1a7b7199112d97e816a099cbc1a5672c83e64156
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Mon Sep 1 20:42:06 2008 +0200
+
+    Add my copyright
+
+ poppler/Dict.cc |    1 +
+ 1 file changed, 1 insertion(+)
+
+commit 1fef34782a003f46fceab0d3bed36212bbf32c4c
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Mon Sep 1 20:35:37 2008 +0200
+
+    Find reverse way in Dict
+
+    This fixes Greg Stolze - Marriage Of Virtue & Viciousness.pdf
+    The issue with this pdf is that has a Dict with two entries with
+    the same key
+    The pdf spec says if that happens, results are undefined, but Acroread
+    uses the
+    second key while we were using the first, searching backwards we
+    use the second now too and the pdf works
+
+ poppler/Dict.cc |    2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit bb7996eaaad6a70404891bb2ff530160737ea3d7
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Mon Sep 1 20:29:25 2008 +0200
+
+    Do not crash on documents with no pages
+
+ qt4/tests/test-poppler-qt4.cpp |    6 ++++++
+ 1 file changed, 6 insertions(+)
+
+commit 0c11d390e4b0e3765ae20968359c7562c9857db7
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Mon Sep 1 20:13:33 2008 +0200
+
+    All poppler commiters to these files agreed to GPLv2+
+
+    Still missing to answer
+    Marco Pesenti Gritti
+       Catalog.cc
+       Outline.cc
+       Outline.h
+
+    Kjartan Maraas
+       HtmlOutputDev.cc
+
+    Timothy Lee
+       ImageOutputDev.h
+       ImageOutputDev.cc
+
+    Carl Worth
+       CairoOutputDev.cc
+
+    Ed Catmur
+       GfxFont.cc
+       GlobalParams.cc
+       TextOutputDev.cc
+       TextOutputDev.h
+       UnicodeTypeTable.cc
+       UnicodeTypeTable.h
+
+ poppler/Annot.cc            |    3 +++
+ poppler/Annot.h             |    3 +++
+ poppler/Array.cc            |    3 +++
+ poppler/Array.h             |    3 +++
+ poppler/ArthurOutputDev.cc   |    3 +++
+ poppler/ArthurOutputDev.h    |    3 +++
+ poppler/CMap.cc             |    3 +++
+ poppler/CMap.h                      |    3 +++
+ poppler/CairoFontEngine.cc   |    3 +++
+ poppler/CairoFontEngine.h    |    3 +++
+ poppler/CairoOutputDev.h     |    3 +++
+ poppler/Catalog.h           |    3 +++
+ poppler/CharCodeToUnicode.cc |    3 +++
+ poppler/CharCodeToUnicode.h  |    3 +++
+ poppler/Decrypt.cc          |    3 +++
+ poppler/Decrypt.h           |    3 +++
+ poppler/Dict.cc             |    3 +++
+ poppler/Dict.h                      |    3 +++
+ poppler/Error.cc            |    3 +++
+ poppler/Error.h             |    3 +++
+ poppler/Function.cc         |    3 +++
+ poppler/Gfx.cc                      |    3 +++
+ poppler/Gfx.h               |    3 +++
+ poppler/GfxFont.h           |    3 +++
+ poppler/GfxState.cc         |    3 +++
+ poppler/GfxState.h          |    3 +++
+ poppler/GlobalParams.h       |    3 +++
+ poppler/JBIG2Stream.cc       |    3 +++
+ poppler/JPXStream.cc        |    3 +++
+ poppler/Lexer.cc            |    3 +++
+ poppler/Lexer.h             |    3 +++
+ poppler/Link.cc             |    3 +++
+ poppler/Link.h                      |    3 +++
+ poppler/Object.cc           |    3 +++
+ poppler/Object.h            |    3 +++
+ poppler/OutputDev.cc        |    3 +++
+ poppler/OutputDev.h         |    3 +++
+ poppler/PDFDoc.cc           |    3 +++
+ poppler/PDFDoc.h            |    3 +++
+ poppler/PDFDocEncoding.cc    |    3 +++
+ poppler/PDFDocEncoding.h     |    3 +++
+ poppler/PSOutputDev.cc       |    3 +++
+ poppler/PSOutputDev.h       |    3 +++
+ poppler/PSTokenizer.cc       |    3 +++
+ poppler/PSTokenizer.h       |    3 +++
+ poppler/Page.cc             |    3 +++
+ poppler/Page.h                      |    3 +++
+ poppler/Parser.cc           |    3 +++
+ poppler/Parser.h            |    3 +++
+ poppler/SplashOutputDev.cc   |    3 +++
+ poppler/SplashOutputDev.h    |    3 +++
+ poppler/Stream-CCITT.h       |    3 +++
+ poppler/Stream.cc           |    3 +++
+ poppler/Stream.h            |    3 +++
+ poppler/UTF8.h                      |    3 +++
+ poppler/XRef.cc             |    3 +++
+ poppler/XRef.h                      |    3 +++
+ utils/HtmlFonts.cc          |    3 +++
+ utils/HtmlLinks.cc          |    3 +++
+ utils/HtmlOutputDev.h       |    3 +++
+ utils/parseargs.c           |    3 +++
+ utils/parseargs.h           |    3 +++
+ utils/pdffonts.cc           |    3 +++
+ utils/pdfimages.cc          |    3 +++
+ utils/pdfinfo.cc            |    3 +++
+ utils/pdftohtml.cc          |    3 +++
+ utils/pdftoppm.cc           |    3 +++
+ utils/pdftops.cc            |    3 +++
+ utils/pdftotext.cc          |    3 +++
+ 69 files changed, 207 insertions(+)
+
+commit 8670bfed7900586725b30e3af67f6849acc6efda
+Author: Vasile Gaburici <gaburici@cs.umd.edu>
+Date:  Sat Aug 30 12:47:13 2008 +0200
+
+    Fix extraction of images
+
+    See bug 16999 for more info
+
+ utils/ImageOutputDev.cc |   12 +++++++++++-
+ 1 file changed, 11 insertions(+), 1 deletion(-)
+
+commit 1c98f197664b1a2c06e2caf32116a8487f4054bf
+Author: Vasile Gaburici <gaburici@cs.umd.edu>
+Date:  Sat Aug 30 12:44:02 2008 +0200
+
+    Read sMap reverse so CMap entries take precedence
+
+    See bug 17321 for a more in depth explanation
+
+ poppler/CharCodeToUnicode.cc |    3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+commit 8f1deb3f8000bdeb845a6c786a654bc7eb684f0a
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Fri Aug 29 23:06:19 2008 +0200
+
+    Are we a lib or aren't we? Unify String to Date parsing so we all
+    behave the same way
+
+ CMakeLists.txt                             |    2 ++
+ glib/poppler-document.cc           |   29 ++--------------
+ poppler/DateInfo.cc                |   62
+ +++++++++++++++++++++++++++++++++++
+ poppler/DateInfo.h                 |   27 +++++++++++++++
+ poppler/Makefile.am                |    2 ++
+ qt/poppler-document.cc                     |   22 ++-----------
+ qt4/src/poppler-annotation-helper.h |  16 ++-------
+ qt4/src/poppler-document.cc        |   52 +++--------------------------
+ utils/pdfinfo.cc                   |   16 ++-------
+ utils/pdftohtml.cc                 |    9 ++---
+ 10 files changed, 111 insertions(+), 126 deletions(-)
+
+commit c39f23dca98d3efe8d094c9a3e1bd460ba57d1ce
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Fri Aug 29 20:50:57 2008 +0200
+
+    Add a readme for contributors with licensing and misc info
+
+ README.contributors |  20 ++++++++++++++++++++
+ 1 file changed, 20 insertions(+)
+
+commit 35a72590ffd3284e63601af79599e5fa025e567f
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Thu Aug 28 00:58:11 2008 +0200
+
+    Be more protective against huge font sizes in bogus documents like
+    the one in http://bugs.freedesktop.org/show_bug.cgi?id=17326
+
+    10 MB in size is a font of 3200x3200, huge enough to be discarted
+
+ poppler/SplashOutputDev.cc |  20 +++++++++++++++++++-
+ 1 file changed, 19 insertions(+), 1 deletion(-)
+
+commit 33727cf6773b12d736ba245fdd146559ce93102d
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Sun Aug 24 20:36:13 2008 +0200
+
+    fix location of the comment
+
+ fofi/FoFiType1.cc |   6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
+
+commit abe29b4fdb33f449649fdea5d7af2deeb702f0bb
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Sun Aug 24 20:24:35 2008 +0200
+
+    All changes made to fofi/ files under the poppler project are by
+    people that accepts to license the code under GPLv2+
+
+ fofi/FoFiBase.cc     |    3 +++
+ fofi/FoFiTrueType.cc |    3 +++
+ fofi/FoFiTrueType.h  |    3 +++
+ fofi/FoFiType1.cc    |    3 +++
+ fofi/FoFiType1C.h    |    3 +++
+ 5 files changed, 15 insertions(+)
+
+commit 6346d7050a03935c71336c65d5f8f0fe2860d321
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Sun Aug 24 20:23:50 2008 +0200
+
+    All changes made to goo/ files under the poppler project are by
+    people that accepts to license the code under GPLv2+
+
+ goo/GooString.cc |    3 +++
+ goo/GooString.h  |    3 +++
+ goo/gfile.cc    |    3 +++
+ goo/gfile.h     |    3 +++
+ goo/gmem.cc     |    3 +++
+ goo/gmem.h      |    3 +++
+ 6 files changed, 18 insertions(+)
+
+commit d6e1f1fb4e83527d3ece51d98fa20262713b7da1
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Sun Aug 24 20:22:06 2008 +0200
+
+    .cc -> .h
+
+ poppler/FontInfo.h |   2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 9f0ac70f7ad806cadce379d4fabb90eff697ad52
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Sun Aug 24 19:25:27 2008 +0200
+
+    Add missing addresses
+
+ poppler/ABWOutputDev.cc |    4 ++--
+ poppler/ABWOutputDev.h  |    2 +-
+ poppler/FlateStream.cc  |    2 +-
+ poppler/FlateStream.h  |    2 +-
+ 4 files changed, 5 insertions(+), 5 deletions(-)
+
+commit 22f6af73961686895f207fe13022a21333455862
+Merge: 12a9e42 6d6913a
+Author: Pino Toscano <pino@kde.org>
+Date:  Sun Aug 24 19:03:24 2008 +0200
+
+    Merge branch 'master' of
+    ssh://pino@git.freedesktop.org/git/poppler/poppler
+
+commit 12a9e427fb487165b1797f81d52d733c27bfa2e1
+Author: Pino Toscano <pino@kde.org>
+Date:  Sun Aug 24 18:57:52 2008 +0200
+
+    [Qt4] add showControl and playMode properties of MovieObject's
+
+ qt4/src/poppler-movie.cc |   14 ++++++++++++++
+ qt4/src/poppler-qt4.h   |   20 ++++++++++++++++++++
+ 2 files changed, 34 insertions(+)
+
+commit c444c652859b6e52160e5571e84f8eb1292d65f1
+Author: Pino Toscano <pino@kde.org>
+Date:  Sun Aug 24 18:47:58 2008 +0200
+
+    [Qt4] make the MovieObject ctor private, with only Page able to use it
+
+ qt4/src/poppler-qt4.h |    9 +++++----
+ 1 file changed, 5 insertions(+), 4 deletions(-)
+
+commit 6d6913a79779769ce0fe2f0b516a90a50e51b947
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Sun Aug 24 18:45:45 2008 +0200
+
+    fix Jeff's entry
+
+ poppler/DCTStream.cc |    2 +-
+ poppler/DCTStream.h  |    2 +-
+ 2 files changed, 2 insertions(+), 2 deletions(-)
+
+commit 25bd5967f9f550a32e20eea91cd00cbeff98249e
+Author: Pino Toscano <pino@kde.org>
+Date:  Sun Aug 24 18:45:25 2008 +0200
+
+    [Qt4] initialize the MovieObject from an AnnotMovie
+
+    the annotation has all the data we need, so just init from that
+
+ qt4/src/poppler-movie.cc |    8 ++++----
+ qt4/src/poppler-page.cc  |    4 +---
+ qt4/src/poppler-qt4.h   |    4 ++--
+ 3 files changed, 7 insertions(+), 9 deletions(-)
+
+commit 47f54ad4de111f62a5b8c25520ef6b2bca6026d2
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Sun Aug 24 18:18:13 2008 +0200
+
+    Add more correct copyright statements on fofi, goo, poppler and
+    util directories to be more compliant with GPL that requires such
+    modification statements to be present. Meanwhile i did that, i did
+    qt and qt4 dirs too, glib is missing if someone wants to fix it,
+    but it's not crucial as it's not a fork of some other GPL software
+
+ AUTHORS                                 |    4 +++-
+ fofi/FoFiBase.cc                        |   11 +++++++++++
+ fofi/FoFiTrueType.cc                    |   14 ++++++++++++++
+ fofi/FoFiTrueType.h                     |   12 ++++++++++++
+ fofi/FoFiType1.cc                       |   12 ++++++++++++
+ fofi/FoFiType1C.h                       |   11 +++++++++++
+ goo/GooString.cc                        |   13 +++++++++++++
+ goo/GooString.h                         |   12 ++++++++++++
+ goo/GooTimer.cc                         |    3 +++
+ goo/GooTimer.h                                  |    8 ++++++--
+ goo/GooVector.h                         |   12 ++++++++++++
+ goo/gfile.cc                            |   13 +++++++++++++
+ goo/gfile.h                             |   11 +++++++++++
+ goo/gmem.cc                             |   13 +++++++++++++
+ goo/gmem.h                              |   13 +++++++++++++
+ poppler/ABWOutputDev.cc                 |    3 ++-
+ poppler/ABWOutputDev.h                          |    2 +-
+ poppler/Annot.cc                        |   19 +++++++++++++++++++
+ poppler/Annot.h                         |   17 +++++++++++++++++
+ poppler/Array.cc                        |   11 +++++++++++
+ poppler/Array.h                         |   11 +++++++++++
+ poppler/ArthurOutputDev.cc              |   14 +++++++++++++-
+ poppler/ArthurOutputDev.h               |   13 ++++++++++++-
+ poppler/CMap.cc                         |   12 ++++++++++++
+ poppler/CMap.h                                  |   11 +++++++++++
+ poppler/CairoFontEngine.cc              |   17 +++++++++++++++++
+ poppler/CairoFontEngine.h               |   17 +++++++++++++++++
+ poppler/CairoOutputDev.cc               |   19 +++++++++++++++++++
+ poppler/CairoOutputDev.h                |   16 ++++++++++++++++
+ poppler/Catalog.cc                      |   19 +++++++++++++++++++
+ poppler/Catalog.h                       |   16 ++++++++++++++++
+ poppler/CharCodeToUnicode.cc            |   14 ++++++++++++++
+ poppler/CharCodeToUnicode.h             |   13 +++++++++++++
+ poppler/DCTStream.cc                    |    5 ++++-
+ poppler/DCTStream.h                     |    6 +++++-
+ poppler/Decrypt.cc                      |   12 ++++++++++++
+ poppler/Decrypt.h                       |   11 +++++++++++
+ poppler/Dict.cc                         |   13 +++++++++++++
+ poppler/Dict.h                                  |   13 +++++++++++++
+ poppler/Error.cc                        |   13 +++++++++++++
+ poppler/Error.h                         |   13 +++++++++++++
+ poppler/FlateStream.cc                          |    2 ++
+ poppler/FlateStream.h                   |    2 ++
+ poppler/FontInfo.cc                     |   22 ++++++++++++++++++++++
+ poppler/FontInfo.h                      |   21 +++++++++++++++++++++
+ poppler/Form.cc                         |   10 +++++++++-
+ poppler/Form.h                                  |    6 +++++-
+ poppler/Function.cc                     |   12 ++++++++++++
+ poppler/Gfx.cc                                  |   23 +++++++++++++++++++++++
+ poppler/Gfx.h                           |   13 +++++++++++++
+ poppler/GfxFont.cc                      |   19 +++++++++++++++++++
+ poppler/GfxFont.h                       |   16 ++++++++++++++++
+ poppler/GfxState.cc                     |   14 ++++++++++++++
+ poppler/GfxState.h                      |   13 +++++++++++++
+ poppler/GlobalParams.cc                 |   19 +++++++++++++++++++
+ poppler/GlobalParams.h                          |   15 +++++++++++++++
+ poppler/JBIG2Stream.cc                          |   13 +++++++++++++
+ poppler/JPXStream.cc                    |   11 +++++++++++
+ poppler/Lexer.cc                        |   12 ++++++++++++
+ poppler/Lexer.h                         |   12 ++++++++++++
+ poppler/Link.cc                         |   14 ++++++++++++++
+ poppler/Link.h                                  |   12 ++++++++++++
+ poppler/Movie.cc                        |   17 ++++++++++++++++-
+ poppler/Object.cc                       |   11 +++++++++++
+ poppler/Object.h                        |   12 ++++++++++++
+ poppler/OptionalContent.cc              |    5 ++++-
+ poppler/Outline.cc                      |   11 +++++++++++
+ poppler/Outline.h                       |   11 +++++++++++
+ poppler/OutputDev.cc                    |   13 +++++++++++++
+ poppler/OutputDev.h                     |   14 ++++++++++++++
+ poppler/PDFDoc.cc                       |   15 +++++++++++++++
+ poppler/PDFDoc.h                        |   15 +++++++++++++++
+ poppler/PDFDocEncoding.cc               |   13 ++++++++++++-
+ poppler/PDFDocEncoding.h                |   11 +++++++++++
+ poppler/PSOutputDev.cc                          |   15 +++++++++++++++
+ poppler/PSOutputDev.h                   |   14 ++++++++++++++
+ poppler/PSTokenizer.cc                          |   12 ++++++++++++
+ poppler/PSTokenizer.h                   |   11 +++++++++++
+ poppler/Page.cc                         |   20 ++++++++++++++++++++
+ poppler/Page.h                                  |   16 ++++++++++++++++
+ poppler/PageLabelInfo.cc                |   12 ++++++++++++
+ poppler/PageLabelInfo.h                 |   12 ++++++++++++
+ poppler/PageTransition.h                |   18 ++++++++++++++++++
+ poppler/Parser.cc                       |   12 ++++++++++++
+ poppler/Parser.h                        |   11 +++++++++++
+ poppler/SplashOutputDev.cc              |   16 ++++++++++++++++
+ poppler/SplashOutputDev.h               |   11 +++++++++++
+ poppler/Stream-CCITT.h                          |   11 +++++++++++
+ poppler/Stream.cc                       |   14 ++++++++++++++
+ poppler/Stream.h                        |   13 +++++++++++++
+ poppler/TextOutputDev.cc                |   18 ++++++++++++++++++
+ poppler/TextOutputDev.h                 |   15 +++++++++++++++
+ poppler/UTF8.h                                  |   11 +++++++++++
+ poppler/UnicodeTypeTable.cc             |   13 +++++++++++++
+ poppler/UnicodeTypeTable.h              |   11 +++++++++++
+ poppler/XRef.cc                         |   17 ++++++++++++++++-
+ poppler/XRef.h                                  |   14 ++++++++++++++
+ qt/poppler-document.cc                          |    3 +++
+ qt/poppler-fontinfo.cc                          |    3 +--
+ qt/poppler-page.cc                      |    7 ++++++-
+ qt/poppler-private.h                    |    4 ++++
+ qt/poppler-qt.h                         |    5 ++++-
+ qt4/src/poppler-annotation-helper.h     |    1 +
+ qt4/src/poppler-annotation.cc           |    3 ++-
+ qt4/src/poppler-annotation.h            |    4 +++-
+ qt4/src/poppler-document.cc             |    4 +++-
+ qt4/src/poppler-embeddedfile.cc         |    1 +
+ qt4/src/poppler-fontinfo.cc             |    5 ++++-
+ qt4/src/poppler-form.cc                 |    2 +-
+ qt4/src/poppler-form.h                          |    2 +-
+ qt4/src/poppler-link-extractor-private.h |    2 +-
+ qt4/src/poppler-link-extractor.cc       |    2 +-
+ qt4/src/poppler-link.cc                 |    3 ++-
+ qt4/src/poppler-link.h                          |    1 +
+ qt4/src/poppler-optcontent-private.h    |    1 +
+ qt4/src/poppler-optcontent.cc           |    1 +
+ qt4/src/poppler-optcontent.h            |    1 +
+ qt4/src/poppler-page-private.h                  |    2 ++
+ qt4/src/poppler-page.cc                 |    4 ++++
+ qt4/src/poppler-private.h               |    4 +++-
+ qt4/src/poppler-ps-converter.cc         |    1 +
+ qt4/src/poppler-qt4.h                   |    5 ++++-
+ qt4/src/poppler-textbox.cc              |    2 ++
+ splash/Splash.cc                        |   12 ++++++++++++
+ splash/Splash.h                         |   12 ++++++++++++
+ splash/SplashBitmap.cc                          |   12 ++++++++++++
+ splash/SplashBitmap.h                   |   11 +++++++++++
+ splash/SplashErrorCodes.h               |   11 +++++++++++
+ splash/SplashFTFont.cc                          |   12 ++++++++++++
+ splash/SplashFTFont.h                   |   11 +++++++++++
+ splash/SplashFTFontEngine.cc            |   11 +++++++++++
+ splash/SplashFTFontEngine.h             |   11 +++++++++++
+ splash/SplashFTFontFile.cc              |   11 +++++++++++
+ splash/SplashFTFontFile.h               |   11 +++++++++++
+ splash/SplashFont.cc                    |   11 +++++++++++
+ splash/SplashFont.h                     |   11 +++++++++++
+ splash/SplashFontEngine.cc              |   11 +++++++++++
+ splash/SplashFontEngine.h               |   11 +++++++++++
+ splash/SplashFontFile.cc                |   12 ++++++++++++
+ splash/SplashFontFile.h                 |   12 ++++++++++++
+ splash/SplashT1Font.cc                          |   11 +++++++++++
+ splash/SplashT1Font.h                   |   11 +++++++++++
+ splash/SplashT1FontEngine.cc            |   11 +++++++++++
+ splash/SplashT1FontFile.cc              |   11 +++++++++++
+ splash/SplashT1FontFile.h               |   11 +++++++++++
+ splash/SplashTypes.h                    |   11 +++++++++++
+ splash/SplashXPathScanner.cc            |   11 +++++++++++
+ utils/HtmlFonts.cc                      |   24 ++++++++++++++++++++++++
+ utils/HtmlFonts.h                       |   12 ++++++++++++
+ utils/HtmlLinks.cc                      |   23 +++++++++++++++++++++++
+ utils/HtmlLinks.h                       |   12 ++++++++++++
+ utils/HtmlOutputDev.cc                          |   13 +++++++++++++
+ utils/HtmlOutputDev.h                   |   11 +++++++++++
+ utils/ImageOutputDev.cc                 |   13 +++++++++++++
+ utils/ImageOutputDev.h                          |   12 ++++++++++++
+ utils/parseargs.c                       |   13 +++++++++++++
+ utils/parseargs.h                       |   11 +++++++++++
+ utils/pdffonts.cc                       |   12 ++++++++++++
+ utils/pdfimages.cc                      |   11 +++++++++++
+ utils/pdfinfo.cc                        |   12 ++++++++++++
+ utils/pdftoabw.cc                       |   26
+ +++++++++++++++++++-------
+ utils/pdftohtml.cc                      |   11 +++++++++++
+ utils/pdftoppm.cc                       |   11 +++++++++++
+ utils/pdftops.cc                        |   12 ++++++++++++
+ utils/pdftotext.cc                      |   12 ++++++++++++
+ 165 files changed, 1795 insertions(+), 37 deletions(-)
+
+commit 0dfbb8996ee91aa044eb2bdf2859ef64005116f8
+Author: Loïc Minier <lool@dooz.org>
+Date:  Wed Aug 20 22:10:07 2008 +0200
+
+    Fixes escaping of hyphens in man pages
+
+ utils/pdfinfo.1 |    2 +-
+ utils/pdftops.1 |   16 ++++++++--------
+ 2 files changed, 9 insertions(+), 9 deletions(-)
+
+commit 6cfa0e598a81460e5d0a7d60d8584366d2a70165
+Author: Loïc Minier <lool@dooz.org>
+Date:  Wed Aug 20 19:57:42 2008 +0200
+
+    Fix synopsis of pdftops in man page to clarify that a PDF file is
+    required in all cases
+
+ utils/pdftops.1 |    4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 48a73cc709a8bed9d2d0f9cbd2a9d2b6c0dad05b
+Author: Pino Toscano <pino@kde.org>
+Date:  Sat Aug 23 19:26:01 2008 +0200
+
+    [Qt4] convert the title of movie annotations
+
+ qt4/src/poppler-page.cc |    6 ++++++
+ 1 file changed, 6 insertions(+)
+
+commit 419ec15ac825f2e0052b411462f00ac57fed030e
+Author: Pino Toscano <pino@kde.org>
+Date:  Sat Aug 23 19:25:04 2008 +0200
+
+    [Qt4] get/set the title for movie annotations
+
+ qt4/src/poppler-annotation.cc |   13 +++++++++++++
+ qt4/src/poppler-annotation.h  |    3 +++
+ 2 files changed, 16 insertions(+)
+
+commit 63bcaf113fcb5a4a9e5c120df2c3dafb2977c90a
+Author: Pino Toscano <pino@kde.org>
+Date:  Sat Aug 23 01:58:30 2008 +0200
+
+    [Qt4] convert the movie annotation from the core type to the Qt4 one
+
+ qt4/src/poppler-page.cc |   18 +++++++++++++++---
+ 1 file changed, 15 insertions(+), 3 deletions(-)
+
+commit 5cc490de74af12726bdeb9b5a6a0f0d1d79383b5
+Author: Pino Toscano <pino@kde.org>
+Date:  Sat Aug 23 01:55:41 2008 +0200
+
+    [Qt4] first version of a MovieAnnotation
+
+    right mow it just holds the movie object
+
+ qt4/src/poppler-annotation.cc |   74
+ +++++++++++++++++++++++++++++++++++++++++
+ qt4/src/poppler-annotation.h  |   26 ++++++++++++++-
+ 2 files changed, 99 insertions(+), 1 deletion(-)
+
+commit 3d5c2e22d790d7c139e1cd28aebb21cfe76b8b6b
+Author: Pino Toscano <pino@kde.org>
+Date:  Sat Aug 23 01:54:30 2008 +0200
+
+    compile the new poppler-movie.cc
+
+ qt4/src/CMakeLists.txt |    1 +
+ qt4/src/Makefile.am   |    1 +
+ 2 files changed, 2 insertions(+)
+
+commit 599698a9b133999f1f0bb0548489111e9d7b6f05
+Author: Pino Toscano <pino@kde.org>
+Date:  Sat Aug 23 01:52:58 2008 +0200
+
+    [Qt4] first version of a MovieObject object for movies
+
+    slightly differs from the version in core
+
+ qt4/src/poppler-movie.cc |   73
+ ++++++++++++++++++++++++++++++++++++++++++++++
+ qt4/src/poppler-qt4.h   |   34 +++++++++++++++++++++
+ 2 files changed, 107 insertions(+)
+
+commit 820f15009845870701e1f4e7f4fc4fb93312ab3e
+Author: Pino Toscano <pino@kde.org>
+Date:  Sat Aug 23 01:45:07 2008 +0200
+
+    fix Movie::copy()
+
+    the default copy ctor already does the vertbatim copies, so no need to
+    do them on our own; what needs to be done is checking whether
+    an object
+    is valid before either doing a "smart copy" or "postprocessing" it
+
+ poppler/Movie.cc |   14 ++++++++------
+ 1 file changed, 8 insertions(+), 6 deletions(-)
+
+commit c3a006ae35250e9a5638c2ce713b7470380751c7
+Author: Pino Toscano <pino@kde.org>
+Date:  Sat Aug 23 01:04:34 2008 +0200
+
+    compile attachments.c in the demo with cmake as well
+
+ glib/demo/CMakeLists.txt |    1 +
+ 1 file changed, 1 insertion(+)
+
+commit b5a7987a50b3d28fbfa219e2cef85b9e53aaf079
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Thu Aug 21 20:40:18 2008 +0200
+
+    [glib-demo] Fix attachments demo with documents that don't contain
+    attachments
+
+ glib/demo/attachments.c |   27 ++++++++++++++++++++-------
+ 1 file changed, 20 insertions(+), 7 deletions(-)
+
+commit a2b0aefedbdb20ce0ef8398a700202021fcf00db
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Thu Aug 21 20:14:50 2008 +0200
+
+    [glib-demo] Fix typo
+
+ glib/demo/attachments.c |    4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 9e563d6d877624b1caf82ac30c5ae30a1eb48f21
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Thu Aug 21 20:12:33 2008 +0200
+
+    [glib-demo] Add checksum validation to attachments demo
+
+ glib/demo/attachments.c |  101
+ +++++++++++++++++++++++++++++++++++++++++++++++
+ 1 file changed, 101 insertions(+)
+
+commit e233325e6f13d8b232bf68a2812fe755e7fccd4d
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Thu Aug 21 19:03:32 2008 +0200
+
+    [glib-demo] Add demo for attachments
+
+ glib/demo/Makefile.am  |    2 +
+ glib/demo/attachments.c |  242
+ +++++++++++++++++++++++++++++++++++++++++++++++
+ glib/demo/attachments.h |   31 ++++++
+ glib/demo/main.c       |    4 +-
+ glib/demo/utils.c      |   23 +++++
+ glib/demo/utils.h      |    1 +
+ 6 files changed, 302 insertions(+), 1 deletion(-)
+
+commit 0e2efa0fce5bf059ce85d3e3bec2293b405ec3c9
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Thu Aug 21 19:02:24 2008 +0200
+
+    [glib] Make sure name and descripction are valid utf8 strings
+
+ glib/poppler-attachment.cc |   4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 15a73704ab6b009ca5e07c08f0b12d970adc387d
+Author: Chris Wilson <chris@chris-wilson.co.uk>
+Date:  Tue Aug 19 09:18:03 2008 +0100
+
+    Memleak and invalid free.
+
+    CairoOutputDev::setSoftMask() fails to free the cairo_t and mask
+    it uses
+    to draw the opaque soft mask and attempts to destroy a reference to a
+    surface it does not own (this bug was masked by the fact that
+    a reference
+    was still being held by the unfreed cairo_t).
+
+ poppler/CairoOutputDev.cc |   11 ++++++++---
+ 1 file changed, 8 insertions(+), 3 deletions(-)
+
+commit d3110e392097db54e9ee59300213e490dee39126
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Tue Aug 19 19:19:09 2008 +0200
+
+    Fix include so it can be used in the unsupported way of installing
+    internal poppler/ headers
+
+    Notified by Caolan McNamara <caolanm@redhat.com>
+
+ poppler/PreScanOutputDev.h |   2 +-
+ poppler/SecurityHandler.h  |   2 +-
+ 2 files changed, 2 insertions(+), 2 deletions(-)
+
+commit 303249e5548bfbf6823e97850e498970d802b4a0
+Author: Albert Astals Cid <tsdgeos@samsung.localdomain>
+Date:  Fri Aug 15 01:52:52 2008 +0200
+
+    Revert 123a87aff2e35b10efe6a1d715585b427e4a9afa it creates problems
+    with some pdf files
+
+ poppler/Gfx.cc |   14 ++------------
+ poppler/Gfx.h |    3 ---
+ 2 files changed, 2 insertions(+), 15 deletions(-)
+
+commit 27ddf3c5e839358c8553d41743faa8ee304767bf
+Author: Pino Toscano <pino@kde.org>
+Date:  Wed Aug 13 13:55:57 2008 +0200
+
+    [Qt4] make sure to use the correct page width/height for form
+    widgets coordinates
+
+ qt4/src/poppler-form.cc |   12 +++++++++---
+ 1 file changed, 9 insertions(+), 3 deletions(-)
+
+commit 2e7b0eb4af8cf5938833e5659d01b77096e7b7f7
+Author: Pino Toscano <pino@kde.org>
+Date:  Tue Aug 12 13:49:52 2008 +0200
+
+    [Qt4] add a method to get the activation action of a FormField
+
+ qt4/src/poppler-form.cc |   19 +++++++++++++++++++
+ qt4/src/poppler-form.h  |    8 ++++++++
+ 2 files changed, 27 insertions(+)
+
+commit f9e679adbd6830da26eb9909bcb16e3bdf0da6b4
+Author: Pino Toscano <pino@kde.org>
+Date:  Tue Aug 12 13:47:15 2008 +0200
+
+    create a static version of PageData::convertLinkActionToLink()
+
+ qt4/src/poppler-page-private.h |    2 ++
+ qt4/src/poppler-page.cc       |    5 +++++
+ 2 files changed, 7 insertions(+)
+
+commit a6ecc864ea3e94d7232cff6a2e8f49919d8f24ff
+Author: Albert Astals Cid <tsdgeos@samsung.localdomain>
+Date:  Tue Aug 12 01:23:21 2008 +0200
+
+    initialize widget, fixes crash on EC2006.pdf
+
+ poppler/Annot.cc |    1 +
+ 1 file changed, 1 insertion(+)
+
+commit 123a87aff2e35b10efe6a1d715585b427e4a9afa
+Author: Albert Astals Cid <tsdgeos@samsung.localdomain>
+Date:  Tue Aug 12 00:37:09 2008 +0200
+
+    Cache the last created GfxResource, very useful because some pdf
+    created by pstopdf push and pop the same GfxResource all the time
+
+    This brings us a speedup of 16 times (from 11 seconds to about 600
+    msec) in kde bug 168663
+
+ poppler/Gfx.cc |   14 ++++++++++++--
+ poppler/Gfx.h |    3 +++
+ 2 files changed, 15 insertions(+), 2 deletions(-)
+
+commit 5ad1a12183f4b8e328f32386a74b5616e7e59070
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Mon Aug 4 20:34:42 2008 +0200
+
+    Be less strict when parsing TTF tables
+
+    With this change and freetype from CVS i can render Bug 16940 using
+    the splash renderer
+
+ fofi/FoFiTrueType.cc |    8 +++++++-
+ 1 file changed, 7 insertions(+), 1 deletion(-)
+
+commit d322720428fa416b7d5f23acc72d1d4b4f74d041
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Mon Aug 4 20:16:50 2008 +0200
+
+    Report an error when FoFiTrueType::load or FoFiTrueType::make fail
+
+ poppler/SplashOutputDev.cc |   5 +++++
+ 1 file changed, 5 insertions(+)
+
+commit 901ebc84ff7c0872c3f9f5e6eaf418ba6400fa10
+Author: Pino Toscano <pino@kde.org>
+Date:  Sun Aug 3 10:54:09 2008 +0200
+
+    [Qt4] Make the paper color setting working as it should.
+
+    A BGR colorspace means that colors should be set as blue,green,red,
+    and
+    not red,green,blue.
+
+ qt4/src/poppler-private.h |   8 ++++----
+ 1 file changed, 4 insertions(+), 4 deletions(-)
+
+commit 66b34c78943be598778a3ef438b0cefac668c6a2
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Sat Aug 2 13:54:34 2008 +0200
+
+    This should not be here, breaks jpeg rendering when not using libjpeg
+
+    That was included erroneously when the file writing code was added
+
+ poppler/Stream.cc |   1 -
+ 1 file changed, 1 deletion(-)
+
+commit fd8d71ea8b12393201ece9c09372fd69c7573025
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Fri Aug 1 23:47:51 2008 +0200
+
+    These defines are unneeded too
+
+ msvc/poppler/poppler-config.h |   30 ------------------------------
+ poppler-config.h.cmake        |   30 ------------------------------
+ poppler/poppler-config.h.in   |   30 ------------------------------
+ 3 files changed, 90 deletions(-)
+
+commit 391b5d5cdd9f63fe90229f88cdad628fb63c0206
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Fri Aug 1 23:36:09 2008 +0200
+
+    Get rid of more defines, say our version on command line tools,
+    also say our copyright
+
+    Did not modify PSOutputDev.cc output as PS is too fragile
+
+ msvc/poppler/poppler-config.h |    9 +--------
+ poppler-config.h.cmake        |    9 +--------
+ poppler/PSOutputDev.cc        |    2 +-
+ poppler/poppler-config.h.in   |    9 +--------
+ utils/pdffonts.cc            |    3 ++-
+ utils/pdfimages.cc           |    3 ++-
+ utils/pdfinfo.cc             |    3 ++-
+ utils/pdftohtml.cc           |    3 ++-
+ utils/pdftoppm.cc            |    3 ++-
+ utils/pdftops.cc             |    3 ++-
+ utils/pdftotext.cc           |    3 ++-
+ 11 files changed, 18 insertions(+), 32 deletions(-)
+
+commit d14fb1513be045363f7edec21cee04fd4937ede2
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Fri Aug 1 23:14:28 2008 +0200
+
+    Add GooList *getEncodingNames();
+
+    Forgot to commit this earlier :-(
+
+ poppler/GlobalParams.cc |   19 +++++++++++++++++++
+ poppler/GlobalParams.h  |    2 ++
+ 2 files changed, 21 insertions(+)
+
+commit 9fd34443d765ccd61864d18bceadc049d905b957
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Fri Aug 1 23:09:39 2008 +0200
+
+    remove defines we don't use at all
+
+ msvc/poppler/poppler-config.h |    4 ----
+ poppler-config.h.cmake        |    4 ----
+ poppler/poppler-config.h.in   |    4 ----
+ 3 files changed, 12 deletions(-)
+
+commit 0f13013dc3079915572b6b002dac8d01d2dbde04
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Fri Aug 1 23:06:50 2008 +0200
+
+    xpdfrc has been dead for a while
+
+ msvc/poppler/poppler-config.h |   25 -------------------------
+ poppler-config.h.cmake        |   25 -------------------------
+ poppler/poppler-config.h.in   |   25 -------------------------
+ 3 files changed, 75 deletions(-)
+
+commit 96392667d1331d2f8750f27c116e34bbf9282dca
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Fri Aug 1 22:20:55 2008 +0200
+
+    Provide a default constructor for FontInfo so you can use it as
+    metatype for qvariant
+
+ qt4/src/poppler-fontinfo.cc |   5 +++++
+ qt4/src/poppler-private.h   |   7 +++++++
+ qt4/src/poppler-qt4.h      |    5 +++++
+ 3 files changed, 17 insertions(+)
+
+commit 9fd1077e63d97a316380b8df4821bf4c9434fb52
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Fri Aug 1 17:47:51 2008 +0200
+
+    Build with cmake too
+
+ utils/CMakeLists.txt |    4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit d8d6a3f46620d45c279b7ca1a4a2fa3a36285cde
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Fri Aug 1 17:44:07 2008 +0200
+
+    Improve manpages and add -listenc to pdfinfo and pdftotext in the way
+
+    Our manpages listed things like xpdfrc and -cfg options we don't
+    support at all.
+    Also some options were missing from the man pages
+    Finally there was the -enc option you completely had to guess which
+    string to pass,
+    so i've added the -listenc option to get the user the list of
+    encodings he can use
+
+ utils/Makefile.am      |    2 ++
+ utils/pdffonts.1       |   18 ------------------
+ utils/pdfimages.1      |   14 --------------
+ utils/pdfinfo.1        |   28 ++++------------------------
+ utils/pdfinfo.cc       |   16 ++++++++++++++--
+ utils/pdftoppm.1       |   42 +++++++++++++++++++++---------------------
+ utils/pdftops.1        |   41 +++--------------------------------------
+ utils/pdftotext.1      |   32 ++++----------------------------
+ utils/pdftotext.cc     |   16 ++++++++++++++--
+ utils/printencodings.cc |   34 ++++++++++++++++++++++++++++++++++
+ utils/printencodings.h  |   24 ++++++++++++++++++++++++
+ 11 files changed, 120 insertions(+), 147 deletions(-)
+
+commit f5b0ca794b0879e3d239bf1d6138b15ead27d9ca
+Author: Adrian Johnson <ajohnson@redneon.com>
+Date:  Tue Jul 29 20:18:33 2008 +0930
+
+    Fix ActualText string length check in TextOutputDev.cc
+
+ poppler/TextOutputDev.cc |    2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 21bbdc9d663995336900f1ce97cf294f04464e01
+Author: Boris Toloknov <tlknv@yandex.ru>
+Date:  Mon Jul 28 21:02:07 2008 +0200
+
+    make xml output valid xml
+
+ utils/HtmlLinks.cc    |   33 +++++++++++++++++--
+ utils/HtmlOutputDev.cc |   85
+ ++++++++++++++++++++++++++++++------------------
+ 2 files changed, 85 insertions(+), 33 deletions(-)
+
+commit dccfc4c2910b47a77cd7b6019d9365f1684ffd0c
+Author: Boris Toloknov <tlknv@yandex.ru>
+Date:  Mon Jul 28 20:58:13 2008 +0200
+
+    Limit ascent and descent are to reasonable values.
+
+    See bug 16592 to cases where this helps
+
+ utils/HtmlOutputDev.cc |   14 ++++++++++++--
+ 1 file changed, 12 insertions(+), 2 deletions(-)
+
+commit 0fd5a3db1ddad447d44b64eff9abfb077a7853a0
+Author: Boris Toloknov <tlknv@yandex.ru>
+Date:  Mon Jul 28 20:52:19 2008 +0200
+
+    Make html output to keep all the spaces with &nbsp;
+
+ utils/HtmlFonts.cc    |    2 ++
+ utils/HtmlOutputDev.cc |    2 +-
+ 2 files changed, 3 insertions(+), 1 deletion(-)
+
+commit 650c73fa0f570f699d907e33060fb23290940b42
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Mon Jul 28 20:44:13 2008 +0200
+
+    findDest crashes on null goostrings so rework the ifs a bit
+
+ utils/HtmlOutputDev.cc |   16 +++++++++-------
+ 1 file changed, 9 insertions(+), 7 deletions(-)
+
+commit adee9c0e9e8b2de20309b3ae6eb8e6d6ed05cf85
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Sat Jul 26 00:04:03 2008 +0200
+
+    We are not storing the ctu, so decref and leak-- :-)
+
+ poppler/Annot.cc |    1 +
+ 1 file changed, 1 insertion(+)
+
+commit e7b3e3ae3080bd6f239f7d96761729ad30b075ae
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Fri Jul 25 23:52:28 2008 +0200
+
+    Fix leak
+
+ qt4/src/poppler-form.cc |    1 +
+ 1 file changed, 1 insertion(+)
+
+commit 006b974d4faae53e6bd51a4281dd923ab1c2d4e8
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Fri Jul 25 23:15:11 2008 +0200
+
+    Fix memory leak
+
+ poppler/Annot.cc |    1 +
+ 1 file changed, 1 insertion(+)
+
+commit 3a549d75acceedfa25dcf79074d0cdfb643c746e
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Fri Jul 25 23:08:21 2008 +0200
+
+    Free the previous modified object in case it exists
+
+ poppler/XRef.cc |    1 +
+ 1 file changed, 1 insertion(+)
+
+commit 040d244b97a554342061c777a286e99dbb9acabd
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Fri Jul 25 21:31:55 2008 +0200
+
+    Need this or otherwise it crashes on complete overwrite
+
+ poppler/PDFDoc.cc |   1 +
+ 1 file changed, 1 insertion(+)
+
+commit 11ebceeef938a7e6fa9b5437e65b5b4b822f3018
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Fri Jul 25 21:30:24 2008 +0200
+
+    Fix my last fix about saving, i think this is the correct one
+
+     - One incremental update only write the modified entries xref,
+     not all
+     - Update gen to 0 when resizing entries
+     - On XRef::add correctly initialize all newly allocated entries
+
+ poppler/PDFDoc.cc |   4 ++--
+ poppler/XRef.cc   |   57
+ ++++++++++++++++++++++++++++++++++++++++++-----------
+ poppler/XRef.h    |   2 +-
+ 3 files changed, 49 insertions(+), 14 deletions(-)
+
+commit 03d445f485f90972ab1c05d79b2999b763ab7377
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Fri Jul 25 20:16:54 2008 +0200
+
+    Fix XRef::writeToFile after my change
+
+ poppler/XRef.cc |   10 +++-------
+ 1 file changed, 3 insertions(+), 7 deletions(-)
+
+commit 136fa97576f2df0d7a7563b34651ca222927ea57
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Fri Jul 25 20:12:51 2008 +0200
+
+    Fix XRef::add and XRef::addIndirectObject, also remove num from
+    XRefEntry
+
+    Previous code was under some incorrect assumptions:
+     * our XRef does not maintain the free link list so if you want to
+       find a free entry you have to go though all of them
+     * our XRefEntry does not need a num because the index itself is
+     the num
+
+    Conflicts:
+
+       poppler/XRef.cc
+
+ poppler/XRef.cc |   70
+ ++++++++++++++++++++-----------------------------------
+ poppler/XRef.h  |    1 -
+ 2 files changed, 25 insertions(+), 46 deletions(-)
+
+commit 55572b77da95c47393b78f3aff804ea9c5ae17e5
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Tue Jul 22 22:50:00 2008 +0200
+
+    Really do what the comment says and also init changeLeft, changeTop
+    and changeZoom
+
+ poppler/Link.cc |    1 +
+ 1 file changed, 1 insertion(+)
+
+commit 8dc7afaeea08183de331ecfd41ce1971e7772fd0
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Tue Jul 22 21:05:03 2008 +0200
+
+    Some documents have loops in XObject dictionaries, make sure we
+    don't get in an infinite loop while traversing them
+
+    Fixes infinite loop on http://bugs.kde.org/show_bug.cgi?id=166145
+
+ poppler/FontInfo.cc |  44 ++++++++++++++++++++++++++++++++++++--------
+ poppler/FontInfo.h  |   4 ++++
+ 2 files changed, 40 insertions(+), 8 deletions(-)
+
+commit 9fb17c952dcff798e45280eeb9c718680147e766
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Sun Jul 20 13:47:11 2008 +0200
+
+    Fix condition, we want thumb to be a Stream, not to be non null
+
+    Fixes bug 16579
+
+ glib/poppler-page.cc |    2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 3696025977fd345b12767f75a2de6ed7e9467365
+Author: Pino Toscano <pino@kde.org>
+Date:  Fri Jul 18 23:32:25 2008 +0200
+
+    initialize pageWidgets, otherwise it can be a rubbish pointer
+    is Annots
+    is not a valid object
+
+ poppler/Page.cc |    1 +
+ 1 file changed, 1 insertion(+)
+
+commit 0189ff8b86de18486f7397076f7a0fbf133a1a33
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Tue Jul 1 20:16:50 2008 +0200
+
+    Fix condition, we want fetched_thumb to be a Stream, not to be
+    non null
+
+    Fixes bug 16579
+
+ poppler/Page.cc |    2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 5bd77dcdd5220d63934f4b3e78d85a936947a53d
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Tue Jul 1 00:49:01 2008 +0200
+
+    forgot about we use autofoo too
+
+ qt4/tests/Makefile.am |    5 +++++
+ 1 file changed, 5 insertions(+)
+
+commit 5ed2503003d973b5461594af15485af49591451d
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Tue Jul 1 00:43:26 2008 +0200
+
+    unittesting about ActualText
+
+ qt4/tests/CMakeLists.txt      |    1 +
+ qt4/tests/check_actualtext.cpp |   33 +++++++++++++++++++++++++++++++++
+ 2 files changed, 34 insertions(+)
+
+commit f3bb2eb556f5248242f6db85052ef045fcb697c6
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Tue Jul 1 00:41:35 2008 +0200
+
+    Unbreak ActualText extraction
+
+ poppler/Gfx.cc |   10 +---------
+ 1 file changed, 1 insertion(+), 9 deletions(-)
+
+commit 9e9543b105b39f8b0048c00fc94741e43ad615e9
+Author: Pino Toscano <pino@kde.org>
+Date:  Thu Jun 26 20:19:06 2008 +0200
+
+    use FindPackageHandleStandardArgs
+
+ cmake/modules/FindLIBOPENJPEG.cmake |  11 ++---------
+ 1 file changed, 2 insertions(+), 9 deletions(-)
+
+commit fec41ceddebe194f139bcc5b2f3fa74e7d1ae502
+Author: Pino Toscano <pino@kde.org>
+Date:  Thu Jun 26 20:18:27 2008 +0200
+
+    need to use LIBOPENJPEG_FOUND, as it really represents whether
+    libopenjpeg was found or not
+
+ CMakeLists.txt |   18 +++++++++---------
+ 1 file changed, 9 insertions(+), 9 deletions(-)
+
+commit 5498d93e59a0b79e5add3dc6181d5e98ba689217
+Author: Michael Vrable <mvrable@cs.ucsd.edu>
+Date:  Fri Jun 20 21:42:34 2008 -0700
+
+    Use a single global FT_Library in CairoOutputDev
+
+    Cairo may internally keep references to the FreeType fonts loaded in
+    CairoFontEngine even after poppler is done with them.  Commit
+    42db4890e829
+    ("Do not call FT_Done_Face on a live cairo_font_face_t") introduced
+    a fix
+    for one use-after-free bug, by delaying deleting an FT_Face objects
+    until
+    cairo is done with it.
+
+    That fix doesn't correct all the bugs.  An FT_Library object is
+    created for
+    each CairoOutputDev object, and deleted when the CairoOutputDev
+    goes away.
+    But the FT_Library object should not be deleted while fonts loaded
+    using it
+    are still in use.  And cairo can keep references to fonts around
+    more or
+    less indefinitely.
+
+    To more fully fix the problem, we can either:
+     1. Keep a count of not-yet-deleted fonts associated with each
+     FT_Library,
+       and wait to call FT_Done_FreeType until it drops to zero.
+     2. Never call FT_Done_FreeType.
+
+    The second option is the simplest. To avoid leaking memory FT_Library
+    objects, use a single global FT_Library instead of a
+    per-CairoOutputDev
+    copy.
+
+ poppler/CairoOutputDev.cc |   18 +++++++++++++++---
+ poppler/CairoOutputDev.h  |   4 +++-
+ 2 files changed, 18 insertions(+), 4 deletions(-)
+
+commit c75632d62a052d3c3739b96f5586f97c68baf25b
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Tue Jun 24 02:31:43 2008 +0200
+
+    Open in WriteOnly mode, fixes the fact that when writing to an
+    existing file, the contents beyond what we wrote were still there
+
+ qt4/src/poppler-base-converter.cc |   2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 9810fdfc54aac80aa99561a9d820d11b062e4637
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Tue Jun 24 02:12:21 2008 +0200
+
+    the entry is not updated here either, fix uninitialized variable use
+
+ poppler/XRef.cc |    1 +
+ 1 file changed, 1 insertion(+)
+
+commit 2da15db4751d3cb93d40b48e348dbc51f6e7a29f
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Fri Jun 20 11:39:08 2008 +0200
+
+    Do not create an OCGs object if there isn't an OCProperties dictionary
+    in the Catalog
+
+ poppler/Catalog.cc        |    5 +++--
+ poppler/Gfx.cc                    |   12 +++++++++++-
+ poppler/OptionalContent.cc |  25 +++++--------------------
+ 3 files changed, 19 insertions(+), 23 deletions(-)
+
+commit d6fb5dcb7b7596961800d9744d17b6adb8d9a2ad
+Author: Michael Vrable <mvrable@cs.ucsd.edu>
+Date:  Wed Jun 18 11:24:05 2008 -0700
+
+    Fix a crash in the cairo backend with Type 3 glyphs
+
+    Commit 86b7e8a3bee7 ("Ensure cairo renders Type 3 glyphs with only
+    the fill
+    color") introduced a bug into the Cairo backend, causing evince
+    to crash
+    with the message
+       evince: cairo-pattern.c:679: cairo_pattern_destroy: Assertion
+       `((*&(&pattern->ref_count)->ref_count) > 0)' failed.
+    Fix this by updating reference counts to the fill and stroke
+    patterns when
+    modifying them in beginType3Char.
+
+    Simplify the code as well by not saving the old stroke pattern before
+    overriding it; this is already done since beginType3Char/endType3Char
+    is
+    wrapped by calls to saveState/restoreState in Gfx::doShowText.
+
+ poppler/CairoOutputDev.cc |   4 ++--
+ poppler/CairoOutputDev.h  |   2 +-
+ 2 files changed, 3 insertions(+), 3 deletions(-)
+
+commit c3a00c83f1d24c1f88e7ed3b3f772460e578f3cc
+Author: Pino Toscano <pino@kde.org>
+Date:  Sun Jun 15 02:39:31 2008 +0200
+
+    poppler-page-transition.h is here now
+
+ qt4/src/Doxyfile |    2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 2affed0fc97b958ae46f531c471a3cf0b04c0f55
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Sat Jun 14 01:24:49 2008 +0200
+
+    Give warnings if the build configuration for stream decoders is
+    different from default one
+
+ configure.ac |   20 +++++++++++++++++---
+ 1 file changed, 17 insertions(+), 3 deletions(-)
+
+commit 8e74bc612cb4102891324ffdbfcdb47293ecb95e
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Sat Jun 14 01:13:53 2008 +0200
+
+    Warn the user if he does not have any enabled rendering backend
+
+ configure.ac |    3 +++
+ 1 file changed, 3 insertions(+)
+
+commit 99d2361032cbaafd69bd796170757ed6482f208d
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Sat Jun 14 00:53:38 2008 +0200
+
+    Add a JPEG2000 decoder based on OpenJPEG
+
+    Enabled by default since it's generally better than xpdf one
+    See
+    http://lists.freedesktop.org/archives/poppler/2008-June/003874.html
+    for more information
+
+ CMakeLists.txt                             |   30 +++++-
+ cmake/modules/FindLIBOPENJPEG.cmake |  44 +++++++++
+ configure.ac                       |   33 +++++++
+ poppler/JPEG2000Stream.cc          |  181
+ +++++++++++++++++++++++++++++++++++
+ poppler/JPEG2000Stream.h           |   48 ++++++++++
+ poppler/Makefile.am                |   22 ++++-
+ poppler/Stream.cc                  |    7 +-
+ 7 files changed, 360 insertions(+), 5 deletions(-)
+
+commit e368838d7f9691c7b1adf7d7f62f65abed91eea7
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Wed Jun 11 00:48:53 2008 +0200
+
+    [Qt4] Add the possibility of getting a QByteArray with the data of
+    an embedded font
+
+ qt4/src/poppler-document.cc |  23 +++++++++++++++++++++++
+ qt4/src/poppler-private.h   |   3 +++
+ qt4/src/poppler-qt4.h      |    5 +++++
+ 3 files changed, 31 insertions(+)
+
+commit 184292ffb8fef5aa5a72bdbfcc0c95b663f452bd
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Tue Jun 10 23:00:11 2008 +0200
+
+    Make the fontRef and the embRef accessible to FontInfo users
+
+ poppler/FontInfo.cc |   2 +-
+ poppler/FontInfo.h  |   3 +++
+ 2 files changed, 4 insertions(+), 1 deletion(-)
+
+commit 86b7e8a3bee74c5b89c451137cf9c2758ba6913f
+Author: Adrian Johnson <ajohnson@redneon.com>
+Date:  Sun Jun 8 18:00:05 2008 +0930
+
+    Ensure cairo renders Type 3 glyphs with only the fill color
+
+ poppler/CairoOutputDev.cc |   3 +++
+ poppler/CairoOutputDev.h  |   2 +-
+ 2 files changed, 4 insertions(+), 1 deletion(-)
+
+commit 99e2d95728f41c91ab59a01c62d82b19a7a2e083
+Author: Adrian Johnson <ajohnson@redneon.com>
+Date:  Sun Jun 1 00:49:32 2008 +0930
+
+    glib: save/restore cairo state when rendering a page
+
+ glib/poppler-page.cc |    2 ++
+ 1 file changed, 2 insertions(+)
+
+commit 6f40ee4af6b59f9d2c326adc8d2574e45f4d4d29
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Sun Jun 8 23:46:04 2008 +0200
+
+    Make sure we use Qt4 moc to generate moc files of the qt4 frontend
+
+ configure.ac         |   20 ++++++++++++++++++++
+ qt4/demos/Makefile.am |    2 +-
+ qt4/src/Makefile.am   |    2 +-
+ qt4/tests/Makefile.am |    2 +-
+ 4 files changed, 23 insertions(+), 3 deletions(-)
+
+commit 86aa8fc0708f7da4a907a8bdb1845e53d29892b7
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Thu Jun 5 19:21:08 2008 +0200
+
+    Fix leak on ABWOutputDev.cc
+
+ poppler/ABWOutputDev.cc |    2 ++
+ 1 file changed, 2 insertions(+)
+
+commit 979ef1cafa968d776a2b804ce555b11212212397
+Author: Koji Otani <sho@bbr.jp>
+Date:  Tue Jun 3 21:07:15 2008 +0200
+
+    Support for surrogates outside the BMP plane
+
+ poppler/TextOutputDev.cc |   19 ++++++++++++++++++-
+ poppler/UTF8.h                  |   14 ++++++++++++++
+ 2 files changed, 32 insertions(+), 1 deletion(-)
+
+commit 1614ab3036cf25c9b94967163996678d386ce0ac
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Sun Jun 1 16:32:55 2008 +0200
+
+    Do not limit CharCodeToUnicodeString to 8 characters
+
+ poppler/Annot.cc            |   10 +++++-----
+ poppler/CharCodeToUnicode.cc |   37 ++++++++++++++++++++----------------
+ poppler/CharCodeToUnicode.h  |    2 +-
+ poppler/Gfx.cc                      |    8 ++++----
+ poppler/GfxFont.cc          |   43
+ +++++++++++++++++++++++-------------------
+ poppler/GfxFont.h           |    6 +++---
+ poppler/PSOutputDev.cc       |    4 ++--
+ 7 files changed, 60 insertions(+), 50 deletions(-)
+
+commit bf95c6970dacaa62512de858cf60ff6cf0c1bf7c
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Sun Jun 1 00:07:11 2008 +0200
+
+    [Qt] Fix leak when calling Poppler::Document::scanForFonts
+
+ qt/poppler-document.cc |    1 +
+ 1 file changed, 1 insertion(+)
+
+commit d21d7271fc74ab78cd157549138d0027cf179471
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Sat May 31 23:57:31 2008 +0200
+
+    Make sure file exists before printing it
+
+ utils/HtmlOutputDev.cc |    2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 0480a788c0f25af1bc09360b599debb37f831e10
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Tue May 27 23:20:32 2008 +0200
+
+    require gthread-2.0
+
+ cmake/modules/FindGTK.cmake |   9 +++++----
+ 1 file changed, 5 insertions(+), 4 deletions(-)
+
+commit 2e40ef652eb9fca7fe947acb2adfecc96ad3c50e
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Mon May 26 22:13:38 2008 +0200
+
+    Do not shadow a paramer with a local variable name
+
+ qt4/src/poppler-page.cc |    8 ++++----
+ 1 file changed, 4 insertions(+), 4 deletions(-)
+
+commit 1fd856aa1fb48869111e5b86f263bfd94fa7af17
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Mon May 26 20:52:53 2008 +0200
+
+    Do not leak tSplash if transpGroupStack->blendingColorSpace is NULL
+
+ poppler/SplashOutputDev.cc |   4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 492209ec8648342a3a5447611f3f1ce63b63e8e9
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Mon May 26 20:51:06 2008 +0200
+
+    Move variables only used inside the loop inside the loop, fix delete
+    of uninitialized data due to my previous patch
+
+ poppler/Page.cc |   16 ++++++----------
+ 1 file changed, 6 insertions(+), 10 deletions(-)
+
+commit 79ab8cceb318f3bb5ebad431824e3ae593aea340
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Mon May 26 20:38:59 2008 +0200
+
+    Do not leak memory if data_out is NULL
+
+ poppler/Page.cc |   35 ++++++++++++++++++-----------------
+ 1 file changed, 18 insertions(+), 17 deletions(-)
+
+commit f44c33344d4af31ee008826179bcd92db445f35a
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Sun May 25 19:16:12 2008 +0200
+
+    [glib] Init glib threads in demo app as required by g_timer
+
+ configure.ac    |    4 ++--
+ glib/demo/main.c |    4 ++++
+ 2 files changed, 6 insertions(+), 2 deletions(-)
+
+commit 58d5b7b9ab9ac245481299c4765f3bd305580d2e
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Wed May 21 22:18:29 2008 +0200
+
+    [Qt4] Fix text() method
+
+    I'm not sure this is the real and correct fix, but it works more
+    than previous code so it's and improvement
+
+ qt4/src/poppler-page.cc |    6 +-----
+ 1 file changed, 1 insertion(+), 5 deletions(-)
+
+commit e3e4113c73128f49f99289b592446d4382b5d65c
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Mon May 12 15:39:43 2008 +0200
+
+    Add getters to some TextBlock members.
+
+    Needed by some reader using poppler internals, bad you!
+
+ poppler/TextOutputDev.h |    5 +++++
+ 1 file changed, 5 insertions(+)
+
+commit ff699e64bd1de78915aad4ddb79d6f529aef2b87
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Sun May 11 23:44:50 2008 +0200
+
+    Check the OC we found exists before using it
+
+    Fixes crash http://bugs.freedesktop.org/show_bug.cgi?id=15899
+
+ poppler/OptionalContent.cc |  33 ++++++++++++++++++---------------
+ 1 file changed, 18 insertions(+), 15 deletions(-)
+
+commit ac26ba5148b99a03a56e37ba201ad420b8619943
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Fri May 9 20:17:37 2008 +0200
+
+    Do not crash on unlock with wrong password
+
+ qt/poppler-private.h |    2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 19ec5a531cb03a7bee1cfcc9c7d5c4390fbd069d
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Thu May 8 23:15:58 2008 +0200
+
+    Fix build with --enable-fixedpoint
+
+ splash/Splash.cc |    4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 1cf5f0fda542efef575a123622637d81b9c42053
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Wed May 7 18:49:28 2008 +0200
+
+    [Qt] Fix Document::unlock
+
+ qt/poppler-document.cc |    4 +++-
+ 1 file changed, 3 insertions(+), 1 deletion(-)
+
+commit b5041924eb023cc095f2445935ff713cf65dacce
+Author: Pino Toscano <pino@kde.org>
+Date:  Wed May 7 16:44:03 2008 +0200
+
+    do not delete the GooString owned by an Object
+
+ poppler/Annot.cc |    4 ----
+ 1 file changed, 4 deletions(-)
+
+commit 546a7b700862db00240de9fd50bdba1dd347765b
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Sun May 4 15:26:26 2008 +0200
+
+    Fix leaks on error conditions
+
+ poppler/Annot.cc          |    6 ++++++
+ poppler/ArthurOutputDev.cc |   1 +
+ poppler/JBIG2Stream.cc     |   1 +
+ 3 files changed, 8 insertions(+)
+
+commit 914f1b1d814ab3d958aa0ca21ad73ef5aed20b89
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Sat May 3 18:21:28 2008 +0200
+
+    A widget annot does not always belong to a form, so check before
+    accessing the widget member
+
+ poppler/Annot.cc |    4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit c907e41ab18dda10cd3c9789bd0e7fe71b6402a8
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Wed Apr 30 00:42:34 2008 +0200
+
+    findSegment can return NULL check for it
+
+ poppler/JBIG2Stream.cc |    6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
+
+commit 8b7f29b577bca3295e99fea4a5cf4a6bb7ba2617
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Wed Apr 30 00:26:28 2008 +0200
+
+    new[] implies delete[]
+
+ poppler/ABWOutputDev.cc |    2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 926c13825d5f7364286975db8ffa507b92f4b3ab
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Tue Apr 29 23:44:51 2008 +0200
+
+    add lost return when adding kees patch
+
+ poppler/Object.h |    2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit ba9283f6bc78e97006e52ef5de20c958ee9e1a37
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Tue Apr 29 23:42:00 2008 +0200
+
+    make the function static
+
+ utils/pdftoppm.cc |   2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 931a8272f556ba8a35342f0c5bf53bdb57ea7a31
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Tue Apr 29 23:41:31 2008 +0200
+
+    make the variable static
+
+ utils/pdftoabw.cc |   2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 1887d2910d2006c7fc3ecc95db0150f1537e9d0a
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Tue Apr 29 23:35:17 2008 +0200
+
+    constify some static arrays
+
+ poppler/CompactFontTables.h |   2 +-
+ poppler/Decrypt.cc         |    8 ++++----
+ poppler/Function.cc        |    2 +-
+ poppler/GfxFont.cc         |    6 +++---
+ poppler/GfxState.cc        |    4 ++--
+ poppler/JBIG2Stream.cc      |  10 +++++-----
+ poppler/JPXStream.cc       |    4 ++--
+ poppler/Lexer.cc           |    2 +-
+ poppler/PSOutputDev.cc      |   6 +++---
+ poppler/PSTokenizer.cc      |   2 +-
+ poppler/SplashOutputDev.cc  |   2 +-
+ poppler/Stream-CCITT.h      |  12 ++++++------
+ poppler/Stream.cc          |   10 +++++-----
+ poppler/UnicodeTypeTable.cc |   2 +-
+ 14 files changed, 36 insertions(+), 36 deletions(-)
+
+commit 51140e2d9490696d716f77d3225da0bfdfc212b4
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Tue Apr 29 23:14:59 2008 +0200
+
+    more static markers
+
+ poppler/Annot.cc          |    2 +-
+ poppler/DCTStream.cc      |    2 +-
+ poppler/Object.cc         |    2 +-
+ poppler/SplashOutputDev.cc |   2 +-
+ 4 files changed, 4 insertions(+), 4 deletions(-)
+
+commit 893703cb9eee879f728db329f7ee1fc19e7f980e
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Tue Apr 29 23:03:51 2008 +0200
+
+    add static
+
+ poppler/XRef.cc |    2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 7333bc913111e56ee241b7ef2bf6e9fea68b7da2
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Tue Apr 29 23:01:13 2008 +0200
+
+    add static
+
+ poppler/JBIG2Stream.cc |   30 +++++++++++++++---------------
+ 1 file changed, 15 insertions(+), 15 deletions(-)
+
+commit 1ea36507f9c9f163b6772268046e7560d0c00dbc
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Tue Apr 29 22:47:19 2008 +0200
+
+    make findModifier static
+
+ poppler/GlobalParams.cc |    2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit be9961571dbfabb982e6f69abd3bbc98fa971864
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Tue Apr 29 21:48:09 2008 +0200
+
+    make variables not used outside static
+
+ utils/pdftohtml.cc |   4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit b157064a85350da6ea9c4f46e965e45ebc59d227
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Tue Apr 29 21:43:23 2008 +0200
+
+    constify setPSPaperSize
+
+ utils/pdftops.cc |    2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit ee57ead8a6f34fa8de044399e5912395e0f3a425
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Tue Apr 29 21:37:57 2008 +0200
+
+    constify argDesc arrays
+
+    Gives me binaries 2KB smaller (in total) in release build
+
+ utils/parseargs.c  |  18 +++++++++---------
+ utils/parseargs.h  |   4 ++--
+ utils/pdffonts.cc  |   2 +-
+ utils/pdfimages.cc |   2 +-
+ utils/pdfinfo.cc   |   2 +-
+ utils/pdftoabw.cc  |   2 +-
+ utils/pdftohtml.cc |   2 +-
+ utils/pdftoppm.cc  |   2 +-
+ utils/pdftops.cc   |   2 +-
+ utils/pdftotext.cc |   2 +-
+ 10 files changed, 19 insertions(+), 19 deletions(-)
+
+commit 9f93d9eb464877e0d23dcf205295da9162f03253
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Tue Apr 29 20:45:01 2008 +0200
+
+    make psOpNames static
+
+    Makes my release build 64 bytes smaller
+
+ poppler/Function.cc |   2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 29e3e779c68371b7c4aadcf68ee0712046f39c6d
+Author: Pino Toscano <pino@kde.org>
+Date:  Sat Apr 26 23:47:01 2008 +0200
+
+    remember to call the base implementation here
+
+ qt4/demos/optcontent.cpp |    1 +
+ 1 file changed, 1 insertion(+)
+
+commit a188f3cd36775d78ace5b5d62c8ab7c059b3b2b1
+Author: Pino Toscano <pino@kde.org>
+Date:  Sat Apr 26 23:42:09 2008 +0200
+
+    reset the current page to 0, when closing a document
+
+ qt4/demos/viewer.cpp |    1 +
+ 1 file changed, 1 insertion(+)
+
+commit 7eca6da6436ffc1c41cfed1a07be4dafa1172463
+Author: Pino Toscano <pino@kde.org>
+Date:  Sat Apr 26 23:41:45 2008 +0200
+
+    no need to manually disconnect from the model, as it will be deleted
+    by the document anyway
+
+ qt4/demos/optcontent.cpp |    1 -
+ 1 file changed, 1 deletion(-)
+
+commit 6cddda7f3c3b8ddb95e6aba1b234a27c4454c23d
+Author: Pino Toscano <pino@kde.org>
+Date:  Sat Apr 26 22:41:59 2008 +0200
+
+    sync updateFont() with SplashOutputDev
+
+ poppler/ArthurOutputDev.cc |  75
+ ++++++++++++++++++++++++++++++++++----------
+ 1 file changed, 59 insertions(+), 16 deletions(-)
+
+commit ddc7c1f8c24762bae615e7dec92e92a58c827478
+Author: Pino Toscano <pino@kde.org>
+Date:  Sat Apr 26 18:12:51 2008 +0200
+
+    construct AnnotPolygon for Polygon and PolyLine annotations
+
+ poppler/Annot.cc |    4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit f9c7e8037b7165b6271ce7aea0d315053c4d66a5
+Merge: 59d33d8 f5fec4f
+Author: Pino Toscano <pino@kde.org>
+Date:  Sat Apr 26 18:09:59 2008 +0200
+
+    Merge branch 'master' of
+    ssh://pino@git.freedesktop.org/git/poppler/poppler
+
+commit 59d33d8e99673f73ccf2ad9a62bd25fca51f0eb8
+Author: Pino Toscano <pino@kde.org>
+Date:  Sat Apr 26 17:56:42 2008 +0200
+
+    use the base implementation to update all the states
+
+ poppler/ArthurOutputDev.cc |  11 +----------
+ 1 file changed, 1 insertion(+), 10 deletions(-)
+
+commit 45d2a9529bf241554c59437118cb8c705554dc27
+Author: Pino Toscano <pino@kde.org>
+Date:  Sat Apr 26 17:55:39 2008 +0200
+
+    Set the font antialiasing from the painter settings, instead of the
+    global settings.
+
+ poppler/ArthurOutputDev.cc |   2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 5faa72fd70e0d85268e807a8b870d80dda9189a9
+Author: Pino Toscano <pino@kde.org>
+Date:  Sat Apr 26 17:53:28 2008 +0200
+
+    Get the font and painter matrices, and reenable the font drawing.
+
+ poppler/ArthurOutputDev.cc |  28 +++++++++++++++++++++-------
+ 1 file changed, 21 insertions(+), 7 deletions(-)
+
+commit f5fec4fdedd8d316b19968545e447e2036a1bb47
+Author: Kees Cook <kees@outflux.net>
+Date:  Wed Apr 23 19:53:03 2008 +0200
+
+    provide type-checking for union pointer accesses
+
+ poppler/Object.h |   68
+ ++++++++++++++++++++++++++++++++++--------------------
+ 1 file changed, 43 insertions(+), 25 deletions(-)
+
+commit a567c921ce538616f4ba0b7933086ef5a8ab0f55
+Author: Iñigo Martínez <inigomartinez@gmail.com>
+Date:  Tue Apr 22 23:09:10 2008 +0200
+
+    Little change to avoid AnnotWidget crashing when they aren't related
+    to FormWidgets.
+
+    Signed-off-by: Iñigo Martínez <inigomartinez@gmail.com>
+
+ poppler/Annot.cc |   19 ++++++++++---------
+ 1 file changed, 10 insertions(+), 9 deletions(-)
+
+commit 73798c95b8a4c0504e9246e6f73fd31f812ad6fa
+Author: Albert Astals Cid <tsdgeos@bluebox.(none)>
+Date:  Mon Apr 21 19:56:52 2008 +0200
+
+    Link to pthread when needed
+
+    Should fix bug 15625
+
+ configure.ac       |    2 +
+ m4/acx_pthread.m4   | 280
+ +++++++++++++++++++++++++++++++++++++++++++++++++++
+ poppler/Makefile.am |   4 +
+ 3 files changed, 286 insertions(+)
+
+commit 6c248bdad77235a45402d9693a0b822cc208b6b9
+Author: Pino Toscano <pino@kde.org>
+Date:  Sun Apr 20 18:32:59 2008 +0200
+
+    the dtor should be virtual
+
+ qt4/src/poppler-converter-private.h |   2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 68dba1a452ca70add5b05ab8e2adab838bc2cb73
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Sun Apr 20 16:21:10 2008 +0200
+
+    if ncand is a Guint cand should be one too
+
+ poppler/CMap.cc |    2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 0b91eb19f5a3d07b625ee5188f1fcb4b4b1544ea
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Sun Apr 20 16:17:50 2008 +0200
+
+    Unused var--
+
+ poppler/GfxFont.cc |   2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 1ed3cc40987b691319fd9f1a30296d80de5732fd
+Author: Pino Toscano <pino@kde.org>
+Date:  Wed Apr 16 15:45:45 2008 +0200
+
+    fix border style conversion
+
+ qt4/src/poppler-page.cc |    2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 7c8feb4e3627bde2052a7e536d2d49d1cbbce8ee
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Tue Apr 15 21:57:31 2008 +0200
+
+    Hack to "support" 16 bits images
+
+    Everywhere we assume a component fits in 8 bits, with this hack
+    we treat 16 bit images as 8 bit ones until it's fixed correctly.
+    Fixes http://bugs.kde.org/show_bug.cgi?id=158165
+
+ poppler/GfxState.cc |   6 ++++++
+ poppler/Stream.cc   |   9 +++++++++
+ 2 files changed, 15 insertions(+)
+
+commit f338a9ded5d42dd65853c5c7bbe27f6724096416
+Author: Pino Toscano <pino@kde.org>
+Date:  Sun Apr 13 21:41:51 2008 +0200
+
+    [Qt4] convert the sound annotations
+
+ qt4/src/poppler-page.cc |   16 ++++++++++++++--
+ 1 file changed, 14 insertions(+), 2 deletions(-)
+
+commit 733d51fca04ee682fed2242f868edd545f3755fa
+Author: Pino Toscano <pino@kde.org>
+Date:  Sun Apr 13 21:38:25 2008 +0200
+
+    [Qt4] First version of a SoundAnnotation.
+
+ qt4/src/poppler-annotation.cc |   87
+ +++++++++++++++++++++++++++++++++++++++++
+ qt4/src/poppler-annotation.h  |   30 +++++++++++++-
+ 2 files changed, 116 insertions(+), 1 deletion(-)
+
+commit feb1ea091111bd7292879c465590acfd7671c876
+Author: Pino Toscano <pino@kde.org>
+Date:  Sun Apr 13 21:36:26 2008 +0200
+
+    First version of AnnotSound.
+
+ poppler/Annot.cc |   37 ++++++++++++++++++++++++++++++++++++-
+ poppler/Annot.h  |   26 ++++++++++++++++++++++++++
+ 2 files changed, 62 insertions(+), 1 deletion(-)
+
+commit ec2cf81edf1b2c6707de4d30316ff5f5e24534d4
+Author: Pino Toscano <pino@kde.org>
+Date:  Sun Apr 13 18:31:21 2008 +0200
+
+    [Qt4] convert the file attachment annotations
+
+ qt4/src/poppler-page.cc |   15 +++++++++++++--
+ 1 file changed, 13 insertions(+), 2 deletions(-)
+
+commit 9fa2e96c96d365ae67859545ebd635d726784fca
+Author: Pino Toscano <pino@kde.org>
+Date:  Sun Apr 13 18:29:00 2008 +0200
+
+    [Qt4] Initial version of FileAttachmentAnnotation
+
+ qt4/src/poppler-annotation.cc |   88
+ +++++++++++++++++++++++++++++++++++++++++
+ qt4/src/poppler-annotation.h  |   29 +++++++++++++-
+ 2 files changed, 116 insertions(+), 1 deletion(-)
+
+commit 5899aff11f94e707654574e830e0757b1df558d4
+Author: Pino Toscano <pino@kde.org>
+Date:  Sun Apr 13 10:50:39 2008 +0200
+
+    [Qt4] Read the annotations from the core, instead of own parsing.
+
+    Almost all the data are converted correctly, the results seem to be
+    the same.
+    Added TODOs in the few parts (not essential) I was not able to figure
+    out how to convert, yet.
+    Covert also the Caret annotations.
+
+ qt4/src/poppler-annotation-helper.h |   2 +-
+ qt4/src/poppler-page.cc            |  851
+ ++++++++++++++++-------------------
+ 2 files changed, 393 insertions(+), 460 deletions(-)
+
+commit 40a12793c5ccea206d79e0c17e2f2d0cf74bb4f3
+Author: Pino Toscano <pino@kde.org>
+Date:  Sun Apr 13 02:21:55 2008 +0200
+
+    add getters for the AnnotPolygon properties
+
+ poppler/Annot.h |    6 ++++++
+ 1 file changed, 6 insertions(+)
+
+commit 9311f75d4c3da991efb8afd00701a0ce1cbae1b0
+Author: Iñigo Martínez <inigomartinez@gmail.com>
+Date:  Sun Apr 13 01:52:36 2008 +0200
+
+    Almost full AnnotPolygon support.
+
+    Signed-off-by: Iñigo Martínez <inigomartinez@gmail.com>
+
+ poppler/Annot.cc |   99
+ ++++++++++++++++++++++++++++++++++++++++++++++++++++++
+ poppler/Annot.h  |   37 ++++++++++++++++++++
+ 2 files changed, 136 insertions(+)
+
+commit 01aa052ed761a4ada471d196985825986bb58627
+Author: Iñigo Martínez <inigomartinez@gmail.com>
+Date:  Sun Apr 13 01:13:49 2008 +0200
+
+    Extend AnnotPath behaviour to include cooordinate array parsing.
+
+    Signed-off-by: Iñigo Martínez <inigomartinez@gmail.com>
+
+ poppler/Annot.cc |   96
+ +++++++++++++++++++++++++++++-------------------------
+ poppler/Annot.h  |    4 ++-
+ 2 files changed, 55 insertions(+), 45 deletions(-)
+
+commit ca52830e9519ae7b778f98e5c2547daef7da5f09
+Author: Iñigo Martínez <inigomartinez@gmail.com>
+Date:  Sun Apr 13 00:54:13 2008 +0200
+
+    Added OptionalContent support to Annots.
+
+    Signed-off-by: Iñigo Martínez <inigomartinez@gmail.com>
+
+ poppler/Annot.cc |    9 +++------
+ poppler/Annot.h  |    5 +++--
+ 2 files changed, 6 insertions(+), 8 deletions(-)
+
+commit 4b87196b7829c87d15af4e8b4138ca97548fb519
+Author: Pino Toscano <pino@kde.org>
+Date:  Sun Apr 13 00:18:24 2008 +0200
+
+    Isolate the embedded file reading logic into a new EmbFile
+    constructor.
+
+    This way, it can be shared and reused in various places (Catalog,
+    AnnotFileAttachment, etc).
+
+ poppler/Catalog.cc |  205
+ ++++++++++++++++++++++++++++------------------------
+ poppler/Catalog.h  |   1 +
+ 2 files changed, 112 insertions(+), 94 deletions(-)
+
+commit 45b407e51905948690065749085a4af1cbb29a8e
+Author: Pino Toscano <pino@kde.org>
+Date:  Sun Apr 13 00:14:38 2008 +0200
+
+    correctly get the FileSpec dictionary
+
+ poppler/Annot.cc |    4 +++-
+ poppler/Annot.h  |    2 +-
+ 2 files changed, 4 insertions(+), 2 deletions(-)
+
+commit c3aa3a97d9c553ea7976741d798901352fb5381c
+Author: Pino Toscano <pino@kde.org>
+Date:  Sat Apr 12 22:45:57 2008 +0200
+
+    properly initialize an AnnotPath
+
+ poppler/Annot.cc |    9 ++-------
+ 1 file changed, 2 insertions(+), 7 deletions(-)
+
+commit a3406fb2ace1390db1c181823a7bfc66c9174d98
+Author: Pino Toscano <pino@kde.org>
+Date:  Sat Apr 12 22:40:42 2008 +0200
+
+    properly dispose the memory of the ink lists
+
+ poppler/Annot.cc |   13 ++++++++++++-
+ poppler/Annot.h  |    1 +
+ 2 files changed, 13 insertions(+), 1 deletion(-)
+
+commit 0dad70e2d12e8b587cab8ce2d914c81c6897a1d1
+Author: Pino Toscano <pino@kde.org>
+Date:  Sat Apr 12 22:15:35 2008 +0200
+
+    make AnnotInk working.
+
+    - get the point indexes in the correct way
+    - dispose with free what you allocate with malloc
+    - fix logic when checking for an even number of points
+
+ poppler/Annot.cc |    8 ++++----
+ 1 file changed, 4 insertions(+), 4 deletions(-)
+
+commit 77404e24ea1e175fc9b55097dc5b35cc34760659
+Author: Pino Toscano <pino@kde.org>
+Date:  Sat Apr 12 21:08:54 2008 +0200
+
+    a length is an int
+
+ poppler/Annot.h |    2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit bc2b2ffd2144f951c311e968fba4bc50b7c43ff3
+Merge: cd5afe6 bacc1dd
+Author: Iñigo Martínez <inigomartinez@gmail.com>
+Date:  Sat Apr 12 17:40:49 2008 +0200
+
+    Fixed merging conflict.
+
+    Signed-off-by: Iñigo Martínez <inigomartinez@gmail.com>
+
+commit cd5afe6d9eca687ee224ff7680a8cba28d81a36d
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Sat Apr 12 00:44:08 2008 +0200
+
+    Do not take into account Colorspace resource subdictionary for
+    image XObjects
+
+    Fixes bug 15125
+    The motivation under that change is on section 4.5.2 of the spec:
+     Certain objects, such as image XObjects, specify a
+     color space as an explicit parameter, often associated with the
+     key ColorSpace.
+     In this case, the color space array or name is always defined
+     directly as a PDF
+     object, not by an entry in the ColorSpace resource
+     subdictionary. This conven-
+     tion also applies when color spaces are defined in terms of other
+     color spaces.
+
+ poppler/Gfx.cc |    2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit bacc1dd9f37ff19c5e54878a5b08e7d734584bbf
+Author: Pino Toscano <pino@kde.org>
+Date:  Sat Apr 12 17:20:09 2008 +0200
+
+    Read the "in reply to" reference as such, without reading the
+    associated annotation dictionary.
+
+ poppler/Annot.cc |   10 ++++------
+ poppler/Annot.h  |    4 ++--
+ 2 files changed, 6 insertions(+), 8 deletions(-)
+
+commit ffe09454a0948a6107bcc38f23ba2068151c547d
+Author: Iñigo Martínez <inigomartinez@gmail.com>
+Date:  Sat Apr 12 17:17:59 2008 +0200
+
+    Initial Annot3D parsing a few general improvements.
+
+    Signed-off-by: Iñigo Martínez <inigomartinez@gmail.com>
+
+ poppler/Annot.cc |  130
+ ++++++++++++++++++++++++++++++++++++++++++++++++++----
+ poppler/Annot.h  |   84 +++++++++++++++++++++++++++++------
+ 2 files changed, 193 insertions(+), 21 deletions(-)
+
+commit 8757c577241dda31bc59c7d1c208c159ad428877
+Author: Iñigo Martínez <inigomartinez@gmail.com>
+Date:  Sat Apr 12 10:38:07 2008 +0200
+
+    AnnotFileAttachment support.
+
+    Signed-off-by: Iñigo Martínez <inigomartinez@gmail.com>
+
+ poppler/Annot.cc |   38 ++++++++++++++++++++++++++++++++++++--
+ poppler/Annot.h  |   25 +++++++++++++++++++++++++
+ 2 files changed, 61 insertions(+), 2 deletions(-)
+
+commit 36989658149fc9e5e8a049ce070a102f35b7bddc
+Author: Iñigo Martínez <inigomartinez@gmail.com>
+Date:  Sat Apr 12 09:55:26 2008 +0200
+
+    AnnotInk support.
+
+    Signed-off-by: Iñigo Martínez <inigomartinez@gmail.com>
+
+ poppler/Annot.cc |  113
+ ++++++++++++++++++++++++++++++++++++++++++++++++++++++
+ poppler/Annot.h  |   45 ++++++++++++++++++++++
+ 2 files changed, 158 insertions(+)
+
+commit 464b171d0e9b989196c287f2ee4dfbbc14212aa9
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Sat Apr 12 00:44:08 2008 +0200
+
+    Do not take into account Colorspace resource subdictionary for
+    image XObjects
+
+    Fixes bug 15125
+    The motivation under that change is on section 4.5.2 of the spec:
+     Certain objects, such as image XObjects, specify a
+     color space as an explicit parameter, often associated with the
+     key ColorSpace.
+     In this case, the color space array or name is always defined
+     directly as a PDF
+     object, not by an entry in the ColorSpace resource
+     subdictionary. This conven-
+     tion also applies when color spaces are defined in terms of other
+     color spaces.
+
+ poppler/Gfx.cc |    2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 42db4890e8295aaec5a1be12d1414fc0a9048550
+Author: Chris Wilson <chris@chris-wilson.co.uk>
+Date:  Thu Mar 27 10:52:22 2008 +0000
+
+    Do not call FT_Done_Face on a live cairo_font_face_t.
+
+    Currently CairoFont calls FT_Done_Face on its deletion, but the
+    FT_Face
+    is usually still in use within cairo. This causes a failure later when
+    cairo tries to create a glyph from its cairo_font_face_t.
+
+    From http://bugs.freedesktop.org/show_bug.cgi?id=15216:
+    ==13745== Invalid read of size 4
+    ==13745==   at 0x51BE572: FT_Load_Glyph (ftobjs.c:549)
+    ==13745==   by 0x4A24921: _cairo_ft_scaled_glyph_init
+    (cairo-ft-font.c:1922)
+    ==13745==   by 0x4A117AB: _cairo_scaled_glyph_lookup
+    (cairo-scaled-font.c:1674)
+    ==13745==   by 0x4A12A5A: _cairo_scaled_font_glyph_device_extents
+    (cairo-scaled-font.c:1124)
+    ==13745==   by 0x4A21ECD: _cairo_analysis_surface_show_glyphs
+    (cairo-analysis-surface.c:516)
+    ==13745==   by 0x4A144DC: _cairo_surface_show_glyphs
+    (cairo-surface.c:2086)
+    ==13745==   by 0x4A1FCC8: _cairo_meta_surface_replay_internal
+    (cairo-meta-surface.c:816)
+    ==13745==   by 0x4A214B1: _paint_page (cairo-paginated-surface.c:299)
+    ==13745==   by 0x4A2171E: _cairo_paginated_surface_show_page
+    (cairo-paginated-surface.c:445)
+    ==13745==   by 0x4A14BDF: cairo_surface_show_page
+    (cairo-surface.c:1702)
+    ==13745==   by 0x49FF661: cairo_show_page (cairo.c:2155)
+    ==13745==   by 0xA267D97:
+    pdf_document_file_exporter_end_page(_EvFileExporter*)
+    (ev-poppler.cc:1753)
+    ==13745==  Address 0x55c5630 is 88 bytes inside a block of size
+    552 free'd
+    ==13745==   at 0x402269C: free (vg_replace_malloc.c:326)
+    ==13745==   by 0x51B7ABC: ft_free (ftsystem.c:158)
+    ==13745==   by 0x51BB319: ft_mem_free (ftutil.c:171)
+    ==13745==   by 0x51BC318: destroy_face (ftobjs.c:856)
+    ==13745==   by 0x51BC3B2: FT_Done_Face (ftobjs.c:1972)
+    ==13745==   by 0x4363704: CairoFont::~CairoFont()
+    (CairoFontEngine.cc:251)
+    ==13745==   by 0x436401D: CairoFontEngine::getFont(GfxFont*, XRef*)
+    (CairoFontEngine.cc:335)
+    ==13745==   by 0x4366915: CairoOutputDev::updateFont(GfxState*)
+    (CairoOutputDev.cc:318)
+    ==13745==   by 0x5093BF1: Gfx::opShowText(Object*, int) (Gfx.cc:3073)
+    ==13745==   by 0x508F901: Gfx::execOp(Object*, Object*, int)
+    (Gfx.cc:726)
+    ==13745==   by 0x50906FF: Gfx::go(int) (Gfx.cc:594)
+    ==13745==   by 0x5090C96: Gfx::display(Object*, int) (Gfx.cc:557)
+
+    The solution is to release the reference to the cairo_font_face_t upon
+    destruction of the CairoFont, and then to release the FT_Face from the
+    destroy notify of the cairo_font_face_t.
+
+ poppler/CairoFontEngine.cc |  19 +++++++++----------
+ 1 file changed, 9 insertions(+), 10 deletions(-)
+
+commit 5f60843824582ece36d806508ec388330ddee854
+Author: Iñigo Martínez <inigomartinez@gmail.com>
+Date:  Tue Apr 8 00:30:57 2008 +0200
+
+    Added AnnotCoord support.
+
+    Signed-off-by: Iñigo Martínez <inigomartinez@gmail.com>
+
+ poppler/Annot.cc |   64
+ +++++++++++++++++---------------------------------
+ poppler/Annot.h  |   69
+ +++++++++++++++++++++++++-----------------------------
+ 2 files changed, 54 insertions(+), 79 deletions(-)
+
+commit a6f70f465a3e6719d63cefbe3c27bae015be43c1
+Author: Pino Toscano <pino@kde.org>
+Date:  Sun Apr 6 13:12:01 2008 +0200
+
+    add getters for the coordinates in an AnnotLine
+
+ poppler/Annot.h |    4 ++++
+ 1 file changed, 4 insertions(+)
+
+commit 1d83d6edf9a843335e37a4d1e0e0dd71eb23d93b
+Author: Pino Toscano <pino@kde.org>
+Date:  Sun Apr 6 12:24:42 2008 +0200
+
+    [Qt4] the caret symbol is an enum value, now
+
+ qt4/src/poppler-annotation.cc |   35 ++++++++++++++++++++++++++++-------
+ qt4/src/poppler-annotation.h  |    7 +++++--
+ 2 files changed, 33 insertions(+), 9 deletions(-)
+
+commit 229d991a3258cb9b56f5e00f2deb3c976253cf68
+Author: Pino Toscano <pino@kde.org>
+Date:  Sun Apr 6 12:23:04 2008 +0200
+
+    the caret symbol does not seem to allow additional values, so convert
+    it to an enum
+
+ poppler/Annot.cc |   11 +++++++----
+ poppler/Annot.h  |    9 +++++++--
+ 2 files changed, 14 insertions(+), 6 deletions(-)
+
+commit fc24500ddd9182f97d23c46eaafc6be79a6721eb
+Author: Pino Toscano <pino@kde.org>
+Date:  Sun Apr 6 11:43:49 2008 +0200
+
+    propetly initialise a couple of members; leak less
+
+ poppler/ArthurOutputDev.cc |   5 +++++
+ 1 file changed, 5 insertions(+)
+
+commit 9409de1e7c5b3770c7ef00c01ee376953dd532a5
+Author: Iñigo Martínez <inigomartinez@gmail.com>
+Date:  Sun Apr 6 01:38:25 2008 +0200
+
+    Changed AnnotFreeText RD field to the new parseDiffRectangle.
+
+    Signed-off-by: Iñigo Martínez <inigomartinez@gmail.com>
+
+ poppler/Annot.cc |   35 ++---------------------------------
+ 1 file changed, 2 insertions(+), 33 deletions(-)
+
+commit 28c5ee2e9fc2a24d2f2efb3d74d5cf882a106239
+Author: Pino Toscano <pino@kde.org>
+Date:  Sat Apr 5 23:19:33 2008 +0200
+
+    typo fix
+
+ poppler/Annot.h |    2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit ed02769688466ca72bf35d4223c3822a1245604b
+Author: Pino Toscano <pino@kde.org>
+Date:  Sat Apr 5 19:36:21 2008 +0200
+
+    read the destination of a link annotation
+
+ poppler/Annot.cc |    5 ++++-
+ poppler/Annot.h  |    4 ++--
+ 2 files changed, 6 insertions(+), 3 deletions(-)
+
+commit ca31bf12a9d70bac88e457f7799e9935aba58640
+Author: Pino Toscano <pino@kde.org>
+Date:  Sat Apr 5 16:48:53 2008 +0200
+
+    variable forgotten in the copy&paste...
+
+ qt4/src/poppler-annotation.cc |    6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
+
+commit 4168daa141b76e5fcd07d046aca8dac2f3037ff9
+Author: Pino Toscano <pino@kde.org>
+Date:  Sat Apr 5 16:34:12 2008 +0200
+
+    [Qt4] deserialize also CaretAnnotation's
+
+ qt4/src/poppler-annotation.cc |    3 +++
+ 1 file changed, 3 insertions(+)
+
+commit b55bcc2aa95825863bef23ab96364b350a49949d
+Author: Pino Toscano <pino@kde.org>
+Date:  Sat Apr 5 16:31:31 2008 +0200
+
+    [Qt4] first version of a CaretAnnotation.
+
+ qt4/src/poppler-annotation.cc |   80
+ +++++++++++++++++++++++++++++++++++++++++
+ qt4/src/poppler-annotation.h  |   25 ++++++++++++-
+ 2 files changed, 104 insertions(+), 1 deletion(-)
+
+commit 4c9a02b7e49666efe10fdc16e7a03d8d520b65ec
+Author: Pino Toscano <pino@kde.org>
+Date:  Sat Apr 5 16:01:58 2008 +0200
+
+    First version of AnnotCaret.
+
+ poppler/Annot.cc |   36 +++++++++++++++++++++++++++++++++++-
+ poppler/Annot.h  |   22 ++++++++++++++++++++++
+ 2 files changed, 57 insertions(+), 1 deletion(-)
+
+commit d260fe9e514c667b66969b982119429cc922eb07
+Author: Pino Toscano <pino@kde.org>
+Date:  Sat Apr 5 15:54:29 2008 +0200
+
+    isolate the code for parsing a "difference rectangle" in an own
+    function
+
+ poppler/Annot.cc |   54
+ +++++++++++++++++++++++++++++++-----------------------
+ 1 file changed, 31 insertions(+), 23 deletions(-)
+
+commit 760833e409c122c0a61f7c87fd3133eebc10b402
+Author: Pino Toscano <pino@kde.org>
+Date:  Sat Apr 5 15:36:43 2008 +0200
+
+    First version of AnnotGeometry.
+
+ poppler/Annot.cc |   77
+ ++++++++++++++++++++++++++++++++++++++++++++++++++++--
+ poppler/Annot.h  |   24 +++++++++++++++++
+ 2 files changed, 99 insertions(+), 2 deletions(-)
+
+commit 95d9d2362534c0524ad0448818b2d69b0909d482
+Author: Pino Toscano <pino@kde.org>
+Date:  Sat Apr 5 03:23:00 2008 +0200
+
+    finally, load the QuadPoints correctly
+
+    when checking the validity of the coordinate, do the comparison just
+    with the proper one (either X or Y);
+    free the "point" object after each iteration
+
+ poppler/Annot.cc |   11 ++++++++---
+ 1 file changed, 8 insertions(+), 3 deletions(-)
+
+commit af1ffcbcec1730332d11f8da4a7ddac833b22408
+Author: Pino Toscano <pino@kde.org>
+Date:  Sat Apr 5 02:54:00 2008 +0200
+
+    More robust reading of QuadPoints (reset the allocated memory,
+    use the heap)
+
+ poppler/Annot.cc |    7 +++----
+ 1 file changed, 3 insertions(+), 4 deletions(-)
+
+commit 68fd98d69bac20282665cf6b824da30c3b310f0b
+Author: Pino Toscano <pino@kde.org>
+Date:  Sat Apr 5 02:51:41 2008 +0200
+
+    Really implement AnnotTextMarkup.
+
+ poppler/Annot.cc |   29 +++++++++++++++++++++++++----
+ poppler/Annot.h  |    2 +-
+ 2 files changed, 26 insertions(+), 5 deletions(-)
+
+commit 69a2ecfaf8f8cffd3027db5c3cc88c41413e42f1
+Author: Pino Toscano <pino@kde.org>
+Date:  Sat Apr 5 01:38:28 2008 +0200
+
+    Add the Stamp annotation type.
+
+ poppler/Annot.cc |   28 +++++++++++++++++++++++++++-
+ poppler/Annot.h  |   20 ++++++++++++++++++++
+ 2 files changed, 47 insertions(+), 1 deletion(-)
+
+commit 97be4332818bcf58461816be995d88926809a4e5
+Author: Iñigo Martínez <inigomartinez@gmail.com>
+Date:  Fri Apr 4 23:49:12 2008 +0200
+
+    Updated glib bindings.
+
+    Signed-off-by: Iñigo Martínez <inigomartinez@gmail.com>
+
+ glib/demo/annots.c    |   32 +++++---------------------------
+ glib/poppler-annot.cc |   27 +++++----------------------
+ glib/poppler-annot.h  |   13 +------------
+ 3 files changed, 11 insertions(+), 61 deletions(-)
+
+commit 5caac407cdaf58621ac27e5561b31a995404ccb3
+Author: Iñigo Martínez <inigomartinez@gmail.com>
+Date:  Fri Apr 4 23:36:46 2008 +0200
+
+    Fixed icon name in AnnotText.
+
+    Signed-off-by: Iñigo Martínez <inigomartinez@gmail.com>
+
+ poppler/Annot.cc |   25 ++++++-------------------
+ poppler/Annot.h  |   15 +++------------
+ 2 files changed, 9 insertions(+), 31 deletions(-)
+
+commit 0b714a61383da1b62daf2a60e3f6fcda09b4e9f2
+Author: Adam Batkin <adam@batkin.net>
+Date:  Thu Apr 3 20:02:52 2008 +0200
+
+    FindFirstFile returns INVALID_HANDLE_VALUE and not NULL on error
+
+ goo/gfile.cc |   12 ++++++------
+ 1 file changed, 6 insertions(+), 6 deletions(-)
+
+commit be765f27cc5430d9bb2a3e113eb245d67c20a376
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Mon Mar 31 12:37:33 2008 +0200
+
+    [glib] Fix a crash in outline demo due to page_num == dest_page_num
+    - 1
+
+ glib/demo/utils.c |   2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit e991e9ac6fcc0b6928b96fe8326eebcf3cb720ca
+Author: Albert Astals Cid <tsdgeos@localhost.(none)>
+Date:  Sat Mar 29 13:25:52 2008 +0100
+
+    Add the export macro
+
+ qt4/src/poppler-page-transition.h |   4 +++-
+ 1 file changed, 3 insertions(+), 1 deletion(-)
+
+commit b70ca35dce6da6efdff254c11a63de4f44228278
+Author: Albert Astals Cid <tsdgeos@localhost.(none)>
+Date:  Sat Mar 29 00:30:31 2008 +0100
+
+    Duplicate page-transition files on qt4
+
+ qt4/src/CMakeLists.txt                           |    4 +-
+ qt4/src/Makefile.am                      |    4 +-
+ qt4/src/poppler-page-transition-private.h |   28 ++++++
+ qt4/src/poppler-page-transition.cc       |   95 +++++++++++++++++++
+ qt4/src/poppler-page-transition.h        |  146
+ +++++++++++++++++++++++++++++
+ 5 files changed, 273 insertions(+), 4 deletions(-)
+
+commit b5312785063235cef7584ab6a5d198fb72de0988
+Author: Iñigo Martínez <inigomartinez@gmail.com>
+Date:  Wed Mar 26 23:56:49 2008 +0100
+
+    Improved glib annot demo.
+
+    Signed-off-by: Iñigo Martínez <inigomartinez@gmail.com>
+
+ glib/demo/annots.c |  314
+ +++++++++++++++++++++++++++++++++++++++++++++++-----
+ 1 file changed, 289 insertions(+), 25 deletions(-)
+
+commit 7cc8fd70f68d2cdab7ab83a0ecf6c8896c971d62
+Author: Pino Toscano <pino@kde.org>
+Date:  Wed Mar 26 21:03:34 2008 +0100
+
+    remove damn error
+
+ qt4/src/poppler-page.cc.orig | 1317
+ ------------------------------------------
+ 1 file changed, 1317 deletions(-)
+
+commit 7a47ff3b54678a3de6964d25050e02186484f39a
+Author: Pino Toscano <pino@kde.org>
+Date:  Wed Mar 26 21:00:32 2008 +0100
+
+    [Qt4] Add support for JavaScript links, and create them when present.
+
+ qt4/src/poppler-link.cc      |   36 ++
+ qt4/src/poppler-link.h       |   32 +-
+ qt4/src/poppler-page.cc      |    7 +
+ qt4/src/poppler-page.cc.orig | 1317
+ ++++++++++++++++++++++++++++++++++++++++++
+ 4 files changed, 1391 insertions(+), 1 deletion(-)
+
+commit a6f2c10ee01ee62ae945b50f6b6eae380377fe03
+Author: Pino Toscano <pino@kde.org>
+Date:  Wed Mar 26 20:59:21 2008 +0100
+
+    [Qt4] Read the document-level JavaScript scripts.
+
+ qt4/src/poppler-document.cc |  15 +++++++++++++++
+ qt4/src/poppler-qt4.h      |    8 ++++++++
+ 2 files changed, 23 insertions(+)
+
+commit b8a471e55b998836c09c65ff736afdef8ac55189
+Author: Pino Toscano <pino@kde.org>
+Date:  Wed Mar 26 20:56:01 2008 +0100
+
+    Add support for JavaScript actions, and read them when found.
+
+ poppler/Link.cc |   33 +++++++++++++++++++++++++++++++++
+ poppler/Link.h  |   23 +++++++++++++++++++++++
+ 2 files changed, 56 insertions(+)
+
+commit 2fd85dc1b8b2ababadfc60e285c08a844737e4bb
+Author: Pino Toscano <pino@kde.org>
+Date:  Wed Mar 26 20:53:42 2008 +0100
+
+    Read the JavaScript codes in the NameTree of the Catalog.
+
+ poppler/Catalog.cc |  39 +++++++++++++++++++++++++++++++++++++++
+ poppler/Catalog.h  |   7 +++++++
+ 2 files changed, 46 insertions(+)
+
+commit 312f14f5b7be1f0d62620477222919423c3869e0
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Wed Mar 26 20:05:31 2008 +0100
+
+    compile++
+
+ fofi/FoFiBase.cc |    2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 5bd750062e1fb136f77a55d1f35b2d6fabaad1b3
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Wed Mar 26 19:42:43 2008 +0100
+
+    update version
+
+ CMakeLists.txt   |    2 +-
+ configure.ac    |    2 +-
+ msvc/config.h   |    6 +++---
+ qt4/src/Doxyfile |    2 +-
+ 4 files changed, 6 insertions(+), 6 deletions(-)
+
+commit 10d4a8b9aed51902157c04d9deea0e99d829c4f6
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Wed Mar 26 19:42:36 2008 +0100
+
+    fill news
+
+ NEWS |   10 ++++++++++
+ 1 file changed, 10 insertions(+)
+
+commit 2069826d61ebd527768b6455689276c0a8288085
+Author: Pino Toscano <pino@kde.org>
+Date:  Wed Mar 26 16:05:06 2008 +0100
+
+    missing break
+
+ qt4/src/poppler-page.cc |    1 +
+ 1 file changed, 1 insertion(+)
+
+commit d6a0c6a6803a03f402c2dcde41c6195e951470ba
+Author: Pino Toscano <pino@kde.org>
+Date:  Wed Mar 26 15:50:39 2008 +0100
+
+    initialize posterStream to avoid crashing later
+
+ poppler/Movie.cc |    1 +
+ 1 file changed, 1 insertion(+)
+
+commit 0be811b3ad86b1cb14be94a017e70c65b8e64730
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Tue Mar 25 22:59:22 2008 +0100
+
+    Don't end up in an infinite recursive loop in case resObj dict is
+    the same we are already in
+
+ poppler/FontInfo.cc |   2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 0222c6ceb0fcf1d7c4422691a68a035a558ad614
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Mon Mar 24 17:14:07 2008 +0100
+
+    fix build when using cmake, not sure it's completely ok, but at
+    least i can compile
+
+ CMakeLists.txt                     |    1 +
+ cmake/modules/FindGTK.cmake |  23 ++++++++++++++++-------
+ config.h.cmake                     |    3 +++
+ glib/CMakeLists.txt        |   17 +++++++++++------
+ glib/poppler-page.cc       |    2 +-
+ glib/test-poppler-glib.cc   |   2 +-
+ 6 files changed, 33 insertions(+), 15 deletions(-)
+
+commit 3e4164f2db69358adf07596195842dd00458b621
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Mon Mar 24 15:10:31 2008 +0100
+
+    fix some cmake HAVE_foo
+
+ CMakeLists.txt |    6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
+
+commit 22f615aee488cc363a078330861e80f389f47061
+Author: Iñigo Martínez <inigomartinez@gmail.com>
+Date:  Sun Mar 23 13:22:07 2008 +0100
+
+    Fixed wrong functions.
+
+    Signed-off-by: Iñigo Martínez <inigomartinez@gmail.com>
+
+ glib/poppler-annot.cc |    4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit cccfe42ed9c53d27cf6a1403ae55bf34a053012d
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Sat Mar 22 19:12:05 2008 +0100
+
+    Fix rm line not to error when no *moc file is present
+
+ qt4/src/Makefile.am   |    2 +-
+ qt4/tests/Makefile.am |    2 +-
+ 2 files changed, 2 insertions(+), 2 deletions(-)
+
+commit e60d39ba0e8b9742106a0c9b1385b1c907729c3f
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Sat Mar 22 19:11:17 2008 +0100
+
+    Fix rm line not to error if no *moc file is present
+
+ qt4/demos/Makefile.am |    2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit d9d52e622c6b28a9941168bb73839ec335ca7232
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Sat Mar 22 19:10:40 2008 +0100
+
+    Fix configure to not require gdk when we are on try mode
+
+ configure.ac |    5 +++--
+ 1 file changed, 3 insertions(+), 2 deletions(-)
+
+commit 9b8809298dd16cdbffcc12b6db8e274578934063
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Sat Mar 22 15:49:02 2008 +0100
+
+    It's really only an error if < 0
+
+ poppler/PDFDoc.cc |   2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 0fb1e697cc4100ce23298141c8b5829273872423
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Sat Mar 22 15:46:44 2008 +0100
+
+    remove unneeded variable
+
+ poppler/PDFDoc.cc |   1 -
+ 1 file changed, 1 deletion(-)
+
+commit 3404cb626ee9b4520d6fe601e07560745a4cb42a
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Sat Mar 22 15:44:50 2008 +0100
+
+    Remove OutStream::reset since noone uses it
+
+    This way we have a fseek less to care about if worked or not
+
+ poppler/Stream.cc                           |    5 -----
+ poppler/Stream.h                            |    5 -----
+ qt4/src/poppler-qiodeviceoutstream-private.h |    1 -
+ qt4/src/poppler-qiodeviceoutstream.cc       |    5 -----
+ 4 files changed, 16 deletions(-)
+
+commit 066595dd06c930997d5ec65a06c822616af9baa0
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Sat Mar 22 15:43:07 2008 +0100
+
+    Check the document stream is seekable when opening it
+
+    Fixes bug 14126
+
+ poppler/PDFDoc.cc |   7 +++++++
+ 1 file changed, 7 insertions(+)
+
+commit 23b6475463f8973b5ac83bb21a6b7b6000cc435b
+Author: Ed Avis <eda@waniasset.com>
+Date:  Sat Mar 22 13:55:59 2008 +0100
+
+    Check for fseek return values
+
+ fofi/FoFiBase.cc   |  14 ++++++++++++--
+ poppler/GfxFont.cc |  12 ++++++++++--
+ 2 files changed, 22 insertions(+), 4 deletions(-)
+
+commit b33bb282e45cf1a083cfbb13603ac465d386c28d
+Author: Iñigo Martínez <inigomartinez@gmail.com>
+Date:  Fri Mar 21 13:53:21 2008 +0100
+
+    Fixed poppler glib public api.
+
+    Signed-off-by: Iñigo Martínez <inigomartinez@gmail.com>
+
+ glib/poppler-annot.cc |    4 ++--
+ glib/poppler-annot.h  |    2 +-
+ 2 files changed, 3 insertions(+), 3 deletions(-)
+
+commit 371932f413d570d7784c668f30834d3d92d7aa80
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Thu Mar 20 11:44:32 2008 +0100
+
+    [glib] Remove unused variable.
+
+ glib/poppler-document.cc |    1 -
+ 1 file changed, 1 deletion(-)
+
+commit 21fa476ac384256c15a954b708e009f2b336b06f
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Thu Mar 20 11:42:32 2008 +0100
+
+    [glib] Do not cache image_dev in poppler page.
+
+    Thanks to Kouhei Sutou who caught the problem.
+
+ glib/poppler-page.cc     |   60
+ ++++++++++++++++++++++++++-------------------
+ glib/poppler-private.h    |   3 ---
+ glib/test-poppler-glib.cc |   9 ++++++-
+ 3 files changed, 43 insertions(+), 29 deletions(-)
+
+commit 22cd70d8fc308fb8b19d36d0172014ba532230fb
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Wed Mar 19 21:52:14 2008 +0100
+
+    poppler_annot_markup_get_opacity returns a double so use %f
+
+ glib/demo/annots.c |   2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit b9a5fd4671638caa91f8a389be278d993391f499
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Wed Mar 19 21:28:49 2008 +0100
+
+    updated by gtk-doc
+
+ glib/reference/tmpl/poppler-action.sgml |    1 +
+ glib/reference/tmpl/poppler.sgml       |    3 +++
+ 2 files changed, 4 insertions(+)
+
+commit b7e0b740578ea1e84ac0ef850b5a03c66b2863e3
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Wed Mar 19 21:28:01 2008 +0100
+
+    Fill 0.7.3 news
+
+ NEWS |    7 +++++++
+ 1 file changed, 7 insertions(+)
+
+commit 3adaff1dad8127fdd06653cf49196027ad414a08
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Wed Mar 19 21:27:46 2008 +0100
+
+    Bump version to 0.7.3
+
+ CMakeLists.txt   |    2 +-
+ configure.ac    |    2 +-
+ msvc/config.h   |    6 +++---
+ qt4/src/Doxyfile |    2 +-
+ 4 files changed, 6 insertions(+), 6 deletions(-)
+
+commit 52dd710b63911be2d8c960de0232c497c35ecac8
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Wed Mar 19 18:35:35 2008 +0100
+
+    [glib] Update outline and links demos to the new POPPLER_ACTION_NONE
+
+ glib/demo/utils.c |   3 +++
+ 1 file changed, 3 insertions(+)
+
+commit 6a22f0a20df38156c06e8ba10649e0828a1da102
+Author: Eugen Dedu <Eugen.Dedu@pu-pm.univ-fcomte.fr>
+Date:  Wed Mar 19 18:32:48 2008 +0100
+
+    [glib] Consider no action as an action of type None instead of Unknown
+
+ glib/poppler-action.cc |    2 +-
+ glib/poppler-action.h |    1 +
+ 2 files changed, 2 insertions(+), 1 deletion(-)
+
+commit 185d5818fd546f85934b041d5b0cdcdf1849b1dc
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Tue Mar 18 20:08:21 2008 +0100
+
+    Improve error handling when creating a document
+
+ glib/poppler-document.cc |   40 ++++++++++++++++++++++++++++------------
+ glib/poppler.h                  |    5 ++++-
+ 2 files changed, 32 insertions(+), 13 deletions(-)
+
+commit 9bba2748985049515bfd9c9b44f26b92fa704078
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Sat Mar 15 01:11:39 2008 +0100
+
+    Some more free
+
+ poppler/OptionalContent.cc |   5 +++++
+ 1 file changed, 5 insertions(+)
+
+commit bfc308935fa138e27c4d2ad0e1c1cad20eba8e8a
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Sat Mar 15 01:05:32 2008 +0100
+
+    Use error instead of printf
+
+ poppler/OptionalContent.cc |  15 ++++++++-------
+ 1 file changed, 8 insertions(+), 7 deletions(-)
+
+commit 998b1523ee653c1585f03b4a580e0d95ba694aca
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Sat Mar 15 01:02:31 2008 +0100
+
+    Some free
+
+ poppler/OptionalContent.cc |   3 +++
+ 1 file changed, 3 insertions(+)
+
+commit c65a66a82259f547927cbb918611bcf4a8e264b2
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Fri Mar 14 20:29:53 2008 +0100
+
+    xx0 is non exclusive so that should be < not <=
+
+    Fixes several warnings about writes on bad places
+
+ splash/SplashXPathScanner.cc |    5 +++--
+ 1 file changed, 3 insertions(+), 2 deletions(-)
+
+commit bd2272f3079319d1c05ca93f7fb6eb0a5370b938
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Fri Mar 14 19:52:04 2008 +0100
+
+    Fix "Make sure we don't draw outside the bitmap on Splash::fillGlyph2"
+    when painting with no aa
+
+    Fixes bug 15009
+
+ splash/Splash.cc |   12 ++++++++----
+ 1 file changed, 8 insertions(+), 4 deletions(-)
+
+commit 5bf8d864e68854f0855e07fb67aa124e06c739cd
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Wed Mar 12 22:48:07 2008 +0100
+
+    fix build
+
+ glib/reference/Makefile.am |   1 +
+ 1 file changed, 1 insertion(+)
+
+commit d0be5c86dcd3310062d820b3515c31e4720af2ca
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Wed Mar 12 22:40:59 2008 +0100
+
+    Update version to 0.7.2 and fill NEWS
+
+ CMakeLists.txt   |    2 +-
+ NEWS            |   20 ++++++++++++++++++++
+ configure.ac    |    2 +-
+ msvc/config.h   |    6 +++---
+ qt4/src/Doxyfile |    2 +-
+ 5 files changed, 26 insertions(+), 6 deletions(-)
+
+commit 0b2ecf39572821a99374e6acec7c1bd438911bbc
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Wed Mar 12 22:38:57 2008 +0100
+
+    update soname here too
+
+ glib/CMakeLists.txt |   2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit f5065016b168e4896e2fe774cd22bbd900849b52
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Wed Mar 12 22:06:53 2008 +0100
+
+    Make GDK dependency option for glib bindings
+
+    Fixes bug #13719.
+
+ configure.ac              |   45 ++-
+ glib/Makefile.am          |    7 +-
+ glib/demo/page.c          |   88 +++++-
+ glib/demo/render.c        |    4 +
+ glib/poppler-action.h     |    1 -
+ glib/poppler-annot.cc     |   26 +-
+ glib/poppler-annot.h      |    2 +-
+ glib/poppler-document.h    |   2 -
+ glib/poppler-features.h.in |   1 +
+ glib/poppler-page.cc      |  695
+ ++++++++++++++++++++++++++------------------
+ glib/poppler-page.h       |   76 +++--
+ glib/poppler.h                    |    2 +-
+ glib/test-poppler-glib.cc  |   2 +-
+ 13 files changed, 610 insertions(+), 341 deletions(-)
+
+commit 46d4fab82332e71d0b68c0a8deeac78f2201ed14
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Wed Mar 12 20:35:33 2008 +0100
+
+    Increment version of libpoppler and libpoppler-qt4
+
+ CMakeLists.txt                |    2 +-
+ poppler/Makefile.am   |    2 +-
+ qt4/src/CMakeLists.txt |    2 +-
+ qt4/src/Makefile.am   |    2 +-
+ 4 files changed, 4 insertions(+), 4 deletions(-)
+
+commit 550c1fc73a6d2af65728751fd0b59ccc7110fa8b
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Wed Mar 12 20:34:48 2008 +0100
+
+    Init to false updated field of XRefEntries plus indenting fixes
+
+ poppler/XRef.cc |   11 ++++++-----
+ 1 file changed, 6 insertions(+), 5 deletions(-)
+
+commit 6a671686c6265ecdb4c48f04392de9c56d4e0936
+Author: Adrian Johnson <ajohnson@redneon.com>
+Date:  Wed Mar 12 21:43:12 2008 +1030
+
+    Fix regression in cairo output when transforming ctm
+
+    The commit:
+    ec01926e5a9dc16e200060497c43e79a1623698d "Avoid setting a singular
+    ctm"
+    introduced a regression in the output when using a ctm.
+
+    The check for an invertable matrix had the side effect of inverting
+    the matrix. Instead, make a copy of the matrix before testing if it is
+    invertable.
+
+ poppler/CairoOutputDev.cc |   7 ++++---
+ 1 file changed, 4 insertions(+), 3 deletions(-)
+
+commit 0b2c3bb25c908b07e760d824dbfe93c6051812aa
+Merge: 362fe01 9c472f7
+Author: Iñigo Martínez <inigomartinez@gmail.com>
+Date:  Wed Mar 12 00:23:58 2008 +0100
+
+    Merge branch 'master' of
+    ssh://inigomartinez@git.freedesktop.org/git/poppler/poppler
+
+commit 362fe013c0d96698b52d70cf5226cddca7fe52d4
+Author: Iñigo Martínez <inigomartinez@gmail.com>
+Date:  Wed Mar 12 00:07:12 2008 +0100
+
+    Enabled back the AnnotWidget support.
+
+    Signed-off-by: Iñigo Martínez <inigomartinez@gmail.com>
+
+ poppler/Annot.cc |    2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 9c472f76d2462d0e775c851fdbac6ca2bc9812ea
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Wed Mar 12 00:00:20 2008 +0100
+
+    cmake build
+
+ glib/demo/CMakeLists.txt |    1 +
+ 1 file changed, 1 insertion(+)
+
+commit 821858f5c36786955d9475044bfee57f5060ad2f
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Tue Mar 11 23:58:05 2008 +0100
+
+    Return char bounding box instead of edge, it's much more useful for
+    character positioning
+
+ qt4/src/poppler-page.cc    |   8 ++++++--
+ qt4/src/poppler-private.h  |   3 +--
+ qt4/src/poppler-qt4.h     |    6 ++----
+ qt4/src/poppler-textbox.cc |   4 ++--
+ 4 files changed, 11 insertions(+), 10 deletions(-)
+
+commit d7e642732ced592362d9787bddadb7a110dcc5a5
+Merge: 3642f0c 2d6c605
+Author: Iñigo Martínez <inigomartinez@gmail.com>
+Date:  Tue Mar 11 23:41:59 2008 +0100
+
+    Merge branch 'master' of
+    ssh://inigomartinez@git.freedesktop.org/git/poppler/poppler
+
+commit 3642f0c48bc49cd4d698e769544c1d8604c6482f
+Author: Iñigo Martínez <inigomartinez@gmail.com>
+Date:  Tue Mar 11 23:13:33 2008 +0100
+
+    glib annots demo.
+
+    Signed-off-by: Iñigo Martínez <inigomartinez@gmail.com>
+
+ glib/demo/Makefile.am |    2 +
+ glib/demo/annots.c    |  468
+ +++++++++++++++++++++++++++++++++++++++++++++++++
+ glib/demo/annots.h    |   31 ++++
+ glib/demo/main.c      |    4 +-
+ 4 files changed, 504 insertions(+), 1 deletion(-)
+
+commit 2d6c60537317bd3ac9e0582e0da09e7365729097
+Author: Pino Toscano <pino@kde.org>
+Date:  Tue Mar 11 22:54:44 2008 +0100
+
+    For now we cannot handle MovieLink's, so comment them out.
+
+ qt4/src/poppler-annotation.cc |    2 ++
+ qt4/src/poppler-link.cc       |    4 ++++
+ qt4/src/poppler-link.h        |    2 ++
+ 3 files changed, 8 insertions(+)
+
+commit a354f7198c493990613a1db131c662ec27948863
+Author: Hugo Mercier <hmercier31@gmail.com>
+Date:  Tue Mar 11 22:49:00 2008 +0100
+
+    Initial Movie support (2)
+
+    Now with the forgotten files
+
+ poppler/Movie.cc |  443
+ ++++++++++++++++++++++++++++++++++++++++++++++++++++++
+ poppler/Movie.h  |  177 ++++++++++++++++++++++
+ 2 files changed, 620 insertions(+)
+
+commit 43e5dd941d4bc35c4eebbad66c13235639e0c1a0
+Merge: aab1768 4fdd254
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Tue Mar 11 22:31:22 2008 +0100
+
+    Merge branch 'master' of
+    ssh://aacid@git.freedesktop.org/git/poppler/poppler
+
+commit 4fdd254370ea6055e95c8ebee51b69e06c501714
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Tue Mar 11 22:31:00 2008 +0100
+
+    Fix build
+
+ glib/poppler-page.cc |    6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
+
+commit aab17684dc3f21ff2b1ee6eacdc0c565d368df78
+Author: Hugo Mercier <hmercier31@gmail.com>
+Date:  Tue Mar 11 22:28:28 2008 +0100
+
+    Initial Movie support
+
+ CMakeLists.txt      |   2 +
+ poppler/Annot.cc    | 316
+ ++++++++++++++++++++++++++++++++++++++++++++++++++-
+ poppler/Annot.h     | 125 ++++++++++++++++++++
+ poppler/Link.cc     | 108 +++++++++++++++---
+ poppler/Link.h      |  64 ++++++++++-
+ poppler/Makefile.am |   2 +
+ 6 files changed, 591 insertions(+), 26 deletions(-)
+
+commit 13a0d2390b9e4684af070c213f385485715353df
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Tue Mar 11 22:27:38 2008 +0100
+
+    Add poppler-annot to the cmake build system
+
+ glib/CMakeLists.txt |   2 ++
+ 1 file changed, 2 insertions(+)
+
+commit 19f0e3b40bce4d8157d8c8bd04eaf6bacbef38b8
+Author: Iñigo Martínez <inigomartinez@gmail.com>
+Date:  Tue Mar 11 22:09:04 2008 +0100
+
+    Add preliminary annotations support in the glib frontend
+
+ glib/Makefile.am      |    2 +
+ glib/poppler-annot.cc |  776
+ ++++++++++++++++++++++++++++++++++++++++++++++++
+ glib/poppler-annot.h  |  181 +++++++++++
+ glib/poppler-page.cc  |  166 +++++++++++
+ glib/poppler-page.h   |   15 +
+ glib/poppler-private.h |    5 +-
+ glib/poppler.h                |    7 +
+ 7 files changed, 1151 insertions(+), 1 deletion(-)
+
+commit 6fa3ab20fee311b4aff92be18870fd0e1730a81f
+Author: Iñigo Martínez <inigomartinez@gmail.com>
+Date:  Tue Mar 11 18:44:27 2008 +0100
+
+    Changed AnnotMarkup inheritance
+
+ poppler/Annot.cc |    9 +++++----
+ poppler/Annot.h  |   10 +++++-----
+ 2 files changed, 10 insertions(+), 9 deletions(-)
+
+commit 3111cfe2ccb32f9680baaad0c3f0678dd5969f8b
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Mon Mar 10 22:12:36 2008 +0100
+
+    And free the memory
+
+ qt4/tests/test-poppler-qt4.cpp |    2 ++
+ 1 file changed, 2 insertions(+)
+
+commit 58f88c23402ac2e678dc655f64d93d89bb1812be
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Mon Mar 10 22:08:43 2008 +0100
+
+    Add the -textRects option to the test app so we can check text rects
+    are correct
+
+ qt4/tests/test-poppler-qt4.cpp |   45
+ +++++++++++++++++++++++++++++++++++-----
+ 1 file changed, 40 insertions(+), 5 deletions(-)
+
+commit 94ceb3cae79dc7786fa59fd889a87160780ed5df
+Merge: 0f9e843 35f34bd
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Sun Mar 9 23:34:11 2008 +0100
+
+    Merge branch 'master' of
+    ssh://aacid@git.freedesktop.org/git/poppler/poppler
+
+commit 0f9e84302ac2108f05bdbb10e7e57ae19ad1e9f3
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Sun Mar 9 23:33:11 2008 +0100
+
+    Do not force default values to fontconfig patterns as fontconfig
+    already fills in default values for us
+
+    Fixes bug 14883
+
+ poppler/GlobalParams.cc |   17 +++++++++--------
+ 1 file changed, 9 insertions(+), 8 deletions(-)
+
+commit 35f34bd44c74eeb76a58b30acfbb0303d7285f06
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Sun Mar 9 17:38:54 2008 +0100
+
+    Fix build when compiling without cairo support
+
+ glib/demo/images.c |   4 ++++
+ 1 file changed, 4 insertions(+)
+
+commit 32637db19dd80a9b8452f86eb677b10e77290627
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Sun Mar 9 00:57:08 2008 +0100
+
+    proper lib64 Qt detection
+
+    Fixes bug 14583
+
+ m4/qt.m4 |   15 ++++++++++++---
+ 1 file changed, 12 insertions(+), 3 deletions(-)
+
+commit 65a88a95a5c54c890048e8a986df361585d601dd
+Author: Pino Toscano <pino@kde.org>
+Date:  Sat Mar 8 03:11:36 2008 +0100
+
+    Provide the mime type for an embedded file, if known.
+
+    Adapt the unit test for that.
+
+ qt4/src/poppler-embeddedfile.cc |    5 +++++
+ qt4/src/poppler-qt4.h          |    5 +++++
+ qt4/tests/check_attachments.cpp |    7 +++++++
+ 3 files changed, 17 insertions(+)
+
+commit 23da27a229c8b3cc2a0a0dd6354c40723934390c
+Author: Pino Toscano <pino@kde.org>
+Date:  Sat Mar 8 03:10:58 2008 +0100
+
+    Optionally read the mimetype for the embedded files.
+
+ poppler/Catalog.cc |  17 +++++++++--------
+ poppler/Catalog.h  |   7 ++++++-
+ 2 files changed, 15 insertions(+), 9 deletions(-)
+
+commit 42c254b978c61e2ccfda083dfeffec9fc35a5fe7
+Author: Pino Toscano <pino@kde.org>
+Date:  Mon Mar 3 16:56:09 2008 +0100
+
+    be safe about out-of-range values
+
+ qt4/src/poppler-textbox.cc |   2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 5db75df77938eb7620867d0618058be52ed2d3cb
+Author: Pino Toscano <pino@kde.org>
+Date:  Mon Mar 3 16:53:39 2008 +0100
+
+    initialize nicely
+
+ qt4/src/poppler-private.h |   5 +++++
+ 1 file changed, 5 insertions(+)
+
+commit 3ad0ab7e4abd37528284269c69be3cdfb8d31d2e
+Author: Pino Toscano <pino@kde.org>
+Date:  Mon Mar 3 16:49:23 2008 +0100
+
+    apidox
+
+ qt4/src/poppler-link.h |   17 +++++++++++++++++
+ qt4/src/poppler-qt4.h |   23 ++++++++++++++++++++++-
+ 2 files changed, 39 insertions(+), 1 deletion(-)
+
+commit ec01926e5a9dc16e200060497c43e79a1623698d
+Author: Jeff Muizelaar <jeff@infidigm.net>
+Date:  Sun Mar 2 20:15:20 2008 -0500
+
+    Avoid setting a singular ctm
+
+    Ignoring singular ctm's gives a better result than having
+    our cairo context error and turn off. Related to #14398.
+
+ poppler/CairoOutputDev.cc |   14 ++++++++++++++
+ 1 file changed, 14 insertions(+)
+
+commit 4882d7a118b93fdb5c441d70757e485be7ee25d7
+Author: Pino Toscano <pino@kde.org>
+Date:  Thu Feb 28 15:12:23 2008 +0100
+
+    printf -> qDebug
+
+ qt4/src/poppler-optcontent.cc |    2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 31ce4049bf12c2716be7ec0fb8eda502d989f66e
+Author: Brad Hards <bradh@saxicola.cuneata.net>
+Date:  Thu Feb 28 22:09:30 2008 +1100
+
+    Respect PageMode for optional content and embedded files.
+
+    This makes the PDF 1.7 spec open with the embedded files showing.
+
+ qt4/demos/embeddedfiles.cpp |   7 +++++++
+ qt4/demos/embeddedfiles.h   |   1 +
+ qt4/demos/optcontent.cpp    |   8 ++++++++
+ qt4/demos/optcontent.h      |   1 +
+ 4 files changed, 17 insertions(+)
+
+commit ff938c431799d49325c0f46f1e6cbe1033993a83
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Wed Feb 27 23:12:53 2008 +0100
+
+    do not forget to distribute GlobalParamsWin.cc next time
+
+ poppler/Makefile.am |   3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+commit 277382b8186d137a9f2a62bc2d22e9f0cda7d923
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Wed Feb 27 22:56:33 2008 +0100
+
+    fix typo
+
+ glib/demo/images.c |   2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 5b2f8f21fca63508570a0c77c6f7221a322e6e57
+Merge: 7e65118 4254f12
+Author: Pino Toscano <pino@kde.org>
+Date:  Wed Feb 27 22:10:12 2008 +0100
+
+    Merge branch 'master' of
+    ssh://pino@git.freedesktop.org/git/poppler/poppler
+
+commit 7e651186f483976f9833de245b6c7add38e77a16
+Author: Pino Toscano <pino@kde.org>
+Date:  Wed Feb 27 22:03:17 2008 +0100
+
+    Properly enable/disable the contents when their parents are changed.
+
+    Now, the children maintain the "checked state" they had, when their
+    parent is unchecked;
+    but, they are really disabled, both in the possibility to be checked
+    and in the drawing of their associated content [applying the same
+    to their children, and so on].
+
+ qt4/src/poppler-optcontent-private.h |    8 +++++++-
+ qt4/src/poppler-optcontent.cc       |   37
+ +++++++++++++++++++++++++++++-----
+ 2 files changed, 39 insertions(+), 6 deletions(-)
+
+commit 4254f1237ebed09b8e1c85f935a20bde3d8f36ff
+Merge: ed6c0c2 0569ae7
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Wed Feb 27 20:44:27 2008 +0100
+
+    Merge branch 'master' of
+    ssh://aacid@git.freedesktop.org/git/poppler/poppler
+
+commit 8d384c06f96ba8cb3e73c275b3c708c64da4595d
+Author: Pino Toscano <pino@kde.org>
+Date:  Wed Feb 27 20:39:09 2008 +0100
+
+    small header cleanup
+
+ qt4/src/poppler-optcontent-private.h |    9 +++++++--
+ qt4/src/poppler-optcontent.cc       |    7 ++++---
+ 2 files changed, 11 insertions(+), 5 deletions(-)
+
+commit ed6c0c260837a0025279765ef7778b83d6ee2209
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Wed Feb 27 20:43:45 2008 +0100
+
+    fix build and distcheck with autools
+
+ qt4/demos/Makefile.am |    3 +++
+ qt4/src/Makefile.am   |    5 ++++-
+ qt4/tests/Makefile.am |    3 +++
+ 3 files changed, 10 insertions(+), 1 deletion(-)
+
+commit 344d55539b1b6bcabec609fd828db372a07491b4
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Wed Feb 27 20:43:13 2008 +0100
+
+    fill the NEWS for 0.7.1
+
+ NEWS |   15 +++++++++++++++
+ 1 file changed, 15 insertions(+)
+
+commit 1c47633ba782021978fa34d41a4ab0badf3af9d3
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Wed Feb 27 20:42:55 2008 +0100
+
+    Increase version number to 0.7.1
+
+ CMakeLists.txt   |    2 +-
+ configure.ac    |    2 +-
+ msvc/config.h   |    6 +++---
+ qt4/src/Doxyfile |    2 +-
+ 4 files changed, 6 insertions(+), 6 deletions(-)
+
+commit 0569ae76b6af1723b4606af189242a23199f387d
+Merge: f395531 d8eba8c
+Author: Brad Hards <bradh@kde.org>
+Date:  Thu Feb 28 06:26:09 2008 +1100
+
+    Merge branch 'master' of
+    ssh://bradh@git.freedesktop.org/git/poppler/poppler
+
+commit d8eba8c10834116b4f0f295375805172f5216993
+Author: Pino Toscano <pino@kde.org>
+Date:  Wed Feb 27 19:07:46 2008 +0100
+
+    export the OptContentModel
+
+ qt4/src/poppler-optcontent.h |    4 +++-
+ 1 file changed, 3 insertions(+), 1 deletion(-)
+
+commit 0445e64a4124af7c1b84673f237022e133eb8542
+Author: Pino Toscano <pino@kde.org>
+Date:  Wed Feb 27 19:04:03 2008 +0100
+
+    make only the Document able to create OptContentsModel's
+
+ qt4/src/poppler-optcontent.h |    6 +++++-
+ 1 file changed, 5 insertions(+), 1 deletion(-)
+
+commit c965437b67a4f97ee8365a217bd10406fba3767a
+Author: Pino Toscano <pino@kde.org>
+Date:  Wed Feb 27 18:58:31 2008 +0100
+
+    setRootNode() is private (and unused) API
+
+ qt4/src/poppler-optcontent-private.h |    2 ++
+ qt4/src/poppler-optcontent.cc       |    8 ++++----
+ qt4/src/poppler-optcontent.h        |    4 ----
+ 3 files changed, 6 insertions(+), 8 deletions(-)
+
+commit e293bfc384e2dfc4ef04582053ce18d8c0bcb7b3
+Author: Pino Toscano <pino@kde.org>
+Date:  Wed Feb 27 18:50:35 2008 +0100
+
+    small cleanup
+
+ qt4/src/poppler-optcontent.cc |   11 ++++-------
+ 1 file changed, 4 insertions(+), 7 deletions(-)
+
+commit f11aa0008585e845ce509172d76f72f941be497d
+Author: Pino Toscano <pino@kde.org>
+Date:  Wed Feb 27 18:44:09 2008 +0100
+
+    adapt the tests to the new layout of the contents model
+
+ qt4/tests/check_optcontent.cpp |   66
+ ++++++++++++++--------------------------
+ 1 file changed, 23 insertions(+), 43 deletions(-)
+
+commit 4a324484b5c77ddc348746e7bcf6051ade28e389
+Author: Pino Toscano <pino@kde.org>
+Date:  Wed Feb 27 18:04:52 2008 +0100
+
+    free some objects (thus leak less)
+
+ poppler/Gfx.cc                    |    2 ++
+ poppler/OptionalContent.cc |   2 ++
+ 2 files changed, 4 insertions(+)
+
+commit 0f4e7791ab6884072a1aee56e9cec212d8cea263
+Author: Pino Toscano <pino@kde.org>
+Date:  Wed Feb 27 15:58:21 2008 +0100
+
+    ignore any generated .moc here
+
+ qt4/src/.gitignore |   2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 136ae44f155b17d9e8b041b67f75531d8544337c
+Author: Pino Toscano <pino@kde.org>
+Date:  Wed Feb 27 15:56:09 2008 +0100
+
+    keep track of the items changed when toggling an item, so we can
+    update them properly
+
+ qt4/src/poppler-optcontent-private.h |    4 ++--
+ qt4/src/poppler-optcontent.cc       |   38
+ +++++++++++++++++++++++++++-------
+ 2 files changed, 32 insertions(+), 10 deletions(-)
+
+commit b73e2afef7e5e1b68d82a10c94bca3c201c5f8b3
+Author: Pino Toscano <pino@kde.org>
+Date:  Wed Feb 27 15:52:06 2008 +0100
+
+    fix indexFromItem once again, and make parent() call it with the
+    right node
+
+ qt4/src/poppler-optcontent-private.h |    2 +-
+ qt4/src/poppler-optcontent.cc       |   19 +++++++++----------
+ 2 files changed, 10 insertions(+), 11 deletions(-)
+
+commit 803787f763578320aa5f405ed49c64e6b924bad3
+Author: Pino Toscano <pino@kde.org>
+Date:  Wed Feb 27 15:30:18 2008 +0100
+
+    compile with the autotools
+
+    (second patch I forgot to apply with the first)
+
+ qt4/src/Makefile.am |   9 ++++++---
+ 1 file changed, 6 insertions(+), 3 deletions(-)
+
+commit 0b527a8ed62677bb09df4587f072a310c2959750
+Author: Pino Toscano <pino@kde.org>
+Date:  Wed Feb 27 14:34:13 2008 +0100
+
+    Extract the OptContentItem -> QModelIndex creation in an own function.
+
+ qt4/src/poppler-optcontent-private.h |    1 +
+ qt4/src/poppler-optcontent.cc       |    7 ++++++-
+ 2 files changed, 7 insertions(+), 1 deletion(-)
+
+commit c94d6cc95c6838f31e27832cb3090389bf4d8227
+Author: Pino Toscano <pino@kde.org>
+Date:  Wed Feb 27 14:30:26 2008 +0100
+
+    Make index(), data() and setData() more safe.
+
+    Errors spotted using ModelTest.
+
+ qt4/src/poppler-optcontent-private.h |    2 +-
+ qt4/src/poppler-optcontent.cc       |   15 +++++++++------
+ 2 files changed, 10 insertions(+), 7 deletions(-)
+
+commit b8e833733d84eaa93d6bae522710feb3075ca329
+Author: Pino Toscano <pino@kde.org>
+Date:  Wed Feb 27 14:05:19 2008 +0100
+
+    fix build with the autotools
+
+ qt4/src/Makefile.am |   4 +++-
+ 1 file changed, 3 insertions(+), 1 deletion(-)
+
+commit f89ba474bae281f1cdeddb72ac8425dee1087e35
+Author: Pino Toscano <pino@kde.org>
+Date:  Wed Feb 27 13:28:50 2008 +0100
+
+    Put the check states of the optional contents in the same column as
+    the name.
+
+    This feels a bit more elegant than changing a value in a different
+    column.
+    Cleanup data()/setData() so they can be extended easily.
+
+ qt4/src/poppler-optcontent.cc |   74
+ +++++++++++++++++++++--------------------
+ 1 file changed, 38 insertions(+), 36 deletions(-)
+
+commit defa0ecb2790402a4069fea3b3c285a50675682d
+Author: Pino Toscano <pino@kde.org>
+Date:  Wed Feb 27 12:24:16 2008 +0100
+
+    Add a skeleton of OptContentModel::headerData().
+
+    It does nothing yet, but we can add stuff later on w/o breaking BC.
+
+ qt4/src/poppler-optcontent.cc |    5 +++++
+ qt4/src/poppler-optcontent.h  |    2 ++
+ 2 files changed, 7 insertions(+)
+
+commit f395531a3e8f71a46b3c942f8f437ade1d9fdb57
+Author: Brad Hards <bradh@kde.org>
+Date:  Wed Feb 27 22:22:51 2008 +1100
+
+    Minor cleanup.
+
+ qt4/src/poppler-optcontent.cc |    7 +++----
+ 1 file changed, 3 insertions(+), 4 deletions(-)
+
+commit 0a19486cb4de57c0c987cc4ce2434a96bbd18338
+Author: Pino Toscano <pino@kde.org>
+Date:  Wed Feb 27 12:15:44 2008 +0100
+
+    refresh the current page when the data of the content model change
+
+ qt4/demos/optcontent.cpp |    8 ++++++++
+ qt4/demos/optcontent.h   |    3 +++
+ 2 files changed, 11 insertions(+)
+
+commit 09b7cc2efb7d21fa4dabd23d2d2de877cc7d86ee
+Author: Pino Toscano <pino@kde.org>
+Date:  Wed Feb 27 12:15:18 2008 +0100
+
+    optional method to reload the current page
+
+ qt4/demos/documentobserver.cpp |    5 +++++
+ qt4/demos/documentobserver.h  |    1 +
+ 2 files changed, 6 insertions(+)
+
+commit 39fe905be8f2ae79d9c26cd87547f3ea2608411e
+Author: Pino Toscano <pino@kde.org>
+Date:  Wed Feb 27 12:00:29 2008 +0100
+
+    Add a dock for showing the optional content tree.
+
+ qt4/demos/CMakeLists.txt |    1 +
+ qt4/demos/Makefile.am   |    3 +++
+ qt4/demos/optcontent.cpp |   55
+ ++++++++++++++++++++++++++++++++++++++++++++++
+ qt4/demos/optcontent.h   |   43 ++++++++++++++++++++++++++++++++++++
+ qt4/demos/viewer.cpp    |    7 ++++++
+ 5 files changed, 109 insertions(+)
+
+commit f17dd5539501a996479b903ac9b8aceb3c4cfafe
+Author: Pino Toscano <pino@kde.org>
+Date:  Wed Feb 27 11:53:32 2008 +0100
+
+    cleanup
+
+ qt4/src/poppler-optcontent-private.h |    3 ++-
+ qt4/src/poppler-optcontent.h        |    4 +---
+ 2 files changed, 3 insertions(+), 4 deletions(-)
+
+commit f3cc894559f10dbd4277fa9f30de9931ed69dfd4
+Author: Pino Toscano <pino@kde.org>
+Date:  Wed Feb 27 11:43:34 2008 +0100
+
+    OptContentModel::itemFromRef() and OptContentItem are private API.
+
+    Hide them in the implementation.
+
+ qt4/src/poppler-optcontent-private.h |   43
+ ++++++++++++++++++++++++++++++++++
+ qt4/src/poppler-optcontent.cc       |    8 +++----
+ qt4/src/poppler-optcontent.h        |   42
+ ---------------------------------
+ 3 files changed, 47 insertions(+), 46 deletions(-)
+
+commit 48e8b2105cf8f177ca655b969470e45e2407db82
+Author: Pino Toscano <pino@kde.org>
+Date:  Wed Feb 27 11:28:16 2008 +0100
+
+    move all the private stuff of OptContentModel into its d-pointer
+
+ qt4/src/poppler-optcontent-private.h |    9 +++++++--
+ qt4/src/poppler-optcontent.cc       |   29 +++++++++++++++--------------
+ qt4/src/poppler-optcontent.h        |    4 ----
+ 3 files changed, 22 insertions(+), 20 deletions(-)
+
+commit b78a7f7a0e8d5a9c22014d34754090d863030e0d
+Author: Pino Toscano <pino@kde.org>
+Date:  Wed Feb 27 11:06:57 2008 +0100
+
+    use a QPointer for the OptContentModel, so we are safe about
+    ownership.
+
+ qt4/src/poppler-document.cc |   4 ++--
+ qt4/src/poppler-private.h   |   6 +++---
+ 2 files changed, 5 insertions(+), 5 deletions(-)
+
+commit 48557da71adb0fe6bd4da2fb32433796a96c3576
+Author: Brad Hards <bradh@kde.org>
+Date:  Wed Feb 27 19:39:18 2008 +1100
+
+    We need to install the optional content header.
+
+ qt4/src/CMakeLists.txt |    1 +
+ 1 file changed, 1 insertion(+)
+
+commit 6e2bb03b5ef256c03a8da1cbf9bbc87c593942ad
+Author: Brad Hards <bradh@kde.org>
+Date:  Wed Feb 27 19:23:49 2008 +1100
+
+    Partial d-pointer implementation.
+
+ qt4/src/poppler-optcontent-private.h |   57
+ ++++++++++++++++++++++++++++++++++
+ qt4/src/poppler-optcontent.cc       |   49 +++++++++++++++++------------
+ qt4/src/poppler-optcontent.h        |   24 +++-----------
+ 3 files changed, 92 insertions(+), 38 deletions(-)
+
+commit c627b7aa10ae9cdceb78b751a7e826170f402af0
+Author: Brad Hards <bradh@kde.org>
+Date:  Wed Feb 27 16:12:38 2008 +1100
+
+    A couple of cleanups suggested by Pino.
+
+ qt4/src/poppler-document.cc |   6 +++---
+ qt4/src/poppler-qt4.h      |    8 +++++---
+ 2 files changed, 8 insertions(+), 6 deletions(-)
+
+commit 81891667e18fcf164af02f5f366de07f78d67c8f
+Author: Brad Hards <bradh@kde.org>
+Date:  Wed Feb 27 15:47:03 2008 +1100
+
+    Add in the initial part of the optional content support.
+
+    To see this work, compare ClarityOCGs.pdf with and
+    without this change.
+
+    Right now we only handle optional content using
+    XObjects. Optional content using Marked Content has
+    infrastructure, but is not implemented. That will be
+    quite invasive in Gfx, and I'm not confident enough
+    to do it this late in the process.
+
+ CMakeLists.txt                        |    1 +
+ poppler/Catalog.cc            |    9 +
+ poppler/Catalog.h             |    4 +
+ poppler/Gfx.cc                        |   65 +++++-
+ poppler/Gfx.h                 |   12 +-
+ poppler/Makefile.am           |    2 +
+ poppler/OptionalContent.cc    |  322 ++++++++++++++++++++++++++
+ poppler/OptionalContent.h     |   85 +++++++
+ poppler/PDFDoc.h              |    5 +
+ poppler/PSOutputDev.cc                |    6 +-
+ poppler/Page.cc               |    2 +-
+ qt4/src/.gitignore            |    1 +
+ qt4/src/CMakeLists.txt                |    3 +
+ qt4/src/Makefile.am           |    6 +
+ qt4/src/poppler-document.cc   |   13 ++
+ qt4/src/poppler-optcontent.cc |  354 ++++++++++++++++++++++++++++
+ qt4/src/poppler-optcontent.h  |  122 ++++++++++
+ qt4/src/poppler-private.h     |    4 +
+ qt4/src/poppler-qt4.h         |   18 ++
+ qt4/tests/.gitignore          |    1 +
+ qt4/tests/CMakeLists.txt      |    1 +
+ qt4/tests/Makefile.am         |    5 +
+ qt4/tests/check_optcontent.cpp |  499
+ ++++++++++++++++++++++++++++++++++++++++
+ 23 files changed, 1532 insertions(+), 8 deletions(-)
+
+commit 11b70bcda905e618c199a067db6b0246612e101d
+Author: Pino Toscano <pino@kde.org>
+Date:  Tue Feb 26 23:01:27 2008 +0100
+
+    fixup the default export macro name (added by cmake); _WIN32 is
+    defined only on win32 (remove a plethora of warnings)
+
+ qt4/src/poppler-export.h |    4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit d4d6c14cd83d04c61daa6618c3148a0bb47dc292
+Author: Pino Toscano <pino@kde.org>
+Date:  Tue Feb 26 22:57:02 2008 +0100
+
+    install the export header
+
+ qt4/src/CMakeLists.txt |    1 +
+ qt4/src/Makefile.am   |    1 +
+ 2 files changed, 2 insertions(+)
+
+commit 4ba2e2d21710135656adbf93c5994cfb46502308
+Author: Pino Toscano <pino@kde.org>
+Date:  Tue Feb 26 22:55:30 2008 +0100
+
+    no need to include the export header in private headers
+
+ qt4/src/poppler-annotation-helper.h         |    1 -
+ qt4/src/poppler-annotation-private.h        |    1 -
+ qt4/src/poppler-converter-private.h         |    1 -
+ qt4/src/poppler-link-extractor-private.h     |    1 -
+ qt4/src/poppler-page-private.h                      |    1 -
+ qt4/src/poppler-private.h                   |    1 -
+ qt4/src/poppler-qiodeviceoutstream-private.h |    1 -
+ 7 files changed, 7 deletions(-)
+
+commit 0a466c09fb70b92f39df19bc315b6575e419ad5b
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Tue Feb 26 22:47:31 2008 +0100
+
+    We also need to distribute poppler-export.h
+
+ qt4/src/Makefile.am |   1 +
+ 1 file changed, 1 insertion(+)
+
+commit 2034d57c700049bc9a6565bbb818e1c9f4467784
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Tue Feb 26 22:46:29 2008 +0100
+
+    Now for real: Add special casing in cmake buildsystem for MSVC,
+    also add Export markers to qt4 classes, although symbol visibility
+    is only used on MSVC at the moment
+
+ CMakeLists.txt                                      |    5 +++++
+ qt4/src/CMakeLists.txt                              |    3 +++
+ qt4/src/poppler-annotation-helper.h         |    1 +
+ qt4/src/poppler-annotation-private.h        |    1 +
+ qt4/src/poppler-annotation.h                |   19 ++++++++++---------
+ qt4/src/poppler-converter-private.h         |    1 +
+ qt4/src/poppler-export.h                    |    6 +++---
+ qt4/src/poppler-form.h                              |    9 +++++----
+ qt4/src/poppler-link-extractor-private.h     |    1 +
+ qt4/src/poppler-link.h                              |   17 +++++++++--------
+ qt4/src/poppler-page-private.h                      |    1 +
+ qt4/src/poppler-private.h                   |    1 +
+ qt4/src/poppler-qiodeviceoutstream-private.h |    1 +
+ qt4/src/poppler-qt4.h                       |   21 +++++++++++----------
+ qt4/tests/CMakeLists.txt                    |    6 ++++++
+ 15 files changed, 59 insertions(+), 34 deletions(-)
+
+commit b931920f63f4276ec355118faa061bafa5ac5244
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Tue Feb 26 22:42:16 2008 +0100
+
+    Add special casing in cmake buildsystem for MSVC, also add Export
+    markers to qt4 classes, although symbol visibility is only used on
+    MSVC at the moment
+
+ qt4/src/poppler-export.h |   17 +++++++++++++++++
+ 1 file changed, 17 insertions(+)
+
+commit 1778fddb36d6cb2c7f7848bee06189158f69f16e
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Sun Feb 24 23:02:08 2008 +0100
+
+    Add the cmake files to EXTRA_DIST so they get added when i do make
+    dist to get the release tarball
+
+ Makefile.am |  39 +++++++++++++++++++++++++++++++++++++++
+ 1 file changed, 39 insertions(+)
+
+commit 51f171e10a42d492c8c32a5e2578d05b73d89238
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Sun Feb 24 22:47:46 2008 +0100
+
+    ignore more
+
+ qt4/demos/.gitignore |    2 ++
+ 1 file changed, 2 insertions(+)
+
+commit adb1ccdb9265f0583cb348c456a39efac610aff1
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Sun Feb 24 22:46:33 2008 +0100
+
+    ignore
+
+ qt4/demos/.gitignore |    2 ++
+ 1 file changed, 2 insertions(+)
+
+commit 101e526c63175ffc1a75e1b68da7bb4fff9cd530
+Author: Patrick Spendrin <ps_ml@gmx.de>
+Date:  Sun Feb 24 20:52:41 2008 +0100
+
+    define snprintf to _snprintf if we are building on MSVC
+
+ config.h.cmake |    4 ++++
+ 1 file changed, 4 insertions(+)
+
+commit f7f8ab488257c3979d20e5c0690ec5d7c2cd831b
+Author: Patrick Spendrin <ps_ml@gmx.de>
+Date:  Sun Feb 24 20:43:11 2008 +0100
+
+    define M_PI in case it is not defined
+
+ poppler/Function.cc |   4 ++++
+ 1 file changed, 4 insertions(+)
+
+commit f00436b63bf9a42dcb2728a07db9c20f1f23d0bc
+Author: Patrick Spendrin <ps_ml@gmx.de>
+Date:  Sun Feb 24 20:39:42 2008 +0100
+
+    Add proper dirent.h guards
+
+ utils/pdftoabw.cc  |   2 ++
+ utils/pdftohtml.cc |   2 ++
+ 2 files changed, 4 insertions(+)
+
+commit e1463451c584181f918265438cf6ddcb408bf731
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Thu Feb 21 20:43:56 2008 +0100
+
+    Code uses if USE_EXCEPTIONS, so we need to defined it to 1, not just
+    define it
+
+ configure.ac |    2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 88d4bbbcf828e3247454c8ba3c2fb0fb58207b6a
+Author: Michael Vrable <mvrable@cs.ucsd.edu>
+Date:  Thu Feb 21 19:53:03 2008 +0100
+
+    If a bitmap's dimensions are invalid, do not try to display it.
+
+ poppler/Gfx.cc |    3 +++
+ 1 file changed, 3 insertions(+)
+
+commit 452ae6f5674b00b43955952961f7ca0583f73e27
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Thu Feb 21 19:46:19 2008 +0100
+
+    Make sure we don't draw outside the bitmap on Splash::fillGlyph2
+
+ splash/Splash.cc |   76
+ +++++++++++++++++++++++++++++++++++-------------------
+ 1 file changed, 49 insertions(+), 27 deletions(-)
+
+commit 7f60fa806bd6d3d28917f349a2a19b52f97f593a
+Author: James Cloos <cloos@jhcloos.com>
+Date:  Thu Feb 21 13:00:05 2008 -0500
+
+    Fix typo
+
+    Signed-off-by: James Cloos <cloos@jhcloos.com>
+
+ qt4/demos/Makefile.am |    2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 053ecae534a4522d152b0139b6aed6da2059d760
+Author: Carl Worth <cworth@cworth.org>
+Date:  Wed Feb 20 17:21:27 2008 -0800
+
+    Keep cairo and cairo_shape consistent
+
+    The 'cairo_shape' state was not always being modified at the same
+    time as 'cairo'. In some cases this led to a sequence of ever
+    larger matrix scale factors until things just blew up.
+
+ poppler/CairoOutputDev.cc |   6 ++++++
+ 1 file changed, 6 insertions(+)
+
+commit bf6dd890994150406b4464e45355a4a99870fc60
+Author: Pino Toscano <pino@kde.org>
+Date:  Thu Feb 21 01:23:07 2008 +0100
+
+    Add a dock for showing the document metadata.
+
+ qt4/demos/CMakeLists.txt |    1 +
+ qt4/demos/Makefile.am   |    3 +++
+ qt4/demos/metadata.cpp   |   50
+ ++++++++++++++++++++++++++++++++++++++++++++++
+ qt4/demos/metadata.h    |   43 +++++++++++++++++++++++++++++++++++++++
+ qt4/demos/viewer.cpp    |    7 +++++++
+ 5 files changed, 104 insertions(+)
+
+commit b6f0c8f83924c08be20b602b128651bf018172a3
+Author: Pino Toscano <pino@kde.org>
+Date:  Thu Feb 21 00:54:26 2008 +0100
+
+    Do not assign conflicting accelerators.
+
+ qt4/demos/viewer.cpp |    2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit e0c27a968c7e7a0f6a89a050ddbfe328229f431d
+Author: Pino Toscano <pino@kde.org>
+Date:  Thu Feb 21 00:53:24 2008 +0100
+
+    Apply the antialias settings w/o notify the observers.
+
+ qt4/demos/viewer.cpp |    4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 2c6149abcecda15c6f73a1dee537072240ddd545
+Author: Pino Toscano <pino@kde.org>
+Date:  Thu Feb 21 00:51:21 2008 +0100
+
+    Add a settings menu to choose the render backend.
+
+ qt4/demos/viewer.cpp |   28 ++++++++++++++++++++++++++++
+ qt4/demos/viewer.h   |    3 +++
+ 2 files changed, 31 insertions(+)
+
+commit db2b0778dca364751a1d22294be29f8c7799e2e9
+Author: Pino Toscano <pino@kde.org>
+Date:  Thu Feb 21 00:33:23 2008 +0100
+
+    Add a dock for showing the embedded files.
+
+    TODO: show the checksum in a pretty format.
+
+ qt4/demos/CMakeLists.txt    |   1 +
+ qt4/demos/Makefile.am      |    3 ++
+ qt4/demos/embeddedfiles.cpp |  75
+ +++++++++++++++++++++++++++++++++++++++++++
+ qt4/demos/embeddedfiles.h   |  43 +++++++++++++++++++++++++
+ qt4/demos/viewer.cpp       |    7 ++++
+ 5 files changed, 129 insertions(+)
+
+commit 51fba47ccb12a66282769fc504bac4c9f5123f75
+Author: Pino Toscano <pino@kde.org>
+Date:  Sun Feb 17 01:49:59 2008 +0100
+
+    clear the page label when the document is closed
+
+ qt4/demos/pageview.cpp |    2 ++
+ 1 file changed, 2 insertions(+)
+
+commit e964e2b9fbbe9b52b137ecd06729a06530835227
+Author: Michael Vrable <mvrable@cs.ucsd.edu>
+Date:  Tue Feb 19 23:22:55 2008 +0100
+
+    Allow grouped checkboxes to be selected individually.
+
+    When checkboxes are in a group, they ought to behave like a
+    collection of
+    radio buttons.  However, when deciding whether to draw a checkbox as
+    selected or not, the checkbox-drawing code was looking up the value
+    of the
+    V field in the form dictionary, which is shared among all checkboxes
+    in the
+    group.  Thus, checkboxes would either all be on or off in unison.
+
+    Instead, look up the AS (appearance state) value in each checkbox's
+    annotation dictionary, so that different checkboxes can be drawn
+    differently.
+
+ poppler/Annot.cc |    6 ++----
+ 1 file changed, 2 insertions(+), 4 deletions(-)
+
+commit 702fdd6c56b5369554c683d8c8e0e2c66e80886c
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Tue Feb 19 00:18:04 2008 +0100
+
+    changes from gtk-doc
+
+ glib/reference/tmpl/poppler-document.sgml |   1 +
+ glib/reference/tmpl/poppler-page.sgml    |    2 +-
+ 2 files changed, 2 insertions(+), 1 deletion(-)
+
+commit 9e13b91ba38c20989d283588e73490a1601f5bb0
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Tue Feb 19 00:10:24 2008 +0100
+
+    distribute the headers too
+
+ qt4/demos/Makefile.am |   11 ++++++++++-
+ 1 file changed, 10 insertions(+), 1 deletion(-)
+
+commit 194e0ced7c38514ec3126666531862e3b29b4b77
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Mon Feb 18 23:34:06 2008 +0100
+
+    Fill NEWS and increase version number to 0.7
+
+ CMakeLists.txt   |    2 +-
+ NEWS            |   96
+ ++++++++++++++++++++++++++++++++++++++++++++++++++++++
+ configure.ac    |    2 +-
+ msvc/config.h   |    6 ++--
+ qt4/src/Doxyfile |    2 +-
+ 5 files changed, 102 insertions(+), 6 deletions(-)
+
+commit 3c407efe9f1f0cc3f6366d3a2b6e9b687656cc95
+Merge: 51f0cea 7f4acb8
+Author: Pino Toscano <pino@kde.org>
+Date:  Mon Feb 18 21:30:42 2008 +0100
+
+    Merge branch 'master' of
+    ssh://pino@git.freedesktop.org/git/poppler/poppler
+
+commit 51f0cea0e3ba1acfc63877752e950fdd8c07e258
+Author: Pino Toscano <pino@kde.org>
+Date:  Mon Feb 18 21:29:41 2008 +0100
+
+    make the poppler_qt4viewer compile with the auto"tools"
+
+ qt4/demos/Makefile.am |   16 ++++++++++++----
+ 1 file changed, 12 insertions(+), 4 deletions(-)
+
+commit 7f4acb879d300e18dfaff768027c88195d7d8f1b
+Author: Timothy Lee <timothy.lee@siriushk.com>
+Date:  Mon Feb 18 20:56:35 2008 +0100
+
+    Implement ImageOutputDev::drawMaskedImage and
+    ImageOutputDev::drawSoftMaskedImage so all images are exported when
+    using pdfimages
+
+ utils/ImageOutputDev.cc |   19 +++++++++++++++++++
+ utils/ImageOutputDev.h  |   11 +++++++++++
+ 2 files changed, 30 insertions(+)
+
+commit 064b316648e35416bb49336639da1d8d288d1ecf
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Mon Feb 18 20:17:37 2008 +0100
+
+    xref can be null so check for it before checking we went out of bounds
+
+    Fixes bug 14549
+
+ poppler/Lexer.cc |    2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit b287b611b1c7b7dd00e12518cee3a6c35044e161
+Author: Pino Toscano <pino@kde.org>
+Date:  Sun Feb 17 01:21:07 2008 +0100
+
+    Really niptick: help menu with about dialog for us and Qt.
+
+ qt4/demos/viewer.cpp |   15 +++++++++++++++
+ qt4/demos/viewer.h   |    2 ++
+ 2 files changed, 17 insertions(+)
+
+commit 6400254fdabf3d0d32f27ebd00faa6958be62019
+Author: Pino Toscano <pino@kde.org>
+Date:  Sun Feb 17 01:12:27 2008 +0100
+
+    Add a title to the viewer :)
+
+ qt4/demos/viewer.cpp |    2 ++
+ 1 file changed, 2 insertions(+)
+
+commit b363c0568c9c61e7ee8ed86d808f0eed0b93b525
+Author: Pino Toscano <pino@kde.org>
+Date:  Sun Feb 17 01:09:57 2008 +0100
+
+    Add the possibility to save a copy of the file.
+
+ qt4/demos/viewer.cpp |   29 +++++++++++++++++++++++++++++
+ qt4/demos/viewer.h   |    2 ++
+ 2 files changed, 31 insertions(+)
+
+commit 42987dcdd8d7432145f78cfc550f0c099e6e7311
+Author: Pino Toscano <pino@kde.org>
+Date:  Sun Feb 17 00:33:01 2008 +0100
+
+    Add a Permissions dock.
+
+ qt4/demos/CMakeLists.txt  |   1 +
+ qt4/demos/Makefile.am    |    1 +
+ qt4/demos/permissions.cpp |   77
+ +++++++++++++++++++++++++++++++++++++++++++++
+ qt4/demos/permissions.h   |   43 +++++++++++++++++++++++++
+ qt4/demos/viewer.cpp     |    7 +++++
+ 5 files changed, 129 insertions(+)
+
+commit 9d1dda64de1d9e3f6fc81e40a0c2246a6270dfa8
+Author: Pino Toscano <pino@kde.org>
+Date:  Sat Feb 16 23:56:17 2008 +0100
+
+    Add settings for antialias.
+
+ qt4/demos/viewer.cpp |   41 +++++++++++++++++++++++++++++++++++++++++
+ qt4/demos/viewer.h   |    4 ++++
+ 2 files changed, 45 insertions(+)
+
+commit 3abb8703d7d8b7a5fbcbb3c19d8e84d640abe88c
+Author: Pino Toscano <pino@kde.org>
+Date:  Sat Feb 16 22:25:11 2008 +0100
+
+    Add a TOC info dock.
+
+ qt4/demos/CMakeLists.txt |    1 +
+ qt4/demos/Makefile.am   |    1 +
+ qt4/demos/toc.cpp       |   90
+ ++++++++++++++++++++++++++++++++++++++++++++++
+ qt4/demos/toc.h         |   43 ++++++++++++++++++++++
+ qt4/demos/viewer.cpp    |    7 ++++
+ 5 files changed, 142 insertions(+)
+
+commit 80925f06d125ebfc9909e36bdbe5d37fd0e48bdc
+Author: Pino Toscano <pino@kde.org>
+Date:  Sat Feb 16 21:51:10 2008 +0100
+
+    Adapt the Fonts and Info docks to the new abstract info dock.
+
+ qt4/demos/fonts.cpp |  10 +++-------
+ qt4/demos/fonts.h   |  11 +++++------
+ qt4/demos/info.cpp  |  10 +++-------
+ qt4/demos/info.h    |  11 +++++------
+ 4 files changed, 16 insertions(+), 26 deletions(-)
+
+commit c03531d691e56aba2b4c6538cf9e2463e1e0aa29
+Author: Pino Toscano <pino@kde.org>
+Date:  Sat Feb 16 21:43:19 2008 +0100
+
+    Introduce a base info dock for handling the "dirty" work.
+
+ qt4/demos/CMakeLists.txt      |    1 +
+ qt4/demos/Makefile.am         |    1 +
+ qt4/demos/abstractinfodock.cpp |   57
+ ++++++++++++++++++++++++++++++++++++++++
+ qt4/demos/abstractinfodock.h  |   48 +++++++++++++++++++++++++++++++++
+ 4 files changed, 107 insertions(+)
+
+commit 0f7d51c7fc2439ee9392c166576c341238f00f36
+Author: Pino Toscano <pino@kde.org>
+Date:  Sat Feb 16 18:49:52 2008 +0100
+
+    Delete the poppler page after usage.
+
+ qt4/demos/pageview.cpp |    1 +
+ 1 file changed, 1 insertion(+)
+
+commit b41d069cdd1435ddb14b3de2986875069523c814
+Author: Pino Toscano <pino@kde.org>
+Date:  Sat Feb 16 18:48:57 2008 +0100
+
+    Initialize the current page number correctly.
+
+ qt4/demos/viewer.cpp |    2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 75e516af0e72a2e3041660300e522ad00869372b
+Author: Pino Toscano <pino@kde.org>
+Date:  Sat Feb 16 18:43:56 2008 +0100
+
+    Add a side dock for showing the fonts of the document.
+
+ qt4/demos/CMakeLists.txt |    1 +
+ qt4/demos/Makefile.am   |    1 +
+ qt4/demos/fonts.cpp     |   78
+ ++++++++++++++++++++++++++++++++++++++++++++++
+ qt4/demos/fonts.h       |   44 ++++++++++++++++++++++++++
+ qt4/demos/viewer.cpp    |    7 +++++
+ 5 files changed, 131 insertions(+)
+
+commit 8e642d1cbd48d4790a6769287cbfd90c3bc9fc34
+Author: Pino Toscano <pino@kde.org>
+Date:  Sat Feb 16 17:21:30 2008 +0100
+
+    Add a View menu where the dock widget toogle actions will be.
+
+    As start, put the Info dock there.
+
+ qt4/demos/viewer.cpp |    4 ++++
+ 1 file changed, 4 insertions(+)
+
+commit c1feb7c2b5008cc04edb3c028f888072920ce4dc
+Author: Pino Toscano <pino@kde.org>
+Date:  Sat Feb 16 17:14:00 2008 +0100
+
+    Add a side dock for showing the info keys.
+
+ qt4/demos/CMakeLists.txt |    1 +
+ qt4/demos/Makefile.am   |    1 +
+ qt4/demos/info.cpp      |   78
+ ++++++++++++++++++++++++++++++++++++++++++++++
+ qt4/demos/info.h        |   44 ++++++++++++++++++++++++++
+ qt4/demos/viewer.cpp    |    5 +++
+ 5 files changed, 129 insertions(+)
+
+commit abc9b00c6470f9f6b66c280455f544ad0ee3aa8c
+Author: Pino Toscano <pino@kde.org>
+Date:  Sat Feb 16 16:09:52 2008 +0100
+
+    Basic work in the demo PDF viewer, open documents and navigate into
+    the pages.
+
+    An observer structure was introduced, so extra components can be
+    easily added and made aware of the document/page changes.
+    Both the navigation toolbar and the page view are implemented as
+    observers.
+
+ qt4/demos/CMakeLists.txt       |    3 ++
+ qt4/demos/Makefile.am          |    3 ++
+ qt4/demos/documentobserver.cpp  |   45 ++++++++++++++++++
+ qt4/demos/documentobserver.h   |   49 ++++++++++++++++++++
+ qt4/demos/navigationtoolbar.cpp |   98
+ +++++++++++++++++++++++++++++++++++++++
+ qt4/demos/navigationtoolbar.h  |   56 ++++++++++++++++++++++
+ qt4/demos/pageview.cpp                 |   60 ++++++++++++++++++++++++
+ qt4/demos/pageview.h           |   44 ++++++++++++++++++
+ qt4/demos/viewer.cpp           |   98
+ +++++++++++++++++++++++++++++++++++++--
+ qt4/demos/viewer.h             |   17 +++++++
+ 10 files changed, 470 insertions(+), 3 deletions(-)
+
+commit 14c88853a5675f40efb72f3ef01f49eb06ab846c
+Author: Pino Toscano <pino@kde.org>
+Date:  Sat Feb 16 00:32:30 2008 +0100
+
+    Compile the poppler_qt4viewer.
+
+ qt4/demos/CMakeLists.txt |    7 +++++++
+ qt4/demos/Makefile.am   |   12 ++++++++++--
+ 2 files changed, 17 insertions(+), 2 deletions(-)
+
+commit aeb591f015d5e7a2643ed75d872358d2b1256b99
+Author: Pino Toscano <pino@kde.org>
+Date:  Sat Feb 16 00:31:46 2008 +0100
+
+    Add a very minimal base PDF viewer.
+
+    So minimal that it does nothing at the moment...
+
+ qt4/demos/main_viewer.cpp |   29 ++++++++++++++++++++++++++++
+ qt4/demos/viewer.cpp     |   46
+ +++++++++++++++++++++++++++++++++++++++++++++
+ qt4/demos/viewer.h       |   45
+ ++++++++++++++++++++++++++++++++++++++++++++
+ 3 files changed, 120 insertions(+)
+
+commit 8da490b090487c4c37290b63bdc9abcfaf6d6940
+Author: Pino Toscano <pino@kde.org>
+Date:  Fri Feb 15 23:59:39 2008 +0100
+
+    Add a skeleton of directory where PopplerQt4 demos will be.
+
+ configure.ac            |    1 +
+ qt4/CMakeLists.txt      |    1 +
+ qt4/Makefile.am         |    2 +-
+ qt4/demos/CMakeLists.txt |   10 ++++++++++
+ qt4/demos/Makefile.am   |   20 ++++++++++++++++++++
+ 5 files changed, 33 insertions(+), 1 deletion(-)
+
+commit e24b49d52a5c1716641695ee731dd49848a114d9
+Author: Pino Toscano <pino@kde.org>
+Date:  Thu Feb 14 22:21:54 2008 +0100
+
+    do not print it as string
+
+ qt4/src/poppler-private.cc |   2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 2316455864e9c900c08d051c59b9508eddcb7c34
+Author: Pino Toscano <pino@kde.org>
+Date:  Thu Feb 14 21:02:20 2008 +0100
+
+    Pipe the poppler error messages through the Qt debug system.
+
+ qt4/src/poppler-private.cc |  21 +++++++++++++++++++++
+ qt4/src/poppler-private.h  |   8 +++++++-
+ 2 files changed, 28 insertions(+), 1 deletion(-)
+
+commit d985d3b0cdc57370137865add2a5f3a7802109c7
+Author: Pino Toscano <pino@kde.org>
+Date:  Thu Feb 14 14:56:18 2008 +0100
+
+    Use what FormWidgetText give us.
+
+ qt4/src/poppler-form.cc |   13 +++----------
+ 1 file changed, 3 insertions(+), 10 deletions(-)
+
+commit a69bd442e52f4495f8d6bfd3bb58b3ebd1be1a63
+Author: Michael Vrable <mvrable@cs.ucsd.edu>
+Date:  Thu Feb 14 12:52:22 2008 +0100
+
+    Provide Unicode mappings for some control characters in
+    PDFDocEncoding.
+
+    Though they do not represent glyphs, values such as carriage return
+    can be
+    found in text strings in PDFDocEncoding.  Provide mappings for
+    these bytes
+    to Unicode.
+
+    Additionally, map unknown characters to U+FFFD instead of U+0000,
+    so that
+    unknown characters do not result in nulls (which can truncate strings
+    early, particularly if the string is later re-encoded into
+    null-terminated
+    UTF-8).
+
+ poppler/PDFDocEncoding.cc |   23 +++++++++++++++++------
+ 1 file changed, 17 insertions(+), 6 deletions(-)
+
+commit ce17383e0ed21770b471e88f25046a64a23e7e45
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Wed Feb 13 20:56:39 2008 +0100
+
+    Yet another fix for buggy documents, do not use the cache if the
+    cache could not be created because it ought to be too big
+
+    Fixes http://bugs.kde.org/show_bug.cgi?id=157777
+
+ splash/SplashFont.cc |   48
+ ++++++++++++++++++++++++++++--------------------
+ 1 file changed, 28 insertions(+), 20 deletions(-)
+
+commit 15a61cac718ae8cbf83911e299b4cfdd24cdf178
+Author: Pino Toscano <pino@kde.org>
+Date:  Wed Feb 13 20:55:18 2008 +0100
+
+    add images.c
+
+ glib/demo/CMakeLists.txt |    1 +
+ 1 file changed, 1 insertion(+)
+
+commit 9cfe10ab7f51d329647e102e446baaef043d8cc6
+Merge: e918729 7d65b4d
+Author: Pino Toscano <pino@kde.org>
+Date:  Wed Feb 13 20:53:43 2008 +0100
+
+    Merge branch 'master' of
+    ssh://pino@git.freedesktop.org/git/poppler/poppler
+
+commit 7d65b4da1bc060aeb94d67c2ff26912cef48c030
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Wed Feb 13 20:32:43 2008 +0100
+
+    Add images demo
+
+ glib/demo/Makefile.am |    2 +
+ glib/demo/images.c    |  338
+ +++++++++++++++++++++++++++++++++++++++++++++++++
+ glib/demo/images.h    |   31 +++++
+ glib/demo/main.c      |    4 +-
+ 4 files changed, 374 insertions(+), 1 deletion(-)
+
+commit e9187292701e72db1020f7701d0725d83eee4b00
+Author: Pino Toscano <pino@kde.org>
+Date:  Wed Feb 13 19:41:57 2008 +0100
+
+    Do the one-time initialisation in initTestCase().
+
+ qt4/tests/check_dateConversion.cpp |   8 ++++++--
+ 1 file changed, 6 insertions(+), 2 deletions(-)
+
+commit fb996c46e3c6b56a2c67819620000bcd804aacd6
+Author: Michael Vrable <mvrable@cs.ucsd.edu>
+Date:  Wed Feb 13 18:44:41 2008 +0100
+
+    Major rework of text display in form fields code.
+
+    This adds support for UTF-16 strings as input, and will recode them
+    to the
+    appropriate character set for the font.
+
+    The method Annot::layoutText packs a lot of functionality together,
+    but I
+    couldn't see a good way to split it apart. It will convert an
+    input text
+    string from PDFDocEncoding or UTF-16 (encoding is autodetected) to the
+    appropriate encoding for the font which will be used to display
+    the form
+    field.  At the same time, it can compute the width of the resulting
+    string,
+    and optionally break the string at a specified width to aid in
+    wrapping
+    multi-line text.  Text wrapping is integrated with encoding conversion
+    since wrapping is easiest with the original text (where spaces
+    and newlines
+    are easily identified), but text widths can only be computed after
+    re-encoding.
+
+    Support for composite fonts is included, so long as those fonts use an
+    identity CMap, but this is still untested. Support for more
+    complex CMaps
+    is missing.
+
+    The rewrite also includes a minor improvement to the formatting
+    of comb
+    fields; characters are now centered in the comb cells.
+
+ poppler/Annot.cc |  507
+ ++++++++++++++++++++++++++++++++++--------------------
+ poppler/Annot.h  |    9 +-
+ 2 files changed, 327 insertions(+), 189 deletions(-)
+
+commit 88c780aed4c9855f879e3c7a9f82500a859635a2
+Author: Michael Vrable <mvrable@cs.ucsd.edu>
+Date:  Wed Feb 13 18:42:49 2008 +0100
+
+    Fix what look to be a few bugs in functions for mapping to/from
+    Unicode.
+
+      - Endianness fix in pdfDocEncodingToUTF16 (previously looked to
+      assume a
+       little-endian processor)
+      - Add support for CharCodeToUnicode::mapToCharCode for Unicode
+      codepoints
+       above 255.
+
+ poppler/CharCodeToUnicode.cc |    4 ++--
+ poppler/Form.cc             |    4 ++--
+ 2 files changed, 4 insertions(+), 4 deletions(-)
+
+commit 7574cb71f24ce5b32427f243c39b6029fb58ec81
+Merge: e798802 4e45e5c
+Author: Pino Toscano <pino@kde.org>
+Date:  Wed Feb 13 01:07:31 2008 +0100
+
+    Merge branch 'master' of
+    ssh://pino@git.freedesktop.org/git/poppler/poppler
+
+commit 4e45e5ca4ab0ba2a6586505d80ed81f4b3426752
+Author: Patrick Spendrin <ps_ml@gmx.de>
+Date:  Tue Feb 12 21:41:26 2008 +0100
+
+    Do the right thing with CDECL, that is, undefine it if it is defined
+    so we can redefine it later
+
+ poppler-config.h.cmake |    2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit e798802f00bff0a24ee6d1312d6c62624395865a
+Author: Pino Toscano <pino@kde.org>
+Date:  Tue Feb 12 20:57:56 2008 +0100
+
+    Apidox fix: state which checksum is returned (if available).
+
+ qt4/src/poppler-qt4.h |    2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 4e2ba70a88c40fef6775053b1cc5fa30e622cea7
+Author: Pino Toscano <pino@kde.org>
+Date:  Tue Feb 12 11:25:34 2008 +0100
+
+    Free the Object after you use it.
+
+ poppler/Annot.cc |    1 +
+ 1 file changed, 1 insertion(+)
+
+commit 039545fcd2c12631c7b8aea89c35f36cb387a17a
+Author: Pino Toscano <pino@kde.org>
+Date:  Tue Feb 12 11:13:27 2008 +0100
+
+    Return the siblings even for checkboxes.
+
+ qt4/src/poppler-form.cc |    2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit fe5ee75cdf3e11e314318af12edf9d5bc8986250
+Author: Pino Toscano <pino@kde.org>
+Date:  Tue Feb 12 11:12:01 2008 +0100
+
+    Initialize correctly; free your memory.
+
+ poppler/Form.cc |    2 ++
+ 1 file changed, 2 insertions(+)
+
+commit e0eff92c7067d43faa8e93baed1f061863111251
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Mon Feb 11 20:32:41 2008 +0100
+
+    Update the field dict instead of the annot dict for non composed dicts
+
+    We were always updating the annot dictionary, adding or updating
+    the V field. While this is correct for composed dicts (annot + field)
+    it isn't for non composed ones since the annot dictionary doesn't
+    contain any V field because it's a field of the form field dictionary.
+    In these cases the form field is not correctly updated and if the
+    document is saved it will be wrong.
+
+ poppler/Form.cc |   44 +++++++++++++++++++++++++++++++-------------
+ poppler/Form.h  |    2 ++
+ 2 files changed, 33 insertions(+), 13 deletions(-)
+
+commit 905e6da9795fee94329022c0cafbc229055fd4f6
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Sun Feb 10 19:22:50 2008 +0100
+
+    Move forms specific draw methods from Annot to AnnotWidget class
+
+ poppler/Annot.cc | 3433
+ +++++++++++++++++++++++++++---------------------------
+ poppler/Annot.h  |   87 +-
+ poppler/Form.cc  |   39 +-
+ poppler/Form.h   |    2 +
+ poppler/Page.cc  |    9 +-
+ 5 files changed, 1765 insertions(+), 1805 deletions(-)
+
+commit 78afbc4d7819654e8742d4457c9847ad02b73bf1
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Sun Feb 10 17:12:59 2008 +0100
+
+    Some code refactoring and cleanup
+
+     - Unused 'field' attribute in FormWidget class is now used and
+       getField() method has been added
+     - Method isReadOnly() in FormWidget class is not virtual anymore
+       but implemented in the base class
+     - Unused attribute 'catalog' in Form class has been removed and
+       'acroForm' has been added instead with a getObj() method to get it.
+     - createFieldFromDict() method is now static
+
+ poppler/Form.cc |  128
+ ++++++++++++++++++++++++++++---------------------------
+ poppler/Form.h  |   41 +++++++++---------
+ 2 files changed, 84 insertions(+), 85 deletions(-)
+
+commit 5f8e2f9140ee2ede841700726b974768ec863672
+Author: Pino Toscano <pino@kde.org>
+Date:  Mon Feb 11 20:16:44 2008 +0100
+
+    Use QVarLengthArray instead of relying on gcc-ism.
+
+ qt4/src/poppler-page.cc |    3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+commit 7499764d382366823519aa13a38e1e44781c78af
+Author: Pino Toscano <pino@kde.org>
+Date:  Mon Feb 11 11:57:50 2008 +0100
+
+    Add FormFieldButton::siblings().
+
+    This is needed for grouping together the radio buttons.
+
+ qt4/src/poppler-form.cc |   14 ++++++++++++++
+ qt4/src/poppler-form.h  |    8 ++++++++
+ 2 files changed, 22 insertions(+)
+
+commit 85bfa4f499a90d45b13df4d0a8760a7da6fc1532
+Author: Pino Toscano <pino@kde.org>
+Date:  Mon Feb 11 02:40:37 2008 +0100
+
+    Small apidox fix.
+
+ qt4/src/poppler-form.h |   11 ++---------
+ 1 file changed, 2 insertions(+), 9 deletions(-)
+
+commit ada05055c91e967dc3e2af32a2176dd12cb7fe70
+Author: Pino Toscano <pino@kde.org>
+Date:  Mon Feb 11 02:27:19 2008 +0100
+
+    Preliminary support for "button" form fields (ie, push buttons,
+    check boxes, and radio buttons).
+
+ qt4/src/poppler-form.cc |   55
+ +++++++++++++++++++++++++++++++++++++++++++++++
+ qt4/src/poppler-form.h  |   54
+ ++++++++++++++++++++++++++++++++++++++++++++++
+ qt4/src/poppler-page.cc |    6 ++++++
+ 3 files changed, 115 insertions(+)
+
+commit 278b33f25df418ef12798100002845a3e2ceebd3
+Merge: c730b33 fdb0a4a
+Author: Pino Toscano <pino@kde.org>
+Date:  Mon Feb 11 00:57:24 2008 +0100
+
+    Merge branch 'master' of
+    ssh://pino@git.freedesktop.org/git/poppler/poppler
+
+commit fdb0a4a2f1d86aec7a3b0fcd4b4d48455791ecad
+Author: Jeff Muizelaar <jeff@infidigm.net>
+Date:  Sun Feb 10 18:47:40 2008 -0500
+
+    Avoid prescaling images when printing.
+
+    Adds a function for letting the CairoOutputDev know whether it is
+    targetting a
+    screen or not. It then uses this knowledge to avoid prescaling
+    images. This way
+    cairo gets the full resolution image for use in the printed output.
+
+ glib/poppler-page.cc     |    1 +
+ poppler/CairoOutputDev.cc |   3 ++-
+ poppler/CairoOutputDev.h  |   2 ++
+ 3 files changed, 5 insertions(+), 1 deletion(-)
+
+commit c730b33f1ec2032c4b8c2660738448d954eb0f7d
+Author: Pino Toscano <pino@kde.org>
+Date:  Mon Feb 11 00:46:20 2008 +0100
+
+    Keep the EmbFile object, and use this for getting the data.
+
+ qt4/src/poppler-embeddedfile.cc |   33 +++++++++++----------------------
+ qt4/src/poppler-private.h      |    1 -
+ 2 files changed, 11 insertions(+), 23 deletions(-)
+
+commit 5915e57e7785370ce305cbbb3c2fedf36886689f
+Author: Pino Toscano <pino@kde.org>
+Date:  Sun Feb 10 03:19:18 2008 +0100
+
+    const & in foreach
+
+ qt4/tests/poppler-fonts.cpp     |    2 +-
+ qt4/tests/stress-poppler-dir.cpp |    2 +-
+ qt4/tests/stress-poppler-qt4.cpp |    2 +-
+ qt4/tests/test-password-qt4.cpp  |    2 +-
+ qt4/tests/test-poppler-qt4.cpp   |    2 +-
+ 5 files changed, 5 insertions(+), 5 deletions(-)
+
+commit d8374e0c2eb3ba05be101687e20c5fcbc42c1ad0
+Author: Pino Toscano <pino@kde.org>
+Date:  Sun Feb 10 01:32:24 2008 +0100
+
+    Include only what needed; remove extra includes.
+
+ qt4/tests/poppler-attachments.cpp |   4 +++-
+ qt4/tests/poppler-fonts.cpp      |    4 +++-
+ qt4/tests/stress-poppler-dir.cpp  |   9 ++++++---
+ qt4/tests/stress-poppler-qt4.cpp  |   9 ++++++---
+ qt4/tests/test-password-qt4.cpp   |   10 ++++++----
+ qt4/tests/test-poppler-qt4.cpp    |   12 ++++++++----
+ 6 files changed, 32 insertions(+), 16 deletions(-)
+
+commit fa01a1115c4554b18c3462b568d76860d2fbe17b
+Author: Pino Toscano <pino@kde.org>
+Date:  Sun Feb 10 01:09:57 2008 +0100
+
+    Comment out unused vars.
+
+ utils/pdftoabw.cc |   6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
+
+commit d3275e4263372b534c276f81d0c997ecb6675487
+Merge: c2186c1 5347a97
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Sat Feb 9 23:57:03 2008 +0100
+
+    Merge branch 'master' of
+    ssh://aacid@git.freedesktop.org/git/poppler/poppler
+
+commit c2186c1829c695c4ddb6c471ef8ad4ffa23c1b70
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Sat Feb 9 23:56:32 2008 +0100
+
+    Only check if we are out of bounds if the object we are searching
+    for has a known id (0 also means not known)
+
+    Found by Michael Vrable
+
+ poppler/Lexer.cc |    2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 5347a97e39388ae38cf2ab9c67f953b0f7a02a13
+Author: Pino Toscano <pino@kde.org>
+Date:  Sat Feb 9 18:26:41 2008 +0100
+
+    Add the operators for the flags we have.
+
+ qt4/src/poppler-qt4.h |    3 +++
+ 1 file changed, 3 insertions(+)
+
+commit 329ade4f936bf063539cdc887aaf9a1722a5b8e0
+Author: Pino Toscano <pino@kde.org>
+Date:  Sat Feb 9 18:23:59 2008 +0100
+
+    Add options for the PDF export; add the WithChanges flag for saving
+    the changes to the document as well.
+
+ qt4/src/poppler-pdf-converter.cc |   25 +++++++++++++++++++++++--
+ qt4/src/poppler-qt4.h           |   14 ++++++++++++++
+ 2 files changed, 37 insertions(+), 2 deletions(-)
+
+commit afb255366d56551bdc307766199bef9c5021d3ac
+Merge: 8c44b17 8cb0e75
+Author: Pino Toscano <pino@kde.org>
+Date:  Sat Feb 9 17:58:49 2008 +0100
+
+    Merge branch 'master' of
+    ssh://pino@git.freedesktop.org/git/poppler/poppler
+
+commit 8c44b175081983c492821858341109fee9e86b16
+Author: Pino Toscano <pino@kde.org>
+Date:  Sat Feb 9 17:57:57 2008 +0100
+
+    Do not rely on GNU extensions, but at least use Qt.
+
+ qt4/src/poppler-qiodeviceoutstream.cc |   11 ++++-------
+ 1 file changed, 4 insertions(+), 7 deletions(-)
+
+commit 8cb0e75203daa01439413d1a775482b48e784baa
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Sat Feb 9 17:56:13 2008 +0100
+
+    Domain order is x_min x_max y_min y_max and not x_min y_min x_max
+    y_max
+
+ poppler/GfxState.cc |   4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit c8f734ba4258059fa4521a4d364f62ca1632840b
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Sat Feb 9 13:37:04 2008 +0100
+
+    PS cos and sin input values are degrees so convert to radians so we
+    can use the cos and sin cmath functions
+
+ poppler/Function.cc |   4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 5fb0c9d31c1abf2e6ad306c112fbd2a7c33d8772
+Merge: 2655663 2255c85
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Sat Feb 9 13:15:15 2008 +0100
+
+    Merge branch 'master' of
+    ssh://carlosgc@git.freedesktop.org/git/poppler/poppler
+
+commit 26556636e71d5abcbfdd1373f5576d1233532cf8
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Sat Feb 9 13:14:41 2008 +0100
+
+    Add saveWithoutChangesAs method to be able to save the document
+    ignoring changes made in forms or annots
+
+ glib/poppler-document.cc |   41 ++++++++++++++++++++++++++++++++++++++++-
+ glib/poppler-document.h  |    3 +++
+ poppler/PDFDoc.cc       |   38 ++++++++++++++++++++++++++++++++------
+ poppler/PDFDoc.h        |    4 ++++
+ 4 files changed, 79 insertions(+), 7 deletions(-)
+
+commit 2255c85e4939a0752083dca21984ff4398baf8d2
+Merge: 5ba9287 56c9246
+Author: Pino Toscano <pino@kde.org>
+Date:  Sat Feb 9 12:49:45 2008 +0100
+
+    Merge branch 'master' of
+    ssh://pino@git.freedesktop.org/git/poppler/poppler
+
+commit 5ba928762471e1ea8b81acd4644dfd3f58d18f77
+Author: Pino Toscano <pino@kde.org>
+Date:  Sat Feb 9 12:48:04 2008 +0100
+
+    Fix placeholders in printf-like functions.
+
+ glib/demo/page.c         |    2 +-
+ glib/test-poppler-glib.cc |   2 +-
+ 2 files changed, 2 insertions(+), 2 deletions(-)
+
+commit 56c924609223196c5c41b9e6d9102bc248bad947
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Sat Feb 9 12:26:06 2008 +0100
+
+    atan operator must yield a degrees result between 0 and 360
+
+    See testcase at http://bugs.kde.org/show_bug.cgi?id=157497
+
+ poppler/Function.cc |   6 ++++--
+ 1 file changed, 4 insertions(+), 2 deletions(-)
+
+commit 2a39932ae35a2716842bd2a1c3d4f9ce6b1e3dd8
+Author: Pino Toscano <pino@kde.org>
+Date:  Sat Feb 9 01:31:20 2008 +0100
+
+    Few improvements to the password test.
+
+    - QString::fromUtf8() instead of QFile::encodeName() to correctly
+    pass the utf8 filenames
+    - QVERIFY(!foo) instead of QCOMPARE(foo, false)
+    - QVERIFY() also the return value of unlock()
+
+ qt4/tests/check_password.cpp |   31 ++++++++++++++++---------------
+ 1 file changed, 16 insertions(+), 15 deletions(-)
+
+commit cc9c124d4d859b845eebf4ca1e4397870a35fd4e
+Author: Pino Toscano <pino@kde.org>
+Date:  Sat Feb 9 01:09:02 2008 +0100
+
+    Add an unit test case for few invalid dates.
+
+ qt4/tests/check_dateConversion.cpp |  34
+ ++++++++++++++++++++++++++++++++++
+ 1 file changed, 34 insertions(+)
+
+commit eca91761741de5b340f7a2160db5b33401feb935
+Author: Pino Toscano <pino@kde.org>
+Date:  Fri Feb 8 18:42:14 2008 +0100
+
+    Remove unneeded headers.
+
+ qt4/src/poppler-page.cc |    4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 899627505a4645fb1cc7d3599adbeec449c57041
+Author: Pino Toscano <pino@kde.org>
+Date:  Fri Feb 8 18:41:13 2008 +0100
+
+    The return value is QString, so return QString's...
+
+ qt4/src/poppler-document.cc |   6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
+
+commit a1606fa4ff438983e3a7f55dd2d10a66f72e6711
+Author: Pino Toscano <pino@kde.org>
+Date:  Fri Feb 8 17:31:32 2008 +0100
+
+    Move checkDocument() inside the private class.
+
+ qt4/src/poppler-document.cc |   6 +++---
+ qt4/src/poppler-private.h   |   2 ++
+ qt4/src/poppler-qt4.h      |    2 +-
+ 3 files changed, 6 insertions(+), 4 deletions(-)
+
+commit f1ec70a83f807493dab5118761df31c0f67decad
+Author: Pino Toscano <pino@kde.org>
+Date:  Fri Feb 8 17:26:41 2008 +0100
+
+    Remove C-ism.
+
+ qt4/src/poppler-document.cc |   4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 3e994e8586fa1c87ef7e7f82af1cdacf2cd36310
+Author: Pino Toscano <pino@kde.org>
+Date:  Fri Feb 8 12:21:56 2008 +0100
+
+    Add the missing font types.
+
+ qt4/src/poppler-fontinfo.cc |  11 +++++++++--
+ 1 file changed, 9 insertions(+), 2 deletions(-)
+
+commit ba07963f85d777a441349e23d4c2f510e45c73be
+Author: Pino Toscano <pino@kde.org>
+Date:  Fri Feb 8 12:19:04 2008 +0100
+
+    Be safe against self-assignment.
+
+ qt4/src/poppler-fontinfo.cc |   3 +++
+ 1 file changed, 3 insertions(+)
+
+commit 834b86548e09f4b24cdb2f194299d053b9b55022
+Author: Pino Toscano <pino@kde.org>
+Date:  Fri Feb 8 12:15:16 2008 +0100
+
+    Small apidox fix.
+
+ qt4/src/poppler-qt4.h |    2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 11a61eac5b8cde04bf762bbbe0deab5c0bd52951
+Author: Pino Toscano <pino@kde.org>
+Date:  Fri Feb 8 02:21:32 2008 +0100
+
+    Pack few bools together.
+
+ qt4/src/poppler-annotation.cc |    8 ++++----
+ qt4/src/poppler-link.cc       |   10 +++++-----
+ qt4/src/poppler-private.h     |    4 ++--
+ 3 files changed, 11 insertions(+), 11 deletions(-)
+
+commit 1aeba15b5eb9b30943259824678ebc9e4f56e870
+Merge: a489063 22d10c1
+Author: Pino Toscano <pino@kde.org>
+Date:  Fri Feb 8 01:39:16 2008 +0100
+
+    Merge branch 'master' of
+    ssh://pino@git.freedesktop.org/git/poppler/poppler
+
+commit a4890637a2c2ab1623311d9a6920e82131c2597c
+Author: Pino Toscano <pino@kde.org>
+Date:  Fri Feb 8 01:36:56 2008 +0100
+
+    Move QStringToUnicodeGooString() and QStringToGooString() to the
+    private module.
+
+ qt4/src/poppler-document.cc |  10 ----------
+ qt4/src/poppler-form.cc     |  15 ---------------
+ qt4/src/poppler-private.cc  |  25 +++++++++++++++++++++++++
+ qt4/src/poppler-private.h   |   4 ++++
+ 4 files changed, 29 insertions(+), 25 deletions(-)
+
+commit 5e44241c4976b819f7be6badd2d183fbfb8ee6de
+Author: Pino Toscano <pino@kde.org>
+Date:  Fri Feb 8 01:30:07 2008 +0100
+
+    Move the string functions implementation in a .cc file.
+
+ qt4/src/CMakeLists.txt     |   1 +
+ qt4/src/Makefile.am       |    1 +
+ qt4/src/poppler-private.cc |  70
+ ++++++++++++++++++++++++++++++++++++++++++++
+ qt4/src/poppler-private.h  |  46 +++--------------------------
+ 4 files changed, 76 insertions(+), 42 deletions(-)
+
+commit 124d92139241ad95da559d22af48254b45ac4a2e
+Author: Pino Toscano <pino@kde.org>
+Date:  Fri Feb 8 01:07:43 2008 +0100
+
+    Include own header first, remove extra includes.
+
+ qt4/src/poppler-document.cc             |    1 -
+ qt4/src/poppler-embeddedfile.cc         |    3 ++-
+ qt4/src/poppler-form.cc                 |    4 +++-
+ qt4/src/poppler-link-extractor-private.h |    2 ++
+ qt4/src/poppler-link-extractor.cc       |    7 +++++--
+ qt4/src/poppler-page-private.h                  |    6 +++++-
+ qt4/src/poppler-private.h               |    4 +++-
+ qt4/src/poppler-qt4.h                   |    2 --
+ qt4/src/poppler-sound.cc                |    4 ++--
+ 9 files changed, 22 insertions(+), 11 deletions(-)
+
+commit 22d10c19e232dea143bda372c92aa12b999e4921
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Thu Feb 7 23:38:50 2008 +0100
+
+    PDF spec says name tokens have a maximum length of 127, but there are
+    some docs in the wild with more than that and they work on acroread
+    so increase the allowed length to 128+127
+
+ poppler/Lexer.cc |   25 +++++++++++++++++++++----
+ 1 file changed, 21 insertions(+), 4 deletions(-)
+
+commit ee9f85915feb86b54ace1a403baa13bbdd7c3966
+Author: Pino Toscano <pino@kde.org>
+Date:  Thu Feb 7 18:07:53 2008 +0100
+
+    Having a PageData is mandatory.
+
+    Just assert when constructing instead of checking for it in each
+    link iteration.
+
+ qt4/src/poppler-link-extractor.cc |   3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+commit ad4b1361f6c25359e6ddb38599bfc1e4e3e80408
+Author: Pino Toscano <pino@kde.org>
+Date:  Thu Feb 7 18:03:30 2008 +0100
+
+    Precalc stuff we don't need to recalc in each link iteration.
+
+ qt4/src/poppler-link-extractor-private.h |    3 ++-
+ qt4/src/poppler-link-extractor.cc       |   14 ++++++++------
+ 2 files changed, 10 insertions(+), 7 deletions(-)
+
+commit 82432dbc62a0879f4513640c2e0f594fda9347ad
+Author: Pino Toscano <pino@kde.org>
+Date:  Thu Feb 7 17:51:50 2008 +0100
+
+    Store the ::Page internally, so we don't need to get it again
+    everytime.
+
+ qt4/src/poppler-page-private.h |    3 +++
+ qt4/src/poppler-page.cc       |   37
+ ++++++++++++++-----------------------
+ 2 files changed, 17 insertions(+), 23 deletions(-)
+
+commit 8ec51f7ca518aa6a4a69f30d373722d05f50cf07
+Author: Pino Toscano <pino@kde.org>
+Date:  Thu Feb 7 16:48:16 2008 +0100
+
+    Compile the stress-poppler-dir test as well.
+
+ qt4/tests/CMakeLists.txt |    1 +
+ 1 file changed, 1 insertion(+)
+
+commit 8a946b76ae2e7c2c5238b4e580c1c226eb457dc9
+Author: Pino Toscano <pino@kde.org>
+Date:  Thu Feb 7 01:07:28 2008 +0100
+
+    Micro-touches to the debug messages.
+
+ qt4/src/poppler-page.cc |   26 +++++++++++++-------------
+ 1 file changed, 13 insertions(+), 13 deletions(-)
+
+commit c31990dfe50c7a0e3999e6d967699fce5ccb3339
+Merge: 7701e2a 6d58cda
+Author: Pino Toscano <pino@kde.org>
+Date:  Tue Feb 5 00:38:00 2008 +0100
+
+    Merge branch 'master' of
+    ssh://pino@git.freedesktop.org/git/poppler/poppler
+
+commit 7701e2a5c7d18fdaa0fa40c190e6ee0524746046
+Author: Pino Toscano <pino@kde.org>
+Date:  Tue Feb 5 00:37:01 2008 +0100
+
+    Add a AnnotColor -> QColor conversion method.
+
+ qt4/src/poppler-annotation-helper.h |   6 ++++++
+ qt4/src/poppler-annotation.cc      |   31
+ +++++++++++++++++++++++++++++++
+ 2 files changed, 37 insertions(+)
+
+commit 6d58cda82b0181f2cca6e9d95b15877793be0812
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Mon Feb 4 23:33:51 2008 +0100
+
+    Protect us against weird dateString values
+
+ qt4/src/poppler-document.cc |   5 ++++-
+ 1 file changed, 4 insertions(+), 1 deletion(-)
+
+commit aa0435f1544fe1adcf10173e34eaeaf2a7a703c7
+Merge: b43f4e9 37600b5
+Author: Pino Toscano <pino@kde.org>
+Date:  Mon Feb 4 20:56:53 2008 +0100
+
+    Merge branch 'master' of
+    ssh://pino@git.freedesktop.org/git/poppler/poppler
+
+commit 37600b5e848386d2c92c3dff8219c9dda16b0dca
+Author: Iñigo Martínez <inigomartinez@gmail.com>
+Date:  Sun Feb 3 22:42:51 2008 +0100
+
+    Minor changes to Annot related stuff.
+
+    Signed-off-by: Iñigo Martínez <inigomartinez@gmail.com>
+
+ poppler/Annot.cc |   15 ++++-----------
+ poppler/Annot.h  |   12 ++++++++++--
+ poppler/Gfx.cc   |    7 ++++---
+ poppler/Page.cc  |    9 +++++++++
+ poppler/Page.h   |    3 +++
+ 5 files changed, 30 insertions(+), 16 deletions(-)
+
+commit b43f4e9a161a1fd7b827244dc21b1bd2a6df7054
+Author: Pino Toscano <pino@kde.org>
+Date:  Sun Feb 3 20:32:15 2008 +0100
+
+    Pass the DocumentData to the Page (simplify a bit some code).
+
+ qt4/src/poppler-document.cc             |    2 +-
+ qt4/src/poppler-link-extractor-private.h |    4 +-
+ qt4/src/poppler-link-extractor.cc       |    8 ++--
+ qt4/src/poppler-page-private.h                  |    4 +-
+ qt4/src/poppler-page.cc                 |   64
+ +++++++++++++++---------------
+ qt4/src/poppler-qt4.h                   |    5 +--
+ 6 files changed, 42 insertions(+), 45 deletions(-)
+
+commit 4e0bb0307fccefc21f74a4c5a3a0d7e8e687b550
+Author: Pino Toscano <pino@draco.(none)>
+Date:  Sat Feb 2 12:57:25 2008 +0100
+
+    Fix include guard.
+
+ poppler/ArthurOutputDev.h |   4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 6f11ef660540fd13aad1350385beb90758ca86af
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Fri Feb 1 23:55:37 2008 +0100
+
+    Fix for end condition, init ucode to 0
+
+ poppler/GfxFont.cc |   4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 1da2091807ae7f7d4d3f446953c41b4c440d4b1b
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Thu Jan 31 23:52:20 2008 +0100
+
+    Ensure we don't draw outside the main bitmap on
+    SplashOutputDev::setSoftMask
+
+    Fixes crash on http://bugs.kde.org/show_bug.cgi?id=157000
+
+ poppler/SplashOutputDev.cc |   8 ++++++--
+ 1 file changed, 6 insertions(+), 2 deletions(-)
+
+commit ecabc9469b137e8251344e5502de1cbf875223b9
+Author: Pino Toscano <pino@kde.org>
+Date:  Thu Jan 31 00:20:55 2008 +0100
+
+    Set RelWithDebInfo as default build type, if not specified.
+
+ cmake/modules/PopplerMacros.cmake |   4 ++++
+ 1 file changed, 4 insertions(+)
+
+commit 19da87a20b3906523a330e3c956903a58a3ede7f
+Author: Pino Toscano <pino@kde.org>
+Date:  Thu Jan 31 00:11:58 2008 +0100
+
+    Support the different CMake build modes.
+
+    Now you can specify (using -DCMAKE_BUILD_TYPE=type) a CMake build
+    type to have GCC or ICC w/ tuned C(XX)FLAGS.
+    The supported build types are: None (as in no type is specified on
+    command line), RelWithDebInfo, Release, Debug, DebugFull, Profile.
+
+ CMakeLists.txt                           |    7 -------
+ cmake/modules/PopplerMacros.cmake |   29 +++++++++++++++++++++++++++++
+ 2 files changed, 29 insertions(+), 7 deletions(-)
+
+commit 37d2055137c310ceb217164a76814b188be3b1b2
+Author: Pino Toscano <pino@draco.(none)>
+Date:  Wed Jan 30 23:12:03 2008 +0100
+
+    Introduce the CMake-based build system.
+
+    Mostly works nicely as the autotools, and it mimics (almost) all
+    the autotools behaviours.
+    Copied some scripts from the KDE cmake scripts (BSD-licensed).
+    TODO: gtk-doc.
+
+ CMakeLists.txt                                           |  390 +++++++
+ ConfigureChecks.cmake                            |   47 +
+ cmake/modules/COPYING-CMAKE-SCRIPTS              |   22 +
+ cmake/modules/FindCairo.cmake                    |   44 +
+ cmake/modules/FindFontconfig.cmake               |   47 +
+ cmake/modules/FindFreetype.cmake                 |   74 ++
+ cmake/modules/FindGTK.cmake                      |   70 ++
+ cmake/modules/FindPackageHandleStandardArgs.cmake |   58 +
+ cmake/modules/FindQt3.cmake                      |  319 +++++
+ cmake/modules/FindQt4.cmake                      | 1295
+ +++++++++++++++++++++
+ cmake/modules/MacroBoolTo01.cmake                |   20 +
+ cmake/modules/MacroEnsureVersion.cmake                   |  117 ++
+ cmake/modules/MacroOptionalFindPackage.cmake     |   28 +
+ cmake/modules/MacroPushRequiredVars.cmake        |   47 +
+ cmake/modules/PopplerDefaults.cmake              |   10 +
+ cmake/modules/PopplerMacros.cmake                |   83 ++
+ config.h.cmake                                           |  149 +++
+ glib/CMakeLists.txt                              |  107 ++
+ glib/demo/CMakeLists.txt                         |   17 +
+ glib/poppler-features.h.cmake                    |   24 +
+ poppler-cairo.pc.cmake                                   |    9 +
+ poppler-config.h.cmake                                   |  160 +++
+ poppler-glib.pc.cmake                            |   13 +
+ poppler-qt.pc.cmake                              |   12 +
+ poppler-qt4.pc.cmake                             |   12 +
+ poppler-splash.pc.cmake                          |    9 +
+ poppler.pc.cmake                                 |   11 +
+ qt/CMakeLists.txt                                |   33 +
+ qt4/CMakeLists.txt                               |    2 +
+ qt4/src/CMakeLists.txt                                   |   43 +
+ qt4/tests/CMakeLists.txt                         |   47 +
+ test/CMakeLists.txt                              |   52 +
+ utils/CMakeLists.txt                             |   84 ++
+ 33 files changed, 3455 insertions(+)
+
+commit 1ea831d3eee6eda35fadfb3c75962a0c708e6c7b
+Author: Pino Toscano <pino@kde.org>
+Date:  Wed Jan 30 22:17:38 2008 +0100
+
+    Preprocessor #warning is GCC-specific.
+
+ poppler/ArthurOutputDev.cc |   4 ++++
+ 1 file changed, 4 insertions(+)
+
+commit 4c738cc6bd51f9d9e23ba83949c490c5c8691345
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Tue Jan 29 23:45:52 2008 +0100
+
+    Scale text to match 'm' size
+
+    Fixes bug 12304
+
+ poppler/SplashOutputDev.cc |  37 +++++++++++++++++++++++++++++
+ splash/SplashFTFont.cc     |  55
+ +++++++++++++++++++++++++++++++++++++++++++-
+ splash/SplashFTFont.h     |    4 ++++
+ splash/SplashFont.h       |    4 ++++
+ splash/SplashFontFile.cc   |   1 +
+ splash/SplashFontFile.h    |   2 ++
+ 6 files changed, 102 insertions(+), 1 deletion(-)
+
+commit 64f16cf6ebf2870852fe8d937b25be58869ad40a
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Tue Jan 29 23:41:15 2008 +0100
+
+    Enable antialias by default on the test tool
+
+ qt4/tests/test-poppler-qt4.cpp |    2 ++
+ 1 file changed, 2 insertions(+)
+
+commit 90f0e6bc1e96d9f1666cb8476a92e127f5b927d4
+Author: Jonathan Kew <jonathan_kew@sil.org>
+Date:  Tue Jan 29 20:23:08 2008 +0100
+
+    Provide gstrndup as a portable substitue of strndup
+
+ configure.ac      |    1 -
+ goo/gmem.cc       |    7 +++++++
+ goo/gmem.h        |    5 +++++
+ poppler/GfxFont.cc |   8 +-------
+ 4 files changed, 13 insertions(+), 8 deletions(-)
+
+commit 77b91c852ad3d5554afc03aee92a1d928f233401
+Merge: 0babb0e 0533696
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Mon Jan 28 20:44:34 2008 +0100
+
+    Merge branch 'master' of
+    ssh://aacid@git.freedesktop.org/git/poppler/poppler
+
+commit 0babb0eb1afa343fb12a3fd037b98d2d1c794a1c
+Author: Jonathan Kew <jonathan_kew@sil.org>
+Date:  Mon Jan 28 20:42:44 2008 +0100
+
+    Introduce a check for strndup and alternative for systems without it
+
+ configure.ac      |    1 +
+ poppler/GfxFont.cc |   6 ++++++
+ 2 files changed, 7 insertions(+)
+
+commit 053369678963206a4afa88a614de1994872c7c5a
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Sun Jan 27 19:36:28 2008 +0100
+
+    Add ok_to_fill_form permission flag
+
+ glib/poppler-document.cc  |   2 ++
+ glib/poppler-document.h   |   3 ++-
+ glib/test-poppler-glib.cc |   21 +++++++++++++++++++--
+ 3 files changed, 23 insertions(+), 3 deletions(-)
+
+commit 3085a9495ad87a54758da0024372610fdaf88d57
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Sun Jan 27 19:15:34 2008 +0100
+
+    Fix slice rendering in poppler glib demo
+
+ glib/demo/render.c |  41 ++++++++++++++++++++++++-----------------
+ 1 file changed, 24 insertions(+), 17 deletions(-)
+
+commit 7ad6c4ba110b970516d5380444a03ae217496ddf
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Thu Jan 24 21:14:44 2008 +0100
+
+    Incrementing the iterator would be a good idea
+
+ qt4/src/poppler-annotation.cc |    1 +
+ 1 file changed, 1 insertion(+)
+
+commit 7c99ec4635a4971321bbead7d1bc723da59b755e
+Author: Julien Rebetez <julien@fhtagn.net>
+Date:  Thu Jan 24 19:18:15 2008 +0100
+
+    Revert unwanted change on Dict, fix leak on writeTrailer
+
+ poppler/Dict.cc   |   2 +-
+ poppler/PDFDoc.cc |   4 ++--
+ 2 files changed, 3 insertions(+), 3 deletions(-)
+
+commit 2335fb6034d2e9ec304abba400119b88302b3160
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Wed Jan 23 23:26:20 2008 +0100
+
+    Draw underlined Links correctly
+
+    See http://bugs.kde.org/show_bug.cgi?id=151359 for an example
+
+ poppler/Gfx.cc |    8 ++++----
+ 1 file changed, 4 insertions(+), 4 deletions(-)
+
+commit 96c532ea4b56a147de1deb965126e31f87df588b
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Wed Jan 23 13:30:12 2008 +0100
+
+    Fix memory leak
+
+ poppler/Form.cc |    4 ++++
+ 1 file changed, 4 insertions(+)
+
+commit 6bca64407c675ca837f83a12c0f655f975f14407
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Wed Jan 23 13:27:45 2008 +0100
+
+    Make sure default values are not loaded more than once for the
+    same widget.
+
+ poppler/Form.cc |   18 +++++++++++++++++-
+ poppler/Form.h  |    1 +
+ 2 files changed, 18 insertions(+), 1 deletion(-)
+
+commit eccf84b51a1cf5d478c0ec84be3fc9be8e458f4f
+Author: Pino Toscano <pino@kde.org>
+Date:  Tue Jan 22 23:28:16 2008 +0100
+
+    Refactor the PSConverter and add a PDFConverter (for PDF export/save).
+
+    Add an OutStream subclass to redirect the output to a QIODevice.
+    Split the PSConverter in a base class (BaseConverter) w/ d_ptr
+    structure.
+    Add a new PDFConverter that inherit BaseConverter, and do the
+    actual export
+    making use of the new QIODeviceOutStream.
+    The BaseConverter now handles automatically file or QIODevice output.
+
+ qt4/src/Makefile.am                         |    5 +
+ qt4/src/poppler-base-converter.cc           |   99 ++++++++++++++++
+ qt4/src/poppler-converter-private.h         |   48 ++++++++
+ qt4/src/poppler-document.cc                 |    5 +
+ qt4/src/poppler-pdf-converter.cc            |   68 +++++++++++
+ qt4/src/poppler-ps-converter.cc             |  162
+ +++++++++++---------------
+ qt4/src/poppler-qiodeviceoutstream-private.h |   47 ++++++++
+ qt4/src/poppler-qiodeviceoutstream.cc       |   71 +++++++++++
+ qt4/src/poppler-qt4.h                       |   85 +++++++++++---
+ 9 files changed, 483 insertions(+), 107 deletions(-)
+
+commit 547db8be1ab0b2987f0f06d8529eaaed2414028c
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Tue Jan 22 13:22:20 2008 +0100
+
+    Fix a crash when createAnnot returns NULL due to invalid annot dict.
+
+ poppler/Annot.cc |    2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 0d558841142587d66bd3b2025e5a9ca39f7a6159
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Mon Jan 21 21:43:39 2008 +0100
+
+    Fix another reversed comparison due to cmp
+
+ poppler/Annot.cc |    2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit cb6a87e39336e2e3893f3e5f577e4d176d237a9f
+Author: Iñigo Martínez <inigomartinez@gmail.com>
+Date:  Mon Jan 21 10:07:35 2008 +0100
+
+    Fixed a few compare issues with Annots.
+
+    Signed-off-by: Iñigo Martínez <inigomartinez@gmail.com>
+
+ poppler/Annot.cc |   24 ++++++++++++------------
+ 1 file changed, 12 insertions(+), 12 deletions(-)
+
+commit 7cf85dc8d7c895a211684c7d36757063ed4f469b
+Author: Albert Astals Cid <tsdgeos@bluebox.localdomain>
+Date:  Mon Jan 21 21:27:49 2008 +0100
+
+    The glade file needs to be distributed
+
+ test/Makefile.am |    3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+commit 46e93d31dd9b5909ecd8f7a8f8de23329444a7bc
+Author: Albert Astals Cid <tsdgeos@bluebox.localdomain>
+Date:  Sun Jan 20 19:56:51 2008 +0100
+
+    we need time.h if we use time()
+
+ poppler/PDFDoc.cc |   1 +
+ 1 file changed, 1 insertion(+)
+
+commit a0adb006c38ea07f010a01d9c0bb07ca0f48939d
+Author: Pino Toscano <pino@kde.org>
+Date:  Sun Jan 20 19:55:55 2008 +0100
+
+    Added a saveAs() overload which takes a plain OutStream
+
+ poppler/PDFDoc.cc |   9 +++++++--
+ poppler/PDFDoc.h  |   2 ++
+ 2 files changed, 9 insertions(+), 2 deletions(-)
+
+commit fcdd5c51f370d040ae57aa64801c9bd4dbe88752
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Sat Jan 19 18:00:10 2008 +0100
+
+    Do not render images when getting the image mapping, it can be done
+    later on demand.
+
+ glib/poppler-page.cc     |   81 +++++++++++++++-------------
+ glib/poppler-page.h      |    6 ++-
+ poppler/CairoOutputDev.cc |  131
+ ++++++++++++++++++++++++++-------------------
+ poppler/CairoOutputDev.h  |   12 ++++-
+ 4 files changed, 135 insertions(+), 95 deletions(-)
+
+commit 37ae465775d9a53e7c06cf51aa215439214fd79c
+Author: Albert Astals Cid <tsdgeos@bluebox.localdomain>
+Date:  Sat Jan 19 14:00:31 2008 +0100
+
+    ignore pdf-fullrewrite binary
+
+ test/.gitignore |    1 +
+ 1 file changed, 1 insertion(+)
+
+commit 1d160935ea4c1116b745c584ed7f1fd03fbbfb46
+Author: Iñigo Martínez <inigomartinez@gmail.com>
+Date:  Sat Jan 19 13:59:46 2008 +0100
+
+    AnnotWidget support and few fixes
+
+ poppler/Annot.cc |  243
+ +++++++++++++++++++++++++++++++++++++++++++++++++++---
+ poppler/Annot.h  |  142 ++++++++++++++++++++++++++++---
+ 2 files changed, 365 insertions(+), 20 deletions(-)
+
+commit 0e91a3973e525d65236d15930a8ea0e5bbb6a6cc
+Author: Iñigo Martínez <inigomartinez@gmail.com>
+Date:  Sat Jan 19 13:59:25 2008 +0100
+
+    AnnotTextMarkup support and improved AnnotQuadrilaterals
+
+ poppler/Annot.cc |  356
+ +++++++++++++++++++++++++++++++++++++++++++-----------
+ poppler/Annot.h  |  130 +++++++++++++++++---
+ 2 files changed, 400 insertions(+), 86 deletions(-)
+
+commit c13952cd56a40bad14a1bf28699b137f65162f10
+Author: Iñigo Martínez <inigomartinez@gmail.com>
+Date:  Sat Jan 19 13:59:02 2008 +0100
+
+    Changed AnnotQuadrilateral parsing inside AnnotLink
+
+ poppler/Annot.cc |  246
+ +++++++++++++++++++++++++++++-------------------------
+ poppler/Annot.h  |   19 +++--
+ 2 files changed, 144 insertions(+), 121 deletions(-)
+
+commit 2f821f10fbbba9363405201c86494cd861cec2b2
+Author: Iñigo Martínez <inigomartinez@gmail.com>
+Date:  Sat Jan 19 13:49:43 2008 +0100
+
+    Add AnnotQuadPoints class
+
+ poppler/Annot.cc |   16 ++++++++++++++++
+ poppler/Annot.h  |   23 +++++++++++++++++++++++
+ 2 files changed, 39 insertions(+)
+
+commit de4c8fa6607e55c199bede1dc731227692ef4f53
+Author: Iñigo Martínez <inigomartinez@gmail.com>
+Date:  Sun Dec 30 21:21:56 2007 +0100
+
+    AnnotFreeText support.
+
+    Signed-off-by: Iñigo Martínez <inigomartinez@gmail.com>
+
+ poppler/Annot.cc |  232
+ +++++++++++++++++++++++++++++++++++++++++++++++++++++-
+ poppler/Annot.h  |  127 ++++++++++++++++++++++++++++++
+ 2 files changed, 358 insertions(+), 1 deletion(-)
+
+commit c3504a87933ae1516b1ef05e527fd1c039091235
+Author: Iñigo Martínez <inigomartinez@gmail.com>
+Date:  Sun Dec 30 19:37:18 2007 +0100
+
+    Improved AnnotLink support.
+
+    Signed-off-by: Iñigo Martínez <inigomartinez@gmail.com>
+
+ poppler/Annot.cc |  116
+ ++++++++++++++++++++++++++++++++++++++++++++++++++++++
+ poppler/Annot.h  |   51 ++++++++++++++++++++++++
+ 2 files changed, 167 insertions(+)
+
+commit a20468cc38bb590124b2b028a08f364f90f2487f
+Author: Julien Rebetez <julien@fhtagn.net>
+Date:  Sat Jan 19 13:02:17 2008 +0100
+
+    Adds a test application to test full rewrite functionnality.
+
+ test/Makefile.am       |   11 ++++++++++-
+ test/pdf-fullrewrite.cc |   44
+ ++++++++++++++++++++++++++++++++++++++++++++
+ 2 files changed, 54 insertions(+), 1 deletion(-)
+
+commit 246294714c6011651fd0e5b3649bd65919058c72
+Author: Julien Rebetez <julien@fhtagn.net>
+Date:  Sat Jan 19 12:59:03 2008 +0100
+
+    FormWidget's 'modified' member variable is now updated correctly
+    each time an update is done.
+
+    Before, only text FormWidget had their 'modified' field set to 'true'
+    if they had been updated.
+    It is now the case for the other type of FormWidgets.
+
+ poppler/Form.cc |    7 ++++++-
+ 1 file changed, 6 insertions(+), 1 deletion(-)
+
+commit 6e0f297b8b17afb95779724b8618ca39016e664a
+Author: Julien Rebetez <julien@fhtagn.net>
+Date:  Sat Jan 19 12:54:09 2008 +0100
+
+    Annot will save their generated appearance in their AP dict.
+
+ poppler/Annot.cc |   42 ++++++++++++++++++++++++++++++++++++++----
+ poppler/Annot.h  |    1 +
+ 2 files changed, 39 insertions(+), 4 deletions(-)
+
+commit e20f6a8e9ac3936b4bc03710a71fe390dfc4c094
+Author: Julien Rebetez <julien@fhtagn.net>
+Date:  Sat Jan 19 12:52:02 2008 +0100
+
+    Add deep copy constructor to Dict.
+
+ poppler/Dict.cc |   14 +++++++++++++-
+ poppler/Dict.h  |    1 +
+ 2 files changed, 14 insertions(+), 1 deletion(-)
+
+commit e8d46cab77c7167edb0896296118daafc0f13b6d
+Author: Julien Rebetez <julien@fhtagn.net>
+Date:  Sat Jan 19 12:51:44 2008 +0100
+
+    Adds the ability to save PDF using either incremental update or by
+    rewriting completly the PDF.
+
+ poppler/PDFDoc.cc |  379
+ ++++++++++++++++++++++++++++++++++++++++++++++++++++-
+ poppler/PDFDoc.h  |   18 ++-
+ poppler/XRef.cc   |   12 +-
+ poppler/XRef.h    |   3 +-
+ 4 files changed, 402 insertions(+), 10 deletions(-)
+
+commit 742b0c3dec01d8672b84f56d5bb0e2890b178594
+Author: Julien Rebetez <julien@fhtagn.net>
+Date:  Sat Jan 19 12:51:27 2008 +0100
+
+    Make the md5 method of Decrypt public so it can be used by other
+    files.
+
+ poppler/Decrypt.cc |   5 ++---
+ poppler/Decrypt.h  |   1 +
+ 2 files changed, 3 insertions(+), 3 deletions(-)
+
+commit bb7867976740dea259d4110c072552fc5953910f
+Author: Julien Rebetez <julien@fhtagn.net>
+Date:  Sat Jan 19 12:51:07 2008 +0100
+
+    Modify the writeToFile method of XRef so it uses OutStream instead
+    of a C file descriptor.
+
+ poppler/XRef.cc |   10 +++++-----
+ poppler/XRef.h  |    2 +-
+ 2 files changed, 6 insertions(+), 6 deletions(-)
+
+commit d80736587fdbc0e163077f27bfd21c5e3a7fa4c7
+Author: Julien Rebetez <julien@fhtagn.net>
+Date:  Sat Jan 19 12:50:49 2008 +0100
+
+    Adds addIndirectObject method to XRef. This method allow the creation
+    of new indirect objects.
+
+ poppler/XRef.cc |   39 +++++++++++++++++++++++++++++++++++++++
+ poppler/XRef.h  |    1 +
+ 2 files changed, 40 insertions(+)
+
+commit 8bd00dd0872191b8806e9411d9a1adc441f08a47
+Author: Julien Rebetez <julien@fhtagn.net>
+Date:  Sat Jan 19 12:50:16 2008 +0100
+
+    Add some unfiltered methods to input stream.
+
+    With these methods, it is possible to read the raw content from the
+    stream, without any filtering (even not the headers).
+
+ poppler/Stream.cc |   41 ++++++++++++++++++++++++++++-------------
+ poppler/Stream.h  |   26 ++++++++++++++++++++++++++
+ 2 files changed, 54 insertions(+), 13 deletions(-)
+
+commit 8bcda287ddd316f90b3e47a3a307fbe63a5c21f7
+Author: Julien Rebetez <julien@fhtagn.net>
+Date:  Sat Jan 19 12:46:53 2008 +0100
+
+    Add setNeedFree method to MemStream so it is possible to choose if
+    the stream should take care of deleting the buffer.
+
+ poppler/Stream.h |    4 ++++
+ 1 file changed, 4 insertions(+)
+
+commit 4fbd143de7e3a8ab386dd14b057e62b3b9fe04e4
+Author: Julien Rebetez <julien@fhtagn.net>
+Date:  Sat Jan 19 12:45:54 2008 +0100
+
+    Add Outstream, a base class for output streams and FileOutStream,
+    which implements OutStream for output to a file.
+
+ poppler/Stream.cc |   55 +++++++++++++++++++++++++++++++++++++++++++++
+ poppler/Stream.h  |   64
+ +++++++++++++++++++++++++++++++++++++++++++++++++++++
+ 2 files changed, 119 insertions(+)
+
+commit 696eaa47169fb063b7e6998c876926c578b6fbfa
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Thu Jan 17 15:56:59 2008 +0100
+
+    Fix a crash when editing text form fields
+
+ poppler/Annot.cc |    4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 9ec1b28dcdade12498b94b650c26483581294ee6
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Thu Jan 17 14:54:34 2008 +0100
+
+    Fix a crash when a form field contains reference to non existant
+    children
+
+ poppler/Form.cc |    4 ++++
+ 1 file changed, 4 insertions(+)
+
+commit f7ed40c465033bad26dfda008c5984954baa0607
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Wed Jan 16 21:01:50 2008 +0100
+
+    Add a cast to fix build
+
+ glib/demo/info.cc |   3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+commit 1c0aa21e598b879ec49d96700e6438ccb8ac2283
+Author: Albert Astals Cid <tsdgeos@bluebox.localdomain>
+Date:  Fri Jan 11 20:28:49 2008 +0100
+
+    rename info.c to info.cc to fix bug 14024
+
+ glib/demo/Makefile.am |    2 +-
+ glib/demo/info.c      |  243
+ -------------------------------------------------
+ glib/demo/info.cc     |  243
+ +++++++++++++++++++++++++++++++++++++++++++++++++
+ 3 files changed, 244 insertions(+), 244 deletions(-)
+
+commit 88f8bf850b6c41d25b9576597b5fc5bd75a122f4
+Author: Kjartan Maraas <kmaraas@gnome.org>
+Date:  Thu Jan 10 23:51:54 2008 +0100
+
+    Fix two use after free bugs in HtmlOutputDev.cc
+
+ utils/HtmlOutputDev.cc |    4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 348f4f9d9d5b0f91da6f46e0fcefec80255d4179
+Merge: 8a8a4f0 4eca2e0
+Author: Albert Astals Cid <tsdgeos@bluebox.localdomain>
+Date:  Sat Jan 5 23:03:06 2008 +0100
+
+    Merge branch 'master' of
+    ssh://aacid@git.freedesktop.org/git/poppler/poppler
+
+commit 8a8a4f01272fb86898fafbda07129c0cbc03d527
+Author: Pino Toscano <pino@kde.org>
+Date:  Sat Jan 5 23:02:22 2008 +0100
+
+    Make Document::renderHints return the correct render hints
+
+ qt4/src/poppler-document.cc |   2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 4eca2e041c93349e0c4666e83ad1ca3caff91dee
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Tue Jan 1 14:34:00 2008 +0100
+
+    Add page transitions demo
+
+ glib/demo/Makefile.am  |    2 +
+ glib/demo/main.c       |   16 +--
+ glib/demo/transitions.c |  321
+ +++++++++++++++++++++++++++++++++++++++++++++++
+ glib/demo/transitions.h |   31 +++++
+ 4 files changed, 363 insertions(+), 7 deletions(-)
+
+commit e92b50bbd3dfc8657b611e3c33129d7c5bae2319
+Author: Koji Otani <sho@bbr.jp>
+Date:  Wed Dec 26 18:56:01 2007 +0100
+
+    Use getEmbeddedFontID instead of getEmbeddedFontName to check if a
+    font is embedded or not
+
+ poppler/GfxFont.cc |   3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+commit 30e9bae97e3742913015f7ea46636b2b80937612
+Author: Ed Catmur <ed@catmur.co.uk>
+Date:  Sat Dec 22 22:54:51 2007 +0100
+
+    Fixlets for Adobe Glyph Naming convention implementation
+
+ poppler/GfxFont.cc |  94
+ +++++++++++++++++++++++++++-------------------------
+ 1 file changed, 48 insertions(+), 46 deletions(-)
+
+commit 40551e616b007ceb15c9d6e3d77c24538ffec924
+Author: Albert Astals Cid <tsdgeos@bluebox.localdomain>
+Date:  Sat Dec 22 14:31:50 2007 +0100
+
+    Check the destination page of the link does exist
+
+ qt4/src/poppler-link.cc |   20 ++++++++++++--------
+ 1 file changed, 12 insertions(+), 8 deletions(-)
+
+commit c06d6f2236d854f05e7621be280109ff27dc73b9
+Author: Albert Astals Cid <tsdgeos@bluebox.localdomain>
+Date:  Thu Dec 20 20:13:08 2007 +0100
+
+    Use UnicodeParsedString that does exactly what this code does
+
+ qt4/src/poppler-document.cc |  28 +---------------------------
+ 1 file changed, 1 insertion(+), 27 deletions(-)
+
+commit 5f9f06a10fdb72a9d809ee1f779e1a8f549840e7
+Author: Koji Otani <sho@bbr.jp>
+Date:  Thu Dec 20 19:59:26 2007 +0100
+
+    Fix for latest CJK code
+
+    See
+    http://lists.freedesktop.org/archives/poppler/2007-December/003244.html
+    for more information
+
+ poppler/GfxFont.cc |  14 ++++++++++----
+ 1 file changed, 10 insertions(+), 4 deletions(-)
+
+commit bb49e1e3909fc7392c197dc67d9b7f5312fd0dad
+Author: Ed Catmur <ed@catmur.co.uk>
+Date:  Tue Dec 18 20:20:11 2007 +0100
+
+    Implement Adobe Glyph Naming convention
+
+ poppler/GfxFont.cc |  183
+ +++++++++++++++++++++++++++++++++++++++++++---------
+ 1 file changed, 154 insertions(+), 29 deletions(-)
+
+commit 5634d63abdd64d371f2e8687a1c172f55b052008
+Author: Koji Otani <sho@bbr.jp>
+Date:  Mon Dec 17 20:43:41 2007 +0100
+
+    Allow seting some more Graphics States (Font, LW, LC, LJ, ML, D,
+    RI, FL) by operator 'gs'
+
+ poppler/Gfx.cc |   67
+ ++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+ 1 file changed, 67 insertions(+)
+
+commit 7a9e7fc96b47b9d833300233ac38bbd60097f425
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Sun Dec 16 21:21:08 2007 +0100
+
+    Add AnnotLink class so that link annots are properly recognized
+
+    Right now, all of the annots except Text, are created using the
+    base class Annot which sets the type to unknown. For link annots this
+    causes the border never be drawn, since we are checking first
+    whether the
+    annot is a Link and it's always false.
+
+ poppler/Annot.cc |   12 +++++++++++-
+ poppler/Annot.h  |   10 ++++++++++
+ 2 files changed, 21 insertions(+), 1 deletion(-)
+
+commit 796d9cb9b188a8af69d7fbf9bccbb408cbf6a71a
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Sat Dec 15 15:21:49 2007 +0100
+
+    Fix a crash when trying to create a temp annot with catalog = NULL
+
+ poppler/Annot.cc |    7 +++++++
+ poppler/Annot.h  |    1 +
+ poppler/Form.cc  |    6 ++----
+ 3 files changed, 10 insertions(+), 4 deletions(-)
+
+commit 99f049f0dfbfd9c22bea56ae96253837ae421e23
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Fri Dec 14 15:26:24 2007 +0100
+
+    Use the default dash array when it's not correct in AnnotBorderBS
+
+ poppler/Annot.cc |    4 +++-
+ 1 file changed, 3 insertions(+), 1 deletion(-)
+
+commit cb2a997aa6f9dd5508ca8b04e63815da893497ef
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Fri Dec 14 14:12:14 2007 +0100
+
+    Fix another crash due to uninitialized variables
+
+ poppler/Annot.cc |   18 ++++++++----------
+ poppler/Annot.h  |    1 +
+ 2 files changed, 9 insertions(+), 10 deletions(-)
+
+commit f704e86d8c72bacbd9443c4d828cd284d3a11753
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Fri Dec 14 12:58:12 2007 +0100
+
+    Fix several crashes due to uninitialized variables in Annots.
+
+ poppler/Annot.cc |   11 +++++++----
+ 1 file changed, 7 insertions(+), 4 deletions(-)
+
+commit 0820a93ba1c0e893681024feb9f9bd120a9eeb4d
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Fri Dec 14 12:38:58 2007 +0100
+
+    Check whether top and left should be changed in FitH, FitV, FitBH
+    and FitBV destinations
+
+    According to the spec, if a null value is specified for top or left
+    parameter in such
+    destinations, the parameter should be retained unchanged.
+
+ poppler/Link.cc |   36 ++++++++++++++++++++++++++++--------
+ 1 file changed, 28 insertions(+), 8 deletions(-)
+
+commit 0fb42a2f557d5ec83b42326eb6b0be41622ca328
+Author: Iñigo Martínez <inigomartinez@gmail.com>
+Date:  Wed Dec 12 01:02:31 2007 +0100
+
+    Changed getters to const
+
+    Signed-off-by: Iñigo Martínez <inigomartinez@gmail.com>
+
+ poppler/Annot.cc |   28 ++++++++++-----------
+ poppler/Annot.h  |   72
+ +++++++++++++++++++++++++++---------------------------
+ 2 files changed, 50 insertions(+), 50 deletions(-)
+
+commit 29d39a8ae120e6045a16a7aa0944c36560b42508
+Author: Iñigo Martínez <inigomartinez@gmail.com>
+Date:  Mon Dec 10 17:56:44 2007 +0100
+
+    AnnotText support.
+
+    Signed-off-by: Iñigo Martínez <inigomartinez@gmail.com>
+
+ poppler/Annot.cc |  123
+ +++++++++++++++++++++++++++++++++++++++++++++++++++++-
+ poppler/Annot.h  |   65 ++++++++++++++++++++++++-----
+ 2 files changed, 177 insertions(+), 11 deletions(-)
+
+commit 2acecde458122bd67487cc302478befa78bf6fbe
+Author: Iñigo Martínez <inigomartinez@gmail.com>
+Date:  Mon Dec 10 16:45:46 2007 +0100
+
+    AnnotMarkup support.
+
+    Signed-off-by: Iñigo Martínez <inigomartinez@gmail.com>
+
+ poppler/Annot.cc |  115
+ ++++++++++++++++++++++++++++++++++++++++++++++++++++++
+ poppler/Annot.h  |   51 ++++++++++++++++++++++++
+ 2 files changed, 166 insertions(+)
+
+commit 1f8c1fe34e04688d2ba200f1166cfdd1ffe563f0
+Author: Iñigo Martínez <inigomartinez@gmail.com>
+Date:  Mon Dec 10 16:34:01 2007 +0100
+
+    AnnotPopup support.
+
+    Signed-off-by: Iñigo Martínez <inigomartinez@gmail.com>
+
+ poppler/Annot.cc |   34 ++++++++++++++++++++++++++++++++++
+ poppler/Annot.h  |   21 +++++++++++++++++++++
+ 2 files changed, 55 insertions(+)
+
+commit 6c83e06fb2eb77d0dbefd1ebfbcac3e5f0cbb622
+Author: Iñigo Martínez <inigomartinez@gmail.com>
+Date:  Mon Dec 10 16:24:38 2007 +0100
+
+    Prepare code to Annotation Subtype support.
+
+    Signed-off-by: Iñigo Martínez <inigomartinez@gmail.com>
+
+ glib/poppler-page.cc |   11 +---
+ poppler/Annot.cc     |  160
+ ++++++++++++++++++++++++++++++++++++--------------
+ poppler/Annot.h      |   54 ++++++++++++++---
+ poppler/Form.cc      |    6 +-
+ 4 files changed, 167 insertions(+), 64 deletions(-)
+
+commit fa0bb5bbea5bf2769c8b3084f78770b7781002eb
+Author: Iñigo Martínez <inigomartinez@gmail.com>
+Date:  Mon Dec 10 15:41:38 2007 +0100
+
+    Various Annot improvements
+
+    Signed-off-by: Iñigo Martínez <inigomartinez@gmail.com>
+
+ poppler/Annot.cc |  613
+ +++++++++++++++++++++++++++++++++++-------------------
+ poppler/Annot.h  |  140 +++++++++++--
+ poppler/Gfx.cc   |   21 +-
+ poppler/Gfx.h   |    5 +-
+ 4 files changed, 543 insertions(+), 236 deletions(-)
+
+commit e0f49fd5aef3c798798ad7e7dba55857bde1b4c0
+Author: Koji Otani <sho@bbr.jp>
+Date:  Thu Dec 13 23:40:46 2007 +0100
+
+    Some CJK charecters are displayed vertical glyphs incorrectly when
+    horizontal mode
+
+ poppler/GfxFont.cc |  46 +++++++++++++++++++++++++---------------------
+ 1 file changed, 25 insertions(+), 21 deletions(-)
+
+commit 85901922bf354a1268037d0b6ec5cbf14da979a1
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Thu Dec 13 23:30:59 2007 +0100
+
+    Yet another gmallocn to gmallocn_checkoverflow
+
+    Fixes http://bugs.kde.org/show_bug.cgi?id=153949
+
+ poppler/SplashOutputDev.cc |  23 ++++++++++++++++-------
+ 1 file changed, 16 insertions(+), 7 deletions(-)
+
+commit f24259cddb9c5e02cf9d2071bfa0106f3e88bd59
+Author: Koji Otani <sho@bbr.jp>
+Date:  Mon Dec 10 23:24:14 2007 +0100
+
+    Display characters outside of unicode BMP with TT font
+
+ fofi/FoFiTrueType.cc |   33 +++++++++++++++++++---
+ fofi/FoFiTrueType.h  |    2 +-
+ poppler/CMap.cc      |   34 +++++++++++++++++++++++
+ poppler/CMap.h       |    4 +++
+ poppler/GfxFont.cc   |   75
+ +++++++++++++++++++++++++++++++-------------------
+ 5 files changed, 115 insertions(+), 33 deletions(-)
+
+commit 7cbabbf378cf5a9c0411558ff02b44dec2040ea1
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Mon Dec 10 22:00:30 2007 +0100
+
+    Fix a crash when marked content properties operator is not a dict.
+
+ poppler/Gfx.cc |    2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit e807f9c72c7f0c5cc0655918f676f4af54739442
+Merge: bf57117 e2ea743
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Sun Dec 9 18:07:30 2007 +0100
+
+    Merge branch 'master' of
+    ssh://aacid@git.freedesktop.org/git/poppler/poppler
+
+commit bf57117df8786778faf31e5d843533004f867ff3
+Author: Adrian Johnson <ajohnson@redneon.com>
+Date:  Sun Dec 9 18:07:00 2007 +0100
+
+    Add support for ActualText entries
+
+    Patch by Adrian Johnson with two minor changes by me (one fordward
+    declaration and a leak fix)
+
+ poppler/Form.cc         |    2 +-
+ poppler/Gfx.cc                  |    2 +-
+ poppler/OutputDev.cc    |    2 +-
+ poppler/OutputDev.h     |    2 +-
+ poppler/PDFDocEncoding.h |    4 ++
+ poppler/TextOutputDev.cc |   98
+ +++++++++++++++++++++++++++++++++++++++++++++-
+ poppler/TextOutputDev.h  |   11 ++++++
+ 7 files changed, 116 insertions(+), 5 deletions(-)
+
+commit e2ea7430e7d6db50cbfdac34713915e5b0942a89
+Author: Albert Astals Cid <tsdgeos@localhost.(none)>
+Date:  Sat Dec 8 23:21:34 2007 +0100
+
+    disable warnings about assigning const char * to char *
+
+    We have them all over the place and we are not going to fix it as
+    that'll be too much overhead when re-merging xpdf changes
+
+ configure.ac |    2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit acf70c666d4f534cd97de64d4378bf6399e31fd4
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Thu Dec 6 23:58:26 2007 +0100
+
+    Disable gtk tests if the user disabled glib frontend
+
+ configure.ac |    2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit bb0ec68f21d355081ff75aad641bc3809141e398
+Merge: 5a34cdd b925ea2
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Thu Dec 6 18:38:54 2007 +0100
+
+    Merge branch 'master' of
+    ssh://aacid@git.freedesktop.org/git/poppler/poppler
+
+commit b925ea232b6ed5028712600f9aebe453f3b2ba06
+Author: Brad Hards <bradh@kde.org>
+Date:  Tue Dec 4 19:11:13 2007 +1100
+
+    Remove redundant check.
+
+ poppler/PSOutputDev.cc |    2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 275afca4ef24020273df652ccfdf76c6994e9294
+Author: Brad Hards <bradh@kde.org>
+Date:  Sun Dec 2 19:45:16 2007 +1100
+
+    Preserve PDF page labels when we output as postscript.
+
+    Resolves bug 13338.
+
+ poppler/PSOutputDev.cc |   81
+ +++++++++++++++++++++++++++++++++++++++++++++++-
+ poppler/PSOutputDev.h |    2 ++
+ 2 files changed, 82 insertions(+), 1 deletion(-)
+
+commit 641edb83a457083c13f3e374f6ac6c570dd54d7f
+Author: Brad Hards <bradh@kde.org>
+Date:  Wed Nov 28 19:42:53 2007 +1100
+
+    Minor API documentation update
+
+ qt4/src/poppler-annotation.h |   81
+ ++++++++++++++++++++++++++++++++++++++++--
+ 1 file changed, 79 insertions(+), 2 deletions(-)
+
+commit 3635ec6fcbc89daf633c03efb644df9031b80f59
+Author: Brad Hards <bradh@kde.org>
+Date:  Wed Nov 28 19:42:22 2007 +1100
+
+    Update doxygen configuration file to version 1.5.3
+
+ qt4/src/Doxyfile |  185
+ +++++++++++++++++++++++++++++++++++++++++-------------
+ 1 file changed, 141 insertions(+), 44 deletions(-)
+
+commit 02c7ea6e1fd3e225de1eda231813f4db0ffb9fdb
+Author: Brad Hards <bradh@kde.org>
+Date:  Wed Nov 28 19:41:54 2007 +1100
+
+    Fix off-by-one in printCommands path.
+
+ poppler/Gfx.cc |    4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 74af7c1209f47ed39addf7fde3ea106a7c77a408
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Sat Nov 24 18:12:00 2007 +0100
+
+    Convert passwords from utf-8 to latin-1 when needed. Fixes bug #4557
+
+ glib/poppler-document.cc |   16 ++++++++++++++--
+ 1 file changed, 14 insertions(+), 2 deletions(-)
+
+commit 5a34cddf043cb484549cb411e034786a7d8688a3
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Fri Nov 23 23:13:57 2007 +0100
+
+    add a ignore
+
+ glib/demo/.gitignore |    1 +
+ 1 file changed, 1 insertion(+)
+
+commit 21a58562cc1e575ec3d81b6e34bfcb21306eb67f
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Fri Nov 23 23:12:06 2007 +0100
+
+    sscanf does not like null strings, so don't call it on empty qstrings
+
+ qt/poppler-document.cc |    2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 6f8451cf9d19f57f658d1568643ecb0f953e1075
+Author: Jeff Muizelaar <jeff@infidigm.net>
+Date:  Sun Nov 11 21:29:40 2007 -0500
+
+    Add support for knockout groups to the cairo backend
+
+    This is sort of hacky because we need to keep track of shape and
+    opacity
+    seperately.  It is also probably not entirely correct. However,
+    it should be
+    closer than previously.
+
+ poppler/CairoOutputDev.cc |  309
+ +++++++++++++++++++++++++++++++++++++++++++--
+ poppler/CairoOutputDev.h  |   8 +-
+ 2 files changed, 303 insertions(+), 14 deletions(-)
+
+commit b0fbfb0ac366434d7e4c0350a9be83ddda7b03cf
+Author: Jeff Muizelaar <jeff@infidigm.net>
+Date:  Sun Nov 11 16:06:16 2007 -0500
+
+    Track the AlphaIsShape and TextKnockout state
+
+    Parse, store and notify the OutputDevices about these entries.
+
+ poppler/Gfx.cc      |  14 ++++++++++++++
+ poppler/GfxState.h  |   6 ++++++
+ poppler/OutputDev.h |   2 ++
+ 3 files changed, 22 insertions(+)
+
+commit f6429b13a972f2deb25b3d3a9948dca024a54841
+Author: Jeff Muizelaar <jeff@infidigm.net>
+Date:  Sat Nov 10 14:08:09 2007 -0500
+
+    Fix accidental mode change.
+
+ 0 files changed
+
+commit 5797f50a99d1494767edc5928f9c3e9d927b946d
+Author: Jeff Muizelaar <jeff@infidigm.net>
+Date:  Sat Nov 10 01:52:00 2007 -0500
+
+    Scale text to match 'm' size
+
+    This adds back the hack that was removed when fontconfig support
+    was added long
+    ago. It's not a great solution but lets us be at least as good as
+    xpdf. Fixes
+    #12304 with the cairo backend. The problem persists with the splash
+    backend.
+
+ poppler/CairoFontEngine.cc |  56
+ +++++++++++++++++++++++++++++++++++++++++---
+ poppler/CairoFontEngine.h  |   7 +++++-
+ poppler/CairoOutputDev.cc  |   8 +++++--
+ 3 files changed, 65 insertions(+), 6 deletions(-)
+
+commit 551212e55127c7e46d9aff3318015fd9b5385687
+Author: Brad Hards <bradh@frogmouth.net>
+Date:  Sat Nov 10 11:56:15 2007 +0100
+
+    Fix uninitialized variable access
+
+    Supported by Derek B. Noonburg
+
+ poppler/GfxState.cc |   4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 934a5ae45eb17bd0e2010be89f55510e8a69816b
+Author: Jeff Muizelaar <jeff@infidigm.net>
+Date:  Sat Nov 3 13:08:51 2007 -0400
+
+    Avoiding using floating point when converting to luminance.
+
+    The code now also does proper rounding instead of just truncating.
+
+ poppler/CairoOutputDev.cc |   3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+commit 1b3f045a25e5d172357bc87c15ba591c8e1511a7
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Thu Nov 8 23:34:07 2007 +0100
+
+    Move another gmallocn to gmallocn_checkoverflow. Fixes crashes on
+    incorrect pdf sent by Red Hat
+
+ poppler/Stream.cc |   21 +++++++++++++++------
+ 1 file changed, 15 insertions(+), 6 deletions(-)
+
+commit 944d327fd7036332a33b4ad6476ceca7a650ef6e
+Merge: fb1d1f4 c340255
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Wed Nov 7 23:52:47 2007 +0100
+
+    Merge branch 'master' of
+    ssh://aacid@git.freedesktop.org/git/poppler/poppler
+
+commit fb1d1f459784a6c19034212a617268f7f5a90e9c
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Wed Nov 7 23:51:58 2007 +0100
+
+    merge ftp://ftp.foolabs.com/pub/xpdf/xpdf-3.02pl2.patch
+
+ poppler/Stream.cc |  417
+ ++++++++++++++++++++++++++++++-----------------------
+ poppler/Stream.h  |   10 +-
+ 2 files changed, 245 insertions(+), 182 deletions(-)
+
+commit c340255f46bc95b5f850abcd3d9bcdc8594199bb
+Author: Brad Hards <bradh@kde.org>
+Date:  Mon Nov 5 20:36:23 2007 +1100
+
+    Update .gitignore
+
+    Suppress the noise a bit.
+
+ qt4/.gitignore       |    1 +
+ qt4/tests/.gitignore |    3 +++
+ test/.gitignore      |    2 ++
+ 3 files changed, 6 insertions(+)
+
+commit cebf770379e7d71166e729aebf771a4ca291d48b
+Author: Brad Hards <bradh@kde.org>
+Date:  Mon Nov 5 20:31:18 2007 +1100
+
+    Add a new unit test, for non-ASCII searching.
+
+    There is a bug report (bug:7063) about not being able
+    to find text that isn't ASCII. I think that the problem isn't
+    in poppler core code - this unit test shows we can find
+    characters as long as they are properly encoded (which the
+    Qt4 front end does).
+
+ qt4/tests/Makefile.am     |    7 ++++++-
+ qt4/tests/check_search.cpp |  40
+ ++++++++++++++++++++++++++++++++++++++++
+ 2 files changed, 46 insertions(+), 1 deletion(-)
+
+commit 570fe464a2aae4f22d0b47cce73b8bc36b116e9f
+Merge: 1c7b7a0 7875067
+Author: Brad Hards <bradh@kde.org>
+Date:  Mon Nov 5 15:55:39 2007 +1100
+
+    Merge branch 'minor-fixes'
+
+commit 78750679e213d7307cce38166b6af32562e871b8
+Author: Brad Hards <bradh@kde.org>
+Date:  Mon Nov 5 15:54:36 2007 +1100
+
+    Additional check for password protected documents
+
+    We need to bail out on locked documents. In the future,
+    we could probably go interactive, and ask the user for
+    a password.
+
+ qt4/tests/test-poppler-qt4.cpp |    6 ++++++
+ 1 file changed, 6 insertions(+)
+
+commit 1c7b7a0c581b542945cac257202bbb819d33694c
+Author: Brad Hards <bradh@kde.org>
+Date:  Mon Nov 5 15:49:45 2007 +1100
+
+    Minor Qt4 API documentation fix
+
+    Also, this is a test of my git newbie-ness.
+
+ qt4/src/poppler-form.h |    8 ++++----
+ 1 file changed, 4 insertions(+), 4 deletions(-)
+
+commit b86fc565d175835cf27e9c8632da47a5e0b50237
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Mon Nov 5 00:14:55 2007 +0100
+
+    Fix FSF address
+
+ glib/demo/fonts.c                       |    2 +-
+ glib/demo/fonts.h                       |    2 +-
+ glib/demo/forms.c                       |    2 +-
+ glib/demo/forms.h                       |    2 +-
+ glib/demo/info.c                        |    2 +-
+ glib/demo/info.h                        |    2 +-
+ glib/demo/links.c                       |    2 +-
+ glib/demo/links.h                       |    2 +-
+ glib/demo/main.c                        |    2 +-
+ glib/demo/outline.c                     |    2 +-
+ glib/demo/outline.h                     |    2 +-
+ glib/demo/page.c                        |    2 +-
+ glib/demo/page.h                        |    2 +-
+ glib/demo/render.c                      |    2 +-
+ glib/demo/render.h                      |    2 +-
+ glib/demo/utils.c                       |    2 +-
+ glib/demo/utils.h                       |    2 +-
+ glib/poppler-action.cc                          |    2 +-
+ glib/poppler-action.h                   |    2 +-
+ glib/poppler-attachment.cc              |    2 +-
+ glib/poppler-attachment.h               |    2 +-
+ glib/poppler-document.cc                |    2 +-
+ glib/poppler-document.h                 |    2 +-
+ glib/poppler-features.h.in              |    2 +-
+ glib/poppler-form-field.cc              |    2 +-
+ glib/poppler-form-field.h               |    2 +-
+ glib/poppler-page.cc                    |    2 +-
+ glib/poppler-page.h                     |    2 +-
+ glib/poppler.cc                         |    2 +-
+ glib/poppler.h                                  |    2 +-
+ poppler/PageTransition.cc               |    2 +-
+ poppler/Sound.cc                        |    2 +-
+ poppler/Sound.h                         |    2 +-
+ qt/poppler-document.cc                          |    2 +-
+ qt/poppler-fontinfo.cc                          |    2 +-
+ qt/poppler-link-qt3.h                   |    2 +-
+ qt/poppler-link.cc                      |    2 +-
+ qt/poppler-page-transition-private.h    |    2 +-
+ qt/poppler-page-transition.cc           |    2 +-
+ qt/poppler-page-transition.h            |    2 +-
+ qt/poppler-page.cc                      |    2 +-
+ qt/poppler-private.h                    |    2 +-
+ qt/poppler-qt.h                         |    2 +-
+ qt4/src/poppler-annotation-helper.h     |    2 +-
+ qt4/src/poppler-annotation-private.h    |    2 +-
+ qt4/src/poppler-annotation.cc           |    2 +-
+ qt4/src/poppler-annotation.h            |    2 +-
+ qt4/src/poppler-document.cc             |    2 +-
+ qt4/src/poppler-embeddedfile.cc         |    2 +-
+ qt4/src/poppler-fontinfo.cc             |    2 +-
+ qt4/src/poppler-form.cc                 |    2 +-
+ qt4/src/poppler-form.h                          |    2 +-
+ qt4/src/poppler-link-extractor-private.h |    2 +-
+ qt4/src/poppler-link-extractor.cc       |    2 +-
+ qt4/src/poppler-link.cc                 |    2 +-
+ qt4/src/poppler-link.h                          |    2 +-
+ qt4/src/poppler-page-private.h                  |    2 +-
+ qt4/src/poppler-page.cc                 |    2 +-
+ qt4/src/poppler-private.h               |    2 +-
+ qt4/src/poppler-ps-converter.cc         |    2 +-
+ qt4/src/poppler-qt4.h                   |    2 +-
+ qt4/src/poppler-sound.cc                |    2 +-
+ qt4/src/poppler-textbox.cc              |    2 +-
+ 63 files changed, 63 insertions(+), 63 deletions(-)
+
+commit 37776afc6f8a5733b41da6fb0f45e7ace4edf737
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Mon Nov 5 00:03:55 2007 +0100
+
+    Update from http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt
+
+ COPYING |   27 +++++++++++++--------------
+ 1 file changed, 13 insertions(+), 14 deletions(-)
+
+commit 34a90b35998b65539cf1e8f09194d45db71064a1
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Sun Nov 4 14:03:35 2007 +0100
+
+    Remove duplicate checking
+
+ poppler/JBIG2Stream.cc |    8 --------
+ 1 file changed, 8 deletions(-)
+
+commit d694e1dd042fb97fbc62046b69cafe30d6f9ea58
+Merge: ba5b31c 432e657
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Sun Nov 4 13:26:47 2007 +0100
+
+    Merge branch 'master' of
+    ssh://aacid@git.freedesktop.org/git/poppler/poppler
+
+commit ba5b31c6a8b2317332bfa148f6d80f66891fb9ce
+Author: Brad Hards <bradh@frogmouth.net>
+Date:  Sun Nov 4 13:25:12 2007 +0100
+
+    Require fontconfig >= 2.0 Fixes bug 9020
+
+ configure.ac |    2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 432e657a49cb097638a79e38c141088039572816
+Author: Jeff Muizelaar <jeff@freiheit.infidigm.net>
+Date:  Mon Sep 17 19:15:21 2007 -0400
+
+    Use realloc/free instead of new/delete when resizing GooStrings
+
+    This allows for a large performance improvement when appending a
+    large number
+    of characters to a GooString. This is especially helpful for
+    TextOutputDev on
+    large PDFs. For example, the following code has the potential to be
+    O(n) instead of
+    O(n²) with a good implementation of realloc.
+
+    while (n) {
+      string.append(character);
+      n--;
+    }
+
+ goo/GooString.cc |   30 +++++++++++++++++-------------
+ 1 file changed, 17 insertions(+), 13 deletions(-)
+
+commit cb80112afed2c5b9642c3c43f1cc001ed88d08cb
+Author: Jonathan Kew <jonathan_kew@sil.org>
+Date:  Thu Nov 1 20:53:05 2007 +0100
+
+    Do not try to parse directories when processing nameToUnicode
+    dir. Fixes ugly warnings on mingw32
+
+ poppler/GlobalParams.cc |    6 ++++--
+ 1 file changed, 4 insertions(+), 2 deletions(-)
+
+commit ad6b888edff7b30be72df948c4052b9934a37705
+Author: Albert Astals Cid <tsdgeos@bluebox.localdomain>
+Date:  Thu Nov 1 20:48:21 2007 +0100
+
+    Add some castings to make it compile
+
+ glib/test-poppler-glib.cc |   4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit a968dcc759379f48265c91bea63ca4cf987d94a9
+Author: Albert Astals Cid <tsdgeos@bluebox.localdomain>
+Date:  Wed Oct 31 23:53:39 2007 +0100
+
+    Tests for passwords
+
+ qt4/tests/Makefile.am           |   13 +++++-
+ qt4/tests/check_password.cpp    |   87
+ ++++++++++++++++++++++++++++++++++++++
+ qt4/tests/stress-poppler-dir.cpp |   63 +++++++++++++++++++++++++++
+ qt4/tests/test-poppler-qt4.cpp   |   15 ++++++-
+ 4 files changed, 175 insertions(+), 3 deletions(-)
+
+commit 7b7a08863a8278dee7aa1fe7789cf72223c26b35
+Author: Brad Hards <bradh@frogmouth.net>
+Date:  Wed Oct 31 23:53:27 2007 +0100
+
+    Improve documentation
+
+ qt4/src/poppler-qt4.h |   64
+ ++++++++++++++++++++++++++++++++++++++++++-------
+ 1 file changed, 56 insertions(+), 8 deletions(-)
+
+commit 96493c9409186a7e964e894c7f730962b6995fd7
+Author: Albert Astals Cid <tsdgeos@bluebox.localdomain>
+Date:  Wed Oct 31 23:51:25 2007 +0100
+
+    remove old file
+
+ glib/test-poppler-glib.c |  514
+ ----------------------------------------------
+ 1 file changed, 514 deletions(-)
+
+commit 951a05f7a11af4a44e4cb85a015939d6a3e513f5
+Author: Albert Astals Cid <tsdgeos@bluebox.localdomain>
+Date:  Sat Oct 27 12:33:22 2007 +0200
+
+    Remove fordward declaration of a non-existant class
+
+ poppler/Form.h |    1 -
+ 1 file changed, 1 deletion(-)
+
+commit 289679405ab143bc2106cf269227c514a1602e56
+Author: Jeff Muizelaar <jeff@infidigm.net>
+Date:  Thu Oct 25 22:16:10 2007 -0400
+
+    Avoid drawing borders unless /W and /S are specified in /BS
+
+    Acroread doesn't sometimes doesn't draw borders when you'd
+    expect it to. Special case that behaviour so that we do the
+    same thing.
+
+ poppler/Annot.cc |   15 ++++++++++++---
+ 1 file changed, 12 insertions(+), 3 deletions(-)
+
+commit ab0a6c37faf9916edcd70e128d9f2654eb795ace
+Author: Albert Astals Cid <tsdgeos@bluebox.localdomain>
+Date:  Thu Oct 25 20:56:58 2007 +0200
+
+    Fix compilation on mingw. Bug 12493
+
+    Added a check for localtime_r in configure.ac
+    Moved test-poppler-glib.c to test-poppler-glib.cc to get the correct
+    compiler
+
+ configure.ac             |    1 +
+ glib/Makefile.am         |    2 +-
+ glib/test-poppler-glib.cc |  520
+ +++++++++++++++++++++++++++++++++++++++++++++
+ 3 files changed, 522 insertions(+), 1 deletion(-)
+
+commit 6bd637dc135045b20abf024d394538d7a3160795
+Merge: c01ab71 25b273d
+Author: Albert Astals Cid <tsdgeos@bluebox.localdomain>
+Date:  Tue Oct 23 23:27:01 2007 +0200
+
+    Merge branch 'master' of
+    ssh://aacid@git.freedesktop.org/git/poppler/poppler
+
+commit c01ab714ecd42e39ecb0be1c0c2504635251ac01
+Author: Albert Astals Cid <tsdgeos@bluebox.localdomain>
+Date:  Tue Oct 23 23:26:21 2007 +0200
+
+    Provide setters for some methods that only had getters. Fixes
+    bug 12894
+
+ poppler/GlobalParams.cc |   49
+ +++++++++++++++++++++++++++++++++++++++++++++++
+ poppler/GlobalParams.h  |    7 +++++++
+ 2 files changed, 56 insertions(+)
+
+commit 25b273db677815c8df11e52fe9df29fe857a8a88
+Author: Jeff Muizelaar <jeff@infidigm.net>
+Date:  Mon Oct 22 23:01:37 2007 -0400
+
+    Unset the font if it doesn't exist or we can not load it properly
+
+    Previously, the previous font stayed current and glyphs would be
+    drawn using
+    it. This resulted in random glyphs being chosen unless the encodings
+    happened
+    to match. Now, instead, we draw nothing which matches the behaviour of
+    acroread.
+
+ poppler/Gfx.cc     |   4 ++++
+ poppler/GfxFont.cc |   4 ++++
+ 2 files changed, 8 insertions(+)
+
+commit 57331767ed5306eba1f9bf60e48fc88debdc2198
+Author: Albert Astals Cid <tsdgeos@bluebox.localdomain>
+Date:  Mon Oct 22 23:33:59 2007 +0200
+
+    builddir != srcdir fixes by Christian Persch <chpe gnome org>
+
+ autogen.sh           |    7 ++++---
+ glib/demo/Makefile.am |    1 +
+ 2 files changed, 5 insertions(+), 3 deletions(-)
+
+commit 2a333e5a618b5c92f3c703816b950321f25d3aab
+Author: Albert Astals Cid <tsdgeos@bluebox.localdomain>
+Date:  Mon Oct 22 22:14:43 2007 +0200
+
+    Splash rework, check if font is inside clip area before rendering
+    it to a temporary bitmap. Fixes KDE bug 150693
+
+    This change is not trivial. What i did is:
+    It is getGlyph the one that does the intersection between clip area
+    and rendering area of the font instead fillGlyph2
+    That means some clipRes = state->clip->testRect but we win more
+    robustness against broken pdf that specify HUGE fonts
+
+ splash/Splash.cc      |  207
+ ++++++++++++++++++++++++------------------------
+ splash/Splash.h       |    4 +-
+ splash/SplashFTFont.cc |   23 +++++-
+ splash/SplashFTFont.h |    4 +-
+ splash/SplashFont.cc  |   29 +++++--
+ splash/SplashFont.h   |    5 +-
+ splash/SplashT1Font.cc |   11 ++-
+ splash/SplashT1Font.h |    4 +-
+ 8 files changed, 162 insertions(+), 125 deletions(-)
+
+commit cf785cd12ae77e8dd778ed043584f8f26efe675f
+Author: Albert Astals Cid <tsdgeos@bluebox.localdomain>
+Date:  Mon Oct 22 21:59:35 2007 +0200
+
+    Add gmallocn_checkoverflow, it's the same as gmallocn but returns
+    NULL on overflow instead of doing exit()
+
+ goo/gmem.cc |  18 ++++++++++++++++++
+ goo/gmem.h  |   3 +++
+ 2 files changed, 21 insertions(+)
+
+commit 37e16ac301a35ceca2e3535f8c6100d4cf723c82
+Author: Albert Astals Cid <tsdgeos@bluebox.localdomain>
+Date:  Mon Oct 22 21:54:02 2007 +0200
+
+    exit(1) is bad in library code, use the src.abort method to describe
+    failure
+
+ poppler/DCTStream.cc |    3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+commit dbe975c129999a3efceb1c86518fa6fda74f685c
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Mon Oct 22 11:25:37 2007 +0200
+
+    Fix a crash with invalid TrueType fonts
+
+ fofi/FoFiTrueType.cc |   10 ++++++----
+ 1 file changed, 6 insertions(+), 4 deletions(-)
+
+commit 8bfe30a48fd7021591ab307bd51f86c06ff202b9
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Fri Oct 19 15:46:50 2007 +0200
+
+    Do not generate appearance stream for radio button that are not active
+
+ poppler/Annot.cc |    3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+commit 1a531dcfee1c6fc79a414c38cbe7327fbf9a59d8
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Fri Oct 19 13:12:24 2007 +0200
+
+    Fix a crash with invalid embedded fonts
+
+ poppler/CairoFontEngine.cc |   6 ++++++
+ 1 file changed, 6 insertions(+)
+
+commit e1740278457e512676b623bcdf9968193f0a8d7b
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Fri Oct 19 12:21:54 2007 +0200
+
+    Do not draw annotations when rendering for printing
+
+ glib/poppler-page.cc |   25 ++++++++++++++++++++++---
+ poppler/Annot.h      |    2 ++
+ 2 files changed, 24 insertions(+), 3 deletions(-)
+
+commit a4d25f79dfc1a7e4998e2e113ef92312bd4af553
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Tue Oct 16 15:24:08 2007 +0200
+
+    Detect form fields at any depth level
+
+    We were ignoring non root form fields that contain only a kids
+    dictionary.
+    See evince bug: http://bugzilla.gnome.org/show_bug.cgi?id=486957
+
+ poppler/Form.cc |    2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 03e1da99f7393fb1103643311b0b5af7b875e09c
+Author: Jeff Muizelaar <jeff@infidigm.net>
+Date:  Sat Oct 13 19:38:15 2007 -0400
+
+    Add an implementation of CairoOutputDev::startPage()
+
+    The implementation initializes fill_pattern and stroke_pattern
+    to black matching SplashOutputDev. This fixes #12504.
+
+ poppler/CairoOutputDev.cc |   9 +++++++++
+ poppler/CairoOutputDev.h  |   2 +-
+ 2 files changed, 10 insertions(+), 1 deletion(-)
+
+commit 825c942d46e0c3e254028441015c5dd8440cc734
+Author: Albert Astals Cid <tsdgeos@bluebox.localdomain>
+Date:  Fri Oct 12 13:47:09 2007 +0200
+
+    Copy the embeddef file description string correctly
+
+ poppler/Catalog.cc |   3 +--
+ 1 file changed, 1 insertion(+), 2 deletions(-)
+
+commit 5e60da78695eff44cc10dbce46ef170727f682b1
+Author: Albert Astals Cid <tsdgeos@bluebox.localdomain>
+Date:  Fri Oct 12 13:46:52 2007 +0200
+
+    Correctly delete the embedded file stream
+
+ qt4/src/poppler-embeddedfile.cc |    1 +
+ qt4/src/poppler-private.h      |    2 +-
+ 2 files changed, 2 insertions(+), 1 deletion(-)
+
+commit 1627fbbde8be01af3bdd2583f3439897a37d5215
+Author: Jeff Muizelaar <jeff@infidigm.net>
+Date:  Sat Oct 6 23:27:40 2007 -0400
+
+    Use maskWidth and maskHeight for reading from the mask image in
+    CairoOutputDev::drawMaskedImage()
+
+    Previously, drawMaskedImage() was incorrectly using the image width
+    and height which is
+    wrong when width != maskWidth or heigh != maskHeight. Fixes #12668.
+
+ poppler/CairoOutputDev.cc |   4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 3156d560c5eaf6970da422d0b09fd2e95bfe6d1d
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Fri Oct 5 11:34:01 2007 +0200
+
+    Fix a crash when Form Fields array contains references
+    to non existent objects. Fixes bug #11865
+
+ poppler/Form.cc |    9 +++++++++
+ 1 file changed, 9 insertions(+)
+
+commit f0b5e6286e94c6153c8247b5fae63a18622c48d3
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Thu Oct 4 15:22:01 2007 +0200
+
+    Do not return unknown field type for signature form fields
+
+ glib/poppler-form-field.cc |   2 ++
+ 1 file changed, 2 insertions(+)
+
+commit 498fd7fb99b01a879d07e2ad12c0b9462a8fc438
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Thu Oct 4 12:36:39 2007 +0200
+
+    Add poppler_page_render_for_printing() and
+    poppler_page_render_to_pixbuf_for_printing()
+
+    We were unconditionally passing printing=gFalse to displaySlice. With
+    these new
+    functions we can render to a pixbuf or cairo surface passing
+    printing=gTrue to
+    displaySlice.
+
+ glib/poppler-page.cc |  135
+ ++++++++++++++++++++++++++++++++++++++++----------
+ glib/poppler-page.h  |   10 ++++
+ 2 files changed, 119 insertions(+), 26 deletions(-)
+
+commit 56af69787c78c2edbb69266e86a5a5b639ca6d3e
+Author: Jeff Muizelaar <jeff@infidigm.net>
+Date:  Wed Oct 3 23:02:25 2007 -0400
+
+    Error out if we can't find a .cidToUnicode for a known character
+    collection
+
+    This situation was caused by the fixes for bug #11413. I'm not sure
+    it's the best thing to do, but it seems better.
+
+ poppler/GfxFont.cc |  19 +++++++++++++++++++
+ 1 file changed, 19 insertions(+)
+
+commit 3d0df46908379bce1d196b9dc41153b1adb5f725
+Author: Michael Wolf <maw@ximian.com>
+Date:  Wed Oct 3 19:43:55 2007 +0200
+
+    Fix compile warning
+
+ glib/test-poppler-glib.c |    2 ++
+ 1 file changed, 2 insertions(+)
+
+commit aba29e12528025c2cc71bf46e02e76ac4db2b193
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Fri Sep 28 21:01:50 2007 +0200
+
+    Add forms demo to glib poppler demo
+
+ glib/demo/Makefile.am |    2 +
+ glib/demo/forms.c     |  489
+ +++++++++++++++++++++++++++++++++++++++++++++++++
+ glib/demo/forms.h     |   31 ++++
+ glib/demo/main.c      |    8 +-
+ glib/demo/utils.c     |    1 -
+ 5 files changed, 527 insertions(+), 4 deletions(-)
+
+commit d0c0f26d2c95232c216e3daa15e98a3aff14ac27
+Merge: 59d55f7 38d5bb1
+Author: Krzysztof Kowalczyk <kkowalczyk@gmail.com>
+Date:  Tue Sep 25 03:33:52 2007 -0700
+
+    Merge branch 'master' of
+    ssh://kjk@git.freedesktop.org/git/poppler/poppler
+
+commit 38d5bb150a5fe883da1d4256463d1f796d201283
+Author: Krzysztof Kowalczyk <kkowalczyk@kjkubu.(none)>
+Date:  Tue Sep 25 16:13:51 2007 -0700
+
+    Silence deprecation warnings - annoying with msvc 2005.
+
+ makefile.vc |   2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 59d55f7371bee81c9392fa2d4174ceffaacde471
+Author: Krzysztof Kowalczyk <kkowalczyk@gmail.com>
+Date:  Tue Sep 25 01:21:19 2007 -0700
+
+    Fix misleading comment.
+
+ goo/GooTimer.h |    2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit c36d8afc984795aca0a12a94ec7668092067db82
+Author: Krzysztof Kowalczyk <kkowalczyk@gmail.com>
+Date:  Tue Sep 25 00:32:29 2007 -0700
+
+    Revert "replace extremely confusing 'a*(int)sizeof(foo)/sizeof(foo)
+    != a' which, due to type promotions, if a is int, is equivalent to
+    a < 0; fix problems revealed by the change"
+
+    This reverts commit 08bf7c1151d594d4c7d253a2c89f4f3a088ad8ec.
+
+ poppler/XRef.cc |   25 +++++++++++++++++++++----
+ 1 file changed, 21 insertions(+), 4 deletions(-)
+
+commit ff25e83abae1ca17e2e7dd6f20946026fca69fff
+Author: Krzysztof Kowalczyk <kkowalczyk@gmail.com>
+Date:  Mon Sep 24 23:57:25 2007 -0700
+
+    Make perf-test compile on unix as well.
+
+ test/Makefile.am               |   16 +++++-
+ test/perf-test-preview-dummy.cc |    1 +
+ test/perf-test.cc              |  104
+ ++++++++++++++++-----------------------
+ 3 files changed, 59 insertions(+), 62 deletions(-)
+
+commit 70f3bf42b3028d9a2e4aefdc2e1a458b3c77b0e7
+Author: Krzysztof Kowalczyk <kkowalczyk@gmail.com>
+Date:  Mon Sep 24 21:26:54 2007 -0700
+
+    Let perf-test.cc manage lifetime of rendered bitmap.
+
+ test/perf-test-preview-win.cc |    7 -------
+ 1 file changed, 7 deletions(-)
+
+commit b622b252cba068a15eae77df5deb261dd98affaf
+Author: Krzysztof Kowalczyk <kkowalczyk@gmail.com>
+Date:  Mon Sep 24 21:20:12 2007 -0700
+
+    Disable my_error for now - seems to corrupt memory.
+
+ test/perf-test.cc |   2 ++
+ 1 file changed, 2 insertions(+)
+
+commit bde8c9669ca6b43cb6a664bd14df164a718041ea
+Author: Krzysztof Kowalczyk <kkowalczyk@gmail.com>
+Date:  Mon Sep 24 21:08:58 2007 -0700
+
+    Con't copy the file unless COPY_FILE is defined.
+
+ test/perf-test.cc |   11 ++++++++++-
+ 1 file changed, 10 insertions(+), 1 deletion(-)
+
+commit bf9b46b012c64624818a2110af7c4b7e3b419728
+Author: Krzysztof Kowalczyk <kkowalczyk@gmail.com>
+Date:  Mon Sep 24 20:13:54 2007 -0700
+
+    Respect -loadonly cmd-line arg.
+
+ test/perf-test.cc |   2 ++
+ 1 file changed, 2 insertions(+)
+
+commit 2f664b654ca19135f0f8a0fe89872b9e0d526fa2
+Author: Krzysztof Kowalczyk <kkowalczyk@gmail.com>
+Date:  Mon Sep 24 19:41:45 2007 -0700
+
+    Fix msvc debug build. Fix bitmap leak in perf-test.
+
+ makefile.vc      |    6 ++++--
+ test/perf-test.cc |   1 +
+ 2 files changed, 5 insertions(+), 2 deletions(-)
+
+commit 05d41cd5aec39b4e3c8949445a9986e5ca8b50dd
+Author: Krzysztof Kowalczyk <kkowalczyk@gmail.com>
+Date:  Mon Sep 24 08:10:37 2007 -0700
+
+    Use GooTimer instead of my own timer.
+
+ test/perf-test.cc |   98
+ +++++------------------------------------------------
+ 1 file changed, 8 insertions(+), 90 deletions(-)
+
+commit 05fbce5b6657e883ece9054c79576b25271a05a4
+Author: Krzysztof Kowalczyk <kkowalczyk@gmail.com>
+Date:  Mon Sep 24 08:01:11 2007 -0700
+
+    Make GooTimer work for Windows/msvc build.
+
+ goo/GooTimer.cc |   69
+ +++++++++++++++++++++++++++++++++++++------------------
+ goo/GooTimer.h  |   28 +++++++++++++---------
+ poppler/Gfx.cc  |   11 ++-------
+ 3 files changed, 66 insertions(+), 42 deletions(-)
+
+commit 6347915085a487da08d39a859f4261fa812dab09
+Author: Krzysztof Kowalczyk <kkowalczyk@tlapx60ubu.(none)>
+Date:  Mon Sep 24 01:08:17 2007 -0700
+
+    Add Error.cc in msvc build and use setErrorFunction in perf-test.
+
+ makefile.vc      |    3 +--
+ test/perf-test.cc |   10 +++++-----
+ 2 files changed, 6 insertions(+), 7 deletions(-)
+
+commit ed01b3965c57ce2a4eabf9c46b5319ea627d3324
+Author: Krzysztof Kowalczyk <kkowalczyk@tlapx60ubu.(none)>
+Date:  Mon Sep 24 01:03:09 2007 -0700
+
+    Match declaration of setErrorFunction with its definition.
+
+    Also enable this code for Windows, since CDECL was what
+    was throwing msvc off.
+
+ poppler/Error.cc |   12 +++---------
+ 1 file changed, 3 insertions(+), 9 deletions(-)
+
+commit 71fb15f8bd131a13d8cf0f394fe601cfbb6e1772
+Author: Krzysztof Kowalczyk <kkowalczyk@tlapx60ubu.(none)>
+Date:  Mon Sep 24 00:38:29 2007 -0700
+
+    Even less compiler warnings.
+
+ poppler/CairoOutputDev.cc |   6 +++---
+ qt/poppler-page.cc       |    3 +++
+ utils/HtmlOutputDev.cc    |   10 ++++++----
+ 3 files changed, 12 insertions(+), 7 deletions(-)
+
+commit 7ba3f198a0651d2a7c91b7d9e10a5173dc3de0a3
+Author: Krzysztof Kowalczyk <kkowalczyk@tlapx60ubu.(none)>
+Date:  Mon Sep 24 00:32:37 2007 -0700
+
+    Even less compiler warnings.
+
+ qt/poppler-document.cc      |   8 ++++++++
+ qt/poppler-private.h       |    8 --------
+ qt4/src/poppler-document.cc |  10 ++++++++++
+ qt4/src/poppler-form.cc     |  15 +++++++++++++++
+ qt4/src/poppler-private.h   |  25 -------------------------
+ 5 files changed, 33 insertions(+), 33 deletions(-)
+
+commit ab1059f594cb9fccd8568ca2a535a363c7521daa
+Author: Krzysztof Kowalczyk <kkowalczyk@tlapx60ubu.(none)>
+Date:  Mon Sep 24 00:14:01 2007 -0700
+
+    Don't break aliasing.
+
+ poppler/GlobalParams.cc |   40 ++++++++++++++++++----------------------
+ 1 file changed, 18 insertions(+), 22 deletions(-)
+
+commit 71c47b30adf687a0bcece22834933267053360de
+Author: Krzysztof Kowalczyk <kkowalczyk@tlapx60ubu.(none)>
+Date:  Sun Sep 23 23:49:31 2007 -0700
+
+    Reduce compiler warnings.
+
+ poppler/JBIG2Stream.cc |   16 ++++++++++++----
+ 1 file changed, 12 insertions(+), 4 deletions(-)
+
+commit 8466d94929844c976bbad8bb7d1ea7f7f77cc196
+Author: Krzysztof Kowalczyk <kkowalczyk@tlapx60ubu.(none)>
+Date:  Sun Sep 23 23:34:52 2007 -0700
+
+    Reduce compiler warnings. Tabs to spaces.
+
+ fofi/FoFiType1C.cc |  30 +++++++++++++++---------------
+ 1 file changed, 15 insertions(+), 15 deletions(-)
+
+commit c53b8ccfba6fa4345086493f9e44212721c11d0a
+Author: Krzysztof Kowalczyk <kkowalczyk@tlapx60ubu.(none)>
+Date:  Sun Sep 23 23:23:34 2007 -0700
+
+    Reduce number of compiler warnings.
+
+ poppler/CharCodeToUnicode.cc |    2 +-
+ poppler/Gfx.cc                      |    6 ++----
+ poppler/PageLabelInfo.cc     |    2 ++
+ 3 files changed, 5 insertions(+), 5 deletions(-)
+
+commit abede2a06c5c9dc97b40479deda49621458f1171
+Author: Krzysztof Kowalczyk <kkowalczyk@tlapx60ubu.(none)>
+Date:  Sun Sep 23 23:03:36 2007 -0700
+
+    Reduce number of compiler warnings.
+
+ glib/poppler-action.cc        |    1 -
+ glib/poppler-document.cc      |    9 ++-------
+ glib/poppler-page.cc         |    3 +--
+ qt/poppler-document.cc        |    1 -
+ qt4/src/poppler-annotation.cc |   16 +++++++++++++---
+ 5 files changed, 16 insertions(+), 14 deletions(-)
+
+commit 60f5bcea4a920441e25ae11d677636242aabb2db
+Author: Krzysztof Kowalczyk <kkowalczyk@tlapx60ubu.(none)>
+Date:  Sun Sep 23 22:48:06 2007 -0700
+
+    Remove unused variables.
+
+ utils/pdftoppm.cc |   2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 3179eee44eb0afbc642675268b9a4abb16ccdde3
+Author: Krzysztof Kowalczyk <kkowalczyk@tlapx60ubu.(none)>
+Date:  Sun Sep 23 22:47:21 2007 -0700
+
+    Remove unused variables.
+
+ utils/HtmlOutputDev.cc |   23 -----------------------
+ 1 file changed, 23 deletions(-)
+
+commit e9dc379190aa3166870d0b11a05ccc4e9dad2706
+Author: Krzysztof Kowalczyk <kkowalczyk@tlapx60ubu.(none)>
+Date:  Sun Sep 23 22:41:59 2007 -0700
+
+    Remove unused variables.
+
+ poppler/ArthurOutputDev.cc |  16 +++++-----------
+ 1 file changed, 5 insertions(+), 11 deletions(-)
+
+commit 08bf7c1151d594d4c7d253a2c89f4f3a088ad8ec
+Author: Krzysztof Kowalczyk <kkowalczyk@tlapx60ubu.(none)>
+Date:  Sun Sep 23 22:28:16 2007 -0700
+
+    replace extremely confusing 'a*(int)sizeof(foo)/sizeof(foo) != a'
+    which, due to type promotions, if a is int, is equivalent to a < 0;
+    fix problems revealed by the change
+
+ poppler/XRef.cc |   25 ++++---------------------
+ 1 file changed, 4 insertions(+), 21 deletions(-)
+
+commit 5a1f670a4d16affeed86cdf643ab22f481caa3a5
+Author: Krzysztof Kowalczyk <kkowalczyk@kjkubu.(none)>
+Date:  Sun Sep 23 20:42:59 2007 -0700
+
+    ignore *.o files
+
+ .gitignore |   1 +
+ 1 file changed, 1 insertion(+)
+
+commit c156aed7234f82dea4cb384c1b8a7acdd34545be
+Author: Krzysztof Kowalczyk <kkowalczyk@kjkubu.(none)>
+Date:  Sun Sep 23 20:41:19 2007 -0700
+
+    remove unused variables
+
+ poppler/ABWOutputDev.cc |   10 ++--------
+ 1 file changed, 2 insertions(+), 8 deletions(-)
+
+commit d0bdef4752be5fa609a0766ee87aa54d51611d9a
+Author: Krzysztof Kowalczyk <kkowalczyk@kjkubu.(none)>
+Date:  Sat Sep 22 13:38:03 2007 -0700
+
+    undo accidental changes to file permissions
+
+ 0 files changed
+
+commit 6c69473f2f4a49757614ddd249e65bb7a13c63c1
+Author: Krzysztof Kowalczyk <kkowalczyk@tlapx60ubu.(none)>
+Date:  Fri Sep 21 08:09:53 2007 -0700
+
+    undo accidental mode change
+
+ 0 files changed
+
+commit e7e386e7ce8cb8eb8a7037ebdaa601524d332ae7
+Author: Krzysztof Kowalczyk <kkowalczyk@tlapx60ubu.(none)>
+Date:  Fri Sep 21 08:08:53 2007 -0700
+
+    more simplification by removing unneded code
+
+ makefile.vc      |    2 +-
+ test/perf-test.cc |   60
+ ++++++++---------------------------------------------
+ 2 files changed, 10 insertions(+), 52 deletions(-)
+
+commit 3e10604637ec193269a3155985476d3b83dc7d62
+Author: Krzysztof Kowalczyk <kkowalczyk@tlapx60ubu.(none)>
+Date:  Fri Sep 21 07:48:38 2007 -0700
+
+    for portability use bool/true/false instead of BOOL/TRUE/FALSE
+
+ test/perf-test.cc |  176
+ ++++++++++++++++++++++++++---------------------------
+ 1 file changed, 86 insertions(+), 90 deletions(-)
+
+commit 634718936f2a95fac2a9d12fcea483b3d0ca8fa6
+Author: Krzysztof Kowalczyk <kkowalczyk@tlapx60ubu.(none)>
+Date:  Fri Sep 21 07:41:14 2007 -0700
+
+    simplify perf-test
+
+ test/perf-test-pdf-engine.h   |   78
+ -----------------------------------------
+ test/perf-test-preview-win.cc |    5 ++-
+ test/perf-test.cc            |   75
+ +++++++++++++++++++++++++++++++++++++--
+ 3 files changed, 75 insertions(+), 83 deletions(-)
+
+commit 617550199762fab42ca2e202e641e047b3efbac0
+Author: Krzysztof Kowalczyk <kkowalczyk@tlapx60ubu.(none)>
+Date:  Fri Sep 21 05:20:16 2007 -0700
+
+    simplify perf-test code
+
+ test/perf-test-pdf-engine.h    |   67 +++--------------------
+ test/perf-test-preview-dummy.cc |    3 +-
+ test/perf-test-preview-win.cc  |   80 +++++++++++++++++++++++----
+ test/perf-test.cc              |  114
+ ++++-----------------------------------
+ 4 files changed, 86 insertions(+), 178 deletions(-)
+
+commit fb5bf808b88992c1772a10e4ed9fe788fb618417
+Author: Krzysztof Kowalczyk <kkowalczyk@tlapx60ubu.(none)>
+Date:  Fri Sep 21 03:03:26 2007 -0700
+
+    more msvc build fixes
+
+ makefile.vc      |    2 +-
+ test/perf-test.cc |   4 ++++
+ 2 files changed, 5 insertions(+), 1 deletion(-)
+
+commit 60829b08a7440f36014f68ec54bee7a742412738
+Author: Krzysztof Kowalczyk <kkowalczyk@tlapx60ubu.(none)>
+Date:  Fri Sep 21 03:02:34 2007 -0700
+
+    msvc build fixes
+
+ msvc/poppler/poppler-config.h |  143
+ +++++++++++++++++++++++++++++++++++++++++
+ 1 file changed, 143 insertions(+)
+
+commit 853c22a174bae81139edc9aeded7f26ae2655cef
+Author: Krzysztof Kowalczyk <kkowalczyk@tlapx60ubu.(none)>
+Date:  Thu Sep 20 23:21:35 2007 -0700
+
+    add pre-made config.h for msvc build
+
+ msvc/config.h |   62
+ +++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+ 1 file changed, 62 insertions(+)
+
+commit 31c43b118bd4372134018be6f6693f77d1f6a39b
+Author: Krzysztof Kowalczyk <kkowalczyk@tlapx60ubu.(none)>
+Date:  Thu Sep 20 22:10:09 2007 -0700
+
+    remove unused variables
+
+ poppler/CairoFontEngine.cc   |    6 ++----
+ poppler/CairoOutputDev.cc    |   14 ++------------
+ splash/SplashFTFontEngine.cc |    2 ++
+ 3 files changed, 6 insertions(+), 16 deletions(-)
+
+commit 01b99f60e36dd955817f23911ef38947360f61f7
+Author: Krzysztof Kowalczyk <kkowalczyk@tlapx60ubu.(none)>
+Date:  Thu Sep 20 21:14:17 2007 -0700
+
+    remove unused variables
+
+ poppler/GfxState.cc       |   11 ++---------
+ poppler/SplashOutputDev.cc |   9 +++------
+ poppler/TextOutputDev.cc   |   3 ---
+ 3 files changed, 5 insertions(+), 18 deletions(-)
+
+commit 7c406400532d68524a43cf963d894d3c4b269400
+Author: Krzysztof Kowalczyk <kkowalczyk@tlapx60ubu.(none)>
+Date:  Thu Sep 20 20:57:44 2007 -0700
+
+    remove unused variables
+
+ poppler/Catalog.cc |   1 -
+ poppler/Form.cc    |   5 -----
+ poppler/GfxFont.cc |   6 ++----
+ poppler/Page.cc    |   2 +-
+ splash/Splash.cc   |   5 ++++-
+ 5 files changed, 7 insertions(+), 12 deletions(-)
+
+commit 70f23389c97b1870b7311d97322cdd16b580a79d
+Author: Krzysztof Kowalczyk <kkowalczyk@tlapx60ubu.(none)>
+Date:  Thu Sep 20 20:23:59 2007 -0700
+
+    don't silence warnings about unused variables/functions to keep
+    programmers honest
+
+ configure.ac |    2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit cdb6fcf98137473efd993e1374a6f010e9db67db
+Author: Krzysztof Kowalczyk <kkowalczyk@tlapx60ubu.(none)>
+Date:  Thu Sep 20 20:00:56 2007 -0700
+
+    Remove unused variables
+
+ poppler/Annot.cc |    5 ++---
+ 1 file changed, 2 insertions(+), 3 deletions(-)
+
+commit 0e76b49ac852a5a7ebae4c1f67b153e0b7c9f905
+Author: Krzysztof Kowalczyk <kkowalczyk@tlapx60ubu.(none)>
+Date:  Tue Sep 18 01:04:50 2007 -0700
+
+    Explain how to compile on Windows using msvc makefile.
+
+ README.windows |   63
+ ++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+ 1 file changed, 63 insertions(+)
+
+commit c002b4dc75b2688ffe8a734cf3e15f5891797842
+Author: Krzysztof Kowalczyk <kkowalczyk@tlapx60ubu.(none)>
+Date:  Tue Sep 18 00:04:47 2007 -0700
+
+    Add Windows/msvc makefile.
+
+    Add native msvc windows makefile and pre-made
+    config.h for windows in msvc directory.
+
+ makefile.vc | 149
+ +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+ 1 file changed, 149 insertions(+)
+
+commit 1f33fc58201c92120c587189d2e0e819f83167da
+Author: Krzysztof Kowalczyk <kkowalczyk@tlapx60ubu.(none)>
+Date:  Mon Sep 17 23:53:02 2007 -0700
+
+    Start on a test program.
+
+    Test program can be used for regression testing and
+    performance testing. It renders a page (or pages)
+    in a given PDF (or PDFs) and records rendering times.
+    For historical reasons the code is ugly and probably
+    only compiles on windows, but it'll get better.
+
+ test/perf-test-pdf-engine.h    |  131 ++++
+ test/perf-test-preview-dummy.cc |   22 +
+ test/perf-test-preview-win.cc  |  222 ++++++
+ test/perf-test.cc              | 1428
+ +++++++++++++++++++++++++++++++++++++++
+ 4 files changed, 1803 insertions(+)
+
+commit b96db4ad27535c2666fccdfe0a3c04cc7c37792d
+Author: Jeff Muizelaar <jeff@freiheit.infidigm.net>
+Date:  Mon Sep 17 20:28:38 2007 -0400
+
+    Avoid double free caused by 302 merge
+
+    The ownership of the the string returned by getKey() changed with
+    the 302 merge
+    but this code was not updated. Found by Matthew Woehlke.
+
+ qt4/src/poppler-document.cc |   4 +---
+ 1 file changed, 1 insertion(+), 3 deletions(-)
+
+commit 2a495f19d4465e15fd2fa96656d904315c79a443
+Author: Kristian Høgsberg <krh@redhat.com>
+Date:  Mon Sep 17 16:52:45 2007 -0400
+
+    Simplify ChangeLog rule a bit.
+
+ ChangeLog.mk |   81
+ ----------------------------------------------------------
+ Makefile.am  |    7 ++---
+ 2 files changed, 4 insertions(+), 84 deletions(-)
+
+commit 7d5abbeec55e4b90b139671d96cfdf58bdab70b8
+Author: Kristian Høgsberg <krh@redhat.com>
+Date:  Mon Sep 17 15:45:26 2007 -0400
+
+    Add dist hook to generate ChangeLog.
+
+    Taken from cairo.  It still need some tweaking.
+
+ ChangeLog.mk |   81
+ ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+ Makefile.am  |    4 +++
+ configure.ac |    2 +-
+ 3 files changed, 86 insertions(+), 1 deletion(-)
+
+commit 15ad81c64cd8b1cb438d41be402daa19a239db3d
+Author: Albert Astals Cid <tsdgeos@bluebox.localdomain>
+Date:  Mon Sep 17 19:39:29 2007 +0200
+
+    Use = instead of == in qt.m4
+
+ m4/qt.m4 |    2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 70fabcb96e207b9b889bb32c0cf5ea3fc0aa08f8
+Author: Kristian Høgsberg <krh@redhat.com>
+Date:  Sun Sep 16 20:40:53 2007 -0400
+
+    Rename .cvsignore files to .gitignore and drop ChangeLog file.
+
+ .cvsignore               |   25 -
+ .gitignore               |   25 +
+ ChangeLog                | 4586
+ ---------------------------------------------
+ fofi/.cvsignore          |    8 -
+ fofi/.gitignore          |    8 +
+ glib/.cvsignore          |   11 -
+ glib/.gitignore          |   11 +
+ glib/reference/.cvsignore |   18 -
+ glib/reference/.gitignore |   18 +
+ goo/.cvsignore                   |    8 -
+ goo/.gitignore                   |    8 +
+ poppler/.cvsignore       |   10 -
+ poppler/.gitignore       |   10 +
+ qt/.cvsignore            |    7 -
+ qt/.gitignore            |    7 +
+ qt4/.cvsignore                   |    3 -
+ qt4/.gitignore                   |    3 +
+ qt4/src/.cvsignore       |    8 -
+ qt4/src/.gitignore       |    8 +
+ qt4/tests/.cvsignore     |   20 -
+ qt4/tests/.gitignore     |   20 +
+ splash/.cvsignore        |    8 -
+ splash/.gitignore        |    8 +
+ test/.cvsignore          |   11 -
+ test/.gitignore          |   11 +
+ utils/.cvsignore         |   12 -
+ utils/.gitignore         |   12 +
+ 27 files changed, 149 insertions(+), 4735 deletions(-)
+
+commit c9f9403ffc5b95ae790c3c81284c7786afe33f4d
+Author: Krzysztof Kowalczyk <kkowalczyk@gmail.com>
+Date:  Fri Sep 14 20:50:07 2007 +0000
+
+    Windows implementation for matching fonts that doesn't use fontconfig
+
+ ChangeLog                 |    6 +
+ poppler/GlobalParamsWin.cc |  285
+ ++++++++++++++++++++++++++++++++++++++++++++
+ 2 files changed, 291 insertions(+)
+
+commit d18b5361a0504458da805ed6be037c9d648f9372
+Author: Krzysztof Kowalczyk <kkowalczyk@gmail.com>
+Date:  Fri Sep 14 20:47:11 2007 +0000
+
+    Update ChangeLog for previous checkin
+
+ ChangeLog |   15 +++++++++++++++
+ 1 file changed, 15 insertions(+)
+
+commit 3330763ddca66b30d5ee60aab94d6fe0bbae9c8f
+Author: Krzysztof Kowalczyk <kkowalczyk@gmail.com>
+Date:  Fri Sep 14 06:17:35 2007 +0000
+
+    windows/msvc compilation fixes
+
+ poppler/DCTStream.h         |    2 +-
+ poppler/Error.cc            |    6 ++++++
+ poppler/FlateStream.h       |    2 +-
+ poppler/GlobalParams.cc      |   12 ++++++++++--
+ poppler/GlobalParams.h       |   17 +++++++++++++++++
+ poppler/Stream.cc           |    2 +-
+ splash/SplashFTFontEngine.cc |    2 ++
+ splash/SplashFontEngine.cc   |    2 +-
+ splash/SplashFontFile.cc     |    2 ++
+ splash/SplashFontFile.h      |    3 ++-
+ splash/SplashT1FontEngine.cc |    2 +-
+ 11 files changed, 44 insertions(+), 8 deletions(-)
+
+commit 6eb159ef34eb7e2fb8adcfc48afd84d5f50efbbd
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Mon Sep 10 17:38:05 2007 +0000
+
+           * autogen.sh: Support automake-1.10.
+           Patch by Krzysztof Kowalczyk <kkowalczyk@gmail.com>
+
+ ChangeLog  |   5 +++++
+ autogen.sh |  11 ++++++-----
+ 2 files changed, 11 insertions(+), 5 deletions(-)
+
+commit 31bbc8c727cfecc79bd8da962ad8d99a0d1d3d33
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Sat Sep 8 10:40:17 2007 +0000
+
+      * qt4/src/poppler-qt4.h:
+      * qt4/src/poppler-ps-converter.cc:
+       Add PSConverter::setOutputDevice() to set a QIODevice where
+       writing the resulting PS.
+
+ ChangeLog                      |    7 ++++++
+ qt4/src/poppler-ps-converter.cc |   51
+ ++++++++++++++++++++++++++++++++++++---
+ qt4/src/poppler-qt4.h          |    5 +++-
+ 3 files changed, 58 insertions(+), 5 deletions(-)
+
+commit b3d63d03c310f01cc5b23d00ffd2103c6891fef2
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Wed Sep 5 20:22:32 2007 +0000
+
+           * qt4/src/poppler-ps-converter.cc: Fix Right<->Left
+           interchange
+
+ ChangeLog                      |    1 +
+ qt4/src/poppler-ps-converter.cc |    4 ++--
+ 2 files changed, 3 insertions(+), 2 deletions(-)
+
+commit 64368582d5ca4e28c236f440482c96f1dd3a8897
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Wed Sep 5 18:22:52 2007 +0000
+
+           * poppler/PSOutputDev.cc: Fix printing of second parameter
+
+ ChangeLog             |    4 ++++
+ poppler/PSOutputDev.cc |    2 +-
+ 2 files changed, 5 insertions(+), 1 deletion(-)
+
+commit eaf9d06cf0d08ccdc183759e0331dc2439a6f10f
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Wed Sep 5 10:57:09 2007 +0000
+
+    2007-09-05 Carlos Garcia Campos  <carlosgc@gnome.org>
+       * glib/poppler-page.cc:
+       * glib/demo/render.c: Fix build with --disable-cairo-output.
+
+ ChangeLog           |    5 +++++
+ glib/demo/render.c   |   31 +++++++++++++++++++++++++++----
+ glib/poppler-page.cc |   22 ++++++++++++----------
+ 3 files changed, 44 insertions(+), 14 deletions(-)
+
+commit c0f488c2b0e115be3e1b7e4dc7baa38db5837498
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Tue Sep 4 22:04:52 2007 +0000
+
+    did not want to commit this
+
+ gtk-doc.make |    2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 3462851b4ea342651095f1803cd488bc3b3f5749
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Tue Sep 4 22:02:06 2007 +0000
+
+           * utils/pdftoppm.cc: Fix build on Sun Studio compiler.
+           Patch by Brian Cameron <brian.cameron@sun.com>
+
+ ChangeLog        |    5 +++++
+ gtk-doc.make     |    2 +-
+ utils/pdftoppm.cc |   2 +-
+ 3 files changed, 7 insertions(+), 2 deletions(-)
+
+commit cdf3b9062cc54d558b8dbeefb3211a920ff2cb94
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Mon Sep 3 19:23:11 2007 +0000
+
+    write news
+    fix qt4 build
+
+ NEWS               |   13 +++++++++++++
+ qt4/src/Makefile.am |   3 ++-
+ 2 files changed, 15 insertions(+), 1 deletion(-)
+
+commit c82208a44f3b09c27bc33831641e4f746dd4361f
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Mon Sep 3 18:28:44 2007 +0000
+
+           * configure.ac: Bump version to 0.6
+           * glib/Makefile.am
+           * poppler/Makefile.am
+           * qt/Makefile.am
+           * qt4/src/Makefile.am: Bump sonames
+
+ ChangeLog          |    8 ++++++++
+ configure.ac       |    2 +-
+ glib/Makefile.am    |   2 +-
+ poppler/Makefile.am |   2 +-
+ qt/Makefile.am      |   2 +-
+ qt4/src/Makefile.am |   2 +-
+ 6 files changed, 13 insertions(+), 5 deletions(-)
+
+commit 2a12409ebbf96ea3ca4556b71231a45ae37cb052
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Mon Sep 3 17:09:01 2007 +0000
+
+           * poppler/JBIG2Stream.cc:
+           * poppler/Stream.cc: Patch by Derek B. Noonburg
+           <derekn@foolabs.com>
+           to fix some errors in CCITTFaxStream and JBIG2Stream.cc
+
+ ChangeLog             |    6 ++++++
+ poppler/JBIG2Stream.cc |    7 ++++---
+ poppler/Stream.cc     |    2 +-
+ 3 files changed, 11 insertions(+), 4 deletions(-)
+
+commit 0b483e71ef02b4040b665935c1018c8b30b9c1ca
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Mon Sep 3 08:54:01 2007 +0000
+
+    2007-09-03 Carlos Garcia Campos  <carlosgc@gnome.org>
+       * gtk-doc.make:
+       * glib/poppler-document.cc:
+       * glib/poppler-form-field.cc:
+       * glib/poppler-page.cc:
+       * glib/reference/poppler-docs.sgml:
+       * glib/reference/poppler-sections.txt:
+       * glib/reference/poppler.types:
+       * glib/reference/tmpl/poppler-action.sgml:
+       * glib/reference/tmpl/poppler-attachment.sgml:
+       * glib/reference/tmpl/poppler-document.sgml:
+       * glib/reference/tmpl/poppler-enums.sgml:
+       * glib/reference/tmpl/poppler-form-field.sgml:
+       * glib/reference/tmpl/poppler-page.sgml:
+       * glib/reference/tmpl/poppler-private.sgml:
+       * glib/reference/tmpl/poppler.sgml: Update glib bindings API
+       documentation.
+
+ ChangeLog                                  |   19 ++
+ glib/poppler-document.cc                   |   10 +
+ glib/poppler-form-field.cc                 |  205 +++++++++++++++++
+ glib/poppler-page.cc                       |   12 +-
+ glib/reference/poppler-docs.sgml           |    2 +
+ glib/reference/poppler-sections.txt        |  108 ++++++++-
+ glib/reference/poppler.types               |    2 +
+ glib/reference/tmpl/poppler-action.sgml     |  36 ++-
+ glib/reference/tmpl/poppler-attachment.sgml |  65 ++++++
+ glib/reference/tmpl/poppler-document.sgml   |  50 +++++
+ glib/reference/tmpl/poppler-enums.sgml      |  60 +++++
+ glib/reference/tmpl/poppler-form-field.sgml | 315
+ +++++++++++++++++++++++++++
+ glib/reference/tmpl/poppler-page.sgml      |  236 +++++++++++++++++++-
+ glib/reference/tmpl/poppler-private.sgml    |   6 +
+ glib/reference/tmpl/poppler.sgml           |   49 +++++
+ gtk-doc.make                               |   34 +--
+ 16 files changed, 1181 insertions(+), 28 deletions(-)
+
+commit 289e3893cda45055951bb8d3b82a45644bc0b6c6
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Sun Sep 2 17:02:55 2007 +0000
+
+           * poppler/GfxState.cc: Pad zeroes instead of aborting when
+           rendering
+           1-bit images and the stream is "too short" to mimic
+           Acroread and
+           ghostscript behaviour. Patch by <darren.kenny@sun.com>. Fixes
+           #12208
+
+ ChangeLog          |    3 +++
+ poppler/GfxState.cc |   4 ++--
+ 2 files changed, 5 insertions(+), 2 deletions(-)
+
+commit 6f6c2180aca2e26ea0e3c2f21f11bc8f457c19c0
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Sun Sep 2 16:31:19 2007 +0000
+
+           * glib/demo/Makefile.am: Add
+           $(top_builddir)/poppler/libpoppler.la
+           * poppler/TextOutputDev.cc: Patch from Ed Catmur
+           <ed@catmur.co.uk> to
+           improve matching of half strings of decomposed
+           characters/ligatures.
+
+ ChangeLog               |    3 +++
+ glib/demo/Makefile.am   |    1 +
+ poppler/TextOutputDev.cc |   21 +++++++++++++--------
+ 3 files changed, 17 insertions(+), 8 deletions(-)
+
+commit be1b5a0196cdfc78f74e08a023b477cac16eb0f3
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Sun Sep 2 16:06:03 2007 +0000
+
+    poppler/PDFDoc.cc: Don't enforce %%EOF at the end of file
+
+ ChangeLog        |    4 ++++
+ poppler/PDFDoc.cc |   3 ++-
+ 2 files changed, 6 insertions(+), 1 deletion(-)
+
+commit 500a87af9240344806c18ebbd05a89f4f4c69955
+Author: Jeff Muizelaar <jeff@infidigm.net>
+Date:  Sun Sep 2 00:53:42 2007 +0000
+
+    2007-09-01 Jeff Muizelaar  <jeff@infidigm.net>
+
+       * poppler/CairoOutputDev.cc:
+       * poppler/Error.cc:
+       * poppler/Error.h: Report any cairo errors when destroying
+       the cairo
+       context.
+
+ ChangeLog                |    7 +++++++
+ poppler/CairoOutputDev.cc |   7 ++++++-
+ poppler/Error.cc         |    7 +++++++
+ poppler/Error.h          |    1 +
+ 4 files changed, 21 insertions(+), 1 deletion(-)
+
+commit 0c22556bf70ff67eb388cdcd9784603030397785
+Author: Jeff Muizelaar <jeff@infidigm.net>
+Date:  Sat Sep 1 23:38:04 2007 +0000
+
+    2007-09-01 Jeff Muizelaar  <jeff@infidigm.net>
+
+       * glib/demo/Makefile.am: Only build the demo app if the cflags
+       will be
+       appropriately set.
+
+ ChangeLog            |    5 +++++
+ glib/demo/Makefile.am |    2 ++
+ 2 files changed, 7 insertions(+)
+
+commit a23d45dd6cd8a2ac4181170a9ee924fe49a9781b
+Author: Jeff Muizelaar <jeff@infidigm.net>
+Date:  Sat Sep 1 23:00:59 2007 +0000
+
+    2007-09-01 Jeff Muizelaar  <jeff@infidigm.net>
+
+       * glib/poppler-page.cc: Add note about clipping
+
+ ChangeLog           |    4 ++++
+ glib/poppler-page.cc |    2 ++
+ 2 files changed, 6 insertions(+)
+
+commit bf489d5cebc467807f2b38f74f6a6e34a503a9ca
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Thu Aug 30 18:39:51 2007 +0000
+
+           * poppler/Form.h: Remove unused methods. Fixes 12013
+
+ ChangeLog     |    4 ++++
+ poppler/Form.h |    3 ---
+ 2 files changed, 4 insertions(+), 3 deletions(-)
+
+commit a81cc06c855385911dffa826b9e1407d6097e8c8
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Thu Aug 30 18:15:34 2007 +0000
+
+    2007-08-30 Carlos Garcia Campos  <carlosgc@gnome.org>
+       * poppler/TextOutputDev.cc:
+       * poppler/TextOutputDev.h:
+       * glib/poppler.h:
+       * glib/poppler-page.cc:
+       * glib/poppler-page.h:
+       * glib/test-poppler-glib.c: Add support for word and line
+       selections. Based on patch by Kristian Høgsberg.
+
+ ChangeLog               |   10 ++++++
+ glib/poppler-page.cc    |   81
+ ++++++++++++++++++++++++++++++++++++++++------
+ glib/poppler-page.h     |    2 ++
+ glib/poppler.h                  |    4 +--
+ glib/test-poppler-glib.c |    2 +-
+ poppler/TextOutputDev.cc |   74
+ +++++++++++++++++++++++++++++-------------
+ poppler/TextOutputDev.h  |   34 ++++++++++++++-----
+ 7 files changed, 163 insertions(+), 44 deletions(-)
+
+commit 59ddb5cc8bec54305b6d256ad9975e95ecdcb935
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Mon Aug 27 18:37:55 2007 +0000
+
+           * poppler/UnicodeTypeTable.cc: Fix error on the NFKC text
+           matching
+           routine. Fixes bug #11775. Patch by Ed Catmur
+           <ed@catmur.co.uk>
+
+ ChangeLog                  |    5 +++++
+ poppler/UnicodeTypeTable.cc |   2 +-
+ 2 files changed, 6 insertions(+), 1 deletion(-)
+
+commit a6e46ce61670679f368e66c1a98a7d5d1c960c5b
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Mon Aug 27 17:56:29 2007 +0000
+
+           * qt4/src/Doxyfile:
+           * qt4/src/Mainpage.dox:
+           * qt4/src/poppler-annotation.h:
+           * qt4/src/poppler-form.h:
+           * qt4/src/poppler-link.h:
+           * qt4/src/poppler-qt4.h:
+           A few API documentation fixes and improvements.
+
+ ChangeLog                   |   10 +++++++
+ qt4/src/Doxyfile            |   26 ++++++-----------
+ qt4/src/Mainpage.dox        |   26 ++++++++++-------
+ qt4/src/poppler-annotation.h |   34 +++++++++++++++++++++++
+ qt4/src/poppler-form.h       |   18 ++++++------
+ qt4/src/poppler-link.h       |   63
+ +++++++++++++++++++++++++++++++++++++++---
+ qt4/src/poppler-qt4.h       |   44 +++++++++++++++++++----------
+ 7 files changed, 166 insertions(+), 55 deletions(-)
+
+commit a7f8d92fba8c45d6ca83568c045d5e324158ee6b
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Mon Aug 27 17:17:14 2007 +0000
+
+       * qt4/src/poppler-link.cc:
+       * qt4/src/poppler-link.h:
+       Initialise correctly, and missing empty destructor.
+       * qt4/src/poppler-annotation.cc:
+       Don't leak the private class.
+
+ ChangeLog                    |    9 +++++++++
+ qt4/src/poppler-annotation.cc |    4 ++--
+ qt4/src/poppler-link.cc       |    8 ++++++--
+ qt4/src/poppler-link.h        |    1 +
+ 4 files changed, 18 insertions(+), 4 deletions(-)
+
+commit 2b1ef8f06879eb0b79288d57540c238ea833db24
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Sun Aug 26 21:39:22 2007 +0000
+
+    Fix bug 12121
+
+ ChangeLog              |    4 ++++
+ utils/ImageOutputDev.cc |    2 +-
+ 2 files changed, 5 insertions(+), 1 deletion(-)
+
+commit 20bcac5ee1988befb9c590a0d16cb615f0c49901
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Sun Aug 26 21:28:34 2007 +0000
+
+    forgot to cvs add
+
+ qt4/src/poppler-annotation-private.h |   49
+ ++++++++++++++++++++++++++++++++++
+ 1 file changed, 49 insertions(+)
+
+commit e48de657db0ef439457b4b5ca39b937da25d531e
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Sun Aug 26 18:11:01 2007 +0000
+
+          * qt4/src/poppler-annotation.cc:
+          * qt4/src/poppler-annotation.h:
+          Move all the private members of the *Annotation classes into
+          a common
+          shared private.
+
+ ChangeLog                    |    4 +
+ qt4/src/poppler-annotation.cc |  969
+ ++++++++++++++++++++++++++++++++++-------
+ qt4/src/poppler-annotation.h  |  277 ++++++++----
+ qt4/src/poppler-page.cc       |  249 +++++++----
+ 4 files changed, 1155 insertions(+), 344 deletions(-)
+
+commit 392f050f909b6a1250acf1971446a1849534482c
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Sun Aug 26 16:42:46 2007 +0000
+
+           * qt4/src/poppler-document.cc:
+           * qt4/src/poppler-embeddedfile.cc:
+           * qt4/src/poppler-fontinfo.cc:
+           * qt4/src/poppler-form.cc:
+           * qt4/src/poppler-form.h:
+           * qt4/src/poppler-qt4.h:
+           * qt4/src/poppler-sound.cc:
+           * qt4/src/poppler-textbox.cc:
+           API work: remove 'const' and 'const&' from return values
+           with Qt
+           classes; make the non-copiable classes really non-copiable;
+           uninline a Document::page() method; other related small
+           changes.
+           * qt4/src/poppler-link.cc:
+           * qt4/src/poppler-link.h:
+           Make LinkDestination an implicitely shared class, with all
+           the private
+           members into the private class; move all the private members
+           of the
+           Link* classes into a common shared private.
+
+ ChangeLog                      |   23 ++-
+ qt4/src/poppler-document.cc    |    7 +-
+ qt4/src/poppler-embeddedfile.cc |   12 --
+ qt4/src/poppler-fontinfo.cc    |   12 +-
+ qt4/src/poppler-form.cc        |   16 +-
+ qt4/src/poppler-form.h                 |   14 +-
+ qt4/src/poppler-link.cc        |  373
+ ++++++++++++++++++++++++++++++---------
+ qt4/src/poppler-link.h                 |   67 ++++---
+ qt4/src/poppler-qt4.h          |   32 ++--
+ qt4/src/poppler-sound.cc       |    7 -
+ qt4/src/poppler-textbox.cc     |    4 +-
+ 11 files changed, 404 insertions(+), 163 deletions(-)
+
+commit f215aca25fdd8fe287b717dde53f0be273d995e4
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Sun Aug 26 10:52:19 2007 +0000
+
+    2007-08-26 Carlos Garcia Campos  <carlosgc@gnome.org>
+       * configure.ac:
+       * glib/Makefile.am:
+       * glib/demo/Makefile.am:
+       * glib/demo/fonts.[ch]:
+       * glib/demo/info.[ch]:
+       * glib/demo/links.[ch]:
+       * glib/demo/main.c:
+       * glib/demo/outline.[ch]:
+       * glib/demo/page.[ch]:
+       * glib/demo/render.[ch]:
+       * glib/demo/utils.[ch]: Add poppler glib demo tool.
+
+ ChangeLog            |   14 ++
+ configure.ac         |    1 +
+ glib/Makefile.am      |    2 +-
+ glib/demo/Makefile.am |   26 +++
+ glib/demo/fonts.c     |  276 +++++++++++++++++++++++++++
+ glib/demo/fonts.h     |   31 +++
+ glib/demo/info.c      |  243 ++++++++++++++++++++++++
+ glib/demo/info.h      |   31 +++
+ glib/demo/links.c     |  289 ++++++++++++++++++++++++++++
+ glib/demo/links.h     |   31 +++
+ glib/demo/main.c      |  205 ++++++++++++++++++++
+ glib/demo/outline.c   |  218 ++++++++++++++++++++++
+ glib/demo/outline.h   |   31 +++
+ glib/demo/page.c      |  249 +++++++++++++++++++++++++
+ glib/demo/page.h      |   31 +++
+ glib/demo/render.c    |  498
+ +++++++++++++++++++++++++++++++++++++++++++++++++
+ glib/demo/render.h    |   31 +++
+ glib/demo/utils.c     |  234 +++++++++++++++++++++++
+ glib/demo/utils.h     |   42 +++++
+ 19 files changed, 2482 insertions(+), 1 deletion(-)
+
+commit 7c9529b70dc44bb001d21a3b47fc65916813dec1
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Thu Aug 23 20:39:31 2007 +0000
+
+    2007-08-23 Carlos Garcia Campos  <carlosgc@gnome.org>
+       * glib/poppler-page.cc: Add missing comma.
+
+ ChangeLog           |    4 ++++
+ glib/poppler-page.cc |    2 +-
+ 2 files changed, 5 insertions(+), 1 deletion(-)
+
+commit 3c4a85503261ee81a829a1683f1f5fa85d41f8ee
+Author: Jeff Muizelaar <jeff@infidigm.net>
+Date:  Thu Aug 23 20:15:46 2007 +0000
+
+    2007-08-23 Jeff Muizelaar  <jeff@infidigm.net>
+
+       * glib/poppler-page.cc: pass in -1 to displaySlice so that it
+       sets up
+       the slice size for us. This fixes the case of the wrong values
+       being
+       used when the pdf was rotated on its side.
+       Fixes #11913.
+
+ ChangeLog           |    7 +++++++
+ glib/poppler-page.cc |    5 ++---
+ 2 files changed, 9 insertions(+), 3 deletions(-)
+
+commit 3ba088d8caee3c40c2aba0cd85adcf9195ae88a3
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Wed Aug 22 21:29:32 2007 +0000
+
+           * splash/SplashBitmap.cc:
+           * splash/SplashBitmap.h:
+           * utils/pdftoppm.cc: Add the following features to pdftoppm
+             - if omitting input filename or using - for input filename
+               reads pdf from stdin
+             - if omitting output filename, prints output to stdout
+             - create image of a cropped rectangle of the pdf
+             - scale pdf to fit in a square of wanted size
+           Patch by Ilmari Heikkinen <ilmari.heikkinen@gmail.com>
+
+ ChangeLog             |   12 ++++++
+ splash/SplashBitmap.cc |   18 ++++++--
+ splash/SplashBitmap.h |    2 +
+ utils/pdftoppm.cc     |  107
+ ++++++++++++++++++++++++++++++++++++++++--------
+ 4 files changed, 119 insertions(+), 20 deletions(-)
+
+commit 567e82c13aace4f40c7a555a62a3a4d223a46d92
+Author: Jeff Muizelaar <jeff@infidigm.net>
+Date:  Wed Aug 22 19:34:02 2007 +0000
+
+    2007-08-22 Jeff Muizelaar  <jeff@infidigm.net>
+
+       * poppler/GlobalParams.cc: Fix debug spew. Patch from Matthias
+       Clasen.
+
+ ChangeLog              |    4 ++++
+ poppler/GlobalParams.cc |    1 -
+ 2 files changed, 4 insertions(+), 1 deletion(-)
+
+commit bc499987074d046baf29deafe4a29d57039c0c5e
+Author: Jeff Muizelaar <jeff@infidigm.net>
+Date:  Wed Aug 22 19:28:24 2007 +0000
+
+    2007-08-22 Jeff Muizelaar  <jeff@infidigm.net>
+
+       * poppler/CairoOutputDev.cc: Fix the computation of the padding
+       in the
+       image scaling code.
+
+ ChangeLog                |    5 +++++
+ poppler/CairoOutputDev.cc |   6 ++++--
+ 2 files changed, 9 insertions(+), 2 deletions(-)
+
+commit d9719233447cb4f85f2bf9d9ec6ef089caa21140
+Author: Jeff Muizelaar <jeff@infidigm.net>
+Date:  Sun Aug 19 16:20:21 2007 +0000
+
+    2007-08-19 Jeff Muizelaar  <jeff@infidigm.net>
+
+       * poppler/CairoOutputDev.cc: Avoid allocating the glyph array if
+       currentFont is not set in beginString. This closes a possible
+       memory leak.
+
+ ChangeLog                |    6 ++++++
+ poppler/CairoOutputDev.cc |   3 +++
+ 2 files changed, 9 insertions(+)
+
+commit 099eb56896046e020f4ef0365e1ee382f85ec1ab
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Wed Aug 15 18:52:20 2007 +0000
+
+          * poppler/JBIG2Stream.cc: Quick fix for bug #12014
+
+ ChangeLog             |    4 ++++
+ poppler/JBIG2Stream.cc |   16 +++++++++++-----
+ 2 files changed, 15 insertions(+), 5 deletions(-)
+
+commit 3b7e3645c85c7a3d341457f105835b58c935bd67
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Wed Aug 15 00:04:48 2007 +0000
+
+    RC2 is out! (0.5.91)
+
+ ChangeLog    |    1 +
+ NEWS        |   18 ++++++++++++++++++
+ configure.ac |    2 +-
+ 3 files changed, 20 insertions(+), 1 deletion(-)
+
+commit c240daefe660ac3456dc0c5f5dc82aa53ebc3313
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Tue Aug 14 23:10:37 2007 +0000
+
+    * poppler/Stream.cc: Fix CVE-2007-3387 by merging xpdf-3.02pl1.patch
+
+ ChangeLog        |    1 +
+ poppler/Stream.cc |   12 +++++-------
+ 2 files changed, 6 insertions(+), 7 deletions(-)
+
+commit 1ba884b6b98ac8d755c9adc9f23a7a68d8b17b54
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Tue Aug 14 22:47:30 2007 +0000
+
+           * configure.ac:
+           * pòppler/Makefile.am: Patch by Vincent Torri
+           <vtorri@univ-evry.fr> to
+           fix linking under MinGW
+
+ ChangeLog          |    6 ++++++
+ configure.ac       |   13 +++++++++++++
+ poppler/Makefile.am |   5 +++--
+ 3 files changed, 22 insertions(+), 2 deletions(-)
+
+commit 3c31f923fcf1aeb361910eb1e9445cc28aa5b3ca
+Author: Jeff Muizelaar <jeff@infidigm.net>
+Date:  Tue Aug 7 16:22:12 2007 +0000
+
+    2007-08-07 Jeff Muizelaar  <jeff@infidigm.net>
+
+       * poppler/CairoOutputDev.cc: Don't use the prescaleMethod
+       when we have a rotation as that case has not been tested.
+       Also make sure that scaledHeight is at least 1.
+
+ ChangeLog                |    6 ++++++
+ poppler/CairoOutputDev.cc |   7 ++++++-
+ 2 files changed, 12 insertions(+), 1 deletion(-)
+
+commit af97e5f8e0f3beeb43acde92a0788c02d9718adf
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Mon Aug 6 17:41:17 2007 +0000
+
+    2007-08-06 Carlos Garcia Campos  <carlosgc@gnome.org>
+       * poppler/Annot.cc:
+       * poppler/Annot.h:
+       * poppler/Form.cc:
+       * poppler/Form.h:
+       * poppler/Page.cc: Do not always regenerate appearance stream for
+       every form widget, but only when it's actually needed.
+
+ ChangeLog       |    9 ++++++
+ poppler/Annot.cc |   86
+ +++++++++++++++++++++++++++++++++---------------------
+ poppler/Annot.h  |    8 ++---
+ poppler/Form.cc  |   25 +++-------------
+ poppler/Form.h   |    4 ++-
+ poppler/Page.cc  |    8 ++---
+ 6 files changed, 74 insertions(+), 66 deletions(-)
+
+commit 74627e71388ca0a4c0938a472c291ef87186f370
+Author: Jeff Muizelaar <jeff@infidigm.net>
+Date:  Tue Jul 31 21:40:19 2007 +0000
+
+    2007-07-31 Jeff Muizelaar  <jeff@infidigm.net>
+
+       * poppler/GlobalParams.cc: s/GList/GooList/ some Windows code.
+
+ ChangeLog              |    4 ++++
+ poppler/GlobalParams.cc |    8 ++++----
+ 2 files changed, 8 insertions(+), 4 deletions(-)
+
+commit f421e2151345ac855b75e819e19343a90789b3bf
+Author: Jeff Muizelaar <jeff@infidigm.net>
+Date:  Tue Jul 31 16:50:06 2007 +0000
+
+    2007-07-31 Jeff Muizelaar  <jeff@infidigm.net>
+
+       * glib/poppler-document.cc:
+       * glib/poppler-document.h: Add poppler_fonts_iter_get_file_name.
+
+ ChangeLog               |    5 +++++
+ glib/poppler-document.cc |   16 ++++++++++++++++
+ glib/poppler-document.h  |    1 +
+ 3 files changed, 22 insertions(+)
+
+commit 4d57b8a12b845d5d5ac321d7a4bca980d60d429f
+Author: Jeff Muizelaar <jeff@infidigm.net>
+Date:  Tue Jul 31 16:48:35 2007 +0000
+
+    2007-07-31 Jeff Muizelaar  <jeff@infidigm.net>
+
+       * poppler/CairoOutputDev.h: Add comment about
+       CairoImageOutputDevice's
+       implementation.
+
+ ChangeLog               |    5 +++++
+ poppler/CairoOutputDev.h |    1 +
+ 2 files changed, 6 insertions(+)
+
+commit f04a67006abdb5843ab481aa1e25b51abd1b1b64
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Tue Jul 31 11:41:53 2007 +0000
+
+    2007-07-31 Carlos Garcia Campos  <carlosgc@gnome.org>
+       * poppler/Form.cc:
+       * poppler/Form.h: Fix memory leak.
+
+ ChangeLog      |    5 +++++
+ poppler/Form.cc |    9 +++++----
+ poppler/Form.h  |    4 ++--
+ 3 files changed, 12 insertions(+), 6 deletions(-)
+
+commit ee9d556a8b413160911a535a0e9089b919ca29f5
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Tue Jul 31 11:40:22 2007 +0000
+
+    2007-07-31 Carlos Garcia Campos  <carlosgc@gnome.org>
+       * poppler/CairoOutputDev.h: Empty implementation of transparency
+       groups and soft masks in CairoImageOutputDev. Fixes a crash in
+       poppler_page_get_image_mapping.
+
+ ChangeLog               |    6 ++++++
+ poppler/CairoOutputDev.h |   11 +++++++++++
+ 2 files changed, 17 insertions(+)
+
+commit e08779856c801b9968dc2d47e28e86abc1ec7110
+Author: Jeff Muizelaar <jeff@infidigm.net>
+Date:  Tue Jul 31 05:29:57 2007 +0000
+
+    2007-07-31 Jeff Muizelaar  <jeff@infidigm.net>
+
+       * poppler/GfxFont.cc: Fix the case where the Encoding is
+       "Identity"
+       and ToUnicode exists. GfxCIDFont::getCodeToGIDMap makes
+       CIDTOGID map
+       from ToUnicde map, but when encoding is Identity, it should
+       not use
+       ToUnicode map to get GID. If encoding is Identity, No CIDTOGID
+       map is
+       needed.
+       Patch by Koji Otani.
+       Fixes #11413.
+
+ ChangeLog         |   10 ++++++++++
+ poppler/GfxFont.cc |   1 +
+ 2 files changed, 11 insertions(+)
+
+commit 86fc9a6f343be920f5159e745947401227e41a37
+Author: Jeff Muizelaar <jeff@infidigm.net>
+Date:  Mon Jul 30 19:28:17 2007 +0000
+
+    2007-07-30 Jeff Muizelaar  <jeff@infidigm.net>
+
+       * poppler/CairoOutputDev.cc:
+       * poppler/CairoOutputDev.h: Prescale image masks before giving
+       them
+       to cairo to improve the quality of the scaled image. Improves
+       #5589.
+
+ ChangeLog                |    6 +
+ poppler/CairoOutputDev.cc |  300
+ +++++++++++++++++++++++++++++++++++++++++++--
+ poppler/CairoOutputDev.h  |   10 +-
+ 3 files changed, 303 insertions(+), 13 deletions(-)
+
+commit f754246e47161e9bf99887201e283c1419ade4f1
+Author: Jeff Muizelaar <jeff@infidigm.net>
+Date:  Mon Jul 30 19:07:45 2007 +0000
+
+    2007-07-30 Jeff Muizelaar  <jeff@infidigm.net>
+
+       * configure.ac: Update require cairo version to 1.4
+
+ ChangeLog    |    4 ++++
+ configure.ac |    2 +-
+ 2 files changed, 5 insertions(+), 1 deletion(-)
+
+commit bb20249ac676995725b617ef442f5feb01f78205
+Author: Jeff Muizelaar <jeff@infidigm.net>
+Date:  Mon Jul 30 18:44:41 2007 +0000
+
+    2007-07-30 Jeff Muizelaar  <jeff@infidigm.net>
+
+       * poppler/CairoOutputDev.cc:
+       * poppler/CairoOutputDev.h: Add transparency group support.
+       Fixes #7856.
+
+ ChangeLog                |    6 ++
+ poppler/CairoOutputDev.cc |  133
+ +++++++++++++++++++++++++++++++++++++++++++++
+ poppler/CairoOutputDev.h  |   21 ++++++-
+ 3 files changed, 159 insertions(+), 1 deletion(-)
+
+commit a85acecaeb0d122becbc52a385d918561e995eca
+Author: Jeff Muizelaar <jeff@infidigm.net>
+Date:  Mon Jul 30 00:22:35 2007 +0000
+
+    2007-07-29 Jeff Muizelaar  <jeff@infidigm.net>
+
+       * poppler/CairoOutputDev.cc:
+       * poppler/CairoOutputDev.h: transform the original matrix for
+       type3 fonts
+       instead of using set_matrix()
+
+ ChangeLog                |    6 ++++++
+ poppler/CairoOutputDev.cc |   20 +++++++++++++++++---
+ poppler/CairoOutputDev.h  |   1 +
+ 3 files changed, 24 insertions(+), 3 deletions(-)
+
+commit a81a082169de32d01c36c969616a5c2279f1bac7
+Author: Jeff Muizelaar <jeff@infidigm.net>
+Date:  Mon Jul 30 00:18:59 2007 +0000
+
+    2007-07-29 Jeff Muizelaar  <jeff@infidigm.net>
+
+       * glib/test-poppler-glib.c: include <time.h> to fix compilation.
+
+ ChangeLog               |    4 ++++
+ glib/test-poppler-glib.c |    1 +
+ 2 files changed, 5 insertions(+)
+
+commit 81393cb30f6287caf5195265cdc039555f2767d3
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Sat Jul 28 08:22:40 2007 +0000
+
+    2007-07-28 Carlos Garcia Campos  <carlosgc@gnome.org>
+       * poppler/Annot.cc:
+       * poppler/Annot.h:
+       * poppler/Form.cc:
+       * poppler/Form.h: Make fieldLookup static in Form and use it from
+       both Form and Annot.
+
+ ChangeLog       |    8 +++++++
+ poppler/Annot.cc |   43 ++++++++++-------------------------
+ poppler/Annot.h  |    1 -
+ poppler/Form.cc  |   66
+ ++++++++++++++++++++++++++----------------------------
+ poppler/Form.h   |    2 ++
+ 5 files changed, 54 insertions(+), 66 deletions(-)
+
+commit 81b669dcb14bf821a49c9879f8d4129075647f5f
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Sat Jul 28 08:05:11 2007 +0000
+
+    2007-07-28 Carlos Garcia Campos  <carlosgc@gnome.org>
+       * glib/poppler-page.h: Remove unneeded declarations. Fixes bug
+       #11744. Patch by Kouhei Sutou <kou@cozmixng.org>.
+
+ ChangeLog          |    5 +++++
+ glib/poppler-page.h |   2 --
+ 2 files changed, 5 insertions(+), 2 deletions(-)
+
+commit f2c4e5305009f1da770c99d3e2e3371ff37c75f3
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Fri Jul 27 09:17:40 2007 +0000
+
+    2007-07-27 Carlos Garcia Campos  <carlosgc@gnome.org>
+       * glib/poppler-document.cc:
+       * glib/poppler-document.h:
+       * glib/poppler-private.h:
+       * glib/test-poppler-glib.c: Make PopplerFontInfo GObject. Patch by
+       Kouhei Sutou <kou@cozmixng.org>.
+
+ ChangeLog               |    8 ++++++++
+ glib/poppler-document.cc |   44
+ ++++++++++++++++++++++++++++++++++++++++----
+ glib/poppler-document.h  |    6 +++++-
+ glib/poppler-private.h   |    1 +
+ glib/test-poppler-glib.c |    2 +-
+ 5 files changed, 55 insertions(+), 6 deletions(-)
+
+commit 975c7cff10d9b00359e147329ae2c7a93f8a3833
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Wed Jul 25 17:20:06 2007 +0000
+
+    micro optimization
+
+ qt4/src/poppler-page.cc |    4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 525a7f49dd95f2644870a1c59ca15124e30026b4
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Tue Jul 24 16:45:25 2007 +0000
+
+    2007-07-24 Carlos Garcia Campos  <carlosgc@gnome.org>
+       * poppler/Annot.cc:
+       * poppler/Form.cc: Several fixes in forms. Generate appearance for
+       field buttons that don't have an AP dict. Do not remove the first
+       character of the second and following lines in multiline text
+       fields. Fix a crash with pdf documents created by ooo which have
+       radio buttons. Look for some inheritable attributes in the
+       parent when needed.
+
+ ChangeLog       |   10 +++++++
+ poppler/Annot.cc |   27 ++++++++++---------
+ poppler/Form.cc  |   77
+ ++++++++++++++++++++++++++++++++++++++----------------
+ 3 files changed, 78 insertions(+), 36 deletions(-)
+
+commit 633a1cde65f86ee6577a68f4f8d36de43d14c714
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Sun Jul 15 21:03:50 2007 +0000
+
+           * utils/HtmlOutputDev.cc:
+           * utils/HtmlOutputDev.h: Create the html files in the
+           correct place,
+           not in the invocation dir. Fixes bug #11610
+
+ ChangeLog             |    6 ++++++
+ utils/HtmlOutputDev.cc |   37 ++++++++++---------------------------
+ utils/HtmlOutputDev.h |    4 ----
+ 3 files changed, 16 insertions(+), 31 deletions(-)
+
+commit ccb2d420ca8d818aa9ba1d64f08f5e94ab313a72
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Sun Jul 15 17:09:29 2007 +0000
+
+           * poppler/DCTStream.cc
+           * poppler/DCTStream.h: Implement less evil error handling. On
+           a
+           error_exit level error we don't want to actually exit the
+           program. See
+           http://bugs.kde.org/show_bug.cgi?id=147878 for a pdf with this
+           problem. libjpeg was printing "Bogus Huffman table definition"
+           and
+           exiting the program.
+           * poppler/Stream.cc: Remove bogus #warning
+
+ ChangeLog           |   10 ++++++++++
+ poppler/DCTStream.cc |   17 ++++++++++++++++-
+ poppler/DCTStream.h  |    1 +
+ poppler/Stream.cc    |    1 -
+ 4 files changed, 27 insertions(+), 2 deletions(-)
+
+commit f9d82dfd299ae23a1baf3e35e2c3cd351129c525
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Sat Jul 14 18:23:42 2007 +0000
+
+           * utils/pdftops.cc: init width/height to -1 so it is
+           calculated if not
+           specified
+
+ ChangeLog       |    5 +++++
+ utils/pdftops.cc |    4 ++--
+ 2 files changed, 7 insertions(+), 2 deletions(-)
+
+commit 1c04136e9538ccfaa2d6b968861682ca3b69ffb3
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Sat Jul 14 15:23:31 2007 +0000
+
+    2007-07-14 Pino Toscano  <pino@kde.org>
+       * glib/poppler-action.h:
+       * glib/poppler-document.h: Remove trailing comma from the last
+       item of enums.
+
+ ChangeLog              |    6 ++++++
+ glib/poppler-action.h  |    2 +-
+ glib/poppler-document.h |    8 ++++----
+ 3 files changed, 11 insertions(+), 5 deletions(-)
+
+commit b9b68cabce19a5e23911e5432ace8c13bd237391
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Sat Jul 14 15:15:57 2007 +0000
+
+    2007-07-14 Carlos Garcia Campos  <carlosgc@gnome.org>
+       * glib/poppler-form-field.cc:
+       * glib/poppler-form-field.h:
+       * glib/test-poppler-glib.c: Make is_password a property instead of
+       a text form field type, since a text field could be multiline and
+       password at the same time.
+
+ ChangeLog                 |    8 ++++++++
+ glib/poppler-form-field.cc |  10 ++++++++--
+ glib/poppler-form-field.h  |   2 +-
+ glib/test-poppler-glib.c   |   4 ++--
+ 4 files changed, 19 insertions(+), 5 deletions(-)
+
+commit 14a8361039d708661b8699b2e7c4496135021a85
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Fri Jul 13 22:18:05 2007 +0000
+
+           * fofi/FoFiTrueType.cc
+           * fofi/FoFiTrueType.h
+           * poppler/CairoFontEngine.cc
+           * poppler/CharCodeToUnicode.cc
+           * poppler/CharCodeToUnicode.h
+           * poppler/GfxFont.cc
+           * poppler/GfxFont.h
+           * poppler/SplashOutputDev.cc: Patch by
+           Koji Otani <sho@bbr.jp> to fix several problems with
+           Japanese fonts.
+           Fixes bug 11413
+
+ ChangeLog                   |   13 ++
+ fofi/FoFiTrueType.cc        |  305
+ ++++++++++++++++++++++++++++++++++++++++++
+ fofi/FoFiTrueType.h         |   12 ++
+ poppler/CairoFontEngine.cc   |   47 ++-----
+ poppler/CharCodeToUnicode.cc |   16 +++
+ poppler/CharCodeToUnicode.h  |    1 +
+ poppler/GfxFont.cc          |  230 +++++++++++++++++++++++++++----
+ poppler/GfxFont.h           |    2 +
+ poppler/SplashOutputDev.cc   |   53 ++------
+ 9 files changed, 577 insertions(+), 102 deletions(-)
+
+commit 8389099d8e8940e3f8920b14a83075d69bcd8e6c
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Fri Jul 13 18:21:02 2007 +0000
+
+           * poppler/FontInfo.cc: Fix the FontInfoScanner::scan method to
+           actually scan the number of requested pages
+
+ ChangeLog          |    6 ++++++
+ poppler/FontInfo.cc |  12 ++++++------
+ 2 files changed, 12 insertions(+), 6 deletions(-)
+
+commit 9ced4442372d08375e0ded62f79052d8a3ec9cd6
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Fri Jul 13 18:08:44 2007 +0000
+
+           * poppler/GlobalParams.cc: Remove dead unused code from
+           Win32 ifdef
+
+ ChangeLog              |    4 ++++
+ poppler/GlobalParams.cc |    6 ------
+ 2 files changed, 4 insertions(+), 6 deletions(-)
+
+commit fb89fdb8de608ff94082e16819f042cddabf2bcc
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Wed Jul 11 18:52:12 2007 +0000
+
+           * poppler/PSOutputDev.cc
+           * poppler/PSOutputDev.h
+           * utils/pdftohtml.cc: Fix bug 9746. pdftohtml complex mode
+           had text
+           twice
+
+ ChangeLog             |    7 +++++++
+ poppler/PSOutputDev.cc |    5 +++++
+ poppler/PSOutputDev.h |    2 ++
+ utils/pdftohtml.cc    |    3 +--
+ 4 files changed, 15 insertions(+), 2 deletions(-)
+
+commit 0c9fa59bf5edf3cfcca1792da51b904a7c7f7615
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Wed Jul 11 18:30:19 2007 +0000
+
+    2007-07-11 Carlos Garcia Campos  <carlosgc@gnome.org>
+       * poppler/Form.cc:
+       * poppler/XRef.cc:
+       * poppler/XRef.h: Fix memory leak.
+
+ ChangeLog      |    6 ++++++
+ poppler/Form.cc |   49 ++++++++++++++++++++++++-------------------------
+ poppler/XRef.cc |   22 ++++++++++------------
+ poppler/XRef.h  |    2 +-
+ 4 files changed, 41 insertions(+), 38 deletions(-)
+
+commit 4ae7d43bd54c5b3e2f08c48441f741d3099e228f
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Wed Jul 11 18:12:26 2007 +0000
+
+           * goo/GooVector.h: Rename guard from _VECTOR_H to GOO_VECTOR_H
+           * goo/gfile.cc: GString -> GooString in Windows code
+           * poppler/GlobalParams.cc: GString -> GooString in Windows
+           code
+           * splash/SplashT1FontEngine.cc
+           * splash/SplashT1FontEngine.h
+           * splash/SplashT1FontFile.cc
+           * splash/SplashT1FontFile.h: T1 code is not supported,
+           but at least
+           make it compile :-D
+
+ ChangeLog                   |   11 +++++++++++
+ goo/GooVector.h             |    4 ++--
+ goo/gfile.cc                |    6 +++---
+ poppler/GlobalParams.cc      |   26 +++++++++++++-------------
+ splash/SplashFontEngine.cc   |    2 +-
+ splash/SplashT1FontEngine.cc |    8 ++++----
+ splash/SplashT1FontEngine.h  |    7 +++----
+ splash/SplashT1FontFile.cc   |    8 +++++---
+ splash/SplashT1FontFile.h    |    4 ++--
+ 9 files changed, 44 insertions(+), 32 deletions(-)
+
+commit 7bd125ce96c603fd5cf42d7c6a29b542e82dd4ec
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Wed Jul 11 18:08:07 2007 +0000
+
+    2007-07-11 Carlos Garcia Campos  <carlosgc@gnome.org>
+       * poppler/Form.cc:
+       * poppler/Form.h:
+       * glib/poppler-form-field.cc:
+       * glib/poppler-form-field.h:
+       * glib/test-poppler-glib.c: Add a method to get the max length
+       allowed in text form fields.
+
+ ChangeLog                 |    9 +++++++++
+ glib/poppler-form-field.cc |   8 ++++++++
+ glib/poppler-form-field.h  |   1 +
+ glib/test-poppler-glib.c   |   1 +
+ poppler/Form.cc           |   11 +++++++++++
+ poppler/Form.h                    |    4 ++++
+ 6 files changed, 34 insertions(+)
+
+commit 8a68855735e9d295d71685e82de39204d639ea7a
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Mon Jul 9 08:52:58 2007 +0000
+
+    2007-07-09 Carlos Garcia Campos  <carlosgc@gnome.org>
+       * poppler/Annot.cc:
+       * poppler/Annot.h: Render '*' instead of the actual content in
+       password form fields. Patch by Julien Rebetez <julien@fhtagn.net>
+
+ ChangeLog       |    6 ++++++
+ poppler/Annot.cc |   52
+ +++++++++++++++++++++++++++++-----------------------
+ poppler/Annot.h  |    5 +++--
+ 3 files changed, 38 insertions(+), 25 deletions(-)
+
+commit 53cf7d7084dc03a28239f11c94f2095bb02d6108
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Sat Jul 7 16:23:56 2007 +0000
+
+    2007-07-07 Carlos Garcia Campos  <carlosgc@gnome.org>
+       * poppler/Form.cc:
+       * poppler/Form.h:
+       * glib/poppler-form-field.cc:
+       * glib/poppler-form-field.h:
+       * glib/test-poppler-glib.c: Add a method to get the type of a Form
+       Field Button.
+
+ ChangeLog                 |    9 +++++++++
+ glib/poppler-form-field.cc |  18 ++++++++++++++++++
+ glib/poppler-form-field.h  |   8 ++++++++
+ glib/test-poppler-glib.c   |  26 +++++++++++++++++++++++---
+ poppler/Form.cc           |    5 +++++
+ poppler/Form.h                    |    2 ++
+ 6 files changed, 65 insertions(+), 3 deletions(-)
+
+commit de0a40181e5832a0dc263d40ed0a269867764623
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Sat Jul 7 15:28:29 2007 +0000
+
+    2007-07-07 Carlos Garcia Campos  <carlosgc@gnome.org>
+       * poppler/Form.cc: Fix a crash when setting state on buttons that
+       don't have state.
+
+ ChangeLog      |    5 +++++
+ poppler/Form.cc |    3 +++
+ 2 files changed, 8 insertions(+)
+
+commit a33518a3283ff25aa5517bc535ddb61383b1cfdc
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Fri Jul 6 09:08:44 2007 +0000
+
+           * poppler/Form.cc: Fix a bug with FormField's destructor
+           which was not
+           checking if the FormField is terminal to determine wether
+           it needs to
+           delete children or widgets. Patch by
+           Julien Rebetez <julien@fhtagn.net>
+
+ ChangeLog      |    4 ++++
+ poppler/Form.cc |   17 +++++++++++------
+ 2 files changed, 15 insertions(+), 6 deletions(-)
+
+commit 43f0d5b9bb198cdcbc2f7111f294c6f947105314
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Fri Jul 6 08:47:11 2007 +0000
+
+           * goo/GooString.cc:
+           * poppler/ABWOutputDev.cc: Build on Sun Force compiler,
+           patch by
+           Darren Kenny <darren.kenny@sun.com>
+
+ ChangeLog              |    6 ++++++
+ goo/GooString.cc       |    2 +-
+ poppler/ABWOutputDev.cc |    4 +++-
+ 3 files changed, 10 insertions(+), 2 deletions(-)
+
+commit 4e7405071b69889362e4d49de3f881f0e3e261e3
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Thu Jul 5 13:04:01 2007 +0000
+
+    2007-07-05 Carlos Garcia Campos  <carlosgc@gnome.org>
+       * glib/poppler-form-field.cc: Allow to set NULL in form fields
+       that can contain text.
+
+ ChangeLog                 |    5 +++++
+ glib/poppler-form-field.cc |  30 ++++++++++++------------------
+ 2 files changed, 17 insertions(+), 18 deletions(-)
+
+commit 625510797c528257527003477fe28adbacfe80e7
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Thu Jul 5 08:13:51 2007 +0000
+
+    2007-07-05 Carlos Garcia Campos  <carlosgc@gnome.org>
+       * glib/poppler-attachment.cc:
+       * glib/poppler-attachment.h:
+       * glib/test-poppler-glib.c: Rename cdate and mdate again to ctime
+       and mtime, since they are public attributes and we don't want to
+       break the API.
+
+ ChangeLog                 |    8 ++++++++
+ glib/poppler-attachment.cc |   4 ++--
+ glib/poppler-attachment.h  |   4 ++--
+ glib/test-poppler-glib.c   |   4 ++--
+ 4 files changed, 14 insertions(+), 6 deletions(-)
+
+commit 9b2640f156f24b07c797d9461f84e64d550efa1a
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Wed Jul 4 13:57:31 2007 +0000
+
+           * qt4/src/poppler-form.cc: QStringToGooString ->
+           QStringToUnicodeGooString has FormWidgetText::setContent
+           wants to have
+           the unicode formated string
+           * qt4/src/poppler-private.h: create QStringToUnicodeGooString
+
+ ChangeLog                |    7 +++++++
+ qt4/src/poppler-form.cc   |   2 +-
+ qt4/src/poppler-private.h |   15 +++++++++++++++
+ 3 files changed, 23 insertions(+), 1 deletion(-)
+
+commit b70115cf979b29f75c644518ae0e9c0dd9892ebf
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Wed Jul 4 13:06:38 2007 +0000
+
+    2007-07-04 Carlos Garcia Campos  <carlosgc@gnome.org>
+       * glib/poppler-form-field.cc: Convert strings from UTF8 to UTF16BE
+       before setting them.
+
+ ChangeLog                 |    5 +++++
+ glib/poppler-form-field.cc |  34 ++++++++++++++++++++++++----------
+ 2 files changed, 29 insertions(+), 10 deletions(-)
+
+commit d37843877a6f93a9f27502d07ad82cba79e9aa73
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Wed Jul 4 08:26:52 2007 +0000
+
+    2007-07-04 Carlos Garcia Campos  <carlosgc@gnome.org>
+       * glib/poppler-attachment.cc:
+       * glib/poppler-attachment.h: Add size, creation and modification
+       date and checksum properties to attachments. Fix memory leaks.
+       * glib/test-poppler-glib.c:
+       * glib/poppler.h:
+       * glib/poppler-private.h:
+       * glib/poppler-document.cc: Add a function to convert a pdf date
+       into a GTime that is used by attachments and document
+       properties. Fix memory leak in attachments.
+
+ ChangeLog                 |   12 ++++
+ glib/poppler-attachment.cc |  25 +++++++-
+ glib/poppler-attachment.h  |  16 ++---
+ glib/poppler-document.cc   |  142
+ +++++++++++++++++++++++---------------------
+ glib/poppler-private.h     |   6 +-
+ glib/poppler.h                    |    1 +
+ glib/test-poppler-glib.c   |  56 ++++++++++++++---
+ 7 files changed, 171 insertions(+), 87 deletions(-)
+
+commit d933f47d4af0992059148259a189373b42499bbe
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Tue Jul 3 20:31:20 2007 +0000
+
+           * qt4/tests/poppler-fonts.cpp: For the sake of completeness,
+           add all
+           the enums
+
+ ChangeLog                  |    2 ++
+ qt4/tests/poppler-fonts.cpp |  28 ++++++++++++++++++++--------
+ 2 files changed, 22 insertions(+), 8 deletions(-)
+
+commit d90b166cfbdc4857351baa627d158d5e0b6652b4
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Tue Jul 3 16:46:51 2007 +0000
+
+           * poppler/Catalog.cc: Fix crash,
+           embeddedFileNameTree.getName(i)
+           returns a reference to its own data so does not have to
+           be deleted
+           * qt4/tests/poppler-attachments.cpp: Delete the doc, just
+           for sake of
+           correctness
+
+ ChangeLog                        |    7 +++++++
+ poppler/Catalog.cc               |    1 -
+ qt4/tests/poppler-attachments.cpp |   1 +
+ 3 files changed, 8 insertions(+), 1 deletion(-)
+
+commit 7fa87eb2b093770271bc3a72de5b0b9dc228aa1b
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Tue Jul 3 14:01:40 2007 +0000
+
+    2007-07-03 Carlos Garcia Campos  <carlosgc@gnome.org>
+       * glib/poppler-form-field.cc:
+       * glib/poppler-form-field.h:
+       * glib/test-poppler-glib.c: Add choice_commit_on_change function
+       to glib bindings.
+
+ ChangeLog                 |    7 +++++++
+ glib/poppler-form-field.cc |   8 ++++++++
+ glib/poppler-form-field.h  |   1 +
+ glib/test-poppler-glib.c   |   2 ++
+ 4 files changed, 18 insertions(+)
+
+commit 8b67e0403f6eaab6770cc0b7861074ae0b6d85bb
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Tue Jul 3 13:49:18 2007 +0000
+
+    2007-07-03 Carlos Garcia Campos  <carlosgc@gnome.org>
+       * glib/poppler-form-field.cc:
+       * glib/poppler-form-field.h:
+       * glib/test-poppler-glib.c: Fix a typo.
+
+ ChangeLog                 |    6 ++++++
+ glib/poppler-form-field.cc |   2 +-
+ glib/poppler-form-field.h  |   2 +-
+ glib/test-poppler-glib.c   |   2 +-
+ 4 files changed, 9 insertions(+), 3 deletions(-)
+
+commit 33a5765eb404a4b321b09c26af74c1ed64a5d474
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Tue Jul 3 13:22:54 2007 +0000
+
+           * poppler/Catalog.cc:
+           * poppler/Catalog.h: Add size and checksum properties to
+           the embeded
+           files
+           * qt4/src/poppler-embeddedfile.cc:
+           * qt4/src/poppler-qt4.h: Add size and checksum properties
+           to the qt4
+           frontend
+
+ ChangeLog                      |    9 +++++++++
+ poppler/Catalog.cc             |   19 ++++++++++++++++---
+ poppler/Catalog.h              |   13 +++++++++++--
+ qt4/src/poppler-embeddedfile.cc |   16 ++++++++++++++++
+ qt4/src/poppler-qt4.h          |   14 ++++++++++++++
+ 5 files changed, 66 insertions(+), 5 deletions(-)
+
+commit c7d21f9354bbe090cce6459124dcaadf1e46639e
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Mon Jul 2 13:39:32 2007 +0000
+
+    2007-07-02 Carlos Garcia Campos  <carlosgc@gnome.org>
+       * glib/poppler-form-field.cc:
+       * glib/poppler-form-field.h:
+       * glib/test-poppler-glib.c:
+       Use FILE_SELECT instead of FILESELECT and fix a typo. Patch by
+       Kouhei Sutou
+
+ ChangeLog                 |    9 +++++++++
+ glib/poppler-form-field.cc |   2 +-
+ glib/poppler-form-field.h  |   2 +-
+ glib/test-poppler-glib.c   |   2 +-
+ 4 files changed, 12 insertions(+), 3 deletions(-)
+
+commit 5e301064c62c6d58f488839d7bf804af912a3de1
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Mon Jul 2 13:34:26 2007 +0000
+
+    2007-07-02 Carlos Garcia Campos  <carlosgc@gnome.org>
+       * glib/poppler-form-field.cc:
+       * glib/poppler-form-field.h:
+       * glib/test-poppler-glib.c:
+       Add poppler_form_field_is_read_only to glib bindings. Patch by
+       Kouhei Sutou
+
+ ChangeLog                 |    9 +++++++++
+ glib/poppler-form-field.cc |   8 ++++++++
+ glib/poppler-form-field.h  |   1 +
+ glib/test-poppler-glib.c   |   6 +++++-
+ 4 files changed, 23 insertions(+), 1 deletion(-)
+
+commit 11875746ce28e8999bcad46167fcfea131cd267a
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Sat Jun 30 08:33:30 2007 +0000
+
+    2007-06-30 Carlos Garcia Campos  <carlosgc@gnome.org>
+       * glib/poppler-page.cc: Use poppler_page_transition_get_type
+       instead of poppler_page_transition which doesn't exist. Patch by
+       Kouhei Sutou
+
+ ChangeLog           |    6 ++++++
+ glib/poppler-page.cc |    2 +-
+ 2 files changed, 7 insertions(+), 1 deletion(-)
+
+commit 0a5acaae3b9bfcd731bc4e072f35f9433aa773da
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Sat Jun 30 08:25:15 2007 +0000
+
+    2007-06-30 Carlos Garcia Campos  <carlosgc@gnome.org>
+       * glib/Makefile.am:
+       * glib/poppler-form-field.cc:
+       * glib/poppler-form-field.h:
+       * glib/poppler-document.cc:
+       * glib/poppler-document.h:
+       * glib/poppler-page.cc:
+       * glib/poppler-page.h:
+       * glib/poppler-private.h:
+       * glib/poppler.h:
+       * glib/test-poppler-glib.c: Improve forms API in the glib bindings
+       in order to make it more consistent with the current API and
+       easier to use.
+
+ ChangeLog                 |   15 +++
+ glib/Makefile.am          |    2 +
+ glib/poppler-document.cc   |  197 ++-------------------------
+ glib/poppler-document.h    |  55 +-------
+ glib/poppler-form-field.cc |  316
+ ++++++++++++++++++++++++++++++++++++++++++++
+ glib/poppler-form-field.h  |  96 ++++++++++++++
+ glib/poppler-page.cc      |  210 ++++++++++++-----------------
+ glib/poppler-page.h       |   55 ++------
+ glib/poppler-private.h     |  11 +-
+ glib/poppler.h                    |   40 +++---
+ glib/test-poppler-glib.c   |  119 ++++++++++++++---
+ 11 files changed, 662 insertions(+), 454 deletions(-)
+
+commit 2212874e57a6eb9db733b2e9a98f0cfcb88a8fc1
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Tue Jun 26 21:31:07 2007 +0000
+
+           * poppler/Form.cc: Don't crash on documents with AcroForm
+           but no
+           AcroForm->Fields (it's mandatory but...)
+
+ ChangeLog      |    5 +++++
+ poppler/Form.cc |   54
+ +++++++++++++++++++++++++++++-------------------------
+ 2 files changed, 34 insertions(+), 25 deletions(-)
+
+commit e48ee9c4af6bf98b6988c51dcab9ee9ef6e3cafe
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Sat Jun 23 18:06:07 2007 +0000
+
+    2007-06-23 Carlos Garcia Campos  <carlosgc@gnome.org>
+       * poppler/Annot.cc:
+       * poppler/Form.cc: Fix memory leaks.
+
+ ChangeLog       |    5 +++++
+ poppler/Annot.cc |    2 +-
+ poppler/Form.cc  |   13 +++++++++----
+ 3 files changed, 15 insertions(+), 5 deletions(-)
+
+commit d874a2753e3ac51b6f539dfdf980435c8c381b4f
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Wed Jun 20 20:07:15 2007 +0000
+
+       * qt4/src/poppler-qt4.h:
+       * qt4/src/poppler-document.cc: Allow access to a document's
+       metadata contents
+       from the qt4 binding. Based on patch by Jason Kivlighn
+       * qt4/tests/test-poppler-qt4.cpp: Print metadata if it exists
+
+ ChangeLog                     |    5 +++++
+ qt4/src/poppler-document.cc   |   13 +++++++++++++
+ qt4/src/poppler-qt4.h         |    5 +++++
+ qt4/tests/test-poppler-qt4.cpp |    1 +
+ 4 files changed, 24 insertions(+)
+
+commit 08d4c437e735ac50a340c4ae17ee0eeccd00dc20
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Wed Jun 20 18:40:03 2007 +0000
+
+          * glib/poppler-document.cc: Allow access to a document's
+          metadata stream
+          through the glib binding. Patch by Jason Kivlighn
+          <jkivlighn@gmail.com> Approved by Carlos
+
+ ChangeLog               |    6 ++++++
+ glib/poppler-document.cc |   21 +++++++++++++++++++++
+ 2 files changed, 27 insertions(+)
+
+commit cdd2a49dc99aa16ded674c58dbb50298f06cf18a
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Fri Jun 15 18:15:53 2007 +0000
+
+           * poppler/ABWOutputDev.cc: Replaces the getBiggestSeperator
+           function
+           at the ABWoutputdev with one that is easier to read/debug
+           and less likely to contain bugs. Some cosmetic fixes at the
+           functions recursiveXYC and splitnodes. Patch by
+           Jauco Noordzij <jauco.noordzij@gmail.com>. More info at
+           bug #11273
+
+ ChangeLog              |    8 +
+ poppler/ABWOutputDev.cc |  384
+ ++++++++++++-----------------------------------
+ 2 files changed, 106 insertions(+), 286 deletions(-)
+
+commit 7f23383197b0e2fa24be7b4925ea6f39eb95bbc1
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Wed Jun 13 20:39:21 2007 +0000
+
+           * poppler/ABWOutputDev.cc
+           * poppler/ABWOutputDev.h: Remove dependency on debugxml. Patch
+           by
+           Jauco Noordzij <jauco.noordzij@gmail.com>. Fixes bug #11187
+
+ ChangeLog              |    6 ++++
+ poppler/ABWOutputDev.cc |   80
+ ++++++++++++++++++++++++++++++++++++++++++++++-
+ poppler/ABWOutputDev.h  |    1 +
+ 3 files changed, 86 insertions(+), 1 deletion(-)
+
+commit 948520cd529ce47d1970aae6a0b8058128e37c30
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Wed Jun 13 18:50:40 2007 +0000
+
+           * goo/FixedPoint.h
+           * goo/gmem.h
+           * poppler/SecurityHandler.h
+           * poppler/poppler-config.h.in
+           * utils/ImageOutputDev.h:
+           Patch by Axel Howind <Axel.Howind@htp-tel.de>
+           - include USE_EXCEPTIONS and USE_FIXEDPOINT in
+           poppler-config.h.in
+           - fix typo (MULTITHREADED/MULTITHREADING) in
+           poppler.config.h.in
+           - change installed headers to include poppler-config.h
+           instead of
+           config.h
+           - use <poppler/poppler-config.h> instead of <poppler-config.h>
+           so that
+           installed headers can be used without including
+           .../include/poppler
+           in the include path
+
+ ChangeLog                  |   16 ++++++++++++++++
+ goo/FixedPoint.h           |    2 +-
+ goo/gmem.h                 |    2 +-
+ poppler/SecurityHandler.h   |   2 +-
+ poppler/poppler-config.h.in |  12 +++++++++++-
+ utils/ImageOutputDev.h      |   2 +-
+ 6 files changed, 31 insertions(+), 5 deletions(-)
+
+commit 825461e47b05595805e87a0d2960b07197c8da8b
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Wed Jun 13 18:24:56 2007 +0000
+
+    configure.ac: Fix detection of glib
+
+ ChangeLog    |    4 ++++
+ configure.ac |    2 +-
+ 2 files changed, 5 insertions(+), 1 deletion(-)
+
+commit a67a93fc6b4812a4f892b311c5b299e59283cd47
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Mon Jun 11 21:14:22 2007 +0000
+
+           * poppler/CMap.h:
+           * poppler/CharCodeToUnicode.h:
+           * poppler/GlobalParams.h:
+           * poppler/PageLabelInfo.h:
+           * poppler/UnicodeMap.h: Further include cleanup. Patch by
+           Axel Howind
+           on bug #11228
+
+ ChangeLog                  |    9 +++++++++
+ poppler/CMap.h                     |    2 +-
+ poppler/CharCodeToUnicode.h |   2 +-
+ poppler/GlobalParams.h      |   2 +-
+ poppler/PageLabelInfo.h     |   6 +++---
+ poppler/UnicodeMap.h       |    2 +-
+ 6 files changed, 16 insertions(+), 7 deletions(-)
+
+commit 051b31af053cac4727718169b79b25451a4bdd95
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Mon Jun 11 21:11:05 2007 +0000
+
+          * qt/poppler-qt.h
+          * qt4/src/poppler-qt4.h: Headers cleanup
+
+ ChangeLog            |    5 +++++
+ qt/poppler-qt.h       |    6 +++---
+ qt4/src/poppler-qt4.h |    8 ++++----
+ 3 files changed, 12 insertions(+), 7 deletions(-)
+
+commit 3e1597b80fc6750f1ec3269f9819aa8225879524
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Fri Jun 8 22:39:23 2007 +0000
+
+    poppler/Annot.cc: Fix leak
+
+ ChangeLog       |    4 ++++
+ poppler/Annot.cc |    1 +
+ 2 files changed, 5 insertions(+)
+
+commit 49535c20b4f71d1c1381134233e2e1449cf560c0
+Author: Jeff Muizelaar <jeff@infidigm.net>
+Date:  Thu Jun 7 21:23:03 2007 +0000
+
+    2007-06-07 Jeff Muizelaar  <jeff@infidigm.net>
+
+       * poppler/ABWOutputDev.cc: Change "and", "or", "not" to "&&",
+       "||",
+       "!" for consistency with the rest of the code. Patch by Jens
+       Granseuer
+
+ ChangeLog              |    5 +++
+ poppler/ABWOutputDev.cc |   93
+ ++++++++++++++++++++++++-----------------------
+ 2 files changed, 52 insertions(+), 46 deletions(-)
+
+commit dd8fa975bf51dd18120369d0ef2d8f1781e04d93
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Sat Jun 2 09:18:11 2007 +0000
+
+    correct form of patch 11102
+
+ utils/HtmlFonts.cc |   5 ++++-
+ 1 file changed, 4 insertions(+), 1 deletion(-)
+
+commit cdf70857ece0748f13b11c923ccf9626094555b4
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Fri Jun 1 18:34:48 2007 +0000
+
+           * poppler/ArthurOutputDev.cc
+           * splash/SplashFTFont.cc
+           * splash/SplashMath.h: Make it compile with
+           --enable-fixedpoint. Fixes
+           bug 11110
+
+ ChangeLog                 |    7 +++++++
+ poppler/ArthurOutputDev.cc |   8 ++++----
+ splash/SplashFTFont.cc     |   8 ++++----
+ splash/SplashMath.h       |    2 +-
+ 4 files changed, 16 insertions(+), 9 deletions(-)
+
+commit 90b1a404629a884cc32737a3a729c9a75f7a59c1
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Wed May 30 18:33:24 2007 +0000
+
+           * configure.ac: Fix to check for glib-2.0 not glib that is
+           1.0. Patch
+           came though Pardus developers and they don't remember where
+           they got
+           it from.
+
+ ChangeLog    |    6 ++++++
+ configure.ac |    2 +-
+ 2 files changed, 7 insertions(+), 1 deletion(-)
+
+commit 03d766ea1ddd4ce6d938f96b53906a7dc8bd179a
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Wed May 30 18:29:57 2007 +0000
+
+    make dist needs this
+
+ qt4/src/Makefile.am |   2 ++
+ 1 file changed, 2 insertions(+)
+
+commit d540c04268047fdd125ad932ca05c7553a97c0fe
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Wed May 30 17:50:00 2007 +0000
+
+          * utils/HtmlFonts.cc: Make pdftohtml not pollute stdout. Patch
+          by
+           Nanning Buitenhuis <nanning@elvenkind.com>
+
+    And some changes in glib/reference/tmpl
+
+ ChangeLog                                |    5 +
+ glib/reference/tmpl/poppler-document.sgml |   4 +
+ glib/reference/tmpl/poppler-enums.sgml    |  150
+ +++++++++++++++++++++++++++++
+ glib/reference/tmpl/poppler-page.sgml    |    5 +-
+ glib/reference/tmpl/poppler-unused.sgml   |  130
+ -------------------------
+ utils/HtmlFonts.cc                       |    2 +-
+ 6 files changed, 162 insertions(+), 134 deletions(-)
+
+commit ce414f2a36f4d97a3bddfd42baabdc1e34bf9321
+Author: Kristian Høgsberg <krh@redhat.com>
+Date:  Tue May 29 22:01:58 2007 +0000
+
+    2007-05-29 Kristian Høgsberg  <krh@redhat.com>
+
+       * poppler/gen-unicode-tables.py: Add this script to fix distcheck.
+
+ ChangeLog                    |    4 ++++
+ poppler/gen-unicode-tables.py |   38
+ ++++++++++++++++++++++++++++++++++++++
+ 2 files changed, 42 insertions(+)
+
+commit 97e602752b05f3690acb1821bdca31c5771361e1
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Sun May 27 11:24:40 2007 +0000
+
+    2007-05-27 Carlos Garcia Campos <carlosgc@gnome.org>
+       * glib/test-poppler-glib.c: Add forms test
+       * glib/poppler-page.cc:
+       * glib/poppler-page.h:
+       Fix indentation, some code cleanups and memory leaks.
+
+ ChangeLog               |    7 ++
+ glib/poppler-page.cc    |  198
+ ++++++++++++++++++++++++++++------------------
+ glib/poppler-page.h     |    6 +-
+ glib/test-poppler-glib.c |   39 +++++++++
+ 4 files changed, 168 insertions(+), 82 deletions(-)
+
+commit 3d31c2b1ea913fc80211f1c6fed9b3666f124049
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Sun May 27 10:12:56 2007 +0000
+
+    2007-05-27 Carlos Garcia Campos <carlosgc@gnome.org>
+       * glib/poppler-page.cc:
+       * glib/poppler-page.h:
+       Add missing image mapping type definition.
+
+ ChangeLog           |    6 ++++++
+ glib/poppler-page.cc |   48
+ +++++++++++++++++++++++++++++++++++++++++++++---
+ glib/poppler-page.h  |    5 +++++
+ 3 files changed, 56 insertions(+), 3 deletions(-)
+
+commit 8284a769568322066a9d4626bd9b2cf3d18a6487
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Sat May 26 23:20:12 2007 +0000
+
+           * configure.ac:
+           * NEWS: Bump release to 0.5.9 (0.6 Release Candidate)
+
+ ChangeLog    |    2 ++
+ NEWS        |   15 +++++++++++++++
+ configure.ac |    2 +-
+ 3 files changed, 18 insertions(+), 1 deletion(-)
+
+commit e6ff9e0d95e058f6aff3c72d5f4d7d7ccf661999
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Sat May 26 22:33:21 2007 +0000
+
+           * poppler-qt.pc.in:
+           * poppler-qt4.pc.in:
+           * qt/Makefile.am:
+           * qt4/src/Makefile.am: Install qt3 and qt4 headers in
+           separate dirs.
+           That way be can reuse poppler-page-transition.h and distros
+           don't get
+           conflicts when making separate qt3 and qt4 packages
+
+ ChangeLog          |    9 +++++++++
+ poppler-qt.pc.in    |   2 +-
+ poppler-qt4.pc.in   |   2 +-
+ qt/Makefile.am      |   2 +-
+ qt4/src/Makefile.am |   2 +-
+ 5 files changed, 13 insertions(+), 4 deletions(-)
+
+commit fefefe495a182c1745314186b99441b9e76ba5b4
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Fri May 25 23:17:58 2007 +0000
+
+           * qt4/src/poppler-link-extractor-private.cc:
+           * qt4/src/poppler-link-extractor-private.h:
+           * qt4/src/poppler-link.cc:
+           * qt4/src/poppler-link.h: Return link coordinates in 0..1
+           range
+           instead of 0..size, much more easier to do user<->dev
+           transformations
+           * qt4/src/poppler-private.h: Fix indentation
+
+ ChangeLog                               |    6 ++++++
+ qt4/src/poppler-link-extractor-private.h |    1 +
+ qt4/src/poppler-link-extractor.cc       |   12 ++++++------
+ qt4/src/poppler-link.cc                 |   25 +++++++++++++++----------
+ qt4/src/poppler-link.h                          |    7 ++++++-
+ qt4/src/poppler-private.h               |   15 ++++++++-------
+ 6 files changed, 42 insertions(+), 24 deletions(-)
+
+commit ecaeaa9512d1dae4a036703ea8739102a8e463f0
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Fri May 25 22:30:20 2007 +0000
+
+           * qt4/src/poppler-link-extractor.cc: Use correct page box
+           to extract
+           link clickable area
+
+ ChangeLog                        |    5 +++++
+ qt4/src/poppler-link-extractor.cc |   2 +-
+ 2 files changed, 6 insertions(+), 1 deletion(-)
+
+commit 774a9456c668ef70b2e8f17d59f8f427aa97bad5
+Author: Jeff Muizelaar <jeff@infidigm.net>
+Date:  Fri May 25 18:43:04 2007 +0000
+
+    2007-05-25 Jeff Muizelaar  <jeff@infidigm.net>
+
+       * poppler/GfxFont.cc:
+       * poppler/GfxFont.h:
+       * poppler/GlobalParams.cc:
+       Don't cache DisplayFontParams by font name, instead cache them
+       in GfxFont. Fixes #8140.
+
+ ChangeLog              |    8 ++++++++
+ poppler/GfxFont.cc     |    2 ++
+ poppler/GfxFont.h      |    6 ++++++
+ poppler/GlobalParams.cc |    4 ++--
+ 4 files changed, 18 insertions(+), 2 deletions(-)
+
+commit a88fadf0bb9af55c83c9c4f7d08deb17d6aa9ae4
+Author: Carlos Garcia Campos <carlosgc@gnome.org>
+Date:  Fri May 25 17:33:37 2007 +0000
+
+    2007-05-25 Carlos Garcia Campos <carlosgc@gnome.org>
+       * glib/poppler-page.cc:
+       * glib/poppler-page.h:
+       * glib/poppler.h:
+       Add selection style parameter to render_selection in order
+       to allow
+       requesting selections of words and paragraphs.
+
+ ChangeLog           |    8 ++++++++
+ glib/poppler-page.cc |   30 ++++++++++++++++--------------
+ glib/poppler-page.h  |    6 ++++--
+ glib/poppler.h       |    7 +++++++
+ 4 files changed, 35 insertions(+), 16 deletions(-)
+
+commit bf195b489c22875695e202d6ca6659144ef57e61
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Wed May 23 21:20:58 2007 +0000
+
+           * qt4/src/poppler-document.cc:
+           * qt4/src/poppler-private.h:
+           Better handle the setting of the vector antialiasing for
+           Splash.
+           * qt4/src/Mainpage.dox:
+           * qt4/src/poppler-link.h:
+           * qt4/src/poppler-qt4.h:
+           A few of API documentation fixes and improvements.
+
+ ChangeLog                  |   10 ++++++++
+ qt4/src/Mainpage.dox       |    8 ++----
+ qt4/src/poppler-document.cc |   5 ++--
+ qt4/src/poppler-link.h      |   4 ++-
+ qt4/src/poppler-private.h   |   1 +
+ qt4/src/poppler-qt4.h      |   57
+ ++++++++++++++++++++++++++++---------------
+ 6 files changed, 57 insertions(+), 28 deletions(-)
+
+commit 36d1fe292778ba29990a389c50a0df0d51f11913
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Mon May 21 21:42:38 2007 +0000
+
+    Fix assert in bug 11023
+
+ ChangeLog             |    4 ++++
+ glib/poppler-action.cc |    2 +-
+ 2 files changed, 5 insertions(+), 1 deletion(-)
+
+commit 5b411246a2cce6ed3bb2d8c9e9d856227b6aba7f
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Mon May 21 21:39:08 2007 +0000
+
+           * glib/poppler-page.cc:
+           * glib/poppler-page.h:
+           poppler_page_render_section() for cairo. Bug 7023
+
+ ChangeLog           |    6 ++++
+ glib/poppler-page.cc |   88
+ ++++++++++++++++++++++++++++++++++++++++++++------
+ glib/poppler-page.h  |    9 ++++++
+ 3 files changed, 93 insertions(+), 10 deletions(-)
+
+commit 409f2a9cb31add29accb87011331c50dc08110cd
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Mon May 21 21:35:10 2007 +0000
+
+           * glib/poppler-page.cc:
+           * glib/poppler-page.h:
+           * glib/poppler-private.h:
+           * glib/poppler.h:
+           * glib/test-poppler-glib.c:
+           * poppler/CairoOutputDev.cc:
+           * poppler/CairoOutputDev.h: Extend CairoOutputdev to do
+           image caching when rendering
+
+ ChangeLog                |   11 +++
+ glib/poppler-page.cc     |  161 +++++++++++++++++++++++++++++++--
+ glib/poppler-page.h      |   10 +++
+ glib/poppler-private.h    |   3 +
+ glib/poppler.h                   |    9 +-
+ glib/test-poppler-glib.c  |   27 +++++-
+ poppler/CairoOutputDev.cc |  215
+ +++++++++++++++++++++++++++++++++++++++++++++
+ poppler/CairoOutputDev.h  |  122 +++++++++++++++++++++++++
+ 8 files changed, 545 insertions(+), 13 deletions(-)
+
+commit afd11ec66430dae084b5a5560333e933460fc637
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Mon May 21 21:29:09 2007 +0000
+
+           * poppler/Annot.cc: avoid crashing if the font for the
+           drawing methods
+           can not be found
+           * poppler/Form.cc: fix memory leak
+           * qt4/src/poppler-private.h: fix the UnicodeParsedString
+           function to
+           really work and not crash
+           * splash/SplashTypes.h: RGB8X mode makes max number of
+           components in
+           any SplashColor always be 4
+
+ ChangeLog                |   11 +++++++++++
+ poppler/Annot.cc         |    6 ++++++
+ poppler/Form.cc          |    1 +
+ qt4/src/poppler-private.h |   5 ++++-
+ splash/SplashTypes.h     |    6 +-----
+ 5 files changed, 23 insertions(+), 6 deletions(-)
+
+commit f019c8a8efde004e1663ea88cb48c0e46318d936
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Thu May 17 21:32:57 2007 +0000
+
+    2007-05-17 Pino Toscano <pino@kde.org>
+
+           * qt4/src/poppler-link.cc:
+           Give some default values to LinkDestination
+           * qt4/src/poppler-private.h:
+           Fix memory leak when converting QString -> GooString
+
+ ChangeLog                |    7 +++++++
+ qt4/src/poppler-link.cc   |   12 ++++++++++++
+ qt4/src/poppler-private.h |   4 +++-
+ 3 files changed, 22 insertions(+), 1 deletion(-)
+
+commit d68a4eb44b5390b3093774f39a6805ad2e95c146
+Author: Jeff Muizelaar <jeff@infidigm.net>
+Date:  Sun May 13 00:53:43 2007 +0000
+
+    2007-05-12 Jeff Muizelaar  <jeff@infidigm.net>
+
+       * poppler/Annot.cc: Only do appearance generation for text,
+       choice or
+       other fields that contain text. Patch by Julien Rebetez.
+
+ ChangeLog       |    5 +++++
+ poppler/Annot.cc |   52
+ ++++++++++++++++++++++++++++++++++++++++++++++------
+ 2 files changed, 51 insertions(+), 6 deletions(-)
+
+commit 96f8731e90af1abce67d00a3febc11880c69ce62
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Mon May 7 18:41:09 2007 +0000
+
+           * Catalog.cc: Fix leak
+           * Form.cc: Fix leak, provide empty
+           FormPageWidgets::~FormPageWidgets
+           implementation
+           * Page.cc: Fix leak
+
+ ChangeLog         |    7 +++++++
+ poppler/Catalog.cc |   1 +
+ poppler/Form.cc    |   5 +++++
+ poppler/Page.cc    |   1 +
+ 4 files changed, 14 insertions(+)
+
+commit d46553d696b2d7fe416ce8db40db54dd1d7c6733
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Mon Apr 30 22:34:21 2007 +0000
+
+           * poppler/Makefile.am: Don't link cairo to all poppler,
+           just to
+           poppler_cairo so when compiling the qt frontend and the
+           glib frontend
+           the qt one does not end up depending on cairo
+
+ ChangeLog          |    6 ++++++
+ poppler/Makefile.am |   1 -
+ 2 files changed, 6 insertions(+), 1 deletion(-)
+
+commit d5c52409c532a126bcb8eb65f6f1390113a5f258
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Sun Apr 29 17:37:38 2007 +0000
+
+    jeff committed this line by mistake
+
+ ChangeLog |   1 -
+ 1 file changed, 1 deletion(-)
+
+commit 6ddc11ef4c534369ee104422bfb989603c466790
+Author: Jeff Muizelaar <jeff@infidigm.net>
+Date:  Sun Apr 29 17:33:58 2007 +0000
+
+    2007-04-29 Jeff Muizelaar  <jeff@infidigm.net>
+
+       * poppler/UnicodeTypeTable.cc: Make some of the unicode tables
+       const
+       which gets rid of about 20k of data.
+
+                  text    data     bss     dec     hex filename
+       before: 1415838  128864       8 1544710  179206 libpoppler.so
+       after:  1404574  140128       8 1544710  179206 libpoppler.so
+
+ ChangeLog                  |   10 ++++++++++
+ poppler/UnicodeTypeTable.cc |  24 ++++++++++++------------
+ 2 files changed, 22 insertions(+), 12 deletions(-)
+
+commit c5613ab5ce65fc84eb3a5584cee1454171173fa7
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Sat Apr 28 23:25:59 2007 +0000
+
+           * poppler/SplashOutputDev.cc:
+           * qt/poppler-private.h:
+           * qt4/src/poppler-private.h:
+           * splash/Splash.cc:
+           * splash/SplashBitmap.cc:
+           * splash/SplashTypes.h: Rename splashModeRGBX8 to
+           splashModeXBGR8 and
+           hopefully fix qt frontends image generation
+
+ ChangeLog                 |   10 +++++
+ poppler/SplashOutputDev.cc |  102
+ ++++++++++++++++++++++++++++++++------------
+ qt/poppler-private.h      |    2 +-
+ qt4/src/poppler-private.h  |   2 +-
+ splash/Splash.cc          |   44 ++++++++++---------
+ splash/SplashBitmap.cc     |  16 +++----
+ splash/SplashTypes.h      |    4 +-
+ 7 files changed, 120 insertions(+), 60 deletions(-)
+
+commit 6479ce224f1393235ca9888dfe0710327fbfccd2
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Sat Apr 28 22:12:22 2007 +0000
+
+    fix merging problems
+
+ splash/Splash.cc      |    1 +
+ splash/SplashBitmap.cc |    1 -
+ 2 files changed, 1 insertion(+), 1 deletion(-)
+
+commit e2ac4ada3e29139053871ff7f53772e1ccc7adc0
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Sat Apr 28 15:39:36 2007 +0000
+
+    \n at the end of the printf
+    Although i'm not sure we want to printf this...
+
+ poppler/GlobalParams.cc |    2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 9b8133940638c95940edcb9b98126ca9a4f7b8d4
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Sat Apr 28 12:00:38 2007 +0000
+
+           * qt4/src/Makefile.am:
+           * qt4/src/poppler-document.cc:
+           * qt4/src/poppler-ps-converter.cc:
+           * qt4/src/poppler-qt4.h: Replace Document::print function
+           with lots of
+           arguments with a helper class with lots of functions. Will
+           help
+           mantaining BC in case we decide to add more functionality
+           to the
+           printing process.
+
+ ChangeLog                      |   10 +++
+ qt4/src/Makefile.am            |    1 +
+ qt4/src/poppler-document.cc    |   39 ++------
+ qt4/src/poppler-ps-converter.cc |  190
+ +++++++++++++++++++++++++++++++++++++++
+ qt4/src/poppler-qt4.h          |  119 ++++++++++++++++++++----
+ 5 files changed, 307 insertions(+), 52 deletions(-)
+
+commit 26d5fefcd4c858e2ebd689d963a65773957ac808
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Sat Apr 28 11:35:34 2007 +0000
+
+    * qt4/src/poppler-page.cc:
+          Hopefully fix the calculation of the image size when rendering
+          using
+          ArthurOutputDev.
+
+ ChangeLog              |    6 ++++++
+ qt4/src/poppler-page.cc |    2 +-
+ 2 files changed, 7 insertions(+), 1 deletion(-)
+
+commit 218364bc4951682de8e63e1bd3f061636b08b615
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Sat Apr 28 11:34:14 2007 +0000
+
+           * glib/poppler-document.h:
+           * poppler/FontInfo.h:
+           * qt/poppler-qt.h:
+           * qt4/src/poppler-qt4.h: GfxFontType changed, adapt enums
+           of the
+           frontends and helper classes. Forgot to do it before merging.
+
+ ChangeLog              |    8 ++++++++
+ glib/poppler-document.h |    6 +++++-
+ poppler/FontInfo.h     |    6 +++++-
+ qt/poppler-qt.h        |    6 +++++-
+ qt4/src/poppler-qt4.h  |   20 ++++++++++++--------
+ 5 files changed, 35 insertions(+), 11 deletions(-)
+
+commit c1a40d3b4e9b27e34c94c9477a0313534563a394
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Sat Apr 28 11:20:58 2007 +0000
+
+           * qt4/src/poppler-annotation.h:
+           Make the header clean.
+
+ ChangeLog                   |    5 +++++
+ qt4/src/poppler-annotation.h |    3 +++
+ 2 files changed, 8 insertions(+)
+
+commit 3f4bf880b95e28a1ae7a38b18b341e089860780c
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Sat Apr 28 11:16:49 2007 +0000
+
+          * qt4/src/Makefile.am:
+          * qt4/src/poppler-link-extractor-private.h:
+          * qt4/src/poppler-link-extractor.cc:
+          * qt4/src/poppler-page-private.h:
+          * qt4/src/poppler-page.cc:
+          * qt4/src/poppler-private.h:
+          * qt4/src/poppler-qt4.h:
+          Getting the links of a page now is not more dependant on
+          the current
+          output device, and can be done anytime; thus, the doLinks
+          parameter
+          of the Page::render() can be dropped.
+
+ ChangeLog                               |   13 ++++++
+ qt4/src/Makefile.am                     |    3 +-
+ qt4/src/poppler-link-extractor-private.h |   55 ++++++++++++++++++++++
+ qt4/src/poppler-link-extractor.cc       |   74
+ ++++++++++++++++++++++++++++++
+ qt4/src/poppler-page-private.h                  |   38 +++++++++++++++
+ qt4/src/poppler-page.cc                 |   52 ++++-----------------
+ qt4/src/poppler-private.h               |    5 +-
+ qt4/src/poppler-qt4.h                   |    4 +-
+ 8 files changed, 195 insertions(+), 49 deletions(-)
+
+commit 7f9eec9ef4e7dc895d2a3e38014b6368cc7564b6
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Fri Apr 27 22:41:10 2007 +0000
+
+    2007-04-28 Albert Astals Cid <aacid@kde.org>
+
+           * qt4/*: Stop requyring users to declare UNSTABLE_POPPLER_QT4
+
+ ChangeLog                         |    4 ++++
+ qt4/src/Doxyfile                  |    2 +-
+ qt4/src/Mainpage.dox              |    3 +--
+ qt4/src/poppler-document.cc       |    2 --
+ qt4/src/poppler-embeddedfile.cc    |   2 --
+ qt4/src/poppler-fontinfo.cc       |    2 --
+ qt4/src/poppler-form.cc           |    1 -
+ qt4/src/poppler-link.cc           |    2 --
+ qt4/src/poppler-page.cc           |    1 -
+ qt4/src/poppler-qt4.h             |    3 ---
+ qt4/src/poppler-sound.cc          |    2 --
+ qt4/src/poppler-textbox.cc        |    2 --
+ qt4/tests/check_attachments.cpp    |   1 -
+ qt4/tests/check_dateConversion.cpp |   1 -
+ qt4/tests/check_fonts.cpp         |    1 -
+ qt4/tests/check_metadata.cpp      |    1 -
+ qt4/tests/check_pagelayout.cpp     |   1 -
+ qt4/tests/check_pagemode.cpp      |    1 -
+ qt4/tests/check_permissions.cpp    |   1 -
+ qt4/tests/poppler-attachments.cpp  |   1 -
+ qt4/tests/poppler-fonts.cpp       |    1 -
+ qt4/tests/stress-poppler-qt4.cpp   |   1 -
+ qt4/tests/test-password-qt4.cpp    |   1 -
+ qt4/tests/test-poppler-qt4.cpp     |   1 -
+ 24 files changed, 6 insertions(+), 32 deletions(-)
+
+commit 45993a6faafd7646075bc6630d5d2ad7a44f7e20
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Fri Apr 27 22:26:09 2007 +0000
+
+    2007-04-28 Carlos Garcia Campos <carlosgc@gnome.org>
+           reviewed and some code by: Albert Astals Cid <aacid@kde.org>
+
+           * glib/poppler-page.cc:
+           * glib/poppler-page.h:
+           * glib/poppler.h:
+           * glib/test-poppler-glib.c:
+           * poppler/Makefile.am:
+           * poppler/PageTransition.cc:
+           * poppler/PageTransition.h:
+           * qt/poppler-page-transition.cc:
+           * qt/poppler-page-transition.h: Move Page Transition parsing
+           from qt
+           frontends to poppler core. Expose Page transitions on the glib
+           frontend.
+
+ ChangeLog                    |   15 ++++
+ glib/poppler-page.cc         |  122 +++++++++++++++++++++++++
+ glib/poppler-page.h          |  111 +++++++++++++----------
+ glib/poppler.h                       |   58 ++++++++----
+ glib/test-poppler-glib.c      |   60 +++++++++++++
+ poppler/Makefile.am          |    2 +
+ poppler/PageTransition.cc     |  197
+ +++++++++++++++--------------------------
+ poppler/PageTransition.h      |   86 ++++++++++++++++++
+ qt/poppler-page-transition.cc |  145 ++++++------------------------
+ qt/poppler-page-transition.h  |    9 +-
+ 10 files changed, 497 insertions(+), 308 deletions(-)
+
+commit 877d6b202a75eb12119b16e740f85cc8b477d589
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Fri Apr 27 21:25:30 2007 +0000
+
+           * glib/poppler-page.cc:
+           * poppler/PSOutputDev.cc:
+           * poppler/PSOutputDev.h:
+           * qt/poppler-document.cc:
+           * qt4/src/poppler-document.cc:
+           * qt4/src/poppler-qt4.h:
+           * utils/pdftohtml.cc:
+           * utils/pdftops.cc:
+           Add option to force rasterizing the pages when printing them
+           Add functionality to output the title field on the PS file
+           Only Qt4 frontend exposes the functionality
+
+    Bringing this features from KPDF 3.5.7 to poppler
+    Testers welcome
+    Patches for other frontends more than welcome
+    Comments and suggestions even more than welcome :-)
+
+ ChangeLog                  |   14 +++++++++++++
+ glib/poppler-page.cc       |    3 ++-
+ poppler/PSOutputDev.cc      |  48
+ +++++++++++++++++++++++++++++--------------
+ poppler/PSOutputDev.h      |   17 +++++++++------
+ qt/poppler-document.cc      |   2 +-
+ qt4/src/poppler-document.cc |   9 ++++++--
+ qt4/src/poppler-qt4.h      |    2 +-
+ utils/pdftohtml.cc         |    2 +-
+ utils/pdftops.cc           |    2 +-
+ 9 files changed, 71 insertions(+), 28 deletions(-)
+
+commit 99053be5357235c47a87775985646ef8d9880ed9
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Thu Apr 26 17:57:01 2007 +0000
+
+           * goo/Makefile.am: Remove duplicate gmem.h
+
+ ChangeLog      |    4 ++++
+ goo/Makefile.am |    1 -
+ 2 files changed, 4 insertions(+), 1 deletion(-)
+
+commit f6adb46cd88d23b34f1918d3be31c05b68b6a443
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Wed Apr 25 21:31:17 2007 +0000
+
+    ignore pdftoabw binary
+
+ utils/.cvsignore |    1 +
+ 1 file changed, 1 insertion(+)
+
+commit e09f231ac6c03ac2c3606f1bf20ba1bde3d85abd
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Wed Apr 25 21:25:06 2007 +0000
+
+    2007-04-25 Albert Astals Cid <aacid@kde.org>
+
+           * qt4/src/poppler-document.cc: remove a delete[] no longer
+           needed
+           * qt4/src/poppler-private: initilize m_hints
+
+ ChangeLog                  |    5 +++++
+ qt4/src/poppler-document.cc |   1 -
+ qt4/src/poppler-private.h   |   1 +
+ 3 files changed, 6 insertions(+), 1 deletion(-)
+
+commit bf7e0e980bf29994021cb1228f89f582adddf284
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Wed Apr 25 19:59:09 2007 +0000
+
+    Merge xpdf302branch in HEAD as noone vetoed it.
+    Testing more than welcome
+
+ ChangeLog                          |  140 +
+ configure.ac                       |    4 +
+ fofi/FoFiTrueType.cc               |  458 +++-
+ fofi/FoFiTrueType.h                |   42 +-
+ fofi/FoFiType1.cc                  |   65 +-
+ fofi/FoFiType1C.cc                 |  590 +++--
+ fofi/FoFiType1C.h                  |    7 +-
+ glib/poppler-action.cc                     |   12 +-
+ glib/poppler-document.cc           |    5 +-
+ glib/poppler-page.cc               |    8 +-
+ goo/FixedPoint.cc                  |   31 +-
+ goo/FixedPoint.h                   |    5 +
+ goo/GooString.cc                   |  444 +++-
+ goo/GooString.h                    |   41 +-
+ goo/Makefile.am                    |    2 +-
+ goo/gfile.cc                       |   54 +-
+ goo/gmem.c                         |  238 --
+ goo/gmem.cc                        |  264 ++
+ goo/gmem.h                         |   27 +-
+ poppler/ABWOutputDev.cc            |    1 -
+ poppler/ABWOutputDev.h                     |    1 -
+ poppler/Annot.cc                   | 1685 +++++++++---
+ poppler/Annot.h                    |   83 +-
+ poppler/ArthurOutputDev.cc         |   13 +-
+ poppler/Catalog.cc                 |   79 +-
+ poppler/Catalog.h                  |   16 +-
+ poppler/CharCodeToUnicode.cc       |   31 +-
+ poppler/DCTStream.cc               |    2 +-
+ poppler/DCTStream.h                |    4 +-
+ poppler/Decrypt.cc                 |  427 ++-
+ poppler/Decrypt.h                  |   54 +-
+ poppler/Dict.cc                    |   23 +-
+ poppler/Dict.h                             |   27 +-
+ poppler/FontInfo.cc                |    1 -
+ poppler/Form.cc                    |   19 +-
+ poppler/Form.h                             |    2 +-
+ poppler/Function.cc                |   65 +-
+ poppler/Function.h                 |    8 +-
+ poppler/Gfx.cc                             | 1247 ++++++---
+ poppler/Gfx.h                      |   39 +-
+ poppler/GfxFont.cc                 |   45 +-
+ poppler/GfxFont.h                  |    7 +-
+ poppler/GfxState.cc                |  209 +-
+ poppler/GfxState.h                 |   42 +-
+ poppler/GlobalParams.cc            |  399 ++-
+ poppler/GlobalParams.h                     |   41 +-
+ poppler/JBIG2Stream.cc                     |   96 +-
+ poppler/JBIG2Stream.h              |    4 +-
+ poppler/JPXStream.cc               |  246 +-
+ poppler/JPXStream.h                |    8 +-
+ poppler/Lexer.cc                   |   18 +-
+ poppler/Link.cc                    |  150 +-
+ poppler/Link.h                             |   49 +-
+ poppler/Makefile.am                |    4 +-
+ poppler/Object.cc                  |    5 +-
+ poppler/Object.h                   |   29 +-
+ poppler/Outline.cc                 |    1 -
+ poppler/OutputDev.cc               |    2 +
+ poppler/OutputDev.h                |   62 +-
+ poppler/PDFDoc.cc                  |  100 +-
+ poppler/PDFDoc.h                   |   21 +-
+ poppler/PSOutputDev.cc                     | 2715 ++++++++++++++-----
+ poppler/PSOutputDev.h              |   58 +-
+ poppler/PSTokenizer.cc                     |    2 +-
+ poppler/Page.cc                    |  227 +-
+ poppler/Page.h                             |   22 +-
+ poppler/PageLabelInfo.cc           |    1 -
+ poppler/Parser.cc                  |   66 +-
+ poppler/Parser.h                   |   11 +-
+ poppler/PreScanOutputDev.cc        |  255 ++
+ poppler/PreScanOutputDev.h         |  128 +
+ poppler/SecurityHandler.cc         |   17 +-
+ poppler/SecurityHandler.h          |    5 +
+ poppler/SplashOutputDev.cc         | 1480 ++++++-----
+ poppler/SplashOutputDev.h          |   41 +-
+ poppler/Stream.cc                  |  338 +--
+ poppler/Stream.h                   |   39 +-
+ poppler/TextOutputDev.cc           |  537 +++-
+ poppler/TextOutputDev.h            |   77 +-
+ poppler/UGooString.cc              |  182 --
+ poppler/UGooString.h               |   79 -
+ poppler/XRef.cc                    |   29 +-
+ poppler/XRef.h                             |    6 +-
+ qt/poppler-document.cc                     |   15 +-
+ qt/poppler-page-transition.cc      |    1 -
+ qt/poppler-page.cc                 |    4 +-
+ qt/poppler-private.h               |   72 +-
+ qt4/src/poppler-annotation-helper.h |  38 +-
+ qt4/src/poppler-document.cc        |    7 +-
+ qt4/src/poppler-embeddedfile.cc     |   6 +-
+ qt4/src/poppler-form.cc            |   12 +-
+ qt4/src/poppler-page.cc            |    8 +-
+ qt4/src/poppler-private.h          |   76 +-
+ splash/Splash.cc                   | 4994
+ ++++++++++++++++++-----------------
+ splash/Splash.h                    |  137 +-
+ splash/SplashBitmap.cc                     |  110 +-
+ splash/SplashBitmap.h              |   10 +-
+ splash/SplashClip.cc               |  276 +-
+ splash/SplashClip.h                |   28 +-
+ splash/SplashFTFont.cc                     |  104 +-
+ splash/SplashFTFont.h              |    5 +-
+ splash/SplashFTFontEngine.cc       |   54 +-
+ splash/SplashFTFontEngine.h        |    9 +-
+ splash/SplashFTFontFile.cc         |   19 +-
+ splash/SplashFTFontFile.h          |    9 +-
+ splash/SplashFont.cc               |    6 +-
+ splash/SplashFont.h                |   13 +-
+ splash/SplashFontEngine.cc         |   72 +-
+ splash/SplashFontEngine.h          |   11 +-
+ splash/SplashFontFile.cc           |    1 -
+ splash/SplashFontFile.h            |    2 +-
+ splash/SplashMath.h                |   15 +-
+ splash/SplashPath.cc               |   42 +-
+ splash/SplashPath.h                |   31 +-
+ splash/SplashPattern.cc            |   28 -
+ splash/SplashPattern.h                     |   25 -
+ splash/SplashScreen.cc                     |  304 ++-
+ splash/SplashScreen.h              |   18 +-
+ splash/SplashState.cc              |   63 +-
+ splash/SplashState.h               |   14 +-
+ splash/SplashT1Font.cc                     |  101 +-
+ splash/SplashT1Font.h              |    6 +-
+ splash/SplashT1FontEngine.cc       |    4 +-
+ splash/SplashT1FontFile.cc         |    9 +-
+ splash/SplashT1FontFile.h          |    7 +-
+ splash/SplashTypes.h               |   72 +-
+ splash/SplashXPath.cc              |  353 +--
+ splash/SplashXPath.h               |   26 +-
+ splash/SplashXPathScanner.cc       |  143 +
+ splash/SplashXPathScanner.h        |   13 +
+ utils/HtmlOutputDev.cc                     |   15 +-
+ utils/HtmlOutputDev.h              |   15 +-
+ utils/pdffonts.cc                  |   15 +-
+ utils/pdfinfo.cc                   |   21 +-
+ utils/pdftoabw.cc                  |    1 -
+ utils/pdftohtml.cc                 |    3 +-
+ utils/pdftoppm.cc                  |    8 +
+ utils/pdftops.cc                   |    8 +-
+ utils/pdftotext.cc                 |    1 -
+ 139 files changed, 14538 insertions(+), 7039 deletions(-)
+
+commit ba74bb3b0632593d1937911d73709fc870480efd
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Mon Apr 16 21:25:46 2007 +0000
+
+    * qt4/src/poppler-private.h:
+          Add the information about the open/close item in the DOM tree
+          of the TOC.
+
+ ChangeLog                |    7 +++++++
+ qt4/src/poppler-private.h |   5 ++++-
+ 2 files changed, 11 insertions(+), 1 deletion(-)
+
+commit 6c7969f37c85f326327aca98e0346f2ebc86ffda
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Sat Apr 14 23:19:46 2007 +0000
+
+          * utils/HtmlFonts.cc: Fix rendering of text colors on
+          complex mode.
+          * utils/pdftohtml.cc: Fix rendering of links.
+
+ ChangeLog         |    5 +++++
+ utils/HtmlFonts.cc |   8 ++++----
+ utils/pdftohtml.cc |   2 +-
+ 3 files changed, 10 insertions(+), 5 deletions(-)
+
+commit add8515d7b3fba59c20ed1bbb058cea9e138c1a8
+Author: Brad Hards <bradh@frogmouth.net>
+Date:  Sat Apr 14 07:29:04 2007 +0000
+
+    Not sure what this was intended to do, but it triggers a lot of
+    problems with the unit tests (essentially, duplicate delete's).
+
+    CCMAIL: aacid@kde.org
+
+ qt4/src/poppler-embeddedfile.cc |    1 -
+ 1 file changed, 1 deletion(-)
+
+commit f3ded10305f6ac682640c37c21f569db0f830756
+Author: Jeff Muizelaar <jeff@infidigm.net>
+Date:  Sat Apr 7 21:12:35 2007 +0000
+
+    2007-04-07 Jeff Muizelaar  <jeff@infidigm.net>
+
+       * utils/pdftoabw.cc: Fixing passing the wrong type
+       to fprintf. Patch by Kouhei Sutou. Fixes #10554.
+
+ ChangeLog        |    5 +++++
+ utils/pdftoabw.cc |   2 +-
+ 2 files changed, 6 insertions(+), 1 deletion(-)
+
+commit 2fcb76df955c143153fe4b273d0388fcb7f67d8a
+Author: Jeff Muizelaar <jeff@infidigm.net>
+Date:  Fri Apr 6 15:27:52 2007 +0000
+
+    2007-04-06 Jeff Muizelaar  <jeff@infidigm.net>
+
+       * poppler/ABWOutputDev.cc:
+       * utils/pdftoabw.cc: Fix a number of issues with the new
+       AbiWord code:
+               *) Allows you to save to a file other than stdout
+               *) Checks for error conditions when reading the PDF
+               doc and
+                  writing the ABW doc
+               *) Removes dead code in pdftoabw.cc
+               *) Fixes a SEGV I encountered when converting my new
+               home's floor plan
+               *) Returns proper error conditions should the conversion
+               fail for any reason
+       Patch by Dominic Lachowicz
+
+ ChangeLog              |   12 ++++++
+ poppler/ABWOutputDev.cc |    3 ++
+ utils/pdftoabw.cc      |  101
+ +++++++++++++++++++++++++++--------------------
+ 3 files changed, 74 insertions(+), 42 deletions(-)
+
+commit 29da65ec48b5ba91139084e197ce457d3cff3732
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Thu Apr 5 12:13:51 2007 +0000
+
+    * poppler/PSOutputDev.cc: Readd code wrongly removed when doing the
+    GlobalParams cleaning
+
+ ChangeLog             |    5 +++++
+ poppler/PSOutputDev.cc |    5 +++++
+ 2 files changed, 10 insertions(+)
+
+commit 722b2bd86f58f2d7a914571cccfa195485a70c47
+Author: Jeff Muizelaar <jeff@infidigm.net>
+Date:  Wed Apr 4 02:42:29 2007 +0000
+
+    2007-04-03 Jeff Muizelaar  <jeff@infidigm.net>
+
+       * configure.ac:
+       * poppler/ABWOutputDev.cc:
+       * poppler/ABWOutputDev.h:
+       * poppler/Makefile.am:
+       * utils/Makefile.am:
+       * utils/pdftoabw.cc: Add AbiWord output device and pdftoabw
+       program.
+       Patch by Jauco Noordzij. Autotools stuff by Dominic Lachowicz.
+
+ ChangeLog              |   10 +
+ configure.ac           |   15 +
+ poppler/ABWOutputDev.cc | 1286
+ +++++++++++++++++++++++++++++++++++++++++++++++
+ poppler/ABWOutputDev.h  |  140 ++++++
+ poppler/Makefile.am    |   17 +
+ utils/Makefile.am      |   16 +-
+ utils/pdftoabw.cc      |  138 +++++
+ 7 files changed, 1620 insertions(+), 2 deletions(-)
+
+commit c9b467da290476da5ebbe8dc25699cd25e589b57
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Thu Mar 22 20:56:24 2007 +0000
+
+           * poppler/Gfx.cc: Accept reals for width and height of
+           images. Fixes
+           KDE bug 143322
+
+ ChangeLog     |    5 +++++
+ poppler/Gfx.cc |   14 ++++++++++----
+ 2 files changed, 15 insertions(+), 4 deletions(-)
+
+commit ff8f8d44ef47a98f7dbdfaa4d27a720b1f37015f
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Thu Mar 15 20:16:13 2007 +0000
+
+          * glib/Makefile.am: Make it build with BSD/Make. Patch by
+          Henry Precheur <henry@precheur.org>
+
+ ChangeLog       |    5 +++++
+ glib/Makefile.am |    4 ++--
+ 2 files changed, 7 insertions(+), 2 deletions(-)
+
+commit bbf7e78b6b2509ecdc476d7f55151ef327470d9d
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Wed Mar 7 19:15:32 2007 +0000
+
+    2007-03-07 Carlos Garcia Campos <carlosgc@gnome.org>
+           reviewed by: Albert Astals Cid <aacid@kde.org>
+
+           * poppler/Page.cc: Consider 0x0 boxes as invalid. Fixes
+           http://bugzilla.gnome.org/show_bug.cgi?id=408682
+
+    2007-03-06 Pino Toscano <pino@kde.org>
+           reviewed by: Albert Astals Cid <aacid@kde.org>
+
+          * configure.ac:
+          * qt/Makefile.am:
+          * qt/poppler-link.cc:
+          * qt/poppler-page.cc:
+          * qt/poppler-private.h:
+          * qt4/poppler-link.cc:
+          Make the Qt4 frontend compilable again with no Splash.
+          Make the Qt3 frontend compilable with no Splash.
+
+ ChangeLog              |   18 ++++++++++++++++++
+ configure.ac           |   12 +-----------
+ poppler/Page.cc        |    7 ++++++-
+ qt/Makefile.am                 |    1 -
+ qt/poppler-link.cc     |    4 +++-
+ qt/poppler-page.cc     |   16 +++++++++++++++-
+ qt/poppler-private.h   |   11 ++++++++++-
+ qt4/src/poppler-link.cc |   10 ++++++----
+ 8 files changed, 59 insertions(+), 20 deletions(-)
+
+commit 08dcc7121450cbfa163254001e73bb6a2670e055
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Tue Mar 6 22:27:18 2007 +0000
+
+           * poppler/Annot.cc:
+           * poppler/Form.cc:
+           Fix uninitialized variables.
+           Properly escape parenthesis and slash in text field
+
+ ChangeLog       |    9 ++++++++-
+ poppler/Annot.cc |    3 +++
+ poppler/Form.cc  |    1 +
+ 3 files changed, 12 insertions(+), 1 deletion(-)
+
+commit e8d3b21d08a59ec8b62503b48504fe046d746bfa
+Author: Brad Hards <bradh@frogmouth.net>
+Date:  Sun Mar 4 07:30:31 2007 +0000
+
+    Switch to using pkg-config to find Qt4.
+
+ ChangeLog            |    9 +++
+ configure.ac         |   36 +++++------
+ m4/qt.m4             |  165
+ -------------------------------------------------
+ poppler/Makefile.am   |    2 +-
+ qt4/src/Makefile.am   |    3 +-
+ qt4/tests/Makefile.am |   21 +++----
+ 6 files changed, 36 insertions(+), 200 deletions(-)
+
+commit bd99616b9c06f96beadb68e015d2904b7fe2df1d
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Sun Feb 25 00:34:21 2007 +0000
+
+    007-02-25  Julien Rebetez  <julienr@svn.gnome.org>
+
+           reviewed by: Albert Astals Cid <aacid@kde.org>
+
+           * poppler/Annot.cc:
+           * poppler/Annot.h:
+           * poppler/Form.cc:
+           * poppler/Form.h:
+           Fix compilation warnings.
+
+ ChangeLog       |   10 ++++++++++
+ poppler/Annot.cc |   30 +++++++++++++++++-------------
+ poppler/Annot.h  |    5 ++++-
+ poppler/Form.cc  |   37 ++++++++++++++-----------------------
+ poppler/Form.h   |   13 ++++++-------
+ 5 files changed, 51 insertions(+), 44 deletions(-)
+
+commit d8d23b56332618d8c7d8198f55ec6efafd24187e
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Sun Feb 25 00:00:20 2007 +0000
+
+    forgot to commit these
+
+ qt4/src/poppler-form.cc |  284
+ +++++++++++++++++++++++++++++++++++++++++++++++
+ qt4/src/poppler-form.h  |  247 +++++++++++++++++++++++++++++++++++++++++
+ 2 files changed, 531 insertions(+)
+
+commit 984ce7f919aec27d5f4225376550cd6b58d4ae52
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Sat Feb 24 23:58:31 2007 +0000
+
+    2007-02-25 Pino Toscano <pino@kde.org>
+               reviewed by: Albert Astals Cid <aacid@kde.org>
+
+           * qt4/src/Doxyfile:
+           * qt4/src/Makefile.am:
+           * qt4/src/poppler-annotation-helper.h:
+           * qt4/src/poppler-form.cc:
+           * qt4/src/poppler-form.h:
+           * qt4/src/poppler-page.cc:
+           * qt4/src/poppler-private.h:
+           * qt4/src/poppler-qt4.h:
+                   Beginning of interactive forms support, first
+                   implementation in the
+                   Qt4 frontend. It supports text and choice fields in
+                   a basic way.
+
+ ChangeLog                          |   14 ++++++++++
+ qt4/src/Doxyfile                   |    1 +
+ qt4/src/Makefile.am                |    2 ++
+ qt4/src/poppler-annotation-helper.h |  18 ++++++------
+ qt4/src/poppler-page.cc            |   36 ++++++++++++++++++++++++
+ qt4/src/poppler-private.h          |   52
+ ++++++++++++++++++++++++++++++++++-
+ qt4/src/poppler-qt4.h              |    7 +++++
+ 7 files changed, 120 insertions(+), 10 deletions(-)
+
+commit de7a90fc724de14151ec994d18f860ada3be2ac8
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Sat Feb 24 23:43:34 2007 +0000
+
+    2007-02-25 Albert Astals Cid <aacid@kde.org>
+
+           * configure.ac:
+           * glib/poppler-document.cc:
+           * poppler/GlobalParams.cc:
+           * poppler/GlobalParams.h:
+           * poppler/PSOutputDev.cc:
+           * qt/poppler-document.cc:
+           * qt4/src/poppler-document.cc:
+           * qt4/src/poppler-private.h:
+           * qt4/src/poppler-qt4.h:
+           * test/gtk-splash-test.cc:
+           * test/pdf-inspector.cc:
+           * utils/pdffonts.cc:
+           * utils/pdfimages.cc:
+           * utils/pdfinfo.cc:
+           * utils/pdftohtml.cc:
+           * utils/pdftoppm.cc:
+           * utils/pdftops.cc:
+           * utils/pdftotext.cc: Remove dependency on xpdfrc file
+           and cleanup
+                                 GlobalParams accordingly
+
+ ChangeLog                  |   22 ++
+ configure.ac               |    1 -
+ glib/poppler-document.cc    |   4 +-
+ poppler/GlobalParams.cc     | 666
+ +------------------------------------------
+ poppler/GlobalParams.h      |  59 +---
+ poppler/PSOutputDev.cc      |   8 -
+ qt/poppler-document.cc      |   4 +-
+ qt4/src/poppler-document.cc |   2 +-
+ qt4/src/poppler-private.h   |   2 +-
+ qt4/src/poppler-qt4.h      |    6 +-
+ test/gtk-splash-test.cc     |   2 +-
+ test/pdf-inspector.cc      |    2 +-
+ utils/pdffonts.cc          |    5 +-
+ utils/pdfimages.cc         |    5 +-
+ utils/pdfinfo.cc           |    5 +-
+ utils/pdftohtml.cc         |    2 +-
+ utils/pdftoppm.cc          |   15 +-
+ utils/pdftops.cc           |   50 ++--
+ utils/pdftotext.cc         |    5 +-
+ 19 files changed, 72 insertions(+), 793 deletions(-)
+
+commit 74e70386b759a3cd9864d11eb4ca210010136aa5
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Sat Feb 24 23:32:22 2007 +0000
+
+    2007-02-25 Julien Rebetez  <julienr@svn.gnome.org>
+               reviewed by: <aacid@kde.org>
+
+           * glib/poppler-document.cc:
+           * glib/poppler-document.h:
+           * glib/poppler-page.cc:
+           * glib/poppler-page.h:
+           * glib/poppler-private.h:
+           * glib/poppler.h:
+           * poppler/Annot.cc:
+           * poppler/Annot.h:
+           * poppler/Catalog.cc:
+           * poppler/Catalog.h:
+           * poppler/CharCodeToUnicode.cc:
+           * poppler/CharCodeToUnicode.h:
+           * poppler/Dict.cc:
+           * poppler/Dict.h:
+           * poppler/Form.cc:
+           * poppler/Form.h:
+           * poppler/GfxFont.cc:
+           * poppler/GfxFont.h:
+           * poppler/Makefile.am:
+           * poppler/Object.h:
+           * poppler/Page.cc:
+           * poppler/Page.h:
+           * poppler/XRef.cc:
+           * poppler/XRef.h:
+                   Beginning of Interactive Form support:
+                   Add a bunch of new classes (FormWidget / FormField)
+                   to deal with form
+                   fields.
+                   Add support for object modification through
+                   XRef::setModifiedObject, as
+                   well as a function to write the Xref to a file,
+                   which will be used
+                   to implement PDF writing.
+                   Add some functions to glib wrapper to expose the
+                   new form features.
+
+ ChangeLog                   |   35 ++
+ glib/poppler-document.cc     |  192 +++++++
+ glib/poppler-document.h      |   55 ++
+ glib/poppler-page.cc        |  120 +++++
+ glib/poppler-page.h         |   55 ++
+ glib/poppler-private.h       |    4 +
+ glib/poppler.h                      |   15 +-
+ poppler/Annot.cc            |  344 +++++++++---
+ poppler/Annot.h             |   21 +-
+ poppler/Catalog.cc          |   17 +-
+ poppler/Catalog.h           |    4 +
+ poppler/CharCodeToUnicode.cc |   34 ++
+ poppler/CharCodeToUnicode.h  |    3 +
+ poppler/Dict.cc             |   32 ++
+ poppler/Dict.h                      |    4 +
+ poppler/Form.cc             | 1187
+ ++++++++++++++++++++++++++++++++++++++++++
+ poppler/Form.h                      |  470 +++++++++++++++++
+ poppler/GfxFont.cc          |   27 +
+ poppler/GfxFont.h           |    5 +
+ poppler/Makefile.am         |    2 +
+ poppler/Object.h            |    4 +
+ poppler/Page.cc             |   11 +-
+ poppler/Page.h                      |    8 +-
+ poppler/XRef.cc             |   87 ++++
+ poppler/XRef.h                      |    9 +
+ 25 files changed, 2666 insertions(+), 79 deletions(-)
+
+commit 5c4ea446f33248964431e79b14592b30362634fe
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Sun Feb 18 21:44:24 2007 +0000
+
+    * configure.ac: Change {datadir}/poppler to {datarootdir}/poppler so
+                   that i get /usr/local/share/poppler in config.h
+                   instead of
+                   ${prefix}/poppler Better fixes are welcome.
+
+ ChangeLog    |    6 ++++++
+ configure.ac |    2 +-
+ 2 files changed, 7 insertions(+), 1 deletion(-)
+
+commit dd140dd63de661303b578863af4d515d82117cca
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Sun Feb 4 00:19:25 2007 +0000
+
+    fix date
+
+ ChangeLog |   2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 3c1ed68bf4ee49b27275f7f65d49f42933b1cfa0
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Sun Feb 4 00:16:43 2007 +0000
+
+           * poppler/Lexer.cc:
+           * poppler/Lexer.h: Patch to fix regression introduced by
+           optimizations
+           in bugzilla issue 7808
+
+ ChangeLog       |    6 ++++++
+ poppler/Lexer.cc |   30 ++++++++++++++++++++----------
+ poppler/Lexer.h  |    2 +-
+ 3 files changed, 27 insertions(+), 11 deletions(-)
+
+commit 672408839de0deac4c6006b54df723336ee4be2d
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Wed Jan 31 22:05:09 2007 +0000
+
+    * qt4/src/poppler-page.cc:
+      Patch by Pino Toscano <pino@kde.org> to remove a nonsense done
+      by him.
+
+    * qt4/tests/test-poppler-qt4.cpp:
+      Simply a bit. Patch by Pino Toscano <pino@kde.org>.
+
+ ChangeLog                     |    8 ++++++++
+ qt4/src/poppler-page.cc       |    2 --
+ qt4/tests/test-poppler-qt4.cpp |   24 ++++++++++++------------
+ 3 files changed, 20 insertions(+), 14 deletions(-)
+
+commit 9c64b8c754e09ff2858af56ce38ef013002bf8e4
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Wed Jan 31 18:48:16 2007 +0000
+
+    * m4/qt.m4: Fix Qt4 detection on Mac. Patch by Benjamin Reed
+    <ranger@befunk.com>
+
+ ChangeLog |   5 +++++
+ m4/qt.m4  |   26 +++++++++++++++++++++++---
+ 2 files changed, 28 insertions(+), 3 deletions(-)
+
+commit 1b81192ff2bb9fae4a7bbc685fafe1718f303a7b
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Sun Jan 28 15:55:11 2007 +0000
+
+           * glib/poppler-page.cc: Make link mapping coordinates
+           follow page
+           rotation. Patch by Carlos Garcia Campos <carlosgc@gnome.org>
+           * glib/poppler-action.cc: Fix link destination
+           coordinates. Patch by
+           Carlos Garcia Campos <carlosgc@gnome.org>
+
+ ChangeLog             |    4 ++
+ glib/poppler-action.cc |   15 +++++-
+ glib/poppler-page.cc  |  124
+ ++++++++++++++++++++++++++++++------------------
+ 3 files changed, 97 insertions(+), 46 deletions(-)
+
+commit 75dcf94f53c2d7241111f0d527ee4d3a2ef0b0cf
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Sun Jan 28 15:36:08 2007 +0000
+
+    * glib/poppler-document.cc: Plug memory leak in
+    poppler-document. Patch by Carlos Garcia Campos <carlosgc@gnome.org>
+
+ ChangeLog               |    5 +++++
+ glib/poppler-document.cc |   30 ++++++++++++++----------------
+ 2 files changed, 19 insertions(+), 16 deletions(-)
+
+commit 682a15fc38a2c569d9b1f9871e3e949b62b33cf8
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Sun Jan 21 22:35:23 2007 +0000
+
+          * poppler-document.cc:
+          * poppler-page.cc:
+          * poppler-private.h:
+          * poppler-qt4.h:
+          No need to destroy the Splash output device to change its
+          paper color.
+          Add the possibility to set flags that affect the rendering
+          (some
+          backends supports only some of them, though).
+          Add a Page::label to get the label associated with a page.
+          Patches by Pino Toscano <pino@kde.org>.
+
+ ChangeLog                  |   12 ++++++++++++
+ qt4/src/poppler-document.cc |  20 ++++++++++++++++++++
+ qt4/src/poppler-page.cc     |  14 +++++++++++++-
+ qt4/src/poppler-private.h   |  29 ++++++++++++++++++++++++-----
+ qt4/src/poppler-qt4.h      |   25 +++++++++++++++++++++++++
+ 5 files changed, 94 insertions(+), 6 deletions(-)
+
+commit 7331bc46c1cb323316501f05ae1740bea5655596
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Wed Jan 17 20:06:29 2007 +0000
+
+           * poppler/Sound.h:
+           * poppler/Sound.cc:
+           * qt4/src/poppler-sound.cc: Move most of the sound reading
+           code
+           into the Sound class, so frontends can use it easily.
+           Patch by Pino Toscano <pino@kde.org>.
+
+ ChangeLog               |   10 +++-
+ poppler/Sound.cc        |   80 +++++++++++++++++++++++++-
+ poppler/Sound.h         |   32 ++++++++++-
+ qt4/src/poppler-sound.cc |  144
+ ++++++++++++++++------------------------------
+ 4 files changed, 167 insertions(+), 99 deletions(-)
+
+commit 841bee94da7b6376d2e1fb3daaf8b727b90e42d8
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Sat Jan 13 23:19:21 2007 +0000
+
+           * poppler/Stream.h:
+           * poppler/Stream.cc: Remove MemStream::setNeedFree method
+           i really did
+           not need it
+           * qt4/src/poppler-document.cc:
+           * qt4/src/poppler-link.cc:
+           * qt4/src/poppler-page.cc:
+           * qt4/src/poppler-private.h: Make Document::loadFromData
+           work on
+           documents with a password and don't need to do a malloc and
+           a memcpy.
+
+ ChangeLog                  |   11 +++++++
+ poppler/Stream.cc          |    5 ---
+ poppler/Stream.h           |    1 -
+ qt4/src/poppler-document.cc |  74
+ +++++++++++++++++++++++--------------------
+ qt4/src/poppler-link.cc     |   4 +--
+ qt4/src/poppler-page.cc     |  34 ++++++++++----------
+ qt4/src/poppler-private.h   |  24 ++++++++------
+ 7 files changed, 84 insertions(+), 69 deletions(-)
+
+commit e1432fd7c4a6a2386789f450d39c6d954fd4e656
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Sat Jan 13 18:29:39 2007 +0000
+
+           * configure.ac
+           * poppler/Makefile.am
+           * qt4/src/Makefile.am
+           * qt4/src/poppler-document.cc
+           * qt4/src/poppler-link.cc
+           * qt4/src/poppler-page.cc
+           * qt4/src/poppler-private.h
+           * qt4/src/poppler-qt4.h: Make the Qt4 backend compilable
+           even with
+           no Splash backend. Patch by Pino Toscano <pino@kde.org>.
+
+ ChangeLog                  |   12 ++++++++++++
+ configure.ac               |    5 -----
+ poppler/Makefile.am        |    5 +++--
+ qt4/src/Makefile.am        |    6 +++++-
+ qt4/src/poppler-document.cc |  16 ++++++++++++++--
+ qt4/src/poppler-link.cc     |   1 +
+ qt4/src/poppler-page.cc     |  15 ++++++++++++---
+ qt4/src/poppler-private.h   |   8 +++++++-
+ qt4/src/poppler-qt4.h      |    6 ++++++
+ 9 files changed, 60 insertions(+), 14 deletions(-)
+
+commit 457038e97325720615c4390ffa075dd8283966ee
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Sat Jan 13 17:56:07 2007 +0000
+
+           * poppler/Stream.h:
+           * poppler/Stream.cc: Add MemStream::setNeedFree method
+           * qt4/src/poppler-document.cc:
+           * qt4/src/poppler-private.h:
+           * qt4/src/poppler-qt4.h: Add Document::loadFromData method
+
+ ChangeLog                  |    8 ++++++++
+ poppler/Stream.cc          |    5 +++++
+ poppler/Stream.h           |    1 +
+ qt4/src/poppler-document.cc |  22 ++++++++++++++++++++++
+ qt4/src/poppler-private.h   |  17 +++++++++++++++--
+ qt4/src/poppler-qt4.h      |   16 ++++++++++++++++
+ 6 files changed, 67 insertions(+), 2 deletions(-)
+
+commit 4e2a9c49ecab00b1f5d175570165cd490afdd31e
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Thu Jan 11 22:28:03 2007 +0000
+
+     goo/gmem.c: Merge change from xpdf-3.01pl2
+
+ ChangeLog  |   4 ++++
+ goo/gmem.c |  13 +++++++++++--
+ 2 files changed, 15 insertions(+), 2 deletions(-)
+
+commit bce14b274fd788d728116950d6464a85e33a9966
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Thu Jan 11 22:12:11 2007 +0000
+
+          * poppler/Catalog.h:
+          * poppler/Catalog.cc: Limit max depth of recursive calls on
+          readPageTree to fix MOAB-06-01-2007
+
+ ChangeLog         |    6 ++++++
+ poppler/Catalog.cc |  20 +++++++++++++++-----
+ poppler/Catalog.h  |   2 +-
+ 3 files changed, 22 insertions(+), 6 deletions(-)
+
+commit 3f0679a336ffaf2aff149f8526fa11f8f8cbda59
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Sat Jan 6 21:53:08 2007 +0000
+
+    Patch by Pino Toscano <pino@kde.org> to fix some memory leaks when
+    dealing with sounds.
+
+ ChangeLog               |    9 +++++++++
+ poppler/Sound.cc        |    1 +
+ qt4/src/poppler-link.cc  |    5 +++++
+ qt4/src/poppler-link.h   |    1 +
+ qt4/src/poppler-page.cc  |    4 ++++
+ qt4/src/poppler-sound.cc |    7 ++++++-
+ 6 files changed, 26 insertions(+), 1 deletion(-)
+
+commit d41cd2f567a955031cb7498d9089e70e14df4a42
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Thu Jan 4 19:10:16 2007 +0000
+
+    qt4/src/poppler-private.h: gmallocn -> new[]
+
+ ChangeLog                |    4 ++++
+ qt4/src/poppler-private.h |   2 +-
+ 2 files changed, 5 insertions(+), 1 deletion(-)
+
+commit f8edfb6832144cbbd1b234f6b35e33325269255c
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Thu Jan 4 18:56:13 2007 +0000
+
+    qt/poppler-page-transition.cc: Fix memory leak. Patch by Tobias
+    Koenig <tokoe@kde.org>
+
+ ChangeLog                    |    5 +++++
+ qt/poppler-page-transition.cc |    1 +
+ 2 files changed, 6 insertions(+)
+
+commit 250a9f4b429344e0968c7bd0c0cebe7af373ae0a
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Sat Dec 30 14:50:25 2006 +0000
+
+    * qt4/src/poppler-qt4.h:
+    * qt4/src/poppler-document.cc: Add const & to some parameters. Patch
+    by Pino Toscano <pino@kde.org>
+
+ ChangeLog                  |    6 ++++++
+ qt4/src/poppler-document.cc |   4 ++--
+ qt4/src/poppler-qt4.h      |    4 ++--
+ 3 files changed, 10 insertions(+), 4 deletions(-)
+
+commit 250c1f94cc9a53f980fd08364d6cce29db9fd067
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Fri Dec 29 14:08:35 2006 +0000
+
+    * poppler/UGooString.cc: Patch by Pino Toscano <pino@kde.org> so
+    that QStringToUGooString does not crash.
+
+ ChangeLog            |    5 +++++
+ poppler/UGooString.cc |    1 +
+ 2 files changed, 6 insertions(+)
+
+commit 42770e5f07407b03dce31c73fd6956f9c8fc9a06
+Author: Jeff Muizelaar <jeff@infidigm.net>
+Date:  Fri Dec 29 04:12:40 2006 +0000
+
+    2006-12-28 Brad Taylor  <brad@getcoded.net>
+
+       * poppler/glib/poppler-document.h:
+       * poppler/glib/poppler-document.cc: Add
+       poppler_document_new_from_data
+         to allow loading PDFs out of memory.
+
+ ChangeLog               |    6 +++
+ glib/poppler-document.cc |  113
+ ++++++++++++++++++++++++++++++++++------------
+ glib/poppler-document.h  |    4 ++
+ 3 files changed, 93 insertions(+), 30 deletions(-)
+
+commit 6fedd991b584e300b5710630fa7942d357fe7aaa
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Thu Dec 28 17:22:36 2006 +0000
+
+    * qt4/src/poppler-embeddedfile.cc:
+    * qt4/src/poppler-document.cc:
+    * qt/poppler-document.cc: Fix memory leaks
+
+ ChangeLog                      |    6 ++++++
+ qt/poppler-document.cc                 |    4 ++++
+ qt4/src/poppler-document.cc    |    4 +++-
+ qt4/src/poppler-embeddedfile.cc |    4 +++-
+ 4 files changed, 16 insertions(+), 2 deletions(-)
+
+commit 7da5885e45c33382060276c95d9a3bd117ae55c7
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Thu Dec 28 15:51:44 2006 +0000
+
+    * goo/GooString.cc
+    * goo/GooString.h
+    * goo/gmem.c
+    * goo/gmem.h
+    * poppler/Lexer.cc
+    * poppler/Lexer.h
+    * poppler/PageLabelInfo.cc
+    * poppler/Parser.cc
+    * poppler/UGooString.cc
+    * poppler/UGooString.h: Patch by Krzysztof Kowalczyk
+    <kkowalczyk@gmail.com> to improve performance. See bug 7808 for
+    details.
+
+ ChangeLog               |   15 ++++
+ goo/GooString.cc        |  186
+ +++++++++++++++++++++++-----------------------
+ goo/GooString.h         |   28 +++++--
+ goo/gmem.c              |    3 +-
+ goo/gmem.h              |    2 +-
+ poppler/Lexer.cc        |   19 +++--
+ poppler/Lexer.h         |   10 +++
+ poppler/PageLabelInfo.cc |    1 +
+ poppler/Parser.cc       |   17 +++--
+ poppler/UGooString.cc   |  137 +++++++++++++++++++++++++++-------
+ poppler/UGooString.h    |   40 ++++++++--
+ 11 files changed, 313 insertions(+), 145 deletions(-)
+
+commit fbc05a6791fc28ee26a9d9188722ea3453c65ddc
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Wed Dec 27 23:15:06 2006 +0000
+
+    * poppler/Annot.cc:
+    * poppler/Annot.h: Add type checking to processing of "Rect". Patch
+    by Scott Turner <scotty1024@mac.com>
+
+ ChangeLog       |    6 ++++++
+ poppler/Annot.cc |   48 +++++++++++++++++++++++++++++-------------------
+ poppler/Annot.h  |    1 +
+ 3 files changed, 36 insertions(+), 19 deletions(-)
+
+commit dc6b372358ac629c43aa2faabd644942cb0ed98b
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Wed Dec 27 15:23:04 2006 +0000
+
+    Remove , after last value of enum. Thanks to André Wöbbeking
+
+ ChangeLog        |    1 +
+ poppler/Catalog.h |   2 +-
+ 2 files changed, 2 insertions(+), 1 deletion(-)
+
+commit c7d19539a95927eb277966a521f13393c9e116bb
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Wed Dec 27 12:38:58 2006 +0000
+
+    qt4/src/poppler-qt4.h: Remove , after last value of enum. Thanks to
+    André Wöbbeking
+
+ ChangeLog            |    5 +++++
+ qt4/src/poppler-qt4.h |    4 ++--
+ 2 files changed, 7 insertions(+), 2 deletions(-)
+
+commit b29429c702e6540b9f35689b0a164f30e747d5d9
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Tue Dec 26 20:07:03 2006 +0000
+
+    * qt4/src/poppler-qt4.h:
+    * qt4/src/poppler-page.cc: Add Page::duration() function to the
+    qt4 frontend.
+
+ ChangeLog              |    6 ++++++
+ qt4/src/poppler-page.cc |    8 ++++++++
+ qt4/src/poppler-qt4.h  |    9 ++++++++-
+ 3 files changed, 22 insertions(+), 1 deletion(-)
+
+commit 62dfc58903b496c4cc720c8b2c759c6fb82fb443
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Tue Dec 26 19:56:28 2006 +0000
+
+           * glib/test-poppler-glib.c:
+           * glib/poppler-page.cc:
+           * glib/poppler-page.h:
+           * poppler/Page.cc:
+           * poppler/Page.h: Implement /Dur entry in page object. Patch
+           by Carlos
+           Garcia Campos <carlosgc@gnome.org>
+
+ ChangeLog               |    9 +++++++++
+ glib/poppler-page.cc    |   16 ++++++++++++++++
+ glib/poppler-page.h     |    1 +
+ glib/test-poppler-glib.c |    7 +++++++
+ poppler/Page.cc         |   13 +++++++++++++
+ poppler/Page.h                  |    6 ++++++
+ 6 files changed, 52 insertions(+)
+
+commit 34e5aa62f4d3ba7a2d94a68a91c11a48277a4119
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Sat Dec 23 13:12:13 2006 +0000
+
+           * poppler/PSTokenizer.cc: Enhance PSTokenizer::getToken
+           performance.
+           Patch by Scott Turner <scotty1024@mac.com>. In a random pdf
+           i tested
+           the patchs improves PSTokenizer::getToken performance by 15%
+
+ ChangeLog             |    6 ++++++
+ poppler/PSTokenizer.cc |   33 +++++++++++++++++++++------------
+ poppler/PSTokenizer.h |    1 +
+ 3 files changed, 28 insertions(+), 12 deletions(-)
+
+commit 1a5fa1d2ced62e7d027e085663e987cff625ce0b
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Fri Dec 22 23:39:41 2006 +0000
+
+    poppler/Page.cc: Fix memory leak when reading a wrong color map in
+    a thumbnail. Patch by Scott Turner <scotty1024@mac.com>
+
+ ChangeLog      |    3 +++
+ poppler/Page.cc |    1 +
+ 2 files changed, 4 insertions(+)
+
+commit dd1c134dcf085338a85188c7f205fc300396dc86
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Fri Dec 22 23:27:53 2006 +0000
+
+    qt/poppler-page.cc: Fix memory leak in Page::textList. Patch by
+    Jerry Epplin <jepplin@globalvelocity.com>
+
+ ChangeLog         |    5 +++++
+ qt/poppler-page.cc |   4 +++-
+ 2 files changed, 8 insertions(+), 1 deletion(-)
+
+commit 87e474a018c4808d6251fd79f9e9640e0f733551
+Author: Jeff Muizelaar <jeff@infidigm.net>
+Date:  Thu Dec 21 01:01:30 2006 +0000
+
+    2006-12-20 Jeff Muizelaar  <jeff@infidigm.net>
+
+       * poppler/CairoOutputDev.cc: Fix scaling of maskedImage
+       masks. They
+       should be scaled to the size of the image not the size of
+       the mask.
+       Fixes #9403.
+
+ ChangeLog                |    6 ++++++
+ poppler/CairoOutputDev.cc |   8 ++------
+ 2 files changed, 8 insertions(+), 6 deletions(-)
+
+commit 769a89623c680f51690db1751522b016b02b83a8
+Author: Jeff Muizelaar <jeff@infidigm.net>
+Date:  Wed Dec 20 19:55:55 2006 +0000
+
+    2006-12-20 Jeff Muizelaar  <jeff@infidigm.net>
+
+       * poppler/GlobalParams.cc: Try to make zero-width lines as
+       close to
+       one pixel wide as we can. Fixes #9393.
+
+ ChangeLog                |    5 +++++
+ poppler/CairoOutputDev.cc |   10 ++++++++--
+ 2 files changed, 13 insertions(+), 2 deletions(-)
+
+commit 5c4bca18373528f293bd5e080efca572977fc1ff
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Tue Dec 19 20:27:55 2006 +0000
+
+    poppler/SplashOutputDev.cc: Fix gray calculation. Patch by Scott
+    Turner <scotty1024@mac.com>
+
+ ChangeLog                 |    5 +++++
+ poppler/SplashOutputDev.cc |   2 +-
+ 2 files changed, 6 insertions(+), 1 deletion(-)
+
+commit fba99578f6001ae0c0df0442bb73040b55109b1d
+Author: Jeff Muizelaar <jeff@infidigm.net>
+Date:  Tue Dec 12 05:23:59 2006 +0000
+
+    2006-12-12 Jeff Muizelaar  <jeff@infidigm.net>
+
+       * poppler/CairoOutputDev.cc: Change a cairo_set_matrix to
+       cairo_transform so that we don't blindly clobber the existing
+       matrix.
+       Patch by Daniel Colascione.
+       Fixes #9190.
+
+ ChangeLog                |    7 +++++++
+ poppler/CairoOutputDev.cc |   2 +-
+ 2 files changed, 8 insertions(+), 1 deletion(-)
+
+commit 9a6ffa1c6e009f8606a055f873efdcd5829fcfa2
+Author: Jeff Muizelaar <jeff@infidigm.net>
+Date:  Sun Dec 10 05:24:56 2006 +0000
+
+    2006-12-09 Jeff Muizelaar  <jeff@infidigm.net>
+
+       * poppler/Function.cc: Initialize PostScriptFunction::codeString
+       to
+       NULL so that it can safely deleted if initialization fails.
+       Fixes #9263.
+
+ ChangeLog          |    6 ++++++
+ poppler/Function.cc |   1 +
+ 2 files changed, 7 insertions(+)
+
+commit e92d63a179ae022270156da4e396c15ff9236d89
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Thu Nov 23 19:01:44 2006 +0000
+
+    * m4/libjpeg.m4: Make JPEG library header search work under
+    MSYS. Patch by Alexis Wilke
+
+ ChangeLog     |    5 +++++
+ m4/libjpeg.m4 |    2 +-
+ 2 files changed, 6 insertions(+), 1 deletion(-)
+
+commit 3913110f698fd006b394a395b5b0adfde30af31b
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Wed Nov 22 21:55:27 2006 +0000
+
+    there should not be any whitespace after the \
+
+ qt4/src/Makefile.am |   2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit c3ab7addec5a7990872949b813c2b727b1614d64
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Sun Nov 19 18:51:23 2006 +0000
+
+    Another leak fix on qt4/src/poppler-page.cc the previous changelog
+    is enough for this one ;-)
+
+ qt4/src/poppler-page.cc |    4 ++++
+ 1 file changed, 4 insertions(+)
+
+commit 9e9b82da91abacb916b05302d40bf822af6ac7f1
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Sun Nov 19 12:59:48 2006 +0000
+
+           * qt4/src/poppler-link.cc:
+           * qt4/src/poppler-page.cc:
+           * qt4/src/poppler-qt4.h:
+           * qt4/src/poppler-textbox.cc: Fix memory leaks
+           * splash/Splash.cc: Initialize the values of nClipRes
+
+ ChangeLog                 |    8 ++++++++
+ qt4/src/poppler-link.cc    |   6 ++++++
+ qt4/src/poppler-page.cc    |   4 +++-
+ qt4/src/poppler-qt4.h     |    1 +
+ qt4/src/poppler-textbox.cc |   5 +++++
+ splash/Splash.cc          |    2 +-
+ 6 files changed, 24 insertions(+), 2 deletions(-)
+
+commit b9faacc62182efcbc84df2471e4c5dcf2b03bda8
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Sat Nov 18 17:08:04 2006 +0000
+
+           * qt4/src/poppler-document.cc
+           * qt4/src/poppler-qt4.h: Add int marginRight, int
+           marginBottom, int
+           marginLeft, int marginTop, bool strictMargins to
+           Document::print()
+
+ ChangeLog                  |    6 ++++++
+ qt4/src/poppler-document.cc |  11 +++++++++--
+ qt4/src/poppler-qt4.h      |    6 +++++-
+ 3 files changed, 20 insertions(+), 3 deletions(-)
+
+commit da8e6d4c3e0afdaa031413649ae20545c8a1f845
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Thu Nov 16 21:03:27 2006 +0000
+
+    really commit pino's patch :-S
+
+ qt4/src/Doxyfile            |   11 ++--
+ qt4/src/Mainpage.dox        |   26 +++++-----
+ qt4/src/poppler-annotation.h |   33 +++++++-----
+ qt4/src/poppler-link.h       |   68 +++++++++++++++++++++----
+ qt4/src/poppler-qt4.h       |  115
+ +++++++++++++++++++++++++++---------------
+ 5 files changed, 171 insertions(+), 82 deletions(-)
+
+commit 4f26e65096e3133a39fc0c9e82084c90cf77dda9
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Thu Nov 16 21:00:10 2006 +0000
+
+           * qt4/src/Mainpage.dox:
+           * qt4/src/Doxyfile:
+           * qt4/src/poppler-annotation.h:
+           * qt4/src/poppler-link.h:
+           * qt4/src/poppler-qt4.h: Improve API documentation. Patch by
+           Pino Toscano.
+
+    Generated docu at http://people.freedesktop.org/~aacid/docs/qt4/
+
+ ChangeLog           |    9 +++++++++
+ qt4/src/Mainpage.dox |    2 +-
+ 2 files changed, 10 insertions(+), 1 deletion(-)
+
+commit e68b6f3f8fea1e4f036eba0f19bb7e0c423d408c
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Wed Nov 15 21:07:50 2006 +0000
+
+    2006-11-15 Albert Astals Cid <aacid@kde.org>
+
+           * qt4/src/poppler-link.cc:
+           * qt4/src/poppler-page.cc:
+           * qt4/src/poppler-qt4.h:
+           * qt4/src/poppler-document.cc:
+           * qt4/src/poppler-private.h: Generalize the way we render
+           the pages:
+           merge all the Page::renderTo* functions in only one that
+           renders on
+           a QImage, taking into account the currently chosen backend.
+           It is possible to switch rendering backend using the Document.
+           Patch by Pino Toscano.
+
+           * qt4/tests/stress-poppler-qt4.cpp:
+           * qt4/tests/test-password-qt4.cpp:
+           * qt4/tests/test-poppler-qt4.cpp: Adapt the tests to the
+           changes in
+           the rendering API of Page. Patch by Pino Toscano.
+
+ ChangeLog                       |   17 ++++++
+ qt4/src/poppler-document.cc     |   14 +++++
+ qt4/src/poppler-link.cc         |    2 +-
+ qt4/src/poppler-page.cc         |  123
+ ++++++++++++++++++++------------------
+ qt4/src/poppler-private.h       |   32 ++++++----
+ qt4/src/poppler-qt4.h           |   75 +++++++----------------
+ qt4/tests/stress-poppler-qt4.cpp |    3 +-
+ qt4/tests/test-password-qt4.cpp  |   12 ++--
+ qt4/tests/test-poppler-qt4.cpp   |   17 +++---
+ 9 files changed, 152 insertions(+), 143 deletions(-)
+
+commit 37088dd3335be6e7641c47bea9b1ddd689b07372
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Mon Nov 13 19:16:44 2006 +0000
+
+           * poppler/ArthurOutputDev.cc: Small fix to get colors right
+
+ ChangeLog                 |    4 ++++
+ poppler/ArthurOutputDev.cc |   8 ++++----
+ 2 files changed, 8 insertions(+), 4 deletions(-)
+
+commit 302e2cab9fd626222c69ad40f7e40be2e65d34a9
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Sat Nov 11 15:41:27 2006 +0000
+
+    Fix typo when outputing PS scale
+
+ ChangeLog             |    4 ++++
+ poppler/PSOutputDev.cc |    2 +-
+ 2 files changed, 5 insertions(+), 1 deletion(-)
+
+commit e3550fb286dae98992b30edbf4a9300fa58d2e77
+Author: Jeff Muizelaar <jeff@infidigm.net>
+Date:  Tue Nov 7 23:53:31 2006 +0000
+
+    2006-11-07 Jeff Muizelaar  <jeff@infidigm.net>
+
+       * poppler/CairoOutputDev.cc: take horizontal scaling into account
+       when updating the font. Also, cleanup some unused code. Fixes
+       #8924.
+
+ ChangeLog                |    5 +++++
+ poppler/CairoOutputDev.cc |   9 ++-------
+ 2 files changed, 7 insertions(+), 7 deletions(-)
+
+commit f020b64a72ad5c82c3e7bdcf15039bb0037b1f22
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Wed Oct 18 18:43:59 2006 +0000
+
+    2006-10-18 Albert Astals Cid <aacid@kde.org>
+
+          * qt4/src/poppler-document.cc:
+          * qt4/src/poppler-private.h: Do not crash when opening a
+          encrypted document. Do not crash when unlocking a locked
+          document.
+
+ ChangeLog                  |    7 +++++++
+ qt4/src/poppler-document.cc |  41
+ ++++++++++++++++-------------------------
+ qt4/src/poppler-private.h   |  14 ++++++++++++++
+ 3 files changed, 37 insertions(+), 25 deletions(-)
+
+commit 577330ee1d4d1021174cf1bd59557a83a017e06f
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Wed Oct 11 23:09:24 2006 +0000
+
+          * splash/Splash.cc:
+          * splash/SplashErrorCodes.h: Do not crash on documents that
+          report a
+            0x0 mask for an image, like
+            http://bugs.kde.org/attachment.cgi?id=18083&action=view
+
+ ChangeLog                |    7 +++++++
+ splash/Splash.cc         |    2 ++
+ splash/SplashErrorCodes.h |   2 ++
+ 3 files changed, 11 insertions(+)
+
+commit 42c016c6d3c6de65fd92b51b9d6cc96d52404689
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Sun Oct 8 20:38:47 2006 +0000
+
+           * poppler/Link.cc:
+           * poppler/Link.h:
+           * poppler/Makefile.am:
+           * poppler/Page.cc:
+           * poppler/Page.h:
+           * poppler/Sound.cc:
+           * poppler/Sound.h: Make poppler able to read Sound objects,
+           Sound
+           actions and Opening/Closing page actions. Patch by Pino
+           Toscano.
+
+           * qt4/src/Makefile.am:
+           * qt4/src/poppler-link.cc:
+           * qt4/src/poppler-link.h:
+           * qt4/src/poppler-qt4.h:
+           * qt4/src/poppler-page.cc:
+           * qt4/src/poppler-sound.cc: Support for sounds, sound links
+           and page
+           actions in the Qt4 backend. Patch by Pino Toscano.
+
+ ChangeLog               |   19 +++++
+ poppler/Link.cc         |   53 ++++++++++++++
+ poppler/Link.h                  |   32 +++++++++
+ poppler/Makefile.am     |    2 +
+ poppler/Page.cc         |    8 +++
+ poppler/Page.h                  |    4 ++
+ poppler/Sound.cc        |   65 +++++++++++++++++
+ poppler/Sound.h         |   46 ++++++++++++
+ qt4/src/Makefile.am     |    1 +
+ qt4/src/poppler-link.cc  |   35 +++++++++
+ qt4/src/poppler-link.h   |   26 ++++++-
+ qt4/src/poppler-page.cc  |   32 +++++++++
+ qt4/src/poppler-qt4.h   |   87 +++++++++++++++++++++++
+ qt4/src/poppler-sound.cc |  177
+ ++++++++++++++++++++++++++++++++++++++++++++++
+ 14 files changed, 586 insertions(+), 1 deletion(-)
+
+commit 1da064d7e7403ec7111eecb2b9613e27a2c4bb5d
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Sat Sep 30 16:28:35 2006 +0000
+
+     * qt4/src/poppler-page.cc: PA is optional, H is a name not a string
+
+ ChangeLog              |    4 ++++
+ qt4/src/poppler-page.cc |   15 +++++++++------
+ 2 files changed, 13 insertions(+), 6 deletions(-)
+
+commit 29366d8e470ab2207cdfdab115c2fa9618c4c74e
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Mon Sep 25 20:43:18 2006 +0000
+
+           * glib/Makefile.am
+           * qt/Makefile.am
+           * qt4/src/Makefile.am
+           * qt4/tests/Makefile.am
+           * test/Makefile.am
+           * utils/Makefile.am: Add FONTCONFIG_CFLAGS FONTCONFIG_LIBS
+           for people
+           that need them. Patch by morfoh@opensde.org. Fixes bug #8415
+
+ ChangeLog            |   10 ++++++++++
+ glib/Makefile.am      |    2 ++
+ qt/Makefile.am        |    6 ++++--
+ qt4/src/Makefile.am   |    2 ++
+ qt4/tests/Makefile.am |    2 ++
+ test/Makefile.am      |    6 ++++--
+ utils/Makefile.am     |    6 ++++--
+ 7 files changed, 28 insertions(+), 6 deletions(-)
+
+commit 957c1e59df213a01ca87f03d067a8dab5dc09fb6
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Mon Sep 25 20:05:28 2006 +0000
+
+    ignore poppler-features.h
+
+ glib/.cvsignore |    1 +
+ 1 file changed, 1 insertion(+)
+
+commit 3158b54375bdfdc82779362cc9442aade87f84f6
+Author: Kristian Høgsberg <krh@redhat.com>
+Date:  Fri Sep 22 00:55:54 2006 +0000
+
+    2006-09-21 Kristian Høgsberg  <krh@redhat.com>
+
+       * NEWS: Update list of bugs fixes, release 0.5.4.
+
+ ChangeLog |   2 ++
+ NEWS     |    2 +-
+ 2 files changed, 3 insertions(+), 1 deletion(-)
+
+commit 17dd1f60f9328ae68fbe262ae0745be976ff9f95
+Author: Kristian Høgsberg <krh@redhat.com>
+Date:  Thu Sep 21 23:28:14 2006 +0000
+
+    2006-09-21 Kristian Høgsberg  <krh@redhat.com>
+
+       * configure.ac: Check for gtk+ 2.8 for the gtk+ test case, invert
+       help text for zlib option (#7788, #7661).
+
+ ChangeLog    |    3 +++
+ configure.ac |   12 +++++-------
+ 2 files changed, 8 insertions(+), 7 deletions(-)
+
+commit ddbbd697424b9122ce1f0541ddada3fe8bb38fb1
+Author: Kristian Høgsberg <krh@redhat.com>
+Date:  Thu Sep 21 22:58:31 2006 +0000
+
+    2006-09-21 Kristian Høgsberg  <krh@redhat.com>
+
+       * utils/pdftops.cc: Get duplex setting from GlobalParams.
+
+ ChangeLog       |    2 ++
+ utils/pdftops.cc |    3 ++-
+ 2 files changed, 4 insertions(+), 1 deletion(-)
+
+commit 0d25592a1a5811ee8fffbd70307c7bcaaaacadf3
+Author: Kristian Høgsberg <krh@redhat.com>
+Date:  Thu Sep 21 22:40:52 2006 +0000
+
+    2006-09-21 Kristian Høgsberg  <krh@redhat.com>
+
+       * glib/poppler-page.cc (_poppler_page_new): Make PopplerPage
+       reference its document throughout the lifetime of the page
+       (#7005).
+
+ ChangeLog           |    3 +++
+ glib/poppler-page.cc |    5 ++++-
+ 2 files changed, 7 insertions(+), 1 deletion(-)
+
+commit b834755c7ae45eb4020e9cdbc3852eac0151fcdc
+Author: Kristian Høgsberg <krh@redhat.com>
+Date:  Thu Sep 21 22:37:00 2006 +0000
+
+    2006-09-21 Kristian Høgsberg  <krh@redhat.com>
+
+       * poppler/Gfx.cc: Remove the right out->updateAll() call.
+
+ ChangeLog     |    4 ++++
+ poppler/Gfx.cc |    2 +-
+ 2 files changed, 5 insertions(+), 1 deletion(-)
+
+commit 181e2af1edf2cbc3c8edadad0dce215a64a990dd
+Author: Kristian Høgsberg <krh@redhat.com>
+Date:  Thu Sep 21 01:05:23 2006 +0000
+
+    2006-09-20 Kristian Høgsberg  <krh@redhat.com>
+
+       * NEWS: Sum up changes.
+
+       * configure.ac: Bump release to 0.5.4.
+
+ ChangeLog    |    4 ++++
+ NEWS        |   10 ++++++++++
+ configure.ac |    2 +-
+ 3 files changed, 15 insertions(+), 1 deletion(-)
+
+commit cc9c17a6730422be99ebcd69991fcf5d7b569640
+Author: Kristian Høgsberg <krh@redhat.com>
+Date:  Thu Sep 21 00:56:33 2006 +0000
+
+    2006-09-20 Kristian Høgsberg  <krh@redhat.com>
+
+       * poppler/Gfx.cc: Remove last remnant of erroneous type3 commit a
+       while back, fixing #8182.
+
+ ChangeLog                |    5 +++++
+ poppler/CairoOutputDev.cc |   1 -
+ poppler/Gfx.cc                   |    1 -
+ 3 files changed, 5 insertions(+), 2 deletions(-)
+
+commit 83be722b56d9266b89946fe994023351e47eb4fd
+Author: Jeff Muizelaar <jeff@infidigm.net>
+Date:  Wed Sep 20 20:22:19 2006 +0000
+
+    2006-09-20 Jeff Muizelaar  <jeff@infidigm.net>
+
+       * poppler/TextOutputDev.cc: TextFontInfo stores a copy of
+       a pointer
+       to a GfxFont but does not increment the reference count. Fix the
+       problem by calling incRefCnt and decRefCnt appropriately. Fixes
+       #4649
+
+ ChangeLog               |    6 ++++++
+ poppler/TextOutputDev.cc |    4 ++++
+ 2 files changed, 10 insertions(+)
+
+commit 1cf60015d7d78668c83737be6015dc880fd04ebf
+Author: Kristian Høgsberg <krh@redhat.com>
+Date:  Tue Sep 19 04:39:07 2006 +0000
+
+    2006-09-19 Kristian Høgsberg  <krh@redhat.com>
+
+       * poppler/GlobalParams.cc: Add scanEncodingDirs() to automatically
+       scan in any encodings found under ${datadir}/poppler.
+
+       * m4/define-dir.m4: New file, adds AC_DEFINE_DIR macro.
+
+ ChangeLog              |    7 +++
+ configure.ac           |   16 +------
+ goo/gfile.cc           |   16 +++----
+ goo/gfile.h            |    2 +
+ m4/define-dir.m4       |   34 ++++++++++++++
+ poppler/GlobalParams.cc |  116
+ +++++++++++++++++++++++++++++++----------------
+ poppler/GlobalParams.h  |    7 ++-
+ 7 files changed, 136 insertions(+), 62 deletions(-)
+
+commit 821c883f9df9cc0e5b81aa2e070727996cf3bc4e
+Author: Kristian Høgsberg <krh@redhat.com>
+Date:  Mon Sep 18 15:40:50 2006 +0000
+
+    2006-09-13 Kristian Høgsberg  <krh@redhat.com>
+
+       * poppler/Makefile.am (libpoppler_la_LIBADD): Add cairo libs to
+       link if configured.
+
+ ChangeLog          |    3 +++
+ poppler/Makefile.am |   4 ++++
+ 2 files changed, 7 insertions(+)
+
+commit d8ab8ebc94c32d32ad17ed54cede453de25d7dd5
+Author: Kristian Høgsberg <krh@redhat.com>
+Date:  Wed Sep 13 20:25:03 2006 +0000
+
+    2006-09-13 Kristian Høgsberg  <krh@redhat.com>
+
+       * configure.ac: Tighten glib check (#7906), add check for C++
+       compiler (#8048).
+
+ ChangeLog    |    5 +++++
+ configure.ac |    3 ++-
+ 2 files changed, 7 insertions(+), 1 deletion(-)
+
+commit 7c748075e18cfe95be6a56adf09ce7f2f032b86f
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Tue Sep 12 19:48:47 2006 +0000
+
+    sorry Jeff
+
+ ChangeLog |   7 +++++++
+ 1 file changed, 7 insertions(+)
+
+commit 6cdcfae0e1c6fbec07ee5273e6ad97ef04110868
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Mon Sep 11 21:20:56 2006 +0000
+
+    2006-09-11 Albert Astals Cid <aacid@kde.org>
+
+           * qt4/src/poppler-annotation.cc:
+           * qt4/src/poppler-annotation.h:
+           * qt4/src/poppler-page.cc: Add support for
+           LinkAnnotation. Patch by
+           Pino Toscano
+
+ ChangeLog                    |   10 +-
+ qt4/src/poppler-annotation.cc |  230
+ ++++++++++++++++++++++++++++++++++++++-
+ qt4/src/poppler-annotation.h  |   22 +++-
+ qt4/src/poppler-page.cc       |  237
+ +++++++++++++++++++++++++----------------
+ 4 files changed, 392 insertions(+), 107 deletions(-)
+
+commit 8335c7eea2aa62a580170f47323d8674bd89e412
+Author: Jeff Muizelaar <jeff@infidigm.net>
+Date:  Fri Sep 8 23:28:22 2006 +0000
+
+    2006-09-08 Jeff Muizelaar  <jeff@infidigm.net>
+
+       * poppler/CairoOutputDev.cc: The work-around for 1x1 imagemasks
+       was not
+       calling cairo_set_source causing the rectangles to be drawn
+       the wrong
+       colour occasionally. Fix by moving the existing call to
+       cairo_set_source above the work-around. Fixes #7113.
+
+ ChangeLog                |    7 +++++++
+ poppler/CairoOutputDev.cc |   8 ++++----
+ 2 files changed, 11 insertions(+), 4 deletions(-)
+
+commit 02d505aa0176b6e5a54ee82426d8333a9ef8f000
+Author: Jeff Muizelaar <jeff@infidigm.net>
+Date:  Thu Sep 7 04:01:39 2006 +0000
+
+    2006-09-06 Jeff Muizelaar  <jeff@infidigm.net>
+
+       * poppler/CairoOutputDev.cc: Avoid crashing in CairoOutputDev if
+       endString is called without a corresponding beginString. Fixes
+       #4515.
+
+ ChangeLog                |    5 +++++
+ poppler/CairoOutputDev.cc |   8 +++++++-
+ 2 files changed, 12 insertions(+), 1 deletion(-)
+
+commit 3ea0aada0434c9f815814253dd9d1374ae6643cc
+Author: Jeff Muizelaar <jeff@infidigm.net>
+Date:  Wed Sep 6 23:54:30 2006 +0000
+
+    2006-09-06 Jeff Muizelaar  <jeff@infidigm.net>
+
+       * configure.ac:
+       * poppler/FlateStream.cc:
+       * poppler/FlateStream.h: Fix FlateStream to not read more than it
+       needs. This has a performance impact because our input buffer
+       is now
+       only 1 byte large, however correctness is better than performance.
+       This should fix #3948.
+
+ ChangeLog             |    9 +++++++++
+ configure.ac          |    2 +-
+ poppler/FlateStream.cc |   35 +++++++++++++++++++++++++----------
+ poppler/FlateStream.h |    3 ++-
+ 4 files changed, 37 insertions(+), 12 deletions(-)
+
+commit 1d2e6aedca0b8fcce6ac84ae2576ab067912886b
+Author: Jeff Muizelaar <jeff@infidigm.net>
+Date:  Tue Sep 5 01:21:50 2006 +0000
+
+    2006-09-04 Jeff Muizelaar  <jeff@infidigm.net>
+
+       * poppler/CairoOutputDev.cc: Initialize currentFont to NULL before
+       use. Found by Pascal Terjan. Fixes #7924.
+
+ ChangeLog                |    5 +++++
+ poppler/CairoOutputDev.cc |   1 +
+ 2 files changed, 6 insertions(+)
+
+commit 7905adaa21f2347346927fa567c64be60e2bc69c
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Sun Sep 3 09:27:21 2006 +0000
+
+           * poppler/Dict.cc:
+           * poppler/Dict.h:
+           * poppler/Object.h:
+           * poppler/Parser.cc: Patch by Krzysztof Kowalczyk to increase
+           speed by
+           means of doing less copies between objects. See bug 8112
+           for more
+           information.
+
+ ChangeLog        |    9 +++++++++
+ poppler/Dict.cc   |   4 ++--
+ poppler/Dict.h    |   11 +++++++++--
+ poppler/Object.h  |   12 ++++++++++++
+ poppler/Parser.cc |   15 +++++++++------
+ 5 files changed, 41 insertions(+), 10 deletions(-)
+
+commit 4da7c90a619002e54f436c4efee723b5bc42a112
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Thu Aug 24 22:32:31 2006 +0000
+
+     * qt4/src/poppler-private.h: Init m_fontInfoScanner to
+     NULL. Discovered by
+           Rafael Rodríguez <rafael.rodriguez.tf@gmail.com>
+
+ ChangeLog                |    5 +++++
+ qt4/src/poppler-private.h |   2 +-
+ 2 files changed, 6 insertions(+), 1 deletion(-)
+
+commit 469202e117910beb4e0ad906d5c154a3bae5c98b
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Wed Aug 16 14:35:14 2006 +0000
+
+    * qt/poppler-page.cc: Report correct page size. Backport from Qt4
+      frontend. Patch by Wilfried Huss
+
+ ChangeLog         |    5 +++++
+ qt/poppler-page.cc |  10 ++++++++--
+ 2 files changed, 13 insertions(+), 2 deletions(-)
+
+commit b881844e4d31009c5d54c9321a6daaf0f354cf6b
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Wed Aug 16 09:18:04 2006 +0000
+
+    did not want to commit that, thanks Brad for noticing!
+
+ configure.ac |    2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit f52380e6d569280839d7c37362bd7cc59f2573c3
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Tue Aug 15 22:27:31 2006 +0000
+
+    add a warning how nasty zlib can be, it can come and it your pdfs
+    and make your readers crash when you are not looking at it, so be
+    aware that if you enable it you are on your own ;-)
+
+ ChangeLog    |    4 ++++
+ configure.ac |    4 ++--
+ 2 files changed, 6 insertions(+), 2 deletions(-)
+
+commit 1caba84b1024f1fa7865deebbf70379855ce078d
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Fri Aug 11 13:12:11 2006 +0000
+
+    2006-08-11 Albert Astals Cid  <aacid@kde.org>
+
+           * poppler/Catalog.cc: Fix leak
+
+ ChangeLog         |    4 ++++
+ poppler/Catalog.cc |   1 +
+ 2 files changed, 5 insertions(+)
+
+commit 9b6455f6530e273afaa5f948b67ceeec8a06f976
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Thu Aug 10 16:08:51 2006 +0000
+
+    2006-08-10 Albert Astals Cid  <aacid@kde.org>
+
+           * poppler/SplashOutputDev.cc: Try to fix refs to fonts
+           yet again
+
+ ChangeLog                 |    4 ++++
+ poppler/SplashOutputDev.cc |   4 ++--
+ 2 files changed, 6 insertions(+), 2 deletions(-)
+
+commit 305f60e0437dcfc5babd449123a1fe4cd062a219
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Sat Aug 5 17:10:07 2006 +0000
+
+    2006-08-05 Albert Astals Cid  <aacid@kde.org>
+
+           * poppler/Catalog.cc: The name array can contain references
+           to strings
+           instead of stings themselves, or at least PDF of
+           https://bugs.freedesktop.org/show_bug.cgi?id=7780 does. This
+           makes it
+           work with that file
+           * qt4/src/poppler-embeddedfile.cc: Use UGooString for
+           description
+
+ ChangeLog                      |    8 ++++++++
+ poppler/Catalog.cc             |   12 ++++++++++--
+ qt4/src/poppler-embeddedfile.cc |    3 ++-
+ 3 files changed, 20 insertions(+), 3 deletions(-)
+
+commit dd8758ea3f0f44e9f8362343f15b2064f428ad64
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Fri Aug 4 22:48:09 2006 +0000
+
+    2006-08-05 Albert Astals Cid  <aacid@kde.org>
+
+           * utils/pdftotext.cc:
+           * utils/pdfinfo.cc:
+           * utils/pdffonts.cc: Add the posibility of reading a file
+           from stdin.
+           Patch by Dom Lachowicz
+
+ ChangeLog         |    7 +++++++
+ utils/pdffonts.cc  |  11 ++++++++++-
+ utils/pdfinfo.cc   |  11 ++++++++++-
+ utils/pdftotext.cc |  11 ++++++++++-
+ 4 files changed, 37 insertions(+), 3 deletions(-)
+
+commit a418d844cf6baa797919796ceadaf21ef9b2e5b9
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Thu Aug 3 10:34:52 2006 +0000
+
+           * configure.ac: Use the correct variable to output the
+           utils status.
+           Patch by Dom Lachowic
+
+ ChangeLog    |    5 +++++
+ configure.ac |    2 +-
+ 2 files changed, 6 insertions(+), 1 deletion(-)
+
+commit 1673b895656143a8a1f1a45e07f777f39995940d
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Sun Jul 30 20:31:31 2006 +0000
+
+           * poppler/GfxState.cc: make nGfxBlendModeNames define
+           return the
+           correct size of the gfxBlendModeNames array so it does
+           not access
+           invalid memory areas when the blend mode is not
+           found. Discovered by
+           Krzysztof Kowalczyk
+
+ ChangeLog          |    7 +++++++
+ poppler/GfxState.cc |  12 +++++++-----
+ 2 files changed, 14 insertions(+), 5 deletions(-)
+
+commit e4561568d14e7b3b2aec6ecaf3cc09078bdf7a46
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Sun Jul 30 09:38:28 2006 +0000
+
+           * splash/SplashFontEngine.cc:
+           * poppler/SplashOutputDev.cc: Fix memory leak when using
+           embedded
+           fonts in the pdf file. Patch by Krzysztof Kowalczyk
+
+ ChangeLog                 |    6 ++++++
+ poppler/SplashOutputDev.cc |   8 ++++++--
+ splash/SplashFontEngine.cc |  12 ++++++++----
+ 3 files changed, 20 insertions(+), 6 deletions(-)
+
+commit 4a27502159a89992f54be2673b44bf7a8392b60d
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Sat Jul 29 16:24:53 2006 +0000
+
+    push back thing i did not want to commit, sorry
+
+ configure.ac |    4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit ba448afc0e97a9e779409ff228adcd4f627971f5
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Sat Jul 29 16:22:52 2006 +0000
+
+           * configure.ac: Disable qt and qt4 frontends if splash
+           backend is
+           disabled
+
+ ChangeLog    |    5 +++++
+ configure.ac |   18 ++++++++++++++----
+ 2 files changed, 19 insertions(+), 4 deletions(-)
+
+commit 1e32d3baa5e8296caf55bd5853216a96618c74ac
+Author: Kristian Høgsberg <krh@redhat.com>
+Date:  Fri Jul 28 18:17:45 2006 +0000
+
+    2006-07-28 Kristian Høgsberg  <krh@redhat.com>
+
+       * poppler/CairoOutputDev.cc: Don't set font matrix translation
+       (fix from Behdad Esfahbod).
+
+ ChangeLog                |    5 +++++
+ poppler/CairoOutputDev.cc |   4 ++--
+ 2 files changed, 7 insertions(+), 2 deletions(-)
+
+commit 0bc1b0f35c28cb80dd27d24110367348e52c143b
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Thu Jul 27 18:21:28 2006 +0000
+
+    fix date, i don't live in the past
+
+ ChangeLog |   2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 2f27c3a0218608568f6cd1c718ef51b9879023a3
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Thu Jul 27 18:17:50 2006 +0000
+
+           * poppler/Stream.cc: If you are going to test a variable,
+           better
+           initialize it first ;-) Fixes bug 7646
+
+ ChangeLog        |    5 +++++
+ poppler/Stream.cc |   2 +-
+ 2 files changed, 6 insertions(+), 1 deletion(-)
+
+commit f39ab43ca824cb7e5db73137c4545b3e85134425
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Wed Jul 26 18:16:01 2006 +0000
+
+    2006-07-26 Albert Astals Cid  <aacid@kde.org>
+
+           * qt/poppler-document.cc:
+           * qt/poppler-private.h:
+           * qt/poppler-qt.h: Port the QDomDocument *Document::toc()
+           const method
+           from the qt4 frontend to the qt frontend. Patch by Wilfried
+           Huss
+
+ ChangeLog             |    7 ++++++
+ qt/poppler-document.cc |   18 +++++++++++++++
+ qt/poppler-private.h  |   58
+ ++++++++++++++++++++++++++++++++++++++++++++++++
+ qt/poppler-qt.h       |   16 +++++++++++++
+ 4 files changed, 99 insertions(+)
+
+commit c3a9fd546b853c85b6be5fc8f4e5a78d8a7e7437
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Tue Jul 25 18:39:57 2006 +0000
+
+           * qt4/src/poppler-document.cc: Obey kdeprint masters in that
+           a library
+           should output as much device independent PS as posible,
+           so disabling
+           duplex printing for default is a good idea.
+
+ ChangeLog                  |    6 ++++++
+ qt4/src/poppler-document.cc |   2 +-
+ 2 files changed, 7 insertions(+), 1 deletion(-)
+
+commit edc0499644b8083600ced9a5087ec0b0189e615b
+Author: Kristian Høgsberg <krh@redhat.com>
+Date:  Mon Jul 24 19:49:51 2006 +0000
+
+    2006-07-24 Kristian Høgsberg  <krh@redhat.com>
+
+       * configure.ac:
+       * poppler/Makefile.am: Move fontconfig dependency to libpoppler.
+
+ ChangeLog          |    5 +++++
+ configure.ac       |   18 +++++++-----------
+ poppler/Makefile.am |   6 ++++--
+ 3 files changed, 16 insertions(+), 13 deletions(-)
+
+commit 24b5a68a3f4cdba63fbcd01dc178a330b5f604a7
+Author: Jeff Muizelaar <jeff@infidigm.net>
+Date:  Tue Jul 18 21:32:11 2006 +0000
+
+    2006-07-18 Jeff Muizelaar  <jeff@infidigm.net>
+
+       * poppler/Gfx.cc: fix opCloseStroke to match the behaviour of
+       a separate opClose and opStroke. Previously, opCloseStroke only
+       closes if there is a path however opClose closes unconditionally.
+
+ ChangeLog     |    6 ++++++
+ poppler/Gfx.cc |    2 +-
+ 2 files changed, 7 insertions(+), 1 deletion(-)
+
+commit c57ebd40fcf85432b2e5045086d158a63af12525
+Author: Jeff Muizelaar <jeff@infidigm.net>
+Date:  Tue Jul 18 21:26:57 2006 +0000
+
+    2006-07-18 Jeff Muizelaar  <jeff@infidigm.net>
+
+       * poppler/TextOutputDev.cc: call setDefaultCTM() after start page
+       like in Gfx.cc. This fixes a regression caused by the fix
+       to #6948.
+
+ ChangeLog               |    5 +++++
+ poppler/TextOutputDev.cc |    1 +
+ 2 files changed, 6 insertions(+)
+
+commit 640d5d5a9d9e53f3f677eb05f3d18e6bfc74e95a
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Sun Jul 16 18:22:23 2006 +0000
+
+    2006-07-16 Albert Astals Cid  <aacid@kde.org>
+
+           * poppler/GfxState.cc: Do not crash when we can not
+           parse a GfxImageColorMap
+           Fixes crash on pdf that can be found at
+
+ ChangeLog          |    7 +++++++
+ poppler/GfxState.cc |   4 ++++
+ qt4/src/Doxyfile    |   4 ++--
+ 3 files changed, 13 insertions(+), 2 deletions(-)
+
+commit c6926d1d8ab04468f56f4687cdd3f06af206226b
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Wed Jun 28 19:23:52 2006 +0000
+
+       * poppler/DCTStream.cc:
+           * poppler/DCTStream.h: Reset jpeg structures on reset.
+           Fixes crash while printing pdf at
+           http://bugs.kde.org/attachment.cgi?id=16818&action=view
+
+ ChangeLog           |    7 +++++++
+ poppler/DCTStream.cc |   25 ++++++++++++++++++-------
+ poppler/DCTStream.h  |    2 ++
+ 3 files changed, 27 insertions(+), 7 deletions(-)
+
+commit 96ac8dec591a0325a822c1f7b7bc7e78b867e3a0
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Sun Jun 25 16:59:31 2006 +0000
+
+    Ask for paper size width and height to pass it to PSOutputDev in
+    both qt frontends (qt got abi mantained, qt4 changed as you still
+    have to define UNSTABLE_POPPLER_QT4 to be able of using it, one day
+    we'll have to think of removing it)
+
+ ChangeLog                  |    8 ++++++++
+ qt/poppler-document.cc      |   9 +++++++--
+ qt/poppler-qt.h            |    9 +++++++++
+ qt4/src/poppler-document.cc |   4 ++--
+ qt4/src/poppler-qt4.h      |   10 +++++++++-
+ 5 files changed, 35 insertions(+), 5 deletions(-)
+
+commit 965011f2001fb1ea36857995d5555266f82b8d96
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Sun Jun 25 16:20:50 2006 +0000
+
+    put back a change that was not meant to be commited
+
+ qt/poppler-qt.h |    2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 4995d09c91173d34a435112828aff21a63b147e9
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Sun Jun 25 16:19:32 2006 +0000
+
+    rename poppler-link.h to poppler-link-qt3.h to not get conflicts
+    on install
+
+ qt/Makefile.am        |    2 +-
+ qt/poppler-link-qt3.h |  188 +++++++++++++++++++++++++++++++++++
+ qt/poppler-link.cc    |  258
+ +++++++++++++++++++++++++++++++++++++++++++++++++
+ qt/poppler-qt.h       |    4 +-
+ 4 files changed, 449 insertions(+), 3 deletions(-)
+
+commit 087921b134c2646e6d41960f471a1819c7c8790a
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Sun Jun 25 10:29:22 2006 +0000
+
+    add link support to qt3 frontend.
+    Patch by Wilfried Huss based on Qt4 code
+
+ ChangeLog             |   11 ++++
+ qt/Makefile.am                |    4 +-
+ qt/poppler-document.cc |   19 ++++---
+ qt/poppler-page.cc    |  136
+ +++++++++++++++++++++++++++++++++++++++++++++---
+ qt/poppler-private.h  |   33 +++++++++++-
+ qt/poppler-qt.h       |   14 +++--
+ 6 files changed, 196 insertions(+), 21 deletions(-)
+
+commit 831bd8942ef3224354b128d5e14e68fdfc57168b
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Sun Jun 11 16:14:32 2006 +0000
+
+    optimization by Mario Teijeiro Otero
+
+ poppler/UGooString.cc |    2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 1223fd4b200f6c13996f8299f3563c818af0c21d
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Sat Jun 10 22:23:19 2006 +0000
+
+           * poppler/UGooString.cc: When any of the chars that we
+           are passing to the UGooString is not pdfencodable, do not
+           encode the string, because we loose information if we do,
+           this fixes rendering of
+           http://publikationen.ub.uni-frankfurt.de/volltexte/2005/890/pdf/TR_abs_g.pdf
+           and other docs with type3 fonts and ligatures
+
+ ChangeLog            |    9 +++++++++
+ poppler/UGooString.cc |    8 ++++++++
+ 2 files changed, 17 insertions(+)
+
+commit b85a39ddfc7de8c0621e995c114885ecd08fcdc2
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Thu Jun 1 21:03:38 2006 +0000
+
+           * qt4/src/poppler-qt4.h:
+           * qt4/src/poppler-page.cc: Add Rotation parameter that
+           is  passed
+           to the respective output devs
+
+ ChangeLog              |    6 ++++++
+ qt4/src/poppler-page.cc |   22 ++++++++++++++--------
+ qt4/src/poppler-qt4.h  |   14 +++++++++-----
+ 3 files changed, 29 insertions(+), 13 deletions(-)
+
+commit 2b5d3277f36864ff1ef44f1942f22de247d67ab6
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Thu Jun 1 17:23:45 2006 +0000
+
+           * qt/poppler-document.cc:
+           * qt/poppler-qt.h: Add printing support, patch by
+           Stefan Kebekus <stefan.kebekus@math.uni-koeln.de>
+
+ ChangeLog             |    6 ++++++
+ qt/poppler-document.cc |   18 ++++++++++++++++++
+ qt/poppler-qt.h       |    2 ++
+ 3 files changed, 26 insertions(+)
+
+commit 5380d005b7b54cc6587ce6e8c3bbb358da5cd9a5
+Author: Jeff Muizelaar <jeff@infidigm.net>
+Date:  Thu Jun 1 06:42:25 2006 +0000
+
+    2006-06-01 Jeff Muizelaar  <jeff@infidigm.net>
+
+       * poppler/PSOutputDev.cc:
+       * poppler/PSOutputDev.h: Change filename parameter to PSOutputDev
+       constructor from char * to const char *.
+
+ ChangeLog             |    6 ++++++
+ poppler/PSOutputDev.cc |    2 +-
+ poppler/PSOutputDev.h |    2 +-
+ 3 files changed, 8 insertions(+), 2 deletions(-)
+
+commit c2a81ea8b01f3943a2eb737cf957acc0d05f7eed
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Wed May 31 20:14:04 2006 +0000
+
+       * poppler/SplashOutputDev.cc:
+           * splash/Splash.cc: Fix no splashModeRGB8Qt mode, that is,
+           make it
+           show images
+
+    I'm sorry, really, i'll try to do better
+
+ ChangeLog                 |    6 ++++++
+ poppler/SplashOutputDev.cc |  10 ++++++++++
+ splash/Splash.cc          |    3 +++
+ 3 files changed, 19 insertions(+)
+
+commit 643b310cf51474b6dfc077fe086ea121e807f6e1
+Author: Jeff Muizelaar <jeff@infidigm.net>
+Date:  Wed May 31 19:18:28 2006 +0000
+
+    2006-05-31 Jeff Muizelaar  <jeff@infidigm.net>
+
+       * TODO: Remove items's from my list that are done.
+
+ ChangeLog |   4 ++++
+ TODO     |    3 ---
+ 2 files changed, 4 insertions(+), 3 deletions(-)
+
+commit 96e582721dcb15ea258b989c7c500084bff9f56d
+Author: Jeff Muizelaar <jeff@infidigm.net>
+Date:  Wed May 31 17:31:49 2006 +0000
+
+    2006-05-31 Jeff Muizelaar  <jeff@infidigm.net>
+
+       * poppler/CairoOutputDev.cc:
+       * poppler/CairoOutputDev.h: Change the cairo backend to use the
+       transformation in cairo instead of doing all of the
+       transformations in
+       the OutputDevice. Fixes #6948.
+
+ ChangeLog                |    7 ++
+ poppler/CairoOutputDev.cc |  200
+ ++++++++++++++++++++-------------------------
+ poppler/CairoOutputDev.h  |   1 +
+ 3 files changed, 96 insertions(+), 112 deletions(-)
+
+commit 00ffb9bf50b6b3b2e8eaa8af593aaa01d4a62a34
+Author: Kristian Høgsberg <krh@redhat.com>
+Date:  Wed May 31 04:53:27 2006 +0000
+
+    2006-05-31 Kristian Høgsberg  <krh@redhat.com>
+
+       * NEWS: Sum up changes.
+
+       * configure.ac: Bump release to 0.5.3.
+
+ ChangeLog    |    6 ++++++
+ NEWS        |    8 ++++++++
+ configure.ac |    2 +-
+ 3 files changed, 15 insertions(+), 1 deletion(-)
+
+commit 223a4bf3a679f666b6c963a8787cf5b5ac75c4b6
+Author: Kristian Høgsberg <krh@redhat.com>
+Date:  Wed May 31 02:02:54 2006 +0000
+
+    2006-05-30 Kristian Høgsberg  <krh@redhat.com>
+
+       * poppler-glib.pc.in:
+       * configure.ac: Add poppler as a private requires if pkg-config
+       supports it.
+
+ ChangeLog         |    6 ++++++
+ configure.ac      |   11 +++++++++++
+ poppler-glib.pc.in |   3 ++-
+ 3 files changed, 19 insertions(+), 1 deletion(-)
+
+commit 7aaa4d3fbdb8ea2534d3cb80e68b2759b2e8fd2f
+Author: Kristian Høgsberg <krh@redhat.com>
+Date:  Tue May 30 21:46:06 2006 +0000
+
+    2006-05-30 Kristian Høgsberg  <krh@redhat.com>
+
+       * test/gtk-cairo-test.cc: Add --page option to gtk-cairo-test.
+
+ ChangeLog             |    4 ++++
+ test/gtk-cairo-test.cc |   21 ++++++++++++++++++---
+ 2 files changed, 22 insertions(+), 3 deletions(-)
+
+commit f7c1d519b9695ad8adfdcf3af696de746cdcf375
+Author: Jeff Muizelaar <jeff@infidigm.net>
+Date:  Mon May 29 18:44:17 2006 +0000
+
+    2006-05-29 Jeff Muizelaar  <jeff@infidigm.net>
+
+       * poppler/CairoFontEngine.cc:
+       * poppler/CairoFontEngine.h:
+       * poppler/CairoOutputDev.cc: Allow CairoFont creation to fail more
+       gracefully. Fixes #4030.
+
+ ChangeLog                 |    7 +++++++
+ poppler/CairoFontEngine.cc |  27 +++++++++++++++++++++------
+ poppler/CairoFontEngine.h  |   4 +++-
+ poppler/CairoOutputDev.cc  |   5 +++++
+ 4 files changed, 36 insertions(+), 7 deletions(-)
+
+commit 84861800dad3649d4757d5c5539b9e86e2b2c644
+Author: Jeff Muizelaar <jeff@infidigm.net>
+Date:  Sat May 27 17:27:37 2006 +0000
+
+    2006-05-27 Jeff Muizelaar  <jeff@infidigm.net>
+
+       * poppler/CairoOutputDev.cc:
+       * poppler/CairoOutputDev.h: Back out the rest of krh's type3
+       font work. This fixes type3 fonts in CairoOutputDevice.
+
+ ChangeLog                |    6 ++++++
+ poppler/CairoOutputDev.cc |   3 +++
+ poppler/CairoOutputDev.h  |   2 +-
+ 3 files changed, 10 insertions(+), 1 deletion(-)
+
+commit 6f5a89a0a2cf17d45d1c31ce105829be8c7ac456
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Tue May 23 20:49:16 2006 +0000
+
+           * poppler/SplashOutputDev.cc:
+           * qt4/src/poppler-private.h:
+           * splash/Splash.cc:
+           * splash/SplashBitmap.cc:
+           * splash/SplashTypes.h: bring splashModeRGB8 back to the
+           old code
+           (before Frank's patch), create splashModeRGB8Qt that has
+           Frank's
+           codepath and is used by Qt frontends. Fixes corruption on
+           other programs expecting the old behaviour.
+
+    Remember dude we are now a lib! you can not change behaviour from
+    one day to another!
+
+    /me hits himself
+
+ ChangeLog                 |   11 +++
+ poppler/SplashOutputDev.cc |   8 +++
+ qt/poppler-private.h      |    2 +-
+ qt4/src/poppler-private.h  |   2 +-
+ splash/Splash.cc          |  169
+ ++++++++++++++++++++++++++++++++++++++++++++
+ splash/SplashBitmap.cc     |  26 ++++++-
+ splash/SplashTypes.h      |    2 +
+ 7 files changed, 216 insertions(+), 4 deletions(-)
+
+commit 495d592c3ba7fe81e03774f5b2ed677e5aa560c7
+Author: Kristian Høgsberg <krh@redhat.com>
+Date:  Tue May 23 19:16:37 2006 +0000
+
+    2006-05-23 Kristian Høgsberg  <krh@redhat.com>
+
+       * qt4/src/Makefile.am (libpoppler_qt4_la_SOURCES): Add missing
+
+ ChangeLog          |    5 +++++
+ qt4/src/Makefile.am |   1 +
+ 2 files changed, 6 insertions(+)
+
+commit eecd06c86585bca05c99cd2e9a1b1ff3bbae3c72
+Author: Kristian Høgsberg <krh@redhat.com>
+Date:  Mon May 22 20:19:35 2006 +0000
+
+    2006-05-22 Kristian Høgsberg  <krh@redhat.com>
+
+       * configure.ac: Bump release.
+       * NEWS: Sum up changes.
+
+ ChangeLog    |    5 +++++
+ NEWS        |   11 ++++++++++-
+ configure.ac |    2 +-
+ 3 files changed, 16 insertions(+), 2 deletions(-)
+
+commit 680f20dfd1cf0342d49516b3848a2aef5d2a3883
+Author: Kristian Høgsberg <krh@redhat.com>
+Date:  Mon May 22 19:58:41 2006 +0000
+
+    2006-05-22 Kristian Høgsberg  <krh@redhat.com>
+
+       Patch from Rainer Keller to fix the ImageOutputDev (#6984).
+
+       * utils/ImageOutputDev.cc (drawImage): Upate to work with new
+       16-bit color representation.
+
+       * utils/ImageOutputDev.h: Return gTrue for needNonText().
+
+ ChangeLog              |    9 +++++++++
+ NEWS                   |    4 ++++
+ utils/ImageOutputDev.cc |    6 +++---
+ utils/ImageOutputDev.h  |    2 +-
+ 4 files changed, 17 insertions(+), 4 deletions(-)
+
+commit e43a06bf6e953fa9af18476e2c9f27106398c09c
+Author: Kristian Høgsberg <krh@redhat.com>
+Date:  Sun May 21 23:26:45 2006 +0000
+
+    2006-05-21 Kristian Høgsberg  <krh@redhat.com>
+
+       * poppler/CairoFontEngine.cc:
+       * poppler/CairoFontEngine.h: Back out type3 font work committed by
+       accident.
+
+ ChangeLog                 |    6 +
+ poppler/CairoFontEngine.cc |  347
+ +++++---------------------------------------
+ poppler/CairoFontEngine.h  |  17 +--
+ 3 files changed, 47 insertions(+), 323 deletions(-)
+
+commit 7d4bb0533f88f06449ebd64c1220d0b75001937d
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Sun May 21 18:14:15 2006 +0000
+
+    fix all is blue issue on ppc machines
+
+ ChangeLog              |    7 +++++++
+ qt/poppler-page.cc     |   17 +++++++++++++++++
+ qt4/src/poppler-page.cc |   17 +++++++++++++++++
+ 3 files changed, 41 insertions(+)
+
+commit 655af1e0126ca96d75c9c718d7d8f928c898b1f6
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Sun May 21 17:19:53 2006 +0000
+
+    hope to fix really Kouhei's name now
+
+ ChangeLog |   10 +++++-----
+ 1 file changed, 5 insertions(+), 5 deletions(-)
+
+commit cc783a1ebe868ff75db5472775dabe0020ae501f
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Sun May 21 11:54:30 2006 +0000
+
+    Fix Kouhei name
+
+ ChangeLog |   2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit e4b6ad3bb873a6f334934921e6d56e9d26e06a9a
+Author: Kristian Høgsberg <krh@redhat.com>
+Date:  Fri May 19 22:55:49 2006 +0000
+
+    Add bug number to ChangeLog entry.
+
+ ChangeLog |   2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 46f5f070cceb2c0f3b53537c8e33340b9f1bba38
+Author: Kristian Høgsberg <krh@redhat.com>
+Date:  Fri May 19 22:26:03 2006 +0000
+
+    2006-05-19 Kristian Høgsberg  <krh@redhat.com>
+
+       * glib/poppler-action.h:
+       * glib/poppler-action.cc: Add poppler_dest_get_type(), patch from
+       Kouhei Souto (#6907).
+
+ ChangeLog             |    4 ++++
+ glib/poppler-action.cc |   13 +++++++++++++
+ glib/poppler-action.h |    4 ++++
+ 3 files changed, 21 insertions(+)
+
+commit 875dc5b112dfe2d4a48a7567b1ff79257447cc0d
+Author: Kristian Høgsberg <krh@redhat.com>
+Date:  Fri May 19 22:21:35 2006 +0000
+
+    2006-05-19 Kristian Høgsberg  <krh@redhat.com>
+
+       * poppler-glib.pc.in (Requires): Add gdk-2.0 dependency, from
+       Kouhei Souto (#6896).
+
+ ChangeLog         |    3 +++
+ poppler-glib.pc.in |   2 +-
+ 2 files changed, 4 insertions(+), 1 deletion(-)
+
+commit b66dda2640c088bbe205f698a0c4028144027922
+Author: Kristian Høgsberg <krh@redhat.com>
+Date:  Fri May 19 22:19:21 2006 +0000
+
+    2006-05-19 Kristian Høgsberg  <krh@redhat.com>
+
+       * glib/poppler-document.h (POPPLER_TYPE_INDEX_ITER)
+       (POPPLER_TYPE_FONTS_ITER): Add these macros, patch from Kouhei
+       Souto (#6897).
+
+ ChangeLog              |    4 ++++
+ glib/poppler-document.h |    2 ++
+ 2 files changed, 6 insertions(+)
+
+commit 095730456c0d8312067af10dd55a3b9165a83736
+Author: Kristian Høgsberg <krh@redhat.com>
+Date:  Fri May 19 22:16:25 2006 +0000
+
+    2006-05-19 Kristian Høgsberg  <krh@redhat.com>
+
+       * glib/Makefile.am (INCLUDES): Add define for G_LOG_DOMAIN, from
+       Kouhei Souto (#6899).
+
+ ChangeLog       |    3 +++
+ glib/Makefile.am |    1 +
+ 2 files changed, 4 insertions(+)
+
+commit b8d77633899c1dec5f3b9c9a0f075f39afa98965
+Author: Kristian Høgsberg <krh@redhat.com>
+Date:  Fri May 19 22:12:38 2006 +0000
+
+    2006-05-19 Kristian Høgsberg  <krh@redhat.com>
+
+       * glib/poppler-document.cc (poppler_document_save): Memleak patch
+       from Paolo Borelli (#6908).
+
+ ChangeLog               |    5 +++++
+ glib/poppler-document.cc |    2 ++
+ 2 files changed, 7 insertions(+)
+
+commit 488f77298fee9eebbca5983c1c9fb186b3b67aa3
+Author: Kristian Høgsberg <krh@redhat.com>
+Date:  Fri May 19 22:04:17 2006 +0000
+
+    2006-05-19 Kristian Høgsberg  <krh@redhat.com>
+
+       * TextOutputDev.h:
+       * TextOutputDev.cc:
+       * UnicodeTypeTable.h:
+       * UnicodeTypeTable.cc:
+       * UnicodeCClassTables.h:
+       * UnicodeCompTables.h:
+       * UnicodeDecompTables.h:
+       * gen-unicode-tables.py: Patch from Ed Catmur (#2929) to convert
+       search string and document text to unicode NFKC (compatibility
+       composition) before matching so ligatures match correctly.
+
+ ChangeLog                    |   13 +
+ poppler/Makefile.am          |    5 +
+ poppler/TextOutputDev.cc      |   41 +-
+ poppler/TextOutputDev.h       |    3 +
+ poppler/UnicodeCClassTables.h | 1827 +++++++++
+ poppler/UnicodeCompTables.h   |  665 ++++
+ poppler/UnicodeDecompTables.h | 8526
+ +++++++++++++++++++++++++++++++++++++++++
+ poppler/UnicodeTypeTable.cc   |  235 ++
+ poppler/UnicodeTypeTable.h    |    3 +
+ 9 files changed, 11303 insertions(+), 15 deletions(-)
+
+commit ecb942e54a1ab0f7eded91b7d1278f0ac62e2071
+Author: Kristian Høgsberg <krh@redhat.com>
+Date:  Fri May 19 21:42:54 2006 +0000
+
+    2006-05-19 Kristian Høgsberg  <krh@redhat.com>
+
+       * glib/poppler-page.cc (poppler_page_prepare_output_dev): Fix the
+       rotation bug for real.
+
+ ChangeLog           |    5 +++++
+ glib/poppler-page.cc |   16 +++++++++-------
+ 2 files changed, 14 insertions(+), 7 deletions(-)
+
+commit 28ae789afe0625a641525e4a0768d51fa8bd667c
+Author: Kristian Høgsberg <krh@redhat.com>
+Date:  Fri May 19 20:54:13 2006 +0000
+
+    2006-05-19 Kristian Høgsberg  <krh@redhat.com>
+
+       Patch from Kouhei Sutou (#6905).
+
+       * glib/poppler-document.cc:
+       * glib/poppler-document.h:
+       * glib/poppler-private.h:
+       * glib/reference/tmpl/poppler-private.sgml:
+       * glib/reference/tmpl/poppler.sgml: Make PopplerPSOutput a proper
+       glib object.
+
+ ChangeLog                               |   11 +++++++
+ glib/poppler-document.cc                |   51
+ ++++++++++++++++++++++++------
+ glib/poppler-document.h                 |    4 +++
+ glib/poppler-private.h                          |    2 ++
+ glib/reference/tmpl/poppler-private.sgml |    1 +
+ glib/reference/tmpl/poppler.sgml        |    1 +
+ 6 files changed, 61 insertions(+), 9 deletions(-)
+
+commit 02cf7fd7df0b2d8c2b1c6f108e581bc1c7a973b1
+Author: Kristian Høgsberg <krh@redhat.com>
+Date:  Fri May 19 20:35:43 2006 +0000
+
+    2006-05-19 Kristian Høgsberg  <krh@redhat.com>
+
+       * glib/poppler-page.cc (poppler_page_prepare_output_dev): Fix
+       rotation bug (#6913, #6926).
+
+ ChangeLog           |    3 +++
+ glib/poppler-page.cc |   12 +++++++++++-
+ 2 files changed, 14 insertions(+), 1 deletion(-)
+
+commit 78ae3efd9541d7b63ff5a2c4de3fde300806688f
+Author: Kristian Høgsberg <krh@redhat.com>
+Date:  Fri May 19 19:21:59 2006 +0000
+
+    2006-05-19 Kristian Høgsberg  <krh@redhat.com>
+
+       Memory leak patch from Carlos Garcia Campos (#6947).
+
+       * glib/poppler-action.cc:
+       * glib/poppler-document.cc:
+       * glib/poppler-page.cc:
+       * poppler/CairoFontEngine.cc:
+       * poppler/CairoFontEngine.h:
+       * poppler/CairoOutputDev.cc:
+       * poppler/CairoOutputDev.h:
+       * poppler/Gfx.cc:
+       * poppler/TextOutputDev.cc:  Fix various memory leaks.
+
+ ChangeLog                 |   14 ++
+ glib/poppler-action.cc     |   9 +-
+ glib/poppler-document.cc   |  31 +++-
+ glib/poppler-page.cc      |    2 +
+ poppler/CairoFontEngine.cc |  347
+ +++++++++++++++++++++++++++++++++++++++-----
+ poppler/CairoFontEngine.h  |  17 ++-
+ poppler/CairoOutputDev.cc  |   5 +-
+ poppler/CairoOutputDev.h   |   2 +-
+ poppler/Gfx.cc                    |    1 +
+ poppler/TextOutputDev.cc   |   9 ++
+ 10 files changed, 381 insertions(+), 56 deletions(-)
+
+commit 354c1926b7181fd668f221e1d672974e04fda747
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Fri May 19 17:24:19 2006 +0000
+
+    * qt4/src/poppler-link.cc: Patch by Pino Toscano, ensure the
+           splashoutput is created when parsing the TOC.
+
+ ChangeLog              |    5 +++++
+ qt4/src/poppler-link.cc |    5 +++--
+ 2 files changed, 8 insertions(+), 2 deletions(-)
+
+commit 3c9a5f37704781c9a51e72edd18451870452b9a7
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Sun May 14 16:11:54 2006 +0000
+
+           * poppler/FontInfo.cc: Fix possible crash, half patch
+           by Kouhei Sutou <kou@cozmixng.org>
+
+ ChangeLog          |    5 +++++
+ poppler/FontInfo.cc |   4 ++--
+ 2 files changed, 7 insertions(+), 2 deletions(-)
+
+commit 436f578fe762e8ceccce95a0f2003406527dde64
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Sat May 13 16:01:57 2006 +0000
+
+           * poppler/GfxState.cc:
+           * poppler/GfxState.h: Fix memleak, patch by
+                   Carlos Garcia Campos <carlosgc@gnome.org>
+
+ ChangeLog          |    6 ++++++
+ poppler/GfxState.cc |   8 ++++++++
+ poppler/GfxState.h  |   3 +--
+ 3 files changed, 15 insertions(+), 2 deletions(-)
+
+commit 906515769097f2e38f6b2c2aff598919b9d1ee0d
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Sat May 13 15:58:37 2006 +0000
+
+           * qt4/src/poppler-document.cc: leak--
+           * qt4/src/poppler-private.h: Refcount globalparams
+           * qt4/tests/test-poppler-qt4.cpp: Some leaks less
+
+ ChangeLog                     |    6 ++++++
+ qt4/src/poppler-document.cc   |   10 +++++-----
+ qt4/src/poppler-private.h     |    8 ++++++++
+ qt4/tests/test-poppler-qt4.cpp |    6 ++++--
+ 4 files changed, 23 insertions(+), 7 deletions(-)
+
+commit 46fd63c44369c882d8dac473d4156001d9d4ed18
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Sat May 13 11:14:24 2006 +0000
+
+    numbers for easier casting
+
+ qt4/src/poppler-link.h |   14 ++++++++++++--
+ 1 file changed, 12 insertions(+), 2 deletions(-)
+
+commit 35500375e3f790c444ab7e7d0a687d270c5a66b1
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Fri May 12 21:02:01 2006 +0000
+
+    fixing compile problems for some people
+
+ qt4/src/poppler-page.cc |    6 ++++++
+ 1 file changed, 6 insertions(+)
+
+commit 181f09829cf4831965059e3064114d83348c51b5
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Fri May 12 20:40:05 2006 +0000
+
+           * qt4/src/Makefile.am
+           * qt4/src/poppler-annotation-helper.h
+           * qt4/src/poppler-annotation.cc
+           * qt4/src/poppler-annotation.h
+           * qt4/src/poppler-link.cc
+           * qt4/src/poppler-link.h
+           * qt4/src/poppler-page.cc
+           * qt4/src/poppler-qt4.h: Code for annotations stripped
+           from oKular,
+           it's all based on Enrico's work, so ask him for details,
+           the problem
+           is that he left KDE development a while ago.
+
+ ChangeLog                          |   14 +
+ qt4/src/Makefile.am                |    2 +
+ qt4/src/poppler-annotation-helper.h | 213 ++++++++++
+ qt4/src/poppler-annotation.cc      |  792
+ +++++++++++++++++++++++++++++++++++
+ qt4/src/poppler-annotation.h       |  257 ++++++++++++
+ qt4/src/poppler-link.cc            |    4 +-
+ qt4/src/poppler-link.h                     |    2 +-
+ qt4/src/poppler-page.cc            |  691 ++++++++++++++++++++++++++++++
+ qt4/src/poppler-qt4.h              |    8 +-
+ 9 files changed, 1980 insertions(+), 3 deletions(-)
+
+commit 3a48e89dfbe54af73a68ed8e917938f14ad17f01
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Tue May 9 20:07:06 2006 +0000
+
+       * qt4/src/Makefile.am:
+           * qt4/src/poppler-document.cc:
+           * qt4/src/poppler-link.cc:
+           * qt4/src/poppler-page.cc:
+           * qt4/src/poppler-private.h:
+           * qt4/src/poppler-qt4.h: Adding links extraction code,
+           should work as
+             it is basically stripped out from kpdf, but comments are
+             obviously welcome as always
+
+ ChangeLog                  |   10 +++
+ qt4/src/Makefile.am        |    1 +
+ qt4/src/poppler-document.cc |  13 +---
+ qt4/src/poppler-link.cc     | 129 +++++++++++++++++++++++++++++--
+ qt4/src/poppler-link.h      | 178
+ +++++++++++++++++++++++++++++++++++++++++++
+ qt4/src/poppler-page.cc     | 139 +++++++++++++++++++++++++++++----
+ qt4/src/poppler-private.h   |   9 ++-
+ qt4/src/poppler-qt4.h      |   56 +++-----------
+ 8 files changed, 456 insertions(+), 79 deletions(-)
+
+commit f628e1506e576a8553a9699c1d7f05ef55c24fa2
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Mon May 8 19:03:51 2006 +0000
+
+    memleak-- by carlos
+
+ ChangeLog         |    5 +++++
+ poppler/Catalog.cc |   5 ++++-
+ 2 files changed, 9 insertions(+), 1 deletion(-)
+
+commit 1fce6266564583d356817a21f43c6b1ad8ce3716
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Sat May 6 10:57:07 2006 +0000
+
+    fix code, i suck
+
+ qt4/src/poppler-page.cc |    2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit be913b90d59da35a347498b86fdd3edb065aef23
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Fri May 5 20:51:01 2006 +0000
+
+           * poppler/Function.cc: quick fix for KDE bug #126760
+
+    Better solutions are of course accepted
+
+ ChangeLog          |    4 ++++
+ poppler/Function.cc |   2 +-
+ 2 files changed, 5 insertions(+), 1 deletion(-)
+
+commit 2b085293bd73b4e77da848b3fe63a7e82e9ba5e5
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Thu May 4 19:10:55 2006 +0000
+
+           * qt4/src/poppler-qt4.h:
+           * qt4/src/poppler-page.cc: Implement search functionality
+
+    more code to make oKular qt4popplered possible, probably not most
+    quickest code around, feel free to comment/optimize
+
+ ChangeLog              |    5 +++++
+ qt4/src/poppler-page.cc |   43
+ +++++++++++++++++++++++++++++++++++++++++++
+ qt4/src/poppler-qt4.h  |   16 ++++++++++++++++
+ 3 files changed, 64 insertions(+)
+
+commit a9b0c7977aba7bc85a8673c7f95187ff17ee4173
+Author: Kristian Høgsberg <krh@redhat.com>
+Date:  Tue May 2 04:38:39 2006 +0000
+
+    2006-05-02 Kristian Høgsberg  <krh@redhat.com>
+
+       * glib/poppler-page.cc:
+       * poppler/Gfx.cc:
+       * poppler/GfxFont.cc:
+       * poppler/GfxFont.h:
+       * poppler/GfxState.cc:
+       * poppler/TextOutputDev.cc: Patch from Gary Coady to add reference
+       counting to GfxFont so we don't crash on text selection.
+
+ ChangeLog               |   10 ++++++++++
+ glib/poppler-page.cc    |    2 +-
+ poppler/Gfx.cc                  |    2 ++
+ poppler/GfxFont.cc      |   14 +++++++++++++-
+ poppler/GfxFont.h       |    4 ++++
+ poppler/GfxState.cc     |    7 +++++++
+ poppler/TextOutputDev.cc |    1 +
+ 7 files changed, 38 insertions(+), 2 deletions(-)
+
+commit 57af0207334ff1a407899370281ebb90fe953a32
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Mon May 1 18:33:47 2006 +0000
+
+           * qt4/src/poppler-page.cc:
+           * qt4/src/poppler-private.h:
+           * qt4/src/poppler-qt4.h:
+           * qt4/src/poppler-textbox.cc: Add nextWord(), hasSpaceAfter()
+           and
+           edge() to TextBox
+
+    More things to make poppler-qt4Okular nearer
+
+ ChangeLog                 |    8 ++++++++
+ qt4/src/poppler-page.cc    |  14 ++++++++++++++
+ qt4/src/poppler-private.h  |  11 +++++++++++
+ qt4/src/poppler-qt4.h     |    8 ++++++++
+ qt4/src/poppler-textbox.cc |  23 ++++++++++++++++-------
+ 5 files changed, 57 insertions(+), 7 deletions(-)
+
+commit 61b126390f764fd38c79b6a64160a7dc7870bd4a
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Mon May 1 13:41:14 2006 +0000
+
+    revert thing that should not have gone in
+
+ poppler/PageLabelInfo.cc |   43
+ +++++++++++++++++++++++++++++++++++++++++++
+ poppler/PageLabelInfo.h  |   44
+ --------------------------------------------
+ 2 files changed, 43 insertions(+), 44 deletions(-)
+
+commit f2424ef63e86d82b2be277e2b268b48aae29601e
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Mon May 1 13:32:31 2006 +0000
+
+           * qt4/src/poppler-document.cc:
+           * qt4/src/poppler-private.h:
+           * qt4/src/poppler-qt4.h: Add the possibility of setting
+           the paper
+           color
+
+    One step more to make oKular fully use the qt4 bindings
+
+ ChangeLog                  |    7 +++++++
+ poppler/PageLabelInfo.cc    |  43
+ ------------------------------------------
+ poppler/PageLabelInfo.h     |  44
+ +++++++++++++++++++++++++++++++++++++++++++
+ qt4/src/poppler-document.cc |  10 ++++++++++
+ qt4/src/poppler-private.h   |  22 +++++++++++++++++-----
+ qt4/src/poppler-qt4.h      |    6 ++++++
+ 6 files changed, 84 insertions(+), 48 deletions(-)
+
+commit 4147400e2b692df7f70c3772e8a4b576d4d85294
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Sat Apr 29 15:23:41 2006 +0000
+
+    Fix memory leak. Bug 6765
+
+ ChangeLog             |    5 +++++
+ poppler/JBIG2Stream.cc |    1 +
+ 2 files changed, 6 insertions(+)
+
+commit 960d60467d62d28f20b127d07e8de1af42eec568
+Author: Jeff Muizelaar <jeff@infidigm.net>
+Date:  Thu Apr 27 17:26:36 2006 +0000
+
+    2006-04-27 Jeff Muizelaar  <jeff@infidigm.net>
+
+       * poppler/CairoOutputDev.cc: delete imgStr if some of the cairo
+       functions fail. Fixes coverty reports #2106, #2107, #2077 and
+       bug #6764. Patch by Kjartan Maraas.
+
+ ChangeLog                |    6 ++++++
+ poppler/CairoOutputDev.cc |   34 +++++++++++++++++++++++++---------
+ 2 files changed, 31 insertions(+), 9 deletions(-)
+
+commit 155112131c6e25bfde752cf5daa80a6c9712cfed
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Sun Apr 23 15:50:52 2006 +0000
+
+    qt4/src/poppler-private.h: Protect us against a link not having
+           a destination or a namedDestination
+
+ ChangeLog                |    5 +++++
+ qt4/src/poppler-private.h |   2 +-
+ 2 files changed, 6 insertions(+), 1 deletion(-)
+
+commit c902a3a22bcceedc8ee8ca377064efcc8a9178ca
+Author: Brad Hards <bradh@frogmouth.net>
+Date:  Fri Apr 21 12:02:19 2006 +0000
+
+    Add another path to search for Qt4 libs and includes.
+
+    CCMAIL: montel@kde.org
+
+ m4/qt.m4 |    4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 18f8e1f1d213dbcda27cd0ec429273801f65e208
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Tue Apr 18 19:11:56 2006 +0000
+
+    * goo/GooVector.h: Fix typo that was preventing build with MSVC8
+           Discovered by Reece Dunn <msclrhd@hotmail.com>
+
+ ChangeLog      |    5 +++++
+ goo/GooVector.h |    4 ++--
+ 2 files changed, 7 insertions(+), 2 deletions(-)
+
+commit cbbb28a5959343d20dffe945ea83272c0b2e287b
+Author: Kristian Høgsberg <krh@redhat.com>
+Date:  Sun Apr 16 22:59:44 2006 +0000
+
+    2006-04-16 Carlos Garcia Campos  <carlosgc@gnome.org>
+
+       * glib/poppler-action.cc:
+       * glib/poppler-action.h:
+       * glib/poppler-private.h:
+       * glib/poppler.h:
+       Add support for named destinations and named actions.
+
+       * glib/poppler-document.cc:
+       * glib/poppler-document.h:
+       Allow to find named destinations in document.
+
+ ChangeLog                                |   12 +++
+ glib/poppler-action.cc                           |  152
+ ++++++++++++++++++++++++-----
+ glib/poppler-action.h                    |    7 +-
+ glib/poppler-document.cc                 |   37 +++++++
+ glib/poppler-document.h                  |    4 +-
+ glib/poppler-private.h                           |    2 +
+ glib/poppler.h                                   |    1 +
+ glib/reference/tmpl/poppler-action.sgml   |   2 +
+ glib/reference/tmpl/poppler-document.sgml |   4 -
+ 9 files changed, 189 insertions(+), 32 deletions(-)
+
+commit 85687a1e0e4c6be2dbfb23ba00018b9c7c7454f5
+Author: Jeff Muizelaar <jeff@infidigm.net>
+Date:  Wed Apr 12 06:52:07 2006 +0000
+
+    2006-04-12 Jeff Muizelaar  <jeff@infidigm.net>
+
+       * poppler/CairoOutputDev.cc:
+       * poppler/CairoOutputDev.h: Add support for masked images to
+       the cairo
+       backend. CairoOutputDevice really should have been refactored
+       before
+       committing this, but the results were so pretty I couldn't resist.
+       Fixes #6174.
+
+ ChangeLog                |    8 +++
+ poppler/CairoOutputDev.cc |  118
+ +++++++++++++++++++++++++++++++++++++++++++++
+ poppler/CairoOutputDev.h  |   8 +++
+ 3 files changed, 134 insertions(+)
+
+commit 6039d4fc65cb25bef20efa29bc29d42086fc0854
+Author: Jeff Muizelaar <jeff@infidigm.net>
+Date:  Wed Apr 12 05:46:44 2006 +0000
+
+    2006-04-12 Jeff Muizelaar  <jeff@infidigm.net>
+
+       * poppler/CairoOutputDev.cc: Fix breakage by krh by only calling
+       cairo_destroy on non-null.
+
+ ChangeLog                |    5 +++++
+ poppler/CairoOutputDev.cc |   4 +++-
+ 2 files changed, 8 insertions(+), 1 deletion(-)
+
+commit d839a0bd78361930e5e2fe889df12e1e853ffed3
+Author: Kristian Høgsberg <krh@redhat.com>
+Date:  Wed Apr 12 02:07:07 2006 +0000
+
+    2006-04-11 Kristian Høgsberg  <krh@redhat.com>
+
+       * configure.ac:
+       * poppler-glib.pc.in:
+       * glib/Makefile.am:
+       * glib/poppler-page.cc:
+       * glib/poppler-page.h:
+       * glib/poppler.h:
+       * poppler/CairoOutputDev.cc:
+       * poppler/CairoOutputDev.h:
+       * glib/poppler-features.h.in:
+       Make the CairoOutputDev render to a cairo_t instead of a
+       cairo_surface_t and expose that functionality in the glib wrapper
+       (poppler_page_render).
+
+       * test/Makefile.am:
+       * test/gtk-cairo-test.cc:
+       Update gtk-cairo-test to use this new interface and add a spin
+       button for changing page (#5951).
+
+       * utils/Makefile.am (EXTRA_DIST): Fix warning where this was
+       assigned twice.
+
+ ChangeLog                 |   23 ++++
+ configure.ac              |    8 ++
+ glib/Makefile.am          |   10 +-
+ glib/poppler-features.h.in |  24 ++++
+ glib/poppler-page.cc      |   63 +++++++---
+ glib/poppler-page.h       |   10 ++
+ glib/poppler.h                    |    1 +
+ poppler-glib.pc.in        |    2 +-
+ poppler/CairoOutputDev.cc  |  23 ++--
+ poppler/CairoOutputDev.h   |   6 +-
+ test/Makefile.am          |    4 +-
+ test/gtk-cairo-test.cc     |  286
+ +++++++++++++-------------------------------
+ utils/Makefile.am         |    6 +-
+ 13 files changed, 221 insertions(+), 245 deletions(-)
+
+commit b198c9801c668014c0979c57033a0637e7e046e2
+Author: Jeff Muizelaar <jeff@infidigm.net>
+Date:  Mon Apr 10 18:12:44 2006 +0000
+
+    2006-04-10 Jeff Muizelaar  <jeff@infidigm.net>
+
+       * poppler/CairoOutputDev.cc: take originX and originY into
+       account in
+       drawChar() to draw vertical text properly. Fixes #6551.
+
+ ChangeLog                |    5 +++++
+ poppler/CairoOutputDev.cc |   2 +-
+ 2 files changed, 6 insertions(+), 1 deletion(-)
+
+commit fd251f52efc7748fda91cc77fb9d3966e0f02ac8
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Sun Apr 9 11:05:51 2006 +0000
+
+    m4/qt.m4: Improve for systems that need -pthread to be linked when
+    linking Qt. Patch by Diego Pettenò
+
+ ChangeLog |   5 +++++
+ m4/qt.m4  |   28 +++++++++++++++++++++++++++-
+ 2 files changed, 32 insertions(+), 1 deletion(-)
+
+commit 36de9747153a2ea9b3cf86c41e75a521441a2e06
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Sat Apr 8 10:44:43 2006 +0000
+
+    * poppler/Makefile.am:
+    * qt4/src/Makefile.am: Don't link Qt4 in libpoppler when using
+    Qt4 frontend
+      Patch by Stefan Schweizer
+
+ ChangeLog          |    6 ++++++
+ poppler/Makefile.am |  11 +++++------
+ qt4/src/Makefile.am |   1 +
+ 3 files changed, 12 insertions(+), 6 deletions(-)
+
+commit bf7afe161d76c50fd1c480eb236607145782e59d
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Wed Apr 5 18:20:56 2006 +0000
+
+    poppler/JBIG2Stream.cc: Fix for some buggy JBIG2 documents, patch
+    by Raj Kumar and Paul Walmsley. Fixes bug 6500
+
+ ChangeLog             |    5 +++++
+ poppler/JBIG2Stream.cc |   43 +++++++++++++++++++++++++++++++++++++++++++
+ 2 files changed, 48 insertions(+)
+
+commit 315f8e488d3db848f88a06c7568b6583bbf0e432
+Author: Jeff Muizelaar <jeff@infidigm.net>
+Date:  Wed Apr 5 17:20:56 2006 +0000
+
+    2006-04-05 Jeff Muizelaar  <jeff@infidigm.net>
+
+       * poppler/CairoOutputDev.cc: use a separate matrix for the
+       softmask.
+       fixes #6492.
+
+ ChangeLog                |    5 +++++
+ poppler/CairoOutputDev.cc |   11 ++++++++++-
+ 2 files changed, 15 insertions(+), 1 deletion(-)
+
+commit 0d311518f678a479c1efeaec15011e0a34de80fc
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Tue Apr 4 21:01:01 2006 +0000
+
+           * splash/Splash.cc:
+           * splash/SplashBitmap.cc: Make Splashbitmap RGB8 use 32bits
+           internally
+           * qt/poppler-page.cc:
+           * qt4/src/poppler-page.cc: Adapt to splashbitmap change so
+           copying to
+           QImage is faster.
+           Patch by Frank Meerkötter slightly modified by Albert
+           Astals Cid
+
+    I'll leave adapting the glib frontend for you guys, i tried to adapt
+    it but i got lost at gdk_pixbuf_get_n_channels (pixbuf);
+
+ ChangeLog              |    9 ++++++
+ qt/poppler-page.cc     |   18 ++++-------
+ qt4/src/poppler-page.cc |   15 ++++-----
+ splash/Splash.cc       |   81
+ ++++++++++++++++++++++++-----------------------
+ splash/SplashBitmap.cc  |   10 +++---
+ 5 files changed, 67 insertions(+), 66 deletions(-)
+
+commit 888bd41b42507f0a1af55c55495d31d802ce7706
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Tue Apr 4 20:42:08 2006 +0000
+
+    Fix crash when using fixedpoint math. Patch by Frank Meerkoetter
+
+ ChangeLog             |    5 +++++
+ splash/SplashFTFont.cc |    2 +-
+ 2 files changed, 6 insertions(+), 1 deletion(-)
+
+commit 56c98450160b639790931226a045ce4712e7d45e
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Sun Apr 2 18:07:59 2006 +0000
+
+    Improvements to the Qt4 frontend, comments welcome
+
+ ChangeLog                  |    7 +++
+ m4/qt.m4                   |    4 +-
+ qt4/src/Makefile.am        |    1 +
+ qt4/src/poppler-document.cc |  85 ++++++++++++++++++++------
+ qt4/src/poppler-link.cc     | 138
+ +++++++++++++++++++++++++++++++++++++++++++
+ qt4/src/poppler-page.cc     |   9 ++-
+ qt4/src/poppler-private.h   |  95 ++++++++++++++++++++++++++++-
+ qt4/src/poppler-qt4.h      |   86 ++++++++++++++++++++++++---
+ 8 files changed, 395 insertions(+), 30 deletions(-)
+
+commit c80ebf237e9c6232a1d0567a2688a294acfd481b
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Sat Apr 1 11:25:57 2006 +0000
+
+    Fix bug 6454
+
+ ChangeLog      |    5 +++++
+ poppler/XRef.cc |   22 +++++++++++++---------
+ 2 files changed, 18 insertions(+), 9 deletions(-)
+
+commit fe8142fbc12127682b8024673fe1af57b47bb5c9
+Author: Jeff Muizelaar <jeff@infidigm.net>
+Date:  Tue Mar 21 04:25:53 2006 +0000
+
+    2006-03-20 Jeff Muizelaar  <jeff@infidigm.net>
+
+       * glib/poppler-page.cc: Avoid strdup in poppler_page_get_property
+       and
+       make code cleaner. Combined with the memleak fix closes #6187.
+       Patch by chpe.
+
+ ChangeLog           |    6 ++++++
+ glib/poppler-page.cc |    5 +----
+ 2 files changed, 7 insertions(+), 4 deletions(-)
+
+commit 4f961df2e6e91a0dc0a024ae5acdefa394179a05
+Author: Jeff Muizelaar <jeff@infidigm.net>
+Date:  Tue Mar 21 04:19:18 2006 +0000
+
+    2006-03-20 Jeff Muizelaar  <jeff@infidigm.net>
+
+       * glib/poppler-page.cc: Fix memory leak in poppler_page_get_text
+       Patch by chpe.
+
+ ChangeLog           |    5 +++++
+ glib/poppler-page.cc |    2 +-
+ 2 files changed, 6 insertions(+), 1 deletion(-)
+
+commit ff4febab0a519732972c21bf76d7693c98265e0f
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Mon Mar 20 20:07:36 2006 +0000
+
+    Use UGooString for dates, fixes KDE bug 123938
+
+ ChangeLog                  |    6 ++++++
+ qt/poppler-document.cc      |   2 +-
+ qt4/src/poppler-document.cc |   2 +-
+ 3 files changed, 8 insertions(+), 2 deletions(-)
+
+commit 75ac6de8cd651b1cbe2d6a7ffa4574097088041f
+Author: Jeff Muizelaar <jeff@infidigm.net>
+Date:  Mon Mar 20 19:12:29 2006 +0000
+
+    2006-03-20 Carlos Garcia Campos  <calosgc@gnome.org>
+
+       reviewed by: Jeff Muizelaar <jeff@infidigm.net>
+
+       * glib/poppler-document.cc: Fix memory leak in
+       poppler_font_info_free
+
+ ChangeLog               |    6 ++++++
+ glib/poppler-document.cc |    2 +-
+ 2 files changed, 7 insertions(+), 1 deletion(-)
+
+commit 784f6d9a0888dab34c586ffe14db8e55b8a11f51
+Author: Jeff Muizelaar <jeff@infidigm.net>
+Date:  Mon Mar 20 19:02:10 2006 +0000
+
+    2006-03-20 Jeff Muizelaar  <jeff@infidigm.net>
+
+       * poppler/CairoFontEngine.h: remove unused variables
+
+ ChangeLog                |    4 ++++
+ poppler/CairoFontEngine.h |   1 -
+ 2 files changed, 4 insertions(+), 1 deletion(-)
+
+commit 847436779d7c82b428acfd6339130228bfadca24
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Sun Mar 19 19:19:42 2006 +0000
+
+    fix date
+
+ ChangeLog |   2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 401bae69cc7ade676cacd89b483f0a93a653c7a1
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Sun Mar 19 17:01:05 2006 +0000
+
+    fix htmloutputdev
+
+ ChangeLog             |    4 ++++
+ utils/HtmlOutputDev.cc |    2 +-
+ utils/HtmlOutputDev.h |    2 +-
+ 3 files changed, 6 insertions(+), 2 deletions(-)
+
+commit d56330e688c0a40b4e206ed3bbddd06d7f3ee66c
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Thu Mar 16 22:04:56 2006 +0000
+
+           * poppler/Page.cc: Remove a #ifdef that was never defined
+           (nice to
+           have so sucky W args), probably came from gpdf (it's not
+           on xpdf
+           sources) and was causing bugs 6079 and 6167
+
+    Might be worth backporting to the stable branch
+
+ ChangeLog      |    8 +++++++-
+ poppler/Page.cc |    2 --
+ 2 files changed, 7 insertions(+), 3 deletions(-)
+
+commit 7ed6737b00ece7ca00cee1d148752b11700370e6
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Thu Mar 16 19:21:11 2006 +0000
+
+    poppler/FontInfo.cc: Embedded fonts don't have a font file
+
+ ChangeLog          |    4 ++++
+ poppler/FontInfo.cc |  20 ++++++++++++--------
+ 2 files changed, 16 insertions(+), 8 deletions(-)
+
+commit a34688ee29e1cdfcbaca232cf005af55af87f796
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Tue Mar 14 19:34:10 2006 +0000
+
+    * qt4/src/poppler-qt4.h: Fix compilation with gcc4.1, patch by
+    Michael Olbrich
+
+ ChangeLog            |    5 +++++
+ qt4/src/poppler-qt4.h |   10 +++++-----
+ 2 files changed, 10 insertions(+), 5 deletions(-)
+
+commit 1a90b3aaf6be4ca3ebb47e904842b1e14a0e8dfc
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Sat Mar 11 15:19:02 2006 +0000
+
+    * poppler/FontInfo.cc:
+    * poppler/FontInfo.h: Add getFile() function that returns
+    the path of the font that is beign used in the system to
+    represent that font
+    * qt4/src/poppler-document.cc:
+    * qt4/src/poppler-fontinfo.cc:
+    * qt4/src/poppler-private.h:
+    * qt4/src/poppler-qt4.h: Add the file() function
+    * qt4/tests/poppler-fonts.cpp: Show the path of the font
+    used to represent each font
+
+    May be interesting to have in the other frontends
+
+ ChangeLog                  |   13 +++++++++++++
+ poppler/FontInfo.cc        |   10 ++++++++++
+ poppler/FontInfo.h         |    2 ++
+ qt4/src/poppler-document.cc |  14 +-------------
+ qt4/src/poppler-fontinfo.cc |  29 +++++++++--------------------
+ qt4/src/poppler-private.h   |  29 +++++++++++++++++++++++++++++
+ qt4/src/poppler-qt4.h      |    8 ++++++--
+ qt4/tests/poppler-fonts.cpp |   5 +++--
+ 8 files changed, 73 insertions(+), 37 deletions(-)
+
+commit 22b1618185ec70895ec644d9e590c266ff98c9db
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Thu Mar 9 21:56:07 2006 +0000
+
+    Build with cairo disabled, patch by Eduardo de Barros Lima
+
+ ChangeLog       |    5 +++++
+ glib/Makefile.am |    2 +-
+ 2 files changed, 6 insertions(+), 1 deletion(-)
+
+commit 50ecfadab36a9769b09e4c2c1670d86448a0e1ee
+Author: Kristian Høgsberg <krh@redhat.com>
+Date:  Tue Feb 28 23:24:59 2006 +0000
+
+    2006-02-28 Kristian Høgsberg  <krh@redhat.com>
+
+           * configure.ac: Bump release to 0.5.1.
+
+           * NEWS: Sum up 0.5.1 changes so far.
+
+           * TextOutputDev.h: add getters for a couple of attributes.
+
+           * glib/Makefile.am:
+           * poppler/Makefile.am: Move cairo link dependency to glib
+           bindings.
+
+ ChangeLog              |   11 +++++++++++
+ NEWS                   |   10 ++++++++++
+ configure.ac           |    2 +-
+ glib/Makefile.am       |   11 ++++++-----
+ poppler/Makefile.am    |   19 ++++++++-----------
+ poppler/TextOutputDev.h |    7 +++++--
+ qt/Makefile.am                 |    1 +
+ test/Makefile.am       |   16 +++++++++-------
+ utils/Makefile.am      |   29 +++++++++++++++++------------
+ 9 files changed, 68 insertions(+), 38 deletions(-)
+
+commit b9e951ac68b9977ab7217ad0346bcf46a3fa3dfe
+Author: Kristian Høgsberg <krh@redhat.com>
+Date:  Tue Feb 28 19:59:58 2006 +0000
+
+    2006-02-28 Kristian Høgsberg  <krh@redhat.com>
+
+           * goo/gmem.c: (gmalloc), (grealloc):
+           * poppler/JBIG2Stream.cc:
+           * poppler/Stream.cc:
+           * poppler/Stream.h:
+           * splash/SplashXPathScanner.cc:
+
+           More integer overflow fixes from Derek Noonburg (#5922).
+
+ ChangeLog             |   10 ++++++++++
+ goo/gmem.c            |    9 +++++----
+ poppler/JBIG2Stream.cc |   12 ++++++++++--
+ poppler/Stream.cc     |    7 +++++++
+ poppler/Stream.h      |    2 +-
+ 5 files changed, 33 insertions(+), 7 deletions(-)
+
+commit 46db73a142d65a0c944910388d5971debc06ecbf
+Author: Kristian Høgsberg <krh@redhat.com>
+Date:  Tue Feb 28 18:31:59 2006 +0000
+
+    2006-02-28 Kristian Høgsberg  <krh@redhat.com>
+
+           * poppler/PSOutputDev.cc: Make PSOutputDev constructor respect
+           passed in paper size (#5946, #5749).
+
+ ChangeLog             |    5 +++++
+ poppler/PSOutputDev.cc |   14 ++++++++------
+ 2 files changed, 13 insertions(+), 6 deletions(-)
+
+commit 0f7f2182b2abe965b382937f5569b65a8828fc93
+Author: Kristian Høgsberg <krh@redhat.com>
+Date:  Tue Feb 28 18:25:00 2006 +0000
+
+    2006-02-28 Kristian Høgsberg  <krh@redhat.com>
+
+           * glib/poppler-document.cc (info_dict_get_string): Refactor
+           _popper_goo_string_to_utf8() out into it's own function.
+
+           * glib/poppler-page.cc (poppler_page_get_property): Use
+           _popper_goo_string_to_utf8() here to convert ucs2 page labels.
+
+           * glib/poppler-page.cc (poppler_page_get_selection_region):
+           Add
+           braces to fix warning.
+
+           * poppler/PageLabelInfo.cc: If the label prefix string has
+           a ucs2
+           marker, append the number part of the label as ucs2 (#5952).
+
+ ChangeLog                              |   14 +++
+ glib/poppler-document.cc               |   52 +++++------
+ glib/poppler-page.cc                   |   23 +++--
+ glib/poppler-private.h                         |    3 +
+ glib/reference/tmpl/poppler-enums.sgml  |  150
+ -------------------------------
+ glib/reference/tmpl/poppler-unused.sgml |  130
+ +++++++++++++++++++++++++++
+ glib/test-poppler-glib.c               |    2 +-
+ goo/GooString.cc                       |    5 ++
+ goo/GooString.h                        |    4 +
+ poppler/PageLabelInfo.cc               |   39 +++++---
+ poppler/PageLabelInfo.h                |    2 +-
+ 11 files changed, 228 insertions(+), 196 deletions(-)
+
+commit 1bf83cdc8b75e1c76956ae643ee273e0b558fd08
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Sat Feb 25 12:30:30 2006 +0000
+
+    fix warning
+
+ ChangeLog        |    4 ++++
+ poppler/Object.cc |   3 ++-
+ 2 files changed, 6 insertions(+), 1 deletion(-)
+
+commit eb5642f396c8772c83b2cf27da437413b692c952
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Thu Feb 23 22:26:05 2006 +0000
+
+    Don't build pdftoppm when splashoutput is disabled as it does not link
+
+ ChangeLog        |    5 +++++
+ utils/Makefile.am |   13 +++++++++++--
+ 2 files changed, 16 insertions(+), 2 deletions(-)
+
+commit 7c5c1361045429a429a6f40d936f8c7c01fe0d07
+Author: Jeff Muizelaar <jeff@infidigm.net>
+Date:  Sat Feb 18 20:17:00 2006 +0000
+
+    2006-02-18 Jeff Muizelaar  <jeff@infidigm.net>
+
+       * poppler/CairoOutputDev.cc:
+       * poppler/CairoOutputDev.h:
+       * poppler/GfxState.cc:
+       * poppler/GfxState.h: Add support for drawSoftMaskedImage to
+       CairoOutputDev. Ugly but works.
+
+ ChangeLog                |    8 ++++
+ poppler/CairoOutputDev.cc |  101
+ +++++++++++++++++++++++++++++++++++++++++++++
+ poppler/CairoOutputDev.h  |   6 +++
+ poppler/GfxState.cc      |   50 ++++++++++++++++++++++
+ poppler/GfxState.h       |    2 +
+ 5 files changed, 167 insertions(+)
+
+commit dcb748f68112bd5f99fea8a3da06666be6cff0c5
+Author: Jeff Muizelaar <jeff@infidigm.net>
+Date:  Thu Feb 16 19:41:17 2006 +0000
+
+    2006-02-16 Jeff Muizelaar  <jeff@infidigm.net>
+
+       * poppler/CairoOutputDev.cc: Work around cairo bug when scaling
+       1x1 bitmaps. Fixes #3387. Also gives a performance improvement.
+
+ ChangeLog                |    5 +++++
+ poppler/CairoOutputDev.cc |   33 ++++++++++++++++++++++++---------
+ 2 files changed, 29 insertions(+), 9 deletions(-)
+
+commit ef1070f6ca2d1e74c5f94728f3aaae22f0990c17
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Thu Feb 16 19:28:54 2006 +0000
+
+    Update soname
+
+ ChangeLog          |    8 ++++++++
+ glib/Makefile.am    |   2 ++
+ poppler/Makefile.am |   2 ++
+ qt/Makefile.am      |   2 ++
+ qt4/src/Makefile.am |   2 ++
+ 5 files changed, 16 insertions(+)
+
+commit 24b9f5c33fb00ff80a79b34444282a57288f636c
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Mon Feb 13 23:04:54 2006 +0000
+
+    * poppler/ArthurOutputDev.cc: Make it compile after changing code
+    so we did not pass files to freetype but buffers
+
+ ChangeLog                 |    5 +++++
+ poppler/ArthurOutputDev.cc |  53
+ ++++++++++++++++----------------------------
+ 2 files changed, 24 insertions(+), 34 deletions(-)
+
+commit 0bda90310b267d3a4963096293eb2bd29b120768
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Mon Feb 13 22:38:44 2006 +0000
+
+    Probably the last of inner patches missing from kpdf
+    Everybody will we happy now, kpdf has been finally assimilated
+
+ ChangeLog             |    5 ++
+ poppler/PSOutputDev.cc |  124
+ ++++++++++++++++++++++++++++++++++++++++++++----
+ poppler/PSOutputDev.h |    4 +-
+ 3 files changed, 123 insertions(+), 10 deletions(-)
+
+commit cf9867fbbee2468a955b5845016585eeedf2debe
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Mon Feb 6 20:49:21 2006 +0000
+
+    Various fixes from Frank Meerkötter to enable fixedpoint arithmetic
+
+ ChangeLog           |    8 ++++++++
+ configure.ac        |    2 +-
+ goo/FixedPoint.h     |    2 +-
+ splash/Splash.cc     |    4 ++--
+ splash/SplashTypes.h |    2 +-
+ 5 files changed, 13 insertions(+), 5 deletions(-)
+
+commit f04e2c4f20f821ff8cb9465a715ccbb22091d449
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Mon Feb 6 18:50:10 2006 +0000
+
+    Jeff Muizelaar's improvements to my yesterday's small patches
+
+ ChangeLog             |    6 ++++++
+ poppler/Annot.cc      |    9 ++++-----
+ poppler/JBIG2Stream.cc |    2 +-
+ 3 files changed, 11 insertions(+), 6 deletions(-)
+
+commit 33e98f81cdfda0935ac7ea79a691976465ec790b
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Sun Feb 5 15:46:10 2006 +0000
+
+    Some small fixes from kpdf
+
+ ChangeLog                 |    8 ++++++++
+ poppler/Gfx.cc                    |    1 +
+ poppler/GfxFont.cc        |    1 +
+ poppler/JBIG2Stream.cc     |   2 +-
+ poppler/SplashOutputDev.cc |   1 -
+ 5 files changed, 11 insertions(+), 2 deletions(-)
+
+commit 6d9e6489d24b3105204ff4233f6493136e9b5715
+Author: Jeff Muizelaar <jeff@infidigm.net>
+Date:  Sat Feb 4 21:10:41 2006 +0000
+
+    2006-02-04 Jeff Muizelaar  <jeff@infidigm.net>
+
+       * poppler/Gfx.cc:
+       * poppler/OutputDev.cc:
+       * poppler/OutputDev.h: Let output devices know about pdf grouping
+       operators.
+       Patch by Thorkild Stray.
+
+ ChangeLog           |    8 ++++++++
+ poppler/Gfx.cc       |   14 ++++++++++++++
+ poppler/OutputDev.cc |   16 ++++++++++++++++
+ poppler/OutputDev.h  |   10 ++++++++++
+ 4 files changed, 48 insertions(+)
+
+commit b4e34d905cd0ca5815a450de35b4c2774f4887c9
+Author: Jeff Muizelaar <jeff@infidigm.net>
+Date:  Sat Feb 4 20:48:25 2006 +0000
+
+    2006-02-04 Jeff Muizelaar  <jeff@infidigm.net>
+
+       * poppler/GlobalParams.cc: Check all fonts returned by fontconfig.
+       Discard the ones that are not truetype or type1. Fixes #5758.
+       Patch by Ed Catmur.
+
+ ChangeLog              |    6 ++++++
+ poppler/GlobalParams.cc |   51
+ ++++++++++++++++++++++++++---------------------
+ 2 files changed, 34 insertions(+), 23 deletions(-)
+
+commit fd85a0afdd7b4cafc68df400d4f94fccaea18c76
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Sat Feb 4 20:34:13 2006 +0000
+
+    Remove bug from "do not use an external file to pass fonts to
+    Freetype" patch, patch by Stefan Schweizer
+
+ ChangeLog                 |    3 +++
+ poppler/SplashOutputDev.cc |  14 ++++++++++----
+ 2 files changed, 13 insertions(+), 4 deletions(-)
+
+commit 67ca9d01f8badcf542f60b23521c384c9840ca1b
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Sat Feb 4 20:31:00 2006 +0000
+
+    Added a DTD of the xml pdftohtml creates patch by Stefan Schweizer
+
+ ChangeLog        |    2 ++
+ utils/Makefile.am |   2 ++
+ utils/pdf2xml.dtd |   28 ++++++++++++++++++++++++++++
+ 3 files changed, 32 insertions(+)
+
+commit f4df23ca7f396883a906f16dfc8db1ebd528e04a
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Sat Feb 4 20:24:03 2006 +0000
+
+    ignore++
+
+ utils/.cvsignore |    1 +
+ 1 file changed, 1 insertion(+)
+
+commit 93ad488679f594e45547a67e2a7397f4c8bd2820
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Sat Feb 4 20:07:07 2006 +0000
+
+    Actually create pdftoppm patch by Stefan Schweizer
+
+ ChangeLog        |   44 +++++++++++++++++++++++++-------------------
+ utils/Makefile.am |   10 ++++++++--
+ utils/pdftoppm.cc |   9 +++++----
+ 3 files changed, 38 insertions(+), 25 deletions(-)
+
+commit 7d2be955e6345a052590b06b29a6d2fb2111e2e6
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Thu Feb 2 23:06:20 2006 +0000
+
+    CVE-2006-0301 fix by Derek though KDE security team
+
+ ChangeLog                   |    5 +++++
+ splash/SplashXPathScanner.cc |   32 ++++++++++++++++++++------------
+ 2 files changed, 25 insertions(+), 12 deletions(-)
+
+commit c191e7d0f13ea429017e4d4f79ce803e84c72e40
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Thu Feb 2 22:54:27 2006 +0000
+
+    i should learn on which day i live
+
+ ChangeLog |   2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 1ddeed60d07c3a7e011f3f594fa9299379d0b000
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Thu Feb 2 22:50:01 2006 +0000
+
+    don't use files to pass fonts to freetype
+
+ ChangeLog                   |   26 ++++++++++++
+ fofi/FoFiTrueType.cc        |   43 +++++++++++++++----
+ fofi/FoFiTrueType.h         |    7 ++--
+ fofi/FoFiType1C.h           |    2 +-
+ goo/gfile.cc                |    8 ++++
+ poppler/GfxFont.cc          |   49 +++++++++++++++++++++-
+ poppler/GfxFont.h           |    2 +
+ poppler/GlobalParams.cc      |    1 +
+ poppler/GlobalParams.h       |    1 +
+ poppler/SplashOutputDev.cc   |   94
+ +++++++++++++++++++++---------------------
+ splash/SplashFTFontEngine.cc |   44 +++++++++++++-------
+ splash/SplashFTFontEngine.h  |   16 ++++---
+ splash/SplashFTFontFile.cc   |   47 +++++++++++++--------
+ splash/SplashFTFontFile.h    |   18 ++++----
+ splash/SplashFontEngine.cc   |   46 ++++++++-------------
+ splash/SplashFontEngine.h    |   16 ++++---
+ splash/SplashFontFile.cc     |   70 +++++++++++++++++++++++++++----
+ splash/SplashFontFile.h      |   25 +++++++++--
+ splash/SplashT1FontEngine.cc |   29 +++++++------
+ splash/SplashT1FontFile.cc   |   30 +++++++++++---
+ splash/SplashT1FontFile.h    |    4 +-
+ 21 files changed, 396 insertions(+), 182 deletions(-)
+
+commit 34df4cfa5cd8788ccf2ea698cbedd05b209041f5
+Author: Jeff Muizelaar <jeff@infidigm.net>
+Date:  Wed Feb 1 03:52:12 2006 +0000
+
+    2006-01-31 Jeff Muizelaar  <jeff@infidigm.net>
+
+       * poppler/GlobalParams.cc (GlobalParams::getDisplayFont):
+       Allow ttc fonts to be used.
+
+ ChangeLog              |    5 +++++
+ poppler/GlobalParams.cc |    2 +-
+ 2 files changed, 6 insertions(+), 1 deletion(-)
+
+commit 0184e7c928ec60c0aa3f8634d96ae0cf0ad6d157
+Author: Jeff Muizelaar <jeff@infidigm.net>
+Date:  Sun Jan 29 05:16:31 2006 +0000
+
+    2006-01-28 Jeff Muizelaar  <jeff@infidigm.net>
+
+       * glib/poppler-attachment.h: fix compile by adding <time.h>
+       include.
+       Acked-by: Jonathan Blanford <jrb@redhat.com>
+
+ ChangeLog                |    5 +++++
+ glib/poppler-attachment.h |   1 +
+ 2 files changed, 6 insertions(+)
+
+commit c805e25f2f074640e4345f8b71eef8d7de677109
+Author: Kristian Høgsberg <krh@redhat.com>
+Date:  Thu Jan 26 19:25:07 2006 +0000
+
+    2006-01-26 Kristian Høgsberg  <krh@redhat.com>
+
+           * poppler/CairoOutputDev.cc: Patch from Christian Krause;
+           handle
+           0-width lines (#5545).
+
+ ChangeLog                |    5 +++++
+ poppler/CairoOutputDev.cc |   6 +++++-
+ 2 files changed, 10 insertions(+), 1 deletion(-)
+
+commit 4f48abcd4c21460d4c5b718a7ba18cdceb30c2d1
+Author: Jonathan Blandford <jrb@redhat.com>
+Date:  Tue Jan 24 06:21:39 2006 +0000
+
+    Tue Jan 24 01:19:40 2006  Jonathan Blandford  <jrb@redhat.com>
+
+           * glib/Makefile.am:
+           * glib/poppler-attachment.cc:
+           * glib/poppler-attachment.h:
+           * glib/poppler-document.cc:
+           * glib/poppler-document.h:
+           * glib/poppler-page.cc:
+           * glib/poppler-private.h:
+           * glib/poppler.h:
+           * glib/test-poppler-glib.c:
+           * glib/reference/tmpl/poppler-enums.sgml:
+           * glib/reference/tmpl/poppler-unused.sgml: glib bindings
+           for the
+           embedded file support.  It doesn't support mtime and
+           ctime yet,
+           but the rest works.
+
+ ChangeLog                              |   16 +++
+ glib/Makefile.am                       |    2 +
+ glib/poppler-attachment.cc             |  223
+ +++++++++++++++++++++++++++++++
+ glib/poppler-attachment.h              |   67 ++++++++++
+ glib/poppler-document.cc               |   63 +++++++++
+ glib/poppler-document.h                |    6 +
+ glib/poppler-page.cc                   |    2 +-
+ glib/poppler-private.h                         |    6 +-
+ glib/poppler.h                                 |    1 +
+ glib/reference/tmpl/poppler-enums.sgml  |  150 +++++++++++++++++++++
+ glib/reference/tmpl/poppler-unused.sgml |  130 ------------------
+ glib/test-poppler-glib.c               |   26 +++-
+ 12 files changed, 559 insertions(+), 133 deletions(-)
+
+commit 052bf4b80c8a0dc45f6222617bfd8ae1b9c40410
+Author: Kristian Høgsberg <krh@redhat.com>
+Date:  Mon Jan 23 18:52:48 2006 +0000
+
+    2006-01-23 Kristian Høgsberg  <krh@redhat.com>
+
+           * configure.ac:
+           * poppler/GlobalParams.cc:
+           * poppler/poppler-config.h.in:
+           * utils/pdftohtml.cc:
+           * utils/pdftops.cc: Respect command line paper size settings
+           (#5641).
+           Drop the built-in paper sizes.
+
+ ChangeLog                  |    9 +++++++++
+ configure.ac               |    1 -
+ poppler/GlobalParams.cc     |  23 ++---------------------
+ poppler/poppler-config.h.in |   5 -----
+ utils/pdftohtml.cc         |    4 +---
+ utils/pdftops.cc           |    4 +++-
+ 6 files changed, 15 insertions(+), 31 deletions(-)
+
+commit fb2054a5031d60aac3ccc9a36b3ed88a32188e33
+Author: Kristian Høgsberg <krh@redhat.com>
+Date:  Mon Jan 23 15:40:54 2006 +0000
+
+    2006-01-23 Kristian Høgsberg  <krh@redhat.com>
+
+           * glib/test-poppler-glib.c (print_document_info, print_index):
+           Move variable declarations to top (#5692).
+
+           * utils/*.cc: Move config.h #include to top of #include's
+           (#5693).
+
+ ChangeLog               |    5 +++++
+ glib/test-poppler-glib.c |    5 +++--
+ poppler/FontInfo.cc     |    2 +-
+ utils/HtmlOutputDev.cc   |    2 +-
+ utils/ImageOutputDev.cc  |    2 +-
+ utils/pdffonts.cc       |    2 +-
+ utils/pdfimages.cc      |    2 +-
+ utils/pdfinfo.cc        |    2 +-
+ utils/pdftohtml.cc      |    4 ++--
+ utils/pdftoppm.cc       |    2 +-
+ utils/pdftops.cc        |    2 +-
+ utils/pdftotext.cc      |    2 +-
+ 12 files changed, 19 insertions(+), 13 deletions(-)
+
+commit 836af3529e827e25f20cb4710cbbf9ed0371a42c
+Author: Kristian Høgsberg <krh@redhat.com>
+Date:  Mon Jan 23 14:45:30 2006 +0000
+
+    2006-01-23 Kristian Høgsberg  <krh@redhat.com>
+
+           * splash/SplashFTFont.cc: Don't use deprecated freetype
+           include
+           files.
+
+ ChangeLog             |    5 +++++
+ splash/SplashFTFont.cc |    3 ++-
+ 2 files changed, 7 insertions(+), 1 deletion(-)
+
+commit 60e13bf84e4f020a264811e4a5bf85d67e15d6df
+Author: Jeff Muizelaar <jeff@infidigm.net>
+Date:  Sat Jan 21 21:56:40 2006 +0000
+
+    2006-01-21 Jeff Muizelaar  <jeff@infidigm.net>
+
+       * TODO: Add my todo list.
+
+ ChangeLog |   4 ++++
+ TODO     |   10 ++++++++++
+ 2 files changed, 14 insertions(+)
+
+commit cebba06563d1b691a8bbb83828e47c9cc91e231a
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Wed Jan 18 22:40:26 2006 +0000
+
+    ok, ok, lasts files, i promise :-/
+
+ qt4/tests/check_attachments.cpp   |  151
+ +++++++++++++++++++++++++++++++++++++
+ qt4/tests/poppler-attachments.cpp |   37 +++++++++
+ 2 files changed, 188 insertions(+)
+
+commit 0b12e7cce6c6633b1d07e2902a9fa13ff52079e7
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Wed Jan 18 22:38:59 2006 +0000
+
+    YAMF = Yet Another Missing File
+
+ qt4/src/poppler-embeddedfile.cc |  106
+ +++++++++++++++++++++++++++++++++++++++
+ 1 file changed, 106 insertions(+)
+
+commit 38c8f3a53b3eb2be1fbfa360f77285037d89b719
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Wed Jan 18 22:36:01 2006 +0000
+
+    as usual i foget some files
+
+ poppler/UGooString.cc |   86
+ +++++++++++++++++++++++++++++++++++++++++++++++++
+ poppler/UGooString.h  |   55 +++++++++++++++++++++++++++++++
+ 2 files changed, 141 insertions(+)
+
+commit ad6e7d862c8fa6e10a7dbbb3391cbb0b6c922375
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Wed Jan 18 22:32:13 2006 +0000
+
+    Brad patch for embedded document extraction, only has Qt4 bindings
+    for now, needs Qt3 and glib work
+
+ ChangeLog                    |   42 +++++++++++++
+ glib/poppler-action.cc        |    2 +-
+ glib/poppler-document.cc      |    1 +
+ poppler/Annot.cc             |    1 +
+ poppler/Catalog.cc           |  133
+ ++++++++++++++++++++++++++++++++++++++---
+ poppler/Catalog.h            |   60 +++++++++++++++++--
+ poppler/Dict.cc              |   17 +++---
+ poppler/Dict.h                       |   15 ++---
+ poppler/FontInfo.cc          |    1 +
+ poppler/Function.cc          |    1 +
+ poppler/Gfx.cc                       |    1 +
+ poppler/GfxFont.cc           |    5 +-
+ poppler/GfxState.cc          |    1 +
+ poppler/Link.cc              |    9 +--
+ poppler/Link.h                       |    9 +--
+ poppler/Makefile.am          |    2 +
+ poppler/Object.h             |   17 +++---
+ poppler/Outline.cc           |    1 +
+ poppler/PDFDoc.cc            |    1 +
+ poppler/PDFDoc.h             |    2 +-
+ poppler/PSOutputDev.cc        |    5 +-
+ poppler/Page.cc              |    1 +
+ poppler/PageLabelInfo.cc      |    1 +
+ poppler/Parser.cc            |    2 +
+ poppler/SecurityHandler.cc    |    1 +
+ poppler/Stream.cc            |    1 +
+ poppler/XRef.cc              |    1 +
+ qt/poppler-document.cc        |    1 +
+ qt/poppler-page-transition.cc |    1 +
+ qt4/src/Makefile.am          |    1 +
+ qt4/src/poppler-document.cc   |   26 +++++++-
+ qt4/src/poppler-private.h     |    2 +
+ qt4/src/poppler-qt4.h        |   68 +++++++++++++++++++++
+ qt4/tests/.cvsignore         |    2 +
+ qt4/tests/Makefile.am        |   16 ++++-
+ utils/HtmlOutputDev.cc        |    1 +
+ utils/pdffonts.cc            |    1 +
+ utils/pdfinfo.cc             |    1 +
+ utils/pdftohtml.cc           |    1 +
+ utils/pdftotext.cc           |    1 +
+ 40 files changed, 401 insertions(+), 54 deletions(-)
+
+commit 550fb0b617ece7951ec39aec5fa5504cc90022fc
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Wed Jan 18 21:22:12 2006 +0000
+
+    Add some more documentation to PageTransition, patch by Stefan Kebekus
+
+ ChangeLog                   |    6 ++++++
+ qt/poppler-page-transition.h |   40
+ +++++++++++++++++++++++++++++++++-------
+ qt4/src/Doxyfile            |    2 +-
+ 3 files changed, 40 insertions(+), 8 deletions(-)
+
+commit d66f3647ff1c38318d4cd056cb4d4c7a32eb6603
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Wed Jan 18 18:54:12 2006 +0000
+
+    poppler/CharCodeToUnicode.cc: Fix check for length that was not
+           having into account that there could be \n or \r in tokens
+           an that
+           those do not have to be took into account. Fixes
+           http://bugs.kde.org/show_bug.cgi?id=120310
+
+ ChangeLog                   |    9 ++++++++-
+ poppler/CharCodeToUnicode.cc |   31 +++++++++++++++++++++++++++----
+ 2 files changed, 35 insertions(+), 5 deletions(-)
+
+commit d78b670339c8f92a32ab5f0a574d0e21690806f8
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Tue Jan 17 21:35:31 2006 +0000
+
+    When doing the parsing check with XREF we did not grow too much. Fixes
+    serialata10a.pdf
+
+ ChangeLog        |   10 ++++++++++
+ poppler/Lexer.cc  |   22 +++++++++++++++++++---
+ poppler/Lexer.h   |   8 +++++---
+ poppler/Parser.cc |   6 +++---
+ poppler/Parser.h  |   2 +-
+ poppler/XRef.cc   |   17 +++++++++++++++++
+ poppler/XRef.h    |   3 +++
+ 7 files changed, 58 insertions(+), 10 deletions(-)
+
+commit f5db636af0cd6e05cd7ede37a8585001d51192a1
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Tue Jan 17 20:33:08 2006 +0000
+
+    i suck
+    i suck
+    i suck
+    i suck
+    i suck
+    A file i forgot to add to make it compile :-/
+
+ qt/poppler-page-transition-private.h |   28 ++++++++++++++++++++++++++++
+ 1 file changed, 28 insertions(+)
+
+commit 9cc97908ea67ab431e58129f589e00f41f40a143
+Author: Jeff Muizelaar <jeff@infidigm.net>
+Date:  Thu Jan 12 23:54:08 2006 +0000
+
+    2006-01-12 Jeff Muizelaar  <jeff@infidigm.net>
+
+       * poppler/GlobalParams.cc: Make buildFcPattern() static.
+
+ ChangeLog              |    4 ++++
+ poppler/GlobalParams.cc |    2 +-
+ 2 files changed, 5 insertions(+), 1 deletion(-)
+
+commit c7ce134fb1dadb46e2b3773d0976ea31da0a046f
+Author: Kristian Høgsberg <krh@redhat.com>
+Date:  Wed Jan 11 16:52:58 2006 +0000
+
+    2006-01-11 Kristian Høgsberg  <krh@redhat.com>
+
+           * poppler/JBIG2Stream.cc:
+           * poppler/Stream.cc: Merge patch to fix CVE-2005-3624,
+           CVE-2005-3625 and CVE-2005-3627 issues.
+
+ ChangeLog             |    6 ++++++
+ poppler/JBIG2Stream.cc |   32 +++++++++++++++++++++++++++++++-
+ poppler/Stream.cc     |    8 +++++---
+ 3 files changed, 42 insertions(+), 4 deletions(-)
+
+commit ec7fb41725c19bc7f2aad1073fe6397ea0a8da0d
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Tue Jan 10 21:57:28 2006 +0000
+
+           * configure.ac:
+           * m4/qt.m4: Fix bugs created when splitting the code from
+           configure.ac, take QTDIR into account when looking for
+           QtTestLib and
+           do not die if it is not found as it is not mandatory
+           * qt/poppler-page-transition.cc:
+           * qt/poppler-page.cc:
+           * qt/poppler-private.h:
+           * qt4/tests/Makefile.am:
+           * qt4/src/poppler-qt4.h:
+           * qt4/src/poppler-page.cc:
+           * qt4/src/Makefile.am: Fix mess created my the moving and
+           renaming of
+           PageTransition.cc
+
+ ChangeLog                    |   15 +++++++++++++++
+ configure.ac                 |   14 ++++----------
+ m4/qt.m4                     |    5 +++++
+ qt/poppler-page-transition.cc |    2 +-
+ qt/poppler-page.cc           |    1 +
+ qt/poppler-private.h         |    5 -----
+ qt4/src/Makefile.am          |    1 +
+ qt4/src/poppler-page.cc       |    2 +-
+ qt4/src/poppler-qt4.h        |    2 +-
+ qt4/tests/Makefile.am        |    1 +
+ 10 files changed, 30 insertions(+), 18 deletions(-)
+
+commit d9bc53a741b3bbd2a202662c66fe70f49ac72a49
+Author: Kristian Høgsberg <krh@redhat.com>
+Date:  Tue Jan 10 17:59:51 2006 +0000
+
+    2006-01-10 Kristian Høgsberg  <krh@redhat.com>
+
+           * splash/Makefile.am: Only install splash headers if
+           --enable-xpdf-headers is given.
+
+           * Makefile.am (DISTCHECK_CONFIGURE_FLAGS): Set this here.
+
+ ChangeLog         |    7 +++++++
+ Makefile.am       |    1 +
+ splash/Makefile.am |   4 ++++
+ 3 files changed, 12 insertions(+)
+
+commit ea6d9b97cec6fabf8a5005c565bbdb378bed7f54
+Author: Jeff Muizelaar <jeff@infidigm.net>
+Date:  Tue Jan 10 17:55:59 2006 +0000
+
+    2006-01-10 Jeff Muizelaar  <jeff@infidigm.net>
+
+       * poppler/CairoOutputDev.cc:
+       * poppler/CairoOutputDev.h:
+       Fix the following fixme in CairoOutputDevice.
+
+       // FIXME: This is quite right yet, we need to accumulate all
+       // glyphs within one text object before we clip.  Right now this
+       // just add this one string.
+
+       The fix uses a strategy similar to the one the Splash backend.
+       textClipPath is used to store the appended path from each call to
+       endString(). The accumulated path is clipped in endTextObject.
+
+ ChangeLog                |   14 ++++++++++++++
+ poppler/CairoOutputDev.cc |   27 +++++++++++++++++++++++----
+ poppler/CairoOutputDev.h  |   1 +
+ 3 files changed, 38 insertions(+), 4 deletions(-)
+
+commit 9e8a655a2bd3ca8cff1a150dce0dd378aeca047b
+Author: Jeff Muizelaar <jeff@infidigm.net>
+Date:  Sun Jan 8 22:59:48 2006 +0000
+
+    2006-01-08 Jeff Muizelaar  <jeff@infidigm.net>
+
+       * poppler/CairoOutputDev.cc: Don't try and load type3 fonts
+       (#4030).
+
+ ChangeLog                |    6 +++++-
+ poppler/CairoOutputDev.cc |   5 ++++-
+ 2 files changed, 9 insertions(+), 2 deletions(-)
+
+commit 25fd8e1ea87c41855a4ee702fbe47f5661a54c22
+Author: Jeff Muizelaar <jeff@infidigm.net>
+Date:  Sun Jan 8 22:51:17 2006 +0000
+
+    2006-01-08 Jeff Muizelaar  <jeff@infidigm.net>
+
+       * poppler/Page.cc: use colToByte for reading thumbnails (#5420).
+
+       Patch by Nickolay V. Shmyrev.
+
+ ChangeLog      |    6 ++++++
+ poppler/Page.cc |    6 +++---
+ 2 files changed, 9 insertions(+), 3 deletions(-)
+
+commit df73ee2ec4b65ccf611f0fd76fb456cc797693d4
+Author: Jeff Muizelaar <jeff@infidigm.net>
+Date:  Sat Jan 7 06:10:15 2006 +0000
+
+    2006-01-07 Jeff Muizelaar <jeff@infidigm.net>
+
+       * poppler/CairoOutputDev.cc: Initialize (fill|stroke)_opacity.
+
+ ChangeLog                |    4 ++++
+ poppler/CairoOutputDev.cc |   2 ++
+ 2 files changed, 6 insertions(+)
+
+commit 18eb8de66749082e4aa65cc6d369a533826fab33
+Author: Kristian Høgsberg <krh@redhat.com>
+Date:  Fri Jan 6 10:05:58 2006 +0000
+
+    2006-01-06 Kristian Høgsberg  <krh@redhat.com>
+
+           * qt/poppler-page.cc:
+           * qt/poppler-private.h:
+           * qt/poppler-qt.h:
+           * qt4/src/Makefile.am:
+           * qt/Makefile.am:
+           * poppler/Makefile.am: Move PageTransition to qt bindings,
+           move
+           contents from Private.h to qt/poppler-private.h.
+
+           * poppler/TextOutputDev.cc (visitWord): Remove #warning.
+
+           * utils/Makefile.am (pdfimages_SOURCES): Add ImageOutputDev.h,
+           use
+           dist_man1_MANS so we actually dist the man pages.
+
+           * goo/Makefile.am (poppler_goo_include_HEADERS): Add
+           GooVector.h.
+
+           * glib/reference/Makefile.am: DOC_SOURCE_DIR must be
+           relative to
+           $(srcdir), fix this to make distchek run.
+
+           * m4/qt.m4:
+           * m4/libjpeg.m4:
+           * acinclude.m4:
+           * configure.ac: Split out Qt and libjpeg checks from
+           configure.ac
+           and acinclude.m4 to m4/qt.m4 and m4/libjpeg.m4.
+
+ ChangeLog                              |   26 ++++
+ acinclude.m4                           |  112 ----------------
+ configure.ac                           |  223
+ +++----------------------------
+ glib/reference/Makefile.am             |    2 +-
+ glib/reference/tmpl/poppler-enums.sgml  |  150 ---------------------
+ glib/reference/tmpl/poppler-unused.sgml |  130 ++++++++++++++++++
+ goo/Makefile.am                        |    1 +
+ m4/libjpeg.m4                          |  109 +++++++++++++++
+ m4/qt.m4                               |  206
+ ++++++++++++++++++++++++++++
+ poppler/Makefile.am                    |    1 -
+ poppler/PageTransition.h               |  118 ----------------
+ poppler/Private.h                      |   30 -----
+ poppler/TextOutputDev.cc               |    2 -
+ qt/Makefile.am                                 |    8 +-
+ qt/poppler-page-transition.cc          |  187 ++++++++++++++++++++++++++
+ qt/poppler-page-transition.h           |  117 ++++++++++++++++
+ qt/poppler-page.cc                     |    1 -
+ qt/poppler-private.h                   |    9 +-
+ qt/poppler-qt.h                        |    2 +-
+ qt4/src/Makefile.am                    |    8 +-
+ utils/Makefile.am                      |   54 ++++++--
+ 21 files changed, 857 insertions(+), 639 deletions(-)
+
+commit 93921e77115ebe4d527f98675e438de485e84507
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Thu Jan 5 23:53:33 2006 +0000
+
+    * poppler/DCTStream.cc: Fix handling of malformed jpeg streams like
+      the one at http://bugs.kde.org/show_bug.cgi?id=119569
+
+    Might be worth backporting to 0.4.x
+
+ ChangeLog           |    5 +++++
+ poppler/DCTStream.cc |   26 ++++++++++++++++----------
+ 2 files changed, 21 insertions(+), 10 deletions(-)
+
+commit 0dc16af02071350a0dc11af4106799378c99cdad
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Thu Jan 5 13:53:58 2006 +0000
+
+    Introduce variants of renderTo that return a QImage and do not use
+    a QPixmap so threading is possible.
+
+ ChangeLog              |    8 +++++++
+ qt/poppler-page.cc     |   18 ++++++++++-----
+ qt/poppler-qt.h        |   30 ++++++++++++++++++++----
+ qt4/src/poppler-page.cc |    9 +++++++-
+ qt4/src/poppler-qt4.h  |   59
+ +++++++++++++++++++++++++----------------------
+ 5 files changed, 85 insertions(+), 39 deletions(-)
+
+commit 5c2cbf5d327c6cc75c073b56c3ab1748c0d24387
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Mon Jan 2 14:24:31 2006 +0000
+
+    Use error() instead std::cerr in PageTranstion.cc
+
+ ChangeLog                |    4 ++++
+ poppler/PageTransition.cc |   5 +++--
+ 2 files changed, 7 insertions(+), 2 deletions(-)
+
+commit da5a4233498b56df611e1c7bca0090306cb5dbe0
+Author: Jonathan Blandford <jrb@redhat.com>
+Date:  Mon Jan 2 00:06:45 2006 +0000
+
+    Sun Jan  1 18:50:51 2006  Jonathan Blandford  <jrb@redhat.com>
+
+           * Makefile.am:
+           * autogen.sh:
+           * configure.ac:
+           * gtk-doc.make:
+           * glib/Makefile.am: enable gtk-doc support.
+
+ ChangeLog       |    8 +++
+ Makefile.am     |    2 +
+ autogen.sh      |   14 +++++
+ configure.ac    |    4 ++
+ glib/Makefile.am |    1 +
+ gtk-doc.make    |  153
+ ++++++++++++++++++++++++++++++++++++++++++++++++++++++
+ m4/gtk-doc.m4   |   53 +++++++++++++++++++
+ 7 files changed, 235 insertions(+)
+
+commit 372c34cc9728d7041bc4f6893c0bae50c9501c50
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Sun Jan 1 22:35:48 2006 +0000
+
+           * qt4/src/poppler-private.h:
+           * qt4/src/poppler-page.cc:
+           * qt4/src/poppler-document.cc: Don't create a SplashOutputDev
+           for
+           every splashRenderToPixmap
+
+ ChangeLog                  |    4 ++++
+ qt4/src/poppler-document.cc |   1 -
+ qt4/src/poppler-page.cc     |  18 +++++-------------
+ qt4/src/poppler-private.h   |  24 +++++++++++++++++++++++-
+ 4 files changed, 32 insertions(+), 15 deletions(-)
+
+commit 6ff83474ac594368015334db9c6b33d3a552079f
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Sun Jan 1 22:18:47 2006 +0000
+
+         * qt/poppler-page.cc:
+         * qt/poppler-private.h: Don't create a SplashOutputDev for every
+           renderToPixmap.
+
+ ChangeLog           |    6 ++++++
+ qt/poppler-page.cc   |    8 +-------
+ qt/poppler-private.h |   24 +++++++++++++++++++++++-
+ 3 files changed, 30 insertions(+), 8 deletions(-)
+
+commit 6942646d4c82327a80b021838a38aa55c1026883
+Author: Jonathan Blandford <jrb@redhat.com>
+Date:  Sun Jan 1 20:34:36 2006 +0000
+
+    Sun Jan  1 15:32:08 2006  Jonathan Blandford  <jrb@redhat.com>
+
+           * glib/reference/*: More gtk-doc work.  Not enabled for
+           building
+           by default, but filled in.
+
+ .cvsignore                                  |    1 +
+ ChangeLog                                   |    5 +
+ glib/reference/.cvsignore                   |   18 ++
+ glib/reference/Makefile.am                  |   87 +++++++
+ glib/reference/poppler-docs.sgml            |   17 ++
+ glib/reference/poppler-sections.txt         |  151 +++++++++++
+ glib/reference/poppler.types                |    4 +
+ glib/reference/tmpl/poppler-action.sgml      |  172 +++++++++++++
+ glib/reference/tmpl/poppler-document.sgml    |  354
+ ++++++++++++++++++++++++++
+ glib/reference/tmpl/poppler-enums.sgml       |  169 ++++++++++++
+ glib/reference/tmpl/poppler-page.sgml       |  243 ++++++++++++++++++
+ glib/reference/tmpl/poppler-private.sgml     |  128 ++++++++++
+ glib/reference/tmpl/poppler.sgml            |  216 ++++++++++++++++
+ glib/reference/tmpl/stamp-poppler-enums.sgml |   19 ++
+ 14 files changed, 1584 insertions(+)
+
+commit 0fab1b711f153859e113cb3b6d734ddcb58fb87a
+Author: Jonathan Blandford <jrb@redhat.com>
+Date:  Sat Dec 31 02:10:33 2005 +0000
+
+    Fri Dec 30 21:08:33 2005  Jonathan Blandford  <jrb@redhat.com>
+
+           * glib/*{cc,h}: Update inline doc comments.  This is in
+           preparation for gtk-doc support.
+
+ ChangeLog               |    5 ++
+ glib/poppler-action.cc   |   14 +++++
+ glib/poppler-action.h   |    2 -
+ glib/poppler-document.cc |  151
+ +++++++++++++++++++++++++++++++++++++++++++++-
+ glib/poppler-document.h  |    4 +-
+ glib/poppler-page.cc    |   28 +++++++++
+ glib/poppler.cc         |   16 +++++
+ glib/test-poppler-glib.c |   29 +++++++++
+ 8 files changed, 243 insertions(+), 6 deletions(-)
+
+commit 313530036b204eaa5ddfa150730302e855560d6a
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Fri Dec 30 22:54:46 2005 +0000
+
+    A delete that slipped from the last patch-commit
+
+ qt4/src/poppler-page.cc |    1 +
+ 1 file changed, 1 insertion(+)
+
+commit cf6f8123af19aca4200b58a454652f68ce8132e2
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Fri Dec 30 22:31:32 2005 +0000
+
+    Puting PageTransition implementation into poppler "core", both Qt
+    and Qt4 frontends use it.
+
+ poppler/Makefile.am      |    1 +
+ poppler/PageTransition.cc |  188
+ +++++++++++++++++++++++++++++++++++++++++++++
+ poppler/PageTransition.h  |  118 ++++++++++++++++++++++++++++
+ poppler/Private.h        |   30 ++++++++
+ qt/Makefile.am                   |    2 +-
+ qt/poppler-page.cc       |  111 +-------------------------
+ qt/poppler-qt.h          |   72 +----------------
+ qt4/src/Makefile.am      |    2 +-
+ qt4/src/poppler-page.cc   |   17 +++-
+ qt4/src/poppler-qt4.h    |   14 +++-
+ 10 files changed, 374 insertions(+), 181 deletions(-)
+
+commit 56035ab199ac6deb5c1e07e745d120d1121a5960
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Fri Dec 30 21:59:58 2005 +0000
+
+     * utils/HtmlOutputDev.cc:
+     * utils/ImageOutputDev.cc: Fix build when using --disable-libjpeg
+
+ ChangeLog              |    5 +++++
+ utils/HtmlOutputDev.cc  |    2 ++
+ utils/ImageOutputDev.cc |    2 ++
+ 3 files changed, 9 insertions(+)
+
+commit 8b64dafc7f1d198fb0052c0d6f0da6de97bbb48d
+Author: Brad Hards <bradh@frogmouth.net>
+Date:  Wed Dec 28 09:23:43 2005 +0000
+
+    Plug a few memory leaks in the Qt4 bindings.
+
+ ChangeLog                       |   25 +++++++++++++++++++
+ qt4/src/poppler-document.cc     |    3 +++
+ qt4/src/poppler-private.h       |    7 +++++-
+ qt4/src/poppler-qt4.h           |    3 +++
+ qt4/tests/check_fonts.cpp       |    8 ++++++
+ qt4/tests/check_metadata.cpp    |   50
+ +++++++++++++++++++++++++++++++++-----
+ qt4/tests/check_pagelayout.cpp   |    6 +++++
+ qt4/tests/check_pagemode.cpp    |   10 ++++++++
+ qt4/tests/check_permissions.cpp  |    2 ++
+ qt4/tests/check_version.cpp     |   22 -----------------
+ qt4/tests/poppler-fonts.cpp     |    1 +
+ qt4/tests/stress-poppler-qt4.cpp |    2 ++
+ 12 files changed, 110 insertions(+), 29 deletions(-)
+
+commit 64c07a20a4ed844f3b3dd26e974f58d5877cf9fd
+Author: Brad Hards <bradh@frogmouth.net>
+Date:  Tue Dec 27 06:10:01 2005 +0000
+
+    qt4/src/poppler-qt4.h and qt4/src/poppler-document.cc: add
+    convertDate() function that
+    turns char* PDF date strings into QDateTime. This version handles
+    the timezone conversions. Refactored the existing date() method
+    to use it.
+
+    qt4/tests/check_dateConversion.cpp: unit tests for convertDate()
+    qt4/tests/check_metadata.cpp: update to reflect UTC.
+    qt4/tests/.cvsignore: suppress check_dateConversion
+
+ ChangeLog                         |    9 ++++
+ qt4/src/poppler-document.cc       |   89 +++++++++++++++++++-----------
+ qt4/src/poppler-qt4.h             |    5 ++
+ qt4/tests/.cvsignore              |    1 +
+ qt4/tests/Makefile.am             |   11 ++--
+ qt4/tests/check_dateConversion.cpp |  105
+ ++++++++++++++++++++++++++++++++++++
+ qt4/tests/check_metadata.cpp      |    4 +-
+ 7 files changed, 188 insertions(+), 36 deletions(-)
+
+commit 4b2e3b5106b75f23c830837a886cd29beb1d1d1b
+Author: Brad Hards <bradh@frogmouth.net>
+Date:  Tue Dec 27 05:08:34 2005 +0000
+
+    * qt4/src/Doxyfile (JAVADOC_AUTOBRIEF): Turned on automatic
+    \brief mode.
+
+    * qt4/src/poppler-qt4.h: Update API documentation. Patch from
+    Stefan Kebekus, with some changes. Removed \brief entries.
+
+ ChangeLog            |    8 +++++
+ qt4/src/Doxyfile      |    2 +-
+ qt4/src/poppler-qt4.h |   81
+ ++++++++++++++++++++++++++++++++++++++-----------
+ 3 files changed, 73 insertions(+), 18 deletions(-)
+
+commit 8d9cf43aaa73d5012428a6a4c5d7e2cccbd3036e
+Author: Kristian Høgsberg <krh@redhat.com>
+Date:  Wed Dec 21 22:09:47 2005 +0000
+
+    2005-12-21 Kristian Høgsberg  <krh@redhat.com>
+
+           * NEWS: Sum up 0.5 changes so far.
+
+           * acinclude.m4: Split jpeg macros out into this file.
+
+           * poppler/Stream.cc: Apply latest CVE-2005-3191 updates.
+
+ ChangeLog           |    8 ++++
+ NEWS                |    8 ++++
+ acinclude.m4        |  112
+ +++++++++++++++++++++++++++++++++++++++++++++++++
+ configure.ac        |  114
+ --------------------------------------------------
+ poppler/JPXStream.cc |    1 +
+ poppler/Stream.cc    |   11 +++--
+ 6 files changed, 137 insertions(+), 117 deletions(-)
+
+commit 97243286560cb4f264b875185c8768a6af09d554
+Author: Kristian Høgsberg <krh@redhat.com>
+Date:  Wed Dec 21 17:30:33 2005 +0000
+
+    2005-12-21 Kristian Høgsberg  <krh@redhat.com>
+
+           * utils/Makefile.am: Add parseargs.h to sources and add
+           -I$(top_srcdir)/poppler to INCLUDES.
+
+           * poppler/CairoFontEngine.cc: Apply patch from Hiroyuki
+           Ikezoe to
+           man non-embedded CJK fonts work.
+
+ ChangeLog                 |   14 +++++++++---
+ configure.ac              |    2 +-
+ poppler/CairoFontEngine.cc |  52
+ +++++++++++++++++++++++++++++++++++++++-----
+ utils/Makefile.am         |   15 ++++++++-----
+ 4 files changed, 68 insertions(+), 15 deletions(-)
+
+commit cf887a9a9fae7272165d3aae05c85444ff5ca604
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Sun Dec 18 22:03:30 2005 +0000
+
+          * poppler/Page.cc: Only discard cropbox sizes one by one
+          and not
+          completely. Jeff and Martin were right
+
+ ChangeLog      |    2 ++
+ poppler/Page.cc |   13 ++++++++++---
+ 2 files changed, 12 insertions(+), 3 deletions(-)
+
+commit 495890b9cef9d5d61bb47e789add1cf2c3b8f83d
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Sun Dec 18 21:56:15 2005 +0000
+
+    + .cvsignore
+
+ utils/.cvsignore |   10 ++++++++++
+ 1 file changed, 10 insertions(+)
+
+commit 5dca860bba6918e06fab3aa56a2c75f0ac9ecdfb
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Sun Dec 18 21:08:48 2005 +0000
+
+    Fix utils building on Slackware
+
+ ChangeLog        |    3 +++
+ configure.ac     |    3 +++
+ utils/Makefile.am |   3 ++-
+ 3 files changed, 8 insertions(+), 1 deletion(-)
+
+commit 03e3d9164ffd71f03136b57a9941ea14fadb21aa
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Sun Dec 18 17:12:28 2005 +0000
+
+    2005-12-18 Albert Astals Cid  <aacid@kde.org>
+
+           * configure.ac: Better jpeg detection, refer to ml PCbsd
+           problem
+
+ ChangeLog    |    4 ++
+ configure.ac |  131
+ ++++++++++++++++++++++++++++++++++++++++++++++++++--------
+ 2 files changed, 118 insertions(+), 17 deletions(-)
+
+commit 888d76a29c9c5ea6c90cc4299b230ca0c2c2944f
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Mon Dec 12 20:21:08 2005 +0000
+
+    * poppler/Page.cc: Ignore cropBox if it seems incorrect
+
+ ChangeLog      |    4 ++++
+ poppler/Page.cc |    7 +++++++
+ 2 files changed, 11 insertions(+)
+
+commit bcc5e3afe27c8787ce7022a0701997c96eddb4fe
+Author: Kristian Høgsberg <krh@redhat.com>
+Date:  Mon Dec 12 20:15:11 2005 +0000
+
+    2005-12-12 Kristian Høgsberg  <krh@redhat.com>
+
+       * Makefile.am:
+       * configure.ac:
+       * goo/GooVector.h:
+       * utils/HtmlFonts.cc:
+       * utils/HtmlFonts.h:
+       * utils/HtmlLinks.cc:
+       * utils/HtmlLinks.h:
+       * utils/HtmlOutputDev.cc:
+       * utils/HtmlOutputDev.h:
+       * utils/ImageOutputDev.cc:
+       * utils/ImageOutputDev.h:
+       * utils/Makefile.am:
+       * utils/parseargs.c:
+       * utils/parseargs.h:
+       * utils/pdffonts.1:
+       * utils/pdffonts.cc:
+       * utils/pdfimages.1:
+       * utils/pdfimages.cc:
+       * utils/pdfinfo.1:
+       * utils/pdfinfo.cc:
+       * utils/pdftohtml.1:
+       * utils/pdftohtml.cc:
+       * utils/pdftoppm.1:
+       * utils/pdftoppm.cc:
+       * utils/pdftops.1:
+       * utils/pdftops.cc:
+       * utils/pdftotext.1:
+       * utils/pdftotext.cc: Add command line utilities from xpdf.
+
+ ChangeLog              |   31 +
+ Makefile.am            |    6 +-
+ configure.ac           |   25 +-
+ goo/GooVector.h        |  101 +++
+ utils/HtmlFonts.cc     |  326 ++++++++++
+ utils/HtmlFonts.h      |   85 +++
+ utils/HtmlLinks.cc     |  101 +++
+ utils/HtmlLinks.h      |   49 ++
+ utils/HtmlOutputDev.cc  | 1569
+ +++++++++++++++++++++++++++++++++++++++++++++++
+ utils/HtmlOutputDev.h  |  302 +++++++++
+ utils/ImageOutputDev.cc |  195 ++++++
+ utils/ImageOutputDev.h  |   76 +++
+ utils/Makefile.am      |   18 +
+ utils/parseargs.c      |  190 ++++++
+ utils/parseargs.h      |   71 +++
+ utils/pdffonts.1       |  128 ++++
+ utils/pdffonts.cc      |  294 +++++++++
+ utils/pdfimages.1      |   96 +++
+ utils/pdfimages.cc     |  159 +++++
+ utils/pdfinfo.1        |  157 +++++
+ utils/pdfinfo.cc       |  376 ++++++++++++
+ utils/pdftohtml.1      |   85 +++
+ utils/pdftohtml.cc     |  429 +++++++++++++
+ utils/pdftoppm.1       |  113 ++++
+ utils/pdftoppm.cc      |  189 ++++++
+ utils/pdftops.1        |  224 +++++++
+ utils/pdftops.cc       |  336 ++++++++++
+ utils/pdftotext.1      |  135 ++++
+ utils/pdftotext.cc     |  337 ++++++++++
+ 29 files changed, 6194 insertions(+), 9 deletions(-)
+
+commit 5fbded32741acb5fac411189f80cb57aa11df517
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Sat Dec 10 10:52:15 2005 +0000
+
+    * qt4/src/poppler-page.cc:
+    * qt4/src/poppler-qt4.h:
+    * qt4/src/tests/test-poppler-qt4.cpp: The parameters x,y,w,h to the
+      method splashRenderToPixmap are now used. Convenient
+      defaults are provided. The test has been changed accordingly. Some
+      added documentation. Patch by Stefan Kebekus
+
+ ChangeLog                     |    9 +++++++++
+ qt4/src/poppler-page.cc       |    4 ++--
+ qt4/src/poppler-qt4.h         |   31 +++++++++++++++++++++++--------
+ qt4/tests/test-poppler-qt4.cpp |    2 +-
+ 4 files changed, 35 insertions(+), 11 deletions(-)
+
+commit bc6df8c41081c0c0107655cbf70ddb8b0c493c34
+Author: Kristian Høgsberg <krh@redhat.com>
+Date:  Fri Dec 9 20:49:59 2005 +0000
+
+    2005-12-09 Kristian Høgsberg  <krh@redhat.com>
+
+           * poppler/GfxState.cc: Use colToByte() for converting
+           GxfColorComp
+           to bytes (really fix #5117).
+
+           * poppler/Stream.cc: Remove duplicated check (#5243).
+
+ ChangeLog          |    5 +++++
+ poppler/GfxState.cc |   6 +++---
+ poppler/Stream.cc   |   4 ----
+ 3 files changed, 8 insertions(+), 7 deletions(-)
+
+commit 8a2464122455311c6d16ae62bb9ac9a0ae365a28
+Author: Kristian Høgsberg <krh@redhat.com>
+Date:  Fri Dec 9 19:40:40 2005 +0000
+
+    2005-12-09 Kristian Høgsberg  <krh@redhat.com>
+
+           * configure.ac:
+           * poppler/Makefile.am (poppler_includedir):
+           * goo/Makefile.am (poppler_goo_include_HEADERS): Make
+           installation
+           of xpdf header files optional.
+
+ ChangeLog          |   10 +++++++++-
+ configure.ac       |    8 ++++++++
+ goo/Makefile.am     |   4 ++++
+ poppler/Makefile.am |   4 ++++
+ 4 files changed, 25 insertions(+), 1 deletion(-)
+
+commit 830b61bfd1c985fe14ec4d0f6724c8f70e924fc1
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Thu Dec 8 18:17:42 2005 +0000
+
+       * configure.ac: Detect if gettimeofday is available, fixes
+       for correct
+           linking to Qt4 on windows
+           * goo/GooTimer.[cc|h]: Only build if gettimeofday is available
+           * poppler/Gfx.cc: Only use the timer for profiling if
+           gettimeofday is
+           available
+           * poppler/GlobalParams.cc: Remove extra unlockGlobalParams
+           that was
+           making windows hang
+           * splash/SplashFTFontEngine.cc: i need unistd.h on windows
+           also
+           * splash/SplashFontFile.cc: i need unistd.h on windows also
+
+ ChangeLog                   |   12 ++++++++++++
+ configure.ac                |   14 +++++++++++++-
+ goo/GooTimer.cc             |    3 +++
+ goo/GooTimer.h                      |    4 ++++
+ poppler/Gfx.cc                      |    6 ++++++
+ poppler/GlobalParams.cc      |    1 -
+ splash/SplashFTFontEngine.cc |    4 +---
+ splash/SplashFontFile.cc     |    4 +---
+ 8 files changed, 40 insertions(+), 8 deletions(-)
+
+commit 0a1c33ed17fd7053ed455da3444856a5dab3c9b4
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Thu Dec 8 12:42:50 2005 +0000
+
+    Remove -DDATADIR we are not using if for anything and it shadows a
+    windows typedef
+
+ ChangeLog          |    8 ++++++++
+ glib/Makefile.am    |   3 +--
+ poppler/Makefile.am |   3 +--
+ qt/Makefile.am      |   3 +--
+ test/Makefile.am    |   3 +--
+ 5 files changed, 12 insertions(+), 8 deletions(-)
+
+commit adca042e666fd932f16213d0a4daba08b5021901
+Author: Brad Hards <bradh@frogmouth.net>
+Date:  Wed Dec 7 08:42:21 2005 +0000
+
+    Remove the version check. OK'd by krh.
+
+ ChangeLog        |    2 ++
+ poppler/PDFDoc.cc |   6 +-----
+ 2 files changed, 3 insertions(+), 5 deletions(-)
+
+commit bc57f8dd73eef9a74e4a6e248ed6985c360db838
+Author: Brad Hards <bradh@frogmouth.net>
+Date:  Wed Dec 7 08:31:09 2005 +0000
+
+    Add infoKeys() - allows you to get a list of all the string names
+    (keys)
+    for the metadata.
+
+ ChangeLog                   |    7 +++++++
+ qt4/src/poppler-document.cc  |   22 ++++++++++++++++++++++
+ qt4/src/poppler-qt4.h       |    7 +++++++
+ qt4/tests/check_metadata.cpp |   18 ++++++++++++++++++
+ 4 files changed, 54 insertions(+)
+
+commit 7ec41df91e6dbf792e11676d929acc2f634bd382
+Author: Brad Hards <bradh@frogmouth.net>
+Date:  Tue Dec 6 09:58:04 2005 +0000
+
+    Add more unit tests for better coverage.
+
+ ChangeLog                   |    6 ++++
+ qt4/tests/check_fonts.cpp    |   24 +++++++++++++++
+ qt4/tests/check_metadata.cpp |   66
+ ++++++++++++++++++++++++++++++++++++++++++
+ 3 files changed, 96 insertions(+)
+
+commit a92b10016306ac46775c9b95b52d249b233ff950
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Mon Dec 5 20:46:22 2005 +0000
+
+    * poppler/CairoFontEngine.cc: Correct fix for #5149, i broke it when
+    merging xpdf 3.01 patches
+
+ ChangeLog                 |    5 +++++
+ poppler/CairoFontEngine.cc |   4 +---
+ 2 files changed, 6 insertions(+), 3 deletions(-)
+
+commit 66096477d1a86f13fcb07ae25caff1cc02b1e7cd
+Author: Brad Hards <bradh@frogmouth.net>
+Date:  Sun Dec 4 19:48:25 2005 +0000
+
+    Add checking for Type3 fonts in the unit test.
+
+ ChangeLog                |    5 +++++
+ qt4/tests/check_fonts.cpp |   24 ++++++++++++++++++++++++
+ 2 files changed, 29 insertions(+)
+
+commit 62345b0affed8e2e37728fca7f2b750879192c43
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Sun Dec 4 18:53:40 2005 +0000
+
+    Fix error in merging CAN-2005-3193 fix. Thanks Daniel Gryniewicz
+    for notifying
+
+ ChangeLog           |    5 +++++
+ poppler/JPXStream.cc |    2 --
+ 2 files changed, 5 insertions(+), 2 deletions(-)
+
+commit ba4b3f88271892f197aa2ec076c80ff63a175887
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Sun Dec 4 11:30:00 2005 +0000
+
+     * qt/poppler-qt.h:
+     * qt/poppler-fontinfo.h:
+     * qt4/src/poppler-qt4.h:
+     * qt4/src/poppler-fontinfo.cc: Implement copy constructor of
+     FontInfo needed
+       as Q[Value]List<FontInfo> uses it when appending
+
+ ChangeLog                  |    8 ++++++++
+ qt/poppler-fontinfo.cc      |   9 +++++++++
+ qt/poppler-qt.h            |    2 ++
+ qt4/src/poppler-fontinfo.cc |   9 +++++++++
+ qt4/src/poppler-qt4.h      |    2 ++
+ 5 files changed, 30 insertions(+)
+
+commit e091231d98d12c19b0098ffbaec6ecda28097dff
+Author: Brad Hards <bradh@frogmouth.net>
+Date:  Sun Dec 4 10:45:25 2005 +0000
+
+    Add new unit test to .cvsignore suppressions.
+
+ ChangeLog           |    2 ++
+ qt4/tests/.cvsignore |    1 +
+ 2 files changed, 3 insertions(+)
+
+commit 6a7b1eaaedbfdd3a8e6b4d899477350f2b485641
+Author: Brad Hards <bradh@frogmouth.net>
+Date:  Sun Dec 4 10:05:21 2005 +0000
+
+    * qt4/src/poppler-qt4.h:
+      qt4/src/fontinfo.cc: add implementation for FontInfo::typeName()
+
+    * qt4/tests/check_fonts.cpp:
+    * qt4/tests/Makefile.am: add unit test for fonts
+
+    * qt4/src/Mainpage.dox: Minor typo fixes.
+
+ ChangeLog                  |   11 +++++++++++
+ qt4/src/Mainpage.dox       |    5 +++--
+ qt4/src/poppler-fontinfo.cc |  24 ++++++++++++++++++++++++
+ qt4/src/poppler-qt4.h      |   14 +++++++++++++-
+ qt4/tests/Makefile.am      |    5 +++++
+ qt4/tests/check_fonts.cpp   |  42
+ ++++++++++++++++++++++++++++++++++++++++++
+ 6 files changed, 98 insertions(+), 3 deletions(-)
+
+commit 31b28b4c59f7820901e9cf893197f381acbae8ce
+Author: Kristian Høgsberg <krh@redhat.com>
+Date:  Sun Dec 4 02:24:25 2005 +0000
+
+    2005-12-03 Kristian Høgsberg  <krh@redhat.com>
+
+           * glib/poppler-page.cc (poppler_page_set_selection_alpha): Use
+           Nickolays original fix instead of trying to be clever with
+           gdk_pixbuf_fill().
+
+           * poppler/CairoFontEngine.cc: Fix text corruption bug (#5149),
+           a rerun of an old classic (#3340).
+
+ ChangeLog                 |    7 +++++++
+ glib/poppler-page.cc      |    8 +++++++-
+ poppler/CairoFontEngine.cc |   2 ++
+ 3 files changed, 16 insertions(+), 1 deletion(-)
+
+commit 4d169c5c345cdac84a39026e759b928977643417
+Author: Kristian Høgsberg <krh@redhat.com>
+Date:  Sun Dec 4 01:42:29 2005 +0000
+
+    2005-12-03 Kristian Høgsberg  <krh@redhat.com>
+
+           * poppler/GfxState.cc: Fixing another problem with new GfxRGB
+           representation causing images to show up as random pixels
+           (#5117).
+
+ ChangeLog          |    5 +++++
+ poppler/GfxState.cc |   6 +++---
+ 2 files changed, 8 insertions(+), 3 deletions(-)
+
+commit 58de0458e17b1639ce0bcae45a4b09b2c0a56618
+Author: Kristian Høgsberg <krh@redhat.com>
+Date:  Sat Dec 3 23:23:53 2005 +0000
+
+    2005-12-03 Kristian Høgsberg  <krh@redhat.com>
+
+           * qt/Makefile.am (noinst_PROGRAMS): Only build qt test
+           program if
+           splash is enabled.
+
+           * poppler/CairoOutputDev.cc: Remove unused grid snapping code,
+           sidestepping #4507.
+
+           * glib/poppler-document.h (PopplerPermissions): Breaking enum
+           definition over multiple lines confuses glib-mkenums (#4600).
+
+           * poppler/Makefile.am (libpoppler_la_LIBADD): Add
+           FREETYPE_LIBS
+           (#4515).
+
+           * poppler/TextOutputDev.cc:
+           * qt/poppler-qt.h: GCC-4.1 fixes (#5031).
+
+ ChangeLog                |   17 +++++++++++++++++
+ glib/poppler-document.h   |   5 +----
+ poppler/CairoOutputDev.cc |   35 +++++++++--------------------------
+ poppler/CairoOutputDev.h  |   2 +-
+ poppler/Makefile.am      |    3 ++-
+ poppler/TextOutputDev.cc  |   2 +-
+ qt/Makefile.am                   |    4 ++++
+ qt/poppler-qt.h          |    6 +++---
+ 8 files changed, 38 insertions(+), 36 deletions(-)
+
+commit df45483f1437d8a96519e1428d1f4b3ffc08c2cd
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Sat Dec 3 22:39:06 2005 +0000
+
+    remove another chagne should not have gone in
+
+ test/pdf-inspector.cc |    9 ++-------
+ 1 file changed, 2 insertions(+), 7 deletions(-)
+
+commit 7dfe02ee112dee51346525b62d877e6591135761
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Sat Dec 3 22:28:46 2005 +0000
+
+    Add the font retrieveing on the qt3 backend also, based on a patch
+    by Wilfried Huss
+
+ ChangeLog             |    3 ++
+ qt/poppler-fontinfo.cc |   75
+ ++++++++++++++++++++++++++++++++++++++++++++++++
+ 2 files changed, 78 insertions(+)
+
+commit 655b9dd195ac9faf2f7ea0255880b8c83b249a06
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Sat Dec 3 22:26:07 2005 +0000
+
+    this should have not went in
+
+ poppler/TextOutputDev.h |   10 +++++-----
+ 1 file changed, 5 insertions(+), 5 deletions(-)
+
+commit ab45eb562159d5b006e658ec66723a0a47908f65
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Sat Dec 3 22:20:54 2005 +0000
+
+     * qt4/src/poppler-qt4.h:
+     * qt4/src/poppler-fontinfo.cc:
+     * qt4/src/poppler-textbox.cc: Remove implementation of that classes
+     from the header, use pimpl
+
+ ChangeLog                  |    9 ++++-
+ poppler/TextOutputDev.h     |  10 +++---
+ qt/Makefile.am                     |    1 +
+ qt/poppler-document.cc      |  29 ++++++++++++++++
+ qt/poppler-private.h       |    2 ++
+ qt/poppler-qt.h            |   80
+ ++++++++++++++++++++++++++++++++++++++++++-
+ qt4/src/Makefile.am        |    2 ++
+ qt4/src/poppler-fontinfo.cc |  69 +++++++++++++++++++++++++++++++++++++
+ qt4/src/poppler-qt4.h      |   43 +++++++++--------------
+ qt4/src/poppler-textbox.cc  |  49 ++++++++++++++++++++++++++
+ test/pdf-inspector.cc      |    9 +++--
+ 11 files changed, 268 insertions(+), 35 deletions(-)
+
+commit 64079ad81caf6d2cf66b1f3a3de9454146e15c6c
+Author: Kristian Høgsberg <krh@redhat.com>
+Date:  Sat Dec 3 21:55:36 2005 +0000
+
+    2005-12-03 Kristian Høgsberg  <krh@redhat.com>
+
+           Fixes from Nickolay V. Shmyrev:
+
+           * poppler/TextOutputDev.cc (TextLine::visitSelection,
+           TextBlock::visitSelection): Fix selection crash with
+           zero-width
+           word boxes or zero-height line boxes (#4402).
+
+           * poppler/CairoOutputDev.h: Fix wrong cairo-ft.h include
+           (#4413).
+
+           * poppler/CairoOutputDev.cc (eoFill, fill):
+           * glib/poppler-page.cc (poppler_page_render_selection):
+           Update to
+           work with new GfxColor definition and use
+           cairo_pattern_create_rgba() to cache cairo_pattern_t's for the
+           fill and stroke colors.
+
+           * glib/poppler-page.cc (poppler_page_set_selection_alpha):
+           Zero
+           out pixbuf first.
+
+ ChangeLog                |   21 ++++++++++++++++
+ glib/poppler-page.cc     |   18 ++++++++------
+ poppler/CairoOutputDev.cc |   59
+ +++++++++++++++++++++++++++++++++------------
+ poppler/CairoOutputDev.h  |   6 ++---
+ poppler/TextOutputDev.cc  |   8 +++---
+ 5 files changed, 82 insertions(+), 30 deletions(-)
+
+commit f3da21a3ecdd2694290e64af86c8e35fcb61371b
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Sat Dec 3 21:35:45 2005 +0000
+
+    More docs for the Qt4 frontend, patch by Stefan Kebekus
+
+ ChangeLog                     |    8 ++++
+ qt4/src/.cvsignore            |    3 +-
+ qt4/src/Doxyfile              |    4 +-
+ qt4/src/Mainpage.dox          |   91
+ ++++++++++++++++++++++++++++++++++++++++
+ qt4/src/poppler-page.cc       |   20 +++------
+ qt4/src/poppler-qt4.h         |   57 +++++++++++++++++--------
+ qt4/tests/test-poppler-qt4.cpp |    5 ++-
+ 7 files changed, 151 insertions(+), 37 deletions(-)
+
+commit 7b2c6e92611db9350ca5dcaf3fd730fe5e69afea
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Thu Dec 1 22:45:10 2005 +0000
+
+    Fix CAN-2005-3193 related bugs
+    Thanks Leonard for reporting
+
+ ChangeLog           |    6 ++++++
+ poppler/JPXStream.cc |    9 ++++++++-
+ poppler/Stream.cc    |   33 ++++++++++++++++++++++++++++++++-
+ poppler/Stream.h     |    3 +++
+ 4 files changed, 49 insertions(+), 2 deletions(-)
+
+commit a90f076af9ebb188895e7b223bcb7e5c3f4309c4
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Mon Nov 28 22:50:19 2005 +0000
+
+    Fix QPixmap contents generation messed when doing the xpdf 3.01
+    transition in qt4 frontend
+    Use Splash backend by default in the qt4 test, added -arthur option
+    to use the Arthur backend
+
+ ChangeLog                     |   12 +++++++--
+ qt4/src/poppler-page.cc       |   47 ++++++++++++++++++++++++++---------
+ qt4/src/poppler-qt4.h         |   17 +++++++++----
+ qt4/tests/test-poppler-qt4.cpp |   53
+ +++++++++++++++++++++++++---------------
+ 4 files changed, 91 insertions(+), 38 deletions(-)
+
+commit b7e4f0e7d175abde7fafb1fcc7ba129468bc8c1a
+Author: Brad Hards <bradh@frogmouth.net>
+Date:  Sun Nov 27 01:33:51 2005 +0000
+
+    Convert Qt4 unit tests to use the new Qt4.1 QTestlib framework.
+    Add a little more API documentation
+
+ ChangeLog                      |    7 +++++
+ qt4/src/poppler-qt4.h          |   11 +++++---
+ qt4/tests/Makefile.am          |   12 +++++---
+ qt4/tests/check_metadata.cpp   |   58
+ +++++++++++++++++++--------------------
+ qt4/tests/check_pagelayout.cpp  |   14 +++++-----
+ qt4/tests/check_pagemode.cpp   |   22 +++++++--------
+ qt4/tests/check_permissions.cpp |   18 ++++++------
+ 7 files changed, 78 insertions(+), 64 deletions(-)
+
+commit d036fa022dbb6f4421ccc8b12b8f9e4f0c8d7406
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Fri Nov 25 22:52:56 2005 +0000
+
+    patch from kebekus to add to the qt4 binding the same functions we
+    added to the qt3 one
+
+ ChangeLog              |    5 +++++
+ qt4/src/poppler-page.cc |   44
+ ++++++++++++++++++++++++++++++++++++++++++--
+ qt4/src/poppler-qt4.h  |   22 ++++++++++++++++++++++
+ 3 files changed, 69 insertions(+), 2 deletions(-)
+
+commit 3c9f09d76dc70e4ba766930facee8b6f30bcd2da
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Tue Nov 22 21:50:44 2005 +0000
+
+    Fix page range in the inspector
+
+ ChangeLog            |    4 ++++
+ test/pdf-inspector.cc |    2 +-
+ 2 files changed, 5 insertions(+), 1 deletion(-)
+
+commit e64f63416dbce497cb2167272b95491664f213e8
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Mon Nov 21 22:12:15 2005 +0000
+
+    PAtch to add some more functions to the qt binding by Stefan Kebekus
+
+ ChangeLog         |    5 ++++
+ qt/poppler-page.cc |  69
+ +++++++++++++++++++++++++++++++++++++++++++++++++++-
+ qt/poppler-qt.h    |  41 +++++++++++++++++++++++++++++++
+ 3 files changed, 114 insertions(+), 1 deletion(-)
+
+commit 8bd8cb4160b73da69d058783750352fbface66dc
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Mon Nov 21 19:44:09 2005 +0000
+
+    Fix a possible build problem
+
+ ChangeLog     |    4 ++++
+ qt/Makefile.am |    1 +
+ 2 files changed, 5 insertions(+)
+
+commit fc59b79dc375544681032a1618e96c458515d724
+Author: Kristian Høgsberg <krh@redhat.com>
+Date:  Sun Nov 20 23:17:32 2005 +0000
+
+    2005-11-20 Kristian Høgsberg  <krh@redhat.com>
+
+           * poppler/GfxState.cc: Fix the byte_lookup initialization
+           broken
+           by the merges (#4350).  Modify GfxColorSpace::getRGBLine()
+           to work
+           with new GfXColor type.
+
+ ChangeLog          |   13 +++++++++++-
+ poppler/GfxState.cc |  59
+ ++++++++++++++++++++++++++++++---------------------
+ 2 files changed, 47 insertions(+), 25 deletions(-)
+
+commit 6fe2cb0fcd53211143dcd0c47bf8c8c7a8c11a39
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Thu Nov 17 21:37:34 2005 +0000
+
+    make it compile with freetype 2.2.0 preversions
+
+ ChangeLog             |    4 ++++
+ splash/SplashFTFont.cc |   42 +++++++++++++++++++++++++++++++++++++-----
+ 2 files changed, 41 insertions(+), 5 deletions(-)
+
+commit 429d3521d788be702a3944bc290569f90ae04892
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Fri Nov 4 19:03:55 2005 +0000
+
+    Make it compile using --disable-cairo-output
+
+ ChangeLog               |    4 ++++
+ glib/poppler-document.cc |    6 ++++--
+ glib/poppler-page.cc    |   27 +++++++++++++--------------
+ 3 files changed, 21 insertions(+), 16 deletions(-)
+
+commit b96c118eb08d478914c2981204d749a95957cbb3
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Tue Nov 1 15:29:32 2005 +0000
+
+    Comment some unused parameters to calm down compiler warnings when
+    using these heders on external projects with higher warning verbosity
+
+ ChangeLog          |    5 +++
+ poppler/OutputDev.h | 125
+ ++++++++++++++++++++++++++-------------------------
+ poppler/Stream.h    |  24 +++++-----
+ 3 files changed, 80 insertions(+), 74 deletions(-)
+
+commit 51670972777510a3ec64a56649716b31167b9d0e
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Sun Oct 30 20:29:05 2005 +0000
+
+    Last xpdf 3.01 merge (at least from my side)
+    It's very big, but noone has opposed in the 2 weeks time i gave on
+    the ml so either poppler is dead or people agree with the patch
+
+ ChangeLog                 |   39 +
+ glib/poppler-page.cc      |   32 +-
+ poppler/ArthurOutputDev.cc |   2 +-
+ poppler/ArthurOutputDev.h  |   2 +-
+ poppler/CairoOutputDev.cc  |   2 +-
+ poppler/CairoOutputDev.h   |   2 +-
+ poppler/Gfx.cc                    |  645 +++++++++--
+ poppler/Gfx.h             |   17 +-
+ poppler/GfxState.cc       | 1410 ++++++++++++++++++++---
+ poppler/GfxState.h        |  196 +++-
+ poppler/OutputDev.cc      |   25 +
+ poppler/OutputDev.h       |   46 +-
+ poppler/PDFDoc.cc         |   98 +-
+ poppler/PDFDoc.h          |   24 +-
+ poppler/PSOutputDev.cc     | 1461 ++++++++++++++++++++----
+ poppler/PSOutputDev.h     |   48 +-
+ poppler/Page.cc           |  115 +-
+ poppler/Page.h                    |   23 +-
+ poppler/SplashOutputDev.cc | 1525 ++++++++++++++++++++++---
+ poppler/SplashOutputDev.h  |  59 +-
+ poppler/TextOutputDev.cc   |  230 ++--
+ poppler/TextOutputDev.h    |  16 +-
+ qt/poppler-page.cc        |   34 +-
+ qt4/src/poppler-page.cc    |  31 +-
+ splash/Splash.cc          | 2656
+ +++++++++++++++++++++++++++++++++-----------
+ splash/Splash.h           |   75 +-
+ splash/SplashBitmap.cc     |  216 ++--
+ splash/SplashBitmap.h     |   13 +-
+ splash/SplashPattern.cc    |  22 +-
+ splash/SplashPattern.h     |  19 +-
+ splash/SplashState.cc     |   11 +
+ splash/SplashState.h      |    3 +
+ splash/SplashTypes.h      |  145 ++-
+ test/gtk-cairo-test.cc     |   2 +-
+ test/gtk-splash-test.cc    |  23 +-
+ test/pdf-inspector.cc     |    2 +-
+ 36 files changed, 7685 insertions(+), 1584 deletions(-)
+
+commit 10dfa2254dafb9de93692def2bfb3133d9a39989
+Author: Kristian Høgsberg <krh@redhat.com>
+Date:  Mon Oct 17 02:17:51 2005 +0000
+
+    2005-10-05 Kristian Høgsberg  <krh@redhat.com>
+
+           * glib/poppler-page.cc (poppler_page_render_to_ps):
+           Fix another
+           off-by-one page number error (#4555).
+
+ ChangeLog                  |    6 +++++-
+ poppler/poppler-config.h.in |   2 +-
+ 2 files changed, 6 insertions(+), 2 deletions(-)
+
+commit 9830f0ea41f09fefada740e9429c491e067a5082
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Sun Oct 16 15:11:32 2005 +0000
+
+    GfxFont merges from xpdf 3.01
+
+ ChangeLog         |    1 +
+ poppler/GfxFont.cc |  109
+ +++++++++++++++++++++++++++++++++++-----------------
+ 2 files changed, 75 insertions(+), 35 deletions(-)
+
+commit 62b5ba221aca8c320e964916b0c0329efc8da572
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Sun Oct 16 15:04:39 2005 +0000
+
+    Stream[cc|h] merges from xpdf 3.01
+
+ ChangeLog        |    1 +
+ poppler/Stream.cc |  714
+ ++++++++++++++++++++++++++++++++++++++++++++++++-----
+ poppler/Stream.h  |   19 +-
+ 3 files changed, 658 insertions(+), 76 deletions(-)
+
+commit b9fab51179f38e9798b10366be672f0432c874da
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Sun Oct 16 14:58:14 2005 +0000
+
+    Function.cc|h merges from xpdf 3.01
+
+ ChangeLog          |    1 +
+ poppler/Function.cc |  76
+ +++++++++++++++++++++++++++++----------------------
+ poppler/Function.h  |  42 ++++++++++++++++++++++++++++
+ 3 files changed, 86 insertions(+), 33 deletions(-)
+
+commit c6e0242200f818c67508041763ff317e79daadd6
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Sun Oct 16 14:54:17 2005 +0000
+
+    Annot.[cc|h] and related merges from xpdf 3.01
+
+ ChangeLog             |    7 +-
+ poppler/Annot.cc      |  234
+ ++++++++++++++++++++++++++++++++++++++++++------
+ poppler/Annot.h       |   20 ++---
+ poppler/FontInfo.cc   |    2 +-
+ poppler/PSOutputDev.cc |    2 +-
+ poppler/Page.cc       |    2 +-
+ 6 files changed, 221 insertions(+), 46 deletions(-)
+
+commit 65d574fdc009e45ad66d1d402d5e805e4e94f427
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Sun Oct 16 14:30:16 2005 +0000
+
+    Merge SplashFTFont.cc with xpdf 3.01 changes
+
+ ChangeLog             |    1 +
+ splash/SplashFTFont.cc |   64
+ +++++++++++++++++++++++++++++++++---------------
+ 2 files changed, 45 insertions(+), 20 deletions(-)
+
+commit f9d208e86433b213b21a75089f82fd00dcd746fc
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Sun Oct 16 14:25:32 2005 +0000
+
+    Merge SplashScreen.[cc|h] from xpdf 3.01
+
+ ChangeLog             |    4 ++
+ splash/SplashScreen.cc |  110
+ +++++++++++++++++++++++++++++++-----------------
+ splash/SplashScreen.h |   12 +++++-
+ 3 files changed, 87 insertions(+), 39 deletions(-)
+
+commit 7d46ac000316566503a27b5e5c68621be9c081d0
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Sun Oct 16 14:19:47 2005 +0000
+
+    Merging SplashXPathScanner.cc changes from xpdf 3.01
+
+ splash/SplashXPathScanner.cc |   80
+ +++++++++++++++++++++++-------------------
+ 1 file changed, 43 insertions(+), 37 deletions(-)
+
+commit e34713a2187e05358f98e749ec2923210a40a862
+Author: Kristian Høgsberg <krh@redhat.com>
+Date:  Wed Oct 5 15:57:17 2005 +0000
+
+    2005-10-05 Kristian Høgsberg  <krh@redhat.com>
+
+           * glib/poppler-page.cc (poppler_page_render_to_ps):
+           Fix another
+           off-by-one page number error (#4555).
+
+ ChangeLog           |    5 +++++
+ glib/poppler-page.cc |    2 +-
+ 2 files changed, 6 insertions(+), 1 deletion(-)
+
+commit fdd0934430ed251f9aeb45158b6ec95684b3e7b4
+Author: Marco Pesenti Gritti <mpg@redhat.com>
+Date:  Mon Sep 26 19:29:45 2005 +0000
+
+    2005-09-26 Marco Pesenti Gritti  <mpg@redhat.com>
+
+           * glib/poppler-action.cc:
+
+           Initialize window title even if the action is unknown
+
+ ChangeLog             |    6 ++++++
+ glib/poppler-action.cc |    5 +++--
+ 2 files changed, 9 insertions(+), 2 deletions(-)
+
+commit e9753049ddfbdf28df7a222d35eccdbcbcbc848d
+Author: Marco Pesenti Gritti <mpg@redhat.com>
+Date:  Mon Sep 26 10:42:38 2005 +0000
+
+    2005-09-26 Marco Pesenti Gritti  <mpg@redhat.com>
+
+           * glib/poppler-action.cc:
+           * glib/poppler-action.h:
+
+           Implement launch action
+
+ ChangeLog             |    7 +++++++
+ glib/poppler-action.cc |   11 ++++++++---
+ glib/poppler-action.h |    1 +
+ 3 files changed, 16 insertions(+), 3 deletions(-)
+
+commit ab18b2cb6d1c62bb91173d105e8631fe4ef1bcfb
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Tue Sep 20 15:27:31 2005 +0000
+
+    Parser.cc merges from xpdf 3.01
+
+ ChangeLog        |    1 +
+ poppler/Parser.cc |   19 +++++++++++--------
+ 2 files changed, 12 insertions(+), 8 deletions(-)
+
+commit cf6723caaed24615c3b8965cee9c433007f80d77
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Tue Sep 20 15:08:52 2005 +0000
+
+    TextPage *TextOutpudDev::takeText() from xpdf 3.01
+
+ ChangeLog               |    1 +
+ poppler/TextOutputDev.cc |    8 ++++++++
+ poppler/TextOutputDev.h  |    4 ++++
+ 3 files changed, 13 insertions(+)
+
+commit e0cbb0ca2c611ad5ac0267e46279c9d61450902a
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Tue Sep 20 14:59:43 2005 +0000
+
+    more 3.00 -> 3.01 merging
+
+ ChangeLog      |    1 +
+ poppler/XRef.cc |    1 -
+ 2 files changed, 1 insertion(+), 1 deletion(-)
+
+commit 9c7adb318d395ff674c6febf6406a8d47e9e5bf6
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Tue Sep 20 14:43:15 2005 +0000
+
+           * poppler/UnicodeMap.cc: More grealloc -> greallocn
+           * poppler/UnicodeTypeTable.cc: Merge from xpdf 3.01
+
+ ChangeLog                  |    2 ++
+ poppler/UnicodeMap.cc      |    4 ++--
+ poppler/UnicodeTypeTable.cc |   4 ++--
+ 3 files changed, 6 insertions(+), 4 deletions(-)
+
+commit 2c4c9b855b0df1dc0836d4f44e9471215a419ea6
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Tue Sep 20 14:34:31 2005 +0000
+
+    Merge link.cc changes from xpdf 3.00 -> 3.01
+
+ ChangeLog      |    1 +
+ poppler/Link.cc |   64
+ ++++++++++++++++++++++++++++++++++++++++++++++++++++---
+ 2 files changed, 62 insertions(+), 3 deletions(-)
+
+commit 4e9490c0219dd9c99ba0e5533c96663b8570a87b
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Tue Sep 20 14:00:43 2005 +0000
+
+    Merge GlobalParam.* changes, they are worthless for us as poppler
+    but this way we are nearer to have the 3.01 sources merged, then we
+    can remove them if we decide we don't need this options.
+    Remove a setEncryption from the Xref.h marco probably forgot to
+    remove when merging
+
+ ChangeLog              |    3 +++
+ poppler/GlobalParams.cc |   41 +++++++++++++++++++++++++++++++++++++++++
+ poppler/GlobalParams.h  |   22 ++++++++++++++++------
+ poppler/XRef.h                 |    4 ----
+ 4 files changed, 60 insertions(+), 10 deletions(-)
+
+commit 22da021bf69d83d641e3f30cc0e1bd62394e56a4
+Author: Marco Pesenti Gritti <mpg@redhat.com>
+Date:  Tue Sep 20 13:23:08 2005 +0000
+
+    2005-09-20 Marco Pesenti Gritti  <mpg@redhat.com>
+
+           * poppler/XRef.cc:
+
+           Remove duplicated initialization
+
+ ChangeLog      |    6 ++++++
+ poppler/XRef.cc |    4 ----
+ 2 files changed, 6 insertions(+), 4 deletions(-)
+
+commit 2a8778147938e3ed2af177226a9c35655f898c95
+Author: Marco Pesenti Gritti <mpg@redhat.com>
+Date:  Tue Sep 20 10:18:57 2005 +0000
+
+    2005-09-20 Marco Pesenti Gritti  <mpg@redhat.com>
+
+           * poppler/GlobalParams.cc:
+
+           s/G/Goo in not yet compiled plugins code
+
+ ChangeLog              |    6 ++++++
+ poppler/GlobalParams.cc |    8 ++++----
+ 2 files changed, 10 insertions(+), 4 deletions(-)
+
+commit 16f720b87cfc491db585dbdc99236cf492ffe85b
+Author: Marco Pesenti Gritti <mpg@redhat.com>
+Date:  Tue Sep 20 09:57:41 2005 +0000
+
+    2005-09-20 Marco Pesenti Gritti  <mpg@redhat.com>
+
+           * poppler/Makefile.am:
+
+           Add XPDFPlugin*. Thanks to TSDgeos that noticed this.
+
+           * poppler/XpdfPluginAPI.cc:
+
+           Fixup
+
+ ChangeLog               |   10 ++++++++++
+ poppler/Makefile.am     |    4 +++-
+ poppler/XpdfPluginAPI.cc |    2 +-
+ 3 files changed, 14 insertions(+), 2 deletions(-)
+
+commit 5f30791c3d87315ad1f742de64d2c1351ca70cb7
+Author: Marco Pesenti Gritti <mpg@redhat.com>
+Date:  Fri Sep 16 19:33:28 2005 +0000
+
+    *** empty log message ***
+
+ ChangeLog |   9 +++++++++
+ 1 file changed, 9 insertions(+)
+
+commit db62e07fcf57f45951b21f8aab44b0d943efe5d0
+Author: Marco Pesenti Gritti <mpg@redhat.com>
+Date:  Fri Sep 16 19:33:05 2005 +0000
+
+    2005-09-16 Marco Pesenti Gritti  <mpg@redhat.com>
+
+           * poppler/PDFDoc.cc:
+           * poppler/PDFDoc.h:
+           * poppler/XRef.cc:
+           * poppler/XRef.h:
+
+           Merge more from 3.01
+
+ poppler/PDFDoc.cc |   20 ++++++++++++++++----
+ poppler/PDFDoc.h  |   19 +++++++++----------
+ poppler/XRef.cc   |   13 +++++++++++--
+ poppler/XRef.h    |   7 +++++--
+ 4 files changed, 41 insertions(+), 18 deletions(-)
+
+commit 3acc7be594712fd0ce7ac07b7188d5b38b382782
+Author: Marco Pesenti Gritti <mpg@redhat.com>
+Date:  Fri Sep 16 19:05:00 2005 +0000
+
+    2005-09-16 Marco Pesenti Gritti  <mpg@redhat.com>
+
+           * poppler/XRef.cc:
+
+           Merge some initialization that I lost before
+
+ ChangeLog      |    6 ++++++
+ poppler/XRef.cc |    4 ++++
+ 2 files changed, 10 insertions(+)
+
+commit 3badd82b72b2768be27e309b048cd8dcb1c80038
+Author: Marco Pesenti Gritti <mpg@redhat.com>
+Date:  Fri Sep 16 18:46:37 2005 +0000
+
+    2005-09-16 Marco Pesenti Gritti  <mpg@redhat.com>
+
+           * poppler/XRef.cc:
+
+           Merge change from 3.01
+
+ ChangeLog      |    6 ++++++
+ poppler/XRef.cc |    8 --------
+ 2 files changed, 6 insertions(+), 8 deletions(-)
+
+commit 5474583e20ca773befa17242d4ad7b8f81d5bf99
+Author: Marco Pesenti Gritti <mpg@redhat.com>
+Date:  Fri Sep 16 18:38:58 2005 +0000
+
+    2005-09-16 Marco Pesenti Gritti  <mpg@redhat.com>
+
+           * poppler/CharCodeToUnicode.cc:
+           * poppler/CharCodeToUnicode.h:
+
+           Improvements from xpdf 3.01
+
+ ChangeLog                   |    7 +++++++
+ poppler/CharCodeToUnicode.cc |   31 +++++++++++++++++++------------
+ poppler/CharCodeToUnicode.h  |    4 ++++
+ 3 files changed, 30 insertions(+), 12 deletions(-)
+
+commit b2a6eab113fecd3823885c64f3302bea4f372a9f
+Author: Marco Pesenti Gritti <mpg@redhat.com>
+Date:  Fri Sep 16 18:37:29 2005 +0000
+
+    2005-09-16 Marco Pesenti Gritti  <mpg@redhat.com>
+
+           * poppler/CMap.cc:
+
+           Improvements from xpdf 3.01
+
+ ChangeLog      |    6 ++++++
+ poppler/CMap.cc |   30 +++++++++++++++++++++++++++---
+ 2 files changed, 33 insertions(+), 3 deletions(-)
+
+commit 3f69f2158453b9dab9efc280ed1578ac3d0cebe8
+Author: Marco Pesenti Gritti <mpg@redhat.com>
+Date:  Fri Sep 16 18:35:29 2005 +0000
+
+    2005-09-16 Marco Pesenti Gritti  <mpg@redhat.com>
+
+           * poppler/NameToUnicodeTable.h:
+           * poppler/UnicodeTypeTable.cc:
+           * poppler/UnicodeTypeTable.h:
+
+           Merge some unicode table changes from xpdf 3.01
+
+ ChangeLog                   |    8 +
+ poppler/NameToUnicodeTable.h |  168 +++++-----
+ poppler/UnicodeTypeTable.cc  |  690
+ ++++++++++++++++++++++++++++++++++++++++--
+ poppler/UnicodeTypeTable.h   |    2 +
+ 4 files changed, 764 insertions(+), 104 deletions(-)
+
+commit 6cbe76bc55d557fe5fca0f8f1b33bda95acdc0e9
+Author: Marco Pesenti Gritti <mpg@redhat.com>
+Date:  Fri Sep 16 18:32:29 2005 +0000
+
+    2005-09-16 Marco Pesenti Gritti  <mpg@redhat.com>
+
+           * poppler/SplashOutputDev.h:
+           * splash/Splash.cc:
+           * splash/Splash.h:
+
+           Modified region support from xpdf 3.01
+
+ ChangeLog                |    8 ++++++++
+ poppler/SplashOutputDev.h |   5 +++++
+ splash/Splash.cc         |   31 +++++++++++++++++++++++++++++++
+ splash/Splash.h          |   11 +++++++++++
+ 4 files changed, 55 insertions(+)
+
+commit a9df3f3203c14161e5d6bc6048ec7e123536e6d3
+Author: Marco Pesenti Gritti <mpg@redhat.com>
+Date:  Fri Sep 16 18:29:18 2005 +0000
+
+    2005-09-16 Marco Pesenti Gritti  <mpg@redhat.com>
+
+           * goo/Makefile.am:
+           * poppler/DCTStream.h:
+           * poppler/Decrypt.cc:
+           * poppler/Decrypt.h:
+           * poppler/FlateStream.h:
+           * poppler/GlobalParams.cc:
+           * poppler/GlobalParams.h:
+           * poppler/Makefile.am:
+           * poppler/PDFDoc.cc:
+           * poppler/PDFDoc.h:
+           * poppler/Parser.cc:
+           * poppler/Parser.h:
+           * poppler/Stream.cc:
+           * poppler/Stream.h:
+           * poppler/XRef.cc:
+           * poppler/XRef.h:
+           * poppler/poppler-config.h.in:
+
+           Merge security plugins support from xpdf 3.01
+
+ ChangeLog                  |   24 +++
+ goo/FixedPoint.cc          |   95 +++++++++++
+ goo/FixedPoint.h           |  150 +++++++++++++++++
+ goo/Makefile.am            |    6 +-
+ poppler/DCTStream.h        |    2 -
+ poppler/Decrypt.cc         |   23 ++-
+ poppler/Decrypt.h          |    6 +-
+ poppler/FlateStream.h      |    2 -
+ poppler/GlobalParams.cc     | 229 ++++++++++++++++++++++++++
+ poppler/GlobalParams.h      |  16 ++
+ poppler/Makefile.am        |    5 +-
+ poppler/PDFDoc.cc          |   36 +++++
+ poppler/PDFDoc.h           |    1 +
+ poppler/Parser.cc          |   20 ---
+ poppler/Parser.h           |    4 -
+ poppler/SecurityHandler.cc  | 376
+ +++++++++++++++++++++++++++++++++++++++++++
+ poppler/SecurityHandler.h   | 157 ++++++++++++++++++
+ poppler/Stream.cc          |   18 ---
+ poppler/Stream.h           |    8 -
+ poppler/XRef.cc            |  162 ++-----------------
+ poppler/XRef.h                     |   13 +-
+ poppler/XpdfPluginAPI.cc    | 262 ++++++++++++++++++++++++++++++
+ poppler/XpdfPluginAPI.h     | 341
+ +++++++++++++++++++++++++++++++++++++++
+ poppler/poppler-config.h.in |   2 -
+ 24 files changed, 1737 insertions(+), 221 deletions(-)
+
+commit a777e5c26483b90d0910e85c2be666640835d0bf
+Author: Marco Pesenti Gritti <mpg@redhat.com>
+Date:  Fri Sep 16 18:21:38 2005 +0000
+
+    2005-09-16 Marco Pesenti Gritti  <mpg@redhat.com>
+
+           * configure.ac:
+           * goo/Makefile.am:
+           * splash/Makefile.am:
+           * splash/SplashFTFont.cc:
+           * splash/SplashMath.h:
+           * splash/SplashTypes.h:
+
+           Merge support for fixed point
+
+ ChangeLog             |   11 +++++++++++
+ configure.ac          |    4 ++++
+ splash/Makefile.am    |    1 +
+ splash/SplashFTFont.cc |    7 +++++++
+ splash/SplashMath.h   |   34 +++++++++++++++++++++++++++++++++-
+ splash/SplashTypes.h  |    5 +++++
+ 6 files changed, 61 insertions(+), 1 deletion(-)
+
+commit 00457c5f44a246c9f867a114a72be9f7b2dc1cf5
+Author: Marco Pesenti Gritti <mpg@redhat.com>
+Date:  Fri Sep 16 18:11:14 2005 +0000
+
+    2005-09-16 Marco Pesenti Gritti  <mpg@redhat.com>
+
+           * poppler/ArthurOutputDev.cc:
+           * poppler/CairoFontEngine.cc:
+           * poppler/TextOutputDev.cc:
+           * poppler/UnicodeMap.cc:
+
+           Use mallocn when possible
+
+ ChangeLog                 |    9 +++++++++
+ poppler/ArthurOutputDev.cc |   2 +-
+ poppler/CairoFontEngine.cc |   4 ++--
+ poppler/TextOutputDev.cc   |   2 +-
+ poppler/UnicodeMap.cc     |    2 +-
+ 5 files changed, 14 insertions(+), 5 deletions(-)
+
+commit 09c9ff67ceae5753811a2f625e3ad810628c782e
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Fri Sep 16 18:00:43 2005 +0000
+
+    SplashXPath.cc merges from xpdf 3.00 -> 3.01
+
+ ChangeLog            |    3 ++
+ splash/SplashXPath.cc |   81
+ ++++++++++++++++++++++++-------------------------
+ 2 files changed, 42 insertions(+), 42 deletions(-)
+
+commit 0555ba861d3b84d88c80da4fa247274338ff7817
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Fri Sep 16 17:42:56 2005 +0000
+
+    SplashFontEngine.cc merge from xpdf 3.00 -> 3.01
+
+ splash/SplashFontEngine.cc |   8 ++++++++
+ 1 file changed, 8 insertions(+)
+
+commit ddc72bd8354168d992631d1ef8cd0939b428966c
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Thu Sep 15 22:24:55 2005 +0000
+
+    Merge xpdf 3.00 -> 3.01 changes in SplashT1Font.* files
+
+ splash/SplashT1Font.cc |   23 ++++++++++++++++++-----
+ splash/SplashT1Font.h |    2 ++
+ 2 files changed, 20 insertions(+), 5 deletions(-)
+
+commit ba409db3157105f326b4bbc342ca7af859a44ce9
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Thu Sep 15 22:20:37 2005 +0000
+
+    Merge xpdf 3.00 -> 3.01 changes in SplashPath.* files
+
+ splash/SplashPath.cc |    3 ++-
+ splash/SplashPath.h  |    5 +++++
+ 2 files changed, 7 insertions(+), 1 deletion(-)
+
+commit 3ea00e853049d8c26ee88aaef8ea6c47c8d46956
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Thu Sep 15 22:15:47 2005 +0000
+
+    Merge xpdf 3.00 -> 3.01 changes in SplashFont.* files
+
+ splash/SplashFont.cc |    6 ++++++
+ splash/SplashFont.h  |   10 +++++++++-
+ 2 files changed, 15 insertions(+), 1 deletion(-)
+
+commit e571dcbfd0c77a28e41710577859f632cc989de5
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Thu Sep 15 22:09:50 2005 +0000
+
+    Merge the xpdf 3.01 change that uses runtime detection of freetype
+    version
+
+ ChangeLog                   |    6 ++++++
+ configure.ac                |   14 +++-----------
+ poppler/CairoFontEngine.cc   |   21 ++++++++++++++-------
+ poppler/CairoFontEngine.h    |    3 ++-
+ splash/SplashFTFontEngine.cc |   19 +++++++++++--------
+ splash/SplashFTFontEngine.h  |    1 +
+ 6 files changed, 37 insertions(+), 27 deletions(-)
+
+commit 59fe2937db192dc7b59bf28c3f29909faf11aae3
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Thu Sep 15 21:51:16 2005 +0000
+
+    Merge xpdf 3.00 -> 3.01 changes for that file
+
+ splash/SplashClip.h |   9 +++++++++
+ 1 file changed, 9 insertions(+)
+
+commit b2f94635249f2c5f0c876a1005826fe4c6eb6025
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Thu Sep 15 12:52:36 2005 +0000
+
+    Merge xpdf 3.00 -> xpdf 3.01 changes for Catalog.[cc|h]
+
+ poppler/Catalog.cc |   5 ++++-
+ poppler/Catalog.h  |   3 +++
+ 2 files changed, 7 insertions(+), 1 deletion(-)
+
+commit 0fc2e70576b1c48cf47a686e8aa7e202a802bc9d
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Thu Sep 15 12:32:25 2005 +0000
+
+    Another small merge from xpdf 3.01
+
+ ChangeLog         |    3 +++
+ poppler/Outline.cc |   6 +++---
+ 2 files changed, 6 insertions(+), 3 deletions(-)
+
+commit f8983ceb3c55df72c94870806d71db139c11bdeb
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Thu Sep 15 12:28:34 2005 +0000
+
+    Another small xpdf 3.00 -> xpdf 3.01 merge
+
+ poppler/Object.cc |   2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 52efe9845cf3eb1dd836f90bfa203760baa2f87c
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Thu Sep 15 11:46:56 2005 +0000
+
+    bradh forgot to remove the two returns when merging xpdf 3.00 ->
+    xpdf 3.01 changes of this file
+
+ poppler/JPXStream.cc |    2 --
+ 1 file changed, 2 deletions(-)
+
+commit 4b4fc5c017bf147c9069bbce32fc14467bd2a81a
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Wed Sep 14 21:20:36 2005 +0000
+
+    Merge all the fofi/ changes from xpdf 3.01, there is only one api
+    change that affects PSOutputDev (also has been updated the part
+    that uses this api not the whole file). All our fixes in that dir
+    are included in the upgrade.
+
+ ChangeLog             |    4 +
+ fofi/FoFiTrueType.cc  |  406
+ ++++++++++++++++++++++++++++++++++++++++++------
+ fofi/FoFiTrueType.h   |   15 +-
+ fofi/FoFiType1.cc     |   25 ++-
+ fofi/FoFiType1C.cc    |  134 +++++++++++++---
+ fofi/FoFiType1C.h     |    6 +
+ poppler/PSOutputDev.cc |    7 +-
+ poppler/PSOutputDev.h |    3 +-
+ 8 files changed, 515 insertions(+), 85 deletions(-)
+
+commit a68e8e6330418b1f623867973b9c128a9a139c0c
+Author: Kristian Høgsberg <krh@redhat.com>
+Date:  Wed Sep 7 03:00:36 2005 +0000
+
+    2005-09-06 Kristian Høgsberg  <krh@redhat.com>
+
+           * configure.ac: Enable A4_PAPER and OPI_SUPPORT by default.
+           There
+           is no reason to not enable OPI and the paper size should be
+           controlled by the application.
+
+           * test/Makefile.am (EXTRA_DIST): Add pdf-operators.c
+
+ ChangeLog       |    8 ++++++++
+ configure.ac    |   17 ++---------------
+ test/Makefile.am |    3 +++
+ 3 files changed, 13 insertions(+), 15 deletions(-)
+
+commit b6490944c081ff53f623acea7ab7a600c3e54816
+Author: Brad Hards <bradh@frogmouth.net>
+Date:  Sat Sep 3 11:53:44 2005 +0000
+
+    Switch the qt4/tests unittests to use QtTestLib.
+
+ ChangeLog                              |    6 ++
+ configure.ac                           |   66 ++++++++++++++++++++
+ qt4/tests/.cvsignore                   |   17 ++----
+ qt4/tests/Makefile.am                  |   71 +++++++---------------
+ qt4/tests/README.unittest              |   23 +++++++
+ qt4/tests/check_author.cpp             |   25 --------
+ qt4/tests/check_linearised.cpp                 |   23 -------
+ qt4/tests/check_metadata.cpp           |  101
+ +++++++++++++++++++++++++++++++
+ qt4/tests/check_orientation.cpp        |   40 ------------
+ qt4/tests/check_pagelayout.cpp                 |   44 ++++++++++++++
+ qt4/tests/check_pagelayout_facing.cpp  |   22 -------
+ qt4/tests/check_pagelayout_none.cpp    |   22 -------
+ qt4/tests/check_pagelayout_single.cpp  |   22 -------
+ qt4/tests/check_pagemode.cpp           |   64 ++++++++++++++++++++
+ qt4/tests/check_pagemode_attach.cpp    |   22 -------
+ qt4/tests/check_pagemode_fullscreen.cpp |   22 -------
+ qt4/tests/check_pagemode_none.cpp      |   22 -------
+ qt4/tests/check_pagemode_oc.cpp        |   22 -------
+ qt4/tests/check_pagemode_thumbs.cpp    |   22 -------
+ qt4/tests/check_permissions.cpp        |   60 +++++++-----------
+ 20 files changed, 354 insertions(+), 362 deletions(-)
+
+commit 3725841417871d1051772068833dc908ca70b7ce
+Author: Kristian Høgsberg <krh@redhat.com>
+Date:  Fri Sep 2 14:47:24 2005 +0000
+
+    2005-09-02 Kristian Høgsberg  <krh@redhat.com>
+
+           * glib/poppler-page.cc: Apply Marcos rotation fix.
+
+ ChangeLog           |    4 ++++
+ glib/poppler-page.cc |    5 ++++-
+ 2 files changed, 8 insertions(+), 1 deletion(-)
+
+commit ecf3dcadb948013cbc987e464952933daf78e4bf
+Author: Brad Hards <bradh@frogmouth.net>
+Date:  Wed Aug 31 15:28:46 2005 +0000
+
+    Merge some missing parts of previous patches, and some other minor
+    cleanups from xpdf 3.0.1
+
+ poppler/Catalog.cc    |   16 +-
+ poppler/JPXStream.cc  |  380
+ ++++++++++++++++++++++++++++++++----------------
+ poppler/JPXStream.h   |   25 +++-
+ poppler/Lexer.cc      |   11 ++
+ poppler/Lexer.h       |    3 +
+ poppler/PSOutputDev.cc |   31 ++--
+ poppler/Stream.h      |    7 +
+ 7 files changed, 309 insertions(+), 164 deletions(-)
+
+commit de78738164319b733e54a9abfb5957870facd6cd
+Author: Brad Hards <bradh@frogmouth.net>
+Date:  Wed Aug 31 09:51:41 2005 +0000
+
+    poppler/JArithmeticDecoder.cc
+    poppler/JArithmeticDecoder.h
+    poppler/JBIG2Stream.cc
+    poppler/JBIG2Stream.h: merge in some of the JBIG2 changes from
+    xpdf 3.0.1.
+
+ ChangeLog                    |    9 ++
+ poppler/JArithmeticDecoder.cc |   42 ++++++--
+ poppler/JArithmeticDecoder.h  |   22 +++-
+ poppler/JBIG2Stream.cc        |  227
+ +++++++++++++++++++++++++----------------
+ poppler/JBIG2Stream.h        |    4 +-
+ 5 files changed, 201 insertions(+), 103 deletions(-)
+
+commit 55952feb637e300b073691ae95d68e766521a769
+Author: Kristian Høgsberg <krh@redhat.com>
+Date:  Mon Aug 29 15:24:32 2005 +0000
+
+    2005-08-29 Kristian Høgsberg  <krh@redhat.com>
+
+           * configure.ac (HAVE_FREETYPE_H): Patch from Hiroyuki
+           Ikezoe: Set
+           HAVE_FREETYPE_217_OR_OLDER to 0 if we found freetype using
+           pkg-config (#4223).
+
+ ChangeLog    |    6 ++++++
+ configure.ac |    2 +-
+ 2 files changed, 7 insertions(+), 1 deletion(-)
+
+commit 244e5c1f8f65da41ba6314028766dfe5973f6132
+Author: Brad Hards <bradh@frogmouth.net>
+Date:  Sun Aug 28 09:43:18 2005 +0000
+
+    Merge the Goo* improvements from xpdf 3.0.1. This change is based on
+    martink's work (7-xpdf-3.01-goo-improvements.patch), with some
+    tweaking
+    by me.
+
+ ChangeLog           |   13 ++++++++
+ fofi/FoFiTrueType.cc |    1 +
+ goo/GooHash.cc       |   24 ++++++++++++++
+ goo/GooHash.h       |    2 ++
+ goo/GooList.cc       |    5 +++
+ goo/GooList.h       |    5 +++
+ goo/GooString.cc     |   85
+ +++++++++++++++++++++++++++++++++++++++++++++++++-
+ goo/GooString.h      |   11 +++----
+ goo/gmem.c          |    3 ++
+ poppler/Decrypt.cc   |    1 +
+ 10 files changed, 142 insertions(+), 8 deletions(-)
+
+commit eb91b274245b4f5f5389bc9ddfde2c2806557665
+Author: Brad Hards <bradh@frogmouth.net>
+Date:  Sun Aug 28 09:31:53 2005 +0000
+
+    This part of my previous gmallocn merge patch was missing.
+
+ goo/GooHash.cc |    4 ++--
+ goo/GooList.cc |    8 ++++----
+ 2 files changed, 6 insertions(+), 6 deletions(-)
+
+commit b3474fd5e0efc96b5814d86e0cdedf39387e7ae3
+Author: Jeff Muizelaar <jeff@infidigm.net>
+Date:  Sun Aug 28 03:26:53 2005 +0000
+
+    add note about related bug
+
+ ChangeLog |   2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit ace2eb6ba518b970b96f30f61c4795c161e0cb79
+Author: Jeff Muizelaar <jeff@infidigm.net>
+Date:  Sun Aug 28 03:22:04 2005 +0000
+
+    2005-08-27 Jeff Muizelaar  <jeff@infidigm.net>
+
+       * poppler/FlateStream.cc: Fix predictor leak.
+
+ ChangeLog             |    4 ++++
+ poppler/FlateStream.cc |    1 +
+ 2 files changed, 5 insertions(+)
+
+commit 96657c5480bf2ecf445ad5a105b8e7393ae53c8b
+Author: Jeff Muizelaar <jeff@infidigm.net>
+Date:  Sun Aug 28 03:19:55 2005 +0000
+
+    2005-08-27 Jeff Muizelaar  <jeff@infidigm.net>
+
+       * configure.ac: Disable the zlib-based decoder by default.
+
+ ChangeLog    |    4 ++++
+ configure.ac |    2 +-
+ 2 files changed, 5 insertions(+), 1 deletion(-)
+
+commit d1d715158223c7ca3ae279cea420a948cfdb0428
+Author: Brad Hards <bradh@frogmouth.net>
+Date:  Sat Aug 27 08:43:42 2005 +0000
+
+    Merge the gmalloc -> gmallocn changes from xpdf 3.0.1. This change is
+    based on martink's work (13-xpdf-3.01-goo-allocn.patch) with some
+    tweaking by me. There may be some residual gmallocn changes still to
+    be merged.
+
+ ChangeLog                    |    7 ++++++
+ fofi/FoFiTrueType.cc         |   12 ++++-----
+ fofi/FoFiType1.cc            |    2 +-
+ fofi/FoFiType1C.cc           |   14 +++++------
+ goo/gmem.c                   |   22 +++++++++++++++++
+ goo/gmem.h                   |    9 +++++++
+ poppler/Annot.cc             |    2 +-
+ poppler/Array.cc             |    2 +-
+ poppler/BuiltinFont.cc        |    2 +-
+ poppler/CMap.cc              |    6 ++---
+ poppler/Catalog.cc           |    8 +++---
+ poppler/CharCodeToUnicode.cc  |   22 ++++++++---------
+ poppler/Dict.cc              |    2 +-
+ poppler/Function.cc          |   20 +++++++--------
+ poppler/Gfx.cc                       |    2 +-
+ poppler/GfxFont.cc           |   24 +++++++++---------
+ poppler/GfxState.cc          |   54
+ ++++++++++++++++++++---------------------
+ poppler/JArithmeticDecoder.cc |    2 +-
+ poppler/JBIG2Stream.cc        |   30 +++++++++++------------
+ poppler/Link.cc              |    6 ++---
+ poppler/NameToCharCode.cc     |    4 +--
+ poppler/Outline.cc           |    4 +--
+ poppler/SplashOutputDev.cc    |    8 +++---
+ poppler/Stream.cc            |   12 ++++-----
+ poppler/TextOutputDev.cc      |   48 ++++++++++++++++++------------------
+ poppler/XRef.cc              |   18 +++++++-------
+ splash/SplashClip.cc         |   12 ++++-----
+ splash/SplashFTFontFile.cc    |    2 +-
+ splash/SplashFont.cc         |    6 ++---
+ splash/SplashPath.cc         |    8 +++---
+ splash/SplashScreen.cc        |    4 +--
+ splash/SplashState.cc        |    4 +--
+ splash/SplashT1FontFile.cc    |    4 +--
+ splash/SplashXPath.cc        |    4 +--
+ splash/SplashXPathScanner.cc  |    4 +--
+ 35 files changed, 214 insertions(+), 176 deletions(-)
+
+commit feb82c60b1f86a9d1260db57534d98c54ee615c4
+Author: Martin Kretzschmar <martink@gnome.org>
+Date:  Wed Aug 24 19:41:27 2005 +0000
+
+    * configure.ac: add /usr/include/qt4 to qt4_incdirs. That's what
+    Debian and Ubuntu use. Maybe we should just use pkg-config. If
+    it's usable with qt4.
+
+    * test/.cvsignore: ignore pdf_inspector binary.
+
+ ChangeLog      |    8 ++++++++
+ configure.ac   |    2 +-
+ test/.cvsignore |    7 ++++---
+ 3 files changed, 13 insertions(+), 4 deletions(-)
+
+commit 8dce80eb74f24f07ac7668905f1631e04a9c5841
+Author: Kristian Høgsberg <krh@redhat.com>
+Date:  Wed Aug 24 18:57:46 2005 +0000
+
+    2005-08-24 Kristian Høgsberg  <krh@redhat.com>
+
+           * poppler/TextOutputDev.cc: Push rotation argument down to
+           GfxState constructor.  This is still not completely
+           functional yet.
+
+           * glib/poppler-page.cc (poppler_page_render_selection): Add
+           rotation argument so API is useful.  Not yet implemented.
+           (poppler_page_prepare_output_dev): Patch from Marco to fix
+           rotation using the cairo backend.
+
+ ChangeLog               |   10 ++++++++++
+ glib/poppler-page.cc    |   22 ++++++++++++++++------
+ glib/poppler-page.h     |    1 +
+ poppler/TextOutputDev.cc |   11 ++++++++---
+ poppler/TextOutputDev.h  |    4 +++-
+ 5 files changed, 38 insertions(+), 10 deletions(-)
+
+commit b909b5ae98bc3e557ef6e658e2b9120e82951259
+Author: Jonathan Blandford <jrb@redhat.com>
+Date:  Wed Aug 24 03:21:20 2005 +0000
+
+    Tue Aug 23 17:21:02 2005  Jonathan Blandford  <jrb@redhat.com>
+
+           * test/Makefile.am (gtk_cairo_test_LDADD): add
+           FREETYPE_{CFLAGS,LIBS} to the cairo deps
+
+ ChangeLog       |    5 +++++
+ test/Makefile.am |    4 +++-
+ 2 files changed, 8 insertions(+), 1 deletion(-)
+
+commit da3aac379f07ffedd6078707ec9923800fc0c0a5
+Author: Jonathan Blandford <jrb@redhat.com>
+Date:  Tue Aug 23 18:20:45 2005 +0000
+
+    Tue Aug 23 13:38:01 2005  Jonathan Blandford  <jrb@redhat.com>
+
+           * configure.ac:
+           * poppler/Gfx.cc:
+           * poppler/Gfx.h:
+           * poppler/GlobalParams.cc:
+           * poppler/GlobalParams.h:
+           * poppler/Makefile.am:
+           * poppler/OutputDev.cc:
+           * poppler/OutputDev.h:
+           * poppler/ProfileData.cc:
+           * poppler/ProfileData.h:
+           * test/Makefile.am:
+           * test/pdf-inspector.cc:
+           * test/pdf-inspector.glade:
+           * test/pdf-operators.c: Initial cut at a pdf inspector.  This
+           should help us look at PDF files.
+
+ ChangeLog               |   18 ++
+ configure.ac            |    4 +-
+ poppler/Gfx.cc                  |   30 ++++
+ poppler/Gfx.h           |    1 +
+ poppler/GlobalParams.cc  |   16 ++
+ poppler/GlobalParams.h   |    3 +
+ poppler/Makefile.am     |    2 +
+ poppler/OutputDev.cc    |   17 ++
+ poppler/OutputDev.h     |   10 +-
+ poppler/ProfileData.cc   |   44 +++++
+ poppler/ProfileData.h   |   41 +++++
+ test/Makefile.am        |   13 +-
+ test/pdf-inspector.cc   |  358 ++++++++++++++++++++++++++++++++++++++
+ test/pdf-inspector.glade |  434
+ ++++++++++++++++++++++++++++++++++++++++++++++
+ test/pdf-operators.c    |   81 +++++++++
+ 15 files changed, 1068 insertions(+), 4 deletions(-)
+
+commit 1aad886c6c19a964a3fc9e18f31acc8e115478e0
+Author: Kristian Høgsberg <krh@redhat.com>
+Date:  Mon Aug 22 18:20:12 2005 +0000
+
+    2005-08-22 Kristian Høgsberg  <krh@redhat.com>
+
+           * glib/poppler-page.cc:
+           * glib/poppler-page.h:
+           * glib/poppler-private.h:
+           * glib/test-poppler-glib.c: Patch from Marco to simplify
+           the glib
+           rotation API.
+
+ ChangeLog               |    8 +++
+ glib/poppler-page.cc    |  136
+ ++++++----------------------------------------
+ glib/poppler-page.h     |    4 +-
+ glib/poppler-private.h   |    1 -
+ glib/test-poppler-glib.c |    2 +-
+ 5 files changed, 28 insertions(+), 123 deletions(-)
+
+commit 6070b1dc4b76c236f3100fbd255c2d906e61c3c2
+Author: Kristian Høgsberg <krh@redhat.com>
+Date:  Sun Aug 21 23:14:04 2005 +0000
+
+    2005-08-21 Kristian Høgsberg  <krh@redhat.com>
+
+           * poppler/Makefile.am (INCLUDES): Add FREETYPE_CFLAGS.
+
+           * configure.ac: Make freetype check use pkg-config if
+           possible.
+
+ ChangeLog          |    6 ++++++
+ configure.ac       |   34 ++++++++++++++++++++++++----------
+ poppler/Makefile.am |   1 +
+ 3 files changed, 31 insertions(+), 10 deletions(-)
+
+commit 2698ca6fa107ea91dc01eb8cfb0c93383fbca125
+Author: Kristian Høgsberg <krh@redhat.com>
+Date:  Wed Aug 17 16:54:01 2005 +0000
+
+    2005-08-17 Kristian Høgsberg  <krh@redhat.com>
+
+           * poppler/GfxFont.cc: Add fix discussed in #3131 to only
+           use the
+           MacRoman char map if the font has one or the font dicts
+           specifies
+           /MacRoman.
+
+ ChangeLog         |    6 ++++++
+ poppler/GfxFont.cc |   1 -
+ 2 files changed, 6 insertions(+), 1 deletion(-)
+
+commit 5dc9b14b99f2efa2fe018e9267dd363d1bcd78b1
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Sun Aug 7 23:58:12 2005 +0000
+
+    Fix EOF checking
+
+ ChangeLog        |    4 ++++
+ poppler/PDFDoc.cc |   10 +++++++++-
+ 2 files changed, 13 insertions(+), 1 deletion(-)
+
+commit 155d019d7b474f244a3e4bf64d192015f6a266c4
+Author: Kristian Høgsberg <krh@redhat.com>
+Date:  Sat Aug 6 18:09:51 2005 +0000
+
+    2005-08-06 Kristian Høgsberg  <krh@redhat.com>
+
+           * glib/poppler-page.cc:
+           * glib/poppler-page.h: Use GdkColor for specifying selection
+           colors, we alreay depend on GDK anyway.
+
+ ChangeLog           |    6 ++++++
+ glib/poppler-page.cc |   20 +++++++++-----------
+ glib/poppler-page.h  |    5 +++--
+ 3 files changed, 18 insertions(+), 13 deletions(-)
+
+commit c710b645c8297d356c101b13a9889bcaba691176
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Sat Aug 6 11:58:59 2005 +0000
+
+    Update comment
+
+ poppler/PDFDoc.cc |   2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit de7953c8a8360d8bfc99298906c5fc1094684fc3
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Sat Aug 6 11:47:37 2005 +0000
+
+    Increase EOF searching up to last 1024 characters
+
+ ChangeLog        |    7 +++++++
+ poppler/PDFDoc.cc |   23 +++++++++++++----------
+ 2 files changed, 20 insertions(+), 10 deletions(-)
+
+commit 5dd72618688763b50d5f5738d857c9294ef1b1c2
+Author: Brad Hards <bradh@frogmouth.net>
+Date:  Sat Aug 6 02:15:58 2005 +0000
+
+    Add password arguments to document constructor.
+
+ ChangeLog                  |    4 ++++
+ qt4/src/poppler-document.cc |   8 ++++++--
+ qt4/src/poppler-qt4.h      |    4 +++-
+ 3 files changed, 13 insertions(+), 3 deletions(-)
+
+commit edbd7957b393eb63f48df7db6b220b355d4fc461
+Author: Brad Hards <bradh@frogmouth.net>
+Date:  Sat Aug 6 02:07:55 2005 +0000
+
+    Make API extraction work again.
+
+ ChangeLog       |    3 +++
+ qt4/src/Doxyfile |    2 +-
+ 2 files changed, 4 insertions(+), 1 deletion(-)
+
+commit f43a6f1d1c27c042f5736746c94430083baa4c1d
+Author: Brad Hards <bradh@frogmouth.net>
+Date:  Sat Aug 6 01:53:06 2005 +0000
+
+    Add new test code for encrypted files.
+
+ ChangeLog                      |    5 ++
+ qt4/tests/.cvsignore           |    1 +
+ qt4/tests/Makefile.am          |    7 +-
+ qt4/tests/test-password-qt4.cpp |  135
+ +++++++++++++++++++++++++++++++++++++++
+ 4 files changed, 147 insertions(+), 1 deletion(-)
+
+commit 2ec26afaf80864b023899b890b8e229448da9bed
+Author: Kristian Høgsberg <krh@redhat.com>
+Date:  Fri Aug 5 22:30:20 2005 +0000
+
+    2005-08-05 Kristian Høgsberg  <krh@redhat.com>
+
+           * poppler/TextOutputDev.cc (visitLine): Round selection
+           coordinates in device space, so selection isn't fuzzy.
+
+           * poppler/GfxState.cc:
+           * poppler/GfxState.h: Add simple Matrix class.
+
+ ChangeLog                |    8 ++++++++
+ poppler/CairoOutputDev.cc |   6 +++---
+ poppler/GfxState.cc      |   26 ++++++++++++++++++++++++++
+ poppler/GfxState.h       |   10 ++++++++++
+ poppler/TextOutputDev.cc  |   14 ++++++++++++++
+ 5 files changed, 61 insertions(+), 3 deletions(-)
+
+commit ccba4f0773047eea5e4ad0ac736450160dd97664
+Author: Kristian Høgsberg <krh@redhat.com>
+Date:  Fri Aug 5 19:04:36 2005 +0000
+
+    2005-08-05 Kristian Høgsberg  <krh@redhat.com>
+
+           * glib/poppler-page.cc:
+           * glib/poppler-page.h:
+           * poppler/TextOutputDev.cc:
+           * poppler/TextOutputDev.h: Propagate selection colors to
+           the glib API.
+
+ ChangeLog               |    7 ++++++
+ glib/poppler-page.cc    |   63
+ ++++++++++++++++++++++++++++++++++++++++------
+ glib/poppler-page.h     |    4 ++-
+ poppler/TextOutputDev.cc |   25 +++++++++---------
+ poppler/TextOutputDev.h  |    7 ++++--
+ 5 files changed, 82 insertions(+), 24 deletions(-)
+
+commit 43e97129393f403c41f191ceae9a54793ece005f
+Author: Brad Hards <bradh@frogmouth.net>
+Date:  Thu Aug 4 10:15:23 2005 +0000
+
+    Fix problem with drawing filled objects that was introduced in
+    Rev 1.4.
+
+ ChangeLog                 |    5 +++++
+ poppler/ArthurOutputDev.cc |  13 +++++++++++--
+ 2 files changed, 16 insertions(+), 2 deletions(-)
+
+commit a75d80333a70d2e1ac7c9032d316034eebed9dd6
+Author: Brad Hards <bradh@frogmouth.net>
+Date:  Wed Aug 3 11:44:55 2005 +0000
+
+    Implement paging ability for Qt4, more than a little based
+    on Albert's work for Qt3.
+    Up arrow -> previous page
+    Down arrow -> next page
+    q -> quit.
+
+    What more could you want from a PDF viewer :-)
+
+ ChangeLog                     |    6 +++++
+ qt4/tests/test-poppler-qt4.cpp |   47
+ +++++++++++++++++++++++++++++++---------
+ 2 files changed, 43 insertions(+), 10 deletions(-)
+
+commit f3e0a163b098da1cc389c2c4f47e28358b1bec77
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Mon Aug 1 19:15:40 2005 +0000
+
+    Fix problem in the patch to fix #3299
+
+ ChangeLog           |    4 ++++
+ poppler/DCTStream.cc |   15 ++++++++++-----
+ poppler/DCTStream.h  |    1 +
+ 3 files changed, 15 insertions(+), 5 deletions(-)
+
+commit 5f7bd81bedd8c90e3312190256488ff0c15502e1
+Author: Kristian Høgsberg <krh@redhat.com>
+Date:  Mon Aug 1 15:21:19 2005 +0000
+
+    2005-08-01 Kristian Høgsberg  <krh@redhat.com>
+
+           Patch from Dan Winship <danw@novell.com>
+
+           * glib/poppler-page.cc (poppler_page_copy_to_pixbuf): Set
+           alpha to
+           0xff (opaque), not 0x00.
+
+ ChangeLog           |    7 +++++++
+ glib/poppler-page.cc |    2 +-
+ 2 files changed, 8 insertions(+), 1 deletion(-)
+
+commit 22f509e60f60ccaea1f91d9ec1ef7ba8200bee8a
+Author: Brad Hards <bradh@frogmouth.net>
+Date:  Mon Aug 1 08:09:00 2005 +0000
+
+    Fix up the fill problem with drawing text, where the "middle"
+    of glyphs
+    with a "hole" (like d, o, p, b, g) got filled. Also remove some
+    debugging
+    code. The glyphs are still ugly though.
+
+ ChangeLog                 |    7 +++++++
+ poppler/ArthurOutputDev.cc |  13 +------------
+ 2 files changed, 8 insertions(+), 12 deletions(-)
+
+commit 7bf5d10c1f6edd538769c3a83a3b3d5df56d604b
+Author: Brad Hards <bradh@frogmouth.net>
+Date:  Sun Jul 31 09:54:04 2005 +0000
+
+    An initial version of proper font handling, heavily based on work by
+    Albert Astals Cid. I changed it to stroke the glyphs based on the
+    SplashPath. In the longer term, Arthur should use FreeType paths
+    directly - hopefully that will be less ugly, and not fill everything.
+
+ ChangeLog                 |    8 +
+ poppler/ArthurOutputDev.cc |  401
+ ++++++++++++++++++++++++++++++++------------
+ poppler/ArthurOutputDev.h  |  15 +-
+ qt4/src/poppler-page.cc    |   2 +-
+ splash/SplashPath.h       |    2 +
+ 5 files changed, 314 insertions(+), 114 deletions(-)
+
+commit 8567b794628786b82e8db2a7daf75e4ad2398960
+Author: Brad Hards <bradh@frogmouth.net>
+Date:  Fri Jul 29 12:15:19 2005 +0000
+
+    Add some more test cases.
+
+ ChangeLog                            |    4 ++++
+ qt4/tests/.cvsignore                 |    4 ++++
+ qt4/tests/Makefile.am                |   10 +++++++++-
+ qt4/tests/check_pagelayout_facing.cpp |   22 ++++++++++++++++++++++
+ qt4/tests/check_version.cpp          |   22 ++++++++++++++++++++++
+ 5 files changed, 61 insertions(+), 1 deletion(-)
+
+commit 59d660cf4d614fdea09d6a62b8889f7682c2b4f9
+Author: Brad Hards <bradh@frogmouth.net>
+Date:  Fri Jul 29 11:41:14 2005 +0000
+
+    Compile fix associated with last change.
+
+ poppler/ArthurOutputDev.cc |   2 --
+ 1 file changed, 2 deletions(-)
+
+commit 88c57c73f57820d6a57e26825093fbc688845e67
+Author: Brad Hards <bradh@frogmouth.net>
+Date:  Fri Jul 29 11:24:42 2005 +0000
+
+    A couple of minor changes to the Arthur backend.
+
+ ChangeLog                 |    9 +++++++++
+ poppler/ArthurOutputDev.cc |  18 ++++++++++++++----
+ 2 files changed, 23 insertions(+), 4 deletions(-)
+
+commit 481db9d9eae5ea16e5b382f4ad21e6e624a70dcf
+Author: Kristian Høgsberg <krh@redhat.com>
+Date:  Fri Jul 29 05:48:33 2005 +0000
+
+    2005-07-29 Kristian Høgsberg  <krh@redhat.com>
+
+           * poppler/TextOutputDev.cc: Finish TextSelectionDumper
+           class for
+           extracting the text from a selection.  Add
+           TextPage::getSelectionText() and
+           TextOutputDev::getSelectionText()
+           methods to expose the new functionality.
+
+           * glib/poppler-page.cc (poppler_page_get_text): Use
+           TextOutputDev::getSelectionText() to get the text from the
+           selection.
+
+           * glib/poppler-document.cc (poppler_document_new_from_file):
+           * glib/poppler-page.cc (_poppler_page_new): Add extra NULL to
+           g_object_new() constructor to silence gcc warning about
+           missing
+           sentinel.
+
+ ChangeLog               |   16 +++++
+ glib/poppler-document.cc |    2 +-
+ glib/poppler-page.cc    |   31 +++++----
+ poppler/TextOutputDev.cc |  164
+ +++++++++++++++++++++++++++++++++++-----------
+ poppler/TextOutputDev.h  |    8 +++
+ 5 files changed, 164 insertions(+), 57 deletions(-)
+
+commit ad312dbded4e8f70c3a2eac9a0964fa00ecb6b2c
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Thu Jul 28 22:56:17 2005 +0000
+
+    Fix memory leaks in PageLabelInfo.cc
+
+ ChangeLog               |    4 ++++
+ poppler/PageLabelInfo.cc |   11 +++++++++++
+ poppler/PageLabelInfo.h  |    2 ++
+ 3 files changed, 17 insertions(+)
+
+commit b45ad9f3409d7b1ed147135a70553e5255913c61
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Thu Jul 28 20:53:36 2005 +0000
+
+    -   delete family;
+    +   delete[] family;
+    as family is new[]'ed
+
+    When assigning family if the font had "the proper info" and family
+    had to be deleted, do it.
+
+ poppler/GlobalParams.cc |    9 +++++++--
+ 1 file changed, 7 insertions(+), 2 deletions(-)
+
+commit f93dfc5c5133e0b1bd9f4786cfe18bd796cbac2a
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Thu Jul 28 18:51:17 2005 +0000
+
+    Remove the debugging
+
+ poppler/GlobalParams.cc |    5 -----
+ 1 file changed, 5 deletions(-)
+
+commit 8022315004e1623c0be320f7671fcd72c15c0de3
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Thu Jul 28 18:37:17 2005 +0000
+
+    Wonder how that slipped here
+
+ poppler/GlobalParams.cc |    3 +--
+ 1 file changed, 1 insertion(+), 2 deletions(-)
+
+commit 82638babe89e402c0348619ec3205059b977c7e9
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Thu Jul 28 17:34:19 2005 +0000
+
+    Fontconfig patch is here, rejoice
+
+ ChangeLog                  |   15 +-
+ glib/poppler-document.cc    |   1 -
+ poppler/CairoFontEngine.cc  |  95 +--------
+ poppler/CairoFontEngine.h   |   2 -
+ poppler/CairoOutputDev.cc   |   4 -
+ poppler/GlobalParams.cc     | 473
+ ++++++++++++++++++++-----------------------
+ poppler/GlobalParams.h      |  17 +-
+ poppler/SplashOutputDev.cc  | 132 +-----------
+ poppler/SplashOutputDev.h   |   3 -
+ qt/poppler-document.cc      |   1 -
+ qt4/src/poppler-document.cc |   1 -
+ test/gtk-cairo-test.cc      |   1 -
+ test/gtk-splash-test.cc     |   1 -
+ 13 files changed, 241 insertions(+), 505 deletions(-)
+
+commit e9015531b1d0e5f2c8d8ca2bc50d5f14aaf954bc
+Author: Kristian Høgsberg <krh@redhat.com>
+Date:  Thu Jul 28 06:31:57 2005 +0000
+
+    2005-07-28 Kristian Høgsberg  <krh@redhat.com>
+
+           * poppler/poppler-config.h.in: Add GCC_PRINTF_FORMAT macro to
+           annotate printf-like functions (#3638).
+
+           * poppler/Error.h: Add GCC_PRINTF_FORMAT to error().
+
+           * poppler/PSOutputDev.h: Add GCC_PRINTF_FORMAT to
+           PSOutputDev::writePSFmt().
+
+           * poppler/PSOutputDev.cc, poppler/GlobalParams.cc: Quiet new
+           printf warnings.
+
+ ChangeLog                  |   11 +++++++++++
+ poppler/Error.h            |    2 +-
+ poppler/GlobalParams.cc     |   3 ++-
+ poppler/PSOutputDev.cc      |   3 +--
+ poppler/PSOutputDev.h      |    2 +-
+ poppler/TextOutputDev.cc    |  13 ++++++++++++-
+ poppler/poppler-config.h.in |  12 ++++++++++++
+ 7 files changed, 40 insertions(+), 6 deletions(-)
+
+commit 9df89c495683e229b771b3d008ed25d478465c35
+Author: Kristian Høgsberg <krh@redhat.com>
+Date:  Thu Jul 28 05:52:43 2005 +0000
+
+    2005-07-28 Kristian Høgsberg  <krh@redhat.com>
+
+           * poppler/TextOutputDev.cc (TextBlock::visitSelection): Assign
+           start and stop coordinates in one place so we don't assign the
+           same point to both in some corner cases.
+           (TextWord::visitSelection): Initialize begin to len, not
+           len + 1
+           to fix crash.
+
+           (TextWord::visitSelection, TextLine::visitSelection): Change
+           selection trigger; now midpoint of glyph must be included in
+           selection area for glyph to be in selection.
+
+ ChangeLog                |   12 +++++
+ poppler/CairoOutputDev.cc |   2 +-
+ poppler/TextOutputDev.cc  |  113
+ ++++++++++++++++++++++-----------------------
+ 3 files changed, 67 insertions(+), 60 deletions(-)
+
+commit a3d9b5849cedf1316c6fc5859872e957f3f7b593
+Author: Martin Kretzschmar <martink@gnome.org>
+Date:  Wed Jul 27 19:21:08 2005 +0000
+
+    * poppler/PSOutputDev.cc (PSOutputDev): change the constructor to
+    take paper size and duplex setting parameters.
+    (init): add paper size and duplex parameters.
+    (writeDocSetup): add duplex parameter.
+
+    * poppler/PSOutputDev.h: update declarations.
+
+    * glib/poppler-private.h (struct _PopplerPSFile): store necessary
+    information to eventually construct a PSOutputDev.
+
+    * glib/poppler-page.cc (poppler_page_render_to_ps): initialize the
+    output dev if it doesn't exist yet.
+
+    * glib/poppler-document.cc (poppler_ps_file_new): don't create the
+    PSOutputDev here, just store filename and page range.
+    (poppler_ps_file_set_paper_size, poppler_ps_file_set_duplex): new
+    functions.
+    (poppler_ps_file_free): free the filename which we strdup now.
+
+    * glib/poppler-document.h: add prototypes.
+
+ ChangeLog               |   23 ++++++++++++++++++++++
+ glib/poppler-document.cc |   49
+ +++++++++++++++++++++++++++++++++++++++-------
+ glib/poppler-document.h  |   15 +++++++++-----
+ glib/poppler-page.cc    |   10 ++++++++++
+ glib/poppler-private.h   |    6 ++++++
+ poppler/PSOutputDev.cc   |   23 +++++++++++++---------
+ poppler/PSOutputDev.h   |    9 +++++++--
+ 7 files changed, 112 insertions(+), 23 deletions(-)
+
+commit 7be920ecf13698c3cf4ab8df09c8c67f1a04bfa2
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Tue Jul 26 21:52:09 2005 +0000
+
+    Fix mem leak in qt test app
+
+ ChangeLog             |    4 ++++
+ qt/test-poppler-qt.cpp |    2 ++
+ 2 files changed, 6 insertions(+)
+
+commit 2bc26dffd9f296799617d319055648c20f748c8a
+Author: Kristian Høgsberg <krh@redhat.com>
+Date:  Tue Jul 26 20:34:13 2005 +0000
+
+    2005-07-26 Kristian Høgsberg  <krh@redhat.com>
+
+           * fofi/FoFiType1.cc: Make check for end of encoding array
+           a bit
+           more liberal so we don't crash on complex encoding arrays
+           (#3344).
+
+ ChangeLog        |    5 +++++
+ fofi/FoFiType1.cc |   21 +++++++--------------
+ 2 files changed, 12 insertions(+), 14 deletions(-)
+
+commit 07911274e4e850a628b1e587cafc2a73c05f93fe
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Mon Jul 25 20:40:37 2005 +0000
+
+    Work on bad jpeg data that have garbage before the start marker. Fixes
+    bug #3299
+
+ ChangeLog           |    5 +++++
+ poppler/DCTStream.cc |   38 ++++++++++++++++++++++++++++++++++++++
+ 2 files changed, 43 insertions(+)
+
+commit a1869eca39172fcb42f036a5846b19548be53568
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Fri Jul 22 11:01:25 2005 +0000
+
+    Fix bug #3586
+
+ ChangeLog                 |    5 +++++
+ poppler/CairoFontEngine.cc |   2 ++
+ 2 files changed, 7 insertions(+)
+
+commit 95529b41272484f08fb54393e1886bf7ff3e02c8
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Fri Jul 22 10:45:19 2005 +0000
+
+    Make it possible to browse pages in test-poppler-qt
+
+ ChangeLog             |   13 +++++++++----
+ qt/test-poppler-qt.cpp |   49
+ +++++++++++++++++++++++++++++++++++++++---------
+ 2 files changed, 49 insertions(+), 13 deletions(-)
+
+commit 2d52650864eab0e9385ed1fe8fb594daac9d8322
+Author: Martin Kretzschmar <martink@gnome.org>
+Date:  Fri Jul 22 10:35:56 2005 +0000
+
+    * glib/poppler-document.cc (poppler_fonts_iter_get_name): if the
+    font is a subset, strip the ABCDEF+ tag.
+    (poppler_fonts_iter_get_full_name): does what the old get_name did.
+    (poppler_fonts_iter_get_font_type, poppler_fonts_iter_is_embedded)
+    (poppler_fonts_iter_is_subset): new wrappers.
+
+    * glib/poppler-document.h (PopplerFontType): new enum.
+    Update prototypes.
+
+ ChangeLog               |   11 ++++++++++
+ glib/poppler-document.cc |   54
+ +++++++++++++++++++++++++++++++++++++++++++++-
+ glib/poppler-document.h  |   38 ++++++++++++++++++++++----------
+ 3 files changed, 91 insertions(+), 12 deletions(-)
+
+commit 43bed4aafcf1d291dc96fa5070efbd7936a6122f
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Fri Jul 22 10:33:54 2005 +0000
+
+    Fix bugs #3728 and #3750
+
+ ChangeLog       |    4 ++++
+ splash/Splash.cc |   10 ++++++++++
+ 2 files changed, 14 insertions(+)
+
+commit c7bcef87493d354a077dd223d76f86640acc0ce3
+Author: Martin Kretzschmar <martink@gnome.org>
+Date:  Fri Jul 15 19:55:30 2005 +0000
+
+    update for 2005-06-27 change to actually display something again.
+
+ ChangeLog             |    5 +++++
+ test/gtk-cairo-test.cc |   10 ++++++----
+ 2 files changed, 11 insertions(+), 4 deletions(-)
+
+commit 6623711d2d50dc52454904ee16b25337f0aab130
+Author: Brad Hards <bradh@frogmouth.net>
+Date:  Sun Jul 10 09:34:03 2005 +0000
+
+    A general cleanup of the Arthur output renderer.
+
+ ChangeLog                 |    5 +++
+ poppler/ArthurOutputDev.cc |  105
+ +++++++++++++++-----------------------------
+ 2 files changed, 41 insertions(+), 69 deletions(-)
+
+commit ea1cc9a7b12db9c44b89896c41d07e3ba932d054
+Author: Kristian Høgsberg <krh@redhat.com>
+Date:  Fri Jul 8 04:59:41 2005 +0000
+
+    2005-07-08 Kristian Høgsberg  <krh@redhat.com>
+
+           * glib/poppler-page.cc (poppler_page_set_selection_alpha): Add
+           this function to initialize the alpha channel when using the
+           splash backend.
+
+           * poppler/TextOutputDev.cc (visitLine): Add missing scaling of
+           intra-line selection edges.
+
+ ChangeLog               |    9 +++++++
+ glib/poppler-page.cc    |   59
+ +++++++++++++++++++++++++++++++++++++++++++++-
+ poppler/TextOutputDev.cc |   17 +++++++------
+ 3 files changed, 77 insertions(+), 8 deletions(-)
+
+commit 1cd915397c9532ed80b4f905b6ed9c0126aa38f2
+Author: Brad Hards <bradh@frogmouth.net>
+Date:  Thu Jul 7 21:15:09 2005 +0000
+
+    Add support for page layout to the Qt4 bindings, plus
+    test cases.
+
+ ChangeLog                            |    8 ++++++++
+ qt4/src/poppler-document.cc          |   22 ++++++++++++++++++++++
+ qt4/src/poppler-qt4.h                |   26 ++++++++++++++++++++++++--
+ qt4/tests/Makefile.am                |   10 +++++++++-
+ qt4/tests/check_pagelayout_none.cpp   |   22 ++++++++++++++++++++++
+ qt4/tests/check_pagelayout_single.cpp |   22 ++++++++++++++++++++++
+ 6 files changed, 107 insertions(+), 3 deletions(-)
+
+commit 4e050aef7ba132900f84205be221fd48808848c3
+Author: Kristian Høgsberg <krh@redhat.com>
+Date:  Thu Jul 7 17:19:36 2005 +0000
+
+    2005-07-07 Kristian Høgsberg  <krh@redhat.com>
+
+           * glib/poppler-page.cc (poppler_page_prepare_output_dev):
+           Account
+           for page rotation when creating the cairo surface.
+
+ ChangeLog           |    5 +++++
+ glib/poppler-page.cc |   17 +++++++++++++++--
+ 2 files changed, 20 insertions(+), 2 deletions(-)
+
+commit 2eeab0b8afeb4897806df2de6e496889c25dda5e
+Author: Kristian Høgsberg <krh@redhat.com>
+Date:  Thu Jul 7 15:58:43 2005 +0000
+
+    2005-07-06 Kristian Høgsberg  <krh@redhat.com>
+
+           * glib/poppler-page.cc (poppler_page_copy_to_pixbuf): Add
+           out of
+           bounds checking (from Marco).
+
+ ChangeLog           |    6 +++++-
+ glib/poppler-page.cc |    5 +++++
+ 2 files changed, 10 insertions(+), 1 deletion(-)
+
+commit b1015f6bdbd93b2a2574a9f0e0e1cd7dbae9af78
+Author: Brad Hards <bradh@frogmouth.net>
+Date:  Thu Jul 7 11:13:24 2005 +0000
+
+    At least try to fix glib issues. If you care about glib,
+    then you should review this.
+
+ ChangeLog               |    4 ++++
+ glib/poppler-document.cc |    2 ++
+ 2 files changed, 6 insertions(+)
+
+commit 8bf787031e7a2e93b4e1202918bd1aee86675082
+Author: Brad Hards <bradh@frogmouth.net>
+Date:  Thu Jul 7 11:04:08 2005 +0000
+
+    Update for page mode - new mode from PDF-1.6, API docs fixes
+    and some tests.
+
+ ChangeLog                              |   15 +++++++++++++++
+ poppler/Catalog.cc                     |    2 ++
+ poppler/Catalog.h                      |    3 ++-
+ qt4/src/poppler-document.cc            |    2 ++
+ qt4/src/poppler-qt4.h                  |   14 +++++++++-----
+ qt4/tests/Makefile.am                  |   22 +++++++++++++++++++++-
+ qt4/tests/check_pagemode_attach.cpp    |   22 ++++++++++++++++++++++
+ qt4/tests/check_pagemode_fullscreen.cpp |   22 ++++++++++++++++++++++
+ qt4/tests/check_pagemode_none.cpp      |   22 ++++++++++++++++++++++
+ qt4/tests/check_pagemode_oc.cpp        |   22 ++++++++++++++++++++++
+ qt4/tests/check_pagemode_thumbs.cpp    |   22 ++++++++++++++++++++++
+ 11 files changed, 161 insertions(+), 7 deletions(-)
+
+commit 695e27fb4d6fcc3466e2c9c95b4f02821b07e823
+Author: Brad Hards <bradh@frogmouth.net>
+Date:  Thu Jul 7 11:01:27 2005 +0000
+
+    Suppress noise from new test files.
+
+ qt4/tests/.cvsignore |    6 ++++++
+ 1 file changed, 6 insertions(+)
+
+commit 8a8d57bdcf11ed2903913d938b9711053b9bb9f1
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Wed Jul 6 17:12:36 2005 +0000
+
+    Extract family, stretch and weight from the font descriptor
+
+ ChangeLog         |    2 ++
+ poppler/GfxFont.cc |  41 +++++++++++++++++++++++++++++++++++++++++
+ poppler/GfxFont.h  |  36 ++++++++++++++++++++++++++++++++++++
+ 3 files changed, 79 insertions(+)
+
+commit 3a1646c2f776f5a07b0e830fcb8e1b0a80efb41c
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Wed Jul 6 13:29:00 2005 +0000
+
+    Add checkFooter to check the document ends with %%EOF
+
+ ChangeLog        |    5 +++++
+ poppler/PDFDoc.cc |   28 ++++++++++++++++++++++++++++
+ poppler/PDFDoc.h  |   1 +
+ 3 files changed, 34 insertions(+)
+
+commit 377c023d31cf74d8240aa5be9dba8e3838459a8c
+Author: Brad Hards <bradh@frogmouth.net>
+Date:  Wed Jul 6 11:15:16 2005 +0000
+
+    Add unit tests for the isLinearized() property.
+
+ ChangeLog                     |    4 ++++
+ qt4/tests/Makefile.am         |    6 +++++-
+ qt4/tests/check_linearised.cpp |   23 +++++++++++++++++++++++
+ 3 files changed, 32 insertions(+), 1 deletion(-)
+
+commit 5fa869887a840a585340993718df0841010666cf
+Author: Brad Hards <bradh@frogmouth.net>
+Date:  Wed Jul 6 09:52:30 2005 +0000
+
+    Remove boolean for unicode table lookup from Font
+
+ ChangeLog                  |   14 ++++++++++++++
+ qt4/src/poppler-document.cc |   2 --
+ qt4/src/poppler-qt4.h      |   14 +-------------
+ qt4/tests/poppler-fonts.cpp |  16 +++++++---------
+ 4 files changed, 22 insertions(+), 24 deletions(-)
+
+commit 40469c5883e17e734f3d54872c59e76b95bc0f95
+Author: Brad Hards <bradh@frogmouth.net>
+Date:  Wed Jul 6 09:00:39 2005 +0000
+
+    Update to reflect recent changes.
+
+ qt4/tests/.cvsignore |    2 ++
+ 1 file changed, 2 insertions(+)
+
+commit 6cea437208f913085a6a8c7183b0826a107cefb5
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Tue Jul 5 21:15:48 2005 +0000
+
+    Don't crash with files that have fonts with no name
+
+ ChangeLog                  |    7 +++++++
+ qt4/src/poppler-document.cc |  13 ++++++++++---
+ qt4/src/poppler-qt4.h      |    2 +-
+ 3 files changed, 18 insertions(+), 4 deletions(-)
+
+commit 1323c74479848f5b87a3a13fa26e8b9e096e9f6a
+Author: Brad Hards <bradh@frogmouth.net>
+Date:  Tue Jul 5 12:31:59 2005 +0000
+
+    Check in a couple more test apps
+
+ qt4/tests/Makefile.am          |   10 ++++++-
+ qt4/tests/check_author.cpp     |   25 +++++++++++++++++
+ qt4/tests/check_permissions.cpp |   59
+ +++++++++++++++++++++++++++++++++++++++
+ 3 files changed, 93 insertions(+), 1 deletion(-)
+
+commit 839a798ec3725427185de5a48c58ac448596b25d
+Author: Brad Hards <bradh@frogmouth.net>
+Date:  Tue Jul 5 12:25:00 2005 +0000
+
+    Add Qt4 bindings for new user permission properties.
+
+ ChangeLog                  |    4 ++++
+ qt4/src/poppler-document.cc |  25 +++++++++++++++++++++
+ qt4/src/poppler-qt4.h      |   51
+ ++++++++++++++++++++++++++++++++++++++-----
+ 3 files changed, 75 insertions(+), 5 deletions(-)
+
+commit e10f6990d3339e3a7adeaa50b1754cf7ecf82f87
+Author: Brad Hards <bradh@frogmouth.net>
+Date:  Tue Jul 5 12:15:04 2005 +0000
+
+    Add some more user permissions properties - high resolution
+    printing, document assembly, extraction for accessibility
+    and form completion.
+
+ ChangeLog       |    8 ++++++++
+ poppler/PDFDoc.h |    9 +++++++++
+ poppler/XRef.cc  |   55
+ ++++++++++++++++++++++++++++++++++++++++++++++++++----
+ poppler/XRef.h   |    4 ++++
+ 4 files changed, 72 insertions(+), 4 deletions(-)
+
+commit 3a8e1ba03cdec6412dd0b79f0cc59a4cd97dd4e7
+Author: Brad Hards <bradh@frogmouth.net>
+Date:  Mon Jul 4 11:38:22 2005 +0000
+
+    A couple more little changes.
+
+ ChangeLog |   6 ++++++
+ 1 file changed, 6 insertions(+)
+
+commit a44bd0b45bb89f29ddca5d0e8986a8de50f9db39
+Author: Brad Hards <bradh@frogmouth.net>
+Date:  Mon Jul 4 11:37:21 2005 +0000
+
+    Change path to sample file to point to test module
+
+ qt4/tests/check_orientation.cpp |    2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 2a7079087c35651c242d3843c94703a3199e61ca
+Author: Brad Hards <bradh@frogmouth.net>
+Date:  Mon Jul 4 11:36:13 2005 +0000
+
+    Fix typo causing failure to pick up upside down pages.
+
+ qt4/src/poppler-page.cc |    2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 529a548044ae721a414c5b8e768c0498b1e6830b
+Author: Brad Hards <bradh@frogmouth.net>
+Date:  Mon Jul 4 08:30:29 2005 +0000
+
+    Update to reflect recent changes
+
+ ChangeLog           |   30 +++++++++++++++++++++++++++++-
+ qt4/tests/.cvsignore |    2 ++
+ 2 files changed, 31 insertions(+), 1 deletion(-)
+
+commit 08cca4670f8ae65333beacda85834112e76489d1
+Author: Brad Hards <bradh@frogmouth.net>
+Date:  Mon Jul 4 08:21:27 2005 +0000
+
+    Add in a simple demo/test application, similar to the pdffonts
+    application in xpdf.
+
+ qt4/tests/Makefile.am      |    9 ++++-
+ qt4/tests/poppler-fonts.cpp |  76
+ +++++++++++++++++++++++++++++++++++++++++++
+ 2 files changed, 84 insertions(+), 1 deletion(-)
+
+commit 52af89d8303b50c45d5e4584d19ec8b7d7ebcf9b
+Author: Brad Hards <bradh@frogmouth.net>
+Date:  Mon Jul 4 08:18:52 2005 +0000
+
+    Update to reflect changes to rendering API.
+
+ qt4/tests/stress-poppler-qt4.cpp |    4 ++--
+ qt4/tests/test-poppler-qt4.cpp   |    3 ++-
+ 2 files changed, 4 insertions(+), 3 deletions(-)
+
+commit d42998d0fc32b1e21a2aeef1311e0baf508ade3f
+Author: Brad Hards <bradh@frogmouth.net>
+Date:  Mon Jul 4 08:16:17 2005 +0000
+
+    Qt4 update.
+       * qt4/src/poppler-qt4.h:
+       * qt4/src/poppler-document.cc complete Qt4 font metadata handling
+
+       * qt4/src/poppler-qt4.h:
+       * qt4/src/poppler-page.cc: change the render API to make it more
+       Qt-like.
+
+ qt4/src/poppler-document.cc |   7 ++++-
+ qt4/src/poppler-page.cc     |   5 ++-
+ qt4/src/poppler-qt4.h      |   73
+ ++++++++++++++++++++++++++++++++++++++++---
+ 3 files changed, 77 insertions(+), 8 deletions(-)
+
+commit 5d194b926d1ed642ed4bbd3304befa073d389cd4
+Author: Brad Hards <bradh@frogmouth.net>
+Date:  Mon Jul 4 08:10:16 2005 +0000
+
+    Change FontInfo::type() to return an enumerated value,
+    rather than a GooString.
+
+ poppler/FontInfo.cc |  16 ++--------------
+ poppler/FontInfo.h  |  16 +++++++++++++---
+ 2 files changed, 15 insertions(+), 17 deletions(-)
+
+commit 1303020b2e97bc110ccf045cd2811daf59ec72ce
+Author: Brad Hards <bradh@frogmouth.net>
+Date:  Mon Jul 4 07:42:32 2005 +0000
+
+    Fix up the unit test, now that I have a real sample
+    file.
+
+ qt4/tests/check_orientation.cpp |    8 ++++----
+ 1 file changed, 4 insertions(+), 4 deletions(-)
+
+commit 96fc0ea3fc6c9c7d933e9e0c02a622b2aeef7617
+Author: Kristian Høgsberg <krh@redhat.com>
+Date:  Fri Jul 1 04:57:49 2005 +0000
+
+    2005-07-01 Kristian Høgsberg  <krh@redhat.com>
+
+           * poppler/TextOutputDev.cc: Make selection also work when
+           dragging
+           backwards in the text flow.  Currently this is a big pile of
+           if-statements, and there is certainly room for improvement.
+
+ ChangeLog               |    6 +++
+ poppler/TextOutputDev.cc |  129
+ +++++++++++++++++++++++++++++++++++++---------
+ 2 files changed, 111 insertions(+), 24 deletions(-)
+
+commit 06c49c496f28aba608101adcecd8cec34937ac78
+Author: Kristian Høgsberg <krh@redhat.com>
+Date:  Thu Jun 30 19:44:33 2005 +0000
+
+    2005-06-30 Kristian Høgsberg  <krh@redhat.com>
+
+           * glib/poppler-page.h: * glib/poppler-page.cc
+           (poppler_page_copy_to_pixbuf): Fix splash compilation
+           (patch from
+           Marco).
+           (poppler_page_render_to_pixbuf): Drop dest_x and dest_y
+           coordinates from this function.  This functionality can be
+           achieved using a sub-GdkPixbuf.
+
+           * glib/test-poppler-glib.c (main): Update test case.
+
+ ChangeLog               |   11 +++++++++++
+ NEWS                    |    6 ++++++
+ glib/poppler-page.cc    |   27 ++++++++++-----------------
+ glib/poppler-page.h     |    4 +---
+ glib/test-poppler-glib.c |    2 +-
+ 5 files changed, 29 insertions(+), 21 deletions(-)
+
+commit b126785aeda6b5576a13fc3f3853b027bd7dd306
+Author: Kristian Høgsberg <krh@redhat.com>
+Date:  Thu Jun 30 00:36:01 2005 +0000
+
+    2005-06-29 Kristian Høgsberg  <krh@redhat.com>
+
+           * glib/poppler-private.h: Move TextOutputDev.h include
+           here from
+           poppler-page.cc
+
+ ChangeLog             |    5 +++++
+ glib/poppler-page.cc  |    1 -
+ glib/poppler-private.h |    1 +
+ 3 files changed, 6 insertions(+), 1 deletion(-)
+
+commit b15a8caf003d7d0631d4f78db5ab54e55a5a000a
+Author: Kristian Høgsberg <krh@redhat.com>
+Date:  Wed Jun 29 21:24:48 2005 +0000
+
+    2005-06-29 Kristian Høgsberg  <krh@redhat.com>
+
+           * configure.ac:
+           * glib/poppler-page.cc:
+           * glib/poppler-page.h:
+           * glib/poppler-private.h:
+           * poppler/CairoOutputDev.cc:
+           * poppler/CairoOutputDev.h:
+           * poppler/Page.cc:
+           * poppler/Page.h:
+           * poppler/TextOutputDev.cc:
+           * poppler/TextOutputDev.h: Add support for rendering real
+           selection (based on text flow).
+
+ ChangeLog                |   20 ++-
+ configure.ac             |    4 +-
+ glib/poppler-page.cc     |  224 ++++++++++++++++++------
+ glib/poppler-page.h      |   65 ++++---
+ glib/poppler-private.h    |   3 +
+ poppler/CairoOutputDev.cc |   13 +-
+ poppler/CairoOutputDev.h  |   2 +-
+ poppler/Page.cc          |   59 +++++--
+ poppler/Page.h                   |   12 ++
+ poppler/TextOutputDev.cc  |  414
+ ++++++++++++++++++++++++++++++++++++++++++++-
+ poppler/TextOutputDev.h   |   38 ++++-
+ 11 files changed, 743 insertions(+), 111 deletions(-)
+
+commit 3b5e20465e482eb0e75a106697ee94d60aea2fdc
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Tue Jun 28 22:51:29 2005 +0000
+
+    Forgot assigning type on copy constructor
+
+ poppler/FontInfo.cc |   1 +
+ 1 file changed, 1 insertion(+)
+
+commit e512cd1832a0e6d15149e12e8e67a39d335efc86
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Tue Jun 28 22:49:14 2005 +0000
+
+    Add FontInfo::getType()
+
+ ChangeLog          |    3 +++
+ poppler/FontInfo.cc |   4 ++++
+ poppler/FontInfo.h  |   2 ++
+ 3 files changed, 9 insertions(+)
+
+commit 8aeb5205f2876a9dc36eb1dc1e361bb87adf4e31
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Tue Jun 28 22:00:05 2005 +0000
+
+    use transformation matrix for image rendering in Arthur backend
+
+ ChangeLog                 |    4 ++++
+ poppler/ArthurOutputDev.cc |  12 +++++++-----
+ 2 files changed, 11 insertions(+), 5 deletions(-)
+
+commit a221d06fdc7b0688ca0744a1d6ad49d472c7f12c
+Author: Brad Hards <bradh@frogmouth.net>
+Date:  Tue Jun 28 10:59:14 2005 +0000
+
+    Reduce cvs up noise
+
+ .cvsignore          |    1 +
+ ChangeLog           |    7 +++++++
+ qt4/.cvsignore       |    3 +++
+ qt4/src/.cvsignore   |    7 +++++++
+ qt4/tests/.cvsignore |    8 ++++++++
+ 5 files changed, 26 insertions(+)
+
+commit ea58a20bbcf450a1ecb8fe00e8162cfdf76105f1
+Author: Brad Hards <bradh@frogmouth.net>
+Date:  Tue Jun 28 10:00:09 2005 +0000
+
+    Initial import of Qt4 bindings, and for a Qt4 "Arthur" (QPainter)
+    backend renderer.
+
+    The bindings are currently unstable - you can expect substantial
+    change
+    in both source and binary interfaces.
+
+    The Arthur renderer currently does a reasonable job of rendering path
+    and fill, but the image rendering doesn't work (for reasons that
+    aren't
+    clear to me) and text rendering doesn't use the right glyphs - it just
+    draws with the current font. There is a lot of work to do on this
+    too. Help is, of coure, welcome.
+
+ ChangeLog                       |   12 +
+ Makefile.am                     |   10 +-
+ configure.ac                    |   94 ++-
+ poppler-qt4.pc.in               |   12 +
+ poppler/ArthurOutputDev.cc      |  604 +++++++++++++++++++
+ poppler/ArthurOutputDev.h       |  133 +++++
+ poppler/Makefile.am             |   20 +
+ qt4/Makefile.am                 |    1 +
+ qt4/src/Doxyfile                | 1212
+ ++++++++++++++++++++++++++++++++++++++
+ qt4/src/Makefile.am             |   22 +
+ qt4/src/poppler-document.cc     |  309 ++++++++++
+ qt4/src/poppler-page.cc         |  170 ++++++
+ qt4/src/poppler-private.h       |   36 ++
+ qt4/src/poppler-qt4.h           |  286 +++++++++
+ qt4/tests/Makefile.am           |   34 ++
+ qt4/tests/check_orientation.cpp  |   40 ++
+ qt4/tests/stress-poppler-qt4.cpp |   70 +++
+ qt4/tests/test-poppler-qt4.cpp   |  121 ++++
+ 18 files changed, 3183 insertions(+), 3 deletions(-)
+
+commit 61e9bc76eb2fcb0b4b899ebfad1cc71c59fc8274
+Author: Kristian Høgsberg <krh@redhat.com>
+Date:  Tue Jun 28 03:44:12 2005 +0000
+
+    2005-06-27 Kristian Høgsberg  <krh@redhat.com>
+
+           * poppler/CairoOutputDev.cc:
+           * poppler/CairoOutputDev.h: Change CairoOutputDev to render
+           to a
+           given surface and let the user create that surface.
+
+           * glib/poppler-document.cc:
+           * glib/poppler-page.cc:
+           * glib/poppler-private.h: Create the cairo image surface here
+           instead and pass it to the CairoOutputDev for rendering.
+
+           * poppler/CairoOutputDevImage.cc:
+           * poppler/CairoOutputDevImage.h:
+           * poppler/CairoOutputDevX.cc:
+           * poppler/CairoOutputDevX.h:
+           * poppler/Makefile.am: Remove specialized cairo output
+           devices.
+
+ ChangeLog                     |   17 ++++
+ glib/poppler-document.cc      |    2 +-
+ glib/poppler-page.cc          |   21 +++-
+ glib/poppler-private.h                |    4 +-
+ poppler/CairoOutputDev.cc     |   24 ++---
+ poppler/CairoOutputDev.h      |    8 +-
+ poppler/CairoOutputDevImage.cc |   80 ---------------
+ poppler/CairoOutputDevImage.h |   44 --------
+ poppler/CairoOutputDevX.cc    |  216
+ ----------------------------------------
+ poppler/CairoOutputDevX.h     |  117 ----------------------
+ poppler/Makefile.am           |    8 +-
+ 11 files changed, 54 insertions(+), 487 deletions(-)
+
+commit 8079dce3f0ed91dd531465f45c6d3c568ab4ecd1
+Author: Kristian Høgsberg <krh@redhat.com>
+Date:  Mon Jun 27 01:04:32 2005 +0000
+
+    2005-06-26 Kristian Høgsberg  <krh@redhat.com>
+
+           * poppler/CairoOutputDev.cc:
+           * poppler/CairoOutputDev.h: Switch back to using drawChar()
+           for
+           text, but utilize the beginString() and endString() hooks
+           so we
+           can use cairo_show_glyphs() efficiently.
+
+ ChangeLog                |    7 +++
+ poppler/CairoOutputDev.cc |  107
+ +++++++++++++--------------------------------
+ poppler/CairoOutputDev.h  |   12 ++++-
+ 3 files changed, 48 insertions(+), 78 deletions(-)
+
+commit 1aa48d6b7907a1d53830f0cf28085041f685368d
+Author: Albert Astals Cid <aacid@kde.org>
+Date:  Sun Jun 26 23:35:26 2005 +0000
+
+    Add PageTransition class and PageTransition* Page::getTransition()
+    const; to the qt frontend. Code almost 100% copied from xpdf code
+    inside kpdf
+
+ ChangeLog         |    5 +++
+ qt/poppler-page.cc |  121
+ ++++++++++++++++++++++++++++++++++++++++++++++++++++
+ qt/poppler-qt.h    |  78 +++++++++++++++++++++++++++++++++
+ 3 files changed, 204 insertions(+)
+
+commit 9d4327eecd94299a3629b0814e84f981a4be1dfb
+Author: Martin Kretzschmar <martink@gnome.org>
+Date:  Sun Jun 26 15:54:16 2005 +0000
+
+    add poppler-enums.[ch].
+
+ ChangeLog      |    2 ++
+ glib/.cvsignore |    8 +++++---
+ 2 files changed, 7 insertions(+), 3 deletions(-)
+
+commit 768186514b9fc175cf330344408bb89ab4c909f3
+Author: Martin Kretzschmar <martink@gnome.org>
+Date:  Sun Jun 26 11:40:35 2005 +0000
+
+    require glib 2.4+ for g_value_take_string and G_DEFINE_TYPE.
+
+ ChangeLog    |    5 +++++
+ configure.ac |    4 ++--
+ 2 files changed, 7 insertions(+), 2 deletions(-)
+
+commit 5d40e34a367212c39af06332879f26824d6d62d2
+Author: Jeff Muizelaar <jeff@infidigm.net>
+Date:  Sun Jun 26 00:01:39 2005 +0000
+
+    2005-06-25 Jeff Muizelaar  <jeff@infidigm.net>
+
+       * poppler/Error.h: Maybe fix build on Solaris.
+
+ ChangeLog      |    4 ++++
+ poppler/Error.h |    2 +-
+ 2 files changed, 5 insertions(+), 1 deletion(-)
+
+commit c2780a3b3f4615bb28bfe394d649b388db4ccf4d
+Author: Kristian Høgsberg <krh@redhat.com>
+Date:  Mon Jun 20 21:33:09 2005 +0000
+
+    2005-06-20 Kristian Høgsberg  <krh@redhat.com>
+
+           * NEWS:
+           * configure.ac: Bump version to 0.3.3 and sum up changes since
+           last release.
+
+           * glib/poppler-page.cc (poppler_page_find_text): Initialize
+           xMin
+           and yMin to avoid referencing unintialized memory (#3582).
+
+ ChangeLog           |    9 +++++++++
+ NEWS                |   10 ++++++++++
+ configure.ac        |    2 +-
+ glib/poppler-page.cc |    2 ++
+ 4 files changed, 22 insertions(+), 1 deletion(-)
+
+commit 9023891f314ac37811b5c973be2e36b6de353cf2
+Author: Martin Kretzschmar <martink@gnome.org>
+Date:  Mon Jun 20 18:45:41 2005 +0000
+
+    (info_dict_get_string): convert from PDFDocEncoding to UTF-8.
+
+ ChangeLog               |    5 +++++
+ glib/poppler-document.cc |   16 +++++++++++++++-
+ 2 files changed, 20 insertions(+), 1 deletion(-)
+
+commit bbf2fe757f0fd08d0e90e3810709ab7152c779c0
+Author: Kristian Høgsberg <krh@redhat.com>
+Date:  Mon Jun 20 17:58:38 2005 +0000
+
+    2005-06-20 Kristian Høgsberg  <krh@redhat.com>
+
+           * glib/poppler-page.cc:
+           * glib/poppler-page.h:
+           * glib/poppler.h: Clean up glib rotation implementation and
+           add a
+           getter for rotation.  Patch from Marco.
+
+ ChangeLog           |    7 +++++
+ glib/poppler-page.cc |   69
+ ++++++++++++++++++++++++++++----------------------
+ glib/poppler-page.h  |   57 +++++++++++++++++++++--------------------
+ glib/poppler.h       |    1 -
+ 4 files changed, 75 insertions(+), 59 deletions(-)
+
+commit c264d8a9f84587cd0f2ef67683a01fc8dd9395af
+Author: Kristian Høgsberg <krh@redhat.com>
+Date:  Mon Jun 20 17:38:27 2005 +0000
+
+    2005-06-20 Kristian Høgsberg  <krh@redhat.com>
+
+           * glib/poppler-document.cc:
+           * poppler/FontInfo.cc: Fixes from Marco to handle fonts
+           without
+           name (typically type 3 fonts) and fix an iterator bug.
+
+ ChangeLog               |    6 ++++++
+ glib/poppler-document.cc |    8 +++++++-
+ poppler/FontInfo.cc     |   13 ++++++++++---
+ 3 files changed, 23 insertions(+), 4 deletions(-)
+
+commit 4746e63a793a2881e904ac54d58b7d3e48b07dcf
+Author: Kristian Høgsberg <krh@redhat.com>
+Date:  Mon Jun 20 17:22:35 2005 +0000
+
+    2005-06-20 Kristian Høgsberg  <krh@redhat.com>
+
+           * glib/poppler-page.cc (poppler_page_get_link_mapping): Adjust
+           link coordinates so they're relative to bounding box
+           lower left
+           corner (#3396).
+
+ ChangeLog           |    6 ++++++
+ glib/poppler-page.cc |    6 ++++++
+ 2 files changed, 12 insertions(+)
+
+commit bada3d03583ef6ed34d2aa743de8fd9ca4a5c748
+Author: Kristian Høgsberg <krh@redhat.com>
+Date:  Fri Jun 17 05:30:56 2005 +0000
+
+    2005-06-17 Kristian Høgsberg  <krh@redhat.com>
+
+           * autogen.sh: Patch from Emil Soleyman-Zomalan to enable
+           checks
+           for automake >= 1.7 (#3554).
+
+ ChangeLog  |   5 +++
+ autogen.sh |  104
+ ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+ 2 files changed, 109 insertions(+)
+
+commit 25db42831ddde500697126352458e092a9b0ab9b
+Author: Kristian Høgsberg <krh@redhat.com>
+Date:  Wed Jun 15 15:02:46 2005 +0000
+
+    2005-06-15 Kristian Høgsberg  <krh@redhat.com>
+
+           * glib/poppler-document.cc:
+           * glib/poppler-document.h: Patch from Marco to get initial
+           status
+           (open or closed) for bookmark subtrees.
+    -----------------------------------------------------------
+
+ ChangeLog               |    6 ++++++
+ glib/poppler-document.cc |    9 +++++++++
+ glib/poppler-document.h  |    1 +
+ 3 files changed, 16 insertions(+)
+
+commit e54e306ac5d603001fefda3b9ecd81821e4bd09e
+Author: Kristian Høgsberg <krh@redhat.com>
+Date:  Mon Jun 13 17:18:32 2005 +0000
+
+    Forgot to add new files.
+
+ poppler/FontInfo.cc | 197
+ +++++++++++++++++++++++++++++++++++++++++++++++++++
+ poppler/FontInfo.h  |  51 +++++++++++++
+ 2 files changed, 248 insertions(+)
+
+commit 23e8ed5cbf4d7d999a8a1dcf714aaddaf339ceff
+Author: Kristian Høgsberg <krh@redhat.com>
+Date:  Mon Jun 13 16:09:33 2005 +0000
+
+    2005-06-13 Kristian Høgsberg  <krh@redhat.com>
+
+           * glib/poppler-document.cc:
+           * glib/poppler-document.h:
+           * glib/poppler-private.h:
+           * glib/poppler.h:
+           * glib/test-poppler-glib.c:
+           * poppler/Makefile.am: Patch from Marco to extract font
+           info from
+           document.
+
+ ChangeLog               |   10 ++++
+ glib/poppler-document.cc |  131
+ ++++++++++++++++++++++++++++++++++++++++++++++
+ glib/poppler-document.h  |   13 +++++
+ glib/poppler-private.h   |    7 +++
+ glib/poppler.h                  |    2 +
+ glib/test-poppler-glib.c |   14 +++++
+ poppler/Makefile.am     |    2 +
+ 7 files changed, 179 insertions(+)
+
+commit fbb86d2983a28ad2c46b8c5d475a2df1f0f0e4b9
+Author: Kristian Høgsberg <krh@redhat.com>
+Date:  Wed Jun 8 14:35:46 2005 +0000
+
+    2005-06-08 Kristian Høgsberg  <krh@redhat.com>
+
+           * poppler/CairoFontEngine.cc: Remember to delete tmpFileName.
+           Patch from Nikolai Weibull (#3491).
+
+ ChangeLog                 |    5 +++++
+ poppler/CairoFontEngine.cc |  37 +++++++++++++++++++------------------
+ 2 files changed, 24 insertions(+), 18 deletions(-)
+
+commit 699b03025c1d38a42a49e39017097c5d0315fd6f
+Author: Kristian Høgsberg <krh@redhat.com>
+Date:  Tue Jun 7 20:25:48 2005 +0000
+
+    2005-06-07 Kristian Høgsberg  <krh@redhat.com>
+
+           * qt/test-poppler-qt.cpp: Add stdlib.h include for exit().
+
+ ChangeLog             |    4 ++++
+ qt/test-poppler-qt.cpp |    1 +
+ 2 files changed, 5 insertions(+)
+
+commit 0017b1a72c58e2d016d22451079c466abdfff15c
+Author: Kristian Høgsberg <krh@redhat.com>
+Date:  Thu Jun 2 19:14:45 2005 +0000
+
+    2005-06-02 Kristian Høgsberg  <krh@redhat.com>
+
+           * poppler/TextOutputDev.h:
+           * qt/poppler-qt.h: Patch from Stanislav Brabec
+           <sbrabec@suse.cz>
+           to fix gcc 4.0.1 warnings on undeclared friend classes.
+
+           * test/gtk-splash-test.cc: Fix from Martin Kretzschmar
+           <martink@gnome.org> to compile with OPI enabled (#2911).
+
+ ChangeLog              |    9 +++++++++
+ poppler/TextOutputDev.h |    3 +++
+ qt/poppler-qt.h        |    2 ++
+ test/gtk-splash-test.cc |    2 +-
+ 4 files changed, 15 insertions(+), 1 deletion(-)
+
+commit 47c3b4ec2c7691e44f5100b1f5956df0005467c8
+Author: Kristian Høgsberg <krh@redhat.com>
+Date:  Thu Jun 2 18:49:55 2005 +0000
+
+    2005-06-02 Kristian Høgsberg  <krh@redhat.com>
+
+           Patch from Stanislav Brabec <sbrabec@suse.cz>:
+
+           * configure.ac:
+           * poppler-cairo.pc.in:
+           * poppler-glib.pc.in:
+           * poppler-qt.pc.in:
+           * poppler-splash.pc.in: Misc fixes to pkg-config files.
+
+ ChangeLog           |   10 ++++++++++
+ configure.ac        |    6 ++++--
+ poppler-cairo.pc.in  |    3 +--
+ poppler-glib.pc.in   |    4 ++--
+ poppler-qt.pc.in     |    1 +
+ poppler-splash.pc.in |    3 +--
+ 6 files changed, 19 insertions(+), 8 deletions(-)
+
+commit 9f0da96dd005defd5d82dd05b627ff1925430215
+Author: Jeff Muizelaar <jeff@infidigm.net>
+Date:  Thu Jun 2 00:35:44 2005 +0000
+
+    2005-06-01 Jeff Muizelaar  <jeff@infidigm.net>
+
+       * poppler/Error.cc:
+       * poppler/Error.h: Make error handling function setable through
+       setErrorFunction.
+
+       Based on a patch by Albert Astals Cid.
+
+ ChangeLog       |    8 ++++++++
+ poppler/Error.cc |   29 ++++++++++++++++++++---------
+ poppler/Error.h  |    2 ++
+ 3 files changed, 30 insertions(+), 9 deletions(-)
+
+commit f688aa11d066f1c6f4115cbdb604ac61fb8b5146
+Author: Kristian Høgsberg <krh@redhat.com>
+Date:  Sun May 29 14:59:34 2005 +0000
+
+    2005-05-29 Kristian Høgsberg  <krh@redhat.com>
+
+           * glib/*: Add more meta data properties to poppler document.
+           Patch by Emil Soleyman-Zomalan (#3359).
+
+ ChangeLog               |    5 ++
+ glib/poppler-document.cc |  155
+ +++++++++++++++++++++++++++++++++++++++++++++-
+ glib/poppler.gidl       |    5 ++
+ glib/test-poppler-glib.c |   46 +++++++++-----
+ 4 files changed, 194 insertions(+), 17 deletions(-)
+
+commit 9e6eeec574d48d2341ee620e16360d3b21c40103
+Author: Kristian Høgsberg <krh@redhat.com>
+Date:  Thu May 26 13:03:35 2005 +0000
+
+    2005-05-26 Kristian Høgsberg  <krh@redhat.com>
+
+           * poppler/CairoOutputDev.cc (clip): Remove snapToGrid
+           so clip()
+           prototype matches what Gfx actually calls (fixes clipping).
+
+           * poppler/CairoOutputDev.cc: Update fill color, stroke
+           color, fill
+           opacity and stroke opacity from GfxState on restore,
+           since they
+           aren't handled by cairo_restore() (#3362).
+
+           * poppler/CairoOutputDev.cc: Comment out tolerance setting
+           until
+           we figure out how cairo settings relate to pdf settings.
+
+           * poppler/CairoOutputDev.cc: Support fill and stroke opacity.
+
+ ChangeLog                |   12 ++++++++++++
+ poppler/CairoOutputDev.cc |   41
+ ++++++++++++++++++++++++++++++-----------
+ poppler/CairoOutputDev.h  |   6 +++++-
+ 3 files changed, 47 insertions(+), 12 deletions(-)
+
+commit 89a633edd860e3c6ded1e468edf6f28cfcb43d0e
+Author: Kristian Høgsberg <krh@redhat.com>
+Date:  Thu May 26 12:52:38 2005 +0000
+
+    2005-05-26 Kristian Høgsberg  <krh@redhat.com>
+
+           * poppler/GfxState.cc:
+           * poppler/GfxState.h: Add GfxColorSpace::getRGBLine here and
+           implement in subclasses.
+
+           * poppler/CairoOutputDev.cc (drawImage): Use getRGBLine here.
+
+ ChangeLog                |    8 +++
+ poppler/CairoOutputDev.cc |   66 +++++++++----------
+ poppler/GfxState.cc      |  160
+ ++++++++++++++++++++++++++++++++++++++++++++-
+ poppler/GfxState.h       |   14 ++++
+ 4 files changed, 212 insertions(+), 36 deletions(-)
+
+commit 4d8224819da7a85e4d99f96c9bbb047ece58130a
+Author: Jonathan Blandford <jrb@redhat.com>
+Date:  Mon May 23 04:23:53 2005 +0000
+
+    Mon May 23 00:22:41 2005  Jonathan Blandford  <jrb@redhat.com>
+
+           * glib/poppler-document.h: Add a permissions flag to the glib
+           bindings.
+
+ ChangeLog               |    5 +++++
+ glib/poppler-document.cc |   24 ++++++++++++++++++++++++
+ glib/poppler-document.h  |   16 +++++++++-------
+ 3 files changed, 38 insertions(+), 7 deletions(-)
+
+commit 1f677e2f60634a7d0c5e0e0d2125ab15c2722979
+Author: Kristian Høgsberg <krh@redhat.com>
+Date:  Sat May 21 21:33:06 2005 +0000
+
+    2005-05-21 Kristian Høgsberg  <krh@redhat.com>
+
+           * glib/poppler-document.cc (poppler_ps_file_new): Fix
+           off-by-one
+           error spotted by Jürg Billeter.
+    -----------------------------------------------------
+
+ ChangeLog               |    5 +++++
+ glib/poppler-document.cc |    2 +-
+ 2 files changed, 6 insertions(+), 1 deletion(-)
+
+commit 0bbf2f08173866cde9b097eeeb1f4218a396588d
+Author: Kristian Høgsberg <krh@redhat.com>
+Date:  Fri May 20 20:48:52 2005 +0000
+
+    2005-05-20 Kristian Høgsberg  <krh@redhat.com>
+
+           * poppler/CairoOutputDev.cc: Account for different row
+           vs. column
+           vector conventions between cairo and poppler.
+
+ ChangeLog                |    3 +++
+ poppler/CairoOutputDev.cc |   18 +++++++++---------
+ 2 files changed, 12 insertions(+), 9 deletions(-)
+
+commit da44ec7e8de58e55e55b1f780bc3f4bc8307874f
+Author: Kristian Høgsberg <krh@redhat.com>
+Date:  Fri May 20 18:38:10 2005 +0000
+
+    2005-05-20 Kristian Høgsberg  <krh@redhat.com>
+
+           * poppler/CairoFontEngine.cc: Only get the code to gid map if
+           we're using freetype 2.1.7 or older (#3340).
+
+ ChangeLog                 |    5 +++++
+ poppler/CairoFontEngine.cc |  13 ++++++++-----
+ 2 files changed, 13 insertions(+), 5 deletions(-)
+
+commit 6fe29cf0a7e54b8d294471a0f94eb9e989ad1d7f
+Author: Kristian Høgsberg <krh@redhat.com>
+Date:  Thu May 19 05:18:04 2005 +0000
+
+    Add bugzilla number.
+
+ ChangeLog |   2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 42de1348622cf86a87bc22941bd48bffa943dac9
+Author: Kristian Høgsberg <krh@redhat.com>
+Date:  Thu May 19 05:16:22 2005 +0000
+
+    2005-05-19 Kristian Høgsberg  <krh@redhat.com>
+
+           * poppler/CairoFontEngine.cc: Only cast to Gfx8BitFont when we
+           know for sure we have a truetype font.
+           GfxCIDFont::getCIDToGIDLen() can return 0 in which case
+           codeToGID
+           will be NULL, and we end up casting it to a Gfx8BitFont.
+
+ ChangeLog                 |    7 +++++++
+ poppler/CairoFontEngine.cc |   2 +-
+ 2 files changed, 8 insertions(+), 1 deletion(-)
+
+commit afc05387c94a76ff0ed69b3f5d9a69ddd1448e83
+Author: Kristian Høgsberg <krh@redhat.com>
+Date:  Wed May 18 17:39:59 2005 +0000
+
+    2005-05-18 Kristian Høgsberg  <krh@redhat.com>
+
+           * configure.ac: Require cairo 0.5.0, bump release to 0.3.2.
+
+           * NEWS: Sum up latest changes.
+
+           * glib/poppler-document.cc (poppler_ps_file_new): Take a page
+           range here instead of just number of pages.
+
+ ChangeLog               |    9 +++++++++
+ NEWS                    |    7 +++++++
+ configure.ac            |    6 +++---
+ glib/poppler-document.cc |   15 ++++++++++-----
+ glib/poppler-document.h  |    1 +
+ 5 files changed, 30 insertions(+), 8 deletions(-)
+
+commit 420134a194af9161282ccfe329d17adef8d325f2
+Author: Kristian Høgsberg <krh@redhat.com>
+Date:  Tue May 17 23:38:27 2005 +0000
+
+    2005-05-17 Kristian Høgsberg  <krh@redhat.com>
+
+           * poppler/CairoOutputDevX.cc:
+           * test/gtk-cairo-test.cc: Chase the cairo xlib constructor
+           again.
+
+ ChangeLog                 |    5 +++++
+ poppler/CairoOutputDevX.cc |   5 +++--
+ test/gtk-cairo-test.cc     |   5 +++--
+ 3 files changed, 11 insertions(+), 4 deletions(-)
+
+commit 6fd62953a910dcfb4abd9de5ea18285b8fa5d202
+Author: Kristian Høgsberg <krh@redhat.com>
+Date:  Mon May 16 23:16:15 2005 +0000
+
+    Add bug number and attribution to ChangeLog entry.
+
+ ChangeLog |   4 ++++
+ 1 file changed, 4 insertions(+)
+
+commit 6d7f624c13e8a9a8251ac97388cd80e418c70250
+Author: Kristian Høgsberg <krh@redhat.com>
+Date:  Mon May 16 21:56:31 2005 +0000
+
+    2005-05-16 Kristian Høgsberg  <krh@redhat.com>
+
+           * configure.ac: Check for glib-mkenums.
+
+           * glib/Makefile.am (poppler-enums.h): Generate glib enums at
+           compile time.
+
+           * glib/poppler-enums.c:
+           * glib/poppler-enums.h: Removed.
+
+ ChangeLog           |    8 +++
+ configure.ac        |    3 +
+ glib/.cvsignore      |    1 +
+ glib/Makefile.am     |   67 ++++++++++++------
+ glib/poppler-enums.c |  189
+ --------------------------------------------------
+ glib/poppler-enums.h |   49 -------------
+ 6 files changed, 57 insertions(+), 260 deletions(-)
+
+commit 2801b54a944fc9e1072c5dcb9f1153a0c9f42de5
+Author: Kristian Høgsberg <krh@redhat.com>
+Date:  Mon May 16 20:27:51 2005 +0000
+
+    2005-05-16 Kristian Høgsberg  <krh@redhat.com>
+
+           * test/gtk-cairo-test.cc: Update this test case also.
+
+ ChangeLog             |    2 ++
+ test/gtk-cairo-test.cc |    5 +++--
+ 2 files changed, 5 insertions(+), 2 deletions(-)
+
+commit 8753ae8ba20fcceaef3ef1dda89129f0456fccf6
+Author: Kristian Høgsberg <krh@redhat.com>
+Date:  Mon May 16 19:06:00 2005 +0000
+
+    2005-05-16 Kristian Høgsberg  <krh@redhat.com>
+
+           * poppler/CairoOutputDevX.cc: Track changes to cairo Xlib
+           surface
+           constructors.
+
+           * poppler/CairoFontEngine.cc (cairo_font_face_destroy):
+           Make this
+           static.
+
+ ChangeLog                 |    8 ++++++++
+ poppler/CairoFontEngine.cc |   2 +-
+ poppler/CairoOutputDevX.cc |   5 +++--
+ 3 files changed, 12 insertions(+), 3 deletions(-)
+
+commit 2e17106ef4711097104a561d5be49980f8b2f5ab
+Author: Jonathan Blandford <jrb@redhat.com>
+Date:  Fri May 13 03:47:36 2005 +0000
+
+    whoops!  commit the right file.
+
+ glib/poppler.gidl |  212
+ +++++++++++++++++++++++++++++++++++++++++++++++++++++
+ glib/test.gidl    |   23 ------
+ 2 files changed, 212 insertions(+), 23 deletions(-)
+
+commit 19b62e1c8ea8ce042ac089defe94f756dcaf194e
+Author: Jonathan Blandford <jrb@redhat.com>
+Date:  Fri May 13 03:25:32 2005 +0000
+
+    Thu May 12 23:10:45 2005  Jonathan Blandford  <jrb@redhat.com>
+
+           * glib/poppler.gidl: add metadata file.
+
+ ChangeLog     |    4 ++++
+ glib/test.gidl |   23 +++++++++++++++++++++++
+ 2 files changed, 27 insertions(+)
+
+commit bef5a548f3b21e7220079155e9b5054fb0c6c3c7
+Author: Kristian Høgsberg <krh@redhat.com>
+Date:  Thu May 12 21:26:25 2005 +0000
+
+    2005-05-12 Kristian Høgsberg  <krh@redhat.com>
+
+           * poppler/CairoOutputDev.cc:
+           * poppler/CairoOutputDevX.cc:
+           * poppler/CairoOutputDevImage.cc:
+           * test/gtk-cairo-test.cc: Update to latest cairo changes,
+           patch
+           from Jens Taprogge (#3281)
+
+ ChangeLog                     |    8 ++++++++
+ poppler/CairoOutputDev.cc     |   22 +++++++++++-----------
+ poppler/CairoOutputDevImage.cc |   11 ++++++-----
+ poppler/CairoOutputDevX.cc    |    7 +++++--
+ test/gtk-cairo-test.cc                |    8 +++++---
+ 5 files changed, 35 insertions(+), 21 deletions(-)
+
+commit c10ea2dd9bffaf9af023612ef196bab2b204d3e1
+Author: Kristian Høgsberg <krh@redhat.com>
+Date:  Wed May 11 20:01:43 2005 +0000
+
+    2005-05-11 Kristian Høgsberg  <krh@redhat.com>
+
+           * glib/poppler.cc (poppler_get_backend, poppler_get_version):
+           Add
+           these functions so it's easy to tell if poppler is using
+           cairo or
+           splash and what version.
+
+           * glib/test-poppler-glib.c (main): Print out version and
+           backend.
+
+ ChangeLog               |    8 ++++++++
+ glib/poppler-enums.c    |   26 ++++++++++++++++++++++++++
+ glib/poppler-enums.h    |   15 +++++++++++++++
+ glib/poppler.cc         |   21 +++++++++++++++++++++
+ glib/poppler.h                  |   11 +++++++++++
+ glib/test-poppler-glib.c |    9 ++++++++-
+ 6 files changed, 89 insertions(+), 1 deletion(-)
+
+commit 7d189e33cfa68e722561e9398ad85a77b538ab14
+Author: Kristian Høgsberg <krh@redhat.com>
+Date:  Fri May 6 16:38:57 2005 +0000
+
+    2005-05-06 Kristian Høgsberg  <krh@redhat.com>
+
+           * glib/Makefile.am (libpoppler_glib_la_LIBADD): Link
+           poppler-glib
+           against poppler.
+
+           * qt/Makefile.am (libpoppler_qt_la_LIBADD): Ditto for qt.
+
+           * poppler-glib.pc (Libs): Drop -lpoppler from link.
+
+           * poppler-qt.pc (Libs): Ditto for qt.
+
+           * configure.ac: Test for both libqt-mt.la and libqt-mt.so
+           in that
+           order.
+
+ ChangeLog             |   14 ++++++++++++++
+ configure.ac          |    8 +++++++-
+ glib/Makefile.am      |    1 +
+ poppler-glib.pc.in    |    2 +-
+ poppler-qt.pc.in      |    2 +-
+ qt/Makefile.am                |    1 +
+ qt/test-poppler-qt.cpp |    1 +
+ 7 files changed, 26 insertions(+), 3 deletions(-)
+
+commit c937e63f17a096b94a554103476ecb9ab1b71b90
+Author: Kristian Høgsberg <krh@redhat.com>
+Date:  Wed May 4 20:08:41 2005 +0000
+
+    2005-05-04 Kristian Høgsberg  <krh@redhat.com>
+
+           * poppler/CairoOutputDev.cc (CairoOutputDev::drawImageMask,
+           CairoOutputDev::drawImage): Track cairo cvs API changes; use
+           cairo_mask() and cairo_paint() for drawing image masks
+           and images.
+
+ ChangeLog                |    6 +++
+ poppler/CairoOutputDev.cc |   98
+ +++++++++++++++++++++++----------------------
+ 2 files changed, 57 insertions(+), 47 deletions(-)
+
+commit c142773ad30b409d8169a53921e731305de46e50
+Author: Kristian Høgsberg <krh@redhat.com>
+Date:  Wed May 4 19:28:07 2005 +0000
+
+    2005-05-04 Kristian Høgsberg  <krh@redhat.com>
+
+           * poppler/CairoOutputDev.cc: Fix matrix convention confusion.
+
+ ChangeLog                |    4 ++++
+ poppler/CairoOutputDev.cc |   4 ++--
+ 2 files changed, 6 insertions(+), 2 deletions(-)
+
+commit 28760927d724231d0137ca7ecc66c6c2250dff0d
+Author: Kristian Høgsberg <krh@redhat.com>
+Date:  Wed May 4 19:11:11 2005 +0000
+
+    2005-05-04 Kristian Høgsberg  <krh@redhat.com>
+
+           Patches from Albert Astals Cid:
+
+           * qt/poppler-page.cc (getText): Use QString::fromUtf8()
+           instead of
+           implicit latin1 cast constructor.
+
+           * qt/test-poppler-qt.cpp (main): Use a QLabel for showing text
+           instead of qDebug.
+
+ ChangeLog             |   10 ++++++++++
+ qt/poppler-page.cc    |    5 ++---
+ qt/test-poppler-qt.cpp |    6 +++++-
+ 3 files changed, 17 insertions(+), 4 deletions(-)
+
+commit fd36522375bcf436639b8731acb3ad22c03c03f4
+Author: Jonathan Blandford <jrb@redhat.com>
+Date:  Wed May 4 06:32:38 2005 +0000
+
+    Wed May  4 02:31:05 2005  Jonathan Blandford  <jrb@redhat.com>
+
+           * glib/poppler-document.cc:
+           * glib/poppler-document.h:
+           * glib/poppler-enums.c: (poppler_permissions_get_type):
+           * glib/poppler-enums.h:
+           * glib/poppler-page.cc:
+           * glib/poppler-page.h:
+           * glib/poppler.h:
+
+           Register a bunch of boxed types to test introspection, and for
+           LBs.  Also, remove unused 'popper_document_save()' (-:
+
+ ChangeLog               |   13 ++++++++
+ glib/poppler-document.cc |   48 ++++++++++++++++-----------
+ glib/poppler-document.h  |   18 ++++++++--
+ glib/poppler-enums.c    |   19 +++++++++++
+ glib/poppler-enums.h    |    2 ++
+ glib/poppler-page.cc    |   83
+ ++++++++++++++++++++++++++++++++++++++++++++++
+ glib/poppler-page.h     |   36 ++++++++++++++------
+ glib/poppler.h                  |   12 ++++---
+ 8 files changed, 193 insertions(+), 38 deletions(-)
+
+commit 132647f8311c07b1f95ee4fca185e9774aae4913
+Author: Kristian Høgsberg <krh@redhat.com>
+Date:  Mon May 2 05:39:11 2005 +0000
+
+    2005-05-01 Kristian Høgsberg  <krh@redhat.com>
+
+           * poppler/CairoFontEngine.cc:
+           * poppler/CairoFontEngine.h:
+           * poppler/CairoOutputDev.cc: Back out workaround for cairo
+           0.4.0
+           font API and port to new cairo head.
+
+ ChangeLog                     |    7 +++++
+ configure.ac                  |    4 +--
+ poppler/CairoFontEngine.cc    |   67
+ ++++++++++++++++------------------------
+ poppler/CairoFontEngine.h     |   12 +++----
+ poppler/CairoOutputDev.cc     |   39 ++++++++++++++---------
+ poppler/CairoOutputDevImage.cc |    2 +-
+ 6 files changed, 66 insertions(+), 65 deletions(-)
+
+commit 595c18c038f8dcef73fe58612fc8b93f891e65a1
+Author: Jeff Muizelaar <jeff@infidigm.net>
+Date:  Mon May 2 00:44:26 2005 +0000
+
+    2005-05-01 Jeff Muizelaar  <jeff@infidigm.net>
+
+       * splash/SplashFTFont.cc (SplashFTFont::getGlyphPath):
+       Use FT_LOAD_NO_BITMAP to make sure we get outlines loaded instead
+       of bitmaps for use in FT_Outline_Decompose.
+
+       Patch from Albert Astals Cid.
+
+ ChangeLog             |    8 ++++++++
+ splash/SplashFTFont.cc |    2 +-
+ 2 files changed, 9 insertions(+), 1 deletion(-)
+
+commit 49d89ca0ed3986bec7468f6c0ed295e84ba67239
+Author: Jeff Muizelaar <jeff@infidigm.net>
+Date:  Sun May 1 21:54:55 2005 +0000
+
+    2005-05-01 Jeff Muizelaar  <jeff@infidigm.net>
+
+       * goo/gmem.c: (gmalloc), (grealloc), (gfree):
+       * goo/gmem.h: make memory functions use size_t instead of int.
+
+       Patch from Takashi Iwai through Albert Astals Cid.
+
+ ChangeLog  |   7 +++++++
+ goo/gmem.c |  10 +++++-----
+ goo/gmem.h |   4 ++--
+ 3 files changed, 14 insertions(+), 7 deletions(-)
+
+commit 14d618bece894e4c6bed0f179a8fda4db5a67c9d
+Author: Jeff Muizelaar <jeff@infidigm.net>
+Date:  Sat Apr 30 19:53:57 2005 +0000
+
+    2005-04-30 Jeff Muizelaar  <jeff@infidigm.net>
+
+       * qt/poppler-document.cc (Document::unlock) :
+       * qt/poppler-qt.h (Document::unlock):
+       Add const to the password argument.
+
+       Patch from Albert Astals Cid.
+
+ ChangeLog             |    8 ++++++++
+ qt/poppler-document.cc |    2 +-
+ qt/poppler-qt.h       |    2 +-
+ 3 files changed, 10 insertions(+), 2 deletions(-)
+
+commit 1e66da32964cc76c6ed3773574f422b4608cb0e1
+Author: Jeff Muizelaar <jeff@infidigm.net>
+Date:  Sat Apr 30 17:31:47 2005 +0000
+
+    2005-04-30 Jeff Muizelaar  <jeff@infidigm.net>
+
+       * fofi/FoFiType1.cc (FoFiType1::parse):
+       Don't assume Encoding array of Type1 fonts end in "foo def".
+       http://partners.adobe.com/public/developer/en/font/T1_SPEC.PDF
+       says
+       "This sequence of assignments must be followed by an instance
+       of the
+       token def or readonly; such a token may not occur within the
+       sequence
+       of assignments." so it must end with "readonly" "def" "readonly
+       def"
+       (That is what most fonts are using and this is why it was not
+       crashing)
+
+       Patch from Albert Astals Cid.
+
+ ChangeLog        |   13 +++++++++++++
+ fofi/FoFiType1.cc |   14 +++++++++++---
+ 2 files changed, 24 insertions(+), 3 deletions(-)
+
+commit 0b532db77ef41937dd5be30d15c96557d81eceb2
+Author: Jonathan Blandford <jrb@redhat.com>
+Date:  Fri Apr 29 19:37:07 2005 +0000
+
+    Fri Apr 29 14:54:44 2005  Jonathan Blandford  <jrb@redhat.com>
+
+           * goo/GooTimer.h: New class to do simple timing checks.
+
+           * glib/poppler-document.c: Patch from Martin Kretzschmar
+           to really
+           set the PDF version correct.  Third time's the charm.
+
+ ChangeLog               |    7 ++++++
+ glib/poppler-document.cc |    4 ++-
+ goo/GooTimer.cc         |   63
+ ++++++++++++++++++++++++++++++++++++++++++++++
+ goo/GooTimer.h                  |   40 +++++++++++++++++++++++++++++
+ goo/Makefile.am         |    2 ++
+ 5 files changed, 115 insertions(+), 1 deletion(-)
+
+commit 38948ea6f9ef76dae9b8a7156fe1ef32a0457380
+Author: Kristian Høgsberg <krh@redhat.com>
+Date:  Fri Apr 29 03:57:16 2005 +0000
+
+    2005-04-29 Kristian Høgsberg  <krh@bitplanet.net>
+
+           * configure.ac: Bump release to 0.3.1.
+
+           * NEWS: Write up news for 0.3.1 release.
+
+ ChangeLog    |    6 ++++++
+ NEWS        |    6 ++++++
+ configure.ac |    2 +-
+ 3 files changed, 13 insertions(+), 1 deletion(-)
+
+commit af65146c92682a3af06e9d3147426445c78309de
+Author: Kristian Høgsberg <krh@redhat.com>
+Date:  Thu Apr 28 23:03:06 2005 +0000
+
+    2005-04-28 Kristian Høgsberg  <krh@redhat.com>
+
+           Patch from Martin Kretzschmar:
+
+           * poppler/GlobalParams.cc: use UTF-8 as the default text
+           encoding.
+           Fixes Bug 2934.
+
+ ChangeLog              |    7 +++++++
+ poppler/GlobalParams.cc |    2 +-
+ 2 files changed, 8 insertions(+), 1 deletion(-)
+
+commit c2db3e1b297a9dc0accd0d8a1366970d45705c8f
+Author: Jeff Muizelaar <jeff@infidigm.net>
+Date:  Wed Apr 27 20:56:18 2005 +0000
+
+    2005-04-27 Jeff Muizelaar  <jeff@infidigm.net>
+
+       * configure.ac:
+       * poppler/FlateStream.cc:
+       * poppler/FlateStream.h:
+       * poppler/Makefile.am:
+       * poppler/Stream.cc:
+       * poppler/Stream.h: Add a reimplementation of FlateStream using
+       zlib.
+
+ ChangeLog             |   10 +++++
+ configure.ac          |   29 +++++++++++++
+ poppler/FlateStream.cc |  107
+ ++++++++++++++++++++++++++++++++++++++++++++++++
+ poppler/FlateStream.h |   68 ++++++++++++++++++++++++++++++
+ poppler/Makefile.am   |   17 +++++++-
+ poppler/Stream.cc     |    6 +++
+ poppler/Stream.h      |    2 +
+ 7 files changed, 237 insertions(+), 2 deletions(-)
+
+commit bc0afe524c2b87af191d83fc9e9bcdc8a6ce4042
+Author: Kristian Høgsberg <krh@redhat.com>
+Date:  Wed Apr 27 18:53:20 2005 +0000
+
+    2005-04-27 Kristian Høgsberg  <krh@redhat.com>
+
+           * poppler/Catalog.cc (NameTree::lookup): Fix bsearch return
+           value
+           NULL check.  Found by Albert Astals Cid.
+
+ ChangeLog         |    5 +++++
+ poppler/Catalog.cc |   8 ++++----
+ 2 files changed, 9 insertions(+), 4 deletions(-)
+
+commit 3c37dc350d54e5a1035aecfba5bfa394f931cf51
+Author: Jonathan Blandford <jrb@redhat.com>
+Date:  Tue Apr 26 17:17:05 2005 +0000
+
+    Tue Apr 26 13:13:42 2005  Jonathan Blandford  <jrb@redhat.com>
+
+           * glib/test-poppler-glib.c (main): add a quick dump-to-text
+           test.
+
+ ChangeLog               |    4 ++++
+ glib/test-poppler-glib.c |   20 ++++++++++++++++++++
+ 2 files changed, 24 insertions(+)
+
+commit 44b800d520f90ffd143255d2c23835ea357c195b
+Author: Kristian Høgsberg <krh@redhat.com>
+Date:  Mon Apr 25 18:04:32 2005 +0000
+
+    Actually commit the qt/Makefile.am change advertised in the ChangeLog.
+
+ qt/Makefile.am |    5 +++--
+ 1 file changed, 3 insertions(+), 2 deletions(-)
+
+commit 437bec03dd2ab3cdf6215f9ad443b7f21ce84e18
+Author: Kristian Høgsberg <krh@redhat.com>
+Date:  Sun Apr 24 19:56:17 2005 +0000
+
+    2005-04-24 Kristian Høgsberg  <krh@redhat.com>
+
+           * qt/Makefile.am (libpoppler_qt_la_SOURCES): Add
+           poppler-private.h
+           to SOURCES.
+
+ ChangeLog |   5 +++++
+ 1 file changed, 5 insertions(+)
+
+commit 9b2b1244ed5f30a99120aaee49c72f7cb6a4f556
+Author: Kristian Høgsberg <krh@redhat.com>
+Date:  Sat Apr 23 20:16:02 2005 +0000
+
+    2005-04-23 Kristian Høgsberg  <krh@redhat.com>
+
+           * poppler/CairoFontEngine.cc: Use the right fileName for
+           loading
+           CID fonts (#3114).
+
+ ChangeLog                 |    5 +++++
+ poppler/CairoFontEngine.cc |  11 +++++++++--
+ 2 files changed, 14 insertions(+), 2 deletions(-)
+
+commit e4516d728a4d1bc85831d5d00b6d6b8d49c79308
+Author: Kristian Høgsberg <krh@redhat.com>
+Date:  Sat Apr 23 00:09:05 2005 +0000
+
+    2005-04-22 Kristian Høgsberg  <krh@redhat.com>
+
+           * configure.ac: Actually commit version number bump.
+
+ ChangeLog    |    4 ++++
+ NEWS        |    2 +-
+ configure.ac |    2 +-
+ 3 files changed, 6 insertions(+), 2 deletions(-)
+
+commit c20448cb26fa1c309d726f272ddf1227f5a0e6ea
+Author: Kristian Høgsberg <krh@redhat.com>
+Date:  Fri Apr 22 17:29:49 2005 +0000
+
+    2005-04-22 Martin Kretzschmar  <martink@gnome.org>
+
+           * poppler/CairoFontEngine.cc: declare matrix variable
+           before the
+           first goto. Fixes build with gcc 3.3.
+
+ ChangeLog                 |    5 +++++
+ poppler/CairoFontEngine.cc |   3 ++-
+ 2 files changed, 7 insertions(+), 1 deletion(-)
+
+commit 42ecccf9b454893797e3d62f0f1c0a3276689e51
+Author: Kristian Høgsberg <krh@redhat.com>
+Date:  Fri Apr 22 04:09:23 2005 +0000
+
+    Fri Apr 22 00:01:40 2005  Kristian Høgsberg  <krh@redhat.com>
+
+           * poppler/CairoFontEngine.cc: Hack around semi-broken
+           cairo-0.4.0
+           font API to fix the problem where some glyphs would show up
+           at the
+           wrong sizes.  We now create an FT_Face for each size and font
+           combination we encounter, since an FT_Face can't be shared
+           between
+           several cairo_font_t.
+
+ ChangeLog                 |    8 +++++
+ poppler/CairoFontEngine.cc |  79
+ ++++++++++++++++++++------------------------
+ poppler/CairoFontEngine.h  |  23 +++++--------
+ poppler/CairoOutputDev.cc  |  18 +++++-----
+ 4 files changed, 61 insertions(+), 67 deletions(-)
+
+commit 7a703616d9497eba4d7d318da9918dae9cbe8f12
+Author: Kristian Høgsberg <krh@redhat.com>
+Date:  Thu Apr 21 19:50:45 2005 +0000
+
+    Thu Apr 21 15:43:52 2005  Kristian Høgsberg  <krh@redhat.com>
+
+           * poppler/Outline.cc:
+           * poppler/Outline.h: Implement the documented behaviour for
+           Outline::getItems() and OutlineItem::getKids() and make
+           documentation more precise (Patch from Marco).
+
+ ChangeLog         |    7 +++++++
+ poppler/Outline.cc |   6 ++++++
+ poppler/Outline.h  |   7 ++++---
+ 3 files changed, 17 insertions(+), 3 deletions(-)
+
+commit 5c89902c5ee2cf13536225c141768b29505815ce
+Author: Kristian Høgsberg <krh@redhat.com>
+Date:  Thu Apr 21 06:35:33 2005 +0000
+
+    Thu Apr 21 02:25:20 2005  Kristian Høgsberg  <krh@redhat.com>
+
+           * poppler/CairoFontEngine.cc (CairoFont::getFont): Cache
+           cairo_font_t's for a given CairoFont.  With this patch
+           cairo will
+           recognize glyphs coming from the same font as such and
+           the glyph
+           cache will actually work.
+
+           * glib/poppler-document.cc (poppler_document_new_from_file):
+           Add
+           output device (cairo or splash) to PopplerDocument and
+           initialize
+           it in the constructor.
+
+           * glib/poppler-page.cc (splash_render_to_pixbuf,
+           cairo_render_to_pixbuf): Use output device from associated
+           poppler
+           document instead of creating a new one.
+
+           * poppler-glib.pc.in (Requires): Add Requires: field.
+
+           * poppler/Page.cc (loadThumb): Remove unecessary and buggy
+           call to
+           Stream::addFilters(), reported by Ryan Lortie (#3046).
+
+ ChangeLog                 |    7 ++++++-
+ NEWS                      |   12 +++---------
+ poppler/CairoFontEngine.cc |  45
+ ++++++++++++++++++++++++++++++++++++++------
+ poppler/CairoFontEngine.h  |   9 ++++++++-
+ poppler/CairoOutputDev.cc  |   9 +--------
+ 5 files changed, 57 insertions(+), 25 deletions(-)
+
+commit 71c1563bb0462154cb7caa4356d8f8d049073ac4
+Author: Kristian Høgsberg <krh@redhat.com>
+Date:  Thu Apr 21 05:20:24 2005 +0000
+
+    Thu Apr 21 00:15:30 2005  Kristian Høgsberg  <krh@redhat.com>
+
+           * glib/poppler-document.cc (poppler_document_new_from_file):
+           Add
+           output device (cairo or splash) to PopplerDocument and
+           initialize
+           it in the constructor.
+
+           * glib/poppler-page.cc (splash_render_to_pixbuf,
+           cairo_render_to_pixbuf): Use output device from associated
+           poppler
+           document instead of creating a new one.
+
+           * poppler-glib.pc.in (Requires): Add Requires: field.
+
+           * poppler/Page.cc (loadThumb): Remove unecessary and buggy
+           call to
+           Stream::addFilters(), reported by Ryan Lortie (#3046).
+
+ ChangeLog                 |   15 +++++++++++++++
+ NEWS                      |   15 +++++++++++++++
+ glib/poppler-document.cc   |  10 ++++++++++
+ glib/poppler-page.cc      |   22 ++--------------------
+ glib/poppler-private.h     |  13 +++++++++++++
+ poppler-glib.pc.in        |    1 +
+ poppler/CairoFontEngine.cc |   2 +-
+ poppler/Page.cc           |    2 --
+ 8 files changed, 57 insertions(+), 23 deletions(-)
+
+commit c6328cbc6cea05890b52a8302f8deba443959c03
+Author: Jeff Muizelaar <jeff@infidigm.net>
+Date:  Wed Apr 20 22:48:52 2005 +0000
+
+    2005-04-13 Jeff Muizelaar  <jrmuizel@nit.ca>
+
+       * qt/poppler-page.cc (Page::getText):
+       * qt/poppler-qt.h: add a getText method for getting
+       the text on a page
+
+       * qt/test-poppler-qt.c (PDFDisplay::PDFDisplay):
+       add the option to display the text on a page
+
+       Patch from Albert Astals Cid.
+
+ ChangeLog             |   11 +++++++++++
+ qt/poppler-page.cc    |   37 +++++++++++++++++++++++++++++++++++++
+ qt/poppler-qt.h       |   20 ++++++++++++++++++++
+ qt/test-poppler-qt.cpp |   40 ++++++++++++++++++++++++++++++----------
+ 4 files changed, 98 insertions(+), 10 deletions(-)
+
+commit 86a32b65100a5baedd18ce0135703289839a317c
+Author: Jonathan Blandford <jrb@redhat.com>
+Date:  Tue Apr 19 21:22:26 2005 +0000
+
+    Tue Apr 19 17:21:19 2005  Jonathan Blandford  <jrb@redhat.com>
+
+           * glib/poppler-document.cc (poppler_document_get_property):
+           Use
+           %.2g instead.
+
+ ChangeLog               |    5 +++++
+ glib/poppler-document.cc |    2 +-
+ 2 files changed, 6 insertions(+), 1 deletion(-)
+
+commit 4e81624dcc2d5218f2f8bb4eaa992e724014a853
+Author: Jonathan Blandford <jrb@redhat.com>
+Date:  Tue Apr 19 21:13:22 2005 +0000
+
+    Tue Apr 19 17:11:52 2005  Jonathan Blandford  <jrb@redhat.com>
+
+           * glib/poppler-document.cc (poppler_document_get_property):
+           Use %g
+           instead of %f to avoid versioning like PDF-1.50000
+
+ ChangeLog               |    5 +++++
+ glib/poppler-document.cc |    2 +-
+ 2 files changed, 6 insertions(+), 1 deletion(-)
+
+commit 6ef9d30f06be2bd8a9e1470d70f49843a7e432ac
+Author: Kristian Høgsberg <krh@redhat.com>
+Date:  Tue Apr 19 19:48:49 2005 +0000
+
+    Tue Apr 19 15:43:35 2005  Kristian Høgsberg  <krh@redhat.com>
+
+           * glib/poppler-action.cc (_poppler_action_new): Handle
+           NULL links
+           gracefully (fix from Jeff).
+
+ ChangeLog             |    5 +++++
+ glib/poppler-action.cc |    7 ++++++-
+ 2 files changed, 11 insertions(+), 1 deletion(-)
+
+commit 770b7310ce8b07f95960c2014bf3f6040c060ac4
+Author: Kristian Høgsberg <krh@redhat.com>
+Date:  Tue Apr 19 04:28:15 2005 +0000
+
+    Tue Apr 19 00:20:08 2005  Kristian Høgsberg  <krh@redhat.com>
+
+       * poppler/Catalog.cc: Fix from Marco to make sure we always
+       initialize Catalog::pageLabelInfo.
+
+ ChangeLog         |    5 +++++
+ poppler/Catalog.cc |   3 +--
+ 2 files changed, 6 insertions(+), 2 deletions(-)
+
+commit 49c10d9f2c4e0cef031f96929e38a14d7ce5af19
+Author: Jonathan Blandford <jrb@redhat.com>
+Date:  Sat Apr 16 18:57:43 2005 +0000
+
+    Sat Apr 16 14:53:15 2005  Jonathan Blandford  <jrb@redhat.com>
+
+           * glib/Makefile.am: Create poppler-enums.[ch]
+
+           * glib/poppler.h:
+           * glib/poppler-page.cc:
+           * glib/poppler-page.h:
+           * glib/poppler-action.h: Try to clean up the headers a bit
+
+           * glib/poppler-document.cc:
+           * glib/poppler-document.h: Add support for document data.
+           Implemented as a lot of GObject properties.
+
+           * glib/poppler-enums.c:
+           * glib/poppler-enums.h: New autogenerated files.
+
+           * glib/test-poppler-glib.c: Test the new document metadata.
+           Seems
+           to work nicely, other than the PDF string and View Prefs.
+
+           * poppler/Catalog.cc:
+           * poppler/Catalog.h: Extend to support PageLayout.
+
+ ChangeLog               |   22 ++++++
+ glib/Makefile.am        |   32 +++++++-
+ glib/poppler-action.h   |   15 ++--
+ glib/poppler-document.cc |  196
+ +++++++++++++++++++++++++++++++++++++++++-----
+ glib/poppler-document.h  |   43 ++++++++--
+ glib/poppler-enums.c    |  144 ++++++++++++++++++++++++++++++++++
+ glib/poppler-enums.h    |   32 ++++++++
+ glib/poppler-page.cc    |    3 -
+ glib/poppler-page.h     |    1 +
+ glib/poppler.h                  |    7 ++
+ glib/test-poppler-glib.c |   48 +++++++++++-
+ poppler/Catalog.cc      |   17 ++++
+ poppler/Catalog.h       |   11 +++
+ 13 files changed, 529 insertions(+), 42 deletions(-)
+
+commit f35c76cd3528f1e1de594e85e734ca23624b3a62
+Author: Kristian Høgsberg <krh@redhat.com>
+Date:  Fri Apr 15 02:25:10 2005 +0000
+
+    2005-04-14 Kristian Høgsberg  <krh@redhat.com>
+
+           * glib/poppler-page.cc:
+           * glib/poppler-page.h:
+           * glib/poppler-private.h:
+           * glib/poppler.h: Patch from Marco Pesenti Gritti to set page
+           orientaton.
+
+ ChangeLog             |    8 ++++
+ glib/poppler-page.cc  |  109
+ ++++++++++++++++++++++++++++++++++++++++++++----
+ glib/poppler-page.h   |   45 ++++++++++----------
+ glib/poppler-private.h |    1 +
+ glib/poppler.h                |    9 ++++
+ 5 files changed, 142 insertions(+), 30 deletions(-)
+
+commit 538408a8845e167cc2d796ac8b8129d0a2e6a894
+Author: Jeff Muizelaar <jeff@infidigm.net>
+Date:  Thu Apr 14 01:34:38 2005 +0000
+
+    2005-04-13 Jeff Muizelaar  <jrmuizel@nit.ca>
+
+       * poppler/CairoOutputDevImage.cc (getBitmap): remove unused
+       SplashBitmap. Patch from Albert Astals Cid.
+
+ ChangeLog                     |    5 +++++
+ poppler/CairoOutputDevImage.cc |    2 --
+ 2 files changed, 5 insertions(+), 2 deletions(-)
+
+commit 2903530492c24f3c7cb3bf3b993500694aaa27a8
+Author: Kristian Høgsberg <krh@redhat.com>
+Date:  Tue Apr 12 15:37:39 2005 +0000
+
+    2005-04-12 Kristian Høgsberg  <krh@redhat.com>
+
+           * configure.ac: Add fontconfig to PKG_CHECK_MODULES for
+           the cairo
+           backend too, since we shouldn't depend on cairo.pc to pull
+           that in
+           for us.
+
+           * poppler/Makefile.am (INCLUDES): Add $(splash_includes) to
+           INCLUDES to make sure the fontconfig include path is
+           added when
+           using the splash backend.
+
+ ChangeLog          |   10 ++++++++++
+ configure.ac       |    4 ++--
+ poppler/Makefile.am |   1 +
+ 3 files changed, 13 insertions(+), 2 deletions(-)
+
+commit 0f7dd9a0512ff97293ee3f8a762b0049393b3cc1
+Author: Jeff Muizelaar <jeff@infidigm.net>
+Date:  Sat Apr 9 18:14:39 2005 +0000
+
+    2005-04-09 Jeff Muizelaar  <jrmuizel@nit.ca>
+
+       * poppler-qt.h:
+       * poppler-document.cc (okToPrint, okToChange, okToCopy):
+       Patch from Albert Astals Cid adding more metadata exports
+
+ ChangeLog             |    6 ++++++
+ qt/poppler-document.cc |   20 ++++++++++++++++++++
+ qt/poppler-qt.h       |    4 ++++
+ 3 files changed, 30 insertions(+)
+
+commit dee72b531dab83a29c7675ae06ffe376e4498a4e
+Author: Kristian Høgsberg <krh@redhat.com>
+Date:  Fri Apr 8 21:09:27 2005 +0000
+
+    2005-04-08 Kristian Høgsberg  <krh@redhat.com>
+
+           * poppler-qt.pc.in (Libs): Add -lpoppler to Libs.
+
+ ChangeLog       |    4 ++++
+ poppler-qt.pc.in |    2 +-
+ 2 files changed, 5 insertions(+), 1 deletion(-)
+
+commit df59ce3b1d5ca8cd46aaf5f189bc78953e21e1a9
+Author: Jeff Muizelaar <jeff@infidigm.net>
+Date:  Fri Apr 8 03:30:33 2005 +0000
+
+    2005-04-07 Jeff Muizelaar  <jrmuizel@nit.ca>
+
+       * configure.ac: redo the qt tests from Albert Astals Cid
+
+ ChangeLog    |    4 +++
+ configure.ac |   78
+ +++++++++++++++++++++++++++++++++++-----------------------
+ 2 files changed, 51 insertions(+), 31 deletions(-)
+
+commit 3f9dde10e4778255c468895942e45d1a2637af3a
+Author: Jeff Muizelaar <jeff@infidigm.net>
+Date:  Fri Apr 8 03:11:00 2005 +0000
+
+    2005-04-07 Jeff Muizelaar  <jrmuizel@nit.ca>
+
+       * qt/poppler-document.cc:
+       * qt/poppler-page.cc:
+       * qt/poppler-qt.h:
+       Patch from Albert Astals Cid adding consts and exporting some more
+       metadata.
+
+ ChangeLog             |    8 ++++++++
+ qt/poppler-document.cc |   21 ++++++++++++++++++---
+ qt/poppler-page.cc    |    6 +++---
+ qt/poppler-qt.h       |   15 +++++++++------
+ 4 files changed, 38 insertions(+), 12 deletions(-)
+
+commit e79a8b946e0d04b32da0b4ceea1649efd203cb07
+Author: Kristian Høgsberg <krh@redhat.com>
+Date:  Thu Apr 7 22:01:51 2005 +0000
+
+    2005-04-07 Kristian Høgsberg  <krh@redhat.com>
+
+           * glib/poppler-document.cc:
+           * glib/poppler-document.h:
+           * glib/poppler-page.cc:
+           * glib/poppler-page.h:
+           * glib/poppler-private.h: Print to PS support from Marco
+           Pesenti
+           Gritti.
+
+ ChangeLog               |    9 +++++++++
+ glib/poppler-document.cc |   45
+ +++++++++++++++++++++++++++++++++++++++++++++
+ glib/poppler-document.h  |    8 ++++++--
+ glib/poppler-page.cc    |   19 +++++++++++++++++++
+ glib/poppler-page.h     |   40 +++++++++++++++++++++-------------------
+ glib/poppler-private.h   |    7 +++++++
+ 6 files changed, 107 insertions(+), 21 deletions(-)
+
+commit 7319b66eb64e735ae8b811306eb76755f088385b
+Author: Jonathan Blandford <jrb@redhat.com>
+Date:  Thu Apr 7 16:26:15 2005 +0000
+
+    Thu Apr  7 12:25:39 2005  Jonathan Blandford  <jrb@redhat.com>
+
+           * configure.ac: check for qt, not glib, when enabling the qt
+           subdir
+
+ ChangeLog    |    5 +++++
+ configure.ac |    2 +-
+ 2 files changed, 6 insertions(+), 1 deletion(-)
+
+commit e258ed0cb42d524ee39451f680ad4c067e7721da
+Author: Jeff Muizelaar <jeff@infidigm.net>
+Date:  Wed Apr 6 20:49:19 2005 +0000
+
+    2005-04-06 Jeff Muizelaar  <jrmuizel@nit.ca>
+
+       * .cvsignore, glib/.cvsignore, qt/.cvsignore:
+       Add more things to .cvsignore.
+       Patch from Martin Kretzschmar.
+
+ .cvsignore     |    2 ++
+ ChangeLog      |    6 ++++++
+ glib/.cvsignore |    7 +++++++
+ qt/.cvsignore  |    7 +++++++
+ 4 files changed, 22 insertions(+)
+
+commit 2a5624a81aa84677a57e098d7d4045f44e3b6f3a
+Author: Jeff Muizelaar <jeff@infidigm.net>
+Date:  Wed Apr 6 20:35:03 2005 +0000
+
+    2005-04-06 Jeff Muizelaar  <jrmuizel@nit.ca>
+
+       * poppler-page.cc (Page::Page, Page::~Page):
+       Construct and deconstruct the PageData object.
+       Patch from Albert Astals Cid.
+
+ ChangeLog         |    6 ++++++
+ qt/poppler-page.cc |   6 ++++++
+ qt/poppler-qt.h    |   1 +
+ 3 files changed, 13 insertions(+)
+
+commit f983e3d317660653f2bfc56f9b06e2cec675beca
+Author: Jeff Muizelaar <jeff@infidigm.net>
+Date:  Wed Apr 6 14:39:40 2005 +0000
+
+    2005-04-06 Jeff Muizelaar  <jrmuizel@nit.ca>
+
+           * Makefile.am, configure.ac: Add configuration for qt wrapper.
+
+           * poppler-qt.pc.in:
+           * qt/Makefile.am:
+           * qt/poppler-document.cc:
+           * qt/poppler-page.cc:
+           * qt/poppler-private.h:
+           * qt/poppler-qt.h:
+           * qt/test-poppler-qt.cpp:
+           New files.
+
+ ChangeLog             |   13 +++
+ Makefile.am           |   13 ++-
+ configure.ac          |   64 ++++++++++++-
+ poppler-qt.pc.in      |   11 +++
+ qt/Makefile.am                |   32 +++++++
+ qt/poppler-document.cc |  232
+ ++++++++++++++++++++++++++++++++++++++++++++++++
+ qt/poppler-page.cc    |   66 ++++++++++++++
+ qt/poppler-private.h  |   32 +++++++
+ qt/poppler-qt.h       |   75 ++++++++++++++++
+ qt/test-poppler-qt.cpp |   63 +++++++++++++
+ 10 files changed, 597 insertions(+), 4 deletions(-)
+
+commit d91dd69a7a0dd581c26728d2640e4d36a7ffe75f
+Author: Kristian Høgsberg <krh@redhat.com>
+Date:  Tue Apr 5 17:46:44 2005 +0000
+
+    2005-04-05 Kristian Høgsberg  <krh@redhat.com>
+
+           * NEWS: Attempt to sum up changes since 0.1.2.
+
+           * configure.ac: Bump release to 0.2.0, add AC_DEFINEs
+           for cairo
+           and splash availability.
+
+           * poppler/CairoFontEngine.cc: Disable hinting.
+
+           * glib/poppler-page.cc (poppler_page_render_to_pixbuf): Choose
+           either splash or cairo rendering, based on configure choice.
+           (cairo_render_to_pixbuf): New function to render using
+           the cairo
+           backend.
+           (splash_render_to_pixbuf): Split out the splash code to this
+           function.
+
+ ChangeLog                     |   16 +++++
+ NEWS                          |    6 +-
+ configure.ac                  |   16 +++--
+ glib/Makefile.am              |   17 ++++-
+ glib/poppler-page.cc          |  152
+ ++++++++++++++++++++++++++++++++--------
+ poppler/CairoFontEngine.cc    |    2 +-
+ poppler/CairoOutputDevImage.cc |   20 ++----
+ poppler/CairoOutputDevImage.h |    3 +-
+ 8 files changed, 179 insertions(+), 53 deletions(-)
+
+commit b62b0cec2335d987b31fbb0043cb33db29cc6a13
+Author: Kristian Høgsberg <krh@redhat.com>
+Date:  Tue Apr 5 02:56:32 2005 +0000
+
+    2005-04-04 Kristian Høgsberg  <krh@redhat.com>
+
+           * ChangeLog: Add this entry to test commit mailer script.
+
+ ChangeLog |   2 ++
+ 1 file changed, 2 insertions(+)
+
+commit 50b494266ce197fe88468ca2917b9910d77e5f98
+Author: Kristian Høgsberg <krh@redhat.com>
+Date:  Tue Apr 5 02:49:18 2005 +0000
+
+    2005-04-04 Kristian Høgsberg  <krh@redhat.com>
+
+           * TODO: Add reminder about using PDF font descriptors with
+           fontconfig.
+
+ ChangeLog |   3 +++
+ TODO     |    2 ++
+ 2 files changed, 5 insertions(+)
+
+commit d3d12235bf4de48363571b3d992ea3bfc29e6529
+Author: Kristian Høgsberg <krh@redhat.com>
+Date:  Mon Apr 4 21:50:56 2005 +0000
+
+    2005-04-04 Kristian Høgsberg  <krh@redhat.com>
+
+           * configure.ac: Add checks for mkstemp() and mkstemps().
+
+           * glib/poppler-page.cc (poppler_page_find_text): Reverse
+           y-coordinates so we return PDF style coordinates.
+
+           From Maro Pesenti Gritti <mpgritti@gmail.com>:
+
+           * configure.ac, poppler/Makefile.am: Check for fontconfig when
+           we're building the splash backend.
+
+           * glib/poppler-page.cc (poppler_page_get_text): New
+           function to
+           select text on page.
+
+ ChangeLog           |   15 +++++++++++++++
+ configure.ac        |    5 ++++-
+ glib/poppler-page.cc |   48
+ +++++++++++++++++++++++++++++++++++++++++++++---
+ glib/poppler-page.h  |    3 +++
+ poppler/Makefile.am  |    4 ++++
+ 5 files changed, 71 insertions(+), 4 deletions(-)
+
+commit 2cb9d70678e33504246cbfbe0525c33f5e3b7736
+Author: Kristian Høgsberg <krh@redhat.com>
+Date:  Mon Apr 4 05:56:29 2005 +0000
+
+    2005-04-04 Kristian Høgsberg  <krh@redhat.com>
+
+           * glib/poppler-page.cc (poppler_page_find_text): Reverse
+           list of
+           matches so we get them in the right order.
+
+ ChangeLog           |    5 +++++
+ glib/poppler-page.cc |    2 +-
+ 2 files changed, 6 insertions(+), 1 deletion(-)
+
+commit 8c2a5ffb73c0f2d84adebcfbd43f8347ae8c8bbc
+Author: Jeff Muizelaar <jeff@infidigm.net>
+Date:  Sun Apr 3 18:17:55 2005 +0000
+
+    2005-04-03 Martin Kretzschmar  <martink@gnome.org>
+
+       * poppler/DCTStream.h: Wrap #include <jpeglib.h> in extern "C"
+       Fixes build with unpatched libjpeg.
+
+ ChangeLog          |    5 +++++
+ poppler/DCTStream.h |   2 ++
+ 2 files changed, 7 insertions(+)
+
+commit 1879d82d9088aa36ef5e677f4bae44c84f90caa6
+Author: Jeff Muizelaar <jeff@infidigm.net>
+Date:  Sat Apr 2 22:16:38 2005 +0000
+
+    2005-04-02 Jeff Muizelaar  <jrmuizel@nit.ca>
+
+       * poppler/Page.h:
+       * poppler/Page.cc (Page::Page):
+       Some initial infrastructure for supporting transitions.
+
+ ChangeLog      |    6 ++++++
+ poppler/Page.cc |   10 ++++++++++
+ poppler/Page.h  |    4 ++++
+ 3 files changed, 20 insertions(+)
+
+commit fa4efbed51e12811070798a7cfb6b1f9e8d57abc
+Author: Kristian Høgsberg <krh@redhat.com>
+Date:  Fri Apr 1 00:32:34 2005 +0000
+
+    2005-03-31 Kristian Høgsberg  <krh@redhat.com>
+
+           * glib/poppler-page.cc (poppler_page_render_to_pixbuf): Clip
+           output to destination pixbuf and fix RGB order.
+
+ ChangeLog           |    5 +++++
+ glib/poppler-page.cc |   38 +++++++++++++++++++++++---------------
+ 2 files changed, 28 insertions(+), 15 deletions(-)
+
+commit bb508ded0b8c5806a9db1ec73e57b14268896911
+Author: Kristian Høgsberg <krh@redhat.com>
+Date:  Thu Mar 31 22:45:05 2005 +0000
+
+    2005-03-31 Kristian Høgsberg  <krh@redhat.com>
+
+           * glib/poppler-page.cc (poppler_page_find_text): New
+           function to
+           seach a page for occurrences of a given text string.
+
+           * glib/poppler-page.cc: Add g_return_if_fail() checks to
+           a couple
+           of functions.
+
+ ChangeLog               |    8 +++++
+ glib/poppler-page.cc    |   82
+ ++++++++++++++++++++++++++++++++++++++++------
+ glib/poppler-page.h     |   18 +++++++---
+ glib/test-poppler-glib.c |   19 +++++++++--
+ 4 files changed, 109 insertions(+), 18 deletions(-)
+
+commit 0b4d481e9c79cb18cf41b503970801bbf4b95b3c
+Author: Jonathan Blandford <jrb@redhat.com>
+Date:  Thu Mar 31 05:29:42 2005 +0000
+
+    Thu Mar 31 00:26:20 2005  Jonathan Blandford  <jrb@redhat.com>
+
+           * glib/poppler-page.cc:
+           * glib/poppler-page.h (poppler_page_get_link_mapping,
+           poppler_page_free_link_mapping): New functions to get a
+           mapping of
+           links to locations on the current document.
+    :s
+
+ ChangeLog           |    7 +++++
+ glib/poppler-page.cc |   85
+ +++++++++++++++++++++++++++++++++++++++++++++++---
+ glib/poppler-page.h  |   15 +++++++++
+ 3 files changed, 102 insertions(+), 5 deletions(-)
+
+commit c4e18f5a454794bd5e226f1106a54ccf807c6c3d
+Author: Jeff Muizelaar <jeff@infidigm.net>
+Date:  Thu Mar 31 02:28:46 2005 +0000
+
+    2005-03-30 Jeff Muizelaar <jrmuizel@nit.ca>
+
+       * poppler/DCTStream.h: change x to unsigned int to eliminate
+       comparision warning
+
+ ChangeLog          |    5 +++++
+ poppler/DCTStream.h |   2 +-
+ 2 files changed, 6 insertions(+), 1 deletion(-)
+
+commit e6a2a588305b4797af901599eb6854028f2be476
+Author: Jeff Muizelaar <jeff@infidigm.net>
+Date:  Wed Mar 30 18:43:44 2005 +0000
+
+    2005-03-30 Jeff Muizelaar <jrmuizel@nit.ca>
+
+       * poppler/Catalog.cc: delete pageLabelInfo on deconstruction
+
+ ChangeLog         |    4 ++++
+ poppler/Catalog.cc |   1 +
+ 2 files changed, 5 insertions(+)
+
+commit a52905c0f0bf4d10d2103b80924a4de204d03836
+Author: Jonathan Blandford <jrb@redhat.com>
+Date:  Wed Mar 30 04:08:26 2005 +0000
+
+    add this
+
+ glib/poppler-action.cc |  285
+ ++++++++++++++++++++++++++++++++++++++++++++++++
+ 1 file changed, 285 insertions(+)
+
+commit 9542860a74076020b5727d4b761c08cdab42d69e
+Author: Jonathan Blandford <jrb@redhat.com>
+Date:  Wed Mar 30 04:07:57 2005 +0000
+
+    add these
+
+ glib/poppler-action.h |  157
+ +++++++++++++++++++++++++++++++++++++++++++++++++
+ 1 file changed, 157 insertions(+)
+
+commit 07720f98eca8736695f7d0d8e98465d301e6b7cf
+Author: Jonathan Blandford <jrb@redhat.com>
+Date:  Wed Mar 30 04:07:39 2005 +0000
+
+    Tue Mar 29 23:07:17 2005  Jonathan Blandford  <jrb@redhat.com>
+
+           * glib/poppler-page.h: Reformat.
+
+ ChangeLog          |    4 ++++
+ glib/poppler-page.h |  34 +++++++++++++++++-----------------
+ 2 files changed, 21 insertions(+), 17 deletions(-)
+
+commit 3437b9e122aa05f4ede24664ee5a9b2d423ef9c4
+Author: Jonathan Blandford <jrb@redhat.com>
+Date:  Wed Mar 30 04:04:53 2005 +0000
+
+    Tue Mar 29 22:49:15 2005  Jonathan Blandford  <jrb@redhat.com>
+
+           * glib/poppler-action.[ch]: New item to encapsulate links.
+           * glib/poppler-document.[ch] (poppler_index_iter_get_action):
+           New
+           function to get the action.  Also, fix some warnings.
+           * glib/poppler-private.h (_poppler_action_new): New function.
+           * glib/test-poppler-glib.c: Fix warnings.
+
+ ChangeLog               |    8 +++++++
+ glib/Makefile.am        |    2 ++
+ glib/poppler-document.cc |   57
+ +++++++++++-----------------------------------
+ glib/poppler-document.h  |    7 ++----
+ glib/poppler-private.h   |   12 ++++++++--
+ glib/poppler.h                  |    1 +
+ glib/test-poppler-glib.c |    4 +++-
+ 7 files changed, 39 insertions(+), 52 deletions(-)
+
+commit cab0ec4d011c34b571050a446c6e3286cc8749c8
+Author: Jonathan Blandford <jrb@redhat.com>
+Date:  Tue Mar 29 18:49:26 2005 +0000
+
+    Tue Mar 29 02:36:00 2005  Jonathan Blandford  <jrb@redhat.com>
+
+           * glib/poppler-document.[ch] (PopplerIndexIter): Add an
+           iter to
+           extract the index from the doc.  Includes a bad hack, for now.
+
+    Mon Mar 28 22:02:07 2005  Jonathan Blandford  <jrb@redhat.com>
+
+           * glib/poppler-page.cc:
+           * glib/poppler-page.h (poppler_page_get_thumbnail_size): New
+           function.
+           * poppler-glib.pc.in: add -lpoppler-glib to the libs line.
+
+ ChangeLog               |   12 ++++
+ glib/poppler-document.cc |  160
+ +++++++++++++++++++++++++++++++++++++++++++++-
+ glib/poppler-document.h  |   15 +++++
+ glib/poppler-page.cc    |   48 +++++++++++++-
+ glib/poppler-page.h     |    3 +
+ poppler-glib.pc.in      |    2 +-
+ 6 files changed, 236 insertions(+), 4 deletions(-)
+
+commit 2de98f3871bc4ea3e361ca4fe37f5b6561918c77
+Author: Kristian Høgsberg <krh@redhat.com>
+Date:  Mon Mar 28 07:49:54 2005 +0000
+
+    2005-03-28 Kristian Høgsberg  <krh@redhat.com>
+
+           * poppler/Page.cc (loadThumb): Backend agnostic method for
+           extracting an embedded thumbnail iamge.
+
+           * poppler/Dict.cc (lookupInt): New convenience method.
+
+           * glib/poppler-page.cc (poppler_page_get_thumbnail): New glib
+           function for getting the embedded thumbnail image for a page.
+
+ ChangeLog               |   10 +++++
+ glib/poppler-page.cc    |   23 ++++++++++
+ glib/poppler-page.h     |   32 +++++++-------
+ glib/test-poppler-glib.c |   24 +++++++---
+ poppler/Dict.cc         |   20 +++++++++
+ poppler/Dict.h                  |    1 +
+ poppler/Page.cc         |  109
+ ++++++++++++++++++++++++++++++++++++++++++++++
+ poppler/Page.h                  |    1 +
+ 8 files changed, 196 insertions(+), 24 deletions(-)
+
+commit 591055d1fbcd0b9c2bb11f14040568051c5976d1
+Author: Kristian Høgsberg <krh@redhat.com>
+Date:  Sat Mar 26 00:34:21 2005 +0000
+
+    2005-03-25 Kristian Høgsberg  <krh@redhat.com>
+
+           * glib/Makefile.am (libpoppler_glib_la_SOURCES): Add
+
+           * configure.ac: Check for fontconfig for glib bindings.
+
+ ChangeLog       |    4 ++++
+ configure.ac    |    4 ++--
+ glib/Makefile.am |    7 +++++--
+ 3 files changed, 11 insertions(+), 4 deletions(-)
+
+commit 1e30abe94a96b91df05716ea079c58782d767951
+Author: Kristian Høgsberg <krh@redhat.com>
+Date:  Thu Mar 24 22:24:41 2005 +0000
+
+    2005-03-24 Kristian Høgsberg  <krh@redhat.com>
+
+           * glib/Makefile.am: Use POPPLER_GLIB_CFLAGS and
+           POPPLER_GLIB_LIBS
+           instead of GTK_TEST_*.  Reported by Adam Jackson
+           <ajax@nwnk.net>.
+
+ ChangeLog       |    5 +++++
+ glib/Makefile.am |    7 +++----
+ 2 files changed, 8 insertions(+), 4 deletions(-)
+
+commit 1d9fcaa34222b2ccd53280148561917dbb8d95d9
+Author: Kristian Høgsberg <krh@redhat.com>
+Date:  Wed Mar 23 05:53:08 2005 +0000
+
+    File Edit Options Buffers Tools Help
+    2005-03-23 Kristian Høgsberg  <krh@redhat.com>
+
+           * poppler/Catalog.cc (indexToLabel, labelToIndex): Add
+           stricter
+           checking of incoming labels and indices.
+
+           * glib/test-poppler-glib.c (main): Change test program to
+           take the
+           page label from the command line.
+
+ ChangeLog               |    6 ++++++
+ glib/test-poppler-glib.c |    5 ++++-
+ poppler/Catalog.cc      |   31 +++++++++++++++++++++++++++++--
+ 3 files changed, 39 insertions(+), 3 deletions(-)
+
+commit a9bbb465a0ee6ab320f76d322a3f575327ad1148
+Author: Kristian Høgsberg <krh@redhat.com>
+Date:  Wed Mar 23 05:38:34 2005 +0000
+
+    2005-03-23 Kristian Høgsberg  <krh@redhat.com>
+
+           * glib/poppler-page.cc:
+           * glib/poppler-page.h: Add poppler_page_get_index() and rename
+           popper_page_get_dimension() to popper_page_get_size()
+
+ ChangeLog               |    6 ++++++
+ glib/poppler-page.cc    |   12 +++++++++---
+ glib/poppler-page.h     |   32 +++++++++++++++++---------------
+ glib/test-poppler-glib.c |    5 ++---
+ 4 files changed, 34 insertions(+), 21 deletions(-)
+
+commit 178bff27d09d1e18d1fc00c975fa235b0e9f93d3
+Author: Kristian Høgsberg <krh@redhat.com>
+Date:  Wed Mar 23 04:14:28 2005 +0000
+
+    2005-03-22 Kristian Høgsberg  <krh@redhat.com>
+
+           * glib/poppler-document.cc: Implement poppler_document_save().
+
+           * glib/poppler-document.h: Add prototype and format headers
+           properly.
+
+ ChangeLog               |    7 +++++++
+ glib/poppler-document.cc |   20 ++++++++++++++++++++
+ glib/poppler-document.h  |   30 +++++++++++++-----------------
+ 3 files changed, 40 insertions(+), 17 deletions(-)
+
+commit e40c6f69c9466df4cc70840b959f72cb0809c777
+Author: Kristian Høgsberg <krh@redhat.com>
+Date:  Wed Mar 23 01:30:04 2005 +0000
+
+    2005-03-22 Kristian Høgsberg  <krh@redhat.com>
+
+           * configure.ac: Fix --disable-popper typo reported by Albert.
+           Require exactly cairo 0.4 since CVS cairo has API changes.
+
+ ChangeLog    |    5 +++++
+ configure.ac |    6 +++---
+ 2 files changed, 8 insertions(+), 3 deletions(-)
+
+commit 2a1e4f6f6dd87dc59b3579175a87215fd7350ee0
+Author: Kristian Høgsberg <krh@redhat.com>
+Date:  Tue Mar 22 22:46:37 2005 +0000
+
+    2005-03-22 Kristian Høgsberg  <krh@redhat.com>
+
+           * poppler/Array.cc:
+           * poppler/Array.h: Add getString() convenience method.
+
+           * poppler/Catalog.cc:
+           * poppler/Catalog.h: Optimize lookup of named destinations.
+
+ ChangeLog         |    8 +++
+ poppler/Array.cc   |  15 ++++++
+ poppler/Array.h    |   1 +
+ poppler/Catalog.cc |  142
+ +++++++++++++++++++++++++++++++++-------------------
+ poppler/Catalog.h  |  32 +++++++++++-
+ 5 files changed, 146 insertions(+), 52 deletions(-)
+
+commit 4dfe0ce4a1ca09d632943f0f6315e31135957ada
+Author: Kristian Høgsberg <krh@redhat.com>
+Date:  Tue Mar 22 01:50:05 2005 +0000
+
+    2005-03-21 Kristian Høgsberg  <krh@redhat.com>
+
+           * NEWS, TODO: Update these.
+
+ ChangeLog |   4 ++++
+ NEWS     |    1 +
+ TODO     |   29 ++++++++++++++++++++---------
+ 3 files changed, 25 insertions(+), 9 deletions(-)
+
+commit c158de90a5a8c6514d8aa22efa0b891a1801e822
+Author: Kristian Høgsberg <krh@redhat.com>
+Date:  Mon Mar 21 07:53:19 2005 +0000
+
+    2005-03-21 Kristian Høgsberg  <krh@redhat.com>
+
+           From Albert Astals Cid <tsdgeos@yahoo.es>:
+
+           * poppler/Catalog.cc, poppler/Catalog.h: Parse PageMode
+           setting
+           from the Catalog dict and expose it through getPageMode()
+           method.
+
+ ChangeLog         |   10 ++++++++--
+ poppler/Catalog.cc |  16 ++++++++++++++++
+ poppler/Catalog.h  |  12 ++++++++++++
+ 3 files changed, 36 insertions(+), 2 deletions(-)
+
+commit 9887679ca195714d71cbedde9297e9dcea04eb13
+Author: Kristian Høgsberg <krh@redhat.com>
+Date:  Mon Mar 21 07:36:11 2005 +0000
+
+    2005-03-21 Kristian Høgsberg  <krh@redhat.com>
+
+           * glib/poppler-document.cc:
+
+           * glib/poppler-document.h: Expose the documenttitle as
+           a GObject
+           property.
+
+           * glib/poppler-page.cc: Expose the page label as a GObject
+           property.
+
+           * glib/poppler-private.h: Add the page index to PopplerPage.
+
+           * glib/test-poppler-glib.c: Print out page label and document
+           title.
+
+           * poppler/Catalog.cc:
+           * poppler/Catalog.h: Add page label accessors.
+
+           * poppler/PageLabelInfo.cc:
+           * poppler/PageLabelInfo.h: New files.
+
+           * poppler/Makefile.am: Add new files to sources.
+
+ ChangeLog               |   23 +++
+ glib/poppler-document.cc |   95 ++++++++++++-
+ glib/poppler-document.h  |    3 +
+ glib/poppler-page.cc    |   37 ++++-
+ glib/poppler-private.h   |    3 +-
+ glib/test-poppler-glib.c |   13 +-
+ poppler/Catalog.cc      |   15 ++
+ poppler/Catalog.h       |    6 +
+ poppler/Makefile.am     |    4 +-
+ poppler/PageLabelInfo.cc |  346
+ ++++++++++++++++++++++++++++++++++++++++++++++
+ poppler/PageLabelInfo.h  |   37 +++++
+ 11 files changed, 573 insertions(+), 9 deletions(-)
+
+commit 2cfe917de909254bc3a114a6add68a14b5885fd0
+Author: Kristian Høgsberg <krh@redhat.com>
+Date:  Sun Mar 20 05:44:06 2005 +0000
+
+    2005-03-20 Kristian Høgsberg  <krh@redhat.com>
+
+           * glib/poppler-document.cc:
+           * glib/poppler-page.h:
+           * glib/poppler.cc:
+           * poppler/Array.cc:
+           * poppler/Array.h:
+           * poppler/Catalog.cc: Fix up filenames in #include statements
+           and
+           comments.
+
+ ChangeLog               |   10 ++++++++++
+ glib/poppler-document.cc |    2 +-
+ glib/poppler-document.h  |    2 +-
+ glib/poppler-page.cc    |    2 +-
+ glib/poppler-page.h     |    2 +-
+ glib/poppler.cc         |    2 +-
+ glib/poppler.h                  |    2 +-
+ 7 files changed, 16 insertions(+), 6 deletions(-)
+
+commit f9b6017cfaf8f814ae2fc027927477c29f24af71
+Author: Kristian Høgsberg <krh@redhat.com>
+Date:  Sun Mar 20 00:35:21 2005 +0000
+
+    2005-03-19 Kristian Høgsberg  <krh@redhat.com>
+
+           Land the first bits of the glib wrapper.
+
+           * Makefile.am:
+           * configure.ac: Add new glib subdirectory and configure
+           options
+           for glib wrapper.
+
+           * glib/Makefile.am:
+           * glib/poppler-document.cc:
+           * glib/poppler-document.h:
+           * glib/poppler-page.cc:
+           * glib/poppler-page.h:
+           * glib/poppler-private.h:
+           * glib/poppler.cc:
+           * glib/poppler.h:
+           * glib/test-poppler-glib.c:
+           * poppler-glib.pc.in: New files.
+
+ ChangeLog               |   19 ++++++
+ Makefile.am             |   27 ++++----
+ NEWS                    |    4 ++
+ configure.ac            |   25 ++++++-
+ glib/Makefile.am        |   33 ++++++++++
+ glib/poppler-document.cc |  165
+ ++++++++++++++++++++++++++++++++++++++++++++++
+ glib/poppler-document.h  |   52 +++++++++++++++
+ glib/poppler-page.cc    |  158
+ ++++++++++++++++++++++++++++++++++++++++++++
+ glib/poppler-page.h     |   50 ++++++++++++++
+ glib/poppler-private.h   |   20 ++++++
+ glib/poppler.cc         |   29 ++++++++
+ glib/poppler.h                  |   42 ++++++++++++
+ glib/test-poppler-glib.c |   43 ++++++++++++
+ poppler-glib.pc.in      |   11 ++++
+ 14 files changed, 661 insertions(+), 17 deletions(-)
+
+commit 2a31446b227b5cdc8334e672a71835b6ea14713a
+Author: Jeff Muizelaar <jeff@infidigm.net>
+Date:  Wed Mar 16 15:51:36 2005 +0000
+
+    2005-03-16 Jeff Muizelaar  <jrmuizel@nit.ca>
+
+       From Dan Sheridan <dan.sheridan@postman.org.uk>
+
+       * poppler/XRef.cc (XRef::checkEncrypted):
+       The key length should be 5 for revision 2 documents.
+
+ ChangeLog      |    7 +++++++
+ poppler/XRef.cc |    6 ++++++
+ 2 files changed, 13 insertions(+)
+
+commit e632a1d4b2f685993bda407458c34ef8e6b74136
+Author: Kristian Høgsberg <krh@redhat.com>
+Date:  Fri Mar 11 22:43:29 2005 +0000
+
+    2005-03-11 Kristian Høgsberg  <krh@redhat.com>
+
+           From  Jeff Muizelaar  <jrmuizel@nit.ca>:
+
+           * poppler/CairoOutputDev.cc (CairoOutputDev::drawImageMask):
+           Use
+           getLine instead of getPixel.
+
+ ChangeLog                |    3 +++
+ poppler/CairoOutputDev.cc |   18 ++++++++----------
+ 2 files changed, 11 insertions(+), 10 deletions(-)
+
+commit 83e904452f205a2c0cd2723cb12b7fd4640ce342
+Author: Kristian Høgsberg <krh@redhat.com>
+Date:  Fri Mar 11 21:42:52 2005 +0000
+
+    2005-03-11 Kristian Høgsberg  <krh@redhat.com>
+
+           From  Jeff Muizelaar  <jrmuizel@nit.ca>:
+
+           * configure.ac: Add checks for libjpeg.
+
+           * DCTStream.cc, DCTStream.h, Stream.cc, Stream.h, Makefile.am:
+           Conditionally use libjpeg instead of xpdf jpeg decoder.
+
+ ChangeLog           |    9 +++++
+ configure.ac        |   34 +++++++++++++++-
+ poppler/DCTStream.cc |  110
+ ++++++++++++++++++++++++++++++++++++++++++++++++++
+ poppler/DCTStream.h  |   70 ++++++++++++++++++++++++++++++++
+ poppler/Makefile.am  |   14 ++++++-
+ poppler/Stream.cc    |    8 ++++
+ poppler/Stream.h     |    2 +
+ 7 files changed, 245 insertions(+), 2 deletions(-)
+
+commit e2af71338fd89760c4ac76999985efc5eb92817f
+Author: Kristian Høgsberg <krh@redhat.com>
+Date:  Fri Mar 11 16:42:20 2005 +0000
+
+    2005-03-10 Kristian Høgsberg  <krh@redhat.com>
+
+           From Jeff Muizelaar <jrmuizel@nit.ca>:
+
+           * poppler/CairoFontEngine.cc (CairoFontEngine::getFont):
+           Don't print "Type 3 font!" message.
+
+           * poppler/CairoOutputDev.cc (CairoOutputDev::drawImageMask):
+           Enable image mask drawing and do it properly, albeit slowly.
+
+           * poppler/CairoOutputDev.h
+           (CairoOutputDev::interpretType3Chars): Return true so that
+           Gfx.cc turns type3 characters into calls to drawImageMask
+
+ ChangeLog                 |   14 ++++++++++++++
+ poppler/CairoFontEngine.cc |   1 -
+ poppler/CairoOutputDev.cc  |  25 ++++++++++---------------
+ poppler/CairoOutputDev.h   |   2 +-
+ 4 files changed, 25 insertions(+), 17 deletions(-)
+
+commit 3dc52373346e448077d2539163e873eef6406ed7
+Author: Kristian Høgsberg <krh@redhat.com>
+Date:  Wed Mar 9 15:47:00 2005 +0000
+
+    2005-03-09 Kristian Høgsberg  <krh@redhat.com>
+
+           * NEWS: Describe 0.1.2 (and 0.1.1) release.
+
+           * configure.ac: Bump poppler version to 0.1.2
+
+ ChangeLog    |    6 ++++++
+ NEWS        |   12 ++++++++++++
+ configure.ac |    2 +-
+ 3 files changed, 19 insertions(+), 1 deletion(-)
+
+commit 5c6a2d34fc25df28ca5326e6910d7cf664f0c3d7
+Author: Kristian Høgsberg <krh@redhat.com>
+Date:  Wed Mar 9 15:35:31 2005 +0000
+
+    2005-03-09 Kristian Høgsberg  <krh@redhat.com>
+
+           * configure.ac: Bump cairo requirement to 0.4.
+
+ ChangeLog    |    4 ++++
+ configure.ac |    4 ++--
+ 2 files changed, 6 insertions(+), 2 deletions(-)
+
+commit 5b2d9a61e79cefd819888c8c89231a5fafccd114
+Author: Kristian Høgsberg <krh@redhat.com>
+Date:  Sat Mar 5 04:57:49 2005 +0000
+
+    2005-03-04 Kristian Høgsberg  <krh@redhat.com>
+
+           Patch from Jeff Muizelaar <jrmuizel@nit.ca>.  Changed to
+           allocate
+           glyphs using gmalloc.
+
+           * poppler/CairoOutputDev.cc (CairoOutputDev::drawString):
+           Implement drawString instead of drawChar. This change should
+           make clipping to a text path work and has a performance
+           improvement. Currently the code is a little ugly because we
+           can't concat matrices to cairo without losing our current
+           font.
+
+           * poppler/CairoOutputDev.h (CairoOutputDev::useDrawChar):
+           Tell Gfx.cc that it should use drawString instead of drawChar.
+
+ ChangeLog                |   14 ++++++
+ TODO                     |    3 ++
+ poppler/CairoOutputDev.cc |  110
+ ++++++++++++++++++++++++++++++++++-----------
+ poppler/CairoOutputDev.h  |   7 +--
+ 4 files changed, 102 insertions(+), 32 deletions(-)
+
+commit 60d190ef80a0dcd9cc3a67306e2c65c5dd482f24
+Author: Kristian Høgsberg <krh@redhat.com>
+Date:  Sat Mar 5 04:37:14 2005 +0000
+
+    2005-03-04 Kristian Høgsberg  <krh@redhat.com>
+
+           * test/gtk-cairo-test.cc (view_load):
+           * test/gtk-splash-test.cc (view_load): Fix missing return
+           statement, and remove unused variables.
+
+           * configure.ac: Add configure option to enable the default KDE
+           flags as described by Albert Astals Cid <tsdgeos@yahoo.es>.
+
+           * TODO: Update with Jeff's items.
+
+           * .cvsignore:
+           * */.cvsignore: Add these to silence CVS.
+
+ ChangeLog              |    9 +++++++++
+ TODO                   |   15 +++++++++++----
+ configure.ac           |   21 +++++++++++++++++++++
+ test/gtk-cairo-test.cc  |    6 ++----
+ test/gtk-splash-test.cc |    5 ++---
+ 5 files changed, 45 insertions(+), 11 deletions(-)
+
+commit e6706e505c1675724c8870f7c58079932661db5f
+Author: Kristian Høgsberg <krh@redhat.com>
+Date:  Sat Mar 5 02:19:50 2005 +0000
+
+    2005-03-04 Kristian Høgsberg  <krh@redhat.com>
+
+           * .cvsignore:
+           * */.cvsignore: Add these to silence CVS.
+
+ .cvsignore        |   21 +++++++++++++++++++++
+ ChangeLog         |    3 +++
+ fofi/.cvsignore    |   8 ++++++++
+ goo/.cvsignore     |   8 ++++++++
+ poppler/.cvsignore |  10 ++++++++++
+ splash/.cvsignore  |   8 ++++++++
+ test/.cvsignore    |  10 ++++++++++
+ 7 files changed, 68 insertions(+)
+
+commit 932edfc3c5c61e3b3e98957b717abbf8055e1c5e
+Author: Kristian Høgsberg <krh@redhat.com>
+Date:  Fri Mar 4 19:47:13 2005 +0000
+
+    2005-03-04 Kristian Høgsberg  <krh@redhat.com>
+
+           * configure.ac: Implement same check for gtk+-2.0 tests as for
+           cairo.
+
+ ChangeLog    |    5 +++++
+ configure.ac |   11 ++++++++---
+ 2 files changed, 13 insertions(+), 3 deletions(-)
+
+commit c632b35ad9345f280d78c268f84ae3fd5a3921b9
+Author: Kristian Høgsberg <krh@redhat.com>
+Date:  Fri Mar 4 16:33:43 2005 +0000
+
+    2005-03-04 Kristian Høgsberg  <krh@redhat.com>
+
+           * configure.ac: Only fail hard in check for cairo if the user
+           specified --enable-cairo-output (from Brad Hards
+           <bradh@frogmouth.net>).  Print summary of configure results
+           at the
+           end of configure script.
+
+           * poppler/poppler-config.h: Remove this file (noticed by Brad
+           Hards <bradh@frogmouth.net>).
+
+ ChangeLog    |    5 +++++
+ configure.ac |   17 ++++++++++++++---
+ 2 files changed, 19 insertions(+), 3 deletions(-)
+
+commit 80f9c90273eb31ac349c46bf86dedff7daf21db4
+Author: Kristian Høgsberg <krh@redhat.com>
+Date:  Fri Mar 4 15:32:32 2005 +0000
+
+    2005-03-04 Kristian Høgsberg  <krh@redhat.com>
+
+           * poppler/poppler-config.h: Remove this file (noticed by Brad
+           Hards <bradh@frogmouth.net>).
+
+ ChangeLog               |    5 ++
+ poppler/poppler-config.h |  146
+ ----------------------------------------------
+ 2 files changed, 5 insertions(+), 146 deletions(-)
+
+commit 338b83b6f08a7212fdde2bbce94385e9a71a3d23
+Author: Kristian Høgsberg <krh@redhat.com>
+Date:  Fri Mar 4 02:46:44 2005 +0000
+
+    2005-03-03 Kristian Høgsberg  <krh@redhat.com>
+
+           Patch from Jeff Muizelaar <jrmuizel@nit.ca>:
+
+           * poppler/CairoOutputDev.cc (CairoOutputDev::drawImage,
+           CairoOutputDev::drawImageMask): destroy the image surface and
+           free the image buffer.
+
+ ChangeLog                |   10 ++++++++++
+ autogen.sh               |    2 +-
+ poppler/CairoOutputDev.cc |   8 +++++---
+ 3 files changed, 16 insertions(+), 4 deletions(-)
+
+commit 062aa51487f539406b54458885b4c9501da3c44d
+Author: Kristian Høgsberg <krh@redhat.com>
+Date:  Thu Mar 3 20:01:14 2005 +0000
+
+    2005-03-03 Kristian Høgsberg  <krh@redhat.com>
+
+           * autogen.sh: Add to CVS.
+
+ ChangeLog  |   4 ++++
+ autogen.sh |   4 ++++
+ 2 files changed, 8 insertions(+)
+
+commit cb02d5d0e770e2a8cbe5a8ac810820a2ce5fec0c
+Author: Kristian Høgsberg <krh@redhat.com>
+Date:  Thu Mar 3 19:45:58 2005 +0000
+
+    Initial revision
+
+ AUTHORS                       |    3 +
+ COPYING                       |  340 ++++
+ ChangeLog                     |   33 +
+ INSTALL                       |  236 +++
+ Makefile.am                   |   29 +
+ NEWS                          |    4 +
+ README                                |   37 +
+ README-XPDF                   |  376 ++++
+ TODO                          |   21 +
+ configure.ac                  |  139 ++
+ fofi/FoFiBase.cc              |  156 ++
+ fofi/FoFiBase.h               |   55 +
+ fofi/FoFiEncodings.cc         |  994 ++++++++++
+ fofi/FoFiEncodings.h          |   34 +
+ fofi/FoFiTrueType.cc          | 1438 ++++++++++++++
+ fofi/FoFiTrueType.h           |  131 ++
+ fofi/FoFiType1.cc             |  207 ++
+ fofi/FoFiType1.h              |   57 +
+ fofi/FoFiType1C.cc            | 2385 ++++++++++++++++++++++
+ fofi/FoFiType1C.h             |  224 +++
+ fofi/Makefile.am              |   16 +
+ goo/GooHash.cc                        |  356 ++++
+ goo/GooHash.h                 |   74 +
+ goo/GooList.cc                        |   92 +
+ goo/GooList.h                 |   89 +
+ goo/GooMutex.h                        |   49 +
+ goo/GooString.cc              |  236 +++
+ goo/GooString.h               |   98 +
+ goo/Makefile.am               |   20 +
+ goo/gfile.cc                  |  705 +++++++
+ goo/gfile.h                   |  140 ++
+ goo/gmem.c                    |  204 ++
+ goo/gmem.h                    |   53 +
+ goo/gmempp.cc                 |   32 +
+ goo/gtypes.h                  |   29 +
+ poppler-cairo.pc.in           |   10 +
+ poppler-splash.pc.in          |   10 +
+ poppler.pc.in                 |   11 +
+ poppler/Annot.cc              |  137 ++
+ poppler/Annot.h               |   79 +
+ poppler/Array.cc              |   73 +
+ poppler/Array.h               |   56 +
+ poppler/BaseFile.h            |   82 +
+ poppler/BuiltinFont.cc                |   65 +
+ poppler/BuiltinFont.h         |   55 +
+ poppler/BuiltinFontTables.cc  | 4284
+ ++++++++++++++++++++++++++++++++++++++++
+ poppler/BuiltinFontTables.h   |   23 +
+ poppler/CMap.cc               |  384 ++++
+ poppler/CMap.h                        |  101 +
+ poppler/CairoFontEngine.cc    |  367 ++++
+ poppler/CairoFontEngine.h     |   61 +
+ poppler/CairoOutputDev.cc     |  569 ++++++
+ poppler/CairoOutputDev.h      |  146 ++
+ poppler/CairoOutputDevImage.cc |   87 +
+ poppler/CairoOutputDevImage.h |   43 +
+ poppler/CairoOutputDevX.cc    |  211 ++
+ poppler/CairoOutputDevX.h     |  117 ++
+ poppler/Catalog.cc            |  364 ++++
+ poppler/Catalog.h             |   87 +
+ poppler/CharCodeToUnicode.cc  |  533 +++++
+ poppler/CharCodeToUnicode.h   |  112 ++
+ poppler/CharTypes.h           |   24 +
+ poppler/CompactFontTables.h   |  464 +++++
+ poppler/Decrypt.cc            |  399 ++++
+ poppler/Decrypt.h             |   59 +
+ poppler/Dict.cc               |   95 +
+ poppler/Dict.h                        |   75 +
+ poppler/Error.cc              |   38 +
+ poppler/Error.h               |   21 +
+ poppler/ErrorCodes.h          |   36 +
+ poppler/FontEncodingTables.cc | 1824 +++++++++++++++++
+ poppler/FontEncodingTables.h  |   20 +
+ poppler/Function.cc           | 1525 ++++++++++++++
+ poppler/Function.h            |  181 ++
+ poppler/Gfx.cc                        | 3079 +++++++++++++++++++++++++++++
+ poppler/Gfx.h                 |  279 +++
+ poppler/GfxFont.cc            | 1508 ++++++++++++++
+ poppler/GfxFont.h             |  313 +++
+ poppler/GfxState.cc           | 2782 ++++++++++++++++++++++++++
+ poppler/GfxState.h            | 1053 ++++++++++
+ poppler/GlobalParams.cc       | 1764 +++++++++++++++++
+ poppler/GlobalParams.h                |  312 +++
+ poppler/JArithmeticDecoder.cc |  300 +++
+ poppler/JArithmeticDecoder.h  |   89 +
+ poppler/JBIG2Stream.cc                | 3337 +++++++++++++++++++++++++++++++
+ poppler/JBIG2Stream.h         |  141 ++
+ poppler/JPXStream.cc          | 2822 ++++++++++++++++++++++++++
+ poppler/JPXStream.h           |  338 ++++
+ poppler/Lexer.cc              |  474 +++++
+ poppler/Lexer.h               |   75 +
+ poppler/Link.cc               |  851 ++++++++
+ poppler/Link.h                        |  407 ++++
+ poppler/Makefile.am           |  140 ++
+ poppler/NameToCharCode.cc     |  116 ++
+ poppler/NameToCharCode.h      |   40 +
+ poppler/NameToUnicodeTable.h  | 1097 ++++++++++
+ poppler/Object.cc             |  231 +++
+ poppler/Object.h              |  301 +++
+ poppler/Outline.cc            |  151 ++
+ poppler/Outline.h             |   74 +
+ poppler/OutputDev.cc          |  104 +
+ poppler/OutputDev.h           |  162 ++
+ poppler/PDFDoc.cc             |  322 +++
+ poppler/PDFDoc.h              |  176 ++
+ poppler/PDFDocEncoding.cc     |   44 +
+ poppler/PDFDocEncoding.h      |   16 +
+ poppler/PSOutputDev.cc                | 3803 +++++++++++++++++++++++++++++++++++
+ poppler/PSOutputDev.h         |  312 +++
+ poppler/PSTokenizer.cc                |  135 ++
+ poppler/PSTokenizer.h         |   39 +
+ poppler/Page.cc               |  370 ++++
+ poppler/Page.h                        |  176 ++
+ poppler/Parser.cc             |  231 +++
+ poppler/Parser.h              |   58 +
+ poppler/SplashOutputDev.cc    | 1348 +++++++++++++
+ poppler/SplashOutputDev.h     |  194 ++
+ poppler/Stream-CCITT.h                |  459 +++++
+ poppler/Stream.cc             | 3979
+ +++++++++++++++++++++++++++++++++++++
+ poppler/Stream.h              |  841 ++++++++
+ poppler/TextOutputDev.cc      | 3529 +++++++++++++++++++++++++++++++++
+ poppler/TextOutputDev.h       |  569 ++++++
+ poppler/UTF8.h                        |   56 +
+ poppler/UnicodeMap.cc         |  293 +++
+ poppler/UnicodeMap.h          |  122 ++
+ poppler/UnicodeMapTables.h    |  361 ++++
+ poppler/UnicodeTypeTable.cc   |  299 +++
+ poppler/UnicodeTypeTable.h    |   18 +
+ poppler/XRef.cc               | 1026 ++++++++++
+ poppler/XRef.h                        |  133 ++
+ poppler/poppler-config.h      |  146 ++
+ poppler/poppler-config.h.in   |  145 ++
+ splash/Makefile.am            |   52 +
+ splash/Splash.cc              | 1732 ++++++++++++++++
+ splash/Splash.h               |  174 ++
+ splash/SplashBitmap.cc                |  157 ++
+ splash/SplashBitmap.h         |   46 +
+ splash/SplashClip.cc          |  270 +++
+ splash/SplashClip.h           |   86 +
+ splash/SplashErrorCodes.h     |   30 +
+ splash/SplashFTFont.cc                |  289 +++
+ splash/SplashFTFont.h         |   53 +
+ splash/SplashFTFontEngine.cc  |  141 ++
+ splash/SplashFTFontEngine.h   |   58 +
+ splash/SplashFTFontFile.cc    |  111 ++
+ splash/SplashFTFontFile.h     |   68 +
+ splash/SplashFont.cc          |  166 ++
+ splash/SplashFont.h           |   87 +
+ splash/SplashFontEngine.cc    |  245 +++
+ splash/SplashFontEngine.h     |   83 +
+ splash/SplashFontFile.cc      |   55 +
+ splash/SplashFontFile.h       |   58 +
+ splash/SplashFontFileID.cc    |   23 +
+ splash/SplashFontFileID.h     |   28 +
+ splash/SplashGlyphBitmap.h    |   24 +
+ splash/SplashMath.h           |   45 +
+ splash/SplashPath.cc          |  177 ++
+ splash/SplashPath.h           |  105 +
+ splash/SplashPattern.cc       |   64 +
+ splash/SplashPattern.h                |   79 +
+ splash/SplashScreen.cc                |  107 +
+ splash/SplashScreen.h         |   38 +
+ splash/SplashState.cc         |   99 +
+ splash/SplashState.h          |   86 +
+ splash/SplashT1Font.cc                |  251 +++
+ splash/SplashT1Font.h         |   49 +
+ splash/SplashT1FontEngine.cc  |  124 ++
+ splash/SplashT1FontEngine.h   |   51 +
+ splash/SplashT1FontFile.cc    |   96 +
+ splash/SplashT1FontFile.h     |   55 +
+ splash/SplashTypes.h          |   80 +
+ splash/SplashXPath.cc         |  417 ++++
+ splash/SplashXPath.h          |   90 +
+ splash/SplashXPathScanner.cc  |  271 +++
+ splash/SplashXPathScanner.h   |   72 +
+ test/Makefile.am              |   48 +
+ test/gtk-cairo-test.cc                |  298 +++
+ test/gtk-splash-test.cc       |  314 +++
+ 177 files changed, 70512 insertions(+)
diff --git a/ConfigureChecks.cmake b/ConfigureChecks.cmake
new file mode 100644 (file)
index 0000000..04de970
--- /dev/null
@@ -0,0 +1,56 @@
+# Copyright 2008 Pino Toscano, <pino@kde.org>
+#
+# Redistribution and use is allowed according to the terms of the BSD license.
+# For details see the accompanying COPYING-CMAKE-SCRIPTS file.
+
+include(CheckIncludeFile)
+include(CheckIncludeFiles)
+include(CheckSymbolExists)
+include(CheckFunctionExists)
+include(CheckLibraryExists)
+include(CheckTypeSize)
+include(CheckCSourceCompiles)
+
+check_include_files(dlfcn.h HAVE_DLFCN_H)
+check_include_files(fcntl.h HAVE_FCNTL_H)
+check_include_files(inttypes.h HAVE_INTTYPES_H)
+check_include_files(memory.h HAVE_MEMORY_H)
+check_include_files(stdint.h HAVE_STDINT_H)
+check_include_files(stdlib.h HAVE_STDLIB_H)
+check_include_files(strings.h HAVE_STRINGS_H)
+check_include_files(string.h HAVE_STRING_H)
+check_include_files(sys/mman.h HAVE_SYS_MMAN_H)
+check_include_files(sys/stat.h HAVE_SYS_STAT_H)
+check_include_files(sys/types.h HAVE_SYS_TYPES_H)
+check_include_files(unistd.h HAVE_UNISTD_H)
+
+check_function_exists(fseek64 HAVE_FSEEK64)
+check_function_exists(fseeko HAVE_FSEEKO)
+check_function_exists(ftell64 HAVE_FTELL64)
+check_function_exists(gmtime_r HAVE_GMTIME_R)
+check_function_exists(gettimeofday HAVE_GETTIMEOFDAY)
+check_function_exists(localtime_r HAVE_LOCALTIME_R)
+check_function_exists(popen HAVE_POPEN)
+check_function_exists(mkstemp HAVE_MKSTEMP)
+check_function_exists(mkstemps HAVE_MKSTEMPS)
+
+macro(CHECK_FOR_DIR include var)
+  check_c_source_compiles(
+    "#include <${include}>
+
+int main(int argc, char *argv[])
+{
+  DIR* d = 0;
+  return 0;
+}
+" ${var})
+endmacro(CHECK_FOR_DIR)
+check_for_dir("dirent.h" HAVE_DIRENT_H)
+check_for_dir("ndir.h" HAVE_NDIR_H)
+check_for_dir("sys/dir.h" HAVE_SYS_DIR_H)
+check_for_dir("sys/ndir.h" HAVE_SYS_NDIR_H)
+
+check_function_exists("nanosleep" HAVE_NANOSLEEP)
+if(NOT HAVE_NANOSLEEP)
+  check_library_exists("rt" "nanosleep" "" LIB_RT_HAS_NANOSLEEP)
+endif(NOT HAVE_NANOSLEEP)
diff --git a/INSTALL b/INSTALL
new file mode 100644 (file)
index 0000000..56b077d
--- /dev/null
+++ b/INSTALL
@@ -0,0 +1,236 @@
+Installation Instructions
+*************************
+
+Copyright (C) 1994, 1995, 1996, 1999, 2000, 2001, 2002, 2004, 2005 Free
+Software Foundation, Inc.
+
+This file is free documentation; the Free Software Foundation gives
+unlimited permission to copy, distribute and modify it.
+
+Basic Installation
+==================
+
+These are generic installation instructions.
+
+   The `configure' shell script attempts to guess correct values for
+various system-dependent variables used during compilation.  It uses
+those values to create a `Makefile' in each directory of the package.
+It may also create one or more `.h' files containing system-dependent
+definitions.  Finally, it creates a shell script `config.status' that
+you can run in the future to recreate the current configuration, and a
+file `config.log' containing compiler output (useful mainly for
+debugging `configure').
+
+   It can also use an optional file (typically called `config.cache'
+and enabled with `--cache-file=config.cache' or simply `-C') that saves
+the results of its tests to speed up reconfiguring.  (Caching is
+disabled by default to prevent problems with accidental use of stale
+cache files.)
+
+   If you need to do unusual things to compile the package, please try
+to figure out how `configure' could check whether to do them, and mail
+diffs or instructions to the address given in the `README' so they can
+be considered for the next release.  If you are using the cache, and at
+some point `config.cache' contains results you don't want to keep, you
+may remove or edit it.
+
+   The file `configure.ac' (or `configure.in') is used to create
+`configure' by a program called `autoconf'.  You only need
+`configure.ac' if you want to change it or regenerate `configure' using
+a newer version of `autoconf'.
+
+The simplest way to compile this package is:
+
+  1. `cd' to the directory containing the package's source code and type
+     `./configure' to configure the package for your system.  If you're
+     using `csh' on an old version of System V, you might need to type
+     `sh ./configure' instead to prevent `csh' from trying to execute
+     `configure' itself.
+
+     Running `configure' takes awhile.  While running, it prints some
+     messages telling which features it is checking for.
+
+  2. Type `make' to compile the package.
+
+  3. Optionally, type `make check' to run any self-tests that come with
+     the package.
+
+  4. Type `make install' to install the programs and any data files and
+     documentation.
+
+  5. You can remove the program binaries and object files from the
+     source code directory by typing `make clean'.  To also remove the
+     files that `configure' created (so you can compile the package for
+     a different kind of computer), type `make distclean'.  There is
+     also a `make maintainer-clean' target, but that is intended mainly
+     for the package's developers.  If you use it, you may have to get
+     all sorts of other programs in order to regenerate files that came
+     with the distribution.
+
+Compilers and Options
+=====================
+
+Some systems require unusual options for compilation or linking that the
+`configure' script does not know about.  Run `./configure --help' for
+details on some of the pertinent environment variables.
+
+   You can give `configure' initial values for configuration parameters
+by setting variables in the command line or in the environment.  Here
+is an example:
+
+     ./configure CC=c89 CFLAGS=-O2 LIBS=-lposix
+
+   *Note Defining Variables::, for more details.
+
+Compiling For Multiple Architectures
+====================================
+
+You can compile the package for more than one kind of computer at the
+same time, by placing the object files for each architecture in their
+own directory.  To do this, you must use a version of `make' that
+supports the `VPATH' variable, such as GNU `make'.  `cd' to the
+directory where you want the object files and executables to go and run
+the `configure' script.  `configure' automatically checks for the
+source code in the directory that `configure' is in and in `..'.
+
+   If you have to use a `make' that does not support the `VPATH'
+variable, you have to compile the package for one architecture at a
+time in the source code directory.  After you have installed the
+package for one architecture, use `make distclean' before reconfiguring
+for another architecture.
+
+Installation Names
+==================
+
+By default, `make install' will install the package's files in
+`/usr/local/bin', `/usr/local/man', etc.  You can specify an
+installation prefix other than `/usr/local' by giving `configure' the
+option `--prefix=PREFIX'.
+
+   You can specify separate installation prefixes for
+architecture-specific files and architecture-independent files.  If you
+give `configure' the option `--exec-prefix=PREFIX', the package will
+use PREFIX as the prefix for installing programs and libraries.
+Documentation and other data files will still use the regular prefix.
+
+   In addition, if you use an unusual directory layout you can give
+options like `--bindir=DIR' to specify different values for particular
+kinds of files.  Run `configure --help' for a list of the directories
+you can set and what kinds of files go in them.
+
+   If the package supports it, you can cause programs to be installed
+with an extra prefix or suffix on their names by giving `configure' the
+option `--program-prefix=PREFIX' or `--program-suffix=SUFFIX'.
+
+Optional Features
+=================
+
+Some packages pay attention to `--enable-FEATURE' options to
+`configure', where FEATURE indicates an optional part of the package.
+They may also pay attention to `--with-PACKAGE' options, where PACKAGE
+is something like `gnu-as' or `x' (for the X Window System).  The
+`README' should mention any `--enable-' and `--with-' options that the
+package recognizes.
+
+   For packages that use the X Window System, `configure' can usually
+find the X include and library files automatically, but if it doesn't,
+you can use the `configure' options `--x-includes=DIR' and
+`--x-libraries=DIR' to specify their locations.
+
+Specifying the System Type
+==========================
+
+There may be some features `configure' cannot figure out automatically,
+but needs to determine by the type of machine the package will run on.
+Usually, assuming the package is built to be run on the _same_
+architectures, `configure' can figure that out, but if it prints a
+message saying it cannot guess the machine type, give it the
+`--build=TYPE' option.  TYPE can either be a short name for the system
+type, such as `sun4', or a canonical name which has the form:
+
+     CPU-COMPANY-SYSTEM
+
+where SYSTEM can have one of these forms:
+
+     OS KERNEL-OS
+
+   See the file `config.sub' for the possible values of each field.  If
+`config.sub' isn't included in this package, then this package doesn't
+need to know the machine type.
+
+   If you are _building_ compiler tools for cross-compiling, you should
+use the `--target=TYPE' option to select the type of system they will
+produce code for.
+
+   If you want to _use_ a cross compiler, that generates code for a
+platform different from the build platform, you should specify the
+"host" platform (i.e., that on which the generated programs will
+eventually be run) with `--host=TYPE'.
+
+Sharing Defaults
+================
+
+If you want to set default values for `configure' scripts to share, you
+can create a site shell script called `config.site' that gives default
+values for variables like `CC', `cache_file', and `prefix'.
+`configure' looks for `PREFIX/share/config.site' if it exists, then
+`PREFIX/etc/config.site' if it exists.  Or, you can set the
+`CONFIG_SITE' environment variable to the location of the site script.
+A warning: not all `configure' scripts look for a site script.
+
+Defining Variables
+==================
+
+Variables not defined in a site shell script can be set in the
+environment passed to `configure'.  However, some packages may run
+configure again during the build, and the customized values of these
+variables may be lost.  In order to avoid this problem, you should set
+them in the `configure' command line, using `VAR=value'.  For example:
+
+     ./configure CC=/usr/local2/bin/gcc
+
+causes the specified `gcc' to be used as the C compiler (unless it is
+overridden in the site shell script).  Here is a another example:
+
+     /bin/bash ./configure CONFIG_SHELL=/bin/bash
+
+Here the `CONFIG_SHELL=/bin/bash' operand causes subsequent
+configuration-related scripts to be executed by `/bin/bash'.
+
+`configure' Invocation
+======================
+
+`configure' recognizes the following options to control how it operates.
+
+`--help'
+`-h'
+     Print a summary of the options to `configure', and exit.
+
+`--version'
+`-V'
+     Print the version of Autoconf used to generate the `configure'
+     script, and exit.
+
+`--cache-file=FILE'
+     Enable the cache: use and save the results of the tests in FILE,
+     traditionally `config.cache'.  FILE defaults to `/dev/null' to
+     disable caching.
+
+`--config-cache'
+`-C'
+     Alias for `--cache-file=config.cache'.
+
+`--quiet'
+`--silent'
+`-q'
+     Do not print messages saying which checks are being made.  To
+     suppress all normal output, redirect it to `/dev/null' (any error
+     messages will still be shown).
+
+`--srcdir=DIR'
+     Look for the package's source code in directory DIR.  Usually
+     `configure' can determine that directory automatically.
+
+`configure' also accepts some other, not widely useful, options.  Run
+`configure --help' for more details.
+
diff --git a/Makefile.am b/Makefile.am
new file mode 100644 (file)
index 0000000..a9f5db1
--- /dev/null
@@ -0,0 +1,119 @@
+ACLOCAL_AMFLAGS = -I m4
+DISTCHECK_CONFIGURE_FLAGS = --enable-gtk-doc --with-testdatadir=$(TESTDATADIR)
+
+if BUILD_SPLASH_OUTPUT
+splash_subdir = splash
+splash_pc_file = poppler-splash.pc
+endif
+
+if BUILD_CAIRO_OUTPUT
+cairo_pc_file = poppler-cairo.pc
+endif
+
+if BUILD_POPPLER_GLIB
+glib_subdir = glib
+glib_pc_file = poppler-glib.pc
+endif
+
+if BUILD_POPPLER_QT4
+qt4_subdir = qt4
+qt4_pc_file = poppler-qt4.pc
+endif
+
+if BUILD_POPPLER_CPP
+cpp_subdir = cpp
+cpp_pc_file = poppler-cpp.pc
+endif
+
+if BUILD_UTILS
+utils_subdir = utils
+endif
+
+SUBDIRS = goo fofi $(splash_subdir) poppler $(utils_subdir) $(glib_subdir) test $(qt4_subdir) $(cpp_subdir)
+
+EXTRA_DIST =                                   \
+       README-XPDF                             \
+       poppler.pc.in                           \
+       poppler-uninstalled.pc.in               \
+       poppler-cairo.pc.in                     \
+       poppler-cairo-uninstalled.pc.in         \
+       poppler-splash.pc.in                    \
+       poppler-splash-uninstalled.pc.in        \
+       poppler-qt4.pc.in                       \
+       poppler-qt4-uninstalled.pc.in           \
+       poppler-cpp.pc.in                       \
+       poppler-cpp-uninstalled.pc.in
+
+pkgconfigdir = $(libdir)/pkgconfig
+pkgconfig_DATA =                               \
+       poppler.pc                              \
+       $(cairo_pc_file)                        \
+       $(splash_pc_file)                       \
+       $(glib_pc_file)                         \
+       $(qt4_pc_file)                          \
+       $(cpp_pc_file)
+
+# Add CMake buildsystem files here so they get added on make dist
+EXTRA_DIST +=                                                  \
+       cpp/tests/CMakeLists.txt                                \
+       cpp/CMakeLists.txt                                      \
+       glib/demo/CMakeLists.txt                                \
+       glib/CMakeLists.txt                                     \
+       glib/poppler-features.h.cmake                           \
+       qt4/src/CMakeLists.txt                                  \
+       qt4/tests/CMakeLists.txt                                \
+       qt4/CMakeLists.txt                                      \
+       qt4/demos/CMakeLists.txt                                \
+       test/CMakeLists.txt                                     \
+       utils/CMakeLists.txt                                    \
+       CMakeLists.txt                                          \
+       ConfigureChecks.cmake                                   \
+       cmake/modules/COPYING-CMAKE-SCRIPTS                     \
+       cmake/modules/FindCairo.cmake                           \
+       cmake/modules/FindFontconfig.cmake                      \
+       cmake/modules/FindGLIB.cmake                            \
+       cmake/modules/FindGObjectIntrospection.cmake            \
+       cmake/modules/FindGTK.cmake                             \
+       cmake/modules/FindIconv.cmake                           \
+       cmake/modules/FindLCMS.cmake                            \
+       cmake/modules/FindLCMS2.cmake                           \
+       cmake/modules/FindQt4.cmake                             \
+       cmake/modules/GObjectIntrospectionMacros.cmake          \
+       cmake/modules/MacroBoolTo01.cmake                       \
+       cmake/modules/MacroEnsureVersion.cmake                  \
+       cmake/modules/MacroOptionalFindPackage.cmake            \
+       cmake/modules/MacroPushRequiredVars.cmake               \
+       cmake/modules/PopplerDefaults.cmake                     \
+       cmake/modules/PopplerMacros.cmake                       \
+       cmake/modules/FindLIBOPENJPEG.cmake                     \
+       config.h.cmake                                          \
+       poppler-cairo.pc.cmake                                  \
+       poppler/poppler-config.h.cmake                          \
+       poppler-cpp.pc.cmake                                    \
+       poppler-glib.pc.cmake                                   \
+       poppler-qt4.pc.cmake                                    \
+       poppler-splash.pc.cmake                                 \
+       poppler.pc.cmake
+
+
+
+distclean-local:
+       if test "$(srcdir)" = "."; then :; else \
+               rm -f ChangeLog; \
+       fi
+
+ChangeLog:
+       $(AM_V_GEN) if test -d "$(srcdir)/.git"; then \
+         (GIT_DIR=$(top_srcdir)/.git ./missing --run git log --stat) | fmt --split-only > $@.tmp \
+         && mv -f $@.tmp $@ \
+         || ($(RM) $@.tmp; \
+             echo Failed to generate ChangeLog, your ChangeLog may be outdated >&2; \
+             (test -f $@ || echo git log is required to generate this file >> $@)); \
+       else \
+         test -f $@ || \
+         (echo A git checkout and git log is required to generate ChangeLog >&2 && \
+         echo A git checkout and git log is required to generate this file >> $@); \
+       fi
+
+.PHONY: ChangeLog
+
diff --git a/Makefile.in b/Makefile.in
new file mode 100644 (file)
index 0000000..4c5e428
--- /dev/null
@@ -0,0 +1,1025 @@
+# Makefile.in generated by automake 1.11.5 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software
+# Foundation, Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+@SET_MAKE@
+
+VPATH = @srcdir@
+am__make_dryrun = \
+  { \
+    am__dry=no; \
+    case $$MAKEFLAGS in \
+      *\\[\ \  ]*) \
+        echo 'am--echo: ; @echo "AM"  OK' | $(MAKE) -f - 2>/dev/null \
+          | grep '^AM OK$$' >/dev/null || am__dry=yes;; \
+      *) \
+        for am__flg in $$MAKEFLAGS; do \
+          case $$am__flg in \
+            *=*|--*) ;; \
+            *n*) am__dry=yes; break;; \
+          esac; \
+        done;; \
+    esac; \
+    test $$am__dry = yes; \
+  }
+pkgdatadir = $(datadir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkglibexecdir = $(libexecdir)/@PACKAGE@
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+subdir = .
+DIST_COMMON = README $(am__configure_deps) $(srcdir)/Makefile.am \
+       $(srcdir)/Makefile.in $(srcdir)/config.h.in \
+       $(srcdir)/poppler-cairo-uninstalled.pc.in \
+       $(srcdir)/poppler-cairo.pc.in \
+       $(srcdir)/poppler-cpp-uninstalled.pc.in \
+       $(srcdir)/poppler-cpp.pc.in \
+       $(srcdir)/poppler-glib-uninstalled.pc.in \
+       $(srcdir)/poppler-glib.pc.in \
+       $(srcdir)/poppler-qt4-uninstalled.pc.in \
+       $(srcdir)/poppler-qt4.pc.in \
+       $(srcdir)/poppler-splash-uninstalled.pc.in \
+       $(srcdir)/poppler-splash.pc.in \
+       $(srcdir)/poppler-uninstalled.pc.in $(srcdir)/poppler.pc.in \
+       $(top_srcdir)/configure AUTHORS COPYING ChangeLog INSTALL NEWS \
+       TODO config.guess config.sub depcomp install-sh ltmain.sh \
+       missing
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/m4/acx_pthread.m4 \
+       $(top_srcdir)/m4/define-dir.m4 $(top_srcdir)/m4/gtk-doc.m4 \
+       $(top_srcdir)/m4/iconv.m4 $(top_srcdir)/m4/introspection.m4 \
+       $(top_srcdir)/m4/libjpeg.m4 $(top_srcdir)/m4/libtool.m4 \
+       $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \
+       $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \
+       $(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+       $(ACLOCAL_M4)
+am__CONFIG_DISTCLEAN_FILES = config.status config.cache config.log \
+ configure.lineno config.status.lineno
+mkinstalldirs = $(install_sh) -d
+CONFIG_HEADER = config.h $(top_builddir)/poppler/poppler-config.h
+CONFIG_CLEAN_FILES = poppler.pc poppler-uninstalled.pc \
+       poppler-cairo.pc poppler-cairo-uninstalled.pc \
+       poppler-splash.pc poppler-splash-uninstalled.pc \
+       poppler-glib.pc poppler-glib-uninstalled.pc poppler-qt4.pc \
+       poppler-qt4-uninstalled.pc poppler-cpp.pc \
+       poppler-cpp-uninstalled.pc
+CONFIG_CLEAN_VPATH_FILES =
+AM_V_GEN = $(am__v_GEN_@AM_V@)
+am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@)
+am__v_GEN_0 = @echo "  GEN   " $@;
+AM_V_at = $(am__v_at_@AM_V@)
+am__v_at_ = $(am__v_at_@AM_DEFAULT_V@)
+am__v_at_0 = @
+SOURCES =
+DIST_SOURCES =
+RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \
+       html-recursive info-recursive install-data-recursive \
+       install-dvi-recursive install-exec-recursive \
+       install-html-recursive install-info-recursive \
+       install-pdf-recursive install-ps-recursive install-recursive \
+       installcheck-recursive installdirs-recursive pdf-recursive \
+       ps-recursive uninstall-recursive
+am__can_run_installinfo = \
+  case $$AM_UPDATE_INFO_DIR in \
+    n|no|NO) false;; \
+    *) (install-info --version) >/dev/null 2>&1;; \
+  esac
+am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
+am__vpath_adj = case $$p in \
+    $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
+    *) f=$$p;; \
+  esac;
+am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`;
+am__install_max = 40
+am__nobase_strip_setup = \
+  srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'`
+am__nobase_strip = \
+  for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||"
+am__nobase_list = $(am__nobase_strip_setup); \
+  for p in $$list; do echo "$$p $$p"; done | \
+  sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \
+  $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \
+    if (++n[$$2] == $(am__install_max)) \
+      { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \
+    END { for (dir in files) print dir, files[dir] }'
+am__base_list = \
+  sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
+  sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
+am__uninstall_files_from_dir = { \
+  test -z "$$files" \
+    || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \
+    || { echo " ( cd '$$dir' && rm -f" $$files ")"; \
+         $(am__cd) "$$dir" && rm -f $$files; }; \
+  }
+am__installdirs = "$(DESTDIR)$(pkgconfigdir)"
+DATA = $(pkgconfig_DATA)
+RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive        \
+  distclean-recursive maintainer-clean-recursive
+AM_RECURSIVE_TARGETS = $(RECURSIVE_TARGETS:-recursive=) \
+       $(RECURSIVE_CLEAN_TARGETS:-recursive=) tags TAGS ctags CTAGS \
+       distdir dist dist-all distcheck
+ETAGS = etags
+CTAGS = ctags
+DIST_SUBDIRS = goo fofi splash poppler utils glib test qt4 cpp
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+distdir = $(PACKAGE)-$(VERSION)
+top_distdir = $(distdir)
+am__remove_distdir = \
+  if test -d "$(distdir)"; then \
+    find "$(distdir)" -type d ! -perm -200 -exec chmod u+w {} ';' \
+      && rm -rf "$(distdir)" \
+      || { sleep 5 && rm -rf "$(distdir)"; }; \
+  else :; fi
+am__relativize = \
+  dir0=`pwd`; \
+  sed_first='s,^\([^/]*\)/.*$$,\1,'; \
+  sed_rest='s,^[^/]*/*,,'; \
+  sed_last='s,^.*/\([^/]*\)$$,\1,'; \
+  sed_butlast='s,/*[^/]*$$,,'; \
+  while test -n "$$dir1"; do \
+    first=`echo "$$dir1" | sed -e "$$sed_first"`; \
+    if test "$$first" != "."; then \
+      if test "$$first" = ".."; then \
+        dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \
+        dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \
+      else \
+        first2=`echo "$$dir2" | sed -e "$$sed_first"`; \
+        if test "$$first2" = "$$first"; then \
+          dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \
+        else \
+          dir2="../$$dir2"; \
+        fi; \
+        dir0="$$dir0"/"$$first"; \
+      fi; \
+    fi; \
+    dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \
+  done; \
+  reldir="$$dir2"
+DIST_ARCHIVES = $(distdir).tar.gz
+GZIP_ENV = --best
+distuninstallcheck_listfiles = find . -type f -print
+am__distuninstallcheck_listfiles = $(distuninstallcheck_listfiles) \
+  | sed 's|^\./|$(prefix)/|' | grep -v '$(infodir)/dir$$'
+distcleancheck_listfiles = find . -type f -print
+ACLOCAL = @ACLOCAL@
+AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AR = @AR@
+AS = @AS@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CAIRO_CFLAGS = @CAIRO_CFLAGS@
+CAIRO_FEATURE = @CAIRO_FEATURE@
+CAIRO_LIBS = @CAIRO_LIBS@
+CAIRO_REQ = @CAIRO_REQ@
+CAIRO_VERSION = @CAIRO_VERSION@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CXX = @CXX@
+CXXCPP = @CXXCPP@
+CXXDEPMODE = @CXXDEPMODE@
+CXXFLAGS = @CXXFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DLLTOOL = @DLLTOOL@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+FGREP = @FGREP@
+FONTCONFIG_CFLAGS = @FONTCONFIG_CFLAGS@
+FONTCONFIG_LIBS = @FONTCONFIG_LIBS@
+FREETYPE_CFLAGS = @FREETYPE_CFLAGS@
+FREETYPE_CONFIG = @FREETYPE_CONFIG@
+FREETYPE_LIBS = @FREETYPE_LIBS@
+GLIB_MKENUMS = @GLIB_MKENUMS@
+GLIB_REQ = @GLIB_REQ@
+GLIB_REQUIRED = @GLIB_REQUIRED@
+GREP = @GREP@
+GTKDOC_CHECK = @GTKDOC_CHECK@
+GTKDOC_DEPS_CFLAGS = @GTKDOC_DEPS_CFLAGS@
+GTKDOC_DEPS_LIBS = @GTKDOC_DEPS_LIBS@
+GTKDOC_MKPDF = @GTKDOC_MKPDF@
+GTKDOC_REBASE = @GTKDOC_REBASE@
+GTK_TEST_CFLAGS = @GTK_TEST_CFLAGS@
+GTK_TEST_LIBS = @GTK_TEST_LIBS@
+HTML_DIR = @HTML_DIR@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+INTROSPECTION_CFLAGS = @INTROSPECTION_CFLAGS@
+INTROSPECTION_COMPILER = @INTROSPECTION_COMPILER@
+INTROSPECTION_GENERATE = @INTROSPECTION_GENERATE@
+INTROSPECTION_GIRDIR = @INTROSPECTION_GIRDIR@
+INTROSPECTION_LIBS = @INTROSPECTION_LIBS@
+INTROSPECTION_MAKEFILE = @INTROSPECTION_MAKEFILE@
+INTROSPECTION_SCANNER = @INTROSPECTION_SCANNER@
+INTROSPECTION_TYPELIBDIR = @INTROSPECTION_TYPELIBDIR@
+LCMS_CFLAGS = @LCMS_CFLAGS@
+LCMS_LIBS = @LCMS_LIBS@
+LD = @LD@
+LDFLAGS = @LDFLAGS@
+LIBCURL_CFLAGS = @LIBCURL_CFLAGS@
+LIBCURL_LIBS = @LIBCURL_LIBS@
+LIBICONV = @LIBICONV@
+LIBJPEG_CFLAGS = @LIBJPEG_CFLAGS@
+LIBJPEG_LIBS = @LIBJPEG_LIBS@
+LIBOBJS = @LIBOBJS@
+LIBOPENJPEG_CFLAGS = @LIBOPENJPEG_CFLAGS@
+LIBOPENJPEG_LIBS = @LIBOPENJPEG_LIBS@
+LIBPNG_CFLAGS = @LIBPNG_CFLAGS@
+LIBPNG_LIBS = @LIBPNG_LIBS@
+LIBS = @LIBS@
+LIBTIFF_CFLAGS = @LIBTIFF_CFLAGS@
+LIBTIFF_CFLAGSS = @LIBTIFF_CFLAGSS@
+LIBTIFF_LIBS = @LIBTIFF_LIBS@
+LIBTOOL = @LIBTOOL@
+LIPO = @LIPO@
+LN_S = @LN_S@
+LTLIBICONV = @LTLIBICONV@
+LTLIBOBJS = @LTLIBOBJS@
+MAKEINFO = @MAKEINFO@
+MANIFEST_TOOL = @MANIFEST_TOOL@
+MKDIR_P = @MKDIR_P@
+MOCQT4 = @MOCQT4@
+NM = @NM@
+NMEDIT = @NMEDIT@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+OTOOL = @OTOOL@
+OTOOL64 = @OTOOL64@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_URL = @PACKAGE_URL@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PC_REQUIRES = @PC_REQUIRES@
+PC_REQUIRES_PRIVATE = @PC_REQUIRES_PRIVATE@
+PDFTOCAIRO_CFLAGS = @PDFTOCAIRO_CFLAGS@
+PDFTOCAIRO_LIBS = @PDFTOCAIRO_LIBS@
+PKG_CONFIG = @PKG_CONFIG@
+PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@
+PKG_CONFIG_PATH = @PKG_CONFIG_PATH@
+POPPLER_DATADIR = @POPPLER_DATADIR@
+POPPLER_GLIB_CFLAGS = @POPPLER_GLIB_CFLAGS@
+POPPLER_GLIB_DISABLE_DEPRECATED = @POPPLER_GLIB_DISABLE_DEPRECATED@
+POPPLER_GLIB_DISABLE_SINGLE_INCLUDES = @POPPLER_GLIB_DISABLE_SINGLE_INCLUDES@
+POPPLER_GLIB_LIBS = @POPPLER_GLIB_LIBS@
+POPPLER_MAJOR_VERSION = @POPPLER_MAJOR_VERSION@
+POPPLER_MICRO_VERSION = @POPPLER_MICRO_VERSION@
+POPPLER_MINOR_VERSION = @POPPLER_MINOR_VERSION@
+POPPLER_QT4_CFLAGS = @POPPLER_QT4_CFLAGS@
+POPPLER_QT4_CXXFLAGS = @POPPLER_QT4_CXXFLAGS@
+POPPLER_QT4_LIBS = @POPPLER_QT4_LIBS@
+POPPLER_QT4_TEST_CFLAGS = @POPPLER_QT4_TEST_CFLAGS@
+POPPLER_QT4_TEST_LIBS = @POPPLER_QT4_TEST_LIBS@
+POPPLER_VERSION = @POPPLER_VERSION@
+PTHREAD_CC = @PTHREAD_CC@
+PTHREAD_CFLAGS = @PTHREAD_CFLAGS@
+PTHREAD_LIBS = @PTHREAD_LIBS@
+RANLIB = @RANLIB@
+SED = @SED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+TESTDATADIR = @TESTDATADIR@
+VERSION = @VERSION@
+XMKMF = @XMKMF@
+X_CFLAGS = @X_CFLAGS@
+X_EXTRA_LIBS = @X_EXTRA_LIBS@
+X_LIBS = @X_LIBS@
+X_PRE_LIBS = @X_PRE_LIBS@
+ZLIB_LIBS = @ZLIB_LIBS@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
+ac_ct_AR = @ac_ct_AR@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_CXX = @ac_ct_CXX@
+ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
+acx_pthread_config = @acx_pthread_config@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+auto_import_flags = @auto_import_flags@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+builddir = @builddir@
+create_shared_lib = @create_shared_lib@
+datadir = @datadir@
+datarootdir = @datarootdir@
+docdir = @docdir@
+dvidir = @dvidir@
+exec_prefix = @exec_prefix@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+htmldir = @htmldir@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localedir = @localedir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+srcdir = @srcdir@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+top_build_prefix = @top_build_prefix@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+win32_libs = @win32_libs@
+ACLOCAL_AMFLAGS = -I m4
+DISTCHECK_CONFIGURE_FLAGS = --enable-gtk-doc --with-testdatadir=$(TESTDATADIR)
+@BUILD_SPLASH_OUTPUT_TRUE@splash_subdir = splash
+@BUILD_SPLASH_OUTPUT_TRUE@splash_pc_file = poppler-splash.pc
+@BUILD_CAIRO_OUTPUT_TRUE@cairo_pc_file = poppler-cairo.pc
+@BUILD_POPPLER_GLIB_TRUE@glib_subdir = glib
+@BUILD_POPPLER_GLIB_TRUE@glib_pc_file = poppler-glib.pc
+@BUILD_POPPLER_QT4_TRUE@qt4_subdir = qt4
+@BUILD_POPPLER_QT4_TRUE@qt4_pc_file = poppler-qt4.pc
+@BUILD_POPPLER_CPP_TRUE@cpp_subdir = cpp
+@BUILD_POPPLER_CPP_TRUE@cpp_pc_file = poppler-cpp.pc
+@BUILD_UTILS_TRUE@utils_subdir = utils
+SUBDIRS = goo fofi $(splash_subdir) poppler $(utils_subdir) $(glib_subdir) test $(qt4_subdir) $(cpp_subdir)
+
+# Add CMake buildsystem files here so they get added on make dist
+EXTRA_DIST = README-XPDF poppler.pc.in poppler-uninstalled.pc.in \
+       poppler-cairo.pc.in poppler-cairo-uninstalled.pc.in \
+       poppler-splash.pc.in poppler-splash-uninstalled.pc.in \
+       poppler-qt4.pc.in poppler-qt4-uninstalled.pc.in \
+       poppler-cpp.pc.in poppler-cpp-uninstalled.pc.in \
+       cpp/tests/CMakeLists.txt cpp/CMakeLists.txt \
+       glib/demo/CMakeLists.txt glib/CMakeLists.txt \
+       glib/poppler-features.h.cmake qt4/src/CMakeLists.txt \
+       qt4/tests/CMakeLists.txt qt4/CMakeLists.txt \
+       qt4/demos/CMakeLists.txt test/CMakeLists.txt \
+       utils/CMakeLists.txt CMakeLists.txt ConfigureChecks.cmake \
+       cmake/modules/COPYING-CMAKE-SCRIPTS \
+       cmake/modules/FindCairo.cmake \
+       cmake/modules/FindFontconfig.cmake \
+       cmake/modules/FindGLIB.cmake \
+       cmake/modules/FindGObjectIntrospection.cmake \
+       cmake/modules/FindGTK.cmake cmake/modules/FindIconv.cmake \
+       cmake/modules/FindLCMS.cmake cmake/modules/FindLCMS2.cmake \
+       cmake/modules/FindQt4.cmake \
+       cmake/modules/GObjectIntrospectionMacros.cmake \
+       cmake/modules/MacroBoolTo01.cmake \
+       cmake/modules/MacroEnsureVersion.cmake \
+       cmake/modules/MacroOptionalFindPackage.cmake \
+       cmake/modules/MacroPushRequiredVars.cmake \
+       cmake/modules/PopplerDefaults.cmake \
+       cmake/modules/PopplerMacros.cmake \
+       cmake/modules/FindLIBOPENJPEG.cmake config.h.cmake \
+       poppler-cairo.pc.cmake poppler/poppler-config.h.cmake \
+       poppler-cpp.pc.cmake poppler-glib.pc.cmake \
+       poppler-qt4.pc.cmake poppler-splash.pc.cmake poppler.pc.cmake
+pkgconfigdir = $(libdir)/pkgconfig
+pkgconfig_DATA = \
+       poppler.pc                              \
+       $(cairo_pc_file)                        \
+       $(splash_pc_file)                       \
+       $(glib_pc_file)                         \
+       $(qt4_pc_file)                          \
+       $(cpp_pc_file)
+
+all: config.h
+       $(MAKE) $(AM_MAKEFLAGS) all-recursive
+
+.SUFFIXES:
+am--refresh: Makefile
+       @:
+$(srcdir)/Makefile.in:  $(srcdir)/Makefile.am  $(am__configure_deps)
+       @for dep in $?; do \
+         case '$(am__configure_deps)' in \
+           *$$dep*) \
+             echo ' cd $(srcdir) && $(AUTOMAKE) --foreign'; \
+             $(am__cd) $(srcdir) && $(AUTOMAKE) --foreign \
+               && exit 0; \
+             exit 1;; \
+         esac; \
+       done; \
+       echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign Makefile'; \
+       $(am__cd) $(top_srcdir) && \
+         $(AUTOMAKE) --foreign Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+       @case '$?' in \
+         *config.status*) \
+           echo ' $(SHELL) ./config.status'; \
+           $(SHELL) ./config.status;; \
+         *) \
+           echo ' cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe)'; \
+           cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe);; \
+       esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+       $(SHELL) ./config.status --recheck
+
+$(top_srcdir)/configure:  $(am__configure_deps)
+       $(am__cd) $(srcdir) && $(AUTOCONF)
+$(ACLOCAL_M4):  $(am__aclocal_m4_deps)
+       $(am__cd) $(srcdir) && $(ACLOCAL) $(ACLOCAL_AMFLAGS)
+$(am__aclocal_m4_deps):
+
+config.h: stamp-h1
+       @if test ! -f $@; then rm -f stamp-h1; else :; fi
+       @if test ! -f $@; then $(MAKE) $(AM_MAKEFLAGS) stamp-h1; else :; fi
+
+stamp-h1: $(srcdir)/config.h.in $(top_builddir)/config.status
+       @rm -f stamp-h1
+       cd $(top_builddir) && $(SHELL) ./config.status config.h
+$(srcdir)/config.h.in:  $(am__configure_deps) 
+       ($(am__cd) $(top_srcdir) && $(AUTOHEADER))
+       rm -f stamp-h1
+       touch $@
+
+distclean-hdr:
+       -rm -f config.h stamp-h1
+poppler.pc: $(top_builddir)/config.status $(srcdir)/poppler.pc.in
+       cd $(top_builddir) && $(SHELL) ./config.status $@
+poppler-uninstalled.pc: $(top_builddir)/config.status $(srcdir)/poppler-uninstalled.pc.in
+       cd $(top_builddir) && $(SHELL) ./config.status $@
+poppler-cairo.pc: $(top_builddir)/config.status $(srcdir)/poppler-cairo.pc.in
+       cd $(top_builddir) && $(SHELL) ./config.status $@
+poppler-cairo-uninstalled.pc: $(top_builddir)/config.status $(srcdir)/poppler-cairo-uninstalled.pc.in
+       cd $(top_builddir) && $(SHELL) ./config.status $@
+poppler-splash.pc: $(top_builddir)/config.status $(srcdir)/poppler-splash.pc.in
+       cd $(top_builddir) && $(SHELL) ./config.status $@
+poppler-splash-uninstalled.pc: $(top_builddir)/config.status $(srcdir)/poppler-splash-uninstalled.pc.in
+       cd $(top_builddir) && $(SHELL) ./config.status $@
+poppler-glib.pc: $(top_builddir)/config.status $(srcdir)/poppler-glib.pc.in
+       cd $(top_builddir) && $(SHELL) ./config.status $@
+poppler-glib-uninstalled.pc: $(top_builddir)/config.status $(srcdir)/poppler-glib-uninstalled.pc.in
+       cd $(top_builddir) && $(SHELL) ./config.status $@
+poppler-qt4.pc: $(top_builddir)/config.status $(srcdir)/poppler-qt4.pc.in
+       cd $(top_builddir) && $(SHELL) ./config.status $@
+poppler-qt4-uninstalled.pc: $(top_builddir)/config.status $(srcdir)/poppler-qt4-uninstalled.pc.in
+       cd $(top_builddir) && $(SHELL) ./config.status $@
+poppler-cpp.pc: $(top_builddir)/config.status $(srcdir)/poppler-cpp.pc.in
+       cd $(top_builddir) && $(SHELL) ./config.status $@
+poppler-cpp-uninstalled.pc: $(top_builddir)/config.status $(srcdir)/poppler-cpp-uninstalled.pc.in
+       cd $(top_builddir) && $(SHELL) ./config.status $@
+
+mostlyclean-libtool:
+       -rm -f *.lo
+
+clean-libtool:
+       -rm -rf .libs _libs
+
+distclean-libtool:
+       -rm -f libtool config.lt
+install-pkgconfigDATA: $(pkgconfig_DATA)
+       @$(NORMAL_INSTALL)
+       @list='$(pkgconfig_DATA)'; test -n "$(pkgconfigdir)" || list=; \
+       if test -n "$$list"; then \
+         echo " $(MKDIR_P) '$(DESTDIR)$(pkgconfigdir)'"; \
+         $(MKDIR_P) "$(DESTDIR)$(pkgconfigdir)" || exit 1; \
+       fi; \
+       for p in $$list; do \
+         if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+         echo "$$d$$p"; \
+       done | $(am__base_list) | \
+       while read files; do \
+         echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(pkgconfigdir)'"; \
+         $(INSTALL_DATA) $$files "$(DESTDIR)$(pkgconfigdir)" || exit $$?; \
+       done
+
+uninstall-pkgconfigDATA:
+       @$(NORMAL_UNINSTALL)
+       @list='$(pkgconfig_DATA)'; test -n "$(pkgconfigdir)" || list=; \
+       files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
+       dir='$(DESTDIR)$(pkgconfigdir)'; $(am__uninstall_files_from_dir)
+
+# This directory's subdirectories are mostly independent; you can cd
+# into them and run `make' without going through this Makefile.
+# To change the values of `make' variables: instead of editing Makefiles,
+# (1) if the variable is set in `config.status', edit `config.status'
+#     (which will cause the Makefiles to be regenerated when you run `make');
+# (2) otherwise, pass the desired values on the `make' command line.
+$(RECURSIVE_TARGETS):
+       @fail= failcom='exit 1'; \
+       for f in x $$MAKEFLAGS; do \
+         case $$f in \
+           *=* | --[!k]*);; \
+           *k*) failcom='fail=yes';; \
+         esac; \
+       done; \
+       dot_seen=no; \
+       target=`echo $@ | sed s/-recursive//`; \
+       list='$(SUBDIRS)'; for subdir in $$list; do \
+         echo "Making $$target in $$subdir"; \
+         if test "$$subdir" = "."; then \
+           dot_seen=yes; \
+           local_target="$$target-am"; \
+         else \
+           local_target="$$target"; \
+         fi; \
+         ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
+         || eval $$failcom; \
+       done; \
+       if test "$$dot_seen" = "no"; then \
+         $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \
+       fi; test -z "$$fail"
+
+$(RECURSIVE_CLEAN_TARGETS):
+       @fail= failcom='exit 1'; \
+       for f in x $$MAKEFLAGS; do \
+         case $$f in \
+           *=* | --[!k]*);; \
+           *k*) failcom='fail=yes';; \
+         esac; \
+       done; \
+       dot_seen=no; \
+       case "$@" in \
+         distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \
+         *) list='$(SUBDIRS)' ;; \
+       esac; \
+       rev=''; for subdir in $$list; do \
+         if test "$$subdir" = "."; then :; else \
+           rev="$$subdir $$rev"; \
+         fi; \
+       done; \
+       rev="$$rev ."; \
+       target=`echo $@ | sed s/-recursive//`; \
+       for subdir in $$rev; do \
+         echo "Making $$target in $$subdir"; \
+         if test "$$subdir" = "."; then \
+           local_target="$$target-am"; \
+         else \
+           local_target="$$target"; \
+         fi; \
+         ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
+         || eval $$failcom; \
+       done && test -z "$$fail"
+tags-recursive:
+       list='$(SUBDIRS)'; for subdir in $$list; do \
+         test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \
+       done
+ctags-recursive:
+       list='$(SUBDIRS)'; for subdir in $$list; do \
+         test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \
+       done
+
+ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
+       list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+       unique=`for i in $$list; do \
+           if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+         done | \
+         $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
+             END { if (nonempty) { for (i in files) print i; }; }'`; \
+       mkid -fID $$unique
+tags: TAGS
+
+TAGS: tags-recursive $(HEADERS) $(SOURCES) config.h.in $(TAGS_DEPENDENCIES) \
+               $(TAGS_FILES) $(LISP)
+       set x; \
+       here=`pwd`; \
+       if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \
+         include_option=--etags-include; \
+         empty_fix=.; \
+       else \
+         include_option=--include; \
+         empty_fix=; \
+       fi; \
+       list='$(SUBDIRS)'; for subdir in $$list; do \
+         if test "$$subdir" = .; then :; else \
+           test ! -f $$subdir/TAGS || \
+             set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \
+         fi; \
+       done; \
+       list='$(SOURCES) $(HEADERS) config.h.in $(LISP) $(TAGS_FILES)'; \
+       unique=`for i in $$list; do \
+           if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+         done | \
+         $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
+             END { if (nonempty) { for (i in files) print i; }; }'`; \
+       shift; \
+       if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
+         test -n "$$unique" || unique=$$empty_fix; \
+         if test $$# -gt 0; then \
+           $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+             "$$@" $$unique; \
+         else \
+           $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+             $$unique; \
+         fi; \
+       fi
+ctags: CTAGS
+CTAGS: ctags-recursive $(HEADERS) $(SOURCES) config.h.in $(TAGS_DEPENDENCIES) \
+               $(TAGS_FILES) $(LISP)
+       list='$(SOURCES) $(HEADERS) config.h.in $(LISP) $(TAGS_FILES)'; \
+       unique=`for i in $$list; do \
+           if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+         done | \
+         $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
+             END { if (nonempty) { for (i in files) print i; }; }'`; \
+       test -z "$(CTAGS_ARGS)$$unique" \
+         || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+            $$unique
+
+GTAGS:
+       here=`$(am__cd) $(top_builddir) && pwd` \
+         && $(am__cd) $(top_srcdir) \
+         && gtags -i $(GTAGS_ARGS) "$$here"
+
+distclean-tags:
+       -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+
+distdir: $(DISTFILES)
+       $(am__remove_distdir)
+       test -d "$(distdir)" || mkdir "$(distdir)"
+       @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+       topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+       list='$(DISTFILES)'; \
+         dist_files=`for file in $$list; do echo $$file; done | \
+         sed -e "s|^$$srcdirstrip/||;t" \
+             -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+       case $$dist_files in \
+         */*) $(MKDIR_P) `echo "$$dist_files" | \
+                          sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+                          sort -u` ;; \
+       esac; \
+       for file in $$dist_files; do \
+         if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+         if test -d $$d/$$file; then \
+           dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+           if test -d "$(distdir)/$$file"; then \
+             find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+           fi; \
+           if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+             cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
+             find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+           fi; \
+           cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
+         else \
+           test -f "$(distdir)/$$file" \
+           || cp -p $$d/$$file "$(distdir)/$$file" \
+           || exit 1; \
+         fi; \
+       done
+       @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \
+         if test "$$subdir" = .; then :; else \
+           $(am__make_dryrun) \
+             || test -d "$(distdir)/$$subdir" \
+             || $(MKDIR_P) "$(distdir)/$$subdir" \
+             || exit 1; \
+           dir1=$$subdir; dir2="$(distdir)/$$subdir"; \
+           $(am__relativize); \
+           new_distdir=$$reldir; \
+           dir1=$$subdir; dir2="$(top_distdir)"; \
+           $(am__relativize); \
+           new_top_distdir=$$reldir; \
+           echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \
+           echo "     am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \
+           ($(am__cd) $$subdir && \
+             $(MAKE) $(AM_MAKEFLAGS) \
+               top_distdir="$$new_top_distdir" \
+               distdir="$$new_distdir" \
+               am__remove_distdir=: \
+               am__skip_length_check=: \
+               am__skip_mode_fix=: \
+               distdir) \
+             || exit 1; \
+         fi; \
+       done
+       -test -n "$(am__skip_mode_fix)" \
+       || find "$(distdir)" -type d ! -perm -755 \
+               -exec chmod u+rwx,go+rx {} \; -o \
+         ! -type d ! -perm -444 -links 1 -exec chmod a+r {} \; -o \
+         ! -type d ! -perm -400 -exec chmod a+r {} \; -o \
+         ! -type d ! -perm -444 -exec $(install_sh) -c -m a+r {} {} \; \
+       || chmod -R a+r "$(distdir)"
+dist-gzip: distdir
+       tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz
+       $(am__remove_distdir)
+
+dist-bzip2: distdir
+       tardir=$(distdir) && $(am__tar) | BZIP2=$${BZIP2--9} bzip2 -c >$(distdir).tar.bz2
+       $(am__remove_distdir)
+
+dist-lzip: distdir
+       tardir=$(distdir) && $(am__tar) | lzip -c $${LZIP_OPT--9} >$(distdir).tar.lz
+       $(am__remove_distdir)
+
+dist-lzma: distdir
+       tardir=$(distdir) && $(am__tar) | lzma -9 -c >$(distdir).tar.lzma
+       $(am__remove_distdir)
+
+dist-xz: distdir
+       tardir=$(distdir) && $(am__tar) | XZ_OPT=$${XZ_OPT--e} xz -c >$(distdir).tar.xz
+       $(am__remove_distdir)
+
+dist-tarZ: distdir
+       tardir=$(distdir) && $(am__tar) | compress -c >$(distdir).tar.Z
+       $(am__remove_distdir)
+
+dist-shar: distdir
+       shar $(distdir) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).shar.gz
+       $(am__remove_distdir)
+
+dist-zip: distdir
+       -rm -f $(distdir).zip
+       zip -rq $(distdir).zip $(distdir)
+       $(am__remove_distdir)
+
+dist dist-all: distdir
+       tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz
+       $(am__remove_distdir)
+
+# This target untars the dist file and tries a VPATH configuration.  Then
+# it guarantees that the distribution is self-contained by making another
+# tarfile.
+distcheck: dist
+       case '$(DIST_ARCHIVES)' in \
+       *.tar.gz*) \
+         GZIP=$(GZIP_ENV) gzip -dc $(distdir).tar.gz | $(am__untar) ;;\
+       *.tar.bz2*) \
+         bzip2 -dc $(distdir).tar.bz2 | $(am__untar) ;;\
+       *.tar.lzma*) \
+         lzma -dc $(distdir).tar.lzma | $(am__untar) ;;\
+       *.tar.lz*) \
+         lzip -dc $(distdir).tar.lz | $(am__untar) ;;\
+       *.tar.xz*) \
+         xz -dc $(distdir).tar.xz | $(am__untar) ;;\
+       *.tar.Z*) \
+         uncompress -c $(distdir).tar.Z | $(am__untar) ;;\
+       *.shar.gz*) \
+         GZIP=$(GZIP_ENV) gzip -dc $(distdir).shar.gz | unshar ;;\
+       *.zip*) \
+         unzip $(distdir).zip ;;\
+       esac
+       chmod -R a-w $(distdir); chmod a+w $(distdir)
+       mkdir $(distdir)/_build
+       mkdir $(distdir)/_inst
+       chmod a-w $(distdir)
+       test -d $(distdir)/_build || exit 0; \
+       dc_install_base=`$(am__cd) $(distdir)/_inst && pwd | sed -e 's,^[^:\\/]:[\\/],/,'` \
+         && dc_destdir="$${TMPDIR-/tmp}/am-dc-$$$$/" \
+         && am__cwd=`pwd` \
+         && $(am__cd) $(distdir)/_build \
+         && ../configure --srcdir=.. --prefix="$$dc_install_base" \
+           $(AM_DISTCHECK_CONFIGURE_FLAGS) \
+           $(DISTCHECK_CONFIGURE_FLAGS) \
+         && $(MAKE) $(AM_MAKEFLAGS) \
+         && $(MAKE) $(AM_MAKEFLAGS) dvi \
+         && $(MAKE) $(AM_MAKEFLAGS) check \
+         && $(MAKE) $(AM_MAKEFLAGS) install \
+         && $(MAKE) $(AM_MAKEFLAGS) installcheck \
+         && $(MAKE) $(AM_MAKEFLAGS) uninstall \
+         && $(MAKE) $(AM_MAKEFLAGS) distuninstallcheck_dir="$$dc_install_base" \
+               distuninstallcheck \
+         && chmod -R a-w "$$dc_install_base" \
+         && ({ \
+              (cd ../.. && umask 077 && mkdir "$$dc_destdir") \
+              && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" install \
+              && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" uninstall \
+              && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" \
+                   distuninstallcheck_dir="$$dc_destdir" distuninstallcheck; \
+             } || { rm -rf "$$dc_destdir"; exit 1; }) \
+         && rm -rf "$$dc_destdir" \
+         && $(MAKE) $(AM_MAKEFLAGS) dist \
+         && rm -rf $(DIST_ARCHIVES) \
+         && $(MAKE) $(AM_MAKEFLAGS) distcleancheck \
+         && cd "$$am__cwd" \
+         || exit 1
+       $(am__remove_distdir)
+       @(echo "$(distdir) archives ready for distribution: "; \
+         list='$(DIST_ARCHIVES)'; for i in $$list; do echo $$i; done) | \
+         sed -e 1h -e 1s/./=/g -e 1p -e 1x -e '$$p' -e '$$x'
+distuninstallcheck:
+       @test -n '$(distuninstallcheck_dir)' || { \
+         echo 'ERROR: trying to run $@ with an empty' \
+              '$$(distuninstallcheck_dir)' >&2; \
+         exit 1; \
+       }; \
+       $(am__cd) '$(distuninstallcheck_dir)' || { \
+         echo 'ERROR: cannot chdir into $(distuninstallcheck_dir)' >&2; \
+         exit 1; \
+       }; \
+       test `$(am__distuninstallcheck_listfiles) | wc -l` -eq 0 \
+          || { echo "ERROR: files left after uninstall:" ; \
+               if test -n "$(DESTDIR)"; then \
+                 echo "  (check DESTDIR support)"; \
+               fi ; \
+               $(distuninstallcheck_listfiles) ; \
+               exit 1; } >&2
+distcleancheck: distclean
+       @if test '$(srcdir)' = . ; then \
+         echo "ERROR: distcleancheck can only run from a VPATH build" ; \
+         exit 1 ; \
+       fi
+       @test `$(distcleancheck_listfiles) | wc -l` -eq 0 \
+         || { echo "ERROR: files left in build directory after distclean:" ; \
+              $(distcleancheck_listfiles) ; \
+              exit 1; } >&2
+check-am: all-am
+check: check-recursive
+all-am: Makefile $(DATA) config.h
+installdirs: installdirs-recursive
+installdirs-am:
+       for dir in "$(DESTDIR)$(pkgconfigdir)"; do \
+         test -z "$$dir" || $(MKDIR_P) "$$dir"; \
+       done
+install: install-recursive
+install-exec: install-exec-recursive
+install-data: install-data-recursive
+uninstall: uninstall-recursive
+
+install-am: all-am
+       @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-recursive
+install-strip:
+       if test -z '$(STRIP)'; then \
+         $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+           install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+             install; \
+       else \
+         $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+           install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+           "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
+       fi
+mostlyclean-generic:
+
+clean-generic:
+
+distclean-generic:
+       -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+       -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
+
+maintainer-clean-generic:
+       @echo "This command is intended for maintainers to use"
+       @echo "it deletes files that may require special tools to rebuild."
+clean: clean-recursive
+
+clean-am: clean-generic clean-libtool mostlyclean-am
+
+distclean: distclean-recursive
+       -rm -f $(am__CONFIG_DISTCLEAN_FILES)
+       -rm -f Makefile
+distclean-am: clean-am distclean-generic distclean-hdr \
+       distclean-libtool distclean-local distclean-tags
+
+dvi: dvi-recursive
+
+dvi-am:
+
+html: html-recursive
+
+html-am:
+
+info: info-recursive
+
+info-am:
+
+install-data-am: install-pkgconfigDATA
+
+install-dvi: install-dvi-recursive
+
+install-dvi-am:
+
+install-exec-am:
+
+install-html: install-html-recursive
+
+install-html-am:
+
+install-info: install-info-recursive
+
+install-info-am:
+
+install-man:
+
+install-pdf: install-pdf-recursive
+
+install-pdf-am:
+
+install-ps: install-ps-recursive
+
+install-ps-am:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-recursive
+       -rm -f $(am__CONFIG_DISTCLEAN_FILES)
+       -rm -rf $(top_srcdir)/autom4te.cache
+       -rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-recursive
+
+mostlyclean-am: mostlyclean-generic mostlyclean-libtool
+
+pdf: pdf-recursive
+
+pdf-am:
+
+ps: ps-recursive
+
+ps-am:
+
+uninstall-am: uninstall-pkgconfigDATA
+
+.MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) all \
+       ctags-recursive install-am install-strip tags-recursive
+
+.PHONY: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) CTAGS GTAGS \
+       all all-am am--refresh check check-am clean clean-generic \
+       clean-libtool ctags ctags-recursive dist dist-all dist-bzip2 \
+       dist-gzip dist-lzip dist-lzma dist-shar dist-tarZ dist-xz \
+       dist-zip distcheck distclean distclean-generic distclean-hdr \
+       distclean-libtool distclean-local distclean-tags \
+       distcleancheck distdir distuninstallcheck dvi dvi-am html \
+       html-am info info-am install install-am install-data \
+       install-data-am install-dvi install-dvi-am install-exec \
+       install-exec-am install-html install-html-am install-info \
+       install-info-am install-man install-pdf install-pdf-am \
+       install-pkgconfigDATA install-ps install-ps-am install-strip \
+       installcheck installcheck-am installdirs installdirs-am \
+       maintainer-clean maintainer-clean-generic mostlyclean \
+       mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \
+       tags tags-recursive uninstall uninstall-am \
+       uninstall-pkgconfigDATA
+
+
+distclean-local:
+       if test "$(srcdir)" = "."; then :; else \
+               rm -f ChangeLog; \
+       fi
+
+ChangeLog:
+       $(AM_V_GEN) if test -d "$(srcdir)/.git"; then \
+         (GIT_DIR=$(top_srcdir)/.git ./missing --run git log --stat) | fmt --split-only > $@.tmp \
+         && mv -f $@.tmp $@ \
+         || ($(RM) $@.tmp; \
+             echo Failed to generate ChangeLog, your ChangeLog may be outdated >&2; \
+             (test -f $@ || echo git log is required to generate this file >> $@)); \
+       else \
+         test -f $@ || \
+         (echo A git checkout and git log is required to generate ChangeLog >&2 && \
+         echo A git checkout and git log is required to generate this file >> $@); \
+       fi
+
+.PHONY: ChangeLog
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/NEWS b/NEWS
new file mode 100644 (file)
index 0000000..f73dac0
--- /dev/null
+++ b/NEWS
@@ -0,0 +1,1685 @@
+Release 0.20.4
+        core:
+         * Improvements regarding embeddef file handling. (KDE Bug #306008)
+         * Fix opening some broken files (Bug #14303)
+         * Fix memory leaks
+         * Fix crashes in various broken files
+         * Refine warning to only complain when really needed
+         * Remove function declared but not implemented
+         * Remove execution permissions from a header file
+
+        qt4:
+         * Improvements regarding embeddef file handling. (KDE Bug #306008)
+
+Release 0.20.3
+        core:
+         * If NULL, NULL fails as password try EMPTY, EMPTY before failing (Bug #3498)
+         * SplashOutputDev: Fix bogus memory allocation size in Splash::arbitraryTransformImage (Bug #49523)
+         * SplashOutputDev: Fix segfault when scaleImage returns NULL (Bug #52488)
+         * SplashOutputDev: Blend mode enhancements for CMYK
+         * PSOutputDev: Fix conversion when creating multiple strips (Bug #51982)
+         * PSOutputDev: Fix Bitmaps in level2sep or level3sep (Bug #52384)
+         * PSOutputDev: Fix DeviceN images with alternate Lab colorspace in level 3 PostScript (Bug #51822)
+         * PSOutputDev: Make sure xScale and yScale are always initialized (Bug #52215)
+         * Unify poppler-config.h includes in core "installed" headers (Bug #52193)
+         * Replace c++ style includes with c style ones (Bug #52426)
+
+        utils:
+         * pdfseparate: Return 0 on success
+        
+Release 0.20.2
+        core:
+         * Fix compilation on Windows
+         * Copy resources content defined in the pages dict on save (Bug #51369)
+         * PSOutputDev: Correct %%DocumentCustomColors (Bug #51479)
+         * PSOutputDev: Fix handling of DeviceN images in level 3 PostScript (Bug #51548)
+         * Fix crash in malformed documents
+        
+        qt4:
+         * Do not hang on malformed /Annots objects (Bug #51361)
+
+Release 0.20.1
+        core:
+         * Remove unnecesary transparency group handling in splash (Bug #13487)
+         * Include substitute font name in system font cache (Bug #49826)
+         * Fix logic on SplashBitmap::writeImgFile
+         * PSOutputDev: use setoverprintmode only if rip knows it
+         * Fix crash in malformed documents
+        
+        qt4:
+         * Make TextAnnotation constructor public
+         * Fix saving of default TextAnnotation to xml
+         * Keep page rotation into account when normalizing annotation coords
+        
+        glib:
+         * Fix memory leak when document fails to load
+         * Make sure password is always converted to latin1
+         * Fix typo in documentation
+
+        build system:
+         * Distribute cmake/modules/FindLCMS2.cmake (Bug #49818)
+
+        utils:
+         * pdftohtml: Determine if font is bold or italic based on FontDescriptor (Bug #49758)
+         * pdfseparate: Syntax fixes in the man page
+
+Release 0.20.0
+        core:
+         * Reconstruct xref table if xref needed but missing (Bug #40719)
+         * Fix getFullyQualifiedName with unicode field names (Bug #49256)
+         * SplashOutputDev: Fix rendering of knockout groups (Bug #12185)
+         * SplashOutputDev: Fix cmyk transfer bug (Bug #49341)
+         * Fix crashes in broken documents
+         * Bring back the Outputdev::begin/endMarkedContent virtuals
+         * Build fixes
+        
+        qt4:
+         * Convert propertly unicode encoded field qualified names
+        
+        glib:
+         * glib: Use delete[] to free array allocated with new[] (Bug #48447)
+
+Release 0.19.4
+        core:
+         * Annotation improvements
+         * More compatible file writing
+         * SplashOutputDev: Fix slow rendering of pdf with a lot of image masks in pattern colorspace
+         * Fix crashes in broken documents
+         * Fix spurious warning messages
+        
+        utils:
+         * pdftotext: Add missing section heading to man page
+         * pdftohtml: Fix crash when the destination file does not exist
+        
+        build system:
+         * autoconf: Do not append "-ansi" to CXXFLAG, if "-std=XXX" is already specified.
+         * autoconf: Do not clear FREETYPE_CFLAGS, FREETYPE_LIBS before PKG_CHECK_MODULES()
+         * autoconf: Copying graphics library CFLAGS to cpp frontend Makefile.am
+
+Release 0.19.3
+        core:
+         * Annotation improvements
+         * CairoOutputDev: Fix regression caused by mesh gradients
+         * CairoOutputDev: Use correct userfont font bbox (Bug #48399)
+         * CairoOutputDev: Fix paintTransparencyGroup when both mask and fill opacity are required (Bug #48453)
+         * CairoOutputDev: Ensure 0 width lines with stroke_adjust are aligned
+         * CairoOutputDev: Only align stroke coords for horizontal and vertical lines (Bug #48318)
+         * CairoOutputDev: Fix stroke pattern with transparency group (Bug #48468)
+         * Fix crash in JBIG2Stream decoding
+         * Fix memory leak when looking for a substitute font
+         * Fix page labels to not have a null character at the end
+         * Fix Splash CMYK merge error
+         * ttc<->ttf fallback is expected for CJK font list in for Windows (Bug #48046)
+        
+        qt4:
+         * Annotations can now be modified
+         * Annotations can now be added
+         * Annotations can now be removed
+
+        utils:
+         * pdftohtml: Add producer and version to xml output
+         * pdftohtml: Fix the mask inversion for PNG
+         
+Release 0.19.2
+        core:
+         * Annotation improvements
+         * CairoOutputDev: update cairo mesh pattern to 1.12 api
+         * CairoOutputDev: fix some transparency issues (Bug #47739)
+         * CairoOutputDev: Fix regression in some shadings
+         * TextOutputDev: Don't add newline to last line extracted by TextSelectionDumper (Bug #45955)
+         * CJK font improvements
+         * Improve font matching for non embedded fonts
+         * Fix regression regarding forceRasterize in PSOutputDev
+         * Fix typos glyph names in truetype 'post' table standard mac ordering
+        
+        build system:
+         * minor cmake fixes
+         * misc autoconf fixes
+         * POPPLER_VERSION is now wrapped in quotes
+
+        utils:
+         * pdftohtml: extract mask images even if they are not JPEG (Bug #47186)
+         * pdftohtml: Flip images if they need to (Bug #32340)
+         
+Release 0.19.1
+        core:
+         * Improve CJK suport in PSOutputDev
+         * CJK substitute implementation on WIndows platforms
+         * Do not crash on malformed files with 0 bits in the color map of an image
+         * Fix regression in some PSOutputDev array sizing
+         * Improvements to Annotation editing
+         * Fix logic error in Rendition parsing code (Bug #47063)
+         * Minor API changes to SplashOutputDev (Bug #46622)
+         * Fix mismatch in some functions declarations
+         * Update poppler copyright year
+        
+        utils:
+         * pdftops: Fix -passfonts regression. (Bug #46744)
+         * pdffonts: List the encoding of each font. (Bug #46888)
+         * pdftohtml: Add possibilty of controlling word breaks percentage. (Bug #47022)
+         
+        qt4:
+         * Support for LinkMovie object (Bug #40561)
+         * Support for Media Rendition
+         
+        glib:
+         * Add poppler_fonts_iter_get_encoding
+         * Improvements to the demo
+
+Release 0.19.0
+        core:
+         * Merge Xpdf 3.03
+         * Add support for lcms2
+         * SplashOutputDev: Implement Overprint
+         * PSOutputDev: Implement Overprint
+         * Expand glyph name ligatures such as "ff", "ffi" etc to normal form (Bug #7002)
+         * Use an Identity CharCodeToUnicode for Adobe-Identity and Adobe-UCS collections (Bug #35468)
+         * CairoOutputDev: Avoid setting huge clip area when printing (Bug #44002)
+         * CairoOutputDev: Fix test for rotation (Bug #14619)
+         * CairoOutputDev: Don't read inline image streams twice (Bug #45668)
+         * CairoOutputDev: set mask matrix before drawing an image with a mask (Bug #40828)
+         * Update glyph names to Unicode values mapping (Bug #13131)
+         * Only use Hints table when there are no parse errors (Bug #46459)
+         * Expose POPPLER_VERSION in poppler-config.h
+        
+        utils:
+         * pdftohtml: Output images in -xml mode if no -i option is specified
+         * pdftohtml: Get rid of static data members; merge duplicated jpeg dumping code
+         * pdftohtml: Be more consistent generating the outlines
+         * pdftohtml: Generate outlines in pdftohtml in -xml mode (Bug #56993)
+         * pdftohtml: Combine UTF16 surrogate pairs (Bug #46521)
+         * pdfinfo: Report page rotation
+         * pdfinfo: Decode utf-16 surrogate pairs
+         * pdftoppm: Allow one of -scale-to-[xy] = -1 to mean the aspect ratio is to be preserved (Bug #43393)
+         * pdftocairo: Allow one of -scale-to-[xy] = -1 to mean the aspect ratio is to be preserved
+         * pdffonts: Add -subst option to list the substitute font name and filename
+         * pdfseparate: Produce PDF/X conformant pdf pages if the original PDF was PDF/X conformant
+         * pdfimages: Add -list option to list all images (Bug #46066)
+         * Improve various manpages
+         
+        glib:
+         * Add poppler_fonts_iter_get_substitute_name
+         * Demo improvements
+         * Update gtk-doc makefile and m4 file
+         * Fix typos in documentation
+        
+        qt4:
+         * Add the option of PSConverter creating EPS
+         * Form support improvements
+        
+        build system:
+         * autotools: Print the cairo version required if not found (Bug #44619)
+         * autotools: Print the glib version required if not found
+         * autotools: Use pkgconfig to check for libopenjpeg (Bug #21789)
+         * autotools: Replace openjpeg compile test with a version test
+         * Add a configuration option for the test data dir
+
+Release 0.18.4
+        core:
+         * CairoOutputDev: Restore temporary clip used in CairoOutputDev::fill when painting a mask
+         * CairoOutputDev: Ensure paintTransparencyGroup uses same ctm as beginTransparencyGroup. Bug #29968
+         * CairoOutputDev: Use fabs when comparing the transformed line width. Bug #43441
+         * CairoOutputDev: Remove unused variable in CairoFontEngine.cc. Bug #45442
+         * SplashOutputDev: Do not use 50Kb of stack in SplashXPath::addCurve. Bug #44905
+         * JpegWriter: set image parameters after jpeg_set_defaults(). Bug #45224
+         * OpenJPEG decoder: Set OPJ_DPARAMETERS_IGNORE_PCLR_CMAP_CDEF_FLAG if you have it. Bug #43414
+         * Lexer: convert integer to real when overflow occurs. Bug #45605
+
+        glib:
+         * Various minor introspection and documentation improvements. Bug #44790
+         * Fix return values. Bug #45440. Bug #45441
+         * gtk-doc improvements. Bug #45549
+         * Introspection improvements. Bug #45455
+        
+        utils:
+         * HtmlOutputDev: Proper unicode support when dumping PDF outline. Bug #45572
+         * HtmlOutputDev: Fix leaks. Bug #45805
+         * HtmlOutputDev: Close li tags in generated outlines. Bug #45807
+         * man pages: fix minor issues with hypens and %
+
+        build system:
+         * automake: Link to lcms if needed
+         * automake: Fix build for builddir != srcdir. Bug #45434
+         * automake: Improve moc detection when cross compiling
+         * Fix build with latest mingw-w64 headers. Bug #45407
+        
+        qt4:
+         * remove non-existing 'qt' include dirs
+        
+Release 0.18.3
+        core:
+         * Do not fail if we are trying to save a file with Encrypt that has not been modified. KDE Bug #288045
+         * Include .otf fonts when finding substitute fonts. Bug #44412
+         * Fix stack overflow in PDFDoc::markObject(). Bug #44660
+         * Include strings.h as we use memcpy. Bug #43558
+
+        utils:
+         * pdfunite: Properly initialize globalParams. Bug #44659
+         * pdfseparate: Properly initialize globalParams
+         * Fix iniliazialization of GooString arguments
+
+        build system:
+         * autoconf: Check for cairo-ft and other cairo backends. Bug #43969
+        
+Release 0.18.2
+        core:
+         * Fix leak in GooString when resizing to a smaller string
+         * Fix crash if failing to parse the colorspace. Bug #42793
+         * Make GfxColorSpace::parse accept dicts
+
+        qt4:
+         * Use PDFDoc(wchar_t *, ...) on Windows. Bug #35378
+         * Add missing include
+         * Minor fixes in documentation
+
+        utils:
+         * pdftocairo: Fix crash when rendering only odd/even pages in a printing format
+        
+        build system:
+         * Fix pkg-config files
+        
+Release 0.18.1
+        core:
+         * PSOutputDev: Output PS that does not confuse libspectre
+         * PSOutputDev: Fix tiling pattern fill matrix. Bug #41374
+         * PSOutputDev: Emit non repeating patterns just once
+         * PSOutputDev: Fix uncolored tiling patterns. Bug #41462
+         * CairoOutputDev: Fix crash when using poppler_page_get_image()
+         * CairoOutputDev: Fix various setSoftMask bugs. Bug #41005
+        
+        utils:
+         * pdftocairo: Flush/close files one we are done using them
+         * pdftocairo: Compile in Windows
+        
+        build system:
+         * CMake: Fix typo in option description
+         * CMake: Correctly include fontconfig include dir
+         * Remove poppler-cairo dependency from poppler-glib pkg-config file
+        
+        qt4:
+         * Minor fixes in documentation
+
+Release 0.18.0
+        core:
+         * Fix small memory leak when dealing with marked content
+         * Remove DCTStream::getRawStream since Stream::getNextStream does the same
+        
+        utils:
+         * Rename pdfmerge to pdfunite
+         * Rename pdfextract to pdfseparate
+         * pdfseparate: Complain if %d is not present and it should
+         * Add pdfseparate and pdfunite man pages
+        
+        build system:
+         * Minor cleanup in regarding removed qt code
+
+Release 0.17.4 (0.18 RC)
+        core:
+         * SplashOutputDev: Compile when defining USE_FIXEDPOINT
+         * PNGWriter: Compile with libpng >= 1.5.0
+        
+Release 0.17.3 (0.18 Beta 3)
+        core:
+         * PSOutputDev: Use Patterns for tiling fill when PS level >= 2
+         * PSOutputDev: Avoid using /PatternType if only one instance of the pattern is used
+         * PSOutputDev: Add poppler version as comment in the file
+         * CairoOutputDev: Set mime data for soft masked images (Bug #40192)
+         * CairoOutputDev: Assume printer pixel size is 1/600" when stroking 0 width lines (Bug #39067)
+         * CairoOutputDev: Use cairo_show_text_glyphs() when printing
+         * CairoOutputDev: Fix stroke patterns (Bug #11719)
+         * CairoOutputDev: Fix unique id mime data
+         * CairoOutputDev: fix stroking of very thin lines
+         * CairoOutputDev: align strokes when Stroke Adjust is true and line width <= 1 (Bug #4536)
+         * TextOutputDev: Add TextFontInfo::matches()
+         * Improve PNGWriter
+         * Rework writing of PDF files
+
+        utils:
+         * Introduce pdftocairo - utility for creating png/jpeg/ps/eps/pdf/svg using CairoOutputDev
+         * Introduce pdfextract - utility to extract PDF pages
+         * Introduce pdfmerge - utility to merge PDF files
+         * Fix compilation warning
+         * pdftohtml: Support text rotation (Bug #38586)
+         * Update SEE ALSO section of man pages
+
+        glib:
+         * Add poppler_page_get_text_attributes()
+         * Add text attributes information to text demo
+
+        qt4:
+         * Add a way to get the fully qualified name of a FormField
+         * Minor documentation improvements
+        
+Release 0.17.2 (0.18 Beta 2)
+        core:
+         * EmbeddedFile improvements
+         * don't gmalloc(-1) upon ftell failure
+         * Fix missing content in some pages (Bug #39637)
+         * Improve selection of CJK fonts (Bug #36474)
+         * SplashOutputDev: Implement overprint
+         * SplashOutputDev: Render dots for 0 length dashed lines (Bug #34150)
+         * SplashOutputDev: Fix bad memory access when not using antialias (Bug #37189)
+         * PSOutputDev: Make level2sep and level3sep write cmyk instead of rgb
+         * PSOutputDev: Make level1sep, level2sep and level3sep write gray instead of rgb for gray images
+         * Fix numerical overflow in libopenjpeg JPXStream (Bug #39361)
+         * Fix crash on truncated JPEG/DCT stream (Bug #36693)
+         * Make sure the dict is a page dict (Bugs #35925 #39072)
+         * Fix calculation of startXRefPos
+         * Handle missing startxref properly (Bug #38209)
+         * Parse the "Medium" modifier when asking fontconfig for a font
+         * Header cleanup
+         * Include cleanup
+         * Define cleanup
+
+        glib:
+         * Add missing permissions flags to PopplerPermissions
+         * Add missing permission flags to info demo
+         * Update gtk-doc.make
+         * Add poppler_document_get_n_attachments()
+        
+        utils:
+         * pdftohtml: Fix encoding of PDF document metadata (Bug #37900)
+         * pdftohtml: Fix vertical spacing issues  (Bug #38019)
+         * pdftotext: Fix -htmlmeta to correctly output U+2019 in PDF metadata (Bug #37900)
+         * pdftoppm: Implement overprint
+
+        qt4:
+         * Rework EmbeddedFile internals
+         * Fix possible crash in test
+        
+Release 0.17.1 (0.18 Beta 1)
+        core:
+         * Rework the way form fields tree is built
+         * Cleanup unused parameters/variables
+
+        glib:
+         * Add JavaScript actions
+         * demo: Show javascript actions in actions view
+        
+        qt4:
+         * tests: Turn some assignments to bool into QVERIFY checks
+
+Release 0.17.0 (0.18 Alpha)
+        core:
+         * Splash: Implement tiling patterns
+         * Splash: Support slight hinting
+         * Splash: Radial shading improvements
+         * Splash: General speed improvements
+         * Arthur: Add Hinting API
+         * Cairo: Implement Type 4,5,6,7 shadings using cairo mesh gradients
+         * Cairo: Use the new cairo unique id to set the surface id when printing
+         * PS: Add PS level1 non standard binary output option
+         * PS: Allow setting the rasterization resolution
+         * Form support improvements
+         * Annotation support improvements
+         * General speed improvements
+         * Add support for handling ViewerPreferences
+         * Remove abiword output device
+
+        utils:
+         * pdftoppm: Add -singlefile option (Bug #32025)
+         * pdftoppm: Add TIFF output format support (Bug #32027)
+         * pdftops: Add PS level1 non standard binary output option
+         * pdftops: Allow setting the rasterization resolution
+         * pdftoabw has been removed
+        
+        glib:
+         * Add poppler_form_field_get_action() (Bug 33174)
+         * Remove GDK API
+         * Remove test-poppler-glib
+         * demo: Add a tooltip with current selected character in text demo
+         * demo: show the activation action of form fields if there's one
+
+        cpp:
+         * Add TIFF output possibility
+         * Add PNM output possibility
+
+        qt4:
+         * Support slight hinting
+         * Form support improvements
+        
+        qt3:
+         * The Qt3 frontend has been removed
+        
+        tests:
+         * Merge splash and cairo tests into a single gtk-test tool
+
+Release 0.16.4
+        core:
+         * Small improvements in Annot parsing
+
+        glib:
+         * Add g_return macros to make sure index is correct in form field choice methods
+         * Fix a crash when a choice form field has no items selected in glib-demo
+
+        utils:
+         * Small fixes to the pdftohtml manpage
+         * Fix copyright years
+
+        qt4:
+         * Fix caption of push button fields
+
+Release 0.16.3
+        core:
+         * Increase precision in PS output device
+         * Workaround bug when converting pdf to ps with level1 (Bug #31926)
+         * Fix crash in Splash output device in some broken pdf
+         * Fix infinite loop in some broken files
+         * Fix rendering of some substituted fonts (Bug #34522)
+         * Do not ask Freetype for 0x0 fonts in Splash output device (Bug #34602)
+         * Don't assume y1 > y3 for points of a highlight annotation (Gnome Bug #643028)
+         * Handle fontCIDType2OT when creating freetype font in Cairo output device (Gnome Bug #643273)
+         * Fix crash in some pdf that use ICC color space (Bug #34357)
+
+        glib:
+         * Don't use an uninitialized local variable in demo
+         * Add some introspection markers
+
+        qt4:
+         * Fix crash regression in unicodeToQString (again)
+
+        utils:
+         * pdftotext: Do not crash when using -bbox
+
+Release 0.16.2
+       core:
+        * Fix text extraction for some files
+
+       qt4:
+        * Fix crash regression in unicodeToQString
+
+Release 0.16.1
+       core:
+        * Fix colorspace issues in the Cairo backend (Bug #32746)
+        * Remove declaration of function without implementation
+        * Do not crash in case jpeg_create_decompress fails (Bug #32890)
+        * Fix variable access mismatch (Bug #33063)
+        * Fix converting some pdf to ps with -level1sep (Bug #32365)
+        * Fix line selection, dont check y for Line selections
+        * Include zlib header in PNGWriter.cc
+        * Fix leak in Splash backend when doing axial shaded fills
+        * Fix label to index conversion on multiple prefixes
+
+       glib:
+        * Use NULL instead of FALSE for functions returning a pointer
+        * Fix memory leak in poppler_page_get_text_layout() for pages with no text
+
+       qt4:
+        * Fix unicodeToQString() to correctly decode the Unicode sequence
+
+Release 0.16.0
+
+       core:
+        * Improve the correctness of radial shadings (Bug #32349)
+        * Adapt the zlib-based FlateStream code to API changes  (Bug #32065)
+        * Make PreScanOutputDev be less agressive when deciding to rasterize (Bug #30107)
+        * Fix some warnings in newer gcc in Splash backend
+        * Fix the preliminary bbox/clip calculation in Splash backend
+        * Use A1 instead of A8 for imagemask in the Cairo backend
+        * Windows compile fixes
+
+       utils:
+        * Do not return 99 (or 1) with -h, -v and -printenc (Bug #32149)
+        * Misc style improvements to pdftohtml code
+        * pdftohtml: Remove the -resolution flag introduced in 0.15.0 and fix the
+                     existing -zoom flag
+
+       build system:
+        * Add more warning flags to the default gcc builds
+        * Enable GObject introspection support in the cmake build system
+
+       qt4:
+        * Windows compile fixes
+
+Release 0.15.3 (0.16 RC)
+
+       core:
+        * Improve rendering of radial shadings
+        * Open a broken file (Bug #31861)
+        * Correct parsing of linearization table (Bug #31627)
+        * Find fonts inside patterns (Bug #31948)
+        * [win32] Simplify strtok_r implementation
+        * Use a std::vector<char> instead of a var-length-array of chars
+        * Fix crashes in broken files
+        * Use sets instead of arrays for looking for duplicate fonts
+
+       cpp:
+        * Include correction
+
+       utils:
+        * pdffonts: Remove duplicated code
+
+Release 0.15.2 (0.16 Beta 2)
+
+       core:
+        * Improve shadings and antialias in the Splash backend (Bug #30436)
+        * Linearization improvements
+        * Small improvements to the Arthur backend
+        * Fix calculation of the size of some pages (Bug #30784)
+        * Fix crashes in broken documents
+
+       qt4:
+        * Add Page::renderToPainter() method
+        * Add setDebugErrorFunction() method
+
+       cpp:
+        * Add the hability to render pages to an image
+
+       utils:
+        * Add -p flag to pdfimages
+
+       build system:
+        * Remove -ansi flag for cywin and mingw
+
+Release 0.15.1 (0.16 Beta 1)
+
+       core:
+        * Consider render value when colorizing text (Bug #2807)
+        * Improve rendering of Shading Type 6 and 7
+        * Improve dict lookup speed for big dicts
+        * Fix multiple crashes in malformed PDF files
+        * Fix memory leak in in malformed PDF files
+        * Fix memory leak in the Catalog names
+        * Fix uninitialized uses on DCTScanInfo
+        * Fix a crash when drawing square/circle annots without a border (Bug #30580)
+        * Only clip boxes to mediabox if we are at the page level (Bug #30784)
+        * Do not omit the notdef glyph in the Splash backend
+        * Fix a crash when redering documents with invalid type 3 fonts in the Cairo backend
+        * Form improvements
+        * Add a method to get the PDF file identifier
+
+       glib:
+        * Add more printing options to the API
+        * Add a method to get the PDF file identifier
+        * Add accessor for all PopplerDocument properties
+        * Form improvements
+        * Documentation improvements
+        * Improvements to the demo
+
+       qt4:
+        * Add a callback to know which page has been printed
+        * Add a method to get the PDF file identifier
+        * Optimize GooString to QString conversion
+        * Some more autotests
+        * Update Doxyfile (enables .qch file for assistant)
+
+       build system:
+        * Require Cairo 1.10
+
+       utils:
+        * pdftohtml: Add -s option to generate a single HTML page
+        * pdftotext: Add -bbox option
+
+       cpp:
+        * Add the possibility of loading a document from raw data
+        * Add a method to get the PDF file identifier
+        * Improve Unicode to ustring conversion
+        * Documentation improvements
+        * Update Doxyfile
+
+Release 0.15.0 (0.16 Alpha)
+
+       core:
+        * Remove exception support
+        * Improve creation of Annotations
+        * Fix failure to parse PDF with damaged internal structure. (Bugs #29189 #3870)
+        * Add a way to access the raw text of a page
+        * Speed improvements when reading multiple characters from a given Stream
+        * Speed improvements in the Splash backend
+        * Speed improvement in gray color space calculations
+        * Speed improvement in ICC color space calculations
+        * Speed improvement when reading some fonts
+        * Make GBool a bool instead of an int
+
+       glib:
+        * Add GObject introspection support
+        * Improve creation of Annotations
+        * Add a way to get the coordinates of each character of a page
+        * Add a way to get the page label
+        * Documentation improvements
+        * Support password protected documents in the demo
+        * Support for selection in the demo
+        * Support for adding annotationss in the demo
+        * Misc improvements in the internals
+       
+       qt4:
+        * Add a way to access the raw text of a page
+        * Recognize "Print" as named action
+        * Documentation improvements
+       
+       build system:
+        * Add option for autogen.sh to skip configure
+        * Nicer autogen.sh output
+        * Improvements when build the glib frontend with CMake
+       
+       utils:
+        * pdftohtml: Use splash instead of external gs invocation to render the background
+        * pdftohtml: Let the user specify the resolution of the background. (Bug #29551)
+       
+       cpp:
+        * Add a way to access the raw text of a page
+
+Release 0.14.3
+
+       core:
+        * Tell Windows we are writing/reading binary data from stdout/stdio (Bug #29329)
+        * Fix crash when parsing some Movie elements (KDE Bug #249586)
+
+Release 0.14.2
+
+       core:
+        * Fix rendering of some documents involving tilingPatternFill in the cairo output device
+        * Improve rendering of some annotations
+        * Handle ColorTransform in DCT streams when using libjpeg (Bug #28873)
+        * Fix crash in the ps output device in some files (KDE Bug #246269)
+        * Fix crash in some malformed files (Bug #28842)
+       
+       build system:
+        * Improve build on windows
+        * Add uninstalled .pc file support when using autoconf
+       
+       glib:
+        * Fix a crash when a layer doesn't have a name (Bug #28842)
+       
+       utils:
+        * Fix padding of names in pdftoppm
+
+Release 0.14.1
+
+       core:
+        * Add ObjectStream caching, makes opening some files ten times faster (Bug #26759)
+        * Fix crash when writing to negative coordinates (Bug #28480)
+        * Check objects are the type we want them to be when parsing GfxICCBasedColorSpace
+        * Optimize Splash::compositeBackground
+        * Optimize color space calculations by using sqrt instead of pow 0.5
+        * Fix crash in JBIG2Stream with malformed documents
+       
+       build system:
+        * Make sure we ship two needed cmake files
+        * Do not distribute glib/poppler-features.h and poppler/poppler-config.h
+        * Improve compilation with Sun Studio
+        * Fix linking of the cpp frontend when using autotools
+       
+       glib:
+        * Fix links/annots area for some documents (Bug #28588)
+        * Fix poppler_page_find_tex() when called more than once (Bug #27927)
+       
+       utils:
+        * Add -cropbox to pdftoppm manual
+
+Release 0.14.0
+
+       core:
+        * Fix crash when parsing pdf with broken JBIG2Stream (Bug #28170)
+        * Do not follow loops blindly when parsing XRef (Bug #28172)
+        * Allow quality & progressive mode to be utilised in JpegWriter
+        * Fix potential assert in Lexer code (KDE bug #240208)
+        * Fix opening of files whose /P is stored as unsigned integer
+        * Do not exit() when trying to allocate memory for the XRef fails
+       
+       cpp:
+        * Minor bugfixes
+        * Documentation improvements
+       
+       build system:
+        * Fix build in mingw32 when using autotools
+        * Preserve compiler flags when using cmake
+
+Release 0.13.4 (0.14 RC 1)
+
+       core:
+        * Include standard float.h instead of unportable values.h
+        * Fix first color stop offset of linear gradients. Bug #27837
+        * Fix compilation if JPEG nor PNG is used
+        * Use fabs for doubles instead of abs
+        * Use strtok_r instead strtok
+        * Adjust bbox for line annots when y1 = y2
+        * Some fixes and regressions in the cairo output device
+        * Better check of overlapping of table cells when selecting text
+       
+       cpp:
+        * Make the pkg-config files really work
+        * Fix in/out buffer sizes in some functions
+
+Release 0.13.3 (0.14 Beta 2)
+
+       core:
+        * Fix roll optimization in the PS function interpreter
+        * Correctly parse numbers with '+' sign. Gnome bug #614549
+        * Add support for cached files
+        * Add support for reading a cached file from stdin
+        * Add HTTP support using libcurl, disabled by default
+        * Add some const correctnes to GooString
+        * Rework DCTStream error handling. Bug #26280
+        * Use current fill_opacity when drawing soft masked images in Cairo backend. Gnome bug #614915
+        * Use the topleft of the Rect of text annots to draw
+        * Fix saving update docs that have a compressed xref table. Bug #27450
+        * Parse varius part of the document catalog on demand
+        * Implement colorizing image masks with pattern colorspace in Cairo backend
+        * Fix a crash when rendering 0x0 images in Cairo backend
+        * Check pattern status after setting matrix when rendering images
+        * Improve text selection/extraction order. Bug #3188
+        * Fix pattern size when bbox is not at 0,0
+        * Improve colorizing text and masks in pattern colorspace. Bug #27482
+        * Silence some Illegal entry in bfrange block in ToUnicode CMap. Bug #27728
+
+       utils:
+        * Add the -o[dd] and -e[ven] options to pdftoppm
+        * Allow read from stdin using the new cached files feature
+        * Fix crash in pdftohtml when output filename was shorter than 5 characters
+
+       glib:
+        * Use existing cairo api when rendering to a pixbuf
+        * Compile with -DGSEAL_ENABLE. Bug #27579
+
+Release 0.13.2 (0.14 Beta 1)
+
+       core:
+        * Improve Movie support
+        * Fix experimental Arthur backend to compile when if Splash backend is disable
+        * Fix usage of some streams in the Cairo backend
+        * Small improvements in the experimental Arthur backend
+        * Minor annotation improvements
+        * Rework LinkRendition to follow the spec
+        * Add support for Set-OCG-State actions
+        * Correctly initialize the grayscale softmask color in the Splash backend
+        * Correctly initialize actualText in TextOutputDev when initialization fails
+        * Various MSVC fixes
+
+       glib:
+        * Add support for Movie objects
+        * Add support for Screen annotations
+        * Add support for rendition actions
+        * Add support for OCG State actions
+        * Improvements to the demo
+       
+       qt4:
+        * Always compile the experimental Arthur backend
+        * Minor speed improvement in QPainter usage
+        * Add a search overload that takes doubles instead of QRectF
+       
+       cpp:
+        * Fix iconv usage
+        * use gmtime() when gmtime_r() is not available
+        * Fix building in autotools in windows
+        * {from,to}_utf_8() -> {from,to}_utf8()
+       
+       build system:
+        * Multiple CMake build system fixes
+        * Fix of some DIST targets in autotools
+        * Make finding of Qt3 in autotools use pkg-config
+
+Release 0.13.1 (0.14 Alpha 2)
+
+       core:
+        * New C++ frontend to interface with Poppler using only STL
+        * Use the right matrix for the mask in drawMaskedImage in Cairo output device. Bug #16906
+        * Fix downscaling images when document is rotated in Cairo output device. Bug #26264
+        * GooVector rewrite, old version had "unknown" origins/license
+        * Fix use after free in a error condition
+        * Improve handling of broken commands. Bug #24575
+        * Fix potential use after free in Cairo output device.
+        * Fix regression in painting. Bug #26243
+        * Improve handling of FontConfig. Bug #26544
+        * Only assume the OC is not visible if it exists and is set to no. Bug #26532
+        * Fix a potential crash in Splash font handling on out of memory conditions
+        * Implement writeImgFile for splashModeXBGR8
+        * Several speed increases (around 40% in some documents) in the Splash output device
+        * Improve printing on the Cairo output device
+        * Do not use '\' character in PostScript names
+        * Omit writing of embedded fonts into temporary files in the Cairo output device. Bug #26694
+        * Improve filtering of some images in the Cairo output device. Bugs #25268, #9860
+
+       utils:
+        * pdftoppm: Only swap w with h if rotation is 90 or 270
+       
+       build system:
+        * Add POPPLER_WITH_GDK in cmake build system. Bug #26247
+        * Fix typo: "MULTITHREAD" -> "MULTITHREADED in cmake build system
+        * Wrap #include <jpeglib.h> in extern "C" to fix build. Bug #26351
+        * Add the Win32-specific ENABLE_RELOCATABLE option to cmake build system
+        * Reflect that poppler-glib needs cairo now in cmake build system
+        * Use pkgconfig to detect libpng on autotools build system
+        * Detect the need for nanosleep in solaris in cmake build system. Bug #26650
+
+Release 0.13.0 (0.14 Alpha)
+
+       core:
+        * Improvements to Annotation rendering. Bug #23108
+        * Do not give an error when opening files without pages. Bug #24720
+        * Try to read streams without Length
+        * Do not crop the transformation matrix at an arbitrary value. Bug #25763
+        * Make poppler (optionally) relocatable on Windows
+        * Use a small object cache in GfxResources to cache GState objects
+        * Reduce the number of redundant pattern creations in the Cairo output device
+        * Use colToDbl() to avoid rounding error in the Cairo output device
+        * Fix problems with mask handling in the Cairo output device. Bug #8474
+        * Use a better scale down implementation in the Cairo output device
+        * Various optimizations to the Splash output device
+        * Add the possibility to use floats instead of doubles in the Splash output device. Bug #25578
+        * Write out fixed-content portion of Type 1 fonts in the PS output device
+        
+       build system:
+        * Improvements to the CMake build system
+        * Enable AM_SILENT_RULES by default in autotools
+        * Require glib 2.18
+        * Require GTK+ 2.14
+        * Make fontconfig optional with mingw compiler
+        * Remove makefile.vc
+       
+       glib:
+        * Add support for file attachment annotations
+        * Improvements to the demo
+        * Use TextOutputDev to get TextPage when we haven't rendered the page
+        * Remove support for the Splash output device
+       
+       utils:
+        * pdftoppm can now write to jpeg
+        * pdftoppm embeds the correct resolution in png and jpeg files
+        
+       qt4:
+        * Minor improvements to the tests
+
+Release 0.12.3
+
+       core:
+        * Be more lenient with /Decode key on images. Bug #17439
+        * Correctly initialize fileName in LinkGoToR. Bug #25221
+        * Improve the reconstruction of the XRef for broken files
+        * [Cairo backend] Do not crash on malformed files. Bug #24575
+        * Accept Fontname if FontName is not present. KDE bug #217013
+        * Make PSOutputDev code a bit more resilient
+        * Fix writing of null objects. Bug #25465
+        * [Cairo backend] Fix crash in some documents. GNOME bug #603934
+        * Correctly initialize profileCommands in Gfx constructor
+       
+       build system:
+        * Check for openjpeg in the C++ part as it uses bool in the header. Bug #25103
+       
+Release 0.12.2
+
+       core:
+        * Fix a memory leak when converting to PostScript
+        * Fix crash when reading a font fails. Bug #24525
+        * Make the ICC cache per page instead of global. Bug #24686
+        * Do not accept negative interval lengths in the page labels tree. Bug #24721
+        * Do not crash on files Aspect of Movie objects are reals instead of integers. Bug #24733
+        * Do not render patterns when using CairoImageOutputDev
+        * Allow Transitions dictionary to be a Ref
+        * Do not crash if jpeg_start_decompress fails. KDE bug #214317
+       
+       glib:
+        * Fix CVE-2009-3607
+       
+       qt4:
+        * Use '.' in the annotations XML instead of the decimal separator of the current locale
+
+Release 0.12.1
+
+       core:
+        * Fix compilation on some compilers
+        * Only initialize the font list once in Windows32/MSVC
+        * Do not crash on fonts without CharCodeToUnicode. Bug #24036
+        * Fix regression due to not setting LC_NUMERIC anymore
+        * Improve realibility for Streams with broken Length. Bug #6841
+        * Write the Info into the trailer dict if there is one. Bug #24091
+        * Do not crash when saving files that come from a stream without name. Bug #24090
+        * Improve relability of the save function
+        * Fix the Length value if it was wrong when saving
+        * Fix includes for those using internal headers
+        * Rework how hinting is used in the splash backend. It is disabled by default now
+        * fix constructor of DCTStream when using internal decoder
+        * Security fixes based xpdf 3.02pl4
+       
+       qt4:
+        * Add the possibility of setting wheter to use or not font hinting
+        * Add a way for converters to return more exact errors they had when converting
+        * Check the document is not locked when converting to PS
+       
+       build system:
+        * Compile on Cygwin
+        * Use _WIN32 instead of WIN32. Bug #24259
+        * Add the possibility to pass LIB_SUFFIX when using CMake
+
+Release 0.12.0
+
+       core:
+        * Fix printf format security warnings
+        * Improve rendering of radial shadings. Bug #20238
+        * Better fallback when there's a font type mismatch. Bug #17252
+        * Do not crash on attachments without data stream. Bug #10386
+        * Fix infinite loop in JBIG2Decoder. Bug #23025
+       
+       build system:
+        * Minimizes pkg-config dependencies for Qt frontends
+        * Add automake 1.11 support
+        * Use the newest automake found and not the oldest
+        * Support AM_SILENT_RULES when using automake 1.11
+       
+       utils:
+        * Add common options to pdftoabw
+
+Release 0.11.3 (0.12 RC 1)
+
+       core:
+        * Optimization in the Cairo renderer for some fonts
+        * Do not apply masks when fill color space mode is csPattern in the Cairo renderer. Bug #22216
+        * Check for overflow when parsing integers. Bug #23078
+        * Do not save the font file twice for FreeType fonts in the Cairo renderer. Bug #20491
+        * Use current fill_opacity when drawing images in the Cairo renderer
+        * Fix alpha rendering in some files in the Splash renderer. Bug #22143, #22152
+        * Implement tiling patterns in the Cairo renderer
+        * When converting a cm matrix to PS write 4 significant digits for numbers < 1 not 4 decimals. Bug #23332
+        * Fix changing of locale, now poppler no longer changes LC_NUMERIC to "C"
+        * Return PDF version as two integers instead of as a double
+       
+       Qt4:
+        * Addition of the Color Management API
+        * Small fix to documentation
+        * Fix backwards text search
+       
+       utils:
+        * Add the -png flag to pdftoppm to output to PNG
+
+Release 0.11.2 (0.12 Beta 2)
+
+       core:
+        * Make DecryptStream return sane values for getPos(). Bug #19706
+        * Fix bug when printing pdf with multiple page sizes in duplex mode
+        * Initilize AnnotColot properly when the Array is not correct
+        * Fix crash on some files with forms. Bug #22485
+        * Fix crash in files with invalid embedded files. Bug #22551
+        * Improve FileSpec attribute parsing
+        * Cairo output device improvements. Bugs #10942, #18017, #14160
+        * Implement blend modes in cairo backend
+        * Handle fontType1COT fonts in CairoFontEngine
+        * Fix generation of PS for some files. Bug #18908
+        * Don't use byte_lookup table when color space doesn't support getLine methods. Bug #11027
+        * Fix rendering of PDF files with malformed patterns. Bug #22835
+        * Add the possibility of disabling font substitution in pdftops. Bug #23030
+        * Fix some radio buttons not being detected as such
+       
+       glib:
+        * Improvements to the demo
+       
+       Qt4:
+        * Improvements to the demo
+       
+       build system:
+        * Use gtkbuilder rather than libglade for some tests
+       
+       utils:
+        * Fix bug with noCrop parameter in pdftops 
+
+Release 0.11.1 (0.12 Beta 1)
+
+       core:
+        * Support colorizing text in pattern colorspace. Bug #19670 and #19994
+        * Add the possibility of forcing no hinting of fonts in the Splash backend
+        * Support multiple page sizes when converting to PS. Bug #19777
+        * Also tokens with leading 00 when parsing the char to unicode map. Bug #22025
+        * Improvements of rendering speed in documents using PS transformations a lot. Bug #21562
+        * More work on Annotations support
+        * Use Interpolate flag to decide whether applying image interpolation during rendering. Bug #9860
+        * Handle Streams in CMap definitions. Bug #22334
+        * Fix some bugs in JBIG2Stream handling
+        * Fix dashed line in page 1 of bug 20011
+        * Fix exit(1) when rendering a file
+        * Fix pdftops crash on file from KDE bug #174899
+        * Fix PS generation in some files. Bug #20420
+        * Do not create the GfxColorTransform if the lcms could not be created. Bug #20108
+        * Check Mask entries are int before using them, if they are real cast to int and try to use them. Bug #21841
+        * Use the correct value when creating the V field for form combo boxes
+        * Give an error when using level1sep in pdftops without having CMYK support. Bug #22026
+        * Don't include lcms.h in GfxState.h
+        * Fix splashColorModeNComps to correctly include all values for each SplashColorMode
+        * Add splashClearColor that assigns white to the given colorptr
+        * Kill support for specifying extension in openTmpFile. Bug #21713
+        * Fix "Conditional jump or move depends on uninitialised value". Bug #20011
+       
+       glib:
+        * Add poppler_annot_markup_has_popup()
+        * Hyphenate UTF-8 and UTF-16BE. Bug #21953
+        * Use g_strerror instead of strerror. Bug #22095
+        * Fix a crash when a destination points to an invalid page
+        * Improvements to the demo
+       
+       Qt4:
+        * Add LinkDestination::destinationName()
+        * Do not try to resolve named destinations for GoTo links pointing to external documents
+        * Add Page::thumbnail()
+        * Improvements to the demo
+        * Improvements to the documentation
+       
+       build system:
+        * Build fix for MSVC
+        * Better lcms cmake check comming from kdelibs
+        * Use pkgconfig for autotools lcms check
+        * Remove unneeded files from repo. Bug #22094
+
+Release 0.11.0 (0.12 Alpha)
+
+       core:
+        * Add initial support for color management
+        * Remove case-insensitive matching of filenames in PDFDoc constructor
+        * Fix extraction of some ActualText content
+        * More work on Annotations support
+        * Improve font rendering in Cairo output device
+        * Fix bug in cairo backend with nested masks
+        * Fix cairo luminosity smask rendering
+        * Add optionally text support to Cairo output device
+        * Add the possibility of setting the datadir on runtime
+        * Return an error code instead of a boolean when saving
+        * Make the font scanner more versatile
+        * Small opimization in documents that use PostScriptFunction transforms
+        * Minor optimization to Stream handling
+        * Fix some compile warnings
+       
+       glib:
+        * Optional content support
+        * More work on Annotations support
+        * Improvements to the demo
+        * Documentation improvements
+        * Fix build when compiling with GTK_DISABLE_SINGLE_INCLUDES
+       
+       Qt4:
+        * Support URI actions for Table Of Contents items
+        * Documentation improvements
+        * Improvements to the demo
+        * Add a FontIterator for iterating through the fonts of the document
+       
+       utils:
+        * Allow the use of cropbox in pdftoppm
+        * Make pdftohtml output png images when the image stream is not a jpeg
+        * Make pdftotext accept cropping options like pdftoppm
+        * Support rendering non-square pixels in pdftoppm
+       
+       build system:
+        * Require Cairo 1.8.4 for the Cairo output device
+        * Require CMake 2.6 when using the CMake build system
+        * Optionally require libpng for pdftohtml
+        * Optionally require libcms for color management
+
+Release 0.10.6
+
+       core:
+        * Fix problems that happen when parsing broken JBIG2 files.
+          CVE-2009-0799, CVE-2009-0800, CVE-2009-1179, CVE-2009-1180
+          CVE-2009-1181, CVE-2009-1182, CVE-2009-1183, CVE-2009-1187, CVE-2009-1188
+        * Fix parsing of incorrect border arrays. Bug #19761
+        * Fix clip test for fonts. Bug #20950
+        * Fix getGlyphAdvance to behave correctly on font size changes. Bug #20769
+        * Misc build fixes
+        
+       build system:
+        * Fix the Qt4 version we need
+
+Release 0.10.5
+
+       core:
+        * Read the UF entry if present and prefer it over F in Filespec dictionary
+        * Fix typo that was making CairoOutputDev crash on some files. Bug #17337
+        * Make JBIG2Stream more robust to corrupt input data
+        * Do not blindly follow loops parsing OutlineItem. Bug #18364
+        * Set up the error manager before calling jpeg_create_decompress. Bug #20484
+        * Check there is an optional content config before using it. Bug #20587
+        * Fix rendering of some PDF with OpenType fonts. Bug #20605
+
+       build system:
+        * Yet more support for build on windows
+        * Use AC_CHECK_HEADER to find headers. Bug #20538
+        * Check for pkgconfig before using it
+        * General autotools improvements
+
+Release 0.10.4
+
+       core:
+        * Fix a memory leak when asking for a document-level JS
+        * Do not crash in some PDF we do not parse correctly. Bug #19702
+        * Fix crash on unexepcted form Opt value. Bug #19790
+       
+       utils:
+        * Fix pdfimages to extract i color components per pixel jpeg images. Bug #19789
+
+Release 0.10.3
+
+       core:
+        * Fix a crash on documents with malformed outline. Bug #19024
+        * Fix leak on AnnotScreen destructor. Bug #19095
+        * Fix wrong PS generation when a large image is in Patterns. Bug #18908
+        * Remove BaseFile.h it was never used. Bug #19298
+        * Improve document saving
+        * Fix PS generation of PDF with malformed font Length2 definition
+        * Fix a leak while parsing annotations
+        * Fix rendering of some checkboxes
+       
+       Qt4:
+        * Fix positioning of Form rects on PDF with cropbox
+        * Fix positioning of Annotation rects on PDF with cropbox. Bug #18558.
+        * Small documentation improvements
+        * Make Document::fonts() work when called more than once. Bug #19405
+       
+       build system:
+        * CMake: look harder for openjpeg
+        * CMake: update the poppler core headers installation
+        * Autotools: do not install Function.cc as it's not a header
+       
+       Qt:
+        * Fix deserialization of links right coordinate
+
+Release 0.10.2
+
+       core:
+        * Fix a crash when selecting text in word mode
+        * Fix a crash in some malformed documents (second argument of opMarkPoint is not a dictionary)
+        * Ensure cairo font matrix is invertable. Fixes bugs #18254 and #18429
+        * Fix a memory leak (Bug #18924)
+       
+       Qt4:
+        * Fix deserization of links right coordinate
+       
+       misc:
+        * Fix build on Solaris 10 + Sun Studio 12
+        * Compile with -pedantic
+
+Release 0.10.1
+
+       core:
+        * Improvements in Optional Content support
+        * Small fix in Form support
+        * Fix memory leak in case of error
+        * Fix potential crash on text search
+        * Try render documents with invalid indexed color space parameters. Bug #18374
+        * Fix crash on text extraction when poppler-data is not installed. Bug #18023
+       
+       Qt:
+        * Fix two memory leaks
+       
+       Qt4:
+        * Small documentation improvement
+        * Fix memory leak in the demo code
+
+Release 0.10.0
+
+       core:
+        * Fix crashes on PDF using Stitching or Axial Shading painting
+        * Fix rendering of PDF with Type1 fonts that have more than
+          one encoding definition per line
+        * Do not try to save documents that have Encryption as we
+          do not support that and the user ended with a broken file
+        * Fix crash on files with OptionalContentGroup but no Name
+       
+       Qt4:
+        * Fix the area of the links to be correctly reported on rotated documents
+       
+       misc:
+        * Mingw+Msys should work
+
+Release 0.9.3 (0.10 RC 2)
+
+       core:
+        * Fix rendering regression on some embedded fonts
+        * Fix rendering regression of some special fonts
+        * Fix crash on documents with bogus jpeg data
+       
+       Qt4:
+        * The printing flag defaults to true on PSConverter
+        * Documentation improvement
+       
+       utils:
+        * Fix regression that made HmtlOutputDev ignore jpeg images
+       
+       misc:
+        * Improve compilation on mingw
+
+Release 0.9.2 (0.10 RC 1)
+
+       core:
+        * Fix conversion to PS some files (bug #17645)
+        * Small Form fixes
+        * Small JS fixes
+        * Improve memory usage of the cairo renderer
+       
+       utils:
+        * Fix mismatched free/delete in pdftohtml
+        * Fix memory leak in pdftohtml
+        * Fix crash in pdftohtml
+       
+       glib:
+        * Fix a crash in forms demo
+       
+       misc:
+        * Compile with -pedantic
+
+Release 0.9.1 (0.10 Beta 2)
+
+       Core:
+               * Fix crash on some AESv2 encrypted files (bugs #13972, #16092, #17523)
+               * Improve parsing of broken files (bug #17568)
+               
+       glib frontend:
+               * Minor improvements to the demo application
+       
+       utils:
+               * pdftohtml: Generate the outline file in the same place
+                            of the other generated files (bug #17504)
+
+Release 0.9.0 (0.10 Beta 1)
+
+       Core:
+        * Initial JavaScript support
+        * Annotation improvements
+        * Improvements in the Arthur based renderer
+        * Improvements in the Cairo based renderer
+        * Added a JPEG2000 decoder based on OpenJPEG
+        * Small fixes in ActualText implementation
+        * Fix jpeg rendering when not using the libjpeg based decoder
+        * Movie fixes
+        * Do not get out of memory on documents that specify huge fonts
+        * Emulate Adobe Reader behaviour on documents with duplicate keys in Dictionaries
+        * Forms improvements   
+       
+       Qt4 frontend:
+        * Annotation improvements
+        * Forms improvements
+        * Add the possibility of extracting embedded fonts
+        * Initial Movie support
+        * Documentation improvements
+        * Small improvements in the PS exporter
+       
+       glib frontend:
+        * Annotation improvements
+        * Attachment fixes
+       
+       utils:
+        * updated man pages
+        * Added -listenc to pdfinfo and pdftotext
+
+Release 0.8.7
+
+       Core:
+        * Fix regression in Form rendering
+        * Fix memory leak in the cairo backend
+
+Release 0.8.6
+
+       Core:
+        * Call error() when font loading fails
+        * Be less strict parsing TTF tables (bug #16940)
+        * Fix crash due to uninitialized variable
+
+       Qt 4 frontend:
+        * Make the paper color setting working as it should
+        * Make sure to use the correct page width/height for form widgets coordinates
+
+Release 0.8.5
+
+       Core:
+        * Fix crash on PDF that define a page thumbnail but it's not a Stream
+        * Fix crash when Annots object is not of the desired type
+        * Fix crash when obtaining fonts in PDF where XObjects link themselves in loops
+        * Fix crash on documents with an IRT object
+        * Saving should work much better now
+        * Plug some memory leaks in Annotation handling
+       
+       Utils:
+        * pdftohtml: Don't crash on documents that specify an invalid named dest for a link
+        * pdftohtml: Make html output to keep all the spaces with &nbsp;
+        * pdftohtml: Improve a bit text layout
+        * pdftohtml: Make xml output valid xml
+
+Release 0.8.4
+
+       Core:
+        * Fix leak in ABWOutputDev.cc
+        * Fix uninitialized variable that broke file saving in some cases
+        * Use a single global FT_Library in CairoOutputDev.
+          Fixes some crashes in CairoOutputDev.
+       
+       Qt 4 frontend:
+        * Fix saving over existing files
+       
+       build system:
+        * Make sure Qt4 moc is used to generate moc files in Qt4 frontend
+
+Release 0.8.3
+
+       Core:
+        * Fix crash when reading some PDF with annotations
+        * Fix crash on PDF that reference Optional Content elements that don't exist
+        * Fix leaks on error conditions
+        * Do not limit CharCodeToUnicodeString to 8 characters
+        * Support for surrogates outside the BMP plane
+       
+       Qt 3 frontend:
+        * Fix crash when reading PDF with password
+        * Fix leak when calling scanForFonts()
+       
+       Qt 4 frontend:
+        * Fix the text() method
+       
+       Splash renderer:
+        * Fix compilation with --enable-fixedpoint
+
+Release 0.8.2
+
+       core:
+        * Fix call broken by a fix introduced in 0.8.1
+
+Release 0.8.1
+
+       core:
+        * Do not call FT_Done_Face on a live cairo_font_face_t as it might cause crashes
+        * Do not take into account Colorspace resource subdictionary for image XObjects
+        * Downsample 16 bit per component images to 8 bit per component so they render
+       
+       build system:
+        * Link to pthread when the system needs it
+
+       windows:
+        * Fix comparing against NULL instead against INVALID_HANDLE_VALUE when calling FindFirstFile
+
+Release 0.8.0
+
+       * Fix caching of members in the glib frontend causing issues with rendering
+       * Change glib public api to have a correct naming
+       * Some better error handling on corner cases
+       * Check the document stream is seekable when opening it
+       * Build fixes with autotools and with cmake
+       * Fix infinite recursion on some malformed documents when consulting the fonts
+       * Fix possible crash when asking for Movie contents
+
+Release 0.7.3 (0.8 RC 2)
+
+       * Fix regression in Splash renderer
+       * Fix off-by-one write in Splash
+       * Plug some minor leaks in Optional Content code
+       * Improve error handling when creating a document in the glib frontend
+
+Release 0.7.2 (0.8 RC 1)
+
+       Major Changes:
+        * Improve font matching not forcing default values onto Fontconfig
+        * Add preliminary annotations support in the glib frontend
+        * Initial Movie support in the core
+        * Make GDK dependency optional in glib bindings
+
+       Minor Changes:
+        * Make the core able to read mime types of embedded files
+        * Qt4 API for accessing mime types of embedded files
+        * Handle correctly check state of optional content groups
+          regarding parents state
+        * Avoid setting singular CTM matrices on the Cairo backend
+        * Improved Qt4 API to get character position
+        * Qt4 api documentation improvements
+        * Qt4 minor stability fixes
+        * Proper lib64 Qt detection
+        * Fix build when compiling without cairo support
+
+Release 0.7.1 (0.8 Beta 2)
+
+       Major Changes:
+        * Really distribute CMake files as optional build tool
+        * Initial Optional Content support in core and in the Qt4 frontend
+
+       Minor Changes:
+        * Allow grouped checkboxes to be selected individually
+        * Qt4 demo program improvements
+        * Keep cairo and cairo_shape consistent
+        * Safety checks on Splash renderer so that it does not draw outside the allocated bitmap
+        * Do not try to display bitmaps of invalid size
+        * Fix building with exceptions
+        * Improvements for building with MSVC and CMake
+
+Release 0.7.0 (0.8 Beta 1)
+
+       * Saving support
+       * Partial annotation support
+       * Forms improvements
+       * Add support for ActualText entries
+       * Display characters outside of unicode BMP with TT font
+       * CJK rendering fixes
+       * Implement Adobe Glyph Naming convention for fonts
+       * CMake as optional build tool
+       * Better font scaling for non embedded fonts
+       * Preserve PDF page labels when we output as postscript
+
+Release 0.6.4
+
+       Qt4 frontend:
+        * Fix crash on links that point to a non existant page
+        * Make Document::renderHints return the correct render hints
+        * Fix infinite loop when parsing LineAnnotation
+
+       core:
+        * Fix crash in the Splash renderer when T3 fonts are badly defined
+        * Draw underlined Links correctly
+
+       utils:
+        * Fix two use after free bugs in HtmlOutputDev.cc
+
+       build system:
+        * Fix build on mingw32
+
+       tests:
+        * Distribute the glade file of pdf-inspector
+
+Release 0.6.3
+
+       core:
+        * Fix crash in extra debug code
+
+       glib frontend:
+        * Make sure passwords are passed correctly to poppler core
+
+       Qt frontend:
+        * Fix crash on documents that specify an empty date
+       
+       build system:
+        * Disable gtk tests if the user disabled glib frontend
+
+Release 0.6.2
+
+       poppler core:
+        * Fix CVE-2007-4352, CVE-2007-5392 and CVE-2007-5393
+        * Fix a crash on documents with wrong CCITTFaxStream
+        * Fix a crash in the Cairo renderer with invalid embedded fonts
+        * Fix a crash with invalid TrueType fonts
+        * Check if font is inside the clip area before rendering
+          it to a temporary bitmap in the Splash renderer. Fixes crashes on
+          incorrect documents
+        * Do not use exit(1) on DCTStream errors
+        * Detect form fields at any depth level
+        * Do not generate appearance stream for radio buttons that are not active
+        * mingw fixes
+       
+       build system:
+        * Require fontconfig >= 2.0
+        * builddir != srcdir fixes
+       
+       Qt4 frontend:
+        * Improved documentation
+       
+       misc:
+        * Fix FSF address
+
+Release 0.6.1
+
+       poppler core:
+        * Fix printing with different x and y scale
+        * Fix crash when Form Fields array contains references to non existent objects
+        * Fix crash in CairoOutputDev::drawMaskedImage()
+        * Fix embedded file description not working on some cases
+       
+       Qt4 frontend:
+        * Fix printing issue
+        * Avoid double free
+        * Fix memory leak when dealing with embedded files
+       
+       glib frontend:
+        * Fix build with --disable-cairo-output
+        * Do not return unknown field type for signature form fields
+       
+       build system:
+        * Support automake-1.10
+        * More compatible sh code in qt.m4
+       
+       utils:
+        * Fix build on Sun Studio compiler
+
+Release 0.6
+
+       - CairoOutputDev fixes
+       - Allow pdftoppm to read/write from stdin/stdout
+       - API work on Qt4 frontend
+       - Fix pdfimages produces inverted image for black & white image
+       - Fix error on the NFKC text matching routine
+       - Add support for word and line selections
+       - Do not enforce %%EOF at the end of file
+       - Pad zeroes instead of aborting when rendering 1-bit images
+         and the stream is too short
+       - Update glib bindings documentation
+
+Release 0.5.91 (0.6 Release Candidate 2)
+
+       - Various memory leaks fixed
+       - Compile with --enable-fixedpoint. Bug #11110
+       - Header cleanup
+       - Remove dependency on debugxml. Bug #11187
+       - Allow access to document metadata in glib and qt4 frontends
+       - Several glib API frontend improvements
+       - Fix crash on accessing embedded files
+       - Build on Sun Force compiler
+       - Render '*' instead of the actual content in password form fields
+       - Fix pdftohtml complex output. Bug #9746 and #11610
+       - Windows build fixes
+       - Improve Japanese font support. Bug #11413
+       - Do not exit the program on files that confuse libjpeg
+       - Update required cairo version to 1.4
+       - Fix CVE-2007-3387
+
+Release 0.5.9 (0.6 Release Candidate)
+
+       - Merge xpdf 3.02 changes
+       - Qt4 frontend is not marked anymore as unstable
+       - Support for Sound objects
+       - Support for Opening/Closing page actions 
+       - Support for page duration
+       - Improve PS Tokenizer performance thanks to Scott Turner
+       - Various speed ups by Krzysztof Kowalczyk
+       - Beginning of Interactive Form support by Julien Rebetez
+       - xpdfrc is no longer used for anything
+       - Add AbiWord output device and pdftoabw program by Jauco Noordzij
+       - Fix security issue MOAB-06-01-2007
+       - Lots of bugs fixed
+
+Release 0.5.4
+
+       - Automatically read in CJK encoding files if they're
+          installed (#2984, #7105, #7093).  This works with the new
+          poppler-data package.
+       - Speed ups by Krzysztof Kowalczyk (#8112)
+       - Patch from Dom Lachowicz to let the utils take input on stdin.
+       - Bugs fixed (#8182, #4649, #7906, #8048, #7113, #4515, #3948,
+          #7924, #7780, #7646, #6948, #7788, #7661, #7005)
+
+Release 0.5.3
+
+       - Add poppler as a private requires of poppler-glib.
+       - Allow CairoFont creation to fail more gracefully (#4030).
+       - Back out the rest of krh's type3 font work.
+       - Revert splashModeRGB8 changes.
+       - Add missing poppler-annotation-helper.h.
+
+Release 0.5.2
+
+       - Much improved Qt bindings (Albert Astals Cid).
+       - Cairo backend now supports masked images (Jeff Muizelaar, #6174).
+       - Patches from Kouhei Sutou to make glib bindings more
+         language binding friendly (#6907, #6897, #6899, #6905).
+       - Search now works with ligatures (Ed Catmull, #2929).
+       - The glib bindings now has an entry point to render to a cairo_t.
+       - GCC 4.1 and MSVC compilation fixes.
+       - Memory leaks plugged: #6908, #6947, #6765, #6764, #6187
+       - Misc bug fixes: #6984, #6896, #6913, #6926, #4481, #5951,
+         #6551, #6500, #6492, #6454, #6079, #6167.
+
+Release 0.5.1
+
+       - Support for embedded files.
+       - Handle 0-width lines correctly.
+       - Avoid external file use when opening fonts.
+       - Only use vector fonts returned from fontconfig (#5758).
+       - Fix scaled 1x1 pixmaps use for drawing lines (#3387).
+       - drawSoftMaskedImage support in cairo backend.
+       - Misc bug fixes: #5922, #5946, #5749, #5952, #4030, #5420.
+
+Release 0.5.0
+
+       - Font matching code for non embedded fonts now use fontconfig
+          instead of hard coded list of fonts.
+       - Merge in Xpdf 3.01 changes.
+       - Add command line tools from Xpdf.
+       - Make install of Xpdf header files ./configure'able.
+
+Release 0.4.0
+
+       - Real text selection.
+       - API breakage in glib wrapper: dropping dest_x and dest_y
+         arguments from poppler_page_render_to_pixbuf().
+
+Release 0.3.3
+
+       - New glib API to get document font information (Marco).
+       - More document properties available as glib properties (Emil
+         Soleyman-Zomalan, #3359)
+       - Optimize color conversion for images.
+       - Support for constant opacity.
+       - Fix problems with pkg-config files.
+       - Bugs fixes: #3491, #2911, #3362, #3340, #3265, #3239, #3396.
+
+Release 0.3.2
+
+       - New API to get poppler version and backend type. 
+       - Various font fixes from Albert Astals Cid.
+       - Update to cairo 0.5.0 API, including better font support.
+       - Meta data for the glib binding.
+
+Release 0.3.1
+
+       - Add qt/poppler-private.h to SOURCES
+       - Jeff's path to use zlib instead of builtin decompression.
+       - Bug fixes: #2934, segfault on invalid links, #3114
+
+Release 0.3.0
+
+       - First cut at qt wrapper, including a getText() method for
+         getting text from a page.
+       - More glib functionality: meta data, set page orientation,
+         print to PS
+       - Performance fixes for glib cairo
+       - Bug fixes
+
+Release 0.2.0  (Tue Apr  5 12:32:10 EDT 2005)
+
+       - Add glib wrapper for poppler, which will use cairo rendering
+         if available
+       - Support for page labels
+       - configure and build fixes.
+
+Release 0.1.2  (Wed Mar  9 10:45:58 EST 2005)
+
+       - cairo optimizations and fixes from Jeff Muizelaar
+       - Bump cairo requirement to 0.4
+       - Make cairo and gtk checks fail gracefully
+
+Release 0.1.1
+
+       - Fix issues with installed header files including config.h
+       - Fix a couple of typos in pkg-config files
+       - Install splash and cairo header files when necessary
+
+Release 0.1 - no date yet
+
+       - First release
+       - More NEWS here
diff --git a/README b/README
new file mode 100644 (file)
index 0000000..fa22390
--- /dev/null
+++ b/README
@@ -0,0 +1,37 @@
+This is poppler, a PDF rendering library.
+
+Poppler is a fork of the xpdf PDF viewer developed by Derek Noonburg
+of Glyph and Cog, LLC.  The purpose of forking xpdf is twofold.
+First, we want to provide PDF rendering functionality as a shared
+library, to centralize the maintenance effort.  Today a number of
+applications incorporate the xpdf code base, and whenever a security
+issue is discovered, all these applications exchange patches and put
+out new releases.  In turn, all distributions must package and release
+new version of these xpdf based viewers.  It's safe to say that
+there's a lot of duplicated effort with the current situation.  Even if
+poppler in the short term introduces yet another xpdf derived code
+base to the world, we hope that over time these applications will
+adopt poppler.  After all, we only need one application to use poppler
+to break even.
+
+Second, we would like to move libpoppler forward in a number of areas
+that don't fit within the goals of xpdf.  By design, xpdf depends on
+very few libraries and runs a wide range of X based platforms.  This
+is a strong feature and reasonable design goal.  However, with poppler
+we would like to replace parts of xpdf that are now available as
+standard components of modern Unix desktop environments.  One such
+example is fontconfig, which solves the problem of matching and
+locating fonts on the system, in a standardized and well understood
+way.  Another example is cairo, which provides high quality 2D
+rendering.  See the file TODO for a list of planned changes.
+
+Please note that xpdf, and thus poppler, is licensed under the GPL,
+not the LGPL.  Consequently, any application using poppler must also
+be licensed under the GPL.  If you want to incorporate Xpdf based PDF
+rendering in a closed source product, please contact Glyph & Cog
+(www.glyphandcog.com) for commercial licensing options.
+
+       Kristian Høgsberg, Feb. 27, 2005
+
+
+See the README-XPDF for the original xpdf-3.03 README.
diff --git a/README-XPDF b/README-XPDF
new file mode 100644 (file)
index 0000000..e97791c
--- /dev/null
@@ -0,0 +1,423 @@
+Xpdf
+====
+
+version 3.03
+2011-aug-15
+
+The Xpdf software and documentation are
+copyright 1996-2011 Glyph & Cog, LLC.
+
+Email: derekn@foolabs.com
+WWW: http://www.foolabs.com/xpdf/
+
+The PDF data structures, operators, and specification are
+copyright 1985-2006 Adobe Systems Inc.
+
+
+What is Xpdf?
+-------------
+
+Xpdf is an open source viewer for Portable Document Format (PDF)
+files.  (These are also sometimes also called 'Acrobat' files, from
+the name of Adobe's PDF software.)  The Xpdf project also includes a
+PDF text extractor, PDF-to-PostScript converter, and various other
+utilities.
+
+Xpdf runs under the X Window System on UNIX, VMS, and OS/2.  The non-X
+components (pdftops, pdftotext, etc.) also run on Windows and Mac OSX
+systems and should run on pretty much any system with a decent C++
+compiler.  Xpdf will run on 32-bit and 64-bit machines.
+
+
+License & Distribution
+----------------------
+
+Xpdf is licensed under the GNU General Pulbic License (GPL), version 2
+or 3.  This means that you can distribute derivatives of Xpdf under
+any of the following:
+  - GPL v2 only
+  - GPL v3 only
+  - GPL v2 or v3
+
+The Xpdf source package includes the text of both GPL versions:
+COPYING for GPL v2, COPYING3 for GPL v3.
+
+Please note that Xpdf is NOT licensed under "any later version" of the
+GPL, as I have no idea what those versions will look like.
+
+If you are redistributing unmodified copies of Xpdf (or any of the
+Xpdf tools) in binary form, you need to include all of the
+documentation: README, man pages (or help files), COPYING, and
+COPYING3.
+
+If you want to incorporate the Xpdf source code into another program
+(or create a modified version of Xpdf), and you are distributing that
+program, you have two options: release your program under the GPL (v2
+and/or v3), or purchase a commercial Xpdf source license.
+
+If you're interested in commercial licensing, please see the Glyph &
+Cog web site:
+
+    http://www.glyphandcog.com/
+
+
+Compatibility
+-------------
+
+Xpdf is developed and tested on Linux.
+
+In addition, it has been compiled by others on Solaris, AIX, HP-UX,
+Digital Unix, Irix, and numerous other Unix implementations, as well
+as VMS and OS/2.  It should work on pretty much any system which runs
+X11 and has Unix-like libraries.  You'll need ANSI C++ and C compilers
+to compile it.
+
+The non-X components of Xpdf (pdftops, pdftotext, pdfinfo, pdffonts,
+pdfdetach, pdftoppm, and pdfimages) can also be compiled on Windows
+and Mac OSX systems.  See the Xpdf web page for details.
+
+If you compile Xpdf for a system not listed on the web page, please
+let me know.  If you're willing to make your binary available by ftp
+or on the web, I'll be happy to add a link from the Xpdf web page.  I
+have decided not to host any binaries I didn't compile myself (for
+disk space and support reasons).
+
+If you can't get Xpdf to compile on your system, send me email and
+I'll try to help.
+
+Xpdf has been ported to the Acorn, Amiga, BeOS, and EPOC.  See the
+Xpdf web page for links.
+
+
+Getting Xpdf
+------------
+
+The latest version is available from:
+
+  http://www.foolabs.com/xpdf/
+
+or:
+
+  ftp://ftp.foolabs.com/pub/xpdf/
+
+Source code and several precompiled executables are available.
+
+Announcements of new versions are posted to comp.text.pdf and emailed
+to a list of people.  If you'd like to receive email notification of
+new versions, just let me know.
+
+
+Running Xpdf
+------------
+
+To run xpdf, simply type:
+
+  xpdf file.pdf
+
+To generate a PostScript file, hit the "print" button in xpdf, or run
+pdftops:
+
+  pdftops file.pdf
+
+To generate a plain text file, run pdftotext:
+
+  pdftotext file.pdf
+
+There are five additional utilities (which are fully described in
+their man pages):
+
+  pdfinfo -- dumps a PDF file's Info dictionary (plus some other
+             useful information)
+  pdffonts -- lists the fonts used in a PDF file along with various
+              information for each font
+  pdfdetach -- lists or extracts embedded files (attachments) from a
+               PDF file
+  pdftoppm -- converts a PDF file to a series of PPM/PGM/PBM-format
+              bitmaps
+  pdfimages -- extracts the images from a PDF file
+
+Command line options and many other details are described in the man
+pages (xpdf(1), etc.) and the VMS help files (xpdf.hlp, etc.).
+
+All of these utilities read an optional configuration file: see the
+xpdfrc(5) man page.
+
+
+Upgrading from Xpdf 3.02 (and earlier)
+--------------------------------------
+
+The font configuration system has been changed.  Previous versions
+used mostly separate commands to configure fonts for display and for
+PostScript output.  As of 3.03, configuration options that make sense
+for both display and PS output have been unified.
+
+The following xpdfrc commands have been removed:
+* displayFontT1, displayFontTT: replaced with fontFile
+* displayNamedCIDFontT1, displayNamedCIDFontTT: replaced with fontFile
+* displayCIDFontT1, displayCIDFontTT: replaced with fontFileCC
+* psFont: replaced with psResidentFont
+* psNamedFont16: replaced with psResidentFont16
+* psFont16: replaced with psResidentFontCC
+
+See the xpdfrc(5) man page for more information on the new commands.
+
+Pdftops will now embed external 16-bit fonts (configured with the
+fontFileCC command) when the PDF file refers to a non-embedded font.
+It does not do any subsetting (yet), so the resulting PS files will be
+large.
+
+
+Compiling Xpdf
+--------------
+
+See the separate file, INSTALL.
+
+
+Bugs
+----
+
+If you find a bug in Xpdf, i.e., if it prints an error message,
+crashes, or incorrectly displays a document, and you don't see that
+bug listed here, please send me email, with a pointer (URL, ftp site,
+etc.) to the PDF file.
+
+
+Acknowledgments
+---------------
+
+Thanks to:
+
+* Patrick Voigt for help with the remote server code.
+* Patrick Moreau, Martin P.J. Zinser, and David Mathog for the VMS
+  port.
+* David Boldt and Rick Rodgers for sample man pages.
+* Brendan Miller for the icon idea.
+* Olly Betts for help testing pdftotext.
+* Peter Ganten for the OS/2 port.
+* Michael Richmond for the Win32 port of pdftops and pdftotext and the
+  xpdf/cygwin/XFree86 build instructions.
+* Frank M. Siegert for improvements in the PostScript code.
+* Leo Smiers for the decryption patches.
+* Rainer Menzner for creating t1lib, and for helping me adapt it to
+  xpdf.
+* Pine Tree Systems A/S for funding the OPI and EPS support in
+  pdftops.
+* Easy Software Products for funding several improvements to the
+  PostScript output code.
+* Tom Kacvinsky for help with FreeType and for being my interface to
+  the FreeType team.
+* Theppitak Karoonboonyanan for help with Thai support.
+* Leonard Rosenthol for help and contributions on a bunch of things.
+* Alexandros Diamantidis and Maria Adaloglou for help with Greek
+  support.
+* Lawrence Lai for help with the CJK Unicode maps.
+
+Various people have contributed modifications made for use by the
+pdftex project:
+
+* Han The Thanh
+* Martin Schröder of ArtCom GmbH
+
+
+References
+----------
+
+Adobe Systems Inc., _PDF Reference, sixth edition: Adobe Portable
+Document Format version 1.7_.
+http://www.adobe.com/devnet/pdf/pdf_reference.html
+[The manual for PDF version 1.7.]
+
+Adobe Systems Inc., "Errata for the PDF Reference, sixth edition,
+version 1.7", October 16, 2006.
+http://www.adobe.com/devnet/pdf/pdf_reference.html
+[The errata for the PDF 1.7 spec.]
+
+Adobe Systems Inc., _PostScript Language Reference_, 3rd ed.
+Addison-Wesley, 1999, ISBN 0-201-37922-8.
+[The official PostScript manual.]
+
+Adobe Systems, Inc., _The Type 42 Font Format Specification_,
+Adobe Developer Support Technical Specification #5012.  1998.
+http://partners.adobe.com/asn/developer/pdfs/tn/5012.Type42_Spec.pdf
+[Type 42 is the format used to embed TrueType fonts in PostScript
+files.]
+
+Adobe Systems, Inc., _Adobe CMap and CIDFont Files Specification_,
+Adobe Developer Support Technical Specification #5014.  1995.
+http://www.adobe.com/supportservice/devrelations/PDFS/TN/5014.CIDFont_Spec.pdf
+[CMap file format needed for Japanese and Chinese font support.]
+
+Adobe Systems, Inc., _Adobe-Japan1-4 Character Collection for
+CID-Keyed Fonts_, Adobe Developer Support Technical Note #5078.
+2000.
+http://partners.adobe.com/asn/developer/PDFS/TN/5078.CID_Glyph.pdf
+[The Adobe Japanese character set.]
+
+Adobe Systems, Inc., _Adobe-GB1-4 Character Collection for
+CID-Keyed Fonts_, Adobe Developer Support Technical Note #5079.
+2000.
+http://partners.adobe.com/asn/developer/pdfs/tn/5079.Adobe-GB1-4.pdf
+[The Adobe Chinese GB (simplified) character set.]
+
+Adobe Systems, Inc., _Adobe-CNS1-3 Character Collection for
+CID-Keyed Fonts_, Adobe Developer Support Technical Note #5080.
+2000.
+http://partners.adobe.com/asn/developer/PDFS/TN/5080.CNS_CharColl.pdf
+[The Adobe Chinese CNS (traditional) character set.]
+
+Adobe Systems Inc., _Supporting the DCT Filters in PostScript Level
+2_, Adobe Developer Support Technical Note #5116.  1992.
+http://www.adobe.com/supportservice/devrelations/PDFS/TN/5116.PS2_DCT.PDF
+[Description of the DCTDecode filter parameters.]
+
+Adobe Systems Inc., _Open Prepress Interface (OPI) Specification -
+Version 2.0_, Adobe Developer Support Technical Note #5660.  2000.
+http://partners.adobe.com/asn/developer/PDFS/TN/5660.OPI_2.0.pdf
+
+Adobe Systems Inc., CMap files.
+ftp://ftp.oreilly.com/pub/examples/nutshell/cjkv/adobe/
+[The actual CMap files for the 16-bit CJK encodings.]
+
+Adobe Systems Inc., Unicode glyph lists.
+http://partners.adobe.com/asn/developer/type/unicodegn.html
+http://partners.adobe.com/asn/developer/type/glyphlist.txt
+http://partners.adobe.com/asn/developer/type/corporateuse.txt
+http://partners.adobe.com/asn/developer/type/zapfdingbats.txt
+[Mappings between character names to Unicode.]
+
+Adobe Systems Inc., OpenType Specification v. 1.4.
+http://partners.adobe.com/public/developer/opentype/index_spec.html
+[The OpenType font format spec.]
+
+Aldus Corp., _OPI: Open Prepress Interface Specification 1.3_.  1993.
+http://partners.adobe.com/asn/developer/PDFS/TN/OPI_13.pdf
+
+Anonymous, RC4 source code.
+ftp://ftp.ox.ac.uk/pub/crypto/misc/rc4.tar.gz
+ftp://idea.sec.dsi.unimi.it/pub/crypt/code/rc4.tar.gz
+[This is the algorithm used to encrypt PDF files.]
+
+T. Boutell, et al., "PNG (Portable Network Graphics) Specification,
+Version 1.0".  RFC 2083.
+[PDF uses the PNG filter algorithms.]
+
+CCITT, "Information Technology - Digital Compression and Coding of
+Continuous-tone Still Images - Requirements and Guidelines", CCITT
+Recommendation T.81.
+http://www.w3.org/Graphics/JPEG/
+[The official JPEG spec.]
+
+A. Chernov, "Registration of a Cyrillic Character Set".  RFC 1489.
+[Documentation for the KOI8-R Cyrillic encoding.]
+
+Roman Czyborra, "The ISO 8859 Alphabet Soup".
+http://czyborra.com/charsets/iso8859.html
+[Documentation on the various ISO 859 encodings.]
+
+L. Peter Deutsch, "ZLIB Compressed Data Format Specification version
+3.3".  RFC 1950.
+[Information on the general format used in FlateDecode streams.]
+
+L. Peter Deutsch, "DEFLATE Compressed Data Format Specification
+version 1.3".  RFC 1951.
+[The definition of the compression algorithm used in FlateDecode
+streams.]
+
+Morris Dworkin, "Recommendation for Block Cipher Modes of Operation",
+National Institute of Standards, NIST Special Publication 800-38A,
+2001.
+[The cipher block chaining (CBC) mode used with AES in PDF files.]
+
+Federal Information Processing Standards Publication 197 (FIPS PUBS
+197), "Advanced Encryption Standard (AES)", November 26, 2001.
+[AES encryption, used in PDF 1.6.]
+
+Jim Flowers, "X Logical Font Description Conventions", Version 1.5, X
+Consortium Standard, X Version 11, Release 6.1.
+ftp://ftp.x.org/pub/R6.1/xc/doc/hardcopy/XLFD/xlfd.PS.Z
+[The official specification of X font descriptors, including font
+transformation matrices.]
+
+Foley, van Dam, Feiner, and Hughes, _Computer Graphics: Principles and
+Practice_, 2nd ed.  Addison-Wesley, 1990, ISBN 0-201-12110-7.
+[Colorspace conversion functions, Bezier spline math.]
+
+Robert L. Hummel, _Programmer's Technical Reference: Data and Fax
+Communications_.  Ziff-Davis Press, 1993, ISBN 1-56276-077-7.
+[CCITT Group 3 and 4 fax decoding.]
+
+ISO/IEC, _Information technology -- Lossy/lossless coding of bi-level
+images_.  ISO/IEC 14492, First edition (2001-12-15).
+http://webstore.ansi.org/
+[The official JBIG2 standard.  The final draft of this spec is
+available from http://www.jpeg.org/jbighomepage.html.]
+
+ISO/IEC, _Information technology -- JPEG 2000 image coding system --
+Part 1: Core coding system_.  ISO/IEC 15444-1, First edition
+(2000-12-15).
+http://webstore.ansi.org/
+[The official JPEG 2000 standard.  The final committee draft of this
+spec is available from http://www.jpeg.org/JPEG2000.html, but there
+were changes made to the bitstream format between that draft and the
+published spec.]
+
+ITU, "Standardization of Group 3 facsimile terminals for document
+transmission", ITU-T Recommendation T.4, 1999.
+ITU, "Facsimile coding schemes and coding control functions for Group 4
+facsimile apparatus", ITU-T Recommendation T.6, 1993.
+http://www.itu.int/
+[The official Group 3 and 4 fax standards - used by the CCITTFaxDecode
+stream, as well as the JBIG2Decode stream.]
+
+B. Kaliski, "PKCS #5: Password-Based Cryptography Specification,
+Version 2.0".  RFC 2898.
+[Defines the padding scheme used with AES encryption in PDF files.]
+
+Christoph Loeffler, Adriaan Ligtenberg, George S. Moschytz, "Practical
+Fast 1-D DCT Algorithms with 11 Multiplications".  IEEE Intl. Conf. on
+Acoustics, Speech & Signal Processing, 1989, 988-991.
+[The fast IDCT algorithm used in the DCTDecode filter.]
+
+Microsoft, _TrueType 1.0 Font Files_, rev. 1.66.  1995.
+http://www.microsoft.com/typography/tt/tt.htm
+[The TrueType font spec (in MS Word format, naturally).]
+
+V. Ostromoukhov, R.D. Hersch, "Stochastic Clustered-Dot Dithering",
+Conf. Color Imaging: Device-Independent Color, Color Hardcopy, and
+Graphic Arts IV, 1999, SPIE Vol. 3648, 496-505.
+http://diwww.epfl.ch/w3lsp/publications/colour/scd.html
+[The stochastic dithering algorithm used in Xpdf.]
+
+P. Peterlin, "ISO 8859-2 (Latin 2) Resources".
+http://sizif.mf.uni-lj.si/linux/cee/iso8859-2.html
+[This is a web page with all sorts of useful Latin-2 character set and
+font information.]
+
+Charles Poynton, "Color FAQ".
+http://www.inforamp.net/~poynton/ColorFAQ.html
+[The mapping from the CIE 1931 (XYZ) color space to RGB.]
+
+R. Rivest, "The MD5 Message-Digest Algorithm".  RFC 1321.
+[MD5 is used in PDF document encryption.]
+
+Thai Industrial Standard, "Standard for Thai Character Codes for
+Computers", TIS-620-2533 (1990).
+http://www.nectec.or.th/it-standards/std620/std620.htm
+[The TIS-620 Thai encoding.]
+
+Unicode Consortium, "Unicode Home Page".
+http://www.unicode.org/
+[Online copy of the Unicode spec.]
+
+W3C Recommendation, "PNG (Portable Network Graphics) Specification
+Version 1.0".
+http://www.w3.org/Graphics/PNG/
+[Defines the PNG image predictor.]
+
+Gregory K. Wallace, "The JPEG Still Picture Compression Standard".
+ftp://ftp.uu.net/graphics/jpeg/wallace.ps.gz
+[Good description of the JPEG standard.  Also published in CACM, April
+1991, and submitted to IEEE Transactions on Consumer Electronics.]
+
+F. Yergeau, "UTF-8, a transformation format of ISO 10646".  RFC 2279.
+[A commonly used Unicode encoding.]
diff --git a/TODO b/TODO
new file mode 100644 (file)
index 0000000..e067c2a
--- /dev/null
+++ b/TODO
@@ -0,0 +1,40 @@
+* general items:
+       - Investigate better (that is, normal) text selection.
+       - Use PDF font descriptors to create an FcPattern.
+       - Add simle performance benchmark that takes a pdf and renders
+         every page 100 times or so.  Start keeping track of
+         performance.
+       - make color space conversion stuff more sane (right now we
+         hack around some of it in the cairo backend)
+       - move away from getChar to a more read(2) like interface
+
+* core:
+       - use libtiff for ccitt decoding?
+
+* Qt4 frontend:
+       - expose Rendition media through the MovieObject API
+       - use Q_GLOBAL_STATIC for GlobalParams?
+       - use QSettings or another system for loading/saving Document/global settings?
+       - expose API for lcms/color management system
+       - make the ArthurOutputDev optional
+
+* glib frontend:
+        - Sound/Movie actions support
+       - API to create annotations
+
+* new frontends:
+       - Java/JNI-based frontend for Android
+
+* cairo backend:
+       - Implement linear/radial gradients with cairo gradients
+       - PDF Blend Modes
+       - Make the cairo backend feature complete and optimize the
+         heck out of it.
+
+Jeff Muizelaar's TODO:
+       Short Term:
+       - factor out some of the color conversion code from CairoOutputDev and ArthurOutputDev.
+       - fix patterned text fills.
+       Long Term:
+       - use cairo glyph cache for type3 fonts.
+       - try to use cairo pattern support.
diff --git a/aclocal.m4 b/aclocal.m4
new file mode 100644 (file)
index 0000000..f575730
--- /dev/null
@@ -0,0 +1,2211 @@
+# generated automatically by aclocal 1.11.5 -*- Autoconf -*-
+
+# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004,
+# 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software Foundation,
+# Inc.
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+m4_ifndef([AC_AUTOCONF_VERSION],
+  [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl
+m4_if(m4_defn([AC_AUTOCONF_VERSION]), [2.69],,
+[m4_warning([this file was generated for autoconf 2.69.
+You have another version of autoconf.  It may work, but is not guaranteed to.
+If you have problems, you may need to regenerate the build system entirely.
+To do so, use the procedure documented by the package, typically `autoreconf'.])])
+
+# lib-link.m4 serial 21 (gettext-0.18)
+dnl Copyright (C) 2001-2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+dnl From Bruno Haible.
+
+AC_PREREQ([2.54])
+
+dnl AC_LIB_LINKFLAGS(name [, dependencies]) searches for libname and
+dnl the libraries corresponding to explicit and implicit dependencies.
+dnl Sets and AC_SUBSTs the LIB${NAME} and LTLIB${NAME} variables and
+dnl augments the CPPFLAGS variable.
+dnl Sets and AC_SUBSTs the LIB${NAME}_PREFIX variable to nonempty if libname
+dnl was found in ${LIB${NAME}_PREFIX}/$acl_libdirstem.
+AC_DEFUN([AC_LIB_LINKFLAGS],
+[
+  AC_REQUIRE([AC_LIB_PREPARE_PREFIX])
+  AC_REQUIRE([AC_LIB_RPATH])
+  pushdef([Name],[translit([$1],[./-], [___])])
+  pushdef([NAME],[translit([$1],[abcdefghijklmnopqrstuvwxyz./-],
+                                [ABCDEFGHIJKLMNOPQRSTUVWXYZ___])])
+  AC_CACHE_CHECK([how to link with lib[]$1], [ac_cv_lib[]Name[]_libs], [
+    AC_LIB_LINKFLAGS_BODY([$1], [$2])
+    ac_cv_lib[]Name[]_libs="$LIB[]NAME"
+    ac_cv_lib[]Name[]_ltlibs="$LTLIB[]NAME"
+    ac_cv_lib[]Name[]_cppflags="$INC[]NAME"
+    ac_cv_lib[]Name[]_prefix="$LIB[]NAME[]_PREFIX"
+  ])
+  LIB[]NAME="$ac_cv_lib[]Name[]_libs"
+  LTLIB[]NAME="$ac_cv_lib[]Name[]_ltlibs"
+  INC[]NAME="$ac_cv_lib[]Name[]_cppflags"
+  LIB[]NAME[]_PREFIX="$ac_cv_lib[]Name[]_prefix"
+  AC_LIB_APPENDTOVAR([CPPFLAGS], [$INC]NAME)
+  AC_SUBST([LIB]NAME)
+  AC_SUBST([LTLIB]NAME)
+  AC_SUBST([LIB]NAME[_PREFIX])
+  dnl Also set HAVE_LIB[]NAME so that AC_LIB_HAVE_LINKFLAGS can reuse the
+  dnl results of this search when this library appears as a dependency.
+  HAVE_LIB[]NAME=yes
+  popdef([NAME])
+  popdef([Name])
+])
+
+dnl AC_LIB_HAVE_LINKFLAGS(name, dependencies, includes, testcode, [missing-message])
+dnl searches for libname and the libraries corresponding to explicit and
+dnl implicit dependencies, together with the specified include files and
+dnl the ability to compile and link the specified testcode. The missing-message
+dnl defaults to 'no' and may contain additional hints for the user.
+dnl If found, it sets and AC_SUBSTs HAVE_LIB${NAME}=yes and the LIB${NAME}
+dnl and LTLIB${NAME} variables and augments the CPPFLAGS variable, and
+dnl #defines HAVE_LIB${NAME} to 1. Otherwise, it sets and AC_SUBSTs
+dnl HAVE_LIB${NAME}=no and LIB${NAME} and LTLIB${NAME} to empty.
+dnl Sets and AC_SUBSTs the LIB${NAME}_PREFIX variable to nonempty if libname
+dnl was found in ${LIB${NAME}_PREFIX}/$acl_libdirstem.
+AC_DEFUN([AC_LIB_HAVE_LINKFLAGS],
+[
+  AC_REQUIRE([AC_LIB_PREPARE_PREFIX])
+  AC_REQUIRE([AC_LIB_RPATH])
+  pushdef([Name],[translit([$1],[./-], [___])])
+  pushdef([NAME],[translit([$1],[abcdefghijklmnopqrstuvwxyz./-],
+                                [ABCDEFGHIJKLMNOPQRSTUVWXYZ___])])
+
+  dnl Search for lib[]Name and define LIB[]NAME, LTLIB[]NAME and INC[]NAME
+  dnl accordingly.
+  AC_LIB_LINKFLAGS_BODY([$1], [$2])
+
+  dnl Add $INC[]NAME to CPPFLAGS before performing the following checks,
+  dnl because if the user has installed lib[]Name and not disabled its use
+  dnl via --without-lib[]Name-prefix, he wants to use it.
+  ac_save_CPPFLAGS="$CPPFLAGS"
+  AC_LIB_APPENDTOVAR([CPPFLAGS], [$INC]NAME)
+
+  AC_CACHE_CHECK([for lib[]$1], [ac_cv_lib[]Name], [
+    ac_save_LIBS="$LIBS"
+    dnl If $LIB[]NAME contains some -l options, add it to the end of LIBS,
+    dnl because these -l options might require -L options that are present in
+    dnl LIBS. -l options benefit only from the -L options listed before it.
+    dnl Otherwise, add it to the front of LIBS, because it may be a static
+    dnl library that depends on another static library that is present in LIBS.
+    dnl Static libraries benefit only from the static libraries listed after
+    dnl it.
+    case " $LIB[]NAME" in
+      *" -l"*) LIBS="$LIBS $LIB[]NAME" ;;
+      *)       LIBS="$LIB[]NAME $LIBS" ;;
+    esac
+    AC_TRY_LINK([$3], [$4],
+      [ac_cv_lib[]Name=yes],
+      [ac_cv_lib[]Name='m4_if([$5], [], [no], [[$5]])'])
+    LIBS="$ac_save_LIBS"
+  ])
+  if test "$ac_cv_lib[]Name" = yes; then
+    HAVE_LIB[]NAME=yes
+    AC_DEFINE([HAVE_LIB]NAME, 1, [Define if you have the lib][$1 library.])
+    AC_MSG_CHECKING([how to link with lib[]$1])
+    AC_MSG_RESULT([$LIB[]NAME])
+  else
+    HAVE_LIB[]NAME=no
+    dnl If $LIB[]NAME didn't lead to a usable library, we don't need
+    dnl $INC[]NAME either.
+    CPPFLAGS="$ac_save_CPPFLAGS"
+    LIB[]NAME=
+    LTLIB[]NAME=
+    LIB[]NAME[]_PREFIX=
+  fi
+  AC_SUBST([HAVE_LIB]NAME)
+  AC_SUBST([LIB]NAME)
+  AC_SUBST([LTLIB]NAME)
+  AC_SUBST([LIB]NAME[_PREFIX])
+  popdef([NAME])
+  popdef([Name])
+])
+
+dnl Determine the platform dependent parameters needed to use rpath:
+dnl   acl_libext,
+dnl   acl_shlibext,
+dnl   acl_hardcode_libdir_flag_spec,
+dnl   acl_hardcode_libdir_separator,
+dnl   acl_hardcode_direct,
+dnl   acl_hardcode_minus_L.
+AC_DEFUN([AC_LIB_RPATH],
+[
+  dnl Tell automake >= 1.10 to complain if config.rpath is missing.
+  m4_ifdef([AC_REQUIRE_AUX_FILE], [AC_REQUIRE_AUX_FILE([config.rpath])])
+  AC_REQUIRE([AC_PROG_CC])                dnl we use $CC, $GCC, $LDFLAGS
+  AC_REQUIRE([AC_LIB_PROG_LD])            dnl we use $LD, $with_gnu_ld
+  AC_REQUIRE([AC_CANONICAL_HOST])         dnl we use $host
+  AC_REQUIRE([AC_CONFIG_AUX_DIR_DEFAULT]) dnl we use $ac_aux_dir
+  AC_CACHE_CHECK([for shared library run path origin], [acl_cv_rpath], [
+    CC="$CC" GCC="$GCC" LDFLAGS="$LDFLAGS" LD="$LD" with_gnu_ld="$with_gnu_ld" \
+    ${CONFIG_SHELL-/bin/sh} "$ac_aux_dir/config.rpath" "$host" > conftest.sh
+    . ./conftest.sh
+    rm -f ./conftest.sh
+    acl_cv_rpath=done
+  ])
+  wl="$acl_cv_wl"
+  acl_libext="$acl_cv_libext"
+  acl_shlibext="$acl_cv_shlibext"
+  acl_libname_spec="$acl_cv_libname_spec"
+  acl_library_names_spec="$acl_cv_library_names_spec"
+  acl_hardcode_libdir_flag_spec="$acl_cv_hardcode_libdir_flag_spec"
+  acl_hardcode_libdir_separator="$acl_cv_hardcode_libdir_separator"
+  acl_hardcode_direct="$acl_cv_hardcode_direct"
+  acl_hardcode_minus_L="$acl_cv_hardcode_minus_L"
+  dnl Determine whether the user wants rpath handling at all.
+  AC_ARG_ENABLE([rpath],
+    [  --disable-rpath         do not hardcode runtime library paths],
+    :, enable_rpath=yes)
+])
+
+dnl AC_LIB_FROMPACKAGE(name, package)
+dnl declares that libname comes from the given package. The configure file
+dnl will then not have a --with-libname-prefix option but a
+dnl --with-package-prefix option. Several libraries can come from the same
+dnl package. This declaration must occur before an AC_LIB_LINKFLAGS or similar
+dnl macro call that searches for libname.
+AC_DEFUN([AC_LIB_FROMPACKAGE],
+[
+  pushdef([NAME],[translit([$1],[abcdefghijklmnopqrstuvwxyz./-],
+                                [ABCDEFGHIJKLMNOPQRSTUVWXYZ___])])
+  define([acl_frompackage_]NAME, [$2])
+  popdef([NAME])
+  pushdef([PACK],[$2])
+  pushdef([PACKUP],[translit(PACK,[abcdefghijklmnopqrstuvwxyz./-],
+                                  [ABCDEFGHIJKLMNOPQRSTUVWXYZ___])])
+  define([acl_libsinpackage_]PACKUP,
+    m4_ifdef([acl_libsinpackage_]PACKUP, [acl_libsinpackage_]PACKUP[[, ]],)[lib$1])
+  popdef([PACKUP])
+  popdef([PACK])
+])
+
+dnl AC_LIB_LINKFLAGS_BODY(name [, dependencies]) searches for libname and
+dnl the libraries corresponding to explicit and implicit dependencies.
+dnl Sets the LIB${NAME}, LTLIB${NAME} and INC${NAME} variables.
+dnl Also, sets the LIB${NAME}_PREFIX variable to nonempty if libname was found
+dnl in ${LIB${NAME}_PREFIX}/$acl_libdirstem.
+AC_DEFUN([AC_LIB_LINKFLAGS_BODY],
+[
+  AC_REQUIRE([AC_LIB_PREPARE_MULTILIB])
+  pushdef([NAME],[translit([$1],[abcdefghijklmnopqrstuvwxyz./-],
+                                [ABCDEFGHIJKLMNOPQRSTUVWXYZ___])])
+  pushdef([PACK],[m4_ifdef([acl_frompackage_]NAME, [acl_frompackage_]NAME, lib[$1])])
+  pushdef([PACKUP],[translit(PACK,[abcdefghijklmnopqrstuvwxyz./-],
+                                  [ABCDEFGHIJKLMNOPQRSTUVWXYZ___])])
+  pushdef([PACKLIBS],[m4_ifdef([acl_frompackage_]NAME, [acl_libsinpackage_]PACKUP, lib[$1])])
+  dnl Autoconf >= 2.61 supports dots in --with options.
+  pushdef([P_A_C_K],[m4_if(m4_version_compare(m4_defn([m4_PACKAGE_VERSION]),[2.61]),[-1],[translit(PACK,[.],[_])],PACK)])
+  dnl By default, look in $includedir and $libdir.
+  use_additional=yes
+  AC_LIB_WITH_FINAL_PREFIX([
+    eval additional_includedir=\"$includedir\"
+    eval additional_libdir=\"$libdir\"
+  ])
+  AC_ARG_WITH(P_A_C_K[-prefix],
+[[  --with-]]P_A_C_K[[-prefix[=DIR]  search for ]PACKLIBS[ in DIR/include and DIR/lib
+  --without-]]P_A_C_K[[-prefix     don't search for ]PACKLIBS[ in includedir and libdir]],
+[
+    if test "X$withval" = "Xno"; then
+      use_additional=no
+    else
+      if test "X$withval" = "X"; then
+        AC_LIB_WITH_FINAL_PREFIX([
+          eval additional_includedir=\"$includedir\"
+          eval additional_libdir=\"$libdir\"
+        ])
+      else
+        additional_includedir="$withval/include"
+        additional_libdir="$withval/$acl_libdirstem"
+        if test "$acl_libdirstem2" != "$acl_libdirstem" \
+           && ! test -d "$withval/$acl_libdirstem"; then
+          additional_libdir="$withval/$acl_libdirstem2"
+        fi
+      fi
+    fi
+])
+  dnl Search the library and its dependencies in $additional_libdir and
+  dnl $LDFLAGS. Using breadth-first-seach.
+  LIB[]NAME=
+  LTLIB[]NAME=
+  INC[]NAME=
+  LIB[]NAME[]_PREFIX=
+  dnl HAVE_LIB${NAME} is an indicator that LIB${NAME}, LTLIB${NAME} have been
+  dnl computed. So it has to be reset here.
+  HAVE_LIB[]NAME=
+  rpathdirs=
+  ltrpathdirs=
+  names_already_handled=
+  names_next_round='$1 $2'
+  while test -n "$names_next_round"; do
+    names_this_round="$names_next_round"
+    names_next_round=
+    for name in $names_this_round; do
+      already_handled=
+      for n in $names_already_handled; do
+        if test "$n" = "$name"; then
+          already_handled=yes
+          break
+        fi
+      done
+      if test -z "$already_handled"; then
+        names_already_handled="$names_already_handled $name"
+        dnl See if it was already located by an earlier AC_LIB_LINKFLAGS
+        dnl or AC_LIB_HAVE_LINKFLAGS call.
+        uppername=`echo "$name" | sed -e 'y|abcdefghijklmnopqrstuvwxyz./-|ABCDEFGHIJKLMNOPQRSTUVWXYZ___|'`
+        eval value=\"\$HAVE_LIB$uppername\"
+        if test -n "$value"; then
+          if test "$value" = yes; then
+            eval value=\"\$LIB$uppername\"
+            test -z "$value" || LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$value"
+            eval value=\"\$LTLIB$uppername\"
+            test -z "$value" || LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }$value"
+          else
+            dnl An earlier call to AC_LIB_HAVE_LINKFLAGS has determined
+            dnl that this library doesn't exist. So just drop it.
+            :
+          fi
+        else
+          dnl Search the library lib$name in $additional_libdir and $LDFLAGS
+          dnl and the already constructed $LIBNAME/$LTLIBNAME.
+          found_dir=
+          found_la=
+          found_so=
+          found_a=
+          eval libname=\"$acl_libname_spec\"    # typically: libname=lib$name
+          if test -n "$acl_shlibext"; then
+            shrext=".$acl_shlibext"             # typically: shrext=.so
+          else
+            shrext=
+          fi
+          if test $use_additional = yes; then
+            dir="$additional_libdir"
+            dnl The same code as in the loop below:
+            dnl First look for a shared library.
+            if test -n "$acl_shlibext"; then
+              if test -f "$dir/$libname$shrext"; then
+                found_dir="$dir"
+                found_so="$dir/$libname$shrext"
+              else
+                if test "$acl_library_names_spec" = '$libname$shrext$versuffix'; then
+                  ver=`(cd "$dir" && \
+                        for f in "$libname$shrext".*; do echo "$f"; done \
+                        | sed -e "s,^$libname$shrext\\\\.,," \
+                        | sort -t '.' -n -r -k1,1 -k2,2 -k3,3 -k4,4 -k5,5 \
+                        | sed 1q ) 2>/dev/null`
+                  if test -n "$ver" && test -f "$dir/$libname$shrext.$ver"; then
+                    found_dir="$dir"
+                    found_so="$dir/$libname$shrext.$ver"
+                  fi
+                else
+                  eval library_names=\"$acl_library_names_spec\"
+                  for f in $library_names; do
+                    if test -f "$dir/$f"; then
+                      found_dir="$dir"
+                      found_so="$dir/$f"
+                      break
+                    fi
+                  done
+                fi
+              fi
+            fi
+            dnl Then look for a static library.
+            if test "X$found_dir" = "X"; then
+              if test -f "$dir/$libname.$acl_libext"; then
+                found_dir="$dir"
+                found_a="$dir/$libname.$acl_libext"
+              fi
+            fi
+            if test "X$found_dir" != "X"; then
+              if test -f "$dir/$libname.la"; then
+                found_la="$dir/$libname.la"
+              fi
+            fi
+          fi
+          if test "X$found_dir" = "X"; then
+            for x in $LDFLAGS $LTLIB[]NAME; do
+              AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"])
+              case "$x" in
+                -L*)
+                  dir=`echo "X$x" | sed -e 's/^X-L//'`
+                  dnl First look for a shared library.
+                  if test -n "$acl_shlibext"; then
+                    if test -f "$dir/$libname$shrext"; then
+                      found_dir="$dir"
+                      found_so="$dir/$libname$shrext"
+                    else
+                      if test "$acl_library_names_spec" = '$libname$shrext$versuffix'; then
+                        ver=`(cd "$dir" && \
+                              for f in "$libname$shrext".*; do echo "$f"; done \
+                              | sed -e "s,^$libname$shrext\\\\.,," \
+                              | sort -t '.' -n -r -k1,1 -k2,2 -k3,3 -k4,4 -k5,5 \
+                              | sed 1q ) 2>/dev/null`
+                        if test -n "$ver" && test -f "$dir/$libname$shrext.$ver"; then
+                          found_dir="$dir"
+                          found_so="$dir/$libname$shrext.$ver"
+                        fi
+                      else
+                        eval library_names=\"$acl_library_names_spec\"
+                        for f in $library_names; do
+                          if test -f "$dir/$f"; then
+                            found_dir="$dir"
+                            found_so="$dir/$f"
+                            break
+                          fi
+                        done
+                      fi
+                    fi
+                  fi
+                  dnl Then look for a static library.
+                  if test "X$found_dir" = "X"; then
+                    if test -f "$dir/$libname.$acl_libext"; then
+                      found_dir="$dir"
+                      found_a="$dir/$libname.$acl_libext"
+                    fi
+                  fi
+                  if test "X$found_dir" != "X"; then
+                    if test -f "$dir/$libname.la"; then
+                      found_la="$dir/$libname.la"
+                    fi
+                  fi
+                  ;;
+              esac
+              if test "X$found_dir" != "X"; then
+                break
+              fi
+            done
+          fi
+          if test "X$found_dir" != "X"; then
+            dnl Found the library.
+            LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }-L$found_dir -l$name"
+            if test "X$found_so" != "X"; then
+              dnl Linking with a shared library. We attempt to hardcode its
+              dnl directory into the executable's runpath, unless it's the
+              dnl standard /usr/lib.
+              if test "$enable_rpath" = no \
+                 || test "X$found_dir" = "X/usr/$acl_libdirstem" \
+                 || test "X$found_dir" = "X/usr/$acl_libdirstem2"; then
+                dnl No hardcoding is needed.
+                LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_so"
+              else
+                dnl Use an explicit option to hardcode DIR into the resulting
+                dnl binary.
+                dnl Potentially add DIR to ltrpathdirs.
+                dnl The ltrpathdirs will be appended to $LTLIBNAME at the end.
+                haveit=
+                for x in $ltrpathdirs; do
+                  if test "X$x" = "X$found_dir"; then
+                    haveit=yes
+                    break
+                  fi
+                done
+                if test -z "$haveit"; then
+                  ltrpathdirs="$ltrpathdirs $found_dir"
+                fi
+                dnl The hardcoding into $LIBNAME is system dependent.
+                if test "$acl_hardcode_direct" = yes; then
+                  dnl Using DIR/libNAME.so during linking hardcodes DIR into the
+                  dnl resulting binary.
+                  LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_so"
+                else
+                  if test -n "$acl_hardcode_libdir_flag_spec" && test "$acl_hardcode_minus_L" = no; then
+                    dnl Use an explicit option to hardcode DIR into the resulting
+                    dnl binary.
+                    LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_so"
+                    dnl Potentially add DIR to rpathdirs.
+                    dnl The rpathdirs will be appended to $LIBNAME at the end.
+                    haveit=
+                    for x in $rpathdirs; do
+                      if test "X$x" = "X$found_dir"; then
+                        haveit=yes
+                        break
+                      fi
+                    done
+                    if test -z "$haveit"; then
+                      rpathdirs="$rpathdirs $found_dir"
+                    fi
+                  else
+                    dnl Rely on "-L$found_dir".
+                    dnl But don't add it if it's already contained in the LDFLAGS
+                    dnl or the already constructed $LIBNAME
+                    haveit=
+                    for x in $LDFLAGS $LIB[]NAME; do
+                      AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"])
+                      if test "X$x" = "X-L$found_dir"; then
+                        haveit=yes
+                        break
+                      fi
+                    done
+                    if test -z "$haveit"; then
+                      LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-L$found_dir"
+                    fi
+                    if test "$acl_hardcode_minus_L" != no; then
+                      dnl FIXME: Not sure whether we should use
+                      dnl "-L$found_dir -l$name" or "-L$found_dir $found_so"
+                      dnl here.
+                      LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_so"
+                    else
+                      dnl We cannot use $acl_hardcode_runpath_var and LD_RUN_PATH
+                      dnl here, because this doesn't fit in flags passed to the
+                      dnl compiler. So give up. No hardcoding. This affects only
+                      dnl very old systems.
+                      dnl FIXME: Not sure whether we should use
+                      dnl "-L$found_dir -l$name" or "-L$found_dir $found_so"
+                      dnl here.
+                      LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-l$name"
+                    fi
+                  fi
+                fi
+              fi
+            else
+              if test "X$found_a" != "X"; then
+                dnl Linking with a static library.
+                LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_a"
+              else
+                dnl We shouldn't come here, but anyway it's good to have a
+                dnl fallback.
+                LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-L$found_dir -l$name"
+              fi
+            fi
+            dnl Assume the include files are nearby.
+            additional_includedir=
+            case "$found_dir" in
+              */$acl_libdirstem | */$acl_libdirstem/)
+                basedir=`echo "X$found_dir" | sed -e 's,^X,,' -e "s,/$acl_libdirstem/"'*$,,'`
+                if test "$name" = '$1'; then
+                  LIB[]NAME[]_PREFIX="$basedir"
+                fi
+                additional_includedir="$basedir/include"
+                ;;
+              */$acl_libdirstem2 | */$acl_libdirstem2/)
+                basedir=`echo "X$found_dir" | sed -e 's,^X,,' -e "s,/$acl_libdirstem2/"'*$,,'`
+                if test "$name" = '$1'; then
+                  LIB[]NAME[]_PREFIX="$basedir"
+                fi
+                additional_includedir="$basedir/include"
+                ;;
+            esac
+            if test "X$additional_includedir" != "X"; then
+              dnl Potentially add $additional_includedir to $INCNAME.
+              dnl But don't add it
+              dnl   1. if it's the standard /usr/include,
+              dnl   2. if it's /usr/local/include and we are using GCC on Linux,
+              dnl   3. if it's already present in $CPPFLAGS or the already
+              dnl      constructed $INCNAME,
+              dnl   4. if it doesn't exist as a directory.
+              if test "X$additional_includedir" != "X/usr/include"; then
+                haveit=
+                if test "X$additional_includedir" = "X/usr/local/include"; then
+                  if test -n "$GCC"; then
+                    case $host_os in
+                      linux* | gnu* | k*bsd*-gnu) haveit=yes;;
+                    esac
+                  fi
+                fi
+                if test -z "$haveit"; then
+                  for x in $CPPFLAGS $INC[]NAME; do
+                    AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"])
+                    if test "X$x" = "X-I$additional_includedir"; then
+                      haveit=yes
+                      break
+                    fi
+                  done
+                  if test -z "$haveit"; then
+                    if test -d "$additional_includedir"; then
+                      dnl Really add $additional_includedir to $INCNAME.
+                      INC[]NAME="${INC[]NAME}${INC[]NAME:+ }-I$additional_includedir"
+                    fi
+                  fi
+                fi
+              fi
+            fi
+            dnl Look for dependencies.
+            if test -n "$found_la"; then
+              dnl Read the .la file. It defines the variables
+              dnl dlname, library_names, old_library, dependency_libs, current,
+              dnl age, revision, installed, dlopen, dlpreopen, libdir.
+              save_libdir="$libdir"
+              case "$found_la" in
+                */* | *\\*) . "$found_la" ;;
+                *) . "./$found_la" ;;
+              esac
+              libdir="$save_libdir"
+              dnl We use only dependency_libs.
+              for dep in $dependency_libs; do
+                case "$dep" in
+                  -L*)
+                    additional_libdir=`echo "X$dep" | sed -e 's/^X-L//'`
+                    dnl Potentially add $additional_libdir to $LIBNAME and $LTLIBNAME.
+                    dnl But don't add it
+                    dnl   1. if it's the standard /usr/lib,
+                    dnl   2. if it's /usr/local/lib and we are using GCC on Linux,
+                    dnl   3. if it's already present in $LDFLAGS or the already
+                    dnl      constructed $LIBNAME,
+                    dnl   4. if it doesn't exist as a directory.
+                    if test "X$additional_libdir" != "X/usr/$acl_libdirstem" \
+                       && test "X$additional_libdir" != "X/usr/$acl_libdirstem2"; then
+                      haveit=
+                      if test "X$additional_libdir" = "X/usr/local/$acl_libdirstem" \
+                         || test "X$additional_libdir" = "X/usr/local/$acl_libdirstem2"; then
+                        if test -n "$GCC"; then
+                          case $host_os in
+                            linux* | gnu* | k*bsd*-gnu) haveit=yes;;
+                          esac
+                        fi
+                      fi
+                      if test -z "$haveit"; then
+                        haveit=
+                        for x in $LDFLAGS $LIB[]NAME; do
+                          AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"])
+                          if test "X$x" = "X-L$additional_libdir"; then
+                            haveit=yes
+                            break
+                          fi
+                        done
+                        if test -z "$haveit"; then
+                          if test -d "$additional_libdir"; then
+                            dnl Really add $additional_libdir to $LIBNAME.
+                            LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-L$additional_libdir"
+                          fi
+                        fi
+                        haveit=
+                        for x in $LDFLAGS $LTLIB[]NAME; do
+                          AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"])
+                          if test "X$x" = "X-L$additional_libdir"; then
+                            haveit=yes
+                            break
+                          fi
+                        done
+                        if test -z "$haveit"; then
+                          if test -d "$additional_libdir"; then
+                            dnl Really add $additional_libdir to $LTLIBNAME.
+                            LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }-L$additional_libdir"
+                          fi
+                        fi
+                      fi
+                    fi
+                    ;;
+                  -R*)
+                    dir=`echo "X$dep" | sed -e 's/^X-R//'`
+                    if test "$enable_rpath" != no; then
+                      dnl Potentially add DIR to rpathdirs.
+                      dnl The rpathdirs will be appended to $LIBNAME at the end.
+                      haveit=
+                      for x in $rpathdirs; do
+                        if test "X$x" = "X$dir"; then
+                          haveit=yes
+                          break
+                        fi
+                      done
+                      if test -z "$haveit"; then
+                        rpathdirs="$rpathdirs $dir"
+                      fi
+                      dnl Potentially add DIR to ltrpathdirs.
+                      dnl The ltrpathdirs will be appended to $LTLIBNAME at the end.
+                      haveit=
+                      for x in $ltrpathdirs; do
+                        if test "X$x" = "X$dir"; then
+                          haveit=yes
+                          break
+                        fi
+                      done
+                      if test -z "$haveit"; then
+                        ltrpathdirs="$ltrpathdirs $dir"
+                      fi
+                    fi
+                    ;;
+                  -l*)
+                    dnl Handle this in the next round.
+                    names_next_round="$names_next_round "`echo "X$dep" | sed -e 's/^X-l//'`
+                    ;;
+                  *.la)
+                    dnl Handle this in the next round. Throw away the .la's
+                    dnl directory; it is already contained in a preceding -L
+                    dnl option.
+                    names_next_round="$names_next_round "`echo "X$dep" | sed -e 's,^X.*/,,' -e 's,^lib,,' -e 's,\.la$,,'`
+                    ;;
+                  *)
+                    dnl Most likely an immediate library name.
+                    LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$dep"
+                    LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }$dep"
+                    ;;
+                esac
+              done
+            fi
+          else
+            dnl Didn't find the library; assume it is in the system directories
+            dnl known to the linker and runtime loader. (All the system
+            dnl directories known to the linker should also be known to the
+            dnl runtime loader, otherwise the system is severely misconfigured.)
+            LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-l$name"
+            LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }-l$name"
+          fi
+        fi
+      fi
+    done
+  done
+  if test "X$rpathdirs" != "X"; then
+    if test -n "$acl_hardcode_libdir_separator"; then
+      dnl Weird platform: only the last -rpath option counts, the user must
+      dnl pass all path elements in one option. We can arrange that for a
+      dnl single library, but not when more than one $LIBNAMEs are used.
+      alldirs=
+      for found_dir in $rpathdirs; do
+        alldirs="${alldirs}${alldirs:+$acl_hardcode_libdir_separator}$found_dir"
+      done
+      dnl Note: acl_hardcode_libdir_flag_spec uses $libdir and $wl.
+      acl_save_libdir="$libdir"
+      libdir="$alldirs"
+      eval flag=\"$acl_hardcode_libdir_flag_spec\"
+      libdir="$acl_save_libdir"
+      LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$flag"
+    else
+      dnl The -rpath options are cumulative.
+      for found_dir in $rpathdirs; do
+        acl_save_libdir="$libdir"
+        libdir="$found_dir"
+        eval flag=\"$acl_hardcode_libdir_flag_spec\"
+        libdir="$acl_save_libdir"
+        LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$flag"
+      done
+    fi
+  fi
+  if test "X$ltrpathdirs" != "X"; then
+    dnl When using libtool, the option that works for both libraries and
+    dnl executables is -R. The -R options are cumulative.
+    for found_dir in $ltrpathdirs; do
+      LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }-R$found_dir"
+    done
+  fi
+  popdef([P_A_C_K])
+  popdef([PACKLIBS])
+  popdef([PACKUP])
+  popdef([PACK])
+  popdef([NAME])
+])
+
+dnl AC_LIB_APPENDTOVAR(VAR, CONTENTS) appends the elements of CONTENTS to VAR,
+dnl unless already present in VAR.
+dnl Works only for CPPFLAGS, not for LIB* variables because that sometimes
+dnl contains two or three consecutive elements that belong together.
+AC_DEFUN([AC_LIB_APPENDTOVAR],
+[
+  for element in [$2]; do
+    haveit=
+    for x in $[$1]; do
+      AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"])
+      if test "X$x" = "X$element"; then
+        haveit=yes
+        break
+      fi
+    done
+    if test -z "$haveit"; then
+      [$1]="${[$1]}${[$1]:+ }$element"
+    fi
+  done
+])
+
+dnl For those cases where a variable contains several -L and -l options
+dnl referring to unknown libraries and directories, this macro determines the
+dnl necessary additional linker options for the runtime path.
+dnl AC_LIB_LINKFLAGS_FROM_LIBS([LDADDVAR], [LIBSVALUE], [USE-LIBTOOL])
+dnl sets LDADDVAR to linker options needed together with LIBSVALUE.
+dnl If USE-LIBTOOL evaluates to non-empty, linking with libtool is assumed,
+dnl otherwise linking without libtool is assumed.
+AC_DEFUN([AC_LIB_LINKFLAGS_FROM_LIBS],
+[
+  AC_REQUIRE([AC_LIB_RPATH])
+  AC_REQUIRE([AC_LIB_PREPARE_MULTILIB])
+  $1=
+  if test "$enable_rpath" != no; then
+    if test -n "$acl_hardcode_libdir_flag_spec" && test "$acl_hardcode_minus_L" = no; then
+      dnl Use an explicit option to hardcode directories into the resulting
+      dnl binary.
+      rpathdirs=
+      next=
+      for opt in $2; do
+        if test -n "$next"; then
+          dir="$next"
+          dnl No need to hardcode the standard /usr/lib.
+          if test "X$dir" != "X/usr/$acl_libdirstem" \
+             && test "X$dir" != "X/usr/$acl_libdirstem2"; then
+            rpathdirs="$rpathdirs $dir"
+          fi
+          next=
+        else
+          case $opt in
+            -L) next=yes ;;
+            -L*) dir=`echo "X$opt" | sed -e 's,^X-L,,'`
+                 dnl No need to hardcode the standard /usr/lib.
+                 if test "X$dir" != "X/usr/$acl_libdirstem" \
+                    && test "X$dir" != "X/usr/$acl_libdirstem2"; then
+                   rpathdirs="$rpathdirs $dir"
+                 fi
+                 next= ;;
+            *) next= ;;
+          esac
+        fi
+      done
+      if test "X$rpathdirs" != "X"; then
+        if test -n ""$3""; then
+          dnl libtool is used for linking. Use -R options.
+          for dir in $rpathdirs; do
+            $1="${$1}${$1:+ }-R$dir"
+          done
+        else
+          dnl The linker is used for linking directly.
+          if test -n "$acl_hardcode_libdir_separator"; then
+            dnl Weird platform: only the last -rpath option counts, the user
+            dnl must pass all path elements in one option.
+            alldirs=
+            for dir in $rpathdirs; do
+              alldirs="${alldirs}${alldirs:+$acl_hardcode_libdir_separator}$dir"
+            done
+            acl_save_libdir="$libdir"
+            libdir="$alldirs"
+            eval flag=\"$acl_hardcode_libdir_flag_spec\"
+            libdir="$acl_save_libdir"
+            $1="$flag"
+          else
+            dnl The -rpath options are cumulative.
+            for dir in $rpathdirs; do
+              acl_save_libdir="$libdir"
+              libdir="$dir"
+              eval flag=\"$acl_hardcode_libdir_flag_spec\"
+              libdir="$acl_save_libdir"
+              $1="${$1}${$1:+ }$flag"
+            done
+          fi
+        fi
+      fi
+    fi
+  fi
+  AC_SUBST([$1])
+])
+
+# lib-prefix.m4 serial 7 (gettext-0.18)
+dnl Copyright (C) 2001-2005, 2008-2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+dnl From Bruno Haible.
+
+dnl AC_LIB_ARG_WITH is synonymous to AC_ARG_WITH in autoconf-2.13, and
+dnl similar to AC_ARG_WITH in autoconf 2.52...2.57 except that is doesn't
+dnl require excessive bracketing.
+ifdef([AC_HELP_STRING],
+[AC_DEFUN([AC_LIB_ARG_WITH], [AC_ARG_WITH([$1],[[$2]],[$3],[$4])])],
+[AC_DEFUN([AC_][LIB_ARG_WITH], [AC_ARG_WITH([$1],[$2],[$3],[$4])])])
+
+dnl AC_LIB_PREFIX adds to the CPPFLAGS and LDFLAGS the flags that are needed
+dnl to access previously installed libraries. The basic assumption is that
+dnl a user will want packages to use other packages he previously installed
+dnl with the same --prefix option.
+dnl This macro is not needed if only AC_LIB_LINKFLAGS is used to locate
+dnl libraries, but is otherwise very convenient.
+AC_DEFUN([AC_LIB_PREFIX],
+[
+  AC_BEFORE([$0], [AC_LIB_LINKFLAGS])
+  AC_REQUIRE([AC_PROG_CC])
+  AC_REQUIRE([AC_CANONICAL_HOST])
+  AC_REQUIRE([AC_LIB_PREPARE_MULTILIB])
+  AC_REQUIRE([AC_LIB_PREPARE_PREFIX])
+  dnl By default, look in $includedir and $libdir.
+  use_additional=yes
+  AC_LIB_WITH_FINAL_PREFIX([
+    eval additional_includedir=\"$includedir\"
+    eval additional_libdir=\"$libdir\"
+  ])
+  AC_LIB_ARG_WITH([lib-prefix],
+[  --with-lib-prefix[=DIR] search for libraries in DIR/include and DIR/lib
+  --without-lib-prefix    don't search for libraries in includedir and libdir],
+[
+    if test "X$withval" = "Xno"; then
+      use_additional=no
+    else
+      if test "X$withval" = "X"; then
+        AC_LIB_WITH_FINAL_PREFIX([
+          eval additional_includedir=\"$includedir\"
+          eval additional_libdir=\"$libdir\"
+        ])
+      else
+        additional_includedir="$withval/include"
+        additional_libdir="$withval/$acl_libdirstem"
+      fi
+    fi
+])
+  if test $use_additional = yes; then
+    dnl Potentially add $additional_includedir to $CPPFLAGS.
+    dnl But don't add it
+    dnl   1. if it's the standard /usr/include,
+    dnl   2. if it's already present in $CPPFLAGS,
+    dnl   3. if it's /usr/local/include and we are using GCC on Linux,
+    dnl   4. if it doesn't exist as a directory.
+    if test "X$additional_includedir" != "X/usr/include"; then
+      haveit=
+      for x in $CPPFLAGS; do
+        AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"])
+        if test "X$x" = "X-I$additional_includedir"; then
+          haveit=yes
+          break
+        fi
+      done
+      if test -z "$haveit"; then
+        if test "X$additional_includedir" = "X/usr/local/include"; then
+          if test -n "$GCC"; then
+            case $host_os in
+              linux* | gnu* | k*bsd*-gnu) haveit=yes;;
+            esac
+          fi
+        fi
+        if test -z "$haveit"; then
+          if test -d "$additional_includedir"; then
+            dnl Really add $additional_includedir to $CPPFLAGS.
+            CPPFLAGS="${CPPFLAGS}${CPPFLAGS:+ }-I$additional_includedir"
+          fi
+        fi
+      fi
+    fi
+    dnl Potentially add $additional_libdir to $LDFLAGS.
+    dnl But don't add it
+    dnl   1. if it's the standard /usr/lib,
+    dnl   2. if it's already present in $LDFLAGS,
+    dnl   3. if it's /usr/local/lib and we are using GCC on Linux,
+    dnl   4. if it doesn't exist as a directory.
+    if test "X$additional_libdir" != "X/usr/$acl_libdirstem"; then
+      haveit=
+      for x in $LDFLAGS; do
+        AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"])
+        if test "X$x" = "X-L$additional_libdir"; then
+          haveit=yes
+          break
+        fi
+      done
+      if test -z "$haveit"; then
+        if test "X$additional_libdir" = "X/usr/local/$acl_libdirstem"; then
+          if test -n "$GCC"; then
+            case $host_os in
+              linux*) haveit=yes;;
+            esac
+          fi
+        fi
+        if test -z "$haveit"; then
+          if test -d "$additional_libdir"; then
+            dnl Really add $additional_libdir to $LDFLAGS.
+            LDFLAGS="${LDFLAGS}${LDFLAGS:+ }-L$additional_libdir"
+          fi
+        fi
+      fi
+    fi
+  fi
+])
+
+dnl AC_LIB_PREPARE_PREFIX creates variables acl_final_prefix,
+dnl acl_final_exec_prefix, containing the values to which $prefix and
+dnl $exec_prefix will expand at the end of the configure script.
+AC_DEFUN([AC_LIB_PREPARE_PREFIX],
+[
+  dnl Unfortunately, prefix and exec_prefix get only finally determined
+  dnl at the end of configure.
+  if test "X$prefix" = "XNONE"; then
+    acl_final_prefix="$ac_default_prefix"
+  else
+    acl_final_prefix="$prefix"
+  fi
+  if test "X$exec_prefix" = "XNONE"; then
+    acl_final_exec_prefix='${prefix}'
+  else
+    acl_final_exec_prefix="$exec_prefix"
+  fi
+  acl_save_prefix="$prefix"
+  prefix="$acl_final_prefix"
+  eval acl_final_exec_prefix=\"$acl_final_exec_prefix\"
+  prefix="$acl_save_prefix"
+])
+
+dnl AC_LIB_WITH_FINAL_PREFIX([statement]) evaluates statement, with the
+dnl variables prefix and exec_prefix bound to the values they will have
+dnl at the end of the configure script.
+AC_DEFUN([AC_LIB_WITH_FINAL_PREFIX],
+[
+  acl_save_prefix="$prefix"
+  prefix="$acl_final_prefix"
+  acl_save_exec_prefix="$exec_prefix"
+  exec_prefix="$acl_final_exec_prefix"
+  $1
+  exec_prefix="$acl_save_exec_prefix"
+  prefix="$acl_save_prefix"
+])
+
+dnl AC_LIB_PREPARE_MULTILIB creates
+dnl - a variable acl_libdirstem, containing the basename of the libdir, either
+dnl   "lib" or "lib64" or "lib/64",
+dnl - a variable acl_libdirstem2, as a secondary possible value for
+dnl   acl_libdirstem, either the same as acl_libdirstem or "lib/sparcv9" or
+dnl   "lib/amd64".
+AC_DEFUN([AC_LIB_PREPARE_MULTILIB],
+[
+  dnl There is no formal standard regarding lib and lib64.
+  dnl On glibc systems, the current practice is that on a system supporting
+  dnl 32-bit and 64-bit instruction sets or ABIs, 64-bit libraries go under
+  dnl $prefix/lib64 and 32-bit libraries go under $prefix/lib. We determine
+  dnl the compiler's default mode by looking at the compiler's library search
+  dnl path. If at least one of its elements ends in /lib64 or points to a
+  dnl directory whose absolute pathname ends in /lib64, we assume a 64-bit ABI.
+  dnl Otherwise we use the default, namely "lib".
+  dnl On Solaris systems, the current practice is that on a system supporting
+  dnl 32-bit and 64-bit instruction sets or ABIs, 64-bit libraries go under
+  dnl $prefix/lib/64 (which is a symlink to either $prefix/lib/sparcv9 or
+  dnl $prefix/lib/amd64) and 32-bit libraries go under $prefix/lib.
+  AC_REQUIRE([AC_CANONICAL_HOST])
+  acl_libdirstem=lib
+  acl_libdirstem2=
+  case "$host_os" in
+    solaris*)
+      dnl See Solaris 10 Software Developer Collection > Solaris 64-bit Developer's Guide > The Development Environment
+      dnl <http://docs.sun.com/app/docs/doc/816-5138/dev-env?l=en&a=view>.
+      dnl "Portable Makefiles should refer to any library directories using the 64 symbolic link."
+      dnl But we want to recognize the sparcv9 or amd64 subdirectory also if the
+      dnl symlink is missing, so we set acl_libdirstem2 too.
+      AC_CACHE_CHECK([for 64-bit host], [gl_cv_solaris_64bit],
+        [AC_EGREP_CPP([sixtyfour bits], [
+#ifdef _LP64
+sixtyfour bits
+#endif
+           ], [gl_cv_solaris_64bit=yes], [gl_cv_solaris_64bit=no])
+        ])
+      if test $gl_cv_solaris_64bit = yes; then
+        acl_libdirstem=lib/64
+        case "$host_cpu" in
+          sparc*)        acl_libdirstem2=lib/sparcv9 ;;
+          i*86 | x86_64) acl_libdirstem2=lib/amd64 ;;
+        esac
+      fi
+      ;;
+    *)
+      searchpath=`(LC_ALL=C $CC -print-search-dirs) 2>/dev/null | sed -n -e 's,^libraries: ,,p' | sed -e 's,^=,,'`
+      if test -n "$searchpath"; then
+        acl_save_IFS="${IFS=   }"; IFS=":"
+        for searchdir in $searchpath; do
+          if test -d "$searchdir"; then
+            case "$searchdir" in
+              */lib64/ | */lib64 ) acl_libdirstem=lib64 ;;
+              */../ | */.. )
+                # Better ignore directories of this form. They are misleading.
+                ;;
+              *) searchdir=`cd "$searchdir" && pwd`
+                 case "$searchdir" in
+                   */lib64 ) acl_libdirstem=lib64 ;;
+                 esac ;;
+            esac
+          fi
+        done
+        IFS="$acl_save_IFS"
+      fi
+      ;;
+  esac
+  test -n "$acl_libdirstem2" || acl_libdirstem2="$acl_libdirstem"
+])
+
+# pkg.m4 - Macros to locate and utilise pkg-config.            -*- Autoconf -*-
+# serial 1 (pkg-config-0.24)
+# 
+# Copyright © 2004 Scott James Remnant <scott@netsplit.com>.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+#
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program that contains a
+# configuration script generated by Autoconf, you may include it under
+# the same distribution terms that you use for the rest of that program.
+
+# PKG_PROG_PKG_CONFIG([MIN-VERSION])
+# ----------------------------------
+AC_DEFUN([PKG_PROG_PKG_CONFIG],
+[m4_pattern_forbid([^_?PKG_[A-Z_]+$])
+m4_pattern_allow([^PKG_CONFIG(_(PATH|LIBDIR|SYSROOT_DIR|ALLOW_SYSTEM_(CFLAGS|LIBS)))?$])
+m4_pattern_allow([^PKG_CONFIG_(DISABLE_UNINSTALLED|TOP_BUILD_DIR|DEBUG_SPEW)$])
+AC_ARG_VAR([PKG_CONFIG], [path to pkg-config utility])
+AC_ARG_VAR([PKG_CONFIG_PATH], [directories to add to pkg-config's search path])
+AC_ARG_VAR([PKG_CONFIG_LIBDIR], [path overriding pkg-config's built-in search path])
+
+if test "x$ac_cv_env_PKG_CONFIG_set" != "xset"; then
+       AC_PATH_TOOL([PKG_CONFIG], [pkg-config])
+fi
+if test -n "$PKG_CONFIG"; then
+       _pkg_min_version=m4_default([$1], [0.9.0])
+       AC_MSG_CHECKING([pkg-config is at least version $_pkg_min_version])
+       if $PKG_CONFIG --atleast-pkgconfig-version $_pkg_min_version; then
+               AC_MSG_RESULT([yes])
+       else
+               AC_MSG_RESULT([no])
+               PKG_CONFIG=""
+       fi
+fi[]dnl
+])# PKG_PROG_PKG_CONFIG
+
+# PKG_CHECK_EXISTS(MODULES, [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND])
+#
+# Check to see whether a particular set of modules exists.  Similar
+# to PKG_CHECK_MODULES(), but does not set variables or print errors.
+#
+# Please remember that m4 expands AC_REQUIRE([PKG_PROG_PKG_CONFIG])
+# only at the first occurence in configure.ac, so if the first place
+# it's called might be skipped (such as if it is within an "if", you
+# have to call PKG_CHECK_EXISTS manually
+# --------------------------------------------------------------
+AC_DEFUN([PKG_CHECK_EXISTS],
+[AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl
+if test -n "$PKG_CONFIG" && \
+    AC_RUN_LOG([$PKG_CONFIG --exists --print-errors "$1"]); then
+  m4_default([$2], [:])
+m4_ifvaln([$3], [else
+  $3])dnl
+fi])
+
+# _PKG_CONFIG([VARIABLE], [COMMAND], [MODULES])
+# ---------------------------------------------
+m4_define([_PKG_CONFIG],
+[if test -n "$$1"; then
+    pkg_cv_[]$1="$$1"
+ elif test -n "$PKG_CONFIG"; then
+    PKG_CHECK_EXISTS([$3],
+                     [pkg_cv_[]$1=`$PKG_CONFIG --[]$2 "$3" 2>/dev/null`
+                     test "x$?" != "x0" && pkg_failed=yes ],
+                    [pkg_failed=yes])
+ else
+    pkg_failed=untried
+fi[]dnl
+])# _PKG_CONFIG
+
+# _PKG_SHORT_ERRORS_SUPPORTED
+# -----------------------------
+AC_DEFUN([_PKG_SHORT_ERRORS_SUPPORTED],
+[AC_REQUIRE([PKG_PROG_PKG_CONFIG])
+if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
+        _pkg_short_errors_supported=yes
+else
+        _pkg_short_errors_supported=no
+fi[]dnl
+])# _PKG_SHORT_ERRORS_SUPPORTED
+
+
+# PKG_CHECK_MODULES(VARIABLE-PREFIX, MODULES, [ACTION-IF-FOUND],
+# [ACTION-IF-NOT-FOUND])
+#
+#
+# Note that if there is a possibility the first call to
+# PKG_CHECK_MODULES might not happen, you should be sure to include an
+# explicit call to PKG_PROG_PKG_CONFIG in your configure.ac
+#
+#
+# --------------------------------------------------------------
+AC_DEFUN([PKG_CHECK_MODULES],
+[AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl
+AC_ARG_VAR([$1][_CFLAGS], [C compiler flags for $1, overriding pkg-config])dnl
+AC_ARG_VAR([$1][_LIBS], [linker flags for $1, overriding pkg-config])dnl
+
+pkg_failed=no
+AC_MSG_CHECKING([for $1])
+
+_PKG_CONFIG([$1][_CFLAGS], [cflags], [$2])
+_PKG_CONFIG([$1][_LIBS], [libs], [$2])
+
+m4_define([_PKG_TEXT], [Alternatively, you may set the environment variables $1[]_CFLAGS
+and $1[]_LIBS to avoid the need to call pkg-config.
+See the pkg-config man page for more details.])
+
+if test $pkg_failed = yes; then
+       AC_MSG_RESULT([no])
+        _PKG_SHORT_ERRORS_SUPPORTED
+        if test $_pkg_short_errors_supported = yes; then
+               $1[]_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "$2" 2>&1`
+        else 
+               $1[]_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "$2" 2>&1`
+        fi
+       # Put the nasty error message in config.log where it belongs
+       echo "$$1[]_PKG_ERRORS" >&AS_MESSAGE_LOG_FD
+
+       m4_default([$4], [AC_MSG_ERROR(
+[Package requirements ($2) were not met:
+
+$$1_PKG_ERRORS
+
+Consider adjusting the PKG_CONFIG_PATH environment variable if you
+installed software in a non-standard prefix.
+
+_PKG_TEXT])[]dnl
+        ])
+elif test $pkg_failed = untried; then
+       AC_MSG_RESULT([no])
+       m4_default([$4], [AC_MSG_FAILURE(
+[The pkg-config script could not be found or is too old.  Make sure it
+is in your PATH or set the PKG_CONFIG environment variable to the full
+path to pkg-config.
+
+_PKG_TEXT
+
+To get pkg-config, see <http://pkg-config.freedesktop.org/>.])[]dnl
+        ])
+else
+       $1[]_CFLAGS=$pkg_cv_[]$1[]_CFLAGS
+       $1[]_LIBS=$pkg_cv_[]$1[]_LIBS
+        AC_MSG_RESULT([yes])
+       $3
+fi[]dnl
+])# PKG_CHECK_MODULES
+
+# Copyright (C) 2002, 2003, 2005, 2006, 2007, 2008, 2011 Free Software
+# Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 1
+
+# AM_AUTOMAKE_VERSION(VERSION)
+# ----------------------------
+# Automake X.Y traces this macro to ensure aclocal.m4 has been
+# generated from the m4 files accompanying Automake X.Y.
+# (This private macro should not be called outside this file.)
+AC_DEFUN([AM_AUTOMAKE_VERSION],
+[am__api_version='1.11'
+dnl Some users find AM_AUTOMAKE_VERSION and mistake it for a way to
+dnl require some minimum version.  Point them to the right macro.
+m4_if([$1], [1.11.5], [],
+      [AC_FATAL([Do not call $0, use AM_INIT_AUTOMAKE([$1]).])])dnl
+])
+
+# _AM_AUTOCONF_VERSION(VERSION)
+# -----------------------------
+# aclocal traces this macro to find the Autoconf version.
+# This is a private macro too.  Using m4_define simplifies
+# the logic in aclocal, which can simply ignore this definition.
+m4_define([_AM_AUTOCONF_VERSION], [])
+
+# AM_SET_CURRENT_AUTOMAKE_VERSION
+# -------------------------------
+# Call AM_AUTOMAKE_VERSION and AM_AUTOMAKE_VERSION so they can be traced.
+# This function is AC_REQUIREd by AM_INIT_AUTOMAKE.
+AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION],
+[AM_AUTOMAKE_VERSION([1.11.5])dnl
+m4_ifndef([AC_AUTOCONF_VERSION],
+  [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl
+_AM_AUTOCONF_VERSION(m4_defn([AC_AUTOCONF_VERSION]))])
+
+# AM_AUX_DIR_EXPAND                                         -*- Autoconf -*-
+
+# Copyright (C) 2001, 2003, 2005, 2011 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 1
+
+# For projects using AC_CONFIG_AUX_DIR([foo]), Autoconf sets
+# $ac_aux_dir to `$srcdir/foo'.  In other projects, it is set to
+# `$srcdir', `$srcdir/..', or `$srcdir/../..'.
+#
+# Of course, Automake must honor this variable whenever it calls a
+# tool from the auxiliary directory.  The problem is that $srcdir (and
+# therefore $ac_aux_dir as well) can be either absolute or relative,
+# depending on how configure is run.  This is pretty annoying, since
+# it makes $ac_aux_dir quite unusable in subdirectories: in the top
+# source directory, any form will work fine, but in subdirectories a
+# relative path needs to be adjusted first.
+#
+# $ac_aux_dir/missing
+#    fails when called from a subdirectory if $ac_aux_dir is relative
+# $top_srcdir/$ac_aux_dir/missing
+#    fails if $ac_aux_dir is absolute,
+#    fails when called from a subdirectory in a VPATH build with
+#          a relative $ac_aux_dir
+#
+# The reason of the latter failure is that $top_srcdir and $ac_aux_dir
+# are both prefixed by $srcdir.  In an in-source build this is usually
+# harmless because $srcdir is `.', but things will broke when you
+# start a VPATH build or use an absolute $srcdir.
+#
+# So we could use something similar to $top_srcdir/$ac_aux_dir/missing,
+# iff we strip the leading $srcdir from $ac_aux_dir.  That would be:
+#   am_aux_dir='\$(top_srcdir)/'`expr "$ac_aux_dir" : "$srcdir//*\(.*\)"`
+# and then we would define $MISSING as
+#   MISSING="\${SHELL} $am_aux_dir/missing"
+# This will work as long as MISSING is not called from configure, because
+# unfortunately $(top_srcdir) has no meaning in configure.
+# However there are other variables, like CC, which are often used in
+# configure, and could therefore not use this "fixed" $ac_aux_dir.
+#
+# Another solution, used here, is to always expand $ac_aux_dir to an
+# absolute PATH.  The drawback is that using absolute paths prevent a
+# configured tree to be moved without reconfiguration.
+
+AC_DEFUN([AM_AUX_DIR_EXPAND],
+[dnl Rely on autoconf to set up CDPATH properly.
+AC_PREREQ([2.50])dnl
+# expand $ac_aux_dir to an absolute path
+am_aux_dir=`cd $ac_aux_dir && pwd`
+])
+
+# AM_CONDITIONAL                                            -*- Autoconf -*-
+
+# Copyright (C) 1997, 2000, 2001, 2003, 2004, 2005, 2006, 2008
+# Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 9
+
+# AM_CONDITIONAL(NAME, SHELL-CONDITION)
+# -------------------------------------
+# Define a conditional.
+AC_DEFUN([AM_CONDITIONAL],
+[AC_PREREQ(2.52)dnl
+ ifelse([$1], [TRUE],  [AC_FATAL([$0: invalid condition: $1])],
+       [$1], [FALSE], [AC_FATAL([$0: invalid condition: $1])])dnl
+AC_SUBST([$1_TRUE])dnl
+AC_SUBST([$1_FALSE])dnl
+_AM_SUBST_NOTMAKE([$1_TRUE])dnl
+_AM_SUBST_NOTMAKE([$1_FALSE])dnl
+m4_define([_AM_COND_VALUE_$1], [$2])dnl
+if $2; then
+  $1_TRUE=
+  $1_FALSE='#'
+else
+  $1_TRUE='#'
+  $1_FALSE=
+fi
+AC_CONFIG_COMMANDS_PRE(
+[if test -z "${$1_TRUE}" && test -z "${$1_FALSE}"; then
+  AC_MSG_ERROR([[conditional "$1" was never defined.
+Usually this means the macro was only invoked conditionally.]])
+fi])])
+
+# Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2009,
+# 2010, 2011 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 12
+
+# There are a few dirty hacks below to avoid letting `AC_PROG_CC' be
+# written in clear, in which case automake, when reading aclocal.m4,
+# will think it sees a *use*, and therefore will trigger all it's
+# C support machinery.  Also note that it means that autoscan, seeing
+# CC etc. in the Makefile, will ask for an AC_PROG_CC use...
+
+
+# _AM_DEPENDENCIES(NAME)
+# ----------------------
+# See how the compiler implements dependency checking.
+# NAME is "CC", "CXX", "GCJ", or "OBJC".
+# We try a few techniques and use that to set a single cache variable.
+#
+# We don't AC_REQUIRE the corresponding AC_PROG_CC since the latter was
+# modified to invoke _AM_DEPENDENCIES(CC); we would have a circular
+# dependency, and given that the user is not expected to run this macro,
+# just rely on AC_PROG_CC.
+AC_DEFUN([_AM_DEPENDENCIES],
+[AC_REQUIRE([AM_SET_DEPDIR])dnl
+AC_REQUIRE([AM_OUTPUT_DEPENDENCY_COMMANDS])dnl
+AC_REQUIRE([AM_MAKE_INCLUDE])dnl
+AC_REQUIRE([AM_DEP_TRACK])dnl
+
+ifelse([$1], CC,   [depcc="$CC"   am_compiler_list=],
+       [$1], CXX,  [depcc="$CXX"  am_compiler_list=],
+       [$1], OBJC, [depcc="$OBJC" am_compiler_list='gcc3 gcc'],
+       [$1], UPC,  [depcc="$UPC"  am_compiler_list=],
+       [$1], GCJ,  [depcc="$GCJ"  am_compiler_list='gcc3 gcc'],
+                   [depcc="$$1"   am_compiler_list=])
+
+AC_CACHE_CHECK([dependency style of $depcc],
+               [am_cv_$1_dependencies_compiler_type],
+[if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then
+  # We make a subdir and do the tests there.  Otherwise we can end up
+  # making bogus files that we don't know about and never remove.  For
+  # instance it was reported that on HP-UX the gcc test will end up
+  # making a dummy file named `D' -- because `-MD' means `put the output
+  # in D'.
+  rm -rf conftest.dir
+  mkdir conftest.dir
+  # Copy depcomp to subdir because otherwise we won't find it if we're
+  # using a relative directory.
+  cp "$am_depcomp" conftest.dir
+  cd conftest.dir
+  # We will build objects and dependencies in a subdirectory because
+  # it helps to detect inapplicable dependency modes.  For instance
+  # both Tru64's cc and ICC support -MD to output dependencies as a
+  # side effect of compilation, but ICC will put the dependencies in
+  # the current directory while Tru64 will put them in the object
+  # directory.
+  mkdir sub
+
+  am_cv_$1_dependencies_compiler_type=none
+  if test "$am_compiler_list" = ""; then
+     am_compiler_list=`sed -n ['s/^#*\([a-zA-Z0-9]*\))$/\1/p'] < ./depcomp`
+  fi
+  am__universal=false
+  m4_case([$1], [CC],
+    [case " $depcc " in #(
+     *\ -arch\ *\ -arch\ *) am__universal=true ;;
+     esac],
+    [CXX],
+    [case " $depcc " in #(
+     *\ -arch\ *\ -arch\ *) am__universal=true ;;
+     esac])
+
+  for depmode in $am_compiler_list; do
+    # Setup a source with many dependencies, because some compilers
+    # like to wrap large dependency lists on column 80 (with \), and
+    # we should not choose a depcomp mode which is confused by this.
+    #
+    # We need to recreate these files for each test, as the compiler may
+    # overwrite some of them when testing with obscure command lines.
+    # This happens at least with the AIX C compiler.
+    : > sub/conftest.c
+    for i in 1 2 3 4 5 6; do
+      echo '#include "conftst'$i'.h"' >> sub/conftest.c
+      # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with
+      # Solaris 8's {/usr,}/bin/sh.
+      touch sub/conftst$i.h
+    done
+    echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf
+
+    # We check with `-c' and `-o' for the sake of the "dashmstdout"
+    # mode.  It turns out that the SunPro C++ compiler does not properly
+    # handle `-M -o', and we need to detect this.  Also, some Intel
+    # versions had trouble with output in subdirs
+    am__obj=sub/conftest.${OBJEXT-o}
+    am__minus_obj="-o $am__obj"
+    case $depmode in
+    gcc)
+      # This depmode causes a compiler race in universal mode.
+      test "$am__universal" = false || continue
+      ;;
+    nosideeffect)
+      # after this tag, mechanisms are not by side-effect, so they'll
+      # only be used when explicitly requested
+      if test "x$enable_dependency_tracking" = xyes; then
+       continue
+      else
+       break
+      fi
+      ;;
+    msvc7 | msvc7msys | msvisualcpp | msvcmsys)
+      # This compiler won't grok `-c -o', but also, the minuso test has
+      # not run yet.  These depmodes are late enough in the game, and
+      # so weak that their functioning should not be impacted.
+      am__obj=conftest.${OBJEXT-o}
+      am__minus_obj=
+      ;;
+    none) break ;;
+    esac
+    if depmode=$depmode \
+       source=sub/conftest.c object=$am__obj \
+       depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \
+       $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \
+         >/dev/null 2>conftest.err &&
+       grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 &&
+       grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 &&
+       grep $am__obj sub/conftest.Po > /dev/null 2>&1 &&
+       ${MAKE-make} -s -f confmf > /dev/null 2>&1; then
+      # icc doesn't choke on unknown options, it will just issue warnings
+      # or remarks (even with -Werror).  So we grep stderr for any message
+      # that says an option was ignored or not supported.
+      # When given -MP, icc 7.0 and 7.1 complain thusly:
+      #   icc: Command line warning: ignoring option '-M'; no argument required
+      # The diagnosis changed in icc 8.0:
+      #   icc: Command line remark: option '-MP' not supported
+      if (grep 'ignoring option' conftest.err ||
+          grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else
+        am_cv_$1_dependencies_compiler_type=$depmode
+        break
+      fi
+    fi
+  done
+
+  cd ..
+  rm -rf conftest.dir
+else
+  am_cv_$1_dependencies_compiler_type=none
+fi
+])
+AC_SUBST([$1DEPMODE], [depmode=$am_cv_$1_dependencies_compiler_type])
+AM_CONDITIONAL([am__fastdep$1], [
+  test "x$enable_dependency_tracking" != xno \
+  && test "$am_cv_$1_dependencies_compiler_type" = gcc3])
+])
+
+
+# AM_SET_DEPDIR
+# -------------
+# Choose a directory name for dependency files.
+# This macro is AC_REQUIREd in _AM_DEPENDENCIES
+AC_DEFUN([AM_SET_DEPDIR],
+[AC_REQUIRE([AM_SET_LEADING_DOT])dnl
+AC_SUBST([DEPDIR], ["${am__leading_dot}deps"])dnl
+])
+
+
+# AM_DEP_TRACK
+# ------------
+AC_DEFUN([AM_DEP_TRACK],
+[AC_ARG_ENABLE(dependency-tracking,
+[  --disable-dependency-tracking  speeds up one-time build
+  --enable-dependency-tracking   do not reject slow dependency extractors])
+if test "x$enable_dependency_tracking" != xno; then
+  am_depcomp="$ac_aux_dir/depcomp"
+  AMDEPBACKSLASH='\'
+  am__nodep='_no'
+fi
+AM_CONDITIONAL([AMDEP], [test "x$enable_dependency_tracking" != xno])
+AC_SUBST([AMDEPBACKSLASH])dnl
+_AM_SUBST_NOTMAKE([AMDEPBACKSLASH])dnl
+AC_SUBST([am__nodep])dnl
+_AM_SUBST_NOTMAKE([am__nodep])dnl
+])
+
+# Generate code to set up dependency tracking.              -*- Autoconf -*-
+
+# Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2008
+# Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+#serial 5
+
+# _AM_OUTPUT_DEPENDENCY_COMMANDS
+# ------------------------------
+AC_DEFUN([_AM_OUTPUT_DEPENDENCY_COMMANDS],
+[{
+  # Autoconf 2.62 quotes --file arguments for eval, but not when files
+  # are listed without --file.  Let's play safe and only enable the eval
+  # if we detect the quoting.
+  case $CONFIG_FILES in
+  *\'*) eval set x "$CONFIG_FILES" ;;
+  *)   set x $CONFIG_FILES ;;
+  esac
+  shift
+  for mf
+  do
+    # Strip MF so we end up with the name of the file.
+    mf=`echo "$mf" | sed -e 's/:.*$//'`
+    # Check whether this is an Automake generated Makefile or not.
+    # We used to match only the files named `Makefile.in', but
+    # some people rename them; so instead we look at the file content.
+    # Grep'ing the first line is not enough: some people post-process
+    # each Makefile.in and add a new line on top of each file to say so.
+    # Grep'ing the whole file is not good either: AIX grep has a line
+    # limit of 2048, but all sed's we know have understand at least 4000.
+    if sed -n 's,^#.*generated by automake.*,X,p' "$mf" | grep X >/dev/null 2>&1; then
+      dirpart=`AS_DIRNAME("$mf")`
+    else
+      continue
+    fi
+    # Extract the definition of DEPDIR, am__include, and am__quote
+    # from the Makefile without running `make'.
+    DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"`
+    test -z "$DEPDIR" && continue
+    am__include=`sed -n 's/^am__include = //p' < "$mf"`
+    test -z "am__include" && continue
+    am__quote=`sed -n 's/^am__quote = //p' < "$mf"`
+    # When using ansi2knr, U may be empty or an underscore; expand it
+    U=`sed -n 's/^U = //p' < "$mf"`
+    # Find all dependency output files, they are included files with
+    # $(DEPDIR) in their names.  We invoke sed twice because it is the
+    # simplest approach to changing $(DEPDIR) to its actual value in the
+    # expansion.
+    for file in `sed -n "
+      s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \
+        sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g' -e 's/\$U/'"$U"'/g'`; do
+      # Make sure the directory exists.
+      test -f "$dirpart/$file" && continue
+      fdir=`AS_DIRNAME(["$file"])`
+      AS_MKDIR_P([$dirpart/$fdir])
+      # echo "creating $dirpart/$file"
+      echo '# dummy' > "$dirpart/$file"
+    done
+  done
+}
+])# _AM_OUTPUT_DEPENDENCY_COMMANDS
+
+
+# AM_OUTPUT_DEPENDENCY_COMMANDS
+# -----------------------------
+# This macro should only be invoked once -- use via AC_REQUIRE.
+#
+# This code is only required when automatic dependency tracking
+# is enabled.  FIXME.  This creates each `.P' file that we will
+# need in order to bootstrap the dependency handling code.
+AC_DEFUN([AM_OUTPUT_DEPENDENCY_COMMANDS],
+[AC_CONFIG_COMMANDS([depfiles],
+     [test x"$AMDEP_TRUE" != x"" || _AM_OUTPUT_DEPENDENCY_COMMANDS],
+     [AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir"])
+])
+
+# Copyright (C) 1996, 1997, 2000, 2001, 2003, 2005
+# Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 8
+
+# AM_CONFIG_HEADER is obsolete.  It has been replaced by AC_CONFIG_HEADERS.
+AU_DEFUN([AM_CONFIG_HEADER], [AC_CONFIG_HEADERS($@)])
+
+# Do all the work for Automake.                             -*- Autoconf -*-
+
+# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004,
+# 2005, 2006, 2008, 2009 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 16
+
+# This macro actually does too much.  Some checks are only needed if
+# your package does certain things.  But this isn't really a big deal.
+
+# AM_INIT_AUTOMAKE(PACKAGE, VERSION, [NO-DEFINE])
+# AM_INIT_AUTOMAKE([OPTIONS])
+# -----------------------------------------------
+# The call with PACKAGE and VERSION arguments is the old style
+# call (pre autoconf-2.50), which is being phased out.  PACKAGE
+# and VERSION should now be passed to AC_INIT and removed from
+# the call to AM_INIT_AUTOMAKE.
+# We support both call styles for the transition.  After
+# the next Automake release, Autoconf can make the AC_INIT
+# arguments mandatory, and then we can depend on a new Autoconf
+# release and drop the old call support.
+AC_DEFUN([AM_INIT_AUTOMAKE],
+[AC_PREREQ([2.62])dnl
+dnl Autoconf wants to disallow AM_ names.  We explicitly allow
+dnl the ones we care about.
+m4_pattern_allow([^AM_[A-Z]+FLAGS$])dnl
+AC_REQUIRE([AM_SET_CURRENT_AUTOMAKE_VERSION])dnl
+AC_REQUIRE([AC_PROG_INSTALL])dnl
+if test "`cd $srcdir && pwd`" != "`pwd`"; then
+  # Use -I$(srcdir) only when $(srcdir) != ., so that make's output
+  # is not polluted with repeated "-I."
+  AC_SUBST([am__isrc], [' -I$(srcdir)'])_AM_SUBST_NOTMAKE([am__isrc])dnl
+  # test to see if srcdir already configured
+  if test -f $srcdir/config.status; then
+    AC_MSG_ERROR([source directory already configured; run "make distclean" there first])
+  fi
+fi
+
+# test whether we have cygpath
+if test -z "$CYGPATH_W"; then
+  if (cygpath --version) >/dev/null 2>/dev/null; then
+    CYGPATH_W='cygpath -w'
+  else
+    CYGPATH_W=echo
+  fi
+fi
+AC_SUBST([CYGPATH_W])
+
+# Define the identity of the package.
+dnl Distinguish between old-style and new-style calls.
+m4_ifval([$2],
+[m4_ifval([$3], [_AM_SET_OPTION([no-define])])dnl
+ AC_SUBST([PACKAGE], [$1])dnl
+ AC_SUBST([VERSION], [$2])],
+[_AM_SET_OPTIONS([$1])dnl
+dnl Diagnose old-style AC_INIT with new-style AM_AUTOMAKE_INIT.
+m4_if(m4_ifdef([AC_PACKAGE_NAME], 1)m4_ifdef([AC_PACKAGE_VERSION], 1), 11,,
+  [m4_fatal([AC_INIT should be called with package and version arguments])])dnl
+ AC_SUBST([PACKAGE], ['AC_PACKAGE_TARNAME'])dnl
+ AC_SUBST([VERSION], ['AC_PACKAGE_VERSION'])])dnl
+
+_AM_IF_OPTION([no-define],,
+[AC_DEFINE_UNQUOTED(PACKAGE, "$PACKAGE", [Name of package])
+ AC_DEFINE_UNQUOTED(VERSION, "$VERSION", [Version number of package])])dnl
+
+# Some tools Automake needs.
+AC_REQUIRE([AM_SANITY_CHECK])dnl
+AC_REQUIRE([AC_ARG_PROGRAM])dnl
+AM_MISSING_PROG(ACLOCAL, aclocal-${am__api_version})
+AM_MISSING_PROG(AUTOCONF, autoconf)
+AM_MISSING_PROG(AUTOMAKE, automake-${am__api_version})
+AM_MISSING_PROG(AUTOHEADER, autoheader)
+AM_MISSING_PROG(MAKEINFO, makeinfo)
+AC_REQUIRE([AM_PROG_INSTALL_SH])dnl
+AC_REQUIRE([AM_PROG_INSTALL_STRIP])dnl
+AC_REQUIRE([AM_PROG_MKDIR_P])dnl
+# We need awk for the "check" target.  The system "awk" is bad on
+# some platforms.
+AC_REQUIRE([AC_PROG_AWK])dnl
+AC_REQUIRE([AC_PROG_MAKE_SET])dnl
+AC_REQUIRE([AM_SET_LEADING_DOT])dnl
+_AM_IF_OPTION([tar-ustar], [_AM_PROG_TAR([ustar])],
+             [_AM_IF_OPTION([tar-pax], [_AM_PROG_TAR([pax])],
+                            [_AM_PROG_TAR([v7])])])
+_AM_IF_OPTION([no-dependencies],,
+[AC_PROVIDE_IFELSE([AC_PROG_CC],
+                 [_AM_DEPENDENCIES(CC)],
+                 [define([AC_PROG_CC],
+                         defn([AC_PROG_CC])[_AM_DEPENDENCIES(CC)])])dnl
+AC_PROVIDE_IFELSE([AC_PROG_CXX],
+                 [_AM_DEPENDENCIES(CXX)],
+                 [define([AC_PROG_CXX],
+                         defn([AC_PROG_CXX])[_AM_DEPENDENCIES(CXX)])])dnl
+AC_PROVIDE_IFELSE([AC_PROG_OBJC],
+                 [_AM_DEPENDENCIES(OBJC)],
+                 [define([AC_PROG_OBJC],
+                         defn([AC_PROG_OBJC])[_AM_DEPENDENCIES(OBJC)])])dnl
+])
+_AM_IF_OPTION([silent-rules], [AC_REQUIRE([AM_SILENT_RULES])])dnl
+dnl The `parallel-tests' driver may need to know about EXEEXT, so add the
+dnl `am__EXEEXT' conditional if _AM_COMPILER_EXEEXT was seen.  This macro
+dnl is hooked onto _AC_COMPILER_EXEEXT early, see below.
+AC_CONFIG_COMMANDS_PRE(dnl
+[m4_provide_if([_AM_COMPILER_EXEEXT],
+  [AM_CONDITIONAL([am__EXEEXT], [test -n "$EXEEXT"])])])dnl
+])
+
+dnl Hook into `_AC_COMPILER_EXEEXT' early to learn its expansion.  Do not
+dnl add the conditional right here, as _AC_COMPILER_EXEEXT may be further
+dnl mangled by Autoconf and run in a shell conditional statement.
+m4_define([_AC_COMPILER_EXEEXT],
+m4_defn([_AC_COMPILER_EXEEXT])[m4_provide([_AM_COMPILER_EXEEXT])])
+
+
+# When config.status generates a header, we must update the stamp-h file.
+# This file resides in the same directory as the config header
+# that is generated.  The stamp files are numbered to have different names.
+
+# Autoconf calls _AC_AM_CONFIG_HEADER_HOOK (when defined) in the
+# loop where config.status creates the headers, so we can generate
+# our stamp files there.
+AC_DEFUN([_AC_AM_CONFIG_HEADER_HOOK],
+[# Compute $1's index in $config_headers.
+_am_arg=$1
+_am_stamp_count=1
+for _am_header in $config_headers :; do
+  case $_am_header in
+    $_am_arg | $_am_arg:* )
+      break ;;
+    * )
+      _am_stamp_count=`expr $_am_stamp_count + 1` ;;
+  esac
+done
+echo "timestamp for $_am_arg" >`AS_DIRNAME(["$_am_arg"])`/stamp-h[]$_am_stamp_count])
+
+# Copyright (C) 2001, 2003, 2005, 2008, 2011 Free Software Foundation,
+# Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 1
+
+# AM_PROG_INSTALL_SH
+# ------------------
+# Define $install_sh.
+AC_DEFUN([AM_PROG_INSTALL_SH],
+[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl
+if test x"${install_sh}" != xset; then
+  case $am_aux_dir in
+  *\ * | *\    *)
+    install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;;
+  *)
+    install_sh="\${SHELL} $am_aux_dir/install-sh"
+  esac
+fi
+AC_SUBST(install_sh)])
+
+# Copyright (C) 2003, 2005  Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 2
+
+# Check whether the underlying file-system supports filenames
+# with a leading dot.  For instance MS-DOS doesn't.
+AC_DEFUN([AM_SET_LEADING_DOT],
+[rm -rf .tst 2>/dev/null
+mkdir .tst 2>/dev/null
+if test -d .tst; then
+  am__leading_dot=.
+else
+  am__leading_dot=_
+fi
+rmdir .tst 2>/dev/null
+AC_SUBST([am__leading_dot])])
+
+# Check to see how 'make' treats includes.                 -*- Autoconf -*-
+
+# Copyright (C) 2001, 2002, 2003, 2005, 2009  Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 4
+
+# AM_MAKE_INCLUDE()
+# -----------------
+# Check to see how make treats includes.
+AC_DEFUN([AM_MAKE_INCLUDE],
+[am_make=${MAKE-make}
+cat > confinc << 'END'
+am__doit:
+       @echo this is the am__doit target
+.PHONY: am__doit
+END
+# If we don't find an include directive, just comment out the code.
+AC_MSG_CHECKING([for style of include used by $am_make])
+am__include="#"
+am__quote=
+_am_result=none
+# First try GNU make style include.
+echo "include confinc" > confmf
+# Ignore all kinds of additional output from `make'.
+case `$am_make -s -f confmf 2> /dev/null` in #(
+*the\ am__doit\ target*)
+  am__include=include
+  am__quote=
+  _am_result=GNU
+  ;;
+esac
+# Now try BSD make style include.
+if test "$am__include" = "#"; then
+   echo '.include "confinc"' > confmf
+   case `$am_make -s -f confmf 2> /dev/null` in #(
+   *the\ am__doit\ target*)
+     am__include=.include
+     am__quote="\""
+     _am_result=BSD
+     ;;
+   esac
+fi
+AC_SUBST([am__include])
+AC_SUBST([am__quote])
+AC_MSG_RESULT([$_am_result])
+rm -f confinc confmf
+])
+
+# Fake the existence of programs that GNU maintainers use.  -*- Autoconf -*-
+
+# Copyright (C) 1997, 1999, 2000, 2001, 2003, 2004, 2005, 2008
+# Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 6
+
+# AM_MISSING_PROG(NAME, PROGRAM)
+# ------------------------------
+AC_DEFUN([AM_MISSING_PROG],
+[AC_REQUIRE([AM_MISSING_HAS_RUN])
+$1=${$1-"${am_missing_run}$2"}
+AC_SUBST($1)])
+
+
+# AM_MISSING_HAS_RUN
+# ------------------
+# Define MISSING if not defined so far and test if it supports --run.
+# If it does, set am_missing_run to use it, otherwise, to nothing.
+AC_DEFUN([AM_MISSING_HAS_RUN],
+[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl
+AC_REQUIRE_AUX_FILE([missing])dnl
+if test x"${MISSING+set}" != xset; then
+  case $am_aux_dir in
+  *\ * | *\    *)
+    MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;;
+  *)
+    MISSING="\${SHELL} $am_aux_dir/missing" ;;
+  esac
+fi
+# Use eval to expand $SHELL
+if eval "$MISSING --run true"; then
+  am_missing_run="$MISSING --run "
+else
+  am_missing_run=
+  AC_MSG_WARN([`missing' script is too old or missing])
+fi
+])
+
+# Copyright (C) 2003, 2004, 2005, 2006, 2011 Free Software Foundation,
+# Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 1
+
+# AM_PROG_MKDIR_P
+# ---------------
+# Check for `mkdir -p'.
+AC_DEFUN([AM_PROG_MKDIR_P],
+[AC_PREREQ([2.60])dnl
+AC_REQUIRE([AC_PROG_MKDIR_P])dnl
+dnl Automake 1.8 to 1.9.6 used to define mkdir_p.  We now use MKDIR_P,
+dnl while keeping a definition of mkdir_p for backward compatibility.
+dnl @MKDIR_P@ is magic: AC_OUTPUT adjusts its value for each Makefile.
+dnl However we cannot define mkdir_p as $(MKDIR_P) for the sake of
+dnl Makefile.ins that do not define MKDIR_P, so we do our own
+dnl adjustment using top_builddir (which is defined more often than
+dnl MKDIR_P).
+AC_SUBST([mkdir_p], ["$MKDIR_P"])dnl
+case $mkdir_p in
+  [[\\/$]]* | ?:[[\\/]]*) ;;
+  */*) mkdir_p="\$(top_builddir)/$mkdir_p" ;;
+esac
+])
+
+# Helper functions for option handling.                     -*- Autoconf -*-
+
+# Copyright (C) 2001, 2002, 2003, 2005, 2008, 2010 Free Software
+# Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 5
+
+# _AM_MANGLE_OPTION(NAME)
+# -----------------------
+AC_DEFUN([_AM_MANGLE_OPTION],
+[[_AM_OPTION_]m4_bpatsubst($1, [[^a-zA-Z0-9_]], [_])])
+
+# _AM_SET_OPTION(NAME)
+# --------------------
+# Set option NAME.  Presently that only means defining a flag for this option.
+AC_DEFUN([_AM_SET_OPTION],
+[m4_define(_AM_MANGLE_OPTION([$1]), 1)])
+
+# _AM_SET_OPTIONS(OPTIONS)
+# ------------------------
+# OPTIONS is a space-separated list of Automake options.
+AC_DEFUN([_AM_SET_OPTIONS],
+[m4_foreach_w([_AM_Option], [$1], [_AM_SET_OPTION(_AM_Option)])])
+
+# _AM_IF_OPTION(OPTION, IF-SET, [IF-NOT-SET])
+# -------------------------------------------
+# Execute IF-SET if OPTION is set, IF-NOT-SET otherwise.
+AC_DEFUN([_AM_IF_OPTION],
+[m4_ifset(_AM_MANGLE_OPTION([$1]), [$2], [$3])])
+
+# Check to make sure that the build environment is sane.    -*- Autoconf -*-
+
+# Copyright (C) 1996, 1997, 2000, 2001, 2003, 2005, 2008
+# Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 5
+
+# AM_SANITY_CHECK
+# ---------------
+AC_DEFUN([AM_SANITY_CHECK],
+[AC_MSG_CHECKING([whether build environment is sane])
+# Just in case
+sleep 1
+echo timestamp > conftest.file
+# Reject unsafe characters in $srcdir or the absolute working directory
+# name.  Accept space and tab only in the latter.
+am_lf='
+'
+case `pwd` in
+  *[[\\\"\#\$\&\'\`$am_lf]]*)
+    AC_MSG_ERROR([unsafe absolute working directory name]);;
+esac
+case $srcdir in
+  *[[\\\"\#\$\&\'\`$am_lf\ \   ]]*)
+    AC_MSG_ERROR([unsafe srcdir value: `$srcdir']);;
+esac
+
+# Do `set' in a subshell so we don't clobber the current shell's
+# arguments.  Must try -L first in case configure is actually a
+# symlink; some systems play weird games with the mod time of symlinks
+# (eg FreeBSD returns the mod time of the symlink's containing
+# directory).
+if (
+   set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null`
+   if test "$[*]" = "X"; then
+      # -L didn't work.
+      set X `ls -t "$srcdir/configure" conftest.file`
+   fi
+   rm -f conftest.file
+   if test "$[*]" != "X $srcdir/configure conftest.file" \
+      && test "$[*]" != "X conftest.file $srcdir/configure"; then
+
+      # If neither matched, then we have a broken ls.  This can happen
+      # if, for instance, CONFIG_SHELL is bash and it inherits a
+      # broken ls alias from the environment.  This has actually
+      # happened.  Such a system could not be considered "sane".
+      AC_MSG_ERROR([ls -t appears to fail.  Make sure there is not a broken
+alias in your environment])
+   fi
+
+   test "$[2]" = conftest.file
+   )
+then
+   # Ok.
+   :
+else
+   AC_MSG_ERROR([newly created file is older than distributed files!
+Check your system clock])
+fi
+AC_MSG_RESULT(yes)])
+
+# Copyright (C) 2009, 2011  Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 2
+
+# AM_SILENT_RULES([DEFAULT])
+# --------------------------
+# Enable less verbose build rules; with the default set to DEFAULT
+# (`yes' being less verbose, `no' or empty being verbose).
+AC_DEFUN([AM_SILENT_RULES],
+[AC_ARG_ENABLE([silent-rules],
+[  --enable-silent-rules          less verbose build output (undo: `make V=1')
+  --disable-silent-rules         verbose build output (undo: `make V=0')])
+case $enable_silent_rules in
+yes) AM_DEFAULT_VERBOSITY=0;;
+no)  AM_DEFAULT_VERBOSITY=1;;
+*)   AM_DEFAULT_VERBOSITY=m4_if([$1], [yes], [0], [1]);;
+esac
+dnl
+dnl A few `make' implementations (e.g., NonStop OS and NextStep)
+dnl do not support nested variable expansions.
+dnl See automake bug#9928 and bug#10237.
+am_make=${MAKE-make}
+AC_CACHE_CHECK([whether $am_make supports nested variables],
+   [am_cv_make_support_nested_variables],
+   [if AS_ECHO([['TRUE=$(BAR$(V))
+BAR0=false
+BAR1=true
+V=1
+am__doit:
+       @$(TRUE)
+.PHONY: am__doit']]) | $am_make -f - >/dev/null 2>&1; then
+  am_cv_make_support_nested_variables=yes
+else
+  am_cv_make_support_nested_variables=no
+fi])
+if test $am_cv_make_support_nested_variables = yes; then
+  dnl Using `$V' instead of `$(V)' breaks IRIX make.
+  AM_V='$(V)'
+  AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)'
+else
+  AM_V=$AM_DEFAULT_VERBOSITY
+  AM_DEFAULT_V=$AM_DEFAULT_VERBOSITY
+fi
+AC_SUBST([AM_V])dnl
+AM_SUBST_NOTMAKE([AM_V])dnl
+AC_SUBST([AM_DEFAULT_V])dnl
+AM_SUBST_NOTMAKE([AM_DEFAULT_V])dnl
+AC_SUBST([AM_DEFAULT_VERBOSITY])dnl
+AM_BACKSLASH='\'
+AC_SUBST([AM_BACKSLASH])dnl
+_AM_SUBST_NOTMAKE([AM_BACKSLASH])dnl
+])
+
+# Copyright (C) 2001, 2003, 2005, 2011 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 1
+
+# AM_PROG_INSTALL_STRIP
+# ---------------------
+# One issue with vendor `install' (even GNU) is that you can't
+# specify the program used to strip binaries.  This is especially
+# annoying in cross-compiling environments, where the build's strip
+# is unlikely to handle the host's binaries.
+# Fortunately install-sh will honor a STRIPPROG variable, so we
+# always use install-sh in `make install-strip', and initialize
+# STRIPPROG with the value of the STRIP variable (set by the user).
+AC_DEFUN([AM_PROG_INSTALL_STRIP],
+[AC_REQUIRE([AM_PROG_INSTALL_SH])dnl
+# Installed binaries are usually stripped using `strip' when the user
+# run `make install-strip'.  However `strip' might not be the right
+# tool to use in cross-compilation environments, therefore Automake
+# will honor the `STRIP' environment variable to overrule this program.
+dnl Don't test for $cross_compiling = yes, because it might be `maybe'.
+if test "$cross_compiling" != no; then
+  AC_CHECK_TOOL([STRIP], [strip], :)
+fi
+INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s"
+AC_SUBST([INSTALL_STRIP_PROGRAM])])
+
+# Copyright (C) 2006, 2008, 2010 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 3
+
+# _AM_SUBST_NOTMAKE(VARIABLE)
+# ---------------------------
+# Prevent Automake from outputting VARIABLE = @VARIABLE@ in Makefile.in.
+# This macro is traced by Automake.
+AC_DEFUN([_AM_SUBST_NOTMAKE])
+
+# AM_SUBST_NOTMAKE(VARIABLE)
+# --------------------------
+# Public sister of _AM_SUBST_NOTMAKE.
+AC_DEFUN([AM_SUBST_NOTMAKE], [_AM_SUBST_NOTMAKE($@)])
+
+# Check how to create a tarball.                            -*- Autoconf -*-
+
+# Copyright (C) 2004, 2005, 2012 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 2
+
+# _AM_PROG_TAR(FORMAT)
+# --------------------
+# Check how to create a tarball in format FORMAT.
+# FORMAT should be one of `v7', `ustar', or `pax'.
+#
+# Substitute a variable $(am__tar) that is a command
+# writing to stdout a FORMAT-tarball containing the directory
+# $tardir.
+#     tardir=directory && $(am__tar) > result.tar
+#
+# Substitute a variable $(am__untar) that extract such
+# a tarball read from stdin.
+#     $(am__untar) < result.tar
+AC_DEFUN([_AM_PROG_TAR],
+[# Always define AMTAR for backward compatibility.  Yes, it's still used
+# in the wild :-(  We should find a proper way to deprecate it ...
+AC_SUBST([AMTAR], ['$${TAR-tar}'])
+m4_if([$1], [v7],
+     [am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -'],
+     [m4_case([$1], [ustar],, [pax],,
+              [m4_fatal([Unknown tar format])])
+AC_MSG_CHECKING([how to create a $1 tar archive])
+# Loop over all known methods to create a tar archive until one works.
+_am_tools='gnutar m4_if([$1], [ustar], [plaintar]) pax cpio none'
+_am_tools=${am_cv_prog_tar_$1-$_am_tools}
+# Do not fold the above two line into one, because Tru64 sh and
+# Solaris sh will not grok spaces in the rhs of `-'.
+for _am_tool in $_am_tools
+do
+  case $_am_tool in
+  gnutar)
+    for _am_tar in tar gnutar gtar;
+    do
+      AM_RUN_LOG([$_am_tar --version]) && break
+    done
+    am__tar="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$$tardir"'
+    am__tar_="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$tardir"'
+    am__untar="$_am_tar -xf -"
+    ;;
+  plaintar)
+    # Must skip GNU tar: if it does not support --format= it doesn't create
+    # ustar tarball either.
+    (tar --version) >/dev/null 2>&1 && continue
+    am__tar='tar chf - "$$tardir"'
+    am__tar_='tar chf - "$tardir"'
+    am__untar='tar xf -'
+    ;;
+  pax)
+    am__tar='pax -L -x $1 -w "$$tardir"'
+    am__tar_='pax -L -x $1 -w "$tardir"'
+    am__untar='pax -r'
+    ;;
+  cpio)
+    am__tar='find "$$tardir" -print | cpio -o -H $1 -L'
+    am__tar_='find "$tardir" -print | cpio -o -H $1 -L'
+    am__untar='cpio -i -H $1 -d'
+    ;;
+  none)
+    am__tar=false
+    am__tar_=false
+    am__untar=false
+    ;;
+  esac
+
+  # If the value was cached, stop now.  We just wanted to have am__tar
+  # and am__untar set.
+  test -n "${am_cv_prog_tar_$1}" && break
+
+  # tar/untar a dummy directory, and stop if the command works
+  rm -rf conftest.dir
+  mkdir conftest.dir
+  echo GrepMe > conftest.dir/file
+  AM_RUN_LOG([tardir=conftest.dir && eval $am__tar_ >conftest.tar])
+  rm -rf conftest.dir
+  if test -s conftest.tar; then
+    AM_RUN_LOG([$am__untar <conftest.tar])
+    grep GrepMe conftest.dir/file >/dev/null 2>&1 && break
+  fi
+done
+rm -rf conftest.dir
+
+AC_CACHE_VAL([am_cv_prog_tar_$1], [am_cv_prog_tar_$1=$_am_tool])
+AC_MSG_RESULT([$am_cv_prog_tar_$1])])
+AC_SUBST([am__tar])
+AC_SUBST([am__untar])
+]) # _AM_PROG_TAR
+
+m4_include([m4/acx_pthread.m4])
+m4_include([m4/define-dir.m4])
+m4_include([m4/gtk-doc.m4])
+m4_include([m4/iconv.m4])
+m4_include([m4/introspection.m4])
+m4_include([m4/libjpeg.m4])
+m4_include([m4/libtool.m4])
+m4_include([m4/ltoptions.m4])
+m4_include([m4/ltsugar.m4])
+m4_include([m4/ltversion.m4])
+m4_include([m4/lt~obsolete.m4])
diff --git a/cmake/modules/COPYING-CMAKE-SCRIPTS b/cmake/modules/COPYING-CMAKE-SCRIPTS
new file mode 100644 (file)
index 0000000..4b41776
--- /dev/null
@@ -0,0 +1,22 @@
+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 copyright
+   notice, this list of conditions and the following disclaimer.
+2. Redistributions in binary form must reproduce the copyright
+   notice, this list of conditions and the following disclaimer in the
+   documentation and/or other materials provided with the distribution.
+3. The name of the author may not be used to endorse or promote products 
+   derived from this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 THE AUTHOR 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.
diff --git a/cmake/modules/FindCairo.cmake b/cmake/modules/FindCairo.cmake
new file mode 100644 (file)
index 0000000..d536c05
--- /dev/null
@@ -0,0 +1,62 @@
+# - try to find Cairo
+# Once done this will define
+#
+#  CAIRO_FOUND - system has Cairo
+#  CAIRO_CFLAGS - the Cairo CFlags
+#  CAIRO_INCLUDE_DIRS - the Cairo include directories
+#  CAIRO_LIBRARIES - Link these to use Cairo
+#
+# Copyright (C) 2007, 2010, Pino Toscano, <pino@kde.org>
+#
+# Redistribution and use is allowed according to the terms of the BSD license.
+# For details see the accompanying COPYING-CMAKE-SCRIPTS file.
+
+if(CAIRO_INCLUDE_DIRS AND CAIRO_LIBRARIES)
+
+  # in cache already
+  set(CAIRO_FOUND TRUE)
+
+else(CAIRO_INCLUDE_DIRS AND CAIRO_LIBRARIES)
+
+if(NOT WIN32)
+  # use pkg-config to get the directories and then use these values
+  # in the FIND_PATH() and FIND_LIBRARY() calls
+  find_package(PkgConfig REQUIRED)
+  if(Cairo_FIND_VERSION_COUNT GREATER 0)
+    set(_cairo_version_cmp ">=${Cairo_FIND_VERSION}")
+  endif(Cairo_FIND_VERSION_COUNT GREATER 0)
+  pkg_check_modules(_pc_cairo cairo${_cairo_version_cmp})
+  if(_pc_cairo_FOUND)
+    set(CAIRO_FOUND TRUE)
+  endif(_pc_cairo_FOUND)
+else(NOT WIN32)
+  # assume so, for now
+  set(CAIRO_FOUND TRUE)
+endif(NOT WIN32)
+
+if(CAIRO_FOUND)
+  # set it back as false
+  set(CAIRO_FOUND FALSE)
+
+  find_library(CAIRO_LIBRARY cairo
+               HINTS ${_pc_cairo_LIBRARY_DIRS}
+  )
+  set(CAIRO_LIBRARIES "${CAIRO_LIBRARY}")
+
+  find_path(CAIRO_INCLUDE_DIR cairo.h
+            HINTS ${_pc_cairo_INCLUDE_DIRS}
+            PATH_SUFFIXES cairo
+  )
+  set(CAIRO_INCLUDE_DIRS "${CAIRO_INCLUDE_DIR}")
+
+  include(FindPackageHandleStandardArgs)
+  find_package_handle_standard_args(Cairo DEFAULT_MSG CAIRO_LIBRARIES CAIRO_INCLUDE_DIRS)
+endif(CAIRO_FOUND)
+
+endif(CAIRO_INCLUDE_DIRS AND CAIRO_LIBRARIES)
+
+mark_as_advanced(
+  CAIRO_CFLAGS
+  CAIRO_INCLUDE_DIRS
+  CAIRO_LIBRARIES
+)
diff --git a/cmake/modules/FindFontconfig.cmake b/cmake/modules/FindFontconfig.cmake
new file mode 100644 (file)
index 0000000..268a61a
--- /dev/null
@@ -0,0 +1,50 @@
+# - Try to find the  Fontconfig
+# Once done this will define
+#
+#  FONTCONFIG_FOUND - system has Fontconfig
+#  FONTCONFIG_INCLUDE_DIR - The include directory to use for the fontconfig headers
+#  FONTCONFIG_LIBRARIES - Link these to use FONTCONFIG
+#  FONTCONFIG_DEFINITIONS - Compiler switches required for using FONTCONFIG
+
+# Copyright (c) 2006,2007 Laurent Montel, <montel@kde.org>
+#
+# Redistribution and use is allowed according to the terms of the BSD license.
+# For details see the accompanying COPYING-CMAKE-SCRIPTS file.
+
+
+if (FONTCONFIG_LIBRARIES AND FONTCONFIG_INCLUDE_DIR)
+
+  # in cache already
+  set(FONTCONFIG_FOUND TRUE)
+
+else (FONTCONFIG_LIBRARIES AND FONTCONFIG_INCLUDE_DIR)
+
+  if (NOT WIN32)
+    # use pkg-config to get the directories and then use these values
+    # in the FIND_PATH() and FIND_LIBRARY() calls
+    find_package(PkgConfig)
+    pkg_check_modules(PC_FONTCONFIG fontconfig)
+
+    set(FONTCONFIG_DEFINITIONS ${PC_FONTCONFIG_CFLAGS_OTHER})
+  endif (NOT WIN32)
+
+  find_path(FONTCONFIG_INCLUDE_DIR fontconfig/fontconfig.h
+    PATHS
+    ${PC_FONTCONFIG_INCLUDEDIR}
+    ${PC_FONTCONFIG_INCLUDE_DIRS}
+    /usr/X11/include
+  )
+
+  find_library(FONTCONFIG_LIBRARIES NAMES fontconfig
+    PATHS
+    ${PC_FONTCONFIG_LIBDIR}
+    ${PC_FONTCONFIG_LIBRARY_DIRS}
+  )
+
+  include(FindPackageHandleStandardArgs)
+  FIND_PACKAGE_HANDLE_STANDARD_ARGS(Fontconfig DEFAULT_MSG FONTCONFIG_LIBRARIES FONTCONFIG_INCLUDE_DIR )
+  
+  mark_as_advanced(FONTCONFIG_LIBRARIES FONTCONFIG_INCLUDE_DIR)
+
+endif (FONTCONFIG_LIBRARIES AND FONTCONFIG_INCLUDE_DIR)
+
diff --git a/cmake/modules/FindGLIB.cmake b/cmake/modules/FindGLIB.cmake
new file mode 100644 (file)
index 0000000..15fb0c7
--- /dev/null
@@ -0,0 +1,22 @@
+# - try to find the GLIB libraries
+# Once done this will define
+#
+#  GLIB_FOUND - system has GLib
+#  GLIB2_CFLAGS - the GLib CFlags
+#  GLIB2_LIBRARIES - Link these to use GLib
+#
+# Copyright 2008-2010 Pino Toscano, <pino@kde.org>
+#
+# Redistribution and use is allowed according to the terms of the BSD license.
+# For details see the accompanying COPYING-CMAKE-SCRIPTS file.
+
+include(FindPackageHandleStandardArgs)
+
+if (NOT WIN32)
+  find_package(PkgConfig REQUIRED)
+
+  pkg_check_modules(GLIB2 "glib-2.0>=${GLIB_REQUIRED}" "gobject-2.0>=${GLIB_REQUIRED}")
+
+  find_package_handle_standard_args(GLib DEFAULT_MSG GLIB2_LIBRARIES GLIB2_CFLAGS)
+
+endif(NOT WIN32)
diff --git a/cmake/modules/FindGObjectIntrospection.cmake b/cmake/modules/FindGObjectIntrospection.cmake
new file mode 100644 (file)
index 0000000..2073c3c
--- /dev/null
@@ -0,0 +1,61 @@
+# - try to find gobject-introspection
+#
+# Once done this will define
+#
+#  INTROSPECTION_FOUND - system has gobject-introspection
+#  INTROSPECTION_SCANNER - the gobject-introspection scanner, g-ir-scanner
+#  INTROSPECTION_COMPILER - the gobject-introspection compiler, g-ir-compiler
+#  INTROSPECTION_GENERATE - the gobject-introspection generate, g-ir-generate
+#  INTROSPECTION_GIRDIR
+#  INTROSPECTION_TYPELIBDIR
+#  INTROSPECTION_CFLAGS
+#  INTROSPECTION_LIBS
+#
+# Copyright (C) 2010, Pino Toscano, <pino@kde.org>
+#
+# Redistribution and use is allowed according to the terms of the BSD license.
+# For details see the accompanying COPYING-CMAKE-SCRIPTS file.
+
+macro(_GIR_GET_PKGCONFIG_VAR _outvar _varname)
+  execute_process(
+    COMMAND ${PKG_CONFIG_EXECUTABLE} --variable=${_varname} gobject-introspection-1.0
+    OUTPUT_VARIABLE _result
+    RESULT_VARIABLE _null
+  )
+
+  if (_null)
+  else()
+    string(REGEX REPLACE "[\r\n]" " " _result "${_result}")
+    string(REGEX REPLACE " +$" ""  _result "${_result}")
+    separate_arguments(_result)
+    set(${_outvar} ${_result} CACHE INTERNAL "")
+  endif()
+endmacro(_GIR_GET_PKGCONFIG_VAR)
+
+find_package(PkgConfig)
+if(PKG_CONFIG_FOUND)
+  if(PACKAGE_FIND_VERSION_COUNT GREATER 0)
+    set(_gir_version_cmp ">=${PACKAGE_FIND_VERSION}")
+  endif()
+  pkg_check_modules(_pc_gir gobject-introspection-1.0${_gir_version_cmp})
+  if(_pc_gir_FOUND)
+    set(INTROSPECTION_FOUND TRUE)
+    _gir_get_pkgconfig_var(INTROSPECTION_SCANNER "g_ir_scanner")
+    _gir_get_pkgconfig_var(INTROSPECTION_COMPILER "g_ir_compiler")
+    _gir_get_pkgconfig_var(INTROSPECTION_GENERATE "g_ir_generate")
+    _gir_get_pkgconfig_var(INTROSPECTION_GIRDIR "girdir")
+    _gir_get_pkgconfig_var(INTROSPECTION_TYPELIBDIR "typelibdir")
+    set(INTROSPECTION_CFLAGS "${_pc_gir_CFLAGS}")
+    set(INTROSPECTION_LIBS "${_pc_gir_LIBS}")
+  endif()
+endif()
+
+mark_as_advanced(
+  INTROSPECTION_SCANNER
+  INTROSPECTION_COMPILER
+  INTROSPECTION_GENERATE
+  INTROSPECTION_GIRDIR
+  INTROSPECTION_TYPELIBDIR
+  INTROSPECTION_CFLAGS
+  INTROSPECTION_LIBS
+)
diff --git a/cmake/modules/FindGTK.cmake b/cmake/modules/FindGTK.cmake
new file mode 100644 (file)
index 0000000..4d66bd3
--- /dev/null
@@ -0,0 +1,22 @@
+# - try to find GTK libraries
+# Once done this will define
+#
+#  GTK_FOUND - system has GTK
+#  GTK2_CFLAGS - the GTK CFlags
+#  GTK2_LIBRARIES - Link these to use GTK
+#
+# Copyright 2008-2010 Pino Toscano, <pino@kde.org>
+#
+# Redistribution and use is allowed according to the terms of the BSD license.
+# For details see the accompanying COPYING-CMAKE-SCRIPTS file.
+
+include(FindPackageHandleStandardArgs)
+
+if (NOT WIN32)
+  find_package(PkgConfig REQUIRED)
+
+  pkg_check_modules(GTK2 "gtk+-2.0>=2.14" "gdk-pixbuf-2.0" "gthread-2.0" "gio-2.0")
+
+  find_package_handle_standard_args(GTK DEFAULT_MSG GTK2_LIBRARIES GTK2_CFLAGS)
+
+endif(NOT WIN32)
diff --git a/cmake/modules/FindIconv.cmake b/cmake/modules/FindIconv.cmake
new file mode 100644 (file)
index 0000000..338d17d
--- /dev/null
@@ -0,0 +1,60 @@
+# - Try to find Iconv 
+# Once done this will define 
+# 
+#  ICONV_FOUND - system has Iconv 
+#  ICONV_INCLUDE_DIR - the Iconv include directory 
+#  ICONV_LIBRARIES - Link these to use Iconv 
+#  ICONV_SECOND_ARGUMENT_IS_CONST - the second argument for iconv() is const
+# 
+include(CheckCXXSourceCompiles)
+
+IF (ICONV_INCLUDE_DIR AND ICONV_LIBRARIES)
+  # Already in cache, be silent
+  SET(ICONV_FIND_QUIETLY TRUE)
+ENDIF (ICONV_INCLUDE_DIR AND ICONV_LIBRARIES)
+
+FIND_PATH(ICONV_INCLUDE_DIR iconv.h) 
+FIND_LIBRARY(ICONV_LIBRARIES NAMES iconv libiconv libiconv-2 c)
+IF(ICONV_INCLUDE_DIR AND ICONV_LIBRARIES) 
+   SET(ICONV_FOUND TRUE) 
+ENDIF(ICONV_INCLUDE_DIR AND ICONV_LIBRARIES) 
+
+set(CMAKE_REQUIRED_INCLUDES ${ICONV_INCLUDE_DIR})
+set(CMAKE_REQUIRED_LIBRARIES ${ICONV_LIBRARIES})
+IF(ICONV_FOUND)
+  check_cxx_source_compiles("
+  #include <iconv.h>
+  int main(){
+    iconv_t conv = 0;
+    const char* in = 0;
+    size_t ilen = 0;
+    char* out = 0;
+    size_t olen = 0;
+    iconv(conv, &in, &ilen, &out, &olen);
+    return 0;
+  }
+" ICONV_SECOND_ARGUMENT_IS_CONST )
+  IF(ICONV_SECOND_ARGUMENT_IS_CONST)
+    SET(ICONV_CONST "const")
+  ENDIF(ICONV_SECOND_ARGUMENT_IS_CONST)
+ENDIF(ICONV_FOUND)
+set(CMAKE_REQUIRED_INCLUDES)
+set(CMAKE_REQUIRED_LIBRARIES)
+
+IF(ICONV_FOUND) 
+  IF(NOT ICONV_FIND_QUIETLY) 
+    MESSAGE(STATUS "Found Iconv: ${ICONV_LIBRARIES}") 
+  ENDIF(NOT ICONV_FIND_QUIETLY) 
+ELSE(ICONV_FOUND) 
+  IF(Iconv_FIND_REQUIRED) 
+    MESSAGE(FATAL_ERROR "Could not find Iconv") 
+  ENDIF(Iconv_FIND_REQUIRED) 
+ENDIF(ICONV_FOUND) 
+
+MARK_AS_ADVANCED(
+  ICONV_INCLUDE_DIR
+  ICONV_LIBRARIES
+  ICONV_SECOND_ARGUMENT_IS_CONST
+)
diff --git a/cmake/modules/FindLCMS.cmake b/cmake/modules/FindLCMS.cmake
new file mode 100644 (file)
index 0000000..9d162d2
--- /dev/null
@@ -0,0 +1,84 @@
+# - Find LCMS
+# Find the LCMS includes and library
+# This module defines
+#  LCMS_INCLUDE_DIR, where to find lcms.h
+#  LCMS_LIBRARIES, the libraries needed to use LCMS.
+#  LCMS_VERSION, The value of LCMS_VERSION defined in lcms.h
+#  LCMS_FOUND, If false, do not try to use LCMS.
+
+
+# Copyright (c) 2008, Adrian Page, <adrian@pagenet.plus.com>
+#
+# Redistribution and use is allowed according to the terms of the BSD license.
+# For details see the accompanying COPYING-CMAKE-SCRIPTS file.
+
+
+# use pkg-config to get the directories and then use these values
+# in the FIND_PATH() and FIND_LIBRARY() calls
+if(NOT WIN32)
+   find_package(PkgConfig)
+   pkg_check_modules(PC_LCMS lcms)
+   set(LCMS_DEFINITIONS ${PC_LCMS_CFLAGS_OTHER})
+endif(NOT WIN32)
+
+find_path(LCMS_INCLUDE_DIR lcms.h
+   PATHS
+   ${PC_LCMS_INCLUDEDIR}
+   ${PC_LCMS_INCLUDE_DIRS}
+   PATH_SUFFIXES lcms liblcms1
+)
+
+find_library(LCMS_LIBRARIES NAMES lcms liblcms lcms-1 liblcms-1
+   PATHS     
+   ${PC_LCMS_LIBDIR}
+   ${PC_LCMS_LIBRARY_DIRS}
+   PATH_SUFFIXES lcms
+)
+
+if(LCMS_INCLUDE_DIR AND LCMS_LIBRARIES)
+   set(LCMS_FOUND TRUE)
+else(LCMS_INCLUDE_DIR AND LCMS_LIBRARIES)
+   set(LCMS_FOUND FALSE)
+endif(LCMS_INCLUDE_DIR AND LCMS_LIBRARIES)
+
+if(LCMS_FOUND)
+   set(FIND_LCMS_VERSION_SOURCE
+      "#include <lcms.h>\n int main()\n {\n return LCMS_VERSION;\n }\n")
+   set(FIND_LCMS_VERSION_SOURCE_FILE ${CMAKE_BINARY_DIR}/CMakeTmp/FindLCMS.cxx)
+   file(WRITE "${FIND_LCMS_VERSION_SOURCE_FILE}" "${FIND_LCMS_VERSION_SOURCE}")
+
+   set(FIND_LCMS_VERSION_ADD_INCLUDES 
+      "-DINCLUDE_DIRECTORIES:STRING=${LCMS_INCLUDE_DIR}")
+
+   try_run(LCMS_VERSION LCMS_COMPILE_RESULT
+      ${CMAKE_BINARY_DIR}
+      ${FIND_LCMS_VERSION_SOURCE_FILE}
+      CMAKE_FLAGS "${FIND_LCMS_VERSION_ADD_INCLUDES}"
+      OUTPUT_VARIABLE OUTPUT)
+
+   if(LCMS_COMPILE_RESULT AND NOT LCMS_VERSION STREQUAL FAILED_TO_RUN)
+      if(NOT LCMS_FIND_QUIETLY)
+         string(SUBSTRING ${LCMS_VERSION} 0 1 LCMS_MAJOR_VERSION)
+         string(SUBSTRING ${LCMS_VERSION} 1 2 LCMS_MINOR_VERSION)
+         message(STATUS "Found lcms version ${LCMS_MAJOR_VERSION}.${LCMS_MINOR_VERSION}, ${LCMS_LIBRARIES}")
+      endif(NOT LCMS_FIND_QUIETLY)
+   else(LCMS_COMPILE_RESULT AND NOT LCMS_VERSION STREQUAL FAILED_TO_RUN)
+      if(NOT LCMS_FIND_QUIETLY)
+         message(STATUS "Found lcms but failed to find version ${LCMS_LIBRARIES}")
+         file(APPEND ${CMAKE_BINARY_DIR}/CMakeFiles/CMakeError.log
+            "Find lcms version failed with the following output:\n${OUTPUT}\nFindLCMS.cxx:\n${FIND_LCMS_VERSION_SOURCE}\n\n")
+      endif(NOT LCMS_FIND_QUIETLY)
+      set(LCMS_VERSION NOTFOUND)
+   endif(LCMS_COMPILE_RESULT AND NOT LCMS_VERSION STREQUAL FAILED_TO_RUN)
+else(LCMS_FOUND)
+   if(NOT LCMS_FIND_QUIETLY)
+      if(LCMS_FIND_REQUIRED)
+         message(FATAL_ERROR "Required package lcms NOT found")
+      else(LCMS_FIND_REQUIRED)
+         message(STATUS "lcms NOT found")
+      endif(LCMS_FIND_REQUIRED)
+   endif(NOT LCMS_FIND_QUIETLY)
+endif(LCMS_FOUND)
+
+mark_as_advanced(LCMS_INCLUDE_DIR LCMS_LIBRARIES LCMS_VERSION)
+
diff --git a/cmake/modules/FindLCMS2.cmake b/cmake/modules/FindLCMS2.cmake
new file mode 100644 (file)
index 0000000..2ec91d0
--- /dev/null
@@ -0,0 +1,73 @@
+# - Find LCMS2
+# Find the LCMS2 includes and library
+# This module defines
+#  LCMS2_INCLUDE_DIR, where to find lcms.h
+#  LCMS2_LIBRARIES, the libraries needed to use LCMS2.
+#  LCMS2_VERSION, The value of LCMS_VERSION defined in lcms.h
+#  LCMS2_FOUND, If false, do not try to use LCMS2.
+
+
+# Copyright (c) 2008, Adrian Page, <adrian@pagenet.plus.com>
+# Copyright (c) 2009, Cyrille Berger, <cberger@cberger.net>
+#
+# Redistribution and use is allowed according to the terms of the BSD license.
+# For details see the accompanying COPYING-CMAKE-SCRIPTS file.
+
+
+# use pkg-config to get the directories and then use these values
+# in the FIND_PATH() and FIND_LIBRARY() calls
+if(NOT WIN32)
+   find_package(PkgConfig)
+   pkg_check_modules(PC_LCMS2 lcms2)
+   set(LCMS2_DEFINITIONS ${PC_LCMS2_CFLAGS_OTHER})
+endif(NOT WIN32)
+
+find_path(LCMS2_INCLUDE_DIR lcms2.h
+   PATHS
+   ${PC_LCMS2_INCLUDEDIR}
+   ${PC_LCMS2_INCLUDE_DIRS}
+   PATH_SUFFIXES lcms2 liblcms2
+)
+
+find_library(LCMS2_LIBRARIES NAMES lcms2 liblcms2 lcms-2 liblcms-2
+   PATHS     
+   ${PC_LCMS2_LIBDIR}
+   ${PC_LCMS2_LIBRARY_DIRS}
+   PATH_SUFFIXES lcms2
+)
+
+if(LCMS2_INCLUDE_DIR AND LCMS2_LIBRARIES)
+   set(LCMS2_FOUND TRUE)
+else(LCMS2_INCLUDE_DIR AND LCMS2_LIBRARIES)
+   set(LCMS2_FOUND FALSE)
+endif(LCMS2_INCLUDE_DIR AND LCMS2_LIBRARIES)
+
+if(LCMS2_FOUND)
+   file(READ ${LCMS2_INCLUDE_DIR}/lcms2.h LCMS2_VERSION_CONTENT)
+   string(REGEX MATCH "#define LCMS_VERSION[ ]*[0-9]*\n" LCMS2_VERSION_MATCH ${LCMS2_VERSION_CONTENT})
+   if(LCMS2_VERSION_MATCH)
+      string(REGEX REPLACE "#define LCMS_VERSION[ ]*([0-9]*)\n" "\\1" LCMS2_VERSION ${LCMS2_VERSION_MATCH})
+      if(NOT LCMS2_FIND_QUIETLY)
+         string(SUBSTRING ${LCMS2_VERSION} 0 1 LCMS2_MAJOR_VERSION)
+         string(SUBSTRING ${LCMS2_VERSION} 1 2 LCMS2_MINOR_VERSION)
+         message(STATUS "Found lcms version ${LCMS2_MAJOR_VERSION}.${LCMS2_MINOR_VERSION}, ${LCMS2_LIBRARIES}")
+      endif(NOT LCMS2_FIND_QUIETLY)
+   else(LCMS2_VERSION_MATCH)
+      if(NOT LCMS2_FIND_QUIETLY)
+         message(STATUS "Found lcms2 but failed to find version ${LCMS2_LIBRARIES}")
+      endif(NOT LCMS2_FIND_QUIETLY)
+      set(LCMS2_VERSION NOTFOUND)
+   endif(LCMS2_VERSION_MATCH)
+else(LCMS2_FOUND)
+   if(NOT LCMS2_FIND_QUIETLY)
+      if(LCMS2_FIND_REQUIRED)
+         message(FATAL_ERROR "Required package lcms2 NOT found")
+      else(LCMS2_FIND_REQUIRED)
+         message(STATUS "lcms2 NOT found")
+      endif(LCMS2_FIND_REQUIRED)
+   endif(NOT LCMS2_FIND_QUIETLY)
+endif(LCMS2_FOUND)
+
+mark_as_advanced(LCMS2_INCLUDE_DIR LCMS2_LIBRARIES LCMS2_VERSION)
+
+
diff --git a/cmake/modules/FindLIBOPENJPEG.cmake b/cmake/modules/FindLIBOPENJPEG.cmake
new file mode 100644 (file)
index 0000000..d9c1369
--- /dev/null
@@ -0,0 +1,53 @@
+# - Try to find the libopenjpeg library
+# Once done this will define
+#
+#  LIBOPENJPEG_FOUND - system has libopenjpeg
+#  LIBOPENJPEG_INCLUDE_DIRS - the libopenjpeg include directories
+#  LIBOPENJPEG_LIBRARIES - Link these to use libopenjpeg
+#  LIBOPENJPEG_INCLUDE_DIR is internal and deprecated for use
+
+# Copyright (c) 2008, Albert Astals Cid, <aacid@kde.org>
+#
+# Redistribution and use is allowed according to the terms of the BSD license.
+# For details see the accompanying COPYING-CMAKE-SCRIPTS file.
+
+
+if (LIBOPENJPEG_LIBRARIES AND LIBOPENJPEG_INCLUDE_DIR)
+
+  # in cache already
+  set(LIBOPENJPEG_FOUND TRUE)
+
+else (LIBOPENJPEG_LIBRARIES AND LIBOPENJPEG_INCLUDE_DIR)
+
+  #reset vars
+  set(LIBOPENJPEG_LIBRARIES)
+  set(LIBOPENJPEG_INCLUDE_DIR)
+
+  find_path (LIBOPENJPEG_INCLUDE_DIR openjpeg.h PATH_SUFFIXES openjpeg)
+  find_library(LIBOPENJPEG_LIBRARIES openjpeg)
+  if(LIBOPENJPEG_INCLUDE_DIR AND LIBOPENJPEG_LIBRARIES)
+
+  set(CMAKE_REQUIRED_INCLUDES ${LIBOPENJPEG_INCLUDE_DIR})
+  set(CMAKE_REQUIRED_LIBRARIES ${LIBOPENJPEG_LIBRARIES})
+
+check_cxx_source_compiles("
+#include <openjpeg.h>
+int main()
+{
+  int foo = OPJ_DPARAMETERS_IGNORE_PCLR_CMAP_CDEF_FLAG;
+  return 0;
+}
+" WITH_OPENJPEG_IGNORE_PCLR_CMAP_CDEF_FLAG)
+
+  set(CMAKE_REQUIRED_INCLUDES)
+  set(CMAKE_REQUIRED_LIBRARIES)
+
+    set(LIBOPENJPEG_FOUND TRUE)
+  endif(LIBOPENJPEG_INCLUDE_DIR AND LIBOPENJPEG_LIBRARIES)
+
+  include(FindPackageHandleStandardArgs)
+  find_package_handle_standard_args(LibOpenJPEG DEFAULT_MSG LIBOPENJPEG_LIBRARIES LIBOPENJPEG_INCLUDE_DIR)
+
+endif (LIBOPENJPEG_LIBRARIES AND LIBOPENJPEG_INCLUDE_DIR)
+
+set(LIBOPENJPEG_INCLUDE_DIRS ${LIBOPENJPEG_INCLUDE_DIR})
diff --git a/cmake/modules/FindQt4.cmake b/cmake/modules/FindQt4.cmake
new file mode 100644 (file)
index 0000000..9122bb3
--- /dev/null
@@ -0,0 +1,1295 @@
+# - Find QT 4
+# This module can be used to find Qt4.
+# The most important issue is that the Qt4 qmake is available via the system path.
+# This qmake is then used to detect basically everything else.
+# This module defines a number of key variables and macros. First is 
+# QT_USE_FILE which is the path to a CMake file that can be included to compile
+# Qt 4 applications and libraries.  By default, the QtCore and QtGui 
+# libraries are loaded. This behavior can be changed by setting one or more 
+# of the following variables to true:
+#                    QT_DONT_USE_QTCORE
+#                    QT_DONT_USE_QTGUI
+#                    QT_USE_QT3SUPPORT
+#                    QT_USE_QTASSISTANT
+#                    QT_USE_QTDESIGNER
+#                    QT_USE_QTMOTIF
+#                    QT_USE_QTMAIN
+#                    QT_USE_QTNETWORK
+#                    QT_USE_QTNSPLUGIN
+#                    QT_USE_QTOPENGL
+#                    QT_USE_QTSQL
+#                    QT_USE_QTXML
+#                    QT_USE_QTSVG
+#                    QT_USE_QTTEST
+#                    QT_USE_QTUITOOLS
+#                    QT_USE_QTDBUS
+#                    QT_USE_QTSCRIPT
+#
+# All the libraries required are stored in a variable called QT_LIBRARIES.  
+# Add this variable to your TARGET_LINK_LIBRARIES.
+#  
+#  macro QT4_WRAP_CPP(outfiles inputfile ... OPTIONS ...)
+#        create moc code from a list of files containing Qt class with
+#        the Q_OBJECT declaration.  Options may be given to moc, such as those found
+#        when executing "moc -help"
+#
+#  macro QT4_WRAP_UI(outfiles inputfile ... OPTIONS ...)
+#        create code from a list of Qt designer ui files.
+#        Options may be given to uic, such as those found
+#        when executing "uic -help"
+#
+#  macro QT4_ADD_RESOURCES(outfiles inputfile ... OPTIONS ...)
+#        create code from a list of Qt resource files.
+#        Options may be given to rcc, such as those found
+#        when executing "rcc -help"
+#
+#  macro QT4_AUTOMOC(inputfile ... )
+#  macro QT4_GENERATE_MOC(inputfile outputfile )
+#
+#  macro QT4_ADD_DBUS_INTERFACE(outfiles interface basename)
+#        create a the interface header and implementation files with the 
+#        given basename from the given interface xml file and add it to 
+#        the list of sources.
+#        To disable generating a namespace header, set the source file property 
+#        NO_NAMESPACE to TRUE on the interface file.
+#
+#  macro QT4_ADD_DBUS_INTERFACES(outfiles inputfile ... )
+#        create the interface header and implementation files 
+#        for all listed interface xml files
+#        the name will be automatically determined from the name of the xml file
+#        To disable generating namespace headers, set the source file property 
+#        NO_NAMESPACE to TRUE for these inputfiles.
+#
+#  macro QT4_ADD_DBUS_ADAPTOR(outfiles xmlfile parentheader parentclassname [basename] [classname])
+#        create a dbus adaptor (header and implementation file) from the xml file
+#        describing the interface, and add it to the list of sources. The adaptor
+#        forwards the calls to a parent class, defined in parentheader and named
+#        parentclassname. The name of the generated files will be
+#        <basename>adaptor.{cpp,h} where basename defaults to the basename of the xml file.
+#        If <classname> is provided, then it will be used as the classname of the
+#        adaptor itself.
+#
+#  macro QT4_GENERATE_DBUS_INTERFACE( header [interfacename] OPTIONS ...)
+#        generate the xml interface file from the given header.
+#        If the optional argument interfacename is omitted, the name of the 
+#        interface file is constructed from the basename of the header with
+#        the suffix .xml appended.
+#        Options may be given to uic, such as those found when executing "qdbuscpp2xml --help"
+#
+#  QT_FOUND         If false, don't try to use Qt.
+#  QT4_FOUND        If false, don't try to use Qt 4.
+#
+#  QT4_QTCORE_FOUND        True if QtCore was found.
+#  QT4_QTGUI_FOUND         True if QtGui was found.
+#  QT4_QT3SUPPORT_FOUND    True if Qt3Support was found.
+#  QT4_QTASSISTANT_FOUND   True if QtAssistant was found.
+#  QT4_QTDBUS_FOUND        True if QtDBus was found.
+#  QT4_QTDESIGNER_FOUND    True if QtDesigner was found.
+#  QT4_QTDESIGNERCOMPONENTS True if QtDesignerComponents was found.
+#  QT4_QTMOTIF_FOUND       True if QtMotif was found.
+#  QT4_QTNETWORK_FOUND     True if QtNetwork was found.
+#  QT4_QTNSPLUGIN_FOUND    True if QtNsPlugin was found.
+#  QT4_QTOPENGL_FOUND      True if QtOpenGL was found.
+#  QT4_QTSQL_FOUND         True if QtSql was found.
+#  QT4_QTXML_FOUND         True if QtXml was found.
+#  QT4_QTSVG_FOUND         True if QtSvg was found.
+#  QT4_QTSCRIPT_FOUND      True if QtScript was found.
+#  QT4_QTTEST_FOUND        True if QtTest was found.
+#  QT4_QTUITOOLS_FOUND     True if QtUiTools was found.
+#                      
+#  QT4_DEFINITIONS   Definitions to use when compiling code that uses Qt.
+#                  
+#  QT4_INCLUDES      List of paths to all include directories of 
+#                   Qt4 QT4_INCLUDE_DIR and QT4_QTCORE_INCLUDE_DIR are
+#                   always in this variable even if NOTFOUND,
+#                   all other INCLUDE_DIRS are
+#                   only added if they are found.
+#   
+#  QT4_INCLUDE_DIR              Path to "include" of Qt4
+#  QT4_QT4_INCLUDE_DIR           Path to "include/Qt" 
+#  QT4_QT3SUPPORT_INCLUDE_DIR   Path to "include/Qt3Support" 
+#  QT4_QTASSISTANT_INCLUDE_DIR  Path to "include/QtAssistant" 
+#  QT4_QTCORE_INCLUDE_DIR       Path to "include/QtCore"         
+#  QT4_QTDESIGNER_INCLUDE_DIR   Path to "include/QtDesigner" 
+#  QT4_QTDESIGNERCOMPONENTS_INCLUDE_DIR   Path to "include/QtDesigner"
+#  QT4_QTDBUS_INCLUDE_DIR       Path to "include/QtDBus" 
+#  QT4_QTGUI_INCLUDE_DIR        Path to "include/QtGui" 
+#  QT4_QTMOTIF_INCLUDE_DIR      Path to "include/QtMotif" 
+#  QT4_QTNETWORK_INCLUDE_DIR    Path to "include/QtNetwork" 
+#  QT4_QTNSPLUGIN_INCLUDE_DIR   Path to "include/QtNsPlugin" 
+#  QT4_QTOPENGL_INCLUDE_DIR     Path to "include/QtOpenGL" 
+#  QT4_QTSQL_INCLUDE_DIR        Path to "include/QtSql" 
+#  QT4_QTXML_INCLUDE_DIR        Path to "include/QtXml" 
+#  QT4_QTSVG_INCLUDE_DIR        Path to "include/QtSvg"
+#  QT4_QTSCRIPT_INCLUDE_DIR     Path to "include/QtScript"
+#  QT4_QTTEST_INCLUDE_DIR       Path to "include/QtTest"
+#                            
+#  QT4_LIBRARY_DIR              Path to "lib" of Qt4
+# 
+#  QT4_PLUGINS_DIR              Path to "plugins" for Qt4
+#                            
+# For every library of Qt, a QT4_QTFOO_LIBRARY variable is defined, with the full path to the library.
+#
+# So there are the following variables:
+# The Qt3Support library:     QT4_QT3SUPPORT_LIBRARY
+#
+# The QtAssistant library:    QT4_QTASSISTANT_LIBRARY
+#
+# The QtCore library:         QT4_QTCORE_LIBRARY
+#
+# The QtDBus library:         QT4_QTDBUS_LIBRARY
+#
+# The QtDesigner library:     QT4_QTDESIGNER_LIBRARY
+#
+# The QtDesignerComponents library:     QT4_QTDESIGNERCOMPONENTS_LIBRARY
+#
+# The QtGui library:          QT4_QTGUI_LIBRARY
+#
+# The QtMotif library:        QT4_QTMOTIF_LIBRARY
+#
+# The QtNetwork library:      QT4_QTNETWORK_LIBRARY
+#
+# The QtNsPLugin library:     QT4_QTNSPLUGIN_LIBRARY
+#
+# The QtOpenGL library:       QT4_QTOPENGL_LIBRARY
+#
+# The QtSql library:          QT4_QTSQL_LIBRARY
+#
+# The QtXml library:          QT4_QTXML_LIBRARY
+#
+# The QtSvg library:          QT4_QTSVG_LIBRARY
+#
+# The QtScript library:       QT4_QTSCRIPT_LIBRARY
+#
+# The QtTest library:         QT4_QTTEST_LIBRARY
+#
+# The qtmain library for Windows QT4_QTMAIN_LIBRARY
+#
+# The QtUiTools library:      QT4_QTUITOOLS_LIBRARY
+#  
+# also defined, but NOT for general use are
+#  QT4_MOC_EXECUTABLE         Where to find the moc tool.
+#  QT4_UIC_EXECUTABLE         Where to find the uic tool.
+#  QT_UIC3_EXECUTABLE         Where to find the uic3 tool.
+#  QT_RCC_EXECUTABLE          Where to find the rcc tool
+#  QT_DBUSCPP2XML_EXECUTABLE  Where to find the qdbuscpp2xml tool.
+#  QT_DBUSXML2CPP_EXECUTABLE  Where to find the qdbusxml2cpp tool.
+#  
+#  QT_DOC_DIR                Path to "doc" of Qt4
+#  QT_MKSPECS_DIR            Path to "mkspecs" of Qt4
+#
+#
+# These are around for backwards compatibility 
+# they will be set
+#  QT_WRAP_CPP  Set true if QT4_MOC_EXECUTABLE is found
+#  QT_WRAP_UI   Set true if QT4_UIC_EXECUTABLE is found
+#  
+# These variables do _NOT_ have any effect anymore (compared to FindQt.cmake)
+#  QT_MT_REQUIRED         Qt4 is now always multithreaded
+#  
+# These variables are set to "" Because Qt structure changed 
+# (They make no sense in Qt4)
+#  QT4_QT_LIBRARY        Qt-Library is now split
+
+# Copyright (c) 2002 Kitware, Inc., Insight Consortium.  All rights reserved.
+# See Copyright.txt or http://www.cmake.org/HTML/Copyright.html for details.
+
+if (QT4_QMAKE_FOUND)
+   # Check already done in this cmake run, nothing more to do
+
+else (QT4_QMAKE_FOUND)
+
+# check that QT_NO_DEBUG is defined for release configurations
+MACRO(QT_CHECK_FLAG_EXISTS FLAG VAR DOC)
+  IF(NOT ${VAR} MATCHES "${FLAG}")
+    SET(${VAR} "${${VAR}} ${FLAG}" 
+      CACHE STRING "Flags used by the compiler during ${DOC} builds." FORCE)
+  ENDIF(NOT ${VAR} MATCHES "${FLAG}")
+ENDMACRO(QT_CHECK_FLAG_EXISTS FLAG VAR)
+QT_CHECK_FLAG_EXISTS(-DQT_NO_DEBUG CMAKE_CXX_FLAGS_RELWITHDEBINFO "Release with Debug Info")
+QT_CHECK_FLAG_EXISTS(-DQT_NO_DEBUG CMAKE_CXX_FLAGS_RELEASE "release")
+QT_CHECK_FLAG_EXISTS(-DQT_NO_DEBUG CMAKE_CXX_FLAGS_MINSIZEREL "release minsize")
+
+INCLUDE(CheckSymbolExists)
+INCLUDE(MacroAddFileDependencies)
+INCLUDE(MacroPushRequiredVars)
+
+SET(QT_USE_FILE ${CMAKE_ROOT}/Modules/UseQt4.cmake)
+
+SET( QT4_DEFINITIONS "")
+
+IF (WIN32)
+  SET(QT4_DEFINITIONS -DQT_DLL)
+ENDIF(WIN32)
+
+SET(QT4_INSTALLED_VERSION_TOO_OLD FALSE)
+
+#  macro for asking qmake to process pro files
+MACRO(QT_QUERY_QMAKE outvar invar)
+  FILE(WRITE ${CMAKE_CURRENT_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeTmpQmake/tmp.pro
+    "message(CMAKE_MESSAGE<$$${invar}>)")
+
+  # Invoke qmake with the tmp.pro program to get the desired
+  # information.  Use the same variable for both stdout and stderr
+  # to make sure we get the output on all platforms.
+  EXECUTE_PROCESS(COMMAND ${QT_QMAKE_EXECUTABLE}
+    WORKING_DIRECTORY  
+    ${CMAKE_CURRENT_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeTmpQmake
+    OUTPUT_VARIABLE _qmake_query_output
+    RESULT_VARIABLE _qmake_result
+    ERROR_VARIABLE _qmake_query_output )
+  
+  FILE(REMOVE_RECURSE 
+    "${CMAKE_CURRENT_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeTmpQmake")
+
+  IF(_qmake_result)
+    MESSAGE(WARNING " querying qmake for ${invar}.  qmake reported:\n${_qmake_query_output}")
+  ELSE(_qmake_result)
+    STRING(REGEX REPLACE ".*CMAKE_MESSAGE<([^>]*).*" "\\1" ${outvar} "${_qmake_query_output}")
+  ENDIF(_qmake_result)
+
+ENDMACRO(QT_QUERY_QMAKE)
+
+GET_FILENAME_COMPONENT(qt_install_version "[HKEY_CURRENT_USER\\Software\\trolltech\\Versions;DefaultQtVersion]" NAME)
+# check for qmake
+FIND_PROGRAM(QT_QMAKE_EXECUTABLE NAMES qmake qmake4 qmake-qt4 PATHS
+  "[HKEY_CURRENT_USER\\Software\\Trolltech\\Qt3Versions\\4.0.0;InstallDir]/bin"
+  "[HKEY_CURRENT_USER\\Software\\Trolltech\\Versions\\4.0.0;InstallDir]/bin"
+  "[HKEY_CURRENT_USER\\Software\\Trolltech\\Versions\\${qt_install_version};InstallDir]/bin"
+  $ENV{QTDIR}/bin
+)
+
+IF (QT_QMAKE_EXECUTABLE)
+
+  SET(QT4_QMAKE_FOUND FALSE)
+  
+  EXEC_PROGRAM(${QT_QMAKE_EXECUTABLE} ARGS "-query QT_VERSION" OUTPUT_VARIABLE QTVERSION)
+
+  # check for qt3 qmake and then try and find qmake4 or qmake-qt4 in the path
+  IF("${QTVERSION}" MATCHES "Unknown")
+    SET(QT_QMAKE_EXECUTABLE NOTFOUND CACHE FILEPATH "" FORCE)
+    FIND_PROGRAM(QT_QMAKE_EXECUTABLE NAMES qmake4 qmake-qt4 PATHS
+      "[HKEY_CURRENT_USER\\Software\\Trolltech\\Qt3Versions\\4.0.0;InstallDir]/bin"
+      "[HKEY_CURRENT_USER\\Software\\Trolltech\\Versions\\4.0.0;InstallDir]/bin"
+      $ENV{QTDIR}/bin
+      )
+    IF(QT_QMAKE_EXECUTABLE)
+      EXEC_PROGRAM(${QT_QMAKE_EXECUTABLE} 
+        ARGS "-query QT_VERSION" OUTPUT_VARIABLE QTVERSION)
+    ENDIF(QT_QMAKE_EXECUTABLE)
+  ENDIF("${QTVERSION}" MATCHES "Unknown")
+
+  # check that we found the Qt4 qmake, Qt3 qmake output won't match here
+  STRING(REGEX MATCH "^[0-9]+\\.[0-9]+\\.[0-9]+" qt_version_tmp "${QTVERSION}")
+  IF (qt_version_tmp)
+
+    # we need at least version 4.0.0
+    IF (NOT QT4_MIN_VERSION)
+      SET(QT4_MIN_VERSION "4.0.0")
+    ENDIF (NOT QT4_MIN_VERSION)
+
+    #now parse the parts of the user given version string into variables
+    STRING(REGEX MATCH "^[0-9]+\\.[0-9]+\\.[0-9]+" req_qt_major_vers "${QT4_MIN_VERSION}")
+    IF (NOT req_qt_major_vers)
+      MESSAGE( FATAL_ERROR "Invalid Qt version string given: \"${QT4_MIN_VERSION}\", expected e.g. \"4.0.1\"")
+    ENDIF (NOT req_qt_major_vers)
+
+    # now parse the parts of the user given version string into variables
+    STRING(REGEX REPLACE "^([0-9]+)\\.[0-9]+\\.[0-9]+" "\\1" req_qt_major_vers "${QT4_MIN_VERSION}")
+    STRING(REGEX REPLACE "^[0-9]+\\.([0-9])+\\.[0-9]+" "\\1" req_qt_minor_vers "${QT4_MIN_VERSION}")
+    STRING(REGEX REPLACE "^[0-9]+\\.[0-9]+\\.([0-9]+)" "\\1" req_qt_patch_vers "${QT4_MIN_VERSION}")
+
+    IF (NOT req_qt_major_vers EQUAL 4)
+      MESSAGE( FATAL_ERROR "Invalid Qt version string given: \"${QT4_MIN_VERSION}\", major version 4 is required, e.g. \"4.0.1\"")
+    ENDIF (NOT req_qt_major_vers EQUAL 4)
+
+    # and now the version string given by qmake
+    STRING(REGEX REPLACE "^([0-9]+)\\.[0-9]+\\.[0-9]+.*" "\\1" found_qt_major_vers "${QTVERSION}")
+    STRING(REGEX REPLACE "^[0-9]+\\.([0-9])+\\.[0-9]+.*" "\\1" found_qt_minor_vers "${QTVERSION}")
+    STRING(REGEX REPLACE "^[0-9]+\\.[0-9]+\\.([0-9]+).*" "\\1" found_qt_patch_vers "${QTVERSION}")
+
+    # compute an overall version number which can be compared at once
+    MATH(EXPR req_vers "${req_qt_major_vers}*10000 + ${req_qt_minor_vers}*100 + ${req_qt_patch_vers}")
+    MATH(EXPR found_vers "${found_qt_major_vers}*10000 + ${found_qt_minor_vers}*100 + ${found_qt_patch_vers}")
+
+    IF (found_vers LESS req_vers)
+      SET(QT4_QMAKE_FOUND FALSE)
+      SET(QT4_INSTALLED_VERSION_TOO_OLD TRUE)
+    ELSE (found_vers LESS req_vers)
+      SET(QT4_QMAKE_FOUND TRUE)
+    ENDIF (found_vers LESS req_vers)
+  ENDIF (qt_version_tmp)
+
+ENDIF (QT_QMAKE_EXECUTABLE)
+
+IF (QT4_QMAKE_FOUND)
+
+  if (WIN32)
+    # get qt install dir 
+    get_filename_component(_DIR ${QT_QMAKE_EXECUTABLE} PATH )
+    get_filename_component(QT_INSTALL_DIR ${_DIR} PATH )
+  endif (WIN32)
+
+  # ask qmake for the library dir
+  # Set QT4_LIBRARY_DIR
+  IF (NOT QT4_LIBRARY_DIR)
+    EXEC_PROGRAM( ${QT_QMAKE_EXECUTABLE}
+      ARGS "-query QT_INSTALL_LIBS"
+      OUTPUT_VARIABLE QT4_LIBRARY_DIR_TMP )
+    IF(EXISTS "${QT4_LIBRARY_DIR_TMP}")
+      SET(QT4_LIBRARY_DIR ${QT4_LIBRARY_DIR_TMP} CACHE PATH "Qt library dir")
+    ELSE(EXISTS "${QT4_LIBRARY_DIR_TMP}")
+      MESSAGE("Warning: QT_QMAKE_EXECUTABLE reported QT_INSTALL_LIBS as ${QT4_LIBRARY_DIR_TMP}")
+      MESSAGE("Warning: ${QT4_LIBRARY_DIR_TMP} does NOT exist, Qt must NOT be installed correctly.")
+    ENDIF(EXISTS "${QT4_LIBRARY_DIR_TMP}")
+  ENDIF(NOT QT4_LIBRARY_DIR)
+  
+  IF (APPLE)
+    IF (EXISTS ${QT4_LIBRARY_DIR}/QtCore.framework)
+      SET(QT_USE_FRAMEWORKS ON
+        CACHE BOOL "Set to ON if Qt build uses frameworks.")
+    ELSE (EXISTS ${QT4_LIBRARY_DIR}/QtCore.framework)
+      SET(QT_USE_FRAMEWORKS OFF
+        CACHE BOOL "Set to ON if Qt build uses frameworks.")
+    ENDIF (EXISTS ${QT4_LIBRARY_DIR}/QtCore.framework)
+    
+    MARK_AS_ADVANCED(QT_USE_FRAMEWORKS)
+  ENDIF (APPLE)
+  
+  # ask qmake for the binary dir
+  IF (NOT QT_BINARY_DIR)
+     EXEC_PROGRAM(${QT_QMAKE_EXECUTABLE}
+        ARGS "-query QT_INSTALL_BINS"
+        OUTPUT_VARIABLE qt_bins )
+     SET(QT_BINARY_DIR ${qt_bins} CACHE INTERNAL "")
+  ENDIF (NOT QT_BINARY_DIR)
+
+  # ask qmake for the include dir
+  IF (NOT QT_HEADERS_DIR)
+      EXEC_PROGRAM( ${QT_QMAKE_EXECUTABLE}
+        ARGS "-query QT_INSTALL_HEADERS" 
+        OUTPUT_VARIABLE qt_headers )
+      SET(QT_HEADERS_DIR ${qt_headers} CACHE INTERNAL "")
+  ENDIF(NOT QT_HEADERS_DIR)
+
+
+  # ask qmake for the documentation directory
+  IF (NOT QT_DOC_DIR)
+    EXEC_PROGRAM( ${QT_QMAKE_EXECUTABLE}
+      ARGS "-query QT_INSTALL_DOCS"
+      OUTPUT_VARIABLE qt_doc_dir )
+    SET(QT_DOC_DIR ${qt_doc_dir} CACHE PATH "The location of the Qt docs")
+  ENDIF (NOT QT_DOC_DIR)
+
+  # ask qmake for the mkspecs directory
+  IF (NOT QT_MKSPECS_DIR)
+    EXEC_PROGRAM( ${QT_QMAKE_EXECUTABLE}
+      ARGS "-query QMAKE_MKSPECS"
+      OUTPUT_VARIABLE qt_mkspecs_dirs )
+    STRING(REPLACE ":" ";" qt_mkspecs_dirs "${qt_mkspecs_dirs}")
+    FIND_PATH(QT_MKSPECS_DIR qconfig.pri PATHS ${qt_mkspecs_dirs}
+      DOC "The location of the Qt mkspecs containing qconfig.pri"
+      NO_DEFAULT_PATH )
+  ENDIF (NOT QT_MKSPECS_DIR)
+
+  # ask qmake for the plugins directory
+  IF (NOT QT4_PLUGINS_DIR)
+    EXEC_PROGRAM( ${QT_QMAKE_EXECUTABLE}
+      ARGS "-query QT_INSTALL_PLUGINS"
+      OUTPUT_VARIABLE qt_plugins_dir )
+    SET(QT4_PLUGINS_DIR ${qt_plugins_dir} CACHE PATH "The location of the Qt plugins")
+  ENDIF (NOT QT4_PLUGINS_DIR)
+  ########################################
+  #
+  #       Setting the INCLUDE-Variables
+  #
+  ########################################
+
+  FIND_PATH(QT4_QTCORE_INCLUDE_DIR QtGlobal
+    ${QT_HEADERS_DIR}/QtCore
+    ${QT4_LIBRARY_DIR}/QtCore.framework/Headers
+    NO_DEFAULT_PATH
+    )
+
+  # Set QT4_INCLUDE_DIR by removine "/QtCore" in the string ${QT4_QTCORE_INCLUDE_DIR}
+  IF( QT4_QTCORE_INCLUDE_DIR AND NOT QT4_INCLUDE_DIR)
+    IF (QT_USE_FRAMEWORKS)
+      SET(QT4_INCLUDE_DIR ${QT_HEADERS_DIR})
+    ELSE (QT_USE_FRAMEWORKS)
+      STRING( REGEX REPLACE "/QtCore$" "" qt4_include_dir ${QT4_QTCORE_INCLUDE_DIR})
+      SET( QT4_INCLUDE_DIR ${qt4_include_dir} CACHE PATH "")
+    ENDIF (QT_USE_FRAMEWORKS)
+  ENDIF( QT4_QTCORE_INCLUDE_DIR AND NOT QT4_INCLUDE_DIR)
+
+  IF( NOT QT4_INCLUDE_DIR)
+    IF( NOT Qt4_FIND_QUIETLY AND Qt4_FIND_REQUIRED)
+      MESSAGE( FATAL_ERROR "Could NOT find QtGlobal header")
+    ENDIF( NOT Qt4_FIND_QUIETLY AND Qt4_FIND_REQUIRED)
+  ENDIF( NOT QT4_INCLUDE_DIR)
+
+  #############################################
+  #
+  # Find out what window system we're using
+  #
+  #############################################
+  # Save required includes and required_flags variables
+  macro_push_required_vars()
+  # Add QT4_INCLUDE_DIR to CMAKE_REQUIRED_INCLUDES
+  SET(CMAKE_REQUIRED_INCLUDES "${CMAKE_REQUIRED_INCLUDES};${QT4_INCLUDE_DIR}")
+  # On Mac OS X when Qt has framework support, also add the framework path
+  IF( QT_USE_FRAMEWORKS )
+    SET(CMAKE_REQUIRED_FLAGS "-F${QT4_LIBRARY_DIR} ")
+  ENDIF( QT_USE_FRAMEWORKS )
+  # Check for Window system symbols (note: only one should end up being set)
+  CHECK_SYMBOL_EXISTS(Q_WS_X11 "QtCore/qglobal.h" Q_WS_X11)
+  CHECK_SYMBOL_EXISTS(Q_WS_WIN "QtCore/qglobal.h" Q_WS_WIN)
+  CHECK_SYMBOL_EXISTS(Q_WS_QWS "QtCore/qglobal.h" Q_WS_QWS)
+  CHECK_SYMBOL_EXISTS(Q_WS_MAC "QtCore/qglobal.h" Q_WS_MAC)
+
+  IF (QT4_QTCOPY_REQUIRED)
+     CHECK_SYMBOL_EXISTS(QT_IS_QTCOPY "QtCore/qglobal.h" QT_KDE_QT_COPY)
+     IF (NOT QT_IS_QTCOPY)
+        MESSAGE(FATAL_ERROR "qt-copy is required, but hasn't been found")
+     ENDIF (NOT QT_IS_QTCOPY)
+  ENDIF (QT4_QTCOPY_REQUIRED)
+
+  # Restore CMAKE_REQUIRED_INCLUDES+CMAKE_REQUIRED_FLAGS variables
+  macro_pop_required_vars()
+  #
+  #############################################
+
+  IF (QT_USE_FRAMEWORKS)
+    SET(QT4_DEFINITIONS ${QT4_DEFINITIONS} -F${QT4_LIBRARY_DIR} -L${QT4_LIBRARY_DIR} )
+  ENDIF (QT_USE_FRAMEWORKS)
+
+  # Set QT4_QT3SUPPORT_INCLUDE_DIR
+  FIND_PATH(QT4_QT3SUPPORT_INCLUDE_DIR Qt3Support
+    PATHS
+    ${QT4_INCLUDE_DIR}/Qt3Support
+    ${QT4_LIBRARY_DIR}/Qt3Support.framework/Headers
+    NO_DEFAULT_PATH
+    )
+
+  # Set QT4_QT4_INCLUDE_DIR
+  FIND_PATH(QT4_QT4_INCLUDE_DIR qglobal.h
+    PATHS
+    ${QT4_INCLUDE_DIR}/Qt
+    ${QT4_LIBRARY_DIR}/QtCore.framework/Headers
+    NO_DEFAULT_PATH
+    )
+
+  # Set QT4_QTGUI_INCLUDE_DIR
+  FIND_PATH(QT4_QTGUI_INCLUDE_DIR QtGui
+    PATHS
+    ${QT4_INCLUDE_DIR}/QtGui
+    ${QT4_LIBRARY_DIR}/QtGui.framework/Headers
+    NO_DEFAULT_PATH
+    )
+
+  # Set QT4_QTSVG_INCLUDE_DIR
+  FIND_PATH(QT4_QTSVG_INCLUDE_DIR QtSvg
+    PATHS
+    ${QT4_INCLUDE_DIR}/QtSvg
+    ${QT4_LIBRARY_DIR}/QtSvg.framework/Headers
+    NO_DEFAULT_PATH
+    )
+
+  # Set QT4_QTSCRIPT_INCLUDE_DIR
+  FIND_PATH(QT4_QTSCRIPT_INCLUDE_DIR QtScript
+    PATHS
+    ${QT4_INCLUDE_DIR}/QtScript
+    ${QT4_LIBRARY_DIR}/QtScript.framework/Headers
+    NO_DEFAULT_PATH
+    )
+
+  # Set QT4_QTTEST_INCLUDE_DIR
+  FIND_PATH(QT4_QTTEST_INCLUDE_DIR QtTest
+    PATHS
+    ${QT4_INCLUDE_DIR}/QtTest
+    ${QT4_LIBRARY_DIR}/QtTest.framework/Headers
+    NO_DEFAULT_PATH
+    )
+
+  # Set QT4_QTUITOOLS_INCLUDE_DIR
+  FIND_PATH(QT4_QTUITOOLS_INCLUDE_DIR QtUiTools
+    PATHS
+    ${QT4_INCLUDE_DIR}/QtUiTools
+    ${QT4_LIBRARY_DIR}/QtUiTools.framework/Headers
+    NO_DEFAULT_PATH
+    )
+
+
+
+  # Set QT4_QTMOTIF_INCLUDE_DIR
+  IF(Q_WS_X11)
+    FIND_PATH(QT4_QTMOTIF_INCLUDE_DIR QtMotif PATHS ${QT4_INCLUDE_DIR}/QtMotif NO_DEFAULT_PATH )
+  ENDIF(Q_WS_X11)
+
+  # Set QT4_QTNETWORK_INCLUDE_DIR
+  FIND_PATH(QT4_QTNETWORK_INCLUDE_DIR QtNetwork
+    PATHS
+    ${QT4_INCLUDE_DIR}/QtNetwork
+    ${QT4_LIBRARY_DIR}/QtNetwork.framework/Headers
+    NO_DEFAULT_PATH
+    )
+
+  # Set QT4_QTNSPLUGIN_INCLUDE_DIR
+  FIND_PATH(QT4_QTNSPLUGIN_INCLUDE_DIR QtNsPlugin
+    PATHS
+    ${QT4_INCLUDE_DIR}/QtNsPlugin
+    ${QT4_LIBRARY_DIR}/QtNsPlugin.framework/Headers
+    NO_DEFAULT_PATH
+    )
+
+  # Set QT4_QTOPENGL_INCLUDE_DIR
+  FIND_PATH(QT4_QTOPENGL_INCLUDE_DIR QtOpenGL
+    PATHS
+    ${QT4_INCLUDE_DIR}/QtOpenGL
+    ${QT4_LIBRARY_DIR}/QtOpenGL.framework/Headers
+    NO_DEFAULT_PATH
+    )
+
+  # Set QT4_QTSQL_INCLUDE_DIR
+  FIND_PATH(QT4_QTSQL_INCLUDE_DIR QtSql
+    PATHS
+    ${QT4_INCLUDE_DIR}/QtSql
+    ${QT4_LIBRARY_DIR}/QtSql.framework/Headers
+    NO_DEFAULT_PATH
+    )
+
+  # Set QT4_QTXML_INCLUDE_DIR
+  FIND_PATH(QT4_QTXML_INCLUDE_DIR QtXml
+    PATHS
+    ${QT4_INCLUDE_DIR}/QtXml
+    ${QT4_LIBRARY_DIR}/QtXml.framework/Headers
+    NO_DEFAULT_PATH
+    )
+
+  # Set QT4_QTASSISTANT_INCLUDE_DIR
+  FIND_PATH(QT4_QTASSISTANT_INCLUDE_DIR QtAssistant
+    PATHS
+    ${QT4_INCLUDE_DIR}/QtAssistant
+    ${QT_HEADERS_DIR}/QtAssistant
+    ${QT4_LIBRARY_DIR}/QtAssistant.framework/Headers
+    NO_DEFAULT_PATH
+    )
+
+  # Set QT4_QTDESIGNER_INCLUDE_DIR
+  FIND_PATH(QT4_QTDESIGNER_INCLUDE_DIR QDesignerComponents
+    PATHS
+    ${QT4_INCLUDE_DIR}/QtDesigner
+    ${QT_HEADERS_DIR}/QtDesigner 
+    ${QT4_LIBRARY_DIR}/QtDesigner.framework/Headers
+    NO_DEFAULT_PATH
+    )
+
+  # Set QT4_QTDESIGNERCOMPONENTS_INCLUDE_DIR
+  FIND_PATH(QT4_QTDESIGNERCOMPONENTS_INCLUDE_DIR QDesignerComponents
+    PATHS
+    ${QT4_INCLUDE_DIR}/QtDesigner
+    ${QT_HEADERS_DIR}/QtDesigner
+    NO_DEFAULT_PATH
+    )
+
+
+  # Set QT4_QTDBUS_INCLUDE_DIR
+  FIND_PATH(QT4_QTDBUS_INCLUDE_DIR QtDBus
+    PATHS
+    ${QT4_INCLUDE_DIR}/QtDBus
+    ${QT_HEADERS_DIR}/QtDBus
+    NO_DEFAULT_PATH
+    )
+
+  # Make variables changeble to the advanced user
+  MARK_AS_ADVANCED( QT4_LIBRARY_DIR QT4_INCLUDE_DIR QT4_QT4_INCLUDE_DIR QT_DOC_DIR QT_MKSPECS_DIR QT4_PLUGINS_DIR)
+
+  # Set QT4_INCLUDES
+  SET( QT4_INCLUDES ${QT4_QT4_INCLUDE_DIR} ${QT_MKSPECS_DIR}/default ${QT4_INCLUDE_DIR})
+
+
+  ########################################
+  #
+  #       Setting the LIBRARY-Variables
+  #
+  ########################################
+
+  IF (QT_USE_FRAMEWORKS)
+    # If FIND_LIBRARY found libraries in Apple frameworks, we would NOT have
+    # to jump through these hoops.
+    IF(EXISTS ${QT4_LIBRARY_DIR}/QtCore.framework)
+      SET(QT4_QTCORE_FOUND TRUE)
+      SET(QT4_QTCORE_LIBRARY "-F${QT4_LIBRARY_DIR} -framework QtCore" CACHE STRING "The QtCore library.")
+    ELSE(EXISTS ${QT4_LIBRARY_DIR}/QtCore.framework)
+      SET(QT4_QTCORE_FOUND FALSE)
+    ENDIF(EXISTS ${QT4_LIBRARY_DIR}/QtCore.framework)
+
+    IF(EXISTS ${QT4_LIBRARY_DIR}/QtGui.framework)
+      SET(QT4_QTGUI_FOUND TRUE)
+      SET(QT4_QTGUI_LIBRARY "-F${QT4_LIBRARY_DIR} -framework QtGui" CACHE STRING "The QtGui library.")
+    ELSE(EXISTS ${QT4_LIBRARY_DIR}/QtGui.framework)
+      SET(QT4_QTGUI_FOUND FALSE)
+    ENDIF(EXISTS ${QT4_LIBRARY_DIR}/QtGui.framework)
+
+    IF(EXISTS ${QT4_LIBRARY_DIR}/Qt3Support.framework)
+      SET(QT4_QT3SUPPORT_FOUND TRUE)
+      SET(QT4_QT3SUPPORT_LIBRARY "-F${QT4_LIBRARY_DIR} -framework Qt3Support" CACHE STRING "The Qt3Support library.")
+    ELSE(EXISTS ${QT4_LIBRARY_DIR}/Qt3Support.framework)
+      SET(QT4_QT3SUPPORT_FOUND FALSE)
+    ENDIF(EXISTS ${QT4_LIBRARY_DIR}/Qt3Support.framework)
+
+    IF(EXISTS ${QT4_LIBRARY_DIR}/QtNetwork.framework)
+      SET(QT4_QTNETWORK_FOUND TRUE)
+      SET(QT4_QTNETWORK_LIBRARY "-F${QT4_LIBRARY_DIR} -framework QtNetwork" CACHE STRING "The QtNetwork library.")
+    ELSE(EXISTS ${QT4_LIBRARY_DIR}/QtNetwork.framework)
+      SET(QT4_QTNETWORK_FOUND FALSE)
+    ENDIF(EXISTS ${QT4_LIBRARY_DIR}/QtNetwork.framework)
+
+    IF(EXISTS ${QT4_LIBRARY_DIR}/QtOpenGL.framework)
+      SET(QT4_QTOPENGL_FOUND TRUE)
+      SET(QT4_QTOPENGL_LIBRARY "-F${QT4_LIBRARY_DIR} -framework QtOpenGL" CACHE STRING "The QtOpenGL library.")
+    ELSE(EXISTS ${QT4_LIBRARY_DIR}/QtOpenGL.framework)
+      SET(QT4_QTOPENGL_FOUND FALSE)
+    ENDIF(EXISTS ${QT4_LIBRARY_DIR}/QtOpenGL.framework)
+
+    IF(EXISTS ${QT4_LIBRARY_DIR}/QtSql.framework)
+      SET(QT4_QTSQL_FOUND TRUE)
+      SET(QT4_QTSQL_LIBRARY "-F${QT4_LIBRARY_DIR} -framework QtSql" CACHE STRING "The QtSql library.")
+    ELSE(EXISTS ${QT4_LIBRARY_DIR}/QtSql.framework)
+      SET(QT4_QTSQL_FOUND FALSE)
+    ENDIF(EXISTS ${QT4_LIBRARY_DIR}/QtSql.framework)
+
+    IF(EXISTS ${QT4_LIBRARY_DIR}/QtXml.framework)
+      SET(QT4_QTXML_FOUND TRUE)
+      SET(QT4_QTXML_LIBRARY "-F${QT4_LIBRARY_DIR} -framework QtXml" CACHE STRING "The QtXml library.")
+    ELSE(EXISTS ${QT4_LIBRARY_DIR}/QtXml.framework)
+      SET(QT4_QTXML_FOUND FALSE)
+    ENDIF(EXISTS ${QT4_LIBRARY_DIR}/QtXml.framework)
+
+    IF(EXISTS ${QT4_LIBRARY_DIR}/QtSvg.framework)
+      SET(QT4_QTSVG_FOUND TRUE)
+      SET(QT4_QTSVG_LIBRARY "-F${QT4_LIBRARY_DIR} -framework QtSvg" CACHE STRING "The QtSvg library.")
+    ELSE(EXISTS ${QT4_LIBRARY_DIR}/QtSvg.framework)
+      SET(QT4_QTSVG_FOUND FALSE)
+    ENDIF(EXISTS ${QT4_LIBRARY_DIR}/QtSvg.framework)
+
+    IF(EXISTS ${QT4_LIBRARY_DIR}/QtDBus.framework)
+      SET(QT4_QTDBUS_FOUND TRUE)
+      SET(QT4_QTDBUS_LIBRARY "-F${QT4_LIBRARY_DIR} -framework QtDBus" CACHE STRING "The QtDBus library.")
+    ELSE(EXISTS ${QT4_LIBRARY_DIR}/QtDBus.framework)
+      SET(QT4_QTDBUS_FOUND FALSE)
+    ENDIF(EXISTS ${QT4_LIBRARY_DIR}/QtDBus.framework)
+
+    IF(EXISTS ${QT4_LIBRARY_DIR}/QtTest.framework)
+      SET(QT4_QTTEST_FOUND TRUE)
+      SET(QT4_QTTEST_LIBRARY "-F${QT4_LIBRARY_DIR} -framework QtTest" CACHE STRING "The QtTest library.")
+    ELSE(EXISTS ${QT4_LIBRARY_DIR}/QtTest.framework)
+      SET(QT4_QTTEST_FOUND FALSE)
+    ENDIF(EXISTS ${QT4_LIBRARY_DIR}/QtTest.framework)
+
+    # WTF?  why don't we have frameworks?  :P
+    # Set QT4_QTUITOOLS_LIBRARY
+    FIND_LIBRARY(QT4_QTUITOOLS_LIBRARY NAMES QtUiTools QtUiTools4 PATHS ${QT4_LIBRARY_DIR} )
+    # Set QT4_QTSCRIPT_LIBRARY
+    FIND_LIBRARY(QT4_QTSCRIPT_LIBRARY NAMES QtScript QtScript4    PATHS ${QT4_LIBRARY_DIR} )
+
+  ELSE (QT_USE_FRAMEWORKS)
+    
+    # Set QT4_QTCORE_LIBRARY by searching for a lib with "QtCore."  as part of the filename
+    FIND_LIBRARY(QT4_QTCORE_LIBRARY NAMES QtCore QtCore4 QtCored4          PATHS ${QT4_LIBRARY_DIR} NO_DEFAULT_PATH )
+
+    # Set QT4_QT3SUPPORT_LIBRARY
+    FIND_LIBRARY(QT4_QT3SUPPORT_LIBRARY NAMES Qt3Support Qt3Support4 Qt3Supportd4 PATHS ${QT4_LIBRARY_DIR} NO_DEFAULT_PATH)
+
+    # Set QT4_QTGUI_LIBRARY
+    FIND_LIBRARY(QT4_QTGUI_LIBRARY NAMES QtGui QtGui4 QtGuid4            PATHS ${QT4_LIBRARY_DIR} NO_DEFAULT_PATH)
+
+    # Set QT4_QTMOTIF_LIBRARY
+    IF(Q_WS_X11)
+      FIND_LIBRARY(QT4_QTMOTIF_LIBRARY NAMES QtMotif          PATHS ${QT4_LIBRARY_DIR} NO_DEFAULT_PATH)
+    ENDIF(Q_WS_X11)
+
+    # Set QT4_QTNETWORK_LIBRARY
+    FIND_LIBRARY(QT4_QTNETWORK_LIBRARY NAMES QtNetwork QtNetwork4 QtNetworkd4 PATHS ${QT4_LIBRARY_DIR} NO_DEFAULT_PATH)
+
+    # Set QT4_QTNSPLUGIN_LIBRARY
+    FIND_LIBRARY(QT4_QTNSPLUGIN_LIBRARY NAMES QtNsPlugin      PATHS ${QT4_LIBRARY_DIR} NO_DEFAULT_PATH)
+
+    # Set QT4_QTOPENGL_LIBRARY
+    FIND_LIBRARY(QT4_QTOPENGL_LIBRARY NAMES QtOpenGL QtOpenGL4 QtOpenGLd4    PATHS ${QT4_LIBRARY_DIR} NO_DEFAULT_PATH)
+
+    # Set QT4_QTSQL_LIBRARY
+    FIND_LIBRARY(QT4_QTSQL_LIBRARY NAMES QtSql QtSql4 QtSqld4       PATHS ${QT4_LIBRARY_DIR} NO_DEFAULT_PATH)
+
+    # Set QT4_QTXML_LIBRARY
+    FIND_LIBRARY(QT4_QTXML_LIBRARY NAMES QtXml QtXml4 QtXmld4       PATHS ${QT4_LIBRARY_DIR} NO_DEFAULT_PATH)
+
+    # Set QT4_QTSVG_LIBRARY
+    FIND_LIBRARY(QT4_QTSVG_LIBRARY NAMES QtSvg QtSvg4 QtSvgd4       PATHS ${QT4_LIBRARY_DIR} NO_DEFAULT_PATH)
+
+    # Set QT4_QTSCRIPT_LIBRARY
+    FIND_LIBRARY(QT4_QTSCRIPT_LIBRARY NAMES QtScript QtScript4 QtScriptd4   PATHS ${QT4_LIBRARY_DIR} NO_DEFAULT_PATH)
+
+    # Set QT4_QTUITOOLS_LIBRARY
+    FIND_LIBRARY(QT4_QTUITOOLS_LIBRARY NAMES QtUiTools QtUiTools4 QtUiToolsd4 PATHS ${QT4_LIBRARY_DIR} NO_DEFAULT_PATH)
+
+    # Set QT4_QTTEST_LIBRARY
+    FIND_LIBRARY(QT4_QTTEST_LIBRARY NAMES QtTest QtTest4 QtTestd4          PATHS ${QT4_LIBRARY_DIR} NO_DEFAULT_PATH)
+
+    FIND_LIBRARY(QT4_QTDBUS_LIBRARY NAMES QtDBus QtDBus4 QtDBusd4         PATHS ${QT4_LIBRARY_DIR} NO_DEFAULT_PATH)
+
+    IF(MSVC)
+      FIND_LIBRARY(QT4_QTCORE_LIBRARY_RELEASE    NAMES QtCore4            PATHS ${QT4_LIBRARY_DIR} NO_DEFAULT_PATH)
+      FIND_LIBRARY(QT4_QTCORE_LIBRARY_DEBUG      NAMES QtCored4            PATHS ${QT4_LIBRARY_DIR} NO_DEFAULT_PATH)
+      FIND_LIBRARY(QT4_QT3SUPPORT_LIBRARY_RELEASE NAMES Qt3Support4        PATHS ${QT4_LIBRARY_DIR} NO_DEFAULT_PATH)
+      FIND_LIBRARY(QT4_QT3SUPPORT_LIBRARY_DEBUG  NAMES Qt3Supportd4        PATHS ${QT4_LIBRARY_DIR} NO_DEFAULT_PATH)
+      FIND_LIBRARY(QT4_QTGUI_LIBRARY_RELEASE     NAMES QtGui4             PATHS ${QT4_LIBRARY_DIR} NO_DEFAULT_PATH)
+      FIND_LIBRARY(QT4_QTGUI_LIBRARY_DEBUG       NAMES QtGuid4             PATHS ${QT4_LIBRARY_DIR} NO_DEFAULT_PATH)
+      FIND_LIBRARY(QT4_QTNETWORK_LIBRARY_RELEASE NAMES QtNetwork4         PATHS ${QT4_LIBRARY_DIR} NO_DEFAULT_PATH)
+      FIND_LIBRARY(QT4_QTNETWORK_LIBRARY_DEBUG   NAMES QtNetworkd4         PATHS ${QT4_LIBRARY_DIR} NO_DEFAULT_PATH)
+      FIND_LIBRARY(QT4_QTOPENGL_LIBRARY_RELEASE  NAMES QtOpenGL4          PATHS ${QT4_LIBRARY_DIR} NO_DEFAULT_PATH)
+      FIND_LIBRARY(QT4_QTOPENGL_LIBRARY_DEBUG    NAMES QtOpenGLd4          PATHS ${QT4_LIBRARY_DIR} NO_DEFAULT_PATH)
+      FIND_LIBRARY(QT4_QTSQL_LIBRARY_RELEASE     NAMES QtSql4             PATHS ${QT4_LIBRARY_DIR} NO_DEFAULT_PATH)
+      FIND_LIBRARY(QT4_QTSQL_LIBRARY_DEBUG       NAMES QtSqld4             PATHS ${QT4_LIBRARY_DIR} NO_DEFAULT_PATH)
+      FIND_LIBRARY(QT4_QTXML_LIBRARY_RELEASE     NAMES QtXml4             PATHS ${QT4_LIBRARY_DIR} NO_DEFAULT_PATH)
+      FIND_LIBRARY(QT4_QTXML_LIBRARY_DEBUG       NAMES QtXmld4             PATHS ${QT4_LIBRARY_DIR} NO_DEFAULT_PATH)
+      FIND_LIBRARY(QT4_QTSVG_LIBRARY_RELEASE     NAMES QtSvg4             PATHS ${QT4_LIBRARY_DIR} NO_DEFAULT_PATH)
+      FIND_LIBRARY(QT4_QTSVG_LIBRARY_DEBUG       NAMES QtSvgd4             PATHS ${QT4_LIBRARY_DIR} NO_DEFAULT_PATH)
+      FIND_LIBRARY(QT4_QTSCRIPT_LIBRARY_RELEASE  NAMES QtScript4          PATHS ${QT4_LIBRARY_DIR} NO_DEFAULT_PATH)
+      FIND_LIBRARY(QT4_QTSCRIPT_LIBRARY_DEBUG    NAMES QtScriptd4          PATHS ${QT4_LIBRARY_DIR} NO_DEFAULT_PATH)
+      FIND_LIBRARY(QT4_QTUITOOLS_LIBRARY_RELEASE NAMES QtUiTools QtUiTools4 PATHS ${QT4_LIBRARY_DIR} NO_DEFAULT_PATH)
+      FIND_LIBRARY(QT4_QTUITOOLS_LIBRARY_DEBUG   NAMES QtUiToolsd QtUiToolsd4 PATHS ${QT4_LIBRARY_DIR} NO_DEFAULT_PATH)
+      FIND_LIBRARY(QT4_QTTEST_LIBRARY_RELEASE    NAMES QtTest4            PATHS ${QT4_LIBRARY_DIR} NO_DEFAULT_PATH)
+      FIND_LIBRARY(QT4_QTTEST_LIBRARY_DEBUG      NAMES QtTestd4            PATHS ${QT4_LIBRARY_DIR} NO_DEFAULT_PATH)
+      FIND_LIBRARY(QT4_QTDBUS_LIBRARY_RELEASE    NAMES QtDBus4            PATHS ${QT4_LIBRARY_DIR} NO_DEFAULT_PATH)
+      FIND_LIBRARY(QT4_QTDBUS_LIBRARY_DEBUG      NAMES QtDBusd4            PATHS ${QT4_LIBRARY_DIR} NO_DEFAULT_PATH)
+      FIND_LIBRARY(QT4_QTASSISTANT_LIBRARY_RELEASE NAMES QtAssistantClient4 PATHS ${QT4_LIBRARY_DIR} NO_DEFAULT_PATH)
+      FIND_LIBRARY(QT4_QTASSISTANT_LIBRARY_DEBUG NAMES QtAssistantClientd4 PATHS ${QT4_LIBRARY_DIR} NO_DEFAULT_PATH)
+      FIND_LIBRARY(QT4_QTDESIGNER_LIBRARY_RELEASE NAMES QtDesigner4            PATHS ${QT4_LIBRARY_DIR} NO_DEFAULT_PATH)
+      FIND_LIBRARY(QT4_QTDESIGNER_LIBRARY_DEBUG  NAMES QtDesignerd4            PATHS ${QT4_LIBRARY_DIR} NO_DEFAULT_PATH)
+      FIND_LIBRARY(QT4_QTDESIGNERCOMPONENTS_LIBRARY_RELEASE NAMES QtDesignerComponents4 PATHS ${QT4_LIBRARY_DIR} NO_DEFAULT_PATH)
+      FIND_LIBRARY(QT4_QTDESIGNERCOMPONENTS_LIBRARY_DEBUG NAMES QtDesignerComponentsd4 PATHS ${QT4_LIBRARY_DIR} NO_DEFAULT_PATH)
+      FIND_LIBRARY(QT4_QTMAIN_LIBRARY_RELEASE    NAMES qtmain             PATHS ${QT4_LIBRARY_DIR} NO_DEFAULT_PATH)
+      FIND_LIBRARY(QT4_QTMAIN_LIBRARY_DEBUG      NAMES qtmaind             PATHS ${QT4_LIBRARY_DIR} NO_DEFAULT_PATH)
+    ENDIF(MSVC)
+  ENDIF (QT_USE_FRAMEWORKS)
+
+  IF( NOT QT4_QTCORE_LIBRARY )
+    IF( NOT Qt4_FIND_QUIETLY AND Qt4_FIND_REQUIRED)
+      MESSAGE( FATAL_ERROR "Could NOT find QtCore. Check ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeError.log for more details.")
+    ENDIF( NOT Qt4_FIND_QUIETLY AND Qt4_FIND_REQUIRED)
+  ENDIF( NOT QT4_QTCORE_LIBRARY )
+
+  # Set QT4_QTASSISTANT_LIBRARY
+  FIND_LIBRARY(QT4_QTASSISTANT_LIBRARY NAMES QtAssistantClient QtAssistantClient4 QtAssistant QtAssistant4 QtAssistantd4 PATHS ${QT4_LIBRARY_DIR} NO_DEFAULT_PATH)
+
+  # Set QT4_QTDESIGNER_LIBRARY
+  FIND_LIBRARY(QT4_QTDESIGNER_LIBRARY NAMES QtDesigner QtDesigner4 QtDesignerd4 PATHS ${QT4_LIBRARY_DIR}        NO_DEFAULT_PATH)
+
+  # Set QT4_QTDESIGNERCOMPONENTS_LIBRARY
+  FIND_LIBRARY(QT4_QTDESIGNERCOMPONENTS_LIBRARY NAMES QtDesignerComponents QtDesignerComponents4 QtDesignerComponentsd4 PATHS ${QT4_LIBRARY_DIR}        NO_DEFAULT_PATH)
+
+  # Set QT4_QTMAIN_LIBRARY
+  IF(WIN32)
+    FIND_LIBRARY(QT4_QTMAIN_LIBRARY NAMES qtmain qtmaind PATHS ${QT4_LIBRARY_DIR} NO_DEFAULT_PATH)
+  ENDIF(WIN32)
+
+  ############################################
+  #
+  # Check the existence of the libraries.
+  #
+  ############################################
+
+  MACRO (_QT4_ADJUST_LIB_VARS basename)
+    IF (QT4_${basename}_LIBRARY OR QT4_${basename}_LIBRARY_DEBUG)
+
+      IF(MSVC)
+        # Both set
+        IF (QT4_${basename}_LIBRARY_RELEASE AND QT4_${basename}_LIBRARY_DEBUG)
+          SET(QT4_${basename}_LIBRARY optimized ${QT4_${basename}_LIBRARY_RELEASE} debug ${QT4_${basename}_LIBRARY_DEBUG})
+        ENDIF (QT4_${basename}_LIBRARY_RELEASE AND QT4_${basename}_LIBRARY_DEBUG)
+
+        # Only debug was found
+        IF (NOT QT4_${basename}_LIBRARY_RELEASE AND QT4_${basename}_LIBRARY_DEBUG)
+          SET(QT4_${basename}_LIBRARY ${QT4_${basename}_LIBRARY_DEBUG})
+        ENDIF (NOT QT4_${basename}_LIBRARY_RELEASE AND QT4_${basename}_LIBRARY_DEBUG)
+
+        # Only release was found
+        IF (QT4_${basename}_LIBRARY_RELEASE AND NOT QT4_${basename}_LIBRARY_DEBUG)
+          SET(QT4_${basename}_LIBRARY ${QT4_${basename}_LIBRARY_RELEASE})
+        ENDIF (QT4_${basename}_LIBRARY_RELEASE AND NOT QT4_${basename}_LIBRARY_DEBUG)
+
+        # Hmm, is this used anywhere ? Yes, in UseQt4.cmake. We are currently incompatible :-(
+        SET(QT4_${basename}_LIBRARIES optimized ${QT4_${basename}_LIBRARY} debug ${QT4_${basename}_LIBRARY_DEBUG})
+
+      ENDIF(MSVC)
+
+      SET(QT4_${basename}_LIBRARY ${QT4_${basename}_LIBRARY} CACHE FILEPATH "The Qt4 ${basename} library")
+
+      IF (QT4_${basename}_LIBRARY)
+        SET(QT4_${basename}_FOUND 1)
+      ENDIF (QT4_${basename}_LIBRARY)
+      
+    ENDIF (QT4_${basename}_LIBRARY OR QT4_${basename}_LIBRARY_DEBUG)
+    
+    IF (QT4_${basename}_INCLUDE_DIR)
+      #add the include directory to QT4_INCLUDES
+      SET(QT4_INCLUDES "${QT4_${basename}_INCLUDE_DIR}" ${QT4_INCLUDES})
+    ENDIF (QT4_${basename}_INCLUDE_DIR)
+
+    # Make variables changeble to the advanced user
+    MARK_AS_ADVANCED(QT4_${basename}_LIBRARY QT4_${basename}_INCLUDE_DIR)
+  ENDMACRO (_QT4_ADJUST_LIB_VARS)
+
+
+  # Set QT_xyz_LIBRARY variable and add 
+  # library include path to QT4_INCLUDES
+  _QT4_ADJUST_LIB_VARS(QTCORE)
+  _QT4_ADJUST_LIB_VARS(QTGUI)
+  _QT4_ADJUST_LIB_VARS(QT3SUPPORT)
+  _QT4_ADJUST_LIB_VARS(QTASSISTANT)
+  _QT4_ADJUST_LIB_VARS(QTDESIGNER)
+  _QT4_ADJUST_LIB_VARS(QTDESIGNERCOMPONENTS)
+  _QT4_ADJUST_LIB_VARS(QTNETWORK)
+  _QT4_ADJUST_LIB_VARS(QTNSPLUGIN)
+  _QT4_ADJUST_LIB_VARS(QTOPENGL)
+  _QT4_ADJUST_LIB_VARS(QTSQL)
+  _QT4_ADJUST_LIB_VARS(QTXML)
+  _QT4_ADJUST_LIB_VARS(QTSVG)
+  _QT4_ADJUST_LIB_VARS(QTSCRIPT)
+  _QT4_ADJUST_LIB_VARS(QTUITOOLS)
+  _QT4_ADJUST_LIB_VARS(QTTEST)
+  _QT4_ADJUST_LIB_VARS(QTDBUS)
+
+  # platform dependent libraries
+  IF(Q_WS_X11)
+    _QT4_ADJUST_LIB_VARS(QTMOTIF)
+  ENDIF(Q_WS_X11)
+  IF(WIN32)
+    _QT4_ADJUST_LIB_VARS(QTMAIN)
+  ENDIF(WIN32)
+  
+
+  #######################################
+  #
+  #       Check the executables of Qt 
+  #          ( moc, uic, rcc )
+  #
+  #######################################
+
+
+  # find moc and uic using qmake
+  QT_QUERY_QMAKE(QT4_MOC_EXECUTABLE_INTERNAL "QMAKE_MOC")
+  QT_QUERY_QMAKE(QT4_UIC_EXECUTABLE_INTERNAL "QMAKE_UIC")
+
+  FILE(TO_CMAKE_PATH 
+    "${QT4_MOC_EXECUTABLE_INTERNAL}" QT4_MOC_EXECUTABLE_INTERNAL)
+  FILE(TO_CMAKE_PATH 
+    "${QT4_UIC_EXECUTABLE_INTERNAL}" QT4_UIC_EXECUTABLE_INTERNAL)
+
+  SET(QT4_MOC_EXECUTABLE 
+    ${QT4_MOC_EXECUTABLE_INTERNAL} CACHE FILEPATH "The moc executable")
+  SET(QT4_UIC_EXECUTABLE 
+    ${QT4_UIC_EXECUTABLE_INTERNAL} CACHE FILEPATH "The uic executable")
+
+  FIND_PROGRAM(QT_UIC3_EXECUTABLE
+    NAMES uic3
+    PATHS ${QT_BINARY_DIR}
+    NO_DEFAULT_PATH
+    )
+
+  FIND_PROGRAM(QT_RCC_EXECUTABLE 
+    NAMES rcc
+    PATHS ${QT_BINARY_DIR}
+    NO_DEFAULT_PATH
+    )
+
+  FIND_PROGRAM(QT_DBUSCPP2XML_EXECUTABLE 
+    NAMES qdbuscpp2xml
+    PATHS ${QT_BINARY_DIR}
+    NO_DEFAULT_PATH
+    )
+
+  FIND_PROGRAM(QT_DBUSXML2CPP_EXECUTABLE 
+    NAMES qdbusxml2cpp
+    PATHS ${QT_BINARY_DIR}
+    NO_DEFAULT_PATH
+    )
+
+  IF (QT4_MOC_EXECUTABLE)
+     SET(QT_WRAP_CPP "YES")
+  ENDIF (QT4_MOC_EXECUTABLE)
+
+  IF (QT4_UIC_EXECUTABLE)
+     SET(QT_WRAP_UI "YES")
+  ENDIF (QT4_UIC_EXECUTABLE)
+
+
+
+  MARK_AS_ADVANCED( QT4_UIC_EXECUTABLE QT_UIC3_EXECUTABLE QT4_MOC_EXECUTABLE QT_RCC_EXECUTABLE QT_DBUSXML2CPP_EXECUTABLE QT_DBUSCPP2XML_EXECUTABLE)
+
+  ######################################
+  #
+  #       Macros for building Qt files
+  #
+  ######################################
+  MACRO (QT4_EXTRACT_OPTIONS _qt4_files _qt4_options)
+    SET(${_qt4_files})
+    SET(${_qt4_options})
+    SET(_QT4_DOING_OPTIONS FALSE)
+    FOREACH(_currentArg ${ARGN})
+       IF ("${_currentArg}" STREQUAL "OPTIONS")
+          SET(_QT4_DOING_OPTIONS TRUE)
+       ELSE ("${_currentArg}" STREQUAL "OPTIONS")
+          IF(_QT4_DOING_OPTIONS)
+             LIST(APPEND ${_qt4_options} "${_currentArg}")
+          ELSE(_QT4_DOING_OPTIONS)
+             LIST(APPEND ${_qt4_files} "${_currentArg}")
+          ENDIF(_QT4_DOING_OPTIONS)
+       ENDIF ("${_currentArg}" STREQUAL "OPTIONS")
+    ENDFOREACH(_currentArg)
+  ENDMACRO (QT4_EXTRACT_OPTIONS)
+
+  MACRO (QT4_GET_MOC_INC_DIRS _moc_INC_DIRS)
+     SET(${_moc_INC_DIRS})
+     GET_DIRECTORY_PROPERTY(_inc_DIRS INCLUDE_DIRECTORIES)
+
+     FOREACH(_current ${_inc_DIRS})
+        SET(${_moc_INC_DIRS} ${${_moc_INC_DIRS}} "-I" ${_current})
+     ENDFOREACH(_current ${_inc_DIRS})
+
+  ENDMACRO(QT4_GET_MOC_INC_DIRS)
+
+
+  MACRO (QT4_GENERATE_MOC infile outfile )
+  # get include dirs
+     QT4_GET_MOC_INC_DIRS(moc_includes)
+
+     GET_FILENAME_COMPONENT(abs_infile ${infile} ABSOLUTE)
+
+     IF (MSVC_IDE)
+        SET (_moc_parameter_file ${outfile}_parameters)
+        SET (_moc_param "${moc_includes} \n-o${outfile} \n${abs_infile}")
+        STRING(REGEX REPLACE ";-I;" "\\n-I" _moc_param "${_moc_param}")
+        FILE (WRITE ${_moc_parameter_file} "${_moc_param}")
+        ADD_CUSTOM_COMMAND(OUTPUT ${outfile}
+          COMMAND ${QT4_MOC_EXECUTABLE}
+          ARGS @"${_moc_parameter_file}"
+          DEPENDS ${abs_infile})
+     ELSE (MSVC_IDE)     
+        ADD_CUSTOM_COMMAND(OUTPUT ${outfile}
+           COMMAND ${QT4_MOC_EXECUTABLE}
+           ARGS ${moc_includes} -o ${outfile} ${abs_infile}
+           DEPENDS ${abs_infile})     
+     ENDIF (MSVC_IDE)
+
+     SET_SOURCE_FILES_PROPERTIES(${outfile} PROPERTIES SKIP_AUTOMOC TRUE)  # dont run automoc on this file
+
+     MACRO_ADD_FILE_DEPENDENCIES(${abs_infile} ${outfile})
+  ENDMACRO (QT4_GENERATE_MOC)
+
+
+  # QT4_WRAP_CPP(outfiles inputfile ... )
+  # TODO  perhaps add support for -D, -U and other minor options
+
+  MACRO (QT4_WRAP_CPP outfiles )
+    # get include dirs
+    QT4_GET_MOC_INC_DIRS(moc_includes)
+    QT4_EXTRACT_OPTIONS(moc_files moc_options ${ARGN})
+
+    FOREACH (it ${moc_files})
+      GET_FILENAME_COMPONENT(it ${it} ABSOLUTE)
+      GET_FILENAME_COMPONENT(outfile ${it} NAME_WE)
+
+      SET(outfile ${CMAKE_CURRENT_BINARY_DIR}/moc_${outfile}.cxx)
+      ADD_CUSTOM_COMMAND(OUTPUT ${outfile}
+        COMMAND ${QT4_MOC_EXECUTABLE}
+        ARGS ${moc_includes} ${moc_options} -o ${outfile} ${it}
+        DEPENDS ${it})
+      SET(${outfiles} ${${outfiles}} ${outfile})
+    ENDFOREACH(it)
+
+  ENDMACRO (QT4_WRAP_CPP)
+
+
+  # QT4_WRAP_UI(outfiles inputfile ... )
+
+  MACRO (QT4_WRAP_UI outfiles )
+    QT4_EXTRACT_OPTIONS(ui_files ui_options ${ARGN})
+
+    FOREACH (it ${ui_files})
+      GET_FILENAME_COMPONENT(outfile ${it} NAME_WE)
+      GET_FILENAME_COMPONENT(infile ${it} ABSOLUTE)
+      SET(outfile ${CMAKE_CURRENT_BINARY_DIR}/ui_${outfile}.h)
+      ADD_CUSTOM_COMMAND(OUTPUT ${outfile}
+        COMMAND ${QT4_UIC_EXECUTABLE}
+        ARGS ${ui_options} -o ${outfile} ${infile}
+        MAIN_DEPENDENCY ${infile})
+      SET(${outfiles} ${${outfiles}} ${outfile})
+    ENDFOREACH (it)
+
+  ENDMACRO (QT4_WRAP_UI)
+
+
+  # QT4_ADD_RESOURCES(outfiles inputfile ... )
+  # TODO  perhaps consider adding support for compression and root options to rcc
+
+  MACRO (QT4_ADD_RESOURCES outfiles )
+    QT4_EXTRACT_OPTIONS(rcc_files rcc_options ${ARGN})
+
+    FOREACH (it ${rcc_files})
+      GET_FILENAME_COMPONENT(outfilename ${it} NAME_WE)
+      GET_FILENAME_COMPONENT(infile ${it} ABSOLUTE)
+      GET_FILENAME_COMPONENT(rc_path ${infile} PATH)
+      SET(outfile ${CMAKE_CURRENT_BINARY_DIR}/qrc_${outfilename}.cxx)
+      #  parse file for dependencies 
+      #  all files are absolute paths or relative to the location of the qrc file
+      FILE(READ "${infile}" _RC_FILE_CONTENTS)
+      STRING(REGEX MATCHALL "<file[^<]+" _RC_FILES "${_RC_FILE_CONTENTS}")
+      SET(_RC_DEPENDS)
+      FOREACH(_RC_FILE ${_RC_FILES})
+        STRING(REGEX REPLACE "^<file[^>]*>" "" _RC_FILE "${_RC_FILE}")
+        STRING(REGEX MATCH "^/|([A-Za-z]:/)" _ABS_PATH_INDICATOR "${_RC_FILE}")
+        IF(NOT _ABS_PATH_INDICATOR)
+          SET(_RC_FILE "${rc_path}/${_RC_FILE}")
+        ENDIF(NOT _ABS_PATH_INDICATOR)
+        SET(_RC_DEPENDS ${_RC_DEPENDS} "${_RC_FILE}")
+      ENDFOREACH(_RC_FILE)
+      ADD_CUSTOM_COMMAND(OUTPUT ${outfile}
+        COMMAND ${QT_RCC_EXECUTABLE}
+        ARGS ${rcc_options} -name ${outfilename} -o ${outfile} ${infile}
+        MAIN_DEPENDENCY ${infile}
+        DEPENDS ${_RC_DEPENDS})
+      SET(${outfiles} ${${outfiles}} ${outfile})
+    ENDFOREACH (it)
+
+  ENDMACRO (QT4_ADD_RESOURCES)
+
+  MACRO(QT4_ADD_DBUS_INTERFACE _sources _interface _basename)
+    GET_FILENAME_COMPONENT(_infile ${_interface} ABSOLUTE)
+    SET(_header ${CMAKE_CURRENT_BINARY_DIR}/${_basename}.h)
+    SET(_impl   ${CMAKE_CURRENT_BINARY_DIR}/${_basename}.cpp)
+    SET(_moc    ${CMAKE_CURRENT_BINARY_DIR}/${_basename}.moc)
+
+    GET_SOURCE_FILE_PROPERTY(_nonamespace ${_interface} NO_NAMESPACE)
+    IF ( _nonamespace )
+        SET(_params -N -m)
+    ELSE ( _nonamespace )
+        SET(_params -m)
+    ENDIF ( _nonamespace )
+
+    GET_SOURCE_FILE_PROPERTY(_include ${_interface} INCLUDE)
+    IF ( _include )
+        SET(_params ${_params} -i ${_include})
+    ENDIF ( _include )
+
+    ADD_CUSTOM_COMMAND(OUTPUT ${_impl} ${_header}
+        COMMAND ${QT_DBUSXML2CPP_EXECUTABLE} ${_params} -p ${_basename} ${_infile}
+        DEPENDS ${_infile})
+  
+    SET_SOURCE_FILES_PROPERTIES(${_impl} PROPERTIES SKIP_AUTOMOC TRUE)
+    
+    QT4_GENERATE_MOC(${_header} ${_moc})
+  
+    SET(${_sources} ${${_sources}} ${_impl} ${_header} ${_moc})
+    MACRO_ADD_FILE_DEPENDENCIES(${_impl} ${_moc})
+  
+  ENDMACRO(QT4_ADD_DBUS_INTERFACE)
+  
+  
+  MACRO(QT4_ADD_DBUS_INTERFACES _sources)
+     FOREACH (_current_FILE ${ARGN})
+        GET_FILENAME_COMPONENT(_infile ${_current_FILE} ABSOLUTE)
+        # get the part before the ".xml" suffix
+        STRING(REGEX REPLACE "(.*[/\\.])?([^\\.]+)\\.xml" "\\2" _basename ${_current_FILE})
+        STRING(TOLOWER ${_basename} _basename)
+        QT4_ADD_DBUS_INTERFACE(${_sources} ${_infile} ${_basename}interface)
+     ENDFOREACH (_current_FILE)
+  ENDMACRO(QT4_ADD_DBUS_INTERFACES)
+  
+  
+  MACRO(QT4_GENERATE_DBUS_INTERFACE _header) # _customName OPTIONS -some -options )
+    QT4_EXTRACT_OPTIONS(_customName _qt4_dbus_options ${ARGN})
+
+    GET_FILENAME_COMPONENT(_in_file ${_header} ABSOLUTE)
+    GET_FILENAME_COMPONENT(_basename ${_header} NAME_WE)
+
+    IF (_customName)
+      SET(_target ${CMAKE_CURRENT_BINARY_DIR}/${_customName})
+    ELSE (_customName)
+      SET(_target ${CMAKE_CURRENT_BINARY_DIR}/${_basename}.xml)
+    ENDIF (_customName)
+  
+    ADD_CUSTOM_COMMAND(OUTPUT ${_target}
+        COMMAND ${QT_DBUSCPP2XML_EXECUTABLE} ${_qt4_dbus_options} ${_in_file} > ${_target}
+        DEPENDS ${_in_file}
+    )
+  ENDMACRO(QT4_GENERATE_DBUS_INTERFACE)
+  
+  
+  MACRO(QT4_ADD_DBUS_ADAPTOR _sources _xml_file _include _parentClass) # _optionalBasename _optionalClassName)
+    GET_FILENAME_COMPONENT(_infile ${_xml_file} ABSOLUTE)
+    
+    SET(_optionalBasename "${ARGV4}")
+    IF (_optionalBasename)
+       SET(_basename ${_optionalBasename} )
+    ELSE (_optionalBasename)
+       STRING(REGEX REPLACE "(.*[/\\.])?([^\\.]+)\\.xml" "\\2adaptor" _basename ${_infile})
+       STRING(TOLOWER ${_basename} _basename)
+    ENDIF (_optionalBasename)
+
+    SET(_optionalClassName "${ARGV5}")
+    SET(_header ${CMAKE_CURRENT_BINARY_DIR}/${_basename}.h)
+    SET(_impl   ${CMAKE_CURRENT_BINARY_DIR}/${_basename}.cpp)
+    SET(_moc    ${CMAKE_CURRENT_BINARY_DIR}/${_basename}.moc)
+
+    IF(_optionalClassName)
+       ADD_CUSTOM_COMMAND(OUTPUT ${_impl} ${_header}
+          COMMAND ${QT_DBUSXML2CPP_EXECUTABLE} -m -a ${_basename} -c ${_optionalClassName} -i ${_include} -l ${_parentClass} ${_infile}
+          DEPENDS ${_infile}
+        )
+    ELSE(_optionalClassName)
+       ADD_CUSTOM_COMMAND(OUTPUT ${_impl} ${_header}
+          COMMAND ${QT_DBUSXML2CPP_EXECUTABLE} -m -a ${_basename} -i ${_include} -l ${_parentClass} ${_infile}
+          DEPENDS ${_infile}
+        )
+    ENDIF(_optionalClassName)
+
+    QT4_GENERATE_MOC(${_header} ${_moc})
+    SET_SOURCE_FILES_PROPERTIES(${_impl} PROPERTIES SKIP_AUTOMOC TRUE)
+    MACRO_ADD_FILE_DEPENDENCIES(${_impl} ${_moc})
+
+    SET(${_sources} ${${_sources}} ${_impl} ${_header} ${_moc})
+  ENDMACRO(QT4_ADD_DBUS_ADAPTOR)
+
+   MACRO(QT4_AUTOMOC)
+      QT4_GET_MOC_INC_DIRS(_moc_INCS)
+
+      SET(_matching_FILES )
+      FOREACH (_current_FILE ${ARGN})
+
+         GET_FILENAME_COMPONENT(_abs_FILE ${_current_FILE} ABSOLUTE)
+         # if "SKIP_AUTOMOC" is set to true, we will not handle this file here.
+         # here. this is required to make bouic work correctly:
+         # we need to add generated .cpp files to the sources (to compile them),
+         # but we cannot let automoc handle them, as the .cpp files don't exist yet when
+         # cmake is run for the very first time on them -> however the .cpp files might
+         # exist at a later run. at that time we need to skip them, so that we don't add two
+         # different rules for the same moc file
+         GET_SOURCE_FILE_PROPERTY(_skip ${_abs_FILE} SKIP_AUTOMOC)
+
+         IF ( NOT _skip AND EXISTS ${_abs_FILE} )
+
+            FILE(READ ${_abs_FILE} _contents)
+
+            GET_FILENAME_COMPONENT(_abs_PATH ${_abs_FILE} PATH)
+
+            STRING(REGEX MATCHALL "#include +[^ ]+\\.moc[\">]" _match "${_contents}")
+            IF(_match)
+               FOREACH (_current_MOC_INC ${_match})
+                  STRING(REGEX MATCH "[^ <\"]+\\.moc" _current_MOC "${_current_MOC_INC}")
+
+                  GET_filename_component(_basename ${_current_MOC} NAME_WE)
+   #               SET(_header ${CMAKE_CURRENT_SOURCE_DIR}/${_basename}.h)
+                  IF (EXISTS ${_abs_PATH}/${_basename}.h)
+                    SET(_header ${_abs_PATH}/${_basename}.h)
+                  ELSE (EXISTS ${_abs_PATH}/${_basename}.h)
+                    SET(_header ${_abs_FILE})
+                  ENDIF (EXISTS ${_abs_PATH}/${_basename}.h)
+                  SET(_moc    ${CMAKE_CURRENT_BINARY_DIR}/${_current_MOC})
+                  ADD_CUSTOM_COMMAND(OUTPUT ${_moc}
+                     COMMAND ${QT4_MOC_EXECUTABLE}
+                     ARGS ${_moc_INCS} ${_header} -o ${_moc}
+                     DEPENDS ${_header}
+                  )
+
+                  MACRO_ADD_FILE_DEPENDENCIES(${_abs_FILE} ${_moc})
+               ENDFOREACH (_current_MOC_INC)
+            ENDIF(_match)
+         ENDIF ( NOT _skip AND EXISTS ${_abs_FILE} )
+      ENDFOREACH (_current_FILE)
+   ENDMACRO(QT4_AUTOMOC)
+
+
+
+  ######################################
+  #
+  #       decide if Qt got found
+  #
+  ######################################
+
+  # if the includes,libraries,moc,uic and rcc are found then we have it
+  IF( QT4_LIBRARY_DIR AND QT4_INCLUDE_DIR AND QT4_MOC_EXECUTABLE AND QT4_UIC_EXECUTABLE AND QT_RCC_EXECUTABLE)
+    SET( QT4_FOUND "YES" )
+    IF( NOT Qt4_FIND_QUIETLY)
+      MESSAGE(STATUS "Found Qt-Version ${QTVERSION} (using ${QT_QMAKE_EXECUTABLE})")
+    ENDIF( NOT Qt4_FIND_QUIETLY)
+  ELSE( QT4_LIBRARY_DIR AND QT4_INCLUDE_DIR AND QT4_MOC_EXECUTABLE AND QT4_UIC_EXECUTABLE AND QT_RCC_EXECUTABLE)
+    SET( QT4_FOUND "NO")
+    SET(QT_QMAKE_EXECUTABLE "${QT_QMAKE_EXECUTABLE}-NOTFOUND" CACHE FILEPATH "Invalid qmake found" FORCE)
+    IF( Qt4_FIND_REQUIRED)
+      IF ( NOT QT4_LIBRARY_DIR )
+        MESSAGE(STATUS "Qt libraries NOT found!")
+      ENDIF(NOT QT4_LIBRARY_DIR )
+      IF ( NOT QT4_INCLUDE_DIR )
+        MESSAGE(STATUS "Qt includes NOT found!")
+      ENDIF( NOT QT4_INCLUDE_DIR )
+      IF ( NOT QT4_MOC_EXECUTABLE )
+        MESSAGE(STATUS "Qt's moc NOT found!")
+      ENDIF( NOT QT4_MOC_EXECUTABLE )
+      IF ( NOT QT4_UIC_EXECUTABLE )
+        MESSAGE(STATUS "Qt's uic NOT found!")
+      ENDIF( NOT QT4_UIC_EXECUTABLE )
+      IF ( NOT QT_RCC_EXECUTABLE )
+        MESSAGE(STATUS "Qt's rcc NOT found!")
+      ENDIF( NOT QT_RCC_EXECUTABLE )
+      MESSAGE( FATAL_ERROR "Qt libraries, includes, moc, uic or/and rcc NOT found!")
+    ENDIF( Qt4_FIND_REQUIRED)
+  ENDIF( QT4_LIBRARY_DIR AND QT4_INCLUDE_DIR AND QT4_MOC_EXECUTABLE AND QT4_UIC_EXECUTABLE AND  QT_RCC_EXECUTABLE)
+  SET(QT_FOUND ${QT4_FOUND})
+
+
+  #######################################
+  #
+  #       System dependent settings  
+  #
+  #######################################
+  # for unix add X11 stuff
+  IF(UNIX)
+    # on OS X X11 may not be required
+    IF (Q_WS_X11)
+      FIND_PACKAGE(X11 REQUIRED)
+    ENDIF (Q_WS_X11)
+    FIND_PACKAGE(Threads)
+    SET(QT4_QTCORE_LIBRARY ${QT4_QTCORE_LIBRARY} ${CMAKE_THREAD_LIBS_INIT})
+  ENDIF(UNIX)
+
+
+  #######################################
+  #
+  #       compatibility settings 
+  #
+  #######################################
+  # Backwards compatibility for CMake1.4 and 1.2
+  SET (QT_MOC_EXE ${QT4_MOC_EXECUTABLE} )
+  SET (QT_UIC_EXE ${QT4_UIC_EXECUTABLE} )
+
+  SET( QT4_QT_LIBRARY "")
+
+ELSE(QT4_QMAKE_FOUND)
+   
+   SET(QT_QMAKE_EXECUTABLE "${QT_QMAKE_EXECUTABLE}-NOTFOUND" CACHE FILEPATH "Invalid qmake found" FORCE)
+   IF(Qt4_FIND_REQUIRED)
+      IF(QT4_INSTALLED_VERSION_TOO_OLD)
+         MESSAGE(FATAL_ERROR "The installed Qt version ${QTVERSION} is too old, at least version ${QT4_MIN_VERSION} is required")
+      ELSE(QT4_INSTALLED_VERSION_TOO_OLD)
+         MESSAGE( FATAL_ERROR "Qt qmake not found!")
+      ENDIF(QT4_INSTALLED_VERSION_TOO_OLD)
+   ELSE(Qt4_FIND_REQUIRED)
+      IF(QT4_INSTALLED_VERSION_TOO_OLD AND NOT Qt4_FIND_QUIETLY)
+         MESSAGE(STATUS "The installed Qt version ${QTVERSION} is too old, at least version ${QT4_MIN_VERSION} is required")
+      ENDIF(QT4_INSTALLED_VERSION_TOO_OLD AND NOT Qt4_FIND_QUIETLY)
+   ENDIF(Qt4_FIND_REQUIRED)
+ENDIF (QT4_QMAKE_FOUND)
+ENDIF (QT4_QMAKE_FOUND)
+
diff --git a/cmake/modules/GObjectIntrospectionMacros.cmake b/cmake/modules/GObjectIntrospectionMacros.cmake
new file mode 100644 (file)
index 0000000..3f90c2a
--- /dev/null
@@ -0,0 +1,96 @@
+# Copyright (C) 2010, Pino Toscano, <pino@kde.org>
+#
+# Redistribution and use is allowed according to the terms of the BSD license.
+# For details see the accompanying COPYING-CMAKE-SCRIPTS file.
+
+macro(_gir_list_prefix _outvar _listvar _prefix)
+  set(${_outvar})
+  foreach(_item IN LISTS ${_listvar})
+    list(APPEND ${_outvar} ${_prefix}${_item})
+  endforeach()
+endmacro(_gir_list_prefix)
+
+macro(gir_add_introspections introspections_girs)
+
+  set(_gir_girs)
+  set(_gir_typelibs)
+
+  foreach(gir IN LISTS ${introspections_girs})
+
+    set(_gir_name "${gir}")
+
+    ## Transform the gir filename to something which can reference through a variable
+    ## without automake/make complaining, eg Gtk-2.0.gir -> Gtk_2_0_gir
+    string(REPLACE "-" "_" _gir_name "${_gir_name}")
+    string(REPLACE "." "_" _gir_name "${_gir_name}")
+
+    # Namespace and Version is either fetched from the gir filename
+    # or the _NAMESPACE/_VERSION variable combo
+    set(_gir_namespace "${${_gir_name}_NAMESPACE}")
+    if (_gir_namespace STREQUAL "")
+      string(REGEX REPLACE "([^-]+)-.*" "\\1" _gir_namespace "${gir}")
+    endif ()
+    set(_gir_version "${${_gir_name}_VERSION}")
+    if (_gir_version STREQUAL "")
+      string(REGEX REPLACE ".*-([^-]+).gir" "\\1" _gir_version "${gir}")
+    endif ()
+
+    # _PROGRAM is an optional variable which needs it's own --program argument
+    set(_gir_program "${${_gir_name}_PROGRAM}")
+    if (NOT _gir_program STREQUAL "")
+      set(_gir_program "--program=${_gir_program}")
+    endif ()
+
+    # Variables which provides a list of things
+    _gir_list_prefix(_gir_libraries ${_gir_name}_LIBS "--library=")
+    _gir_list_prefix(_gir_packages ${_gir_name}_PACKAGES "--pkg=")
+    _gir_list_prefix(_gir_includes ${_gir_name}_INCLUDES "--include=")
+    _gir_list_prefix(_gir_export_packages ${_gir_name}_EXPORT_PACKAGES "--pkg-export=")
+
+    # Reuse the LIBTOOL variable from by automake if it's set
+    set(_gir_libtool "--no-libtool")
+
+    add_custom_command(
+      COMMAND ${INTROSPECTION_SCANNER}
+              ${INTROSPECTION_SCANNER_ARGS}
+              --namespace=${_gir_namespace}
+              --nsversion=${_gir_version}
+              ${_gir_libtool}
+              ${_gir_program}
+              ${_gir_libraries}
+              ${_gir_packages}
+              ${_gir_includes}
+              ${_gir_export_packages}
+              ${${_gir_name}_SCANNERFLAGS}
+              ${${_gir_name}_CFLAGS}
+              ${${_gir_name}_FILES}
+              --output ${CMAKE_CURRENT_BINARY_DIR}/${gir}
+      DEPENDS ${${_gir_name}_FILES}
+              ${${_gir_name}_LIBS}
+      OUTPUT ${gir}
+      WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
+      VERBATIM
+    )
+    list(APPEND _gir_girs ${CMAKE_CURRENT_BINARY_DIR}/${gir})
+    install(FILES ${CMAKE_CURRENT_BINARY_DIR}/${gir} DESTINATION share/gir-1.0)
+
+    string(REPLACE ".gir" ".typelib" _typelib "${gir}")
+    add_custom_command(
+      COMMAND ${INTROSPECTION_COMPILER}
+              ${INTROSPECTION_COMPILER_ARGS}
+              --includedir=.
+              ${CMAKE_CURRENT_BINARY_DIR}/${gir}
+              -o ${CMAKE_CURRENT_BINARY_DIR}/${_typelib}
+      DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/${gir}
+      OUTPUT ${_typelib}
+      WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
+    )
+    list(APPEND _gir_typelibs ${CMAKE_CURRENT_BINARY_DIR}/${_typelib})
+    install(FILES ${CMAKE_CURRENT_BINARY_DIR}/${_typelib} DESTINATION lib${LIB_SUFFIX}/girepository-1.0)
+
+  endforeach()
+
+  add_custom_target(gir-girs ALL DEPENDS ${_gir_girs})
+  add_custom_target(gir-typelibs ALL DEPENDS ${_gir_typelibs})
+
+endmacro(gir_add_introspections)
diff --git a/cmake/modules/MacroBoolTo01.cmake b/cmake/modules/MacroBoolTo01.cmake
new file mode 100644 (file)
index 0000000..63b9852
--- /dev/null
@@ -0,0 +1,20 @@
+# MACRO_BOOL_TO_01( VAR RESULT0 ... RESULTN )
+# This macro evaluates its first argument
+# and sets all the given vaiables either to 0 or 1
+# depending on the value of the first one
+
+# Copyright (c) 2006, Alexander Neundorf, <neundorf@kde.org>
+#
+# Redistribution and use is allowed according to the terms of the BSD license.
+# For details see the accompanying COPYING-CMAKE-SCRIPTS file.
+
+
+MACRO(MACRO_BOOL_TO_01 FOUND_VAR )
+   FOREACH (_current_VAR ${ARGN})
+      IF(${FOUND_VAR})
+         SET(${_current_VAR} 1)
+      ELSE(${FOUND_VAR})
+         SET(${_current_VAR} 0)
+      ENDIF(${FOUND_VAR})
+   ENDFOREACH(_current_VAR)
+ENDMACRO(MACRO_BOOL_TO_01)
diff --git a/cmake/modules/MacroEnsureVersion.cmake b/cmake/modules/MacroEnsureVersion.cmake
new file mode 100644 (file)
index 0000000..6797e5b
--- /dev/null
@@ -0,0 +1,117 @@
+# This file defines the following macros for developers to use in ensuring
+# that installed software is of the right version:
+#
+# MACRO_ENSURE_VERSION        - test that a version number is greater than
+#                               or equal to some minimum
+# MACRO_ENSURE_VERSION_RANGE - test that a version number is greater than
+#                               or equal to some minimum and less than some
+#                               maximum
+# MACRO_ENSURE_VERSION2       - deprecated, do not use in new code
+#
+
+# MACRO_ENSURE_VERSION
+# This macro compares version numbers of the form "x.y.z" or "x.y"
+# MACRO_ENSURE_VERSION( FOO_MIN_VERSION FOO_VERSION_FOUND FOO_VERSION_OK)
+# will set FOO_VERSION_OK to true if FOO_VERSION_FOUND >= FOO_MIN_VERSION
+# Leading and trailing text is ok, e.g.
+# MACRO_ENSURE_VERSION( "2.5.31" "flex 2.5.4a" VERSION_OK)
+# which means 2.5.31 is required and "flex 2.5.4a" is what was found on the system
+
+# Copyright (c) 2006, David Faure, <faure@kde.org>
+# Copyright (c) 2007, Will Stephenson <wstephenson@kde.org>
+#
+# Redistribution and use is allowed according to the terms of the BSD license.
+# For details see the accompanying COPYING-CMAKE-SCRIPTS file.
+
+# MACRO_ENSURE_VERSION_RANGE
+# This macro ensures that a version number of the form
+# "x.y.z" or "x.y" falls within a range defined by
+# min_version <= found_version < max_version.
+# If this expression holds, FOO_VERSION_OK will be set TRUE
+#
+# Example: MACRO_ENSURE_VERSION_RANGE3( "0.1.0" ${FOOCODE_VERSION} "0.7.0" FOO_VERSION_OK )
+#
+# This macro will break silently if any of x,y,z are greater than 100.
+#
+# Copyright (c) 2007, Will Stephenson <wstephenson@kde.org>
+#
+# Redistribution and use is allowed according to the terms of the BSD license.
+# For details see the accompanying COPYING-CMAKE-SCRIPTS file.
+
+# NORMALIZE_VERSION
+# Helper macro to convert version numbers of the form "x.y.z"
+# to an integer equal to 10^4 * x + 10^2 * y + z
+#
+# This macro will break silently if any of x,y,z are greater than 100.
+#
+# Copyright (c) 2006, David Faure, <faure@kde.org>
+# Copyright (c) 2007, Will Stephenson <wstephenson@kde.org>
+#
+# Redistribution and use is allowed according to the terms of the BSD license.
+# For details see the accompanying COPYING-CMAKE-SCRIPTS file.
+
+# CHECK_RANGE_INCLUSIVE_LOWER
+# Helper macro to check whether x <= y < z
+#
+# Copyright (c) 2007, Will Stephenson <wstephenson@kde.org>
+#
+# Redistribution and use is allowed according to the terms of the BSD license.
+# For details see the accompanying COPYING-CMAKE-SCRIPTS file.
+
+
+MACRO(NORMALIZE_VERSION _requested_version _normalized_version)
+    STRING(REGEX MATCH "[^0-9]*[0-9]+\\.[0-9]+\\.[0-9]+.*" _threePartMatch "${_requested_version}")
+    if (_threePartMatch)
+    # parse the parts of the version string
+        STRING(REGEX REPLACE "[^0-9]*([0-9]+)\\.[0-9]+\\.[0-9]+.*" "\\1" _major_vers "${_requested_version}")
+        STRING(REGEX REPLACE "[^0-9]*[0-9]+\\.([0-9]+)\\.[0-9]+.*" "\\1" _minor_vers "${_requested_version}")
+        STRING(REGEX REPLACE "[^0-9]*[0-9]+\\.[0-9]+\\.([0-9]+).*" "\\1" _patch_vers "${_requested_version}")
+    else (_threePartMatch)
+        STRING(REGEX REPLACE "([0-9]+)\\.[0-9]+" "\\1" _major_vers "${_requested_version}")
+        STRING(REGEX REPLACE "[0-9]+\\.([0-9]+)" "\\1" _minor_vers "${_requested_version}")
+        set(_patch_vers "0")
+    endif (_threePartMatch)
+
+    # compute an overall version number which can be compared at once
+    MATH(EXPR ${_normalized_version} "${_major_vers}*10000 + ${_minor_vers}*100 + ${_patch_vers}")
+ENDMACRO(NORMALIZE_VERSION)
+
+MACRO(MACRO_CHECK_RANGE_INCLUSIVE_LOWER _lower_limit _value _upper_limit _ok)
+   if (${_value} LESS ${_lower_limit})
+      set( ${_ok} FALSE )
+  elseif (${_value} EQUAL ${_lower_limit})
+      set( ${_ok} TRUE )
+  elseif (${_value} EQUAL ${_upper_limit})
+      set( ${_ok} FALSE )
+  elseif (${_value} GREATER ${_upper_limit})
+      set( ${_ok} FALSE )
+  else (${_value} LESS ${_lower_limit})
+      set( ${_ok} TRUE )
+  endif (${_value} LESS ${_lower_limit})
+ENDMACRO(MACRO_CHECK_RANGE_INCLUSIVE_LOWER)
+
+MACRO(MACRO_ENSURE_VERSION requested_version found_version var_too_old)
+    NORMALIZE_VERSION( ${requested_version} req_vers_num )
+    NORMALIZE_VERSION( ${found_version} found_vers_num )
+
+    if (found_vers_num LESS req_vers_num)
+        set( ${var_too_old} FALSE )
+    else (found_vers_num LESS req_vers_num)
+        set( ${var_too_old} TRUE )
+    endif (found_vers_num LESS req_vers_num)
+
+ENDMACRO(MACRO_ENSURE_VERSION)
+
+MACRO(MACRO_ENSURE_VERSION2 requested_version2 found_version2 var_too_old2)
+    MACRO_ENSURE_VERSION( ${requested_version2} ${found_version2} ${var_too_old2})
+ENDMACRO(MACRO_ENSURE_VERSION2)
+
+MACRO(MACRO_ENSURE_VERSION_RANGE min_version found_version max_version var_ok)
+    NORMALIZE_VERSION( ${min_version} req_vers_num )
+    NORMALIZE_VERSION( ${found_version} found_vers_num )
+    NORMALIZE_VERSION( ${max_version} max_vers_num )
+
+    MACRO_CHECK_RANGE_INCLUSIVE_LOWER( ${req_vers_num} ${found_vers_num} ${max_vers_num} ${var_ok})
+ENDMACRO(MACRO_ENSURE_VERSION_RANGE)
+
+
diff --git a/cmake/modules/MacroOptionalFindPackage.cmake b/cmake/modules/MacroOptionalFindPackage.cmake
new file mode 100644 (file)
index 0000000..d4ed48e
--- /dev/null
@@ -0,0 +1,48 @@
+# - MACRO_OPTIONAL_FIND_PACKAGE() combines FIND_PACKAGE() with an OPTION()
+# MACRO_OPTIONAL_FIND_PACKAGE( <name> [QUIT] )
+# This macro is a combination of OPTION() and FIND_PACKAGE(), it
+# works like FIND_PACKAGE(), but additionally it automatically creates
+# an option name WITH_<name>, which can be disabled via the cmake GUI.
+# or via -DWITH_<name>=OFF
+# The standard <name>_FOUND variables can be used in the same way
+# as when using the normal FIND_PACKAGE()
+
+# Copyright (c) 2006-2010 Alexander Neundorf, <neundorf@kde.org>
+#
+# Redistribution and use is allowed according to the terms of the BSD license.
+# For details see the accompanying COPYING-CMAKE-SCRIPTS file.
+
+# This is just a helper macro to set a bunch of variables empty.
+# We don't know whether the package uses UPPERCASENAME or CamelCaseName, so we try both:
+macro(_MOFP_SET_EMPTY_IF_DEFINED _name _var)
+   if(DEFINED ${_name}_${_var})
+      set(${_name}_${_var} "")
+   endif(DEFINED ${_name}_${_var})
+
+   string(TOUPPER ${_name} _nameUpper)
+   if(DEFINED ${_nameUpper}_${_var})
+      set(${_nameUpper}_${_var}  "")
+   endif(DEFINED ${_nameUpper}_${_var})
+endmacro(_MOFP_SET_EMPTY_IF_DEFINED _package _var)
+
+
+macro (MACRO_OPTIONAL_FIND_PACKAGE _name )
+   option(WITH_${_name} "Search for ${_name} package" ON)
+   if (WITH_${_name})
+      find_package(${_name} ${ARGN})
+   else (WITH_${_name})
+      string(TOUPPER ${_name} _nameUpper)
+      set(${_name}_FOUND FALSE)
+      set(${_nameUpper}_FOUND FALSE)
+
+      _mofp_set_empty_if_defined(${_name} INCLUDE_DIRS)
+      _mofp_set_empty_if_defined(${_name} INCLUDE_DIR)
+      _mofp_set_empty_if_defined(${_name} INCLUDES)
+      _mofp_set_empty_if_defined(${_name} LIBRARY)
+      _mofp_set_empty_if_defined(${_name} LIBRARIES)
+      _mofp_set_empty_if_defined(${_name} LIBS)
+      _mofp_set_empty_if_defined(${_name} FLAGS)
+      _mofp_set_empty_if_defined(${_name} DEFINITIONS)
+   endif (WITH_${_name})
+endmacro (MACRO_OPTIONAL_FIND_PACKAGE)
+
diff --git a/cmake/modules/MacroPushRequiredVars.cmake b/cmake/modules/MacroPushRequiredVars.cmake
new file mode 100644 (file)
index 0000000..650b566
--- /dev/null
@@ -0,0 +1,47 @@
+# this module defines two macros:
+# MACRO_PUSH_REQUIRED_VARS()
+# and
+# MACRO_POP_REQUIRED_VARS()
+# use these if you call cmake macros which use
+# any of the CMAKE_REQUIRED_XXX variables
+#
+# Usage:
+# MACRO_PUSH_REQUIRED_VARS()
+# SET(CMAKE_REQUIRED_DEFINITIONS ${CMAKE_REQUIRED_DEFINITIONS} -DSOME_MORE_DEF)
+# CHECK_FUNCTION_EXISTS(...)
+# MACRO_POP_REQUIRED_VARS()
+
+# Copyright (c) 2006, Alexander Neundorf, <neundorf@kde.org>
+#
+# Redistribution and use is allowed according to the terms of the BSD license.
+# For details see the accompanying COPYING-CMAKE-SCRIPTS file.
+
+MACRO(MACRO_PUSH_REQUIRED_VARS)
+
+   IF(NOT DEFINED _PUSH_REQUIRED_VARS_COUNTER)
+      SET(_PUSH_REQUIRED_VARS_COUNTER 0)
+   ENDIF(NOT DEFINED _PUSH_REQUIRED_VARS_COUNTER)
+
+   MATH(EXPR _PUSH_REQUIRED_VARS_COUNTER "${_PUSH_REQUIRED_VARS_COUNTER}+1")
+
+   SET(_CMAKE_REQUIRED_INCLUDES_SAVE_${_PUSH_REQUIRED_VARS_COUNTER}    ${CMAKE_REQUIRED_INCLUDES})
+   SET(_CMAKE_REQUIRED_DEFINITIONS_SAVE_${_PUSH_REQUIRED_VARS_COUNTER} ${CMAKE_REQUIRED_DEFINITIONS})
+   SET(_CMAKE_REQUIRED_LIBRARIES_SAVE_${_PUSH_REQUIRED_VARS_COUNTER}   ${CMAKE_REQUIRED_LIBRARIES})
+   SET(_CMAKE_REQUIRED_FLAGS_SAVE_${_PUSH_REQUIRED_VARS_COUNTER}       ${CMAKE_REQUIRED_FLAGS})
+ENDMACRO(MACRO_PUSH_REQUIRED_VARS)
+
+MACRO(MACRO_POP_REQUIRED_VARS)
+
+# don't pop more than we pushed
+   IF("${_PUSH_REQUIRED_VARS_COUNTER}" GREATER "0")
+
+      SET(CMAKE_REQUIRED_INCLUDES    ${_CMAKE_REQUIRED_INCLUDES_SAVE_${_PUSH_REQUIRED_VARS_COUNTER}})
+      SET(CMAKE_REQUIRED_DEFINITIONS ${_CMAKE_REQUIRED_DEFINITIONS_SAVE_${_PUSH_REQUIRED_VARS_COUNTER}})
+      SET(CMAKE_REQUIRED_LIBRARIES   ${_CMAKE_REQUIRED_LIBRARIES_SAVE_${_PUSH_REQUIRED_VARS_COUNTER}})
+      SET(CMAKE_REQUIRED_FLAGS       ${_CMAKE_REQUIRED_FLAGS_SAVE_${_PUSH_REQUIRED_VARS_COUNTER}})
+
+      MATH(EXPR _PUSH_REQUIRED_VARS_COUNTER "${_PUSH_REQUIRED_VARS_COUNTER}-1")
+   ENDIF("${_PUSH_REQUIRED_VARS_COUNTER}" GREATER "0")
+
+ENDMACRO(MACRO_POP_REQUIRED_VARS)
+
diff --git a/cmake/modules/PopplerDefaults.cmake b/cmake/modules/PopplerDefaults.cmake
new file mode 100644 (file)
index 0000000..b0374cf
--- /dev/null
@@ -0,0 +1,17 @@
+# enable the testing facilities
+enable_testing()
+
+# put the include directories of the sources before other include paths
+# (eg, system includes)
+set(CMAKE_INCLUDE_DIRECTORIES_PROJECT_BEFORE ON)
+
+# colored output
+set(CMAKE_COLOR_MAKEFILE ON)
+
+# CMake policy #0002: we can have multiple targets with the same name (for the unit tests)
+cmake_policy(SET CMP0002 OLD)
+# CMake policy #0011 (>= 2.6.3): make policy changes (as done here) taking effect for all the tree
+if(POLICY CMP0011)
+    cmake_policy(SET CMP0011 OLD)
+endif(POLICY CMP0011)
+
diff --git a/cmake/modules/PopplerMacros.cmake b/cmake/modules/PopplerMacros.cmake
new file mode 100644 (file)
index 0000000..04dfc46
--- /dev/null
@@ -0,0 +1,142 @@
+# Copyright 2008 Pino Toscano, <pino@kde.org>
+#
+# Redistribution and use is allowed according to the terms of the BSD license.
+# For details see the accompanying COPYING-CMAKE-SCRIPTS file.
+
+macro(POPPLER_ADD_TEST exe build_flag)
+  set(build_test ${${build_flag}})
+  if(NOT build_test)
+    set(_add_executable_param ${_add_executable_param} EXCLUDE_FROM_ALL)
+  endif(NOT build_test)
+
+  add_executable(${exe} ${_add_executable_param} ${ARGN})
+
+  # if the tests are EXCLUDE_FROM_ALL, add a target "buildtests" to build all tests
+  if(NOT build_test AND NOT MSVC_IDE)
+    get_directory_property(_buildtestsAdded BUILDTESTS_ADDED)
+    if(NOT _buildtestsAdded)
+      add_custom_target(buildtests)
+      set_directory_properties(PROPERTIES BUILDTESTS_ADDED TRUE)
+    endif(NOT _buildtestsAdded)
+    add_dependencies(buildtests ${exe})
+  endif(NOT build_test AND NOT MSVC_IDE)
+endmacro(POPPLER_ADD_TEST)
+
+macro(POPPLER_ADD_UNITTEST exe build_flag)
+  set(build_test ${${build_flag}})
+  if(NOT build_test)
+    set(_add_executable_param ${_add_executable_param} EXCLUDE_FROM_ALL)
+  endif(NOT build_test)
+
+  add_executable(${exe} ${_add_executable_param} ${ARGN})
+  add_test(${exe} ${EXECUTABLE_OUTPUT_PATH}/${exe})
+
+  # if the tests are EXCLUDE_FROM_ALL, add a target "buildtests" to build all tests
+  if(NOT build_test)
+    get_directory_property(_buildtestsAdded BUILDTESTS_ADDED)
+    if(NOT _buildtestsAdded)
+      add_custom_target(buildtests)
+      set_directory_properties(PROPERTIES BUILDTESTS_ADDED TRUE)
+    endif(NOT _buildtestsAdded)
+    add_dependencies(buildtests ${exe})
+  endif(NOT build_test)
+endmacro(POPPLER_ADD_UNITTEST)
+
+macro(POPPLER_CREATE_INSTALL_PKGCONFIG generated_file install_location)
+  if(NOT WIN32)
+    configure_file(${generated_file}.cmake ${CMAKE_CURRENT_BINARY_DIR}/${generated_file} @ONLY)
+    install(FILES ${CMAKE_CURRENT_BINARY_DIR}/${generated_file} DESTINATION ${install_location})
+  endif(NOT WIN32)
+endmacro(POPPLER_CREATE_INSTALL_PKGCONFIG)
+
+macro(SHOW_END_MESSAGE what value)
+  string(LENGTH ${what} length_what)
+  math(EXPR left_char "20 - ${length_what}")
+  set(blanks)
+  foreach(_i RANGE 1 ${left_char})
+    set(blanks "${blanks} ")
+  endforeach(_i)
+
+  message("  ${what}:${blanks} ${value}")
+endmacro(SHOW_END_MESSAGE)
+
+macro(SHOW_END_MESSAGE_YESNO what enabled)
+  if(${enabled})
+    set(enabled_string "yes")
+  else(${enabled})
+    set(enabled_string "no")
+  endif(${enabled})
+
+  show_end_message("${what}" "${enabled_string}")
+endmacro(SHOW_END_MESSAGE_YESNO)
+
+macro(POPPLER_CHECK_LINK_FLAG flag var)
+   set(_save_CMAKE_REQUIRED_LIBRARIES "${CMAKE_REQUIRED_LIBRARIES}")
+   include(CheckCXXSourceCompiles)
+   set(CMAKE_REQUIRED_LIBRARIES "${flag}")
+   check_cxx_source_compiles("int main() { return 0; }" ${var})
+   set(CMAKE_REQUIRED_LIBRARIES "${_save_CMAKE_REQUIRED_LIBRARIES}")
+endmacro(POPPLER_CHECK_LINK_FLAG)
+
+
+set(CMAKE_SYSTEM_INCLUDE_PATH ${CMAKE_SYSTEM_INCLUDE_PATH}
+                              "${CMAKE_INSTALL_PREFIX}/include" )
+
+set(CMAKE_SYSTEM_PROGRAM_PATH ${CMAKE_SYSTEM_PROGRAM_PATH}
+                              "${CMAKE_INSTALL_PREFIX}/bin" )
+
+set(CMAKE_SYSTEM_LIBRARY_PATH ${CMAKE_SYSTEM_LIBRARY_PATH}
+                              "${CMAKE_INSTALL_PREFIX}/lib" )
+
+# under Windows dlls may be also installed in bin/
+if(WIN32)
+  set(CMAKE_SYSTEM_LIBRARY_PATH ${CMAKE_SYSTEM_LIBRARY_PATH}
+                                "${CMAKE_INSTALL_PREFIX}/bin" )
+endif(WIN32)
+
+if(NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES)
+  set(CMAKE_BUILD_TYPE RelWithDebInfo)
+endif(NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES)
+
+if(CMAKE_COMPILER_IS_GNUCXX)
+  # set the default compile warnings
+  set(DEFAULT_COMPILE_WARNINGS_NO)
+  set(DEFAULT_COMPILE_WARNINGS_YES "-Wall -Wcast-align -fno-exceptions -fno-check-new -fno-common")
+  set(DEFAULT_COMPILE_WARNINGS_KDE "-Wno-long-long -Wundef -D_XOPEN_SOURCE=600 -D_BSD_SOURCE -Wcast-align -Wconversion -Wall -W -Wpointer-arith -Wwrite-strings -Wformat-security -Wmissing-format-attribute -fno-exceptions -fno-check-new -fno-common")
+
+  set(CMAKE_CXX_FLAGS                "-Wnon-virtual-dtor -Woverloaded-virtual ${CMAKE_CXX_FLAGS}")
+  set(CMAKE_CXX_FLAGS_RELWITHDEBINFO "-O2 -g")
+  set(CMAKE_CXX_FLAGS_RELEASE        "-O2 -DNDEBUG")
+  set(CMAKE_CXX_FLAGS_DEBUG          "-g -O2 -fno-reorder-blocks -fno-schedule-insns -fno-inline")
+  set(CMAKE_CXX_FLAGS_DEBUGFULL      "-g3 -fno-inline")
+  set(CMAKE_CXX_FLAGS_PROFILE        "-g3 -fno-inline -ftest-coverage -fprofile-arcs")
+  set(CMAKE_C_FLAGS_RELWITHDEBINFO   "-O2 -g")
+  set(CMAKE_C_FLAGS_RELEASE          "-O2 -DNDEBUG")
+  set(CMAKE_C_FLAGS_DEBUG            "-g -O2 -fno-reorder-blocks -fno-schedule-insns -fno-inline")
+  set(CMAKE_C_FLAGS_DEBUGFULL        "-g3 -fno-inline")
+  set(CMAKE_C_FLAGS_PROFILE          "-g3 -fno-inline -ftest-coverage -fprofile-arcs")
+
+  if(CMAKE_SYSTEM_NAME MATCHES Linux)
+    set(DEFAULT_COMPILE_WARNINGS_YES "${DEFAULT_COMPILE_WARNINGS_YES} -ansi")
+    set(DEFAULT_COMPILE_WARNINGS_KDE "${DEFAULT_COMPILE_WARNINGS_KDE} -ansi")
+  endif(CMAKE_SYSTEM_NAME MATCHES Linux)
+
+  poppler_check_link_flag("-Wl,--as-needed" GCC_HAS_AS_NEEDED)
+  if(GCC_HAS_AS_NEEDED)
+    set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -Wl,--as-needed")
+    set(CMAKE_MODULE_LINKER_FLAGS "${CMAKE_MODULE_LINKER_FLAGS} -Wl,--as-needed")
+    set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,--as-needed")
+  endif(GCC_HAS_AS_NEEDED)
+endif (CMAKE_COMPILER_IS_GNUCXX)
+
+if(CMAKE_C_COMPILER MATCHES "icc")
+  set(CMAKE_CXX_FLAGS_RELWITHDEBINFO "-O2 -g")
+  set(CMAKE_CXX_FLAGS_RELEASE        "-O2 -DNDEBUG")
+  set(CMAKE_CXX_FLAGS_DEBUG          "-O2 -g -0b0 -noalign")
+  set(CMAKE_CXX_FLAGS_DEBUGFULL      "-g -Ob0 -noalign")
+  set(CMAKE_C_FLAGS_RELWITHDEBINFO   "-O2 -g")
+  set(CMAKE_C_FLAGS_RELEASE          "-O2 -DNDEBUG")
+  set(CMAKE_C_FLAGS_DEBUG            "-O2 -g -Ob0 -noalign")
+  set(CMAKE_C_FLAGS_DEBUGFULL        "-g -Ob0 -noalign")
+endif(CMAKE_C_COMPILER MATCHES "icc")
+
diff --git a/config.guess b/config.guess
new file mode 100755 (executable)
index 0000000..d622a44
--- /dev/null
@@ -0,0 +1,1530 @@
+#! /bin/sh
+# Attempt to guess a canonical system name.
+#   Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
+#   2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010,
+#   2011, 2012 Free Software Foundation, Inc.
+
+timestamp='2012-02-10'
+
+# This file is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, see <http://www.gnu.org/licenses/>.
+#
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program that contains a
+# configuration script generated by Autoconf, you may include it under
+# the same distribution terms that you use for the rest of that program.
+
+
+# Originally written by Per Bothner.  Please send patches (context
+# diff format) to <config-patches@gnu.org> and include a ChangeLog
+# entry.
+#
+# This script attempts to guess a canonical system name similar to
+# config.sub.  If it succeeds, it prints the system name on stdout, and
+# exits with 0.  Otherwise, it exits with 1.
+#
+# You can get the latest version of this script from:
+# http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess;hb=HEAD
+
+me=`echo "$0" | sed -e 's,.*/,,'`
+
+usage="\
+Usage: $0 [OPTION]
+
+Output the configuration name of the system \`$me' is run on.
+
+Operation modes:
+  -h, --help         print this help, then exit
+  -t, --time-stamp   print date of last modification, then exit
+  -v, --version      print version number, then exit
+
+Report bugs and patches to <config-patches@gnu.org>."
+
+version="\
+GNU config.guess ($timestamp)
+
+Originally written by Per Bothner.
+Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000,
+2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012
+Free Software Foundation, Inc.
+
+This is free software; see the source for copying conditions.  There is NO
+warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
+
+help="
+Try \`$me --help' for more information."
+
+# Parse command line
+while test $# -gt 0 ; do
+  case $1 in
+    --time-stamp | --time* | -t )
+       echo "$timestamp" ; exit ;;
+    --version | -v )
+       echo "$version" ; exit ;;
+    --help | --h* | -h )
+       echo "$usage"; exit ;;
+    -- )     # Stop option processing
+       shift; break ;;
+    - )        # Use stdin as input.
+       break ;;
+    -* )
+       echo "$me: invalid option $1$help" >&2
+       exit 1 ;;
+    * )
+       break ;;
+  esac
+done
+
+if test $# != 0; then
+  echo "$me: too many arguments$help" >&2
+  exit 1
+fi
+
+trap 'exit 1' 1 2 15
+
+# CC_FOR_BUILD -- compiler used by this script. Note that the use of a
+# compiler to aid in system detection is discouraged as it requires
+# temporary files to be created and, as you can see below, it is a
+# headache to deal with in a portable fashion.
+
+# Historically, `CC_FOR_BUILD' used to be named `HOST_CC'. We still
+# use `HOST_CC' if defined, but it is deprecated.
+
+# Portable tmp directory creation inspired by the Autoconf team.
+
+set_cc_for_build='
+trap "exitcode=\$?; (rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null) && exit \$exitcode" 0 ;
+trap "rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null; exit 1" 1 2 13 15 ;
+: ${TMPDIR=/tmp} ;
+ { tmp=`(umask 077 && mktemp -d "$TMPDIR/cgXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" ; } ||
+ { test -n "$RANDOM" && tmp=$TMPDIR/cg$$-$RANDOM && (umask 077 && mkdir $tmp) ; } ||
+ { tmp=$TMPDIR/cg-$$ && (umask 077 && mkdir $tmp) && echo "Warning: creating insecure temp directory" >&2 ; } ||
+ { echo "$me: cannot create a temporary directory in $TMPDIR" >&2 ; exit 1 ; } ;
+dummy=$tmp/dummy ;
+tmpfiles="$dummy.c $dummy.o $dummy.rel $dummy" ;
+case $CC_FOR_BUILD,$HOST_CC,$CC in
+ ,,)    echo "int x;" > $dummy.c ;
+       for c in cc gcc c89 c99 ; do
+         if ($c -c -o $dummy.o $dummy.c) >/dev/null 2>&1 ; then
+            CC_FOR_BUILD="$c"; break ;
+         fi ;
+       done ;
+       if test x"$CC_FOR_BUILD" = x ; then
+         CC_FOR_BUILD=no_compiler_found ;
+       fi
+       ;;
+ ,,*)   CC_FOR_BUILD=$CC ;;
+ ,*,*)  CC_FOR_BUILD=$HOST_CC ;;
+esac ; set_cc_for_build= ;'
+
+# This is needed to find uname on a Pyramid OSx when run in the BSD universe.
+# (ghazi@noc.rutgers.edu 1994-08-24)
+if (test -f /.attbin/uname) >/dev/null 2>&1 ; then
+       PATH=$PATH:/.attbin ; export PATH
+fi
+
+UNAME_MACHINE=`(uname -m) 2>/dev/null` || UNAME_MACHINE=unknown
+UNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown
+UNAME_SYSTEM=`(uname -s) 2>/dev/null`  || UNAME_SYSTEM=unknown
+UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown
+
+# Note: order is significant - the case branches are not exclusive.
+
+case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in
+    *:NetBSD:*:*)
+       # NetBSD (nbsd) targets should (where applicable) match one or
+       # more of the tuples: *-*-netbsdelf*, *-*-netbsdaout*,
+       # *-*-netbsdecoff* and *-*-netbsd*.  For targets that recently
+       # switched to ELF, *-*-netbsd* would select the old
+       # object file format.  This provides both forward
+       # compatibility and a consistent mechanism for selecting the
+       # object file format.
+       #
+       # Note: NetBSD doesn't particularly care about the vendor
+       # portion of the name.  We always set it to "unknown".
+       sysctl="sysctl -n hw.machine_arch"
+       UNAME_MACHINE_ARCH=`(/sbin/$sysctl 2>/dev/null || \
+           /usr/sbin/$sysctl 2>/dev/null || echo unknown)`
+       case "${UNAME_MACHINE_ARCH}" in
+           armeb) machine=armeb-unknown ;;
+           arm*) machine=arm-unknown ;;
+           sh3el) machine=shl-unknown ;;
+           sh3eb) machine=sh-unknown ;;
+           sh5el) machine=sh5le-unknown ;;
+           *) machine=${UNAME_MACHINE_ARCH}-unknown ;;
+       esac
+       # The Operating System including object format, if it has switched
+       # to ELF recently, or will in the future.
+       case "${UNAME_MACHINE_ARCH}" in
+           arm*|i386|m68k|ns32k|sh3*|sparc|vax)
+               eval $set_cc_for_build
+               if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \
+                       | grep -q __ELF__
+               then
+                   # Once all utilities can be ECOFF (netbsdecoff) or a.out (netbsdaout).
+                   # Return netbsd for either.  FIX?
+                   os=netbsd
+               else
+                   os=netbsdelf
+               fi
+               ;;
+           *)
+               os=netbsd
+               ;;
+       esac
+       # The OS release
+       # Debian GNU/NetBSD machines have a different userland, and
+       # thus, need a distinct triplet. However, they do not need
+       # kernel version information, so it can be replaced with a
+       # suitable tag, in the style of linux-gnu.
+       case "${UNAME_VERSION}" in
+           Debian*)
+               release='-gnu'
+               ;;
+           *)
+               release=`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'`
+               ;;
+       esac
+       # Since CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM:
+       # contains redundant information, the shorter form:
+       # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used.
+       echo "${machine}-${os}${release}"
+       exit ;;
+    *:OpenBSD:*:*)
+       UNAME_MACHINE_ARCH=`arch | sed 's/OpenBSD.//'`
+       echo ${UNAME_MACHINE_ARCH}-unknown-openbsd${UNAME_RELEASE}
+       exit ;;
+    *:ekkoBSD:*:*)
+       echo ${UNAME_MACHINE}-unknown-ekkobsd${UNAME_RELEASE}
+       exit ;;
+    *:SolidBSD:*:*)
+       echo ${UNAME_MACHINE}-unknown-solidbsd${UNAME_RELEASE}
+       exit ;;
+    macppc:MirBSD:*:*)
+       echo powerpc-unknown-mirbsd${UNAME_RELEASE}
+       exit ;;
+    *:MirBSD:*:*)
+       echo ${UNAME_MACHINE}-unknown-mirbsd${UNAME_RELEASE}
+       exit ;;
+    alpha:OSF1:*:*)
+       case $UNAME_RELEASE in
+       *4.0)
+               UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'`
+               ;;
+       *5.*)
+               UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $4}'`
+               ;;
+       esac
+       # According to Compaq, /usr/sbin/psrinfo has been available on
+       # OSF/1 and Tru64 systems produced since 1995.  I hope that
+       # covers most systems running today.  This code pipes the CPU
+       # types through head -n 1, so we only detect the type of CPU 0.
+       ALPHA_CPU_TYPE=`/usr/sbin/psrinfo -v | sed -n -e 's/^  The alpha \(.*\) processor.*$/\1/p' | head -n 1`
+       case "$ALPHA_CPU_TYPE" in
+           "EV4 (21064)")
+               UNAME_MACHINE="alpha" ;;
+           "EV4.5 (21064)")
+               UNAME_MACHINE="alpha" ;;
+           "LCA4 (21066/21068)")
+               UNAME_MACHINE="alpha" ;;
+           "EV5 (21164)")
+               UNAME_MACHINE="alphaev5" ;;
+           "EV5.6 (21164A)")
+               UNAME_MACHINE="alphaev56" ;;
+           "EV5.6 (21164PC)")
+               UNAME_MACHINE="alphapca56" ;;
+           "EV5.7 (21164PC)")
+               UNAME_MACHINE="alphapca57" ;;
+           "EV6 (21264)")
+               UNAME_MACHINE="alphaev6" ;;
+           "EV6.7 (21264A)")
+               UNAME_MACHINE="alphaev67" ;;
+           "EV6.8CB (21264C)")
+               UNAME_MACHINE="alphaev68" ;;
+           "EV6.8AL (21264B)")
+               UNAME_MACHINE="alphaev68" ;;
+           "EV6.8CX (21264D)")
+               UNAME_MACHINE="alphaev68" ;;
+           "EV6.9A (21264/EV69A)")
+               UNAME_MACHINE="alphaev69" ;;
+           "EV7 (21364)")
+               UNAME_MACHINE="alphaev7" ;;
+           "EV7.9 (21364A)")
+               UNAME_MACHINE="alphaev79" ;;
+       esac
+       # A Pn.n version is a patched version.
+       # A Vn.n version is a released version.
+       # A Tn.n version is a released field test version.
+       # A Xn.n version is an unreleased experimental baselevel.
+       # 1.2 uses "1.2" for uname -r.
+       echo ${UNAME_MACHINE}-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[PVTX]//' | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'`
+       # Reset EXIT trap before exiting to avoid spurious non-zero exit code.
+       exitcode=$?
+       trap '' 0
+       exit $exitcode ;;
+    Alpha\ *:Windows_NT*:*)
+       # How do we know it's Interix rather than the generic POSIX subsystem?
+       # Should we change UNAME_MACHINE based on the output of uname instead
+       # of the specific Alpha model?
+       echo alpha-pc-interix
+       exit ;;
+    21064:Windows_NT:50:3)
+       echo alpha-dec-winnt3.5
+       exit ;;
+    Amiga*:UNIX_System_V:4.0:*)
+       echo m68k-unknown-sysv4
+       exit ;;
+    *:[Aa]miga[Oo][Ss]:*:*)
+       echo ${UNAME_MACHINE}-unknown-amigaos
+       exit ;;
+    *:[Mm]orph[Oo][Ss]:*:*)
+       echo ${UNAME_MACHINE}-unknown-morphos
+       exit ;;
+    *:OS/390:*:*)
+       echo i370-ibm-openedition
+       exit ;;
+    *:z/VM:*:*)
+       echo s390-ibm-zvmoe
+       exit ;;
+    *:OS400:*:*)
+       echo powerpc-ibm-os400
+       exit ;;
+    arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*)
+       echo arm-acorn-riscix${UNAME_RELEASE}
+       exit ;;
+    arm:riscos:*:*|arm:RISCOS:*:*)
+       echo arm-unknown-riscos
+       exit ;;
+    SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*)
+       echo hppa1.1-hitachi-hiuxmpp
+       exit ;;
+    Pyramid*:OSx*:*:* | MIS*:OSx*:*:* | MIS*:SMP_DC-OSx*:*:*)
+       # akee@wpdis03.wpafb.af.mil (Earle F. Ake) contributed MIS and NILE.
+       if test "`(/bin/universe) 2>/dev/null`" = att ; then
+               echo pyramid-pyramid-sysv3
+       else
+               echo pyramid-pyramid-bsd
+       fi
+       exit ;;
+    NILE*:*:*:dcosx)
+       echo pyramid-pyramid-svr4
+       exit ;;
+    DRS?6000:unix:4.0:6*)
+       echo sparc-icl-nx6
+       exit ;;
+    DRS?6000:UNIX_SV:4.2*:7* | DRS?6000:isis:4.2*:7*)
+       case `/usr/bin/uname -p` in
+           sparc) echo sparc-icl-nx7; exit ;;
+       esac ;;
+    s390x:SunOS:*:*)
+       echo ${UNAME_MACHINE}-ibm-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+       exit ;;
+    sun4H:SunOS:5.*:*)
+       echo sparc-hal-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+       exit ;;
+    sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*)
+       echo sparc-sun-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+       exit ;;
+    i86pc:AuroraUX:5.*:* | i86xen:AuroraUX:5.*:*)
+       echo i386-pc-auroraux${UNAME_RELEASE}
+       exit ;;
+    i86pc:SunOS:5.*:* | i86xen:SunOS:5.*:*)
+       eval $set_cc_for_build
+       SUN_ARCH="i386"
+       # If there is a compiler, see if it is configured for 64-bit objects.
+       # Note that the Sun cc does not turn __LP64__ into 1 like gcc does.
+       # This test works for both compilers.
+       if [ "$CC_FOR_BUILD" != 'no_compiler_found' ]; then
+           if (echo '#ifdef __amd64'; echo IS_64BIT_ARCH; echo '#endif') | \
+               (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | \
+               grep IS_64BIT_ARCH >/dev/null
+           then
+               SUN_ARCH="x86_64"
+           fi
+       fi
+       echo ${SUN_ARCH}-pc-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+       exit ;;
+    sun4*:SunOS:6*:*)
+       # According to config.sub, this is the proper way to canonicalize
+       # SunOS6.  Hard to guess exactly what SunOS6 will be like, but
+       # it's likely to be more like Solaris than SunOS4.
+       echo sparc-sun-solaris3`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+       exit ;;
+    sun4*:SunOS:*:*)
+       case "`/usr/bin/arch -k`" in
+           Series*|S4*)
+               UNAME_RELEASE=`uname -v`
+               ;;
+       esac
+       # Japanese Language versions have a version number like `4.1.3-JL'.
+       echo sparc-sun-sunos`echo ${UNAME_RELEASE}|sed -e 's/-/_/'`
+       exit ;;
+    sun3*:SunOS:*:*)
+       echo m68k-sun-sunos${UNAME_RELEASE}
+       exit ;;
+    sun*:*:4.2BSD:*)
+       UNAME_RELEASE=`(sed 1q /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null`
+       test "x${UNAME_RELEASE}" = "x" && UNAME_RELEASE=3
+       case "`/bin/arch`" in
+           sun3)
+               echo m68k-sun-sunos${UNAME_RELEASE}
+               ;;
+           sun4)
+               echo sparc-sun-sunos${UNAME_RELEASE}
+               ;;
+       esac
+       exit ;;
+    aushp:SunOS:*:*)
+       echo sparc-auspex-sunos${UNAME_RELEASE}
+       exit ;;
+    # The situation for MiNT is a little confusing.  The machine name
+    # can be virtually everything (everything which is not
+    # "atarist" or "atariste" at least should have a processor
+    # > m68000).  The system name ranges from "MiNT" over "FreeMiNT"
+    # to the lowercase version "mint" (or "freemint").  Finally
+    # the system name "TOS" denotes a system which is actually not
+    # MiNT.  But MiNT is downward compatible to TOS, so this should
+    # be no problem.
+    atarist[e]:*MiNT:*:* | atarist[e]:*mint:*:* | atarist[e]:*TOS:*:*)
+       echo m68k-atari-mint${UNAME_RELEASE}
+       exit ;;
+    atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*)
+       echo m68k-atari-mint${UNAME_RELEASE}
+       exit ;;
+    *falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*)
+       echo m68k-atari-mint${UNAME_RELEASE}
+       exit ;;
+    milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*)
+       echo m68k-milan-mint${UNAME_RELEASE}
+       exit ;;
+    hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*)
+       echo m68k-hades-mint${UNAME_RELEASE}
+       exit ;;
+    *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*)
+       echo m68k-unknown-mint${UNAME_RELEASE}
+       exit ;;
+    m68k:machten:*:*)
+       echo m68k-apple-machten${UNAME_RELEASE}
+       exit ;;
+    powerpc:machten:*:*)
+       echo powerpc-apple-machten${UNAME_RELEASE}
+       exit ;;
+    RISC*:Mach:*:*)
+       echo mips-dec-mach_bsd4.3
+       exit ;;
+    RISC*:ULTRIX:*:*)
+       echo mips-dec-ultrix${UNAME_RELEASE}
+       exit ;;
+    VAX*:ULTRIX*:*:*)
+       echo vax-dec-ultrix${UNAME_RELEASE}
+       exit ;;
+    2020:CLIX:*:* | 2430:CLIX:*:*)
+       echo clipper-intergraph-clix${UNAME_RELEASE}
+       exit ;;
+    mips:*:*:UMIPS | mips:*:*:RISCos)
+       eval $set_cc_for_build
+       sed 's/^        //' << EOF >$dummy.c
+#ifdef __cplusplus
+#include <stdio.h>  /* for printf() prototype */
+       int main (int argc, char *argv[]) {
+#else
+       int main (argc, argv) int argc; char *argv[]; {
+#endif
+       #if defined (host_mips) && defined (MIPSEB)
+       #if defined (SYSTYPE_SYSV)
+         printf ("mips-mips-riscos%ssysv\n", argv[1]); exit (0);
+       #endif
+       #if defined (SYSTYPE_SVR4)
+         printf ("mips-mips-riscos%ssvr4\n", argv[1]); exit (0);
+       #endif
+       #if defined (SYSTYPE_BSD43) || defined(SYSTYPE_BSD)
+         printf ("mips-mips-riscos%sbsd\n", argv[1]); exit (0);
+       #endif
+       #endif
+         exit (-1);
+       }
+EOF
+       $CC_FOR_BUILD -o $dummy $dummy.c &&
+         dummyarg=`echo "${UNAME_RELEASE}" | sed -n 's/\([0-9]*\).*/\1/p'` &&
+         SYSTEM_NAME=`$dummy $dummyarg` &&
+           { echo "$SYSTEM_NAME"; exit; }
+       echo mips-mips-riscos${UNAME_RELEASE}
+       exit ;;
+    Motorola:PowerMAX_OS:*:*)
+       echo powerpc-motorola-powermax
+       exit ;;
+    Motorola:*:4.3:PL8-*)
+       echo powerpc-harris-powermax
+       exit ;;
+    Night_Hawk:*:*:PowerMAX_OS | Synergy:PowerMAX_OS:*:*)
+       echo powerpc-harris-powermax
+       exit ;;
+    Night_Hawk:Power_UNIX:*:*)
+       echo powerpc-harris-powerunix
+       exit ;;
+    m88k:CX/UX:7*:*)
+       echo m88k-harris-cxux7
+       exit ;;
+    m88k:*:4*:R4*)
+       echo m88k-motorola-sysv4
+       exit ;;
+    m88k:*:3*:R3*)
+       echo m88k-motorola-sysv3
+       exit ;;
+    AViiON:dgux:*:*)
+       # DG/UX returns AViiON for all architectures
+       UNAME_PROCESSOR=`/usr/bin/uname -p`
+       if [ $UNAME_PROCESSOR = mc88100 ] || [ $UNAME_PROCESSOR = mc88110 ]
+       then
+           if [ ${TARGET_BINARY_INTERFACE}x = m88kdguxelfx ] || \
+              [ ${TARGET_BINARY_INTERFACE}x = x ]
+           then
+               echo m88k-dg-dgux${UNAME_RELEASE}
+           else
+               echo m88k-dg-dguxbcs${UNAME_RELEASE}
+           fi
+       else
+           echo i586-dg-dgux${UNAME_RELEASE}
+       fi
+       exit ;;
+    M88*:DolphinOS:*:*)        # DolphinOS (SVR3)
+       echo m88k-dolphin-sysv3
+       exit ;;
+    M88*:*:R3*:*)
+       # Delta 88k system running SVR3
+       echo m88k-motorola-sysv3
+       exit ;;
+    XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3)
+       echo m88k-tektronix-sysv3
+       exit ;;
+    Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD)
+       echo m68k-tektronix-bsd
+       exit ;;
+    *:IRIX*:*:*)
+       echo mips-sgi-irix`echo ${UNAME_RELEASE}|sed -e 's/-/_/g'`
+       exit ;;
+    ????????:AIX?:[12].1:2)   # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX.
+       echo romp-ibm-aix     # uname -m gives an 8 hex-code CPU id
+       exit ;;               # Note that: echo "'`uname -s`'" gives 'AIX '
+    i*86:AIX:*:*)
+       echo i386-ibm-aix
+       exit ;;
+    ia64:AIX:*:*)
+       if [ -x /usr/bin/oslevel ] ; then
+               IBM_REV=`/usr/bin/oslevel`
+       else
+               IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE}
+       fi
+       echo ${UNAME_MACHINE}-ibm-aix${IBM_REV}
+       exit ;;
+    *:AIX:2:3)
+       if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then
+               eval $set_cc_for_build
+               sed 's/^                //' << EOF >$dummy.c
+               #include <sys/systemcfg.h>
+
+               main()
+                       {
+                       if (!__power_pc())
+                               exit(1);
+                       puts("powerpc-ibm-aix3.2.5");
+                       exit(0);
+                       }
+EOF
+               if $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy`
+               then
+                       echo "$SYSTEM_NAME"
+               else
+                       echo rs6000-ibm-aix3.2.5
+               fi
+       elif grep bos324 /usr/include/stdio.h >/dev/null 2>&1; then
+               echo rs6000-ibm-aix3.2.4
+       else
+               echo rs6000-ibm-aix3.2
+       fi
+       exit ;;
+    *:AIX:*:[4567])
+       IBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | sed 1q | awk '{ print $1 }'`
+       if /usr/sbin/lsattr -El ${IBM_CPU_ID} | grep ' POWER' >/dev/null 2>&1; then
+               IBM_ARCH=rs6000
+       else
+               IBM_ARCH=powerpc
+       fi
+       if [ -x /usr/bin/oslevel ] ; then
+               IBM_REV=`/usr/bin/oslevel`
+       else
+               IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE}
+       fi
+       echo ${IBM_ARCH}-ibm-aix${IBM_REV}
+       exit ;;
+    *:AIX:*:*)
+       echo rs6000-ibm-aix
+       exit ;;
+    ibmrt:4.4BSD:*|romp-ibm:BSD:*)
+       echo romp-ibm-bsd4.4
+       exit ;;
+    ibmrt:*BSD:*|romp-ibm:BSD:*)            # covers RT/PC BSD and
+       echo romp-ibm-bsd${UNAME_RELEASE}   # 4.3 with uname added to
+       exit ;;                             # report: romp-ibm BSD 4.3
+    *:BOSX:*:*)
+       echo rs6000-bull-bosx
+       exit ;;
+    DPX/2?00:B.O.S.:*:*)
+       echo m68k-bull-sysv3
+       exit ;;
+    9000/[34]??:4.3bsd:1.*:*)
+       echo m68k-hp-bsd
+       exit ;;
+    hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*)
+       echo m68k-hp-bsd4.4
+       exit ;;
+    9000/[34678]??:HP-UX:*:*)
+       HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'`
+       case "${UNAME_MACHINE}" in
+           9000/31? )            HP_ARCH=m68000 ;;
+           9000/[34]?? )         HP_ARCH=m68k ;;
+           9000/[678][0-9][0-9])
+               if [ -x /usr/bin/getconf ]; then
+                   sc_cpu_version=`/usr/bin/getconf SC_CPU_VERSION 2>/dev/null`
+                   sc_kernel_bits=`/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null`
+                   case "${sc_cpu_version}" in
+                     523) HP_ARCH="hppa1.0" ;; # CPU_PA_RISC1_0
+                     528) HP_ARCH="hppa1.1" ;; # CPU_PA_RISC1_1
+                     532)                      # CPU_PA_RISC2_0
+                       case "${sc_kernel_bits}" in
+                         32) HP_ARCH="hppa2.0n" ;;
+                         64) HP_ARCH="hppa2.0w" ;;
+                         '') HP_ARCH="hppa2.0" ;;   # HP-UX 10.20
+                       esac ;;
+                   esac
+               fi
+               if [ "${HP_ARCH}" = "" ]; then
+                   eval $set_cc_for_build
+                   sed 's/^            //' << EOF >$dummy.c
+
+               #define _HPUX_SOURCE
+               #include <stdlib.h>
+               #include <unistd.h>
+
+               int main ()
+               {
+               #if defined(_SC_KERNEL_BITS)
+                   long bits = sysconf(_SC_KERNEL_BITS);
+               #endif
+                   long cpu  = sysconf (_SC_CPU_VERSION);
+
+                   switch (cpu)
+                       {
+                       case CPU_PA_RISC1_0: puts ("hppa1.0"); break;
+                       case CPU_PA_RISC1_1: puts ("hppa1.1"); break;
+                       case CPU_PA_RISC2_0:
+               #if defined(_SC_KERNEL_BITS)
+                           switch (bits)
+                               {
+                               case 64: puts ("hppa2.0w"); break;
+                               case 32: puts ("hppa2.0n"); break;
+                               default: puts ("hppa2.0"); break;
+                               } break;
+               #else  /* !defined(_SC_KERNEL_BITS) */
+                           puts ("hppa2.0"); break;
+               #endif
+                       default: puts ("hppa1.0"); break;
+                       }
+                   exit (0);
+               }
+EOF
+                   (CCOPTS= $CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null) && HP_ARCH=`$dummy`
+                   test -z "$HP_ARCH" && HP_ARCH=hppa
+               fi ;;
+       esac
+       if [ ${HP_ARCH} = "hppa2.0w" ]
+       then
+           eval $set_cc_for_build
+
+           # hppa2.0w-hp-hpux* has a 64-bit kernel and a compiler generating
+           # 32-bit code.  hppa64-hp-hpux* has the same kernel and a compiler
+           # generating 64-bit code.  GNU and HP use different nomenclature:
+           #
+           # $ CC_FOR_BUILD=cc ./config.guess
+           # => hppa2.0w-hp-hpux11.23
+           # $ CC_FOR_BUILD="cc +DA2.0w" ./config.guess
+           # => hppa64-hp-hpux11.23
+
+           if echo __LP64__ | (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) |
+               grep -q __LP64__
+           then
+               HP_ARCH="hppa2.0w"
+           else
+               HP_ARCH="hppa64"
+           fi
+       fi
+       echo ${HP_ARCH}-hp-hpux${HPUX_REV}
+       exit ;;
+    ia64:HP-UX:*:*)
+       HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'`
+       echo ia64-hp-hpux${HPUX_REV}
+       exit ;;
+    3050*:HI-UX:*:*)
+       eval $set_cc_for_build
+       sed 's/^        //' << EOF >$dummy.c
+       #include <unistd.h>
+       int
+       main ()
+       {
+         long cpu = sysconf (_SC_CPU_VERSION);
+         /* The order matters, because CPU_IS_HP_MC68K erroneously returns
+            true for CPU_PA_RISC1_0.  CPU_IS_PA_RISC returns correct
+            results, however.  */
+         if (CPU_IS_PA_RISC (cpu))
+           {
+             switch (cpu)
+               {
+                 case CPU_PA_RISC1_0: puts ("hppa1.0-hitachi-hiuxwe2"); break;
+                 case CPU_PA_RISC1_1: puts ("hppa1.1-hitachi-hiuxwe2"); break;
+                 case CPU_PA_RISC2_0: puts ("hppa2.0-hitachi-hiuxwe2"); break;
+                 default: puts ("hppa-hitachi-hiuxwe2"); break;
+               }
+           }
+         else if (CPU_IS_HP_MC68K (cpu))
+           puts ("m68k-hitachi-hiuxwe2");
+         else puts ("unknown-hitachi-hiuxwe2");
+         exit (0);
+       }
+EOF
+       $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy` &&
+               { echo "$SYSTEM_NAME"; exit; }
+       echo unknown-hitachi-hiuxwe2
+       exit ;;
+    9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:* )
+       echo hppa1.1-hp-bsd
+       exit ;;
+    9000/8??:4.3bsd:*:*)
+       echo hppa1.0-hp-bsd
+       exit ;;
+    *9??*:MPE/iX:*:* | *3000*:MPE/iX:*:*)
+       echo hppa1.0-hp-mpeix
+       exit ;;
+    hp7??:OSF1:*:* | hp8?[79]:OSF1:*:* )
+       echo hppa1.1-hp-osf
+       exit ;;
+    hp8??:OSF1:*:*)
+       echo hppa1.0-hp-osf
+       exit ;;
+    i*86:OSF1:*:*)
+       if [ -x /usr/sbin/sysversion ] ; then
+           echo ${UNAME_MACHINE}-unknown-osf1mk
+       else
+           echo ${UNAME_MACHINE}-unknown-osf1
+       fi
+       exit ;;
+    parisc*:Lites*:*:*)
+       echo hppa1.1-hp-lites
+       exit ;;
+    C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*)
+       echo c1-convex-bsd
+       exit ;;
+    C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*)
+       if getsysinfo -f scalar_acc
+       then echo c32-convex-bsd
+       else echo c2-convex-bsd
+       fi
+       exit ;;
+    C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*)
+       echo c34-convex-bsd
+       exit ;;
+    C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*)
+       echo c38-convex-bsd
+       exit ;;
+    C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*)
+       echo c4-convex-bsd
+       exit ;;
+    CRAY*Y-MP:*:*:*)
+       echo ymp-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
+       exit ;;
+    CRAY*[A-Z]90:*:*:*)
+       echo ${UNAME_MACHINE}-cray-unicos${UNAME_RELEASE} \
+       | sed -e 's/CRAY.*\([A-Z]90\)/\1/' \
+             -e y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/ \
+             -e 's/\.[^.]*$/.X/'
+       exit ;;
+    CRAY*TS:*:*:*)
+       echo t90-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
+       exit ;;
+    CRAY*T3E:*:*:*)
+       echo alphaev5-cray-unicosmk${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
+       exit ;;
+    CRAY*SV1:*:*:*)
+       echo sv1-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
+       exit ;;
+    *:UNICOS/mp:*:*)
+       echo craynv-cray-unicosmp${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
+       exit ;;
+    F30[01]:UNIX_System_V:*:* | F700:UNIX_System_V:*:*)
+       FUJITSU_PROC=`uname -m | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'`
+       FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'`
+       FUJITSU_REL=`echo ${UNAME_RELEASE} | sed -e 's/ /_/'`
+       echo "${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}"
+       exit ;;
+    5000:UNIX_System_V:4.*:*)
+       FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'`
+       FUJITSU_REL=`echo ${UNAME_RELEASE} | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/ /_/'`
+       echo "sparc-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}"
+       exit ;;
+    i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*)
+       echo ${UNAME_MACHINE}-pc-bsdi${UNAME_RELEASE}
+       exit ;;
+    sparc*:BSD/OS:*:*)
+       echo sparc-unknown-bsdi${UNAME_RELEASE}
+       exit ;;
+    *:BSD/OS:*:*)
+       echo ${UNAME_MACHINE}-unknown-bsdi${UNAME_RELEASE}
+       exit ;;
+    *:FreeBSD:*:*)
+       UNAME_PROCESSOR=`/usr/bin/uname -p`
+       case ${UNAME_PROCESSOR} in
+           amd64)
+               echo x86_64-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;;
+           *)
+               echo ${UNAME_PROCESSOR}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;;
+       esac
+       exit ;;
+    i*:CYGWIN*:*)
+       echo ${UNAME_MACHINE}-pc-cygwin
+       exit ;;
+    *:MINGW*:*)
+       echo ${UNAME_MACHINE}-pc-mingw32
+       exit ;;
+    i*:MSYS*:*)
+       echo ${UNAME_MACHINE}-pc-msys
+       exit ;;
+    i*:windows32*:*)
+       # uname -m includes "-pc" on this system.
+       echo ${UNAME_MACHINE}-mingw32
+       exit ;;
+    i*:PW*:*)
+       echo ${UNAME_MACHINE}-pc-pw32
+       exit ;;
+    *:Interix*:*)
+       case ${UNAME_MACHINE} in
+           x86)
+               echo i586-pc-interix${UNAME_RELEASE}
+               exit ;;
+           authenticamd | genuineintel | EM64T)
+               echo x86_64-unknown-interix${UNAME_RELEASE}
+               exit ;;
+           IA64)
+               echo ia64-unknown-interix${UNAME_RELEASE}
+               exit ;;
+       esac ;;
+    [345]86:Windows_95:* | [345]86:Windows_98:* | [345]86:Windows_NT:*)
+       echo i${UNAME_MACHINE}-pc-mks
+       exit ;;
+    8664:Windows_NT:*)
+       echo x86_64-pc-mks
+       exit ;;
+    i*:Windows_NT*:* | Pentium*:Windows_NT*:*)
+       # How do we know it's Interix rather than the generic POSIX subsystem?
+       # It also conflicts with pre-2.0 versions of AT&T UWIN. Should we
+       # UNAME_MACHINE based on the output of uname instead of i386?
+       echo i586-pc-interix
+       exit ;;
+    i*:UWIN*:*)
+       echo ${UNAME_MACHINE}-pc-uwin
+       exit ;;
+    amd64:CYGWIN*:*:* | x86_64:CYGWIN*:*:*)
+       echo x86_64-unknown-cygwin
+       exit ;;
+    p*:CYGWIN*:*)
+       echo powerpcle-unknown-cygwin
+       exit ;;
+    prep*:SunOS:5.*:*)
+       echo powerpcle-unknown-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+       exit ;;
+    *:GNU:*:*)
+       # the GNU system
+       echo `echo ${UNAME_MACHINE}|sed -e 's,[-/].*$,,'`-unknown-gnu`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'`
+       exit ;;
+    *:GNU/*:*:*)
+       # other systems with GNU libc and userland
+       echo ${UNAME_MACHINE}-unknown-`echo ${UNAME_SYSTEM} | sed 's,^[^/]*/,,' | tr '[A-Z]' '[a-z]'``echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`-gnu
+       exit ;;
+    i*86:Minix:*:*)
+       echo ${UNAME_MACHINE}-pc-minix
+       exit ;;
+    aarch64:Linux:*:*)
+       echo ${UNAME_MACHINE}-unknown-linux-gnu
+       exit ;;
+    aarch64_be:Linux:*:*)
+       UNAME_MACHINE=aarch64_be
+       echo ${UNAME_MACHINE}-unknown-linux-gnu
+       exit ;;
+    alpha:Linux:*:*)
+       case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' < /proc/cpuinfo` in
+         EV5)   UNAME_MACHINE=alphaev5 ;;
+         EV56)  UNAME_MACHINE=alphaev56 ;;
+         PCA56) UNAME_MACHINE=alphapca56 ;;
+         PCA57) UNAME_MACHINE=alphapca56 ;;
+         EV6)   UNAME_MACHINE=alphaev6 ;;
+         EV67)  UNAME_MACHINE=alphaev67 ;;
+         EV68*) UNAME_MACHINE=alphaev68 ;;
+       esac
+       objdump --private-headers /bin/sh | grep -q ld.so.1
+       if test "$?" = 0 ; then LIBC="libc1" ; else LIBC="" ; fi
+       echo ${UNAME_MACHINE}-unknown-linux-gnu${LIBC}
+       exit ;;
+    arm*:Linux:*:*)
+       eval $set_cc_for_build
+       if echo __ARM_EABI__ | $CC_FOR_BUILD -E - 2>/dev/null \
+           | grep -q __ARM_EABI__
+       then
+           echo ${UNAME_MACHINE}-unknown-linux-gnu
+       else
+           if echo __ARM_PCS_VFP | $CC_FOR_BUILD -E - 2>/dev/null \
+               | grep -q __ARM_PCS_VFP
+           then
+               echo ${UNAME_MACHINE}-unknown-linux-gnueabi
+           else
+               echo ${UNAME_MACHINE}-unknown-linux-gnueabihf
+           fi
+       fi
+       exit ;;
+    avr32*:Linux:*:*)
+       echo ${UNAME_MACHINE}-unknown-linux-gnu
+       exit ;;
+    cris:Linux:*:*)
+       echo ${UNAME_MACHINE}-axis-linux-gnu
+       exit ;;
+    crisv32:Linux:*:*)
+       echo ${UNAME_MACHINE}-axis-linux-gnu
+       exit ;;
+    frv:Linux:*:*)
+       echo ${UNAME_MACHINE}-unknown-linux-gnu
+       exit ;;
+    hexagon:Linux:*:*)
+       echo ${UNAME_MACHINE}-unknown-linux-gnu
+       exit ;;
+    i*86:Linux:*:*)
+       LIBC=gnu
+       eval $set_cc_for_build
+       sed 's/^        //' << EOF >$dummy.c
+       #ifdef __dietlibc__
+       LIBC=dietlibc
+       #endif
+EOF
+       eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^LIBC'`
+       echo "${UNAME_MACHINE}-pc-linux-${LIBC}"
+       exit ;;
+    ia64:Linux:*:*)
+       echo ${UNAME_MACHINE}-unknown-linux-gnu
+       exit ;;
+    m32r*:Linux:*:*)
+       echo ${UNAME_MACHINE}-unknown-linux-gnu
+       exit ;;
+    m68*:Linux:*:*)
+       echo ${UNAME_MACHINE}-unknown-linux-gnu
+       exit ;;
+    mips:Linux:*:* | mips64:Linux:*:*)
+       eval $set_cc_for_build
+       sed 's/^        //' << EOF >$dummy.c
+       #undef CPU
+       #undef ${UNAME_MACHINE}
+       #undef ${UNAME_MACHINE}el
+       #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL)
+       CPU=${UNAME_MACHINE}el
+       #else
+       #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB)
+       CPU=${UNAME_MACHINE}
+       #else
+       CPU=
+       #endif
+       #endif
+EOF
+       eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^CPU'`
+       test x"${CPU}" != x && { echo "${CPU}-unknown-linux-gnu"; exit; }
+       ;;
+    or32:Linux:*:*)
+       echo ${UNAME_MACHINE}-unknown-linux-gnu
+       exit ;;
+    padre:Linux:*:*)
+       echo sparc-unknown-linux-gnu
+       exit ;;
+    parisc64:Linux:*:* | hppa64:Linux:*:*)
+       echo hppa64-unknown-linux-gnu
+       exit ;;
+    parisc:Linux:*:* | hppa:Linux:*:*)
+       # Look for CPU level
+       case `grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2` in
+         PA7*) echo hppa1.1-unknown-linux-gnu ;;
+         PA8*) echo hppa2.0-unknown-linux-gnu ;;
+         *)    echo hppa-unknown-linux-gnu ;;
+       esac
+       exit ;;
+    ppc64:Linux:*:*)
+       echo powerpc64-unknown-linux-gnu
+       exit ;;
+    ppc:Linux:*:*)
+       echo powerpc-unknown-linux-gnu
+       exit ;;
+    s390:Linux:*:* | s390x:Linux:*:*)
+       echo ${UNAME_MACHINE}-ibm-linux
+       exit ;;
+    sh64*:Linux:*:*)
+       echo ${UNAME_MACHINE}-unknown-linux-gnu
+       exit ;;
+    sh*:Linux:*:*)
+       echo ${UNAME_MACHINE}-unknown-linux-gnu
+       exit ;;
+    sparc:Linux:*:* | sparc64:Linux:*:*)
+       echo ${UNAME_MACHINE}-unknown-linux-gnu
+       exit ;;
+    tile*:Linux:*:*)
+       echo ${UNAME_MACHINE}-unknown-linux-gnu
+       exit ;;
+    vax:Linux:*:*)
+       echo ${UNAME_MACHINE}-dec-linux-gnu
+       exit ;;
+    x86_64:Linux:*:*)
+       echo ${UNAME_MACHINE}-unknown-linux-gnu
+       exit ;;
+    xtensa*:Linux:*:*)
+       echo ${UNAME_MACHINE}-unknown-linux-gnu
+       exit ;;
+    i*86:DYNIX/ptx:4*:*)
+       # ptx 4.0 does uname -s correctly, with DYNIX/ptx in there.
+       # earlier versions are messed up and put the nodename in both
+       # sysname and nodename.
+       echo i386-sequent-sysv4
+       exit ;;
+    i*86:UNIX_SV:4.2MP:2.*)
+       # Unixware is an offshoot of SVR4, but it has its own version
+       # number series starting with 2...
+       # I am not positive that other SVR4 systems won't match this,
+       # I just have to hope.  -- rms.
+       # Use sysv4.2uw... so that sysv4* matches it.
+       echo ${UNAME_MACHINE}-pc-sysv4.2uw${UNAME_VERSION}
+       exit ;;
+    i*86:OS/2:*:*)
+       # If we were able to find `uname', then EMX Unix compatibility
+       # is probably installed.
+       echo ${UNAME_MACHINE}-pc-os2-emx
+       exit ;;
+    i*86:XTS-300:*:STOP)
+       echo ${UNAME_MACHINE}-unknown-stop
+       exit ;;
+    i*86:atheos:*:*)
+       echo ${UNAME_MACHINE}-unknown-atheos
+       exit ;;
+    i*86:syllable:*:*)
+       echo ${UNAME_MACHINE}-pc-syllable
+       exit ;;
+    i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.[02]*:*)
+       echo i386-unknown-lynxos${UNAME_RELEASE}
+       exit ;;
+    i*86:*DOS:*:*)
+       echo ${UNAME_MACHINE}-pc-msdosdjgpp
+       exit ;;
+    i*86:*:4.*:* | i*86:SYSTEM_V:4.*:*)
+       UNAME_REL=`echo ${UNAME_RELEASE} | sed 's/\/MP$//'`
+       if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then
+               echo ${UNAME_MACHINE}-univel-sysv${UNAME_REL}
+       else
+               echo ${UNAME_MACHINE}-pc-sysv${UNAME_REL}
+       fi
+       exit ;;
+    i*86:*:5:[678]*)
+       # UnixWare 7.x, OpenUNIX and OpenServer 6.
+       case `/bin/uname -X | grep "^Machine"` in
+           *486*)           UNAME_MACHINE=i486 ;;
+           *Pentium)        UNAME_MACHINE=i586 ;;
+           *Pent*|*Celeron) UNAME_MACHINE=i686 ;;
+       esac
+       echo ${UNAME_MACHINE}-unknown-sysv${UNAME_RELEASE}${UNAME_SYSTEM}${UNAME_VERSION}
+       exit ;;
+    i*86:*:3.2:*)
+       if test -f /usr/options/cb.name; then
+               UNAME_REL=`sed -n 's/.*Version //p' </usr/options/cb.name`
+               echo ${UNAME_MACHINE}-pc-isc$UNAME_REL
+       elif /bin/uname -X 2>/dev/null >/dev/null ; then
+               UNAME_REL=`(/bin/uname -X|grep Release|sed -e 's/.*= //')`
+               (/bin/uname -X|grep i80486 >/dev/null) && UNAME_MACHINE=i486
+               (/bin/uname -X|grep '^Machine.*Pentium' >/dev/null) \
+                       && UNAME_MACHINE=i586
+               (/bin/uname -X|grep '^Machine.*Pent *II' >/dev/null) \
+                       && UNAME_MACHINE=i686
+               (/bin/uname -X|grep '^Machine.*Pentium Pro' >/dev/null) \
+                       && UNAME_MACHINE=i686
+               echo ${UNAME_MACHINE}-pc-sco$UNAME_REL
+       else
+               echo ${UNAME_MACHINE}-pc-sysv32
+       fi
+       exit ;;
+    pc:*:*:*)
+       # Left here for compatibility:
+       # uname -m prints for DJGPP always 'pc', but it prints nothing about
+       # the processor, so we play safe by assuming i586.
+       # Note: whatever this is, it MUST be the same as what config.sub
+       # prints for the "djgpp" host, or else GDB configury will decide that
+       # this is a cross-build.
+       echo i586-pc-msdosdjgpp
+       exit ;;
+    Intel:Mach:3*:*)
+       echo i386-pc-mach3
+       exit ;;
+    paragon:*:*:*)
+       echo i860-intel-osf1
+       exit ;;
+    i860:*:4.*:*) # i860-SVR4
+       if grep Stardent /usr/include/sys/uadmin.h >/dev/null 2>&1 ; then
+         echo i860-stardent-sysv${UNAME_RELEASE} # Stardent Vistra i860-SVR4
+       else # Add other i860-SVR4 vendors below as they are discovered.
+         echo i860-unknown-sysv${UNAME_RELEASE}  # Unknown i860-SVR4
+       fi
+       exit ;;
+    mini*:CTIX:SYS*5:*)
+       # "miniframe"
+       echo m68010-convergent-sysv
+       exit ;;
+    mc68k:UNIX:SYSTEM5:3.51m)
+       echo m68k-convergent-sysv
+       exit ;;
+    M680?0:D-NIX:5.3:*)
+       echo m68k-diab-dnix
+       exit ;;
+    M68*:*:R3V[5678]*:*)
+       test -r /sysV68 && { echo 'm68k-motorola-sysv'; exit; } ;;
+    3[345]??:*:4.0:3.0 | 3[34]??A:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 3[34]??/*:*:4.0:3.0 | 4400:*:4.0:3.0 | 4850:*:4.0:3.0 | SKA40:*:4.0:3.0 | SDS2:*:4.0:3.0 | SHG2:*:4.0:3.0 | S7501*:*:4.0:3.0)
+       OS_REL=''
+       test -r /etc/.relid \
+       && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid`
+       /bin/uname -p 2>/dev/null | grep 86 >/dev/null \
+         && { echo i486-ncr-sysv4.3${OS_REL}; exit; }
+       /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \
+         && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;;
+    3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*)
+       /bin/uname -p 2>/dev/null | grep 86 >/dev/null \
+         && { echo i486-ncr-sysv4; exit; } ;;
+    NCR*:*:4.2:* | MPRAS*:*:4.2:*)
+       OS_REL='.3'
+       test -r /etc/.relid \
+           && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid`
+       /bin/uname -p 2>/dev/null | grep 86 >/dev/null \
+           && { echo i486-ncr-sysv4.3${OS_REL}; exit; }
+       /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \
+           && { echo i586-ncr-sysv4.3${OS_REL}; exit; }
+       /bin/uname -p 2>/dev/null | /bin/grep pteron >/dev/null \
+           && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;;
+    m68*:LynxOS:2.*:* | m68*:LynxOS:3.0*:*)
+       echo m68k-unknown-lynxos${UNAME_RELEASE}
+       exit ;;
+    mc68030:UNIX_System_V:4.*:*)
+       echo m68k-atari-sysv4
+       exit ;;
+    TSUNAMI:LynxOS:2.*:*)
+       echo sparc-unknown-lynxos${UNAME_RELEASE}
+       exit ;;
+    rs6000:LynxOS:2.*:*)
+       echo rs6000-unknown-lynxos${UNAME_RELEASE}
+       exit ;;
+    PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.[02]*:*)
+       echo powerpc-unknown-lynxos${UNAME_RELEASE}
+       exit ;;
+    SM[BE]S:UNIX_SV:*:*)
+       echo mips-dde-sysv${UNAME_RELEASE}
+       exit ;;
+    RM*:ReliantUNIX-*:*:*)
+       echo mips-sni-sysv4
+       exit ;;
+    RM*:SINIX-*:*:*)
+       echo mips-sni-sysv4
+       exit ;;
+    *:SINIX-*:*:*)
+       if uname -p 2>/dev/null >/dev/null ; then
+               UNAME_MACHINE=`(uname -p) 2>/dev/null`
+               echo ${UNAME_MACHINE}-sni-sysv4
+       else
+               echo ns32k-sni-sysv
+       fi
+       exit ;;
+    PENTIUM:*:4.0*:*)  # Unisys `ClearPath HMP IX 4000' SVR4/MP effort
+                       # says <Richard.M.Bartel@ccMail.Census.GOV>
+       echo i586-unisys-sysv4
+       exit ;;
+    *:UNIX_System_V:4*:FTX*)
+       # From Gerald Hewes <hewes@openmarket.com>.
+       # How about differentiating between stratus architectures? -djm
+       echo hppa1.1-stratus-sysv4
+       exit ;;
+    *:*:*:FTX*)
+       # From seanf@swdc.stratus.com.
+       echo i860-stratus-sysv4
+       exit ;;
+    i*86:VOS:*:*)
+       # From Paul.Green@stratus.com.
+       echo ${UNAME_MACHINE}-stratus-vos
+       exit ;;
+    *:VOS:*:*)
+       # From Paul.Green@stratus.com.
+       echo hppa1.1-stratus-vos
+       exit ;;
+    mc68*:A/UX:*:*)
+       echo m68k-apple-aux${UNAME_RELEASE}
+       exit ;;
+    news*:NEWS-OS:6*:*)
+       echo mips-sony-newsos6
+       exit ;;
+    R[34]000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R*000:UNIX_SV:*:*)
+       if [ -d /usr/nec ]; then
+               echo mips-nec-sysv${UNAME_RELEASE}
+       else
+               echo mips-unknown-sysv${UNAME_RELEASE}
+       fi
+       exit ;;
+    BeBox:BeOS:*:*)    # BeOS running on hardware made by Be, PPC only.
+       echo powerpc-be-beos
+       exit ;;
+    BeMac:BeOS:*:*)    # BeOS running on Mac or Mac clone, PPC only.
+       echo powerpc-apple-beos
+       exit ;;
+    BePC:BeOS:*:*)     # BeOS running on Intel PC compatible.
+       echo i586-pc-beos
+       exit ;;
+    BePC:Haiku:*:*)    # Haiku running on Intel PC compatible.
+       echo i586-pc-haiku
+       exit ;;
+    SX-4:SUPER-UX:*:*)
+       echo sx4-nec-superux${UNAME_RELEASE}
+       exit ;;
+    SX-5:SUPER-UX:*:*)
+       echo sx5-nec-superux${UNAME_RELEASE}
+       exit ;;
+    SX-6:SUPER-UX:*:*)
+       echo sx6-nec-superux${UNAME_RELEASE}
+       exit ;;
+    SX-7:SUPER-UX:*:*)
+       echo sx7-nec-superux${UNAME_RELEASE}
+       exit ;;
+    SX-8:SUPER-UX:*:*)
+       echo sx8-nec-superux${UNAME_RELEASE}
+       exit ;;
+    SX-8R:SUPER-UX:*:*)
+       echo sx8r-nec-superux${UNAME_RELEASE}
+       exit ;;
+    Power*:Rhapsody:*:*)
+       echo powerpc-apple-rhapsody${UNAME_RELEASE}
+       exit ;;
+    *:Rhapsody:*:*)
+       echo ${UNAME_MACHINE}-apple-rhapsody${UNAME_RELEASE}
+       exit ;;
+    *:Darwin:*:*)
+       UNAME_PROCESSOR=`uname -p` || UNAME_PROCESSOR=unknown
+       case $UNAME_PROCESSOR in
+           i386)
+               eval $set_cc_for_build
+               if [ "$CC_FOR_BUILD" != 'no_compiler_found' ]; then
+                 if (echo '#ifdef __LP64__'; echo IS_64BIT_ARCH; echo '#endif') | \
+                     (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | \
+                     grep IS_64BIT_ARCH >/dev/null
+                 then
+                     UNAME_PROCESSOR="x86_64"
+                 fi
+               fi ;;
+           unknown) UNAME_PROCESSOR=powerpc ;;
+       esac
+       echo ${UNAME_PROCESSOR}-apple-darwin${UNAME_RELEASE}
+       exit ;;
+    *:procnto*:*:* | *:QNX:[0123456789]*:*)
+       UNAME_PROCESSOR=`uname -p`
+       if test "$UNAME_PROCESSOR" = "x86"; then
+               UNAME_PROCESSOR=i386
+               UNAME_MACHINE=pc
+       fi
+       echo ${UNAME_PROCESSOR}-${UNAME_MACHINE}-nto-qnx${UNAME_RELEASE}
+       exit ;;
+    *:QNX:*:4*)
+       echo i386-pc-qnx
+       exit ;;
+    NEO-?:NONSTOP_KERNEL:*:*)
+       echo neo-tandem-nsk${UNAME_RELEASE}
+       exit ;;
+    NSE-?:NONSTOP_KERNEL:*:*)
+       echo nse-tandem-nsk${UNAME_RELEASE}
+       exit ;;
+    NSR-?:NONSTOP_KERNEL:*:*)
+       echo nsr-tandem-nsk${UNAME_RELEASE}
+       exit ;;
+    *:NonStop-UX:*:*)
+       echo mips-compaq-nonstopux
+       exit ;;
+    BS2000:POSIX*:*:*)
+       echo bs2000-siemens-sysv
+       exit ;;
+    DS/*:UNIX_System_V:*:*)
+       echo ${UNAME_MACHINE}-${UNAME_SYSTEM}-${UNAME_RELEASE}
+       exit ;;
+    *:Plan9:*:*)
+       # "uname -m" is not consistent, so use $cputype instead. 386
+       # is converted to i386 for consistency with other x86
+       # operating systems.
+       if test "$cputype" = "386"; then
+           UNAME_MACHINE=i386
+       else
+           UNAME_MACHINE="$cputype"
+       fi
+       echo ${UNAME_MACHINE}-unknown-plan9
+       exit ;;
+    *:TOPS-10:*:*)
+       echo pdp10-unknown-tops10
+       exit ;;
+    *:TENEX:*:*)
+       echo pdp10-unknown-tenex
+       exit ;;
+    KS10:TOPS-20:*:* | KL10:TOPS-20:*:* | TYPE4:TOPS-20:*:*)
+       echo pdp10-dec-tops20
+       exit ;;
+    XKL-1:TOPS-20:*:* | TYPE5:TOPS-20:*:*)
+       echo pdp10-xkl-tops20
+       exit ;;
+    *:TOPS-20:*:*)
+       echo pdp10-unknown-tops20
+       exit ;;
+    *:ITS:*:*)
+       echo pdp10-unknown-its
+       exit ;;
+    SEI:*:*:SEIUX)
+       echo mips-sei-seiux${UNAME_RELEASE}
+       exit ;;
+    *:DragonFly:*:*)
+       echo ${UNAME_MACHINE}-unknown-dragonfly`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`
+       exit ;;
+    *:*VMS:*:*)
+       UNAME_MACHINE=`(uname -p) 2>/dev/null`
+       case "${UNAME_MACHINE}" in
+           A*) echo alpha-dec-vms ; exit ;;
+           I*) echo ia64-dec-vms ; exit ;;
+           V*) echo vax-dec-vms ; exit ;;
+       esac ;;
+    *:XENIX:*:SysV)
+       echo i386-pc-xenix
+       exit ;;
+    i*86:skyos:*:*)
+       echo ${UNAME_MACHINE}-pc-skyos`echo ${UNAME_RELEASE}` | sed -e 's/ .*$//'
+       exit ;;
+    i*86:rdos:*:*)
+       echo ${UNAME_MACHINE}-pc-rdos
+       exit ;;
+    i*86:AROS:*:*)
+       echo ${UNAME_MACHINE}-pc-aros
+       exit ;;
+    x86_64:VMkernel:*:*)
+       echo ${UNAME_MACHINE}-unknown-esx
+       exit ;;
+esac
+
+#echo '(No uname command or uname output not recognized.)' 1>&2
+#echo "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" 1>&2
+
+eval $set_cc_for_build
+cat >$dummy.c <<EOF
+#ifdef _SEQUENT_
+# include <sys/types.h>
+# include <sys/utsname.h>
+#endif
+main ()
+{
+#if defined (sony)
+#if defined (MIPSEB)
+  /* BFD wants "bsd" instead of "newsos".  Perhaps BFD should be changed,
+     I don't know....  */
+  printf ("mips-sony-bsd\n"); exit (0);
+#else
+#include <sys/param.h>
+  printf ("m68k-sony-newsos%s\n",
+#ifdef NEWSOS4
+       "4"
+#else
+       ""
+#endif
+       ); exit (0);
+#endif
+#endif
+
+#if defined (__arm) && defined (__acorn) && defined (__unix)
+  printf ("arm-acorn-riscix\n"); exit (0);
+#endif
+
+#if defined (hp300) && !defined (hpux)
+  printf ("m68k-hp-bsd\n"); exit (0);
+#endif
+
+#if defined (NeXT)
+#if !defined (__ARCHITECTURE__)
+#define __ARCHITECTURE__ "m68k"
+#endif
+  int version;
+  version=`(hostinfo | sed -n 's/.*NeXT Mach \([0-9]*\).*/\1/p') 2>/dev/null`;
+  if (version < 4)
+    printf ("%s-next-nextstep%d\n", __ARCHITECTURE__, version);
+  else
+    printf ("%s-next-openstep%d\n", __ARCHITECTURE__, version);
+  exit (0);
+#endif
+
+#if defined (MULTIMAX) || defined (n16)
+#if defined (UMAXV)
+  printf ("ns32k-encore-sysv\n"); exit (0);
+#else
+#if defined (CMU)
+  printf ("ns32k-encore-mach\n"); exit (0);
+#else
+  printf ("ns32k-encore-bsd\n"); exit (0);
+#endif
+#endif
+#endif
+
+#if defined (__386BSD__)
+  printf ("i386-pc-bsd\n"); exit (0);
+#endif
+
+#if defined (sequent)
+#if defined (i386)
+  printf ("i386-sequent-dynix\n"); exit (0);
+#endif
+#if defined (ns32000)
+  printf ("ns32k-sequent-dynix\n"); exit (0);
+#endif
+#endif
+
+#if defined (_SEQUENT_)
+    struct utsname un;
+
+    uname(&un);
+
+    if (strncmp(un.version, "V2", 2) == 0) {
+       printf ("i386-sequent-ptx2\n"); exit (0);
+    }
+    if (strncmp(un.version, "V1", 2) == 0) { /* XXX is V1 correct? */
+       printf ("i386-sequent-ptx1\n"); exit (0);
+    }
+    printf ("i386-sequent-ptx\n"); exit (0);
+
+#endif
+
+#if defined (vax)
+# if !defined (ultrix)
+#  include <sys/param.h>
+#  if defined (BSD)
+#   if BSD == 43
+      printf ("vax-dec-bsd4.3\n"); exit (0);
+#   else
+#    if BSD == 199006
+      printf ("vax-dec-bsd4.3reno\n"); exit (0);
+#    else
+      printf ("vax-dec-bsd\n"); exit (0);
+#    endif
+#   endif
+#  else
+    printf ("vax-dec-bsd\n"); exit (0);
+#  endif
+# else
+    printf ("vax-dec-ultrix\n"); exit (0);
+# endif
+#endif
+
+#if defined (alliant) && defined (i860)
+  printf ("i860-alliant-bsd\n"); exit (0);
+#endif
+
+  exit (1);
+}
+EOF
+
+$CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null && SYSTEM_NAME=`$dummy` &&
+       { echo "$SYSTEM_NAME"; exit; }
+
+# Apollos put the system type in the environment.
+
+test -d /usr/apollo && { echo ${ISP}-apollo-${SYSTYPE}; exit; }
+
+# Convex versions that predate uname can use getsysinfo(1)
+
+if [ -x /usr/convex/getsysinfo ]
+then
+    case `getsysinfo -f cpu_type` in
+    c1*)
+       echo c1-convex-bsd
+       exit ;;
+    c2*)
+       if getsysinfo -f scalar_acc
+       then echo c32-convex-bsd
+       else echo c2-convex-bsd
+       fi
+       exit ;;
+    c34*)
+       echo c34-convex-bsd
+       exit ;;
+    c38*)
+       echo c38-convex-bsd
+       exit ;;
+    c4*)
+       echo c4-convex-bsd
+       exit ;;
+    esac
+fi
+
+cat >&2 <<EOF
+$0: unable to guess system type
+
+This script, last modified $timestamp, has failed to recognize
+the operating system you are using. It is advised that you
+download the most up to date version of the config scripts from
+
+  http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess;hb=HEAD
+and
+  http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub;hb=HEAD
+
+If the version you run ($0) is already up to date, please
+send the following data and any information you think might be
+pertinent to <config-patches@gnu.org> in order to provide the needed
+information to handle your system.
+
+config.guess timestamp = $timestamp
+
+uname -m = `(uname -m) 2>/dev/null || echo unknown`
+uname -r = `(uname -r) 2>/dev/null || echo unknown`
+uname -s = `(uname -s) 2>/dev/null || echo unknown`
+uname -v = `(uname -v) 2>/dev/null || echo unknown`
+
+/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null`
+/bin/uname -X     = `(/bin/uname -X) 2>/dev/null`
+
+hostinfo               = `(hostinfo) 2>/dev/null`
+/bin/universe          = `(/bin/universe) 2>/dev/null`
+/usr/bin/arch -k       = `(/usr/bin/arch -k) 2>/dev/null`
+/bin/arch              = `(/bin/arch) 2>/dev/null`
+/usr/bin/oslevel       = `(/usr/bin/oslevel) 2>/dev/null`
+/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null`
+
+UNAME_MACHINE = ${UNAME_MACHINE}
+UNAME_RELEASE = ${UNAME_RELEASE}
+UNAME_SYSTEM  = ${UNAME_SYSTEM}
+UNAME_VERSION = ${UNAME_VERSION}
+EOF
+
+exit 1
+
+# Local variables:
+# eval: (add-hook 'write-file-hooks 'time-stamp)
+# time-stamp-start: "timestamp='"
+# time-stamp-format: "%:y-%02m-%02d"
+# time-stamp-end: "'"
+# End:
diff --git a/config.h.cmake b/config.h.cmake
new file mode 100644 (file)
index 0000000..3c7b968
--- /dev/null
@@ -0,0 +1,222 @@
+/* config.h.  Generated from config.h.cmake by cmake.  */
+
+/* Build against libcurl. */
+#cmakedefine ENABLE_LIBCURL 1
+
+/* Use libjpeg instead of builtin jpeg decoder. */
+#cmakedefine ENABLE_LIBJPEG 1
+
+/* Use libopenjpeg instead of builtin jpeg2000 decoder. */
+#cmakedefine ENABLE_LIBOPENJPEG 1
+
+/* Build against libtiff. */
+#cmakedefine ENABLE_LIBTIFF 1
+
+/* Build against libpng. */
+#cmakedefine ENABLE_LIBPNG 1
+
+/* Do not hardcode the library location */
+#cmakedefine ENABLE_RELOCATABLE 1
+
+/* Use zlib instead of builtin zlib decoder. */
+#cmakedefine ENABLE_ZLIB 1
+
+/* Use cairo for rendering. */
+#cmakedefine HAVE_CAIRO 1
+
+/* Define to 1 if you have the <dirent.h> header file, and it defines `DIR'.
+   */
+#cmakedefine HAVE_DIRENT_H 1
+
+/* Define to 1 if you have the <dlfcn.h> header file. */
+#cmakedefine HAVE_DLFCN_H 1
+
+/* Define to 1 if you have the <fcntl.h> header file. */
+#cmakedefine HAVE_FCNTL_H 1
+
+/* Have FreeType2 include files */
+#cmakedefine HAVE_FREETYPE_H 1
+
+/* Define to 1 if you have the `fseek64' function. */
+#cmakedefine HAVE_FSEEK64 1
+
+/* Define to 1 if fseeko (and presumably ftello) exists and is declared. */
+#cmakedefine HAVE_FSEEKO 1
+
+/* Define to 1 if you have the `ftell64' function. */
+#cmakedefine HAVE_FTELL64 1
+
+/* Defines if gettimeofday is available on your system */
+#cmakedefine HAVE_GETTIMEOFDAY 1
+
+/* Defines if gmtime_r is available on your system */
+#cmakedefine HAVE_GMTIME_R 1
+
+/* Define if you have the iconv() function and it works. */
+#cmakedefine HAVE_ICONV 1
+
+/* Define to 1 if you have the <inttypes.h> header file. */
+#cmakedefine HAVE_INTTYPES_H 1
+
+/* Define to 1 if you have the `openjpeg' library (-lopenjpeg). */
+#cmakedefine HAVE_LIBOPENJPEG 1
+
+/* Define to 1 if you have the `z' library (-lz). */
+#cmakedefine HAVE_LIBZ 1
+
+/* Defines if localtime_r is available on your system */
+#cmakedefine HAVE_LOCALTIME_R 1
+
+/* Define to 1 if you have the <memory.h> header file. */
+#cmakedefine HAVE_MEMORY_H 1
+
+/* Define to 1 if you have the `mkstemp' function. */
+#cmakedefine HAVE_MKSTEMP 1
+
+/* Define to 1 if you have the `mkstemps' function. */
+#cmakedefine HAVE_MKSTEMPS 1
+
+/* Define to 1 if you have the <ndir.h> header file, and it defines `DIR'. */
+#cmakedefine HAVE_NDIR_H 1
+
+/* Define to 1 if you have the <openjpeg.h> header file. */
+#cmakedefine HAVE_OPENJPEG_H 1
+
+/* Define to 1 if you have the `popen' function. */
+#cmakedefine HAVE_POPEN 1
+
+/* Define if you have POSIX threads libraries and header files. */
+#cmakedefine HAVE_PTHREAD 1
+
+/* Use splash for rendering. */
+#cmakedefine HAVE_SPLASH 1
+
+/* Define to 1 if you have the <stdint.h> header file. */
+#cmakedefine HAVE_STDINT_H 1
+
+/* Define to 1 if you have the <stdlib.h> header file. */
+#cmakedefine HAVE_STDLIB_H 1
+
+/* Define to 1 if you have the <strings.h> header file. */
+#cmakedefine HAVE_STRINGS_H 1
+
+/* Define to 1 if you have the <string.h> header file. */
+#cmakedefine HAVE_STRING_H 1
+
+/* Define to 1 if you have the <sys/dir.h> header file, and it defines `DIR'.
+   */
+#cmakedefine HAVE_SYS_DIR_H 1
+
+/* Define to 1 if you have the <sys/mman.h> header file. */
+#cmakedefine HAVE_SYS_MMAN_H 1
+
+/* Define to 1 if you have the <sys/ndir.h> header file, and it defines `DIR'.
+   */
+#cmakedefine HAVE_SYS_NDIR_H 1
+
+/* Define to 1 if you have the <sys/stat.h> header file. */
+#cmakedefine HAVE_SYS_STAT_H 1
+
+/* Define to 1 if you have the <sys/types.h> header file. */
+#cmakedefine HAVE_SYS_TYPES_H 1
+
+/* Define to 1 if you have the <unistd.h> header file. */
+#cmakedefine HAVE_UNISTD_H 1
+
+/* Define to 1 if you have the <zlib.h> header file. */
+#cmakedefine HAVE_ZLIB_H 1
+
+/* Define to 1 if you have a big endian machine */
+#cmakedefine WORDS_BIGENDIAN 1
+
+/* Define as const if the declaration of iconv() needs const. */
+#define ICONV_CONST ${ICONV_CONST}
+
+/* Enable multithreading support. */
+#cmakedefine MULTITHREADED 1
+
+/* Generate OPI comments in PS output. */
+#cmakedefine OPI_SUPPORT 1
+
+/* Name of package */
+#define PACKAGE "poppler"
+
+/* Define to the address where bug reports for this package should be sent. */
+#define PACKAGE_BUGREPORT "https://bugs.freedesktop.org/enter_bug.cgi?product=poppler"
+
+/* Define to the full name of this package. */
+#define PACKAGE_NAME "poppler"
+
+/* Define to the full name and version of this package. */
+#define PACKAGE_STRING "poppler ${POPPLER_VERSION}"
+
+/* Define to the one symbol short name of this package. */
+#define PACKAGE_TARNAME "poppler"
+
+/* Define to the home page for this package. */
+#define PACKAGE_URL ""
+
+/* Define to the version of this package. */
+#define PACKAGE_VERSION "${POPPLER_VERSION}"
+
+/* Poppler data dir */
+#define POPPLER_DATADIR "${CMAKE_INSTALL_PREFIX}/share/poppler"
+
+/* Support for curl based doc builder is compiled in. */
+#cmakedefine POPPLER_HAS_CURL_SUPPORT 1
+
+/* Define to 1 if you have the ANSI C header files. */
+#define STDC_HEADERS 1
+
+/* Enable word list support. */
+#cmakedefine TEXTOUT_WORD_LIST 1
+
+/* Defines if use cms */
+#cmakedefine USE_CMS 1
+
+/* Use fixed point arithmetic in the Splash backend */
+#cmakedefine USE_FIXEDPOINT 1
+
+/* Use single precision arithmetic in the Splash backend */
+#cmakedefine USE_FLOAT 1
+
+/* Defines if use lcms1 */
+#cmakedefine USE_LCMS1 1
+
+/* Version number of package */
+#define VERSION "${POPPLER_VERSION}"
+
+/* Use fontconfig font configuration backend */
+#cmakedefine WITH_FONTCONFIGURATION_FONTCONFIG 1
+
+/* Use win32 font configuration backend */
+#cmakedefine WITH_FONTCONFIGURATION_WIN32 1
+
+/* OpenJPEG with the OPJ_DPARAMETERS_IGNORE_PCLR_CMAP_CDEF_FLAG flag */
+#cmakedefine WITH_OPENJPEG_IGNORE_PCLR_CMAP_CDEF_FLAG 1
+
+/* Define to 1 if the X Window System is missing or not being used. */
+/* #undef X_DISPLAY_MISSING */
+
+/*
+ * jpeg.h needs HAVE_BOOLEAN, when the system uses boolean in system
+ * headers and I'm too lazy to write a configure test as long as only
+ * unixware is related
+ */
+#ifdef _UNIXWARE
+#define HAVE_BOOLEAN
+#endif
+
+/* MS has defined snprintf as deprecated */
+#ifdef _MSC_VER
+#define snprintf _snprintf
+#endif
+
+/* Number of bits in a file offset, on hosts where this is settable. */
+/* #undef _FILE_OFFSET_BITS */
+
+/* Define to 1 to make fseeko visible on some hosts (e.g. glibc 2.2). */
+/* #undef _LARGEFILE_SOURCE */
+
+/* Define for large files, on AIX-style hosts. */
+/* #undef _LARGE_FILES */
diff --git a/config.h.in b/config.h.in
new file mode 100644 (file)
index 0000000..eae4380
--- /dev/null
@@ -0,0 +1,249 @@
+/* config.h.in.  Generated from configure.ac by autoheader.  */
+
+/* Define if building universal (internal helper macro) */
+#undef AC_APPLE_UNIVERSAL_BUILD
+
+/* Build against libcurl. */
+#undef ENABLE_LIBCURL
+
+/* Use libjpeg instead of builtin jpeg decoder. */
+#undef ENABLE_LIBJPEG
+
+/* Use libopenjpeg instead of builtin jpeg2000 decoder. */
+#undef ENABLE_LIBOPENJPEG
+
+/* Build against libpng. */
+#undef ENABLE_LIBPNG
+
+/* Build against libtiff. */
+#undef ENABLE_LIBTIFF
+
+/* Do not hardcode the library location */
+#undef ENABLE_RELOCATABLE
+
+/* Use zlib instead of builtin zlib decoder. */
+#undef ENABLE_ZLIB
+
+/* Use cairo for rendering. */
+#undef HAVE_CAIRO
+
+/* Define to 1 if you have the <dirent.h> header file, and it defines `DIR'.
+   */
+#undef HAVE_DIRENT_H
+
+/* Define to 1 if you have the <dlfcn.h> header file. */
+#undef HAVE_DLFCN_H
+
+/* Define to 1 if you have the <fcntl.h> header file. */
+#undef HAVE_FCNTL_H
+
+/* Have FreeType2 include files */
+#undef HAVE_FREETYPE_H
+
+/* Define to 1 if you have the `fseek64' function. */
+#undef HAVE_FSEEK64
+
+/* Define to 1 if fseeko (and presumably ftello) exists and is declared. */
+#undef HAVE_FSEEKO
+
+/* Define to 1 if you have the `ftell64' function. */
+#undef HAVE_FTELL64
+
+/* Defines if gettimeofday is available on your system */
+#undef HAVE_GETTIMEOFDAY
+
+/* Defines if gmtime_r is available on your system */
+#undef HAVE_GMTIME_R
+
+/* Define if you have the iconv() function and it works. */
+#undef HAVE_ICONV
+
+/* Define to 1 if you have the <inttypes.h> header file. */
+#undef HAVE_INTTYPES_H
+
+/* Define to 1 if you have the `tiff' library (-ltiff). */
+#undef HAVE_LIBTIFF
+
+/* Define to 1 if you have the `z' library (-lz). */
+#undef HAVE_LIBZ
+
+/* Defines if localtime_r is available on your system */
+#undef HAVE_LOCALTIME_R
+
+/* Define to 1 if you have the <memory.h> header file. */
+#undef HAVE_MEMORY_H
+
+/* Define to 1 if you have the `mkstemp' function. */
+#undef HAVE_MKSTEMP
+
+/* Define to 1 if you have the `mkstemps' function. */
+#undef HAVE_MKSTEMPS
+
+/* Define to 1 if you have the <ndir.h> header file, and it defines `DIR'. */
+#undef HAVE_NDIR_H
+
+/* Define to 1 if you have the <openjpeg.h> header file. */
+#undef HAVE_OPENJPEG_H
+
+/* Define to 1 if you have the `popen' function. */
+#undef HAVE_POPEN
+
+/* Define if you have POSIX threads libraries and header files. */
+#undef HAVE_PTHREAD
+
+/* Use splash for rendering. */
+#undef HAVE_SPLASH
+
+/* Define to 1 if you have the <stdint.h> header file. */
+#undef HAVE_STDINT_H
+
+/* Define to 1 if you have the <stdlib.h> header file. */
+#undef HAVE_STDLIB_H
+
+/* Define to 1 if you have the <strings.h> header file. */
+#undef HAVE_STRINGS_H
+
+/* Define to 1 if you have the <string.h> header file. */
+#undef HAVE_STRING_H
+
+/* Define to 1 if you have the <sys/dir.h> header file, and it defines `DIR'.
+   */
+#undef HAVE_SYS_DIR_H
+
+/* Define to 1 if you have the <sys/mman.h> header file. */
+#undef HAVE_SYS_MMAN_H
+
+/* Define to 1 if you have the <sys/ndir.h> header file, and it defines `DIR'.
+   */
+#undef HAVE_SYS_NDIR_H
+
+/* Define to 1 if you have the <sys/stat.h> header file. */
+#undef HAVE_SYS_STAT_H
+
+/* Define to 1 if you have the <sys/types.h> header file. */
+#undef HAVE_SYS_TYPES_H
+
+/* Define to 1 if you have the <tiffio.h> header file. */
+#undef HAVE_TIFFIO_H
+
+/* Define to 1 if you have the <unistd.h> header file. */
+#undef HAVE_UNISTD_H
+
+/* Define to 1 if you have the <zlib.h> header file. */
+#undef HAVE_ZLIB_H
+
+/* Define as const if the declaration of iconv() needs const. */
+#undef ICONV_CONST
+
+/* Define to the sub-directory in which libtool stores uninstalled libraries.
+   */
+#undef LT_OBJDIR
+
+/* Enable multithreading support. */
+#undef MULTITHREADED
+
+/* Generate OPI comments in PS output. */
+#undef OPI_SUPPORT
+
+/* Name of package */
+#undef PACKAGE
+
+/* Define to the address where bug reports for this package should be sent. */
+#undef PACKAGE_BUGREPORT
+
+/* Define to the full name of this package. */
+#undef PACKAGE_NAME
+
+/* Define to the full name and version of this package. */
+#undef PACKAGE_STRING
+
+/* Define to the one symbol short name of this package. */
+#undef PACKAGE_TARNAME
+
+/* Define to the home page for this package. */
+#undef PACKAGE_URL
+
+/* Define to the version of this package. */
+#undef PACKAGE_VERSION
+
+/* Poppler data dir */
+#undef POPPLER_DATADIR
+
+/* Support for curl based doc builder is compiled in. */
+#undef POPPLER_HAS_CURL_SUPPORT
+
+/* Defines the poppler version */
+#undef POPPLER_VERSION
+
+/* Define to necessary symbol if this constant uses a non-standard name on
+   your system. */
+#undef PTHREAD_CREATE_JOINABLE
+
+/* Define to 1 if you have the ANSI C header files. */
+#undef STDC_HEADERS
+
+/* Enable word list support. */
+#undef TEXTOUT_WORD_LIST
+
+/* Defines if use cms */
+#undef USE_CMS
+
+/* Use fixed point arithmetic in the Splash backend */
+#undef USE_FIXEDPOINT
+
+/* Use single precision arithmetic in the Splash backend */
+#undef USE_FLOAT
+
+/* Defines if use lcms1 */
+#undef USE_LCMS1
+
+/* Version number of package */
+#undef VERSION
+
+/* Use fontconfig font configuration backend */
+#undef WITH_FONTCONFIGURATION_FONTCONFIG
+
+/* Use win32 font configuration backend */
+#undef WITH_FONTCONFIGURATION_WIN32
+
+/* OpenJPEG with the OPJ_DPARAMETERS_IGNORE_PCLR_CMAP_CDEF_FLAG flag. */
+#undef WITH_OPENJPEG_IGNORE_PCLR_CMAP_CDEF_FLAG
+
+/* Define WORDS_BIGENDIAN to 1 if your processor stores words with the most
+   significant byte first (like Motorola and SPARC, unlike Intel). */
+#if defined AC_APPLE_UNIVERSAL_BUILD
+# if defined __BIG_ENDIAN__
+#  define WORDS_BIGENDIAN 1
+# endif
+#else
+# ifndef WORDS_BIGENDIAN
+#  undef WORDS_BIGENDIAN
+# endif
+#endif
+
+/* Define to 1 if the X Window System is missing or not being used. */
+#undef X_DISPLAY_MISSING
+
+/*
+ * jpeg.h needs HAVE_BOOLEAN, when the system uses boolean in system
+ * headers and I'm too lazy to write a configure test as long as only
+ * unixware is related
+ */
+#ifdef _UNIXWARE
+#define HAVE_BOOLEAN
+#endif
+
+
+/* Enable large inode numbers on Mac OS X 10.5.  */
+#ifndef _DARWIN_USE_64_BIT_INODE
+# define _DARWIN_USE_64_BIT_INODE 1
+#endif
+
+/* Number of bits in a file offset, on hosts where this is settable. */
+#undef _FILE_OFFSET_BITS
+
+/* Define to 1 to make fseeko visible on some hosts (e.g. glibc 2.2). */
+#undef _LARGEFILE_SOURCE
+
+/* Define for large files, on AIX-style hosts. */
+#undef _LARGE_FILES
diff --git a/config.sub b/config.sub
new file mode 100755 (executable)
index 0000000..6205f84
--- /dev/null
@@ -0,0 +1,1782 @@
+#! /bin/sh
+# Configuration validation subroutine script.
+#   Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
+#   2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010,
+#   2011, 2012 Free Software Foundation, Inc.
+
+timestamp='2012-04-18'
+
+# This file is (in principle) common to ALL GNU software.
+# The presence of a machine in this file suggests that SOME GNU software
+# can handle that machine.  It does not imply ALL GNU software can.
+#
+# This file is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, see <http://www.gnu.org/licenses/>.
+#
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program that contains a
+# configuration script generated by Autoconf, you may include it under
+# the same distribution terms that you use for the rest of that program.
+
+
+# Please send patches to <config-patches@gnu.org>.  Submit a context
+# diff and a properly formatted GNU ChangeLog entry.
+#
+# Configuration subroutine to validate and canonicalize a configuration type.
+# Supply the specified configuration type as an argument.
+# If it is invalid, we print an error message on stderr and exit with code 1.
+# Otherwise, we print the canonical config type on stdout and succeed.
+
+# You can get the latest version of this script from:
+# http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub;hb=HEAD
+
+# This file is supposed to be the same for all GNU packages
+# and recognize all the CPU types, system types and aliases
+# that are meaningful with *any* GNU software.
+# Each package is responsible for reporting which valid configurations
+# it does not support.  The user should be able to distinguish
+# a failure to support a valid configuration from a meaningless
+# configuration.
+
+# The goal of this file is to map all the various variations of a given
+# machine specification into a single specification in the form:
+#      CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM
+# or in some cases, the newer four-part form:
+#      CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM
+# It is wrong to echo any other type of specification.
+
+me=`echo "$0" | sed -e 's,.*/,,'`
+
+usage="\
+Usage: $0 [OPTION] CPU-MFR-OPSYS
+       $0 [OPTION] ALIAS
+
+Canonicalize a configuration name.
+
+Operation modes:
+  -h, --help         print this help, then exit
+  -t, --time-stamp   print date of last modification, then exit
+  -v, --version      print version number, then exit
+
+Report bugs and patches to <config-patches@gnu.org>."
+
+version="\
+GNU config.sub ($timestamp)
+
+Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000,
+2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012
+Free Software Foundation, Inc.
+
+This is free software; see the source for copying conditions.  There is NO
+warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
+
+help="
+Try \`$me --help' for more information."
+
+# Parse command line
+while test $# -gt 0 ; do
+  case $1 in
+    --time-stamp | --time* | -t )
+       echo "$timestamp" ; exit ;;
+    --version | -v )
+       echo "$version" ; exit ;;
+    --help | --h* | -h )
+       echo "$usage"; exit ;;
+    -- )     # Stop option processing
+       shift; break ;;
+    - )        # Use stdin as input.
+       break ;;
+    -* )
+       echo "$me: invalid option $1$help"
+       exit 1 ;;
+
+    *local*)
+       # First pass through any local machine types.
+       echo $1
+       exit ;;
+
+    * )
+       break ;;
+  esac
+done
+
+case $# in
+ 0) echo "$me: missing argument$help" >&2
+    exit 1;;
+ 1) ;;
+ *) echo "$me: too many arguments$help" >&2
+    exit 1;;
+esac
+
+# Separate what the user gave into CPU-COMPANY and OS or KERNEL-OS (if any).
+# Here we must recognize all the valid KERNEL-OS combinations.
+maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'`
+case $maybe_os in
+  nto-qnx* | linux-gnu* | linux-android* | linux-dietlibc | linux-newlib* | \
+  linux-uclibc* | uclinux-uclibc* | uclinux-gnu* | kfreebsd*-gnu* | \
+  knetbsd*-gnu* | netbsd*-gnu* | \
+  kopensolaris*-gnu* | \
+  storm-chaos* | os2-emx* | rtmk-nova*)
+    os=-$maybe_os
+    basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'`
+    ;;
+  android-linux)
+    os=-linux-android
+    basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'`-unknown
+    ;;
+  *)
+    basic_machine=`echo $1 | sed 's/-[^-]*$//'`
+    if [ $basic_machine != $1 ]
+    then os=`echo $1 | sed 's/.*-/-/'`
+    else os=; fi
+    ;;
+esac
+
+### Let's recognize common machines as not being operating systems so
+### that things like config.sub decstation-3100 work.  We also
+### recognize some manufacturers as not being operating systems, so we
+### can provide default operating systems below.
+case $os in
+       -sun*os*)
+               # Prevent following clause from handling this invalid input.
+               ;;
+       -dec* | -mips* | -sequent* | -encore* | -pc532* | -sgi* | -sony* | \
+       -att* | -7300* | -3300* | -delta* | -motorola* | -sun[234]* | \
+       -unicom* | -ibm* | -next | -hp | -isi* | -apollo | -altos* | \
+       -convergent* | -ncr* | -news | -32* | -3600* | -3100* | -hitachi* |\
+       -c[123]* | -convex* | -sun | -crds | -omron* | -dg | -ultra | -tti* | \
+       -harris | -dolphin | -highlevel | -gould | -cbm | -ns | -masscomp | \
+       -apple | -axis | -knuth | -cray | -microblaze)
+               os=
+               basic_machine=$1
+               ;;
+       -bluegene*)
+               os=-cnk
+               ;;
+       -sim | -cisco | -oki | -wec | -winbond)
+               os=
+               basic_machine=$1
+               ;;
+       -scout)
+               ;;
+       -wrs)
+               os=-vxworks
+               basic_machine=$1
+               ;;
+       -chorusos*)
+               os=-chorusos
+               basic_machine=$1
+               ;;
+       -chorusrdb)
+               os=-chorusrdb
+               basic_machine=$1
+               ;;
+       -hiux*)
+               os=-hiuxwe2
+               ;;
+       -sco6)
+               os=-sco5v6
+               basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+               ;;
+       -sco5)
+               os=-sco3.2v5
+               basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+               ;;
+       -sco4)
+               os=-sco3.2v4
+               basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+               ;;
+       -sco3.2.[4-9]*)
+               os=`echo $os | sed -e 's/sco3.2./sco3.2v/'`
+               basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+               ;;
+       -sco3.2v[4-9]*)
+               # Don't forget version if it is 3.2v4 or newer.
+               basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+               ;;
+       -sco5v6*)
+               # Don't forget version if it is 3.2v4 or newer.
+               basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+               ;;
+       -sco*)
+               os=-sco3.2v2
+               basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+               ;;
+       -udk*)
+               basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+               ;;
+       -isc)
+               os=-isc2.2
+               basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+               ;;
+       -clix*)
+               basic_machine=clipper-intergraph
+               ;;
+       -isc*)
+               basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+               ;;
+       -lynx*178)
+               os=-lynxos178
+               ;;
+       -lynx*5)
+               os=-lynxos5
+               ;;
+       -lynx*)
+               os=-lynxos
+               ;;
+       -ptx*)
+               basic_machine=`echo $1 | sed -e 's/86-.*/86-sequent/'`
+               ;;
+       -windowsnt*)
+               os=`echo $os | sed -e 's/windowsnt/winnt/'`
+               ;;
+       -psos*)
+               os=-psos
+               ;;
+       -mint | -mint[0-9]*)
+               basic_machine=m68k-atari
+               os=-mint
+               ;;
+esac
+
+# Decode aliases for certain CPU-COMPANY combinations.
+case $basic_machine in
+       # Recognize the basic CPU types without company name.
+       # Some are omitted here because they have special meanings below.
+       1750a | 580 \
+       | a29k \
+       | aarch64 | aarch64_be \
+       | alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \
+       | alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] | alpha64pca5[67] \
+       | am33_2.0 \
+       | arc | arm | arm[bl]e | arme[lb] | armv[2345] | armv[345][lb] | avr | avr32 \
+        | be32 | be64 \
+       | bfin \
+       | c4x | clipper \
+       | d10v | d30v | dlx | dsp16xx \
+       | epiphany \
+       | fido | fr30 | frv \
+       | h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \
+       | hexagon \
+       | i370 | i860 | i960 | ia64 \
+       | ip2k | iq2000 \
+       | le32 | le64 \
+       | lm32 \
+       | m32c | m32r | m32rle | m68000 | m68k | m88k \
+       | maxq | mb | microblaze | mcore | mep | metag \
+       | mips | mipsbe | mipseb | mipsel | mipsle \
+       | mips16 \
+       | mips64 | mips64el \
+       | mips64octeon | mips64octeonel \
+       | mips64orion | mips64orionel \
+       | mips64r5900 | mips64r5900el \
+       | mips64vr | mips64vrel \
+       | mips64vr4100 | mips64vr4100el \
+       | mips64vr4300 | mips64vr4300el \
+       | mips64vr5000 | mips64vr5000el \
+       | mips64vr5900 | mips64vr5900el \
+       | mipsisa32 | mipsisa32el \
+       | mipsisa32r2 | mipsisa32r2el \
+       | mipsisa64 | mipsisa64el \
+       | mipsisa64r2 | mipsisa64r2el \
+       | mipsisa64sb1 | mipsisa64sb1el \
+       | mipsisa64sr71k | mipsisa64sr71kel \
+       | mipstx39 | mipstx39el \
+       | mn10200 | mn10300 \
+       | moxie \
+       | mt \
+       | msp430 \
+       | nds32 | nds32le | nds32be \
+       | nios | nios2 \
+       | ns16k | ns32k \
+       | open8 \
+       | or32 \
+       | pdp10 | pdp11 | pj | pjl \
+       | powerpc | powerpc64 | powerpc64le | powerpcle \
+       | pyramid \
+       | rl78 | rx \
+       | score \
+       | sh | sh[1234] | sh[24]a | sh[24]aeb | sh[23]e | sh[34]eb | sheb | shbe | shle | sh[1234]le | sh3ele \
+       | sh64 | sh64le \
+       | sparc | sparc64 | sparc64b | sparc64v | sparc86x | sparclet | sparclite \
+       | sparcv8 | sparcv9 | sparcv9b | sparcv9v \
+       | spu \
+       | tahoe | tic4x | tic54x | tic55x | tic6x | tic80 | tron \
+       | ubicom32 \
+       | v850 | v850e | v850e1 | v850e2 | v850es | v850e2v3 \
+       | we32k \
+       | x86 | xc16x | xstormy16 | xtensa \
+       | z8k | z80)
+               basic_machine=$basic_machine-unknown
+               ;;
+       c54x)
+               basic_machine=tic54x-unknown
+               ;;
+       c55x)
+               basic_machine=tic55x-unknown
+               ;;
+       c6x)
+               basic_machine=tic6x-unknown
+               ;;
+       m6811 | m68hc11 | m6812 | m68hc12 | m68hcs12x | picochip)
+               basic_machine=$basic_machine-unknown
+               os=-none
+               ;;
+       m88110 | m680[12346]0 | m683?2 | m68360 | m5200 | v70 | w65 | z8k)
+               ;;
+       ms1)
+               basic_machine=mt-unknown
+               ;;
+
+       strongarm | thumb | xscale)
+               basic_machine=arm-unknown
+               ;;
+       xgate)
+               basic_machine=$basic_machine-unknown
+               os=-none
+               ;;
+       xscaleeb)
+               basic_machine=armeb-unknown
+               ;;
+
+       xscaleel)
+               basic_machine=armel-unknown
+               ;;
+
+       # We use `pc' rather than `unknown'
+       # because (1) that's what they normally are, and
+       # (2) the word "unknown" tends to confuse beginning users.
+       i*86 | x86_64)
+         basic_machine=$basic_machine-pc
+         ;;
+       # Object if more than one company name word.
+       *-*-*)
+               echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2
+               exit 1
+               ;;
+       # Recognize the basic CPU types with company name.
+       580-* \
+       | a29k-* \
+       | aarch64-* | aarch64_be-* \
+       | alpha-* | alphaev[4-8]-* | alphaev56-* | alphaev6[78]-* \
+       | alpha64-* | alpha64ev[4-8]-* | alpha64ev56-* | alpha64ev6[78]-* \
+       | alphapca5[67]-* | alpha64pca5[67]-* | arc-* \
+       | arm-*  | armbe-* | armle-* | armeb-* | armv*-* \
+       | avr-* | avr32-* \
+       | be32-* | be64-* \
+       | bfin-* | bs2000-* \
+       | c[123]* | c30-* | [cjt]90-* | c4x-* \
+       | clipper-* | craynv-* | cydra-* \
+       | d10v-* | d30v-* | dlx-* \
+       | elxsi-* \
+       | f30[01]-* | f700-* | fido-* | fr30-* | frv-* | fx80-* \
+       | h8300-* | h8500-* \
+       | hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \
+       | hexagon-* \
+       | i*86-* | i860-* | i960-* | ia64-* \
+       | ip2k-* | iq2000-* \
+       | le32-* | le64-* \
+       | lm32-* \
+       | m32c-* | m32r-* | m32rle-* \
+       | m68000-* | m680[012346]0-* | m68360-* | m683?2-* | m68k-* \
+       | m88110-* | m88k-* | maxq-* | mcore-* | metag-* | microblaze-* \
+       | mips-* | mipsbe-* | mipseb-* | mipsel-* | mipsle-* \
+       | mips16-* \
+       | mips64-* | mips64el-* \
+       | mips64octeon-* | mips64octeonel-* \
+       | mips64orion-* | mips64orionel-* \
+       | mips64r5900-* | mips64r5900el-* \
+       | mips64vr-* | mips64vrel-* \
+       | mips64vr4100-* | mips64vr4100el-* \
+       | mips64vr4300-* | mips64vr4300el-* \
+       | mips64vr5000-* | mips64vr5000el-* \
+       | mips64vr5900-* | mips64vr5900el-* \
+       | mipsisa32-* | mipsisa32el-* \
+       | mipsisa32r2-* | mipsisa32r2el-* \
+       | mipsisa64-* | mipsisa64el-* \
+       | mipsisa64r2-* | mipsisa64r2el-* \
+       | mipsisa64sb1-* | mipsisa64sb1el-* \
+       | mipsisa64sr71k-* | mipsisa64sr71kel-* \
+       | mipstx39-* | mipstx39el-* \
+       | mmix-* \
+       | mt-* \
+       | msp430-* \
+       | nds32-* | nds32le-* | nds32be-* \
+       | nios-* | nios2-* \
+       | none-* | np1-* | ns16k-* | ns32k-* \
+       | open8-* \
+       | orion-* \
+       | pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \
+       | powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* \
+       | pyramid-* \
+       | rl78-* | romp-* | rs6000-* | rx-* \
+       | sh-* | sh[1234]-* | sh[24]a-* | sh[24]aeb-* | sh[23]e-* | sh[34]eb-* | sheb-* | shbe-* \
+       | shle-* | sh[1234]le-* | sh3ele-* | sh64-* | sh64le-* \
+       | sparc-* | sparc64-* | sparc64b-* | sparc64v-* | sparc86x-* | sparclet-* \
+       | sparclite-* \
+       | sparcv8-* | sparcv9-* | sparcv9b-* | sparcv9v-* | sv1-* | sx?-* \
+       | tahoe-* \
+       | tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* \
+       | tile*-* \
+       | tron-* \
+       | ubicom32-* \
+       | v850-* | v850e-* | v850e1-* | v850es-* | v850e2-* | v850e2v3-* \
+       | vax-* \
+       | we32k-* \
+       | x86-* | x86_64-* | xc16x-* | xps100-* \
+       | xstormy16-* | xtensa*-* \
+       | ymp-* \
+       | z8k-* | z80-*)
+               ;;
+       # Recognize the basic CPU types without company name, with glob match.
+       xtensa*)
+               basic_machine=$basic_machine-unknown
+               ;;
+       # Recognize the various machine names and aliases which stand
+       # for a CPU type and a company and sometimes even an OS.
+       386bsd)
+               basic_machine=i386-unknown
+               os=-bsd
+               ;;
+       3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc)
+               basic_machine=m68000-att
+               ;;
+       3b*)
+               basic_machine=we32k-att
+               ;;
+       a29khif)
+               basic_machine=a29k-amd
+               os=-udi
+               ;;
+       abacus)
+               basic_machine=abacus-unknown
+               ;;
+       adobe68k)
+               basic_machine=m68010-adobe
+               os=-scout
+               ;;
+       alliant | fx80)
+               basic_machine=fx80-alliant
+               ;;
+       altos | altos3068)
+               basic_machine=m68k-altos
+               ;;
+       am29k)
+               basic_machine=a29k-none
+               os=-bsd
+               ;;
+       amd64)
+               basic_machine=x86_64-pc
+               ;;
+       amd64-*)
+               basic_machine=x86_64-`echo $basic_machine | sed 's/^[^-]*-//'`
+               ;;
+       amdahl)
+               basic_machine=580-amdahl
+               os=-sysv
+               ;;
+       amiga | amiga-*)
+               basic_machine=m68k-unknown
+               ;;
+       amigaos | amigados)
+               basic_machine=m68k-unknown
+               os=-amigaos
+               ;;
+       amigaunix | amix)
+               basic_machine=m68k-unknown
+               os=-sysv4
+               ;;
+       apollo68)
+               basic_machine=m68k-apollo
+               os=-sysv
+               ;;
+       apollo68bsd)
+               basic_machine=m68k-apollo
+               os=-bsd
+               ;;
+       aros)
+               basic_machine=i386-pc
+               os=-aros
+               ;;
+       aux)
+               basic_machine=m68k-apple
+               os=-aux
+               ;;
+       balance)
+               basic_machine=ns32k-sequent
+               os=-dynix
+               ;;
+       blackfin)
+               basic_machine=bfin-unknown
+               os=-linux
+               ;;
+       blackfin-*)
+               basic_machine=bfin-`echo $basic_machine | sed 's/^[^-]*-//'`
+               os=-linux
+               ;;
+       bluegene*)
+               basic_machine=powerpc-ibm
+               os=-cnk
+               ;;
+       c54x-*)
+               basic_machine=tic54x-`echo $basic_machine | sed 's/^[^-]*-//'`
+               ;;
+       c55x-*)
+               basic_machine=tic55x-`echo $basic_machine | sed 's/^[^-]*-//'`
+               ;;
+       c6x-*)
+               basic_machine=tic6x-`echo $basic_machine | sed 's/^[^-]*-//'`
+               ;;
+       c90)
+               basic_machine=c90-cray
+               os=-unicos
+               ;;
+       cegcc)
+               basic_machine=arm-unknown
+               os=-cegcc
+               ;;
+       convex-c1)
+               basic_machine=c1-convex
+               os=-bsd
+               ;;
+       convex-c2)
+               basic_machine=c2-convex
+               os=-bsd
+               ;;
+       convex-c32)
+               basic_machine=c32-convex
+               os=-bsd
+               ;;
+       convex-c34)
+               basic_machine=c34-convex
+               os=-bsd
+               ;;
+       convex-c38)
+               basic_machine=c38-convex
+               os=-bsd
+               ;;
+       cray | j90)
+               basic_machine=j90-cray
+               os=-unicos
+               ;;
+       craynv)
+               basic_machine=craynv-cray
+               os=-unicosmp
+               ;;
+       cr16 | cr16-*)
+               basic_machine=cr16-unknown
+               os=-elf
+               ;;
+       crds | unos)
+               basic_machine=m68k-crds
+               ;;
+       crisv32 | crisv32-* | etraxfs*)
+               basic_machine=crisv32-axis
+               ;;
+       cris | cris-* | etrax*)
+               basic_machine=cris-axis
+               ;;
+       crx)
+               basic_machine=crx-unknown
+               os=-elf
+               ;;
+       da30 | da30-*)
+               basic_machine=m68k-da30
+               ;;
+       decstation | decstation-3100 | pmax | pmax-* | pmin | dec3100 | decstatn)
+               basic_machine=mips-dec
+               ;;
+       decsystem10* | dec10*)
+               basic_machine=pdp10-dec
+               os=-tops10
+               ;;
+       decsystem20* | dec20*)
+               basic_machine=pdp10-dec
+               os=-tops20
+               ;;
+       delta | 3300 | motorola-3300 | motorola-delta \
+             | 3300-motorola | delta-motorola)
+               basic_machine=m68k-motorola
+               ;;
+       delta88)
+               basic_machine=m88k-motorola
+               os=-sysv3
+               ;;
+       dicos)
+               basic_machine=i686-pc
+               os=-dicos
+               ;;
+       djgpp)
+               basic_machine=i586-pc
+               os=-msdosdjgpp
+               ;;
+       dpx20 | dpx20-*)
+               basic_machine=rs6000-bull
+               os=-bosx
+               ;;
+       dpx2* | dpx2*-bull)
+               basic_machine=m68k-bull
+               os=-sysv3
+               ;;
+       ebmon29k)
+               basic_machine=a29k-amd
+               os=-ebmon
+               ;;
+       elxsi)
+               basic_machine=elxsi-elxsi
+               os=-bsd
+               ;;
+       encore | umax | mmax)
+               basic_machine=ns32k-encore
+               ;;
+       es1800 | OSE68k | ose68k | ose | OSE)
+               basic_machine=m68k-ericsson
+               os=-ose
+               ;;
+       fx2800)
+               basic_machine=i860-alliant
+               ;;
+       genix)
+               basic_machine=ns32k-ns
+               ;;
+       gmicro)
+               basic_machine=tron-gmicro
+               os=-sysv
+               ;;
+       go32)
+               basic_machine=i386-pc
+               os=-go32
+               ;;
+       h3050r* | hiux*)
+               basic_machine=hppa1.1-hitachi
+               os=-hiuxwe2
+               ;;
+       h8300hms)
+               basic_machine=h8300-hitachi
+               os=-hms
+               ;;
+       h8300xray)
+               basic_machine=h8300-hitachi
+               os=-xray
+               ;;
+       h8500hms)
+               basic_machine=h8500-hitachi
+               os=-hms
+               ;;
+       harris)
+               basic_machine=m88k-harris
+               os=-sysv3
+               ;;
+       hp300-*)
+               basic_machine=m68k-hp
+               ;;
+       hp300bsd)
+               basic_machine=m68k-hp
+               os=-bsd
+               ;;
+       hp300hpux)
+               basic_machine=m68k-hp
+               os=-hpux
+               ;;
+       hp3k9[0-9][0-9] | hp9[0-9][0-9])
+               basic_machine=hppa1.0-hp
+               ;;
+       hp9k2[0-9][0-9] | hp9k31[0-9])
+               basic_machine=m68000-hp
+               ;;
+       hp9k3[2-9][0-9])
+               basic_machine=m68k-hp
+               ;;
+       hp9k6[0-9][0-9] | hp6[0-9][0-9])
+               basic_machine=hppa1.0-hp
+               ;;
+       hp9k7[0-79][0-9] | hp7[0-79][0-9])
+               basic_machine=hppa1.1-hp
+               ;;
+       hp9k78[0-9] | hp78[0-9])
+               # FIXME: really hppa2.0-hp
+               basic_machine=hppa1.1-hp
+               ;;
+       hp9k8[67]1 | hp8[67]1 | hp9k80[24] | hp80[24] | hp9k8[78]9 | hp8[78]9 | hp9k893 | hp893)
+               # FIXME: really hppa2.0-hp
+               basic_machine=hppa1.1-hp
+               ;;
+       hp9k8[0-9][13679] | hp8[0-9][13679])
+               basic_machine=hppa1.1-hp
+               ;;
+       hp9k8[0-9][0-9] | hp8[0-9][0-9])
+               basic_machine=hppa1.0-hp
+               ;;
+       hppa-next)
+               os=-nextstep3
+               ;;
+       hppaosf)
+               basic_machine=hppa1.1-hp
+               os=-osf
+               ;;
+       hppro)
+               basic_machine=hppa1.1-hp
+               os=-proelf
+               ;;
+       i370-ibm* | ibm*)
+               basic_machine=i370-ibm
+               ;;
+       i*86v32)
+               basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
+               os=-sysv32
+               ;;
+       i*86v4*)
+               basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
+               os=-sysv4
+               ;;
+       i*86v)
+               basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
+               os=-sysv
+               ;;
+       i*86sol2)
+               basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
+               os=-solaris2
+               ;;
+       i386mach)
+               basic_machine=i386-mach
+               os=-mach
+               ;;
+       i386-vsta | vsta)
+               basic_machine=i386-unknown
+               os=-vsta
+               ;;
+       iris | iris4d)
+               basic_machine=mips-sgi
+               case $os in
+                   -irix*)
+                       ;;
+                   *)
+                       os=-irix4
+                       ;;
+               esac
+               ;;
+       isi68 | isi)
+               basic_machine=m68k-isi
+               os=-sysv
+               ;;
+       m68knommu)
+               basic_machine=m68k-unknown
+               os=-linux
+               ;;
+       m68knommu-*)
+               basic_machine=m68k-`echo $basic_machine | sed 's/^[^-]*-//'`
+               os=-linux
+               ;;
+       m88k-omron*)
+               basic_machine=m88k-omron
+               ;;
+       magnum | m3230)
+               basic_machine=mips-mips
+               os=-sysv
+               ;;
+       merlin)
+               basic_machine=ns32k-utek
+               os=-sysv
+               ;;
+       microblaze)
+               basic_machine=microblaze-xilinx
+               ;;
+       mingw32)
+               basic_machine=i386-pc
+               os=-mingw32
+               ;;
+       mingw32ce)
+               basic_machine=arm-unknown
+               os=-mingw32ce
+               ;;
+       miniframe)
+               basic_machine=m68000-convergent
+               ;;
+       *mint | -mint[0-9]* | *MiNT | *MiNT[0-9]*)
+               basic_machine=m68k-atari
+               os=-mint
+               ;;
+       mips3*-*)
+               basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`
+               ;;
+       mips3*)
+               basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`-unknown
+               ;;
+       monitor)
+               basic_machine=m68k-rom68k
+               os=-coff
+               ;;
+       morphos)
+               basic_machine=powerpc-unknown
+               os=-morphos
+               ;;
+       msdos)
+               basic_machine=i386-pc
+               os=-msdos
+               ;;
+       ms1-*)
+               basic_machine=`echo $basic_machine | sed -e 's/ms1-/mt-/'`
+               ;;
+       msys)
+               basic_machine=i386-pc
+               os=-msys
+               ;;
+       mvs)
+               basic_machine=i370-ibm
+               os=-mvs
+               ;;
+       nacl)
+               basic_machine=le32-unknown
+               os=-nacl
+               ;;
+       ncr3000)
+               basic_machine=i486-ncr
+               os=-sysv4
+               ;;
+       netbsd386)
+               basic_machine=i386-unknown
+               os=-netbsd
+               ;;
+       netwinder)
+               basic_machine=armv4l-rebel
+               os=-linux
+               ;;
+       news | news700 | news800 | news900)
+               basic_machine=m68k-sony
+               os=-newsos
+               ;;
+       news1000)
+               basic_machine=m68030-sony
+               os=-newsos
+               ;;
+       news-3600 | risc-news)
+               basic_machine=mips-sony
+               os=-newsos
+               ;;
+       necv70)
+               basic_machine=v70-nec
+               os=-sysv
+               ;;
+       next | m*-next )
+               basic_machine=m68k-next
+               case $os in
+                   -nextstep* )
+                       ;;
+                   -ns2*)
+                     os=-nextstep2
+                       ;;
+                   *)
+                     os=-nextstep3
+                       ;;
+               esac
+               ;;
+       nh3000)
+               basic_machine=m68k-harris
+               os=-cxux
+               ;;
+       nh[45]000)
+               basic_machine=m88k-harris
+               os=-cxux
+               ;;
+       nindy960)
+               basic_machine=i960-intel
+               os=-nindy
+               ;;
+       mon960)
+               basic_machine=i960-intel
+               os=-mon960
+               ;;
+       nonstopux)
+               basic_machine=mips-compaq
+               os=-nonstopux
+               ;;
+       np1)
+               basic_machine=np1-gould
+               ;;
+       neo-tandem)
+               basic_machine=neo-tandem
+               ;;
+       nse-tandem)
+               basic_machine=nse-tandem
+               ;;
+       nsr-tandem)
+               basic_machine=nsr-tandem
+               ;;
+       op50n-* | op60c-*)
+               basic_machine=hppa1.1-oki
+               os=-proelf
+               ;;
+       openrisc | openrisc-*)
+               basic_machine=or32-unknown
+               ;;
+       os400)
+               basic_machine=powerpc-ibm
+               os=-os400
+               ;;
+       OSE68000 | ose68000)
+               basic_machine=m68000-ericsson
+               os=-ose
+               ;;
+       os68k)
+               basic_machine=m68k-none
+               os=-os68k
+               ;;
+       pa-hitachi)
+               basic_machine=hppa1.1-hitachi
+               os=-hiuxwe2
+               ;;
+       paragon)
+               basic_machine=i860-intel
+               os=-osf
+               ;;
+       parisc)
+               basic_machine=hppa-unknown
+               os=-linux
+               ;;
+       parisc-*)
+               basic_machine=hppa-`echo $basic_machine | sed 's/^[^-]*-//'`
+               os=-linux
+               ;;
+       pbd)
+               basic_machine=sparc-tti
+               ;;
+       pbb)
+               basic_machine=m68k-tti
+               ;;
+       pc532 | pc532-*)
+               basic_machine=ns32k-pc532
+               ;;
+       pc98)
+               basic_machine=i386-pc
+               ;;
+       pc98-*)
+               basic_machine=i386-`echo $basic_machine | sed 's/^[^-]*-//'`
+               ;;
+       pentium | p5 | k5 | k6 | nexgen | viac3)
+               basic_machine=i586-pc
+               ;;
+       pentiumpro | p6 | 6x86 | athlon | athlon_*)
+               basic_machine=i686-pc
+               ;;
+       pentiumii | pentium2 | pentiumiii | pentium3)
+               basic_machine=i686-pc
+               ;;
+       pentium4)
+               basic_machine=i786-pc
+               ;;
+       pentium-* | p5-* | k5-* | k6-* | nexgen-* | viac3-*)
+               basic_machine=i586-`echo $basic_machine | sed 's/^[^-]*-//'`
+               ;;
+       pentiumpro-* | p6-* | 6x86-* | athlon-*)
+               basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'`
+               ;;
+       pentiumii-* | pentium2-* | pentiumiii-* | pentium3-*)
+               basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'`
+               ;;
+       pentium4-*)
+               basic_machine=i786-`echo $basic_machine | sed 's/^[^-]*-//'`
+               ;;
+       pn)
+               basic_machine=pn-gould
+               ;;
+       power)  basic_machine=power-ibm
+               ;;
+       ppc | ppcbe)    basic_machine=powerpc-unknown
+               ;;
+       ppc-* | ppcbe-*)
+               basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'`
+               ;;
+       ppcle | powerpclittle | ppc-le | powerpc-little)
+               basic_machine=powerpcle-unknown
+               ;;
+       ppcle-* | powerpclittle-*)
+               basic_machine=powerpcle-`echo $basic_machine | sed 's/^[^-]*-//'`
+               ;;
+       ppc64)  basic_machine=powerpc64-unknown
+               ;;
+       ppc64-*) basic_machine=powerpc64-`echo $basic_machine | sed 's/^[^-]*-//'`
+               ;;
+       ppc64le | powerpc64little | ppc64-le | powerpc64-little)
+               basic_machine=powerpc64le-unknown
+               ;;
+       ppc64le-* | powerpc64little-*)
+               basic_machine=powerpc64le-`echo $basic_machine | sed 's/^[^-]*-//'`
+               ;;
+       ps2)
+               basic_machine=i386-ibm
+               ;;
+       pw32)
+               basic_machine=i586-unknown
+               os=-pw32
+               ;;
+       rdos)
+               basic_machine=i386-pc
+               os=-rdos
+               ;;
+       rom68k)
+               basic_machine=m68k-rom68k
+               os=-coff
+               ;;
+       rm[46]00)
+               basic_machine=mips-siemens
+               ;;
+       rtpc | rtpc-*)
+               basic_machine=romp-ibm
+               ;;
+       s390 | s390-*)
+               basic_machine=s390-ibm
+               ;;
+       s390x | s390x-*)
+               basic_machine=s390x-ibm
+               ;;
+       sa29200)
+               basic_machine=a29k-amd
+               os=-udi
+               ;;
+       sb1)
+               basic_machine=mipsisa64sb1-unknown
+               ;;
+       sb1el)
+               basic_machine=mipsisa64sb1el-unknown
+               ;;
+       sde)
+               basic_machine=mipsisa32-sde
+               os=-elf
+               ;;
+       sei)
+               basic_machine=mips-sei
+               os=-seiux
+               ;;
+       sequent)
+               basic_machine=i386-sequent
+               ;;
+       sh)
+               basic_machine=sh-hitachi
+               os=-hms
+               ;;
+       sh5el)
+               basic_machine=sh5le-unknown
+               ;;
+       sh64)
+               basic_machine=sh64-unknown
+               ;;
+       sparclite-wrs | simso-wrs)
+               basic_machine=sparclite-wrs
+               os=-vxworks
+               ;;
+       sps7)
+               basic_machine=m68k-bull
+               os=-sysv2
+               ;;
+       spur)
+               basic_machine=spur-unknown
+               ;;
+       st2000)
+               basic_machine=m68k-tandem
+               ;;
+       stratus)
+               basic_machine=i860-stratus
+               os=-sysv4
+               ;;
+       strongarm-* | thumb-*)
+               basic_machine=arm-`echo $basic_machine | sed 's/^[^-]*-//'`
+               ;;
+       sun2)
+               basic_machine=m68000-sun
+               ;;
+       sun2os3)
+               basic_machine=m68000-sun
+               os=-sunos3
+               ;;
+       sun2os4)
+               basic_machine=m68000-sun
+               os=-sunos4
+               ;;
+       sun3os3)
+               basic_machine=m68k-sun
+               os=-sunos3
+               ;;
+       sun3os4)
+               basic_machine=m68k-sun
+               os=-sunos4
+               ;;
+       sun4os3)
+               basic_machine=sparc-sun
+               os=-sunos3
+               ;;
+       sun4os4)
+               basic_machine=sparc-sun
+               os=-sunos4
+               ;;
+       sun4sol2)
+               basic_machine=sparc-sun
+               os=-solaris2
+               ;;
+       sun3 | sun3-*)
+               basic_machine=m68k-sun
+               ;;
+       sun4)
+               basic_machine=sparc-sun
+               ;;
+       sun386 | sun386i | roadrunner)
+               basic_machine=i386-sun
+               ;;
+       sv1)
+               basic_machine=sv1-cray
+               os=-unicos
+               ;;
+       symmetry)
+               basic_machine=i386-sequent
+               os=-dynix
+               ;;
+       t3e)
+               basic_machine=alphaev5-cray
+               os=-unicos
+               ;;
+       t90)
+               basic_machine=t90-cray
+               os=-unicos
+               ;;
+       tile*)
+               basic_machine=$basic_machine-unknown
+               os=-linux-gnu
+               ;;
+       tx39)
+               basic_machine=mipstx39-unknown
+               ;;
+       tx39el)
+               basic_machine=mipstx39el-unknown
+               ;;
+       toad1)
+               basic_machine=pdp10-xkl
+               os=-tops20
+               ;;
+       tower | tower-32)
+               basic_machine=m68k-ncr
+               ;;
+       tpf)
+               basic_machine=s390x-ibm
+               os=-tpf
+               ;;
+       udi29k)
+               basic_machine=a29k-amd
+               os=-udi
+               ;;
+       ultra3)
+               basic_machine=a29k-nyu
+               os=-sym1
+               ;;
+       v810 | necv810)
+               basic_machine=v810-nec
+               os=-none
+               ;;
+       vaxv)
+               basic_machine=vax-dec
+               os=-sysv
+               ;;
+       vms)
+               basic_machine=vax-dec
+               os=-vms
+               ;;
+       vpp*|vx|vx-*)
+               basic_machine=f301-fujitsu
+               ;;
+       vxworks960)
+               basic_machine=i960-wrs
+               os=-vxworks
+               ;;
+       vxworks68)
+               basic_machine=m68k-wrs
+               os=-vxworks
+               ;;
+       vxworks29k)
+               basic_machine=a29k-wrs
+               os=-vxworks
+               ;;
+       w65*)
+               basic_machine=w65-wdc
+               os=-none
+               ;;
+       w89k-*)
+               basic_machine=hppa1.1-winbond
+               os=-proelf
+               ;;
+       xbox)
+               basic_machine=i686-pc
+               os=-mingw32
+               ;;
+       xps | xps100)
+               basic_machine=xps100-honeywell
+               ;;
+       xscale-* | xscalee[bl]-*)
+               basic_machine=`echo $basic_machine | sed 's/^xscale/arm/'`
+               ;;
+       ymp)
+               basic_machine=ymp-cray
+               os=-unicos
+               ;;
+       z8k-*-coff)
+               basic_machine=z8k-unknown
+               os=-sim
+               ;;
+       z80-*-coff)
+               basic_machine=z80-unknown
+               os=-sim
+               ;;
+       none)
+               basic_machine=none-none
+               os=-none
+               ;;
+
+# Here we handle the default manufacturer of certain CPU types.  It is in
+# some cases the only manufacturer, in others, it is the most popular.
+       w89k)
+               basic_machine=hppa1.1-winbond
+               ;;
+       op50n)
+               basic_machine=hppa1.1-oki
+               ;;
+       op60c)
+               basic_machine=hppa1.1-oki
+               ;;
+       romp)
+               basic_machine=romp-ibm
+               ;;
+       mmix)
+               basic_machine=mmix-knuth
+               ;;
+       rs6000)
+               basic_machine=rs6000-ibm
+               ;;
+       vax)
+               basic_machine=vax-dec
+               ;;
+       pdp10)
+               # there are many clones, so DEC is not a safe bet
+               basic_machine=pdp10-unknown
+               ;;
+       pdp11)
+               basic_machine=pdp11-dec
+               ;;
+       we32k)
+               basic_machine=we32k-att
+               ;;
+       sh[1234] | sh[24]a | sh[24]aeb | sh[34]eb | sh[1234]le | sh[23]ele)
+               basic_machine=sh-unknown
+               ;;
+       sparc | sparcv8 | sparcv9 | sparcv9b | sparcv9v)
+               basic_machine=sparc-sun
+               ;;
+       cydra)
+               basic_machine=cydra-cydrome
+               ;;
+       orion)
+               basic_machine=orion-highlevel
+               ;;
+       orion105)
+               basic_machine=clipper-highlevel
+               ;;
+       mac | mpw | mac-mpw)
+               basic_machine=m68k-apple
+               ;;
+       pmac | pmac-mpw)
+               basic_machine=powerpc-apple
+               ;;
+       *-unknown)
+               # Make sure to match an already-canonicalized machine name.
+               ;;
+       *)
+               echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2
+               exit 1
+               ;;
+esac
+
+# Here we canonicalize certain aliases for manufacturers.
+case $basic_machine in
+       *-digital*)
+               basic_machine=`echo $basic_machine | sed 's/digital.*/dec/'`
+               ;;
+       *-commodore*)
+               basic_machine=`echo $basic_machine | sed 's/commodore.*/cbm/'`
+               ;;
+       *)
+               ;;
+esac
+
+# Decode manufacturer-specific aliases for certain operating systems.
+
+if [ x"$os" != x"" ]
+then
+case $os in
+       # First match some system type aliases
+       # that might get confused with valid system types.
+       # -solaris* is a basic system type, with this one exception.
+       -auroraux)
+               os=-auroraux
+               ;;
+       -solaris1 | -solaris1.*)
+               os=`echo $os | sed -e 's|solaris1|sunos4|'`
+               ;;
+       -solaris)
+               os=-solaris2
+               ;;
+       -svr4*)
+               os=-sysv4
+               ;;
+       -unixware*)
+               os=-sysv4.2uw
+               ;;
+       -gnu/linux*)
+               os=`echo $os | sed -e 's|gnu/linux|linux-gnu|'`
+               ;;
+       # First accept the basic system types.
+       # The portable systems comes first.
+       # Each alternative MUST END IN A *, to match a version number.
+       # -sysv* is not here because it comes later, after sysvr4.
+       -gnu* | -bsd* | -mach* | -minix* | -genix* | -ultrix* | -irix* \
+             | -*vms* | -sco* | -esix* | -isc* | -aix* | -cnk* | -sunos | -sunos[34]*\
+             | -hpux* | -unos* | -osf* | -luna* | -dgux* | -auroraux* | -solaris* \
+             | -sym* | -kopensolaris* \
+             | -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \
+             | -aos* | -aros* \
+             | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \
+             | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \
+             | -hiux* | -386bsd* | -knetbsd* | -mirbsd* | -netbsd* \
+             | -openbsd* | -solidbsd* \
+             | -ekkobsd* | -kfreebsd* | -freebsd* | -riscix* | -lynxos* \
+             | -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \
+             | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \
+             | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \
+             | -chorusos* | -chorusrdb* | -cegcc* \
+             | -cygwin* | -msys* | -pe* | -psos* | -moss* | -proelf* | -rtems* \
+             | -mingw32* | -linux-gnu* | -linux-android* \
+             | -linux-newlib* | -linux-uclibc* \
+             | -uxpv* | -beos* | -mpeix* | -udk* \
+             | -interix* | -uwin* | -mks* | -rhapsody* | -darwin* | -opened* \
+             | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \
+             | -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* \
+             | -os2* | -vos* | -palmos* | -uclinux* | -nucleus* \
+             | -morphos* | -superux* | -rtmk* | -rtmk-nova* | -windiss* \
+             | -powermax* | -dnix* | -nx6 | -nx7 | -sei* | -dragonfly* \
+             | -skyos* | -haiku* | -rdos* | -toppers* | -drops* | -es*)
+       # Remember, each alternative MUST END IN *, to match a version number.
+               ;;
+       -qnx*)
+               case $basic_machine in
+                   x86-* | i*86-*)
+                       ;;
+                   *)
+                       os=-nto$os
+                       ;;
+               esac
+               ;;
+       -nto-qnx*)
+               ;;
+       -nto*)
+               os=`echo $os | sed -e 's|nto|nto-qnx|'`
+               ;;
+       -sim | -es1800* | -hms* | -xray | -os68k* | -none* | -v88r* \
+             | -windows* | -osx | -abug | -netware* | -os9* | -beos* | -haiku* \
+             | -macos* | -mpw* | -magic* | -mmixware* | -mon960* | -lnews*)
+               ;;
+       -mac*)
+               os=`echo $os | sed -e 's|mac|macos|'`
+               ;;
+       -linux-dietlibc)
+               os=-linux-dietlibc
+               ;;
+       -linux*)
+               os=`echo $os | sed -e 's|linux|linux-gnu|'`
+               ;;
+       -sunos5*)
+               os=`echo $os | sed -e 's|sunos5|solaris2|'`
+               ;;
+       -sunos6*)
+               os=`echo $os | sed -e 's|sunos6|solaris3|'`
+               ;;
+       -opened*)
+               os=-openedition
+               ;;
+       -os400*)
+               os=-os400
+               ;;
+       -wince*)
+               os=-wince
+               ;;
+       -osfrose*)
+               os=-osfrose
+               ;;
+       -osf*)
+               os=-osf
+               ;;
+       -utek*)
+               os=-bsd
+               ;;
+       -dynix*)
+               os=-bsd
+               ;;
+       -acis*)
+               os=-aos
+               ;;
+       -atheos*)
+               os=-atheos
+               ;;
+       -syllable*)
+               os=-syllable
+               ;;
+       -386bsd)
+               os=-bsd
+               ;;
+       -ctix* | -uts*)
+               os=-sysv
+               ;;
+       -nova*)
+               os=-rtmk-nova
+               ;;
+       -ns2 )
+               os=-nextstep2
+               ;;
+       -nsk*)
+               os=-nsk
+               ;;
+       # Preserve the version number of sinix5.
+       -sinix5.*)
+               os=`echo $os | sed -e 's|sinix|sysv|'`
+               ;;
+       -sinix*)
+               os=-sysv4
+               ;;
+       -tpf*)
+               os=-tpf
+               ;;
+       -triton*)
+               os=-sysv3
+               ;;
+       -oss*)
+               os=-sysv3
+               ;;
+       -svr4)
+               os=-sysv4
+               ;;
+       -svr3)
+               os=-sysv3
+               ;;
+       -sysvr4)
+               os=-sysv4
+               ;;
+       # This must come after -sysvr4.
+       -sysv*)
+               ;;
+       -ose*)
+               os=-ose
+               ;;
+       -es1800*)
+               os=-ose
+               ;;
+       -xenix)
+               os=-xenix
+               ;;
+       -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*)
+               os=-mint
+               ;;
+       -aros*)
+               os=-aros
+               ;;
+       -kaos*)
+               os=-kaos
+               ;;
+       -zvmoe)
+               os=-zvmoe
+               ;;
+       -dicos*)
+               os=-dicos
+               ;;
+       -nacl*)
+               ;;
+       -none)
+               ;;
+       *)
+               # Get rid of the `-' at the beginning of $os.
+               os=`echo $os | sed 's/[^-]*-//'`
+               echo Invalid configuration \`$1\': system \`$os\' not recognized 1>&2
+               exit 1
+               ;;
+esac
+else
+
+# Here we handle the default operating systems that come with various machines.
+# The value should be what the vendor currently ships out the door with their
+# machine or put another way, the most popular os provided with the machine.
+
+# Note that if you're going to try to match "-MANUFACTURER" here (say,
+# "-sun"), then you have to tell the case statement up towards the top
+# that MANUFACTURER isn't an operating system.  Otherwise, code above
+# will signal an error saying that MANUFACTURER isn't an operating
+# system, and we'll never get to this point.
+
+case $basic_machine in
+       score-*)
+               os=-elf
+               ;;
+       spu-*)
+               os=-elf
+               ;;
+       *-acorn)
+               os=-riscix1.2
+               ;;
+       arm*-rebel)
+               os=-linux
+               ;;
+       arm*-semi)
+               os=-aout
+               ;;
+       c4x-* | tic4x-*)
+               os=-coff
+               ;;
+       hexagon-*)
+               os=-elf
+               ;;
+       tic54x-*)
+               os=-coff
+               ;;
+       tic55x-*)
+               os=-coff
+               ;;
+       tic6x-*)
+               os=-coff
+               ;;
+       # This must come before the *-dec entry.
+       pdp10-*)
+               os=-tops20
+               ;;
+       pdp11-*)
+               os=-none
+               ;;
+       *-dec | vax-*)
+               os=-ultrix4.2
+               ;;
+       m68*-apollo)
+               os=-domain
+               ;;
+       i386-sun)
+               os=-sunos4.0.2
+               ;;
+       m68000-sun)
+               os=-sunos3
+               ;;
+       m68*-cisco)
+               os=-aout
+               ;;
+       mep-*)
+               os=-elf
+               ;;
+       mips*-cisco)
+               os=-elf
+               ;;
+       mips*-*)
+               os=-elf
+               ;;
+       or32-*)
+               os=-coff
+               ;;
+       *-tti)  # must be before sparc entry or we get the wrong os.
+               os=-sysv3
+               ;;
+       sparc-* | *-sun)
+               os=-sunos4.1.1
+               ;;
+       *-be)
+               os=-beos
+               ;;
+       *-haiku)
+               os=-haiku
+               ;;
+       *-ibm)
+               os=-aix
+               ;;
+       *-knuth)
+               os=-mmixware
+               ;;
+       *-wec)
+               os=-proelf
+               ;;
+       *-winbond)
+               os=-proelf
+               ;;
+       *-oki)
+               os=-proelf
+               ;;
+       *-hp)
+               os=-hpux
+               ;;
+       *-hitachi)
+               os=-hiux
+               ;;
+       i860-* | *-att | *-ncr | *-altos | *-motorola | *-convergent)
+               os=-sysv
+               ;;
+       *-cbm)
+               os=-amigaos
+               ;;
+       *-dg)
+               os=-dgux
+               ;;
+       *-dolphin)
+               os=-sysv3
+               ;;
+       m68k-ccur)
+               os=-rtu
+               ;;
+       m88k-omron*)
+               os=-luna
+               ;;
+       *-next )
+               os=-nextstep
+               ;;
+       *-sequent)
+               os=-ptx
+               ;;
+       *-crds)
+               os=-unos
+               ;;
+       *-ns)
+               os=-genix
+               ;;
+       i370-*)
+               os=-mvs
+               ;;
+       *-next)
+               os=-nextstep3
+               ;;
+       *-gould)
+               os=-sysv
+               ;;
+       *-highlevel)
+               os=-bsd
+               ;;
+       *-encore)
+               os=-bsd
+               ;;
+       *-sgi)
+               os=-irix
+               ;;
+       *-siemens)
+               os=-sysv4
+               ;;
+       *-masscomp)
+               os=-rtu
+               ;;
+       f30[01]-fujitsu | f700-fujitsu)
+               os=-uxpv
+               ;;
+       *-rom68k)
+               os=-coff
+               ;;
+       *-*bug)
+               os=-coff
+               ;;
+       *-apple)
+               os=-macos
+               ;;
+       *-atari*)
+               os=-mint
+               ;;
+       *)
+               os=-none
+               ;;
+esac
+fi
+
+# Here we handle the case where we know the os, and the CPU type, but not the
+# manufacturer.  We pick the logical manufacturer.
+vendor=unknown
+case $basic_machine in
+       *-unknown)
+               case $os in
+                       -riscix*)
+                               vendor=acorn
+                               ;;
+                       -sunos*)
+                               vendor=sun
+                               ;;
+                       -cnk*|-aix*)
+                               vendor=ibm
+                               ;;
+                       -beos*)
+                               vendor=be
+                               ;;
+                       -hpux*)
+                               vendor=hp
+                               ;;
+                       -mpeix*)
+                               vendor=hp
+                               ;;
+                       -hiux*)
+                               vendor=hitachi
+                               ;;
+                       -unos*)
+                               vendor=crds
+                               ;;
+                       -dgux*)
+                               vendor=dg
+                               ;;
+                       -luna*)
+                               vendor=omron
+                               ;;
+                       -genix*)
+                               vendor=ns
+                               ;;
+                       -mvs* | -opened*)
+                               vendor=ibm
+                               ;;
+                       -os400*)
+                               vendor=ibm
+                               ;;
+                       -ptx*)
+                               vendor=sequent
+                               ;;
+                       -tpf*)
+                               vendor=ibm
+                               ;;
+                       -vxsim* | -vxworks* | -windiss*)
+                               vendor=wrs
+                               ;;
+                       -aux*)
+                               vendor=apple
+                               ;;
+                       -hms*)
+                               vendor=hitachi
+                               ;;
+                       -mpw* | -macos*)
+                               vendor=apple
+                               ;;
+                       -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*)
+                               vendor=atari
+                               ;;
+                       -vos*)
+                               vendor=stratus
+                               ;;
+               esac
+               basic_machine=`echo $basic_machine | sed "s/unknown/$vendor/"`
+               ;;
+esac
+
+echo $basic_machine$os
+exit
+
+# Local variables:
+# eval: (add-hook 'write-file-hooks 'time-stamp)
+# time-stamp-start: "timestamp='"
+# time-stamp-format: "%:y-%02m-%02d"
+# time-stamp-end: "'"
+# End:
diff --git a/configure b/configure
new file mode 100755 (executable)
index 0000000..3b4ea2e
--- /dev/null
+++ b/configure
@@ -0,0 +1,26805 @@
+#! /bin/sh
+# Guess values for system-dependent variables and create Makefiles.
+# Generated by GNU Autoconf 2.69 for poppler 0.20.4.
+#
+# Report bugs to <https://bugs.freedesktop.org/enter_bug.cgi?product=poppler>.
+#
+#
+# Copyright (C) 1992-1996, 1998-2012 Free Software Foundation, Inc.
+#
+#
+# This configure script is free software; the Free Software Foundation
+# gives unlimited permission to copy, distribute and modify it.
+## -------------------- ##
+## M4sh Initialization. ##
+## -------------------- ##
+
+# Be more Bourne compatible
+DUALCASE=1; export DUALCASE # for MKS sh
+if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then :
+  emulate sh
+  NULLCMD=:
+  # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which
+  # is contrary to our usage.  Disable this feature.
+  alias -g '${1+"$@"}'='"$@"'
+  setopt NO_GLOB_SUBST
+else
+  case `(set -o) 2>/dev/null` in #(
+  *posix*) :
+    set -o posix ;; #(
+  *) :
+     ;;
+esac
+fi
+
+
+as_nl='
+'
+export as_nl
+# Printing a long string crashes Solaris 7 /usr/bin/printf.
+as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'
+as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo
+as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo
+# Prefer a ksh shell builtin over an external printf program on Solaris,
+# but without wasting forks for bash or zsh.
+if test -z "$BASH_VERSION$ZSH_VERSION" \
+    && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then
+  as_echo='print -r --'
+  as_echo_n='print -rn --'
+elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then
+  as_echo='printf %s\n'
+  as_echo_n='printf %s'
+else
+  if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then
+    as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"'
+    as_echo_n='/usr/ucb/echo -n'
+  else
+    as_echo_body='eval expr "X$1" : "X\\(.*\\)"'
+    as_echo_n_body='eval
+      arg=$1;
+      case $arg in #(
+      *"$as_nl"*)
+       expr "X$arg" : "X\\(.*\\)$as_nl";
+       arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;;
+      esac;
+      expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl"
+    '
+    export as_echo_n_body
+    as_echo_n='sh -c $as_echo_n_body as_echo'
+  fi
+  export as_echo_body
+  as_echo='sh -c $as_echo_body as_echo'
+fi
+
+# The user is always right.
+if test "${PATH_SEPARATOR+set}" != set; then
+  PATH_SEPARATOR=:
+  (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && {
+    (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 ||
+      PATH_SEPARATOR=';'
+  }
+fi
+
+
+# IFS
+# We need space, tab and new line, in precisely that order.  Quoting is
+# there to prevent editors from complaining about space-tab.
+# (If _AS_PATH_WALK were called with IFS unset, it would disable word
+# splitting by setting IFS to empty value.)
+IFS=" ""       $as_nl"
+
+# Find who we are.  Look in the path if we contain no directory separator.
+as_myself=
+case $0 in #((
+  *[\\/]* ) as_myself=$0 ;;
+  *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break
+  done
+IFS=$as_save_IFS
+
+     ;;
+esac
+# We did not find ourselves, most probably we were run as `sh COMMAND'
+# in which case we are not to be found in the path.
+if test "x$as_myself" = x; then
+  as_myself=$0
+fi
+if test ! -f "$as_myself"; then
+  $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2
+  exit 1
+fi
+
+# Unset variables that we do not need and which cause bugs (e.g. in
+# pre-3.0 UWIN ksh).  But do not cause bugs in bash 2.01; the "|| exit 1"
+# suppresses any "Segmentation fault" message there.  '((' could
+# trigger a bug in pdksh 5.2.14.
+for as_var in BASH_ENV ENV MAIL MAILPATH
+do eval test x\${$as_var+set} = xset \
+  && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || :
+done
+PS1='$ '
+PS2='> '
+PS4='+ '
+
+# NLS nuisances.
+LC_ALL=C
+export LC_ALL
+LANGUAGE=C
+export LANGUAGE
+
+# CDPATH.
+(unset CDPATH) >/dev/null 2>&1 && unset CDPATH
+
+# Use a proper internal environment variable to ensure we don't fall
+  # into an infinite loop, continuously re-executing ourselves.
+  if test x"${_as_can_reexec}" != xno && test "x$CONFIG_SHELL" != x; then
+    _as_can_reexec=no; export _as_can_reexec;
+    # We cannot yet assume a decent shell, so we have to provide a
+# neutralization value for shells without unset; and this also
+# works around shells that cannot unset nonexistent variables.
+# Preserve -v and -x to the replacement shell.
+BASH_ENV=/dev/null
+ENV=/dev/null
+(unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV
+case $- in # ((((
+  *v*x* | *x*v* ) as_opts=-vx ;;
+  *v* ) as_opts=-v ;;
+  *x* ) as_opts=-x ;;
+  * ) as_opts= ;;
+esac
+exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"}
+# Admittedly, this is quite paranoid, since all the known shells bail
+# out after a failed `exec'.
+$as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2
+as_fn_exit 255
+  fi
+  # We don't want this to propagate to other subprocesses.
+          { _as_can_reexec=; unset _as_can_reexec;}
+if test "x$CONFIG_SHELL" = x; then
+  as_bourne_compatible="if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then :
+  emulate sh
+  NULLCMD=:
+  # Pre-4.2 versions of Zsh do word splitting on \${1+\"\$@\"}, which
+  # is contrary to our usage.  Disable this feature.
+  alias -g '\${1+\"\$@\"}'='\"\$@\"'
+  setopt NO_GLOB_SUBST
+else
+  case \`(set -o) 2>/dev/null\` in #(
+  *posix*) :
+    set -o posix ;; #(
+  *) :
+     ;;
+esac
+fi
+"
+  as_required="as_fn_return () { (exit \$1); }
+as_fn_success () { as_fn_return 0; }
+as_fn_failure () { as_fn_return 1; }
+as_fn_ret_success () { return 0; }
+as_fn_ret_failure () { return 1; }
+
+exitcode=0
+as_fn_success || { exitcode=1; echo as_fn_success failed.; }
+as_fn_failure && { exitcode=1; echo as_fn_failure succeeded.; }
+as_fn_ret_success || { exitcode=1; echo as_fn_ret_success failed.; }
+as_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; }
+if ( set x; as_fn_ret_success y && test x = \"\$1\" ); then :
+
+else
+  exitcode=1; echo positional parameters were not saved.
+fi
+test x\$exitcode = x0 || exit 1
+test -x / || exit 1"
+  as_suggested="  as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO
+  as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO
+  eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" &&
+  test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1
+test \$(( 1 + 1 )) = 2 || exit 1
+
+  test -n \"\${ZSH_VERSION+set}\${BASH_VERSION+set}\" || (
+    ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'
+    ECHO=\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO
+    ECHO=\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO
+    PATH=/empty FPATH=/empty; export PATH FPATH
+    test \"X\`printf %s \$ECHO\`\" = \"X\$ECHO\" \\
+      || test \"X\`print -r -- \$ECHO\`\" = \"X\$ECHO\" ) || exit 1"
+  if (eval "$as_required") 2>/dev/null; then :
+  as_have_required=yes
+else
+  as_have_required=no
+fi
+  if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null; then :
+
+else
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+as_found=false
+for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  as_found=:
+  case $as_dir in #(
+        /*)
+          for as_base in sh bash ksh sh5; do
+            # Try only shells that exist, to save several forks.
+            as_shell=$as_dir/$as_base
+            if { test -f "$as_shell" || test -f "$as_shell.exe"; } &&
+                   { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$as_shell"; } 2>/dev/null; then :
+  CONFIG_SHELL=$as_shell as_have_required=yes
+                  if { $as_echo "$as_bourne_compatible""$as_suggested" | as_run=a "$as_shell"; } 2>/dev/null; then :
+  break 2
+fi
+fi
+          done;;
+       esac
+  as_found=false
+done
+$as_found || { if { test -f "$SHELL" || test -f "$SHELL.exe"; } &&
+             { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$SHELL"; } 2>/dev/null; then :
+  CONFIG_SHELL=$SHELL as_have_required=yes
+fi; }
+IFS=$as_save_IFS
+
+
+      if test "x$CONFIG_SHELL" != x; then :
+  export CONFIG_SHELL
+             # We cannot yet assume a decent shell, so we have to provide a
+# neutralization value for shells without unset; and this also
+# works around shells that cannot unset nonexistent variables.
+# Preserve -v and -x to the replacement shell.
+BASH_ENV=/dev/null
+ENV=/dev/null
+(unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV
+case $- in # ((((
+  *v*x* | *x*v* ) as_opts=-vx ;;
+  *v* ) as_opts=-v ;;
+  *x* ) as_opts=-x ;;
+  * ) as_opts= ;;
+esac
+exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"}
+# Admittedly, this is quite paranoid, since all the known shells bail
+# out after a failed `exec'.
+$as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2
+exit 255
+fi
+
+    if test x$as_have_required = xno; then :
+  $as_echo "$0: This script requires a shell more modern than all"
+  $as_echo "$0: the shells that I found on your system."
+  if test x${ZSH_VERSION+set} = xset ; then
+    $as_echo "$0: In particular, zsh $ZSH_VERSION has bugs and should"
+    $as_echo "$0: be upgraded to zsh 4.3.4 or later."
+  else
+    $as_echo "$0: Please tell bug-autoconf@gnu.org and
+$0: https://bugs.freedesktop.org/enter_bug.cgi?product=poppler
+$0: about your system, including any error possibly output
+$0: before this message. Then install a modern shell, or
+$0: manually run the script under such a shell if you do
+$0: have one."
+  fi
+  exit 1
+fi
+fi
+fi
+SHELL=${CONFIG_SHELL-/bin/sh}
+export SHELL
+# Unset more variables known to interfere with behavior of common tools.
+CLICOLOR_FORCE= GREP_OPTIONS=
+unset CLICOLOR_FORCE GREP_OPTIONS
+
+## --------------------- ##
+## M4sh Shell Functions. ##
+## --------------------- ##
+# as_fn_unset VAR
+# ---------------
+# Portably unset VAR.
+as_fn_unset ()
+{
+  { eval $1=; unset $1;}
+}
+as_unset=as_fn_unset
+
+# as_fn_set_status STATUS
+# -----------------------
+# Set $? to STATUS, without forking.
+as_fn_set_status ()
+{
+  return $1
+} # as_fn_set_status
+
+# as_fn_exit STATUS
+# -----------------
+# Exit the shell with STATUS, even in a "trap 0" or "set -e" context.
+as_fn_exit ()
+{
+  set +e
+  as_fn_set_status $1
+  exit $1
+} # as_fn_exit
+
+# as_fn_mkdir_p
+# -------------
+# Create "$as_dir" as a directory, including parents if necessary.
+as_fn_mkdir_p ()
+{
+
+  case $as_dir in #(
+  -*) as_dir=./$as_dir;;
+  esac
+  test -d "$as_dir" || eval $as_mkdir_p || {
+    as_dirs=
+    while :; do
+      case $as_dir in #(
+      *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'(
+      *) as_qdir=$as_dir;;
+      esac
+      as_dirs="'$as_qdir' $as_dirs"
+      as_dir=`$as_dirname -- "$as_dir" ||
+$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+        X"$as_dir" : 'X\(//\)[^/]' \| \
+        X"$as_dir" : 'X\(//\)$' \| \
+        X"$as_dir" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X"$as_dir" |
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+           s//\1/
+           q
+         }
+         /^X\(\/\/\)[^/].*/{
+           s//\1/
+           q
+         }
+         /^X\(\/\/\)$/{
+           s//\1/
+           q
+         }
+         /^X\(\/\).*/{
+           s//\1/
+           q
+         }
+         s/.*/./; q'`
+      test -d "$as_dir" && break
+    done
+    test -z "$as_dirs" || eval "mkdir $as_dirs"
+  } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir"
+
+
+} # as_fn_mkdir_p
+
+# as_fn_executable_p FILE
+# -----------------------
+# Test if FILE is an executable regular file.
+as_fn_executable_p ()
+{
+  test -f "$1" && test -x "$1"
+} # as_fn_executable_p
+# as_fn_append VAR VALUE
+# ----------------------
+# Append the text in VALUE to the end of the definition contained in VAR. Take
+# advantage of any shell optimizations that allow amortized linear growth over
+# repeated appends, instead of the typical quadratic growth present in naive
+# implementations.
+if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then :
+  eval 'as_fn_append ()
+  {
+    eval $1+=\$2
+  }'
+else
+  as_fn_append ()
+  {
+    eval $1=\$$1\$2
+  }
+fi # as_fn_append
+
+# as_fn_arith ARG...
+# ------------------
+# Perform arithmetic evaluation on the ARGs, and store the result in the
+# global $as_val. Take advantage of shells that can avoid forks. The arguments
+# must be portable across $(()) and expr.
+if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then :
+  eval 'as_fn_arith ()
+  {
+    as_val=$(( $* ))
+  }'
+else
+  as_fn_arith ()
+  {
+    as_val=`expr "$@" || test $? -eq 1`
+  }
+fi # as_fn_arith
+
+
+# as_fn_error STATUS ERROR [LINENO LOG_FD]
+# ----------------------------------------
+# Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are
+# provided, also output the error to LOG_FD, referencing LINENO. Then exit the
+# script with STATUS, using 1 if that was 0.
+as_fn_error ()
+{
+  as_status=$1; test $as_status -eq 0 && as_status=1
+  if test "$4"; then
+    as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+    $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4
+  fi
+  $as_echo "$as_me: error: $2" >&2
+  as_fn_exit $as_status
+} # as_fn_error
+
+if expr a : '\(a\)' >/dev/null 2>&1 &&
+   test "X`expr 00001 : '.*\(...\)'`" = X001; then
+  as_expr=expr
+else
+  as_expr=false
+fi
+
+if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then
+  as_basename=basename
+else
+  as_basename=false
+fi
+
+if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then
+  as_dirname=dirname
+else
+  as_dirname=false
+fi
+
+as_me=`$as_basename -- "$0" ||
+$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \
+        X"$0" : 'X\(//\)$' \| \
+        X"$0" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X/"$0" |
+    sed '/^.*\/\([^/][^/]*\)\/*$/{
+           s//\1/
+           q
+         }
+         /^X\/\(\/\/\)$/{
+           s//\1/
+           q
+         }
+         /^X\/\(\/\).*/{
+           s//\1/
+           q
+         }
+         s/.*/./; q'`
+
+# Avoid depending upon Character Ranges.
+as_cr_letters='abcdefghijklmnopqrstuvwxyz'
+as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ'
+as_cr_Letters=$as_cr_letters$as_cr_LETTERS
+as_cr_digits='0123456789'
+as_cr_alnum=$as_cr_Letters$as_cr_digits
+
+
+  as_lineno_1=$LINENO as_lineno_1a=$LINENO
+  as_lineno_2=$LINENO as_lineno_2a=$LINENO
+  eval 'test "x$as_lineno_1'$as_run'" != "x$as_lineno_2'$as_run'" &&
+  test "x`expr $as_lineno_1'$as_run' + 1`" = "x$as_lineno_2'$as_run'"' || {
+  # Blame Lee E. McMahon (1931-1989) for sed's syntax.  :-)
+  sed -n '
+    p
+    /[$]LINENO/=
+  ' <$as_myself |
+    sed '
+      s/[$]LINENO.*/&-/
+      t lineno
+      b
+      :lineno
+      N
+      :loop
+      s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/
+      t loop
+      s/-\n.*//
+    ' >$as_me.lineno &&
+  chmod +x "$as_me.lineno" ||
+    { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; }
+
+  # If we had to re-execute with $CONFIG_SHELL, we're ensured to have
+  # already done that, so ensure we don't try to do so again and fall
+  # in an infinite loop.  This has already happened in practice.
+  _as_can_reexec=no; export _as_can_reexec
+  # Don't try to exec as it changes $[0], causing all sort of problems
+  # (the dirname of $[0] is not the place where we might find the
+  # original and so on.  Autoconf is especially sensitive to this).
+  . "./$as_me.lineno"
+  # Exit status is that of the last command.
+  exit
+}
+
+ECHO_C= ECHO_N= ECHO_T=
+case `echo -n x` in #(((((
+-n*)
+  case `echo 'xy\c'` in
+  *c*) ECHO_T='        ';;     # ECHO_T is single tab character.
+  xy)  ECHO_C='\c';;
+  *)   echo `echo ksh88 bug on AIX 6.1` > /dev/null
+       ECHO_T='        ';;
+  esac;;
+*)
+  ECHO_N='-n';;
+esac
+
+rm -f conf$$ conf$$.exe conf$$.file
+if test -d conf$$.dir; then
+  rm -f conf$$.dir/conf$$.file
+else
+  rm -f conf$$.dir
+  mkdir conf$$.dir 2>/dev/null
+fi
+if (echo >conf$$.file) 2>/dev/null; then
+  if ln -s conf$$.file conf$$ 2>/dev/null; then
+    as_ln_s='ln -s'
+    # ... but there are two gotchas:
+    # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail.
+    # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable.
+    # In both cases, we have to default to `cp -pR'.
+    ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe ||
+      as_ln_s='cp -pR'
+  elif ln conf$$.file conf$$ 2>/dev/null; then
+    as_ln_s=ln
+  else
+    as_ln_s='cp -pR'
+  fi
+else
+  as_ln_s='cp -pR'
+fi
+rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file
+rmdir conf$$.dir 2>/dev/null
+
+if mkdir -p . 2>/dev/null; then
+  as_mkdir_p='mkdir -p "$as_dir"'
+else
+  test -d ./-p && rmdir ./-p
+  as_mkdir_p=false
+fi
+
+as_test_x='test -x'
+as_executable_p=as_fn_executable_p
+
+# Sed expression to map a string onto a valid CPP name.
+as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'"
+
+# Sed expression to map a string onto a valid variable name.
+as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'"
+
+SHELL=${CONFIG_SHELL-/bin/sh}
+
+
+test -n "$DJDIR" || exec 7<&0 </dev/null
+exec 6>&1
+
+# Name of the host.
+# hostname on some systems (SVR3.2, old GNU/Linux) returns a bogus exit status,
+# so uname gets run too.
+ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q`
+
+#
+# Initializations.
+#
+ac_default_prefix=/usr/local
+ac_clean_files=
+ac_config_libobj_dir=.
+LIBOBJS=
+cross_compiling=no
+subdirs=
+MFLAGS=
+MAKEFLAGS=
+
+# Identity of this package.
+PACKAGE_NAME='poppler'
+PACKAGE_TARNAME='poppler'
+PACKAGE_VERSION='0.20.4'
+PACKAGE_STRING='poppler 0.20.4'
+PACKAGE_BUGREPORT='https://bugs.freedesktop.org/enter_bug.cgi?product=poppler'
+PACKAGE_URL=''
+
+# Factoring default headers for most tests.
+ac_includes_default="\
+#include <stdio.h>
+#ifdef HAVE_SYS_TYPES_H
+# include <sys/types.h>
+#endif
+#ifdef HAVE_SYS_STAT_H
+# include <sys/stat.h>
+#endif
+#ifdef STDC_HEADERS
+# include <stdlib.h>
+# include <stddef.h>
+#else
+# ifdef HAVE_STDLIB_H
+#  include <stdlib.h>
+# endif
+#endif
+#ifdef HAVE_STRING_H
+# if !defined STDC_HEADERS && defined HAVE_MEMORY_H
+#  include <memory.h>
+# endif
+# include <string.h>
+#endif
+#ifdef HAVE_STRINGS_H
+# include <strings.h>
+#endif
+#ifdef HAVE_INTTYPES_H
+# include <inttypes.h>
+#endif
+#ifdef HAVE_STDINT_H
+# include <stdint.h>
+#endif
+#ifdef HAVE_UNISTD_H
+# include <unistd.h>
+#endif"
+
+ac_subst_vars='am__EXEEXT_FALSE
+am__EXEEXT_TRUE
+LTLIBOBJS
+LIBOBJS
+POPPLER_VERSION
+POPPLER_MICRO_VERSION
+POPPLER_MINOR_VERSION
+POPPLER_MAJOR_VERSION
+PC_REQUIRES_PRIVATE
+PC_REQUIRES
+TESTDATADIR
+USE_LCMS1_FALSE
+USE_LCMS1_TRUE
+USE_CMS_FALSE
+USE_CMS_TRUE
+LCMS_LIBS
+LCMS_CFLAGS
+BUILD_UTILS_FALSE
+BUILD_UTILS_TRUE
+BUILD_GTK_TEST_FALSE
+BUILD_GTK_TEST_TRUE
+GTK_TEST_LIBS
+GTK_TEST_CFLAGS
+BUILD_POPPLER_CPP_FALSE
+BUILD_POPPLER_CPP_TRUE
+LTLIBICONV
+LIBICONV
+BUILD_POPPLER_QT4_FALSE
+BUILD_POPPLER_QT4_TRUE
+MOCQT4
+POPPLER_QT4_CXXFLAGS
+POPPLER_QT4_TEST_LIBS
+POPPLER_QT4_TEST_CFLAGS
+POPPLER_QT4_LIBS
+POPPLER_QT4_CFLAGS
+GTK_DOC_USE_REBASE_FALSE
+GTK_DOC_USE_REBASE_TRUE
+GTK_DOC_USE_LIBTOOL_FALSE
+GTK_DOC_USE_LIBTOOL_TRUE
+GTK_DOC_BUILD_PDF_FALSE
+GTK_DOC_BUILD_PDF_TRUE
+GTK_DOC_BUILD_HTML_FALSE
+GTK_DOC_BUILD_HTML_TRUE
+ENABLE_GTK_DOC_FALSE
+ENABLE_GTK_DOC_TRUE
+GTKDOC_DEPS_LIBS
+GTKDOC_DEPS_CFLAGS
+HTML_DIR
+GTKDOC_MKPDF
+GTKDOC_REBASE
+GTKDOC_CHECK
+POPPLER_GLIB_DISABLE_SINGLE_INCLUDES
+POPPLER_GLIB_DISABLE_DEPRECATED
+GLIB_REQ
+BUILD_POPPLER_GLIB_FALSE
+BUILD_POPPLER_GLIB_TRUE
+GLIB_MKENUMS
+HAVE_INTROSPECTION_FALSE
+HAVE_INTROSPECTION_TRUE
+INTROSPECTION_MAKEFILE
+INTROSPECTION_LIBS
+INTROSPECTION_CFLAGS
+INTROSPECTION_TYPELIBDIR
+INTROSPECTION_GIRDIR
+INTROSPECTION_GENERATE
+INTROSPECTION_COMPILER
+INTROSPECTION_SCANNER
+POPPLER_GLIB_LIBS
+POPPLER_GLIB_CFLAGS
+GLIB_REQUIRED
+CAIRO_REQ
+CAIRO_FEATURE
+PDFTOCAIRO_LIBS
+PDFTOCAIRO_CFLAGS
+BUILD_CAIRO_OUTPUT_FALSE
+BUILD_CAIRO_OUTPUT_TRUE
+CAIRO_LIBS
+CAIRO_CFLAGS
+CAIRO_VERSION
+BUILD_SPLASH_OUTPUT_FALSE
+BUILD_SPLASH_OUTPUT_TRUE
+BUILD_WITH_WIN32_FONTCONFIGURATION_FALSE
+BUILD_WITH_WIN32_FONTCONFIGURATION_TRUE
+FONTCONFIG_LIBS
+FONTCONFIG_CFLAGS
+FREETYPE_CONFIG
+FREETYPE_LIBS
+FREETYPE_CFLAGS
+BUILD_LIBPNG_FALSE
+BUILD_LIBPNG_TRUE
+LIBPNG_LIBS
+LIBPNG_CFLAGS
+BUILD_LIBJPEG_FALSE
+BUILD_LIBJPEG_TRUE
+LIBJPEG_LIBS
+LIBJPEG_CFLAGS
+BUILD_LIBCURL_FALSE
+BUILD_LIBCURL_TRUE
+LIBCURL_LIBS
+LIBCURL_CFLAGS
+BUILD_ZLIB_FALSE
+BUILD_ZLIB_TRUE
+ZLIB_LIBS
+BUILD_LIBTIFF_FALSE
+BUILD_LIBTIFF_TRUE
+LIBTIFF_CFLAGSS
+LIBTIFF_LIBS
+LIBTIFF_CFLAGS
+BUILD_LIBOPENJPEG_FALSE
+BUILD_LIBOPENJPEG_TRUE
+LIBOPENJPEG_LIBS
+LIBOPENJPEG_CFLAGS
+X_EXTRA_LIBS
+X_LIBS
+X_PRE_LIBS
+X_CFLAGS
+XMKMF
+POPPLER_DATADIR
+ENABLE_XPDF_HEADERS_FALSE
+ENABLE_XPDF_HEADERS_TRUE
+PTHREAD_CFLAGS
+PTHREAD_LIBS
+PTHREAD_CC
+acx_pthread_config
+auto_import_flags
+create_shared_lib
+win32_libs
+PKG_CONFIG_LIBDIR
+PKG_CONFIG_PATH
+PKG_CONFIG
+CXXCPP
+am__fastdepCXX_FALSE
+am__fastdepCXX_TRUE
+CXXDEPMODE
+ac_ct_CXX
+CXXFLAGS
+CXX
+OTOOL64
+OTOOL
+LIPO
+NMEDIT
+DSYMUTIL
+MANIFEST_TOOL
+RANLIB
+ac_ct_AR
+AR
+LN_S
+NM
+ac_ct_DUMPBIN
+DUMPBIN
+LD
+FGREP
+SED
+LIBTOOL
+OBJDUMP
+DLLTOOL
+AS
+host_os
+host_vendor
+host_cpu
+host
+build_os
+build_vendor
+build_cpu
+build
+EGREP
+GREP
+CPP
+am__fastdepCC_FALSE
+am__fastdepCC_TRUE
+CCDEPMODE
+am__nodep
+AMDEPBACKSLASH
+AMDEP_FALSE
+AMDEP_TRUE
+am__quote
+am__include
+DEPDIR
+OBJEXT
+EXEEXT
+ac_ct_CC
+CPPFLAGS
+LDFLAGS
+CFLAGS
+CC
+AM_BACKSLASH
+AM_DEFAULT_VERBOSITY
+AM_DEFAULT_V
+AM_V
+am__untar
+am__tar
+AMTAR
+am__leading_dot
+SET_MAKE
+AWK
+mkdir_p
+MKDIR_P
+INSTALL_STRIP_PROGRAM
+STRIP
+install_sh
+MAKEINFO
+AUTOHEADER
+AUTOMAKE
+AUTOCONF
+ACLOCAL
+VERSION
+PACKAGE
+CYGPATH_W
+am__isrc
+INSTALL_DATA
+INSTALL_SCRIPT
+INSTALL_PROGRAM
+target_alias
+host_alias
+build_alias
+LIBS
+ECHO_T
+ECHO_N
+ECHO_C
+DEFS
+mandir
+localedir
+libdir
+psdir
+pdfdir
+dvidir
+htmldir
+infodir
+docdir
+oldincludedir
+includedir
+localstatedir
+sharedstatedir
+sysconfdir
+datadir
+datarootdir
+libexecdir
+sbindir
+bindir
+program_transform_name
+prefix
+exec_prefix
+PACKAGE_URL
+PACKAGE_BUGREPORT
+PACKAGE_STRING
+PACKAGE_VERSION
+PACKAGE_TARNAME
+PACKAGE_NAME
+PATH_SEPARATOR
+SHELL'
+ac_subst_files=''
+ac_user_opts='
+enable_option_checking
+enable_silent_rules
+enable_dependency_tracking
+enable_shared
+enable_static
+with_pic
+enable_fast_install
+with_gnu_ld
+with_sysroot
+enable_libtool_lock
+enable_xpdf_headers
+enable_single_precision
+enable_fixedpoint
+enable_relocatable
+with_x
+enable_libopenjpeg
+enable_libtiff
+enable_largefile
+enable_zlib
+enable_libcurl
+enable_libjpeg
+enable_libpng
+with_font_configuration
+enable_splash_output
+enable_cairo_output
+enable_poppler_glib
+enable_introspection
+with_html_dir
+enable_gtk_doc
+enable_gtk_doc_html
+enable_gtk_doc_pdf
+enable_poppler_qt4
+enable_poppler_cpp
+with_libiconv_prefix
+enable_gtk_test
+enable_utils
+enable_compile_warnings
+enable_cms
+with_testdatadir
+'
+      ac_precious_vars='build_alias
+host_alias
+target_alias
+CC
+CFLAGS
+LDFLAGS
+LIBS
+CPPFLAGS
+CPP
+CXX
+CXXFLAGS
+CCC
+CXXCPP
+PKG_CONFIG
+PKG_CONFIG_PATH
+PKG_CONFIG_LIBDIR
+XMKMF
+LIBOPENJPEG_CFLAGS
+LIBOPENJPEG_LIBS
+LIBTIFF_CFLAGS
+LIBTIFF_LIBS
+LIBCURL_CFLAGS
+LIBCURL_LIBS
+LIBJPEG_CFLAGS
+LIBPNG_CFLAGS
+LIBPNG_LIBS
+FREETYPE_CFLAGS
+FREETYPE_LIBS
+FONTCONFIG_CFLAGS
+FONTCONFIG_LIBS
+CAIRO_CFLAGS
+CAIRO_LIBS
+PDFTOCAIRO_CFLAGS
+PDFTOCAIRO_LIBS
+POPPLER_GLIB_CFLAGS
+POPPLER_GLIB_LIBS
+GTKDOC_DEPS_CFLAGS
+GTKDOC_DEPS_LIBS
+POPPLER_QT4_CFLAGS
+POPPLER_QT4_LIBS
+POPPLER_QT4_TEST_CFLAGS
+POPPLER_QT4_TEST_LIBS
+GTK_TEST_CFLAGS
+GTK_TEST_LIBS
+LCMS_CFLAGS
+LCMS_LIBS'
+
+
+# Initialize some variables set by options.
+ac_init_help=
+ac_init_version=false
+ac_unrecognized_opts=
+ac_unrecognized_sep=
+# The variables have the same names as the options, with
+# dashes changed to underlines.
+cache_file=/dev/null
+exec_prefix=NONE
+no_create=
+no_recursion=
+prefix=NONE
+program_prefix=NONE
+program_suffix=NONE
+program_transform_name=s,x,x,
+silent=
+site=
+srcdir=
+verbose=
+x_includes=NONE
+x_libraries=NONE
+
+# Installation directory options.
+# These are left unexpanded so users can "make install exec_prefix=/foo"
+# and all the variables that are supposed to be based on exec_prefix
+# by default will actually change.
+# Use braces instead of parens because sh, perl, etc. also accept them.
+# (The list follows the same order as the GNU Coding Standards.)
+bindir='${exec_prefix}/bin'
+sbindir='${exec_prefix}/sbin'
+libexecdir='${exec_prefix}/libexec'
+datarootdir='${prefix}/share'
+datadir='${datarootdir}'
+sysconfdir='${prefix}/etc'
+sharedstatedir='${prefix}/com'
+localstatedir='${prefix}/var'
+includedir='${prefix}/include'
+oldincludedir='/usr/include'
+docdir='${datarootdir}/doc/${PACKAGE_TARNAME}'
+infodir='${datarootdir}/info'
+htmldir='${docdir}'
+dvidir='${docdir}'
+pdfdir='${docdir}'
+psdir='${docdir}'
+libdir='${exec_prefix}/lib'
+localedir='${datarootdir}/locale'
+mandir='${datarootdir}/man'
+
+ac_prev=
+ac_dashdash=
+for ac_option
+do
+  # If the previous option needs an argument, assign it.
+  if test -n "$ac_prev"; then
+    eval $ac_prev=\$ac_option
+    ac_prev=
+    continue
+  fi
+
+  case $ac_option in
+  *=?*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;;
+  *=)   ac_optarg= ;;
+  *)    ac_optarg=yes ;;
+  esac
+
+  # Accept the important Cygnus configure options, so we can diagnose typos.
+
+  case $ac_dashdash$ac_option in
+  --)
+    ac_dashdash=yes ;;
+
+  -bindir | --bindir | --bindi | --bind | --bin | --bi)
+    ac_prev=bindir ;;
+  -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*)
+    bindir=$ac_optarg ;;
+
+  -build | --build | --buil | --bui | --bu)
+    ac_prev=build_alias ;;
+  -build=* | --build=* | --buil=* | --bui=* | --bu=*)
+    build_alias=$ac_optarg ;;
+
+  -cache-file | --cache-file | --cache-fil | --cache-fi \
+  | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c)
+    ac_prev=cache_file ;;
+  -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \
+  | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*)
+    cache_file=$ac_optarg ;;
+
+  --config-cache | -C)
+    cache_file=config.cache ;;
+
+  -datadir | --datadir | --datadi | --datad)
+    ac_prev=datadir ;;
+  -datadir=* | --datadir=* | --datadi=* | --datad=*)
+    datadir=$ac_optarg ;;
+
+  -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \
+  | --dataroo | --dataro | --datar)
+    ac_prev=datarootdir ;;
+  -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \
+  | --dataroot=* | --dataroo=* | --dataro=* | --datar=*)
+    datarootdir=$ac_optarg ;;
+
+  -disable-* | --disable-*)
+    ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'`
+    # Reject names that are not valid shell variable names.
+    expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
+      as_fn_error $? "invalid feature name: $ac_useropt"
+    ac_useropt_orig=$ac_useropt
+    ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'`
+    case $ac_user_opts in
+      *"
+"enable_$ac_useropt"
+"*) ;;
+      *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--disable-$ac_useropt_orig"
+        ac_unrecognized_sep=', ';;
+    esac
+    eval enable_$ac_useropt=no ;;
+
+  -docdir | --docdir | --docdi | --doc | --do)
+    ac_prev=docdir ;;
+  -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*)
+    docdir=$ac_optarg ;;
+
+  -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv)
+    ac_prev=dvidir ;;
+  -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*)
+    dvidir=$ac_optarg ;;
+
+  -enable-* | --enable-*)
+    ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'`
+    # Reject names that are not valid shell variable names.
+    expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
+      as_fn_error $? "invalid feature name: $ac_useropt"
+    ac_useropt_orig=$ac_useropt
+    ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'`
+    case $ac_user_opts in
+      *"
+"enable_$ac_useropt"
+"*) ;;
+      *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--enable-$ac_useropt_orig"
+        ac_unrecognized_sep=', ';;
+    esac
+    eval enable_$ac_useropt=\$ac_optarg ;;
+
+  -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \
+  | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \
+  | --exec | --exe | --ex)
+    ac_prev=exec_prefix ;;
+  -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \
+  | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \
+  | --exec=* | --exe=* | --ex=*)
+    exec_prefix=$ac_optarg ;;
+
+  -gas | --gas | --ga | --g)
+    # Obsolete; use --with-gas.
+    with_gas=yes ;;
+
+  -help | --help | --hel | --he | -h)
+    ac_init_help=long ;;
+  -help=r* | --help=r* | --hel=r* | --he=r* | -hr*)
+    ac_init_help=recursive ;;
+  -help=s* | --help=s* | --hel=s* | --he=s* | -hs*)
+    ac_init_help=short ;;
+
+  -host | --host | --hos | --ho)
+    ac_prev=host_alias ;;
+  -host=* | --host=* | --hos=* | --ho=*)
+    host_alias=$ac_optarg ;;
+
+  -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht)
+    ac_prev=htmldir ;;
+  -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \
+  | --ht=*)
+    htmldir=$ac_optarg ;;
+
+  -includedir | --includedir | --includedi | --included | --include \
+  | --includ | --inclu | --incl | --inc)
+    ac_prev=includedir ;;
+  -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \
+  | --includ=* | --inclu=* | --incl=* | --inc=*)
+    includedir=$ac_optarg ;;
+
+  -infodir | --infodir | --infodi | --infod | --info | --inf)
+    ac_prev=infodir ;;
+  -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*)
+    infodir=$ac_optarg ;;
+
+  -libdir | --libdir | --libdi | --libd)
+    ac_prev=libdir ;;
+  -libdir=* | --libdir=* | --libdi=* | --libd=*)
+    libdir=$ac_optarg ;;
+
+  -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \
+  | --libexe | --libex | --libe)
+    ac_prev=libexecdir ;;
+  -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \
+  | --libexe=* | --libex=* | --libe=*)
+    libexecdir=$ac_optarg ;;
+
+  -localedir | --localedir | --localedi | --localed | --locale)
+    ac_prev=localedir ;;
+  -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*)
+    localedir=$ac_optarg ;;
+
+  -localstatedir | --localstatedir | --localstatedi | --localstated \
+  | --localstate | --localstat | --localsta | --localst | --locals)
+    ac_prev=localstatedir ;;
+  -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \
+  | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*)
+    localstatedir=$ac_optarg ;;
+
+  -mandir | --mandir | --mandi | --mand | --man | --ma | --m)
+    ac_prev=mandir ;;
+  -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*)
+    mandir=$ac_optarg ;;
+
+  -nfp | --nfp | --nf)
+    # Obsolete; use --without-fp.
+    with_fp=no ;;
+
+  -no-create | --no-create | --no-creat | --no-crea | --no-cre \
+  | --no-cr | --no-c | -n)
+    no_create=yes ;;
+
+  -no-recursion | --no-recursion | --no-recursio | --no-recursi \
+  | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r)
+    no_recursion=yes ;;
+
+  -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \
+  | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \
+  | --oldin | --oldi | --old | --ol | --o)
+    ac_prev=oldincludedir ;;
+  -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \
+  | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \
+  | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*)
+    oldincludedir=$ac_optarg ;;
+
+  -prefix | --prefix | --prefi | --pref | --pre | --pr | --p)
+    ac_prev=prefix ;;
+  -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*)
+    prefix=$ac_optarg ;;
+
+  -program-prefix | --program-prefix | --program-prefi | --program-pref \
+  | --program-pre | --program-pr | --program-p)
+    ac_prev=program_prefix ;;
+  -program-prefix=* | --program-prefix=* | --program-prefi=* \
+  | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*)
+    program_prefix=$ac_optarg ;;
+
+  -program-suffix | --program-suffix | --program-suffi | --program-suff \
+  | --program-suf | --program-su | --program-s)
+    ac_prev=program_suffix ;;
+  -program-suffix=* | --program-suffix=* | --program-suffi=* \
+  | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*)
+    program_suffix=$ac_optarg ;;
+
+  -program-transform-name | --program-transform-name \
+  | --program-transform-nam | --program-transform-na \
+  | --program-transform-n | --program-transform- \
+  | --program-transform | --program-transfor \
+  | --program-transfo | --program-transf \
+  | --program-trans | --program-tran \
+  | --progr-tra | --program-tr | --program-t)
+    ac_prev=program_transform_name ;;
+  -program-transform-name=* | --program-transform-name=* \
+  | --program-transform-nam=* | --program-transform-na=* \
+  | --program-transform-n=* | --program-transform-=* \
+  | --program-transform=* | --program-transfor=* \
+  | --program-transfo=* | --program-transf=* \
+  | --program-trans=* | --program-tran=* \
+  | --progr-tra=* | --program-tr=* | --program-t=*)
+    program_transform_name=$ac_optarg ;;
+
+  -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd)
+    ac_prev=pdfdir ;;
+  -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*)
+    pdfdir=$ac_optarg ;;
+
+  -psdir | --psdir | --psdi | --psd | --ps)
+    ac_prev=psdir ;;
+  -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*)
+    psdir=$ac_optarg ;;
+
+  -q | -quiet | --quiet | --quie | --qui | --qu | --q \
+  | -silent | --silent | --silen | --sile | --sil)
+    silent=yes ;;
+
+  -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb)
+    ac_prev=sbindir ;;
+  -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \
+  | --sbi=* | --sb=*)
+    sbindir=$ac_optarg ;;
+
+  -sharedstatedir | --sharedstatedir | --sharedstatedi \
+  | --sharedstated | --sharedstate | --sharedstat | --sharedsta \
+  | --sharedst | --shareds | --shared | --share | --shar \
+  | --sha | --sh)
+    ac_prev=sharedstatedir ;;
+  -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \
+  | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \
+  | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \
+  | --sha=* | --sh=*)
+    sharedstatedir=$ac_optarg ;;
+
+  -site | --site | --sit)
+    ac_prev=site ;;
+  -site=* | --site=* | --sit=*)
+    site=$ac_optarg ;;
+
+  -srcdir | --srcdir | --srcdi | --srcd | --src | --sr)
+    ac_prev=srcdir ;;
+  -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*)
+    srcdir=$ac_optarg ;;
+
+  -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \
+  | --syscon | --sysco | --sysc | --sys | --sy)
+    ac_prev=sysconfdir ;;
+  -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \
+  | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*)
+    sysconfdir=$ac_optarg ;;
+
+  -target | --target | --targe | --targ | --tar | --ta | --t)
+    ac_prev=target_alias ;;
+  -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*)
+    target_alias=$ac_optarg ;;
+
+  -v | -verbose | --verbose | --verbos | --verbo | --verb)
+    verbose=yes ;;
+
+  -version | --version | --versio | --versi | --vers | -V)
+    ac_init_version=: ;;
+
+  -with-* | --with-*)
+    ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'`
+    # Reject names that are not valid shell variable names.
+    expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
+      as_fn_error $? "invalid package name: $ac_useropt"
+    ac_useropt_orig=$ac_useropt
+    ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'`
+    case $ac_user_opts in
+      *"
+"with_$ac_useropt"
+"*) ;;
+      *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--with-$ac_useropt_orig"
+        ac_unrecognized_sep=', ';;
+    esac
+    eval with_$ac_useropt=\$ac_optarg ;;
+
+  -without-* | --without-*)
+    ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'`
+    # Reject names that are not valid shell variable names.
+    expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
+      as_fn_error $? "invalid package name: $ac_useropt"
+    ac_useropt_orig=$ac_useropt
+    ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'`
+    case $ac_user_opts in
+      *"
+"with_$ac_useropt"
+"*) ;;
+      *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--without-$ac_useropt_orig"
+        ac_unrecognized_sep=', ';;
+    esac
+    eval with_$ac_useropt=no ;;
+
+  --x)
+    # Obsolete; use --with-x.
+    with_x=yes ;;
+
+  -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \
+  | --x-incl | --x-inc | --x-in | --x-i)
+    ac_prev=x_includes ;;
+  -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \
+  | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*)
+    x_includes=$ac_optarg ;;
+
+  -x-libraries | --x-libraries | --x-librarie | --x-librari \
+  | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l)
+    ac_prev=x_libraries ;;
+  -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \
+  | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*)
+    x_libraries=$ac_optarg ;;
+
+  -*) as_fn_error $? "unrecognized option: \`$ac_option'
+Try \`$0 --help' for more information"
+    ;;
+
+  *=*)
+    ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='`
+    # Reject names that are not valid shell variable names.
+    case $ac_envvar in #(
+      '' | [0-9]* | *[!_$as_cr_alnum]* )
+      as_fn_error $? "invalid variable name: \`$ac_envvar'" ;;
+    esac
+    eval $ac_envvar=\$ac_optarg
+    export $ac_envvar ;;
+
+  *)
+    # FIXME: should be removed in autoconf 3.0.
+    $as_echo "$as_me: WARNING: you should use --build, --host, --target" >&2
+    expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null &&
+      $as_echo "$as_me: WARNING: invalid host type: $ac_option" >&2
+    : "${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}"
+    ;;
+
+  esac
+done
+
+if test -n "$ac_prev"; then
+  ac_option=--`echo $ac_prev | sed 's/_/-/g'`
+  as_fn_error $? "missing argument to $ac_option"
+fi
+
+if test -n "$ac_unrecognized_opts"; then
+  case $enable_option_checking in
+    no) ;;
+    fatal) as_fn_error $? "unrecognized options: $ac_unrecognized_opts" ;;
+    *)     $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;;
+  esac
+fi
+
+# Check all directory arguments for consistency.
+for ac_var in  exec_prefix prefix bindir sbindir libexecdir datarootdir \
+               datadir sysconfdir sharedstatedir localstatedir includedir \
+               oldincludedir docdir infodir htmldir dvidir pdfdir psdir \
+               libdir localedir mandir
+do
+  eval ac_val=\$$ac_var
+  # Remove trailing slashes.
+  case $ac_val in
+    */ )
+      ac_val=`expr "X$ac_val" : 'X\(.*[^/]\)' \| "X$ac_val" : 'X\(.*\)'`
+      eval $ac_var=\$ac_val;;
+  esac
+  # Be sure to have absolute directory names.
+  case $ac_val in
+    [\\/$]* | ?:[\\/]* )  continue;;
+    NONE | '' ) case $ac_var in *prefix ) continue;; esac;;
+  esac
+  as_fn_error $? "expected an absolute directory name for --$ac_var: $ac_val"
+done
+
+# There might be people who depend on the old broken behavior: `$host'
+# used to hold the argument of --host etc.
+# FIXME: To remove some day.
+build=$build_alias
+host=$host_alias
+target=$target_alias
+
+# FIXME: To remove some day.
+if test "x$host_alias" != x; then
+  if test "x$build_alias" = x; then
+    cross_compiling=maybe
+  elif test "x$build_alias" != "x$host_alias"; then
+    cross_compiling=yes
+  fi
+fi
+
+ac_tool_prefix=
+test -n "$host_alias" && ac_tool_prefix=$host_alias-
+
+test "$silent" = yes && exec 6>/dev/null
+
+
+ac_pwd=`pwd` && test -n "$ac_pwd" &&
+ac_ls_di=`ls -di .` &&
+ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` ||
+  as_fn_error $? "working directory cannot be determined"
+test "X$ac_ls_di" = "X$ac_pwd_ls_di" ||
+  as_fn_error $? "pwd does not report name of working directory"
+
+
+# Find the source files, if location was not specified.
+if test -z "$srcdir"; then
+  ac_srcdir_defaulted=yes
+  # Try the directory containing this script, then the parent directory.
+  ac_confdir=`$as_dirname -- "$as_myself" ||
+$as_expr X"$as_myself" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+        X"$as_myself" : 'X\(//\)[^/]' \| \
+        X"$as_myself" : 'X\(//\)$' \| \
+        X"$as_myself" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X"$as_myself" |
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+           s//\1/
+           q
+         }
+         /^X\(\/\/\)[^/].*/{
+           s//\1/
+           q
+         }
+         /^X\(\/\/\)$/{
+           s//\1/
+           q
+         }
+         /^X\(\/\).*/{
+           s//\1/
+           q
+         }
+         s/.*/./; q'`
+  srcdir=$ac_confdir
+  if test ! -r "$srcdir/$ac_unique_file"; then
+    srcdir=..
+  fi
+else
+  ac_srcdir_defaulted=no
+fi
+if test ! -r "$srcdir/$ac_unique_file"; then
+  test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .."
+  as_fn_error $? "cannot find sources ($ac_unique_file) in $srcdir"
+fi
+ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work"
+ac_abs_confdir=`(
+       cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error $? "$ac_msg"
+       pwd)`
+# When building in place, set srcdir=.
+if test "$ac_abs_confdir" = "$ac_pwd"; then
+  srcdir=.
+fi
+# Remove unnecessary trailing slashes from srcdir.
+# Double slashes in file names in object file debugging info
+# mess up M-x gdb in Emacs.
+case $srcdir in
+*/) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;;
+esac
+for ac_var in $ac_precious_vars; do
+  eval ac_env_${ac_var}_set=\${${ac_var}+set}
+  eval ac_env_${ac_var}_value=\$${ac_var}
+  eval ac_cv_env_${ac_var}_set=\${${ac_var}+set}
+  eval ac_cv_env_${ac_var}_value=\$${ac_var}
+done
+
+#
+# Report the --help message.
+#
+if test "$ac_init_help" = "long"; then
+  # Omit some internal or obsolete options to make the list less imposing.
+  # This message is too long to be a string in the A/UX 3.1 sh.
+  cat <<_ACEOF
+\`configure' configures poppler 0.20.4 to adapt to many kinds of systems.
+
+Usage: $0 [OPTION]... [VAR=VALUE]...
+
+To assign environment variables (e.g., CC, CFLAGS...), specify them as
+VAR=VALUE.  See below for descriptions of some of the useful variables.
+
+Defaults for the options are specified in brackets.
+
+Configuration:
+  -h, --help              display this help and exit
+      --help=short        display options specific to this package
+      --help=recursive    display the short help of all the included packages
+  -V, --version           display version information and exit
+  -q, --quiet, --silent   do not print \`checking ...' messages
+      --cache-file=FILE   cache test results in FILE [disabled]
+  -C, --config-cache      alias for \`--cache-file=config.cache'
+  -n, --no-create         do not create output files
+      --srcdir=DIR        find the sources in DIR [configure dir or \`..']
+
+Installation directories:
+  --prefix=PREFIX         install architecture-independent files in PREFIX
+                          [$ac_default_prefix]
+  --exec-prefix=EPREFIX   install architecture-dependent files in EPREFIX
+                          [PREFIX]
+
+By default, \`make install' will install all the files in
+\`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc.  You can specify
+an installation prefix other than \`$ac_default_prefix' using \`--prefix',
+for instance \`--prefix=\$HOME'.
+
+For better control, use the options below.
+
+Fine tuning of the installation directories:
+  --bindir=DIR            user executables [EPREFIX/bin]
+  --sbindir=DIR           system admin executables [EPREFIX/sbin]
+  --libexecdir=DIR        program executables [EPREFIX/libexec]
+  --sysconfdir=DIR        read-only single-machine data [PREFIX/etc]
+  --sharedstatedir=DIR    modifiable architecture-independent data [PREFIX/com]
+  --localstatedir=DIR     modifiable single-machine data [PREFIX/var]
+  --libdir=DIR            object code libraries [EPREFIX/lib]
+  --includedir=DIR        C header files [PREFIX/include]
+  --oldincludedir=DIR     C header files for non-gcc [/usr/include]
+  --datarootdir=DIR       read-only arch.-independent data root [PREFIX/share]
+  --datadir=DIR           read-only architecture-independent data [DATAROOTDIR]
+  --infodir=DIR           info documentation [DATAROOTDIR/info]
+  --localedir=DIR         locale-dependent data [DATAROOTDIR/locale]
+  --mandir=DIR            man documentation [DATAROOTDIR/man]
+  --docdir=DIR            documentation root [DATAROOTDIR/doc/poppler]
+  --htmldir=DIR           html documentation [DOCDIR]
+  --dvidir=DIR            dvi documentation [DOCDIR]
+  --pdfdir=DIR            pdf documentation [DOCDIR]
+  --psdir=DIR             ps documentation [DOCDIR]
+_ACEOF
+
+  cat <<\_ACEOF
+
+Program names:
+  --program-prefix=PREFIX            prepend PREFIX to installed program names
+  --program-suffix=SUFFIX            append SUFFIX to installed program names
+  --program-transform-name=PROGRAM   run sed PROGRAM on installed program names
+
+X features:
+  --x-includes=DIR    X include files are in DIR
+  --x-libraries=DIR   X library files are in DIR
+
+System types:
+  --build=BUILD     configure for building on BUILD [guessed]
+  --host=HOST       cross-compile to build programs to run on HOST [BUILD]
+_ACEOF
+fi
+
+if test -n "$ac_init_help"; then
+  case $ac_init_help in
+     short | recursive ) echo "Configuration of poppler 0.20.4:";;
+   esac
+  cat <<\_ACEOF
+
+Optional Features:
+  --disable-option-checking  ignore unrecognized --enable/--with options
+  --disable-FEATURE       do not include FEATURE (same as --enable-FEATURE=no)
+  --enable-FEATURE[=ARG]  include FEATURE [ARG=yes]
+  --enable-silent-rules          less verbose build output (undo: `make V=1')
+  --disable-silent-rules         verbose build output (undo: `make V=0')
+  --disable-dependency-tracking  speeds up one-time build
+  --enable-dependency-tracking   do not reject slow dependency extractors
+  --enable-shared[=PKGS]  build shared libraries [default=yes]
+  --enable-static[=PKGS]  build static libraries [default=yes]
+  --enable-fast-install[=PKGS]
+                          optimize for fast installation [default=yes]
+  --disable-libtool-lock  avoid locking (might break parallel builds)
+  --enable-xpdf-headers   Install unsupported xpdf headers.
+  --enable-single-precision     use single precision arithmetic (instead of double precision) in the Splash backend
+  --enable-fixedpoint     use fixed point (instead of double precision) arithmetic in the Splash backend
+  --disable-relocatable   Hardcode the poppler library location (on Windows).
+  --disable-libopenjpeg   Don't build against libopenjpeg.
+  --disable-libtiff       Don't build against libtiff.
+  --disable-largefile     omit support for large files
+  --enable-zlib           Build with zlib
+  --enable-libcurl        Build with libcurl based HTTP support.
+  --disable-libjpeg       Don't build against libjpeg.
+  --disable-libpng        Do not build against libpng.
+  --disable-splash-output Don't build the Splash graphics backend.
+  --disable-cairo-output  Don't build the cairo graphics backend.
+  --disable-poppler-glib  Don't compile poppler glib wrapper.
+  --enable-introspection=[no/auto/yes]
+                          Enable introspection for this build
+  --enable-gtk-doc        use gtk-doc to build documentation [[default=no]]
+  --enable-gtk-doc-html   build documentation in html format [[default=yes]]
+  --enable-gtk-doc-pdf    build documentation in pdf format [[default=no]]
+  --disable-poppler-qt4   Don't compile poppler Qt4 wrapper.
+  --disable-poppler-cpp   Don't compile poppler cpp wrapper.
+  --disable-gtk-test      Don't compile GTK+ test program.
+  --disable-utils         Don't compile poppler command line utils.
+  --enable-compile-warnings=[no/yes/kde]
+                             Turn on compiler warnings.
+
+  --disable-cms           Don't use color management system.
+
+Optional Packages:
+  --with-PACKAGE[=ARG]    use PACKAGE [ARG=yes]
+  --without-PACKAGE       do not use PACKAGE (same as --with-PACKAGE=no)
+  --with-pic[=PKGS]       try to use only PIC/non-PIC objects [default=use
+                          both]
+  --with-gnu-ld           assume the C compiler uses GNU ld [default=no]
+  --with-sysroot=DIR Search for dependent libraries within DIR
+                        (or the compiler's sysroot if not specified).
+  --with-x                use the X Window System
+  --with-font-configuration=fontconfig|win32
+                          Select font configuration backend
+  --with-html-dir=PATH    path to installed docs
+  --with-libiconv-prefix[=DIR]  search for libiconv in DIR/include and DIR/lib
+  --without-libiconv-prefix     don't search for libiconv in includedir and libdir
+  --with-testdatadir=/path/to/testdatadir
+                          Specify test data dir
+
+Some influential environment variables:
+  CC          C compiler command
+  CFLAGS      C compiler flags
+  LDFLAGS     linker flags, e.g. -L<lib dir> if you have libraries in a
+              nonstandard directory <lib dir>
+  LIBS        libraries to pass to the linker, e.g. -l<library>
+  CPPFLAGS    (Objective) C/C++ preprocessor flags, e.g. -I<include dir> if
+              you have headers in a nonstandard directory <include dir>
+  CPP         C preprocessor
+  CXX         C++ compiler command
+  CXXFLAGS    C++ compiler flags
+  CXXCPP      C++ preprocessor
+  PKG_CONFIG  path to pkg-config utility
+  PKG_CONFIG_PATH
+              directories to add to pkg-config's search path
+  PKG_CONFIG_LIBDIR
+              path overriding pkg-config's built-in search path
+  XMKMF       Path to xmkmf, Makefile generator for X Window System
+  LIBOPENJPEG_CFLAGS
+              C compiler flags for LIBOPENJPEG, overriding pkg-config
+  LIBOPENJPEG_LIBS
+              linker flags for LIBOPENJPEG, overriding pkg-config
+  LIBTIFF_CFLAGS
+              C compiler flags for LIBTIFF
+  LIBTIFF_LIBS
+              linker flags to link LIBTIFF (default is -ltiff)
+  LIBCURL_CFLAGS
+              C compiler flags for LIBCURL, overriding pkg-config
+  LIBCURL_LIBS
+              linker flags for LIBCURL, overriding pkg-config
+  LIBJPEG_CFLAGS
+              C compiler flags for LIBJPEG
+  LIBPNG_CFLAGS
+              C compiler flags for LIBPNG, overriding pkg-config
+  LIBPNG_LIBS linker flags for LIBPNG, overriding pkg-config
+  FREETYPE_CFLAGS
+              C compiler flags for FREETYPE, overriding pkg-config
+  FREETYPE_LIBS
+              linker flags for FREETYPE, overriding pkg-config
+  FONTCONFIG_CFLAGS
+              C compiler flags for FONTCONFIG, overriding pkg-config
+  FONTCONFIG_LIBS
+              linker flags for FONTCONFIG, overriding pkg-config
+  CAIRO_CFLAGS
+              C compiler flags for CAIRO, overriding pkg-config
+  CAIRO_LIBS  linker flags for CAIRO, overriding pkg-config
+  PDFTOCAIRO_CFLAGS
+              C compiler flags for PDFTOCAIRO, overriding pkg-config
+  PDFTOCAIRO_LIBS
+              linker flags for PDFTOCAIRO, overriding pkg-config
+  POPPLER_GLIB_CFLAGS
+              C compiler flags for POPPLER_GLIB, overriding pkg-config
+  POPPLER_GLIB_LIBS
+              linker flags for POPPLER_GLIB, overriding pkg-config
+  GTKDOC_DEPS_CFLAGS
+              C compiler flags for GTKDOC_DEPS, overriding pkg-config
+  GTKDOC_DEPS_LIBS
+              linker flags for GTKDOC_DEPS, overriding pkg-config
+  POPPLER_QT4_CFLAGS
+              C compiler flags for POPPLER_QT4, overriding pkg-config
+  POPPLER_QT4_LIBS
+              linker flags for POPPLER_QT4, overriding pkg-config
+  POPPLER_QT4_TEST_CFLAGS
+              C compiler flags for POPPLER_QT4_TEST, overriding pkg-config
+  POPPLER_QT4_TEST_LIBS
+              linker flags for POPPLER_QT4_TEST, overriding pkg-config
+  GTK_TEST_CFLAGS
+              C compiler flags for GTK_TEST, overriding pkg-config
+  GTK_TEST_LIBS
+              linker flags for GTK_TEST, overriding pkg-config
+  LCMS_CFLAGS C compiler flags for LCMS, overriding pkg-config
+  LCMS_LIBS   linker flags for LCMS, overriding pkg-config
+
+Use these variables to override the choices made by `configure' or to help
+it to find libraries and programs with nonstandard names/locations.
+
+Report bugs to <https://bugs.freedesktop.org/enter_bug.cgi?product=poppler>.
+_ACEOF
+ac_status=$?
+fi
+
+if test "$ac_init_help" = "recursive"; then
+  # If there are subdirs, report their specific --help.
+  for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue
+    test -d "$ac_dir" ||
+      { cd "$srcdir" && ac_pwd=`pwd` && srcdir=. && test -d "$ac_dir"; } ||
+      continue
+    ac_builddir=.
+
+case "$ac_dir" in
+.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;;
+*)
+  ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'`
+  # A ".." for each directory in $ac_dir_suffix.
+  ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'`
+  case $ac_top_builddir_sub in
+  "") ac_top_builddir_sub=. ac_top_build_prefix= ;;
+  *)  ac_top_build_prefix=$ac_top_builddir_sub/ ;;
+  esac ;;
+esac
+ac_abs_top_builddir=$ac_pwd
+ac_abs_builddir=$ac_pwd$ac_dir_suffix
+# for backward compatibility:
+ac_top_builddir=$ac_top_build_prefix
+
+case $srcdir in
+  .)  # We are building in place.
+    ac_srcdir=.
+    ac_top_srcdir=$ac_top_builddir_sub
+    ac_abs_top_srcdir=$ac_pwd ;;
+  [\\/]* | ?:[\\/]* )  # Absolute name.
+    ac_srcdir=$srcdir$ac_dir_suffix;
+    ac_top_srcdir=$srcdir
+    ac_abs_top_srcdir=$srcdir ;;
+  *) # Relative name.
+    ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix
+    ac_top_srcdir=$ac_top_build_prefix$srcdir
+    ac_abs_top_srcdir=$ac_pwd/$srcdir ;;
+esac
+ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix
+
+    cd "$ac_dir" || { ac_status=$?; continue; }
+    # Check for guested configure.
+    if test -f "$ac_srcdir/configure.gnu"; then
+      echo &&
+      $SHELL "$ac_srcdir/configure.gnu" --help=recursive
+    elif test -f "$ac_srcdir/configure"; then
+      echo &&
+      $SHELL "$ac_srcdir/configure" --help=recursive
+    else
+      $as_echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2
+    fi || ac_status=$?
+    cd "$ac_pwd" || { ac_status=$?; break; }
+  done
+fi
+
+test -n "$ac_init_help" && exit $ac_status
+if $ac_init_version; then
+  cat <<\_ACEOF
+poppler configure 0.20.4
+generated by GNU Autoconf 2.69
+
+Copyright (C) 2012 Free Software Foundation, Inc.
+This configure script is free software; the Free Software Foundation
+gives unlimited permission to copy, distribute and modify it.
+_ACEOF
+  exit
+fi
+
+## ------------------------ ##
+## Autoconf initialization. ##
+## ------------------------ ##
+
+# ac_fn_c_try_compile LINENO
+# --------------------------
+# Try to compile conftest.$ac_ext, and return whether this succeeded.
+ac_fn_c_try_compile ()
+{
+  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+  rm -f conftest.$ac_objext
+  if { { ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_compile") 2>conftest.err
+  ac_status=$?
+  if test -s conftest.err; then
+    grep -v '^ *+' conftest.err >conftest.er1
+    cat conftest.er1 >&5
+    mv -f conftest.er1 conftest.err
+  fi
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; } && {
+        test -z "$ac_c_werror_flag" ||
+        test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then :
+  ac_retval=0
+else
+  $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+       ac_retval=1
+fi
+  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+  as_fn_set_status $ac_retval
+
+} # ac_fn_c_try_compile
+
+# ac_fn_c_try_run LINENO
+# ----------------------
+# Try to link conftest.$ac_ext, and return whether this succeeded. Assumes
+# that executables *can* be run.
+ac_fn_c_try_run ()
+{
+  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+  if { { ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_link") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; } && { ac_try='./conftest$ac_exeext'
+  { { case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; }; then :
+  ac_retval=0
+else
+  $as_echo "$as_me: program exited with status $ac_status" >&5
+       $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+       ac_retval=$ac_status
+fi
+  rm -rf conftest.dSYM conftest_ipa8_conftest.oo
+  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+  as_fn_set_status $ac_retval
+
+} # ac_fn_c_try_run
+
+# ac_fn_c_try_cpp LINENO
+# ----------------------
+# Try to preprocess conftest.$ac_ext, and return whether this succeeded.
+ac_fn_c_try_cpp ()
+{
+  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+  if { { ac_try="$ac_cpp conftest.$ac_ext"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err
+  ac_status=$?
+  if test -s conftest.err; then
+    grep -v '^ *+' conftest.err >conftest.er1
+    cat conftest.er1 >&5
+    mv -f conftest.er1 conftest.err
+  fi
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; } > conftest.i && {
+        test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" ||
+        test ! -s conftest.err
+       }; then :
+  ac_retval=0
+else
+  $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+    ac_retval=1
+fi
+  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+  as_fn_set_status $ac_retval
+
+} # ac_fn_c_try_cpp
+
+# ac_fn_c_check_header_compile LINENO HEADER VAR INCLUDES
+# -------------------------------------------------------
+# Tests whether HEADER exists and can be compiled using the include files in
+# INCLUDES, setting the cache variable VAR accordingly.
+ac_fn_c_check_header_compile ()
+{
+  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
+$as_echo_n "checking for $2... " >&6; }
+if eval \${$3+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+$4
+#include <$2>
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  eval "$3=yes"
+else
+  eval "$3=no"
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+eval ac_res=\$$3
+              { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+
+} # ac_fn_c_check_header_compile
+
+# ac_fn_c_try_link LINENO
+# -----------------------
+# Try to link conftest.$ac_ext, and return whether this succeeded.
+ac_fn_c_try_link ()
+{
+  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+  rm -f conftest.$ac_objext conftest$ac_exeext
+  if { { ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_link") 2>conftest.err
+  ac_status=$?
+  if test -s conftest.err; then
+    grep -v '^ *+' conftest.err >conftest.er1
+    cat conftest.er1 >&5
+    mv -f conftest.er1 conftest.err
+  fi
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; } && {
+        test -z "$ac_c_werror_flag" ||
+        test ! -s conftest.err
+       } && test -s conftest$ac_exeext && {
+        test "$cross_compiling" = yes ||
+        test -x conftest$ac_exeext
+       }; then :
+  ac_retval=0
+else
+  $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+       ac_retval=1
+fi
+  # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information
+  # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would
+  # interfere with the next link command; also delete a directory that is
+  # left behind by Apple's compiler.  We do this before executing the actions.
+  rm -rf conftest.dSYM conftest_ipa8_conftest.oo
+  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+  as_fn_set_status $ac_retval
+
+} # ac_fn_c_try_link
+
+# ac_fn_c_check_func LINENO FUNC VAR
+# ----------------------------------
+# Tests whether FUNC exists, setting the cache variable VAR accordingly
+ac_fn_c_check_func ()
+{
+  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
+$as_echo_n "checking for $2... " >&6; }
+if eval \${$3+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+/* Define $2 to an innocuous variant, in case <limits.h> declares $2.
+   For example, HP-UX 11i <limits.h> declares gettimeofday.  */
+#define $2 innocuous_$2
+
+/* System header to define __stub macros and hopefully few prototypes,
+    which can conflict with char $2 (); below.
+    Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+    <limits.h> exists even on freestanding compilers.  */
+
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+
+#undef $2
+
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+char $2 ();
+/* The GNU C library defines this for functions which it implements
+    to always fail with ENOSYS.  Some functions are actually named
+    something starting with __ and the normal name is an alias.  */
+#if defined __stub_$2 || defined __stub___$2
+choke me
+#endif
+
+int
+main ()
+{
+return $2 ();
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  eval "$3=yes"
+else
+  eval "$3=no"
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+fi
+eval ac_res=\$$3
+              { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+
+} # ac_fn_c_check_func
+
+# ac_fn_cxx_try_compile LINENO
+# ----------------------------
+# Try to compile conftest.$ac_ext, and return whether this succeeded.
+ac_fn_cxx_try_compile ()
+{
+  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+  rm -f conftest.$ac_objext
+  if { { ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_compile") 2>conftest.err
+  ac_status=$?
+  if test -s conftest.err; then
+    grep -v '^ *+' conftest.err >conftest.er1
+    cat conftest.er1 >&5
+    mv -f conftest.er1 conftest.err
+  fi
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; } && {
+        test -z "$ac_cxx_werror_flag" ||
+        test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then :
+  ac_retval=0
+else
+  $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+       ac_retval=1
+fi
+  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+  as_fn_set_status $ac_retval
+
+} # ac_fn_cxx_try_compile
+
+# ac_fn_cxx_try_cpp LINENO
+# ------------------------
+# Try to preprocess conftest.$ac_ext, and return whether this succeeded.
+ac_fn_cxx_try_cpp ()
+{
+  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+  if { { ac_try="$ac_cpp conftest.$ac_ext"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err
+  ac_status=$?
+  if test -s conftest.err; then
+    grep -v '^ *+' conftest.err >conftest.er1
+    cat conftest.er1 >&5
+    mv -f conftest.er1 conftest.err
+  fi
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; } > conftest.i && {
+        test -z "$ac_cxx_preproc_warn_flag$ac_cxx_werror_flag" ||
+        test ! -s conftest.err
+       }; then :
+  ac_retval=0
+else
+  $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+    ac_retval=1
+fi
+  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+  as_fn_set_status $ac_retval
+
+} # ac_fn_cxx_try_cpp
+
+# ac_fn_cxx_try_link LINENO
+# -------------------------
+# Try to link conftest.$ac_ext, and return whether this succeeded.
+ac_fn_cxx_try_link ()
+{
+  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+  rm -f conftest.$ac_objext conftest$ac_exeext
+  if { { ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_link") 2>conftest.err
+  ac_status=$?
+  if test -s conftest.err; then
+    grep -v '^ *+' conftest.err >conftest.er1
+    cat conftest.er1 >&5
+    mv -f conftest.er1 conftest.err
+  fi
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; } && {
+        test -z "$ac_cxx_werror_flag" ||
+        test ! -s conftest.err
+       } && test -s conftest$ac_exeext && {
+        test "$cross_compiling" = yes ||
+        test -x conftest$ac_exeext
+       }; then :
+  ac_retval=0
+else
+  $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+       ac_retval=1
+fi
+  # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information
+  # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would
+  # interfere with the next link command; also delete a directory that is
+  # left behind by Apple's compiler.  We do this before executing the actions.
+  rm -rf conftest.dSYM conftest_ipa8_conftest.oo
+  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+  as_fn_set_status $ac_retval
+
+} # ac_fn_cxx_try_link
+
+# ac_fn_c_check_header_mongrel LINENO HEADER VAR INCLUDES
+# -------------------------------------------------------
+# Tests whether HEADER exists, giving a warning if it cannot be compiled using
+# the include files in INCLUDES and setting the cache variable VAR
+# accordingly.
+ac_fn_c_check_header_mongrel ()
+{
+  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+  if eval \${$3+:} false; then :
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
+$as_echo_n "checking for $2... " >&6; }
+if eval \${$3+:} false; then :
+  $as_echo_n "(cached) " >&6
+fi
+eval ac_res=\$$3
+              { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+else
+  # Is the header compilable?
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 usability" >&5
+$as_echo_n "checking $2 usability... " >&6; }
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+$4
+#include <$2>
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  ac_header_compiler=yes
+else
+  ac_header_compiler=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_compiler" >&5
+$as_echo "$ac_header_compiler" >&6; }
+
+# Is the header present?
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 presence" >&5
+$as_echo_n "checking $2 presence... " >&6; }
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <$2>
+_ACEOF
+if ac_fn_c_try_cpp "$LINENO"; then :
+  ac_header_preproc=yes
+else
+  ac_header_preproc=no
+fi
+rm -f conftest.err conftest.i conftest.$ac_ext
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_preproc" >&5
+$as_echo "$ac_header_preproc" >&6; }
+
+# So?  What about this header?
+case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in #((
+  yes:no: )
+    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&5
+$as_echo "$as_me: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&2;}
+    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5
+$as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;}
+    ;;
+  no:yes:* )
+    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: present but cannot be compiled" >&5
+$as_echo "$as_me: WARNING: $2: present but cannot be compiled" >&2;}
+    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2:     check for missing prerequisite headers?" >&5
+$as_echo "$as_me: WARNING: $2:     check for missing prerequisite headers?" >&2;}
+    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: see the Autoconf documentation" >&5
+$as_echo "$as_me: WARNING: $2: see the Autoconf documentation" >&2;}
+    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2:     section \"Present But Cannot Be Compiled\"" >&5
+$as_echo "$as_me: WARNING: $2:     section \"Present But Cannot Be Compiled\"" >&2;}
+    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5
+$as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;}
+( $as_echo "## ------------------------------------------------------------------------- ##
+## Report this to https://bugs.freedesktop.org/enter_bug.cgi?product=poppler ##
+## ------------------------------------------------------------------------- ##"
+     ) | sed "s/^/$as_me: WARNING:     /" >&2
+    ;;
+esac
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
+$as_echo_n "checking for $2... " >&6; }
+if eval \${$3+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  eval "$3=\$ac_header_compiler"
+fi
+eval ac_res=\$$3
+              { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+fi
+  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+
+} # ac_fn_c_check_header_mongrel
+
+# ac_fn_cxx_check_decl LINENO SYMBOL VAR INCLUDES
+# -----------------------------------------------
+# Tests whether SYMBOL is declared in INCLUDES, setting cache variable VAR
+# accordingly.
+ac_fn_cxx_check_decl ()
+{
+  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+  as_decl_name=`echo $2|sed 's/ *(.*//'`
+  as_decl_use=`echo $2|sed -e 's/(/((/' -e 's/)/) 0&/' -e 's/,/) 0& (/g'`
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $as_decl_name is declared" >&5
+$as_echo_n "checking whether $as_decl_name is declared... " >&6; }
+if eval \${$3+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+$4
+int
+main ()
+{
+#ifndef $as_decl_name
+#ifdef __cplusplus
+  (void) $as_decl_use;
+#else
+  (void) $as_decl_name;
+#endif
+#endif
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_cxx_try_compile "$LINENO"; then :
+  eval "$3=yes"
+else
+  eval "$3=no"
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+eval ac_res=\$$3
+              { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+
+} # ac_fn_cxx_check_decl
+
+# ac_fn_cxx_check_func LINENO FUNC VAR
+# ------------------------------------
+# Tests whether FUNC exists, setting the cache variable VAR accordingly
+ac_fn_cxx_check_func ()
+{
+  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
+$as_echo_n "checking for $2... " >&6; }
+if eval \${$3+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+/* Define $2 to an innocuous variant, in case <limits.h> declares $2.
+   For example, HP-UX 11i <limits.h> declares gettimeofday.  */
+#define $2 innocuous_$2
+
+/* System header to define __stub macros and hopefully few prototypes,
+    which can conflict with char $2 (); below.
+    Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+    <limits.h> exists even on freestanding compilers.  */
+
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+
+#undef $2
+
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+char $2 ();
+/* The GNU C library defines this for functions which it implements
+    to always fail with ENOSYS.  Some functions are actually named
+    something starting with __ and the normal name is an alias.  */
+#if defined __stub_$2 || defined __stub___$2
+choke me
+#endif
+
+int
+main ()
+{
+return $2 ();
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_cxx_try_link "$LINENO"; then :
+  eval "$3=yes"
+else
+  eval "$3=no"
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+fi
+eval ac_res=\$$3
+              { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+
+} # ac_fn_cxx_check_func
+
+# ac_fn_cxx_check_header_mongrel LINENO HEADER VAR INCLUDES
+# ---------------------------------------------------------
+# Tests whether HEADER exists, giving a warning if it cannot be compiled using
+# the include files in INCLUDES and setting the cache variable VAR
+# accordingly.
+ac_fn_cxx_check_header_mongrel ()
+{
+  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+  if eval \${$3+:} false; then :
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
+$as_echo_n "checking for $2... " >&6; }
+if eval \${$3+:} false; then :
+  $as_echo_n "(cached) " >&6
+fi
+eval ac_res=\$$3
+              { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+else
+  # Is the header compilable?
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 usability" >&5
+$as_echo_n "checking $2 usability... " >&6; }
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+$4
+#include <$2>
+_ACEOF
+if ac_fn_cxx_try_compile "$LINENO"; then :
+  ac_header_compiler=yes
+else
+  ac_header_compiler=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_compiler" >&5
+$as_echo "$ac_header_compiler" >&6; }
+
+# Is the header present?
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 presence" >&5
+$as_echo_n "checking $2 presence... " >&6; }
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <$2>
+_ACEOF
+if ac_fn_cxx_try_cpp "$LINENO"; then :
+  ac_header_preproc=yes
+else
+  ac_header_preproc=no
+fi
+rm -f conftest.err conftest.i conftest.$ac_ext
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_preproc" >&5
+$as_echo "$ac_header_preproc" >&6; }
+
+# So?  What about this header?
+case $ac_header_compiler:$ac_header_preproc:$ac_cxx_preproc_warn_flag in #((
+  yes:no: )
+    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&5
+$as_echo "$as_me: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&2;}
+    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5
+$as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;}
+    ;;
+  no:yes:* )
+    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: present but cannot be compiled" >&5
+$as_echo "$as_me: WARNING: $2: present but cannot be compiled" >&2;}
+    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2:     check for missing prerequisite headers?" >&5
+$as_echo "$as_me: WARNING: $2:     check for missing prerequisite headers?" >&2;}
+    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: see the Autoconf documentation" >&5
+$as_echo "$as_me: WARNING: $2: see the Autoconf documentation" >&2;}
+    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2:     section \"Present But Cannot Be Compiled\"" >&5
+$as_echo "$as_me: WARNING: $2:     section \"Present But Cannot Be Compiled\"" >&2;}
+    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5
+$as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;}
+( $as_echo "## ------------------------------------------------------------------------- ##
+## Report this to https://bugs.freedesktop.org/enter_bug.cgi?product=poppler ##
+## ------------------------------------------------------------------------- ##"
+     ) | sed "s/^/$as_me: WARNING:     /" >&2
+    ;;
+esac
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
+$as_echo_n "checking for $2... " >&6; }
+if eval \${$3+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  eval "$3=\$ac_header_compiler"
+fi
+eval ac_res=\$$3
+              { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+fi
+  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+
+} # ac_fn_cxx_check_header_mongrel
+cat >config.log <<_ACEOF
+This file contains any messages produced by compilers while
+running configure, to aid debugging if configure makes a mistake.
+
+It was created by poppler $as_me 0.20.4, which was
+generated by GNU Autoconf 2.69.  Invocation command line was
+
+  $ $0 $@
+
+_ACEOF
+exec 5>>config.log
+{
+cat <<_ASUNAME
+## --------- ##
+## Platform. ##
+## --------- ##
+
+hostname = `(hostname || uname -n) 2>/dev/null | sed 1q`
+uname -m = `(uname -m) 2>/dev/null || echo unknown`
+uname -r = `(uname -r) 2>/dev/null || echo unknown`
+uname -s = `(uname -s) 2>/dev/null || echo unknown`
+uname -v = `(uname -v) 2>/dev/null || echo unknown`
+
+/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown`
+/bin/uname -X     = `(/bin/uname -X) 2>/dev/null     || echo unknown`
+
+/bin/arch              = `(/bin/arch) 2>/dev/null              || echo unknown`
+/usr/bin/arch -k       = `(/usr/bin/arch -k) 2>/dev/null       || echo unknown`
+/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown`
+/usr/bin/hostinfo      = `(/usr/bin/hostinfo) 2>/dev/null      || echo unknown`
+/bin/machine           = `(/bin/machine) 2>/dev/null           || echo unknown`
+/usr/bin/oslevel       = `(/usr/bin/oslevel) 2>/dev/null       || echo unknown`
+/bin/universe          = `(/bin/universe) 2>/dev/null          || echo unknown`
+
+_ASUNAME
+
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    $as_echo "PATH: $as_dir"
+  done
+IFS=$as_save_IFS
+
+} >&5
+
+cat >&5 <<_ACEOF
+
+
+## ----------- ##
+## Core tests. ##
+## ----------- ##
+
+_ACEOF
+
+
+# Keep a trace of the command line.
+# Strip out --no-create and --no-recursion so they do not pile up.
+# Strip out --silent because we don't want to record it for future runs.
+# Also quote any args containing shell meta-characters.
+# Make two passes to allow for proper duplicate-argument suppression.
+ac_configure_args=
+ac_configure_args0=
+ac_configure_args1=
+ac_must_keep_next=false
+for ac_pass in 1 2
+do
+  for ac_arg
+  do
+    case $ac_arg in
+    -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;;
+    -q | -quiet | --quiet | --quie | --qui | --qu | --q \
+    | -silent | --silent | --silen | --sile | --sil)
+      continue ;;
+    *\'*)
+      ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;;
+    esac
+    case $ac_pass in
+    1) as_fn_append ac_configure_args0 " '$ac_arg'" ;;
+    2)
+      as_fn_append ac_configure_args1 " '$ac_arg'"
+      if test $ac_must_keep_next = true; then
+       ac_must_keep_next=false # Got value, back to normal.
+      else
+       case $ac_arg in
+         *=* | --config-cache | -C | -disable-* | --disable-* \
+         | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \
+         | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \
+         | -with-* | --with-* | -without-* | --without-* | --x)
+           case "$ac_configure_args0 " in
+             "$ac_configure_args1"*" '$ac_arg' "* ) continue ;;
+           esac
+           ;;
+         -* ) ac_must_keep_next=true ;;
+       esac
+      fi
+      as_fn_append ac_configure_args " '$ac_arg'"
+      ;;
+    esac
+  done
+done
+{ ac_configure_args0=; unset ac_configure_args0;}
+{ ac_configure_args1=; unset ac_configure_args1;}
+
+# When interrupted or exit'd, cleanup temporary files, and complete
+# config.log.  We remove comments because anyway the quotes in there
+# would cause problems or look ugly.
+# WARNING: Use '\'' to represent an apostrophe within the trap.
+# WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug.
+trap 'exit_status=$?
+  # Save into config.log some information that might help in debugging.
+  {
+    echo
+
+    $as_echo "## ---------------- ##
+## Cache variables. ##
+## ---------------- ##"
+    echo
+    # The following way of writing the cache mishandles newlines in values,
+(
+  for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do
+    eval ac_val=\$$ac_var
+    case $ac_val in #(
+    *${as_nl}*)
+      case $ac_var in #(
+      *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5
+$as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;;
+      esac
+      case $ac_var in #(
+      _ | IFS | as_nl) ;; #(
+      BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #(
+      *) { eval $ac_var=; unset $ac_var;} ;;
+      esac ;;
+    esac
+  done
+  (set) 2>&1 |
+    case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #(
+    *${as_nl}ac_space=\ *)
+      sed -n \
+       "s/'\''/'\''\\\\'\'''\''/g;
+         s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p"
+      ;; #(
+    *)
+      sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p"
+      ;;
+    esac |
+    sort
+)
+    echo
+
+    $as_echo "## ----------------- ##
+## Output variables. ##
+## ----------------- ##"
+    echo
+    for ac_var in $ac_subst_vars
+    do
+      eval ac_val=\$$ac_var
+      case $ac_val in
+      *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;;
+      esac
+      $as_echo "$ac_var='\''$ac_val'\''"
+    done | sort
+    echo
+
+    if test -n "$ac_subst_files"; then
+      $as_echo "## ------------------- ##
+## File substitutions. ##
+## ------------------- ##"
+      echo
+      for ac_var in $ac_subst_files
+      do
+       eval ac_val=\$$ac_var
+       case $ac_val in
+       *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;;
+       esac
+       $as_echo "$ac_var='\''$ac_val'\''"
+      done | sort
+      echo
+    fi
+
+    if test -s confdefs.h; then
+      $as_echo "## ----------- ##
+## confdefs.h. ##
+## ----------- ##"
+      echo
+      cat confdefs.h
+      echo
+    fi
+    test "$ac_signal" != 0 &&
+      $as_echo "$as_me: caught signal $ac_signal"
+    $as_echo "$as_me: exit $exit_status"
+  } >&5
+  rm -f core *.core core.conftest.* &&
+    rm -f -r conftest* confdefs* conf$$* $ac_clean_files &&
+    exit $exit_status
+' 0
+for ac_signal in 1 2 13 15; do
+  trap 'ac_signal='$ac_signal'; as_fn_exit 1' $ac_signal
+done
+ac_signal=0
+
+# confdefs.h avoids OS command line length limits that DEFS can exceed.
+rm -f -r conftest* confdefs.h
+
+$as_echo "/* confdefs.h */" > confdefs.h
+
+# Predefined preprocessor variables.
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_NAME "$PACKAGE_NAME"
+_ACEOF
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_TARNAME "$PACKAGE_TARNAME"
+_ACEOF
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_VERSION "$PACKAGE_VERSION"
+_ACEOF
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_STRING "$PACKAGE_STRING"
+_ACEOF
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT"
+_ACEOF
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_URL "$PACKAGE_URL"
+_ACEOF
+
+
+# Let the site file select an alternate cache file if it wants to.
+# Prefer an explicitly selected file to automatically selected ones.
+ac_site_file1=NONE
+ac_site_file2=NONE
+if test -n "$CONFIG_SITE"; then
+  # We do not want a PATH search for config.site.
+  case $CONFIG_SITE in #((
+    -*)  ac_site_file1=./$CONFIG_SITE;;
+    */*) ac_site_file1=$CONFIG_SITE;;
+    *)   ac_site_file1=./$CONFIG_SITE;;
+  esac
+elif test "x$prefix" != xNONE; then
+  ac_site_file1=$prefix/share/config.site
+  ac_site_file2=$prefix/etc/config.site
+else
+  ac_site_file1=$ac_default_prefix/share/config.site
+  ac_site_file2=$ac_default_prefix/etc/config.site
+fi
+for ac_site_file in "$ac_site_file1" "$ac_site_file2"
+do
+  test "x$ac_site_file" = xNONE && continue
+  if test /dev/null != "$ac_site_file" && test -r "$ac_site_file"; then
+    { $as_echo "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5
+$as_echo "$as_me: loading site script $ac_site_file" >&6;}
+    sed 's/^/| /' "$ac_site_file" >&5
+    . "$ac_site_file" \
+      || { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "failed to load site script $ac_site_file
+See \`config.log' for more details" "$LINENO" 5; }
+  fi
+done
+
+if test -r "$cache_file"; then
+  # Some versions of bash will fail to source /dev/null (special files
+  # actually), so we avoid doing that.  DJGPP emulates it as a regular file.
+  if test /dev/null != "$cache_file" && test -f "$cache_file"; then
+    { $as_echo "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5
+$as_echo "$as_me: loading cache $cache_file" >&6;}
+    case $cache_file in
+      [\\/]* | ?:[\\/]* ) . "$cache_file";;
+      *)                      . "./$cache_file";;
+    esac
+  fi
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5
+$as_echo "$as_me: creating cache $cache_file" >&6;}
+  >$cache_file
+fi
+
+# Check that the precious variables saved in the cache have kept the same
+# value.
+ac_cache_corrupted=false
+for ac_var in $ac_precious_vars; do
+  eval ac_old_set=\$ac_cv_env_${ac_var}_set
+  eval ac_new_set=\$ac_env_${ac_var}_set
+  eval ac_old_val=\$ac_cv_env_${ac_var}_value
+  eval ac_new_val=\$ac_env_${ac_var}_value
+  case $ac_old_set,$ac_new_set in
+    set,)
+      { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5
+$as_echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;}
+      ac_cache_corrupted=: ;;
+    ,set)
+      { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was not set in the previous run" >&5
+$as_echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;}
+      ac_cache_corrupted=: ;;
+    ,);;
+    *)
+      if test "x$ac_old_val" != "x$ac_new_val"; then
+       # differences in whitespace do not lead to failure.
+       ac_old_val_w=`echo x $ac_old_val`
+       ac_new_val_w=`echo x $ac_new_val`
+       if test "$ac_old_val_w" != "$ac_new_val_w"; then
+         { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' has changed since the previous run:" >&5
+$as_echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;}
+         ac_cache_corrupted=:
+       else
+         { $as_echo "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5
+$as_echo "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;}
+         eval $ac_var=\$ac_old_val
+       fi
+       { $as_echo "$as_me:${as_lineno-$LINENO}:   former value:  \`$ac_old_val'" >&5
+$as_echo "$as_me:   former value:  \`$ac_old_val'" >&2;}
+       { $as_echo "$as_me:${as_lineno-$LINENO}:   current value: \`$ac_new_val'" >&5
+$as_echo "$as_me:   current value: \`$ac_new_val'" >&2;}
+      fi;;
+  esac
+  # Pass precious variables to config.status.
+  if test "$ac_new_set" = set; then
+    case $ac_new_val in
+    *\'*) ac_arg=$ac_var=`$as_echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;;
+    *) ac_arg=$ac_var=$ac_new_val ;;
+    esac
+    case " $ac_configure_args " in
+      *" '$ac_arg' "*) ;; # Avoid dups.  Use of quotes ensures accuracy.
+      *) as_fn_append ac_configure_args " '$ac_arg'" ;;
+    esac
+  fi
+done
+if $ac_cache_corrupted; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+  { $as_echo "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5
+$as_echo "$as_me: error: changes in the environment can compromise the build" >&2;}
+  as_fn_error $? "run \`make distclean' and/or \`rm $cache_file' and start over" "$LINENO" 5
+fi
+## -------------------- ##
+## Main body of script. ##
+## -------------------- ##
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+
+
+am__api_version='1.11'
+
+ac_aux_dir=
+for ac_dir in "$srcdir" "$srcdir/.." "$srcdir/../.."; do
+  if test -f "$ac_dir/install-sh"; then
+    ac_aux_dir=$ac_dir
+    ac_install_sh="$ac_aux_dir/install-sh -c"
+    break
+  elif test -f "$ac_dir/install.sh"; then
+    ac_aux_dir=$ac_dir
+    ac_install_sh="$ac_aux_dir/install.sh -c"
+    break
+  elif test -f "$ac_dir/shtool"; then
+    ac_aux_dir=$ac_dir
+    ac_install_sh="$ac_aux_dir/shtool install -c"
+    break
+  fi
+done
+if test -z "$ac_aux_dir"; then
+  as_fn_error $? "cannot find install-sh, install.sh, or shtool in \"$srcdir\" \"$srcdir/..\" \"$srcdir/../..\"" "$LINENO" 5
+fi
+
+# These three variables are undocumented and unsupported,
+# and are intended to be withdrawn in a future Autoconf release.
+# They can cause serious problems if a builder's source tree is in a directory
+# whose full name contains unusual characters.
+ac_config_guess="$SHELL $ac_aux_dir/config.guess"  # Please don't use this var.
+ac_config_sub="$SHELL $ac_aux_dir/config.sub"  # Please don't use this var.
+ac_configure="$SHELL $ac_aux_dir/configure"  # Please don't use this var.
+
+
+# Find a good install program.  We prefer a C program (faster),
+# so one script is as good as another.  But avoid the broken or
+# incompatible versions:
+# SysV /etc/install, /usr/sbin/install
+# SunOS /usr/etc/install
+# IRIX /sbin/install
+# AIX /bin/install
+# AmigaOS /C/install, which installs bootblocks on floppy discs
+# AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag
+# AFS /usr/afsws/bin/install, which mishandles nonexistent args
+# SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff"
+# OS/2's system install, which has a completely different semantic
+# ./install, which can be erroneously created by make from ./install.sh.
+# Reject install programs that cannot install multiple files.
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a BSD-compatible install" >&5
+$as_echo_n "checking for a BSD-compatible install... " >&6; }
+if test -z "$INSTALL"; then
+if ${ac_cv_path_install+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    # Account for people who put trailing slashes in PATH elements.
+case $as_dir/ in #((
+  ./ | .// | /[cC]/* | \
+  /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \
+  ?:[\\/]os2[\\/]install[\\/]* | ?:[\\/]OS2[\\/]INSTALL[\\/]* | \
+  /usr/ucb/* ) ;;
+  *)
+    # OSF1 and SCO ODT 3.0 have their own names for install.
+    # Don't use installbsd from OSF since it installs stuff as root
+    # by default.
+    for ac_prog in ginstall scoinst install; do
+      for ac_exec_ext in '' $ac_executable_extensions; do
+       if as_fn_executable_p "$as_dir/$ac_prog$ac_exec_ext"; then
+         if test $ac_prog = install &&
+           grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then
+           # AIX install.  It has an incompatible calling convention.
+           :
+         elif test $ac_prog = install &&
+           grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then
+           # program-specific install script used by HP pwplus--don't use.
+           :
+         else
+           rm -rf conftest.one conftest.two conftest.dir
+           echo one > conftest.one
+           echo two > conftest.two
+           mkdir conftest.dir
+           if "$as_dir/$ac_prog$ac_exec_ext" -c conftest.one conftest.two "`pwd`/conftest.dir" &&
+             test -s conftest.one && test -s conftest.two &&
+             test -s conftest.dir/conftest.one &&
+             test -s conftest.dir/conftest.two
+           then
+             ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c"
+             break 3
+           fi
+         fi
+       fi
+      done
+    done
+    ;;
+esac
+
+  done
+IFS=$as_save_IFS
+
+rm -rf conftest.one conftest.two conftest.dir
+
+fi
+  if test "${ac_cv_path_install+set}" = set; then
+    INSTALL=$ac_cv_path_install
+  else
+    # As a last resort, use the slow shell script.  Don't cache a
+    # value for INSTALL within a source directory, because that will
+    # break other packages using the cache if that directory is
+    # removed, or if the value is a relative name.
+    INSTALL=$ac_install_sh
+  fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $INSTALL" >&5
+$as_echo "$INSTALL" >&6; }
+
+# Use test -z because SunOS4 sh mishandles braces in ${var-val}.
+# It thinks the first close brace ends the variable substitution.
+test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}'
+
+test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}'
+
+test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644'
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether build environment is sane" >&5
+$as_echo_n "checking whether build environment is sane... " >&6; }
+# Just in case
+sleep 1
+echo timestamp > conftest.file
+# Reject unsafe characters in $srcdir or the absolute working directory
+# name.  Accept space and tab only in the latter.
+am_lf='
+'
+case `pwd` in
+  *[\\\"\#\$\&\'\`$am_lf]*)
+    as_fn_error $? "unsafe absolute working directory name" "$LINENO" 5;;
+esac
+case $srcdir in
+  *[\\\"\#\$\&\'\`$am_lf\ \    ]*)
+    as_fn_error $? "unsafe srcdir value: \`$srcdir'" "$LINENO" 5;;
+esac
+
+# Do `set' in a subshell so we don't clobber the current shell's
+# arguments.  Must try -L first in case configure is actually a
+# symlink; some systems play weird games with the mod time of symlinks
+# (eg FreeBSD returns the mod time of the symlink's containing
+# directory).
+if (
+   set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null`
+   if test "$*" = "X"; then
+      # -L didn't work.
+      set X `ls -t "$srcdir/configure" conftest.file`
+   fi
+   rm -f conftest.file
+   if test "$*" != "X $srcdir/configure conftest.file" \
+      && test "$*" != "X conftest.file $srcdir/configure"; then
+
+      # If neither matched, then we have a broken ls.  This can happen
+      # if, for instance, CONFIG_SHELL is bash and it inherits a
+      # broken ls alias from the environment.  This has actually
+      # happened.  Such a system could not be considered "sane".
+      as_fn_error $? "ls -t appears to fail.  Make sure there is not a broken
+alias in your environment" "$LINENO" 5
+   fi
+
+   test "$2" = conftest.file
+   )
+then
+   # Ok.
+   :
+else
+   as_fn_error $? "newly created file is older than distributed files!
+Check your system clock" "$LINENO" 5
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+test "$program_prefix" != NONE &&
+  program_transform_name="s&^&$program_prefix&;$program_transform_name"
+# Use a double $ so make ignores it.
+test "$program_suffix" != NONE &&
+  program_transform_name="s&\$&$program_suffix&;$program_transform_name"
+# Double any \ or $.
+# By default was `s,x,x', remove it if useless.
+ac_script='s/[\\$]/&&/g;s/;s,x,x,$//'
+program_transform_name=`$as_echo "$program_transform_name" | sed "$ac_script"`
+
+# expand $ac_aux_dir to an absolute path
+am_aux_dir=`cd $ac_aux_dir && pwd`
+
+if test x"${MISSING+set}" != xset; then
+  case $am_aux_dir in
+  *\ * | *\    *)
+    MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;;
+  *)
+    MISSING="\${SHELL} $am_aux_dir/missing" ;;
+  esac
+fi
+# Use eval to expand $SHELL
+if eval "$MISSING --run true"; then
+  am_missing_run="$MISSING --run "
+else
+  am_missing_run=
+  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: \`missing' script is too old or missing" >&5
+$as_echo "$as_me: WARNING: \`missing' script is too old or missing" >&2;}
+fi
+
+if test x"${install_sh}" != xset; then
+  case $am_aux_dir in
+  *\ * | *\    *)
+    install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;;
+  *)
+    install_sh="\${SHELL} $am_aux_dir/install-sh"
+  esac
+fi
+
+# Installed binaries are usually stripped using `strip' when the user
+# run `make install-strip'.  However `strip' might not be the right
+# tool to use in cross-compilation environments, therefore Automake
+# will honor the `STRIP' environment variable to overrule this program.
+if test "$cross_compiling" != no; then
+  if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args.
+set dummy ${ac_tool_prefix}strip; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_STRIP+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$STRIP"; then
+  ac_cv_prog_STRIP="$STRIP" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_STRIP="${ac_tool_prefix}strip"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+STRIP=$ac_cv_prog_STRIP
+if test -n "$STRIP"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5
+$as_echo "$STRIP" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_STRIP"; then
+  ac_ct_STRIP=$STRIP
+  # Extract the first word of "strip", so it can be a program name with args.
+set dummy strip; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_STRIP+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$ac_ct_STRIP"; then
+  ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_ac_ct_STRIP="strip"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP
+if test -n "$ac_ct_STRIP"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5
+$as_echo "$ac_ct_STRIP" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+  if test "x$ac_ct_STRIP" = x; then
+    STRIP=":"
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    STRIP=$ac_ct_STRIP
+  fi
+else
+  STRIP="$ac_cv_prog_STRIP"
+fi
+
+fi
+INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s"
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a thread-safe mkdir -p" >&5
+$as_echo_n "checking for a thread-safe mkdir -p... " >&6; }
+if test -z "$MKDIR_P"; then
+  if ${ac_cv_path_mkdir+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH$PATH_SEPARATOR/opt/sfw/bin
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_prog in mkdir gmkdir; do
+        for ac_exec_ext in '' $ac_executable_extensions; do
+          as_fn_executable_p "$as_dir/$ac_prog$ac_exec_ext" || continue
+          case `"$as_dir/$ac_prog$ac_exec_ext" --version 2>&1` in #(
+            'mkdir (GNU coreutils) '* | \
+            'mkdir (coreutils) '* | \
+            'mkdir (fileutils) '4.1*)
+              ac_cv_path_mkdir=$as_dir/$ac_prog$ac_exec_ext
+              break 3;;
+          esac
+        done
+       done
+  done
+IFS=$as_save_IFS
+
+fi
+
+  test -d ./--version && rmdir ./--version
+  if test "${ac_cv_path_mkdir+set}" = set; then
+    MKDIR_P="$ac_cv_path_mkdir -p"
+  else
+    # As a last resort, use the slow shell script.  Don't cache a
+    # value for MKDIR_P within a source directory, because that will
+    # break other packages using the cache if that directory is
+    # removed, or if the value is a relative name.
+    MKDIR_P="$ac_install_sh -d"
+  fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $MKDIR_P" >&5
+$as_echo "$MKDIR_P" >&6; }
+
+mkdir_p="$MKDIR_P"
+case $mkdir_p in
+  [\\/$]* | ?:[\\/]*) ;;
+  */*) mkdir_p="\$(top_builddir)/$mkdir_p" ;;
+esac
+
+for ac_prog in gawk mawk nawk awk
+do
+  # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_AWK+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$AWK"; then
+  ac_cv_prog_AWK="$AWK" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_AWK="$ac_prog"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+AWK=$ac_cv_prog_AWK
+if test -n "$AWK"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AWK" >&5
+$as_echo "$AWK" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+  test -n "$AWK" && break
+done
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} sets \$(MAKE)" >&5
+$as_echo_n "checking whether ${MAKE-make} sets \$(MAKE)... " >&6; }
+set x ${MAKE-make}
+ac_make=`$as_echo "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'`
+if eval \${ac_cv_prog_make_${ac_make}_set+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat >conftest.make <<\_ACEOF
+SHELL = /bin/sh
+all:
+       @echo '@@@%%%=$(MAKE)=@@@%%%'
+_ACEOF
+# GNU make sometimes prints "make[1]: Entering ...", which would confuse us.
+case `${MAKE-make} -f conftest.make 2>/dev/null` in
+  *@@@%%%=?*=@@@%%%*)
+    eval ac_cv_prog_make_${ac_make}_set=yes;;
+  *)
+    eval ac_cv_prog_make_${ac_make}_set=no;;
+esac
+rm -f conftest.make
+fi
+if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+  SET_MAKE=
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+  SET_MAKE="MAKE=${MAKE-make}"
+fi
+
+rm -rf .tst 2>/dev/null
+mkdir .tst 2>/dev/null
+if test -d .tst; then
+  am__leading_dot=.
+else
+  am__leading_dot=_
+fi
+rmdir .tst 2>/dev/null
+
+if test "`cd $srcdir && pwd`" != "`pwd`"; then
+  # Use -I$(srcdir) only when $(srcdir) != ., so that make's output
+  # is not polluted with repeated "-I."
+  am__isrc=' -I$(srcdir)'
+  # test to see if srcdir already configured
+  if test -f $srcdir/config.status; then
+    as_fn_error $? "source directory already configured; run \"make distclean\" there first" "$LINENO" 5
+  fi
+fi
+
+# test whether we have cygpath
+if test -z "$CYGPATH_W"; then
+  if (cygpath --version) >/dev/null 2>/dev/null; then
+    CYGPATH_W='cygpath -w'
+  else
+    CYGPATH_W=echo
+  fi
+fi
+
+
+# Define the identity of the package.
+ PACKAGE='poppler'
+ VERSION='0.20.4'
+
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE "$PACKAGE"
+_ACEOF
+
+
+cat >>confdefs.h <<_ACEOF
+#define VERSION "$VERSION"
+_ACEOF
+
+# Some tools Automake needs.
+
+ACLOCAL=${ACLOCAL-"${am_missing_run}aclocal-${am__api_version}"}
+
+
+AUTOCONF=${AUTOCONF-"${am_missing_run}autoconf"}
+
+
+AUTOMAKE=${AUTOMAKE-"${am_missing_run}automake-${am__api_version}"}
+
+
+AUTOHEADER=${AUTOHEADER-"${am_missing_run}autoheader"}
+
+
+MAKEINFO=${MAKEINFO-"${am_missing_run}makeinfo"}
+
+# We need awk for the "check" target.  The system "awk" is bad on
+# some platforms.
+# Always define AMTAR for backward compatibility.  Yes, it's still used
+# in the wild :-(  We should find a proper way to deprecate it ...
+AMTAR='$${TAR-tar}'
+
+am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -'
+
+
+
+
+
+# Check whether --enable-silent-rules was given.
+if test "${enable_silent_rules+set}" = set; then :
+  enableval=$enable_silent_rules;
+fi
+
+case $enable_silent_rules in
+yes) AM_DEFAULT_VERBOSITY=0;;
+no)  AM_DEFAULT_VERBOSITY=1;;
+*)   AM_DEFAULT_VERBOSITY=0;;
+esac
+am_make=${MAKE-make}
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $am_make supports nested variables" >&5
+$as_echo_n "checking whether $am_make supports nested variables... " >&6; }
+if ${am_cv_make_support_nested_variables+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if $as_echo 'TRUE=$(BAR$(V))
+BAR0=false
+BAR1=true
+V=1
+am__doit:
+       @$(TRUE)
+.PHONY: am__doit' | $am_make -f - >/dev/null 2>&1; then
+  am_cv_make_support_nested_variables=yes
+else
+  am_cv_make_support_nested_variables=no
+fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_make_support_nested_variables" >&5
+$as_echo "$am_cv_make_support_nested_variables" >&6; }
+if test $am_cv_make_support_nested_variables = yes; then
+    AM_V='$(V)'
+  AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)'
+else
+  AM_V=$AM_DEFAULT_VERBOSITY
+  AM_DEFAULT_V=$AM_DEFAULT_VERBOSITY
+fi
+AM_BACKSLASH='\'
+
+ac_config_headers="$ac_config_headers config.h"
+
+ac_config_headers="$ac_config_headers poppler/poppler-config.h"
+
+DEPDIR="${am__leading_dot}deps"
+
+ac_config_commands="$ac_config_commands depfiles"
+
+
+am_make=${MAKE-make}
+cat > confinc << 'END'
+am__doit:
+       @echo this is the am__doit target
+.PHONY: am__doit
+END
+# If we don't find an include directive, just comment out the code.
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for style of include used by $am_make" >&5
+$as_echo_n "checking for style of include used by $am_make... " >&6; }
+am__include="#"
+am__quote=
+_am_result=none
+# First try GNU make style include.
+echo "include confinc" > confmf
+# Ignore all kinds of additional output from `make'.
+case `$am_make -s -f confmf 2> /dev/null` in #(
+*the\ am__doit\ target*)
+  am__include=include
+  am__quote=
+  _am_result=GNU
+  ;;
+esac
+# Now try BSD make style include.
+if test "$am__include" = "#"; then
+   echo '.include "confinc"' > confmf
+   case `$am_make -s -f confmf 2> /dev/null` in #(
+   *the\ am__doit\ target*)
+     am__include=.include
+     am__quote="\""
+     _am_result=BSD
+     ;;
+   esac
+fi
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $_am_result" >&5
+$as_echo "$_am_result" >&6; }
+rm -f confinc confmf
+
+# Check whether --enable-dependency-tracking was given.
+if test "${enable_dependency_tracking+set}" = set; then :
+  enableval=$enable_dependency_tracking;
+fi
+
+if test "x$enable_dependency_tracking" != xno; then
+  am_depcomp="$ac_aux_dir/depcomp"
+  AMDEPBACKSLASH='\'
+  am__nodep='_no'
+fi
+ if test "x$enable_dependency_tracking" != xno; then
+  AMDEP_TRUE=
+  AMDEP_FALSE='#'
+else
+  AMDEP_TRUE='#'
+  AMDEP_FALSE=
+fi
+
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args.
+set dummy ${ac_tool_prefix}gcc; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_CC+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$CC"; then
+  ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_CC="${ac_tool_prefix}gcc"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
+$as_echo "$CC" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_CC"; then
+  ac_ct_CC=$CC
+  # Extract the first word of "gcc", so it can be a program name with args.
+set dummy gcc; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_CC+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$ac_ct_CC"; then
+  ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_ac_ct_CC="gcc"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_CC=$ac_cv_prog_ac_ct_CC
+if test -n "$ac_ct_CC"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5
+$as_echo "$ac_ct_CC" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+  if test "x$ac_ct_CC" = x; then
+    CC=""
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    CC=$ac_ct_CC
+  fi
+else
+  CC="$ac_cv_prog_CC"
+fi
+
+if test -z "$CC"; then
+          if test -n "$ac_tool_prefix"; then
+    # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args.
+set dummy ${ac_tool_prefix}cc; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_CC+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$CC"; then
+  ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_CC="${ac_tool_prefix}cc"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
+$as_echo "$CC" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+  fi
+fi
+if test -z "$CC"; then
+  # Extract the first word of "cc", so it can be a program name with args.
+set dummy cc; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_CC+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$CC"; then
+  ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+  ac_prog_rejected=no
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then
+       ac_prog_rejected=yes
+       continue
+     fi
+    ac_cv_prog_CC="cc"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+if test $ac_prog_rejected = yes; then
+  # We found a bogon in the path, so make sure we never use it.
+  set dummy $ac_cv_prog_CC
+  shift
+  if test $# != 0; then
+    # We chose a different compiler from the bogus one.
+    # However, it has the same basename, so the bogon will be chosen
+    # first if we set CC to just the basename; use the full file name.
+    shift
+    ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@"
+  fi
+fi
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
+$as_echo "$CC" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$CC"; then
+  if test -n "$ac_tool_prefix"; then
+  for ac_prog in cl.exe
+  do
+    # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args.
+set dummy $ac_tool_prefix$ac_prog; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_CC+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$CC"; then
+  ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_CC="$ac_tool_prefix$ac_prog"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
+$as_echo "$CC" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+    test -n "$CC" && break
+  done
+fi
+if test -z "$CC"; then
+  ac_ct_CC=$CC
+  for ac_prog in cl.exe
+do
+  # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_CC+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$ac_ct_CC"; then
+  ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_ac_ct_CC="$ac_prog"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_CC=$ac_cv_prog_ac_ct_CC
+if test -n "$ac_ct_CC"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5
+$as_echo "$ac_ct_CC" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+  test -n "$ac_ct_CC" && break
+done
+
+  if test "x$ac_ct_CC" = x; then
+    CC=""
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    CC=$ac_ct_CC
+  fi
+fi
+
+fi
+
+
+test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "no acceptable C compiler found in \$PATH
+See \`config.log' for more details" "$LINENO" 5; }
+
+# Provide some information about the compiler.
+$as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5
+set X $ac_compile
+ac_compiler=$2
+for ac_option in --version -v -V -qversion; do
+  { { ac_try="$ac_compiler $ac_option >&5"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_compiler $ac_option >&5") 2>conftest.err
+  ac_status=$?
+  if test -s conftest.err; then
+    sed '10a\
+... rest of stderr output deleted ...
+         10q' conftest.err >conftest.er1
+    cat conftest.er1 >&5
+  fi
+  rm -f conftest.er1 conftest.err
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }
+done
+
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+ac_clean_files_save=$ac_clean_files
+ac_clean_files="$ac_clean_files a.out a.out.dSYM a.exe b.out"
+# Try to create an executable without -o first, disregard a.out.
+# It will help us diagnose broken compilers, and finding out an intuition
+# of exeext.
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler works" >&5
+$as_echo_n "checking whether the C compiler works... " >&6; }
+ac_link_default=`$as_echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'`
+
+# The possible output files:
+ac_files="a.out conftest.exe conftest a.exe a_out.exe b.out conftest.*"
+
+ac_rmfiles=
+for ac_file in $ac_files
+do
+  case $ac_file in
+    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;;
+    * ) ac_rmfiles="$ac_rmfiles $ac_file";;
+  esac
+done
+rm -f $ac_rmfiles
+
+if { { ac_try="$ac_link_default"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_link_default") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then :
+  # Autoconf-2.13 could set the ac_cv_exeext variable to `no'.
+# So ignore a value of `no', otherwise this would lead to `EXEEXT = no'
+# in a Makefile.  We should not override ac_cv_exeext if it was cached,
+# so that the user can short-circuit this test for compilers unknown to
+# Autoconf.
+for ac_file in $ac_files ''
+do
+  test -f "$ac_file" || continue
+  case $ac_file in
+    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj )
+       ;;
+    [ab].out )
+       # We found the default executable, but exeext='' is most
+       # certainly right.
+       break;;
+    *.* )
+       if test "${ac_cv_exeext+set}" = set && test "$ac_cv_exeext" != no;
+       then :; else
+          ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'`
+       fi
+       # We set ac_cv_exeext here because the later test for it is not
+       # safe: cross compilers may not add the suffix if given an `-o'
+       # argument, so we may need to know it at that point already.
+       # Even if this section looks crufty: it has the advantage of
+       # actually working.
+       break;;
+    * )
+       break;;
+  esac
+done
+test "$ac_cv_exeext" = no && ac_cv_exeext=
+
+else
+  ac_file=''
+fi
+if test -z "$ac_file"; then :
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+$as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error 77 "C compiler cannot create executables
+See \`config.log' for more details" "$LINENO" 5; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler default output file name" >&5
+$as_echo_n "checking for C compiler default output file name... " >&6; }
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_file" >&5
+$as_echo "$ac_file" >&6; }
+ac_exeext=$ac_cv_exeext
+
+rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out
+ac_clean_files=$ac_clean_files_save
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of executables" >&5
+$as_echo_n "checking for suffix of executables... " >&6; }
+if { { ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_link") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then :
+  # If both `conftest.exe' and `conftest' are `present' (well, observable)
+# catch `conftest.exe'.  For instance with Cygwin, `ls conftest' will
+# work properly (i.e., refer to `conftest.exe'), while it won't with
+# `rm'.
+for ac_file in conftest.exe conftest conftest.*; do
+  test -f "$ac_file" || continue
+  case $ac_file in
+    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;;
+    *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'`
+         break;;
+    * ) break;;
+  esac
+done
+else
+  { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "cannot compute suffix of executables: cannot compile and link
+See \`config.log' for more details" "$LINENO" 5; }
+fi
+rm -f conftest conftest$ac_cv_exeext
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5
+$as_echo "$ac_cv_exeext" >&6; }
+
+rm -f conftest.$ac_ext
+EXEEXT=$ac_cv_exeext
+ac_exeext=$EXEEXT
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <stdio.h>
+int
+main ()
+{
+FILE *f = fopen ("conftest.out", "w");
+ return ferror (f) || fclose (f) != 0;
+
+  ;
+  return 0;
+}
+_ACEOF
+ac_clean_files="$ac_clean_files conftest.out"
+# Check that the compiler produces executables we can run.  If not, either
+# the compiler is broken, or we cross compile.
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling" >&5
+$as_echo_n "checking whether we are cross compiling... " >&6; }
+if test "$cross_compiling" != yes; then
+  { { ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_link") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }
+  if { ac_try='./conftest$ac_cv_exeext'
+  { { case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; }; then
+    cross_compiling=no
+  else
+    if test "$cross_compiling" = maybe; then
+       cross_compiling=yes
+    else
+       { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "cannot run C compiled programs.
+If you meant to cross compile, use \`--host'.
+See \`config.log' for more details" "$LINENO" 5; }
+    fi
+  fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $cross_compiling" >&5
+$as_echo "$cross_compiling" >&6; }
+
+rm -f conftest.$ac_ext conftest$ac_cv_exeext conftest.out
+ac_clean_files=$ac_clean_files_save
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5
+$as_echo_n "checking for suffix of object files... " >&6; }
+if ${ac_cv_objext+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.o conftest.obj
+if { { ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_compile") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then :
+  for ac_file in conftest.o conftest.obj conftest.*; do
+  test -f "$ac_file" || continue;
+  case $ac_file in
+    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM ) ;;
+    *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'`
+       break;;
+  esac
+done
+else
+  $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "cannot compute suffix of object files: cannot compile
+See \`config.log' for more details" "$LINENO" 5; }
+fi
+rm -f conftest.$ac_cv_objext conftest.$ac_ext
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext" >&5
+$as_echo "$ac_cv_objext" >&6; }
+OBJEXT=$ac_cv_objext
+ac_objext=$OBJEXT
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5
+$as_echo_n "checking whether we are using the GNU C compiler... " >&6; }
+if ${ac_cv_c_compiler_gnu+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+#ifndef __GNUC__
+       choke me
+#endif
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  ac_compiler_gnu=yes
+else
+  ac_compiler_gnu=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+ac_cv_c_compiler_gnu=$ac_compiler_gnu
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5
+$as_echo "$ac_cv_c_compiler_gnu" >&6; }
+if test $ac_compiler_gnu = yes; then
+  GCC=yes
+else
+  GCC=
+fi
+ac_test_CFLAGS=${CFLAGS+set}
+ac_save_CFLAGS=$CFLAGS
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5
+$as_echo_n "checking whether $CC accepts -g... " >&6; }
+if ${ac_cv_prog_cc_g+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_save_c_werror_flag=$ac_c_werror_flag
+   ac_c_werror_flag=yes
+   ac_cv_prog_cc_g=no
+   CFLAGS="-g"
+   cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  ac_cv_prog_cc_g=yes
+else
+  CFLAGS=""
+      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+
+else
+  ac_c_werror_flag=$ac_save_c_werror_flag
+        CFLAGS="-g"
+        cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  ac_cv_prog_cc_g=yes
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+   ac_c_werror_flag=$ac_save_c_werror_flag
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5
+$as_echo "$ac_cv_prog_cc_g" >&6; }
+if test "$ac_test_CFLAGS" = set; then
+  CFLAGS=$ac_save_CFLAGS
+elif test $ac_cv_prog_cc_g = yes; then
+  if test "$GCC" = yes; then
+    CFLAGS="-g -O2"
+  else
+    CFLAGS="-g"
+  fi
+else
+  if test "$GCC" = yes; then
+    CFLAGS="-O2"
+  else
+    CFLAGS=
+  fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5
+$as_echo_n "checking for $CC option to accept ISO C89... " >&6; }
+if ${ac_cv_prog_cc_c89+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_cv_prog_cc_c89=no
+ac_save_CC=$CC
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <stdarg.h>
+#include <stdio.h>
+struct stat;
+/* Most of the following tests are stolen from RCS 5.7's src/conf.sh.  */
+struct buf { int x; };
+FILE * (*rcsopen) (struct buf *, struct stat *, int);
+static char *e (p, i)
+     char **p;
+     int i;
+{
+  return p[i];
+}
+static char *f (char * (*g) (char **, int), char **p, ...)
+{
+  char *s;
+  va_list v;
+  va_start (v,p);
+  s = g (p, va_arg (v,int));
+  va_end (v);
+  return s;
+}
+
+/* OSF 4.0 Compaq cc is some sort of almost-ANSI by default.  It has
+   function prototypes and stuff, but not '\xHH' hex character constants.
+   These don't provoke an error unfortunately, instead are silently treated
+   as 'x'.  The following induces an error, until -std is added to get
+   proper ANSI mode.  Curiously '\x00'!='x' always comes out true, for an
+   array size at least.  It's necessary to write '\x00'==0 to get something
+   that's true only with -std.  */
+int osf4_cc_array ['\x00' == 0 ? 1 : -1];
+
+/* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters
+   inside strings and character constants.  */
+#define FOO(x) 'x'
+int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1];
+
+int test (int i, double x);
+struct s1 {int (*f) (int a);};
+struct s2 {int (*f) (double a);};
+int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int);
+int argc;
+char **argv;
+int
+main ()
+{
+return f (e, argv, 0) != argv[0]  ||  f (e, argv, 1) != argv[1];
+  ;
+  return 0;
+}
+_ACEOF
+for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \
+       -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__"
+do
+  CC="$ac_save_CC $ac_arg"
+  if ac_fn_c_try_compile "$LINENO"; then :
+  ac_cv_prog_cc_c89=$ac_arg
+fi
+rm -f core conftest.err conftest.$ac_objext
+  test "x$ac_cv_prog_cc_c89" != "xno" && break
+done
+rm -f conftest.$ac_ext
+CC=$ac_save_CC
+
+fi
+# AC_CACHE_VAL
+case "x$ac_cv_prog_cc_c89" in
+  x)
+    { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5
+$as_echo "none needed" >&6; } ;;
+  xno)
+    { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5
+$as_echo "unsupported" >&6; } ;;
+  *)
+    CC="$CC $ac_cv_prog_cc_c89"
+    { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5
+$as_echo "$ac_cv_prog_cc_c89" >&6; } ;;
+esac
+if test "x$ac_cv_prog_cc_c89" != xno; then :
+
+fi
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+depcc="$CC"   am_compiler_list=
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5
+$as_echo_n "checking dependency style of $depcc... " >&6; }
+if ${am_cv_CC_dependencies_compiler_type+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then
+  # We make a subdir and do the tests there.  Otherwise we can end up
+  # making bogus files that we don't know about and never remove.  For
+  # instance it was reported that on HP-UX the gcc test will end up
+  # making a dummy file named `D' -- because `-MD' means `put the output
+  # in D'.
+  rm -rf conftest.dir
+  mkdir conftest.dir
+  # Copy depcomp to subdir because otherwise we won't find it if we're
+  # using a relative directory.
+  cp "$am_depcomp" conftest.dir
+  cd conftest.dir
+  # We will build objects and dependencies in a subdirectory because
+  # it helps to detect inapplicable dependency modes.  For instance
+  # both Tru64's cc and ICC support -MD to output dependencies as a
+  # side effect of compilation, but ICC will put the dependencies in
+  # the current directory while Tru64 will put them in the object
+  # directory.
+  mkdir sub
+
+  am_cv_CC_dependencies_compiler_type=none
+  if test "$am_compiler_list" = ""; then
+     am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp`
+  fi
+  am__universal=false
+  case " $depcc " in #(
+     *\ -arch\ *\ -arch\ *) am__universal=true ;;
+     esac
+
+  for depmode in $am_compiler_list; do
+    # Setup a source with many dependencies, because some compilers
+    # like to wrap large dependency lists on column 80 (with \), and
+    # we should not choose a depcomp mode which is confused by this.
+    #
+    # We need to recreate these files for each test, as the compiler may
+    # overwrite some of them when testing with obscure command lines.
+    # This happens at least with the AIX C compiler.
+    : > sub/conftest.c
+    for i in 1 2 3 4 5 6; do
+      echo '#include "conftst'$i'.h"' >> sub/conftest.c
+      # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with
+      # Solaris 8's {/usr,}/bin/sh.
+      touch sub/conftst$i.h
+    done
+    echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf
+
+    # We check with `-c' and `-o' for the sake of the "dashmstdout"
+    # mode.  It turns out that the SunPro C++ compiler does not properly
+    # handle `-M -o', and we need to detect this.  Also, some Intel
+    # versions had trouble with output in subdirs
+    am__obj=sub/conftest.${OBJEXT-o}
+    am__minus_obj="-o $am__obj"
+    case $depmode in
+    gcc)
+      # This depmode causes a compiler race in universal mode.
+      test "$am__universal" = false || continue
+      ;;
+    nosideeffect)
+      # after this tag, mechanisms are not by side-effect, so they'll
+      # only be used when explicitly requested
+      if test "x$enable_dependency_tracking" = xyes; then
+       continue
+      else
+       break
+      fi
+      ;;
+    msvc7 | msvc7msys | msvisualcpp | msvcmsys)
+      # This compiler won't grok `-c -o', but also, the minuso test has
+      # not run yet.  These depmodes are late enough in the game, and
+      # so weak that their functioning should not be impacted.
+      am__obj=conftest.${OBJEXT-o}
+      am__minus_obj=
+      ;;
+    none) break ;;
+    esac
+    if depmode=$depmode \
+       source=sub/conftest.c object=$am__obj \
+       depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \
+       $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \
+         >/dev/null 2>conftest.err &&
+       grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 &&
+       grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 &&
+       grep $am__obj sub/conftest.Po > /dev/null 2>&1 &&
+       ${MAKE-make} -s -f confmf > /dev/null 2>&1; then
+      # icc doesn't choke on unknown options, it will just issue warnings
+      # or remarks (even with -Werror).  So we grep stderr for any message
+      # that says an option was ignored or not supported.
+      # When given -MP, icc 7.0 and 7.1 complain thusly:
+      #   icc: Command line warning: ignoring option '-M'; no argument required
+      # The diagnosis changed in icc 8.0:
+      #   icc: Command line remark: option '-MP' not supported
+      if (grep 'ignoring option' conftest.err ||
+          grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else
+        am_cv_CC_dependencies_compiler_type=$depmode
+        break
+      fi
+    fi
+  done
+
+  cd ..
+  rm -rf conftest.dir
+else
+  am_cv_CC_dependencies_compiler_type=none
+fi
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CC_dependencies_compiler_type" >&5
+$as_echo "$am_cv_CC_dependencies_compiler_type" >&6; }
+CCDEPMODE=depmode=$am_cv_CC_dependencies_compiler_type
+
+ if
+  test "x$enable_dependency_tracking" != xno \
+  && test "$am_cv_CC_dependencies_compiler_type" = gcc3; then
+  am__fastdepCC_TRUE=
+  am__fastdepCC_FALSE='#'
+else
+  am__fastdepCC_TRUE='#'
+  am__fastdepCC_FALSE=
+fi
+
+
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C preprocessor" >&5
+$as_echo_n "checking how to run the C preprocessor... " >&6; }
+# On Suns, sometimes $CPP names a directory.
+if test -n "$CPP" && test -d "$CPP"; then
+  CPP=
+fi
+if test -z "$CPP"; then
+  if ${ac_cv_prog_CPP+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+      # Double quotes because CPP needs to be expanded
+    for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp"
+    do
+      ac_preproc_ok=false
+for ac_c_preproc_warn_flag in '' yes
+do
+  # Use a header file that comes with gcc, so configuring glibc
+  # with a fresh cross-compiler works.
+  # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+  # <limits.h> exists even on freestanding compilers.
+  # On the NeXT, cc -E runs the code through the compiler's parser,
+  # not just through cpp. "Syntax error" is here to catch this case.
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+                    Syntax error
+_ACEOF
+if ac_fn_c_try_cpp "$LINENO"; then :
+
+else
+  # Broken: fails on valid input.
+continue
+fi
+rm -f conftest.err conftest.i conftest.$ac_ext
+
+  # OK, works on sane cases.  Now check whether nonexistent headers
+  # can be detected and how.
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <ac_nonexistent.h>
+_ACEOF
+if ac_fn_c_try_cpp "$LINENO"; then :
+  # Broken: success on invalid input.
+continue
+else
+  # Passes both tests.
+ac_preproc_ok=:
+break
+fi
+rm -f conftest.err conftest.i conftest.$ac_ext
+
+done
+# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
+rm -f conftest.i conftest.err conftest.$ac_ext
+if $ac_preproc_ok; then :
+  break
+fi
+
+    done
+    ac_cv_prog_CPP=$CPP
+
+fi
+  CPP=$ac_cv_prog_CPP
+else
+  ac_cv_prog_CPP=$CPP
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $CPP" >&5
+$as_echo "$CPP" >&6; }
+ac_preproc_ok=false
+for ac_c_preproc_warn_flag in '' yes
+do
+  # Use a header file that comes with gcc, so configuring glibc
+  # with a fresh cross-compiler works.
+  # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+  # <limits.h> exists even on freestanding compilers.
+  # On the NeXT, cc -E runs the code through the compiler's parser,
+  # not just through cpp. "Syntax error" is here to catch this case.
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+                    Syntax error
+_ACEOF
+if ac_fn_c_try_cpp "$LINENO"; then :
+
+else
+  # Broken: fails on valid input.
+continue
+fi
+rm -f conftest.err conftest.i conftest.$ac_ext
+
+  # OK, works on sane cases.  Now check whether nonexistent headers
+  # can be detected and how.
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <ac_nonexistent.h>
+_ACEOF
+if ac_fn_c_try_cpp "$LINENO"; then :
+  # Broken: success on invalid input.
+continue
+else
+  # Passes both tests.
+ac_preproc_ok=:
+break
+fi
+rm -f conftest.err conftest.i conftest.$ac_ext
+
+done
+# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
+rm -f conftest.i conftest.err conftest.$ac_ext
+if $ac_preproc_ok; then :
+
+else
+  { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "C preprocessor \"$CPP\" fails sanity check
+See \`config.log' for more details" "$LINENO" 5; }
+fi
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for grep that handles long lines and -e" >&5
+$as_echo_n "checking for grep that handles long lines and -e... " >&6; }
+if ${ac_cv_path_GREP+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -z "$GREP"; then
+  ac_path_GREP_found=false
+  # Loop through the user's path and test for each of PROGNAME-LIST
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_prog in grep ggrep; do
+    for ac_exec_ext in '' $ac_executable_extensions; do
+      ac_path_GREP="$as_dir/$ac_prog$ac_exec_ext"
+      as_fn_executable_p "$ac_path_GREP" || continue
+# Check for GNU ac_path_GREP and select it if it is found.
+  # Check for GNU $ac_path_GREP
+case `"$ac_path_GREP" --version 2>&1` in
+*GNU*)
+  ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=:;;
+*)
+  ac_count=0
+  $as_echo_n 0123456789 >"conftest.in"
+  while :
+  do
+    cat "conftest.in" "conftest.in" >"conftest.tmp"
+    mv "conftest.tmp" "conftest.in"
+    cp "conftest.in" "conftest.nl"
+    $as_echo 'GREP' >> "conftest.nl"
+    "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break
+    diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break
+    as_fn_arith $ac_count + 1 && ac_count=$as_val
+    if test $ac_count -gt ${ac_path_GREP_max-0}; then
+      # Best one so far, save it but keep looking for a better one
+      ac_cv_path_GREP="$ac_path_GREP"
+      ac_path_GREP_max=$ac_count
+    fi
+    # 10*(2^10) chars as input seems more than enough
+    test $ac_count -gt 10 && break
+  done
+  rm -f conftest.in conftest.tmp conftest.nl conftest.out;;
+esac
+
+      $ac_path_GREP_found && break 3
+    done
+  done
+  done
+IFS=$as_save_IFS
+  if test -z "$ac_cv_path_GREP"; then
+    as_fn_error $? "no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5
+  fi
+else
+  ac_cv_path_GREP=$GREP
+fi
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_GREP" >&5
+$as_echo "$ac_cv_path_GREP" >&6; }
+ GREP="$ac_cv_path_GREP"
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for egrep" >&5
+$as_echo_n "checking for egrep... " >&6; }
+if ${ac_cv_path_EGREP+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if echo a | $GREP -E '(a|b)' >/dev/null 2>&1
+   then ac_cv_path_EGREP="$GREP -E"
+   else
+     if test -z "$EGREP"; then
+  ac_path_EGREP_found=false
+  # Loop through the user's path and test for each of PROGNAME-LIST
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_prog in egrep; do
+    for ac_exec_ext in '' $ac_executable_extensions; do
+      ac_path_EGREP="$as_dir/$ac_prog$ac_exec_ext"
+      as_fn_executable_p "$ac_path_EGREP" || continue
+# Check for GNU ac_path_EGREP and select it if it is found.
+  # Check for GNU $ac_path_EGREP
+case `"$ac_path_EGREP" --version 2>&1` in
+*GNU*)
+  ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;;
+*)
+  ac_count=0
+  $as_echo_n 0123456789 >"conftest.in"
+  while :
+  do
+    cat "conftest.in" "conftest.in" >"conftest.tmp"
+    mv "conftest.tmp" "conftest.in"
+    cp "conftest.in" "conftest.nl"
+    $as_echo 'EGREP' >> "conftest.nl"
+    "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break
+    diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break
+    as_fn_arith $ac_count + 1 && ac_count=$as_val
+    if test $ac_count -gt ${ac_path_EGREP_max-0}; then
+      # Best one so far, save it but keep looking for a better one
+      ac_cv_path_EGREP="$ac_path_EGREP"
+      ac_path_EGREP_max=$ac_count
+    fi
+    # 10*(2^10) chars as input seems more than enough
+    test $ac_count -gt 10 && break
+  done
+  rm -f conftest.in conftest.tmp conftest.nl conftest.out;;
+esac
+
+      $ac_path_EGREP_found && break 3
+    done
+  done
+  done
+IFS=$as_save_IFS
+  if test -z "$ac_cv_path_EGREP"; then
+    as_fn_error $? "no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5
+  fi
+else
+  ac_cv_path_EGREP=$EGREP
+fi
+
+   fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP" >&5
+$as_echo "$ac_cv_path_EGREP" >&6; }
+ EGREP="$ac_cv_path_EGREP"
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5
+$as_echo_n "checking for ANSI C header files... " >&6; }
+if ${ac_cv_header_stdc+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <stdlib.h>
+#include <stdarg.h>
+#include <string.h>
+#include <float.h>
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  ac_cv_header_stdc=yes
+else
+  ac_cv_header_stdc=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+
+if test $ac_cv_header_stdc = yes; then
+  # SunOS 4.x string.h does not declare mem*, contrary to ANSI.
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <string.h>
+
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+  $EGREP "memchr" >/dev/null 2>&1; then :
+
+else
+  ac_cv_header_stdc=no
+fi
+rm -f conftest*
+
+fi
+
+if test $ac_cv_header_stdc = yes; then
+  # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI.
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <stdlib.h>
+
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+  $EGREP "free" >/dev/null 2>&1; then :
+
+else
+  ac_cv_header_stdc=no
+fi
+rm -f conftest*
+
+fi
+
+if test $ac_cv_header_stdc = yes; then
+  # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi.
+  if test "$cross_compiling" = yes; then :
+  :
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <ctype.h>
+#include <stdlib.h>
+#if ((' ' & 0x0FF) == 0x020)
+# define ISLOWER(c) ('a' <= (c) && (c) <= 'z')
+# define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c))
+#else
+# define ISLOWER(c) \
+                  (('a' <= (c) && (c) <= 'i') \
+                    || ('j' <= (c) && (c) <= 'r') \
+                    || ('s' <= (c) && (c) <= 'z'))
+# define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c))
+#endif
+
+#define XOR(e, f) (((e) && !(f)) || (!(e) && (f)))
+int
+main ()
+{
+  int i;
+  for (i = 0; i < 256; i++)
+    if (XOR (islower (i), ISLOWER (i))
+       || toupper (i) != TOUPPER (i))
+      return 2;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_run "$LINENO"; then :
+
+else
+  ac_cv_header_stdc=no
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+  conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc" >&5
+$as_echo "$ac_cv_header_stdc" >&6; }
+if test $ac_cv_header_stdc = yes; then
+
+$as_echo "#define STDC_HEADERS 1" >>confdefs.h
+
+fi
+
+# On IRIX 5.3, sys/types and inttypes.h are conflicting.
+for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \
+                 inttypes.h stdint.h unistd.h
+do :
+  as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh`
+ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default
+"
+if eval test \"x\$"$as_ac_Header"\" = x"yes"; then :
+  cat >>confdefs.h <<_ACEOF
+#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1
+_ACEOF
+
+fi
+
+done
+
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether byte ordering is bigendian" >&5
+$as_echo_n "checking whether byte ordering is bigendian... " >&6; }
+if ${ac_cv_c_bigendian+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_cv_c_bigendian=unknown
+    # See if we're dealing with a universal compiler.
+    cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#ifndef __APPLE_CC__
+              not a universal capable compiler
+            #endif
+            typedef int dummy;
+
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+
+       # Check for potential -arch flags.  It is not universal unless
+       # there are at least two -arch flags with different values.
+       ac_arch=
+       ac_prev=
+       for ac_word in $CC $CFLAGS $CPPFLAGS $LDFLAGS; do
+        if test -n "$ac_prev"; then
+          case $ac_word in
+            i?86 | x86_64 | ppc | ppc64)
+              if test -z "$ac_arch" || test "$ac_arch" = "$ac_word"; then
+                ac_arch=$ac_word
+              else
+                ac_cv_c_bigendian=universal
+                break
+              fi
+              ;;
+          esac
+          ac_prev=
+        elif test "x$ac_word" = "x-arch"; then
+          ac_prev=arch
+        fi
+       done
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+    if test $ac_cv_c_bigendian = unknown; then
+      # See if sys/param.h defines the BYTE_ORDER macro.
+      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <sys/types.h>
+            #include <sys/param.h>
+
+int
+main ()
+{
+#if ! (defined BYTE_ORDER && defined BIG_ENDIAN \
+                    && defined LITTLE_ENDIAN && BYTE_ORDER && BIG_ENDIAN \
+                    && LITTLE_ENDIAN)
+             bogus endian macros
+            #endif
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  # It does; now see whether it defined to BIG_ENDIAN or not.
+        cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <sys/types.h>
+               #include <sys/param.h>
+
+int
+main ()
+{
+#if BYTE_ORDER != BIG_ENDIAN
+                not big endian
+               #endif
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  ac_cv_c_bigendian=yes
+else
+  ac_cv_c_bigendian=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+    fi
+    if test $ac_cv_c_bigendian = unknown; then
+      # See if <limits.h> defines _LITTLE_ENDIAN or _BIG_ENDIAN (e.g., Solaris).
+      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <limits.h>
+
+int
+main ()
+{
+#if ! (defined _LITTLE_ENDIAN || defined _BIG_ENDIAN)
+             bogus endian macros
+            #endif
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  # It does; now see whether it defined to _BIG_ENDIAN or not.
+        cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <limits.h>
+
+int
+main ()
+{
+#ifndef _BIG_ENDIAN
+                not big endian
+               #endif
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  ac_cv_c_bigendian=yes
+else
+  ac_cv_c_bigendian=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+    fi
+    if test $ac_cv_c_bigendian = unknown; then
+      # Compile a test program.
+      if test "$cross_compiling" = yes; then :
+  # Try to guess by grepping values from an object file.
+        cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+short int ascii_mm[] =
+                 { 0x4249, 0x4765, 0x6E44, 0x6961, 0x6E53, 0x7953, 0 };
+               short int ascii_ii[] =
+                 { 0x694C, 0x5454, 0x656C, 0x6E45, 0x6944, 0x6E61, 0 };
+               int use_ascii (int i) {
+                 return ascii_mm[i] + ascii_ii[i];
+               }
+               short int ebcdic_ii[] =
+                 { 0x89D3, 0xE3E3, 0x8593, 0x95C5, 0x89C4, 0x9581, 0 };
+               short int ebcdic_mm[] =
+                 { 0xC2C9, 0xC785, 0x95C4, 0x8981, 0x95E2, 0xA8E2, 0 };
+               int use_ebcdic (int i) {
+                 return ebcdic_mm[i] + ebcdic_ii[i];
+               }
+               extern int foo;
+
+int
+main ()
+{
+return use_ascii (foo) == use_ebcdic (foo);
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  if grep BIGenDianSyS conftest.$ac_objext >/dev/null; then
+             ac_cv_c_bigendian=yes
+           fi
+           if grep LiTTleEnDian conftest.$ac_objext >/dev/null ; then
+             if test "$ac_cv_c_bigendian" = unknown; then
+               ac_cv_c_bigendian=no
+             else
+               # finding both strings is unlikely to happen, but who knows?
+               ac_cv_c_bigendian=unknown
+             fi
+           fi
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+$ac_includes_default
+int
+main ()
+{
+
+            /* Are we little or big endian?  From Harbison&Steele.  */
+            union
+            {
+              long int l;
+              char c[sizeof (long int)];
+            } u;
+            u.l = 1;
+            return u.c[sizeof (long int) - 1] == 1;
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_run "$LINENO"; then :
+  ac_cv_c_bigendian=no
+else
+  ac_cv_c_bigendian=yes
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+  conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+    fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_bigendian" >&5
+$as_echo "$ac_cv_c_bigendian" >&6; }
+ case $ac_cv_c_bigendian in #(
+   yes)
+     $as_echo "#define WORDS_BIGENDIAN 1" >>confdefs.h
+;; #(
+   no)
+      ;; #(
+   universal)
+
+$as_echo "#define AC_APPLE_UNIVERSAL_BUILD 1" >>confdefs.h
+
+     ;; #(
+   *)
+     as_fn_error $? "unknown endianness
+ presetting ac_cv_c_bigendian=no (or yes) will help" "$LINENO" 5 ;;
+ esac
+
+
+# Make sure we can run config.sub.
+$SHELL "$ac_aux_dir/config.sub" sun4 >/dev/null 2>&1 ||
+  as_fn_error $? "cannot run $SHELL $ac_aux_dir/config.sub" "$LINENO" 5
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking build system type" >&5
+$as_echo_n "checking build system type... " >&6; }
+if ${ac_cv_build+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_build_alias=$build_alias
+test "x$ac_build_alias" = x &&
+  ac_build_alias=`$SHELL "$ac_aux_dir/config.guess"`
+test "x$ac_build_alias" = x &&
+  as_fn_error $? "cannot guess build type; you must specify one" "$LINENO" 5
+ac_cv_build=`$SHELL "$ac_aux_dir/config.sub" $ac_build_alias` ||
+  as_fn_error $? "$SHELL $ac_aux_dir/config.sub $ac_build_alias failed" "$LINENO" 5
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_build" >&5
+$as_echo "$ac_cv_build" >&6; }
+case $ac_cv_build in
+*-*-*) ;;
+*) as_fn_error $? "invalid value of canonical build" "$LINENO" 5;;
+esac
+build=$ac_cv_build
+ac_save_IFS=$IFS; IFS='-'
+set x $ac_cv_build
+shift
+build_cpu=$1
+build_vendor=$2
+shift; shift
+# Remember, the first character of IFS is used to create $*,
+# except with old shells:
+build_os=$*
+IFS=$ac_save_IFS
+case $build_os in *\ *) build_os=`echo "$build_os" | sed 's/ /-/g'`;; esac
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking host system type" >&5
+$as_echo_n "checking host system type... " >&6; }
+if ${ac_cv_host+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test "x$host_alias" = x; then
+  ac_cv_host=$ac_cv_build
+else
+  ac_cv_host=`$SHELL "$ac_aux_dir/config.sub" $host_alias` ||
+    as_fn_error $? "$SHELL $ac_aux_dir/config.sub $host_alias failed" "$LINENO" 5
+fi
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_host" >&5
+$as_echo "$ac_cv_host" >&6; }
+case $ac_cv_host in
+*-*-*) ;;
+*) as_fn_error $? "invalid value of canonical host" "$LINENO" 5;;
+esac
+host=$ac_cv_host
+ac_save_IFS=$IFS; IFS='-'
+set x $ac_cv_host
+shift
+host_cpu=$1
+host_vendor=$2
+shift; shift
+# Remember, the first character of IFS is used to create $*,
+# except with old shells:
+host_os=$*
+IFS=$ac_save_IFS
+case $host_os in *\ *) host_os=`echo "$host_os" | sed 's/ /-/g'`;; esac
+
+
+enable_win32_dll=yes
+
+case $host in
+*-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-cegcc*)
+  if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}as", so it can be a program name with args.
+set dummy ${ac_tool_prefix}as; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_AS+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$AS"; then
+  ac_cv_prog_AS="$AS" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_AS="${ac_tool_prefix}as"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+AS=$ac_cv_prog_AS
+if test -n "$AS"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AS" >&5
+$as_echo "$AS" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_AS"; then
+  ac_ct_AS=$AS
+  # Extract the first word of "as", so it can be a program name with args.
+set dummy as; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_AS+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$ac_ct_AS"; then
+  ac_cv_prog_ac_ct_AS="$ac_ct_AS" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_ac_ct_AS="as"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_AS=$ac_cv_prog_ac_ct_AS
+if test -n "$ac_ct_AS"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_AS" >&5
+$as_echo "$ac_ct_AS" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+  if test "x$ac_ct_AS" = x; then
+    AS="false"
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    AS=$ac_ct_AS
+  fi
+else
+  AS="$ac_cv_prog_AS"
+fi
+
+  if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}dlltool", so it can be a program name with args.
+set dummy ${ac_tool_prefix}dlltool; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_DLLTOOL+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$DLLTOOL"; then
+  ac_cv_prog_DLLTOOL="$DLLTOOL" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_DLLTOOL="${ac_tool_prefix}dlltool"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+DLLTOOL=$ac_cv_prog_DLLTOOL
+if test -n "$DLLTOOL"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DLLTOOL" >&5
+$as_echo "$DLLTOOL" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_DLLTOOL"; then
+  ac_ct_DLLTOOL=$DLLTOOL
+  # Extract the first word of "dlltool", so it can be a program name with args.
+set dummy dlltool; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_DLLTOOL+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$ac_ct_DLLTOOL"; then
+  ac_cv_prog_ac_ct_DLLTOOL="$ac_ct_DLLTOOL" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_ac_ct_DLLTOOL="dlltool"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_DLLTOOL=$ac_cv_prog_ac_ct_DLLTOOL
+if test -n "$ac_ct_DLLTOOL"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DLLTOOL" >&5
+$as_echo "$ac_ct_DLLTOOL" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+  if test "x$ac_ct_DLLTOOL" = x; then
+    DLLTOOL="false"
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    DLLTOOL=$ac_ct_DLLTOOL
+  fi
+else
+  DLLTOOL="$ac_cv_prog_DLLTOOL"
+fi
+
+  if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}objdump", so it can be a program name with args.
+set dummy ${ac_tool_prefix}objdump; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_OBJDUMP+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$OBJDUMP"; then
+  ac_cv_prog_OBJDUMP="$OBJDUMP" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_OBJDUMP="${ac_tool_prefix}objdump"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+OBJDUMP=$ac_cv_prog_OBJDUMP
+if test -n "$OBJDUMP"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OBJDUMP" >&5
+$as_echo "$OBJDUMP" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_OBJDUMP"; then
+  ac_ct_OBJDUMP=$OBJDUMP
+  # Extract the first word of "objdump", so it can be a program name with args.
+set dummy objdump; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_OBJDUMP+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$ac_ct_OBJDUMP"; then
+  ac_cv_prog_ac_ct_OBJDUMP="$ac_ct_OBJDUMP" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_ac_ct_OBJDUMP="objdump"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_OBJDUMP=$ac_cv_prog_ac_ct_OBJDUMP
+if test -n "$ac_ct_OBJDUMP"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OBJDUMP" >&5
+$as_echo "$ac_ct_OBJDUMP" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+  if test "x$ac_ct_OBJDUMP" = x; then
+    OBJDUMP="false"
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    OBJDUMP=$ac_ct_OBJDUMP
+  fi
+else
+  OBJDUMP="$ac_cv_prog_OBJDUMP"
+fi
+
+  ;;
+esac
+
+test -z "$AS" && AS=as
+
+
+
+
+
+test -z "$DLLTOOL" && DLLTOOL=dlltool
+
+
+
+
+
+test -z "$OBJDUMP" && OBJDUMP=objdump
+
+
+
+
+
+
+
+
+case `pwd` in
+  *\ * | *\    *)
+    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Libtool does not cope well with whitespace in \`pwd\`" >&5
+$as_echo "$as_me: WARNING: Libtool does not cope well with whitespace in \`pwd\`" >&2;} ;;
+esac
+
+
+
+macro_version='2.4.2'
+macro_revision='1.3337'
+
+
+
+
+
+
+
+
+
+
+
+
+
+ltmain="$ac_aux_dir/ltmain.sh"
+
+# Backslashify metacharacters that are still active within
+# double-quoted strings.
+sed_quote_subst='s/\(["`$\\]\)/\\\1/g'
+
+# Same as above, but do not quote variable references.
+double_quote_subst='s/\(["`\\]\)/\\\1/g'
+
+# Sed substitution to delay expansion of an escaped shell variable in a
+# double_quote_subst'ed string.
+delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g'
+
+# Sed substitution to delay expansion of an escaped single quote.
+delay_single_quote_subst='s/'\''/'\'\\\\\\\'\''/g'
+
+# Sed substitution to avoid accidental globbing in evaled expressions
+no_glob_subst='s/\*/\\\*/g'
+
+ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'
+ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO
+ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO$ECHO
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to print strings" >&5
+$as_echo_n "checking how to print strings... " >&6; }
+# Test print first, because it will be a builtin if present.
+if test "X`( print -r -- -n ) 2>/dev/null`" = X-n && \
+   test "X`print -r -- $ECHO 2>/dev/null`" = "X$ECHO"; then
+  ECHO='print -r --'
+elif test "X`printf %s $ECHO 2>/dev/null`" = "X$ECHO"; then
+  ECHO='printf %s\n'
+else
+  # Use this function as a fallback that always works.
+  func_fallback_echo ()
+  {
+    eval 'cat <<_LTECHO_EOF
+$1
+_LTECHO_EOF'
+  }
+  ECHO='func_fallback_echo'
+fi
+
+# func_echo_all arg...
+# Invoke $ECHO with all args, space-separated.
+func_echo_all ()
+{
+    $ECHO ""
+}
+
+case "$ECHO" in
+  printf*) { $as_echo "$as_me:${as_lineno-$LINENO}: result: printf" >&5
+$as_echo "printf" >&6; } ;;
+  print*) { $as_echo "$as_me:${as_lineno-$LINENO}: result: print -r" >&5
+$as_echo "print -r" >&6; } ;;
+  *) { $as_echo "$as_me:${as_lineno-$LINENO}: result: cat" >&5
+$as_echo "cat" >&6; } ;;
+esac
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a sed that does not truncate output" >&5
+$as_echo_n "checking for a sed that does not truncate output... " >&6; }
+if ${ac_cv_path_SED+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+            ac_script=s/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb/
+     for ac_i in 1 2 3 4 5 6 7; do
+       ac_script="$ac_script$as_nl$ac_script"
+     done
+     echo "$ac_script" 2>/dev/null | sed 99q >conftest.sed
+     { ac_script=; unset ac_script;}
+     if test -z "$SED"; then
+  ac_path_SED_found=false
+  # Loop through the user's path and test for each of PROGNAME-LIST
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_prog in sed gsed; do
+    for ac_exec_ext in '' $ac_executable_extensions; do
+      ac_path_SED="$as_dir/$ac_prog$ac_exec_ext"
+      as_fn_executable_p "$ac_path_SED" || continue
+# Check for GNU ac_path_SED and select it if it is found.
+  # Check for GNU $ac_path_SED
+case `"$ac_path_SED" --version 2>&1` in
+*GNU*)
+  ac_cv_path_SED="$ac_path_SED" ac_path_SED_found=:;;
+*)
+  ac_count=0
+  $as_echo_n 0123456789 >"conftest.in"
+  while :
+  do
+    cat "conftest.in" "conftest.in" >"conftest.tmp"
+    mv "conftest.tmp" "conftest.in"
+    cp "conftest.in" "conftest.nl"
+    $as_echo '' >> "conftest.nl"
+    "$ac_path_SED" -f conftest.sed < "conftest.nl" >"conftest.out" 2>/dev/null || break
+    diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break
+    as_fn_arith $ac_count + 1 && ac_count=$as_val
+    if test $ac_count -gt ${ac_path_SED_max-0}; then
+      # Best one so far, save it but keep looking for a better one
+      ac_cv_path_SED="$ac_path_SED"
+      ac_path_SED_max=$ac_count
+    fi
+    # 10*(2^10) chars as input seems more than enough
+    test $ac_count -gt 10 && break
+  done
+  rm -f conftest.in conftest.tmp conftest.nl conftest.out;;
+esac
+
+      $ac_path_SED_found && break 3
+    done
+  done
+  done
+IFS=$as_save_IFS
+  if test -z "$ac_cv_path_SED"; then
+    as_fn_error $? "no acceptable sed could be found in \$PATH" "$LINENO" 5
+  fi
+else
+  ac_cv_path_SED=$SED
+fi
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_SED" >&5
+$as_echo "$ac_cv_path_SED" >&6; }
+ SED="$ac_cv_path_SED"
+  rm -f conftest.sed
+
+test -z "$SED" && SED=sed
+Xsed="$SED -e 1s/^X//"
+
+
+
+
+
+
+
+
+
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for fgrep" >&5
+$as_echo_n "checking for fgrep... " >&6; }
+if ${ac_cv_path_FGREP+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if echo 'ab*c' | $GREP -F 'ab*c' >/dev/null 2>&1
+   then ac_cv_path_FGREP="$GREP -F"
+   else
+     if test -z "$FGREP"; then
+  ac_path_FGREP_found=false
+  # Loop through the user's path and test for each of PROGNAME-LIST
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_prog in fgrep; do
+    for ac_exec_ext in '' $ac_executable_extensions; do
+      ac_path_FGREP="$as_dir/$ac_prog$ac_exec_ext"
+      as_fn_executable_p "$ac_path_FGREP" || continue
+# Check for GNU ac_path_FGREP and select it if it is found.
+  # Check for GNU $ac_path_FGREP
+case `"$ac_path_FGREP" --version 2>&1` in
+*GNU*)
+  ac_cv_path_FGREP="$ac_path_FGREP" ac_path_FGREP_found=:;;
+*)
+  ac_count=0
+  $as_echo_n 0123456789 >"conftest.in"
+  while :
+  do
+    cat "conftest.in" "conftest.in" >"conftest.tmp"
+    mv "conftest.tmp" "conftest.in"
+    cp "conftest.in" "conftest.nl"
+    $as_echo 'FGREP' >> "conftest.nl"
+    "$ac_path_FGREP" FGREP < "conftest.nl" >"conftest.out" 2>/dev/null || break
+    diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break
+    as_fn_arith $ac_count + 1 && ac_count=$as_val
+    if test $ac_count -gt ${ac_path_FGREP_max-0}; then
+      # Best one so far, save it but keep looking for a better one
+      ac_cv_path_FGREP="$ac_path_FGREP"
+      ac_path_FGREP_max=$ac_count
+    fi
+    # 10*(2^10) chars as input seems more than enough
+    test $ac_count -gt 10 && break
+  done
+  rm -f conftest.in conftest.tmp conftest.nl conftest.out;;
+esac
+
+      $ac_path_FGREP_found && break 3
+    done
+  done
+  done
+IFS=$as_save_IFS
+  if test -z "$ac_cv_path_FGREP"; then
+    as_fn_error $? "no acceptable fgrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5
+  fi
+else
+  ac_cv_path_FGREP=$FGREP
+fi
+
+   fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_FGREP" >&5
+$as_echo "$ac_cv_path_FGREP" >&6; }
+ FGREP="$ac_cv_path_FGREP"
+
+
+test -z "$GREP" && GREP=grep
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+# Check whether --with-gnu-ld was given.
+if test "${with_gnu_ld+set}" = set; then :
+  withval=$with_gnu_ld; test "$withval" = no || with_gnu_ld=yes
+else
+  with_gnu_ld=no
+fi
+
+ac_prog=ld
+if test "$GCC" = yes; then
+  # Check if gcc -print-prog-name=ld gives a path.
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ld used by $CC" >&5
+$as_echo_n "checking for ld used by $CC... " >&6; }
+  case $host in
+  *-*-mingw*)
+    # gcc leaves a trailing carriage return which upsets mingw
+    ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;;
+  *)
+    ac_prog=`($CC -print-prog-name=ld) 2>&5` ;;
+  esac
+  case $ac_prog in
+    # Accept absolute paths.
+    [\\/]* | ?:[\\/]*)
+      re_direlt='/[^/][^/]*/\.\./'
+      # Canonicalize the pathname of ld
+      ac_prog=`$ECHO "$ac_prog"| $SED 's%\\\\%/%g'`
+      while $ECHO "$ac_prog" | $GREP "$re_direlt" > /dev/null 2>&1; do
+       ac_prog=`$ECHO $ac_prog| $SED "s%$re_direlt%/%"`
+      done
+      test -z "$LD" && LD="$ac_prog"
+      ;;
+  "")
+    # If it fails, then pretend we aren't using GCC.
+    ac_prog=ld
+    ;;
+  *)
+    # If it is relative, then search for the first ld in PATH.
+    with_gnu_ld=unknown
+    ;;
+  esac
+elif test "$with_gnu_ld" = yes; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU ld" >&5
+$as_echo_n "checking for GNU ld... " >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for non-GNU ld" >&5
+$as_echo_n "checking for non-GNU ld... " >&6; }
+fi
+if ${lt_cv_path_LD+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -z "$LD"; then
+  lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
+  for ac_dir in $PATH; do
+    IFS="$lt_save_ifs"
+    test -z "$ac_dir" && ac_dir=.
+    if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then
+      lt_cv_path_LD="$ac_dir/$ac_prog"
+      # Check to see if the program is GNU ld.  I'd rather use --version,
+      # but apparently some variants of GNU ld only accept -v.
+      # Break only if it was the GNU/non-GNU ld that we prefer.
+      case `"$lt_cv_path_LD" -v 2>&1 </dev/null` in
+      *GNU* | *'with BFD'*)
+       test "$with_gnu_ld" != no && break
+       ;;
+      *)
+       test "$with_gnu_ld" != yes && break
+       ;;
+      esac
+    fi
+  done
+  IFS="$lt_save_ifs"
+else
+  lt_cv_path_LD="$LD" # Let the user override the test with a path.
+fi
+fi
+
+LD="$lt_cv_path_LD"
+if test -n "$LD"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LD" >&5
+$as_echo "$LD" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+test -z "$LD" && as_fn_error $? "no acceptable ld found in \$PATH" "$LINENO" 5
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if the linker ($LD) is GNU ld" >&5
+$as_echo_n "checking if the linker ($LD) is GNU ld... " >&6; }
+if ${lt_cv_prog_gnu_ld+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  # I'd rather use --version here, but apparently some GNU lds only accept -v.
+case `$LD -v 2>&1 </dev/null` in
+*GNU* | *'with BFD'*)
+  lt_cv_prog_gnu_ld=yes
+  ;;
+*)
+  lt_cv_prog_gnu_ld=no
+  ;;
+esac
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_gnu_ld" >&5
+$as_echo "$lt_cv_prog_gnu_ld" >&6; }
+with_gnu_ld=$lt_cv_prog_gnu_ld
+
+
+
+
+
+
+
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for BSD- or MS-compatible name lister (nm)" >&5
+$as_echo_n "checking for BSD- or MS-compatible name lister (nm)... " >&6; }
+if ${lt_cv_path_NM+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$NM"; then
+  # Let the user override the test.
+  lt_cv_path_NM="$NM"
+else
+  lt_nm_to_check="${ac_tool_prefix}nm"
+  if test -n "$ac_tool_prefix" && test "$build" = "$host"; then
+    lt_nm_to_check="$lt_nm_to_check nm"
+  fi
+  for lt_tmp_nm in $lt_nm_to_check; do
+    lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
+    for ac_dir in $PATH /usr/ccs/bin/elf /usr/ccs/bin /usr/ucb /bin; do
+      IFS="$lt_save_ifs"
+      test -z "$ac_dir" && ac_dir=.
+      tmp_nm="$ac_dir/$lt_tmp_nm"
+      if test -f "$tmp_nm" || test -f "$tmp_nm$ac_exeext" ; then
+       # Check to see if the nm accepts a BSD-compat flag.
+       # Adding the `sed 1q' prevents false positives on HP-UX, which says:
+       #   nm: unknown option "B" ignored
+       # Tru64's nm complains that /dev/null is an invalid object file
+       case `"$tmp_nm" -B /dev/null 2>&1 | sed '1q'` in
+       */dev/null* | *'Invalid file or object type'*)
+         lt_cv_path_NM="$tmp_nm -B"
+         break
+         ;;
+       *)
+         case `"$tmp_nm" -p /dev/null 2>&1 | sed '1q'` in
+         */dev/null*)
+           lt_cv_path_NM="$tmp_nm -p"
+           break
+           ;;
+         *)
+           lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but
+           continue # so that we can try to find one that supports BSD flags
+           ;;
+         esac
+         ;;
+       esac
+      fi
+    done
+    IFS="$lt_save_ifs"
+  done
+  : ${lt_cv_path_NM=no}
+fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_path_NM" >&5
+$as_echo "$lt_cv_path_NM" >&6; }
+if test "$lt_cv_path_NM" != "no"; then
+  NM="$lt_cv_path_NM"
+else
+  # Didn't find any BSD compatible name lister, look for dumpbin.
+  if test -n "$DUMPBIN"; then :
+    # Let the user override the test.
+  else
+    if test -n "$ac_tool_prefix"; then
+  for ac_prog in dumpbin "link -dump"
+  do
+    # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args.
+set dummy $ac_tool_prefix$ac_prog; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_DUMPBIN+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$DUMPBIN"; then
+  ac_cv_prog_DUMPBIN="$DUMPBIN" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_DUMPBIN="$ac_tool_prefix$ac_prog"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+DUMPBIN=$ac_cv_prog_DUMPBIN
+if test -n "$DUMPBIN"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DUMPBIN" >&5
+$as_echo "$DUMPBIN" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+    test -n "$DUMPBIN" && break
+  done
+fi
+if test -z "$DUMPBIN"; then
+  ac_ct_DUMPBIN=$DUMPBIN
+  for ac_prog in dumpbin "link -dump"
+do
+  # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_DUMPBIN+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$ac_ct_DUMPBIN"; then
+  ac_cv_prog_ac_ct_DUMPBIN="$ac_ct_DUMPBIN" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_ac_ct_DUMPBIN="$ac_prog"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_DUMPBIN=$ac_cv_prog_ac_ct_DUMPBIN
+if test -n "$ac_ct_DUMPBIN"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DUMPBIN" >&5
+$as_echo "$ac_ct_DUMPBIN" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+  test -n "$ac_ct_DUMPBIN" && break
+done
+
+  if test "x$ac_ct_DUMPBIN" = x; then
+    DUMPBIN=":"
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    DUMPBIN=$ac_ct_DUMPBIN
+  fi
+fi
+
+    case `$DUMPBIN -symbols /dev/null 2>&1 | sed '1q'` in
+    *COFF*)
+      DUMPBIN="$DUMPBIN -symbols"
+      ;;
+    *)
+      DUMPBIN=:
+      ;;
+    esac
+  fi
+
+  if test "$DUMPBIN" != ":"; then
+    NM="$DUMPBIN"
+  fi
+fi
+test -z "$NM" && NM=nm
+
+
+
+
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking the name lister ($NM) interface" >&5
+$as_echo_n "checking the name lister ($NM) interface... " >&6; }
+if ${lt_cv_nm_interface+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  lt_cv_nm_interface="BSD nm"
+  echo "int some_variable = 0;" > conftest.$ac_ext
+  (eval echo "\"\$as_me:$LINENO: $ac_compile\"" >&5)
+  (eval "$ac_compile" 2>conftest.err)
+  cat conftest.err >&5
+  (eval echo "\"\$as_me:$LINENO: $NM \\\"conftest.$ac_objext\\\"\"" >&5)
+  (eval "$NM \"conftest.$ac_objext\"" 2>conftest.err > conftest.out)
+  cat conftest.err >&5
+  (eval echo "\"\$as_me:$LINENO: output\"" >&5)
+  cat conftest.out >&5
+  if $GREP 'External.*some_variable' conftest.out > /dev/null; then
+    lt_cv_nm_interface="MS dumpbin"
+  fi
+  rm -f conftest*
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_nm_interface" >&5
+$as_echo "$lt_cv_nm_interface" >&6; }
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ln -s works" >&5
+$as_echo_n "checking whether ln -s works... " >&6; }
+LN_S=$as_ln_s
+if test "$LN_S" = "ln -s"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no, using $LN_S" >&5
+$as_echo "no, using $LN_S" >&6; }
+fi
+
+# find the maximum length of command line arguments
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking the maximum length of command line arguments" >&5
+$as_echo_n "checking the maximum length of command line arguments... " >&6; }
+if ${lt_cv_sys_max_cmd_len+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+    i=0
+  teststring="ABCD"
+
+  case $build_os in
+  msdosdjgpp*)
+    # On DJGPP, this test can blow up pretty badly due to problems in libc
+    # (any single argument exceeding 2000 bytes causes a buffer overrun
+    # during glob expansion).  Even if it were fixed, the result of this
+    # check would be larger than it should be.
+    lt_cv_sys_max_cmd_len=12288;    # 12K is about right
+    ;;
+
+  gnu*)
+    # Under GNU Hurd, this test is not required because there is
+    # no limit to the length of command line arguments.
+    # Libtool will interpret -1 as no limit whatsoever
+    lt_cv_sys_max_cmd_len=-1;
+    ;;
+
+  cygwin* | mingw* | cegcc*)
+    # On Win9x/ME, this test blows up -- it succeeds, but takes
+    # about 5 minutes as the teststring grows exponentially.
+    # Worse, since 9x/ME are not pre-emptively multitasking,
+    # you end up with a "frozen" computer, even though with patience
+    # the test eventually succeeds (with a max line length of 256k).
+    # Instead, let's just punt: use the minimum linelength reported by
+    # all of the supported platforms: 8192 (on NT/2K/XP).
+    lt_cv_sys_max_cmd_len=8192;
+    ;;
+
+  mint*)
+    # On MiNT this can take a long time and run out of memory.
+    lt_cv_sys_max_cmd_len=8192;
+    ;;
+
+  amigaos*)
+    # On AmigaOS with pdksh, this test takes hours, literally.
+    # So we just punt and use a minimum line length of 8192.
+    lt_cv_sys_max_cmd_len=8192;
+    ;;
+
+  netbsd* | freebsd* | openbsd* | darwin* | dragonfly*)
+    # This has been around since 386BSD, at least.  Likely further.
+    if test -x /sbin/sysctl; then
+      lt_cv_sys_max_cmd_len=`/sbin/sysctl -n kern.argmax`
+    elif test -x /usr/sbin/sysctl; then
+      lt_cv_sys_max_cmd_len=`/usr/sbin/sysctl -n kern.argmax`
+    else
+      lt_cv_sys_max_cmd_len=65536      # usable default for all BSDs
+    fi
+    # And add a safety zone
+    lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4`
+    lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3`
+    ;;
+
+  interix*)
+    # We know the value 262144 and hardcode it with a safety zone (like BSD)
+    lt_cv_sys_max_cmd_len=196608
+    ;;
+
+  os2*)
+    # The test takes a long time on OS/2.
+    lt_cv_sys_max_cmd_len=8192
+    ;;
+
+  osf*)
+    # Dr. Hans Ekkehard Plesser reports seeing a kernel panic running configure
+    # due to this test when exec_disable_arg_limit is 1 on Tru64. It is not
+    # nice to cause kernel panics so lets avoid the loop below.
+    # First set a reasonable default.
+    lt_cv_sys_max_cmd_len=16384
+    #
+    if test -x /sbin/sysconfig; then
+      case `/sbin/sysconfig -q proc exec_disable_arg_limit` in
+        *1*) lt_cv_sys_max_cmd_len=-1 ;;
+      esac
+    fi
+    ;;
+  sco3.2v5*)
+    lt_cv_sys_max_cmd_len=102400
+    ;;
+  sysv5* | sco5v6* | sysv4.2uw2*)
+    kargmax=`grep ARG_MAX /etc/conf/cf.d/stune 2>/dev/null`
+    if test -n "$kargmax"; then
+      lt_cv_sys_max_cmd_len=`echo $kargmax | sed 's/.*[         ]//'`
+    else
+      lt_cv_sys_max_cmd_len=32768
+    fi
+    ;;
+  *)
+    lt_cv_sys_max_cmd_len=`(getconf ARG_MAX) 2> /dev/null`
+    if test -n "$lt_cv_sys_max_cmd_len"; then
+      lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4`
+      lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3`
+    else
+      # Make teststring a little bigger before we do anything with it.
+      # a 1K string should be a reasonable start.
+      for i in 1 2 3 4 5 6 7 8 ; do
+        teststring=$teststring$teststring
+      done
+      SHELL=${SHELL-${CONFIG_SHELL-/bin/sh}}
+      # If test is not a shell built-in, we'll probably end up computing a
+      # maximum length that is only half of the actual maximum length, but
+      # we can't tell.
+      while { test "X"`env echo "$teststring$teststring" 2>/dev/null` \
+                = "X$teststring$teststring"; } >/dev/null 2>&1 &&
+             test $i != 17 # 1/2 MB should be enough
+      do
+        i=`expr $i + 1`
+        teststring=$teststring$teststring
+      done
+      # Only check the string length outside the loop.
+      lt_cv_sys_max_cmd_len=`expr "X$teststring" : ".*" 2>&1`
+      teststring=
+      # Add a significant safety factor because C++ compilers can tack on
+      # massive amounts of additional arguments before passing them to the
+      # linker.  It appears as though 1/2 is a usable value.
+      lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 2`
+    fi
+    ;;
+  esac
+
+fi
+
+if test -n $lt_cv_sys_max_cmd_len ; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_sys_max_cmd_len" >&5
+$as_echo "$lt_cv_sys_max_cmd_len" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: none" >&5
+$as_echo "none" >&6; }
+fi
+max_cmd_len=$lt_cv_sys_max_cmd_len
+
+
+
+
+
+
+: ${CP="cp -f"}
+: ${MV="mv -f"}
+: ${RM="rm -f"}
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the shell understands some XSI constructs" >&5
+$as_echo_n "checking whether the shell understands some XSI constructs... " >&6; }
+# Try some XSI features
+xsi_shell=no
+( _lt_dummy="a/b/c"
+  test "${_lt_dummy##*/},${_lt_dummy%/*},${_lt_dummy#??}"${_lt_dummy%"$_lt_dummy"}, \
+      = c,a/b,b/c, \
+    && eval 'test $(( 1 + 1 )) -eq 2 \
+    && test "${#_lt_dummy}" -eq 5' ) >/dev/null 2>&1 \
+  && xsi_shell=yes
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $xsi_shell" >&5
+$as_echo "$xsi_shell" >&6; }
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the shell understands \"+=\"" >&5
+$as_echo_n "checking whether the shell understands \"+=\"... " >&6; }
+lt_shell_append=no
+( foo=bar; set foo baz; eval "$1+=\$2" && test "$foo" = barbaz ) \
+    >/dev/null 2>&1 \
+  && lt_shell_append=yes
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_shell_append" >&5
+$as_echo "$lt_shell_append" >&6; }
+
+
+if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then
+  lt_unset=unset
+else
+  lt_unset=false
+fi
+
+
+
+
+
+# test EBCDIC or ASCII
+case `echo X|tr X '\101'` in
+ A) # ASCII based system
+    # \n is not interpreted correctly by Solaris 8 /usr/ucb/tr
+  lt_SP2NL='tr \040 \012'
+  lt_NL2SP='tr \015\012 \040\040'
+  ;;
+ *) # EBCDIC based system
+  lt_SP2NL='tr \100 \n'
+  lt_NL2SP='tr \r\n \100\100'
+  ;;
+esac
+
+
+
+
+
+
+
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to convert $build file names to $host format" >&5
+$as_echo_n "checking how to convert $build file names to $host format... " >&6; }
+if ${lt_cv_to_host_file_cmd+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  case $host in
+  *-*-mingw* )
+    case $build in
+      *-*-mingw* ) # actually msys
+        lt_cv_to_host_file_cmd=func_convert_file_msys_to_w32
+        ;;
+      *-*-cygwin* )
+        lt_cv_to_host_file_cmd=func_convert_file_cygwin_to_w32
+        ;;
+      * ) # otherwise, assume *nix
+        lt_cv_to_host_file_cmd=func_convert_file_nix_to_w32
+        ;;
+    esac
+    ;;
+  *-*-cygwin* )
+    case $build in
+      *-*-mingw* ) # actually msys
+        lt_cv_to_host_file_cmd=func_convert_file_msys_to_cygwin
+        ;;
+      *-*-cygwin* )
+        lt_cv_to_host_file_cmd=func_convert_file_noop
+        ;;
+      * ) # otherwise, assume *nix
+        lt_cv_to_host_file_cmd=func_convert_file_nix_to_cygwin
+        ;;
+    esac
+    ;;
+  * ) # unhandled hosts (and "normal" native builds)
+    lt_cv_to_host_file_cmd=func_convert_file_noop
+    ;;
+esac
+
+fi
+
+to_host_file_cmd=$lt_cv_to_host_file_cmd
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_to_host_file_cmd" >&5
+$as_echo "$lt_cv_to_host_file_cmd" >&6; }
+
+
+
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to convert $build file names to toolchain format" >&5
+$as_echo_n "checking how to convert $build file names to toolchain format... " >&6; }
+if ${lt_cv_to_tool_file_cmd+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  #assume ordinary cross tools, or native build.
+lt_cv_to_tool_file_cmd=func_convert_file_noop
+case $host in
+  *-*-mingw* )
+    case $build in
+      *-*-mingw* ) # actually msys
+        lt_cv_to_tool_file_cmd=func_convert_file_msys_to_w32
+        ;;
+    esac
+    ;;
+esac
+
+fi
+
+to_tool_file_cmd=$lt_cv_to_tool_file_cmd
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_to_tool_file_cmd" >&5
+$as_echo "$lt_cv_to_tool_file_cmd" >&6; }
+
+
+
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $LD option to reload object files" >&5
+$as_echo_n "checking for $LD option to reload object files... " >&6; }
+if ${lt_cv_ld_reload_flag+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  lt_cv_ld_reload_flag='-r'
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_reload_flag" >&5
+$as_echo "$lt_cv_ld_reload_flag" >&6; }
+reload_flag=$lt_cv_ld_reload_flag
+case $reload_flag in
+"" | " "*) ;;
+*) reload_flag=" $reload_flag" ;;
+esac
+reload_cmds='$LD$reload_flag -o $output$reload_objs'
+case $host_os in
+  cygwin* | mingw* | pw32* | cegcc*)
+    if test "$GCC" != yes; then
+      reload_cmds=false
+    fi
+    ;;
+  darwin*)
+    if test "$GCC" = yes; then
+      reload_cmds='$LTCC $LTCFLAGS -nostdlib ${wl}-r -o $output$reload_objs'
+    else
+      reload_cmds='$LD$reload_flag -o $output$reload_objs'
+    fi
+    ;;
+esac
+
+
+
+
+
+
+
+
+
+if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}objdump", so it can be a program name with args.
+set dummy ${ac_tool_prefix}objdump; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_OBJDUMP+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$OBJDUMP"; then
+  ac_cv_prog_OBJDUMP="$OBJDUMP" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_OBJDUMP="${ac_tool_prefix}objdump"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+OBJDUMP=$ac_cv_prog_OBJDUMP
+if test -n "$OBJDUMP"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OBJDUMP" >&5
+$as_echo "$OBJDUMP" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_OBJDUMP"; then
+  ac_ct_OBJDUMP=$OBJDUMP
+  # Extract the first word of "objdump", so it can be a program name with args.
+set dummy objdump; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_OBJDUMP+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$ac_ct_OBJDUMP"; then
+  ac_cv_prog_ac_ct_OBJDUMP="$ac_ct_OBJDUMP" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_ac_ct_OBJDUMP="objdump"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_OBJDUMP=$ac_cv_prog_ac_ct_OBJDUMP
+if test -n "$ac_ct_OBJDUMP"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OBJDUMP" >&5
+$as_echo "$ac_ct_OBJDUMP" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+  if test "x$ac_ct_OBJDUMP" = x; then
+    OBJDUMP="false"
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    OBJDUMP=$ac_ct_OBJDUMP
+  fi
+else
+  OBJDUMP="$ac_cv_prog_OBJDUMP"
+fi
+
+test -z "$OBJDUMP" && OBJDUMP=objdump
+
+
+
+
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to recognize dependent libraries" >&5
+$as_echo_n "checking how to recognize dependent libraries... " >&6; }
+if ${lt_cv_deplibs_check_method+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  lt_cv_file_magic_cmd='$MAGIC_CMD'
+lt_cv_file_magic_test_file=
+lt_cv_deplibs_check_method='unknown'
+# Need to set the preceding variable on all platforms that support
+# interlibrary dependencies.
+# 'none' -- dependencies not supported.
+# `unknown' -- same as none, but documents that we really don't know.
+# 'pass_all' -- all dependencies passed with no checks.
+# 'test_compile' -- check by making test program.
+# 'file_magic [[regex]]' -- check by looking for files in library path
+# which responds to the $file_magic_cmd with a given extended regex.
+# If you have `file' or equivalent on your system and you're not sure
+# whether `pass_all' will *always* work, you probably want this one.
+
+case $host_os in
+aix[4-9]*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+beos*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+bsdi[45]*)
+  lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib)'
+  lt_cv_file_magic_cmd='/usr/bin/file -L'
+  lt_cv_file_magic_test_file=/shlib/libc.so
+  ;;
+
+cygwin*)
+  # func_win32_libid is a shell function defined in ltmain.sh
+  lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL'
+  lt_cv_file_magic_cmd='func_win32_libid'
+  ;;
+
+mingw* | pw32*)
+  # Base MSYS/MinGW do not provide the 'file' command needed by
+  # func_win32_libid shell function, so use a weaker test based on 'objdump',
+  # unless we find 'file', for example because we are cross-compiling.
+  # func_win32_libid assumes BSD nm, so disallow it if using MS dumpbin.
+  if ( test "$lt_cv_nm_interface" = "BSD nm" && file / ) >/dev/null 2>&1; then
+    lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL'
+    lt_cv_file_magic_cmd='func_win32_libid'
+  else
+    # Keep this pattern in sync with the one in func_win32_libid.
+    lt_cv_deplibs_check_method='file_magic file format (pei*-i386(.*architecture: i386)?|pe-arm-wince|pe-x86-64)'
+    lt_cv_file_magic_cmd='$OBJDUMP -f'
+  fi
+  ;;
+
+cegcc*)
+  # use the weaker test based on 'objdump'. See mingw*.
+  lt_cv_deplibs_check_method='file_magic file format pe-arm-.*little(.*architecture: arm)?'
+  lt_cv_file_magic_cmd='$OBJDUMP -f'
+  ;;
+
+darwin* | rhapsody*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+freebsd* | dragonfly*)
+  if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then
+    case $host_cpu in
+    i*86 )
+      # Not sure whether the presence of OpenBSD here was a mistake.
+      # Let's accept both of them until this is cleared up.
+      lt_cv_deplibs_check_method='file_magic (FreeBSD|OpenBSD|DragonFly)/i[3-9]86 (compact )?demand paged shared library'
+      lt_cv_file_magic_cmd=/usr/bin/file
+      lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*`
+      ;;
+    esac
+  else
+    lt_cv_deplibs_check_method=pass_all
+  fi
+  ;;
+
+gnu*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+haiku*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+hpux10.20* | hpux11*)
+  lt_cv_file_magic_cmd=/usr/bin/file
+  case $host_cpu in
+  ia64*)
+    lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF-[0-9][0-9]) shared object file - IA64'
+    lt_cv_file_magic_test_file=/usr/lib/hpux32/libc.so
+    ;;
+  hppa*64*)
+    lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF[ -][0-9][0-9])(-bit)?( [LM]SB)? shared object( file)?[, -]* PA-RISC [0-9]\.[0-9]'
+    lt_cv_file_magic_test_file=/usr/lib/pa20_64/libc.sl
+    ;;
+  *)
+    lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|PA-RISC[0-9]\.[0-9]) shared library'
+    lt_cv_file_magic_test_file=/usr/lib/libc.sl
+    ;;
+  esac
+  ;;
+
+interix[3-9]*)
+  # PIC code is broken on Interix 3.x, that's why |\.a not |_pic\.a here
+  lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so|\.a)$'
+  ;;
+
+irix5* | irix6* | nonstopux*)
+  case $LD in
+  *-32|*"-32 ") libmagic=32-bit;;
+  *-n32|*"-n32 ") libmagic=N32;;
+  *-64|*"-64 ") libmagic=64-bit;;
+  *) libmagic=never-match;;
+  esac
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+# This must be glibc/ELF.
+linux* | k*bsd*-gnu | kopensolaris*-gnu)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+netbsd* | netbsdelf*-gnu)
+  if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then
+    lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|_pic\.a)$'
+  else
+    lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so|_pic\.a)$'
+  fi
+  ;;
+
+newos6*)
+  lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (executable|dynamic lib)'
+  lt_cv_file_magic_cmd=/usr/bin/file
+  lt_cv_file_magic_test_file=/usr/lib/libnls.so
+  ;;
+
+*nto* | *qnx*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+openbsd*)
+  if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
+    lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|\.so|_pic\.a)$'
+  else
+    lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|_pic\.a)$'
+  fi
+  ;;
+
+osf3* | osf4* | osf5*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+rdos*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+solaris*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+sysv4 | sysv4.3*)
+  case $host_vendor in
+  motorola)
+    lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib) M[0-9][0-9]* Version [0-9]'
+    lt_cv_file_magic_test_file=`echo /usr/lib/libc.so*`
+    ;;
+  ncr)
+    lt_cv_deplibs_check_method=pass_all
+    ;;
+  sequent)
+    lt_cv_file_magic_cmd='/bin/file'
+    lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [LM]SB (shared object|dynamic lib )'
+    ;;
+  sni)
+    lt_cv_file_magic_cmd='/bin/file'
+    lt_cv_deplibs_check_method="file_magic ELF [0-9][0-9]*-bit [LM]SB dynamic lib"
+    lt_cv_file_magic_test_file=/lib/libc.so
+    ;;
+  siemens)
+    lt_cv_deplibs_check_method=pass_all
+    ;;
+  pc)
+    lt_cv_deplibs_check_method=pass_all
+    ;;
+  esac
+  ;;
+
+tpf*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+esac
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_deplibs_check_method" >&5
+$as_echo "$lt_cv_deplibs_check_method" >&6; }
+
+file_magic_glob=
+want_nocaseglob=no
+if test "$build" = "$host"; then
+  case $host_os in
+  mingw* | pw32*)
+    if ( shopt | grep nocaseglob ) >/dev/null 2>&1; then
+      want_nocaseglob=yes
+    else
+      file_magic_glob=`echo aAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsStTuUvVwWxXyYzZ | $SED -e "s/\(..\)/s\/[\1]\/[\1]\/g;/g"`
+    fi
+    ;;
+  esac
+fi
+
+file_magic_cmd=$lt_cv_file_magic_cmd
+deplibs_check_method=$lt_cv_deplibs_check_method
+test -z "$deplibs_check_method" && deplibs_check_method=unknown
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}dlltool", so it can be a program name with args.
+set dummy ${ac_tool_prefix}dlltool; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_DLLTOOL+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$DLLTOOL"; then
+  ac_cv_prog_DLLTOOL="$DLLTOOL" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_DLLTOOL="${ac_tool_prefix}dlltool"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+DLLTOOL=$ac_cv_prog_DLLTOOL
+if test -n "$DLLTOOL"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DLLTOOL" >&5
+$as_echo "$DLLTOOL" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_DLLTOOL"; then
+  ac_ct_DLLTOOL=$DLLTOOL
+  # Extract the first word of "dlltool", so it can be a program name with args.
+set dummy dlltool; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_DLLTOOL+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$ac_ct_DLLTOOL"; then
+  ac_cv_prog_ac_ct_DLLTOOL="$ac_ct_DLLTOOL" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_ac_ct_DLLTOOL="dlltool"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_DLLTOOL=$ac_cv_prog_ac_ct_DLLTOOL
+if test -n "$ac_ct_DLLTOOL"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DLLTOOL" >&5
+$as_echo "$ac_ct_DLLTOOL" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+  if test "x$ac_ct_DLLTOOL" = x; then
+    DLLTOOL="false"
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    DLLTOOL=$ac_ct_DLLTOOL
+  fi
+else
+  DLLTOOL="$ac_cv_prog_DLLTOOL"
+fi
+
+test -z "$DLLTOOL" && DLLTOOL=dlltool
+
+
+
+
+
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to associate runtime and link libraries" >&5
+$as_echo_n "checking how to associate runtime and link libraries... " >&6; }
+if ${lt_cv_sharedlib_from_linklib_cmd+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  lt_cv_sharedlib_from_linklib_cmd='unknown'
+
+case $host_os in
+cygwin* | mingw* | pw32* | cegcc*)
+  # two different shell functions defined in ltmain.sh
+  # decide which to use based on capabilities of $DLLTOOL
+  case `$DLLTOOL --help 2>&1` in
+  *--identify-strict*)
+    lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib
+    ;;
+  *)
+    lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib_fallback
+    ;;
+  esac
+  ;;
+*)
+  # fallback: assume linklib IS sharedlib
+  lt_cv_sharedlib_from_linklib_cmd="$ECHO"
+  ;;
+esac
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_sharedlib_from_linklib_cmd" >&5
+$as_echo "$lt_cv_sharedlib_from_linklib_cmd" >&6; }
+sharedlib_from_linklib_cmd=$lt_cv_sharedlib_from_linklib_cmd
+test -z "$sharedlib_from_linklib_cmd" && sharedlib_from_linklib_cmd=$ECHO
+
+
+
+
+
+
+
+if test -n "$ac_tool_prefix"; then
+  for ac_prog in ar
+  do
+    # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args.
+set dummy $ac_tool_prefix$ac_prog; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_AR+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$AR"; then
+  ac_cv_prog_AR="$AR" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_AR="$ac_tool_prefix$ac_prog"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+AR=$ac_cv_prog_AR
+if test -n "$AR"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AR" >&5
+$as_echo "$AR" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+    test -n "$AR" && break
+  done
+fi
+if test -z "$AR"; then
+  ac_ct_AR=$AR
+  for ac_prog in ar
+do
+  # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_AR+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$ac_ct_AR"; then
+  ac_cv_prog_ac_ct_AR="$ac_ct_AR" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_ac_ct_AR="$ac_prog"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_AR=$ac_cv_prog_ac_ct_AR
+if test -n "$ac_ct_AR"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_AR" >&5
+$as_echo "$ac_ct_AR" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+  test -n "$ac_ct_AR" && break
+done
+
+  if test "x$ac_ct_AR" = x; then
+    AR="false"
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    AR=$ac_ct_AR
+  fi
+fi
+
+: ${AR=ar}
+: ${AR_FLAGS=cru}
+
+
+
+
+
+
+
+
+
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for archiver @FILE support" >&5
+$as_echo_n "checking for archiver @FILE support... " >&6; }
+if ${lt_cv_ar_at_file+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  lt_cv_ar_at_file=no
+   cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  echo conftest.$ac_objext > conftest.lst
+      lt_ar_try='$AR $AR_FLAGS libconftest.a @conftest.lst >&5'
+      { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$lt_ar_try\""; } >&5
+  (eval $lt_ar_try) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }
+      if test "$ac_status" -eq 0; then
+       # Ensure the archiver fails upon bogus file names.
+       rm -f conftest.$ac_objext libconftest.a
+       { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$lt_ar_try\""; } >&5
+  (eval $lt_ar_try) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }
+       if test "$ac_status" -ne 0; then
+          lt_cv_ar_at_file=@
+        fi
+      fi
+      rm -f conftest.* libconftest.a
+
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ar_at_file" >&5
+$as_echo "$lt_cv_ar_at_file" >&6; }
+
+if test "x$lt_cv_ar_at_file" = xno; then
+  archiver_list_spec=
+else
+  archiver_list_spec=$lt_cv_ar_at_file
+fi
+
+
+
+
+
+
+
+if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args.
+set dummy ${ac_tool_prefix}strip; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_STRIP+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$STRIP"; then
+  ac_cv_prog_STRIP="$STRIP" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_STRIP="${ac_tool_prefix}strip"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+STRIP=$ac_cv_prog_STRIP
+if test -n "$STRIP"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5
+$as_echo "$STRIP" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_STRIP"; then
+  ac_ct_STRIP=$STRIP
+  # Extract the first word of "strip", so it can be a program name with args.
+set dummy strip; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_STRIP+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$ac_ct_STRIP"; then
+  ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_ac_ct_STRIP="strip"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP
+if test -n "$ac_ct_STRIP"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5
+$as_echo "$ac_ct_STRIP" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+  if test "x$ac_ct_STRIP" = x; then
+    STRIP=":"
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    STRIP=$ac_ct_STRIP
+  fi
+else
+  STRIP="$ac_cv_prog_STRIP"
+fi
+
+test -z "$STRIP" && STRIP=:
+
+
+
+
+
+
+if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args.
+set dummy ${ac_tool_prefix}ranlib; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_RANLIB+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$RANLIB"; then
+  ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+RANLIB=$ac_cv_prog_RANLIB
+if test -n "$RANLIB"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $RANLIB" >&5
+$as_echo "$RANLIB" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_RANLIB"; then
+  ac_ct_RANLIB=$RANLIB
+  # Extract the first word of "ranlib", so it can be a program name with args.
+set dummy ranlib; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_RANLIB+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$ac_ct_RANLIB"; then
+  ac_cv_prog_ac_ct_RANLIB="$ac_ct_RANLIB" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_ac_ct_RANLIB="ranlib"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB
+if test -n "$ac_ct_RANLIB"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_RANLIB" >&5
+$as_echo "$ac_ct_RANLIB" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+  if test "x$ac_ct_RANLIB" = x; then
+    RANLIB=":"
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    RANLIB=$ac_ct_RANLIB
+  fi
+else
+  RANLIB="$ac_cv_prog_RANLIB"
+fi
+
+test -z "$RANLIB" && RANLIB=:
+
+
+
+
+
+
+# Determine commands to create old-style static archives.
+old_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs'
+old_postinstall_cmds='chmod 644 $oldlib'
+old_postuninstall_cmds=
+
+if test -n "$RANLIB"; then
+  case $host_os in
+  openbsd*)
+    old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB -t \$tool_oldlib"
+    ;;
+  *)
+    old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB \$tool_oldlib"
+    ;;
+  esac
+  old_archive_cmds="$old_archive_cmds~\$RANLIB \$tool_oldlib"
+fi
+
+case $host_os in
+  darwin*)
+    lock_old_archive_extraction=yes ;;
+  *)
+    lock_old_archive_extraction=no ;;
+esac
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+# If no C compiler was specified, use CC.
+LTCC=${LTCC-"$CC"}
+
+# If no C compiler flags were specified, use CFLAGS.
+LTCFLAGS=${LTCFLAGS-"$CFLAGS"}
+
+# Allow CC to be a program name with arguments.
+compiler=$CC
+
+
+# Check for command to grab the raw symbol name followed by C symbol from nm.
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking command to parse $NM output from $compiler object" >&5
+$as_echo_n "checking command to parse $NM output from $compiler object... " >&6; }
+if ${lt_cv_sys_global_symbol_pipe+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+
+# These are sane defaults that work on at least a few old systems.
+# [They come from Ultrix.  What could be older than Ultrix?!! ;)]
+
+# Character class describing NM global symbol codes.
+symcode='[BCDEGRST]'
+
+# Regexp to match symbols that can be accessed directly from C.
+sympat='\([_A-Za-z][_A-Za-z0-9]*\)'
+
+# Define system-specific variables.
+case $host_os in
+aix*)
+  symcode='[BCDT]'
+  ;;
+cygwin* | mingw* | pw32* | cegcc*)
+  symcode='[ABCDGISTW]'
+  ;;
+hpux*)
+  if test "$host_cpu" = ia64; then
+    symcode='[ABCDEGRST]'
+  fi
+  ;;
+irix* | nonstopux*)
+  symcode='[BCDEGRST]'
+  ;;
+osf*)
+  symcode='[BCDEGQRST]'
+  ;;
+solaris*)
+  symcode='[BDRT]'
+  ;;
+sco3.2v5*)
+  symcode='[DT]'
+  ;;
+sysv4.2uw2*)
+  symcode='[DT]'
+  ;;
+sysv5* | sco5v6* | unixware* | OpenUNIX*)
+  symcode='[ABDT]'
+  ;;
+sysv4)
+  symcode='[DFNSTU]'
+  ;;
+esac
+
+# If we're using GNU nm, then use its standard symbol codes.
+case `$NM -V 2>&1` in
+*GNU* | *'with BFD'*)
+  symcode='[ABCDGIRSTW]' ;;
+esac
+
+# Transform an extracted symbol line into a proper C declaration.
+# Some systems (esp. on ia64) link data and code symbols differently,
+# so use this general approach.
+lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern int \1();/p' -e 's/^$symcode* .* \(.*\)$/extern char \1;/p'"
+
+# Transform an extracted symbol line into symbol name and symbol address
+lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([^ ]*\)[ ]*$/  {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([^ ]*\) \([^ ]*\)$/  {\"\2\", (void *) \&\2},/p'"
+lt_cv_sys_global_symbol_to_c_name_address_lib_prefix="sed -n -e 's/^: \([^ ]*\)[ ]*$/  {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([^ ]*\) \(lib[^ ]*\)$/  {\"\2\", (void *) \&\2},/p' -e 's/^$symcode* \([^ ]*\) \([^ ]*\)$/  {\"lib\2\", (void *) \&\2},/p'"
+
+# Handle CRLF in mingw tool chain
+opt_cr=
+case $build_os in
+mingw*)
+  opt_cr=`$ECHO 'x\{0,1\}' | tr x '\015'` # option cr in regexp
+  ;;
+esac
+
+# Try without a prefix underscore, then with it.
+for ac_symprfx in "" "_"; do
+
+  # Transform symcode, sympat, and symprfx into a raw symbol and a C symbol.
+  symxfrm="\\1 $ac_symprfx\\2 \\2"
+
+  # Write the raw and C identifiers.
+  if test "$lt_cv_nm_interface" = "MS dumpbin"; then
+    # Fake it for dumpbin and say T for any non-static function
+    # and D for any global variable.
+    # Also find C++ and __fastcall symbols from MSVC++,
+    # which start with @ or ?.
+    lt_cv_sys_global_symbol_pipe="$AWK '"\
+"     {last_section=section; section=\$ 3};"\
+"     /^COFF SYMBOL TABLE/{for(i in hide) delete hide[i]};"\
+"     /Section length .*#relocs.*(pick any)/{hide[last_section]=1};"\
+"     \$ 0!~/External *\|/{next};"\
+"     / 0+ UNDEF /{next}; / UNDEF \([^|]\)*()/{next};"\
+"     {if(hide[section]) next};"\
+"     {f=0}; \$ 0~/\(\).*\|/{f=1}; {printf f ? \"T \" : \"D \"};"\
+"     {split(\$ 0, a, /\||\r/); split(a[2], s)};"\
+"     s[1]~/^[@?]/{print s[1], s[1]; next};"\
+"     s[1]~prfx {split(s[1],t,\"@\"); print t[1], substr(t[1],length(prfx))}"\
+"     ' prfx=^$ac_symprfx"
+  else
+    lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[     ]\($symcode$symcode*\)[         ][      ]*$ac_symprfx$sympat$opt_cr$/$symxfrm/p'"
+  fi
+  lt_cv_sys_global_symbol_pipe="$lt_cv_sys_global_symbol_pipe | sed '/ __gnu_lto/d'"
+
+  # Check to see that the pipe works correctly.
+  pipe_works=no
+
+  rm -f conftest*
+  cat > conftest.$ac_ext <<_LT_EOF
+#ifdef __cplusplus
+extern "C" {
+#endif
+char nm_test_var;
+void nm_test_func(void);
+void nm_test_func(void){}
+#ifdef __cplusplus
+}
+#endif
+int main(){nm_test_var='a';nm_test_func();return(0);}
+_LT_EOF
+
+  if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then
+    # Now try to grab the symbols.
+    nlist=conftest.nm
+    if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$NM conftest.$ac_objext \| "$lt_cv_sys_global_symbol_pipe" \> $nlist\""; } >&5
+  (eval $NM conftest.$ac_objext \| "$lt_cv_sys_global_symbol_pipe" \> $nlist) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; } && test -s "$nlist"; then
+      # Try sorting and uniquifying the output.
+      if sort "$nlist" | uniq > "$nlist"T; then
+       mv -f "$nlist"T "$nlist"
+      else
+       rm -f "$nlist"T
+      fi
+
+      # Make sure that we snagged all the symbols we need.
+      if $GREP ' nm_test_var$' "$nlist" >/dev/null; then
+       if $GREP ' nm_test_func$' "$nlist" >/dev/null; then
+         cat <<_LT_EOF > conftest.$ac_ext
+/* Keep this code in sync between libtool.m4, ltmain, lt_system.h, and tests.  */
+#if defined(_WIN32) || defined(__CYGWIN__) || defined(_WIN32_WCE)
+/* DATA imports from DLLs on WIN32 con't be const, because runtime
+   relocations are performed -- see ld's documentation on pseudo-relocs.  */
+# define LT_DLSYM_CONST
+#elif defined(__osf__)
+/* This system does not cope well with relocations in const data.  */
+# define LT_DLSYM_CONST
+#else
+# define LT_DLSYM_CONST const
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+_LT_EOF
+         # Now generate the symbol file.
+         eval "$lt_cv_sys_global_symbol_to_cdecl"' < "$nlist" | $GREP -v main >> conftest.$ac_ext'
+
+         cat <<_LT_EOF >> conftest.$ac_ext
+
+/* The mapping between symbol names and symbols.  */
+LT_DLSYM_CONST struct {
+  const char *name;
+  void       *address;
+}
+lt__PROGRAM__LTX_preloaded_symbols[] =
+{
+  { "@PROGRAM@", (void *) 0 },
+_LT_EOF
+         $SED "s/^$symcode$symcode* \(.*\) \(.*\)$/  {\"\2\", (void *) \&\2},/" < "$nlist" | $GREP -v main >> conftest.$ac_ext
+         cat <<\_LT_EOF >> conftest.$ac_ext
+  {0, (void *) 0}
+};
+
+/* This works around a problem in FreeBSD linker */
+#ifdef FREEBSD_WORKAROUND
+static const void *lt_preloaded_setup() {
+  return lt__PROGRAM__LTX_preloaded_symbols;
+}
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+_LT_EOF
+         # Now try linking the two files.
+         mv conftest.$ac_objext conftstm.$ac_objext
+         lt_globsym_save_LIBS=$LIBS
+         lt_globsym_save_CFLAGS=$CFLAGS
+         LIBS="conftstm.$ac_objext"
+         CFLAGS="$CFLAGS$lt_prog_compiler_no_builtin_flag"
+         if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; } && test -s conftest${ac_exeext}; then
+           pipe_works=yes
+         fi
+         LIBS=$lt_globsym_save_LIBS
+         CFLAGS=$lt_globsym_save_CFLAGS
+       else
+         echo "cannot find nm_test_func in $nlist" >&5
+       fi
+      else
+       echo "cannot find nm_test_var in $nlist" >&5
+      fi
+    else
+      echo "cannot run $lt_cv_sys_global_symbol_pipe" >&5
+    fi
+  else
+    echo "$progname: failed program was:" >&5
+    cat conftest.$ac_ext >&5
+  fi
+  rm -rf conftest* conftst*
+
+  # Do not use the global_symbol_pipe unless it works.
+  if test "$pipe_works" = yes; then
+    break
+  else
+    lt_cv_sys_global_symbol_pipe=
+  fi
+done
+
+fi
+
+if test -z "$lt_cv_sys_global_symbol_pipe"; then
+  lt_cv_sys_global_symbol_to_cdecl=
+fi
+if test -z "$lt_cv_sys_global_symbol_pipe$lt_cv_sys_global_symbol_to_cdecl"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: failed" >&5
+$as_echo "failed" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: ok" >&5
+$as_echo "ok" >&6; }
+fi
+
+# Response file support.
+if test "$lt_cv_nm_interface" = "MS dumpbin"; then
+  nm_file_list_spec='@'
+elif $NM --help 2>/dev/null | grep '[@]FILE' >/dev/null; then
+  nm_file_list_spec='@'
+fi
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for sysroot" >&5
+$as_echo_n "checking for sysroot... " >&6; }
+
+# Check whether --with-sysroot was given.
+if test "${with_sysroot+set}" = set; then :
+  withval=$with_sysroot;
+else
+  with_sysroot=no
+fi
+
+
+lt_sysroot=
+case ${with_sysroot} in #(
+ yes)
+   if test "$GCC" = yes; then
+     lt_sysroot=`$CC --print-sysroot 2>/dev/null`
+   fi
+   ;; #(
+ /*)
+   lt_sysroot=`echo "$with_sysroot" | sed -e "$sed_quote_subst"`
+   ;; #(
+ no|'')
+   ;; #(
+ *)
+   { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${with_sysroot}" >&5
+$as_echo "${with_sysroot}" >&6; }
+   as_fn_error $? "The sysroot must be an absolute path." "$LINENO" 5
+   ;;
+esac
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${lt_sysroot:-no}" >&5
+$as_echo "${lt_sysroot:-no}" >&6; }
+
+
+
+
+
+# Check whether --enable-libtool-lock was given.
+if test "${enable_libtool_lock+set}" = set; then :
+  enableval=$enable_libtool_lock;
+fi
+
+test "x$enable_libtool_lock" != xno && enable_libtool_lock=yes
+
+# Some flags need to be propagated to the compiler or linker for good
+# libtool support.
+case $host in
+ia64-*-hpux*)
+  # Find out which ABI we are using.
+  echo 'int i;' > conftest.$ac_ext
+  if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then
+    case `/usr/bin/file conftest.$ac_objext` in
+      *ELF-32*)
+       HPUX_IA64_MODE="32"
+       ;;
+      *ELF-64*)
+       HPUX_IA64_MODE="64"
+       ;;
+    esac
+  fi
+  rm -rf conftest*
+  ;;
+*-*-irix6*)
+  # Find out which ABI we are using.
+  echo '#line '$LINENO' "configure"' > conftest.$ac_ext
+  if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then
+    if test "$lt_cv_prog_gnu_ld" = yes; then
+      case `/usr/bin/file conftest.$ac_objext` in
+       *32-bit*)
+         LD="${LD-ld} -melf32bsmip"
+         ;;
+       *N32*)
+         LD="${LD-ld} -melf32bmipn32"
+         ;;
+       *64-bit*)
+         LD="${LD-ld} -melf64bmip"
+       ;;
+      esac
+    else
+      case `/usr/bin/file conftest.$ac_objext` in
+       *32-bit*)
+         LD="${LD-ld} -32"
+         ;;
+       *N32*)
+         LD="${LD-ld} -n32"
+         ;;
+       *64-bit*)
+         LD="${LD-ld} -64"
+         ;;
+      esac
+    fi
+  fi
+  rm -rf conftest*
+  ;;
+
+x86_64-*kfreebsd*-gnu|x86_64-*linux*|ppc*-*linux*|powerpc*-*linux*| \
+s390*-*linux*|s390*-*tpf*|sparc*-*linux*)
+  # Find out which ABI we are using.
+  echo 'int i;' > conftest.$ac_ext
+  if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then
+    case `/usr/bin/file conftest.o` in
+      *32-bit*)
+       case $host in
+         x86_64-*kfreebsd*-gnu)
+           LD="${LD-ld} -m elf_i386_fbsd"
+           ;;
+         x86_64-*linux*)
+           LD="${LD-ld} -m elf_i386"
+           ;;
+         ppc64-*linux*|powerpc64-*linux*)
+           LD="${LD-ld} -m elf32ppclinux"
+           ;;
+         s390x-*linux*)
+           LD="${LD-ld} -m elf_s390"
+           ;;
+         sparc64-*linux*)
+           LD="${LD-ld} -m elf32_sparc"
+           ;;
+       esac
+       ;;
+      *64-bit*)
+       case $host in
+         x86_64-*kfreebsd*-gnu)
+           LD="${LD-ld} -m elf_x86_64_fbsd"
+           ;;
+         x86_64-*linux*)
+           LD="${LD-ld} -m elf_x86_64"
+           ;;
+         ppc*-*linux*|powerpc*-*linux*)
+           LD="${LD-ld} -m elf64ppc"
+           ;;
+         s390*-*linux*|s390*-*tpf*)
+           LD="${LD-ld} -m elf64_s390"
+           ;;
+         sparc*-*linux*)
+           LD="${LD-ld} -m elf64_sparc"
+           ;;
+       esac
+       ;;
+    esac
+  fi
+  rm -rf conftest*
+  ;;
+
+*-*-sco3.2v5*)
+  # On SCO OpenServer 5, we need -belf to get full-featured binaries.
+  SAVE_CFLAGS="$CFLAGS"
+  CFLAGS="$CFLAGS -belf"
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler needs -belf" >&5
+$as_echo_n "checking whether the C compiler needs -belf... " >&6; }
+if ${lt_cv_cc_needs_belf+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+     cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  lt_cv_cc_needs_belf=yes
+else
+  lt_cv_cc_needs_belf=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+     ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_cc_needs_belf" >&5
+$as_echo "$lt_cv_cc_needs_belf" >&6; }
+  if test x"$lt_cv_cc_needs_belf" != x"yes"; then
+    # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf
+    CFLAGS="$SAVE_CFLAGS"
+  fi
+  ;;
+*-*solaris*)
+  # Find out which ABI we are using.
+  echo 'int i;' > conftest.$ac_ext
+  if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then
+    case `/usr/bin/file conftest.o` in
+    *64-bit*)
+      case $lt_cv_prog_gnu_ld in
+      yes*)
+        case $host in
+        i?86-*-solaris*)
+          LD="${LD-ld} -m elf_x86_64"
+          ;;
+        sparc*-*-solaris*)
+          LD="${LD-ld} -m elf64_sparc"
+          ;;
+        esac
+        # GNU ld 2.21 introduced _sol2 emulations.  Use them if available.
+        if ${LD-ld} -V | grep _sol2 >/dev/null 2>&1; then
+          LD="${LD-ld}_sol2"
+        fi
+        ;;
+      *)
+       if ${LD-ld} -64 -r -o conftest2.o conftest.o >/dev/null 2>&1; then
+         LD="${LD-ld} -64"
+       fi
+       ;;
+      esac
+      ;;
+    esac
+  fi
+  rm -rf conftest*
+  ;;
+esac
+
+need_locks="$enable_libtool_lock"
+
+if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}mt", so it can be a program name with args.
+set dummy ${ac_tool_prefix}mt; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_MANIFEST_TOOL+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$MANIFEST_TOOL"; then
+  ac_cv_prog_MANIFEST_TOOL="$MANIFEST_TOOL" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_MANIFEST_TOOL="${ac_tool_prefix}mt"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+MANIFEST_TOOL=$ac_cv_prog_MANIFEST_TOOL
+if test -n "$MANIFEST_TOOL"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MANIFEST_TOOL" >&5
+$as_echo "$MANIFEST_TOOL" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_MANIFEST_TOOL"; then
+  ac_ct_MANIFEST_TOOL=$MANIFEST_TOOL
+  # Extract the first word of "mt", so it can be a program name with args.
+set dummy mt; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_MANIFEST_TOOL+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$ac_ct_MANIFEST_TOOL"; then
+  ac_cv_prog_ac_ct_MANIFEST_TOOL="$ac_ct_MANIFEST_TOOL" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_ac_ct_MANIFEST_TOOL="mt"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_MANIFEST_TOOL=$ac_cv_prog_ac_ct_MANIFEST_TOOL
+if test -n "$ac_ct_MANIFEST_TOOL"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_MANIFEST_TOOL" >&5
+$as_echo "$ac_ct_MANIFEST_TOOL" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+  if test "x$ac_ct_MANIFEST_TOOL" = x; then
+    MANIFEST_TOOL=":"
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    MANIFEST_TOOL=$ac_ct_MANIFEST_TOOL
+  fi
+else
+  MANIFEST_TOOL="$ac_cv_prog_MANIFEST_TOOL"
+fi
+
+test -z "$MANIFEST_TOOL" && MANIFEST_TOOL=mt
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if $MANIFEST_TOOL is a manifest tool" >&5
+$as_echo_n "checking if $MANIFEST_TOOL is a manifest tool... " >&6; }
+if ${lt_cv_path_mainfest_tool+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  lt_cv_path_mainfest_tool=no
+  echo "$as_me:$LINENO: $MANIFEST_TOOL '-?'" >&5
+  $MANIFEST_TOOL '-?' 2>conftest.err > conftest.out
+  cat conftest.err >&5
+  if $GREP 'Manifest Tool' conftest.out > /dev/null; then
+    lt_cv_path_mainfest_tool=yes
+  fi
+  rm -f conftest*
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_path_mainfest_tool" >&5
+$as_echo "$lt_cv_path_mainfest_tool" >&6; }
+if test "x$lt_cv_path_mainfest_tool" != xyes; then
+  MANIFEST_TOOL=:
+fi
+
+
+
+
+
+
+  case $host_os in
+    rhapsody* | darwin*)
+    if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}dsymutil", so it can be a program name with args.
+set dummy ${ac_tool_prefix}dsymutil; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_DSYMUTIL+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$DSYMUTIL"; then
+  ac_cv_prog_DSYMUTIL="$DSYMUTIL" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_DSYMUTIL="${ac_tool_prefix}dsymutil"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+DSYMUTIL=$ac_cv_prog_DSYMUTIL
+if test -n "$DSYMUTIL"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DSYMUTIL" >&5
+$as_echo "$DSYMUTIL" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_DSYMUTIL"; then
+  ac_ct_DSYMUTIL=$DSYMUTIL
+  # Extract the first word of "dsymutil", so it can be a program name with args.
+set dummy dsymutil; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_DSYMUTIL+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$ac_ct_DSYMUTIL"; then
+  ac_cv_prog_ac_ct_DSYMUTIL="$ac_ct_DSYMUTIL" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_ac_ct_DSYMUTIL="dsymutil"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_DSYMUTIL=$ac_cv_prog_ac_ct_DSYMUTIL
+if test -n "$ac_ct_DSYMUTIL"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DSYMUTIL" >&5
+$as_echo "$ac_ct_DSYMUTIL" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+  if test "x$ac_ct_DSYMUTIL" = x; then
+    DSYMUTIL=":"
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    DSYMUTIL=$ac_ct_DSYMUTIL
+  fi
+else
+  DSYMUTIL="$ac_cv_prog_DSYMUTIL"
+fi
+
+    if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}nmedit", so it can be a program name with args.
+set dummy ${ac_tool_prefix}nmedit; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_NMEDIT+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$NMEDIT"; then
+  ac_cv_prog_NMEDIT="$NMEDIT" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_NMEDIT="${ac_tool_prefix}nmedit"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+NMEDIT=$ac_cv_prog_NMEDIT
+if test -n "$NMEDIT"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $NMEDIT" >&5
+$as_echo "$NMEDIT" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_NMEDIT"; then
+  ac_ct_NMEDIT=$NMEDIT
+  # Extract the first word of "nmedit", so it can be a program name with args.
+set dummy nmedit; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_NMEDIT+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$ac_ct_NMEDIT"; then
+  ac_cv_prog_ac_ct_NMEDIT="$ac_ct_NMEDIT" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_ac_ct_NMEDIT="nmedit"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_NMEDIT=$ac_cv_prog_ac_ct_NMEDIT
+if test -n "$ac_ct_NMEDIT"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_NMEDIT" >&5
+$as_echo "$ac_ct_NMEDIT" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+  if test "x$ac_ct_NMEDIT" = x; then
+    NMEDIT=":"
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    NMEDIT=$ac_ct_NMEDIT
+  fi
+else
+  NMEDIT="$ac_cv_prog_NMEDIT"
+fi
+
+    if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}lipo", so it can be a program name with args.
+set dummy ${ac_tool_prefix}lipo; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_LIPO+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$LIPO"; then
+  ac_cv_prog_LIPO="$LIPO" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_LIPO="${ac_tool_prefix}lipo"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+LIPO=$ac_cv_prog_LIPO
+if test -n "$LIPO"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LIPO" >&5
+$as_echo "$LIPO" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_LIPO"; then
+  ac_ct_LIPO=$LIPO
+  # Extract the first word of "lipo", so it can be a program name with args.
+set dummy lipo; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_LIPO+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$ac_ct_LIPO"; then
+  ac_cv_prog_ac_ct_LIPO="$ac_ct_LIPO" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_ac_ct_LIPO="lipo"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_LIPO=$ac_cv_prog_ac_ct_LIPO
+if test -n "$ac_ct_LIPO"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_LIPO" >&5
+$as_echo "$ac_ct_LIPO" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+  if test "x$ac_ct_LIPO" = x; then
+    LIPO=":"
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    LIPO=$ac_ct_LIPO
+  fi
+else
+  LIPO="$ac_cv_prog_LIPO"
+fi
+
+    if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}otool", so it can be a program name with args.
+set dummy ${ac_tool_prefix}otool; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_OTOOL+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$OTOOL"; then
+  ac_cv_prog_OTOOL="$OTOOL" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_OTOOL="${ac_tool_prefix}otool"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+OTOOL=$ac_cv_prog_OTOOL
+if test -n "$OTOOL"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OTOOL" >&5
+$as_echo "$OTOOL" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_OTOOL"; then
+  ac_ct_OTOOL=$OTOOL
+  # Extract the first word of "otool", so it can be a program name with args.
+set dummy otool; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_OTOOL+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$ac_ct_OTOOL"; then
+  ac_cv_prog_ac_ct_OTOOL="$ac_ct_OTOOL" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_ac_ct_OTOOL="otool"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_OTOOL=$ac_cv_prog_ac_ct_OTOOL
+if test -n "$ac_ct_OTOOL"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OTOOL" >&5
+$as_echo "$ac_ct_OTOOL" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+  if test "x$ac_ct_OTOOL" = x; then
+    OTOOL=":"
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    OTOOL=$ac_ct_OTOOL
+  fi
+else
+  OTOOL="$ac_cv_prog_OTOOL"
+fi
+
+    if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}otool64", so it can be a program name with args.
+set dummy ${ac_tool_prefix}otool64; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_OTOOL64+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$OTOOL64"; then
+  ac_cv_prog_OTOOL64="$OTOOL64" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_OTOOL64="${ac_tool_prefix}otool64"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+OTOOL64=$ac_cv_prog_OTOOL64
+if test -n "$OTOOL64"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OTOOL64" >&5
+$as_echo "$OTOOL64" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_OTOOL64"; then
+  ac_ct_OTOOL64=$OTOOL64
+  # Extract the first word of "otool64", so it can be a program name with args.
+set dummy otool64; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_OTOOL64+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$ac_ct_OTOOL64"; then
+  ac_cv_prog_ac_ct_OTOOL64="$ac_ct_OTOOL64" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_ac_ct_OTOOL64="otool64"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_OTOOL64=$ac_cv_prog_ac_ct_OTOOL64
+if test -n "$ac_ct_OTOOL64"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OTOOL64" >&5
+$as_echo "$ac_ct_OTOOL64" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+  if test "x$ac_ct_OTOOL64" = x; then
+    OTOOL64=":"
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    OTOOL64=$ac_ct_OTOOL64
+  fi
+else
+  OTOOL64="$ac_cv_prog_OTOOL64"
+fi
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -single_module linker flag" >&5
+$as_echo_n "checking for -single_module linker flag... " >&6; }
+if ${lt_cv_apple_cc_single_mod+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  lt_cv_apple_cc_single_mod=no
+      if test -z "${LT_MULTI_MODULE}"; then
+       # By default we will add the -single_module flag. You can override
+       # by either setting the environment variable LT_MULTI_MODULE
+       # non-empty at configure time, or by adding -multi_module to the
+       # link flags.
+       rm -rf libconftest.dylib*
+       echo "int foo(void){return 1;}" > conftest.c
+       echo "$LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \
+-dynamiclib -Wl,-single_module conftest.c" >&5
+       $LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \
+         -dynamiclib -Wl,-single_module conftest.c 2>conftest.err
+        _lt_result=$?
+       # If there is a non-empty error log, and "single_module"
+       # appears in it, assume the flag caused a linker warning
+        if test -s conftest.err && $GREP single_module conftest.err; then
+         cat conftest.err >&5
+       # Otherwise, if the output was created with a 0 exit code from
+       # the compiler, it worked.
+       elif test -f libconftest.dylib && test $_lt_result -eq 0; then
+         lt_cv_apple_cc_single_mod=yes
+       else
+         cat conftest.err >&5
+       fi
+       rm -rf libconftest.dylib*
+       rm -f conftest.*
+      fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_apple_cc_single_mod" >&5
+$as_echo "$lt_cv_apple_cc_single_mod" >&6; }
+
+    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -exported_symbols_list linker flag" >&5
+$as_echo_n "checking for -exported_symbols_list linker flag... " >&6; }
+if ${lt_cv_ld_exported_symbols_list+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  lt_cv_ld_exported_symbols_list=no
+      save_LDFLAGS=$LDFLAGS
+      echo "_main" > conftest.sym
+      LDFLAGS="$LDFLAGS -Wl,-exported_symbols_list,conftest.sym"
+      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  lt_cv_ld_exported_symbols_list=yes
+else
+  lt_cv_ld_exported_symbols_list=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+       LDFLAGS="$save_LDFLAGS"
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_exported_symbols_list" >&5
+$as_echo "$lt_cv_ld_exported_symbols_list" >&6; }
+
+    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -force_load linker flag" >&5
+$as_echo_n "checking for -force_load linker flag... " >&6; }
+if ${lt_cv_ld_force_load+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  lt_cv_ld_force_load=no
+      cat > conftest.c << _LT_EOF
+int forced_loaded() { return 2;}
+_LT_EOF
+      echo "$LTCC $LTCFLAGS -c -o conftest.o conftest.c" >&5
+      $LTCC $LTCFLAGS -c -o conftest.o conftest.c 2>&5
+      echo "$AR cru libconftest.a conftest.o" >&5
+      $AR cru libconftest.a conftest.o 2>&5
+      echo "$RANLIB libconftest.a" >&5
+      $RANLIB libconftest.a 2>&5
+      cat > conftest.c << _LT_EOF
+int main() { return 0;}
+_LT_EOF
+      echo "$LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a" >&5
+      $LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a 2>conftest.err
+      _lt_result=$?
+      if test -s conftest.err && $GREP force_load conftest.err; then
+       cat conftest.err >&5
+      elif test -f conftest && test $_lt_result -eq 0 && $GREP forced_load conftest >/dev/null 2>&1 ; then
+       lt_cv_ld_force_load=yes
+      else
+       cat conftest.err >&5
+      fi
+        rm -f conftest.err libconftest.a conftest conftest.c
+        rm -rf conftest.dSYM
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_force_load" >&5
+$as_echo "$lt_cv_ld_force_load" >&6; }
+    case $host_os in
+    rhapsody* | darwin1.[012])
+      _lt_dar_allow_undefined='${wl}-undefined ${wl}suppress' ;;
+    darwin1.*)
+      _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;;
+    darwin*) # darwin 5.x on
+      # if running on 10.5 or later, the deployment target defaults
+      # to the OS version, if on x86, and 10.4, the deployment
+      # target defaults to 10.4. Don't you love it?
+      case ${MACOSX_DEPLOYMENT_TARGET-10.0},$host in
+       10.0,*86*-darwin8*|10.0,*-darwin[91]*)
+         _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;;
+       10.[012]*)
+         _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;;
+       10.*)
+         _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;;
+      esac
+    ;;
+  esac
+    if test "$lt_cv_apple_cc_single_mod" = "yes"; then
+      _lt_dar_single_mod='$single_module'
+    fi
+    if test "$lt_cv_ld_exported_symbols_list" = "yes"; then
+      _lt_dar_export_syms=' ${wl}-exported_symbols_list,$output_objdir/${libname}-symbols.expsym'
+    else
+      _lt_dar_export_syms='~$NMEDIT -s $output_objdir/${libname}-symbols.expsym ${lib}'
+    fi
+    if test "$DSYMUTIL" != ":" && test "$lt_cv_ld_force_load" = "no"; then
+      _lt_dsymutil='~$DSYMUTIL $lib || :'
+    else
+      _lt_dsymutil=
+    fi
+    ;;
+  esac
+
+for ac_header in dlfcn.h
+do :
+  ac_fn_c_check_header_compile "$LINENO" "dlfcn.h" "ac_cv_header_dlfcn_h" "$ac_includes_default
+"
+if test "x$ac_cv_header_dlfcn_h" = xyes; then :
+  cat >>confdefs.h <<_ACEOF
+#define HAVE_DLFCN_H 1
+_ACEOF
+
+fi
+
+done
+
+
+
+
+
+# Set options
+
+
+
+        enable_dlopen=no
+
+
+
+            # Check whether --enable-shared was given.
+if test "${enable_shared+set}" = set; then :
+  enableval=$enable_shared; p=${PACKAGE-default}
+    case $enableval in
+    yes) enable_shared=yes ;;
+    no) enable_shared=no ;;
+    *)
+      enable_shared=no
+      # Look at the argument we got.  We use all the common list separators.
+      lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR,"
+      for pkg in $enableval; do
+       IFS="$lt_save_ifs"
+       if test "X$pkg" = "X$p"; then
+         enable_shared=yes
+       fi
+      done
+      IFS="$lt_save_ifs"
+      ;;
+    esac
+else
+  enable_shared=yes
+fi
+
+
+
+
+
+
+
+
+
+  # Check whether --enable-static was given.
+if test "${enable_static+set}" = set; then :
+  enableval=$enable_static; p=${PACKAGE-default}
+    case $enableval in
+    yes) enable_static=yes ;;
+    no) enable_static=no ;;
+    *)
+     enable_static=no
+      # Look at the argument we got.  We use all the common list separators.
+      lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR,"
+      for pkg in $enableval; do
+       IFS="$lt_save_ifs"
+       if test "X$pkg" = "X$p"; then
+         enable_static=yes
+       fi
+      done
+      IFS="$lt_save_ifs"
+      ;;
+    esac
+else
+  enable_static=yes
+fi
+
+
+
+
+
+
+
+
+
+
+# Check whether --with-pic was given.
+if test "${with_pic+set}" = set; then :
+  withval=$with_pic; lt_p=${PACKAGE-default}
+    case $withval in
+    yes|no) pic_mode=$withval ;;
+    *)
+      pic_mode=default
+      # Look at the argument we got.  We use all the common list separators.
+      lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR,"
+      for lt_pkg in $withval; do
+       IFS="$lt_save_ifs"
+       if test "X$lt_pkg" = "X$lt_p"; then
+         pic_mode=yes
+       fi
+      done
+      IFS="$lt_save_ifs"
+      ;;
+    esac
+else
+  pic_mode=default
+fi
+
+
+test -z "$pic_mode" && pic_mode=default
+
+
+
+
+
+
+
+  # Check whether --enable-fast-install was given.
+if test "${enable_fast_install+set}" = set; then :
+  enableval=$enable_fast_install; p=${PACKAGE-default}
+    case $enableval in
+    yes) enable_fast_install=yes ;;
+    no) enable_fast_install=no ;;
+    *)
+      enable_fast_install=no
+      # Look at the argument we got.  We use all the common list separators.
+      lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR,"
+      for pkg in $enableval; do
+       IFS="$lt_save_ifs"
+       if test "X$pkg" = "X$p"; then
+         enable_fast_install=yes
+       fi
+      done
+      IFS="$lt_save_ifs"
+      ;;
+    esac
+else
+  enable_fast_install=yes
+fi
+
+
+
+
+
+
+
+
+
+
+
+# This can be used to rebuild libtool when needed
+LIBTOOL_DEPS="$ltmain"
+
+# Always use our own libtool.
+LIBTOOL='$(SHELL) $(top_builddir)/libtool'
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+test -z "$LN_S" && LN_S="ln -s"
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+if test -n "${ZSH_VERSION+set}" ; then
+   setopt NO_GLOB_SUBST
+fi
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for objdir" >&5
+$as_echo_n "checking for objdir... " >&6; }
+if ${lt_cv_objdir+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  rm -f .libs 2>/dev/null
+mkdir .libs 2>/dev/null
+if test -d .libs; then
+  lt_cv_objdir=.libs
+else
+  # MS-DOS does not allow filenames that begin with a dot.
+  lt_cv_objdir=_libs
+fi
+rmdir .libs 2>/dev/null
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_objdir" >&5
+$as_echo "$lt_cv_objdir" >&6; }
+objdir=$lt_cv_objdir
+
+
+
+
+
+cat >>confdefs.h <<_ACEOF
+#define LT_OBJDIR "$lt_cv_objdir/"
+_ACEOF
+
+
+
+
+case $host_os in
+aix3*)
+  # AIX sometimes has problems with the GCC collect2 program.  For some
+  # reason, if we set the COLLECT_NAMES environment variable, the problems
+  # vanish in a puff of smoke.
+  if test "X${COLLECT_NAMES+set}" != Xset; then
+    COLLECT_NAMES=
+    export COLLECT_NAMES
+  fi
+  ;;
+esac
+
+# Global variables:
+ofile=libtool
+can_build_shared=yes
+
+# All known linkers require a `.a' archive for static linking (except MSVC,
+# which needs '.lib').
+libext=a
+
+with_gnu_ld="$lt_cv_prog_gnu_ld"
+
+old_CC="$CC"
+old_CFLAGS="$CFLAGS"
+
+# Set sane defaults for various variables
+test -z "$CC" && CC=cc
+test -z "$LTCC" && LTCC=$CC
+test -z "$LTCFLAGS" && LTCFLAGS=$CFLAGS
+test -z "$LD" && LD=ld
+test -z "$ac_objext" && ac_objext=o
+
+for cc_temp in $compiler""; do
+  case $cc_temp in
+    compile | *[\\/]compile | ccache | *[\\/]ccache ) ;;
+    distcc | *[\\/]distcc | purify | *[\\/]purify ) ;;
+    \-*) ;;
+    *) break;;
+  esac
+done
+cc_basename=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"`
+
+
+# Only perform the check for file, if the check method requires it
+test -z "$MAGIC_CMD" && MAGIC_CMD=file
+case $deplibs_check_method in
+file_magic*)
+  if test "$file_magic_cmd" = '$MAGIC_CMD'; then
+    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ${ac_tool_prefix}file" >&5
+$as_echo_n "checking for ${ac_tool_prefix}file... " >&6; }
+if ${lt_cv_path_MAGIC_CMD+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  case $MAGIC_CMD in
+[\\/*] |  ?:[\\/]*)
+  lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path.
+  ;;
+*)
+  lt_save_MAGIC_CMD="$MAGIC_CMD"
+  lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
+  ac_dummy="/usr/bin$PATH_SEPARATOR$PATH"
+  for ac_dir in $ac_dummy; do
+    IFS="$lt_save_ifs"
+    test -z "$ac_dir" && ac_dir=.
+    if test -f $ac_dir/${ac_tool_prefix}file; then
+      lt_cv_path_MAGIC_CMD="$ac_dir/${ac_tool_prefix}file"
+      if test -n "$file_magic_test_file"; then
+       case $deplibs_check_method in
+       "file_magic "*)
+         file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"`
+         MAGIC_CMD="$lt_cv_path_MAGIC_CMD"
+         if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null |
+           $EGREP "$file_magic_regex" > /dev/null; then
+           :
+         else
+           cat <<_LT_EOF 1>&2
+
+*** Warning: the command libtool uses to detect shared libraries,
+*** $file_magic_cmd, produces output that libtool cannot recognize.
+*** The result is that libtool may fail to recognize shared libraries
+*** as such.  This will affect the creation of libtool libraries that
+*** depend on shared libraries, but programs linked with such libtool
+*** libraries will work regardless of this problem.  Nevertheless, you
+*** may want to report the problem to your system manager and/or to
+*** bug-libtool@gnu.org
+
+_LT_EOF
+         fi ;;
+       esac
+      fi
+      break
+    fi
+  done
+  IFS="$lt_save_ifs"
+  MAGIC_CMD="$lt_save_MAGIC_CMD"
+  ;;
+esac
+fi
+
+MAGIC_CMD="$lt_cv_path_MAGIC_CMD"
+if test -n "$MAGIC_CMD"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MAGIC_CMD" >&5
+$as_echo "$MAGIC_CMD" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+
+
+
+if test -z "$lt_cv_path_MAGIC_CMD"; then
+  if test -n "$ac_tool_prefix"; then
+    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for file" >&5
+$as_echo_n "checking for file... " >&6; }
+if ${lt_cv_path_MAGIC_CMD+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  case $MAGIC_CMD in
+[\\/*] |  ?:[\\/]*)
+  lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path.
+  ;;
+*)
+  lt_save_MAGIC_CMD="$MAGIC_CMD"
+  lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
+  ac_dummy="/usr/bin$PATH_SEPARATOR$PATH"
+  for ac_dir in $ac_dummy; do
+    IFS="$lt_save_ifs"
+    test -z "$ac_dir" && ac_dir=.
+    if test -f $ac_dir/file; then
+      lt_cv_path_MAGIC_CMD="$ac_dir/file"
+      if test -n "$file_magic_test_file"; then
+       case $deplibs_check_method in
+       "file_magic "*)
+         file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"`
+         MAGIC_CMD="$lt_cv_path_MAGIC_CMD"
+         if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null |
+           $EGREP "$file_magic_regex" > /dev/null; then
+           :
+         else
+           cat <<_LT_EOF 1>&2
+
+*** Warning: the command libtool uses to detect shared libraries,
+*** $file_magic_cmd, produces output that libtool cannot recognize.
+*** The result is that libtool may fail to recognize shared libraries
+*** as such.  This will affect the creation of libtool libraries that
+*** depend on shared libraries, but programs linked with such libtool
+*** libraries will work regardless of this problem.  Nevertheless, you
+*** may want to report the problem to your system manager and/or to
+*** bug-libtool@gnu.org
+
+_LT_EOF
+         fi ;;
+       esac
+      fi
+      break
+    fi
+  done
+  IFS="$lt_save_ifs"
+  MAGIC_CMD="$lt_save_MAGIC_CMD"
+  ;;
+esac
+fi
+
+MAGIC_CMD="$lt_cv_path_MAGIC_CMD"
+if test -n "$MAGIC_CMD"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MAGIC_CMD" >&5
+$as_echo "$MAGIC_CMD" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+  else
+    MAGIC_CMD=:
+  fi
+fi
+
+  fi
+  ;;
+esac
+
+# Use C for the default configuration in the libtool script
+
+lt_save_CC="$CC"
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+
+# Source file extension for C test sources.
+ac_ext=c
+
+# Object file extension for compiled C test sources.
+objext=o
+objext=$objext
+
+# Code to be used in simple compile tests
+lt_simple_compile_test_code="int some_variable = 0;"
+
+# Code to be used in simple link tests
+lt_simple_link_test_code='int main(){return(0);}'
+
+
+
+
+
+
+
+# If no C compiler was specified, use CC.
+LTCC=${LTCC-"$CC"}
+
+# If no C compiler flags were specified, use CFLAGS.
+LTCFLAGS=${LTCFLAGS-"$CFLAGS"}
+
+# Allow CC to be a program name with arguments.
+compiler=$CC
+
+# Save the default compiler, since it gets overwritten when the other
+# tags are being tested, and _LT_TAGVAR(compiler, []) is a NOP.
+compiler_DEFAULT=$CC
+
+# save warnings/boilerplate of simple test code
+ac_outfile=conftest.$ac_objext
+echo "$lt_simple_compile_test_code" >conftest.$ac_ext
+eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err
+_lt_compiler_boilerplate=`cat conftest.err`
+$RM conftest*
+
+ac_outfile=conftest.$ac_objext
+echo "$lt_simple_link_test_code" >conftest.$ac_ext
+eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err
+_lt_linker_boilerplate=`cat conftest.err`
+$RM -r conftest*
+
+
+## CAVEAT EMPTOR:
+## There is no encapsulation within the following macros, do not change
+## the running order or otherwise move them around unless you know exactly
+## what you are doing...
+if test -n "$compiler"; then
+
+lt_prog_compiler_no_builtin_flag=
+
+if test "$GCC" = yes; then
+  case $cc_basename in
+  nvcc*)
+    lt_prog_compiler_no_builtin_flag=' -Xcompiler -fno-builtin' ;;
+  *)
+    lt_prog_compiler_no_builtin_flag=' -fno-builtin' ;;
+  esac
+
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -fno-rtti -fno-exceptions" >&5
+$as_echo_n "checking if $compiler supports -fno-rtti -fno-exceptions... " >&6; }
+if ${lt_cv_prog_compiler_rtti_exceptions+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  lt_cv_prog_compiler_rtti_exceptions=no
+   ac_outfile=conftest.$ac_objext
+   echo "$lt_simple_compile_test_code" > conftest.$ac_ext
+   lt_compiler_flag="-fno-rtti -fno-exceptions"
+   # Insert the option either (1) after the last *FLAGS variable, or
+   # (2) before a word containing "conftest.", or (3) at the end.
+   # Note that $ac_compile itself does not contain backslashes and begins
+   # with a dollar sign (not a hyphen), so the echo should work correctly.
+   # The option is referenced via a variable to avoid confusing sed.
+   lt_compile=`echo "$ac_compile" | $SED \
+   -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
+   -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
+   -e 's:$: $lt_compiler_flag:'`
+   (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5)
+   (eval "$lt_compile" 2>conftest.err)
+   ac_status=$?
+   cat conftest.err >&5
+   echo "$as_me:$LINENO: \$? = $ac_status" >&5
+   if (exit $ac_status) && test -s "$ac_outfile"; then
+     # The compiler can only warn and ignore the option if not recognized
+     # So say no if there are warnings other than the usual output.
+     $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp
+     $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
+     if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then
+       lt_cv_prog_compiler_rtti_exceptions=yes
+     fi
+   fi
+   $RM conftest*
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_rtti_exceptions" >&5
+$as_echo "$lt_cv_prog_compiler_rtti_exceptions" >&6; }
+
+if test x"$lt_cv_prog_compiler_rtti_exceptions" = xyes; then
+    lt_prog_compiler_no_builtin_flag="$lt_prog_compiler_no_builtin_flag -fno-rtti -fno-exceptions"
+else
+    :
+fi
+
+fi
+
+
+
+
+
+
+  lt_prog_compiler_wl=
+lt_prog_compiler_pic=
+lt_prog_compiler_static=
+
+
+  if test "$GCC" = yes; then
+    lt_prog_compiler_wl='-Wl,'
+    lt_prog_compiler_static='-static'
+
+    case $host_os in
+      aix*)
+      # All AIX code is PIC.
+      if test "$host_cpu" = ia64; then
+       # AIX 5 now supports IA64 processor
+       lt_prog_compiler_static='-Bstatic'
+      fi
+      ;;
+
+    amigaos*)
+      case $host_cpu in
+      powerpc)
+            # see comment about AmigaOS4 .so support
+            lt_prog_compiler_pic='-fPIC'
+        ;;
+      m68k)
+            # FIXME: we need at least 68020 code to build shared libraries, but
+            # adding the `-m68020' flag to GCC prevents building anything better,
+            # like `-m68040'.
+            lt_prog_compiler_pic='-m68020 -resident32 -malways-restore-a4'
+        ;;
+      esac
+      ;;
+
+    beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*)
+      # PIC is the default for these OSes.
+      ;;
+
+    mingw* | cygwin* | pw32* | os2* | cegcc*)
+      # This hack is so that the source file can tell whether it is being
+      # built for inclusion in a dll (and should export symbols for example).
+      # Although the cygwin gcc ignores -fPIC, still need this for old-style
+      # (--disable-auto-import) libraries
+      lt_prog_compiler_pic='-DDLL_EXPORT'
+      ;;
+
+    darwin* | rhapsody*)
+      # PIC is the default on this platform
+      # Common symbols not allowed in MH_DYLIB files
+      lt_prog_compiler_pic='-fno-common'
+      ;;
+
+    haiku*)
+      # PIC is the default for Haiku.
+      # The "-static" flag exists, but is broken.
+      lt_prog_compiler_static=
+      ;;
+
+    hpux*)
+      # PIC is the default for 64-bit PA HP-UX, but not for 32-bit
+      # PA HP-UX.  On IA64 HP-UX, PIC is the default but the pic flag
+      # sets the default TLS model and affects inlining.
+      case $host_cpu in
+      hppa*64*)
+       # +Z the default
+       ;;
+      *)
+       lt_prog_compiler_pic='-fPIC'
+       ;;
+      esac
+      ;;
+
+    interix[3-9]*)
+      # Interix 3.x gcc -fpic/-fPIC options generate broken code.
+      # Instead, we relocate shared libraries at runtime.
+      ;;
+
+    msdosdjgpp*)
+      # Just because we use GCC doesn't mean we suddenly get shared libraries
+      # on systems that don't support them.
+      lt_prog_compiler_can_build_shared=no
+      enable_shared=no
+      ;;
+
+    *nto* | *qnx*)
+      # QNX uses GNU C++, but need to define -shared option too, otherwise
+      # it will coredump.
+      lt_prog_compiler_pic='-fPIC -shared'
+      ;;
+
+    sysv4*MP*)
+      if test -d /usr/nec; then
+       lt_prog_compiler_pic=-Kconform_pic
+      fi
+      ;;
+
+    *)
+      lt_prog_compiler_pic='-fPIC'
+      ;;
+    esac
+
+    case $cc_basename in
+    nvcc*) # Cuda Compiler Driver 2.2
+      lt_prog_compiler_wl='-Xlinker '
+      if test -n "$lt_prog_compiler_pic"; then
+        lt_prog_compiler_pic="-Xcompiler $lt_prog_compiler_pic"
+      fi
+      ;;
+    esac
+  else
+    # PORTME Check for flag to pass linker flags through the system compiler.
+    case $host_os in
+    aix*)
+      lt_prog_compiler_wl='-Wl,'
+      if test "$host_cpu" = ia64; then
+       # AIX 5 now supports IA64 processor
+       lt_prog_compiler_static='-Bstatic'
+      else
+       lt_prog_compiler_static='-bnso -bI:/lib/syscalls.exp'
+      fi
+      ;;
+
+    mingw* | cygwin* | pw32* | os2* | cegcc*)
+      # This hack is so that the source file can tell whether it is being
+      # built for inclusion in a dll (and should export symbols for example).
+      lt_prog_compiler_pic='-DDLL_EXPORT'
+      ;;
+
+    hpux9* | hpux10* | hpux11*)
+      lt_prog_compiler_wl='-Wl,'
+      # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but
+      # not for PA HP-UX.
+      case $host_cpu in
+      hppa*64*|ia64*)
+       # +Z the default
+       ;;
+      *)
+       lt_prog_compiler_pic='+Z'
+       ;;
+      esac
+      # Is there a better lt_prog_compiler_static that works with the bundled CC?
+      lt_prog_compiler_static='${wl}-a ${wl}archive'
+      ;;
+
+    irix5* | irix6* | nonstopux*)
+      lt_prog_compiler_wl='-Wl,'
+      # PIC (with -KPIC) is the default.
+      lt_prog_compiler_static='-non_shared'
+      ;;
+
+    linux* | k*bsd*-gnu | kopensolaris*-gnu)
+      case $cc_basename in
+      # old Intel for x86_64 which still supported -KPIC.
+      ecc*)
+       lt_prog_compiler_wl='-Wl,'
+       lt_prog_compiler_pic='-KPIC'
+       lt_prog_compiler_static='-static'
+        ;;
+      # icc used to be incompatible with GCC.
+      # ICC 10 doesn't accept -KPIC any more.
+      icc* | ifort*)
+       lt_prog_compiler_wl='-Wl,'
+       lt_prog_compiler_pic='-fPIC'
+       lt_prog_compiler_static='-static'
+        ;;
+      # Lahey Fortran 8.1.
+      lf95*)
+       lt_prog_compiler_wl='-Wl,'
+       lt_prog_compiler_pic='--shared'
+       lt_prog_compiler_static='--static'
+       ;;
+      nagfor*)
+       # NAG Fortran compiler
+       lt_prog_compiler_wl='-Wl,-Wl,,'
+       lt_prog_compiler_pic='-PIC'
+       lt_prog_compiler_static='-Bstatic'
+       ;;
+      pgcc* | pgf77* | pgf90* | pgf95* | pgfortran*)
+        # Portland Group compilers (*not* the Pentium gcc compiler,
+       # which looks to be a dead project)
+       lt_prog_compiler_wl='-Wl,'
+       lt_prog_compiler_pic='-fpic'
+       lt_prog_compiler_static='-Bstatic'
+        ;;
+      ccc*)
+        lt_prog_compiler_wl='-Wl,'
+        # All Alpha code is PIC.
+        lt_prog_compiler_static='-non_shared'
+        ;;
+      xl* | bgxl* | bgf* | mpixl*)
+       # IBM XL C 8.0/Fortran 10.1, 11.1 on PPC and BlueGene
+       lt_prog_compiler_wl='-Wl,'
+       lt_prog_compiler_pic='-qpic'
+       lt_prog_compiler_static='-qstaticlink'
+       ;;
+      *)
+       case `$CC -V 2>&1 | sed 5q` in
+       *Sun\ Ceres\ Fortran* | *Sun*Fortran*\ [1-7].* | *Sun*Fortran*\ 8.[0-3]*)
+         # Sun Fortran 8.3 passes all unrecognized flags to the linker
+         lt_prog_compiler_pic='-KPIC'
+         lt_prog_compiler_static='-Bstatic'
+         lt_prog_compiler_wl=''
+         ;;
+       *Sun\ F* | *Sun*Fortran*)
+         lt_prog_compiler_pic='-KPIC'
+         lt_prog_compiler_static='-Bstatic'
+         lt_prog_compiler_wl='-Qoption ld '
+         ;;
+       *Sun\ C*)
+         # Sun C 5.9
+         lt_prog_compiler_pic='-KPIC'
+         lt_prog_compiler_static='-Bstatic'
+         lt_prog_compiler_wl='-Wl,'
+         ;;
+        *Intel*\ [CF]*Compiler*)
+         lt_prog_compiler_wl='-Wl,'
+         lt_prog_compiler_pic='-fPIC'
+         lt_prog_compiler_static='-static'
+         ;;
+       *Portland\ Group*)
+         lt_prog_compiler_wl='-Wl,'
+         lt_prog_compiler_pic='-fpic'
+         lt_prog_compiler_static='-Bstatic'
+         ;;
+       esac
+       ;;
+      esac
+      ;;
+
+    newsos6)
+      lt_prog_compiler_pic='-KPIC'
+      lt_prog_compiler_static='-Bstatic'
+      ;;
+
+    *nto* | *qnx*)
+      # QNX uses GNU C++, but need to define -shared option too, otherwise
+      # it will coredump.
+      lt_prog_compiler_pic='-fPIC -shared'
+      ;;
+
+    osf3* | osf4* | osf5*)
+      lt_prog_compiler_wl='-Wl,'
+      # All OSF/1 code is PIC.
+      lt_prog_compiler_static='-non_shared'
+      ;;
+
+    rdos*)
+      lt_prog_compiler_static='-non_shared'
+      ;;
+
+    solaris*)
+      lt_prog_compiler_pic='-KPIC'
+      lt_prog_compiler_static='-Bstatic'
+      case $cc_basename in
+      f77* | f90* | f95* | sunf77* | sunf90* | sunf95*)
+       lt_prog_compiler_wl='-Qoption ld ';;
+      *)
+       lt_prog_compiler_wl='-Wl,';;
+      esac
+      ;;
+
+    sunos4*)
+      lt_prog_compiler_wl='-Qoption ld '
+      lt_prog_compiler_pic='-PIC'
+      lt_prog_compiler_static='-Bstatic'
+      ;;
+
+    sysv4 | sysv4.2uw2* | sysv4.3*)
+      lt_prog_compiler_wl='-Wl,'
+      lt_prog_compiler_pic='-KPIC'
+      lt_prog_compiler_static='-Bstatic'
+      ;;
+
+    sysv4*MP*)
+      if test -d /usr/nec ;then
+       lt_prog_compiler_pic='-Kconform_pic'
+       lt_prog_compiler_static='-Bstatic'
+      fi
+      ;;
+
+    sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*)
+      lt_prog_compiler_wl='-Wl,'
+      lt_prog_compiler_pic='-KPIC'
+      lt_prog_compiler_static='-Bstatic'
+      ;;
+
+    unicos*)
+      lt_prog_compiler_wl='-Wl,'
+      lt_prog_compiler_can_build_shared=no
+      ;;
+
+    uts4*)
+      lt_prog_compiler_pic='-pic'
+      lt_prog_compiler_static='-Bstatic'
+      ;;
+
+    *)
+      lt_prog_compiler_can_build_shared=no
+      ;;
+    esac
+  fi
+
+case $host_os in
+  # For platforms which do not support PIC, -DPIC is meaningless:
+  *djgpp*)
+    lt_prog_compiler_pic=
+    ;;
+  *)
+    lt_prog_compiler_pic="$lt_prog_compiler_pic -DPIC"
+    ;;
+esac
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $compiler option to produce PIC" >&5
+$as_echo_n "checking for $compiler option to produce PIC... " >&6; }
+if ${lt_cv_prog_compiler_pic+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  lt_cv_prog_compiler_pic=$lt_prog_compiler_pic
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic" >&5
+$as_echo "$lt_cv_prog_compiler_pic" >&6; }
+lt_prog_compiler_pic=$lt_cv_prog_compiler_pic
+
+#
+# Check to make sure the PIC flag actually works.
+#
+if test -n "$lt_prog_compiler_pic"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler PIC flag $lt_prog_compiler_pic works" >&5
+$as_echo_n "checking if $compiler PIC flag $lt_prog_compiler_pic works... " >&6; }
+if ${lt_cv_prog_compiler_pic_works+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  lt_cv_prog_compiler_pic_works=no
+   ac_outfile=conftest.$ac_objext
+   echo "$lt_simple_compile_test_code" > conftest.$ac_ext
+   lt_compiler_flag="$lt_prog_compiler_pic -DPIC"
+   # Insert the option either (1) after the last *FLAGS variable, or
+   # (2) before a word containing "conftest.", or (3) at the end.
+   # Note that $ac_compile itself does not contain backslashes and begins
+   # with a dollar sign (not a hyphen), so the echo should work correctly.
+   # The option is referenced via a variable to avoid confusing sed.
+   lt_compile=`echo "$ac_compile" | $SED \
+   -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
+   -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
+   -e 's:$: $lt_compiler_flag:'`
+   (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5)
+   (eval "$lt_compile" 2>conftest.err)
+   ac_status=$?
+   cat conftest.err >&5
+   echo "$as_me:$LINENO: \$? = $ac_status" >&5
+   if (exit $ac_status) && test -s "$ac_outfile"; then
+     # The compiler can only warn and ignore the option if not recognized
+     # So say no if there are warnings other than the usual output.
+     $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp
+     $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
+     if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then
+       lt_cv_prog_compiler_pic_works=yes
+     fi
+   fi
+   $RM conftest*
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_works" >&5
+$as_echo "$lt_cv_prog_compiler_pic_works" >&6; }
+
+if test x"$lt_cv_prog_compiler_pic_works" = xyes; then
+    case $lt_prog_compiler_pic in
+     "" | " "*) ;;
+     *) lt_prog_compiler_pic=" $lt_prog_compiler_pic" ;;
+     esac
+else
+    lt_prog_compiler_pic=
+     lt_prog_compiler_can_build_shared=no
+fi
+
+fi
+
+
+
+
+
+
+
+
+
+
+
+#
+# Check to make sure the static flag actually works.
+#
+wl=$lt_prog_compiler_wl eval lt_tmp_static_flag=\"$lt_prog_compiler_static\"
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler static flag $lt_tmp_static_flag works" >&5
+$as_echo_n "checking if $compiler static flag $lt_tmp_static_flag works... " >&6; }
+if ${lt_cv_prog_compiler_static_works+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  lt_cv_prog_compiler_static_works=no
+   save_LDFLAGS="$LDFLAGS"
+   LDFLAGS="$LDFLAGS $lt_tmp_static_flag"
+   echo "$lt_simple_link_test_code" > conftest.$ac_ext
+   if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then
+     # The linker can only warn and ignore the option if not recognized
+     # So say no if there are warnings
+     if test -s conftest.err; then
+       # Append any errors to the config.log.
+       cat conftest.err 1>&5
+       $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp
+       $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
+       if diff conftest.exp conftest.er2 >/dev/null; then
+         lt_cv_prog_compiler_static_works=yes
+       fi
+     else
+       lt_cv_prog_compiler_static_works=yes
+     fi
+   fi
+   $RM -r conftest*
+   LDFLAGS="$save_LDFLAGS"
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_static_works" >&5
+$as_echo "$lt_cv_prog_compiler_static_works" >&6; }
+
+if test x"$lt_cv_prog_compiler_static_works" = xyes; then
+    :
+else
+    lt_prog_compiler_static=
+fi
+
+
+
+
+
+
+
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5
+$as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; }
+if ${lt_cv_prog_compiler_c_o+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  lt_cv_prog_compiler_c_o=no
+   $RM -r conftest 2>/dev/null
+   mkdir conftest
+   cd conftest
+   mkdir out
+   echo "$lt_simple_compile_test_code" > conftest.$ac_ext
+
+   lt_compiler_flag="-o out/conftest2.$ac_objext"
+   # Insert the option either (1) after the last *FLAGS variable, or
+   # (2) before a word containing "conftest.", or (3) at the end.
+   # Note that $ac_compile itself does not contain backslashes and begins
+   # with a dollar sign (not a hyphen), so the echo should work correctly.
+   lt_compile=`echo "$ac_compile" | $SED \
+   -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
+   -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
+   -e 's:$: $lt_compiler_flag:'`
+   (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5)
+   (eval "$lt_compile" 2>out/conftest.err)
+   ac_status=$?
+   cat out/conftest.err >&5
+   echo "$as_me:$LINENO: \$? = $ac_status" >&5
+   if (exit $ac_status) && test -s out/conftest2.$ac_objext
+   then
+     # The compiler can only warn and ignore the option if not recognized
+     # So say no if there are warnings
+     $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp
+     $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2
+     if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then
+       lt_cv_prog_compiler_c_o=yes
+     fi
+   fi
+   chmod u+w . 2>&5
+   $RM conftest*
+   # SGI C++ compiler will create directory out/ii_files/ for
+   # template instantiation
+   test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files
+   $RM out/* && rmdir out
+   cd ..
+   $RM -r conftest
+   $RM conftest*
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o" >&5
+$as_echo "$lt_cv_prog_compiler_c_o" >&6; }
+
+
+
+
+
+
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5
+$as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; }
+if ${lt_cv_prog_compiler_c_o+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  lt_cv_prog_compiler_c_o=no
+   $RM -r conftest 2>/dev/null
+   mkdir conftest
+   cd conftest
+   mkdir out
+   echo "$lt_simple_compile_test_code" > conftest.$ac_ext
+
+   lt_compiler_flag="-o out/conftest2.$ac_objext"
+   # Insert the option either (1) after the last *FLAGS variable, or
+   # (2) before a word containing "conftest.", or (3) at the end.
+   # Note that $ac_compile itself does not contain backslashes and begins
+   # with a dollar sign (not a hyphen), so the echo should work correctly.
+   lt_compile=`echo "$ac_compile" | $SED \
+   -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
+   -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
+   -e 's:$: $lt_compiler_flag:'`
+   (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5)
+   (eval "$lt_compile" 2>out/conftest.err)
+   ac_status=$?
+   cat out/conftest.err >&5
+   echo "$as_me:$LINENO: \$? = $ac_status" >&5
+   if (exit $ac_status) && test -s out/conftest2.$ac_objext
+   then
+     # The compiler can only warn and ignore the option if not recognized
+     # So say no if there are warnings
+     $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp
+     $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2
+     if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then
+       lt_cv_prog_compiler_c_o=yes
+     fi
+   fi
+   chmod u+w . 2>&5
+   $RM conftest*
+   # SGI C++ compiler will create directory out/ii_files/ for
+   # template instantiation
+   test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files
+   $RM out/* && rmdir out
+   cd ..
+   $RM -r conftest
+   $RM conftest*
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o" >&5
+$as_echo "$lt_cv_prog_compiler_c_o" >&6; }
+
+
+
+
+hard_links="nottested"
+if test "$lt_cv_prog_compiler_c_o" = no && test "$need_locks" != no; then
+  # do not overwrite the value of need_locks provided by the user
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking if we can lock with hard links" >&5
+$as_echo_n "checking if we can lock with hard links... " >&6; }
+  hard_links=yes
+  $RM conftest*
+  ln conftest.a conftest.b 2>/dev/null && hard_links=no
+  touch conftest.a
+  ln conftest.a conftest.b 2>&5 || hard_links=no
+  ln conftest.a conftest.b 2>/dev/null && hard_links=no
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $hard_links" >&5
+$as_echo "$hard_links" >&6; }
+  if test "$hard_links" = no; then
+    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&5
+$as_echo "$as_me: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&2;}
+    need_locks=warn
+  fi
+else
+  need_locks=no
+fi
+
+
+
+
+
+
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries" >&5
+$as_echo_n "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; }
+
+  runpath_var=
+  allow_undefined_flag=
+  always_export_symbols=no
+  archive_cmds=
+  archive_expsym_cmds=
+  compiler_needs_object=no
+  enable_shared_with_static_runtimes=no
+  export_dynamic_flag_spec=
+  export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols'
+  hardcode_automatic=no
+  hardcode_direct=no
+  hardcode_direct_absolute=no
+  hardcode_libdir_flag_spec=
+  hardcode_libdir_separator=
+  hardcode_minus_L=no
+  hardcode_shlibpath_var=unsupported
+  inherit_rpath=no
+  link_all_deplibs=unknown
+  module_cmds=
+  module_expsym_cmds=
+  old_archive_from_new_cmds=
+  old_archive_from_expsyms_cmds=
+  thread_safe_flag_spec=
+  whole_archive_flag_spec=
+  # include_expsyms should be a list of space-separated symbols to be *always*
+  # included in the symbol list
+  include_expsyms=
+  # exclude_expsyms can be an extended regexp of symbols to exclude
+  # it will be wrapped by ` (' and `)$', so one must not match beginning or
+  # end of line.  Example: `a|bc|.*d.*' will exclude the symbols `a' and `bc',
+  # as well as any symbol that contains `d'.
+  exclude_expsyms='_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*'
+  # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out
+  # platforms (ab)use it in PIC code, but their linkers get confused if
+  # the symbol is explicitly referenced.  Since portable code cannot
+  # rely on this symbol name, it's probably fine to never include it in
+  # preloaded symbol tables.
+  # Exclude shared library initialization/finalization symbols.
+  extract_expsyms_cmds=
+
+  case $host_os in
+  cygwin* | mingw* | pw32* | cegcc*)
+    # FIXME: the MSVC++ port hasn't been tested in a loooong time
+    # When not using gcc, we currently assume that we are using
+    # Microsoft Visual C++.
+    if test "$GCC" != yes; then
+      with_gnu_ld=no
+    fi
+    ;;
+  interix*)
+    # we just hope/assume this is gcc and not c89 (= MSVC++)
+    with_gnu_ld=yes
+    ;;
+  openbsd*)
+    with_gnu_ld=no
+    ;;
+  linux* | k*bsd*-gnu | gnu*)
+    link_all_deplibs=no
+    ;;
+  esac
+
+  ld_shlibs=yes
+
+  # On some targets, GNU ld is compatible enough with the native linker
+  # that we're better off using the native interface for both.
+  lt_use_gnu_ld_interface=no
+  if test "$with_gnu_ld" = yes; then
+    case $host_os in
+      aix*)
+       # The AIX port of GNU ld has always aspired to compatibility
+       # with the native linker.  However, as the warning in the GNU ld
+       # block says, versions before 2.19.5* couldn't really create working
+       # shared libraries, regardless of the interface used.
+       case `$LD -v 2>&1` in
+         *\ \(GNU\ Binutils\)\ 2.19.5*) ;;
+         *\ \(GNU\ Binutils\)\ 2.[2-9]*) ;;
+         *\ \(GNU\ Binutils\)\ [3-9]*) ;;
+         *)
+           lt_use_gnu_ld_interface=yes
+           ;;
+       esac
+       ;;
+      *)
+       lt_use_gnu_ld_interface=yes
+       ;;
+    esac
+  fi
+
+  if test "$lt_use_gnu_ld_interface" = yes; then
+    # If archive_cmds runs LD, not CC, wlarc should be empty
+    wlarc='${wl}'
+
+    # Set some defaults for GNU ld with shared library support. These
+    # are reset later if shared libraries are not supported. Putting them
+    # here allows them to be overridden if necessary.
+    runpath_var=LD_RUN_PATH
+    hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
+    export_dynamic_flag_spec='${wl}--export-dynamic'
+    # ancient GNU ld didn't support --whole-archive et. al.
+    if $LD --help 2>&1 | $GREP 'no-whole-archive' > /dev/null; then
+      whole_archive_flag_spec="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive'
+    else
+      whole_archive_flag_spec=
+    fi
+    supports_anon_versioning=no
+    case `$LD -v 2>&1` in
+      *GNU\ gold*) supports_anon_versioning=yes ;;
+      *\ [01].* | *\ 2.[0-9].* | *\ 2.10.*) ;; # catch versions < 2.11
+      *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ...
+      *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ...
+      *\ 2.11.*) ;; # other 2.11 versions
+      *) supports_anon_versioning=yes ;;
+    esac
+
+    # See if GNU ld supports shared libraries.
+    case $host_os in
+    aix[3-9]*)
+      # On AIX/PPC, the GNU linker is very broken
+      if test "$host_cpu" != ia64; then
+       ld_shlibs=no
+       cat <<_LT_EOF 1>&2
+
+*** Warning: the GNU linker, at least up to release 2.19, is reported
+*** to be unable to reliably create shared libraries on AIX.
+*** Therefore, libtool is disabling shared libraries support.  If you
+*** really care for shared libraries, you may want to install binutils
+*** 2.20 or above, or modify your PATH so that a non-GNU linker is found.
+*** You will then need to restart the configuration process.
+
+_LT_EOF
+      fi
+      ;;
+
+    amigaos*)
+      case $host_cpu in
+      powerpc)
+            # see comment about AmigaOS4 .so support
+            archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+            archive_expsym_cmds=''
+        ;;
+      m68k)
+            archive_cmds='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)'
+            hardcode_libdir_flag_spec='-L$libdir'
+            hardcode_minus_L=yes
+        ;;
+      esac
+      ;;
+
+    beos*)
+      if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
+       allow_undefined_flag=unsupported
+       # Joseph Beckenbach <jrb3@best.com> says some releases of gcc
+       # support --undefined.  This deserves some investigation.  FIXME
+       archive_cmds='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+      else
+       ld_shlibs=no
+      fi
+      ;;
+
+    cygwin* | mingw* | pw32* | cegcc*)
+      # _LT_TAGVAR(hardcode_libdir_flag_spec, ) is actually meaningless,
+      # as there is no search path for DLLs.
+      hardcode_libdir_flag_spec='-L$libdir'
+      export_dynamic_flag_spec='${wl}--export-all-symbols'
+      allow_undefined_flag=unsupported
+      always_export_symbols=no
+      enable_shared_with_static_runtimes=yes
+      export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1 DATA/;s/^.*[ ]__nm__\([^ ]*\)[ ][^ ]*/\1 DATA/;/^I[ ]/d;/^[AITW][ ]/s/.* //'\'' | sort | uniq > $export_symbols'
+      exclude_expsyms='[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname'
+
+      if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then
+        archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
+       # If the export-symbols file already is a .def file (1st line
+       # is EXPORTS), use it as is; otherwise, prepend...
+       archive_expsym_cmds='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then
+         cp $export_symbols $output_objdir/$soname.def;
+       else
+         echo EXPORTS > $output_objdir/$soname.def;
+         cat $export_symbols >> $output_objdir/$soname.def;
+       fi~
+       $CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
+      else
+       ld_shlibs=no
+      fi
+      ;;
+
+    haiku*)
+      archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+      link_all_deplibs=yes
+      ;;
+
+    interix[3-9]*)
+      hardcode_direct=no
+      hardcode_shlibpath_var=no
+      hardcode_libdir_flag_spec='${wl}-rpath,$libdir'
+      export_dynamic_flag_spec='${wl}-E'
+      # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc.
+      # Instead, shared libraries are loaded at an image base (0x10000000 by
+      # default) and relocated if they conflict, which is a slow very memory
+      # consuming and fragmenting process.  To avoid this, we pick a random,
+      # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link
+      # time.  Moving up from 0x10000000 also allows more sbrk(2) space.
+      archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
+      archive_expsym_cmds='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
+      ;;
+
+    gnu* | linux* | tpf* | k*bsd*-gnu | kopensolaris*-gnu)
+      tmp_diet=no
+      if test "$host_os" = linux-dietlibc; then
+       case $cc_basename in
+         diet\ *) tmp_diet=yes;;       # linux-dietlibc with static linking (!diet-dyn)
+       esac
+      fi
+      if $LD --help 2>&1 | $EGREP ': supported targets:.* elf' > /dev/null \
+        && test "$tmp_diet" = no
+      then
+       tmp_addflag=' $pic_flag'
+       tmp_sharedflag='-shared'
+       case $cc_basename,$host_cpu in
+        pgcc*)                         # Portland Group C compiler
+         whole_archive_flag_spec='${wl}--whole-archive`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive'
+         tmp_addflag=' $pic_flag'
+         ;;
+       pgf77* | pgf90* | pgf95* | pgfortran*)
+                                       # Portland Group f77 and f90 compilers
+         whole_archive_flag_spec='${wl}--whole-archive`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive'
+         tmp_addflag=' $pic_flag -Mnomain' ;;
+       ecc*,ia64* | icc*,ia64*)        # Intel C compiler on ia64
+         tmp_addflag=' -i_dynamic' ;;
+       efc*,ia64* | ifort*,ia64*)      # Intel Fortran compiler on ia64
+         tmp_addflag=' -i_dynamic -nofor_main' ;;
+       ifc* | ifort*)                  # Intel Fortran compiler
+         tmp_addflag=' -nofor_main' ;;
+       lf95*)                          # Lahey Fortran 8.1
+         whole_archive_flag_spec=
+         tmp_sharedflag='--shared' ;;
+       xl[cC]* | bgxl[cC]* | mpixl[cC]*) # IBM XL C 8.0 on PPC (deal with xlf below)
+         tmp_sharedflag='-qmkshrobj'
+         tmp_addflag= ;;
+       nvcc*)  # Cuda Compiler Driver 2.2
+         whole_archive_flag_spec='${wl}--whole-archive`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive'
+         compiler_needs_object=yes
+         ;;
+       esac
+       case `$CC -V 2>&1 | sed 5q` in
+       *Sun\ C*)                       # Sun C 5.9
+         whole_archive_flag_spec='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive'
+         compiler_needs_object=yes
+         tmp_sharedflag='-G' ;;
+       *Sun\ F*)                       # Sun Fortran 8.3
+         tmp_sharedflag='-G' ;;
+       esac
+       archive_cmds='$CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+
+        if test "x$supports_anon_versioning" = xyes; then
+          archive_expsym_cmds='echo "{ global:" > $output_objdir/$libname.ver~
+           cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~
+           echo "local: *; };" >> $output_objdir/$libname.ver~
+           $CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib'
+        fi
+
+       case $cc_basename in
+       xlf* | bgf* | bgxlf* | mpixlf*)
+         # IBM XL Fortran 10.1 on PPC cannot create shared libs itself
+         whole_archive_flag_spec='--whole-archive$convenience --no-whole-archive'
+         hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
+         archive_cmds='$LD -shared $libobjs $deplibs $linker_flags -soname $soname -o $lib'
+         if test "x$supports_anon_versioning" = xyes; then
+           archive_expsym_cmds='echo "{ global:" > $output_objdir/$libname.ver~
+             cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~
+             echo "local: *; };" >> $output_objdir/$libname.ver~
+             $LD -shared $libobjs $deplibs $linker_flags -soname $soname -version-script $output_objdir/$libname.ver -o $lib'
+         fi
+         ;;
+       esac
+      else
+        ld_shlibs=no
+      fi
+      ;;
+
+    netbsd* | netbsdelf*-gnu)
+      if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
+       archive_cmds='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib'
+       wlarc=
+      else
+       archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+       archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+      fi
+      ;;
+
+    solaris*)
+      if $LD -v 2>&1 | $GREP 'BFD 2\.8' > /dev/null; then
+       ld_shlibs=no
+       cat <<_LT_EOF 1>&2
+
+*** Warning: The releases 2.8.* of the GNU linker cannot reliably
+*** create shared libraries on Solaris systems.  Therefore, libtool
+*** is disabling shared libraries support.  We urge you to upgrade GNU
+*** binutils to release 2.9.1 or newer.  Another option is to modify
+*** your PATH or compiler configuration so that the native linker is
+*** used, and then restart.
+
+_LT_EOF
+      elif $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
+       archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+       archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+      else
+       ld_shlibs=no
+      fi
+      ;;
+
+    sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*)
+      case `$LD -v 2>&1` in
+        *\ [01].* | *\ 2.[0-9].* | *\ 2.1[0-5].*)
+       ld_shlibs=no
+       cat <<_LT_EOF 1>&2
+
+*** Warning: Releases of the GNU linker prior to 2.16.91.0.3 can not
+*** reliably create shared libraries on SCO systems.  Therefore, libtool
+*** is disabling shared libraries support.  We urge you to upgrade GNU
+*** binutils to release 2.16.91.0.3 or newer.  Another option is to modify
+*** your PATH or compiler configuration so that the native linker is
+*** used, and then restart.
+
+_LT_EOF
+       ;;
+       *)
+         # For security reasons, it is highly recommended that you always
+         # use absolute paths for naming shared libraries, and exclude the
+         # DT_RUNPATH tag from executables and libraries.  But doing so
+         # requires that you compile everything twice, which is a pain.
+         if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
+           hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
+           archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+           archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+         else
+           ld_shlibs=no
+         fi
+       ;;
+      esac
+      ;;
+
+    sunos4*)
+      archive_cmds='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags'
+      wlarc=
+      hardcode_direct=yes
+      hardcode_shlibpath_var=no
+      ;;
+
+    *)
+      if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
+       archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+       archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+      else
+       ld_shlibs=no
+      fi
+      ;;
+    esac
+
+    if test "$ld_shlibs" = no; then
+      runpath_var=
+      hardcode_libdir_flag_spec=
+      export_dynamic_flag_spec=
+      whole_archive_flag_spec=
+    fi
+  else
+    # PORTME fill in a description of your system's linker (not GNU ld)
+    case $host_os in
+    aix3*)
+      allow_undefined_flag=unsupported
+      always_export_symbols=yes
+      archive_expsym_cmds='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname'
+      # Note: this linker hardcodes the directories in LIBPATH if there
+      # are no directories specified by -L.
+      hardcode_minus_L=yes
+      if test "$GCC" = yes && test -z "$lt_prog_compiler_static"; then
+       # Neither direct hardcoding nor static linking is supported with a
+       # broken collect2.
+       hardcode_direct=unsupported
+      fi
+      ;;
+
+    aix[4-9]*)
+      if test "$host_cpu" = ia64; then
+       # On IA64, the linker does run time linking by default, so we don't
+       # have to do anything special.
+       aix_use_runtimelinking=no
+       exp_sym_flag='-Bexport'
+       no_entry_flag=""
+      else
+       # If we're using GNU nm, then we don't want the "-C" option.
+       # -C means demangle to AIX nm, but means don't demangle with GNU nm
+       # Also, AIX nm treats weak defined symbols like other global
+       # defined symbols, whereas GNU nm marks them as "W".
+       if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then
+         export_symbols_cmds='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && (substr(\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols'
+       else
+         export_symbols_cmds='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && (substr(\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols'
+       fi
+       aix_use_runtimelinking=no
+
+       # Test if we are trying to use run time linking or normal
+       # AIX style linking. If -brtl is somewhere in LDFLAGS, we
+       # need to do runtime linking.
+       case $host_os in aix4.[23]|aix4.[23].*|aix[5-9]*)
+         for ld_flag in $LDFLAGS; do
+         if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then
+           aix_use_runtimelinking=yes
+           break
+         fi
+         done
+         ;;
+       esac
+
+       exp_sym_flag='-bexport'
+       no_entry_flag='-bnoentry'
+      fi
+
+      # When large executables or shared objects are built, AIX ld can
+      # have problems creating the table of contents.  If linking a library
+      # or program results in "error TOC overflow" add -mminimal-toc to
+      # CXXFLAGS/CFLAGS for g++/gcc.  In the cases where that is not
+      # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS.
+
+      archive_cmds=''
+      hardcode_direct=yes
+      hardcode_direct_absolute=yes
+      hardcode_libdir_separator=':'
+      link_all_deplibs=yes
+      file_list_spec='${wl}-f,'
+
+      if test "$GCC" = yes; then
+       case $host_os in aix4.[012]|aix4.[012].*)
+       # We only want to do this on AIX 4.2 and lower, the check
+       # below for broken collect2 doesn't work under 4.3+
+         collect2name=`${CC} -print-prog-name=collect2`
+         if test -f "$collect2name" &&
+          strings "$collect2name" | $GREP resolve_lib_name >/dev/null
+         then
+         # We have reworked collect2
+         :
+         else
+         # We have old collect2
+         hardcode_direct=unsupported
+         # It fails to find uninstalled libraries when the uninstalled
+         # path is not listed in the libpath.  Setting hardcode_minus_L
+         # to unsupported forces relinking
+         hardcode_minus_L=yes
+         hardcode_libdir_flag_spec='-L$libdir'
+         hardcode_libdir_separator=
+         fi
+         ;;
+       esac
+       shared_flag='-shared'
+       if test "$aix_use_runtimelinking" = yes; then
+         shared_flag="$shared_flag "'${wl}-G'
+       fi
+       link_all_deplibs=no
+      else
+       # not using gcc
+       if test "$host_cpu" = ia64; then
+       # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release
+       # chokes on -Wl,-G. The following line is correct:
+         shared_flag='-G'
+       else
+         if test "$aix_use_runtimelinking" = yes; then
+           shared_flag='${wl}-G'
+         else
+           shared_flag='${wl}-bM:SRE'
+         fi
+       fi
+      fi
+
+      export_dynamic_flag_spec='${wl}-bexpall'
+      # It seems that -bexpall does not export symbols beginning with
+      # underscore (_), so it is better to generate a list of symbols to export.
+      always_export_symbols=yes
+      if test "$aix_use_runtimelinking" = yes; then
+       # Warning - without using the other runtime loading flags (-brtl),
+       # -berok will link without error, but may produce a broken library.
+       allow_undefined_flag='-berok'
+        # Determine the default libpath from the value encoded in an
+        # empty executable.
+        if test "${lt_cv_aix_libpath+set}" = set; then
+  aix_libpath=$lt_cv_aix_libpath
+else
+  if ${lt_cv_aix_libpath_+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+
+  lt_aix_libpath_sed='
+      /Import File Strings/,/^$/ {
+         /^0/ {
+             s/^0  *\([^ ]*\) *$/\1/
+             p
+         }
+      }'
+  lt_cv_aix_libpath_=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
+  # Check for a 64-bit object if we didn't find anything.
+  if test -z "$lt_cv_aix_libpath_"; then
+    lt_cv_aix_libpath_=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
+  fi
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+  if test -z "$lt_cv_aix_libpath_"; then
+    lt_cv_aix_libpath_="/usr/lib:/lib"
+  fi
+
+fi
+
+  aix_libpath=$lt_cv_aix_libpath_
+fi
+
+        hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath"
+        archive_expsym_cmds='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then func_echo_all "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag"
+      else
+       if test "$host_cpu" = ia64; then
+         hardcode_libdir_flag_spec='${wl}-R $libdir:/usr/lib:/lib'
+         allow_undefined_flag="-z nodefs"
+         archive_expsym_cmds="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols"
+       else
+        # Determine the default libpath from the value encoded in an
+        # empty executable.
+        if test "${lt_cv_aix_libpath+set}" = set; then
+  aix_libpath=$lt_cv_aix_libpath
+else
+  if ${lt_cv_aix_libpath_+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+
+  lt_aix_libpath_sed='
+      /Import File Strings/,/^$/ {
+         /^0/ {
+             s/^0  *\([^ ]*\) *$/\1/
+             p
+         }
+      }'
+  lt_cv_aix_libpath_=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
+  # Check for a 64-bit object if we didn't find anything.
+  if test -z "$lt_cv_aix_libpath_"; then
+    lt_cv_aix_libpath_=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
+  fi
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+  if test -z "$lt_cv_aix_libpath_"; then
+    lt_cv_aix_libpath_="/usr/lib:/lib"
+  fi
+
+fi
+
+  aix_libpath=$lt_cv_aix_libpath_
+fi
+
+        hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath"
+         # Warning - without using the other run time loading flags,
+         # -berok will link without error, but may produce a broken library.
+         no_undefined_flag=' ${wl}-bernotok'
+         allow_undefined_flag=' ${wl}-berok'
+         if test "$with_gnu_ld" = yes; then
+           # We only use this code for GNU lds that support --whole-archive.
+           whole_archive_flag_spec='${wl}--whole-archive$convenience ${wl}--no-whole-archive'
+         else
+           # Exported symbols can be pulled into shared objects from archives
+           whole_archive_flag_spec='$convenience'
+         fi
+         archive_cmds_need_lc=yes
+         # This is similar to how AIX traditionally builds its shared libraries.
+         archive_expsym_cmds="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname'
+       fi
+      fi
+      ;;
+
+    amigaos*)
+      case $host_cpu in
+      powerpc)
+            # see comment about AmigaOS4 .so support
+            archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+            archive_expsym_cmds=''
+        ;;
+      m68k)
+            archive_cmds='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)'
+            hardcode_libdir_flag_spec='-L$libdir'
+            hardcode_minus_L=yes
+        ;;
+      esac
+      ;;
+
+    bsdi[45]*)
+      export_dynamic_flag_spec=-rdynamic
+      ;;
+
+    cygwin* | mingw* | pw32* | cegcc*)
+      # When not using gcc, we currently assume that we are using
+      # Microsoft Visual C++.
+      # hardcode_libdir_flag_spec is actually meaningless, as there is
+      # no search path for DLLs.
+      case $cc_basename in
+      cl*)
+       # Native MSVC
+       hardcode_libdir_flag_spec=' '
+       allow_undefined_flag=unsupported
+       always_export_symbols=yes
+       file_list_spec='@'
+       # Tell ltmain to make .lib files, not .a files.
+       libext=lib
+       # Tell ltmain to make .dll files, not .so files.
+       shrext_cmds=".dll"
+       # FIXME: Setting linknames here is a bad hack.
+       archive_cmds='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-dll~linknames='
+       archive_expsym_cmds='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then
+           sed -n -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' -e '1\\\!p' < $export_symbols > $output_objdir/$soname.exp;
+         else
+           sed -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' < $export_symbols > $output_objdir/$soname.exp;
+         fi~
+         $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~
+         linknames='
+       # The linker will not automatically build a static lib if we build a DLL.
+       # _LT_TAGVAR(old_archive_from_new_cmds, )='true'
+       enable_shared_with_static_runtimes=yes
+       exclude_expsyms='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*'
+       export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1,DATA/'\'' | $SED -e '\''/^[AITW][ ]/s/.*[ ]//'\'' | sort | uniq > $export_symbols'
+       # Don't use ranlib
+       old_postinstall_cmds='chmod 644 $oldlib'
+       postlink_cmds='lt_outputfile="@OUTPUT@"~
+         lt_tool_outputfile="@TOOL_OUTPUT@"~
+         case $lt_outputfile in
+           *.exe|*.EXE) ;;
+           *)
+             lt_outputfile="$lt_outputfile.exe"
+             lt_tool_outputfile="$lt_tool_outputfile.exe"
+             ;;
+         esac~
+         if test "$MANIFEST_TOOL" != ":" && test -f "$lt_outputfile.manifest"; then
+           $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1;
+           $RM "$lt_outputfile.manifest";
+         fi'
+       ;;
+      *)
+       # Assume MSVC wrapper
+       hardcode_libdir_flag_spec=' '
+       allow_undefined_flag=unsupported
+       # Tell ltmain to make .lib files, not .a files.
+       libext=lib
+       # Tell ltmain to make .dll files, not .so files.
+       shrext_cmds=".dll"
+       # FIXME: Setting linknames here is a bad hack.
+       archive_cmds='$CC -o $lib $libobjs $compiler_flags `func_echo_all "$deplibs" | $SED '\''s/ -lc$//'\''` -link -dll~linknames='
+       # The linker will automatically build a .lib file if we build a DLL.
+       old_archive_from_new_cmds='true'
+       # FIXME: Should let the user specify the lib program.
+       old_archive_cmds='lib -OUT:$oldlib$oldobjs$old_deplibs'
+       enable_shared_with_static_runtimes=yes
+       ;;
+      esac
+      ;;
+
+    darwin* | rhapsody*)
+
+
+  archive_cmds_need_lc=no
+  hardcode_direct=no
+  hardcode_automatic=yes
+  hardcode_shlibpath_var=unsupported
+  if test "$lt_cv_ld_force_load" = "yes"; then
+    whole_archive_flag_spec='`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience ${wl}-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`'
+
+  else
+    whole_archive_flag_spec=''
+  fi
+  link_all_deplibs=yes
+  allow_undefined_flag="$_lt_dar_allow_undefined"
+  case $cc_basename in
+     ifort*) _lt_dar_can_shared=yes ;;
+     *) _lt_dar_can_shared=$GCC ;;
+  esac
+  if test "$_lt_dar_can_shared" = "yes"; then
+    output_verbose_link_cmd=func_echo_all
+    archive_cmds="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod${_lt_dsymutil}"
+    module_cmds="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dsymutil}"
+    archive_expsym_cmds="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring ${_lt_dar_single_mod}${_lt_dar_export_syms}${_lt_dsymutil}"
+    module_expsym_cmds="sed -e 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dar_export_syms}${_lt_dsymutil}"
+
+  else
+  ld_shlibs=no
+  fi
+
+      ;;
+
+    dgux*)
+      archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+      hardcode_libdir_flag_spec='-L$libdir'
+      hardcode_shlibpath_var=no
+      ;;
+
+    # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor
+    # support.  Future versions do this automatically, but an explicit c++rt0.o
+    # does not break anything, and helps significantly (at the cost of a little
+    # extra space).
+    freebsd2.2*)
+      archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o'
+      hardcode_libdir_flag_spec='-R$libdir'
+      hardcode_direct=yes
+      hardcode_shlibpath_var=no
+      ;;
+
+    # Unfortunately, older versions of FreeBSD 2 do not have this feature.
+    freebsd2.*)
+      archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'
+      hardcode_direct=yes
+      hardcode_minus_L=yes
+      hardcode_shlibpath_var=no
+      ;;
+
+    # FreeBSD 3 and greater uses gcc -shared to do shared libraries.
+    freebsd* | dragonfly*)
+      archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
+      hardcode_libdir_flag_spec='-R$libdir'
+      hardcode_direct=yes
+      hardcode_shlibpath_var=no
+      ;;
+
+    hpux9*)
+      if test "$GCC" = yes; then
+       archive_cmds='$RM $output_objdir/$soname~$CC -shared $pic_flag ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'
+      else
+       archive_cmds='$RM $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'
+      fi
+      hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir'
+      hardcode_libdir_separator=:
+      hardcode_direct=yes
+
+      # hardcode_minus_L: Not really in the search PATH,
+      # but as the default location of the library.
+      hardcode_minus_L=yes
+      export_dynamic_flag_spec='${wl}-E'
+      ;;
+
+    hpux10*)
+      if test "$GCC" = yes && test "$with_gnu_ld" = no; then
+       archive_cmds='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
+      else
+       archive_cmds='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags'
+      fi
+      if test "$with_gnu_ld" = no; then
+       hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir'
+       hardcode_libdir_separator=:
+       hardcode_direct=yes
+       hardcode_direct_absolute=yes
+       export_dynamic_flag_spec='${wl}-E'
+       # hardcode_minus_L: Not really in the search PATH,
+       # but as the default location of the library.
+       hardcode_minus_L=yes
+      fi
+      ;;
+
+    hpux11*)
+      if test "$GCC" = yes && test "$with_gnu_ld" = no; then
+       case $host_cpu in
+       hppa*64*)
+         archive_cmds='$CC -shared ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'
+         ;;
+       ia64*)
+         archive_cmds='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags'
+         ;;
+       *)
+         archive_cmds='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
+         ;;
+       esac
+      else
+       case $host_cpu in
+       hppa*64*)
+         archive_cmds='$CC -b ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'
+         ;;
+       ia64*)
+         archive_cmds='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags'
+         ;;
+       *)
+
+         # Older versions of the 11.00 compiler do not understand -b yet
+         # (HP92453-01 A.11.01.20 doesn't, HP92453-01 B.11.X.35175-35176.GP does)
+         { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $CC understands -b" >&5
+$as_echo_n "checking if $CC understands -b... " >&6; }
+if ${lt_cv_prog_compiler__b+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  lt_cv_prog_compiler__b=no
+   save_LDFLAGS="$LDFLAGS"
+   LDFLAGS="$LDFLAGS -b"
+   echo "$lt_simple_link_test_code" > conftest.$ac_ext
+   if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then
+     # The linker can only warn and ignore the option if not recognized
+     # So say no if there are warnings
+     if test -s conftest.err; then
+       # Append any errors to the config.log.
+       cat conftest.err 1>&5
+       $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp
+       $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
+       if diff conftest.exp conftest.er2 >/dev/null; then
+         lt_cv_prog_compiler__b=yes
+       fi
+     else
+       lt_cv_prog_compiler__b=yes
+     fi
+   fi
+   $RM -r conftest*
+   LDFLAGS="$save_LDFLAGS"
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler__b" >&5
+$as_echo "$lt_cv_prog_compiler__b" >&6; }
+
+if test x"$lt_cv_prog_compiler__b" = xyes; then
+    archive_cmds='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
+else
+    archive_cmds='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags'
+fi
+
+         ;;
+       esac
+      fi
+      if test "$with_gnu_ld" = no; then
+       hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir'
+       hardcode_libdir_separator=:
+
+       case $host_cpu in
+       hppa*64*|ia64*)
+         hardcode_direct=no
+         hardcode_shlibpath_var=no
+         ;;
+       *)
+         hardcode_direct=yes
+         hardcode_direct_absolute=yes
+         export_dynamic_flag_spec='${wl}-E'
+
+         # hardcode_minus_L: Not really in the search PATH,
+         # but as the default location of the library.
+         hardcode_minus_L=yes
+         ;;
+       esac
+      fi
+      ;;
+
+    irix5* | irix6* | nonstopux*)
+      if test "$GCC" = yes; then
+       archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+       # Try to use the -exported_symbol ld option, if it does not
+       # work, assume that -exports_file does not work either and
+       # implicitly export all symbols.
+       # This should be the same for all languages, so no per-tag cache variable.
+       { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $host_os linker accepts -exported_symbol" >&5
+$as_echo_n "checking whether the $host_os linker accepts -exported_symbol... " >&6; }
+if ${lt_cv_irix_exported_symbol+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  save_LDFLAGS="$LDFLAGS"
+          LDFLAGS="$LDFLAGS -shared ${wl}-exported_symbol ${wl}foo ${wl}-update_registry ${wl}/dev/null"
+          cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+int foo (void) { return 0; }
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  lt_cv_irix_exported_symbol=yes
+else
+  lt_cv_irix_exported_symbol=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+           LDFLAGS="$save_LDFLAGS"
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_irix_exported_symbol" >&5
+$as_echo "$lt_cv_irix_exported_symbol" >&6; }
+       if test "$lt_cv_irix_exported_symbol" = yes; then
+          archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations ${wl}-exports_file ${wl}$export_symbols -o $lib'
+       fi
+      else
+       archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib'
+       archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -exports_file $export_symbols -o $lib'
+      fi
+      archive_cmds_need_lc='no'
+      hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
+      hardcode_libdir_separator=:
+      inherit_rpath=yes
+      link_all_deplibs=yes
+      ;;
+
+    netbsd* | netbsdelf*-gnu)
+      if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
+       archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'  # a.out
+      else
+       archive_cmds='$LD -shared -o $lib $libobjs $deplibs $linker_flags'      # ELF
+      fi
+      hardcode_libdir_flag_spec='-R$libdir'
+      hardcode_direct=yes
+      hardcode_shlibpath_var=no
+      ;;
+
+    newsos6)
+      archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+      hardcode_direct=yes
+      hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
+      hardcode_libdir_separator=:
+      hardcode_shlibpath_var=no
+      ;;
+
+    *nto* | *qnx*)
+      ;;
+
+    openbsd*)
+      if test -f /usr/libexec/ld.so; then
+       hardcode_direct=yes
+       hardcode_shlibpath_var=no
+       hardcode_direct_absolute=yes
+       if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
+         archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
+         archive_expsym_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-retain-symbols-file,$export_symbols'
+         hardcode_libdir_flag_spec='${wl}-rpath,$libdir'
+         export_dynamic_flag_spec='${wl}-E'
+       else
+         case $host_os in
+          openbsd[01].* | openbsd2.[0-7] | openbsd2.[0-7].*)
+            archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'
+            hardcode_libdir_flag_spec='-R$libdir'
+            ;;
+          *)
+            archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
+            hardcode_libdir_flag_spec='${wl}-rpath,$libdir'
+            ;;
+         esac
+       fi
+      else
+       ld_shlibs=no
+      fi
+      ;;
+
+    os2*)
+      hardcode_libdir_flag_spec='-L$libdir'
+      hardcode_minus_L=yes
+      allow_undefined_flag=unsupported
+      archive_cmds='$ECHO "LIBRARY $libname INITINSTANCE" > $output_objdir/$libname.def~$ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~echo DATA >> $output_objdir/$libname.def~echo " SINGLE NONSHARED" >> $output_objdir/$libname.def~echo EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $compiler_flags $output_objdir/$libname.def'
+      old_archive_from_new_cmds='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def'
+      ;;
+
+    osf3*)
+      if test "$GCC" = yes; then
+       allow_undefined_flag=' ${wl}-expect_unresolved ${wl}\*'
+       archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+      else
+       allow_undefined_flag=' -expect_unresolved \*'
+       archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib'
+      fi
+      archive_cmds_need_lc='no'
+      hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
+      hardcode_libdir_separator=:
+      ;;
+
+    osf4* | osf5*)     # as osf3* with the addition of -msym flag
+      if test "$GCC" = yes; then
+       allow_undefined_flag=' ${wl}-expect_unresolved ${wl}\*'
+       archive_cmds='$CC -shared${allow_undefined_flag} $pic_flag $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+       hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
+      else
+       allow_undefined_flag=' -expect_unresolved \*'
+       archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib'
+       archive_expsym_cmds='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; printf "%s\\n" "-hidden">> $lib.exp~
+       $CC -shared${allow_undefined_flag} ${wl}-input ${wl}$lib.exp $compiler_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib~$RM $lib.exp'
+
+       # Both c and cxx compiler support -rpath directly
+       hardcode_libdir_flag_spec='-rpath $libdir'
+      fi
+      archive_cmds_need_lc='no'
+      hardcode_libdir_separator=:
+      ;;
+
+    solaris*)
+      no_undefined_flag=' -z defs'
+      if test "$GCC" = yes; then
+       wlarc='${wl}'
+       archive_cmds='$CC -shared $pic_flag ${wl}-z ${wl}text ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'
+       archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
+         $CC -shared $pic_flag ${wl}-z ${wl}text ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp'
+      else
+       case `$CC -V 2>&1` in
+       *"Compilers 5.0"*)
+         wlarc=''
+         archive_cmds='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags'
+         archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
+         $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$RM $lib.exp'
+         ;;
+       *)
+         wlarc='${wl}'
+         archive_cmds='$CC -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $compiler_flags'
+         archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
+         $CC -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp'
+         ;;
+       esac
+      fi
+      hardcode_libdir_flag_spec='-R$libdir'
+      hardcode_shlibpath_var=no
+      case $host_os in
+      solaris2.[0-5] | solaris2.[0-5].*) ;;
+      *)
+       # The compiler driver will combine and reorder linker options,
+       # but understands `-z linker_flag'.  GCC discards it without `$wl',
+       # but is careful enough not to reorder.
+       # Supported since Solaris 2.6 (maybe 2.5.1?)
+       if test "$GCC" = yes; then
+         whole_archive_flag_spec='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract'
+       else
+         whole_archive_flag_spec='-z allextract$convenience -z defaultextract'
+       fi
+       ;;
+      esac
+      link_all_deplibs=yes
+      ;;
+
+    sunos4*)
+      if test "x$host_vendor" = xsequent; then
+       # Use $CC to link under sequent, because it throws in some extra .o
+       # files that make .init and .fini sections work.
+       archive_cmds='$CC -G ${wl}-h $soname -o $lib $libobjs $deplibs $compiler_flags'
+      else
+       archive_cmds='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags'
+      fi
+      hardcode_libdir_flag_spec='-L$libdir'
+      hardcode_direct=yes
+      hardcode_minus_L=yes
+      hardcode_shlibpath_var=no
+      ;;
+
+    sysv4)
+      case $host_vendor in
+       sni)
+         archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+         hardcode_direct=yes # is this really true???
+       ;;
+       siemens)
+         ## LD is ld it makes a PLAMLIB
+         ## CC just makes a GrossModule.
+         archive_cmds='$LD -G -o $lib $libobjs $deplibs $linker_flags'
+         reload_cmds='$CC -r -o $output$reload_objs'
+         hardcode_direct=no
+        ;;
+       motorola)
+         archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+         hardcode_direct=no #Motorola manual says yes, but my tests say they lie
+       ;;
+      esac
+      runpath_var='LD_RUN_PATH'
+      hardcode_shlibpath_var=no
+      ;;
+
+    sysv4.3*)
+      archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+      hardcode_shlibpath_var=no
+      export_dynamic_flag_spec='-Bexport'
+      ;;
+
+    sysv4*MP*)
+      if test -d /usr/nec; then
+       archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+       hardcode_shlibpath_var=no
+       runpath_var=LD_RUN_PATH
+       hardcode_runpath_var=yes
+       ld_shlibs=yes
+      fi
+      ;;
+
+    sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7* | sco3.2v5.0.[024]*)
+      no_undefined_flag='${wl}-z,text'
+      archive_cmds_need_lc=no
+      hardcode_shlibpath_var=no
+      runpath_var='LD_RUN_PATH'
+
+      if test "$GCC" = yes; then
+       archive_cmds='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+       archive_expsym_cmds='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+      else
+       archive_cmds='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+       archive_expsym_cmds='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+      fi
+      ;;
+
+    sysv5* | sco3.2v5* | sco5v6*)
+      # Note: We can NOT use -z defs as we might desire, because we do not
+      # link with -lc, and that would cause any symbols used from libc to
+      # always be unresolved, which means just about no library would
+      # ever link correctly.  If we're not using GNU ld we use -z text
+      # though, which does catch some bad symbols but isn't as heavy-handed
+      # as -z defs.
+      no_undefined_flag='${wl}-z,text'
+      allow_undefined_flag='${wl}-z,nodefs'
+      archive_cmds_need_lc=no
+      hardcode_shlibpath_var=no
+      hardcode_libdir_flag_spec='${wl}-R,$libdir'
+      hardcode_libdir_separator=':'
+      link_all_deplibs=yes
+      export_dynamic_flag_spec='${wl}-Bexport'
+      runpath_var='LD_RUN_PATH'
+
+      if test "$GCC" = yes; then
+       archive_cmds='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+       archive_expsym_cmds='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+      else
+       archive_cmds='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+       archive_expsym_cmds='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+      fi
+      ;;
+
+    uts4*)
+      archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+      hardcode_libdir_flag_spec='-L$libdir'
+      hardcode_shlibpath_var=no
+      ;;
+
+    *)
+      ld_shlibs=no
+      ;;
+    esac
+
+    if test x$host_vendor = xsni; then
+      case $host in
+      sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*)
+       export_dynamic_flag_spec='${wl}-Blargedynsym'
+       ;;
+      esac
+    fi
+  fi
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs" >&5
+$as_echo "$ld_shlibs" >&6; }
+test "$ld_shlibs" = no && can_build_shared=no
+
+with_gnu_ld=$with_gnu_ld
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+#
+# Do we need to explicitly link libc?
+#
+case "x$archive_cmds_need_lc" in
+x|xyes)
+  # Assume -lc should be added
+  archive_cmds_need_lc=yes
+
+  if test "$enable_shared" = yes && test "$GCC" = yes; then
+    case $archive_cmds in
+    *'~'*)
+      # FIXME: we may have to deal with multi-command sequences.
+      ;;
+    '$CC '*)
+      # Test whether the compiler implicitly links with -lc since on some
+      # systems, -lgcc has to come before -lc. If gcc already passes -lc
+      # to ld, don't add -lc before -lgcc.
+      { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether -lc should be explicitly linked in" >&5
+$as_echo_n "checking whether -lc should be explicitly linked in... " >&6; }
+if ${lt_cv_archive_cmds_need_lc+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  $RM conftest*
+       echo "$lt_simple_compile_test_code" > conftest.$ac_ext
+
+       if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; } 2>conftest.err; then
+         soname=conftest
+         lib=conftest
+         libobjs=conftest.$ac_objext
+         deplibs=
+         wl=$lt_prog_compiler_wl
+         pic_flag=$lt_prog_compiler_pic
+         compiler_flags=-v
+         linker_flags=-v
+         verstring=
+         output_objdir=.
+         libname=conftest
+         lt_save_allow_undefined_flag=$allow_undefined_flag
+         allow_undefined_flag=
+         if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$archive_cmds 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1\""; } >&5
+  (eval $archive_cmds 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }
+         then
+           lt_cv_archive_cmds_need_lc=no
+         else
+           lt_cv_archive_cmds_need_lc=yes
+         fi
+         allow_undefined_flag=$lt_save_allow_undefined_flag
+       else
+         cat conftest.err 1>&5
+       fi
+       $RM conftest*
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_archive_cmds_need_lc" >&5
+$as_echo "$lt_cv_archive_cmds_need_lc" >&6; }
+      archive_cmds_need_lc=$lt_cv_archive_cmds_need_lc
+      ;;
+    esac
+  fi
+  ;;
+esac
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking dynamic linker characteristics" >&5
+$as_echo_n "checking dynamic linker characteristics... " >&6; }
+
+if test "$GCC" = yes; then
+  case $host_os in
+    darwin*) lt_awk_arg="/^libraries:/,/LR/" ;;
+    *) lt_awk_arg="/^libraries:/" ;;
+  esac
+  case $host_os in
+    mingw* | cegcc*) lt_sed_strip_eq="s,=\([A-Za-z]:\),\1,g" ;;
+    *) lt_sed_strip_eq="s,=/,/,g" ;;
+  esac
+  lt_search_path_spec=`$CC -print-search-dirs | awk $lt_awk_arg | $SED -e "s/^libraries://" -e $lt_sed_strip_eq`
+  case $lt_search_path_spec in
+  *\;*)
+    # if the path contains ";" then we assume it to be the separator
+    # otherwise default to the standard path separator (i.e. ":") - it is
+    # assumed that no part of a normal pathname contains ";" but that should
+    # okay in the real world where ";" in dirpaths is itself problematic.
+    lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED 's/;/ /g'`
+    ;;
+  *)
+    lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED "s/$PATH_SEPARATOR/ /g"`
+    ;;
+  esac
+  # Ok, now we have the path, separated by spaces, we can step through it
+  # and add multilib dir if necessary.
+  lt_tmp_lt_search_path_spec=
+  lt_multi_os_dir=`$CC $CPPFLAGS $CFLAGS $LDFLAGS -print-multi-os-directory 2>/dev/null`
+  for lt_sys_path in $lt_search_path_spec; do
+    if test -d "$lt_sys_path/$lt_multi_os_dir"; then
+      lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path/$lt_multi_os_dir"
+    else
+      test -d "$lt_sys_path" && \
+       lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path"
+    fi
+  done
+  lt_search_path_spec=`$ECHO "$lt_tmp_lt_search_path_spec" | awk '
+BEGIN {RS=" "; FS="/|\n";} {
+  lt_foo="";
+  lt_count=0;
+  for (lt_i = NF; lt_i > 0; lt_i--) {
+    if ($lt_i != "" && $lt_i != ".") {
+      if ($lt_i == "..") {
+        lt_count++;
+      } else {
+        if (lt_count == 0) {
+          lt_foo="/" $lt_i lt_foo;
+        } else {
+          lt_count--;
+        }
+      }
+    }
+  }
+  if (lt_foo != "") { lt_freq[lt_foo]++; }
+  if (lt_freq[lt_foo] == 1) { print lt_foo; }
+}'`
+  # AWK program above erroneously prepends '/' to C:/dos/paths
+  # for these hosts.
+  case $host_os in
+    mingw* | cegcc*) lt_search_path_spec=`$ECHO "$lt_search_path_spec" |\
+      $SED 's,/\([A-Za-z]:\),\1,g'` ;;
+  esac
+  sys_lib_search_path_spec=`$ECHO "$lt_search_path_spec" | $lt_NL2SP`
+else
+  sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib"
+fi
+library_names_spec=
+libname_spec='lib$name'
+soname_spec=
+shrext_cmds=".so"
+postinstall_cmds=
+postuninstall_cmds=
+finish_cmds=
+finish_eval=
+shlibpath_var=
+shlibpath_overrides_runpath=unknown
+version_type=none
+dynamic_linker="$host_os ld.so"
+sys_lib_dlsearch_path_spec="/lib /usr/lib"
+need_lib_prefix=unknown
+hardcode_into_libs=no
+
+# when you set need_version to no, make sure it does not cause -set_version
+# flags to be left without arguments
+need_version=unknown
+
+case $host_os in
+aix3*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a'
+  shlibpath_var=LIBPATH
+
+  # AIX 3 has no versioning support, so we append a major version to the name.
+  soname_spec='${libname}${release}${shared_ext}$major'
+  ;;
+
+aix[4-9]*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  need_lib_prefix=no
+  need_version=no
+  hardcode_into_libs=yes
+  if test "$host_cpu" = ia64; then
+    # AIX 5 supports IA64
+    library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}'
+    shlibpath_var=LD_LIBRARY_PATH
+  else
+    # With GCC up to 2.95.x, collect2 would create an import file
+    # for dependence libraries.  The import file would start with
+    # the line `#! .'.  This would cause the generated library to
+    # depend on `.', always an invalid library.  This was fixed in
+    # development snapshots of GCC prior to 3.0.
+    case $host_os in
+      aix4 | aix4.[01] | aix4.[01].*)
+      if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)'
+          echo ' yes '
+          echo '#endif'; } | ${CC} -E - | $GREP yes > /dev/null; then
+       :
+      else
+       can_build_shared=no
+      fi
+      ;;
+    esac
+    # AIX (on Power*) has no versioning support, so currently we can not hardcode correct
+    # soname into executable. Probably we can add versioning support to
+    # collect2, so additional links can be useful in future.
+    if test "$aix_use_runtimelinking" = yes; then
+      # If using run time linking (on AIX 4.2 or later) use lib<name>.so
+      # instead of lib<name>.a to let people know that these are not
+      # typical AIX shared libraries.
+      library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+    else
+      # We preserve .a as extension for shared libraries through AIX4.2
+      # and later when we are not doing run time linking.
+      library_names_spec='${libname}${release}.a $libname.a'
+      soname_spec='${libname}${release}${shared_ext}$major'
+    fi
+    shlibpath_var=LIBPATH
+  fi
+  ;;
+
+amigaos*)
+  case $host_cpu in
+  powerpc)
+    # Since July 2007 AmigaOS4 officially supports .so libraries.
+    # When compiling the executable, add -use-dynld -Lsobjs: to the compileline.
+    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+    ;;
+  m68k)
+    library_names_spec='$libname.ixlibrary $libname.a'
+    # Create ${libname}_ixlibrary.a entries in /sys/libs.
+    finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`func_echo_all "$lib" | $SED '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; test $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done'
+    ;;
+  esac
+  ;;
+
+beos*)
+  library_names_spec='${libname}${shared_ext}'
+  dynamic_linker="$host_os ld.so"
+  shlibpath_var=LIBRARY_PATH
+  ;;
+
+bsdi[45]*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir'
+  shlibpath_var=LD_LIBRARY_PATH
+  sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib"
+  sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib"
+  # the default ld.so.conf also contains /usr/contrib/lib and
+  # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow
+  # libtool to hard-code these into programs
+  ;;
+
+cygwin* | mingw* | pw32* | cegcc*)
+  version_type=windows
+  shrext_cmds=".dll"
+  need_version=no
+  need_lib_prefix=no
+
+  case $GCC,$cc_basename in
+  yes,*)
+    # gcc
+    library_names_spec='$libname.dll.a'
+    # DLL is installed to $(libdir)/../bin by postinstall_cmds
+    postinstall_cmds='base_file=`basename \${file}`~
+      dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~
+      dldir=$destdir/`dirname \$dlpath`~
+      test -d \$dldir || mkdir -p \$dldir~
+      $install_prog $dir/$dlname \$dldir/$dlname~
+      chmod a+x \$dldir/$dlname~
+      if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then
+        eval '\''$striplib \$dldir/$dlname'\'' || exit \$?;
+      fi'
+    postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~
+      dlpath=$dir/\$dldll~
+       $RM \$dlpath'
+    shlibpath_overrides_runpath=yes
+
+    case $host_os in
+    cygwin*)
+      # Cygwin DLLs use 'cyg' prefix rather than 'lib'
+      soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}'
+
+      sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/lib/w32api"
+      ;;
+    mingw* | cegcc*)
+      # MinGW DLLs use traditional 'lib' prefix
+      soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}'
+      ;;
+    pw32*)
+      # pw32 DLLs use 'pw' prefix rather than 'lib'
+      library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}'
+      ;;
+    esac
+    dynamic_linker='Win32 ld.exe'
+    ;;
+
+  *,cl*)
+    # Native MSVC
+    libname_spec='$name'
+    soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}'
+    library_names_spec='${libname}.dll.lib'
+
+    case $build_os in
+    mingw*)
+      sys_lib_search_path_spec=
+      lt_save_ifs=$IFS
+      IFS=';'
+      for lt_path in $LIB
+      do
+        IFS=$lt_save_ifs
+        # Let DOS variable expansion print the short 8.3 style file name.
+        lt_path=`cd "$lt_path" 2>/dev/null && cmd //C "for %i in (".") do @echo %~si"`
+        sys_lib_search_path_spec="$sys_lib_search_path_spec $lt_path"
+      done
+      IFS=$lt_save_ifs
+      # Convert to MSYS style.
+      sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | sed -e 's|\\\\|/|g' -e 's| \\([a-zA-Z]\\):| /\\1|g' -e 's|^ ||'`
+      ;;
+    cygwin*)
+      # Convert to unix form, then to dos form, then back to unix form
+      # but this time dos style (no spaces!) so that the unix form looks
+      # like /cygdrive/c/PROGRA~1:/cygdr...
+      sys_lib_search_path_spec=`cygpath --path --unix "$LIB"`
+      sys_lib_search_path_spec=`cygpath --path --dos "$sys_lib_search_path_spec" 2>/dev/null`
+      sys_lib_search_path_spec=`cygpath --path --unix "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"`
+      ;;
+    *)
+      sys_lib_search_path_spec="$LIB"
+      if $ECHO "$sys_lib_search_path_spec" | $GREP ';[c-zC-Z]:/' >/dev/null; then
+        # It is most probably a Windows format PATH.
+        sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'`
+      else
+        sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"`
+      fi
+      # FIXME: find the short name or the path components, as spaces are
+      # common. (e.g. "Program Files" -> "PROGRA~1")
+      ;;
+    esac
+
+    # DLL is installed to $(libdir)/../bin by postinstall_cmds
+    postinstall_cmds='base_file=`basename \${file}`~
+      dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~
+      dldir=$destdir/`dirname \$dlpath`~
+      test -d \$dldir || mkdir -p \$dldir~
+      $install_prog $dir/$dlname \$dldir/$dlname'
+    postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~
+      dlpath=$dir/\$dldll~
+       $RM \$dlpath'
+    shlibpath_overrides_runpath=yes
+    dynamic_linker='Win32 link.exe'
+    ;;
+
+  *)
+    # Assume MSVC wrapper
+    library_names_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext} $libname.lib'
+    dynamic_linker='Win32 ld.exe'
+    ;;
+  esac
+  # FIXME: first we should search . and the directory the executable is in
+  shlibpath_var=PATH
+  ;;
+
+darwin* | rhapsody*)
+  dynamic_linker="$host_os dyld"
+  version_type=darwin
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${major}$shared_ext ${libname}$shared_ext'
+  soname_spec='${libname}${release}${major}$shared_ext'
+  shlibpath_overrides_runpath=yes
+  shlibpath_var=DYLD_LIBRARY_PATH
+  shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`'
+
+  sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/local/lib"
+  sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib'
+  ;;
+
+dgux*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  ;;
+
+freebsd* | dragonfly*)
+  # DragonFly does not have aout.  When/if they implement a new
+  # versioning mechanism, adjust this.
+  if test -x /usr/bin/objformat; then
+    objformat=`/usr/bin/objformat`
+  else
+    case $host_os in
+    freebsd[23].*) objformat=aout ;;
+    *) objformat=elf ;;
+    esac
+  fi
+  version_type=freebsd-$objformat
+  case $version_type in
+    freebsd-elf*)
+      library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}'
+      need_version=no
+      need_lib_prefix=no
+      ;;
+    freebsd-*)
+      library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix'
+      need_version=yes
+      ;;
+  esac
+  shlibpath_var=LD_LIBRARY_PATH
+  case $host_os in
+  freebsd2.*)
+    shlibpath_overrides_runpath=yes
+    ;;
+  freebsd3.[01]* | freebsdelf3.[01]*)
+    shlibpath_overrides_runpath=yes
+    hardcode_into_libs=yes
+    ;;
+  freebsd3.[2-9]* | freebsdelf3.[2-9]* | \
+  freebsd4.[0-5] | freebsdelf4.[0-5] | freebsd4.1.1 | freebsdelf4.1.1)
+    shlibpath_overrides_runpath=no
+    hardcode_into_libs=yes
+    ;;
+  *) # from 4.6 on, and DragonFly
+    shlibpath_overrides_runpath=yes
+    hardcode_into_libs=yes
+    ;;
+  esac
+  ;;
+
+gnu*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=no
+  hardcode_into_libs=yes
+  ;;
+
+haiku*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  need_lib_prefix=no
+  need_version=no
+  dynamic_linker="$host_os runtime_loader"
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  sys_lib_dlsearch_path_spec='/boot/home/config/lib /boot/common/lib /boot/system/lib'
+  hardcode_into_libs=yes
+  ;;
+
+hpux9* | hpux10* | hpux11*)
+  # Give a soname corresponding to the major version so that dld.sl refuses to
+  # link against other versions.
+  version_type=sunos
+  need_lib_prefix=no
+  need_version=no
+  case $host_cpu in
+  ia64*)
+    shrext_cmds='.so'
+    hardcode_into_libs=yes
+    dynamic_linker="$host_os dld.so"
+    shlibpath_var=LD_LIBRARY_PATH
+    shlibpath_overrides_runpath=yes # Unless +noenvvar is specified.
+    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+    soname_spec='${libname}${release}${shared_ext}$major'
+    if test "X$HPUX_IA64_MODE" = X32; then
+      sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib"
+    else
+      sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64"
+    fi
+    sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
+    ;;
+  hppa*64*)
+    shrext_cmds='.sl'
+    hardcode_into_libs=yes
+    dynamic_linker="$host_os dld.sl"
+    shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH
+    shlibpath_overrides_runpath=yes # Unless +noenvvar is specified.
+    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+    soname_spec='${libname}${release}${shared_ext}$major'
+    sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64"
+    sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
+    ;;
+  *)
+    shrext_cmds='.sl'
+    dynamic_linker="$host_os dld.sl"
+    shlibpath_var=SHLIB_PATH
+    shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH
+    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+    soname_spec='${libname}${release}${shared_ext}$major'
+    ;;
+  esac
+  # HP-UX runs *really* slowly unless shared libraries are mode 555, ...
+  postinstall_cmds='chmod 555 $lib'
+  # or fails outright, so override atomically:
+  install_override_mode=555
+  ;;
+
+interix[3-9]*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=no
+  hardcode_into_libs=yes
+  ;;
+
+irix5* | irix6* | nonstopux*)
+  case $host_os in
+    nonstopux*) version_type=nonstopux ;;
+    *)
+       if test "$lt_cv_prog_gnu_ld" = yes; then
+               version_type=linux # correct to gnu/linux during the next big refactor
+       else
+               version_type=irix
+       fi ;;
+  esac
+  need_lib_prefix=no
+  need_version=no
+  soname_spec='${libname}${release}${shared_ext}$major'
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}'
+  case $host_os in
+  irix5* | nonstopux*)
+    libsuff= shlibsuff=
+    ;;
+  *)
+    case $LD in # libtool.m4 will add one of these switches to LD
+    *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ")
+      libsuff= shlibsuff= libmagic=32-bit;;
+    *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ")
+      libsuff=32 shlibsuff=N32 libmagic=N32;;
+    *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ")
+      libsuff=64 shlibsuff=64 libmagic=64-bit;;
+    *) libsuff= shlibsuff= libmagic=never-match;;
+    esac
+    ;;
+  esac
+  shlibpath_var=LD_LIBRARY${shlibsuff}_PATH
+  shlibpath_overrides_runpath=no
+  sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}"
+  sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}"
+  hardcode_into_libs=yes
+  ;;
+
+# No shared lib support for Linux oldld, aout, or coff.
+linux*oldld* | linux*aout* | linux*coff*)
+  dynamic_linker=no
+  ;;
+
+# This must be glibc/ELF.
+linux* | k*bsd*-gnu | kopensolaris*-gnu)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=no
+
+  # Some binutils ld are patched to set DT_RUNPATH
+  if ${lt_cv_shlibpath_overrides_runpath+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  lt_cv_shlibpath_overrides_runpath=no
+    save_LDFLAGS=$LDFLAGS
+    save_libdir=$libdir
+    eval "libdir=/foo; wl=\"$lt_prog_compiler_wl\"; \
+        LDFLAGS=\"\$LDFLAGS $hardcode_libdir_flag_spec\""
+    cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  if  ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null; then :
+  lt_cv_shlibpath_overrides_runpath=yes
+fi
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+    LDFLAGS=$save_LDFLAGS
+    libdir=$save_libdir
+
+fi
+
+  shlibpath_overrides_runpath=$lt_cv_shlibpath_overrides_runpath
+
+  # This implies no fast_install, which is unacceptable.
+  # Some rework will be needed to allow for fast_install
+  # before this can be enabled.
+  hardcode_into_libs=yes
+
+  # Append ld.so.conf contents to the search path
+  if test -f /etc/ld.so.conf; then
+    lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \$2)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[      ]*hwcap[        ]/d;s/[:,      ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;s/"//g;/^$/d' | tr '\n' ' '`
+    sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra"
+  fi
+
+  # We used to test for /lib/ld.so.1 and disable shared libraries on
+  # powerpc, because MkLinux only supported shared libraries with the
+  # GNU dynamic linker.  Since this was broken with cross compilers,
+  # most powerpc-linux boxes support dynamic linking these days and
+  # people can always --disable-shared, the test was removed, and we
+  # assume the GNU/Linux dynamic linker is in use.
+  dynamic_linker='GNU/Linux ld.so'
+  ;;
+
+netbsdelf*-gnu)
+  version_type=linux
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=no
+  hardcode_into_libs=yes
+  dynamic_linker='NetBSD ld.elf_so'
+  ;;
+
+netbsd*)
+  version_type=sunos
+  need_lib_prefix=no
+  need_version=no
+  if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
+    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
+    finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
+    dynamic_linker='NetBSD (a.out) ld.so'
+  else
+    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
+    soname_spec='${libname}${release}${shared_ext}$major'
+    dynamic_linker='NetBSD ld.elf_so'
+  fi
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  hardcode_into_libs=yes
+  ;;
+
+newsos6)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  ;;
+
+*nto* | *qnx*)
+  version_type=qnx
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=no
+  hardcode_into_libs=yes
+  dynamic_linker='ldqnx.so'
+  ;;
+
+openbsd*)
+  version_type=sunos
+  sys_lib_dlsearch_path_spec="/usr/lib"
+  need_lib_prefix=no
+  # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs.
+  case $host_os in
+    openbsd3.3 | openbsd3.3.*) need_version=yes ;;
+    *)                         need_version=no  ;;
+  esac
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
+  finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
+  shlibpath_var=LD_LIBRARY_PATH
+  if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
+    case $host_os in
+      openbsd2.[89] | openbsd2.[89].*)
+       shlibpath_overrides_runpath=no
+       ;;
+      *)
+       shlibpath_overrides_runpath=yes
+       ;;
+      esac
+  else
+    shlibpath_overrides_runpath=yes
+  fi
+  ;;
+
+os2*)
+  libname_spec='$name'
+  shrext_cmds=".dll"
+  need_lib_prefix=no
+  library_names_spec='$libname${shared_ext} $libname.a'
+  dynamic_linker='OS/2 ld.exe'
+  shlibpath_var=LIBPATH
+  ;;
+
+osf3* | osf4* | osf5*)
+  version_type=osf
+  need_lib_prefix=no
+  need_version=no
+  soname_spec='${libname}${release}${shared_ext}$major'
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  shlibpath_var=LD_LIBRARY_PATH
+  sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib"
+  sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec"
+  ;;
+
+rdos*)
+  dynamic_linker=no
+  ;;
+
+solaris*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  hardcode_into_libs=yes
+  # ldd complains unless libraries are executable
+  postinstall_cmds='chmod +x $lib'
+  ;;
+
+sunos4*)
+  version_type=sunos
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
+  finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  if test "$with_gnu_ld" = yes; then
+    need_lib_prefix=no
+  fi
+  need_version=yes
+  ;;
+
+sysv4 | sysv4.3*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  case $host_vendor in
+    sni)
+      shlibpath_overrides_runpath=no
+      need_lib_prefix=no
+      runpath_var=LD_RUN_PATH
+      ;;
+    siemens)
+      need_lib_prefix=no
+      ;;
+    motorola)
+      need_lib_prefix=no
+      need_version=no
+      shlibpath_overrides_runpath=no
+      sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib'
+      ;;
+  esac
+  ;;
+
+sysv4*MP*)
+  if test -d /usr/nec ;then
+    version_type=linux # correct to gnu/linux during the next big refactor
+    library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}'
+    soname_spec='$libname${shared_ext}.$major'
+    shlibpath_var=LD_LIBRARY_PATH
+  fi
+  ;;
+
+sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*)
+  version_type=freebsd-elf
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  hardcode_into_libs=yes
+  if test "$with_gnu_ld" = yes; then
+    sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib'
+  else
+    sys_lib_search_path_spec='/usr/ccs/lib /usr/lib'
+    case $host_os in
+      sco3.2v5*)
+        sys_lib_search_path_spec="$sys_lib_search_path_spec /lib"
+       ;;
+    esac
+  fi
+  sys_lib_dlsearch_path_spec='/usr/lib'
+  ;;
+
+tpf*)
+  # TPF is a cross-target only.  Preferred cross-host = GNU/Linux.
+  version_type=linux # correct to gnu/linux during the next big refactor
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=no
+  hardcode_into_libs=yes
+  ;;
+
+uts4*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  ;;
+
+*)
+  dynamic_linker=no
+  ;;
+esac
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $dynamic_linker" >&5
+$as_echo "$dynamic_linker" >&6; }
+test "$dynamic_linker" = no && can_build_shared=no
+
+variables_saved_for_relink="PATH $shlibpath_var $runpath_var"
+if test "$GCC" = yes; then
+  variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH"
+fi
+
+if test "${lt_cv_sys_lib_search_path_spec+set}" = set; then
+  sys_lib_search_path_spec="$lt_cv_sys_lib_search_path_spec"
+fi
+if test "${lt_cv_sys_lib_dlsearch_path_spec+set}" = set; then
+  sys_lib_dlsearch_path_spec="$lt_cv_sys_lib_dlsearch_path_spec"
+fi
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to hardcode library paths into programs" >&5
+$as_echo_n "checking how to hardcode library paths into programs... " >&6; }
+hardcode_action=
+if test -n "$hardcode_libdir_flag_spec" ||
+   test -n "$runpath_var" ||
+   test "X$hardcode_automatic" = "Xyes" ; then
+
+  # We can hardcode non-existent directories.
+  if test "$hardcode_direct" != no &&
+     # If the only mechanism to avoid hardcoding is shlibpath_var, we
+     # have to relink, otherwise we might link with an installed library
+     # when we should be linking with a yet-to-be-installed one
+     ## test "$_LT_TAGVAR(hardcode_shlibpath_var, )" != no &&
+     test "$hardcode_minus_L" != no; then
+    # Linking always hardcodes the temporary library directory.
+    hardcode_action=relink
+  else
+    # We can link without hardcoding, and we can hardcode nonexisting dirs.
+    hardcode_action=immediate
+  fi
+else
+  # We cannot hardcode anything, or else we can only hardcode existing
+  # directories.
+  hardcode_action=unsupported
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $hardcode_action" >&5
+$as_echo "$hardcode_action" >&6; }
+
+if test "$hardcode_action" = relink ||
+   test "$inherit_rpath" = yes; then
+  # Fast installation is not supported
+  enable_fast_install=no
+elif test "$shlibpath_overrides_runpath" = yes ||
+     test "$enable_shared" = no; then
+  # Fast installation is not necessary
+  enable_fast_install=needless
+fi
+
+
+
+
+
+
+  if test "x$enable_dlopen" != xyes; then
+  enable_dlopen=unknown
+  enable_dlopen_self=unknown
+  enable_dlopen_self_static=unknown
+else
+  lt_cv_dlopen=no
+  lt_cv_dlopen_libs=
+
+  case $host_os in
+  beos*)
+    lt_cv_dlopen="load_add_on"
+    lt_cv_dlopen_libs=
+    lt_cv_dlopen_self=yes
+    ;;
+
+  mingw* | pw32* | cegcc*)
+    lt_cv_dlopen="LoadLibrary"
+    lt_cv_dlopen_libs=
+    ;;
+
+  cygwin*)
+    lt_cv_dlopen="dlopen"
+    lt_cv_dlopen_libs=
+    ;;
+
+  darwin*)
+  # if libdl is installed we need to link against it
+    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5
+$as_echo_n "checking for dlopen in -ldl... " >&6; }
+if ${ac_cv_lib_dl_dlopen+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_check_lib_save_LIBS=$LIBS
+LIBS="-ldl  $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+char dlopen ();
+int
+main ()
+{
+return dlopen ();
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  ac_cv_lib_dl_dlopen=yes
+else
+  ac_cv_lib_dl_dlopen=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5
+$as_echo "$ac_cv_lib_dl_dlopen" >&6; }
+if test "x$ac_cv_lib_dl_dlopen" = xyes; then :
+  lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"
+else
+
+    lt_cv_dlopen="dyld"
+    lt_cv_dlopen_libs=
+    lt_cv_dlopen_self=yes
+
+fi
+
+    ;;
+
+  *)
+    ac_fn_c_check_func "$LINENO" "shl_load" "ac_cv_func_shl_load"
+if test "x$ac_cv_func_shl_load" = xyes; then :
+  lt_cv_dlopen="shl_load"
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for shl_load in -ldld" >&5
+$as_echo_n "checking for shl_load in -ldld... " >&6; }
+if ${ac_cv_lib_dld_shl_load+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_check_lib_save_LIBS=$LIBS
+LIBS="-ldld  $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+char shl_load ();
+int
+main ()
+{
+return shl_load ();
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  ac_cv_lib_dld_shl_load=yes
+else
+  ac_cv_lib_dld_shl_load=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_shl_load" >&5
+$as_echo "$ac_cv_lib_dld_shl_load" >&6; }
+if test "x$ac_cv_lib_dld_shl_load" = xyes; then :
+  lt_cv_dlopen="shl_load" lt_cv_dlopen_libs="-ldld"
+else
+  ac_fn_c_check_func "$LINENO" "dlopen" "ac_cv_func_dlopen"
+if test "x$ac_cv_func_dlopen" = xyes; then :
+  lt_cv_dlopen="dlopen"
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5
+$as_echo_n "checking for dlopen in -ldl... " >&6; }
+if ${ac_cv_lib_dl_dlopen+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_check_lib_save_LIBS=$LIBS
+LIBS="-ldl  $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+char dlopen ();
+int
+main ()
+{
+return dlopen ();
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  ac_cv_lib_dl_dlopen=yes
+else
+  ac_cv_lib_dl_dlopen=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5
+$as_echo "$ac_cv_lib_dl_dlopen" >&6; }
+if test "x$ac_cv_lib_dl_dlopen" = xyes; then :
+  lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -lsvld" >&5
+$as_echo_n "checking for dlopen in -lsvld... " >&6; }
+if ${ac_cv_lib_svld_dlopen+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_check_lib_save_LIBS=$LIBS
+LIBS="-lsvld  $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+char dlopen ();
+int
+main ()
+{
+return dlopen ();
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  ac_cv_lib_svld_dlopen=yes
+else
+  ac_cv_lib_svld_dlopen=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_svld_dlopen" >&5
+$as_echo "$ac_cv_lib_svld_dlopen" >&6; }
+if test "x$ac_cv_lib_svld_dlopen" = xyes; then :
+  lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-lsvld"
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dld_link in -ldld" >&5
+$as_echo_n "checking for dld_link in -ldld... " >&6; }
+if ${ac_cv_lib_dld_dld_link+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_check_lib_save_LIBS=$LIBS
+LIBS="-ldld  $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+char dld_link ();
+int
+main ()
+{
+return dld_link ();
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  ac_cv_lib_dld_dld_link=yes
+else
+  ac_cv_lib_dld_dld_link=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_dld_link" >&5
+$as_echo "$ac_cv_lib_dld_dld_link" >&6; }
+if test "x$ac_cv_lib_dld_dld_link" = xyes; then :
+  lt_cv_dlopen="dld_link" lt_cv_dlopen_libs="-ldld"
+fi
+
+
+fi
+
+
+fi
+
+
+fi
+
+
+fi
+
+
+fi
+
+    ;;
+  esac
+
+  if test "x$lt_cv_dlopen" != xno; then
+    enable_dlopen=yes
+  else
+    enable_dlopen=no
+  fi
+
+  case $lt_cv_dlopen in
+  dlopen)
+    save_CPPFLAGS="$CPPFLAGS"
+    test "x$ac_cv_header_dlfcn_h" = xyes && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H"
+
+    save_LDFLAGS="$LDFLAGS"
+    wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\"
+
+    save_LIBS="$LIBS"
+    LIBS="$lt_cv_dlopen_libs $LIBS"
+
+    { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether a program can dlopen itself" >&5
+$as_echo_n "checking whether a program can dlopen itself... " >&6; }
+if ${lt_cv_dlopen_self+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+         if test "$cross_compiling" = yes; then :
+  lt_cv_dlopen_self=cross
+else
+  lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
+  lt_status=$lt_dlunknown
+  cat > conftest.$ac_ext <<_LT_EOF
+#line $LINENO "configure"
+#include "confdefs.h"
+
+#if HAVE_DLFCN_H
+#include <dlfcn.h>
+#endif
+
+#include <stdio.h>
+
+#ifdef RTLD_GLOBAL
+#  define LT_DLGLOBAL          RTLD_GLOBAL
+#else
+#  ifdef DL_GLOBAL
+#    define LT_DLGLOBAL                DL_GLOBAL
+#  else
+#    define LT_DLGLOBAL                0
+#  endif
+#endif
+
+/* We may have to define LT_DLLAZY_OR_NOW in the command line if we
+   find out it does not work in some platform. */
+#ifndef LT_DLLAZY_OR_NOW
+#  ifdef RTLD_LAZY
+#    define LT_DLLAZY_OR_NOW           RTLD_LAZY
+#  else
+#    ifdef DL_LAZY
+#      define LT_DLLAZY_OR_NOW         DL_LAZY
+#    else
+#      ifdef RTLD_NOW
+#        define LT_DLLAZY_OR_NOW       RTLD_NOW
+#      else
+#        ifdef DL_NOW
+#          define LT_DLLAZY_OR_NOW     DL_NOW
+#        else
+#          define LT_DLLAZY_OR_NOW     0
+#        endif
+#      endif
+#    endif
+#  endif
+#endif
+
+/* When -fvisbility=hidden is used, assume the code has been annotated
+   correspondingly for the symbols needed.  */
+#if defined(__GNUC__) && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3))
+int fnord () __attribute__((visibility("default")));
+#endif
+
+int fnord () { return 42; }
+int main ()
+{
+  void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW);
+  int status = $lt_dlunknown;
+
+  if (self)
+    {
+      if (dlsym (self,"fnord"))       status = $lt_dlno_uscore;
+      else
+        {
+         if (dlsym( self,"_fnord"))  status = $lt_dlneed_uscore;
+          else puts (dlerror ());
+       }
+      /* dlclose (self); */
+    }
+  else
+    puts (dlerror ());
+
+  return status;
+}
+_LT_EOF
+  if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; } && test -s conftest${ac_exeext} 2>/dev/null; then
+    (./conftest; exit; ) >&5 2>/dev/null
+    lt_status=$?
+    case x$lt_status in
+      x$lt_dlno_uscore) lt_cv_dlopen_self=yes ;;
+      x$lt_dlneed_uscore) lt_cv_dlopen_self=yes ;;
+      x$lt_dlunknown|x*) lt_cv_dlopen_self=no ;;
+    esac
+  else :
+    # compilation failed
+    lt_cv_dlopen_self=no
+  fi
+fi
+rm -fr conftest*
+
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_dlopen_self" >&5
+$as_echo "$lt_cv_dlopen_self" >&6; }
+
+    if test "x$lt_cv_dlopen_self" = xyes; then
+      wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $lt_prog_compiler_static\"
+      { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether a statically linked program can dlopen itself" >&5
+$as_echo_n "checking whether a statically linked program can dlopen itself... " >&6; }
+if ${lt_cv_dlopen_self_static+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+         if test "$cross_compiling" = yes; then :
+  lt_cv_dlopen_self_static=cross
+else
+  lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
+  lt_status=$lt_dlunknown
+  cat > conftest.$ac_ext <<_LT_EOF
+#line $LINENO "configure"
+#include "confdefs.h"
+
+#if HAVE_DLFCN_H
+#include <dlfcn.h>
+#endif
+
+#include <stdio.h>
+
+#ifdef RTLD_GLOBAL
+#  define LT_DLGLOBAL          RTLD_GLOBAL
+#else
+#  ifdef DL_GLOBAL
+#    define LT_DLGLOBAL                DL_GLOBAL
+#  else
+#    define LT_DLGLOBAL                0
+#  endif
+#endif
+
+/* We may have to define LT_DLLAZY_OR_NOW in the command line if we
+   find out it does not work in some platform. */
+#ifndef LT_DLLAZY_OR_NOW
+#  ifdef RTLD_LAZY
+#    define LT_DLLAZY_OR_NOW           RTLD_LAZY
+#  else
+#    ifdef DL_LAZY
+#      define LT_DLLAZY_OR_NOW         DL_LAZY
+#    else
+#      ifdef RTLD_NOW
+#        define LT_DLLAZY_OR_NOW       RTLD_NOW
+#      else
+#        ifdef DL_NOW
+#          define LT_DLLAZY_OR_NOW     DL_NOW
+#        else
+#          define LT_DLLAZY_OR_NOW     0
+#        endif
+#      endif
+#    endif
+#  endif
+#endif
+
+/* When -fvisbility=hidden is used, assume the code has been annotated
+   correspondingly for the symbols needed.  */
+#if defined(__GNUC__) && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3))
+int fnord () __attribute__((visibility("default")));
+#endif
+
+int fnord () { return 42; }
+int main ()
+{
+  void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW);
+  int status = $lt_dlunknown;
+
+  if (self)
+    {
+      if (dlsym (self,"fnord"))       status = $lt_dlno_uscore;
+      else
+        {
+         if (dlsym( self,"_fnord"))  status = $lt_dlneed_uscore;
+          else puts (dlerror ());
+       }
+      /* dlclose (self); */
+    }
+  else
+    puts (dlerror ());
+
+  return status;
+}
+_LT_EOF
+  if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; } && test -s conftest${ac_exeext} 2>/dev/null; then
+    (./conftest; exit; ) >&5 2>/dev/null
+    lt_status=$?
+    case x$lt_status in
+      x$lt_dlno_uscore) lt_cv_dlopen_self_static=yes ;;
+      x$lt_dlneed_uscore) lt_cv_dlopen_self_static=yes ;;
+      x$lt_dlunknown|x*) lt_cv_dlopen_self_static=no ;;
+    esac
+  else :
+    # compilation failed
+    lt_cv_dlopen_self_static=no
+  fi
+fi
+rm -fr conftest*
+
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_dlopen_self_static" >&5
+$as_echo "$lt_cv_dlopen_self_static" >&6; }
+    fi
+
+    CPPFLAGS="$save_CPPFLAGS"
+    LDFLAGS="$save_LDFLAGS"
+    LIBS="$save_LIBS"
+    ;;
+  esac
+
+  case $lt_cv_dlopen_self in
+  yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;;
+  *) enable_dlopen_self=unknown ;;
+  esac
+
+  case $lt_cv_dlopen_self_static in
+  yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;;
+  *) enable_dlopen_self_static=unknown ;;
+  esac
+fi
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+striplib=
+old_striplib=
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether stripping libraries is possible" >&5
+$as_echo_n "checking whether stripping libraries is possible... " >&6; }
+if test -n "$STRIP" && $STRIP -V 2>&1 | $GREP "GNU strip" >/dev/null; then
+  test -z "$old_striplib" && old_striplib="$STRIP --strip-debug"
+  test -z "$striplib" && striplib="$STRIP --strip-unneeded"
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+else
+# FIXME - insert some real tests, host_os isn't really good enough
+  case $host_os in
+  darwin*)
+    if test -n "$STRIP" ; then
+      striplib="$STRIP -x"
+      old_striplib="$STRIP -S"
+      { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+    else
+      { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+    fi
+    ;;
+  *)
+    { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+    ;;
+  esac
+fi
+
+
+
+
+
+
+
+
+
+
+
+
+  # Report which library types will actually be built
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking if libtool supports shared libraries" >&5
+$as_echo_n "checking if libtool supports shared libraries... " >&6; }
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $can_build_shared" >&5
+$as_echo "$can_build_shared" >&6; }
+
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build shared libraries" >&5
+$as_echo_n "checking whether to build shared libraries... " >&6; }
+  test "$can_build_shared" = "no" && enable_shared=no
+
+  # On AIX, shared libraries and static libraries use the same namespace, and
+  # are all built from PIC.
+  case $host_os in
+  aix3*)
+    test "$enable_shared" = yes && enable_static=no
+    if test -n "$RANLIB"; then
+      archive_cmds="$archive_cmds~\$RANLIB \$lib"
+      postinstall_cmds='$RANLIB $lib'
+    fi
+    ;;
+
+  aix[4-9]*)
+    if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then
+      test "$enable_shared" = yes && enable_static=no
+    fi
+    ;;
+  esac
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_shared" >&5
+$as_echo "$enable_shared" >&6; }
+
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build static libraries" >&5
+$as_echo_n "checking whether to build static libraries... " >&6; }
+  # Make sure either enable_shared or enable_static is yes.
+  test "$enable_shared" = yes || enable_static=yes
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_static" >&5
+$as_echo "$enable_static" >&6; }
+
+
+
+
+fi
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+CC="$lt_save_CC"
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+        ac_config_commands="$ac_config_commands libtool"
+
+
+
+
+# Only expand once:
+
+
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args.
+set dummy ${ac_tool_prefix}gcc; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_CC+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$CC"; then
+  ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_CC="${ac_tool_prefix}gcc"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
+$as_echo "$CC" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_CC"; then
+  ac_ct_CC=$CC
+  # Extract the first word of "gcc", so it can be a program name with args.
+set dummy gcc; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_CC+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$ac_ct_CC"; then
+  ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_ac_ct_CC="gcc"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_CC=$ac_cv_prog_ac_ct_CC
+if test -n "$ac_ct_CC"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5
+$as_echo "$ac_ct_CC" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+  if test "x$ac_ct_CC" = x; then
+    CC=""
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    CC=$ac_ct_CC
+  fi
+else
+  CC="$ac_cv_prog_CC"
+fi
+
+if test -z "$CC"; then
+          if test -n "$ac_tool_prefix"; then
+    # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args.
+set dummy ${ac_tool_prefix}cc; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_CC+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$CC"; then
+  ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_CC="${ac_tool_prefix}cc"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
+$as_echo "$CC" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+  fi
+fi
+if test -z "$CC"; then
+  # Extract the first word of "cc", so it can be a program name with args.
+set dummy cc; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_CC+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$CC"; then
+  ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+  ac_prog_rejected=no
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then
+       ac_prog_rejected=yes
+       continue
+     fi
+    ac_cv_prog_CC="cc"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+if test $ac_prog_rejected = yes; then
+  # We found a bogon in the path, so make sure we never use it.
+  set dummy $ac_cv_prog_CC
+  shift
+  if test $# != 0; then
+    # We chose a different compiler from the bogus one.
+    # However, it has the same basename, so the bogon will be chosen
+    # first if we set CC to just the basename; use the full file name.
+    shift
+    ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@"
+  fi
+fi
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
+$as_echo "$CC" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$CC"; then
+  if test -n "$ac_tool_prefix"; then
+  for ac_prog in cl.exe
+  do
+    # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args.
+set dummy $ac_tool_prefix$ac_prog; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_CC+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$CC"; then
+  ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_CC="$ac_tool_prefix$ac_prog"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
+$as_echo "$CC" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+    test -n "$CC" && break
+  done
+fi
+if test -z "$CC"; then
+  ac_ct_CC=$CC
+  for ac_prog in cl.exe
+do
+  # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_CC+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$ac_ct_CC"; then
+  ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_ac_ct_CC="$ac_prog"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_CC=$ac_cv_prog_ac_ct_CC
+if test -n "$ac_ct_CC"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5
+$as_echo "$ac_ct_CC" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+  test -n "$ac_ct_CC" && break
+done
+
+  if test "x$ac_ct_CC" = x; then
+    CC=""
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    CC=$ac_ct_CC
+  fi
+fi
+
+fi
+
+
+test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "no acceptable C compiler found in \$PATH
+See \`config.log' for more details" "$LINENO" 5; }
+
+# Provide some information about the compiler.
+$as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5
+set X $ac_compile
+ac_compiler=$2
+for ac_option in --version -v -V -qversion; do
+  { { ac_try="$ac_compiler $ac_option >&5"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_compiler $ac_option >&5") 2>conftest.err
+  ac_status=$?
+  if test -s conftest.err; then
+    sed '10a\
+... rest of stderr output deleted ...
+         10q' conftest.err >conftest.er1
+    cat conftest.er1 >&5
+  fi
+  rm -f conftest.er1 conftest.err
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }
+done
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5
+$as_echo_n "checking whether we are using the GNU C compiler... " >&6; }
+if ${ac_cv_c_compiler_gnu+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+#ifndef __GNUC__
+       choke me
+#endif
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  ac_compiler_gnu=yes
+else
+  ac_compiler_gnu=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+ac_cv_c_compiler_gnu=$ac_compiler_gnu
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5
+$as_echo "$ac_cv_c_compiler_gnu" >&6; }
+if test $ac_compiler_gnu = yes; then
+  GCC=yes
+else
+  GCC=
+fi
+ac_test_CFLAGS=${CFLAGS+set}
+ac_save_CFLAGS=$CFLAGS
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5
+$as_echo_n "checking whether $CC accepts -g... " >&6; }
+if ${ac_cv_prog_cc_g+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_save_c_werror_flag=$ac_c_werror_flag
+   ac_c_werror_flag=yes
+   ac_cv_prog_cc_g=no
+   CFLAGS="-g"
+   cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  ac_cv_prog_cc_g=yes
+else
+  CFLAGS=""
+      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+
+else
+  ac_c_werror_flag=$ac_save_c_werror_flag
+        CFLAGS="-g"
+        cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  ac_cv_prog_cc_g=yes
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+   ac_c_werror_flag=$ac_save_c_werror_flag
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5
+$as_echo "$ac_cv_prog_cc_g" >&6; }
+if test "$ac_test_CFLAGS" = set; then
+  CFLAGS=$ac_save_CFLAGS
+elif test $ac_cv_prog_cc_g = yes; then
+  if test "$GCC" = yes; then
+    CFLAGS="-g -O2"
+  else
+    CFLAGS="-g"
+  fi
+else
+  if test "$GCC" = yes; then
+    CFLAGS="-O2"
+  else
+    CFLAGS=
+  fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5
+$as_echo_n "checking for $CC option to accept ISO C89... " >&6; }
+if ${ac_cv_prog_cc_c89+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_cv_prog_cc_c89=no
+ac_save_CC=$CC
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <stdarg.h>
+#include <stdio.h>
+struct stat;
+/* Most of the following tests are stolen from RCS 5.7's src/conf.sh.  */
+struct buf { int x; };
+FILE * (*rcsopen) (struct buf *, struct stat *, int);
+static char *e (p, i)
+     char **p;
+     int i;
+{
+  return p[i];
+}
+static char *f (char * (*g) (char **, int), char **p, ...)
+{
+  char *s;
+  va_list v;
+  va_start (v,p);
+  s = g (p, va_arg (v,int));
+  va_end (v);
+  return s;
+}
+
+/* OSF 4.0 Compaq cc is some sort of almost-ANSI by default.  It has
+   function prototypes and stuff, but not '\xHH' hex character constants.
+   These don't provoke an error unfortunately, instead are silently treated
+   as 'x'.  The following induces an error, until -std is added to get
+   proper ANSI mode.  Curiously '\x00'!='x' always comes out true, for an
+   array size at least.  It's necessary to write '\x00'==0 to get something
+   that's true only with -std.  */
+int osf4_cc_array ['\x00' == 0 ? 1 : -1];
+
+/* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters
+   inside strings and character constants.  */
+#define FOO(x) 'x'
+int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1];
+
+int test (int i, double x);
+struct s1 {int (*f) (int a);};
+struct s2 {int (*f) (double a);};
+int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int);
+int argc;
+char **argv;
+int
+main ()
+{
+return f (e, argv, 0) != argv[0]  ||  f (e, argv, 1) != argv[1];
+  ;
+  return 0;
+}
+_ACEOF
+for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \
+       -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__"
+do
+  CC="$ac_save_CC $ac_arg"
+  if ac_fn_c_try_compile "$LINENO"; then :
+  ac_cv_prog_cc_c89=$ac_arg
+fi
+rm -f core conftest.err conftest.$ac_objext
+  test "x$ac_cv_prog_cc_c89" != "xno" && break
+done
+rm -f conftest.$ac_ext
+CC=$ac_save_CC
+
+fi
+# AC_CACHE_VAL
+case "x$ac_cv_prog_cc_c89" in
+  x)
+    { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5
+$as_echo "none needed" >&6; } ;;
+  xno)
+    { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5
+$as_echo "unsupported" >&6; } ;;
+  *)
+    CC="$CC $ac_cv_prog_cc_c89"
+    { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5
+$as_echo "$ac_cv_prog_cc_c89" >&6; } ;;
+esac
+if test "x$ac_cv_prog_cc_c89" != xno; then :
+
+fi
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+depcc="$CC"   am_compiler_list=
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5
+$as_echo_n "checking dependency style of $depcc... " >&6; }
+if ${am_cv_CC_dependencies_compiler_type+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then
+  # We make a subdir and do the tests there.  Otherwise we can end up
+  # making bogus files that we don't know about and never remove.  For
+  # instance it was reported that on HP-UX the gcc test will end up
+  # making a dummy file named `D' -- because `-MD' means `put the output
+  # in D'.
+  rm -rf conftest.dir
+  mkdir conftest.dir
+  # Copy depcomp to subdir because otherwise we won't find it if we're
+  # using a relative directory.
+  cp "$am_depcomp" conftest.dir
+  cd conftest.dir
+  # We will build objects and dependencies in a subdirectory because
+  # it helps to detect inapplicable dependency modes.  For instance
+  # both Tru64's cc and ICC support -MD to output dependencies as a
+  # side effect of compilation, but ICC will put the dependencies in
+  # the current directory while Tru64 will put them in the object
+  # directory.
+  mkdir sub
+
+  am_cv_CC_dependencies_compiler_type=none
+  if test "$am_compiler_list" = ""; then
+     am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp`
+  fi
+  am__universal=false
+  case " $depcc " in #(
+     *\ -arch\ *\ -arch\ *) am__universal=true ;;
+     esac
+
+  for depmode in $am_compiler_list; do
+    # Setup a source with many dependencies, because some compilers
+    # like to wrap large dependency lists on column 80 (with \), and
+    # we should not choose a depcomp mode which is confused by this.
+    #
+    # We need to recreate these files for each test, as the compiler may
+    # overwrite some of them when testing with obscure command lines.
+    # This happens at least with the AIX C compiler.
+    : > sub/conftest.c
+    for i in 1 2 3 4 5 6; do
+      echo '#include "conftst'$i'.h"' >> sub/conftest.c
+      # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with
+      # Solaris 8's {/usr,}/bin/sh.
+      touch sub/conftst$i.h
+    done
+    echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf
+
+    # We check with `-c' and `-o' for the sake of the "dashmstdout"
+    # mode.  It turns out that the SunPro C++ compiler does not properly
+    # handle `-M -o', and we need to detect this.  Also, some Intel
+    # versions had trouble with output in subdirs
+    am__obj=sub/conftest.${OBJEXT-o}
+    am__minus_obj="-o $am__obj"
+    case $depmode in
+    gcc)
+      # This depmode causes a compiler race in universal mode.
+      test "$am__universal" = false || continue
+      ;;
+    nosideeffect)
+      # after this tag, mechanisms are not by side-effect, so they'll
+      # only be used when explicitly requested
+      if test "x$enable_dependency_tracking" = xyes; then
+       continue
+      else
+       break
+      fi
+      ;;
+    msvc7 | msvc7msys | msvisualcpp | msvcmsys)
+      # This compiler won't grok `-c -o', but also, the minuso test has
+      # not run yet.  These depmodes are late enough in the game, and
+      # so weak that their functioning should not be impacted.
+      am__obj=conftest.${OBJEXT-o}
+      am__minus_obj=
+      ;;
+    none) break ;;
+    esac
+    if depmode=$depmode \
+       source=sub/conftest.c object=$am__obj \
+       depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \
+       $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \
+         >/dev/null 2>conftest.err &&
+       grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 &&
+       grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 &&
+       grep $am__obj sub/conftest.Po > /dev/null 2>&1 &&
+       ${MAKE-make} -s -f confmf > /dev/null 2>&1; then
+      # icc doesn't choke on unknown options, it will just issue warnings
+      # or remarks (even with -Werror).  So we grep stderr for any message
+      # that says an option was ignored or not supported.
+      # When given -MP, icc 7.0 and 7.1 complain thusly:
+      #   icc: Command line warning: ignoring option '-M'; no argument required
+      # The diagnosis changed in icc 8.0:
+      #   icc: Command line remark: option '-MP' not supported
+      if (grep 'ignoring option' conftest.err ||
+          grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else
+        am_cv_CC_dependencies_compiler_type=$depmode
+        break
+      fi
+    fi
+  done
+
+  cd ..
+  rm -rf conftest.dir
+else
+  am_cv_CC_dependencies_compiler_type=none
+fi
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CC_dependencies_compiler_type" >&5
+$as_echo "$am_cv_CC_dependencies_compiler_type" >&6; }
+CCDEPMODE=depmode=$am_cv_CC_dependencies_compiler_type
+
+ if
+  test "x$enable_dependency_tracking" != xno \
+  && test "$am_cv_CC_dependencies_compiler_type" = gcc3; then
+  am__fastdepCC_TRUE=
+  am__fastdepCC_FALSE='#'
+else
+  am__fastdepCC_TRUE='#'
+  am__fastdepCC_FALSE=
+fi
+
+
+ac_ext=cpp
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
+if test -z "$CXX"; then
+  if test -n "$CCC"; then
+    CXX=$CCC
+  else
+    if test -n "$ac_tool_prefix"; then
+  for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC
+  do
+    # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args.
+set dummy $ac_tool_prefix$ac_prog; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_CXX+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$CXX"; then
+  ac_cv_prog_CXX="$CXX" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_CXX="$ac_tool_prefix$ac_prog"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+CXX=$ac_cv_prog_CXX
+if test -n "$CXX"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CXX" >&5
+$as_echo "$CXX" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+    test -n "$CXX" && break
+  done
+fi
+if test -z "$CXX"; then
+  ac_ct_CXX=$CXX
+  for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC
+do
+  # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_CXX+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$ac_ct_CXX"; then
+  ac_cv_prog_ac_ct_CXX="$ac_ct_CXX" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_ac_ct_CXX="$ac_prog"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_CXX=$ac_cv_prog_ac_ct_CXX
+if test -n "$ac_ct_CXX"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CXX" >&5
+$as_echo "$ac_ct_CXX" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+  test -n "$ac_ct_CXX" && break
+done
+
+  if test "x$ac_ct_CXX" = x; then
+    CXX="g++"
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    CXX=$ac_ct_CXX
+  fi
+fi
+
+  fi
+fi
+# Provide some information about the compiler.
+$as_echo "$as_me:${as_lineno-$LINENO}: checking for C++ compiler version" >&5
+set X $ac_compile
+ac_compiler=$2
+for ac_option in --version -v -V -qversion; do
+  { { ac_try="$ac_compiler $ac_option >&5"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_compiler $ac_option >&5") 2>conftest.err
+  ac_status=$?
+  if test -s conftest.err; then
+    sed '10a\
+... rest of stderr output deleted ...
+         10q' conftest.err >conftest.er1
+    cat conftest.er1 >&5
+  fi
+  rm -f conftest.er1 conftest.err
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }
+done
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C++ compiler" >&5
+$as_echo_n "checking whether we are using the GNU C++ compiler... " >&6; }
+if ${ac_cv_cxx_compiler_gnu+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+#ifndef __GNUC__
+       choke me
+#endif
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_cxx_try_compile "$LINENO"; then :
+  ac_compiler_gnu=yes
+else
+  ac_compiler_gnu=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+ac_cv_cxx_compiler_gnu=$ac_compiler_gnu
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_cxx_compiler_gnu" >&5
+$as_echo "$ac_cv_cxx_compiler_gnu" >&6; }
+if test $ac_compiler_gnu = yes; then
+  GXX=yes
+else
+  GXX=
+fi
+ac_test_CXXFLAGS=${CXXFLAGS+set}
+ac_save_CXXFLAGS=$CXXFLAGS
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CXX accepts -g" >&5
+$as_echo_n "checking whether $CXX accepts -g... " >&6; }
+if ${ac_cv_prog_cxx_g+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_save_cxx_werror_flag=$ac_cxx_werror_flag
+   ac_cxx_werror_flag=yes
+   ac_cv_prog_cxx_g=no
+   CXXFLAGS="-g"
+   cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_cxx_try_compile "$LINENO"; then :
+  ac_cv_prog_cxx_g=yes
+else
+  CXXFLAGS=""
+      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_cxx_try_compile "$LINENO"; then :
+
+else
+  ac_cxx_werror_flag=$ac_save_cxx_werror_flag
+        CXXFLAGS="-g"
+        cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_cxx_try_compile "$LINENO"; then :
+  ac_cv_prog_cxx_g=yes
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+   ac_cxx_werror_flag=$ac_save_cxx_werror_flag
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cxx_g" >&5
+$as_echo "$ac_cv_prog_cxx_g" >&6; }
+if test "$ac_test_CXXFLAGS" = set; then
+  CXXFLAGS=$ac_save_CXXFLAGS
+elif test $ac_cv_prog_cxx_g = yes; then
+  if test "$GXX" = yes; then
+    CXXFLAGS="-g -O2"
+  else
+    CXXFLAGS="-g"
+  fi
+else
+  if test "$GXX" = yes; then
+    CXXFLAGS="-O2"
+  else
+    CXXFLAGS=
+  fi
+fi
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+depcc="$CXX"  am_compiler_list=
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5
+$as_echo_n "checking dependency style of $depcc... " >&6; }
+if ${am_cv_CXX_dependencies_compiler_type+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then
+  # We make a subdir and do the tests there.  Otherwise we can end up
+  # making bogus files that we don't know about and never remove.  For
+  # instance it was reported that on HP-UX the gcc test will end up
+  # making a dummy file named `D' -- because `-MD' means `put the output
+  # in D'.
+  rm -rf conftest.dir
+  mkdir conftest.dir
+  # Copy depcomp to subdir because otherwise we won't find it if we're
+  # using a relative directory.
+  cp "$am_depcomp" conftest.dir
+  cd conftest.dir
+  # We will build objects and dependencies in a subdirectory because
+  # it helps to detect inapplicable dependency modes.  For instance
+  # both Tru64's cc and ICC support -MD to output dependencies as a
+  # side effect of compilation, but ICC will put the dependencies in
+  # the current directory while Tru64 will put them in the object
+  # directory.
+  mkdir sub
+
+  am_cv_CXX_dependencies_compiler_type=none
+  if test "$am_compiler_list" = ""; then
+     am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp`
+  fi
+  am__universal=false
+  case " $depcc " in #(
+     *\ -arch\ *\ -arch\ *) am__universal=true ;;
+     esac
+
+  for depmode in $am_compiler_list; do
+    # Setup a source with many dependencies, because some compilers
+    # like to wrap large dependency lists on column 80 (with \), and
+    # we should not choose a depcomp mode which is confused by this.
+    #
+    # We need to recreate these files for each test, as the compiler may
+    # overwrite some of them when testing with obscure command lines.
+    # This happens at least with the AIX C compiler.
+    : > sub/conftest.c
+    for i in 1 2 3 4 5 6; do
+      echo '#include "conftst'$i'.h"' >> sub/conftest.c
+      # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with
+      # Solaris 8's {/usr,}/bin/sh.
+      touch sub/conftst$i.h
+    done
+    echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf
+
+    # We check with `-c' and `-o' for the sake of the "dashmstdout"
+    # mode.  It turns out that the SunPro C++ compiler does not properly
+    # handle `-M -o', and we need to detect this.  Also, some Intel
+    # versions had trouble with output in subdirs
+    am__obj=sub/conftest.${OBJEXT-o}
+    am__minus_obj="-o $am__obj"
+    case $depmode in
+    gcc)
+      # This depmode causes a compiler race in universal mode.
+      test "$am__universal" = false || continue
+      ;;
+    nosideeffect)
+      # after this tag, mechanisms are not by side-effect, so they'll
+      # only be used when explicitly requested
+      if test "x$enable_dependency_tracking" = xyes; then
+       continue
+      else
+       break
+      fi
+      ;;
+    msvc7 | msvc7msys | msvisualcpp | msvcmsys)
+      # This compiler won't grok `-c -o', but also, the minuso test has
+      # not run yet.  These depmodes are late enough in the game, and
+      # so weak that their functioning should not be impacted.
+      am__obj=conftest.${OBJEXT-o}
+      am__minus_obj=
+      ;;
+    none) break ;;
+    esac
+    if depmode=$depmode \
+       source=sub/conftest.c object=$am__obj \
+       depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \
+       $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \
+         >/dev/null 2>conftest.err &&
+       grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 &&
+       grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 &&
+       grep $am__obj sub/conftest.Po > /dev/null 2>&1 &&
+       ${MAKE-make} -s -f confmf > /dev/null 2>&1; then
+      # icc doesn't choke on unknown options, it will just issue warnings
+      # or remarks (even with -Werror).  So we grep stderr for any message
+      # that says an option was ignored or not supported.
+      # When given -MP, icc 7.0 and 7.1 complain thusly:
+      #   icc: Command line warning: ignoring option '-M'; no argument required
+      # The diagnosis changed in icc 8.0:
+      #   icc: Command line remark: option '-MP' not supported
+      if (grep 'ignoring option' conftest.err ||
+          grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else
+        am_cv_CXX_dependencies_compiler_type=$depmode
+        break
+      fi
+    fi
+  done
+
+  cd ..
+  rm -rf conftest.dir
+else
+  am_cv_CXX_dependencies_compiler_type=none
+fi
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CXX_dependencies_compiler_type" >&5
+$as_echo "$am_cv_CXX_dependencies_compiler_type" >&6; }
+CXXDEPMODE=depmode=$am_cv_CXX_dependencies_compiler_type
+
+ if
+  test "x$enable_dependency_tracking" != xno \
+  && test "$am_cv_CXX_dependencies_compiler_type" = gcc3; then
+  am__fastdepCXX_TRUE=
+  am__fastdepCXX_FALSE='#'
+else
+  am__fastdepCXX_TRUE='#'
+  am__fastdepCXX_FALSE=
+fi
+
+
+
+
+func_stripname_cnf ()
+{
+  case ${2} in
+  .*) func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%\\\\${2}\$%%"`;;
+  *)  func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%${2}\$%%"`;;
+  esac
+} # func_stripname_cnf
+
+      if test -n "$CXX" && ( test "X$CXX" != "Xno" &&
+    ( (test "X$CXX" = "Xg++" && `g++ -v >/dev/null 2>&1` ) ||
+    (test "X$CXX" != "Xg++"))) ; then
+  ac_ext=cpp
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C++ preprocessor" >&5
+$as_echo_n "checking how to run the C++ preprocessor... " >&6; }
+if test -z "$CXXCPP"; then
+  if ${ac_cv_prog_CXXCPP+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+      # Double quotes because CXXCPP needs to be expanded
+    for CXXCPP in "$CXX -E" "/lib/cpp"
+    do
+      ac_preproc_ok=false
+for ac_cxx_preproc_warn_flag in '' yes
+do
+  # Use a header file that comes with gcc, so configuring glibc
+  # with a fresh cross-compiler works.
+  # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+  # <limits.h> exists even on freestanding compilers.
+  # On the NeXT, cc -E runs the code through the compiler's parser,
+  # not just through cpp. "Syntax error" is here to catch this case.
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+                    Syntax error
+_ACEOF
+if ac_fn_cxx_try_cpp "$LINENO"; then :
+
+else
+  # Broken: fails on valid input.
+continue
+fi
+rm -f conftest.err conftest.i conftest.$ac_ext
+
+  # OK, works on sane cases.  Now check whether nonexistent headers
+  # can be detected and how.
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <ac_nonexistent.h>
+_ACEOF
+if ac_fn_cxx_try_cpp "$LINENO"; then :
+  # Broken: success on invalid input.
+continue
+else
+  # Passes both tests.
+ac_preproc_ok=:
+break
+fi
+rm -f conftest.err conftest.i conftest.$ac_ext
+
+done
+# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
+rm -f conftest.i conftest.err conftest.$ac_ext
+if $ac_preproc_ok; then :
+  break
+fi
+
+    done
+    ac_cv_prog_CXXCPP=$CXXCPP
+
+fi
+  CXXCPP=$ac_cv_prog_CXXCPP
+else
+  ac_cv_prog_CXXCPP=$CXXCPP
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $CXXCPP" >&5
+$as_echo "$CXXCPP" >&6; }
+ac_preproc_ok=false
+for ac_cxx_preproc_warn_flag in '' yes
+do
+  # Use a header file that comes with gcc, so configuring glibc
+  # with a fresh cross-compiler works.
+  # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+  # <limits.h> exists even on freestanding compilers.
+  # On the NeXT, cc -E runs the code through the compiler's parser,
+  # not just through cpp. "Syntax error" is here to catch this case.
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+                    Syntax error
+_ACEOF
+if ac_fn_cxx_try_cpp "$LINENO"; then :
+
+else
+  # Broken: fails on valid input.
+continue
+fi
+rm -f conftest.err conftest.i conftest.$ac_ext
+
+  # OK, works on sane cases.  Now check whether nonexistent headers
+  # can be detected and how.
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <ac_nonexistent.h>
+_ACEOF
+if ac_fn_cxx_try_cpp "$LINENO"; then :
+  # Broken: success on invalid input.
+continue
+else
+  # Passes both tests.
+ac_preproc_ok=:
+break
+fi
+rm -f conftest.err conftest.i conftest.$ac_ext
+
+done
+# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
+rm -f conftest.i conftest.err conftest.$ac_ext
+if $ac_preproc_ok; then :
+
+else
+  { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "C++ preprocessor \"$CXXCPP\" fails sanity check
+See \`config.log' for more details" "$LINENO" 5; }
+fi
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+else
+  _lt_caught_CXX_error=yes
+fi
+
+ac_ext=cpp
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
+
+archive_cmds_need_lc_CXX=no
+allow_undefined_flag_CXX=
+always_export_symbols_CXX=no
+archive_expsym_cmds_CXX=
+compiler_needs_object_CXX=no
+export_dynamic_flag_spec_CXX=
+hardcode_direct_CXX=no
+hardcode_direct_absolute_CXX=no
+hardcode_libdir_flag_spec_CXX=
+hardcode_libdir_separator_CXX=
+hardcode_minus_L_CXX=no
+hardcode_shlibpath_var_CXX=unsupported
+hardcode_automatic_CXX=no
+inherit_rpath_CXX=no
+module_cmds_CXX=
+module_expsym_cmds_CXX=
+link_all_deplibs_CXX=unknown
+old_archive_cmds_CXX=$old_archive_cmds
+reload_flag_CXX=$reload_flag
+reload_cmds_CXX=$reload_cmds
+no_undefined_flag_CXX=
+whole_archive_flag_spec_CXX=
+enable_shared_with_static_runtimes_CXX=no
+
+# Source file extension for C++ test sources.
+ac_ext=cpp
+
+# Object file extension for compiled C++ test sources.
+objext=o
+objext_CXX=$objext
+
+# No sense in running all these tests if we already determined that
+# the CXX compiler isn't working.  Some variables (like enable_shared)
+# are currently assumed to apply to all compilers on this platform,
+# and will be corrupted by setting them based on a non-working compiler.
+if test "$_lt_caught_CXX_error" != yes; then
+  # Code to be used in simple compile tests
+  lt_simple_compile_test_code="int some_variable = 0;"
+
+  # Code to be used in simple link tests
+  lt_simple_link_test_code='int main(int, char *[]) { return(0); }'
+
+  # ltmain only uses $CC for tagged configurations so make sure $CC is set.
+
+
+
+
+
+
+# If no C compiler was specified, use CC.
+LTCC=${LTCC-"$CC"}
+
+# If no C compiler flags were specified, use CFLAGS.
+LTCFLAGS=${LTCFLAGS-"$CFLAGS"}
+
+# Allow CC to be a program name with arguments.
+compiler=$CC
+
+
+  # save warnings/boilerplate of simple test code
+  ac_outfile=conftest.$ac_objext
+echo "$lt_simple_compile_test_code" >conftest.$ac_ext
+eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err
+_lt_compiler_boilerplate=`cat conftest.err`
+$RM conftest*
+
+  ac_outfile=conftest.$ac_objext
+echo "$lt_simple_link_test_code" >conftest.$ac_ext
+eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err
+_lt_linker_boilerplate=`cat conftest.err`
+$RM -r conftest*
+
+
+  # Allow CC to be a program name with arguments.
+  lt_save_CC=$CC
+  lt_save_CFLAGS=$CFLAGS
+  lt_save_LD=$LD
+  lt_save_GCC=$GCC
+  GCC=$GXX
+  lt_save_with_gnu_ld=$with_gnu_ld
+  lt_save_path_LD=$lt_cv_path_LD
+  if test -n "${lt_cv_prog_gnu_ldcxx+set}"; then
+    lt_cv_prog_gnu_ld=$lt_cv_prog_gnu_ldcxx
+  else
+    $as_unset lt_cv_prog_gnu_ld
+  fi
+  if test -n "${lt_cv_path_LDCXX+set}"; then
+    lt_cv_path_LD=$lt_cv_path_LDCXX
+  else
+    $as_unset lt_cv_path_LD
+  fi
+  test -z "${LDCXX+set}" || LD=$LDCXX
+  CC=${CXX-"c++"}
+  CFLAGS=$CXXFLAGS
+  compiler=$CC
+  compiler_CXX=$CC
+  for cc_temp in $compiler""; do
+  case $cc_temp in
+    compile | *[\\/]compile | ccache | *[\\/]ccache ) ;;
+    distcc | *[\\/]distcc | purify | *[\\/]purify ) ;;
+    \-*) ;;
+    *) break;;
+  esac
+done
+cc_basename=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"`
+
+
+  if test -n "$compiler"; then
+    # We don't want -fno-exception when compiling C++ code, so set the
+    # no_builtin_flag separately
+    if test "$GXX" = yes; then
+      lt_prog_compiler_no_builtin_flag_CXX=' -fno-builtin'
+    else
+      lt_prog_compiler_no_builtin_flag_CXX=
+    fi
+
+    if test "$GXX" = yes; then
+      # Set up default GNU C++ configuration
+
+
+
+# Check whether --with-gnu-ld was given.
+if test "${with_gnu_ld+set}" = set; then :
+  withval=$with_gnu_ld; test "$withval" = no || with_gnu_ld=yes
+else
+  with_gnu_ld=no
+fi
+
+ac_prog=ld
+if test "$GCC" = yes; then
+  # Check if gcc -print-prog-name=ld gives a path.
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ld used by $CC" >&5
+$as_echo_n "checking for ld used by $CC... " >&6; }
+  case $host in
+  *-*-mingw*)
+    # gcc leaves a trailing carriage return which upsets mingw
+    ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;;
+  *)
+    ac_prog=`($CC -print-prog-name=ld) 2>&5` ;;
+  esac
+  case $ac_prog in
+    # Accept absolute paths.
+    [\\/]* | ?:[\\/]*)
+      re_direlt='/[^/][^/]*/\.\./'
+      # Canonicalize the pathname of ld
+      ac_prog=`$ECHO "$ac_prog"| $SED 's%\\\\%/%g'`
+      while $ECHO "$ac_prog" | $GREP "$re_direlt" > /dev/null 2>&1; do
+       ac_prog=`$ECHO $ac_prog| $SED "s%$re_direlt%/%"`
+      done
+      test -z "$LD" && LD="$ac_prog"
+      ;;
+  "")
+    # If it fails, then pretend we aren't using GCC.
+    ac_prog=ld
+    ;;
+  *)
+    # If it is relative, then search for the first ld in PATH.
+    with_gnu_ld=unknown
+    ;;
+  esac
+elif test "$with_gnu_ld" = yes; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU ld" >&5
+$as_echo_n "checking for GNU ld... " >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for non-GNU ld" >&5
+$as_echo_n "checking for non-GNU ld... " >&6; }
+fi
+if ${lt_cv_path_LD+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -z "$LD"; then
+  lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
+  for ac_dir in $PATH; do
+    IFS="$lt_save_ifs"
+    test -z "$ac_dir" && ac_dir=.
+    if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then
+      lt_cv_path_LD="$ac_dir/$ac_prog"
+      # Check to see if the program is GNU ld.  I'd rather use --version,
+      # but apparently some variants of GNU ld only accept -v.
+      # Break only if it was the GNU/non-GNU ld that we prefer.
+      case `"$lt_cv_path_LD" -v 2>&1 </dev/null` in
+      *GNU* | *'with BFD'*)
+       test "$with_gnu_ld" != no && break
+       ;;
+      *)
+       test "$with_gnu_ld" != yes && break
+       ;;
+      esac
+    fi
+  done
+  IFS="$lt_save_ifs"
+else
+  lt_cv_path_LD="$LD" # Let the user override the test with a path.
+fi
+fi
+
+LD="$lt_cv_path_LD"
+if test -n "$LD"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LD" >&5
+$as_echo "$LD" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+test -z "$LD" && as_fn_error $? "no acceptable ld found in \$PATH" "$LINENO" 5
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if the linker ($LD) is GNU ld" >&5
+$as_echo_n "checking if the linker ($LD) is GNU ld... " >&6; }
+if ${lt_cv_prog_gnu_ld+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  # I'd rather use --version here, but apparently some GNU lds only accept -v.
+case `$LD -v 2>&1 </dev/null` in
+*GNU* | *'with BFD'*)
+  lt_cv_prog_gnu_ld=yes
+  ;;
+*)
+  lt_cv_prog_gnu_ld=no
+  ;;
+esac
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_gnu_ld" >&5
+$as_echo "$lt_cv_prog_gnu_ld" >&6; }
+with_gnu_ld=$lt_cv_prog_gnu_ld
+
+
+
+
+
+
+
+      # Check if GNU C++ uses GNU ld as the underlying linker, since the
+      # archiving commands below assume that GNU ld is being used.
+      if test "$with_gnu_ld" = yes; then
+        archive_cmds_CXX='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib'
+        archive_expsym_cmds_CXX='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+
+        hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir'
+        export_dynamic_flag_spec_CXX='${wl}--export-dynamic'
+
+        # If archive_cmds runs LD, not CC, wlarc should be empty
+        # XXX I think wlarc can be eliminated in ltcf-cxx, but I need to
+        #     investigate it a little bit more. (MM)
+        wlarc='${wl}'
+
+        # ancient GNU ld didn't support --whole-archive et. al.
+        if eval "`$CC -print-prog-name=ld` --help 2>&1" |
+         $GREP 'no-whole-archive' > /dev/null; then
+          whole_archive_flag_spec_CXX="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive'
+        else
+          whole_archive_flag_spec_CXX=
+        fi
+      else
+        with_gnu_ld=no
+        wlarc=
+
+        # A generic and very simple default shared library creation
+        # command for GNU C++ for the case where it uses the native
+        # linker, instead of GNU ld.  If possible, this setting should
+        # overridden to take advantage of the native linker features on
+        # the platform it is being used on.
+        archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib'
+      fi
+
+      # Commands to make compiler produce verbose output that lists
+      # what "hidden" libraries, object files and flags are used when
+      # linking a shared library.
+      output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"'
+
+    else
+      GXX=no
+      with_gnu_ld=no
+      wlarc=
+    fi
+
+    # PORTME: fill in a description of your system's C++ link characteristics
+    { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries" >&5
+$as_echo_n "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; }
+    ld_shlibs_CXX=yes
+    case $host_os in
+      aix3*)
+        # FIXME: insert proper C++ library support
+        ld_shlibs_CXX=no
+        ;;
+      aix[4-9]*)
+        if test "$host_cpu" = ia64; then
+          # On IA64, the linker does run time linking by default, so we don't
+          # have to do anything special.
+          aix_use_runtimelinking=no
+          exp_sym_flag='-Bexport'
+          no_entry_flag=""
+        else
+          aix_use_runtimelinking=no
+
+          # Test if we are trying to use run time linking or normal
+          # AIX style linking. If -brtl is somewhere in LDFLAGS, we
+          # need to do runtime linking.
+          case $host_os in aix4.[23]|aix4.[23].*|aix[5-9]*)
+           for ld_flag in $LDFLAGS; do
+             case $ld_flag in
+             *-brtl*)
+               aix_use_runtimelinking=yes
+               break
+               ;;
+             esac
+           done
+           ;;
+          esac
+
+          exp_sym_flag='-bexport'
+          no_entry_flag='-bnoentry'
+        fi
+
+        # When large executables or shared objects are built, AIX ld can
+        # have problems creating the table of contents.  If linking a library
+        # or program results in "error TOC overflow" add -mminimal-toc to
+        # CXXFLAGS/CFLAGS for g++/gcc.  In the cases where that is not
+        # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS.
+
+        archive_cmds_CXX=''
+        hardcode_direct_CXX=yes
+        hardcode_direct_absolute_CXX=yes
+        hardcode_libdir_separator_CXX=':'
+        link_all_deplibs_CXX=yes
+        file_list_spec_CXX='${wl}-f,'
+
+        if test "$GXX" = yes; then
+          case $host_os in aix4.[012]|aix4.[012].*)
+          # We only want to do this on AIX 4.2 and lower, the check
+          # below for broken collect2 doesn't work under 4.3+
+         collect2name=`${CC} -print-prog-name=collect2`
+         if test -f "$collect2name" &&
+            strings "$collect2name" | $GREP resolve_lib_name >/dev/null
+         then
+           # We have reworked collect2
+           :
+         else
+           # We have old collect2
+           hardcode_direct_CXX=unsupported
+           # It fails to find uninstalled libraries when the uninstalled
+           # path is not listed in the libpath.  Setting hardcode_minus_L
+           # to unsupported forces relinking
+           hardcode_minus_L_CXX=yes
+           hardcode_libdir_flag_spec_CXX='-L$libdir'
+           hardcode_libdir_separator_CXX=
+         fi
+          esac
+          shared_flag='-shared'
+         if test "$aix_use_runtimelinking" = yes; then
+           shared_flag="$shared_flag "'${wl}-G'
+         fi
+        else
+          # not using gcc
+          if test "$host_cpu" = ia64; then
+         # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release
+         # chokes on -Wl,-G. The following line is correct:
+         shared_flag='-G'
+          else
+           if test "$aix_use_runtimelinking" = yes; then
+             shared_flag='${wl}-G'
+           else
+             shared_flag='${wl}-bM:SRE'
+           fi
+          fi
+        fi
+
+        export_dynamic_flag_spec_CXX='${wl}-bexpall'
+        # It seems that -bexpall does not export symbols beginning with
+        # underscore (_), so it is better to generate a list of symbols to
+       # export.
+        always_export_symbols_CXX=yes
+        if test "$aix_use_runtimelinking" = yes; then
+          # Warning - without using the other runtime loading flags (-brtl),
+          # -berok will link without error, but may produce a broken library.
+          allow_undefined_flag_CXX='-berok'
+          # Determine the default libpath from the value encoded in an empty
+          # executable.
+          if test "${lt_cv_aix_libpath+set}" = set; then
+  aix_libpath=$lt_cv_aix_libpath
+else
+  if ${lt_cv_aix_libpath__CXX+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_cxx_try_link "$LINENO"; then :
+
+  lt_aix_libpath_sed='
+      /Import File Strings/,/^$/ {
+         /^0/ {
+             s/^0  *\([^ ]*\) *$/\1/
+             p
+         }
+      }'
+  lt_cv_aix_libpath__CXX=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
+  # Check for a 64-bit object if we didn't find anything.
+  if test -z "$lt_cv_aix_libpath__CXX"; then
+    lt_cv_aix_libpath__CXX=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
+  fi
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+  if test -z "$lt_cv_aix_libpath__CXX"; then
+    lt_cv_aix_libpath__CXX="/usr/lib:/lib"
+  fi
+
+fi
+
+  aix_libpath=$lt_cv_aix_libpath__CXX
+fi
+
+          hardcode_libdir_flag_spec_CXX='${wl}-blibpath:$libdir:'"$aix_libpath"
+
+          archive_expsym_cmds_CXX='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then func_echo_all "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag"
+        else
+          if test "$host_cpu" = ia64; then
+           hardcode_libdir_flag_spec_CXX='${wl}-R $libdir:/usr/lib:/lib'
+           allow_undefined_flag_CXX="-z nodefs"
+           archive_expsym_cmds_CXX="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols"
+          else
+           # Determine the default libpath from the value encoded in an
+           # empty executable.
+           if test "${lt_cv_aix_libpath+set}" = set; then
+  aix_libpath=$lt_cv_aix_libpath
+else
+  if ${lt_cv_aix_libpath__CXX+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_cxx_try_link "$LINENO"; then :
+
+  lt_aix_libpath_sed='
+      /Import File Strings/,/^$/ {
+         /^0/ {
+             s/^0  *\([^ ]*\) *$/\1/
+             p
+         }
+      }'
+  lt_cv_aix_libpath__CXX=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
+  # Check for a 64-bit object if we didn't find anything.
+  if test -z "$lt_cv_aix_libpath__CXX"; then
+    lt_cv_aix_libpath__CXX=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
+  fi
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+  if test -z "$lt_cv_aix_libpath__CXX"; then
+    lt_cv_aix_libpath__CXX="/usr/lib:/lib"
+  fi
+
+fi
+
+  aix_libpath=$lt_cv_aix_libpath__CXX
+fi
+
+           hardcode_libdir_flag_spec_CXX='${wl}-blibpath:$libdir:'"$aix_libpath"
+           # Warning - without using the other run time loading flags,
+           # -berok will link without error, but may produce a broken library.
+           no_undefined_flag_CXX=' ${wl}-bernotok'
+           allow_undefined_flag_CXX=' ${wl}-berok'
+           if test "$with_gnu_ld" = yes; then
+             # We only use this code for GNU lds that support --whole-archive.
+             whole_archive_flag_spec_CXX='${wl}--whole-archive$convenience ${wl}--no-whole-archive'
+           else
+             # Exported symbols can be pulled into shared objects from archives
+             whole_archive_flag_spec_CXX='$convenience'
+           fi
+           archive_cmds_need_lc_CXX=yes
+           # This is similar to how AIX traditionally builds its shared
+           # libraries.
+           archive_expsym_cmds_CXX="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname'
+          fi
+        fi
+        ;;
+
+      beos*)
+       if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
+         allow_undefined_flag_CXX=unsupported
+         # Joseph Beckenbach <jrb3@best.com> says some releases of gcc
+         # support --undefined.  This deserves some investigation.  FIXME
+         archive_cmds_CXX='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+       else
+         ld_shlibs_CXX=no
+       fi
+       ;;
+
+      chorus*)
+        case $cc_basename in
+          *)
+         # FIXME: insert proper C++ library support
+         ld_shlibs_CXX=no
+         ;;
+        esac
+        ;;
+
+      cygwin* | mingw* | pw32* | cegcc*)
+       case $GXX,$cc_basename in
+       ,cl* | no,cl*)
+         # Native MSVC
+         # hardcode_libdir_flag_spec is actually meaningless, as there is
+         # no search path for DLLs.
+         hardcode_libdir_flag_spec_CXX=' '
+         allow_undefined_flag_CXX=unsupported
+         always_export_symbols_CXX=yes
+         file_list_spec_CXX='@'
+         # Tell ltmain to make .lib files, not .a files.
+         libext=lib
+         # Tell ltmain to make .dll files, not .so files.
+         shrext_cmds=".dll"
+         # FIXME: Setting linknames here is a bad hack.
+         archive_cmds_CXX='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-dll~linknames='
+         archive_expsym_cmds_CXX='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then
+             $SED -n -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' -e '1\\\!p' < $export_symbols > $output_objdir/$soname.exp;
+           else
+             $SED -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' < $export_symbols > $output_objdir/$soname.exp;
+           fi~
+           $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~
+           linknames='
+         # The linker will not automatically build a static lib if we build a DLL.
+         # _LT_TAGVAR(old_archive_from_new_cmds, CXX)='true'
+         enable_shared_with_static_runtimes_CXX=yes
+         # Don't use ranlib
+         old_postinstall_cmds_CXX='chmod 644 $oldlib'
+         postlink_cmds_CXX='lt_outputfile="@OUTPUT@"~
+           lt_tool_outputfile="@TOOL_OUTPUT@"~
+           case $lt_outputfile in
+             *.exe|*.EXE) ;;
+             *)
+               lt_outputfile="$lt_outputfile.exe"
+               lt_tool_outputfile="$lt_tool_outputfile.exe"
+               ;;
+           esac~
+           func_to_tool_file "$lt_outputfile"~
+           if test "$MANIFEST_TOOL" != ":" && test -f "$lt_outputfile.manifest"; then
+             $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1;
+             $RM "$lt_outputfile.manifest";
+           fi'
+         ;;
+       *)
+         # g++
+         # _LT_TAGVAR(hardcode_libdir_flag_spec, CXX) is actually meaningless,
+         # as there is no search path for DLLs.
+         hardcode_libdir_flag_spec_CXX='-L$libdir'
+         export_dynamic_flag_spec_CXX='${wl}--export-all-symbols'
+         allow_undefined_flag_CXX=unsupported
+         always_export_symbols_CXX=no
+         enable_shared_with_static_runtimes_CXX=yes
+
+         if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then
+           archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
+           # If the export-symbols file already is a .def file (1st line
+           # is EXPORTS), use it as is; otherwise, prepend...
+           archive_expsym_cmds_CXX='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then
+             cp $export_symbols $output_objdir/$soname.def;
+           else
+             echo EXPORTS > $output_objdir/$soname.def;
+             cat $export_symbols >> $output_objdir/$soname.def;
+           fi~
+           $CC -shared -nostdlib $output_objdir/$soname.def $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
+         else
+           ld_shlibs_CXX=no
+         fi
+         ;;
+       esac
+       ;;
+      darwin* | rhapsody*)
+
+
+  archive_cmds_need_lc_CXX=no
+  hardcode_direct_CXX=no
+  hardcode_automatic_CXX=yes
+  hardcode_shlibpath_var_CXX=unsupported
+  if test "$lt_cv_ld_force_load" = "yes"; then
+    whole_archive_flag_spec_CXX='`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience ${wl}-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`'
+
+  else
+    whole_archive_flag_spec_CXX=''
+  fi
+  link_all_deplibs_CXX=yes
+  allow_undefined_flag_CXX="$_lt_dar_allow_undefined"
+  case $cc_basename in
+     ifort*) _lt_dar_can_shared=yes ;;
+     *) _lt_dar_can_shared=$GCC ;;
+  esac
+  if test "$_lt_dar_can_shared" = "yes"; then
+    output_verbose_link_cmd=func_echo_all
+    archive_cmds_CXX="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod${_lt_dsymutil}"
+    module_cmds_CXX="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dsymutil}"
+    archive_expsym_cmds_CXX="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring ${_lt_dar_single_mod}${_lt_dar_export_syms}${_lt_dsymutil}"
+    module_expsym_cmds_CXX="sed -e 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dar_export_syms}${_lt_dsymutil}"
+       if test "$lt_cv_apple_cc_single_mod" != "yes"; then
+      archive_cmds_CXX="\$CC -r -keep_private_externs -nostdlib -o \${lib}-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \${lib}-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring${_lt_dsymutil}"
+      archive_expsym_cmds_CXX="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -r -keep_private_externs -nostdlib -o \${lib}-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \${lib}-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring${_lt_dar_export_syms}${_lt_dsymutil}"
+    fi
+
+  else
+  ld_shlibs_CXX=no
+  fi
+
+       ;;
+
+      dgux*)
+        case $cc_basename in
+          ec++*)
+           # FIXME: insert proper C++ library support
+           ld_shlibs_CXX=no
+           ;;
+          ghcx*)
+           # Green Hills C++ Compiler
+           # FIXME: insert proper C++ library support
+           ld_shlibs_CXX=no
+           ;;
+          *)
+           # FIXME: insert proper C++ library support
+           ld_shlibs_CXX=no
+           ;;
+        esac
+        ;;
+
+      freebsd2.*)
+        # C++ shared libraries reported to be fairly broken before
+       # switch to ELF
+        ld_shlibs_CXX=no
+        ;;
+
+      freebsd-elf*)
+        archive_cmds_need_lc_CXX=no
+        ;;
+
+      freebsd* | dragonfly*)
+        # FreeBSD 3 and later use GNU C++ and GNU ld with standard ELF
+        # conventions
+        ld_shlibs_CXX=yes
+        ;;
+
+      gnu*)
+        ;;
+
+      haiku*)
+        archive_cmds_CXX='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+        link_all_deplibs_CXX=yes
+        ;;
+
+      hpux9*)
+        hardcode_libdir_flag_spec_CXX='${wl}+b ${wl}$libdir'
+        hardcode_libdir_separator_CXX=:
+        export_dynamic_flag_spec_CXX='${wl}-E'
+        hardcode_direct_CXX=yes
+        hardcode_minus_L_CXX=yes # Not in the search PATH,
+                                            # but as the default
+                                            # location of the library.
+
+        case $cc_basename in
+          CC*)
+            # FIXME: insert proper C++ library support
+            ld_shlibs_CXX=no
+            ;;
+          aCC*)
+            archive_cmds_CXX='$RM $output_objdir/$soname~$CC -b ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'
+            # Commands to make compiler produce verbose output that lists
+            # what "hidden" libraries, object files and flags are used when
+            # linking a shared library.
+            #
+            # There doesn't appear to be a way to prevent this compiler from
+            # explicitly linking system object files so we need to strip them
+            # from the output so that they don't get included in the library
+            # dependencies.
+            output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $EGREP "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"'
+            ;;
+          *)
+            if test "$GXX" = yes; then
+              archive_cmds_CXX='$RM $output_objdir/$soname~$CC -shared -nostdlib $pic_flag ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'
+            else
+              # FIXME: insert proper C++ library support
+              ld_shlibs_CXX=no
+            fi
+            ;;
+        esac
+        ;;
+
+      hpux10*|hpux11*)
+        if test $with_gnu_ld = no; then
+         hardcode_libdir_flag_spec_CXX='${wl}+b ${wl}$libdir'
+         hardcode_libdir_separator_CXX=:
+
+          case $host_cpu in
+            hppa*64*|ia64*)
+              ;;
+            *)
+             export_dynamic_flag_spec_CXX='${wl}-E'
+              ;;
+          esac
+        fi
+        case $host_cpu in
+          hppa*64*|ia64*)
+            hardcode_direct_CXX=no
+            hardcode_shlibpath_var_CXX=no
+            ;;
+          *)
+            hardcode_direct_CXX=yes
+            hardcode_direct_absolute_CXX=yes
+            hardcode_minus_L_CXX=yes # Not in the search PATH,
+                                                # but as the default
+                                                # location of the library.
+            ;;
+        esac
+
+        case $cc_basename in
+          CC*)
+           # FIXME: insert proper C++ library support
+           ld_shlibs_CXX=no
+           ;;
+          aCC*)
+           case $host_cpu in
+             hppa*64*)
+               archive_cmds_CXX='$CC -b ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+               ;;
+             ia64*)
+               archive_cmds_CXX='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+               ;;
+             *)
+               archive_cmds_CXX='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+               ;;
+           esac
+           # Commands to make compiler produce verbose output that lists
+           # what "hidden" libraries, object files and flags are used when
+           # linking a shared library.
+           #
+           # There doesn't appear to be a way to prevent this compiler from
+           # explicitly linking system object files so we need to strip them
+           # from the output so that they don't get included in the library
+           # dependencies.
+           output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $GREP "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"'
+           ;;
+          *)
+           if test "$GXX" = yes; then
+             if test $with_gnu_ld = no; then
+               case $host_cpu in
+                 hppa*64*)
+                   archive_cmds_CXX='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+                   ;;
+                 ia64*)
+                   archive_cmds_CXX='$CC -shared -nostdlib $pic_flag ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+                   ;;
+                 *)
+                   archive_cmds_CXX='$CC -shared -nostdlib $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+                   ;;
+               esac
+             fi
+           else
+             # FIXME: insert proper C++ library support
+             ld_shlibs_CXX=no
+           fi
+           ;;
+        esac
+        ;;
+
+      interix[3-9]*)
+       hardcode_direct_CXX=no
+       hardcode_shlibpath_var_CXX=no
+       hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir'
+       export_dynamic_flag_spec_CXX='${wl}-E'
+       # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc.
+       # Instead, shared libraries are loaded at an image base (0x10000000 by
+       # default) and relocated if they conflict, which is a slow very memory
+       # consuming and fragmenting process.  To avoid this, we pick a random,
+       # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link
+       # time.  Moving up from 0x10000000 also allows more sbrk(2) space.
+       archive_cmds_CXX='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
+       archive_expsym_cmds_CXX='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
+       ;;
+      irix5* | irix6*)
+        case $cc_basename in
+          CC*)
+           # SGI C++
+           archive_cmds_CXX='$CC -shared -all -multigot $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib'
+
+           # Archives containing C++ object files must be created using
+           # "CC -ar", where "CC" is the IRIX C++ compiler.  This is
+           # necessary to make sure instantiated templates are included
+           # in the archive.
+           old_archive_cmds_CXX='$CC -ar -WR,-u -o $oldlib $oldobjs'
+           ;;
+          *)
+           if test "$GXX" = yes; then
+             if test "$with_gnu_ld" = no; then
+               archive_cmds_CXX='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+             else
+               archive_cmds_CXX='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` -o $lib'
+             fi
+           fi
+           link_all_deplibs_CXX=yes
+           ;;
+        esac
+        hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir'
+        hardcode_libdir_separator_CXX=:
+        inherit_rpath_CXX=yes
+        ;;
+
+      linux* | k*bsd*-gnu | kopensolaris*-gnu)
+        case $cc_basename in
+          KCC*)
+           # Kuck and Associates, Inc. (KAI) C++ Compiler
+
+           # KCC will only create a shared library if the output file
+           # ends with ".so" (or ".sl" for HP-UX), so rename the library
+           # to its proper name (with version) after linking.
+           archive_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib'
+           archive_expsym_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib ${wl}-retain-symbols-file,$export_symbols; mv \$templib $lib'
+           # Commands to make compiler produce verbose output that lists
+           # what "hidden" libraries, object files and flags are used when
+           # linking a shared library.
+           #
+           # There doesn't appear to be a way to prevent this compiler from
+           # explicitly linking system object files so we need to strip them
+           # from the output so that they don't get included in the library
+           # dependencies.
+           output_verbose_link_cmd='templist=`$CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 | $GREP "ld"`; rm -f libconftest$shared_ext; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"'
+
+           hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir'
+           export_dynamic_flag_spec_CXX='${wl}--export-dynamic'
+
+           # Archives containing C++ object files must be created using
+           # "CC -Bstatic", where "CC" is the KAI C++ compiler.
+           old_archive_cmds_CXX='$CC -Bstatic -o $oldlib $oldobjs'
+           ;;
+         icpc* | ecpc* )
+           # Intel C++
+           with_gnu_ld=yes
+           # version 8.0 and above of icpc choke on multiply defined symbols
+           # if we add $predep_objects and $postdep_objects, however 7.1 and
+           # earlier do not add the objects themselves.
+           case `$CC -V 2>&1` in
+             *"Version 7."*)
+               archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib'
+               archive_expsym_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+               ;;
+             *)  # Version 8.0 or newer
+               tmp_idyn=
+               case $host_cpu in
+                 ia64*) tmp_idyn=' -i_dynamic';;
+               esac
+               archive_cmds_CXX='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+               archive_expsym_cmds_CXX='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+               ;;
+           esac
+           archive_cmds_need_lc_CXX=no
+           hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir'
+           export_dynamic_flag_spec_CXX='${wl}--export-dynamic'
+           whole_archive_flag_spec_CXX='${wl}--whole-archive$convenience ${wl}--no-whole-archive'
+           ;;
+          pgCC* | pgcpp*)
+            # Portland Group C++ compiler
+           case `$CC -V` in
+           *pgCC\ [1-5].* | *pgcpp\ [1-5].*)
+             prelink_cmds_CXX='tpldir=Template.dir~
+               rm -rf $tpldir~
+               $CC --prelink_objects --instantiation_dir $tpldir $objs $libobjs $compile_deplibs~
+               compile_command="$compile_command `find $tpldir -name \*.o | sort | $NL2SP`"'
+             old_archive_cmds_CXX='tpldir=Template.dir~
+               rm -rf $tpldir~
+               $CC --prelink_objects --instantiation_dir $tpldir $oldobjs$old_deplibs~
+               $AR $AR_FLAGS $oldlib$oldobjs$old_deplibs `find $tpldir -name \*.o | sort | $NL2SP`~
+               $RANLIB $oldlib'
+             archive_cmds_CXX='tpldir=Template.dir~
+               rm -rf $tpldir~
+               $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~
+               $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib'
+             archive_expsym_cmds_CXX='tpldir=Template.dir~
+               rm -rf $tpldir~
+               $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~
+               $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib'
+             ;;
+           *) # Version 6 and above use weak symbols
+             archive_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib'
+             archive_expsym_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib'
+             ;;
+           esac
+
+           hardcode_libdir_flag_spec_CXX='${wl}--rpath ${wl}$libdir'
+           export_dynamic_flag_spec_CXX='${wl}--export-dynamic'
+           whole_archive_flag_spec_CXX='${wl}--whole-archive`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive'
+            ;;
+         cxx*)
+           # Compaq C++
+           archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib'
+           archive_expsym_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname  -o $lib ${wl}-retain-symbols-file $wl$export_symbols'
+
+           runpath_var=LD_RUN_PATH
+           hardcode_libdir_flag_spec_CXX='-rpath $libdir'
+           hardcode_libdir_separator_CXX=:
+
+           # Commands to make compiler produce verbose output that lists
+           # what "hidden" libraries, object files and flags are used when
+           # linking a shared library.
+           #
+           # There doesn't appear to be a way to prevent this compiler from
+           # explicitly linking system object files so we need to strip them
+           # from the output so that they don't get included in the library
+           # dependencies.
+           output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld .*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "X$list" | $Xsed'
+           ;;
+         xl* | mpixl* | bgxl*)
+           # IBM XL 8.0 on PPC, with GNU ld
+           hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir'
+           export_dynamic_flag_spec_CXX='${wl}--export-dynamic'
+           archive_cmds_CXX='$CC -qmkshrobj $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+           if test "x$supports_anon_versioning" = xyes; then
+             archive_expsym_cmds_CXX='echo "{ global:" > $output_objdir/$libname.ver~
+               cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~
+               echo "local: *; };" >> $output_objdir/$libname.ver~
+               $CC -qmkshrobj $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib'
+           fi
+           ;;
+         *)
+           case `$CC -V 2>&1 | sed 5q` in
+           *Sun\ C*)
+             # Sun C++ 5.9
+             no_undefined_flag_CXX=' -zdefs'
+             archive_cmds_CXX='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+             archive_expsym_cmds_CXX='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file ${wl}$export_symbols'
+             hardcode_libdir_flag_spec_CXX='-R$libdir'
+             whole_archive_flag_spec_CXX='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive'
+             compiler_needs_object_CXX=yes
+
+             # Not sure whether something based on
+             # $CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1
+             # would be better.
+             output_verbose_link_cmd='func_echo_all'
+
+             # Archives containing C++ object files must be created using
+             # "CC -xar", where "CC" is the Sun C++ compiler.  This is
+             # necessary to make sure instantiated templates are included
+             # in the archive.
+             old_archive_cmds_CXX='$CC -xar -o $oldlib $oldobjs'
+             ;;
+           esac
+           ;;
+       esac
+       ;;
+
+      lynxos*)
+        # FIXME: insert proper C++ library support
+       ld_shlibs_CXX=no
+       ;;
+
+      m88k*)
+        # FIXME: insert proper C++ library support
+        ld_shlibs_CXX=no
+       ;;
+
+      mvs*)
+        case $cc_basename in
+          cxx*)
+           # FIXME: insert proper C++ library support
+           ld_shlibs_CXX=no
+           ;;
+         *)
+           # FIXME: insert proper C++ library support
+           ld_shlibs_CXX=no
+           ;;
+       esac
+       ;;
+
+      netbsd*)
+        if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
+         archive_cmds_CXX='$LD -Bshareable  -o $lib $predep_objects $libobjs $deplibs $postdep_objects $linker_flags'
+         wlarc=
+         hardcode_libdir_flag_spec_CXX='-R$libdir'
+         hardcode_direct_CXX=yes
+         hardcode_shlibpath_var_CXX=no
+       fi
+       # Workaround some broken pre-1.5 toolchains
+       output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP conftest.$objext | $SED -e "s:-lgcc -lc -lgcc::"'
+       ;;
+
+      *nto* | *qnx*)
+        ld_shlibs_CXX=yes
+       ;;
+
+      openbsd2*)
+        # C++ shared libraries are fairly broken
+       ld_shlibs_CXX=no
+       ;;
+
+      openbsd*)
+       if test -f /usr/libexec/ld.so; then
+         hardcode_direct_CXX=yes
+         hardcode_shlibpath_var_CXX=no
+         hardcode_direct_absolute_CXX=yes
+         archive_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib'
+         hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir'
+         if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
+           archive_expsym_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file,$export_symbols -o $lib'
+           export_dynamic_flag_spec_CXX='${wl}-E'
+           whole_archive_flag_spec_CXX="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive'
+         fi
+         output_verbose_link_cmd=func_echo_all
+       else
+         ld_shlibs_CXX=no
+       fi
+       ;;
+
+      osf3* | osf4* | osf5*)
+        case $cc_basename in
+          KCC*)
+           # Kuck and Associates, Inc. (KAI) C++ Compiler
+
+           # KCC will only create a shared library if the output file
+           # ends with ".so" (or ".sl" for HP-UX), so rename the library
+           # to its proper name (with version) after linking.
+           archive_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo "$lib" | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib'
+
+           hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir'
+           hardcode_libdir_separator_CXX=:
+
+           # Archives containing C++ object files must be created using
+           # the KAI C++ compiler.
+           case $host in
+             osf3*) old_archive_cmds_CXX='$CC -Bstatic -o $oldlib $oldobjs' ;;
+             *) old_archive_cmds_CXX='$CC -o $oldlib $oldobjs' ;;
+           esac
+           ;;
+          RCC*)
+           # Rational C++ 2.4.1
+           # FIXME: insert proper C++ library support
+           ld_shlibs_CXX=no
+           ;;
+          cxx*)
+           case $host in
+             osf3*)
+               allow_undefined_flag_CXX=' ${wl}-expect_unresolved ${wl}\*'
+               archive_cmds_CXX='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $soname `test -n "$verstring" && func_echo_all "${wl}-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib'
+               hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir'
+               ;;
+             *)
+               allow_undefined_flag_CXX=' -expect_unresolved \*'
+               archive_cmds_CXX='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib'
+               archive_expsym_cmds_CXX='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done~
+                 echo "-hidden">> $lib.exp~
+                 $CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname ${wl}-input ${wl}$lib.exp  `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib~
+                 $RM $lib.exp'
+               hardcode_libdir_flag_spec_CXX='-rpath $libdir'
+               ;;
+           esac
+
+           hardcode_libdir_separator_CXX=:
+
+           # Commands to make compiler produce verbose output that lists
+           # what "hidden" libraries, object files and flags are used when
+           # linking a shared library.
+           #
+           # There doesn't appear to be a way to prevent this compiler from
+           # explicitly linking system object files so we need to strip them
+           # from the output so that they don't get included in the library
+           # dependencies.
+           output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld" | $GREP -v "ld:"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"'
+           ;;
+         *)
+           if test "$GXX" = yes && test "$with_gnu_ld" = no; then
+             allow_undefined_flag_CXX=' ${wl}-expect_unresolved ${wl}\*'
+             case $host in
+               osf3*)
+                 archive_cmds_CXX='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+                 ;;
+               *)
+                 archive_cmds_CXX='$CC -shared $pic_flag -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+                 ;;
+             esac
+
+             hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir'
+             hardcode_libdir_separator_CXX=:
+
+             # Commands to make compiler produce verbose output that lists
+             # what "hidden" libraries, object files and flags are used when
+             # linking a shared library.
+             output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"'
+
+           else
+             # FIXME: insert proper C++ library support
+             ld_shlibs_CXX=no
+           fi
+           ;;
+        esac
+        ;;
+
+      psos*)
+        # FIXME: insert proper C++ library support
+        ld_shlibs_CXX=no
+        ;;
+
+      sunos4*)
+        case $cc_basename in
+          CC*)
+           # Sun C++ 4.x
+           # FIXME: insert proper C++ library support
+           ld_shlibs_CXX=no
+           ;;
+          lcc*)
+           # Lucid
+           # FIXME: insert proper C++ library support
+           ld_shlibs_CXX=no
+           ;;
+          *)
+           # FIXME: insert proper C++ library support
+           ld_shlibs_CXX=no
+           ;;
+        esac
+        ;;
+
+      solaris*)
+        case $cc_basename in
+          CC* | sunCC*)
+           # Sun C++ 4.2, 5.x and Centerline C++
+            archive_cmds_need_lc_CXX=yes
+           no_undefined_flag_CXX=' -zdefs'
+           archive_cmds_CXX='$CC -G${allow_undefined_flag}  -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+           archive_expsym_cmds_CXX='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
+             $CC -G${allow_undefined_flag} ${wl}-M ${wl}$lib.exp -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp'
+
+           hardcode_libdir_flag_spec_CXX='-R$libdir'
+           hardcode_shlibpath_var_CXX=no
+           case $host_os in
+             solaris2.[0-5] | solaris2.[0-5].*) ;;
+             *)
+               # The compiler driver will combine and reorder linker options,
+               # but understands `-z linker_flag'.
+               # Supported since Solaris 2.6 (maybe 2.5.1?)
+               whole_archive_flag_spec_CXX='-z allextract$convenience -z defaultextract'
+               ;;
+           esac
+           link_all_deplibs_CXX=yes
+
+           output_verbose_link_cmd='func_echo_all'
+
+           # Archives containing C++ object files must be created using
+           # "CC -xar", where "CC" is the Sun C++ compiler.  This is
+           # necessary to make sure instantiated templates are included
+           # in the archive.
+           old_archive_cmds_CXX='$CC -xar -o $oldlib $oldobjs'
+           ;;
+          gcx*)
+           # Green Hills C++ Compiler
+           archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib'
+
+           # The C++ compiler must be used to create the archive.
+           old_archive_cmds_CXX='$CC $LDFLAGS -archive -o $oldlib $oldobjs'
+           ;;
+          *)
+           # GNU C++ compiler with Solaris linker
+           if test "$GXX" = yes && test "$with_gnu_ld" = no; then
+             no_undefined_flag_CXX=' ${wl}-z ${wl}defs'
+             if $CC --version | $GREP -v '^2\.7' > /dev/null; then
+               archive_cmds_CXX='$CC -shared $pic_flag -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib'
+               archive_expsym_cmds_CXX='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
+                 $CC -shared $pic_flag -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp'
+
+               # Commands to make compiler produce verbose output that lists
+               # what "hidden" libraries, object files and flags are used when
+               # linking a shared library.
+               output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"'
+             else
+               # g++ 2.7 appears to require `-G' NOT `-shared' on this
+               # platform.
+               archive_cmds_CXX='$CC -G -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib'
+               archive_expsym_cmds_CXX='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
+                 $CC -G -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp'
+
+               # Commands to make compiler produce verbose output that lists
+               # what "hidden" libraries, object files and flags are used when
+               # linking a shared library.
+               output_verbose_link_cmd='$CC -G $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"'
+             fi
+
+             hardcode_libdir_flag_spec_CXX='${wl}-R $wl$libdir'
+             case $host_os in
+               solaris2.[0-5] | solaris2.[0-5].*) ;;
+               *)
+                 whole_archive_flag_spec_CXX='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract'
+                 ;;
+             esac
+           fi
+           ;;
+        esac
+        ;;
+
+    sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7* | sco3.2v5.0.[024]*)
+      no_undefined_flag_CXX='${wl}-z,text'
+      archive_cmds_need_lc_CXX=no
+      hardcode_shlibpath_var_CXX=no
+      runpath_var='LD_RUN_PATH'
+
+      case $cc_basename in
+        CC*)
+         archive_cmds_CXX='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+         archive_expsym_cmds_CXX='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+         ;;
+       *)
+         archive_cmds_CXX='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+         archive_expsym_cmds_CXX='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+         ;;
+      esac
+      ;;
+
+      sysv5* | sco3.2v5* | sco5v6*)
+       # Note: We can NOT use -z defs as we might desire, because we do not
+       # link with -lc, and that would cause any symbols used from libc to
+       # always be unresolved, which means just about no library would
+       # ever link correctly.  If we're not using GNU ld we use -z text
+       # though, which does catch some bad symbols but isn't as heavy-handed
+       # as -z defs.
+       no_undefined_flag_CXX='${wl}-z,text'
+       allow_undefined_flag_CXX='${wl}-z,nodefs'
+       archive_cmds_need_lc_CXX=no
+       hardcode_shlibpath_var_CXX=no
+       hardcode_libdir_flag_spec_CXX='${wl}-R,$libdir'
+       hardcode_libdir_separator_CXX=':'
+       link_all_deplibs_CXX=yes
+       export_dynamic_flag_spec_CXX='${wl}-Bexport'
+       runpath_var='LD_RUN_PATH'
+
+       case $cc_basename in
+          CC*)
+           archive_cmds_CXX='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+           archive_expsym_cmds_CXX='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+           old_archive_cmds_CXX='$CC -Tprelink_objects $oldobjs~
+             '"$old_archive_cmds_CXX"
+           reload_cmds_CXX='$CC -Tprelink_objects $reload_objs~
+             '"$reload_cmds_CXX"
+           ;;
+         *)
+           archive_cmds_CXX='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+           archive_expsym_cmds_CXX='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+           ;;
+       esac
+      ;;
+
+      tandem*)
+        case $cc_basename in
+          NCC*)
+           # NonStop-UX NCC 3.20
+           # FIXME: insert proper C++ library support
+           ld_shlibs_CXX=no
+           ;;
+          *)
+           # FIXME: insert proper C++ library support
+           ld_shlibs_CXX=no
+           ;;
+        esac
+        ;;
+
+      vxworks*)
+        # FIXME: insert proper C++ library support
+        ld_shlibs_CXX=no
+        ;;
+
+      *)
+        # FIXME: insert proper C++ library support
+        ld_shlibs_CXX=no
+        ;;
+    esac
+
+    { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs_CXX" >&5
+$as_echo "$ld_shlibs_CXX" >&6; }
+    test "$ld_shlibs_CXX" = no && can_build_shared=no
+
+    GCC_CXX="$GXX"
+    LD_CXX="$LD"
+
+    ## CAVEAT EMPTOR:
+    ## There is no encapsulation within the following macros, do not change
+    ## the running order or otherwise move them around unless you know exactly
+    ## what you are doing...
+    # Dependencies to place before and after the object being linked:
+predep_objects_CXX=
+postdep_objects_CXX=
+predeps_CXX=
+postdeps_CXX=
+compiler_lib_search_path_CXX=
+
+cat > conftest.$ac_ext <<_LT_EOF
+class Foo
+{
+public:
+  Foo (void) { a = 0; }
+private:
+  int a;
+};
+_LT_EOF
+
+
+_lt_libdeps_save_CFLAGS=$CFLAGS
+case "$CC $CFLAGS " in #(
+*\ -flto*\ *) CFLAGS="$CFLAGS -fno-lto" ;;
+*\ -fwhopr*\ *) CFLAGS="$CFLAGS -fno-whopr" ;;
+*\ -fuse-linker-plugin*\ *) CFLAGS="$CFLAGS -fno-use-linker-plugin" ;;
+esac
+
+if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then
+  # Parse the compiler output and extract the necessary
+  # objects, libraries and library flags.
+
+  # Sentinel used to keep track of whether or not we are before
+  # the conftest object file.
+  pre_test_object_deps_done=no
+
+  for p in `eval "$output_verbose_link_cmd"`; do
+    case ${prev}${p} in
+
+    -L* | -R* | -l*)
+       # Some compilers place space between "-{L,R}" and the path.
+       # Remove the space.
+       if test $p = "-L" ||
+          test $p = "-R"; then
+        prev=$p
+        continue
+       fi
+
+       # Expand the sysroot to ease extracting the directories later.
+       if test -z "$prev"; then
+         case $p in
+         -L*) func_stripname_cnf '-L' '' "$p"; prev=-L; p=$func_stripname_result ;;
+         -R*) func_stripname_cnf '-R' '' "$p"; prev=-R; p=$func_stripname_result ;;
+         -l*) func_stripname_cnf '-l' '' "$p"; prev=-l; p=$func_stripname_result ;;
+         esac
+       fi
+       case $p in
+       =*) func_stripname_cnf '=' '' "$p"; p=$lt_sysroot$func_stripname_result ;;
+       esac
+       if test "$pre_test_object_deps_done" = no; then
+        case ${prev} in
+        -L | -R)
+          # Internal compiler library paths should come after those
+          # provided the user.  The postdeps already come after the
+          # user supplied libs so there is no need to process them.
+          if test -z "$compiler_lib_search_path_CXX"; then
+            compiler_lib_search_path_CXX="${prev}${p}"
+          else
+            compiler_lib_search_path_CXX="${compiler_lib_search_path_CXX} ${prev}${p}"
+          fi
+          ;;
+        # The "-l" case would never come before the object being
+        # linked, so don't bother handling this case.
+        esac
+       else
+        if test -z "$postdeps_CXX"; then
+          postdeps_CXX="${prev}${p}"
+        else
+          postdeps_CXX="${postdeps_CXX} ${prev}${p}"
+        fi
+       fi
+       prev=
+       ;;
+
+    *.lto.$objext) ;; # Ignore GCC LTO objects
+    *.$objext)
+       # This assumes that the test object file only shows up
+       # once in the compiler output.
+       if test "$p" = "conftest.$objext"; then
+        pre_test_object_deps_done=yes
+        continue
+       fi
+
+       if test "$pre_test_object_deps_done" = no; then
+        if test -z "$predep_objects_CXX"; then
+          predep_objects_CXX="$p"
+        else
+          predep_objects_CXX="$predep_objects_CXX $p"
+        fi
+       else
+        if test -z "$postdep_objects_CXX"; then
+          postdep_objects_CXX="$p"
+        else
+          postdep_objects_CXX="$postdep_objects_CXX $p"
+        fi
+       fi
+       ;;
+
+    *) ;; # Ignore the rest.
+
+    esac
+  done
+
+  # Clean up.
+  rm -f a.out a.exe
+else
+  echo "libtool.m4: error: problem compiling CXX test program"
+fi
+
+$RM -f confest.$objext
+CFLAGS=$_lt_libdeps_save_CFLAGS
+
+# PORTME: override above test on systems where it is broken
+case $host_os in
+interix[3-9]*)
+  # Interix 3.5 installs completely hosed .la files for C++, so rather than
+  # hack all around it, let's just trust "g++" to DTRT.
+  predep_objects_CXX=
+  postdep_objects_CXX=
+  postdeps_CXX=
+  ;;
+
+linux*)
+  case `$CC -V 2>&1 | sed 5q` in
+  *Sun\ C*)
+    # Sun C++ 5.9
+
+    # The more standards-conforming stlport4 library is
+    # incompatible with the Cstd library. Avoid specifying
+    # it if it's in CXXFLAGS. Ignore libCrun as
+    # -library=stlport4 depends on it.
+    case " $CXX $CXXFLAGS " in
+    *" -library=stlport4 "*)
+      solaris_use_stlport4=yes
+      ;;
+    esac
+
+    if test "$solaris_use_stlport4" != yes; then
+      postdeps_CXX='-library=Cstd -library=Crun'
+    fi
+    ;;
+  esac
+  ;;
+
+solaris*)
+  case $cc_basename in
+  CC* | sunCC*)
+    # The more standards-conforming stlport4 library is
+    # incompatible with the Cstd library. Avoid specifying
+    # it if it's in CXXFLAGS. Ignore libCrun as
+    # -library=stlport4 depends on it.
+    case " $CXX $CXXFLAGS " in
+    *" -library=stlport4 "*)
+      solaris_use_stlport4=yes
+      ;;
+    esac
+
+    # Adding this requires a known-good setup of shared libraries for
+    # Sun compiler versions before 5.6, else PIC objects from an old
+    # archive will be linked into the output, leading to subtle bugs.
+    if test "$solaris_use_stlport4" != yes; then
+      postdeps_CXX='-library=Cstd -library=Crun'
+    fi
+    ;;
+  esac
+  ;;
+esac
+
+
+case " $postdeps_CXX " in
+*" -lc "*) archive_cmds_need_lc_CXX=no ;;
+esac
+ compiler_lib_search_dirs_CXX=
+if test -n "${compiler_lib_search_path_CXX}"; then
+ compiler_lib_search_dirs_CXX=`echo " ${compiler_lib_search_path_CXX}" | ${SED} -e 's! -L! !g' -e 's!^ !!'`
+fi
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+    lt_prog_compiler_wl_CXX=
+lt_prog_compiler_pic_CXX=
+lt_prog_compiler_static_CXX=
+
+
+  # C++ specific cases for pic, static, wl, etc.
+  if test "$GXX" = yes; then
+    lt_prog_compiler_wl_CXX='-Wl,'
+    lt_prog_compiler_static_CXX='-static'
+
+    case $host_os in
+    aix*)
+      # All AIX code is PIC.
+      if test "$host_cpu" = ia64; then
+       # AIX 5 now supports IA64 processor
+       lt_prog_compiler_static_CXX='-Bstatic'
+      fi
+      ;;
+
+    amigaos*)
+      case $host_cpu in
+      powerpc)
+            # see comment about AmigaOS4 .so support
+            lt_prog_compiler_pic_CXX='-fPIC'
+        ;;
+      m68k)
+            # FIXME: we need at least 68020 code to build shared libraries, but
+            # adding the `-m68020' flag to GCC prevents building anything better,
+            # like `-m68040'.
+            lt_prog_compiler_pic_CXX='-m68020 -resident32 -malways-restore-a4'
+        ;;
+      esac
+      ;;
+
+    beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*)
+      # PIC is the default for these OSes.
+      ;;
+    mingw* | cygwin* | os2* | pw32* | cegcc*)
+      # This hack is so that the source file can tell whether it is being
+      # built for inclusion in a dll (and should export symbols for example).
+      # Although the cygwin gcc ignores -fPIC, still need this for old-style
+      # (--disable-auto-import) libraries
+      lt_prog_compiler_pic_CXX='-DDLL_EXPORT'
+      ;;
+    darwin* | rhapsody*)
+      # PIC is the default on this platform
+      # Common symbols not allowed in MH_DYLIB files
+      lt_prog_compiler_pic_CXX='-fno-common'
+      ;;
+    *djgpp*)
+      # DJGPP does not support shared libraries at all
+      lt_prog_compiler_pic_CXX=
+      ;;
+    haiku*)
+      # PIC is the default for Haiku.
+      # The "-static" flag exists, but is broken.
+      lt_prog_compiler_static_CXX=
+      ;;
+    interix[3-9]*)
+      # Interix 3.x gcc -fpic/-fPIC options generate broken code.
+      # Instead, we relocate shared libraries at runtime.
+      ;;
+    sysv4*MP*)
+      if test -d /usr/nec; then
+       lt_prog_compiler_pic_CXX=-Kconform_pic
+      fi
+      ;;
+    hpux*)
+      # PIC is the default for 64-bit PA HP-UX, but not for 32-bit
+      # PA HP-UX.  On IA64 HP-UX, PIC is the default but the pic flag
+      # sets the default TLS model and affects inlining.
+      case $host_cpu in
+      hppa*64*)
+       ;;
+      *)
+       lt_prog_compiler_pic_CXX='-fPIC'
+       ;;
+      esac
+      ;;
+    *qnx* | *nto*)
+      # QNX uses GNU C++, but need to define -shared option too, otherwise
+      # it will coredump.
+      lt_prog_compiler_pic_CXX='-fPIC -shared'
+      ;;
+    *)
+      lt_prog_compiler_pic_CXX='-fPIC'
+      ;;
+    esac
+  else
+    case $host_os in
+      aix[4-9]*)
+       # All AIX code is PIC.
+       if test "$host_cpu" = ia64; then
+         # AIX 5 now supports IA64 processor
+         lt_prog_compiler_static_CXX='-Bstatic'
+       else
+         lt_prog_compiler_static_CXX='-bnso -bI:/lib/syscalls.exp'
+       fi
+       ;;
+      chorus*)
+       case $cc_basename in
+       cxch68*)
+         # Green Hills C++ Compiler
+         # _LT_TAGVAR(lt_prog_compiler_static, CXX)="--no_auto_instantiation -u __main -u __premain -u _abort -r $COOL_DIR/lib/libOrb.a $MVME_DIR/lib/CC/libC.a $MVME_DIR/lib/classix/libcx.s.a"
+         ;;
+       esac
+       ;;
+      mingw* | cygwin* | os2* | pw32* | cegcc*)
+       # This hack is so that the source file can tell whether it is being
+       # built for inclusion in a dll (and should export symbols for example).
+       lt_prog_compiler_pic_CXX='-DDLL_EXPORT'
+       ;;
+      dgux*)
+       case $cc_basename in
+         ec++*)
+           lt_prog_compiler_pic_CXX='-KPIC'
+           ;;
+         ghcx*)
+           # Green Hills C++ Compiler
+           lt_prog_compiler_pic_CXX='-pic'
+           ;;
+         *)
+           ;;
+       esac
+       ;;
+      freebsd* | dragonfly*)
+       # FreeBSD uses GNU C++
+       ;;
+      hpux9* | hpux10* | hpux11*)
+       case $cc_basename in
+         CC*)
+           lt_prog_compiler_wl_CXX='-Wl,'
+           lt_prog_compiler_static_CXX='${wl}-a ${wl}archive'
+           if test "$host_cpu" != ia64; then
+             lt_prog_compiler_pic_CXX='+Z'
+           fi
+           ;;
+         aCC*)
+           lt_prog_compiler_wl_CXX='-Wl,'
+           lt_prog_compiler_static_CXX='${wl}-a ${wl}archive'
+           case $host_cpu in
+           hppa*64*|ia64*)
+             # +Z the default
+             ;;
+           *)
+             lt_prog_compiler_pic_CXX='+Z'
+             ;;
+           esac
+           ;;
+         *)
+           ;;
+       esac
+       ;;
+      interix*)
+       # This is c89, which is MS Visual C++ (no shared libs)
+       # Anyone wants to do a port?
+       ;;
+      irix5* | irix6* | nonstopux*)
+       case $cc_basename in
+         CC*)
+           lt_prog_compiler_wl_CXX='-Wl,'
+           lt_prog_compiler_static_CXX='-non_shared'
+           # CC pic flag -KPIC is the default.
+           ;;
+         *)
+           ;;
+       esac
+       ;;
+      linux* | k*bsd*-gnu | kopensolaris*-gnu)
+       case $cc_basename in
+         KCC*)
+           # KAI C++ Compiler
+           lt_prog_compiler_wl_CXX='--backend -Wl,'
+           lt_prog_compiler_pic_CXX='-fPIC'
+           ;;
+         ecpc* )
+           # old Intel C++ for x86_64 which still supported -KPIC.
+           lt_prog_compiler_wl_CXX='-Wl,'
+           lt_prog_compiler_pic_CXX='-KPIC'
+           lt_prog_compiler_static_CXX='-static'
+           ;;
+         icpc* )
+           # Intel C++, used to be incompatible with GCC.
+           # ICC 10 doesn't accept -KPIC any more.
+           lt_prog_compiler_wl_CXX='-Wl,'
+           lt_prog_compiler_pic_CXX='-fPIC'
+           lt_prog_compiler_static_CXX='-static'
+           ;;
+         pgCC* | pgcpp*)
+           # Portland Group C++ compiler
+           lt_prog_compiler_wl_CXX='-Wl,'
+           lt_prog_compiler_pic_CXX='-fpic'
+           lt_prog_compiler_static_CXX='-Bstatic'
+           ;;
+         cxx*)
+           # Compaq C++
+           # Make sure the PIC flag is empty.  It appears that all Alpha
+           # Linux and Compaq Tru64 Unix objects are PIC.
+           lt_prog_compiler_pic_CXX=
+           lt_prog_compiler_static_CXX='-non_shared'
+           ;;
+         xlc* | xlC* | bgxl[cC]* | mpixl[cC]*)
+           # IBM XL 8.0, 9.0 on PPC and BlueGene
+           lt_prog_compiler_wl_CXX='-Wl,'
+           lt_prog_compiler_pic_CXX='-qpic'
+           lt_prog_compiler_static_CXX='-qstaticlink'
+           ;;
+         *)
+           case `$CC -V 2>&1 | sed 5q` in
+           *Sun\ C*)
+             # Sun C++ 5.9
+             lt_prog_compiler_pic_CXX='-KPIC'
+             lt_prog_compiler_static_CXX='-Bstatic'
+             lt_prog_compiler_wl_CXX='-Qoption ld '
+             ;;
+           esac
+           ;;
+       esac
+       ;;
+      lynxos*)
+       ;;
+      m88k*)
+       ;;
+      mvs*)
+       case $cc_basename in
+         cxx*)
+           lt_prog_compiler_pic_CXX='-W c,exportall'
+           ;;
+         *)
+           ;;
+       esac
+       ;;
+      netbsd* | netbsdelf*-gnu)
+       ;;
+      *qnx* | *nto*)
+        # QNX uses GNU C++, but need to define -shared option too, otherwise
+        # it will coredump.
+        lt_prog_compiler_pic_CXX='-fPIC -shared'
+        ;;
+      osf3* | osf4* | osf5*)
+       case $cc_basename in
+         KCC*)
+           lt_prog_compiler_wl_CXX='--backend -Wl,'
+           ;;
+         RCC*)
+           # Rational C++ 2.4.1
+           lt_prog_compiler_pic_CXX='-pic'
+           ;;
+         cxx*)
+           # Digital/Compaq C++
+           lt_prog_compiler_wl_CXX='-Wl,'
+           # Make sure the PIC flag is empty.  It appears that all Alpha
+           # Linux and Compaq Tru64 Unix objects are PIC.
+           lt_prog_compiler_pic_CXX=
+           lt_prog_compiler_static_CXX='-non_shared'
+           ;;
+         *)
+           ;;
+       esac
+       ;;
+      psos*)
+       ;;
+      solaris*)
+       case $cc_basename in
+         CC* | sunCC*)
+           # Sun C++ 4.2, 5.x and Centerline C++
+           lt_prog_compiler_pic_CXX='-KPIC'
+           lt_prog_compiler_static_CXX='-Bstatic'
+           lt_prog_compiler_wl_CXX='-Qoption ld '
+           ;;
+         gcx*)
+           # Green Hills C++ Compiler
+           lt_prog_compiler_pic_CXX='-PIC'
+           ;;
+         *)
+           ;;
+       esac
+       ;;
+      sunos4*)
+       case $cc_basename in
+         CC*)
+           # Sun C++ 4.x
+           lt_prog_compiler_pic_CXX='-pic'
+           lt_prog_compiler_static_CXX='-Bstatic'
+           ;;
+         lcc*)
+           # Lucid
+           lt_prog_compiler_pic_CXX='-pic'
+           ;;
+         *)
+           ;;
+       esac
+       ;;
+      sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*)
+       case $cc_basename in
+         CC*)
+           lt_prog_compiler_wl_CXX='-Wl,'
+           lt_prog_compiler_pic_CXX='-KPIC'
+           lt_prog_compiler_static_CXX='-Bstatic'
+           ;;
+       esac
+       ;;
+      tandem*)
+       case $cc_basename in
+         NCC*)
+           # NonStop-UX NCC 3.20
+           lt_prog_compiler_pic_CXX='-KPIC'
+           ;;
+         *)
+           ;;
+       esac
+       ;;
+      vxworks*)
+       ;;
+      *)
+       lt_prog_compiler_can_build_shared_CXX=no
+       ;;
+    esac
+  fi
+
+case $host_os in
+  # For platforms which do not support PIC, -DPIC is meaningless:
+  *djgpp*)
+    lt_prog_compiler_pic_CXX=
+    ;;
+  *)
+    lt_prog_compiler_pic_CXX="$lt_prog_compiler_pic_CXX -DPIC"
+    ;;
+esac
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $compiler option to produce PIC" >&5
+$as_echo_n "checking for $compiler option to produce PIC... " >&6; }
+if ${lt_cv_prog_compiler_pic_CXX+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  lt_cv_prog_compiler_pic_CXX=$lt_prog_compiler_pic_CXX
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_CXX" >&5
+$as_echo "$lt_cv_prog_compiler_pic_CXX" >&6; }
+lt_prog_compiler_pic_CXX=$lt_cv_prog_compiler_pic_CXX
+
+#
+# Check to make sure the PIC flag actually works.
+#
+if test -n "$lt_prog_compiler_pic_CXX"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler PIC flag $lt_prog_compiler_pic_CXX works" >&5
+$as_echo_n "checking if $compiler PIC flag $lt_prog_compiler_pic_CXX works... " >&6; }
+if ${lt_cv_prog_compiler_pic_works_CXX+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  lt_cv_prog_compiler_pic_works_CXX=no
+   ac_outfile=conftest.$ac_objext
+   echo "$lt_simple_compile_test_code" > conftest.$ac_ext
+   lt_compiler_flag="$lt_prog_compiler_pic_CXX -DPIC"
+   # Insert the option either (1) after the last *FLAGS variable, or
+   # (2) before a word containing "conftest.", or (3) at the end.
+   # Note that $ac_compile itself does not contain backslashes and begins
+   # with a dollar sign (not a hyphen), so the echo should work correctly.
+   # The option is referenced via a variable to avoid confusing sed.
+   lt_compile=`echo "$ac_compile" | $SED \
+   -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
+   -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
+   -e 's:$: $lt_compiler_flag:'`
+   (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5)
+   (eval "$lt_compile" 2>conftest.err)
+   ac_status=$?
+   cat conftest.err >&5
+   echo "$as_me:$LINENO: \$? = $ac_status" >&5
+   if (exit $ac_status) && test -s "$ac_outfile"; then
+     # The compiler can only warn and ignore the option if not recognized
+     # So say no if there are warnings other than the usual output.
+     $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp
+     $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
+     if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then
+       lt_cv_prog_compiler_pic_works_CXX=yes
+     fi
+   fi
+   $RM conftest*
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_works_CXX" >&5
+$as_echo "$lt_cv_prog_compiler_pic_works_CXX" >&6; }
+
+if test x"$lt_cv_prog_compiler_pic_works_CXX" = xyes; then
+    case $lt_prog_compiler_pic_CXX in
+     "" | " "*) ;;
+     *) lt_prog_compiler_pic_CXX=" $lt_prog_compiler_pic_CXX" ;;
+     esac
+else
+    lt_prog_compiler_pic_CXX=
+     lt_prog_compiler_can_build_shared_CXX=no
+fi
+
+fi
+
+
+
+
+
+#
+# Check to make sure the static flag actually works.
+#
+wl=$lt_prog_compiler_wl_CXX eval lt_tmp_static_flag=\"$lt_prog_compiler_static_CXX\"
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler static flag $lt_tmp_static_flag works" >&5
+$as_echo_n "checking if $compiler static flag $lt_tmp_static_flag works... " >&6; }
+if ${lt_cv_prog_compiler_static_works_CXX+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  lt_cv_prog_compiler_static_works_CXX=no
+   save_LDFLAGS="$LDFLAGS"
+   LDFLAGS="$LDFLAGS $lt_tmp_static_flag"
+   echo "$lt_simple_link_test_code" > conftest.$ac_ext
+   if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then
+     # The linker can only warn and ignore the option if not recognized
+     # So say no if there are warnings
+     if test -s conftest.err; then
+       # Append any errors to the config.log.
+       cat conftest.err 1>&5
+       $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp
+       $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
+       if diff conftest.exp conftest.er2 >/dev/null; then
+         lt_cv_prog_compiler_static_works_CXX=yes
+       fi
+     else
+       lt_cv_prog_compiler_static_works_CXX=yes
+     fi
+   fi
+   $RM -r conftest*
+   LDFLAGS="$save_LDFLAGS"
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_static_works_CXX" >&5
+$as_echo "$lt_cv_prog_compiler_static_works_CXX" >&6; }
+
+if test x"$lt_cv_prog_compiler_static_works_CXX" = xyes; then
+    :
+else
+    lt_prog_compiler_static_CXX=
+fi
+
+
+
+
+    { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5
+$as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; }
+if ${lt_cv_prog_compiler_c_o_CXX+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  lt_cv_prog_compiler_c_o_CXX=no
+   $RM -r conftest 2>/dev/null
+   mkdir conftest
+   cd conftest
+   mkdir out
+   echo "$lt_simple_compile_test_code" > conftest.$ac_ext
+
+   lt_compiler_flag="-o out/conftest2.$ac_objext"
+   # Insert the option either (1) after the last *FLAGS variable, or
+   # (2) before a word containing "conftest.", or (3) at the end.
+   # Note that $ac_compile itself does not contain backslashes and begins
+   # with a dollar sign (not a hyphen), so the echo should work correctly.
+   lt_compile=`echo "$ac_compile" | $SED \
+   -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
+   -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
+   -e 's:$: $lt_compiler_flag:'`
+   (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5)
+   (eval "$lt_compile" 2>out/conftest.err)
+   ac_status=$?
+   cat out/conftest.err >&5
+   echo "$as_me:$LINENO: \$? = $ac_status" >&5
+   if (exit $ac_status) && test -s out/conftest2.$ac_objext
+   then
+     # The compiler can only warn and ignore the option if not recognized
+     # So say no if there are warnings
+     $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp
+     $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2
+     if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then
+       lt_cv_prog_compiler_c_o_CXX=yes
+     fi
+   fi
+   chmod u+w . 2>&5
+   $RM conftest*
+   # SGI C++ compiler will create directory out/ii_files/ for
+   # template instantiation
+   test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files
+   $RM out/* && rmdir out
+   cd ..
+   $RM -r conftest
+   $RM conftest*
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o_CXX" >&5
+$as_echo "$lt_cv_prog_compiler_c_o_CXX" >&6; }
+
+
+
+    { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5
+$as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; }
+if ${lt_cv_prog_compiler_c_o_CXX+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  lt_cv_prog_compiler_c_o_CXX=no
+   $RM -r conftest 2>/dev/null
+   mkdir conftest
+   cd conftest
+   mkdir out
+   echo "$lt_simple_compile_test_code" > conftest.$ac_ext
+
+   lt_compiler_flag="-o out/conftest2.$ac_objext"
+   # Insert the option either (1) after the last *FLAGS variable, or
+   # (2) before a word containing "conftest.", or (3) at the end.
+   # Note that $ac_compile itself does not contain backslashes and begins
+   # with a dollar sign (not a hyphen), so the echo should work correctly.
+   lt_compile=`echo "$ac_compile" | $SED \
+   -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
+   -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
+   -e 's:$: $lt_compiler_flag:'`
+   (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5)
+   (eval "$lt_compile" 2>out/conftest.err)
+   ac_status=$?
+   cat out/conftest.err >&5
+   echo "$as_me:$LINENO: \$? = $ac_status" >&5
+   if (exit $ac_status) && test -s out/conftest2.$ac_objext
+   then
+     # The compiler can only warn and ignore the option if not recognized
+     # So say no if there are warnings
+     $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp
+     $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2
+     if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then
+       lt_cv_prog_compiler_c_o_CXX=yes
+     fi
+   fi
+   chmod u+w . 2>&5
+   $RM conftest*
+   # SGI C++ compiler will create directory out/ii_files/ for
+   # template instantiation
+   test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files
+   $RM out/* && rmdir out
+   cd ..
+   $RM -r conftest
+   $RM conftest*
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o_CXX" >&5
+$as_echo "$lt_cv_prog_compiler_c_o_CXX" >&6; }
+
+
+
+
+hard_links="nottested"
+if test "$lt_cv_prog_compiler_c_o_CXX" = no && test "$need_locks" != no; then
+  # do not overwrite the value of need_locks provided by the user
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking if we can lock with hard links" >&5
+$as_echo_n "checking if we can lock with hard links... " >&6; }
+  hard_links=yes
+  $RM conftest*
+  ln conftest.a conftest.b 2>/dev/null && hard_links=no
+  touch conftest.a
+  ln conftest.a conftest.b 2>&5 || hard_links=no
+  ln conftest.a conftest.b 2>/dev/null && hard_links=no
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $hard_links" >&5
+$as_echo "$hard_links" >&6; }
+  if test "$hard_links" = no; then
+    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&5
+$as_echo "$as_me: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&2;}
+    need_locks=warn
+  fi
+else
+  need_locks=no
+fi
+
+
+
+    { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries" >&5
+$as_echo_n "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; }
+
+  export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols'
+  exclude_expsyms_CXX='_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*'
+  case $host_os in
+  aix[4-9]*)
+    # If we're using GNU nm, then we don't want the "-C" option.
+    # -C means demangle to AIX nm, but means don't demangle with GNU nm
+    # Also, AIX nm treats weak defined symbols like other global defined
+    # symbols, whereas GNU nm marks them as "W".
+    if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then
+      export_symbols_cmds_CXX='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && (substr(\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols'
+    else
+      export_symbols_cmds_CXX='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && (substr(\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols'
+    fi
+    ;;
+  pw32*)
+    export_symbols_cmds_CXX="$ltdll_cmds"
+    ;;
+  cygwin* | mingw* | cegcc*)
+    case $cc_basename in
+    cl*)
+      exclude_expsyms_CXX='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*'
+      ;;
+    *)
+      export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1 DATA/;s/^.*[ ]__nm__\([^ ]*\)[ ][^ ]*/\1 DATA/;/^I[ ]/d;/^[AITW][ ]/s/.* //'\'' | sort | uniq > $export_symbols'
+      exclude_expsyms_CXX='[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname'
+      ;;
+    esac
+    ;;
+  linux* | k*bsd*-gnu | gnu*)
+    link_all_deplibs_CXX=no
+    ;;
+  *)
+    export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols'
+    ;;
+  esac
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs_CXX" >&5
+$as_echo "$ld_shlibs_CXX" >&6; }
+test "$ld_shlibs_CXX" = no && can_build_shared=no
+
+with_gnu_ld_CXX=$with_gnu_ld
+
+
+
+
+
+
+#
+# Do we need to explicitly link libc?
+#
+case "x$archive_cmds_need_lc_CXX" in
+x|xyes)
+  # Assume -lc should be added
+  archive_cmds_need_lc_CXX=yes
+
+  if test "$enable_shared" = yes && test "$GCC" = yes; then
+    case $archive_cmds_CXX in
+    *'~'*)
+      # FIXME: we may have to deal with multi-command sequences.
+      ;;
+    '$CC '*)
+      # Test whether the compiler implicitly links with -lc since on some
+      # systems, -lgcc has to come before -lc. If gcc already passes -lc
+      # to ld, don't add -lc before -lgcc.
+      { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether -lc should be explicitly linked in" >&5
+$as_echo_n "checking whether -lc should be explicitly linked in... " >&6; }
+if ${lt_cv_archive_cmds_need_lc_CXX+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  $RM conftest*
+       echo "$lt_simple_compile_test_code" > conftest.$ac_ext
+
+       if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; } 2>conftest.err; then
+         soname=conftest
+         lib=conftest
+         libobjs=conftest.$ac_objext
+         deplibs=
+         wl=$lt_prog_compiler_wl_CXX
+         pic_flag=$lt_prog_compiler_pic_CXX
+         compiler_flags=-v
+         linker_flags=-v
+         verstring=
+         output_objdir=.
+         libname=conftest
+         lt_save_allow_undefined_flag=$allow_undefined_flag_CXX
+         allow_undefined_flag_CXX=
+         if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$archive_cmds_CXX 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1\""; } >&5
+  (eval $archive_cmds_CXX 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }
+         then
+           lt_cv_archive_cmds_need_lc_CXX=no
+         else
+           lt_cv_archive_cmds_need_lc_CXX=yes
+         fi
+         allow_undefined_flag_CXX=$lt_save_allow_undefined_flag
+       else
+         cat conftest.err 1>&5
+       fi
+       $RM conftest*
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_archive_cmds_need_lc_CXX" >&5
+$as_echo "$lt_cv_archive_cmds_need_lc_CXX" >&6; }
+      archive_cmds_need_lc_CXX=$lt_cv_archive_cmds_need_lc_CXX
+      ;;
+    esac
+  fi
+  ;;
+esac
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+    { $as_echo "$as_me:${as_lineno-$LINENO}: checking dynamic linker characteristics" >&5
+$as_echo_n "checking dynamic linker characteristics... " >&6; }
+
+library_names_spec=
+libname_spec='lib$name'
+soname_spec=
+shrext_cmds=".so"
+postinstall_cmds=
+postuninstall_cmds=
+finish_cmds=
+finish_eval=
+shlibpath_var=
+shlibpath_overrides_runpath=unknown
+version_type=none
+dynamic_linker="$host_os ld.so"
+sys_lib_dlsearch_path_spec="/lib /usr/lib"
+need_lib_prefix=unknown
+hardcode_into_libs=no
+
+# when you set need_version to no, make sure it does not cause -set_version
+# flags to be left without arguments
+need_version=unknown
+
+case $host_os in
+aix3*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a'
+  shlibpath_var=LIBPATH
+
+  # AIX 3 has no versioning support, so we append a major version to the name.
+  soname_spec='${libname}${release}${shared_ext}$major'
+  ;;
+
+aix[4-9]*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  need_lib_prefix=no
+  need_version=no
+  hardcode_into_libs=yes
+  if test "$host_cpu" = ia64; then
+    # AIX 5 supports IA64
+    library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}'
+    shlibpath_var=LD_LIBRARY_PATH
+  else
+    # With GCC up to 2.95.x, collect2 would create an import file
+    # for dependence libraries.  The import file would start with
+    # the line `#! .'.  This would cause the generated library to
+    # depend on `.', always an invalid library.  This was fixed in
+    # development snapshots of GCC prior to 3.0.
+    case $host_os in
+      aix4 | aix4.[01] | aix4.[01].*)
+      if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)'
+          echo ' yes '
+          echo '#endif'; } | ${CC} -E - | $GREP yes > /dev/null; then
+       :
+      else
+       can_build_shared=no
+      fi
+      ;;
+    esac
+    # AIX (on Power*) has no versioning support, so currently we can not hardcode correct
+    # soname into executable. Probably we can add versioning support to
+    # collect2, so additional links can be useful in future.
+    if test "$aix_use_runtimelinking" = yes; then
+      # If using run time linking (on AIX 4.2 or later) use lib<name>.so
+      # instead of lib<name>.a to let people know that these are not
+      # typical AIX shared libraries.
+      library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+    else
+      # We preserve .a as extension for shared libraries through AIX4.2
+      # and later when we are not doing run time linking.
+      library_names_spec='${libname}${release}.a $libname.a'
+      soname_spec='${libname}${release}${shared_ext}$major'
+    fi
+    shlibpath_var=LIBPATH
+  fi
+  ;;
+
+amigaos*)
+  case $host_cpu in
+  powerpc)
+    # Since July 2007 AmigaOS4 officially supports .so libraries.
+    # When compiling the executable, add -use-dynld -Lsobjs: to the compileline.
+    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+    ;;
+  m68k)
+    library_names_spec='$libname.ixlibrary $libname.a'
+    # Create ${libname}_ixlibrary.a entries in /sys/libs.
+    finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`func_echo_all "$lib" | $SED '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; test $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done'
+    ;;
+  esac
+  ;;
+
+beos*)
+  library_names_spec='${libname}${shared_ext}'
+  dynamic_linker="$host_os ld.so"
+  shlibpath_var=LIBRARY_PATH
+  ;;
+
+bsdi[45]*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir'
+  shlibpath_var=LD_LIBRARY_PATH
+  sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib"
+  sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib"
+  # the default ld.so.conf also contains /usr/contrib/lib and
+  # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow
+  # libtool to hard-code these into programs
+  ;;
+
+cygwin* | mingw* | pw32* | cegcc*)
+  version_type=windows
+  shrext_cmds=".dll"
+  need_version=no
+  need_lib_prefix=no
+
+  case $GCC,$cc_basename in
+  yes,*)
+    # gcc
+    library_names_spec='$libname.dll.a'
+    # DLL is installed to $(libdir)/../bin by postinstall_cmds
+    postinstall_cmds='base_file=`basename \${file}`~
+      dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~
+      dldir=$destdir/`dirname \$dlpath`~
+      test -d \$dldir || mkdir -p \$dldir~
+      $install_prog $dir/$dlname \$dldir/$dlname~
+      chmod a+x \$dldir/$dlname~
+      if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then
+        eval '\''$striplib \$dldir/$dlname'\'' || exit \$?;
+      fi'
+    postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~
+      dlpath=$dir/\$dldll~
+       $RM \$dlpath'
+    shlibpath_overrides_runpath=yes
+
+    case $host_os in
+    cygwin*)
+      # Cygwin DLLs use 'cyg' prefix rather than 'lib'
+      soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}'
+
+      ;;
+    mingw* | cegcc*)
+      # MinGW DLLs use traditional 'lib' prefix
+      soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}'
+      ;;
+    pw32*)
+      # pw32 DLLs use 'pw' prefix rather than 'lib'
+      library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}'
+      ;;
+    esac
+    dynamic_linker='Win32 ld.exe'
+    ;;
+
+  *,cl*)
+    # Native MSVC
+    libname_spec='$name'
+    soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}'
+    library_names_spec='${libname}.dll.lib'
+
+    case $build_os in
+    mingw*)
+      sys_lib_search_path_spec=
+      lt_save_ifs=$IFS
+      IFS=';'
+      for lt_path in $LIB
+      do
+        IFS=$lt_save_ifs
+        # Let DOS variable expansion print the short 8.3 style file name.
+        lt_path=`cd "$lt_path" 2>/dev/null && cmd //C "for %i in (".") do @echo %~si"`
+        sys_lib_search_path_spec="$sys_lib_search_path_spec $lt_path"
+      done
+      IFS=$lt_save_ifs
+      # Convert to MSYS style.
+      sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | sed -e 's|\\\\|/|g' -e 's| \\([a-zA-Z]\\):| /\\1|g' -e 's|^ ||'`
+      ;;
+    cygwin*)
+      # Convert to unix form, then to dos form, then back to unix form
+      # but this time dos style (no spaces!) so that the unix form looks
+      # like /cygdrive/c/PROGRA~1:/cygdr...
+      sys_lib_search_path_spec=`cygpath --path --unix "$LIB"`
+      sys_lib_search_path_spec=`cygpath --path --dos "$sys_lib_search_path_spec" 2>/dev/null`
+      sys_lib_search_path_spec=`cygpath --path --unix "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"`
+      ;;
+    *)
+      sys_lib_search_path_spec="$LIB"
+      if $ECHO "$sys_lib_search_path_spec" | $GREP ';[c-zC-Z]:/' >/dev/null; then
+        # It is most probably a Windows format PATH.
+        sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'`
+      else
+        sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"`
+      fi
+      # FIXME: find the short name or the path components, as spaces are
+      # common. (e.g. "Program Files" -> "PROGRA~1")
+      ;;
+    esac
+
+    # DLL is installed to $(libdir)/../bin by postinstall_cmds
+    postinstall_cmds='base_file=`basename \${file}`~
+      dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~
+      dldir=$destdir/`dirname \$dlpath`~
+      test -d \$dldir || mkdir -p \$dldir~
+      $install_prog $dir/$dlname \$dldir/$dlname'
+    postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~
+      dlpath=$dir/\$dldll~
+       $RM \$dlpath'
+    shlibpath_overrides_runpath=yes
+    dynamic_linker='Win32 link.exe'
+    ;;
+
+  *)
+    # Assume MSVC wrapper
+    library_names_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext} $libname.lib'
+    dynamic_linker='Win32 ld.exe'
+    ;;
+  esac
+  # FIXME: first we should search . and the directory the executable is in
+  shlibpath_var=PATH
+  ;;
+
+darwin* | rhapsody*)
+  dynamic_linker="$host_os dyld"
+  version_type=darwin
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${major}$shared_ext ${libname}$shared_ext'
+  soname_spec='${libname}${release}${major}$shared_ext'
+  shlibpath_overrides_runpath=yes
+  shlibpath_var=DYLD_LIBRARY_PATH
+  shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`'
+
+  sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib'
+  ;;
+
+dgux*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  ;;
+
+freebsd* | dragonfly*)
+  # DragonFly does not have aout.  When/if they implement a new
+  # versioning mechanism, adjust this.
+  if test -x /usr/bin/objformat; then
+    objformat=`/usr/bin/objformat`
+  else
+    case $host_os in
+    freebsd[23].*) objformat=aout ;;
+    *) objformat=elf ;;
+    esac
+  fi
+  version_type=freebsd-$objformat
+  case $version_type in
+    freebsd-elf*)
+      library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}'
+      need_version=no
+      need_lib_prefix=no
+      ;;
+    freebsd-*)
+      library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix'
+      need_version=yes
+      ;;
+  esac
+  shlibpath_var=LD_LIBRARY_PATH
+  case $host_os in
+  freebsd2.*)
+    shlibpath_overrides_runpath=yes
+    ;;
+  freebsd3.[01]* | freebsdelf3.[01]*)
+    shlibpath_overrides_runpath=yes
+    hardcode_into_libs=yes
+    ;;
+  freebsd3.[2-9]* | freebsdelf3.[2-9]* | \
+  freebsd4.[0-5] | freebsdelf4.[0-5] | freebsd4.1.1 | freebsdelf4.1.1)
+    shlibpath_overrides_runpath=no
+    hardcode_into_libs=yes
+    ;;
+  *) # from 4.6 on, and DragonFly
+    shlibpath_overrides_runpath=yes
+    hardcode_into_libs=yes
+    ;;
+  esac
+  ;;
+
+gnu*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=no
+  hardcode_into_libs=yes
+  ;;
+
+haiku*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  need_lib_prefix=no
+  need_version=no
+  dynamic_linker="$host_os runtime_loader"
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  sys_lib_dlsearch_path_spec='/boot/home/config/lib /boot/common/lib /boot/system/lib'
+  hardcode_into_libs=yes
+  ;;
+
+hpux9* | hpux10* | hpux11*)
+  # Give a soname corresponding to the major version so that dld.sl refuses to
+  # link against other versions.
+  version_type=sunos
+  need_lib_prefix=no
+  need_version=no
+  case $host_cpu in
+  ia64*)
+    shrext_cmds='.so'
+    hardcode_into_libs=yes
+    dynamic_linker="$host_os dld.so"
+    shlibpath_var=LD_LIBRARY_PATH
+    shlibpath_overrides_runpath=yes # Unless +noenvvar is specified.
+    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+    soname_spec='${libname}${release}${shared_ext}$major'
+    if test "X$HPUX_IA64_MODE" = X32; then
+      sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib"
+    else
+      sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64"
+    fi
+    sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
+    ;;
+  hppa*64*)
+    shrext_cmds='.sl'
+    hardcode_into_libs=yes
+    dynamic_linker="$host_os dld.sl"
+    shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH
+    shlibpath_overrides_runpath=yes # Unless +noenvvar is specified.
+    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+    soname_spec='${libname}${release}${shared_ext}$major'
+    sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64"
+    sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
+    ;;
+  *)
+    shrext_cmds='.sl'
+    dynamic_linker="$host_os dld.sl"
+    shlibpath_var=SHLIB_PATH
+    shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH
+    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+    soname_spec='${libname}${release}${shared_ext}$major'
+    ;;
+  esac
+  # HP-UX runs *really* slowly unless shared libraries are mode 555, ...
+  postinstall_cmds='chmod 555 $lib'
+  # or fails outright, so override atomically:
+  install_override_mode=555
+  ;;
+
+interix[3-9]*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=no
+  hardcode_into_libs=yes
+  ;;
+
+irix5* | irix6* | nonstopux*)
+  case $host_os in
+    nonstopux*) version_type=nonstopux ;;
+    *)
+       if test "$lt_cv_prog_gnu_ld" = yes; then
+               version_type=linux # correct to gnu/linux during the next big refactor
+       else
+               version_type=irix
+       fi ;;
+  esac
+  need_lib_prefix=no
+  need_version=no
+  soname_spec='${libname}${release}${shared_ext}$major'
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}'
+  case $host_os in
+  irix5* | nonstopux*)
+    libsuff= shlibsuff=
+    ;;
+  *)
+    case $LD in # libtool.m4 will add one of these switches to LD
+    *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ")
+      libsuff= shlibsuff= libmagic=32-bit;;
+    *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ")
+      libsuff=32 shlibsuff=N32 libmagic=N32;;
+    *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ")
+      libsuff=64 shlibsuff=64 libmagic=64-bit;;
+    *) libsuff= shlibsuff= libmagic=never-match;;
+    esac
+    ;;
+  esac
+  shlibpath_var=LD_LIBRARY${shlibsuff}_PATH
+  shlibpath_overrides_runpath=no
+  sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}"
+  sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}"
+  hardcode_into_libs=yes
+  ;;
+
+# No shared lib support for Linux oldld, aout, or coff.
+linux*oldld* | linux*aout* | linux*coff*)
+  dynamic_linker=no
+  ;;
+
+# This must be glibc/ELF.
+linux* | k*bsd*-gnu | kopensolaris*-gnu)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=no
+
+  # Some binutils ld are patched to set DT_RUNPATH
+  if ${lt_cv_shlibpath_overrides_runpath+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  lt_cv_shlibpath_overrides_runpath=no
+    save_LDFLAGS=$LDFLAGS
+    save_libdir=$libdir
+    eval "libdir=/foo; wl=\"$lt_prog_compiler_wl_CXX\"; \
+        LDFLAGS=\"\$LDFLAGS $hardcode_libdir_flag_spec_CXX\""
+    cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_cxx_try_link "$LINENO"; then :
+  if  ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null; then :
+  lt_cv_shlibpath_overrides_runpath=yes
+fi
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+    LDFLAGS=$save_LDFLAGS
+    libdir=$save_libdir
+
+fi
+
+  shlibpath_overrides_runpath=$lt_cv_shlibpath_overrides_runpath
+
+  # This implies no fast_install, which is unacceptable.
+  # Some rework will be needed to allow for fast_install
+  # before this can be enabled.
+  hardcode_into_libs=yes
+
+  # Append ld.so.conf contents to the search path
+  if test -f /etc/ld.so.conf; then
+    lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \$2)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[      ]*hwcap[        ]/d;s/[:,      ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;s/"//g;/^$/d' | tr '\n' ' '`
+    sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra"
+  fi
+
+  # We used to test for /lib/ld.so.1 and disable shared libraries on
+  # powerpc, because MkLinux only supported shared libraries with the
+  # GNU dynamic linker.  Since this was broken with cross compilers,
+  # most powerpc-linux boxes support dynamic linking these days and
+  # people can always --disable-shared, the test was removed, and we
+  # assume the GNU/Linux dynamic linker is in use.
+  dynamic_linker='GNU/Linux ld.so'
+  ;;
+
+netbsdelf*-gnu)
+  version_type=linux
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=no
+  hardcode_into_libs=yes
+  dynamic_linker='NetBSD ld.elf_so'
+  ;;
+
+netbsd*)
+  version_type=sunos
+  need_lib_prefix=no
+  need_version=no
+  if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
+    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
+    finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
+    dynamic_linker='NetBSD (a.out) ld.so'
+  else
+    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
+    soname_spec='${libname}${release}${shared_ext}$major'
+    dynamic_linker='NetBSD ld.elf_so'
+  fi
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  hardcode_into_libs=yes
+  ;;
+
+newsos6)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  ;;
+
+*nto* | *qnx*)
+  version_type=qnx
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=no
+  hardcode_into_libs=yes
+  dynamic_linker='ldqnx.so'
+  ;;
+
+openbsd*)
+  version_type=sunos
+  sys_lib_dlsearch_path_spec="/usr/lib"
+  need_lib_prefix=no
+  # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs.
+  case $host_os in
+    openbsd3.3 | openbsd3.3.*) need_version=yes ;;
+    *)                         need_version=no  ;;
+  esac
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
+  finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
+  shlibpath_var=LD_LIBRARY_PATH
+  if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
+    case $host_os in
+      openbsd2.[89] | openbsd2.[89].*)
+       shlibpath_overrides_runpath=no
+       ;;
+      *)
+       shlibpath_overrides_runpath=yes
+       ;;
+      esac
+  else
+    shlibpath_overrides_runpath=yes
+  fi
+  ;;
+
+os2*)
+  libname_spec='$name'
+  shrext_cmds=".dll"
+  need_lib_prefix=no
+  library_names_spec='$libname${shared_ext} $libname.a'
+  dynamic_linker='OS/2 ld.exe'
+  shlibpath_var=LIBPATH
+  ;;
+
+osf3* | osf4* | osf5*)
+  version_type=osf
+  need_lib_prefix=no
+  need_version=no
+  soname_spec='${libname}${release}${shared_ext}$major'
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  shlibpath_var=LD_LIBRARY_PATH
+  sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib"
+  sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec"
+  ;;
+
+rdos*)
+  dynamic_linker=no
+  ;;
+
+solaris*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  hardcode_into_libs=yes
+  # ldd complains unless libraries are executable
+  postinstall_cmds='chmod +x $lib'
+  ;;
+
+sunos4*)
+  version_type=sunos
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
+  finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  if test "$with_gnu_ld" = yes; then
+    need_lib_prefix=no
+  fi
+  need_version=yes
+  ;;
+
+sysv4 | sysv4.3*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  case $host_vendor in
+    sni)
+      shlibpath_overrides_runpath=no
+      need_lib_prefix=no
+      runpath_var=LD_RUN_PATH
+      ;;
+    siemens)
+      need_lib_prefix=no
+      ;;
+    motorola)
+      need_lib_prefix=no
+      need_version=no
+      shlibpath_overrides_runpath=no
+      sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib'
+      ;;
+  esac
+  ;;
+
+sysv4*MP*)
+  if test -d /usr/nec ;then
+    version_type=linux # correct to gnu/linux during the next big refactor
+    library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}'
+    soname_spec='$libname${shared_ext}.$major'
+    shlibpath_var=LD_LIBRARY_PATH
+  fi
+  ;;
+
+sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*)
+  version_type=freebsd-elf
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  hardcode_into_libs=yes
+  if test "$with_gnu_ld" = yes; then
+    sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib'
+  else
+    sys_lib_search_path_spec='/usr/ccs/lib /usr/lib'
+    case $host_os in
+      sco3.2v5*)
+        sys_lib_search_path_spec="$sys_lib_search_path_spec /lib"
+       ;;
+    esac
+  fi
+  sys_lib_dlsearch_path_spec='/usr/lib'
+  ;;
+
+tpf*)
+  # TPF is a cross-target only.  Preferred cross-host = GNU/Linux.
+  version_type=linux # correct to gnu/linux during the next big refactor
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=no
+  hardcode_into_libs=yes
+  ;;
+
+uts4*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  ;;
+
+*)
+  dynamic_linker=no
+  ;;
+esac
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $dynamic_linker" >&5
+$as_echo "$dynamic_linker" >&6; }
+test "$dynamic_linker" = no && can_build_shared=no
+
+variables_saved_for_relink="PATH $shlibpath_var $runpath_var"
+if test "$GCC" = yes; then
+  variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH"
+fi
+
+if test "${lt_cv_sys_lib_search_path_spec+set}" = set; then
+  sys_lib_search_path_spec="$lt_cv_sys_lib_search_path_spec"
+fi
+if test "${lt_cv_sys_lib_dlsearch_path_spec+set}" = set; then
+  sys_lib_dlsearch_path_spec="$lt_cv_sys_lib_dlsearch_path_spec"
+fi
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+    { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to hardcode library paths into programs" >&5
+$as_echo_n "checking how to hardcode library paths into programs... " >&6; }
+hardcode_action_CXX=
+if test -n "$hardcode_libdir_flag_spec_CXX" ||
+   test -n "$runpath_var_CXX" ||
+   test "X$hardcode_automatic_CXX" = "Xyes" ; then
+
+  # We can hardcode non-existent directories.
+  if test "$hardcode_direct_CXX" != no &&
+     # If the only mechanism to avoid hardcoding is shlibpath_var, we
+     # have to relink, otherwise we might link with an installed library
+     # when we should be linking with a yet-to-be-installed one
+     ## test "$_LT_TAGVAR(hardcode_shlibpath_var, CXX)" != no &&
+     test "$hardcode_minus_L_CXX" != no; then
+    # Linking always hardcodes the temporary library directory.
+    hardcode_action_CXX=relink
+  else
+    # We can link without hardcoding, and we can hardcode nonexisting dirs.
+    hardcode_action_CXX=immediate
+  fi
+else
+  # We cannot hardcode anything, or else we can only hardcode existing
+  # directories.
+  hardcode_action_CXX=unsupported
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $hardcode_action_CXX" >&5
+$as_echo "$hardcode_action_CXX" >&6; }
+
+if test "$hardcode_action_CXX" = relink ||
+   test "$inherit_rpath_CXX" = yes; then
+  # Fast installation is not supported
+  enable_fast_install=no
+elif test "$shlibpath_overrides_runpath" = yes ||
+     test "$enable_shared" = no; then
+  # Fast installation is not necessary
+  enable_fast_install=needless
+fi
+
+
+
+
+
+
+
+  fi # test -n "$compiler"
+
+  CC=$lt_save_CC
+  CFLAGS=$lt_save_CFLAGS
+  LDCXX=$LD
+  LD=$lt_save_LD
+  GCC=$lt_save_GCC
+  with_gnu_ld=$lt_save_with_gnu_ld
+  lt_cv_path_LDCXX=$lt_cv_path_LD
+  lt_cv_path_LD=$lt_save_path_LD
+  lt_cv_prog_gnu_ldcxx=$lt_cv_prog_gnu_ld
+  lt_cv_prog_gnu_ld=$lt_save_with_gnu_ld
+fi # test "$_lt_caught_CXX_error" != yes
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing strerror" >&5
+$as_echo_n "checking for library containing strerror... " >&6; }
+if ${ac_cv_search_strerror+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_func_search_save_LIBS=$LIBS
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+char strerror ();
+int
+main ()
+{
+return strerror ();
+  ;
+  return 0;
+}
+_ACEOF
+for ac_lib in '' cposix; do
+  if test -z "$ac_lib"; then
+    ac_res="none required"
+  else
+    ac_res=-l$ac_lib
+    LIBS="-l$ac_lib  $ac_func_search_save_LIBS"
+  fi
+  if ac_fn_c_try_link "$LINENO"; then :
+  ac_cv_search_strerror=$ac_res
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext
+  if ${ac_cv_search_strerror+:} false; then :
+  break
+fi
+done
+if ${ac_cv_search_strerror+:} false; then :
+
+else
+  ac_cv_search_strerror=no
+fi
+rm conftest.$ac_ext
+LIBS=$ac_func_search_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_strerror" >&5
+$as_echo "$ac_cv_search_strerror" >&6; }
+ac_res=$ac_cv_search_strerror
+if test "$ac_res" != no; then :
+  test "$ac_res" = "none required" || LIBS="$ac_res $LIBS"
+
+fi
+
+   case $ac_cv_prog_cc_stdc in #(
+  no) :
+    ac_cv_prog_cc_c99=no; ac_cv_prog_cc_c89=no ;; #(
+  *) :
+    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C99" >&5
+$as_echo_n "checking for $CC option to accept ISO C99... " >&6; }
+if ${ac_cv_prog_cc_c99+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_cv_prog_cc_c99=no
+ac_save_CC=$CC
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <stdarg.h>
+#include <stdbool.h>
+#include <stdlib.h>
+#include <wchar.h>
+#include <stdio.h>
+
+// Check varargs macros.  These examples are taken from C99 6.10.3.5.
+#define debug(...) fprintf (stderr, __VA_ARGS__)
+#define showlist(...) puts (#__VA_ARGS__)
+#define report(test,...) ((test) ? puts (#test) : printf (__VA_ARGS__))
+static void
+test_varargs_macros (void)
+{
+  int x = 1234;
+  int y = 5678;
+  debug ("Flag");
+  debug ("X = %d\n", x);
+  showlist (The first, second, and third items.);
+  report (x>y, "x is %d but y is %d", x, y);
+}
+
+// Check long long types.
+#define BIG64 18446744073709551615ull
+#define BIG32 4294967295ul
+#define BIG_OK (BIG64 / BIG32 == 4294967297ull && BIG64 % BIG32 == 0)
+#if !BIG_OK
+  your preprocessor is broken;
+#endif
+#if BIG_OK
+#else
+  your preprocessor is broken;
+#endif
+static long long int bignum = -9223372036854775807LL;
+static unsigned long long int ubignum = BIG64;
+
+struct incomplete_array
+{
+  int datasize;
+  double data[];
+};
+
+struct named_init {
+  int number;
+  const wchar_t *name;
+  double average;
+};
+
+typedef const char *ccp;
+
+static inline int
+test_restrict (ccp restrict text)
+{
+  // See if C++-style comments work.
+  // Iterate through items via the restricted pointer.
+  // Also check for declarations in for loops.
+  for (unsigned int i = 0; *(text+i) != '\0'; ++i)
+    continue;
+  return 0;
+}
+
+// Check varargs and va_copy.
+static void
+test_varargs (const char *format, ...)
+{
+  va_list args;
+  va_start (args, format);
+  va_list args_copy;
+  va_copy (args_copy, args);
+
+  const char *str;
+  int number;
+  float fnumber;
+
+  while (*format)
+    {
+      switch (*format++)
+       {
+       case 's': // string
+         str = va_arg (args_copy, const char *);
+         break;
+       case 'd': // int
+         number = va_arg (args_copy, int);
+         break;
+       case 'f': // float
+         fnumber = va_arg (args_copy, double);
+         break;
+       default:
+         break;
+       }
+    }
+  va_end (args_copy);
+  va_end (args);
+}
+
+int
+main ()
+{
+
+  // Check bool.
+  _Bool success = false;
+
+  // Check restrict.
+  if (test_restrict ("String literal") == 0)
+    success = true;
+  char *restrict newvar = "Another string";
+
+  // Check varargs.
+  test_varargs ("s, d' f .", "string", 65, 34.234);
+  test_varargs_macros ();
+
+  // Check flexible array members.
+  struct incomplete_array *ia =
+    malloc (sizeof (struct incomplete_array) + (sizeof (double) * 10));
+  ia->datasize = 10;
+  for (int i = 0; i < ia->datasize; ++i)
+    ia->data[i] = i * 1.234;
+
+  // Check named initializers.
+  struct named_init ni = {
+    .number = 34,
+    .name = L"Test wide string",
+    .average = 543.34343,
+  };
+
+  ni.number = 58;
+
+  int dynamic_array[ni.number];
+  dynamic_array[ni.number - 1] = 543;
+
+  // work around unused variable warnings
+  return (!success || bignum == 0LL || ubignum == 0uLL || newvar[0] == 'x'
+         || dynamic_array[ni.number - 1] != 543);
+
+  ;
+  return 0;
+}
+_ACEOF
+for ac_arg in '' -std=gnu99 -std=c99 -c99 -AC99 -D_STDC_C99= -qlanglvl=extc99
+do
+  CC="$ac_save_CC $ac_arg"
+  if ac_fn_c_try_compile "$LINENO"; then :
+  ac_cv_prog_cc_c99=$ac_arg
+fi
+rm -f core conftest.err conftest.$ac_objext
+  test "x$ac_cv_prog_cc_c99" != "xno" && break
+done
+rm -f conftest.$ac_ext
+CC=$ac_save_CC
+
+fi
+# AC_CACHE_VAL
+case "x$ac_cv_prog_cc_c99" in
+  x)
+    { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5
+$as_echo "none needed" >&6; } ;;
+  xno)
+    { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5
+$as_echo "unsupported" >&6; } ;;
+  *)
+    CC="$CC $ac_cv_prog_cc_c99"
+    { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c99" >&5
+$as_echo "$ac_cv_prog_cc_c99" >&6; } ;;
+esac
+if test "x$ac_cv_prog_cc_c99" != xno; then :
+  ac_cv_prog_cc_stdc=$ac_cv_prog_cc_c99
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5
+$as_echo_n "checking for $CC option to accept ISO C89... " >&6; }
+if ${ac_cv_prog_cc_c89+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_cv_prog_cc_c89=no
+ac_save_CC=$CC
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <stdarg.h>
+#include <stdio.h>
+struct stat;
+/* Most of the following tests are stolen from RCS 5.7's src/conf.sh.  */
+struct buf { int x; };
+FILE * (*rcsopen) (struct buf *, struct stat *, int);
+static char *e (p, i)
+     char **p;
+     int i;
+{
+  return p[i];
+}
+static char *f (char * (*g) (char **, int), char **p, ...)
+{
+  char *s;
+  va_list v;
+  va_start (v,p);
+  s = g (p, va_arg (v,int));
+  va_end (v);
+  return s;
+}
+
+/* OSF 4.0 Compaq cc is some sort of almost-ANSI by default.  It has
+   function prototypes and stuff, but not '\xHH' hex character constants.
+   These don't provoke an error unfortunately, instead are silently treated
+   as 'x'.  The following induces an error, until -std is added to get
+   proper ANSI mode.  Curiously '\x00'!='x' always comes out true, for an
+   array size at least.  It's necessary to write '\x00'==0 to get something
+   that's true only with -std.  */
+int osf4_cc_array ['\x00' == 0 ? 1 : -1];
+
+/* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters
+   inside strings and character constants.  */
+#define FOO(x) 'x'
+int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1];
+
+int test (int i, double x);
+struct s1 {int (*f) (int a);};
+struct s2 {int (*f) (double a);};
+int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int);
+int argc;
+char **argv;
+int
+main ()
+{
+return f (e, argv, 0) != argv[0]  ||  f (e, argv, 1) != argv[1];
+  ;
+  return 0;
+}
+_ACEOF
+for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \
+       -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__"
+do
+  CC="$ac_save_CC $ac_arg"
+  if ac_fn_c_try_compile "$LINENO"; then :
+  ac_cv_prog_cc_c89=$ac_arg
+fi
+rm -f core conftest.err conftest.$ac_objext
+  test "x$ac_cv_prog_cc_c89" != "xno" && break
+done
+rm -f conftest.$ac_ext
+CC=$ac_save_CC
+
+fi
+# AC_CACHE_VAL
+case "x$ac_cv_prog_cc_c89" in
+  x)
+    { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5
+$as_echo "none needed" >&6; } ;;
+  xno)
+    { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5
+$as_echo "unsupported" >&6; } ;;
+  *)
+    CC="$CC $ac_cv_prog_cc_c89"
+    { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5
+$as_echo "$ac_cv_prog_cc_c89" >&6; } ;;
+esac
+if test "x$ac_cv_prog_cc_c89" != xno; then :
+  ac_cv_prog_cc_stdc=$ac_cv_prog_cc_c89
+else
+  ac_cv_prog_cc_stdc=no
+fi
+
+fi
+ ;;
+esac
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO Standard C" >&5
+$as_echo_n "checking for $CC option to accept ISO Standard C... " >&6; }
+  if ${ac_cv_prog_cc_stdc+:} false; then :
+  $as_echo_n "(cached) " >&6
+fi
+
+  case $ac_cv_prog_cc_stdc in #(
+  no) :
+    { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5
+$as_echo "unsupported" >&6; } ;; #(
+  '') :
+    { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5
+$as_echo "none needed" >&6; } ;; #(
+  *) :
+    { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_stdc" >&5
+$as_echo "$ac_cv_prog_cc_stdc" >&6; } ;;
+esac
+
+#if test -z "$CXX" -a "$CC" = "gcc"; then
+#  CXX="gcc"
+#fi
+ac_ext=cpp
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
+if test -z "$CXX"; then
+  if test -n "$CCC"; then
+    CXX=$CCC
+  else
+    if test -n "$ac_tool_prefix"; then
+  for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC
+  do
+    # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args.
+set dummy $ac_tool_prefix$ac_prog; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_CXX+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$CXX"; then
+  ac_cv_prog_CXX="$CXX" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_CXX="$ac_tool_prefix$ac_prog"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+CXX=$ac_cv_prog_CXX
+if test -n "$CXX"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CXX" >&5
+$as_echo "$CXX" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+    test -n "$CXX" && break
+  done
+fi
+if test -z "$CXX"; then
+  ac_ct_CXX=$CXX
+  for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC
+do
+  # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_CXX+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$ac_ct_CXX"; then
+  ac_cv_prog_ac_ct_CXX="$ac_ct_CXX" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_ac_ct_CXX="$ac_prog"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_CXX=$ac_cv_prog_ac_ct_CXX
+if test -n "$ac_ct_CXX"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CXX" >&5
+$as_echo "$ac_ct_CXX" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+  test -n "$ac_ct_CXX" && break
+done
+
+  if test "x$ac_ct_CXX" = x; then
+    CXX="g++"
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    CXX=$ac_ct_CXX
+  fi
+fi
+
+  fi
+fi
+# Provide some information about the compiler.
+$as_echo "$as_me:${as_lineno-$LINENO}: checking for C++ compiler version" >&5
+set X $ac_compile
+ac_compiler=$2
+for ac_option in --version -v -V -qversion; do
+  { { ac_try="$ac_compiler $ac_option >&5"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_compiler $ac_option >&5") 2>conftest.err
+  ac_status=$?
+  if test -s conftest.err; then
+    sed '10a\
+... rest of stderr output deleted ...
+         10q' conftest.err >conftest.er1
+    cat conftest.er1 >&5
+  fi
+  rm -f conftest.er1 conftest.err
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }
+done
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C++ compiler" >&5
+$as_echo_n "checking whether we are using the GNU C++ compiler... " >&6; }
+if ${ac_cv_cxx_compiler_gnu+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+#ifndef __GNUC__
+       choke me
+#endif
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_cxx_try_compile "$LINENO"; then :
+  ac_compiler_gnu=yes
+else
+  ac_compiler_gnu=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+ac_cv_cxx_compiler_gnu=$ac_compiler_gnu
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_cxx_compiler_gnu" >&5
+$as_echo "$ac_cv_cxx_compiler_gnu" >&6; }
+if test $ac_compiler_gnu = yes; then
+  GXX=yes
+else
+  GXX=
+fi
+ac_test_CXXFLAGS=${CXXFLAGS+set}
+ac_save_CXXFLAGS=$CXXFLAGS
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CXX accepts -g" >&5
+$as_echo_n "checking whether $CXX accepts -g... " >&6; }
+if ${ac_cv_prog_cxx_g+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_save_cxx_werror_flag=$ac_cxx_werror_flag
+   ac_cxx_werror_flag=yes
+   ac_cv_prog_cxx_g=no
+   CXXFLAGS="-g"
+   cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_cxx_try_compile "$LINENO"; then :
+  ac_cv_prog_cxx_g=yes
+else
+  CXXFLAGS=""
+      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_cxx_try_compile "$LINENO"; then :
+
+else
+  ac_cxx_werror_flag=$ac_save_cxx_werror_flag
+        CXXFLAGS="-g"
+        cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_cxx_try_compile "$LINENO"; then :
+  ac_cv_prog_cxx_g=yes
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+   ac_cxx_werror_flag=$ac_save_cxx_werror_flag
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cxx_g" >&5
+$as_echo "$ac_cv_prog_cxx_g" >&6; }
+if test "$ac_test_CXXFLAGS" = set; then
+  CXXFLAGS=$ac_save_CXXFLAGS
+elif test $ac_cv_prog_cxx_g = yes; then
+  if test "$GXX" = yes; then
+    CXXFLAGS="-g -O2"
+  else
+    CXXFLAGS="-g"
+  fi
+else
+  if test "$GXX" = yes; then
+    CXXFLAGS="-O2"
+  else
+    CXXFLAGS=
+  fi
+fi
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+depcc="$CXX"  am_compiler_list=
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5
+$as_echo_n "checking dependency style of $depcc... " >&6; }
+if ${am_cv_CXX_dependencies_compiler_type+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then
+  # We make a subdir and do the tests there.  Otherwise we can end up
+  # making bogus files that we don't know about and never remove.  For
+  # instance it was reported that on HP-UX the gcc test will end up
+  # making a dummy file named `D' -- because `-MD' means `put the output
+  # in D'.
+  rm -rf conftest.dir
+  mkdir conftest.dir
+  # Copy depcomp to subdir because otherwise we won't find it if we're
+  # using a relative directory.
+  cp "$am_depcomp" conftest.dir
+  cd conftest.dir
+  # We will build objects and dependencies in a subdirectory because
+  # it helps to detect inapplicable dependency modes.  For instance
+  # both Tru64's cc and ICC support -MD to output dependencies as a
+  # side effect of compilation, but ICC will put the dependencies in
+  # the current directory while Tru64 will put them in the object
+  # directory.
+  mkdir sub
+
+  am_cv_CXX_dependencies_compiler_type=none
+  if test "$am_compiler_list" = ""; then
+     am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp`
+  fi
+  am__universal=false
+  case " $depcc " in #(
+     *\ -arch\ *\ -arch\ *) am__universal=true ;;
+     esac
+
+  for depmode in $am_compiler_list; do
+    # Setup a source with many dependencies, because some compilers
+    # like to wrap large dependency lists on column 80 (with \), and
+    # we should not choose a depcomp mode which is confused by this.
+    #
+    # We need to recreate these files for each test, as the compiler may
+    # overwrite some of them when testing with obscure command lines.
+    # This happens at least with the AIX C compiler.
+    : > sub/conftest.c
+    for i in 1 2 3 4 5 6; do
+      echo '#include "conftst'$i'.h"' >> sub/conftest.c
+      # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with
+      # Solaris 8's {/usr,}/bin/sh.
+      touch sub/conftst$i.h
+    done
+    echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf
+
+    # We check with `-c' and `-o' for the sake of the "dashmstdout"
+    # mode.  It turns out that the SunPro C++ compiler does not properly
+    # handle `-M -o', and we need to detect this.  Also, some Intel
+    # versions had trouble with output in subdirs
+    am__obj=sub/conftest.${OBJEXT-o}
+    am__minus_obj="-o $am__obj"
+    case $depmode in
+    gcc)
+      # This depmode causes a compiler race in universal mode.
+      test "$am__universal" = false || continue
+      ;;
+    nosideeffect)
+      # after this tag, mechanisms are not by side-effect, so they'll
+      # only be used when explicitly requested
+      if test "x$enable_dependency_tracking" = xyes; then
+       continue
+      else
+       break
+      fi
+      ;;
+    msvc7 | msvc7msys | msvisualcpp | msvcmsys)
+      # This compiler won't grok `-c -o', but also, the minuso test has
+      # not run yet.  These depmodes are late enough in the game, and
+      # so weak that their functioning should not be impacted.
+      am__obj=conftest.${OBJEXT-o}
+      am__minus_obj=
+      ;;
+    none) break ;;
+    esac
+    if depmode=$depmode \
+       source=sub/conftest.c object=$am__obj \
+       depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \
+       $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \
+         >/dev/null 2>conftest.err &&
+       grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 &&
+       grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 &&
+       grep $am__obj sub/conftest.Po > /dev/null 2>&1 &&
+       ${MAKE-make} -s -f confmf > /dev/null 2>&1; then
+      # icc doesn't choke on unknown options, it will just issue warnings
+      # or remarks (even with -Werror).  So we grep stderr for any message
+      # that says an option was ignored or not supported.
+      # When given -MP, icc 7.0 and 7.1 complain thusly:
+      #   icc: Command line warning: ignoring option '-M'; no argument required
+      # The diagnosis changed in icc 8.0:
+      #   icc: Command line remark: option '-MP' not supported
+      if (grep 'ignoring option' conftest.err ||
+          grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else
+        am_cv_CXX_dependencies_compiler_type=$depmode
+        break
+      fi
+    fi
+  done
+
+  cd ..
+  rm -rf conftest.dir
+else
+  am_cv_CXX_dependencies_compiler_type=none
+fi
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CXX_dependencies_compiler_type" >&5
+$as_echo "$am_cv_CXX_dependencies_compiler_type" >&6; }
+CXXDEPMODE=depmode=$am_cv_CXX_dependencies_compiler_type
+
+ if
+  test "x$enable_dependency_tracking" != xno \
+  && test "$am_cv_CXX_dependencies_compiler_type" = gcc3; then
+  am__fastdepCXX_TRUE=
+  am__fastdepCXX_FALSE='#'
+else
+  am__fastdepCXX_TRUE='#'
+  am__fastdepCXX_FALSE=
+fi
+
+
+if test "x$GXX" = "xyes"; then
+  case "$host_os" in
+    cygwin* | mingw*)
+    ;;
+    *)
+      case "${CXXFLAGS}" in
+      *-std=*)
+        ;;
+      *)
+        CXXFLAGS="$CXXFLAGS -ansi"
+        ;;
+      esac
+    ;;
+  esac
+fi
+
+
+
+
+
+
+
+
+
+if test "x$ac_cv_env_PKG_CONFIG_set" != "xset"; then
+       if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}pkg-config", so it can be a program name with args.
+set dummy ${ac_tool_prefix}pkg-config; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_path_PKG_CONFIG+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  case $PKG_CONFIG in
+  [\\/]* | ?:[\\/]*)
+  ac_cv_path_PKG_CONFIG="$PKG_CONFIG" # Let the user override the test with a path.
+  ;;
+  *)
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_path_PKG_CONFIG="$as_dir/$ac_word$ac_exec_ext"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+  ;;
+esac
+fi
+PKG_CONFIG=$ac_cv_path_PKG_CONFIG
+if test -n "$PKG_CONFIG"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PKG_CONFIG" >&5
+$as_echo "$PKG_CONFIG" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_path_PKG_CONFIG"; then
+  ac_pt_PKG_CONFIG=$PKG_CONFIG
+  # Extract the first word of "pkg-config", so it can be a program name with args.
+set dummy pkg-config; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_path_ac_pt_PKG_CONFIG+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  case $ac_pt_PKG_CONFIG in
+  [\\/]* | ?:[\\/]*)
+  ac_cv_path_ac_pt_PKG_CONFIG="$ac_pt_PKG_CONFIG" # Let the user override the test with a path.
+  ;;
+  *)
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_path_ac_pt_PKG_CONFIG="$as_dir/$ac_word$ac_exec_ext"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+  ;;
+esac
+fi
+ac_pt_PKG_CONFIG=$ac_cv_path_ac_pt_PKG_CONFIG
+if test -n "$ac_pt_PKG_CONFIG"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_pt_PKG_CONFIG" >&5
+$as_echo "$ac_pt_PKG_CONFIG" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+  if test "x$ac_pt_PKG_CONFIG" = x; then
+    PKG_CONFIG=""
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    PKG_CONFIG=$ac_pt_PKG_CONFIG
+  fi
+else
+  PKG_CONFIG="$ac_cv_path_PKG_CONFIG"
+fi
+
+fi
+if test -n "$PKG_CONFIG"; then
+       _pkg_min_version=0.9.0
+       { $as_echo "$as_me:${as_lineno-$LINENO}: checking pkg-config is at least version $_pkg_min_version" >&5
+$as_echo_n "checking pkg-config is at least version $_pkg_min_version... " >&6; }
+       if $PKG_CONFIG --atleast-pkgconfig-version $_pkg_min_version; then
+               { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+       else
+               { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+               PKG_CONFIG=""
+       fi
+fi
+
+
+cat >>confdefs.h <<_ACEOF
+#define POPPLER_VERSION "0.20.4"
+_ACEOF
+
+
+
+$as_echo "#define OPI_SUPPORT 1" >>confdefs.h
+
+
+$as_echo "#define MULTITHREADED 1" >>confdefs.h
+
+
+$as_echo "#define TEXTOUT_WORD_LIST 1" >>confdefs.h
+
+
+win32_libs=""
+create_shared_lib=""
+auto_import_flags=""
+case "$host_os" in
+  cygwin*)
+    create_shared_lib="-no-undefined"
+  ;;
+  mingw*)
+    os_win32=yes
+    win32_libs="-lgdi32"
+    create_shared_lib="-no-undefined"
+    auto_import_flags="-Wl,--enable-auto-import"
+  ;;
+esac
+
+
+
+
+
+
+
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+acx_pthread_ok=no
+
+# We used to check for pthread.h first, but this fails if pthread.h
+# requires special compiler flags (e.g. on True64 or Sequent).
+# It gets checked for in the link test anyway.
+
+# First of all, check if the user has set any of the PTHREAD_LIBS,
+# etcetera environment variables, and if threads linking works using
+# them:
+if test x"$PTHREAD_LIBS$PTHREAD_CFLAGS" != x; then
+        save_CFLAGS="$CFLAGS"
+        CFLAGS="$CFLAGS $PTHREAD_CFLAGS"
+        save_LIBS="$LIBS"
+        LIBS="$PTHREAD_LIBS $LIBS"
+        { $as_echo "$as_me:${as_lineno-$LINENO}: checking for pthread_join in LIBS=$PTHREAD_LIBS with CFLAGS=$PTHREAD_CFLAGS" >&5
+$as_echo_n "checking for pthread_join in LIBS=$PTHREAD_LIBS with CFLAGS=$PTHREAD_CFLAGS... " >&6; }
+        cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+char pthread_join ();
+int
+main ()
+{
+return pthread_join ();
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  acx_pthread_ok=yes
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+        { $as_echo "$as_me:${as_lineno-$LINENO}: result: $acx_pthread_ok" >&5
+$as_echo "$acx_pthread_ok" >&6; }
+        if test x"$acx_pthread_ok" = xno; then
+                PTHREAD_LIBS=""
+                PTHREAD_CFLAGS=""
+        fi
+        LIBS="$save_LIBS"
+        CFLAGS="$save_CFLAGS"
+fi
+
+# We must check for the threads library under a number of different
+# names; the ordering is very important because some systems
+# (e.g. DEC) have both -lpthread and -lpthreads, where one of the
+# libraries is broken (non-POSIX).
+
+# Create a list of thread flags to try.  Items starting with a "-" are
+# C compiler flags, and other items are library names, except for "none"
+# which indicates that we try without any flags at all, and "pthread-config"
+# which is a program returning the flags for the Pth emulation library.
+
+acx_pthread_flags="pthreads none -Kthread -kthread lthread -pthread -pthreads -mthreads pthread --thread-safe -mt pthread-config"
+
+# The ordering *is* (sometimes) important.  Some notes on the
+# individual items follow:
+
+# pthreads: AIX (must check this before -lpthread)
+# none: in case threads are in libc; should be tried before -Kthread and
+#       other compiler flags to prevent continual compiler warnings
+# -Kthread: Sequent (threads in libc, but -Kthread needed for pthread.h)
+# -kthread: FreeBSD kernel threads (preferred to -pthread since SMP-able)
+# lthread: LinuxThreads port on FreeBSD (also preferred to -pthread)
+# -pthread: Linux/gcc (kernel threads), BSD/gcc (userland threads)
+# -pthreads: Solaris/gcc
+# -mthreads: Mingw32/gcc, Lynx/gcc
+# -mt: Sun Workshop C (may only link SunOS threads [-lthread], but it
+#      doesn't hurt to check since this sometimes defines pthreads too;
+#      also defines -D_REENTRANT)
+#      ... -mt is also the pthreads flag for HP/aCC
+# pthread: Linux, etcetera
+# --thread-safe: KAI C++
+# pthread-config: use pthread-config program (for GNU Pth library)
+
+case "${host_cpu}-${host_os}" in
+        *solaris*)
+
+        # On Solaris (at least, for some versions), libc contains stubbed
+        # (non-functional) versions of the pthreads routines, so link-based
+        # tests will erroneously succeed.  (We need to link with -pthreads/-mt/
+        # -lpthread.)  (The stubs are missing pthread_cleanup_push, or rather
+        # a function called by this macro, so we could check for that, but
+        # who knows whether they'll stub that too in a future libc.)  So,
+        # we'll just look for -pthreads and -lpthread first:
+
+        acx_pthread_flags="-pthreads pthread -mt -pthread $acx_pthread_flags"
+        ;;
+esac
+
+if test x"$acx_pthread_ok" = xno; then
+for flag in $acx_pthread_flags; do
+
+        case $flag in
+                none)
+                { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether pthreads work without any flags" >&5
+$as_echo_n "checking whether pthreads work without any flags... " >&6; }
+                ;;
+
+                -*)
+                { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether pthreads work with $flag" >&5
+$as_echo_n "checking whether pthreads work with $flag... " >&6; }
+                PTHREAD_CFLAGS="$flag"
+                ;;
+
+               pthread-config)
+               # Extract the first word of "pthread-config", so it can be a program name with args.
+set dummy pthread-config; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_acx_pthread_config+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$acx_pthread_config"; then
+  ac_cv_prog_acx_pthread_config="$acx_pthread_config" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_acx_pthread_config="yes"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+  test -z "$ac_cv_prog_acx_pthread_config" && ac_cv_prog_acx_pthread_config="no"
+fi
+fi
+acx_pthread_config=$ac_cv_prog_acx_pthread_config
+if test -n "$acx_pthread_config"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $acx_pthread_config" >&5
+$as_echo "$acx_pthread_config" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+               if test x"$acx_pthread_config" = xno; then continue; fi
+               PTHREAD_CFLAGS="`pthread-config --cflags`"
+               PTHREAD_LIBS="`pthread-config --ldflags` `pthread-config --libs`"
+               ;;
+
+                *)
+                { $as_echo "$as_me:${as_lineno-$LINENO}: checking for the pthreads library -l$flag" >&5
+$as_echo_n "checking for the pthreads library -l$flag... " >&6; }
+                PTHREAD_LIBS="-l$flag"
+                ;;
+        esac
+
+        save_LIBS="$LIBS"
+        save_CFLAGS="$CFLAGS"
+        LIBS="$PTHREAD_LIBS $LIBS"
+        CFLAGS="$CFLAGS $PTHREAD_CFLAGS"
+
+        # Check for various functions.  We must include pthread.h,
+        # since some functions may be macros.  (On the Sequent, we
+        # need a special flag -Kthread to make this header compile.)
+        # We check for pthread_join because it is in -lpthread on IRIX
+        # while pthread_create is in libc.  We check for pthread_attr_init
+        # due to DEC craziness with -lpthreads.  We check for
+        # pthread_cleanup_push because it is one of the few pthread
+        # functions on Solaris that doesn't have a non-functional libc stub.
+        # We try pthread_create on general principles.
+        cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <pthread.h>
+int
+main ()
+{
+pthread_t th; pthread_join(th, 0);
+                     pthread_attr_init(0); pthread_cleanup_push(0, 0);
+                     pthread_create(0,0,0,0); pthread_cleanup_pop(0);
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  acx_pthread_ok=yes
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+
+        LIBS="$save_LIBS"
+        CFLAGS="$save_CFLAGS"
+
+        { $as_echo "$as_me:${as_lineno-$LINENO}: result: $acx_pthread_ok" >&5
+$as_echo "$acx_pthread_ok" >&6; }
+        if test "x$acx_pthread_ok" = xyes; then
+                break;
+        fi
+
+        PTHREAD_LIBS=""
+        PTHREAD_CFLAGS=""
+done
+fi
+
+# Various other checks:
+if test "x$acx_pthread_ok" = xyes; then
+        save_LIBS="$LIBS"
+        LIBS="$PTHREAD_LIBS $LIBS"
+        save_CFLAGS="$CFLAGS"
+        CFLAGS="$CFLAGS $PTHREAD_CFLAGS"
+
+        # Detect AIX lossage: JOINABLE attribute is called UNDETACHED.
+       { $as_echo "$as_me:${as_lineno-$LINENO}: checking for joinable pthread attribute" >&5
+$as_echo_n "checking for joinable pthread attribute... " >&6; }
+       attr_name=unknown
+       for attr in PTHREAD_CREATE_JOINABLE PTHREAD_CREATE_UNDETACHED; do
+           cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <pthread.h>
+int
+main ()
+{
+int attr=$attr; return attr;
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  attr_name=$attr; break
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+       done
+        { $as_echo "$as_me:${as_lineno-$LINENO}: result: $attr_name" >&5
+$as_echo "$attr_name" >&6; }
+        if test "$attr_name" != PTHREAD_CREATE_JOINABLE; then
+
+cat >>confdefs.h <<_ACEOF
+#define PTHREAD_CREATE_JOINABLE $attr_name
+_ACEOF
+
+        fi
+
+        { $as_echo "$as_me:${as_lineno-$LINENO}: checking if more special flags are required for pthreads" >&5
+$as_echo_n "checking if more special flags are required for pthreads... " >&6; }
+        flag=no
+        case "${host_cpu}-${host_os}" in
+            *-aix* | *-freebsd* | *-darwin*) flag="-D_THREAD_SAFE";;
+            *solaris* | *-osf* | *-hpux*) flag="-D_REENTRANT";;
+        esac
+        { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${flag}" >&5
+$as_echo "${flag}" >&6; }
+        if test "x$flag" != xno; then
+            PTHREAD_CFLAGS="$flag $PTHREAD_CFLAGS"
+        fi
+
+        LIBS="$save_LIBS"
+        CFLAGS="$save_CFLAGS"
+
+        # More AIX lossage: must compile with xlc_r or cc_r
+       if test x"$GCC" != xyes; then
+          for ac_prog in xlc_r cc_r
+do
+  # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_PTHREAD_CC+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$PTHREAD_CC"; then
+  ac_cv_prog_PTHREAD_CC="$PTHREAD_CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_PTHREAD_CC="$ac_prog"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+PTHREAD_CC=$ac_cv_prog_PTHREAD_CC
+if test -n "$PTHREAD_CC"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PTHREAD_CC" >&5
+$as_echo "$PTHREAD_CC" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+  test -n "$PTHREAD_CC" && break
+done
+test -n "$PTHREAD_CC" || PTHREAD_CC="${CC}"
+
+        else
+          PTHREAD_CC=$CC
+       fi
+else
+        PTHREAD_CC="$CC"
+fi
+
+
+
+
+
+# Finally, execute ACTION-IF-FOUND/ACTION-IF-NOT-FOUND:
+if test x"$acx_pthread_ok" = xyes; then
+
+$as_echo "#define HAVE_PTHREAD 1" >>confdefs.h
+
+        :
+else
+        acx_pthread_ok=no
+
+fi
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+
+
+# Check whether --enable-xpdf-headers was given.
+if test "${enable_xpdf_headers+set}" = set; then :
+  enableval=$enable_xpdf_headers; enable_xpdf_headers=$enableval
+else
+  enable_xpdf_headers="no"
+fi
+
+ if test x$enable_xpdf_headers = xyes; then
+  ENABLE_XPDF_HEADERS_TRUE=
+  ENABLE_XPDF_HEADERS_FALSE='#'
+else
+  ENABLE_XPDF_HEADERS_TRUE='#'
+  ENABLE_XPDF_HEADERS_FALSE=
+fi
+
+
+# Check whether --enable-single-precision was given.
+if test "${enable_single_precision+set}" = set; then :
+  enableval=$enable_single_precision;
+$as_echo "#define USE_FLOAT 1" >>confdefs.h
+
+fi
+
+
+# Check whether --enable-fixedpoint was given.
+if test "${enable_fixedpoint+set}" = set; then :
+  enableval=$enable_fixedpoint;
+$as_echo "#define USE_FIXEDPOINT 1" >>confdefs.h
+
+fi
+
+
+# Check whether --enable-relocatable was given.
+if test "${enable_relocatable+set}" = set; then :
+  enableval=$enable_relocatable; enable_relocatable=$enableval
+else
+  if test x$os_win32 = xyes; then
+         # default to yes on native Windows.
+         enable_relocatable="yes"
+     else
+         # default to no everywhere else.
+         enable_relocatable="no"
+     fi
+
+
+fi
+
+
+if test x$enable_relocatable = xyes; then
+    if test x$os_win32 = xyes; then
+
+$as_echo "#define ENABLE_RELOCATABLE 1" >>confdefs.h
+
+    else
+        as_fn_error $? "Invalid setting for relocatable, only supported on windows" "$LINENO" 5
+
+    fi
+fi
+
+
+  prefix_NONE=
+  exec_prefix_NONE=
+  test "x$prefix" = xNONE && prefix_NONE=yes && prefix=$ac_default_prefix
+  test "x$exec_prefix" = xNONE && exec_prefix_NONE=yes && exec_prefix=$prefix
+  eval ac_define_dir="\"$"{datarootdir}/poppler"\""
+  eval ac_define_dir="\"$ac_define_dir\""
+  POPPLER_DATADIR="$ac_define_dir"
+
+
+cat >>confdefs.h <<_ACEOF
+#define POPPLER_DATADIR "$ac_define_dir"
+_ACEOF
+
+  test "$prefix_NONE" && prefix=NONE
+  test "$exec_prefix_NONE" && exec_prefix=NONE
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for X" >&5
+$as_echo_n "checking for X... " >&6; }
+
+
+# Check whether --with-x was given.
+if test "${with_x+set}" = set; then :
+  withval=$with_x;
+fi
+
+# $have_x is `yes', `no', `disabled', or empty when we do not yet know.
+if test "x$with_x" = xno; then
+  # The user explicitly disabled X.
+  have_x=disabled
+else
+  case $x_includes,$x_libraries in #(
+    *\'*) as_fn_error $? "cannot use X directory names containing '" "$LINENO" 5;; #(
+    *,NONE | NONE,*) if ${ac_cv_have_x+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  # One or both of the vars are not set, and there is no cached value.
+ac_x_includes=no ac_x_libraries=no
+rm -f -r conftest.dir
+if mkdir conftest.dir; then
+  cd conftest.dir
+  cat >Imakefile <<'_ACEOF'
+incroot:
+       @echo incroot='${INCROOT}'
+usrlibdir:
+       @echo usrlibdir='${USRLIBDIR}'
+libdir:
+       @echo libdir='${LIBDIR}'
+_ACEOF
+  if (export CC; ${XMKMF-xmkmf}) >/dev/null 2>/dev/null && test -f Makefile; then
+    # GNU make sometimes prints "make[1]: Entering ...", which would confuse us.
+    for ac_var in incroot usrlibdir libdir; do
+      eval "ac_im_$ac_var=\`\${MAKE-make} $ac_var 2>/dev/null | sed -n 's/^$ac_var=//p'\`"
+    done
+    # Open Windows xmkmf reportedly sets LIBDIR instead of USRLIBDIR.
+    for ac_extension in a so sl dylib la dll; do
+      if test ! -f "$ac_im_usrlibdir/libX11.$ac_extension" &&
+        test -f "$ac_im_libdir/libX11.$ac_extension"; then
+       ac_im_usrlibdir=$ac_im_libdir; break
+      fi
+    done
+    # Screen out bogus values from the imake configuration.  They are
+    # bogus both because they are the default anyway, and because
+    # using them would break gcc on systems where it needs fixed includes.
+    case $ac_im_incroot in
+       /usr/include) ac_x_includes= ;;
+       *) test -f "$ac_im_incroot/X11/Xos.h" && ac_x_includes=$ac_im_incroot;;
+    esac
+    case $ac_im_usrlibdir in
+       /usr/lib | /usr/lib64 | /lib | /lib64) ;;
+       *) test -d "$ac_im_usrlibdir" && ac_x_libraries=$ac_im_usrlibdir ;;
+    esac
+  fi
+  cd ..
+  rm -f -r conftest.dir
+fi
+
+# Standard set of common directories for X headers.
+# Check X11 before X11Rn because it is often a symlink to the current release.
+ac_x_header_dirs='
+/usr/X11/include
+/usr/X11R7/include
+/usr/X11R6/include
+/usr/X11R5/include
+/usr/X11R4/include
+
+/usr/include/X11
+/usr/include/X11R7
+/usr/include/X11R6
+/usr/include/X11R5
+/usr/include/X11R4
+
+/usr/local/X11/include
+/usr/local/X11R7/include
+/usr/local/X11R6/include
+/usr/local/X11R5/include
+/usr/local/X11R4/include
+
+/usr/local/include/X11
+/usr/local/include/X11R7
+/usr/local/include/X11R6
+/usr/local/include/X11R5
+/usr/local/include/X11R4
+
+/usr/X386/include
+/usr/x386/include
+/usr/XFree86/include/X11
+
+/usr/include
+/usr/local/include
+/usr/unsupported/include
+/usr/athena/include
+/usr/local/x11r5/include
+/usr/lpp/Xamples/include
+
+/usr/openwin/include
+/usr/openwin/share/include'
+
+if test "$ac_x_includes" = no; then
+  # Guess where to find include files, by looking for Xlib.h.
+  # First, try using that file with no special directory specified.
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <X11/Xlib.h>
+_ACEOF
+if ac_fn_c_try_cpp "$LINENO"; then :
+  # We can compile using X headers with no special include directory.
+ac_x_includes=
+else
+  for ac_dir in $ac_x_header_dirs; do
+  if test -r "$ac_dir/X11/Xlib.h"; then
+    ac_x_includes=$ac_dir
+    break
+  fi
+done
+fi
+rm -f conftest.err conftest.i conftest.$ac_ext
+fi # $ac_x_includes = no
+
+if test "$ac_x_libraries" = no; then
+  # Check for the libraries.
+  # See if we find them without any special options.
+  # Don't add to $LIBS permanently.
+  ac_save_LIBS=$LIBS
+  LIBS="-lX11 $LIBS"
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <X11/Xlib.h>
+int
+main ()
+{
+XrmInitialize ()
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  LIBS=$ac_save_LIBS
+# We can link X programs with no special library path.
+ac_x_libraries=
+else
+  LIBS=$ac_save_LIBS
+for ac_dir in `$as_echo "$ac_x_includes $ac_x_header_dirs" | sed s/include/lib/g`
+do
+  # Don't even attempt the hair of trying to link an X program!
+  for ac_extension in a so sl dylib la dll; do
+    if test -r "$ac_dir/libX11.$ac_extension"; then
+      ac_x_libraries=$ac_dir
+      break 2
+    fi
+  done
+done
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+fi # $ac_x_libraries = no
+
+case $ac_x_includes,$ac_x_libraries in #(
+  no,* | *,no | *\'*)
+    # Didn't find X, or a directory has "'" in its name.
+    ac_cv_have_x="have_x=no";; #(
+  *)
+    # Record where we found X for the cache.
+    ac_cv_have_x="have_x=yes\
+       ac_x_includes='$ac_x_includes'\
+       ac_x_libraries='$ac_x_libraries'"
+esac
+fi
+;; #(
+    *) have_x=yes;;
+  esac
+  eval "$ac_cv_have_x"
+fi # $with_x != no
+
+if test "$have_x" != yes; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $have_x" >&5
+$as_echo "$have_x" >&6; }
+  no_x=yes
+else
+  # If each of the values was on the command line, it overrides each guess.
+  test "x$x_includes" = xNONE && x_includes=$ac_x_includes
+  test "x$x_libraries" = xNONE && x_libraries=$ac_x_libraries
+  # Update the cache value to reflect the command line values.
+  ac_cv_have_x="have_x=yes\
+       ac_x_includes='$x_includes'\
+       ac_x_libraries='$x_libraries'"
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: libraries $x_libraries, headers $x_includes" >&5
+$as_echo "libraries $x_libraries, headers $x_includes" >&6; }
+fi
+
+if test "$no_x" = yes; then
+  # Not all programs may use this symbol, but it does not hurt to define it.
+
+$as_echo "#define X_DISPLAY_MISSING 1" >>confdefs.h
+
+  X_CFLAGS= X_PRE_LIBS= X_LIBS= X_EXTRA_LIBS=
+else
+  if test -n "$x_includes"; then
+    X_CFLAGS="$X_CFLAGS -I$x_includes"
+  fi
+
+  # It would also be nice to do this for all -L options, not just this one.
+  if test -n "$x_libraries"; then
+    X_LIBS="$X_LIBS -L$x_libraries"
+    # For Solaris; some versions of Sun CC require a space after -R and
+    # others require no space.  Words are not sufficient . . . .
+    { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether -R must be followed by a space" >&5
+$as_echo_n "checking whether -R must be followed by a space... " >&6; }
+    ac_xsave_LIBS=$LIBS; LIBS="$LIBS -R$x_libraries"
+    ac_xsave_c_werror_flag=$ac_c_werror_flag
+    ac_c_werror_flag=yes
+    cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+       X_LIBS="$X_LIBS -R$x_libraries"
+else
+  LIBS="$ac_xsave_LIBS -R $x_libraries"
+       cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+         X_LIBS="$X_LIBS -R $x_libraries"
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: neither works" >&5
+$as_echo "neither works" >&6; }
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+    ac_c_werror_flag=$ac_xsave_c_werror_flag
+    LIBS=$ac_xsave_LIBS
+  fi
+
+  # Check for system-dependent libraries X programs must link with.
+  # Do this before checking for the system-independent R6 libraries
+  # (-lICE), since we may need -lsocket or whatever for X linking.
+
+  if test "$ISC" = yes; then
+    X_EXTRA_LIBS="$X_EXTRA_LIBS -lnsl_s -linet"
+  else
+    # Martyn Johnson says this is needed for Ultrix, if the X
+    # libraries were built with DECnet support.  And Karl Berry says
+    # the Alpha needs dnet_stub (dnet does not exist).
+    ac_xsave_LIBS="$LIBS"; LIBS="$LIBS $X_LIBS -lX11"
+    cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+char XOpenDisplay ();
+int
+main ()
+{
+return XOpenDisplay ();
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dnet_ntoa in -ldnet" >&5
+$as_echo_n "checking for dnet_ntoa in -ldnet... " >&6; }
+if ${ac_cv_lib_dnet_dnet_ntoa+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_check_lib_save_LIBS=$LIBS
+LIBS="-ldnet  $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+char dnet_ntoa ();
+int
+main ()
+{
+return dnet_ntoa ();
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  ac_cv_lib_dnet_dnet_ntoa=yes
+else
+  ac_cv_lib_dnet_dnet_ntoa=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dnet_dnet_ntoa" >&5
+$as_echo "$ac_cv_lib_dnet_dnet_ntoa" >&6; }
+if test "x$ac_cv_lib_dnet_dnet_ntoa" = xyes; then :
+  X_EXTRA_LIBS="$X_EXTRA_LIBS -ldnet"
+fi
+
+    if test $ac_cv_lib_dnet_dnet_ntoa = no; then
+      { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dnet_ntoa in -ldnet_stub" >&5
+$as_echo_n "checking for dnet_ntoa in -ldnet_stub... " >&6; }
+if ${ac_cv_lib_dnet_stub_dnet_ntoa+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_check_lib_save_LIBS=$LIBS
+LIBS="-ldnet_stub  $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+char dnet_ntoa ();
+int
+main ()
+{
+return dnet_ntoa ();
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  ac_cv_lib_dnet_stub_dnet_ntoa=yes
+else
+  ac_cv_lib_dnet_stub_dnet_ntoa=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dnet_stub_dnet_ntoa" >&5
+$as_echo "$ac_cv_lib_dnet_stub_dnet_ntoa" >&6; }
+if test "x$ac_cv_lib_dnet_stub_dnet_ntoa" = xyes; then :
+  X_EXTRA_LIBS="$X_EXTRA_LIBS -ldnet_stub"
+fi
+
+    fi
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+    LIBS="$ac_xsave_LIBS"
+
+    # msh@cis.ufl.edu says -lnsl (and -lsocket) are needed for his 386/AT,
+    # to get the SysV transport functions.
+    # Chad R. Larson says the Pyramis MIS-ES running DC/OSx (SVR4)
+    # needs -lnsl.
+    # The nsl library prevents programs from opening the X display
+    # on Irix 5.2, according to T.E. Dickey.
+    # The functions gethostbyname, getservbyname, and inet_addr are
+    # in -lbsd on LynxOS 3.0.1/i386, according to Lars Hecking.
+    ac_fn_c_check_func "$LINENO" "gethostbyname" "ac_cv_func_gethostbyname"
+if test "x$ac_cv_func_gethostbyname" = xyes; then :
+
+fi
+
+    if test $ac_cv_func_gethostbyname = no; then
+      { $as_echo "$as_me:${as_lineno-$LINENO}: checking for gethostbyname in -lnsl" >&5
+$as_echo_n "checking for gethostbyname in -lnsl... " >&6; }
+if ${ac_cv_lib_nsl_gethostbyname+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_check_lib_save_LIBS=$LIBS
+LIBS="-lnsl  $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+char gethostbyname ();
+int
+main ()
+{
+return gethostbyname ();
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  ac_cv_lib_nsl_gethostbyname=yes
+else
+  ac_cv_lib_nsl_gethostbyname=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_nsl_gethostbyname" >&5
+$as_echo "$ac_cv_lib_nsl_gethostbyname" >&6; }
+if test "x$ac_cv_lib_nsl_gethostbyname" = xyes; then :
+  X_EXTRA_LIBS="$X_EXTRA_LIBS -lnsl"
+fi
+
+      if test $ac_cv_lib_nsl_gethostbyname = no; then
+       { $as_echo "$as_me:${as_lineno-$LINENO}: checking for gethostbyname in -lbsd" >&5
+$as_echo_n "checking for gethostbyname in -lbsd... " >&6; }
+if ${ac_cv_lib_bsd_gethostbyname+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_check_lib_save_LIBS=$LIBS
+LIBS="-lbsd  $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+char gethostbyname ();
+int
+main ()
+{
+return gethostbyname ();
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  ac_cv_lib_bsd_gethostbyname=yes
+else
+  ac_cv_lib_bsd_gethostbyname=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_bsd_gethostbyname" >&5
+$as_echo "$ac_cv_lib_bsd_gethostbyname" >&6; }
+if test "x$ac_cv_lib_bsd_gethostbyname" = xyes; then :
+  X_EXTRA_LIBS="$X_EXTRA_LIBS -lbsd"
+fi
+
+      fi
+    fi
+
+    # lieder@skyler.mavd.honeywell.com says without -lsocket,
+    # socket/setsockopt and other routines are undefined under SCO ODT
+    # 2.0.  But -lsocket is broken on IRIX 5.2 (and is not necessary
+    # on later versions), says Simon Leinen: it contains gethostby*
+    # variants that don't use the name server (or something).  -lsocket
+    # must be given before -lnsl if both are needed.  We assume that
+    # if connect needs -lnsl, so does gethostbyname.
+    ac_fn_c_check_func "$LINENO" "connect" "ac_cv_func_connect"
+if test "x$ac_cv_func_connect" = xyes; then :
+
+fi
+
+    if test $ac_cv_func_connect = no; then
+      { $as_echo "$as_me:${as_lineno-$LINENO}: checking for connect in -lsocket" >&5
+$as_echo_n "checking for connect in -lsocket... " >&6; }
+if ${ac_cv_lib_socket_connect+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_check_lib_save_LIBS=$LIBS
+LIBS="-lsocket $X_EXTRA_LIBS $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+char connect ();
+int
+main ()
+{
+return connect ();
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  ac_cv_lib_socket_connect=yes
+else
+  ac_cv_lib_socket_connect=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_socket_connect" >&5
+$as_echo "$ac_cv_lib_socket_connect" >&6; }
+if test "x$ac_cv_lib_socket_connect" = xyes; then :
+  X_EXTRA_LIBS="-lsocket $X_EXTRA_LIBS"
+fi
+
+    fi
+
+    # Guillermo Gomez says -lposix is necessary on A/UX.
+    ac_fn_c_check_func "$LINENO" "remove" "ac_cv_func_remove"
+if test "x$ac_cv_func_remove" = xyes; then :
+
+fi
+
+    if test $ac_cv_func_remove = no; then
+      { $as_echo "$as_me:${as_lineno-$LINENO}: checking for remove in -lposix" >&5
+$as_echo_n "checking for remove in -lposix... " >&6; }
+if ${ac_cv_lib_posix_remove+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_check_lib_save_LIBS=$LIBS
+LIBS="-lposix  $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+char remove ();
+int
+main ()
+{
+return remove ();
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  ac_cv_lib_posix_remove=yes
+else
+  ac_cv_lib_posix_remove=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_posix_remove" >&5
+$as_echo "$ac_cv_lib_posix_remove" >&6; }
+if test "x$ac_cv_lib_posix_remove" = xyes; then :
+  X_EXTRA_LIBS="$X_EXTRA_LIBS -lposix"
+fi
+
+    fi
+
+    # BSDI BSD/OS 2.1 needs -lipc for XOpenDisplay.
+    ac_fn_c_check_func "$LINENO" "shmat" "ac_cv_func_shmat"
+if test "x$ac_cv_func_shmat" = xyes; then :
+
+fi
+
+    if test $ac_cv_func_shmat = no; then
+      { $as_echo "$as_me:${as_lineno-$LINENO}: checking for shmat in -lipc" >&5
+$as_echo_n "checking for shmat in -lipc... " >&6; }
+if ${ac_cv_lib_ipc_shmat+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_check_lib_save_LIBS=$LIBS
+LIBS="-lipc  $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+char shmat ();
+int
+main ()
+{
+return shmat ();
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  ac_cv_lib_ipc_shmat=yes
+else
+  ac_cv_lib_ipc_shmat=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_ipc_shmat" >&5
+$as_echo "$ac_cv_lib_ipc_shmat" >&6; }
+if test "x$ac_cv_lib_ipc_shmat" = xyes; then :
+  X_EXTRA_LIBS="$X_EXTRA_LIBS -lipc"
+fi
+
+    fi
+  fi
+
+  # Check for libraries that X11R6 Xt/Xaw programs need.
+  ac_save_LDFLAGS=$LDFLAGS
+  test -n "$x_libraries" && LDFLAGS="$LDFLAGS -L$x_libraries"
+  # SM needs ICE to (dynamically) link under SunOS 4.x (so we have to
+  # check for ICE first), but we must link in the order -lSM -lICE or
+  # we get undefined symbols.  So assume we have SM if we have ICE.
+  # These have to be linked with before -lX11, unlike the other
+  # libraries we check for below, so use a different variable.
+  # John Interrante, Karl Berry
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for IceConnectionNumber in -lICE" >&5
+$as_echo_n "checking for IceConnectionNumber in -lICE... " >&6; }
+if ${ac_cv_lib_ICE_IceConnectionNumber+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_check_lib_save_LIBS=$LIBS
+LIBS="-lICE $X_EXTRA_LIBS $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+char IceConnectionNumber ();
+int
+main ()
+{
+return IceConnectionNumber ();
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  ac_cv_lib_ICE_IceConnectionNumber=yes
+else
+  ac_cv_lib_ICE_IceConnectionNumber=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_ICE_IceConnectionNumber" >&5
+$as_echo "$ac_cv_lib_ICE_IceConnectionNumber" >&6; }
+if test "x$ac_cv_lib_ICE_IceConnectionNumber" = xyes; then :
+  X_PRE_LIBS="$X_PRE_LIBS -lSM -lICE"
+fi
+
+  LDFLAGS=$ac_save_LDFLAGS
+
+fi
+
+ac_header_dirent=no
+for ac_hdr in dirent.h sys/ndir.h sys/dir.h ndir.h; do
+  as_ac_Header=`$as_echo "ac_cv_header_dirent_$ac_hdr" | $as_tr_sh`
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_hdr that defines DIR" >&5
+$as_echo_n "checking for $ac_hdr that defines DIR... " >&6; }
+if eval \${$as_ac_Header+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <sys/types.h>
+#include <$ac_hdr>
+
+int
+main ()
+{
+if ((DIR *) 0)
+return 0;
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  eval "$as_ac_Header=yes"
+else
+  eval "$as_ac_Header=no"
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+eval ac_res=\$$as_ac_Header
+              { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+if eval test \"x\$"$as_ac_Header"\" = x"yes"; then :
+  cat >>confdefs.h <<_ACEOF
+#define `$as_echo "HAVE_$ac_hdr" | $as_tr_cpp` 1
+_ACEOF
+
+ac_header_dirent=$ac_hdr; break
+fi
+
+done
+# Two versions of opendir et al. are in -ldir and -lx on SCO Xenix.
+if test $ac_header_dirent = dirent.h; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing opendir" >&5
+$as_echo_n "checking for library containing opendir... " >&6; }
+if ${ac_cv_search_opendir+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_func_search_save_LIBS=$LIBS
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+char opendir ();
+int
+main ()
+{
+return opendir ();
+  ;
+  return 0;
+}
+_ACEOF
+for ac_lib in '' dir; do
+  if test -z "$ac_lib"; then
+    ac_res="none required"
+  else
+    ac_res=-l$ac_lib
+    LIBS="-l$ac_lib  $ac_func_search_save_LIBS"
+  fi
+  if ac_fn_c_try_link "$LINENO"; then :
+  ac_cv_search_opendir=$ac_res
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext
+  if ${ac_cv_search_opendir+:} false; then :
+  break
+fi
+done
+if ${ac_cv_search_opendir+:} false; then :
+
+else
+  ac_cv_search_opendir=no
+fi
+rm conftest.$ac_ext
+LIBS=$ac_func_search_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_opendir" >&5
+$as_echo "$ac_cv_search_opendir" >&6; }
+ac_res=$ac_cv_search_opendir
+if test "$ac_res" != no; then :
+  test "$ac_res" = "none required" || LIBS="$ac_res $LIBS"
+
+fi
+
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing opendir" >&5
+$as_echo_n "checking for library containing opendir... " >&6; }
+if ${ac_cv_search_opendir+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_func_search_save_LIBS=$LIBS
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+char opendir ();
+int
+main ()
+{
+return opendir ();
+  ;
+  return 0;
+}
+_ACEOF
+for ac_lib in '' x; do
+  if test -z "$ac_lib"; then
+    ac_res="none required"
+  else
+    ac_res=-l$ac_lib
+    LIBS="-l$ac_lib  $ac_func_search_save_LIBS"
+  fi
+  if ac_fn_c_try_link "$LINENO"; then :
+  ac_cv_search_opendir=$ac_res
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext
+  if ${ac_cv_search_opendir+:} false; then :
+  break
+fi
+done
+if ${ac_cv_search_opendir+:} false; then :
+
+else
+  ac_cv_search_opendir=no
+fi
+rm conftest.$ac_ext
+LIBS=$ac_func_search_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_opendir" >&5
+$as_echo "$ac_cv_search_opendir" >&6; }
+ac_res=$ac_cv_search_opendir
+if test "$ac_res" != no; then :
+  test "$ac_res" = "none required" || LIBS="$ac_res $LIBS"
+
+fi
+
+fi
+
+for ac_header in stdint.h
+do :
+  ac_fn_c_check_header_mongrel "$LINENO" "stdint.h" "ac_cv_header_stdint_h" "$ac_includes_default"
+if test "x$ac_cv_header_stdint_h" = xyes; then :
+  cat >>confdefs.h <<_ACEOF
+#define HAVE_STDINT_H 1
+_ACEOF
+
+fi
+
+done
+
+
+ac_ext=cpp
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
+
+
+ac_fn_cxx_check_decl "$LINENO" "gettimeofday" "ac_cv_have_decl_gettimeofday" "#include <sys/time.h>
+"
+if test "x$ac_cv_have_decl_gettimeofday" = xyes; then :
+  ac_fn_cxx_check_func "$LINENO" "gettimeofday" "ac_cv_func_gettimeofday"
+if test "x$ac_cv_func_gettimeofday" = xyes; then :
+
+$as_echo "#define HAVE_GETTIMEOFDAY 1" >>confdefs.h
+
+fi
+
+fi
+
+ac_fn_cxx_check_func "$LINENO" "localtime_r" "ac_cv_func_localtime_r"
+if test "x$ac_cv_func_localtime_r" = xyes; then :
+
+$as_echo "#define HAVE_LOCALTIME_R 1" >>confdefs.h
+
+fi
+
+ac_fn_cxx_check_func "$LINENO" "gmtime_r" "ac_cv_func_gmtime_r"
+if test "x$ac_cv_func_gmtime_r" = xyes; then :
+
+$as_echo "#define HAVE_GMTIME_R 1" >>confdefs.h
+
+fi
+
+
+ac_fn_cxx_check_func "$LINENO" "gethostbyname" "ac_cv_func_gethostbyname"
+if test "x$ac_cv_func_gethostbyname" = xyes; then :
+
+fi
+
+if test $ac_cv_func_gethostbyname = no; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for gethostbyname in -lbsd" >&5
+$as_echo_n "checking for gethostbyname in -lbsd... " >&6; }
+if ${ac_cv_lib_bsd_gethostbyname+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_check_lib_save_LIBS=$LIBS
+LIBS="-lbsd  $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+char gethostbyname ();
+int
+main ()
+{
+return gethostbyname ();
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_cxx_try_link "$LINENO"; then :
+  ac_cv_lib_bsd_gethostbyname=yes
+else
+  ac_cv_lib_bsd_gethostbyname=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_bsd_gethostbyname" >&5
+$as_echo "$ac_cv_lib_bsd_gethostbyname" >&6; }
+if test "x$ac_cv_lib_bsd_gethostbyname" = xyes; then :
+  X_EXTRA_LIBS="$X_EXTRA_LIBS -lbsd"
+fi
+
+fi
+
+ac_fn_cxx_check_func "$LINENO" "nanosleep" "ac_cv_func_nanosleep"
+if test "x$ac_cv_func_nanosleep" = xyes; then :
+
+fi
+
+if test x$ac_cv_func_nanosleep = xno
+then
+   { $as_echo "$as_me:${as_lineno-$LINENO}: checking for nanosleep in -lrt" >&5
+$as_echo_n "checking for nanosleep in -lrt... " >&6; }
+if ${ac_cv_lib_rt_nanosleep+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_check_lib_save_LIBS=$LIBS
+LIBS="-lrt  $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+char nanosleep ();
+int
+main ()
+{
+return nanosleep ();
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_cxx_try_link "$LINENO"; then :
+  ac_cv_lib_rt_nanosleep=yes
+else
+  ac_cv_lib_rt_nanosleep=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_rt_nanosleep" >&5
+$as_echo "$ac_cv_lib_rt_nanosleep" >&6; }
+if test "x$ac_cv_lib_rt_nanosleep" = xyes; then :
+  X_EXTRA_LIBS="$X_EXTRA_LIBS -lrt"
+fi
+
+fi
+
+if test x$ac_cv_func_nanosleep = xno && test x$ac_cv_lib_rt_nanosleep = xno
+then
+   { $as_echo "$as_me:${as_lineno-$LINENO}: checking for nanosleep in -lposix4" >&5
+$as_echo_n "checking for nanosleep in -lposix4... " >&6; }
+if ${ac_cv_lib_posix4_nanosleep+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_check_lib_save_LIBS=$LIBS
+LIBS="-lposix4  $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+char nanosleep ();
+int
+main ()
+{
+return nanosleep ();
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_cxx_try_link "$LINENO"; then :
+  ac_cv_lib_posix4_nanosleep=yes
+else
+  ac_cv_lib_posix4_nanosleep=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_posix4_nanosleep" >&5
+$as_echo "$ac_cv_lib_posix4_nanosleep" >&6; }
+if test "x$ac_cv_lib_posix4_nanosleep" = xyes; then :
+  X_EXTRA_LIBS="$X_EXTRA_LIBS -lposix4"
+fi
+
+fi
+
+
+# Check whether --enable-libopenjpeg was given.
+if test "${enable_libopenjpeg+set}" = set; then :
+  enableval=$enable_libopenjpeg; enable_libopenjpeg=$enableval
+else
+  enable_libopenjpeg="try"
+fi
+
+if test x$enable_libopenjpeg = xyes; then
+
+
+pkg_failed=no
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for LIBOPENJPEG" >&5
+$as_echo_n "checking for LIBOPENJPEG... " >&6; }
+
+if test -n "$LIBOPENJPEG_CFLAGS"; then
+    pkg_cv_LIBOPENJPEG_CFLAGS="$LIBOPENJPEG_CFLAGS"
+ elif test -n "$PKG_CONFIG"; then
+    if test -n "$PKG_CONFIG" && \
+    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libopenjpeg\""; } >&5
+  ($PKG_CONFIG --exists --print-errors "libopenjpeg") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then
+  pkg_cv_LIBOPENJPEG_CFLAGS=`$PKG_CONFIG --cflags "libopenjpeg" 2>/dev/null`
+                     test "x$?" != "x0" && pkg_failed=yes
+else
+  pkg_failed=yes
+fi
+ else
+    pkg_failed=untried
+fi
+if test -n "$LIBOPENJPEG_LIBS"; then
+    pkg_cv_LIBOPENJPEG_LIBS="$LIBOPENJPEG_LIBS"
+ elif test -n "$PKG_CONFIG"; then
+    if test -n "$PKG_CONFIG" && \
+    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libopenjpeg\""; } >&5
+  ($PKG_CONFIG --exists --print-errors "libopenjpeg") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then
+  pkg_cv_LIBOPENJPEG_LIBS=`$PKG_CONFIG --libs "libopenjpeg" 2>/dev/null`
+                     test "x$?" != "x0" && pkg_failed=yes
+else
+  pkg_failed=yes
+fi
+ else
+    pkg_failed=untried
+fi
+
+
+
+if test $pkg_failed = yes; then
+       { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+
+if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
+        _pkg_short_errors_supported=yes
+else
+        _pkg_short_errors_supported=no
+fi
+        if test $_pkg_short_errors_supported = yes; then
+               LIBOPENJPEG_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "libopenjpeg" 2>&1`
+        else
+               LIBOPENJPEG_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "libopenjpeg" 2>&1`
+        fi
+       # Put the nasty error message in config.log where it belongs
+       echo "$LIBOPENJPEG_PKG_ERRORS" >&5
+
+       { $as_echo "$as_me:${as_lineno-$LINENO}: checking for opj_cio_open in -lopenjpeg" >&5
+$as_echo_n "checking for opj_cio_open in -lopenjpeg... " >&6; }
+if ${ac_cv_lib_openjpeg_opj_cio_open+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_check_lib_save_LIBS=$LIBS
+LIBS="-lopenjpeg  $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+char opj_cio_open ();
+int
+main ()
+{
+return opj_cio_open ();
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_cxx_try_link "$LINENO"; then :
+  ac_cv_lib_openjpeg_opj_cio_open=yes
+else
+  ac_cv_lib_openjpeg_opj_cio_open=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_openjpeg_opj_cio_open" >&5
+$as_echo "$ac_cv_lib_openjpeg_opj_cio_open" >&6; }
+if test "x$ac_cv_lib_openjpeg_opj_cio_open" = xyes; then :
+  LIBOPENJPEG_LIBS="-lopenjpeg"
+else
+  as_fn_error $? "\"*** libopenjpeg library not found ***\"" "$LINENO" 5
+fi
+
+                    for ac_header in openjpeg.h
+do :
+  ac_fn_cxx_check_header_mongrel "$LINENO" "openjpeg.h" "ac_cv_header_openjpeg_h" "$ac_includes_default"
+if test "x$ac_cv_header_openjpeg_h" = xyes; then :
+  cat >>confdefs.h <<_ACEOF
+#define HAVE_OPENJPEG_H 1
+_ACEOF
+
+else
+  as_fn_error $? "\"*** libopenjpeg headers not found ***\"" "$LINENO" 5
+fi
+
+done
+
+elif test $pkg_failed = untried; then
+       { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+       { $as_echo "$as_me:${as_lineno-$LINENO}: checking for opj_cio_open in -lopenjpeg" >&5
+$as_echo_n "checking for opj_cio_open in -lopenjpeg... " >&6; }
+if ${ac_cv_lib_openjpeg_opj_cio_open+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_check_lib_save_LIBS=$LIBS
+LIBS="-lopenjpeg  $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+char opj_cio_open ();
+int
+main ()
+{
+return opj_cio_open ();
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_cxx_try_link "$LINENO"; then :
+  ac_cv_lib_openjpeg_opj_cio_open=yes
+else
+  ac_cv_lib_openjpeg_opj_cio_open=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_openjpeg_opj_cio_open" >&5
+$as_echo "$ac_cv_lib_openjpeg_opj_cio_open" >&6; }
+if test "x$ac_cv_lib_openjpeg_opj_cio_open" = xyes; then :
+  LIBOPENJPEG_LIBS="-lopenjpeg"
+else
+  as_fn_error $? "\"*** libopenjpeg library not found ***\"" "$LINENO" 5
+fi
+
+                    for ac_header in openjpeg.h
+do :
+  ac_fn_cxx_check_header_mongrel "$LINENO" "openjpeg.h" "ac_cv_header_openjpeg_h" "$ac_includes_default"
+if test "x$ac_cv_header_openjpeg_h" = xyes; then :
+  cat >>confdefs.h <<_ACEOF
+#define HAVE_OPENJPEG_H 1
+_ACEOF
+
+else
+  as_fn_error $? "\"*** libopenjpeg headers not found ***\"" "$LINENO" 5
+fi
+
+done
+
+else
+       LIBOPENJPEG_CFLAGS=$pkg_cv_LIBOPENJPEG_CFLAGS
+       LIBOPENJPEG_LIBS=$pkg_cv_LIBOPENJPEG_LIBS
+        { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+
+fi
+elif test x$enable_libopenjpeg = xtry; then
+
+pkg_failed=no
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for LIBOPENJPEG" >&5
+$as_echo_n "checking for LIBOPENJPEG... " >&6; }
+
+if test -n "$LIBOPENJPEG_CFLAGS"; then
+    pkg_cv_LIBOPENJPEG_CFLAGS="$LIBOPENJPEG_CFLAGS"
+ elif test -n "$PKG_CONFIG"; then
+    if test -n "$PKG_CONFIG" && \
+    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libopenjpeg\""; } >&5
+  ($PKG_CONFIG --exists --print-errors "libopenjpeg") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then
+  pkg_cv_LIBOPENJPEG_CFLAGS=`$PKG_CONFIG --cflags "libopenjpeg" 2>/dev/null`
+                     test "x$?" != "x0" && pkg_failed=yes
+else
+  pkg_failed=yes
+fi
+ else
+    pkg_failed=untried
+fi
+if test -n "$LIBOPENJPEG_LIBS"; then
+    pkg_cv_LIBOPENJPEG_LIBS="$LIBOPENJPEG_LIBS"
+ elif test -n "$PKG_CONFIG"; then
+    if test -n "$PKG_CONFIG" && \
+    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libopenjpeg\""; } >&5
+  ($PKG_CONFIG --exists --print-errors "libopenjpeg") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then
+  pkg_cv_LIBOPENJPEG_LIBS=`$PKG_CONFIG --libs "libopenjpeg" 2>/dev/null`
+                     test "x$?" != "x0" && pkg_failed=yes
+else
+  pkg_failed=yes
+fi
+ else
+    pkg_failed=untried
+fi
+
+
+
+if test $pkg_failed = yes; then
+       { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+
+if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
+        _pkg_short_errors_supported=yes
+else
+        _pkg_short_errors_supported=no
+fi
+        if test $_pkg_short_errors_supported = yes; then
+               LIBOPENJPEG_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "libopenjpeg" 2>&1`
+        else
+               LIBOPENJPEG_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "libopenjpeg" 2>&1`
+        fi
+       # Put the nasty error message in config.log where it belongs
+       echo "$LIBOPENJPEG_PKG_ERRORS" >&5
+
+       { $as_echo "$as_me:${as_lineno-$LINENO}: checking for opj_cio_open in -lopenjpeg" >&5
+$as_echo_n "checking for opj_cio_open in -lopenjpeg... " >&6; }
+if ${ac_cv_lib_openjpeg_opj_cio_open+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_check_lib_save_LIBS=$LIBS
+LIBS="-lopenjpeg  $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+char opj_cio_open ();
+int
+main ()
+{
+return opj_cio_open ();
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_cxx_try_link "$LINENO"; then :
+  ac_cv_lib_openjpeg_opj_cio_open=yes
+else
+  ac_cv_lib_openjpeg_opj_cio_open=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_openjpeg_opj_cio_open" >&5
+$as_echo "$ac_cv_lib_openjpeg_opj_cio_open" >&6; }
+if test "x$ac_cv_lib_openjpeg_opj_cio_open" = xyes; then :
+  enable_libopenjpeg="yes"
+                        LIBOPENJPEG_LIBS="-lopenjpeg"
+else
+  enable_libopenjpeg="no"
+fi
+
+                    for ac_header in openjpeg.h
+do :
+  ac_fn_cxx_check_header_mongrel "$LINENO" "openjpeg.h" "ac_cv_header_openjpeg_h" "$ac_includes_default"
+if test "x$ac_cv_header_openjpeg_h" = xyes; then :
+  cat >>confdefs.h <<_ACEOF
+#define HAVE_OPENJPEG_H 1
+_ACEOF
+
+else
+  enable_libopenjpeg="no"
+fi
+
+done
+
+elif test $pkg_failed = untried; then
+       { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+       { $as_echo "$as_me:${as_lineno-$LINENO}: checking for opj_cio_open in -lopenjpeg" >&5
+$as_echo_n "checking for opj_cio_open in -lopenjpeg... " >&6; }
+if ${ac_cv_lib_openjpeg_opj_cio_open+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_check_lib_save_LIBS=$LIBS
+LIBS="-lopenjpeg  $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+char opj_cio_open ();
+int
+main ()
+{
+return opj_cio_open ();
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_cxx_try_link "$LINENO"; then :
+  ac_cv_lib_openjpeg_opj_cio_open=yes
+else
+  ac_cv_lib_openjpeg_opj_cio_open=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_openjpeg_opj_cio_open" >&5
+$as_echo "$ac_cv_lib_openjpeg_opj_cio_open" >&6; }
+if test "x$ac_cv_lib_openjpeg_opj_cio_open" = xyes; then :
+  enable_libopenjpeg="yes"
+                        LIBOPENJPEG_LIBS="-lopenjpeg"
+else
+  enable_libopenjpeg="no"
+fi
+
+                    for ac_header in openjpeg.h
+do :
+  ac_fn_cxx_check_header_mongrel "$LINENO" "openjpeg.h" "ac_cv_header_openjpeg_h" "$ac_includes_default"
+if test "x$ac_cv_header_openjpeg_h" = xyes; then :
+  cat >>confdefs.h <<_ACEOF
+#define HAVE_OPENJPEG_H 1
+_ACEOF
+
+else
+  enable_libopenjpeg="no"
+fi
+
+done
+
+else
+       LIBOPENJPEG_CFLAGS=$pkg_cv_LIBOPENJPEG_CFLAGS
+       LIBOPENJPEG_LIBS=$pkg_cv_LIBOPENJPEG_LIBS
+        { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+       enable_libopenjpeg="yes"
+fi
+fi
+
+if test x$enable_libopenjpeg = xyes; then
+
+
+  $as_echo "#define ENABLE_LIBOPENJPEG 1" >>confdefs.h
+
+  if test -n "$PKG_CONFIG" && \
+    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libopenjpeg >= 1.5\""; } >&5
+  ($PKG_CONFIG --exists --print-errors "libopenjpeg >= 1.5") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then
+
+$as_echo "#define WITH_OPENJPEG_IGNORE_PCLR_CMAP_CDEF_FLAG 1" >>confdefs.h
+
+fi
+fi
+
+ if test x$enable_libopenjpeg = xyes; then
+  BUILD_LIBOPENJPEG_TRUE=
+  BUILD_LIBOPENJPEG_FALSE='#'
+else
+  BUILD_LIBOPENJPEG_TRUE='#'
+  BUILD_LIBOPENJPEG_FALSE=
+fi
+
+
+
+# Check whether --enable-libtiff was given.
+if test "${enable_libtiff+set}" = set; then :
+  enableval=$enable_libtiff; enable_libtiff=$enableval
+else
+  enable_libtiff="try"
+fi
+
+
+
+
+ac_save_CPPFLAGS="$CPPFLAGS"
+ac_save_CXXFLAGS="$CXXFLAGS"
+ac_save_LIBS="$LDFLAGS"
+CPPFLAGS="$CPPFLAGS $LIBTIFF_CFLAGS"
+CXXFLAGS="$CXXFLAGS $LIBTIFF_CFLAGS"
+LIBS="$LIBS $LIBTIFF_LIBS"
+if test x$enable_libtiff = xyes; then
+  if test x"$LIBTIFF_LIBS" != ; then
+    ac_fn_cxx_check_func "$LINENO" "TIFFOpen" "ac_cv_func_TIFFOpen"
+if test "x$ac_cv_func_TIFFOpen" = xyes; then :
+
+else
+  as_fn_error $? "\"*** libtiff library not found ***\"" "$LINENO" 5
+fi
+
+  else
+    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for TIFFOpen in -ltiff" >&5
+$as_echo_n "checking for TIFFOpen in -ltiff... " >&6; }
+if ${ac_cv_lib_tiff_TIFFOpen+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_check_lib_save_LIBS=$LIBS
+LIBS="-ltiff  $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+char TIFFOpen ();
+int
+main ()
+{
+return TIFFOpen ();
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_cxx_try_link "$LINENO"; then :
+  ac_cv_lib_tiff_TIFFOpen=yes
+else
+  ac_cv_lib_tiff_TIFFOpen=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_tiff_TIFFOpen" >&5
+$as_echo "$ac_cv_lib_tiff_TIFFOpen" >&6; }
+if test "x$ac_cv_lib_tiff_TIFFOpen" = xyes; then :
+  cat >>confdefs.h <<_ACEOF
+#define HAVE_LIBTIFF 1
+_ACEOF
+
+  LIBS="-ltiff $LIBS"
+
+else
+  as_fn_error $? "\"*** libtiff library not found ***\"" "$LINENO" 5
+fi
+
+  fi
+  for ac_header in tiffio.h
+do :
+  ac_fn_cxx_check_header_mongrel "$LINENO" "tiffio.h" "ac_cv_header_tiffio_h" "$ac_includes_default"
+if test "x$ac_cv_header_tiffio_h" = xyes; then :
+  cat >>confdefs.h <<_ACEOF
+#define HAVE_TIFFIO_H 1
+_ACEOF
+
+else
+  as_fn_error $? "\"*** libtiff headers not found ***\"" "$LINENO" 5
+fi
+
+done
+
+elif test x$enable_libtiff = xtry; then
+  if test x"$LIBTIFF_LIBS" != x; then
+    ac_fn_cxx_check_func "$LINENO" "TIFFOpen" "ac_cv_func_TIFFOpen"
+if test "x$ac_cv_func_TIFFOpen" = xyes; then :
+  enable_libtiff="yes"
+else
+  enable_libtiff="no"
+fi
+
+  else
+    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for TIFFOpen in -ltiff" >&5
+$as_echo_n "checking for TIFFOpen in -ltiff... " >&6; }
+if ${ac_cv_lib_tiff_TIFFOpen+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_check_lib_save_LIBS=$LIBS
+LIBS="-ltiff  $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+char TIFFOpen ();
+int
+main ()
+{
+return TIFFOpen ();
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_cxx_try_link "$LINENO"; then :
+  ac_cv_lib_tiff_TIFFOpen=yes
+else
+  ac_cv_lib_tiff_TIFFOpen=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_tiff_TIFFOpen" >&5
+$as_echo "$ac_cv_lib_tiff_TIFFOpen" >&6; }
+if test "x$ac_cv_lib_tiff_TIFFOpen" = xyes; then :
+  enable_libtiff="yes"
+else
+  enable_libtiff="no"
+fi
+
+  fi
+  for ac_header in tiffio.h
+do :
+  ac_fn_cxx_check_header_mongrel "$LINENO" "tiffio.h" "ac_cv_header_tiffio_h" "$ac_includes_default"
+if test "x$ac_cv_header_tiffio_h" = xyes; then :
+  cat >>confdefs.h <<_ACEOF
+#define HAVE_TIFFIO_H 1
+_ACEOF
+
+else
+  enable_libtiff="no"
+fi
+
+done
+
+fi
+CPPFLAGS="$ac_save_CPPFLAGS"
+CXXFLAGS="$ac_save_CXXFLAGS"
+LIBS="$ac_save_LIBS"
+
+if test x$enable_libtiff = xyes; then
+  if test x"$LIBTIFF_LIBS" = x; then
+    LIBTIFF_LIBS="-ltiff"
+  fi
+
+
+  $as_echo "#define ENABLE_LIBTIFF 1" >>confdefs.h
+
+fi
+
+ if test x$enable_libtiff = xyes; then
+  BUILD_LIBTIFF_TRUE=
+  BUILD_LIBTIFF_FALSE='#'
+else
+  BUILD_LIBTIFF_TRUE='#'
+  BUILD_LIBTIFF_FALSE=
+fi
+
+
+if test x$enable_libtiff = xyes; then
+
+$as_echo "#define ENABLE_LIBTIFF 1" >>confdefs.h
+
+fi
+
+for ac_func in popen mkstemp mkstemps
+do :
+  as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh`
+ac_fn_cxx_check_func "$LINENO" "$ac_func" "$as_ac_var"
+if eval test \"x\$"$as_ac_var"\" = x"yes"; then :
+  cat >>confdefs.h <<_ACEOF
+#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1
+_ACEOF
+
+fi
+done
+
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+
+# Check whether --enable-largefile was given.
+if test "${enable_largefile+set}" = set; then :
+  enableval=$enable_largefile;
+fi
+
+if test "$enable_largefile" != no; then
+
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for special C compiler options needed for large files" >&5
+$as_echo_n "checking for special C compiler options needed for large files... " >&6; }
+if ${ac_cv_sys_largefile_CC+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_cv_sys_largefile_CC=no
+     if test "$GCC" != yes; then
+       ac_save_CC=$CC
+       while :; do
+        # IRIX 6.2 and later do not support large files by default,
+        # so use the C compiler's -n32 option if that helps.
+        cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <sys/types.h>
+ /* Check that off_t can represent 2**63 - 1 correctly.
+    We can't simply define LARGE_OFF_T to be 9223372036854775807,
+    since some C++ compilers masquerading as C compilers
+    incorrectly reject 9223372036854775807.  */
+#define LARGE_OFF_T (((off_t) 1 << 62) - 1 + ((off_t) 1 << 62))
+  int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721
+                      && LARGE_OFF_T % 2147483647 == 1)
+                     ? 1 : -1];
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+        if ac_fn_c_try_compile "$LINENO"; then :
+  break
+fi
+rm -f core conftest.err conftest.$ac_objext
+        CC="$CC -n32"
+        if ac_fn_c_try_compile "$LINENO"; then :
+  ac_cv_sys_largefile_CC=' -n32'; break
+fi
+rm -f core conftest.err conftest.$ac_objext
+        break
+       done
+       CC=$ac_save_CC
+       rm -f conftest.$ac_ext
+    fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sys_largefile_CC" >&5
+$as_echo "$ac_cv_sys_largefile_CC" >&6; }
+  if test "$ac_cv_sys_largefile_CC" != no; then
+    CC=$CC$ac_cv_sys_largefile_CC
+  fi
+
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _FILE_OFFSET_BITS value needed for large files" >&5
+$as_echo_n "checking for _FILE_OFFSET_BITS value needed for large files... " >&6; }
+if ${ac_cv_sys_file_offset_bits+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  while :; do
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <sys/types.h>
+ /* Check that off_t can represent 2**63 - 1 correctly.
+    We can't simply define LARGE_OFF_T to be 9223372036854775807,
+    since some C++ compilers masquerading as C compilers
+    incorrectly reject 9223372036854775807.  */
+#define LARGE_OFF_T (((off_t) 1 << 62) - 1 + ((off_t) 1 << 62))
+  int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721
+                      && LARGE_OFF_T % 2147483647 == 1)
+                     ? 1 : -1];
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  ac_cv_sys_file_offset_bits=no; break
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#define _FILE_OFFSET_BITS 64
+#include <sys/types.h>
+ /* Check that off_t can represent 2**63 - 1 correctly.
+    We can't simply define LARGE_OFF_T to be 9223372036854775807,
+    since some C++ compilers masquerading as C compilers
+    incorrectly reject 9223372036854775807.  */
+#define LARGE_OFF_T (((off_t) 1 << 62) - 1 + ((off_t) 1 << 62))
+  int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721
+                      && LARGE_OFF_T % 2147483647 == 1)
+                     ? 1 : -1];
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  ac_cv_sys_file_offset_bits=64; break
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+  ac_cv_sys_file_offset_bits=unknown
+  break
+done
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sys_file_offset_bits" >&5
+$as_echo "$ac_cv_sys_file_offset_bits" >&6; }
+case $ac_cv_sys_file_offset_bits in #(
+  no | unknown) ;;
+  *)
+cat >>confdefs.h <<_ACEOF
+#define _FILE_OFFSET_BITS $ac_cv_sys_file_offset_bits
+_ACEOF
+;;
+esac
+rm -rf conftest*
+  if test $ac_cv_sys_file_offset_bits = unknown; then
+    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _LARGE_FILES value needed for large files" >&5
+$as_echo_n "checking for _LARGE_FILES value needed for large files... " >&6; }
+if ${ac_cv_sys_large_files+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  while :; do
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <sys/types.h>
+ /* Check that off_t can represent 2**63 - 1 correctly.
+    We can't simply define LARGE_OFF_T to be 9223372036854775807,
+    since some C++ compilers masquerading as C compilers
+    incorrectly reject 9223372036854775807.  */
+#define LARGE_OFF_T (((off_t) 1 << 62) - 1 + ((off_t) 1 << 62))
+  int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721
+                      && LARGE_OFF_T % 2147483647 == 1)
+                     ? 1 : -1];
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  ac_cv_sys_large_files=no; break
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#define _LARGE_FILES 1
+#include <sys/types.h>
+ /* Check that off_t can represent 2**63 - 1 correctly.
+    We can't simply define LARGE_OFF_T to be 9223372036854775807,
+    since some C++ compilers masquerading as C compilers
+    incorrectly reject 9223372036854775807.  */
+#define LARGE_OFF_T (((off_t) 1 << 62) - 1 + ((off_t) 1 << 62))
+  int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721
+                      && LARGE_OFF_T % 2147483647 == 1)
+                     ? 1 : -1];
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  ac_cv_sys_large_files=1; break
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+  ac_cv_sys_large_files=unknown
+  break
+done
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sys_large_files" >&5
+$as_echo "$ac_cv_sys_large_files" >&6; }
+case $ac_cv_sys_large_files in #(
+  no | unknown) ;;
+  *)
+cat >>confdefs.h <<_ACEOF
+#define _LARGE_FILES $ac_cv_sys_large_files
+_ACEOF
+;;
+esac
+rm -rf conftest*
+  fi
+
+
+fi
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for _LARGEFILE_SOURCE value needed for large files" >&5
+$as_echo_n "checking for _LARGEFILE_SOURCE value needed for large files... " >&6; }
+if ${ac_cv_sys_largefile_source+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  while :; do
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <sys/types.h> /* for off_t */
+     #include <stdio.h>
+int
+main ()
+{
+int (*fp) (FILE *, off_t, int) = fseeko;
+     return fseeko (stdin, 0, 0) && fp (stdin, 0, 0);
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  ac_cv_sys_largefile_source=no; break
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#define _LARGEFILE_SOURCE 1
+#include <sys/types.h> /* for off_t */
+     #include <stdio.h>
+int
+main ()
+{
+int (*fp) (FILE *, off_t, int) = fseeko;
+     return fseeko (stdin, 0, 0) && fp (stdin, 0, 0);
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  ac_cv_sys_largefile_source=1; break
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+  ac_cv_sys_largefile_source=unknown
+  break
+done
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sys_largefile_source" >&5
+$as_echo "$ac_cv_sys_largefile_source" >&6; }
+case $ac_cv_sys_largefile_source in #(
+  no | unknown) ;;
+  *)
+cat >>confdefs.h <<_ACEOF
+#define _LARGEFILE_SOURCE $ac_cv_sys_largefile_source
+_ACEOF
+;;
+esac
+rm -rf conftest*
+
+# We used to try defining _XOPEN_SOURCE=500 too, to work around a bug
+# in glibc 2.1.3, but that breaks too many other things.
+# If you want fseeko and ftello with glibc, upgrade to a fixed glibc.
+if test $ac_cv_sys_largefile_source != unknown; then
+
+$as_echo "#define HAVE_FSEEKO 1" >>confdefs.h
+
+fi
+
+for ac_func in fseek64
+do :
+  ac_fn_c_check_func "$LINENO" "fseek64" "ac_cv_func_fseek64"
+if test "x$ac_cv_func_fseek64" = xyes; then :
+  cat >>confdefs.h <<_ACEOF
+#define HAVE_FSEEK64 1
+_ACEOF
+ xpdf_cv_func_fseek64=yes
+else
+  xpdf_cv_func_fseek64=no
+fi
+done
+
+for ac_func in ftell64
+do :
+  ac_fn_c_check_func "$LINENO" "ftell64" "ac_cv_func_ftell64"
+if test "x$ac_cv_func_ftell64" = xyes; then :
+  cat >>confdefs.h <<_ACEOF
+#define HAVE_FTELL64 1
+_ACEOF
+ xpdf_cv_func_ftell64=yes
+else
+  xpdf_cv_func_ftell64=no
+fi
+done
+
+if test "$xpdf_cv_func_fseek64" = yes -a "$xpdf_cv_func_ftell64" = yes; then
+  $as_echo "#define HAVE_FSEEK64 1" >>confdefs.h
+
+fi
+
+# Check whether --enable-zlib was given.
+if test "${enable_zlib+set}" = set; then :
+  enableval=$enable_zlib;
+else
+  enable_zlib="no"
+fi
+
+if test x$enable_zlib = xyes; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for inflate in -lz" >&5
+$as_echo_n "checking for inflate in -lz... " >&6; }
+if ${ac_cv_lib_z_inflate+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_check_lib_save_LIBS=$LIBS
+LIBS="-lz  $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+char inflate ();
+int
+main ()
+{
+return inflate ();
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  ac_cv_lib_z_inflate=yes
+else
+  ac_cv_lib_z_inflate=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_z_inflate" >&5
+$as_echo "$ac_cv_lib_z_inflate" >&6; }
+if test "x$ac_cv_lib_z_inflate" = xyes; then :
+  cat >>confdefs.h <<_ACEOF
+#define HAVE_LIBZ 1
+_ACEOF
+
+  LIBS="-lz $LIBS"
+
+else
+  as_fn_error $? "\"*** zlib library not found ***\"" "$LINENO" 5
+fi
+
+  for ac_header in zlib.h
+do :
+  ac_fn_c_check_header_mongrel "$LINENO" "zlib.h" "ac_cv_header_zlib_h" "$ac_includes_default"
+if test "x$ac_cv_header_zlib_h" = xyes; then :
+  cat >>confdefs.h <<_ACEOF
+#define HAVE_ZLIB_H 1
+_ACEOF
+
+else
+  as_fn_error $? "\"*** zlib headers not found ***\"" "$LINENO" 5
+fi
+
+done
+
+elif test x$enable_zlib = xtry; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for inflate in -lz" >&5
+$as_echo_n "checking for inflate in -lz... " >&6; }
+if ${ac_cv_lib_z_inflate+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_check_lib_save_LIBS=$LIBS
+LIBS="-lz  $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+char inflate ();
+int
+main ()
+{
+return inflate ();
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  ac_cv_lib_z_inflate=yes
+else
+  ac_cv_lib_z_inflate=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_z_inflate" >&5
+$as_echo "$ac_cv_lib_z_inflate" >&6; }
+if test "x$ac_cv_lib_z_inflate" = xyes; then :
+  enable_zlib="yes"
+else
+  enable_zlib="no"
+fi
+
+  for ac_header in zlib.h
+do :
+  ac_fn_c_check_header_mongrel "$LINENO" "zlib.h" "ac_cv_header_zlib_h" "$ac_includes_default"
+if test "x$ac_cv_header_zlib_h" = xyes; then :
+  cat >>confdefs.h <<_ACEOF
+#define HAVE_ZLIB_H 1
+_ACEOF
+
+else
+  enable_zlib="no"
+fi
+
+done
+
+fi
+
+if test x$enable_zlib = xyes; then
+  ZLIB_LIBS="-lz"
+
+  $as_echo "#define ENABLE_ZLIB 1" >>confdefs.h
+
+fi
+
+ if test x$enable_zlib = xyes; then
+  BUILD_ZLIB_TRUE=
+  BUILD_ZLIB_FALSE='#'
+else
+  BUILD_ZLIB_TRUE='#'
+  BUILD_ZLIB_FALSE=
+fi
+
+
+
+# Check whether --enable-libcurl was given.
+if test "${enable_libcurl+set}" = set; then :
+  enableval=$enable_libcurl; enable_libcurl=$enableval
+else
+  enable_libcurl="no"
+fi
+
+
+if test x$enable_libcurl = xyes; then
+
+pkg_failed=no
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for LIBCURL" >&5
+$as_echo_n "checking for LIBCURL... " >&6; }
+
+if test -n "$LIBCURL_CFLAGS"; then
+    pkg_cv_LIBCURL_CFLAGS="$LIBCURL_CFLAGS"
+ elif test -n "$PKG_CONFIG"; then
+    if test -n "$PKG_CONFIG" && \
+    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libcurl\""; } >&5
+  ($PKG_CONFIG --exists --print-errors "libcurl") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then
+  pkg_cv_LIBCURL_CFLAGS=`$PKG_CONFIG --cflags "libcurl" 2>/dev/null`
+                     test "x$?" != "x0" && pkg_failed=yes
+else
+  pkg_failed=yes
+fi
+ else
+    pkg_failed=untried
+fi
+if test -n "$LIBCURL_LIBS"; then
+    pkg_cv_LIBCURL_LIBS="$LIBCURL_LIBS"
+ elif test -n "$PKG_CONFIG"; then
+    if test -n "$PKG_CONFIG" && \
+    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libcurl\""; } >&5
+  ($PKG_CONFIG --exists --print-errors "libcurl") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then
+  pkg_cv_LIBCURL_LIBS=`$PKG_CONFIG --libs "libcurl" 2>/dev/null`
+                     test "x$?" != "x0" && pkg_failed=yes
+else
+  pkg_failed=yes
+fi
+ else
+    pkg_failed=untried
+fi
+
+
+
+if test $pkg_failed = yes; then
+       { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+
+if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
+        _pkg_short_errors_supported=yes
+else
+        _pkg_short_errors_supported=no
+fi
+        if test $_pkg_short_errors_supported = yes; then
+               LIBCURL_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "libcurl" 2>&1`
+        else
+               LIBCURL_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "libcurl" 2>&1`
+        fi
+       # Put the nasty error message in config.log where it belongs
+       echo "$LIBCURL_PKG_ERRORS" >&5
+
+       as_fn_error $? "Package requirements (libcurl) were not met:
+
+$LIBCURL_PKG_ERRORS
+
+Consider adjusting the PKG_CONFIG_PATH environment variable if you
+installed software in a non-standard prefix.
+
+Alternatively, you may set the environment variables LIBCURL_CFLAGS
+and LIBCURL_LIBS to avoid the need to call pkg-config.
+See the pkg-config man page for more details." "$LINENO" 5
+elif test $pkg_failed = untried; then
+       { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+       { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "The pkg-config script could not be found or is too old.  Make sure it
+is in your PATH or set the PKG_CONFIG environment variable to the full
+path to pkg-config.
+
+Alternatively, you may set the environment variables LIBCURL_CFLAGS
+and LIBCURL_LIBS to avoid the need to call pkg-config.
+See the pkg-config man page for more details.
+
+To get pkg-config, see <http://pkg-config.freedesktop.org/>.
+See \`config.log' for more details" "$LINENO" 5; }
+else
+       LIBCURL_CFLAGS=$pkg_cv_LIBCURL_CFLAGS
+       LIBCURL_LIBS=$pkg_cv_LIBCURL_LIBS
+        { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+
+fi
+
+$as_echo "#define ENABLE_LIBCURL 1" >>confdefs.h
+
+
+$as_echo "#define POPPLER_HAS_CURL_SUPPORT 1" >>confdefs.h
+
+fi
+
+ if test x$enable_libcurl = xyes; then
+  BUILD_LIBCURL_TRUE=
+  BUILD_LIBCURL_FALSE='#'
+else
+  BUILD_LIBCURL_TRUE='#'
+  BUILD_LIBCURL_FALSE=
+fi
+
+
+# Check whether --enable-libjpeg was given.
+if test "${enable_libjpeg+set}" = set; then :
+  enableval=$enable_libjpeg; enable_libjpeg=$enableval
+else
+  enable_libjpeg="try"
+fi
+
+
+if test x$enable_libjpeg != xno; then
+
+          ac_save_USER_INCLUDES="$USER_INCLUDES"
+  ac_save_USER_LDFLAGS="$USER_LDFLAGS"
+  USER_INCLUDES="$USER_INCLUDES $LIBJPEG_CFLAGS"
+  USER_LDFLAGS="$USER_LDFLAGS $LIBJPEG_CFLAGS"
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for libjpeg6b" >&5
+$as_echo_n "checking for libjpeg6b... " >&6; }
+if ${ac_cv_lib_jpeg_6b+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+
+ac_save_LIBS="$LIBS"
+LIBS="$all_libraries $USER_LDFLAGS -ljpeg6b -lm"
+ac_save_CFLAGS="$CFLAGS"
+CFLAGS="$CFLAGS $all_includes $USER_INCLUDES"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+void jpeg_CreateDecompress();
+#ifdef __cplusplus
+}
+#endif
+
+int
+main ()
+{
+jpeg_CreateDecompress();
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  eval "ac_cv_lib_jpeg_6b=-ljpeg6b"
+else
+  eval "ac_cv_lib_jpeg_6b=no"
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+LIBS="$ac_save_LIBS"
+CFLAGS="$ac_save_CFLAGS"
+
+fi
+
+
+if eval "test ! \"`echo $ac_cv_lib_jpeg_6b`\" = no"; then
+  enable_libjpeg=yes
+  LIBJPEG_LIBS="$ac_cv_lib_jpeg_6b"
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_jpeg_6b" >&5
+$as_echo "$ac_cv_lib_jpeg_6b" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for libjpeg" >&5
+$as_echo_n "checking for libjpeg... " >&6; }
+if ${ac_cv_lib_jpeg_normal+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+
+ac_save_LIBS="$LIBS"
+LIBS="$all_libraries $USER_LDFLAGS -ljpeg -lm"
+ac_save_CFLAGS="$CFLAGS"
+CFLAGS="$CFLAGS $all_includes $USER_INCLUDES"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+void jpeg_CreateDecompress();
+#ifdef __cplusplus
+}
+#endif
+
+int
+main ()
+{
+jpeg_CreateDecompress();
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  eval "ac_cv_lib_jpeg_normal=-ljpeg"
+else
+  eval "ac_cv_lib_jpeg_normal=no"
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+LIBS="$ac_save_LIBS"
+CFLAGS="$ac_save_CFLAGS"
+
+fi
+
+
+if eval "test ! \"`echo $ac_cv_lib_jpeg_normal`\" = no"; then
+  enable_libjpeg=yes
+  LIBJPEG_LIBS="$ac_cv_lib_jpeg_normal"
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_jpeg_normal" >&5
+$as_echo "$ac_cv_lib_jpeg_normal" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+
+       LIBJPEG_LIBS=
+
+
+fi
+
+
+fi
+
+
+ac_save_CPPFLAGS="$CPPFLAGS"
+ac_save_CFLAGS="$CFLAGS"
+CPPFLAGS="$CFLAGS $all_includes $USER_INCLUDES"
+CFLAGS="$CFLAGS $all_includes $USER_INCLUDES"
+ac_fn_c_check_header_mongrel "$LINENO" "jpeglib.h" "ac_cv_header_jpeglib_h" "$ac_includes_default"
+if test "x$ac_cv_header_jpeglib_h" = xyes; then :
+  jpeg_incdir=yes
+else
+  jpeg_incdir=NO
+fi
+
+
+CPPFLAGS="$ac_save_CPPFLAGS"
+CFLAGS="$ac_save_CFLAGS"
+test "x$jpeg_incdir" = xNO && jpeg_incdir=
+
+if test -n "$jpeg_incdir" && test -n "$LIBJPEG_LIBS" ; then
+
+cat >>confdefs.h <<_ACEOF
+#define ENABLE_LIBJPEG 1
+_ACEOF
+
+else
+  if test -n "$jpeg_incdir" || test -n "$LIBJPEG_LIBS" ; then
+    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING:
+There is an installation error in jpeg support. You seem to have only one
+of either the headers _or_ the libraries installed. You may need to either
+provide correct --with-extra-... options, or the development package of
+libjpeg6b. You can get a source package of libjpeg from http://www.ijg.org/
+Disabling JPEG support.
+" >&5
+$as_echo "$as_me: WARNING:
+There is an installation error in jpeg support. You seem to have only one
+of either the headers _or_ the libraries installed. You may need to either
+provide correct --with-extra-... options, or the development package of
+libjpeg6b. You can get a source package of libjpeg from http://www.ijg.org/
+Disabling JPEG support.
+" >&2;}
+  else
+    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: libjpeg not found. disable JPEG support." >&5
+$as_echo "$as_me: WARNING: libjpeg not found. disable JPEG support." >&2;}
+  fi
+  jpeg_incdir=
+  enable_libjpeg=no
+  LIBJPEG_LIBS=
+fi
+
+
+
+
+
+    ac_save_CPPFLAGS="$CPPFLAGS"
+  ac_save_CFLAGS="$CFLAGS"
+  CPPFLAGS="$CPPFLAGS $LIBJPEG_CFLAGS"
+  CFLAGS="$CFLAGS $LIBJPEG_CFLAGS"
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking libjpeg.h works correctly" >&5
+$as_echo_n "checking libjpeg.h works correctly... " >&6; }
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+
+#ifdef _WIN32
+#include <windows.h>
+#endif
+#include <sys/types.h>
+#include <stdio.h>
+#include <jpeglib.h>
+
+int
+main ()
+{
+{return 0;}
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+
+    { $as_echo "$as_me:${as_lineno-$LINENO}: result: ok" >&5
+$as_echo "ok" >&6; }
+
+else
+
+    { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+    { $as_echo "$as_me:${as_lineno-$LINENO}: checking libjpeg.h problem can be fixed by XMD_H macro" >&5
+$as_echo_n "checking libjpeg.h problem can be fixed by XMD_H macro... " >&6; }
+    CPPFLAGS="$CPPFLAGS -DXMD_H"
+    CFLAGS="$CFLAGS -DXMD_H"
+    cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+
+#ifdef _WIN32
+#include <windows.h>
+#endif
+#include <sys/types.h>
+#include <stdio.h>
+#include <jpeglib.h>
+
+int
+main ()
+{
+{return 0;}
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+
+      { $as_echo "$as_me:${as_lineno-$LINENO}: result: ok, -DXMD_H is added to LIBJPEG_CFLAGS" >&5
+$as_echo "ok, -DXMD_H is added to LIBJPEG_CFLAGS" >&6; }
+      LIBJPEG_CFLAGS="$LIBJPEG_CFLAGS -DXMD_H"
+
+else
+
+      { $as_echo "$as_me:${as_lineno-$LINENO}: result: no, disable libjpeg" >&5
+$as_echo "no, disable libjpeg" >&6; }
+      enable_libjpeg="no"
+
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+  CPPFLAGS="$ac_save_CPPFLAGS"
+  CFLAGS="$ac_save_CFLAGS"
+
+
+  USER_INCLUDES="$ac_save_USER_INCLUDES"
+  USER_LDFLAGS="$ac_save_USER_LDFLAGS"
+fi
+
+ if test x$enable_libjpeg = xyes; then
+  BUILD_LIBJPEG_TRUE=
+  BUILD_LIBJPEG_FALSE='#'
+else
+  BUILD_LIBJPEG_TRUE='#'
+  BUILD_LIBJPEG_FALSE=
+fi
+
+
+
+# Check whether --enable-libpng was given.
+if test "${enable_libpng+set}" = set; then :
+  enableval=$enable_libpng; enable_libpng=$enableval
+else
+  enable_libpng="try"
+fi
+
+
+if test x$enable_libpng != xno; then
+
+pkg_failed=no
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for LIBPNG" >&5
+$as_echo_n "checking for LIBPNG... " >&6; }
+
+if test -n "$LIBPNG_CFLAGS"; then
+    pkg_cv_LIBPNG_CFLAGS="$LIBPNG_CFLAGS"
+ elif test -n "$PKG_CONFIG"; then
+    if test -n "$PKG_CONFIG" && \
+    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libpng\""; } >&5
+  ($PKG_CONFIG --exists --print-errors "libpng") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then
+  pkg_cv_LIBPNG_CFLAGS=`$PKG_CONFIG --cflags "libpng" 2>/dev/null`
+                     test "x$?" != "x0" && pkg_failed=yes
+else
+  pkg_failed=yes
+fi
+ else
+    pkg_failed=untried
+fi
+if test -n "$LIBPNG_LIBS"; then
+    pkg_cv_LIBPNG_LIBS="$LIBPNG_LIBS"
+ elif test -n "$PKG_CONFIG"; then
+    if test -n "$PKG_CONFIG" && \
+    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libpng\""; } >&5
+  ($PKG_CONFIG --exists --print-errors "libpng") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then
+  pkg_cv_LIBPNG_LIBS=`$PKG_CONFIG --libs "libpng" 2>/dev/null`
+                     test "x$?" != "x0" && pkg_failed=yes
+else
+  pkg_failed=yes
+fi
+ else
+    pkg_failed=untried
+fi
+
+
+
+if test $pkg_failed = yes; then
+       { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+
+if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
+        _pkg_short_errors_supported=yes
+else
+        _pkg_short_errors_supported=no
+fi
+        if test $_pkg_short_errors_supported = yes; then
+               LIBPNG_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "libpng" 2>&1`
+        else
+               LIBPNG_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "libpng" 2>&1`
+        fi
+       # Put the nasty error message in config.log where it belongs
+       echo "$LIBPNG_PKG_ERRORS" >&5
+
+       enable_libpng="no"
+elif test $pkg_failed = untried; then
+       { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+       enable_libpng="no"
+else
+       LIBPNG_CFLAGS=$pkg_cv_LIBPNG_CFLAGS
+       LIBPNG_LIBS=$pkg_cv_LIBPNG_LIBS
+        { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+       enable_libpng="yes"
+fi
+fi
+
+if test x$enable_libpng = xyes; then
+
+$as_echo "#define ENABLE_LIBPNG 1" >>confdefs.h
+
+fi
+
+ if test x$enable_libpng = xyes; then
+  BUILD_LIBPNG_TRUE=
+  BUILD_LIBPNG_FALSE='#'
+else
+  BUILD_LIBPNG_TRUE='#'
+  BUILD_LIBPNG_FALSE=
+fi
+
+
+
+
+pkg_failed=no
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for FREETYPE" >&5
+$as_echo_n "checking for FREETYPE... " >&6; }
+
+if test -n "$FREETYPE_CFLAGS"; then
+    pkg_cv_FREETYPE_CFLAGS="$FREETYPE_CFLAGS"
+ elif test -n "$PKG_CONFIG"; then
+    if test -n "$PKG_CONFIG" && \
+    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"freetype2\""; } >&5
+  ($PKG_CONFIG --exists --print-errors "freetype2") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then
+  pkg_cv_FREETYPE_CFLAGS=`$PKG_CONFIG --cflags "freetype2" 2>/dev/null`
+                     test "x$?" != "x0" && pkg_failed=yes
+else
+  pkg_failed=yes
+fi
+ else
+    pkg_failed=untried
+fi
+if test -n "$FREETYPE_LIBS"; then
+    pkg_cv_FREETYPE_LIBS="$FREETYPE_LIBS"
+ elif test -n "$PKG_CONFIG"; then
+    if test -n "$PKG_CONFIG" && \
+    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"freetype2\""; } >&5
+  ($PKG_CONFIG --exists --print-errors "freetype2") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then
+  pkg_cv_FREETYPE_LIBS=`$PKG_CONFIG --libs "freetype2" 2>/dev/null`
+                     test "x$?" != "x0" && pkg_failed=yes
+else
+  pkg_failed=yes
+fi
+ else
+    pkg_failed=untried
+fi
+
+
+
+if test $pkg_failed = yes; then
+       { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+
+if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
+        _pkg_short_errors_supported=yes
+else
+        _pkg_short_errors_supported=no
+fi
+        if test $_pkg_short_errors_supported = yes; then
+               FREETYPE_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "freetype2" 2>&1`
+        else
+               FREETYPE_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "freetype2" 2>&1`
+        fi
+       # Put the nasty error message in config.log where it belongs
+       echo "$FREETYPE_PKG_ERRORS" >&5
+
+       freetype_pkgconfig=no
+elif test $pkg_failed = untried; then
+       { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+       freetype_pkgconfig=no
+else
+       FREETYPE_CFLAGS=$pkg_cv_FREETYPE_CFLAGS
+       FREETYPE_LIBS=$pkg_cv_FREETYPE_LIBS
+        { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+       freetype_pkgconfig=yes
+fi
+
+if test "x$freetype_pkgconfig" = "xyes"; then
+
+
+$as_echo "#define HAVE_FREETYPE_H 1" >>confdefs.h
+
+
+else
+
+  FREETYPE_LIBS=
+  FREETYPE_CFLAGS=
+
+  # Extract the first word of "freetype-config", so it can be a program name with args.
+set dummy freetype-config; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_path_FREETYPE_CONFIG+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  case $FREETYPE_CONFIG in
+  [\\/]* | ?:[\\/]*)
+  ac_cv_path_FREETYPE_CONFIG="$FREETYPE_CONFIG" # Let the user override the test with a path.
+  ;;
+  *)
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_path_FREETYPE_CONFIG="$as_dir/$ac_word$ac_exec_ext"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+  test -z "$ac_cv_path_FREETYPE_CONFIG" && ac_cv_path_FREETYPE_CONFIG="no"
+  ;;
+esac
+fi
+FREETYPE_CONFIG=$ac_cv_path_FREETYPE_CONFIG
+if test -n "$FREETYPE_CONFIG"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $FREETYPE_CONFIG" >&5
+$as_echo "$FREETYPE_CONFIG" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+  if test "x$FREETYPE_CONFIG" != "xno" ; then
+
+    FREETYPE_CFLAGS=`$FREETYPE_CONFIG --cflags`
+    FREETYPE_LIBS=`$FREETYPE_CONFIG --libs`
+
+$as_echo "#define HAVE_FREETYPE_H 1" >>confdefs.h
+
+
+  fi
+
+fi
+
+
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking which font configuration to use" >&5
+$as_echo_n "checking which font configuration to use... " >&6; }
+
+# Check whether --with-font_configuration was given.
+if test "${with_font_configuration+set}" = set; then :
+  withval=$with_font_configuration;
+else
+  if test x$os_win32 = xyes; then
+        # default to win32 on native Windows.
+        with_font_configuration=win32
+    else
+        # default to fontconig everywhere else.
+        with_font_configuration=fontconfig
+    fi
+
+
+fi
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $with_font_configuration" >&5
+$as_echo "$with_font_configuration" >&6; }
+
+case $with_font_configuration in
+  win32)
+
+$as_echo "#define WITH_FONTCONFIGURATION_WIN32 1" >>confdefs.h
+
+     # Set the minimum required Internet Explorer version to 5.0
+     CPPFLAGS="$CPPFLAGS -D_WIN32_IE=0x0500"
+     ;;
+  fontconfig)
+
+$as_echo "#define WITH_FONTCONFIGURATION_FONTCONFIG 1" >>confdefs.h
+
+
+pkg_failed=no
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for FONTCONFIG" >&5
+$as_echo_n "checking for FONTCONFIG... " >&6; }
+
+if test -n "$FONTCONFIG_CFLAGS"; then
+    pkg_cv_FONTCONFIG_CFLAGS="$FONTCONFIG_CFLAGS"
+ elif test -n "$PKG_CONFIG"; then
+    if test -n "$PKG_CONFIG" && \
+    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"fontconfig >= 2.0.0\""; } >&5
+  ($PKG_CONFIG --exists --print-errors "fontconfig >= 2.0.0") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then
+  pkg_cv_FONTCONFIG_CFLAGS=`$PKG_CONFIG --cflags "fontconfig >= 2.0.0" 2>/dev/null`
+                     test "x$?" != "x0" && pkg_failed=yes
+else
+  pkg_failed=yes
+fi
+ else
+    pkg_failed=untried
+fi
+if test -n "$FONTCONFIG_LIBS"; then
+    pkg_cv_FONTCONFIG_LIBS="$FONTCONFIG_LIBS"
+ elif test -n "$PKG_CONFIG"; then
+    if test -n "$PKG_CONFIG" && \
+    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"fontconfig >= 2.0.0\""; } >&5
+  ($PKG_CONFIG --exists --print-errors "fontconfig >= 2.0.0") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then
+  pkg_cv_FONTCONFIG_LIBS=`$PKG_CONFIG --libs "fontconfig >= 2.0.0" 2>/dev/null`
+                     test "x$?" != "x0" && pkg_failed=yes
+else
+  pkg_failed=yes
+fi
+ else
+    pkg_failed=untried
+fi
+
+
+
+if test $pkg_failed = yes; then
+       { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+
+if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
+        _pkg_short_errors_supported=yes
+else
+        _pkg_short_errors_supported=no
+fi
+        if test $_pkg_short_errors_supported = yes; then
+               FONTCONFIG_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "fontconfig >= 2.0.0" 2>&1`
+        else
+               FONTCONFIG_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "fontconfig >= 2.0.0" 2>&1`
+        fi
+       # Put the nasty error message in config.log where it belongs
+       echo "$FONTCONFIG_PKG_ERRORS" >&5
+
+       as_fn_error $? "Package requirements (fontconfig >= 2.0.0) were not met:
+
+$FONTCONFIG_PKG_ERRORS
+
+Consider adjusting the PKG_CONFIG_PATH environment variable if you
+installed software in a non-standard prefix.
+
+Alternatively, you may set the environment variables FONTCONFIG_CFLAGS
+and FONTCONFIG_LIBS to avoid the need to call pkg-config.
+See the pkg-config man page for more details." "$LINENO" 5
+elif test $pkg_failed = untried; then
+       { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+       { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "The pkg-config script could not be found or is too old.  Make sure it
+is in your PATH or set the PKG_CONFIG environment variable to the full
+path to pkg-config.
+
+Alternatively, you may set the environment variables FONTCONFIG_CFLAGS
+and FONTCONFIG_LIBS to avoid the need to call pkg-config.
+See the pkg-config man page for more details.
+
+To get pkg-config, see <http://pkg-config.freedesktop.org/>.
+See \`config.log' for more details" "$LINENO" 5; }
+else
+       FONTCONFIG_CFLAGS=$pkg_cv_FONTCONFIG_CFLAGS
+       FONTCONFIG_LIBS=$pkg_cv_FONTCONFIG_LIBS
+        { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+
+fi
+     ;;
+  *)
+     as_fn_error $? "Invalid font configuration setting: $with_font_configuration" "$LINENO" 5
+     ;;
+esac
+
+ if test x$with_font_configuration = xwin32; then
+  BUILD_WITH_WIN32_FONTCONFIGURATION_TRUE=
+  BUILD_WITH_WIN32_FONTCONFIGURATION_FALSE='#'
+else
+  BUILD_WITH_WIN32_FONTCONFIGURATION_TRUE='#'
+  BUILD_WITH_WIN32_FONTCONFIGURATION_FALSE=
+fi
+
+
+# Check whether --enable-splash-output was given.
+if test "${enable_splash_output+set}" = set; then :
+  enableval=$enable_splash_output;
+else
+  enable_splash_output="yes"
+fi
+
+ if test x$enable_splash_output = xyes; then
+  BUILD_SPLASH_OUTPUT_TRUE=
+  BUILD_SPLASH_OUTPUT_FALSE='#'
+else
+  BUILD_SPLASH_OUTPUT_TRUE='#'
+  BUILD_SPLASH_OUTPUT_FALSE=
+fi
+
+
+if test x$enable_splash_output = xyes; then
+  $as_echo "#define HAVE_SPLASH 1" >>confdefs.h
+
+fi
+
+CAIRO_VERSION="1.10.0"
+
+# Check whether --enable-cairo-output was given.
+if test "${enable_cairo_output+set}" = set; then :
+  enableval=$enable_cairo_output; enable_cairo_output=$enableval
+else
+  enable_cairo_output="try"
+fi
+
+use_cairo=""
+if test x$enable_cairo_output = xyes; then
+
+pkg_failed=no
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for CAIRO" >&5
+$as_echo_n "checking for CAIRO... " >&6; }
+
+if test -n "$CAIRO_CFLAGS"; then
+    pkg_cv_CAIRO_CFLAGS="$CAIRO_CFLAGS"
+ elif test -n "$PKG_CONFIG"; then
+    if test -n "$PKG_CONFIG" && \
+    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"cairo >= \$CAIRO_VERSION cairo-ft >= \$CAIRO_VERSION\""; } >&5
+  ($PKG_CONFIG --exists --print-errors "cairo >= $CAIRO_VERSION cairo-ft >= $CAIRO_VERSION") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then
+  pkg_cv_CAIRO_CFLAGS=`$PKG_CONFIG --cflags "cairo >= $CAIRO_VERSION cairo-ft >= $CAIRO_VERSION" 2>/dev/null`
+                     test "x$?" != "x0" && pkg_failed=yes
+else
+  pkg_failed=yes
+fi
+ else
+    pkg_failed=untried
+fi
+if test -n "$CAIRO_LIBS"; then
+    pkg_cv_CAIRO_LIBS="$CAIRO_LIBS"
+ elif test -n "$PKG_CONFIG"; then
+    if test -n "$PKG_CONFIG" && \
+    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"cairo >= \$CAIRO_VERSION cairo-ft >= \$CAIRO_VERSION\""; } >&5
+  ($PKG_CONFIG --exists --print-errors "cairo >= $CAIRO_VERSION cairo-ft >= $CAIRO_VERSION") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then
+  pkg_cv_CAIRO_LIBS=`$PKG_CONFIG --libs "cairo >= $CAIRO_VERSION cairo-ft >= $CAIRO_VERSION" 2>/dev/null`
+                     test "x$?" != "x0" && pkg_failed=yes
+else
+  pkg_failed=yes
+fi
+ else
+    pkg_failed=untried
+fi
+
+
+
+if test $pkg_failed = yes; then
+       { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+
+if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
+        _pkg_short_errors_supported=yes
+else
+        _pkg_short_errors_supported=no
+fi
+        if test $_pkg_short_errors_supported = yes; then
+               CAIRO_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "cairo >= $CAIRO_VERSION cairo-ft >= $CAIRO_VERSION" 2>&1`
+        else
+               CAIRO_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "cairo >= $CAIRO_VERSION cairo-ft >= $CAIRO_VERSION" 2>&1`
+        fi
+       # Put the nasty error message in config.log where it belongs
+       echo "$CAIRO_PKG_ERRORS" >&5
+
+       as_fn_error $? "Package requirements (cairo >= $CAIRO_VERSION cairo-ft >= $CAIRO_VERSION) were not met:
+
+$CAIRO_PKG_ERRORS
+
+Consider adjusting the PKG_CONFIG_PATH environment variable if you
+installed software in a non-standard prefix.
+
+Alternatively, you may set the environment variables CAIRO_CFLAGS
+and CAIRO_LIBS to avoid the need to call pkg-config.
+See the pkg-config man page for more details." "$LINENO" 5
+elif test $pkg_failed = untried; then
+       { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+       { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "The pkg-config script could not be found or is too old.  Make sure it
+is in your PATH or set the PKG_CONFIG environment variable to the full
+path to pkg-config.
+
+Alternatively, you may set the environment variables CAIRO_CFLAGS
+and CAIRO_LIBS to avoid the need to call pkg-config.
+See the pkg-config man page for more details.
+
+To get pkg-config, see <http://pkg-config.freedesktop.org/>.
+See \`config.log' for more details" "$LINENO" 5; }
+else
+       CAIRO_CFLAGS=$pkg_cv_CAIRO_CFLAGS
+       CAIRO_LIBS=$pkg_cv_CAIRO_LIBS
+        { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+
+fi
+elif test x$enable_cairo_output = xtry; then
+
+pkg_failed=no
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for CAIRO" >&5
+$as_echo_n "checking for CAIRO... " >&6; }
+
+if test -n "$CAIRO_CFLAGS"; then
+    pkg_cv_CAIRO_CFLAGS="$CAIRO_CFLAGS"
+ elif test -n "$PKG_CONFIG"; then
+    if test -n "$PKG_CONFIG" && \
+    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"cairo >= \$CAIRO_VERSION cairo-ft >= \$CAIRO_VERSION\""; } >&5
+  ($PKG_CONFIG --exists --print-errors "cairo >= $CAIRO_VERSION cairo-ft >= $CAIRO_VERSION") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then
+  pkg_cv_CAIRO_CFLAGS=`$PKG_CONFIG --cflags "cairo >= $CAIRO_VERSION cairo-ft >= $CAIRO_VERSION" 2>/dev/null`
+                     test "x$?" != "x0" && pkg_failed=yes
+else
+  pkg_failed=yes
+fi
+ else
+    pkg_failed=untried
+fi
+if test -n "$CAIRO_LIBS"; then
+    pkg_cv_CAIRO_LIBS="$CAIRO_LIBS"
+ elif test -n "$PKG_CONFIG"; then
+    if test -n "$PKG_CONFIG" && \
+    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"cairo >= \$CAIRO_VERSION cairo-ft >= \$CAIRO_VERSION\""; } >&5
+  ($PKG_CONFIG --exists --print-errors "cairo >= $CAIRO_VERSION cairo-ft >= $CAIRO_VERSION") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then
+  pkg_cv_CAIRO_LIBS=`$PKG_CONFIG --libs "cairo >= $CAIRO_VERSION cairo-ft >= $CAIRO_VERSION" 2>/dev/null`
+                     test "x$?" != "x0" && pkg_failed=yes
+else
+  pkg_failed=yes
+fi
+ else
+    pkg_failed=untried
+fi
+
+
+
+if test $pkg_failed = yes; then
+       { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+
+if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
+        _pkg_short_errors_supported=yes
+else
+        _pkg_short_errors_supported=no
+fi
+        if test $_pkg_short_errors_supported = yes; then
+               CAIRO_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "cairo >= $CAIRO_VERSION cairo-ft >= $CAIRO_VERSION" 2>&1`
+        else
+               CAIRO_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "cairo >= $CAIRO_VERSION cairo-ft >= $CAIRO_VERSION" 2>&1`
+        fi
+       # Put the nasty error message in config.log where it belongs
+       echo "$CAIRO_PKG_ERRORS" >&5
+
+       enable_cairo_output="no"
+                    use_cairo="no (requires cairo >= $CAIRO_VERSION)"
+elif test $pkg_failed = untried; then
+       { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+       enable_cairo_output="no"
+                    use_cairo="no (requires cairo >= $CAIRO_VERSION)"
+else
+       CAIRO_CFLAGS=$pkg_cv_CAIRO_CFLAGS
+       CAIRO_LIBS=$pkg_cv_CAIRO_LIBS
+        { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+       enable_cairo_output="yes"
+fi
+fi
+if test x$use_cairo = x; then
+   use_cairo=$enable_cairo_output
+fi
+
+
+
+
+ if test x$enable_cairo_output = xyes; then
+  BUILD_CAIRO_OUTPUT_TRUE=
+  BUILD_CAIRO_OUTPUT_FALSE='#'
+else
+  BUILD_CAIRO_OUTPUT_TRUE='#'
+  BUILD_CAIRO_OUTPUT_FALSE=
+fi
+
+
+if test x$enable_cairo_output = xyes; then
+  PDFTOCAIRO_DEPS="cairo cairo-ft"
+    if test -n "$PKG_CONFIG" && \
+    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"cairo-pdf\""; } >&5
+  ($PKG_CONFIG --exists --print-errors "cairo-pdf") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then
+  PDFTOCAIRO_DEPS="$PDFTOCAIRO_DEPS cairo-pdf"
+fi
+  if test -n "$PKG_CONFIG" && \
+    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"cairo-ps\""; } >&5
+  ($PKG_CONFIG --exists --print-errors "cairo-ps") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then
+  PDFTOCAIRO_DEPS="$PDFTOCAIRO_DEPS cairo-ps"
+fi
+  if test -n "$PKG_CONFIG" && \
+    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"cairo-svg\""; } >&5
+  ($PKG_CONFIG --exists --print-errors "cairo-svg") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then
+  PDFTOCAIRO_DEPS="$PDFTOCAIRO_DEPS cairo-svg"
+fi
+
+
+pkg_failed=no
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for PDFTOCAIRO" >&5
+$as_echo_n "checking for PDFTOCAIRO... " >&6; }
+
+if test -n "$PDFTOCAIRO_CFLAGS"; then
+    pkg_cv_PDFTOCAIRO_CFLAGS="$PDFTOCAIRO_CFLAGS"
+ elif test -n "$PKG_CONFIG"; then
+    if test -n "$PKG_CONFIG" && \
+    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$PDFTOCAIRO_DEPS\""; } >&5
+  ($PKG_CONFIG --exists --print-errors "$PDFTOCAIRO_DEPS") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then
+  pkg_cv_PDFTOCAIRO_CFLAGS=`$PKG_CONFIG --cflags "$PDFTOCAIRO_DEPS" 2>/dev/null`
+                     test "x$?" != "x0" && pkg_failed=yes
+else
+  pkg_failed=yes
+fi
+ else
+    pkg_failed=untried
+fi
+if test -n "$PDFTOCAIRO_LIBS"; then
+    pkg_cv_PDFTOCAIRO_LIBS="$PDFTOCAIRO_LIBS"
+ elif test -n "$PKG_CONFIG"; then
+    if test -n "$PKG_CONFIG" && \
+    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$PDFTOCAIRO_DEPS\""; } >&5
+  ($PKG_CONFIG --exists --print-errors "$PDFTOCAIRO_DEPS") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then
+  pkg_cv_PDFTOCAIRO_LIBS=`$PKG_CONFIG --libs "$PDFTOCAIRO_DEPS" 2>/dev/null`
+                     test "x$?" != "x0" && pkg_failed=yes
+else
+  pkg_failed=yes
+fi
+ else
+    pkg_failed=untried
+fi
+
+
+
+if test $pkg_failed = yes; then
+       { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+
+if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
+        _pkg_short_errors_supported=yes
+else
+        _pkg_short_errors_supported=no
+fi
+        if test $_pkg_short_errors_supported = yes; then
+               PDFTOCAIRO_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "$PDFTOCAIRO_DEPS" 2>&1`
+        else
+               PDFTOCAIRO_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "$PDFTOCAIRO_DEPS" 2>&1`
+        fi
+       # Put the nasty error message in config.log where it belongs
+       echo "$PDFTOCAIRO_PKG_ERRORS" >&5
+
+       as_fn_error $? "Package requirements ($PDFTOCAIRO_DEPS) were not met:
+
+$PDFTOCAIRO_PKG_ERRORS
+
+Consider adjusting the PKG_CONFIG_PATH environment variable if you
+installed software in a non-standard prefix.
+
+Alternatively, you may set the environment variables PDFTOCAIRO_CFLAGS
+and PDFTOCAIRO_LIBS to avoid the need to call pkg-config.
+See the pkg-config man page for more details." "$LINENO" 5
+elif test $pkg_failed = untried; then
+       { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+       { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "The pkg-config script could not be found or is too old.  Make sure it
+is in your PATH or set the PKG_CONFIG environment variable to the full
+path to pkg-config.
+
+Alternatively, you may set the environment variables PDFTOCAIRO_CFLAGS
+and PDFTOCAIRO_LIBS to avoid the need to call pkg-config.
+See the pkg-config man page for more details.
+
+To get pkg-config, see <http://pkg-config.freedesktop.org/>.
+See \`config.log' for more details" "$LINENO" 5; }
+else
+       PDFTOCAIRO_CFLAGS=$pkg_cv_PDFTOCAIRO_CFLAGS
+       PDFTOCAIRO_LIBS=$pkg_cv_PDFTOCAIRO_LIBS
+        { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+
+fi
+
+
+
+  $as_echo "#define HAVE_CAIRO 1" >>confdefs.h
+
+  CAIRO_FEATURE="#define POPPLER_HAS_CAIRO 1"
+  CAIRO_REQ="cairo"
+  for ac_header in fcntl.h sys/mman.h sys/stat.h
+do :
+  as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh`
+ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default"
+if eval test \"x\$"$as_ac_Header"\" = x"yes"; then :
+  cat >>confdefs.h <<_ACEOF
+#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1
+_ACEOF
+
+fi
+
+done
+
+else
+  CAIRO_FEATURE="#undef POPPLER_HAS_CAIRO"
+  CAIRO_REQ=""
+fi
+
+
+
+use_glib=""
+found_introspection=no
+if test x$enable_cairo_output = xyes; then
+  POPPLER_GLIB_DISABLE_DEPRECATED=""
+  POPPLER_GLIB_DISABLE_SINGLE_INCLUDES=""
+
+  GLIB_REQUIRED=2.18
+
+  # Check whether --enable-poppler-glib was given.
+if test "${enable_poppler_glib+set}" = set; then :
+  enableval=$enable_poppler_glib; enable_poppler_glib=$enableval
+else
+  enable_poppler_glib="try"
+fi
+
+  if test x$enable_poppler_glib = xyes; then
+
+pkg_failed=no
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for POPPLER_GLIB" >&5
+$as_echo_n "checking for POPPLER_GLIB... " >&6; }
+
+if test -n "$POPPLER_GLIB_CFLAGS"; then
+    pkg_cv_POPPLER_GLIB_CFLAGS="$POPPLER_GLIB_CFLAGS"
+ elif test -n "$PKG_CONFIG"; then
+    if test -n "$PKG_CONFIG" && \
+    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"glib-2.0 >= \$GLIB_REQUIRED gobject-2.0 >= \$GLIB_REQUIRED cairo >= \$CAIRO_VERSION\""; } >&5
+  ($PKG_CONFIG --exists --print-errors "glib-2.0 >= $GLIB_REQUIRED gobject-2.0 >= $GLIB_REQUIRED cairo >= $CAIRO_VERSION") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then
+  pkg_cv_POPPLER_GLIB_CFLAGS=`$PKG_CONFIG --cflags "glib-2.0 >= $GLIB_REQUIRED gobject-2.0 >= $GLIB_REQUIRED cairo >= $CAIRO_VERSION" 2>/dev/null`
+                     test "x$?" != "x0" && pkg_failed=yes
+else
+  pkg_failed=yes
+fi
+ else
+    pkg_failed=untried
+fi
+if test -n "$POPPLER_GLIB_LIBS"; then
+    pkg_cv_POPPLER_GLIB_LIBS="$POPPLER_GLIB_LIBS"
+ elif test -n "$PKG_CONFIG"; then
+    if test -n "$PKG_CONFIG" && \
+    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"glib-2.0 >= \$GLIB_REQUIRED gobject-2.0 >= \$GLIB_REQUIRED cairo >= \$CAIRO_VERSION\""; } >&5
+  ($PKG_CONFIG --exists --print-errors "glib-2.0 >= $GLIB_REQUIRED gobject-2.0 >= $GLIB_REQUIRED cairo >= $CAIRO_VERSION") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then
+  pkg_cv_POPPLER_GLIB_LIBS=`$PKG_CONFIG --libs "glib-2.0 >= $GLIB_REQUIRED gobject-2.0 >= $GLIB_REQUIRED cairo >= $CAIRO_VERSION" 2>/dev/null`
+                     test "x$?" != "x0" && pkg_failed=yes
+else
+  pkg_failed=yes
+fi
+ else
+    pkg_failed=untried
+fi
+
+
+
+if test $pkg_failed = yes; then
+       { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+
+if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
+        _pkg_short_errors_supported=yes
+else
+        _pkg_short_errors_supported=no
+fi
+        if test $_pkg_short_errors_supported = yes; then
+               POPPLER_GLIB_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "glib-2.0 >= $GLIB_REQUIRED gobject-2.0 >= $GLIB_REQUIRED cairo >= $CAIRO_VERSION" 2>&1`
+        else
+               POPPLER_GLIB_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "glib-2.0 >= $GLIB_REQUIRED gobject-2.0 >= $GLIB_REQUIRED cairo >= $CAIRO_VERSION" 2>&1`
+        fi
+       # Put the nasty error message in config.log where it belongs
+       echo "$POPPLER_GLIB_PKG_ERRORS" >&5
+
+       as_fn_error $? "Package requirements (glib-2.0 >= $GLIB_REQUIRED gobject-2.0 >= $GLIB_REQUIRED cairo >= $CAIRO_VERSION) were not met:
+
+$POPPLER_GLIB_PKG_ERRORS
+
+Consider adjusting the PKG_CONFIG_PATH environment variable if you
+installed software in a non-standard prefix.
+
+Alternatively, you may set the environment variables POPPLER_GLIB_CFLAGS
+and POPPLER_GLIB_LIBS to avoid the need to call pkg-config.
+See the pkg-config man page for more details." "$LINENO" 5
+elif test $pkg_failed = untried; then
+       { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+       { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "The pkg-config script could not be found or is too old.  Make sure it
+is in your PATH or set the PKG_CONFIG environment variable to the full
+path to pkg-config.
+
+Alternatively, you may set the environment variables POPPLER_GLIB_CFLAGS
+and POPPLER_GLIB_LIBS to avoid the need to call pkg-config.
+See the pkg-config man page for more details.
+
+To get pkg-config, see <http://pkg-config.freedesktop.org/>.
+See \`config.log' for more details" "$LINENO" 5; }
+else
+       POPPLER_GLIB_CFLAGS=$pkg_cv_POPPLER_GLIB_CFLAGS
+       POPPLER_GLIB_LIBS=$pkg_cv_POPPLER_GLIB_LIBS
+        { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+
+fi
+  elif test x$enable_poppler_glib = xtry; then
+
+pkg_failed=no
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for POPPLER_GLIB" >&5
+$as_echo_n "checking for POPPLER_GLIB... " >&6; }
+
+if test -n "$POPPLER_GLIB_CFLAGS"; then
+    pkg_cv_POPPLER_GLIB_CFLAGS="$POPPLER_GLIB_CFLAGS"
+ elif test -n "$PKG_CONFIG"; then
+    if test -n "$PKG_CONFIG" && \
+    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"glib-2.0 >= \$GLIB_REQUIRED gobject-2.0 >= \$GLIB_REQUIRED cairo >= \$CAIRO_VERSION\""; } >&5
+  ($PKG_CONFIG --exists --print-errors "glib-2.0 >= $GLIB_REQUIRED gobject-2.0 >= $GLIB_REQUIRED cairo >= $CAIRO_VERSION") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then
+  pkg_cv_POPPLER_GLIB_CFLAGS=`$PKG_CONFIG --cflags "glib-2.0 >= $GLIB_REQUIRED gobject-2.0 >= $GLIB_REQUIRED cairo >= $CAIRO_VERSION" 2>/dev/null`
+                     test "x$?" != "x0" && pkg_failed=yes
+else
+  pkg_failed=yes
+fi
+ else
+    pkg_failed=untried
+fi
+if test -n "$POPPLER_GLIB_LIBS"; then
+    pkg_cv_POPPLER_GLIB_LIBS="$POPPLER_GLIB_LIBS"
+ elif test -n "$PKG_CONFIG"; then
+    if test -n "$PKG_CONFIG" && \
+    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"glib-2.0 >= \$GLIB_REQUIRED gobject-2.0 >= \$GLIB_REQUIRED cairo >= \$CAIRO_VERSION\""; } >&5
+  ($PKG_CONFIG --exists --print-errors "glib-2.0 >= $GLIB_REQUIRED gobject-2.0 >= $GLIB_REQUIRED cairo >= $CAIRO_VERSION") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then
+  pkg_cv_POPPLER_GLIB_LIBS=`$PKG_CONFIG --libs "glib-2.0 >= $GLIB_REQUIRED gobject-2.0 >= $GLIB_REQUIRED cairo >= $CAIRO_VERSION" 2>/dev/null`
+                     test "x$?" != "x0" && pkg_failed=yes
+else
+  pkg_failed=yes
+fi
+ else
+    pkg_failed=untried
+fi
+
+
+
+if test $pkg_failed = yes; then
+       { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+
+if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
+        _pkg_short_errors_supported=yes
+else
+        _pkg_short_errors_supported=no
+fi
+        if test $_pkg_short_errors_supported = yes; then
+               POPPLER_GLIB_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "glib-2.0 >= $GLIB_REQUIRED gobject-2.0 >= $GLIB_REQUIRED cairo >= $CAIRO_VERSION" 2>&1`
+        else
+               POPPLER_GLIB_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "glib-2.0 >= $GLIB_REQUIRED gobject-2.0 >= $GLIB_REQUIRED cairo >= $CAIRO_VERSION" 2>&1`
+        fi
+       # Put the nasty error message in config.log where it belongs
+       echo "$POPPLER_GLIB_PKG_ERRORS" >&5
+
+       enable_poppler_glib="no"
+                      use_glib="no (requires glib-2.0 >= $GLIB_REQUIRED gobject-2.0 >= $GLIB_REQUIRED cairo >= $CAIRO_VERSION)"
+elif test $pkg_failed = untried; then
+       { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+       enable_poppler_glib="no"
+                      use_glib="no (requires glib-2.0 >= $GLIB_REQUIRED gobject-2.0 >= $GLIB_REQUIRED cairo >= $CAIRO_VERSION)"
+else
+       POPPLER_GLIB_CFLAGS=$pkg_cv_POPPLER_GLIB_CFLAGS
+       POPPLER_GLIB_LIBS=$pkg_cv_POPPLER_GLIB_LIBS
+        { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+       enable_poppler_glib="yes"
+fi
+  fi
+  if test x$enable_poppler_glib = xyes; then
+    # Check for introspection
+
+
+
+                # Check whether --enable-introspection was given.
+if test "${enable_introspection+set}" = set; then :
+  enableval=$enable_introspection;
+else
+  enable_introspection=auto
+fi
+
+
+    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for gobject-introspection" >&5
+$as_echo_n "checking for gobject-introspection... " >&6; }
+
+        case $enable_introspection in #(
+  no) :
+            found_introspection="no (disabled, use --enable-introspection to enable)"
+     ;; #(
+      yes) :
+            if test -n "$PKG_CONFIG" && \
+    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"gobject-introspection-1.0\""; } >&5
+  ($PKG_CONFIG --exists --print-errors "gobject-introspection-1.0") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then
+  :
+else
+  as_fn_error $? "gobject-introspection-1.0 is not installed" "$LINENO" 5
+fi
+        if test -n "$PKG_CONFIG" && \
+    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"gobject-introspection-1.0 >= 0.6.7\""; } >&5
+  ($PKG_CONFIG --exists --print-errors "gobject-introspection-1.0 >= 0.6.7") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then
+  found_introspection=yes
+else
+  as_fn_error $? "You need to have gobject-introspection >= 0.6.7 installed to build poppler" "$LINENO" 5
+fi
+     ;; #(
+      auto) :
+            if test -n "$PKG_CONFIG" && \
+    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"gobject-introspection-1.0 >= 0.6.7\""; } >&5
+  ($PKG_CONFIG --exists --print-errors "gobject-introspection-1.0 >= 0.6.7") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then
+  found_introspection=yes
+else
+  found_introspection=no
+fi
+     ;; #(
+  *) :
+                as_fn_error $? "invalid argument passed to --enable-introspection, should be one of [no/auto/yes]" "$LINENO" 5
+     ;;
+esac
+    { $as_echo "$as_me:${as_lineno-$LINENO}: result: $found_introspection" >&5
+$as_echo "$found_introspection" >&6; }
+
+    INTROSPECTION_SCANNER=
+    INTROSPECTION_COMPILER=
+    INTROSPECTION_GENERATE=
+    INTROSPECTION_GIRDIR=
+    INTROSPECTION_TYPELIBDIR=
+    if test "x$found_introspection" = "xyes"; then
+       INTROSPECTION_SCANNER=`$PKG_CONFIG --variable=g_ir_scanner gobject-introspection-1.0`
+       INTROSPECTION_COMPILER=`$PKG_CONFIG --variable=g_ir_compiler gobject-introspection-1.0`
+       INTROSPECTION_GENERATE=`$PKG_CONFIG --variable=g_ir_generate gobject-introspection-1.0`
+       INTROSPECTION_GIRDIR=`$PKG_CONFIG --variable=girdir gobject-introspection-1.0`
+       INTROSPECTION_TYPELIBDIR="$($PKG_CONFIG --variable=typelibdir gobject-introspection-1.0)"
+       INTROSPECTION_CFLAGS=`$PKG_CONFIG --cflags gobject-introspection-1.0`
+       INTROSPECTION_LIBS=`$PKG_CONFIG --libs gobject-introspection-1.0`
+       INTROSPECTION_MAKEFILE=`$PKG_CONFIG --variable=datadir gobject-introspection-1.0`/gobject-introspection-1.0/Makefile.introspection
+    fi
+
+
+
+
+
+
+
+
+
+     if test "x$found_introspection" = "xyes"; then
+  HAVE_INTROSPECTION_TRUE=
+  HAVE_INTROSPECTION_FALSE='#'
+else
+  HAVE_INTROSPECTION_TRUE='#'
+  HAVE_INTROSPECTION_FALSE=
+fi
+
+
+
+
+    # Extract the first word of "glib-mkenums", so it can be a program name with args.
+set dummy glib-mkenums; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_path_GLIB_MKENUMS+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  case $GLIB_MKENUMS in
+  [\\/]* | ?:[\\/]*)
+  ac_cv_path_GLIB_MKENUMS="$GLIB_MKENUMS" # Let the user override the test with a path.
+  ;;
+  *)
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_path_GLIB_MKENUMS="$as_dir/$ac_word$ac_exec_ext"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+  ;;
+esac
+fi
+GLIB_MKENUMS=$ac_cv_path_GLIB_MKENUMS
+if test -n "$GLIB_MKENUMS"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $GLIB_MKENUMS" >&5
+$as_echo "$GLIB_MKENUMS" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+    POPPLER_GLIB_DISABLE_DEPRECATED="$POPPLER_GLIB_DISABLE_DEPRECATED -DG_DISABLE_DEPRECATED"
+    POPPLER_GLIB_DISABLE_SINGLE_INCLUDES="$POPPLER_GLIB_DISABLE_SINGLE_INCLUDES -DG_DISABLE_SINGLE_INCLUDES"
+  fi
+else
+  if test x$enable_poppler_glib = xyes; then
+    as_fn_error $? "\"Cairo output is required to build glib frontend\"" "$LINENO" 5
+  fi
+  use_glib="no (requires cairo output)"
+  enable_poppler_glib="no"
+fi
+if test x"$use_glib" = x; then
+   use_glib="$enable_poppler_glib"
+fi
+ if test x$enable_poppler_glib = xyes; then
+  BUILD_POPPLER_GLIB_TRUE=
+  BUILD_POPPLER_GLIB_FALSE='#'
+else
+  BUILD_POPPLER_GLIB_TRUE='#'
+  BUILD_POPPLER_GLIB_FALSE=
+fi
+
+ if test "x$found_introspection" = "xyes"; then
+  HAVE_INTROSPECTION_TRUE=
+  HAVE_INTROSPECTION_FALSE='#'
+else
+  HAVE_INTROSPECTION_TRUE='#'
+  HAVE_INTROSPECTION_FALSE=
+fi
+
+
+
+
+
+
+
+
+    # Extract the first word of "gtkdoc-check", so it can be a program name with args.
+set dummy gtkdoc-check; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_path_GTKDOC_CHECK+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  case $GTKDOC_CHECK in
+  [\\/]* | ?:[\\/]*)
+  ac_cv_path_GTKDOC_CHECK="$GTKDOC_CHECK" # Let the user override the test with a path.
+  ;;
+  *)
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_path_GTKDOC_CHECK="$as_dir/$ac_word$ac_exec_ext"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+  ;;
+esac
+fi
+GTKDOC_CHECK=$ac_cv_path_GTKDOC_CHECK
+if test -n "$GTKDOC_CHECK"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $GTKDOC_CHECK" >&5
+$as_echo "$GTKDOC_CHECK" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+  for ac_prog in gtkdoc-rebase
+do
+  # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_path_GTKDOC_REBASE+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  case $GTKDOC_REBASE in
+  [\\/]* | ?:[\\/]*)
+  ac_cv_path_GTKDOC_REBASE="$GTKDOC_REBASE" # Let the user override the test with a path.
+  ;;
+  *)
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_path_GTKDOC_REBASE="$as_dir/$ac_word$ac_exec_ext"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+  ;;
+esac
+fi
+GTKDOC_REBASE=$ac_cv_path_GTKDOC_REBASE
+if test -n "$GTKDOC_REBASE"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $GTKDOC_REBASE" >&5
+$as_echo "$GTKDOC_REBASE" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+  test -n "$GTKDOC_REBASE" && break
+done
+test -n "$GTKDOC_REBASE" || GTKDOC_REBASE="true"
+
+  # Extract the first word of "gtkdoc-mkpdf", so it can be a program name with args.
+set dummy gtkdoc-mkpdf; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_path_GTKDOC_MKPDF+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  case $GTKDOC_MKPDF in
+  [\\/]* | ?:[\\/]*)
+  ac_cv_path_GTKDOC_MKPDF="$GTKDOC_MKPDF" # Let the user override the test with a path.
+  ;;
+  *)
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_path_GTKDOC_MKPDF="$as_dir/$ac_word$ac_exec_ext"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+  ;;
+esac
+fi
+GTKDOC_MKPDF=$ac_cv_path_GTKDOC_MKPDF
+if test -n "$GTKDOC_MKPDF"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $GTKDOC_MKPDF" >&5
+$as_echo "$GTKDOC_MKPDF" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+
+
+# Check whether --with-html-dir was given.
+if test "${with_html_dir+set}" = set; then :
+  withval=$with_html_dir;
+else
+  with_html_dir='${datadir}/gtk-doc/html'
+fi
+
+  HTML_DIR="$with_html_dir"
+
+
+    # Check whether --enable-gtk-doc was given.
+if test "${enable_gtk_doc+set}" = set; then :
+  enableval=$enable_gtk_doc;
+else
+  enable_gtk_doc=no
+fi
+
+
+  if test x$enable_gtk_doc = xyes; then
+    if test -n "$PKG_CONFIG" && \
+    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"gtk-doc >= 1.14\""; } >&5
+  ($PKG_CONFIG --exists --print-errors "gtk-doc >= 1.14") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then
+  :
+else
+  as_fn_error $? "You need to have gtk-doc >= 1.14 installed to build $PACKAGE_NAME" "$LINENO" 5
+fi
+        if test "x$PACKAGE_NAME" != "xglib"; then
+
+pkg_failed=no
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for GTKDOC_DEPS" >&5
+$as_echo_n "checking for GTKDOC_DEPS... " >&6; }
+
+if test -n "$GTKDOC_DEPS_CFLAGS"; then
+    pkg_cv_GTKDOC_DEPS_CFLAGS="$GTKDOC_DEPS_CFLAGS"
+ elif test -n "$PKG_CONFIG"; then
+    if test -n "$PKG_CONFIG" && \
+    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"glib-2.0 >= 2.10.0 gobject-2.0  >= 2.10.0\""; } >&5
+  ($PKG_CONFIG --exists --print-errors "glib-2.0 >= 2.10.0 gobject-2.0  >= 2.10.0") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then
+  pkg_cv_GTKDOC_DEPS_CFLAGS=`$PKG_CONFIG --cflags "glib-2.0 >= 2.10.0 gobject-2.0  >= 2.10.0" 2>/dev/null`
+                     test "x$?" != "x0" && pkg_failed=yes
+else
+  pkg_failed=yes
+fi
+ else
+    pkg_failed=untried
+fi
+if test -n "$GTKDOC_DEPS_LIBS"; then
+    pkg_cv_GTKDOC_DEPS_LIBS="$GTKDOC_DEPS_LIBS"
+ elif test -n "$PKG_CONFIG"; then
+    if test -n "$PKG_CONFIG" && \
+    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"glib-2.0 >= 2.10.0 gobject-2.0  >= 2.10.0\""; } >&5
+  ($PKG_CONFIG --exists --print-errors "glib-2.0 >= 2.10.0 gobject-2.0  >= 2.10.0") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then
+  pkg_cv_GTKDOC_DEPS_LIBS=`$PKG_CONFIG --libs "glib-2.0 >= 2.10.0 gobject-2.0  >= 2.10.0" 2>/dev/null`
+                     test "x$?" != "x0" && pkg_failed=yes
+else
+  pkg_failed=yes
+fi
+ else
+    pkg_failed=untried
+fi
+
+
+
+if test $pkg_failed = yes; then
+       { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+
+if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
+        _pkg_short_errors_supported=yes
+else
+        _pkg_short_errors_supported=no
+fi
+        if test $_pkg_short_errors_supported = yes; then
+               GTKDOC_DEPS_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "glib-2.0 >= 2.10.0 gobject-2.0  >= 2.10.0" 2>&1`
+        else
+               GTKDOC_DEPS_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "glib-2.0 >= 2.10.0 gobject-2.0  >= 2.10.0" 2>&1`
+        fi
+       # Put the nasty error message in config.log where it belongs
+       echo "$GTKDOC_DEPS_PKG_ERRORS" >&5
+
+       as_fn_error $? "Package requirements (glib-2.0 >= 2.10.0 gobject-2.0  >= 2.10.0) were not met:
+
+$GTKDOC_DEPS_PKG_ERRORS
+
+Consider adjusting the PKG_CONFIG_PATH environment variable if you
+installed software in a non-standard prefix.
+
+Alternatively, you may set the environment variables GTKDOC_DEPS_CFLAGS
+and GTKDOC_DEPS_LIBS to avoid the need to call pkg-config.
+See the pkg-config man page for more details." "$LINENO" 5
+elif test $pkg_failed = untried; then
+       { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+       { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "The pkg-config script could not be found or is too old.  Make sure it
+is in your PATH or set the PKG_CONFIG environment variable to the full
+path to pkg-config.
+
+Alternatively, you may set the environment variables GTKDOC_DEPS_CFLAGS
+and GTKDOC_DEPS_LIBS to avoid the need to call pkg-config.
+See the pkg-config man page for more details.
+
+To get pkg-config, see <http://pkg-config.freedesktop.org/>.
+See \`config.log' for more details" "$LINENO" 5; }
+else
+       GTKDOC_DEPS_CFLAGS=$pkg_cv_GTKDOC_DEPS_CFLAGS
+       GTKDOC_DEPS_LIBS=$pkg_cv_GTKDOC_DEPS_LIBS
+        { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+
+fi
+    fi
+  fi
+
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build gtk-doc documentation" >&5
+$as_echo_n "checking whether to build gtk-doc documentation... " >&6; }
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_gtk_doc" >&5
+$as_echo "$enable_gtk_doc" >&6; }
+
+    # Check whether --enable-gtk-doc-html was given.
+if test "${enable_gtk_doc_html+set}" = set; then :
+  enableval=$enable_gtk_doc_html;
+else
+  enable_gtk_doc_html=yes
+fi
+
+    # Check whether --enable-gtk-doc-pdf was given.
+if test "${enable_gtk_doc_pdf+set}" = set; then :
+  enableval=$enable_gtk_doc_pdf;
+else
+  enable_gtk_doc_pdf=no
+fi
+
+
+  if test -z "$GTKDOC_MKPDF"; then
+    enable_gtk_doc_pdf=no
+  fi
+
+
+   if test x$enable_gtk_doc = xyes; then
+  ENABLE_GTK_DOC_TRUE=
+  ENABLE_GTK_DOC_FALSE='#'
+else
+  ENABLE_GTK_DOC_TRUE='#'
+  ENABLE_GTK_DOC_FALSE=
+fi
+
+   if test x$enable_gtk_doc_html = xyes; then
+  GTK_DOC_BUILD_HTML_TRUE=
+  GTK_DOC_BUILD_HTML_FALSE='#'
+else
+  GTK_DOC_BUILD_HTML_TRUE='#'
+  GTK_DOC_BUILD_HTML_FALSE=
+fi
+
+   if test x$enable_gtk_doc_pdf = xyes; then
+  GTK_DOC_BUILD_PDF_TRUE=
+  GTK_DOC_BUILD_PDF_FALSE='#'
+else
+  GTK_DOC_BUILD_PDF_TRUE='#'
+  GTK_DOC_BUILD_PDF_FALSE=
+fi
+
+   if test -n "$LIBTOOL"; then
+  GTK_DOC_USE_LIBTOOL_TRUE=
+  GTK_DOC_USE_LIBTOOL_FALSE='#'
+else
+  GTK_DOC_USE_LIBTOOL_TRUE='#'
+  GTK_DOC_USE_LIBTOOL_FALSE=
+fi
+
+   if test -n "$GTKDOC_REBASE"; then
+  GTK_DOC_USE_REBASE_TRUE=
+  GTK_DOC_USE_REBASE_FALSE='#'
+else
+  GTK_DOC_USE_REBASE_TRUE='#'
+  GTK_DOC_USE_REBASE_FALSE=
+fi
+
+
+
+
+# Check whether --enable-poppler-qt4 was given.
+if test "${enable_poppler_qt4+set}" = set; then :
+  enableval=$enable_poppler_qt4; enable_poppler_qt4=$enableval
+else
+  enable_poppler_qt4="try"
+fi
+
+if test x$enable_poppler_qt4 = xyes; then
+
+pkg_failed=no
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for POPPLER_QT4" >&5
+$as_echo_n "checking for POPPLER_QT4... " >&6; }
+
+if test -n "$POPPLER_QT4_CFLAGS"; then
+    pkg_cv_POPPLER_QT4_CFLAGS="$POPPLER_QT4_CFLAGS"
+ elif test -n "$PKG_CONFIG"; then
+    if test -n "$PKG_CONFIG" && \
+    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"QtCore >= 4.4.0 QtGui >= 4.4.0 QtXml >= 4.4.0\""; } >&5
+  ($PKG_CONFIG --exists --print-errors "QtCore >= 4.4.0 QtGui >= 4.4.0 QtXml >= 4.4.0") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then
+  pkg_cv_POPPLER_QT4_CFLAGS=`$PKG_CONFIG --cflags "QtCore >= 4.4.0 QtGui >= 4.4.0 QtXml >= 4.4.0" 2>/dev/null`
+                     test "x$?" != "x0" && pkg_failed=yes
+else
+  pkg_failed=yes
+fi
+ else
+    pkg_failed=untried
+fi
+if test -n "$POPPLER_QT4_LIBS"; then
+    pkg_cv_POPPLER_QT4_LIBS="$POPPLER_QT4_LIBS"
+ elif test -n "$PKG_CONFIG"; then
+    if test -n "$PKG_CONFIG" && \
+    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"QtCore >= 4.4.0 QtGui >= 4.4.0 QtXml >= 4.4.0\""; } >&5
+  ($PKG_CONFIG --exists --print-errors "QtCore >= 4.4.0 QtGui >= 4.4.0 QtXml >= 4.4.0") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then
+  pkg_cv_POPPLER_QT4_LIBS=`$PKG_CONFIG --libs "QtCore >= 4.4.0 QtGui >= 4.4.0 QtXml >= 4.4.0" 2>/dev/null`
+                     test "x$?" != "x0" && pkg_failed=yes
+else
+  pkg_failed=yes
+fi
+ else
+    pkg_failed=untried
+fi
+
+
+
+if test $pkg_failed = yes; then
+       { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+
+if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
+        _pkg_short_errors_supported=yes
+else
+        _pkg_short_errors_supported=no
+fi
+        if test $_pkg_short_errors_supported = yes; then
+               POPPLER_QT4_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "QtCore >= 4.4.0 QtGui >= 4.4.0 QtXml >= 4.4.0" 2>&1`
+        else
+               POPPLER_QT4_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "QtCore >= 4.4.0 QtGui >= 4.4.0 QtXml >= 4.4.0" 2>&1`
+        fi
+       # Put the nasty error message in config.log where it belongs
+       echo "$POPPLER_QT4_PKG_ERRORS" >&5
+
+       as_fn_error $? "Package requirements (QtCore >= 4.4.0 QtGui >= 4.4.0 QtXml >= 4.4.0) were not met:
+
+$POPPLER_QT4_PKG_ERRORS
+
+Consider adjusting the PKG_CONFIG_PATH environment variable if you
+installed software in a non-standard prefix.
+
+Alternatively, you may set the environment variables POPPLER_QT4_CFLAGS
+and POPPLER_QT4_LIBS to avoid the need to call pkg-config.
+See the pkg-config man page for more details." "$LINENO" 5
+elif test $pkg_failed = untried; then
+       { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+       { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "The pkg-config script could not be found or is too old.  Make sure it
+is in your PATH or set the PKG_CONFIG environment variable to the full
+path to pkg-config.
+
+Alternatively, you may set the environment variables POPPLER_QT4_CFLAGS
+and POPPLER_QT4_LIBS to avoid the need to call pkg-config.
+See the pkg-config man page for more details.
+
+To get pkg-config, see <http://pkg-config.freedesktop.org/>.
+See \`config.log' for more details" "$LINENO" 5; }
+else
+       POPPLER_QT4_CFLAGS=$pkg_cv_POPPLER_QT4_CFLAGS
+       POPPLER_QT4_LIBS=$pkg_cv_POPPLER_QT4_LIBS
+        { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+
+fi
+
+pkg_failed=no
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for POPPLER_QT4_TEST" >&5
+$as_echo_n "checking for POPPLER_QT4_TEST... " >&6; }
+
+if test -n "$POPPLER_QT4_TEST_CFLAGS"; then
+    pkg_cv_POPPLER_QT4_TEST_CFLAGS="$POPPLER_QT4_TEST_CFLAGS"
+ elif test -n "$PKG_CONFIG"; then
+    if test -n "$PKG_CONFIG" && \
+    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"QtTest >= 4.4.0\""; } >&5
+  ($PKG_CONFIG --exists --print-errors "QtTest >= 4.4.0") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then
+  pkg_cv_POPPLER_QT4_TEST_CFLAGS=`$PKG_CONFIG --cflags "QtTest >= 4.4.0" 2>/dev/null`
+                     test "x$?" != "x0" && pkg_failed=yes
+else
+  pkg_failed=yes
+fi
+ else
+    pkg_failed=untried
+fi
+if test -n "$POPPLER_QT4_TEST_LIBS"; then
+    pkg_cv_POPPLER_QT4_TEST_LIBS="$POPPLER_QT4_TEST_LIBS"
+ elif test -n "$PKG_CONFIG"; then
+    if test -n "$PKG_CONFIG" && \
+    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"QtTest >= 4.4.0\""; } >&5
+  ($PKG_CONFIG --exists --print-errors "QtTest >= 4.4.0") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then
+  pkg_cv_POPPLER_QT4_TEST_LIBS=`$PKG_CONFIG --libs "QtTest >= 4.4.0" 2>/dev/null`
+                     test "x$?" != "x0" && pkg_failed=yes
+else
+  pkg_failed=yes
+fi
+ else
+    pkg_failed=untried
+fi
+
+
+
+if test $pkg_failed = yes; then
+       { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+
+if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
+        _pkg_short_errors_supported=yes
+else
+        _pkg_short_errors_supported=no
+fi
+        if test $_pkg_short_errors_supported = yes; then
+               POPPLER_QT4_TEST_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "QtTest >= 4.4.0" 2>&1`
+        else
+               POPPLER_QT4_TEST_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "QtTest >= 4.4.0" 2>&1`
+        fi
+       # Put the nasty error message in config.log where it belongs
+       echo "$POPPLER_QT4_TEST_PKG_ERRORS" >&5
+
+       as_fn_error $? "Package requirements (QtTest >= 4.4.0) were not met:
+
+$POPPLER_QT4_TEST_PKG_ERRORS
+
+Consider adjusting the PKG_CONFIG_PATH environment variable if you
+installed software in a non-standard prefix.
+
+Alternatively, you may set the environment variables POPPLER_QT4_TEST_CFLAGS
+and POPPLER_QT4_TEST_LIBS to avoid the need to call pkg-config.
+See the pkg-config man page for more details." "$LINENO" 5
+elif test $pkg_failed = untried; then
+       { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+       { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "The pkg-config script could not be found or is too old.  Make sure it
+is in your PATH or set the PKG_CONFIG environment variable to the full
+path to pkg-config.
+
+Alternatively, you may set the environment variables POPPLER_QT4_TEST_CFLAGS
+and POPPLER_QT4_TEST_LIBS to avoid the need to call pkg-config.
+See the pkg-config man page for more details.
+
+To get pkg-config, see <http://pkg-config.freedesktop.org/>.
+See \`config.log' for more details" "$LINENO" 5; }
+else
+       POPPLER_QT4_TEST_CFLAGS=$pkg_cv_POPPLER_QT4_TEST_CFLAGS
+       POPPLER_QT4_TEST_LIBS=$pkg_cv_POPPLER_QT4_TEST_LIBS
+        { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+
+fi
+elif test x$enable_poppler_qt4 = xtry; then
+
+pkg_failed=no
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for POPPLER_QT4" >&5
+$as_echo_n "checking for POPPLER_QT4... " >&6; }
+
+if test -n "$POPPLER_QT4_CFLAGS"; then
+    pkg_cv_POPPLER_QT4_CFLAGS="$POPPLER_QT4_CFLAGS"
+ elif test -n "$PKG_CONFIG"; then
+    if test -n "$PKG_CONFIG" && \
+    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"QtCore >= 4.4.0 QtGui >= 4.4.0 QtXml >= 4.4.0\""; } >&5
+  ($PKG_CONFIG --exists --print-errors "QtCore >= 4.4.0 QtGui >= 4.4.0 QtXml >= 4.4.0") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then
+  pkg_cv_POPPLER_QT4_CFLAGS=`$PKG_CONFIG --cflags "QtCore >= 4.4.0 QtGui >= 4.4.0 QtXml >= 4.4.0" 2>/dev/null`
+                     test "x$?" != "x0" && pkg_failed=yes
+else
+  pkg_failed=yes
+fi
+ else
+    pkg_failed=untried
+fi
+if test -n "$POPPLER_QT4_LIBS"; then
+    pkg_cv_POPPLER_QT4_LIBS="$POPPLER_QT4_LIBS"
+ elif test -n "$PKG_CONFIG"; then
+    if test -n "$PKG_CONFIG" && \
+    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"QtCore >= 4.4.0 QtGui >= 4.4.0 QtXml >= 4.4.0\""; } >&5
+  ($PKG_CONFIG --exists --print-errors "QtCore >= 4.4.0 QtGui >= 4.4.0 QtXml >= 4.4.0") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then
+  pkg_cv_POPPLER_QT4_LIBS=`$PKG_CONFIG --libs "QtCore >= 4.4.0 QtGui >= 4.4.0 QtXml >= 4.4.0" 2>/dev/null`
+                     test "x$?" != "x0" && pkg_failed=yes
+else
+  pkg_failed=yes
+fi
+ else
+    pkg_failed=untried
+fi
+
+
+
+if test $pkg_failed = yes; then
+       { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+
+if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
+        _pkg_short_errors_supported=yes
+else
+        _pkg_short_errors_supported=no
+fi
+        if test $_pkg_short_errors_supported = yes; then
+               POPPLER_QT4_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "QtCore >= 4.4.0 QtGui >= 4.4.0 QtXml >= 4.4.0" 2>&1`
+        else
+               POPPLER_QT4_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "QtCore >= 4.4.0 QtGui >= 4.4.0 QtXml >= 4.4.0" 2>&1`
+        fi
+       # Put the nasty error message in config.log where it belongs
+       echo "$POPPLER_QT4_PKG_ERRORS" >&5
+
+       enable_poppler_qt4="no"
+elif test $pkg_failed = untried; then
+       { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+       enable_poppler_qt4="no"
+else
+       POPPLER_QT4_CFLAGS=$pkg_cv_POPPLER_QT4_CFLAGS
+       POPPLER_QT4_LIBS=$pkg_cv_POPPLER_QT4_LIBS
+        { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+       enable_poppler_qt4="yes"
+fi
+  if test x$enable_poppler_qt4 = xyes; then
+
+pkg_failed=no
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for POPPLER_QT4_TEST" >&5
+$as_echo_n "checking for POPPLER_QT4_TEST... " >&6; }
+
+if test -n "$POPPLER_QT4_TEST_CFLAGS"; then
+    pkg_cv_POPPLER_QT4_TEST_CFLAGS="$POPPLER_QT4_TEST_CFLAGS"
+ elif test -n "$PKG_CONFIG"; then
+    if test -n "$PKG_CONFIG" && \
+    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"QtTest >= 4.4.0\""; } >&5
+  ($PKG_CONFIG --exists --print-errors "QtTest >= 4.4.0") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then
+  pkg_cv_POPPLER_QT4_TEST_CFLAGS=`$PKG_CONFIG --cflags "QtTest >= 4.4.0" 2>/dev/null`
+                     test "x$?" != "x0" && pkg_failed=yes
+else
+  pkg_failed=yes
+fi
+ else
+    pkg_failed=untried
+fi
+if test -n "$POPPLER_QT4_TEST_LIBS"; then
+    pkg_cv_POPPLER_QT4_TEST_LIBS="$POPPLER_QT4_TEST_LIBS"
+ elif test -n "$PKG_CONFIG"; then
+    if test -n "$PKG_CONFIG" && \
+    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"QtTest >= 4.4.0\""; } >&5
+  ($PKG_CONFIG --exists --print-errors "QtTest >= 4.4.0") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then
+  pkg_cv_POPPLER_QT4_TEST_LIBS=`$PKG_CONFIG --libs "QtTest >= 4.4.0" 2>/dev/null`
+                     test "x$?" != "x0" && pkg_failed=yes
+else
+  pkg_failed=yes
+fi
+ else
+    pkg_failed=untried
+fi
+
+
+
+if test $pkg_failed = yes; then
+       { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+
+if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
+        _pkg_short_errors_supported=yes
+else
+        _pkg_short_errors_supported=no
+fi
+        if test $_pkg_short_errors_supported = yes; then
+               POPPLER_QT4_TEST_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "QtTest >= 4.4.0" 2>&1`
+        else
+               POPPLER_QT4_TEST_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "QtTest >= 4.4.0" 2>&1`
+        fi
+       # Put the nasty error message in config.log where it belongs
+       echo "$POPPLER_QT4_TEST_PKG_ERRORS" >&5
+
+       enable_poppler_qt4="no"
+elif test $pkg_failed = untried; then
+       { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+       enable_poppler_qt4="no"
+else
+       POPPLER_QT4_TEST_CFLAGS=$pkg_cv_POPPLER_QT4_TEST_CFLAGS
+       POPPLER_QT4_TEST_LIBS=$pkg_cv_POPPLER_QT4_TEST_LIBS
+        { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+       enable_poppler_qt4="yes"
+fi
+  fi
+fi
+
+
+
+
+
+if test x$enable_poppler_qt4 = xyes; then
+  if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}moc", so it can be a program name with args.
+set dummy ${ac_tool_prefix}moc; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_MOCQT4+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$MOCQT4"; then
+  ac_cv_prog_MOCQT4="$MOCQT4" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_MOCQT4="${ac_tool_prefix}moc"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+MOCQT4=$ac_cv_prog_MOCQT4
+if test -n "$MOCQT4"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MOCQT4" >&5
+$as_echo "$MOCQT4" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_MOCQT4"; then
+  ac_ct_MOCQT4=$MOCQT4
+  # Extract the first word of "moc", so it can be a program name with args.
+set dummy moc; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_MOCQT4+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$ac_ct_MOCQT4"; then
+  ac_cv_prog_ac_ct_MOCQT4="$ac_ct_MOCQT4" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_ac_ct_MOCQT4="moc"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_MOCQT4=$ac_cv_prog_ac_ct_MOCQT4
+if test -n "$ac_ct_MOCQT4"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_MOCQT4" >&5
+$as_echo "$ac_ct_MOCQT4" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+  if test "x$ac_ct_MOCQT4" = x; then
+    MOCQT4=""
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    MOCQT4=$ac_ct_MOCQT4
+  fi
+else
+  MOCQT4="$ac_cv_prog_MOCQT4"
+fi
+
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Qt4 moc" >&5
+$as_echo_n "checking for Qt4 moc... " >&6; }
+  mocversion=`$MOCQT4 -v 2>&1`
+  mocversiongrep=`echo $mocversion | grep "Qt 4"`
+  if test x"$mocversiongrep" != x"$mocversion"; then
+    { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+    # moc was not the qt4 one, try with moc-qt4
+    if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}moc-qt4", so it can be a program name with args.
+set dummy ${ac_tool_prefix}moc-qt4; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_MOCQT4+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$MOCQT4"; then
+  ac_cv_prog_MOCQT4="$MOCQT4" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_MOCQT4="${ac_tool_prefix}moc-qt4"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+MOCQT4=$ac_cv_prog_MOCQT4
+if test -n "$MOCQT4"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MOCQT4" >&5
+$as_echo "$MOCQT4" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_MOCQT4"; then
+  ac_ct_MOCQT4=$MOCQT4
+  # Extract the first word of "moc-qt4", so it can be a program name with args.
+set dummy moc-qt4; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_MOCQT4+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$ac_ct_MOCQT4"; then
+  ac_cv_prog_ac_ct_MOCQT4="$ac_ct_MOCQT4" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_ac_ct_MOCQT4="moc-qt4"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_MOCQT4=$ac_cv_prog_ac_ct_MOCQT4
+if test -n "$ac_ct_MOCQT4"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_MOCQT4" >&5
+$as_echo "$ac_ct_MOCQT4" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+  if test "x$ac_ct_MOCQT4" = x; then
+    MOCQT4=""
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    MOCQT4=$ac_ct_MOCQT4
+  fi
+else
+  MOCQT4="$ac_cv_prog_MOCQT4"
+fi
+
+    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Qt4 moc-qt4" >&5
+$as_echo_n "checking for Qt4 moc-qt4... " >&6; }
+    mocversion=`$MOCQT4 -v 2>&1`
+    mocversiongrep=`echo $mocversion | grep "Qt 4"`
+    if test x"$mocversiongrep" != x"$mocversion"; then
+      # no valid moc found
+      enable_poppler_qt4=no;
+      MOCQT4="not found"
+    fi
+  fi
+
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MOCQT4" >&5
+$as_echo "$MOCQT4" >&6; }
+fi
+
+ if test "x$enable_poppler_qt4" = "xyes"; then
+  BUILD_POPPLER_QT4_TRUE=
+  BUILD_POPPLER_QT4_FALSE='#'
+else
+  BUILD_POPPLER_QT4_TRUE='#'
+  BUILD_POPPLER_QT4_FALSE=
+fi
+
+
+
+# Check whether --enable-poppler-cpp was given.
+if test "${enable_poppler_cpp+set}" = set; then :
+  enableval=$enable_poppler_cpp; enable_poppler_cpp=$enableval
+else
+  enable_poppler_cpp="yes"
+fi
+
+if test x$enable_poppler_cpp = xyes; then
+
+      if test "X$prefix" = "XNONE"; then
+    acl_final_prefix="$ac_default_prefix"
+  else
+    acl_final_prefix="$prefix"
+  fi
+  if test "X$exec_prefix" = "XNONE"; then
+    acl_final_exec_prefix='${prefix}'
+  else
+    acl_final_exec_prefix="$exec_prefix"
+  fi
+  acl_save_prefix="$prefix"
+  prefix="$acl_final_prefix"
+  eval acl_final_exec_prefix=\"$acl_final_exec_prefix\"
+  prefix="$acl_save_prefix"
+
+
+
+  acl_libdirstem=lib
+  acl_libdirstem2=
+  case "$host_os" in
+    solaris*)
+                                    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for 64-bit host" >&5
+$as_echo_n "checking for 64-bit host... " >&6; }
+if ${gl_cv_solaris_64bit+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+#ifdef _LP64
+sixtyfour bits
+#endif
+
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+  $EGREP "sixtyfour bits" >/dev/null 2>&1; then :
+  gl_cv_solaris_64bit=yes
+else
+  gl_cv_solaris_64bit=no
+fi
+rm -f conftest*
+
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_solaris_64bit" >&5
+$as_echo "$gl_cv_solaris_64bit" >&6; }
+      if test $gl_cv_solaris_64bit = yes; then
+        acl_libdirstem=lib/64
+        case "$host_cpu" in
+          sparc*)        acl_libdirstem2=lib/sparcv9 ;;
+          i*86 | x86_64) acl_libdirstem2=lib/amd64 ;;
+        esac
+      fi
+      ;;
+    *)
+      searchpath=`(LC_ALL=C $CC -print-search-dirs) 2>/dev/null | sed -n -e 's,^libraries: ,,p' | sed -e 's,^=,,'`
+      if test -n "$searchpath"; then
+        acl_save_IFS="${IFS=   }"; IFS=":"
+        for searchdir in $searchpath; do
+          if test -d "$searchdir"; then
+            case "$searchdir" in
+              */lib64/ | */lib64 ) acl_libdirstem=lib64 ;;
+              */../ | */.. )
+                # Better ignore directories of this form. They are misleading.
+                ;;
+              *) searchdir=`cd "$searchdir" && pwd`
+                 case "$searchdir" in
+                   */lib64 ) acl_libdirstem=lib64 ;;
+                 esac ;;
+            esac
+          fi
+        done
+        IFS="$acl_save_IFS"
+      fi
+      ;;
+  esac
+  test -n "$acl_libdirstem2" || acl_libdirstem2="$acl_libdirstem"
+
+
+
+
+
+
+
+
+
+
+
+    use_additional=yes
+
+  acl_save_prefix="$prefix"
+  prefix="$acl_final_prefix"
+  acl_save_exec_prefix="$exec_prefix"
+  exec_prefix="$acl_final_exec_prefix"
+
+    eval additional_includedir=\"$includedir\"
+    eval additional_libdir=\"$libdir\"
+
+  exec_prefix="$acl_save_exec_prefix"
+  prefix="$acl_save_prefix"
+
+
+# Check whether --with-libiconv-prefix was given.
+if test "${with_libiconv_prefix+set}" = set; then :
+  withval=$with_libiconv_prefix;
+    if test "X$withval" = "Xno"; then
+      use_additional=no
+    else
+      if test "X$withval" = "X"; then
+
+  acl_save_prefix="$prefix"
+  prefix="$acl_final_prefix"
+  acl_save_exec_prefix="$exec_prefix"
+  exec_prefix="$acl_final_exec_prefix"
+
+          eval additional_includedir=\"$includedir\"
+          eval additional_libdir=\"$libdir\"
+
+  exec_prefix="$acl_save_exec_prefix"
+  prefix="$acl_save_prefix"
+
+      else
+        additional_includedir="$withval/include"
+        additional_libdir="$withval/$acl_libdirstem"
+        if test "$acl_libdirstem2" != "$acl_libdirstem" \
+           && ! test -d "$withval/$acl_libdirstem"; then
+          additional_libdir="$withval/$acl_libdirstem2"
+        fi
+      fi
+    fi
+
+fi
+
+      LIBICONV=
+  LTLIBICONV=
+  INCICONV=
+  LIBICONV_PREFIX=
+      HAVE_LIBICONV=
+  rpathdirs=
+  ltrpathdirs=
+  names_already_handled=
+  names_next_round='iconv '
+  while test -n "$names_next_round"; do
+    names_this_round="$names_next_round"
+    names_next_round=
+    for name in $names_this_round; do
+      already_handled=
+      for n in $names_already_handled; do
+        if test "$n" = "$name"; then
+          already_handled=yes
+          break
+        fi
+      done
+      if test -z "$already_handled"; then
+        names_already_handled="$names_already_handled $name"
+                        uppername=`echo "$name" | sed -e 'y|abcdefghijklmnopqrstuvwxyz./-|ABCDEFGHIJKLMNOPQRSTUVWXYZ___|'`
+        eval value=\"\$HAVE_LIB$uppername\"
+        if test -n "$value"; then
+          if test "$value" = yes; then
+            eval value=\"\$LIB$uppername\"
+            test -z "$value" || LIBICONV="${LIBICONV}${LIBICONV:+ }$value"
+            eval value=\"\$LTLIB$uppername\"
+            test -z "$value" || LTLIBICONV="${LTLIBICONV}${LTLIBICONV:+ }$value"
+          else
+                                    :
+          fi
+        else
+                              found_dir=
+          found_la=
+          found_so=
+          found_a=
+          eval libname=\"$acl_libname_spec\"    # typically: libname=lib$name
+          if test -n "$acl_shlibext"; then
+            shrext=".$acl_shlibext"             # typically: shrext=.so
+          else
+            shrext=
+          fi
+          if test $use_additional = yes; then
+            dir="$additional_libdir"
+                                    if test -n "$acl_shlibext"; then
+              if test -f "$dir/$libname$shrext"; then
+                found_dir="$dir"
+                found_so="$dir/$libname$shrext"
+              else
+                if test "$acl_library_names_spec" = '$libname$shrext$versuffix'; then
+                  ver=`(cd "$dir" && \
+                        for f in "$libname$shrext".*; do echo "$f"; done \
+                        | sed -e "s,^$libname$shrext\\\\.,," \
+                        | sort -t '.' -n -r -k1,1 -k2,2 -k3,3 -k4,4 -k5,5 \
+                        | sed 1q ) 2>/dev/null`
+                  if test -n "$ver" && test -f "$dir/$libname$shrext.$ver"; then
+                    found_dir="$dir"
+                    found_so="$dir/$libname$shrext.$ver"
+                  fi
+                else
+                  eval library_names=\"$acl_library_names_spec\"
+                  for f in $library_names; do
+                    if test -f "$dir/$f"; then
+                      found_dir="$dir"
+                      found_so="$dir/$f"
+                      break
+                    fi
+                  done
+                fi
+              fi
+            fi
+                        if test "X$found_dir" = "X"; then
+              if test -f "$dir/$libname.$acl_libext"; then
+                found_dir="$dir"
+                found_a="$dir/$libname.$acl_libext"
+              fi
+            fi
+            if test "X$found_dir" != "X"; then
+              if test -f "$dir/$libname.la"; then
+                found_la="$dir/$libname.la"
+              fi
+            fi
+          fi
+          if test "X$found_dir" = "X"; then
+            for x in $LDFLAGS $LTLIBICONV; do
+
+  acl_save_prefix="$prefix"
+  prefix="$acl_final_prefix"
+  acl_save_exec_prefix="$exec_prefix"
+  exec_prefix="$acl_final_exec_prefix"
+  eval x=\"$x\"
+  exec_prefix="$acl_save_exec_prefix"
+  prefix="$acl_save_prefix"
+
+              case "$x" in
+                -L*)
+                  dir=`echo "X$x" | sed -e 's/^X-L//'`
+                                    if test -n "$acl_shlibext"; then
+                    if test -f "$dir/$libname$shrext"; then
+                      found_dir="$dir"
+                      found_so="$dir/$libname$shrext"
+                    else
+                      if test "$acl_library_names_spec" = '$libname$shrext$versuffix'; then
+                        ver=`(cd "$dir" && \
+                              for f in "$libname$shrext".*; do echo "$f"; done \
+                              | sed -e "s,^$libname$shrext\\\\.,," \
+                              | sort -t '.' -n -r -k1,1 -k2,2 -k3,3 -k4,4 -k5,5 \
+                              | sed 1q ) 2>/dev/null`
+                        if test -n "$ver" && test -f "$dir/$libname$shrext.$ver"; then
+                          found_dir="$dir"
+                          found_so="$dir/$libname$shrext.$ver"
+                        fi
+                      else
+                        eval library_names=\"$acl_library_names_spec\"
+                        for f in $library_names; do
+                          if test -f "$dir/$f"; then
+                            found_dir="$dir"
+                            found_so="$dir/$f"
+                            break
+                          fi
+                        done
+                      fi
+                    fi
+                  fi
+                                    if test "X$found_dir" = "X"; then
+                    if test -f "$dir/$libname.$acl_libext"; then
+                      found_dir="$dir"
+                      found_a="$dir/$libname.$acl_libext"
+                    fi
+                  fi
+                  if test "X$found_dir" != "X"; then
+                    if test -f "$dir/$libname.la"; then
+                      found_la="$dir/$libname.la"
+                    fi
+                  fi
+                  ;;
+              esac
+              if test "X$found_dir" != "X"; then
+                break
+              fi
+            done
+          fi
+          if test "X$found_dir" != "X"; then
+                        LTLIBICONV="${LTLIBICONV}${LTLIBICONV:+ }-L$found_dir -l$name"
+            if test "X$found_so" != "X"; then
+                                                        if test "$enable_rpath" = no \
+                 || test "X$found_dir" = "X/usr/$acl_libdirstem" \
+                 || test "X$found_dir" = "X/usr/$acl_libdirstem2"; then
+                                LIBICONV="${LIBICONV}${LIBICONV:+ }$found_so"
+              else
+                                                                                haveit=
+                for x in $ltrpathdirs; do
+                  if test "X$x" = "X$found_dir"; then
+                    haveit=yes
+                    break
+                  fi
+                done
+                if test -z "$haveit"; then
+                  ltrpathdirs="$ltrpathdirs $found_dir"
+                fi
+                                if test "$acl_hardcode_direct" = yes; then
+                                                      LIBICONV="${LIBICONV}${LIBICONV:+ }$found_so"
+                else
+                  if test -n "$acl_hardcode_libdir_flag_spec" && test "$acl_hardcode_minus_L" = no; then
+                                                            LIBICONV="${LIBICONV}${LIBICONV:+ }$found_so"
+                                                            haveit=
+                    for x in $rpathdirs; do
+                      if test "X$x" = "X$found_dir"; then
+                        haveit=yes
+                        break
+                      fi
+                    done
+                    if test -z "$haveit"; then
+                      rpathdirs="$rpathdirs $found_dir"
+                    fi
+                  else
+                                                                                haveit=
+                    for x in $LDFLAGS $LIBICONV; do
+
+  acl_save_prefix="$prefix"
+  prefix="$acl_final_prefix"
+  acl_save_exec_prefix="$exec_prefix"
+  exec_prefix="$acl_final_exec_prefix"
+  eval x=\"$x\"
+  exec_prefix="$acl_save_exec_prefix"
+  prefix="$acl_save_prefix"
+
+                      if test "X$x" = "X-L$found_dir"; then
+                        haveit=yes
+                        break
+                      fi
+                    done
+                    if test -z "$haveit"; then
+                      LIBICONV="${LIBICONV}${LIBICONV:+ }-L$found_dir"
+                    fi
+                    if test "$acl_hardcode_minus_L" != no; then
+                                                                                        LIBICONV="${LIBICONV}${LIBICONV:+ }$found_so"
+                    else
+                                                                                                                                                                                LIBICONV="${LIBICONV}${LIBICONV:+ }-l$name"
+                    fi
+                  fi
+                fi
+              fi
+            else
+              if test "X$found_a" != "X"; then
+                                LIBICONV="${LIBICONV}${LIBICONV:+ }$found_a"
+              else
+                                                LIBICONV="${LIBICONV}${LIBICONV:+ }-L$found_dir -l$name"
+              fi
+            fi
+                        additional_includedir=
+            case "$found_dir" in
+              */$acl_libdirstem | */$acl_libdirstem/)
+                basedir=`echo "X$found_dir" | sed -e 's,^X,,' -e "s,/$acl_libdirstem/"'*$,,'`
+                if test "$name" = 'iconv'; then
+                  LIBICONV_PREFIX="$basedir"
+                fi
+                additional_includedir="$basedir/include"
+                ;;
+              */$acl_libdirstem2 | */$acl_libdirstem2/)
+                basedir=`echo "X$found_dir" | sed -e 's,^X,,' -e "s,/$acl_libdirstem2/"'*$,,'`
+                if test "$name" = 'iconv'; then
+                  LIBICONV_PREFIX="$basedir"
+                fi
+                additional_includedir="$basedir/include"
+                ;;
+            esac
+            if test "X$additional_includedir" != "X"; then
+                                                                                                                if test "X$additional_includedir" != "X/usr/include"; then
+                haveit=
+                if test "X$additional_includedir" = "X/usr/local/include"; then
+                  if test -n "$GCC"; then
+                    case $host_os in
+                      linux* | gnu* | k*bsd*-gnu) haveit=yes;;
+                    esac
+                  fi
+                fi
+                if test -z "$haveit"; then
+                  for x in $CPPFLAGS $INCICONV; do
+
+  acl_save_prefix="$prefix"
+  prefix="$acl_final_prefix"
+  acl_save_exec_prefix="$exec_prefix"
+  exec_prefix="$acl_final_exec_prefix"
+  eval x=\"$x\"
+  exec_prefix="$acl_save_exec_prefix"
+  prefix="$acl_save_prefix"
+
+                    if test "X$x" = "X-I$additional_includedir"; then
+                      haveit=yes
+                      break
+                    fi
+                  done
+                  if test -z "$haveit"; then
+                    if test -d "$additional_includedir"; then
+                                            INCICONV="${INCICONV}${INCICONV:+ }-I$additional_includedir"
+                    fi
+                  fi
+                fi
+              fi
+            fi
+                        if test -n "$found_la"; then
+                                                        save_libdir="$libdir"
+              case "$found_la" in
+                */* | *\\*) . "$found_la" ;;
+                *) . "./$found_la" ;;
+              esac
+              libdir="$save_libdir"
+                            for dep in $dependency_libs; do
+                case "$dep" in
+                  -L*)
+                    additional_libdir=`echo "X$dep" | sed -e 's/^X-L//'`
+                                                                                                                                                                if test "X$additional_libdir" != "X/usr/$acl_libdirstem" \
+                       && test "X$additional_libdir" != "X/usr/$acl_libdirstem2"; then
+                      haveit=
+                      if test "X$additional_libdir" = "X/usr/local/$acl_libdirstem" \
+                         || test "X$additional_libdir" = "X/usr/local/$acl_libdirstem2"; then
+                        if test -n "$GCC"; then
+                          case $host_os in
+                            linux* | gnu* | k*bsd*-gnu) haveit=yes;;
+                          esac
+                        fi
+                      fi
+                      if test -z "$haveit"; then
+                        haveit=
+                        for x in $LDFLAGS $LIBICONV; do
+
+  acl_save_prefix="$prefix"
+  prefix="$acl_final_prefix"
+  acl_save_exec_prefix="$exec_prefix"
+  exec_prefix="$acl_final_exec_prefix"
+  eval x=\"$x\"
+  exec_prefix="$acl_save_exec_prefix"
+  prefix="$acl_save_prefix"
+
+                          if test "X$x" = "X-L$additional_libdir"; then
+                            haveit=yes
+                            break
+                          fi
+                        done
+                        if test -z "$haveit"; then
+                          if test -d "$additional_libdir"; then
+                                                        LIBICONV="${LIBICONV}${LIBICONV:+ }-L$additional_libdir"
+                          fi
+                        fi
+                        haveit=
+                        for x in $LDFLAGS $LTLIBICONV; do
+
+  acl_save_prefix="$prefix"
+  prefix="$acl_final_prefix"
+  acl_save_exec_prefix="$exec_prefix"
+  exec_prefix="$acl_final_exec_prefix"
+  eval x=\"$x\"
+  exec_prefix="$acl_save_exec_prefix"
+  prefix="$acl_save_prefix"
+
+                          if test "X$x" = "X-L$additional_libdir"; then
+                            haveit=yes
+                            break
+                          fi
+                        done
+                        if test -z "$haveit"; then
+                          if test -d "$additional_libdir"; then
+                                                        LTLIBICONV="${LTLIBICONV}${LTLIBICONV:+ }-L$additional_libdir"
+                          fi
+                        fi
+                      fi
+                    fi
+                    ;;
+                  -R*)
+                    dir=`echo "X$dep" | sed -e 's/^X-R//'`
+                    if test "$enable_rpath" != no; then
+                                                                  haveit=
+                      for x in $rpathdirs; do
+                        if test "X$x" = "X$dir"; then
+                          haveit=yes
+                          break
+                        fi
+                      done
+                      if test -z "$haveit"; then
+                        rpathdirs="$rpathdirs $dir"
+                      fi
+                                                                  haveit=
+                      for x in $ltrpathdirs; do
+                        if test "X$x" = "X$dir"; then
+                          haveit=yes
+                          break
+                        fi
+                      done
+                      if test -z "$haveit"; then
+                        ltrpathdirs="$ltrpathdirs $dir"
+                      fi
+                    fi
+                    ;;
+                  -l*)
+                                        names_next_round="$names_next_round "`echo "X$dep" | sed -e 's/^X-l//'`
+                    ;;
+                  *.la)
+                                                                                names_next_round="$names_next_round "`echo "X$dep" | sed -e 's,^X.*/,,' -e 's,^lib,,' -e 's,\.la$,,'`
+                    ;;
+                  *)
+                                        LIBICONV="${LIBICONV}${LIBICONV:+ }$dep"
+                    LTLIBICONV="${LTLIBICONV}${LTLIBICONV:+ }$dep"
+                    ;;
+                esac
+              done
+            fi
+          else
+                                                            LIBICONV="${LIBICONV}${LIBICONV:+ }-l$name"
+            LTLIBICONV="${LTLIBICONV}${LTLIBICONV:+ }-l$name"
+          fi
+        fi
+      fi
+    done
+  done
+  if test "X$rpathdirs" != "X"; then
+    if test -n "$acl_hardcode_libdir_separator"; then
+                        alldirs=
+      for found_dir in $rpathdirs; do
+        alldirs="${alldirs}${alldirs:+$acl_hardcode_libdir_separator}$found_dir"
+      done
+            acl_save_libdir="$libdir"
+      libdir="$alldirs"
+      eval flag=\"$acl_hardcode_libdir_flag_spec\"
+      libdir="$acl_save_libdir"
+      LIBICONV="${LIBICONV}${LIBICONV:+ }$flag"
+    else
+            for found_dir in $rpathdirs; do
+        acl_save_libdir="$libdir"
+        libdir="$found_dir"
+        eval flag=\"$acl_hardcode_libdir_flag_spec\"
+        libdir="$acl_save_libdir"
+        LIBICONV="${LIBICONV}${LIBICONV:+ }$flag"
+      done
+    fi
+  fi
+  if test "X$ltrpathdirs" != "X"; then
+            for found_dir in $ltrpathdirs; do
+      LTLIBICONV="${LTLIBICONV}${LTLIBICONV:+ }-R$found_dir"
+    done
+  fi
+
+
+
+
+
+
+
+
+
+
+
+
+          am_save_CPPFLAGS="$CPPFLAGS"
+
+  for element in $INCICONV; do
+    haveit=
+    for x in $CPPFLAGS; do
+
+  acl_save_prefix="$prefix"
+  prefix="$acl_final_prefix"
+  acl_save_exec_prefix="$exec_prefix"
+  exec_prefix="$acl_final_exec_prefix"
+  eval x=\"$x\"
+  exec_prefix="$acl_save_exec_prefix"
+  prefix="$acl_save_prefix"
+
+      if test "X$x" = "X$element"; then
+        haveit=yes
+        break
+      fi
+    done
+    if test -z "$haveit"; then
+      CPPFLAGS="${CPPFLAGS}${CPPFLAGS:+ }$element"
+    fi
+  done
+
+
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for iconv" >&5
+$as_echo_n "checking for iconv... " >&6; }
+if ${am_cv_func_iconv+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+
+    am_cv_func_iconv="no, consider installing GNU libiconv"
+    am_cv_lib_iconv=no
+    cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <stdlib.h>
+#include <iconv.h>
+int
+main ()
+{
+iconv_t cd = iconv_open("","");
+       iconv(cd,NULL,NULL,NULL,NULL);
+       iconv_close(cd);
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  am_cv_func_iconv=yes
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+    if test "$am_cv_func_iconv" != yes; then
+      am_save_LIBS="$LIBS"
+      LIBS="$LIBS $LIBICONV"
+      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <stdlib.h>
+#include <iconv.h>
+int
+main ()
+{
+iconv_t cd = iconv_open("","");
+         iconv(cd,NULL,NULL,NULL,NULL);
+         iconv_close(cd);
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  am_cv_lib_iconv=yes
+        am_cv_func_iconv=yes
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+      LIBS="$am_save_LIBS"
+    fi
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_func_iconv" >&5
+$as_echo "$am_cv_func_iconv" >&6; }
+  if test "$am_cv_func_iconv" = yes; then
+    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for working iconv" >&5
+$as_echo_n "checking for working iconv... " >&6; }
+if ${am_cv_func_iconv_works+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+
+            am_save_LIBS="$LIBS"
+      if test $am_cv_lib_iconv = yes; then
+        LIBS="$LIBS $LIBICONV"
+      fi
+      if test "$cross_compiling" = yes; then :
+  case "$host_os" in
+           aix* | hpux*) am_cv_func_iconv_works="guessing no" ;;
+           *)            am_cv_func_iconv_works="guessing yes" ;;
+         esac
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+#include <iconv.h>
+#include <string.h>
+int main ()
+{
+  /* Test against AIX 5.1 bug: Failures are not distinguishable from successful
+     returns.  */
+  {
+    iconv_t cd_utf8_to_88591 = iconv_open ("ISO8859-1", "UTF-8");
+    if (cd_utf8_to_88591 != (iconv_t)(-1))
+      {
+        static const char input[] = "\342\202\254"; /* EURO SIGN */
+        char buf[10];
+        const char *inptr = input;
+        size_t inbytesleft = strlen (input);
+        char *outptr = buf;
+        size_t outbytesleft = sizeof (buf);
+        size_t res = iconv (cd_utf8_to_88591,
+                            (char **) &inptr, &inbytesleft,
+                            &outptr, &outbytesleft);
+        if (res == 0)
+          return 1;
+      }
+  }
+#if 0 /* This bug could be worked around by the caller.  */
+  /* Test against HP-UX 11.11 bug: Positive return value instead of 0.  */
+  {
+    iconv_t cd_88591_to_utf8 = iconv_open ("utf8", "iso88591");
+    if (cd_88591_to_utf8 != (iconv_t)(-1))
+      {
+        static const char input[] = "\304rger mit b\366sen B\374bchen ohne Augenma\337";
+        char buf[50];
+        const char *inptr = input;
+        size_t inbytesleft = strlen (input);
+        char *outptr = buf;
+        size_t outbytesleft = sizeof (buf);
+        size_t res = iconv (cd_88591_to_utf8,
+                            (char **) &inptr, &inbytesleft,
+                            &outptr, &outbytesleft);
+        if ((int)res > 0)
+          return 1;
+      }
+  }
+#endif
+  /* Test against HP-UX 11.11 bug: No converter from EUC-JP to UTF-8 is
+     provided.  */
+  if (/* Try standardized names.  */
+      iconv_open ("UTF-8", "EUC-JP") == (iconv_t)(-1)
+      /* Try IRIX, OSF/1 names.  */
+      && iconv_open ("UTF-8", "eucJP") == (iconv_t)(-1)
+      /* Try AIX names.  */
+      && iconv_open ("UTF-8", "IBM-eucJP") == (iconv_t)(-1)
+      /* Try HP-UX names.  */
+      && iconv_open ("utf8", "eucJP") == (iconv_t)(-1))
+    return 1;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_run "$LINENO"; then :
+  am_cv_func_iconv_works=yes
+else
+  am_cv_func_iconv_works=no
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+  conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+      LIBS="$am_save_LIBS"
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_func_iconv_works" >&5
+$as_echo "$am_cv_func_iconv_works" >&6; }
+    case "$am_cv_func_iconv_works" in
+      *no) am_func_iconv=no am_cv_lib_iconv=no ;;
+      *)   am_func_iconv=yes ;;
+    esac
+  else
+    am_func_iconv=no am_cv_lib_iconv=no
+  fi
+  if test "$am_func_iconv" = yes; then
+
+$as_echo "#define HAVE_ICONV 1" >>confdefs.h
+
+  fi
+  if test "$am_cv_lib_iconv" = yes; then
+    { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to link with libiconv" >&5
+$as_echo_n "checking how to link with libiconv... " >&6; }
+    { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LIBICONV" >&5
+$as_echo "$LIBICONV" >&6; }
+  else
+            CPPFLAGS="$am_save_CPPFLAGS"
+    LIBICONV=
+    LTLIBICONV=
+  fi
+
+
+
+  if test "$am_cv_func_iconv" = yes; then
+    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for iconv declaration" >&5
+$as_echo_n "checking for iconv declaration... " >&6; }
+    if ${am_cv_proto_iconv+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+
+      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+#include <stdlib.h>
+#include <iconv.h>
+extern
+#ifdef __cplusplus
+"C"
+#endif
+#if defined(__STDC__) || defined(__cplusplus)
+size_t iconv (iconv_t cd, char * *inbuf, size_t *inbytesleft, char * *outbuf, size_t *outbytesleft);
+#else
+size_t iconv();
+#endif
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  am_cv_proto_iconv_arg1=""
+else
+  am_cv_proto_iconv_arg1="const"
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+      am_cv_proto_iconv="extern size_t iconv (iconv_t cd, $am_cv_proto_iconv_arg1 char * *inbuf, size_t *inbytesleft, char * *outbuf, size_t *outbytesleft);"
+fi
+
+    am_cv_proto_iconv=`echo "$am_cv_proto_iconv" | tr -s ' ' | sed -e 's/( /(/'`
+    { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${ac_t:-
+         }$am_cv_proto_iconv" >&5
+$as_echo "${ac_t:-
+         }$am_cv_proto_iconv" >&6; }
+
+cat >>confdefs.h <<_ACEOF
+#define ICONV_CONST $am_cv_proto_iconv_arg1
+_ACEOF
+
+  fi
+
+  if test x$am_func_iconv != xyes; then
+    enable_poppler_cpp=no
+  fi
+fi
+
+ if test "x$enable_poppler_cpp" = "xyes"; then
+  BUILD_POPPLER_CPP_TRUE=
+  BUILD_POPPLER_CPP_FALSE='#'
+else
+  BUILD_POPPLER_CPP_TRUE='#'
+  BUILD_POPPLER_CPP_FALSE=
+fi
+
+
+
+# Check whether --enable-gtk-test was given.
+if test "${enable_gtk_test+set}" = set; then :
+  enableval=$enable_gtk_test; enable_gtk_test=$enableval
+else
+  enable_gtk_test="try"
+fi
+
+if test x$enable_gtk_test = xyes; then
+
+pkg_failed=no
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for GTK_TEST" >&5
+$as_echo_n "checking for GTK_TEST... " >&6; }
+
+if test -n "$GTK_TEST_CFLAGS"; then
+    pkg_cv_GTK_TEST_CFLAGS="$GTK_TEST_CFLAGS"
+ elif test -n "$PKG_CONFIG"; then
+    if test -n "$PKG_CONFIG" && \
+    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"gtk+-2.0 >= 2.14 gdk-pixbuf-2.0 gthread-2.0 gio-2.0\""; } >&5
+  ($PKG_CONFIG --exists --print-errors "gtk+-2.0 >= 2.14 gdk-pixbuf-2.0 gthread-2.0 gio-2.0") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then
+  pkg_cv_GTK_TEST_CFLAGS=`$PKG_CONFIG --cflags "gtk+-2.0 >= 2.14 gdk-pixbuf-2.0 gthread-2.0 gio-2.0" 2>/dev/null`
+                     test "x$?" != "x0" && pkg_failed=yes
+else
+  pkg_failed=yes
+fi
+ else
+    pkg_failed=untried
+fi
+if test -n "$GTK_TEST_LIBS"; then
+    pkg_cv_GTK_TEST_LIBS="$GTK_TEST_LIBS"
+ elif test -n "$PKG_CONFIG"; then
+    if test -n "$PKG_CONFIG" && \
+    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"gtk+-2.0 >= 2.14 gdk-pixbuf-2.0 gthread-2.0 gio-2.0\""; } >&5
+  ($PKG_CONFIG --exists --print-errors "gtk+-2.0 >= 2.14 gdk-pixbuf-2.0 gthread-2.0 gio-2.0") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then
+  pkg_cv_GTK_TEST_LIBS=`$PKG_CONFIG --libs "gtk+-2.0 >= 2.14 gdk-pixbuf-2.0 gthread-2.0 gio-2.0" 2>/dev/null`
+                     test "x$?" != "x0" && pkg_failed=yes
+else
+  pkg_failed=yes
+fi
+ else
+    pkg_failed=untried
+fi
+
+
+
+if test $pkg_failed = yes; then
+       { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+
+if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
+        _pkg_short_errors_supported=yes
+else
+        _pkg_short_errors_supported=no
+fi
+        if test $_pkg_short_errors_supported = yes; then
+               GTK_TEST_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "gtk+-2.0 >= 2.14 gdk-pixbuf-2.0 gthread-2.0 gio-2.0" 2>&1`
+        else
+               GTK_TEST_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "gtk+-2.0 >= 2.14 gdk-pixbuf-2.0 gthread-2.0 gio-2.0" 2>&1`
+        fi
+       # Put the nasty error message in config.log where it belongs
+       echo "$GTK_TEST_PKG_ERRORS" >&5
+
+       as_fn_error $? "Package requirements (gtk+-2.0 >= 2.14 gdk-pixbuf-2.0 gthread-2.0 gio-2.0) were not met:
+
+$GTK_TEST_PKG_ERRORS
+
+Consider adjusting the PKG_CONFIG_PATH environment variable if you
+installed software in a non-standard prefix.
+
+Alternatively, you may set the environment variables GTK_TEST_CFLAGS
+and GTK_TEST_LIBS to avoid the need to call pkg-config.
+See the pkg-config man page for more details." "$LINENO" 5
+elif test $pkg_failed = untried; then
+       { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+       { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "The pkg-config script could not be found or is too old.  Make sure it
+is in your PATH or set the PKG_CONFIG environment variable to the full
+path to pkg-config.
+
+Alternatively, you may set the environment variables GTK_TEST_CFLAGS
+and GTK_TEST_LIBS to avoid the need to call pkg-config.
+See the pkg-config man page for more details.
+
+To get pkg-config, see <http://pkg-config.freedesktop.org/>.
+See \`config.log' for more details" "$LINENO" 5; }
+else
+       GTK_TEST_CFLAGS=$pkg_cv_GTK_TEST_CFLAGS
+       GTK_TEST_LIBS=$pkg_cv_GTK_TEST_LIBS
+        { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+
+fi
+elif test x$enable_gtk_test = xtry; then
+
+pkg_failed=no
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for GTK_TEST" >&5
+$as_echo_n "checking for GTK_TEST... " >&6; }
+
+if test -n "$GTK_TEST_CFLAGS"; then
+    pkg_cv_GTK_TEST_CFLAGS="$GTK_TEST_CFLAGS"
+ elif test -n "$PKG_CONFIG"; then
+    if test -n "$PKG_CONFIG" && \
+    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"gtk+-2.0 >= 2.14 gdk-pixbuf-2.0 gthread-2.0 gio-2.0\""; } >&5
+  ($PKG_CONFIG --exists --print-errors "gtk+-2.0 >= 2.14 gdk-pixbuf-2.0 gthread-2.0 gio-2.0") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then
+  pkg_cv_GTK_TEST_CFLAGS=`$PKG_CONFIG --cflags "gtk+-2.0 >= 2.14 gdk-pixbuf-2.0 gthread-2.0 gio-2.0" 2>/dev/null`
+                     test "x$?" != "x0" && pkg_failed=yes
+else
+  pkg_failed=yes
+fi
+ else
+    pkg_failed=untried
+fi
+if test -n "$GTK_TEST_LIBS"; then
+    pkg_cv_GTK_TEST_LIBS="$GTK_TEST_LIBS"
+ elif test -n "$PKG_CONFIG"; then
+    if test -n "$PKG_CONFIG" && \
+    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"gtk+-2.0 >= 2.14 gdk-pixbuf-2.0 gthread-2.0 gio-2.0\""; } >&5
+  ($PKG_CONFIG --exists --print-errors "gtk+-2.0 >= 2.14 gdk-pixbuf-2.0 gthread-2.0 gio-2.0") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then
+  pkg_cv_GTK_TEST_LIBS=`$PKG_CONFIG --libs "gtk+-2.0 >= 2.14 gdk-pixbuf-2.0 gthread-2.0 gio-2.0" 2>/dev/null`
+                     test "x$?" != "x0" && pkg_failed=yes
+else
+  pkg_failed=yes
+fi
+ else
+    pkg_failed=untried
+fi
+
+
+
+if test $pkg_failed = yes; then
+       { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+
+if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
+        _pkg_short_errors_supported=yes
+else
+        _pkg_short_errors_supported=no
+fi
+        if test $_pkg_short_errors_supported = yes; then
+               GTK_TEST_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "gtk+-2.0 >= 2.14 gdk-pixbuf-2.0 gthread-2.0 gio-2.0" 2>&1`
+        else
+               GTK_TEST_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "gtk+-2.0 >= 2.14 gdk-pixbuf-2.0 gthread-2.0 gio-2.0" 2>&1`
+        fi
+       # Put the nasty error message in config.log where it belongs
+       echo "$GTK_TEST_PKG_ERRORS" >&5
+
+       enable_gtk_test="no"
+elif test $pkg_failed = untried; then
+       { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+       enable_gtk_test="no"
+else
+       GTK_TEST_CFLAGS=$pkg_cv_GTK_TEST_CFLAGS
+       GTK_TEST_LIBS=$pkg_cv_GTK_TEST_LIBS
+        { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+       enable_gtk_test="yes"
+fi
+fi
+ if test x$enable_gtk_test = xyes -a x$enable_poppler_glib = xyes; then
+  BUILD_GTK_TEST_TRUE=
+  BUILD_GTK_TEST_FALSE='#'
+else
+  BUILD_GTK_TEST_TRUE='#'
+  BUILD_GTK_TEST_FALSE=
+fi
+
+
+# Check whether --enable-utils was given.
+if test "${enable_utils+set}" = set; then :
+  enableval=$enable_utils; enable_utils=$enableval
+else
+  enable_utils="yes"
+fi
+
+ if test x$enable_utils = xyes; then
+  BUILD_UTILS_TRUE=
+  BUILD_UTILS_FALSE='#'
+else
+  BUILD_UTILS_TRUE='#'
+  BUILD_UTILS_FALSE=
+fi
+
+
+# Check whether --enable-compile-warnings was given.
+if test "${enable_compile_warnings+set}" = set; then :
+  enableval=$enable_compile_warnings;
+else
+  enable_compile_warnings="yes"
+fi
+
+
+
+# Check whether --enable-cms was given.
+if test "${enable_cms+set}" = set; then :
+  enableval=$enable_cms; enable_cms=$enableval
+else
+  enable_cms="try"
+fi
+
+if test x$enable_cms = xyes; then
+
+pkg_failed=no
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for LCMS" >&5
+$as_echo_n "checking for LCMS... " >&6; }
+
+if test -n "$LCMS_CFLAGS"; then
+    pkg_cv_LCMS_CFLAGS="$LCMS_CFLAGS"
+ elif test -n "$PKG_CONFIG"; then
+    if test -n "$PKG_CONFIG" && \
+    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"lcms2\""; } >&5
+  ($PKG_CONFIG --exists --print-errors "lcms2") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then
+  pkg_cv_LCMS_CFLAGS=`$PKG_CONFIG --cflags "lcms2" 2>/dev/null`
+                     test "x$?" != "x0" && pkg_failed=yes
+else
+  pkg_failed=yes
+fi
+ else
+    pkg_failed=untried
+fi
+if test -n "$LCMS_LIBS"; then
+    pkg_cv_LCMS_LIBS="$LCMS_LIBS"
+ elif test -n "$PKG_CONFIG"; then
+    if test -n "$PKG_CONFIG" && \
+    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"lcms2\""; } >&5
+  ($PKG_CONFIG --exists --print-errors "lcms2") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then
+  pkg_cv_LCMS_LIBS=`$PKG_CONFIG --libs "lcms2" 2>/dev/null`
+                     test "x$?" != "x0" && pkg_failed=yes
+else
+  pkg_failed=yes
+fi
+ else
+    pkg_failed=untried
+fi
+
+
+
+if test $pkg_failed = yes; then
+       { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+
+if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
+        _pkg_short_errors_supported=yes
+else
+        _pkg_short_errors_supported=no
+fi
+        if test $_pkg_short_errors_supported = yes; then
+               LCMS_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "lcms2" 2>&1`
+        else
+               LCMS_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "lcms2" 2>&1`
+        fi
+       # Put the nasty error message in config.log where it belongs
+       echo "$LCMS_PKG_ERRORS" >&5
+
+       lcms2=no
+elif test $pkg_failed = untried; then
+       { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+       lcms2=no
+else
+       LCMS_CFLAGS=$pkg_cv_LCMS_CFLAGS
+       LCMS_LIBS=$pkg_cv_LCMS_LIBS
+        { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+       lcms2=yes
+fi
+  if test x$lcms2 = xno; then
+
+pkg_failed=no
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for LCMS" >&5
+$as_echo_n "checking for LCMS... " >&6; }
+
+if test -n "$LCMS_CFLAGS"; then
+    pkg_cv_LCMS_CFLAGS="$LCMS_CFLAGS"
+ elif test -n "$PKG_CONFIG"; then
+    if test -n "$PKG_CONFIG" && \
+    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"lcms\""; } >&5
+  ($PKG_CONFIG --exists --print-errors "lcms") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then
+  pkg_cv_LCMS_CFLAGS=`$PKG_CONFIG --cflags "lcms" 2>/dev/null`
+                     test "x$?" != "x0" && pkg_failed=yes
+else
+  pkg_failed=yes
+fi
+ else
+    pkg_failed=untried
+fi
+if test -n "$LCMS_LIBS"; then
+    pkg_cv_LCMS_LIBS="$LCMS_LIBS"
+ elif test -n "$PKG_CONFIG"; then
+    if test -n "$PKG_CONFIG" && \
+    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"lcms\""; } >&5
+  ($PKG_CONFIG --exists --print-errors "lcms") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then
+  pkg_cv_LCMS_LIBS=`$PKG_CONFIG --libs "lcms" 2>/dev/null`
+                     test "x$?" != "x0" && pkg_failed=yes
+else
+  pkg_failed=yes
+fi
+ else
+    pkg_failed=untried
+fi
+
+
+
+if test $pkg_failed = yes; then
+       { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+
+if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
+        _pkg_short_errors_supported=yes
+else
+        _pkg_short_errors_supported=no
+fi
+        if test $_pkg_short_errors_supported = yes; then
+               LCMS_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "lcms" 2>&1`
+        else
+               LCMS_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "lcms" 2>&1`
+        fi
+       # Put the nasty error message in config.log where it belongs
+       echo "$LCMS_PKG_ERRORS" >&5
+
+       as_fn_error $? "Package requirements (lcms) were not met:
+
+$LCMS_PKG_ERRORS
+
+Consider adjusting the PKG_CONFIG_PATH environment variable if you
+installed software in a non-standard prefix.
+
+Alternatively, you may set the environment variables LCMS_CFLAGS
+and LCMS_LIBS to avoid the need to call pkg-config.
+See the pkg-config man page for more details." "$LINENO" 5
+elif test $pkg_failed = untried; then
+       { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+       { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "The pkg-config script could not be found or is too old.  Make sure it
+is in your PATH or set the PKG_CONFIG environment variable to the full
+path to pkg-config.
+
+Alternatively, you may set the environment variables LCMS_CFLAGS
+and LCMS_LIBS to avoid the need to call pkg-config.
+See the pkg-config man page for more details.
+
+To get pkg-config, see <http://pkg-config.freedesktop.org/>.
+See \`config.log' for more details" "$LINENO" 5; }
+else
+       LCMS_CFLAGS=$pkg_cv_LCMS_CFLAGS
+       LCMS_LIBS=$pkg_cv_LCMS_LIBS
+        { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+
+fi
+  fi
+elif test x$enable_cms = xtry; then
+
+pkg_failed=no
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for LCMS" >&5
+$as_echo_n "checking for LCMS... " >&6; }
+
+if test -n "$LCMS_CFLAGS"; then
+    pkg_cv_LCMS_CFLAGS="$LCMS_CFLAGS"
+ elif test -n "$PKG_CONFIG"; then
+    if test -n "$PKG_CONFIG" && \
+    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"lcms2\""; } >&5
+  ($PKG_CONFIG --exists --print-errors "lcms2") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then
+  pkg_cv_LCMS_CFLAGS=`$PKG_CONFIG --cflags "lcms2" 2>/dev/null`
+                     test "x$?" != "x0" && pkg_failed=yes
+else
+  pkg_failed=yes
+fi
+ else
+    pkg_failed=untried
+fi
+if test -n "$LCMS_LIBS"; then
+    pkg_cv_LCMS_LIBS="$LCMS_LIBS"
+ elif test -n "$PKG_CONFIG"; then
+    if test -n "$PKG_CONFIG" && \
+    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"lcms2\""; } >&5
+  ($PKG_CONFIG --exists --print-errors "lcms2") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then
+  pkg_cv_LCMS_LIBS=`$PKG_CONFIG --libs "lcms2" 2>/dev/null`
+                     test "x$?" != "x0" && pkg_failed=yes
+else
+  pkg_failed=yes
+fi
+ else
+    pkg_failed=untried
+fi
+
+
+
+if test $pkg_failed = yes; then
+       { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+
+if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
+        _pkg_short_errors_supported=yes
+else
+        _pkg_short_errors_supported=no
+fi
+        if test $_pkg_short_errors_supported = yes; then
+               LCMS_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "lcms2" 2>&1`
+        else
+               LCMS_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "lcms2" 2>&1`
+        fi
+       # Put the nasty error message in config.log where it belongs
+       echo "$LCMS_PKG_ERRORS" >&5
+
+       lcms2=no
+elif test $pkg_failed = untried; then
+       { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+       lcms2=no
+else
+       LCMS_CFLAGS=$pkg_cv_LCMS_CFLAGS
+       LCMS_LIBS=$pkg_cv_LCMS_LIBS
+        { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+       lcms2=yes
+fi
+  if test x$lcms2 = xyes; then
+    enable_cms=yes
+  else
+
+pkg_failed=no
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for LCMS" >&5
+$as_echo_n "checking for LCMS... " >&6; }
+
+if test -n "$LCMS_CFLAGS"; then
+    pkg_cv_LCMS_CFLAGS="$LCMS_CFLAGS"
+ elif test -n "$PKG_CONFIG"; then
+    if test -n "$PKG_CONFIG" && \
+    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"lcms\""; } >&5
+  ($PKG_CONFIG --exists --print-errors "lcms") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then
+  pkg_cv_LCMS_CFLAGS=`$PKG_CONFIG --cflags "lcms" 2>/dev/null`
+                     test "x$?" != "x0" && pkg_failed=yes
+else
+  pkg_failed=yes
+fi
+ else
+    pkg_failed=untried
+fi
+if test -n "$LCMS_LIBS"; then
+    pkg_cv_LCMS_LIBS="$LCMS_LIBS"
+ elif test -n "$PKG_CONFIG"; then
+    if test -n "$PKG_CONFIG" && \
+    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"lcms\""; } >&5
+  ($PKG_CONFIG --exists --print-errors "lcms") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then
+  pkg_cv_LCMS_LIBS=`$PKG_CONFIG --libs "lcms" 2>/dev/null`
+                     test "x$?" != "x0" && pkg_failed=yes
+else
+  pkg_failed=yes
+fi
+ else
+    pkg_failed=untried
+fi
+
+
+
+if test $pkg_failed = yes; then
+       { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+
+if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
+        _pkg_short_errors_supported=yes
+else
+        _pkg_short_errors_supported=no
+fi
+        if test $_pkg_short_errors_supported = yes; then
+               LCMS_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "lcms" 2>&1`
+        else
+               LCMS_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "lcms" 2>&1`
+        fi
+       # Put the nasty error message in config.log where it belongs
+       echo "$LCMS_PKG_ERRORS" >&5
+
+       enable_cms=no
+elif test $pkg_failed = untried; then
+       { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+       enable_cms=no
+else
+       LCMS_CFLAGS=$pkg_cv_LCMS_CFLAGS
+       LCMS_LIBS=$pkg_cv_LCMS_LIBS
+        { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+       enable_cms=yes
+fi
+  fi
+fi
+
+if test "x$enable_cms" = "xyes"; then
+
+$as_echo "#define USE_CMS 1" >>confdefs.h
+
+  if test "x$lcms2" != "xyes"; then
+    lcms1=yes;
+
+$as_echo "#define USE_LCMS1 1" >>confdefs.h
+
+  fi
+fi
+ if test x$enable_cms = xyes; then
+  USE_CMS_TRUE=
+  USE_CMS_FALSE='#'
+else
+  USE_CMS_TRUE='#'
+  USE_CMS_FALSE=
+fi
+
+ if test x$lcms1 = xyes; then
+  USE_LCMS1_TRUE=
+  USE_LCMS1_FALSE='#'
+else
+  USE_LCMS1_TRUE='#'
+  USE_LCMS1_FALSE=
+fi
+
+
+
+# Check whether --with-testdatadir was given.
+if test "${with_testdatadir+set}" = set; then :
+  withval=$with_testdatadir; case $withval in
+       [\\/]* | ?:[\\/]* )  # Absolute name.
+          TESTDATADIR=$withval ;;
+       *) # Relative name.
+          TESTDATADIR=$ac_pwd/$withval ;;
+    esac
+
+else
+  case $srcdir in
+       [\\/]* | ?:[\\/]* )  # Absolute name.
+          TESTDATADIR=$srcdir/../test ;;
+       *) # Relative name.
+          TESTDATADIR=$ac_pwd/$srcdir/../test ;;
+    esac
+
+
+fi
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for test data in $TESTDATADIR" >&5
+$as_echo_n "checking for test data in $TESTDATADIR... " >&6; }
+if test -d $TESTDATADIR && test -f $TESTDATADIR/test-poppler.c; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING:
+ No test data found in $TESTDATADIR.
+ You will not be able to run 'make check' successfully.
+
+ The test data is not included in the source packages
+ and is also not part of the main git repository. Instead,
+ you can checkout the test data from its own git
+ repository with:
+
+   git clone git://git.freedesktop.org/git/poppler/test
+
+ You should checkout the test data as a sibling of your
+ poppler source folder or specify the location of your
+ checkout with --with-testdatadir=/path/to/checkoutdir/test.
+" >&5
+$as_echo "$as_me: WARNING:
+ No test data found in $TESTDATADIR.
+ You will not be able to run 'make check' successfully.
+
+ The test data is not included in the source packages
+ and is also not part of the main git repository. Instead,
+ you can checkout the test data from its own git
+ repository with:
+
+   git clone git://git.freedesktop.org/git/poppler/test
+
+ You should checkout the test data as a sibling of your
+ poppler source folder or specify the location of your
+ checkout with --with-testdatadir=/path/to/checkoutdir/test.
+" >&2;}
+fi
+
+
+if test "x$GCC" != xyes; then
+  enable_compile_warnings=no
+fi
+case "$enable_compile_warnings" in
+  no)  ;;
+  yes) CXXFLAGS="-Wall -Woverloaded-virtual -Wnon-virtual-dtor -Wcast-align -fno-exceptions -fno-check-new -fno-common $CXXFLAGS" ;;
+  kde) CXXFLAGS="-Wnon-virtual-dtor -Wno-long-long -Wundef \
+               -D_XOPEN_SOURCE=600 -D_BSD_SOURCE -Wcast-align \
+               -Wconversion -Wall -W -Wpointer-arith \
+               -Wwrite-strings -O2 -Wformat-security \
+               -Wmissing-format-attribute -fno-exceptions -fno-check-new \
+               -fno-common $CXXFLAGS" ;;
+esac
+
+case `$PKG_CONFIG --version` in
+  0.?|0.10-7)
+    PC_REQUIRES_PRIVATE="";
+    PC_REQUIRES="poppler = $VERSION";;
+  *)
+    PC_REQUIRES_PRIVATE="Requires.private: poppler = $VERSION";
+    PC_REQUIRES="";;
+esac
+
+
+
+
+POPPLER_MAJOR_VERSION=0
+
+POPPLER_MINOR_VERSION=20
+
+POPPLER_MICRO_VERSION=4
+
+POPPLER_VERSION=0.20.4
+
+
+ac_config_files="$ac_config_files Makefile goo/Makefile fofi/Makefile splash/Makefile poppler/Makefile utils/Makefile glib/Makefile glib/poppler-features.h glib/reference/Makefile glib/reference/version.xml glib/demo/Makefile test/Makefile qt4/Makefile qt4/src/Makefile qt4/tests/Makefile qt4/demos/Makefile cpp/Makefile cpp/poppler-version.h cpp/tests/Makefile poppler.pc poppler-uninstalled.pc poppler-cairo.pc poppler-cairo-uninstalled.pc poppler-splash.pc poppler-splash-uninstalled.pc poppler-glib.pc poppler-glib-uninstalled.pc poppler-qt4.pc poppler-qt4-uninstalled.pc poppler-cpp.pc poppler-cpp-uninstalled.pc"
+
+cat >confcache <<\_ACEOF
+# This file is a shell script that caches the results of configure
+# tests run on this system so they can be shared between configure
+# scripts and configure runs, see configure's option --config-cache.
+# It is not useful on other systems.  If it contains results you don't
+# want to keep, you may remove or edit it.
+#
+# config.status only pays attention to the cache file if you give it
+# the --recheck option to rerun configure.
+#
+# `ac_cv_env_foo' variables (set or unset) will be overridden when
+# loading this file, other *unset* `ac_cv_foo' will be assigned the
+# following values.
+
+_ACEOF
+
+# The following way of writing the cache mishandles newlines in values,
+# but we know of no workaround that is simple, portable, and efficient.
+# So, we kill variables containing newlines.
+# Ultrix sh set writes to stderr and can't be redirected directly,
+# and sets the high bit in the cache file unless we assign to the vars.
+(
+  for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do
+    eval ac_val=\$$ac_var
+    case $ac_val in #(
+    *${as_nl}*)
+      case $ac_var in #(
+      *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5
+$as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;;
+      esac
+      case $ac_var in #(
+      _ | IFS | as_nl) ;; #(
+      BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #(
+      *) { eval $ac_var=; unset $ac_var;} ;;
+      esac ;;
+    esac
+  done
+
+  (set) 2>&1 |
+    case $as_nl`(ac_space=' '; set) 2>&1` in #(
+    *${as_nl}ac_space=\ *)
+      # `set' does not quote correctly, so add quotes: double-quote
+      # substitution turns \\\\ into \\, and sed turns \\ into \.
+      sed -n \
+       "s/'/'\\\\''/g;
+         s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p"
+      ;; #(
+    *)
+      # `set' quotes correctly as required by POSIX, so do not add quotes.
+      sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p"
+      ;;
+    esac |
+    sort
+) |
+  sed '
+     /^ac_cv_env_/b end
+     t clear
+     :clear
+     s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/
+     t end
+     s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/
+     :end' >>confcache
+if diff "$cache_file" confcache >/dev/null 2>&1; then :; else
+  if test -w "$cache_file"; then
+    if test "x$cache_file" != "x/dev/null"; then
+      { $as_echo "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5
+$as_echo "$as_me: updating cache $cache_file" >&6;}
+      if test ! -f "$cache_file" || test -h "$cache_file"; then
+       cat confcache >"$cache_file"
+      else
+        case $cache_file in #(
+        */* | ?:*)
+         mv -f confcache "$cache_file"$$ &&
+         mv -f "$cache_file"$$ "$cache_file" ;; #(
+        *)
+         mv -f confcache "$cache_file" ;;
+       esac
+      fi
+    fi
+  else
+    { $as_echo "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5
+$as_echo "$as_me: not updating unwritable cache $cache_file" >&6;}
+  fi
+fi
+rm -f confcache
+
+test "x$prefix" = xNONE && prefix=$ac_default_prefix
+# Let make expand exec_prefix.
+test "x$exec_prefix" = xNONE && exec_prefix='${prefix}'
+
+DEFS=-DHAVE_CONFIG_H
+
+ac_libobjs=
+ac_ltlibobjs=
+U=
+for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue
+  # 1. Remove the extension, and $U if already installed.
+  ac_script='s/\$U\././;s/\.o$//;s/\.obj$//'
+  ac_i=`$as_echo "$ac_i" | sed "$ac_script"`
+  # 2. Prepend LIBOBJDIR.  When used with automake>=1.10 LIBOBJDIR
+  #    will be set to the directory where LIBOBJS objects are built.
+  as_fn_append ac_libobjs " \${LIBOBJDIR}$ac_i\$U.$ac_objext"
+  as_fn_append ac_ltlibobjs " \${LIBOBJDIR}$ac_i"'$U.lo'
+done
+LIBOBJS=$ac_libobjs
+
+LTLIBOBJS=$ac_ltlibobjs
+
+
+ if test -n "$EXEEXT"; then
+  am__EXEEXT_TRUE=
+  am__EXEEXT_FALSE='#'
+else
+  am__EXEEXT_TRUE='#'
+  am__EXEEXT_FALSE=
+fi
+
+if test -z "${AMDEP_TRUE}" && test -z "${AMDEP_FALSE}"; then
+  as_fn_error $? "conditional \"AMDEP\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${am__fastdepCC_TRUE}" && test -z "${am__fastdepCC_FALSE}"; then
+  as_fn_error $? "conditional \"am__fastdepCC\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+
+if test -z "${am__fastdepCC_TRUE}" && test -z "${am__fastdepCC_FALSE}"; then
+  as_fn_error $? "conditional \"am__fastdepCC\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${am__fastdepCXX_TRUE}" && test -z "${am__fastdepCXX_FALSE}"; then
+  as_fn_error $? "conditional \"am__fastdepCXX\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${am__fastdepCXX_TRUE}" && test -z "${am__fastdepCXX_FALSE}"; then
+  as_fn_error $? "conditional \"am__fastdepCXX\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${ENABLE_XPDF_HEADERS_TRUE}" && test -z "${ENABLE_XPDF_HEADERS_FALSE}"; then
+  as_fn_error $? "conditional \"ENABLE_XPDF_HEADERS\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${BUILD_LIBOPENJPEG_TRUE}" && test -z "${BUILD_LIBOPENJPEG_FALSE}"; then
+  as_fn_error $? "conditional \"BUILD_LIBOPENJPEG\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${BUILD_LIBTIFF_TRUE}" && test -z "${BUILD_LIBTIFF_FALSE}"; then
+  as_fn_error $? "conditional \"BUILD_LIBTIFF\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${BUILD_ZLIB_TRUE}" && test -z "${BUILD_ZLIB_FALSE}"; then
+  as_fn_error $? "conditional \"BUILD_ZLIB\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${BUILD_LIBCURL_TRUE}" && test -z "${BUILD_LIBCURL_FALSE}"; then
+  as_fn_error $? "conditional \"BUILD_LIBCURL\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${BUILD_LIBJPEG_TRUE}" && test -z "${BUILD_LIBJPEG_FALSE}"; then
+  as_fn_error $? "conditional \"BUILD_LIBJPEG\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${BUILD_LIBPNG_TRUE}" && test -z "${BUILD_LIBPNG_FALSE}"; then
+  as_fn_error $? "conditional \"BUILD_LIBPNG\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${BUILD_WITH_WIN32_FONTCONFIGURATION_TRUE}" && test -z "${BUILD_WITH_WIN32_FONTCONFIGURATION_FALSE}"; then
+  as_fn_error $? "conditional \"BUILD_WITH_WIN32_FONTCONFIGURATION\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${BUILD_SPLASH_OUTPUT_TRUE}" && test -z "${BUILD_SPLASH_OUTPUT_FALSE}"; then
+  as_fn_error $? "conditional \"BUILD_SPLASH_OUTPUT\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${BUILD_CAIRO_OUTPUT_TRUE}" && test -z "${BUILD_CAIRO_OUTPUT_FALSE}"; then
+  as_fn_error $? "conditional \"BUILD_CAIRO_OUTPUT\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${HAVE_INTROSPECTION_TRUE}" && test -z "${HAVE_INTROSPECTION_FALSE}"; then
+  as_fn_error $? "conditional \"HAVE_INTROSPECTION\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${BUILD_POPPLER_GLIB_TRUE}" && test -z "${BUILD_POPPLER_GLIB_FALSE}"; then
+  as_fn_error $? "conditional \"BUILD_POPPLER_GLIB\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${HAVE_INTROSPECTION_TRUE}" && test -z "${HAVE_INTROSPECTION_FALSE}"; then
+  as_fn_error $? "conditional \"HAVE_INTROSPECTION\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${ENABLE_GTK_DOC_TRUE}" && test -z "${ENABLE_GTK_DOC_FALSE}"; then
+  as_fn_error $? "conditional \"ENABLE_GTK_DOC\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${GTK_DOC_BUILD_HTML_TRUE}" && test -z "${GTK_DOC_BUILD_HTML_FALSE}"; then
+  as_fn_error $? "conditional \"GTK_DOC_BUILD_HTML\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${GTK_DOC_BUILD_PDF_TRUE}" && test -z "${GTK_DOC_BUILD_PDF_FALSE}"; then
+  as_fn_error $? "conditional \"GTK_DOC_BUILD_PDF\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${GTK_DOC_USE_LIBTOOL_TRUE}" && test -z "${GTK_DOC_USE_LIBTOOL_FALSE}"; then
+  as_fn_error $? "conditional \"GTK_DOC_USE_LIBTOOL\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${GTK_DOC_USE_REBASE_TRUE}" && test -z "${GTK_DOC_USE_REBASE_FALSE}"; then
+  as_fn_error $? "conditional \"GTK_DOC_USE_REBASE\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${BUILD_POPPLER_QT4_TRUE}" && test -z "${BUILD_POPPLER_QT4_FALSE}"; then
+  as_fn_error $? "conditional \"BUILD_POPPLER_QT4\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${BUILD_POPPLER_CPP_TRUE}" && test -z "${BUILD_POPPLER_CPP_FALSE}"; then
+  as_fn_error $? "conditional \"BUILD_POPPLER_CPP\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${BUILD_GTK_TEST_TRUE}" && test -z "${BUILD_GTK_TEST_FALSE}"; then
+  as_fn_error $? "conditional \"BUILD_GTK_TEST\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${BUILD_UTILS_TRUE}" && test -z "${BUILD_UTILS_FALSE}"; then
+  as_fn_error $? "conditional \"BUILD_UTILS\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${USE_CMS_TRUE}" && test -z "${USE_CMS_FALSE}"; then
+  as_fn_error $? "conditional \"USE_CMS\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${USE_LCMS1_TRUE}" && test -z "${USE_LCMS1_FALSE}"; then
+  as_fn_error $? "conditional \"USE_LCMS1\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+
+: "${CONFIG_STATUS=./config.status}"
+ac_write_fail=0
+ac_clean_files_save=$ac_clean_files
+ac_clean_files="$ac_clean_files $CONFIG_STATUS"
+{ $as_echo "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5
+$as_echo "$as_me: creating $CONFIG_STATUS" >&6;}
+as_write_fail=0
+cat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1
+#! $SHELL
+# Generated by $as_me.
+# Run this file to recreate the current configuration.
+# Compiler output produced by configure, useful for debugging
+# configure, is in config.log if it exists.
+
+debug=false
+ac_cs_recheck=false
+ac_cs_silent=false
+
+SHELL=\${CONFIG_SHELL-$SHELL}
+export SHELL
+_ASEOF
+cat >>$CONFIG_STATUS <<\_ASEOF || as_write_fail=1
+## -------------------- ##
+## M4sh Initialization. ##
+## -------------------- ##
+
+# Be more Bourne compatible
+DUALCASE=1; export DUALCASE # for MKS sh
+if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then :
+  emulate sh
+  NULLCMD=:
+  # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which
+  # is contrary to our usage.  Disable this feature.
+  alias -g '${1+"$@"}'='"$@"'
+  setopt NO_GLOB_SUBST
+else
+  case `(set -o) 2>/dev/null` in #(
+  *posix*) :
+    set -o posix ;; #(
+  *) :
+     ;;
+esac
+fi
+
+
+as_nl='
+'
+export as_nl
+# Printing a long string crashes Solaris 7 /usr/bin/printf.
+as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'
+as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo
+as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo
+# Prefer a ksh shell builtin over an external printf program on Solaris,
+# but without wasting forks for bash or zsh.
+if test -z "$BASH_VERSION$ZSH_VERSION" \
+    && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then
+  as_echo='print -r --'
+  as_echo_n='print -rn --'
+elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then
+  as_echo='printf %s\n'
+  as_echo_n='printf %s'
+else
+  if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then
+    as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"'
+    as_echo_n='/usr/ucb/echo -n'
+  else
+    as_echo_body='eval expr "X$1" : "X\\(.*\\)"'
+    as_echo_n_body='eval
+      arg=$1;
+      case $arg in #(
+      *"$as_nl"*)
+       expr "X$arg" : "X\\(.*\\)$as_nl";
+       arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;;
+      esac;
+      expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl"
+    '
+    export as_echo_n_body
+    as_echo_n='sh -c $as_echo_n_body as_echo'
+  fi
+  export as_echo_body
+  as_echo='sh -c $as_echo_body as_echo'
+fi
+
+# The user is always right.
+if test "${PATH_SEPARATOR+set}" != set; then
+  PATH_SEPARATOR=:
+  (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && {
+    (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 ||
+      PATH_SEPARATOR=';'
+  }
+fi
+
+
+# IFS
+# We need space, tab and new line, in precisely that order.  Quoting is
+# there to prevent editors from complaining about space-tab.
+# (If _AS_PATH_WALK were called with IFS unset, it would disable word
+# splitting by setting IFS to empty value.)
+IFS=" ""       $as_nl"
+
+# Find who we are.  Look in the path if we contain no directory separator.
+as_myself=
+case $0 in #((
+  *[\\/]* ) as_myself=$0 ;;
+  *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break
+  done
+IFS=$as_save_IFS
+
+     ;;
+esac
+# We did not find ourselves, most probably we were run as `sh COMMAND'
+# in which case we are not to be found in the path.
+if test "x$as_myself" = x; then
+  as_myself=$0
+fi
+if test ! -f "$as_myself"; then
+  $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2
+  exit 1
+fi
+
+# Unset variables that we do not need and which cause bugs (e.g. in
+# pre-3.0 UWIN ksh).  But do not cause bugs in bash 2.01; the "|| exit 1"
+# suppresses any "Segmentation fault" message there.  '((' could
+# trigger a bug in pdksh 5.2.14.
+for as_var in BASH_ENV ENV MAIL MAILPATH
+do eval test x\${$as_var+set} = xset \
+  && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || :
+done
+PS1='$ '
+PS2='> '
+PS4='+ '
+
+# NLS nuisances.
+LC_ALL=C
+export LC_ALL
+LANGUAGE=C
+export LANGUAGE
+
+# CDPATH.
+(unset CDPATH) >/dev/null 2>&1 && unset CDPATH
+
+
+# as_fn_error STATUS ERROR [LINENO LOG_FD]
+# ----------------------------------------
+# Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are
+# provided, also output the error to LOG_FD, referencing LINENO. Then exit the
+# script with STATUS, using 1 if that was 0.
+as_fn_error ()
+{
+  as_status=$1; test $as_status -eq 0 && as_status=1
+  if test "$4"; then
+    as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+    $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4
+  fi
+  $as_echo "$as_me: error: $2" >&2
+  as_fn_exit $as_status
+} # as_fn_error
+
+
+# as_fn_set_status STATUS
+# -----------------------
+# Set $? to STATUS, without forking.
+as_fn_set_status ()
+{
+  return $1
+} # as_fn_set_status
+
+# as_fn_exit STATUS
+# -----------------
+# Exit the shell with STATUS, even in a "trap 0" or "set -e" context.
+as_fn_exit ()
+{
+  set +e
+  as_fn_set_status $1
+  exit $1
+} # as_fn_exit
+
+# as_fn_unset VAR
+# ---------------
+# Portably unset VAR.
+as_fn_unset ()
+{
+  { eval $1=; unset $1;}
+}
+as_unset=as_fn_unset
+# as_fn_append VAR VALUE
+# ----------------------
+# Append the text in VALUE to the end of the definition contained in VAR. Take
+# advantage of any shell optimizations that allow amortized linear growth over
+# repeated appends, instead of the typical quadratic growth present in naive
+# implementations.
+if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then :
+  eval 'as_fn_append ()
+  {
+    eval $1+=\$2
+  }'
+else
+  as_fn_append ()
+  {
+    eval $1=\$$1\$2
+  }
+fi # as_fn_append
+
+# as_fn_arith ARG...
+# ------------------
+# Perform arithmetic evaluation on the ARGs, and store the result in the
+# global $as_val. Take advantage of shells that can avoid forks. The arguments
+# must be portable across $(()) and expr.
+if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then :
+  eval 'as_fn_arith ()
+  {
+    as_val=$(( $* ))
+  }'
+else
+  as_fn_arith ()
+  {
+    as_val=`expr "$@" || test $? -eq 1`
+  }
+fi # as_fn_arith
+
+
+if expr a : '\(a\)' >/dev/null 2>&1 &&
+   test "X`expr 00001 : '.*\(...\)'`" = X001; then
+  as_expr=expr
+else
+  as_expr=false
+fi
+
+if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then
+  as_basename=basename
+else
+  as_basename=false
+fi
+
+if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then
+  as_dirname=dirname
+else
+  as_dirname=false
+fi
+
+as_me=`$as_basename -- "$0" ||
+$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \
+        X"$0" : 'X\(//\)$' \| \
+        X"$0" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X/"$0" |
+    sed '/^.*\/\([^/][^/]*\)\/*$/{
+           s//\1/
+           q
+         }
+         /^X\/\(\/\/\)$/{
+           s//\1/
+           q
+         }
+         /^X\/\(\/\).*/{
+           s//\1/
+           q
+         }
+         s/.*/./; q'`
+
+# Avoid depending upon Character Ranges.
+as_cr_letters='abcdefghijklmnopqrstuvwxyz'
+as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ'
+as_cr_Letters=$as_cr_letters$as_cr_LETTERS
+as_cr_digits='0123456789'
+as_cr_alnum=$as_cr_Letters$as_cr_digits
+
+ECHO_C= ECHO_N= ECHO_T=
+case `echo -n x` in #(((((
+-n*)
+  case `echo 'xy\c'` in
+  *c*) ECHO_T='        ';;     # ECHO_T is single tab character.
+  xy)  ECHO_C='\c';;
+  *)   echo `echo ksh88 bug on AIX 6.1` > /dev/null
+       ECHO_T='        ';;
+  esac;;
+*)
+  ECHO_N='-n';;
+esac
+
+rm -f conf$$ conf$$.exe conf$$.file
+if test -d conf$$.dir; then
+  rm -f conf$$.dir/conf$$.file
+else
+  rm -f conf$$.dir
+  mkdir conf$$.dir 2>/dev/null
+fi
+if (echo >conf$$.file) 2>/dev/null; then
+  if ln -s conf$$.file conf$$ 2>/dev/null; then
+    as_ln_s='ln -s'
+    # ... but there are two gotchas:
+    # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail.
+    # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable.
+    # In both cases, we have to default to `cp -pR'.
+    ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe ||
+      as_ln_s='cp -pR'
+  elif ln conf$$.file conf$$ 2>/dev/null; then
+    as_ln_s=ln
+  else
+    as_ln_s='cp -pR'
+  fi
+else
+  as_ln_s='cp -pR'
+fi
+rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file
+rmdir conf$$.dir 2>/dev/null
+
+
+# as_fn_mkdir_p
+# -------------
+# Create "$as_dir" as a directory, including parents if necessary.
+as_fn_mkdir_p ()
+{
+
+  case $as_dir in #(
+  -*) as_dir=./$as_dir;;
+  esac
+  test -d "$as_dir" || eval $as_mkdir_p || {
+    as_dirs=
+    while :; do
+      case $as_dir in #(
+      *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'(
+      *) as_qdir=$as_dir;;
+      esac
+      as_dirs="'$as_qdir' $as_dirs"
+      as_dir=`$as_dirname -- "$as_dir" ||
+$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+        X"$as_dir" : 'X\(//\)[^/]' \| \
+        X"$as_dir" : 'X\(//\)$' \| \
+        X"$as_dir" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X"$as_dir" |
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+           s//\1/
+           q
+         }
+         /^X\(\/\/\)[^/].*/{
+           s//\1/
+           q
+         }
+         /^X\(\/\/\)$/{
+           s//\1/
+           q
+         }
+         /^X\(\/\).*/{
+           s//\1/
+           q
+         }
+         s/.*/./; q'`
+      test -d "$as_dir" && break
+    done
+    test -z "$as_dirs" || eval "mkdir $as_dirs"
+  } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir"
+
+
+} # as_fn_mkdir_p
+if mkdir -p . 2>/dev/null; then
+  as_mkdir_p='mkdir -p "$as_dir"'
+else
+  test -d ./-p && rmdir ./-p
+  as_mkdir_p=false
+fi
+
+
+# as_fn_executable_p FILE
+# -----------------------
+# Test if FILE is an executable regular file.
+as_fn_executable_p ()
+{
+  test -f "$1" && test -x "$1"
+} # as_fn_executable_p
+as_test_x='test -x'
+as_executable_p=as_fn_executable_p
+
+# Sed expression to map a string onto a valid CPP name.
+as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'"
+
+# Sed expression to map a string onto a valid variable name.
+as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'"
+
+
+exec 6>&1
+## ----------------------------------- ##
+## Main body of $CONFIG_STATUS script. ##
+## ----------------------------------- ##
+_ASEOF
+test $as_write_fail = 0 && chmod +x $CONFIG_STATUS || ac_write_fail=1
+
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+# Save the log message, to keep $0 and so on meaningful, and to
+# report actual input values of CONFIG_FILES etc. instead of their
+# values after options handling.
+ac_log="
+This file was extended by poppler $as_me 0.20.4, which was
+generated by GNU Autoconf 2.69.  Invocation command line was
+
+  CONFIG_FILES    = $CONFIG_FILES
+  CONFIG_HEADERS  = $CONFIG_HEADERS
+  CONFIG_LINKS    = $CONFIG_LINKS
+  CONFIG_COMMANDS = $CONFIG_COMMANDS
+  $ $0 $@
+
+on `(hostname || uname -n) 2>/dev/null | sed 1q`
+"
+
+_ACEOF
+
+case $ac_config_files in *"
+"*) set x $ac_config_files; shift; ac_config_files=$*;;
+esac
+
+case $ac_config_headers in *"
+"*) set x $ac_config_headers; shift; ac_config_headers=$*;;
+esac
+
+
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+# Files that config.status was made for.
+config_files="$ac_config_files"
+config_headers="$ac_config_headers"
+config_commands="$ac_config_commands"
+
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+ac_cs_usage="\
+\`$as_me' instantiates files and other configuration actions
+from templates according to the current configuration.  Unless the files
+and actions are specified as TAGs, all are instantiated by default.
+
+Usage: $0 [OPTION]... [TAG]...
+
+  -h, --help       print this help, then exit
+  -V, --version    print version number and configuration settings, then exit
+      --config     print configuration, then exit
+  -q, --quiet, --silent
+                   do not print progress messages
+  -d, --debug      don't remove temporary files
+      --recheck    update $as_me by reconfiguring in the same conditions
+      --file=FILE[:TEMPLATE]
+                   instantiate the configuration file FILE
+      --header=FILE[:TEMPLATE]
+                   instantiate the configuration header FILE
+
+Configuration files:
+$config_files
+
+Configuration headers:
+$config_headers
+
+Configuration commands:
+$config_commands
+
+Report bugs to <https://bugs.freedesktop.org/enter_bug.cgi?product=poppler>."
+
+_ACEOF
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`"
+ac_cs_version="\\
+poppler config.status 0.20.4
+configured by $0, generated by GNU Autoconf 2.69,
+  with options \\"\$ac_cs_config\\"
+
+Copyright (C) 2012 Free Software Foundation, Inc.
+This config.status script is free software; the Free Software Foundation
+gives unlimited permission to copy, distribute and modify it."
+
+ac_pwd='$ac_pwd'
+srcdir='$srcdir'
+INSTALL='$INSTALL'
+MKDIR_P='$MKDIR_P'
+AWK='$AWK'
+test -n "\$AWK" || AWK=awk
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+# The default lists apply if the user does not specify any file.
+ac_need_defaults=:
+while test $# != 0
+do
+  case $1 in
+  --*=?*)
+    ac_option=`expr "X$1" : 'X\([^=]*\)='`
+    ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'`
+    ac_shift=:
+    ;;
+  --*=)
+    ac_option=`expr "X$1" : 'X\([^=]*\)='`
+    ac_optarg=
+    ac_shift=:
+    ;;
+  *)
+    ac_option=$1
+    ac_optarg=$2
+    ac_shift=shift
+    ;;
+  esac
+
+  case $ac_option in
+  # Handling of the options.
+  -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r)
+    ac_cs_recheck=: ;;
+  --version | --versio | --versi | --vers | --ver | --ve | --v | -V )
+    $as_echo "$ac_cs_version"; exit ;;
+  --config | --confi | --conf | --con | --co | --c )
+    $as_echo "$ac_cs_config"; exit ;;
+  --debug | --debu | --deb | --de | --d | -d )
+    debug=: ;;
+  --file | --fil | --fi | --f )
+    $ac_shift
+    case $ac_optarg in
+    *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;;
+    '') as_fn_error $? "missing file argument" ;;
+    esac
+    as_fn_append CONFIG_FILES " '$ac_optarg'"
+    ac_need_defaults=false;;
+  --header | --heade | --head | --hea )
+    $ac_shift
+    case $ac_optarg in
+    *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;;
+    esac
+    as_fn_append CONFIG_HEADERS " '$ac_optarg'"
+    ac_need_defaults=false;;
+  --he | --h)
+    # Conflict between --help and --header
+    as_fn_error $? "ambiguous option: \`$1'
+Try \`$0 --help' for more information.";;
+  --help | --hel | -h )
+    $as_echo "$ac_cs_usage"; exit ;;
+  -q | -quiet | --quiet | --quie | --qui | --qu | --q \
+  | -silent | --silent | --silen | --sile | --sil | --si | --s)
+    ac_cs_silent=: ;;
+
+  # This is an error.
+  -*) as_fn_error $? "unrecognized option: \`$1'
+Try \`$0 --help' for more information." ;;
+
+  *) as_fn_append ac_config_targets " $1"
+     ac_need_defaults=false ;;
+
+  esac
+  shift
+done
+
+ac_configure_extra_args=
+
+if $ac_cs_silent; then
+  exec 6>/dev/null
+  ac_configure_extra_args="$ac_configure_extra_args --silent"
+fi
+
+_ACEOF
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+if \$ac_cs_recheck; then
+  set X $SHELL '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion
+  shift
+  \$as_echo "running CONFIG_SHELL=$SHELL \$*" >&6
+  CONFIG_SHELL='$SHELL'
+  export CONFIG_SHELL
+  exec "\$@"
+fi
+
+_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+exec 5>>config.log
+{
+  echo
+  sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX
+## Running $as_me. ##
+_ASBOX
+  $as_echo "$ac_log"
+} >&5
+
+_ACEOF
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+#
+# INIT-COMMANDS
+#
+AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir"
+
+
+# The HP-UX ksh and POSIX shell print the target directory to stdout
+# if CDPATH is set.
+(unset CDPATH) >/dev/null 2>&1 && unset CDPATH
+
+sed_quote_subst='$sed_quote_subst'
+double_quote_subst='$double_quote_subst'
+delay_variable_subst='$delay_variable_subst'
+AS='`$ECHO "$AS" | $SED "$delay_single_quote_subst"`'
+DLLTOOL='`$ECHO "$DLLTOOL" | $SED "$delay_single_quote_subst"`'
+OBJDUMP='`$ECHO "$OBJDUMP" | $SED "$delay_single_quote_subst"`'
+macro_version='`$ECHO "$macro_version" | $SED "$delay_single_quote_subst"`'
+macro_revision='`$ECHO "$macro_revision" | $SED "$delay_single_quote_subst"`'
+enable_shared='`$ECHO "$enable_shared" | $SED "$delay_single_quote_subst"`'
+enable_static='`$ECHO "$enable_static" | $SED "$delay_single_quote_subst"`'
+pic_mode='`$ECHO "$pic_mode" | $SED "$delay_single_quote_subst"`'
+enable_fast_install='`$ECHO "$enable_fast_install" | $SED "$delay_single_quote_subst"`'
+SHELL='`$ECHO "$SHELL" | $SED "$delay_single_quote_subst"`'
+ECHO='`$ECHO "$ECHO" | $SED "$delay_single_quote_subst"`'
+PATH_SEPARATOR='`$ECHO "$PATH_SEPARATOR" | $SED "$delay_single_quote_subst"`'
+host_alias='`$ECHO "$host_alias" | $SED "$delay_single_quote_subst"`'
+host='`$ECHO "$host" | $SED "$delay_single_quote_subst"`'
+host_os='`$ECHO "$host_os" | $SED "$delay_single_quote_subst"`'
+build_alias='`$ECHO "$build_alias" | $SED "$delay_single_quote_subst"`'
+build='`$ECHO "$build" | $SED "$delay_single_quote_subst"`'
+build_os='`$ECHO "$build_os" | $SED "$delay_single_quote_subst"`'
+SED='`$ECHO "$SED" | $SED "$delay_single_quote_subst"`'
+Xsed='`$ECHO "$Xsed" | $SED "$delay_single_quote_subst"`'
+GREP='`$ECHO "$GREP" | $SED "$delay_single_quote_subst"`'
+EGREP='`$ECHO "$EGREP" | $SED "$delay_single_quote_subst"`'
+FGREP='`$ECHO "$FGREP" | $SED "$delay_single_quote_subst"`'
+LD='`$ECHO "$LD" | $SED "$delay_single_quote_subst"`'
+NM='`$ECHO "$NM" | $SED "$delay_single_quote_subst"`'
+LN_S='`$ECHO "$LN_S" | $SED "$delay_single_quote_subst"`'
+max_cmd_len='`$ECHO "$max_cmd_len" | $SED "$delay_single_quote_subst"`'
+ac_objext='`$ECHO "$ac_objext" | $SED "$delay_single_quote_subst"`'
+exeext='`$ECHO "$exeext" | $SED "$delay_single_quote_subst"`'
+lt_unset='`$ECHO "$lt_unset" | $SED "$delay_single_quote_subst"`'
+lt_SP2NL='`$ECHO "$lt_SP2NL" | $SED "$delay_single_quote_subst"`'
+lt_NL2SP='`$ECHO "$lt_NL2SP" | $SED "$delay_single_quote_subst"`'
+lt_cv_to_host_file_cmd='`$ECHO "$lt_cv_to_host_file_cmd" | $SED "$delay_single_quote_subst"`'
+lt_cv_to_tool_file_cmd='`$ECHO "$lt_cv_to_tool_file_cmd" | $SED "$delay_single_quote_subst"`'
+reload_flag='`$ECHO "$reload_flag" | $SED "$delay_single_quote_subst"`'
+reload_cmds='`$ECHO "$reload_cmds" | $SED "$delay_single_quote_subst"`'
+deplibs_check_method='`$ECHO "$deplibs_check_method" | $SED "$delay_single_quote_subst"`'
+file_magic_cmd='`$ECHO "$file_magic_cmd" | $SED "$delay_single_quote_subst"`'
+file_magic_glob='`$ECHO "$file_magic_glob" | $SED "$delay_single_quote_subst"`'
+want_nocaseglob='`$ECHO "$want_nocaseglob" | $SED "$delay_single_quote_subst"`'
+sharedlib_from_linklib_cmd='`$ECHO "$sharedlib_from_linklib_cmd" | $SED "$delay_single_quote_subst"`'
+AR='`$ECHO "$AR" | $SED "$delay_single_quote_subst"`'
+AR_FLAGS='`$ECHO "$AR_FLAGS" | $SED "$delay_single_quote_subst"`'
+archiver_list_spec='`$ECHO "$archiver_list_spec" | $SED "$delay_single_quote_subst"`'
+STRIP='`$ECHO "$STRIP" | $SED "$delay_single_quote_subst"`'
+RANLIB='`$ECHO "$RANLIB" | $SED "$delay_single_quote_subst"`'
+old_postinstall_cmds='`$ECHO "$old_postinstall_cmds" | $SED "$delay_single_quote_subst"`'
+old_postuninstall_cmds='`$ECHO "$old_postuninstall_cmds" | $SED "$delay_single_quote_subst"`'
+old_archive_cmds='`$ECHO "$old_archive_cmds" | $SED "$delay_single_quote_subst"`'
+lock_old_archive_extraction='`$ECHO "$lock_old_archive_extraction" | $SED "$delay_single_quote_subst"`'
+CC='`$ECHO "$CC" | $SED "$delay_single_quote_subst"`'
+CFLAGS='`$ECHO "$CFLAGS" | $SED "$delay_single_quote_subst"`'
+compiler='`$ECHO "$compiler" | $SED "$delay_single_quote_subst"`'
+GCC='`$ECHO "$GCC" | $SED "$delay_single_quote_subst"`'
+lt_cv_sys_global_symbol_pipe='`$ECHO "$lt_cv_sys_global_symbol_pipe" | $SED "$delay_single_quote_subst"`'
+lt_cv_sys_global_symbol_to_cdecl='`$ECHO "$lt_cv_sys_global_symbol_to_cdecl" | $SED "$delay_single_quote_subst"`'
+lt_cv_sys_global_symbol_to_c_name_address='`$ECHO "$lt_cv_sys_global_symbol_to_c_name_address" | $SED "$delay_single_quote_subst"`'
+lt_cv_sys_global_symbol_to_c_name_address_lib_prefix='`$ECHO "$lt_cv_sys_global_symbol_to_c_name_address_lib_prefix" | $SED "$delay_single_quote_subst"`'
+nm_file_list_spec='`$ECHO "$nm_file_list_spec" | $SED "$delay_single_quote_subst"`'
+lt_sysroot='`$ECHO "$lt_sysroot" | $SED "$delay_single_quote_subst"`'
+objdir='`$ECHO "$objdir" | $SED "$delay_single_quote_subst"`'
+MAGIC_CMD='`$ECHO "$MAGIC_CMD" | $SED "$delay_single_quote_subst"`'
+lt_prog_compiler_no_builtin_flag='`$ECHO "$lt_prog_compiler_no_builtin_flag" | $SED "$delay_single_quote_subst"`'
+lt_prog_compiler_pic='`$ECHO "$lt_prog_compiler_pic" | $SED "$delay_single_quote_subst"`'
+lt_prog_compiler_wl='`$ECHO "$lt_prog_compiler_wl" | $SED "$delay_single_quote_subst"`'
+lt_prog_compiler_static='`$ECHO "$lt_prog_compiler_static" | $SED "$delay_single_quote_subst"`'
+lt_cv_prog_compiler_c_o='`$ECHO "$lt_cv_prog_compiler_c_o" | $SED "$delay_single_quote_subst"`'
+need_locks='`$ECHO "$need_locks" | $SED "$delay_single_quote_subst"`'
+MANIFEST_TOOL='`$ECHO "$MANIFEST_TOOL" | $SED "$delay_single_quote_subst"`'
+DSYMUTIL='`$ECHO "$DSYMUTIL" | $SED "$delay_single_quote_subst"`'
+NMEDIT='`$ECHO "$NMEDIT" | $SED "$delay_single_quote_subst"`'
+LIPO='`$ECHO "$LIPO" | $SED "$delay_single_quote_subst"`'
+OTOOL='`$ECHO "$OTOOL" | $SED "$delay_single_quote_subst"`'
+OTOOL64='`$ECHO "$OTOOL64" | $SED "$delay_single_quote_subst"`'
+libext='`$ECHO "$libext" | $SED "$delay_single_quote_subst"`'
+shrext_cmds='`$ECHO "$shrext_cmds" | $SED "$delay_single_quote_subst"`'
+extract_expsyms_cmds='`$ECHO "$extract_expsyms_cmds" | $SED "$delay_single_quote_subst"`'
+archive_cmds_need_lc='`$ECHO "$archive_cmds_need_lc" | $SED "$delay_single_quote_subst"`'
+enable_shared_with_static_runtimes='`$ECHO "$enable_shared_with_static_runtimes" | $SED "$delay_single_quote_subst"`'
+export_dynamic_flag_spec='`$ECHO "$export_dynamic_flag_spec" | $SED "$delay_single_quote_subst"`'
+whole_archive_flag_spec='`$ECHO "$whole_archive_flag_spec" | $SED "$delay_single_quote_subst"`'
+compiler_needs_object='`$ECHO "$compiler_needs_object" | $SED "$delay_single_quote_subst"`'
+old_archive_from_new_cmds='`$ECHO "$old_archive_from_new_cmds" | $SED "$delay_single_quote_subst"`'
+old_archive_from_expsyms_cmds='`$ECHO "$old_archive_from_expsyms_cmds" | $SED "$delay_single_quote_subst"`'
+archive_cmds='`$ECHO "$archive_cmds" | $SED "$delay_single_quote_subst"`'
+archive_expsym_cmds='`$ECHO "$archive_expsym_cmds" | $SED "$delay_single_quote_subst"`'
+module_cmds='`$ECHO "$module_cmds" | $SED "$delay_single_quote_subst"`'
+module_expsym_cmds='`$ECHO "$module_expsym_cmds" | $SED "$delay_single_quote_subst"`'
+with_gnu_ld='`$ECHO "$with_gnu_ld" | $SED "$delay_single_quote_subst"`'
+allow_undefined_flag='`$ECHO "$allow_undefined_flag" | $SED "$delay_single_quote_subst"`'
+no_undefined_flag='`$ECHO "$no_undefined_flag" | $SED "$delay_single_quote_subst"`'
+hardcode_libdir_flag_spec='`$ECHO "$hardcode_libdir_flag_spec" | $SED "$delay_single_quote_subst"`'
+hardcode_libdir_separator='`$ECHO "$hardcode_libdir_separator" | $SED "$delay_single_quote_subst"`'
+hardcode_direct='`$ECHO "$hardcode_direct" | $SED "$delay_single_quote_subst"`'
+hardcode_direct_absolute='`$ECHO "$hardcode_direct_absolute" | $SED "$delay_single_quote_subst"`'
+hardcode_minus_L='`$ECHO "$hardcode_minus_L" | $SED "$delay_single_quote_subst"`'
+hardcode_shlibpath_var='`$ECHO "$hardcode_shlibpath_var" | $SED "$delay_single_quote_subst"`'
+hardcode_automatic='`$ECHO "$hardcode_automatic" | $SED "$delay_single_quote_subst"`'
+inherit_rpath='`$ECHO "$inherit_rpath" | $SED "$delay_single_quote_subst"`'
+link_all_deplibs='`$ECHO "$link_all_deplibs" | $SED "$delay_single_quote_subst"`'
+always_export_symbols='`$ECHO "$always_export_symbols" | $SED "$delay_single_quote_subst"`'
+export_symbols_cmds='`$ECHO "$export_symbols_cmds" | $SED "$delay_single_quote_subst"`'
+exclude_expsyms='`$ECHO "$exclude_expsyms" | $SED "$delay_single_quote_subst"`'
+include_expsyms='`$ECHO "$include_expsyms" | $SED "$delay_single_quote_subst"`'
+prelink_cmds='`$ECHO "$prelink_cmds" | $SED "$delay_single_quote_subst"`'
+postlink_cmds='`$ECHO "$postlink_cmds" | $SED "$delay_single_quote_subst"`'
+file_list_spec='`$ECHO "$file_list_spec" | $SED "$delay_single_quote_subst"`'
+variables_saved_for_relink='`$ECHO "$variables_saved_for_relink" | $SED "$delay_single_quote_subst"`'
+need_lib_prefix='`$ECHO "$need_lib_prefix" | $SED "$delay_single_quote_subst"`'
+need_version='`$ECHO "$need_version" | $SED "$delay_single_quote_subst"`'
+version_type='`$ECHO "$version_type" | $SED "$delay_single_quote_subst"`'
+runpath_var='`$ECHO "$runpath_var" | $SED "$delay_single_quote_subst"`'
+shlibpath_var='`$ECHO "$shlibpath_var" | $SED "$delay_single_quote_subst"`'
+shlibpath_overrides_runpath='`$ECHO "$shlibpath_overrides_runpath" | $SED "$delay_single_quote_subst"`'
+libname_spec='`$ECHO "$libname_spec" | $SED "$delay_single_quote_subst"`'
+library_names_spec='`$ECHO "$library_names_spec" | $SED "$delay_single_quote_subst"`'
+soname_spec='`$ECHO "$soname_spec" | $SED "$delay_single_quote_subst"`'
+install_override_mode='`$ECHO "$install_override_mode" | $SED "$delay_single_quote_subst"`'
+postinstall_cmds='`$ECHO "$postinstall_cmds" | $SED "$delay_single_quote_subst"`'
+postuninstall_cmds='`$ECHO "$postuninstall_cmds" | $SED "$delay_single_quote_subst"`'
+finish_cmds='`$ECHO "$finish_cmds" | $SED "$delay_single_quote_subst"`'
+finish_eval='`$ECHO "$finish_eval" | $SED "$delay_single_quote_subst"`'
+hardcode_into_libs='`$ECHO "$hardcode_into_libs" | $SED "$delay_single_quote_subst"`'
+sys_lib_search_path_spec='`$ECHO "$sys_lib_search_path_spec" | $SED "$delay_single_quote_subst"`'
+sys_lib_dlsearch_path_spec='`$ECHO "$sys_lib_dlsearch_path_spec" | $SED "$delay_single_quote_subst"`'
+hardcode_action='`$ECHO "$hardcode_action" | $SED "$delay_single_quote_subst"`'
+enable_dlopen='`$ECHO "$enable_dlopen" | $SED "$delay_single_quote_subst"`'
+enable_dlopen_self='`$ECHO "$enable_dlopen_self" | $SED "$delay_single_quote_subst"`'
+enable_dlopen_self_static='`$ECHO "$enable_dlopen_self_static" | $SED "$delay_single_quote_subst"`'
+old_striplib='`$ECHO "$old_striplib" | $SED "$delay_single_quote_subst"`'
+striplib='`$ECHO "$striplib" | $SED "$delay_single_quote_subst"`'
+compiler_lib_search_dirs='`$ECHO "$compiler_lib_search_dirs" | $SED "$delay_single_quote_subst"`'
+predep_objects='`$ECHO "$predep_objects" | $SED "$delay_single_quote_subst"`'
+postdep_objects='`$ECHO "$postdep_objects" | $SED "$delay_single_quote_subst"`'
+predeps='`$ECHO "$predeps" | $SED "$delay_single_quote_subst"`'
+postdeps='`$ECHO "$postdeps" | $SED "$delay_single_quote_subst"`'
+compiler_lib_search_path='`$ECHO "$compiler_lib_search_path" | $SED "$delay_single_quote_subst"`'
+LD_CXX='`$ECHO "$LD_CXX" | $SED "$delay_single_quote_subst"`'
+reload_flag_CXX='`$ECHO "$reload_flag_CXX" | $SED "$delay_single_quote_subst"`'
+reload_cmds_CXX='`$ECHO "$reload_cmds_CXX" | $SED "$delay_single_quote_subst"`'
+old_archive_cmds_CXX='`$ECHO "$old_archive_cmds_CXX" | $SED "$delay_single_quote_subst"`'
+compiler_CXX='`$ECHO "$compiler_CXX" | $SED "$delay_single_quote_subst"`'
+GCC_CXX='`$ECHO "$GCC_CXX" | $SED "$delay_single_quote_subst"`'
+lt_prog_compiler_no_builtin_flag_CXX='`$ECHO "$lt_prog_compiler_no_builtin_flag_CXX" | $SED "$delay_single_quote_subst"`'
+lt_prog_compiler_pic_CXX='`$ECHO "$lt_prog_compiler_pic_CXX" | $SED "$delay_single_quote_subst"`'
+lt_prog_compiler_wl_CXX='`$ECHO "$lt_prog_compiler_wl_CXX" | $SED "$delay_single_quote_subst"`'
+lt_prog_compiler_static_CXX='`$ECHO "$lt_prog_compiler_static_CXX" | $SED "$delay_single_quote_subst"`'
+lt_cv_prog_compiler_c_o_CXX='`$ECHO "$lt_cv_prog_compiler_c_o_CXX" | $SED "$delay_single_quote_subst"`'
+archive_cmds_need_lc_CXX='`$ECHO "$archive_cmds_need_lc_CXX" | $SED "$delay_single_quote_subst"`'
+enable_shared_with_static_runtimes_CXX='`$ECHO "$enable_shared_with_static_runtimes_CXX" | $SED "$delay_single_quote_subst"`'
+export_dynamic_flag_spec_CXX='`$ECHO "$export_dynamic_flag_spec_CXX" | $SED "$delay_single_quote_subst"`'
+whole_archive_flag_spec_CXX='`$ECHO "$whole_archive_flag_spec_CXX" | $SED "$delay_single_quote_subst"`'
+compiler_needs_object_CXX='`$ECHO "$compiler_needs_object_CXX" | $SED "$delay_single_quote_subst"`'
+old_archive_from_new_cmds_CXX='`$ECHO "$old_archive_from_new_cmds_CXX" | $SED "$delay_single_quote_subst"`'
+old_archive_from_expsyms_cmds_CXX='`$ECHO "$old_archive_from_expsyms_cmds_CXX" | $SED "$delay_single_quote_subst"`'
+archive_cmds_CXX='`$ECHO "$archive_cmds_CXX" | $SED "$delay_single_quote_subst"`'
+archive_expsym_cmds_CXX='`$ECHO "$archive_expsym_cmds_CXX" | $SED "$delay_single_quote_subst"`'
+module_cmds_CXX='`$ECHO "$module_cmds_CXX" | $SED "$delay_single_quote_subst"`'
+module_expsym_cmds_CXX='`$ECHO "$module_expsym_cmds_CXX" | $SED "$delay_single_quote_subst"`'
+with_gnu_ld_CXX='`$ECHO "$with_gnu_ld_CXX" | $SED "$delay_single_quote_subst"`'
+allow_undefined_flag_CXX='`$ECHO "$allow_undefined_flag_CXX" | $SED "$delay_single_quote_subst"`'
+no_undefined_flag_CXX='`$ECHO "$no_undefined_flag_CXX" | $SED "$delay_single_quote_subst"`'
+hardcode_libdir_flag_spec_CXX='`$ECHO "$hardcode_libdir_flag_spec_CXX" | $SED "$delay_single_quote_subst"`'
+hardcode_libdir_separator_CXX='`$ECHO "$hardcode_libdir_separator_CXX" | $SED "$delay_single_quote_subst"`'
+hardcode_direct_CXX='`$ECHO "$hardcode_direct_CXX" | $SED "$delay_single_quote_subst"`'
+hardcode_direct_absolute_CXX='`$ECHO "$hardcode_direct_absolute_CXX" | $SED "$delay_single_quote_subst"`'
+hardcode_minus_L_CXX='`$ECHO "$hardcode_minus_L_CXX" | $SED "$delay_single_quote_subst"`'
+hardcode_shlibpath_var_CXX='`$ECHO "$hardcode_shlibpath_var_CXX" | $SED "$delay_single_quote_subst"`'
+hardcode_automatic_CXX='`$ECHO "$hardcode_automatic_CXX" | $SED "$delay_single_quote_subst"`'
+inherit_rpath_CXX='`$ECHO "$inherit_rpath_CXX" | $SED "$delay_single_quote_subst"`'
+link_all_deplibs_CXX='`$ECHO "$link_all_deplibs_CXX" | $SED "$delay_single_quote_subst"`'
+always_export_symbols_CXX='`$ECHO "$always_export_symbols_CXX" | $SED "$delay_single_quote_subst"`'
+export_symbols_cmds_CXX='`$ECHO "$export_symbols_cmds_CXX" | $SED "$delay_single_quote_subst"`'
+exclude_expsyms_CXX='`$ECHO "$exclude_expsyms_CXX" | $SED "$delay_single_quote_subst"`'
+include_expsyms_CXX='`$ECHO "$include_expsyms_CXX" | $SED "$delay_single_quote_subst"`'
+prelink_cmds_CXX='`$ECHO "$prelink_cmds_CXX" | $SED "$delay_single_quote_subst"`'
+postlink_cmds_CXX='`$ECHO "$postlink_cmds_CXX" | $SED "$delay_single_quote_subst"`'
+file_list_spec_CXX='`$ECHO "$file_list_spec_CXX" | $SED "$delay_single_quote_subst"`'
+hardcode_action_CXX='`$ECHO "$hardcode_action_CXX" | $SED "$delay_single_quote_subst"`'
+compiler_lib_search_dirs_CXX='`$ECHO "$compiler_lib_search_dirs_CXX" | $SED "$delay_single_quote_subst"`'
+predep_objects_CXX='`$ECHO "$predep_objects_CXX" | $SED "$delay_single_quote_subst"`'
+postdep_objects_CXX='`$ECHO "$postdep_objects_CXX" | $SED "$delay_single_quote_subst"`'
+predeps_CXX='`$ECHO "$predeps_CXX" | $SED "$delay_single_quote_subst"`'
+postdeps_CXX='`$ECHO "$postdeps_CXX" | $SED "$delay_single_quote_subst"`'
+compiler_lib_search_path_CXX='`$ECHO "$compiler_lib_search_path_CXX" | $SED "$delay_single_quote_subst"`'
+
+LTCC='$LTCC'
+LTCFLAGS='$LTCFLAGS'
+compiler='$compiler_DEFAULT'
+
+# A function that is used when there is no print builtin or printf.
+func_fallback_echo ()
+{
+  eval 'cat <<_LTECHO_EOF
+\$1
+_LTECHO_EOF'
+}
+
+# Quote evaled strings.
+for var in AS \
+DLLTOOL \
+OBJDUMP \
+SHELL \
+ECHO \
+PATH_SEPARATOR \
+SED \
+GREP \
+EGREP \
+FGREP \
+LD \
+NM \
+LN_S \
+lt_SP2NL \
+lt_NL2SP \
+reload_flag \
+deplibs_check_method \
+file_magic_cmd \
+file_magic_glob \
+want_nocaseglob \
+sharedlib_from_linklib_cmd \
+AR \
+AR_FLAGS \
+archiver_list_spec \
+STRIP \
+RANLIB \
+CC \
+CFLAGS \
+compiler \
+lt_cv_sys_global_symbol_pipe \
+lt_cv_sys_global_symbol_to_cdecl \
+lt_cv_sys_global_symbol_to_c_name_address \
+lt_cv_sys_global_symbol_to_c_name_address_lib_prefix \
+nm_file_list_spec \
+lt_prog_compiler_no_builtin_flag \
+lt_prog_compiler_pic \
+lt_prog_compiler_wl \
+lt_prog_compiler_static \
+lt_cv_prog_compiler_c_o \
+need_locks \
+MANIFEST_TOOL \
+DSYMUTIL \
+NMEDIT \
+LIPO \
+OTOOL \
+OTOOL64 \
+shrext_cmds \
+export_dynamic_flag_spec \
+whole_archive_flag_spec \
+compiler_needs_object \
+with_gnu_ld \
+allow_undefined_flag \
+no_undefined_flag \
+hardcode_libdir_flag_spec \
+hardcode_libdir_separator \
+exclude_expsyms \
+include_expsyms \
+file_list_spec \
+variables_saved_for_relink \
+libname_spec \
+library_names_spec \
+soname_spec \
+install_override_mode \
+finish_eval \
+old_striplib \
+striplib \
+compiler_lib_search_dirs \
+predep_objects \
+postdep_objects \
+predeps \
+postdeps \
+compiler_lib_search_path \
+LD_CXX \
+reload_flag_CXX \
+compiler_CXX \
+lt_prog_compiler_no_builtin_flag_CXX \
+lt_prog_compiler_pic_CXX \
+lt_prog_compiler_wl_CXX \
+lt_prog_compiler_static_CXX \
+lt_cv_prog_compiler_c_o_CXX \
+export_dynamic_flag_spec_CXX \
+whole_archive_flag_spec_CXX \
+compiler_needs_object_CXX \
+with_gnu_ld_CXX \
+allow_undefined_flag_CXX \
+no_undefined_flag_CXX \
+hardcode_libdir_flag_spec_CXX \
+hardcode_libdir_separator_CXX \
+exclude_expsyms_CXX \
+include_expsyms_CXX \
+file_list_spec_CXX \
+compiler_lib_search_dirs_CXX \
+predep_objects_CXX \
+postdep_objects_CXX \
+predeps_CXX \
+postdeps_CXX \
+compiler_lib_search_path_CXX; do
+    case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in
+    *[\\\\\\\`\\"\\\$]*)
+      eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED \\"\\\$sed_quote_subst\\"\\\`\\\\\\""
+      ;;
+    *)
+      eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\""
+      ;;
+    esac
+done
+
+# Double-quote double-evaled strings.
+for var in reload_cmds \
+old_postinstall_cmds \
+old_postuninstall_cmds \
+old_archive_cmds \
+extract_expsyms_cmds \
+old_archive_from_new_cmds \
+old_archive_from_expsyms_cmds \
+archive_cmds \
+archive_expsym_cmds \
+module_cmds \
+module_expsym_cmds \
+export_symbols_cmds \
+prelink_cmds \
+postlink_cmds \
+postinstall_cmds \
+postuninstall_cmds \
+finish_cmds \
+sys_lib_search_path_spec \
+sys_lib_dlsearch_path_spec \
+reload_cmds_CXX \
+old_archive_cmds_CXX \
+old_archive_from_new_cmds_CXX \
+old_archive_from_expsyms_cmds_CXX \
+archive_cmds_CXX \
+archive_expsym_cmds_CXX \
+module_cmds_CXX \
+module_expsym_cmds_CXX \
+export_symbols_cmds_CXX \
+prelink_cmds_CXX \
+postlink_cmds_CXX; do
+    case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in
+    *[\\\\\\\`\\"\\\$]*)
+      eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED -e \\"\\\$double_quote_subst\\" -e \\"\\\$sed_quote_subst\\" -e \\"\\\$delay_variable_subst\\"\\\`\\\\\\""
+      ;;
+    *)
+      eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\""
+      ;;
+    esac
+done
+
+ac_aux_dir='$ac_aux_dir'
+xsi_shell='$xsi_shell'
+lt_shell_append='$lt_shell_append'
+
+# See if we are running on zsh, and set the options which allow our
+# commands through without removal of \ escapes INIT.
+if test -n "\${ZSH_VERSION+set}" ; then
+   setopt NO_GLOB_SUBST
+fi
+
+
+    PACKAGE='$PACKAGE'
+    VERSION='$VERSION'
+    TIMESTAMP='$TIMESTAMP'
+    RM='$RM'
+    ofile='$ofile'
+
+
+
+
+
+
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+
+# Handling of arguments.
+for ac_config_target in $ac_config_targets
+do
+  case $ac_config_target in
+    "config.h") CONFIG_HEADERS="$CONFIG_HEADERS config.h" ;;
+    "poppler/poppler-config.h") CONFIG_HEADERS="$CONFIG_HEADERS poppler/poppler-config.h" ;;
+    "depfiles") CONFIG_COMMANDS="$CONFIG_COMMANDS depfiles" ;;
+    "libtool") CONFIG_COMMANDS="$CONFIG_COMMANDS libtool" ;;
+    "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;;
+    "goo/Makefile") CONFIG_FILES="$CONFIG_FILES goo/Makefile" ;;
+    "fofi/Makefile") CONFIG_FILES="$CONFIG_FILES fofi/Makefile" ;;
+    "splash/Makefile") CONFIG_FILES="$CONFIG_FILES splash/Makefile" ;;
+    "poppler/Makefile") CONFIG_FILES="$CONFIG_FILES poppler/Makefile" ;;
+    "utils/Makefile") CONFIG_FILES="$CONFIG_FILES utils/Makefile" ;;
+    "glib/Makefile") CONFIG_FILES="$CONFIG_FILES glib/Makefile" ;;
+    "glib/poppler-features.h") CONFIG_FILES="$CONFIG_FILES glib/poppler-features.h" ;;
+    "glib/reference/Makefile") CONFIG_FILES="$CONFIG_FILES glib/reference/Makefile" ;;
+    "glib/reference/version.xml") CONFIG_FILES="$CONFIG_FILES glib/reference/version.xml" ;;
+    "glib/demo/Makefile") CONFIG_FILES="$CONFIG_FILES glib/demo/Makefile" ;;
+    "test/Makefile") CONFIG_FILES="$CONFIG_FILES test/Makefile" ;;
+    "qt4/Makefile") CONFIG_FILES="$CONFIG_FILES qt4/Makefile" ;;
+    "qt4/src/Makefile") CONFIG_FILES="$CONFIG_FILES qt4/src/Makefile" ;;
+    "qt4/tests/Makefile") CONFIG_FILES="$CONFIG_FILES qt4/tests/Makefile" ;;
+    "qt4/demos/Makefile") CONFIG_FILES="$CONFIG_FILES qt4/demos/Makefile" ;;
+    "cpp/Makefile") CONFIG_FILES="$CONFIG_FILES cpp/Makefile" ;;
+    "cpp/poppler-version.h") CONFIG_FILES="$CONFIG_FILES cpp/poppler-version.h" ;;
+    "cpp/tests/Makefile") CONFIG_FILES="$CONFIG_FILES cpp/tests/Makefile" ;;
+    "poppler.pc") CONFIG_FILES="$CONFIG_FILES poppler.pc" ;;
+    "poppler-uninstalled.pc") CONFIG_FILES="$CONFIG_FILES poppler-uninstalled.pc" ;;
+    "poppler-cairo.pc") CONFIG_FILES="$CONFIG_FILES poppler-cairo.pc" ;;
+    "poppler-cairo-uninstalled.pc") CONFIG_FILES="$CONFIG_FILES poppler-cairo-uninstalled.pc" ;;
+    "poppler-splash.pc") CONFIG_FILES="$CONFIG_FILES poppler-splash.pc" ;;
+    "poppler-splash-uninstalled.pc") CONFIG_FILES="$CONFIG_FILES poppler-splash-uninstalled.pc" ;;
+    "poppler-glib.pc") CONFIG_FILES="$CONFIG_FILES poppler-glib.pc" ;;
+    "poppler-glib-uninstalled.pc") CONFIG_FILES="$CONFIG_FILES poppler-glib-uninstalled.pc" ;;
+    "poppler-qt4.pc") CONFIG_FILES="$CONFIG_FILES poppler-qt4.pc" ;;
+    "poppler-qt4-uninstalled.pc") CONFIG_FILES="$CONFIG_FILES poppler-qt4-uninstalled.pc" ;;
+    "poppler-cpp.pc") CONFIG_FILES="$CONFIG_FILES poppler-cpp.pc" ;;
+    "poppler-cpp-uninstalled.pc") CONFIG_FILES="$CONFIG_FILES poppler-cpp-uninstalled.pc" ;;
+
+  *) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5;;
+  esac
+done
+
+
+# If the user did not use the arguments to specify the items to instantiate,
+# then the envvar interface is used.  Set only those that are not.
+# We use the long form for the default assignment because of an extremely
+# bizarre bug on SunOS 4.1.3.
+if $ac_need_defaults; then
+  test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files
+  test "${CONFIG_HEADERS+set}" = set || CONFIG_HEADERS=$config_headers
+  test "${CONFIG_COMMANDS+set}" = set || CONFIG_COMMANDS=$config_commands
+fi
+
+# Have a temporary directory for convenience.  Make it in the build tree
+# simply because there is no reason against having it here, and in addition,
+# creating and moving files from /tmp can sometimes cause problems.
+# Hook for its removal unless debugging.
+# Note that there is a small window in which the directory will not be cleaned:
+# after its creation but before its name has been assigned to `$tmp'.
+$debug ||
+{
+  tmp= ac_tmp=
+  trap 'exit_status=$?
+  : "${ac_tmp:=$tmp}"
+  { test ! -d "$ac_tmp" || rm -fr "$ac_tmp"; } && exit $exit_status
+' 0
+  trap 'as_fn_exit 1' 1 2 13 15
+}
+# Create a (secure) tmp directory for tmp files.
+
+{
+  tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` &&
+  test -d "$tmp"
+}  ||
+{
+  tmp=./conf$$-$RANDOM
+  (umask 077 && mkdir "$tmp")
+} || as_fn_error $? "cannot create a temporary directory in ." "$LINENO" 5
+ac_tmp=$tmp
+
+# Set up the scripts for CONFIG_FILES section.
+# No need to generate them if there are no CONFIG_FILES.
+# This happens for instance with `./config.status config.h'.
+if test -n "$CONFIG_FILES"; then
+
+
+ac_cr=`echo X | tr X '\015'`
+# On cygwin, bash can eat \r inside `` if the user requested igncr.
+# But we know of no other shell where ac_cr would be empty at this
+# point, so we can use a bashism as a fallback.
+if test "x$ac_cr" = x; then
+  eval ac_cr=\$\'\\r\'
+fi
+ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' </dev/null 2>/dev/null`
+if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then
+  ac_cs_awk_cr='\\r'
+else
+  ac_cs_awk_cr=$ac_cr
+fi
+
+echo 'BEGIN {' >"$ac_tmp/subs1.awk" &&
+_ACEOF
+
+
+{
+  echo "cat >conf$$subs.awk <<_ACEOF" &&
+  echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' &&
+  echo "_ACEOF"
+} >conf$$subs.sh ||
+  as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5
+ac_delim_num=`echo "$ac_subst_vars" | grep -c '^'`
+ac_delim='%!_!# '
+for ac_last_try in false false false false false :; do
+  . ./conf$$subs.sh ||
+    as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5
+
+  ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X`
+  if test $ac_delim_n = $ac_delim_num; then
+    break
+  elif $ac_last_try; then
+    as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5
+  else
+    ac_delim="$ac_delim!$ac_delim _$ac_delim!! "
+  fi
+done
+rm -f conf$$subs.sh
+
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+cat >>"\$ac_tmp/subs1.awk" <<\\_ACAWK &&
+_ACEOF
+sed -n '
+h
+s/^/S["/; s/!.*/"]=/
+p
+g
+s/^[^!]*!//
+:repl
+t repl
+s/'"$ac_delim"'$//
+t delim
+:nl
+h
+s/\(.\{148\}\)..*/\1/
+t more1
+s/["\\]/\\&/g; s/^/"/; s/$/\\n"\\/
+p
+n
+b repl
+:more1
+s/["\\]/\\&/g; s/^/"/; s/$/"\\/
+p
+g
+s/.\{148\}//
+t nl
+:delim
+h
+s/\(.\{148\}\)..*/\1/
+t more2
+s/["\\]/\\&/g; s/^/"/; s/$/"/
+p
+b
+:more2
+s/["\\]/\\&/g; s/^/"/; s/$/"\\/
+p
+g
+s/.\{148\}//
+t delim
+' <conf$$subs.awk | sed '
+/^[^""]/{
+  N
+  s/\n//
+}
+' >>$CONFIG_STATUS || ac_write_fail=1
+rm -f conf$$subs.awk
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+_ACAWK
+cat >>"\$ac_tmp/subs1.awk" <<_ACAWK &&
+  for (key in S) S_is_set[key] = 1
+  FS = "\a"
+
+}
+{
+  line = $ 0
+  nfields = split(line, field, "@")
+  substed = 0
+  len = length(field[1])
+  for (i = 2; i < nfields; i++) {
+    key = field[i]
+    keylen = length(key)
+    if (S_is_set[key]) {
+      value = S[key]
+      line = substr(line, 1, len) "" value "" substr(line, len + keylen + 3)
+      len += length(value) + length(field[++i])
+      substed = 1
+    } else
+      len += 1 + keylen
+  }
+
+  print line
+}
+
+_ACAWK
+_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then
+  sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g"
+else
+  cat
+fi < "$ac_tmp/subs1.awk" > "$ac_tmp/subs.awk" \
+  || as_fn_error $? "could not setup config files machinery" "$LINENO" 5
+_ACEOF
+
+# VPATH may cause trouble with some makes, so we remove sole $(srcdir),
+# ${srcdir} and @srcdir@ entries from VPATH if srcdir is ".", strip leading and
+# trailing colons and then remove the whole line if VPATH becomes empty
+# (actually we leave an empty line to preserve line numbers).
+if test "x$srcdir" = x.; then
+  ac_vpsub='/^[         ]*VPATH[        ]*=[    ]*/{
+h
+s///
+s/^/:/
+s/[     ]*$/:/
+s/:\$(srcdir):/:/g
+s/:\${srcdir}:/:/g
+s/:@srcdir@:/:/g
+s/^:*//
+s/:*$//
+x
+s/\(=[  ]*\).*/\1/
+G
+s/\n//
+s/^[^=]*=[      ]*$//
+}'
+fi
+
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+fi # test -n "$CONFIG_FILES"
+
+# Set up the scripts for CONFIG_HEADERS section.
+# No need to generate them if there are no CONFIG_HEADERS.
+# This happens for instance with `./config.status Makefile'.
+if test -n "$CONFIG_HEADERS"; then
+cat >"$ac_tmp/defines.awk" <<\_ACAWK ||
+BEGIN {
+_ACEOF
+
+# Transform confdefs.h into an awk script `defines.awk', embedded as
+# here-document in config.status, that substitutes the proper values into
+# config.h.in to produce config.h.
+
+# Create a delimiter string that does not exist in confdefs.h, to ease
+# handling of long lines.
+ac_delim='%!_!# '
+for ac_last_try in false false :; do
+  ac_tt=`sed -n "/$ac_delim/p" confdefs.h`
+  if test -z "$ac_tt"; then
+    break
+  elif $ac_last_try; then
+    as_fn_error $? "could not make $CONFIG_HEADERS" "$LINENO" 5
+  else
+    ac_delim="$ac_delim!$ac_delim _$ac_delim!! "
+  fi
+done
+
+# For the awk script, D is an array of macro values keyed by name,
+# likewise P contains macro parameters if any.  Preserve backslash
+# newline sequences.
+
+ac_word_re=[_$as_cr_Letters][_$as_cr_alnum]*
+sed -n '
+s/.\{148\}/&'"$ac_delim"'/g
+t rset
+:rset
+s/^[    ]*#[    ]*define[       ][      ]*/ /
+t def
+d
+:def
+s/\\$//
+t bsnl
+s/["\\]/\\&/g
+s/^ \('"$ac_word_re"'\)\(([^()]*)\)[    ]*\(.*\)/P["\1"]="\2"\
+D["\1"]=" \3"/p
+s/^ \('"$ac_word_re"'\)[        ]*\(.*\)/D["\1"]=" \2"/p
+d
+:bsnl
+s/["\\]/\\&/g
+s/^ \('"$ac_word_re"'\)\(([^()]*)\)[    ]*\(.*\)/P["\1"]="\2"\
+D["\1"]=" \3\\\\\\n"\\/p
+t cont
+s/^ \('"$ac_word_re"'\)[        ]*\(.*\)/D["\1"]=" \2\\\\\\n"\\/p
+t cont
+d
+:cont
+n
+s/.\{148\}/&'"$ac_delim"'/g
+t clear
+:clear
+s/\\$//
+t bsnlc
+s/["\\]/\\&/g; s/^/"/; s/$/"/p
+d
+:bsnlc
+s/["\\]/\\&/g; s/^/"/; s/$/\\\\\\n"\\/p
+b cont
+' <confdefs.h | sed '
+s/'"$ac_delim"'/"\\\
+"/g' >>$CONFIG_STATUS || ac_write_fail=1
+
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+  for (key in D) D_is_set[key] = 1
+  FS = "\a"
+}
+/^[\t ]*#[\t ]*(define|undef)[\t ]+$ac_word_re([\t (]|\$)/ {
+  line = \$ 0
+  split(line, arg, " ")
+  if (arg[1] == "#") {
+    defundef = arg[2]
+    mac1 = arg[3]
+  } else {
+    defundef = substr(arg[1], 2)
+    mac1 = arg[2]
+  }
+  split(mac1, mac2, "(") #)
+  macro = mac2[1]
+  prefix = substr(line, 1, index(line, defundef) - 1)
+  if (D_is_set[macro]) {
+    # Preserve the white space surrounding the "#".
+    print prefix "define", macro P[macro] D[macro]
+    next
+  } else {
+    # Replace #undef with comments.  This is necessary, for example,
+    # in the case of _POSIX_SOURCE, which is predefined and required
+    # on some systems where configure will not decide to define it.
+    if (defundef == "undef") {
+      print "/*", prefix defundef, macro, "*/"
+      next
+    }
+  }
+}
+{ print }
+_ACAWK
+_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+  as_fn_error $? "could not setup config headers machinery" "$LINENO" 5
+fi # test -n "$CONFIG_HEADERS"
+
+
+eval set X "  :F $CONFIG_FILES  :H $CONFIG_HEADERS    :C $CONFIG_COMMANDS"
+shift
+for ac_tag
+do
+  case $ac_tag in
+  :[FHLC]) ac_mode=$ac_tag; continue;;
+  esac
+  case $ac_mode$ac_tag in
+  :[FHL]*:*);;
+  :L* | :C*:*) as_fn_error $? "invalid tag \`$ac_tag'" "$LINENO" 5;;
+  :[FH]-) ac_tag=-:-;;
+  :[FH]*) ac_tag=$ac_tag:$ac_tag.in;;
+  esac
+  ac_save_IFS=$IFS
+  IFS=:
+  set x $ac_tag
+  IFS=$ac_save_IFS
+  shift
+  ac_file=$1
+  shift
+
+  case $ac_mode in
+  :L) ac_source=$1;;
+  :[FH])
+    ac_file_inputs=
+    for ac_f
+    do
+      case $ac_f in
+      -) ac_f="$ac_tmp/stdin";;
+      *) # Look for the file first in the build tree, then in the source tree
+        # (if the path is not absolute).  The absolute path cannot be DOS-style,
+        # because $ac_f cannot contain `:'.
+        test -f "$ac_f" ||
+          case $ac_f in
+          [\\/$]*) false;;
+          *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";;
+          esac ||
+          as_fn_error 1 "cannot find input file: \`$ac_f'" "$LINENO" 5;;
+      esac
+      case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac
+      as_fn_append ac_file_inputs " '$ac_f'"
+    done
+
+    # Let's still pretend it is `configure' which instantiates (i.e., don't
+    # use $as_me), people would be surprised to read:
+    #    /* config.h.  Generated by config.status.  */
+    configure_input='Generated from '`
+         $as_echo "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g'
+       `' by configure.'
+    if test x"$ac_file" != x-; then
+      configure_input="$ac_file.  $configure_input"
+      { $as_echo "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5
+$as_echo "$as_me: creating $ac_file" >&6;}
+    fi
+    # Neutralize special characters interpreted by sed in replacement strings.
+    case $configure_input in #(
+    *\&* | *\|* | *\\* )
+       ac_sed_conf_input=`$as_echo "$configure_input" |
+       sed 's/[\\\\&|]/\\\\&/g'`;; #(
+    *) ac_sed_conf_input=$configure_input;;
+    esac
+
+    case $ac_tag in
+    *:-:* | *:-) cat >"$ac_tmp/stdin" \
+      || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;;
+    esac
+    ;;
+  esac
+
+  ac_dir=`$as_dirname -- "$ac_file" ||
+$as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+        X"$ac_file" : 'X\(//\)[^/]' \| \
+        X"$ac_file" : 'X\(//\)$' \| \
+        X"$ac_file" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X"$ac_file" |
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+           s//\1/
+           q
+         }
+         /^X\(\/\/\)[^/].*/{
+           s//\1/
+           q
+         }
+         /^X\(\/\/\)$/{
+           s//\1/
+           q
+         }
+         /^X\(\/\).*/{
+           s//\1/
+           q
+         }
+         s/.*/./; q'`
+  as_dir="$ac_dir"; as_fn_mkdir_p
+  ac_builddir=.
+
+case "$ac_dir" in
+.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;;
+*)
+  ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'`
+  # A ".." for each directory in $ac_dir_suffix.
+  ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'`
+  case $ac_top_builddir_sub in
+  "") ac_top_builddir_sub=. ac_top_build_prefix= ;;
+  *)  ac_top_build_prefix=$ac_top_builddir_sub/ ;;
+  esac ;;
+esac
+ac_abs_top_builddir=$ac_pwd
+ac_abs_builddir=$ac_pwd$ac_dir_suffix
+# for backward compatibility:
+ac_top_builddir=$ac_top_build_prefix
+
+case $srcdir in
+  .)  # We are building in place.
+    ac_srcdir=.
+    ac_top_srcdir=$ac_top_builddir_sub
+    ac_abs_top_srcdir=$ac_pwd ;;
+  [\\/]* | ?:[\\/]* )  # Absolute name.
+    ac_srcdir=$srcdir$ac_dir_suffix;
+    ac_top_srcdir=$srcdir
+    ac_abs_top_srcdir=$srcdir ;;
+  *) # Relative name.
+    ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix
+    ac_top_srcdir=$ac_top_build_prefix$srcdir
+    ac_abs_top_srcdir=$ac_pwd/$srcdir ;;
+esac
+ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix
+
+
+  case $ac_mode in
+  :F)
+  #
+  # CONFIG_FILE
+  #
+
+  case $INSTALL in
+  [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;;
+  *) ac_INSTALL=$ac_top_build_prefix$INSTALL ;;
+  esac
+  ac_MKDIR_P=$MKDIR_P
+  case $MKDIR_P in
+  [\\/$]* | ?:[\\/]* ) ;;
+  */*) ac_MKDIR_P=$ac_top_build_prefix$MKDIR_P ;;
+  esac
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+# If the template does not know about datarootdir, expand it.
+# FIXME: This hack should be removed a few years after 2.60.
+ac_datarootdir_hack=; ac_datarootdir_seen=
+ac_sed_dataroot='
+/datarootdir/ {
+  p
+  q
+}
+/@datadir@/p
+/@docdir@/p
+/@infodir@/p
+/@localedir@/p
+/@mandir@/p'
+case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in
+*datarootdir*) ac_datarootdir_seen=yes;;
+*@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*)
+  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5
+$as_echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;}
+_ACEOF
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+  ac_datarootdir_hack='
+  s&@datadir@&$datadir&g
+  s&@docdir@&$docdir&g
+  s&@infodir@&$infodir&g
+  s&@localedir@&$localedir&g
+  s&@mandir@&$mandir&g
+  s&\\\${datarootdir}&$datarootdir&g' ;;
+esac
+_ACEOF
+
+# Neutralize VPATH when `$srcdir' = `.'.
+# Shell code in configure.ac might set extrasub.
+# FIXME: do we really want to maintain this feature?
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+ac_sed_extra="$ac_vpsub
+$extrasub
+_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+:t
+/@[a-zA-Z_][a-zA-Z_0-9]*@/!b
+s|@configure_input@|$ac_sed_conf_input|;t t
+s&@top_builddir@&$ac_top_builddir_sub&;t t
+s&@top_build_prefix@&$ac_top_build_prefix&;t t
+s&@srcdir@&$ac_srcdir&;t t
+s&@abs_srcdir@&$ac_abs_srcdir&;t t
+s&@top_srcdir@&$ac_top_srcdir&;t t
+s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t
+s&@builddir@&$ac_builddir&;t t
+s&@abs_builddir@&$ac_abs_builddir&;t t
+s&@abs_top_builddir@&$ac_abs_top_builddir&;t t
+s&@INSTALL@&$ac_INSTALL&;t t
+s&@MKDIR_P@&$ac_MKDIR_P&;t t
+$ac_datarootdir_hack
+"
+eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$ac_tmp/subs.awk" \
+  >$ac_tmp/out || as_fn_error $? "could not create $ac_file" "$LINENO" 5
+
+test -z "$ac_datarootdir_hack$ac_datarootdir_seen" &&
+  { ac_out=`sed -n '/\${datarootdir}/p' "$ac_tmp/out"`; test -n "$ac_out"; } &&
+  { ac_out=`sed -n '/^[         ]*datarootdir[  ]*:*=/p' \
+      "$ac_tmp/out"`; test -z "$ac_out"; } &&
+  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir'
+which seems to be undefined.  Please make sure it is defined" >&5
+$as_echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir'
+which seems to be undefined.  Please make sure it is defined" >&2;}
+
+  rm -f "$ac_tmp/stdin"
+  case $ac_file in
+  -) cat "$ac_tmp/out" && rm -f "$ac_tmp/out";;
+  *) rm -f "$ac_file" && mv "$ac_tmp/out" "$ac_file";;
+  esac \
+  || as_fn_error $? "could not create $ac_file" "$LINENO" 5
+ ;;
+  :H)
+  #
+  # CONFIG_HEADER
+  #
+  if test x"$ac_file" != x-; then
+    {
+      $as_echo "/* $configure_input  */" \
+      && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs"
+    } >"$ac_tmp/config.h" \
+      || as_fn_error $? "could not create $ac_file" "$LINENO" 5
+    if diff "$ac_file" "$ac_tmp/config.h" >/dev/null 2>&1; then
+      { $as_echo "$as_me:${as_lineno-$LINENO}: $ac_file is unchanged" >&5
+$as_echo "$as_me: $ac_file is unchanged" >&6;}
+    else
+      rm -f "$ac_file"
+      mv "$ac_tmp/config.h" "$ac_file" \
+       || as_fn_error $? "could not create $ac_file" "$LINENO" 5
+    fi
+  else
+    $as_echo "/* $configure_input  */" \
+      && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" \
+      || as_fn_error $? "could not create -" "$LINENO" 5
+  fi
+# Compute "$ac_file"'s index in $config_headers.
+_am_arg="$ac_file"
+_am_stamp_count=1
+for _am_header in $config_headers :; do
+  case $_am_header in
+    $_am_arg | $_am_arg:* )
+      break ;;
+    * )
+      _am_stamp_count=`expr $_am_stamp_count + 1` ;;
+  esac
+done
+echo "timestamp for $_am_arg" >`$as_dirname -- "$_am_arg" ||
+$as_expr X"$_am_arg" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+        X"$_am_arg" : 'X\(//\)[^/]' \| \
+        X"$_am_arg" : 'X\(//\)$' \| \
+        X"$_am_arg" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X"$_am_arg" |
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+           s//\1/
+           q
+         }
+         /^X\(\/\/\)[^/].*/{
+           s//\1/
+           q
+         }
+         /^X\(\/\/\)$/{
+           s//\1/
+           q
+         }
+         /^X\(\/\).*/{
+           s//\1/
+           q
+         }
+         s/.*/./; q'`/stamp-h$_am_stamp_count
+ ;;
+
+  :C)  { $as_echo "$as_me:${as_lineno-$LINENO}: executing $ac_file commands" >&5
+$as_echo "$as_me: executing $ac_file commands" >&6;}
+ ;;
+  esac
+
+
+  case $ac_file$ac_mode in
+    "depfiles":C) test x"$AMDEP_TRUE" != x"" || {
+  # Autoconf 2.62 quotes --file arguments for eval, but not when files
+  # are listed without --file.  Let's play safe and only enable the eval
+  # if we detect the quoting.
+  case $CONFIG_FILES in
+  *\'*) eval set x "$CONFIG_FILES" ;;
+  *)   set x $CONFIG_FILES ;;
+  esac
+  shift
+  for mf
+  do
+    # Strip MF so we end up with the name of the file.
+    mf=`echo "$mf" | sed -e 's/:.*$//'`
+    # Check whether this is an Automake generated Makefile or not.
+    # We used to match only the files named `Makefile.in', but
+    # some people rename them; so instead we look at the file content.
+    # Grep'ing the first line is not enough: some people post-process
+    # each Makefile.in and add a new line on top of each file to say so.
+    # Grep'ing the whole file is not good either: AIX grep has a line
+    # limit of 2048, but all sed's we know have understand at least 4000.
+    if sed -n 's,^#.*generated by automake.*,X,p' "$mf" | grep X >/dev/null 2>&1; then
+      dirpart=`$as_dirname -- "$mf" ||
+$as_expr X"$mf" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+        X"$mf" : 'X\(//\)[^/]' \| \
+        X"$mf" : 'X\(//\)$' \| \
+        X"$mf" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X"$mf" |
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+           s//\1/
+           q
+         }
+         /^X\(\/\/\)[^/].*/{
+           s//\1/
+           q
+         }
+         /^X\(\/\/\)$/{
+           s//\1/
+           q
+         }
+         /^X\(\/\).*/{
+           s//\1/
+           q
+         }
+         s/.*/./; q'`
+    else
+      continue
+    fi
+    # Extract the definition of DEPDIR, am__include, and am__quote
+    # from the Makefile without running `make'.
+    DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"`
+    test -z "$DEPDIR" && continue
+    am__include=`sed -n 's/^am__include = //p' < "$mf"`
+    test -z "am__include" && continue
+    am__quote=`sed -n 's/^am__quote = //p' < "$mf"`
+    # When using ansi2knr, U may be empty or an underscore; expand it
+    U=`sed -n 's/^U = //p' < "$mf"`
+    # Find all dependency output files, they are included files with
+    # $(DEPDIR) in their names.  We invoke sed twice because it is the
+    # simplest approach to changing $(DEPDIR) to its actual value in the
+    # expansion.
+    for file in `sed -n "
+      s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \
+        sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g' -e 's/\$U/'"$U"'/g'`; do
+      # Make sure the directory exists.
+      test -f "$dirpart/$file" && continue
+      fdir=`$as_dirname -- "$file" ||
+$as_expr X"$file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+        X"$file" : 'X\(//\)[^/]' \| \
+        X"$file" : 'X\(//\)$' \| \
+        X"$file" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X"$file" |
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+           s//\1/
+           q
+         }
+         /^X\(\/\/\)[^/].*/{
+           s//\1/
+           q
+         }
+         /^X\(\/\/\)$/{
+           s//\1/
+           q
+         }
+         /^X\(\/\).*/{
+           s//\1/
+           q
+         }
+         s/.*/./; q'`
+      as_dir=$dirpart/$fdir; as_fn_mkdir_p
+      # echo "creating $dirpart/$file"
+      echo '# dummy' > "$dirpart/$file"
+    done
+  done
+}
+ ;;
+    "libtool":C)
+
+    # See if we are running on zsh, and set the options which allow our
+    # commands through without removal of \ escapes.
+    if test -n "${ZSH_VERSION+set}" ; then
+      setopt NO_GLOB_SUBST
+    fi
+
+    cfgfile="${ofile}T"
+    trap "$RM \"$cfgfile\"; exit 1" 1 2 15
+    $RM "$cfgfile"
+
+    cat <<_LT_EOF >> "$cfgfile"
+#! $SHELL
+
+# `$ECHO "$ofile" | sed 's%^.*/%%'` - Provide generalized library-building support services.
+# Generated automatically by $as_me ($PACKAGE$TIMESTAMP) $VERSION
+# Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`:
+# NOTE: Changes made to this file will be lost: look at ltmain.sh.
+#
+#   Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005,
+#                 2006, 2007, 2008, 2009, 2010, 2011 Free Software
+#                 Foundation, Inc.
+#   Written by Gordon Matzigkeit, 1996
+#
+#   This file is part of GNU Libtool.
+#
+# GNU Libtool is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License as
+# published by the Free Software Foundation; either version 2 of
+# the License, or (at your option) any later version.
+#
+# As a special exception to the GNU General Public License,
+# if you distribute this file as part of a program or library that
+# is built using GNU Libtool, you may include this file under the
+# same distribution terms that you use for the rest of that program.
+#
+# GNU Libtool is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GNU Libtool; see the file COPYING.  If not, a copy
+# can be downloaded from http://www.gnu.org/licenses/gpl.html, or
+# obtained by writing to the Free Software Foundation, Inc.,
+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+
+
+# The names of the tagged configurations supported by this script.
+available_tags="CXX "
+
+# ### BEGIN LIBTOOL CONFIG
+
+# Assembler program.
+AS=$lt_AS
+
+# DLL creation program.
+DLLTOOL=$lt_DLLTOOL
+
+# Object dumper program.
+OBJDUMP=$lt_OBJDUMP
+
+# Which release of libtool.m4 was used?
+macro_version=$macro_version
+macro_revision=$macro_revision
+
+# Whether or not to build shared libraries.
+build_libtool_libs=$enable_shared
+
+# Whether or not to build static libraries.
+build_old_libs=$enable_static
+
+# What type of objects to build.
+pic_mode=$pic_mode
+
+# Whether or not to optimize for fast installation.
+fast_install=$enable_fast_install
+
+# Shell to use when invoking shell scripts.
+SHELL=$lt_SHELL
+
+# An echo program that protects backslashes.
+ECHO=$lt_ECHO
+
+# The PATH separator for the build system.
+PATH_SEPARATOR=$lt_PATH_SEPARATOR
+
+# The host system.
+host_alias=$host_alias
+host=$host
+host_os=$host_os
+
+# The build system.
+build_alias=$build_alias
+build=$build
+build_os=$build_os
+
+# A sed program that does not truncate output.
+SED=$lt_SED
+
+# Sed that helps us avoid accidentally triggering echo(1) options like -n.
+Xsed="\$SED -e 1s/^X//"
+
+# A grep program that handles long lines.
+GREP=$lt_GREP
+
+# An ERE matcher.
+EGREP=$lt_EGREP
+
+# A literal string matcher.
+FGREP=$lt_FGREP
+
+# A BSD- or MS-compatible name lister.
+NM=$lt_NM
+
+# Whether we need soft or hard links.
+LN_S=$lt_LN_S
+
+# What is the maximum length of a command?
+max_cmd_len=$max_cmd_len
+
+# Object file suffix (normally "o").
+objext=$ac_objext
+
+# Executable file suffix (normally "").
+exeext=$exeext
+
+# whether the shell understands "unset".
+lt_unset=$lt_unset
+
+# turn spaces into newlines.
+SP2NL=$lt_lt_SP2NL
+
+# turn newlines into spaces.
+NL2SP=$lt_lt_NL2SP
+
+# convert \$build file names to \$host format.
+to_host_file_cmd=$lt_cv_to_host_file_cmd
+
+# convert \$build files to toolchain format.
+to_tool_file_cmd=$lt_cv_to_tool_file_cmd
+
+# Method to check whether dependent libraries are shared objects.
+deplibs_check_method=$lt_deplibs_check_method
+
+# Command to use when deplibs_check_method = "file_magic".
+file_magic_cmd=$lt_file_magic_cmd
+
+# How to find potential files when deplibs_check_method = "file_magic".
+file_magic_glob=$lt_file_magic_glob
+
+# Find potential files using nocaseglob when deplibs_check_method = "file_magic".
+want_nocaseglob=$lt_want_nocaseglob
+
+# Command to associate shared and link libraries.
+sharedlib_from_linklib_cmd=$lt_sharedlib_from_linklib_cmd
+
+# The archiver.
+AR=$lt_AR
+
+# Flags to create an archive.
+AR_FLAGS=$lt_AR_FLAGS
+
+# How to feed a file listing to the archiver.
+archiver_list_spec=$lt_archiver_list_spec
+
+# A symbol stripping program.
+STRIP=$lt_STRIP
+
+# Commands used to install an old-style archive.
+RANLIB=$lt_RANLIB
+old_postinstall_cmds=$lt_old_postinstall_cmds
+old_postuninstall_cmds=$lt_old_postuninstall_cmds
+
+# Whether to use a lock for old archive extraction.
+lock_old_archive_extraction=$lock_old_archive_extraction
+
+# A C compiler.
+LTCC=$lt_CC
+
+# LTCC compiler flags.
+LTCFLAGS=$lt_CFLAGS
+
+# Take the output of nm and produce a listing of raw symbols and C names.
+global_symbol_pipe=$lt_lt_cv_sys_global_symbol_pipe
+
+# Transform the output of nm in a proper C declaration.
+global_symbol_to_cdecl=$lt_lt_cv_sys_global_symbol_to_cdecl
+
+# Transform the output of nm in a C name address pair.
+global_symbol_to_c_name_address=$lt_lt_cv_sys_global_symbol_to_c_name_address
+
+# Transform the output of nm in a C name address pair when lib prefix is needed.
+global_symbol_to_c_name_address_lib_prefix=$lt_lt_cv_sys_global_symbol_to_c_name_address_lib_prefix
+
+# Specify filename containing input files for \$NM.
+nm_file_list_spec=$lt_nm_file_list_spec
+
+# The root where to search for dependent libraries,and in which our libraries should be installed.
+lt_sysroot=$lt_sysroot
+
+# The name of the directory that contains temporary libtool files.
+objdir=$objdir
+
+# Used to examine libraries when file_magic_cmd begins with "file".
+MAGIC_CMD=$MAGIC_CMD
+
+# Must we lock files when doing compilation?
+need_locks=$lt_need_locks
+
+# Manifest tool.
+MANIFEST_TOOL=$lt_MANIFEST_TOOL
+
+# Tool to manipulate archived DWARF debug symbol files on Mac OS X.
+DSYMUTIL=$lt_DSYMUTIL
+
+# Tool to change global to local symbols on Mac OS X.
+NMEDIT=$lt_NMEDIT
+
+# Tool to manipulate fat objects and archives on Mac OS X.
+LIPO=$lt_LIPO
+
+# ldd/readelf like tool for Mach-O binaries on Mac OS X.
+OTOOL=$lt_OTOOL
+
+# ldd/readelf like tool for 64 bit Mach-O binaries on Mac OS X 10.4.
+OTOOL64=$lt_OTOOL64
+
+# Old archive suffix (normally "a").
+libext=$libext
+
+# Shared library suffix (normally ".so").
+shrext_cmds=$lt_shrext_cmds
+
+# The commands to extract the exported symbol list from a shared archive.
+extract_expsyms_cmds=$lt_extract_expsyms_cmds
+
+# Variables whose values should be saved in libtool wrapper scripts and
+# restored at link time.
+variables_saved_for_relink=$lt_variables_saved_for_relink
+
+# Do we need the "lib" prefix for modules?
+need_lib_prefix=$need_lib_prefix
+
+# Do we need a version for libraries?
+need_version=$need_version
+
+# Library versioning type.
+version_type=$version_type
+
+# Shared library runtime path variable.
+runpath_var=$runpath_var
+
+# Shared library path variable.
+shlibpath_var=$shlibpath_var
+
+# Is shlibpath searched before the hard-coded library search path?
+shlibpath_overrides_runpath=$shlibpath_overrides_runpath
+
+# Format of library name prefix.
+libname_spec=$lt_libname_spec
+
+# List of archive names.  First name is the real one, the rest are links.
+# The last name is the one that the linker finds with -lNAME
+library_names_spec=$lt_library_names_spec
+
+# The coded name of the library, if different from the real name.
+soname_spec=$lt_soname_spec
+
+# Permission mode override for installation of shared libraries.
+install_override_mode=$lt_install_override_mode
+
+# Command to use after installation of a shared archive.
+postinstall_cmds=$lt_postinstall_cmds
+
+# Command to use after uninstallation of a shared archive.
+postuninstall_cmds=$lt_postuninstall_cmds
+
+# Commands used to finish a libtool library installation in a directory.
+finish_cmds=$lt_finish_cmds
+
+# As "finish_cmds", except a single script fragment to be evaled but
+# not shown.
+finish_eval=$lt_finish_eval
+
+# Whether we should hardcode library paths into libraries.
+hardcode_into_libs=$hardcode_into_libs
+
+# Compile-time system search path for libraries.
+sys_lib_search_path_spec=$lt_sys_lib_search_path_spec
+
+# Run-time system search path for libraries.
+sys_lib_dlsearch_path_spec=$lt_sys_lib_dlsearch_path_spec
+
+# Whether dlopen is supported.
+dlopen_support=$enable_dlopen
+
+# Whether dlopen of programs is supported.
+dlopen_self=$enable_dlopen_self
+
+# Whether dlopen of statically linked programs is supported.
+dlopen_self_static=$enable_dlopen_self_static
+
+# Commands to strip libraries.
+old_striplib=$lt_old_striplib
+striplib=$lt_striplib
+
+
+# The linker used to build libraries.
+LD=$lt_LD
+
+# How to create reloadable object files.
+reload_flag=$lt_reload_flag
+reload_cmds=$lt_reload_cmds
+
+# Commands used to build an old-style archive.
+old_archive_cmds=$lt_old_archive_cmds
+
+# A language specific compiler.
+CC=$lt_compiler
+
+# Is the compiler the GNU compiler?
+with_gcc=$GCC
+
+# Compiler flag to turn off builtin functions.
+no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag
+
+# Additional compiler flags for building library objects.
+pic_flag=$lt_lt_prog_compiler_pic
+
+# How to pass a linker flag through the compiler.
+wl=$lt_lt_prog_compiler_wl
+
+# Compiler flag to prevent dynamic linking.
+link_static_flag=$lt_lt_prog_compiler_static
+
+# Does compiler simultaneously support -c and -o options?
+compiler_c_o=$lt_lt_cv_prog_compiler_c_o
+
+# Whether or not to add -lc for building shared libraries.
+build_libtool_need_lc=$archive_cmds_need_lc
+
+# Whether or not to disallow shared libs when runtime libs are static.
+allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes
+
+# Compiler flag to allow reflexive dlopens.
+export_dynamic_flag_spec=$lt_export_dynamic_flag_spec
+
+# Compiler flag to generate shared objects directly from archives.
+whole_archive_flag_spec=$lt_whole_archive_flag_spec
+
+# Whether the compiler copes with passing no objects directly.
+compiler_needs_object=$lt_compiler_needs_object
+
+# Create an old-style archive from a shared archive.
+old_archive_from_new_cmds=$lt_old_archive_from_new_cmds
+
+# Create a temporary old-style archive to link instead of a shared archive.
+old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds
+
+# Commands used to build a shared archive.
+archive_cmds=$lt_archive_cmds
+archive_expsym_cmds=$lt_archive_expsym_cmds
+
+# Commands used to build a loadable module if different from building
+# a shared archive.
+module_cmds=$lt_module_cmds
+module_expsym_cmds=$lt_module_expsym_cmds
+
+# Whether we are building with GNU ld or not.
+with_gnu_ld=$lt_with_gnu_ld
+
+# Flag that allows shared libraries with undefined symbols to be built.
+allow_undefined_flag=$lt_allow_undefined_flag
+
+# Flag that enforces no undefined symbols.
+no_undefined_flag=$lt_no_undefined_flag
+
+# Flag to hardcode \$libdir into a binary during linking.
+# This must work even if \$libdir does not exist
+hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec
+
+# Whether we need a single "-rpath" flag with a separated argument.
+hardcode_libdir_separator=$lt_hardcode_libdir_separator
+
+# Set to "yes" if using DIR/libNAME\${shared_ext} during linking hardcodes
+# DIR into the resulting binary.
+hardcode_direct=$hardcode_direct
+
+# Set to "yes" if using DIR/libNAME\${shared_ext} during linking hardcodes
+# DIR into the resulting binary and the resulting library dependency is
+# "absolute",i.e impossible to change by setting \${shlibpath_var} if the
+# library is relocated.
+hardcode_direct_absolute=$hardcode_direct_absolute
+
+# Set to "yes" if using the -LDIR flag during linking hardcodes DIR
+# into the resulting binary.
+hardcode_minus_L=$hardcode_minus_L
+
+# Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR
+# into the resulting binary.
+hardcode_shlibpath_var=$hardcode_shlibpath_var
+
+# Set to "yes" if building a shared library automatically hardcodes DIR
+# into the library and all subsequent libraries and executables linked
+# against it.
+hardcode_automatic=$hardcode_automatic
+
+# Set to yes if linker adds runtime paths of dependent libraries
+# to runtime path list.
+inherit_rpath=$inherit_rpath
+
+# Whether libtool must link a program against all its dependency libraries.
+link_all_deplibs=$link_all_deplibs
+
+# Set to "yes" if exported symbols are required.
+always_export_symbols=$always_export_symbols
+
+# The commands to list exported symbols.
+export_symbols_cmds=$lt_export_symbols_cmds
+
+# Symbols that should not be listed in the preloaded symbols.
+exclude_expsyms=$lt_exclude_expsyms
+
+# Symbols that must always be exported.
+include_expsyms=$lt_include_expsyms
+
+# Commands necessary for linking programs (against libraries) with templates.
+prelink_cmds=$lt_prelink_cmds
+
+# Commands necessary for finishing linking programs.
+postlink_cmds=$lt_postlink_cmds
+
+# Specify filename containing input files.
+file_list_spec=$lt_file_list_spec
+
+# How to hardcode a shared library path into an executable.
+hardcode_action=$hardcode_action
+
+# The directories searched by this compiler when creating a shared library.
+compiler_lib_search_dirs=$lt_compiler_lib_search_dirs
+
+# Dependencies to place before and after the objects being linked to
+# create a shared library.
+predep_objects=$lt_predep_objects
+postdep_objects=$lt_postdep_objects
+predeps=$lt_predeps
+postdeps=$lt_postdeps
+
+# The library search path used internally by the compiler when linking
+# a shared library.
+compiler_lib_search_path=$lt_compiler_lib_search_path
+
+# ### END LIBTOOL CONFIG
+
+_LT_EOF
+
+  case $host_os in
+  aix3*)
+    cat <<\_LT_EOF >> "$cfgfile"
+# AIX sometimes has problems with the GCC collect2 program.  For some
+# reason, if we set the COLLECT_NAMES environment variable, the problems
+# vanish in a puff of smoke.
+if test "X${COLLECT_NAMES+set}" != Xset; then
+  COLLECT_NAMES=
+  export COLLECT_NAMES
+fi
+_LT_EOF
+    ;;
+  esac
+
+
+ltmain="$ac_aux_dir/ltmain.sh"
+
+
+  # We use sed instead of cat because bash on DJGPP gets confused if
+  # if finds mixed CR/LF and LF-only lines.  Since sed operates in
+  # text mode, it properly converts lines to CR/LF.  This bash problem
+  # is reportedly fixed, but why not run on old versions too?
+  sed '$q' "$ltmain" >> "$cfgfile" \
+     || (rm -f "$cfgfile"; exit 1)
+
+  if test x"$xsi_shell" = xyes; then
+  sed -e '/^func_dirname ()$/,/^} # func_dirname /c\
+func_dirname ()\
+{\
+\    case ${1} in\
+\      */*) func_dirname_result="${1%/*}${2}" ;;\
+\      *  ) func_dirname_result="${3}" ;;\
+\    esac\
+} # Extended-shell func_dirname implementation' "$cfgfile" > $cfgfile.tmp \
+  && mv -f "$cfgfile.tmp" "$cfgfile" \
+    || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
+test 0 -eq $? || _lt_function_replace_fail=:
+
+
+  sed -e '/^func_basename ()$/,/^} # func_basename /c\
+func_basename ()\
+{\
+\    func_basename_result="${1##*/}"\
+} # Extended-shell func_basename implementation' "$cfgfile" > $cfgfile.tmp \
+  && mv -f "$cfgfile.tmp" "$cfgfile" \
+    || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
+test 0 -eq $? || _lt_function_replace_fail=:
+
+
+  sed -e '/^func_dirname_and_basename ()$/,/^} # func_dirname_and_basename /c\
+func_dirname_and_basename ()\
+{\
+\    case ${1} in\
+\      */*) func_dirname_result="${1%/*}${2}" ;;\
+\      *  ) func_dirname_result="${3}" ;;\
+\    esac\
+\    func_basename_result="${1##*/}"\
+} # Extended-shell func_dirname_and_basename implementation' "$cfgfile" > $cfgfile.tmp \
+  && mv -f "$cfgfile.tmp" "$cfgfile" \
+    || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
+test 0 -eq $? || _lt_function_replace_fail=:
+
+
+  sed -e '/^func_stripname ()$/,/^} # func_stripname /c\
+func_stripname ()\
+{\
+\    # pdksh 5.2.14 does not do ${X%$Y} correctly if both X and Y are\
+\    # positional parameters, so assign one to ordinary parameter first.\
+\    func_stripname_result=${3}\
+\    func_stripname_result=${func_stripname_result#"${1}"}\
+\    func_stripname_result=${func_stripname_result%"${2}"}\
+} # Extended-shell func_stripname implementation' "$cfgfile" > $cfgfile.tmp \
+  && mv -f "$cfgfile.tmp" "$cfgfile" \
+    || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
+test 0 -eq $? || _lt_function_replace_fail=:
+
+
+  sed -e '/^func_split_long_opt ()$/,/^} # func_split_long_opt /c\
+func_split_long_opt ()\
+{\
+\    func_split_long_opt_name=${1%%=*}\
+\    func_split_long_opt_arg=${1#*=}\
+} # Extended-shell func_split_long_opt implementation' "$cfgfile" > $cfgfile.tmp \
+  && mv -f "$cfgfile.tmp" "$cfgfile" \
+    || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
+test 0 -eq $? || _lt_function_replace_fail=:
+
+
+  sed -e '/^func_split_short_opt ()$/,/^} # func_split_short_opt /c\
+func_split_short_opt ()\
+{\
+\    func_split_short_opt_arg=${1#??}\
+\    func_split_short_opt_name=${1%"$func_split_short_opt_arg"}\
+} # Extended-shell func_split_short_opt implementation' "$cfgfile" > $cfgfile.tmp \
+  && mv -f "$cfgfile.tmp" "$cfgfile" \
+    || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
+test 0 -eq $? || _lt_function_replace_fail=:
+
+
+  sed -e '/^func_lo2o ()$/,/^} # func_lo2o /c\
+func_lo2o ()\
+{\
+\    case ${1} in\
+\      *.lo) func_lo2o_result=${1%.lo}.${objext} ;;\
+\      *)    func_lo2o_result=${1} ;;\
+\    esac\
+} # Extended-shell func_lo2o implementation' "$cfgfile" > $cfgfile.tmp \
+  && mv -f "$cfgfile.tmp" "$cfgfile" \
+    || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
+test 0 -eq $? || _lt_function_replace_fail=:
+
+
+  sed -e '/^func_xform ()$/,/^} # func_xform /c\
+func_xform ()\
+{\
+    func_xform_result=${1%.*}.lo\
+} # Extended-shell func_xform implementation' "$cfgfile" > $cfgfile.tmp \
+  && mv -f "$cfgfile.tmp" "$cfgfile" \
+    || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
+test 0 -eq $? || _lt_function_replace_fail=:
+
+
+  sed -e '/^func_arith ()$/,/^} # func_arith /c\
+func_arith ()\
+{\
+    func_arith_result=$(( $* ))\
+} # Extended-shell func_arith implementation' "$cfgfile" > $cfgfile.tmp \
+  && mv -f "$cfgfile.tmp" "$cfgfile" \
+    || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
+test 0 -eq $? || _lt_function_replace_fail=:
+
+
+  sed -e '/^func_len ()$/,/^} # func_len /c\
+func_len ()\
+{\
+    func_len_result=${#1}\
+} # Extended-shell func_len implementation' "$cfgfile" > $cfgfile.tmp \
+  && mv -f "$cfgfile.tmp" "$cfgfile" \
+    || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
+test 0 -eq $? || _lt_function_replace_fail=:
+
+fi
+
+if test x"$lt_shell_append" = xyes; then
+  sed -e '/^func_append ()$/,/^} # func_append /c\
+func_append ()\
+{\
+    eval "${1}+=\\${2}"\
+} # Extended-shell func_append implementation' "$cfgfile" > $cfgfile.tmp \
+  && mv -f "$cfgfile.tmp" "$cfgfile" \
+    || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
+test 0 -eq $? || _lt_function_replace_fail=:
+
+
+  sed -e '/^func_append_quoted ()$/,/^} # func_append_quoted /c\
+func_append_quoted ()\
+{\
+\    func_quote_for_eval "${2}"\
+\    eval "${1}+=\\\\ \\$func_quote_for_eval_result"\
+} # Extended-shell func_append_quoted implementation' "$cfgfile" > $cfgfile.tmp \
+  && mv -f "$cfgfile.tmp" "$cfgfile" \
+    || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
+test 0 -eq $? || _lt_function_replace_fail=:
+
+
+  # Save a `func_append' function call where possible by direct use of '+='
+  sed -e 's%func_append \([a-zA-Z_]\{1,\}\) "%\1+="%g' $cfgfile > $cfgfile.tmp \
+    && mv -f "$cfgfile.tmp" "$cfgfile" \
+      || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
+  test 0 -eq $? || _lt_function_replace_fail=:
+else
+  # Save a `func_append' function call even when '+=' is not available
+  sed -e 's%func_append \([a-zA-Z_]\{1,\}\) "%\1="$\1%g' $cfgfile > $cfgfile.tmp \
+    && mv -f "$cfgfile.tmp" "$cfgfile" \
+      || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
+  test 0 -eq $? || _lt_function_replace_fail=:
+fi
+
+if test x"$_lt_function_replace_fail" = x":"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Unable to substitute extended shell functions in $ofile" >&5
+$as_echo "$as_me: WARNING: Unable to substitute extended shell functions in $ofile" >&2;}
+fi
+
+
+   mv -f "$cfgfile" "$ofile" ||
+    (rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile")
+  chmod +x "$ofile"
+
+
+    cat <<_LT_EOF >> "$ofile"
+
+# ### BEGIN LIBTOOL TAG CONFIG: CXX
+
+# The linker used to build libraries.
+LD=$lt_LD_CXX
+
+# How to create reloadable object files.
+reload_flag=$lt_reload_flag_CXX
+reload_cmds=$lt_reload_cmds_CXX
+
+# Commands used to build an old-style archive.
+old_archive_cmds=$lt_old_archive_cmds_CXX
+
+# A language specific compiler.
+CC=$lt_compiler_CXX
+
+# Is the compiler the GNU compiler?
+with_gcc=$GCC_CXX
+
+# Compiler flag to turn off builtin functions.
+no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag_CXX
+
+# Additional compiler flags for building library objects.
+pic_flag=$lt_lt_prog_compiler_pic_CXX
+
+# How to pass a linker flag through the compiler.
+wl=$lt_lt_prog_compiler_wl_CXX
+
+# Compiler flag to prevent dynamic linking.
+link_static_flag=$lt_lt_prog_compiler_static_CXX
+
+# Does compiler simultaneously support -c and -o options?
+compiler_c_o=$lt_lt_cv_prog_compiler_c_o_CXX
+
+# Whether or not to add -lc for building shared libraries.
+build_libtool_need_lc=$archive_cmds_need_lc_CXX
+
+# Whether or not to disallow shared libs when runtime libs are static.
+allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes_CXX
+
+# Compiler flag to allow reflexive dlopens.
+export_dynamic_flag_spec=$lt_export_dynamic_flag_spec_CXX
+
+# Compiler flag to generate shared objects directly from archives.
+whole_archive_flag_spec=$lt_whole_archive_flag_spec_CXX
+
+# Whether the compiler copes with passing no objects directly.
+compiler_needs_object=$lt_compiler_needs_object_CXX
+
+# Create an old-style archive from a shared archive.
+old_archive_from_new_cmds=$lt_old_archive_from_new_cmds_CXX
+
+# Create a temporary old-style archive to link instead of a shared archive.
+old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds_CXX
+
+# Commands used to build a shared archive.
+archive_cmds=$lt_archive_cmds_CXX
+archive_expsym_cmds=$lt_archive_expsym_cmds_CXX
+
+# Commands used to build a loadable module if different from building
+# a shared archive.
+module_cmds=$lt_module_cmds_CXX
+module_expsym_cmds=$lt_module_expsym_cmds_CXX
+
+# Whether we are building with GNU ld or not.
+with_gnu_ld=$lt_with_gnu_ld_CXX
+
+# Flag that allows shared libraries with undefined symbols to be built.
+allow_undefined_flag=$lt_allow_undefined_flag_CXX
+
+# Flag that enforces no undefined symbols.
+no_undefined_flag=$lt_no_undefined_flag_CXX
+
+# Flag to hardcode \$libdir into a binary during linking.
+# This must work even if \$libdir does not exist
+hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec_CXX
+
+# Whether we need a single "-rpath" flag with a separated argument.
+hardcode_libdir_separator=$lt_hardcode_libdir_separator_CXX
+
+# Set to "yes" if using DIR/libNAME\${shared_ext} during linking hardcodes
+# DIR into the resulting binary.
+hardcode_direct=$hardcode_direct_CXX
+
+# Set to "yes" if using DIR/libNAME\${shared_ext} during linking hardcodes
+# DIR into the resulting binary and the resulting library dependency is
+# "absolute",i.e impossible to change by setting \${shlibpath_var} if the
+# library is relocated.
+hardcode_direct_absolute=$hardcode_direct_absolute_CXX
+
+# Set to "yes" if using the -LDIR flag during linking hardcodes DIR
+# into the resulting binary.
+hardcode_minus_L=$hardcode_minus_L_CXX
+
+# Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR
+# into the resulting binary.
+hardcode_shlibpath_var=$hardcode_shlibpath_var_CXX
+
+# Set to "yes" if building a shared library automatically hardcodes DIR
+# into the library and all subsequent libraries and executables linked
+# against it.
+hardcode_automatic=$hardcode_automatic_CXX
+
+# Set to yes if linker adds runtime paths of dependent libraries
+# to runtime path list.
+inherit_rpath=$inherit_rpath_CXX
+
+# Whether libtool must link a program against all its dependency libraries.
+link_all_deplibs=$link_all_deplibs_CXX
+
+# Set to "yes" if exported symbols are required.
+always_export_symbols=$always_export_symbols_CXX
+
+# The commands to list exported symbols.
+export_symbols_cmds=$lt_export_symbols_cmds_CXX
+
+# Symbols that should not be listed in the preloaded symbols.
+exclude_expsyms=$lt_exclude_expsyms_CXX
+
+# Symbols that must always be exported.
+include_expsyms=$lt_include_expsyms_CXX
+
+# Commands necessary for linking programs (against libraries) with templates.
+prelink_cmds=$lt_prelink_cmds_CXX
+
+# Commands necessary for finishing linking programs.
+postlink_cmds=$lt_postlink_cmds_CXX
+
+# Specify filename containing input files.
+file_list_spec=$lt_file_list_spec_CXX
+
+# How to hardcode a shared library path into an executable.
+hardcode_action=$hardcode_action_CXX
+
+# The directories searched by this compiler when creating a shared library.
+compiler_lib_search_dirs=$lt_compiler_lib_search_dirs_CXX
+
+# Dependencies to place before and after the objects being linked to
+# create a shared library.
+predep_objects=$lt_predep_objects_CXX
+postdep_objects=$lt_postdep_objects_CXX
+predeps=$lt_predeps_CXX
+postdeps=$lt_postdeps_CXX
+
+# The library search path used internally by the compiler when linking
+# a shared library.
+compiler_lib_search_path=$lt_compiler_lib_search_path_CXX
+
+# ### END LIBTOOL TAG CONFIG: CXX
+_LT_EOF
+
+ ;;
+
+  esac
+done # for ac_tag
+
+
+as_fn_exit 0
+_ACEOF
+ac_clean_files=$ac_clean_files_save
+
+test $ac_write_fail = 0 ||
+  as_fn_error $? "write failure creating $CONFIG_STATUS" "$LINENO" 5
+
+
+# configure is writing to config.log, and then calls config.status.
+# config.status does its own redirection, appending to config.log.
+# Unfortunately, on DOS this fails, as config.log is still kept open
+# by configure, so config.status won't be able to write to it; its
+# output is simply discarded.  So we exec the FD to /dev/null,
+# effectively closing config.log, so it can be properly (re)opened and
+# appended to by config.status.  When coming back to configure, we
+# need to make the FD available again.
+if test "$no_create" != yes; then
+  ac_cs_success=:
+  ac_config_status_args=
+  test "$silent" = yes &&
+    ac_config_status_args="$ac_config_status_args --quiet"
+  exec 5>/dev/null
+  $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false
+  exec 5>>config.log
+  # Use ||, not &&, to avoid exiting from the if with $? = 1, which
+  # would make configure fail if this is the last instruction.
+  $ac_cs_success || as_fn_exit 1
+fi
+if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5
+$as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;}
+fi
+
+
+
+echo ""
+echo "Building poppler with support for:"
+echo "  font configuration: $with_font_configuration"
+echo "  splash output:      $enable_splash_output"
+echo "  cairo output:       $use_cairo"
+echo "  qt4 wrapper:        $enable_poppler_qt4"
+echo "  glib wrapper:       $use_glib"
+echo "    introspection:    $found_introspection"
+echo "  cpp wrapper:        $enable_poppler_cpp"
+echo "  use gtk-doc:        $enable_gtk_doc"
+echo "  use libjpeg:        $enable_libjpeg"
+echo "  use libpng:         $enable_libpng"
+echo "  use libtiff:        $enable_libtiff"
+echo "  use zlib:           $enable_zlib"
+echo "  use libcurl:        $enable_libcurl"
+echo "  use libopenjpeg:    $enable_libopenjpeg"
+echo "  use cms:            $enable_cms"
+if test x$enable_cms = xyes;then
+    if test x$lcms1 = xyes;then
+        echo "      with lcms1"
+    else
+        echo "      with lcms2"
+    fi
+fi
+echo "  command line utils: $enable_utils"
+echo "  test data dir:      $TESTDATADIR"
+echo ""
+
+if test x$enable_splash_output = xno -a x$enable_cairo_output = xno; then
+       echo "  Warning: There is no rendering backend enabled"
+fi
+
+if test x$enable_single_precision = xyes -a x$enable_fixedpoint = xyes; then
+       echo "  Warning: Single precision and fixed point options should not be enabled at the same time"
+fi
+
+if test x$enable_libjpeg != xyes; then
+       echo "  Warning: Using libjpeg is recommended"
+fi
+
+if test x$enable_zlib != xno; then
+       echo "  Warning: Using zlib is not totally safe"
+fi
+
+if test x$enable_libopenjpeg != xyes; then
+       echo "  Warning: Using libopenjpeg is recommended"
+fi
diff --git a/configure.ac b/configure.ac
new file mode 100644 (file)
index 0000000..6ada41c
--- /dev/null
@@ -0,0 +1,852 @@
+m4_define([poppler_version_major],[0])
+m4_define([poppler_version_minor],[20])
+m4_define([poppler_version_micro],[4])
+m4_define([poppler_version],[poppler_version_major.poppler_version_minor.poppler_version_micro])
+
+AC_PREREQ(2.59)
+AC_INIT([poppler],[poppler_version],[https://bugs.freedesktop.org/enter_bug.cgi?product=poppler])
+AC_CONFIG_MACRO_DIR([m4])
+AM_INIT_AUTOMAKE([foreign])
+m4_ifdef([AM_SILENT_RULES],[AM_SILENT_RULES([yes])])
+AM_CONFIG_HEADER(config.h)
+AM_CONFIG_HEADER(poppler/poppler-config.h)
+AC_C_BIGENDIAN
+
+dnl ##### Initialize libtool.
+AC_LIBTOOL_WIN32_DLL
+define([AC_LIBTOOL_LANG_F77_CONFIG], [:])
+AC_PROG_LIBTOOL
+
+dnl ##### Checks for programs.
+AC_PROG_CC
+AC_PROG_CXX
+AC_ISC_POSIX
+AC_PROG_CC_STDC
+#if test -z "$CXX" -a "$CC" = "gcc"; then
+#  CXX="gcc"
+#fi
+AC_PROG_CXX
+if test "x$GXX" = "xyes"; then
+  case "$host_os" in
+    cygwin* | mingw*)
+    ;;
+    *)
+      case "${CXXFLAGS}" in
+      *-std=*)
+        ;;
+      *)
+        CXXFLAGS="$CXXFLAGS -ansi"
+        ;;
+      esac
+    ;;
+  esac
+fi
+AC_PROG_INSTALL
+
+dnl ##### Check for pkgconfig
+PKG_PROG_PKG_CONFIG
+
+dnl ##### Export the version
+AC_DEFINE_UNQUOTED([POPPLER_VERSION], ["poppler_version"], [Defines the poppler version])
+
+dnl Enable these unconditionally.
+AC_DEFINE([OPI_SUPPORT], [1], [Generate OPI comments in PS output.])
+AC_DEFINE([MULTITHREADED], [1], [Enable multithreading support.])
+AC_DEFINE([TEXTOUT_WORD_LIST], [1], [Enable word list support.])
+
+dnl Check for OS specific flags
+win32_libs=""
+create_shared_lib=""
+auto_import_flags=""
+case "$host_os" in
+  cygwin*)
+    create_shared_lib="-no-undefined"
+  ;;
+  mingw*)
+    os_win32=yes
+    win32_libs="-lgdi32"
+    create_shared_lib="-no-undefined"
+    auto_import_flags="-Wl,--enable-auto-import"
+  ;;
+esac
+
+AC_SUBST(win32_libs)
+AC_SUBST(create_shared_lib)
+AC_SUBST(auto_import_flags)
+
+ACX_PTHREAD()
+
+dnl Install xpdf headers
+AC_ARG_ENABLE(xpdf-headers,
+             AC_HELP_STRING([--enable-xpdf-headers],
+                            [Install unsupported xpdf headers.]),
+              enable_xpdf_headers=$enableval,
+              enable_xpdf_headers="no")
+AM_CONDITIONAL(ENABLE_XPDF_HEADERS, test x$enable_xpdf_headers = xyes)
+
+AC_ARG_ENABLE(single-precision,
+[  --enable-single-precision     use single precision arithmetic (instead of double precision) in the Splash backend],
+AC_DEFINE(USE_FLOAT,      [1], [Use single precision arithmetic in the Splash backend]))
+
+AC_ARG_ENABLE(fixedpoint,
+[  --enable-fixedpoint     use fixed point (instead of double precision) arithmetic in the Splash backend],
+AC_DEFINE(USE_FIXEDPOINT, [1], [Use fixed point arithmetic in the Splash backend]))
+
+dnl Relocation support
+AC_ARG_ENABLE(relocatable,
+    AC_HELP_STRING([--disable-relocatable],
+                   [Hardcode the poppler library location (on Windows).]),
+    enable_relocatable=$enableval,
+    [if test x$os_win32 = xyes; then
+         # default to yes on native Windows.
+         enable_relocatable="yes"
+     else
+         # default to no everywhere else.
+         enable_relocatable="no"
+     fi
+    ]
+)
+
+if test x$enable_relocatable = xyes; then
+    if test x$os_win32 = xyes; then
+     AC_DEFINE([ENABLE_RELOCATABLE],
+               [1],[Do not hardcode the library location])
+    else
+        AC_MSG_ERROR(
+               [Invalid setting for relocatable, only supported on windows])
+
+    fi
+fi
+
+AC_DEFINE_DIR(POPPLER_DATADIR, "{datarootdir}/poppler", [Poppler data dir])
+
+dnl ##### Checks for header files.
+AC_PATH_XTRA
+AC_HEADER_DIRENT
+AC_CHECK_HEADERS([stdint.h])
+
+dnl ##### Switch over to C++.  This will make the checks below a little
+dnl ##### bit stricter (requiring function prototypes in include files).
+dnl ##### (99% of xpdf is written in C++.)
+AC_LANG_CPLUSPLUS
+
+AC_CHECK_DECL(gettimeofday, [AC_CHECK_FUNC(gettimeofday, AC_DEFINE(HAVE_GETTIMEOFDAY, 1, [Defines if gettimeofday is available on your system]))],[],[#include <sys/time.h>])
+AC_CHECK_FUNC(localtime_r, AC_DEFINE(HAVE_LOCALTIME_R, 1, [Defines if localtime_r is available on your system]))
+AC_CHECK_FUNC(gmtime_r, AC_DEFINE(HAVE_GMTIME_R, 1, [Defines if gmtime_r is available on your system]))
+
+dnl ##### Check for extra libraries needed by X.  (LynxOS needs this.)
+AC_CHECK_FUNC(gethostbyname)
+if test $ac_cv_func_gethostbyname = no; then
+  AC_CHECK_LIB(bsd, gethostbyname, X_EXTRA_LIBS="$X_EXTRA_LIBS -lbsd")
+fi
+
+AC_CHECK_FUNC(nanosleep,,)
+dnl try in librt if not found in current LIBS
+if test x$ac_cv_func_nanosleep = xno
+then
+   AC_CHECK_LIB(rt,nanosleep, X_EXTRA_LIBS="$X_EXTRA_LIBS -lrt")
+fi
+
+dnl try in libposix4, if not found so far
+if test x$ac_cv_func_nanosleep = xno && test x$ac_cv_lib_rt_nanosleep = xno
+then
+   AC_CHECK_LIB(posix4,nanosleep, X_EXTRA_LIBS="$X_EXTRA_LIBS -lposix4")
+fi
+
+
+dnl Test for libopenjpeg. Versions prior to 1.4 do not provide a pkgconfig file.
+AC_ARG_ENABLE(libopenjpeg,
+             AC_HELP_STRING([--disable-libopenjpeg],
+                            [Don't build against libopenjpeg.]),
+              enable_libopenjpeg=$enableval,
+              enable_libopenjpeg="try")
+if test x$enable_libopenjpeg = xyes; then
+  PKG_CHECK_MODULES(LIBOPENJPEG, libopenjpeg,
+                   [],
+                   [AC_CHECK_LIB([openjpeg], [opj_cio_open],
+                       LIBOPENJPEG_LIBS="-lopenjpeg",
+                       AC_MSG_ERROR("*** libopenjpeg library not found ***"))
+                    AC_CHECK_HEADERS([openjpeg.h],,
+                       AC_MSG_ERROR("*** libopenjpeg headers not found ***"))])
+elif test x$enable_libopenjpeg = xtry; then
+  PKG_CHECK_MODULES(LIBOPENJPEG, libopenjpeg,
+                    [enable_libopenjpeg="yes"],
+                   [AC_CHECK_LIB([openjpeg], [opj_cio_open],
+                       [enable_libopenjpeg="yes"
+                        LIBOPENJPEG_LIBS="-lopenjpeg"],
+                       [enable_libopenjpeg="no"])
+                    AC_CHECK_HEADERS([openjpeg.h],,
+                        [enable_libopenjpeg="no"])])
+fi
+
+if test x$enable_libopenjpeg = xyes; then
+  AC_SUBST(LIBOPENJPEG_CFLAGS)
+  AC_SUBST(LIBOPENJPEG_LIBS)
+  AC_DEFINE(ENABLE_LIBOPENJPEG)
+  PKG_CHECK_EXISTS(libopenjpeg >= 1.5,
+      [AC_DEFINE(WITH_OPENJPEG_IGNORE_PCLR_CMAP_CDEF_FLAG, 1, [OpenJPEG with the OPJ_DPARAMETERS_IGNORE_PCLR_CMAP_CDEF_FLAG flag.])],
+      [])
+fi
+
+AM_CONDITIONAL(BUILD_LIBOPENJPEG, test x$enable_libopenjpeg = xyes)
+AH_TEMPLATE([ENABLE_LIBOPENJPEG],
+           [Use libopenjpeg instead of builtin jpeg2000 decoder.])
+
+dnl ##### Test for libtiff
+AC_ARG_ENABLE(libtiff,
+               AC_HELP_STRING([--disable-libtiff],
+                               [Don't build against libtiff.]),
+               enable_libtiff=$enableval,
+               enable_libtiff="try")
+
+AC_ARG_VAR([LIBTIFF_CFLAGS], [C compiler flags for LIBTIFF])
+AC_ARG_VAR([LIBTIFF_LIBS], [linker flags to link LIBTIFF (default is -ltiff)])
+ac_save_CPPFLAGS="$CPPFLAGS"
+ac_save_CXXFLAGS="$CXXFLAGS"
+ac_save_LIBS="$LDFLAGS"
+CPPFLAGS="$CPPFLAGS $LIBTIFF_CFLAGS"
+CXXFLAGS="$CXXFLAGS $LIBTIFF_CFLAGS"
+LIBS="$LIBS $LIBTIFF_LIBS"
+if test x$enable_libtiff = xyes; then
+  if test x"$LIBTIFF_LIBS" != ; then
+    AC_CHECK_FUNC([TIFFOpen],,
+                 AC_MSG_ERROR("*** libtiff library not found ***"))
+  else
+    AC_CHECK_LIB([tiff], [TIFFOpen],,
+                 AC_MSG_ERROR("*** libtiff library not found ***"))
+  fi
+  AC_CHECK_HEADERS([tiffio.h],,
+               AC_MSG_ERROR("*** libtiff headers not found ***"))
+elif test x$enable_libtiff = xtry; then
+  if test x"$LIBTIFF_LIBS" != x; then
+    AC_CHECK_FUNC([TIFFOpen],
+                 [enable_libtiff="yes"],
+                 [enable_libtiff="no"])
+  else
+    AC_CHECK_LIB([tiff], [TIFFOpen],
+                [enable_libtiff="yes"],
+                [enable_libtiff="no"])
+  fi
+  AC_CHECK_HEADERS([tiffio.h],,
+               [enable_libtiff="no"])
+fi
+CPPFLAGS="$ac_save_CPPFLAGS"
+CXXFLAGS="$ac_save_CXXFLAGS"
+LIBS="$ac_save_LIBS"
+
+if test x$enable_libtiff = xyes; then
+  if test x"$LIBTIFF_LIBS" = x; then
+    LIBTIFF_LIBS="-ltiff"
+  fi
+  AC_SUBST(LIBTIFF_CFLAGSS)
+  AC_SUBST(LIBTIFF_LIBS)
+  AC_DEFINE(ENABLE_LIBTIFF)
+fi
+
+AM_CONDITIONAL(BUILD_LIBTIFF, test x$enable_libtiff = xyes)
+AH_TEMPLATE([ENABLE_LIBTIFF], [Build against libtiff.])
+if test x$enable_libtiff = xyes; then
+  AC_DEFINE(ENABLE_LIBTIFF, 1, [Build against libtiff.])
+fi
+
+dnl ##### Checks for library functions.
+AC_CHECK_FUNCS(popen mkstemp mkstemps)
+
+dnl ##### Back to C for the library tests.
+AC_LANG_C
+
+dnl ##### Check for fseeko/ftello or fseek64/ftell64
+dnl The LARGEFILE and FSEEKO macros have to be called in C, not C++, mode.
+AC_SYS_LARGEFILE
+AC_FUNC_FSEEKO
+AC_CHECK_FUNCS(fseek64, xpdf_cv_func_fseek64=yes, xpdf_cv_func_fseek64=no)
+AC_CHECK_FUNCS(ftell64, xpdf_cv_func_ftell64=yes, xpdf_cv_func_ftell64=no)
+if test "$xpdf_cv_func_fseek64" = yes -a "$xpdf_cv_func_ftell64" = yes; then
+  AC_DEFINE(HAVE_FSEEK64)
+fi
+
+dnl Test for zlib
+AC_ARG_ENABLE([zlib],
+  [AS_HELP_STRING([--enable-zlib],[Build with zlib])],
+  [],[enable_zlib="no"])
+if test x$enable_zlib = xyes; then
+  AC_CHECK_LIB([z], [inflate],,
+              AC_MSG_ERROR("*** zlib library not found ***"))
+  AC_CHECK_HEADERS([zlib.h],,
+                  AC_MSG_ERROR("*** zlib headers not found ***"))
+elif test x$enable_zlib = xtry; then
+  AC_CHECK_LIB([z], [inflate],
+               [enable_zlib="yes"],
+              [enable_zlib="no"])
+  AC_CHECK_HEADERS([zlib.h],,
+                  [enable_zlib="no"])
+fi
+
+if test x$enable_zlib = xyes; then
+  ZLIB_LIBS="-lz"
+  AC_SUBST(ZLIB_LIBS)
+  AC_DEFINE(ENABLE_ZLIB)
+fi
+
+AM_CONDITIONAL(BUILD_ZLIB, test x$enable_zlib = xyes)
+AH_TEMPLATE([ENABLE_ZLIB],
+           [Use zlib instead of builtin zlib decoder.])
+
+dnl Test for libcurl
+AC_ARG_ENABLE(libcurl,
+             AC_HELP_STRING([--enable-libcurl],
+                            [Build with libcurl based HTTP support.]),
+              enable_libcurl=$enableval,
+              enable_libcurl="no")
+
+if test x$enable_libcurl = xyes; then
+  PKG_CHECK_MODULES(LIBCURL, libcurl)
+  AC_DEFINE(ENABLE_LIBCURL, 1, [Build against libcurl.])
+  AC_DEFINE(POPPLER_HAS_CURL_SUPPORT, 1,
+     [Support for curl based doc builder is compiled in.])
+fi
+
+AM_CONDITIONAL(BUILD_LIBCURL, test x$enable_libcurl = xyes)
+
+dnl Test for libjpeg
+AC_ARG_ENABLE(libjpeg,
+             AC_HELP_STRING([--disable-libjpeg],
+                            [Don't build against libjpeg.]),
+              enable_libjpeg=$enableval,
+              enable_libjpeg="try")
+AC_ARG_VAR([LIBJPEG_CFLAGS], [C compiler flags for LIBJPEG])
+if test x$enable_libjpeg != xno; then
+
+  dnl
+  dnl POPPLER_FIND_JPEG uses "USER_INCLUDES" and "USER_LIBS"
+  dnl to receive the flags for header and library directories.
+  dnl
+  ac_save_USER_INCLUDES="$USER_INCLUDES"
+  ac_save_USER_LDFLAGS="$USER_LDFLAGS"
+  USER_INCLUDES="$USER_INCLUDES $LIBJPEG_CFLAGS"
+  USER_LDFLAGS="$USER_LDFLAGS $LIBJPEG_CFLAGS"
+  POPPLER_FIND_JPEG
+
+  dnl check INT16, INT32 typedef conflict in jmorecfg.h
+  ac_save_CPPFLAGS="$CPPFLAGS"
+  ac_save_CFLAGS="$CFLAGS"
+  CPPFLAGS="$CPPFLAGS $LIBJPEG_CFLAGS"
+  CFLAGS="$CFLAGS $LIBJPEG_CFLAGS"
+  AC_MSG_CHECKING([libjpeg.h works correctly])
+  AC_COMPILE_IFELSE([
+    AC_LANG_PROGRAM([
+#ifdef _WIN32
+#include <windows.h>
+#endif
+#include <sys/types.h>
+#include <stdio.h>
+#include <jpeglib.h>
+],[{return 0;}])],[
+    AC_MSG_RESULT([ok])
+  ],[
+    AC_MSG_RESULT([no])
+    AC_MSG_CHECKING([libjpeg.h problem can be fixed by XMD_H macro])
+    CPPFLAGS="$CPPFLAGS -DXMD_H"
+    CFLAGS="$CFLAGS -DXMD_H"
+    AC_COMPILE_IFELSE([
+      AC_LANG_PROGRAM([
+#ifdef _WIN32
+#include <windows.h>
+#endif
+#include <sys/types.h>
+#include <stdio.h>
+#include <jpeglib.h>
+],[{return 0;}])],[
+      AC_MSG_RESULT([ok, -DXMD_H is added to LIBJPEG_CFLAGS])
+      LIBJPEG_CFLAGS="$LIBJPEG_CFLAGS -DXMD_H"
+    ],[
+      AC_MSG_RESULT([no, disable libjpeg])
+      enable_libjpeg="no"
+    ])
+  ])
+  CPPFLAGS="$ac_save_CPPFLAGS"
+  CFLAGS="$ac_save_CFLAGS"
+
+  dnl POPPLER_FIND_JPEG sets LIBJPEG_LIBS
+  AC_SUBST(LIBJPEG_CFLAGS)
+  USER_INCLUDES="$ac_save_USER_INCLUDES"
+  USER_LDFLAGS="$ac_save_USER_LDFLAGS"
+fi
+
+AM_CONDITIONAL(BUILD_LIBJPEG, test x$enable_libjpeg = xyes)
+AH_TEMPLATE([ENABLE_LIBJPEG],
+            [Use libjpeg instead of builtin jpeg decoder.])
+
+dnl Test for libpng
+AC_ARG_ENABLE(libpng,
+             AC_HELP_STRING([--disable-libpng],
+                            [Do not build against libpng.]),
+              enable_libpng=$enableval,
+              enable_libpng="try")
+
+if test x$enable_libpng != xno; then
+  PKG_CHECK_MODULES(LIBPNG, libpng, [enable_libpng="yes"],
+      [enable_libpng="no"])
+fi
+
+if test x$enable_libpng = xyes; then
+  AC_DEFINE(ENABLE_LIBPNG, 1, [Build against libpng.])
+fi
+
+AM_CONDITIONAL(BUILD_LIBPNG, test x$enable_libpng = xyes)
+
+dnl Check for freetype headers
+
+PKG_CHECK_MODULES(FREETYPE, freetype2,
+                  [freetype_pkgconfig=yes], [freetype_pkgconfig=no])
+
+if test "x$freetype_pkgconfig" = "xyes"; then
+
+  AC_DEFINE(HAVE_FREETYPE_H, 1, [Have FreeType2 include files])
+
+else
+
+  FREETYPE_LIBS=
+  FREETYPE_CFLAGS=
+
+  AC_PATH_PROG(FREETYPE_CONFIG, freetype-config, no)
+  if test "x$FREETYPE_CONFIG" != "xno" ; then
+
+    FREETYPE_CFLAGS=`$FREETYPE_CONFIG --cflags`
+    FREETYPE_LIBS=`$FREETYPE_CONFIG --libs`
+    AC_DEFINE(HAVE_FREETYPE_H, 1, [Have FreeType2 include files])
+
+  fi
+
+fi
+
+AC_SUBST(FREETYPE_CFLAGS)
+AC_SUBST(FREETYPE_LIBS)
+
+AC_MSG_CHECKING([which font configuration to use])
+AC_ARG_WITH([font_configuration],
+   [AS_HELP_STRING([--with-font-configuration=fontconfig|win32],
+                   [Select font configuration backend])],
+   [],
+   [if test x$os_win32 = xyes; then
+        # default to win32 on native Windows.
+        with_font_configuration=win32
+    else
+        # default to fontconig everywhere else.
+        with_font_configuration=fontconfig
+    fi
+   ]
+)
+AC_MSG_RESULT([$with_font_configuration])
+
+case $with_font_configuration in
+  win32)
+     AC_DEFINE([WITH_FONTCONFIGURATION_WIN32],
+               [1],[Use win32 font configuration backend])
+     # Set the minimum required Internet Explorer version to 5.0
+     CPPFLAGS="$CPPFLAGS -D_WIN32_IE=0x0500"
+     ;;
+  fontconfig)
+     AC_DEFINE([WITH_FONTCONFIGURATION_FONTCONFIG],
+               [1],[Use fontconfig font configuration backend])
+     PKG_CHECK_MODULES(FONTCONFIG, fontconfig >= 2.0.0)
+     ;;
+  *)
+     AC_MSG_ERROR(
+               [Invalid font configuration setting: $with_font_configuration])
+     ;;
+esac
+
+AM_CONDITIONAL(BUILD_WITH_WIN32_FONTCONFIGURATION,
+               test x$with_font_configuration = xwin32)
+
+AC_ARG_ENABLE(splash-output,
+              AC_HELP_STRING([--disable-splash-output],
+                            [Don't build the Splash graphics backend.]),,
+              enable_splash_output="yes")
+AM_CONDITIONAL(BUILD_SPLASH_OUTPUT, test x$enable_splash_output = xyes)
+AH_TEMPLATE([HAVE_SPLASH], [Use splash for rendering.])
+if test x$enable_splash_output = xyes; then
+  AC_DEFINE(HAVE_SPLASH)
+fi
+
+CAIRO_VERSION="1.10.0"
+AC_SUBST(CAIRO_VERSION)
+AC_ARG_ENABLE(cairo-output,
+              AC_HELP_STRING([--disable-cairo-output],
+                             [Don't build the cairo graphics backend.]),
+              enable_cairo_output=$enableval,
+              enable_cairo_output="try")
+use_cairo=""
+if test x$enable_cairo_output = xyes; then
+  PKG_CHECK_MODULES(CAIRO, cairo >= $CAIRO_VERSION cairo-ft >= $CAIRO_VERSION)
+elif test x$enable_cairo_output = xtry; then
+  PKG_CHECK_MODULES(CAIRO, cairo >= $CAIRO_VERSION cairo-ft >= $CAIRO_VERSION,
+                    [enable_cairo_output="yes"],
+                    [enable_cairo_output="no"
+                    use_cairo="no (requires cairo >= $CAIRO_VERSION)"])
+fi
+if test x$use_cairo = x; then
+   use_cairo=$enable_cairo_output
+fi
+
+AC_SUBST(CAIRO_CFLAGS)
+AC_SUBST(CAIRO_LIBS)
+
+AM_CONDITIONAL(BUILD_CAIRO_OUTPUT, test x$enable_cairo_output = xyes)
+AH_TEMPLATE([HAVE_CAIRO], [Use cairo for rendering.])
+if test x$enable_cairo_output = xyes; then
+  PDFTOCAIRO_DEPS="cairo cairo-ft"
+  dnl Check for optional cairo backends used by pdftocairo
+  PKG_CHECK_EXISTS(cairo-pdf, [PDFTOCAIRO_DEPS="$PDFTOCAIRO_DEPS cairo-pdf"], [])
+  PKG_CHECK_EXISTS(cairo-ps,  [PDFTOCAIRO_DEPS="$PDFTOCAIRO_DEPS cairo-ps"],  [])
+  PKG_CHECK_EXISTS(cairo-svg, [PDFTOCAIRO_DEPS="$PDFTOCAIRO_DEPS cairo-svg"], [])
+
+  PKG_CHECK_MODULES(PDFTOCAIRO, $PDFTOCAIRO_DEPS)
+  AC_SUBST(PDFTOCAIRO_CFLAGS)
+  AC_SUBST(PDFTOCAIRO_LIBS)
+
+  AC_DEFINE(HAVE_CAIRO)
+  CAIRO_FEATURE="#define POPPLER_HAS_CAIRO 1"
+  CAIRO_REQ="cairo"
+  AC_CHECK_HEADERS(fcntl.h sys/mman.h sys/stat.h)
+else
+  CAIRO_FEATURE="#undef POPPLER_HAS_CAIRO"
+  CAIRO_REQ=""
+fi
+AC_SUBST(CAIRO_FEATURE)
+AC_SUBST(CAIRO_REQ)
+
+use_glib=""
+found_introspection=no
+if test x$enable_cairo_output = xyes; then
+  POPPLER_GLIB_DISABLE_DEPRECATED=""
+  POPPLER_GLIB_DISABLE_SINGLE_INCLUDES=""
+
+  GLIB_REQUIRED=2.18
+  AC_SUBST(GLIB_REQUIRED)
+  AC_ARG_ENABLE(poppler-glib,
+               AC_HELP_STRING([--disable-poppler-glib],
+                              [Don't compile poppler glib wrapper.]),
+                              enable_poppler_glib=$enableval,
+                              enable_poppler_glib="try")
+  if test x$enable_poppler_glib = xyes; then
+    PKG_CHECK_MODULES(POPPLER_GLIB, glib-2.0 >= $GLIB_REQUIRED gobject-2.0 >= $GLIB_REQUIRED cairo >= $CAIRO_VERSION)
+  elif test x$enable_poppler_glib = xtry; then
+    PKG_CHECK_MODULES(POPPLER_GLIB, glib-2.0 >= $GLIB_REQUIRED gobject-2.0 >= $GLIB_REQUIRED cairo >= $CAIRO_VERSION,
+                      [enable_poppler_glib="yes"],
+                      [enable_poppler_glib="no"
+                      use_glib="no (requires glib-2.0 >= $GLIB_REQUIRED gobject-2.0 >= $GLIB_REQUIRED cairo >= $CAIRO_VERSION)"])
+  fi
+  if test x$enable_poppler_glib = xyes; then
+    # Check for introspection
+    GOBJECT_INTROSPECTION_CHECK([0.6.7])
+
+    AC_PATH_PROG([GLIB_MKENUMS],[glib-mkenums])
+    POPPLER_GLIB_DISABLE_DEPRECATED="$POPPLER_GLIB_DISABLE_DEPRECATED -DG_DISABLE_DEPRECATED"
+    POPPLER_GLIB_DISABLE_SINGLE_INCLUDES="$POPPLER_GLIB_DISABLE_SINGLE_INCLUDES -DG_DISABLE_SINGLE_INCLUDES"
+  fi
+else
+  if test x$enable_poppler_glib = xyes; then
+    AC_MSG_ERROR("Cairo output is required to build glib frontend")
+  fi
+  use_glib="no (requires cairo output)"
+  enable_poppler_glib="no"
+fi
+if test x"$use_glib" = x; then
+   use_glib="$enable_poppler_glib"
+fi
+AM_CONDITIONAL(BUILD_POPPLER_GLIB, test x$enable_poppler_glib = xyes)
+AM_CONDITIONAL(HAVE_INTROSPECTION, test "x$found_introspection" = "xyes")
+AC_SUBST(GLIB_REQ)
+AC_SUBST(POPPLER_GLIB_DISABLE_DEPRECATED)
+AC_SUBST(POPPLER_GLIB_DISABLE_SINGLE_INCLUDES)
+
+GTK_DOC_CHECK([1.14],[--flavour no-tmpl])
+
+dnl 
+dnl Try Qt4
+dnl
+
+AC_ARG_ENABLE(poppler-qt4,
+              AC_HELP_STRING([--disable-poppler-qt4],
+                            [Don't compile poppler Qt4 wrapper.]),
+              enable_poppler_qt4=$enableval,
+              enable_poppler_qt4="try")
+if test x$enable_poppler_qt4 = xyes; then
+  PKG_CHECK_MODULES(POPPLER_QT4, 
+                   QtCore >= 4.4.0 QtGui >= 4.4.0 QtXml >= 4.4.0)
+  PKG_CHECK_MODULES(POPPLER_QT4_TEST, 
+                   QtTest >= 4.4.0)
+elif test x$enable_poppler_qt4 = xtry; then
+  PKG_CHECK_MODULES(POPPLER_QT4,
+                    QtCore >= 4.4.0 QtGui >= 4.4.0 QtXml >= 4.4.0,
+                    [enable_poppler_qt4="yes"],
+                    [enable_poppler_qt4="no"])
+  if test x$enable_poppler_qt4 = xyes; then
+    PKG_CHECK_MODULES(POPPLER_QT4_TEST,
+                    QtTest >= 4.4.0,
+                    [enable_poppler_qt4="yes"],
+                    [enable_poppler_qt4="no"])
+  fi
+fi
+
+AC_SUBST(POPPLER_QT4_CXXFLAGS)
+AC_SUBST(POPPLER_QT4_LIBS)
+AC_SUBST(POPPLER_QT4_TEST_LIBS)
+
+if test x$enable_poppler_qt4 = xyes; then
+  AC_CHECK_TOOL(MOCQT4, moc)
+  AC_MSG_CHECKING([for Qt4 moc])
+  mocversion=`$MOCQT4 -v 2>&1`
+  mocversiongrep=`echo $mocversion | grep "Qt 4"`
+  if test x"$mocversiongrep" != x"$mocversion"; then
+    AC_MSG_RESULT([no])
+    # moc was not the qt4 one, try with moc-qt4
+    AC_CHECK_TOOL(MOCQT4, moc-qt4)
+    AC_MSG_CHECKING([for Qt4 moc-qt4])
+    mocversion=`$MOCQT4 -v 2>&1`
+    mocversiongrep=`echo $mocversion | grep "Qt 4"`
+    if test x"$mocversiongrep" != x"$mocversion"; then
+      # no valid moc found
+      enable_poppler_qt4=no;
+      MOCQT4="not found"
+    fi
+  fi
+  AC_SUBST(MOCQT4)
+  AC_MSG_RESULT([$MOCQT4])
+fi
+
+AM_CONDITIONAL(BUILD_POPPLER_QT4, test "x$enable_poppler_qt4" = "xyes")
+
+dnl
+dnl CPP frontend
+dnl
+
+AC_ARG_ENABLE(poppler-cpp,
+              AC_HELP_STRING([--disable-poppler-cpp],
+                             [Don't compile poppler cpp wrapper.]),
+              enable_poppler_cpp=$enableval,
+              enable_poppler_cpp="yes")
+if test x$enable_poppler_cpp = xyes; then
+  AM_ICONV()
+  if test x$am_func_iconv != xyes; then
+    enable_poppler_cpp=no
+  fi
+fi
+
+AM_CONDITIONAL(BUILD_POPPLER_CPP, test "x$enable_poppler_cpp" = "xyes")
+
+
+AC_ARG_ENABLE(gtk-test,
+              AC_HELP_STRING([--disable-gtk-test],
+                            [Don't compile GTK+ test program.]),
+              enable_gtk_test=$enableval,
+              enable_gtk_test="try")
+if test x$enable_gtk_test = xyes; then
+  PKG_CHECK_MODULES(GTK_TEST, gtk+-2.0 >= 2.14 gdk-pixbuf-2.0 gthread-2.0 gio-2.0)
+elif test x$enable_gtk_test = xtry; then
+  PKG_CHECK_MODULES(GTK_TEST, gtk+-2.0 >= 2.14 gdk-pixbuf-2.0 gthread-2.0 gio-2.0,
+                    [enable_gtk_test="yes"],
+                    [enable_gtk_test="no"])
+fi
+AM_CONDITIONAL(BUILD_GTK_TEST, test x$enable_gtk_test = xyes -a x$enable_poppler_glib = xyes)
+
+AC_ARG_ENABLE(utils,
+              AC_HELP_STRING([--disable-utils],
+                            [Don't compile poppler command line utils.]),
+              enable_utils=$enableval,
+              enable_utils="yes")
+AM_CONDITIONAL(BUILD_UTILS, test x$enable_utils = xyes)
+
+AC_ARG_ENABLE(compile-warnings,
+              AC_HELP_STRING([--enable-compile-warnings=@<:@no/yes/kde@:>@]
+                             [Turn on compiler warnings.]),,
+              [enable_compile_warnings="yes"])
+
+dnl
+dnl   Color Management
+dnl
+
+AC_ARG_ENABLE(cms,
+             AC_HELP_STRING([--disable-cms],
+                            [Don't use color management system.]),
+              enable_cms=$enableval,
+              enable_cms="try")
+if test x$enable_cms = xyes; then
+  PKG_CHECK_MODULES(LCMS, lcms2, [lcms2=yes], [lcms2=no])
+  if test x$lcms2 = xno; then
+      PKG_CHECK_MODULES(LCMS, lcms)
+  fi
+elif test x$enable_cms = xtry; then
+  PKG_CHECK_MODULES(LCMS, lcms2,[lcms2=yes],[lcms2=no])
+  if test x$lcms2 = xyes; then
+    enable_cms=yes
+  else
+      PKG_CHECK_MODULES(LCMS, lcms,[enable_cms=yes],[enable_cms=no])
+  fi
+fi
+
+if test "x$enable_cms" = "xyes"; then
+  AC_DEFINE(USE_CMS, 1, [Defines if use cms])
+  if test "x$lcms2" != "xyes"; then
+    lcms1=yes;
+    AC_DEFINE(USE_LCMS1, 1, [Defines if use lcms1])
+  fi
+fi
+AM_CONDITIONAL(USE_CMS, test x$enable_cms = xyes)
+AM_CONDITIONAL(USE_LCMS1, test x$lcms1 = xyes)
+
+AC_ARG_WITH([testdatadir],
+   [AS_HELP_STRING([--with-testdatadir=/path/to/testdatadir],
+                   [Specify test data dir])],
+   [case $withval in
+       [[\\/]]* | ?:[[\\/]]* )  # Absolute name.
+          TESTDATADIR=$withval ;;
+       *) # Relative name.
+          TESTDATADIR=$ac_pwd/$withval ;;
+    esac
+   ],
+   [case $srcdir in
+       [[\\/]]* | ?:[[\\/]]* )  # Absolute name.
+          TESTDATADIR=$srcdir/../test ;;
+       *) # Relative name.
+          TESTDATADIR=$ac_pwd/$srcdir/../test ;;
+    esac
+   ]
+)
+AC_MSG_CHECKING([for test data in $TESTDATADIR])
+if test -d $TESTDATADIR && test -f $TESTDATADIR/test-poppler.c; then
+  AC_MSG_RESULT([yes])
+else
+  AC_MSG_RESULT([no])
+  AC_MSG_WARN([
+ No test data found in $TESTDATADIR.
+ You will not be able to run 'make check' successfully.
+
+ The test data is not included in the source packages
+ and is also not part of the main git repository. Instead,
+ you can checkout the test data from its own git
+ repository with:
+
+   git clone git://git.freedesktop.org/git/poppler/test
+
+ You should checkout the test data as a sibling of your
+ poppler source folder or specify the location of your
+ checkout with --with-testdatadir=/path/to/checkoutdir/test.
+])
+fi
+AC_SUBST(TESTDATADIR)
+
+if test "x$GCC" != xyes; then
+  enable_compile_warnings=no
+fi
+case "$enable_compile_warnings" in
+  no)  ;;
+  yes) CXXFLAGS="-Wall -Woverloaded-virtual -Wnon-virtual-dtor -Wcast-align -fno-exceptions -fno-check-new -fno-common $CXXFLAGS" ;;
+  kde) CXXFLAGS="-Wnon-virtual-dtor -Wno-long-long -Wundef \
+               -D_XOPEN_SOURCE=600 -D_BSD_SOURCE -Wcast-align \
+               -Wconversion -Wall -W -Wpointer-arith \
+               -Wwrite-strings -O2 -Wformat-security \
+               -Wmissing-format-attribute -fno-exceptions -fno-check-new \
+               -fno-common $CXXFLAGS" ;;
+esac
+
+case `$PKG_CONFIG --version` in
+  0.?|0.1[0-7])
+    PC_REQUIRES_PRIVATE="";
+    PC_REQUIRES="poppler = $VERSION";;
+  *)
+    PC_REQUIRES_PRIVATE="Requires.private: poppler = $VERSION";
+    PC_REQUIRES="";;
+esac
+
+AC_SUBST(PC_REQUIRES)
+AC_SUBST(PC_REQUIRES_PRIVATE)
+
+AC_SUBST([POPPLER_MAJOR_VERSION],[poppler_version_major])
+AC_SUBST([POPPLER_MINOR_VERSION],[poppler_version_minor])
+AC_SUBST([POPPLER_MICRO_VERSION],[poppler_version_micro])
+AC_SUBST([POPPLER_VERSION],[poppler_version])
+
+AC_OUTPUT([
+Makefile
+goo/Makefile
+fofi/Makefile
+splash/Makefile
+poppler/Makefile
+utils/Makefile
+glib/Makefile
+glib/poppler-features.h
+glib/reference/Makefile
+glib/reference/version.xml
+glib/demo/Makefile
+test/Makefile
+qt4/Makefile
+qt4/src/Makefile
+qt4/tests/Makefile
+qt4/demos/Makefile
+cpp/Makefile
+cpp/poppler-version.h
+cpp/tests/Makefile
+poppler.pc
+poppler-uninstalled.pc
+poppler-cairo.pc
+poppler-cairo-uninstalled.pc
+poppler-splash.pc
+poppler-splash-uninstalled.pc
+poppler-glib.pc
+poppler-glib-uninstalled.pc
+poppler-qt4.pc
+poppler-qt4-uninstalled.pc
+poppler-cpp.pc
+poppler-cpp-uninstalled.pc])
+
+
+echo ""
+echo "Building poppler with support for:"
+echo "  font configuration: $with_font_configuration"
+echo "  splash output:      $enable_splash_output"
+echo "  cairo output:       $use_cairo"
+echo "  qt4 wrapper:        $enable_poppler_qt4"
+echo "  glib wrapper:       $use_glib"
+echo "    introspection:    $found_introspection"
+echo "  cpp wrapper:        $enable_poppler_cpp"
+echo "  use gtk-doc:        $enable_gtk_doc"
+echo "  use libjpeg:        $enable_libjpeg"
+echo "  use libpng:         $enable_libpng"
+echo "  use libtiff:        $enable_libtiff"
+echo "  use zlib:           $enable_zlib"
+echo "  use libcurl:        $enable_libcurl"
+echo "  use libopenjpeg:    $enable_libopenjpeg"
+echo "  use cms:            $enable_cms"
+if test x$enable_cms = xyes;then
+    if test x$lcms1 = xyes;then
+        echo "      with lcms1"
+    else
+        echo "      with lcms2"
+    fi
+fi
+echo "  command line utils: $enable_utils"
+echo "  test data dir:      $TESTDATADIR"
+echo ""
+
+if test x$enable_splash_output = xno -a x$enable_cairo_output = xno; then
+       echo "  Warning: There is no rendering backend enabled"
+fi
+
+if test x$enable_single_precision = xyes -a x$enable_fixedpoint = xyes; then
+       echo "  Warning: Single precision and fixed point options should not be enabled at the same time"
+fi
+
+if test x$enable_libjpeg != xyes; then
+       echo "  Warning: Using libjpeg is recommended"
+fi
+
+if test x$enable_zlib != xno; then
+       echo "  Warning: Using zlib is not totally safe"
+fi
+
+if test x$enable_libopenjpeg != xyes; then
+       echo "  Warning: Using libopenjpeg is recommended"
+fi
diff --git a/cpp/CMakeLists.txt b/cpp/CMakeLists.txt
new file mode 100644 (file)
index 0000000..af61606
--- /dev/null
@@ -0,0 +1,48 @@
+include_directories(
+  ${CMAKE_CURRENT_SOURCE_DIR}
+  ${CMAKE_CURRENT_BINARY_DIR}
+)
+
+configure_file(poppler-version.h.in ${CMAKE_CURRENT_BINARY_DIR}/poppler-version.h @ONLY)
+
+add_subdirectory(tests)
+
+set(poppler_cpp_SRCS
+  PNMWriter.cc
+  poppler-document.cpp
+  poppler-embedded-file.cpp
+  poppler-font.cpp
+  poppler-global.cpp
+  poppler-image.cpp
+  poppler-page.cpp
+  poppler-page-renderer.cpp
+  poppler-page-transition.cpp
+  poppler-private.cpp
+  poppler-rectangle.cpp
+  poppler-toc.cpp
+  poppler-version.cpp
+)
+
+add_library(poppler-cpp SHARED ${poppler_cpp_SRCS})
+set_target_properties(poppler-cpp PROPERTIES VERSION 0.2.0 SOVERSION 0)
+target_link_libraries(poppler-cpp poppler ${ICONV_LIBRARIES})
+if(MSVC)
+target_link_libraries(poppler-cpp ${poppler_LIBS})
+endif(MSVC)
+target_link_libraries(poppler-cpp LINK_INTERFACE_LIBRARIES "")
+install(TARGETS poppler-cpp RUNTIME DESTINATION bin LIBRARY DESTINATION lib${LIB_SUFFIX} ARCHIVE DESTINATION lib${LIB_SUFFIX})
+
+install(FILES
+  poppler-document.h
+  poppler-embedded-file.h
+  poppler-font.h
+  poppler-global.h
+  poppler-image.h
+  poppler-page.h
+  poppler-page-renderer.h
+  poppler-page-transition.h
+  poppler-rectangle.h
+  poppler-toc.h
+  ${CMAKE_CURRENT_BINARY_DIR}/poppler-version.h
+  DESTINATION include/poppler/cpp)
+
diff --git a/cpp/Makefile.am b/cpp/Makefile.am
new file mode 100644 (file)
index 0000000..f381e58
--- /dev/null
@@ -0,0 +1,72 @@
+INCLUDES =                                     \
+       -I$(top_srcdir)                         \
+       -I$(top_srcdir)/goo                     \
+       -I$(top_srcdir)/poppler                 \
+       $(libjpeg_includes)                     \
+       $(libtiff_includes)                     \
+       $(libjpeg2000_includes)                 \
+       $(libpng_includes)
+
+if BUILD_LIBJPEG
+libjpeg_includes = $(LIBJPEG_CFLAGS)
+endif
+
+if BUILD_LIBTIFF
+libtiff_includes = $(LIBTIFF_CFLAGS)
+endif
+
+if BUILD_LIBOPENJPEG
+libjpeg2000_includes = $(LIBOPENJPEG_CFLAGS)
+endif
+
+if BUILD_LIBPNG
+libpng_includes = $(LIBPNG_CFLAGS)
+endif
+
+SUBDIRS = . tests
+
+poppler_includedir = $(includedir)/poppler/cpp
+poppler_include_HEADERS =                      \
+       poppler-document.h                      \
+       poppler-embedded-file.h                 \
+       poppler-font.h                          \
+       poppler-global.h                        \
+       poppler-image.h                 \
+       poppler-page.h                          \
+       poppler-page-renderer.h                 \
+       poppler-page-transition.h               \
+       poppler-rectangle.h                     \
+       poppler-toc.h                           \
+       $(builddir)/poppler-version.h
+
+lib_LTLIBRARIES = libpoppler-cpp.la
+libpoppler_cpp_la_SOURCES =                    \
+       PNMWriter.cc                            \
+       PNMWriter.h                             \
+       poppler-document.cpp                    \
+       poppler-document-private.h              \
+       poppler-embedded-file.cpp               \
+       poppler-embedded-file-private.h         \
+       poppler-font.cpp                        \
+       poppler-global.cpp                      \
+       poppler-image.cpp                       \
+       poppler-image-private.h                 \
+       poppler-page.cpp                        \
+       poppler-page-private.h                  \
+       poppler-page-renderer.cpp               \
+       poppler-page-transition.cpp             \
+       poppler-private.cpp                     \
+       poppler-private.h                       \
+       poppler-rectangle.cpp                   \
+       poppler-toc.cpp                         \
+       poppler-toc-private.h                   \
+       poppler-version.cpp
+
+libpoppler_cpp_la_CXXFLAGS =                   \
+       -Dpoppler_cpp_EXPORTS
+
+libpoppler_cpp_la_LIBADD =                     \
+       $(top_builddir)/poppler/libpoppler.la   \
+       $(LIBICONV)
+
+libpoppler_cpp_la_LDFLAGS = -version-info 2:0:2 @create_shared_lib@ @auto_import_flags@
diff --git a/cpp/Makefile.in b/cpp/Makefile.in
new file mode 100644 (file)
index 0000000..3dc0e24
--- /dev/null
@@ -0,0 +1,1051 @@
+# Makefile.in generated by automake 1.11.5 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software
+# Foundation, Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+@SET_MAKE@
+
+
+VPATH = @srcdir@
+am__make_dryrun = \
+  { \
+    am__dry=no; \
+    case $$MAKEFLAGS in \
+      *\\[\ \  ]*) \
+        echo 'am--echo: ; @echo "AM"  OK' | $(MAKE) -f - 2>/dev/null \
+          | grep '^AM OK$$' >/dev/null || am__dry=yes;; \
+      *) \
+        for am__flg in $$MAKEFLAGS; do \
+          case $$am__flg in \
+            *=*|--*) ;; \
+            *n*) am__dry=yes; break;; \
+          esac; \
+        done;; \
+    esac; \
+    test $$am__dry = yes; \
+  }
+pkgdatadir = $(datadir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkglibexecdir = $(libexecdir)/@PACKAGE@
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+subdir = cpp
+DIST_COMMON = $(poppler_include_HEADERS) $(srcdir)/Makefile.am \
+       $(srcdir)/Makefile.in $(srcdir)/poppler-version.h.in
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/m4/acx_pthread.m4 \
+       $(top_srcdir)/m4/define-dir.m4 $(top_srcdir)/m4/gtk-doc.m4 \
+       $(top_srcdir)/m4/iconv.m4 $(top_srcdir)/m4/introspection.m4 \
+       $(top_srcdir)/m4/libjpeg.m4 $(top_srcdir)/m4/libtool.m4 \
+       $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \
+       $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \
+       $(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+       $(ACLOCAL_M4)
+mkinstalldirs = $(install_sh) -d
+CONFIG_HEADER = $(top_builddir)/config.h \
+       $(top_builddir)/poppler/poppler-config.h
+CONFIG_CLEAN_FILES = poppler-version.h
+CONFIG_CLEAN_VPATH_FILES =
+am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
+am__vpath_adj = case $$p in \
+    $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
+    *) f=$$p;; \
+  esac;
+am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`;
+am__install_max = 40
+am__nobase_strip_setup = \
+  srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'`
+am__nobase_strip = \
+  for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||"
+am__nobase_list = $(am__nobase_strip_setup); \
+  for p in $$list; do echo "$$p $$p"; done | \
+  sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \
+  $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \
+    if (++n[$$2] == $(am__install_max)) \
+      { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \
+    END { for (dir in files) print dir, files[dir] }'
+am__base_list = \
+  sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
+  sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
+am__uninstall_files_from_dir = { \
+  test -z "$$files" \
+    || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \
+    || { echo " ( cd '$$dir' && rm -f" $$files ")"; \
+         $(am__cd) "$$dir" && rm -f $$files; }; \
+  }
+am__installdirs = "$(DESTDIR)$(libdir)" \
+       "$(DESTDIR)$(poppler_includedir)"
+LTLIBRARIES = $(lib_LTLIBRARIES)
+am__DEPENDENCIES_1 =
+libpoppler_cpp_la_DEPENDENCIES =  \
+       $(top_builddir)/poppler/libpoppler.la $(am__DEPENDENCIES_1)
+am_libpoppler_cpp_la_OBJECTS = libpoppler_cpp_la-PNMWriter.lo \
+       libpoppler_cpp_la-poppler-document.lo \
+       libpoppler_cpp_la-poppler-embedded-file.lo \
+       libpoppler_cpp_la-poppler-font.lo \
+       libpoppler_cpp_la-poppler-global.lo \
+       libpoppler_cpp_la-poppler-image.lo \
+       libpoppler_cpp_la-poppler-page.lo \
+       libpoppler_cpp_la-poppler-page-renderer.lo \
+       libpoppler_cpp_la-poppler-page-transition.lo \
+       libpoppler_cpp_la-poppler-private.lo \
+       libpoppler_cpp_la-poppler-rectangle.lo \
+       libpoppler_cpp_la-poppler-toc.lo \
+       libpoppler_cpp_la-poppler-version.lo
+libpoppler_cpp_la_OBJECTS = $(am_libpoppler_cpp_la_OBJECTS)
+AM_V_lt = $(am__v_lt_@AM_V@)
+am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@)
+am__v_lt_0 = --silent
+libpoppler_cpp_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX \
+       $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CXXLD) \
+       $(libpoppler_cpp_la_CXXFLAGS) $(CXXFLAGS) \
+       $(libpoppler_cpp_la_LDFLAGS) $(LDFLAGS) -o $@
+DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) -I$(top_builddir)/poppler
+depcomp = $(SHELL) $(top_srcdir)/depcomp
+am__depfiles_maybe = depfiles
+am__mv = mv -f
+CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
+       $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)
+LTCXXCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \
+       $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) \
+       $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
+       $(AM_CXXFLAGS) $(CXXFLAGS)
+AM_V_CXX = $(am__v_CXX_@AM_V@)
+am__v_CXX_ = $(am__v_CXX_@AM_DEFAULT_V@)
+am__v_CXX_0 = @echo "  CXX   " $@;
+AM_V_at = $(am__v_at_@AM_V@)
+am__v_at_ = $(am__v_at_@AM_DEFAULT_V@)
+am__v_at_0 = @
+CXXLD = $(CXX)
+CXXLINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \
+       $(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \
+       $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
+AM_V_CXXLD = $(am__v_CXXLD_@AM_V@)
+am__v_CXXLD_ = $(am__v_CXXLD_@AM_DEFAULT_V@)
+am__v_CXXLD_0 = @echo "  CXXLD " $@;
+COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
+       $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
+LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
+       $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \
+       $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
+       $(AM_CFLAGS) $(CFLAGS)
+AM_V_CC = $(am__v_CC_@AM_V@)
+am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@)
+am__v_CC_0 = @echo "  CC    " $@;
+CCLD = $(CC)
+LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
+       $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
+       $(AM_LDFLAGS) $(LDFLAGS) -o $@
+AM_V_CCLD = $(am__v_CCLD_@AM_V@)
+am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@)
+am__v_CCLD_0 = @echo "  CCLD  " $@;
+AM_V_GEN = $(am__v_GEN_@AM_V@)
+am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@)
+am__v_GEN_0 = @echo "  GEN   " $@;
+SOURCES = $(libpoppler_cpp_la_SOURCES)
+DIST_SOURCES = $(libpoppler_cpp_la_SOURCES)
+RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \
+       html-recursive info-recursive install-data-recursive \
+       install-dvi-recursive install-exec-recursive \
+       install-html-recursive install-info-recursive \
+       install-pdf-recursive install-ps-recursive install-recursive \
+       installcheck-recursive installdirs-recursive pdf-recursive \
+       ps-recursive uninstall-recursive
+am__can_run_installinfo = \
+  case $$AM_UPDATE_INFO_DIR in \
+    n|no|NO) false;; \
+    *) (install-info --version) >/dev/null 2>&1;; \
+  esac
+HEADERS = $(poppler_include_HEADERS)
+RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive        \
+  distclean-recursive maintainer-clean-recursive
+AM_RECURSIVE_TARGETS = $(RECURSIVE_TARGETS:-recursive=) \
+       $(RECURSIVE_CLEAN_TARGETS:-recursive=) tags TAGS ctags CTAGS \
+       distdir
+ETAGS = etags
+CTAGS = ctags
+DIST_SUBDIRS = $(SUBDIRS)
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+am__relativize = \
+  dir0=`pwd`; \
+  sed_first='s,^\([^/]*\)/.*$$,\1,'; \
+  sed_rest='s,^[^/]*/*,,'; \
+  sed_last='s,^.*/\([^/]*\)$$,\1,'; \
+  sed_butlast='s,/*[^/]*$$,,'; \
+  while test -n "$$dir1"; do \
+    first=`echo "$$dir1" | sed -e "$$sed_first"`; \
+    if test "$$first" != "."; then \
+      if test "$$first" = ".."; then \
+        dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \
+        dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \
+      else \
+        first2=`echo "$$dir2" | sed -e "$$sed_first"`; \
+        if test "$$first2" = "$$first"; then \
+          dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \
+        else \
+          dir2="../$$dir2"; \
+        fi; \
+        dir0="$$dir0"/"$$first"; \
+      fi; \
+    fi; \
+    dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \
+  done; \
+  reldir="$$dir2"
+ACLOCAL = @ACLOCAL@
+AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AR = @AR@
+AS = @AS@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CAIRO_CFLAGS = @CAIRO_CFLAGS@
+CAIRO_FEATURE = @CAIRO_FEATURE@
+CAIRO_LIBS = @CAIRO_LIBS@
+CAIRO_REQ = @CAIRO_REQ@
+CAIRO_VERSION = @CAIRO_VERSION@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CXX = @CXX@
+CXXCPP = @CXXCPP@
+CXXDEPMODE = @CXXDEPMODE@
+CXXFLAGS = @CXXFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DLLTOOL = @DLLTOOL@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+FGREP = @FGREP@
+FONTCONFIG_CFLAGS = @FONTCONFIG_CFLAGS@
+FONTCONFIG_LIBS = @FONTCONFIG_LIBS@
+FREETYPE_CFLAGS = @FREETYPE_CFLAGS@
+FREETYPE_CONFIG = @FREETYPE_CONFIG@
+FREETYPE_LIBS = @FREETYPE_LIBS@
+GLIB_MKENUMS = @GLIB_MKENUMS@
+GLIB_REQ = @GLIB_REQ@
+GLIB_REQUIRED = @GLIB_REQUIRED@
+GREP = @GREP@
+GTKDOC_CHECK = @GTKDOC_CHECK@
+GTKDOC_DEPS_CFLAGS = @GTKDOC_DEPS_CFLAGS@
+GTKDOC_DEPS_LIBS = @GTKDOC_DEPS_LIBS@
+GTKDOC_MKPDF = @GTKDOC_MKPDF@
+GTKDOC_REBASE = @GTKDOC_REBASE@
+GTK_TEST_CFLAGS = @GTK_TEST_CFLAGS@
+GTK_TEST_LIBS = @GTK_TEST_LIBS@
+HTML_DIR = @HTML_DIR@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+INTROSPECTION_CFLAGS = @INTROSPECTION_CFLAGS@
+INTROSPECTION_COMPILER = @INTROSPECTION_COMPILER@
+INTROSPECTION_GENERATE = @INTROSPECTION_GENERATE@
+INTROSPECTION_GIRDIR = @INTROSPECTION_GIRDIR@
+INTROSPECTION_LIBS = @INTROSPECTION_LIBS@
+INTROSPECTION_MAKEFILE = @INTROSPECTION_MAKEFILE@
+INTROSPECTION_SCANNER = @INTROSPECTION_SCANNER@
+INTROSPECTION_TYPELIBDIR = @INTROSPECTION_TYPELIBDIR@
+LCMS_CFLAGS = @LCMS_CFLAGS@
+LCMS_LIBS = @LCMS_LIBS@
+LD = @LD@
+LDFLAGS = @LDFLAGS@
+LIBCURL_CFLAGS = @LIBCURL_CFLAGS@
+LIBCURL_LIBS = @LIBCURL_LIBS@
+LIBICONV = @LIBICONV@
+LIBJPEG_CFLAGS = @LIBJPEG_CFLAGS@
+LIBJPEG_LIBS = @LIBJPEG_LIBS@
+LIBOBJS = @LIBOBJS@
+LIBOPENJPEG_CFLAGS = @LIBOPENJPEG_CFLAGS@
+LIBOPENJPEG_LIBS = @LIBOPENJPEG_LIBS@
+LIBPNG_CFLAGS = @LIBPNG_CFLAGS@
+LIBPNG_LIBS = @LIBPNG_LIBS@
+LIBS = @LIBS@
+LIBTIFF_CFLAGS = @LIBTIFF_CFLAGS@
+LIBTIFF_CFLAGSS = @LIBTIFF_CFLAGSS@
+LIBTIFF_LIBS = @LIBTIFF_LIBS@
+LIBTOOL = @LIBTOOL@
+LIPO = @LIPO@
+LN_S = @LN_S@
+LTLIBICONV = @LTLIBICONV@
+LTLIBOBJS = @LTLIBOBJS@
+MAKEINFO = @MAKEINFO@
+MANIFEST_TOOL = @MANIFEST_TOOL@
+MKDIR_P = @MKDIR_P@
+MOCQT4 = @MOCQT4@
+NM = @NM@
+NMEDIT = @NMEDIT@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+OTOOL = @OTOOL@
+OTOOL64 = @OTOOL64@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_URL = @PACKAGE_URL@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PC_REQUIRES = @PC_REQUIRES@
+PC_REQUIRES_PRIVATE = @PC_REQUIRES_PRIVATE@
+PDFTOCAIRO_CFLAGS = @PDFTOCAIRO_CFLAGS@
+PDFTOCAIRO_LIBS = @PDFTOCAIRO_LIBS@
+PKG_CONFIG = @PKG_CONFIG@
+PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@
+PKG_CONFIG_PATH = @PKG_CONFIG_PATH@
+POPPLER_DATADIR = @POPPLER_DATADIR@
+POPPLER_GLIB_CFLAGS = @POPPLER_GLIB_CFLAGS@
+POPPLER_GLIB_DISABLE_DEPRECATED = @POPPLER_GLIB_DISABLE_DEPRECATED@
+POPPLER_GLIB_DISABLE_SINGLE_INCLUDES = @POPPLER_GLIB_DISABLE_SINGLE_INCLUDES@
+POPPLER_GLIB_LIBS = @POPPLER_GLIB_LIBS@
+POPPLER_MAJOR_VERSION = @POPPLER_MAJOR_VERSION@
+POPPLER_MICRO_VERSION = @POPPLER_MICRO_VERSION@
+POPPLER_MINOR_VERSION = @POPPLER_MINOR_VERSION@
+POPPLER_QT4_CFLAGS = @POPPLER_QT4_CFLAGS@
+POPPLER_QT4_CXXFLAGS = @POPPLER_QT4_CXXFLAGS@
+POPPLER_QT4_LIBS = @POPPLER_QT4_LIBS@
+POPPLER_QT4_TEST_CFLAGS = @POPPLER_QT4_TEST_CFLAGS@
+POPPLER_QT4_TEST_LIBS = @POPPLER_QT4_TEST_LIBS@
+POPPLER_VERSION = @POPPLER_VERSION@
+PTHREAD_CC = @PTHREAD_CC@
+PTHREAD_CFLAGS = @PTHREAD_CFLAGS@
+PTHREAD_LIBS = @PTHREAD_LIBS@
+RANLIB = @RANLIB@
+SED = @SED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+TESTDATADIR = @TESTDATADIR@
+VERSION = @VERSION@
+XMKMF = @XMKMF@
+X_CFLAGS = @X_CFLAGS@
+X_EXTRA_LIBS = @X_EXTRA_LIBS@
+X_LIBS = @X_LIBS@
+X_PRE_LIBS = @X_PRE_LIBS@
+ZLIB_LIBS = @ZLIB_LIBS@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
+ac_ct_AR = @ac_ct_AR@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_CXX = @ac_ct_CXX@
+ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
+acx_pthread_config = @acx_pthread_config@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+auto_import_flags = @auto_import_flags@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+builddir = @builddir@
+create_shared_lib = @create_shared_lib@
+datadir = @datadir@
+datarootdir = @datarootdir@
+docdir = @docdir@
+dvidir = @dvidir@
+exec_prefix = @exec_prefix@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+htmldir = @htmldir@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localedir = @localedir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+srcdir = @srcdir@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+top_build_prefix = @top_build_prefix@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+win32_libs = @win32_libs@
+INCLUDES = \
+       -I$(top_srcdir)                         \
+       -I$(top_srcdir)/goo                     \
+       -I$(top_srcdir)/poppler                 \
+       $(libjpeg_includes)                     \
+       $(libtiff_includes)                     \
+       $(libjpeg2000_includes)                 \
+       $(libpng_includes)
+
+@BUILD_LIBJPEG_TRUE@libjpeg_includes = $(LIBJPEG_CFLAGS)
+@BUILD_LIBTIFF_TRUE@libtiff_includes = $(LIBTIFF_CFLAGS)
+@BUILD_LIBOPENJPEG_TRUE@libjpeg2000_includes = $(LIBOPENJPEG_CFLAGS)
+@BUILD_LIBPNG_TRUE@libpng_includes = $(LIBPNG_CFLAGS)
+SUBDIRS = . tests
+poppler_includedir = $(includedir)/poppler/cpp
+poppler_include_HEADERS = \
+       poppler-document.h                      \
+       poppler-embedded-file.h                 \
+       poppler-font.h                          \
+       poppler-global.h                        \
+       poppler-image.h                 \
+       poppler-page.h                          \
+       poppler-page-renderer.h                 \
+       poppler-page-transition.h               \
+       poppler-rectangle.h                     \
+       poppler-toc.h                           \
+       $(builddir)/poppler-version.h
+
+lib_LTLIBRARIES = libpoppler-cpp.la
+libpoppler_cpp_la_SOURCES = \
+       PNMWriter.cc                            \
+       PNMWriter.h                             \
+       poppler-document.cpp                    \
+       poppler-document-private.h              \
+       poppler-embedded-file.cpp               \
+       poppler-embedded-file-private.h         \
+       poppler-font.cpp                        \
+       poppler-global.cpp                      \
+       poppler-image.cpp                       \
+       poppler-image-private.h                 \
+       poppler-page.cpp                        \
+       poppler-page-private.h                  \
+       poppler-page-renderer.cpp               \
+       poppler-page-transition.cpp             \
+       poppler-private.cpp                     \
+       poppler-private.h                       \
+       poppler-rectangle.cpp                   \
+       poppler-toc.cpp                         \
+       poppler-toc-private.h                   \
+       poppler-version.cpp
+
+libpoppler_cpp_la_CXXFLAGS = \
+       -Dpoppler_cpp_EXPORTS
+
+libpoppler_cpp_la_LIBADD = \
+       $(top_builddir)/poppler/libpoppler.la   \
+       $(LIBICONV)
+
+libpoppler_cpp_la_LDFLAGS = -version-info 2:0:2 @create_shared_lib@ @auto_import_flags@
+all: all-recursive
+
+.SUFFIXES:
+.SUFFIXES: .cc .cpp .lo .o .obj
+$(srcdir)/Makefile.in:  $(srcdir)/Makefile.am  $(am__configure_deps)
+       @for dep in $?; do \
+         case '$(am__configure_deps)' in \
+           *$$dep*) \
+             ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
+               && { if test -f $@; then exit 0; else break; fi; }; \
+             exit 1;; \
+         esac; \
+       done; \
+       echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign cpp/Makefile'; \
+       $(am__cd) $(top_srcdir) && \
+         $(AUTOMAKE) --foreign cpp/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+       @case '$?' in \
+         *config.status*) \
+           cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+         *) \
+           echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+           cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+       esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+       cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure:  $(am__configure_deps)
+       cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4):  $(am__aclocal_m4_deps)
+       cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(am__aclocal_m4_deps):
+poppler-version.h: $(top_builddir)/config.status $(srcdir)/poppler-version.h.in
+       cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@
+install-libLTLIBRARIES: $(lib_LTLIBRARIES)
+       @$(NORMAL_INSTALL)
+       @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \
+       list2=; for p in $$list; do \
+         if test -f $$p; then \
+           list2="$$list2 $$p"; \
+         else :; fi; \
+       done; \
+       test -z "$$list2" || { \
+         echo " $(MKDIR_P) '$(DESTDIR)$(libdir)'"; \
+         $(MKDIR_P) "$(DESTDIR)$(libdir)" || exit 1; \
+         echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(libdir)'"; \
+         $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(libdir)"; \
+       }
+
+uninstall-libLTLIBRARIES:
+       @$(NORMAL_UNINSTALL)
+       @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \
+       for p in $$list; do \
+         $(am__strip_dir) \
+         echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(libdir)/$$f'"; \
+         $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(libdir)/$$f"; \
+       done
+
+clean-libLTLIBRARIES:
+       -test -z "$(lib_LTLIBRARIES)" || rm -f $(lib_LTLIBRARIES)
+       @list='$(lib_LTLIBRARIES)'; for p in $$list; do \
+         dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \
+         test "$$dir" != "$$p" || dir=.; \
+         echo "rm -f \"$${dir}/so_locations\""; \
+         rm -f "$${dir}/so_locations"; \
+       done
+libpoppler-cpp.la: $(libpoppler_cpp_la_OBJECTS) $(libpoppler_cpp_la_DEPENDENCIES) $(EXTRA_libpoppler_cpp_la_DEPENDENCIES) 
+       $(AM_V_CXXLD)$(libpoppler_cpp_la_LINK) -rpath $(libdir) $(libpoppler_cpp_la_OBJECTS) $(libpoppler_cpp_la_LIBADD) $(LIBS)
+
+mostlyclean-compile:
+       -rm -f *.$(OBJEXT)
+
+distclean-compile:
+       -rm -f *.tab.c
+
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libpoppler_cpp_la-PNMWriter.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libpoppler_cpp_la-poppler-document.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libpoppler_cpp_la-poppler-embedded-file.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libpoppler_cpp_la-poppler-font.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libpoppler_cpp_la-poppler-global.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libpoppler_cpp_la-poppler-image.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libpoppler_cpp_la-poppler-page-renderer.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libpoppler_cpp_la-poppler-page-transition.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libpoppler_cpp_la-poppler-page.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libpoppler_cpp_la-poppler-private.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libpoppler_cpp_la-poppler-rectangle.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libpoppler_cpp_la-poppler-toc.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libpoppler_cpp_la-poppler-version.Plo@am__quote@
+
+.cc.o:
+@am__fastdepCXX_TRUE@  $(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
+@am__fastdepCXX_TRUE@  $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ $<
+
+.cc.obj:
+@am__fastdepCXX_TRUE@  $(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'`
+@am__fastdepCXX_TRUE@  $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
+
+.cc.lo:
+@am__fastdepCXX_TRUE@  $(AM_V_CXX)$(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
+@am__fastdepCXX_TRUE@  $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     $(AM_V_CXX)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LTCXXCOMPILE) -c -o $@ $<
+
+libpoppler_cpp_la-PNMWriter.lo: PNMWriter.cc
+@am__fastdepCXX_TRUE@  $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpoppler_cpp_la_CXXFLAGS) $(CXXFLAGS) -MT libpoppler_cpp_la-PNMWriter.lo -MD -MP -MF $(DEPDIR)/libpoppler_cpp_la-PNMWriter.Tpo -c -o libpoppler_cpp_la-PNMWriter.lo `test -f 'PNMWriter.cc' || echo '$(srcdir)/'`PNMWriter.cc
+@am__fastdepCXX_TRUE@  $(AM_V_at)$(am__mv) $(DEPDIR)/libpoppler_cpp_la-PNMWriter.Tpo $(DEPDIR)/libpoppler_cpp_la-PNMWriter.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     $(AM_V_CXX)source='PNMWriter.cc' object='libpoppler_cpp_la-PNMWriter.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpoppler_cpp_la_CXXFLAGS) $(CXXFLAGS) -c -o libpoppler_cpp_la-PNMWriter.lo `test -f 'PNMWriter.cc' || echo '$(srcdir)/'`PNMWriter.cc
+
+libpoppler_cpp_la-poppler-document.lo: poppler-document.cpp
+@am__fastdepCXX_TRUE@  $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpoppler_cpp_la_CXXFLAGS) $(CXXFLAGS) -MT libpoppler_cpp_la-poppler-document.lo -MD -MP -MF $(DEPDIR)/libpoppler_cpp_la-poppler-document.Tpo -c -o libpoppler_cpp_la-poppler-document.lo `test -f 'poppler-document.cpp' || echo '$(srcdir)/'`poppler-document.cpp
+@am__fastdepCXX_TRUE@  $(AM_V_at)$(am__mv) $(DEPDIR)/libpoppler_cpp_la-poppler-document.Tpo $(DEPDIR)/libpoppler_cpp_la-poppler-document.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     $(AM_V_CXX)source='poppler-document.cpp' object='libpoppler_cpp_la-poppler-document.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpoppler_cpp_la_CXXFLAGS) $(CXXFLAGS) -c -o libpoppler_cpp_la-poppler-document.lo `test -f 'poppler-document.cpp' || echo '$(srcdir)/'`poppler-document.cpp
+
+libpoppler_cpp_la-poppler-embedded-file.lo: poppler-embedded-file.cpp
+@am__fastdepCXX_TRUE@  $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpoppler_cpp_la_CXXFLAGS) $(CXXFLAGS) -MT libpoppler_cpp_la-poppler-embedded-file.lo -MD -MP -MF $(DEPDIR)/libpoppler_cpp_la-poppler-embedded-file.Tpo -c -o libpoppler_cpp_la-poppler-embedded-file.lo `test -f 'poppler-embedded-file.cpp' || echo '$(srcdir)/'`poppler-embedded-file.cpp
+@am__fastdepCXX_TRUE@  $(AM_V_at)$(am__mv) $(DEPDIR)/libpoppler_cpp_la-poppler-embedded-file.Tpo $(DEPDIR)/libpoppler_cpp_la-poppler-embedded-file.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     $(AM_V_CXX)source='poppler-embedded-file.cpp' object='libpoppler_cpp_la-poppler-embedded-file.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpoppler_cpp_la_CXXFLAGS) $(CXXFLAGS) -c -o libpoppler_cpp_la-poppler-embedded-file.lo `test -f 'poppler-embedded-file.cpp' || echo '$(srcdir)/'`poppler-embedded-file.cpp
+
+libpoppler_cpp_la-poppler-font.lo: poppler-font.cpp
+@am__fastdepCXX_TRUE@  $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpoppler_cpp_la_CXXFLAGS) $(CXXFLAGS) -MT libpoppler_cpp_la-poppler-font.lo -MD -MP -MF $(DEPDIR)/libpoppler_cpp_la-poppler-font.Tpo -c -o libpoppler_cpp_la-poppler-font.lo `test -f 'poppler-font.cpp' || echo '$(srcdir)/'`poppler-font.cpp
+@am__fastdepCXX_TRUE@  $(AM_V_at)$(am__mv) $(DEPDIR)/libpoppler_cpp_la-poppler-font.Tpo $(DEPDIR)/libpoppler_cpp_la-poppler-font.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     $(AM_V_CXX)source='poppler-font.cpp' object='libpoppler_cpp_la-poppler-font.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpoppler_cpp_la_CXXFLAGS) $(CXXFLAGS) -c -o libpoppler_cpp_la-poppler-font.lo `test -f 'poppler-font.cpp' || echo '$(srcdir)/'`poppler-font.cpp
+
+libpoppler_cpp_la-poppler-global.lo: poppler-global.cpp
+@am__fastdepCXX_TRUE@  $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpoppler_cpp_la_CXXFLAGS) $(CXXFLAGS) -MT libpoppler_cpp_la-poppler-global.lo -MD -MP -MF $(DEPDIR)/libpoppler_cpp_la-poppler-global.Tpo -c -o libpoppler_cpp_la-poppler-global.lo `test -f 'poppler-global.cpp' || echo '$(srcdir)/'`poppler-global.cpp
+@am__fastdepCXX_TRUE@  $(AM_V_at)$(am__mv) $(DEPDIR)/libpoppler_cpp_la-poppler-global.Tpo $(DEPDIR)/libpoppler_cpp_la-poppler-global.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     $(AM_V_CXX)source='poppler-global.cpp' object='libpoppler_cpp_la-poppler-global.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpoppler_cpp_la_CXXFLAGS) $(CXXFLAGS) -c -o libpoppler_cpp_la-poppler-global.lo `test -f 'poppler-global.cpp' || echo '$(srcdir)/'`poppler-global.cpp
+
+libpoppler_cpp_la-poppler-image.lo: poppler-image.cpp
+@am__fastdepCXX_TRUE@  $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpoppler_cpp_la_CXXFLAGS) $(CXXFLAGS) -MT libpoppler_cpp_la-poppler-image.lo -MD -MP -MF $(DEPDIR)/libpoppler_cpp_la-poppler-image.Tpo -c -o libpoppler_cpp_la-poppler-image.lo `test -f 'poppler-image.cpp' || echo '$(srcdir)/'`poppler-image.cpp
+@am__fastdepCXX_TRUE@  $(AM_V_at)$(am__mv) $(DEPDIR)/libpoppler_cpp_la-poppler-image.Tpo $(DEPDIR)/libpoppler_cpp_la-poppler-image.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     $(AM_V_CXX)source='poppler-image.cpp' object='libpoppler_cpp_la-poppler-image.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpoppler_cpp_la_CXXFLAGS) $(CXXFLAGS) -c -o libpoppler_cpp_la-poppler-image.lo `test -f 'poppler-image.cpp' || echo '$(srcdir)/'`poppler-image.cpp
+
+libpoppler_cpp_la-poppler-page.lo: poppler-page.cpp
+@am__fastdepCXX_TRUE@  $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpoppler_cpp_la_CXXFLAGS) $(CXXFLAGS) -MT libpoppler_cpp_la-poppler-page.lo -MD -MP -MF $(DEPDIR)/libpoppler_cpp_la-poppler-page.Tpo -c -o libpoppler_cpp_la-poppler-page.lo `test -f 'poppler-page.cpp' || echo '$(srcdir)/'`poppler-page.cpp
+@am__fastdepCXX_TRUE@  $(AM_V_at)$(am__mv) $(DEPDIR)/libpoppler_cpp_la-poppler-page.Tpo $(DEPDIR)/libpoppler_cpp_la-poppler-page.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     $(AM_V_CXX)source='poppler-page.cpp' object='libpoppler_cpp_la-poppler-page.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpoppler_cpp_la_CXXFLAGS) $(CXXFLAGS) -c -o libpoppler_cpp_la-poppler-page.lo `test -f 'poppler-page.cpp' || echo '$(srcdir)/'`poppler-page.cpp
+
+libpoppler_cpp_la-poppler-page-renderer.lo: poppler-page-renderer.cpp
+@am__fastdepCXX_TRUE@  $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpoppler_cpp_la_CXXFLAGS) $(CXXFLAGS) -MT libpoppler_cpp_la-poppler-page-renderer.lo -MD -MP -MF $(DEPDIR)/libpoppler_cpp_la-poppler-page-renderer.Tpo -c -o libpoppler_cpp_la-poppler-page-renderer.lo `test -f 'poppler-page-renderer.cpp' || echo '$(srcdir)/'`poppler-page-renderer.cpp
+@am__fastdepCXX_TRUE@  $(AM_V_at)$(am__mv) $(DEPDIR)/libpoppler_cpp_la-poppler-page-renderer.Tpo $(DEPDIR)/libpoppler_cpp_la-poppler-page-renderer.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     $(AM_V_CXX)source='poppler-page-renderer.cpp' object='libpoppler_cpp_la-poppler-page-renderer.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpoppler_cpp_la_CXXFLAGS) $(CXXFLAGS) -c -o libpoppler_cpp_la-poppler-page-renderer.lo `test -f 'poppler-page-renderer.cpp' || echo '$(srcdir)/'`poppler-page-renderer.cpp
+
+libpoppler_cpp_la-poppler-page-transition.lo: poppler-page-transition.cpp
+@am__fastdepCXX_TRUE@  $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpoppler_cpp_la_CXXFLAGS) $(CXXFLAGS) -MT libpoppler_cpp_la-poppler-page-transition.lo -MD -MP -MF $(DEPDIR)/libpoppler_cpp_la-poppler-page-transition.Tpo -c -o libpoppler_cpp_la-poppler-page-transition.lo `test -f 'poppler-page-transition.cpp' || echo '$(srcdir)/'`poppler-page-transition.cpp
+@am__fastdepCXX_TRUE@  $(AM_V_at)$(am__mv) $(DEPDIR)/libpoppler_cpp_la-poppler-page-transition.Tpo $(DEPDIR)/libpoppler_cpp_la-poppler-page-transition.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     $(AM_V_CXX)source='poppler-page-transition.cpp' object='libpoppler_cpp_la-poppler-page-transition.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpoppler_cpp_la_CXXFLAGS) $(CXXFLAGS) -c -o libpoppler_cpp_la-poppler-page-transition.lo `test -f 'poppler-page-transition.cpp' || echo '$(srcdir)/'`poppler-page-transition.cpp
+
+libpoppler_cpp_la-poppler-private.lo: poppler-private.cpp
+@am__fastdepCXX_TRUE@  $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpoppler_cpp_la_CXXFLAGS) $(CXXFLAGS) -MT libpoppler_cpp_la-poppler-private.lo -MD -MP -MF $(DEPDIR)/libpoppler_cpp_la-poppler-private.Tpo -c -o libpoppler_cpp_la-poppler-private.lo `test -f 'poppler-private.cpp' || echo '$(srcdir)/'`poppler-private.cpp
+@am__fastdepCXX_TRUE@  $(AM_V_at)$(am__mv) $(DEPDIR)/libpoppler_cpp_la-poppler-private.Tpo $(DEPDIR)/libpoppler_cpp_la-poppler-private.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     $(AM_V_CXX)source='poppler-private.cpp' object='libpoppler_cpp_la-poppler-private.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpoppler_cpp_la_CXXFLAGS) $(CXXFLAGS) -c -o libpoppler_cpp_la-poppler-private.lo `test -f 'poppler-private.cpp' || echo '$(srcdir)/'`poppler-private.cpp
+
+libpoppler_cpp_la-poppler-rectangle.lo: poppler-rectangle.cpp
+@am__fastdepCXX_TRUE@  $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpoppler_cpp_la_CXXFLAGS) $(CXXFLAGS) -MT libpoppler_cpp_la-poppler-rectangle.lo -MD -MP -MF $(DEPDIR)/libpoppler_cpp_la-poppler-rectangle.Tpo -c -o libpoppler_cpp_la-poppler-rectangle.lo `test -f 'poppler-rectangle.cpp' || echo '$(srcdir)/'`poppler-rectangle.cpp
+@am__fastdepCXX_TRUE@  $(AM_V_at)$(am__mv) $(DEPDIR)/libpoppler_cpp_la-poppler-rectangle.Tpo $(DEPDIR)/libpoppler_cpp_la-poppler-rectangle.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     $(AM_V_CXX)source='poppler-rectangle.cpp' object='libpoppler_cpp_la-poppler-rectangle.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpoppler_cpp_la_CXXFLAGS) $(CXXFLAGS) -c -o libpoppler_cpp_la-poppler-rectangle.lo `test -f 'poppler-rectangle.cpp' || echo '$(srcdir)/'`poppler-rectangle.cpp
+
+libpoppler_cpp_la-poppler-toc.lo: poppler-toc.cpp
+@am__fastdepCXX_TRUE@  $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpoppler_cpp_la_CXXFLAGS) $(CXXFLAGS) -MT libpoppler_cpp_la-poppler-toc.lo -MD -MP -MF $(DEPDIR)/libpoppler_cpp_la-poppler-toc.Tpo -c -o libpoppler_cpp_la-poppler-toc.lo `test -f 'poppler-toc.cpp' || echo '$(srcdir)/'`poppler-toc.cpp
+@am__fastdepCXX_TRUE@  $(AM_V_at)$(am__mv) $(DEPDIR)/libpoppler_cpp_la-poppler-toc.Tpo $(DEPDIR)/libpoppler_cpp_la-poppler-toc.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     $(AM_V_CXX)source='poppler-toc.cpp' object='libpoppler_cpp_la-poppler-toc.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpoppler_cpp_la_CXXFLAGS) $(CXXFLAGS) -c -o libpoppler_cpp_la-poppler-toc.lo `test -f 'poppler-toc.cpp' || echo '$(srcdir)/'`poppler-toc.cpp
+
+libpoppler_cpp_la-poppler-version.lo: poppler-version.cpp
+@am__fastdepCXX_TRUE@  $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpoppler_cpp_la_CXXFLAGS) $(CXXFLAGS) -MT libpoppler_cpp_la-poppler-version.lo -MD -MP -MF $(DEPDIR)/libpoppler_cpp_la-poppler-version.Tpo -c -o libpoppler_cpp_la-poppler-version.lo `test -f 'poppler-version.cpp' || echo '$(srcdir)/'`poppler-version.cpp
+@am__fastdepCXX_TRUE@  $(AM_V_at)$(am__mv) $(DEPDIR)/libpoppler_cpp_la-poppler-version.Tpo $(DEPDIR)/libpoppler_cpp_la-poppler-version.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     $(AM_V_CXX)source='poppler-version.cpp' object='libpoppler_cpp_la-poppler-version.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpoppler_cpp_la_CXXFLAGS) $(CXXFLAGS) -c -o libpoppler_cpp_la-poppler-version.lo `test -f 'poppler-version.cpp' || echo '$(srcdir)/'`poppler-version.cpp
+
+.cpp.o:
+@am__fastdepCXX_TRUE@  $(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
+@am__fastdepCXX_TRUE@  $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ $<
+
+.cpp.obj:
+@am__fastdepCXX_TRUE@  $(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'`
+@am__fastdepCXX_TRUE@  $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
+
+.cpp.lo:
+@am__fastdepCXX_TRUE@  $(AM_V_CXX)$(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
+@am__fastdepCXX_TRUE@  $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     $(AM_V_CXX)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LTCXXCOMPILE) -c -o $@ $<
+
+mostlyclean-libtool:
+       -rm -f *.lo
+
+clean-libtool:
+       -rm -rf .libs _libs
+install-poppler_includeHEADERS: $(poppler_include_HEADERS)
+       @$(NORMAL_INSTALL)
+       @list='$(poppler_include_HEADERS)'; test -n "$(poppler_includedir)" || list=; \
+       if test -n "$$list"; then \
+         echo " $(MKDIR_P) '$(DESTDIR)$(poppler_includedir)'"; \
+         $(MKDIR_P) "$(DESTDIR)$(poppler_includedir)" || exit 1; \
+       fi; \
+       for p in $$list; do \
+         if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+         echo "$$d$$p"; \
+       done | $(am__base_list) | \
+       while read files; do \
+         echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(poppler_includedir)'"; \
+         $(INSTALL_HEADER) $$files "$(DESTDIR)$(poppler_includedir)" || exit $$?; \
+       done
+
+uninstall-poppler_includeHEADERS:
+       @$(NORMAL_UNINSTALL)
+       @list='$(poppler_include_HEADERS)'; test -n "$(poppler_includedir)" || list=; \
+       files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
+       dir='$(DESTDIR)$(poppler_includedir)'; $(am__uninstall_files_from_dir)
+
+# This directory's subdirectories are mostly independent; you can cd
+# into them and run `make' without going through this Makefile.
+# To change the values of `make' variables: instead of editing Makefiles,
+# (1) if the variable is set in `config.status', edit `config.status'
+#     (which will cause the Makefiles to be regenerated when you run `make');
+# (2) otherwise, pass the desired values on the `make' command line.
+$(RECURSIVE_TARGETS):
+       @fail= failcom='exit 1'; \
+       for f in x $$MAKEFLAGS; do \
+         case $$f in \
+           *=* | --[!k]*);; \
+           *k*) failcom='fail=yes';; \
+         esac; \
+       done; \
+       dot_seen=no; \
+       target=`echo $@ | sed s/-recursive//`; \
+       list='$(SUBDIRS)'; for subdir in $$list; do \
+         echo "Making $$target in $$subdir"; \
+         if test "$$subdir" = "."; then \
+           dot_seen=yes; \
+           local_target="$$target-am"; \
+         else \
+           local_target="$$target"; \
+         fi; \
+         ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
+         || eval $$failcom; \
+       done; \
+       if test "$$dot_seen" = "no"; then \
+         $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \
+       fi; test -z "$$fail"
+
+$(RECURSIVE_CLEAN_TARGETS):
+       @fail= failcom='exit 1'; \
+       for f in x $$MAKEFLAGS; do \
+         case $$f in \
+           *=* | --[!k]*);; \
+           *k*) failcom='fail=yes';; \
+         esac; \
+       done; \
+       dot_seen=no; \
+       case "$@" in \
+         distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \
+         *) list='$(SUBDIRS)' ;; \
+       esac; \
+       rev=''; for subdir in $$list; do \
+         if test "$$subdir" = "."; then :; else \
+           rev="$$subdir $$rev"; \
+         fi; \
+       done; \
+       rev="$$rev ."; \
+       target=`echo $@ | sed s/-recursive//`; \
+       for subdir in $$rev; do \
+         echo "Making $$target in $$subdir"; \
+         if test "$$subdir" = "."; then \
+           local_target="$$target-am"; \
+         else \
+           local_target="$$target"; \
+         fi; \
+         ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
+         || eval $$failcom; \
+       done && test -z "$$fail"
+tags-recursive:
+       list='$(SUBDIRS)'; for subdir in $$list; do \
+         test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \
+       done
+ctags-recursive:
+       list='$(SUBDIRS)'; for subdir in $$list; do \
+         test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \
+       done
+
+ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
+       list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+       unique=`for i in $$list; do \
+           if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+         done | \
+         $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
+             END { if (nonempty) { for (i in files) print i; }; }'`; \
+       mkid -fID $$unique
+tags: TAGS
+
+TAGS: tags-recursive $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
+               $(TAGS_FILES) $(LISP)
+       set x; \
+       here=`pwd`; \
+       if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \
+         include_option=--etags-include; \
+         empty_fix=.; \
+       else \
+         include_option=--include; \
+         empty_fix=; \
+       fi; \
+       list='$(SUBDIRS)'; for subdir in $$list; do \
+         if test "$$subdir" = .; then :; else \
+           test ! -f $$subdir/TAGS || \
+             set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \
+         fi; \
+       done; \
+       list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
+       unique=`for i in $$list; do \
+           if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+         done | \
+         $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
+             END { if (nonempty) { for (i in files) print i; }; }'`; \
+       shift; \
+       if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
+         test -n "$$unique" || unique=$$empty_fix; \
+         if test $$# -gt 0; then \
+           $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+             "$$@" $$unique; \
+         else \
+           $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+             $$unique; \
+         fi; \
+       fi
+ctags: CTAGS
+CTAGS: ctags-recursive $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
+               $(TAGS_FILES) $(LISP)
+       list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
+       unique=`for i in $$list; do \
+           if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+         done | \
+         $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
+             END { if (nonempty) { for (i in files) print i; }; }'`; \
+       test -z "$(CTAGS_ARGS)$$unique" \
+         || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+            $$unique
+
+GTAGS:
+       here=`$(am__cd) $(top_builddir) && pwd` \
+         && $(am__cd) $(top_srcdir) \
+         && gtags -i $(GTAGS_ARGS) "$$here"
+
+distclean-tags:
+       -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+
+distdir: $(DISTFILES)
+       @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+       topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+       list='$(DISTFILES)'; \
+         dist_files=`for file in $$list; do echo $$file; done | \
+         sed -e "s|^$$srcdirstrip/||;t" \
+             -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+       case $$dist_files in \
+         */*) $(MKDIR_P) `echo "$$dist_files" | \
+                          sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+                          sort -u` ;; \
+       esac; \
+       for file in $$dist_files; do \
+         if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+         if test -d $$d/$$file; then \
+           dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+           if test -d "$(distdir)/$$file"; then \
+             find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+           fi; \
+           if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+             cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
+             find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+           fi; \
+           cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
+         else \
+           test -f "$(distdir)/$$file" \
+           || cp -p $$d/$$file "$(distdir)/$$file" \
+           || exit 1; \
+         fi; \
+       done
+       @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \
+         if test "$$subdir" = .; then :; else \
+           $(am__make_dryrun) \
+             || test -d "$(distdir)/$$subdir" \
+             || $(MKDIR_P) "$(distdir)/$$subdir" \
+             || exit 1; \
+           dir1=$$subdir; dir2="$(distdir)/$$subdir"; \
+           $(am__relativize); \
+           new_distdir=$$reldir; \
+           dir1=$$subdir; dir2="$(top_distdir)"; \
+           $(am__relativize); \
+           new_top_distdir=$$reldir; \
+           echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \
+           echo "     am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \
+           ($(am__cd) $$subdir && \
+             $(MAKE) $(AM_MAKEFLAGS) \
+               top_distdir="$$new_top_distdir" \
+               distdir="$$new_distdir" \
+               am__remove_distdir=: \
+               am__skip_length_check=: \
+               am__skip_mode_fix=: \
+               distdir) \
+             || exit 1; \
+         fi; \
+       done
+check-am: all-am
+check: check-recursive
+all-am: Makefile $(LTLIBRARIES) $(HEADERS)
+installdirs: installdirs-recursive
+installdirs-am:
+       for dir in "$(DESTDIR)$(libdir)" "$(DESTDIR)$(poppler_includedir)"; do \
+         test -z "$$dir" || $(MKDIR_P) "$$dir"; \
+       done
+install: install-recursive
+install-exec: install-exec-recursive
+install-data: install-data-recursive
+uninstall: uninstall-recursive
+
+install-am: all-am
+       @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-recursive
+install-strip:
+       if test -z '$(STRIP)'; then \
+         $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+           install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+             install; \
+       else \
+         $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+           install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+           "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
+       fi
+mostlyclean-generic:
+
+clean-generic:
+
+distclean-generic:
+       -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+       -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
+
+maintainer-clean-generic:
+       @echo "This command is intended for maintainers to use"
+       @echo "it deletes files that may require special tools to rebuild."
+clean: clean-recursive
+
+clean-am: clean-generic clean-libLTLIBRARIES clean-libtool \
+       mostlyclean-am
+
+distclean: distclean-recursive
+       -rm -rf ./$(DEPDIR)
+       -rm -f Makefile
+distclean-am: clean-am distclean-compile distclean-generic \
+       distclean-tags
+
+dvi: dvi-recursive
+
+dvi-am:
+
+html: html-recursive
+
+html-am:
+
+info: info-recursive
+
+info-am:
+
+install-data-am: install-poppler_includeHEADERS
+
+install-dvi: install-dvi-recursive
+
+install-dvi-am:
+
+install-exec-am: install-libLTLIBRARIES
+
+install-html: install-html-recursive
+
+install-html-am:
+
+install-info: install-info-recursive
+
+install-info-am:
+
+install-man:
+
+install-pdf: install-pdf-recursive
+
+install-pdf-am:
+
+install-ps: install-ps-recursive
+
+install-ps-am:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-recursive
+       -rm -rf ./$(DEPDIR)
+       -rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-recursive
+
+mostlyclean-am: mostlyclean-compile mostlyclean-generic \
+       mostlyclean-libtool
+
+pdf: pdf-recursive
+
+pdf-am:
+
+ps: ps-recursive
+
+ps-am:
+
+uninstall-am: uninstall-libLTLIBRARIES \
+       uninstall-poppler_includeHEADERS
+
+.MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) ctags-recursive \
+       install-am install-strip tags-recursive
+
+.PHONY: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) CTAGS GTAGS \
+       all all-am check check-am clean clean-generic \
+       clean-libLTLIBRARIES clean-libtool ctags ctags-recursive \
+       distclean distclean-compile distclean-generic \
+       distclean-libtool distclean-tags distdir dvi dvi-am html \
+       html-am info info-am install install-am install-data \
+       install-data-am install-dvi install-dvi-am install-exec \
+       install-exec-am install-html install-html-am install-info \
+       install-info-am install-libLTLIBRARIES install-man install-pdf \
+       install-pdf-am install-poppler_includeHEADERS install-ps \
+       install-ps-am install-strip installcheck installcheck-am \
+       installdirs installdirs-am maintainer-clean \
+       maintainer-clean-generic mostlyclean mostlyclean-compile \
+       mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \
+       tags tags-recursive uninstall uninstall-am \
+       uninstall-libLTLIBRARIES uninstall-poppler_includeHEADERS
+
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/cpp/PNMWriter.cc b/cpp/PNMWriter.cc
new file mode 100644 (file)
index 0000000..a2b9a77
--- /dev/null
@@ -0,0 +1,119 @@
+//========================================================================
+//
+// PNMWriter.cc
+//
+// This file is licensed under the GPLv2 or later
+//
+// Copyright (C) 2011 Pino Toscano <pino@kde.org>
+//
+//========================================================================
+
+#include "PNMWriter.h"
+
+#include <vector>
+
+using namespace poppler;
+
+PNMWriter::PNMWriter(OutFormat formatArg)
+  : format(formatArg)
+  , file(0)
+  , imgWidth(0)
+  , rowSize(0)
+{
+}
+
+PNMWriter::~PNMWriter()
+{
+}
+
+bool PNMWriter::init(FILE *f, int width, int height, int /*hDPI*/, int /*vDPI*/)
+{
+  file = f;
+  imgWidth = width;
+
+  switch (format)
+  {
+    case PNMWriter::PBM:
+      fprintf(file, "P4\n%d %d\n", width, height);
+      rowSize = (width + 7) >> 3;
+      break;
+    case PNMWriter::PGM:
+      fprintf(file, "P5\n%d %d\n255\n", width, height);
+      rowSize = width;
+      break;
+    case PNMWriter::PPM:
+      fprintf(file, "P6\n%d %d\n255\n", width, height);
+      rowSize = width * 3;
+      break;
+  }
+
+  return true;
+}
+
+bool PNMWriter::writePointers(unsigned char **rowPointers, int rowCount)
+{
+  bool ret = true;
+  for (int i = 0; ret && (i < rowCount); ++i) {
+    ret = writeRow(&(rowPointers[i]));
+  }
+
+  return ret;
+}
+
+bool PNMWriter::writeRow(unsigned char **row)
+{
+  std::vector<unsigned char> newRow;
+  unsigned char *rowPtr = *row;
+  unsigned char *p = *row;
+
+  switch (format)
+  {
+    case PNMWriter::PBM:
+      newRow.resize(rowSize, 0);
+      rowPtr = &newRow[0];
+      for (int i = 0; i < imgWidth; ++i) {
+        unsigned char pixel = p[0];
+        if (p[0] == p[1] && p[1] == p[2]) {
+          // gray, stored already
+        } else {
+          pixel = static_cast<unsigned char>((p[0] * 11 + p[1] * 16 + p[2] * 5) / 32);
+        }
+        if (pixel < 0x7F) {
+          *(rowPtr + (i >> 3)) |= (1 << (i & 7));
+        }
+        p += 3;
+      }
+      break;
+    case PNMWriter::PGM:
+      newRow.resize(rowSize, 0);
+      rowPtr = &newRow[0];
+      for (int i = 0; i < imgWidth; ++i) {
+        if (p[0] == p[1] && p[1] == p[2]) {
+          // gray, store directly
+          newRow[i] = p[0];
+        } else {
+          // calculate the gray value
+          newRow[i] = static_cast<unsigned char>((p[0] * 11 + p[1] * 16 + p[2] * 5) / 32);
+        }
+        p += 3;
+      }
+      break;
+    case PNMWriter::PPM:
+      break;
+  }
+
+  if (int(fwrite(rowPtr, 1, rowSize, file)) < rowSize) {
+    return false;
+  }
+
+  return true;
+}
+
+bool PNMWriter::close()
+{
+  file = 0;
+  imgWidth = 0;
+  rowSize = 0;
+
+  return true;
+}
diff --git a/cpp/PNMWriter.h b/cpp/PNMWriter.h
new file mode 100644 (file)
index 0000000..8d8da2d
--- /dev/null
@@ -0,0 +1,43 @@
+//========================================================================
+//
+// PNMWriter.h
+//
+// This file is licensed under the GPLv2 or later
+//
+// Copyright (C) 2011 Pino Toscano <pino@kde.org>
+//
+//========================================================================
+
+#ifndef PNMWRITER_H
+#define PNMWRITER_H
+
+#include "ImgWriter.h"
+
+namespace poppler
+{
+
+class PNMWriter : public ImgWriter
+{
+  public:
+    enum OutFormat { PBM, PGM, PPM };
+
+    PNMWriter(OutFormat formatArg);
+    ~PNMWriter();
+
+    bool init(FILE *f, int width, int height, int hDPI, int vDPI);
+
+    bool writePointers(unsigned char **rowPointers, int rowCount);
+    bool writeRow(unsigned char **row);
+
+    bool close();
+
+  private:
+    const OutFormat format;
+    FILE *file;
+    int imgWidth;
+    int rowSize;
+};
+
+}
+
+#endif
diff --git a/cpp/poppler-document-private.h b/cpp/poppler-document-private.h
new file mode 100644 (file)
index 0000000..5ca9e14
--- /dev/null
@@ -0,0 +1,70 @@
+/*
+ * Copyright (C) 2009-2011, Pino Toscano <pino@kde.org>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#ifndef POPPLER_DOCUMENT_PRIVATE_H
+#define POPPLER_DOCUMENT_PRIVATE_H
+
+#include "poppler-global.h"
+
+#include "poppler-config.h"
+#include "GooString.h"
+#include "PDFDoc.h"
+
+#include <vector>
+
+namespace poppler
+{
+
+class document;
+class embedded_file;
+
+class initer
+{
+public:
+    initer();
+    ~initer();
+
+private:
+    static unsigned int count;
+};
+
+class document_private : private initer
+{
+public:
+    document_private(GooString *file_path, const std::string &owner_password,
+                     const std::string &user_password);
+    document_private(byte_array *file_data, const std::string &owner_password,
+                     const std::string &user_password);
+    document_private(const char *file_data, int file_data_length,
+                     const std::string &owner_password,
+                     const std::string &user_password);
+    ~document_private();
+
+    static document* check_document(document_private *doc, byte_array *file_data);
+
+    PDFDoc *doc;
+    byte_array doc_data;
+    const char *raw_doc_data;
+    int raw_doc_data_length;
+    bool is_locked;
+    std::vector<embedded_file *> embedded_files;
+};
+
+}
+
+#endif
diff --git a/cpp/poppler-document.cpp b/cpp/poppler-document.cpp
new file mode 100644 (file)
index 0000000..1c24b47
--- /dev/null
@@ -0,0 +1,664 @@
+/*
+ * Copyright (C) 2009-2011, Pino Toscano <pino@kde.org>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include "poppler-document.h"
+#include "poppler-embedded-file.h"
+#include "poppler-page.h"
+#include "poppler-toc.h"
+
+#include "poppler-document-private.h"
+#include "poppler-embedded-file-private.h"
+#include "poppler-private.h"
+#include "poppler-toc-private.h"
+
+#include "Catalog.h"
+#include "ErrorCodes.h"
+#include "GlobalParams.h"
+#include "Outline.h"
+
+#include <algorithm>
+#include <iterator>
+#include <memory>
+
+using namespace poppler;
+
+unsigned int poppler::initer::count = 0U;
+
+initer::initer()
+{
+    if (!count) {
+        globalParams = new GlobalParams();
+        setErrorCallback(detail::error_function, NULL);
+    }
+    count++;
+}
+
+initer::~initer()
+{
+    if (count > 0) {
+        --count;
+        if (!count) {
+            delete globalParams;
+            globalParams = 0;
+        }
+    }
+}
+
+
+document_private::document_private(GooString *file_path, const std::string &owner_password,
+                                   const std::string &user_password)
+    : initer()
+    , doc(0)
+    , raw_doc_data(0)
+    , raw_doc_data_length(0)
+    , is_locked(false)
+{
+    GooString goo_owner_password(owner_password.c_str());
+    GooString goo_user_password(user_password.c_str());
+    doc = new PDFDoc(file_path, &goo_owner_password, &goo_user_password);
+}
+
+document_private::document_private(byte_array *file_data,
+                                   const std::string &owner_password,
+                                   const std::string &user_password)
+    : initer()
+    , doc(0)
+    , raw_doc_data(0)
+    , raw_doc_data_length(0)
+    , is_locked(false)
+{
+    Object obj;
+    obj.initNull();
+    file_data->swap(doc_data);
+    MemStream *memstr = new MemStream(&doc_data[0], 0, doc_data.size(), &obj);
+    GooString goo_owner_password(owner_password.c_str());
+    GooString goo_user_password(user_password.c_str());
+    doc = new PDFDoc(memstr, &goo_owner_password, &goo_user_password);
+}
+
+document_private::document_private(const char *file_data, int file_data_length,
+                                   const std::string &owner_password,
+                                   const std::string &user_password)
+    : initer()
+    , doc(0)
+    , raw_doc_data(file_data)
+    , raw_doc_data_length(file_data_length)
+    , is_locked(false)
+{
+    Object obj;
+    obj.initNull();
+    MemStream *memstr = new MemStream(const_cast<char *>(raw_doc_data), 0, raw_doc_data_length, &obj);
+    GooString goo_owner_password(owner_password.c_str());
+    GooString goo_user_password(user_password.c_str());
+    doc = new PDFDoc(memstr, &goo_owner_password, &goo_user_password);
+}
+
+document_private::~document_private()
+{
+    delete_all(embedded_files);
+
+    delete doc;
+}
+
+document* document_private::check_document(document_private *doc, byte_array *file_data)
+{
+    if (doc->doc->isOk() || doc->doc->getErrorCode() == errEncrypted) {
+        if (doc->doc->getErrorCode() == errEncrypted) {
+            doc->is_locked = true;
+        }
+        return new document(*doc);
+    } else {
+        // put back the document data where it was before
+        if (file_data) {
+            file_data->swap(doc->doc_data);
+        }
+        delete doc;
+    }
+    return 0;
+}
+
+/**
+ \class poppler::document poppler-document.h "poppler/cpp/poppler-document.h"
+
+ Represents a PDF %document.
+ */
+
+/**
+ \enum poppler::document::page_mode_enum
+
+ The various page modes available in a PDF %document.
+*/
+/**
+ \var poppler::document::page_mode_enum poppler::document::use_none
+
+ The %document specifies no particular page mode.
+*/
+/**
+ \var poppler::document::page_mode_enum poppler::document::use_outlines
+
+ The %document specifies its TOC (table of contents) should be open.
+*/
+/**
+ \var poppler::document::page_mode_enum poppler::document::use_thumbs
+
+ The %document specifies that should be open a view of the thumbnails of its
+ pages.
+*/
+/**
+ \var poppler::document::page_mode_enum poppler::document::fullscreen
+
+ The %document specifies it wants to be open in a fullscreen mode.
+*/
+/**
+ \var poppler::document::page_mode_enum poppler::document::use_oc
+
+ The %document specifies that should be open a view of its Optional Content
+ (also known as layers).
+*/
+/**
+ \var poppler::document::page_mode_enum poppler::document::use_attach
+
+ The %document specifies that should be open a view of its %document-level
+ attachments.
+ */
+
+
+document::document(document_private &dd)
+    : d(&dd)
+{
+}
+
+document::~document()
+{
+    delete d;
+}
+
+/**
+ \returns whether the current %document is locked
+ */
+bool document::is_locked() const
+{
+    return d->is_locked;
+}
+
+/**
+ Unlocks the current doocument, if locked.
+
+ \returns the new locking status of the document
+ */
+bool document::unlock(const std::string &owner_password, const std::string &user_password)
+{
+    if (d->is_locked) {
+        document_private *newdoc = 0;
+        if (d->doc_data.size() > 0) {
+            newdoc = new document_private(&d->doc_data,
+                                          owner_password, user_password);
+        } else if (d->raw_doc_data) {
+            newdoc = new document_private(d->raw_doc_data, d->raw_doc_data_length,
+                                          owner_password, user_password);
+        } else {
+            newdoc = new document_private(new GooString(d->doc->getFileName()),
+                                          owner_password, user_password);
+        }
+        if (!newdoc->doc->isOk()) {
+            d->doc_data.swap(newdoc->doc_data);
+            delete newdoc;
+        } else {
+            delete d;
+            d = newdoc;
+            d->is_locked = false;
+        }
+    }
+    return d->is_locked;
+}
+
+/**
+ \returns the eventual page mode specified by the current PDF %document
+ */
+document::page_mode_enum document::page_mode() const
+{
+    switch (d->doc->getCatalog()->getPageMode()) {
+    case Catalog::pageModeNone:
+        return use_none;
+    case Catalog::pageModeOutlines:
+        return use_outlines;
+    case Catalog::pageModeThumbs:
+        return use_thumbs;
+    case Catalog::pageModeFullScreen:
+        return fullscreen;
+    case Catalog::pageModeOC:
+        return use_oc;
+    case Catalog::pageModeAttach:
+        return use_attach;
+    default:
+        return use_none;
+    }
+}
+
+/**
+ \returns the eventual page layout specified by the current PDF %document
+ */
+document::page_layout_enum document::page_layout() const
+{
+    switch (d->doc->getCatalog()->getPageLayout()) {
+    case Catalog::pageLayoutNone:
+        return no_layout;
+    case Catalog::pageLayoutSinglePage:
+        return single_page;
+    case Catalog::pageLayoutOneColumn:
+        return one_column;
+    case Catalog::pageLayoutTwoColumnLeft:
+        return two_column_left;
+    case Catalog::pageLayoutTwoColumnRight:
+        return two_column_right;
+    case Catalog::pageLayoutTwoPageLeft:
+        return two_page_left;
+    case Catalog::pageLayoutTwoPageRight:
+        return two_page_right;
+    default:
+        return no_layout;
+    }
+}
+
+/**
+ Gets the version of the current PDF %document.
+
+ Example:
+ \code
+ poppler::document *doc = ...;
+ // for example, if the document is PDF 1.6:
+ int major = 0, minor = 0;
+ doc->get_pdf_version(&major, &minor);
+ // major == 1
+ // minor == 6
+ \endcode
+
+ \param major if not NULL, will be set to the "major" number of the version
+ \param minor if not NULL, will be set to the "minor" number of the version
+ */
+void document::get_pdf_version(int *major, int *minor) const
+{
+    if (major) {
+        *major = d->doc->getPDFMajorVersion();
+    }
+    if (minor) {
+        *minor = d->doc->getPDFMinorVersion();
+    }
+}
+
+/**
+ \returns all the information keys available in the %document
+ \see info_key, info_date
+ */
+std::vector<std::string> document::info_keys() const
+{
+    if (d->is_locked) {
+        return std::vector<std::string>();
+    }
+
+    Object info;
+    if (!d->doc->getDocInfo(&info)->isDict()) {
+        info.free();
+        return std::vector<std::string>();
+    }
+
+    Dict *info_dict = info.getDict();
+    std::vector<std::string> keys(info_dict->getLength());
+    for (int i = 0; i < info_dict->getLength(); ++i) {
+        keys[i] = std::string(info_dict->getKey(i));
+    }
+
+    info.free();
+    return keys;
+}
+
+/**
+ Gets the value of the specified \p key of the document information.
+
+ \returns the value for the \p key, or an empty string if not available
+ \see info_keys, info_date
+ */
+ustring document::info_key(const std::string &key) const
+{
+    if (d->is_locked) {
+        return ustring();
+    }
+
+    Object info;
+    if (!d->doc->getDocInfo(&info)->isDict()) {
+        info.free();
+        return ustring();
+    }
+
+    Dict *info_dict = info.getDict();
+    Object obj;
+    ustring result;
+    if (info_dict->lookup(PSTR(key.c_str()), &obj)->isString()) {
+        result = detail::unicode_GooString_to_ustring(obj.getString());
+    }
+    obj.free();
+    info.free();
+    return result;
+}
+
+/**
+ Gets the time_t value value of the specified \p key of the document
+ information.
+
+ \returns the time_t value for the \p key
+ \see info_keys, info_date
+ */
+time_type document::info_date(const std::string &key) const
+{
+    if (d->is_locked) {
+        return time_type(-1);
+    }
+
+    Object info;
+    if (!d->doc->getDocInfo(&info)->isDict()) {
+        info.free();
+        return time_type(-1);
+    }
+
+    Dict *info_dict = info.getDict();
+    Object obj;
+    time_type result = time_type(-1);
+    if (info_dict->lookup(PSTR(key.c_str()), &obj)->isString()) {
+        result = detail::convert_date(obj.getString()->getCString());
+    }
+    obj.free();
+    info.free();
+    return result;
+}
+
+/**
+ \returns whether the document is encrypted
+ */
+bool document::is_encrypted() const
+{
+    return d->doc->isEncrypted();
+}
+
+/**
+ \returns whether the document is linearized
+ */
+bool document::is_linearized() const
+{
+    return d->doc->isLinearized();
+}
+
+/**
+ Check for available "document permission".
+
+ \returns whether the specified permission is allowed
+ */
+bool document::has_permission(permission_enum which) const
+{
+    switch (which) {
+    case perm_print:
+        return d->doc->okToPrint();
+    case perm_change:
+        return d->doc->okToChange();
+    case perm_copy:
+        return d->doc->okToCopy();
+    case perm_add_notes:
+        return d->doc->okToAddNotes();
+    case perm_fill_forms:
+        return d->doc->okToFillForm();
+    case perm_accessibility:
+        return d->doc->okToAccessibility();
+    case perm_assemble:
+        return d->doc->okToAssemble();
+    case perm_print_high_resolution:
+        return d->doc->okToPrintHighRes();
+    }
+    return true;
+}
+
+/**
+ Reads the %document metadata string.
+
+ \return the %document metadata string
+ */
+ustring document::metadata() const
+{
+    std::auto_ptr<GooString> md(d->doc->getCatalog()->readMetadata());
+    if (md.get()) {
+        return detail::unicode_GooString_to_ustring(md.get());
+    }
+    return ustring();
+}
+
+/**
+ Gets the IDs of the current PDF %document, if available.
+
+ \param permanent_id if not NULL, will be set to the permanent ID of the %document
+ \param update_id if not NULL, will be set to the update ID of the %document
+
+ \returns whether the document has the IDs
+
+ \since 0.16
+ */
+bool document::get_pdf_id(std::string *permanent_id, std::string *update_id) const
+{
+    GooString goo_permanent_id;
+    GooString goo_update_id;
+
+    if (!d->doc->getID(permanent_id ? &goo_permanent_id : 0, update_id ? &goo_update_id : 0)) {
+        return false;
+    }
+
+    if (permanent_id) {
+        *permanent_id = goo_permanent_id.getCString();
+    }
+    if (update_id) {
+        *update_id = goo_update_id.getCString();
+    }
+
+    return true;
+}
+
+/**
+ Document page count.
+
+ \returns the number of pages of the document
+ */
+int document::pages() const
+{
+    return d->doc->getNumPages();
+}
+
+/**
+ Document page by label reading.
+
+ This creates a new page representing the %document %page whose label is the
+ specified \p label. If there is no page with that \p label, NULL is returned.
+
+ \returns a new page object or NULL
+ */
+page* document::create_page(const ustring &label) const
+{
+    std::auto_ptr<GooString> goolabel(detail::ustring_to_unicode_GooString(label));
+    int index = 0;
+
+    if (!d->doc->getCatalog()->labelToIndex(goolabel.get(), &index)) {
+        return 0;
+    }
+    return create_page(index);
+}
+
+/**
+ Document page by index reading.
+
+ This creates a new page representing the \p index -th %page of the %document.
+ \note the page indexes are in the range [0, pages()[.
+
+ \returns a new page object or NULL
+ */
+page* document::create_page(int index) const
+{
+    return index >= 0 && index < d->doc->getNumPages() ? new page(d, index) : 0;
+}
+
+/**
+ Reads all the font information of the %document.
+
+ \note this can be slow for big documents; prefer the use of a font_iterator
+ to read incrementally page by page
+ \see create_font_iterator
+ */
+std::vector<font_info> document::fonts() const
+{
+    std::vector<font_info> result;
+    font_iterator it(0, d);
+    while (it.has_next()) {
+        const std::vector<font_info> l = it.next();
+        std::copy(l.begin(), l.end(), std::back_inserter(result));
+    }
+    return result;
+}
+
+/**
+ Creates a new font iterator.
+
+ This creates a new font iterator for reading the font information of the
+ %document page by page, starting at the specified \p start_page (0 if not
+ specified).
+
+ \returns a new font iterator
+ */
+font_iterator* document::create_font_iterator(int start_page) const
+{
+    return new font_iterator(start_page, d);
+}
+
+/**
+ Reads the TOC (table of contents) of the %document.
+
+ \returns a new toc object if a TOC is available, NULL otherwise
+ */
+toc* document::create_toc() const
+{
+    return toc_private::load_from_outline(d->doc->getOutline());
+}
+
+/**
+ Reads whether the current document has %document-level embedded files
+ (attachments).
+
+ This is a very fast way to know whether there are embedded files (also known
+ as "attachments") at the %document-level. Note this does not take into account
+ files embedded in other ways (e.g. to annotations).
+
+ \returns whether the document has embedded files
+ */
+bool document::has_embedded_files() const
+{
+    return d->doc->getCatalog()->numEmbeddedFiles() > 0;
+}
+
+/**
+ Reads all the %document-level embedded files of the %document.
+
+ \returns the %document-level embedded files
+ */
+std::vector<embedded_file *> document::embedded_files() const
+{
+    if (d->is_locked) {
+        return std::vector<embedded_file *>();
+    }
+
+    if (d->embedded_files.empty() && d->doc->getCatalog()->numEmbeddedFiles() > 0) {
+        const int num = d->doc->getCatalog()->numEmbeddedFiles();
+        d->embedded_files.resize(num);
+        for (int i = 0; i < num; ++i) {
+            FileSpec *fs = d->doc->getCatalog()->embeddedFile(i);
+            d->embedded_files[i] = embedded_file_private::create(fs);
+        }
+    }
+    return d->embedded_files;
+}
+
+/**
+ Tries to load a PDF %document from the specified file.
+
+ \param file_name the file to open
+ \returns a new document if the load succeeded (even if the document is locked),
+          NULL otherwise
+ */
+document* document::load_from_file(const std::string &file_name,
+                                   const std::string &owner_password,
+                                   const std::string &user_password)
+{
+    document_private *doc = new document_private(
+                                new GooString(file_name.c_str()),
+                                owner_password, user_password);
+    return document_private::check_document(doc, 0);
+}
+
+/**
+ Tries to load a PDF %document from the specified data.
+
+ \note if the loading succeeds, the document takes ownership of the
+       \p file_data (swap()ing it)
+
+ \param file_data the data representing a document to open
+ \returns a new document if the load succeeded (even if the document is locked),
+          NULL otherwise
+ */
+document* document::load_from_data(byte_array *file_data,
+                                   const std::string &owner_password,
+                                   const std::string &user_password)
+{
+    if (!file_data || file_data->size() < 10) {
+        return 0;
+    }
+
+    document_private *doc = new document_private(
+                                file_data, owner_password, user_password);
+    return document_private::check_document(doc, file_data);
+}
+
+/**
+ Tries to load a PDF %document from the specified data buffer.
+
+ \note the buffer must remain valid for the whole lifetime of the returned
+       document
+
+ \param file_data the data buffer representing a document to open
+ \param file_data_length the length of the data buffer
+
+ \returns a new document if the load succeeded (even if the document is locked),
+          NULL otherwise
+
+ \since 0.16
+ */
+document* document::load_from_raw_data(const char *file_data,
+                                       int file_data_length,
+                                       const std::string &owner_password,
+                                       const std::string &user_password)
+{
+    if (!file_data || file_data_length < 10) {
+        return 0;
+    }
+
+    document_private *doc = new document_private(
+                                file_data, file_data_length,
+                                owner_password, user_password);
+    return document_private::check_document(doc, 0);
+}
diff --git a/cpp/poppler-document.h b/cpp/poppler-document.h
new file mode 100644 (file)
index 0000000..dfae398
--- /dev/null
@@ -0,0 +1,104 @@
+/*
+ * Copyright (C) 2009-2010, Pino Toscano <pino@kde.org>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#ifndef POPPLER_DOCUMENT_H
+#define POPPLER_DOCUMENT_H
+
+#include "poppler-global.h"
+#include "poppler-font.h"
+
+namespace poppler
+{
+
+class document_private;
+class embedded_file;
+class page;
+class toc;
+
+class POPPLER_CPP_EXPORT document : public poppler::noncopyable
+{
+public:
+    enum page_mode_enum {
+        use_none,
+        use_outlines,
+        use_thumbs,
+        fullscreen,
+        use_oc,
+        use_attach
+    };
+
+    enum page_layout_enum {
+        no_layout,
+        single_page,
+        one_column,
+        two_column_left,
+        two_column_right,
+        two_page_left,
+        two_page_right
+    };
+
+    ~document();
+
+    bool is_locked() const;
+    bool unlock(const std::string &owner_password, const std::string &user_password);
+
+    page_mode_enum page_mode() const;
+    page_layout_enum page_layout() const;
+    void get_pdf_version(int *major, int *minor) const;
+    std::vector<std::string> info_keys() const;
+    ustring info_key(const std::string &key) const;
+    time_type info_date(const std::string &key) const;
+    bool is_encrypted() const;
+    bool is_linearized() const;
+    bool has_permission(permission_enum which) const;
+    ustring metadata() const;
+    bool get_pdf_id(std::string *permanent_id, std::string *update_id) const;
+
+    int pages() const;
+    page* create_page(const ustring &label) const;
+    page* create_page(int index) const;
+
+    std::vector<font_info> fonts() const;
+    font_iterator* create_font_iterator(int start_page = 0) const;
+
+    toc* create_toc() const;
+
+    bool has_embedded_files() const;
+    std::vector<embedded_file *> embedded_files() const;
+
+    static document* load_from_file(const std::string &file_name,
+                                    const std::string &owner_password = std::string(),
+                                    const std::string &user_password = std::string());
+    static document* load_from_data(byte_array *file_data,
+                                    const std::string &owner_password = std::string(),
+                                    const std::string &user_password = std::string());
+    static document* load_from_raw_data(const char *file_data,
+                                        int file_data_length,
+                                        const std::string &owner_password = std::string(),
+                                        const std::string &user_password = std::string());
+
+private:
+    document(document_private &dd);
+
+    document_private *d;
+    friend class document_private;
+};
+
+}
+
+#endif
diff --git a/cpp/poppler-embedded-file-private.h b/cpp/poppler-embedded-file-private.h
new file mode 100644 (file)
index 0000000..1b9b633
--- /dev/null
@@ -0,0 +1,40 @@
+/*
+ * Copyright (C) 2009, 2011, Pino Toscano <pino@kde.org>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#ifndef POPPLER_EMBEDDED_FILE_PRIVATE_H
+#define POPPLER_EMBEDDED_FILE_PRIVATE_H
+
+class FileSpec;
+
+namespace poppler
+{
+
+class embedded_file_private
+{
+public:
+    embedded_file_private(FileSpec *fs);
+    ~embedded_file_private();
+
+    static embedded_file* create(FileSpec *fs);
+
+    FileSpec *file_spec;
+};
+
+}
+
+#endif
diff --git a/cpp/poppler-embedded-file.cpp b/cpp/poppler-embedded-file.cpp
new file mode 100644 (file)
index 0000000..2c5d077
--- /dev/null
@@ -0,0 +1,177 @@
+/*
+ * Copyright (C) 2009-2011, Pino Toscano <pino@kde.org>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include "poppler-embedded-file.h"
+
+#include "poppler-embedded-file-private.h"
+#include "poppler-private.h"
+
+#include "Object.h"
+#include "Stream.h"
+#include "Catalog.h"
+#include "FileSpec.h"
+
+using namespace poppler;
+
+embedded_file_private::embedded_file_private(FileSpec *fs)
+    : file_spec(fs)
+{
+}
+
+embedded_file_private::~embedded_file_private()
+{
+    delete file_spec;
+}
+
+embedded_file* embedded_file_private::create(FileSpec *fs)
+{
+    return new embedded_file(*new embedded_file_private(fs));
+}
+
+/**
+ \class poppler::embedded_file poppler-embedded-file.h "poppler/cpp/poppler-embedded-file.h"
+
+ Represents a file embedded in a PDF %document.
+ */
+
+
+embedded_file::embedded_file(embedded_file_private &dd)
+    : d(&dd)
+{
+}
+
+/**
+ Destroys the embedded file.
+ */
+embedded_file::~embedded_file()
+{
+    delete d;
+}
+
+/**
+ \returns whether the embedded file is valid
+ */
+bool embedded_file::is_valid() const
+{
+    return d->file_spec->isOk();
+}
+
+/**
+ \returns the name of the embedded file
+ */
+std::string embedded_file::name() const
+{
+    GooString *goo = d->file_spec->getFileName();
+    return goo ? std::string(goo->getCString()) : std::string();
+}
+
+/**
+ \returns the description of the embedded file
+ */
+ustring embedded_file::description() const
+{
+    GooString *goo = d->file_spec->getDescription();
+    return goo ? detail::unicode_GooString_to_ustring(goo) : ustring();
+}
+
+/**
+ \note this is not always available in the PDF %document, in that case this
+       will return \p -1.
+
+ \returns the size of the embedded file, if known
+ */
+int embedded_file::size() const
+{
+    return d->file_spec->getEmbeddedFile()->size();
+}
+
+/**
+ \returns the time_t representing the modification date of the embedded file,
+          if available
+ */
+time_type embedded_file::modification_date() const
+{
+    GooString *goo = d->file_spec->getEmbeddedFile()->modDate();
+    return goo ? detail::convert_date(goo->getCString()) : time_type(-1);
+}
+
+/**
+ \returns the time_t representing the creation date of the embedded file,
+          if available
+ */
+time_type embedded_file::creation_date() const
+{
+    GooString *goo = d->file_spec->getEmbeddedFile()->createDate();
+    return goo ? detail::convert_date(goo->getCString()) : time_type(-1);
+}
+
+/**
+ \returns the checksum of the embedded file
+ */
+byte_array embedded_file::checksum() const
+{
+    GooString *cs = d->file_spec->getEmbeddedFile()->checksum();
+    if (!cs) {
+        return byte_array();
+    }
+    const char *ccs = cs->getCString();
+    byte_array data(cs->getLength());
+    for (int i = 0; i < cs->getLength(); ++i) {
+        data[i] = ccs[i];
+    }
+    return data;
+}
+
+/**
+ \returns the MIME type of the embedded file, if available
+ */
+std::string embedded_file::mime_type() const
+{
+    GooString *goo = d->file_spec->getEmbeddedFile()->mimeType();
+    return goo ? std::string(goo->getCString()) : std::string();
+}
+
+/**
+ Reads all the data of the embedded file.
+
+ \returns the data of the embedded file
+ */
+byte_array embedded_file::data() const
+{
+    if (!is_valid()) {
+        return byte_array();
+    }
+    Stream *stream = d->file_spec->getEmbeddedFile()->stream();
+    if (!stream) {
+        return byte_array();
+    }
+
+    stream->reset();
+    byte_array ret(1024);
+    size_t data_len = 0;
+    int i;
+    while ((i = stream->getChar()) != EOF) {
+        if (data_len == ret.size()) {
+            ret.resize(ret.size() * 2);
+        }
+        ret[data_len] = (char)i;
+        ++data_len;
+    }
+    ret.resize(data_len);
+    return ret;
+}
diff --git a/cpp/poppler-embedded-file.h b/cpp/poppler-embedded-file.h
new file mode 100644 (file)
index 0000000..307fdd6
--- /dev/null
@@ -0,0 +1,55 @@
+/*
+ * Copyright (C) 2009-2010, Pino Toscano <pino@kde.org>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#ifndef POPPLER_EMBEDDED_FILE_H
+#define POPPLER_EMBEDDED_FILE_H
+
+#include "poppler-global.h"
+
+#include <vector>
+
+namespace poppler
+{
+
+class embedded_file_private;
+
+class POPPLER_CPP_EXPORT embedded_file : public poppler::noncopyable
+{
+public:
+    ~embedded_file();
+
+    bool is_valid() const;
+    std::string name() const;
+    ustring description() const;
+    int size() const;
+    time_type modification_date() const;
+    time_type creation_date() const;
+    byte_array checksum() const;
+    std::string mime_type() const;
+    byte_array data() const;
+
+private:
+    embedded_file(embedded_file_private &dd);
+
+    embedded_file_private *d;
+    friend class embedded_file_private;
+};
+
+}
+
+#endif
diff --git a/cpp/poppler-font.cpp b/cpp/poppler-font.cpp
new file mode 100644 (file)
index 0000000..ab3b409
--- /dev/null
@@ -0,0 +1,241 @@
+/*
+ * Copyright (C) 2009, Pino Toscano <pino@kde.org>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include "poppler-font.h"
+
+#include "poppler-document-private.h"
+
+#include "FontInfo.h"
+
+using namespace poppler;
+
+class poppler::font_info_private
+{
+public:
+    font_info_private()
+        : type(font_info::unknown)
+        , is_embedded(false)
+        , is_subset(false)
+    {
+    }
+    font_info_private(FontInfo *fi)
+        : type((font_info::type_enum)fi->getType())
+        , is_embedded(fi->getEmbedded())
+        , is_subset(fi->getSubset())
+        , emb_ref(fi->getEmbRef())
+    {
+        if (fi->getName()) {
+            font_name = fi->getName()->getCString();
+        }
+        if (fi->getFile()) {
+            font_file = fi->getFile()->getCString();
+        }
+    }
+
+    std::string font_name;
+    std::string font_file;
+    font_info::type_enum type : 5;
+    bool is_embedded : 1;
+    bool is_subset : 1;
+    Ref emb_ref;
+};
+
+
+class poppler::font_iterator_private
+{
+public:
+    font_iterator_private(int start_page, document_private *dd)
+        : font_info_scanner(dd->doc, start_page)
+        , total_pages(dd->doc->getNumPages())
+        , current_page((std::max)(start_page, 0))
+    {
+    }
+    ~font_iterator_private()
+    {
+    }
+
+    FontInfoScanner font_info_scanner;
+    int total_pages;
+    int current_page;
+};
+
+/**
+ \class poppler::font_info poppler-font.h "poppler/cpp/poppler-font.h"
+
+ The information about a font used in a PDF %document.
+ */
+
+/**
+ \enum poppler::font_info::type_enum
+
+ The various types of fonts available in a PDF %document.
+*/
+
+
+/**
+ Constructs an invalid font information.
+ */
+font_info::font_info()
+    : d(new font_info_private())
+{
+}
+
+font_info::font_info(font_info_private &dd)
+    : d(&dd)
+{
+}
+
+/**
+ Copy constructor.
+ */
+font_info::font_info(const font_info &fi)
+    : d(new font_info_private(*fi.d))
+{
+}
+
+/**
+ Destructor.
+ */
+font_info::~font_info()
+{
+    delete d;
+}
+
+/**
+ \returns the name of the font
+ */
+std::string font_info::name() const
+{
+    return d->font_name;
+}
+
+/**
+ \returns the file name of the font, in case the font is not embedded nor subset
+ */
+std::string font_info::file() const
+{
+    return d->font_file;
+}
+
+/**
+ \returns whether the font is totally embedded in the %document
+ */
+bool font_info::is_embedded() const
+{
+    return d->is_embedded;
+}
+
+/**
+ \returns whether there is a subset of the font embedded in the %document
+ */
+bool font_info::is_subset() const
+{
+    return d->is_subset;
+}
+
+/**
+ \returns the type of the font
+ */
+font_info::type_enum font_info::type() const
+{
+    return d->type;
+}
+
+/**
+ Assignment operator.
+ */
+font_info& font_info::operator=(const font_info &fi)
+{
+    if (this != &fi) {
+        *d = *fi.d;
+    }
+    return *this;
+}
+
+/**
+ \class poppler::font_iterator poppler-font.h "poppler/cpp/poppler-font.h"
+
+ Reads the fonts in the PDF %document page by page.
+
+ font_iterator is the way to collect the list of the fonts used in a PDF
+ %document, reading them incrementally page by page.
+
+ A typical usage of this might look like:
+ \code
+poppler::font_iterator *it = doc->create_font_iterator();
+while (it->has_next()) {
+    std::vector<poppler::font_info> fonts = it->next();
+    // do domething with the fonts
+}
+// after we are done with the iterator, it must be deleted
+delete it;
+\endcode
+ */
+
+
+font_iterator::font_iterator(int start_page, document_private *dd)
+    : d(new font_iterator_private(start_page, dd))
+{
+}
+
+/**
+ Destructor.
+ */
+font_iterator::~font_iterator()
+{
+    delete d;
+}
+
+/**
+ Returns the fonts of the current page and advances to the next one.
+ */
+std::vector<font_info> font_iterator::next()
+{
+    if (!has_next()) {
+        return std::vector<font_info>();
+    }
+
+    ++d->current_page;
+
+    GooList *items = d->font_info_scanner.scan(1);
+    if (!items) {
+        return std::vector<font_info>();
+    }
+    std::vector<font_info> fonts(items->getLength());
+    for (int i = 0; i < items->getLength(); ++i) {
+        fonts[i] = font_info(*new font_info_private((FontInfo *)items->get(i)));
+    }
+    deleteGooList(items, FontInfo);
+    return fonts;
+}
+
+/**
+ \returns whether the iterator has more pages to advance to
+*/
+bool font_iterator::has_next() const
+{
+    return d->current_page < d->total_pages;
+}
+
+/**
+ \returns the current page
+*/
+int font_iterator::current_page() const
+{
+    return d->current_page;
+}
diff --git a/cpp/poppler-font.h b/cpp/poppler-font.h
new file mode 100644 (file)
index 0000000..854b7a4
--- /dev/null
@@ -0,0 +1,91 @@
+/*
+ * Copyright (C) 2009, Pino Toscano <pino@kde.org>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#ifndef POPPLER_FONT_H
+#define POPPLER_FONT_H
+
+#include "poppler-global.h"
+
+#include <vector>
+
+namespace poppler
+{
+
+class document;
+class document_private;
+class font_info_private;
+class font_iterator;
+class font_iterator_private;
+
+class POPPLER_CPP_EXPORT font_info
+{
+public:
+    enum type_enum {
+        unknown,
+        type1,
+        type1c,
+        type1c_ot,
+        type3,
+        truetype,
+        truetype_ot,
+        cid_type0,
+        cid_type0c,
+        cid_type0c_ot,
+        cid_truetype,
+        cid_truetype_ot
+    };
+
+    font_info();
+    font_info(const font_info &fi);
+    ~font_info();
+
+    std::string name() const;
+    std::string file() const;
+    bool is_embedded() const;
+    bool is_subset() const;
+    type_enum type() const;
+
+    font_info& operator=(const font_info &fi);
+
+private:
+    font_info(font_info_private &dd);
+
+    font_info_private *d;
+    friend class font_iterator;
+};
+
+
+class POPPLER_CPP_EXPORT font_iterator : public poppler::noncopyable
+{
+public:
+    ~font_iterator();
+
+    std::vector<font_info> next();
+    bool has_next() const;
+    int current_page() const;
+
+private:
+    font_iterator(int, document_private *dd);
+
+    font_iterator_private *d;
+    friend class document;
+};
+
+}
+
+#endif
diff --git a/cpp/poppler-global.cpp b/cpp/poppler-global.cpp
new file mode 100644 (file)
index 0000000..f99dbb7
--- /dev/null
@@ -0,0 +1,340 @@
+/*
+ * Copyright (C) 2009-2010, Pino Toscano <pino@kde.org>
+ * Copyright (C) 2010, Hib Eris <hib@hiberis.nl>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include "poppler-global.h"
+
+#include "poppler-private.h"
+
+#include <cerrno>
+#include <cstring>
+#include <ios>
+#include <iostream>
+
+#include <iconv.h>
+
+#include "config.h"
+
+namespace
+{
+
+struct MiniIconv
+{
+    MiniIconv(const char *to_code, const char *from_code)
+        : i_(iconv_open(to_code, from_code))
+    {}
+    ~MiniIconv()
+    { if (is_valid()) iconv_close(i_); }
+    bool is_valid() const
+    { return i_ != (iconv_t)-1; }
+    operator iconv_t() const
+    { return i_; }
+    iconv_t i_;
+};
+
+}
+
+using namespace poppler;
+
+/**
+ \namespace poppler
+
+ Single namespace containing all the classes and functions of poppler-cpp.
+ */
+
+/**
+ \class poppler::noncopyable
+
+ A class that cannot be copied.
+ */
+
+/**
+ \enum poppler::rotation_enum
+
+ The case sensitivity.
+*/
+/**
+ \var poppler::rotation_enum poppler::rotate_0
+
+ A rotation of 0 degrees clockwise.
+*/
+/**
+ \var poppler::rotation_enum poppler::rotate_90
+
+ A rotation of 90 degrees clockwise.
+*/
+/**
+ \var poppler::rotation_enum poppler::rotate_180
+
+ A rotation of 180 degrees clockwise.
+*/
+/**
+ \var poppler::rotation_enum poppler::rotate_270
+
+ A rotation of 270 degrees clockwise.
+*/
+
+/**
+ \enum poppler::page_box_enum
+
+ A possible box of a page in a PDF %document.
+*/
+/**
+ \var poppler::page_box_enum poppler::media_box
+
+ The "media" box.
+*/
+/**
+ \var poppler::page_box_enum poppler::crop_box
+
+ The "crop" box.
+*/
+/**
+ \var poppler::page_box_enum poppler::bleed_box
+
+ The "bleed" box.
+*/
+/**
+ \var poppler::page_box_enum poppler::trim_box
+
+ The "trim" box.
+*/
+/**
+ \var poppler::page_box_enum poppler::art_box
+
+ The "art" box.
+*/
+
+/**
+ \enum poppler::permission_enum
+
+ A possible permission in a PDF %document.
+*/
+/**
+ \var poppler::permission_enum poppler::perm_print
+
+ The permission to allow the print of a %document.
+*/
+/**
+ \var poppler::permission_enum poppler::perm_change
+
+ The permission to change a %document.
+
+ This is a generic "change" permission, so other permissions could affect
+ some types of changes.
+*/
+/**
+ \var poppler::permission_enum poppler::perm_copy
+
+ The permission to allow the copy or extraction of the text in a %document.
+*/
+/**
+ \var poppler::permission_enum poppler::perm_add_notes
+
+ The permission to allow the addition or editing of annotations,
+ and the filling of interactive form fields (including signature fields).
+*/
+/**
+ \var poppler::permission_enum poppler::perm_fill_forms
+
+ The permission to allow the the filling of interactive form fields
+ (including signature fields).
+
+ \note this permission can be set even when the \ref poppler::perm_add_notes "perm_add_notes"
+       is not: this means that only the filling of forms is allowed.
+*/
+/**
+ \var poppler::permission_enum poppler::perm_accessibility
+
+ The permission to allow the extracting of content (for example, text) for
+ accessibility usage (e.g. for a screen reader).
+*/
+/**
+ \var poppler::permission_enum poppler::perm_assemble
+
+ The permission to allow to "assemble" a %document.
+
+ This implies operations such as the insertion, the rotation and the deletion
+ of pages; the creation of bookmarks and thumbnail images.
+
+ \note this permission can be set even when the \ref poppler::perm_change "perm_change"
+       is not
+*/
+/**
+ \var poppler::permission_enum poppler::perm_print_high_resolution
+
+ The permission to allow the high resolution print of a %document.
+*/
+
+/**
+ \enum poppler::case_sensitivity_enum
+
+ The case sensitivity.
+*/
+
+
+noncopyable::noncopyable()
+{
+}
+
+noncopyable::~noncopyable()
+{
+}
+
+
+ustring::ustring()
+{
+}
+
+ustring::ustring(size_type len, value_type ch)
+    : std::basic_string<value_type>(len, ch)
+{
+}
+
+ustring::~ustring()
+{
+}
+
+byte_array ustring::to_utf8() const
+{
+    if (!size()) {
+        return byte_array();
+    }
+
+    MiniIconv ic("UTF-8", "UTF-16");
+    if (!ic.is_valid()) {
+        return byte_array();
+    }
+    const value_type *me_data = data();
+    byte_array str(size());
+    char *str_data = &str[0];
+    size_t me_len_char = size();
+    size_t str_len_left = str.size();
+    size_t ir = iconv(ic, (ICONV_CONST char **)&me_data, &me_len_char, &str_data, &str_len_left);
+    if ((ir == (size_t)-1) && (errno == E2BIG)) {
+        const size_t delta = str_data - &str[0];
+        str_len_left += str.size();
+        str.resize(str.size() * 2);
+        str_data = &str[delta];
+        ir = iconv(ic, (ICONV_CONST char **)&me_data, &me_len_char, &str_data, &str_len_left);
+        if (ir == (size_t)-1) {
+            return byte_array();
+        }
+    }
+    if (str_len_left >= 0) {
+        str.resize(str.size() - str_len_left);
+    }
+    return str;
+}
+
+std::string ustring::to_latin1() const
+{
+    if (!size()) {
+        return std::string();
+    }
+
+    const size_type mylength = size();
+    std::string ret(mylength, '\0');
+    const value_type *me = data();
+    for (size_type i = 0; i < mylength; ++i) {
+        ret[i] = (char)*me++;
+    }
+    return ret;
+}
+
+ustring ustring::from_utf8(const char *str, int len)
+{
+    if (len <= 0) {
+        len = std::strlen(str);
+        if (len <= 0) {
+            return ustring();
+        }
+    }
+
+    MiniIconv ic("UTF-16", "UTF-8");
+    if (!ic.is_valid()) {
+        return ustring();
+    }
+
+    ustring ret(len * 2, 0);
+    char *ret_data = reinterpret_cast<char *>(&ret[0]);
+    char *str_data = const_cast<char *>(str);
+    size_t str_len_char = len;
+    size_t ret_len_left = ret.size();
+    size_t ir = iconv(ic, (ICONV_CONST char **)&str_data, &str_len_char, &ret_data, &ret_len_left);
+    if ((ir == (size_t)-1) && (errno == E2BIG)) {
+        const size_t delta = ret_data - reinterpret_cast<char *>(&ret[0]);
+        ret_len_left += ret.size();
+        ret.resize(ret.size() * 2);
+        ret_data = reinterpret_cast<char *>(&ret[delta]);
+        ir = iconv(ic, (ICONV_CONST char **)&str_data, &str_len_char, &ret_data, &ret_len_left);
+        if (ir == (size_t)-1) {
+            return ustring();
+        }
+    }
+    if (ret_len_left >= 0) {
+        ret.resize(ret.size() - ret_len_left);
+    }
+
+    return ret;
+}
+
+ustring ustring::from_latin1(const std::string &str)
+{
+    const size_type l = str.size();
+    if (!l) {
+        return ustring();
+    }
+    const char *c = str.data();
+    ustring ret(l, 0);
+    for (size_type i = 0; i < l; ++i) {
+        ret[i] = *c++;
+    }
+    return ret;
+}
+
+
+/**
+ Converts a string representing a PDF date to a value compatible with time_t.
+ */
+time_type poppler::convert_date(const std::string &date)
+{
+    return detail::convert_date(date.c_str());
+}
+
+std::ostream& poppler::operator<<(std::ostream& stream, const byte_array &array)
+{
+    stream << "[";
+    const std::ios_base::fmtflags f = stream.flags();
+    std::hex(stream);
+    const char *data = &array[0];
+    const byte_array::size_type out_len = std::min<byte_array::size_type>(array.size(), 50);
+    for (byte_array::size_type i = 0; i < out_len; ++i)
+    {
+        if (i != 0) {
+            stream << " ";
+        }
+        stream << ((data[i] & 0xf0) >> 4) << (data[i] & 0xf);
+    }
+    stream.flags(f);
+    if (out_len < array.size()) {
+        stream << " ...";
+    }
+    stream << "]";
+    return stream;
+}
diff --git a/cpp/poppler-global.h b/cpp/poppler-global.h
new file mode 100644 (file)
index 0000000..5650182
--- /dev/null
@@ -0,0 +1,111 @@
+/*
+ * Copyright (C) 2009-2010, Pino Toscano <pino@kde.org>
+ * Copyright (C) 2010, Patrick Spendrin <ps_ml@gmx.de>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#ifndef POPPLER_GLOBAL_H
+#define POPPLER_GLOBAL_H
+
+#if defined(_WIN32)
+#  define LIB_EXPORT __declspec(dllexport)
+#  define LIB_IMPORT __declspec(dllimport)
+#else
+#  define LIB_EXPORT
+#  define LIB_IMPORT
+#endif
+
+#if defined(poppler_cpp_EXPORTS)
+#  define POPPLER_CPP_EXPORT LIB_EXPORT
+#else
+#  define POPPLER_CPP_EXPORT LIB_IMPORT
+#endif
+
+#include <iosfwd>
+#include <string>
+#include <vector>
+
+namespace poppler
+{
+
+/// \cond DOXYGEN_SKIP_THIS
+namespace detail
+{
+
+class POPPLER_CPP_EXPORT noncopyable
+{
+protected:
+    noncopyable();
+    ~noncopyable();
+private:
+    noncopyable(const noncopyable &);
+    const noncopyable& operator=(const noncopyable &);
+};
+
+}
+
+typedef detail::noncopyable noncopyable;
+/// \endcond
+
+enum rotation_enum { rotate_0, rotate_90, rotate_180, rotate_270 };
+
+enum page_box_enum { media_box, crop_box, bleed_box, trim_box, art_box };
+
+enum permission_enum { perm_print, perm_change, perm_copy, perm_add_notes,
+                       perm_fill_forms, perm_accessibility, perm_assemble,
+                       perm_print_high_resolution };
+
+enum case_sensitivity_enum { case_sensitive, case_insensitive };
+
+typedef std::vector<char> byte_array;
+
+typedef unsigned int /* time_t */ time_type;
+
+// to disable warning only for this occurrence
+#ifdef _MSC_VER
+#pragma warning(push)
+#pragma warning(disable: 4251) /* class 'A' needs to have dll interface for to be used by clients of class 'B'. */
+#endif
+class POPPLER_CPP_EXPORT ustring : public std::basic_string<unsigned short>
+{
+public:
+    ustring();
+    ustring(size_type len, value_type ch);
+    ~ustring();
+
+    byte_array to_utf8() const;
+    std::string to_latin1() const;
+
+    static ustring from_utf8(const char *str, int len = -1);
+    static ustring from_latin1(const std::string &str);
+
+private:
+    // forbid implicit std::string conversions
+    ustring(const std::string &);
+    operator std::string() const;
+    ustring& operator=(const std::string &);
+};
+#ifdef _MSC_VER
+#pragma warning(pop)
+#endif
+
+POPPLER_CPP_EXPORT time_type convert_date(const std::string &date);
+
+POPPLER_CPP_EXPORT std::ostream& operator<<(std::ostream& stream, const byte_array &array);
+
+}
+
+#endif
diff --git a/cpp/poppler-image-private.h b/cpp/poppler-image-private.h
new file mode 100644 (file)
index 0000000..33b5874
--- /dev/null
@@ -0,0 +1,48 @@
+/*
+ * Copyright (C) 2010, Pino Toscano <pino@kde.org>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#ifndef POPPLER_IMAGE_PRIVATE_H
+#define POPPLER_IMAGE_PRIVATE_H
+
+#include "poppler-image.h"
+
+namespace poppler
+{
+
+class image_private
+{
+public:
+    image_private(int iwidth, int iheight, image::format_enum iformat);
+    ~image_private();
+
+    static image_private *create_data(int width, int height, image::format_enum format);
+    static image_private *create_data(char *data, int width, int height, image::format_enum format);
+
+    int ref;
+    char *data;
+    int width;
+    int height;
+    int bytes_per_row;
+    int bytes_num;
+    image::format_enum format : 3;
+    bool own_data : 1;
+};
+
+}
+
+#endif
diff --git a/cpp/poppler-image.cpp b/cpp/poppler-image.cpp
new file mode 100644 (file)
index 0000000..8e9ac63
--- /dev/null
@@ -0,0 +1,475 @@
+/*
+ * Copyright (C) 2010-2011, Pino Toscano <pino@kde.org>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include "poppler-image.h"
+
+#include "poppler-image-private.h"
+
+#include <config.h>
+#include "ImgWriter.h"
+#if defined(ENABLE_LIBPNG)
+#include "PNGWriter.h"
+#endif
+#if defined(ENABLE_LIBJPEG)
+#include "JpegWriter.h"
+#endif
+#if defined(ENABLE_LIBTIFF)
+#include "TiffWriter.h"
+#endif
+#include "PNMWriter.h"
+
+#include <cstdlib>
+#include <cstring>
+#include <algorithm>
+#include <memory>
+#include <vector>
+
+using poppler::PNMWriter;
+
+namespace {
+
+struct FileCloser {
+    inline FileCloser(FILE *ff)
+        : f(ff) {}
+    inline ~FileCloser()
+    { (void)close(); }
+    inline bool close()
+    { if (f) { const int c = fclose(f); f = 0; return c == 0; } return true; }
+
+    FILE *f;
+};
+
+int calc_bytes_per_row(int width, poppler::image::format_enum format)
+{
+    switch (format) {
+    case poppler::image::format_invalid:
+        return 0;
+    case poppler::image::format_mono:
+        return (width + 7) >> 3;
+    case poppler::image::format_rgb24:
+        return width * 3;
+    case poppler::image::format_argb32:
+        return width * 4;
+    }
+    return 0;
+}
+
+PNMWriter::OutFormat pnm_format(poppler::image::format_enum format)
+{
+    switch (format) {
+    case poppler::image::format_invalid: // unused, anyway
+    case poppler::image::format_mono:
+        return PNMWriter::PBM;
+    case poppler::image::format_rgb24:
+    case poppler::image::format_argb32:
+        return PNMWriter::PPM;
+    }
+    return PNMWriter::PPM;
+}
+
+}
+
+using namespace poppler;
+
+image_private::image_private(int iwidth, int iheight, image::format_enum iformat)
+    : ref(1)
+    , data(0)
+    , width(iwidth)
+    , height(iheight)
+    , bytes_per_row(0)
+    , bytes_num(0)
+    , format(iformat)
+    , own_data(true)
+{
+}
+
+image_private::~image_private()
+{
+    if (own_data) {
+        std::free(data);
+    }
+}
+
+image_private *image_private::create_data(int width, int height, image::format_enum format)
+{
+    if (width <= 0 || height <= 0) {
+        return 0;
+    }
+
+    int bpr = calc_bytes_per_row(width, format);
+    if (bpr <= 0) {
+        return 0;
+    }
+
+    std::auto_ptr<image_private> d(new image_private(width, height, format));
+    d->bytes_num = bpr * height;
+    d->data = reinterpret_cast<char *>(std::malloc(d->bytes_num));
+    if (!d->data) {
+        return 0;
+    }
+    d->own_data = true;
+    d->bytes_per_row = bpr;
+
+    return d.release();
+}
+
+image_private *image_private::create_data(char *data, int width, int height, image::format_enum format)
+{
+    if (width <= 0 || height <= 0 || !data) {
+        return 0;
+    }
+
+    int bpr = calc_bytes_per_row(width, format);
+    if (bpr <= 0) {
+        return 0;
+    }
+
+    std::auto_ptr<image_private> d(new image_private(width, height, format));
+    d->bytes_num = bpr * height;
+    d->data = data;
+    d->own_data = false;
+    d->bytes_per_row = bpr;
+
+    return d.release();
+}
+
+/**
+ \class poppler::image poppler-image.h "poppler/cpp/poppler-image.h"
+
+ A simple representation of image, with direct access to the data.
+
+ This class uses implicit sharing for the internal data, so it can be used as
+ value class. This also means any non-const operation will make sure that the
+ data used by current instance is not shared with other instances (ie
+ \em detaching), copying the shared data.
+
+ \since 0.16
+ */
+
+/**
+ \enum poppler::image::format_enum
+
+ The possible formats for an image.
+*/
+
+
+/**
+ Construct an invalid image.
+ */
+image::image()
+    : d(0)
+{
+}
+
+/**
+ Construct a new image.
+
+ It allocates the storage needed for the image data; if the allocation fails,
+ the image is an invalid one.
+
+ \param iwidth the width for the image
+ \param iheight the height for the image
+ \param iformat the format for the bits of the image
+ */
+image::image(int iwidth, int iheight, image::format_enum iformat)
+    : d(image_private::create_data(iwidth, iheight, iformat))
+{
+}
+
+/**
+ Construct a new image.
+
+ It uses the provide data buffer for the image, so you \b must ensure it
+ remains valid for the whole lifetime of the image.
+
+ \param idata the buffer to use for the image
+ \param iwidth the width for the image
+ \param iheight the height for the image
+ \param iformat the format for the bits of the image
+ */
+image::image(char *idata, int iwidth, int iheight, image::format_enum iformat)
+    : d(image_private::create_data(idata, iwidth, iheight, iformat))
+{
+}
+
+/**
+ Copy constructor.
+ */
+image::image(const image &pt)
+    : d(pt.d)
+{
+    if (d) {
+        ++d->ref;
+    }
+}
+
+/**
+ Destructor.
+ */
+image::~image()
+{
+    if (d && !--d->ref) {
+        delete d;
+    }
+}
+
+/**
+ Image validity check.
+
+ \returns whether the image is valid.
+ */
+bool image::is_valid() const
+{
+    return d && d->format != format_invalid;
+}
+
+/**
+ \returns the format of the image
+ */
+image::format_enum image::format() const
+{
+    return d ? d->format : format_invalid;
+}
+
+/**
+ \returns whether the width of the image
+ */
+int image::width() const
+{
+    return d ? d->width : 0;
+}
+
+/**
+ \returns whether the height of the image
+ */
+int image::height() const
+{
+    return d ? d->height : 0;
+}
+
+/**
+ \returns the number of bytes in each row of the image
+ */
+int image::bytes_per_row() const
+{
+    return d ? d->bytes_per_row : 0;
+}
+
+/**
+ Access to the image bits.
+
+ This function will detach and copy the shared data.
+
+ \returns the pointer to the first pixel
+ */
+char *image::data()
+{
+    if (!d) {
+        return 0;
+    }
+
+    detach();
+    return d->data;
+}
+
+/**
+ Access to the image bits.
+
+ This function provides const access to the data.
+
+ \returns the pointer to the first pixel
+ */
+const char *image::const_data() const
+{
+    return d ? d->data : 0;
+}
+
+/**
+ Copy of a slice of the image.
+
+ \param r the sub-area of this image to copy; if empty, the whole image is
+          copied
+
+ \returns a new image representing the specified part of the current image
+ */
+image image::copy(const rect &r) const
+{
+    if (r.is_empty()) {
+        image img(*this);
+        img.detach();
+        return img;
+    }
+
+    // ### FIXME
+    return *this;
+}
+
+/**
+ Saves the current image to file.
+
+ Using this function it is possible to save the image to the specified
+ \p file_name, in the specified \p out_format and with a resolution of the
+ specified \p dpi.
+
+ Image formats commonly supported are:
+ \li PNG: \c png
+ \li JPEG: \c jpeg, \c jpg
+ \li TIFF: \c tiff
+ \li PNM: \c pnm (with Poppler >= 0.18)
+
+ If an image format is not supported (check the result of
+ supported_image_formats()), the saving fails.
+
+ \returns whether the saving succeeded
+ */
+bool image::save(const std::string &file_name, const std::string &out_format, int dpi) const
+{
+    if (!is_valid() || file_name.empty() || out_format.empty()) {
+        return false;
+    }
+
+    std::string fmt = out_format;
+    std::transform(fmt.begin(), fmt.end(), fmt.begin(), tolower);
+
+    std::auto_ptr<ImgWriter> w;
+    const int actual_dpi = dpi == -1 ? 75 : dpi;
+    if (false) {
+    }
+#if defined(ENABLE_LIBPNG)
+    else if (fmt == "png") {
+        w.reset(new PNGWriter());
+    }
+#endif
+#if defined(ENABLE_LIBJPEG)
+    else if (fmt == "jpeg" || fmt == "jpg") {
+        w.reset(new JpegWriter());
+    }
+#endif
+#if defined(ENABLE_LIBTIFF)
+    else if (fmt == "tiff") {
+        w.reset(new TiffWriter());
+    }
+#endif
+    else if (fmt == "pnm") {
+        w.reset(new PNMWriter(pnm_format(d->format)));
+    }
+    if (!w.get()) {
+        return false;
+    }
+    FILE *f = fopen(file_name.c_str(), "w");
+    if (!f) {
+        return false;
+    }
+    const FileCloser fc(f);
+    if (!w->init(f, d->width, d->height, actual_dpi, actual_dpi)) {
+        return false;
+    }
+    switch (d->format) {
+    case format_invalid:
+        return false;
+    case format_mono:
+        return false;
+    case format_rgb24: {
+        char *hptr = d->data;
+        for (int y = 0; y < d->height; ++y) {
+            if (!w->writeRow(reinterpret_cast<unsigned char **>(&hptr))) {
+                return false;
+            }
+            hptr += d->bytes_per_row;
+        }
+        break;
+    }
+    case format_argb32: {
+        std::vector<unsigned char> row(3 * d->width);
+        char *hptr = d->data;
+        for (int y = 0; y < d->height; ++y) {
+            unsigned char *rowptr = &row[0];
+            for (int x = 0; x < d->width; ++x, rowptr += 3) {
+                const unsigned int pixel = *reinterpret_cast<unsigned int *>(hptr + x * 4);
+                rowptr[0] = (pixel >> 16) & 0xff;
+                rowptr[1] = (pixel >> 8) & 0xff;
+                rowptr[2] = pixel & 0xff;
+            }
+            rowptr = &row[0];
+            if (!w->writeRow(&rowptr)) {
+                return false;
+            }
+            hptr += d->bytes_per_row;
+        }
+        break;
+    }
+    }
+
+    if (!w->close()) {
+        return false;
+    }
+
+    return true;
+}
+
+/**
+ \returns a list of the supported image formats
+ */
+std::vector<std::string> image::supported_image_formats()
+{
+    std::vector<std::string> formats;
+#if defined(ENABLE_LIBPNG)
+    formats.push_back("png");
+#endif
+#if defined(ENABLE_LIBJPEG)
+    formats.push_back("jpeg");
+    formats.push_back("jpg");
+#endif
+#if defined(ENABLE_LIBTIFF)
+    formats.push_back("tiff");
+#endif
+    formats.push_back("pnm");
+    return formats;
+}
+
+/**
+ Assignment operator.
+ */
+image& image::operator=(const image &pt)
+{
+    if (pt.d) {
+        ++pt.d->ref;
+    }
+    image_private *old_d = d;
+    d = pt.d;
+    if (old_d && !--old_d->ref) {
+        delete old_d;
+    }
+    return *this;
+}
+
+void image::detach()
+{
+    if (d->ref == 1) {
+        return;
+    }
+
+    image_private *old_d = d;
+    d = image_private::create_data(old_d->width, old_d->height, old_d->format);
+    if (d) {
+        std::memcpy(d->data, old_d->data, old_d->bytes_num);
+        --old_d->ref;
+    } else {
+        d = old_d;
+    }
+}
diff --git a/cpp/poppler-image.h b/cpp/poppler-image.h
new file mode 100644 (file)
index 0000000..4f2e301
--- /dev/null
@@ -0,0 +1,71 @@
+/*
+ * Copyright (C) 2010, Pino Toscano <pino@kde.org>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#ifndef POPPLER_IMAGE_H
+#define POPPLER_IMAGE_H
+
+#include "poppler-global.h"
+#include "poppler-rectangle.h"
+
+namespace poppler
+{
+
+class image_private;
+
+class POPPLER_CPP_EXPORT image
+{
+public:
+    enum format_enum {
+        format_invalid,
+        format_mono,
+        format_rgb24,
+        format_argb32
+    };
+
+    image();
+    image(int iwidth, int iheight, format_enum iformat);
+    image(char *idata, int iwidth, int iheight, format_enum iformat);
+    image(const image &img);
+    ~image();
+
+    bool is_valid() const;
+    format_enum format() const;
+    int width() const;
+    int height() const;
+    char *data();
+    const char *const_data() const;
+    int bytes_per_row() const;
+
+    image copy(const rect &r = rect()) const;
+
+    bool save(const std::string &file_name, const std::string &out_format, int dpi = -1) const;
+
+    static std::vector<std::string> supported_image_formats();
+
+    image& operator=(const image &img);
+
+private:
+    void detach();
+
+    image_private *d;
+    friend class image_private;
+};
+
+}
+
+#endif
diff --git a/cpp/poppler-page-private.h b/cpp/poppler-page-private.h
new file mode 100644 (file)
index 0000000..b208cb8
--- /dev/null
@@ -0,0 +1,49 @@
+/*
+ * Copyright (C) 2009, Pino Toscano <pino@kde.org>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#ifndef POPPLER_PAGE_PRIVATE_H
+#define POPPLER_PAGE_PRIVATE_H
+
+#include "poppler-page.h"
+
+class Page;
+
+namespace poppler
+{
+
+class document_private;
+class page_transition;
+
+class page_private
+{
+public:
+    page_private(document_private *doc, int index);
+    ~page_private();
+
+    document_private *doc;
+    Page *page;
+    int index;
+    page_transition *transition;
+
+    static inline page_private* get(const poppler::page *p)
+    { return const_cast<poppler::page *>(p)->d; }
+};
+
+}
+
+#endif
diff --git a/cpp/poppler-page-renderer.cpp b/cpp/poppler-page-renderer.cpp
new file mode 100644 (file)
index 0000000..1317192
--- /dev/null
@@ -0,0 +1,212 @@
+/*
+ * Copyright (C) 2010, Pino Toscano <pino@kde.org>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include "poppler-page-renderer.h"
+
+#include "poppler-document-private.h"
+#include "poppler-page-private.h"
+
+#include <config.h>
+
+#include "PDFDoc.h"
+#if defined(HAVE_SPLASH)
+#include "SplashOutputDev.h"
+#include "splash/SplashBitmap.h"
+#endif
+
+using namespace poppler;
+
+class poppler::page_renderer_private
+{
+public:
+    page_renderer_private()
+        : paper_color(0xffffffff)
+        , hints(0)
+    {
+    }
+
+    argb paper_color;
+    unsigned int hints;
+};
+
+
+/**
+ \class poppler::page_renderer poppler-page-renderer.h "poppler/cpp/poppler-renderer.h"
+
+ Simple way to render a page of a PDF %document.
+
+ \since 0.16
+ */
+
+/**
+ \enum poppler::page_renderer::render_hint
+
+ A flag of an option taken into account when rendering
+*/
+
+
+/**
+ Constructs a new %page renderer.
+ */
+page_renderer::page_renderer()
+    : d(new page_renderer_private())
+{
+}
+
+/**
+ Destructor.
+ */
+page_renderer::~page_renderer()
+{
+    delete d;
+}
+
+/**
+ The color used for the "paper" of the pages.
+
+ The default color is opaque solid white (0xffffffff).
+
+ \returns the paper color
+ */
+argb page_renderer::paper_color() const
+{
+    return d->paper_color;
+}
+
+/**
+ Set a new color for the "paper".
+
+ \param c the new color
+ */
+void page_renderer::set_paper_color(argb c)
+{
+    d->paper_color = c;
+}
+
+/**
+ The hints used when rendering.
+
+ By default no hint is set.
+
+ \returns the render hints set
+ */
+unsigned int page_renderer::render_hints() const
+{
+    return d->hints;
+}
+
+/**
+ Enable or disable a single render %hint.
+
+ \param hint the hint to modify
+ \param on whether enable it or not
+ */
+void page_renderer::set_render_hint(page_renderer::render_hint hint, bool on)
+{
+    if (on) {
+        d->hints |= hint;
+    } else {
+        d->hints &= ~(int)hint;
+    }
+}
+
+/**
+ Set new render %hints at once.
+
+ \param hints the new set of render hints
+ */
+void page_renderer::set_render_hints(unsigned int hints)
+{
+    d->hints = hints;
+}
+
+/**
+ Render the specified page.
+
+ This functions renders the specified page on an image following the specified
+ parameters, returning it.
+
+ \param p the page to render
+ \param xres the X resolution, in dot per inch (DPI)
+ \param yres the Y resolution, in dot per inch (DPI)
+ \param x the X top-right coordinate, in pixels
+ \param y the Y top-right coordinate, in pixels
+ \param w the width in pixels of the area to render
+ \param h the height in pixels of the area to render
+ \param rotate the rotation to apply when rendering the page
+
+ \returns the rendered image, or a null one in case of errors
+
+ \see can_render
+ */
+image page_renderer::render_page(const page *p,
+                                 double xres, double yres,
+                                 int x, int y, int w, int h,
+                                 rotation_enum rotate) const
+{
+    if (!p) {
+        return image();
+    }
+
+#if defined(HAVE_SPLASH)
+    page_private *pp = page_private::get(p);
+    PDFDoc *pdfdoc = pp->doc->doc;
+
+    SplashColor bgColor;
+    bgColor[0] = d->paper_color & 0xff;
+    bgColor[1] = (d->paper_color >> 8) & 0xff;
+    bgColor[2] = (d->paper_color >> 16) & 0xff;
+    const GBool text_AA = d->hints & text_antialiasing ? gTrue : gFalse;
+    SplashOutputDev splashOutputDev(splashModeXBGR8, 4, gFalse, bgColor, gTrue, text_AA);
+    splashOutputDev.setVectorAntialias(d->hints & antialiasing ? gTrue : gFalse);
+    splashOutputDev.setFreeTypeHinting(d->hints & text_hinting ? gTrue : gFalse, gFalse);
+    splashOutputDev.startDoc(pdfdoc);
+    pdfdoc->displayPageSlice(&splashOutputDev, pp->index + 1,
+                             xres, yres, int(rotate) * 90,
+                             gFalse, gTrue, gFalse,
+                             x, y, w, h);
+
+    SplashBitmap *bitmap = splashOutputDev.getBitmap();
+    const int bw = bitmap->getWidth();
+    const int bh = bitmap->getHeight();
+
+    SplashColorPtr data_ptr = bitmap->getDataPtr();
+
+    const image img(reinterpret_cast<char *>(data_ptr), bw, bh, image::format_argb32);
+    return img.copy();
+#else
+    return image();
+#endif
+}
+
+/**
+ Rendering capability test.
+
+ page_renderer can render only if a render backend ('Splash') is compiled in
+ Poppler.
+
+ \returns whether page_renderer can render
+ */
+bool page_renderer::can_render()
+{
+#if defined(HAVE_SPLASH)
+    return true;
+#else
+    return false;
+#endif
+}
diff --git a/cpp/poppler-page-renderer.h b/cpp/poppler-page-renderer.h
new file mode 100644 (file)
index 0000000..1383865
--- /dev/null
@@ -0,0 +1,66 @@
+/*
+ * Copyright (C) 2010, Pino Toscano <pino@kde.org>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#ifndef POPPLER_PAGE_RENDERER_H
+#define POPPLER_PAGE_RENDERER_H
+
+#include "poppler-global.h"
+#include "poppler-image.h"
+
+namespace poppler
+{
+
+typedef unsigned int argb;
+
+class page;
+class page_renderer_private;
+
+class POPPLER_CPP_EXPORT page_renderer : public poppler::noncopyable
+{
+public:
+    enum render_hint {
+        antialiasing = 0x00000001,
+        text_antialiasing = 0x00000002,
+        text_hinting = 0x00000004
+    };
+
+    page_renderer();
+    ~page_renderer();
+
+    argb paper_color() const;
+    void set_paper_color(argb c);
+
+    unsigned int render_hints() const;
+    void set_render_hint(render_hint hint, bool on = true);
+    void set_render_hints(unsigned int hints);
+
+    image render_page(const page *p,
+                      double xres = 72.0, double yres = 72.0,
+                      int x = -1, int y = -1, int w = -1, int h = -1,
+                      rotation_enum rotate = rotate_0) const;
+
+    static bool can_render();
+
+private:
+    page_renderer_private *d;
+    friend class page_renderer_private;
+};
+
+}
+
+#endif
diff --git a/cpp/poppler-page-transition.cpp b/cpp/poppler-page-transition.cpp
new file mode 100644 (file)
index 0000000..7c83723
--- /dev/null
@@ -0,0 +1,128 @@
+/*
+ * Copyright (C) 2009-2010, Pino Toscano <pino@kde.org>
+ * Copyright (C) 2011, Albert Astals Cid <aacid@kde.org>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include "poppler-page-transition.h"
+
+#include "PageTransition.h"
+
+using namespace poppler;
+
+class poppler::page_transition_private
+{
+public:
+    page_transition_private(Object *trans)
+        : pt(trans)
+    {
+    }
+
+    PageTransition pt;
+};
+
+/**
+ \class poppler::page_transition poppler-page-transition.h "poppler/cpp/poppler-page-transition.h"
+
+ A transition between two pages in a PDF %document.
+
+ Usually shown in a presentation mode of a PDF viewer.
+ */
+
+/**
+ \enum poppler::page_transition::type_enum
+
+ The possibe types of a %page transition.
+*/
+
+/**
+ \enum poppler::page_transition::alignment_enum
+
+ The alignment of a %page transition.
+*/
+
+/**
+ \enum poppler::page_transition::direction_enum
+
+ The direction of an animation in a %page transition.
+*/
+
+
+page_transition::page_transition(Object *params)
+    : d(new page_transition_private(params))
+{
+}
+
+/**
+ Copy constructor.
+ */
+page_transition::page_transition(const page_transition &pt)
+    : d(new page_transition_private(*pt.d))
+{
+}
+
+/**
+ Destructor.
+ */
+page_transition::~page_transition()
+{
+    delete d;
+}
+
+page_transition::type_enum page_transition::type() const
+{
+    return (page_transition::type_enum)d->pt.getType();
+}
+
+int page_transition::duration() const
+{
+    return d->pt.getDuration();
+}
+
+page_transition::alignment_enum page_transition::alignment() const
+{
+    return (page_transition::alignment_enum)d->pt.getAlignment();
+}
+
+page_transition::direction_enum page_transition::direction() const
+{
+    return (page_transition::direction_enum)d->pt.getDirection();
+}
+
+int page_transition::angle() const
+{
+    return d->pt.getAngle();
+}
+
+double page_transition::scale() const
+{
+    return d->pt.getScale();
+}
+
+bool page_transition::is_rectangular() const
+{
+    return d->pt.isRectangular();
+}
+
+page_transition& page_transition::operator=(const page_transition &pt)
+{
+    if (&pt != this) {
+        page_transition_private *new_d = new page_transition_private(*pt.d);
+        delete d;
+        d = new_d;
+    }
+    return *this;
+}
diff --git a/cpp/poppler-page-transition.h b/cpp/poppler-page-transition.h
new file mode 100644 (file)
index 0000000..4ecb179
--- /dev/null
@@ -0,0 +1,82 @@
+/*
+ * Copyright (C) 2009, Pino Toscano <pino@kde.org>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#ifndef POPPLER_PAGE_TRANSITION_H
+#define POPPLER_PAGE_TRANSITION_H
+
+#include "poppler-global.h"
+
+class Object;
+
+namespace poppler
+{
+
+class page;
+class page_transition_private;
+
+class POPPLER_CPP_EXPORT page_transition
+{
+public:
+    enum type_enum {
+        replace = 0,
+        split,
+        blinds,
+        box,
+        wipe,
+        dissolve,
+        glitter,
+        fly,
+        push,
+        cover,
+        uncover,
+        fade
+    };
+
+    enum alignment_enum {
+        horizontal = 0,
+        vertical
+    };
+
+    enum direction_enum {
+        inward = 0,
+        outward
+    };
+
+    page_transition(const page_transition &pt);
+    ~page_transition();
+
+    type_enum type() const;
+    int duration() const;
+    alignment_enum alignment() const;
+    direction_enum direction() const;
+    int angle() const;
+    double scale() const;
+    bool is_rectangular() const;
+
+    page_transition& operator=(const page_transition &pt);
+
+private:
+    page_transition(Object *params);
+
+    page_transition_private *d;
+    friend class page;
+};
+
+}
+
+#endif
diff --git a/cpp/poppler-page.cpp b/cpp/poppler-page.cpp
new file mode 100644 (file)
index 0000000..d72a477
--- /dev/null
@@ -0,0 +1,279 @@
+/*
+ * Copyright (C) 2009-2010, Pino Toscano <pino@kde.org>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include "poppler-page.h"
+#include "poppler-page-transition.h"
+
+#include "poppler-document-private.h"
+#include "poppler-page-private.h"
+#include "poppler-private.h"
+
+#include "TextOutputDev.h"
+
+#include <memory>
+
+using namespace poppler;
+
+page_private::page_private(document_private *_doc, int _index)
+    : doc(_doc)
+    , page(doc->doc->getCatalog()->getPage(_index + 1))
+    , index(_index)
+    , transition(0)
+{
+}
+
+page_private::~page_private()
+{
+    delete transition;
+}
+
+/**
+ \class poppler::page poppler-page.h "poppler/cpp/poppler-page.h"
+
+ A page in a PDF %document.
+ */
+
+/**
+ \enum poppler::page::orientation_enum
+
+ The possible orientation of a page.
+*/
+
+/**
+ \enum poppler::page::search_direction_enum
+
+ The direction/action to follow when performing a text search.
+*/
+
+/**
+ \enum poppler::page::text_layout_enum
+
+ A layout of the text of a page.
+*/
+
+
+page::page(document_private *doc, int index)
+    : d(new page_private(doc, index))
+{
+}
+
+/**
+ Destructor.
+ */
+page::~page()
+{
+    delete d;
+}
+
+/**
+ \returns the orientation of the page
+ */
+page::orientation_enum page::orientation() const
+{
+    const int rotation = d->page->getRotate();
+    switch (rotation) {
+    case 90:
+        return landscape;
+        break;
+    case 180:
+        return upside_down;
+        break;
+    case 270:
+        return seascape;
+        break;
+    default:
+        return portrait;
+    }
+}
+
+/**
+ The eventual duration the page can be hinted to be shown in a presentation.
+
+ If this value is positive (usually different than -1) then a PDF viewer, when
+ showing the page in a presentation, should show the page for at most for this
+ number of seconds, and then switch to the next page (if any). Note this is
+ purely a presentation attribute, it has no influence on the behaviour.
+
+ \returns the duration time (in seconds) of the page
+ */
+double page::duration() const
+{
+    return d->page->getDuration();
+}
+
+/**
+ Returns the size of one rect of the page.
+
+ \returns the size of the specified page rect
+ */
+rectf page::page_rect(page_box_enum box) const
+{
+    PDFRectangle *r = 0;
+    switch (box) {
+    case media_box:
+        r = d->page->getMediaBox();
+        break;
+    case crop_box:
+        r = d->page->getCropBox();
+        break;
+    case bleed_box:
+        r = d->page->getBleedBox();
+        break;
+    case trim_box:
+        r = d->page->getTrimBox();
+        break;
+    case art_box:
+        r = d->page->getArtBox();
+        break;
+    }
+    if (r) {
+        return detail::pdfrectangle_to_rectf(*r);
+    }
+    return rectf();
+}
+
+/**
+ \returns the label of the page, if any
+ */
+ustring page::label() const
+{
+    GooString goo;
+    if (!d->doc->doc->getCatalog()->indexToLabel(d->index, &goo)) {
+        return ustring();
+    }
+
+    return detail::unicode_GooString_to_ustring(&goo);
+}
+
+/**
+ The transition from this page to the next one.
+
+ If it is set, then a PDF viewer in a presentation should perform the
+ specified transition effect when switching from this page to the next one.
+
+ \returns the transition effect for the switch to the next page, if any
+ */
+page_transition* page::transition() const
+{
+    if (!d->transition) {
+        Object o;
+        if (d->page->getTrans(&o)->isDict()) {
+            d->transition = new page_transition(&o);
+        }
+        o.free();
+    }
+    return d->transition;
+}
+
+/**
+ Search the page for some text.
+
+ \param text the text to search
+ \param[in,out] r the area where to start search, which will be set to the area
+                  of the match (if any)
+ \param direction in which direction search for text
+ \param case_sensitivity whether search in a case sensitive way
+ \param rotation the rotation assumed for the page
+ */
+bool page::search(const ustring &text, rectf &r, search_direction_enum direction,
+                  case_sensitivity_enum case_sensitivity, rotation_enum rotation) const
+{
+    const size_t len = text.length();
+    std::vector<Unicode> u(len);
+    for (size_t i = 0; i < len; ++i) {
+        u[i] = text[i];
+    }
+
+    const GBool sCase = case_sensitivity == case_sensitive ? gTrue : gFalse;
+    const int rotation_value = (int)rotation * 90;
+
+    bool found = false;
+    double rect_left = r.left();
+    double rect_top = r.top();
+    double rect_right = r.right();
+    double rect_bottom = r.bottom();
+
+    TextOutputDev td(NULL, gTrue, 0, gFalse, gFalse);
+    d->doc->doc->displayPage(&td, d->index + 1, 72, 72, rotation_value, false, true, false);
+    TextPage *text_page = td.takeText();
+
+    switch (direction) {
+    case search_from_top:
+        found = text_page->findText(&u[0], len,
+                    gTrue, gTrue, gFalse, gFalse, sCase, gFalse, gFalse,
+                    &rect_left, &rect_top, &rect_right, &rect_bottom);
+        break;
+    case search_next_result:
+        found = text_page->findText(&u[0], len,
+                    gFalse, gTrue, gTrue, gFalse, sCase, gFalse, gFalse,
+                    &rect_left, &rect_top, &rect_right, &rect_bottom);
+        break;
+    case search_previous_result:
+        found = text_page->findText(&u[0], len,
+                    gFalse, gTrue, gTrue, gFalse, sCase, gTrue, gFalse,
+                    &rect_left, &rect_top, &rect_right, &rect_bottom);
+        break;
+    }
+
+    text_page->decRefCnt();
+    r.set_left(rect_left);
+    r.set_top(rect_top);
+    r.set_right(rect_right);
+    r.set_bottom(rect_bottom);
+
+    return found;
+}
+
+/**
+ Returns the text in the page, in its physical layout.
+
+ \param r if not empty, it will be extracted the text in it; otherwise, the
+          text of the whole page
+
+ \returns the text of the page in the specified rect or in the whole page
+ */
+ustring page::text(const rectf &r) const
+{
+    return text(r, physical_layout);
+}
+
+/**
+ Returns the text in the page.
+
+ \param rect if not empty, it will be extracted the text in it; otherwise, the
+             text of the whole page
+ \param layout_mode the layout of the text
+
+ \returns the text of the page in the specified rect or in the whole page
+
+ \since 0.16
+ */
+ustring page::text(const rectf &r, text_layout_enum layout_mode) const
+{
+    std::auto_ptr<GooString> s;
+    const GBool use_raw_order = (layout_mode == raw_order_layout);
+    TextOutputDev td(0, gFalse, 0, use_raw_order, gFalse);
+    d->doc->doc->displayPage(&td, d->index + 1, 72, 72, 0, false, true, false);
+    if (r.is_empty()) {
+        const PDFRectangle *rect = d->page->getCropBox();
+        s.reset(td.getText(rect->x1, rect->y1, rect->x2, rect->y2));
+    } else {
+        s.reset(td.getText(r.left(), r.top(), r.right(), r.bottom()));
+    }
+    return ustring::from_utf8(s->getCString());
+}
diff --git a/cpp/poppler-page.h b/cpp/poppler-page.h
new file mode 100644 (file)
index 0000000..7b4298a
--- /dev/null
@@ -0,0 +1,76 @@
+/*
+ * Copyright (C) 2009-2010, Pino Toscano <pino@kde.org>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#ifndef POPPLER_PAGE_H
+#define POPPLER_PAGE_H
+
+#include "poppler-global.h"
+#include "poppler-rectangle.h"
+
+namespace poppler
+{
+
+class document;
+class document_private;
+class page_private;
+class page_transition;
+
+class POPPLER_CPP_EXPORT page : public poppler::noncopyable
+{
+public:
+    enum orientation_enum {
+        landscape,
+        portrait,
+        seascape,
+        upside_down
+    };
+    enum search_direction_enum {
+        search_from_top,
+        search_next_result,
+        search_previous_result
+    };
+    enum text_layout_enum {
+        physical_layout,
+        raw_order_layout
+    };
+
+    ~page();
+
+    orientation_enum orientation() const;
+    double duration() const;
+    rectf page_rect(page_box_enum box = crop_box) const;
+    ustring label() const;
+
+    page_transition* transition() const;
+
+    bool search(const ustring &text, rectf &r, search_direction_enum direction,
+                case_sensitivity_enum case_sensitivity, rotation_enum rotation = rotate_0) const;
+    ustring text(const rectf &rect = rectf()) const;
+    ustring text(const rectf &rect, text_layout_enum layout_mode) const;
+
+private:
+    page(document_private *doc, int index);
+
+    page_private *d;
+    friend class page_private;
+    friend class document;
+};
+
+}
+
+#endif
diff --git a/cpp/poppler-private.cpp b/cpp/poppler-private.cpp
new file mode 100644 (file)
index 0000000..2783bed
--- /dev/null
@@ -0,0 +1,130 @@
+/*
+ * Copyright (C) 2009-2010, Pino Toscano <pino@kde.org>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include "poppler-private.h"
+
+#include "DateInfo.h"
+#include "GooString.h"
+#include "Page.h"
+
+#include <ctime>
+#include <iostream>
+#include <sstream>
+
+using namespace poppler;
+
+void detail::error_function(void * /*data*/, ErrorCategory /*category*/, int pos, char *msg)
+{
+    std::ostringstream oss;
+    if (pos >= 0) {
+        oss << "poppler/error (" << pos << "): ";
+    } else {
+        oss << "poppler/error: ";
+    }
+    oss << msg;
+    std::cerr << oss.str();
+}
+
+rectf detail::pdfrectangle_to_rectf(const PDFRectangle &pdfrect)
+{
+    return rectf(pdfrect.x1, pdfrect.y1, pdfrect.x2 - pdfrect.x1, pdfrect.y2 - pdfrect.y1);
+}
+
+ustring detail::unicode_GooString_to_ustring(GooString *str)
+{
+    const char *data = str->getCString();
+    const int len = str->getLength();
+
+    int i = 0;
+    bool is_unicode = false;
+    if ((data[0] & 0xff) == 0xfe && (len > 1 && (data[1] & 0xff) == 0xff)) {
+        is_unicode = true;
+        i = 2;
+    }
+    ustring::size_type ret_len = len - i;
+    if (is_unicode) {
+        ret_len >>= 1;
+    }
+    ustring ret(ret_len, 0);
+    size_t ret_index = 0;
+    ustring::value_type u;
+    if (is_unicode) {
+        while (i < len) {
+            u = ((data[i] & 0xff) << 8) | (data[i + 1] & 0xff);
+            i += 2;
+            ret[ret_index++] = u;
+        }
+    } else {
+        while (i < len) {
+            u = data[i] & 0xff;
+            ++i;
+            ret[ret_index++] = u;
+        }
+    }
+
+    return ret;
+}
+
+ustring detail::unicode_to_ustring(const Unicode *u, int length)
+{
+    ustring str(length * 2, 0);
+    ustring::iterator it = str.begin();
+    const Unicode *uu = u;
+    for (int i = 0; i < length; ++i) {
+        *it++ = ustring::value_type(*uu++ & 0xffff);
+    }
+    return str;
+}
+
+GooString* detail::ustring_to_unicode_GooString(const ustring &str)
+{
+    const size_t len = str.size() * 2 + 2;
+    const ustring::value_type *me = str.data();
+    byte_array ba(len);
+    ba[0] = 0xfe;
+    ba[1] = 0xff;
+    for (size_t i = 0; i < str.size(); ++i, ++me) {
+        ba[i * 2 + 2] = ((*me >> 8) & 0xff);
+        ba[i * 2 + 3] = (*me & 0xff);
+    }
+    GooString *goo = new GooString(&ba[0]);
+    return goo;
+}
+
+time_type detail::convert_date(const char *date)
+{
+    int year, mon, day, hour, min, sec, tzHours, tzMins;
+    char tz;
+
+    if (!parseDateString(date, &year, &mon, &day, &hour, &min, &sec,
+                               &tz, &tzHours, &tzMins)) {
+        return time_type(-1);
+    }
+
+    struct tm time;
+    time.tm_sec = sec;
+    time.tm_min = min;
+    time.tm_hour = hour;
+    time.tm_mday = day;
+    time.tm_mon = mon - 1;
+    time.tm_year = year - 1900;
+    time.tm_wday = -1;
+    time.tm_yday = -1;
+    time.tm_isdst = -1;
+    return mktime(&time);
+}
diff --git a/cpp/poppler-private.h b/cpp/poppler-private.h
new file mode 100644 (file)
index 0000000..a4b455c
--- /dev/null
@@ -0,0 +1,69 @@
+/*
+ * Copyright (C) 2009, Pino Toscano <pino@kde.org>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#ifndef POPPLER_PRIVATE_H
+#define POPPLER_PRIVATE_H
+
+#include "poppler-global.h"
+#include "poppler-rectangle.h"
+
+#include "Error.h"
+#include "CharTypes.h"
+
+#include <stdarg.h>
+
+class GooString;
+class PDFRectangle;
+
+#define PSTR(str) const_cast<char *>(str)
+
+namespace poppler
+{
+
+namespace detail
+{
+
+void error_function(void *data, ErrorCategory category, int pos, char *msg);
+
+rectf pdfrectangle_to_rectf(const PDFRectangle &pdfrect);
+
+ustring unicode_GooString_to_ustring(GooString *str);
+ustring unicode_to_ustring(const Unicode *u, int length);
+GooString* ustring_to_unicode_GooString(const ustring &str);
+
+time_type convert_date(const char *date);
+
+}
+
+template <typename ConstIterator>
+void delete_all(ConstIterator it, ConstIterator end)
+{
+    while (it != end) {
+        delete *it++;
+    }
+}
+
+template <typename Collection>
+void delete_all(const Collection &c)
+{
+    delete_all(c.begin(), c.end());
+}
+
+}
+
+#endif
diff --git a/cpp/poppler-rectangle.cpp b/cpp/poppler-rectangle.cpp
new file mode 100644 (file)
index 0000000..83e5cc9
--- /dev/null
@@ -0,0 +1,54 @@
+/*
+ * Copyright (C) 2009-2010, Pino Toscano <pino@kde.org>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include "poppler-rectangle.h"
+
+#include <iostream>
+
+using namespace poppler;
+
+/**
+ \class poppler::rectangle poppler-rectangle.h "poppler/cpp/poppler-rectangle.h"
+
+ A rectangle.
+ */
+
+/**
+ \typedef poppler::rect
+
+ A rectangle with int dimensions and coordinates.
+ */
+
+/**
+ \typedef poppler::rectf
+
+ A rectangle with float (double) dimensions and coordinates.
+ */
+
+
+std::ostream& poppler::operator<<(std::ostream& stream, const rect &r)
+{
+    stream << "[" << r.x() << "," << r.y() << " " << r.width() << "+" << r.height() << "]";
+    return stream;
+}
+
+std::ostream& poppler::operator<<(std::ostream& stream, const rectf &r)
+{
+    stream << "[" << r.x() << "," << r.y() << " " << r.width() << "+" << r.height() << "]";
+    return stream;
+}
diff --git a/cpp/poppler-rectangle.h b/cpp/poppler-rectangle.h
new file mode 100644 (file)
index 0000000..365d07c
--- /dev/null
@@ -0,0 +1,84 @@
+/*
+ * Copyright (C) 2009-2010, Pino Toscano <pino@kde.org>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#ifndef POPPLER_RECTANGLE_H
+#define POPPLER_RECTANGLE_H
+
+#include "poppler-global.h"
+
+namespace poppler
+{
+
+template <typename T> class rectangle
+{
+public:
+    rectangle()
+        : x1(), y1(), x2(), y2()
+    {}
+    rectangle(T _x, T _y, T w, T h)
+        : x1(_x), y1(_y), x2(x1 + w), y2(y1 + h)
+    {}
+    ~rectangle()
+    {}
+
+    bool is_empty() const
+    { return (x1 == x2) && (y1 == y2); }
+
+    T x() const
+    { return x1; }
+
+    T y() const
+    { return y1; }
+
+    T width() const
+    { return x2 - x1; }
+
+    T height() const
+    { return y2 - y1; }
+
+    T left() const
+    { return x1; }
+    T top() const
+    { return y1; }
+    T right() const
+    { return x2; }
+    T bottom() const
+    { return y2; }
+
+    void set_left(T value)
+    { x1 = value; }
+    void set_top(T value)
+    { y1 = value; }
+    void set_right(T value)
+    { x2 = value; }
+    void set_bottom(T value)
+    { y2 = value; }
+
+private:
+    T x1, y1, x2, y2;
+};
+
+typedef rectangle<int> rect;
+typedef rectangle<double> rectf;
+
+POPPLER_CPP_EXPORT std::ostream& operator<<(std::ostream& stream, const rect &r);
+POPPLER_CPP_EXPORT std::ostream& operator<<(std::ostream& stream, const rectf &r);
+
+}
+
+#endif
diff --git a/cpp/poppler-toc-private.h b/cpp/poppler-toc-private.h
new file mode 100644 (file)
index 0000000..e8841ff
--- /dev/null
@@ -0,0 +1,62 @@
+/*
+ * Copyright (C) 2009, Pino Toscano <pino@kde.org>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#ifndef POPPLER_TOC_PRIVATE_H
+#define POPPLER_TOC_PRIVATE_H
+
+#include "poppler-global.h"
+#include "poppler-toc.h"
+
+#include <vector>
+
+class GooList;
+class Outline;
+class OutlineItem;
+
+namespace poppler
+{
+
+class toc_private
+{
+public:
+    toc_private();
+    ~toc_private();
+
+    static toc* load_from_outline(Outline *outline);
+
+    toc_item root;
+};
+
+
+class toc_item_private
+{
+public:
+    toc_item_private();
+    ~toc_item_private();
+
+    void load(OutlineItem *item);
+    void load_children(GooList *items);
+
+    std::vector<toc_item*> children;
+    ustring title;
+    bool is_open;
+};
+
+}
+
+#endif
diff --git a/cpp/poppler-toc.cpp b/cpp/poppler-toc.cpp
new file mode 100644 (file)
index 0000000..a3149c6
--- /dev/null
@@ -0,0 +1,199 @@
+/*
+ * Copyright (C) 2009-2010, Pino Toscano <pino@kde.org>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include "poppler-toc.h"
+
+#include "poppler-toc-private.h"
+#include "poppler-private.h"
+
+#include "GooList.h"
+#include "Outline.h"
+
+using namespace poppler;
+
+toc_private::toc_private()
+{
+}
+
+toc_private::~toc_private()
+{
+}
+
+toc* toc_private::load_from_outline(Outline *outline)
+{
+    if (!outline) {
+        return 0;
+    }
+
+    GooList *items = outline->getItems();
+    if (!items || items->getLength() < 1) {
+        return 0;
+    }
+
+    toc *newtoc = new toc();
+    newtoc->d->root.d->is_open = true;
+    newtoc->d->root.d->load_children(items);
+
+    return newtoc;
+}
+
+toc_item_private::toc_item_private()
+    : is_open(false)
+{
+}
+
+toc_item_private::~toc_item_private()
+{
+    delete_all(children);
+}
+
+void toc_item_private::load(OutlineItem *item)
+{
+    const Unicode *title_unicode = item->getTitle();
+    const int title_length = item->getTitleLength();
+    title = detail::unicode_to_ustring(title_unicode, title_length);
+    is_open = item->isOpen();
+}
+
+void toc_item_private::load_children(GooList *items)
+{
+    const int num_items = items->getLength();
+    children.resize(num_items);
+    for (int i = 0; i < num_items; ++i) {
+        OutlineItem *item = (OutlineItem *)items->get(i);
+
+        toc_item *new_item = new toc_item();
+        new_item->d->load(item);
+        children[i] = new_item;
+
+        item->open();
+        GooList *item_children = item->getKids();
+        if (item_children) {
+            new_item->d->load_children(item_children);
+        }
+    }
+}
+
+/**
+ \class poppler::toc poppler-toc.h "poppler/cpp/poppler-toc.h"
+
+ Represents the TOC (Table of Contents) of a PDF %document.
+
+ The TOC of a PDF %document is represented as a tree of items.
+ */
+
+
+toc::toc()
+    : d(new toc_private())
+{
+}
+
+/**
+ Destroys the TOC.
+ */
+toc::~toc()
+{
+    delete d;
+}
+
+/**
+ Returns the "invisible item" representing the root of the TOC.
+
+ This item is special, it has no title nor actions, it is open and its children
+ are the effective root items of the TOC. This is provided as a convenience
+ when iterating throught the TOC.
+
+ \returns the root "item"
+ */
+toc_item* toc::root() const
+{
+    return &d->root;
+}
+
+/**
+ \class poppler::toc_item poppler-toc.h "poppler/cpp/poppler-toc.h"
+
+ Represents an item of the TOC (Table of Contents) of a PDF %document.
+ */
+
+/**
+ \typedef std::vector<toc_item *>::const_iterator poppler::toc_item::iterator
+
+ An iterator for the children of a TOC item.
+ */
+
+
+toc_item::toc_item()
+    : d(new toc_item_private())
+{
+}
+
+/**
+ Destroys the TOC item.
+ */
+toc_item::~toc_item()
+{
+    delete d;
+}
+
+/**
+ \returns the title of the TOC item
+ */
+ustring toc_item::title() const
+{
+    return d->title;
+}
+
+/**
+ Returns whether the TOC item should be represented as open when showing the
+ TOC.
+
+ This is not a functional behaviour, but a visualisation hint of the item.
+ Regardless of this state, the item can be expanded and collapsed freely when
+ represented in a TOC view of a PDF viewer.
+
+ \returns whether the TOC item should be open
+ */
+bool toc_item::is_open() const
+{
+    return d->is_open;
+}
+
+/**
+ \returns the children of the TOC item
+ */
+std::vector<toc_item *> toc_item::children() const
+{
+    return d->children;
+}
+
+/**
+ \returns an iterator to the being of the list of children of the TOC item
+ */
+toc_item::iterator toc_item::children_begin() const
+{
+    return d->children.begin();
+}
+
+/**
+ \returns an iterator to the end of the list of children of the TOC item
+ */
+toc_item::iterator toc_item::children_end() const
+{
+    return d->children.end();
+}
diff --git a/cpp/poppler-toc.h b/cpp/poppler-toc.h
new file mode 100644 (file)
index 0000000..8b09736
--- /dev/null
@@ -0,0 +1,74 @@
+/*
+ * Copyright (C) 2009, Pino Toscano <pino@kde.org>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#ifndef POPPLER_TOC_H
+#define POPPLER_TOC_H
+
+#include "poppler-global.h"
+
+#include <vector>
+
+namespace poppler
+{
+
+class toc_private;
+class toc_item;
+class toc_item_private;
+
+class POPPLER_CPP_EXPORT toc : public poppler::noncopyable
+{
+public:
+    ~toc();
+
+    toc_item* root() const;
+
+private:
+    toc();
+
+    toc_private *d;
+
+    friend class toc_private;
+};
+
+
+class POPPLER_CPP_EXPORT toc_item : public poppler::noncopyable
+{
+public:
+    typedef std::vector<toc_item *>::const_iterator iterator;
+
+    ~toc_item();
+
+    ustring title() const;
+    bool is_open() const;
+
+    std::vector<toc_item *> children() const;
+    iterator children_begin() const;
+    iterator children_end() const;
+
+private:
+    toc_item();
+
+    toc_item_private *d;
+    friend class toc;
+    friend class toc_private;
+    friend class toc_item_private;
+};
+
+}
+
+#endif
diff --git a/cpp/poppler-version.cpp b/cpp/poppler-version.cpp
new file mode 100644 (file)
index 0000000..dcc100f
--- /dev/null
@@ -0,0 +1,53 @@
+/*
+ * Copyright (C) 2009-2010, Pino Toscano <pino@kde.org>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include "poppler-version.h"
+
+using namespace poppler;
+
+/**
+ \returns the version string of the current poppler-cpp library
+ */
+std::string poppler::version_string()
+{
+    return std::string(POPPLER_VERSION);
+}
+
+/**
+ \returns the "major" number of the version of the current poppler-cpp library
+ */
+unsigned int poppler::version_major()
+{
+    return POPPLER_VERSION_MAJOR;
+}
+
+/**
+ \returns the "minor" number of the version of the current poppler-cpp library
+ */
+unsigned int poppler::version_minor()
+{
+    return POPPLER_VERSION_MINOR;
+}
+
+/**
+ \returns the "micro" number of the version of the current poppler-cpp library
+ */
+unsigned int poppler::version_micro()
+{
+    return POPPLER_VERSION_MICRO;
+}
diff --git a/cpp/poppler-version.h b/cpp/poppler-version.h
new file mode 100644 (file)
index 0000000..8872075
--- /dev/null
@@ -0,0 +1,39 @@
+/*
+ * Copyright (C) 2009, Pino Toscano <pino@kde.org>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#ifndef POPPLER_VERSION_H
+#define POPPLER_VERSION_H
+
+#include "poppler-global.h"
+
+#define POPPLER_VERSION "0.20.4"
+#define POPPLER_VERSION_MAJOR 0
+#define POPPLER_VERSION_MINOR 20
+#define POPPLER_VERSION_MICRO 4
+
+namespace poppler
+{
+
+POPPLER_CPP_EXPORT std::string version_string();
+POPPLER_CPP_EXPORT unsigned int version_major();
+POPPLER_CPP_EXPORT unsigned int version_minor();
+POPPLER_CPP_EXPORT unsigned int version_micro();
+
+}
+
+#endif
diff --git a/cpp/poppler-version.h.in b/cpp/poppler-version.h.in
new file mode 100644 (file)
index 0000000..cf6bce6
--- /dev/null
@@ -0,0 +1,39 @@
+/*
+ * Copyright (C) 2009, Pino Toscano <pino@kde.org>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#ifndef POPPLER_VERSION_H
+#define POPPLER_VERSION_H
+
+#include "poppler-global.h"
+
+#define POPPLER_VERSION "@POPPLER_VERSION@"
+#define POPPLER_VERSION_MAJOR @POPPLER_MAJOR_VERSION@
+#define POPPLER_VERSION_MINOR @POPPLER_MINOR_VERSION@
+#define POPPLER_VERSION_MICRO @POPPLER_MICRO_VERSION@
+
+namespace poppler
+{
+
+POPPLER_CPP_EXPORT std::string version_string();
+POPPLER_CPP_EXPORT unsigned int version_major();
+POPPLER_CPP_EXPORT unsigned int version_minor();
+POPPLER_CPP_EXPORT unsigned int version_micro();
+
+}
+
+#endif
diff --git a/cpp/tests/CMakeLists.txt b/cpp/tests/CMakeLists.txt
new file mode 100644 (file)
index 0000000..6ea24a5
--- /dev/null
@@ -0,0 +1,25 @@
+include_directories(
+  ${CMAKE_CURRENT_SOURCE_DIR}
+  ${CMAKE_CURRENT_SOURCE_DIR}/..
+  ${CMAKE_CURRENT_BINARY_DIR}/..
+  ${CMAKE_SOURCE_DIR}/utils
+)
+
+macro(CPP_ADD_SIMPLETEST exe)
+  string(REPLACE "-" "" test_name ${exe})
+  set(${test_name}_SOURCES
+    ${ARGN}
+  )
+  poppler_add_test(${exe} BUILD_CPP_TESTS ${${test_name}_SOURCES})
+  target_link_libraries(${exe} poppler-cpp)
+  if(MSVC)
+    target_link_libraries(${exe} poppler ${poppler_LIBS})
+  endif(MSVC)
+endmacro(CPP_ADD_SIMPLETEST)
+
+
+cpp_add_simpletest(poppler-dump poppler-dump.cpp ${CMAKE_SOURCE_DIR}/utils/parseargs.cc)
+target_link_libraries(poppler-dump poppler)
+
+cpp_add_simpletest(poppler-render poppler-render.cpp ${CMAKE_SOURCE_DIR}/utils/parseargs.cc)
+target_link_libraries(poppler-render poppler)
diff --git a/cpp/tests/Makefile.am b/cpp/tests/Makefile.am
new file mode 100644 (file)
index 0000000..aab55f2
--- /dev/null
@@ -0,0 +1,27 @@
+AM_LDFLAGS = @auto_import_flags@
+
+INCLUDES =                                     \
+       -I$(top_srcdir)                         \
+       -I$(top_srcdir)/utils                   \
+       -I$(top_srcdir)/cpp
+
+LDADDS =                                       \
+       $(top_builddir)/poppler/libpoppler.la   \
+       $(top_builddir)/cpp/libpoppler-cpp.la
+
+
+noinst_PROGRAMS =                              \
+       poppler-dump                            \
+       poppler-render
+
+poppler_dump_SOURCES = \
+       $(top_srcdir)/utils/parseargs.cc        \
+       poppler-dump.cpp
+poppler_dump_LDADD = $(LDADDS)
+
+
+poppler_render_SOURCES = \
+       $(top_srcdir)/utils/parseargs.cc        \
+       poppler-render.cpp
+poppler_render_LDADD = $(LDADDS)
+
diff --git a/cpp/tests/Makefile.in b/cpp/tests/Makefile.in
new file mode 100644 (file)
index 0000000..9268a3e
--- /dev/null
@@ -0,0 +1,666 @@
+# Makefile.in generated by automake 1.11.5 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software
+# Foundation, Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+@SET_MAKE@
+
+VPATH = @srcdir@
+am__make_dryrun = \
+  { \
+    am__dry=no; \
+    case $$MAKEFLAGS in \
+      *\\[\ \  ]*) \
+        echo 'am--echo: ; @echo "AM"  OK' | $(MAKE) -f - 2>/dev/null \
+          | grep '^AM OK$$' >/dev/null || am__dry=yes;; \
+      *) \
+        for am__flg in $$MAKEFLAGS; do \
+          case $$am__flg in \
+            *=*|--*) ;; \
+            *n*) am__dry=yes; break;; \
+          esac; \
+        done;; \
+    esac; \
+    test $$am__dry = yes; \
+  }
+pkgdatadir = $(datadir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkglibexecdir = $(libexecdir)/@PACKAGE@
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+noinst_PROGRAMS = poppler-dump$(EXEEXT) poppler-render$(EXEEXT)
+subdir = cpp/tests
+DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/m4/acx_pthread.m4 \
+       $(top_srcdir)/m4/define-dir.m4 $(top_srcdir)/m4/gtk-doc.m4 \
+       $(top_srcdir)/m4/iconv.m4 $(top_srcdir)/m4/introspection.m4 \
+       $(top_srcdir)/m4/libjpeg.m4 $(top_srcdir)/m4/libtool.m4 \
+       $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \
+       $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \
+       $(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+       $(ACLOCAL_M4)
+mkinstalldirs = $(install_sh) -d
+CONFIG_HEADER = $(top_builddir)/config.h \
+       $(top_builddir)/poppler/poppler-config.h
+CONFIG_CLEAN_FILES =
+CONFIG_CLEAN_VPATH_FILES =
+PROGRAMS = $(noinst_PROGRAMS)
+am_poppler_dump_OBJECTS = parseargs.$(OBJEXT) poppler-dump.$(OBJEXT)
+poppler_dump_OBJECTS = $(am_poppler_dump_OBJECTS)
+poppler_dump_DEPENDENCIES = $(LDADDS)
+AM_V_lt = $(am__v_lt_@AM_V@)
+am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@)
+am__v_lt_0 = --silent
+am_poppler_render_OBJECTS = parseargs.$(OBJEXT) \
+       poppler-render.$(OBJEXT)
+poppler_render_OBJECTS = $(am_poppler_render_OBJECTS)
+poppler_render_DEPENDENCIES = $(LDADDS)
+DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) -I$(top_builddir)/poppler
+depcomp = $(SHELL) $(top_srcdir)/depcomp
+am__depfiles_maybe = depfiles
+am__mv = mv -f
+CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
+       $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)
+LTCXXCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \
+       $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) \
+       $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
+       $(AM_CXXFLAGS) $(CXXFLAGS)
+AM_V_CXX = $(am__v_CXX_@AM_V@)
+am__v_CXX_ = $(am__v_CXX_@AM_DEFAULT_V@)
+am__v_CXX_0 = @echo "  CXX   " $@;
+AM_V_at = $(am__v_at_@AM_V@)
+am__v_at_ = $(am__v_at_@AM_DEFAULT_V@)
+am__v_at_0 = @
+CXXLD = $(CXX)
+CXXLINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \
+       $(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \
+       $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
+AM_V_CXXLD = $(am__v_CXXLD_@AM_V@)
+am__v_CXXLD_ = $(am__v_CXXLD_@AM_DEFAULT_V@)
+am__v_CXXLD_0 = @echo "  CXXLD " $@;
+AM_V_GEN = $(am__v_GEN_@AM_V@)
+am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@)
+am__v_GEN_0 = @echo "  GEN   " $@;
+SOURCES = $(poppler_dump_SOURCES) $(poppler_render_SOURCES)
+DIST_SOURCES = $(poppler_dump_SOURCES) $(poppler_render_SOURCES)
+am__can_run_installinfo = \
+  case $$AM_UPDATE_INFO_DIR in \
+    n|no|NO) false;; \
+    *) (install-info --version) >/dev/null 2>&1;; \
+  esac
+ETAGS = etags
+CTAGS = ctags
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AR = @AR@
+AS = @AS@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CAIRO_CFLAGS = @CAIRO_CFLAGS@
+CAIRO_FEATURE = @CAIRO_FEATURE@
+CAIRO_LIBS = @CAIRO_LIBS@
+CAIRO_REQ = @CAIRO_REQ@
+CAIRO_VERSION = @CAIRO_VERSION@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CXX = @CXX@
+CXXCPP = @CXXCPP@
+CXXDEPMODE = @CXXDEPMODE@
+CXXFLAGS = @CXXFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DLLTOOL = @DLLTOOL@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+FGREP = @FGREP@
+FONTCONFIG_CFLAGS = @FONTCONFIG_CFLAGS@
+FONTCONFIG_LIBS = @FONTCONFIG_LIBS@
+FREETYPE_CFLAGS = @FREETYPE_CFLAGS@
+FREETYPE_CONFIG = @FREETYPE_CONFIG@
+FREETYPE_LIBS = @FREETYPE_LIBS@
+GLIB_MKENUMS = @GLIB_MKENUMS@
+GLIB_REQ = @GLIB_REQ@
+GLIB_REQUIRED = @GLIB_REQUIRED@
+GREP = @GREP@
+GTKDOC_CHECK = @GTKDOC_CHECK@
+GTKDOC_DEPS_CFLAGS = @GTKDOC_DEPS_CFLAGS@
+GTKDOC_DEPS_LIBS = @GTKDOC_DEPS_LIBS@
+GTKDOC_MKPDF = @GTKDOC_MKPDF@
+GTKDOC_REBASE = @GTKDOC_REBASE@
+GTK_TEST_CFLAGS = @GTK_TEST_CFLAGS@
+GTK_TEST_LIBS = @GTK_TEST_LIBS@
+HTML_DIR = @HTML_DIR@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+INTROSPECTION_CFLAGS = @INTROSPECTION_CFLAGS@
+INTROSPECTION_COMPILER = @INTROSPECTION_COMPILER@
+INTROSPECTION_GENERATE = @INTROSPECTION_GENERATE@
+INTROSPECTION_GIRDIR = @INTROSPECTION_GIRDIR@
+INTROSPECTION_LIBS = @INTROSPECTION_LIBS@
+INTROSPECTION_MAKEFILE = @INTROSPECTION_MAKEFILE@
+INTROSPECTION_SCANNER = @INTROSPECTION_SCANNER@
+INTROSPECTION_TYPELIBDIR = @INTROSPECTION_TYPELIBDIR@
+LCMS_CFLAGS = @LCMS_CFLAGS@
+LCMS_LIBS = @LCMS_LIBS@
+LD = @LD@
+LDFLAGS = @LDFLAGS@
+LIBCURL_CFLAGS = @LIBCURL_CFLAGS@
+LIBCURL_LIBS = @LIBCURL_LIBS@
+LIBICONV = @LIBICONV@
+LIBJPEG_CFLAGS = @LIBJPEG_CFLAGS@
+LIBJPEG_LIBS = @LIBJPEG_LIBS@
+LIBOBJS = @LIBOBJS@
+LIBOPENJPEG_CFLAGS = @LIBOPENJPEG_CFLAGS@
+LIBOPENJPEG_LIBS = @LIBOPENJPEG_LIBS@
+LIBPNG_CFLAGS = @LIBPNG_CFLAGS@
+LIBPNG_LIBS = @LIBPNG_LIBS@
+LIBS = @LIBS@
+LIBTIFF_CFLAGS = @LIBTIFF_CFLAGS@
+LIBTIFF_CFLAGSS = @LIBTIFF_CFLAGSS@
+LIBTIFF_LIBS = @LIBTIFF_LIBS@
+LIBTOOL = @LIBTOOL@
+LIPO = @LIPO@
+LN_S = @LN_S@
+LTLIBICONV = @LTLIBICONV@
+LTLIBOBJS = @LTLIBOBJS@
+MAKEINFO = @MAKEINFO@
+MANIFEST_TOOL = @MANIFEST_TOOL@
+MKDIR_P = @MKDIR_P@
+MOCQT4 = @MOCQT4@
+NM = @NM@
+NMEDIT = @NMEDIT@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+OTOOL = @OTOOL@
+OTOOL64 = @OTOOL64@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_URL = @PACKAGE_URL@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PC_REQUIRES = @PC_REQUIRES@
+PC_REQUIRES_PRIVATE = @PC_REQUIRES_PRIVATE@
+PDFTOCAIRO_CFLAGS = @PDFTOCAIRO_CFLAGS@
+PDFTOCAIRO_LIBS = @PDFTOCAIRO_LIBS@
+PKG_CONFIG = @PKG_CONFIG@
+PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@
+PKG_CONFIG_PATH = @PKG_CONFIG_PATH@
+POPPLER_DATADIR = @POPPLER_DATADIR@
+POPPLER_GLIB_CFLAGS = @POPPLER_GLIB_CFLAGS@
+POPPLER_GLIB_DISABLE_DEPRECATED = @POPPLER_GLIB_DISABLE_DEPRECATED@
+POPPLER_GLIB_DISABLE_SINGLE_INCLUDES = @POPPLER_GLIB_DISABLE_SINGLE_INCLUDES@
+POPPLER_GLIB_LIBS = @POPPLER_GLIB_LIBS@
+POPPLER_MAJOR_VERSION = @POPPLER_MAJOR_VERSION@
+POPPLER_MICRO_VERSION = @POPPLER_MICRO_VERSION@
+POPPLER_MINOR_VERSION = @POPPLER_MINOR_VERSION@
+POPPLER_QT4_CFLAGS = @POPPLER_QT4_CFLAGS@
+POPPLER_QT4_CXXFLAGS = @POPPLER_QT4_CXXFLAGS@
+POPPLER_QT4_LIBS = @POPPLER_QT4_LIBS@
+POPPLER_QT4_TEST_CFLAGS = @POPPLER_QT4_TEST_CFLAGS@
+POPPLER_QT4_TEST_LIBS = @POPPLER_QT4_TEST_LIBS@
+POPPLER_VERSION = @POPPLER_VERSION@
+PTHREAD_CC = @PTHREAD_CC@
+PTHREAD_CFLAGS = @PTHREAD_CFLAGS@
+PTHREAD_LIBS = @PTHREAD_LIBS@
+RANLIB = @RANLIB@
+SED = @SED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+TESTDATADIR = @TESTDATADIR@
+VERSION = @VERSION@
+XMKMF = @XMKMF@
+X_CFLAGS = @X_CFLAGS@
+X_EXTRA_LIBS = @X_EXTRA_LIBS@
+X_LIBS = @X_LIBS@
+X_PRE_LIBS = @X_PRE_LIBS@
+ZLIB_LIBS = @ZLIB_LIBS@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
+ac_ct_AR = @ac_ct_AR@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_CXX = @ac_ct_CXX@
+ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
+acx_pthread_config = @acx_pthread_config@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+auto_import_flags = @auto_import_flags@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+builddir = @builddir@
+create_shared_lib = @create_shared_lib@
+datadir = @datadir@
+datarootdir = @datarootdir@
+docdir = @docdir@
+dvidir = @dvidir@
+exec_prefix = @exec_prefix@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+htmldir = @htmldir@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localedir = @localedir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+srcdir = @srcdir@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+top_build_prefix = @top_build_prefix@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+win32_libs = @win32_libs@
+AM_LDFLAGS = @auto_import_flags@
+INCLUDES = \
+       -I$(top_srcdir)                         \
+       -I$(top_srcdir)/utils                   \
+       -I$(top_srcdir)/cpp
+
+LDADDS = \
+       $(top_builddir)/poppler/libpoppler.la   \
+       $(top_builddir)/cpp/libpoppler-cpp.la
+
+poppler_dump_SOURCES = \
+       $(top_srcdir)/utils/parseargs.cc        \
+       poppler-dump.cpp
+
+poppler_dump_LDADD = $(LDADDS)
+poppler_render_SOURCES = \
+       $(top_srcdir)/utils/parseargs.cc        \
+       poppler-render.cpp
+
+poppler_render_LDADD = $(LDADDS)
+all: all-am
+
+.SUFFIXES:
+.SUFFIXES: .cc .cpp .lo .o .obj
+$(srcdir)/Makefile.in:  $(srcdir)/Makefile.am  $(am__configure_deps)
+       @for dep in $?; do \
+         case '$(am__configure_deps)' in \
+           *$$dep*) \
+             ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
+               && { if test -f $@; then exit 0; else break; fi; }; \
+             exit 1;; \
+         esac; \
+       done; \
+       echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign cpp/tests/Makefile'; \
+       $(am__cd) $(top_srcdir) && \
+         $(AUTOMAKE) --foreign cpp/tests/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+       @case '$?' in \
+         *config.status*) \
+           cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+         *) \
+           echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+           cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+       esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+       cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure:  $(am__configure_deps)
+       cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4):  $(am__aclocal_m4_deps)
+       cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(am__aclocal_m4_deps):
+
+clean-noinstPROGRAMS:
+       @list='$(noinst_PROGRAMS)'; test -n "$$list" || exit 0; \
+       echo " rm -f" $$list; \
+       rm -f $$list || exit $$?; \
+       test -n "$(EXEEXT)" || exit 0; \
+       list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \
+       echo " rm -f" $$list; \
+       rm -f $$list
+poppler-dump$(EXEEXT): $(poppler_dump_OBJECTS) $(poppler_dump_DEPENDENCIES) $(EXTRA_poppler_dump_DEPENDENCIES) 
+       @rm -f poppler-dump$(EXEEXT)
+       $(AM_V_CXXLD)$(CXXLINK) $(poppler_dump_OBJECTS) $(poppler_dump_LDADD) $(LIBS)
+poppler-render$(EXEEXT): $(poppler_render_OBJECTS) $(poppler_render_DEPENDENCIES) $(EXTRA_poppler_render_DEPENDENCIES) 
+       @rm -f poppler-render$(EXEEXT)
+       $(AM_V_CXXLD)$(CXXLINK) $(poppler_render_OBJECTS) $(poppler_render_LDADD) $(LIBS)
+
+mostlyclean-compile:
+       -rm -f *.$(OBJEXT)
+
+distclean-compile:
+       -rm -f *.tab.c
+
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/parseargs.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/poppler-dump.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/poppler-render.Po@am__quote@
+
+.cc.o:
+@am__fastdepCXX_TRUE@  $(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
+@am__fastdepCXX_TRUE@  $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ $<
+
+.cc.obj:
+@am__fastdepCXX_TRUE@  $(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'`
+@am__fastdepCXX_TRUE@  $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
+
+.cc.lo:
+@am__fastdepCXX_TRUE@  $(AM_V_CXX)$(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
+@am__fastdepCXX_TRUE@  $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     $(AM_V_CXX)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LTCXXCOMPILE) -c -o $@ $<
+
+parseargs.o: $(top_srcdir)/utils/parseargs.cc
+@am__fastdepCXX_TRUE@  $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT parseargs.o -MD -MP -MF $(DEPDIR)/parseargs.Tpo -c -o parseargs.o `test -f '$(top_srcdir)/utils/parseargs.cc' || echo '$(srcdir)/'`$(top_srcdir)/utils/parseargs.cc
+@am__fastdepCXX_TRUE@  $(AM_V_at)$(am__mv) $(DEPDIR)/parseargs.Tpo $(DEPDIR)/parseargs.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     $(AM_V_CXX)source='$(top_srcdir)/utils/parseargs.cc' object='parseargs.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o parseargs.o `test -f '$(top_srcdir)/utils/parseargs.cc' || echo '$(srcdir)/'`$(top_srcdir)/utils/parseargs.cc
+
+parseargs.obj: $(top_srcdir)/utils/parseargs.cc
+@am__fastdepCXX_TRUE@  $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT parseargs.obj -MD -MP -MF $(DEPDIR)/parseargs.Tpo -c -o parseargs.obj `if test -f '$(top_srcdir)/utils/parseargs.cc'; then $(CYGPATH_W) '$(top_srcdir)/utils/parseargs.cc'; else $(CYGPATH_W) '$(srcdir)/$(top_srcdir)/utils/parseargs.cc'; fi`
+@am__fastdepCXX_TRUE@  $(AM_V_at)$(am__mv) $(DEPDIR)/parseargs.Tpo $(DEPDIR)/parseargs.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     $(AM_V_CXX)source='$(top_srcdir)/utils/parseargs.cc' object='parseargs.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o parseargs.obj `if test -f '$(top_srcdir)/utils/parseargs.cc'; then $(CYGPATH_W) '$(top_srcdir)/utils/parseargs.cc'; else $(CYGPATH_W) '$(srcdir)/$(top_srcdir)/utils/parseargs.cc'; fi`
+
+.cpp.o:
+@am__fastdepCXX_TRUE@  $(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
+@am__fastdepCXX_TRUE@  $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ $<
+
+.cpp.obj:
+@am__fastdepCXX_TRUE@  $(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'`
+@am__fastdepCXX_TRUE@  $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
+
+.cpp.lo:
+@am__fastdepCXX_TRUE@  $(AM_V_CXX)$(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
+@am__fastdepCXX_TRUE@  $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     $(AM_V_CXX)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LTCXXCOMPILE) -c -o $@ $<
+
+mostlyclean-libtool:
+       -rm -f *.lo
+
+clean-libtool:
+       -rm -rf .libs _libs
+
+ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
+       list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+       unique=`for i in $$list; do \
+           if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+         done | \
+         $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
+             END { if (nonempty) { for (i in files) print i; }; }'`; \
+       mkid -fID $$unique
+tags: TAGS
+
+TAGS:  $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
+               $(TAGS_FILES) $(LISP)
+       set x; \
+       here=`pwd`; \
+       list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
+       unique=`for i in $$list; do \
+           if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+         done | \
+         $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
+             END { if (nonempty) { for (i in files) print i; }; }'`; \
+       shift; \
+       if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
+         test -n "$$unique" || unique=$$empty_fix; \
+         if test $$# -gt 0; then \
+           $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+             "$$@" $$unique; \
+         else \
+           $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+             $$unique; \
+         fi; \
+       fi
+ctags: CTAGS
+CTAGS:  $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
+               $(TAGS_FILES) $(LISP)
+       list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
+       unique=`for i in $$list; do \
+           if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+         done | \
+         $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
+             END { if (nonempty) { for (i in files) print i; }; }'`; \
+       test -z "$(CTAGS_ARGS)$$unique" \
+         || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+            $$unique
+
+GTAGS:
+       here=`$(am__cd) $(top_builddir) && pwd` \
+         && $(am__cd) $(top_srcdir) \
+         && gtags -i $(GTAGS_ARGS) "$$here"
+
+distclean-tags:
+       -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+
+distdir: $(DISTFILES)
+       @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+       topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+       list='$(DISTFILES)'; \
+         dist_files=`for file in $$list; do echo $$file; done | \
+         sed -e "s|^$$srcdirstrip/||;t" \
+             -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+       case $$dist_files in \
+         */*) $(MKDIR_P) `echo "$$dist_files" | \
+                          sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+                          sort -u` ;; \
+       esac; \
+       for file in $$dist_files; do \
+         if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+         if test -d $$d/$$file; then \
+           dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+           if test -d "$(distdir)/$$file"; then \
+             find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+           fi; \
+           if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+             cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
+             find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+           fi; \
+           cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
+         else \
+           test -f "$(distdir)/$$file" \
+           || cp -p $$d/$$file "$(distdir)/$$file" \
+           || exit 1; \
+         fi; \
+       done
+check-am: all-am
+check: check-am
+all-am: Makefile $(PROGRAMS)
+installdirs:
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+       @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+       if test -z '$(STRIP)'; then \
+         $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+           install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+             install; \
+       else \
+         $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+           install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+           "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
+       fi
+mostlyclean-generic:
+
+clean-generic:
+
+distclean-generic:
+       -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+       -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
+
+maintainer-clean-generic:
+       @echo "This command is intended for maintainers to use"
+       @echo "it deletes files that may require special tools to rebuild."
+clean: clean-am
+
+clean-am: clean-generic clean-libtool clean-noinstPROGRAMS \
+       mostlyclean-am
+
+distclean: distclean-am
+       -rm -rf ./$(DEPDIR)
+       -rm -f Makefile
+distclean-am: clean-am distclean-compile distclean-generic \
+       distclean-tags
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+html-am:
+
+info: info-am
+
+info-am:
+
+install-data-am:
+
+install-dvi: install-dvi-am
+
+install-dvi-am:
+
+install-exec-am:
+
+install-html: install-html-am
+
+install-html-am:
+
+install-info: install-info-am
+
+install-info-am:
+
+install-man:
+
+install-pdf: install-pdf-am
+
+install-pdf-am:
+
+install-ps: install-ps-am
+
+install-ps-am:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+       -rm -rf ./$(DEPDIR)
+       -rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-compile mostlyclean-generic \
+       mostlyclean-libtool
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am:
+
+.MAKE: install-am install-strip
+
+.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \
+       clean-libtool clean-noinstPROGRAMS ctags distclean \
+       distclean-compile distclean-generic distclean-libtool \
+       distclean-tags distdir dvi dvi-am html html-am info info-am \
+       install install-am install-data install-data-am install-dvi \
+       install-dvi-am install-exec install-exec-am install-html \
+       install-html-am install-info install-info-am install-man \
+       install-pdf install-pdf-am install-ps install-ps-am \
+       install-strip installcheck installcheck-am installdirs \
+       maintainer-clean maintainer-clean-generic mostlyclean \
+       mostlyclean-compile mostlyclean-generic mostlyclean-libtool \
+       pdf pdf-am ps ps-am tags uninstall uninstall-am
+
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/cpp/tests/poppler-dump.cpp b/cpp/tests/poppler-dump.cpp
new file mode 100644 (file)
index 0000000..d335ff0
--- /dev/null
@@ -0,0 +1,396 @@
+/*
+ * Copyright (C) 2009-2010, Pino Toscano <pino@kde.org>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include <poppler-document.h>
+#include <poppler-embedded-file.h>
+#include <poppler-font.h>
+#include <poppler-page.h>
+#include <poppler-toc.h>
+
+#include <cstdlib>
+#include <cstring>
+#include <ctime>
+#include <iomanip>
+#include <ios>
+#include <iostream>
+#include <memory>
+#include <sstream>
+
+#include "parseargs.h"
+
+#include "config.h"
+
+static const int out_width = 30;
+
+bool show_all = false;
+bool show_info = false;
+bool show_perm = false;
+bool show_metadata = false;
+bool show_toc = false;
+bool show_fonts = false;
+bool show_embedded_files = false;
+bool show_pages = false;
+bool show_help = false;
+char show_text[32];
+poppler::page::text_layout_enum show_text_layout = poppler::page::physical_layout;
+
+static const ArgDesc the_args[] = {
+    { "--show-all",            argFlag,  &show_all,            0,
+      "show all the available information" },
+    { "--show-info",           argFlag,  &show_info,           0,
+      "show general document information" },
+    { "--show-perm",           argFlag,  &show_perm,           0,
+      "show document permissions" },
+    { "--show-metadata",       argFlag,  &show_metadata,       0,
+      "show document metadata" },
+    { "--show-toc",            argFlag,  &show_toc,            0,
+      "show the TOC" },
+    { "--show-fonts",          argFlag,  &show_fonts,          0,
+      "show the document fonts" },
+    { "--show-embedded-files", argFlag,  &show_embedded_files, 0,
+      "show the document-level embedded files" },
+    { "--show-pages",          argFlag,  &show_pages,          0,
+      "show pages information" },
+    { "--show-text",           argString, &show_text,          sizeof(show_text),
+      "show text (physical|raw) extracted from all pages" },
+    { "-h",                    argFlag,  &show_help,           0,
+      "print usage information" },
+    { "--help",                argFlag,  &show_help,           0,
+      "print usage information" },
+    { NULL, argFlag, 0, 0, NULL }
+};
+
+static void error(const std::string &msg)
+{
+    std::cerr << "Error: " << msg << std::endl;
+    std::cerr << "Exiting..." << std::endl;
+    exit(1);
+}
+
+std::ostream& operator<<(std::ostream& stream, const poppler::ustring &str)
+{
+    const poppler::byte_array ba = str.to_utf8();
+    for (unsigned int i = 0; i < ba.size(); ++i) {
+        stream << (char)(ba[i]);
+    }
+    return stream;
+}
+
+static std::string out_date(std::time_t date)
+{
+    if (date != std::time_t(-1)) {
+#ifdef HAVE_GMTIME_R
+        struct tm time;
+        gmtime_r(&date, &time);
+        struct tm *t = &time;
+#else
+        struct tm *t = gmtime(&date);
+#endif
+        char buf[32];
+        strftime(buf, sizeof(buf) - 1, "%d/%m/%Y %H:%M:%S", t);
+        return std::string(buf);
+    }
+    return std::string("n/a");
+}
+
+static std::string out_size(int size)
+{
+    if (size >= 0) {
+        std::ostringstream ss;
+        ss << size;
+        return ss.str();
+    }
+    return std::string("n/a");
+}
+
+static char charToHex(int x)
+{
+    return x < 10 ? x + '0' : x - 10 + 'a';
+}
+
+static std::string out_hex_string(const poppler::byte_array &str)
+{
+    std::string ret(str.size() * 2, '\0');
+    const char *str_p = &str[0];
+    for (unsigned int i = 0; i < str.size(); ++i, ++str_p) {
+        ret[i * 2] = charToHex((*str_p & 0xf0) >> 4);
+        ret[i * 2 + 1] = charToHex(*str_p & 0xf);
+    }
+    return ret;
+}
+
+static std::string out_page_orientation(poppler::page::orientation_enum o)
+{
+    switch (o) {
+    case poppler::page::landscape:
+        return "landscape (90)";
+    case poppler::page::portrait:
+        return "portrait (0)";
+    case poppler::page::seascape:
+        return "seascape (270)";
+    case poppler::page::upside_down:
+        return "upside_downs (180)";
+    };
+    return "<unknown orientation>";
+}
+
+static std::string out_font_info_type(poppler::font_info::type_enum t)
+{
+#define OUT_FONT_TYPE(thetype) case poppler::font_info::thetype: return #thetype
+    switch (t) {
+    OUT_FONT_TYPE(unknown);
+    OUT_FONT_TYPE(type1);
+    OUT_FONT_TYPE(type1c);
+    OUT_FONT_TYPE(type1c_ot);
+    OUT_FONT_TYPE(type3);
+    OUT_FONT_TYPE(truetype);
+    OUT_FONT_TYPE(truetype_ot);
+    OUT_FONT_TYPE(cid_type0);
+    OUT_FONT_TYPE(cid_type0c);
+    OUT_FONT_TYPE(cid_type0c_ot);
+    OUT_FONT_TYPE(cid_truetype);
+    OUT_FONT_TYPE(cid_truetype_ot);
+    }
+    return "<unknown font type>";
+#undef OUT_FONT_TYPE
+}
+
+static void print_info(poppler::document *doc)
+{
+    std::cout << "Document information:" << std::endl;
+    int major = 0, minor = 0;
+    doc->get_pdf_version(&major, &minor);
+    std::cout << std::setw(out_width) << "PDF version" << ": " << major << "." << minor << std::endl;
+    std::string permanent_id, update_id;
+    if (doc->get_pdf_id(&permanent_id, &update_id)) {
+        std::cout << std::setw(out_width) << "PDF IDs" << ": P: " << permanent_id << " - U: " << update_id << std::endl;
+    } else {
+        std::cout << std::setw(out_width) << "PDF IDs" << ": <none>" << std::endl;
+    }
+    const std::vector<std::string> keys = doc->info_keys();
+    std::vector<std::string>::const_iterator key_it = keys.begin(), key_end = keys.end();
+    for (; key_it != key_end; ++key_it) {
+        std::cout << std::setw(out_width) << *key_it << ": " << doc->info_key(*key_it) << std::endl;
+    }
+    std::cout << std::setw(out_width) << "Date (creation)" << ": " << out_date(doc->info_date("CreationDate")) << std::endl;
+    std::cout << std::setw(out_width) << "Date (modification)" << ": " << out_date(doc->info_date("ModDate")) << std::endl;
+    std::cout << std::setw(out_width) << "Number of pages" << ": " << doc->pages() << std::endl;
+    std::cout << std::setw(out_width) << "Linearized" << ": " << doc->is_linearized() << std::endl;
+    std::cout << std::setw(out_width) << "Encrypted" << ": " << doc->is_encrypted() << std::endl;
+    std::cout << std::endl;
+}
+
+static void print_perm(poppler::document *doc)
+{
+    std::cout << "Document permissions:" << std::endl;
+#define OUT_PERM(theperm) \
+    std::cout << std::setw(out_width) << #theperm << ": " \
+              << doc->has_permission(poppler::perm_##theperm) << std::endl
+    OUT_PERM(print);
+    OUT_PERM(change);
+    OUT_PERM(copy);
+    OUT_PERM(add_notes);
+    OUT_PERM(fill_forms);
+    OUT_PERM(accessibility);
+    OUT_PERM(assemble);
+    OUT_PERM(print_high_resolution);
+    std::cout << std::endl;
+#undef OUT_PERM
+}
+
+static void print_metadata(poppler::document *doc)
+{
+    std::cout << std::setw(out_width) << "Metadata" << ":" << std::endl
+              << doc->metadata() << std::endl;
+    std::cout << std::endl;
+}
+
+static void print_toc_item(poppler::toc_item *item, int indent)
+{
+    std::cout << std::setw(indent * 2) << " "
+              << "+ " << item->title() << " (" << item->is_open() << ")"
+              << std::endl;
+    poppler::toc_item::iterator it = item->children_begin(), it_end = item->children_end();
+    for (; it != it_end; ++it) {
+        print_toc_item(*it, indent + 1);
+    }
+}
+
+static void print_toc(poppler::toc *doctoc)
+{
+    std::cout << "Document TOC:" << std::endl;
+    if (doctoc) {
+        print_toc_item(doctoc->root(), 0);
+    } else {
+        std::cout << "<no TOC>" << std::endl;
+    }
+    std::cout << std::endl;
+}
+
+static void print_fonts(poppler::document *doc)
+{
+    std::cout << "Document fonts:" << std::endl;
+    std::vector<poppler::font_info> fl = doc->fonts();
+    if (!fl.empty()) {
+        std::vector<poppler::font_info>::const_iterator it = fl.begin(), it_end = fl.end();
+        const std::ios_base::fmtflags f = std::cout.flags();
+        std::left(std::cout);
+        for (; it != it_end; ++it) {
+            std::cout
+                << " " << std::setw(out_width + 10) << it->name()
+                << " " << std::setw(15) << out_font_info_type(it->type())
+                << " " << std::setw(5) << it->is_embedded()
+                << " " << std::setw(5) << it->is_subset()
+                << " " << it->file()
+                << std::endl;
+        }
+        std::cout.flags(f);
+    } else {
+        std::cout << "<no fonts>" << std::endl;
+    }
+    std::cout << std::endl;
+}
+
+static void print_embedded_files(poppler::document *doc)
+{
+    std::cout << "Document embedded files:" << std::endl;
+    std::vector<poppler::embedded_file *> ef = doc->embedded_files();
+    if (!ef.empty()) {
+        std::vector<poppler::embedded_file *>::const_iterator it = ef.begin(), it_end = ef.end();
+        const std::ios_base::fmtflags f = std::cout.flags();
+        std::left(std::cout);
+        for (; it != it_end; ++it) {
+            poppler::embedded_file *f = *it;
+            std::cout
+                << " " << std::setw(out_width + 10) << f->name()
+                << " " << std::setw(10) << out_size(f->size())
+                << " " << std::setw(20) << out_date(f->creation_date())
+                << " " << std::setw(20) << out_date(f->modification_date())
+                << std::endl
+                << "     ";
+            if (f->description().empty()) {
+                std::cout << "<no description>";
+            } else {
+                std::cout << f->description();
+            }
+            std::cout
+                << std::endl
+                << "     " << std::setw(35) << (f->checksum().empty() ? std::string("<no checksum>") : out_hex_string(f->checksum()))
+                << " " << (f->mime_type().empty() ? std::string("<no mime type>") : f->mime_type())
+                << std::endl;
+        }
+        std::cout.flags(f);
+    } else {
+        std::cout << "<no embedded files>" << std::endl;
+    }
+    std::cout << std::endl;
+}
+
+static void print_page(poppler::page *p)
+{
+    std::cout << std::setw(out_width) << "Rect" << ": " << p->page_rect() << std::endl;
+    std::cout << std::setw(out_width) << "Label" << ": " << p->label() << std::endl;
+    std::cout << std::setw(out_width) << "Duration" << ": " << p->duration() << std::endl;
+    std::cout << std::setw(out_width) << "Orientation" << ": " << out_page_orientation(p->orientation()) << std::endl;
+    std::cout << std::endl;
+}
+
+static void print_page_text(poppler::page *p)
+{
+    std::cout << p->text(p->page_rect(), show_text_layout) << std::endl;
+    std::cout << std::endl;
+}
+
+int main(int argc, char *argv[])
+{
+    if (!parseArgs(the_args, &argc, argv)
+        || argc < 2 || show_help) {
+        printUsage(argv[0], "DOCUMENT", the_args);
+        exit(1);
+    }
+
+    if (show_text[0]) {
+        if (!memcmp(show_text, "physical", 9)) {
+            show_text_layout = poppler::page::physical_layout;
+        } else if (!memcmp(show_text, "raw", 4)) {
+            show_text_layout = poppler::page::raw_order_layout;
+        } else {
+            error(std::string("unrecognized text mode: '") + show_text + "'");
+        }
+    }
+
+    std::string file_name(argv[1]);
+
+    std::auto_ptr<poppler::document> doc(poppler::document::load_from_file(file_name));
+    if (!doc.get()) {
+        error("loading error");
+    }
+    if (doc->is_locked()) {
+        error("encrypted document");
+    }
+
+    std::cout.setf(std::ios_base::boolalpha);
+
+    if (show_all) {
+        show_info = true;
+        show_perm = true;
+        show_metadata = true;
+        show_toc = true;
+        show_fonts = true;
+        show_embedded_files = true;
+        show_pages = true;
+    }
+
+    if (show_info) {
+        print_info(doc.get());
+    }
+    if (show_perm) {
+        print_perm(doc.get());
+    }
+    if (show_metadata) {
+        print_metadata(doc.get());
+    }
+    if (show_toc) {
+        std::auto_ptr<poppler::toc> doctoc(doc->create_toc());
+        print_toc(doctoc.get());
+    }
+    if (show_fonts) {
+        print_fonts(doc.get());
+    }
+    if (show_embedded_files) {
+        print_embedded_files(doc.get());
+    }
+    if (show_pages) {
+        const int pages = doc->pages();
+        for (int i = 0; i < pages; ++i) {
+            std::cout << "Page " << (i + 1) << "/" << pages << ":" << std::endl;
+            std::auto_ptr<poppler::page> p(doc->create_page(i));
+            print_page(p.get());
+        }
+    }
+    if (show_text[0]) {
+        const int pages = doc->pages();
+        for (int i = 0; i < pages; ++i) {
+            std::cout << "Page " << (i + 1) << "/" << pages << ":" << std::endl;
+            std::auto_ptr<poppler::page> p(doc->create_page(i));
+            print_page_text(p.get());
+        }
+    }
+
+    return 0;
+}
diff --git a/cpp/tests/poppler-render.cpp b/cpp/tests/poppler-render.cpp
new file mode 100644 (file)
index 0000000..b440dd4
--- /dev/null
@@ -0,0 +1,113 @@
+/*
+ * Copyright (C) 2010, Pino Toscano <pino@kde.org>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include <poppler-document.h>
+#include <poppler-image.h>
+#include <poppler-page.h>
+#include <poppler-page-renderer.h>
+
+#include <cstdlib>
+#include <iostream>
+#include <memory>
+
+#include "parseargs.h"
+
+bool show_help = false;
+bool show_formats = false;
+char out_filename[4096];
+int doc_page = 0;
+
+static const ArgDesc the_args[] = {
+    { "-f",                    argFlag,  &show_formats,        0,
+      "show supported output image formats" },
+    { "--page",                argInt,   &doc_page,            0,
+      "select page to render" },
+    { "-o",                    argString, &out_filename,       sizeof(out_filename),
+      "output filename for the resulting PNG image" },
+    { "-h",                    argFlag,  &show_help,           0,
+      "print usage information" },
+    { "--help",                argFlag,  &show_help,           0,
+      "print usage information" },
+    { NULL, argFlag, 0, 0, NULL }
+};
+
+static void error(const std::string &msg)
+{
+    std::cerr << "Error: " << msg << std::endl;
+    std::cerr << "Exiting..." << std::endl;
+    exit(1);
+}
+
+int main(int argc, char *argv[])
+{
+    if (!parseArgs(the_args, &argc, argv)
+        || (argc < 2 && !show_formats) || show_help) {
+        printUsage(argv[0], "DOCUMENT", the_args);
+        exit(1);
+    }
+
+    if (show_formats) {
+        const std::vector<std::string> formats = poppler::image::supported_image_formats();
+        std::cout << "Supported image formats:" << std::endl;
+        for (size_t i = 0; i < formats.size(); ++i) {
+            std::cout << "  " << formats[i] << std::endl;
+        }
+        exit(0);
+    }
+
+    if (!out_filename[0]) {
+        error("missing output filename (-o)");
+    }
+
+    if (!poppler::page_renderer::can_render()) {
+        error("renderer compiled without Splash support");
+    }
+
+    const std::string file_name(argv[1]);
+
+    std::auto_ptr<poppler::document> doc(poppler::document::load_from_file(file_name));
+    if (!doc.get()) {
+        error("loading error");
+    }
+    if (doc->is_locked()) {
+        error("encrypted document");
+    }
+
+    if (doc_page < 0 || doc_page >= doc->pages()) {
+        error("specified page number out of page count");
+    }
+    std::auto_ptr<poppler::page> p(doc->create_page(doc_page));
+    if (!p.get()) {
+        error("NULL page");
+    }
+
+    poppler::page_renderer pr;
+    pr.set_render_hint(poppler::page_renderer::antialiasing, true);
+    pr.set_render_hint(poppler::page_renderer::text_antialiasing, true);
+
+    poppler::image img = pr.render_page(p.get());
+    if (!img.is_valid()) {
+        error("rendering failed");
+    }
+
+    if (!img.save(out_filename, "png")) {
+        error("saving to file failed");
+    }
+
+    return 0;
+}
diff --git a/debian/changelog b/debian/changelog
new file mode 100644 (file)
index 0000000..7544a0a
--- /dev/null
@@ -0,0 +1,983 @@
+poppler (0.20.4-8) unstable; urgency=low
+
+  * Smack manifest updated
+  * Git: external/poppler
+  * Tag: poppler_0.20.4-8
+
+ -- GangHeok Kim <gangheok.kim@samsung.com>  Thu, 21 Feb 2013 18:04:07 +0900
+
+poppler (0.20.4-7) unstable; urgency=low
+
+  * SMACK rules updated
+  * Git: external/poppler
+  * Tag: poppler_0.20.4-7
+
+ -- Danny Jeongseok Seo <s.seo@samsung.com>  Thu, 14 Feb 2013 21:59:37 +0900
+
+poppler (0.20.4-6) unstable; urgency=low
+
+  * Smack rule updated
+  * Git: external/poppler
+  * Tag: poppler_0.20.4-6
+
+ -- GangHeok Kim <gangheok.kim@samsung.com>  Fri, 01 Feb 2013 18:13:11 +0900
+
+poppler (0.20.4-5slp2) unstable; urgency=low
+
+  * Enabled poppler-cpp library
+  * Git: slp/pkgs/p/poppler
+  * Tag: poppler_0.20.4-5slp2
+
+ -- GangHeok Kim <gangheok.kim@samsung.com>  Mon, 10 Dec 2012 20:17:47 +0900
+
+poppler (0.20.4-4slp2) unstable; urgency=low
+
+  * Changed libjpeg-devel to libjpeg-turbo-devel
+  * Git: slp/pkgs/p/poppler
+  * Tag: poppler_0.20.4-4slp2
+
+ -- GangHeok Kim <gangheok.kim@samsung.com>  Wed, 31 Oct 2012 11:32:48 +0900
+
+poppler (0.20.4-3slp2) unstable; urgency=low
+
+  * Added license file
+  * Git: slp/pkgs/p/poppler
+  * Tag: poppler_0.20.4-3slp2
+
+ -- GangHeok Kim <gangheok.kim@samsung.com>  Thu, 11 Oct 2012 18:30:48 +0900
+
+poppler (0.20.4-2slp2) unstable; urgency=low
+
+  * Added default manifest file
+  * Git: slp/pkgs/p/poppler
+  * Tag: poppler_0.20.4-2slp2
+
+ -- GangHeok Kim <gangheok.kim@samsung.com>  Fri, 21 Sep 2012 13:25:34 +0900
+
+poppler (0.20.4-1slp2) unstable; urgency=low
+
+  * Fixed pdftops crash in case of "EndSetup comment is missing".
+  * Git: slp/pkgs/p/poppler
+  * Tag: poppler_0.20.4-1slp2
+
+ -- GangHeok Kim <gangheok.kim@samsung.com>  Wed, 19 Sep 2012 20:32:24 +0900
+
+poppler (0.20.0-6slp2) unstable; urgency=low
+
+  * Fixed build error that there are duplicate files
+  * Git: slp/pkgs/p/poppler
+  * Tag: poppler_0.20.0-6slp2
+
+ -- GangHeok Kim <gangheok.kim@samsung.com>  Fri, 17 Aug 2012 18:15:40 +0900
+
+poppler (0.20.0-5slp2) unstable; urgency=low
+
+  * Added SR Note
+  * Git: slp/pkgs/p/poppler
+  * Tag: poppler_0.20.0-5slp2
+
+ -- GangHeok Kim <gangheok.kim@samsung.com>  Tue, 14 Aug 2012 10:56:57 +0900
+
+poppler (0.20.0-4slp2) unstable; urgency=low
+
+  * Added to remove RPM_BUILD_ROOT before makeinstall
+  * Git: slp/pkgs/p/poppler
+  * Tag: poppler_0.20.0-4slp2
+
+ -- GangHeok Kim <gangheok.kim@samsung.com>  Thu, 02 Aug 2012 08:53:36 +0900
+
+poppler (0.20.0-3slp2) unstable; urgency=low
+
+  * Fixed build error caused in finding libpoppler library
+  * Git: slp/pkgs/p/poppler
+  * Tag: poppler_0.20.0-3slp2
+
+ -- GangHeok Kim <gangheok.kim@samsung.com>  Thu, 02 Aug 2012 08:20:15 +0900
+
+poppler (0.20.0-2slp2) unstable; urgency=low
+
+  * Fixed "usr/lib/rpm/check-buildroot" build-error in exynos taget
+  * Git: slp/pkgs/p/poppler
+  * Tag: poppler_0.20.0-2slp2
+
+ -- GangHeok Kim <gangheok.kim@samsung.com>  Wed, 18 Jul 2012 22:55:22 +0900
+
+poppler (0.20.0-1slp2) unstable; urgency=low
+
+  * Update to version 0.20.0 from 0.18.4
+  * Git: slp/pkgs/p/poppler
+  * Tag: poppler_0.20.0-1slp2
+
+ -- GangHeok Kim <gangheok.kim@samsung.com>  Wed, 18 Jul 2012 21:32:42 +0900
+
+poppler (0.18.4-1ubuntu2) precise; urgency=low
+
+  * debian/control: Add back libfontconfig1-dev dependency to libpoppler-dev
+    for the time being, to avoid introducing FTBFS at this point. This will be
+    dropped again later on when all reverse dependencies have their build deps
+    fixed. Thanks Pino Toscano for pointing this out!
+
+ -- Martin Pitt <martin.pitt@ubuntu.com>  Mon, 27 Feb 2012 08:56:28 +0100
+
+poppler (0.18.4-1ubuntu1) precise; urgency=low
+
+  * Merge with Debian experimental to get in sync with current Debian
+    packaging. Remaining Ubuntu changes:
+    - debian/control: Lower poppler-data to Suggests:. Too big for CD images,
+      handled by language-selector.
+    - debian/control: Drop libopenjpeg-dev build depends, it's in universe.
+    - 10_fix-a4-page-shift-on-brother-ps-printers.patch,
+      git_test_rotation.patch: See patch headers.
+    - Use LCMS 2 instead of deprecated 1: (LP #885324)
+      o Add poppler-lcm2.patch
+      o debian/control: Build-depend on liblcms2-dev instead.
+
+ -- Martin Pitt <martin.pitt@ubuntu.com>  Tue, 21 Feb 2012 15:04:08 +0100
+
+poppler (0.18.4-1) experimental; urgency=low
+
+  * New upstream release.
+  * Update copyright.
+
+ -- Pino Toscano <pino@debian.org>  Sat, 18 Feb 2012 20:22:17 +0100
+
+poppler (0.18.3-1) experimental; urgency=low
+
+  * New upstream release: (Closes: #644447)
+    - fixes rendering of Porirua City overview map. (Closes: #443547)
+    - shows the names of unknown fonts. (Closes: #524323)
+  * Rename packages according to the new SONAMEs:
+    - libpoppler13 -> libpoppler19
+    - libpoppler-glib6 -> libpoppler-glib8
+  * Bump shlibs for libpoppler-glib8 and libpoppler-qt4-3.
+  * debian/patches:
+    - ltmain-as-needed.diff: refresh
+  * Update copyright.
+  * Update configure arguments:
+    - Remove: --disable-poppler-qt, --disable-abiword-output
+  * Drop test-poppler-glib from libpoppler-glib-dev, as it does not exist
+    anymore.
+  * Update build dependencies, dependencies and suggests:
+    - Switch liblcms-dev to liblcms1-dev, to make it explicit lcms 1 is used.
+    - Add libtiff-dev (for TIFF support).
+    - Remove the gnome-pkg-tools B-D, unused.
+    - libpoppler-dev: remove libfontconfig1-dev.
+    - libpoppler-private-dev: suggest packages containing headers included in
+      barely used private poppler core headers: libfreetype6-dev,
+      libopenjpeg-dev, libpng-dev, libtiff-dev. (Closes: #646688)
+    - libpoppler-glib-dev: remove libgtk2.0-dev.
+  * Enable the GObject introspection support (Closes: #617604):
+    - Add libgirepository1.0-dev and gobject-introspection build dependencies.
+    - Add a new package gir1.2-poppler-0.18, and make libpoppler-glib-dev
+      depend on it.
+    - Enable the introspection in configure arguments.
+  * Improve description of poppler-utils, also including the new tools
+    (pdfseparate, pdftocairo, pdfunite).
+  * Convert convert to the `dh' sequencer:
+    - Drop cdbs build dependency.
+    - Bump debhelper build dependency to 7.0.50.
+    - Make use of the gir dh addon.
+    - Enable parallel build support.
+  * Remove ${shlibs:Depends} from poppler-dbg.
+  * Install the upstream ChangeLog only in the libpopplerN package.
+  * Convert to multi-arch:
+    - Bump debhelper build dependency to 8.9.0.
+    - Bump compat to 9.
+    - Add dpkg build dependency to 1.16.1.
+    - libpoppler19, libpoppler-glib8, libpoppler-qt4-3, libpoppler-cpp0:
+      mark "Multi-Arch: same", and add Pre-Depends.
+    - poppler-utils: mark "Multi-Arch: foreign".
+    - Fix (using wildcard) library paths in .install files, taking care of
+      installing the gir .typelib file in a non-multi-arch path.
+  * Use DEB_LDFLAGS_MAINT_APPEND in rules to properly append custom LDFLAGS.
+    (Closes: #651968)
+  * Make the build verbose (V=1).
+
+ -- Pino Toscano <pino@debian.org>  Sun, 12 Feb 2012 22:49:35 +0100
+
+poppler (0.16.7-3) unstable; urgency=low
+
+  [ Michael Gilbert ]
+  * Bump standards to 3.9.2.
+  * Remove automatically generated glib reference files in clean rule (this
+    prevents automatic generation of a debian patch on a second build run.
+
+  [ Pino Toscano ]
+  * Switch to my @debian.org address, I'm a DD now.
+  * Add a libpoppler-private-dev package: it will contain the private
+    poppler core headers, but at the moment it is empty to allow sources
+    to migrate their (build-)dependencies from libpoppler-dev to it.
+  * control: add Vcs-Browser and Vcs-Git headers.
+  * control: fix some of the conflict/replaces relations in poppler-utils:
+    - xpdf-utils: properly set the version for it, and turn into a
+      breaks/replaces (see also #586620)
+    - pdftohtml: remove the version, since any newer version would always
+      conflict with the one in poppler-utils
+
+ -- Pino Toscano <pino@debian.org>  Fri, 10 Feb 2012 23:59:28 +0100
+
+poppler (0.16.7-2) unstable; urgency=low
+
+  * Upload to unstable.
+
+ -- Pino Toscano <pino@kde.org>  Fri, 01 Jul 2011 22:29:43 +0200
+
+poppler (0.16.7-1) experimental; urgency=low
+
+  * New upstream release.
+  * Make sure to really disable the gobject introspection for configure.
+  * Few touches to descriptions:
+    - Fix typo in libpoppler-cpp0.
+    - Correctly capitalize "Xpdf".
+  * Update copyright.
+  * Enable as-needed linking:
+    - Import the ltmain-as-needed.diff (refreshed) patch to allow to pass
+      -Wl,--as-needed at the beginning of autotools linking lines
+    - set LDFLAGS to "-Wl,--as-needed"
+  * Drop abiword support, buggy and dropped in Poppler 0.18:
+    (Closes: #521456, #618634)
+    - rules: add --disable-abiword-output
+    - control: remove the libxml2-dev build-dependency and the pdftoabw
+      references in the poppler-utils description
+    - drop patch 03_CVE-2009-3938.patch, no more needed now
+    - drop pdftoabw.1 manpage
+    - libpoppler-dev.install: stop installing ABWOutputDev.h
+
+ -- Pino Toscano <pino@kde.org>  Fri, 01 Jul 2011 00:47:07 +0200
+
+poppler (0.16.3-1) experimental; urgency=low
+
+  [ Pino Toscano ]
+  * New upstream release: (Closes: #567817, #585434, #592534, #601179, #611874)
+    - fixes thread-unsafe usage of strtok(). (Closes: #533426)
+    - pdftohtml correctly rotates images. (Closes: #506785)
+    - pdftoppm tests correctly for rotation. (Closes: #614831)
+    - fixes text highlighting. (Closes: #463963)
+    - fixes image rescaling with cairo. (Closes: #533138)
+    - fixes/hides some "Illegal entry in bfrange block in ToUnicode CMap"
+      errors. (Closes: #578050)
+    - fixes a pdftotext crash. (Closes: #611124)
+  * Update patches:
+    - 01_revert_abi_change.patch: remove, obsolete
+    - 02_autohinting_abi_compatibility.patch: remove, obsolete
+    - 03_CVE-2009-3938.patch: add two DEP3 headers (with bug number)
+    - 04_security.patch: remove, applied upstream
+  * Drop Qt 3 frontend, unused in Debian (and will no more be provided with
+    Poppler 0.18). (Closes: #604370, #558951)
+  * Rename packages according to the new SONAMEs:
+    - libpoppler5 -> libpoppler13
+    - libpoppler-glib4 -> libpoppler-glib6
+  * Update shlib depends for libpoppler-qt4-3.
+  * Add packages for the new CPP frontend (libpoppler-cpp0).
+  * Update build-dependencies and dependencies:
+    - Bump libglib2.0-dev, libcairo2-dev, gtk-doc-tools, and libqt4-dev
+      to the versions required upstream.
+    - Remove obsolete B-D: libqt3-mt-dev, libglade2-dev.
+    - libpoppler-glib-dev: add libgtk2.0-dev (Closes: #540582), remove
+      libpango1.0-dev.
+  * Update configure arguments:
+    - Add: --enable-xpdf-headers
+    - Remove: --enable-a4-paper
+  * Update copyright, adding a small clarifying text that the Poppler license
+    is GPL v2 only. (Closes: #611259)
+  * Bump debhelper compatibility to 7:
+    - Update .install files accordingly.
+  * libpoppler-dev.install: Avoid installing all the poppler private headers
+    (even those that will not work), but rely on what poppler installs
+    and manually copy the few "useful".
+  * rules: include /usr/share/cdbs/1/rules/utils.mk for list-missing.
+  * Add myself to the Uploaders.
+  * Add Homepage field in control.
+  * Improve descriptions of most of the packages.
+
+  [ Michael Gilbert ]
+  * Recommend poppler-data (closes: #584503).
+  * Fix a typo (closes: #582527).
+  * Update to source format 3.0 (quilt).
+    - Drop explicit quilt dependency.
+  * Bump standards version to 3.8.4 (no changes required).
+  * Add copyright dates to copyright file as stated in README-XPDF.
+  * Add manpage for pdftoabw (closes: #505147).
+
+ -- Josselin Mouette <joss@debian.org>  Thu, 03 Mar 2011 22:14:46 +0100
+
+poppler (0.12.4-1.2) unstable; urgency=medium
+
+  * Non-maintainer upload by the Security Team
+  * Fix CVE-2010-3702, CVE-2010-3703, CVE-2010-3704 and several crashers
+    (Closes:#599165)
+
+ -- Moritz Mühlenhoff <jmm@debian.org>  Sat, 23 Oct 2010 15:59:04 +0200
+
+poppler (0.12.4-1.1) unstable; urgency=high
+
+  * Non-maintainer upload.
+  * Do not conflict with newer versions of xpdf-utils (closes: #586620).
+
+ -- Michael Gilbert <michael.s.gilbert@gmail.com>  Fri, 06 Aug 2010 18:51:54 -0400
+
+poppler (0.12.4-1) unstable; urgency=low
+
+  * New upstream release.
+  * Bump Qt requirements.
+
+ -- Josselin Mouette <joss@debian.org>  Fri, 16 Apr 2010 19:22:34 +0200
+
+poppler (0.12.2-2.1) unstable; urgency=high
+
+  * Non-maintainer upload by the Security Team.
+  * Fixed CVE-2009-3938 (Closes: #534680)
+
+ -- Giuseppe Iuculano <iuculano@debian.org>  Tue, 22 Dec 2009 16:11:27 +0100
+
+poppler (0.12.2-2) unstable; urgency=low
+
+  * Switch to quilt to manage patches.
+  * 01_revert_abi_change.patch: revert upstream commit that introduced 
+    an ABI change in a stable release. Closes: #558463.
+  * 02_autohinting_abi_compatibility.patch: revert part of another 
+    upstream commit for a similar reason.
+
+ -- Josselin Mouette <joss@debian.org>  Mon, 30 Nov 2009 16:51:53 +0100
+
+poppler (0.12.2-1) unstable; urgency=low
+
+  * New upstream release.
+
+ -- Josselin Mouette <joss@debian.org>  Sat, 28 Nov 2009 13:24:28 +0100
+
+poppler (0.12.0-2.1) unstable; urgency=low
+
+  * Non-maintainer upload.
+  * Include fofi/*.h in /usr/include/poppler/fofi. Closes: #553445.
+
+ -- Matt Kraai <kraai@debian.org>  Tue, 10 Nov 2009 19:51:32 -0800
+
+poppler (0.12.0-2) unstable; urgency=low
+
+  * copyright: add complete list of copyright holders.
+  * Upload to unstable. Hold on to your pants.
+
+ -- Josselin Mouette <joss@debian.org>  Sat, 17 Oct 2009 10:48:03 +0200
+
+poppler (0.12.0-1) experimental; urgency=low
+
+  * New upstream release. Closes: #530731.
+  * Rename libpoppler4 to libpoppler5.
+  * Bump shlibs versions.
+
+ -- Josselin Mouette <joss@debian.org>  Thu, 24 Sep 2009 16:39:17 +0200
+
+poppler (0.10.6-1) unstable; urgency=critical
+
+  * Fix section for the debug package.
+  * New upstream release.
+    + Fix problems that happen when parsing broken JBIG2 files.
+      CVE-2009-0799, CVE-2009-0800, CVE-2009-1179, CVE-2009-1180,
+      CVE-2009-1181, CVE-2009-1182, CVE-2009-1183, CVE-2009-1187, 
+      CVE-2009-1188.
+  * Bump libqt4 requirement.
+  * 10_jpxstream_int_crash.patch: removed, upstream has merged a 
+    different fix quite a while ago.
+  * Standards version is 3.8.1.
+
+ -- Josselin Mouette <joss@debian.org>  Wed, 01 Apr 2009 18:30:04 +0200
+
+poppler (0.10.5-1) unstable; urgency=low
+
+  [ Pino Toscano ]
+  * New upstream release, no API nor ABI changes.
+    + Fixes crash when rendering documents with optional content.
+      (Closes: #519494)
+  * Remove lintian override for poppler-dbg, which is no more needed with
+    lintian >= 2.2.1.
+
+ -- Josselin Mouette <joss@debian.org>  Wed, 01 Apr 2009 15:19:53 +0200
+
+poppler (0.10.4-3) unstable; urgency=low
+
+  * Revert previous upload, now openjpeg was built successfully on 
+    alpha.
+  * Build-depend on libglib2.0-doc to ensure proper xrefs.
+
+ -- Josselin Mouette <joss@debian.org>  Tue, 10 Mar 2009 12:03:06 +0100
+
+poppler (0.10.4-2) unstable; urgency=low
+
+  * Don’t require openjpeg on alpha, since it doesn’t build there.
+
+ -- Josselin Mouette <joss@debian.org>  Sun, 08 Mar 2009 03:33:50 +0100
+
+poppler (0.10.4-1) unstable; urgency=low
+
+  [ Pino Toscano ]
+  * New upstream stable release, with ABI and API changes wrt poppler 0.8.
+    - Rename libpoppler3 to libpoppler4, libpoppler-glib3 to libpoppler-glib4;
+      libpoppler-qt2 and libpoppler-qt4-3 are not renamed; update control,
+      DEB_DH_MAKESHLIBS_ARGS_* in rules, and rename install files.
+    - Add shlib version for libpoppler-qt4-3.
+    - Drop patches 60_manpages-cfg-flag.patch, 61_manpages-hyphens.patch, and
+      62_pdftops-mandatory-arg.patch, merged upstream.
+  * Build-dep on libopenjpeg-dev for better JPEG2000 reading.
+
+  [ Josselin Mouette ]
+  * Build-depend explicitly on libjpeg-dev, libfreetype6-dev and 
+    libxml2-dev.
+  * Bump requirement on libqt4-dev.
+
+ -- Josselin Mouette <joss@debian.org>  Fri, 06 Mar 2009 12:54:09 +0100
+
+poppler (0.8.7-1) unstable; urgency=low
+
+  * Bump up Standards-Version to 3.8.0.
+  * New patch, 61_manpages-hyphens, fixes escaping of hyphens in man pages;
+    FreeDesktop #17225.
+  * New patch, 62_pdftops-mandatory-arg, fixes synopsis of pdftops in man page
+    to clarify that a PDF file is required in all cases; FreeDesktop #17226;
+    closes: #491816.
+  * Build-dep on cdbs (>= 0.4.52) and add a lintian override with rationale
+    for the following lintian warning:
+    W: poppler-dbg: dbg-package-missing-depends poppler
+  * Add xrefs and CVE for #489756 in 0.8.5-1 as I didn't merge the 0.8.4-1.1
+    NMU.
+  * New upstream release; no API change, bug fixes.
+
+ -- Loic Minier <lool@dooz.org>  Wed, 20 Aug 2008 17:36:12 +0200
+
+poppler (0.8.6-1) unstable; urgency=low
+
+  * Fix /usr/share/gtk-doc/html/poppler symlink to point at
+    /usr/share/doc/libpoppler-glib-dev/html/poppler instead of
+    /usr/share/doc/libpoppler-glib-dev/html; LP: #226677.
+  * New upstream stable release; bug fixes, no API change.
+  * New patch, 60_manpages-cfg-flag, drop unimplemented -cfg flag from man
+    pages; FreeDesktop #17222; closes: #461961.
+  * Rename patch 001_jpxstream_int_crash to 10_jpxstream_int_crash as we don't
+    have that many patches; also add upstream bug id (FreeDesktop #5667) and
+    refresh to apply cleanly.
+  * Build-dep on pkg-config >= 0.18 to make sure -lpoppler is only in
+    poppler-qt's Libs.private (it already is though); closes: #360595.
+
+ -- Loic Minier <lool@dooz.org>  Fri, 01 Aug 2008 15:04:05 +0200
+
+poppler (0.8.5-1) unstable; urgency=low
+
+  * New upstream release; no API changes, misc fixes.
+    - Initializes pageWidgets in Page.cc, otherwise it can be a rubbish
+      pointer as Annots is not a valid object; upstream commit
+      fd0bf8b05cb155e2f29df31fa01964b12e710b89; CVE-2008-2950;
+      closes: #489756.
+
+ -- Loic Minier <lool@dooz.org>  Wed, 30 Jul 2008 14:52:42 +0200
+
+poppler (0.8.4-1) unstable; urgency=low
+
+  * New upstream release; no API change.
+    - Fixes crash when reloading PDFs; GNOME #536482; closes: 484160.
+
+ -- Loic Minier <lool@dooz.org>  Mon, 30 Jun 2008 10:44:16 +0200
+
+poppler (0.8.3-1) unstable; urgency=low
+
+  * New upstream release. Closes: #487214.
+    + Fix crasher with some PDF files. Closes: #484224.
+
+ -- Josselin Mouette <joss@debian.org>  Wed, 25 Jun 2008 16:40:39 +0200
+
+poppler (0.8.2-2) unstable; urgency=low
+
+  * Upload to unstable.
+  * Set myself as Maintainer instead of Uploader, taking over from Ondřej Surý
+    but I wish we move to an official team; closes: #481323.
+
+ -- Loic Minier <lool@dooz.org>  Thu, 15 May 2008 12:33:18 +0200
+
+poppler (0.8.2-1) experimental; urgency=low
+
+  * New upstream releases.
+    - Drop patch 006_pthreads_ldflags, upstream now calls ACX_PTHREAD() in
+      configure.ac which does the right thing.
+    - Drop patch 102_embedded-font-fixes, merged upstream.
+
+ -- Loic Minier <lool@dooz.org>  Sun, 11 May 2008 01:02:22 +0200
+
+poppler (0.8.0-1) experimental; urgency=low
+
+  * Bump libcairo2-dev build-dep and dep to >= 1.4; thanks
+    Marc 'HE' Brockschmidt.
+  * New upstream stable release, with ABI and API changes; closes: #476323.
+    - Rename libpoppler2 to libpoppler3, libpoppler-glib2 to libpoppler-glib3,
+      and libpoppler-qt4-2 to libpoppler-qt4-3; NB: libpoppler-qt2 not
+      renamed; update control, DEB_DH_MAKESHLIBS_ARGS_* in rules, rename
+      install files.
+    - Drop shlib version except for libpoppler-qt2.
+    - Update patch 006_pthreads_ldflags for the version-info changes in
+      poppler/Makefile.am.
+    - Force usage of qt4's moc via a PATH setting; export PATH.
+  * Let libpoppler-glib-dev depend on libglib2.0-dev >= 2.6 for consistency
+    with build-deps.
+  * New patch, 102_embedded-font-fixes; protects the methods of the Object
+    class to be more robust and prevent things like CVE-2008-1693; see also
+    FreeDesktop/Poppler #11392; taken from the Ubuntu package;
+    closes: #476842.
+  * Add a poppler-dbg package; closes: #408403.
+    - Bump up cdbs build-dep to >= 0.4.51 for -dbg handling fixes.
+    - Add poppler-dbg to control.
+
+ -- Loic Minier <lool@dooz.org>  Mon, 17 Mar 2008 21:00:13 +0100
+
+poppler (0.6.4-1) unstable; urgency=medium
+
+  * Add ${shlibs:Depends} to libpoppler-glib-dev, libpoppler-dev,
+    libpoppler-qt-dev, libpoppler-qt4-dev.
+  * Add ${misc:Depends}.
+  * Cleanups.
+  * New upstream releases; no API change; bug fixes; closes: #459342.
+  * Fix copyright information to use version 2 of the GPL (instead of version 2
+    or later); thanks Timo Jyrinki for the patch; closes: #453865.
+  * Urgency medium for RC bug fix.
+  * List pdftohtml in poppler-utils' description; closes: #464439.
+  * Drop libpoppler-qt-dev dependency from libpoppler-qt4-dev; thanks
+    Pino Toscano; closes: #459922.
+  * Bump up Standards-Version to 3.7.3.
+
+ -- Loic Minier <lool@dooz.org>  Fri, 18 Jan 2008 13:35:06 +0100
+
+poppler (0.6.2-1) unstable; urgency=low
+
+  * New upstream version. (Closes: #447992)
+  * Dependency on xpdfrc was removed on 2007-02-25 (Closes: #347789, #440936)
+  * Changes since 0.6.1:
+    - Fix CVE-2007-4352, CVE-2007-5392 and CVE-2007-5393 (Closes: #450628)
+    - Fix a crash on documents with wrong CCITTFaxStream
+    - Fix a crash in the Cairo renderer with invalid embedded fonts
+    - Fix a crash with invalid TrueType fonts
+    - Check if font is inside the clip area before rendering
+      it to a temporary bitmap in the Splash renderer. Fixes crashes on
+      incorrect documents
+    - Do not use exit(1) on DCTStream errors
+    - Detect form fields at any depth level
+    - Do not generate appearance stream for radio buttons that are not active
+
+ -- Ondřej Surý <ondrej@debian.org>  Wed, 14 Nov 2007 11:20:07 +0100
+
+poppler (0.6.1-2) unstable; urgency=low
+
+  * Upload to unstable.
+
+ -- Ondřej Surý <ondrej@debian.org>  Tue, 06 Nov 2007 09:07:10 +0100
+
+poppler (0.6.1-1) experimental; urgency=low
+
+  * New upstream version.
+  * Changes since 0.6.0:
+    - poppler core:
+      + Fix printing with different x and y scale
+      + Fix crash when Form Fields array contains references to non
+        existent objects
+      + Fix crash in CairoOutputDev::drawMaskedImage()
+      + Fix embedded file description not working on some cases
+    - Qt4 frontend:
+      + Fix printing issue
+      + Avoid double free
+      + Fix memory leak when dealing with embedded files
+    - glib frontend:
+      + Fix build with --disable-cairo-output
+      + Do not return unknown field type for signature form fields
+    - build system:
+      + Support automake-1.10
+      + More compatible sh code in qt.m4
+    - utils:
+      + Fix build on Sun Studio compiler
+
+ -- Ondřej Surý <ondrej@debian.org>  Thu, 25 Oct 2007 11:33:04 +0200
+
+poppler (0.6-1) experimental; urgency=low
+
+  * New upstream release. (Closes: #429700)
+    - merged changes from Ubuntu, courtesy of Sebastien Bacher <seb128@canonical.com>
+    - Fix security issue MOAB-06-01-2007
+    - Fix security issue CVE-2007-3387
+    - Fix security issue CVE-2007-5049 (Closes: #443903)
+  * debian/watch:
+    - update (Closes: #441012)
+  * debian/control, debian/libpoppler2.install, debian/libpoppler-glib2.install,
+    debian/libpoppler-qt2.install, debian/libpoppler-qt4-2.install,
+    debian/rules:
+    - updated for soname change
+  * debian/libpoppler-glib-dev.install:
+    - install new test-poppler-glib
+  * debian/patches/002_CVE-2006-0301.patch:
+    - dropped, deprecated by the upstream changes
+  * debian/patches/003_glib-2.0-configure.patch:
+  * debian/patches/004_CVE-2007-0104.patch:
+  * debian/patches/005_fix_inverted_text_from_bug_8944.patch:
+    - dropped, fixed with the new version
+  * debian/patches/006_pthreads_ldflags.patch:
+    - updated
+
+ -- Ondřej Surý <ondrej@debian.org>  Thu, 27 Sep 2007 09:03:33 +0200
+
+poppler (0.5.4-6) unstable; urgency=low
+
+  * Conflict with old library names from experimental.  (Closes: #426023)
+
+ -- Ondřej Surý <ondrej@debian.org>  Wed, 30 May 2007 08:42:32 +0200
+
+poppler (0.5.4-5) unstable; urgency=low
+
+  * Add missing poppler/poppler-link-qt3.h header to libpoppler-qt-dev; thanks
+    Sune Vuorela; closes: #425486.
+  * Let libpoppler-qt4-dev depend on libpoppler-qt-dev since some of its
+    headers require poppler-page-transition.h which is clearly from the Qt
+    bindings; thanks Sune Vuorela; closes: #425540.
+  * Wrap build-deps and deps.
+  * Drop useless debian/*.dirs.
+  * Misc cleanups.
+  * Build-dep on autotools-dev and drop bogus lintian overrides.
+
+ -- Loic Minier <lool@dooz.org>  Thu, 24 May 2007 23:09:23 +0200
+
+poppler (0.5.4-4) unstable; urgency=low
+
+  * The "Augean Stables" release.
+  * 0.5.x branch fixes all kind of displaying errors
+    Closes: #372169, #235360, #331380, #332426, #336616
+    Closes: #402647, #369164, #413953, #343654
+  * Add versioned conflict to pdftohtml (Closes: #393169)
+  * We dropped .la files some time ago, libjpeg62-dev dependency not
+    needed now (Closes: #413112)
+  * Crash fixed in 0.5.4 (Closes: #418638)
+  * [control.in]: dropped some time ago (Closes: #407818)
+  * NMU 0.5.4-5.1 merged as 004_CVE-2007-0104.patch (Closes: #407810)
+  * 0.5.x uploaded to unstable (Closes: #352522)
+  * qt4 libraries are now part of build (Closes: #414643)
+  * No longer depends on poppler-data (Closes: #389753)
+  * [debian/patches/006_pthreads_ldflags.patch]:
+    + Add -lpthread to poppler/Makefile.am (Closes: #399275)
+
+ -- Ondřej Surý <ondrej@debian.org>  Wed, 16 May 2007 10:45:39 +0200
+
+poppler (0.5.4-3) unstable; urgency=low
+
+  * Upload to unstable.
+  * Enable Cairo output again.
+  * Enable gtk-doc build.
+  * Add lintian override for outdated-autotools-helper-files (we use CDBS).
+  * Change shared library packages names according to Library Packaging Guide.
+  * Change ${Source-Version} to ${binary:Version} to allow binNMU
+  * Drop (= ${Source-Version}) dependency in glib, qt3, qt4 libraries; we are
+    adding that from debian/rules
+  * Merge changes from Ubuntu:
+    + Enable Qt4 library build (but change name to libpoppler-qt4-1).
+    + [debian/patches/004_CVE-2007-0104.patch]:
+      - Limit recursion depth of the parsing tree to 100 to avoid infinite loop
+        with crafted documents.
+      - Patch taken from koffice security update (which has a copy of xpdf
+        sources).
+    + [debian/patches/005_fix_inverted_text_from_bug_8944.patch]:
+      - fixes "text is inverted in some PDFs"
+
+ -- Ondřej Surý <ondrej@debian.org>  Wed, 16 May 2007 08:26:47 +0200
+
+poppler (0.5.4-2) experimental; urgency=low
+
+  * [debian/control]: poppler-data is non-free, do not depend on it (Closes: #389753)
+
+ -- Ondřej Surý <ondrej@debian.org>  Mon,  2 Oct 2006 14:41:58 +0200
+
+poppler (0.5.4-1) experimental; urgency=low
+
+  * New upstrem release.
+  * [debian/control.in]: remove file and add all pkg-freedesktop people
+    to Uploaders: field
+  * [debian/control]: Add dependency on poppler-data package.
+  * [debian/patches/03_glib-2.0-configure.patch]: fix broken configure.ac
+
+ -- Ondřej Surý <ondrej@debian.org>  Fri, 22 Sep 2006 16:49:17 +0200
+
+poppler (0.5.3-1) experimental; urgency=low
+
+  * New upstream release.
+  * debian/lib{poppler,poppler-glib,poppler-qt}-dev.install:
+    Stop shipping /usr/lib/*.la in libpoppler*-dev.
+
+ -- Ondřej Surý <ondrej@debian.org>  Wed, 31 May 2006 17:19:34 +0200
+
+poppler (0.5.2-1) experimental; urgency=low
+
+  * New upstream release.
+  * Remove patches adopted upstream:
+    debian/patches/000_incorrect_define_fix.patch
+    debian/patches/000_splash_build_fix.patch
+
+ -- Ondřej Surý <ondrej@debian.org>  Tue, 23 May 2006 20:21:30 +0200
+
+poppler (0.5.1-1) experimental; urgency=low
+
+  * Merge back changes from Ubuntu.
+  * Upload to experimental (Closes: 352522)
+
+ -- Ondřej Surý <ondrej@debian.org>  Tue, 18 Apr 2006 15:08:26 +0200
+
+poppler (0.5.1-0ubuntu6) dapper; urgency=low
+
+  * Install poppler-page-transition into libpoppler-qt-dev (not
+    libpoppler-dev), since it comes from the Qt bindings. Closes: LP#32179
+
+ -- Martin Pitt <martin.pitt@ubuntu.com>  Mon, 10 Apr 2006 12:20:46 +0200
+
+poppler (0.5.1-0ubuntu5) dapper; urgency=low
+
+  * debian/patches/000_incorrect_define_fix.patch:
+    - patch from the CVS, fix an incorrect boxes rendering (Ubuntu: #33239)
+
+ -- Sebastien Bacher <seb128@canonical.com>  Thu, 23 Mar 2006 12:33:17 +0100
+
+poppler (0.5.1-0ubuntu4) dapper; urgency=low
+
+  * debian/control.in: libpoppler-dev needs to depend on libfontconfig1-dev,
+    because we directly include <fontconfig/fontconfig.h> in GlobalParams.h
+
+ -- Adam Conrad <adconrad@ubuntu.com>  Thu, 16 Mar 2006 11:23:00 +1100
+
+poppler (0.5.1-0ubuntu3) dapper; urgency=low
+
+  * debian/control.in: Have poppler-utils Replace: xpdf-reader, since both
+    contain pdftoppm.1.gz.
+
+ -- Martin Pitt <martin.pitt@ubuntu.com>  Mon, 13 Mar 2006 09:10:12 +0100
+
+poppler (0.5.1-0ubuntu2) dapper; urgency=low
+
+  * debian/control.in:
+    - fix the libpoppler1 package description
+
+ -- Sebastien Bacher <seb128@canonical.com>  Thu,  9 Mar 2006 09:43:15 +0000
+
+poppler (0.5.1-0ubuntu1) dapper; urgency=low
+
+  * New upstream version:
+    - Support for embedded files.
+    - Handle 0-width lines correctly.
+    - Avoid external file use when opening fonts.
+    - Only use vector fonts returned from fontconfig (#5758).
+    - Fix scaled 1x1 pixmaps use for drawing lines (#3387).
+    - drawSoftMaskedImage support in cairo backend.
+    - Misc bug fixes: #5922, #5946, #5749, #5952, #4030, #5420.
+  * debian/control.in, debian/libpoppler0c2.dirs,
+    debian/libpoppler0c2-glib.dirs, debian/libpoppler0c2-glib.install,
+    debian/libpoppler0c2.install, debian/libpoppler0c2-qt.dirs,
+    debian/libpoppler0c2-qt.install, debian/rules:
+    - updated for the soname change
+  * debian/patches/000_splash_build_fix.patch:
+    - fix build when using splash
+  * debian/patches/001_fixes_for_fonts_selection.patch:
+    - fix with the new version
+
+ -- Sebastien Bacher <seb128@canonical.com>  Mon,  6 Mar 2006 18:42:44 +0000
+
+poppler (0.5.0-0ubuntu5) dapper; urgency=low
+
+  * debian/control.in, debian/rules:
+    - build without libcairo
+
+ -- Sebastien Bacher <seb128@canonical.com>  Sun, 26 Feb 2006 20:05:10 +0100
+
+poppler (0.5.0-0ubuntu4) dapper; urgency=low
+
+  * debian/patches/001_fixes_for_fonts_selection.patch:
+    - change from the CVS, fix some renderings issues and fonts selection
+
+ -- Sebastien Bacher <seb128@canonical.com>  Tue,  7 Feb 2006 13:38:04 +0100
+
+poppler (0.5.0-0ubuntu3) dapper; urgency=low
+
+  * SECURITY UPDATE: Buffer overflow.
+  * Add debian/patches/002_CVE-2006-0301.patch:
+    - splash/Splash.cc, Splash::drawPixel(), Splash::drawSpan(),
+      Splash::xorSpan(): Check coordinates for integer overflow.
+  * CVE-2006-0301
+
+ -- Martin Pitt <martin.pitt@ubuntu.com>  Fri,  3 Feb 2006 18:13:30 +0000
+
+poppler (0.5.0-0ubuntu2) dapper; urgency=low
+
+  * debian/rules: Bump shlibs version to 0.5.0.
+
+ -- Martin Pitt <martin.pitt@ubuntu.com>  Fri, 20 Jan 2006 16:56:40 +0100
+
+poppler (0.5.0-0ubuntu1) dapper; urgency=low
+
+  * New upstream release 0.5.0, required for new evince 0.5.
+  * Merge with Debian.
+  * Remove patches adopted upstream:
+    - debian/patches/000_add-poppler-utils.patch
+    - debian/patches/002-selection-crash-bug.patch
+  * debian/libpoppler-dev.install:
+    - Install poppler-page-transition.h.
+    - Do not install poppler-config.h, it doesn't exist any more.
+    - Upstream doesn't install legacy xpdf includes any more, fix path to
+      install them into libpoppler-dev.
+  * Add debian/patches/001_jpxstream_int_crash.patch:
+    - poppler/JPXStream.h: Fix declaration of cbW to be signed.
+      JPXStream.cc, readCodeBlockData() negates the value, which results in an
+      invalid value on 64 bit platforms if using unsigned types.
+    - Thanks to Vladimir Nadvornik for pointing at this.
+
+ -- Martin Pitt <martin.pitt@ubuntu.com>  Thu, 19 Jan 2006 23:49:52 +0100
+
+poppler (0.4.4-1) unstable; urgency=high
+
+  * New upstream security release
+    - fixes CVE-2005-3624, CVE-2005-3625, CVE-2005-3627
+  * Remove debian/patches/003-CVE-2005-3624_5_7.patch:
+    - Merged upstream
+  * Remove debian/patches/004-fix-CVE-2005-3192.patch:
+    - Merged upstream
+  * Remove debian/patches/001-relibtoolize.patch
+    - Upstream uses recent libtool
+
+ -- Ondřej Surý <ondrej@debian.org>  Thu, 12 Jan 2006 20:40:27 +0100
+
+poppler (0.4.3-3) unstable; urgency=low
+
+  * Fix missing libcairo2-dev dependency (Closes: #346277)
+
+ -- Ondřej Surý <ondrej@debian.org>  Fri,  6 Jan 2006 21:37:10 +0100
+
+poppler (0.4.3-2) unstable; urgency=high
+
+  [ Martin Pitt ]
+  * SECURITY UPDATE: Multiple integer/buffer overflows.
+  * Add debian/patches/003-CVE-2005-3624_5_7.patch:
+    - poppler/Stream.cc, CCITTFaxStream::CCITTFaxStream():
+      + Check columns for negative or large values.
+      + CVE-2005-3624
+    - poppler/Stream.cc, numComps checks introduced in CVE-2005-3191 patch:
+      + Reset numComps to 0 since it's a global variable that is used later.
+      + CVE-2005-3627
+    - poppler/Stream.cc, DCTStream::readHuffmanTables():
+      + Fix out of bounds array access in Huffman tables.
+      + CVE-2005-3627
+    - poppler/Stream.cc, DCTStream::readMarker():
+      + Check for EOF in while loop to prevent endless loops.
+      + CVE-2005-3625
+    - poppler/JBIG2Stream.cc, JBIG2Bitmap::JBIG2Bitmap(),
+      JBIG2Bitmap::expand(), JBIG2Stream::readHalftoneRegionSeg():
+      + Check user supplied width and height against invalid values.
+      + Allocate one extra byte to prevent out of bounds access in combine().
+  * Add debian/patches/004-fix-CVE-2005-3192.patch:
+    - Fix nVals int overflow check in StreamPredictor::StreamPredictor().
+    - Forwarded upstream to https://bugs.freedesktop.org/show_bug.cgi?id=5514.
+
+  [ Ondřej Surý ]
+  * Merge changes from Ubuntu (Closes: #346076).
+  * Enable Cairo output again.
+
+ -- Ondřej Surý <ondrej@debian.org>  Thu,  5 Jan 2006 14:54:44 +0100
+
+poppler (0.4.3-1) unstable; urgency=high
+
+  * New upstream release.
+  * New maintainer (Closes: #344738)
+  * CVE-2005-3191 and CAN-2005-2097 fixes merged upstream.
+  * Fixed some rendering bugs and disabled Cairo output
+    (Closes: #314556, #322964, #328211)
+  * Acknowledge NMU (Closes: #342288)
+  * Add 001-selection-crash-bug.patch (Closes: #330544)
+  * Add poppler-utils (merge patch from Ubuntu)
+
+ -- Ondřej Surý <ondrej@sury.org>  Fri, 30 Dec 2005 11:34:07 +0100
+
+poppler (0.4.2-1.1) unstable; urgency=high
+
+  * SECURITY UPDATE: Multiple integer/buffer overflows.
+
+  * NMU to fix RC security bug (closes: #342288)
+  * Add debian/patches/04_CVE-2005-3191_2_3.patch taken from Ubuntu,
+    thanks to Martin Pitt:
+  * poppler/Stream.cc, DCTStream::readBaselineSOF(),
+    DCTStream::readProgressiveSOF(), DCTStream::readScanInfo():
+    - Check numComps for invalid values.
+    - http://www.idefense.com/application/poi/display?id=342&type=vulnerabilities
+    - CVE-2005-3191
+  * poppler/Stream.cc, StreamPredictor::StreamPredictor():
+    - Check rowBytes for invalid values.
+    - http://www.idefense.com/application/poi/display?id=344&type=vulnerabilities
+    - CVE-2005-3192
+   * poppler/JPXStream.cc, JPXStream::readCodestream():
+     - Check img.nXTiles * img.nYTiles for integer overflow.
+     - http://www.idefense.com/application/poi/display?id=345&type=vulnerabilities
+     - CVE-2005-3193
+
+ -- Frank Küster <frank@debian.org>  Fri, 23 Dec 2005 16:36:30 +0100
+
+poppler (0.4.2-1) unstable; urgency=low
+
+  * GNOME Team upload.
+  * New upstream version.
+  * debian/control.in:
+    - updated the Build-Depends on libqt (Closes: #326130).
+  * debian/rules:
+    - updated the shlibs.
+
+ -- Sebastien Bacher <seb128@debian.org>  Wed,  7 Sep 2005 12:41:48 +0200
+
+poppler (0.4.0-1) unstable; urgency=low
+
+  * GNOME Team Upload.
+  * Rebuild for the CPP transition.
+  * New upstream version (Closes: #311133):
+    - fix some crashers (Closes: #315590, #312261, #309410).
+    - fix some rendering defaults (Closes: #314441, #315383, #309697, #308785).
+  * debian/control.in, debian/rules:
+    - build with the current cairo version (Closes: #321368, #318293).
+    - update for the renamed the packages.
+  * debian/patches/01_CAN-2005-2097.patch:
+    - Patch from Ubuntu, thanks Martin Pitt.
+    - Check sanity of the TrueType "loca" table. Specially crafted broken
+      tables caused disk space exhaustion due to very large generated glyph
+      descriptions when attempting to fix the table.
+    - Upstream patch scheduled for xpdf 3.01.
+    - CAN-2005-2097
+  * debian/watch:
+    - fixed, patch by Jerome Warnier <jwarnier@beeznest.net> (Closes: #310996).
+
+ -- Sebastien Bacher <seb128@debian.org>  Wed, 17 Aug 2005 21:54:07 +0200
+
+poppler (0.3.1-1) unstable; urgency=low
+
+  * New upstream release
+  * Upstream fixed the Qt build bug, so now I can enable Qt
+    build. (Closes:#307340) It leads two new binary packages
+    libpoppler0-qt and libpoppler-qt-dev.
+  * Excluded DEB_CONFIGURE_SYSCONFDIR setting, which is obsolete by the
+    upstream removal of xpdfrc config.
+
+ -- Changwoo Ryu <cwryu@debian.org>  Wed,  4 May 2005 00:19:35 +0900
+
+poppler (0.3.0-2) unstable; urgency=high
+
+  * Added shlib version info for libpoppler0-glib.
+  * Corrected dependencies of libpoppler0-glib and libpoppler-glib-dev.
+    (Closes: #306897)
+  * Build-Depends on libgtk2.0-dev for -glib packages. (Closes: #306885)
+  * Corrected descriptions of -glib packages.
+
+ -- Changwoo Ryu <cwryu@debian.org>  Thu, 28 Apr 2005 02:41:25 +0900
+
+poppler (0.3.0-1) unstable; urgency=low
+
+  * New upstream release (Closes: #306573)
+  * Added new binary packages libpoppler0-glib and libpoppler-glib-dev,
+    which are GLib-based interfaces.  Qt interface build is termporarily
+    disabled, because of an upstream FTBFS.
+
+ -- Changwoo Ryu <cwryu@debian.org>  Thu, 28 Apr 2005 02:07:23 +0900
+
+poppler (0.1.2-1) unstable; urgency=low
+
+  * Initial Release (Closes: #299518)
+
+ -- Changwoo Ryu <cwryu@debian.org>  Tue, 15 Mar 2005 02:08:00 +0900
diff --git a/debian/compat b/debian/compat
new file mode 100644 (file)
index 0000000..45a4fb7
--- /dev/null
@@ -0,0 +1 @@
+8
diff --git a/debian/control b/debian/control
new file mode 100644 (file)
index 0000000..7908367
--- /dev/null
@@ -0,0 +1,213 @@
+Source: poppler
+Section: devel
+Priority: optional
+Maintainer: GangHeok Kim <gangheok.kim@samsung.com>, TaekSu Shin <taeksu.shin@samsung.com>
+Uploaders: GangHeok Kim <gangheok.kim@samsung.com>
+Build-Depends: debhelper (>= 8),
+               autotools-dev,
+               libfontconfig1-dev,
+               libjpeg-dev,
+               libpng-dev,
+               liblcms2-dev,
+               libfreetype6-dev,
+               pkg-config (>= 0.18),
+               libcairo2-dev (>= 1.10.0),
+               libtiff-dev,
+               libglib2.0-dev (>= 2.18),
+               libcurl-dev
+# debhelper (>= 8.9.0),
+# gtk-doc-tools (>= 1.14),
+# libgirepository1.0-dev (>= 1.31.0-2~),
+# gobject-introspection (>= 1.31.0-2~),
+# libglib2.0-doc
+# libqt4-dev (>= 4.4.0),
+# libgtk2.0-dev (>= 2.12),
+# libgtk2.0-dev (>= 2.12),
+# dpkg (>= 1.16.1),
+Standards-Version: 3.9.2
+Homepage: http://poppler.freedesktop.org/
+Vcs-Git: git://git.debian.org/pkg-freedesktop/poppler.git
+Vcs-Browser: http://git.debian.org/?p=pkg-freedesktop/poppler.git
+
+Package: libpoppler25
+Architecture: any
+Section: libs
+Multi-Arch: same
+Pre-Depends: ${misc:Pre-Depends}
+Depends: ${shlibs:Depends},
+         ${misc:Depends}
+Suggests: poppler-data
+Description: PDF rendering library
+ Poppler is a PDF rendering library based on Xpdf PDF viewer.
+ .
+ This package contains the shared core library.
+
+Package: libpoppler-dev
+Architecture: any
+Section: libdevel
+Depends: libpoppler25 (= ${binary:Version}),
+         ${shlibs:Depends},
+         ${misc:Depends},
+         libfontconfig1-dev
+Description: PDF rendering library -- development files
+ Poppler is a PDF rendering library based on Xpdf PDF viewer.
+ .
+ This package contains the headers and development libraries needed to
+ build applications using Poppler.
+
+Package: libpoppler-private-dev
+Architecture: any
+Section: libdevel
+Depends: libpoppler-dev (= ${binary:Version}),
+         ${misc:Depends}
+Suggests: libfreetype6-dev,
+          libopenjpeg-dev,
+          libpng-dev,
+          libtiff-dev
+Description: PDF rendering library -- private development files
+ Poppler is a PDF rendering library based on Xpdf PDF viewer.
+ .
+ This package contains the private and unstable headers needed to build
+ applications using the private Poppler core library.
+ (At the moment this package is empty, allowing the migration of sources
+ to this package instead of libpoppler-dev.)
+
+Package: libpoppler-glib8
+Architecture: any
+Section: libs
+Multi-Arch: same
+Pre-Depends: ${misc:Pre-Depends}
+Depends: ${shlibs:Depends},
+         ${misc:Depends}
+Description: PDF rendering library (GLib-based shared library)
+ Poppler is a PDF rendering library based on Xpdf PDF viewer.
+ .
+ This package provides the GLib-based shared library for applications
+ using the GLib interface to Poppler.
+
+Package: libpoppler-glib-dev
+Architecture: any
+Section: libdevel
+Depends: libpoppler-glib8 (= ${binary:Version}),
+         libpoppler-dev (= ${binary:Version}),
+         libglib2.0-dev (>= 2.18),
+         libcairo2-dev (>= 1.10.0),
+         ${shlibs:Depends},
+         ${misc:Depends}
+#         gir1.2-poppler-0.18 (= ${binary:Version}),
+Description: PDF rendering library -- development files (GLib interface)
+ Poppler is a PDF rendering library based on Xpdf PDF viewer.
+ .
+ This package contains the headers and development libraries needed to
+ build applications using the GLib-based Poppler interface.
+
+#Package: gir1.2-poppler-0.18
+#Architecture: any
+#Section: introspection
+#Depends: ${shlibs:Depends},
+#         ${misc:Depends},
+#         ${gir:Depends}
+#Description: GObject introspection data for poppler-glib
+# Poppler is a PDF rendering library based on Xpdf PDF viewer.
+# .
+# This package contains introspection data for poppler-glib.
+# .
+# It can be used by packages using the GIRepository format to generate
+# dynamic bindings.
+
+#Package: libpoppler-qt4-3
+#Architecture: any
+#Section: libs
+#Multi-Arch: same
+#Pre-Depends: ${misc:Pre-Depends}
+#Depends: ${shlibs:Depends},
+#         ${misc:Depends}
+#Description: PDF rendering library (Qt 4 based shared library)
+# Poppler is a PDF rendering library based on Xpdf PDF viewer.
+# .
+# This package provides the Qt 4 based shared library for applications
+# using the Qt 4 interface to Poppler.
+
+#Package: libpoppler-qt4-dev
+#Architecture: any
+#Section: libdevel
+#Depends: libpoppler-qt4-3 (= ${binary:Version}),
+#         libpoppler-dev (= ${binary:Version}),
+#         libqt4-dev (>= 4.4.0),
+#         ${shlibs:Depends},
+#         ${misc:Depends}
+#Description: PDF rendering library -- development files (Qt 4 interface)
+# Poppler is a PDF rendering library based on Xpdf PDF viewer.
+# .
+# This package contains the headers and development libraries needed to
+# build applications using the Qt 4-based Poppler interface.
+
+#Package: libpoppler-cpp0
+#Architecture: any
+#Section: libs
+#Multi-Arch: same
+#Pre-Depends: ${misc:Pre-Depends}
+#Depends: ${shlibs:Depends},
+#         ${misc:Depends}
+#Description: PDF rendering library (CPP shared library)
+# Poppler is a PDF rendering library based on Xpdf PDF viewer.
+# .
+# This package provides the CPP shared library for applications
+# using a simple C++ interface (using STL, and no other dependency) to Poppler.
+
+#Package: libpoppler-cpp-dev
+#Architecture: any
+#Section: libdevel
+#Depends: libpoppler-cpp0 (= ${binary:Version}),
+#         libpoppler-dev (= ${binary:Version}),
+#         ${shlibs:Depends},
+#         ${misc:Depends}
+#Description: PDF rendering library -- development files (CPP interface)
+# Poppler is a PDF rendering library based on Xpdf PDF viewer.
+# .
+# This package contains the headers and development libraries needed to
+# build applications using the C++ Poppler interface.
+
+Package: poppler-utils
+Architecture: any
+Section: utils
+Multi-Arch: foreign
+Depends: ${shlibs:Depends},
+         ${misc:Depends}
+Recommends: ghostscript
+Breaks: xpdf-utils (<< 3.02-2~)
+Conflicts: pdftohtml
+Replaces: xpdf-utils (<< 3.02-2~),
+          pdftohtml,
+          xpdf-reader
+Provides: xpdf-utils,
+          pdftohtml
+Description: PDF utilities (based on Poppler)
+ Poppler is a PDF rendering library based on Xpdf PDF viewer.
+ .
+ This package contains command line utilities (based on Poppler) for getting
+ information of PDF documents, convert them to other formats, or manipulate
+ them:
+  * pdffonts -- font analyzer
+  * pdfimages -- image extractor
+  * pdfinfo -- document information
+  * pdfseparate -- page extraction tool
+  * pdftocairo -- PDF to PNG/JPEG/PDF/PS/EPS/SVG converter using Cairo
+  * pdftohtml -- PDF to HTML converter
+  * pdftoppm -- PDF to PPM/PNG/JPEG image converter
+  * pdftops -- PDF to PostScript (PS) converter
+  * pdftotext -- text extraction
+  * pdfunite -- document merging tool
+
+Package: poppler-dbg
+Architecture: any
+Section: debug
+Priority: extra
+Depends: ${misc:Depends},
+         libpoppler25 (= ${binary:Version})
+Description: PDF rendering library -- debugging symbols
+ Poppler is a PDF rendering library based on Xpdf PDF viewer.
+ .
+ This package contains the debugging symbols for all the Poppler libraries
+ and the utilities.
+
diff --git a/debian/copyright b/debian/copyright
new file mode 100644 (file)
index 0000000..266e251
--- /dev/null
@@ -0,0 +1,177 @@
+This package was debianized by Changwoo Ryu <cwryu@debian.org>.
+
+It was downloaded from http://poppler.freedesktop.org
+
+Upstream Authors:
+
+    Derek Noonburg <derekn@foolabs.com>
+    Kristian Høgsberg <krh@bitplanet.net>
+    Albert Astals Cid <aacid@kde.org>
+
+Copyright:
+
+    Copyright © 2008 Adam Batkin
+    Copyright © Adobe Systems Inc.
+    Copyright © 2007-2012 Adrian Johnson
+    Copyright © 2008 Adrian Page
+    Copyright © 2004-2012 Albert Astals Cid
+    Copyright © 2006-2010 Alexander Neundorf
+    Copyright © 2012 Alexander Saprykin
+    Copyright © 2011 Andrea Canciani
+    Copyright © 2011 Andreas Hartmetz
+    Copyright © 2012 Arseny Solokha
+    Copyright © 2009, 2011 Axel Strübing
+    Copyright © 2008 Boris Toloknov
+    Copyright © 2005-2008 Brad Hards
+    Copyright © 2010 Brian Cameron
+    Copyright © 2010 Brian Ewins
+    Copyright © 2006-2011 Carlos Garcia Campos
+    Copyright © 2008 Carl Worth
+    Copyright © 2010 Christian Feuersänger
+    Copyright © 2009 Christian Persch
+    Copyright © 2008-2009 Chris Wilson
+    Copyright © 1998-2003 Daniel Veillard
+    Copyright © 2011 Daiki Ueno
+    Copyright © 2005 Dan Sheridan
+    Copyright © 2011 Daniel Glöckner
+    Copyright © 2009 Darren Kenny
+    Copyright © 2009-2010 David Benjamin
+    Copyright © 2006 David Faure
+    Copyright © 1997, Derek B. Noonburg
+    Copyright © 2006-2007 Dominic Lachowicz
+    Copyright © 2008 Ed Avis
+    Copyright © 2006-2007 Ed Catmur
+    Copyright © 2011 Edward Jiang
+    Copyright © 2004 Enrico Ros
+    Copyright © 2009 Eric Toombs
+    Copyright © 1989, 1991, 1994-2009 Free Software Foundation, Inc.
+    Copyright © 1996-2007 Glyph & Cog, LLC.
+    Copyright © 2009 Glenn Ganz
+    Copyright © 1999-2000 Gueorgui Ovtcharov
+    Copyright © 2010 Guillermo Amaral
+    Copyright © 2010 Harry Roberts
+    Copyright © 2008 Haruyuki Kawabe
+    Copyright © 2008, 2010-2012 Hib Eris
+    Copyright © 2008 Hugo Mercier
+    Copyright © 2012 Igor Slepchin
+    Copyright © 2007 Ilmari Heikkinen
+    Copyright © 2008-2010 Ilya Gorenbein
+    Copyright © 2007-2008 Iñigo Martínez
+    Copyright © Insight Consortium
+    Copyright © 2010 Jakob Voss
+    Copyright © 2009-2010 Jakub Wilk
+    Copyright © 2009 Jan Jockusch
+    Copyright © 2010 Jan Kümmel
+    Copyright © 2006-2007 Jauco Noordzij
+    Copyright © 2005-2008 Jeff Muizelaar
+    Copyright © Jerry Epplin
+    Copyright © 2011 Jim Meyering
+    Copyright © 2005 Jonathan Blandford
+    Copyright © 2007-2009 Jonathan Kew
+    Copyright © 2010 Jonathan Liu
+    Copyright © 2011 José Aliste
+    Copyright © 2011 Joshua Richardson
+    Copyright © 2006-2008 Julien Rebetez
+    Copyright © 2010 Jürg Billeter
+    Copyright © 2009 KDAB via Guillermo Amaral
+    Copyright © 2010 Kenneth Berland
+    Copyright © 2008 Kees Cook
+    Copyright © 2011 Kenji Uno
+    Copyright © 2002 Kitware, Inc.
+    Copyright © 2008 Kjartan Maraas
+    Copyright © 2007-2009 Koji Otani
+    Copyright © 2006-2007 Kouhei Sutou
+    Copyright © 2009 Kovid Goyal
+    Copyright © 2005-2007 Kristian Høgsberg
+    Copyright © 2006-2007 Krzysztof Kowalczyk
+    Copyright © 2006-2007 Laurent Montel
+    Copyright © 2005 Marco Pesenti Gritti
+    Copyright © 2008 Mark Kaplan
+    Copyright © 2010 Mark Riedesel
+    Copyright © 2005 Martin Kretzschmar
+    Copyright © 2009 Matthias Drochner
+    Copyright © 2010 Matthias Fauconneau
+    Copyright © 2009 Matthias Franz
+    Copyright © 2009 Michael K. Johnson
+    Copyright © 2008 Michael Vrable
+    Copyright © 2009 M Joonas Pihlaja
+    Copyright © 2010 Mike Slegeir
+    Copyright © 2009 Mozilla Corporation
+    Copyright © 2005 Net Integration Technologies, Inc.
+    Copyright © 2009 Nick Jones
+    Copyright © 2005-2006 Nickolay V. Shmyrev
+    Copyright © 2010 Nils Höglund
+    Copyright © 2010 OSSD CDAC Mumbai by Leena Chourey and Onkar Potdar
+    Copyright © 2010 Patrick Spendrin
+    Copyright © 2006 Paul Walmsley
+    Copyright © 2010 Paweł Wiejacha
+    Copyright © 2009 Peter Kerzum
+    Copyright © 2009 Petr Gajdos
+    Copyright © 2010 Philip Lorenz
+    Copyright © 2006-2011 Pino Toscano
+    Copyright © Rainer Dorsch
+    Copyright © 2006 Rainer Keller
+    Copyright © 2006 Raj Kumar
+    Copyright © 2009 Reece Dunn
+    Copyright © 2004-2006 Red Hat, Inc.
+    Copyright © 2008 Richard Airlie
+    Copyright © 2009 Ross Moore
+    Copyright © 2009 Ryszard Trojnacki
+    Copyright © 2011 Sam Liao
+    Copyright © 2009 Sanjoy Mahajan
+    Copyright © 2004 Scott James Remnant
+    Copyright © 2006 Scott Turner
+    Copyright © 2009 Shawn Rutledge
+    Copyright © 2009 Shen Liang
+    Copyright © 2011 Simon Kellner
+    Copyright © 2010 Srinivas Adicherla
+    Copyright © 2005-2006 Stefan Kebekus
+    Copyright © 2006 Stefan Schweizer
+    Copyright © 2009 Stefan Thomas
+    Copyright © 2011 Stephen Reichling
+    Copyright © 2006 Steven G. Johnson
+    Copyright © 2011 Steven Murdoc
+    Copyright © 2010 Suzuki Toshiya
+    Copyright © 2005-2006 Takashi Iwai
+    Copyright © The GLib Team
+    Copyright © 2005-2010 The Poppler Developers
+    Copyright © 2009-2012 Thomas Freitag
+    Copyright © 2011 Thomas Klausner
+    Copyright © 2006 Thorkild Stray
+    Copyright © 2009 Till Kamppeter
+    Copyright © 2008 Timothy Lee
+    Copyright © 2005 Tobias Koening
+    Copyright © 2011 Tom Gleason
+    Copyright © 2008 Tomas Are Haavet
+    Copyright © 2010-2011 Tomas Hoger
+    Copyright © 2008 Vasile Gaburici
+    Copyright © 2012 Yi Yang
+    Copyright © 2008-2009 Warren Toomey
+    Copyright © 2006 Wilfried Huss
+    Copyright © 2009-2011 William Bader
+    Copyright © 2007 Will Stephenson
+    Copyright © 1994 X Consortium
+
+License:
+
+   This program is free software; you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; version 2 dated June, 1991.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License along
+   with this program; if not, write to the Free Software Foundation, Inc.,
+   51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+
+
+   Poppler is based on a Xpdf fork (updated at Xpdf 3.02), so the license
+   of the poppler core library (libpoppler.so.X) is GPL v2 only.
+   All the Poppler contributions are licensed as GPL v2+.
+
+
+On Debian systems, the complete text of the GNU General
+Public License can be found in `/usr/share/common-licenses/GPL-2'.
diff --git a/debian/docs b/debian/docs
new file mode 100644 (file)
index 0000000..7f1c78d
--- /dev/null
@@ -0,0 +1,5 @@
+AUTHORS
+NEWS
+README
+README-XPDF
+TODO
diff --git a/debian/gir1.2-poppler-0.18.install b/debian/gir1.2-poppler-0.18.install
new file mode 100644 (file)
index 0000000..b40ffba
--- /dev/null
@@ -0,0 +1 @@
+usr/lib/*/girepository-1.0/Poppler-0.18.typelib usr/lib/girepository-1.0/
diff --git a/debian/libpoppler-cpp-dev.install b/debian/libpoppler-cpp-dev.install
new file mode 100644 (file)
index 0000000..871c184
--- /dev/null
@@ -0,0 +1,4 @@
+usr/include/poppler/cpp
+usr/lib/*/libpoppler-cpp.a
+usr/lib/*/libpoppler-cpp.so
+usr/lib/*/pkgconfig/poppler-cpp.pc
diff --git a/debian/libpoppler-cpp0.install b/debian/libpoppler-cpp0.install
new file mode 100644 (file)
index 0000000..6f925b7
--- /dev/null
@@ -0,0 +1 @@
+usr/lib/*/libpoppler-cpp.so.0*
diff --git a/debian/libpoppler-dev.install b/debian/libpoppler-dev.install
new file mode 100644 (file)
index 0000000..f977101
--- /dev/null
@@ -0,0 +1,16 @@
+usr/include/poppler/*.h
+usr/include/poppler/fofi/
+usr/include/poppler/goo/
+usr/include/poppler/splash/
+usr/lib/libpoppler.a
+usr/lib/libpoppler.so
+usr/lib/pkgconfig/poppler.pc
+usr/lib/pkgconfig/poppler-splash.pc
+#usr/lib/pkgconfig/poppler-cairo.pc
+# private headers not installed
+poppler/ArthurOutputDev.h usr/include/poppler/
+poppler/CairoFontEngine.h usr/include/poppler/
+poppler/CairoOutputDev.h usr/include/poppler/
+poppler/DCTStream.h usr/include/poppler/
+poppler/JPEG2000Stream.h usr/include/poppler/
+poppler/PageLabelInfo.h usr/include/poppler/
diff --git a/debian/libpoppler-glib-dev.install b/debian/libpoppler-glib-dev.install
new file mode 100644 (file)
index 0000000..68ddf42
--- /dev/null
@@ -0,0 +1,6 @@
+#usr/share/gtk-doc/html/poppler/ usr/share/doc/libpoppler-glib-dev/html/
+usr/include/poppler/glib/
+#usr/lib/libpoppler-glib.a
+usr/lib/libpoppler-glib.so
+usr/lib/pkgconfig/poppler-glib.pc
+#usr/share/gir-1.0/Poppler-0.18.gir
diff --git a/debian/libpoppler-glib-dev.links b/debian/libpoppler-glib-dev.links
new file mode 100644 (file)
index 0000000..f6c7cc8
--- /dev/null
@@ -0,0 +1 @@
+usr/share/doc/libpoppler-glib-dev/html/poppler usr/share/gtk-doc/html/poppler
diff --git a/debian/libpoppler-glib8.install b/debian/libpoppler-glib8.install
new file mode 100644 (file)
index 0000000..52e711d
--- /dev/null
@@ -0,0 +1 @@
+usr/lib/libpoppler-glib.so.8*
diff --git a/debian/libpoppler-private-dev.lintian-overrides b/debian/libpoppler-private-dev.lintian-overrides
new file mode 100644 (file)
index 0000000..f59b517
--- /dev/null
@@ -0,0 +1,3 @@
+# temporarly empty package to ease migrations from libpoppler-dev to it
+libpoppler-private-dev: empty-binary-package
+libpoppler-private-dev: package-contains-no-arch-dependent-files
diff --git a/debian/libpoppler-qt4-3.install b/debian/libpoppler-qt4-3.install
new file mode 100644 (file)
index 0000000..33e1c27
--- /dev/null
@@ -0,0 +1 @@
+usr/lib/*/libpoppler-qt4.so.3*
diff --git a/debian/libpoppler-qt4-dev.install b/debian/libpoppler-qt4-dev.install
new file mode 100644 (file)
index 0000000..b985be1
--- /dev/null
@@ -0,0 +1,4 @@
+usr/include/poppler/qt4
+usr/lib/*/libpoppler-qt4.a
+usr/lib/*/libpoppler-qt4.so
+usr/lib/*/pkgconfig/poppler-qt4.pc
diff --git a/debian/libpoppler25.install b/debian/libpoppler25.install
new file mode 100644 (file)
index 0000000..60174a3
--- /dev/null
@@ -0,0 +1 @@
+usr/lib/libpoppler.so.25*
diff --git a/debian/poppler-utils.install b/debian/poppler-utils.install
new file mode 100644 (file)
index 0000000..00c002e
--- /dev/null
@@ -0,0 +1,2 @@
+usr/bin/
+#usr/share/man/man1/
diff --git a/debian/rules b/debian/rules
new file mode 100755 (executable)
index 0000000..2178d96
--- /dev/null
@@ -0,0 +1,46 @@
+#!/usr/bin/make -f
+
+include /usr/share/cdbs/1/rules/debhelper.mk
+include /usr/share/cdbs/1/class/autotools.mk
+include /usr/share/cdbs/1/rules/utils.mk
+
+# use qt4's moc as the default moc is qt3's when both are installed
+PATH := /usr/share/qt4/bin:$(PATH)
+export PATH
+
+# avoid overlinking and reduce library dependencies
+export LDFLAGS := -Wl,--as-needed
+
+PREFIX ?= /usr
+DATAROOTDIR ?= /usr/share
+SYSCONFDIR ?= /opt/etc
+LOCALSTATEDIR=/opt/var
+CPPFLAGS += -I/usr/include/cairo -I/usr/include/freetype2/
+
+# a trick to fix xpdfrc location without modifying autotools stuff
+DEB_CONFIGURE_SYSCONFDIR := /etc/xpdf
+
+# disable gtk stuff to minimize Build-Depends
+DEB_CONFIGURE_EXTRA_FLAGS +=                   \
+       --prefix=$(PREFIX) --localstatedir=$(LOCALSTATEDIR) --sysconfdir=$(SYSCONFDIR) --datarootdir=$(DATAROOTDIR) \
+       --enable-shared \
+       --enable-libjpeg --disable-libopenjpeg --enable-libtiff \
+       --enable-largefile \
+       --enable-zlib --enable-libcurl \
+       --enable-libpng \
+       --enable-cairo-output \
+    --enable-splash-output \
+       --enable-poppler-glib \
+       --enable-introspection=auto \
+       --disable-gtk-doc --disable-gtk-doc-html --disable-gtk-doc-pdf \
+       --disable-poppler-qt4 --disable-poppler-cpp \
+       --disable-gtk-test \
+       --enable-utils \
+       --enable-xpdf-headers \
+       --enable-compile-warnings=yes \
+       --enable-cms --without-x --with-font-configuration=fontconfig
+
+DEB_DH_MAKESHLIBS_ARGS_libpoppler19 += -V"libpoppler19"
+DEB_DH_MAKESHLIBS_ARGS_libpoppler-glib8 += -V"libpoppler-glib8 (>= 0.18)"
+DEB_DH_MAKESHLIBS_ARGS_libpoppler-qt4-3 += -V"libpoppler-qt4-3 (>= 0.18)"
+DEB_DH_MAKESHLIBS_ARGS_libpoppler-cpp0 += -V"libpoppler-cpp0 (>= 0.16)"
diff --git a/debian/rules.org b/debian/rules.org
new file mode 100755 (executable)
index 0000000..c663f33
--- /dev/null
@@ -0,0 +1,63 @@
+#!/usr/bin/make -f
+
+# use qt4's moc as the default moc is qt3's when both are installed
+PATH := /usr/share/qt4/bin:$(PATH)
+export PATH
+
+# avoid overlinking and reduce library dependencies
+#export DEB_LDFLAGS_MAINT_APPEND := -Wl,--as-needed
+export LDFLAGS := -Wl,--as-needed
+
+# make the build verbose
+export V=1
+
+PREFIX ?= /usr
+DATAROOTDIR ?= /usr/share
+SYSCONFDIR ?= /opt/etc
+LOCALSTATEDIR=/opt/var
+
+# disable gtk stuff to minimize Build-Depends
+#CONFIGURE_ARGS := 
+
+%:
+       dh $@
+
+override_dh_auto_clean:
+       dh_auto_clean
+       rm -f glib/reference/html/*
+
+override_dh_auto_configure:
+       dh_auto_configure -- \
+    --prefix=$(PREFIX) --localstatedir=$(LOCALSTATEDIR) --sysconfdir=$(SYSCONFDIR) --datarootdir=$(DATAROOTDIR) \
+    --enable-shared \
+    --enable-libjpeg --disable-openjpeg --disable-libtiff \
+    --enable-zlib --disable-libcurl \
+    --enable-libpng \
+    --disable-cairo-output \
+    --disable-poppler-glib \
+    --disable-gtk-doc --disable-gtk-doc-html --disable-gtk-doc-pdf \
+    --disable-poppler-qt4 --disable-poppler-qt --disable-poppler-cpp \
+    --disable-gtk-test \
+    --enable-xpdf-headers --disable-gdk \
+    --enable-compile-warnings=yes \
+    --disable-gtk-test --enable-cms --without-x --with-font-configuration=fontconfig \
+    --enable-splash-output
+
+override_dh_install:
+       dh_install --list-missing
+
+override_dh_installchangelogs:
+       dh_installchangelogs -plibpoppler19
+       dh_installchangelogs --remaining-packages -XChangeLog
+
+override_dh_strip:
+       dh_strip --dbg-package=poppler-dbg
+
+override_dh_makeshlibs:
+       dh_makeshlibs -plibpoppler19 -V"libpoppler19"
+       dh_makeshlibs -plibpoppler-cpp0 -V"libpoppler-cpp0 (>= 0.16)"
+       dh_makeshlibs -plibpoppler-glib8 -V"libpoppler-glib8 (>= 0.18)"
+       dh_makeshlibs -plibpoppler-qt4-3 -V"libpoppler-qt4-3 (>= 0.18)"
+       dh_makeshlibs --remaining-packages
+
+.PHONY: override_dh_auto_test
diff --git a/debian/source/format b/debian/source/format
new file mode 100644 (file)
index 0000000..163aaf8
--- /dev/null
@@ -0,0 +1 @@
+3.0 (quilt)
diff --git a/debian/watch b/debian/watch
new file mode 100644 (file)
index 0000000..c9364a1
--- /dev/null
@@ -0,0 +1,2 @@
+version=3
+http://poppler.freedesktop.org/ poppler-([0-9.]*)\.tar\.gz debian uupdate
diff --git a/depcomp b/depcomp
new file mode 100755 (executable)
index 0000000..bd0ac08
--- /dev/null
+++ b/depcomp
@@ -0,0 +1,688 @@
+#! /bin/sh
+# depcomp - compile a program generating dependencies as side-effects
+
+scriptversion=2011-12-04.11; # UTC
+
+# Copyright (C) 1999, 2000, 2003, 2004, 2005, 2006, 2007, 2009, 2010,
+# 2011 Free Software Foundation, Inc.
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program that contains a
+# configuration script generated by Autoconf, you may include it under
+# the same distribution terms that you use for the rest of that program.
+
+# Originally written by Alexandre Oliva <oliva@dcc.unicamp.br>.
+
+case $1 in
+  '')
+     echo "$0: No command.  Try \`$0 --help' for more information." 1>&2
+     exit 1;
+     ;;
+  -h | --h*)
+    cat <<\EOF
+Usage: depcomp [--help] [--version] PROGRAM [ARGS]
+
+Run PROGRAMS ARGS to compile a file, generating dependencies
+as side-effects.
+
+Environment variables:
+  depmode     Dependency tracking mode.
+  source      Source file read by `PROGRAMS ARGS'.
+  object      Object file output by `PROGRAMS ARGS'.
+  DEPDIR      directory where to store dependencies.
+  depfile     Dependency file to output.
+  tmpdepfile  Temporary file to use when outputting dependencies.
+  libtool     Whether libtool is used (yes/no).
+
+Report bugs to <bug-automake@gnu.org>.
+EOF
+    exit $?
+    ;;
+  -v | --v*)
+    echo "depcomp $scriptversion"
+    exit $?
+    ;;
+esac
+
+if test -z "$depmode" || test -z "$source" || test -z "$object"; then
+  echo "depcomp: Variables source, object and depmode must be set" 1>&2
+  exit 1
+fi
+
+# Dependencies for sub/bar.o or sub/bar.obj go into sub/.deps/bar.Po.
+depfile=${depfile-`echo "$object" |
+  sed 's|[^\\/]*$|'${DEPDIR-.deps}'/&|;s|\.\([^.]*\)$|.P\1|;s|Pobj$|Po|'`}
+tmpdepfile=${tmpdepfile-`echo "$depfile" | sed 's/\.\([^.]*\)$/.T\1/'`}
+
+rm -f "$tmpdepfile"
+
+# Some modes work just like other modes, but use different flags.  We
+# parameterize here, but still list the modes in the big case below,
+# to make depend.m4 easier to write.  Note that we *cannot* use a case
+# here, because this file can only contain one case statement.
+if test "$depmode" = hp; then
+  # HP compiler uses -M and no extra arg.
+  gccflag=-M
+  depmode=gcc
+fi
+
+if test "$depmode" = dashXmstdout; then
+   # This is just like dashmstdout with a different argument.
+   dashmflag=-xM
+   depmode=dashmstdout
+fi
+
+cygpath_u="cygpath -u -f -"
+if test "$depmode" = msvcmsys; then
+   # This is just like msvisualcpp but w/o cygpath translation.
+   # Just convert the backslash-escaped backslashes to single forward
+   # slashes to satisfy depend.m4
+   cygpath_u='sed s,\\\\,/,g'
+   depmode=msvisualcpp
+fi
+
+if test "$depmode" = msvc7msys; then
+   # This is just like msvc7 but w/o cygpath translation.
+   # Just convert the backslash-escaped backslashes to single forward
+   # slashes to satisfy depend.m4
+   cygpath_u='sed s,\\\\,/,g'
+   depmode=msvc7
+fi
+
+case "$depmode" in
+gcc3)
+## gcc 3 implements dependency tracking that does exactly what
+## we want.  Yay!  Note: for some reason libtool 1.4 doesn't like
+## it if -MD -MP comes after the -MF stuff.  Hmm.
+## Unfortunately, FreeBSD c89 acceptance of flags depends upon
+## the command line argument order; so add the flags where they
+## appear in depend2.am.  Note that the slowdown incurred here
+## affects only configure: in makefiles, %FASTDEP% shortcuts this.
+  for arg
+  do
+    case $arg in
+    -c) set fnord "$@" -MT "$object" -MD -MP -MF "$tmpdepfile" "$arg" ;;
+    *)  set fnord "$@" "$arg" ;;
+    esac
+    shift # fnord
+    shift # $arg
+  done
+  "$@"
+  stat=$?
+  if test $stat -eq 0; then :
+  else
+    rm -f "$tmpdepfile"
+    exit $stat
+  fi
+  mv "$tmpdepfile" "$depfile"
+  ;;
+
+gcc)
+## There are various ways to get dependency output from gcc.  Here's
+## why we pick this rather obscure method:
+## - Don't want to use -MD because we'd like the dependencies to end
+##   up in a subdir.  Having to rename by hand is ugly.
+##   (We might end up doing this anyway to support other compilers.)
+## - The DEPENDENCIES_OUTPUT environment variable makes gcc act like
+##   -MM, not -M (despite what the docs say).
+## - Using -M directly means running the compiler twice (even worse
+##   than renaming).
+  if test -z "$gccflag"; then
+    gccflag=-MD,
+  fi
+  "$@" -Wp,"$gccflag$tmpdepfile"
+  stat=$?
+  if test $stat -eq 0; then :
+  else
+    rm -f "$tmpdepfile"
+    exit $stat
+  fi
+  rm -f "$depfile"
+  echo "$object : \\" > "$depfile"
+  alpha=ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz
+## The second -e expression handles DOS-style file names with drive letters.
+  sed -e 's/^[^:]*: / /' \
+      -e 's/^['$alpha']:\/[^:]*: / /' < "$tmpdepfile" >> "$depfile"
+## This next piece of magic avoids the `deleted header file' problem.
+## The problem is that when a header file which appears in a .P file
+## is deleted, the dependency causes make to die (because there is
+## typically no way to rebuild the header).  We avoid this by adding
+## dummy dependencies for each header file.  Too bad gcc doesn't do
+## this for us directly.
+  tr ' ' '
+' < "$tmpdepfile" |
+## Some versions of gcc put a space before the `:'.  On the theory
+## that the space means something, we add a space to the output as
+## well.  hp depmode also adds that space, but also prefixes the VPATH
+## to the object.  Take care to not repeat it in the output.
+## Some versions of the HPUX 10.20 sed can't process this invocation
+## correctly.  Breaking it into two sed invocations is a workaround.
+    sed -e 's/^\\$//' -e '/^$/d' -e "s|.*$object$||" -e '/:$/d' \
+      | sed -e 's/$/ :/' >> "$depfile"
+  rm -f "$tmpdepfile"
+  ;;
+
+hp)
+  # This case exists only to let depend.m4 do its work.  It works by
+  # looking at the text of this script.  This case will never be run,
+  # since it is checked for above.
+  exit 1
+  ;;
+
+sgi)
+  if test "$libtool" = yes; then
+    "$@" "-Wp,-MDupdate,$tmpdepfile"
+  else
+    "$@" -MDupdate "$tmpdepfile"
+  fi
+  stat=$?
+  if test $stat -eq 0; then :
+  else
+    rm -f "$tmpdepfile"
+    exit $stat
+  fi
+  rm -f "$depfile"
+
+  if test -f "$tmpdepfile"; then  # yes, the sourcefile depend on other files
+    echo "$object : \\" > "$depfile"
+
+    # Clip off the initial element (the dependent).  Don't try to be
+    # clever and replace this with sed code, as IRIX sed won't handle
+    # lines with more than a fixed number of characters (4096 in
+    # IRIX 6.2 sed, 8192 in IRIX 6.5).  We also remove comment lines;
+    # the IRIX cc adds comments like `#:fec' to the end of the
+    # dependency line.
+    tr ' ' '
+' < "$tmpdepfile" \
+    | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' | \
+    tr '
+' ' ' >> "$depfile"
+    echo >> "$depfile"
+
+    # The second pass generates a dummy entry for each header file.
+    tr ' ' '
+' < "$tmpdepfile" \
+   | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' -e 's/$/:/' \
+   >> "$depfile"
+  else
+    # The sourcefile does not contain any dependencies, so just
+    # store a dummy comment line, to avoid errors with the Makefile
+    # "include basename.Plo" scheme.
+    echo "#dummy" > "$depfile"
+  fi
+  rm -f "$tmpdepfile"
+  ;;
+
+aix)
+  # The C for AIX Compiler uses -M and outputs the dependencies
+  # in a .u file.  In older versions, this file always lives in the
+  # current directory.  Also, the AIX compiler puts `$object:' at the
+  # start of each line; $object doesn't have directory information.
+  # Version 6 uses the directory in both cases.
+  dir=`echo "$object" | sed -e 's|/[^/]*$|/|'`
+  test "x$dir" = "x$object" && dir=
+  base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'`
+  if test "$libtool" = yes; then
+    tmpdepfile1=$dir$base.u
+    tmpdepfile2=$base.u
+    tmpdepfile3=$dir.libs/$base.u
+    "$@" -Wc,-M
+  else
+    tmpdepfile1=$dir$base.u
+    tmpdepfile2=$dir$base.u
+    tmpdepfile3=$dir$base.u
+    "$@" -M
+  fi
+  stat=$?
+
+  if test $stat -eq 0; then :
+  else
+    rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3"
+    exit $stat
+  fi
+
+  for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3"
+  do
+    test -f "$tmpdepfile" && break
+  done
+  if test -f "$tmpdepfile"; then
+    # Each line is of the form `foo.o: dependent.h'.
+    # Do two passes, one to just change these to
+    # `$object: dependent.h' and one to simply `dependent.h:'.
+    sed -e "s,^.*\.[a-z]*:,$object:," < "$tmpdepfile" > "$depfile"
+    # That's a tab and a space in the [].
+    sed -e 's,^.*\.[a-z]*:[     ]*,,' -e 's,$,:,' < "$tmpdepfile" >> "$depfile"
+  else
+    # The sourcefile does not contain any dependencies, so just
+    # store a dummy comment line, to avoid errors with the Makefile
+    # "include basename.Plo" scheme.
+    echo "#dummy" > "$depfile"
+  fi
+  rm -f "$tmpdepfile"
+  ;;
+
+icc)
+  # Intel's C compiler understands `-MD -MF file'.  However on
+  #    icc -MD -MF foo.d -c -o sub/foo.o sub/foo.c
+  # ICC 7.0 will fill foo.d with something like
+  #    foo.o: sub/foo.c
+  #    foo.o: sub/foo.h
+  # which is wrong.  We want:
+  #    sub/foo.o: sub/foo.c
+  #    sub/foo.o: sub/foo.h
+  #    sub/foo.c:
+  #    sub/foo.h:
+  # ICC 7.1 will output
+  #    foo.o: sub/foo.c sub/foo.h
+  # and will wrap long lines using \ :
+  #    foo.o: sub/foo.c ... \
+  #     sub/foo.h ... \
+  #     ...
+
+  "$@" -MD -MF "$tmpdepfile"
+  stat=$?
+  if test $stat -eq 0; then :
+  else
+    rm -f "$tmpdepfile"
+    exit $stat
+  fi
+  rm -f "$depfile"
+  # Each line is of the form `foo.o: dependent.h',
+  # or `foo.o: dep1.h dep2.h \', or ` dep3.h dep4.h \'.
+  # Do two passes, one to just change these to
+  # `$object: dependent.h' and one to simply `dependent.h:'.
+  sed "s,^[^:]*:,$object :," < "$tmpdepfile" > "$depfile"
+  # Some versions of the HPUX 10.20 sed can't process this invocation
+  # correctly.  Breaking it into two sed invocations is a workaround.
+  sed 's,^[^:]*: \(.*\)$,\1,;s/^\\$//;/^$/d;/:$/d' < "$tmpdepfile" |
+    sed -e 's/$/ :/' >> "$depfile"
+  rm -f "$tmpdepfile"
+  ;;
+
+hp2)
+  # The "hp" stanza above does not work with aCC (C++) and HP's ia64
+  # compilers, which have integrated preprocessors.  The correct option
+  # to use with these is +Maked; it writes dependencies to a file named
+  # 'foo.d', which lands next to the object file, wherever that
+  # happens to be.
+  # Much of this is similar to the tru64 case; see comments there.
+  dir=`echo "$object" | sed -e 's|/[^/]*$|/|'`
+  test "x$dir" = "x$object" && dir=
+  base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'`
+  if test "$libtool" = yes; then
+    tmpdepfile1=$dir$base.d
+    tmpdepfile2=$dir.libs/$base.d
+    "$@" -Wc,+Maked
+  else
+    tmpdepfile1=$dir$base.d
+    tmpdepfile2=$dir$base.d
+    "$@" +Maked
+  fi
+  stat=$?
+  if test $stat -eq 0; then :
+  else
+     rm -f "$tmpdepfile1" "$tmpdepfile2"
+     exit $stat
+  fi
+
+  for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2"
+  do
+    test -f "$tmpdepfile" && break
+  done
+  if test -f "$tmpdepfile"; then
+    sed -e "s,^.*\.[a-z]*:,$object:," "$tmpdepfile" > "$depfile"
+    # Add `dependent.h:' lines.
+    sed -ne '2,${
+              s/^ *//
+              s/ \\*$//
+              s/$/:/
+              p
+            }' "$tmpdepfile" >> "$depfile"
+  else
+    echo "#dummy" > "$depfile"
+  fi
+  rm -f "$tmpdepfile" "$tmpdepfile2"
+  ;;
+
+tru64)
+   # The Tru64 compiler uses -MD to generate dependencies as a side
+   # effect.  `cc -MD -o foo.o ...' puts the dependencies into `foo.o.d'.
+   # At least on Alpha/Redhat 6.1, Compaq CCC V6.2-504 seems to put
+   # dependencies in `foo.d' instead, so we check for that too.
+   # Subdirectories are respected.
+   dir=`echo "$object" | sed -e 's|/[^/]*$|/|'`
+   test "x$dir" = "x$object" && dir=
+   base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'`
+
+   if test "$libtool" = yes; then
+      # With Tru64 cc, shared objects can also be used to make a
+      # static library.  This mechanism is used in libtool 1.4 series to
+      # handle both shared and static libraries in a single compilation.
+      # With libtool 1.4, dependencies were output in $dir.libs/$base.lo.d.
+      #
+      # With libtool 1.5 this exception was removed, and libtool now
+      # generates 2 separate objects for the 2 libraries.  These two
+      # compilations output dependencies in $dir.libs/$base.o.d and
+      # in $dir$base.o.d.  We have to check for both files, because
+      # one of the two compilations can be disabled.  We should prefer
+      # $dir$base.o.d over $dir.libs/$base.o.d because the latter is
+      # automatically cleaned when .libs/ is deleted, while ignoring
+      # the former would cause a distcleancheck panic.
+      tmpdepfile1=$dir.libs/$base.lo.d   # libtool 1.4
+      tmpdepfile2=$dir$base.o.d          # libtool 1.5
+      tmpdepfile3=$dir.libs/$base.o.d    # libtool 1.5
+      tmpdepfile4=$dir.libs/$base.d      # Compaq CCC V6.2-504
+      "$@" -Wc,-MD
+   else
+      tmpdepfile1=$dir$base.o.d
+      tmpdepfile2=$dir$base.d
+      tmpdepfile3=$dir$base.d
+      tmpdepfile4=$dir$base.d
+      "$@" -MD
+   fi
+
+   stat=$?
+   if test $stat -eq 0; then :
+   else
+      rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" "$tmpdepfile4"
+      exit $stat
+   fi
+
+   for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" "$tmpdepfile4"
+   do
+     test -f "$tmpdepfile" && break
+   done
+   if test -f "$tmpdepfile"; then
+      sed -e "s,^.*\.[a-z]*:,$object:," < "$tmpdepfile" > "$depfile"
+      # That's a tab and a space in the [].
+      sed -e 's,^.*\.[a-z]*:[   ]*,,' -e 's,$,:,' < "$tmpdepfile" >> "$depfile"
+   else
+      echo "#dummy" > "$depfile"
+   fi
+   rm -f "$tmpdepfile"
+   ;;
+
+msvc7)
+  if test "$libtool" = yes; then
+    showIncludes=-Wc,-showIncludes
+  else
+    showIncludes=-showIncludes
+  fi
+  "$@" $showIncludes > "$tmpdepfile"
+  stat=$?
+  grep -v '^Note: including file: ' "$tmpdepfile"
+  if test "$stat" = 0; then :
+  else
+    rm -f "$tmpdepfile"
+    exit $stat
+  fi
+  rm -f "$depfile"
+  echo "$object : \\" > "$depfile"
+  # The first sed program below extracts the file names and escapes
+  # backslashes for cygpath.  The second sed program outputs the file
+  # name when reading, but also accumulates all include files in the
+  # hold buffer in order to output them again at the end.  This only
+  # works with sed implementations that can handle large buffers.
+  sed < "$tmpdepfile" -n '
+/^Note: including file:  *\(.*\)/ {
+  s//\1/
+  s/\\/\\\\/g
+  p
+}' | $cygpath_u | sort -u | sed -n '
+s/ /\\ /g
+s/\(.*\)/      \1 \\/p
+s/.\(.*\) \\/\1:/
+H
+$ {
+  s/.*/        /
+  G
+  p
+}' >> "$depfile"
+  rm -f "$tmpdepfile"
+  ;;
+
+msvc7msys)
+  # This case exists only to let depend.m4 do its work.  It works by
+  # looking at the text of this script.  This case will never be run,
+  # since it is checked for above.
+  exit 1
+  ;;
+
+#nosideeffect)
+  # This comment above is used by automake to tell side-effect
+  # dependency tracking mechanisms from slower ones.
+
+dashmstdout)
+  # Important note: in order to support this mode, a compiler *must*
+  # always write the preprocessed file to stdout, regardless of -o.
+  "$@" || exit $?
+
+  # Remove the call to Libtool.
+  if test "$libtool" = yes; then
+    while test "X$1" != 'X--mode=compile'; do
+      shift
+    done
+    shift
+  fi
+
+  # Remove `-o $object'.
+  IFS=" "
+  for arg
+  do
+    case $arg in
+    -o)
+      shift
+      ;;
+    $object)
+      shift
+      ;;
+    *)
+      set fnord "$@" "$arg"
+      shift # fnord
+      shift # $arg
+      ;;
+    esac
+  done
+
+  test -z "$dashmflag" && dashmflag=-M
+  # Require at least two characters before searching for `:'
+  # in the target name.  This is to cope with DOS-style filenames:
+  # a dependency such as `c:/foo/bar' could be seen as target `c' otherwise.
+  "$@" $dashmflag |
+    sed 's:^[  ]*[^: ][^:][^:]*\:[    ]*:'"$object"'\: :' > "$tmpdepfile"
+  rm -f "$depfile"
+  cat < "$tmpdepfile" > "$depfile"
+  tr ' ' '
+' < "$tmpdepfile" | \
+## Some versions of the HPUX 10.20 sed can't process this invocation
+## correctly.  Breaking it into two sed invocations is a workaround.
+    sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile"
+  rm -f "$tmpdepfile"
+  ;;
+
+dashXmstdout)
+  # This case only exists to satisfy depend.m4.  It is never actually
+  # run, as this mode is specially recognized in the preamble.
+  exit 1
+  ;;
+
+makedepend)
+  "$@" || exit $?
+  # Remove any Libtool call
+  if test "$libtool" = yes; then
+    while test "X$1" != 'X--mode=compile'; do
+      shift
+    done
+    shift
+  fi
+  # X makedepend
+  shift
+  cleared=no eat=no
+  for arg
+  do
+    case $cleared in
+    no)
+      set ""; shift
+      cleared=yes ;;
+    esac
+    if test $eat = yes; then
+      eat=no
+      continue
+    fi
+    case "$arg" in
+    -D*|-I*)
+      set fnord "$@" "$arg"; shift ;;
+    # Strip any option that makedepend may not understand.  Remove
+    # the object too, otherwise makedepend will parse it as a source file.
+    -arch)
+      eat=yes ;;
+    -*|$object)
+      ;;
+    *)
+      set fnord "$@" "$arg"; shift ;;
+    esac
+  done
+  obj_suffix=`echo "$object" | sed 's/^.*\././'`
+  touch "$tmpdepfile"
+  ${MAKEDEPEND-makedepend} -o"$obj_suffix" -f"$tmpdepfile" "$@"
+  rm -f "$depfile"
+  # makedepend may prepend the VPATH from the source file name to the object.
+  # No need to regex-escape $object, excess matching of '.' is harmless.
+  sed "s|^.*\($object *:\)|\1|" "$tmpdepfile" > "$depfile"
+  sed '1,2d' "$tmpdepfile" | tr ' ' '
+' | \
+## Some versions of the HPUX 10.20 sed can't process this invocation
+## correctly.  Breaking it into two sed invocations is a workaround.
+    sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile"
+  rm -f "$tmpdepfile" "$tmpdepfile".bak
+  ;;
+
+cpp)
+  # Important note: in order to support this mode, a compiler *must*
+  # always write the preprocessed file to stdout.
+  "$@" || exit $?
+
+  # Remove the call to Libtool.
+  if test "$libtool" = yes; then
+    while test "X$1" != 'X--mode=compile'; do
+      shift
+    done
+    shift
+  fi
+
+  # Remove `-o $object'.
+  IFS=" "
+  for arg
+  do
+    case $arg in
+    -o)
+      shift
+      ;;
+    $object)
+      shift
+      ;;
+    *)
+      set fnord "$@" "$arg"
+      shift # fnord
+      shift # $arg
+      ;;
+    esac
+  done
+
+  "$@" -E |
+    sed -n -e '/^# [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \
+       -e '/^#line [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' |
+    sed '$ s: \\$::' > "$tmpdepfile"
+  rm -f "$depfile"
+  echo "$object : \\" > "$depfile"
+  cat < "$tmpdepfile" >> "$depfile"
+  sed < "$tmpdepfile" '/^$/d;s/^ //;s/ \\$//;s/$/ :/' >> "$depfile"
+  rm -f "$tmpdepfile"
+  ;;
+
+msvisualcpp)
+  # Important note: in order to support this mode, a compiler *must*
+  # always write the preprocessed file to stdout.
+  "$@" || exit $?
+
+  # Remove the call to Libtool.
+  if test "$libtool" = yes; then
+    while test "X$1" != 'X--mode=compile'; do
+      shift
+    done
+    shift
+  fi
+
+  IFS=" "
+  for arg
+  do
+    case "$arg" in
+    -o)
+      shift
+      ;;
+    $object)
+      shift
+      ;;
+    "-Gm"|"/Gm"|"-Gi"|"/Gi"|"-ZI"|"/ZI")
+       set fnord "$@"
+       shift
+       shift
+       ;;
+    *)
+       set fnord "$@" "$arg"
+       shift
+       shift
+       ;;
+    esac
+  done
+  "$@" -E 2>/dev/null |
+  sed -n '/^#line [0-9][0-9]* "\([^"]*\)"/ s::\1:p' | $cygpath_u | sort -u > "$tmpdepfile"
+  rm -f "$depfile"
+  echo "$object : \\" > "$depfile"
+  sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::     \1 \\:p' >> "$depfile"
+  echo "       " >> "$depfile"
+  sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::\1\::p' >> "$depfile"
+  rm -f "$tmpdepfile"
+  ;;
+
+msvcmsys)
+  # This case exists only to let depend.m4 do its work.  It works by
+  # looking at the text of this script.  This case will never be run,
+  # since it is checked for above.
+  exit 1
+  ;;
+
+none)
+  exec "$@"
+  ;;
+
+*)
+  echo "Unknown depmode $depmode" 1>&2
+  exit 1
+  ;;
+esac
+
+exit 0
+
+# Local Variables:
+# mode: shell-script
+# sh-indentation: 2
+# eval: (add-hook 'write-file-hooks 'time-stamp)
+# time-stamp-start: "scriptversion="
+# time-stamp-format: "%:y-%02m-%02d.%02H"
+# time-stamp-time-zone: "UTC"
+# time-stamp-end: "; # UTC"
+# End:
diff --git a/fofi/FoFiBase.cc b/fofi/FoFiBase.cc
new file mode 100644 (file)
index 0000000..86bafd8
--- /dev/null
@@ -0,0 +1,201 @@
+//========================================================================
+//
+// FoFiBase.cc
+//
+// Copyright 1999-2003 Glyph & Cog, LLC
+//
+//========================================================================
+
+//========================================================================
+//
+// Modified under the Poppler project - http://poppler.freedesktop.org
+//
+// All changes made under the Poppler project to this file are licensed
+// under GPL version 2 or later
+//
+// Copyright (C) 2008 Ed Avis <eda@waniasset.com>
+// Copyright (C) 2011 Jim Meyering <jim@meyering.net>
+//
+// To see a description of the changes please see the Changelog file that
+// came with your tarball or type make ChangeLog if you are building from git
+//
+//========================================================================
+
+#include <config.h>
+
+#ifdef USE_GCC_PRAGMAS
+#pragma implementation
+#endif
+
+#include <stdio.h>
+#include <limits.h>
+#include "goo/gmem.h"
+#include "poppler/Error.h"
+#include "FoFiBase.h"
+
+//------------------------------------------------------------------------
+// FoFiBase
+//------------------------------------------------------------------------
+
+FoFiBase::FoFiBase(char *fileA, int lenA, GBool freeFileDataA) {
+  fileData = file = (Guchar *)fileA;
+  len = lenA;
+  freeFileData = freeFileDataA;
+}
+
+FoFiBase::~FoFiBase() {
+  if (freeFileData) {
+    gfree(fileData);
+  }
+}
+
+char *FoFiBase::readFile(char *fileName, int *fileLen) {
+  FILE *f;
+  char *buf;
+  int n;
+
+  if (!(f = fopen(fileName, "rb"))) {
+    error(errIO, -1, "Cannot open '{0:s}'", fileName);
+    return NULL;
+  }
+  if (fseek(f, 0, SEEK_END) != 0) {
+    error(errIO, -1, "Cannot seek to end of '{0:s}'", fileName);
+    fclose(f);
+    return NULL;
+  }
+  n = (int)ftell(f);
+  if (n < 0) {
+    error(errIO, -1, "Cannot determine length of '{0:s}'", fileName);
+    fclose(f);
+    return NULL;
+  }
+  if (fseek(f, 0, SEEK_SET) != 0) {
+    error(errIO, -1, "Cannot seek to start of '{0:s}'", fileName);
+    fclose(f);
+    return NULL;
+  }
+  buf = (char *)gmalloc(n);
+  if ((int)fread(buf, 1, n, f) != n) {
+    gfree(buf);
+    fclose(f);
+    return NULL;
+  }
+  fclose(f);
+  *fileLen = n;
+  return buf;
+}
+
+int FoFiBase::getS8(int pos, GBool *ok) {
+  int x;
+
+  if (pos < 0 || pos >= len) {
+    *ok = gFalse;
+    return 0;
+  }
+  x = file[pos];
+  if (x & 0x80) {
+    x |= ~0xff;
+  }
+  return x;
+}
+
+int FoFiBase::getU8(int pos, GBool *ok) {
+  if (pos < 0 || pos >= len) {
+    *ok = gFalse;
+    return 0;
+  }
+  return file[pos];
+}
+
+int FoFiBase::getS16BE(int pos, GBool *ok) {
+  int x;
+
+  if (pos < 0 || pos+1 >= len || pos > INT_MAX - 1) {
+    *ok = gFalse;
+    return 0;
+  }
+  x = file[pos];
+  x = (x << 8) + file[pos+1];
+  if (x & 0x8000) {
+    x |= ~0xffff;
+  }
+  return x;
+}
+
+int FoFiBase::getU16BE(int pos, GBool *ok) {
+  int x;
+
+  if (pos < 0 || pos+1 >= len || pos > INT_MAX - 1) {
+    *ok = gFalse;
+    return 0;
+  }
+  x = file[pos];
+  x = (x << 8) + file[pos+1];
+  return x;
+}
+
+int FoFiBase::getS32BE(int pos, GBool *ok) {
+  int x;
+
+  if (pos < 0 || pos+3 >= len || pos > INT_MAX - 3) {
+    *ok = gFalse;
+    return 0;
+  }
+  x = file[pos];
+  x = (x << 8) + file[pos+1];
+  x = (x << 8) + file[pos+2];
+  x = (x << 8) + file[pos+3];
+  if (x & 0x80000000) {
+    x |= ~0xffffffff;
+  }
+  return x;
+}
+
+Guint FoFiBase::getU32BE(int pos, GBool *ok) {
+  Guint x;
+
+  if (pos < 0 || pos+3 >= len || pos > INT_MAX - 3) {
+    *ok = gFalse;
+    return 0;
+  }
+  x = file[pos];
+  x = (x << 8) + file[pos+1];
+  x = (x << 8) + file[pos+2];
+  x = (x << 8) + file[pos+3];
+  return x;
+}
+
+Guint FoFiBase::getU32LE(int pos, GBool *ok) {
+  Guint x;
+
+  if (pos < 0 || pos+3 >= len || pos > INT_MAX - 3) {
+    *ok = gFalse;
+    return 0;
+  }
+  x = file[pos+3];
+  x = (x << 8) + file[pos+2];
+  x = (x << 8) + file[pos+1];
+  x = (x << 8) + file[pos];
+  return x;
+}
+
+Guint FoFiBase::getUVarBE(int pos, int size, GBool *ok) {
+  Guint x;
+  int i;
+
+  if (pos < 0 || pos + size > len || pos > INT_MAX - size) {
+    *ok = gFalse;
+    return 0;
+  }
+  x = 0;
+  for (i = 0; i < size; ++i) {
+    x = (x << 8) + file[pos + i];
+  }
+  return x;
+}
+
+GBool FoFiBase::checkRegion(int pos, int size) {
+  return pos >= 0 &&
+         pos + size >= pos &&
+         pos + size <= len;
+}
diff --git a/fofi/FoFiBase.h b/fofi/FoFiBase.h
new file mode 100644 (file)
index 0000000..d613acd
--- /dev/null
@@ -0,0 +1,56 @@
+//========================================================================
+//
+// FoFiBase.h
+//
+// Copyright 1999-2003 Glyph & Cog, LLC
+//
+//========================================================================
+
+#ifndef FOFIBASE_H
+#define FOFIBASE_H
+
+#ifdef USE_GCC_PRAGMAS
+#pragma interface
+#endif
+
+#include "goo/gtypes.h"
+
+//------------------------------------------------------------------------
+
+typedef void (*FoFiOutputFunc)(void *stream, const char *data, int len);
+
+//------------------------------------------------------------------------
+// FoFiBase
+//------------------------------------------------------------------------
+
+class FoFiBase {
+public:
+
+  virtual ~FoFiBase();
+
+protected:
+
+  FoFiBase(char *fileA, int lenA, GBool freeFileDataA);
+  static char *readFile(char *fileName, int *fileLen);
+
+  // S = signed / U = unsigned
+  // 8/16/32/Var = word length, in bytes
+  // BE = big endian
+  int getS8(int pos, GBool *ok);
+  int getU8(int pos, GBool *ok);
+  int getS16BE(int pos, GBool *ok);
+  int getU16BE(int pos, GBool *ok);
+  int getS32BE(int pos, GBool *ok);
+  Guint getU32BE(int pos, GBool *ok);
+  Guint getU32LE(int pos, GBool *ok);
+  Guint getUVarBE(int pos, int size, GBool *ok);
+
+  GBool checkRegion(int pos, int size);
+
+  Guchar *fileData;
+  Guchar *file;
+  int len;
+  GBool freeFileData;
+};
+
+#endif
diff --git a/fofi/FoFiEncodings.cc b/fofi/FoFiEncodings.cc
new file mode 100644 (file)
index 0000000..5cea6fa
--- /dev/null
@@ -0,0 +1,994 @@
+//========================================================================
+//
+// FoFiEncodings.cc
+//
+// Copyright 1999-2003 Glyph & Cog, LLC
+//
+//========================================================================
+
+#include <config.h>
+
+#ifdef USE_GCC_PRAGMAS
+#pragma implementation
+#endif
+
+#include <stdlib.h>
+#include "FoFiEncodings.h"
+
+//------------------------------------------------------------------------
+// Type 1 and 1C font data
+//------------------------------------------------------------------------
+
+const char *fofiType1StandardEncoding[256] = {
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  "space",
+  "exclam",
+  "quotedbl",
+  "numbersign",
+  "dollar",
+  "percent",
+  "ampersand",
+  "quoteright",
+  "parenleft",
+  "parenright",
+  "asterisk",
+  "plus",
+  "comma",
+  "hyphen",
+  "period",
+  "slash",
+  "zero",
+  "one",
+  "two",
+  "three",
+  "four",
+  "five",
+  "six",
+  "seven",
+  "eight",
+  "nine",
+  "colon",
+  "semicolon",
+  "less",
+  "equal",
+  "greater",
+  "question",
+  "at",
+  "A",
+  "B",
+  "C",
+  "D",
+  "E",
+  "F",
+  "G",
+  "H",
+  "I",
+  "J",
+  "K",
+  "L",
+  "M",
+  "N",
+  "O",
+  "P",
+  "Q",
+  "R",
+  "S",
+  "T",
+  "U",
+  "V",
+  "W",
+  "X",
+  "Y",
+  "Z",
+  "bracketleft",
+  "backslash",
+  "bracketright",
+  "asciicircum",
+  "underscore",
+  "quoteleft",
+  "a",
+  "b",
+  "c",
+  "d",
+  "e",
+  "f",
+  "g",
+  "h",
+  "i",
+  "j",
+  "k",
+  "l",
+  "m",
+  "n",
+  "o",
+  "p",
+  "q",
+  "r",
+  "s",
+  "t",
+  "u",
+  "v",
+  "w",
+  "x",
+  "y",
+  "z",
+  "braceleft",
+  "bar",
+  "braceright",
+  "asciitilde",
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  "exclamdown",
+  "cent",
+  "sterling",
+  "fraction",
+  "yen",
+  "florin",
+  "section",
+  "currency",
+  "quotesingle",
+  "quotedblleft",
+  "guillemotleft",
+  "guilsinglleft",
+  "guilsinglright",
+  "fi",
+  "fl",
+  NULL,
+  "endash",
+  "dagger",
+  "daggerdbl",
+  "periodcentered",
+  NULL,
+  "paragraph",
+  "bullet",
+  "quotesinglbase",
+  "quotedblbase",
+  "quotedblright",
+  "guillemotright",
+  "ellipsis",
+  "perthousand",
+  NULL,
+  "questiondown",
+  NULL,
+  "grave",
+  "acute",
+  "circumflex",
+  "tilde",
+  "macron",
+  "breve",
+  "dotaccent",
+  "dieresis",
+  NULL,
+  "ring",
+  "cedilla",
+  NULL,
+  "hungarumlaut",
+  "ogonek",
+  "caron",
+  "emdash",
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  "AE",
+  NULL,
+  "ordfeminine",
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  "Lslash",
+  "Oslash",
+  "OE",
+  "ordmasculine",
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  "ae",
+  NULL,
+  NULL,
+  NULL,
+  "dotlessi",
+  NULL,
+  NULL,
+  "lslash",
+  "oslash",
+  "oe",
+  "germandbls",
+  NULL,
+  NULL,
+  NULL,
+  NULL
+};
+
+const char *fofiType1ExpertEncoding[256] = {
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  "space",
+  "exclamsmall",
+  "Hungarumlautsmall",
+  NULL,
+  "dollaroldstyle",
+  "dollarsuperior",
+  "ampersandsmall",
+  "Acutesmall",
+  "parenleftsuperior",
+  "parenrightsuperior",
+  "twodotenleader",
+  "onedotenleader",
+  "comma",
+  "hyphen",
+  "period",
+  "fraction",
+  "zerooldstyle",
+  "oneoldstyle",
+  "twooldstyle",
+  "threeoldstyle",
+  "fouroldstyle",
+  "fiveoldstyle",
+  "sixoldstyle",
+  "sevenoldstyle",
+  "eightoldstyle",
+  "nineoldstyle",
+  "colon",
+  "semicolon",
+  "commasuperior",
+  "threequartersemdash",
+  "periodsuperior",
+  "questionsmall",
+  NULL,
+  "asuperior",
+  "bsuperior",
+  "centsuperior",
+  "dsuperior",
+  "esuperior",
+  NULL,
+  NULL,
+  NULL,
+  "isuperior",
+  NULL,
+  NULL,
+  "lsuperior",
+  "msuperior",
+  "nsuperior",
+  "osuperior",
+  NULL,
+  NULL,
+  "rsuperior",
+  "ssuperior",
+  "tsuperior",
+  NULL,
+  "ff",
+  "fi",
+  "fl",
+  "ffi",
+  "ffl",
+  "parenleftinferior",
+  NULL,
+  "parenrightinferior",
+  "Circumflexsmall",
+  "hyphensuperior",
+  "Gravesmall",
+  "Asmall",
+  "Bsmall",
+  "Csmall",
+  "Dsmall",
+  "Esmall",
+  "Fsmall",
+  "Gsmall",
+  "Hsmall",
+  "Ismall",
+  "Jsmall",
+  "Ksmall",
+  "Lsmall",
+  "Msmall",
+  "Nsmall",
+  "Osmall",
+  "Psmall",
+  "Qsmall",
+  "Rsmall",
+  "Ssmall",
+  "Tsmall",
+  "Usmall",
+  "Vsmall",
+  "Wsmall",
+  "Xsmall",
+  "Ysmall",
+  "Zsmall",
+  "colonmonetary",
+  "onefitted",
+  "rupiah",
+  "Tildesmall",
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  "exclamdownsmall",
+  "centoldstyle",
+  "Lslashsmall",
+  NULL,
+  NULL,
+  "Scaronsmall",
+  "Zcaronsmall",
+  "Dieresissmall",
+  "Brevesmall",
+  "Caronsmall",
+  NULL,
+  "Dotaccentsmall",
+  NULL,
+  NULL,
+  "Macronsmall",
+  NULL,
+  NULL,
+  "figuredash",
+  "hypheninferior",
+  NULL,
+  NULL,
+  "Ogoneksmall",
+  "Ringsmall",
+  "Cedillasmall",
+  NULL,
+  NULL,
+  NULL,
+  "onequarter",
+  "onehalf",
+  "threequarters",
+  "questiondownsmall",
+  "oneeighth",
+  "threeeighths",
+  "fiveeighths",
+  "seveneighths",
+  "onethird",
+  "twothirds",
+  NULL,
+  NULL,
+  "zerosuperior",
+  "onesuperior",
+  "twosuperior",
+  "threesuperior",
+  "foursuperior",
+  "fivesuperior",
+  "sixsuperior",
+  "sevensuperior",
+  "eightsuperior",
+  "ninesuperior",
+  "zeroinferior",
+  "oneinferior",
+  "twoinferior",
+  "threeinferior",
+  "fourinferior",
+  "fiveinferior",
+  "sixinferior",
+  "seveninferior",
+  "eightinferior",
+  "nineinferior",
+  "centinferior",
+  "dollarinferior",
+  "periodinferior",
+  "commainferior",
+  "Agravesmall",
+  "Aacutesmall",
+  "Acircumflexsmall",
+  "Atildesmall",
+  "Adieresissmall",
+  "Aringsmall",
+  "AEsmall",
+  "Ccedillasmall",
+  "Egravesmall",
+  "Eacutesmall",
+  "Ecircumflexsmall",
+  "Edieresissmall",
+  "Igravesmall",
+  "Iacutesmall",
+  "Icircumflexsmall",
+  "Idieresissmall",
+  "Ethsmall",
+  "Ntildesmall",
+  "Ogravesmall",
+  "Oacutesmall",
+  "Ocircumflexsmall",
+  "Otildesmall",
+  "Odieresissmall",
+  "OEsmall",
+  "Oslashsmall",
+  "Ugravesmall",
+  "Uacutesmall",
+  "Ucircumflexsmall",
+  "Udieresissmall",
+  "Yacutesmall",
+  "Thornsmall",
+  "Ydieresissmall"
+};
+
+//------------------------------------------------------------------------
+// Type 1C font data
+//------------------------------------------------------------------------
+
+const char *fofiType1CStdStrings[391] = {
+  ".notdef",
+  "space",
+  "exclam",
+  "quotedbl",
+  "numbersign",
+  "dollar",
+  "percent",
+  "ampersand",
+  "quoteright",
+  "parenleft",
+  "parenright",
+  "asterisk",
+  "plus",
+  "comma",
+  "hyphen",
+  "period",
+  "slash",
+  "zero",
+  "one",
+  "two",
+  "three",
+  "four",
+  "five",
+  "six",
+  "seven",
+  "eight",
+  "nine",
+  "colon",
+  "semicolon",
+  "less",
+  "equal",
+  "greater",
+  "question",
+  "at",
+  "A",
+  "B",
+  "C",
+  "D",
+  "E",
+  "F",
+  "G",
+  "H",
+  "I",
+  "J",
+  "K",
+  "L",
+  "M",
+  "N",
+  "O",
+  "P",
+  "Q",
+  "R",
+  "S",
+  "T",
+  "U",
+  "V",
+  "W",
+  "X",
+  "Y",
+  "Z",
+  "bracketleft",
+  "backslash",
+  "bracketright",
+  "asciicircum",
+  "underscore",
+  "quoteleft",
+  "a",
+  "b",
+  "c",
+  "d",
+  "e",
+  "f",
+  "g",
+  "h",
+  "i",
+  "j",
+  "k",
+  "l",
+  "m",
+  "n",
+  "o",
+  "p",
+  "q",
+  "r",
+  "s",
+  "t",
+  "u",
+  "v",
+  "w",
+  "x",
+  "y",
+  "z",
+  "braceleft",
+  "bar",
+  "braceright",
+  "asciitilde",
+  "exclamdown",
+  "cent",
+  "sterling",
+  "fraction",
+  "yen",
+  "florin",
+  "section",
+  "currency",
+  "quotesingle",
+  "quotedblleft",
+  "guillemotleft",
+  "guilsinglleft",
+  "guilsinglright",
+  "fi",
+  "fl",
+  "endash",
+  "dagger",
+  "daggerdbl",
+  "periodcentered",
+  "paragraph",
+  "bullet",
+  "quotesinglbase",
+  "quotedblbase",
+  "quotedblright",
+  "guillemotright",
+  "ellipsis",
+  "perthousand",
+  "questiondown",
+  "grave",
+  "acute",
+  "circumflex",
+  "tilde",
+  "macron",
+  "breve",
+  "dotaccent",
+  "dieresis",
+  "ring",
+  "cedilla",
+  "hungarumlaut",
+  "ogonek",
+  "caron",
+  "emdash",
+  "AE",
+  "ordfeminine",
+  "Lslash",
+  "Oslash",
+  "OE",
+  "ordmasculine",
+  "ae",
+  "dotlessi",
+  "lslash",
+  "oslash",
+  "oe",
+  "germandbls",
+  "onesuperior",
+  "logicalnot",
+  "mu",
+  "trademark",
+  "Eth",
+  "onehalf",
+  "plusminus",
+  "Thorn",
+  "onequarter",
+  "divide",
+  "brokenbar",
+  "degree",
+  "thorn",
+  "threequarters",
+  "twosuperior",
+  "registered",
+  "minus",
+  "eth",
+  "multiply",
+  "threesuperior",
+  "copyright",
+  "Aacute",
+  "Acircumflex",
+  "Adieresis",
+  "Agrave",
+  "Aring",
+  "Atilde",
+  "Ccedilla",
+  "Eacute",
+  "Ecircumflex",
+  "Edieresis",
+  "Egrave",
+  "Iacute",
+  "Icircumflex",
+  "Idieresis",
+  "Igrave",
+  "Ntilde",
+  "Oacute",
+  "Ocircumflex",
+  "Odieresis",
+  "Ograve",
+  "Otilde",
+  "Scaron",
+  "Uacute",
+  "Ucircumflex",
+  "Udieresis",
+  "Ugrave",
+  "Yacute",
+  "Ydieresis",
+  "Zcaron",
+  "aacute",
+  "acircumflex",
+  "adieresis",
+  "agrave",
+  "aring",
+  "atilde",
+  "ccedilla",
+  "eacute",
+  "ecircumflex",
+  "edieresis",
+  "egrave",
+  "iacute",
+  "icircumflex",
+  "idieresis",
+  "igrave",
+  "ntilde",
+  "oacute",
+  "ocircumflex",
+  "odieresis",
+  "ograve",
+  "otilde",
+  "scaron",
+  "uacute",
+  "ucircumflex",
+  "udieresis",
+  "ugrave",
+  "yacute",
+  "ydieresis",
+  "zcaron",
+  "exclamsmall",
+  "Hungarumlautsmall",
+  "dollaroldstyle",
+  "dollarsuperior",
+  "ampersandsmall",
+  "Acutesmall",
+  "parenleftsuperior",
+  "parenrightsuperior",
+  "twodotenleader",
+  "onedotenleader",
+  "zerooldstyle",
+  "oneoldstyle",
+  "twooldstyle",
+  "threeoldstyle",
+  "fouroldstyle",
+  "fiveoldstyle",
+  "sixoldstyle",
+  "sevenoldstyle",
+  "eightoldstyle",
+  "nineoldstyle",
+  "commasuperior",
+  "threequartersemdash",
+  "periodsuperior",
+  "questionsmall",
+  "asuperior",
+  "bsuperior",
+  "centsuperior",
+  "dsuperior",
+  "esuperior",
+  "isuperior",
+  "lsuperior",
+  "msuperior",
+  "nsuperior",
+  "osuperior",
+  "rsuperior",
+  "ssuperior",
+  "tsuperior",
+  "ff",
+  "ffi",
+  "ffl",
+  "parenleftinferior",
+  "parenrightinferior",
+  "Circumflexsmall",
+  "hyphensuperior",
+  "Gravesmall",
+  "Asmall",
+  "Bsmall",
+  "Csmall",
+  "Dsmall",
+  "Esmall",
+  "Fsmall",
+  "Gsmall",
+  "Hsmall",
+  "Ismall",
+  "Jsmall",
+  "Ksmall",
+  "Lsmall",
+  "Msmall",
+  "Nsmall",
+  "Osmall",
+  "Psmall",
+  "Qsmall",
+  "Rsmall",
+  "Ssmall",
+  "Tsmall",
+  "Usmall",
+  "Vsmall",
+  "Wsmall",
+  "Xsmall",
+  "Ysmall",
+  "Zsmall",
+  "colonmonetary",
+  "onefitted",
+  "rupiah",
+  "Tildesmall",
+  "exclamdownsmall",
+  "centoldstyle",
+  "Lslashsmall",
+  "Scaronsmall",
+  "Zcaronsmall",
+  "Dieresissmall",
+  "Brevesmall",
+  "Caronsmall",
+  "Dotaccentsmall",
+  "Macronsmall",
+  "figuredash",
+  "hypheninferior",
+  "Ogoneksmall",
+  "Ringsmall",
+  "Cedillasmall",
+  "questiondownsmall",
+  "oneeighth",
+  "threeeighths",
+  "fiveeighths",
+  "seveneighths",
+  "onethird",
+  "twothirds",
+  "zerosuperior",
+  "foursuperior",
+  "fivesuperior",
+  "sixsuperior",
+  "sevensuperior",
+  "eightsuperior",
+  "ninesuperior",
+  "zeroinferior",
+  "oneinferior",
+  "twoinferior",
+  "threeinferior",
+  "fourinferior",
+  "fiveinferior",
+  "sixinferior",
+  "seveninferior",
+  "eightinferior",
+  "nineinferior",
+  "centinferior",
+  "dollarinferior",
+  "periodinferior",
+  "commainferior",
+  "Agravesmall",
+  "Aacutesmall",
+  "Acircumflexsmall",
+  "Atildesmall",
+  "Adieresissmall",
+  "Aringsmall",
+  "AEsmall",
+  "Ccedillasmall",
+  "Egravesmall",
+  "Eacutesmall",
+  "Ecircumflexsmall",
+  "Edieresissmall",
+  "Igravesmall",
+  "Iacutesmall",
+  "Icircumflexsmall",
+  "Idieresissmall",
+  "Ethsmall",
+  "Ntildesmall",
+  "Ogravesmall",
+  "Oacutesmall",
+  "Ocircumflexsmall",
+  "Otildesmall",
+  "Odieresissmall",
+  "OEsmall",
+  "Oslashsmall",
+  "Ugravesmall",
+  "Uacutesmall",
+  "Ucircumflexsmall",
+  "Udieresissmall",
+  "Yacutesmall",
+  "Thornsmall",
+  "Ydieresissmall",
+  "001.000",
+  "001.001",
+  "001.002",
+  "001.003",
+  "Black",
+  "Bold",
+  "Book",
+  "Light",
+  "Medium",
+  "Regular",
+  "Roman",
+  "Semibold"
+};
+
+Gushort fofiType1CISOAdobeCharset[229] = {
+    0,   1,   2,   3,   4,   5,   6,   7,   8,   9,
+   10,  11,  12,  13,  14,  15,  16,  17,  18,  19,
+   20,  21,  22,  23,  24,  25,  26,  27,  28,  29,
+   30,  31,  32,  33,  34,  35,  36,  37,  38,  39,
+   40,  41,  42,  43,  44,  45,  46,  47,  48,  49,
+   50,  51,  52,  53,  54,  55,  56,  57,  58,  59,
+   60,  61,  62,  63,  64,  65,  66,  67,  68,  69,
+   70,  71,  72,  73,  74,  75,  76,  77,  78,  79,
+   80,  81,  82,  83,  84,  85,  86,  87,  88,  89,
+   90,  91,  92,  93,  94,  95,  96,  97,  98,  99,
+  100, 101, 102, 103, 104, 105, 106, 107, 108, 109,
+  110, 111, 112, 113, 114, 115, 116, 117, 118, 119,
+  120, 121, 122, 123, 124, 125, 126, 127, 128, 129,
+  130, 131, 132, 133, 134, 135, 136, 137, 138, 139,
+  140, 141, 142, 143, 144, 145, 146, 147, 148, 149,
+  150, 151, 152, 153, 154, 155, 156, 157, 158, 159,
+  160, 161, 162, 163, 164, 165, 166, 167, 168, 169,
+  170, 171, 172, 173, 174, 175, 176, 177, 178, 179,
+  180, 181, 182, 183, 184, 185, 186, 187, 188, 189,
+  190, 191, 192, 193, 194, 195, 196, 197, 198, 199,
+  200, 201, 202, 203, 204, 205, 206, 207, 208, 209,
+  210, 211, 212, 213, 214, 215, 216, 217, 218, 219,
+  220, 221, 222, 223, 224, 225, 226, 227, 228
+};
+
+Gushort fofiType1CExpertCharset[166] = {
+    0,   1, 229, 230, 231, 232, 233, 234, 235, 236,
+  237, 238,  13,  14,  15,  99, 239, 240, 241, 242,
+  243, 244, 245, 246, 247, 248,  27,  28, 249, 250,
+  251, 252, 253, 254, 255, 256, 257, 258, 259, 260,
+  261, 262, 263, 264, 265, 266, 109, 110, 267, 268,
+  269, 270, 271, 272, 273, 274, 275, 276, 277, 278,
+  279, 280, 281, 282, 283, 284, 285, 286, 287, 288,
+  289, 290, 291, 292, 293, 294, 295, 296, 297, 298,
+  299, 300, 301, 302, 303, 304, 305, 306, 307, 308,
+  309, 310, 311, 312, 313, 314, 315, 316, 317, 318,
+  158, 155, 163, 319, 320, 321, 322, 323, 324, 325,
+  326, 150, 164, 169, 327, 328, 329, 330, 331, 332,
+  333, 334, 335, 336, 337, 338, 339, 340, 341, 342,
+  343, 344, 345, 346, 347, 348, 349, 350, 351, 352,
+  353, 354, 355, 356, 357, 358, 359, 360, 361, 362,
+  363, 364, 365, 366, 367, 368, 369, 370, 371, 372,
+  373, 374, 375, 376, 377, 378
+};
+
+Gushort fofiType1CExpertSubsetCharset[87] = {
+    0,   1, 231, 232, 235, 236, 237, 238,  13,  14,
+   15,  99, 239, 240, 241, 242, 243, 244, 245, 246,
+  247, 248,  27,  28, 249, 250, 251, 253, 254, 255,
+  256, 257, 258, 259, 260, 261, 262, 263, 264, 265,
+  266, 109, 110, 267, 268, 269, 270, 272, 300, 301,
+  302, 305, 314, 315, 158, 155, 163, 320, 321, 322,
+  323, 324, 325, 326, 150, 164, 169, 327, 328, 329,
+  330, 331, 332, 333, 334, 335, 336, 337, 338, 339,
+  340, 341, 342, 343, 344, 345, 346
+};
diff --git a/fofi/FoFiEncodings.h b/fofi/FoFiEncodings.h
new file mode 100644 (file)
index 0000000..ab80ad3
--- /dev/null
@@ -0,0 +1,34 @@
+//========================================================================
+//
+// FoFiEncodings.h
+//
+// Copyright 1999-2003 Glyph & Cog, LLC
+//
+//========================================================================
+
+#ifndef FOFIENCODINGS_H
+#define FOFIENCODINGS_H
+
+#ifdef USE_GCC_PRAGMAS
+#pragma interface
+#endif
+
+#include "goo/gtypes.h"
+
+//------------------------------------------------------------------------
+// Type 1 and 1C font data
+//------------------------------------------------------------------------
+
+extern const char *fofiType1StandardEncoding[256];
+extern const char *fofiType1ExpertEncoding[256];
+
+//------------------------------------------------------------------------
+// Type 1C font data
+//------------------------------------------------------------------------
+
+extern const char *fofiType1CStdStrings[391];
+extern Gushort fofiType1CISOAdobeCharset[229];
+extern Gushort fofiType1CExpertCharset[166];
+extern Gushort fofiType1CExpertSubsetCharset[87];
+
+#endif
diff --git a/fofi/FoFiIdentifier.cc b/fofi/FoFiIdentifier.cc
new file mode 100644 (file)
index 0000000..d8ee7e0
--- /dev/null
@@ -0,0 +1,630 @@
+//========================================================================
+//
+// FoFiIdentifier.cc
+//
+// Copyright 2009 Glyph & Cog, LLC
+//
+//========================================================================
+
+#ifdef USE_GCC_PRAGMAS
+#pragma implementation
+#endif
+
+#include <stdio.h>
+#include <string.h>
+#include <limits.h>
+#include "goo/gtypes.h"
+#include "FoFiIdentifier.h"
+
+//------------------------------------------------------------------------
+
+class Reader {
+public:
+
+  virtual ~Reader() {}
+
+  // Read one byte.  Returns -1 if past EOF.
+  virtual int getByte(int pos) = 0;
+
+  // Read a big-endian unsigned 16-bit integer.  Fills in *val and
+  // returns true if successful.
+  virtual GBool getU16BE(int pos, int *val) = 0;
+
+  // Read a big-endian unsigned 32-bit integer.  Fills in *val and
+  // returns true if successful.
+  virtual GBool getU32BE(int pos, Guint *val) = 0;
+
+  // Read a little-endian unsigned 32-bit integer.  Fills in *val and
+  // returns true if successful.
+  virtual GBool getU32LE(int pos, Guint *val) = 0;
+
+  // Read a big-endian unsigned <size>-byte integer, where 1 <= size
+  // <= 4.  Fills in *val and returns true if successful.
+  virtual GBool getUVarBE(int pos, int size, Guint *val) = 0;
+
+  // Compare against a string.  Returns true if equal.
+  virtual GBool cmp(int pos, const char *s) = 0;
+
+};
+
+//------------------------------------------------------------------------
+
+class MemReader: public Reader {
+public:
+
+  static MemReader *make(char *bufA, int lenA);
+  virtual ~MemReader();
+  virtual int getByte(int pos);
+  virtual GBool getU16BE(int pos, int *val);
+  virtual GBool getU32BE(int pos, Guint *val);
+  virtual GBool getU32LE(int pos, Guint *val);
+  virtual GBool getUVarBE(int pos, int size, Guint *val);
+  virtual GBool cmp(int pos, const char *s);
+
+private:
+
+  MemReader(char *bufA, int lenA);
+
+  char *buf;
+  int len;
+};
+
+MemReader *MemReader::make(char *bufA, int lenA) {
+  return new MemReader(bufA, lenA);
+}
+
+MemReader::MemReader(char *bufA, int lenA) {
+  buf = bufA;
+  len = lenA;
+}
+
+MemReader::~MemReader() {
+}
+
+int MemReader::getByte(int pos) {
+  if (pos < 0 || pos >= len) {
+    return -1;
+  }
+  return buf[pos] & 0xff;
+}
+
+GBool MemReader::getU16BE(int pos, int *val) {
+  if (pos < 0 || pos > len - 2) {
+    return gFalse;
+  }
+  *val = ((buf[pos] & 0xff) << 8) +
+         (buf[pos+1] & 0xff);
+  return gTrue;
+}
+
+GBool MemReader::getU32BE(int pos, Guint *val) {
+  if (pos < 0 || pos > len - 4) {
+    return gFalse;
+  }
+  *val = ((buf[pos] & 0xff) << 24) +
+         ((buf[pos+1] & 0xff) << 16) +
+         ((buf[pos+2] & 0xff) << 8) +
+         (buf[pos+3] & 0xff);
+  return gTrue;
+}
+
+GBool MemReader::getU32LE(int pos, Guint *val) {
+  if (pos < 0 || pos > len - 4) {
+    return gFalse;
+  }
+  *val = (buf[pos] & 0xff) +
+         ((buf[pos+1] & 0xff) << 8) +
+         ((buf[pos+2] & 0xff) << 16) +
+         ((buf[pos+3] & 0xff) << 24);
+  return gTrue;
+}
+
+GBool MemReader::getUVarBE(int pos, int size, Guint *val) {
+  int i;
+
+  if (size < 1 || size > 4 || pos < 0 || pos > len - size) {
+    return gFalse;
+  }
+  *val = 0;
+  for (i = 0; i < size; ++i) {
+    *val = (*val << 8) + (buf[pos + i] & 0xff);
+  }
+  return gTrue;
+}
+
+GBool MemReader::cmp(int pos, const char *s) {
+  int n;
+
+  n = (int)strlen(s);
+  if (pos < 0 || len < n || pos > len - n) {
+    return gFalse;
+  }
+  return !memcmp(buf + pos, s, n);
+}
+
+//------------------------------------------------------------------------
+
+class FileReader: public Reader {
+public:
+
+  static FileReader *make(char *fileName);
+  virtual ~FileReader();
+  virtual int getByte(int pos);
+  virtual GBool getU16BE(int pos, int *val);
+  virtual GBool getU32BE(int pos, Guint *val);
+  virtual GBool getU32LE(int pos, Guint *val);
+  virtual GBool getUVarBE(int pos, int size, Guint *val);
+  virtual GBool cmp(int pos, const char *s);
+
+private:
+
+  FileReader(FILE *fA);
+  GBool fillBuf(int pos, int len);
+
+  FILE *f;
+  char buf[1024];
+  int bufPos, bufLen;
+};
+
+FileReader *FileReader::make(char *fileName) {
+  FILE *fA;
+
+  if (!(fA = fopen(fileName, "rb"))) {
+    return NULL;
+  }
+  return new FileReader(fA);
+}
+
+FileReader::FileReader(FILE *fA) {
+  f = fA;
+  bufPos = 0;
+  bufLen = 0;
+}
+
+FileReader::~FileReader() {
+  fclose(f);
+}
+
+int FileReader::getByte(int pos) {
+  if (!fillBuf(pos, 1)) {
+    return -1;
+  }
+  return buf[pos - bufPos] & 0xff;
+}
+
+GBool FileReader::getU16BE(int pos, int *val) {
+  if (!fillBuf(pos, 2)) {
+    return gFalse;
+  }
+  *val = ((buf[pos - bufPos] & 0xff) << 8) +
+         (buf[pos - bufPos + 1] & 0xff);
+  return gTrue;
+}
+
+GBool FileReader::getU32BE(int pos, Guint *val) {
+  if (!fillBuf(pos, 4)) {
+    return gFalse;
+  }
+  *val = ((buf[pos - bufPos] & 0xff) << 24) +
+         ((buf[pos - bufPos + 1] & 0xff) << 16) +
+         ((buf[pos - bufPos + 2] & 0xff) << 8) +
+         (buf[pos - bufPos + 3] & 0xff);
+  return gTrue;
+}
+
+GBool FileReader::getU32LE(int pos, Guint *val) {
+  if (!fillBuf(pos, 4)) {
+    return gFalse;
+  }
+  *val = (buf[pos - bufPos] & 0xff) +
+         ((buf[pos - bufPos + 1] & 0xff) << 8) +
+         ((buf[pos - bufPos + 2] & 0xff) << 16) +
+         ((buf[pos - bufPos + 3] & 0xff) << 24);
+  return gTrue;
+}
+
+GBool FileReader::getUVarBE(int pos, int size, Guint *val) {
+  int i;
+
+  if (size < 1 || size > 4 || !fillBuf(pos, size)) {
+    return gFalse;
+  }
+  *val = 0;
+  for (i = 0; i < size; ++i) {
+    *val = (*val << 8) + (buf[pos - bufPos + i] & 0xff);
+  }
+  return gTrue;
+}
+
+GBool FileReader::cmp(int pos, const char *s) {
+  int n;
+
+  n = (int)strlen(s);
+  if (!fillBuf(pos, n)) {
+    return gFalse;
+  }
+  return !memcmp(buf - bufPos + pos, s, n);
+}
+
+GBool FileReader::fillBuf(int pos, int len) {
+  if (pos < 0 || len < 0 || len > (int)sizeof(buf) ||
+      pos > INT_MAX - (int)sizeof(buf)) {
+    return gFalse;
+  }
+  if (pos >= bufPos && pos + len <= bufPos + bufLen) {
+    return gTrue;
+  }
+  if (fseek(f, pos, SEEK_SET)) {
+    return gFalse;
+  }
+  bufPos = pos;
+  bufLen = (int)fread(buf, 1, sizeof(buf), f);
+  if (bufLen < len) {
+    return gFalse;
+  }
+  return gTrue;
+}
+
+//------------------------------------------------------------------------
+
+class StreamReader: public Reader {
+public:
+
+  static StreamReader *make(int (*getCharA)(void *data), void *dataA);
+  virtual ~StreamReader();
+  virtual int getByte(int pos);
+  virtual GBool getU16BE(int pos, int *val);
+  virtual GBool getU32BE(int pos, Guint *val);
+  virtual GBool getU32LE(int pos, Guint *val);
+  virtual GBool getUVarBE(int pos, int size, Guint *val);
+  virtual GBool cmp(int pos, const char *s);
+
+private:
+
+  StreamReader(int (*getCharA)(void *data), void *dataA);
+  GBool fillBuf(int pos, int len);
+
+  int (*getChar)(void *data);
+  void *data;
+  int streamPos;
+  char buf[1024];
+  int bufPos, bufLen;
+};
+
+StreamReader *StreamReader::make(int (*getCharA)(void *data), void *dataA) {
+  return new StreamReader(getCharA, dataA);
+}
+
+StreamReader::StreamReader(int (*getCharA)(void *data), void *dataA) {
+  getChar = getCharA;
+  data = dataA;
+  streamPos = 0;
+  bufPos = 0;
+  bufLen = 0;
+}
+
+StreamReader::~StreamReader() {
+}
+
+int StreamReader::getByte(int pos) {
+  if (!fillBuf(pos, 1)) {
+    return -1;
+  }
+  return buf[pos - bufPos] & 0xff;
+}
+
+GBool StreamReader::getU16BE(int pos, int *val) {
+  if (!fillBuf(pos, 2)) {
+    return gFalse;
+  }
+  *val = ((buf[pos - bufPos] & 0xff) << 8) +
+         (buf[pos - bufPos + 1] & 0xff);
+  return gTrue;
+}
+
+GBool StreamReader::getU32BE(int pos, Guint *val) {
+  if (!fillBuf(pos, 4)) {
+    return gFalse;
+  }
+  *val = ((buf[pos - bufPos] & 0xff) << 24) +
+         ((buf[pos - bufPos + 1] & 0xff) << 16) +
+         ((buf[pos - bufPos + 2] & 0xff) << 8) +
+         (buf[pos - bufPos + 3] & 0xff);
+  return gTrue;
+}
+
+GBool StreamReader::getU32LE(int pos, Guint *val) {
+  if (!fillBuf(pos, 4)) {
+    return gFalse;
+  }
+  *val = (buf[pos - bufPos] & 0xff) +
+         ((buf[pos - bufPos + 1] & 0xff) << 8) +
+         ((buf[pos - bufPos + 2] & 0xff) << 16) +
+         ((buf[pos - bufPos + 3] & 0xff) << 24);
+  return gTrue;
+}
+
+GBool StreamReader::getUVarBE(int pos, int size, Guint *val) {
+  int i;
+
+  if (size < 1 || size > 4 || !fillBuf(pos, size)) {
+    return gFalse;
+  }
+  *val = 0;
+  for (i = 0; i < size; ++i) {
+    *val = (*val << 8) + (buf[pos - bufPos + i] & 0xff);
+  }
+  return gTrue;
+}
+
+GBool StreamReader::cmp(int pos, const char *s) {
+  int n;
+
+  n = (int)strlen(s);
+  if (!fillBuf(pos, n)) {
+    return gFalse;
+  }
+  return !memcmp(buf - bufPos + pos, s, n);
+}
+
+GBool StreamReader::fillBuf(int pos, int len) {
+  int c;
+
+  if (pos < 0 || len < 0 || len > (int)sizeof(buf) ||
+      pos > INT_MAX - (int)sizeof(buf)) {
+    return gFalse;
+  }
+  if (pos < bufPos) {
+    return gFalse;
+  }
+
+  // if requested region will not fit in the current buffer...
+  if (pos + len > bufPos + (int)sizeof(buf)) {
+
+    // if the start of the requested data is already in the buffer, move
+    // it to the start of the buffer
+    if (pos < bufPos + bufLen) {
+      bufLen -= pos - bufPos;
+      memmove(buf, buf + (pos - bufPos), bufLen);
+      bufPos = pos;
+
+    // otherwise discard data from the
+    // stream until we get to the requested position
+    } else {
+      bufPos += bufLen;
+      bufLen = 0;
+      while (bufPos < pos) {
+       if ((c = (*getChar)(data)) < 0) {
+         return gFalse;
+       }
+       ++bufPos;
+      }
+    }
+  }
+
+  // read the rest of the requested data
+  while (bufPos + bufLen < pos + len) {
+    if ((c = (*getChar)(data)) < 0) {
+      return gFalse;
+    }
+    buf[bufLen++] = (char)c;
+  }
+
+  return gTrue;
+}
+
+//------------------------------------------------------------------------
+
+static FoFiIdentifierType identify(Reader *reader);
+static FoFiIdentifierType identifyOpenType(Reader *reader);
+static FoFiIdentifierType identifyCFF(Reader *reader, int start);
+
+FoFiIdentifierType FoFiIdentifier::identifyMem(char *file, int len) {
+  MemReader *reader;
+  FoFiIdentifierType type;
+
+  if (!(reader = MemReader::make(file, len))) {
+    return fofiIdError;
+  }
+  type = identify(reader);
+  delete reader;
+  return type;
+}
+
+FoFiIdentifierType FoFiIdentifier::identifyFile(char *fileName) {
+  FileReader *reader;
+  FoFiIdentifierType type;
+
+  if (!(reader = FileReader::make(fileName))) {
+    return fofiIdError;
+  }
+  type = identify(reader);
+  delete reader;
+  return type;
+}
+
+FoFiIdentifierType FoFiIdentifier::identifyStream(int (*getChar)(void *data),
+                                                 void *data) {
+  StreamReader *reader;
+  FoFiIdentifierType type;
+
+  if (!(reader = StreamReader::make(getChar, data))) {
+    return fofiIdError;
+  }
+  type = identify(reader);
+  delete reader;
+  return type;
+}
+
+static FoFiIdentifierType identify(Reader *reader) {
+  Guint n;
+
+  //----- PFA
+  if (reader->cmp(0, "%!PS-AdobeFont-1") ||
+      reader->cmp(0, "%!FontType1")) {
+    return fofiIdType1PFA;
+  }
+
+  //----- PFB
+  if (reader->getByte(0) == 0x80 &&
+      reader->getByte(1) == 0x01 &&
+      reader->getU32LE(2, &n)) {
+    if ((n >= 16 && reader->cmp(6, "%!PS-AdobeFont-1")) ||
+       (n >= 11 && reader->cmp(6, "%!FontType1"))) {
+      return fofiIdType1PFB;
+    }
+  }
+
+  //----- TrueType
+  if ((reader->getByte(0) == 0x00 &&
+       reader->getByte(1) == 0x01 &&
+       reader->getByte(2) == 0x00 &&
+       reader->getByte(3) == 0x00) ||
+      (reader->getByte(0) == 0x74 &&   // 'true'
+       reader->getByte(1) == 0x72 &&
+       reader->getByte(2) == 0x75 &&
+       reader->getByte(3) == 0x65)) {
+    return fofiIdTrueType;
+  }
+  if (reader->getByte(0) == 0x74 &&    // 'ttcf'
+      reader->getByte(1) == 0x74 &&
+      reader->getByte(2) == 0x63 &&
+      reader->getByte(3) == 0x66) {
+    return fofiIdTrueTypeCollection;
+  }
+
+  //----- OpenType
+  if (reader->getByte(0) == 0x4f &&    // 'OTTO
+      reader->getByte(1) == 0x54 &&
+      reader->getByte(2) == 0x54 &&
+      reader->getByte(3) == 0x4f) {
+    return identifyOpenType(reader);
+  }
+
+  //----- CFF
+  if (reader->getByte(0) == 0x01 &&
+      reader->getByte(1) == 0x00) {
+    return identifyCFF(reader, 0);
+  }
+  // some tools embed CFF fonts with an extra whitespace char at the
+  // beginning
+  if (reader->getByte(1) == 0x01 &&
+      reader->getByte(2) == 0x00) {
+    return identifyCFF(reader, 1);
+  }
+
+  return fofiIdUnknown;
+}
+
+static FoFiIdentifierType identifyOpenType(Reader *reader) {
+  FoFiIdentifierType type;
+  Guint offset;
+  int nTables, i;
+
+  if (!reader->getU16BE(4, &nTables)) {
+    return fofiIdUnknown;
+  }
+  for (i = 0; i < nTables; ++i) {
+    if (reader->cmp(12 + i*16, "CFF ")) {
+      if (reader->getU32BE(12 + i*16 + 8, &offset) &&
+         offset < (Guint)INT_MAX) {
+       type = identifyCFF(reader, (int)offset);
+       if (type == fofiIdCFF8Bit) {
+         type = fofiIdOpenTypeCFF8Bit;
+       } else if (type == fofiIdCFFCID) {
+         type = fofiIdOpenTypeCFFCID;
+       }
+       return type;
+      }
+      return fofiIdUnknown;
+    }
+  }
+  return fofiIdUnknown;
+}
+
+static FoFiIdentifierType identifyCFF(Reader *reader, int start) {
+  Guint offset0, offset1;
+  int hdrSize, offSize0, offSize1, pos, endPos, b0, n, i;
+
+  //----- read the header
+  if (reader->getByte(start) != 0x01 ||
+      reader->getByte(start + 1) != 0x00) {
+    return fofiIdUnknown;
+  }
+  if ((hdrSize = reader->getByte(start + 2)) < 0) {
+    return fofiIdUnknown;
+  }
+  if ((offSize0 = reader->getByte(start + 3)) < 1 || offSize0 > 4) {
+    return fofiIdUnknown;
+  }
+  pos = start + hdrSize;
+  if (pos < 0) {
+    return fofiIdUnknown;
+  }
+
+  //----- skip the name index
+  if (!reader->getU16BE(pos, &n)) {
+    return fofiIdUnknown;
+  }
+  if (n == 0) {
+    pos += 2;
+  } else {
+    if ((offSize1 = reader->getByte(pos + 2)) < 1 || offSize1 > 4) {
+      return fofiIdUnknown;
+    }
+    if (!reader->getUVarBE(pos + 3 + n * offSize1, offSize1, &offset1) ||
+       offset1 > (Guint)INT_MAX) {
+      return fofiIdUnknown;
+    }
+    pos += 3 + (n + 1) * offSize1 + (int)offset1 - 1;
+  }
+  if (pos < 0) {
+    return fofiIdUnknown;
+  }
+
+  //----- parse the top dict index
+  if (!reader->getU16BE(pos, &n) || n < 1) {
+    return fofiIdUnknown;
+  }
+  if ((offSize1 = reader->getByte(pos + 2)) < 1 || offSize1 > 4) {
+    return fofiIdUnknown;
+  }
+  if (!reader->getUVarBE(pos + 3, offSize1, &offset0) ||
+      offset0 > (Guint)INT_MAX ||
+      !reader->getUVarBE(pos + 3 + offSize1, offSize1, &offset1) ||
+      offset1 > (Guint)INT_MAX ||
+      offset0 > offset1) {
+    return fofiIdUnknown;
+  }
+  pos = pos + 3 + (n + 1) * offSize1 + (int)offset0 - 1;
+  endPos = pos + 3 + (n + 1) * offSize1 + (int)offset1 - 1;
+  if (pos < 0 || endPos < 0 || pos > endPos) {
+    return fofiIdUnknown;
+  }
+  
+  //----- parse the top dict, look for ROS as first entry
+  // for a CID font, the top dict starts with:
+  //     <int> <int> <int> ROS
+  for (i = 0; i < 3; ++i) {
+    b0 = reader->getByte(pos++);
+    if (b0 == 0x1c) {
+      pos += 2;
+    } else if (b0 == 0x1d) {
+      pos += 4;
+    } else if (b0 >= 0xf7 && b0 <= 0xfe) {
+      pos += 1;
+    } else if (b0 < 0x20 || b0 > 0xf6) {
+      return fofiIdCFF8Bit;
+    }
+    if (pos >= endPos || pos < 0) {
+      return fofiIdCFF8Bit;
+    }
+  }
+  if (pos + 1 < endPos &&
+      reader->getByte(pos) == 12 &&
+      reader->getByte(pos + 1) == 30) {
+    return fofiIdCFFCID;
+  } else {
+    return fofiIdCFF8Bit;
+  }
+}
diff --git a/fofi/FoFiIdentifier.h b/fofi/FoFiIdentifier.h
new file mode 100644 (file)
index 0000000..af1323b
--- /dev/null
@@ -0,0 +1,42 @@
+//========================================================================
+//
+// FoFiIdentifier.h
+//
+// Copyright 2009 Glyph & Cog, LLC
+//
+//========================================================================
+
+#ifndef FOFIIDENTIFIER_H
+#define FOFIIDENTIFIER_H
+
+#ifdef USE_GCC_PRAGMAS
+#pragma interface
+#endif
+
+//------------------------------------------------------------------------
+// FoFiIdentifier
+//------------------------------------------------------------------------
+
+enum FoFiIdentifierType {
+  fofiIdType1PFA,              // Type 1 font in PFA format
+  fofiIdType1PFB,              // Type 1 font in PFB format
+  fofiIdCFF8Bit,               // 8-bit CFF font
+  fofiIdCFFCID,                        // CID CFF font
+  fofiIdTrueType,              // TrueType font
+  fofiIdTrueTypeCollection,    // TrueType collection
+  fofiIdOpenTypeCFF8Bit,       // OpenType wrapper with 8-bit CFF font
+  fofiIdOpenTypeCFFCID,                // OpenType wrapper with CID CFF font
+  fofiIdUnknown,               // unknown type
+  fofiIdError                  // error in reading the file
+};
+
+class FoFiIdentifier {
+public:
+
+  static FoFiIdentifierType identifyMem(char *file, int len);
+  static FoFiIdentifierType identifyFile(char *fileName);
+  static FoFiIdentifierType identifyStream(int (*getChar)(void *data),
+                                          void *data);
+};
+
+#endif
diff --git a/fofi/FoFiTrueType.cc b/fofi/FoFiTrueType.cc
new file mode 100644 (file)
index 0000000..c777d02
--- /dev/null
@@ -0,0 +1,2525 @@
+//========================================================================
+//
+// FoFiTrueType.cc
+//
+// Copyright 1999-2003 Glyph & Cog, LLC
+//
+//========================================================================
+
+//========================================================================
+//
+// Modified under the Poppler project - http://poppler.freedesktop.org
+//
+// All changes made under the Poppler project to this file are licensed
+// under GPL version 2 or later
+//
+// Copyright (C) 2006 Takashi Iwai <tiwai@suse.de>
+// Copyright (C) 2007 Koji Otani <sho@bbr.jp>
+// Copyright (C) 2007 Carlos Garcia Campos <carlosgc@gnome.org>
+// Copyright (C) 2008, 2009, 2012 Albert Astals Cid <aacid@kde.org>
+// Copyright (C) 2008 Tomas Are Haavet <tomasare@gmail.com>
+// Copyright (C) 2012 Suzuki Toshiya <mpsuzuki@hiroshima-u.ac.jp>
+// Copyright (C) 2012 Adrian Johnson <ajohnson@redneon.com>
+//
+// To see a description of the changes please see the Changelog file that
+// came with your tarball or type make ChangeLog if you are building from git
+//
+//========================================================================
+
+#include <config.h>
+
+#ifdef USE_GCC_PRAGMAS
+#pragma implementation
+#endif
+
+#include <stdlib.h>
+#include <string.h>
+#include <algorithm>
+#include "goo/gtypes.h"
+#include "goo/gmem.h"
+#include "goo/GooString.h"
+#include "goo/GooHash.h"
+#include "FoFiType1C.h"
+#include "FoFiTrueType.h"
+#include "poppler/Error.h"
+
+//
+// Terminology
+// -----------
+//
+// character code = number used as an element of a text string
+//
+// character name = glyph name = name for a particular glyph within a
+//                  font
+//
+// glyph index = GID = position (within some internal table in the font)
+//               where the instructions to draw a particular glyph are
+//               stored
+//
+// Type 1 fonts
+// ------------
+//
+// Type 1 fonts contain:
+//
+// Encoding: array of glyph names, maps char codes to glyph names
+//
+//           Encoding[charCode] = charName
+//
+// CharStrings: dictionary of instructions, keyed by character names,
+//              maps character name to glyph data
+//
+//              CharStrings[charName] = glyphData
+//
+// TrueType fonts
+// --------------
+//
+// TrueType fonts contain:
+//
+// 'cmap' table: mapping from character code to glyph index; there may
+//               be multiple cmaps in a TrueType font
+//
+//               cmap[charCode] = gid
+//
+// 'post' table: mapping from glyph index to glyph name
+//
+//               post[gid] = glyphName
+//
+// Type 42 fonts
+// -------------
+//
+// Type 42 fonts contain:
+//
+// Encoding: array of glyph names, maps char codes to glyph names
+//
+//           Encoding[charCode] = charName
+//
+// CharStrings: dictionary of glyph indexes, keyed by character names,
+//              maps character name to glyph index
+//
+//              CharStrings[charName] = gid
+//
+
+//------------------------------------------------------------------------
+
+#define ttcfTag 0x74746366
+
+//------------------------------------------------------------------------
+
+struct TrueTypeTable {
+  Guint tag;
+  Guint checksum;
+  int offset;
+  int origOffset;
+  int len;
+};
+
+struct TrueTypeCmap {
+  int platform;
+  int encoding;
+  int offset;
+  int len;
+  int fmt;
+};
+
+struct TrueTypeLoca {
+  int idx;
+  int origOffset;
+  int newOffset;
+  int len;
+};
+
+#define cmapTag 0x636d6170
+#define glyfTag 0x676c7966
+#define headTag 0x68656164
+#define hheaTag 0x68686561
+#define hmtxTag 0x686d7478
+#define locaTag 0x6c6f6361
+#define nameTag 0x6e616d65
+#define os2Tag  0x4f532f32
+#define postTag 0x706f7374
+#define vrt2Tag 0x76727432
+#define vertTag 0x76657274
+
+struct cmpTrueTypeLocaOffsetFunctor {
+  bool operator()(const TrueTypeLoca &loca1, const TrueTypeLoca &loca2) {
+    if (loca1.origOffset == loca2.origOffset) {
+      return loca1.idx < loca2.idx;
+    }
+    return loca1.origOffset < loca2.origOffset;
+  }
+};
+
+struct cmpTrueTypeLocaIdxFunctor {
+  bool operator()(const TrueTypeLoca &loca1, const TrueTypeLoca &loca2) {
+    return loca1.idx < loca2.idx;
+  }
+};
+
+struct cmpTrueTypeTableTagFunctor {
+  bool operator()(const TrueTypeTable &tab1, const TrueTypeTable &tab2) {
+    return tab1.tag < tab2.tag;
+  }
+};
+
+//------------------------------------------------------------------------
+
+struct T42Table {
+  const char *tag;             // 4-byte tag
+  GBool required;              // required by the TrueType spec?
+};
+
+// TrueType tables to be embedded in Type 42 fonts.
+// NB: the table names must be in alphabetical order here.
+#define nT42Tables 11
+static T42Table t42Tables[nT42Tables] = {
+  { "cvt ", gTrue  },
+  { "fpgm", gTrue  },
+  { "glyf", gTrue  },
+  { "head", gTrue  },
+  { "hhea", gTrue  },
+  { "hmtx", gTrue  },
+  { "loca", gTrue  },
+  { "maxp", gTrue  },
+  { "prep", gTrue  },
+  { "vhea", gFalse },
+  { "vmtx", gFalse }
+};
+#define t42HeadTable  3
+#define t42LocaTable  6
+#define t42GlyfTable  2
+#define t42VheaTable  9
+#define t42VmtxTable 10
+
+//------------------------------------------------------------------------
+
+// Glyph names in some arbitrary standard order that Apple uses for
+// their TrueType fonts.
+static const char *macGlyphNames[258] = {
+  ".notdef",        "null",           "CR",             "space",
+  "exclam",         "quotedbl",       "numbersign",     "dollar",
+  "percent",        "ampersand",      "quotesingle",    "parenleft",
+  "parenright",     "asterisk",       "plus",           "comma",
+  "hyphen",         "period",         "slash",          "zero",
+  "one",            "two",            "three",          "four",
+  "five",           "six",            "seven",          "eight",
+  "nine",           "colon",          "semicolon",      "less",
+  "equal",          "greater",        "question",       "at",
+  "A",              "B",              "C",              "D",
+  "E",              "F",              "G",              "H",
+  "I",              "J",              "K",              "L",
+  "M",              "N",              "O",              "P",
+  "Q",              "R",              "S",              "T",
+  "U",              "V",              "W",              "X",
+  "Y",              "Z",              "bracketleft",    "backslash",
+  "bracketright",   "asciicircum",    "underscore",     "grave",
+  "a",              "b",              "c",              "d",
+  "e",              "f",              "g",              "h",
+  "i",              "j",              "k",              "l",
+  "m",              "n",              "o",              "p",
+  "q",              "r",              "s",              "t",
+  "u",              "v",              "w",              "x",
+  "y",              "z",              "braceleft",      "bar",
+  "braceright",     "asciitilde",     "Adieresis",      "Aring",
+  "Ccedilla",       "Eacute",         "Ntilde",         "Odieresis",
+  "Udieresis",      "aacute",         "agrave",         "acircumflex",
+  "adieresis",      "atilde",         "aring",          "ccedilla",
+  "eacute",         "egrave",         "ecircumflex",    "edieresis",
+  "iacute",         "igrave",         "icircumflex",    "idieresis",
+  "ntilde",         "oacute",         "ograve",         "ocircumflex",
+  "odieresis",      "otilde",         "uacute",         "ugrave",
+  "ucircumflex",    "udieresis",      "dagger",         "degree",
+  "cent",           "sterling",       "section",        "bullet",
+  "paragraph",      "germandbls",     "registered",     "copyright",
+  "trademark",      "acute",          "dieresis",       "notequal",
+  "AE",             "Oslash",         "infinity",       "plusminus",
+  "lessequal",      "greaterequal",   "yen",            "mu",
+  "partialdiff",    "summation",      "product",        "pi",
+  "integral",       "ordfeminine",    "ordmasculine",   "Omega",
+  "ae",             "oslash",         "questiondown",   "exclamdown",
+  "logicalnot",     "radical",        "florin",         "approxequal",
+  "increment",      "guillemotleft",  "guillemotright", "ellipsis",
+  "nbspace",        "Agrave",         "Atilde",         "Otilde",
+  "OE",             "oe",             "endash",         "emdash",
+  "quotedblleft",   "quotedblright",  "quoteleft",      "quoteright",
+  "divide",         "lozenge",        "ydieresis",      "Ydieresis",
+  "fraction",       "currency",       "guilsinglleft",  "guilsinglright",
+  "fi",             "fl",             "daggerdbl",      "periodcentered",
+  "quotesinglbase", "quotedblbase",   "perthousand",    "Acircumflex",
+  "Ecircumflex",    "Aacute",         "Edieresis",      "Egrave",
+  "Iacute",         "Icircumflex",    "Idieresis",      "Igrave",
+  "Oacute",         "Ocircumflex",    "applelogo",      "Ograve",
+  "Uacute",         "Ucircumflex",    "Ugrave",         "dotlessi",
+  "circumflex",     "tilde",          "overscore",      "breve",
+  "dotaccent",      "ring",           "cedilla",        "hungarumlaut",
+  "ogonek",         "caron",          "Lslash",         "lslash",
+  "Scaron",         "scaron",         "Zcaron",         "zcaron",
+  "brokenbar",      "Eth",            "eth",            "Yacute",
+  "yacute",         "Thorn",          "thorn",          "minus",
+  "multiply",       "onesuperior",    "twosuperior",    "threesuperior",
+  "onehalf",        "onequarter",     "threequarters",  "franc",
+  "Gbreve",         "gbreve",         "Idot",           "Scedilla",
+  "scedilla",       "Cacute",         "cacute",         "Ccaron",
+  "ccaron",         "dmacron"
+};
+
+//------------------------------------------------------------------------
+// FoFiTrueType
+//------------------------------------------------------------------------
+
+FoFiTrueType *FoFiTrueType::make(char *fileA, int lenA, int faceIndexA) {
+  FoFiTrueType *ff;
+
+  ff = new FoFiTrueType(fileA, lenA, gFalse, faceIndexA);
+  if (!ff->parsedOk) {
+    delete ff;
+    return NULL;
+  }
+  return ff;
+}
+
+FoFiTrueType *FoFiTrueType::load(char *fileName, int faceIndexA) {
+  FoFiTrueType *ff;
+  char *fileA;
+  int lenA;
+
+  if (!(fileA = FoFiBase::readFile(fileName, &lenA))) {
+    return NULL;
+  }
+  ff = new FoFiTrueType(fileA, lenA, gTrue, faceIndexA);
+  if (!ff->parsedOk) {
+    delete ff;
+    return NULL;
+  }
+  return ff;
+}
+
+FoFiTrueType::FoFiTrueType(char *fileA, int lenA, GBool freeFileDataA, int faceIndexA):
+  FoFiBase(fileA, lenA, freeFileDataA)
+{
+  tables = NULL;
+  nTables = 0;
+  cmaps = NULL;
+  nCmaps = 0;
+  nameToGID = NULL;
+  parsedOk = gFalse;
+  faceIndex = faceIndexA;
+  gsubFeatureTable = 0;
+  gsubLookupList = 0;
+
+  parse();
+}
+
+FoFiTrueType::~FoFiTrueType() {
+  gfree(tables);
+  gfree(cmaps);
+  if (nameToGID) {
+    delete nameToGID;
+  }
+}
+
+int FoFiTrueType::getNumCmaps() {
+  return nCmaps;
+}
+
+int FoFiTrueType::getCmapPlatform(int i) {
+  return cmaps[i].platform;
+}
+
+int FoFiTrueType::getCmapEncoding(int i) {
+  return cmaps[i].encoding;
+}
+
+int FoFiTrueType::findCmap(int platform, int encoding) {
+  int i;
+
+  for (i = 0; i < nCmaps; ++i) {
+    if (cmaps[i].platform == platform && cmaps[i].encoding == encoding) {
+      return i;
+    }
+  }
+  return -1;
+}
+
+int FoFiTrueType::mapCodeToGID(int i, Guint c) {
+  int gid;
+  Guint segCnt, segEnd, segStart, segDelta, segOffset;
+  Guint cmapFirst, cmapLen;
+  int pos, a, b, m;
+  GBool ok;
+
+  if (i < 0 || i >= nCmaps) {
+    return 0;
+  }
+  ok = gTrue;
+  pos = cmaps[i].offset;
+  switch (cmaps[i].fmt) {
+  case 0:
+    if (c + 6 >= (Guint)cmaps[i].len) {
+      return 0;
+    }
+    gid = getU8(cmaps[i].offset + 6 + c, &ok);
+    break;
+  case 4:
+    segCnt = getU16BE(pos + 6, &ok) / 2;
+    a = -1;
+    b = segCnt - 1;
+    segEnd = getU16BE(pos + 14 + 2*b, &ok);
+    if (c > segEnd) {
+      // malformed font -- the TrueType spec requires the last segEnd
+      // to be 0xffff
+      return 0;
+    }
+    // invariant: seg[a].end < code <= seg[b].end
+    while (b - a > 1 && ok) {
+      m = (a + b) / 2;
+      segEnd = getU16BE(pos + 14 + 2*m, &ok);
+      if (segEnd < c) {
+       a = m;
+      } else {
+       b = m;
+      }
+    }
+    segStart = getU16BE(pos + 16 + 2*segCnt + 2*b, &ok);
+    segDelta = getU16BE(pos + 16 + 4*segCnt + 2*b, &ok);
+    segOffset = getU16BE(pos + 16 + 6*segCnt + 2*b, &ok);
+    if (c < segStart) {
+      return 0;
+    }
+    if (segOffset == 0) {
+      gid = (c + segDelta) & 0xffff;
+    } else {
+      gid = getU16BE(pos + 16 + 6*segCnt + 2*b +
+                      segOffset + 2 * (c - segStart), &ok);
+      if (gid != 0) {
+       gid = (gid + segDelta) & 0xffff;
+      }
+    }
+    break;
+  case 6:
+    cmapFirst = getU16BE(pos + 6, &ok);
+    cmapLen = getU16BE(pos + 8, &ok);
+    if (c < cmapFirst || c >= cmapFirst + cmapLen) {
+      return 0;
+    }
+    gid = getU16BE(pos + 10 + 2 * (c - cmapFirst), &ok);
+    break;
+  case 12:
+    segCnt = getU32BE(pos + 12, &ok);
+    a = -1;
+    b = segCnt - 1;
+    segEnd = getU32BE(pos + 16 + 12*b+4, &ok);
+    if (c > segEnd) {
+      return 0;
+    }
+    // invariant: seg[a].end < code <= seg[b].end
+    while (b - a > 1 && ok) {
+      m = (a + b) / 2;
+      segEnd = getU32BE(pos + 16 + 12*m+4, &ok);
+      if (segEnd < c) {
+       a = m;
+      } else {
+       b = m;
+      }
+    }
+    segStart = getU32BE(pos + 16 + 12*b, &ok);
+    segDelta = getU32BE(pos + 16 + 12*b+8, &ok);
+    if (c < segStart) {
+      return 0;
+    }
+    gid = segDelta + (c-segStart);
+    break;
+  default:
+    return 0;
+  }
+  if (!ok) {
+    return 0;
+  }
+  return gid;
+}
+
+int FoFiTrueType::mapNameToGID(char *name) {
+  if (!nameToGID) {
+    return 0;
+  }
+  return nameToGID->lookupInt(name);
+}
+
+GBool FoFiTrueType::getCFFBlock(char **start, int *length) {
+  int i;
+
+  if (!openTypeCFF) {
+    return gFalse;
+  }
+  i = seekTable("CFF ");
+  if (!checkRegion(tables[i].offset, tables[i].len)) {
+    return gFalse;
+  }
+  *start = (char *)file + tables[i].offset;
+  *length = tables[i].len;
+  return gTrue;
+}
+
+int *FoFiTrueType::getCIDToGIDMap(int *nCIDs) {
+  char *start;
+  int length;
+  FoFiType1C *ff;
+  int *map;
+
+  *nCIDs = 0;
+  if (!getCFFBlock(&start, &length)) {
+    return NULL;
+  }
+  if (!(ff = FoFiType1C::make(start, length))) {
+    return NULL;
+  }
+  map = ff->getCIDToGIDMap(nCIDs);
+  delete ff;
+  return map;
+}
+
+int FoFiTrueType::getEmbeddingRights() {
+  int i, fsType;
+  GBool ok;
+
+  if ((i = seekTable("OS/2")) < 0) {
+    return 4;
+  }
+  ok = gTrue;
+  fsType = getU16BE(tables[i].offset + 8, &ok);
+  if (!ok) {
+    return 4;
+  }
+  if (fsType & 0x0008) {
+    return 2;
+  }
+  if (fsType & 0x0004) {
+    return 1;
+  }
+  if (fsType & 0x0002) {
+    return 0;
+  }
+  return 3;
+}
+
+void FoFiTrueType::getFontMatrix(double *mat) {
+  char *start;
+  int length;
+  FoFiType1C *ff;
+
+  if (!getCFFBlock(&start, &length)) {
+    return;
+  }
+  if (!(ff = FoFiType1C::make(start, length))) {
+    return;
+  }
+  ff->getFontMatrix(mat);
+  delete ff;
+}
+
+void FoFiTrueType::convertToType42(char *psName, char **encoding,
+                                  int *codeToGID,
+                                  FoFiOutputFunc outputFunc,
+                                  void *outputStream) {
+  GooString *buf;
+  int maxUsedGlyph;
+  GBool ok;
+
+  if (openTypeCFF) {
+    return;
+  }
+
+  // write the header
+  ok = gTrue;
+  buf = GooString::format("%!PS-TrueTypeFont-{0:2g}\n",
+                       (double)getS32BE(0, &ok) / 65536.0);
+  (*outputFunc)(outputStream, buf->getCString(), buf->getLength());
+  delete buf;
+
+  // begin the font dictionary
+  (*outputFunc)(outputStream, "10 dict begin\n", 14);
+  (*outputFunc)(outputStream, "/FontName /", 11);
+  (*outputFunc)(outputStream, psName, strlen(psName));
+  (*outputFunc)(outputStream, " def\n", 5);
+  (*outputFunc)(outputStream, "/FontType 42 def\n", 17);
+  (*outputFunc)(outputStream, "/FontMatrix [1 0 0 1 0 0] def\n", 30);
+  buf = GooString::format("/FontBBox [{0:d} {1:d} {2:d} {3:d}] def\n",
+                       bbox[0], bbox[1], bbox[2], bbox[3]);
+  (*outputFunc)(outputStream, buf->getCString(), buf->getLength());
+  delete buf;
+  (*outputFunc)(outputStream, "/PaintType 0 def\n", 17);
+
+  // write the guts of the dictionary
+  cvtEncoding(encoding, outputFunc, outputStream);
+  cvtCharStrings(encoding, codeToGID, outputFunc, outputStream);
+  cvtSfnts(outputFunc, outputStream, NULL, gFalse, &maxUsedGlyph);
+
+  // end the dictionary and define the font
+  (*outputFunc)(outputStream, "FontName currentdict end definefont pop\n", 40);
+}
+
+void FoFiTrueType::convertToType1(char *psName, const char **newEncoding,
+                                 GBool ascii, FoFiOutputFunc outputFunc,
+                                 void *outputStream) {
+  char *start;
+  int length;
+  FoFiType1C *ff;
+
+  if (!getCFFBlock(&start, &length)) {
+    return;
+  }
+  if (!(ff = FoFiType1C::make(start, length))) {
+    return;
+  }
+  ff->convertToType1(psName, newEncoding, ascii, outputFunc, outputStream);
+  delete ff;
+}
+
+void FoFiTrueType::convertToCIDType2(char *psName,
+                                    int *cidMap, int nCIDs,
+                                    GBool needVerticalMetrics,
+                                    FoFiOutputFunc outputFunc,
+                                    void *outputStream) {
+  GooString *buf;
+  int cid, maxUsedGlyph;
+  GBool ok;
+  int i, j, k;
+
+  if (openTypeCFF) {
+    return;
+  }
+
+  // write the header
+  ok = gTrue;
+  buf = GooString::format("%!PS-TrueTypeFont-{0:2g}\n",
+                       (double)getS32BE(0, &ok) / 65536.0);
+  (*outputFunc)(outputStream, buf->getCString(), buf->getLength());
+  delete buf;
+
+  // begin the font dictionary
+  (*outputFunc)(outputStream, "20 dict begin\n", 14);
+  (*outputFunc)(outputStream, "/CIDFontName /", 14);
+  (*outputFunc)(outputStream, psName, strlen(psName));
+  (*outputFunc)(outputStream, " def\n", 5);
+  (*outputFunc)(outputStream, "/CIDFontType 2 def\n", 19);
+  (*outputFunc)(outputStream, "/FontType 42 def\n", 17);
+  (*outputFunc)(outputStream, "/CIDSystemInfo 3 dict dup begin\n", 32);
+  (*outputFunc)(outputStream, "  /Registry (Adobe) def\n", 24);
+  (*outputFunc)(outputStream, "  /Ordering (Identity) def\n", 27);
+  (*outputFunc)(outputStream, "  /Supplement 0 def\n", 20);
+  (*outputFunc)(outputStream, "  end def\n", 10);
+  (*outputFunc)(outputStream, "/GDBytes 2 def\n", 15);
+  if (cidMap) {
+    buf = GooString::format("/CIDCount {0:d} def\n", nCIDs);
+    (*outputFunc)(outputStream, buf->getCString(), buf->getLength());
+    delete buf;
+    if (nCIDs > 32767) {
+      (*outputFunc)(outputStream, "/CIDMap [", 9);
+      for (i = 0; i < nCIDs; i += 32768 - 16) {
+       (*outputFunc)(outputStream, "<\n", 2);
+       for (j = 0; j < 32768 - 16 && i+j < nCIDs; j += 16) {
+         (*outputFunc)(outputStream, "  ", 2);
+         for (k = 0; k < 16 && i+j+k < nCIDs; ++k) {
+           cid = cidMap[i+j+k];
+           buf = GooString::format("{0:02x}{1:02x}",
+                                 (cid >> 8) & 0xff, cid & 0xff);
+           (*outputFunc)(outputStream, buf->getCString(), buf->getLength());
+           delete buf;
+         }
+         (*outputFunc)(outputStream, "\n", 1);
+       }
+       (*outputFunc)(outputStream, "  >", 3);
+      }
+      (*outputFunc)(outputStream, "\n", 1);
+      (*outputFunc)(outputStream, "] def\n", 6);
+    } else {
+      (*outputFunc)(outputStream, "/CIDMap <\n", 10);
+      for (i = 0; i < nCIDs; i += 16) {
+       (*outputFunc)(outputStream, "  ", 2);
+       for (j = 0; j < 16 && i+j < nCIDs; ++j) {
+         cid = cidMap[i+j];
+         buf = GooString::format("{0:02x}{1:02x}",
+                               (cid >> 8) & 0xff, cid & 0xff);
+         (*outputFunc)(outputStream, buf->getCString(), buf->getLength());
+         delete buf;
+       }
+       (*outputFunc)(outputStream, "\n", 1);
+      }
+      (*outputFunc)(outputStream, "> def\n", 6);
+    }
+  } else {
+    // direct mapping - just fill the string(s) with s[i]=i
+    buf = GooString::format("/CIDCount {0:d} def\n", nGlyphs);
+    (*outputFunc)(outputStream, buf->getCString(), buf->getLength());
+    delete buf;
+    if (nGlyphs > 32767) {
+      (*outputFunc)(outputStream, "/CIDMap [\n", 10);
+      for (i = 0; i < nGlyphs; i += 32767) {
+       j = nGlyphs - i < 32767 ? nGlyphs - i : 32767;
+       buf = GooString::format("  {0:d} string 0 1 {1:d} {{\n", 2 * j, j - 1);
+       (*outputFunc)(outputStream, buf->getCString(), buf->getLength());
+       delete buf;
+       buf = GooString::format("    2 copy dup 2 mul exch {0:d} add -8 bitshift put\n",
+                             i);
+       (*outputFunc)(outputStream, buf->getCString(), buf->getLength());
+       delete buf;
+       buf = GooString::format("    1 index exch dup 2 mul 1 add exch {0:d} add"
+                             " 255 and put\n", i);
+       (*outputFunc)(outputStream, buf->getCString(), buf->getLength());
+       delete buf;
+       (*outputFunc)(outputStream, "  } for\n", 8);
+      }
+      (*outputFunc)(outputStream, "] def\n", 6);
+    } else {
+      buf = GooString::format("/CIDMap {0:d} string\n", 2 * nGlyphs);
+      (*outputFunc)(outputStream, buf->getCString(), buf->getLength());
+      delete buf;
+      buf = GooString::format("  0 1 {0:d} {{\n", nGlyphs - 1);
+      (*outputFunc)(outputStream, buf->getCString(), buf->getLength());
+      delete buf;
+      (*outputFunc)(outputStream,
+                   "    2 copy dup 2 mul exch -8 bitshift put\n", 42);
+      (*outputFunc)(outputStream,
+                   "    1 index exch dup 2 mul 1 add exch 255 and put\n", 50);
+      (*outputFunc)(outputStream, "  } for\n", 8);
+      (*outputFunc)(outputStream, "def\n", 4);
+    }
+  }
+  (*outputFunc)(outputStream, "/FontMatrix [1 0 0 1 0 0] def\n", 30);
+  buf = GooString::format("/FontBBox [{0:d} {1:d} {2:d} {3:d}] def\n",
+                       bbox[0], bbox[1], bbox[2], bbox[3]);
+  (*outputFunc)(outputStream, buf->getCString(), buf->getLength());
+  delete buf;
+  (*outputFunc)(outputStream, "/PaintType 0 def\n", 17);
+  (*outputFunc)(outputStream, "/Encoding [] readonly def\n", 26);
+  (*outputFunc)(outputStream, "/CharStrings 1 dict dup begin\n", 30);
+  (*outputFunc)(outputStream, "  /.notdef 0 def\n", 17);
+  (*outputFunc)(outputStream, "  end readonly def\n", 19);
+
+  // write the guts of the dictionary
+  cvtSfnts(outputFunc, outputStream, NULL, needVerticalMetrics, &maxUsedGlyph);
+
+  // end the dictionary and define the font
+  (*outputFunc)(outputStream,
+               "CIDFontName currentdict end /CIDFont defineresource pop\n",
+               56);
+}
+
+void FoFiTrueType::convertToCIDType0(char *psName, int *cidMap, int nCIDs,
+                                    FoFiOutputFunc outputFunc,
+                                    void *outputStream) {
+  char *start;
+  int length;
+  FoFiType1C *ff;
+
+  if (!getCFFBlock(&start, &length)) {
+    return;
+  }
+  if (!(ff = FoFiType1C::make(start, length))) {
+    return;
+  }
+  ff->convertToCIDType0(psName, cidMap, nCIDs, outputFunc, outputStream);
+  delete ff;
+}
+
+void FoFiTrueType::convertToType0(char *psName, int *cidMap, int nCIDs,
+                                 GBool needVerticalMetrics,
+                                 FoFiOutputFunc outputFunc,
+                                 void *outputStream) {
+  GooString *buf;
+  GooString *sfntsName;
+  int maxUsedGlyph, n, i, j;
+
+  if (openTypeCFF) {
+    return;
+  }
+
+  // write the Type 42 sfnts array
+  sfntsName = (new GooString(psName))->append("_sfnts");
+  cvtSfnts(outputFunc, outputStream, sfntsName, needVerticalMetrics,
+          &maxUsedGlyph);
+  delete sfntsName;
+
+  // write the descendant Type 42 fonts
+  // (The following is a kludge: nGlyphs is the glyph count from the
+  // maxp table; maxUsedGlyph is the max glyph number that has a
+  // non-zero-length description, from the loca table.  The problem is
+  // that some TrueType font subsets fail to change the glyph count,
+  // i.e., nGlyphs is much larger than maxUsedGlyph+1, which results
+  // in an unnecessarily huge Type 0 font.  But some other PDF files
+  // have fonts with only zero or one used glyph, and a content stream
+  // that refers to one of the unused glyphs -- this results in PS
+  // errors if we simply use maxUsedGlyph+1 for the Type 0 font.  So
+  // we compromise by always defining at least 256 glyphs.)
+  if (cidMap) {
+    n = nCIDs;
+  } else if (nGlyphs > maxUsedGlyph + 256) {
+    if (maxUsedGlyph <= 255) {
+      n = 256;
+    } else {
+      n = maxUsedGlyph + 1;
+    }
+  } else {
+    n = nGlyphs;
+  }
+  for (i = 0; i < n; i += 256) {
+    (*outputFunc)(outputStream, "10 dict begin\n", 14);
+    (*outputFunc)(outputStream, "/FontName /", 11);
+    (*outputFunc)(outputStream, psName, strlen(psName));
+    buf = GooString::format("_{0:02x} def\n", i >> 8);
+    (*outputFunc)(outputStream, buf->getCString(), buf->getLength());
+    delete buf;
+    (*outputFunc)(outputStream, "/FontType 42 def\n", 17);
+    (*outputFunc)(outputStream, "/FontMatrix [1 0 0 1 0 0] def\n", 30);
+    buf = GooString::format("/FontBBox [{0:d} {1:d} {2:d} {3:d}] def\n",
+                         bbox[0], bbox[1], bbox[2], bbox[3]);
+    (*outputFunc)(outputStream, buf->getCString(), buf->getLength());
+    delete buf;
+    (*outputFunc)(outputStream, "/PaintType 0 def\n", 17);
+    (*outputFunc)(outputStream, "/sfnts ", 7);
+    (*outputFunc)(outputStream, psName, strlen(psName));
+    (*outputFunc)(outputStream, "_sfnts def\n", 11);
+    (*outputFunc)(outputStream, "/Encoding 256 array\n", 20);
+    for (j = 0; j < 256 && i+j < n; ++j) {
+      buf = GooString::format("dup {0:d} /c{1:02x} put\n", j, j);
+      (*outputFunc)(outputStream, buf->getCString(), buf->getLength());
+      delete buf;
+    }
+    (*outputFunc)(outputStream, "readonly def\n", 13);
+    (*outputFunc)(outputStream, "/CharStrings 257 dict dup begin\n", 32);
+    (*outputFunc)(outputStream, "/.notdef 0 def\n", 15);
+    for (j = 0; j < 256 && i+j < n; ++j) {
+      buf = GooString::format("/c{0:02x} {1:d} def\n",
+                           j, cidMap ? cidMap[i+j] : i+j);
+      (*outputFunc)(outputStream, buf->getCString(), buf->getLength());
+      delete buf;
+    }
+    (*outputFunc)(outputStream, "end readonly def\n", 17);
+    (*outputFunc)(outputStream,
+                 "FontName currentdict end definefont pop\n", 40);
+  }
+
+  // write the Type 0 parent font
+  (*outputFunc)(outputStream, "16 dict begin\n", 14);
+  (*outputFunc)(outputStream, "/FontName /", 11);
+  (*outputFunc)(outputStream, psName, strlen(psName));
+  (*outputFunc)(outputStream, " def\n", 5);
+  (*outputFunc)(outputStream, "/FontType 0 def\n", 16);
+  (*outputFunc)(outputStream, "/FontMatrix [1 0 0 1 0 0] def\n", 30);
+  (*outputFunc)(outputStream, "/FMapType 2 def\n", 16);
+  (*outputFunc)(outputStream, "/Encoding [\n", 12);
+  for (i = 0; i < n; i += 256) {
+    buf = GooString::format("{0:d}\n", i >> 8);
+    (*outputFunc)(outputStream, buf->getCString(), buf->getLength());
+    delete buf;
+  }
+  (*outputFunc)(outputStream, "] def\n", 6);
+  (*outputFunc)(outputStream, "/FDepVector [\n", 14);
+  for (i = 0; i < n; i += 256) {
+    (*outputFunc)(outputStream, "/", 1);
+    (*outputFunc)(outputStream, psName, strlen(psName));
+    buf = GooString::format("_{0:02x} findfont\n", i >> 8);
+    (*outputFunc)(outputStream, buf->getCString(), buf->getLength());
+    delete buf;
+  }
+  (*outputFunc)(outputStream, "] def\n", 6);
+  (*outputFunc)(outputStream, "FontName currentdict end definefont pop\n", 40);
+}
+
+void FoFiTrueType::convertToType0(char *psName, int *cidMap, int nCIDs,
+                                 FoFiOutputFunc outputFunc,
+                                 void *outputStream) {
+  char *start;
+  int length;
+  FoFiType1C *ff;
+
+  if (!getCFFBlock(&start, &length)) {
+    return;
+  }
+  if (!(ff = FoFiType1C::make(start, length))) {
+    return;
+  }
+  ff->convertToType0(psName, cidMap, nCIDs, outputFunc, outputStream);
+  delete ff;
+}
+
+void FoFiTrueType::writeTTF(FoFiOutputFunc outputFunc,
+                           void *outputStream, char *name,
+                           int *codeToGID) {
+  // this substitute cmap table maps char code ffff to glyph 0,
+  // with tables for MacRoman and MS Unicode
+  static char cmapTab[44] = {
+    0, 0,                      // table version number
+    0, 2,                      // number of encoding tables
+    0, 1,                      // platform ID
+    0, 0,                      // encoding ID
+    0, 0, 0, 20,               // offset of subtable
+    0, 3,                      // platform ID
+    0, 1,                      // encoding ID
+    0, 0, 0, 20,               // offset of subtable
+    0, 4,                      // subtable format
+    0, 24,                     // subtable length
+    0, 0,                      // subtable version
+    0, 2,                      // segment count * 2
+    0, 2,                      // 2 * 2 ^ floor(log2(segCount))
+    0, 0,                      // floor(log2(segCount))
+    0, 0,                      // 2*segCount - 2*2^floor(log2(segCount))
+    (char)0xff, (char)0xff,    // endCount[0]
+    0, 0,                      // reserved
+    (char)0xff, (char)0xff,    // startCount[0]
+    0, 1,                      // idDelta[0]
+    0, 0                       // idRangeOffset[0]
+  };
+  static char nameTab[8] = {
+    0, 0,                      // format
+    0, 0,                      // number of name records
+    0, 6,                      // offset to start of string storage
+    0, 0                       // pad to multiple of four bytes
+  };
+  static char postTab[32] = {
+    0, 1, 0, 0,                        // format
+    0, 0, 0, 0,                        // italic angle
+    0, 0,                      // underline position
+    0, 0,                      // underline thickness
+    0, 0, 0, 0,                        // fixed pitch
+    0, 0, 0, 0,                        // min Type 42 memory
+    0, 0, 0, 0,                        // max Type 42 memory
+    0, 0, 0, 0,                        // min Type 1 memory
+    0, 0, 0, 0                 // max Type 1 memory
+  };
+  static char os2Tab[86] = {
+    0, 1,                      // version
+    0, 1,                      // xAvgCharWidth
+    0x01, (char)0x90,          // usWeightClass
+    0, 5,                      // usWidthClass
+    0, 0,                      // fsType
+    0, 0,                      // ySubscriptXSize
+    0, 0,                      // ySubscriptYSize
+    0, 0,                      // ySubscriptXOffset
+    0, 0,                      // ySubscriptYOffset
+    0, 0,                      // ySuperscriptXSize
+    0, 0,                      // ySuperscriptYSize
+    0, 0,                      // ySuperscriptXOffset
+    0, 0,                      // ySuperscriptYOffset
+    0, 0,                      // yStrikeoutSize
+    0, 0,                      // yStrikeoutPosition
+    0, 0,                      // sFamilyClass
+    0, 0, 0, 0, 0,             // panose
+    0, 0, 0, 0, 0,
+    0, 0, 0, 0,                        // ulUnicodeRange1
+    0, 0, 0, 0,                        // ulUnicodeRange2
+    0, 0, 0, 0,                        // ulUnicodeRange3
+    0, 0, 0, 0,                        // ulUnicodeRange4
+    0, 0, 0, 0,                        // achVendID
+    0, 0,                      // fsSelection
+    0, 0,                      // usFirstCharIndex
+    0, 0,                      // usLastCharIndex
+    0, 0,                      // sTypoAscender
+    0, 0,                      // sTypoDescender
+    0, 0,                      // sTypoLineGap
+    0x20, 0x00,                        // usWinAscent
+    0x20, 0x00,                        // usWinDescent
+    0, 0, 0, 1,                        // ulCodePageRange1
+    0, 0, 0, 0                 // ulCodePageRange2
+  };
+  GBool missingCmap, missingName, missingPost, missingOS2;
+  GBool unsortedLoca, emptyCmap, badCmapLen, abbrevHMTX;
+  int nZeroLengthTables, nBogusTables;
+  int nHMetrics, advWidth, lsb;
+  TrueTypeLoca *locaTable;
+  TrueTypeTable *newTables;
+  char *newNameTab, *newCmapTab, *newHHEATab, *newHMTXTab;
+  int nNewTables, cmapIdx, cmapLen, glyfLen, newNameLen, newCmapLen, next;
+  int newHHEALen, newHMTXLen;
+  Guint locaChecksum, glyfChecksum, fileChecksum;
+  char *tableDir;
+  char locaBuf[4], checksumBuf[4];
+  GBool ok;
+  Guint t;
+  int pos, i, j, k, n;
+
+  if (openTypeCFF) {
+    return;
+  }
+
+  if (tables == NULL) {
+    return;
+  }
+
+  // check for missing tables
+  // (Note: if the OS/2 table is missing, the Microsoft PCL5 driver
+  // will embed a PCL TrueType font with the pitch field set to zero,
+  // which apparently causes divide-by-zero errors.  As far as I can
+  // tell, the only important field in the OS/2 table is
+  // xAvgCharWidth.)
+  missingCmap = (cmapIdx = seekTable("cmap")) < 0;
+  missingName = seekTable("name") < 0;
+  missingPost = seekTable("post") < 0;
+  missingOS2 = seekTable("OS/2") < 0;
+
+  // read the loca table, check to see if it's sorted
+  locaTable = (TrueTypeLoca *)gmallocn(nGlyphs + 1, sizeof(TrueTypeLoca));
+  unsortedLoca = gFalse;
+  i = seekTable("loca");
+  pos = tables[i].offset;
+  ok = gTrue;
+  for (i = 0; i <= nGlyphs; ++i) {
+    if (locaFmt) {
+      locaTable[i].origOffset = (int)getU32BE(pos + i*4, &ok);
+    } else {
+      locaTable[i].origOffset = 2 * getU16BE(pos + i*2, &ok);
+    }
+    if (i > 0 && locaTable[i].origOffset < locaTable[i-1].origOffset) {
+      unsortedLoca = gTrue;
+    }
+    // glyph descriptions must be at least 12 bytes long (nContours,
+    // xMin, yMin, xMax, yMax, instructionLength - two bytes each);
+    // invalid glyph descriptions (even if they're never used) make
+    // Windows choke, so we work around that problem here (ideally,
+    // this would parse the glyph descriptions in the glyf table and
+    // remove any that were invalid, but this quick test is a decent
+    // start)
+    if (i > 0 &&
+       locaTable[i].origOffset - locaTable[i-1].origOffset > 0 &&
+       locaTable[i].origOffset - locaTable[i-1].origOffset < 12) {
+      locaTable[i-1].origOffset = locaTable[i].origOffset;
+      unsortedLoca = gTrue;
+    }
+    locaTable[i].idx = i;
+  }
+
+  // check for zero-length tables and bogus tags
+  nZeroLengthTables = nBogusTables = 0;
+  for (i = 0; i < nTables; ++i) {
+    if (tables[i].len == 0) {
+      ++nZeroLengthTables;
+      if (tables[i].tag == cmapTag) {
+       missingCmap = gTrue;
+      } else if (tables[i].tag == nameTag) {
+       missingName = gTrue;
+      } else if (tables[i].tag == postTag) {
+       missingPost = gTrue;
+      } else if (tables[i].tag == os2Tag) {
+       missingOS2 = gTrue;
+      }
+    } else if (!(tables[i].tag & 0xe0000000) ||
+              !(tables[i].tag & 0x00e00000) ||
+              !(tables[i].tag & 0x0000e000) ||
+              !(tables[i].tag & 0x000000e0)) {
+      // tags where any of the bytes are < 0x20 are probably bogus
+      // (the TrueType spec uses ASCII sequences for tags) -- this
+      // catches problems where the number of tables given in the
+      // header is too large, and so gibberish data is read at the end
+      // of the table directory
+      ++nBogusTables;
+    }
+  }
+
+  // check for an empty cmap table or an incorrect cmap table length
+  emptyCmap = badCmapLen = gFalse;
+  cmapLen = 0; // make gcc happy
+  if (!missingCmap) {
+    if (nCmaps == 0) {
+      emptyCmap = gTrue;
+    } else {
+      cmapLen = cmaps[0].offset + cmaps[0].len;
+      for (i = 1; i < nCmaps; ++i) {
+       if (cmaps[i].offset + cmaps[i].len > cmapLen) {
+         cmapLen = cmaps[i].offset + cmaps[i].len;
+       }
+      }
+      cmapLen -= tables[cmapIdx].offset;
+      if (cmapLen > tables[cmapIdx].len) {
+       badCmapLen = gTrue;
+      }
+    }
+  }
+
+  // check for an abbreviated hmtx table (this is completely legal,
+  // but confuses the Microsoft PCL5 printer driver, which generates
+  // embedded fonts with the pitch field set to zero)
+  i = seekTable("hhea");
+  nHMetrics = getU16BE(tables[i].offset + 34, &ok);
+  abbrevHMTX = nHMetrics < nGlyphs;
+
+  // if nothing is broken, just write the TTF file as is
+  if (!missingCmap && !missingName && !missingPost && !missingOS2 &&
+      !unsortedLoca && !emptyCmap && !badCmapLen && !abbrevHMTX &&
+      nZeroLengthTables == 0 && nBogusTables == 0 &&
+      !name && !codeToGID) {
+    (*outputFunc)(outputStream, (char *)file, len);
+    goto done1;
+  }
+
+  // sort the 'loca' table: some (non-compliant) fonts have
+  // out-of-order loca tables; in order to correctly handle the case
+  // where (compliant) fonts have empty entries in the middle of the
+  // table, cmpTrueTypeLocaOffset uses offset as its primary sort key,
+  // and idx as its secondary key (ensuring that adjacent entries with
+  // the same pos value remain in the same order)
+  glyfLen = 0; // make gcc happy
+  if (unsortedLoca) {
+    std::sort(locaTable, locaTable + nGlyphs + 1,
+             cmpTrueTypeLocaOffsetFunctor());
+    for (i = 0; i < nGlyphs; ++i) {
+      locaTable[i].len = locaTable[i+1].origOffset - locaTable[i].origOffset;
+    }
+    locaTable[nGlyphs].len = 0;
+    std::sort(locaTable, locaTable + nGlyphs + 1, cmpTrueTypeLocaIdxFunctor());
+    // if the last entry in the loca is not the max offset (size of
+    // the glyf table), something is wrong -- work around the problem
+    // by forcing the last sorted entry to have a zero length
+    locaTable[nGlyphs].len = 0;
+    pos = 0;
+    for (i = 0; i <= nGlyphs; ++i) {
+      locaTable[i].newOffset = pos;
+      pos += locaTable[i].len;
+      if (pos & 3) {
+       pos += 4 - (pos & 3);
+      }
+    }
+    glyfLen = pos;
+  }
+
+  // compute checksums for the loca and glyf tables
+  locaChecksum = glyfChecksum = 0;
+  if (unsortedLoca) {
+    if (locaFmt) {
+      for (j = 0; j <= nGlyphs; ++j) {
+       locaChecksum += locaTable[j].newOffset;
+      }
+    } else {
+      for (j = 0; j <= nGlyphs; j += 2) {
+       locaChecksum += locaTable[j].newOffset << 16;
+       if (j + 1 <= nGlyphs) {
+         locaChecksum += locaTable[j+1].newOffset;
+       }
+      }
+    }
+    pos = tables[seekTable("glyf")].offset;
+    for (j = 0; j < nGlyphs; ++j) {
+      n = locaTable[j].len;
+      if (n > 0) {
+       k = locaTable[j].origOffset;
+       if (checkRegion(pos + k, n)) {
+         glyfChecksum += computeTableChecksum(file + pos + k, n);
+       }
+      }
+    }
+  }
+
+  // construct the new name table
+  if (name) {
+    n = strlen(name);
+    newNameLen = (6 + 4*12 + 2 * (3*n + 7) + 3) & ~3;
+    newNameTab = (char *)gmalloc(newNameLen);
+    memset(newNameTab, 0, newNameLen);
+    newNameTab[0] = 0;         // format selector
+    newNameTab[1] = 0;
+    newNameTab[2] = 0;         // number of name records
+    newNameTab[3] = 4;
+    newNameTab[4] = 0;         // offset to start of string storage
+    newNameTab[5] = 6 + 4*12;
+    next = 0;
+    for (i = 0; i < 4; ++i) {
+      newNameTab[6 + i*12 + 0] = 0;    // platform ID = Microsoft
+      newNameTab[6 + i*12 + 1] = 3;
+      newNameTab[6 + i*12 + 2] = 0;    // encoding ID = Unicode
+      newNameTab[6 + i*12 + 3] = 1;
+      newNameTab[6 + i*12 + 4] = 0x04; // language ID = American English
+      newNameTab[6 + i*12 + 5] = 0x09;
+      newNameTab[6 + i*12 + 6] = 0;    // name ID
+      newNameTab[6 + i*12 + 7] = i + 1;
+      newNameTab[6 + i*12 + 8] = i+1 == 2 ? 0 : ((2*n) >> 8); // string length
+      newNameTab[6 + i*12 + 9] = i+1 == 2 ? 14 : ((2*n) & 0xff);
+      newNameTab[6 + i*12 + 10] = next >> 8;               // string offset
+      newNameTab[6 + i*12 + 11] = next & 0xff;
+      if (i+1 == 2) {
+       memcpy(newNameTab + 6 + 4*12 + next, "\0R\0e\0g\0u\0l\0a\0r", 14);
+       next += 14;
+      } else {
+       for (j = 0; j < n; ++j) {
+         newNameTab[6 + 4*12 + next + 2*j] = 0;
+         newNameTab[6 + 4*12 + next + 2*j + 1] = name[j];
+       }
+       next += 2*n;
+      }
+    }
+  } else {
+    newNameLen = 0;
+    newNameTab = NULL;
+  }
+
+  // construct the new cmap table
+  if (codeToGID) {
+    newCmapLen = 44 + 256 * 2;
+    newCmapTab = (char *)gmalloc(newCmapLen);
+    newCmapTab[0] = 0;         // table version number = 0
+    newCmapTab[1] = 0;
+    newCmapTab[2] = 0;         // number of encoding tables = 1
+    newCmapTab[3] = 1;
+    newCmapTab[4] = 0;         // platform ID = Microsoft
+    newCmapTab[5] = 3;
+    newCmapTab[6] = 0;         // encoding ID = Unicode
+    newCmapTab[7] = 1;
+    newCmapTab[8] = 0;         // offset of subtable
+    newCmapTab[9] = 0;
+    newCmapTab[10] = 0;
+    newCmapTab[11] = 12;
+    newCmapTab[12] = 0;                // subtable format = 4
+    newCmapTab[13] = 4;
+    newCmapTab[14] = 0x02;     // subtable length
+    newCmapTab[15] = 0x20;
+    newCmapTab[16] = 0;                // subtable version = 0
+    newCmapTab[17] = 0;
+    newCmapTab[18] = 0;                // segment count * 2
+    newCmapTab[19] = 4;
+    newCmapTab[20] = 0;                // 2 * 2 ^ floor(log2(segCount))
+    newCmapTab[21] = 4;
+    newCmapTab[22] = 0;                // floor(log2(segCount))
+    newCmapTab[23] = 1;
+    newCmapTab[24] = 0;                // 2*segCount - 2*2^floor(log2(segCount))
+    newCmapTab[25] = 0;
+    newCmapTab[26] = 0x00;     // endCount[0]
+    newCmapTab[27] = (char)0xff;
+    newCmapTab[28] = (char)0xff; // endCount[1]
+    newCmapTab[29] = (char)0xff;
+    newCmapTab[30] = 0;                // reserved
+    newCmapTab[31] = 0;
+    newCmapTab[32] = 0x00;     // startCount[0]
+    newCmapTab[33] = 0x00;
+    newCmapTab[34] = (char)0xff; // startCount[1]
+    newCmapTab[35] = (char)0xff;
+    newCmapTab[36] = 0;                // idDelta[0]
+    newCmapTab[37] = 0;
+    newCmapTab[38] = 0;                // idDelta[1]
+    newCmapTab[39] = 1;
+    newCmapTab[40] = 0;                // idRangeOffset[0]
+    newCmapTab[41] = 4;
+    newCmapTab[42] = 0;                // idRangeOffset[1]
+    newCmapTab[43] = 0;
+    for (i = 0; i < 256; ++i) {
+      if (codeToGID[i] < 0) {
+       //~ this may not be correct - we want this character to never be
+       //~ displayed, but mapping it to the notdef glyph may result in
+       //~ little boxes being displayed
+       newCmapTab[44 + 2*i] = 0;
+       newCmapTab[44 + 2*i + 1] = 0;
+      } else {
+       newCmapTab[44 + 2*i] = codeToGID[i] >> 8;
+       newCmapTab[44 + 2*i + 1] = codeToGID[i] & 0xff;
+      }
+    }
+  } else {
+    newCmapLen = 0;
+    newCmapTab = NULL;
+  }
+
+  // generate the new hmtx table and the updated hhea table
+  if (abbrevHMTX) {
+    i = seekTable("hhea");
+    pos = tables[i].offset;
+    newHHEALen = 36;
+    newHHEATab = (char *)gmalloc(newHHEALen);
+    for (i = 0; i < newHHEALen; ++i) {
+      newHHEATab[i] = getU8(pos++, &ok);
+    }
+    newHHEATab[34] = nGlyphs >> 8;
+    newHHEATab[35] = nGlyphs & 0xff;
+    i = seekTable("hmtx");
+    pos = tables[i].offset;
+    newHMTXLen = 4 * nGlyphs;
+    newHMTXTab = (char *)gmalloc(newHMTXLen);
+    advWidth = 0;
+    for (i = 0; i < nHMetrics; ++i) {
+      advWidth = getU16BE(pos, &ok);
+      lsb = getU16BE(pos + 2, &ok);
+      pos += 4;
+      newHMTXTab[4*i    ] = advWidth >> 8;
+      newHMTXTab[4*i + 1] = advWidth & 0xff;
+      newHMTXTab[4*i + 2] = lsb >> 8;
+      newHMTXTab[4*i + 3] = lsb & 0xff;
+    }
+    for (; i < nGlyphs; ++i) {
+      lsb = getU16BE(pos, &ok);
+      pos += 2;
+      newHMTXTab[4*i    ] = advWidth >> 8;
+      newHMTXTab[4*i + 1] = advWidth & 0xff;
+      newHMTXTab[4*i + 2] = lsb >> 8;
+      newHMTXTab[4*i + 3] = lsb & 0xff;
+    }
+  } else {
+    newHHEATab = newHMTXTab = NULL;
+    newHHEALen = newHMTXLen = 0; // make gcc happy
+  }
+
+  // construct the new table directory:
+  // - keep all original tables with non-zero length
+  // - fix the cmap table's length, if necessary
+  // - add missing tables
+  // - sort the table by tag
+  // - compute new table positions, including 4-byte alignment
+  // - (re)compute table checksums
+  nNewTables = nTables - nZeroLengthTables - nBogusTables +
+               (missingCmap ? 1 : 0) + (missingName ? 1 : 0) +
+               (missingPost ? 1 : 0) + (missingOS2 ? 1 : 0);
+  newTables = (TrueTypeTable *)gmallocn(nNewTables, sizeof(TrueTypeTable));
+  j = 0;
+  for (i = 0; i < nTables; ++i) {
+    if (tables[i].len > 0 &&
+       (tables[i].tag & 0xe0000000) &&
+       (tables[i].tag & 0x00e00000) &&
+       (tables[i].tag & 0x0000e000) &&
+       (tables[i].tag & 0x000000e0)) {
+      newTables[j] = tables[i];
+      newTables[j].origOffset = tables[i].offset;
+      if (checkRegion(tables[i].offset, tables[i].len)) {
+       newTables[j].checksum =
+           computeTableChecksum(file + tables[i].offset, tables[i].len);
+       if (tables[i].tag == headTag) {
+         // don't include the file checksum
+         newTables[j].checksum -= getU32BE(tables[i].offset + 8, &ok);
+       }
+      }
+      if (newTables[j].tag == cmapTag && codeToGID) {
+       newTables[j].len = newCmapLen;
+       newTables[j].checksum = computeTableChecksum((Guchar *)newCmapTab,
+                                                    newCmapLen);
+      } else if (newTables[j].tag == cmapTag && emptyCmap) {
+       newTables[j].checksum = computeTableChecksum((Guchar *)cmapTab,
+                                                    sizeof(cmapTab));
+       newTables[j].len = sizeof(cmapTab);
+      } else if (newTables[j].tag == cmapTag && badCmapLen) {
+       newTables[j].len = cmapLen;
+      } else if (newTables[j].tag == locaTag && unsortedLoca) {
+       newTables[j].len = (nGlyphs + 1) * (locaFmt ? 4 : 2);
+       newTables[j].checksum = locaChecksum;
+      } else if (newTables[j].tag == glyfTag && unsortedLoca) {
+       newTables[j].len = glyfLen;
+       newTables[j].checksum = glyfChecksum;
+      } else if (newTables[j].tag == nameTag && name) {
+       newTables[j].len = newNameLen;
+       newTables[j].checksum = computeTableChecksum((Guchar *)newNameTab,
+                                                    newNameLen);
+      } else if (newTables[j].tag == hheaTag && abbrevHMTX) {
+       newTables[j].len = newHHEALen;
+       newTables[j].checksum = computeTableChecksum((Guchar *)newHHEATab,
+                                                    newHHEALen);
+      } else if (newTables[j].tag == hmtxTag && abbrevHMTX) {
+       newTables[j].len = newHMTXLen;
+       newTables[j].checksum = computeTableChecksum((Guchar *)newHMTXTab,
+                                                    newHMTXLen);
+      }
+      ++j;
+    }
+  }
+  if (missingCmap) {
+    newTables[j].tag = cmapTag;
+    if (codeToGID) {
+      newTables[j].checksum = computeTableChecksum((Guchar *)newCmapTab,
+                                                  newCmapLen);
+      newTables[j].len = newCmapLen;
+    } else {
+      newTables[j].checksum = computeTableChecksum((Guchar *)cmapTab,
+                                                  sizeof(cmapTab));
+      newTables[j].len = sizeof(cmapTab);
+    }
+    ++j;
+  }
+  if (missingName) {
+    newTables[j].tag = nameTag;
+    if (name) {
+      newTables[j].checksum = computeTableChecksum((Guchar *)newNameTab,
+                                                  newNameLen);
+      newTables[j].len = newNameLen;
+    } else {
+      newTables[j].checksum = computeTableChecksum((Guchar *)nameTab,
+                                                  sizeof(nameTab));
+      newTables[j].len = sizeof(nameTab);
+    }
+    ++j;
+  }
+  if (missingPost) {
+    newTables[j].tag = postTag;
+    newTables[j].checksum = computeTableChecksum((Guchar *)postTab,
+                                                sizeof(postTab));
+    newTables[j].len = sizeof(postTab);
+    ++j;
+  }
+  if (missingOS2) {
+    newTables[j].tag = os2Tag;
+    newTables[j].checksum = computeTableChecksum((Guchar *)os2Tab,
+                                                sizeof(os2Tab));
+    newTables[j].len = sizeof(os2Tab);
+    ++j;
+  }
+  std::sort(newTables, newTables + nNewTables, cmpTrueTypeTableTagFunctor());
+  pos = 12 + nNewTables * 16;
+  for (i = 0; i < nNewTables; ++i) {
+    newTables[i].offset = pos;
+    pos += newTables[i].len;
+    if (pos & 3) {
+      pos += 4 - (pos & 3);
+    }
+  }
+
+  // write the table directory
+  tableDir = (char *)gmalloc(12 + nNewTables * 16);
+  tableDir[0] = 0x00;                                  // sfnt version
+  tableDir[1] = 0x01;
+  tableDir[2] = 0x00;
+  tableDir[3] = 0x00;
+  tableDir[4] = (char)((nNewTables >> 8) & 0xff);      // numTables
+  tableDir[5] = (char)(nNewTables & 0xff);
+  for (i = -1, t = (Guint)nNewTables; t; ++i, t >>= 1) ;
+  t = 1 << (4 + i);
+  tableDir[6] = (char)((t >> 8) & 0xff);               // searchRange
+  tableDir[7] = (char)(t & 0xff);
+  tableDir[8] = (char)((i >> 8) & 0xff);               // entrySelector
+  tableDir[9] = (char)(i & 0xff);
+  t = nNewTables * 16 - t;
+  tableDir[10] = (char)((t >> 8) & 0xff);              // rangeShift
+  tableDir[11] = (char)(t & 0xff);
+  pos = 12;
+  for (i = 0; i < nNewTables; ++i) {
+    tableDir[pos   ] = (char)(newTables[i].tag >> 24);
+    tableDir[pos+ 1] = (char)(newTables[i].tag >> 16);
+    tableDir[pos+ 2] = (char)(newTables[i].tag >>  8);
+    tableDir[pos+ 3] = (char) newTables[i].tag;
+    tableDir[pos+ 4] = (char)(newTables[i].checksum >> 24);
+    tableDir[pos+ 5] = (char)(newTables[i].checksum >> 16);
+    tableDir[pos+ 6] = (char)(newTables[i].checksum >>  8);
+    tableDir[pos+ 7] = (char) newTables[i].checksum;
+    tableDir[pos+ 8] = (char)(newTables[i].offset >> 24);
+    tableDir[pos+ 9] = (char)(newTables[i].offset >> 16);
+    tableDir[pos+10] = (char)(newTables[i].offset >>  8);
+    tableDir[pos+11] = (char) newTables[i].offset;
+    tableDir[pos+12] = (char)(newTables[i].len >> 24);
+    tableDir[pos+13] = (char)(newTables[i].len >> 16);
+    tableDir[pos+14] = (char)(newTables[i].len >>  8);
+    tableDir[pos+15] = (char) newTables[i].len;
+    pos += 16;
+  }
+  (*outputFunc)(outputStream, tableDir, 12 + nNewTables * 16);
+
+  // compute the file checksum
+  fileChecksum = computeTableChecksum((Guchar *)tableDir,
+                                     12 + nNewTables * 16);
+  for (i = 0; i < nNewTables; ++i) {
+    fileChecksum += newTables[i].checksum;
+  }
+  fileChecksum = 0xb1b0afba - fileChecksum;
+
+  // write the tables
+  for (i = 0; i < nNewTables; ++i) {
+    if (newTables[i].tag == headTag) {
+      if (checkRegion(newTables[i].origOffset, newTables[i].len)) {
+       (*outputFunc)(outputStream, (char *)file + newTables[i].origOffset, 8);
+       checksumBuf[0] = fileChecksum >> 24;
+       checksumBuf[1] = fileChecksum >> 16;
+       checksumBuf[2] = fileChecksum >> 8;
+       checksumBuf[3] = fileChecksum;
+       (*outputFunc)(outputStream, checksumBuf, 4);
+       (*outputFunc)(outputStream,
+                     (char *)file + newTables[i].origOffset + 12,
+                     newTables[i].len - 12);
+      } else {
+       for (j = 0; j < newTables[i].len; ++j) {
+         (*outputFunc)(outputStream, "\0", 1);
+       }
+      }
+    } else if (newTables[i].tag == cmapTag && codeToGID) {
+      (*outputFunc)(outputStream, newCmapTab, newTables[i].len);
+    } else if (newTables[i].tag == cmapTag && missingCmap) {
+      (*outputFunc)(outputStream, cmapTab, newTables[i].len);
+    } else if (newTables[i].tag == nameTag && name) {
+      (*outputFunc)(outputStream, newNameTab, newTables[i].len);
+    } else if (newTables[i].tag == nameTag && missingName) {
+      (*outputFunc)(outputStream, nameTab, newTables[i].len);
+    } else if (newTables[i].tag == postTag && missingPost) {
+      (*outputFunc)(outputStream, postTab, newTables[i].len);
+    } else if (newTables[i].tag == os2Tag && missingOS2) {
+      (*outputFunc)(outputStream, os2Tab, newTables[i].len);
+    } else if (newTables[i].tag == hheaTag && abbrevHMTX) {
+      (*outputFunc)(outputStream, newHHEATab, newTables[i].len);
+    } else if (newTables[i].tag == hmtxTag && abbrevHMTX) {
+      (*outputFunc)(outputStream, newHMTXTab, newTables[i].len);
+    } else if (newTables[i].tag == locaTag && unsortedLoca) {
+      for (j = 0; j <= nGlyphs; ++j) {
+       if (locaFmt) {
+         locaBuf[0] = (char)(locaTable[j].newOffset >> 24);
+         locaBuf[1] = (char)(locaTable[j].newOffset >> 16);
+         locaBuf[2] = (char)(locaTable[j].newOffset >>  8);
+         locaBuf[3] = (char) locaTable[j].newOffset;
+         (*outputFunc)(outputStream, locaBuf, 4);
+       } else {
+         locaBuf[0] = (char)(locaTable[j].newOffset >> 9);
+         locaBuf[1] = (char)(locaTable[j].newOffset >> 1);
+         (*outputFunc)(outputStream, locaBuf, 2);
+       }
+      }
+    } else if (newTables[i].tag == glyfTag && unsortedLoca) {
+      pos = tables[seekTable("glyf")].offset;
+      for (j = 0; j < nGlyphs; ++j) {
+       n = locaTable[j].len;
+       if (n > 0) {
+         k = locaTable[j].origOffset;
+         if (checkRegion(pos + k, n)) {
+           (*outputFunc)(outputStream, (char *)file + pos + k, n);
+         } else {
+           for (k = 0; k < n; ++k) {
+             (*outputFunc)(outputStream, "\0", 1);
+           }
+         }
+         if ((k = locaTable[j].len & 3)) {
+           (*outputFunc)(outputStream, "\0\0\0\0", 4 - k);
+         }
+       }
+      }
+    } else {
+      if (checkRegion(newTables[i].origOffset, newTables[i].len)) {
+       (*outputFunc)(outputStream, (char *)file + newTables[i].origOffset,
+                     newTables[i].len);
+      } else {
+       for (j = 0; j < newTables[i].len; ++j) {
+         (*outputFunc)(outputStream, "\0", 1);
+       }
+      }
+    }
+    if (newTables[i].len & 3) {
+      (*outputFunc)(outputStream, "\0\0\0", 4 - (newTables[i].len & 3));
+    }
+  }
+
+  gfree(newHMTXTab);
+  gfree(newHHEATab);
+  gfree(newCmapTab);
+  gfree(newNameTab);
+  gfree(tableDir);
+  gfree(newTables);
+ done1:
+  gfree(locaTable);
+}
+
+void FoFiTrueType::cvtEncoding(char **encoding,
+                              FoFiOutputFunc outputFunc,
+                              void *outputStream) {
+  const char *name;
+  GooString *buf;
+  int i;
+
+  (*outputFunc)(outputStream, "/Encoding 256 array\n", 20);
+  if (encoding) {
+    for (i = 0; i < 256; ++i) {
+      if (!(name = encoding[i])) {
+       name = ".notdef";
+      }
+      buf = GooString::format("dup {0:d} /", i);
+      (*outputFunc)(outputStream, buf->getCString(), buf->getLength());
+      delete buf;
+      (*outputFunc)(outputStream, name, strlen(name));
+      (*outputFunc)(outputStream, " put\n", 5);
+    }
+  } else {
+    for (i = 0; i < 256; ++i) {
+      buf = GooString::format("dup {0:d} /c{1:02x} put\n", i, i);
+      (*outputFunc)(outputStream, buf->getCString(), buf->getLength());
+      delete buf;
+    }
+  }
+  (*outputFunc)(outputStream, "readonly def\n", 13);
+}
+
+void FoFiTrueType::cvtCharStrings(char **encoding,
+                                 int *codeToGID,
+                                 FoFiOutputFunc outputFunc,
+                                 void *outputStream) {
+  char *name;
+  GooString *buf;
+  char buf2[16];
+  int i, k;
+
+  // always define '.notdef'
+  (*outputFunc)(outputStream, "/CharStrings 256 dict dup begin\n", 32);
+  (*outputFunc)(outputStream, "/.notdef 0 def\n", 15);
+
+  // if there's no 'cmap' table, punt
+  if (nCmaps == 0) {
+    goto err;
+  }
+
+  // map char name to glyph index:
+  // 1. use encoding to map name to char code
+  // 2. use codeToGID to map char code to glyph index
+  // N.B. We do this in reverse order because font subsets can have
+  //      weird encodings that use the same character name twice, and
+  //      the first definition is probably the one we want.
+  k = 0; // make gcc happy
+  for (i = 255; i >= 0; --i) {
+    if (encoding) {
+      name = encoding[i];
+    } else {
+      sprintf(buf2, "c%02x", i);
+      name = buf2;
+    }
+    if (name && strcmp(name, ".notdef")) {
+      k = codeToGID[i];
+      // note: Distiller (maybe Adobe's PS interpreter in general)
+      // doesn't like TrueType fonts that have CharStrings entries
+      // which point to nonexistent glyphs, hence the (k < nGlyphs)
+      // test
+      if (k > 0 && k < nGlyphs) {
+       (*outputFunc)(outputStream, "/", 1);
+       (*outputFunc)(outputStream, name, strlen(name));
+       buf = GooString::format(" {0:d} def\n", k);
+       (*outputFunc)(outputStream, buf->getCString(), buf->getLength());
+       delete buf;
+      }
+    }
+  }
+
+ err:
+  (*outputFunc)(outputStream, "end readonly def\n", 17);
+}
+
+void FoFiTrueType::cvtSfnts(FoFiOutputFunc outputFunc,
+                           void *outputStream, GooString *name,
+                           GBool needVerticalMetrics,
+                            int *maxUsedGlyph) {
+  Guchar headData[54];
+  TrueTypeLoca *locaTable;
+  Guchar *locaData;
+  TrueTypeTable newTables[nT42Tables];
+  Guchar tableDir[12 + nT42Tables*16];
+  GBool ok;
+  Guint checksum;
+  int nNewTables;
+  int glyfTableLen, length, pos, glyfPos, i, j, k;
+  Guchar vheaTab[36] = {
+    0, 1, 0, 0,                        // table version number
+    0, 0,                      // ascent
+    0, 0,                      // descent
+    0, 0,                      // reserved
+    0, 0,                      // max advance height
+    0, 0,                      // min top side bearing
+    0, 0,                      // min bottom side bearing
+    0, 0,                      // y max extent
+    0, 0,                      // caret slope rise
+    0, 1,                      // caret slope run
+    0, 0,                      // caret offset
+    0, 0,                      // reserved
+    0, 0,                      // reserved
+    0, 0,                      // reserved
+    0, 0,                      // reserved
+    0, 0,                      // metric data format
+    0, 1                       // number of advance heights in vmtx table
+  };
+  Guchar *vmtxTab;
+  GBool needVhea, needVmtx;
+  int advance;
+
+  // construct the 'head' table, zero out the font checksum
+  i = seekTable("head");
+  if (i < 0 || i >= nTables) {
+    return;
+  }
+  pos = tables[i].offset;
+  if (!checkRegion(pos, 54)) {
+    return;
+  }
+  memcpy(headData, file + pos, 54);
+  headData[8] = headData[9] = headData[10] = headData[11] = (Guchar)0;
+
+  // check for a bogus loca format field in the 'head' table
+  // (I've encountered fonts with loca format set to 0x0100 instead of 0x0001)
+  if (locaFmt != 0 && locaFmt != 1) {
+    headData[50] = 0;
+    headData[51] = 1;
+  }
+
+  // read the original 'loca' table, pad entries out to 4 bytes, and
+  // sort it into proper order -- some (non-compliant) fonts have
+  // out-of-order loca tables; in order to correctly handle the case
+  // where (compliant) fonts have empty entries in the middle of the
+  // table, cmpTrueTypeLocaOffset uses offset as its primary sort key,
+  // and idx as its secondary key (ensuring that adjacent entries with
+  // the same pos value remain in the same order)
+  locaTable = (TrueTypeLoca *)gmallocn(nGlyphs + 1, sizeof(TrueTypeLoca));
+  i = seekTable("loca");
+  pos = tables[i].offset;
+  i = seekTable("glyf");
+  glyfTableLen = tables[i].len;
+  ok = gTrue;
+  for (i = 0; i <= nGlyphs; ++i) {
+    locaTable[i].idx = i;
+    if (locaFmt) {
+      locaTable[i].origOffset = (int)getU32BE(pos + i*4, &ok);
+    } else {
+      locaTable[i].origOffset = 2 * getU16BE(pos + i*2, &ok);
+    }
+    if (locaTable[i].origOffset > glyfTableLen) {
+      locaTable[i].origOffset = glyfTableLen;
+    }
+  }
+  std::sort(locaTable, locaTable + nGlyphs + 1,
+           cmpTrueTypeLocaOffsetFunctor());
+  for (i = 0; i < nGlyphs; ++i) {
+    locaTable[i].len = locaTable[i+1].origOffset - locaTable[i].origOffset;
+  }
+  locaTable[nGlyphs].len = 0;
+  std::sort(locaTable, locaTable + nGlyphs + 1, cmpTrueTypeLocaIdxFunctor());
+  pos = 0;
+  *maxUsedGlyph = -1;
+  for (i = 0; i <= nGlyphs; ++i) {
+    locaTable[i].newOffset = pos;
+    pos += locaTable[i].len;
+    if (pos & 3) {
+      pos += 4 - (pos & 3);
+    }
+    if (locaTable[i].len > 0) {
+      *maxUsedGlyph = i;
+    }
+  }
+
+  // construct the new 'loca' table
+  locaData = (Guchar *)gmallocn(nGlyphs + 1, (locaFmt ? 4 : 2));
+  for (i = 0; i <= nGlyphs; ++i) {
+    pos = locaTable[i].newOffset;
+    if (locaFmt) {
+      locaData[4*i  ] = (Guchar)(pos >> 24);
+      locaData[4*i+1] = (Guchar)(pos >> 16);
+      locaData[4*i+2] = (Guchar)(pos >>  8);
+      locaData[4*i+3] = (Guchar) pos;
+    } else {
+      locaData[2*i  ] = (Guchar)(pos >> 9);
+      locaData[2*i+1] = (Guchar)(pos >> 1);
+    }
+  }
+
+  // count the number of tables
+  nNewTables = 0;
+  for (i = 0; i < nT42Tables; ++i) {
+    if (t42Tables[i].required ||
+       seekTable(t42Tables[i].tag) >= 0) {
+      ++nNewTables;
+    }
+  }
+  vmtxTab = NULL; // make gcc happy
+  advance = 0; // make gcc happy
+  if (needVerticalMetrics) {
+    needVhea = seekTable("vhea") < 0;
+    needVmtx = seekTable("vmtx") < 0;
+    if (needVhea || needVmtx) {
+      i = seekTable("head");
+      advance = getU16BE(tables[i].offset + 18, &ok); // units per em
+      if (needVhea) {
+       ++nNewTables;
+      }
+      if (needVmtx) {
+       ++nNewTables;
+      }
+    }
+  }
+
+  // construct the new table headers, including table checksums
+  // (pad each table out to a multiple of 4 bytes)
+  pos = 12 + nNewTables*16;
+  k = 0;
+  for (i = 0; i < nT42Tables; ++i) {
+    length = -1;
+    checksum = 0; // make gcc happy
+    if (i == t42HeadTable) {
+      length = 54;
+      checksum = computeTableChecksum(headData, 54);
+    } else if (i == t42LocaTable) {
+      length = (nGlyphs + 1) * (locaFmt ? 4 : 2);
+      checksum = computeTableChecksum(locaData, length);
+    } else if (i == t42GlyfTable) {
+      length = 0;
+      checksum = 0;
+      glyfPos = tables[seekTable("glyf")].offset;
+      for (j = 0; j < nGlyphs; ++j) {
+       length += locaTable[j].len;
+       if (length & 3) {
+         length += 4 - (length & 3);
+       }
+       if (checkRegion(glyfPos + locaTable[j].origOffset, locaTable[j].len)) {
+         checksum +=
+             computeTableChecksum(file + glyfPos + locaTable[j].origOffset,
+                                  locaTable[j].len);
+       }
+      }
+    } else {
+      if ((j = seekTable(t42Tables[i].tag)) >= 0) {
+       length = tables[j].len;
+       if (checkRegion(tables[j].offset, length)) {
+         checksum = computeTableChecksum(file + tables[j].offset, length);
+       }
+      } else if (needVerticalMetrics && i == t42VheaTable) {
+       vheaTab[10] = advance / 256;    // max advance height
+       vheaTab[11] = advance % 256;
+       length = sizeof(vheaTab);
+       checksum = computeTableChecksum(vheaTab, length);
+      } else if (needVerticalMetrics && i == t42VmtxTable) {
+       length = 4 + (nGlyphs - 1) * 2;
+       vmtxTab = (Guchar *)gmalloc(length);
+       vmtxTab[0] = advance / 256;
+       vmtxTab[1] = advance % 256;
+       for (j = 2; j < length; j += 2) {
+         vmtxTab[j] = 0;
+         vmtxTab[j+1] = 0;
+       }
+       checksum = computeTableChecksum(vmtxTab, length);
+      } else if (t42Tables[i].required) {
+       //~ error(-1, "Embedded TrueType font is missing a required table ('%s')",
+       //~       t42Tables[i].tag);
+       length = 0;
+       checksum = 0;
+      }
+    }
+    if (length >= 0) {
+      newTables[k].tag = ((t42Tables[i].tag[0] & 0xff) << 24) |
+                        ((t42Tables[i].tag[1] & 0xff) << 16) |
+                        ((t42Tables[i].tag[2] & 0xff) <<  8) |
+                         (t42Tables[i].tag[3] & 0xff);
+      newTables[k].checksum = checksum;
+      newTables[k].offset = pos;
+      newTables[k].len = length;
+      pos += length;
+      if (pos & 3) {
+       pos += 4 - (length & 3);
+      }
+      ++k;
+    }
+  }
+
+  // construct the table directory
+  tableDir[0] = 0x00;          // sfnt version
+  tableDir[1] = 0x01;
+  tableDir[2] = 0x00;
+  tableDir[3] = 0x00;
+  tableDir[4] = 0;             // numTables
+  tableDir[5] = nNewTables;
+  tableDir[6] = 0;             // searchRange
+  tableDir[7] = (Guchar)128;
+  tableDir[8] = 0;             // entrySelector
+  tableDir[9] = 3;
+  tableDir[10] = 0;            // rangeShift
+  tableDir[11] = (Guchar)(16 * nNewTables - 128);
+  pos = 12;
+  for (i = 0; i < nNewTables; ++i) {
+    tableDir[pos   ] = (Guchar)(newTables[i].tag >> 24);
+    tableDir[pos+ 1] = (Guchar)(newTables[i].tag >> 16);
+    tableDir[pos+ 2] = (Guchar)(newTables[i].tag >>  8);
+    tableDir[pos+ 3] = (Guchar) newTables[i].tag;
+    tableDir[pos+ 4] = (Guchar)(newTables[i].checksum >> 24);
+    tableDir[pos+ 5] = (Guchar)(newTables[i].checksum >> 16);
+    tableDir[pos+ 6] = (Guchar)(newTables[i].checksum >>  8);
+    tableDir[pos+ 7] = (Guchar) newTables[i].checksum;
+    tableDir[pos+ 8] = (Guchar)(newTables[i].offset >> 24);
+    tableDir[pos+ 9] = (Guchar)(newTables[i].offset >> 16);
+    tableDir[pos+10] = (Guchar)(newTables[i].offset >>  8);
+    tableDir[pos+11] = (Guchar) newTables[i].offset;
+    tableDir[pos+12] = (Guchar)(newTables[i].len >> 24);
+    tableDir[pos+13] = (Guchar)(newTables[i].len >> 16);
+    tableDir[pos+14] = (Guchar)(newTables[i].len >>  8);
+    tableDir[pos+15] = (Guchar) newTables[i].len;
+    pos += 16;
+  }
+
+  // compute the font checksum and store it in the head table
+  checksum = computeTableChecksum(tableDir, 12 + nNewTables*16);
+  for (i = 0; i < nNewTables; ++i) {
+    checksum += newTables[i].checksum;
+  }
+  checksum = 0xb1b0afba - checksum; // because the TrueType spec says so
+  headData[ 8] = (Guchar)(checksum >> 24);
+  headData[ 9] = (Guchar)(checksum >> 16);
+  headData[10] = (Guchar)(checksum >>  8);
+  headData[11] = (Guchar) checksum;
+
+  // start the sfnts array
+  if (name) {
+    (*outputFunc)(outputStream, "/", 1);
+    (*outputFunc)(outputStream, name->getCString(), name->getLength());
+    (*outputFunc)(outputStream, " [\n", 3);
+  } else {
+    (*outputFunc)(outputStream, "/sfnts [\n", 9);
+  }
+
+  // write the table directory
+  dumpString(tableDir, 12 + nNewTables*16, outputFunc, outputStream);
+
+  // write the tables
+  for (i = 0; i < nNewTables; ++i) {
+    if (i == t42HeadTable) {
+      dumpString(headData, 54, outputFunc, outputStream);
+    } else if (i == t42LocaTable) {
+      length = (nGlyphs + 1) * (locaFmt ? 4 : 2);
+      dumpString(locaData, length, outputFunc, outputStream);
+    } else if (i == t42GlyfTable) {
+      glyfPos = tables[seekTable("glyf")].offset;
+      for (j = 0; j < nGlyphs; ++j) {
+       if (locaTable[j].len > 0 &&
+           checkRegion(glyfPos + locaTable[j].origOffset, locaTable[j].len)) {
+         dumpString(file + glyfPos + locaTable[j].origOffset,
+                    locaTable[j].len, outputFunc, outputStream);
+       }
+      }
+    } else {
+      // length == 0 means the table is missing and the error was
+      // already reported during the construction of the table
+      // headers
+      if ((length = newTables[i].len) > 0) {
+       if ((j = seekTable(t42Tables[i].tag)) >= 0 &&
+           checkRegion(tables[j].offset, tables[j].len)) {
+         dumpString(file + tables[j].offset, tables[j].len,
+                    outputFunc, outputStream);
+       } else if (needVerticalMetrics && i == t42VheaTable) {
+         dumpString(vheaTab, length, outputFunc, outputStream);
+       } else if (needVerticalMetrics && i == t42VmtxTable) {
+         dumpString(vmtxTab, length, outputFunc, outputStream);
+       }
+      }
+    }
+  }
+
+  // end the sfnts array
+  (*outputFunc)(outputStream, "] def\n", 6);
+
+  gfree(locaData);
+  gfree(locaTable);
+  if (vmtxTab) {
+    gfree(vmtxTab);
+  }
+}
+
+void FoFiTrueType::dumpString(Guchar *s, int length,
+                             FoFiOutputFunc outputFunc,
+                             void *outputStream) {
+  GooString *buf;
+  int pad, i, j;
+
+  (*outputFunc)(outputStream, "<", 1);
+  for (i = 0; i < length; i += 32) {
+    for (j = 0; j < 32 && i+j < length; ++j) {
+      buf = GooString::format("{0:02x}", s[i+j] & 0xff);
+      (*outputFunc)(outputStream, buf->getCString(), buf->getLength());
+      delete buf;
+    }
+    if (i % (65536 - 32) == 65536 - 64) {
+      (*outputFunc)(outputStream, ">\n<", 3);
+    } else if (i+32 < length) {
+      (*outputFunc)(outputStream, "\n", 1);
+    }
+  }
+  if (length & 3) {
+    pad = 4 - (length & 3);
+    for (i = 0; i < pad; ++i) {
+      (*outputFunc)(outputStream, "00", 2);
+    }
+  }
+  // add an extra zero byte because the Adobe Type 42 spec says so
+  (*outputFunc)(outputStream, "00>\n", 4);
+}
+
+Guint FoFiTrueType::computeTableChecksum(Guchar *data, int length) {
+  Guint checksum, word;
+  int i;
+
+  checksum = 0;
+  for (i = 0; i+3 < length; i += 4) {
+    word = ((data[i  ] & 0xff) << 24) +
+           ((data[i+1] & 0xff) << 16) +
+           ((data[i+2] & 0xff) <<  8) +
+            (data[i+3] & 0xff);
+    checksum += word;
+  }
+  if (length & 3) {
+    word = 0;
+    i = length & ~3;
+    switch (length & 3) {
+    case 3:
+      word |= (data[i+2] & 0xff) <<  8;
+    case 2:
+      word |= (data[i+1] & 0xff) << 16;
+    case 1:
+      word |= (data[i  ] & 0xff) << 24;
+      break;
+    }
+    checksum += word;
+  }
+  return checksum;
+}
+
+void FoFiTrueType::parse() {
+  Guint topTag;
+  int pos, ver, i, j;
+
+  parsedOk = gTrue;
+
+  // look for a collection (TTC)
+  topTag = getU32BE(0, &parsedOk);
+  if (!parsedOk) {
+    return;
+  }
+  if (topTag == ttcfTag) {
+    /* TTC font */
+    int dircount;
+
+    dircount = getU32BE(8, &parsedOk);
+    if (!parsedOk)
+      return;
+    if (! dircount) {
+      parsedOk = gFalse;
+      return;
+    }
+
+    if (faceIndex >= dircount)
+      faceIndex = 0;
+    pos = getU32BE(12 + faceIndex * 4, &parsedOk);
+    if (! parsedOk)
+      return;
+  } else {
+    pos = 0;
+  }
+
+  // check the sfnt version
+  ver = getU32BE(pos, &parsedOk);
+  if (!parsedOk) {
+    return;
+  }
+  openTypeCFF = ver == 0x4f54544f; // 'OTTO'
+
+  // read the table directory
+  nTables = getU16BE(pos + 4, &parsedOk);
+  if (!parsedOk) {
+    return;
+  }
+  tables = (TrueTypeTable *)gmallocn(nTables, sizeof(TrueTypeTable));
+  pos += 12;
+  j = 0;
+  for (i = 0; i < nTables; ++i) {
+    tables[j].tag = getU32BE(pos, &parsedOk);
+    tables[j].checksum = getU32BE(pos + 4, &parsedOk);
+    tables[j].offset = (int)getU32BE(pos + 8, &parsedOk);
+    tables[j].len = (int)getU32BE(pos + 12, &parsedOk);
+    if (tables[j].offset + tables[j].len >= tables[j].offset &&
+       tables[j].offset + tables[j].len <= len) {
+      // ignore any bogus entries in the table directory
+      ++j;
+    }
+    pos += 16;
+  }
+  if (nTables != j) {
+    nTables = j;
+    tables = (TrueTypeTable *)greallocn_checkoverflow(tables, nTables, sizeof(TrueTypeTable));
+  }
+  if (!parsedOk || tables == NULL) {
+    return;
+  }
+
+  // check for tables that are required by both the TrueType spec and
+  // the Type 42 spec
+  if (seekTable("head") < 0 ||
+      seekTable("hhea") < 0 ||
+      seekTable("maxp") < 0 ||
+      seekTable("hmtx") < 0 ||
+      (!openTypeCFF && seekTable("loca") < 0) ||
+      (!openTypeCFF && seekTable("glyf") < 0) ||
+      (openTypeCFF && seekTable("CFF ") < 0)) {
+    parsedOk = gFalse;
+    return;
+  }
+
+  // read the cmaps
+  if ((i = seekTable("cmap")) >= 0) {
+    pos = tables[i].offset + 2;
+    nCmaps = getU16BE(pos, &parsedOk);
+    pos += 2;
+    if (!parsedOk) {
+      return;
+    }
+    cmaps = (TrueTypeCmap *)gmallocn(nCmaps, sizeof(TrueTypeCmap));
+    for (j = 0; j < nCmaps; ++j) {
+      cmaps[j].platform = getU16BE(pos, &parsedOk);
+      cmaps[j].encoding = getU16BE(pos + 2, &parsedOk);
+      cmaps[j].offset = tables[i].offset + getU32BE(pos + 4, &parsedOk);
+      pos += 8;
+      cmaps[j].fmt = getU16BE(cmaps[j].offset, &parsedOk);
+      cmaps[j].len = getU16BE(cmaps[j].offset + 2, &parsedOk);
+    }
+    if (!parsedOk) {
+      return;
+    }
+  } else {
+    nCmaps = 0;
+  }
+
+  // get the number of glyphs from the maxp table
+  i = seekTable("maxp");
+  nGlyphs = getU16BE(tables[i].offset + 4, &parsedOk);
+  if (!parsedOk) {
+    return;
+  }
+
+  // get the bbox and loca table format from the head table
+  i = seekTable("head");
+  bbox[0] = getS16BE(tables[i].offset + 36, &parsedOk);
+  bbox[1] = getS16BE(tables[i].offset + 38, &parsedOk);
+  bbox[2] = getS16BE(tables[i].offset + 40, &parsedOk);
+  bbox[3] = getS16BE(tables[i].offset + 42, &parsedOk);
+  locaFmt = getS16BE(tables[i].offset + 50, &parsedOk);
+  if (!parsedOk) {
+    return;
+  }
+
+  // make sure the loca table is sane (correct length and entries are
+  // in bounds)
+  if (!openTypeCFF) {
+    i = seekTable("loca");
+    if (tables[i].len < 0) {
+      parsedOk = gFalse;
+      return;
+    }
+    if (tables[i].len < (nGlyphs + 1) * (locaFmt ? 4 : 2)) {
+      nGlyphs = tables[i].len / (locaFmt ? 4 : 2) - 1;
+    }
+    for (j = 0; j <= nGlyphs; ++j) {
+      if (locaFmt) {
+       pos = (int)getU32BE(tables[i].offset + j*4, &parsedOk);
+      } else {
+       pos = getU16BE(tables[i].offset + j*2, &parsedOk);
+      }
+      if (pos < 0 || pos > len) {
+       parsedOk = gFalse;
+      }
+    }
+    if (!parsedOk) {
+      return;
+    }
+  }
+
+  // read the post table
+  readPostTable();
+}
+
+void FoFiTrueType::readPostTable() {
+  GooString *name;
+  int tablePos, postFmt, stringIdx, stringPos;
+  GBool ok;
+  int i, j, n, m;
+
+  ok = gTrue;
+  if ((i = seekTable("post")) < 0) {
+    return;
+  }
+  tablePos = tables[i].offset;
+  postFmt = getU32BE(tablePos, &ok);
+  if (!ok) {
+    goto err;
+  }
+  if (postFmt == 0x00010000) {
+    nameToGID = new GooHash(gTrue);
+    for (i = 0; i < 258; ++i) {
+      nameToGID->add(new GooString(macGlyphNames[i]), i);
+    }
+  } else if (postFmt == 0x00020000) {
+    nameToGID = new GooHash(gTrue);
+    n = getU16BE(tablePos + 32, &ok);
+    if (!ok) {
+      goto err;
+    }
+    if (n > nGlyphs) {
+      n = nGlyphs;
+    }
+    stringIdx = 0;
+    stringPos = tablePos + 34 + 2*n;
+    for (i = 0; i < n; ++i) {
+      j = getU16BE(tablePos + 34 + 2*i, &ok);
+      if (j < 258) {
+       nameToGID->removeInt(macGlyphNames[j]);
+       nameToGID->add(new GooString(macGlyphNames[j]), i);
+      } else {
+       j -= 258;
+       if (j != stringIdx) {
+         for (stringIdx = 0, stringPos = tablePos + 34 + 2*n;
+              stringIdx < j;
+              ++stringIdx, stringPos += 1 + getU8(stringPos, &ok)) ;
+         if (!ok) {
+           goto err;
+         }
+       }
+       m = getU8(stringPos, &ok);
+       if (!ok || !checkRegion(stringPos + 1, m)) {
+         goto err;
+       }
+       name = new GooString((char *)&file[stringPos + 1], m);
+       nameToGID->removeInt(name);
+       nameToGID->add(name, i);
+       ++stringIdx;
+       stringPos += 1 + m;
+      }
+    }
+  } else if (postFmt == 0x00028000) {
+    nameToGID = new GooHash(gTrue);
+    for (i = 0; i < nGlyphs; ++i) {
+      j = getU8(tablePos + 32 + i, &ok);
+      if (!ok) {
+       goto err;
+      }
+      if (j < 258) {
+       nameToGID->removeInt(macGlyphNames[j]);
+       nameToGID->add(new GooString(macGlyphNames[j]), i);
+      }
+    }
+  }
+
+  return;
+
+ err:
+  if (nameToGID) {
+    delete nameToGID;
+    nameToGID = NULL;
+  }
+}
+
+int FoFiTrueType::seekTable(const char *tag) {
+  Guint tagI;
+  int i;
+
+  tagI = ((tag[0] & 0xff) << 24) |
+         ((tag[1] & 0xff) << 16) |
+         ((tag[2] & 0xff) << 8) |
+          (tag[3] & 0xff);
+  for (i = 0; i < nTables; ++i) {
+    if (tables[i].tag == tagI) {
+      return i;
+    }
+  }
+  return -1;
+}
+
+Guint FoFiTrueType::charToTag(const char *tagName)
+{
+  int n = strlen(tagName);
+  Guint tag = 0;
+  int i;
+
+  if (n > 4) n = 4;
+  for (i = 0;i < n;i++) {
+    tag <<= 8;
+    tag |= tagName[i] & 0xff;
+  }
+  for (;i < 4;i++) {
+    tag <<= 8;
+    tag |= ' ';
+  }
+  return tag;
+}
+
+/*
+  setup GSUB table data
+  Only supporting vertical text substitution.
+*/
+int FoFiTrueType::setupGSUB(const char *scriptName)
+{
+  return setupGSUB(scriptName, NULL);
+}
+
+/*
+  setup GSUB table data
+  Only supporting vertical text substitution.
+*/
+int FoFiTrueType::setupGSUB(const char *scriptName,
+                            const char *languageName)
+{
+  Guint gsubTable;
+  unsigned int i;
+  Guint scriptList, featureList;
+  Guint scriptCount;
+  Guint tag;
+  Guint scriptTable = 0;
+  Guint langSys;
+  Guint featureCount;
+  Guint featureIndex;
+  Guint ftable = 0;
+  Guint llist;
+  Guint scriptTag;
+  int x;
+  Guint pos;
+
+  if (scriptName == 0) {
+    gsubFeatureTable = 0;
+    return 0;
+  }
+  scriptTag = charToTag(scriptName);
+  /* read GSUB Header */
+  if ((x = seekTable("GSUB")) < 0) {
+    return 0; /* GSUB table not found */
+  }
+  gsubTable = tables[x].offset;
+  pos = gsubTable+4;
+  scriptList = getU16BE(pos,&parsedOk);
+  pos += 2;
+  featureList = getU16BE(pos,&parsedOk);
+  pos += 2;
+  llist = getU16BE(pos,&parsedOk);
+
+  gsubLookupList = llist+gsubTable; /* change to offset from top of file */
+  /* read script list table */
+  pos = gsubTable+scriptList;
+  scriptCount = getU16BE(pos,&parsedOk);
+  pos += 2;
+  /* find  script */
+  for (i = 0;i < scriptCount;i++) {
+    tag = getU32BE(pos,&parsedOk);
+    pos += 4;
+    scriptTable = getU16BE(pos,&parsedOk);
+    pos += 2;
+    if (tag == scriptTag) {
+      /* found */
+      break;
+    }
+  }
+  if (i >= scriptCount) {
+    /* not found */
+    return 0;
+  }
+
+  /* read script table */
+  /* use default language system */
+  pos = gsubTable+scriptList+scriptTable;
+  langSys = 0;
+  if (languageName) {
+    Guint langTag = charToTag(languageName);
+    Guint langCount = getU16BE(pos+2,&parsedOk);
+    for (i = 0;i < langCount && langSys == 0;i++) {
+      tag = getU32BE(pos+4+i*(4+2),&parsedOk);
+      if (tag == langTag) {
+        langSys = getU16BE(pos+4+i*(4+2)+4,&parsedOk);
+      }
+    }
+  }
+  if (langSys == 0) {
+    /* default language system */
+    langSys = getU16BE(pos,&parsedOk);
+  }
+
+  /* read LangSys table */
+  if (langSys == 0) {
+    /* no default LangSys */
+    return 0;
+  }
+
+  pos = gsubTable+scriptList+scriptTable+langSys+2;
+  featureIndex = getU16BE(pos,&parsedOk); /* ReqFeatureIndex */
+  pos += 2;
+
+  if (featureIndex != 0xffff) {
+    Guint tpos;
+    /* read feature record */
+    tpos = gsubTable+featureList;
+    featureCount = getU16BE(tpos,&parsedOk);
+    tpos = gsubTable+featureList+2+featureIndex*(4+2);
+    tag = getU32BE(tpos,&parsedOk);
+    tpos += 4;
+    if (tag == vrt2Tag) {
+      /* vrt2 is preferred, overwrite vert */
+      ftable = getU16BE(tpos,&parsedOk);
+      /* convert to offset from file top */
+      gsubFeatureTable = ftable+gsubTable+featureList;
+      return 0;
+    } else if (tag == vertTag) {
+      ftable = getU16BE(tpos,&parsedOk);
+    }
+  }
+  featureCount = getU16BE(pos,&parsedOk);
+  pos += 2;
+  /* find 'vrt2' or 'vert' feature */
+  for (i = 0;i < featureCount;i++) {
+    Guint oldPos;
+
+    featureIndex = getU16BE(pos,&parsedOk);
+    pos += 2;
+    oldPos = pos; /* save position */
+    /* read feature record */
+    pos = gsubTable+featureList+2+featureIndex*(4+2);
+    tag = getU32BE(pos,&parsedOk);
+    pos += 4;
+    if (tag == vrt2Tag) {
+      /* vrt2 is preferred, overwrite vert */
+      ftable = getU16BE(pos,&parsedOk);
+      break;
+    } else if (ftable == 0 && tag == vertTag) {
+      ftable = getU16BE(pos,&parsedOk);
+    }
+    pos = oldPos; /* restore old position */
+  }
+  if (ftable == 0) {
+    /* vert nor vrt2 are not found */
+    return 0;
+  }
+  /* convert to offset from file top */
+  gsubFeatureTable = ftable+gsubTable+featureList;
+  return 0;
+}
+
+Guint FoFiTrueType::doMapToVertGID(Guint orgGID)
+{
+  Guint lookupCount;
+  Guint lookupListIndex;
+  Guint i;
+  Guint gid = 0;
+  Guint pos;
+
+  pos = gsubFeatureTable+2;
+  lookupCount = getU16BE(pos,&parsedOk);
+  pos += 2;
+  for (i = 0;i < lookupCount;i++) {
+    lookupListIndex = getU16BE(pos,&parsedOk);
+    pos += 2;
+    if ((gid = scanLookupList(lookupListIndex,orgGID)) != 0) {
+      break;
+    }
+  }
+  return gid;
+}
+
+Guint FoFiTrueType::mapToVertGID(Guint orgGID)
+{
+  Guint mapped;
+
+  if (gsubFeatureTable == 0) return orgGID;
+  if ((mapped = doMapToVertGID(orgGID)) != 0) {
+    return mapped;
+  }
+  return orgGID;
+}
+
+Guint FoFiTrueType::scanLookupList(Guint listIndex, Guint orgGID)
+{
+  Guint lookupTable;
+  Guint subTableCount;
+  Guint subTable;
+  Guint i;
+  Guint gid = 0;
+  Guint pos;
+
+  if (gsubLookupList == 0) return 0; /* no lookup list */
+  pos = gsubLookupList+2+listIndex*2;
+  lookupTable = getU16BE(pos,&parsedOk);
+  /* read lookup table */
+  pos = gsubLookupList+lookupTable+4;
+  subTableCount = getU16BE(pos,&parsedOk);
+  pos += 2;;
+  for (i = 0;i < subTableCount;i++) {
+    subTable = getU16BE(pos,&parsedOk);
+    pos += 2;
+    if ((gid = scanLookupSubTable(gsubLookupList+lookupTable+subTable,orgGID))
+         != 0) break;
+  }
+  return gid;
+}
+
+Guint FoFiTrueType::scanLookupSubTable(Guint subTable, Guint orgGID)
+{
+  Guint format;
+  Guint coverage;
+  int delta;
+  int glyphCount;
+  Guint substitute;
+  Guint gid = 0;
+  int coverageIndex;
+  int pos;
+
+  pos = subTable;
+  format = getU16BE(pos,&parsedOk);
+  pos += 2;
+  coverage = getU16BE(pos,&parsedOk);
+  pos += 2;
+  if ((coverageIndex =
+     checkGIDInCoverage(subTable+coverage,orgGID)) >= 0) {
+    switch (format) {
+    case 1:
+      /* format 1 */
+      delta = getS16BE(pos,&parsedOk);
+      pos += 2;
+      gid = orgGID+delta;
+      break;
+    case 2:
+      /* format 2 */
+      glyphCount = getS16BE(pos,&parsedOk);
+      pos += 2;
+      if (glyphCount > coverageIndex) {
+       pos += coverageIndex*2;
+       substitute = getU16BE(pos,&parsedOk);
+        gid = substitute;
+      }
+      break;
+    default:
+      /* unknown format */
+      break;
+    }
+  }
+  return gid;
+}
+
+int FoFiTrueType::checkGIDInCoverage(Guint coverage, Guint orgGID)
+{
+  int index = -1;
+  Guint format;
+  Guint count;
+  Guint i;
+  Guint pos;
+
+  pos = coverage;
+  format = getU16BE(pos,&parsedOk);
+  pos += 2;
+  switch (format) {
+  case 1:
+    count = getU16BE(pos,&parsedOk);
+    pos += 2;
+    // In some poor CJK fonts, key GIDs are not sorted,
+    // thus we cannot finish checking even when the range
+    // including orgGID seems to have already passed.
+    for (i = 0;i < count;i++) {
+      Guint gid;
+
+      gid = getU16BE(pos,&parsedOk);
+      pos += 2;
+      if (gid == orgGID) {
+        /* found */
+        index = i;
+        break;
+      }
+    }
+    break;
+  case 2:
+    count = getU16BE(pos,&parsedOk);
+    pos += 2;
+    for (i = 0;i < count;i++) {
+      Guint startGID, endGID;
+      Guint startIndex;
+
+      startGID = getU16BE(pos,&parsedOk);
+      pos += 2;
+      endGID = getU16BE(pos,&parsedOk);
+      pos += 2;
+      startIndex = getU16BE(pos,&parsedOk);
+      pos += 2;
+      // In some poor CJK fonts, key GIDs are not sorted,
+      // thus we cannot finish checking even when the range
+      // including orgGID seems to have already passed.
+      if (startGID <= orgGID && orgGID <= endGID) {
+        /* found */
+        index = startIndex+orgGID-startGID;
+        break;
+      }
+    }
+    break;
+  default:
+    break;
+  }
+  return index;
+}
+
diff --git a/fofi/FoFiTrueType.h b/fofi/FoFiTrueType.h
new file mode 100644 (file)
index 0000000..fb05ae9
--- /dev/null
@@ -0,0 +1,218 @@
+//========================================================================
+//
+// FoFiTrueType.h
+//
+// Copyright 1999-2003 Glyph & Cog, LLC
+//
+//========================================================================
+
+//========================================================================
+//
+// Modified under the Poppler project - http://poppler.freedesktop.org
+//
+// All changes made under the Poppler project to this file are licensed
+// under GPL version 2 or later
+//
+// Copyright (C) 2006 Takashi Iwai <tiwai@suse.de>
+// Copyright (C) 2007 Koji Otani <sho@bbr.jp>
+// Copyright (C) 2011 Albert Astals Cid <aacid@kde.org>
+// Copyright (C) 2012 Suzuki Toshiya <mpsuzuki@hiroshima-u.ac.jp>
+//
+// To see a description of the changes please see the Changelog file that
+// came with your tarball or type make ChangeLog if you are building from git
+//
+//========================================================================
+
+#ifndef FOFITRUETYPE_H
+#define FOFITRUETYPE_H
+
+#ifdef USE_GCC_PRAGMAS
+#pragma interface
+#endif
+
+#include "stddef.h"
+#include "goo/gtypes.h"
+#include "FoFiBase.h"
+
+class GooString;
+class GooHash;
+struct TrueTypeTable;
+struct TrueTypeCmap;
+
+//------------------------------------------------------------------------
+// FoFiTrueType
+//------------------------------------------------------------------------
+
+class FoFiTrueType: public FoFiBase {
+public:
+
+  // Create a FoFiTrueType object from a memory buffer.
+  static FoFiTrueType *make(char *fileA, int lenA, int faceIndexA=0);
+
+  // Create a FoFiTrueType object from a file on disk.
+  static FoFiTrueType *load(char *fileName, int faceIndexA=0);
+
+  virtual ~FoFiTrueType();
+
+  // Returns true if this an OpenType font containing CFF data, false
+  // if it's a TrueType font (or OpenType font with TrueType data).
+  GBool isOpenTypeCFF() { return openTypeCFF; }
+
+  // Return the number of cmaps defined by this font.
+  int getNumCmaps();
+
+  // Return the platform ID of the <i>th cmap.
+  int getCmapPlatform(int i);
+
+  // Return the encoding ID of the <i>th cmap.
+  int getCmapEncoding(int i);
+
+  // Return the index of the cmap for <platform>, <encoding>.  Returns
+  // -1 if there is no corresponding cmap.
+  int findCmap(int platform, int encoding);
+
+  // Return the GID corresponding to <c> according to the <i>th cmap.
+  int mapCodeToGID(int i, Guint c);
+
+  // map gid to vertical glyph gid if exist.
+  //   if not exist return original gid
+  Guint mapToVertGID(Guint orgGID);
+
+  // Returns the GID corresponding to <name> according to the post
+  // table.  Returns 0 if there is no mapping for <name> or if the
+  // font does not have a post table.
+  int mapNameToGID(char *name);
+
+  // Return the mapping from CIDs to GIDs, and return the number of
+  // CIDs in *<nCIDs>.  This is only useful for CID fonts.  (Only
+  // useful for OpenType CFF fonts.)
+  int *getCIDToGIDMap(int *nCIDs);
+
+  // Returns the least restrictive embedding licensing right (as
+  // defined by the TrueType spec):
+  // * 4: OS/2 table is missing or invalid
+  // * 3: installable embedding
+  // * 2: editable embedding
+  // * 1: preview & print embedding
+  // * 0: restricted license embedding
+  int getEmbeddingRights();
+
+  // Return the font matrix as an array of six numbers.  (Only useful
+  // for OpenType CFF fonts.)
+  void getFontMatrix(double *mat);
+
+  // Convert to a Type 42 font, suitable for embedding in a PostScript
+  // file.  <psName> will be used as the PostScript font name (so we
+  // don't need to depend on the 'name' table in the font).  The
+  // <encoding> array specifies the mapping from char codes to names.
+  // If <encoding> is NULL, the encoding is unknown or undefined.  The
+  // <codeToGID> array specifies the mapping from char codes to GIDs.
+  // (Not useful for OpenType CFF fonts.)
+  void convertToType42(char *psName, char **encoding,
+                      int *codeToGID,
+                      FoFiOutputFunc outputFunc, void *outputStream);
+
+  // Convert to a Type 1 font, suitable for embedding in a PostScript
+  // file.  This is only useful with 8-bit fonts.  If <newEncoding> is
+  // not NULL, it will be used in place of the encoding in the Type 1C
+  // font.  If <ascii> is true the eexec section will be hex-encoded,
+  // otherwise it will be left as binary data.  If <psName> is
+  // non-NULL, it will be used as the PostScript font name.  (Only
+  // useful for OpenType CFF fonts.)
+  void convertToType1(char *psName, const char **newEncoding, GBool ascii,
+                     FoFiOutputFunc outputFunc, void *outputStream);
+
+  // Convert to a Type 2 CIDFont, suitable for embedding in a
+  // PostScript file.  <psName> will be used as the PostScript font
+  // name (so we don't need to depend on the 'name' table in the
+  // font).  The <cidMap> array maps CIDs to GIDs; it has <nCIDs>
+  // entries.  (Not useful for OpenType CFF fonts.)
+  void convertToCIDType2(char *psName, int *cidMap, int nCIDs,
+                        GBool needVerticalMetrics,
+                        FoFiOutputFunc outputFunc, void *outputStream);
+
+  // Convert to a Type 0 CIDFont, suitable for embedding in a
+  // PostScript file.  <psName> will be used as the PostScript font
+  // name.  (Only useful for OpenType CFF fonts.)
+  void convertToCIDType0(char *psName, int *cidMap, int nCIDs,
+                        FoFiOutputFunc outputFunc, void *outputStream);
+
+  // Convert to a Type 0 (but non-CID) composite font, suitable for
+  // embedding in a PostScript file.  <psName> will be used as the
+  // PostScript font name (so we don't need to depend on the 'name'
+  // table in the font).  The <cidMap> array maps CIDs to GIDs; it has
+  // <nCIDs> entries.  (Not useful for OpenType CFF fonts.)
+  void convertToType0(char *psName, int *cidMap, int nCIDs,
+                     GBool needVerticalMetrics,
+                     FoFiOutputFunc outputFunc, void *outputStream);
+
+  // Convert to a Type 0 (but non-CID) composite font, suitable for
+  // embedding in a PostScript file.  <psName> will be used as the
+  // PostScript font name.  (Only useful for OpenType CFF fonts.)
+  void convertToType0(char *psName, int *cidMap, int nCIDs,
+                     FoFiOutputFunc outputFunc, void *outputStream);
+
+  // Write a clean TTF file, filling in missing tables and correcting
+  // various other errors.  If <name> is non-NULL, the font is renamed
+  // to <name>.  If <codeToGID> is non-NULL, the font is re-encoded,
+  // using a Windows Unicode cmap.  If <name> is NULL and the font is
+  // complete and correct, it will be written unmodified.  (Not useful
+  // for OpenType CFF fonts.)
+  void writeTTF(FoFiOutputFunc outputFunc, void *outputStream,
+               char *name = NULL, int *codeToGID = NULL);
+
+  // Returns a pointer to the CFF font embedded in this OpenType font.
+  // If successful, sets *<start> and *<length>, and returns true.
+  // Otherwise returns false.  (Only useful for OpenType CFF fonts).
+  GBool getCFFBlock(char **start, int *length);
+
+  // setup vert/vrt2 GSUB for default lang
+  int setupGSUB(const char *scriptName);
+
+  // setup vert/vrt2 GSUB for specified lang
+  int setupGSUB(const char *scriptName, const char* languageName);
+
+private:
+
+  FoFiTrueType(char *fileA, int lenA, GBool freeFileDataA, int faceIndexA);
+  void cvtEncoding(char **encoding,
+                  FoFiOutputFunc outputFunc,
+                  void *outputStream);
+  void cvtCharStrings(char **encoding,
+                     int *codeToGID,
+                     FoFiOutputFunc outputFunc,
+                     void *outputStream);
+  void cvtSfnts(FoFiOutputFunc outputFunc,
+               void *outputStream, GooString *name,
+               GBool needVerticalMetrics,
+                int *maxUsedGlyph);
+  void dumpString(Guchar *s, int length,
+                 FoFiOutputFunc outputFunc,
+                 void *outputStream);
+  Guint computeTableChecksum(Guchar *data, int length);
+  void parse();
+  void readPostTable();
+  int seekTable(const char *tag);
+  Guint charToTag(const char *tagName);
+  Guint doMapToVertGID(Guint orgGID);
+  Guint scanLookupList(Guint listIndex, Guint orgGID);
+  Guint scanLookupSubTable(Guint subTable, Guint orgGID);
+  int checkGIDInCoverage(Guint coverage, Guint orgGID);
+
+  TrueTypeTable *tables;
+  int nTables;
+  TrueTypeCmap *cmaps;
+  int nCmaps;
+  int nGlyphs;
+  int locaFmt;
+  int bbox[4];
+  GooHash *nameToGID;
+  GBool openTypeCFF;
+
+  GBool parsedOk;
+  int faceIndex;
+  Guint gsubFeatureTable;
+  Guint gsubLookupList;
+};
+
+#endif
diff --git a/fofi/FoFiType1.cc b/fofi/FoFiType1.cc
new file mode 100644 (file)
index 0000000..8fa10a0
--- /dev/null
@@ -0,0 +1,358 @@
+//========================================================================
+//
+// FoFiType1.cc
+//
+// Copyright 1999-2003 Glyph & Cog, LLC
+//
+//========================================================================
+
+//========================================================================
+//
+// Modified under the Poppler project - http://poppler.freedesktop.org
+//
+// All changes made under the Poppler project to this file are licensed
+// under GPL version 2 or later
+//
+// Copyright (C) 2005, 2008, 2010 Albert Astals Cid <aacid@kde.org>
+// Copyright (C) 2005 Kristian Høgsberg <krh@redhat.com>
+// Copyright (C) 2010 Jakub Wilk <ubanus@users.sf.net>
+//
+// To see a description of the changes please see the Changelog file that
+// came with your tarball or type make ChangeLog if you are building from git
+//
+//========================================================================
+
+#include <config.h>
+
+#ifdef USE_GCC_PRAGMAS
+#pragma implementation
+#endif
+
+#include <stdlib.h>
+#include <string.h>
+#include "goo/gmem.h"
+#include "goo/GooLikely.h"
+#include "FoFiEncodings.h"
+#include "FoFiType1.h"
+#include "poppler/Error.h"
+
+//------------------------------------------------------------------------
+// FoFiType1
+//------------------------------------------------------------------------
+
+FoFiType1 *FoFiType1::make(char *fileA, int lenA) {
+  return new FoFiType1(fileA, lenA, gFalse);
+}
+
+FoFiType1 *FoFiType1::load(char *fileName) {
+  char *fileA;
+  int lenA;
+
+  if (!(fileA = FoFiBase::readFile(fileName, &lenA))) {
+    return NULL;
+  }
+  return new FoFiType1(fileA, lenA, gTrue);
+}
+
+FoFiType1::FoFiType1(char *fileA, int lenA, GBool freeFileDataA):
+  FoFiBase(fileA, lenA, freeFileDataA)
+{
+  name = NULL;
+  encoding = NULL;
+  fontMatrix[0] = 0.001;
+  fontMatrix[1] = 0;
+  fontMatrix[2] = 0;
+  fontMatrix[3] = 0.001;
+  fontMatrix[4] = 0;
+  fontMatrix[5] = 0;
+  parsed = gFalse;
+  undoPFB();
+}
+
+FoFiType1::~FoFiType1() {
+  int i;
+
+  if (name) {
+    gfree(name);
+  }
+  if (encoding && encoding != fofiType1StandardEncoding) {
+    for (i = 0; i < 256; ++i) {
+      gfree(encoding[i]);
+    }
+    gfree(encoding);
+  }
+}
+
+char *FoFiType1::getName() {
+  if (!parsed) {
+    parse();
+  }
+  return name;
+}
+
+char **FoFiType1::getEncoding() {
+  if (!parsed) {
+    parse();
+  }
+  return encoding;
+}
+
+void FoFiType1::getFontMatrix(double *mat) {
+  int i;
+
+  if (!parsed) {
+    parse();
+  }
+  for (i = 0; i < 6; ++i) {
+    mat[i] = fontMatrix[i];
+  }
+}
+
+void FoFiType1::writeEncoded(const char **newEncoding,
+                            FoFiOutputFunc outputFunc, void *outputStream) {
+  char buf[512];
+  char *line, *line2, *p;
+  int i;
+
+  // copy everything up to the encoding
+  for (line = (char *)file;
+       line && strncmp(line, "/Encoding", 9);
+       line = getNextLine(line)) ;
+  if (!line) {
+    // no encoding - just copy the whole font file
+    (*outputFunc)(outputStream, (char *)file, len);
+    return;
+  }
+  (*outputFunc)(outputStream, (char *)file, line - (char *)file);
+
+  // write the new encoding
+  (*outputFunc)(outputStream, "/Encoding 256 array\n", 20);
+  (*outputFunc)(outputStream,
+               "0 1 255 {1 index exch /.notdef put} for\n", 40);
+  for (i = 0; i < 256; ++i) {
+    if (newEncoding[i]) {
+      sprintf(buf, "dup %d /%s put\n", i, newEncoding[i]);
+      (*outputFunc)(outputStream, buf, strlen(buf));
+    }
+  }
+  (*outputFunc)(outputStream, "readonly def\n", 13);
+  
+  // find the end of the encoding data
+  //~ this ought to parse PostScript tokens
+  if (!strncmp(line, "/Encoding StandardEncoding def", 30)) {
+    line = getNextLine(line);
+  } else {
+    // skip "/Encoding" + one whitespace char,
+    // then look for 'def' preceded by PostScript whitespace
+    p = line + 10;
+    line = NULL;
+    for (; p < (char *)file + len; ++p) {
+      if ((*p == ' ' || *p == '\t' || *p == '\x0a' ||
+          *p == '\x0d' || *p == '\x0c' || *p == '\0') &&
+         p + 4 <= (char *)file + len &&
+         !strncmp(p + 1, "def", 3)) {
+       line = p + 4;
+       break;
+      }
+    }
+  }
+
+  // some fonts have two /Encoding entries in their dictionary, so we
+  // check for a second one here
+  if (line) {
+    for (line2 = line, i = 0;
+        i < 20 && line2 && strncmp(line2, "/Encoding", 9);
+        line2 = getNextLine(line2), ++i) ;
+    if (i < 20 && line2) {
+      (*outputFunc)(outputStream, line, line2 - line);
+      if (!strncmp(line2, "/Encoding StandardEncoding def", 30)) {
+       line = getNextLine(line2);
+      } else {
+       // skip "/Encoding" + one whitespace char,
+       // then look for 'def' preceded by PostScript whitespace
+       p = line2 + 10;
+       line = NULL;
+       for (; p < (char *)file + len; ++p) {
+         if ((*p == ' ' || *p == '\t' || *p == '\x0a' ||
+              *p == '\x0d' || *p == '\x0c' || *p == '\0') &&
+             p + 4 <= (char *)file + len &&
+             !strncmp(p + 1, "def", 3)) {
+           line = p + 4;
+           break;
+         }
+       }
+      }
+    }
+
+    // copy everything after the encoding
+    if (line) {
+      (*outputFunc)(outputStream, line, ((char *)file + len) - line);
+    }
+  }
+}
+
+char *FoFiType1::getNextLine(char *line) {
+  while (line < (char *)file + len && *line != '\x0a' && *line != '\x0d') {
+    ++line;
+  }
+  if (line < (char *)file + len && *line == '\x0d') {
+    ++line;
+  }
+  if (line < (char *)file + len && *line == '\x0a') {
+    ++line;
+  }
+  if (line >= (char *)file + len) {
+    return NULL;
+  }
+  return line;
+}
+
+void FoFiType1::parse() {
+  char *line, *line1, *p, *p2;
+  char buf[256];
+  char c;
+  int n, code, base, i, j;
+  char *tokptr;
+  GBool gotMatrix;
+
+  gotMatrix = gFalse;
+  for (i = 1, line = (char *)file;
+       i <= 100 && line && (!name || !encoding);
+       ++i) {
+
+    // get font name
+    if (!name && !strncmp(line, "/FontName", 9)) {
+      strncpy(buf, line, 255);
+      buf[255] = '\0';
+      if ((p = strchr(buf+9, '/')) &&
+         (p = strtok_r(p+1, " \t\n\r", &tokptr))) {
+       name = copyString(p);
+      }
+      line = getNextLine(line);
+
+    // get encoding
+    } else if (!encoding &&
+              !strncmp(line, "/Encoding StandardEncoding def", 30)) {
+      encoding = (char **)fofiType1StandardEncoding;
+    } else if (!encoding &&
+              !strncmp(line, "/Encoding 256 array", 19)) {
+      encoding = (char **)gmallocn(256, sizeof(char *));
+      for (j = 0; j < 256; ++j) {
+       encoding[j] = NULL;
+      }
+      for (j = 0, line = getNextLine(line);
+          j < 300 && line && (line1 = getNextLine(line));
+          ++j, line = line1) {
+        if ((n = (int)(line1 - line)) > 255) {
+         error(errSyntaxWarning, -1, "FoFiType1::parse a line has more than 255 characters, we don't support this");
+         n = 255;
+       }
+       strncpy(buf, line, n);
+       buf[n] = '\0';
+       for (p = buf; *p == ' ' || *p == '\t'; ++p) ;
+       if (!strncmp(p, "dup", 3)) {
+         while (1) {
+           p += 3;
+           for (; *p == ' ' || *p == '\t'; ++p) ;
+           code = 0;
+           if (*p == '8' && p[1] == '#') {
+             base = 8;
+             p += 2;
+           } else if (*p >= '0' && *p <= '9') {
+             base = 10;
+           } else {
+             break;
+           }
+           for (; *p >= '0' && *p < '0' + base; ++p) {
+             code = code * base + (*p - '0');
+           }
+           for (; *p == ' ' || *p == '\t'; ++p) ;
+           if (*p != '/') {
+             break;
+           }
+           ++p;
+           for (p2 = p; *p2 && *p2 != ' ' && *p2 != '\t'; ++p2) ;
+           if (code >= 0 && code < 256) {
+             c = *p2;
+             *p2 = '\0';
+             encoding[code] = copyString(p);
+             *p2 = c;
+           }
+           for (p = p2; *p == ' ' || *p == '\t'; ++p) ;
+           if (strncmp(p, "put", 3)) {
+             break;
+           }
+           for (p += 3; *p == ' ' || *p == '\t'; ++p) ;
+           if (strncmp(p, "dup", 3)) {
+             break;
+           }
+         }
+       } else {
+         if (strtok_r(buf, " \t", &tokptr) &&
+             (p = strtok_r(NULL, " \t\n\r", &tokptr)) && !strcmp(p, "def")) {
+           break;
+         }
+       }
+      }
+      //~ check for getinterval/putinterval junk
+
+    } else if (!gotMatrix && !strncmp(line, "/FontMatrix", 11)) {
+      strncpy(buf, line + 11, 255);
+      buf[255] = '\0';
+      if ((p = strchr(buf, '['))) {
+       ++p;
+       if ((p2 = strchr(p, ']'))) {
+         *p2 = '\0';
+         for (j = 0; j < 6; ++j) {
+           if ((p = strtok(j == 0 ? p : (char *)NULL, " \t\n\r"))) {
+             fontMatrix[j] = atof(p);
+           } else {
+             break;
+           }
+         }
+       }
+      }
+      gotMatrix = gTrue;
+
+    } else {
+      line = getNextLine(line);
+    }
+  }
+
+  parsed = gTrue;
+}
+
+// Undo the PFB encoding, i.e., remove the PFB headers.
+void FoFiType1::undoPFB() {
+  GBool ok;
+  Guchar *file2;
+  int pos1, pos2, type;
+  Guint segLen;
+
+  ok = gTrue;
+  if (getU8(0, &ok) != 0x80 || !ok) {
+    return;
+  }
+  file2 = (Guchar *)gmalloc(len);
+  pos1 = pos2 = 0;
+  while (getU8(pos1, &ok) == 0x80 && ok) {
+    type = getU8(pos1 + 1, &ok);
+    if (type < 1 || type > 2 || !ok) {
+      break;
+    }
+    segLen = getU32LE(pos1 + 2, &ok);
+    pos1 += 6;
+    if (!ok || !checkRegion(pos1, segLen)) {
+      break;
+    }
+    memcpy(file2 + pos2, file + pos1, segLen);
+    pos1 += segLen;
+    pos2 += segLen;
+  }
+  if (freeFileData) {
+    gfree(fileData);
+  }
+  file = fileData = file2;
+  freeFileData = gTrue;
+  len = pos2;
+}
diff --git a/fofi/FoFiType1.h b/fofi/FoFiType1.h
new file mode 100644 (file)
index 0000000..f4e29b4
--- /dev/null
@@ -0,0 +1,62 @@
+//========================================================================
+//
+// FoFiType1.h
+//
+// Copyright 1999-2003 Glyph & Cog, LLC
+//
+//========================================================================
+
+#ifndef FOFITYPE1_H
+#define FOFITYPE1_H
+
+#ifdef USE_GCC_PRAGMAS
+#pragma interface
+#endif
+
+#include "goo/gtypes.h"
+#include "FoFiBase.h"
+
+//------------------------------------------------------------------------
+// FoFiType1
+//------------------------------------------------------------------------
+
+class FoFiType1: public FoFiBase {
+public:
+
+  // Create a FoFiType1 object from a memory buffer.
+  static FoFiType1 *make(char *fileA, int lenA);
+
+  // Create a FoFiType1 object from a file on disk.
+  static FoFiType1 *load(char *fileName);
+
+  virtual ~FoFiType1();
+
+  // Return the font name.
+  char *getName();
+
+  // Return the encoding, as an array of 256 names (any of which may
+  // be NULL).
+  char **getEncoding();
+
+  // Return the font matrix as an array of six numbers.
+  void getFontMatrix(double *mat);
+
+  // Write a version of the Type 1 font file with a new encoding.
+  void writeEncoded(const char **newEncoding,
+                   FoFiOutputFunc outputFunc, void *outputStream);
+
+private:
+
+  FoFiType1(char *fileA, int lenA, GBool freeFileDataA);
+
+  char *getNextLine(char *line);
+  void parse();
+  void undoPFB();
+
+  char *name;
+  char **encoding;
+  double fontMatrix[6];
+  GBool parsed;
+};
+
+#endif
diff --git a/fofi/FoFiType1C.cc b/fofi/FoFiType1C.cc
new file mode 100644 (file)
index 0000000..c4595a3
--- /dev/null
@@ -0,0 +1,2745 @@
+//========================================================================
+//
+// FoFiType1C.cc
+//
+// Copyright 1999-2003 Glyph & Cog, LLC
+//
+//========================================================================
+
+//========================================================================
+//
+// Modified under the Poppler project - http://poppler.freedesktop.org
+//
+// All changes made under the Poppler project to this file are licensed
+// under GPL version 2 or later
+//
+// Copyright (C) 2009, 2010 Albert Astals Cid <aacid@kde.org>
+// Copyright (C) 2012 Thomas Freitag <Thomas.Freitag@alfa.de>
+//
+// To see a description of the changes please see the Changelog file that
+// came with your tarball or type make ChangeLog if you are building from git
+//
+//========================================================================
+
+#include <config.h>
+
+#ifdef USE_GCC_PRAGMAS
+#pragma implementation
+#endif
+
+#include <stdlib.h>
+#include <string.h>
+#include <math.h>
+#include "goo/gmem.h"
+#include "goo/gstrtod.h"
+#include "goo/GooString.h"
+#include "FoFiEncodings.h"
+#include "FoFiType1C.h"
+
+//------------------------------------------------------------------------
+
+static char hexChars[17] = "0123456789ABCDEF";
+
+//------------------------------------------------------------------------
+// FoFiType1C
+//------------------------------------------------------------------------
+
+FoFiType1C *FoFiType1C::make(char *fileA, int lenA) {
+  FoFiType1C *ff;
+
+  ff = new FoFiType1C(fileA, lenA, gFalse);
+  if (!ff->parse()) {
+    delete ff;
+    return NULL;
+  }
+  return ff;
+}
+
+FoFiType1C *FoFiType1C::load(char *fileName) {
+  FoFiType1C *ff;
+  char *fileA;
+  int lenA;
+
+  if (!(fileA = FoFiBase::readFile(fileName, &lenA))) {
+    return NULL;
+  }
+  ff = new FoFiType1C(fileA, lenA, gTrue);
+  if (!ff->parse()) {
+    delete ff;
+    return NULL;
+  }
+  return ff;
+}
+
+FoFiType1C::FoFiType1C(char *fileA, int lenA, GBool freeFileDataA):
+  FoFiBase(fileA, lenA, freeFileDataA)
+{
+  name = NULL;
+  encoding = NULL;
+  privateDicts = NULL;
+  fdSelect = NULL;
+  charset = NULL;
+  charsetLength = 0;
+}
+
+FoFiType1C::~FoFiType1C() {
+  int i;
+
+  if (name) {
+    delete name;
+  }
+  if (encoding &&
+      encoding != fofiType1StandardEncoding &&
+      encoding != fofiType1ExpertEncoding) {
+    for (i = 0; i < 256; ++i) {
+      gfree(encoding[i]);
+    }
+    gfree(encoding);
+  }
+  if (privateDicts) {
+    gfree(privateDicts);
+  }
+  if (fdSelect) {
+    gfree(fdSelect);
+  }
+  if (charset &&
+      charset != fofiType1CISOAdobeCharset &&
+      charset != fofiType1CExpertCharset &&
+      charset != fofiType1CExpertSubsetCharset) {
+    gfree(charset);
+  }
+}
+
+char *FoFiType1C::getName() {
+  return name ? name->getCString() : (char *)NULL;
+}
+
+char **FoFiType1C::getEncoding() {
+  return encoding;
+}
+
+GooString *FoFiType1C::getGlyphName(int gid) {
+  char buf[256];
+  GBool ok;
+
+  ok = gTrue;
+  if (gid < 0 || gid >= charsetLength)
+    return NULL;
+  getString(charset[gid], buf, &ok);
+  if (!ok) {
+    return NULL;
+  }
+  return new GooString(buf);
+}
+
+int *FoFiType1C::getCIDToGIDMap(int *nCIDs) {
+  int *map;
+  int n, i;
+
+  // a CID font's top dict has ROS as the first operator
+  if (topDict.firstOp != 0x0c1e) {
+    *nCIDs = 0;
+    return NULL;
+  }
+
+  // in a CID font, the charset data is the GID-to-CID mapping, so all
+  // we have to do is reverse it
+  n = 0;
+  for (i = 0; i < nGlyphs && i < charsetLength; ++i) {
+    if (charset[i] > n) {
+      n = charset[i];
+    }
+  }
+  ++n;
+  map = (int *)gmallocn(n, sizeof(int));
+  memset(map, 0, n * sizeof(int));
+  for (i = 0; i < nGlyphs; ++i) {
+    map[charset[i]] = i;
+  }
+  *nCIDs = n;
+  return map;
+}
+
+void FoFiType1C::getFontMatrix(double *mat) {
+  int i;
+
+  if (topDict.firstOp == 0x0c1e && privateDicts[0].hasFontMatrix) {
+    if (topDict.hasFontMatrix) {
+      mat[0] = topDict.fontMatrix[0] * privateDicts[0].fontMatrix[0] +
+              topDict.fontMatrix[1] * privateDicts[0].fontMatrix[2];
+      mat[1] = topDict.fontMatrix[0] * privateDicts[0].fontMatrix[1] +
+               topDict.fontMatrix[1] * privateDicts[0].fontMatrix[3];
+      mat[2] = topDict.fontMatrix[2] * privateDicts[0].fontMatrix[0] +
+              topDict.fontMatrix[3] * privateDicts[0].fontMatrix[2];
+      mat[3] = topDict.fontMatrix[2] * privateDicts[0].fontMatrix[1] +
+              topDict.fontMatrix[3] * privateDicts[0].fontMatrix[3];
+      mat[4] = topDict.fontMatrix[4] * privateDicts[0].fontMatrix[0] +
+              topDict.fontMatrix[5] * privateDicts[0].fontMatrix[2];
+      mat[5] = topDict.fontMatrix[4] * privateDicts[0].fontMatrix[1] +
+              topDict.fontMatrix[5] * privateDicts[0].fontMatrix[3];
+    } else {
+      for (i = 0; i < 6; ++i) {
+       mat[i] = privateDicts[0].fontMatrix[i];
+      }
+    }
+  } else {
+    for (i = 0; i < 6; ++i) {
+      mat[i] = topDict.fontMatrix[i];
+    }
+  }
+}
+
+void FoFiType1C::convertToType1(char *psName, const char **newEncoding, GBool ascii,
+                               FoFiOutputFunc outputFunc,
+                               void *outputStream) {
+  int psNameLen;
+  Type1CEexecBuf eb;
+  Type1CIndex subrIdx;
+  Type1CIndexVal val;
+  GooString *buf;
+  char buf2[256];
+  const char **enc;
+  GBool ok;
+  int i;
+
+  if (psName) {
+    psNameLen = strlen(psName);
+  } else {
+    psName = name->getCString();
+    psNameLen = name->getLength();
+  }
+
+  // write header and font dictionary, up to encoding
+  ok = gTrue;
+  (*outputFunc)(outputStream, "%!FontType1-1.0: ", 17);
+  (*outputFunc)(outputStream, psName, psNameLen);
+  if (topDict.versionSID != 0) {
+    getString(topDict.versionSID, buf2, &ok);
+    (*outputFunc)(outputStream, buf2, strlen(buf2));
+  }
+  (*outputFunc)(outputStream, "\n", 1);
+  // the dictionary needs room for 12 entries: the following 9, plus
+  // Private and CharStrings (in the eexec section) and FID (which is
+  // added by definefont)
+  (*outputFunc)(outputStream, "12 dict begin\n", 14);
+  (*outputFunc)(outputStream, "/FontInfo 10 dict dup begin\n", 28);
+  if (topDict.versionSID != 0) {
+    (*outputFunc)(outputStream, "/version ", 9);
+    writePSString(buf2, outputFunc, outputStream);
+    (*outputFunc)(outputStream, " readonly def\n", 14);
+  }
+  if (topDict.noticeSID != 0) {
+    getString(topDict.noticeSID, buf2, &ok);
+    (*outputFunc)(outputStream, "/Notice ", 8);
+    writePSString(buf2, outputFunc, outputStream);
+    (*outputFunc)(outputStream, " readonly def\n", 14);
+  }
+  if (topDict.copyrightSID != 0) {
+    getString(topDict.copyrightSID, buf2, &ok);
+    (*outputFunc)(outputStream, "/Copyright ", 11);
+    writePSString(buf2, outputFunc, outputStream);
+    (*outputFunc)(outputStream, " readonly def\n", 14);
+  }
+  if (topDict.fullNameSID != 0) {
+    getString(topDict.fullNameSID, buf2, &ok);
+    (*outputFunc)(outputStream, "/FullName ", 10);
+    writePSString(buf2, outputFunc, outputStream);
+    (*outputFunc)(outputStream, " readonly def\n", 14);
+  }
+  if (topDict.familyNameSID != 0) {
+    getString(topDict.familyNameSID, buf2, &ok);
+    (*outputFunc)(outputStream, "/FamilyName ", 12);
+    writePSString(buf2, outputFunc, outputStream);
+    (*outputFunc)(outputStream, " readonly def\n", 14);
+  }
+  if (topDict.weightSID != 0) {
+    getString(topDict.weightSID, buf2, &ok);
+    (*outputFunc)(outputStream, "/Weight ", 8);
+    writePSString(buf2, outputFunc, outputStream);
+    (*outputFunc)(outputStream, " readonly def\n", 14);
+  }
+  if (topDict.isFixedPitch) {
+    (*outputFunc)(outputStream, "/isFixedPitch true def\n", 23);
+  } else {
+    (*outputFunc)(outputStream, "/isFixedPitch false def\n", 24);
+  }
+  buf = GooString::format("/ItalicAngle {0:.4g} def\n", topDict.italicAngle);
+  (*outputFunc)(outputStream, buf->getCString(), buf->getLength());
+  delete buf;
+  buf = GooString::format("/UnderlinePosition {0:.4g} def\n",
+                       topDict.underlinePosition);
+  (*outputFunc)(outputStream, buf->getCString(), buf->getLength());
+  delete buf;
+  buf = GooString::format("/UnderlineThickness {0:.4g} def\n",
+                       topDict.underlineThickness);
+  (*outputFunc)(outputStream, buf->getCString(), buf->getLength());
+  delete buf;
+  (*outputFunc)(outputStream, "end readonly def\n", 17);
+  (*outputFunc)(outputStream, "/FontName /", 11);
+  (*outputFunc)(outputStream, psName, psNameLen);
+  (*outputFunc)(outputStream, " def\n", 5);
+  buf = GooString::format("/PaintType {0:d} def\n", topDict.paintType);
+  (*outputFunc)(outputStream, buf->getCString(), buf->getLength());
+  delete buf;
+  (*outputFunc)(outputStream, "/FontType 1 def\n", 16);
+  buf = GooString::format("/FontMatrix [{0:.8g} {1:.8g} {2:.8g} {3:.8g} {4:.8g} {5:.8g}] readonly def\n",
+                       topDict.fontMatrix[0], topDict.fontMatrix[1],
+                       topDict.fontMatrix[2], topDict.fontMatrix[3],
+                       topDict.fontMatrix[4], topDict.fontMatrix[5]);
+  (*outputFunc)(outputStream, buf->getCString(), buf->getLength());
+  delete buf;
+  buf = GooString::format("/FontBBox [{0:.4g} {1:.4g} {2:.4g} {3:.4g}] readonly def\n",
+                       topDict.fontBBox[0], topDict.fontBBox[1],
+                       topDict.fontBBox[2], topDict.fontBBox[3]);
+  (*outputFunc)(outputStream, buf->getCString(), buf->getLength());
+  delete buf;
+  buf = GooString::format("/StrokeWidth {0:.4g} def\n", topDict.strokeWidth);
+  (*outputFunc)(outputStream, buf->getCString(), buf->getLength());
+  delete buf;
+  if (topDict.uniqueID != 0) {
+    buf = GooString::format("/UniqueID {0:d} def\n", topDict.uniqueID);
+    (*outputFunc)(outputStream, buf->getCString(), buf->getLength());
+    delete buf;
+  }
+
+  // write the encoding
+  (*outputFunc)(outputStream, "/Encoding ", 10);
+  if (!newEncoding && encoding == fofiType1StandardEncoding) {
+    (*outputFunc)(outputStream, "StandardEncoding def\n", 21);
+  } else {
+    (*outputFunc)(outputStream, "256 array\n", 10);
+    (*outputFunc)(outputStream,
+                 "0 1 255 {1 index exch /.notdef put} for\n", 40);
+    enc = newEncoding ? newEncoding : (const char **)encoding;
+    for (i = 0; i < 256; ++i) {
+      if (enc[i]) {
+       buf = GooString::format("dup {0:d} /{1:s} put\n", i, enc[i]);
+       (*outputFunc)(outputStream, buf->getCString(), buf->getLength());
+       delete buf;
+      }
+    }
+    (*outputFunc)(outputStream, "readonly def\n", 13);
+  }
+  (*outputFunc)(outputStream, "currentdict end\n", 16);
+
+  // start the binary section
+  (*outputFunc)(outputStream, "currentfile eexec\n", 18);
+  eb.outputFunc = outputFunc;
+  eb.outputStream = outputStream;
+  eb.ascii = ascii;
+  eb.r1 = 55665;
+  eb.line = 0;
+
+  // write the private dictionary
+  eexecWrite(&eb, "\x83\xca\x73\xd5");
+  eexecWrite(&eb, "dup /Private 32 dict dup begin\n");
+  eexecWrite(&eb, "/RD {string currentfile exch readstring pop}"
+            " executeonly def\n");
+  eexecWrite(&eb, "/ND {noaccess def} executeonly def\n");
+  eexecWrite(&eb, "/NP {noaccess put} executeonly def\n");
+  eexecWrite(&eb, "/MinFeature {16 16} def\n");
+  eexecWrite(&eb, "/password 5839 def\n");
+  if (privateDicts[0].nBlueValues) {
+    eexecWrite(&eb, "/BlueValues [");
+    for (i = 0; i < privateDicts[0].nBlueValues; ++i) {
+      buf = GooString::format("{0:s}{1:d}",
+                           i > 0 ? " " : "", privateDicts[0].blueValues[i]);
+      eexecWrite(&eb, buf->getCString());
+      delete buf;
+    }
+    eexecWrite(&eb, "] def\n");
+  }
+  if (privateDicts[0].nOtherBlues) {
+    eexecWrite(&eb, "/OtherBlues [");
+    for (i = 0; i < privateDicts[0].nOtherBlues; ++i) {
+      buf = GooString::format("{0:s}{1:d}",
+                           i > 0 ? " " : "", privateDicts[0].otherBlues[i]);
+      eexecWrite(&eb, buf->getCString());
+      delete buf;
+    }
+    eexecWrite(&eb, "] def\n");
+  }
+  if (privateDicts[0].nFamilyBlues) {
+    eexecWrite(&eb, "/FamilyBlues [");
+    for (i = 0; i < privateDicts[0].nFamilyBlues; ++i) {
+      buf = GooString::format("{0:s}{1:d}",
+                           i > 0 ? " " : "", privateDicts[0].familyBlues[i]);
+      eexecWrite(&eb, buf->getCString());
+      delete buf;
+    }
+    eexecWrite(&eb, "] def\n");
+  }
+  if (privateDicts[0].nFamilyOtherBlues) {
+    eexecWrite(&eb, "/FamilyOtherBlues [");
+    for (i = 0; i < privateDicts[0].nFamilyOtherBlues; ++i) {
+      buf = GooString::format("{0:s}{1:d}", i > 0 ? " " : "",
+                           privateDicts[0].familyOtherBlues[i]);
+      eexecWrite(&eb, buf->getCString());
+      delete buf;
+    }
+    eexecWrite(&eb, "] def\n");
+  }
+  if (privateDicts[0].blueScale != 0.039625) {
+    buf = GooString::format("/BlueScale {0:.4g} def\n",
+                         privateDicts[0].blueScale);
+    eexecWrite(&eb, buf->getCString());
+    delete buf;
+  }
+  if (privateDicts[0].blueShift != 7) {
+    buf = GooString::format("/BlueShift {0:d} def\n", privateDicts[0].blueShift);
+    eexecWrite(&eb, buf->getCString());
+    delete buf;
+  }
+  if (privateDicts[0].blueFuzz != 1) {
+    buf = GooString::format("/BlueFuzz {0:d} def\n", privateDicts[0].blueFuzz);
+    eexecWrite(&eb, buf->getCString());
+    delete buf;
+  }
+  if (privateDicts[0].hasStdHW) {
+    buf = GooString::format("/StdHW [{0:.4g}] def\n", privateDicts[0].stdHW);
+    eexecWrite(&eb, buf->getCString());
+    delete buf;
+  }
+  if (privateDicts[0].hasStdVW) {
+    buf = GooString::format("/StdVW [{0:.4g}] def\n", privateDicts[0].stdVW);
+    eexecWrite(&eb, buf->getCString());
+    delete buf;
+  }
+  if (privateDicts[0].nStemSnapH) {
+    eexecWrite(&eb, "/StemSnapH [");
+    for (i = 0; i < privateDicts[0].nStemSnapH; ++i) {
+      buf = GooString::format("{0:s}{1:.4g}",
+                           i > 0 ? " " : "", privateDicts[0].stemSnapH[i]);
+      eexecWrite(&eb, buf->getCString());
+      delete buf;
+    }
+    eexecWrite(&eb, "] def\n");
+  }
+  if (privateDicts[0].nStemSnapV) {
+    eexecWrite(&eb, "/StemSnapV [");
+    for (i = 0; i < privateDicts[0].nStemSnapV; ++i) {
+      buf = GooString::format("{0:s}{1:.4g}",
+                           i > 0 ? " " : "", privateDicts[0].stemSnapV[i]);
+      eexecWrite(&eb, buf->getCString());
+      delete buf;
+    }
+    eexecWrite(&eb, "] def\n");
+  }
+  if (privateDicts[0].hasForceBold) {
+    buf = GooString::format("/ForceBold {0:s} def\n",
+                         privateDicts[0].forceBold ? "true" : "false");
+    eexecWrite(&eb, buf->getCString());
+    delete buf;
+  }
+  if (privateDicts[0].forceBoldThreshold != 0) {
+    buf = GooString::format("/ForceBoldThreshold {0:.4g} def\n",
+                         privateDicts[0].forceBoldThreshold);
+    eexecWrite(&eb, buf->getCString());
+    delete buf;
+  }
+  if (privateDicts[0].languageGroup != 0) {
+    buf = GooString::format("/LanguageGroup {0:d} def\n",
+                         privateDicts[0].languageGroup);
+    eexecWrite(&eb, buf->getCString());
+    delete buf;
+  }
+  if (privateDicts[0].expansionFactor != 0.06) {
+    buf = GooString::format("/ExpansionFactor {0:.4g} def\n",
+                         privateDicts[0].expansionFactor);
+    eexecWrite(&eb, buf->getCString());
+    delete buf;
+  }
+
+  // set up subroutines
+  ok = gTrue;
+  getIndex(privateDicts[0].subrsOffset, &subrIdx, &ok);
+  if (!ok) {
+    subrIdx.pos = -1;
+  }
+
+  // write the CharStrings
+  buf = GooString::format("2 index /CharStrings {0:d} dict dup begin\n",
+                       nGlyphs);
+  eexecWrite(&eb, buf->getCString());
+  delete buf;
+  for (i = 0; i < nGlyphs; ++i) {
+    ok = gTrue;
+    getIndexVal(&charStringsIdx, i, &val, &ok);
+    if (ok && i < charsetLength) {
+      getString(charset[i], buf2, &ok);
+      if (ok) {
+       eexecCvtGlyph(&eb, buf2, val.pos, val.len, &subrIdx, &privateDicts[0]);
+      }
+    }
+  }
+  eexecWrite(&eb, "end\n");
+  eexecWrite(&eb, "end\n");
+  eexecWrite(&eb, "readonly put\n");
+  eexecWrite(&eb, "noaccess put\n");
+  eexecWrite(&eb, "dup /FontName get exch definefont pop\n");
+  eexecWrite(&eb, "mark currentfile closefile\n");
+
+  // trailer
+  if (ascii && eb.line > 0) {
+    (*outputFunc)(outputStream, "\n", 1);
+  }
+  for (i = 0; i < 8; ++i) {
+    (*outputFunc)(outputStream, "0000000000000000000000000000000000000000000000000000000000000000\n", 65);
+  }
+  (*outputFunc)(outputStream, "cleartomark\n", 12);
+}
+
+void FoFiType1C::convertToCIDType0(char *psName, int *codeMap, int nCodes,
+                                  FoFiOutputFunc outputFunc,
+                                  void *outputStream) {
+  int *cidMap;
+  GooString *charStrings;
+  int *charStringOffsets;
+  Type1CIndex subrIdx;
+  Type1CIndexVal val;
+  int nCIDs, gdBytes;
+  GooString *buf;
+  char buf2[256];
+  GBool ok;
+  int gid, offset, n, i, j, k;
+
+  // compute the CID count and build the CID-to-GID mapping
+  if (codeMap) {
+    nCIDs = nCodes;
+    cidMap = (int *)gmallocn(nCIDs, sizeof(int));
+    for (i = 0; i < nCodes; ++i) {
+      if (codeMap[i] >= 0 && codeMap[i] < nGlyphs) {
+       cidMap[i] = codeMap[i];
+      } else {
+       cidMap[i] = -1;
+      }
+    }
+  } else if (topDict.firstOp == 0x0c1e) {
+    nCIDs = 0;
+    for (i = 0; i < nGlyphs && i < charsetLength; ++i) {
+      if (charset[i] >= nCIDs) {
+       nCIDs = charset[i] + 1;
+      }
+    }
+    cidMap = (int *)gmallocn(nCIDs, sizeof(int));
+    for (i = 0; i < nCIDs; ++i) {
+      cidMap[i] = -1;
+    }
+    for (i = 0; i < nGlyphs && i < charsetLength; ++i) {
+      cidMap[charset[i]] = i;
+    }
+  } else {
+    nCIDs = nGlyphs;
+    cidMap = (int *)gmallocn(nCIDs, sizeof(int));
+    for (i = 0; i < nCIDs; ++i) {
+      cidMap[i] = i;
+    }
+  }
+
+  // build the charstrings
+  charStrings = new GooString();
+  charStringOffsets = (int *)gmallocn(nCIDs + 1, sizeof(int));
+  for (i = 0; i < nCIDs; ++i) {
+    charStringOffsets[i] = charStrings->getLength();
+    if ((gid = cidMap[i]) >= 0) {
+      ok = gTrue;
+      getIndexVal(&charStringsIdx, gid, &val, &ok);
+      if (ok) {
+       getIndex(privateDicts[fdSelect ? fdSelect[gid] : 0].subrsOffset,
+                &subrIdx, &ok);
+       if (!ok) {
+         subrIdx.pos = -1;
+       }
+       cvtGlyph(val.pos, val.len, charStrings,
+                &subrIdx, &privateDicts[fdSelect ? fdSelect[gid] : 0], gTrue);
+      }
+    }
+  }
+  charStringOffsets[nCIDs] = charStrings->getLength();
+
+  // compute gdBytes = number of bytes needed for charstring offsets
+  // (offset size needs to account for the charstring offset table,
+  // with a worst case of five bytes per entry, plus the charstrings
+  // themselves)
+  i = (nCIDs + 1) * 5 + charStrings->getLength();
+  if (i < 0x100) {
+    gdBytes = 1;
+  } else if (i < 0x10000) {
+    gdBytes = 2;
+  } else if (i < 0x1000000) {
+    gdBytes = 3;
+  } else {
+    gdBytes = 4;
+  }
+
+  // begin the font dictionary
+  (*outputFunc)(outputStream, "/CIDInit /ProcSet findresource begin\n", 37);
+  (*outputFunc)(outputStream, "20 dict begin\n", 14);
+  (*outputFunc)(outputStream, "/CIDFontName /", 14);
+  (*outputFunc)(outputStream, psName, strlen(psName));
+  (*outputFunc)(outputStream, " def\n", 5);
+  (*outputFunc)(outputStream, "/CIDFontType 0 def\n", 19);
+  (*outputFunc)(outputStream, "/CIDSystemInfo 3 dict dup begin\n", 32);
+  if (topDict.registrySID > 0 && topDict.orderingSID > 0) {
+    ok = gTrue;
+    getString(topDict.registrySID, buf2, &ok);
+    if (ok) {
+      (*outputFunc)(outputStream, "  /Registry (", 13);
+      (*outputFunc)(outputStream, buf2, strlen(buf2));
+      (*outputFunc)(outputStream, ") def\n", 6);
+    }
+    ok = gTrue;
+    getString(topDict.orderingSID, buf2, &ok);
+    if (ok) {
+      (*outputFunc)(outputStream, "  /Ordering (", 13);
+      (*outputFunc)(outputStream, buf2, strlen(buf2));
+      (*outputFunc)(outputStream, ") def\n", 6);
+    }
+  } else {
+    (*outputFunc)(outputStream, "  /Registry (Adobe) def\n", 24);
+    (*outputFunc)(outputStream, "  /Ordering (Identity) def\n", 27);
+  }
+  buf = GooString::format("  /Supplement {0:d} def\n", topDict.supplement);
+  (*outputFunc)(outputStream, buf->getCString(), buf->getLength());
+  delete buf;
+  (*outputFunc)(outputStream, "end def\n", 8);
+  if (topDict.hasFontMatrix) {
+    buf = GooString::format("/FontMatrix [{0:.8g} {1:.8g} {2:.8g} {3:.8g} {4:.8g} {5:.8g}] def\n",
+                         topDict.fontMatrix[0], topDict.fontMatrix[1],
+                         topDict.fontMatrix[2], topDict.fontMatrix[3],
+                         topDict.fontMatrix[4], topDict.fontMatrix[5]);
+    (*outputFunc)(outputStream, buf->getCString(), buf->getLength());
+    delete buf;
+  } else if (privateDicts[0].hasFontMatrix) {
+    (*outputFunc)(outputStream, "/FontMatrix [1 0 0 1 0 0] def\n", 30);
+  } else {
+    (*outputFunc)(outputStream,
+                 "/FontMatrix [0.001 0 0 0.001 0 0] def\n", 38);
+  }
+  buf = GooString::format("/FontBBox [{0:.4g} {1:.4g} {2:.4g} {3:.4g}] def\n",
+                       topDict.fontBBox[0], topDict.fontBBox[1],
+                       topDict.fontBBox[2], topDict.fontBBox[3]);
+  (*outputFunc)(outputStream, buf->getCString(), buf->getLength());
+  delete buf;
+  (*outputFunc)(outputStream, "/FontInfo 1 dict dup begin\n", 27);
+  (*outputFunc)(outputStream, "  /FSType 8 def\n", 16);
+  (*outputFunc)(outputStream, "end def\n", 8);
+
+  // CIDFont-specific entries
+  buf = GooString::format("/CIDCount {0:d} def\n", nCIDs);
+  (*outputFunc)(outputStream, buf->getCString(), buf->getLength());
+  delete buf;
+  (*outputFunc)(outputStream, "/FDBytes 1 def\n", 15);
+  buf = GooString::format("/GDBytes {0:d} def\n", gdBytes);
+  (*outputFunc)(outputStream, buf->getCString(), buf->getLength());
+  delete buf;
+  (*outputFunc)(outputStream, "/CIDMapOffset 0 def\n", 20);
+  if (topDict.paintType != 0) {
+    buf = GooString::format("/PaintType {0:d} def\n", topDict.paintType);
+    (*outputFunc)(outputStream, buf->getCString(), buf->getLength());
+    delete buf;
+    buf = GooString::format("/StrokeWidth {0:.4g} def\n", topDict.strokeWidth);
+    (*outputFunc)(outputStream, buf->getCString(), buf->getLength());
+    delete buf;
+  }
+
+  // FDArray entry
+  buf = GooString::format("/FDArray {0:d} array\n", nFDs);
+  (*outputFunc)(outputStream, buf->getCString(), buf->getLength());
+  delete buf;
+  for (i = 0; i < nFDs; ++i) {
+    buf = GooString::format("dup {0:d} 10 dict begin\n", i);
+    (*outputFunc)(outputStream, buf->getCString(), buf->getLength());
+    delete buf;
+    (*outputFunc)(outputStream, "/FontType 1 def\n", 16);
+    if (privateDicts[i].hasFontMatrix) {
+      buf = GooString::format("/FontMatrix [{0:.8g} {1:.8g} {2:.8g} {3:.8g} {4:.8g} {5:.8g}] def\n",
+                           privateDicts[i].fontMatrix[0],
+                           privateDicts[i].fontMatrix[1],
+                           privateDicts[i].fontMatrix[2],
+                           privateDicts[i].fontMatrix[3],
+                           privateDicts[i].fontMatrix[4],
+                           privateDicts[i].fontMatrix[5]);
+      (*outputFunc)(outputStream, buf->getCString(), buf->getLength());
+      delete buf;
+    } else {
+      (*outputFunc)(outputStream, "/FontMatrix [1 0 0 1 0 0] def\n", 30);
+    }
+    buf = GooString::format("/PaintType {0:d} def\n", topDict.paintType);
+    (*outputFunc)(outputStream, buf->getCString(), buf->getLength());
+    delete buf;
+    (*outputFunc)(outputStream, "/Private 32 dict begin\n", 23);
+    if (privateDicts[i].nBlueValues) {
+      (*outputFunc)(outputStream, "/BlueValues [", 13);
+      for (j = 0; j < privateDicts[i].nBlueValues; ++j) {
+       buf = GooString::format("{0:s}{1:d}",
+                             j > 0 ? " " : "", privateDicts[i].blueValues[j]);
+       (*outputFunc)(outputStream, buf->getCString(), buf->getLength());
+       delete buf;
+      }
+      (*outputFunc)(outputStream, "] def\n", 6);
+    }
+    if (privateDicts[i].nOtherBlues) {
+      (*outputFunc)(outputStream, "/OtherBlues [", 13);
+      for (j = 0; j < privateDicts[i].nOtherBlues; ++j) {
+       buf = GooString::format("{0:s}{1:d}",
+                             j > 0 ? " " : "", privateDicts[i].otherBlues[j]);
+       (*outputFunc)(outputStream, buf->getCString(), buf->getLength());
+       delete buf;
+      }
+      (*outputFunc)(outputStream, "] def\n", 6);
+    }
+    if (privateDicts[i].nFamilyBlues) {
+      (*outputFunc)(outputStream, "/FamilyBlues [", 14);
+      for (j = 0; j < privateDicts[i].nFamilyBlues; ++j) {
+       buf = GooString::format("{0:s}{1:d}",
+                             j > 0 ? " " : "",
+                             privateDicts[i].familyBlues[j]);
+       (*outputFunc)(outputStream, buf->getCString(), buf->getLength());
+       delete buf;
+      }
+      (*outputFunc)(outputStream, "] def\n", 6);
+    }
+    if (privateDicts[i].nFamilyOtherBlues) {
+      (*outputFunc)(outputStream, "/FamilyOtherBlues [", 19);
+      for (j = 0; j < privateDicts[i].nFamilyOtherBlues; ++j) {
+       buf = GooString::format("{0:s}{1:d}", j > 0 ? " " : "",
+                             privateDicts[i].familyOtherBlues[j]);
+       (*outputFunc)(outputStream, buf->getCString(), buf->getLength());
+       delete buf;
+      }
+      (*outputFunc)(outputStream, "] def\n", 6);
+    }
+    if (privateDicts[i].blueScale != 0.039625) {
+      buf = GooString::format("/BlueScale {0:.4g} def\n",
+                           privateDicts[i].blueScale);
+      (*outputFunc)(outputStream, buf->getCString(), buf->getLength());
+      delete buf;
+    }
+    if (privateDicts[i].blueShift != 7) {
+      buf = GooString::format("/BlueShift {0:d} def\n",
+                           privateDicts[i].blueShift);
+      (*outputFunc)(outputStream, buf->getCString(), buf->getLength());
+      delete buf;
+    }
+    if (privateDicts[i].blueFuzz != 1) {
+      buf = GooString::format("/BlueFuzz {0:d} def\n", privateDicts[i].blueFuzz);
+      (*outputFunc)(outputStream, buf->getCString(), buf->getLength());
+      delete buf;
+    }
+    if (privateDicts[i].hasStdHW) {
+      buf = GooString::format("/StdHW [{0:.4g}] def\n", privateDicts[i].stdHW);
+      (*outputFunc)(outputStream, buf->getCString(), buf->getLength());
+      delete buf;
+    }
+    if (privateDicts[i].hasStdVW) {
+      buf = GooString::format("/StdVW [{0:.4g}] def\n", privateDicts[i].stdVW);
+      (*outputFunc)(outputStream, buf->getCString(), buf->getLength());
+      delete buf;
+    }
+    if (privateDicts[i].nStemSnapH) {
+      (*outputFunc)(outputStream, "/StemSnapH [", 12);
+      for (j = 0; j < privateDicts[i].nStemSnapH; ++j) {
+       buf = GooString::format("{0:s}{1:.4g}",
+                             j > 0 ? " " : "", privateDicts[i].stemSnapH[j]);
+       (*outputFunc)(outputStream, buf->getCString(), buf->getLength());
+       delete buf;
+      }
+      (*outputFunc)(outputStream, "] def\n", 6);
+    }
+    if (privateDicts[i].nStemSnapV) {
+      (*outputFunc)(outputStream, "/StemSnapV [", 12);
+      for (j = 0; j < privateDicts[i].nStemSnapV; ++j) {
+       buf = GooString::format("{0:s}{1:.4g}",
+                             j > 0 ? " " : "", privateDicts[i].stemSnapV[j]);
+       (*outputFunc)(outputStream, buf->getCString(), buf->getLength());
+       delete buf;
+      }
+      (*outputFunc)(outputStream, "] def\n", 6);
+    }
+    if (privateDicts[i].hasForceBold) {
+      buf = GooString::format("/ForceBold {0:s} def\n",
+                           privateDicts[i].forceBold ? "true" : "false");
+      (*outputFunc)(outputStream, buf->getCString(), buf->getLength());
+      delete buf;
+    }
+    if (privateDicts[i].forceBoldThreshold != 0) {
+      buf = GooString::format("/ForceBoldThreshold {0:.4g} def\n",
+                           privateDicts[i].forceBoldThreshold);
+      (*outputFunc)(outputStream, buf->getCString(), buf->getLength());
+      delete buf;
+    }
+    if (privateDicts[i].languageGroup != 0) {
+      buf = GooString::format("/LanguageGroup {0:d} def\n",
+                           privateDicts[i].languageGroup);
+      (*outputFunc)(outputStream, buf->getCString(), buf->getLength());
+      delete buf;
+    }
+    if (privateDicts[i].expansionFactor != 0.06) {
+      buf = GooString::format("/ExpansionFactor {0:.4g} def\n",
+                           privateDicts[i].expansionFactor);
+      (*outputFunc)(outputStream, buf->getCString(), buf->getLength());
+      delete buf;
+    }
+    (*outputFunc)(outputStream, "currentdict end def\n", 20);
+    (*outputFunc)(outputStream, "currentdict end put\n", 20);
+  }
+  (*outputFunc)(outputStream, "def\n", 4);
+
+  // start the binary section
+  offset = (nCIDs + 1) * (1 + gdBytes);
+  buf = GooString::format("(Hex) {0:d} StartData\n",
+                       offset + charStrings->getLength());
+  (*outputFunc)(outputStream, buf->getCString(), buf->getLength());
+  delete buf;
+
+  // write the charstring offset (CIDMap) table
+  for (i = 0; i <= nCIDs; i += 6) {
+    for (j = 0; j < 6 && i+j <= nCIDs; ++j) {
+      if (i+j < nCIDs && cidMap[i+j] >= 0 && fdSelect) {
+       buf2[0] = (char)fdSelect[cidMap[i+j]];
+      } else {
+       buf2[0] = (char)0;
+      }
+      n = offset + charStringOffsets[i+j];
+      for (k = gdBytes; k >= 1; --k) {
+       buf2[k] = (char)(n & 0xff);
+       n >>= 8;
+      }
+      for (k = 0; k <= gdBytes; ++k) {
+       buf = GooString::format("{0:02x}", buf2[k] & 0xff);
+       (*outputFunc)(outputStream, buf->getCString(), buf->getLength());
+       delete buf;
+      }
+    }
+    (*outputFunc)(outputStream, "\n", 1);
+  }
+
+  // write the charstring data
+  n = charStrings->getLength();
+  for (i = 0; i < n; i += 32) {
+    for (j = 0; j < 32 && i+j < n; ++j) {
+      buf = GooString::format("{0:02x}", charStrings->getChar(i+j) & 0xff);
+      (*outputFunc)(outputStream, buf->getCString(), buf->getLength());
+      delete buf;
+    }
+    if (i + 32 >= n) {
+      (*outputFunc)(outputStream, ">", 1);
+    }
+    (*outputFunc)(outputStream, "\n", 1);
+  }
+
+  gfree(charStringOffsets);
+  delete charStrings;
+  gfree(cidMap);
+}
+
+void FoFiType1C::convertToType0(char *psName, int *codeMap, int nCodes,
+                               FoFiOutputFunc outputFunc,
+                               void *outputStream) {
+  int *cidMap;
+  Type1CIndex subrIdx;
+  Type1CIndexVal val;
+  int nCIDs;
+  GooString *buf;
+  Type1CEexecBuf eb;
+  GBool ok;
+  int fd, i, j, k;
+
+  // compute the CID count and build the CID-to-GID mapping
+  if (codeMap) {
+    nCIDs = nCodes;
+    cidMap = (int *)gmallocn(nCIDs, sizeof(int));
+    for (i = 0; i < nCodes; ++i) {
+      if (codeMap[i] >= 0 && codeMap[i] < nGlyphs) {
+       cidMap[i] = codeMap[i];
+      } else {
+       cidMap[i] = -1;
+      }
+    }
+  } else if (topDict.firstOp == 0x0c1e) {
+    nCIDs = 0;
+    for (i = 0; i < nGlyphs && i < charsetLength; ++i) {
+      if (charset[i] >= nCIDs) {
+       nCIDs = charset[i] + 1;
+      }
+    }
+    cidMap = (int *)gmallocn(nCIDs, sizeof(int));
+    for (i = 0; i < nCIDs; ++i) {
+      cidMap[i] = -1;
+    }
+    for (i = 0; i < nGlyphs && i < charsetLength; ++i) {
+      cidMap[charset[i]] = i;
+    }
+  } else {
+    nCIDs = nGlyphs;
+    cidMap = (int *)gmallocn(nCIDs, sizeof(int));
+    for (i = 0; i < nCIDs; ++i) {
+      cidMap[i] = i;
+    }
+  }
+
+  // write the descendant Type 1 fonts
+  for (i = 0; i < nCIDs; i += 256) {
+
+    //~ this assumes that all CIDs in this block have the same FD --
+    //~ to handle multiple FDs correctly, need to somehow divide the
+    //~ font up by FD; as a kludge we ignore CID 0, which is .notdef
+    fd = 0;
+    // if fdSelect is NULL, we have an 8-bit font, so just leave fd=0
+    if (fdSelect) {
+      for (j = i==0 ? 1 : 0; j < 256 && i+j < nCIDs; ++j) {
+        if (cidMap[i+j] >= 0) {
+          fd = fdSelect[cidMap[i+j]];
+          break;
+        }
+      }
+    }
+
+    // font dictionary (unencrypted section)
+    (*outputFunc)(outputStream, "16 dict begin\n", 14);
+    (*outputFunc)(outputStream, "/FontName /", 11);
+    (*outputFunc)(outputStream, psName, strlen(psName));
+    buf = GooString::format("_{0:02x} def\n", i >> 8);
+    (*outputFunc)(outputStream, buf->getCString(), buf->getLength());
+    delete buf;
+    (*outputFunc)(outputStream, "/FontType 1 def\n", 16);
+    if (privateDicts[fd].hasFontMatrix) {
+      buf = GooString::format("/FontMatrix [{0:.8g} {1:.8g} {2:.8g} {3:.8g} {4:.8g} {5:.8g}] def\n",
+                           privateDicts[fd].fontMatrix[0],
+                           privateDicts[fd].fontMatrix[1],
+                           privateDicts[fd].fontMatrix[2],
+                           privateDicts[fd].fontMatrix[3],
+                           privateDicts[fd].fontMatrix[4],
+                           privateDicts[fd].fontMatrix[5]);
+      (*outputFunc)(outputStream, buf->getCString(), buf->getLength());
+      delete buf;
+    } else if (topDict.hasFontMatrix) {
+      (*outputFunc)(outputStream, "/FontMatrix [1 0 0 1 0 0] def\n", 30);
+    } else {
+      (*outputFunc)(outputStream,
+                   "/FontMatrix [0.001 0 0 0.001 0 0] def\n", 38);
+    }
+    buf = GooString::format("/FontBBox [{0:.4g} {1:.4g} {2:.4g} {3:.4g}] def\n",
+                         topDict.fontBBox[0], topDict.fontBBox[1],
+                         topDict.fontBBox[2], topDict.fontBBox[3]);
+    (*outputFunc)(outputStream, buf->getCString(), buf->getLength());
+    delete buf;
+    buf = GooString::format("/PaintType {0:d} def\n", topDict.paintType);
+    (*outputFunc)(outputStream, buf->getCString(), buf->getLength());
+    delete buf;
+    if (topDict.paintType != 0) {
+      buf = GooString::format("/StrokeWidth {0:.4g} def\n", topDict.strokeWidth);
+      (*outputFunc)(outputStream, buf->getCString(), buf->getLength());
+      delete buf;
+    }
+    (*outputFunc)(outputStream, "/Encoding 256 array\n", 20);
+    for (j = 0; j < 256 && i+j < nCIDs; ++j) {
+      buf = GooString::format("dup {0:d} /c{1:02x} put\n", j, j);
+      (*outputFunc)(outputStream, buf->getCString(), buf->getLength());
+      delete buf;
+    }
+    if (j < 256) {
+      buf = GooString::format("{0:d} 1 255 {{ 1 index exch /.notdef put }} for\n",
+                           j);
+      (*outputFunc)(outputStream, buf->getCString(), buf->getLength());
+      delete buf;
+    }
+    (*outputFunc)(outputStream, "readonly def\n", 13);
+    (*outputFunc)(outputStream, "currentdict end\n", 16);
+
+    // start the binary section
+    (*outputFunc)(outputStream, "currentfile eexec\n", 18);
+    eb.outputFunc = outputFunc;
+    eb.outputStream = outputStream;
+    eb.ascii = gTrue;
+    eb.r1 = 55665;
+    eb.line = 0;
+
+    // start the private dictionary
+    eexecWrite(&eb, "\x83\xca\x73\xd5");
+    eexecWrite(&eb, "dup /Private 32 dict dup begin\n");
+    eexecWrite(&eb, "/RD {string currentfile exch readstring pop}"
+              " executeonly def\n");
+    eexecWrite(&eb, "/ND {noaccess def} executeonly def\n");
+    eexecWrite(&eb, "/NP {noaccess put} executeonly def\n");
+    eexecWrite(&eb, "/MinFeature {16 16} def\n");
+    eexecWrite(&eb, "/password 5839 def\n");
+    if (privateDicts[fd].nBlueValues) {
+      eexecWrite(&eb, "/BlueValues [");
+      for (k = 0; k < privateDicts[fd].nBlueValues; ++k) {
+       buf = GooString::format("{0:s}{1:d}",
+                             k > 0 ? " " : "",
+                             privateDicts[fd].blueValues[k]);
+       eexecWrite(&eb, buf->getCString());
+       delete buf;
+      }
+      eexecWrite(&eb, "] def\n");
+    }
+    if (privateDicts[fd].nOtherBlues) {
+      eexecWrite(&eb, "/OtherBlues [");
+      for (k = 0; k < privateDicts[fd].nOtherBlues; ++k) {
+       buf = GooString::format("{0:s}{1:d}",
+                             k > 0 ? " " : "",
+                             privateDicts[fd].otherBlues[k]);
+       eexecWrite(&eb, buf->getCString());
+       delete buf;
+      }
+      eexecWrite(&eb, "] def\n");
+    }
+    if (privateDicts[fd].nFamilyBlues) {
+      eexecWrite(&eb, "/FamilyBlues [");
+      for (k = 0; k < privateDicts[fd].nFamilyBlues; ++k) {
+       buf = GooString::format("{0:s}{1:d}", k > 0 ? " " : "",
+                             privateDicts[fd].familyBlues[k]);
+       eexecWrite(&eb, buf->getCString());
+       delete buf;
+      }
+      eexecWrite(&eb, "] def\n");
+    }
+    if (privateDicts[fd].nFamilyOtherBlues) {
+      eexecWrite(&eb, "/FamilyOtherBlues [");
+      for (k = 0; k < privateDicts[fd].nFamilyOtherBlues; ++k) {
+       buf = GooString::format("{0:s}{1:d}", k > 0 ? " " : "",
+                             privateDicts[fd].familyOtherBlues[k]);
+       eexecWrite(&eb, buf->getCString());
+       delete buf;
+      }
+      eexecWrite(&eb, "] def\n");
+    }
+    if (privateDicts[fd].blueScale != 0.039625) {
+      buf = GooString::format("/BlueScale {0:.4g} def\n",
+                           privateDicts[fd].blueScale);
+      eexecWrite(&eb, buf->getCString());
+      delete buf;
+    }
+    if (privateDicts[fd].blueShift != 7) {
+      buf = GooString::format("/BlueShift {0:d} def\n",
+                           privateDicts[fd].blueShift);
+      eexecWrite(&eb, buf->getCString());
+      delete buf;
+    }
+    if (privateDicts[fd].blueFuzz != 1) {
+      buf = GooString::format("/BlueFuzz {0:d} def\n",
+                           privateDicts[fd].blueFuzz);
+      eexecWrite(&eb, buf->getCString());
+      delete buf;
+    }
+    if (privateDicts[fd].hasStdHW) {
+      buf = GooString::format("/StdHW [{0:.4g}] def\n", privateDicts[fd].stdHW);
+      eexecWrite(&eb, buf->getCString());
+      delete buf;
+    }
+    if (privateDicts[fd].hasStdVW) {
+      buf = GooString::format("/StdVW [{0:.4g}] def\n", privateDicts[fd].stdVW);
+      eexecWrite(&eb, buf->getCString());
+      delete buf;
+    }
+    if (privateDicts[fd].nStemSnapH) {
+      eexecWrite(&eb, "/StemSnapH [");
+      for (k = 0; k < privateDicts[fd].nStemSnapH; ++k) {
+       buf = GooString::format("{0:s}{1:.4g}",
+                             k > 0 ? " " : "", privateDicts[fd].stemSnapH[k]);
+       eexecWrite(&eb, buf->getCString());
+       delete buf;
+      }
+      eexecWrite(&eb, "] def\n");
+    }
+    if (privateDicts[fd].nStemSnapV) {
+      eexecWrite(&eb, "/StemSnapV [");
+      for (k = 0; k < privateDicts[fd].nStemSnapV; ++k) {
+       buf = GooString::format("{0:s}{1:.4g}",
+                             k > 0 ? " " : "", privateDicts[fd].stemSnapV[k]);
+       eexecWrite(&eb, buf->getCString());
+       delete buf;
+      }
+      eexecWrite(&eb, "] def\n");
+    }
+    if (privateDicts[fd].hasForceBold) {
+      buf = GooString::format("/ForceBold {0:s} def\n",
+                           privateDicts[fd].forceBold ? "true" : "false");
+      eexecWrite(&eb, buf->getCString());
+      delete buf;
+    }
+    if (privateDicts[fd].forceBoldThreshold != 0) {
+      buf = GooString::format("/ForceBoldThreshold {0:.4g} def\n",
+                           privateDicts[fd].forceBoldThreshold);
+      eexecWrite(&eb, buf->getCString());
+      delete buf;
+    }
+    if (privateDicts[fd].languageGroup != 0) {
+      buf = GooString::format("/LanguageGroup {0:d} def\n",
+                           privateDicts[fd].languageGroup);
+      eexecWrite(&eb, buf->getCString());
+      delete buf;
+    }
+    if (privateDicts[fd].expansionFactor != 0.06) {
+      buf = GooString::format("/ExpansionFactor {0:.4g} def\n",
+                           privateDicts[fd].expansionFactor);
+      eexecWrite(&eb, buf->getCString());
+      delete buf;
+    }
+
+    // set up the subroutines
+    ok = gTrue;
+    getIndex(privateDicts[fd].subrsOffset, &subrIdx, &ok);
+    if (!ok) {
+      subrIdx.pos = -1;
+    }
+
+    // start the CharStrings
+    eexecWrite(&eb, "2 index /CharStrings 256 dict dup begin\n");
+
+    // write the .notdef CharString
+    ok = gTrue;
+    getIndexVal(&charStringsIdx, 0, &val, &ok);
+    if (ok) {
+      eexecCvtGlyph(&eb, ".notdef", val.pos, val.len,
+                   &subrIdx, &privateDicts[fd]);
+    }
+
+    // write the CharStrings
+    for (j = 0; j < 256 && i+j < nCIDs; ++j) {
+      if (cidMap[i+j] >= 0) {
+       ok = gTrue;
+       getIndexVal(&charStringsIdx, cidMap[i+j], &val, &ok);
+       if (ok) {
+         buf = GooString::format("c{0:02x}", j);
+         eexecCvtGlyph(&eb, buf->getCString(), val.pos, val.len,
+                       &subrIdx, &privateDicts[fd]);
+         delete buf;
+       }
+      }
+    }
+    eexecWrite(&eb, "end\n");
+    eexecWrite(&eb, "end\n");
+    eexecWrite(&eb, "readonly put\n");
+    eexecWrite(&eb, "noaccess put\n");
+    eexecWrite(&eb, "dup /FontName get exch definefont pop\n");
+    eexecWrite(&eb, "mark currentfile closefile\n");
+
+    // trailer
+    if (eb.line > 0) {
+      (*outputFunc)(outputStream, "\n", 1);
+    }
+    for (j = 0; j < 8; ++j) {
+      (*outputFunc)(outputStream, "0000000000000000000000000000000000000000000000000000000000000000\n", 65);
+    }
+    (*outputFunc)(outputStream, "cleartomark\n", 12);
+  }
+
+  // write the Type 0 parent font
+  (*outputFunc)(outputStream, "16 dict begin\n", 14);
+  (*outputFunc)(outputStream, "/FontName /", 11);
+  (*outputFunc)(outputStream, psName, strlen(psName));
+  (*outputFunc)(outputStream, " def\n", 5);
+  (*outputFunc)(outputStream, "/FontType 0 def\n", 16);
+  if (topDict.hasFontMatrix) {
+    buf = GooString::format("/FontMatrix [{0:.8g} {1:.8g} {2:.8g} {3:.8g} {4:.8g} {5:.8g}] def\n",
+                         topDict.fontMatrix[0], topDict.fontMatrix[1],
+                         topDict.fontMatrix[2], topDict.fontMatrix[3],
+                         topDict.fontMatrix[4], topDict.fontMatrix[5]);
+    (*outputFunc)(outputStream, buf->getCString(), buf->getLength());
+    delete buf;
+  } else {
+    (*outputFunc)(outputStream, "/FontMatrix [1 0 0 1 0 0] def\n", 30);
+  }
+  (*outputFunc)(outputStream, "/FMapType 2 def\n", 16);
+  (*outputFunc)(outputStream, "/Encoding [\n", 12);
+  for (i = 0; i < nCIDs; i += 256) {
+    buf = GooString::format("{0:d}\n", i >> 8);
+    (*outputFunc)(outputStream, buf->getCString(), buf->getLength());
+    delete buf;
+  }
+  (*outputFunc)(outputStream, "] def\n", 6);
+  (*outputFunc)(outputStream, "/FDepVector [\n", 14);
+  for (i = 0; i < nCIDs; i += 256) {
+    (*outputFunc)(outputStream, "/", 1);
+    (*outputFunc)(outputStream, psName, strlen(psName));
+    buf = GooString::format("_{0:02x} findfont\n", i >> 8);
+    (*outputFunc)(outputStream, buf->getCString(), buf->getLength());
+    delete buf;
+  }
+  (*outputFunc)(outputStream, "] def\n", 6);
+  (*outputFunc)(outputStream, "FontName currentdict end definefont pop\n", 40);
+
+  gfree(cidMap);
+}
+
+void FoFiType1C::eexecCvtGlyph(Type1CEexecBuf *eb, const char *glyphName,
+                              int offset, int nBytes,
+                              Type1CIndex *subrIdx,
+                              Type1CPrivateDict *pDict) {
+  GooString *buf;
+  GooString *charBuf;
+
+  // generate the charstring
+  charBuf = new GooString();
+  cvtGlyph(offset, nBytes, charBuf, subrIdx, pDict, gTrue);
+
+  buf = GooString::format("/{0:s} {1:d} RD ", glyphName, charBuf->getLength());
+  eexecWrite(eb, buf->getCString());
+  delete buf;
+  eexecWriteCharstring(eb, (Guchar *)charBuf->getCString(),
+                      charBuf->getLength());
+  eexecWrite(eb, " ND\n");
+
+  delete charBuf;
+}
+
+void FoFiType1C::cvtGlyph(int offset, int nBytes, GooString *charBuf,
+                         Type1CIndex *subrIdx, Type1CPrivateDict *pDict,
+                         GBool top) {
+  Type1CIndexVal val;
+  GBool ok, dFP;
+  double d, dx, dy;
+  Gushort r2;
+  Guchar byte;
+  int pos, subrBias, start, i, k;
+
+  start = charBuf->getLength();
+  if (top) {
+    charBuf->append((char)73);
+    charBuf->append((char)58);
+    charBuf->append((char)147);
+    charBuf->append((char)134);
+    nOps = 0;
+    nHints = 0;
+    firstOp = gTrue;
+    openPath = gFalse;
+  }
+
+  pos = offset;
+  while (pos < offset + nBytes) {
+    ok = gTrue;
+    pos = getOp(pos, gTrue, &ok);
+    if (!ok) {
+      break;
+    }
+    if (!ops[nOps - 1].isNum) {
+      --nOps; // drop the operator
+      switch (ops[nOps].op) {
+      case 0x0001:             // hstem
+       if (firstOp) {
+         cvtGlyphWidth(nOps & 1, charBuf, pDict);
+         firstOp = gFalse;
+       }
+       if (nOps & 1) {
+         //~ error(-1, "Wrong number of args (%d) to Type 2 hstem", nOps);
+       }
+       d = 0;
+       dFP = gFalse;
+       for (k = 0; k < nOps; k += 2) {
+         // convert Type 2 edge hints (-20 or -21) to Type 1 ghost hints
+         if (ops[k+1].num < 0) {
+           d += ops[k].num + ops[k+1].num;
+           dFP |= ops[k].isFP | ops[k+1].isFP;
+           cvtNum(d, dFP, charBuf);
+           cvtNum(-ops[k+1].num, ops[k+1].isFP, charBuf);
+         } else {
+           d += ops[k].num;
+           dFP |= ops[k].isFP;
+           cvtNum(d, dFP, charBuf);
+           cvtNum(ops[k+1].num, ops[k+1].isFP, charBuf);
+           d += ops[k+1].num;
+           dFP |= ops[k+1].isFP;
+         }
+         charBuf->append((char)1);
+       }
+       nHints += nOps / 2;
+       nOps = 0;
+       break;
+      case 0x0003:             // vstem
+       if (firstOp) {
+         cvtGlyphWidth(nOps & 1, charBuf, pDict);
+         firstOp = gFalse;
+       }
+       if (nOps & 1) {
+         //~ error(-1, "Wrong number of args (%d) to Type 2 vstem", nOps);
+       }
+       d = 0;
+       dFP = gFalse;
+       for (k = 0; k < nOps; k += 2) {
+         // convert Type 2 edge hints (-20 or -21) to Type 1 ghost hints
+         if (ops[k+1].num < 0) {
+           d += ops[k].num + ops[k+1].num;
+           dFP |= ops[k].isFP | ops[k+1].isFP;
+           cvtNum(d, dFP, charBuf);
+           cvtNum(-ops[k+1].num, ops[k+1].isFP, charBuf);
+         } else {
+           d += ops[k].num;
+           dFP |= ops[k].isFP;
+           cvtNum(d, dFP, charBuf);
+           cvtNum(ops[k+1].num, ops[k+1].isFP, charBuf);
+           d += ops[k+1].num;
+           dFP |= ops[k+1].isFP;
+         }
+         charBuf->append((char)3);
+       }
+       nHints += nOps / 2;
+       nOps = 0;
+       break;
+      case 0x0004:             // vmoveto
+       if (firstOp) {
+         cvtGlyphWidth(nOps == 2, charBuf, pDict);
+         firstOp = gFalse;
+       }
+       if (openPath) {
+         charBuf->append((char)9);
+         openPath = gFalse;
+       }
+       if (nOps != 1) {
+         //~ error(-1, "Wrong number of args (%d) to Type 2 vmoveto", nOps);
+       }
+       cvtNum(ops[0].num, ops[0].isFP, charBuf);
+       charBuf->append((char)4);
+       nOps = 0;
+       break;
+      case 0x0005:             // rlineto
+       if (nOps < 2 || nOps % 2 != 0) {
+         //~ error(-1, "Wrong number of args (%d) to Type 2 rlineto", nOps);
+       }
+       for (k = 0; k < nOps; k += 2) {
+         cvtNum(ops[k].num, ops[k].isFP, charBuf);
+         cvtNum(ops[k+1].num, ops[k+1].isFP, charBuf);
+         charBuf->append((char)5);
+       }
+       nOps = 0;
+       openPath = gTrue;
+       break;
+      case 0x0006:             // hlineto
+       if (nOps < 1) {
+         //~ error(-1, "Wrong number of args (%d) to Type 2 hlineto", nOps);
+       }
+       for (k = 0; k < nOps; ++k) {
+         cvtNum(ops[k].num, ops[k].isFP, charBuf);
+         charBuf->append((char)((k & 1) ? 7 : 6));
+       }
+       nOps = 0;
+       openPath = gTrue;
+       break;
+      case 0x0007:             // vlineto
+       if (nOps < 1) {
+         //~ error(-1, "Wrong number of args (%d) to Type 2 vlineto", nOps);
+       }
+       for (k = 0; k < nOps; ++k) {
+         cvtNum(ops[k].num, ops[k].isFP, charBuf);
+         charBuf->append((char)((k & 1) ? 6 : 7));
+       }
+       nOps = 0;
+       openPath = gTrue;
+       break;
+      case 0x0008:             // rrcurveto
+       if (nOps < 6 || nOps % 6 != 0) {
+         //~ error(-1, "Wrong number of args (%d) to Type 2 rrcurveto", nOps);
+       }
+       for (k = 0; k < nOps; k += 6) {
+         cvtNum(ops[k].num, ops[k].isFP, charBuf);
+         cvtNum(ops[k+1].num, ops[k+1].isFP, charBuf);
+         cvtNum(ops[k+2].num, ops[k+2].isFP, charBuf);
+         cvtNum(ops[k+3].num, ops[k+3].isFP, charBuf);
+         cvtNum(ops[k+4].num, ops[k+4].isFP, charBuf);
+         cvtNum(ops[k+5].num, ops[k+5].isFP, charBuf);
+         charBuf->append((char)8);
+       }
+       nOps = 0;
+       openPath = gTrue;
+       break;
+      case 0x000a:             // callsubr
+       if (nOps >= 1) {
+         subrBias = (subrIdx->len < 1240)
+                      ? 107 : (subrIdx->len < 33900) ? 1131 : 32768;
+         k = subrBias + (int)ops[nOps - 1].num;
+         --nOps;
+         ok = gTrue;
+         getIndexVal(subrIdx, k, &val, &ok);
+         if (ok) {
+           cvtGlyph(val.pos, val.len, charBuf, subrIdx, pDict, gFalse);
+         }
+       } else {
+         //~ error(-1, "Too few args to Type 2 callsubr");
+       }
+       // don't clear the stack
+       break;
+      case 0x000b:             // return
+       // don't clear the stack
+       break;
+      case 0x000e:             // endchar / seac
+       if (firstOp) {
+         cvtGlyphWidth(nOps == 1 || nOps == 5, charBuf, pDict);
+         firstOp = gFalse;
+       }
+       if (openPath) {
+         charBuf->append((char)9);
+         openPath = gFalse;
+       }
+       if (nOps == 4) {
+         cvtNum(0, gFalse, charBuf);
+         cvtNum(ops[0].num, ops[0].isFP, charBuf);
+         cvtNum(ops[1].num, ops[1].isFP, charBuf);
+         cvtNum(ops[2].num, ops[2].isFP, charBuf);
+         cvtNum(ops[3].num, ops[3].isFP, charBuf);
+         charBuf->append((char)12)->append((char)6);
+       } else if (nOps == 0) {
+         charBuf->append((char)14);
+       } else {
+         //~ error(-1, "Wrong number of args (%d) to Type 2 endchar", nOps);
+       }
+       nOps = 0;
+       break;
+      case 0x000f:             // (obsolete)
+       // this op is ignored, but we need the glyph width
+       if (firstOp) {
+         cvtGlyphWidth(nOps > 0, charBuf, pDict);
+         firstOp = gFalse;
+       }
+       nOps = 0;
+       break;
+      case 0x0010:             // blend
+       //~ error(-1, "Unimplemented Type 2 charstring op: %d", file[i]);
+       nOps = 0;
+       break;
+      case 0x0012:             // hstemhm
+       // ignored
+       if (firstOp) {
+         cvtGlyphWidth(nOps & 1, charBuf, pDict);
+         firstOp = gFalse;
+       }
+       if (nOps & 1) {
+         //~ error(-1, "Wrong number of args (%d) to Type 2 hstemhm", nOps);
+       }
+       nHints += nOps / 2;
+       nOps = 0;
+       break;
+      case 0x0013:             // hintmask
+       // ignored
+       if (firstOp) {
+         cvtGlyphWidth(nOps & 1, charBuf, pDict);
+         firstOp = gFalse;
+       }
+       if (nOps > 0) {
+         if (nOps & 1) {
+           //~ error(-1, "Wrong number of args (%d) to Type 2 hintmask/vstemhm",
+           //~       nOps);
+         }
+         nHints += nOps / 2;
+       }
+       pos += (nHints + 7) >> 3;
+       nOps = 0;
+       break;
+      case 0x0014:             // cntrmask
+       // ignored
+       if (firstOp) {
+         cvtGlyphWidth(nOps & 1, charBuf, pDict);
+         firstOp = gFalse;
+       }
+       if (nOps > 0) {
+         if (nOps & 1) {
+           //~ error(-1, "Wrong number of args (%d) to Type 2 cntrmask/vstemhm",
+           //~       nOps);
+         }
+         nHints += nOps / 2;
+       }
+       pos += (nHints + 7) >> 3;
+       nOps = 0;
+       break;
+      case 0x0015:             // rmoveto
+       if (firstOp) {
+         cvtGlyphWidth(nOps == 3, charBuf, pDict);
+         firstOp = gFalse;
+       }
+       if (openPath) {
+         charBuf->append((char)9);
+         openPath = gFalse;
+       }
+       if (nOps != 2) {
+         //~ error(-1, "Wrong number of args (%d) to Type 2 rmoveto", nOps);
+       }
+       cvtNum(ops[0].num, ops[0].isFP, charBuf);
+       cvtNum(ops[1].num, ops[1].isFP, charBuf);
+       charBuf->append((char)21);
+       nOps = 0;
+       break;
+      case 0x0016:             // hmoveto
+       if (firstOp) {
+         cvtGlyphWidth(nOps == 2, charBuf, pDict);
+         firstOp = gFalse;
+       }
+       if (openPath) {
+         charBuf->append((char)9);
+         openPath = gFalse;
+       }
+       if (nOps != 1) {
+         //~ error(-1, "Wrong number of args (%d) to Type 2 hmoveto", nOps);
+       }
+       cvtNum(ops[0].num, ops[0].isFP, charBuf);
+       charBuf->append((char)22);
+       nOps = 0;
+       break;
+      case 0x0017:             // vstemhm
+       // ignored
+       if (firstOp) {
+         cvtGlyphWidth(nOps & 1, charBuf, pDict);
+         firstOp = gFalse;
+       }
+       if (nOps & 1) {
+         //~ error(-1, "Wrong number of args (%d) to Type 2 vstemhm", nOps);
+       }
+       nHints += nOps / 2;
+       nOps = 0;
+       break;
+      case 0x0018:             // rcurveline
+       if (nOps < 8 || (nOps - 2) % 6 != 0) {
+         //~ error(-1, "Wrong number of args (%d) to Type 2 rcurveline", nOps);
+       }
+       for (k = 0; k < nOps - 2; k += 6) {
+         cvtNum(ops[k].num, ops[k].isFP, charBuf);
+         cvtNum(ops[k+1].num, ops[k+1].isFP, charBuf);
+         cvtNum(ops[k+2].num, ops[k+2].isFP, charBuf);
+         cvtNum(ops[k+3].num, ops[k+3].isFP, charBuf);
+         cvtNum(ops[k+4].num, ops[k+4].isFP, charBuf);
+         cvtNum(ops[k+5].num, ops[k+5].isFP, charBuf);
+         charBuf->append((char)8);
+       }
+       cvtNum(ops[k].num, ops[k].isFP, charBuf);
+       cvtNum(ops[k+1].num, ops[k].isFP, charBuf);
+       charBuf->append((char)5);
+       nOps = 0;
+       openPath = gTrue;
+       break;
+      case 0x0019:             // rlinecurve
+       if (nOps < 8 || (nOps - 6) % 2 != 0) {
+         //~ error(-1, "Wrong number of args (%d) to Type 2 rlinecurve", nOps);
+       }
+       for (k = 0; k < nOps - 6; k += 2) {
+         cvtNum(ops[k].num, ops[k].isFP, charBuf);
+         cvtNum(ops[k+1].num, ops[k].isFP, charBuf);
+         charBuf->append((char)5);
+       }
+       cvtNum(ops[k].num, ops[k].isFP, charBuf);
+       cvtNum(ops[k+1].num, ops[k+1].isFP, charBuf);
+       cvtNum(ops[k+2].num, ops[k+2].isFP, charBuf);
+       cvtNum(ops[k+3].num, ops[k+3].isFP, charBuf);
+       cvtNum(ops[k+4].num, ops[k+4].isFP, charBuf);
+       cvtNum(ops[k+5].num, ops[k+5].isFP, charBuf);
+       charBuf->append((char)8);
+       nOps = 0;
+       openPath = gTrue;
+       break;
+      case 0x001a:             // vvcurveto
+       if (nOps < 4 || !(nOps % 4 == 0 || (nOps-1) % 4 == 0)) {
+         //~ error(-1, "Wrong number of args (%d) to Type 2 vvcurveto", nOps);
+       }
+       if (nOps % 2 == 1) {
+         cvtNum(ops[0].num, ops[0].isFP, charBuf);
+         cvtNum(ops[1].num, ops[1].isFP, charBuf);
+         cvtNum(ops[2].num, ops[2].isFP, charBuf);
+         cvtNum(ops[3].num, ops[3].isFP, charBuf);
+         cvtNum(0, gFalse, charBuf);
+         cvtNum(ops[4].num, ops[4].isFP, charBuf);
+         charBuf->append((char)8);
+         k = 5;
+       } else {
+         k = 0;
+       }
+       for (; k < nOps; k += 4) {
+         cvtNum(0, gFalse, charBuf);
+         cvtNum(ops[k].num, ops[k].isFP, charBuf);
+         cvtNum(ops[k+1].num, ops[k+1].isFP, charBuf);
+         cvtNum(ops[k+2].num, ops[k+2].isFP, charBuf);
+         cvtNum(0, gFalse, charBuf);
+         cvtNum(ops[k+3].num, ops[k+3].isFP, charBuf);
+         charBuf->append((char)8);
+       }
+       nOps = 0;
+       openPath = gTrue;
+       break;
+      case 0x001b:             // hhcurveto
+       if (nOps < 4 || !(nOps % 4 == 0 || (nOps-1) % 4 == 0)) {
+         //~ error(-1, "Wrong number of args (%d) to Type 2 hhcurveto", nOps);
+       }
+       if (nOps % 2 == 1) {
+         cvtNum(ops[1].num, ops[1].isFP, charBuf);
+         cvtNum(ops[0].num, ops[0].isFP, charBuf);
+         cvtNum(ops[2].num, ops[2].isFP, charBuf);
+         cvtNum(ops[3].num, ops[3].isFP, charBuf);
+         cvtNum(ops[4].num, ops[4].isFP, charBuf);
+         cvtNum(0, gFalse, charBuf);
+         charBuf->append((char)8);
+         k = 5;
+       } else {
+         k = 0;
+       }
+       for (; k < nOps; k += 4) {
+         cvtNum(ops[k].num, ops[k].isFP, charBuf);
+         cvtNum(0, gFalse, charBuf);
+         cvtNum(ops[k+1].num, ops[k+1].isFP, charBuf);
+         cvtNum(ops[k+2].num, ops[k+2].isFP, charBuf);
+         cvtNum(ops[k+3].num, ops[k+3].isFP, charBuf);
+         cvtNum(0, gFalse, charBuf);
+         charBuf->append((char)8);
+       }
+       nOps = 0;
+       openPath = gTrue;
+       break;
+      case 0x001d:             // callgsubr
+       if (nOps >= 1) {
+         k = gsubrBias + (int)ops[nOps - 1].num;
+         --nOps;
+         ok = gTrue;
+         getIndexVal(&gsubrIdx, k, &val, &ok);
+         if (ok) {
+           cvtGlyph(val.pos, val.len, charBuf, subrIdx, pDict, gFalse);
+         }
+       } else {
+         //~ error(-1, "Too few args to Type 2 callgsubr");
+       }
+       // don't clear the stack
+       break;
+      case 0x001e:             // vhcurveto
+       if (nOps < 4 || !(nOps % 4 == 0 || (nOps-1) % 4 == 0)) {
+         //~ error(-1, "Wrong number of args (%d) to Type 2 vhcurveto", nOps);
+       }
+       for (k = 0; k < nOps && k != nOps-5; k += 4) {
+         if (k % 8 == 0) {
+           cvtNum(ops[k].num, ops[k].isFP, charBuf);
+           cvtNum(ops[k+1].num, ops[k+1].isFP, charBuf);
+           cvtNum(ops[k+2].num, ops[k+2].isFP, charBuf);
+           cvtNum(ops[k+3].num, ops[k+3].isFP, charBuf);
+           charBuf->append((char)30);
+         } else {
+           cvtNum(ops[k].num, ops[k].isFP, charBuf);
+           cvtNum(ops[k+1].num, ops[k+1].isFP, charBuf);
+           cvtNum(ops[k+2].num, ops[k+2].isFP, charBuf);
+           cvtNum(ops[k+3].num, ops[k+3].isFP, charBuf);
+           charBuf->append((char)31);
+         }
+       }
+       if (k == nOps-5) {
+         if (k % 8 == 0) {
+           cvtNum(0, gFalse, charBuf);
+           cvtNum(ops[k].num, ops[k].isFP, charBuf);
+           cvtNum(ops[k+1].num, ops[k+1].isFP, charBuf);
+           cvtNum(ops[k+2].num, ops[k+2].isFP, charBuf);
+           cvtNum(ops[k+3].num, ops[k+3].isFP, charBuf);
+           cvtNum(ops[k+4].num, ops[k+4].isFP, charBuf);
+         } else {
+           cvtNum(ops[k].num, ops[k].isFP, charBuf);
+           cvtNum(0, gFalse, charBuf);
+           cvtNum(ops[k+1].num, ops[k+1].isFP, charBuf);
+           cvtNum(ops[k+2].num, ops[k+2].isFP, charBuf);
+           cvtNum(ops[k+4].num, ops[k+4].isFP, charBuf);
+           cvtNum(ops[k+3].num, ops[k+3].isFP, charBuf);
+         }
+         charBuf->append((char)8);
+       }
+       nOps = 0;
+       openPath = gTrue;
+       break;
+      case 0x001f:             // hvcurveto
+       if (nOps < 4 || !(nOps % 4 == 0 || (nOps-1) % 4 == 0)) {
+         //~ error(-1, "Wrong number of args (%d) to Type 2 hvcurveto", nOps);
+       }
+       for (k = 0; k < nOps && k != nOps-5; k += 4) {
+         if (k % 8 == 0) {
+           cvtNum(ops[k].num, ops[k].isFP, charBuf);
+           cvtNum(ops[k+1].num, ops[k+1].isFP, charBuf);
+           cvtNum(ops[k+2].num, ops[k+2].isFP, charBuf);
+           cvtNum(ops[k+3].num, ops[k+3].isFP, charBuf);
+           charBuf->append((char)31);
+         } else {
+           cvtNum(ops[k].num, ops[k].isFP, charBuf);
+           cvtNum(ops[k+1].num, ops[k+1].isFP, charBuf);
+           cvtNum(ops[k+2].num, ops[k+2].isFP, charBuf);
+           cvtNum(ops[k+3].num, ops[k+3].isFP, charBuf);
+           charBuf->append((char)30);
+         }
+       }
+       if (k == nOps-5) {
+         if (k % 8 == 0) {
+           cvtNum(ops[k].num, ops[k].isFP, charBuf);
+           cvtNum(0, gFalse, charBuf);
+           cvtNum(ops[k+1].num, ops[k+1].isFP, charBuf);
+           cvtNum(ops[k+2].num, ops[k+2].isFP, charBuf);
+           cvtNum(ops[k+4].num, ops[k+4].isFP, charBuf);
+           cvtNum(ops[k+3].num, ops[k+3].isFP, charBuf);
+         } else {
+           cvtNum(0, gFalse, charBuf);
+           cvtNum(ops[k].num, ops[k].isFP, charBuf);
+           cvtNum(ops[k+1].num, ops[k+1].isFP, charBuf);
+           cvtNum(ops[k+2].num, ops[k+2].isFP, charBuf);
+           cvtNum(ops[k+3].num, ops[k+3].isFP, charBuf);
+           cvtNum(ops[k+4].num, ops[k+4].isFP, charBuf);
+         }
+         charBuf->append((char)8);
+       }
+       nOps = 0;
+       openPath = gTrue;
+       break;
+      case 0x0c00:             // dotsection (should be Type 1 only?)
+       // ignored
+       nOps = 0;
+       break;
+      case 0x0c03:             // and
+      case 0x0c04:             // or
+      case 0x0c05:             // not
+      case 0x0c08:             // store
+      case 0x0c09:             // abs
+      case 0x0c0a:             // add
+      case 0x0c0b:             // sub
+      case 0x0c0c:             // div
+      case 0x0c0d:             // load
+      case 0x0c0e:             // neg
+      case 0x0c0f:             // eq
+      case 0x0c12:             // drop
+      case 0x0c14:             // put
+      case 0x0c15:             // get
+      case 0x0c16:             // ifelse
+      case 0x0c17:             // random
+      case 0x0c18:             // mul
+      case 0x0c1a:             // sqrt
+      case 0x0c1b:             // dup
+      case 0x0c1c:             // exch
+      case 0x0c1d:             // index
+      case 0x0c1e:             // roll
+       //~ error(-1, "Unimplemented Type 2 charstring op: 12.%d", file[i+1]);
+       nOps = 0;
+       break;
+      case 0x0c22:             // hflex
+       if (nOps != 7) {
+         //~ error(-1, "Wrong number of args (%d) to Type 2 hflex", nOps);
+       }
+       cvtNum(ops[0].num, ops[0].isFP, charBuf);
+       cvtNum(0, gFalse, charBuf);
+       cvtNum(ops[1].num, ops[1].isFP, charBuf);
+       cvtNum(ops[2].num, ops[2].isFP, charBuf);
+       cvtNum(ops[3].num, ops[3].isFP, charBuf);
+       cvtNum(0, gFalse, charBuf);
+       charBuf->append((char)8);
+       cvtNum(ops[4].num, ops[4].isFP, charBuf);
+       cvtNum(0, gFalse, charBuf);
+       cvtNum(ops[5].num, ops[5].isFP, charBuf);
+       cvtNum(-ops[2].num, ops[2].isFP, charBuf);
+       cvtNum(ops[6].num, ops[6].isFP, charBuf);
+       cvtNum(0, gFalse, charBuf);
+       charBuf->append((char)8);
+       nOps = 0;
+       openPath = gTrue;
+       break;
+      case 0x0c23:             // flex
+       if (nOps != 13) {
+         //~ error(-1, "Wrong number of args (%d) to Type 2 flex", nOps);
+       }
+       cvtNum(ops[0].num, ops[0].isFP, charBuf);
+       cvtNum(ops[1].num, ops[1].isFP, charBuf);
+       cvtNum(ops[2].num, ops[2].isFP, charBuf);
+       cvtNum(ops[3].num, ops[3].isFP, charBuf);
+       cvtNum(ops[4].num, ops[4].isFP, charBuf);
+       cvtNum(ops[5].num, ops[5].isFP, charBuf);
+       charBuf->append((char)8);
+       cvtNum(ops[6].num, ops[6].isFP, charBuf);
+       cvtNum(ops[7].num, ops[7].isFP, charBuf);
+       cvtNum(ops[8].num, ops[8].isFP, charBuf);
+       cvtNum(ops[9].num, ops[9].isFP, charBuf);
+       cvtNum(ops[10].num, ops[10].isFP, charBuf);
+       cvtNum(ops[11].num, ops[11].isFP, charBuf);
+       charBuf->append((char)8);
+       nOps = 0;
+       openPath = gTrue;
+       break;
+      case 0x0c24:             // hflex1
+       if (nOps != 9) {
+         //~ error(-1, "Wrong number of args (%d) to Type 2 hflex1", nOps);
+       }
+       cvtNum(ops[0].num, ops[0].isFP, charBuf);
+       cvtNum(ops[1].num, ops[1].isFP, charBuf);
+       cvtNum(ops[2].num, ops[2].isFP, charBuf);
+       cvtNum(ops[3].num, ops[3].isFP, charBuf);
+       cvtNum(ops[4].num, ops[4].isFP, charBuf);
+       cvtNum(0, gFalse, charBuf);
+       charBuf->append((char)8);
+       cvtNum(ops[5].num, ops[5].isFP, charBuf);
+       cvtNum(0, gFalse, charBuf);
+       cvtNum(ops[6].num, ops[6].isFP, charBuf);
+       cvtNum(ops[7].num, ops[7].isFP, charBuf);
+       cvtNum(ops[8].num, ops[8].isFP, charBuf);
+       cvtNum(-(ops[1].num + ops[3].num + ops[7].num),
+              ops[1].isFP | ops[3].isFP | ops[7].isFP, charBuf);
+       charBuf->append((char)8);
+       nOps = 0;
+       openPath = gTrue;
+       break;
+      case 0x0c25:             // flex1
+       if (nOps != 11) {
+         //~ error(-1, "Wrong number of args (%d) to Type 2 flex1", nOps);
+       }
+       cvtNum(ops[0].num, ops[0].isFP, charBuf);
+       cvtNum(ops[1].num, ops[1].isFP, charBuf);
+       cvtNum(ops[2].num, ops[2].isFP, charBuf);
+       cvtNum(ops[3].num, ops[3].isFP, charBuf);
+       cvtNum(ops[4].num, ops[4].isFP, charBuf);
+       cvtNum(ops[5].num, ops[5].isFP, charBuf);
+       charBuf->append((char)8);
+       cvtNum(ops[6].num, ops[6].isFP, charBuf);
+       cvtNum(ops[7].num, ops[7].isFP, charBuf);
+       cvtNum(ops[8].num, ops[8].isFP, charBuf);
+       cvtNum(ops[9].num, ops[9].isFP, charBuf);
+       dx = ops[0].num + ops[2].num + ops[4].num + ops[6].num + ops[8].num;
+       dy = ops[1].num + ops[3].num + ops[5].num + ops[7].num + ops[9].num;
+       if (fabs(dx) > fabs(dy)) {
+         cvtNum(ops[10].num, ops[10].isFP, charBuf);
+         cvtNum(-dy, ops[1].isFP | ops[3].isFP | ops[5].isFP |
+                     ops[7].isFP | ops[9].isFP, charBuf);
+       } else {
+         cvtNum(-dx, ops[0].isFP | ops[2].isFP | ops[4].isFP |
+                     ops[6].isFP | ops[8].isFP, charBuf);
+         cvtNum(ops[10].num, ops[10].isFP, charBuf);
+       }
+       charBuf->append((char)8);
+       nOps = 0;
+       openPath = gTrue;
+       break;
+      default:
+       //~ error(-1, "Illegal Type 2 charstring op: %04x",
+       //~       ops[nOps].op);
+       nOps = 0;
+       break;
+      }
+    }
+  }
+
+  // charstring encryption
+  if (top) {
+    r2 = 4330;
+    for (i = start; i < charBuf->getLength(); ++i) {
+      byte = charBuf->getChar(i) ^ (r2 >> 8);
+      charBuf->setChar(i, byte);
+      r2 = (byte + r2) * 52845 + 22719;
+    }
+  }
+}
+
+void FoFiType1C::cvtGlyphWidth(GBool useOp, GooString *charBuf,
+                              Type1CPrivateDict *pDict) {
+  double w;
+  GBool wFP;
+  int i;
+
+  if (useOp) {
+    w = pDict->nominalWidthX + ops[0].num;
+    wFP = pDict->nominalWidthXFP | ops[0].isFP;
+    for (i = 1; i < nOps; ++i) {
+      ops[i-1] = ops[i];
+    }
+    --nOps;
+  } else {
+    w = pDict->defaultWidthX;
+    wFP = pDict->defaultWidthXFP;
+  }
+  cvtNum(0, gFalse, charBuf);
+  cvtNum(w, wFP, charBuf);
+  charBuf->append((char)13);
+}
+
+void FoFiType1C::cvtNum(double x, GBool isFP, GooString *charBuf) {
+  Guchar buf[12];
+  int y, n;
+
+  n = 0;
+  if (isFP) {
+    if (x >= -32768 && x < 32768) {
+      y = (int)(x * 256.0);
+      buf[0] = 255;
+      buf[1] = (Guchar)(y >> 24);
+      buf[2] = (Guchar)(y >> 16);
+      buf[3] = (Guchar)(y >> 8);
+      buf[4] = (Guchar)y;
+      buf[5] = 255;
+      buf[6] = 0;
+      buf[7] = 0;
+      buf[8] = 1;
+      buf[9] = 0;
+      buf[10] = 12;
+      buf[11] = 12;
+      n = 12;
+    } else {
+      //~ error(-1, "Type 2 fixed point constant out of range");
+    }
+  } else {
+    y = (int)x;
+    if (y >= -107 && y <= 107) {
+      buf[0] = (Guchar)(y + 139);
+      n = 1;
+    } else if (y > 107 && y <= 1131) {
+      y -= 108;
+      buf[0] = (Guchar)((y >> 8) + 247);
+      buf[1] = (Guchar)(y & 0xff);
+      n = 2;
+    } else if (y < -107 && y >= -1131) {
+      y = -y - 108;
+      buf[0] = (Guchar)((y >> 8) + 251);
+      buf[1] = (Guchar)(y & 0xff);
+      n = 2;
+    } else {
+      buf[0] = 255;
+      buf[1] = (Guchar)(y >> 24);
+      buf[2] = (Guchar)(y >> 16);
+      buf[3] = (Guchar)(y >> 8);
+      buf[4] = (Guchar)y;
+      n = 5;
+    }
+  }
+  charBuf->append((char *)buf, n);
+}
+
+void FoFiType1C::eexecWrite(Type1CEexecBuf *eb, const char *s) {
+  Guchar *p;
+  Guchar x;
+
+  for (p = (Guchar *)s; *p; ++p) {
+    x = *p ^ (eb->r1 >> 8);
+    eb->r1 = (x + eb->r1) * 52845 + 22719;
+    if (eb->ascii) {
+      (*eb->outputFunc)(eb->outputStream, &hexChars[x >> 4], 1);
+      (*eb->outputFunc)(eb->outputStream, &hexChars[x & 0x0f], 1);
+      eb->line += 2;
+      if (eb->line == 64) {
+       (*eb->outputFunc)(eb->outputStream, "\n", 1);
+       eb->line = 0;
+      }
+    } else {
+      (*eb->outputFunc)(eb->outputStream, (char *)&x, 1);
+    }
+  }
+}
+
+void FoFiType1C::eexecWriteCharstring(Type1CEexecBuf *eb,
+                                     Guchar *s, int n) {
+  Guchar x;
+  int i;
+
+  // eexec encryption
+  for (i = 0; i < n; ++i) {
+    x = s[i] ^ (eb->r1 >> 8);
+    eb->r1 = (x + eb->r1) * 52845 + 22719;
+    if (eb->ascii) {
+      (*eb->outputFunc)(eb->outputStream, &hexChars[x >> 4], 1);
+      (*eb->outputFunc)(eb->outputStream, &hexChars[x & 0x0f], 1);
+      eb->line += 2;
+      if (eb->line == 64) {
+       (*eb->outputFunc)(eb->outputStream, "\n", 1);
+       eb->line = 0;
+      }
+    } else {
+      (*eb->outputFunc)(eb->outputStream, (char *)&x, 1);
+    }
+  }
+}
+
+void FoFiType1C::writePSString(char *s, FoFiOutputFunc outputFunc,
+                              void *outputStream) {
+  char buf[80];
+  char *p;
+  int i, c;
+
+  i = 0;
+  buf[i++] = '(';
+  for (p = s; *p; ++p) {
+    c = *p & 0xff;
+    if (c == '(' || c == ')' || c == '\\') {
+      buf[i++] = '\\';
+      buf[i++] = c;
+    } else if (c < 0x20 || c >= 0x80) {
+      buf[i++] = '\\';
+      buf[i++] = '0' + ((c >> 6) & 7);
+      buf[i++] = '0' + ((c >> 3) & 7);
+      buf[i++] = '0' + (c & 7);
+    } else {
+      buf[i++] = c;
+    }
+    if (i >= 64) {
+      buf[i++] = '\\';
+      buf[i++] = '\n';
+      (*outputFunc)(outputStream, buf, i);
+      i = 0;
+    }
+  }
+  buf[i++] = ')';
+  (*outputFunc)(outputStream, buf, i);
+}
+
+GBool FoFiType1C::parse() {
+  Type1CIndex fdIdx;
+  Type1CIndexVal val;
+  int i;
+
+  parsedOk = gTrue;
+
+  // some tools embed Type 1C fonts with an extra whitespace char at
+  // the beginning
+  if (len > 0 && file[0] != '\x01') {
+    ++file;
+    --len;
+  }
+
+  // find the indexes
+  getIndex(getU8(2, &parsedOk), &nameIdx, &parsedOk);
+  getIndex(nameIdx.endPos, &topDictIdx, &parsedOk);
+  getIndex(topDictIdx.endPos, &stringIdx, &parsedOk);
+  getIndex(stringIdx.endPos, &gsubrIdx, &parsedOk);
+  if (!parsedOk) {
+    return gFalse;
+  }
+  gsubrBias = (gsubrIdx.len < 1240) ? 107
+                                    : (gsubrIdx.len < 33900) ? 1131 : 32768;
+
+  // read the first font name
+  getIndexVal(&nameIdx, 0, &val, &parsedOk);
+  if (!parsedOk) {
+    return gFalse;
+  }
+  name = new GooString((char *)&file[val.pos], val.len);
+
+  // read the top dict for the first font
+  readTopDict();
+
+  // for CID fonts: read the FDArray dicts and private dicts
+  if (topDict.firstOp == 0x0c1e) {
+    if (topDict.fdArrayOffset == 0) {
+      nFDs = 1;
+      privateDicts = (Type1CPrivateDict *)gmalloc(sizeof(Type1CPrivateDict));
+      readPrivateDict(0, 0, &privateDicts[0]);
+    } else {
+      getIndex(topDict.fdArrayOffset, &fdIdx, &parsedOk);
+      if (!parsedOk) {
+       return gFalse;
+      }
+      nFDs = fdIdx.len;
+      privateDicts = (Type1CPrivateDict *)
+                        gmallocn(nFDs, sizeof(Type1CPrivateDict));
+      for (i = 0; i < nFDs; ++i) {
+       getIndexVal(&fdIdx, i, &val, &parsedOk);
+       if (!parsedOk) {
+         return gFalse;
+       }
+       readFD(val.pos, val.len, &privateDicts[i]);
+      }
+    }
+
+  // for 8-bit fonts: read the private dict
+  } else {
+    nFDs = 1;
+    privateDicts = (Type1CPrivateDict *)gmalloc(sizeof(Type1CPrivateDict));
+    readPrivateDict(topDict.privateOffset, topDict.privateSize,
+                   &privateDicts[0]);
+  }
+
+  // check for parse errors in the private dict(s)
+  if (!parsedOk) {
+    return gFalse;
+  }
+
+  // get the charstrings index
+  if (topDict.charStringsOffset <= 0) {
+    parsedOk = gFalse;
+    return gFalse;
+  }
+  getIndex(topDict.charStringsOffset, &charStringsIdx, &parsedOk);
+  if (!parsedOk) {
+    return gFalse;
+  }
+  nGlyphs = charStringsIdx.len;
+
+  // for CID fonts: read the FDSelect table
+  if (topDict.firstOp == 0x0c1e) {
+    readFDSelect();
+    if (!parsedOk) {
+      return gFalse;
+    }
+  }
+
+  // read the charset
+  if (!readCharset()) {
+    parsedOk = gFalse;
+    return gFalse;
+  }
+
+  // for 8-bit fonts: build the encoding
+  if (topDict.firstOp != 0x0c14 && topDict.firstOp != 0x0c1e) {
+    buildEncoding();
+    if (!parsedOk) {
+      return gFalse;
+    }
+  }
+
+  return parsedOk;
+}
+
+void FoFiType1C::readTopDict() {
+  Type1CIndexVal topDictPtr;
+  int pos;
+
+  topDict.firstOp = -1;
+  topDict.versionSID = 0;
+  topDict.noticeSID = 0;
+  topDict.copyrightSID = 0;
+  topDict.fullNameSID = 0;
+  topDict.familyNameSID = 0;
+  topDict.weightSID = 0;
+  topDict.isFixedPitch = 0;
+  topDict.italicAngle = 0;
+  topDict.underlinePosition = -100;
+  topDict.underlineThickness = 50;
+  topDict.paintType = 0;
+  topDict.charstringType = 2;
+  topDict.fontMatrix[0] = 0.001;
+  topDict.fontMatrix[1] = 0;
+  topDict.fontMatrix[2] = 0;
+  topDict.fontMatrix[3] = 0.001;
+  topDict.fontMatrix[4] = 0;
+  topDict.fontMatrix[5] = 0;
+  topDict.hasFontMatrix = gFalse;
+  topDict.uniqueID = 0;
+  topDict.fontBBox[0] = 0;
+  topDict.fontBBox[1] = 0;
+  topDict.fontBBox[2] = 0;
+  topDict.fontBBox[3] = 0;
+  topDict.strokeWidth = 0;
+  topDict.charsetOffset = 0;
+  topDict.encodingOffset = 0;
+  topDict.charStringsOffset = 0;
+  topDict.privateSize = 0;
+  topDict.privateOffset = 0;
+  topDict.registrySID = 0;
+  topDict.orderingSID = 0;
+  topDict.supplement = 0;
+  topDict.fdArrayOffset = 0;
+  topDict.fdSelectOffset = 0;
+
+  getIndexVal(&topDictIdx, 0, &topDictPtr, &parsedOk);
+  pos = topDictPtr.pos;
+  nOps = 0;
+  while (pos < topDictPtr.pos + topDictPtr.len) {
+    pos = getOp(pos, gFalse, &parsedOk);
+    if (!parsedOk) {
+      break;
+    }
+    if (!ops[nOps - 1].isNum) {
+      --nOps; // drop the operator
+      if (topDict.firstOp < 0) {
+       topDict.firstOp = ops[nOps].op;
+      }
+      switch (ops[nOps].op) {
+      case 0x0000: topDict.versionSID = (int)ops[0].num; break;
+      case 0x0001: topDict.noticeSID = (int)ops[0].num; break;
+      case 0x0c00: topDict.copyrightSID = (int)ops[0].num; break;
+      case 0x0002: topDict.fullNameSID = (int)ops[0].num; break;
+      case 0x0003: topDict.familyNameSID = (int)ops[0].num; break;
+      case 0x0004: topDict.weightSID = (int)ops[0].num; break;
+      case 0x0c01: topDict.isFixedPitch = (int)ops[0].num; break;
+      case 0x0c02: topDict.italicAngle = ops[0].num; break;
+      case 0x0c03: topDict.underlinePosition = ops[0].num; break;
+      case 0x0c04: topDict.underlineThickness = ops[0].num; break;
+      case 0x0c05: topDict.paintType = (int)ops[0].num; break;
+      case 0x0c06: topDict.charstringType = (int)ops[0].num; break;
+      case 0x0c07: topDict.fontMatrix[0] = ops[0].num;
+                  topDict.fontMatrix[1] = ops[1].num;
+                  topDict.fontMatrix[2] = ops[2].num;
+                  topDict.fontMatrix[3] = ops[3].num;
+                  topDict.fontMatrix[4] = ops[4].num;
+                  topDict.fontMatrix[5] = ops[5].num;
+                  topDict.hasFontMatrix = gTrue; break;
+      case 0x000d: topDict.uniqueID = (int)ops[0].num; break;
+      case 0x0005: topDict.fontBBox[0] = ops[0].num;
+                  topDict.fontBBox[1] = ops[1].num;
+                  topDict.fontBBox[2] = ops[2].num;
+                  topDict.fontBBox[3] = ops[3].num; break;
+      case 0x0c08: topDict.strokeWidth = ops[0].num; break;
+      case 0x000f: topDict.charsetOffset = (int)ops[0].num; break;
+      case 0x0010: topDict.encodingOffset = (int)ops[0].num; break;
+      case 0x0011: topDict.charStringsOffset = (int)ops[0].num; break;
+      case 0x0012: topDict.privateSize = (int)ops[0].num;
+                  topDict.privateOffset = (int)ops[1].num; break;
+      case 0x0c1e: topDict.registrySID = (int)ops[0].num;
+                  topDict.orderingSID = (int)ops[1].num;
+                  topDict.supplement = (int)ops[2].num; break;
+      case 0x0c24: topDict.fdArrayOffset = (int)ops[0].num; break;
+      case 0x0c25: topDict.fdSelectOffset = (int)ops[0].num; break;
+      }
+      nOps = 0;
+    }
+  }
+}
+
+// Read a CID font dict (FD) - this pulls out the private dict
+// pointer, and reads the private dict.  It also pulls the FontMatrix
+// (if any) out of the FD.
+void FoFiType1C::readFD(int offset, int length, Type1CPrivateDict *pDict) {
+  int pos, pSize, pOffset;
+  double fontMatrix[6] = {0};
+  GBool hasFontMatrix;
+
+  hasFontMatrix = gFalse;
+  fontMatrix[0] = fontMatrix[1] = fontMatrix[2] = 0; // make gcc happy
+  fontMatrix[3] = fontMatrix[4] = fontMatrix[5] = 0;
+  pSize = pOffset = 0;
+  pos = offset;
+  nOps = 0;
+  while (pos < offset + length) {
+    pos = getOp(pos, gFalse, &parsedOk);
+    if (!parsedOk) {
+      return;
+    }
+    if (!ops[nOps - 1].isNum) {
+      if (ops[nOps - 1].op == 0x0012) {
+        if (nOps < 3) {
+          parsedOk = gFalse;
+          return;
+        }
+        pSize = (int)ops[0].num;
+        pOffset = (int)ops[1].num;
+        break;
+      } else if (ops[nOps - 1].op == 0x0c07) {
+        fontMatrix[0] = ops[0].num;
+        fontMatrix[1] = ops[1].num;
+        fontMatrix[2] = ops[2].num;
+        fontMatrix[3] = ops[3].num;
+        fontMatrix[4] = ops[4].num;
+        fontMatrix[5] = ops[5].num;
+        hasFontMatrix = gTrue;
+      }
+      nOps = 0;
+    }
+  }
+  readPrivateDict(pOffset, pSize, pDict);
+  if (hasFontMatrix) {
+    pDict->fontMatrix[0] = fontMatrix[0];
+    pDict->fontMatrix[1] = fontMatrix[1];
+    pDict->fontMatrix[2] = fontMatrix[2];
+    pDict->fontMatrix[3] = fontMatrix[3];
+    pDict->fontMatrix[4] = fontMatrix[4];
+    pDict->fontMatrix[5] = fontMatrix[5];
+    pDict->hasFontMatrix = gTrue;
+  }
+}
+
+void FoFiType1C::readPrivateDict(int offset, int length,
+                                Type1CPrivateDict *pDict) {
+  int pos;
+
+  pDict->hasFontMatrix = gFalse;
+  pDict->nBlueValues = 0;
+  pDict->nOtherBlues = 0;
+  pDict->nFamilyBlues = 0;
+  pDict->nFamilyOtherBlues = 0;
+  pDict->blueScale = 0.039625;
+  pDict->blueShift = 7;
+  pDict->blueFuzz = 1;
+  pDict->hasStdHW = gFalse;
+  pDict->hasStdVW = gFalse;
+  pDict->nStemSnapH = 0;
+  pDict->nStemSnapV = 0;
+  pDict->hasForceBold = gFalse;
+  pDict->forceBoldThreshold = 0;
+  pDict->languageGroup = 0;
+  pDict->expansionFactor = 0.06;
+  pDict->initialRandomSeed = 0;
+  pDict->subrsOffset = 0;
+  pDict->defaultWidthX = 0;
+  pDict->defaultWidthXFP = gFalse;
+  pDict->nominalWidthX = 0;
+  pDict->nominalWidthXFP = gFalse;
+
+  // no dictionary
+  if (offset == 0 || length == 0) {
+    return;
+  }
+
+  pos = offset;
+  nOps = 0;
+  while (pos < offset + length) {
+    pos = getOp(pos, gFalse, &parsedOk);
+    if (!parsedOk) {
+      break;
+    }
+    if (!ops[nOps - 1].isNum) {
+      --nOps; // drop the operator
+      switch (ops[nOps].op) {
+      case 0x0006:
+       pDict->nBlueValues = getDeltaIntArray(pDict->blueValues,
+                                             type1CMaxBlueValues);
+       break;
+      case 0x0007:
+       pDict->nOtherBlues = getDeltaIntArray(pDict->otherBlues,
+                                             type1CMaxOtherBlues);
+       break;
+      case 0x0008:
+       pDict->nFamilyBlues = getDeltaIntArray(pDict->familyBlues,
+                                              type1CMaxBlueValues);
+       break;
+      case 0x0009:
+       pDict->nFamilyOtherBlues = getDeltaIntArray(pDict->familyOtherBlues,
+                                                   type1CMaxOtherBlues);
+       break;
+      case 0x0c09:
+       pDict->blueScale = ops[0].num;
+       break;
+      case 0x0c0a:
+       pDict->blueShift = (int)ops[0].num;
+       break;
+      case 0x0c0b:
+       pDict->blueFuzz = (int)ops[0].num;
+       break;
+      case 0x000a:
+       pDict->stdHW = ops[0].num;
+       pDict->hasStdHW = gTrue;
+       break;
+      case 0x000b:
+       pDict->stdVW = ops[0].num;
+       pDict->hasStdVW = gTrue;
+       break;
+      case 0x0c0c:
+       pDict->nStemSnapH = getDeltaFPArray(pDict->stemSnapH,
+                                           type1CMaxStemSnap);
+       break;
+      case 0x0c0d:
+       pDict->nStemSnapV = getDeltaFPArray(pDict->stemSnapV,
+                                           type1CMaxStemSnap);
+       break;
+      case 0x0c0e:
+       pDict->forceBold = ops[0].num != 0;
+       pDict->hasForceBold = gTrue;
+       break;
+      case 0x0c0f:
+       pDict->forceBoldThreshold = ops[0].num;
+       break;
+      case 0x0c11:
+       pDict->languageGroup = (int)ops[0].num;
+       break;
+      case 0x0c12:
+       pDict->expansionFactor = ops[0].num;
+       break;
+      case 0x0c13:
+       pDict->initialRandomSeed = (int)ops[0].num;
+       break;
+      case 0x0013:
+       pDict->subrsOffset = offset + (int)ops[0].num;
+       break;
+      case 0x0014:
+       pDict->defaultWidthX = ops[0].num;
+       pDict->defaultWidthXFP = ops[0].isFP;
+       break;
+      case 0x0015:
+       pDict->nominalWidthX = ops[0].num;
+       pDict->nominalWidthXFP = ops[0].isFP;
+       break;
+      }
+      nOps = 0;
+    }
+  }
+}
+
+void FoFiType1C::readFDSelect() {
+  int fdSelectFmt, pos, nRanges, gid0, gid1, fd, i, j;
+
+  fdSelect = (Guchar *)gmalloc(nGlyphs);
+  if (topDict.fdSelectOffset == 0) {
+    for (i = 0; i < nGlyphs; ++i) {
+      fdSelect[i] = 0;
+    }
+  } else {
+    pos = topDict.fdSelectOffset;
+    fdSelectFmt = getU8(pos++, &parsedOk);
+    if (!parsedOk) {
+      return;
+    }
+    if (fdSelectFmt == 0) {
+      if (!checkRegion(pos, nGlyphs)) {
+       parsedOk = gFalse;
+       return;
+      }
+      memcpy(fdSelect, file + pos, nGlyphs);
+    } else if (fdSelectFmt == 3) {
+      nRanges = getU16BE(pos, &parsedOk);
+      pos += 2;
+      gid0 = getU16BE(pos, &parsedOk);
+      pos += 2;
+      for (i = 1; i <= nRanges; ++i) {
+       fd = getU8(pos++, &parsedOk);
+       gid1 = getU16BE(pos, &parsedOk);
+       if (!parsedOk) {
+         return;
+       }
+       pos += 2;
+       if (gid0 > gid1 || gid1 > nGlyphs) {
+         //~ error(-1, "Bad FDSelect table in CID font");
+         parsedOk = gFalse;
+         return;
+       }
+       for (j = gid0; j < gid1; ++j) {
+         fdSelect[j] = fd;
+       }
+       gid0 = gid1;
+      }
+    } else {
+      //~ error(-1, "Unknown FDSelect table format in CID font");
+      for (i = 0; i < nGlyphs; ++i) {
+       fdSelect[i] = 0;
+      }
+    }
+  }
+}
+
+void FoFiType1C::buildEncoding() {
+  char buf[256];
+  int nCodes, nRanges, encFormat;
+  int pos, c, sid, nLeft, nSups, i, j;
+
+  if (topDict.encodingOffset == 0) {
+    encoding = (char **)fofiType1StandardEncoding;
+
+  } else if (topDict.encodingOffset == 1) {
+    encoding = (char **)fofiType1ExpertEncoding;
+
+  } else {
+    encoding = (char **)gmallocn(256, sizeof(char *));
+    for (i = 0; i < 256; ++i) {
+      encoding[i] = NULL;
+    }
+    pos = topDict.encodingOffset;
+    encFormat = getU8(pos++, &parsedOk);
+    if (!parsedOk) {
+      return;
+    }
+    if ((encFormat & 0x7f) == 0) {
+      nCodes = 1 + getU8(pos++, &parsedOk);
+      if (!parsedOk) {
+       return;
+      }
+      if (nCodes > nGlyphs) {
+       nCodes = nGlyphs;
+      }
+      for (i = 1; i < nCodes && i < charsetLength; ++i) {
+       c = getU8(pos++, &parsedOk);
+       if (!parsedOk) {
+         return;
+       }
+       if (encoding[c]) {
+         gfree(encoding[c]);
+       }
+       encoding[c] = copyString(getString(charset[i], buf, &parsedOk));
+      }
+    } else if ((encFormat & 0x7f) == 1) {
+      nRanges = getU8(pos++, &parsedOk);
+      if (!parsedOk) {
+       return;
+      }
+      nCodes = 1;
+      for (i = 0; i < nRanges; ++i) {
+       c = getU8(pos++, &parsedOk);
+       nLeft = getU8(pos++, &parsedOk);
+       if (!parsedOk) {
+         return;
+       }
+       for (j = 0; j <= nLeft && nCodes < nGlyphs && nCodes < charsetLength; ++j) {
+         if (c < 256) {
+           if (encoding[c]) {
+             gfree(encoding[c]);
+           }
+           encoding[c] = copyString(getString(charset[nCodes], buf,
+                                              &parsedOk));
+         }
+         ++nCodes;
+         ++c;
+       }
+      }
+    }
+    if (encFormat & 0x80) {
+      nSups = getU8(pos++, &parsedOk);
+      if (!parsedOk) {
+       return;
+      }
+      for (i = 0; i < nSups; ++i) {
+       c = getU8(pos++, &parsedOk);;
+       if (!parsedOk) {
+         return;;
+       }
+       sid = getU16BE(pos, &parsedOk);
+       pos += 2;
+       if (!parsedOk) {
+         return;
+       }
+       if (encoding[c]) {
+         gfree(encoding[c]);
+       }
+       encoding[c] = copyString(getString(sid, buf, &parsedOk));
+      }
+    }
+  }
+}
+
+GBool FoFiType1C::readCharset() {
+  int charsetFormat, c, pos;
+  int nLeft, i, j;
+
+  if (topDict.charsetOffset == 0) {
+    charset = fofiType1CISOAdobeCharset;
+    charsetLength = sizeof(fofiType1CISOAdobeCharset) / sizeof(Gushort);
+  } else if (topDict.charsetOffset == 1) {
+    charset = fofiType1CExpertCharset;
+    charsetLength = sizeof(fofiType1CExpertCharset) / sizeof(Gushort);
+  } else if (topDict.charsetOffset == 2) {
+    charset = fofiType1CExpertSubsetCharset;
+    charsetLength = sizeof(fofiType1CExpertSubsetCharset) / sizeof(Gushort);
+  } else {
+    charset = (Gushort *)gmallocn(nGlyphs, sizeof(Gushort));
+    charsetLength = nGlyphs;
+    for (i = 0; i < nGlyphs; ++i) {
+      charset[i] = 0;
+    }
+    pos = topDict.charsetOffset;
+    charsetFormat = getU8(pos++, &parsedOk);
+    if (charsetFormat == 0) {
+      for (i = 1; i < nGlyphs; ++i) {
+       charset[i] = (Gushort)getU16BE(pos, &parsedOk);
+       pos += 2;
+       if (!parsedOk) {
+         break;
+       }
+      }
+    } else if (charsetFormat == 1) {
+      i = 1;
+      while (i < nGlyphs) {
+       c = getU16BE(pos, &parsedOk);
+       pos += 2;
+       nLeft = getU8(pos++, &parsedOk);
+       if (!parsedOk) {
+         break;
+       }
+       for (j = 0; j <= nLeft && i < nGlyphs; ++j) {
+         charset[i++] = (Gushort)c++;
+       }
+      }
+    } else if (charsetFormat == 2) {
+      i = 1;
+      while (i < nGlyphs) {
+       c = getU16BE(pos, &parsedOk);
+       pos += 2;
+       nLeft = getU16BE(pos, &parsedOk);
+       pos += 2;
+       if (!parsedOk) {
+         break;
+       }
+       for (j = 0; j <= nLeft && i < nGlyphs; ++j) {
+         charset[i++] = (Gushort)c++;
+       }
+      }
+    }
+    if (!parsedOk) {
+      gfree(charset);
+      charset = NULL;
+      charsetLength = 0;
+      return gFalse;
+    }
+  }
+  return gTrue;
+}
+
+int FoFiType1C::getOp(int pos, GBool charstring, GBool *ok) {
+  static char nybChars[16] = "0123456789.ee -";
+  Type1COp op;
+  char buf[65];
+  int b0, b1, nyb0, nyb1, x, i;
+
+  b0 = getU8(pos++, ok);
+  op.isNum = gTrue;
+  op.isFP = gFalse;
+
+  if (b0 == 28) {
+    x = getU8(pos++, ok);
+    x = (x << 8) | getU8(pos++, ok);
+    if (x & 0x8000) {
+      x |= ~0xffff;
+    }
+    op.num = x;
+
+  } else if (!charstring && b0 == 29) {
+    x = getU8(pos++, ok);
+    x = (x << 8) | getU8(pos++, ok);
+    x = (x << 8) | getU8(pos++, ok);
+    x = (x << 8) | getU8(pos++, ok);
+    if (x & 0x80000000) {
+      x |= ~0xffffffff;
+    }
+    op.num = x;
+
+  } else if (!charstring && b0 == 30) {
+    i = 0;
+    do {
+      b1 = getU8(pos++, ok);
+      nyb0 = b1 >> 4;
+      nyb1 = b1 & 0x0f;
+      if (nyb0 == 0xf) {
+       break;
+      }
+      buf[i++] = nybChars[nyb0];
+      if (i == 64) {
+       break;
+      }
+      if (nyb0 == 0xc) {
+       buf[i++] = '-';
+      }
+      if (i == 64) {
+       break;
+      }
+      if (nyb1 == 0xf) {
+       break;
+      }
+      buf[i++] = nybChars[nyb1];
+      if (i == 64) {
+       break;
+      }
+      if (nyb1 == 0xc) {
+       buf[i++] = '-';
+      }
+    } while (i < 64);
+    buf[i] = '\0';
+    op.num = gatof(buf);
+    op.isFP = gTrue;
+
+  } else if (b0 >= 32 && b0 <= 246) {
+    op.num = b0 - 139;
+
+  } else if (b0 >= 247 && b0 <= 250) {
+    op.num = ((b0 - 247) << 8) + getU8(pos++, ok) + 108;
+
+  } else if (b0 >= 251 && b0 <= 254) {
+    op.num = -((b0 - 251) << 8) - getU8(pos++, ok) - 108;
+
+  } else if (charstring && b0 == 255) {
+    x = getU8(pos++, ok);
+    x = (x << 8) | getU8(pos++, ok);
+    x = (x << 8) | getU8(pos++, ok);
+    x = (x << 8) | getU8(pos++, ok);
+    if (x & 0x80000000) {
+      x |= ~0xffffffff;
+    }
+    op.num = (double)x / 65536.0;
+    op.isFP = gTrue;
+
+  } else if (b0 == 12) {
+    op.isNum = gFalse;
+    op.op = 0x0c00 + getU8(pos++, ok);
+
+  } else {
+    op.isNum = gFalse;
+    op.op = b0;
+  }
+
+  if (nOps < 49) {
+    ops[nOps++] = op;
+  }
+
+  return pos;
+}
+
+// Convert the delta-encoded ops array to an array of ints.
+int FoFiType1C::getDeltaIntArray(int *arr, int maxLen) {
+  int x;
+  int n, i;
+
+  if ((n = nOps) > maxLen) {
+    n = maxLen;
+  }
+  x = 0;
+  for (i = 0; i < n; ++i) {
+    x += (int)ops[i].num;
+    arr[i] = x;
+  }
+  return n;
+}
+
+// Convert the delta-encoded ops array to an array of doubles.
+int FoFiType1C::getDeltaFPArray(double *arr, int maxLen) {
+  double x;
+  int n, i;
+
+  if ((n = nOps) > maxLen) {
+    n = maxLen;
+  }
+  x = 0;
+  for (i = 0; i < n; ++i) {
+    x += ops[i].num;
+    arr[i] = x;
+  }
+  return n;
+}
+
+void FoFiType1C::getIndex(int pos, Type1CIndex *idx, GBool *ok) {
+  idx->pos = pos;
+  idx->len = getU16BE(pos, ok);
+  if (idx->len == 0) {
+    // empty indexes are legal and contain just the length field
+    idx->offSize = 0;
+    idx->startPos = idx->endPos = pos + 2;
+  } else {
+    idx->offSize = getU8(pos + 2, ok);
+    if (idx->offSize < 1 || idx->offSize > 4) {
+      *ok = gFalse;
+    }
+    idx->startPos = pos + 3 + (idx->len + 1) * idx->offSize - 1;
+    if (idx->startPos < 0 || idx->startPos >= len) {
+      *ok = gFalse;
+    }
+    idx->endPos = idx->startPos + getUVarBE(pos + 3 + idx->len * idx->offSize,
+                                           idx->offSize, ok);
+    if (idx->endPos < idx->startPos || idx->endPos > len) {
+      *ok = gFalse;
+    }
+  }
+}
+
+void FoFiType1C::getIndexVal(Type1CIndex *idx, int i,
+                            Type1CIndexVal *val, GBool *ok) {
+  int pos0, pos1;
+
+  if (i < 0 || i >= idx->len) {
+    *ok = gFalse;
+    return;
+  }
+  pos0 = idx->startPos + getUVarBE(idx->pos + 3 + i * idx->offSize,
+                                  idx->offSize, ok);
+  pos1 = idx->startPos + getUVarBE(idx->pos + 3 + (i + 1) * idx->offSize,
+                                  idx->offSize, ok);
+  if (pos0 < idx->startPos || pos0 > idx->endPos ||
+      pos1 <= idx->startPos || pos1 > idx->endPos ||
+      pos1 < pos0) {
+    *ok = gFalse;
+  }
+  val->pos = pos0;
+  val->len = pos1 - pos0;
+}
+
+char *FoFiType1C::getString(int sid, char *buf, GBool *ok) {
+  Type1CIndexVal val;
+  int n;
+
+  if (sid < 0) {
+    buf[0] = '\0';
+  } else if (sid < 391) {
+    strcpy(buf, fofiType1CStdStrings[sid]);
+  } else {
+    sid -= 391;
+    getIndexVal(&stringIdx, sid, &val, ok);
+    if (*ok) {
+      if ((n = val.len) > 255) {
+       n = 255;
+      }
+      strncpy(buf, (char *)&file[val.pos], n);
+      buf[n] = '\0';
+    } else {
+      buf[0] = '\0';
+    }
+  }
+  return buf;
+}
diff --git a/fofi/FoFiType1C.h b/fofi/FoFiType1C.h
new file mode 100644 (file)
index 0000000..698dccd
--- /dev/null
@@ -0,0 +1,266 @@
+//========================================================================
+//
+// FoFiType1C.h
+//
+// Copyright 1999-2003 Glyph & Cog, LLC
+//
+//========================================================================
+
+//========================================================================
+//
+// Modified under the Poppler project - http://poppler.freedesktop.org
+//
+// All changes made under the Poppler project to this file are licensed
+// under GPL version 2 or later
+//
+// Copyright (C) 2006 Takashi Iwai <tiwai@suse.de>
+// Copyright (C) 2012 Thomas Freitag <Thomas.Freitag@alfa.de>
+//
+// To see a description of the changes please see the Changelog file that
+// came with your tarball or type make ChangeLog if you are building from git
+//
+//========================================================================
+
+#ifndef FOFITYPE1C_H
+#define FOFITYPE1C_H
+
+#ifdef USE_GCC_PRAGMAS
+#pragma interface
+#endif
+
+#include "goo/gtypes.h"
+#include "FoFiBase.h"
+
+class GooString;
+
+//------------------------------------------------------------------------
+
+struct Type1CIndex {
+  int pos;                     // absolute position in file
+  int len;                     // length (number of entries)
+  int offSize;                 // offset size
+  int startPos;                        // position of start of index data - 1
+  int endPos;                  // position one byte past end of the index
+};
+
+struct Type1CIndexVal {
+  int pos;                     // absolute position in file
+  int len;                     // length, in bytes
+};
+
+struct Type1CTopDict {
+  int firstOp;
+
+  int versionSID;
+  int noticeSID;
+  int copyrightSID;
+  int fullNameSID;
+  int familyNameSID;
+  int weightSID;
+  int isFixedPitch;
+  double italicAngle;
+  double underlinePosition;
+  double underlineThickness;
+  int paintType;
+  int charstringType;
+  double fontMatrix[6];
+  GBool hasFontMatrix;         // CID fonts are allowed to put their
+                               //   FontMatrix in the FD instead of the
+                               //   top dict
+  int uniqueID;
+  double fontBBox[4];
+  double strokeWidth;
+  int charsetOffset;
+  int encodingOffset;
+  int charStringsOffset;
+  int privateSize;
+  int privateOffset;
+
+  // CIDFont entries
+  int registrySID;
+  int orderingSID;
+  int supplement;
+  int fdArrayOffset;
+  int fdSelectOffset;
+};
+
+#define type1CMaxBlueValues 14
+#define type1CMaxOtherBlues 10
+#define type1CMaxStemSnap   12
+
+struct Type1CPrivateDict {
+  double fontMatrix[6];
+  GBool hasFontMatrix;
+  int blueValues[type1CMaxBlueValues];
+  int nBlueValues;
+  int otherBlues[type1CMaxOtherBlues];
+  int nOtherBlues;
+  int familyBlues[type1CMaxBlueValues];
+  int nFamilyBlues;
+  int familyOtherBlues[type1CMaxOtherBlues];
+  int nFamilyOtherBlues;
+  double blueScale;
+  int blueShift;
+  int blueFuzz;
+  double stdHW;
+  GBool hasStdHW;
+  double stdVW;
+  GBool hasStdVW;
+  double stemSnapH[type1CMaxStemSnap];
+  int nStemSnapH;
+  double stemSnapV[type1CMaxStemSnap];
+  int nStemSnapV;
+  GBool forceBold;
+  GBool hasForceBold;
+  double forceBoldThreshold;
+  int languageGroup;
+  double expansionFactor;
+  int initialRandomSeed;
+  int subrsOffset;
+  double defaultWidthX;
+  GBool defaultWidthXFP;
+  double nominalWidthX;
+  GBool nominalWidthXFP;
+};
+
+struct Type1COp {
+  GBool isNum;                 // true -> number, false -> operator
+  GBool isFP;                  // true -> floating point number, false -> int
+  union {
+    double num;                        // if num is true
+    int op;                    // if num is false
+  };
+};
+
+struct Type1CEexecBuf {
+  FoFiOutputFunc outputFunc;
+  void *outputStream;
+  GBool ascii;                 // ASCII encoding?
+  Gushort r1;                  // eexec encryption key
+  int line;                    // number of eexec chars left on current line
+};
+
+//------------------------------------------------------------------------
+// FoFiType1C
+//------------------------------------------------------------------------
+
+class FoFiType1C: public FoFiBase {
+public:
+
+  // Create a FoFiType1C object from a memory buffer.
+  static FoFiType1C *make(char *fileA, int lenA);
+
+  // Create a FoFiType1C object from a file on disk.
+  static FoFiType1C *load(char *fileName);
+
+  virtual ~FoFiType1C();
+
+  // Return the font name.
+  char *getName();
+
+  // Return the encoding, as an array of 256 names (any of which may
+  // be NULL).  This is only useful with 8-bit fonts.
+  char **getEncoding();
+
+  // Get the glyph names.
+  int getNumGlyphs() { return nGlyphs; }
+  GooString *getGlyphName(int gid);
+
+  // Return the mapping from CIDs to GIDs, and return the number of
+  // CIDs in *<nCIDs>.  This is only useful for CID fonts.
+  int *getCIDToGIDMap(int *nCIDs);
+
+  // Return the font matrix as an array of six numbers.
+  void getFontMatrix(double *mat);
+
+  // Convert to a Type 1 font, suitable for embedding in a PostScript
+  // file.  This is only useful with 8-bit fonts.  If <newEncoding> is
+  // not NULL, it will be used in place of the encoding in the Type 1C
+  // font.  If <ascii> is true the eexec section will be hex-encoded,
+  // otherwise it will be left as binary data.  If <psName> is non-NULL,
+  // it will be used as the PostScript font name.
+  void convertToType1(char *psName, const char **newEncoding, GBool ascii,
+                     FoFiOutputFunc outputFunc, void *outputStream);
+
+  // Convert to a Type 0 CIDFont, suitable for embedding in a
+  // PostScript file.  <psName> will be used as the PostScript font
+  // name.  There are three cases for the CID-to-GID mapping:
+  // (1) if <codeMap> is non-NULL, then it is the CID-to-GID mapping
+  // (2) if <codeMap> is NULL and this is a CID CFF font, then the
+  //     font's internal CID-to-GID mapping is used
+  // (3) is <codeMap> is NULL and this is an 8-bit CFF font, then
+  //     the identity CID-to-GID mapping is used
+  void convertToCIDType0(char *psName, int *codeMap, int nCodes,
+                        FoFiOutputFunc outputFunc, void *outputStream);
+
+  // Convert to a Type 0 (but non-CID) composite font, suitable for
+  // embedding in a PostScript file.  <psName> will be used as the
+  // PostScript font name.  There are three cases for the CID-to-GID
+  // mapping:
+  // (1) if <codeMap> is non-NULL, then it is the CID-to-GID mapping
+  // (2) if <codeMap> is NULL and this is a CID CFF font, then the
+  //     font's internal CID-to-GID mapping is used
+  // (3) is <codeMap> is NULL and this is an 8-bit CFF font, then
+  //     the identity CID-to-GID mapping is used
+  void convertToType0(char *psName, int *codeMap, int nCodes,
+                     FoFiOutputFunc outputFunc, void *outputStream);
+
+private:
+
+  FoFiType1C(char *fileA, int lenA, GBool freeFileDataA);
+  void eexecCvtGlyph(Type1CEexecBuf *eb, const char *glyphName,
+                    int offset, int nBytes,
+                    Type1CIndex *subrIdx,
+                    Type1CPrivateDict *pDict);
+  void cvtGlyph(int offset, int nBytes, GooString *charBuf,
+               Type1CIndex *subrIdx, Type1CPrivateDict *pDict,
+               GBool top);
+  void cvtGlyphWidth(GBool useOp, GooString *charBuf,
+                    Type1CPrivateDict *pDict);
+  void cvtNum(double x, GBool isFP, GooString *charBuf);
+  void eexecWrite(Type1CEexecBuf *eb, const char *s);
+  void eexecWriteCharstring(Type1CEexecBuf *eb, Guchar *s, int n);
+  void writePSString(char *s, FoFiOutputFunc outputFunc, void *outputStream);
+  GBool parse();
+  void readTopDict();
+  void readFD(int offset, int length, Type1CPrivateDict *pDict);
+  void readPrivateDict(int offset, int length, Type1CPrivateDict *pDict);
+  void readFDSelect();
+  void buildEncoding();
+  GBool readCharset();
+  int getOp(int pos, GBool charstring, GBool *ok);
+  int getDeltaIntArray(int *arr, int maxLen);
+  int getDeltaFPArray(double *arr, int maxLen);
+  void getIndex(int pos, Type1CIndex *idx, GBool *ok);
+  void getIndexVal(Type1CIndex *idx, int i, Type1CIndexVal *val, GBool *ok);
+  char *getString(int sid, char *buf, GBool *ok);
+
+  GooString *name;
+  char **encoding;
+
+  Type1CIndex nameIdx;
+  Type1CIndex topDictIdx;
+  Type1CIndex stringIdx;
+  Type1CIndex gsubrIdx;
+  Type1CIndex charStringsIdx;
+
+  Type1CTopDict topDict;
+  Type1CPrivateDict *privateDicts;
+
+  int nGlyphs;
+  int nFDs;
+  Guchar *fdSelect;
+  Gushort *charset;
+  Gushort charsetLength;
+  int gsubrBias;
+
+  GBool parsedOk;
+
+  Type1COp ops[49];            // operands and operator
+  int nOps;                    // number of operands
+  int nHints;                  // number of hints for the current glyph
+  GBool firstOp;               // true if we haven't hit the first op yet
+  GBool openPath;              // true if there is an unclosed path
+};
+
+#endif
diff --git a/fofi/Makefile.am b/fofi/Makefile.am
new file mode 100644 (file)
index 0000000..c4654dd
--- /dev/null
@@ -0,0 +1,28 @@
+INCLUDES =                                     \
+       -I$(top_srcdir)
+
+noinst_LTLIBRARIES = libfofi.la
+
+if ENABLE_XPDF_HEADERS
+poppler_fofi_includedir = $(includedir)/poppler/fofi
+poppler_fofi_include_HEADERS = \
+       FoFiBase.h              \
+       FoFiEncodings.h         \
+       FoFiTrueType.h          \
+       FoFiType1.h             \
+       FoFiIdentifier.h        \
+       FoFiType1C.h
+endif
+
+libfofi_la_SOURCES =           \
+       FoFiBase.cc             \
+       FoFiBase.h              \
+       FoFiEncodings.cc        \
+       FoFiEncodings.h         \
+       FoFiTrueType.cc         \
+       FoFiTrueType.h          \
+       FoFiType1.cc            \
+       FoFiType1.h             \
+       FoFiType1C.cc           \
+       FoFiIdentifier.cc       \
+       FoFiType1C.h
diff --git a/fofi/Makefile.in b/fofi/Makefile.in
new file mode 100644 (file)
index 0000000..21bf6ef
--- /dev/null
@@ -0,0 +1,707 @@
+# Makefile.in generated by automake 1.11.5 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software
+# Foundation, Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+@SET_MAKE@
+
+
+VPATH = @srcdir@
+am__make_dryrun = \
+  { \
+    am__dry=no; \
+    case $$MAKEFLAGS in \
+      *\\[\ \  ]*) \
+        echo 'am--echo: ; @echo "AM"  OK' | $(MAKE) -f - 2>/dev/null \
+          | grep '^AM OK$$' >/dev/null || am__dry=yes;; \
+      *) \
+        for am__flg in $$MAKEFLAGS; do \
+          case $$am__flg in \
+            *=*|--*) ;; \
+            *n*) am__dry=yes; break;; \
+          esac; \
+        done;; \
+    esac; \
+    test $$am__dry = yes; \
+  }
+pkgdatadir = $(datadir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkglibexecdir = $(libexecdir)/@PACKAGE@
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+subdir = fofi
+DIST_COMMON = $(am__poppler_fofi_include_HEADERS_DIST) \
+       $(srcdir)/Makefile.am $(srcdir)/Makefile.in
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/m4/acx_pthread.m4 \
+       $(top_srcdir)/m4/define-dir.m4 $(top_srcdir)/m4/gtk-doc.m4 \
+       $(top_srcdir)/m4/iconv.m4 $(top_srcdir)/m4/introspection.m4 \
+       $(top_srcdir)/m4/libjpeg.m4 $(top_srcdir)/m4/libtool.m4 \
+       $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \
+       $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \
+       $(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+       $(ACLOCAL_M4)
+mkinstalldirs = $(install_sh) -d
+CONFIG_HEADER = $(top_builddir)/config.h \
+       $(top_builddir)/poppler/poppler-config.h
+CONFIG_CLEAN_FILES =
+CONFIG_CLEAN_VPATH_FILES =
+LTLIBRARIES = $(noinst_LTLIBRARIES)
+libfofi_la_LIBADD =
+am_libfofi_la_OBJECTS = FoFiBase.lo FoFiEncodings.lo FoFiTrueType.lo \
+       FoFiType1.lo FoFiType1C.lo FoFiIdentifier.lo
+libfofi_la_OBJECTS = $(am_libfofi_la_OBJECTS)
+AM_V_lt = $(am__v_lt_@AM_V@)
+am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@)
+am__v_lt_0 = --silent
+DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) -I$(top_builddir)/poppler
+depcomp = $(SHELL) $(top_srcdir)/depcomp
+am__depfiles_maybe = depfiles
+am__mv = mv -f
+CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
+       $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)
+LTCXXCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \
+       $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) \
+       $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
+       $(AM_CXXFLAGS) $(CXXFLAGS)
+AM_V_CXX = $(am__v_CXX_@AM_V@)
+am__v_CXX_ = $(am__v_CXX_@AM_DEFAULT_V@)
+am__v_CXX_0 = @echo "  CXX   " $@;
+AM_V_at = $(am__v_at_@AM_V@)
+am__v_at_ = $(am__v_at_@AM_DEFAULT_V@)
+am__v_at_0 = @
+CXXLD = $(CXX)
+CXXLINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \
+       $(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \
+       $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
+AM_V_CXXLD = $(am__v_CXXLD_@AM_V@)
+am__v_CXXLD_ = $(am__v_CXXLD_@AM_DEFAULT_V@)
+am__v_CXXLD_0 = @echo "  CXXLD " $@;
+COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
+       $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
+LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
+       $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \
+       $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
+       $(AM_CFLAGS) $(CFLAGS)
+AM_V_CC = $(am__v_CC_@AM_V@)
+am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@)
+am__v_CC_0 = @echo "  CC    " $@;
+CCLD = $(CC)
+LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
+       $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
+       $(AM_LDFLAGS) $(LDFLAGS) -o $@
+AM_V_CCLD = $(am__v_CCLD_@AM_V@)
+am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@)
+am__v_CCLD_0 = @echo "  CCLD  " $@;
+AM_V_GEN = $(am__v_GEN_@AM_V@)
+am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@)
+am__v_GEN_0 = @echo "  GEN   " $@;
+SOURCES = $(libfofi_la_SOURCES)
+DIST_SOURCES = $(libfofi_la_SOURCES)
+am__can_run_installinfo = \
+  case $$AM_UPDATE_INFO_DIR in \
+    n|no|NO) false;; \
+    *) (install-info --version) >/dev/null 2>&1;; \
+  esac
+am__poppler_fofi_include_HEADERS_DIST = FoFiBase.h FoFiEncodings.h \
+       FoFiTrueType.h FoFiType1.h FoFiIdentifier.h FoFiType1C.h
+am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
+am__vpath_adj = case $$p in \
+    $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
+    *) f=$$p;; \
+  esac;
+am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`;
+am__install_max = 40
+am__nobase_strip_setup = \
+  srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'`
+am__nobase_strip = \
+  for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||"
+am__nobase_list = $(am__nobase_strip_setup); \
+  for p in $$list; do echo "$$p $$p"; done | \
+  sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \
+  $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \
+    if (++n[$$2] == $(am__install_max)) \
+      { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \
+    END { for (dir in files) print dir, files[dir] }'
+am__base_list = \
+  sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
+  sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
+am__uninstall_files_from_dir = { \
+  test -z "$$files" \
+    || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \
+    || { echo " ( cd '$$dir' && rm -f" $$files ")"; \
+         $(am__cd) "$$dir" && rm -f $$files; }; \
+  }
+am__installdirs = "$(DESTDIR)$(poppler_fofi_includedir)"
+HEADERS = $(poppler_fofi_include_HEADERS)
+ETAGS = etags
+CTAGS = ctags
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AR = @AR@
+AS = @AS@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CAIRO_CFLAGS = @CAIRO_CFLAGS@
+CAIRO_FEATURE = @CAIRO_FEATURE@
+CAIRO_LIBS = @CAIRO_LIBS@
+CAIRO_REQ = @CAIRO_REQ@
+CAIRO_VERSION = @CAIRO_VERSION@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CXX = @CXX@
+CXXCPP = @CXXCPP@
+CXXDEPMODE = @CXXDEPMODE@
+CXXFLAGS = @CXXFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DLLTOOL = @DLLTOOL@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+FGREP = @FGREP@
+FONTCONFIG_CFLAGS = @FONTCONFIG_CFLAGS@
+FONTCONFIG_LIBS = @FONTCONFIG_LIBS@
+FREETYPE_CFLAGS = @FREETYPE_CFLAGS@
+FREETYPE_CONFIG = @FREETYPE_CONFIG@
+FREETYPE_LIBS = @FREETYPE_LIBS@
+GLIB_MKENUMS = @GLIB_MKENUMS@
+GLIB_REQ = @GLIB_REQ@
+GLIB_REQUIRED = @GLIB_REQUIRED@
+GREP = @GREP@
+GTKDOC_CHECK = @GTKDOC_CHECK@
+GTKDOC_DEPS_CFLAGS = @GTKDOC_DEPS_CFLAGS@
+GTKDOC_DEPS_LIBS = @GTKDOC_DEPS_LIBS@
+GTKDOC_MKPDF = @GTKDOC_MKPDF@
+GTKDOC_REBASE = @GTKDOC_REBASE@
+GTK_TEST_CFLAGS = @GTK_TEST_CFLAGS@
+GTK_TEST_LIBS = @GTK_TEST_LIBS@
+HTML_DIR = @HTML_DIR@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+INTROSPECTION_CFLAGS = @INTROSPECTION_CFLAGS@
+INTROSPECTION_COMPILER = @INTROSPECTION_COMPILER@
+INTROSPECTION_GENERATE = @INTROSPECTION_GENERATE@
+INTROSPECTION_GIRDIR = @INTROSPECTION_GIRDIR@
+INTROSPECTION_LIBS = @INTROSPECTION_LIBS@
+INTROSPECTION_MAKEFILE = @INTROSPECTION_MAKEFILE@
+INTROSPECTION_SCANNER = @INTROSPECTION_SCANNER@
+INTROSPECTION_TYPELIBDIR = @INTROSPECTION_TYPELIBDIR@
+LCMS_CFLAGS = @LCMS_CFLAGS@
+LCMS_LIBS = @LCMS_LIBS@
+LD = @LD@
+LDFLAGS = @LDFLAGS@
+LIBCURL_CFLAGS = @LIBCURL_CFLAGS@
+LIBCURL_LIBS = @LIBCURL_LIBS@
+LIBICONV = @LIBICONV@
+LIBJPEG_CFLAGS = @LIBJPEG_CFLAGS@
+LIBJPEG_LIBS = @LIBJPEG_LIBS@
+LIBOBJS = @LIBOBJS@
+LIBOPENJPEG_CFLAGS = @LIBOPENJPEG_CFLAGS@
+LIBOPENJPEG_LIBS = @LIBOPENJPEG_LIBS@
+LIBPNG_CFLAGS = @LIBPNG_CFLAGS@
+LIBPNG_LIBS = @LIBPNG_LIBS@
+LIBS = @LIBS@
+LIBTIFF_CFLAGS = @LIBTIFF_CFLAGS@
+LIBTIFF_CFLAGSS = @LIBTIFF_CFLAGSS@
+LIBTIFF_LIBS = @LIBTIFF_LIBS@
+LIBTOOL = @LIBTOOL@
+LIPO = @LIPO@
+LN_S = @LN_S@
+LTLIBICONV = @LTLIBICONV@
+LTLIBOBJS = @LTLIBOBJS@
+MAKEINFO = @MAKEINFO@
+MANIFEST_TOOL = @MANIFEST_TOOL@
+MKDIR_P = @MKDIR_P@
+MOCQT4 = @MOCQT4@
+NM = @NM@
+NMEDIT = @NMEDIT@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+OTOOL = @OTOOL@
+OTOOL64 = @OTOOL64@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_URL = @PACKAGE_URL@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PC_REQUIRES = @PC_REQUIRES@
+PC_REQUIRES_PRIVATE = @PC_REQUIRES_PRIVATE@
+PDFTOCAIRO_CFLAGS = @PDFTOCAIRO_CFLAGS@
+PDFTOCAIRO_LIBS = @PDFTOCAIRO_LIBS@
+PKG_CONFIG = @PKG_CONFIG@
+PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@
+PKG_CONFIG_PATH = @PKG_CONFIG_PATH@
+POPPLER_DATADIR = @POPPLER_DATADIR@
+POPPLER_GLIB_CFLAGS = @POPPLER_GLIB_CFLAGS@
+POPPLER_GLIB_DISABLE_DEPRECATED = @POPPLER_GLIB_DISABLE_DEPRECATED@
+POPPLER_GLIB_DISABLE_SINGLE_INCLUDES = @POPPLER_GLIB_DISABLE_SINGLE_INCLUDES@
+POPPLER_GLIB_LIBS = @POPPLER_GLIB_LIBS@
+POPPLER_MAJOR_VERSION = @POPPLER_MAJOR_VERSION@
+POPPLER_MICRO_VERSION = @POPPLER_MICRO_VERSION@
+POPPLER_MINOR_VERSION = @POPPLER_MINOR_VERSION@
+POPPLER_QT4_CFLAGS = @POPPLER_QT4_CFLAGS@
+POPPLER_QT4_CXXFLAGS = @POPPLER_QT4_CXXFLAGS@
+POPPLER_QT4_LIBS = @POPPLER_QT4_LIBS@
+POPPLER_QT4_TEST_CFLAGS = @POPPLER_QT4_TEST_CFLAGS@
+POPPLER_QT4_TEST_LIBS = @POPPLER_QT4_TEST_LIBS@
+POPPLER_VERSION = @POPPLER_VERSION@
+PTHREAD_CC = @PTHREAD_CC@
+PTHREAD_CFLAGS = @PTHREAD_CFLAGS@
+PTHREAD_LIBS = @PTHREAD_LIBS@
+RANLIB = @RANLIB@
+SED = @SED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+TESTDATADIR = @TESTDATADIR@
+VERSION = @VERSION@
+XMKMF = @XMKMF@
+X_CFLAGS = @X_CFLAGS@
+X_EXTRA_LIBS = @X_EXTRA_LIBS@
+X_LIBS = @X_LIBS@
+X_PRE_LIBS = @X_PRE_LIBS@
+ZLIB_LIBS = @ZLIB_LIBS@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
+ac_ct_AR = @ac_ct_AR@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_CXX = @ac_ct_CXX@
+ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
+acx_pthread_config = @acx_pthread_config@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+auto_import_flags = @auto_import_flags@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+builddir = @builddir@
+create_shared_lib = @create_shared_lib@
+datadir = @datadir@
+datarootdir = @datarootdir@
+docdir = @docdir@
+dvidir = @dvidir@
+exec_prefix = @exec_prefix@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+htmldir = @htmldir@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localedir = @localedir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+srcdir = @srcdir@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+top_build_prefix = @top_build_prefix@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+win32_libs = @win32_libs@
+INCLUDES = \
+       -I$(top_srcdir)
+
+noinst_LTLIBRARIES = libfofi.la
+@ENABLE_XPDF_HEADERS_TRUE@poppler_fofi_includedir = $(includedir)/poppler/fofi
+@ENABLE_XPDF_HEADERS_TRUE@poppler_fofi_include_HEADERS = \
+@ENABLE_XPDF_HEADERS_TRUE@     FoFiBase.h              \
+@ENABLE_XPDF_HEADERS_TRUE@     FoFiEncodings.h         \
+@ENABLE_XPDF_HEADERS_TRUE@     FoFiTrueType.h          \
+@ENABLE_XPDF_HEADERS_TRUE@     FoFiType1.h             \
+@ENABLE_XPDF_HEADERS_TRUE@     FoFiIdentifier.h        \
+@ENABLE_XPDF_HEADERS_TRUE@     FoFiType1C.h
+
+libfofi_la_SOURCES = \
+       FoFiBase.cc             \
+       FoFiBase.h              \
+       FoFiEncodings.cc        \
+       FoFiEncodings.h         \
+       FoFiTrueType.cc         \
+       FoFiTrueType.h          \
+       FoFiType1.cc            \
+       FoFiType1.h             \
+       FoFiType1C.cc           \
+       FoFiIdentifier.cc       \
+       FoFiType1C.h
+
+all: all-am
+
+.SUFFIXES:
+.SUFFIXES: .cc .lo .o .obj
+$(srcdir)/Makefile.in:  $(srcdir)/Makefile.am  $(am__configure_deps)
+       @for dep in $?; do \
+         case '$(am__configure_deps)' in \
+           *$$dep*) \
+             ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
+               && { if test -f $@; then exit 0; else break; fi; }; \
+             exit 1;; \
+         esac; \
+       done; \
+       echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign fofi/Makefile'; \
+       $(am__cd) $(top_srcdir) && \
+         $(AUTOMAKE) --foreign fofi/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+       @case '$?' in \
+         *config.status*) \
+           cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+         *) \
+           echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+           cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+       esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+       cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure:  $(am__configure_deps)
+       cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4):  $(am__aclocal_m4_deps)
+       cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(am__aclocal_m4_deps):
+
+clean-noinstLTLIBRARIES:
+       -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES)
+       @list='$(noinst_LTLIBRARIES)'; for p in $$list; do \
+         dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \
+         test "$$dir" != "$$p" || dir=.; \
+         echo "rm -f \"$${dir}/so_locations\""; \
+         rm -f "$${dir}/so_locations"; \
+       done
+libfofi.la: $(libfofi_la_OBJECTS) $(libfofi_la_DEPENDENCIES) $(EXTRA_libfofi_la_DEPENDENCIES) 
+       $(AM_V_CXXLD)$(CXXLINK)  $(libfofi_la_OBJECTS) $(libfofi_la_LIBADD) $(LIBS)
+
+mostlyclean-compile:
+       -rm -f *.$(OBJEXT)
+
+distclean-compile:
+       -rm -f *.tab.c
+
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FoFiBase.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FoFiEncodings.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FoFiIdentifier.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FoFiTrueType.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FoFiType1.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FoFiType1C.Plo@am__quote@
+
+.cc.o:
+@am__fastdepCXX_TRUE@  $(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
+@am__fastdepCXX_TRUE@  $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ $<
+
+.cc.obj:
+@am__fastdepCXX_TRUE@  $(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'`
+@am__fastdepCXX_TRUE@  $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
+
+.cc.lo:
+@am__fastdepCXX_TRUE@  $(AM_V_CXX)$(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
+@am__fastdepCXX_TRUE@  $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     $(AM_V_CXX)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LTCXXCOMPILE) -c -o $@ $<
+
+mostlyclean-libtool:
+       -rm -f *.lo
+
+clean-libtool:
+       -rm -rf .libs _libs
+install-poppler_fofi_includeHEADERS: $(poppler_fofi_include_HEADERS)
+       @$(NORMAL_INSTALL)
+       @list='$(poppler_fofi_include_HEADERS)'; test -n "$(poppler_fofi_includedir)" || list=; \
+       if test -n "$$list"; then \
+         echo " $(MKDIR_P) '$(DESTDIR)$(poppler_fofi_includedir)'"; \
+         $(MKDIR_P) "$(DESTDIR)$(poppler_fofi_includedir)" || exit 1; \
+       fi; \
+       for p in $$list; do \
+         if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+         echo "$$d$$p"; \
+       done | $(am__base_list) | \
+       while read files; do \
+         echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(poppler_fofi_includedir)'"; \
+         $(INSTALL_HEADER) $$files "$(DESTDIR)$(poppler_fofi_includedir)" || exit $$?; \
+       done
+
+uninstall-poppler_fofi_includeHEADERS:
+       @$(NORMAL_UNINSTALL)
+       @list='$(poppler_fofi_include_HEADERS)'; test -n "$(poppler_fofi_includedir)" || list=; \
+       files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
+       dir='$(DESTDIR)$(poppler_fofi_includedir)'; $(am__uninstall_files_from_dir)
+
+ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
+       list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+       unique=`for i in $$list; do \
+           if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+         done | \
+         $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
+             END { if (nonempty) { for (i in files) print i; }; }'`; \
+       mkid -fID $$unique
+tags: TAGS
+
+TAGS:  $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
+               $(TAGS_FILES) $(LISP)
+       set x; \
+       here=`pwd`; \
+       list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
+       unique=`for i in $$list; do \
+           if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+         done | \
+         $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
+             END { if (nonempty) { for (i in files) print i; }; }'`; \
+       shift; \
+       if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
+         test -n "$$unique" || unique=$$empty_fix; \
+         if test $$# -gt 0; then \
+           $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+             "$$@" $$unique; \
+         else \
+           $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+             $$unique; \
+         fi; \
+       fi
+ctags: CTAGS
+CTAGS:  $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
+               $(TAGS_FILES) $(LISP)
+       list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
+       unique=`for i in $$list; do \
+           if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+         done | \
+         $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
+             END { if (nonempty) { for (i in files) print i; }; }'`; \
+       test -z "$(CTAGS_ARGS)$$unique" \
+         || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+            $$unique
+
+GTAGS:
+       here=`$(am__cd) $(top_builddir) && pwd` \
+         && $(am__cd) $(top_srcdir) \
+         && gtags -i $(GTAGS_ARGS) "$$here"
+
+distclean-tags:
+       -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+
+distdir: $(DISTFILES)
+       @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+       topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+       list='$(DISTFILES)'; \
+         dist_files=`for file in $$list; do echo $$file; done | \
+         sed -e "s|^$$srcdirstrip/||;t" \
+             -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+       case $$dist_files in \
+         */*) $(MKDIR_P) `echo "$$dist_files" | \
+                          sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+                          sort -u` ;; \
+       esac; \
+       for file in $$dist_files; do \
+         if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+         if test -d $$d/$$file; then \
+           dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+           if test -d "$(distdir)/$$file"; then \
+             find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+           fi; \
+           if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+             cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
+             find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+           fi; \
+           cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
+         else \
+           test -f "$(distdir)/$$file" \
+           || cp -p $$d/$$file "$(distdir)/$$file" \
+           || exit 1; \
+         fi; \
+       done
+check-am: all-am
+check: check-am
+all-am: Makefile $(LTLIBRARIES) $(HEADERS)
+installdirs:
+       for dir in "$(DESTDIR)$(poppler_fofi_includedir)"; do \
+         test -z "$$dir" || $(MKDIR_P) "$$dir"; \
+       done
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+       @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+       if test -z '$(STRIP)'; then \
+         $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+           install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+             install; \
+       else \
+         $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+           install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+           "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
+       fi
+mostlyclean-generic:
+
+clean-generic:
+
+distclean-generic:
+       -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+       -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
+
+maintainer-clean-generic:
+       @echo "This command is intended for maintainers to use"
+       @echo "it deletes files that may require special tools to rebuild."
+clean: clean-am
+
+clean-am: clean-generic clean-libtool clean-noinstLTLIBRARIES \
+       mostlyclean-am
+
+distclean: distclean-am
+       -rm -rf ./$(DEPDIR)
+       -rm -f Makefile
+distclean-am: clean-am distclean-compile distclean-generic \
+       distclean-tags
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+html-am:
+
+info: info-am
+
+info-am:
+
+install-data-am: install-poppler_fofi_includeHEADERS
+
+install-dvi: install-dvi-am
+
+install-dvi-am:
+
+install-exec-am:
+
+install-html: install-html-am
+
+install-html-am:
+
+install-info: install-info-am
+
+install-info-am:
+
+install-man:
+
+install-pdf: install-pdf-am
+
+install-pdf-am:
+
+install-ps: install-ps-am
+
+install-ps-am:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+       -rm -rf ./$(DEPDIR)
+       -rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-compile mostlyclean-generic \
+       mostlyclean-libtool
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am: uninstall-poppler_fofi_includeHEADERS
+
+.MAKE: install-am install-strip
+
+.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \
+       clean-libtool clean-noinstLTLIBRARIES ctags distclean \
+       distclean-compile distclean-generic distclean-libtool \
+       distclean-tags distdir dvi dvi-am html html-am info info-am \
+       install install-am install-data install-data-am install-dvi \
+       install-dvi-am install-exec install-exec-am install-html \
+       install-html-am install-info install-info-am install-man \
+       install-pdf install-pdf-am install-poppler_fofi_includeHEADERS \
+       install-ps install-ps-am install-strip installcheck \
+       installcheck-am installdirs maintainer-clean \
+       maintainer-clean-generic mostlyclean mostlyclean-compile \
+       mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \
+       tags uninstall uninstall-am \
+       uninstall-poppler_fofi_includeHEADERS
+
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/glib/CMakeLists.txt b/glib/CMakeLists.txt
new file mode 100644 (file)
index 0000000..92e23bd
--- /dev/null
@@ -0,0 +1,129 @@
+include_directories(
+  ${CMAKE_CURRENT_SOURCE_DIR}
+  ${CMAKE_CURRENT_BINARY_DIR}
+  ${GLIB2_INCLUDE_DIRS}
+  ${CAIRO_INCLUDE_DIRS}
+)
+add_definitions(
+  -DG_LOG_DOMAIN=\"Poppler\"
+  ${GLIB2_CFLAGS_OTHER}
+  ${CAIRO_CFLAGS}
+  ${POPPLER_GLIB_DISABLE_DEPRECATED}
+  ${POPPLER_GLIB_DISABLE_SINGLE_INCLUDES}
+)
+
+configure_file(poppler-features.h.cmake ${CMAKE_CURRENT_BINARY_DIR}/poppler-features.h @ONLY)
+
+if (GTK_FOUND AND BUILD_GTK_TESTS)
+  add_subdirectory(demo)
+endif (GTK_FOUND AND BUILD_GTK_TESTS)
+
+set(poppler_glib_public_headers
+  poppler-action.h
+  poppler-date.h
+  poppler-document.h
+  poppler-page.h
+  poppler-attachment.h
+  poppler-form-field.h
+  poppler-annot.h
+  poppler-layer.h
+  poppler-movie.h
+  poppler-media.h
+  poppler.h
+)
+
+find_program(GLIB2_MKENUMS glib-mkenums)
+
+add_custom_command(
+  OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/poppler-enums.h
+  COMMAND ${GLIB2_MKENUMS}
+  ARGS
+    --template poppler-enums.h.template
+    ${poppler_glib_public_headers} > ${CMAKE_CURRENT_BINARY_DIR}/poppler-enums.h
+  WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
+  DEPENDS ${poppler_glib_public_headers}
+          ${CMAKE_CURRENT_SOURCE_DIR}/poppler-enums.h.template
+)
+
+add_custom_command(
+  OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/poppler-enums.c
+  COMMAND ${GLIB2_MKENUMS}
+  ARGS
+    --template poppler-enums.c.template
+    ${poppler_glib_public_headers} > ${CMAKE_CURRENT_BINARY_DIR}/poppler-enums.c
+  WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
+  DEPENDS ${poppler_glib_public_headers} ${CMAKE_CURRENT_BINARY_DIR}/poppler-enums.h
+          ${CMAKE_CURRENT_SOURCE_DIR}/poppler-enums.c.template
+)
+
+
+set(poppler_glib_SRCS
+  poppler-action.cc
+  poppler-date.cc
+  poppler-document.cc
+  poppler-page.cc
+  poppler-attachment.cc
+  poppler-form-field.cc
+  poppler-annot.cc
+  poppler-layer.cc
+  poppler-movie.cc
+  poppler-media.cc
+  poppler.cc
+)
+set(poppler_glib_generated_SRCS
+  ${CMAKE_CURRENT_BINARY_DIR}/poppler-enums.c
+  ${CMAKE_SOURCE_DIR}/poppler/CairoFontEngine.cc
+  ${CMAKE_SOURCE_DIR}/poppler/CairoOutputDev.cc
+  ${CMAKE_SOURCE_DIR}/poppler/CairoRescaleBox.cc
+)
+add_library(poppler-glib SHARED ${poppler_glib_SRCS} ${poppler_glib_generated_SRCS})
+set_target_properties(poppler-glib PROPERTIES VERSION 8.4.0 SOVERSION 8)
+target_link_libraries(poppler-glib poppler ${GLIB2_LIBRARIES} ${CAIRO_LIBRARIES} ${FREETYPE_LIBRARIES})
+install(TARGETS poppler-glib RUNTIME DESTINATION bin LIBRARY DESTINATION lib${LIB_SUFFIX} ARCHIVE DESTINATION lib${LIB_SUFFIX})
+
+install(FILES
+  ${poppler_glib_public_headers}
+  ${CMAKE_CURRENT_BINARY_DIR}/poppler-enums.h
+  ${CMAKE_CURRENT_BINARY_DIR}/poppler-features.h
+  DESTINATION include/poppler/glib)
+
+set_directory_properties(PROPERTIES ADDITIONAL_MAKE_CLEAN_FILES
+  "${CMAKE_CURRENT_BINARY_DIR}/poppler-enums.h ${CMAKE_CURRENT_BINARY_DIR}/poppler-enums.c"
+)
+
+
+macro(_list_prefix _outvar _listvar _prefix)
+  set(${_outvar})
+  foreach(_item IN LISTS ${_listvar})
+    list(APPEND ${_outvar} ${_prefix}${_item})
+  endforeach()
+endmacro(_list_prefix)
+
+# GObject Introspection
+if (HAVE_INTROSPECTION)
+  include(GObjectIntrospectionMacros)
+  set(INTROSPECTION_GIRS)
+  set(INTROSPECTION_SCANNER_ARGS "--add-include-path=${CMAKE_CURRENT_SOURCE_DIR}")
+  set(INTROSPECTION_COMPILER_ARGS "--includedir=${CMAKE_CURRENT_SOURCE_DIR}")
+
+  set(introspection_files ${poppler_glib_SRCS} ${poppler_glib_public_headers})
+  set(Poppler_0_18_gir "poppler-glib")
+  set(Poppler_0_18_gir_INCLUDES GObject-2.0 cairo-1.0)
+  get_directory_property(_tmp_includes INCLUDE_DIRECTORIES)
+  _list_prefix(_includes _tmp_includes "-I")
+  set(Poppler_0_18_gir_CFLAGS ${_includes})
+  set(Poppler_0_18_gir_LIBS poppler-glib)
+  _list_prefix(_abs_introspection_files introspection_files "${CMAKE_CURRENT_SOURCE_DIR}/")
+  list(APPEND _abs_introspection_files
+    ${CMAKE_CURRENT_BINARY_DIR}/poppler-enums.c
+    ${CMAKE_CURRENT_BINARY_DIR}/poppler-enums.h
+    ${CMAKE_CURRENT_BINARY_DIR}/poppler-features.h
+  )
+  set(Poppler_0_18_gir_FILES ${_abs_introspection_files})
+  set(Poppler_0_18_gir_SCANNERFLAGS --c-include poppler.h)
+  set(Poppler_0_18_gir_EXPORT_PACKAGES poppler-glib)
+
+  list(APPEND INTROSPECTION_GIRS Poppler-0.18.gir)
+
+  gir_add_introspections(INTROSPECTION_GIRS)
+endif ()
diff --git a/glib/Makefile.am b/glib/Makefile.am
new file mode 100644 (file)
index 0000000..83c724f
--- /dev/null
@@ -0,0 +1,112 @@
+AM_LDFLAGS = @auto_import_flags@
+
+SUBDIRS = . reference demo
+INCLUDES =                                     \
+       -DG_LOG_DOMAIN=\"Poppler\"              \
+       -I$(top_srcdir)                         \
+       -I$(top_srcdir)/poppler                 \
+       $(POPPLER_GLIB_CFLAGS)                  \
+       $(FREETYPE_CFLAGS)                      \
+       $(FONTCONFIG_CFLAGS)                    \
+       $(POPPLER_GLIB_DISABLE_DEPRECATED)      \
+       $(POPPLER_GLIB_DISABLE_SINGLE_INCLUDES)
+
+stamp_files = stamp-poppler-enums.h
+
+poppler-enums.h: stamp-poppler-enums.h
+       @true
+
+stamp-poppler-enums.h: poppler-enums.h.template $(poppler_glib_public_headers)
+       $(AM_V_GEN) $(GLIB_MKENUMS) --template $< $(filter-out $<,$^) > xgen-etbh \
+       && (cmp -s xgen-etbh poppler-enums.h || cp xgen-etbh poppler-enums.h ) \
+       && rm -f xgen-etbh \
+       && echo timestamp > $(@F)
+
+poppler-enums.c: poppler-enums.c.template $(poppler_glib_public_headers)
+       $(AM_V_GEN) $(GLIB_MKENUMS) --template $< $(filter-out $<,$^) > xgen-etbc \
+       && (cmp -s xgen-etbc poppler-enums.c || cp xgen-etbc poppler-enums.c ) \
+       && rm -f xgen-etbc
+
+EXTRA_DIST = \
+       poppler-enums.h.template        \
+       poppler-enums.c.template
+
+poppler_glib_public_headers =                  \
+       poppler-action.h                        \
+       poppler-date.h                          \
+       poppler-document.h                      \
+       poppler-page.h                          \
+       poppler-attachment.h                    \
+       poppler-form-field.h                    \
+       poppler-annot.h                         \
+       poppler-layer.h                         \
+       poppler-media.h                         \
+       poppler-movie.h                         \
+       poppler.h
+
+poppler_glib_includedir = $(includedir)/poppler/glib
+
+poppler_glib_include_HEADERS =                 \
+       $(poppler_glib_public_headers)          \
+       poppler-enums.h
+nodist_poppler_glib_include_HEADERS = poppler-features.h
+
+lib_LTLIBRARIES = libpoppler-glib.la
+libpoppler_glib_la_SOURCES =                   \
+       $(BUILT_SOURCES)                        \
+       poppler-action.cc                       \
+       poppler-date.cc                         \
+       poppler-document.cc                     \
+       poppler-page.cc                         \
+       poppler-attachment.cc                   \
+       poppler-form-field.cc                   \
+       poppler-annot.cc                        \
+       poppler-layer.cc                        \
+       poppler-media.cc                        \
+       poppler-movie.cc                        \
+       poppler.cc                              \
+       poppler-private.h
+
+libpoppler_glib_la_LIBADD =                            \
+       $(top_builddir)/poppler/libpoppler.la           \
+       $(top_builddir)/poppler/libpoppler-cairo.la     \
+       $(POPPLER_GLIB_LIBS)                            \
+       $(FREETYPE_LIBS)                                \
+       $(FONTCONFIG_LIBS)
+
+libpoppler_glib_la_LDFLAGS = -version-info 12:0:4 @create_shared_lib@ @auto_import_flags@
+
+BUILT_SOURCES =                                        \
+       poppler-enums.c                         \
+       poppler-enums.h
+
+CLEANFILES = $(BUILT_SOURCES) $(stamp_files)
+DISTCLEANFILES = $(BUILT_SOURCES) $(stamp_files)
+MAINTAINERCLEANFILES = $(BUILT_SOURCES) $(stamp_files)
+
+# GObject Introspection
+if HAVE_INTROSPECTION
+-include $(INTROSPECTION_MAKEFILE)
+INTROSPECTION_GIRS =
+INTROSPECTION_SCANNER_ARGS = --add-include-path=$(srcdir)
+INTROSPECTION_COMPILER_ARGS = --includedir=$(srcdir)
+
+introspection_files = $(filter-out poppler-private.h, $(libpoppler_glib_la_SOURCES)) $(poppler_glib_include_HEADERS) $(nodist_poppler_glib_include_HEADERS)
+Poppler-0.18.gir: libpoppler-glib.la
+Poppler_0_18_gir_INCLUDES = GObject-2.0 cairo-1.0
+Poppler_0_18_gir_CFLAGS = $(INCLUDES) -I$(top_builddir)
+Poppler_0_18_gir_LIBS = libpoppler-glib.la
+Poppler_0_18_gir_FILES = $(introspection_files)
+Poppler_0_18_gir_SCANNERFLAGS = --c-include poppler.h
+Poppler_0_18_gir_EXPORT_PACKAGES = poppler-glib
+
+INTROSPECTION_GIRS += Poppler-0.18.gir
+
+girdir = $(datadir)/gir-1.0
+dist_gir_DATA = $(INTROSPECTION_GIRS)
+
+typelibsdir = $(libdir)/girepository-1.0
+typelibs_DATA = $(INTROSPECTION_GIRS:.gir=.typelib)
+
+CLEANFILES += $(dist_gir_DATA) $(typelibs_DATA)
+endif #HAVE_INTROSPECTION
diff --git a/glib/Makefile.in b/glib/Makefile.in
new file mode 100644 (file)
index 0000000..8fa399c
--- /dev/null
@@ -0,0 +1,1080 @@
+# Makefile.in generated by automake 1.11.5 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software
+# Foundation, Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+@SET_MAKE@
+
+
+
+VPATH = @srcdir@
+am__make_dryrun = \
+  { \
+    am__dry=no; \
+    case $$MAKEFLAGS in \
+      *\\[\ \  ]*) \
+        echo 'am--echo: ; @echo "AM"  OK' | $(MAKE) -f - 2>/dev/null \
+          | grep '^AM OK$$' >/dev/null || am__dry=yes;; \
+      *) \
+        for am__flg in $$MAKEFLAGS; do \
+          case $$am__flg in \
+            *=*|--*) ;; \
+            *n*) am__dry=yes; break;; \
+          esac; \
+        done;; \
+    esac; \
+    test $$am__dry = yes; \
+  }
+pkgdatadir = $(datadir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkglibexecdir = $(libexecdir)/@PACKAGE@
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+@HAVE_INTROSPECTION_TRUE@am__append_1 = $(dist_gir_DATA) $(typelibs_DATA)
+subdir = glib
+DIST_COMMON = $(am__dist_gir_DATA_DIST) \
+       $(poppler_glib_include_HEADERS) $(srcdir)/Makefile.am \
+       $(srcdir)/Makefile.in $(srcdir)/poppler-features.h.in
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/m4/acx_pthread.m4 \
+       $(top_srcdir)/m4/define-dir.m4 $(top_srcdir)/m4/gtk-doc.m4 \
+       $(top_srcdir)/m4/iconv.m4 $(top_srcdir)/m4/introspection.m4 \
+       $(top_srcdir)/m4/libjpeg.m4 $(top_srcdir)/m4/libtool.m4 \
+       $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \
+       $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \
+       $(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+       $(ACLOCAL_M4)
+mkinstalldirs = $(install_sh) -d
+CONFIG_HEADER = $(top_builddir)/config.h \
+       $(top_builddir)/poppler/poppler-config.h
+CONFIG_CLEAN_FILES = poppler-features.h
+CONFIG_CLEAN_VPATH_FILES =
+am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
+am__vpath_adj = case $$p in \
+    $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
+    *) f=$$p;; \
+  esac;
+am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`;
+am__install_max = 40
+am__nobase_strip_setup = \
+  srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'`
+am__nobase_strip = \
+  for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||"
+am__nobase_list = $(am__nobase_strip_setup); \
+  for p in $$list; do echo "$$p $$p"; done | \
+  sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \
+  $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \
+    if (++n[$$2] == $(am__install_max)) \
+      { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \
+    END { for (dir in files) print dir, files[dir] }'
+am__base_list = \
+  sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
+  sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
+am__uninstall_files_from_dir = { \
+  test -z "$$files" \
+    || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \
+    || { echo " ( cd '$$dir' && rm -f" $$files ")"; \
+         $(am__cd) "$$dir" && rm -f $$files; }; \
+  }
+am__installdirs = "$(DESTDIR)$(libdir)" "$(DESTDIR)$(girdir)" \
+       "$(DESTDIR)$(typelibsdir)" \
+       "$(DESTDIR)$(poppler_glib_includedir)" \
+       "$(DESTDIR)$(poppler_glib_includedir)"
+LTLIBRARIES = $(lib_LTLIBRARIES)
+am__DEPENDENCIES_1 =
+libpoppler_glib_la_DEPENDENCIES =  \
+       $(top_builddir)/poppler/libpoppler.la \
+       $(top_builddir)/poppler/libpoppler-cairo.la \
+       $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
+       $(am__DEPENDENCIES_1)
+am__objects_1 = poppler-enums.lo
+am_libpoppler_glib_la_OBJECTS = $(am__objects_1) poppler-action.lo \
+       poppler-date.lo poppler-document.lo poppler-page.lo \
+       poppler-attachment.lo poppler-form-field.lo poppler-annot.lo \
+       poppler-layer.lo poppler-media.lo poppler-movie.lo poppler.lo
+libpoppler_glib_la_OBJECTS = $(am_libpoppler_glib_la_OBJECTS)
+AM_V_lt = $(am__v_lt_@AM_V@)
+am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@)
+am__v_lt_0 = --silent
+libpoppler_glib_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX \
+       $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CXXLD) \
+       $(AM_CXXFLAGS) $(CXXFLAGS) $(libpoppler_glib_la_LDFLAGS) \
+       $(LDFLAGS) -o $@
+DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) -I$(top_builddir)/poppler
+depcomp = $(SHELL) $(top_srcdir)/depcomp
+am__depfiles_maybe = depfiles
+am__mv = mv -f
+COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
+       $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
+LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
+       $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \
+       $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
+       $(AM_CFLAGS) $(CFLAGS)
+AM_V_CC = $(am__v_CC_@AM_V@)
+am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@)
+am__v_CC_0 = @echo "  CC    " $@;
+AM_V_at = $(am__v_at_@AM_V@)
+am__v_at_ = $(am__v_at_@AM_DEFAULT_V@)
+am__v_at_0 = @
+CCLD = $(CC)
+LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
+       $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
+       $(AM_LDFLAGS) $(LDFLAGS) -o $@
+AM_V_CCLD = $(am__v_CCLD_@AM_V@)
+am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@)
+am__v_CCLD_0 = @echo "  CCLD  " $@;
+CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
+       $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)
+LTCXXCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \
+       $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) \
+       $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
+       $(AM_CXXFLAGS) $(CXXFLAGS)
+AM_V_CXX = $(am__v_CXX_@AM_V@)
+am__v_CXX_ = $(am__v_CXX_@AM_DEFAULT_V@)
+am__v_CXX_0 = @echo "  CXX   " $@;
+CXXLD = $(CXX)
+CXXLINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \
+       $(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \
+       $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
+AM_V_CXXLD = $(am__v_CXXLD_@AM_V@)
+am__v_CXXLD_ = $(am__v_CXXLD_@AM_DEFAULT_V@)
+am__v_CXXLD_0 = @echo "  CXXLD " $@;
+AM_V_GEN = $(am__v_GEN_@AM_V@)
+am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@)
+am__v_GEN_0 = @echo "  GEN   " $@;
+SOURCES = $(libpoppler_glib_la_SOURCES)
+DIST_SOURCES = $(libpoppler_glib_la_SOURCES)
+RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \
+       html-recursive info-recursive install-data-recursive \
+       install-dvi-recursive install-exec-recursive \
+       install-html-recursive install-info-recursive \
+       install-pdf-recursive install-ps-recursive install-recursive \
+       installcheck-recursive installdirs-recursive pdf-recursive \
+       ps-recursive uninstall-recursive
+am__can_run_installinfo = \
+  case $$AM_UPDATE_INFO_DIR in \
+    n|no|NO) false;; \
+    *) (install-info --version) >/dev/null 2>&1;; \
+  esac
+am__dist_gir_DATA_DIST = Poppler-0.18.gir
+DATA = $(dist_gir_DATA) $(typelibs_DATA)
+HEADERS = $(nodist_poppler_glib_include_HEADERS) \
+       $(poppler_glib_include_HEADERS)
+RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive        \
+  distclean-recursive maintainer-clean-recursive
+AM_RECURSIVE_TARGETS = $(RECURSIVE_TARGETS:-recursive=) \
+       $(RECURSIVE_CLEAN_TARGETS:-recursive=) tags TAGS ctags CTAGS \
+       distdir
+ETAGS = etags
+CTAGS = ctags
+DIST_SUBDIRS = $(SUBDIRS)
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+am__relativize = \
+  dir0=`pwd`; \
+  sed_first='s,^\([^/]*\)/.*$$,\1,'; \
+  sed_rest='s,^[^/]*/*,,'; \
+  sed_last='s,^.*/\([^/]*\)$$,\1,'; \
+  sed_butlast='s,/*[^/]*$$,,'; \
+  while test -n "$$dir1"; do \
+    first=`echo "$$dir1" | sed -e "$$sed_first"`; \
+    if test "$$first" != "."; then \
+      if test "$$first" = ".."; then \
+        dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \
+        dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \
+      else \
+        first2=`echo "$$dir2" | sed -e "$$sed_first"`; \
+        if test "$$first2" = "$$first"; then \
+          dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \
+        else \
+          dir2="../$$dir2"; \
+        fi; \
+        dir0="$$dir0"/"$$first"; \
+      fi; \
+    fi; \
+    dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \
+  done; \
+  reldir="$$dir2"
+ACLOCAL = @ACLOCAL@
+AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AR = @AR@
+AS = @AS@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CAIRO_CFLAGS = @CAIRO_CFLAGS@
+CAIRO_FEATURE = @CAIRO_FEATURE@
+CAIRO_LIBS = @CAIRO_LIBS@
+CAIRO_REQ = @CAIRO_REQ@
+CAIRO_VERSION = @CAIRO_VERSION@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CXX = @CXX@
+CXXCPP = @CXXCPP@
+CXXDEPMODE = @CXXDEPMODE@
+CXXFLAGS = @CXXFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DLLTOOL = @DLLTOOL@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+FGREP = @FGREP@
+FONTCONFIG_CFLAGS = @FONTCONFIG_CFLAGS@
+FONTCONFIG_LIBS = @FONTCONFIG_LIBS@
+FREETYPE_CFLAGS = @FREETYPE_CFLAGS@
+FREETYPE_CONFIG = @FREETYPE_CONFIG@
+FREETYPE_LIBS = @FREETYPE_LIBS@
+GLIB_MKENUMS = @GLIB_MKENUMS@
+GLIB_REQ = @GLIB_REQ@
+GLIB_REQUIRED = @GLIB_REQUIRED@
+GREP = @GREP@
+GTKDOC_CHECK = @GTKDOC_CHECK@
+GTKDOC_DEPS_CFLAGS = @GTKDOC_DEPS_CFLAGS@
+GTKDOC_DEPS_LIBS = @GTKDOC_DEPS_LIBS@
+GTKDOC_MKPDF = @GTKDOC_MKPDF@
+GTKDOC_REBASE = @GTKDOC_REBASE@
+GTK_TEST_CFLAGS = @GTK_TEST_CFLAGS@
+GTK_TEST_LIBS = @GTK_TEST_LIBS@
+HTML_DIR = @HTML_DIR@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+INTROSPECTION_CFLAGS = @INTROSPECTION_CFLAGS@
+INTROSPECTION_COMPILER = @INTROSPECTION_COMPILER@
+INTROSPECTION_GENERATE = @INTROSPECTION_GENERATE@
+INTROSPECTION_GIRDIR = @INTROSPECTION_GIRDIR@
+INTROSPECTION_LIBS = @INTROSPECTION_LIBS@
+INTROSPECTION_MAKEFILE = @INTROSPECTION_MAKEFILE@
+INTROSPECTION_SCANNER = @INTROSPECTION_SCANNER@
+INTROSPECTION_TYPELIBDIR = @INTROSPECTION_TYPELIBDIR@
+LCMS_CFLAGS = @LCMS_CFLAGS@
+LCMS_LIBS = @LCMS_LIBS@
+LD = @LD@
+LDFLAGS = @LDFLAGS@
+LIBCURL_CFLAGS = @LIBCURL_CFLAGS@
+LIBCURL_LIBS = @LIBCURL_LIBS@
+LIBICONV = @LIBICONV@
+LIBJPEG_CFLAGS = @LIBJPEG_CFLAGS@
+LIBJPEG_LIBS = @LIBJPEG_LIBS@
+LIBOBJS = @LIBOBJS@
+LIBOPENJPEG_CFLAGS = @LIBOPENJPEG_CFLAGS@
+LIBOPENJPEG_LIBS = @LIBOPENJPEG_LIBS@
+LIBPNG_CFLAGS = @LIBPNG_CFLAGS@
+LIBPNG_LIBS = @LIBPNG_LIBS@
+LIBS = @LIBS@
+LIBTIFF_CFLAGS = @LIBTIFF_CFLAGS@
+LIBTIFF_CFLAGSS = @LIBTIFF_CFLAGSS@
+LIBTIFF_LIBS = @LIBTIFF_LIBS@
+LIBTOOL = @LIBTOOL@
+LIPO = @LIPO@
+LN_S = @LN_S@
+LTLIBICONV = @LTLIBICONV@
+LTLIBOBJS = @LTLIBOBJS@
+MAKEINFO = @MAKEINFO@
+MANIFEST_TOOL = @MANIFEST_TOOL@
+MKDIR_P = @MKDIR_P@
+MOCQT4 = @MOCQT4@
+NM = @NM@
+NMEDIT = @NMEDIT@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+OTOOL = @OTOOL@
+OTOOL64 = @OTOOL64@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_URL = @PACKAGE_URL@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PC_REQUIRES = @PC_REQUIRES@
+PC_REQUIRES_PRIVATE = @PC_REQUIRES_PRIVATE@
+PDFTOCAIRO_CFLAGS = @PDFTOCAIRO_CFLAGS@
+PDFTOCAIRO_LIBS = @PDFTOCAIRO_LIBS@
+PKG_CONFIG = @PKG_CONFIG@
+PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@
+PKG_CONFIG_PATH = @PKG_CONFIG_PATH@
+POPPLER_DATADIR = @POPPLER_DATADIR@
+POPPLER_GLIB_CFLAGS = @POPPLER_GLIB_CFLAGS@
+POPPLER_GLIB_DISABLE_DEPRECATED = @POPPLER_GLIB_DISABLE_DEPRECATED@
+POPPLER_GLIB_DISABLE_SINGLE_INCLUDES = @POPPLER_GLIB_DISABLE_SINGLE_INCLUDES@
+POPPLER_GLIB_LIBS = @POPPLER_GLIB_LIBS@
+POPPLER_MAJOR_VERSION = @POPPLER_MAJOR_VERSION@
+POPPLER_MICRO_VERSION = @POPPLER_MICRO_VERSION@
+POPPLER_MINOR_VERSION = @POPPLER_MINOR_VERSION@
+POPPLER_QT4_CFLAGS = @POPPLER_QT4_CFLAGS@
+POPPLER_QT4_CXXFLAGS = @POPPLER_QT4_CXXFLAGS@
+POPPLER_QT4_LIBS = @POPPLER_QT4_LIBS@
+POPPLER_QT4_TEST_CFLAGS = @POPPLER_QT4_TEST_CFLAGS@
+POPPLER_QT4_TEST_LIBS = @POPPLER_QT4_TEST_LIBS@
+POPPLER_VERSION = @POPPLER_VERSION@
+PTHREAD_CC = @PTHREAD_CC@
+PTHREAD_CFLAGS = @PTHREAD_CFLAGS@
+PTHREAD_LIBS = @PTHREAD_LIBS@
+RANLIB = @RANLIB@
+SED = @SED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+TESTDATADIR = @TESTDATADIR@
+VERSION = @VERSION@
+XMKMF = @XMKMF@
+X_CFLAGS = @X_CFLAGS@
+X_EXTRA_LIBS = @X_EXTRA_LIBS@
+X_LIBS = @X_LIBS@
+X_PRE_LIBS = @X_PRE_LIBS@
+ZLIB_LIBS = @ZLIB_LIBS@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
+ac_ct_AR = @ac_ct_AR@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_CXX = @ac_ct_CXX@
+ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
+acx_pthread_config = @acx_pthread_config@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+auto_import_flags = @auto_import_flags@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+builddir = @builddir@
+create_shared_lib = @create_shared_lib@
+datadir = @datadir@
+datarootdir = @datarootdir@
+docdir = @docdir@
+dvidir = @dvidir@
+exec_prefix = @exec_prefix@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+htmldir = @htmldir@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localedir = @localedir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+srcdir = @srcdir@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+top_build_prefix = @top_build_prefix@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+win32_libs = @win32_libs@
+AM_LDFLAGS = @auto_import_flags@
+SUBDIRS = . reference demo
+INCLUDES = \
+       -DG_LOG_DOMAIN=\"Poppler\"              \
+       -I$(top_srcdir)                         \
+       -I$(top_srcdir)/poppler                 \
+       $(POPPLER_GLIB_CFLAGS)                  \
+       $(FREETYPE_CFLAGS)                      \
+       $(FONTCONFIG_CFLAGS)                    \
+       $(POPPLER_GLIB_DISABLE_DEPRECATED)      \
+       $(POPPLER_GLIB_DISABLE_SINGLE_INCLUDES)
+
+stamp_files = stamp-poppler-enums.h
+EXTRA_DIST = \
+       poppler-enums.h.template        \
+       poppler-enums.c.template
+
+poppler_glib_public_headers = \
+       poppler-action.h                        \
+       poppler-date.h                          \
+       poppler-document.h                      \
+       poppler-page.h                          \
+       poppler-attachment.h                    \
+       poppler-form-field.h                    \
+       poppler-annot.h                         \
+       poppler-layer.h                         \
+       poppler-media.h                         \
+       poppler-movie.h                         \
+       poppler.h
+
+poppler_glib_includedir = $(includedir)/poppler/glib
+poppler_glib_include_HEADERS = \
+       $(poppler_glib_public_headers)          \
+       poppler-enums.h
+
+nodist_poppler_glib_include_HEADERS = poppler-features.h
+lib_LTLIBRARIES = libpoppler-glib.la
+libpoppler_glib_la_SOURCES = \
+       $(BUILT_SOURCES)                        \
+       poppler-action.cc                       \
+       poppler-date.cc                         \
+       poppler-document.cc                     \
+       poppler-page.cc                         \
+       poppler-attachment.cc                   \
+       poppler-form-field.cc                   \
+       poppler-annot.cc                        \
+       poppler-layer.cc                        \
+       poppler-media.cc                        \
+       poppler-movie.cc                        \
+       poppler.cc                              \
+       poppler-private.h
+
+libpoppler_glib_la_LIBADD = \
+       $(top_builddir)/poppler/libpoppler.la           \
+       $(top_builddir)/poppler/libpoppler-cairo.la     \
+       $(POPPLER_GLIB_LIBS)                            \
+       $(FREETYPE_LIBS)                                \
+       $(FONTCONFIG_LIBS)
+
+libpoppler_glib_la_LDFLAGS = -version-info 12:0:4 @create_shared_lib@ @auto_import_flags@
+BUILT_SOURCES = \
+       poppler-enums.c                         \
+       poppler-enums.h
+
+CLEANFILES = $(BUILT_SOURCES) $(stamp_files) $(am__append_1)
+DISTCLEANFILES = $(BUILT_SOURCES) $(stamp_files)
+MAINTAINERCLEANFILES = $(BUILT_SOURCES) $(stamp_files)
+@HAVE_INTROSPECTION_TRUE@INTROSPECTION_GIRS = Poppler-0.18.gir
+@HAVE_INTROSPECTION_TRUE@INTROSPECTION_SCANNER_ARGS = --add-include-path=$(srcdir)
+@HAVE_INTROSPECTION_TRUE@INTROSPECTION_COMPILER_ARGS = --includedir=$(srcdir)
+@HAVE_INTROSPECTION_TRUE@introspection_files = $(filter-out poppler-private.h, $(libpoppler_glib_la_SOURCES)) $(poppler_glib_include_HEADERS) $(nodist_poppler_glib_include_HEADERS)
+@HAVE_INTROSPECTION_TRUE@Poppler_0_18_gir_INCLUDES = GObject-2.0 cairo-1.0
+@HAVE_INTROSPECTION_TRUE@Poppler_0_18_gir_CFLAGS = $(INCLUDES) -I$(top_builddir)
+@HAVE_INTROSPECTION_TRUE@Poppler_0_18_gir_LIBS = libpoppler-glib.la
+@HAVE_INTROSPECTION_TRUE@Poppler_0_18_gir_FILES = $(introspection_files)
+@HAVE_INTROSPECTION_TRUE@Poppler_0_18_gir_SCANNERFLAGS = --c-include poppler.h
+@HAVE_INTROSPECTION_TRUE@Poppler_0_18_gir_EXPORT_PACKAGES = poppler-glib
+@HAVE_INTROSPECTION_TRUE@girdir = $(datadir)/gir-1.0
+@HAVE_INTROSPECTION_TRUE@dist_gir_DATA = $(INTROSPECTION_GIRS)
+@HAVE_INTROSPECTION_TRUE@typelibsdir = $(libdir)/girepository-1.0
+@HAVE_INTROSPECTION_TRUE@typelibs_DATA = $(INTROSPECTION_GIRS:.gir=.typelib)
+all: $(BUILT_SOURCES)
+       $(MAKE) $(AM_MAKEFLAGS) all-recursive
+
+.SUFFIXES:
+.SUFFIXES: .c .cc .lo .o .obj
+$(srcdir)/Makefile.in:  $(srcdir)/Makefile.am  $(am__configure_deps)
+       @for dep in $?; do \
+         case '$(am__configure_deps)' in \
+           *$$dep*) \
+             ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
+               && { if test -f $@; then exit 0; else break; fi; }; \
+             exit 1;; \
+         esac; \
+       done; \
+       echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign glib/Makefile'; \
+       $(am__cd) $(top_srcdir) && \
+         $(AUTOMAKE) --foreign glib/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+       @case '$?' in \
+         *config.status*) \
+           cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+         *) \
+           echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+           cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+       esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+       cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure:  $(am__configure_deps)
+       cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4):  $(am__aclocal_m4_deps)
+       cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(am__aclocal_m4_deps):
+poppler-features.h: $(top_builddir)/config.status $(srcdir)/poppler-features.h.in
+       cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@
+install-libLTLIBRARIES: $(lib_LTLIBRARIES)
+       @$(NORMAL_INSTALL)
+       @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \
+       list2=; for p in $$list; do \
+         if test -f $$p; then \
+           list2="$$list2 $$p"; \
+         else :; fi; \
+       done; \
+       test -z "$$list2" || { \
+         echo " $(MKDIR_P) '$(DESTDIR)$(libdir)'"; \
+         $(MKDIR_P) "$(DESTDIR)$(libdir)" || exit 1; \
+         echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(libdir)'"; \
+         $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(libdir)"; \
+       }
+
+uninstall-libLTLIBRARIES:
+       @$(NORMAL_UNINSTALL)
+       @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \
+       for p in $$list; do \
+         $(am__strip_dir) \
+         echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(libdir)/$$f'"; \
+         $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(libdir)/$$f"; \
+       done
+
+clean-libLTLIBRARIES:
+       -test -z "$(lib_LTLIBRARIES)" || rm -f $(lib_LTLIBRARIES)
+       @list='$(lib_LTLIBRARIES)'; for p in $$list; do \
+         dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \
+         test "$$dir" != "$$p" || dir=.; \
+         echo "rm -f \"$${dir}/so_locations\""; \
+         rm -f "$${dir}/so_locations"; \
+       done
+libpoppler-glib.la: $(libpoppler_glib_la_OBJECTS) $(libpoppler_glib_la_DEPENDENCIES) $(EXTRA_libpoppler_glib_la_DEPENDENCIES) 
+       $(AM_V_CXXLD)$(libpoppler_glib_la_LINK) -rpath $(libdir) $(libpoppler_glib_la_OBJECTS) $(libpoppler_glib_la_LIBADD) $(LIBS)
+
+mostlyclean-compile:
+       -rm -f *.$(OBJEXT)
+
+distclean-compile:
+       -rm -f *.tab.c
+
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/poppler-action.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/poppler-annot.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/poppler-attachment.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/poppler-date.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/poppler-document.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/poppler-enums.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/poppler-form-field.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/poppler-layer.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/poppler-media.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/poppler-movie.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/poppler-page.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/poppler.Plo@am__quote@
+
+.c.o:
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(COMPILE) -c $<
+
+.c.obj:
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'`
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(COMPILE) -c `$(CYGPATH_W) '$<'`
+
+.c.lo:
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $<
+
+.cc.o:
+@am__fastdepCXX_TRUE@  $(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
+@am__fastdepCXX_TRUE@  $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ $<
+
+.cc.obj:
+@am__fastdepCXX_TRUE@  $(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'`
+@am__fastdepCXX_TRUE@  $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
+
+.cc.lo:
+@am__fastdepCXX_TRUE@  $(AM_V_CXX)$(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
+@am__fastdepCXX_TRUE@  $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     $(AM_V_CXX)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LTCXXCOMPILE) -c -o $@ $<
+
+mostlyclean-libtool:
+       -rm -f *.lo
+
+clean-libtool:
+       -rm -rf .libs _libs
+install-dist_girDATA: $(dist_gir_DATA)
+       @$(NORMAL_INSTALL)
+       @list='$(dist_gir_DATA)'; test -n "$(girdir)" || list=; \
+       if test -n "$$list"; then \
+         echo " $(MKDIR_P) '$(DESTDIR)$(girdir)'"; \
+         $(MKDIR_P) "$(DESTDIR)$(girdir)" || exit 1; \
+       fi; \
+       for p in $$list; do \
+         if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+         echo "$$d$$p"; \
+       done | $(am__base_list) | \
+       while read files; do \
+         echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(girdir)'"; \
+         $(INSTALL_DATA) $$files "$(DESTDIR)$(girdir)" || exit $$?; \
+       done
+
+uninstall-dist_girDATA:
+       @$(NORMAL_UNINSTALL)
+       @list='$(dist_gir_DATA)'; test -n "$(girdir)" || list=; \
+       files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
+       dir='$(DESTDIR)$(girdir)'; $(am__uninstall_files_from_dir)
+install-typelibsDATA: $(typelibs_DATA)
+       @$(NORMAL_INSTALL)
+       @list='$(typelibs_DATA)'; test -n "$(typelibsdir)" || list=; \
+       if test -n "$$list"; then \
+         echo " $(MKDIR_P) '$(DESTDIR)$(typelibsdir)'"; \
+         $(MKDIR_P) "$(DESTDIR)$(typelibsdir)" || exit 1; \
+       fi; \
+       for p in $$list; do \
+         if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+         echo "$$d$$p"; \
+       done | $(am__base_list) | \
+       while read files; do \
+         echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(typelibsdir)'"; \
+         $(INSTALL_DATA) $$files "$(DESTDIR)$(typelibsdir)" || exit $$?; \
+       done
+
+uninstall-typelibsDATA:
+       @$(NORMAL_UNINSTALL)
+       @list='$(typelibs_DATA)'; test -n "$(typelibsdir)" || list=; \
+       files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
+       dir='$(DESTDIR)$(typelibsdir)'; $(am__uninstall_files_from_dir)
+install-nodist_poppler_glib_includeHEADERS: $(nodist_poppler_glib_include_HEADERS)
+       @$(NORMAL_INSTALL)
+       @list='$(nodist_poppler_glib_include_HEADERS)'; test -n "$(poppler_glib_includedir)" || list=; \
+       if test -n "$$list"; then \
+         echo " $(MKDIR_P) '$(DESTDIR)$(poppler_glib_includedir)'"; \
+         $(MKDIR_P) "$(DESTDIR)$(poppler_glib_includedir)" || exit 1; \
+       fi; \
+       for p in $$list; do \
+         if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+         echo "$$d$$p"; \
+       done | $(am__base_list) | \
+       while read files; do \
+         echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(poppler_glib_includedir)'"; \
+         $(INSTALL_HEADER) $$files "$(DESTDIR)$(poppler_glib_includedir)" || exit $$?; \
+       done
+
+uninstall-nodist_poppler_glib_includeHEADERS:
+       @$(NORMAL_UNINSTALL)
+       @list='$(nodist_poppler_glib_include_HEADERS)'; test -n "$(poppler_glib_includedir)" || list=; \
+       files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
+       dir='$(DESTDIR)$(poppler_glib_includedir)'; $(am__uninstall_files_from_dir)
+install-poppler_glib_includeHEADERS: $(poppler_glib_include_HEADERS)
+       @$(NORMAL_INSTALL)
+       @list='$(poppler_glib_include_HEADERS)'; test -n "$(poppler_glib_includedir)" || list=; \
+       if test -n "$$list"; then \
+         echo " $(MKDIR_P) '$(DESTDIR)$(poppler_glib_includedir)'"; \
+         $(MKDIR_P) "$(DESTDIR)$(poppler_glib_includedir)" || exit 1; \
+       fi; \
+       for p in $$list; do \
+         if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+         echo "$$d$$p"; \
+       done | $(am__base_list) | \
+       while read files; do \
+         echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(poppler_glib_includedir)'"; \
+         $(INSTALL_HEADER) $$files "$(DESTDIR)$(poppler_glib_includedir)" || exit $$?; \
+       done
+
+uninstall-poppler_glib_includeHEADERS:
+       @$(NORMAL_UNINSTALL)
+       @list='$(poppler_glib_include_HEADERS)'; test -n "$(poppler_glib_includedir)" || list=; \
+       files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
+       dir='$(DESTDIR)$(poppler_glib_includedir)'; $(am__uninstall_files_from_dir)
+
+# This directory's subdirectories are mostly independent; you can cd
+# into them and run `make' without going through this Makefile.
+# To change the values of `make' variables: instead of editing Makefiles,
+# (1) if the variable is set in `config.status', edit `config.status'
+#     (which will cause the Makefiles to be regenerated when you run `make');
+# (2) otherwise, pass the desired values on the `make' command line.
+$(RECURSIVE_TARGETS):
+       @fail= failcom='exit 1'; \
+       for f in x $$MAKEFLAGS; do \
+         case $$f in \
+           *=* | --[!k]*);; \
+           *k*) failcom='fail=yes';; \
+         esac; \
+       done; \
+       dot_seen=no; \
+       target=`echo $@ | sed s/-recursive//`; \
+       list='$(SUBDIRS)'; for subdir in $$list; do \
+         echo "Making $$target in $$subdir"; \
+         if test "$$subdir" = "."; then \
+           dot_seen=yes; \
+           local_target="$$target-am"; \
+         else \
+           local_target="$$target"; \
+         fi; \
+         ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
+         || eval $$failcom; \
+       done; \
+       if test "$$dot_seen" = "no"; then \
+         $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \
+       fi; test -z "$$fail"
+
+$(RECURSIVE_CLEAN_TARGETS):
+       @fail= failcom='exit 1'; \
+       for f in x $$MAKEFLAGS; do \
+         case $$f in \
+           *=* | --[!k]*);; \
+           *k*) failcom='fail=yes';; \
+         esac; \
+       done; \
+       dot_seen=no; \
+       case "$@" in \
+         distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \
+         *) list='$(SUBDIRS)' ;; \
+       esac; \
+       rev=''; for subdir in $$list; do \
+         if test "$$subdir" = "."; then :; else \
+           rev="$$subdir $$rev"; \
+         fi; \
+       done; \
+       rev="$$rev ."; \
+       target=`echo $@ | sed s/-recursive//`; \
+       for subdir in $$rev; do \
+         echo "Making $$target in $$subdir"; \
+         if test "$$subdir" = "."; then \
+           local_target="$$target-am"; \
+         else \
+           local_target="$$target"; \
+         fi; \
+         ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
+         || eval $$failcom; \
+       done && test -z "$$fail"
+tags-recursive:
+       list='$(SUBDIRS)'; for subdir in $$list; do \
+         test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \
+       done
+ctags-recursive:
+       list='$(SUBDIRS)'; for subdir in $$list; do \
+         test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \
+       done
+
+ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
+       list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+       unique=`for i in $$list; do \
+           if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+         done | \
+         $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
+             END { if (nonempty) { for (i in files) print i; }; }'`; \
+       mkid -fID $$unique
+tags: TAGS
+
+TAGS: tags-recursive $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
+               $(TAGS_FILES) $(LISP)
+       set x; \
+       here=`pwd`; \
+       if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \
+         include_option=--etags-include; \
+         empty_fix=.; \
+       else \
+         include_option=--include; \
+         empty_fix=; \
+       fi; \
+       list='$(SUBDIRS)'; for subdir in $$list; do \
+         if test "$$subdir" = .; then :; else \
+           test ! -f $$subdir/TAGS || \
+             set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \
+         fi; \
+       done; \
+       list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
+       unique=`for i in $$list; do \
+           if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+         done | \
+         $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
+             END { if (nonempty) { for (i in files) print i; }; }'`; \
+       shift; \
+       if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
+         test -n "$$unique" || unique=$$empty_fix; \
+         if test $$# -gt 0; then \
+           $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+             "$$@" $$unique; \
+         else \
+           $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+             $$unique; \
+         fi; \
+       fi
+ctags: CTAGS
+CTAGS: ctags-recursive $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
+               $(TAGS_FILES) $(LISP)
+       list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
+       unique=`for i in $$list; do \
+           if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+         done | \
+         $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
+             END { if (nonempty) { for (i in files) print i; }; }'`; \
+       test -z "$(CTAGS_ARGS)$$unique" \
+         || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+            $$unique
+
+GTAGS:
+       here=`$(am__cd) $(top_builddir) && pwd` \
+         && $(am__cd) $(top_srcdir) \
+         && gtags -i $(GTAGS_ARGS) "$$here"
+
+distclean-tags:
+       -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+
+distdir: $(DISTFILES)
+       @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+       topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+       list='$(DISTFILES)'; \
+         dist_files=`for file in $$list; do echo $$file; done | \
+         sed -e "s|^$$srcdirstrip/||;t" \
+             -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+       case $$dist_files in \
+         */*) $(MKDIR_P) `echo "$$dist_files" | \
+                          sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+                          sort -u` ;; \
+       esac; \
+       for file in $$dist_files; do \
+         if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+         if test -d $$d/$$file; then \
+           dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+           if test -d "$(distdir)/$$file"; then \
+             find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+           fi; \
+           if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+             cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
+             find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+           fi; \
+           cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
+         else \
+           test -f "$(distdir)/$$file" \
+           || cp -p $$d/$$file "$(distdir)/$$file" \
+           || exit 1; \
+         fi; \
+       done
+       @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \
+         if test "$$subdir" = .; then :; else \
+           $(am__make_dryrun) \
+             || test -d "$(distdir)/$$subdir" \
+             || $(MKDIR_P) "$(distdir)/$$subdir" \
+             || exit 1; \
+           dir1=$$subdir; dir2="$(distdir)/$$subdir"; \
+           $(am__relativize); \
+           new_distdir=$$reldir; \
+           dir1=$$subdir; dir2="$(top_distdir)"; \
+           $(am__relativize); \
+           new_top_distdir=$$reldir; \
+           echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \
+           echo "     am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \
+           ($(am__cd) $$subdir && \
+             $(MAKE) $(AM_MAKEFLAGS) \
+               top_distdir="$$new_top_distdir" \
+               distdir="$$new_distdir" \
+               am__remove_distdir=: \
+               am__skip_length_check=: \
+               am__skip_mode_fix=: \
+               distdir) \
+             || exit 1; \
+         fi; \
+       done
+check-am: all-am
+check: $(BUILT_SOURCES)
+       $(MAKE) $(AM_MAKEFLAGS) check-recursive
+all-am: Makefile $(LTLIBRARIES) $(DATA) $(HEADERS)
+installdirs: installdirs-recursive
+installdirs-am:
+       for dir in "$(DESTDIR)$(libdir)" "$(DESTDIR)$(girdir)" "$(DESTDIR)$(typelibsdir)" "$(DESTDIR)$(poppler_glib_includedir)" "$(DESTDIR)$(poppler_glib_includedir)"; do \
+         test -z "$$dir" || $(MKDIR_P) "$$dir"; \
+       done
+install: $(BUILT_SOURCES)
+       $(MAKE) $(AM_MAKEFLAGS) install-recursive
+install-exec: install-exec-recursive
+install-data: install-data-recursive
+uninstall: uninstall-recursive
+
+install-am: all-am
+       @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-recursive
+install-strip:
+       if test -z '$(STRIP)'; then \
+         $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+           install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+             install; \
+       else \
+         $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+           install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+           "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
+       fi
+mostlyclean-generic:
+
+clean-generic:
+       -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES)
+
+distclean-generic:
+       -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+       -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
+       -test -z "$(DISTCLEANFILES)" || rm -f $(DISTCLEANFILES)
+
+maintainer-clean-generic:
+       @echo "This command is intended for maintainers to use"
+       @echo "it deletes files that may require special tools to rebuild."
+       -test -z "$(BUILT_SOURCES)" || rm -f $(BUILT_SOURCES)
+       -test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES)
+clean: clean-recursive
+
+clean-am: clean-generic clean-libLTLIBRARIES clean-libtool \
+       mostlyclean-am
+
+distclean: distclean-recursive
+       -rm -rf ./$(DEPDIR)
+       -rm -f Makefile
+distclean-am: clean-am distclean-compile distclean-generic \
+       distclean-tags
+
+dvi: dvi-recursive
+
+dvi-am:
+
+html: html-recursive
+
+html-am:
+
+info: info-recursive
+
+info-am:
+
+install-data-am: install-dist_girDATA \
+       install-nodist_poppler_glib_includeHEADERS \
+       install-poppler_glib_includeHEADERS install-typelibsDATA
+
+install-dvi: install-dvi-recursive
+
+install-dvi-am:
+
+install-exec-am: install-libLTLIBRARIES
+
+install-html: install-html-recursive
+
+install-html-am:
+
+install-info: install-info-recursive
+
+install-info-am:
+
+install-man:
+
+install-pdf: install-pdf-recursive
+
+install-pdf-am:
+
+install-ps: install-ps-recursive
+
+install-ps-am:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-recursive
+       -rm -rf ./$(DEPDIR)
+       -rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-recursive
+
+mostlyclean-am: mostlyclean-compile mostlyclean-generic \
+       mostlyclean-libtool
+
+pdf: pdf-recursive
+
+pdf-am:
+
+ps: ps-recursive
+
+ps-am:
+
+uninstall-am: uninstall-dist_girDATA uninstall-libLTLIBRARIES \
+       uninstall-nodist_poppler_glib_includeHEADERS \
+       uninstall-poppler_glib_includeHEADERS uninstall-typelibsDATA
+
+.MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) all check \
+       ctags-recursive install install-am install-strip \
+       tags-recursive
+
+.PHONY: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) CTAGS GTAGS \
+       all all-am check check-am clean clean-generic \
+       clean-libLTLIBRARIES clean-libtool ctags ctags-recursive \
+       distclean distclean-compile distclean-generic \
+       distclean-libtool distclean-tags distdir dvi dvi-am html \
+       html-am info info-am install install-am install-data \
+       install-data-am install-dist_girDATA install-dvi \
+       install-dvi-am install-exec install-exec-am install-html \
+       install-html-am install-info install-info-am \
+       install-libLTLIBRARIES install-man \
+       install-nodist_poppler_glib_includeHEADERS install-pdf \
+       install-pdf-am install-poppler_glib_includeHEADERS install-ps \
+       install-ps-am install-strip install-typelibsDATA installcheck \
+       installcheck-am installdirs installdirs-am maintainer-clean \
+       maintainer-clean-generic mostlyclean mostlyclean-compile \
+       mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \
+       tags tags-recursive uninstall uninstall-am \
+       uninstall-dist_girDATA uninstall-libLTLIBRARIES \
+       uninstall-nodist_poppler_glib_includeHEADERS \
+       uninstall-poppler_glib_includeHEADERS uninstall-typelibsDATA
+
+
+poppler-enums.h: stamp-poppler-enums.h
+       @true
+
+stamp-poppler-enums.h: poppler-enums.h.template $(poppler_glib_public_headers)
+       $(AM_V_GEN) $(GLIB_MKENUMS) --template $< $(filter-out $<,$^) > xgen-etbh \
+       && (cmp -s xgen-etbh poppler-enums.h || cp xgen-etbh poppler-enums.h ) \
+       && rm -f xgen-etbh \
+       && echo timestamp > $(@F)
+
+poppler-enums.c: poppler-enums.c.template $(poppler_glib_public_headers)
+       $(AM_V_GEN) $(GLIB_MKENUMS) --template $< $(filter-out $<,$^) > xgen-etbc \
+       && (cmp -s xgen-etbc poppler-enums.c || cp xgen-etbc poppler-enums.c ) \
+       && rm -f xgen-etbc
+
+# GObject Introspection
+@HAVE_INTROSPECTION_TRUE@-include $(INTROSPECTION_MAKEFILE)
+@HAVE_INTROSPECTION_TRUE@Poppler-0.18.gir: libpoppler-glib.la
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/glib/Poppler-0.18.gir b/glib/Poppler-0.18.gir
new file mode 100644 (file)
index 0000000..ca61465
--- /dev/null
@@ -0,0 +1,3998 @@
+<?xml version="1.0"?>
+<!-- This file was automatically generated from C sources - DO NOT EDIT!
+To affect the contents of this file, edit the original C definitions,
+and/or use gtk-doc annotations.  -->
+<repository version="1.2"
+            xmlns="http://www.gtk.org/introspection/core/1.0"
+            xmlns:c="http://www.gtk.org/introspection/c/1.0"
+            xmlns:glib="http://www.gtk.org/introspection/glib/1.0">
+  <include name="GLib" version="2.0"/>
+  <include name="GObject" version="2.0"/>
+  <include name="cairo" version="1.0"/>
+  <package name="poppler-glib"/>
+  <c:include name="poppler.h"/>
+  <namespace name="Poppler"
+             version="0.18"
+             shared-library="libpoppler-glib.so.8"
+             c:identifier-prefixes="Poppler"
+             c:symbol-prefixes="poppler">
+    <constant name="ANNOT_TEXT_ICON_CIRCLE"
+              value="Circle"
+              c:type="POPPLER_ANNOT_TEXT_ICON_CIRCLE">
+      <type name="utf8" c:type="gchar*"/>
+    </constant>
+    <constant name="ANNOT_TEXT_ICON_COMMENT"
+              value="Comment"
+              c:type="POPPLER_ANNOT_TEXT_ICON_COMMENT">
+      <type name="utf8" c:type="gchar*"/>
+    </constant>
+    <constant name="ANNOT_TEXT_ICON_CROSS"
+              value="Cross"
+              c:type="POPPLER_ANNOT_TEXT_ICON_CROSS">
+      <type name="utf8" c:type="gchar*"/>
+    </constant>
+    <constant name="ANNOT_TEXT_ICON_HELP"
+              value="Help"
+              c:type="POPPLER_ANNOT_TEXT_ICON_HELP">
+      <type name="utf8" c:type="gchar*"/>
+    </constant>
+    <constant name="ANNOT_TEXT_ICON_INSERT"
+              value="Insert"
+              c:type="POPPLER_ANNOT_TEXT_ICON_INSERT">
+      <type name="utf8" c:type="gchar*"/>
+    </constant>
+    <constant name="ANNOT_TEXT_ICON_KEY"
+              value="Key"
+              c:type="POPPLER_ANNOT_TEXT_ICON_KEY">
+      <type name="utf8" c:type="gchar*"/>
+    </constant>
+    <constant name="ANNOT_TEXT_ICON_NEW_PARAGRAPH"
+              value="NewParagraph"
+              c:type="POPPLER_ANNOT_TEXT_ICON_NEW_PARAGRAPH">
+      <type name="utf8" c:type="gchar*"/>
+    </constant>
+    <constant name="ANNOT_TEXT_ICON_NOTE"
+              value="Note"
+              c:type="POPPLER_ANNOT_TEXT_ICON_NOTE">
+      <type name="utf8" c:type="gchar*"/>
+    </constant>
+    <constant name="ANNOT_TEXT_ICON_PARAGRAPH"
+              value="Paragraph"
+              c:type="POPPLER_ANNOT_TEXT_ICON_PARAGRAPH">
+      <type name="utf8" c:type="gchar*"/>
+    </constant>
+    <union name="Action"
+           c:type="PopplerAction"
+           glib:type-name="PopplerAction"
+           glib:get-type="poppler_action_get_type"
+           c:symbol-prefix="action">
+      <doc xml:whitespace="preserve">A data structure for holding actions</doc>
+      <field name="type" writable="1">
+        <type name="ActionType" c:type="PopplerActionType"/>
+      </field>
+      <field name="any" writable="1">
+        <type name="ActionAny" c:type="PopplerActionAny"/>
+      </field>
+      <field name="goto_dest" writable="1">
+        <type name="ActionGotoDest" c:type="PopplerActionGotoDest"/>
+      </field>
+      <field name="goto_remote" writable="1">
+        <type name="ActionGotoRemote" c:type="PopplerActionGotoRemote"/>
+      </field>
+      <field name="launch" writable="1">
+        <type name="ActionLaunch" c:type="PopplerActionLaunch"/>
+      </field>
+      <field name="uri" writable="1">
+        <type name="ActionUri" c:type="PopplerActionUri"/>
+      </field>
+      <field name="named" writable="1">
+        <type name="ActionNamed" c:type="PopplerActionNamed"/>
+      </field>
+      <field name="movie" writable="1">
+        <type name="ActionMovie" c:type="PopplerActionMovie"/>
+      </field>
+      <field name="rendition" writable="1">
+        <type name="ActionRendition" c:type="PopplerActionRendition"/>
+      </field>
+      <field name="ocg_state" writable="1">
+        <type name="ActionOCGState" c:type="PopplerActionOCGState"/>
+      </field>
+      <field name="javascript" writable="1">
+        <type name="ActionJavascript" c:type="PopplerActionJavascript"/>
+      </field>
+      <method name="copy" c:identifier="poppler_action_copy">
+        <doc xml:whitespace="preserve">Copies @action, creating an identical #PopplerAction.</doc>
+        <return-value transfer-ownership="full">
+          <doc xml:whitespace="preserve">a new action identical to @action</doc>
+          <type name="Action" c:type="PopplerAction*"/>
+        </return-value>
+      </method>
+      <method name="free" c:identifier="poppler_action_free">
+        <doc xml:whitespace="preserve">Frees @action</doc>
+        <return-value transfer-ownership="none">
+          <type name="none" c:type="void"/>
+        </return-value>
+      </method>
+    </union>
+    <record name="ActionAny" c:type="PopplerActionAny">
+      <field name="type" writable="1">
+        <type name="ActionType" c:type="PopplerActionType"/>
+      </field>
+      <field name="title" writable="1">
+        <type name="utf8" c:type="gchar*"/>
+      </field>
+    </record>
+    <record name="ActionGotoDest" c:type="PopplerActionGotoDest">
+      <field name="type" writable="1">
+        <type name="ActionType" c:type="PopplerActionType"/>
+      </field>
+      <field name="title" writable="1">
+        <type name="utf8" c:type="gchar*"/>
+      </field>
+      <field name="dest" writable="1">
+        <type name="Dest" c:type="PopplerDest*"/>
+      </field>
+    </record>
+    <record name="ActionGotoRemote" c:type="PopplerActionGotoRemote">
+      <field name="type" writable="1">
+        <type name="ActionType" c:type="PopplerActionType"/>
+      </field>
+      <field name="title" writable="1">
+        <type name="utf8" c:type="gchar*"/>
+      </field>
+      <field name="file_name" writable="1">
+        <type name="utf8" c:type="gchar*"/>
+      </field>
+      <field name="dest" writable="1">
+        <type name="Dest" c:type="PopplerDest*"/>
+      </field>
+    </record>
+    <record name="ActionJavascript" c:type="PopplerActionJavascript">
+      <field name="type" writable="1">
+        <type name="ActionType" c:type="PopplerActionType"/>
+      </field>
+      <field name="title" writable="1">
+        <type name="utf8" c:type="gchar*"/>
+      </field>
+      <field name="script" writable="1">
+        <type name="utf8" c:type="gchar*"/>
+      </field>
+    </record>
+    <record name="ActionLaunch" c:type="PopplerActionLaunch">
+      <field name="type" writable="1">
+        <type name="ActionType" c:type="PopplerActionType"/>
+      </field>
+      <field name="title" writable="1">
+        <type name="utf8" c:type="gchar*"/>
+      </field>
+      <field name="file_name" writable="1">
+        <type name="utf8" c:type="gchar*"/>
+      </field>
+      <field name="params" writable="1">
+        <type name="utf8" c:type="gchar*"/>
+      </field>
+    </record>
+    <record name="ActionLayer" c:type="PopplerActionLayer">
+      <doc xml:whitespace="preserve">Action to perform over a list of layers</doc>
+      <field name="action" writable="1">
+        <type name="ActionLayerAction" c:type="PopplerActionLayerAction"/>
+      </field>
+      <field name="layers" writable="1">
+        <type name="GLib.List" c:type="GList*">
+          <type name="gpointer" c:type="gpointer"/>
+        </type>
+      </field>
+    </record>
+    <enumeration name="ActionLayerAction"
+                 version="0.14"
+                 glib:type-name="PopplerActionLayerAction"
+                 glib:get-type="poppler_action_layer_action_get_type"
+                 c:type="PopplerActionLayerAction">
+      <doc xml:whitespace="preserve">Layer actions</doc>
+      <member name="on"
+              value="0"
+              c:identifier="POPPLER_ACTION_LAYER_ON"
+              glib:nick="on"/>
+      <member name="off"
+              value="1"
+              c:identifier="POPPLER_ACTION_LAYER_OFF"
+              glib:nick="off"/>
+      <member name="toggle"
+              value="2"
+              c:identifier="POPPLER_ACTION_LAYER_TOGGLE"
+              glib:nick="toggle"/>
+    </enumeration>
+    <record name="ActionMovie" c:type="PopplerActionMovie">
+      <field name="type" writable="1">
+        <type name="ActionType" c:type="PopplerActionType"/>
+      </field>
+      <field name="title" writable="1">
+        <type name="utf8" c:type="gchar*"/>
+      </field>
+      <field name="operation" writable="1">
+        <type name="ActionMovieOperation"
+              c:type="PopplerActionMovieOperation"/>
+      </field>
+      <field name="movie" writable="1">
+        <type name="Movie" c:type="PopplerMovie*"/>
+      </field>
+    </record>
+    <enumeration name="ActionMovieOperation"
+                 version="0.14"
+                 glib:type-name="PopplerActionMovieOperation"
+                 glib:get-type="poppler_action_movie_operation_get_type"
+                 c:type="PopplerActionMovieOperation">
+      <doc xml:whitespace="preserve">Movie operations</doc>
+      <member name="play"
+              value="0"
+              c:identifier="POPPLER_ACTION_MOVIE_PLAY"
+              glib:nick="play"/>
+      <member name="pause"
+              value="1"
+              c:identifier="POPPLER_ACTION_MOVIE_PAUSE"
+              glib:nick="pause"/>
+      <member name="resume"
+              value="2"
+              c:identifier="POPPLER_ACTION_MOVIE_RESUME"
+              glib:nick="resume"/>
+      <member name="stop"
+              value="3"
+              c:identifier="POPPLER_ACTION_MOVIE_STOP"
+              glib:nick="stop"/>
+    </enumeration>
+    <record name="ActionNamed" c:type="PopplerActionNamed">
+      <field name="type" writable="1">
+        <type name="ActionType" c:type="PopplerActionType"/>
+      </field>
+      <field name="title" writable="1">
+        <type name="utf8" c:type="gchar*"/>
+      </field>
+      <field name="named_dest" writable="1">
+        <type name="utf8" c:type="gchar*"/>
+      </field>
+    </record>
+    <record name="ActionOCGState" c:type="PopplerActionOCGState">
+      <field name="type" writable="1">
+        <type name="ActionType" c:type="PopplerActionType"/>
+      </field>
+      <field name="title" writable="1">
+        <type name="utf8" c:type="gchar*"/>
+      </field>
+      <field name="state_list" writable="1">
+        <type name="GLib.List" c:type="GList*">
+          <type name="gpointer" c:type="gpointer"/>
+        </type>
+      </field>
+    </record>
+    <record name="ActionRendition" c:type="PopplerActionRendition">
+      <field name="type" writable="1">
+        <type name="ActionType" c:type="PopplerActionType"/>
+      </field>
+      <field name="title" writable="1">
+        <type name="utf8" c:type="gchar*"/>
+      </field>
+      <field name="op" writable="1">
+        <type name="gint" c:type="gint"/>
+      </field>
+      <field name="media" writable="1">
+        <type name="Media" c:type="PopplerMedia*"/>
+      </field>
+    </record>
+    <enumeration name="ActionType"
+                 glib:type-name="PopplerActionType"
+                 glib:get-type="poppler_action_type_get_type"
+                 c:type="PopplerActionType">
+      <doc xml:whitespace="preserve">Action types</doc>
+      <member name="unknown"
+              value="0"
+              c:identifier="POPPLER_ACTION_UNKNOWN"
+              glib:nick="unknown"/>
+      <member name="none"
+              value="1"
+              c:identifier="POPPLER_ACTION_NONE"
+              glib:nick="none"/>
+      <member name="goto_dest"
+              value="2"
+              c:identifier="POPPLER_ACTION_GOTO_DEST"
+              glib:nick="goto-dest"/>
+      <member name="goto_remote"
+              value="3"
+              c:identifier="POPPLER_ACTION_GOTO_REMOTE"
+              glib:nick="goto-remote"/>
+      <member name="launch"
+              value="4"
+              c:identifier="POPPLER_ACTION_LAUNCH"
+              glib:nick="launch"/>
+      <member name="uri"
+              value="5"
+              c:identifier="POPPLER_ACTION_URI"
+              glib:nick="uri"/>
+      <member name="named"
+              value="6"
+              c:identifier="POPPLER_ACTION_NAMED"
+              glib:nick="named"/>
+      <member name="movie"
+              value="7"
+              c:identifier="POPPLER_ACTION_MOVIE"
+              glib:nick="movie"/>
+      <member name="rendition"
+              value="8"
+              c:identifier="POPPLER_ACTION_RENDITION"
+              glib:nick="rendition"/>
+      <member name="ocg_state"
+              value="9"
+              c:identifier="POPPLER_ACTION_OCG_STATE"
+              glib:nick="ocg-state"/>
+      <member name="javascript"
+              value="10"
+              c:identifier="POPPLER_ACTION_JAVASCRIPT"
+              glib:nick="javascript"/>
+    </enumeration>
+    <record name="ActionUri" c:type="PopplerActionUri">
+      <field name="type" writable="1">
+        <type name="ActionType" c:type="PopplerActionType"/>
+      </field>
+      <field name="title" writable="1">
+        <type name="utf8" c:type="gchar*"/>
+      </field>
+      <field name="uri" writable="1">
+        <type name="utf8" c:type="char*"/>
+      </field>
+    </record>
+    <class name="Annot"
+           c:symbol-prefix="annot"
+           c:type="PopplerAnnot"
+           parent="GObject.Object"
+           glib:type-name="PopplerAnnot"
+           glib:get-type="poppler_annot_get_type">
+      <method name="get_annot_type"
+              c:identifier="poppler_annot_get_annot_type">
+        <doc xml:whitespace="preserve">Gets the type of @poppler_annot</doc>
+        <return-value transfer-ownership="none">
+          <doc xml:whitespace="preserve">#PopplerAnnotType of @poppler_annot.</doc>
+          <type name="AnnotType" c:type="PopplerAnnotType"/>
+        </return-value>
+      </method>
+      <method name="get_color" c:identifier="poppler_annot_get_color">
+        <doc xml:whitespace="preserve">Retrieves the color of @poppler_annot.</doc>
+        <return-value transfer-ownership="full">
+          <doc xml:whitespace="preserve">a new allocated #PopplerColor with the color values of @poppler_annot, or %NULL. It must be freed with g_free() when done.</doc>
+          <type name="Color" c:type="PopplerColor*"/>
+        </return-value>
+      </method>
+      <method name="get_contents" c:identifier="poppler_annot_get_contents">
+        <doc xml:whitespace="preserve">Retrieves the contents of @poppler_annot.</doc>
+        <return-value transfer-ownership="full">
+          <doc xml:whitespace="preserve">a new allocated string with the contents of @poppler_annot. It must be freed with g_free() when done.</doc>
+          <type name="utf8" c:type="gchar*"/>
+        </return-value>
+      </method>
+      <method name="get_flags" c:identifier="poppler_annot_get_flags">
+        <doc xml:whitespace="preserve">Retrieves the flag field specifying various characteristics of the
+@poppler_annot.</doc>
+        <return-value transfer-ownership="none">
+          <doc xml:whitespace="preserve">the flag field of @poppler_annot.</doc>
+          <type name="AnnotFlag" c:type="PopplerAnnotFlag"/>
+        </return-value>
+      </method>
+      <method name="get_modified" c:identifier="poppler_annot_get_modified">
+        <doc xml:whitespace="preserve">Retrieves the last modification data of @poppler_annot. The returned
+string will be either a PDF format date or a text string.
+See also #poppler_date_parse()</doc>
+        <return-value transfer-ownership="full">
+          <doc xml:whitespace="preserve">a new allocated string with the last modification data of @poppler_annot. It must be freed with g_free() when done.</doc>
+          <type name="utf8" c:type="gchar*"/>
+        </return-value>
+      </method>
+      <method name="get_name" c:identifier="poppler_annot_get_name">
+        <doc xml:whitespace="preserve">Retrieves the name of @poppler_annot.</doc>
+        <return-value transfer-ownership="full">
+          <doc xml:whitespace="preserve">a new allocated string with the name of @poppler_annot. It must be freed with g_free() when done.</doc>
+          <type name="utf8" c:type="gchar*"/>
+        </return-value>
+      </method>
+      <method name="get_page_index"
+              c:identifier="poppler_annot_get_page_index"
+              version="0.14">
+        <doc xml:whitespace="preserve">Returns the page index to which @poppler_annot is associated, or -1 if unknown</doc>
+        <return-value transfer-ownership="none">
+          <doc xml:whitespace="preserve">page index or -1</doc>
+          <type name="gint" c:type="gint"/>
+        </return-value>
+      </method>
+      <method name="set_color"
+              c:identifier="poppler_annot_set_color"
+              version="0.16">
+        <doc xml:whitespace="preserve">Sets the color of @poppler_annot.</doc>
+        <return-value transfer-ownership="none">
+          <type name="none" c:type="void"/>
+        </return-value>
+        <parameters>
+          <parameter name="poppler_color"
+                     transfer-ownership="none"
+                     allow-none="1">
+            <doc xml:whitespace="preserve">a #PopplerColor, or %NULL</doc>
+            <type name="Color" c:type="PopplerColor*"/>
+          </parameter>
+        </parameters>
+      </method>
+      <method name="set_contents"
+              c:identifier="poppler_annot_set_contents"
+              version="0.12">
+        <doc xml:whitespace="preserve">Sets the contents of @poppler_annot to the given value,
+replacing the current contents.</doc>
+        <return-value transfer-ownership="none">
+          <type name="none" c:type="void"/>
+        </return-value>
+        <parameters>
+          <parameter name="contents" transfer-ownership="none">
+            <doc xml:whitespace="preserve">a text string containing the new contents</doc>
+            <type name="utf8" c:type="const gchar*"/>
+          </parameter>
+        </parameters>
+      </method>
+    </class>
+    <record name="AnnotCalloutLine"
+            c:type="PopplerAnnotCalloutLine"
+            glib:type-name="PopplerAnnotCalloutLine"
+            glib:get-type="poppler_annot_callout_line_get_type"
+            c:symbol-prefix="annot_callout_line">
+      <field name="multiline" writable="1">
+        <type name="gboolean" c:type="gboolean"/>
+      </field>
+      <field name="x1" writable="1">
+        <type name="gdouble" c:type="gdouble"/>
+      </field>
+      <field name="y1" writable="1">
+        <type name="gdouble" c:type="gdouble"/>
+      </field>
+      <field name="x2" writable="1">
+        <type name="gdouble" c:type="gdouble"/>
+      </field>
+      <field name="y2" writable="1">
+        <type name="gdouble" c:type="gdouble"/>
+      </field>
+      <field name="x3" writable="1">
+        <type name="gdouble" c:type="gdouble"/>
+      </field>
+      <field name="y3" writable="1">
+        <type name="gdouble" c:type="gdouble"/>
+      </field>
+      <constructor name="new" c:identifier="poppler_annot_callout_line_new">
+        <doc xml:whitespace="preserve">Creates a new empty #PopplerAnnotCalloutLine.</doc>
+        <return-value transfer-ownership="full">
+          <doc xml:whitespace="preserve">a new allocated #PopplerAnnotCalloutLine, %NULL in other case. It must be freed when done.</doc>
+          <type name="AnnotCalloutLine" c:type="PopplerAnnotCalloutLine*"/>
+        </return-value>
+      </constructor>
+      <method name="copy" c:identifier="poppler_annot_callout_line_copy">
+        <doc xml:whitespace="preserve">It does copy @callout to a new #PopplerAnnotCalloutLine.</doc>
+        <return-value transfer-ownership="full">
+          <doc xml:whitespace="preserve">a new allocated #PopplerAnnotCalloutLine as exact copy of @callout, %NULL in other case. It must be freed when done.</doc>
+          <type name="AnnotCalloutLine" c:type="PopplerAnnotCalloutLine*"/>
+        </return-value>
+      </method>
+      <method name="free" c:identifier="poppler_annot_callout_line_free">
+        <doc xml:whitespace="preserve">Frees the memory used by #PopplerAnnotCalloutLine.</doc>
+        <return-value transfer-ownership="none">
+          <type name="none" c:type="void"/>
+        </return-value>
+      </method>
+    </record>
+    <enumeration name="AnnotExternalDataType"
+                 glib:type-name="PopplerAnnotExternalDataType"
+                 glib:get-type="poppler_annot_external_data_type_get_type"
+                 c:type="PopplerAnnotExternalDataType">
+      <member name="3d"
+              value="0"
+              c:identifier="POPPLER_ANNOT_EXTERNAL_DATA_MARKUP_3D"
+              glib:nick="3d"/>
+      <member name="unknown"
+              value="1"
+              c:identifier="POPPLER_ANNOT_EXTERNAL_DATA_MARKUP_UNKNOWN"
+              glib:nick="unknown"/>
+    </enumeration>
+    <class name="AnnotFileAttachment"
+           c:symbol-prefix="annot_file_attachment"
+           c:type="PopplerAnnotFileAttachment"
+           parent="AnnotMarkup"
+           glib:type-name="PopplerAnnotFileAttachment"
+           glib:get-type="poppler_annot_file_attachment_get_type">
+      <method name="get_attachment"
+              c:identifier="poppler_annot_file_attachment_get_attachment"
+              version="0.14">
+        <doc xml:whitespace="preserve">Creates a #PopplerAttachment for the file of the file attachment annotation @annot.
+The #PopplerAttachment must be unrefed with g_object_unref by the caller.</doc>
+        <return-value transfer-ownership="full">
+          <doc xml:whitespace="preserve">@PopplerAttachment</doc>
+          <type name="Attachment" c:type="PopplerAttachment*"/>
+        </return-value>
+      </method>
+      <method name="get_name"
+              c:identifier="poppler_annot_file_attachment_get_name"
+              version="0.14">
+        <doc xml:whitespace="preserve">Retrieves the name of @poppler_annot.</doc>
+        <return-value transfer-ownership="full">
+          <doc xml:whitespace="preserve">a new allocated string with the name of @poppler_annot. It must be freed with g_free() when done.</doc>
+          <type name="utf8" c:type="gchar*"/>
+        </return-value>
+      </method>
+    </class>
+    <bitfield name="AnnotFlag"
+              glib:type-name="PopplerAnnotFlag"
+              glib:get-type="poppler_annot_flag_get_type"
+              c:type="PopplerAnnotFlag">
+      <member name="unknown"
+              value="0"
+              c:identifier="POPPLER_ANNOT_FLAG_UNKNOWN"
+              glib:nick="unknown"/>
+      <member name="invisible"
+              value="1"
+              c:identifier="POPPLER_ANNOT_FLAG_INVISIBLE"
+              glib:nick="invisible"/>
+      <member name="hidden"
+              value="2"
+              c:identifier="POPPLER_ANNOT_FLAG_HIDDEN"
+              glib:nick="hidden"/>
+      <member name="print"
+              value="4"
+              c:identifier="POPPLER_ANNOT_FLAG_PRINT"
+              glib:nick="print"/>
+      <member name="no_zoom"
+              value="8"
+              c:identifier="POPPLER_ANNOT_FLAG_NO_ZOOM"
+              glib:nick="no-zoom"/>
+      <member name="no_rotate"
+              value="16"
+              c:identifier="POPPLER_ANNOT_FLAG_NO_ROTATE"
+              glib:nick="no-rotate"/>
+      <member name="no_view"
+              value="32"
+              c:identifier="POPPLER_ANNOT_FLAG_NO_VIEW"
+              glib:nick="no-view"/>
+      <member name="read_only"
+              value="64"
+              c:identifier="POPPLER_ANNOT_FLAG_READ_ONLY"
+              glib:nick="read-only"/>
+      <member name="locked"
+              value="128"
+              c:identifier="POPPLER_ANNOT_FLAG_LOCKED"
+              glib:nick="locked"/>
+      <member name="toggle_no_view"
+              value="256"
+              c:identifier="POPPLER_ANNOT_FLAG_TOGGLE_NO_VIEW"
+              glib:nick="toggle-no-view"/>
+      <member name="locked_contents"
+              value="512"
+              c:identifier="POPPLER_ANNOT_FLAG_LOCKED_CONTENTS"
+              glib:nick="locked-contents"/>
+    </bitfield>
+    <class name="AnnotFreeText"
+           c:symbol-prefix="annot_free_text"
+           c:type="PopplerAnnotFreeText"
+           parent="AnnotMarkup"
+           glib:type-name="PopplerAnnotFreeText"
+           glib:get-type="poppler_annot_free_text_get_type">
+      <method name="get_callout_line"
+              c:identifier="poppler_annot_free_text_get_callout_line">
+        <doc xml:whitespace="preserve">Retrieves a #PopplerAnnotCalloutLine of four or six numbers specifying a callout
+line attached to the @poppler_annot.</doc>
+        <return-value transfer-ownership="full">
+          <doc xml:whitespace="preserve">a new allocated #PopplerAnnotCalloutLine if the annot has a callout line, %NULL in other case. It must be freed with g_free() when done.</doc>
+          <type name="AnnotCalloutLine" c:type="PopplerAnnotCalloutLine*"/>
+        </return-value>
+      </method>
+      <method name="get_quadding"
+              c:identifier="poppler_annot_free_text_get_quadding">
+        <doc xml:whitespace="preserve">Retrieves the justification of the text of @poppler_annot.</doc>
+        <return-value transfer-ownership="none">
+          <doc xml:whitespace="preserve">#PopplerAnnotFreeTextQuadding of @poppler_annot.</doc>
+          <type name="AnnotFreeTextQuadding"
+                c:type="PopplerAnnotFreeTextQuadding"/>
+        </return-value>
+      </method>
+    </class>
+    <enumeration name="AnnotFreeTextQuadding"
+                 glib:type-name="PopplerAnnotFreeTextQuadding"
+                 glib:get-type="poppler_annot_free_text_quadding_get_type"
+                 c:type="PopplerAnnotFreeTextQuadding">
+      <member name="left_justified"
+              value="0"
+              c:identifier="POPPLER_ANNOT_FREE_TEXT_QUADDING_LEFT_JUSTIFIED"
+              glib:nick="left-justified"/>
+      <member name="centered"
+              value="1"
+              c:identifier="POPPLER_ANNOT_FREE_TEXT_QUADDING_CENTERED"
+              glib:nick="centered"/>
+      <member name="right_justified"
+              value="2"
+              c:identifier="POPPLER_ANNOT_FREE_TEXT_QUADDING_RIGHT_JUSTIFIED"
+              glib:nick="right-justified"/>
+    </enumeration>
+    <record name="AnnotMapping"
+            c:type="PopplerAnnotMapping"
+            glib:type-name="PopplerAnnotMapping"
+            glib:get-type="poppler_annot_mapping_get_type"
+            c:symbol-prefix="annot_mapping">
+      <doc xml:whitespace="preserve">A #PopplerAnnotMapping structure represents the location
+of @annot on the page</doc>
+      <field name="area" writable="1">
+        <type name="Rectangle" c:type="PopplerRectangle"/>
+      </field>
+      <field name="annot" writable="1">
+        <type name="Annot" c:type="PopplerAnnot*"/>
+      </field>
+      <constructor name="new" c:identifier="poppler_annot_mapping_new">
+        <doc xml:whitespace="preserve">Creates a new #PopplerAnnotMapping</doc>
+        <return-value transfer-ownership="full">
+          <doc xml:whitespace="preserve">a new #PopplerAnnotMapping, use poppler_annot_mapping_free() to free it</doc>
+          <type name="AnnotMapping" c:type="PopplerAnnotMapping*"/>
+        </return-value>
+      </constructor>
+      <method name="copy" c:identifier="poppler_annot_mapping_copy">
+        <doc xml:whitespace="preserve">Creates a copy of @mapping</doc>
+        <return-value transfer-ownership="full">
+          <doc xml:whitespace="preserve">a new allocated copy of @mapping</doc>
+          <type name="AnnotMapping" c:type="PopplerAnnotMapping*"/>
+        </return-value>
+      </method>
+      <method name="free" c:identifier="poppler_annot_mapping_free">
+        <doc xml:whitespace="preserve">Frees the given #PopplerAnnotMapping</doc>
+        <return-value transfer-ownership="none">
+          <type name="none" c:type="void"/>
+        </return-value>
+      </method>
+    </record>
+    <class name="AnnotMarkup"
+           c:symbol-prefix="annot_markup"
+           c:type="PopplerAnnotMarkup"
+           parent="Annot"
+           glib:type-name="PopplerAnnotMarkup"
+           glib:get-type="poppler_annot_markup_get_type">
+      <method name="get_date" c:identifier="poppler_annot_markup_get_date">
+        <doc xml:whitespace="preserve">Returns the date and time when the annotation was created</doc>
+        <return-value transfer-ownership="full">
+          <doc xml:whitespace="preserve">a #GDate representing the date and time when the annotation was created, or %NULL</doc>
+          <type name="GLib.Date" c:type="GDate*"/>
+        </return-value>
+      </method>
+      <method name="get_external_data"
+              c:identifier="poppler_annot_markup_get_external_data">
+        <doc xml:whitespace="preserve">Gets the external data type of @poppler_annot.</doc>
+        <return-value transfer-ownership="none">
+          <doc xml:whitespace="preserve">#PopplerAnnotExternalDataType of @poppler_annot.</doc>
+          <type name="AnnotExternalDataType"
+                c:type="PopplerAnnotExternalDataType"/>
+        </return-value>
+      </method>
+      <method name="get_label" c:identifier="poppler_annot_markup_get_label">
+        <doc xml:whitespace="preserve">Retrieves the label text of @poppler_annot.</doc>
+        <return-value transfer-ownership="full">
+          <doc xml:whitespace="preserve">the label text of @poppler_annot.</doc>
+          <type name="utf8" c:type="gchar*"/>
+        </return-value>
+      </method>
+      <method name="get_opacity"
+              c:identifier="poppler_annot_markup_get_opacity">
+        <doc xml:whitespace="preserve">Retrieves the opacity value of @poppler_annot.</doc>
+        <return-value transfer-ownership="none">
+          <doc xml:whitespace="preserve">the opacity value of @poppler_annot, between 0 (transparent) and 1 (opaque)</doc>
+          <type name="gdouble" c:type="gdouble"/>
+        </return-value>
+      </method>
+      <method name="get_popup_is_open"
+              c:identifier="poppler_annot_markup_get_popup_is_open">
+        <doc xml:whitespace="preserve">Retrieves the state of the popup window related to @poppler_annot.</doc>
+        <return-value transfer-ownership="none">
+          <doc xml:whitespace="preserve">the state of @poppler_annot. %TRUE if it's open, %FALSE in other case.</doc>
+          <type name="gboolean" c:type="gboolean"/>
+        </return-value>
+      </method>
+      <method name="get_popup_rectangle"
+              c:identifier="poppler_annot_markup_get_popup_rectangle"
+              version="0.12">
+        <doc xml:whitespace="preserve">Retrieves the rectangle of the popup window related to @poppler_annot.</doc>
+        <return-value transfer-ownership="none">
+          <doc xml:whitespace="preserve">%TRUE if #PopplerRectangle was correctly filled, %FALSE otherwise</doc>
+          <type name="gboolean" c:type="gboolean"/>
+        </return-value>
+        <parameters>
+          <parameter name="poppler_rect"
+                     direction="out"
+                     caller-allocates="1"
+                     transfer-ownership="none">
+            <doc xml:whitespace="preserve">a #PopplerRectangle to store the popup rectangle</doc>
+            <type name="Rectangle" c:type="PopplerRectangle*"/>
+          </parameter>
+        </parameters>
+      </method>
+      <method name="get_reply_to"
+              c:identifier="poppler_annot_markup_get_reply_to">
+        <doc xml:whitespace="preserve">Gets the reply type of @poppler_annot.</doc>
+        <return-value transfer-ownership="none">
+          <doc xml:whitespace="preserve">#PopplerAnnotMarkupReplyType of @poppler_annot.</doc>
+          <type name="AnnotMarkupReplyType"
+                c:type="PopplerAnnotMarkupReplyType"/>
+        </return-value>
+      </method>
+      <method name="get_subject"
+              c:identifier="poppler_annot_markup_get_subject">
+        <doc xml:whitespace="preserve">Retrives the subject text of @poppler_annot.</doc>
+        <return-value transfer-ownership="full">
+          <doc xml:whitespace="preserve">the subject text of @poppler_annot.</doc>
+          <type name="utf8" c:type="gchar*"/>
+        </return-value>
+      </method>
+      <method name="has_popup"
+              c:identifier="poppler_annot_markup_has_popup"
+              version="0.12">
+        <doc xml:whitespace="preserve">Return %TRUE if the markup annotation has a popup window associated</doc>
+        <return-value transfer-ownership="none">
+          <doc xml:whitespace="preserve">%TRUE, if @poppler_annot has popup, %FALSE otherwise</doc>
+          <type name="gboolean" c:type="gboolean"/>
+        </return-value>
+      </method>
+      <method name="set_label"
+              c:identifier="poppler_annot_markup_set_label"
+              version="0.16">
+        <doc xml:whitespace="preserve">Sets the label text of @poppler_annot, replacing the current one</doc>
+        <return-value transfer-ownership="none">
+          <type name="none" c:type="void"/>
+        </return-value>
+        <parameters>
+          <parameter name="label" transfer-ownership="none" allow-none="1">
+            <doc xml:whitespace="preserve">a text string containing the new label, or %NULL</doc>
+            <type name="utf8" c:type="const gchar*"/>
+          </parameter>
+        </parameters>
+      </method>
+      <method name="set_opacity"
+              c:identifier="poppler_annot_markup_set_opacity"
+              version="0.16">
+        <doc xml:whitespace="preserve">Sets the opacity of @poppler_annot. This value applies to
+all visible elements of @poppler_annot in its closed state,
+but not to the pop-up window that appears when it's openened</doc>
+        <return-value transfer-ownership="none">
+          <type name="none" c:type="void"/>
+        </return-value>
+        <parameters>
+          <parameter name="opacity" transfer-ownership="none">
+            <doc xml:whitespace="preserve">a constant opacity value, between 0 (transparent) and 1 (opaque)</doc>
+            <type name="gdouble" c:type="gdouble"/>
+          </parameter>
+        </parameters>
+      </method>
+      <method name="set_popup"
+              c:identifier="poppler_annot_markup_set_popup"
+              version="0.16">
+        <doc xml:whitespace="preserve">Associates a new popup window for editing contents of @poppler_annot.
+Popup window shall be displayed by viewers at @popup_rect on the page.</doc>
+        <return-value transfer-ownership="none">
+          <type name="none" c:type="void"/>
+        </return-value>
+        <parameters>
+          <parameter name="popup_rect" transfer-ownership="none">
+            <doc xml:whitespace="preserve">a #PopplerRectangle</doc>
+            <type name="Rectangle" c:type="PopplerRectangle*"/>
+          </parameter>
+        </parameters>
+      </method>
+      <method name="set_popup_is_open"
+              c:identifier="poppler_annot_markup_set_popup_is_open"
+              version="0.16">
+        <doc xml:whitespace="preserve">Sets the state of the popup window related to @poppler_annot.</doc>
+        <return-value transfer-ownership="none">
+          <type name="none" c:type="void"/>
+        </return-value>
+        <parameters>
+          <parameter name="is_open" transfer-ownership="none">
+            <doc xml:whitespace="preserve">whether popup window should initially be displayed open</doc>
+            <type name="gboolean" c:type="gboolean"/>
+          </parameter>
+        </parameters>
+      </method>
+    </class>
+    <enumeration name="AnnotMarkupReplyType"
+                 glib:type-name="PopplerAnnotMarkupReplyType"
+                 glib:get-type="poppler_annot_markup_reply_type_get_type"
+                 c:type="PopplerAnnotMarkupReplyType">
+      <member name="r"
+              value="0"
+              c:identifier="POPPLER_ANNOT_MARKUP_REPLY_TYPE_R"
+              glib:nick="r"/>
+      <member name="group"
+              value="1"
+              c:identifier="POPPLER_ANNOT_MARKUP_REPLY_TYPE_GROUP"
+              glib:nick="group"/>
+    </enumeration>
+    <class name="AnnotMovie"
+           c:symbol-prefix="annot_movie"
+           c:type="PopplerAnnotMovie"
+           parent="Annot"
+           glib:type-name="PopplerAnnotMovie"
+           glib:get-type="poppler_annot_movie_get_type">
+      <method name="get_movie"
+              c:identifier="poppler_annot_movie_get_movie"
+              version="0.14">
+        <doc xml:whitespace="preserve">Retrieves the movie object (PopplerMovie) stored in the @poppler_annot.</doc>
+        <return-value transfer-ownership="none">
+          <doc xml:whitespace="preserve">the movie object stored in the @poppler_annot. The returned object is owned by #PopplerAnnotMovie and should not be freed</doc>
+          <type name="Movie" c:type="PopplerMovie*"/>
+        </return-value>
+      </method>
+      <method name="get_title"
+              c:identifier="poppler_annot_movie_get_title"
+              version="0.14">
+        <doc xml:whitespace="preserve">Retrieves the movie title of @poppler_annot.</doc>
+        <return-value transfer-ownership="full">
+          <doc xml:whitespace="preserve">the title text of @poppler_annot.</doc>
+          <type name="utf8" c:type="gchar*"/>
+        </return-value>
+      </method>
+    </class>
+    <class name="AnnotScreen"
+           c:symbol-prefix="annot_screen"
+           c:type="PopplerAnnotScreen"
+           parent="Annot"
+           glib:type-name="PopplerAnnotScreen"
+           glib:get-type="poppler_annot_screen_get_type">
+      <method name="get_action"
+              c:identifier="poppler_annot_screen_get_action"
+              version="0.14">
+        <doc xml:whitespace="preserve">Retrieves the action (#PopplerAction) that shall be performed when @poppler_annot is activated</doc>
+        <return-value transfer-ownership="none">
+          <doc xml:whitespace="preserve">the action to perform. The returned object is owned by @poppler_annot and should not be freed</doc>
+          <type name="Action" c:type="PopplerAction*"/>
+        </return-value>
+      </method>
+    </class>
+    <class name="AnnotText"
+           c:symbol-prefix="annot_text"
+           c:type="PopplerAnnotText"
+           parent="AnnotMarkup"
+           glib:type-name="PopplerAnnotText"
+           glib:get-type="poppler_annot_text_get_type">
+      <constructor name="new"
+                   c:identifier="poppler_annot_text_new"
+                   version="0.16">
+        <doc xml:whitespace="preserve">Creates a new Text annotation that will be
+located on @rect when added to a page. See
+poppler_page_add_annot()</doc>
+        <return-value transfer-ownership="full">
+          <doc xml:whitespace="preserve">A newly created #PopplerAnnotText annotation</doc>
+          <type name="Annot" c:type="PopplerAnnot*"/>
+        </return-value>
+        <parameters>
+          <parameter name="doc" transfer-ownership="none">
+            <doc xml:whitespace="preserve">a #PopplerDocument</doc>
+            <type name="Document" c:type="PopplerDocument*"/>
+          </parameter>
+          <parameter name="rect" transfer-ownership="none">
+            <doc xml:whitespace="preserve">a #PopplerRectangle</doc>
+            <type name="Rectangle" c:type="PopplerRectangle*"/>
+          </parameter>
+        </parameters>
+      </constructor>
+      <method name="get_icon" c:identifier="poppler_annot_text_get_icon">
+        <doc xml:whitespace="preserve">Gets name of the icon of @poppler_annot.</doc>
+        <return-value transfer-ownership="full">
+          <doc xml:whitespace="preserve">a new allocated string containing the icon name</doc>
+          <type name="utf8" c:type="gchar*"/>
+        </return-value>
+      </method>
+      <method name="get_is_open" c:identifier="poppler_annot_text_get_is_open">
+        <doc xml:whitespace="preserve">Retrieves the state of @poppler_annot.</doc>
+        <return-value transfer-ownership="none">
+          <doc xml:whitespace="preserve">the state of @poppler_annot. %TRUE if it's open, %FALSE in other case.</doc>
+          <type name="gboolean" c:type="gboolean"/>
+        </return-value>
+      </method>
+      <method name="get_state" c:identifier="poppler_annot_text_get_state">
+        <doc xml:whitespace="preserve">Retrieves the state of @poppler_annot.</doc>
+        <return-value transfer-ownership="none">
+          <doc xml:whitespace="preserve">#PopplerAnnotTextState of @poppler_annot.</doc>
+          <type name="AnnotTextState" c:type="PopplerAnnotTextState"/>
+        </return-value>
+      </method>
+      <method name="set_icon"
+              c:identifier="poppler_annot_text_set_icon"
+              version="0.16">
+        <doc xml:whitespace="preserve">Sets the icon of @poppler_annot. The following predefined
+icons are currently supported:
+&lt;variablelist&gt;
+ &lt;varlistentry&gt;
+  &lt;term&gt;#POPPLER_ANNOT_TEXT_ICON_NOTE&lt;/term&gt;
+ &lt;/varlistentry&gt;
+ &lt;varlistentry&gt;
+  &lt;term&gt;#POPPLER_ANNOT_TEXT_ICON_COMMENT&lt;/term&gt;
+ &lt;/varlistentry&gt;
+ &lt;varlistentry&gt;
+  &lt;term&gt;#POPPLER_ANNOT_TEXT_ICON_KEY&lt;/term&gt;
+ &lt;/varlistentry&gt;
+ &lt;varlistentry&gt;
+  &lt;term&gt;#POPPLER_ANNOT_TEXT_ICON_HELP&lt;/term&gt;
+ &lt;/varlistentry&gt;
+ &lt;varlistentry&gt;
+  &lt;term&gt;#POPPLER_ANNOT_TEXT_ICON_NEW_PARAGRAPH&lt;/term&gt;
+ &lt;/varlistentry&gt;
+ &lt;varlistentry&gt;
+  &lt;term&gt;#POPPLER_ANNOT_TEXT_ICON_PARAGRAPH&lt;/term&gt;
+ &lt;/varlistentry&gt;
+ &lt;varlistentry&gt;
+  &lt;term&gt;#POPPLER_ANNOT_TEXT_ICON_INSERT&lt;/term&gt;
+ &lt;/varlistentry&gt;
+ &lt;varlistentry&gt;
+  &lt;term&gt;#POPPLER_ANNOT_TEXT_ICON_CROSS&lt;/term&gt;
+ &lt;/varlistentry&gt;
+ &lt;varlistentry&gt;
+  &lt;term&gt;#POPPLER_ANNOT_TEXT_ICON_CIRCLE&lt;/term&gt;
+ &lt;/varlistentry&gt;
+&lt;/variablelist&gt;</doc>
+        <return-value transfer-ownership="none">
+          <type name="none" c:type="void"/>
+        </return-value>
+        <parameters>
+          <parameter name="icon" transfer-ownership="none">
+            <doc xml:whitespace="preserve">the name of an icon</doc>
+            <type name="utf8" c:type="const gchar*"/>
+          </parameter>
+        </parameters>
+      </method>
+      <method name="set_is_open"
+              c:identifier="poppler_annot_text_set_is_open"
+              version="0.16">
+        <doc xml:whitespace="preserve">Sets whether @poppler_annot should initially be displayed open</doc>
+        <return-value transfer-ownership="none">
+          <type name="none" c:type="void"/>
+        </return-value>
+        <parameters>
+          <parameter name="is_open" transfer-ownership="none">
+            <doc xml:whitespace="preserve">whether annotation should initially be displayed open</doc>
+            <type name="gboolean" c:type="gboolean"/>
+          </parameter>
+        </parameters>
+      </method>
+    </class>
+    <enumeration name="AnnotTextState"
+                 glib:type-name="PopplerAnnotTextState"
+                 glib:get-type="poppler_annot_text_state_get_type"
+                 c:type="PopplerAnnotTextState">
+      <member name="marked"
+              value="0"
+              c:identifier="POPPLER_ANNOT_TEXT_STATE_MARKED"
+              glib:nick="marked"/>
+      <member name="unmarked"
+              value="1"
+              c:identifier="POPPLER_ANNOT_TEXT_STATE_UNMARKED"
+              glib:nick="unmarked"/>
+      <member name="accepted"
+              value="2"
+              c:identifier="POPPLER_ANNOT_TEXT_STATE_ACCEPTED"
+              glib:nick="accepted"/>
+      <member name="rejected"
+              value="3"
+              c:identifier="POPPLER_ANNOT_TEXT_STATE_REJECTED"
+              glib:nick="rejected"/>
+      <member name="cancelled"
+              value="4"
+              c:identifier="POPPLER_ANNOT_TEXT_STATE_CANCELLED"
+              glib:nick="cancelled"/>
+      <member name="completed"
+              value="5"
+              c:identifier="POPPLER_ANNOT_TEXT_STATE_COMPLETED"
+              glib:nick="completed"/>
+      <member name="none"
+              value="6"
+              c:identifier="POPPLER_ANNOT_TEXT_STATE_NONE"
+              glib:nick="none"/>
+      <member name="unknown"
+              value="7"
+              c:identifier="POPPLER_ANNOT_TEXT_STATE_UNKNOWN"
+              glib:nick="unknown"/>
+    </enumeration>
+    <enumeration name="AnnotType"
+                 glib:type-name="PopplerAnnotType"
+                 glib:get-type="poppler_annot_type_get_type"
+                 c:type="PopplerAnnotType">
+      <member name="unknown"
+              value="0"
+              c:identifier="POPPLER_ANNOT_UNKNOWN"
+              glib:nick="unknown"/>
+      <member name="text"
+              value="1"
+              c:identifier="POPPLER_ANNOT_TEXT"
+              glib:nick="text"/>
+      <member name="link"
+              value="2"
+              c:identifier="POPPLER_ANNOT_LINK"
+              glib:nick="link"/>
+      <member name="free_text"
+              value="3"
+              c:identifier="POPPLER_ANNOT_FREE_TEXT"
+              glib:nick="free-text"/>
+      <member name="line"
+              value="4"
+              c:identifier="POPPLER_ANNOT_LINE"
+              glib:nick="line"/>
+      <member name="square"
+              value="5"
+              c:identifier="POPPLER_ANNOT_SQUARE"
+              glib:nick="square"/>
+      <member name="circle"
+              value="6"
+              c:identifier="POPPLER_ANNOT_CIRCLE"
+              glib:nick="circle"/>
+      <member name="polygon"
+              value="7"
+              c:identifier="POPPLER_ANNOT_POLYGON"
+              glib:nick="polygon"/>
+      <member name="poly_line"
+              value="8"
+              c:identifier="POPPLER_ANNOT_POLY_LINE"
+              glib:nick="poly-line"/>
+      <member name="highlight"
+              value="9"
+              c:identifier="POPPLER_ANNOT_HIGHLIGHT"
+              glib:nick="highlight"/>
+      <member name="underline"
+              value="10"
+              c:identifier="POPPLER_ANNOT_UNDERLINE"
+              glib:nick="underline"/>
+      <member name="squiggly"
+              value="11"
+              c:identifier="POPPLER_ANNOT_SQUIGGLY"
+              glib:nick="squiggly"/>
+      <member name="strike_out"
+              value="12"
+              c:identifier="POPPLER_ANNOT_STRIKE_OUT"
+              glib:nick="strike-out"/>
+      <member name="stamp"
+              value="13"
+              c:identifier="POPPLER_ANNOT_STAMP"
+              glib:nick="stamp"/>
+      <member name="caret"
+              value="14"
+              c:identifier="POPPLER_ANNOT_CARET"
+              glib:nick="caret"/>
+      <member name="ink"
+              value="15"
+              c:identifier="POPPLER_ANNOT_INK"
+              glib:nick="ink"/>
+      <member name="popup"
+              value="16"
+              c:identifier="POPPLER_ANNOT_POPUP"
+              glib:nick="popup"/>
+      <member name="file_attachment"
+              value="17"
+              c:identifier="POPPLER_ANNOT_FILE_ATTACHMENT"
+              glib:nick="file-attachment"/>
+      <member name="sound"
+              value="18"
+              c:identifier="POPPLER_ANNOT_SOUND"
+              glib:nick="sound"/>
+      <member name="movie"
+              value="19"
+              c:identifier="POPPLER_ANNOT_MOVIE"
+              glib:nick="movie"/>
+      <member name="widget"
+              value="20"
+              c:identifier="POPPLER_ANNOT_WIDGET"
+              glib:nick="widget"/>
+      <member name="screen"
+              value="21"
+              c:identifier="POPPLER_ANNOT_SCREEN"
+              glib:nick="screen"/>
+      <member name="printer_mark"
+              value="22"
+              c:identifier="POPPLER_ANNOT_PRINTER_MARK"
+              glib:nick="printer-mark"/>
+      <member name="trap_net"
+              value="23"
+              c:identifier="POPPLER_ANNOT_TRAP_NET"
+              glib:nick="trap-net"/>
+      <member name="watermark"
+              value="24"
+              c:identifier="POPPLER_ANNOT_WATERMARK"
+              glib:nick="watermark"/>
+      <member name="3d"
+              value="25"
+              c:identifier="POPPLER_ANNOT_3D"
+              glib:nick="3d"/>
+    </enumeration>
+    <class name="Attachment"
+           c:symbol-prefix="attachment"
+           c:type="PopplerAttachment"
+           parent="GObject.Object"
+           glib:type-name="PopplerAttachment"
+           glib:get-type="poppler_attachment_get_type">
+      <method name="save" c:identifier="poppler_attachment_save" throws="1">
+        <doc xml:whitespace="preserve">Saves @attachment to a file indicated by @filename.  If @error is set, %FALSE
+will be returned. Possible errors include those in the #G_FILE_ERROR domain
+and whatever the save function generates.</doc>
+        <return-value transfer-ownership="none">
+          <doc xml:whitespace="preserve">%TRUE, if the file successfully saved</doc>
+          <type name="gboolean" c:type="gboolean"/>
+        </return-value>
+        <parameters>
+          <parameter name="filename" transfer-ownership="none">
+            <doc xml:whitespace="preserve">name of file to save</doc>
+            <type name="utf8" c:type="const char*"/>
+          </parameter>
+        </parameters>
+      </method>
+      <method name="save_to_callback"
+              c:identifier="poppler_attachment_save_to_callback"
+              throws="1">
+        <doc xml:whitespace="preserve">Saves @attachment by feeding the produced data to @save_func. Can be used
+when you want to store the attachment to something other than a file, such as
+an in-memory buffer or a socket. If @error is set, %FALSE will be
+returned. Possible errors include those in the #G_FILE_ERROR domain and
+whatever the save function generates.</doc>
+        <return-value transfer-ownership="none">
+          <doc xml:whitespace="preserve">%TRUE, if the save successfully completed</doc>
+          <type name="gboolean" c:type="gboolean"/>
+        </return-value>
+        <parameters>
+          <parameter name="save_func"
+                     transfer-ownership="none"
+                     scope="call"
+                     closure="1">
+            <doc xml:whitespace="preserve">a function that is called to save each block of data that the save routine generates.</doc>
+            <type name="AttachmentSaveFunc"
+                  c:type="PopplerAttachmentSaveFunc"/>
+          </parameter>
+          <parameter name="user_data" transfer-ownership="none">
+            <doc xml:whitespace="preserve">user data to pass to the save function.</doc>
+            <type name="gpointer" c:type="gpointer"/>
+          </parameter>
+        </parameters>
+      </method>
+      <field name="parent">
+        <type name="GObject.Object" c:type="GObject"/>
+      </field>
+      <field name="name">
+        <type name="utf8" c:type="gchar*"/>
+      </field>
+      <field name="description">
+        <type name="utf8" c:type="gchar*"/>
+      </field>
+      <field name="size">
+        <type name="gsize" c:type="gsize"/>
+      </field>
+      <field name="mtime">
+        <type name="GLib.Time" c:type="GTime"/>
+      </field>
+      <field name="ctime">
+        <type name="GLib.Time" c:type="GTime"/>
+      </field>
+      <field name="checksum">
+        <type name="GLib.String" c:type="GString*"/>
+      </field>
+    </class>
+    <callback name="AttachmentSaveFunc"
+              c:type="PopplerAttachmentSaveFunc"
+              throws="1">
+      <doc xml:whitespace="preserve">Specifies the type of the function passed to
+poppler_attachment_save_to_callback().  It is called once for each block of
+bytes that is "written" by poppler_attachment_save_to_callback().  If
+successful it should return %TRUE.  If an error occurs it should set
+@error and return %FALSE, in which case poppler_attachment_save_to_callback()
+will fail with the same error.</doc>
+      <return-value transfer-ownership="none">
+        <doc xml:whitespace="preserve">%TRUE if successful, %FALSE (with @error set) if failed.</doc>
+        <type name="gboolean" c:type="gboolean"/>
+      </return-value>
+      <parameters>
+        <parameter name="buf" transfer-ownership="none">
+          <doc xml:whitespace="preserve">buffer containing bytes to be written.</doc>
+          <array length="1" zero-terminated="0" c:type="gchar*">
+            <type name="guint8"/>
+          </array>
+        </parameter>
+        <parameter name="count" transfer-ownership="none">
+          <doc xml:whitespace="preserve">number of bytes in @buf.</doc>
+          <type name="gsize" c:type="gsize"/>
+        </parameter>
+        <parameter name="data" transfer-ownership="none" closure="2">
+          <doc xml:whitespace="preserve">user data passed to poppler_attachment_save_to_callback()</doc>
+          <type name="gpointer" c:type="gpointer"/>
+        </parameter>
+      </parameters>
+    </callback>
+    <enumeration name="Backend"
+                 glib:type-name="PopplerBackend"
+                 glib:get-type="poppler_backend_get_type"
+                 c:type="PopplerBackend">
+      <member name="unknown"
+              value="0"
+              c:identifier="POPPLER_BACKEND_UNKNOWN"
+              glib:nick="unknown"/>
+      <member name="splash"
+              value="1"
+              c:identifier="POPPLER_BACKEND_SPLASH"
+              glib:nick="splash"/>
+      <member name="cairo"
+              value="2"
+              c:identifier="POPPLER_BACKEND_CAIRO"
+              glib:nick="cairo"/>
+    </enumeration>
+    <record name="Color"
+            c:type="PopplerColor"
+            glib:type-name="PopplerColor"
+            glib:get-type="poppler_color_get_type"
+            c:symbol-prefix="color">
+      <doc xml:whitespace="preserve">A #PopplerColor describes a RGB color. Color components
+are values between 0 and 65535</doc>
+      <field name="red" writable="1">
+        <type name="guint16" c:type="guint16"/>
+      </field>
+      <field name="green" writable="1">
+        <type name="guint16" c:type="guint16"/>
+      </field>
+      <field name="blue" writable="1">
+        <type name="guint16" c:type="guint16"/>
+      </field>
+      <constructor name="new" c:identifier="poppler_color_new">
+        <doc xml:whitespace="preserve">Creates a new #PopplerColor</doc>
+        <return-value transfer-ownership="full">
+          <doc xml:whitespace="preserve">a new #PopplerColor, use poppler_color_free() to free it</doc>
+          <type name="Color" c:type="PopplerColor*"/>
+        </return-value>
+      </constructor>
+      <method name="copy" c:identifier="poppler_color_copy">
+        <doc xml:whitespace="preserve">Creates a copy of @color</doc>
+        <return-value transfer-ownership="full">
+          <doc xml:whitespace="preserve">a new allocated copy of @color</doc>
+          <type name="Color" c:type="PopplerColor*"/>
+        </return-value>
+      </method>
+      <method name="free" c:identifier="poppler_color_free">
+        <doc xml:whitespace="preserve">Frees the given #PopplerColor</doc>
+        <return-value transfer-ownership="none">
+          <type name="none" c:type="void"/>
+        </return-value>
+      </method>
+    </record>
+    <record name="Dest"
+            c:type="PopplerDest"
+            glib:type-name="PopplerDest"
+            glib:get-type="poppler_dest_get_type"
+            c:symbol-prefix="dest">
+      <doc xml:whitespace="preserve">Data structure for holding a destination</doc>
+      <field name="type" writable="1">
+        <type name="DestType" c:type="PopplerDestType"/>
+      </field>
+      <field name="page_num" writable="1">
+        <type name="gint" c:type="int"/>
+      </field>
+      <field name="left" writable="1">
+        <type name="gdouble" c:type="double"/>
+      </field>
+      <field name="bottom" writable="1">
+        <type name="gdouble" c:type="double"/>
+      </field>
+      <field name="right" writable="1">
+        <type name="gdouble" c:type="double"/>
+      </field>
+      <field name="top" writable="1">
+        <type name="gdouble" c:type="double"/>
+      </field>
+      <field name="zoom" writable="1">
+        <type name="gdouble" c:type="double"/>
+      </field>
+      <field name="named_dest" writable="1">
+        <type name="utf8" c:type="gchar*"/>
+      </field>
+      <field name="change_left" writable="1" bits="1">
+        <type name="guint" c:type="guint"/>
+      </field>
+      <field name="change_top" writable="1" bits="1">
+        <type name="guint" c:type="guint"/>
+      </field>
+      <field name="change_zoom" writable="1" bits="1">
+        <type name="guint" c:type="guint"/>
+      </field>
+      <method name="copy" c:identifier="poppler_dest_copy">
+        <doc xml:whitespace="preserve">Copies @dest, creating an identical #PopplerDest.</doc>
+        <return-value transfer-ownership="full">
+          <doc xml:whitespace="preserve">a new destination identical to @dest</doc>
+          <type name="Dest" c:type="PopplerDest*"/>
+        </return-value>
+      </method>
+      <method name="free" c:identifier="poppler_dest_free">
+        <doc xml:whitespace="preserve">Frees @dest</doc>
+        <return-value transfer-ownership="none">
+          <type name="none" c:type="void"/>
+        </return-value>
+      </method>
+    </record>
+    <enumeration name="DestType"
+                 glib:type-name="PopplerDestType"
+                 glib:get-type="poppler_dest_type_get_type"
+                 c:type="PopplerDestType">
+      <doc xml:whitespace="preserve">Destination types</doc>
+      <member name="unknown"
+              value="0"
+              c:identifier="POPPLER_DEST_UNKNOWN"
+              glib:nick="unknown"/>
+      <member name="xyz"
+              value="1"
+              c:identifier="POPPLER_DEST_XYZ"
+              glib:nick="xyz"/>
+      <member name="fit"
+              value="2"
+              c:identifier="POPPLER_DEST_FIT"
+              glib:nick="fit"/>
+      <member name="fith"
+              value="3"
+              c:identifier="POPPLER_DEST_FITH"
+              glib:nick="fith"/>
+      <member name="fitv"
+              value="4"
+              c:identifier="POPPLER_DEST_FITV"
+              glib:nick="fitv"/>
+      <member name="fitr"
+              value="5"
+              c:identifier="POPPLER_DEST_FITR"
+              glib:nick="fitr"/>
+      <member name="fitb"
+              value="6"
+              c:identifier="POPPLER_DEST_FITB"
+              glib:nick="fitb"/>
+      <member name="fitbh"
+              value="7"
+              c:identifier="POPPLER_DEST_FITBH"
+              glib:nick="fitbh"/>
+      <member name="fitbv"
+              value="8"
+              c:identifier="POPPLER_DEST_FITBV"
+              glib:nick="fitbv"/>
+      <member name="named"
+              value="9"
+              c:identifier="POPPLER_DEST_NAMED"
+              glib:nick="named"/>
+    </enumeration>
+    <class name="Document"
+           c:symbol-prefix="document"
+           c:type="PopplerDocument"
+           parent="GObject.Object"
+           glib:type-name="PopplerDocument"
+           glib:get-type="poppler_document_get_type">
+      <constructor name="new_from_data"
+                   c:identifier="poppler_document_new_from_data"
+                   throws="1">
+        <doc xml:whitespace="preserve">Creates a new #PopplerDocument.  If %NULL is returned, then @error will be
+set. Possible errors include those in the #POPPLER_ERROR and #G_FILE_ERROR
+domains.</doc>
+        <return-value transfer-ownership="full">
+          <doc xml:whitespace="preserve">A newly created #PopplerDocument, or %NULL</doc>
+          <type name="Document" c:type="PopplerDocument*"/>
+        </return-value>
+        <parameters>
+          <parameter name="data" transfer-ownership="none">
+            <doc xml:whitespace="preserve">the pdf data contained in a char array</doc>
+            <type name="utf8" c:type="char*"/>
+          </parameter>
+          <parameter name="length" transfer-ownership="none">
+            <doc xml:whitespace="preserve">the length of #data</doc>
+            <type name="gint" c:type="int"/>
+          </parameter>
+          <parameter name="password" transfer-ownership="none" allow-none="1">
+            <doc xml:whitespace="preserve">password to unlock the file with, or %NULL</doc>
+            <type name="utf8" c:type="const char*"/>
+          </parameter>
+        </parameters>
+      </constructor>
+      <constructor name="new_from_file"
+                   c:identifier="poppler_document_new_from_file"
+                   throws="1">
+        <doc xml:whitespace="preserve">Creates a new #PopplerDocument.  If %NULL is returned, then @error will be
+set. Possible errors include those in the #POPPLER_ERROR and #G_FILE_ERROR
+domains.</doc>
+        <return-value transfer-ownership="full">
+          <doc xml:whitespace="preserve">A newly created #PopplerDocument, or %NULL</doc>
+          <type name="Document" c:type="PopplerDocument*"/>
+        </return-value>
+        <parameters>
+          <parameter name="uri" transfer-ownership="none">
+            <doc xml:whitespace="preserve">uri of the file to load</doc>
+            <type name="utf8" c:type="const char*"/>
+          </parameter>
+          <parameter name="password" transfer-ownership="none" allow-none="1">
+            <doc xml:whitespace="preserve">password to unlock the file with, or %NULL</doc>
+            <type name="utf8" c:type="const char*"/>
+          </parameter>
+        </parameters>
+      </constructor>
+      <method name="find_dest" c:identifier="poppler_document_find_dest">
+        <doc xml:whitespace="preserve">Finds named destination @link_name in @document</doc>
+        <return-value transfer-ownership="full">
+          <doc xml:whitespace="preserve">The #PopplerDest destination or %NULL if @link_name is not a destination. Returned value must be freed with #poppler_dest_free</doc>
+          <type name="Dest" c:type="PopplerDest*"/>
+        </return-value>
+        <parameters>
+          <parameter name="link_name" transfer-ownership="none">
+            <doc xml:whitespace="preserve">a named destination</doc>
+            <type name="utf8" c:type="const gchar*"/>
+          </parameter>
+        </parameters>
+      </method>
+      <method name="get_attachments"
+              c:identifier="poppler_document_get_attachments">
+        <doc xml:whitespace="preserve">Returns a #GList containing #PopplerAttachment&lt;!-- --&gt;s.  These attachments
+are unowned, and must be unreffed, and the list must be freed with
+g_list_free().</doc>
+        <return-value transfer-ownership="full">
+          <doc xml:whitespace="preserve">a list of available attachments.</doc>
+          <type name="GLib.List" c:type="GList*">
+            <type name="Attachment"/>
+          </type>
+        </return-value>
+      </method>
+      <method name="get_author"
+              c:identifier="poppler_document_get_author"
+              version="0.16">
+        <doc xml:whitespace="preserve">Returns the author of the document</doc>
+        <return-value transfer-ownership="full">
+          <doc xml:whitespace="preserve">a new allocated string containing the author of @document, or %NULL</doc>
+          <type name="utf8" c:type="gchar*"/>
+        </return-value>
+      </method>
+      <method name="get_creation_date"
+              c:identifier="poppler_document_get_creation_date"
+              version="0.16">
+        <doc xml:whitespace="preserve">Returns the date the document was created as seconds since the Epoch</doc>
+        <return-value transfer-ownership="none">
+          <doc xml:whitespace="preserve">the date the document was created, or -1</doc>
+          <type name="glong" c:type="time_t"/>
+        </return-value>
+      </method>
+      <method name="get_creator"
+              c:identifier="poppler_document_get_creator"
+              version="0.16">
+        <doc xml:whitespace="preserve">Returns the creator of the document. If the document was converted
+from another format, the creator is the name of the product
+that created the original document from which it was converted.</doc>
+        <return-value transfer-ownership="full">
+          <doc xml:whitespace="preserve">a new allocated string containing the creator of @document, or %NULL</doc>
+          <type name="utf8" c:type="gchar*"/>
+        </return-value>
+      </method>
+      <method name="get_form_field"
+              c:identifier="poppler_document_get_form_field">
+        <doc xml:whitespace="preserve">Returns the #PopplerFormField for the given @id. It must be freed with
+g_object_unref()</doc>
+        <return-value transfer-ownership="full">
+          <doc xml:whitespace="preserve">a new #PopplerFormField or %NULL if not found</doc>
+          <type name="FormField" c:type="PopplerFormField*"/>
+        </return-value>
+        <parameters>
+          <parameter name="id" transfer-ownership="none">
+            <doc xml:whitespace="preserve">an id of a #PopplerFormField</doc>
+            <type name="gint" c:type="gint"/>
+          </parameter>
+        </parameters>
+      </method>
+      <method name="get_id"
+              c:identifier="poppler_document_get_id"
+              version="0.16">
+        <doc xml:whitespace="preserve">Returns the PDF file identifier represented as two byte string arrays of size 32.
+@permanent_id is the permanent identifier that is built based on the file
+contents at the time it was originally created, so that this identifer
+never changes. @update_id is the update identifier that is built based on
+the file contents at the time it was last updated.
+
+Note that returned strings are not null-terminated, they have a fixed
+size of 32 bytes.</doc>
+        <return-value transfer-ownership="none">
+          <doc xml:whitespace="preserve">%TRUE if the @document contains an id, %FALSE otherwise</doc>
+          <type name="gboolean" c:type="gboolean"/>
+        </return-value>
+        <parameters>
+          <parameter name="permanent_id"
+                     direction="out"
+                     caller-allocates="0"
+                     transfer-ownership="full"
+                     allow-none="1">
+            <doc xml:whitespace="preserve">location to store an allocated string, use g_free() to free the returned string</doc>
+            <type name="utf8" c:type="gchar**"/>
+          </parameter>
+          <parameter name="update_id"
+                     direction="out"
+                     caller-allocates="0"
+                     transfer-ownership="full"
+                     allow-none="1">
+            <doc xml:whitespace="preserve">location to store an allocated string, use g_free() to free the returned string</doc>
+            <type name="utf8" c:type="gchar**"/>
+          </parameter>
+        </parameters>
+      </method>
+      <method name="get_keywords"
+              c:identifier="poppler_document_get_keywords"
+              version="0.16">
+        <doc xml:whitespace="preserve">Returns the keywords associated to the document</doc>
+        <return-value transfer-ownership="full">
+          <doc xml:whitespace="preserve">a new allocated string containing keywords associated to @document, or %NULL</doc>
+          <type name="utf8" c:type="gchar*"/>
+        </return-value>
+      </method>
+      <method name="get_metadata"
+              c:identifier="poppler_document_get_metadata"
+              version="0.16">
+        <doc xml:whitespace="preserve">Returns the XML metadata string of the document</doc>
+        <return-value transfer-ownership="full">
+          <doc xml:whitespace="preserve">a new allocated string containing the XML metadata, or %NULL</doc>
+          <type name="utf8" c:type="gchar*"/>
+        </return-value>
+      </method>
+      <method name="get_modification_date"
+              c:identifier="poppler_document_get_modification_date"
+              version="0.16">
+        <doc xml:whitespace="preserve">Returns the date the document was most recently modified as seconds since the Epoch</doc>
+        <return-value transfer-ownership="none">
+          <doc xml:whitespace="preserve">the date the document was most recently modified, or -1</doc>
+          <type name="glong" c:type="time_t"/>
+        </return-value>
+      </method>
+      <method name="get_n_attachments"
+              c:identifier="poppler_document_get_n_attachments"
+              version="0.18">
+        <doc xml:whitespace="preserve">Returns the number of attachments in a loaded document.
+See also poppler_document_get_attachments()</doc>
+        <return-value transfer-ownership="none">
+          <doc xml:whitespace="preserve">Number of attachments</doc>
+          <type name="guint" c:type="guint"/>
+        </return-value>
+      </method>
+      <method name="get_n_pages" c:identifier="poppler_document_get_n_pages">
+        <doc xml:whitespace="preserve">Returns the number of pages in a loaded document.</doc>
+        <return-value transfer-ownership="none">
+          <doc xml:whitespace="preserve">Number of pages</doc>
+          <type name="gint" c:type="int"/>
+        </return-value>
+      </method>
+      <method name="get_page" c:identifier="poppler_document_get_page">
+        <doc xml:whitespace="preserve">Returns the #PopplerPage indexed at @index.  This object is owned by the
+caller.</doc>
+        <return-value transfer-ownership="full">
+          <doc xml:whitespace="preserve">The #PopplerPage at @index</doc>
+          <type name="Page" c:type="PopplerPage*"/>
+        </return-value>
+        <parameters>
+          <parameter name="index" transfer-ownership="none">
+            <doc xml:whitespace="preserve">a page index</doc>
+            <type name="gint" c:type="int"/>
+          </parameter>
+        </parameters>
+      </method>
+      <method name="get_page_by_label"
+              c:identifier="poppler_document_get_page_by_label">
+        <doc xml:whitespace="preserve">Returns the #PopplerPage reference by @label.  This object is owned by the
+caller.  @label is a human-readable string representation of the page number,
+and can be document specific.  Typically, it is a value such as "iii" or "3".
+
+By default, "1" refers to the first page.</doc>
+        <return-value transfer-ownership="full">
+          <doc xml:whitespace="preserve">The #PopplerPage referenced by @label</doc>
+          <type name="Page" c:type="PopplerPage*"/>
+        </return-value>
+        <parameters>
+          <parameter name="label" transfer-ownership="none">
+            <doc xml:whitespace="preserve">a page label</doc>
+            <type name="utf8" c:type="const char*"/>
+          </parameter>
+        </parameters>
+      </method>
+      <method name="get_page_layout"
+              c:identifier="poppler_document_get_page_layout"
+              version="0.16">
+        <doc xml:whitespace="preserve">Returns the page layout that should be used when the document is opened</doc>
+        <return-value transfer-ownership="none">
+          <doc xml:whitespace="preserve">a #PopplerPageLayout that should be used when the document is opened</doc>
+          <type name="PageLayout" c:type="PopplerPageLayout"/>
+        </return-value>
+      </method>
+      <method name="get_page_mode"
+              c:identifier="poppler_document_get_page_mode"
+              version="0.16">
+        <doc xml:whitespace="preserve">Returns a #PopplerPageMode representing how the document should
+be initially displayed when opened.</doc>
+        <return-value transfer-ownership="none">
+          <doc xml:whitespace="preserve">a #PopplerPageMode that should be used when document is opened</doc>
+          <type name="PageMode" c:type="PopplerPageMode"/>
+        </return-value>
+      </method>
+      <method name="get_pdf_version"
+              c:identifier="poppler_document_get_pdf_version"
+              version="0.16">
+        <return-value transfer-ownership="none">
+          <doc xml:whitespace="preserve">the major and minor PDF version numbers</doc>
+          <type name="none" c:type="void"/>
+        </return-value>
+        <parameters>
+          <parameter name="major_version"
+                     direction="out"
+                     caller-allocates="0"
+                     transfer-ownership="full"
+                     allow-none="1">
+            <doc xml:whitespace="preserve">return location for the PDF major version number</doc>
+            <type name="guint" c:type="guint*"/>
+          </parameter>
+          <parameter name="minor_version"
+                     direction="out"
+                     caller-allocates="0"
+                     transfer-ownership="full"
+                     allow-none="1">
+            <doc xml:whitespace="preserve">return location for the PDF minor version number</doc>
+            <type name="guint" c:type="guint*"/>
+          </parameter>
+        </parameters>
+      </method>
+      <method name="get_pdf_version_string"
+              c:identifier="poppler_document_get_pdf_version_string"
+              version="0.16">
+        <doc xml:whitespace="preserve">Returns the PDF version of @document as a string (e.g. PDF-1.6)</doc>
+        <return-value transfer-ownership="full">
+          <doc xml:whitespace="preserve">a new allocated string containing the PDF version of @document, or %NULL</doc>
+          <type name="utf8" c:type="gchar*"/>
+        </return-value>
+      </method>
+      <method name="get_permissions"
+              c:identifier="poppler_document_get_permissions"
+              version="0.16">
+        <doc xml:whitespace="preserve">Returns the flags specifying which operations are permitted when the document is opened.</doc>
+        <return-value transfer-ownership="none">
+          <doc xml:whitespace="preserve">a set of falgs from  #PopplerPermissions enumeration</doc>
+          <type name="Permissions" c:type="PopplerPermissions"/>
+        </return-value>
+      </method>
+      <method name="get_producer"
+              c:identifier="poppler_document_get_producer"
+              version="0.16">
+        <doc xml:whitespace="preserve">Returns the producer of the document. If the document was converted
+from another format, the producer is the name of the product
+that converted it to PDF</doc>
+        <return-value transfer-ownership="full">
+          <doc xml:whitespace="preserve">a new allocated string containing the producer of @document, or %NULL</doc>
+          <type name="utf8" c:type="gchar*"/>
+        </return-value>
+      </method>
+      <method name="get_subject"
+              c:identifier="poppler_document_get_subject"
+              version="0.16">
+        <doc xml:whitespace="preserve">Returns the subject of the document</doc>
+        <return-value transfer-ownership="full">
+          <doc xml:whitespace="preserve">a new allocated string containing the subject of @document, or %NULL</doc>
+          <type name="utf8" c:type="gchar*"/>
+        </return-value>
+      </method>
+      <method name="get_title"
+              c:identifier="poppler_document_get_title"
+              version="0.16">
+        <doc xml:whitespace="preserve">Returns the document's title</doc>
+        <return-value transfer-ownership="full">
+          <doc xml:whitespace="preserve">a new allocated string containing the title of @document, or %NULL</doc>
+          <type name="utf8" c:type="gchar*"/>
+        </return-value>
+      </method>
+      <method name="has_attachments"
+              c:identifier="poppler_document_has_attachments">
+        <doc xml:whitespace="preserve">Returns %TRUE of @document has any attachments.</doc>
+        <return-value transfer-ownership="none">
+          <doc xml:whitespace="preserve">%TRUE, if @document has attachments.</doc>
+          <type name="gboolean" c:type="gboolean"/>
+        </return-value>
+      </method>
+      <method name="is_linearized"
+              c:identifier="poppler_document_is_linearized"
+              version="0.16">
+        <doc xml:whitespace="preserve">Returns whether @document is linearized or not. Linearization of PDF
+enables efficient incremental access of the PDF file in a network environment.</doc>
+        <return-value transfer-ownership="none">
+          <doc xml:whitespace="preserve">%TRUE if @document is linearized, %FALSE otherwhise</doc>
+          <type name="gboolean" c:type="gboolean"/>
+        </return-value>
+      </method>
+      <method name="save" c:identifier="poppler_document_save" throws="1">
+        <doc xml:whitespace="preserve">Saves @document. Any change made in the document such as
+form fields filled, annotations added or modified
+will be saved.
+If @error is set, %FALSE will be returned. Possible errors
+include those in the #G_FILE_ERROR domain.</doc>
+        <return-value transfer-ownership="none">
+          <doc xml:whitespace="preserve">%TRUE, if the document was successfully saved</doc>
+          <type name="gboolean" c:type="gboolean"/>
+        </return-value>
+        <parameters>
+          <parameter name="uri" transfer-ownership="none">
+            <doc xml:whitespace="preserve">uri of file to save</doc>
+            <type name="utf8" c:type="const char*"/>
+          </parameter>
+        </parameters>
+      </method>
+      <method name="save_a_copy"
+              c:identifier="poppler_document_save_a_copy"
+              throws="1">
+        <doc xml:whitespace="preserve">Saves a copy of the original @document.
+Any change made in the document such as 
+form fields filled by the user will not be saved. 
+If @error is set, %FALSE will be returned. Possible errors
+include those in the #G_FILE_ERROR domain.</doc>
+        <return-value transfer-ownership="none">
+          <doc xml:whitespace="preserve">%TRUE, if the document was successfully saved</doc>
+          <type name="gboolean" c:type="gboolean"/>
+        </return-value>
+        <parameters>
+          <parameter name="uri" transfer-ownership="none">
+            <doc xml:whitespace="preserve">uri of file to save</doc>
+            <type name="utf8" c:type="const char*"/>
+          </parameter>
+        </parameters>
+      </method>
+      <property name="author" transfer-ownership="none">
+        <doc xml:whitespace="preserve">The author of the document</doc>
+        <type name="utf8"/>
+      </property>
+      <property name="creation-date" transfer-ownership="none">
+        <doc xml:whitespace="preserve">The date the document was created as seconds since the Epoch, or -1</doc>
+        <type name="gint"/>
+      </property>
+      <property name="creator" transfer-ownership="none">
+        <doc xml:whitespace="preserve">The creator of the document. See also poppler_document_get_creator()</doc>
+        <type name="utf8"/>
+      </property>
+      <property name="format" transfer-ownership="none">
+        <doc xml:whitespace="preserve">The PDF version as string. See also poppler_document_get_pdf_version_string()</doc>
+        <type name="utf8"/>
+      </property>
+      <property name="format-major" transfer-ownership="none">
+        <doc xml:whitespace="preserve">The PDF major version number. See also poppler_document_get_pdf_version()</doc>
+        <type name="guint"/>
+      </property>
+      <property name="format-minor" transfer-ownership="none">
+        <doc xml:whitespace="preserve">The PDF minor version number. See also poppler_document_get_pdf_version()</doc>
+        <type name="guint"/>
+      </property>
+      <property name="keywords" transfer-ownership="none">
+        <doc xml:whitespace="preserve">The keywords associated to the document</doc>
+        <type name="utf8"/>
+      </property>
+      <property name="linearized" transfer-ownership="none">
+        <doc xml:whitespace="preserve">Whether document is linearized. See also poppler_document_is_linearized()</doc>
+        <type name="gboolean"/>
+      </property>
+      <property name="metadata" transfer-ownership="none">
+        <doc xml:whitespace="preserve">Document metadata in XML format, or %NULL</doc>
+        <type name="utf8"/>
+      </property>
+      <property name="mod-date" transfer-ownership="none">
+        <doc xml:whitespace="preserve">The date the document was most recently modified as seconds since the Epoch, or -1</doc>
+        <type name="gint"/>
+      </property>
+      <property name="page-layout" transfer-ownership="none">
+        <doc xml:whitespace="preserve">The page layout that should be used when the document is opened</doc>
+        <type name="PageLayout"/>
+      </property>
+      <property name="page-mode" transfer-ownership="none">
+        <doc xml:whitespace="preserve">The mode that should be used when the document is opened</doc>
+        <type name="PageMode"/>
+      </property>
+      <property name="permissions" transfer-ownership="none">
+        <doc xml:whitespace="preserve">Flags specifying which operations are permitted when the document is opened</doc>
+        <type name="Permissions"/>
+      </property>
+      <property name="producer" transfer-ownership="none">
+        <doc xml:whitespace="preserve">The producer of the document. See also poppler_document_get_producer()</doc>
+        <type name="utf8"/>
+      </property>
+      <property name="subject" transfer-ownership="none">
+        <doc xml:whitespace="preserve">The subject of the document</doc>
+        <type name="utf8"/>
+      </property>
+      <property name="title" transfer-ownership="none">
+        <doc xml:whitespace="preserve">The document's title or %NULL</doc>
+        <type name="utf8"/>
+      </property>
+      <property name="viewer-preferences" transfer-ownership="none">
+        <type name="ViewerPreferences"/>
+      </property>
+    </class>
+    <enumeration name="Error"
+                 glib:type-name="PopplerError"
+                 glib:get-type="poppler_error_get_type"
+                 c:type="PopplerError"
+                 glib:error-domain="poppler-quark">
+      <doc xml:whitespace="preserve">Error codes returned by #PopplerDocument</doc>
+      <member name="invalid"
+              value="0"
+              c:identifier="POPPLER_ERROR_INVALID"
+              glib:nick="invalid"/>
+      <member name="encrypted"
+              value="1"
+              c:identifier="POPPLER_ERROR_ENCRYPTED"
+              glib:nick="encrypted"/>
+      <member name="open_file"
+              value="2"
+              c:identifier="POPPLER_ERROR_OPEN_FILE"
+              glib:nick="open-file"/>
+      <member name="bad_catalog"
+              value="3"
+              c:identifier="POPPLER_ERROR_BAD_CATALOG"
+              glib:nick="bad-catalog"/>
+      <member name="damaged"
+              value="4"
+              c:identifier="POPPLER_ERROR_DAMAGED"
+              glib:nick="damaged"/>
+      <function name="quark" c:identifier="poppler_error_quark">
+        <return-value transfer-ownership="none">
+          <type name="GLib.Quark" c:type="GQuark"/>
+        </return-value>
+      </function>
+    </enumeration>
+    <class name="FontInfo"
+           c:symbol-prefix="font_info"
+           c:type="PopplerFontInfo"
+           parent="GObject.Object"
+           glib:type-name="PopplerFontInfo"
+           glib:get-type="poppler_font_info_get_type">
+      <constructor name="new" c:identifier="poppler_font_info_new">
+        <doc xml:whitespace="preserve">Creates a new #PopplerFontInfo object</doc>
+        <return-value transfer-ownership="full">
+          <doc xml:whitespace="preserve">a new #PopplerFontInfo instance</doc>
+          <type name="FontInfo" c:type="PopplerFontInfo*"/>
+        </return-value>
+        <parameters>
+          <parameter name="document" transfer-ownership="none">
+            <doc xml:whitespace="preserve">a #PopplerDocument</doc>
+            <type name="Document" c:type="PopplerDocument*"/>
+          </parameter>
+        </parameters>
+      </constructor>
+      <method name="free" c:identifier="poppler_font_info_free">
+        <return-value transfer-ownership="none">
+          <type name="none" c:type="void"/>
+        </return-value>
+      </method>
+      <method name="scan" c:identifier="poppler_font_info_scan">
+        <doc xml:whitespace="preserve">Scans the document associated with @font_info for fonts. At most
+@n_pages will be scanned starting from the current iterator. @iter will
+point to the first font scanned.
+
+Here is a simple example of code to scan fonts in a document
+
+&lt;informalexample&gt;&lt;programlisting&gt;
+font_info = poppler_font_info_new (document);
+while (poppler_font_info_scan (font_info, 20, &amp;fonts_iter)) {
+        if (!fonts_iter)
+                continue; /&lt;!-- --&gt;* No fonts found in these 20 pages *&lt;!-- --&gt;/
+        do {
+                /&lt;!-- --&gt;* Do something with font iter *&lt;!-- --&gt;/
+                g_print ("Font Name: %s\n", poppler_fonts_iter_get_name (fonts_iter));
+        } while (poppler_fonts_iter_next (fonts_iter));
+        poppler_fonts_iter_free (fonts_iter);
+}
+&lt;/programlisting&gt;&lt;/informalexample&gt;</doc>
+        <return-value transfer-ownership="none">
+          <doc xml:whitespace="preserve">%TRUE, if there are more fonts left to scan</doc>
+          <type name="gboolean" c:type="gboolean"/>
+        </return-value>
+        <parameters>
+          <parameter name="n_pages" transfer-ownership="none">
+            <doc xml:whitespace="preserve">number of pages to scan</doc>
+            <type name="gint" c:type="int"/>
+          </parameter>
+          <parameter name="iter"
+                     direction="out"
+                     caller-allocates="0"
+                     transfer-ownership="full">
+            <doc xml:whitespace="preserve">return location for a #PopplerFontsIter</doc>
+            <type name="FontsIter" c:type="PopplerFontsIter**"/>
+          </parameter>
+        </parameters>
+      </method>
+    </class>
+    <enumeration name="FontType"
+                 glib:type-name="PopplerFontType"
+                 glib:get-type="poppler_font_type_get_type"
+                 c:type="PopplerFontType">
+      <doc xml:whitespace="preserve">Font types</doc>
+      <member name="unknown"
+              value="0"
+              c:identifier="POPPLER_FONT_TYPE_UNKNOWN"
+              glib:nick="unknown"/>
+      <member name="type1"
+              value="1"
+              c:identifier="POPPLER_FONT_TYPE_TYPE1"
+              glib:nick="type1"/>
+      <member name="type1c"
+              value="2"
+              c:identifier="POPPLER_FONT_TYPE_TYPE1C"
+              glib:nick="type1c"/>
+      <member name="type1cot"
+              value="3"
+              c:identifier="POPPLER_FONT_TYPE_TYPE1COT"
+              glib:nick="type1cot"/>
+      <member name="type3"
+              value="4"
+              c:identifier="POPPLER_FONT_TYPE_TYPE3"
+              glib:nick="type3"/>
+      <member name="truetype"
+              value="5"
+              c:identifier="POPPLER_FONT_TYPE_TRUETYPE"
+              glib:nick="truetype"/>
+      <member name="truetypeot"
+              value="6"
+              c:identifier="POPPLER_FONT_TYPE_TRUETYPEOT"
+              glib:nick="truetypeot"/>
+      <member name="cid_type0"
+              value="7"
+              c:identifier="POPPLER_FONT_TYPE_CID_TYPE0"
+              glib:nick="cid-type0"/>
+      <member name="cid_type0c"
+              value="8"
+              c:identifier="POPPLER_FONT_TYPE_CID_TYPE0C"
+              glib:nick="cid-type0c"/>
+      <member name="cid_type0cot"
+              value="9"
+              c:identifier="POPPLER_FONT_TYPE_CID_TYPE0COT"
+              glib:nick="cid-type0cot"/>
+      <member name="cid_type2"
+              value="10"
+              c:identifier="POPPLER_FONT_TYPE_CID_TYPE2"
+              glib:nick="cid-type2"/>
+      <member name="cid_type2ot"
+              value="11"
+              c:identifier="POPPLER_FONT_TYPE_CID_TYPE2OT"
+              glib:nick="cid-type2ot"/>
+    </enumeration>
+    <record name="FontsIter"
+            c:type="PopplerFontsIter"
+            glib:type-name="PopplerFontsIter"
+            glib:get-type="poppler_fonts_iter_get_type"
+            c:symbol-prefix="fonts_iter">
+      <method name="copy" c:identifier="poppler_fonts_iter_copy">
+        <doc xml:whitespace="preserve">Creates a copy of @iter</doc>
+        <return-value transfer-ownership="full">
+          <doc xml:whitespace="preserve">a new allocated copy of @iter</doc>
+          <type name="FontsIter" c:type="PopplerFontsIter*"/>
+        </return-value>
+      </method>
+      <method name="free" c:identifier="poppler_fonts_iter_free">
+        <doc xml:whitespace="preserve">Frees the given #PopplerFontsIter</doc>
+        <return-value transfer-ownership="none">
+          <type name="none" c:type="void"/>
+        </return-value>
+      </method>
+      <method name="get_encoding"
+              c:identifier="poppler_fonts_iter_get_encoding"
+              version="0.20">
+        <doc xml:whitespace="preserve">Returns the encoding of the font associated with @iter</doc>
+        <return-value transfer-ownership="none">
+          <doc xml:whitespace="preserve">the font encoding</doc>
+          <type name="utf8" c:type="const char*"/>
+        </return-value>
+      </method>
+      <method name="get_file_name"
+              c:identifier="poppler_fonts_iter_get_file_name">
+        <doc xml:whitespace="preserve">The filename of the font associated with @iter or %NULL if
+the font is embedded</doc>
+        <return-value transfer-ownership="none">
+          <doc xml:whitespace="preserve">the filename of the font or %NULL if font is embedded</doc>
+          <type name="utf8" c:type="const char*"/>
+        </return-value>
+      </method>
+      <method name="get_font_type"
+              c:identifier="poppler_fonts_iter_get_font_type">
+        <doc xml:whitespace="preserve">Returns the type of the font associated with @iter</doc>
+        <return-value transfer-ownership="none">
+          <doc xml:whitespace="preserve">the font type</doc>
+          <type name="FontType" c:type="PopplerFontType"/>
+        </return-value>
+      </method>
+      <method name="get_full_name"
+              c:identifier="poppler_fonts_iter_get_full_name">
+        <doc xml:whitespace="preserve">Returns the full name of the font associated with @iter</doc>
+        <return-value transfer-ownership="none">
+          <doc xml:whitespace="preserve">the font full name</doc>
+          <type name="utf8" c:type="const char*"/>
+        </return-value>
+      </method>
+      <method name="get_name" c:identifier="poppler_fonts_iter_get_name">
+        <doc xml:whitespace="preserve">Returns the name of the font associated with @iter</doc>
+        <return-value transfer-ownership="none">
+          <doc xml:whitespace="preserve">the font name</doc>
+          <type name="utf8" c:type="const char*"/>
+        </return-value>
+      </method>
+      <method name="get_substitute_name"
+              c:identifier="poppler_fonts_iter_get_substitute_name"
+              version="0.20">
+        <doc xml:whitespace="preserve">The name of the substitute font of the font associated with @iter or %NULL if
+the font is embedded</doc>
+        <return-value transfer-ownership="none">
+          <doc xml:whitespace="preserve">the name of the substitute font or %NULL if font is embedded</doc>
+          <type name="utf8" c:type="const char*"/>
+        </return-value>
+      </method>
+      <method name="is_embedded" c:identifier="poppler_fonts_iter_is_embedded">
+        <doc xml:whitespace="preserve">Returns whether the font associated with @iter is embedded in the document</doc>
+        <return-value transfer-ownership="none">
+          <doc xml:whitespace="preserve">%TRUE if font is emebdded, %FALSE otherwise</doc>
+          <type name="gboolean" c:type="gboolean"/>
+        </return-value>
+      </method>
+      <method name="is_subset" c:identifier="poppler_fonts_iter_is_subset">
+        <doc xml:whitespace="preserve">Returns whether the font associated with @iter is a subset of another font</doc>
+        <return-value transfer-ownership="none">
+          <doc xml:whitespace="preserve">%TRUE if font is a subset, %FALSE otherwise</doc>
+          <type name="gboolean" c:type="gboolean"/>
+        </return-value>
+      </method>
+      <method name="next" c:identifier="poppler_fonts_iter_next">
+        <doc xml:whitespace="preserve">Sets @iter to point to the next font</doc>
+        <return-value transfer-ownership="none">
+          <doc xml:whitespace="preserve">%TRUE, if @iter was set to the next font</doc>
+          <type name="gboolean" c:type="gboolean"/>
+        </return-value>
+      </method>
+    </record>
+    <enumeration name="FormButtonType"
+                 glib:type-name="PopplerFormButtonType"
+                 glib:get-type="poppler_form_button_type_get_type"
+                 c:type="PopplerFormButtonType">
+      <member name="push"
+              value="0"
+              c:identifier="POPPLER_FORM_BUTTON_PUSH"
+              glib:nick="push"/>
+      <member name="check"
+              value="1"
+              c:identifier="POPPLER_FORM_BUTTON_CHECK"
+              glib:nick="check"/>
+      <member name="radio"
+              value="2"
+              c:identifier="POPPLER_FORM_BUTTON_RADIO"
+              glib:nick="radio"/>
+    </enumeration>
+    <enumeration name="FormChoiceType"
+                 glib:type-name="PopplerFormChoiceType"
+                 glib:get-type="poppler_form_choice_type_get_type"
+                 c:type="PopplerFormChoiceType">
+      <member name="combo"
+              value="0"
+              c:identifier="POPPLER_FORM_CHOICE_COMBO"
+              glib:nick="combo"/>
+      <member name="list"
+              value="1"
+              c:identifier="POPPLER_FORM_CHOICE_LIST"
+              glib:nick="list"/>
+    </enumeration>
+    <class name="FormField"
+           c:symbol-prefix="form_field"
+           c:type="PopplerFormField"
+           parent="GObject.Object"
+           glib:type-name="PopplerFormField"
+           glib:get-type="poppler_form_field_get_type">
+      <method name="button_get_button_type"
+              c:identifier="poppler_form_field_button_get_button_type">
+        <doc xml:whitespace="preserve">Gets the button type of @field</doc>
+        <return-value transfer-ownership="none">
+          <doc xml:whitespace="preserve">#PopplerFormButtonType of @field</doc>
+          <type name="FormButtonType" c:type="PopplerFormButtonType"/>
+        </return-value>
+      </method>
+      <method name="button_get_state"
+              c:identifier="poppler_form_field_button_get_state">
+        <doc xml:whitespace="preserve">Queries a #PopplerFormField and returns its current state. Returns %TRUE if
+@field is pressed in and %FALSE if it is raised.</doc>
+        <return-value transfer-ownership="none">
+          <doc xml:whitespace="preserve">current state of @field</doc>
+          <type name="gboolean" c:type="gboolean"/>
+        </return-value>
+      </method>
+      <method name="button_set_state"
+              c:identifier="poppler_form_field_button_set_state">
+        <doc xml:whitespace="preserve">Sets the status of @field. Set to %TRUE if you want the #PopplerFormField
+to be 'pressed in', and %FALSE to raise it.</doc>
+        <return-value transfer-ownership="none">
+          <type name="none" c:type="void"/>
+        </return-value>
+        <parameters>
+          <parameter name="state" transfer-ownership="none">
+            <doc xml:whitespace="preserve">%TRUE or %FALSE</doc>
+            <type name="gboolean" c:type="gboolean"/>
+          </parameter>
+        </parameters>
+      </method>
+      <method name="choice_can_select_multiple"
+              c:identifier="poppler_form_field_choice_can_select_multiple">
+        <doc xml:whitespace="preserve">Checks whether @field allows multiple choices to be selected</doc>
+        <return-value transfer-ownership="none">
+          <doc xml:whitespace="preserve">%TRUE if @field allows multiple choices to be selected</doc>
+          <type name="gboolean" c:type="gboolean"/>
+        </return-value>
+      </method>
+      <method name="choice_commit_on_change"
+              c:identifier="poppler_form_field_choice_commit_on_change">
+        <return-value transfer-ownership="none">
+          <type name="gboolean" c:type="gboolean"/>
+        </return-value>
+      </method>
+      <method name="choice_do_spell_check"
+              c:identifier="poppler_form_field_choice_do_spell_check">
+        <doc xml:whitespace="preserve">Checks whether spell checking should be done for the contents of @field</doc>
+        <return-value transfer-ownership="none">
+          <doc xml:whitespace="preserve">%TRUE if spell checking should be done for @field</doc>
+          <type name="gboolean" c:type="gboolean"/>
+        </return-value>
+      </method>
+      <method name="choice_get_choice_type"
+              c:identifier="poppler_form_field_choice_get_choice_type">
+        <doc xml:whitespace="preserve">Gets the choice type of @field</doc>
+        <return-value transfer-ownership="none">
+          <doc xml:whitespace="preserve">#PopplerFormChoiceType of @field</doc>
+          <type name="FormChoiceType" c:type="PopplerFormChoiceType"/>
+        </return-value>
+      </method>
+      <method name="choice_get_item"
+              c:identifier="poppler_form_field_choice_get_item">
+        <doc xml:whitespace="preserve">Returns the contents of the item on @field at the given index</doc>
+        <return-value transfer-ownership="full">
+          <doc xml:whitespace="preserve">a new allocated string. It must be freed with g_free() when done.</doc>
+          <type name="utf8" c:type="gchar*"/>
+        </return-value>
+        <parameters>
+          <parameter name="index" transfer-ownership="none">
+            <doc xml:whitespace="preserve">the index of the item</doc>
+            <type name="gint" c:type="gint"/>
+          </parameter>
+        </parameters>
+      </method>
+      <method name="choice_get_n_items"
+              c:identifier="poppler_form_field_choice_get_n_items">
+        <doc xml:whitespace="preserve">Returns the number of items on @field</doc>
+        <return-value transfer-ownership="none">
+          <doc xml:whitespace="preserve">the number of items on @field</doc>
+          <type name="gint" c:type="gint"/>
+        </return-value>
+      </method>
+      <method name="choice_get_text"
+              c:identifier="poppler_form_field_choice_get_text">
+        <doc xml:whitespace="preserve">Retrieves the contents of @field.</doc>
+        <return-value transfer-ownership="full">
+          <doc xml:whitespace="preserve">a new allocated string. It must be freed with g_free() when done.</doc>
+          <type name="utf8" c:type="gchar*"/>
+        </return-value>
+      </method>
+      <method name="choice_is_editable"
+              c:identifier="poppler_form_field_choice_is_editable">
+        <doc xml:whitespace="preserve">Checks whether @field is editable</doc>
+        <return-value transfer-ownership="none">
+          <doc xml:whitespace="preserve">%TRUE if @field is editable</doc>
+          <type name="gboolean" c:type="gboolean"/>
+        </return-value>
+      </method>
+      <method name="choice_is_item_selected"
+              c:identifier="poppler_form_field_choice_is_item_selected">
+        <doc xml:whitespace="preserve">Checks whether the item at the given index on @field is currently selected</doc>
+        <return-value transfer-ownership="none">
+          <doc xml:whitespace="preserve">%TRUE if item at @index is currently selected</doc>
+          <type name="gboolean" c:type="gboolean"/>
+        </return-value>
+        <parameters>
+          <parameter name="index" transfer-ownership="none">
+            <doc xml:whitespace="preserve">the index of the item</doc>
+            <type name="gint" c:type="gint"/>
+          </parameter>
+        </parameters>
+      </method>
+      <method name="choice_select_item"
+              c:identifier="poppler_form_field_choice_select_item">
+        <doc xml:whitespace="preserve">Selects the item at the given index on @field</doc>
+        <return-value transfer-ownership="none">
+          <type name="none" c:type="void"/>
+        </return-value>
+        <parameters>
+          <parameter name="index" transfer-ownership="none">
+            <doc xml:whitespace="preserve">the index of the item</doc>
+            <type name="gint" c:type="gint"/>
+          </parameter>
+        </parameters>
+      </method>
+      <method name="choice_set_text"
+              c:identifier="poppler_form_field_choice_set_text">
+        <doc xml:whitespace="preserve">Sets the text in @field to the given value, replacing the current contents</doc>
+        <return-value transfer-ownership="none">
+          <type name="none" c:type="void"/>
+        </return-value>
+        <parameters>
+          <parameter name="text" transfer-ownership="none">
+            <doc xml:whitespace="preserve">the new text</doc>
+            <type name="utf8" c:type="const gchar*"/>
+          </parameter>
+        </parameters>
+      </method>
+      <method name="choice_toggle_item"
+              c:identifier="poppler_form_field_choice_toggle_item">
+        <doc xml:whitespace="preserve">Changes the state of the item at the given index</doc>
+        <return-value transfer-ownership="none">
+          <type name="none" c:type="void"/>
+        </return-value>
+        <parameters>
+          <parameter name="index" transfer-ownership="none">
+            <doc xml:whitespace="preserve">the index of the item</doc>
+            <type name="gint" c:type="gint"/>
+          </parameter>
+        </parameters>
+      </method>
+      <method name="choice_unselect_all"
+              c:identifier="poppler_form_field_choice_unselect_all">
+        <doc xml:whitespace="preserve">Unselects all the items on @field</doc>
+        <return-value transfer-ownership="none">
+          <type name="none" c:type="void"/>
+        </return-value>
+      </method>
+      <method name="get_action"
+              c:identifier="poppler_form_field_get_action"
+              version="0.18">
+        <doc xml:whitespace="preserve">Retrieves the action (#PopplerAction) that shall be
+performed when @field is activated, or %NULL</doc>
+        <return-value transfer-ownership="none">
+          <doc xml:whitespace="preserve">the action to perform. The returned object is owned by @field and should not be freed</doc>
+          <type name="Action" c:type="PopplerAction*"/>
+        </return-value>
+      </method>
+      <method name="get_field_type"
+              c:identifier="poppler_form_field_get_field_type">
+        <doc xml:whitespace="preserve">Gets the type of @field</doc>
+        <return-value transfer-ownership="none">
+          <doc xml:whitespace="preserve">#PopplerFormFieldType of @field</doc>
+          <type name="FormFieldType" c:type="PopplerFormFieldType"/>
+        </return-value>
+      </method>
+      <method name="get_font_size"
+              c:identifier="poppler_form_field_get_font_size">
+        <doc xml:whitespace="preserve">Gets the font size of @field</doc>
+        <return-value transfer-ownership="none">
+          <doc xml:whitespace="preserve">the font size of @field</doc>
+          <type name="gdouble" c:type="gdouble"/>
+        </return-value>
+      </method>
+      <method name="get_id" c:identifier="poppler_form_field_get_id">
+        <doc xml:whitespace="preserve">Gets the id of @field</doc>
+        <return-value transfer-ownership="none">
+          <doc xml:whitespace="preserve">the id of @field</doc>
+          <type name="gint" c:type="gint"/>
+        </return-value>
+      </method>
+      <method name="get_mapping_name"
+              c:identifier="poppler_form_field_get_mapping_name"
+              version="0.16">
+        <doc xml:whitespace="preserve">Gets the mapping name of @field that is used when
+exporting interactive form field data from the document</doc>
+        <return-value transfer-ownership="full">
+          <doc xml:whitespace="preserve">a new allocated string. It must be freed with g_free() when done.</doc>
+          <type name="utf8" c:type="gchar*"/>
+        </return-value>
+      </method>
+      <method name="get_name"
+              c:identifier="poppler_form_field_get_name"
+              version="0.16">
+        <doc xml:whitespace="preserve">Gets the fully qualified name of @field. It's constructed by concatenating
+the partial field names of the field and all of its ancestors.</doc>
+        <return-value transfer-ownership="full">
+          <doc xml:whitespace="preserve">a new allocated string. It must be freed with g_free() when done.</doc>
+          <type name="utf8" c:type="gchar*"/>
+        </return-value>
+      </method>
+      <method name="get_partial_name"
+              c:identifier="poppler_form_field_get_partial_name"
+              version="0.16">
+        <doc xml:whitespace="preserve">Gets the partial name of @field.</doc>
+        <return-value transfer-ownership="full">
+          <doc xml:whitespace="preserve">a new allocated string. It must be freed with g_free() when done.</doc>
+          <type name="utf8" c:type="gchar*"/>
+        </return-value>
+      </method>
+      <method name="is_read_only"
+              c:identifier="poppler_form_field_is_read_only">
+        <doc xml:whitespace="preserve">Checks whether @field is read only</doc>
+        <return-value transfer-ownership="none">
+          <doc xml:whitespace="preserve">%TRUE if @field is read only</doc>
+          <type name="gboolean" c:type="gboolean"/>
+        </return-value>
+      </method>
+      <method name="text_do_scroll"
+              c:identifier="poppler_form_field_text_do_scroll">
+        <return-value transfer-ownership="none">
+          <type name="gboolean" c:type="gboolean"/>
+        </return-value>
+      </method>
+      <method name="text_do_spell_check"
+              c:identifier="poppler_form_field_text_do_spell_check">
+        <doc xml:whitespace="preserve">Checks whether spell checking should be done for the contents of @field</doc>
+        <return-value transfer-ownership="none">
+          <doc xml:whitespace="preserve">%TRUE if spell checking should be done for @field</doc>
+          <type name="gboolean" c:type="gboolean"/>
+        </return-value>
+      </method>
+      <method name="text_get_max_len"
+              c:identifier="poppler_form_field_text_get_max_len">
+        <doc xml:whitespace="preserve">Retrieves the maximum allowed length of the text in @field</doc>
+        <return-value transfer-ownership="none">
+          <doc xml:whitespace="preserve">the maximum allowed number of characters in @field, or -1 if there is no maximum.</doc>
+          <type name="gint" c:type="gint"/>
+        </return-value>
+      </method>
+      <method name="text_get_text"
+              c:identifier="poppler_form_field_text_get_text">
+        <doc xml:whitespace="preserve">Retrieves the contents of @field.</doc>
+        <return-value transfer-ownership="full">
+          <doc xml:whitespace="preserve">a new allocated string. It must be freed with g_free() when done.</doc>
+          <type name="utf8" c:type="gchar*"/>
+        </return-value>
+      </method>
+      <method name="text_get_text_type"
+              c:identifier="poppler_form_field_text_get_text_type">
+        <doc xml:whitespace="preserve">Gets the text type of @field.</doc>
+        <return-value transfer-ownership="none">
+          <doc xml:whitespace="preserve">#PopplerFormTextType of @field</doc>
+          <type name="FormTextType" c:type="PopplerFormTextType"/>
+        </return-value>
+      </method>
+      <method name="text_is_password"
+              c:identifier="poppler_form_field_text_is_password">
+        <doc xml:whitespace="preserve">Checks whether content of @field is a password and it must be hidden</doc>
+        <return-value transfer-ownership="none">
+          <doc xml:whitespace="preserve">%TRUE if the content of @field is a password</doc>
+          <type name="gboolean" c:type="gboolean"/>
+        </return-value>
+      </method>
+      <method name="text_is_rich_text"
+              c:identifier="poppler_form_field_text_is_rich_text">
+        <doc xml:whitespace="preserve">Checks whether the contents of @field are rich text</doc>
+        <return-value transfer-ownership="none">
+          <doc xml:whitespace="preserve">%TRUE if the contents of @field are rich text</doc>
+          <type name="gboolean" c:type="gboolean"/>
+        </return-value>
+      </method>
+      <method name="text_set_text"
+              c:identifier="poppler_form_field_text_set_text">
+        <doc xml:whitespace="preserve">Sets the text in @field to the given value, replacing the current contents.</doc>
+        <return-value transfer-ownership="none">
+          <type name="none" c:type="void"/>
+        </return-value>
+        <parameters>
+          <parameter name="text" transfer-ownership="none">
+            <doc xml:whitespace="preserve">the new text</doc>
+            <type name="utf8" c:type="const gchar*"/>
+          </parameter>
+        </parameters>
+      </method>
+    </class>
+    <record name="FormFieldMapping"
+            c:type="PopplerFormFieldMapping"
+            glib:type-name="PopplerFormFieldMapping"
+            glib:get-type="poppler_form_field_mapping_get_type"
+            c:symbol-prefix="form_field_mapping">
+      <doc xml:whitespace="preserve">A #PopplerFormFieldMapping structure represents the location
+of @field on the page</doc>
+      <field name="area" writable="1">
+        <type name="Rectangle" c:type="PopplerRectangle"/>
+      </field>
+      <field name="field" writable="1">
+        <type name="FormField" c:type="PopplerFormField*"/>
+      </field>
+      <constructor name="new" c:identifier="poppler_form_field_mapping_new">
+        <doc xml:whitespace="preserve">Creates a new #PopplerFormFieldMapping</doc>
+        <return-value transfer-ownership="full">
+          <doc xml:whitespace="preserve">a new #PopplerFormFieldMapping, use poppler_form_field_mapping_free() to free it</doc>
+          <type name="FormFieldMapping" c:type="PopplerFormFieldMapping*"/>
+        </return-value>
+      </constructor>
+      <method name="copy" c:identifier="poppler_form_field_mapping_copy">
+        <doc xml:whitespace="preserve">Creates a copy of @mapping</doc>
+        <return-value transfer-ownership="full">
+          <doc xml:whitespace="preserve">a new allocated copy of @mapping</doc>
+          <type name="FormFieldMapping" c:type="PopplerFormFieldMapping*"/>
+        </return-value>
+      </method>
+      <method name="free" c:identifier="poppler_form_field_mapping_free">
+        <doc xml:whitespace="preserve">Frees the given #PopplerFormFieldMapping</doc>
+        <return-value transfer-ownership="none">
+          <type name="none" c:type="void"/>
+        </return-value>
+      </method>
+    </record>
+    <enumeration name="FormFieldType"
+                 glib:type-name="PopplerFormFieldType"
+                 glib:get-type="poppler_form_field_type_get_type"
+                 c:type="PopplerFormFieldType">
+      <member name="unknown"
+              value="0"
+              c:identifier="POPPLER_FORM_FIELD_UNKNOWN"
+              glib:nick="unknown"/>
+      <member name="button"
+              value="1"
+              c:identifier="POPPLER_FORM_FIELD_BUTTON"
+              glib:nick="button"/>
+      <member name="text"
+              value="2"
+              c:identifier="POPPLER_FORM_FIELD_TEXT"
+              glib:nick="text"/>
+      <member name="choice"
+              value="3"
+              c:identifier="POPPLER_FORM_FIELD_CHOICE"
+              glib:nick="choice"/>
+      <member name="signature"
+              value="4"
+              c:identifier="POPPLER_FORM_FIELD_SIGNATURE"
+              glib:nick="signature"/>
+    </enumeration>
+    <enumeration name="FormTextType"
+                 glib:type-name="PopplerFormTextType"
+                 glib:get-type="poppler_form_text_type_get_type"
+                 c:type="PopplerFormTextType">
+      <member name="normal"
+              value="0"
+              c:identifier="POPPLER_FORM_TEXT_NORMAL"
+              glib:nick="normal"/>
+      <member name="multiline"
+              value="1"
+              c:identifier="POPPLER_FORM_TEXT_MULTILINE"
+              glib:nick="multiline"/>
+      <member name="file_select"
+              value="2"
+              c:identifier="POPPLER_FORM_TEXT_FILE_SELECT"
+              glib:nick="file-select"/>
+    </enumeration>
+    <constant name="HAS_CAIRO" value="1" c:type="POPPLER_HAS_CAIRO">
+      <type name="gint" c:type="gint"/>
+    </constant>
+    <record name="ImageMapping"
+            c:type="PopplerImageMapping"
+            glib:type-name="PopplerImageMapping"
+            glib:get-type="poppler_image_mapping_get_type"
+            c:symbol-prefix="image_mapping">
+      <doc xml:whitespace="preserve">A #PopplerImageMapping structure represents the location
+of an image on the page</doc>
+      <field name="area" writable="1">
+        <type name="Rectangle" c:type="PopplerRectangle"/>
+      </field>
+      <field name="image_id" writable="1">
+        <type name="gint" c:type="gint"/>
+      </field>
+      <constructor name="new" c:identifier="poppler_image_mapping_new">
+        <doc xml:whitespace="preserve">Creates a new #PopplerImageMapping</doc>
+        <return-value transfer-ownership="full">
+          <doc xml:whitespace="preserve">a new #PopplerImageMapping, use poppler_image_mapping_free() to free it</doc>
+          <type name="ImageMapping" c:type="PopplerImageMapping*"/>
+        </return-value>
+      </constructor>
+      <method name="copy" c:identifier="poppler_image_mapping_copy">
+        <doc xml:whitespace="preserve">Creates a copy of @mapping</doc>
+        <return-value transfer-ownership="full">
+          <doc xml:whitespace="preserve">a new allocated copy of @mapping</doc>
+          <type name="ImageMapping" c:type="PopplerImageMapping*"/>
+        </return-value>
+      </method>
+      <method name="free" c:identifier="poppler_image_mapping_free">
+        <doc xml:whitespace="preserve">Frees the given #PopplerImageMapping</doc>
+        <return-value transfer-ownership="none">
+          <type name="none" c:type="void"/>
+        </return-value>
+      </method>
+    </record>
+    <record name="IndexIter"
+            c:type="PopplerIndexIter"
+            glib:type-name="PopplerIndexIter"
+            glib:get-type="poppler_index_iter_get_type"
+            c:symbol-prefix="index_iter">
+      <constructor name="new" c:identifier="poppler_index_iter_new">
+        <doc xml:whitespace="preserve">Returns the root #PopplerIndexIter for @document, or %NULL.  This must be
+freed with poppler_index_iter_free().
+
+Certain documents have an index associated with them.  This index can be used
+to help the user navigate the document, and is similar to a table of
+contents.  Each node in the index will contain a #PopplerAction that can be
+displayed to the user &amp;mdash; typically a #POPPLER_ACTION_GOTO_DEST or a
+#POPPLER_ACTION_URI&lt;!-- --&gt;.
+
+Here is a simple example of some code that walks the full index:
+
+&lt;informalexample&gt;&lt;programlisting&gt;
+static void
+walk_index (PopplerIndexIter *iter)
+{
+  do
+    {
+      /&lt;!-- --&gt;* Get the the action and do something with it *&lt;!-- --&gt;/
+      PopplerIndexIter *child = poppler_index_iter_get_child (iter);
+      if (child)
+        walk_index (child);
+      poppler_index_iter_free (child);
+    }
+  while (poppler_index_iter_next (iter));
+}
+...
+{
+  iter = poppler_index_iter_new (document);
+  walk_index (iter);
+  poppler_index_iter_free (iter);
+}
+&lt;/programlisting&gt;&lt;/informalexample&gt;</doc>
+        <return-value transfer-ownership="full">
+          <doc xml:whitespace="preserve">a new #PopplerIndexIter</doc>
+          <type name="IndexIter" c:type="PopplerIndexIter*"/>
+        </return-value>
+        <parameters>
+          <parameter name="document" transfer-ownership="none">
+            <doc xml:whitespace="preserve">a #PopplerDocument</doc>
+            <type name="Document" c:type="PopplerDocument*"/>
+          </parameter>
+        </parameters>
+      </constructor>
+      <method name="copy" c:identifier="poppler_index_iter_copy">
+        <doc xml:whitespace="preserve">Creates a new #PopplerIndexIter as a copy of @iter.  This must be freed with
+poppler_index_iter_free().</doc>
+        <return-value transfer-ownership="full">
+          <doc xml:whitespace="preserve">a new #PopplerIndexIter</doc>
+          <type name="IndexIter" c:type="PopplerIndexIter*"/>
+        </return-value>
+      </method>
+      <method name="free" c:identifier="poppler_index_iter_free">
+        <doc xml:whitespace="preserve">Frees @iter.</doc>
+        <return-value transfer-ownership="none">
+          <type name="none" c:type="void"/>
+        </return-value>
+      </method>
+      <method name="get_action" c:identifier="poppler_index_iter_get_action">
+        <doc xml:whitespace="preserve">Returns the #PopplerAction associated with @iter.  It must be freed with
+poppler_action_free().</doc>
+        <return-value transfer-ownership="full">
+          <doc xml:whitespace="preserve">a new #PopplerAction</doc>
+          <type name="Action" c:type="PopplerAction*"/>
+        </return-value>
+      </method>
+      <method name="get_child" c:identifier="poppler_index_iter_get_child">
+        <doc xml:whitespace="preserve">Returns a newly created child of @parent, or %NULL if the iter has no child.
+See poppler_index_iter_new() for more information on this function.</doc>
+        <return-value transfer-ownership="full">
+          <doc xml:whitespace="preserve">a new #PopplerIndexIter</doc>
+          <type name="IndexIter" c:type="PopplerIndexIter*"/>
+        </return-value>
+      </method>
+      <method name="is_open" c:identifier="poppler_index_iter_is_open">
+        <doc xml:whitespace="preserve">Returns whether this node should be expanded by default to the user.  The
+document can provide a hint as to how the document's index should be expanded
+initially.</doc>
+        <return-value transfer-ownership="none">
+          <doc xml:whitespace="preserve">%TRUE, if the document wants @iter to be expanded</doc>
+          <type name="gboolean" c:type="gboolean"/>
+        </return-value>
+      </method>
+      <method name="next" c:identifier="poppler_index_iter_next">
+        <doc xml:whitespace="preserve">Sets @iter to point to the next action at the current level, if valid.  See
+poppler_index_iter_new() for more information.</doc>
+        <return-value transfer-ownership="none">
+          <doc xml:whitespace="preserve">%TRUE, if @iter was set to the next action</doc>
+          <type name="gboolean" c:type="gboolean"/>
+        </return-value>
+      </method>
+    </record>
+    <class name="Layer"
+           c:symbol-prefix="layer"
+           c:type="PopplerLayer"
+           parent="GObject.Object"
+           glib:type-name="PopplerLayer"
+           glib:get-type="poppler_layer_get_type">
+      <method name="get_radio_button_group_id"
+              c:identifier="poppler_layer_get_radio_button_group_id"
+              version="0.12">
+        <doc xml:whitespace="preserve">Returns the numeric ID the radio button group associated with @layer.</doc>
+        <return-value transfer-ownership="none">
+          <doc xml:whitespace="preserve">the ID of the radio button group associated with @layer, or 0 if the layer is not associated to any radio button group</doc>
+          <type name="gint" c:type="gint"/>
+        </return-value>
+      </method>
+      <method name="get_title"
+              c:identifier="poppler_layer_get_title"
+              version="0.12">
+        <doc xml:whitespace="preserve">Returns the name of the layer suitable for
+presentation as a title in a viewer's GUI</doc>
+        <return-value transfer-ownership="none">
+          <doc xml:whitespace="preserve">a string containing the title of the layer</doc>
+          <type name="utf8" c:type="const gchar*"/>
+        </return-value>
+      </method>
+      <method name="hide" c:identifier="poppler_layer_hide" version="0.12">
+        <doc xml:whitespace="preserve">Hides @layer. If @layer is the parent of other nested layers,
+such layers will be also hidden and will be blocked until @layer
+is shown again</doc>
+        <return-value transfer-ownership="none">
+          <type name="none" c:type="void"/>
+        </return-value>
+      </method>
+      <method name="is_parent"
+              c:identifier="poppler_layer_is_parent"
+              version="0.12">
+        <doc xml:whitespace="preserve">Returns whether @layer is parent of other nested layers.</doc>
+        <return-value transfer-ownership="none">
+          <doc xml:whitespace="preserve">%TRUE if @layer is a parent layer</doc>
+          <type name="gboolean" c:type="gboolean"/>
+        </return-value>
+      </method>
+      <method name="is_visible"
+              c:identifier="poppler_layer_is_visible"
+              version="0.12">
+        <doc xml:whitespace="preserve">Returns whether @layer is visible</doc>
+        <return-value transfer-ownership="none">
+          <doc xml:whitespace="preserve">%TRUE if @layer is visible</doc>
+          <type name="gboolean" c:type="gboolean"/>
+        </return-value>
+      </method>
+      <method name="show" c:identifier="poppler_layer_show" version="0.12">
+        <doc xml:whitespace="preserve">Shows @layer</doc>
+        <return-value transfer-ownership="none">
+          <type name="none" c:type="void"/>
+        </return-value>
+      </method>
+    </class>
+    <record name="LayersIter"
+            c:type="PopplerLayersIter"
+            glib:type-name="PopplerLayersIter"
+            glib:get-type="poppler_layers_iter_get_type"
+            c:symbol-prefix="layers_iter">
+      <constructor name="new"
+                   c:identifier="poppler_layers_iter_new"
+                   version="0.12">
+        <return-value transfer-ownership="full">
+          <type name="LayersIter" c:type="PopplerLayersIter*"/>
+        </return-value>
+        <parameters>
+          <parameter name="document" transfer-ownership="none">
+            <doc xml:whitespace="preserve">a #PopplerDocument</doc>
+            <type name="Document" c:type="PopplerDocument*"/>
+          </parameter>
+        </parameters>
+      </constructor>
+      <method name="copy" c:identifier="poppler_layers_iter_copy">
+        <doc xml:whitespace="preserve">Creates a new #PopplerLayersIter as a copy of @iter.  This must be freed with
+poppler_layers_iter_free().</doc>
+        <return-value transfer-ownership="full">
+          <doc xml:whitespace="preserve">a new #PopplerLayersIter  Since 0.12</doc>
+          <type name="LayersIter" c:type="PopplerLayersIter*"/>
+        </return-value>
+      </method>
+      <method name="free"
+              c:identifier="poppler_layers_iter_free"
+              version="0.12">
+        <doc xml:whitespace="preserve">Frees @iter.</doc>
+        <return-value transfer-ownership="none">
+          <type name="none" c:type="void"/>
+        </return-value>
+      </method>
+      <method name="get_child"
+              c:identifier="poppler_layers_iter_get_child"
+              version="0.12">
+        <doc xml:whitespace="preserve">Returns a newly created child of @parent, or %NULL if the iter has no child.
+See poppler_layers_iter_new() for more information on this function.</doc>
+        <return-value transfer-ownership="full">
+          <doc xml:whitespace="preserve">a new #PopplerLayersIter, or %NULL</doc>
+          <type name="LayersIter" c:type="PopplerLayersIter*"/>
+        </return-value>
+      </method>
+      <method name="get_layer"
+              c:identifier="poppler_layers_iter_get_layer"
+              version="0.12">
+        <doc xml:whitespace="preserve">Returns the #PopplerLayer associated with @iter.</doc>
+        <return-value transfer-ownership="full">
+          <doc xml:whitespace="preserve">a new #PopplerLayer, or %NULL if there isn't any layer associated with @iter</doc>
+          <type name="Layer" c:type="PopplerLayer*"/>
+        </return-value>
+      </method>
+      <method name="get_title"
+              c:identifier="poppler_layers_iter_get_title"
+              version="0.12">
+        <doc xml:whitespace="preserve">Returns the title associated with @iter.  It must be freed with
+g_free().</doc>
+        <return-value transfer-ownership="full">
+          <doc xml:whitespace="preserve">a new string containing the @iter's title or %NULL if @iter doesn't have a title. The returned string should be freed with g_free() when no longer needed.</doc>
+          <type name="utf8" c:type="gchar*"/>
+        </return-value>
+      </method>
+      <method name="next"
+              c:identifier="poppler_layers_iter_next"
+              version="0.12">
+        <doc xml:whitespace="preserve">Sets @iter to point to the next action at the current level, if valid.  See
+poppler_layers_iter_new() for more information.</doc>
+        <return-value transfer-ownership="none">
+          <doc xml:whitespace="preserve">%TRUE, if @iter was set to the next action</doc>
+          <type name="gboolean" c:type="gboolean"/>
+        </return-value>
+      </method>
+    </record>
+    <record name="LinkMapping"
+            c:type="PopplerLinkMapping"
+            glib:type-name="PopplerLinkMapping"
+            glib:get-type="poppler_link_mapping_get_type"
+            c:symbol-prefix="link_mapping">
+      <doc xml:whitespace="preserve">A #PopplerLinkMapping structure represents the location
+of @action on the page</doc>
+      <field name="area" writable="1">
+        <type name="Rectangle" c:type="PopplerRectangle"/>
+      </field>
+      <field name="action" writable="1">
+        <type name="Action" c:type="PopplerAction*"/>
+      </field>
+      <constructor name="new" c:identifier="poppler_link_mapping_new">
+        <doc xml:whitespace="preserve">Creates a new #PopplerLinkMapping</doc>
+        <return-value transfer-ownership="full">
+          <doc xml:whitespace="preserve">a new #PopplerLinkMapping, use poppler_link_mapping_free() to free it</doc>
+          <type name="LinkMapping" c:type="PopplerLinkMapping*"/>
+        </return-value>
+      </constructor>
+      <method name="copy" c:identifier="poppler_link_mapping_copy">
+        <doc xml:whitespace="preserve">Creates a copy of @mapping</doc>
+        <return-value transfer-ownership="full">
+          <doc xml:whitespace="preserve">a new allocated copy of @mapping</doc>
+          <type name="LinkMapping" c:type="PopplerLinkMapping*"/>
+        </return-value>
+      </method>
+      <method name="free" c:identifier="poppler_link_mapping_free">
+        <doc xml:whitespace="preserve">Frees the given #PopplerLinkMapping</doc>
+        <return-value transfer-ownership="none">
+          <type name="none" c:type="void"/>
+        </return-value>
+      </method>
+    </record>
+    <constant name="MAJOR_VERSION" value="0" c:type="POPPLER_MAJOR_VERSION">
+      <type name="gint" c:type="gint"/>
+    </constant>
+    <constant name="MICRO_VERSION" value="4" c:type="POPPLER_MICRO_VERSION">
+      <type name="gint" c:type="gint"/>
+    </constant>
+    <constant name="MINOR_VERSION" value="20" c:type="POPPLER_MINOR_VERSION">
+      <type name="gint" c:type="gint"/>
+    </constant>
+    <class name="Media"
+           c:symbol-prefix="media"
+           c:type="PopplerMedia"
+           parent="GObject.Object"
+           glib:type-name="PopplerMedia"
+           glib:get-type="poppler_media_get_type">
+      <method name="get_filename"
+              c:identifier="poppler_media_get_filename"
+              version="0.14">
+        <doc xml:whitespace="preserve">Returns the media clip filename, in case of non-embedded media. filename might be
+a local relative or absolute path or a URI</doc>
+        <return-value transfer-ownership="none">
+          <doc xml:whitespace="preserve">a filename, return value is owned by #PopplerMedia and should not be freed</doc>
+          <type name="utf8" c:type="const gchar*"/>
+        </return-value>
+      </method>
+      <method name="get_mime_type"
+              c:identifier="poppler_media_get_mime_type"
+              version="0.14">
+        <doc xml:whitespace="preserve">Returns the media clip mime-type</doc>
+        <return-value transfer-ownership="none">
+          <doc xml:whitespace="preserve">the mime-type, return value is owned by #PopplerMedia and should not be freed</doc>
+          <type name="utf8" c:type="const gchar*"/>
+        </return-value>
+      </method>
+      <method name="is_embedded"
+              c:identifier="poppler_media_is_embedded"
+              version="0.14">
+        <doc xml:whitespace="preserve">Whether the media clip is embedded in the PDF. If the result is %TRUE, the embedded stream
+can be saved with poppler_media_save() or poppler_media_save_to_callback() function.
+If the result is %FALSE, the media clip filename can be retrieved with
+poppler_media_get_filename() function.</doc>
+        <return-value transfer-ownership="none">
+          <doc xml:whitespace="preserve">%TRUE if media clip is embedded, %FALSE otherwise</doc>
+          <type name="gboolean" c:type="gboolean"/>
+        </return-value>
+      </method>
+      <method name="save"
+              c:identifier="poppler_media_save"
+              version="0.14"
+              throws="1">
+        <doc xml:whitespace="preserve">Saves embedded stream of @poppler_media to a file indicated by @filename.
+If @error is set, %FALSE will be returned.
+Possible errors include those in the #G_FILE_ERROR domain
+and whatever the save function generates.</doc>
+        <return-value transfer-ownership="none">
+          <doc xml:whitespace="preserve">%TRUE, if the file successfully saved</doc>
+          <type name="gboolean" c:type="gboolean"/>
+        </return-value>
+        <parameters>
+          <parameter name="filename" transfer-ownership="none">
+            <doc xml:whitespace="preserve">name of file to save</doc>
+            <type name="utf8" c:type="const char*"/>
+          </parameter>
+        </parameters>
+      </method>
+      <method name="save_to_callback"
+              c:identifier="poppler_media_save_to_callback"
+              version="0.14"
+              throws="1">
+        <doc xml:whitespace="preserve">Saves embedded stream of @poppler_media by feeding the produced data to @save_func. Can be used
+when you want to store the media clip stream to something other than a file, such as
+an in-memory buffer or a socket. If @error is set, %FALSE will be
+returned. Possible errors include those in the #G_FILE_ERROR domain and
+whatever the save function generates.</doc>
+        <return-value transfer-ownership="none">
+          <doc xml:whitespace="preserve">%TRUE, if the save successfully completed</doc>
+          <type name="gboolean" c:type="gboolean"/>
+        </return-value>
+        <parameters>
+          <parameter name="save_func"
+                     transfer-ownership="none"
+                     scope="call"
+                     closure="1">
+            <doc xml:whitespace="preserve">a function that is called to save each block of data that the save routine generates.</doc>
+            <type name="MediaSaveFunc" c:type="PopplerMediaSaveFunc"/>
+          </parameter>
+          <parameter name="user_data" transfer-ownership="none">
+            <doc xml:whitespace="preserve">user data to pass to the save function.</doc>
+            <type name="gpointer" c:type="gpointer"/>
+          </parameter>
+        </parameters>
+      </method>
+    </class>
+    <callback name="MediaSaveFunc"
+              c:type="PopplerMediaSaveFunc"
+              version="0.14"
+              throws="1">
+      <doc xml:whitespace="preserve">Specifies the type of the function passed to
+poppler_media_save_to_callback().  It is called once for each block of
+bytes that is "written" by poppler_media_save_to_callback().  If
+successful it should return %TRUE.  If an error occurs it should set
+@error and return %FALSE, in which case poppler_media_save_to_callback()
+will fail with the same error.</doc>
+      <return-value transfer-ownership="none">
+        <doc xml:whitespace="preserve">%TRUE if successful, %FALSE (with @error set) if failed.</doc>
+        <type name="gboolean" c:type="gboolean"/>
+      </return-value>
+      <parameters>
+        <parameter name="buf" transfer-ownership="none">
+          <doc xml:whitespace="preserve">buffer containing bytes to be written.</doc>
+          <array length="1" zero-terminated="0" c:type="gchar*">
+            <type name="guint8"/>
+          </array>
+        </parameter>
+        <parameter name="count" transfer-ownership="none">
+          <doc xml:whitespace="preserve">number of bytes in @buf.</doc>
+          <type name="gsize" c:type="gsize"/>
+        </parameter>
+        <parameter name="data" transfer-ownership="none" closure="2">
+          <doc xml:whitespace="preserve">user data passed to poppler_media_save_to_callback()</doc>
+          <type name="gpointer" c:type="gpointer"/>
+        </parameter>
+      </parameters>
+    </callback>
+    <class name="Movie"
+           c:symbol-prefix="movie"
+           c:type="PopplerMovie"
+           parent="GObject.Object"
+           glib:type-name="PopplerMovie"
+           glib:get-type="poppler_movie_get_type">
+      <method name="get_filename"
+              c:identifier="poppler_movie_get_filename"
+              version="0.14">
+        <doc xml:whitespace="preserve">Returns the local filename identifying a self-describing movie file</doc>
+        <return-value transfer-ownership="none">
+          <doc xml:whitespace="preserve">a local filename, return value is owned by #PopplerMovie and should not be freed</doc>
+          <type name="utf8" c:type="const gchar*"/>
+        </return-value>
+      </method>
+      <method name="need_poster"
+              c:identifier="poppler_movie_need_poster"
+              version="0.14">
+        <doc xml:whitespace="preserve">Returns whether a poster image representing the Movie
+shall be displayed. The poster image must be retrieved
+from the movie file.</doc>
+        <return-value transfer-ownership="none">
+          <doc xml:whitespace="preserve">%TRUE if move needs a poster image, %FALSE otherwise</doc>
+          <type name="gboolean" c:type="gboolean"/>
+        </return-value>
+      </method>
+      <method name="show_controls"
+              c:identifier="poppler_movie_show_controls"
+              version="0.14">
+        <doc xml:whitespace="preserve">Returns whether to display a movie controller bar while playing the movie</doc>
+        <return-value transfer-ownership="none">
+          <doc xml:whitespace="preserve">%TRUE if controller bar should be displayed, %FALSE otherwise</doc>
+          <type name="gboolean" c:type="gboolean"/>
+        </return-value>
+      </method>
+    </class>
+    <enumeration name="Orientation"
+                 glib:type-name="PopplerOrientation"
+                 glib:get-type="poppler_orientation_get_type"
+                 c:type="PopplerOrientation">
+      <member name="portrait"
+              value="0"
+              c:identifier="POPPLER_ORIENTATION_PORTRAIT"
+              glib:nick="portrait"/>
+      <member name="landscape"
+              value="1"
+              c:identifier="POPPLER_ORIENTATION_LANDSCAPE"
+              glib:nick="landscape"/>
+      <member name="upsidedown"
+              value="2"
+              c:identifier="POPPLER_ORIENTATION_UPSIDEDOWN"
+              glib:nick="upsidedown"/>
+      <member name="seascape"
+              value="3"
+              c:identifier="POPPLER_ORIENTATION_SEASCAPE"
+              glib:nick="seascape"/>
+    </enumeration>
+    <class name="PSFile"
+           c:symbol-prefix="ps_file"
+           c:type="PopplerPSFile"
+           parent="GObject.Object"
+           glib:type-name="PopplerPSFile"
+           glib:get-type="poppler_ps_file_get_type">
+      <constructor name="new" c:identifier="poppler_ps_file_new">
+        <doc xml:whitespace="preserve">Create a new postscript file to render to</doc>
+        <return-value transfer-ownership="full">
+          <doc xml:whitespace="preserve">a PopplerPSFile</doc>
+          <type name="PSFile" c:type="PopplerPSFile*"/>
+        </return-value>
+        <parameters>
+          <parameter name="document" transfer-ownership="none">
+            <doc xml:whitespace="preserve">a #PopplerDocument</doc>
+            <type name="Document" c:type="PopplerDocument*"/>
+          </parameter>
+          <parameter name="filename" transfer-ownership="none">
+            <doc xml:whitespace="preserve">the path of the output filename</doc>
+            <type name="utf8" c:type="const char*"/>
+          </parameter>
+          <parameter name="first_page" transfer-ownership="none">
+            <doc xml:whitespace="preserve">the first page to print</doc>
+            <type name="gint" c:type="int"/>
+          </parameter>
+          <parameter name="n_pages" transfer-ownership="none">
+            <doc xml:whitespace="preserve">the number of pages to print</doc>
+            <type name="gint" c:type="int"/>
+          </parameter>
+        </parameters>
+      </constructor>
+      <method name="free" c:identifier="poppler_ps_file_free">
+        <doc xml:whitespace="preserve">Frees @ps_file</doc>
+        <return-value transfer-ownership="none">
+          <type name="none" c:type="void"/>
+        </return-value>
+      </method>
+      <method name="set_duplex" c:identifier="poppler_ps_file_set_duplex">
+        <doc xml:whitespace="preserve">Enable or disable Duplex printing.</doc>
+        <return-value transfer-ownership="none">
+          <type name="none" c:type="void"/>
+        </return-value>
+        <parameters>
+          <parameter name="duplex" transfer-ownership="none">
+            <doc xml:whitespace="preserve">whether to force duplex printing (on printers which support this)</doc>
+            <type name="gboolean" c:type="gboolean"/>
+          </parameter>
+        </parameters>
+      </method>
+      <method name="set_paper_size"
+              c:identifier="poppler_ps_file_set_paper_size">
+        <doc xml:whitespace="preserve">Set the output paper size. These values will end up in the
+DocumentMedia, the BoundingBox DSC comments and other places in the
+generated PostScript.</doc>
+        <return-value transfer-ownership="none">
+          <type name="none" c:type="void"/>
+        </return-value>
+        <parameters>
+          <parameter name="width" transfer-ownership="none">
+            <doc xml:whitespace="preserve">the paper width in 1/72 inch</doc>
+            <type name="gdouble" c:type="double"/>
+          </parameter>
+          <parameter name="height" transfer-ownership="none">
+            <doc xml:whitespace="preserve">the paper height in 1/72 inch</doc>
+            <type name="gdouble" c:type="double"/>
+          </parameter>
+        </parameters>
+      </method>
+    </class>
+    <class name="Page"
+           c:symbol-prefix="page"
+           c:type="PopplerPage"
+           parent="GObject.Object"
+           glib:type-name="PopplerPage"
+           glib:get-type="poppler_page_get_type">
+      <function name="free_annot_mapping"
+                c:identifier="poppler_page_free_annot_mapping">
+        <doc xml:whitespace="preserve">Frees a list of #PopplerAnnotMapping&lt;!-- --&gt;s allocated by
+poppler_page_get_annot_mapping().  It also unreferences the #PopplerAnnot&lt;!-- --&gt;s
+that each mapping contains, so if you want to keep them around, you need to
+reference them with g_object_ref().</doc>
+        <return-value transfer-ownership="none">
+          <type name="none" c:type="void"/>
+        </return-value>
+        <parameters>
+          <parameter name="list" transfer-ownership="none">
+            <doc xml:whitespace="preserve">A list of #PopplerAnnotMapping&lt;!-- --&gt;s</doc>
+            <type name="GLib.List" c:type="GList*">
+              <type name="AnnotMapping"/>
+            </type>
+          </parameter>
+        </parameters>
+      </function>
+      <function name="free_form_field_mapping"
+                c:identifier="poppler_page_free_form_field_mapping">
+        <doc xml:whitespace="preserve">Frees a list of #PopplerFormFieldMapping&lt;!-- --&gt;s allocated by
+poppler_page_get_form_field_mapping().</doc>
+        <return-value transfer-ownership="none">
+          <type name="none" c:type="void"/>
+        </return-value>
+        <parameters>
+          <parameter name="list" transfer-ownership="none">
+            <doc xml:whitespace="preserve">A list of #PopplerFormFieldMapping&lt;!-- --&gt;s</doc>
+            <type name="GLib.List" c:type="GList*">
+              <type name="FormFieldMapping"/>
+            </type>
+          </parameter>
+        </parameters>
+      </function>
+      <function name="free_image_mapping"
+                c:identifier="poppler_page_free_image_mapping">
+        <doc xml:whitespace="preserve">Frees a list of #PopplerImageMapping&lt;!-- --&gt;s allocated by
+poppler_page_get_image_mapping().</doc>
+        <return-value transfer-ownership="none">
+          <type name="none" c:type="void"/>
+        </return-value>
+        <parameters>
+          <parameter name="list" transfer-ownership="none">
+            <doc xml:whitespace="preserve">A list of #PopplerImageMapping&lt;!-- --&gt;s</doc>
+            <type name="GLib.List" c:type="GList*">
+              <type name="ImageMapping"/>
+            </type>
+          </parameter>
+        </parameters>
+      </function>
+      <function name="free_link_mapping"
+                c:identifier="poppler_page_free_link_mapping">
+        <doc xml:whitespace="preserve">Frees a list of #PopplerLinkMapping&lt;!-- --&gt;s allocated by
+poppler_page_get_link_mapping().  It also frees the #PopplerAction&lt;!-- --&gt;s
+that each mapping contains, so if you want to keep them around, you need to
+copy them with poppler_action_copy().</doc>
+        <return-value transfer-ownership="none">
+          <type name="none" c:type="void"/>
+        </return-value>
+        <parameters>
+          <parameter name="list" transfer-ownership="none">
+            <doc xml:whitespace="preserve">A list of #PopplerLinkMapping&lt;!-- --&gt;s</doc>
+            <type name="GLib.List" c:type="GList*">
+              <type name="LinkMapping"/>
+            </type>
+          </parameter>
+        </parameters>
+      </function>
+      <function name="free_text_attributes"
+                c:identifier="poppler_page_free_text_attributes"
+                version="0.18">
+        <doc xml:whitespace="preserve">Frees a list of #PopplerTextAttributes&lt;!-- --&gt;s allocated by
+poppler_page_get_text_attributes().</doc>
+        <return-value transfer-ownership="none">
+          <type name="none" c:type="void"/>
+        </return-value>
+        <parameters>
+          <parameter name="list" transfer-ownership="none">
+            <doc xml:whitespace="preserve">A list of #PopplerTextAttributes&lt;!-- --&gt;s</doc>
+            <type name="GLib.List" c:type="GList*">
+              <type name="TextAttributes"/>
+            </type>
+          </parameter>
+        </parameters>
+      </function>
+      <function name="selection_region_free"
+                c:identifier="poppler_page_selection_region_free"
+                deprecated="0.16">
+        <doc xml:whitespace="preserve">Frees @region</doc>
+        <return-value transfer-ownership="none">
+          <type name="none" c:type="void"/>
+        </return-value>
+        <parameters>
+          <parameter name="region" transfer-ownership="none">
+            <doc xml:whitespace="preserve">a #GList of #PopplerRectangle</doc>
+            <type name="GLib.List" c:type="GList*">
+              <type name="Rectangle"/>
+            </type>
+          </parameter>
+        </parameters>
+      </function>
+      <method name="add_annot"
+              c:identifier="poppler_page_add_annot"
+              version="0.16">
+        <doc xml:whitespace="preserve">Adds annotation @annot to @page.</doc>
+        <return-value transfer-ownership="none">
+          <type name="none" c:type="void"/>
+        </return-value>
+        <parameters>
+          <parameter name="annot" transfer-ownership="none">
+            <doc xml:whitespace="preserve">a #PopplerAnnot to add</doc>
+            <type name="Annot" c:type="PopplerAnnot*"/>
+          </parameter>
+        </parameters>
+      </method>
+      <method name="find_text" c:identifier="poppler_page_find_text">
+        <doc xml:whitespace="preserve">A #GList of rectangles for each occurance of the text on the page.
+The coordinates are in PDF points.</doc>
+        <return-value transfer-ownership="full">
+          <doc xml:whitespace="preserve">a #GList of #PopplerRectangle,</doc>
+          <type name="GLib.List" c:type="GList*">
+            <type name="Rectangle"/>
+          </type>
+        </return-value>
+        <parameters>
+          <parameter name="text" transfer-ownership="none">
+            <doc xml:whitespace="preserve">the text to search for (UTF-8 encoded)</doc>
+            <type name="utf8" c:type="const char*"/>
+          </parameter>
+        </parameters>
+      </method>
+      <method name="get_annot_mapping"
+              c:identifier="poppler_page_get_annot_mapping">
+        <doc xml:whitespace="preserve">Returns a list of #PopplerAnnotMapping items that map from a location on
+@page to a #PopplerAnnot.  This list must be freed with
+poppler_page_free_annot_mapping() when done.</doc>
+        <return-value transfer-ownership="full">
+          <doc xml:whitespace="preserve">A #GList of #PopplerAnnotMapping</doc>
+          <type name="GLib.List" c:type="GList*">
+            <type name="AnnotMapping"/>
+          </type>
+        </return-value>
+      </method>
+      <method name="get_crop_box" c:identifier="poppler_page_get_crop_box">
+        <doc xml:whitespace="preserve">Retrurns the crop box of @page</doc>
+        <return-value transfer-ownership="none">
+          <type name="none" c:type="void"/>
+        </return-value>
+        <parameters>
+          <parameter name="rect"
+                     direction="out"
+                     caller-allocates="1"
+                     transfer-ownership="none">
+            <doc xml:whitespace="preserve">a #PopplerRectangle to fill</doc>
+            <type name="Rectangle" c:type="PopplerRectangle*"/>
+          </parameter>
+        </parameters>
+      </method>
+      <method name="get_duration" c:identifier="poppler_page_get_duration">
+        <doc xml:whitespace="preserve">Returns the duration of @page</doc>
+        <return-value transfer-ownership="none">
+          <doc xml:whitespace="preserve">duration in seconds of @page or -1.</doc>
+          <type name="gdouble" c:type="double"/>
+        </return-value>
+      </method>
+      <method name="get_form_field_mapping"
+              c:identifier="poppler_page_get_form_field_mapping">
+        <doc xml:whitespace="preserve">Returns a list of #PopplerFormFieldMapping items that map from a
+location on @page to a form field.  This list must be freed
+with poppler_page_free_form_field_mapping() when done.</doc>
+        <return-value transfer-ownership="full">
+          <doc xml:whitespace="preserve">A #GList of #PopplerFormFieldMapping</doc>
+          <type name="GLib.List" c:type="GList*">
+            <type name="FormFieldMapping"/>
+          </type>
+        </return-value>
+      </method>
+      <method name="get_image" c:identifier="poppler_page_get_image">
+        <doc xml:whitespace="preserve">Returns a cairo surface for the image of the @page</doc>
+        <return-value transfer-ownership="full">
+          <doc xml:whitespace="preserve">A cairo surface for the image</doc>
+          <type name="cairo.Surface" c:type="cairo_surface_t*"/>
+        </return-value>
+        <parameters>
+          <parameter name="image_id" transfer-ownership="none">
+            <doc xml:whitespace="preserve">The image identifier</doc>
+            <type name="gint" c:type="gint"/>
+          </parameter>
+        </parameters>
+      </method>
+      <method name="get_image_mapping"
+              c:identifier="poppler_page_get_image_mapping">
+        <doc xml:whitespace="preserve">Returns a list of #PopplerImageMapping items that map from a
+location on @page to an image of the page. This list must be freed
+with poppler_page_free_image_mapping() when done.</doc>
+        <return-value transfer-ownership="full">
+          <doc xml:whitespace="preserve">A #GList of #PopplerImageMapping</doc>
+          <type name="GLib.List" c:type="GList*">
+            <type name="ImageMapping"/>
+          </type>
+        </return-value>
+      </method>
+      <method name="get_index" c:identifier="poppler_page_get_index">
+        <doc xml:whitespace="preserve">Returns the index of @page</doc>
+        <return-value transfer-ownership="none">
+          <doc xml:whitespace="preserve">index value of @page</doc>
+          <type name="gint" c:type="int"/>
+        </return-value>
+      </method>
+      <method name="get_label"
+              c:identifier="poppler_page_get_label"
+              version="0.16">
+        <doc xml:whitespace="preserve">Returns the label of @page. Note that page labels
+and page indices might not coincide.</doc>
+        <return-value transfer-ownership="full">
+          <doc xml:whitespace="preserve">a new allocated string containing the label of @page, or %NULL if @page doesn't have a label</doc>
+          <type name="utf8" c:type="gchar*"/>
+        </return-value>
+      </method>
+      <method name="get_link_mapping"
+              c:identifier="poppler_page_get_link_mapping">
+        <doc xml:whitespace="preserve">Returns a list of #PopplerLinkMapping items that map from a
+location on @page to a #PopplerAction.  This list must be freed
+with poppler_page_free_link_mapping() when done.</doc>
+        <return-value transfer-ownership="full">
+          <doc xml:whitespace="preserve">A #GList of #PopplerLinkMapping</doc>
+          <type name="GLib.List" c:type="GList*">
+            <type name="LinkMapping"/>
+          </type>
+        </return-value>
+      </method>
+      <method name="get_selected_region"
+              c:identifier="poppler_page_get_selected_region"
+              version="0.16">
+        <doc xml:whitespace="preserve">Returns a region containing the area that would be rendered by
+poppler_page_render_selection().
+The returned region must be freed with cairo_region_destroy()</doc>
+        <return-value transfer-ownership="full">
+          <doc xml:whitespace="preserve">a cairo_region_t</doc>
+          <type name="cairo.Region" c:type="cairo_region_t*"/>
+        </return-value>
+        <parameters>
+          <parameter name="scale" transfer-ownership="none">
+            <doc xml:whitespace="preserve">scale specified as pixels per point</doc>
+            <type name="gdouble" c:type="gdouble"/>
+          </parameter>
+          <parameter name="style" transfer-ownership="none">
+            <doc xml:whitespace="preserve">a #PopplerSelectionStyle</doc>
+            <type name="SelectionStyle" c:type="PopplerSelectionStyle"/>
+          </parameter>
+          <parameter name="selection" transfer-ownership="none">
+            <doc xml:whitespace="preserve">start and end point of selection as a rectangle</doc>
+            <type name="Rectangle" c:type="PopplerRectangle*"/>
+          </parameter>
+        </parameters>
+      </method>
+      <method name="get_selected_text"
+              c:identifier="poppler_page_get_selected_text"
+              version="0.16">
+        <doc xml:whitespace="preserve">Retrieves the contents of the specified @selection as text.</doc>
+        <return-value transfer-ownership="full">
+          <doc xml:whitespace="preserve">a pointer to the contents of the @selection as a string</doc>
+          <type name="utf8" c:type="char*"/>
+        </return-value>
+        <parameters>
+          <parameter name="style" transfer-ownership="none">
+            <doc xml:whitespace="preserve">a #PopplerSelectionStyle</doc>
+            <type name="SelectionStyle" c:type="PopplerSelectionStyle"/>
+          </parameter>
+          <parameter name="selection" transfer-ownership="none">
+            <doc xml:whitespace="preserve">the #PopplerRectangle including the text</doc>
+            <type name="Rectangle" c:type="PopplerRectangle*"/>
+          </parameter>
+        </parameters>
+      </method>
+      <method name="get_selection_region"
+              c:identifier="poppler_page_get_selection_region"
+              deprecated="Use poppler_page_get_selected_region() instead."
+              deprecated-version="0.16">
+        <doc xml:whitespace="preserve">Returns a region containing the area that would be rendered by
+poppler_page_render_selection() as a #GList of
+#PopplerRectangle. The returned list must be freed with
+poppler_page_selection_region_free().</doc>
+        <return-value transfer-ownership="full">
+          <doc xml:whitespace="preserve">a #GList of #PopplerRectangle</doc>
+          <type name="GLib.List" c:type="GList*">
+            <type name="Rectangle"/>
+          </type>
+        </return-value>
+        <parameters>
+          <parameter name="scale" transfer-ownership="none">
+            <doc xml:whitespace="preserve">scale specified as pixels per point</doc>
+            <type name="gdouble" c:type="gdouble"/>
+          </parameter>
+          <parameter name="style" transfer-ownership="none">
+            <doc xml:whitespace="preserve">a #PopplerSelectionStyle</doc>
+            <type name="SelectionStyle" c:type="PopplerSelectionStyle"/>
+          </parameter>
+          <parameter name="selection" transfer-ownership="none">
+            <doc xml:whitespace="preserve">start and end point of selection as a rectangle</doc>
+            <type name="Rectangle" c:type="PopplerRectangle*"/>
+          </parameter>
+        </parameters>
+      </method>
+      <method name="get_size" c:identifier="poppler_page_get_size">
+        <doc xml:whitespace="preserve">Gets the size of @page at the current scale and rotation.</doc>
+        <return-value transfer-ownership="none">
+          <type name="none" c:type="void"/>
+        </return-value>
+        <parameters>
+          <parameter name="width"
+                     direction="out"
+                     caller-allocates="0"
+                     transfer-ownership="full"
+                     allow-none="1">
+            <doc xml:whitespace="preserve">return location for the width of @page</doc>
+            <type name="gdouble" c:type="double*"/>
+          </parameter>
+          <parameter name="height"
+                     direction="out"
+                     caller-allocates="0"
+                     transfer-ownership="full"
+                     allow-none="1">
+            <doc xml:whitespace="preserve">return location for the height of @page</doc>
+            <type name="gdouble" c:type="double*"/>
+          </parameter>
+        </parameters>
+      </method>
+      <method name="get_text"
+              c:identifier="poppler_page_get_text"
+              version="0.16">
+        <doc xml:whitespace="preserve">Retrieves the text of @page.</doc>
+        <return-value transfer-ownership="full">
+          <doc xml:whitespace="preserve">a pointer to the text of the @page as a string</doc>
+          <type name="utf8" c:type="char*"/>
+        </return-value>
+      </method>
+      <method name="get_text_attributes"
+              c:identifier="poppler_page_get_text_attributes"
+              version="0.18">
+        <doc xml:whitespace="preserve">Obtains the attributes of the text as a GList of #PopplerTextAttributes.
+This list must be freed with poppler_page_free_text_attributes() when done.
+
+Each list element is a #PopplerTextAttributes struct where start_index and
+end_index indicates the range of text (as returned by poppler_page_get_text())
+to which text attributes apply.</doc>
+        <return-value transfer-ownership="full">
+          <doc xml:whitespace="preserve">A #GList of #PopplerTextAttributes</doc>
+          <type name="GLib.List" c:type="GList*">
+            <type name="TextAttributes"/>
+          </type>
+        </return-value>
+      </method>
+      <method name="get_text_layout"
+              c:identifier="poppler_page_get_text_layout"
+              version="0.16">
+        <doc xml:whitespace="preserve">Obtains the layout of the text as a list of #PopplerRectangle
+This array must be freed with g_free () when done.
+
+The position in the array represents an offset in the text returned by
+poppler_page_get_text()</doc>
+        <return-value transfer-ownership="none">
+          <doc xml:whitespace="preserve">%TRUE if the page contains text, %FALSE otherwise</doc>
+          <type name="gboolean" c:type="gboolean"/>
+        </return-value>
+        <parameters>
+          <parameter name="rectangles"
+                     direction="out"
+                     caller-allocates="0"
+                     transfer-ownership="container">
+            <doc xml:whitespace="preserve">return location for an array of #PopplerRectangle</doc>
+            <array length="1" zero-terminated="0" c:type="PopplerRectangle**">
+              <type name="Rectangle" c:type="PopplerRectangle*"/>
+            </array>
+          </parameter>
+          <parameter name="n_rectangles"
+                     direction="out"
+                     caller-allocates="0"
+                     transfer-ownership="full">
+            <doc xml:whitespace="preserve">length of returned array</doc>
+            <type name="guint" c:type="guint*"/>
+          </parameter>
+        </parameters>
+      </method>
+      <method name="get_thumbnail" c:identifier="poppler_page_get_thumbnail">
+        <doc xml:whitespace="preserve">Get the embedded thumbnail for the specified page.  If the document
+doesn't have an embedded thumbnail for the page, this function
+returns %NULL.</doc>
+        <return-value transfer-ownership="full">
+          <doc xml:whitespace="preserve">the tumbnail as a cairo_surface_t or %NULL if the document doesn't have a thumbnail for this page.</doc>
+          <type name="cairo.Surface" c:type="cairo_surface_t*"/>
+        </return-value>
+      </method>
+      <method name="get_thumbnail_size"
+              c:identifier="poppler_page_get_thumbnail_size">
+        <doc xml:whitespace="preserve">Returns %TRUE if @page has a thumbnail associated with it.  It also
+fills in @width and @height with the width and height of the
+thumbnail.  The values of width and height are not changed if no
+appropriate thumbnail exists.</doc>
+        <return-value transfer-ownership="none">
+          <doc xml:whitespace="preserve">%TRUE, if @page has a thumbnail associated with it.</doc>
+          <type name="gboolean" c:type="gboolean"/>
+        </return-value>
+        <parameters>
+          <parameter name="width"
+                     direction="out"
+                     caller-allocates="0"
+                     transfer-ownership="full">
+            <doc xml:whitespace="preserve">return location for width</doc>
+            <type name="gint" c:type="int*"/>
+          </parameter>
+          <parameter name="height"
+                     direction="out"
+                     caller-allocates="0"
+                     transfer-ownership="full">
+            <doc xml:whitespace="preserve">return location for height</doc>
+            <type name="gint" c:type="int*"/>
+          </parameter>
+        </parameters>
+      </method>
+      <method name="get_transition" c:identifier="poppler_page_get_transition">
+        <doc xml:whitespace="preserve">Returns the transition effect of @page</doc>
+        <return-value transfer-ownership="full">
+          <doc xml:whitespace="preserve">a #PopplerPageTransition or %NULL.</doc>
+          <type name="PageTransition" c:type="PopplerPageTransition*"/>
+        </return-value>
+      </method>
+      <method name="render" c:identifier="poppler_page_render">
+        <doc xml:whitespace="preserve">Render the page to the given cairo context. This function
+is for rendering a page that will be displayed. If you want
+to render a page that will be printed use
+poppler_page_render_for_printing() instead</doc>
+        <return-value transfer-ownership="none">
+          <type name="none" c:type="void"/>
+        </return-value>
+        <parameters>
+          <parameter name="cairo" transfer-ownership="none">
+            <doc xml:whitespace="preserve">cairo context to render to</doc>
+            <type name="cairo.Context" c:type="cairo_t*"/>
+          </parameter>
+        </parameters>
+      </method>
+      <method name="render_for_printing"
+              c:identifier="poppler_page_render_for_printing">
+        <doc xml:whitespace="preserve">Render the page to the given cairo context for printing.</doc>
+        <return-value transfer-ownership="none">
+          <type name="none" c:type="void"/>
+        </return-value>
+        <parameters>
+          <parameter name="cairo" transfer-ownership="none">
+            <doc xml:whitespace="preserve">cairo context to render to</doc>
+            <type name="cairo.Context" c:type="cairo_t*"/>
+          </parameter>
+        </parameters>
+      </method>
+      <method name="render_for_printing_with_options"
+              c:identifier="poppler_page_render_for_printing_with_options"
+              version="0.16">
+        <doc xml:whitespace="preserve">Render the page to the given cairo context for printing
+with the specified options</doc>
+        <return-value transfer-ownership="none">
+          <type name="none" c:type="void"/>
+        </return-value>
+        <parameters>
+          <parameter name="cairo" transfer-ownership="none">
+            <doc xml:whitespace="preserve">cairo context to render to</doc>
+            <type name="cairo.Context" c:type="cairo_t*"/>
+          </parameter>
+          <parameter name="options" transfer-ownership="none">
+            <doc xml:whitespace="preserve">print options</doc>
+            <type name="PrintFlags" c:type="PopplerPrintFlags"/>
+          </parameter>
+        </parameters>
+      </method>
+      <method name="render_selection"
+              c:identifier="poppler_page_render_selection">
+        <doc xml:whitespace="preserve">Render the selection specified by @selection for @page to
+the given cairo context.  The selection will be rendered, using
+@glyph_color for the glyphs and @background_color for the selection
+background.
+
+If non-NULL, @old_selection specifies the selection that is already
+rendered to @cairo, in which case this function will (some day)
+only render the changed part of the selection.</doc>
+        <return-value transfer-ownership="none">
+          <type name="none" c:type="void"/>
+        </return-value>
+        <parameters>
+          <parameter name="cairo" transfer-ownership="none">
+            <doc xml:whitespace="preserve">cairo context to render to</doc>
+            <type name="cairo.Context" c:type="cairo_t*"/>
+          </parameter>
+          <parameter name="selection" transfer-ownership="none">
+            <doc xml:whitespace="preserve">start and end point of selection as a rectangle</doc>
+            <type name="Rectangle" c:type="PopplerRectangle*"/>
+          </parameter>
+          <parameter name="old_selection" transfer-ownership="none">
+            <doc xml:whitespace="preserve">previous selection</doc>
+            <type name="Rectangle" c:type="PopplerRectangle*"/>
+          </parameter>
+          <parameter name="style" transfer-ownership="none">
+            <doc xml:whitespace="preserve">a #PopplerSelectionStyle</doc>
+            <type name="SelectionStyle" c:type="PopplerSelectionStyle"/>
+          </parameter>
+          <parameter name="glyph_color" transfer-ownership="none">
+            <doc xml:whitespace="preserve">color to use for drawing glyphs</doc>
+            <type name="Color" c:type="PopplerColor*"/>
+          </parameter>
+          <parameter name="background_color" transfer-ownership="none">
+            <doc xml:whitespace="preserve">color to use for the selection background</doc>
+            <type name="Color" c:type="PopplerColor*"/>
+          </parameter>
+        </parameters>
+      </method>
+      <method name="render_to_ps" c:identifier="poppler_page_render_to_ps">
+        <doc xml:whitespace="preserve">Render the page on a postscript file</doc>
+        <return-value transfer-ownership="none">
+          <type name="none" c:type="void"/>
+        </return-value>
+        <parameters>
+          <parameter name="ps_file" transfer-ownership="none">
+            <doc xml:whitespace="preserve">the PopplerPSFile to render to</doc>
+            <type name="PSFile" c:type="PopplerPSFile*"/>
+          </parameter>
+        </parameters>
+      </method>
+      <property name="label" transfer-ownership="none">
+        <doc xml:whitespace="preserve">The label of the page or %NULL. See also poppler_page_get_label()</doc>
+        <type name="utf8"/>
+      </property>
+    </class>
+    <enumeration name="PageLayout"
+                 glib:type-name="PopplerPageLayout"
+                 glib:get-type="poppler_page_layout_get_type"
+                 c:type="PopplerPageLayout">
+      <doc xml:whitespace="preserve">Page layout types</doc>
+      <member name="unset"
+              value="0"
+              c:identifier="POPPLER_PAGE_LAYOUT_UNSET"
+              glib:nick="unset"/>
+      <member name="single_page"
+              value="1"
+              c:identifier="POPPLER_PAGE_LAYOUT_SINGLE_PAGE"
+              glib:nick="single-page"/>
+      <member name="one_column"
+              value="2"
+              c:identifier="POPPLER_PAGE_LAYOUT_ONE_COLUMN"
+              glib:nick="one-column"/>
+      <member name="two_column_left"
+              value="3"
+              c:identifier="POPPLER_PAGE_LAYOUT_TWO_COLUMN_LEFT"
+              glib:nick="two-column-left"/>
+      <member name="two_column_right"
+              value="4"
+              c:identifier="POPPLER_PAGE_LAYOUT_TWO_COLUMN_RIGHT"
+              glib:nick="two-column-right"/>
+      <member name="two_page_left"
+              value="5"
+              c:identifier="POPPLER_PAGE_LAYOUT_TWO_PAGE_LEFT"
+              glib:nick="two-page-left"/>
+      <member name="two_page_right"
+              value="6"
+              c:identifier="POPPLER_PAGE_LAYOUT_TWO_PAGE_RIGHT"
+              glib:nick="two-page-right"/>
+    </enumeration>
+    <enumeration name="PageMode"
+                 glib:type-name="PopplerPageMode"
+                 glib:get-type="poppler_page_mode_get_type"
+                 c:type="PopplerPageMode">
+      <doc xml:whitespace="preserve">Page modes</doc>
+      <member name="unset"
+              value="0"
+              c:identifier="POPPLER_PAGE_MODE_UNSET"
+              glib:nick="unset"/>
+      <member name="none"
+              value="1"
+              c:identifier="POPPLER_PAGE_MODE_NONE"
+              glib:nick="none"/>
+      <member name="use_outlines"
+              value="2"
+              c:identifier="POPPLER_PAGE_MODE_USE_OUTLINES"
+              glib:nick="use-outlines"/>
+      <member name="use_thumbs"
+              value="3"
+              c:identifier="POPPLER_PAGE_MODE_USE_THUMBS"
+              glib:nick="use-thumbs"/>
+      <member name="full_screen"
+              value="4"
+              c:identifier="POPPLER_PAGE_MODE_FULL_SCREEN"
+              glib:nick="full-screen"/>
+      <member name="use_oc"
+              value="5"
+              c:identifier="POPPLER_PAGE_MODE_USE_OC"
+              glib:nick="use-oc"/>
+      <member name="use_attachments"
+              value="6"
+              c:identifier="POPPLER_PAGE_MODE_USE_ATTACHMENTS"
+              glib:nick="use-attachments"/>
+    </enumeration>
+    <record name="PageTransition"
+            c:type="PopplerPageTransition"
+            glib:type-name="PopplerPageTransition"
+            glib:get-type="poppler_page_transition_get_type"
+            c:symbol-prefix="page_transition">
+      <doc xml:whitespace="preserve">A #PopplerPageTransition structures describes a visual transition
+to use when moving between pages during a presentation</doc>
+      <field name="type" writable="1">
+        <type name="PageTransitionType" c:type="PopplerPageTransitionType"/>
+      </field>
+      <field name="alignment" writable="1">
+        <type name="PageTransitionAlignment"
+              c:type="PopplerPageTransitionAlignment"/>
+      </field>
+      <field name="direction" writable="1">
+        <type name="PageTransitionDirection"
+              c:type="PopplerPageTransitionDirection"/>
+      </field>
+      <field name="duration" writable="1">
+        <type name="gint" c:type="gint"/>
+      </field>
+      <field name="angle" writable="1">
+        <type name="gint" c:type="gint"/>
+      </field>
+      <field name="scale" writable="1">
+        <type name="gdouble" c:type="gdouble"/>
+      </field>
+      <field name="rectangular" writable="1">
+        <type name="gboolean" c:type="gboolean"/>
+      </field>
+      <constructor name="new" c:identifier="poppler_page_transition_new">
+        <doc xml:whitespace="preserve">Creates a new #PopplerPageTransition</doc>
+        <return-value transfer-ownership="full">
+          <doc xml:whitespace="preserve">a new #PopplerPageTransition, use poppler_page_transition_free() to free it</doc>
+          <type name="PageTransition" c:type="PopplerPageTransition*"/>
+        </return-value>
+      </constructor>
+      <method name="copy" c:identifier="poppler_page_transition_copy">
+        <doc xml:whitespace="preserve">Creates a copy of @transition</doc>
+        <return-value transfer-ownership="full">
+          <doc xml:whitespace="preserve">a new allocated copy of @transition</doc>
+          <type name="PageTransition" c:type="PopplerPageTransition*"/>
+        </return-value>
+      </method>
+      <method name="free" c:identifier="poppler_page_transition_free">
+        <doc xml:whitespace="preserve">Frees the given #PopplerPageTransition</doc>
+        <return-value transfer-ownership="none">
+          <type name="none" c:type="void"/>
+        </return-value>
+      </method>
+    </record>
+    <enumeration name="PageTransitionAlignment"
+                 glib:type-name="PopplerPageTransitionAlignment"
+                 glib:get-type="poppler_page_transition_alignment_get_type"
+                 c:type="PopplerPageTransitionAlignment">
+      <doc xml:whitespace="preserve">Page transition alignment types for #POPPLER_PAGE_TRANSITION_SPLIT
+and #POPPLER_PAGE_TRANSITION_BLINDS transition types</doc>
+      <member name="horizontal"
+              value="0"
+              c:identifier="POPPLER_PAGE_TRANSITION_HORIZONTAL"
+              glib:nick="horizontal"/>
+      <member name="vertical"
+              value="1"
+              c:identifier="POPPLER_PAGE_TRANSITION_VERTICAL"
+              glib:nick="vertical"/>
+    </enumeration>
+    <enumeration name="PageTransitionDirection"
+                 glib:type-name="PopplerPageTransitionDirection"
+                 glib:get-type="poppler_page_transition_direction_get_type"
+                 c:type="PopplerPageTransitionDirection">
+      <doc xml:whitespace="preserve">Page transition direction types for #POPPLER_PAGE_TRANSITION_SPLIT,
+#POPPLER_PAGE_TRANSITION_BOX and #POPPLER_PAGE_TRANSITION_FLY transition types</doc>
+      <member name="inward"
+              value="0"
+              c:identifier="POPPLER_PAGE_TRANSITION_INWARD"
+              glib:nick="inward"/>
+      <member name="outward"
+              value="1"
+              c:identifier="POPPLER_PAGE_TRANSITION_OUTWARD"
+              glib:nick="outward"/>
+    </enumeration>
+    <enumeration name="PageTransitionType"
+                 glib:type-name="PopplerPageTransitionType"
+                 glib:get-type="poppler_page_transition_type_get_type"
+                 c:type="PopplerPageTransitionType">
+      <doc xml:whitespace="preserve">Page transition types</doc>
+      <member name="replace"
+              value="0"
+              c:identifier="POPPLER_PAGE_TRANSITION_REPLACE"
+              glib:nick="replace"/>
+      <member name="split"
+              value="1"
+              c:identifier="POPPLER_PAGE_TRANSITION_SPLIT"
+              glib:nick="split"/>
+      <member name="blinds"
+              value="2"
+              c:identifier="POPPLER_PAGE_TRANSITION_BLINDS"
+              glib:nick="blinds"/>
+      <member name="box"
+              value="3"
+              c:identifier="POPPLER_PAGE_TRANSITION_BOX"
+              glib:nick="box"/>
+      <member name="wipe"
+              value="4"
+              c:identifier="POPPLER_PAGE_TRANSITION_WIPE"
+              glib:nick="wipe"/>
+      <member name="dissolve"
+              value="5"
+              c:identifier="POPPLER_PAGE_TRANSITION_DISSOLVE"
+              glib:nick="dissolve"/>
+      <member name="glitter"
+              value="6"
+              c:identifier="POPPLER_PAGE_TRANSITION_GLITTER"
+              glib:nick="glitter"/>
+      <member name="fly"
+              value="7"
+              c:identifier="POPPLER_PAGE_TRANSITION_FLY"
+              glib:nick="fly"/>
+      <member name="push"
+              value="8"
+              c:identifier="POPPLER_PAGE_TRANSITION_PUSH"
+              glib:nick="push"/>
+      <member name="cover"
+              value="9"
+              c:identifier="POPPLER_PAGE_TRANSITION_COVER"
+              glib:nick="cover"/>
+      <member name="uncover"
+              value="10"
+              c:identifier="POPPLER_PAGE_TRANSITION_UNCOVER"
+              glib:nick="uncover"/>
+      <member name="fade"
+              value="11"
+              c:identifier="POPPLER_PAGE_TRANSITION_FADE"
+              glib:nick="fade"/>
+    </enumeration>
+    <bitfield name="Permissions"
+              glib:type-name="PopplerPermissions"
+              glib:get-type="poppler_permissions_get_type"
+              c:type="PopplerPermissions">
+      <doc xml:whitespace="preserve">Permissions</doc>
+      <member name="ok_to_print"
+              value="1"
+              c:identifier="POPPLER_PERMISSIONS_OK_TO_PRINT"
+              glib:nick="ok-to-print"/>
+      <member name="ok_to_modify"
+              value="2"
+              c:identifier="POPPLER_PERMISSIONS_OK_TO_MODIFY"
+              glib:nick="ok-to-modify"/>
+      <member name="ok_to_copy"
+              value="4"
+              c:identifier="POPPLER_PERMISSIONS_OK_TO_COPY"
+              glib:nick="ok-to-copy"/>
+      <member name="ok_to_add_notes"
+              value="8"
+              c:identifier="POPPLER_PERMISSIONS_OK_TO_ADD_NOTES"
+              glib:nick="ok-to-add-notes"/>
+      <member name="ok_to_fill_form"
+              value="16"
+              c:identifier="POPPLER_PERMISSIONS_OK_TO_FILL_FORM"
+              glib:nick="ok-to-fill-form"/>
+      <member name="ok_to_extract_contents"
+              value="32"
+              c:identifier="POPPLER_PERMISSIONS_OK_TO_EXTRACT_CONTENTS"
+              glib:nick="ok-to-extract-contents"/>
+      <member name="ok_to_assemble"
+              value="64"
+              c:identifier="POPPLER_PERMISSIONS_OK_TO_ASSEMBLE"
+              glib:nick="ok-to-assemble"/>
+      <member name="ok_to_print_high_resolution"
+              value="128"
+              c:identifier="POPPLER_PERMISSIONS_OK_TO_PRINT_HIGH_RESOLUTION"
+              glib:nick="ok-to-print-high-resolution"/>
+      <member name="full"
+              value="255"
+              c:identifier="POPPLER_PERMISSIONS_FULL"
+              glib:nick="full"/>
+    </bitfield>
+    <bitfield name="PrintFlags"
+              version="0.16"
+              glib:type-name="PopplerPrintFlags"
+              glib:get-type="poppler_print_flags_get_type"
+              c:type="PopplerPrintFlags">
+      <doc xml:whitespace="preserve">Printing flags</doc>
+      <member name="document"
+              value="0"
+              c:identifier="POPPLER_PRINT_DOCUMENT"
+              glib:nick="document"/>
+      <member name="markup_annots"
+              value="1"
+              c:identifier="POPPLER_PRINT_MARKUP_ANNOTS"
+              glib:nick="markup-annots"/>
+      <member name="stamp_annots_only"
+              value="2"
+              c:identifier="POPPLER_PRINT_STAMP_ANNOTS_ONLY"
+              glib:nick="stamp-annots-only"/>
+      <member name="all"
+              value="1"
+              c:identifier="POPPLER_PRINT_ALL"
+              glib:nick="all"/>
+    </bitfield>
+    <record name="Rectangle"
+            c:type="PopplerRectangle"
+            glib:type-name="PopplerRectangle"
+            glib:get-type="poppler_rectangle_get_type"
+            c:symbol-prefix="rectangle">
+      <doc xml:whitespace="preserve">A #PopplerRectangle is used to describe
+locations on a page and bounding boxes</doc>
+      <field name="x1" writable="1">
+        <type name="gdouble" c:type="gdouble"/>
+      </field>
+      <field name="y1" writable="1">
+        <type name="gdouble" c:type="gdouble"/>
+      </field>
+      <field name="x2" writable="1">
+        <type name="gdouble" c:type="gdouble"/>
+      </field>
+      <field name="y2" writable="1">
+        <type name="gdouble" c:type="gdouble"/>
+      </field>
+      <constructor name="new" c:identifier="poppler_rectangle_new">
+        <doc xml:whitespace="preserve">Creates a new #PopplerRectangle</doc>
+        <return-value transfer-ownership="full">
+          <doc xml:whitespace="preserve">a new #PopplerRectangle, use poppler_rectangle_free() to free it</doc>
+          <type name="Rectangle" c:type="PopplerRectangle*"/>
+        </return-value>
+      </constructor>
+      <method name="copy" c:identifier="poppler_rectangle_copy">
+        <doc xml:whitespace="preserve">Creates a copy of @rectangle</doc>
+        <return-value transfer-ownership="full">
+          <doc xml:whitespace="preserve">a new allocated copy of @rectangle</doc>
+          <type name="Rectangle" c:type="PopplerRectangle*"/>
+        </return-value>
+      </method>
+      <method name="free" c:identifier="poppler_rectangle_free">
+        <doc xml:whitespace="preserve">Frees the given #PopplerRectangle</doc>
+        <return-value transfer-ownership="none">
+          <type name="none" c:type="void"/>
+        </return-value>
+      </method>
+    </record>
+    <enumeration name="SelectionStyle"
+                 glib:type-name="PopplerSelectionStyle"
+                 glib:get-type="poppler_selection_style_get_type"
+                 c:type="PopplerSelectionStyle">
+      <doc xml:whitespace="preserve">Selection styles</doc>
+      <member name="glyph"
+              value="0"
+              c:identifier="POPPLER_SELECTION_GLYPH"
+              glib:nick="glyph"/>
+      <member name="word"
+              value="1"
+              c:identifier="POPPLER_SELECTION_WORD"
+              glib:nick="word"/>
+      <member name="line"
+              value="2"
+              c:identifier="POPPLER_SELECTION_LINE"
+              glib:nick="line"/>
+    </enumeration>
+    <record name="TextAttributes"
+            c:type="PopplerTextAttributes"
+            version="0.18"
+            glib:type-name="PopplerTextAttributes"
+            glib:get-type="poppler_text_attributes_get_type"
+            c:symbol-prefix="text_attributes">
+      <doc xml:whitespace="preserve">A #PopplerTextAttributes is used to describe text attributes of a range of text</doc>
+      <field name="font_name" writable="1">
+        <type name="utf8" c:type="gchar*"/>
+      </field>
+      <field name="font_size" writable="1">
+        <type name="gdouble" c:type="gdouble"/>
+      </field>
+      <field name="is_underlined" writable="1">
+        <type name="gboolean" c:type="gboolean"/>
+      </field>
+      <field name="color" writable="1">
+        <type name="Color" c:type="PopplerColor"/>
+      </field>
+      <field name="start_index" writable="1">
+        <type name="gint" c:type="gint"/>
+      </field>
+      <field name="end_index" writable="1">
+        <type name="gint" c:type="gint"/>
+      </field>
+      <constructor name="new"
+                   c:identifier="poppler_text_attributes_new"
+                   version="0.18">
+        <doc xml:whitespace="preserve">Creates a new #PopplerTextAttributes</doc>
+        <return-value transfer-ownership="full">
+          <doc xml:whitespace="preserve">a new #PopplerTextAttributes, use poppler_text_attributes_free() to free it</doc>
+          <type name="TextAttributes" c:type="PopplerTextAttributes*"/>
+        </return-value>
+      </constructor>
+      <method name="copy"
+              c:identifier="poppler_text_attributes_copy"
+              version="0.18">
+        <doc xml:whitespace="preserve">Creates a copy of @text_attrs</doc>
+        <return-value transfer-ownership="full">
+          <doc xml:whitespace="preserve">a new allocated copy of @text_attrs</doc>
+          <type name="TextAttributes" c:type="PopplerTextAttributes*"/>
+        </return-value>
+      </method>
+      <method name="free"
+              c:identifier="poppler_text_attributes_free"
+              version="0.18">
+        <doc xml:whitespace="preserve">Frees the given #PopplerTextAttributes</doc>
+        <return-value transfer-ownership="none">
+          <type name="none" c:type="void"/>
+        </return-value>
+      </method>
+    </record>
+    <bitfield name="ViewerPreferences"
+              glib:type-name="PopplerViewerPreferences"
+              glib:get-type="poppler_viewer_preferences_get_type"
+              c:type="PopplerViewerPreferences">
+      <doc xml:whitespace="preserve">Viewer preferences</doc>
+      <member name="unset"
+              value="0"
+              c:identifier="POPPLER_VIEWER_PREFERENCES_UNSET"
+              glib:nick="unset"/>
+      <member name="hide_toolbar"
+              value="1"
+              c:identifier="POPPLER_VIEWER_PREFERENCES_HIDE_TOOLBAR"
+              glib:nick="hide-toolbar"/>
+      <member name="hide_menubar"
+              value="2"
+              c:identifier="POPPLER_VIEWER_PREFERENCES_HIDE_MENUBAR"
+              glib:nick="hide-menubar"/>
+      <member name="hide_windowui"
+              value="4"
+              c:identifier="POPPLER_VIEWER_PREFERENCES_HIDE_WINDOWUI"
+              glib:nick="hide-windowui"/>
+      <member name="fit_window"
+              value="8"
+              c:identifier="POPPLER_VIEWER_PREFERENCES_FIT_WINDOW"
+              glib:nick="fit-window"/>
+      <member name="center_window"
+              value="16"
+              c:identifier="POPPLER_VIEWER_PREFERENCES_CENTER_WINDOW"
+              glib:nick="center-window"/>
+      <member name="display_doc_title"
+              value="32"
+              c:identifier="POPPLER_VIEWER_PREFERENCES_DISPLAY_DOC_TITLE"
+              glib:nick="display-doc-title"/>
+      <member name="direction_rtl"
+              value="64"
+              c:identifier="POPPLER_VIEWER_PREFERENCES_DIRECTION_RTL"
+              glib:nick="direction-rtl"/>
+    </bitfield>
+    <record name="_AttachmentClass" c:type="_PopplerAttachmentClass">
+      <field name="parent_class" writable="1">
+        <type name="GObject.ObjectClass" c:type="GObjectClass"/>
+      </field>
+    </record>
+    <function name="date_parse"
+              c:identifier="poppler_date_parse"
+              version="0.12">
+      <doc xml:whitespace="preserve">Parses a PDF format date string and converts it to a #time_t. Returns #FALSE
+if the parsing fails or the input string is not a valid PDF format date string</doc>
+      <return-value transfer-ownership="none">
+        <doc xml:whitespace="preserve">#TRUE, if @timet was set</doc>
+        <type name="gboolean" c:type="gboolean"/>
+      </return-value>
+      <parameters>
+        <parameter name="date" transfer-ownership="none">
+          <doc xml:whitespace="preserve">string to parse</doc>
+          <type name="utf8" c:type="const gchar*"/>
+        </parameter>
+        <parameter name="timet" transfer-ownership="none">
+          <doc xml:whitespace="preserve">an uninitialized #time_t</doc>
+          <type name="glong" c:type="time_t*"/>
+        </parameter>
+      </parameters>
+    </function>
+    <function name="error_quark"
+              c:identifier="poppler_error_quark"
+              moved-to="Error.quark">
+      <return-value transfer-ownership="none">
+        <type name="GLib.Quark" c:type="GQuark"/>
+      </return-value>
+    </function>
+    <function name="get_backend" c:identifier="poppler_get_backend">
+      <doc xml:whitespace="preserve">Returns the backend compiled into the poppler library.</doc>
+      <return-value transfer-ownership="none">
+        <doc xml:whitespace="preserve">The backend used by poppler</doc>
+        <type name="Backend" c:type="PopplerBackend"/>
+      </return-value>
+    </function>
+    <function name="get_version" c:identifier="poppler_get_version">
+      <doc xml:whitespace="preserve">Returns the version of poppler in use.  This result is not to be freed.</doc>
+      <return-value transfer-ownership="none">
+        <doc xml:whitespace="preserve">the version of poppler.</doc>
+        <type name="utf8" c:type="const char*"/>
+      </return-value>
+    </function>
+  </namespace>
+</repository>
diff --git a/glib/demo/CMakeLists.txt b/glib/demo/CMakeLists.txt
new file mode 100644 (file)
index 0000000..286fbd7
--- /dev/null
@@ -0,0 +1,28 @@
+include_directories(
+  ${GTK2_INCLUDE_DIRS}
+)
+
+add_definitions(${GTK2_CFLAGS_OTHER})
+
+set(poppler_glib_demo_SRCS
+  main.c
+  find.c
+  fonts.c
+  forms.c
+  info.cc
+  images.c
+  links.c
+  outline.c
+  page.c
+  print.c
+  render.c
+  text.c
+  transitions.c
+  utils.c
+  annots.c
+  attachments.c
+  layers.c
+  selections.c
+)
+poppler_add_test(poppler-glib-demo BUILD_GTK_TESTS ${poppler_glib_demo_SRCS})
+target_link_libraries(poppler-glib-demo poppler-glib ${GTK2_LIBRARIES})
diff --git a/glib/demo/Makefile.am b/glib/demo/Makefile.am
new file mode 100644 (file)
index 0000000..28fc22d
--- /dev/null
@@ -0,0 +1,55 @@
+INCLUDES =                                     \
+       -I$(top_srcdir)/glib                    \
+       -I$(top_builddir)/glib                  \
+       $(GTK_TEST_CFLAGS)                      \
+       $(POPPLER_GLIB_DISABLE_DEPRECATED)      \
+       -DGTK_DISABLE_DEPRECATED                \
+       $(POPPLER_GLIB_DISABLE_SINGLE_INCLUDES)
+
+AM_LDFLAGS = @auto_import_flags@
+
+if BUILD_GTK_TEST
+bin_PROGRAMS = poppler-glib-demo
+endif
+
+poppler_glib_demo_SOURCES =                    \
+       main.c                                  \
+       annots.h                                \
+       annots.c                                \
+       attachments.c                           \
+       attachments.h                           \
+       find.h                                  \
+       find.c                                  \
+       fonts.h                                 \
+       fonts.c                                 \
+       forms.h                                 \
+       forms.c                                 \
+       images.h                                \
+       images.c                                \
+       info.h                                  \
+       info.cc                                 \
+       layers.h                                \
+       layers.c                                \
+       links.h                                 \
+       links.c                                 \
+       outline.h                               \
+       outline.c                               \
+       page.h                                  \
+       page.c                                  \
+       print.h                                 \
+       print.c                                 \
+       render.h                                \
+       render.c                                \
+       selections.h                            \
+       selections.c                            \
+       text.h                                  \
+       text.c                                  \
+       transitions.h                           \
+       transitions.c                           \
+       utils.h                                 \
+       utils.c
+
+LDADD =                                                \
+       $(top_builddir)/glib/libpoppler-glib.la \
+       $(top_builddir)/poppler/libpoppler.la   \
+       $(GTK_TEST_LIBS)
diff --git a/glib/demo/Makefile.in b/glib/demo/Makefile.in
new file mode 100644 (file)
index 0000000..36077c2
--- /dev/null
@@ -0,0 +1,758 @@
+# Makefile.in generated by automake 1.11.5 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software
+# Foundation, Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+@SET_MAKE@
+
+VPATH = @srcdir@
+am__make_dryrun = \
+  { \
+    am__dry=no; \
+    case $$MAKEFLAGS in \
+      *\\[\ \  ]*) \
+        echo 'am--echo: ; @echo "AM"  OK' | $(MAKE) -f - 2>/dev/null \
+          | grep '^AM OK$$' >/dev/null || am__dry=yes;; \
+      *) \
+        for am__flg in $$MAKEFLAGS; do \
+          case $$am__flg in \
+            *=*|--*) ;; \
+            *n*) am__dry=yes; break;; \
+          esac; \
+        done;; \
+    esac; \
+    test $$am__dry = yes; \
+  }
+pkgdatadir = $(datadir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkglibexecdir = $(libexecdir)/@PACKAGE@
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+@BUILD_GTK_TEST_TRUE@bin_PROGRAMS = poppler-glib-demo$(EXEEXT)
+subdir = glib/demo
+DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/m4/acx_pthread.m4 \
+       $(top_srcdir)/m4/define-dir.m4 $(top_srcdir)/m4/gtk-doc.m4 \
+       $(top_srcdir)/m4/iconv.m4 $(top_srcdir)/m4/introspection.m4 \
+       $(top_srcdir)/m4/libjpeg.m4 $(top_srcdir)/m4/libtool.m4 \
+       $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \
+       $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \
+       $(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+       $(ACLOCAL_M4)
+mkinstalldirs = $(install_sh) -d
+CONFIG_HEADER = $(top_builddir)/config.h \
+       $(top_builddir)/poppler/poppler-config.h
+CONFIG_CLEAN_FILES =
+CONFIG_CLEAN_VPATH_FILES =
+am__installdirs = "$(DESTDIR)$(bindir)"
+PROGRAMS = $(bin_PROGRAMS)
+am_poppler_glib_demo_OBJECTS = main.$(OBJEXT) annots.$(OBJEXT) \
+       attachments.$(OBJEXT) find.$(OBJEXT) fonts.$(OBJEXT) \
+       forms.$(OBJEXT) images.$(OBJEXT) info.$(OBJEXT) \
+       layers.$(OBJEXT) links.$(OBJEXT) outline.$(OBJEXT) \
+       page.$(OBJEXT) print.$(OBJEXT) render.$(OBJEXT) \
+       selections.$(OBJEXT) text.$(OBJEXT) transitions.$(OBJEXT) \
+       utils.$(OBJEXT)
+poppler_glib_demo_OBJECTS = $(am_poppler_glib_demo_OBJECTS)
+poppler_glib_demo_LDADD = $(LDADD)
+am__DEPENDENCIES_1 =
+poppler_glib_demo_DEPENDENCIES =  \
+       $(top_builddir)/glib/libpoppler-glib.la \
+       $(top_builddir)/poppler/libpoppler.la $(am__DEPENDENCIES_1)
+AM_V_lt = $(am__v_lt_@AM_V@)
+am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@)
+am__v_lt_0 = --silent
+DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) -I$(top_builddir)/poppler
+depcomp = $(SHELL) $(top_srcdir)/depcomp
+am__depfiles_maybe = depfiles
+am__mv = mv -f
+COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
+       $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
+LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
+       $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \
+       $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
+       $(AM_CFLAGS) $(CFLAGS)
+AM_V_CC = $(am__v_CC_@AM_V@)
+am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@)
+am__v_CC_0 = @echo "  CC    " $@;
+AM_V_at = $(am__v_at_@AM_V@)
+am__v_at_ = $(am__v_at_@AM_DEFAULT_V@)
+am__v_at_0 = @
+CCLD = $(CC)
+LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
+       $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
+       $(AM_LDFLAGS) $(LDFLAGS) -o $@
+AM_V_CCLD = $(am__v_CCLD_@AM_V@)
+am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@)
+am__v_CCLD_0 = @echo "  CCLD  " $@;
+CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
+       $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)
+LTCXXCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \
+       $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) \
+       $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
+       $(AM_CXXFLAGS) $(CXXFLAGS)
+AM_V_CXX = $(am__v_CXX_@AM_V@)
+am__v_CXX_ = $(am__v_CXX_@AM_DEFAULT_V@)
+am__v_CXX_0 = @echo "  CXX   " $@;
+CXXLD = $(CXX)
+CXXLINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \
+       $(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \
+       $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
+AM_V_CXXLD = $(am__v_CXXLD_@AM_V@)
+am__v_CXXLD_ = $(am__v_CXXLD_@AM_DEFAULT_V@)
+am__v_CXXLD_0 = @echo "  CXXLD " $@;
+AM_V_GEN = $(am__v_GEN_@AM_V@)
+am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@)
+am__v_GEN_0 = @echo "  GEN   " $@;
+SOURCES = $(poppler_glib_demo_SOURCES)
+DIST_SOURCES = $(poppler_glib_demo_SOURCES)
+am__can_run_installinfo = \
+  case $$AM_UPDATE_INFO_DIR in \
+    n|no|NO) false;; \
+    *) (install-info --version) >/dev/null 2>&1;; \
+  esac
+ETAGS = etags
+CTAGS = ctags
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AR = @AR@
+AS = @AS@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CAIRO_CFLAGS = @CAIRO_CFLAGS@
+CAIRO_FEATURE = @CAIRO_FEATURE@
+CAIRO_LIBS = @CAIRO_LIBS@
+CAIRO_REQ = @CAIRO_REQ@
+CAIRO_VERSION = @CAIRO_VERSION@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CXX = @CXX@
+CXXCPP = @CXXCPP@
+CXXDEPMODE = @CXXDEPMODE@
+CXXFLAGS = @CXXFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DLLTOOL = @DLLTOOL@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+FGREP = @FGREP@
+FONTCONFIG_CFLAGS = @FONTCONFIG_CFLAGS@
+FONTCONFIG_LIBS = @FONTCONFIG_LIBS@
+FREETYPE_CFLAGS = @FREETYPE_CFLAGS@
+FREETYPE_CONFIG = @FREETYPE_CONFIG@
+FREETYPE_LIBS = @FREETYPE_LIBS@
+GLIB_MKENUMS = @GLIB_MKENUMS@
+GLIB_REQ = @GLIB_REQ@
+GLIB_REQUIRED = @GLIB_REQUIRED@
+GREP = @GREP@
+GTKDOC_CHECK = @GTKDOC_CHECK@
+GTKDOC_DEPS_CFLAGS = @GTKDOC_DEPS_CFLAGS@
+GTKDOC_DEPS_LIBS = @GTKDOC_DEPS_LIBS@
+GTKDOC_MKPDF = @GTKDOC_MKPDF@
+GTKDOC_REBASE = @GTKDOC_REBASE@
+GTK_TEST_CFLAGS = @GTK_TEST_CFLAGS@
+GTK_TEST_LIBS = @GTK_TEST_LIBS@
+HTML_DIR = @HTML_DIR@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+INTROSPECTION_CFLAGS = @INTROSPECTION_CFLAGS@
+INTROSPECTION_COMPILER = @INTROSPECTION_COMPILER@
+INTROSPECTION_GENERATE = @INTROSPECTION_GENERATE@
+INTROSPECTION_GIRDIR = @INTROSPECTION_GIRDIR@
+INTROSPECTION_LIBS = @INTROSPECTION_LIBS@
+INTROSPECTION_MAKEFILE = @INTROSPECTION_MAKEFILE@
+INTROSPECTION_SCANNER = @INTROSPECTION_SCANNER@
+INTROSPECTION_TYPELIBDIR = @INTROSPECTION_TYPELIBDIR@
+LCMS_CFLAGS = @LCMS_CFLAGS@
+LCMS_LIBS = @LCMS_LIBS@
+LD = @LD@
+LDFLAGS = @LDFLAGS@
+LIBCURL_CFLAGS = @LIBCURL_CFLAGS@
+LIBCURL_LIBS = @LIBCURL_LIBS@
+LIBICONV = @LIBICONV@
+LIBJPEG_CFLAGS = @LIBJPEG_CFLAGS@
+LIBJPEG_LIBS = @LIBJPEG_LIBS@
+LIBOBJS = @LIBOBJS@
+LIBOPENJPEG_CFLAGS = @LIBOPENJPEG_CFLAGS@
+LIBOPENJPEG_LIBS = @LIBOPENJPEG_LIBS@
+LIBPNG_CFLAGS = @LIBPNG_CFLAGS@
+LIBPNG_LIBS = @LIBPNG_LIBS@
+LIBS = @LIBS@
+LIBTIFF_CFLAGS = @LIBTIFF_CFLAGS@
+LIBTIFF_CFLAGSS = @LIBTIFF_CFLAGSS@
+LIBTIFF_LIBS = @LIBTIFF_LIBS@
+LIBTOOL = @LIBTOOL@
+LIPO = @LIPO@
+LN_S = @LN_S@
+LTLIBICONV = @LTLIBICONV@
+LTLIBOBJS = @LTLIBOBJS@
+MAKEINFO = @MAKEINFO@
+MANIFEST_TOOL = @MANIFEST_TOOL@
+MKDIR_P = @MKDIR_P@
+MOCQT4 = @MOCQT4@
+NM = @NM@
+NMEDIT = @NMEDIT@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+OTOOL = @OTOOL@
+OTOOL64 = @OTOOL64@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_URL = @PACKAGE_URL@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PC_REQUIRES = @PC_REQUIRES@
+PC_REQUIRES_PRIVATE = @PC_REQUIRES_PRIVATE@
+PDFTOCAIRO_CFLAGS = @PDFTOCAIRO_CFLAGS@
+PDFTOCAIRO_LIBS = @PDFTOCAIRO_LIBS@
+PKG_CONFIG = @PKG_CONFIG@
+PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@
+PKG_CONFIG_PATH = @PKG_CONFIG_PATH@
+POPPLER_DATADIR = @POPPLER_DATADIR@
+POPPLER_GLIB_CFLAGS = @POPPLER_GLIB_CFLAGS@
+POPPLER_GLIB_DISABLE_DEPRECATED = @POPPLER_GLIB_DISABLE_DEPRECATED@
+POPPLER_GLIB_DISABLE_SINGLE_INCLUDES = @POPPLER_GLIB_DISABLE_SINGLE_INCLUDES@
+POPPLER_GLIB_LIBS = @POPPLER_GLIB_LIBS@
+POPPLER_MAJOR_VERSION = @POPPLER_MAJOR_VERSION@
+POPPLER_MICRO_VERSION = @POPPLER_MICRO_VERSION@
+POPPLER_MINOR_VERSION = @POPPLER_MINOR_VERSION@
+POPPLER_QT4_CFLAGS = @POPPLER_QT4_CFLAGS@
+POPPLER_QT4_CXXFLAGS = @POPPLER_QT4_CXXFLAGS@
+POPPLER_QT4_LIBS = @POPPLER_QT4_LIBS@
+POPPLER_QT4_TEST_CFLAGS = @POPPLER_QT4_TEST_CFLAGS@
+POPPLER_QT4_TEST_LIBS = @POPPLER_QT4_TEST_LIBS@
+POPPLER_VERSION = @POPPLER_VERSION@
+PTHREAD_CC = @PTHREAD_CC@
+PTHREAD_CFLAGS = @PTHREAD_CFLAGS@
+PTHREAD_LIBS = @PTHREAD_LIBS@
+RANLIB = @RANLIB@
+SED = @SED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+TESTDATADIR = @TESTDATADIR@
+VERSION = @VERSION@
+XMKMF = @XMKMF@
+X_CFLAGS = @X_CFLAGS@
+X_EXTRA_LIBS = @X_EXTRA_LIBS@
+X_LIBS = @X_LIBS@
+X_PRE_LIBS = @X_PRE_LIBS@
+ZLIB_LIBS = @ZLIB_LIBS@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
+ac_ct_AR = @ac_ct_AR@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_CXX = @ac_ct_CXX@
+ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
+acx_pthread_config = @acx_pthread_config@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+auto_import_flags = @auto_import_flags@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+builddir = @builddir@
+create_shared_lib = @create_shared_lib@
+datadir = @datadir@
+datarootdir = @datarootdir@
+docdir = @docdir@
+dvidir = @dvidir@
+exec_prefix = @exec_prefix@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+htmldir = @htmldir@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localedir = @localedir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+srcdir = @srcdir@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+top_build_prefix = @top_build_prefix@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+win32_libs = @win32_libs@
+INCLUDES = \
+       -I$(top_srcdir)/glib                    \
+       -I$(top_builddir)/glib                  \
+       $(GTK_TEST_CFLAGS)                      \
+       $(POPPLER_GLIB_DISABLE_DEPRECATED)      \
+       -DGTK_DISABLE_DEPRECATED                \
+       $(POPPLER_GLIB_DISABLE_SINGLE_INCLUDES)
+
+AM_LDFLAGS = @auto_import_flags@
+poppler_glib_demo_SOURCES = \
+       main.c                                  \
+       annots.h                                \
+       annots.c                                \
+       attachments.c                           \
+       attachments.h                           \
+       find.h                                  \
+       find.c                                  \
+       fonts.h                                 \
+       fonts.c                                 \
+       forms.h                                 \
+       forms.c                                 \
+       images.h                                \
+       images.c                                \
+       info.h                                  \
+       info.cc                                 \
+       layers.h                                \
+       layers.c                                \
+       links.h                                 \
+       links.c                                 \
+       outline.h                               \
+       outline.c                               \
+       page.h                                  \
+       page.c                                  \
+       print.h                                 \
+       print.c                                 \
+       render.h                                \
+       render.c                                \
+       selections.h                            \
+       selections.c                            \
+       text.h                                  \
+       text.c                                  \
+       transitions.h                           \
+       transitions.c                           \
+       utils.h                                 \
+       utils.c
+
+LDADD = \
+       $(top_builddir)/glib/libpoppler-glib.la \
+       $(top_builddir)/poppler/libpoppler.la   \
+       $(GTK_TEST_LIBS)
+
+all: all-am
+
+.SUFFIXES:
+.SUFFIXES: .c .cc .lo .o .obj
+$(srcdir)/Makefile.in:  $(srcdir)/Makefile.am  $(am__configure_deps)
+       @for dep in $?; do \
+         case '$(am__configure_deps)' in \
+           *$$dep*) \
+             ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
+               && { if test -f $@; then exit 0; else break; fi; }; \
+             exit 1;; \
+         esac; \
+       done; \
+       echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign glib/demo/Makefile'; \
+       $(am__cd) $(top_srcdir) && \
+         $(AUTOMAKE) --foreign glib/demo/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+       @case '$?' in \
+         *config.status*) \
+           cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+         *) \
+           echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+           cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+       esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+       cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure:  $(am__configure_deps)
+       cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4):  $(am__aclocal_m4_deps)
+       cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(am__aclocal_m4_deps):
+install-binPROGRAMS: $(bin_PROGRAMS)
+       @$(NORMAL_INSTALL)
+       @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \
+       if test -n "$$list"; then \
+         echo " $(MKDIR_P) '$(DESTDIR)$(bindir)'"; \
+         $(MKDIR_P) "$(DESTDIR)$(bindir)" || exit 1; \
+       fi; \
+       for p in $$list; do echo "$$p $$p"; done | \
+       sed 's/$(EXEEXT)$$//' | \
+       while read p p1; do if test -f $$p || test -f $$p1; \
+         then echo "$$p"; echo "$$p"; else :; fi; \
+       done | \
+       sed -e 'p;s,.*/,,;n;h' -e 's|.*|.|' \
+           -e 'p;x;s,.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/' | \
+       sed 'N;N;N;s,\n, ,g' | \
+       $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1 } \
+         { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \
+           if ($$2 == $$4) files[d] = files[d] " " $$1; \
+           else { print "f", $$3 "/" $$4, $$1; } } \
+         END { for (d in files) print "f", d, files[d] }' | \
+       while read type dir files; do \
+           if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \
+           test -z "$$files" || { \
+           echo " $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files '$(DESTDIR)$(bindir)$$dir'"; \
+           $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files "$(DESTDIR)$(bindir)$$dir" || exit $$?; \
+           } \
+       ; done
+
+uninstall-binPROGRAMS:
+       @$(NORMAL_UNINSTALL)
+       @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \
+       files=`for p in $$list; do echo "$$p"; done | \
+         sed -e 'h;s,^.*/,,;s/$(EXEEXT)$$//;$(transform)' \
+             -e 's/$$/$(EXEEXT)/' `; \
+       test -n "$$list" || exit 0; \
+       echo " ( cd '$(DESTDIR)$(bindir)' && rm -f" $$files ")"; \
+       cd "$(DESTDIR)$(bindir)" && rm -f $$files
+
+clean-binPROGRAMS:
+       @list='$(bin_PROGRAMS)'; test -n "$$list" || exit 0; \
+       echo " rm -f" $$list; \
+       rm -f $$list || exit $$?; \
+       test -n "$(EXEEXT)" || exit 0; \
+       list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \
+       echo " rm -f" $$list; \
+       rm -f $$list
+poppler-glib-demo$(EXEEXT): $(poppler_glib_demo_OBJECTS) $(poppler_glib_demo_DEPENDENCIES) $(EXTRA_poppler_glib_demo_DEPENDENCIES) 
+       @rm -f poppler-glib-demo$(EXEEXT)
+       $(AM_V_CXXLD)$(CXXLINK) $(poppler_glib_demo_OBJECTS) $(poppler_glib_demo_LDADD) $(LIBS)
+
+mostlyclean-compile:
+       -rm -f *.$(OBJEXT)
+
+distclean-compile:
+       -rm -f *.tab.c
+
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/annots.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/attachments.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/find.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fonts.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/forms.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/images.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/info.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/layers.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/links.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/main.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/outline.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/page.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/print.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/render.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/selections.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/text.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/transitions.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/utils.Po@am__quote@
+
+.c.o:
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(COMPILE) -c $<
+
+.c.obj:
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'`
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(COMPILE) -c `$(CYGPATH_W) '$<'`
+
+.c.lo:
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $<
+
+.cc.o:
+@am__fastdepCXX_TRUE@  $(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
+@am__fastdepCXX_TRUE@  $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ $<
+
+.cc.obj:
+@am__fastdepCXX_TRUE@  $(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'`
+@am__fastdepCXX_TRUE@  $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
+
+.cc.lo:
+@am__fastdepCXX_TRUE@  $(AM_V_CXX)$(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
+@am__fastdepCXX_TRUE@  $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     $(AM_V_CXX)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LTCXXCOMPILE) -c -o $@ $<
+
+mostlyclean-libtool:
+       -rm -f *.lo
+
+clean-libtool:
+       -rm -rf .libs _libs
+
+ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
+       list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+       unique=`for i in $$list; do \
+           if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+         done | \
+         $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
+             END { if (nonempty) { for (i in files) print i; }; }'`; \
+       mkid -fID $$unique
+tags: TAGS
+
+TAGS:  $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
+               $(TAGS_FILES) $(LISP)
+       set x; \
+       here=`pwd`; \
+       list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
+       unique=`for i in $$list; do \
+           if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+         done | \
+         $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
+             END { if (nonempty) { for (i in files) print i; }; }'`; \
+       shift; \
+       if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
+         test -n "$$unique" || unique=$$empty_fix; \
+         if test $$# -gt 0; then \
+           $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+             "$$@" $$unique; \
+         else \
+           $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+             $$unique; \
+         fi; \
+       fi
+ctags: CTAGS
+CTAGS:  $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
+               $(TAGS_FILES) $(LISP)
+       list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
+       unique=`for i in $$list; do \
+           if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+         done | \
+         $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
+             END { if (nonempty) { for (i in files) print i; }; }'`; \
+       test -z "$(CTAGS_ARGS)$$unique" \
+         || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+            $$unique
+
+GTAGS:
+       here=`$(am__cd) $(top_builddir) && pwd` \
+         && $(am__cd) $(top_srcdir) \
+         && gtags -i $(GTAGS_ARGS) "$$here"
+
+distclean-tags:
+       -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+
+distdir: $(DISTFILES)
+       @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+       topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+       list='$(DISTFILES)'; \
+         dist_files=`for file in $$list; do echo $$file; done | \
+         sed -e "s|^$$srcdirstrip/||;t" \
+             -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+       case $$dist_files in \
+         */*) $(MKDIR_P) `echo "$$dist_files" | \
+                          sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+                          sort -u` ;; \
+       esac; \
+       for file in $$dist_files; do \
+         if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+         if test -d $$d/$$file; then \
+           dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+           if test -d "$(distdir)/$$file"; then \
+             find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+           fi; \
+           if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+             cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
+             find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+           fi; \
+           cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
+         else \
+           test -f "$(distdir)/$$file" \
+           || cp -p $$d/$$file "$(distdir)/$$file" \
+           || exit 1; \
+         fi; \
+       done
+check-am: all-am
+check: check-am
+all-am: Makefile $(PROGRAMS)
+installdirs:
+       for dir in "$(DESTDIR)$(bindir)"; do \
+         test -z "$$dir" || $(MKDIR_P) "$$dir"; \
+       done
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+       @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+       if test -z '$(STRIP)'; then \
+         $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+           install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+             install; \
+       else \
+         $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+           install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+           "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
+       fi
+mostlyclean-generic:
+
+clean-generic:
+
+distclean-generic:
+       -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+       -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
+
+maintainer-clean-generic:
+       @echo "This command is intended for maintainers to use"
+       @echo "it deletes files that may require special tools to rebuild."
+clean: clean-am
+
+clean-am: clean-binPROGRAMS clean-generic clean-libtool mostlyclean-am
+
+distclean: distclean-am
+       -rm -rf ./$(DEPDIR)
+       -rm -f Makefile
+distclean-am: clean-am distclean-compile distclean-generic \
+       distclean-tags
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+html-am:
+
+info: info-am
+
+info-am:
+
+install-data-am:
+
+install-dvi: install-dvi-am
+
+install-dvi-am:
+
+install-exec-am: install-binPROGRAMS
+
+install-html: install-html-am
+
+install-html-am:
+
+install-info: install-info-am
+
+install-info-am:
+
+install-man:
+
+install-pdf: install-pdf-am
+
+install-pdf-am:
+
+install-ps: install-ps-am
+
+install-ps-am:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+       -rm -rf ./$(DEPDIR)
+       -rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-compile mostlyclean-generic \
+       mostlyclean-libtool
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am: uninstall-binPROGRAMS
+
+.MAKE: install-am install-strip
+
+.PHONY: CTAGS GTAGS all all-am check check-am clean clean-binPROGRAMS \
+       clean-generic clean-libtool ctags distclean distclean-compile \
+       distclean-generic distclean-libtool distclean-tags distdir dvi \
+       dvi-am html html-am info info-am install install-am \
+       install-binPROGRAMS install-data install-data-am install-dvi \
+       install-dvi-am install-exec install-exec-am install-html \
+       install-html-am install-info install-info-am install-man \
+       install-pdf install-pdf-am install-ps install-ps-am \
+       install-strip installcheck installcheck-am installdirs \
+       maintainer-clean maintainer-clean-generic mostlyclean \
+       mostlyclean-compile mostlyclean-generic mostlyclean-libtool \
+       pdf pdf-am ps ps-am tags uninstall uninstall-am \
+       uninstall-binPROGRAMS
+
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/glib/demo/annots.c b/glib/demo/annots.c
new file mode 100644 (file)
index 0000000..7075028
--- /dev/null
@@ -0,0 +1,919 @@
+/*
+ * Copyright (C) 2008 Inigo Martinez <inigomartinez@gmail.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include <gtk/gtk.h>
+#include <string.h>
+
+#include "annots.h"
+#include "utils.h"
+
+enum {
+    ANNOTS_X1_COLUMN,
+    ANNOTS_Y1_COLUMN,
+    ANNOTS_X2_COLUMN,
+    ANNOTS_Y2_COLUMN,
+    ANNOTS_TYPE_COLUMN,
+    ANNOTS_COLOR_COLUMN,
+    ANNOTS_FLAG_INVISIBLE_COLUMN,
+    ANNOTS_FLAG_HIDDEN_COLUMN,
+    ANNOTS_FLAG_PRINT_COLUMN,
+    ANNOTS_COLUMN,
+    N_COLUMNS
+};
+
+typedef struct {
+    PopplerDocument *doc;
+    PopplerPage     *page;
+
+    GtkListStore    *model;
+    GtkWidget       *annot_view;
+    GtkWidget       *timer_label;
+
+    gint             num_page;
+} PgdAnnotsDemo;
+
+static void
+pgd_annots_free (PgdAnnotsDemo *demo)
+{
+    if (!demo)
+        return;
+
+    if (demo->doc) {
+        g_object_unref (demo->doc);
+        demo->doc = NULL;
+    }
+
+    if (demo->page) {
+        g_object_unref (demo->page);
+        demo->page = NULL;
+    }
+
+    if (demo->model) {
+        g_object_unref (demo->model);
+        demo->model = NULL;
+    }
+
+    g_free (demo);
+}
+
+static GtkWidget *
+pgd_annot_view_new (void)
+{
+    GtkWidget  *frame, *label;
+
+    frame = gtk_frame_new (NULL);
+    gtk_frame_set_shadow_type (GTK_FRAME (frame), GTK_SHADOW_NONE);
+    label = gtk_label_new (NULL);
+    gtk_label_set_markup (GTK_LABEL (label), "<b>Annot Properties</b>");
+    gtk_frame_set_label_widget (GTK_FRAME (frame), label);
+    gtk_widget_show (label);
+
+    return frame;
+}
+
+const gchar *
+get_annot_type (PopplerAnnot *poppler_annot)
+{
+    switch (poppler_annot_get_annot_type (poppler_annot))
+    {
+      case POPPLER_ANNOT_TEXT:
+        return "Text";
+      case POPPLER_ANNOT_LINK:
+        return "Link";
+      case POPPLER_ANNOT_FREE_TEXT:
+        return "Free Text";
+      case POPPLER_ANNOT_LINE:
+        return "Line";
+      case POPPLER_ANNOT_SQUARE:
+        return "Square";
+      case POPPLER_ANNOT_CIRCLE:
+        return "Circle";
+      case POPPLER_ANNOT_POLYGON:
+        return "Polygon";
+      case POPPLER_ANNOT_POLY_LINE:
+        return "Poly Line";
+      case POPPLER_ANNOT_HIGHLIGHT:
+        return "Highlight";
+      case POPPLER_ANNOT_UNDERLINE:
+        return "Underline";
+      case POPPLER_ANNOT_SQUIGGLY:
+        return "Squiggly";
+      case POPPLER_ANNOT_STRIKE_OUT:
+        return "Strike Out";
+      case POPPLER_ANNOT_STAMP:
+        return "Stamp";
+      case POPPLER_ANNOT_CARET:
+        return "Caret";
+      case POPPLER_ANNOT_INK:
+        return "Ink";
+      case POPPLER_ANNOT_POPUP:
+        return "Popup";
+      case POPPLER_ANNOT_FILE_ATTACHMENT:
+        return "File Attachment";
+      case POPPLER_ANNOT_SOUND:
+        return "Sound";
+      case POPPLER_ANNOT_MOVIE:
+        return "Movie";
+      case POPPLER_ANNOT_WIDGET:
+        return "Widget";
+      case POPPLER_ANNOT_SCREEN:
+        return "Screen";
+      case POPPLER_ANNOT_PRINTER_MARK:
+        return "Printer Mark";
+      case POPPLER_ANNOT_TRAP_NET:
+        return "Trap Net";
+      case POPPLER_ANNOT_WATERMARK:
+        return "Watermark";
+      case POPPLER_ANNOT_3D:
+        return "3D";
+      default:
+        break;
+  }
+
+  return "Unknown";
+}
+
+GdkPixbuf *
+get_annot_color (PopplerAnnot *poppler_annot)
+{
+    PopplerColor *poppler_color;
+
+    if ((poppler_color = poppler_annot_get_color (poppler_annot))) {
+        GdkPixbuf *pixbuf = pgd_pixbuf_new_for_color (poppler_color);
+        g_free (poppler_color);
+
+        return pixbuf;
+    }
+
+    return NULL;
+}
+
+gchar *
+get_markup_date (PopplerAnnotMarkup *poppler_annot)
+{
+    GDate *date;
+    struct tm t;
+    time_t timet;
+
+    date = poppler_annot_markup_get_date (poppler_annot);
+    if (!date)
+           return NULL;
+
+    g_date_to_struct_tm (date, &t);
+    g_date_free (date);
+
+    timet = mktime (&t);
+    return timet == (time_t) - 1 ? NULL : pgd_format_date (timet);
+}
+
+const gchar *
+get_markup_reply_to (PopplerAnnotMarkup *poppler_annot)
+{
+    switch (poppler_annot_markup_get_reply_to (poppler_annot))
+    {
+      case POPPLER_ANNOT_MARKUP_REPLY_TYPE_R:
+        return "Type R";
+      case POPPLER_ANNOT_MARKUP_REPLY_TYPE_GROUP:
+        return "Type Group";
+      default:
+        break;
+    }
+
+  return "Unknown";
+}
+
+const gchar *
+get_markup_external_data (PopplerAnnotMarkup *poppler_annot)
+{
+    switch (poppler_annot_markup_get_external_data (poppler_annot))
+    {
+      case POPPLER_ANNOT_EXTERNAL_DATA_MARKUP_3D:
+        return "Markup 3D";
+      default:
+        break;
+    }
+
+  return "Unknown";
+}
+
+const gchar *
+get_text_state (PopplerAnnotText *poppler_annot)
+{
+    switch (poppler_annot_text_get_state (poppler_annot))
+    {
+      case POPPLER_ANNOT_TEXT_STATE_MARKED:
+        return "Marked";
+      case POPPLER_ANNOT_TEXT_STATE_UNMARKED:
+        return "Unmarked";
+      case POPPLER_ANNOT_TEXT_STATE_ACCEPTED:
+        return "Accepted";
+      case POPPLER_ANNOT_TEXT_STATE_REJECTED:
+        return "Rejected";
+      case POPPLER_ANNOT_TEXT_STATE_CANCELLED:
+        return "Cancelled";
+      case POPPLER_ANNOT_TEXT_STATE_COMPLETED:
+        return "Completed";
+      case POPPLER_ANNOT_TEXT_STATE_NONE:
+        return "None";
+      case POPPLER_ANNOT_TEXT_STATE_UNKNOWN:
+        return "Unknown";
+      default:
+        break;
+    }
+
+  return "Unknown";
+}
+
+const gchar *
+get_free_text_quadding (PopplerAnnotFreeText *poppler_annot)
+{
+    switch (poppler_annot_free_text_get_quadding (poppler_annot))
+    {
+      case POPPLER_ANNOT_FREE_TEXT_QUADDING_LEFT_JUSTIFIED:
+        return "Left Justified";
+      case POPPLER_ANNOT_FREE_TEXT_QUADDING_CENTERED:
+        return "Centered";
+      case POPPLER_ANNOT_FREE_TEXT_QUADDING_RIGHT_JUSTIFIED:
+        return "Right Justified";
+      default:
+        break;
+    }
+
+  return "Unknown";
+}
+
+gchar *
+get_free_text_callout_line (PopplerAnnotFreeText *poppler_annot)
+{
+    PopplerAnnotCalloutLine *callout;
+    gdouble x1, y1, x2, y2;
+    gchar *text;
+    
+    if ((callout = poppler_annot_free_text_get_callout_line (poppler_annot))) {
+        text = g_strdup_printf ("%f,%f,%f,%f", callout->x1,
+                                               callout->y1,
+                                               callout->x2,
+                                               callout->y2);
+        if (callout->multiline)
+            text = g_strdup_printf ("%s,%f,%f", text,
+                                                callout->x3,
+                                                callout->y3);
+
+        return text;
+    }
+    
+    return NULL;
+}
+
+static void
+pgd_annot_view_set_annot_markup (GtkWidget          *table,
+                                 PopplerAnnotMarkup *markup,
+                                 gint               *row)
+{
+    gchar *text;
+    PopplerRectangle rect;
+
+    text = poppler_annot_markup_get_label (markup);
+    pgd_table_add_property (GTK_TABLE (table), "<b>Label:</b>", text, row);
+    g_free (text);
+
+    if (poppler_annot_markup_has_popup (markup)) {
+           pgd_table_add_property (GTK_TABLE (table), "<b>Popup is open:</b>",
+                                   poppler_annot_markup_get_popup_is_open (markup) ? "Yes" : "No", row);
+
+           poppler_annot_markup_get_popup_rectangle (markup, &rect);
+           text = g_strdup_printf ("X1: %.2f, Y1: %.2f, X2: %.2f, Y2: %.2f",
+                                   rect.x1, rect.y1, rect.x2, rect.y2);
+           pgd_table_add_property (GTK_TABLE (table), "<b>Popup Rectangle:</b>", text, row);
+           g_free (text);
+    }
+
+    text = g_strdup_printf ("%f", poppler_annot_markup_get_opacity (markup));
+    pgd_table_add_property (GTK_TABLE (table), "<b>Opacity:</b>", text, row);
+    g_free (text);
+
+    text = get_markup_date (markup);
+    pgd_table_add_property (GTK_TABLE (table), "<b>Date:</b>", text, row);
+    g_free (text);
+
+    text = poppler_annot_markup_get_subject (markup);
+    pgd_table_add_property (GTK_TABLE (table), "<b>Subject:</b>", text, row);
+    g_free (text);
+
+    pgd_table_add_property (GTK_TABLE (table), "<b>Reply To:</b>", get_markup_reply_to (markup), row);
+
+    pgd_table_add_property (GTK_TABLE (table), "<b>External Data:</b>", get_markup_external_data (markup), row);
+}
+
+static void
+pgd_annot_view_set_annot_text (GtkWidget        *table,
+                               PopplerAnnotText *annot,
+                               gint             *row)
+{
+    gchar *text;
+
+    pgd_table_add_property (GTK_TABLE (table), "<b>Is open:</b>",
+                            poppler_annot_text_get_is_open (annot) ? "Yes" : "No", row);
+
+    text = poppler_annot_text_get_icon (annot);
+    pgd_table_add_property (GTK_TABLE (table), "<b>Icon:</b>", text, row);
+    g_free (text);
+
+    pgd_table_add_property (GTK_TABLE (table), "<b>State:</b>", get_text_state (annot), row);
+}
+
+static void
+pgd_annot_view_set_annot_free_text (GtkWidget            *table,
+                                    PopplerAnnotFreeText *annot,
+                                    gint                 *row)
+{
+    gchar *text;
+
+    pgd_table_add_property (GTK_TABLE (table), "<b>Quadding:</b>", get_free_text_quadding (annot), row);
+
+    text = get_free_text_callout_line (annot);
+    pgd_table_add_property (GTK_TABLE (table), "<b>Callout:</b>", text, row);
+    g_free (text);
+}
+
+static void
+pgd_annots_file_attachment_save_dialog_response (GtkFileChooser    *file_chooser,
+                                                gint               response,
+                                                PopplerAttachment *attachment)
+{
+    gchar  *filename;
+    GError *error = NULL;
+
+    if (response != GTK_RESPONSE_ACCEPT) {
+        g_object_unref (attachment);
+       gtk_widget_destroy (GTK_WIDGET (file_chooser));
+       return;
+    }
+
+    filename = gtk_file_chooser_get_filename (file_chooser);
+    if (!poppler_attachment_save (attachment, filename, &error)) {
+        g_warning ("%s", error->message);
+       g_error_free (error);
+    }
+    g_free (filename);
+    g_object_unref (attachment);
+    gtk_widget_destroy (GTK_WIDGET (file_chooser));
+}
+
+static void
+pgd_annot_save_file_attachment_button_clicked (GtkButton                  *button,
+                                              PopplerAnnotFileAttachment *annot)
+{
+    GtkWidget         *file_chooser;
+    PopplerAttachment *attachment;
+
+    attachment = poppler_annot_file_attachment_get_attachment (annot);
+    if (!attachment)
+        return;
+
+    file_chooser = gtk_file_chooser_dialog_new ("Save attachment",
+                                               GTK_WINDOW (gtk_widget_get_toplevel (GTK_WIDGET (button))),
+                                               GTK_FILE_CHOOSER_ACTION_SAVE,
+                                               GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
+                                               GTK_STOCK_SAVE, GTK_RESPONSE_ACCEPT,
+                                               NULL);
+    gtk_file_chooser_set_current_name (GTK_FILE_CHOOSER (file_chooser), attachment->name);
+    g_signal_connect (G_OBJECT (file_chooser), "response",
+                     G_CALLBACK (pgd_annots_file_attachment_save_dialog_response),
+                     (gpointer) attachment);
+    gtk_widget_show (file_chooser);
+}
+
+static void
+pgd_annot_view_set_annot_file_attachment (GtkWidget                  *table,
+                                         PopplerAnnotFileAttachment *annot,
+                                         gint                       *row)
+{
+    GtkWidget *button;
+    gchar *text;
+
+    text = poppler_annot_file_attachment_get_name (annot);
+    pgd_table_add_property (GTK_TABLE (table), "<b>Attachment Name:</b>", text, row);
+    g_free (text);
+
+    button = gtk_button_new_with_label ("Save Attachment");
+    g_signal_connect (G_OBJECT (button), "clicked",
+                     G_CALLBACK (pgd_annot_save_file_attachment_button_clicked),
+                     (gpointer)annot);
+    pgd_table_add_property_with_custom_widget (GTK_TABLE (table), "<b>File Attachment:</b>", button, row);
+    gtk_widget_show (button);
+
+}
+
+static void
+pgd_annot_view_set_annot_movie (GtkWidget         *table,
+                               PopplerAnnotMovie *annot,
+                               gint              *row)
+{
+    GtkWidget *movie_view;
+    gchar *text;
+
+    text = poppler_annot_movie_get_title (annot);
+    pgd_table_add_property (GTK_TABLE (table), "<b>Movie Title:</b>", text, row);
+    g_free (text);
+
+    movie_view = pgd_movie_view_new ();
+    pgd_movie_view_set_movie (movie_view, poppler_annot_movie_get_movie (annot));
+    pgd_table_add_property_with_custom_widget (GTK_TABLE (table), "<b>Movie:</b>", movie_view, row);
+    gtk_widget_show (movie_view);
+}
+
+static void
+pgd_annot_view_set_annot_screen (GtkWidget          *table,
+                                PopplerAnnotScreen *annot,
+                                gint               *row)
+{
+    GtkWidget *action_view;
+
+    action_view = pgd_action_view_new (NULL);
+    pgd_action_view_set_action (action_view, poppler_annot_screen_get_action (annot));
+    pgd_table_add_property_with_custom_widget (GTK_TABLE (table), "<b>Action:</b>", action_view, row);
+    gtk_widget_show (action_view);
+}
+
+static void
+pgd_annot_view_set_annot (GtkWidget    *annot_view,
+                          PopplerAnnot *annot)
+{
+    GtkWidget  *alignment;
+    GtkWidget  *table;
+    GEnumValue *enum_value;
+    gint        row = 0;
+    gchar      *text, *warning;
+    time_t      timet;
+
+    alignment = gtk_bin_get_child (GTK_BIN (annot_view));
+    if (alignment) {
+        gtk_container_remove (GTK_CONTAINER (annot_view), alignment);
+    }
+
+    alignment = gtk_alignment_new (0.5, 0.5, 1, 1);
+    gtk_alignment_set_padding (GTK_ALIGNMENT (alignment), 5, 5, 12, 5);
+    gtk_container_add (GTK_CONTAINER (annot_view), alignment);
+    gtk_widget_show (alignment);
+
+    if (!annot)
+        return;
+
+    table = gtk_table_new (10, 2, FALSE);
+    gtk_table_set_col_spacings (GTK_TABLE (table), 6);
+    gtk_table_set_row_spacings (GTK_TABLE (table), 6);
+
+    text = poppler_annot_get_contents (annot);
+    pgd_table_add_property (GTK_TABLE (table), "<b>Contents:</b>", text, &row);
+    g_free (text);
+
+    text = poppler_annot_get_name (annot);
+    pgd_table_add_property (GTK_TABLE (table), "<b>Name:</b>", text, &row);
+    g_free (text);
+
+    text = poppler_annot_get_modified (annot);
+    if (poppler_date_parse (text, &timet)) {
+           g_free (text);
+           text = pgd_format_date (timet);
+    }
+    pgd_table_add_property (GTK_TABLE (table), "<b>Modified:</b>", text, &row);
+    g_free (text);
+
+    text = g_strdup_printf ("%d", poppler_annot_get_flags (annot));
+    pgd_table_add_property (GTK_TABLE (table), "<b>Flags:</b>", text, &row);
+    g_free (text);
+
+    text = g_strdup_printf ("%d", poppler_annot_get_page_index (annot));
+    pgd_table_add_property (GTK_TABLE (table), "<b>Page:</b>", text, &row);
+    g_free (text);
+
+    if (POPPLER_IS_ANNOT_MARKUP (annot))
+        pgd_annot_view_set_annot_markup (table, POPPLER_ANNOT_MARKUP (annot), &row);
+
+    switch (poppler_annot_get_annot_type (annot))
+    {
+        case POPPLER_ANNOT_TEXT:
+          pgd_annot_view_set_annot_text (table, POPPLER_ANNOT_TEXT (annot), &row);
+          break;
+        case POPPLER_ANNOT_FREE_TEXT:
+          pgd_annot_view_set_annot_free_text (table, POPPLER_ANNOT_FREE_TEXT (annot), &row);
+          break;
+        case POPPLER_ANNOT_FILE_ATTACHMENT:
+         pgd_annot_view_set_annot_file_attachment (table, POPPLER_ANNOT_FILE_ATTACHMENT (annot), &row);
+         break;
+        case POPPLER_ANNOT_MOVIE:
+         pgd_annot_view_set_annot_movie (table, POPPLER_ANNOT_MOVIE (annot), &row);
+         break;
+        case POPPLER_ANNOT_SCREEN:
+         pgd_annot_view_set_annot_screen (table, POPPLER_ANNOT_SCREEN (annot), &row);
+         break;
+        default:
+          break;
+    }
+
+    gtk_container_add (GTK_CONTAINER (alignment), table);
+    gtk_widget_show (table);
+}
+
+static void
+pgd_annots_get_annots (GtkWidget     *button,
+                       PgdAnnotsDemo *demo)
+{
+    GList       *mapping, *l;
+    gint         n_fields;
+    GTimer      *timer;
+
+    gtk_list_store_clear (demo->model);
+    pgd_annot_view_set_annot (demo->annot_view, NULL);
+
+    if (demo->page) {
+        g_object_unref (demo->page);
+        demo->page = NULL;
+    }
+
+    demo->page = poppler_document_get_page (demo->doc, demo->num_page);
+    if (!demo->page)
+        return;
+
+    timer = g_timer_new ();
+    mapping = poppler_page_get_annot_mapping (demo->page);
+    g_timer_stop (timer);
+
+    n_fields = g_list_length (mapping);
+    if (n_fields > 0) {
+        gchar *str;
+
+        str = g_strdup_printf ("<i>%d annots found in %.4f seconds</i>",
+                               n_fields, g_timer_elapsed (timer, NULL));
+        gtk_label_set_markup (GTK_LABEL (demo->timer_label), str);
+        g_free (str);
+    } else {
+        gtk_label_set_markup (GTK_LABEL (demo->timer_label), "<i>No annots found</i>");
+    }
+
+    g_timer_destroy (timer);
+
+    for (l = mapping; l; l = g_list_next (l)) {
+        PopplerAnnotMapping *amapping;
+        GtkTreeIter          iter;
+        gchar               *x1, *y1, *x2, *y2;
+        GdkPixbuf           *pixbuf;
+       PopplerAnnotFlag     flags;
+
+        amapping = (PopplerAnnotMapping *) l->data;
+
+        x1 = g_strdup_printf ("%.2f", amapping->area.x1);
+        y1 = g_strdup_printf ("%.2f", amapping->area.y1);
+        x2 = g_strdup_printf ("%.2f", amapping->area.x2);
+        y2 = g_strdup_printf ("%.2f", amapping->area.y2);
+
+        pixbuf = get_annot_color (amapping->annot);
+       flags = poppler_annot_get_flags (amapping->annot);
+
+        gtk_list_store_append (demo->model, &iter);
+        gtk_list_store_set (demo->model, &iter,
+                            ANNOTS_X1_COLUMN, x1,
+                            ANNOTS_Y1_COLUMN, y1,
+                            ANNOTS_X2_COLUMN, x2,
+                            ANNOTS_Y2_COLUMN, y2,
+                            ANNOTS_TYPE_COLUMN, get_annot_type (amapping->annot),
+                            ANNOTS_COLOR_COLUMN, pixbuf,
+                           ANNOTS_FLAG_INVISIBLE_COLUMN, (flags & POPPLER_ANNOT_FLAG_INVISIBLE),
+                           ANNOTS_FLAG_HIDDEN_COLUMN, (flags & POPPLER_ANNOT_FLAG_HIDDEN),
+                           ANNOTS_FLAG_PRINT_COLUMN, (flags & POPPLER_ANNOT_FLAG_PRINT),
+                            ANNOTS_COLUMN, amapping->annot,
+                           -1);
+
+        if (pixbuf)
+            g_object_unref (pixbuf);
+
+        g_free (x1);
+        g_free (y1);
+        g_free (x2);
+        g_free (y2);
+    }
+
+    poppler_page_free_annot_mapping (mapping);
+}
+
+static void
+pgd_annots_page_selector_value_changed (GtkSpinButton *spinbutton,
+                                        PgdAnnotsDemo *demo)
+{
+    demo->num_page = (gint) gtk_spin_button_get_value (spinbutton) - 1;
+}
+
+static void
+pgd_annots_selection_changed (GtkTreeSelection *treeselection,
+                              PgdAnnotsDemo    *demo)
+{
+    GtkTreeModel *model;
+    GtkTreeIter   iter;
+
+    if (gtk_tree_selection_get_selected (treeselection, &model, &iter)) {
+        PopplerAnnot *annot;
+
+        gtk_tree_model_get (model, &iter,
+                            ANNOTS_COLUMN, &annot,
+                           -1);
+        pgd_annot_view_set_annot (demo->annot_view, annot);
+        g_object_unref (annot);
+    }
+}
+
+static void
+pgd_annots_add_annot (GtkWidget     *button,
+                     PgdAnnotsDemo *demo)
+{
+    GtkWidget   *hbox, *vbox;
+    GtkWidget   *type_selector;
+    GtkWidget   *label;
+    GtkWidget   *rect_hbox;
+    GtkWidget   *rect_x1, *rect_y1, *rect_x2, *rect_y2;
+    GtkWidget   *dialog;
+    PopplerPage *page;
+    gdouble      width, height;
+    PopplerAnnot *annot;
+    PopplerRectangle rect;
+
+    page = poppler_document_get_page (demo->doc, demo->num_page);
+    if (!page)
+           return;
+    poppler_page_get_size (page, &width, &height);
+
+    dialog = gtk_dialog_new_with_buttons ("Add new annotation",
+                                         GTK_WINDOW (gtk_widget_get_toplevel (button)),
+                                         GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT,
+                                         GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
+                                         "Add annotation", GTK_RESPONSE_ACCEPT,
+                                         NULL);
+
+    vbox = gtk_dialog_get_content_area (GTK_DIALOG (dialog));
+
+#if GTK_CHECK_VERSION (2, 24, 0)
+    type_selector = gtk_combo_box_text_new ();
+    gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (type_selector), "POPPLER_ANNOT_UNKNOWN");
+    gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (type_selector), "POPPLER_ANNOT_TEXT");
+#else
+    type_selector = gtk_combo_box_new_text ();
+    gtk_combo_box_append_text (GTK_COMBO_BOX (type_selector), "POPPLER_ANNOT_UNKNOWN");
+    gtk_combo_box_append_text (GTK_COMBO_BOX (type_selector), "POPPLER_ANNOT_TEXT");
+#endif
+    gtk_combo_box_set_active (GTK_COMBO_BOX (type_selector), 1);
+    gtk_box_pack_start (GTK_BOX (vbox), type_selector, TRUE, TRUE, 0);
+    gtk_widget_show (type_selector);
+
+    hbox = gtk_hbox_new (FALSE, 6);
+
+    rect_hbox = gtk_hbox_new (FALSE, 6);
+
+    label = gtk_label_new ("x1:");
+    gtk_box_pack_start (GTK_BOX (rect_hbox), label, TRUE, TRUE, 0);
+    gtk_widget_show (label);
+
+    rect_x1 = gtk_spin_button_new_with_range (0, width, 1.0);
+    gtk_box_pack_start (GTK_BOX (rect_hbox), rect_x1, TRUE, TRUE, 0);
+    gtk_widget_show (rect_x1);
+
+    gtk_box_pack_start (GTK_BOX (hbox), rect_hbox, FALSE, TRUE, 0);
+    gtk_widget_show (rect_hbox);
+
+    rect_hbox = gtk_hbox_new (FALSE, 6);
+
+    label = gtk_label_new ("x2:");
+    gtk_box_pack_start (GTK_BOX (rect_hbox), label, TRUE, TRUE, 0);
+    gtk_widget_show (label);
+
+    rect_x2 = gtk_spin_button_new_with_range (0, width, 1.0);
+    gtk_box_pack_start (GTK_BOX (rect_hbox), rect_x2, TRUE, TRUE, 0);
+    gtk_widget_show (rect_x2);
+
+    gtk_box_pack_start (GTK_BOX (hbox), rect_hbox, FALSE, TRUE, 0);
+    gtk_widget_show (rect_hbox);
+
+    rect_hbox = gtk_hbox_new (FALSE, 6);
+
+    label = gtk_label_new ("y1:");
+    gtk_box_pack_start (GTK_BOX (rect_hbox), label, TRUE, TRUE, 0);
+    gtk_widget_show (label);
+
+    rect_y1 = gtk_spin_button_new_with_range (0, height, 1.0);
+    gtk_box_pack_start (GTK_BOX (rect_hbox), rect_y1, TRUE, TRUE, 0);
+    gtk_widget_show (rect_y1);
+
+    gtk_box_pack_start (GTK_BOX (hbox), rect_hbox, FALSE, TRUE, 0);
+    gtk_widget_show (rect_hbox);
+
+    rect_hbox = gtk_hbox_new (FALSE, 6);
+
+    label = gtk_label_new ("y2:");
+    gtk_box_pack_start (GTK_BOX (rect_hbox), label, TRUE, TRUE, 0);
+    gtk_widget_show (label);
+
+    rect_y2 = gtk_spin_button_new_with_range (0, height, 1.0);
+    gtk_box_pack_start (GTK_BOX (rect_hbox), rect_y2, TRUE, TRUE, 0);
+    gtk_widget_show (rect_y2);
+
+    gtk_box_pack_start (GTK_BOX (hbox), rect_hbox, FALSE, TRUE, 0);
+    gtk_widget_show (rect_hbox);
+
+    gtk_box_pack_start (GTK_BOX (vbox), hbox, TRUE, TRUE, 0);
+    gtk_widget_show (hbox);
+
+    gtk_dialog_run (GTK_DIALOG (dialog));
+
+    rect.x1 = gtk_spin_button_get_value (GTK_SPIN_BUTTON (rect_x1));
+    rect.x2 = gtk_spin_button_get_value (GTK_SPIN_BUTTON (rect_x2));
+    rect.y1 = height - gtk_spin_button_get_value (GTK_SPIN_BUTTON (rect_y2));
+    rect.y2 = height - gtk_spin_button_get_value (GTK_SPIN_BUTTON (rect_y1));
+    annot = poppler_annot_text_new (demo->doc, &rect);
+    poppler_page_add_annot (page, annot);
+
+    g_object_unref (page);
+
+    gtk_widget_destroy (dialog);
+}
+
+GtkWidget *
+pgd_annots_create_widget (PopplerDocument *document)
+{
+    PgdAnnotsDemo    *demo;
+    GtkWidget        *label;
+    GtkWidget        *vbox;
+    GtkWidget        *hbox, *page_selector;
+    GtkWidget        *button;
+    GtkWidget        *hpaned;
+    GtkWidget        *swindow, *treeview;
+    GtkTreeSelection *selection;
+    GtkCellRenderer  *renderer;
+    gchar            *str;
+    gint              n_pages;
+
+    demo = g_new0 (PgdAnnotsDemo, 1);
+
+    demo->doc = g_object_ref (document);
+
+    n_pages = poppler_document_get_n_pages (document);
+
+    vbox = gtk_vbox_new (FALSE, 12);
+
+    hbox = gtk_hbox_new (FALSE, 6);
+
+    label = gtk_label_new ("Page:");
+    gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, TRUE, 0);
+    gtk_widget_show (label);
+
+    page_selector = gtk_spin_button_new_with_range (1, n_pages, 1);
+    g_signal_connect (G_OBJECT (page_selector), "value-changed",
+                      G_CALLBACK (pgd_annots_page_selector_value_changed),
+                      (gpointer) demo);
+    gtk_box_pack_start (GTK_BOX (hbox), page_selector, FALSE, TRUE, 0);
+    gtk_widget_show (page_selector);
+
+    str = g_strdup_printf ("of %d", n_pages);
+    label = gtk_label_new (str);
+    gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, TRUE, 0);
+    gtk_widget_show (label);
+    g_free (str);
+
+    button = gtk_button_new_with_label ("Get Annots");
+    g_signal_connect (G_OBJECT (button), "clicked",
+                      G_CALLBACK (pgd_annots_get_annots),
+                      (gpointer) demo);
+    gtk_box_pack_end (GTK_BOX (hbox), button, FALSE, FALSE, 0);
+    gtk_widget_show (button);
+
+    button = gtk_button_new_with_label ("Add Annot");
+    g_signal_connect (G_OBJECT (button), "clicked",
+                     G_CALLBACK (pgd_annots_add_annot),
+                     (gpointer) demo);
+    gtk_box_pack_end (GTK_BOX (hbox), button, FALSE, FALSE, 0);
+    gtk_widget_show (button);
+
+    gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, TRUE, 0);
+    gtk_widget_show (hbox);
+
+    demo->timer_label = gtk_label_new (NULL);
+    gtk_label_set_markup (GTK_LABEL (demo->timer_label), "<i>No annots found</i>");
+    g_object_set (G_OBJECT (demo->timer_label), "xalign", 1.0, NULL);
+    gtk_box_pack_start (GTK_BOX (vbox), demo->timer_label, FALSE, TRUE, 0);
+    gtk_widget_show (demo->timer_label);
+
+    hpaned = gtk_hpaned_new ();
+
+    demo->annot_view = pgd_annot_view_new ();
+
+    swindow = gtk_scrolled_window_new (NULL, NULL);
+    gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (swindow),
+                                    GTK_POLICY_AUTOMATIC,
+                                    GTK_POLICY_AUTOMATIC);
+
+    demo->model = gtk_list_store_new (N_COLUMNS, G_TYPE_STRING,
+                                      G_TYPE_STRING, G_TYPE_STRING,
+                                      G_TYPE_STRING, G_TYPE_STRING,
+                                      GDK_TYPE_PIXBUF, G_TYPE_BOOLEAN,
+                                     G_TYPE_BOOLEAN, G_TYPE_BOOLEAN,
+                                     G_TYPE_OBJECT);
+    treeview = gtk_tree_view_new_with_model (GTK_TREE_MODEL (demo->model));
+
+    renderer = gtk_cell_renderer_text_new ();
+    gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (treeview),
+                                                 ANNOTS_X1_COLUMN, "X1",
+                                                 renderer,
+                                                 "text", ANNOTS_X1_COLUMN,
+                                                 NULL);
+    renderer = gtk_cell_renderer_text_new ();
+    gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (treeview),
+                                                 ANNOTS_Y1_COLUMN, "Y1",
+                                                 renderer,
+                                                 "text", ANNOTS_Y1_COLUMN,
+                                                 NULL);
+    renderer = gtk_cell_renderer_text_new ();
+    gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (treeview),
+                                                 ANNOTS_X2_COLUMN, "X2",
+                                                 renderer,
+                                                 "text", ANNOTS_X2_COLUMN,
+                                                 NULL);
+    renderer = gtk_cell_renderer_text_new ();
+    gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (treeview),
+                                                 ANNOTS_Y2_COLUMN, "Y2",
+                                                 renderer,
+                                                 "text", ANNOTS_Y2_COLUMN,
+                                                 NULL);
+
+    renderer = gtk_cell_renderer_text_new ();
+    gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (treeview),
+                                                 ANNOTS_TYPE_COLUMN, "Type",
+                                                 renderer,
+                                                 "text", ANNOTS_TYPE_COLUMN,
+                                                 NULL);
+
+    renderer = gtk_cell_renderer_pixbuf_new ();
+    gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (treeview),
+                                                 ANNOTS_COLOR_COLUMN, "Color",
+                                                 renderer,
+                                                 "pixbuf", ANNOTS_COLOR_COLUMN,
+                                                 NULL);
+
+    renderer = gtk_cell_renderer_toggle_new ();
+    gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (treeview),
+                                                 ANNOTS_FLAG_INVISIBLE_COLUMN, "Invisible",
+                                                 renderer,
+                                                 "active", ANNOTS_FLAG_INVISIBLE_COLUMN,
+                                                 NULL);
+
+    renderer = gtk_cell_renderer_toggle_new ();
+    gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (treeview),
+                                                 ANNOTS_FLAG_HIDDEN_COLUMN, "Hidden",
+                                                 renderer,
+                                                 "active", ANNOTS_FLAG_HIDDEN_COLUMN,
+                                                 NULL);
+
+    renderer = gtk_cell_renderer_toggle_new ();
+    gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (treeview),
+                                                 ANNOTS_FLAG_PRINT_COLUMN, "Print",
+                                                 renderer,
+                                                 "active", ANNOTS_FLAG_PRINT_COLUMN,
+                                                 NULL);
+
+    selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (treeview));
+    g_signal_connect (G_OBJECT (selection), "changed",
+                      G_CALLBACK (pgd_annots_selection_changed),
+                      (gpointer) demo);
+
+    gtk_container_add (GTK_CONTAINER (swindow), treeview);
+    gtk_widget_show (treeview);
+
+    gtk_paned_add1 (GTK_PANED (hpaned), swindow);
+    gtk_widget_show (swindow);
+
+    gtk_paned_add2 (GTK_PANED (hpaned), demo->annot_view);
+    gtk_widget_show (demo->annot_view);
+
+    gtk_paned_set_position (GTK_PANED (hpaned), 300);
+
+    gtk_box_pack_start (GTK_BOX (vbox), hpaned, TRUE, TRUE, 0);
+    gtk_widget_show (hpaned);
+
+    g_object_weak_ref (G_OBJECT (vbox),
+                       (GWeakNotify)pgd_annots_free,
+                       demo);
+
+    return vbox;
+}
diff --git a/glib/demo/annots.h b/glib/demo/annots.h
new file mode 100644 (file)
index 0000000..844e4f5
--- /dev/null
@@ -0,0 +1,31 @@
+/*
+ * Copyright (C) 2008 Inigo Martinez <inigomartinez@gmail.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include <gtk/gtk.h>
+#include <poppler.h>
+
+#ifndef _ANNOTS_H_
+#define _ANNOTS_H_
+
+G_BEGIN_DECLS
+
+GtkWidget *pgd_annots_create_widget (PopplerDocument *document);
+
+G_END_DECLS
+
+#endif /* _ANNOTS_H_ */
diff --git a/glib/demo/attachments.c b/glib/demo/attachments.c
new file mode 100644 (file)
index 0000000..63565dd
--- /dev/null
@@ -0,0 +1,353 @@
+/*
+ * Copyright (C) 2008 Carlos Garcia Campos  <carlosgc@gnome.org>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include <gtk/gtk.h>
+
+#include "attachments.h"
+#include "utils.h"
+
+enum {
+       ATTACHMENTS_NAME_COLUMN,
+       ATTACHMENTS_DESCRIPTION_COLUMN,
+       ATTACHMENTS_SIZE_COLUMN,
+       ATTACHMENTS_CTIME_COLUMN,
+       ATTACHMENTS_MTIME_COLUMN,
+       ATTACHMENTS_ATTACHMENT_COLUMN,
+       N_COLUMNS
+};
+
+static void
+pgd_attachments_fill_model (GtkListStore    *model,
+                           PopplerDocument *document)
+{
+       GList *list, *l;
+
+       list = poppler_document_get_attachments (document);
+
+       for (l = list; l && l->data; l = g_list_next (l)) {
+               PopplerAttachment *attachment = POPPLER_ATTACHMENT (l->data);
+               GtkTreeIter        iter;
+               gchar             *size;
+               gchar             *ctime, *mtime;
+
+               size = g_strdup_printf ("%" G_GSIZE_FORMAT, attachment->size);
+               ctime = pgd_format_date (attachment->ctime);
+               mtime = pgd_format_date (attachment->mtime);
+
+               gtk_list_store_append (model, &iter);
+               gtk_list_store_set (model, &iter,
+                                   ATTACHMENTS_NAME_COLUMN,
+                                   attachment->name ? attachment->name : "Unknown", 
+                                   ATTACHMENTS_DESCRIPTION_COLUMN,
+                                   attachment->description ? attachment->description : "Unknown", 
+                                   ATTACHMENTS_SIZE_COLUMN,
+                                   size ? size : "Unknown",
+                                   ATTACHMENTS_CTIME_COLUMN,
+                                   ctime ? ctime : "Unknown", 
+                                   ATTACHMENTS_MTIME_COLUMN,
+                                   mtime ? mtime : "Unknown", 
+                                   ATTACHMENTS_ATTACHMENT_COLUMN, attachment,
+                                   -1);
+
+               g_free (size);
+               g_free (ctime);
+               g_free (mtime);
+
+               g_object_unref (attachment);
+       }
+
+       g_list_free (list);
+}
+
+static GtkWidget *
+pgd_attachments_create_list (GtkTreeModel *model)
+{
+       GtkWidget       *treeview;
+       GtkCellRenderer *renderer;
+       
+       treeview = gtk_tree_view_new_with_model (GTK_TREE_MODEL (model));
+       gtk_tree_view_set_headers_visible (GTK_TREE_VIEW (treeview), TRUE);
+       gtk_tree_view_set_rules_hint (GTK_TREE_VIEW (treeview), TRUE);
+
+       renderer = gtk_cell_renderer_text_new ();
+       gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (treeview),
+                                                    0, "Name",
+                                                    renderer,
+                                                    "text", ATTACHMENTS_NAME_COLUMN,
+                                                    NULL);
+       renderer = gtk_cell_renderer_text_new ();
+       gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (treeview),
+                                                    1, "Description",
+                                                    renderer,
+                                                    "text", ATTACHMENTS_DESCRIPTION_COLUMN,
+                                                    NULL);
+       g_object_set (G_OBJECT (renderer), "ellipsize", PANGO_ELLIPSIZE_END, NULL);
+       g_object_set (G_OBJECT (gtk_tree_view_get_column (GTK_TREE_VIEW (treeview), 1)),
+                     "expand", TRUE, NULL);
+       renderer = gtk_cell_renderer_text_new ();
+       gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (treeview),
+                                                    2, "Size",
+                                                    renderer,
+                                                    "text", ATTACHMENTS_SIZE_COLUMN,
+                                                    NULL);
+       renderer = gtk_cell_renderer_text_new ();
+       gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (treeview),
+                                                    3, "Creation Date",
+                                                    renderer,
+                                                    "text", ATTACHMENTS_CTIME_COLUMN,
+                                                    NULL);
+       renderer = gtk_cell_renderer_text_new ();
+       gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (treeview),
+                                                    4, "Modification Date",
+                                                    renderer,
+                                                    "text", ATTACHMENTS_MTIME_COLUMN,
+                                                    NULL);
+       return treeview;
+}
+
+static void
+pgd_attachments_save_dialog_response (GtkFileChooser    *file_chooser,
+                                     gint               response,
+                                     PopplerAttachment *attachment)
+{
+       gchar  *filename;
+       GError *error = NULL;
+       
+       if (response != GTK_RESPONSE_ACCEPT) {
+               g_object_unref (attachment);
+               gtk_widget_destroy (GTK_WIDGET (file_chooser));
+               return;
+       }
+
+       filename = gtk_file_chooser_get_filename (file_chooser);
+       if (!poppler_attachment_save (attachment, filename, &error)) {
+               g_warning ("%s", error->message);
+               g_error_free (error);
+       }
+       g_free (filename);
+       g_object_unref (attachment);
+       gtk_widget_destroy (GTK_WIDGET (file_chooser));
+}
+
+static void
+pgd_attachments_save_button_clicked (GtkButton   *button,
+                                    GtkTreeView *treeview)
+{
+       GtkTreeSelection  *selection;
+       GtkTreeModel      *model;
+       GtkTreeIter        iter;
+       GtkWidget         *file_chooser;
+       PopplerAttachment *attachment;
+
+       selection = gtk_tree_view_get_selection (treeview);
+       if (!gtk_tree_selection_get_selected (selection, &model, &iter)) 
+               return;
+
+       gtk_tree_model_get (model, &iter,
+                           ATTACHMENTS_ATTACHMENT_COLUMN, &attachment,
+                           -1);
+
+       if (!attachment)
+               return;
+
+       file_chooser = gtk_file_chooser_dialog_new ("Save attachment",
+                                                   GTK_WINDOW (gtk_widget_get_toplevel (GTK_WIDGET (treeview))),
+                                                   GTK_FILE_CHOOSER_ACTION_SAVE,
+                                                   GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
+                                                   GTK_STOCK_SAVE, GTK_RESPONSE_ACCEPT,
+                                                   NULL);
+       gtk_file_chooser_set_current_name (GTK_FILE_CHOOSER (file_chooser), attachment->name);
+       g_signal_connect (G_OBJECT (file_chooser), "response",
+                         G_CALLBACK (pgd_attachments_save_dialog_response),
+                         (gpointer) attachment);
+       gtk_widget_show (file_chooser);
+               
+}
+
+static gboolean
+attachment_save_callback (const gchar  *buf,
+                         gsize         count,
+                         gpointer      data,
+                         GError      **error)
+{
+       GChecksum *cs = (GChecksum *)data;
+
+       g_checksum_update (cs, buf, count);
+
+       return TRUE;
+}
+
+static void
+message_dialog_run (GtkWindow   *parent,
+                   const gchar *message)
+{
+       GtkWidget *dialog;
+
+       dialog = gtk_message_dialog_new (parent,
+                                        GTK_DIALOG_DESTROY_WITH_PARENT,
+                                        GTK_MESSAGE_INFO,
+                                        GTK_BUTTONS_CLOSE,
+                                        "%s", message);
+       gtk_dialog_run (GTK_DIALOG (dialog));
+       gtk_widget_destroy (dialog);
+}
+
+static void
+pgd_attachments_validate_button_clicked (GtkButton   *button,
+                                        GtkTreeView *treeview)
+{
+       GtkTreeSelection  *selection;
+       GtkTreeModel      *model;
+       GtkTreeIter        iter;
+       GChecksum         *cs;
+       guint8            *digest;
+       gsize              digest_len;
+       PopplerAttachment *attachment;
+       gboolean           valid = TRUE;
+
+       selection = gtk_tree_view_get_selection (treeview);
+       if (!gtk_tree_selection_get_selected (selection, &model, &iter))
+               return;
+
+       gtk_tree_model_get (model, &iter,
+                           ATTACHMENTS_ATTACHMENT_COLUMN, &attachment,
+                           -1);
+
+       if (!attachment)
+               return;
+
+       if (attachment->checksum->len == 0) {
+               message_dialog_run (GTK_WINDOW (gtk_widget_get_toplevel (GTK_WIDGET (treeview))),
+                                   "Impossible to validate attachment: checksum is not available");
+               g_object_unref (attachment);
+
+               return;
+       }
+       
+       cs = g_checksum_new (G_CHECKSUM_MD5);
+       poppler_attachment_save_to_callback (attachment, attachment_save_callback,
+                                            (gpointer)cs, NULL);
+       digest_len = g_checksum_type_get_length (G_CHECKSUM_MD5);
+       digest = (guint8 *) g_malloc (digest_len);
+       g_checksum_get_digest (cs, digest, &digest_len);
+       g_checksum_free (cs);
+
+       if (attachment->checksum->len == digest_len) {
+               gint i;
+       
+               for (i = 0; i < digest_len; i++) {
+                       if ((guint8)attachment->checksum->str[i] != digest[i]) {
+                               valid = FALSE;
+                               break;
+                       }
+               }
+       }
+
+       if (valid) {
+               message_dialog_run (GTK_WINDOW (gtk_widget_get_toplevel (GTK_WIDGET (treeview))),
+                                   "Attachment is valid");
+       } else {
+               message_dialog_run (GTK_WINDOW (gtk_widget_get_toplevel (GTK_WIDGET (treeview))),
+                                   "Attachment is not valid: the checksum does not match");
+       }
+
+       g_free (digest);
+       g_object_unref (attachment);
+}
+
+GtkWidget *
+pgd_attachments_create_widget (PopplerDocument *document)
+{
+       GtkWidget    *vbox;
+       GtkWidget    *treeview;
+       GtkListStore *model;
+       GtkWidget    *swindow;
+       GtkWidget    *hbox, *button;
+       gboolean      has_attachments;
+
+       vbox = gtk_vbox_new (FALSE, 12);
+
+       swindow = gtk_scrolled_window_new (NULL, NULL);
+       gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (swindow),
+                                       GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
+
+       has_attachments = poppler_document_has_attachments (document);
+       if (has_attachments) {
+               model = gtk_list_store_new (N_COLUMNS,
+                                           G_TYPE_STRING, G_TYPE_STRING,
+                                           G_TYPE_STRING,
+                                           G_TYPE_STRING, G_TYPE_STRING,
+                                           G_TYPE_OBJECT);
+               pgd_attachments_fill_model (model, document);
+               treeview = pgd_attachments_create_list (GTK_TREE_MODEL (model));
+       } else {
+               GtkCellRenderer *renderer;
+               GtkTreeIter      iter;
+               gchar           *markup;
+
+               model = gtk_list_store_new (1, G_TYPE_STRING);
+               gtk_list_store_append (model, &iter);
+               markup = g_strdup_printf ("<span size=\"larger\" style=\"italic\">%s</span>",
+                                         "The document doesn't contain attachments");
+               gtk_list_store_set (model, &iter, 0, markup, -1);
+               g_free (markup);
+
+               treeview = gtk_tree_view_new_with_model (GTK_TREE_MODEL (model));
+
+               renderer = gtk_cell_renderer_text_new ();
+               gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (treeview),
+                                                            0, "Name",
+                                                            renderer,
+                                                            "markup", 0,
+                                                            NULL);
+       }
+       g_object_unref (model);
+
+       gtk_container_add (GTK_CONTAINER (swindow), treeview);
+       gtk_widget_show (treeview);
+
+       gtk_box_pack_start (GTK_BOX (vbox), swindow, TRUE, TRUE, 0);
+       gtk_widget_show (swindow);
+
+       if (!has_attachments)
+               return vbox;
+       
+       hbox = gtk_hbutton_box_new ();
+       gtk_button_box_set_layout (GTK_BUTTON_BOX (hbox), GTK_BUTTONBOX_SPREAD);
+
+       button = gtk_button_new_with_label ("Save");
+       g_signal_connect (G_OBJECT (button), "clicked",
+                         G_CALLBACK (pgd_attachments_save_button_clicked),
+                         (gpointer)treeview);
+
+       gtk_box_pack_start (GTK_BOX (hbox), button, FALSE, FALSE, 0);
+       gtk_widget_show (button);
+
+       button = gtk_button_new_with_label ("Validate");
+       g_signal_connect (G_OBJECT (button), "clicked",
+                         G_CALLBACK (pgd_attachments_validate_button_clicked),
+                         (gpointer)treeview);
+
+       gtk_box_pack_start (GTK_BOX (hbox), button, FALSE, FALSE, 0);
+       gtk_widget_show (button);
+
+       gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, TRUE, 6);
+       gtk_widget_show (hbox);
+
+       return vbox;
+}
diff --git a/glib/demo/attachments.h b/glib/demo/attachments.h
new file mode 100644 (file)
index 0000000..36dab82
--- /dev/null
@@ -0,0 +1,31 @@
+/*
+ * Copyright (C) 2008 Carlos Garcia Campos  <carlosgc@gnome.org>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include <gtk/gtk.h>
+#include <poppler.h>
+
+#ifndef _ATTACHMENTS_H_
+#define _ATTACHMENTS_H_
+
+G_BEGIN_DECLS
+
+GtkWidget *pgd_attachments_create_widget (PopplerDocument *document);
+
+G_END_DECLS
+
+#endif /* _ATTACHMENTS_H_ */
diff --git a/glib/demo/find.c b/glib/demo/find.c
new file mode 100644 (file)
index 0000000..632e610
--- /dev/null
@@ -0,0 +1,282 @@
+/*
+ * Copyright (C) 2008 Carlos Garcia Campos  <carlosgc@gnome.org>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include "find.h"
+
+enum {
+       TITLE_COLUMN,
+       X1_COLUMN,
+       Y1_COLUMN,
+       X2_COLUMN,
+       Y2_COLUMN,
+
+       VISIBLE_COLUMN,
+       N_COLUMNS
+};
+
+typedef struct {
+       PopplerDocument *doc;
+
+       GtkTreeModel    *model;
+       GtkWidget       *entry;
+       GtkWidget       *progress;
+
+       gint             n_pages;
+       gint             page_index;
+       
+       guint            idle_id;
+} PgdFindDemo;
+
+static void
+pgd_find_free (PgdFindDemo *demo)
+{
+       if (!demo)
+               return;
+
+       if (demo->idle_id > 0) {
+               g_source_remove (demo->idle_id);
+               demo->idle_id = 0;
+       }
+
+       if (demo->doc) {
+               g_object_unref (demo->doc);
+               demo->doc = NULL;
+       }
+
+       if (demo->model) {
+               g_object_unref (demo->model);
+               demo->model = NULL;
+       }
+
+       g_free (demo);
+}
+
+static void
+pgd_find_update_progress (PgdFindDemo *demo,
+                         gint         scanned)
+{
+       gchar *str;
+
+       str = g_strdup_printf ("Searching ... (%d%%)",
+                              MIN (scanned * 100 / demo->n_pages, 100));
+       gtk_progress_bar_set_text (GTK_PROGRESS_BAR (demo->progress), str);
+       gtk_progress_bar_set_fraction (GTK_PROGRESS_BAR (demo->progress),
+                                      MIN ((gdouble)scanned / demo->n_pages, 1.0));
+       g_free (str);
+}
+
+static gboolean
+pgd_find_find_text (PgdFindDemo *demo)
+{
+       PopplerPage *page;
+       GList       *matches;
+       GTimer      *timer;
+
+       page = poppler_document_get_page (demo->doc, demo->page_index);
+       if (!page) {
+               demo->page_index++;
+               return demo->page_index < demo->n_pages;
+       }
+
+       timer = g_timer_new ();
+       matches = poppler_page_find_text (page, gtk_entry_get_text (GTK_ENTRY (demo->entry)));
+       g_timer_stop (timer);
+       if (matches) {
+               GtkTreeIter iter;
+               gchar      *str;
+               GList      *l;
+               gint        n_match = 0;
+
+               str = g_strdup_printf ("%d matches found on page %d in %.4f seconds",
+                                      g_list_length (matches), demo->page_index + 1,
+                                      g_timer_elapsed (timer, NULL));
+               
+               gtk_tree_store_append (GTK_TREE_STORE (demo->model), &iter, NULL);
+               gtk_tree_store_set (GTK_TREE_STORE (demo->model), &iter,
+                                   TITLE_COLUMN, str,
+                                   VISIBLE_COLUMN, FALSE,
+                                   -1);
+               g_free (str);
+               
+               for (l = matches; l && l->data; l = g_list_next (l)) {
+                       PopplerRectangle *rect = (PopplerRectangle *)l->data;
+                       GtkTreeIter       iter_child;
+                       gchar            *x1, *y1, *x2, *y2;
+
+                       str = g_strdup_printf ("Match %d", ++n_match);
+                       x1 = g_strdup_printf ("%.2f", rect->x1);
+                       y1 = g_strdup_printf ("%.2f", rect->y1);
+                       x2 = g_strdup_printf ("%.2f", rect->x2);
+                       y2 = g_strdup_printf ("%.2f", rect->y2);
+                       
+                       gtk_tree_store_append (GTK_TREE_STORE (demo->model), &iter_child, &iter);
+                       gtk_tree_store_set (GTK_TREE_STORE (demo->model), &iter_child,
+                                           TITLE_COLUMN, str,
+                                           X1_COLUMN, x1,
+                                           Y1_COLUMN, y1,
+                                           X2_COLUMN, x2,
+                                           Y2_COLUMN, y2,
+                                           VISIBLE_COLUMN, TRUE,
+                                           -1);
+                       g_free (str);
+                       g_free (x1);
+                       g_free (y1);
+                       g_free (x2);
+                       g_free (y2);
+                       poppler_rectangle_free (rect);
+               }
+               g_list_free (matches);
+       }
+
+       g_timer_destroy (timer);
+       g_object_unref (page);
+
+       demo->page_index++;
+       pgd_find_update_progress (demo, demo->page_index);
+
+       return demo->page_index < demo->n_pages;
+}
+
+static void
+pgd_find_button_clicked (GtkButton   *button,
+                        PgdFindDemo *demo)
+{
+       gtk_tree_store_clear (GTK_TREE_STORE (demo->model));
+       demo->page_index = 0;
+       pgd_find_update_progress (demo, demo->page_index);
+       if (demo->idle_id > 0)
+               g_source_remove (demo->idle_id);
+       demo->idle_id = g_idle_add ((GSourceFunc)pgd_find_find_text, demo);
+}
+
+static void
+pgd_find_button_sensitivity_cb (GtkWidget *button,
+                               GtkEntry  *entry)
+{
+       const gchar *text;
+
+       text = gtk_entry_get_text (entry);
+       gtk_widget_set_sensitive (button, text != NULL && text[0] != '\0');
+}
+
+GtkWidget *
+pgd_find_create_widget (PopplerDocument *document)
+{
+       PgdFindDemo     *demo;
+       GtkWidget       *vbox, *hbox;
+       GtkWidget       *button;
+       GtkWidget       *swindow;
+       GtkWidget       *treeview;
+       GtkCellRenderer *renderer;
+
+       demo = g_new0 (PgdFindDemo, 1);
+
+       demo->doc = g_object_ref (document);
+
+       demo->n_pages = poppler_document_get_n_pages (document);
+
+       vbox = gtk_vbox_new (FALSE, 12);
+
+       hbox = gtk_hbox_new (FALSE, 6);
+
+       demo->entry = gtk_entry_new ();
+       gtk_box_pack_start (GTK_BOX (hbox), demo->entry, FALSE, TRUE, 0);
+       gtk_widget_show (demo->entry);
+
+       demo->progress = gtk_progress_bar_new ();
+       gtk_progress_bar_set_ellipsize (GTK_PROGRESS_BAR (demo->progress),
+                                       PANGO_ELLIPSIZE_END);
+       gtk_box_pack_start (GTK_BOX (hbox), demo->progress, TRUE, TRUE, 0);
+       gtk_widget_show (demo->progress);
+
+       button = gtk_button_new_with_label ("Find");
+       gtk_widget_set_sensitive (button, FALSE);
+       g_signal_connect (G_OBJECT (button), "clicked",
+                         G_CALLBACK (pgd_find_button_clicked),
+                         (gpointer)demo);
+       g_signal_connect_swapped (G_OBJECT (demo->entry), "changed",
+                                 G_CALLBACK (pgd_find_button_sensitivity_cb),
+                                 (gpointer)button);
+       gtk_box_pack_end (GTK_BOX (hbox), button, FALSE, FALSE, 0);
+       gtk_widget_show (button);
+
+       gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, TRUE, 6);
+       gtk_widget_show (hbox);
+
+       swindow = gtk_scrolled_window_new (NULL, NULL);
+       gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (swindow),
+                                       GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
+
+       demo->model = GTK_TREE_MODEL (
+               gtk_tree_store_new (N_COLUMNS,
+                                   G_TYPE_STRING,
+                                   G_TYPE_STRING, G_TYPE_STRING,
+                                   G_TYPE_STRING, G_TYPE_STRING,
+                                   G_TYPE_BOOLEAN));
+       treeview = gtk_tree_view_new_with_model (GTK_TREE_MODEL (demo->model));
+       gtk_tree_view_set_rules_hint (GTK_TREE_VIEW (treeview), TRUE);
+       gtk_tree_selection_set_mode (gtk_tree_view_get_selection (GTK_TREE_VIEW (treeview)),
+                                    GTK_SELECTION_NONE);
+       
+       renderer = gtk_cell_renderer_text_new ();
+       gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (treeview),
+                                                    TITLE_COLUMN, "Matches",
+                                                    renderer,
+                                                    "text", TITLE_COLUMN,
+                                                    NULL);
+       
+       renderer = gtk_cell_renderer_text_new ();
+       gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (treeview),
+                                                    X1_COLUMN, "X1",
+                                                    renderer,
+                                                    "text", X1_COLUMN,
+                                                    "visible", VISIBLE_COLUMN,
+                                                    NULL);
+       renderer = gtk_cell_renderer_text_new ();
+       gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (treeview),
+                                                    Y1_COLUMN, "Y1",
+                                                    renderer,
+                                                    "text", Y1_COLUMN,
+                                                    "visible", VISIBLE_COLUMN,
+                                                    NULL);
+       renderer = gtk_cell_renderer_text_new ();
+       gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (treeview),
+                                                    X2_COLUMN, "X2",
+                                                    renderer,
+                                                    "text", X2_COLUMN,
+                                                    "visible", VISIBLE_COLUMN,
+                                                    NULL);
+       renderer = gtk_cell_renderer_text_new ();
+       gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (treeview),
+                                                    Y2_COLUMN, "Y2",
+                                                    renderer,
+                                                    "text", Y2_COLUMN,
+                                                    "visible", VISIBLE_COLUMN,
+                                                    NULL);
+       gtk_container_add (GTK_CONTAINER (swindow), treeview);
+       gtk_widget_show (treeview);
+
+       gtk_box_pack_start (GTK_BOX (vbox), swindow, TRUE, TRUE, 0);
+       gtk_widget_show (swindow);
+
+       g_object_weak_ref (G_OBJECT (vbox),
+                          (GWeakNotify)pgd_find_free,
+                          (gpointer)demo);
+
+       return vbox;
+}
diff --git a/glib/demo/find.h b/glib/demo/find.h
new file mode 100644 (file)
index 0000000..36f95c1
--- /dev/null
@@ -0,0 +1,31 @@
+/*
+ * Copyright (C) 2008 Carlos Garcia Campos  <carlosgc@gnome.org>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include <gtk/gtk.h>
+#include <poppler.h>
+
+#ifndef _FIND_H_
+#define _FIND_H_
+
+G_BEGIN_DECLS
+
+GtkWidget *pgd_find_create_widget (PopplerDocument *document);
+
+G_END_DECLS
+
+#endif /* _FIND_H_ */
diff --git a/glib/demo/fonts.c b/glib/demo/fonts.c
new file mode 100644 (file)
index 0000000..24eb87c
--- /dev/null
@@ -0,0 +1,283 @@
+/*
+ * Copyright (C) 2007 Carlos Garcia Campos  <carlosgc@gnome.org>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include <gtk/gtk.h>
+
+#include "fonts.h"
+
+enum {
+       FONTS_NAME_COLUMN,
+       FONTS_DETAILS_COLUMN,
+       N_COLUMNS
+};
+
+typedef struct {
+       PopplerDocument *doc;
+       
+       GtkWidget       *treeview;
+       GtkWidget       *progress;
+
+       guint            idle_id;
+} PgdFontsDemo;
+
+static void
+pgd_fonts_free (PgdFontsDemo *demo)
+{
+       if (!demo)
+               return;
+
+       if (demo->idle_id > 0) {
+               g_source_remove (demo->idle_id);
+               demo->idle_id = 0;
+       }
+       
+       if (demo->doc) {
+               g_object_unref (demo->doc);
+               demo->doc = NULL;
+       }
+
+       g_free (demo);
+}
+
+static void
+pdg_fonts_cell_data_func (GtkTreeViewColumn *col,
+                         GtkCellRenderer   *renderer,
+                         GtkTreeModel      *model,
+                         GtkTreeIter       *iter,
+                         gpointer           user_data)
+{
+       char *name;
+       char *details;
+       char *markup;
+
+       gtk_tree_model_get (model, iter,
+                           FONTS_NAME_COLUMN, &name,
+                           FONTS_DETAILS_COLUMN, &details,
+                           -1);
+
+       if (details) {
+               markup = g_strdup_printf ("<b><big>%s</big></b>\n<small>%s</small>",
+                                         name, details);
+       } else {
+               markup = g_strdup_printf ("<b><big>%s</big></b>", name);
+       }
+
+       g_object_set (renderer, "markup", markup, NULL);
+
+       g_free (markup);
+       g_free (details);
+       g_free (name);
+}
+
+static const gchar *
+font_type_to_string (PopplerFontType type)
+{
+       switch (type) {
+       case POPPLER_FONT_TYPE_TYPE1:
+               return "Type 1";
+       case POPPLER_FONT_TYPE_TYPE1C:
+               return "Type 1C";
+       case POPPLER_FONT_TYPE_TYPE3:
+               return "Type 3";
+       case POPPLER_FONT_TYPE_TRUETYPE:
+               return "TrueType";
+       case POPPLER_FONT_TYPE_CID_TYPE0:
+               return "Type 1 (CID)";
+       case POPPLER_FONT_TYPE_CID_TYPE0C:
+               return "Type 1C (CID)";
+       case POPPLER_FONT_TYPE_CID_TYPE2:
+               return "TrueType (CID)";
+       default:
+               return "Unknown font type";
+       }
+}
+
+static void
+pgd_fonts_update_progress (PgdFontsDemo *demo,
+                          gint          n_pages,
+                          gint          scanned)
+{
+       gchar *str;
+
+       str = g_strdup_printf ("Scanning fonts (%d%%)",
+                              MIN (scanned * 100 / n_pages, 100));
+       gtk_progress_bar_set_text (GTK_PROGRESS_BAR (demo->progress), str);
+       gtk_progress_bar_set_fraction (GTK_PROGRESS_BAR (demo->progress),
+                                      MIN ((gdouble)scanned / n_pages, 1.0));
+       g_free (str);
+}
+
+static gboolean
+pgd_fonts_fill_model (PgdFontsDemo *demo)
+{
+       GtkTreeModel     *model;
+       PopplerFontInfo  *font_info;
+       PopplerFontsIter *fonts_iter;
+       gint              n_pages, scanned = 0;
+
+       n_pages = poppler_document_get_n_pages (demo->doc);
+       
+       model = gtk_tree_view_get_model (GTK_TREE_VIEW (demo->treeview));
+       g_object_ref (model);
+
+       gtk_list_store_clear (GTK_LIST_STORE (model));
+
+       font_info = poppler_font_info_new (demo->doc);
+
+       while (poppler_font_info_scan (font_info, 20, &fonts_iter)) {
+               pgd_fonts_update_progress (demo, n_pages, scanned);
+               
+               while (gtk_events_pending ())
+                       gtk_main_iteration ();
+
+               scanned += 20;
+               
+               if (!fonts_iter)
+                       continue;
+               
+               do {
+                       GtkTreeIter iter;
+                       const gchar *name;
+                       const gchar *type;
+                       const gchar *embedded;
+                       const gchar *substitute;
+                       const gchar *filename;
+                       const gchar *encoding;
+                       gchar       *details;
+
+                       name = poppler_fonts_iter_get_name (fonts_iter);
+                       if (!name)
+                               name = "No name";
+
+                       encoding = poppler_fonts_iter_get_encoding (fonts_iter);
+                       if (!encoding)
+                               encoding = "None";
+
+                       type = font_type_to_string (poppler_fonts_iter_get_font_type (fonts_iter));
+                       
+                       if (poppler_fonts_iter_is_embedded (fonts_iter)) {
+                               if (poppler_fonts_iter_is_subset (fonts_iter))
+                                       embedded = "Embedded subset";
+                               else
+                                       embedded = "Embedded";
+                       } else {
+                               embedded = "Not embedded";
+                       }
+
+                       substitute = poppler_fonts_iter_get_substitute_name (fonts_iter);
+                       filename = poppler_fonts_iter_get_file_name (fonts_iter);
+
+                       if (substitute && filename)
+                               details = g_markup_printf_escaped ("%s\nEncoding: %s\n%s, substituting with <b>%s</b>\n(%s)", type, encoding, embedded, substitute, filename);
+                       else
+                               details = g_markup_printf_escaped ("%s\nEncoding: %s\n%s", type, encoding, embedded);
+
+                       gtk_list_store_append (GTK_LIST_STORE (model), &iter);
+                       gtk_list_store_set (GTK_LIST_STORE (model), &iter,
+                                           FONTS_NAME_COLUMN, name,
+                                           FONTS_DETAILS_COLUMN, details,
+                                           -1);
+                       
+                       g_free (details);
+               } while (poppler_fonts_iter_next (fonts_iter));
+               poppler_fonts_iter_free (fonts_iter);
+       }
+
+       pgd_fonts_update_progress (demo, n_pages, scanned);
+       
+       g_object_unref (font_info);
+       g_object_unref (model);
+
+       return FALSE;
+}
+
+static void
+pgd_fonts_scan_button_clicked (GtkButton    *button,
+                              PgdFontsDemo *demo)
+{
+       demo->idle_id = g_idle_add ((GSourceFunc)pgd_fonts_fill_model, demo);
+}
+
+GtkWidget *
+pgd_fonts_create_widget (PopplerDocument *document)
+{
+       PgdFontsDemo      *demo;
+       GtkWidget         *vbox;
+       GtkListStore      *model;
+       GtkCellRenderer   *renderer;
+       GtkTreeViewColumn *column;
+       GtkWidget         *swindow;
+       GtkWidget         *hbox, *button;
+
+       demo = g_new0 (PgdFontsDemo, 1);
+
+       demo->doc = g_object_ref (document);
+       
+       vbox = gtk_vbox_new (FALSE, 12);
+
+       hbox = gtk_hbox_new (FALSE, 6);
+       
+       demo->progress = gtk_progress_bar_new ();
+       gtk_progress_bar_set_ellipsize (GTK_PROGRESS_BAR (demo->progress),
+                                       PANGO_ELLIPSIZE_END);
+       gtk_box_pack_start (GTK_BOX (hbox), demo->progress, TRUE, TRUE, 0);
+       gtk_widget_show (demo->progress);
+
+       button = gtk_button_new_with_label ("Scan");
+       g_signal_connect (G_OBJECT (button), "clicked",
+                         G_CALLBACK (pgd_fonts_scan_button_clicked),
+                         (gpointer)demo);
+       gtk_box_pack_end (GTK_BOX (hbox), button, FALSE, FALSE, 0);
+       gtk_widget_show (button);
+
+       gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, TRUE, 6);
+       gtk_widget_show (hbox);
+       
+       swindow = gtk_scrolled_window_new (NULL, NULL);
+       gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (swindow),
+                                       GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
+
+       model = gtk_list_store_new (N_COLUMNS, G_TYPE_STRING, G_TYPE_STRING);
+       demo->treeview = gtk_tree_view_new_with_model (GTK_TREE_MODEL (model));
+       gtk_tree_view_set_headers_visible (GTK_TREE_VIEW (demo->treeview), FALSE);
+       gtk_tree_view_set_rules_hint (GTK_TREE_VIEW (demo->treeview), TRUE);
+       gtk_tree_selection_set_mode (gtk_tree_view_get_selection (GTK_TREE_VIEW (demo->treeview)),
+                                    GTK_SELECTION_NONE);
+       g_object_unref (model);
+
+       column = gtk_tree_view_column_new ();
+       gtk_tree_view_append_column (GTK_TREE_VIEW (demo->treeview), column);
+       
+       renderer = gtk_cell_renderer_text_new ();
+       gtk_tree_view_column_pack_start (GTK_TREE_VIEW_COLUMN (column), renderer, FALSE);
+       gtk_tree_view_column_set_cell_data_func (column, renderer,
+                                                pdg_fonts_cell_data_func,
+                                                NULL, NULL);
+
+       gtk_container_add (GTK_CONTAINER (swindow), demo->treeview);
+       gtk_widget_show (demo->treeview);
+
+       gtk_box_pack_start (GTK_BOX (vbox), swindow, TRUE, TRUE, 0);
+       gtk_widget_show (swindow);
+
+       g_object_weak_ref (G_OBJECT (swindow),
+                          (GWeakNotify)pgd_fonts_free,
+                          (gpointer)demo);
+
+       return vbox;
+}
diff --git a/glib/demo/fonts.h b/glib/demo/fonts.h
new file mode 100644 (file)
index 0000000..b13447c
--- /dev/null
@@ -0,0 +1,31 @@
+/*
+ * Copyright (C) 2007 Carlos Garcia Campos  <carlosgc@gnome.org>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include <gtk/gtk.h>
+#include <poppler.h>
+
+#ifndef _FONTS_H_
+#define _FONTS_H_
+
+G_BEGIN_DECLS
+
+GtkWidget *pgd_fonts_create_widget (PopplerDocument *document);
+
+G_END_DECLS
+
+#endif /* _FONTS_H_ */
diff --git a/glib/demo/forms.c b/glib/demo/forms.c
new file mode 100644 (file)
index 0000000..3a74ef5
--- /dev/null
@@ -0,0 +1,516 @@
+/*
+ * Copyright (C) 2007 Carlos Garcia Campos  <carlosgc@gnome.org>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include <gtk/gtk.h>
+#include <string.h>
+
+#include "forms.h"
+#include "utils.h"
+
+enum {
+       FORMS_FIELD_TYPE_COLUMN,
+       FORMS_ID_COLUMN,
+       FORMS_READ_ONLY_COLUMN,
+       FORMS_X1_COLUMN,
+       FORMS_Y1_COLUMN,
+       FORMS_X2_COLUMN,
+       FORMS_Y2_COLUMN,
+       FORMS_FIELD_COLUMN,
+       N_COLUMNS
+};
+
+typedef struct {
+       PopplerDocument *doc;
+
+       GtkListStore    *model;
+       GtkWidget       *field_view;
+       GtkWidget       *timer_label;
+
+       gint             page;
+} PgdFormsDemo;
+
+static void
+pgd_forms_free (PgdFormsDemo *demo)
+{
+       if (!demo)
+               return;
+
+       if (demo->doc) {
+               g_object_unref (demo->doc);
+               demo->doc = NULL;
+       }
+
+       if (demo->model) {
+               g_object_unref (demo->model);
+               demo->model = NULL;
+       }
+
+       g_free (demo);
+}
+
+static GtkWidget *
+pgd_form_field_view_new (void)
+{
+       GtkWidget  *frame, *label;
+
+       frame = gtk_frame_new (NULL);
+       gtk_frame_set_shadow_type (GTK_FRAME (frame), GTK_SHADOW_NONE);
+       label = gtk_label_new (NULL);
+       gtk_label_set_markup (GTK_LABEL (label), "<b>Form Field Properties</b>");
+       gtk_frame_set_label_widget (GTK_FRAME (frame), label);
+       gtk_widget_show (label);
+
+       return frame;
+}
+
+static void
+pgd_form_field_view_add_choice_items (GtkTable         *table,
+                                     PopplerFormField *field,
+                                     gint             *selected,
+                                     gint             *row)
+{
+       GtkWidget     *label;
+       GtkWidget     *textview, *swindow;
+       GtkTextBuffer *buffer;
+       gint           i;
+
+       label = gtk_label_new (NULL);
+       g_object_set (G_OBJECT (label), "xalign", 0.0, NULL);
+       gtk_label_set_markup (GTK_LABEL (label), "<b>Items:</b>");
+       gtk_table_attach (GTK_TABLE (table), label, 0, 1, *row, *row + 1,
+                         GTK_FILL, GTK_FILL, 0, 0);
+       gtk_widget_show (label);
+
+       swindow = gtk_scrolled_window_new (NULL, NULL);
+       gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (swindow),
+                                       GTK_POLICY_AUTOMATIC,
+                                       GTK_POLICY_AUTOMATIC);
+
+       textview = gtk_text_view_new ();
+       gtk_text_view_set_editable (GTK_TEXT_VIEW (textview), FALSE);
+       buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (textview));
+       
+       for (i = 0; i < poppler_form_field_choice_get_n_items (field); i++) {
+               gchar *item;
+
+               item = poppler_form_field_choice_get_item (field, i);
+               gtk_text_buffer_insert_at_cursor (buffer, item, strlen (item));
+               gtk_text_buffer_insert_at_cursor (buffer, "\n", strlen ("\n"));
+               g_free (item);
+               
+               if (poppler_form_field_choice_is_item_selected (field, i))
+                       *selected = i;
+       }
+
+       gtk_container_add (GTK_CONTAINER (swindow), textview);
+       gtk_widget_show (textview);
+       
+       gtk_table_attach (GTK_TABLE (table), swindow, 1, 2, *row, *row + 1,
+                         GTK_FILL, GTK_FILL, 0, 0);
+       gtk_widget_show (swindow); 
+       
+       *row += 1;
+}
+
+static void
+pgd_form_field_view_set_field (GtkWidget        *field_view,
+                              PopplerFormField *field)
+{
+       GtkWidget     *alignment;
+       GtkWidget     *table;
+        PopplerAction *action;
+       GEnumValue    *enum_value;
+       gchar         *text;
+       gint           row = 0;
+
+       alignment = gtk_bin_get_child (GTK_BIN (field_view));
+       if (alignment) {
+               gtk_container_remove (GTK_CONTAINER (field_view), alignment);
+       }
+       
+       alignment = gtk_alignment_new (0.5, 0.5, 1, 1);
+       gtk_alignment_set_padding (GTK_ALIGNMENT (alignment), 5, 5, 12, 5);
+       gtk_container_add (GTK_CONTAINER (field_view), alignment);
+       gtk_widget_show (alignment);
+
+       if (!field)
+               return;
+
+       table = gtk_table_new (13, 2, FALSE);
+       gtk_table_set_col_spacings (GTK_TABLE (table), 6);
+       gtk_table_set_row_spacings (GTK_TABLE (table), 6);
+
+       text = poppler_form_field_get_name (field);
+       if (text) {
+               pgd_table_add_property (GTK_TABLE (table), "<b>Name:</b>", text, &row);
+               g_free (text);
+       }
+       text = poppler_form_field_get_partial_name (field);
+       if (text) {
+               pgd_table_add_property (GTK_TABLE (table), "<b>Partial Name:</b>", text, &row);
+               g_free (text);
+       }
+       text = poppler_form_field_get_mapping_name (field);
+       if (text) {
+               pgd_table_add_property (GTK_TABLE (table), "<b>Mapping Name:</b>", text, &row);
+               g_free (text);
+       }
+
+        action = poppler_form_field_get_action (field);
+        if (action) {
+                GtkWidget *action_view;
+
+                action_view = pgd_action_view_new (NULL);
+                pgd_action_view_set_action (action_view, action);
+                pgd_table_add_property_with_custom_widget (GTK_TABLE (table), "<b>Action:</b>", action_view, &row);
+                gtk_widget_show (action_view);
+        }
+
+       switch (poppler_form_field_get_field_type (field)) {
+       case POPPLER_FORM_FIELD_BUTTON:
+               enum_value = g_enum_get_value ((GEnumClass *) g_type_class_ref (POPPLER_TYPE_FORM_BUTTON_TYPE),
+                                              poppler_form_field_button_get_button_type (field));
+               pgd_table_add_property (GTK_TABLE (table), "<b>Button Type:</b>", enum_value->value_name, &row);
+               pgd_table_add_property (GTK_TABLE (table), "<b>Button State:</b>",
+                                       poppler_form_field_button_get_state (field) ? "Active" : "Inactive", &row);
+               break;
+       case POPPLER_FORM_FIELD_TEXT:
+               enum_value = g_enum_get_value ((GEnumClass *) g_type_class_ref (POPPLER_TYPE_FORM_TEXT_TYPE),
+                                              poppler_form_field_text_get_text_type (field));
+               pgd_table_add_property (GTK_TABLE (table), "<b>Text Type:</b>", enum_value->value_name, &row);
+
+               text = poppler_form_field_text_get_text (field);
+               pgd_table_add_property (GTK_TABLE (table), "<b>Contents:</b>", text, &row);
+               g_free (text);
+
+               text = g_strdup_printf ("%d", poppler_form_field_text_get_max_len (field));
+               pgd_table_add_property (GTK_TABLE (table), "<b>Max Length:</b>", text, &row);
+               g_free (text);
+
+               pgd_table_add_property (GTK_TABLE (table), "<b>Do spellcheck:</b>",
+                                       poppler_form_field_text_do_spell_check (field) ? "Yes" : "No", &row);
+               pgd_table_add_property (GTK_TABLE (table), "<b>Do scroll:</b>",
+                                       poppler_form_field_text_do_scroll (field) ? "Yes" : "No", &row);
+               pgd_table_add_property (GTK_TABLE (table), "<b>Rich Text:</b>",
+                                       poppler_form_field_text_is_rich_text (field) ? "Yes" : "No", &row);
+               pgd_table_add_property (GTK_TABLE (table), "<b>Pasword type:</b>",
+                                       poppler_form_field_text_is_password (field) ? "Yes" : "No", &row);
+               break;
+       case POPPLER_FORM_FIELD_CHOICE: {
+               gchar *item;
+               gint   selected = -1;
+               
+               enum_value = g_enum_get_value ((GEnumClass *) g_type_class_ref (POPPLER_TYPE_FORM_CHOICE_TYPE),
+                                              poppler_form_field_choice_get_choice_type (field));
+               pgd_table_add_property (GTK_TABLE (table), "<b>Choice Type:</b>", enum_value->value_name, &row);
+               pgd_table_add_property (GTK_TABLE (table), "<b>Editable:</b>",
+                                       poppler_form_field_choice_is_editable (field) ? "Yes" : "No", &row);
+               pgd_table_add_property (GTK_TABLE (table), "<b>Multiple Selection:</b>",
+                                       poppler_form_field_choice_can_select_multiple (field) ? "Yes" : "No", &row);
+               pgd_table_add_property (GTK_TABLE (table), "<b>Do spellcheck:</b>",
+                                       poppler_form_field_choice_do_spell_check (field) ? "Yes" : "No", &row);
+               pgd_table_add_property (GTK_TABLE (table), "<b>Commit on Change:</b>",
+                                       poppler_form_field_choice_commit_on_change (field) ? "Yes" : "No", &row);
+
+               text = g_strdup_printf ("%d", poppler_form_field_choice_get_n_items (field));
+               pgd_table_add_property (GTK_TABLE (table), "<b>Number of items:</b>", text, &row);
+               g_free (text);
+
+               pgd_form_field_view_add_choice_items (GTK_TABLE (table), field, &selected, &row);
+
+               if (selected >= 0 && poppler_form_field_choice_get_n_items (field) > selected) {
+                       item = poppler_form_field_choice_get_item (field, selected);
+                       text = g_strdup_printf ("%d (%s)", selected, item);
+                       g_free (item);
+                       pgd_table_add_property (GTK_TABLE (table), "<b>Selected item:</b>", text, &row);
+                       g_free (text);
+               }
+
+               text = poppler_form_field_choice_get_text (field);
+               pgd_table_add_property (GTK_TABLE (table), "<b>Contents:</b>", text, &row);
+               g_free (text);
+       }
+               break;
+       case POPPLER_FORM_FIELD_SIGNATURE:
+       case POPPLER_FORM_FIELD_UNKNOWN:
+               break;
+       default:
+               g_assert_not_reached ();
+       }
+
+       gtk_container_add (GTK_CONTAINER (alignment), table);
+       gtk_widget_show (table);
+}
+
+const gchar *
+get_form_field_type (PopplerFormField *field)
+{
+       switch (poppler_form_field_get_field_type (field)) {
+       case POPPLER_FORM_FIELD_TEXT:
+               return "Text";
+       case POPPLER_FORM_FIELD_BUTTON:
+               return "Button";
+       case POPPLER_FORM_FIELD_CHOICE:
+               return "Choice";
+       case POPPLER_FORM_FIELD_SIGNATURE:
+               return "Signature";
+       case POPPLER_FORM_FIELD_UNKNOWN:
+       default:
+               break;
+       }
+
+       return "Unknown";
+}
+
+static void
+pgd_forms_get_form_fields (GtkWidget    *button,
+                          PgdFormsDemo *demo)
+{
+       PopplerPage *page;
+       GList       *mapping, *l;
+       gint         n_fields;
+       GTimer      *timer;
+       
+       gtk_list_store_clear (demo->model);
+       pgd_form_field_view_set_field (demo->field_view, NULL);
+
+       page = poppler_document_get_page (demo->doc, demo->page);
+       if (!page)
+               return;
+
+       timer = g_timer_new ();
+       mapping = poppler_page_get_form_field_mapping (page);
+       g_timer_stop (timer);
+
+       n_fields = g_list_length (mapping);
+       if (n_fields > 0) {
+               gchar *str;
+               
+               str = g_strdup_printf ("<i>%d form fields found in %.4f seconds</i>",
+                                      n_fields, g_timer_elapsed (timer, NULL));
+               gtk_label_set_markup (GTK_LABEL (demo->timer_label), str);
+               g_free (str);
+       } else {
+               gtk_label_set_markup (GTK_LABEL (demo->timer_label), "<i>No form fields found</i>");
+       }
+
+       g_timer_destroy (timer);
+
+       for (l = mapping; l; l = g_list_next (l)) {
+               PopplerFormFieldMapping *fmapping;
+               GtkTreeIter              iter;
+               gchar                   *x1, *y1, *x2, *y2;
+
+               fmapping = (PopplerFormFieldMapping *)l->data;
+
+               x1 = g_strdup_printf ("%.2f", fmapping->area.x1);
+               y1 = g_strdup_printf ("%.2f", fmapping->area.y1);
+               x2 = g_strdup_printf ("%.2f", fmapping->area.x2);
+               y2 = g_strdup_printf ("%.2f", fmapping->area.y2);
+
+               gtk_list_store_append (demo->model, &iter);
+               gtk_list_store_set (demo->model, &iter,
+                                   FORMS_FIELD_TYPE_COLUMN, get_form_field_type (fmapping->field),
+                                   FORMS_ID_COLUMN, poppler_form_field_get_id (fmapping->field),
+                                   FORMS_READ_ONLY_COLUMN, poppler_form_field_is_read_only (fmapping->field),
+                                   FORMS_X1_COLUMN, x1, 
+                                   FORMS_Y1_COLUMN, y1,
+                                   FORMS_X2_COLUMN, x2,
+                                   FORMS_Y2_COLUMN, y2,
+                                   FORMS_FIELD_COLUMN, fmapping->field,
+                                   -1);
+               g_free (x1);
+               g_free (y1);
+               g_free (x2);
+               g_free (y2);
+       }
+
+       poppler_page_free_form_field_mapping (mapping);
+       g_object_unref (page);
+}
+
+static void
+pgd_forms_page_selector_value_changed (GtkSpinButton *spinbutton,
+                                      PgdFormsDemo  *demo)
+{
+       demo->page = (gint)gtk_spin_button_get_value (spinbutton) - 1;
+}
+
+static void
+pgd_forms_selection_changed (GtkTreeSelection *treeselection,
+                            PgdFormsDemo     *demo)
+{
+       GtkTreeModel *model;
+       GtkTreeIter   iter;
+
+       if (gtk_tree_selection_get_selected (treeselection, &model, &iter)) {
+               PopplerFormField *field;
+
+               gtk_tree_model_get (model, &iter,
+                                   FORMS_FIELD_COLUMN, &field,
+                                   -1);
+               pgd_form_field_view_set_field (demo->field_view, field);
+               g_object_unref (field);
+       }
+}
+
+GtkWidget *
+pgd_forms_create_widget (PopplerDocument *document)
+{
+       PgdFormsDemo     *demo;
+       GtkWidget        *label;
+       GtkWidget        *vbox;
+       GtkWidget        *hbox, *page_selector;
+       GtkWidget        *button;
+       GtkWidget        *hpaned;
+       GtkWidget        *swindow, *treeview;
+       GtkTreeSelection *selection;
+       GtkCellRenderer  *renderer;
+       gchar            *str;
+       gint              n_pages;
+
+       demo = g_new0 (PgdFormsDemo, 1);
+       
+       demo->doc = g_object_ref (document);
+       
+       n_pages = poppler_document_get_n_pages (document);
+
+       vbox = gtk_vbox_new (FALSE, 12);
+
+       hbox = gtk_hbox_new (FALSE, 6);
+
+       label = gtk_label_new ("Page:");
+       gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, TRUE, 0);
+       gtk_widget_show (label);
+
+       page_selector = gtk_spin_button_new_with_range (1, n_pages, 1);
+       g_signal_connect (G_OBJECT (page_selector), "value-changed",
+                         G_CALLBACK (pgd_forms_page_selector_value_changed),
+                         (gpointer)demo);
+       gtk_box_pack_start (GTK_BOX (hbox), page_selector, FALSE, TRUE, 0);
+       gtk_widget_show (page_selector);
+
+       str = g_strdup_printf ("of %d", n_pages);
+       label = gtk_label_new (str);
+       gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, TRUE, 0);
+       gtk_widget_show (label);
+       g_free (str);
+
+       button = gtk_button_new_with_label ("Get Forms Fields");
+       g_signal_connect (G_OBJECT (button), "clicked",
+                         G_CALLBACK (pgd_forms_get_form_fields),
+                         (gpointer)demo);
+       gtk_box_pack_end (GTK_BOX (hbox), button, FALSE, FALSE, 0);
+       gtk_widget_show (button);
+
+       gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, TRUE, 0);
+       gtk_widget_show (hbox);
+
+       demo->timer_label = gtk_label_new (NULL);
+       gtk_label_set_markup (GTK_LABEL (demo->timer_label), "<i>No form fields found</i>");
+       g_object_set (G_OBJECT (demo->timer_label), "xalign", 1.0, NULL);
+       gtk_box_pack_start (GTK_BOX (vbox), demo->timer_label, FALSE, TRUE, 0);
+       gtk_widget_show (demo->timer_label);
+
+       hpaned = gtk_hpaned_new ();
+
+       demo->field_view = pgd_form_field_view_new ();
+
+       swindow = gtk_scrolled_window_new (NULL, NULL);
+       gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (swindow),
+                                       GTK_POLICY_AUTOMATIC,
+                                       GTK_POLICY_AUTOMATIC);
+       
+       demo->model = gtk_list_store_new (N_COLUMNS, G_TYPE_STRING,
+                                         G_TYPE_INT, G_TYPE_BOOLEAN,
+                                         G_TYPE_STRING,
+                                         G_TYPE_STRING, G_TYPE_STRING,
+                                         G_TYPE_STRING, G_TYPE_OBJECT);
+       treeview = gtk_tree_view_new_with_model (GTK_TREE_MODEL (demo->model));
+
+       renderer = gtk_cell_renderer_text_new ();
+       gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (treeview),
+                                                    0, "Form Field Type",
+                                                    renderer,
+                                                    "text", FORMS_FIELD_TYPE_COLUMN,
+                                                    NULL);
+       
+       renderer = gtk_cell_renderer_text_new ();
+       gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (treeview),
+                                                    1, "Form Field Id",
+                                                    renderer,
+                                                    "text", FORMS_ID_COLUMN,
+                                                    NULL);
+       
+       renderer = gtk_cell_renderer_toggle_new ();
+       gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (treeview),
+                                                    2, "Read Only",
+                                                    renderer,
+                                                    "active", FORMS_READ_ONLY_COLUMN,
+                                                    NULL);
+
+       renderer = gtk_cell_renderer_text_new ();
+       gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (treeview),
+                                                    3, "X1",
+                                                    renderer,
+                                                    "text", FORMS_X1_COLUMN,
+                                                    NULL);
+       renderer = gtk_cell_renderer_text_new ();
+       gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (treeview),
+                                                    4, "Y1",
+                                                    renderer,
+                                                    "text", FORMS_Y1_COLUMN,
+                                                    NULL);
+       renderer = gtk_cell_renderer_text_new ();
+       gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (treeview),
+                                                    5, "X2",
+                                                    renderer,
+                                                    "text", FORMS_X2_COLUMN,
+                                                    NULL);
+       renderer = gtk_cell_renderer_text_new ();
+       gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (treeview),
+                                                    6, "Y2",
+                                                    renderer,
+                                                    "text", FORMS_Y2_COLUMN,
+                                                    NULL);
+       
+       selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (treeview));
+       g_signal_connect (G_OBJECT (selection), "changed",
+                         G_CALLBACK (pgd_forms_selection_changed),
+                         (gpointer)demo);
+
+       gtk_container_add (GTK_CONTAINER (swindow), treeview);
+       gtk_widget_show (treeview);
+
+       gtk_paned_add1 (GTK_PANED (hpaned), swindow);
+       gtk_widget_show (swindow);
+
+       gtk_paned_add2 (GTK_PANED (hpaned), demo->field_view);
+       gtk_widget_show (demo->field_view);
+
+       gtk_paned_set_position (GTK_PANED (hpaned), 300);
+
+       gtk_box_pack_start (GTK_BOX (vbox), hpaned, TRUE, TRUE, 0);
+       gtk_widget_show (hpaned);
+
+       g_object_weak_ref (G_OBJECT (vbox),
+                          (GWeakNotify)pgd_forms_free,
+                          demo);
+       
+       return vbox;
+}
diff --git a/glib/demo/forms.h b/glib/demo/forms.h
new file mode 100644 (file)
index 0000000..5b793bd
--- /dev/null
@@ -0,0 +1,31 @@
+/*
+ * Copyright (C) 2007 Carlos Garcia Campos  <carlosgc@gnome.org>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include <gtk/gtk.h>
+#include <poppler.h>
+
+#ifndef _FORMS_H_
+#define _FORMS_H_
+
+G_BEGIN_DECLS
+
+GtkWidget *pgd_forms_create_widget (PopplerDocument *document);
+
+G_END_DECLS
+
+#endif /* _FORMS_H_ */
diff --git a/glib/demo/images.c b/glib/demo/images.c
new file mode 100644 (file)
index 0000000..6e987d2
--- /dev/null
@@ -0,0 +1,340 @@
+/*
+ * Copyright (C) 2008 Carlos Garcia Campos  <carlosgc@gnome.org>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include "config.h"
+
+#include <gtk/gtk.h>
+
+#include "images.h"
+
+enum {
+       IMAGES_ID_COLUMN,
+       IMAGES_X1_COLUMN,
+       IMAGES_Y1_COLUMN,
+       IMAGES_X2_COLUMN,
+       IMAGES_Y2_COLUMN,
+       N_COLUMNS
+};
+
+typedef struct {
+       PopplerDocument *doc;
+
+       GtkListStore    *model;
+       GtkWidget       *timer_label;
+       GtkWidget       *image_view;
+
+       gint             page;
+} PgdImagesDemo;
+
+static void
+pgd_images_free (PgdImagesDemo *demo)
+{
+       if (!demo)
+               return;
+
+       if (demo->doc) {
+               g_object_unref (demo->doc);
+               demo->doc = NULL;
+       }
+
+       if (demo->model) {
+               g_object_unref (demo->model);
+               demo->model = NULL;
+       }
+
+       g_free (demo);
+}
+
+static gboolean
+pgd_image_view_drawing_area_expose (GtkWidget      *area,
+                                   GdkEventExpose *event,
+                                   GtkWidget      *image_view)
+{
+       cairo_t         *cr;
+       cairo_surface_t *image;
+
+       image = g_object_get_data (G_OBJECT (image_view), "image-surface");
+       if (!image)
+               return FALSE;
+
+       gtk_widget_set_size_request (area,
+                                    cairo_image_surface_get_width (image),
+                                    cairo_image_surface_get_height (image));
+       
+       cr = gdk_cairo_create (gtk_widget_get_window (area));
+       cairo_set_source_surface (cr, image, 0, 0);
+       cairo_paint (cr);
+       cairo_destroy (cr);
+
+       return TRUE;
+}
+
+static GtkWidget *
+pgd_image_view_new ()
+{
+       GtkWidget *swindow;
+       GtkWidget *darea;
+
+       swindow = gtk_scrolled_window_new (NULL, NULL);
+       
+       darea = gtk_drawing_area_new ();
+       g_signal_connect (G_OBJECT (darea), "expose_event",
+                         G_CALLBACK (pgd_image_view_drawing_area_expose),
+                         (gpointer)swindow);
+       gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (swindow),
+                                       GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
+       gtk_scrolled_window_add_with_viewport (GTK_SCROLLED_WINDOW (swindow),
+                                              darea);
+       gtk_widget_show (darea);
+
+       return swindow;
+}
+
+static void
+pgd_image_view_set_image (GtkWidget       *image_view,
+                         cairo_surface_t *image)
+{
+       g_object_set_data_full (G_OBJECT (image_view), "image-surface",
+                               image,
+                               (GDestroyNotify)cairo_surface_destroy);
+       gtk_widget_queue_draw (image_view);
+}
+
+static void
+pgd_images_get_images (GtkWidget     *button,
+                      PgdImagesDemo *demo)
+{
+       PopplerPage *page;
+       GList       *mapping, *l;
+       gint         n_images;
+       GTimer      *timer;
+       
+       gtk_list_store_clear (demo->model);
+       pgd_image_view_set_image (demo->image_view, NULL);
+
+       page = poppler_document_get_page (demo->doc, demo->page);
+       if (!page)
+               return;
+
+       timer = g_timer_new ();
+       mapping = poppler_page_get_image_mapping (page);
+       g_timer_stop (timer);
+
+       n_images = g_list_length (mapping);
+       if (n_images > 0) {
+               gchar *str;
+               
+               str = g_strdup_printf ("<i>%d images found in %.4f seconds</i>",
+                                      n_images, g_timer_elapsed (timer, NULL));
+               gtk_label_set_markup (GTK_LABEL (demo->timer_label), str);
+               g_free (str);
+       } else {
+               gtk_label_set_markup (GTK_LABEL (demo->timer_label), "<i>No images found</i>");
+       }
+
+       g_timer_destroy (timer);
+
+       for (l = mapping; l; l = g_list_next (l)) {
+               PopplerImageMapping *imapping;
+               GtkTreeIter          iter;
+               gchar               *x1, *y1, *x2, *y2;
+
+               imapping = (PopplerImageMapping *)l->data;
+
+               x1 = g_strdup_printf ("%.2f", imapping->area.x1);
+               y1 = g_strdup_printf ("%.2f", imapping->area.y1);
+               x2 = g_strdup_printf ("%.2f", imapping->area.x2);
+               y2 = g_strdup_printf ("%.2f", imapping->area.y2);
+
+               gtk_list_store_append (demo->model, &iter);
+               gtk_list_store_set (demo->model, &iter,
+                                   IMAGES_ID_COLUMN, imapping->image_id,
+                                   IMAGES_X1_COLUMN, x1, 
+                                   IMAGES_Y1_COLUMN, y1,
+                                   IMAGES_X2_COLUMN, x2,
+                                   IMAGES_Y2_COLUMN, y2,
+                                   -1);
+               g_free (x1);
+               g_free (y1);
+               g_free (x2);
+               g_free (y2);
+       }
+
+       poppler_page_free_image_mapping (mapping);
+       g_object_unref (page);
+}
+
+static void
+pgd_images_page_selector_value_changed (GtkSpinButton *spinbutton,
+                                       PgdImagesDemo *demo)
+{
+       demo->page = (gint)gtk_spin_button_get_value (spinbutton) - 1;
+}
+
+static void
+pgd_images_selection_changed (GtkTreeSelection *treeselection,
+                             PgdImagesDemo    *demo)
+{
+       GtkTreeModel *model;
+       GtkTreeIter   iter;
+
+       if (gtk_tree_selection_get_selected (treeselection, &model, &iter)) {
+               PopplerPage *page;
+               gint         image_id;
+
+               gtk_tree_model_get (model, &iter,
+                                   IMAGES_ID_COLUMN, &image_id,
+                                   -1);
+               page = poppler_document_get_page (demo->doc, demo->page);
+               pgd_image_view_set_image (demo->image_view,
+                                         poppler_page_get_image (page, image_id));
+               g_object_unref (page);
+                                         
+       }
+}
+
+GtkWidget *
+pgd_images_create_widget (PopplerDocument *document)
+{
+       PgdImagesDemo    *demo;
+       GtkWidget        *label;
+       GtkWidget        *vbox;
+       GtkWidget        *hbox, *page_selector;
+       GtkWidget        *button;
+       GtkWidget        *hpaned;
+       GtkWidget        *swindow, *treeview;
+       GtkTreeSelection *selection;
+       GtkCellRenderer  *renderer;
+       gchar            *str;
+       gint              n_pages;
+
+       demo = g_new0 (PgdImagesDemo, 1);
+       
+       demo->doc = g_object_ref (document);
+       
+       n_pages = poppler_document_get_n_pages (document);
+
+       vbox = gtk_vbox_new (FALSE, 12);
+
+       hbox = gtk_hbox_new (FALSE, 6);
+
+       label = gtk_label_new ("Page:");
+       gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, TRUE, 0);
+       gtk_widget_show (label);
+
+       page_selector = gtk_spin_button_new_with_range (1, n_pages, 1);
+       g_signal_connect (G_OBJECT (page_selector), "value-changed",
+                         G_CALLBACK (pgd_images_page_selector_value_changed),
+                         (gpointer)demo);
+       gtk_box_pack_start (GTK_BOX (hbox), page_selector, FALSE, TRUE, 0);
+       gtk_widget_show (page_selector);
+
+       str = g_strdup_printf ("of %d", n_pages);
+       label = gtk_label_new (str);
+       gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, TRUE, 0);
+       gtk_widget_show (label);
+       g_free (str);
+
+       button = gtk_button_new_with_label ("Get Images");
+       g_signal_connect (G_OBJECT (button), "clicked",
+                         G_CALLBACK (pgd_images_get_images),
+                         (gpointer)demo);
+       gtk_box_pack_end (GTK_BOX (hbox), button, FALSE, FALSE, 0);
+       gtk_widget_show (button);
+
+       gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, TRUE, 0);
+       gtk_widget_show (hbox);
+
+       demo->timer_label = gtk_label_new (NULL);
+       gtk_label_set_markup (GTK_LABEL (demo->timer_label), "<i>No images found</i>");
+       g_object_set (G_OBJECT (demo->timer_label), "xalign", 1.0, NULL);
+       gtk_box_pack_start (GTK_BOX (vbox), demo->timer_label, FALSE, TRUE, 0);
+       gtk_widget_show (demo->timer_label);
+
+       hpaned = gtk_hpaned_new ();
+
+       demo->image_view = pgd_image_view_new ();
+
+       swindow = gtk_scrolled_window_new (NULL, NULL);
+       gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (swindow),
+                                       GTK_POLICY_AUTOMATIC,
+                                       GTK_POLICY_AUTOMATIC);
+       
+       demo->model = gtk_list_store_new (N_COLUMNS, G_TYPE_INT,
+                                         G_TYPE_STRING, G_TYPE_STRING,
+                                         G_TYPE_STRING, G_TYPE_STRING);
+       treeview = gtk_tree_view_new_with_model (GTK_TREE_MODEL (demo->model));
+
+       renderer = gtk_cell_renderer_text_new ();
+       renderer = gtk_cell_renderer_text_new ();
+       gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (treeview),
+                                                    0, "Image",
+                                                    renderer,
+                                                    "text", IMAGES_ID_COLUMN,
+                                                    NULL);
+       
+       renderer = gtk_cell_renderer_text_new ();
+       gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (treeview),
+                                                    1, "X1",
+                                                    renderer,
+                                                    "text", IMAGES_X1_COLUMN,
+                                                    NULL);
+       renderer = gtk_cell_renderer_text_new ();
+       gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (treeview),
+                                                    2, "Y1",
+                                                    renderer,
+                                                    "text", IMAGES_Y1_COLUMN,
+                                                    NULL);
+       renderer = gtk_cell_renderer_text_new ();
+       gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (treeview),
+                                                    3, "X2",
+                                                    renderer,
+                                                    "text", IMAGES_X2_COLUMN,
+                                                    NULL);
+       renderer = gtk_cell_renderer_text_new ();
+       gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (treeview),
+                                                    4, "Y2",
+                                                    renderer,
+                                                    "text", IMAGES_Y2_COLUMN,
+                                                    NULL);
+       
+       selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (treeview));
+       g_signal_connect (G_OBJECT (selection), "changed",
+                         G_CALLBACK (pgd_images_selection_changed),
+                         (gpointer)demo);
+
+       gtk_container_add (GTK_CONTAINER (swindow), treeview);
+       gtk_widget_show (treeview);
+
+       gtk_paned_add1 (GTK_PANED (hpaned), swindow);
+       gtk_widget_show (swindow);
+
+       gtk_paned_add2 (GTK_PANED (hpaned), demo->image_view);
+       gtk_widget_show (demo->image_view);
+
+       gtk_paned_set_position (GTK_PANED (hpaned), 300);
+
+       gtk_box_pack_start (GTK_BOX (vbox), hpaned, TRUE, TRUE, 0);
+       gtk_widget_show (hpaned);
+
+       g_object_weak_ref (G_OBJECT (vbox),
+                          (GWeakNotify)pgd_images_free,
+                          demo);
+       
+       return vbox;
+}
diff --git a/glib/demo/images.h b/glib/demo/images.h
new file mode 100644 (file)
index 0000000..6180c3b
--- /dev/null
@@ -0,0 +1,31 @@
+/*
+ * Copyright (C) 2008 Carlos Garcia Campos  <carlosgc@gnome.org>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include <gtk/gtk.h>
+#include <poppler.h>
+
+#ifndef _IMAGES_H_
+#define _IMAGES_H_
+
+G_BEGIN_DECLS
+
+GtkWidget *pgd_images_create_widget (PopplerDocument *document);
+
+G_END_DECLS
+
+#endif /* _IMAGES_H_ */
diff --git a/glib/demo/info.cc b/glib/demo/info.cc
new file mode 100644 (file)
index 0000000..e05cc15
--- /dev/null
@@ -0,0 +1,274 @@
+/*
+ * Copyright (C) 2007 Carlos Garcia Campos  <carlosgc@gnome.org>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include <gtk/gtk.h>
+
+#include "config.h"
+#include "info.h"
+#include "utils.h"
+
+static void
+pgd_info_add_permissions (GtkTable           *table,
+                         PopplerPermissions  permissions,
+                         gint               *row)
+{
+       GtkWidget *label, *hbox, *vbox;
+       GtkWidget *checkbox;
+
+       label = gtk_label_new (NULL);
+       g_object_set (G_OBJECT (label), "xalign", 0.0, NULL);
+       gtk_label_set_markup (GTK_LABEL (label), "<b>Permissions:</b>");
+       gtk_table_attach (GTK_TABLE (table), label, 0, 1, *row, *row + 1,
+                         GTK_FILL, GTK_FILL, 0, 0);
+       gtk_widget_show (label);
+
+        vbox = gtk_vbox_new (FALSE, 0);
+       hbox = gtk_hbox_new (FALSE, 6);
+
+       checkbox = gtk_check_button_new_with_label ("Print");
+       gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (checkbox),
+                                     (permissions & POPPLER_PERMISSIONS_OK_TO_PRINT));
+       gtk_box_pack_start (GTK_BOX (hbox), checkbox, FALSE, TRUE, 0);
+       gtk_widget_show (checkbox);
+       
+       checkbox = gtk_check_button_new_with_label ("Copy");
+       gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (checkbox),
+                                     (permissions & POPPLER_PERMISSIONS_OK_TO_COPY));
+       gtk_box_pack_start (GTK_BOX (hbox), checkbox, FALSE, TRUE, 0);
+       gtk_widget_show (checkbox);
+       
+       checkbox = gtk_check_button_new_with_label ("Modify");
+       gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (checkbox),
+                                     (permissions & POPPLER_PERMISSIONS_OK_TO_MODIFY));
+       gtk_box_pack_start (GTK_BOX (hbox), checkbox, FALSE, TRUE, 0);
+       gtk_widget_show (checkbox);
+       
+       checkbox = gtk_check_button_new_with_label ("Add notes");
+       gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (checkbox),
+                                     (permissions & POPPLER_PERMISSIONS_OK_TO_ADD_NOTES));
+       gtk_box_pack_start (GTK_BOX (hbox), checkbox, FALSE, TRUE, 0);
+       gtk_widget_show (checkbox);
+
+        checkbox = gtk_check_button_new_with_label ("Fill forms");
+        gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (checkbox),
+                                      (permissions & POPPLER_PERMISSIONS_OK_TO_FILL_FORM));
+        gtk_box_pack_start (GTK_BOX (hbox), checkbox, FALSE, TRUE, 0);
+        gtk_widget_show (checkbox);
+
+        gtk_box_pack_start (GTK_BOX(vbox), hbox, FALSE, TRUE, 0);
+        gtk_widget_show (hbox);
+
+        hbox = gtk_hbox_new (FALSE, 6);
+
+        checkbox = gtk_check_button_new_with_label ("Extract contents");
+        gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (checkbox),
+                                      (permissions & POPPLER_PERMISSIONS_OK_TO_EXTRACT_CONTENTS));
+        gtk_box_pack_start (GTK_BOX (hbox), checkbox, FALSE, TRUE, 0);
+        gtk_widget_show (checkbox);
+
+        checkbox = gtk_check_button_new_with_label ("Assemble");
+        gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (checkbox),
+                                      (permissions & POPPLER_PERMISSIONS_OK_TO_ASSEMBLE));
+        gtk_box_pack_start (GTK_BOX (hbox), checkbox, FALSE, TRUE, 0);
+        gtk_widget_show (checkbox);
+
+        checkbox = gtk_check_button_new_with_label ("Print at high resolution");
+        gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (checkbox),
+                                      (permissions & POPPLER_PERMISSIONS_OK_TO_PRINT_HIGH_RESOLUTION));
+        gtk_box_pack_start (GTK_BOX (hbox), checkbox, FALSE, TRUE, 0);
+        gtk_widget_show (checkbox);
+
+        gtk_box_pack_start (GTK_BOX(vbox), hbox, FALSE, TRUE, 0);
+        gtk_widget_show (hbox);
+
+       gtk_table_attach (GTK_TABLE (table), vbox, 1, 2, *row, *row + 1,
+                         GTK_FILL, GTK_FILL, 0, 0);
+       gtk_widget_show (vbox);
+       
+       *row += 1;
+}
+
+static void
+pgd_info_add_metadata (GtkTable    *table,
+                      const gchar *metadata,
+                      gint        *row)
+{
+       GtkWidget     *label;
+       GtkWidget     *textview, *swindow;
+       GtkTextBuffer *buffer;
+
+       label = gtk_label_new (NULL);
+       g_object_set (G_OBJECT (label), "xalign", 0.0, NULL);
+       gtk_label_set_markup (GTK_LABEL (label), "<b>Metadata:</b>");
+       gtk_table_attach (GTK_TABLE (table), label, 0, 1, *row, *row + 1,
+                         GTK_FILL, GTK_FILL, 0, 0);
+       gtk_widget_show (label);
+
+       swindow = gtk_scrolled_window_new (NULL, NULL);
+       gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (swindow),
+                                       GTK_POLICY_AUTOMATIC,
+                                       GTK_POLICY_AUTOMATIC);
+
+       textview = gtk_text_view_new ();
+       gtk_text_view_set_editable (GTK_TEXT_VIEW (textview), FALSE);
+       buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (textview));
+       if (metadata)
+               gtk_text_buffer_set_text (buffer, metadata, -1);
+
+       gtk_container_add (GTK_CONTAINER (swindow), textview);
+       gtk_widget_show (textview);
+       
+       gtk_table_attach (GTK_TABLE (table), swindow, 1, 2, *row, *row + 1,
+                         (GtkAttachOptions)(GTK_EXPAND | GTK_FILL),
+                         (GtkAttachOptions)(GTK_EXPAND | GTK_FILL), 0, 0);
+       gtk_widget_show (swindow); 
+       
+       *row += 1;
+}
+
+GtkWidget *
+pgd_info_create_widget (PopplerDocument *document)
+{
+       GtkWidget *vbox;
+       GtkWidget *label;
+       GtkWidget *frame, *alignment, *table;
+       gchar     *str;
+       gchar     *title, *format, *author, *subject;
+       gchar     *keywords, *creator, *producer;
+       gchar     *metadata;
+       gchar     *perm_id;
+       gchar     *up_id;
+       gboolean   linearized;
+       GTime      creation_date, mod_date;
+       GEnumValue *enum_value;
+       PopplerBackend backend;
+       PopplerPageLayout layout;
+       PopplerPageMode mode;
+       PopplerPermissions permissions;
+       PopplerViewerPreferences view_prefs;
+       gint row = 0;
+
+       g_object_get (document,
+                     "title", &title,
+                     "format", &format,
+                     "author", &author,
+                     "subject", &subject,
+                     "keywords", &keywords,
+                     "creation-date", &creation_date,
+                     "mod-date", &mod_date,
+                     "creator", &creator,
+                     "producer", &producer,
+                     "linearized", &linearized,
+                     "page-mode", &mode,
+                     "page-layout", &layout,
+                     "permissions", &permissions,
+                     "viewer-preferences", &view_prefs,
+                     "metadata", &metadata,
+                     NULL);
+       
+       vbox = gtk_vbox_new (FALSE, 12);
+
+       backend = poppler_get_backend ();
+       enum_value = g_enum_get_value ((GEnumClass *) g_type_class_ref (POPPLER_TYPE_BACKEND), backend);
+       str = g_strdup_printf ("<span weight='bold' size='larger'>Poppler %s (%s)</span>",
+                              poppler_get_version (), enum_value->value_name);
+       label = gtk_label_new (NULL);
+       gtk_label_set_markup (GTK_LABEL (label), str);
+       g_free (str);
+       gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, TRUE, 12);
+       gtk_widget_show (label);
+
+       frame = gtk_frame_new (NULL);
+       gtk_frame_set_shadow_type (GTK_FRAME (frame), GTK_SHADOW_NONE);
+       label = gtk_label_new (NULL);
+       gtk_label_set_markup (GTK_LABEL (label), "<b>Document properties</b>");
+       gtk_frame_set_label_widget (GTK_FRAME (frame), label);
+       gtk_widget_show (label);
+       
+       alignment = gtk_alignment_new (0.5, 0.5, 1, 1);
+       gtk_alignment_set_padding (GTK_ALIGNMENT (alignment), 5, 5, 12, 5);
+       gtk_container_add (GTK_CONTAINER (frame), alignment);
+       gtk_widget_show (alignment);
+
+       table = gtk_table_new (14, 2, FALSE);
+       gtk_table_set_col_spacings (GTK_TABLE (table), 6);
+       gtk_table_set_row_spacings (GTK_TABLE (table), 6);
+
+       pgd_table_add_property (GTK_TABLE (table), "<b>Format:</b>", format, &row);
+       g_free (format);
+       
+       pgd_table_add_property (GTK_TABLE (table), "<b>Title:</b>", title, &row);
+       g_free (title);
+       
+       pgd_table_add_property (GTK_TABLE (table), "<b>Author:</b>", author, &row);
+       g_free (author);
+       
+       pgd_table_add_property (GTK_TABLE (table), "<b>Subject:</b>", subject, &row);
+       g_free (subject);
+       
+       pgd_table_add_property (GTK_TABLE (table), "<b>Keywords:</b>", keywords, &row);
+       g_free (keywords);
+       
+       pgd_table_add_property (GTK_TABLE (table), "<b>Creator:</b>", creator, &row);
+       g_free (creator);
+       
+       pgd_table_add_property (GTK_TABLE (table), "<b>Producer:</b>", producer, &row);
+       g_free (producer);
+       
+       pgd_table_add_property (GTK_TABLE (table), "<b>Linearized:</b>", linearized ? "Yes" : "No", &row);
+
+       str = pgd_format_date (creation_date);
+       pgd_table_add_property (GTK_TABLE (table), "<b>Creation Date:</b>", str, &row);
+       g_free (str);
+
+       str = pgd_format_date (mod_date);
+       pgd_table_add_property (GTK_TABLE (table), "<b>Modification Date:</b>", str, &row);
+       g_free (str);
+
+       enum_value = g_enum_get_value ((GEnumClass *) g_type_class_peek (POPPLER_TYPE_PAGE_MODE), mode);
+       pgd_table_add_property (GTK_TABLE (table), "<b>Page Mode:</b>", enum_value->value_name, &row);
+
+       enum_value = g_enum_get_value ((GEnumClass *) g_type_class_peek (POPPLER_TYPE_PAGE_LAYOUT), layout);
+       pgd_table_add_property (GTK_TABLE (table), "<b>Page Layout:</b>", enum_value->value_name, &row);
+
+       if (poppler_document_get_id (document, &perm_id, &up_id)) {
+               str = g_strndup (perm_id, 32);
+               g_free (perm_id);
+               pgd_table_add_property (GTK_TABLE (table), "<b>Permanent ID:</b>", str, &row);
+               g_free (str);
+               str = g_strndup (up_id, 32);
+               g_free (up_id);
+               pgd_table_add_property (GTK_TABLE (table), "<b>Update ID:</b>", str, &row);
+               g_free (str);
+       }
+
+       pgd_info_add_permissions (GTK_TABLE (table), permissions, &row);
+
+       pgd_info_add_metadata (GTK_TABLE (table), metadata, &row);
+       g_free (metadata);
+
+       /* TODO: view_prefs */
+
+       gtk_container_add (GTK_CONTAINER (alignment), table);
+       gtk_widget_show (table);
+
+       gtk_box_pack_start (GTK_BOX (vbox), frame, TRUE, TRUE, 0);
+       gtk_widget_show (frame);
+
+       return vbox;
+}
diff --git a/glib/demo/info.h b/glib/demo/info.h
new file mode 100644 (file)
index 0000000..a8b34d4
--- /dev/null
@@ -0,0 +1,31 @@
+/*
+ * Copyright (C) 2007 Carlos Garcia Campos  <carlosgc@gnome.org>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include <gtk/gtk.h>
+#include <poppler.h>
+
+#ifndef _INFO_H_
+#define _INFO_H_
+
+G_BEGIN_DECLS
+
+GtkWidget *pgd_info_create_widget (PopplerDocument *document);
+
+G_END_DECLS
+
+#endif /* _INFO_H_ */ 
diff --git a/glib/demo/layers.c b/glib/demo/layers.c
new file mode 100644 (file)
index 0000000..fc0ba35
--- /dev/null
@@ -0,0 +1,448 @@
+/*
+ * Copyright (C) 2008 Carlos Garcia Campos  <carlosgc@gnome.org>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include "config.h"
+
+#include <gtk/gtk.h>
+
+#include "layers.h"
+
+enum {
+       LAYERS_TITLE_COLUMN,
+       LAYERS_VISIBILITY_COLUMN,
+       LAYERS_ENABLE_COLUMN,
+       LAYERS_SHOWTOGGLE_COLUMN,
+       LAYERS_RB_GROUP_COLUMN,
+       LAYERS_LAYER_COLUMN,
+       N_COLUMNS
+};
+
+typedef struct {
+       PopplerDocument *doc;
+       guint            page;
+       GtkWidget       *treeview;
+       GtkWidget       *darea;
+
+       cairo_surface_t *surface;
+} PgdLayersDemo;
+
+static void
+pgd_layers_free (PgdLayersDemo *demo)
+{
+       if (!demo)
+               return;
+
+       if (demo->doc) {
+               g_object_unref (demo->doc);
+               demo->doc = NULL;
+       }
+
+       if (demo->surface) {
+               cairo_surface_destroy (demo->surface);
+               demo->surface = NULL;
+       }
+
+       g_free (demo);
+}
+
+static void
+build_tree (PopplerDocument   *document,
+           GtkTreeModel      *model,
+           GtkTreeIter       *parent,
+           PopplerLayersIter *iter)
+{
+
+       do {
+               GtkTreeIter        tree_iter;
+               PopplerLayersIter *child;
+               PopplerLayer      *layer;
+               gboolean           visible;
+               gchar             *markup;
+               gint               rb_group = 0;
+
+               layer = poppler_layers_iter_get_layer (iter);
+               if (layer) {
+                       markup = g_markup_escape_text (poppler_layer_get_title (layer), -1);
+                       visible = poppler_layer_is_visible (layer);
+                       rb_group = poppler_layer_get_radio_button_group_id (layer);
+               } else {
+                       gchar *title;
+
+                       title = poppler_layers_iter_get_title (iter);
+                       markup = g_markup_escape_text (title, -1);
+                       g_free (title);
+
+                       visible = FALSE;
+                       layer = NULL;
+               }
+
+               gtk_tree_store_append (GTK_TREE_STORE (model), &tree_iter, parent);
+               gtk_tree_store_set (GTK_TREE_STORE (model), &tree_iter,
+                                   LAYERS_TITLE_COLUMN, markup,
+                                   LAYERS_VISIBILITY_COLUMN, visible,
+                                   LAYERS_ENABLE_COLUMN, TRUE, /* FIXME */
+                                   LAYERS_SHOWTOGGLE_COLUMN, (layer != NULL),
+                                   LAYERS_RB_GROUP_COLUMN, rb_group,
+                                   LAYERS_LAYER_COLUMN, layer,
+                                   -1);
+               if (layer)
+                       g_object_unref (layer);
+               g_free (markup);
+
+               child = poppler_layers_iter_get_child (iter);
+               if (child)
+                       build_tree (document, model, &tree_iter, child);
+               poppler_layers_iter_free (child);
+       } while (poppler_layers_iter_next (iter));
+}
+
+GtkTreeModel *
+pgd_layers_create_model (PopplerDocument *document)
+{
+       GtkTreeModel     *model;
+       PopplerLayersIter *iter;
+
+       iter = poppler_layers_iter_new (document);
+       if (iter) {
+               model = GTK_TREE_MODEL (
+                       gtk_tree_store_new (N_COLUMNS,
+                                           G_TYPE_STRING, 
+                                           G_TYPE_BOOLEAN,
+                                           G_TYPE_BOOLEAN,
+                                           G_TYPE_BOOLEAN,
+                                           G_TYPE_INT,
+                                           G_TYPE_OBJECT));
+               build_tree (document, model, NULL, iter);
+               poppler_layers_iter_free (iter);
+       } else {
+               GtkTreeIter tree_iter;
+               gchar      *markup;
+               
+               model = GTK_TREE_MODEL (gtk_list_store_new (1, G_TYPE_STRING));
+               gtk_list_store_append (GTK_LIST_STORE (model), &tree_iter);
+               markup = g_strdup_printf ("<span size=\"larger\" style=\"italic\">%s</span>",
+                                         "The document doesn't contain layers");
+               gtk_list_store_set (GTK_LIST_STORE (model), &tree_iter,
+                                   0, markup, -1);
+               g_free (markup);
+       }
+
+       return model;
+}
+
+static cairo_surface_t *
+pgd_layers_render_page (PgdLayersDemo *demo)
+{
+       cairo_t *cr;
+       PopplerPage *page;
+       gdouble width, height;
+       cairo_surface_t *surface = NULL;
+
+       page = poppler_document_get_page (demo->doc, demo->page);
+       if (!page)
+               return NULL;
+
+       poppler_page_get_size (page, &width, &height);
+       gtk_widget_set_size_request (demo->darea, width, height);
+       
+       surface = cairo_image_surface_create (CAIRO_FORMAT_RGB24,
+                                             width, height);
+       cr = cairo_create (surface);
+
+       cairo_save (cr);
+       cairo_set_source_rgb (cr, 1, 1, 1);
+       cairo_rectangle (cr, 0, 0, width, height);
+       cairo_fill (cr);
+       cairo_restore (cr);
+
+       cairo_save (cr);
+       poppler_page_render (page, cr);
+       cairo_restore (cr);
+       
+       cairo_destroy (cr);
+       g_object_unref (page);
+
+       return surface;
+}
+
+static gboolean
+pgd_layers_viewer_drawing_area_expose (GtkWidget      *area,
+                                      GdkEventExpose *event,
+                                      PgdLayersDemo  *demo)
+{
+       cairo_t *cr;
+       
+       if (!demo->surface) {
+               demo->surface = pgd_layers_render_page (demo);
+               if (!demo->surface)
+                       return FALSE;
+       }
+
+       gdk_window_clear (gtk_widget_get_window (area));
+
+       cr = gdk_cairo_create (gtk_widget_get_window (area));
+       cairo_set_source_surface (cr, demo->surface, 0, 0);
+       cairo_paint (cr);
+       cairo_destroy (cr);
+
+       return TRUE;
+}
+
+static gboolean
+pgd_layers_viewer_redraw (PgdLayersDemo *demo)
+{
+       cairo_surface_destroy (demo->surface);
+       demo->surface = NULL;
+
+       gtk_widget_queue_draw (demo->darea);
+
+       return FALSE;
+}
+
+static void
+pgd_layers_viewer_queue_redraw (PgdLayersDemo *demo)
+{
+       g_idle_add ((GSourceFunc)pgd_layers_viewer_redraw, demo);
+}
+
+static void
+pgd_layers_page_selector_value_changed (GtkSpinButton *spinbutton,
+                                       PgdLayersDemo *demo)
+{
+       demo->page = (gint)gtk_spin_button_get_value (spinbutton) - 1;
+       pgd_layers_viewer_queue_redraw (demo);
+}
+
+static GtkWidget *
+pgd_layers_create_viewer (PgdLayersDemo *demo)
+{
+       GtkWidget *vbox, *hbox;
+       GtkWidget *label;
+       GtkWidget *swindow;
+       GtkWidget *page_selector;
+       guint      n_pages;
+       gchar     *str;
+
+       vbox = gtk_vbox_new (FALSE, 6);
+
+       hbox = gtk_hbox_new (FALSE, 6);
+
+       label = gtk_label_new ("Page:");
+       gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, TRUE, 0);
+       gtk_widget_show (label);
+
+       n_pages = poppler_document_get_n_pages (demo->doc);
+       page_selector = gtk_spin_button_new_with_range (1, n_pages, 1);
+       g_signal_connect (G_OBJECT (page_selector), "value-changed",
+                         G_CALLBACK (pgd_layers_page_selector_value_changed),
+                         (gpointer)demo);
+       gtk_box_pack_start (GTK_BOX (hbox), page_selector, FALSE, TRUE, 0);
+       gtk_widget_show (page_selector);
+
+       str = g_strdup_printf ("of %d", n_pages);
+       label = gtk_label_new (str);
+       gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, TRUE, 0);
+       gtk_widget_show (label);
+       g_free (str);
+
+       gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, TRUE, 0);
+       gtk_widget_show (hbox);
+
+       demo->darea = gtk_drawing_area_new ();
+       g_signal_connect (G_OBJECT (demo->darea), "expose_event",
+                         G_CALLBACK (pgd_layers_viewer_drawing_area_expose),
+                         (gpointer)demo);
+
+       swindow = gtk_scrolled_window_new (NULL, NULL);
+       gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (swindow),
+                                       GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
+       gtk_scrolled_window_add_with_viewport (GTK_SCROLLED_WINDOW (swindow), demo->darea);
+       gtk_widget_show (demo->darea);
+
+       gtk_box_pack_start (GTK_BOX (vbox), swindow, TRUE, TRUE, 0);
+       gtk_widget_show (swindow);
+
+       return vbox;
+}
+
+static gboolean
+update_kids (GtkTreeModel *model,
+            GtkTreePath  *path,
+            GtkTreeIter  *iter,
+            GtkTreeIter  *parent)
+{
+       if (gtk_tree_store_is_ancestor (GTK_TREE_STORE (model), parent, iter)) {
+               gboolean visible;
+
+               gtk_tree_model_get (model, parent,
+                                   LAYERS_VISIBILITY_COLUMN, &visible,
+                                   -1);
+               gtk_tree_store_set (GTK_TREE_STORE (model), iter,
+                                   LAYERS_ENABLE_COLUMN, visible,
+                                   -1);
+       }
+
+       return FALSE;
+}
+
+static gboolean
+clear_rb_group (GtkTreeModel *model,
+               GtkTreePath  *path,
+               GtkTreeIter  *iter,
+               gint         *rb_group)
+{
+       gint group;
+       
+       gtk_tree_model_get (model, iter,
+                           LAYERS_RB_GROUP_COLUMN, &group,
+                           -1);
+       
+       if (group == *rb_group) {
+               gtk_tree_store_set (GTK_TREE_STORE (model), iter,
+                                   LAYERS_VISIBILITY_COLUMN, FALSE,
+                                   -1);
+       }
+       
+       return FALSE;
+}
+
+static void
+pgd_layers_visibility_changed (GtkCellRendererToggle *cell,
+                              gchar                 *path_str,
+                              PgdLayersDemo         *demo)
+{
+       GtkTreeModel *model;
+       GtkTreePath *path;
+       GtkTreeIter iter;
+       gboolean visible;
+       PopplerLayer *layer;
+
+       model = gtk_tree_view_get_model (GTK_TREE_VIEW (demo->treeview));
+
+       path = gtk_tree_path_new_from_string (path_str);
+       gtk_tree_model_get_iter (model, &iter, path);
+       gtk_tree_model_get (model, &iter,
+                           LAYERS_VISIBILITY_COLUMN, &visible,
+                           LAYERS_LAYER_COLUMN, &layer,
+                           -1);
+
+       visible = !visible;
+       visible ? poppler_layer_show (layer) : poppler_layer_hide (layer);
+
+       if (visible) {
+               gint rb_group;
+               
+               rb_group = poppler_layer_get_radio_button_group_id (layer);
+               if (rb_group) {
+                       gtk_tree_model_foreach (model,
+                                               (GtkTreeModelForeachFunc)clear_rb_group,
+                                               &rb_group);
+               }
+       }
+       
+       gtk_tree_store_set (GTK_TREE_STORE (model), &iter,
+                           LAYERS_VISIBILITY_COLUMN, visible,
+                           -1);
+       
+       if (poppler_layer_is_parent (layer)) {
+               gtk_tree_model_foreach (model,
+                                       (GtkTreeModelForeachFunc)update_kids,
+                                       &iter);
+       }
+
+       pgd_layers_viewer_queue_redraw (demo);
+
+       gtk_tree_path_free (path);
+       g_object_unref (layer);
+}
+
+GtkWidget *
+pgd_layers_create_widget (PopplerDocument *document)
+{
+       PgdLayersDemo    *demo;
+       GtkWidget        *swindow;
+       GtkWidget        *treeview;
+       GtkTreeModel     *model;
+       GtkCellRenderer  *renderer;
+       GtkTreeSelection *selection;
+       GtkWidget        *hpaned, *viewer;
+
+       demo = g_new0 (PgdLayersDemo, 1);
+       demo->doc = g_object_ref (document);
+       
+       hpaned = gtk_hpaned_new ();
+
+       viewer = pgd_layers_create_viewer (demo);
+       
+       swindow = gtk_scrolled_window_new (NULL, NULL);
+       gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (swindow),
+                                       GTK_POLICY_AUTOMATIC,
+                                       GTK_POLICY_AUTOMATIC);
+
+       model = pgd_layers_create_model (document);
+       treeview = gtk_tree_view_new_with_model (model);
+       demo->treeview = treeview;
+       g_object_unref (model);
+
+       renderer = gtk_cell_renderer_text_new ();
+       gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (treeview),
+                                                    0, "Layer",
+                                                    renderer,
+                                                    "markup", LAYERS_TITLE_COLUMN,
+                                                    NULL);
+       g_object_set (G_OBJECT (renderer), "ellipsize", PANGO_ELLIPSIZE_END, NULL);
+       g_object_set (G_OBJECT (gtk_tree_view_get_column (GTK_TREE_VIEW (treeview), 0)),
+                     "expand", TRUE, NULL);
+
+       if (GTK_IS_TREE_STORE (model)) {
+               renderer = gtk_cell_renderer_toggle_new ();
+               gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (treeview),
+                                                            1, "Show/Hide",
+                                                            renderer,
+                                                            "active", LAYERS_VISIBILITY_COLUMN,
+                                                            "activatable", LAYERS_ENABLE_COLUMN,
+                                                            "visible", LAYERS_SHOWTOGGLE_COLUMN,
+                                                            NULL);
+
+               g_signal_connect (renderer, "toggled",
+                                 G_CALLBACK (pgd_layers_visibility_changed),
+                                 (gpointer)demo);
+               gtk_tree_view_column_set_clickable (gtk_tree_view_get_column (GTK_TREE_VIEW (treeview), 1),
+                                                   TRUE);
+       }
+
+       gtk_tree_selection_set_mode (gtk_tree_view_get_selection (GTK_TREE_VIEW (treeview)),
+                                    GTK_SELECTION_NONE);
+
+       gtk_container_add (GTK_CONTAINER (swindow), treeview);
+       gtk_widget_show (treeview);
+
+       gtk_paned_add1 (GTK_PANED (hpaned), swindow);
+       gtk_widget_show (swindow);
+
+       gtk_paned_add2 (GTK_PANED (hpaned), viewer);
+       gtk_widget_show (viewer);
+
+       gtk_paned_set_position (GTK_PANED (hpaned), 150);
+
+       g_object_weak_ref (G_OBJECT (hpaned),
+                          (GWeakNotify)pgd_layers_free,
+                          (gpointer)demo);
+
+       return hpaned;
+}
diff --git a/glib/demo/layers.h b/glib/demo/layers.h
new file mode 100644 (file)
index 0000000..88b43c3
--- /dev/null
@@ -0,0 +1,31 @@
+/*
+ * Copyright (C) 2008 Carlos Garcia Campos  <carlosgc@gnome.org>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include <gtk/gtk.h>
+#include <poppler.h>
+
+#ifndef _LAYERS_H_
+#define _LAYERS_H_
+
+G_BEGIN_DECLS
+
+GtkWidget *pgd_layers_create_widget (PopplerDocument *document);
+
+G_END_DECLS
+
+#endif /* _LAYERS_H_ */ 
diff --git a/glib/demo/links.c b/glib/demo/links.c
new file mode 100644 (file)
index 0000000..6cb4a5d
--- /dev/null
@@ -0,0 +1,289 @@
+/*
+ * Copyright (C) 2007 Carlos Garcia Campos  <carlosgc@gnome.org>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include <gtk/gtk.h>
+
+#include "links.h"
+#include "utils.h"
+
+enum {
+       LINKS_ACTION_TYPE_COLUMN,
+       LINKS_X1_COLUMN,
+       LINKS_Y1_COLUMN,
+       LINKS_X2_COLUMN,
+       LINKS_Y2_COLUMN,
+       LINKS_ACTION_COLUMN,
+       N_COLUMNS
+};
+
+typedef struct {
+       PopplerDocument *doc;
+
+       GtkListStore    *model;
+       GtkWidget       *action_view;
+       GtkWidget       *timer_label;
+       
+       gint             page;
+} PgdLinksDemo;
+
+static void
+pgd_links_free (PgdLinksDemo *demo)
+{
+       if (!demo)
+               return;
+
+       if (demo->doc) {
+               g_object_unref (demo->doc);
+               demo->doc = NULL;
+       }
+
+       if (demo->model) {
+               g_object_unref (demo->model);
+               demo->model = NULL;
+       }
+
+       g_free (demo);
+}
+
+static void
+pgd_links_get_links (GtkWidget    *button,
+                    PgdLinksDemo *demo)
+{
+       PopplerPage *page;
+       GList       *mapping, *l;
+       gint         n_links;
+       GTimer      *timer;
+       
+       gtk_list_store_clear (demo->model);
+       pgd_action_view_set_action (demo->action_view, NULL);
+
+       page = poppler_document_get_page (demo->doc, demo->page);
+       if (!page)
+               return;
+
+       timer = g_timer_new ();
+       mapping = poppler_page_get_link_mapping (page);
+       g_timer_stop (timer);
+
+       n_links = g_list_length (mapping);
+       if (n_links > 0) {
+               gchar *str;
+               
+               str = g_strdup_printf ("<i>%d links found in %.4f seconds</i>",
+                                      n_links, g_timer_elapsed (timer, NULL));
+               gtk_label_set_markup (GTK_LABEL (demo->timer_label), str);
+               g_free (str);
+       } else {
+               gtk_label_set_markup (GTK_LABEL (demo->timer_label), "<i>No links found</i>");
+       }
+
+       g_timer_destroy (timer);
+
+       for (l = mapping; l; l = g_list_next (l)) {
+               PopplerLinkMapping *lmapping;
+               PopplerAction      *action;
+               GEnumValue         *enum_value;
+               GtkTreeIter         iter;
+               gchar              *x1, *y1, *x2, *y2;
+
+               lmapping = (PopplerLinkMapping *)l->data;
+               action = poppler_action_copy (lmapping->action);
+               enum_value = g_enum_get_value ((GEnumClass *) g_type_class_ref (POPPLER_TYPE_ACTION_TYPE), action->type);
+
+               x1 = g_strdup_printf ("%.2f", lmapping->area.x1);
+               y1 = g_strdup_printf ("%.2f", lmapping->area.y1);
+               x2 = g_strdup_printf ("%.2f", lmapping->area.x2);
+               y2 = g_strdup_printf ("%.2f", lmapping->area.y2);
+
+               gtk_list_store_append (demo->model, &iter);
+               gtk_list_store_set (demo->model, &iter,
+                                   LINKS_ACTION_TYPE_COLUMN, enum_value->value_name,
+                                   LINKS_X1_COLUMN, x1, 
+                                   LINKS_Y1_COLUMN, y1,
+                                   LINKS_X2_COLUMN, x2,
+                                   LINKS_Y2_COLUMN, y2,
+                                   LINKS_ACTION_COLUMN, action,
+                                   -1);
+               g_free (x1);
+               g_free (y1);
+               g_free (x2);
+               g_free (y2);
+               
+               g_object_weak_ref (G_OBJECT (demo->model),
+                                  (GWeakNotify)poppler_action_free,
+                                  action);
+       }
+
+       poppler_page_free_link_mapping (mapping);
+       g_object_unref (page);
+}
+
+static void
+pgd_links_page_selector_value_changed (GtkSpinButton *spinbutton,
+                                      PgdLinksDemo  *demo)
+{
+       demo->page = (gint)gtk_spin_button_get_value (spinbutton) - 1;
+}
+
+static void
+pgd_links_selection_changed (GtkTreeSelection *treeselection,
+                            PgdLinksDemo     *demo)
+{
+       GtkTreeModel *model;
+       GtkTreeIter   iter;
+
+       if (gtk_tree_selection_get_selected (treeselection, &model, &iter)) {
+               PopplerAction *action;
+
+               gtk_tree_model_get (model, &iter,
+                                   LINKS_ACTION_COLUMN, &action,
+                                   -1);
+               pgd_action_view_set_action (demo->action_view, action);
+       }
+}
+
+GtkWidget *
+pgd_links_create_widget (PopplerDocument *document)
+{
+       PgdLinksDemo     *demo;
+       GtkWidget        *label;
+       GtkWidget        *vbox;
+       GtkWidget        *hbox, *page_selector;
+       GtkWidget        *button;
+       GtkWidget        *hpaned;
+       GtkWidget        *swindow, *treeview;
+       GtkTreeSelection *selection;
+       GtkCellRenderer  *renderer;
+       gchar            *str;
+       gint              n_pages;
+
+       demo = g_new0 (PgdLinksDemo, 1);
+       
+       demo->doc = g_object_ref (document);
+       
+       n_pages = poppler_document_get_n_pages (document);
+
+       vbox = gtk_vbox_new (FALSE, 12);
+
+       hbox = gtk_hbox_new (FALSE, 6);
+
+       label = gtk_label_new ("Page:");
+       gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, TRUE, 0);
+       gtk_widget_show (label);
+
+       page_selector = gtk_spin_button_new_with_range (1, n_pages, 1);
+       g_signal_connect (G_OBJECT (page_selector), "value-changed",
+                         G_CALLBACK (pgd_links_page_selector_value_changed),
+                         (gpointer)demo);
+       gtk_box_pack_start (GTK_BOX (hbox), page_selector, FALSE, TRUE, 0);
+       gtk_widget_show (page_selector);
+
+       str = g_strdup_printf ("of %d", n_pages);
+       label = gtk_label_new (str);
+       gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, TRUE, 0);
+       gtk_widget_show (label);
+       g_free (str);
+
+       button = gtk_button_new_with_label ("Get Links");
+       g_signal_connect (G_OBJECT (button), "clicked",
+                         G_CALLBACK (pgd_links_get_links),
+                         (gpointer)demo);
+       gtk_box_pack_end (GTK_BOX (hbox), button, FALSE, FALSE, 0);
+       gtk_widget_show (button);
+
+       gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, TRUE, 0);
+       gtk_widget_show (hbox);
+
+       demo->timer_label = gtk_label_new (NULL);
+       gtk_label_set_markup (GTK_LABEL (demo->timer_label), "<i>No links found</i>");
+       g_object_set (G_OBJECT (demo->timer_label), "xalign", 1.0, NULL);
+       gtk_box_pack_start (GTK_BOX (vbox), demo->timer_label, FALSE, TRUE, 0);
+       gtk_widget_show (demo->timer_label);
+
+       hpaned = gtk_hpaned_new ();
+
+       demo->action_view = pgd_action_view_new (document);
+
+       swindow = gtk_scrolled_window_new (NULL, NULL);
+       gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (swindow),
+                                       GTK_POLICY_AUTOMATIC,
+                                       GTK_POLICY_AUTOMATIC);
+       
+       demo->model = gtk_list_store_new (N_COLUMNS,
+                                         G_TYPE_STRING, G_TYPE_STRING,
+                                         G_TYPE_STRING, G_TYPE_STRING,
+                                         G_TYPE_STRING, G_TYPE_POINTER);
+       treeview = gtk_tree_view_new_with_model (GTK_TREE_MODEL (demo->model));
+
+       renderer = gtk_cell_renderer_text_new ();
+       gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (treeview),
+                                                    0, "Action Type",
+                                                    renderer,
+                                                    "text", LINKS_ACTION_TYPE_COLUMN,
+                                                    NULL);
+
+       renderer = gtk_cell_renderer_text_new ();
+       gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (treeview),
+                                                    1, "X1",
+                                                    renderer,
+                                                    "text", LINKS_X1_COLUMN,
+                                                    NULL);
+       renderer = gtk_cell_renderer_text_new ();
+       gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (treeview),
+                                                    2, "Y1",
+                                                    renderer,
+                                                    "text", LINKS_Y1_COLUMN,
+                                                    NULL);
+       renderer = gtk_cell_renderer_text_new ();
+       gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (treeview),
+                                                    3, "X2",
+                                                    renderer,
+                                                    "text", LINKS_X2_COLUMN,
+                                                    NULL);
+       renderer = gtk_cell_renderer_text_new ();
+       gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (treeview),
+                                                    4, "Y2",
+                                                    renderer,
+                                                    "text", LINKS_Y2_COLUMN,
+                                                    NULL);
+       
+       selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (treeview));
+       g_signal_connect (G_OBJECT (selection), "changed",
+                         G_CALLBACK (pgd_links_selection_changed),
+                         (gpointer)demo);
+
+       gtk_container_add (GTK_CONTAINER (swindow), treeview);
+       gtk_widget_show (treeview);
+
+       gtk_paned_add1 (GTK_PANED (hpaned), swindow);
+       gtk_widget_show (swindow);
+
+       gtk_paned_add2 (GTK_PANED (hpaned), demo->action_view);
+       gtk_widget_show (demo->action_view);
+
+       gtk_paned_set_position (GTK_PANED (hpaned), 300);
+
+       gtk_box_pack_start (GTK_BOX (vbox), hpaned, TRUE, TRUE, 0);
+       gtk_widget_show (hpaned);
+
+       g_object_weak_ref (G_OBJECT (vbox),
+                          (GWeakNotify)pgd_links_free,
+                          demo);
+       
+       return vbox;
+}
diff --git a/glib/demo/links.h b/glib/demo/links.h
new file mode 100644 (file)
index 0000000..b7dbaeb
--- /dev/null
@@ -0,0 +1,31 @@
+/*
+ * Copyright (C) 2007 Carlos Garcia Campos  <carlosgc@gnome.org>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include <gtk/gtk.h>
+#include <poppler.h>
+
+#ifndef _LINKS_H_
+#define _LINKS_H_
+
+G_BEGIN_DECLS
+
+GtkWidget *pgd_links_create_widget (PopplerDocument *document);
+
+G_END_DECLS
+
+#endif /* _LINKS_H_ */
diff --git a/glib/demo/main.c b/glib/demo/main.c
new file mode 100644 (file)
index 0000000..f52c5b8
--- /dev/null
@@ -0,0 +1,401 @@
+/* 
+ * Copyright (C) 2007 Carlos Garcia Campos  <carlosgc@gnome.org>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include <gtk/gtk.h>
+#include <gio/gio.h>
+#include <poppler.h>
+#include <string.h>
+
+#include "info.h"
+#include "fonts.h"
+#include "render.h"
+#include "page.h"
+#include "outline.h"
+#include "links.h"
+#include "forms.h"
+#include "transitions.h"
+#include "images.h"
+#include "annots.h"
+#include "attachments.h"
+#include "layers.h"
+#include "text.h"
+#include "find.h"
+#include "print.h"
+#include "selections.h"
+
+enum {
+       PGD_TITLE_COLUMN,
+       PGD_NPAGE_COLUMN,
+       PGD_WIDGET_COLUMN,
+       N_COLUMNS
+};
+
+typedef struct {
+       const gchar *name;
+       GtkWidget   *(* create_widget) (PopplerDocument *document);
+} PopplerGlibDemo;
+
+static const PopplerGlibDemo demo_list[] = {
+       { "Info",             pgd_info_create_widget },
+       { "Fonts",            pgd_fonts_create_widget },
+       { "Render",           pgd_render_create_widget },
+       { "Selections",       pgd_selections_create_widget },
+       { "Page Info",        pgd_page_create_widget },
+       { "Outline",          pgd_outline_create_widget },
+       { "Links",            pgd_links_create_widget },
+       { "Forms",            pgd_forms_create_widget },
+       { "Page Transitions", pgd_transitions_create_widget },
+       { "Images",           pgd_images_create_widget },
+       { "Annots",           pgd_annots_create_widget },
+       { "Attachments",      pgd_attachments_create_widget },
+       { "Layers",           pgd_layers_create_widget },
+       { "Text",             pgd_text_create_widget },
+       { "Find",             pgd_find_create_widget },
+       { "Print",            pgd_print_create_widget }
+};
+
+static void
+pgd_demo_changed (GtkTreeSelection *selection,
+                 GtkNotebook      *notebook)
+{
+       GtkTreeModel *model;
+       GtkTreeIter   iter;
+
+       if (gtk_tree_selection_get_selected (selection, &model, &iter)) {
+               gint n_page;
+               
+               gtk_tree_model_get (model, &iter,
+                                   PGD_NPAGE_COLUMN, &n_page,
+                                   -1);
+               gtk_notebook_set_current_page (notebook, n_page);
+       }
+}
+
+static GtkWidget *
+pgd_demo_list_create (void)
+{
+       GtkWidget       *treeview;
+       GtkListStore    *model;
+       GtkCellRenderer *renderer;
+       gint             i;
+
+       model = gtk_list_store_new (N_COLUMNS,
+                                   G_TYPE_STRING,
+                                   G_TYPE_INT,
+                                   G_TYPE_POINTER);
+       treeview = gtk_tree_view_new_with_model (GTK_TREE_MODEL (model));
+
+       renderer = gtk_cell_renderer_text_new ();
+       gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (treeview),
+                                                    0, "Demos",
+                                                    renderer,
+                                                    "text", PGD_TITLE_COLUMN,
+                                                    NULL);
+       
+       for (i = 0; i < G_N_ELEMENTS (demo_list); i++) {
+               GtkTreeIter iter;
+
+               gtk_list_store_append (model, &iter);
+               gtk_list_store_set (model, &iter,
+                                   PGD_TITLE_COLUMN, demo_list[i].name,
+                                   PGD_NPAGE_COLUMN, i,
+                                   -1);
+       }
+
+       g_object_unref (model);
+       
+       return treeview;
+}
+
+static GtkWidget *
+pdg_demo_notebook_create (PopplerDocument *document)
+{
+       GtkWidget *notebook;
+       gint       i;
+
+       notebook = gtk_notebook_new ();
+       gtk_notebook_set_show_tabs (GTK_NOTEBOOK (notebook), FALSE);
+       gtk_notebook_set_show_border (GTK_NOTEBOOK (notebook), FALSE);
+       
+       for (i = 0; i < G_N_ELEMENTS (demo_list); i++) {
+               GtkWidget *demo_widget;
+
+               demo_widget = demo_list[i].create_widget (document);
+               gtk_notebook_append_page (GTK_NOTEBOOK (notebook), demo_widget, NULL);
+               gtk_widget_show (demo_widget);
+       }
+
+       return notebook;
+}
+
+static void
+pgd_demo_auth_dialog_entry_changed (GtkEditable *editable,
+                                   GtkDialog   *dialog)
+{
+       const char *text;
+
+       text = gtk_entry_get_text (GTK_ENTRY (editable));
+
+       gtk_dialog_set_response_sensitive (dialog, GTK_RESPONSE_OK,
+                                          (text != NULL && *text != '\0'));
+       g_object_set_data (G_OBJECT (dialog), "pgd-password", (gpointer)text);
+}
+
+static void
+pgd_demo_auth_dialog_entry_activated (GtkEntry  *entry,
+                                     GtkDialog *dialog)
+{
+       gtk_dialog_response (dialog, GTK_RESPONSE_OK);
+}
+
+static GtkDialog *
+pgd_demo_get_auth_dialog (GFile *uri_file)
+{
+       GtkDialog *dialog;
+       GtkWidget *content_area, *action_area;
+       GtkWidget *entry_container;
+       GtkWidget *password_entry;
+       GtkWidget *hbox, *main_vbox, *vbox, *icon;
+       GtkWidget *table;
+       GtkWidget *label;
+       gchar     *format, *markup, *file_name;
+
+       dialog = GTK_DIALOG (gtk_dialog_new ());
+       content_area = gtk_dialog_get_content_area (dialog);
+       action_area = gtk_dialog_get_action_area (dialog);
+
+       /* Set the dialog up with HIG properties */
+#if !GTK_CHECK_VERSION (2, 22, 0)
+       gtk_dialog_set_has_separator (dialog, FALSE);
+#endif
+       gtk_container_set_border_width (GTK_CONTAINER (dialog), 5);
+       gtk_box_set_spacing (GTK_BOX (content_area), 2); /* 2 * 5 + 2 = 12 */
+       gtk_container_set_border_width (GTK_CONTAINER (action_area), 5);
+       gtk_box_set_spacing (GTK_BOX (action_area), 6);
+
+       gtk_window_set_title (GTK_WINDOW (dialog), "Enter password");
+       gtk_window_set_resizable (GTK_WINDOW (dialog), FALSE);
+       gtk_window_set_icon_name (GTK_WINDOW (dialog), GTK_STOCK_DIALOG_AUTHENTICATION);
+       gtk_window_set_modal (GTK_WINDOW (dialog), TRUE);
+
+       gtk_dialog_add_buttons (dialog,
+                               GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
+                               "_Unlock Document", GTK_RESPONSE_OK,
+                               NULL);
+       gtk_dialog_set_default_response (dialog, GTK_RESPONSE_OK);
+       gtk_dialog_set_response_sensitive (GTK_DIALOG (dialog),
+                                          GTK_RESPONSE_OK, FALSE);
+       gtk_dialog_set_alternative_button_order (dialog,
+                                                GTK_RESPONSE_OK,
+                                                GTK_RESPONSE_CANCEL,
+                                                -1);
+
+       /* Build contents */
+       hbox = gtk_hbox_new (FALSE, 12);
+       gtk_container_set_border_width (GTK_CONTAINER (hbox), 5);
+       gtk_box_pack_start (GTK_BOX (content_area), hbox, TRUE, TRUE, 0);
+       gtk_widget_show (hbox);
+
+       icon = gtk_image_new_from_stock (GTK_STOCK_DIALOG_AUTHENTICATION,
+                                        GTK_ICON_SIZE_DIALOG);
+
+       gtk_misc_set_alignment (GTK_MISC (icon), 0.5, 0.0);
+       gtk_box_pack_start (GTK_BOX (hbox), icon, FALSE, FALSE, 0);
+       gtk_widget_show (icon);
+
+       main_vbox = gtk_vbox_new (FALSE, 18);
+       gtk_box_pack_start (GTK_BOX (hbox), main_vbox, TRUE, TRUE, 0);
+       gtk_widget_show (main_vbox);
+
+       label = gtk_label_new (NULL);
+       gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
+       gtk_label_set_line_wrap (GTK_LABEL (label), TRUE);
+       file_name = g_file_get_basename (uri_file);
+       format = g_strdup_printf ("<span size=\"larger\" weight=\"bold\">%s</span>\n\n%s",
+                                 "Password required",
+                                 "The document “%s” is locked and requires a password before it can be opened.");
+       markup = g_markup_printf_escaped (format, file_name);
+       gtk_label_set_markup (GTK_LABEL (label), markup);
+       g_free (format);
+       g_free (markup);
+       g_free (file_name);
+       gtk_box_pack_start (GTK_BOX (main_vbox), label,
+                           FALSE, FALSE, 0);
+       gtk_widget_show (label);
+
+       vbox = gtk_vbox_new (FALSE, 6);
+       gtk_box_pack_start (GTK_BOX (main_vbox), vbox, FALSE, FALSE, 0);
+       gtk_widget_show (vbox);
+
+       /* The table that holds the entries */
+       entry_container = gtk_alignment_new (0.0, 0.0, 1.0, 1.0);
+
+       gtk_alignment_set_padding (GTK_ALIGNMENT (entry_container),
+                                  0, 0, 0, 0);
+
+       gtk_box_pack_start (GTK_BOX (vbox), entry_container,
+                           FALSE, FALSE, 0);
+       gtk_widget_show (entry_container);
+
+       table = gtk_table_new (1, 2, FALSE);
+       gtk_table_set_col_spacings (GTK_TABLE (table), 12);
+       gtk_table_set_row_spacings (GTK_TABLE (table), 6);
+       gtk_container_add (GTK_CONTAINER (entry_container), table);
+       gtk_widget_show (table);
+
+       label = gtk_label_new_with_mnemonic ("_Password:");
+       gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
+
+       password_entry = gtk_entry_new ();
+       gtk_entry_set_visibility (GTK_ENTRY (password_entry), FALSE);
+       g_signal_connect (password_entry, "changed",
+                         G_CALLBACK (pgd_demo_auth_dialog_entry_changed),
+                         dialog);
+       g_signal_connect (password_entry, "activate",
+                         G_CALLBACK (pgd_demo_auth_dialog_entry_activated),
+                         dialog);
+
+       gtk_table_attach (GTK_TABLE (table), label,
+                         0, 1, 0, 1,
+                         GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0);
+       gtk_widget_show (label);
+
+       gtk_table_attach_defaults (GTK_TABLE (table), password_entry,
+                                  1, 2, 0, 1);
+       gtk_widget_show (password_entry);
+
+       gtk_label_set_mnemonic_widget (GTK_LABEL (label), password_entry);
+
+       return dialog;
+}
+
+gint main (gint argc, gchar **argv)
+{
+       PopplerDocument  *document;
+       GtkWidget        *win;
+       GtkWidget        *hbox;
+       GtkWidget        *notebook;
+       GtkWidget        *treeview;
+       GtkTreeSelection *selection;
+       GFile            *file;
+       gchar            *uri;
+       GTimer           *timer;
+       GError           *error = NULL;
+       GtkAccelGroup    *gtk_accel;
+       GClosure         *closure;
+
+       if (argc != 2) {
+               g_print ("Usage: poppler-glib-demo FILE\n");
+               return 1;
+       }
+
+/* Threading is always enabled starting from GLib 2.24.0 */
+#if !GLIB_CHECK_VERSION (2, 24, 0)
+       if (!g_thread_supported ())
+               g_thread_init (NULL);
+#endif
+
+       gtk_init (&argc, &argv);
+
+       file = g_file_new_for_commandline_arg (argv[1]);
+       uri = g_file_get_uri (file);
+
+       timer = g_timer_new ();
+       document = poppler_document_new_from_file (uri, NULL, &error);
+       g_timer_stop (timer);
+       if (error) {
+               while (g_error_matches (error, POPPLER_ERROR, POPPLER_ERROR_ENCRYPTED)) {
+                       GtkDialog   *dialog;
+                       const gchar *password;
+
+                       dialog = pgd_demo_get_auth_dialog (file);
+                       if (gtk_dialog_run (dialog) != GTK_RESPONSE_OK) {
+                               g_print ("Error: no password provided\n");
+                               g_object_unref (file);
+                               g_free (uri);
+
+                               return 1;
+                       }
+
+                       g_clear_error (&error);
+                       password = g_object_get_data (G_OBJECT (dialog), "pgd-password");
+
+                       g_timer_start (timer);
+                       document = poppler_document_new_from_file (uri, password, &error);
+                       g_timer_stop (timer);
+
+                       gtk_widget_destroy (GTK_WIDGET (dialog));
+               }
+
+               if (error) {
+                       g_print ("Error: %s\n", error->message);
+                       g_error_free (error);
+                       g_object_unref (file);
+                       g_free (uri);
+
+                       return 1;
+               }
+       }
+
+       g_object_unref (file);
+       g_free (uri);
+
+       g_print ("Document successfully loaded in %.4f seconds\n",
+                g_timer_elapsed (timer, NULL));
+       g_timer_destroy (timer);
+
+       /* Main window */
+       win = gtk_window_new (GTK_WINDOW_TOPLEVEL);
+       gtk_window_set_default_size (GTK_WINDOW (win), 600, 600);
+       gtk_window_set_title (GTK_WINDOW (win), "Poppler GLib Demo");
+       g_signal_connect (G_OBJECT (win), "delete-event",
+                         G_CALLBACK (gtk_main_quit), NULL);
+
+       gtk_accel = gtk_accel_group_new ();
+       closure = g_cclosure_new (G_CALLBACK (gtk_main_quit), NULL, NULL);
+       gtk_accel_group_connect (gtk_accel, gdk_keyval_from_name ("q"),
+                                GDK_CONTROL_MASK, 0, closure);
+       g_closure_unref (closure);
+       gtk_window_add_accel_group (GTK_WINDOW(win), gtk_accel);
+
+       hbox = gtk_hbox_new (FALSE, 6);
+
+       treeview = pgd_demo_list_create ();
+       gtk_box_pack_start (GTK_BOX (hbox), treeview, FALSE, TRUE, 0);
+       gtk_widget_show (treeview);
+       
+       notebook = pdg_demo_notebook_create (document);
+       gtk_box_pack_start (GTK_BOX (hbox), notebook, TRUE, TRUE, 0);
+       gtk_widget_show (notebook);
+
+       selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (treeview));
+       g_signal_connect (G_OBJECT (selection), "changed",
+                         G_CALLBACK (pgd_demo_changed),
+                         (gpointer) notebook);
+
+       gtk_container_add (GTK_CONTAINER (win), hbox);
+       gtk_widget_show (hbox);
+       
+       gtk_widget_show (win);
+
+       gtk_main ();
+
+       g_object_unref (document);
+       
+       return 0;
+}
diff --git a/glib/demo/outline.c b/glib/demo/outline.c
new file mode 100644 (file)
index 0000000..5dc7189
--- /dev/null
@@ -0,0 +1,218 @@
+/*
+ * Copyright (C) 2007 Carlos Garcia Campos  <carlosgc@gnome.org>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include <gtk/gtk.h>
+
+#include "outline.h"
+#include "utils.h"
+
+enum {
+       OUTLINE_TITLE_COLUMN,
+       OUTLINE_ACTION_TYPE_COLUMN,
+       OUTLINE_EXPAND_COLUMN,
+       OUTLINE_ACTION_COLUMN,
+       N_COLUMNS
+};
+
+static void
+build_tree (PopplerDocument  *document,
+           GtkTreeModel     *model,
+           GtkTreeIter      *parent,
+           PopplerIndexIter *iter)
+{
+
+       do {
+               GtkTreeIter       tree_iter;
+               PopplerIndexIter *child;
+               PopplerAction    *action;
+               gboolean          expand;
+               gchar            *markup;
+               GEnumValue       *enum_value;
+
+               action = poppler_index_iter_get_action (iter);
+               expand = poppler_index_iter_is_open (iter);
+
+               if (!action)
+                       continue;
+
+               markup = g_markup_escape_text (action->any.title, -1);
+               enum_value = g_enum_get_value ((GEnumClass *) g_type_class_ref (POPPLER_TYPE_ACTION_TYPE), action->type);
+               
+               if (action->type == POPPLER_ACTION_GOTO_DEST &&
+                   action->goto_dest.dest->type == POPPLER_DEST_NAMED) {
+                       /* TODO */
+               }                       
+
+               gtk_tree_store_append (GTK_TREE_STORE (model), &tree_iter, parent);
+               gtk_tree_store_set (GTK_TREE_STORE (model), &tree_iter,
+                                   OUTLINE_TITLE_COLUMN, markup,
+                                   OUTLINE_ACTION_TYPE_COLUMN, enum_value->value_name,
+                                   OUTLINE_EXPAND_COLUMN, expand,
+                                   OUTLINE_ACTION_COLUMN, action,
+                                   -1);
+               g_object_weak_ref (G_OBJECT (model),
+                                  (GWeakNotify)poppler_action_free,
+                                  action);
+
+               g_free (markup);
+
+               child = poppler_index_iter_get_child (iter);
+               if (child)
+                       build_tree (document, model, &tree_iter, child);
+               poppler_index_iter_free (child);
+       } while (poppler_index_iter_next (iter));
+}
+
+GtkTreeModel *
+pgd_outline_create_model (PopplerDocument *document)
+{
+       GtkTreeModel     *model;
+       PopplerIndexIter *iter;
+
+       iter = poppler_index_iter_new (document);
+       if (iter) {
+               model = GTK_TREE_MODEL (
+                       gtk_tree_store_new (N_COLUMNS,
+                                           G_TYPE_STRING, G_TYPE_STRING, 
+                                           G_TYPE_BOOLEAN, G_TYPE_POINTER));
+               build_tree (document, model, NULL, iter);
+               poppler_index_iter_free (iter);
+       } else {
+               GtkTreeIter tree_iter;
+               gchar      *markup;
+               
+               model = GTK_TREE_MODEL (gtk_list_store_new (1, G_TYPE_STRING));
+               gtk_list_store_append (GTK_LIST_STORE (model), &tree_iter);
+               markup = g_strdup_printf ("<span size=\"larger\" style=\"italic\">%s</span>",
+                                         "The document doesn't contain outline");
+               gtk_list_store_set (GTK_LIST_STORE (model), &tree_iter,
+                                   0, markup, -1);
+               g_free (markup);
+       }
+
+       return model;
+}
+
+static void
+expand_open_links (GtkTreeView  *tree_view,
+                  GtkTreeModel *model,
+                  GtkTreeIter  *parent)
+{
+       GtkTreeIter iter;
+       gboolean    expand;
+
+       if (gtk_tree_model_iter_children (model, &iter, parent)) {
+               do {
+                       gtk_tree_model_get (model, &iter,
+                                           OUTLINE_EXPAND_COLUMN, &expand,
+                                           -1);
+                       if (expand) {
+                               GtkTreePath *path;
+
+                               path = gtk_tree_model_get_path (model, &iter);
+                               gtk_tree_view_expand_row (tree_view, path, FALSE);
+                               gtk_tree_path_free (path);
+                       }
+
+                       expand_open_links (tree_view, model, &iter);
+               } while (gtk_tree_model_iter_next (model, &iter));
+       }
+}
+
+static void
+pgd_outline_selection_changed (GtkTreeSelection *treeselection,
+                              GtkWidget        *action_view)
+{
+       GtkTreeModel *model;
+       GtkTreeIter   iter;
+       
+       if (gtk_tree_selection_get_selected (treeselection, &model, &iter)) {
+               PopplerAction *action;
+
+               gtk_tree_model_get (model, &iter,
+                                   OUTLINE_ACTION_COLUMN, &action,
+                                   -1);
+               pgd_action_view_set_action (action_view, action);
+       }
+}
+
+GtkWidget *
+pgd_outline_create_widget (PopplerDocument *document)
+{
+       GtkWidget        *swindow;
+       GtkWidget        *treeview;
+       GtkTreeModel     *model;
+       GtkCellRenderer  *renderer;
+       GtkTreeSelection *selection;
+       GtkWidget        *hpaned, *action;
+
+       hpaned = gtk_hpaned_new ();
+
+       action = pgd_action_view_new (document);
+       
+       swindow = gtk_scrolled_window_new (NULL, NULL);
+       gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (swindow),
+                                       GTK_POLICY_AUTOMATIC,
+                                       GTK_POLICY_AUTOMATIC);
+
+       model = pgd_outline_create_model (document);
+       treeview = gtk_tree_view_new_with_model (model);
+       g_object_unref (model);
+
+       renderer = gtk_cell_renderer_text_new ();
+       gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (treeview),
+                                                    0, "Title",
+                                                    renderer,
+                                                    "markup", OUTLINE_TITLE_COLUMN,
+                                                    NULL);
+       g_object_set (G_OBJECT (renderer), "ellipsize", PANGO_ELLIPSIZE_END, NULL);
+       g_object_set (G_OBJECT (gtk_tree_view_get_column (GTK_TREE_VIEW (treeview), 0)),
+                     "expand", TRUE, NULL);
+
+       if (GTK_IS_TREE_STORE (model)) {
+               renderer = gtk_cell_renderer_text_new ();
+               gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (treeview),
+                                                            1, "Action Type",
+                                                            renderer,
+                                                            "text", OUTLINE_ACTION_TYPE_COLUMN,
+                                                            NULL);
+
+               expand_open_links (GTK_TREE_VIEW (treeview), model, NULL);
+
+               selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (treeview));
+               g_signal_connect (G_OBJECT (selection), "changed",
+                                 G_CALLBACK (pgd_outline_selection_changed),
+                                 (gpointer)action);
+       } else {
+               gtk_tree_selection_set_mode (gtk_tree_view_get_selection (GTK_TREE_VIEW (treeview)),
+                                            GTK_SELECTION_NONE);
+       }
+
+       gtk_container_add (GTK_CONTAINER (swindow), treeview);
+       gtk_widget_show (treeview);
+
+       gtk_paned_add1 (GTK_PANED (hpaned), swindow);
+       gtk_widget_show (swindow);
+
+       gtk_paned_add2 (GTK_PANED (hpaned), action);
+       gtk_widget_show (action);
+
+       gtk_paned_set_position (GTK_PANED (hpaned), 300);
+
+       return hpaned;
+}
diff --git a/glib/demo/outline.h b/glib/demo/outline.h
new file mode 100644 (file)
index 0000000..61b8238
--- /dev/null
@@ -0,0 +1,31 @@
+/*
+ * Copyright (C) 2007 Carlos Garcia Campos  <carlosgc@gnome.org>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include <gtk/gtk.h>
+#include <poppler.h>
+
+#ifndef _OUTLINE_H_
+#define _OUTLINE_H_
+
+G_BEGIN_DECLS
+
+GtkWidget *pgd_outline_create_widget (PopplerDocument *document);
+
+G_END_DECLS
+
+#endif /* _OUTLINE_H_ */ 
diff --git a/glib/demo/page.c b/glib/demo/page.c
new file mode 100644 (file)
index 0000000..7ab008c
--- /dev/null
@@ -0,0 +1,335 @@
+/*
+ * Copyright (C) 2007 Carlos Garcia Campos  <carlosgc@gnome.org>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include "config.h"
+
+#include <gtk/gtk.h>
+
+#include "page.h"
+#include "utils.h"
+
+typedef struct {
+       PopplerDocument *doc;
+
+       GtkWidget       *index;
+       GtkWidget       *label;
+       GtkWidget       *size;
+       GtkWidget       *duration;
+       GtkWidget       *thumbnail;
+       GtkWidget       *thumbnail_size;
+
+       gint             page;
+} PgdPageDemo;
+
+static void
+pgd_page_free (PgdPageDemo *demo)
+{
+       if (!demo)
+               return;
+
+       if (demo->doc) {
+               g_object_unref (demo->doc);
+               demo->doc = NULL;
+       }
+
+       g_free (demo);
+}
+
+#ifndef POPPLER_WITH_GDK
+static void
+image_set_from_surface (GtkImage        *gtkimage,
+                       cairo_surface_t *surface)
+{
+       GdkPixbuf       *pixbuf;
+       cairo_surface_t *image;
+       cairo_t         *cr;
+       gboolean         has_alpha;
+       gint             width, height;
+       cairo_format_t   surface_format;
+       gint             pixbuf_n_channels;
+       gint             pixbuf_rowstride;
+       guchar          *pixbuf_pixels;
+       gint             x, y;
+
+       width = cairo_image_surface_get_width (surface);
+       height = cairo_image_surface_get_height (surface);
+       
+       surface_format = cairo_image_surface_get_format (surface);
+       has_alpha = (surface_format == CAIRO_FORMAT_ARGB32);
+
+       pixbuf = gdk_pixbuf_new (GDK_COLORSPACE_RGB,
+                                TRUE, 8,
+                                width, height);
+       pixbuf_n_channels = gdk_pixbuf_get_n_channels (pixbuf);
+       pixbuf_rowstride = gdk_pixbuf_get_rowstride (pixbuf);
+       pixbuf_pixels = gdk_pixbuf_get_pixels (pixbuf);
+
+       image = cairo_image_surface_create_for_data (pixbuf_pixels,
+                                                    surface_format,
+                                                    width, height,
+                                                    pixbuf_rowstride);
+       cr = cairo_create (image);
+       cairo_set_source_surface (cr, surface, 0, 0);
+
+       if (has_alpha)
+               cairo_mask_surface (cr, surface, 0, 0);
+       else
+               cairo_paint (cr);
+
+       cairo_destroy (cr);
+       cairo_surface_destroy (image);
+
+       for (y = 0; y < height; y++) {
+               guchar *p = pixbuf_pixels + y * pixbuf_rowstride;
+
+               for (x = 0; x < width; x++) {
+                       guchar tmp;
+                       
+#if G_BYTE_ORDER == G_LITTLE_ENDIAN
+                       tmp = p[0];
+                       p[0] = p[2];
+                       p[2] = tmp;
+                       p[3] = (has_alpha) ? p[3] : 0xff;
+#else
+                       tmp = p[0];
+                       p[0] = (has_alpha) ? p[3] : 0xff;
+                       p[3] = p[2];
+                       p[2] = p[1];
+                       p[1] = tmp;
+#endif                 
+                       p += pixbuf_n_channels;
+               }
+       }
+
+       gtk_image_set_from_pixbuf (gtkimage, pixbuf);
+       g_object_unref (pixbuf);
+}
+#endif /* !POPPLER_WITH_GDK */
+
+static void
+pgd_page_set_page (PgdPageDemo *demo,
+                  PopplerPage *page)
+{
+#ifdef POPPLER_WITH_GDK
+       GdkPixbuf *thumbnail;
+#else
+       cairo_surface_t *thumbnail;
+#endif
+       gchar     *str;
+
+       str = page ? g_strdup_printf ("%d", poppler_page_get_index (page)) : NULL;
+       gtk_label_set_text (GTK_LABEL (demo->index), str);
+       g_free (str);
+
+       if (page) {
+               str = poppler_page_get_label (page);
+               gtk_label_set_text (GTK_LABEL (demo->label), str);
+               g_free (str);
+       } else {
+               gtk_label_set_text (GTK_LABEL (demo->label), NULL);
+       }
+
+       if (page) {
+               gdouble width, height;
+
+               poppler_page_get_size (page, &width, &height);
+               str = g_strdup_printf ("%.2f x %.2f", width, height);
+               gtk_label_set_text (GTK_LABEL (demo->size), str);
+               g_free (str);
+       } else {
+               gtk_label_set_text (GTK_LABEL (demo->size), NULL);
+       }
+
+       str = page ? g_strdup_printf ("%.2f seconds", poppler_page_get_duration (page)) : NULL;
+       gtk_label_set_text (GTK_LABEL (demo->duration), str);
+       g_free (str);
+
+#ifdef POPPLER_WITH_GDK
+       thumbnail = page ? poppler_page_get_thumbnail_pixbuf (page) : NULL;
+#else
+       thumbnail = page ? poppler_page_get_thumbnail (page) : NULL;
+#endif
+       if (thumbnail) {
+               gint width, height;
+               
+               poppler_page_get_thumbnail_size (page, &width, &height);
+               str = g_strdup_printf ("%d x %d", width, height);
+               gtk_label_set_text (GTK_LABEL (demo->thumbnail_size), str);
+               g_free (str);
+               
+#ifdef POPPLER_WITH_GDK
+               gtk_image_set_from_pixbuf (GTK_IMAGE (demo->thumbnail), thumbnail);
+               g_object_unref (thumbnail);
+#else
+               image_set_from_surface (GTK_IMAGE (demo->thumbnail), thumbnail);
+               cairo_surface_destroy (thumbnail);
+#endif
+       } else {
+               str = g_strdup ("<i>No thumbnail found</i>");
+               gtk_label_set_markup (GTK_LABEL (demo->thumbnail_size), str);
+               g_free (str);
+
+               gtk_image_set_from_stock (GTK_IMAGE (demo->thumbnail),
+                                         GTK_STOCK_MISSING_IMAGE,
+                                         GTK_ICON_SIZE_DIALOG);
+       }
+}
+
+static void
+pgd_page_get_info (GtkWidget   *button,
+                  PgdPageDemo *demo)
+{
+       PopplerPage *page;
+
+       page = poppler_document_get_page (demo->doc, demo->page);
+       pgd_page_set_page (demo, page);
+       g_object_unref (page);
+}
+
+static void
+pgd_page_page_selector_value_changed (GtkSpinButton *spinbutton,
+                                     PgdPageDemo   *demo)
+{
+       demo->page = (gint)gtk_spin_button_get_value (spinbutton) - 1;
+}
+
+GtkWidget *
+pgd_page_create_widget (PopplerDocument *document)
+{
+       PgdPageDemo *demo;
+       GtkWidget   *vbox;
+       GtkWidget   *hbox, *page_selector;
+       GtkWidget   *button;
+       GtkWidget   *frame, *alignment;
+       GtkWidget   *table;
+       GtkWidget   *label;
+       GtkWidget   *thumnail_box;
+       gchar       *str;
+       gint         n_pages;
+       gint         row = 0;
+
+       demo = g_new0 (PgdPageDemo, 1);
+
+       demo->doc = g_object_ref (document);
+
+       n_pages = poppler_document_get_n_pages (document);
+
+       vbox = gtk_vbox_new (FALSE, 12);
+
+       hbox = gtk_hbox_new (FALSE, 6);
+
+       label = gtk_label_new ("Page:");
+       gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, TRUE, 0);
+       gtk_widget_show (label);
+
+       page_selector = gtk_spin_button_new_with_range (1, n_pages, 1);
+       g_signal_connect (G_OBJECT (page_selector), "value-changed",
+                         G_CALLBACK (pgd_page_page_selector_value_changed),
+                         (gpointer)demo);
+       gtk_box_pack_start (GTK_BOX (hbox), page_selector, FALSE, TRUE, 0);
+       gtk_widget_show (page_selector);
+
+       str = g_strdup_printf ("of %d", n_pages);
+       label = gtk_label_new (str);
+       gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, TRUE, 0);
+       gtk_widget_show (label);
+       g_free (str);
+
+       button = gtk_button_new_with_label ("Get Info");
+       g_signal_connect (G_OBJECT (button), "clicked",
+                         G_CALLBACK (pgd_page_get_info),
+                         (gpointer)demo);
+       gtk_box_pack_end (GTK_BOX (hbox), button, FALSE, FALSE, 0);
+       gtk_widget_show (button);
+
+       gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, TRUE, 0);
+       gtk_widget_show (hbox);
+
+       hbox = gtk_hbox_new (FALSE, 6);
+
+       frame = gtk_frame_new (NULL);
+       gtk_frame_set_shadow_type (GTK_FRAME (frame), GTK_SHADOW_NONE);
+       label = gtk_label_new (NULL);
+       gtk_label_set_markup (GTK_LABEL (label), "<b>Page Properties</b>");
+       gtk_frame_set_label_widget (GTK_FRAME (frame), label);
+       gtk_widget_show (label);
+
+       alignment = gtk_alignment_new (0.5, 0.5, 1, 1);
+       gtk_alignment_set_padding (GTK_ALIGNMENT (alignment), 5, 5, 12, 5);
+       gtk_container_add (GTK_CONTAINER (frame), alignment);
+       gtk_widget_show (alignment);
+
+       table = gtk_table_new (3, 2, FALSE);
+
+       gtk_table_set_col_spacings (GTK_TABLE (table), 6);
+       gtk_table_set_row_spacings (GTK_TABLE (table), 6);
+
+       pgd_table_add_property_with_value_widget (GTK_TABLE (table), "<b>Page Index:</b>",
+                                                 &(demo->index), NULL, &row);
+       pgd_table_add_property_with_value_widget (GTK_TABLE (table), "<b>Page Label:</b>",
+                                                 &(demo->label), NULL, &row);
+       pgd_table_add_property_with_value_widget (GTK_TABLE (table), "<b>Page Size:</b>",
+                                                 &(demo->size), NULL, &row);
+       pgd_table_add_property_with_value_widget (GTK_TABLE (table), "<b>Page Duration:</b>",
+                                                 &(demo->duration), NULL, &row);
+
+       gtk_container_add (GTK_CONTAINER (alignment), table);
+       gtk_widget_show (table);
+
+       gtk_box_pack_start (GTK_BOX (hbox), frame, TRUE, TRUE, 0);
+       gtk_widget_show (frame);
+
+       frame = gtk_frame_new (NULL);
+       gtk_frame_set_shadow_type (GTK_FRAME (frame), GTK_SHADOW_NONE);
+       gtk_frame_set_label_align (GTK_FRAME (frame), 0.5, 0.5);
+       label = gtk_label_new (NULL);
+       gtk_label_set_markup (GTK_LABEL (label), "<b>Page Thumbnail</b>");
+       gtk_frame_set_label_widget (GTK_FRAME (frame), label);
+       gtk_widget_show (label);
+
+       alignment = gtk_alignment_new (0.5, 0.5, 1, 1);
+       gtk_alignment_set_padding (GTK_ALIGNMENT (alignment), 5, 5, 12, 5);
+       gtk_container_add (GTK_CONTAINER (frame), alignment);
+       gtk_widget_show (alignment);
+       
+       thumnail_box = gtk_vbox_new (FALSE, 6);
+       
+       demo->thumbnail = gtk_image_new ();
+       gtk_box_pack_start (GTK_BOX (thumnail_box), demo->thumbnail, TRUE, TRUE, 0);
+       gtk_widget_show (demo->thumbnail);
+       
+       demo->thumbnail_size = gtk_label_new (NULL);
+       g_object_set (G_OBJECT (demo->thumbnail_size), "xalign", 0.5, NULL);
+       gtk_box_pack_start (GTK_BOX (thumnail_box), demo->thumbnail_size, TRUE, TRUE, 0);
+       gtk_widget_show (demo->thumbnail_size);
+
+       gtk_container_add (GTK_CONTAINER (alignment), thumnail_box);
+       gtk_widget_show (thumnail_box);
+
+       gtk_box_pack_start (GTK_BOX (hbox), frame, TRUE, TRUE, 0);
+       gtk_widget_show (frame);
+       
+       gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, TRUE, 0);
+       gtk_widget_show (hbox);
+
+       g_object_weak_ref (G_OBJECT (vbox),
+                          (GWeakNotify)pgd_page_free,
+                          (gpointer)demo);
+       
+       return vbox;
+}
diff --git a/glib/demo/page.h b/glib/demo/page.h
new file mode 100644 (file)
index 0000000..5b86a81
--- /dev/null
@@ -0,0 +1,31 @@
+/*
+ * Copyright (C) 2007 Carlos Garcia Campos  <carlosgc@gnome.org>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include <gtk/gtk.h>
+#include <poppler.h>
+
+#ifndef _PAGE_H_
+#define _PAGE_H_
+
+G_BEGIN_DECLS
+
+GtkWidget *pgd_page_create_widget (PopplerDocument *document);
+
+G_END_DECLS
+
+#endif /* _PAGE_H_ */
diff --git a/glib/demo/print.c b/glib/demo/print.c
new file mode 100644 (file)
index 0000000..17bbe0e
--- /dev/null
@@ -0,0 +1,232 @@
+/*
+ * Copyright (C) 2009 Carlos Garcia Campos  <carlosgc@gnome.org>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include "config.h"
+
+#include <gtk/gtk.h>
+#include "print.h"
+
+typedef enum {
+        PRINT_DOCUMENT,
+        PRINT_DOCUMENT_MARKUPS,
+        PRINT_DOCUMENT_STAMPS
+} PgdPrintOptions;
+
+typedef struct {
+       PopplerDocument *doc;
+        GtkWidget       *options_combo;
+        PgdPrintOptions  options;
+} PgdPrintDemo;
+
+#define PGD_PRINT_OPTIONS "pgd-print-options"
+
+static void
+pgd_print_free (PgdPrintDemo *demo)
+{
+       if (!demo)
+               return;
+
+       if (demo->doc) {
+               g_object_unref (demo->doc);
+               demo->doc = NULL;
+       }
+
+       g_free (demo);
+}
+
+static void
+pgd_print_begin_print (GtkPrintOperation *op,
+                      GtkPrintContext   *context,
+                      PgdPrintDemo      *demo)
+{
+       gtk_print_operation_set_n_pages (op, poppler_document_get_n_pages (demo->doc));
+}
+
+static void
+pgd_print_draw_page (GtkPrintOperation *op,
+                    GtkPrintContext   *context,
+                    gint               page_nr,
+                    PgdPrintDemo      *demo)
+{
+       PopplerPage      *page;
+       cairo_t          *cr;
+        GtkPrintSettings *settings;
+        PgdPrintOptions   options;
+        PopplerPrintFlags flags = 0;
+
+       page = poppler_document_get_page (demo->doc, page_nr);
+       if (!page)
+               return;
+
+        settings = gtk_print_operation_get_print_settings (op);
+        /* Workaround for gtk+ bug, we need to save the options ourselves */
+        options = demo->options;
+#if 0
+        options = gtk_print_settings_get_int_with_default (settings,
+                                                           PGD_PRINT_OPTIONS,
+                                                           PRINT_DOCUMENT_MARKUPS);
+#endif
+        switch (options) {
+        case PRINT_DOCUMENT:
+                flags |= POPPLER_PRINT_DOCUMENT;
+                break;
+        case PRINT_DOCUMENT_MARKUPS:
+                flags |= POPPLER_PRINT_MARKUP_ANNOTS;
+                break;
+        case PRINT_DOCUMENT_STAMPS:
+                flags |= POPPLER_PRINT_STAMP_ANNOTS_ONLY;
+                break;
+        default:
+                g_assert_not_reached ();
+        }
+
+       cr = gtk_print_context_get_cairo_context (context);
+       poppler_page_render_for_printing_with_options (page, cr, flags);
+       g_object_unref (page);
+}
+
+static GObject *
+pgd_print_create_custom_widget (GtkPrintOperation *op,
+                                PgdPrintDemo      *demo)
+{
+        GtkWidget        *hbox;
+        GtkWidget        *label, *combo;
+        GtkPrintSettings *settings;
+        PgdPrintOptions   options;
+
+        settings = gtk_print_operation_get_print_settings (op);
+        options = gtk_print_settings_get_int_with_default (settings,
+                                                           PGD_PRINT_OPTIONS,
+                                                           PRINT_DOCUMENT_MARKUPS);
+
+        hbox = gtk_hbox_new (FALSE, 0);
+        gtk_container_set_border_width (GTK_CONTAINER (hbox), 12);
+
+        label = gtk_label_new ("Print: ");
+        gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0);
+        gtk_widget_show (label);
+
+#if GTK_CHECK_VERSION (2, 24, 0)
+        combo = gtk_combo_box_text_new ();
+        gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (combo), "Document");
+        gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (combo), "Document and markup");
+        gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (combo), "Document and stamps");
+#else
+        combo = gtk_combo_box_new_text ();
+        gtk_combo_box_append_text (GTK_COMBO_BOX (combo), "Document");
+        gtk_combo_box_append_text (GTK_COMBO_BOX (combo), "Document and markup");
+        gtk_combo_box_append_text (GTK_COMBO_BOX (combo), "Document and stamps");
+#endif
+        demo->options_combo = combo;
+        gtk_combo_box_set_active (GTK_COMBO_BOX (combo), options);
+        gtk_box_pack_start (GTK_BOX (hbox), combo, FALSE, FALSE, 0);
+        gtk_widget_show (combo);
+
+        return G_OBJECT (hbox);
+}
+
+static void
+pgd_print_custom_widget_apply (GtkPrintOperation *op,
+                               GtkWidget         *widget,
+                               PgdPrintDemo      *demo)
+{
+        GtkPrintSettings *settings;
+        PgdPrintOptions   options;
+
+        settings = gtk_print_operation_get_print_settings (op);
+        options = gtk_combo_box_get_active (GTK_COMBO_BOX (demo->options_combo));
+        /* Workaround for gtk+ bug, we need to save the options ourselves */
+        demo->options = options;
+        gtk_print_settings_set_int (settings, PGD_PRINT_OPTIONS, options);
+}
+
+static void
+pgd_print_print (GtkWidget    *button,
+                PgdPrintDemo *demo)
+{
+       GtkPrintOperation *op;
+       GError            *error = NULL;
+
+       op = gtk_print_operation_new ();
+        gtk_print_operation_set_custom_tab_label (op, "PDF Options");
+       g_signal_connect (op, "begin-print",
+                         G_CALLBACK (pgd_print_begin_print),
+                         demo);
+       g_signal_connect (op, "draw-page",
+                         G_CALLBACK (pgd_print_draw_page),
+                         demo);
+        g_signal_connect (op, "create_custom_widget",
+                          G_CALLBACK (pgd_print_create_custom_widget),
+                          demo);
+        g_signal_connect (op, "custom_widget_apply",
+                          G_CALLBACK (pgd_print_custom_widget_apply),
+                          demo);
+       gtk_print_operation_run (op,
+                                GTK_PRINT_OPERATION_ACTION_PRINT_DIALOG,
+                                GTK_WINDOW (gtk_widget_get_toplevel (button)),
+                                &error);
+       if (error) {
+               GtkWidget *dialog;
+
+               dialog = gtk_message_dialog_new (GTK_WINDOW (gtk_widget_get_toplevel (button)),
+                                                GTK_DIALOG_DESTROY_WITH_PARENT,
+                                                GTK_MESSAGE_ERROR,
+                                                GTK_BUTTONS_CLOSE,
+                                                "%s", error->message);
+               g_error_free (error);
+
+               g_signal_connect (dialog, "response",
+                                 G_CALLBACK (gtk_widget_destroy), NULL);
+
+               gtk_widget_show (dialog);
+       }
+       g_object_unref (op);
+}
+
+GtkWidget *
+pgd_print_create_widget (PopplerDocument *document)
+{
+       PgdPrintDemo *demo;
+       GtkWidget    *vbox;
+       GtkWidget    *hbox;
+       GtkWidget    *button;
+
+       demo = g_new0 (PgdPrintDemo, 1);
+
+       demo->doc = g_object_ref (document);
+
+       vbox = gtk_vbox_new (FALSE, 12);
+
+       hbox = gtk_hbox_new (FALSE, 6);
+
+       button = gtk_button_new_with_label ("Print...");
+       g_signal_connect (G_OBJECT (button), "clicked",
+                         G_CALLBACK (pgd_print_print),
+                         (gpointer)demo);
+       gtk_box_pack_end (GTK_BOX (hbox), button, FALSE, FALSE, 0);
+       gtk_widget_show (button);
+
+       gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, TRUE, 0);
+       gtk_widget_show (hbox);
+
+       g_object_weak_ref (G_OBJECT (vbox),
+                          (GWeakNotify)pgd_print_free,
+                          (gpointer)demo);
+
+       return vbox;
+}
diff --git a/glib/demo/print.h b/glib/demo/print.h
new file mode 100644 (file)
index 0000000..667259c
--- /dev/null
@@ -0,0 +1,31 @@
+/*
+ * Copyright (C) 2009 Carlos Garcia Campos  <carlosgc@gnome.org>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include <gtk/gtk.h>
+#include <poppler.h>
+
+#ifndef _PRINT_H_
+#define _PRINT_H_
+
+G_BEGIN_DECLS
+
+GtkWidget *pgd_print_create_widget (PopplerDocument *document);
+
+G_END_DECLS
+
+#endif /* _PRINT_H_ */
diff --git a/glib/demo/render.c b/glib/demo/render.c
new file mode 100644 (file)
index 0000000..bb7afbd
--- /dev/null
@@ -0,0 +1,557 @@
+/*
+ * Copyright (C) 2007 Carlos Garcia Campos  <carlosgc@gnome.org>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include "config.h"
+
+#include <gtk/gtk.h>
+#include <cairo.h>
+
+#include "render.h"
+
+typedef enum {
+       PGD_RENDER_CAIRO,
+       PGD_RENDER_PIXBUF
+} PgdRenderMode;
+
+typedef struct {
+       PopplerDocument *doc;
+
+       /* Properties */
+       PgdRenderMode    mode;
+       gint             page;
+       gdouble          scale;
+       gint             rotate;
+       GdkRectangle     slice;
+       gboolean         printing;
+       
+       GtkWidget       *swindow;
+       GtkWidget       *darea;
+       GtkWidget       *slice_x;
+       GtkWidget       *slice_y;
+       GtkWidget       *slice_w;
+       GtkWidget       *slice_h;
+       GtkWidget       *timer_label;
+
+       cairo_surface_t *surface;
+       GdkPixbuf       *pixbuf;
+} PgdRenderDemo;
+
+static void
+pgd_render_free (PgdRenderDemo *demo)
+{
+       if (!demo)
+               return;
+
+       if (demo->doc) {
+               g_object_unref (demo->doc);
+               demo->doc = NULL;
+       }
+       
+       if (demo->surface) {
+               cairo_surface_destroy (demo->surface);
+               demo->surface = NULL;
+       }
+
+       if (demo->pixbuf) {
+               g_object_unref (demo->pixbuf);
+               demo->pixbuf = NULL;
+       }
+
+       g_free (demo);
+}
+
+static gboolean
+pgd_render_drawing_area_expose (GtkWidget      *area,
+                               GdkEventExpose *event,
+                               PgdRenderDemo  *demo)
+{
+       if (demo->mode == PGD_RENDER_CAIRO && !demo->surface)
+               return FALSE;
+
+       if (demo->mode == PGD_RENDER_PIXBUF && !demo->pixbuf)
+               return FALSE;
+
+       gdk_window_clear (gtk_widget_get_window (area));
+
+       if (demo->mode == PGD_RENDER_CAIRO) {
+               cairo_t *cr;
+
+               cr = gdk_cairo_create (gtk_widget_get_window (area));
+               cairo_set_source_surface (cr, demo->surface, 0, 0);
+               cairo_paint (cr);
+               cairo_destroy (cr);
+       } else if (demo->mode == PGD_RENDER_PIXBUF) {
+               gdk_draw_pixbuf (gtk_widget_get_window (area),
+                                gtk_widget_get_style(area)->fg_gc[GTK_STATE_NORMAL],
+                                demo->pixbuf,
+                                0, 0,
+                                0, 0,
+                                gdk_pixbuf_get_width (demo->pixbuf),
+                                gdk_pixbuf_get_height (demo->pixbuf),
+                                GDK_RGB_DITHER_NORMAL,
+                                0, 0);
+       } else {
+               g_assert_not_reached ();
+       }
+
+       return TRUE;
+}
+
+static void
+pgd_render_start (GtkButton     *button,
+                 PgdRenderDemo *demo)
+{
+       PopplerPage *page;
+       gdouble      page_width, page_height;
+       gdouble      width, height;
+       gint         x, y;
+       gchar       *str;
+       GTimer      *timer;
+
+       page = poppler_document_get_page (demo->doc, demo->page);
+       if (!page)
+               return;
+
+       if (demo->surface)
+               cairo_surface_destroy (demo->surface);
+       demo->surface = NULL;
+
+       if (demo->pixbuf)
+               g_object_unref (demo->pixbuf);
+       demo->pixbuf = NULL;
+       
+       poppler_page_get_size (page, &page_width, &page_height);
+
+       if (demo->rotate == 0 || demo->rotate == 180) {
+               width = demo->slice.width * demo->scale;
+               height = demo->slice.height * demo->scale;
+               x = demo->slice.x * demo->scale;
+               y = demo->slice.y * demo->scale;
+       } else {
+               width = demo->slice.height * demo->scale;
+               height = demo->slice.width * demo->scale;
+               x = demo->slice.y * demo->scale;
+               y = demo->slice.x * demo->scale;
+       }
+
+       if (demo->mode == PGD_RENDER_CAIRO) {
+               cairo_t *cr;
+
+               timer = g_timer_new ();
+               demo->surface = cairo_image_surface_create (CAIRO_FORMAT_ARGB32,
+                                                           width, height);
+               cr = cairo_create (demo->surface);
+
+               cairo_save (cr);
+               switch (demo->rotate) {
+               case 90:
+                       cairo_translate (cr, x + width, -y);
+                       break;
+               case 180:
+                       cairo_translate (cr, x + width, y + height);
+                       break;
+               case 270:
+                       cairo_translate (cr, -x, y + height);
+                       break;
+               default:
+                       cairo_translate (cr, -x, -y);
+               }
+
+               if (demo->scale != 1.0)
+                       cairo_scale (cr, demo->scale, demo->scale);
+               
+               if (demo->rotate != 0)
+                       cairo_rotate (cr, demo->rotate * G_PI / 180.0);
+
+               if (demo->printing)
+                       poppler_page_render_for_printing (page, cr);
+               else
+                       poppler_page_render (page, cr);
+               cairo_restore (cr);
+
+               cairo_set_operator (cr, CAIRO_OPERATOR_DEST_OVER);
+               cairo_set_source_rgb (cr, 1., 1., 1.);
+               cairo_paint (cr);
+
+               g_timer_stop (timer);
+               
+               cairo_destroy (cr);
+       } else if (demo->mode == PGD_RENDER_PIXBUF) {
+#ifdef POPPLER_WITH_GDK
+               timer = g_timer_new ();
+               demo->pixbuf = gdk_pixbuf_new (GDK_COLORSPACE_RGB,
+                                              FALSE, 8, width, height);
+               gdk_pixbuf_fill (demo->pixbuf, 0xffffff);
+               if (demo->printing) {
+                       poppler_page_render_to_pixbuf_for_printing (page,
+                                                                   x, y,
+                                                                   width,
+                                                                   height,
+                                                                   demo->scale,
+                                                                   demo->rotate,
+                                                                   demo->pixbuf);
+               } else {
+                       poppler_page_render_to_pixbuf (page,
+                                                      x, y,
+                                                      width,
+                                                      height,
+                                                      demo->scale,
+                                                      demo->rotate,
+                                                      demo->pixbuf);
+               }
+               g_timer_stop (timer);
+#endif /* POPPLER_WITH_GDK */
+       } else {
+               g_assert_not_reached ();
+       }
+
+       g_object_unref (page);
+       
+       str = g_strdup_printf ("<i>Page rendered in %.4f seconds</i>",
+                              g_timer_elapsed (timer, NULL));
+       gtk_label_set_markup (GTK_LABEL (demo->timer_label), str);
+       g_free (str);
+       
+       g_timer_destroy (timer);
+       
+       gtk_widget_set_size_request (demo->darea, width, height);
+       gtk_widget_queue_draw (demo->darea);
+}
+       
+static void
+pgd_render_slice_selector_setup (PgdRenderDemo *demo)
+{
+       PopplerPage *page;
+       gdouble      width, height;
+
+       page = poppler_document_get_page (demo->doc, demo->page);
+       if (!page)
+               return;
+
+       poppler_page_get_size (page, &width, &height);
+       
+       gtk_spin_button_set_range (GTK_SPIN_BUTTON (demo->slice_x), 0, width);
+       gtk_spin_button_set_range (GTK_SPIN_BUTTON (demo->slice_y), 0, height);
+       gtk_spin_button_set_range (GTK_SPIN_BUTTON (demo->slice_w), 0, width);
+       gtk_spin_button_set_range (GTK_SPIN_BUTTON (demo->slice_h), 0, height);
+
+       gtk_spin_button_set_value (GTK_SPIN_BUTTON (demo->slice_x), 0);
+       gtk_spin_button_set_value (GTK_SPIN_BUTTON (demo->slice_y), 0);
+       gtk_spin_button_set_value (GTK_SPIN_BUTTON (demo->slice_w), width);
+       gtk_spin_button_set_value (GTK_SPIN_BUTTON (demo->slice_h), height);
+
+       g_object_unref (page);
+}
+
+static void
+pgd_render_page_selector_value_changed (GtkSpinButton *spinbutton,
+                                       PgdRenderDemo *demo)
+{
+       demo->page = (gint)gtk_spin_button_get_value (spinbutton) - 1;
+       pgd_render_slice_selector_setup (demo);
+}
+
+static void
+pgd_render_scale_selector_value_changed (GtkSpinButton *spinbutton,
+                                        PgdRenderDemo *demo)
+{
+       demo->scale = gtk_spin_button_get_value (spinbutton);
+}
+
+static void
+pgd_render_rotate_selector_changed (GtkComboBox   *combobox,
+                                   PgdRenderDemo *demo)
+{
+       demo->rotate = gtk_combo_box_get_active (combobox) * 90;
+}
+
+static void
+pgd_render_printing_selector_changed (GtkToggleButton *tooglebutton,
+                                     PgdRenderDemo *demo)
+{
+       demo->printing = gtk_toggle_button_get_active (tooglebutton);
+}
+
+static void
+pgd_render_mode_selector_changed (GtkComboBox   *combobox,
+                                 PgdRenderDemo *demo)
+{
+       demo->mode = gtk_combo_box_get_active (combobox);
+}
+
+static void
+pgd_render_slice_selector_value_changed (GtkSpinButton *spinbutton,
+                                        PgdRenderDemo *demo)
+{
+       demo->slice.x = (gint)gtk_spin_button_get_value (GTK_SPIN_BUTTON (demo->slice_x));
+       demo->slice.y = (gint)gtk_spin_button_get_value (GTK_SPIN_BUTTON (demo->slice_y));
+       demo->slice.width = (gint)gtk_spin_button_get_value (GTK_SPIN_BUTTON (demo->slice_w));
+       demo->slice.height = (gint)gtk_spin_button_get_value (GTK_SPIN_BUTTON (demo->slice_h));
+}
+
+GtkWidget *
+pgd_render_properties_selector_create (PgdRenderDemo *demo)
+{
+       GtkWidget *hbox, *vbox;
+       GtkWidget *label;
+       GtkWidget *page_hbox, *page_selector;
+       GtkWidget *scale_hbox, *scale_selector;
+       GtkWidget *rotate_hbox, *rotate_selector;
+       GtkWidget *mode_hbox, *mode_selector;
+       GtkWidget *printing_selector;
+       GtkWidget *slice_hbox, *slice_selector;
+       GtkWidget *button;
+       gint       n_pages;
+       gchar     *str;
+
+       n_pages = poppler_document_get_n_pages (demo->doc);
+
+       vbox = gtk_vbox_new (FALSE, 6);
+       
+       hbox = gtk_hbox_new (FALSE, 12);
+       gtk_box_pack_start (GTK_BOX (vbox), hbox, TRUE, TRUE, 0);
+       gtk_widget_show (hbox);
+
+       page_hbox = gtk_hbox_new (FALSE, 6);
+
+       label = gtk_label_new ("Page:");
+       gtk_box_pack_start (GTK_BOX (page_hbox), label, TRUE, TRUE, 0);
+       gtk_widget_show (label);
+       
+       page_selector = gtk_spin_button_new_with_range (1, n_pages, 1);
+       g_signal_connect (G_OBJECT (page_selector), "value-changed",
+                         G_CALLBACK (pgd_render_page_selector_value_changed),
+                         (gpointer)demo);
+       gtk_box_pack_start (GTK_BOX (page_hbox), page_selector, TRUE, TRUE, 0);
+       gtk_widget_show (page_selector);
+
+       str = g_strdup_printf ("of %d", n_pages);
+       label = gtk_label_new (str);
+       gtk_box_pack_start (GTK_BOX (page_hbox), label, TRUE, TRUE, 0);
+       gtk_widget_show (label);
+       g_free (str);
+
+       gtk_box_pack_start (GTK_BOX (hbox), page_hbox, FALSE, TRUE, 0);
+       gtk_widget_show (page_hbox);
+
+       scale_hbox = gtk_hbox_new (FALSE, 6);
+       
+       label = gtk_label_new ("Scale:");
+       gtk_box_pack_start (GTK_BOX (scale_hbox), label, TRUE, TRUE, 0);
+       gtk_widget_show (label);
+       
+       scale_selector = gtk_spin_button_new_with_range (0, 10.0, 0.1);
+       gtk_spin_button_set_value (GTK_SPIN_BUTTON (scale_selector), 1.0);
+       g_signal_connect (G_OBJECT (scale_selector), "value-changed",
+                         G_CALLBACK (pgd_render_scale_selector_value_changed),
+                         (gpointer)demo);
+       gtk_box_pack_start (GTK_BOX (scale_hbox), scale_selector, TRUE, TRUE, 0);
+       gtk_widget_show (scale_selector);
+
+       gtk_box_pack_start (GTK_BOX (hbox), scale_hbox, FALSE, TRUE, 0);
+       gtk_widget_show (scale_hbox);
+
+       rotate_hbox = gtk_hbox_new (FALSE, 6);
+
+       label = gtk_label_new ("Rotate:");
+       gtk_box_pack_start (GTK_BOX (rotate_hbox), label, TRUE, TRUE, 0);
+       gtk_widget_show (label);
+
+#if GTK_CHECK_VERSION (2, 24, 0)
+       rotate_selector = gtk_combo_box_text_new ();
+       gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (rotate_selector), "0");
+       gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (rotate_selector), "90");
+       gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (rotate_selector), "180");
+       gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (rotate_selector), "270");
+#else
+       rotate_selector = gtk_combo_box_new_text ();
+       gtk_combo_box_append_text (GTK_COMBO_BOX (rotate_selector), "0");
+       gtk_combo_box_append_text (GTK_COMBO_BOX (rotate_selector), "90");
+       gtk_combo_box_append_text (GTK_COMBO_BOX (rotate_selector), "180");
+       gtk_combo_box_append_text (GTK_COMBO_BOX (rotate_selector), "270");
+#endif
+       gtk_combo_box_set_active (GTK_COMBO_BOX (rotate_selector), 0);
+       g_signal_connect (G_OBJECT (rotate_selector), "changed",
+                         G_CALLBACK (pgd_render_rotate_selector_changed),
+                         (gpointer)demo);
+       gtk_box_pack_start (GTK_BOX (rotate_hbox), rotate_selector, TRUE, TRUE, 0);
+       gtk_widget_show (rotate_selector);
+
+       gtk_box_pack_start (GTK_BOX (hbox), rotate_hbox, FALSE, TRUE, 0);
+       gtk_widget_show (rotate_hbox);
+
+       mode_hbox = gtk_hbox_new (FALSE, 6);
+
+       label = gtk_label_new ("Mode:");
+       gtk_box_pack_start (GTK_BOX (mode_hbox), label, TRUE, TRUE, 0);
+       gtk_widget_show (label);
+
+#if GTK_CHECK_VERSION (2, 24, 0)
+       mode_selector = gtk_combo_box_text_new ();
+       gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (mode_selector), "cairo");
+#ifdef POPPLER_WITH_GDK
+       gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (mode_selector), "pixbuf");
+#endif
+#else // ! GTK_CHECK_VERSION (2, 24, 0)
+       mode_selector = gtk_combo_box_new_text ();
+       gtk_combo_box_append_text (GTK_COMBO_BOX (mode_selector), "cairo");
+#ifdef POPPLER_WITH_GDK
+       gtk_combo_box_append_text (GTK_COMBO_BOX (mode_selector), "pixbuf");
+#endif
+#endif // GTK_CHECK_VERSION (2, 24, 0)
+       gtk_combo_box_set_active (GTK_COMBO_BOX (mode_selector), 0);
+       g_signal_connect (G_OBJECT (mode_selector), "changed",
+                         G_CALLBACK (pgd_render_mode_selector_changed),
+                         (gpointer)demo);
+       gtk_box_pack_start (GTK_BOX (mode_hbox), mode_selector, TRUE, TRUE, 0);
+       gtk_widget_show (mode_selector);
+
+       gtk_box_pack_start (GTK_BOX (hbox), mode_hbox, FALSE, TRUE, 0);
+       gtk_widget_show (mode_hbox);
+
+       printing_selector = gtk_check_button_new_with_label ("Printing");
+       g_signal_connect (printing_selector, "toggled",
+                         G_CALLBACK (pgd_render_printing_selector_changed),
+                         (gpointer)demo);
+       gtk_box_pack_start (GTK_BOX (hbox), printing_selector, FALSE, TRUE, 0);
+       gtk_widget_show (printing_selector);
+
+       hbox = gtk_hbox_new (FALSE, 12);
+       gtk_box_pack_start (GTK_BOX (vbox), hbox, TRUE, TRUE, 0);
+       gtk_widget_show (hbox);
+
+       slice_hbox = gtk_hbox_new (FALSE, 6);
+
+       label = gtk_label_new ("x:");
+       gtk_box_pack_start (GTK_BOX (slice_hbox), label, TRUE, TRUE, 0);
+       gtk_widget_show (label);
+
+       demo->slice_x = gtk_spin_button_new_with_range (0, 0, 1.0);
+       g_signal_connect (G_OBJECT (demo->slice_x), "value-changed",
+                         G_CALLBACK (pgd_render_slice_selector_value_changed),
+                         (gpointer)demo);
+       gtk_box_pack_start (GTK_BOX (slice_hbox), demo->slice_x, TRUE, TRUE, 0);
+       gtk_widget_show (demo->slice_x);
+
+       gtk_box_pack_start (GTK_BOX (hbox), slice_hbox, FALSE, TRUE, 0);
+       gtk_widget_show (slice_hbox);
+
+       slice_hbox = gtk_hbox_new (FALSE, 6);
+       
+       label = gtk_label_new ("y:");
+       gtk_box_pack_start (GTK_BOX (slice_hbox), label, TRUE, TRUE, 0);
+       gtk_widget_show (label);
+
+       demo->slice_y = gtk_spin_button_new_with_range (0, 0, 1.0);
+       g_signal_connect (G_OBJECT (demo->slice_y), "value-changed",
+                         G_CALLBACK (pgd_render_slice_selector_value_changed),
+                         (gpointer)demo);
+       gtk_box_pack_start (GTK_BOX (slice_hbox), demo->slice_y, TRUE, TRUE, 0);
+       gtk_widget_show (demo->slice_y);
+
+       gtk_box_pack_start (GTK_BOX (hbox), slice_hbox, FALSE, TRUE, 0);
+       gtk_widget_show (slice_hbox);
+       
+       slice_hbox = gtk_hbox_new (FALSE, 6);
+       
+       label = gtk_label_new ("width:");
+       gtk_box_pack_start (GTK_BOX (slice_hbox), label, TRUE, TRUE, 0);
+       gtk_widget_show (label);
+
+       demo->slice_w = gtk_spin_button_new_with_range (0, 0, 1.0);
+       g_signal_connect (G_OBJECT (demo->slice_w), "value-changed",
+                         G_CALLBACK (pgd_render_slice_selector_value_changed),
+                         (gpointer)demo);
+       gtk_box_pack_start (GTK_BOX (slice_hbox), demo->slice_w, TRUE, TRUE, 0);
+       gtk_widget_show (demo->slice_w);
+
+       gtk_box_pack_start (GTK_BOX (hbox), slice_hbox, FALSE, TRUE, 0);
+       gtk_widget_show (slice_hbox);
+       
+       slice_hbox = gtk_hbox_new (FALSE, 6);
+       
+       label = gtk_label_new ("height:");
+       gtk_box_pack_start (GTK_BOX (slice_hbox), label, TRUE, TRUE, 0);
+       gtk_widget_show (label);
+
+       demo->slice_h = gtk_spin_button_new_with_range (0, 0, 1.0);
+       g_signal_connect (G_OBJECT (demo->slice_h), "value-changed",
+                         G_CALLBACK (pgd_render_slice_selector_value_changed),
+                         (gpointer)demo);
+       gtk_box_pack_start (GTK_BOX (slice_hbox), demo->slice_h, TRUE, TRUE, 0);
+       gtk_widget_show (demo->slice_h);
+
+       gtk_box_pack_start (GTK_BOX (hbox), slice_hbox, FALSE, TRUE, 0);
+       gtk_widget_show (slice_hbox);
+
+       pgd_render_slice_selector_setup (demo);
+
+       button = gtk_button_new_with_label ("Render");
+       g_signal_connect (G_OBJECT (button), "clicked",
+                         G_CALLBACK (pgd_render_start),
+                         (gpointer)demo);
+       gtk_box_pack_end (GTK_BOX (hbox), button, FALSE, TRUE, 0);
+       gtk_widget_show (button);
+
+       demo->timer_label = gtk_label_new (NULL);
+       gtk_label_set_markup (GTK_LABEL (demo->timer_label), "<i>No page rendered</i>");
+       g_object_set (G_OBJECT (demo->timer_label), "xalign", 1.0, NULL);
+       gtk_box_pack_end (GTK_BOX (vbox), demo->timer_label, FALSE, TRUE, 0);
+       gtk_widget_show (demo->timer_label);
+
+       return vbox;
+}
+
+GtkWidget *
+pgd_render_create_widget (PopplerDocument *document)
+{
+       PgdRenderDemo *demo;
+       GtkWidget     *vbox, *hbox;
+
+       demo = g_new0 (PgdRenderDemo, 1);
+
+       demo->doc = g_object_ref (document);
+       demo->scale = 1.0;
+
+       vbox = gtk_vbox_new (FALSE, 6);
+
+       hbox = pgd_render_properties_selector_create (demo);
+       gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, TRUE, 6);
+       gtk_widget_show (hbox);
+
+       demo->darea = gtk_drawing_area_new ();
+       g_signal_connect (G_OBJECT (demo->darea), "expose_event",
+                         G_CALLBACK (pgd_render_drawing_area_expose),
+                         (gpointer)demo);
+       
+       demo->swindow = gtk_scrolled_window_new (NULL, NULL);
+       gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (demo->swindow),
+                                       GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
+       gtk_scrolled_window_add_with_viewport (GTK_SCROLLED_WINDOW (demo->swindow),
+                                              demo->darea);
+       gtk_widget_show (demo->darea);
+
+       gtk_box_pack_start (GTK_BOX (vbox), demo->swindow, TRUE, TRUE, 0);
+       gtk_widget_show (demo->swindow);
+
+       g_object_weak_ref (G_OBJECT (demo->swindow),
+                          (GWeakNotify)pgd_render_free,
+                          (gpointer)demo);
+
+       return vbox;
+}
diff --git a/glib/demo/render.h b/glib/demo/render.h
new file mode 100644 (file)
index 0000000..46f7039
--- /dev/null
@@ -0,0 +1,31 @@
+/*
+ * Copyright (C) 2007 Carlos Garcia Campos  <carlosgc@gnome.org>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include <gtk/gtk.h>
+#include <poppler.h>
+
+#ifndef _RENDER_H_
+#define _RENDER_H_
+
+G_BEGIN_DECLS
+
+GtkWidget *pgd_render_create_widget (PopplerDocument *document);
+
+G_END_DECLS
+
+#endif /* _RENDER_H_ */
diff --git a/glib/demo/selections.c b/glib/demo/selections.c
new file mode 100644 (file)
index 0000000..bfd9070
--- /dev/null
@@ -0,0 +1,686 @@
+/*
+ * Copyright (C) 2010 Carlos Garcia Campos  <carlosgc@gnome.org>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include "config.h"
+
+#include <gtk/gtk.h>
+#include <cairo.h>
+
+#include "selections.h"
+
+typedef struct {
+       PopplerDocument      *doc;
+
+       /* Properties */
+       gint                  page_index;
+       gdouble               scale;
+
+       GtkWidget            *swindow;
+       GtkWidget            *darea;
+       GtkWidget            *fg_color_button;
+       GtkWidget            *bg_color_button;
+       GtkWidget            *copy_button;
+
+       PopplerPage          *page;
+       cairo_surface_t      *surface;
+
+       GdkPoint              start;
+       GdkPoint              stop;
+       PopplerRectangle      doc_area;
+       cairo_surface_t      *selection_surface;
+       PopplerSelectionStyle style;
+       PopplerColor          glyph_color;
+       PopplerColor          background_color;
+       guint                 selections_idle;
+       cairo_region_t       *selection_region;
+       cairo_region_t       *selected_region;
+       GdkCursorType         cursor;
+       gchar                *selected_text;
+} PgdSelectionsDemo;
+
+static void
+pgd_selections_clear_selections (PgdSelectionsDemo *demo)
+{
+       demo->start.x = -1;
+
+       if (demo->selection_surface) {
+               cairo_surface_destroy (demo->selection_surface);
+               demo->selection_surface = NULL;
+       }
+
+       if (demo->selection_region) {
+               cairo_region_destroy (demo->selection_region);
+               demo->selection_region = NULL;
+       }
+
+       if (demo->selected_text) {
+               g_free (demo->selected_text);
+               demo->selected_text = NULL;
+       }
+
+       if (demo->selected_region) {
+               cairo_region_destroy (demo->selected_region);
+               demo->selected_region = NULL;
+       }
+       gtk_widget_set_sensitive(demo->copy_button, FALSE);
+}
+
+static void
+pgd_selections_free (PgdSelectionsDemo *demo)
+{
+       if (!demo)
+               return;
+
+       if (demo->selections_idle > 0) {
+               g_source_remove (demo->selections_idle);
+               demo->selections_idle = 0;
+       }
+
+       if (demo->doc) {
+               g_object_unref (demo->doc);
+               demo->doc = NULL;
+       }
+
+       if (demo->page) {
+               g_object_unref (demo->page);
+               demo->page = NULL;
+       }
+
+       if (demo->surface) {
+               cairo_surface_destroy (demo->surface);
+               demo->surface = NULL;
+       }
+
+       pgd_selections_clear_selections (demo);
+
+       g_free (demo);
+}
+
+static void
+pgd_selections_update_selection_region (PgdSelectionsDemo *demo)
+{
+       PopplerRectangle area = { 0, 0, 0, 0 };
+
+       if (demo->selection_region)
+               cairo_region_destroy (demo->selection_region);
+
+       poppler_page_get_size (demo->page, &area.x2, &area.y2);
+       demo->selection_region = poppler_page_get_selected_region (demo->page,
+                                                                   1.0,
+                                                                   POPPLER_SELECTION_GLYPH,
+                                                                   &area);
+}
+
+static void
+pgd_selections_update_selected_text (PgdSelectionsDemo *demo)
+{
+       GList *region;
+       gchar *text;
+
+       if (demo->selected_region)
+               cairo_region_destroy (demo->selected_region);
+       demo->selected_region = poppler_page_get_selected_region (demo->page,
+                                                                  1.0,
+                                                                  demo->style,
+                                                                  &demo->doc_area);
+       if (demo->selected_text)
+               g_free (demo->selected_text);
+       demo->selected_text = NULL;
+
+       text = poppler_page_get_selected_text (demo->page,
+                                              demo->style,
+                                              &demo->doc_area);
+       if (text) {
+               demo->selected_text = g_utf8_normalize (text, -1, G_NORMALIZE_NFKC);
+               g_free (text);
+               gtk_widget_set_sensitive(demo->copy_button, TRUE);
+       }
+}
+
+static void
+pgd_selections_update_cursor (PgdSelectionsDemo *demo,
+                             GdkCursorType      cursor_type)
+{
+       GdkWindow *window = gtk_widget_get_window (demo->darea);
+       GdkCursor *cursor = NULL;
+
+       if (cursor_type == demo->cursor)
+               return;
+
+       if (cursor_type != GDK_LAST_CURSOR) {
+               cursor = gdk_cursor_new_for_display (gtk_widget_get_display (demo->darea),
+                                                    cursor_type);
+       }
+
+       demo->cursor = cursor_type;
+
+       gdk_window_set_cursor (window, cursor);
+       gdk_flush ();
+       if (cursor)
+               gdk_cursor_unref (cursor);
+}
+
+static gboolean
+pgd_selections_render_selections (PgdSelectionsDemo *demo)
+{
+       PopplerRectangle doc_area;
+       gdouble page_width, page_height;
+       cairo_t *cr;
+
+       if (!demo->page || demo->start.x == -1) {
+               demo->selections_idle = 0;
+
+               return FALSE;
+       }
+
+       poppler_page_get_size (demo->page, &page_width, &page_height);
+       page_width *= demo->scale;
+       page_height *= demo->scale;
+
+       doc_area.x1 = demo->start.x / demo->scale;
+       doc_area.y1 = demo->start.y / demo->scale;
+       doc_area.x2 = demo->stop.x / demo->scale;
+       doc_area.y2 = demo->stop.y / demo->scale;
+
+       if (demo->selection_surface)
+               cairo_surface_destroy (demo->selection_surface);
+       demo->selection_surface = cairo_image_surface_create (CAIRO_FORMAT_ARGB32,
+                                                             page_width, page_height);
+       cr = cairo_create (demo->selection_surface);
+       if (demo->scale != 1.0)
+               cairo_scale (cr, demo->scale, demo->scale);
+       poppler_page_render_selection (demo->page, cr,
+                                      &doc_area, &demo->doc_area,
+                                      demo->style,
+                                      &demo->glyph_color,
+                                      &demo->background_color);
+       cairo_destroy (cr);
+
+       demo->doc_area = doc_area;
+       gtk_widget_queue_draw (demo->darea);
+
+       demo->selections_idle = 0;
+
+       return FALSE;
+}
+
+static gboolean
+pgd_selections_drawing_area_expose (GtkWidget         *area,
+                                   GdkEventExpose    *event,
+                                   PgdSelectionsDemo *demo)
+{
+       cairo_t *cr;
+
+       if (!demo->surface)
+               return FALSE;
+
+       gdk_window_clear (gtk_widget_get_window (area));
+
+       cr = gdk_cairo_create (gtk_widget_get_window (area));
+
+       cairo_save (cr);
+       cairo_set_source_surface (cr, demo->surface, 0, 0);
+       cairo_paint (cr);
+       cairo_restore (cr);
+
+       if (demo->selection_surface) {
+               cairo_set_source_surface (cr, demo->selection_surface, 0, 0);
+               cairo_paint (cr);
+       }
+
+       cairo_destroy (cr);
+
+       return TRUE;
+}
+
+static gboolean
+pgd_selections_drawing_area_button_press (GtkWidget         *area,
+                                         GdkEventButton    *event,
+                                         PgdSelectionsDemo *demo)
+{
+       if (!demo->page)
+               return FALSE;
+
+       if (event->button != 1)
+               return FALSE;
+
+       demo->start.x = event->x;
+       demo->start.y = event->y;
+       demo->stop = demo->start;
+
+       switch (event->type) {
+       case GDK_2BUTTON_PRESS:
+               demo->style = POPPLER_SELECTION_WORD;
+               break;
+       case GDK_3BUTTON_PRESS:
+               demo->style = POPPLER_SELECTION_LINE;
+               break;
+       default:
+               demo->style = POPPLER_SELECTION_GLYPH;
+       }
+
+       pgd_selections_render_selections (demo);
+
+       return TRUE;
+}
+
+static gboolean
+pgd_selections_drawing_area_motion_notify (GtkWidget         *area,
+                                          GdkEventMotion    *event,
+                                          PgdSelectionsDemo *demo)
+{
+       if (!demo->page)
+               return FALSE;
+
+       if (demo->start.x != -1) {
+               demo->stop.x = event->x;
+               demo->stop.y = event->y;
+               if (demo->selections_idle == 0) {
+                       demo->selections_idle =
+                               g_idle_add ((GSourceFunc)pgd_selections_render_selections,
+                                           demo);
+               }
+       } else {
+               gboolean over_text;
+
+               over_text = cairo_region_contains_point (demo->selection_region,
+                                                         event->x / demo->scale,
+                                                         event->y / demo->scale);
+               pgd_selections_update_cursor (demo, over_text ? GDK_XTERM : GDK_LAST_CURSOR);
+       }
+
+       return TRUE;
+}
+
+static gboolean
+pgd_selections_drawing_area_button_release (GtkWidget         *area,
+                                           GdkEventButton    *event,
+                                           PgdSelectionsDemo *demo)
+{
+       if (!demo->page)
+               return FALSE;
+
+       if (event->button != 1)
+               return FALSE;
+
+       if (demo->start.x != -1)
+               pgd_selections_update_selected_text (demo);
+
+       demo->start.x = -1;
+
+       if (demo->selections_idle > 0) {
+               g_source_remove (demo->selections_idle);
+               demo->selections_idle = 0;
+       }
+
+       return TRUE;
+}
+
+static void
+pgd_selections_drawing_area_realize (GtkWidget         *area,
+                                    PgdSelectionsDemo *demo)
+{
+       GtkStyle *style = gtk_widget_get_style (area);
+
+       gtk_widget_add_events (area,
+                              GDK_POINTER_MOTION_HINT_MASK |
+                              GDK_BUTTON1_MOTION_MASK |
+                              GDK_BUTTON_PRESS_MASK |
+                              GDK_BUTTON_RELEASE_MASK);
+       g_object_set (area, "has-tooltip", TRUE, NULL);
+
+       gtk_color_button_set_color (GTK_COLOR_BUTTON (demo->fg_color_button),
+                                   &style->text[GTK_STATE_SELECTED]);
+       gtk_color_button_set_color (GTK_COLOR_BUTTON (demo->bg_color_button),
+                                   &style->base[GTK_STATE_SELECTED]);
+}
+
+static gboolean
+pgd_selections_drawing_area_query_tooltip (GtkWidget         *area,
+                                          gint               x,
+                                          gint               y,
+                                          gboolean           keyboard_mode,
+                                          GtkTooltip        *tooltip,
+                                          PgdSelectionsDemo *demo)
+{
+       gboolean over_selection;
+
+       if (!demo->selected_text)
+               return FALSE;
+
+       over_selection = cairo_region_contains_point (demo->selected_region,
+                                                      x / demo->scale,
+                                                      y / demo->scale);
+
+       if (over_selection) {
+               GdkRectangle selection_area;
+
+               cairo_region_get_extents (demo->selected_region,
+                                          (cairo_rectangle_int_t *)&selection_area);
+               selection_area.x *= demo->scale;
+               selection_area.y *= demo->scale;
+               selection_area.width *= demo->scale;
+               selection_area.height *= demo->scale;
+
+               gtk_tooltip_set_text (tooltip, demo->selected_text);
+               gtk_tooltip_set_tip_area (tooltip, &selection_area);
+
+               return TRUE;
+       }
+
+       return FALSE;
+}
+
+static void
+pgd_selections_render (GtkButton         *button,
+                      PgdSelectionsDemo *demo)
+{
+       gdouble  page_width, page_height;
+       cairo_t *cr;
+
+       if (!demo->page)
+               demo->page = poppler_document_get_page (demo->doc, demo->page_index);
+
+       if (!demo->page)
+               return;
+
+       pgd_selections_clear_selections (demo);
+       pgd_selections_update_selection_region (demo);
+
+       if (demo->surface)
+               cairo_surface_destroy (demo->surface);
+       demo->surface = NULL;
+
+       poppler_page_get_size (demo->page, &page_width, &page_height);
+       page_width *= demo->scale;
+       page_height *= demo->scale;
+
+       demo->surface = cairo_image_surface_create (CAIRO_FORMAT_ARGB32,
+                                                   page_width, page_height);
+       cr = cairo_create (demo->surface);
+
+       cairo_save (cr);
+
+       if (demo->scale != 1.0)
+               cairo_scale (cr, demo->scale, demo->scale);
+
+       poppler_page_render (demo->page, cr);
+       cairo_restore (cr);
+
+       cairo_set_operator (cr, CAIRO_OPERATOR_DEST_OVER);
+       cairo_set_source_rgb (cr, 1., 1., 1.);
+       cairo_paint (cr);
+
+       cairo_destroy (cr);
+
+       gtk_widget_set_size_request (demo->darea, page_width, page_height);
+       gtk_widget_queue_draw (demo->darea);
+}
+
+static void
+pgd_selections_copy (GtkButton         *button,
+                    PgdSelectionsDemo *demo)
+{
+       GtkClipboard *clipboard = gtk_clipboard_get_for_display(gdk_display_get_default(),
+                                                               GDK_SELECTION_CLIPBOARD);
+       gtk_clipboard_set_text (clipboard, demo->selected_text, -1);
+}
+
+static void
+pgd_selections_page_selector_value_changed (GtkSpinButton     *spinbutton,
+                                           PgdSelectionsDemo *demo)
+{
+       demo->page_index = (gint)gtk_spin_button_get_value (spinbutton) - 1;
+       if (demo->page)
+               g_object_unref (demo->page);
+       demo->page = NULL;
+}
+
+static void
+pgd_selections_scale_selector_value_changed (GtkSpinButton     *spinbutton,
+                                            PgdSelectionsDemo *demo)
+{
+       demo->scale = gtk_spin_button_get_value (spinbutton);
+}
+
+static void
+pgd_selections_fg_color_changed (GtkColorButton    *button,
+                                GParamSpec        *pspec,
+                                PgdSelectionsDemo *demo)
+{
+       GdkColor color;
+
+       gtk_color_button_get_color (GTK_COLOR_BUTTON (button), &color);
+       demo->glyph_color.red = color.red;
+       demo->glyph_color.green = color.green;
+       demo->glyph_color.blue = color.blue;
+}
+
+static void
+pgd_selections_bg_color_changed (GtkColorButton    *button,
+                                GParamSpec        *pspec,
+                                PgdSelectionsDemo *demo)
+{
+       GdkColor color;
+
+       gtk_color_button_get_color (GTK_COLOR_BUTTON (button), &color);
+       demo->background_color.red = color.red;
+       demo->background_color.green = color.green;
+       demo->background_color.blue = color.blue;
+}
+
+GtkWidget *
+pgd_selections_properties_selector_create (PgdSelectionsDemo *demo)
+{
+       GtkWidget *hbox, *vbox;
+       GtkWidget *label;
+       GtkWidget *page_hbox, *page_selector;
+       GtkWidget *scale_hbox, *scale_selector;
+       GtkWidget *rotate_hbox, *rotate_selector;
+       GtkWidget *color_hbox;
+       GtkWidget *button;
+       gint       n_pages;
+       gchar     *str;
+
+       n_pages = poppler_document_get_n_pages (demo->doc);
+
+       vbox = gtk_vbox_new (FALSE, 6);
+
+       hbox = gtk_hbox_new (FALSE, 12);
+       gtk_box_pack_start (GTK_BOX (vbox), hbox, TRUE, TRUE, 0);
+       gtk_widget_show (hbox);
+
+       page_hbox = gtk_hbox_new (FALSE, 6);
+
+       label = gtk_label_new ("Page:");
+       gtk_box_pack_start (GTK_BOX (page_hbox), label, TRUE, TRUE, 0);
+       gtk_widget_show (label);
+
+       page_selector = gtk_spin_button_new_with_range (1, n_pages, 1);
+       g_signal_connect (G_OBJECT (page_selector), "value-changed",
+                         G_CALLBACK (pgd_selections_page_selector_value_changed),
+                         (gpointer)demo);
+       gtk_box_pack_start (GTK_BOX (page_hbox), page_selector, TRUE, TRUE, 0);
+       gtk_widget_show (page_selector);
+
+       str = g_strdup_printf ("of %d", n_pages);
+       label = gtk_label_new (str);
+       gtk_box_pack_start (GTK_BOX (page_hbox), label, TRUE, TRUE, 0);
+       gtk_widget_show (label);
+       g_free (str);
+
+       gtk_box_pack_start (GTK_BOX (hbox), page_hbox, FALSE, TRUE, 0);
+       gtk_widget_show (page_hbox);
+
+       scale_hbox = gtk_hbox_new (FALSE, 6);
+
+       label = gtk_label_new ("Scale:");
+       gtk_box_pack_start (GTK_BOX (scale_hbox), label, TRUE, TRUE, 0);
+       gtk_widget_show (label);
+
+       scale_selector = gtk_spin_button_new_with_range (0, 10.0, 0.1);
+       gtk_spin_button_set_value (GTK_SPIN_BUTTON (scale_selector), 1.0);
+       g_signal_connect (G_OBJECT (scale_selector), "value-changed",
+                         G_CALLBACK (pgd_selections_scale_selector_value_changed),
+                         (gpointer)demo);
+       gtk_box_pack_start (GTK_BOX (scale_hbox), scale_selector, TRUE, TRUE, 0);
+       gtk_widget_show (scale_selector);
+
+       gtk_box_pack_start (GTK_BOX (hbox), scale_hbox, FALSE, TRUE, 0);
+       gtk_widget_show (scale_hbox);
+
+       rotate_hbox = gtk_hbox_new (FALSE, 6);
+
+       label = gtk_label_new ("Rotate:");
+       gtk_box_pack_start (GTK_BOX (rotate_hbox), label, TRUE, TRUE, 0);
+       gtk_widget_show (label);
+
+#if GTK_CHECK_VERSION (2, 24, 0)
+       rotate_selector = gtk_combo_box_text_new ();
+       gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (rotate_selector), "0");
+       gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (rotate_selector), "90");
+       gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (rotate_selector), "180");
+       gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (rotate_selector), "270");
+#else
+       rotate_selector = gtk_combo_box_new_text ();
+       gtk_combo_box_append_text (GTK_COMBO_BOX (rotate_selector), "0");
+       gtk_combo_box_append_text (GTK_COMBO_BOX (rotate_selector), "90");
+       gtk_combo_box_append_text (GTK_COMBO_BOX (rotate_selector), "180");
+       gtk_combo_box_append_text (GTK_COMBO_BOX (rotate_selector), "270");
+#endif
+       gtk_combo_box_set_active (GTK_COMBO_BOX (rotate_selector), 0);
+#if 0
+       g_signal_connect (G_OBJECT (rotate_selector), "changed",
+                         G_CALLBACK (pgd_selections_rotate_selector_changed),
+                         (gpointer)demo);
+#endif
+       gtk_box_pack_start (GTK_BOX (rotate_hbox), rotate_selector, TRUE, TRUE, 0);
+       gtk_widget_show (rotate_selector);
+
+       gtk_box_pack_start (GTK_BOX (hbox), rotate_hbox, FALSE, TRUE, 0);
+       gtk_widget_show (rotate_hbox);
+
+       hbox = gtk_hbox_new (FALSE, 12);
+       gtk_box_pack_start (GTK_BOX (vbox), hbox, TRUE, TRUE, 0);
+       gtk_widget_show (hbox);
+
+       color_hbox = gtk_hbox_new (FALSE, 6);
+
+       label = gtk_label_new ("Foreground Color:");
+       gtk_box_pack_start (GTK_BOX (color_hbox), label, TRUE, TRUE, 0);
+       gtk_widget_show (label);
+
+       demo->fg_color_button = gtk_color_button_new ();
+       g_signal_connect (demo->fg_color_button, "notify::color",
+                         G_CALLBACK (pgd_selections_fg_color_changed),
+                         (gpointer)demo);
+       gtk_box_pack_start (GTK_BOX (color_hbox), demo->fg_color_button, TRUE, TRUE, 0);
+       gtk_widget_show (demo->fg_color_button);
+
+       gtk_box_pack_start (GTK_BOX (hbox), color_hbox, FALSE, TRUE, 0);
+       gtk_widget_show (color_hbox);
+
+       color_hbox = gtk_hbox_new (FALSE, 6);
+
+       label = gtk_label_new ("Background Color:");
+       gtk_box_pack_start (GTK_BOX (color_hbox), label, TRUE, TRUE, 0);
+       gtk_widget_show (label);
+
+       demo->bg_color_button = gtk_color_button_new ();
+       g_signal_connect (demo->bg_color_button, "notify::color",
+                         G_CALLBACK (pgd_selections_bg_color_changed),
+                         (gpointer)demo);
+       gtk_box_pack_start (GTK_BOX (color_hbox), demo->bg_color_button, TRUE, TRUE, 0);
+       gtk_widget_show (demo->bg_color_button);
+
+       gtk_box_pack_start (GTK_BOX (hbox), color_hbox, FALSE, TRUE, 0);
+       gtk_widget_show (color_hbox);
+
+       demo->copy_button = gtk_button_new_with_label ("Copy");
+       g_signal_connect (G_OBJECT (demo->copy_button), "clicked",
+                         G_CALLBACK (pgd_selections_copy),
+                         (gpointer)demo);
+       gtk_box_pack_end (GTK_BOX (hbox), demo->copy_button, FALSE, TRUE, 0);
+       gtk_widget_set_sensitive(demo->copy_button, FALSE);
+       gtk_widget_show (demo->copy_button);
+
+       button = gtk_button_new_with_label ("Render");
+       g_signal_connect (G_OBJECT (button), "clicked",
+                         G_CALLBACK (pgd_selections_render),
+                         (gpointer)demo);
+       gtk_box_pack_end (GTK_BOX (hbox), button, FALSE, TRUE, 0);
+       gtk_widget_show (button);
+
+       return vbox;
+}
+
+GtkWidget *
+pgd_selections_create_widget (PopplerDocument *document)
+{
+       PgdSelectionsDemo *demo;
+       GtkWidget         *vbox, *hbox;
+
+       demo = g_new0 (PgdSelectionsDemo, 1);
+
+       demo->doc = g_object_ref (document);
+       demo->scale = 1.0;
+       demo->cursor = GDK_LAST_CURSOR;
+
+       pgd_selections_clear_selections (demo);
+
+       vbox = gtk_vbox_new (FALSE, 6);
+
+       hbox = pgd_selections_properties_selector_create (demo);
+       gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, TRUE, 6);
+       gtk_widget_show (hbox);
+
+       demo->darea = gtk_drawing_area_new ();
+       g_signal_connect (demo->darea, "realize",
+                         G_CALLBACK (pgd_selections_drawing_area_realize),
+                         (gpointer)demo);
+       g_signal_connect (demo->darea, "expose_event",
+                         G_CALLBACK (pgd_selections_drawing_area_expose),
+                         (gpointer)demo);
+       g_signal_connect (demo->darea, "button_press_event",
+                         G_CALLBACK (pgd_selections_drawing_area_button_press),
+                         (gpointer)demo);
+       g_signal_connect (demo->darea, "motion_notify_event",
+                         G_CALLBACK (pgd_selections_drawing_area_motion_notify),
+                         (gpointer)demo);
+       g_signal_connect (demo->darea, "button_release_event",
+                         G_CALLBACK (pgd_selections_drawing_area_button_release),
+                         (gpointer)demo);
+       g_signal_connect (demo->darea, "query_tooltip",
+                         G_CALLBACK (pgd_selections_drawing_area_query_tooltip),
+                         (gpointer)demo);
+       demo->swindow = gtk_scrolled_window_new (NULL, NULL);
+       gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (demo->swindow),
+                                       GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
+       gtk_scrolled_window_add_with_viewport (GTK_SCROLLED_WINDOW (demo->swindow),
+                                              demo->darea);
+       gtk_widget_show (demo->darea);
+
+       gtk_box_pack_start (GTK_BOX (vbox), demo->swindow, TRUE, TRUE, 0);
+       gtk_widget_show (demo->swindow);
+
+       g_object_weak_ref (G_OBJECT (demo->swindow),
+                          (GWeakNotify)pgd_selections_free,
+                          (gpointer)demo);
+
+       return vbox;
+}
diff --git a/glib/demo/selections.h b/glib/demo/selections.h
new file mode 100644 (file)
index 0000000..61f8349
--- /dev/null
@@ -0,0 +1,31 @@
+/*
+ * Copyright (C) 2010 Carlos Garcia Campos  <carlosgc@gnome.org>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include <gtk/gtk.h>
+#include <poppler.h>
+
+#ifndef _SELECTIONS_H_
+#define _SELECTIONS_H_
+
+G_BEGIN_DECLS
+
+GtkWidget *pgd_selections_create_widget (PopplerDocument *document);
+
+G_END_DECLS
+
+#endif /* _SELECTIONS_H_ */
diff --git a/glib/demo/text.c b/glib/demo/text.c
new file mode 100644 (file)
index 0000000..3a7b2cd
--- /dev/null
@@ -0,0 +1,466 @@
+/*
+ * Copyright (C) 2008 Carlos Garcia Campos  <carlosgc@gnome.org>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include <string.h>
+
+#include "text.h"
+#include "utils.h"
+
+enum {
+       TEXT_X1_COLUMN,
+       TEXT_Y1_COLUMN,
+       TEXT_X2_COLUMN,
+       TEXT_Y2_COLUMN,
+       TEXT_OFFSET_COLUMN,
+       TEXT_OFFPTR_COLUMN,
+       N_COLUMNS
+};
+
+typedef struct {
+       PopplerDocument *doc;
+
+       GtkWidget       *timer_label;
+       GtkTextBuffer   *buffer;
+        GtkWidget       *treeview;
+       GtkListStore    *model;
+
+        /* Text attributes */
+        GList           *text_attrs;
+       GtkWidget       *font_name;
+        GtkWidget       *font_size;
+        GtkWidget       *is_underlined;
+        GtkWidget       *text_color;
+
+       gint             page;
+} PgdTextDemo;
+
+static void
+pgd_text_free (PgdTextDemo *demo)
+{
+       if (!demo)
+               return;
+
+       if (demo->doc) {
+               g_object_unref (demo->doc);
+               demo->doc = NULL;
+       }
+
+       if (demo->buffer) {
+               g_object_unref (demo->buffer);
+               demo->buffer = NULL;
+       }
+
+        if (demo->text_attrs) {
+                poppler_page_free_text_attributes (demo->text_attrs);
+                demo->text_attrs = NULL;
+        }
+
+       if (demo->model) {
+               g_object_unref (demo->model);
+               demo->model = NULL;
+       }
+
+       g_free (demo);
+}
+
+static void
+pgd_text_get_text (GtkWidget   *button,
+                  PgdTextDemo *demo)
+{
+       PopplerPage      *page;
+       PopplerRectangle *recs = NULL;
+       guint             n_recs;
+       gchar            *text;
+       GTimer           *timer;
+       gint              i;
+
+       page = poppler_document_get_page (demo->doc, demo->page);
+       if (!page)
+               return;
+
+       gtk_list_store_clear (demo->model);
+        if (demo->text_attrs)
+                poppler_page_free_text_attributes (demo->text_attrs);
+        demo->text_attrs = NULL;
+
+       timer = g_timer_new ();
+       text = poppler_page_get_text (page);
+       g_timer_stop (timer);
+
+       if (text) {
+               gchar  *str;
+               gdouble text_elapsed, layout_elapsed;
+
+               text_elapsed = g_timer_elapsed (timer, NULL);
+
+               g_timer_start (timer);
+               poppler_page_get_text_layout (page, &recs, &n_recs);
+               g_timer_stop (timer);
+
+                layout_elapsed = g_timer_elapsed (timer, NULL);
+
+                g_timer_start (timer);
+                demo->text_attrs = poppler_page_get_text_attributes (page);
+                g_timer_stop (timer);
+
+               str = g_strdup_printf ("<i>got text in %.4f seconds, text layout in %.4f seconds, text attrs in %.4f seconds</i>",
+                                      text_elapsed, layout_elapsed, g_timer_elapsed (timer, NULL));
+               gtk_label_set_markup (GTK_LABEL (demo->timer_label), str);
+               g_free (str);
+       } else {
+               gtk_label_set_markup (GTK_LABEL (demo->timer_label), "<i>No text found</i>");
+               n_recs = 0;
+       }
+
+       g_timer_destroy (timer);
+       g_object_unref (page);
+
+       if (text) {
+               gtk_text_buffer_set_text (demo->buffer, text, strlen (text));
+               g_free (text);
+       }
+
+       for (i = 0; i < n_recs; i++) {
+               GtkTreeIter iter;
+               gchar      *x1, *y1, *x2, *y2;
+               gchar      *offset;
+
+               x1 = g_strdup_printf ("%.2f", recs[i].x1);
+               y1 = g_strdup_printf ("%.2f", recs[i].y1);
+               x2 = g_strdup_printf ("%.2f", recs[i].x2);
+               y2 = g_strdup_printf ("%.2f", recs[i].y2);
+
+               offset = g_strdup_printf ("%d", i);
+
+               gtk_list_store_append (demo->model, &iter);
+               gtk_list_store_set (demo->model, &iter,
+                                   TEXT_X1_COLUMN, x1,
+                                   TEXT_Y1_COLUMN, y1,
+                                   TEXT_X2_COLUMN, x2,
+                                   TEXT_Y2_COLUMN, y2,
+                                   TEXT_OFFSET_COLUMN, offset,
+                                   TEXT_OFFPTR_COLUMN, GINT_TO_POINTER (i),
+                                   -1);
+
+               g_free (x1);
+               g_free (y1);
+               g_free (x2);
+               g_free (y2);
+               g_free (offset);
+       }
+
+       g_free (recs);
+}
+
+static void
+pgd_text_set_text_attrs_for_offset (PgdTextDemo *demo,
+                                    gint         offset)
+{
+        GList *l;
+
+        for (l = demo->text_attrs; l; l = g_list_next (l)) {
+                PopplerTextAttributes *attrs = (PopplerTextAttributes *)l->data;
+
+                if (offset >= attrs->start_index && offset <= attrs->end_index) {
+                        gchar *str;
+                        GdkPixbuf *pixbuf;
+
+                        gtk_label_set_text (GTK_LABEL (demo->font_name), attrs->font_name);
+
+                        str = g_strdup_printf ("%.2f", attrs->font_size);
+                        gtk_label_set_text (GTK_LABEL (demo->font_size), str);
+                        g_free (str);
+
+                        gtk_label_set_text (GTK_LABEL (demo->is_underlined), attrs->is_underlined ? "Yes" : "No");
+
+                        pixbuf = pgd_pixbuf_new_for_color (&(attrs->color));
+                        gtk_image_set_from_pixbuf (GTK_IMAGE (demo->text_color), pixbuf);
+                        g_object_unref (pixbuf);
+                }
+        }
+}
+
+static void
+pgd_text_selection_changed (GtkTreeSelection *treeselection,
+                           PgdTextDemo      *demo)
+{
+       GtkTreeModel *model;
+       GtkTreeIter   iter;
+
+       if (gtk_tree_selection_get_selected (treeselection, &model, &iter)) {
+               gpointer    offset;
+               GtkTextIter begin_iter, end_iter;
+
+               gtk_tree_model_get (model, &iter,
+                                   TEXT_OFFPTR_COLUMN, &offset,
+                                   -1);
+
+               gtk_text_buffer_get_iter_at_offset (demo->buffer, &begin_iter, GPOINTER_TO_INT (offset));
+               end_iter = begin_iter;
+               gtk_text_iter_forward_char (&end_iter);
+               gtk_text_buffer_select_range (demo->buffer, &begin_iter, &end_iter);
+
+                pgd_text_set_text_attrs_for_offset (demo, GPOINTER_TO_INT (offset));
+       }
+}
+
+static void
+pgd_text_buffer_selection_changed (GtkTextBuffer *buffer,
+                                   GParamSpec    *pspec,
+                                   GtkWidget    *textview)
+{
+        gtk_widget_set_has_tooltip (textview, gtk_text_buffer_get_has_selection (buffer));
+}
+
+static gboolean
+pgd_text_view_query_tooltip (GtkTextView   *textview,
+                             gint           x,
+                             gint           y,
+                             gboolean       keyboard_tip,
+                             GtkTooltip    *tooltip,
+                             PgdTextDemo   *demo)
+{
+        GtkTreeModel     *model;
+        GtkTreeIter       iter;
+        GtkTreeSelection *selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (demo->treeview));
+
+        if (gtk_tree_selection_get_selected (selection, &model, &iter)) {
+                PopplerPage *page;
+                gchar *x1, *y1, *x2, *y2;
+                PopplerRectangle rect;
+                gchar *text;
+
+                gtk_tree_model_get (model, &iter,
+                                    TEXT_X1_COLUMN, &x1,
+                                    TEXT_Y1_COLUMN, &y1,
+                                    TEXT_X2_COLUMN, &x2,
+                                    TEXT_Y2_COLUMN, &y2,
+                                    -1);
+
+                rect.x1 = g_strtod (x1, NULL);
+                rect.y1 = g_strtod (y1, NULL);
+                rect.x2 = g_strtod (x2, NULL);
+                rect.y2 = g_strtod (y2, NULL);
+
+                g_free (x1);
+                g_free (y1);
+                g_free (x2);
+                g_free (y2);
+
+                page = page = poppler_document_get_page (demo->doc, demo->page);
+                text = poppler_page_get_selected_text (page, POPPLER_SELECTION_GLYPH, &rect);
+                gtk_tooltip_set_text (tooltip, text);
+                g_free (text);
+                g_object_unref (page);
+        }
+
+}
+
+
+static void
+pgd_text_page_selector_value_changed (GtkSpinButton *spinbutton,
+                                     PgdTextDemo   *demo)
+{
+       demo->page = (gint)gtk_spin_button_get_value (spinbutton) - 1;
+}
+
+GtkWidget *
+pgd_text_create_widget (PopplerDocument *document)
+{
+       PgdTextDemo      *demo;
+       GtkWidget        *label;
+       GtkWidget        *vbox, *vbox2;
+       GtkWidget        *textinfo;
+       GtkWidget        *hbox, *page_selector;
+       GtkWidget        *button;
+       GtkWidget        *swindow, *textview, *treeview;
+       GtkTreeSelection *selection;
+        GtkWidget        *frame, *alignment, *table;
+       GtkWidget        *hpaned;
+       GtkCellRenderer  *renderer;
+       gchar            *str;
+       gint              n_pages;
+        gint              row = 0;
+
+       demo = g_new0 (PgdTextDemo, 1);
+
+       demo->doc = g_object_ref (document);
+
+       n_pages = poppler_document_get_n_pages (document);
+
+       vbox = gtk_vbox_new (FALSE, 12);
+       vbox2 = gtk_vbox_new (FALSE, 12);
+       textinfo = gtk_label_new ("TextInfo");
+
+       hbox = gtk_hbox_new (FALSE, 6);
+
+       label = gtk_label_new ("Page:");
+       gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, TRUE, 0);
+       gtk_widget_show (label);
+
+       page_selector = gtk_spin_button_new_with_range (1, n_pages, 1);
+       g_signal_connect (G_OBJECT (page_selector), "value-changed",
+                         G_CALLBACK (pgd_text_page_selector_value_changed),
+                         (gpointer)demo);
+       gtk_box_pack_start (GTK_BOX (hbox), page_selector, FALSE, TRUE, 0);
+       gtk_widget_show (page_selector);
+
+       str = g_strdup_printf ("of %d", n_pages);
+       label = gtk_label_new (str);
+       gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, TRUE, 0);
+       gtk_widget_show (label);
+       g_free (str);
+
+       button = gtk_button_new_with_label ("Get Text");
+       g_signal_connect (G_OBJECT (button), "clicked",
+                         G_CALLBACK (pgd_text_get_text),
+                         (gpointer)demo);
+       gtk_box_pack_end (GTK_BOX (hbox), button, FALSE, FALSE, 0);
+       gtk_widget_show (button);
+
+       gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, TRUE, 0);
+       gtk_widget_show (hbox);
+
+       demo->timer_label = gtk_label_new (NULL);
+       gtk_label_set_markup (GTK_LABEL (demo->timer_label), "<i>No text found</i>");
+       g_object_set (G_OBJECT (demo->timer_label), "xalign", 1.0, NULL);
+       gtk_box_pack_start (GTK_BOX (vbox), demo->timer_label, FALSE, TRUE, 0);
+       gtk_widget_show (demo->timer_label);
+
+       hpaned = gtk_hpaned_new ();
+       gtk_paned_set_position (GTK_PANED (hpaned), 300);
+
+       swindow = gtk_scrolled_window_new (NULL, NULL);
+       gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (swindow),
+                                       GTK_POLICY_AUTOMATIC,
+                                       GTK_POLICY_AUTOMATIC);
+
+       demo->model = gtk_list_store_new (N_COLUMNS,
+                                         G_TYPE_STRING,
+                                         G_TYPE_STRING, G_TYPE_STRING,
+                                         G_TYPE_STRING, G_TYPE_STRING,
+                                         G_TYPE_POINTER);
+       treeview = gtk_tree_view_new_with_model (GTK_TREE_MODEL (demo->model));
+        demo->treeview = treeview;
+
+       renderer = gtk_cell_renderer_text_new ();
+       gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (treeview),
+                                                    TEXT_X1_COLUMN, "X1",
+                                                    renderer,
+                                                    "text", TEXT_X1_COLUMN,
+                                                    NULL);
+       renderer = gtk_cell_renderer_text_new ();
+       gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (treeview),
+                                                    TEXT_Y1_COLUMN, "Y1",
+                                                    renderer,
+                                                    "text", TEXT_Y1_COLUMN,
+                                                    NULL);
+       renderer = gtk_cell_renderer_text_new ();
+       gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (treeview),
+                                                    TEXT_X2_COLUMN, "X2",
+                                                    renderer,
+                                                    "text", TEXT_X2_COLUMN,
+                                                    NULL);
+       renderer = gtk_cell_renderer_text_new ();
+       gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (treeview),
+                                                    TEXT_Y2_COLUMN, "Y2",
+                                                    renderer,
+                                                    "text", TEXT_Y2_COLUMN,
+                                                    NULL);
+
+       renderer = gtk_cell_renderer_text_new ();
+       gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (treeview),
+                                                    TEXT_OFFSET_COLUMN, "Offset",
+                                                    renderer,
+                                                    "text", TEXT_OFFSET_COLUMN,
+                                                    NULL);
+
+       selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (treeview));
+       g_signal_connect (selection, "changed",
+                         G_CALLBACK (pgd_text_selection_changed),
+                         (gpointer) demo);
+
+       gtk_container_add (GTK_CONTAINER (swindow), treeview);
+       gtk_widget_show (treeview);
+
+       gtk_container_add (GTK_CONTAINER (vbox2), swindow);
+        gtk_widget_show (swindow);
+
+        /* Text attributes */
+        frame = gtk_frame_new (NULL);
+        gtk_frame_set_shadow_type (GTK_FRAME (frame), GTK_SHADOW_NONE);
+        label = gtk_label_new (NULL);
+        gtk_label_set_markup (GTK_LABEL (label), "<b>Text Attributes</b>");
+        gtk_frame_set_label_widget (GTK_FRAME (frame), label);
+        gtk_widget_show (label);
+
+        alignment = gtk_alignment_new (0.5, 0.5, 1, 1);
+        gtk_alignment_set_padding (GTK_ALIGNMENT (alignment), 5, 5, 12, 5);
+        gtk_container_add (GTK_CONTAINER (frame), alignment);
+        gtk_widget_show (alignment);
+
+        table = gtk_table_new (4, 2, FALSE);
+        gtk_table_set_col_spacings (GTK_TABLE (table), 6);
+        gtk_table_set_row_spacings (GTK_TABLE (table), 6);
+
+        demo->font_name = gtk_label_new (NULL);
+        pgd_table_add_property_with_custom_widget (GTK_TABLE (table), "<b>Font Name:</b>", demo->font_name, &row);
+        demo->font_size = gtk_label_new (NULL);
+        pgd_table_add_property_with_custom_widget (GTK_TABLE (table), "<b>Font Size:</b>", demo->font_size, &row);
+        demo->is_underlined = gtk_label_new (NULL);
+        pgd_table_add_property_with_custom_widget (GTK_TABLE (table), "<b>Underlined:</b>", demo->is_underlined, &row);
+        demo->text_color = gtk_image_new ();
+        pgd_table_add_property_with_custom_widget (GTK_TABLE (table), "<b>Color:</b>", demo->text_color, &row);
+
+        gtk_container_add (GTK_CONTAINER (alignment), table);
+        gtk_widget_show (table);
+
+       gtk_box_pack_start (GTK_BOX (vbox2), frame, FALSE, FALSE, 12);
+        gtk_widget_show (frame);
+       gtk_paned_add1 (GTK_PANED (hpaned), vbox2);
+       gtk_widget_show (vbox2);
+
+       swindow = gtk_scrolled_window_new (NULL, NULL);
+       gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (swindow),
+                                       GTK_POLICY_AUTOMATIC,
+                                       GTK_POLICY_AUTOMATIC);
+
+       demo->buffer = gtk_text_buffer_new (NULL);
+       textview = gtk_text_view_new_with_buffer (demo->buffer);
+        g_signal_connect (textview, "query-tooltip",
+                          G_CALLBACK (pgd_text_view_query_tooltip),
+                          demo);
+        g_signal_connect (demo->buffer, "notify::has-selection",
+                          G_CALLBACK (pgd_text_buffer_selection_changed),
+                          textview);
+
+       gtk_container_add (GTK_CONTAINER (swindow), textview);
+       gtk_widget_show (textview);
+
+       gtk_paned_add2 (GTK_PANED (hpaned), swindow);
+       gtk_widget_show (swindow);
+
+       gtk_box_pack_start (GTK_BOX (vbox), hpaned, TRUE, TRUE, 0);
+       gtk_widget_show (hpaned);
+
+       g_object_weak_ref (G_OBJECT (vbox),
+                          (GWeakNotify)pgd_text_free,
+                          demo);
+
+       return vbox;
+}
diff --git a/glib/demo/text.h b/glib/demo/text.h
new file mode 100644 (file)
index 0000000..87a1143
--- /dev/null
@@ -0,0 +1,31 @@
+/*
+ * Copyright (C) 2008 Carlos Garcia Campos  <carlosgc@gnome.org>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include <gtk/gtk.h>
+#include <poppler.h>
+
+#ifndef _TEXT_H_
+#define _TEXT_H_
+
+G_BEGIN_DECLS
+
+GtkWidget *pgd_text_create_widget (PopplerDocument *document);
+
+G_END_DECLS
+
+#endif /* _TEXT_H_ */
diff --git a/glib/demo/transitions.c b/glib/demo/transitions.c
new file mode 100644 (file)
index 0000000..b6188b5
--- /dev/null
@@ -0,0 +1,321 @@
+/*
+ * Copyright (C) 2007 Carlos Garcia Campos  <carlosgc@gnome.org>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include <gtk/gtk.h>
+
+#include "transitions.h"
+
+enum {
+       TRANSITIONS_PAGE_COLUMN,
+       TRANSITIONS_TYPE_COLUMN,
+       TRANSITIONS_ALIGNMENT_COLUMN,
+       TRANSITIONS_DIRECTION_COLUMN,
+       TRANSITIONS_DURATION_COLUMN,
+       TRANSITIONS_ANGLE_COLUMN,
+       TRANSITIONS_SCALE_COLUMN,
+       TRANSITIONS_RECTANGULAR_COLUMN,
+       N_COLUMNS
+};
+
+typedef struct {
+       PopplerDocument *doc;
+
+       GtkWidget       *treeview;
+       GtkWidget       *progress;
+
+       guint            idle_id;
+} PgdTransitionsDemo;
+
+static void
+pgd_transitions_free (PgdTransitionsDemo *demo)
+{
+       if (!demo)
+               return;
+
+       if (demo->idle_id > 0) {
+               g_source_remove (demo->idle_id);
+               demo->idle_id = 0;
+       }
+
+       if (demo->doc) {
+               g_object_unref (demo->doc);
+               demo->doc = NULL;
+       }
+
+       g_free (demo);
+}
+
+static const gchar *
+transition_type_to_string (PopplerPageTransitionType type)
+{
+       switch (type) {
+       case POPPLER_PAGE_TRANSITION_REPLACE:
+               return "Replace";
+       case POPPLER_PAGE_TRANSITION_SPLIT:
+               return "Split";
+       case POPPLER_PAGE_TRANSITION_BLINDS:
+               return "Blinds";
+       case POPPLER_PAGE_TRANSITION_BOX:
+               return "Box";
+       case POPPLER_PAGE_TRANSITION_WIPE:
+               return "Wipe";
+       case POPPLER_PAGE_TRANSITION_DISSOLVE:
+               return "Dissolve";
+       case POPPLER_PAGE_TRANSITION_GLITTER:
+               return "Glitter";
+       case POPPLER_PAGE_TRANSITION_FLY:
+               return "Fly";
+       case POPPLER_PAGE_TRANSITION_PUSH:
+               return "Push";
+       case POPPLER_PAGE_TRANSITION_COVER:
+               return "Cover";
+       case POPPLER_PAGE_TRANSITION_UNCOVER:
+               return "Uncover";
+       case POPPLER_PAGE_TRANSITION_FADE:
+               return "Fade";
+       }
+
+       return "Unknown";
+}
+
+static const gchar *
+transition_alignment_to_string (PopplerPageTransitionAlignment alignment)
+{
+       return alignment == POPPLER_PAGE_TRANSITION_HORIZONTAL ? "Horizontal" : "Vertical";
+}
+
+static const gchar *
+transition_direction_to_string (PopplerPageTransitionDirection direction)
+{
+       return direction == POPPLER_PAGE_TRANSITION_INWARD ? "Inward" : "Outward";
+}
+
+static void
+pgd_transitions_update_progress (PgdTransitionsDemo *demo,
+                                gint                n_pages,
+                                gint                scanned)
+{
+       gchar *str;
+
+       str = g_strdup_printf ("Scanning transitions (%d%%)",
+                              MIN (scanned * 100 / n_pages, 100));
+       gtk_progress_bar_set_text (GTK_PROGRESS_BAR (demo->progress), str);
+       gtk_progress_bar_set_fraction (GTK_PROGRESS_BAR (demo->progress),
+                                      MIN ((gdouble)scanned / n_pages, 1.0));
+       g_free (str);
+}
+
+static gboolean
+pgd_transitions_fill_model (PgdTransitionsDemo *demo)
+{
+       GtkTreeModel *model;
+       gint          i, n_pages;
+
+       n_pages = poppler_document_get_n_pages (demo->doc);
+
+       model = gtk_tree_view_get_model (GTK_TREE_VIEW (demo->treeview));
+       g_object_ref (model);
+
+       for (i = 0; i < n_pages; i++) {
+               PopplerPage           *page;
+               PopplerPageTransition *transition;
+
+               pgd_transitions_update_progress (demo, n_pages, i);
+
+               while (gtk_events_pending ())
+                       gtk_main_iteration ();
+
+               page = poppler_document_get_page (demo->doc, i);
+               if (!page)
+                       continue;
+
+               transition = poppler_page_get_transition (page);
+               if (transition) {
+                       GtkTreeIter iter;
+                       gchar      *npage;
+                       gchar      *duration;
+                       gchar      *angle;
+                       gchar      *scale;
+
+                       npage = g_strdup_printf ("%d", i + 1);
+                       duration = g_strdup_printf ("%d", transition->duration);
+                       angle = g_strdup_printf ("%d", transition->angle);
+                       scale = g_strdup_printf ("%.2f", transition->scale);
+                       
+                       gtk_list_store_append (GTK_LIST_STORE (model), &iter);
+                       gtk_list_store_set (GTK_LIST_STORE (model), &iter,
+                                           TRANSITIONS_PAGE_COLUMN, npage,
+                                           TRANSITIONS_TYPE_COLUMN,
+                                           transition_type_to_string (transition->type),
+                                           TRANSITIONS_ALIGNMENT_COLUMN,
+                                           transition_alignment_to_string (transition->alignment),
+                                           TRANSITIONS_DIRECTION_COLUMN,
+                                           transition_direction_to_string (transition->direction),
+                                           TRANSITIONS_DURATION_COLUMN, duration, 
+                                           TRANSITIONS_ANGLE_COLUMN, angle, 
+                                           TRANSITIONS_SCALE_COLUMN, scale, 
+                                           TRANSITIONS_RECTANGULAR_COLUMN,
+                                           transition->rectangular ? "Yes" : "No",
+                                           -1);
+                       g_free (npage);
+                       g_free (duration);
+                       g_free (angle);
+                       g_free (scale);
+
+                       poppler_page_transition_free (transition);
+               }
+
+               g_object_unref (page);
+       }
+
+       pgd_transitions_update_progress (demo, n_pages, n_pages);
+       g_object_unref (model);
+
+       return FALSE;
+}
+
+static void
+pgd_transitions_scan_button_clicked (GtkButton          *button,
+                                    PgdTransitionsDemo *demo)
+{
+       if (demo->idle_id > 0)
+               g_source_remove (demo->idle_id);
+       
+       demo->idle_id = g_idle_add ((GSourceFunc)pgd_transitions_fill_model, demo);
+}
+
+static GtkWidget *
+pgd_transitions_create_list (GtkTreeModel *model)
+{
+       GtkWidget       *treeview;
+       GtkCellRenderer *renderer;
+       
+       treeview = gtk_tree_view_new_with_model (GTK_TREE_MODEL (model));
+       gtk_tree_view_set_headers_visible (GTK_TREE_VIEW (treeview), TRUE);
+       gtk_tree_view_set_rules_hint (GTK_TREE_VIEW (treeview), TRUE);
+       gtk_tree_selection_set_mode (gtk_tree_view_get_selection (GTK_TREE_VIEW (treeview)),
+                                    GTK_SELECTION_NONE);
+
+       renderer = gtk_cell_renderer_text_new ();
+       gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (treeview),
+                                                    0, "Page",
+                                                    renderer,
+                                                    "text", TRANSITIONS_PAGE_COLUMN,
+                                                    NULL);
+       renderer = gtk_cell_renderer_text_new ();
+       gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (treeview),
+                                                    1, "Type",
+                                                    renderer,
+                                                    "text", TRANSITIONS_TYPE_COLUMN,
+                                                    NULL);
+       renderer = gtk_cell_renderer_text_new ();
+       gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (treeview),
+                                                    2, "Alignment",
+                                                    renderer,
+                                                    "text", TRANSITIONS_ALIGNMENT_COLUMN,
+                                                    NULL);
+       renderer = gtk_cell_renderer_text_new ();
+       gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (treeview),
+                                                    3, "Direction",
+                                                    renderer,
+                                                    "text", TRANSITIONS_DIRECTION_COLUMN,
+                                                    NULL);
+       renderer = gtk_cell_renderer_text_new ();
+       gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (treeview),
+                                                    4, "Duration",
+                                                    renderer,
+                                                    "text", TRANSITIONS_DURATION_COLUMN,
+                                                    NULL);
+       renderer = gtk_cell_renderer_text_new ();
+       gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (treeview),
+                                                    5, "Angle",
+                                                    renderer,
+                                                    "text", TRANSITIONS_ANGLE_COLUMN,
+                                                    NULL);
+       renderer = gtk_cell_renderer_text_new ();
+       gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (treeview),
+                                                    6, "Scale",
+                                                    renderer,
+                                                    "text", TRANSITIONS_SCALE_COLUMN,
+                                                    NULL);
+       renderer = gtk_cell_renderer_text_new ();
+       gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (treeview),
+                                                    7, "Rectangular",
+                                                    renderer,
+                                                    "text", TRANSITIONS_RECTANGULAR_COLUMN,
+                                                    NULL);
+       return treeview;
+}
+
+GtkWidget *
+pgd_transitions_create_widget (PopplerDocument *document)
+{
+       PgdTransitionsDemo *demo;
+       GtkWidget          *vbox;
+       GtkListStore       *model;
+       GtkWidget          *swindow;
+       GtkWidget          *hbox, *button;
+
+       demo = g_new0 (PgdTransitionsDemo, 1);
+
+       demo->doc = g_object_ref (document);
+
+       vbox = gtk_vbox_new (FALSE, 12);
+
+       hbox = gtk_hbox_new (FALSE, 6);
+
+       demo->progress = gtk_progress_bar_new ();
+       gtk_progress_bar_set_ellipsize (GTK_PROGRESS_BAR (demo->progress),
+                                       PANGO_ELLIPSIZE_END);
+       gtk_box_pack_start (GTK_BOX (hbox), demo->progress, TRUE, TRUE, 0);
+       gtk_widget_show (demo->progress);
+
+       button = gtk_button_new_with_label ("Scan");
+       g_signal_connect (G_OBJECT (button), "clicked",
+                         G_CALLBACK (pgd_transitions_scan_button_clicked),
+                         (gpointer)demo);
+       gtk_box_pack_end (GTK_BOX (hbox), button, FALSE, FALSE, 0);
+       gtk_widget_show (button);
+
+       gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, TRUE, 6);
+       gtk_widget_show (hbox);
+
+       swindow = gtk_scrolled_window_new (NULL, NULL);
+       gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (swindow),
+                                       GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
+
+       model = gtk_list_store_new (N_COLUMNS,
+                                   G_TYPE_STRING, G_TYPE_STRING,
+                                   G_TYPE_STRING, G_TYPE_STRING,
+                                   G_TYPE_STRING, G_TYPE_STRING,
+                                   G_TYPE_STRING, G_TYPE_STRING);
+       demo->treeview = pgd_transitions_create_list (GTK_TREE_MODEL (model));
+       g_object_unref (model);
+
+       gtk_container_add (GTK_CONTAINER (swindow), demo->treeview);
+       gtk_widget_show (demo->treeview);
+
+       gtk_box_pack_start (GTK_BOX (vbox), swindow, TRUE, TRUE, 0);
+       gtk_widget_show (swindow);
+
+       g_object_weak_ref (G_OBJECT (swindow),
+                          (GWeakNotify)pgd_transitions_free,
+                          (gpointer)demo);
+
+       return vbox;
+}
diff --git a/glib/demo/transitions.h b/glib/demo/transitions.h
new file mode 100644 (file)
index 0000000..11d8bd4
--- /dev/null
@@ -0,0 +1,31 @@
+/*
+ * Copyright (C) 2007 Carlos Garcia Campos  <carlosgc@gnome.org>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include <gtk/gtk.h>
+#include <poppler.h>
+
+#ifndef _TRANSITIONS_H_
+#define _TRANSITIONS_H_
+
+G_BEGIN_DECLS
+
+GtkWidget *pgd_transitions_create_widget (PopplerDocument *document);
+
+G_END_DECLS
+
+#endif /* _TRANSITIONS_H_ */
diff --git a/glib/demo/utils.c b/glib/demo/utils.c
new file mode 100644 (file)
index 0000000..625596c
--- /dev/null
@@ -0,0 +1,612 @@
+/*
+ * Copyright (C) 2007 Carlos Garcia Campos  <carlosgc@gnome.org>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include <gtk/gtk.h>
+#include <stdio.h>
+#include <unistd.h>
+#include <time.h>
+
+#include "utils.h"
+
+void
+pgd_table_add_property_with_custom_widget (GtkTable    *table,
+                                          const gchar *markup,
+                                          GtkWidget   *widget,
+                                          gint        *row)
+{
+       GtkWidget *label;
+
+       label = gtk_label_new (NULL);
+       g_object_set (G_OBJECT (label), "xalign", 0.0, NULL);
+       gtk_label_set_markup (GTK_LABEL (label), markup);
+       gtk_table_attach (GTK_TABLE (table), label, 0, 1, *row, *row + 1,
+                         GTK_FILL, GTK_FILL, 0, 0);
+       gtk_widget_show (label);
+
+       gtk_table_attach (GTK_TABLE (table), widget, 1, 2, *row, *row + 1,
+                         GTK_FILL | GTK_EXPAND, GTK_FILL, 0, 0);
+       gtk_widget_show (widget);
+
+       *row += 1;
+}
+
+void
+pgd_table_add_property_with_value_widget (GtkTable    *table,
+                                         const gchar *markup,
+                                         GtkWidget  **value_widget,
+                                         const gchar *value,
+                                         gint        *row)
+{
+       GtkWidget *label;
+
+       *value_widget = label = gtk_label_new (value);
+       g_object_set (G_OBJECT (label),
+                     "xalign", 0.0,
+                     "selectable", TRUE,
+                     "ellipsize", PANGO_ELLIPSIZE_END,
+                     NULL);
+       pgd_table_add_property_with_custom_widget (table, markup, label, row);
+}
+
+void
+pgd_table_add_property (GtkTable    *table,
+                       const gchar *markup,
+                       const gchar *value,
+                       gint        *row)
+{
+       GtkWidget *label;
+
+       pgd_table_add_property_with_value_widget (table, markup, &label, value, row);
+}
+
+GtkWidget *
+pgd_action_view_new (PopplerDocument *document)
+{
+       GtkWidget  *frame, *label;
+
+       frame = gtk_frame_new (NULL);
+       gtk_frame_set_shadow_type (GTK_FRAME (frame), GTK_SHADOW_NONE);
+       label = gtk_label_new (NULL);
+       gtk_label_set_markup (GTK_LABEL (label), "<b>Action Properties</b>");
+       gtk_frame_set_label_widget (GTK_FRAME (frame), label);
+       gtk_widget_show (label);
+
+       g_object_set_data (G_OBJECT (frame), "document", document);
+
+       return frame;
+}
+
+static void
+pgd_action_view_add_destination (GtkWidget   *action_view,
+                                GtkTable    *table,
+                                PopplerDest *dest,
+                                gboolean     remote,
+                                gint        *row)
+{
+       PopplerDocument *document;
+       GEnumValue      *enum_value;
+       gchar           *str;
+       
+       pgd_table_add_property (table, "<b>Type:</b>", "Destination", row);
+       
+       enum_value = g_enum_get_value ((GEnumClass *) g_type_class_ref (POPPLER_TYPE_DEST_TYPE), dest->type);
+       pgd_table_add_property (table, "<b>Destination Type:</b>", enum_value->value_name, row);
+
+       document = g_object_get_data (G_OBJECT (action_view), "document");
+       
+       if (dest->type != POPPLER_DEST_NAMED) {
+               str = NULL;
+               
+               if (document && !remote) {
+                       PopplerPage *poppler_page;
+                       gchar       *page_label;
+                       
+                       poppler_page = poppler_document_get_page (document, MAX (0, dest->page_num - 1));
+                       
+                       g_object_get (G_OBJECT (poppler_page),
+                                     "label", &page_label,
+                                     NULL);
+                       if (page_label) {
+                               str = g_strdup_printf ("%d (%s)", dest->page_num, page_label);
+                               g_free (page_label);
+                       }
+               }
+               
+               if (!str)
+                       str = g_strdup_printf ("%d", dest->page_num);
+               pgd_table_add_property (table, "<b>Page:</b>", str, row);
+               g_free (str);
+               
+               str = g_strdup_printf ("%.2f", dest->left);
+               pgd_table_add_property (table, "<b>Left:</b>", str, row);
+               g_free (str);
+               
+               str = g_strdup_printf ("%.2f", dest->right);
+               pgd_table_add_property (table, "<b>Right:</b>", str, row);
+               g_free (str);
+               
+               str = g_strdup_printf ("%.2f", dest->top);
+               pgd_table_add_property (table, "<b>Top:</b>", str, row);
+               g_free (str);
+       
+               str = g_strdup_printf ("%.2f", dest->bottom);
+               pgd_table_add_property (table, "<b>Bottom:</b>", str, row);
+               g_free (str);
+       
+               str = g_strdup_printf ("%.2f", dest->zoom);
+               pgd_table_add_property (table, "<b>Zoom:</b>", str, row);
+               g_free (str);
+       } else {
+               pgd_table_add_property (table, "<b>Named Dest:</b>", dest->named_dest, row);
+
+               if (document && !remote) {
+                       PopplerDest *new_dest;
+
+                       new_dest = poppler_document_find_dest (document, dest->named_dest);
+                       if (new_dest) {
+                               GtkWidget *new_table, *alignment;
+                               gint       new_row = 0;
+
+                               alignment = gtk_alignment_new (0.5, 0.5, 1, 1);
+                               gtk_alignment_set_padding (GTK_ALIGNMENT (alignment), 5, 5, 12, 5);
+                               
+                               new_table = gtk_table_new (8, 2, FALSE);
+                               gtk_table_set_col_spacings (GTK_TABLE (new_table), 6);
+                               gtk_table_set_row_spacings (GTK_TABLE (new_table), 6);
+                               gtk_table_attach_defaults (table, alignment, 0, 2, *row, *row + 1);
+                               gtk_widget_show (alignment);
+                               
+                               pgd_action_view_add_destination (action_view, GTK_TABLE (new_table),
+                                                                new_dest, FALSE, &new_row);
+                               poppler_dest_free (new_dest);
+
+                               gtk_container_add (GTK_CONTAINER (alignment), new_table);
+                               gtk_widget_show (new_table);
+
+                               *row += 1;
+                       }
+               }
+       }
+}
+
+static const gchar *
+get_movie_op (PopplerActionMovieOperation op)
+{
+       switch (op) {
+       case POPPLER_ACTION_MOVIE_PLAY:
+               return "Play";
+       case POPPLER_ACTION_MOVIE_PAUSE:
+               return "Pause";
+       case POPPLER_ACTION_MOVIE_RESUME:
+               return "Resume";
+       case POPPLER_ACTION_MOVIE_STOP:
+               return "Stop";
+       }
+       return NULL;
+}
+
+static void
+free_tmp_file (GFile *tmp_file)
+{
+
+       g_file_delete (tmp_file, NULL, NULL);
+       g_object_unref (tmp_file);
+}
+
+static gboolean
+save_helper (const gchar  *buf,
+            gsize         count,
+            gpointer      data,
+            GError      **error)
+{
+       gint fd = GPOINTER_TO_INT (data);
+
+       return write (fd, buf, count) == count;
+}
+
+static void
+pgd_action_view_play_rendition (GtkWidget    *button,
+                               PopplerMedia *media)
+{
+       GFile *file = NULL;
+       gchar *uri;
+
+       if (poppler_media_is_embedded (media)) {
+               gint   fd;
+               gchar *tmp_filename = NULL;
+
+               fd = g_file_open_tmp (NULL, &tmp_filename, NULL);
+               if (fd != -1) {
+                       if (poppler_media_save_to_callback (media, save_helper, GINT_TO_POINTER (fd), NULL)) {
+                               file = g_file_new_for_path (tmp_filename);
+                               g_object_set_data_full (G_OBJECT (media),
+                                                       "tmp-file", g_object_ref (file),
+                                                       (GDestroyNotify)free_tmp_file);
+                       } else {
+                               g_free (tmp_filename);
+                       }
+                       close (fd);
+               } else if (tmp_filename) {
+                       g_free (tmp_filename);
+               }
+
+       } else {
+               const gchar *filename;
+
+               filename = poppler_media_get_filename (media);
+               if (g_path_is_absolute (filename)) {
+                       file = g_file_new_for_path (filename);
+               } else if (g_strrstr (filename, "://")) {
+                       file = g_file_new_for_uri (filename);
+               } else {
+                       gchar *cwd;
+                       gchar *path;
+
+                       // FIXME: relative to doc uri, not cwd
+                       cwd = g_get_current_dir ();
+                       path = g_build_filename (cwd, filename, NULL);
+                       g_free (cwd);
+
+                       file = g_file_new_for_path (path);
+                       g_free (path);
+               }
+       }
+
+       if (file) {
+               uri = g_file_get_uri (file);
+               g_object_unref (file);
+               if (uri) {
+                       gtk_show_uri (gtk_widget_get_screen (button),
+                                     uri, GDK_CURRENT_TIME, NULL);
+                       g_free (uri);
+               }
+       }
+}
+
+static void
+pgd_action_view_do_action_layer (GtkWidget *button,
+                                GList     *state_list)
+{
+       GList *l, *m;
+
+       for (l = state_list; l; l = g_list_next (l)) {
+               PopplerActionLayer *action_layer = (PopplerActionLayer *)l->data;
+
+               for (m = action_layer->layers; m; m = g_list_next (m)) {
+                       PopplerLayer *layer = (PopplerLayer *)m->data;
+
+                       switch (action_layer->action) {
+                       case POPPLER_ACTION_LAYER_ON:
+                               poppler_layer_show (layer);
+                               break;
+                       case POPPLER_ACTION_LAYER_OFF:
+                               poppler_layer_hide (layer);
+                               break;
+                       case POPPLER_ACTION_LAYER_TOGGLE:
+                               if (poppler_layer_is_visible (layer))
+                                       poppler_layer_hide (layer);
+                               else
+                                       poppler_layer_show (layer);
+                               break;
+                       }
+               }
+       }
+}
+
+void
+pgd_action_view_set_action (GtkWidget     *action_view,
+                           PopplerAction *action)
+{
+       GtkWidget  *alignment;
+       GtkWidget  *table;
+       gint        row = 0;
+
+       alignment = gtk_bin_get_child (GTK_BIN (action_view));
+       if (alignment) {
+               gtk_container_remove (GTK_CONTAINER (action_view), alignment);
+       }
+       
+       alignment = gtk_alignment_new (0.5, 0.5, 1, 1);
+       gtk_alignment_set_padding (GTK_ALIGNMENT (alignment), 5, 5, 12, 5);
+       gtk_container_add (GTK_CONTAINER (action_view), alignment);
+       gtk_widget_show (alignment);
+
+       if (!action)
+               return;
+
+       table = gtk_table_new (10, 2, FALSE);
+       gtk_table_set_col_spacings (GTK_TABLE (table), 6);
+       gtk_table_set_row_spacings (GTK_TABLE (table), 6);
+
+       pgd_table_add_property (GTK_TABLE (table), "<b>Title:</b>", action->any.title, &row);
+       
+       switch (action->type) {
+       case POPPLER_ACTION_UNKNOWN:
+               pgd_table_add_property (GTK_TABLE (table), "<b>Type:</b>", "Unknown", &row);
+               break;
+       case POPPLER_ACTION_NONE:
+               pgd_table_add_property (GTK_TABLE (table), "<b>Type:</b>", "None", &row);
+               break;
+       case POPPLER_ACTION_GOTO_DEST:
+               pgd_action_view_add_destination (action_view, GTK_TABLE (table), action->goto_dest.dest, FALSE, &row);
+               break;
+       case POPPLER_ACTION_GOTO_REMOTE:
+               pgd_table_add_property (GTK_TABLE (table), "<b>Type:</b>", "Remote Destination", &row);
+               pgd_table_add_property (GTK_TABLE (table), "<b>Filename:</b>", action->goto_remote.file_name, &row);
+               pgd_action_view_add_destination (action_view, GTK_TABLE (table), action->goto_remote.dest, TRUE, &row);
+               break;
+       case POPPLER_ACTION_LAUNCH:
+               pgd_table_add_property (GTK_TABLE (table), "<b>Type:</b>", "Launch", &row);
+               pgd_table_add_property (GTK_TABLE (table), "<b>Filename:</b>", action->launch.file_name, &row);
+               pgd_table_add_property (GTK_TABLE (table), "<b>Params:</b>", action->launch.params, &row);
+               break;
+       case POPPLER_ACTION_URI:
+               pgd_table_add_property (GTK_TABLE (table), "<b>Type:</b>", "External URI", &row);
+               pgd_table_add_property (GTK_TABLE (table), "<b>URI</b>", action->uri.uri, &row);
+               break;
+       case POPPLER_ACTION_NAMED:
+               pgd_table_add_property (GTK_TABLE (table), "<b>Type:</b>", "Named Action", &row);
+               pgd_table_add_property (GTK_TABLE (table), "<b>Name:</b>", action->named.named_dest, &row);
+               break;
+       case POPPLER_ACTION_MOVIE: {
+               GtkWidget *movie_view = pgd_movie_view_new ();
+
+               pgd_table_add_property (GTK_TABLE (table), "<b>Type:</b>", "Movie", &row);
+               pgd_table_add_property (GTK_TABLE (table), "<b>Operation:</b>", get_movie_op (action->movie.operation), &row);
+               pgd_movie_view_set_movie (movie_view, action->movie.movie);
+               pgd_table_add_property_with_custom_widget (GTK_TABLE (table), "<b>Movie:</b>", movie_view, &row);
+       }
+               break;
+       case POPPLER_ACTION_RENDITION: {
+               gchar *text;
+
+               pgd_table_add_property (GTK_TABLE (table), "<b>Type:</b>", "Rendition", &row);
+               text = g_strdup_printf ("%d", action->rendition.op);
+               pgd_table_add_property (GTK_TABLE (table), "<b>Operation:</b>", text, &row);
+               g_free (text);
+               if (action->rendition.media) {
+                       gboolean   embedded = poppler_media_is_embedded (action->rendition.media);
+                       GtkWidget *button;
+
+                       pgd_table_add_property (GTK_TABLE (table), "<b>Embedded:</b>", embedded ? "Yes": "No", &row);
+                       if (embedded) {
+                               const gchar *mime_type = poppler_media_get_mime_type (action->rendition.media);
+                               pgd_table_add_property (GTK_TABLE (table), "<b>Mime type:</b>",
+                                                       mime_type ? mime_type : "",
+                                                       &row);
+                       } else {
+                               pgd_table_add_property (GTK_TABLE (table), "<b>Filename:</b>",
+                                                       poppler_media_get_filename (action->rendition.media),
+                                                       &row);
+                       }
+
+                       button = gtk_button_new_from_stock (GTK_STOCK_MEDIA_PLAY);
+                       g_signal_connect (button, "clicked",
+                                         G_CALLBACK (pgd_action_view_play_rendition),
+                                         action->rendition.media);
+                       pgd_table_add_property_with_custom_widget (GTK_TABLE (table), NULL, button, &row);
+                       gtk_widget_show (button);
+               }
+       }
+               break;
+       case POPPLER_ACTION_OCG_STATE: {
+               GList     *l;
+               GtkWidget *button;
+
+               pgd_table_add_property (GTK_TABLE (table), "<b>Type:</b>", "OCGState", &row);
+
+               for (l = action->ocg_state.state_list; l; l = g_list_next (l)) {
+                       PopplerActionLayer *action_layer = (PopplerActionLayer *)l->data;
+                       gchar *text;
+                       gint   n_layers = g_list_length (action_layer->layers);
+
+                       switch (action_layer->action) {
+                       case POPPLER_ACTION_LAYER_ON:
+                               text = g_strdup_printf ("%d layers On", n_layers);
+                               break;
+                       case POPPLER_ACTION_LAYER_OFF:
+                               text = g_strdup_printf ("%d layers Off", n_layers);
+                               break;
+                       case POPPLER_ACTION_LAYER_TOGGLE:
+                               text = g_strdup_printf ("%d layers Toggle", n_layers);
+                               break;
+                       }
+                       pgd_table_add_property (GTK_TABLE (table), "<b>Action:</b>", text, &row);
+                       g_free (text);
+               }
+
+               button = gtk_button_new_with_label ("Do action");
+               g_signal_connect (button, "clicked",
+                                 G_CALLBACK (pgd_action_view_do_action_layer),
+                                 action->ocg_state.state_list);
+               pgd_table_add_property_with_custom_widget (GTK_TABLE (table), NULL, button, &row);
+               gtk_widget_show (button);
+       }
+               break;
+        case POPPLER_ACTION_JAVASCRIPT: {
+                GtkTextBuffer *buffer;
+                GtkWidget     *textview;
+                GtkWidget     *swindow;
+
+                pgd_table_add_property (GTK_TABLE (table), "<b>Type:</b>", "JavaScript", &row);
+
+                buffer = gtk_text_buffer_new (NULL);
+                if (action->javascript.script)
+                        gtk_text_buffer_set_text (buffer, action->javascript.script, -1);
+
+                textview = gtk_text_view_new_with_buffer (buffer);
+                gtk_text_view_set_editable (GTK_TEXT_VIEW (textview), FALSE);
+                g_object_unref (buffer);
+
+                swindow = gtk_scrolled_window_new (NULL, NULL);
+                gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (swindow),
+                                                GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
+                gtk_container_add (GTK_CONTAINER (swindow), textview);
+                gtk_widget_show (textview);
+
+                pgd_table_add_property_with_custom_widget (GTK_TABLE (table), NULL, swindow, &row);
+                gtk_widget_show (swindow);
+        }
+                break;
+       default:
+               g_assert_not_reached ();
+       }
+
+       gtk_container_add (GTK_CONTAINER (alignment), table);
+       gtk_widget_show (table);
+}
+
+gchar *
+pgd_format_date (time_t utime)
+{
+       time_t time = (time_t) utime;
+       char s[256];
+       const char *fmt_hack = "%c";
+       size_t len;
+#ifdef HAVE_LOCALTIME_R
+       struct tm t;
+       if (time == 0 || !localtime_r (&time, &t)) return NULL;
+       len = strftime (s, sizeof (s), fmt_hack, &t);
+#else
+       struct tm *t;
+       if (time == 0 || !(t = localtime (&time)) ) return NULL;
+       len = strftime (s, sizeof (s), fmt_hack, t);
+#endif
+
+       if (len == 0 || s[0] == '\0') return NULL;
+
+       return g_locale_to_utf8 (s, -1, NULL, NULL, NULL);
+}
+
+GtkWidget *
+pgd_movie_view_new (void)
+{
+       GtkWidget  *frame, *label;
+
+       frame = gtk_frame_new (NULL);
+       gtk_frame_set_shadow_type (GTK_FRAME (frame), GTK_SHADOW_NONE);
+       label = gtk_label_new (NULL);
+       gtk_label_set_markup (GTK_LABEL (label), "<b>Movie Properties</b>");
+       gtk_frame_set_label_widget (GTK_FRAME (frame), label);
+       gtk_widget_show (label);
+
+       return frame;
+}
+
+static void
+pgd_movie_view_play_movie (GtkWidget    *button,
+                          PopplerMovie *movie)
+{
+       const gchar *filename;
+       GFile       *file;
+       gchar       *uri;
+
+       filename = poppler_movie_get_filename (movie);
+       if (g_path_is_absolute (filename)) {
+               file = g_file_new_for_path (filename);
+       } else if (g_strrstr (filename, "://")) {
+               file = g_file_new_for_uri (filename);
+       } else {
+               gchar *cwd;
+               gchar *path;
+
+               // FIXME: relative to doc uri, not cwd
+               cwd = g_get_current_dir ();
+               path = g_build_filename (cwd, filename, NULL);
+               g_free (cwd);
+
+               file = g_file_new_for_path (path);
+               g_free (path);
+       }
+
+       uri = g_file_get_uri (file);
+       g_object_unref (file);
+       if (uri) {
+               gtk_show_uri (gtk_widget_get_screen (button),
+                             uri, GDK_CURRENT_TIME, NULL);
+               g_free (uri);
+       }
+}
+
+void
+pgd_movie_view_set_movie (GtkWidget    *movie_view,
+                         PopplerMovie *movie)
+{
+       GtkWidget  *alignment;
+       GtkWidget  *table;
+       GtkWidget  *button;
+       gint        row = 0;
+
+       alignment = gtk_bin_get_child (GTK_BIN (movie_view));
+       if (alignment) {
+               gtk_container_remove (GTK_CONTAINER (movie_view), alignment);
+       }
+
+       alignment = gtk_alignment_new (0.5, 0.5, 1, 1);
+       gtk_alignment_set_padding (GTK_ALIGNMENT (alignment), 5, 5, 12, 5);
+       gtk_container_add (GTK_CONTAINER (movie_view), alignment);
+       gtk_widget_show (alignment);
+
+       if (!movie)
+               return;
+
+       table = gtk_table_new (10, 2, FALSE);
+       gtk_table_set_col_spacings (GTK_TABLE (table), 6);
+       gtk_table_set_row_spacings (GTK_TABLE (table), 6);
+
+       pgd_table_add_property (GTK_TABLE (table), "<b>Filename:</b>", poppler_movie_get_filename (movie), &row);
+       pgd_table_add_property (GTK_TABLE (table), "<b>Need Poster:</b>", poppler_movie_need_poster (movie) ? "Yes" : "No", &row);
+       pgd_table_add_property (GTK_TABLE (table), "<b>Show Controls:</b>", poppler_movie_show_controls (movie) ? "Yes" : "No", &row);
+
+       button = gtk_button_new_from_stock (GTK_STOCK_MEDIA_PLAY);
+       g_signal_connect (button, "clicked",
+                         G_CALLBACK (pgd_movie_view_play_movie),
+                         movie);
+       pgd_table_add_property_with_custom_widget (GTK_TABLE (table), NULL, button, &row);
+       gtk_widget_show (button);
+
+       gtk_container_add (GTK_CONTAINER (alignment), table);
+       gtk_widget_show (table);
+}
+
+GdkPixbuf *
+pgd_pixbuf_new_for_color (PopplerColor *poppler_color)
+{
+        GdkPixbuf *pixbuf;
+       gint num, x;
+       guchar *pixels;
+
+        if (!poppler_color)
+                return NULL;
+
+        pixbuf = gdk_pixbuf_new (GDK_COLORSPACE_RGB,
+                                 FALSE, 8,
+                                 64, 16);
+
+       pixels = gdk_pixbuf_get_pixels (pixbuf);
+       num = gdk_pixbuf_get_width (pixbuf) * gdk_pixbuf_get_height (pixbuf);
+
+       for (x = 0; x < num; x++) {
+                pixels[0] = poppler_color->red;
+                pixels[1] = poppler_color->green;
+                pixels[2] = poppler_color->blue;
+                pixels += 3;
+       }
+
+        return pixbuf;
+}
diff --git a/glib/demo/utils.h b/glib/demo/utils.h
new file mode 100644 (file)
index 0000000..452f3fa
--- /dev/null
@@ -0,0 +1,51 @@
+/*
+ * Copyright (C) 2007 Carlos Garcia Campos  <carlosgc@gnome.org>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include <gtk/gtk.h>
+#include <poppler.h>
+
+#ifndef _UTILS_H_
+#define _UTILS_H_
+
+G_BEGIN_DECLS
+
+void       pgd_table_add_property                    (GtkTable        *table,
+                                                     const gchar     *markup,
+                                                     const gchar     *value,
+                                                     gint            *row);
+void       pgd_table_add_property_with_value_widget  (GtkTable        *table,
+                                                     const gchar     *markup,
+                                                     GtkWidget      **value_widget,
+                                                     const gchar     *value,
+                                                     gint            *row);
+void       pgd_table_add_property_with_custom_widget (GtkTable       *table,
+                                                     const gchar    *markup,
+                                                     GtkWidget      *widget,
+                                                     gint           *row);
+GtkWidget *pgd_action_view_new                       (PopplerDocument *document);
+void       pgd_action_view_set_action                (GtkWidget       *action_view,
+                                                     PopplerAction   *action);
+gchar     *pgd_format_date                           (time_t           utime);
+GtkWidget *pgd_movie_view_new                        (void);
+void       pgd_movie_view_set_movie                  (GtkWidget       *movie_view,
+                                                     PopplerMovie    *movie);
+GdkPixbuf *pgd_pixbuf_new_for_color                  (PopplerColor    *poppler_color);
+
+G_END_DECLS
+
+#endif /* _UTILS_H_ */
diff --git a/glib/poppler-action.cc b/glib/poppler-action.cc
new file mode 100644 (file)
index 0000000..384530f
--- /dev/null
@@ -0,0 +1,691 @@
+/* poppler-action.cc: glib wrapper for poppler       -*- c-basic-offset: 8 -*-
+ * Copyright (C) 2005, Red Hat, Inc.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include "poppler.h"
+#include "poppler-private.h"
+
+/**
+ * SECTION:poppler-action
+ * @short_description: Action links
+ * @title: PopplerAction
+ */
+
+POPPLER_DEFINE_BOXED_TYPE (PopplerDest, poppler_dest, poppler_dest_copy, poppler_dest_free)
+
+/**
+ * poppler_dest_copy:
+ * @dest: a #PopplerDest
+ *
+ * Copies @dest, creating an identical #PopplerDest.
+ *
+ * Return value: a new destination identical to @dest
+ **/
+PopplerDest *
+poppler_dest_copy (PopplerDest *dest)
+{
+       PopplerDest *new_dest;
+
+       new_dest = g_slice_dup (PopplerDest, dest);
+
+       if (dest->named_dest)
+               new_dest->named_dest = g_strdup (dest->named_dest);
+
+       return new_dest;
+}
+
+
+/**
+ * poppler_dest_free:
+ * @dest: a #PopplerDest
+ *
+ * Frees @dest
+ **/
+void
+poppler_dest_free (PopplerDest *dest)
+{
+       if (!dest)
+               return;
+       
+       if (dest->named_dest)
+               g_free (dest->named_dest);
+       
+       g_slice_free (PopplerDest, dest);
+}
+
+static void
+poppler_action_layer_free (PopplerActionLayer *action_layer)
+{
+       if (!action_layer)
+               return;
+
+       if (action_layer->layers) {
+               g_list_foreach (action_layer->layers, (GFunc)g_object_unref, NULL);
+               g_list_free (action_layer->layers);
+               action_layer->layers = NULL;
+       }
+
+       g_slice_free (PopplerActionLayer, action_layer);
+}
+
+static PopplerActionLayer *
+poppler_action_layer_copy (PopplerActionLayer *action_layer)
+{
+       PopplerActionLayer *retval = g_slice_dup (PopplerActionLayer, action_layer);
+
+       retval->layers = g_list_copy (action_layer->layers);
+       g_list_foreach (action_layer->layers, (GFunc)g_object_ref, NULL);
+
+       return retval;
+}
+
+POPPLER_DEFINE_BOXED_TYPE (PopplerAction, poppler_action, poppler_action_copy, poppler_action_free)
+
+/**
+ * poppler_action_free:
+ * @action: a #PopplerAction
+ * 
+ * Frees @action
+ **/
+void
+poppler_action_free (PopplerAction *action)
+{
+       if (action == NULL)
+               return;
+
+       /* Action specific stuff */
+       switch (action->type) {
+       case POPPLER_ACTION_GOTO_DEST:
+               poppler_dest_free (action->goto_dest.dest);
+               break;
+       case POPPLER_ACTION_GOTO_REMOTE:
+               poppler_dest_free (action->goto_remote.dest);
+               g_free (action->goto_remote.file_name);
+               break;
+       case POPPLER_ACTION_URI:
+               g_free (action->uri.uri);
+               break;
+       case POPPLER_ACTION_LAUNCH:
+               g_free (action->launch.file_name);
+               g_free (action->launch.params);
+               break;
+       case POPPLER_ACTION_NAMED:
+               g_free (action->named.named_dest);
+               break;
+       case POPPLER_ACTION_MOVIE:
+               if (action->movie.movie)
+                       g_object_unref (action->movie.movie);
+               break;
+       case POPPLER_ACTION_RENDITION:
+               if (action->rendition.media)
+                       g_object_unref (action->rendition.media);
+               break;
+       case POPPLER_ACTION_OCG_STATE:
+               if (action->ocg_state.state_list) {
+                       g_list_foreach (action->ocg_state.state_list, (GFunc)poppler_action_layer_free, NULL);
+                       g_list_free (action->ocg_state.state_list);
+               }
+               break;
+       case POPPLER_ACTION_JAVASCRIPT:
+               if (action->javascript.script)
+                       g_free (action->javascript.script);
+               break;
+       default:
+               break;
+       }
+       
+       g_free (action->any.title);
+       g_slice_free (PopplerAction, action);
+}
+
+/**
+ * poppler_action_copy:
+ * @action: a #PopplerAction
+ * 
+ * Copies @action, creating an identical #PopplerAction.
+ * 
+ * Return value: a new action identical to @action
+ **/
+PopplerAction *
+poppler_action_copy (PopplerAction *action)
+{
+       PopplerAction *new_action;
+
+       g_return_val_if_fail (action != NULL, NULL);
+
+       /* Do a straight copy of the memory */
+       new_action = g_slice_dup (PopplerAction, action);
+
+       if (action->any.title != NULL)
+               new_action->any.title = g_strdup (action->any.title);
+
+       switch (action->type) {
+       case POPPLER_ACTION_GOTO_DEST:
+               new_action->goto_dest.dest = poppler_dest_copy (action->goto_dest.dest);
+               break;
+       case POPPLER_ACTION_GOTO_REMOTE:
+               new_action->goto_remote.dest = poppler_dest_copy (action->goto_remote.dest);
+               if (action->goto_remote.file_name)
+                       new_action->goto_remote.file_name = g_strdup (action->goto_remote.file_name);
+               break;
+       case POPPLER_ACTION_URI:
+               if (action->uri.uri)
+                       new_action->uri.uri = g_strdup (action->uri.uri);
+               break;
+       case POPPLER_ACTION_LAUNCH:
+               if (action->launch.file_name)
+                       new_action->launch.file_name = g_strdup (action->launch.file_name);
+               if (action->launch.params)
+                       new_action->launch.params = g_strdup (action->launch.params);
+               break;
+       case POPPLER_ACTION_NAMED:
+               if (action->named.named_dest)
+                       new_action->named.named_dest = g_strdup (action->named.named_dest);
+               break;
+       case POPPLER_ACTION_MOVIE:
+               if (action->movie.movie)
+                       new_action->movie.movie = (PopplerMovie *)g_object_ref (action->movie.movie);
+               break;
+       case POPPLER_ACTION_RENDITION:
+               if (action->rendition.media)
+                       new_action->rendition.media = (PopplerMedia *)g_object_ref (action->rendition.media);
+               break;
+       case POPPLER_ACTION_OCG_STATE:
+               if (action->ocg_state.state_list) {
+                       GList *l;
+                       GList *new_list = NULL;
+
+                       for (l = action->ocg_state.state_list; l; l = g_list_next (l)) {
+                               PopplerActionLayer *alayer = (PopplerActionLayer *)l->data;
+                               new_list = g_list_prepend (new_list, poppler_action_layer_copy (alayer));
+                       }
+
+                       new_action->ocg_state.state_list = g_list_reverse (new_list);
+               }
+
+               break;
+       case POPPLER_ACTION_JAVASCRIPT:
+               if (action->javascript.script)
+                       new_action->javascript.script = g_strdup (action->javascript.script);
+               break;
+       default:
+               break;
+       }
+           
+       return new_action;
+}
+
+PopplerDest *
+dest_new_goto (PopplerDocument *document,
+              LinkDest        *link_dest)
+{
+       PopplerDest *dest;
+
+       dest = g_slice_new0 (PopplerDest);
+
+       if (link_dest == NULL) {
+               dest->type = POPPLER_DEST_UNKNOWN;
+               return dest;
+       }
+
+       switch (link_dest->getKind ()) {
+       case destXYZ:
+               dest->type = POPPLER_DEST_XYZ;
+               break;
+       case destFit:
+               dest->type = POPPLER_DEST_FIT;
+               break;
+       case destFitH:
+               dest->type = POPPLER_DEST_FITH;
+               break;
+       case destFitV:
+               dest->type = POPPLER_DEST_FITV;
+               break;
+       case destFitR:
+               dest->type = POPPLER_DEST_FITR;
+               break;
+       case destFitB:
+               dest->type = POPPLER_DEST_FITB;
+               break;
+       case destFitBH:
+               dest->type = POPPLER_DEST_FITBH;
+               break;
+       case destFitBV:
+               dest->type = POPPLER_DEST_FITBV;
+               break;
+       default:
+               dest->type = POPPLER_DEST_UNKNOWN;
+       }
+
+       if (link_dest->isPageRef ()) {
+               if (document) {
+                       Ref page_ref = link_dest->getPageRef ();
+                       dest->page_num = document->doc->findPage (page_ref.num, page_ref.gen);
+               } else {
+                       /* FIXME: We don't keep areound the page_ref for the
+                        * remote doc, so we can't look this up.  Guess that
+                        * it's 0*/
+                       dest->page_num = 0;
+               }
+       } else {
+               dest->page_num = link_dest->getPageNum ();
+       }
+
+       dest->left = link_dest->getLeft ();
+       dest->bottom = link_dest->getBottom ();
+       dest->right = link_dest->getRight ();
+       dest->top = link_dest->getTop ();
+       dest->zoom = link_dest->getZoom ();
+       dest->change_left = link_dest->getChangeLeft ();
+       dest->change_top = link_dest->getChangeTop ();
+       dest->change_zoom = link_dest->getChangeZoom ();
+       
+       if (document && dest->page_num > 0) {
+               PopplerPage *page;
+
+               page = poppler_document_get_page (document, dest->page_num - 1);
+
+               if (page) {
+                       dest->left -= page->page->getCropBox ()->x1;
+                       dest->bottom -= page->page->getCropBox ()->x1;
+                       dest->right -= page->page->getCropBox ()->y1;
+                       dest->top -= page->page->getCropBox ()->y1;
+
+                       g_object_unref (page);
+               } else {
+                       g_warning ("Invalid page %d in Link Destination\n", dest->page_num);
+                       dest->page_num = 0;
+               }
+       }
+       
+       return dest;
+}
+
+static PopplerDest *
+dest_new_named (GooString *named_dest)
+{
+       PopplerDest *dest;
+
+       dest = g_slice_new0 (PopplerDest);
+
+       if (named_dest == NULL) {
+               dest->type = POPPLER_DEST_UNKNOWN;
+               return dest;
+       }
+
+       dest->type = POPPLER_DEST_NAMED;
+       dest->named_dest = g_strdup (named_dest->getCString ());
+
+       return dest;
+}
+
+static void
+build_goto_dest (PopplerDocument *document,
+                PopplerAction   *action,
+                LinkGoTo        *link)
+{
+       LinkDest *link_dest;
+       GooString *named_dest;
+
+       /* Return if it isn't OK */
+       if (! link->isOk ()) {
+               action->goto_dest.dest = dest_new_goto (NULL, NULL);
+               return;
+       }
+       
+       link_dest = link->getDest ();
+       named_dest = link->getNamedDest ();
+
+       if (link_dest != NULL) {
+               action->goto_dest.dest = dest_new_goto (document, link_dest);
+       } else if (named_dest != NULL) {
+               action->goto_dest.dest = dest_new_named (named_dest);
+       } else {
+               action->goto_dest.dest = dest_new_goto (document, NULL);
+       }
+}
+
+static void
+build_goto_remote (PopplerAction *action,
+                  LinkGoToR     *link)
+{
+       LinkDest *link_dest;
+       GooString *named_dest;
+       
+       /* Return if it isn't OK */
+       if (! link->isOk ()) {
+               action->goto_remote.dest = dest_new_goto (NULL, NULL);
+               return;
+       }
+
+       action->goto_remote.file_name = _poppler_goo_string_to_utf8 (link->getFileName());
+
+       link_dest = link->getDest ();
+       named_dest = link->getNamedDest ();
+       
+       if (link_dest != NULL) {
+               action->goto_remote.dest = dest_new_goto (NULL, link_dest);
+       } else if (named_dest != NULL) {
+               action->goto_remote.dest = dest_new_named (named_dest);
+       } else {
+               action->goto_remote.dest = dest_new_goto (NULL, NULL);
+       }
+}
+
+static void
+build_launch (PopplerAction *action,
+             LinkLaunch    *link)
+{
+       if (link->getFileName()) {
+               action->launch.file_name = g_strdup (link->getFileName()->getCString ());
+       }
+       if (link->getParams()) {
+               action->launch.params = g_strdup (link->getParams()->getCString ());
+       }
+}
+
+static void
+build_uri (PopplerAction *action,
+          LinkURI       *link)
+{
+       gchar *uri;
+
+       uri = link->getURI()->getCString ();
+       if (uri != NULL)
+               action->uri.uri = g_strdup (uri);
+}
+
+static void
+build_named (PopplerAction *action,
+            LinkNamed     *link)
+{
+       gchar *name;
+
+       name = link->getName ()->getCString ();
+       if (name != NULL)
+               action->named.named_dest = g_strdup (name);
+}
+
+static AnnotMovie *
+find_annot_movie_for_action (PopplerDocument *document,
+                            LinkMovie       *link)
+{
+  AnnotMovie *annot = NULL;
+  XRef *xref = document->doc->getXRef ();
+  Object annotObj;
+
+  if (link->hasAnnotRef ()) {
+    Ref *ref = link->getAnnotRef ();
+
+    xref->fetch (ref->num, ref->gen, &annotObj);
+  } else if (link->hasAnnotTitle ()) {
+    Object annots;
+    GooString *title = link->getAnnotTitle ();
+    int i;
+
+    for (i = 1; i <= document->doc->getNumPages (); ++i) {
+      Page *p = document->doc->getPage (i);
+      if (!p) continue;
+
+      if (p->getAnnots (&annots)->isArray ()) {
+        int j;
+       GBool found = gFalse;
+
+       for (j = 0; j < annots.arrayGetLength () && !found; ++j) {
+          if (annots.arrayGet(j, &annotObj)->isDict()) {
+           Object obj1;
+
+           if (!annotObj.dictLookup ("Subtype", &obj1)->isName ("Movie")) {
+             obj1.free ();
+             continue;
+           }
+           obj1.free ();
+
+           if (annotObj.dictLookup ("T", &obj1)->isString()) {
+             GooString *t = obj1.getString ();
+
+             if (title->cmp(t) == 0)
+               found = gTrue;
+           }
+           obj1.free ();
+         }
+         if (!found)
+           annotObj.free ();
+       }
+       if (found) {
+         annots.free ();
+         break;
+       } else {
+          annotObj.free ();
+       }
+      }
+      annots.free ();
+    }
+  }
+
+  if (annotObj.isDict ()) {
+    Object tmp;
+
+    annot = new AnnotMovie (document->doc, annotObj.getDict(), &tmp);
+    if (!annot->isOk ()) {
+      delete annot;
+      annot = NULL;
+    }
+  }
+  annotObj.free ();
+
+  return annot;
+}
+
+static void
+build_movie (PopplerDocument *document,
+            PopplerAction   *action,
+            LinkMovie       *link)
+{
+       AnnotMovie *annot;
+
+       switch (link->getOperation ()) {
+       case LinkMovie::operationTypePause:
+               action->movie.operation = POPPLER_ACTION_MOVIE_PAUSE;
+               break;
+       case LinkMovie::operationTypeResume:
+               action->movie.operation = POPPLER_ACTION_MOVIE_RESUME;
+               break;
+       case LinkMovie::operationTypeStop:
+               action->movie.operation = POPPLER_ACTION_MOVIE_STOP;
+               break;
+       default:
+       case LinkMovie::operationTypePlay:
+               action->movie.operation = POPPLER_ACTION_MOVIE_PLAY;
+               break;
+       }
+
+       annot = find_annot_movie_for_action (document, link);
+       if (annot) {
+               action->movie.movie = _poppler_movie_new (annot->getMovie());
+               delete annot;
+       }
+}
+
+static void
+build_javascript (PopplerAction *action,
+                 LinkJavaScript *link)
+{
+       GooString *script;
+
+       script = link->getScript();
+       if (script)
+               action->javascript.script = _poppler_goo_string_to_utf8 (script);
+
+}
+
+static void
+build_rendition (PopplerAction *action,
+                LinkRendition *link)
+{
+       action->rendition.op = link->getOperation();
+       if (link->hasRenditionObject())
+               action->rendition.media = _poppler_media_new (link->getMedia());
+       // TODO: annotation reference
+}
+
+static PopplerLayer *
+get_layer_for_ref (PopplerDocument *document,
+                  GList           *layers,
+                  Ref             *ref,
+                  gboolean         preserve_rb)
+{
+       GList *l;
+
+       for (l = layers; l; l = g_list_next (l)) {
+               Layer *layer = (Layer *)l->data;
+
+               if (layer->oc) {
+                       Ref ocgRef = layer->oc->getRef();
+
+                       if (ref->num == ocgRef.num && ref->gen == ocgRef.gen) {
+                               GList *rb_group = NULL;
+
+                               if (preserve_rb)
+                                       rb_group = _poppler_document_get_layer_rbgroup (document, layer);
+                               return _poppler_layer_new (document, layer, rb_group);
+                       }
+               }
+
+               if (layer->kids) {
+                       PopplerLayer *retval = get_layer_for_ref (document, layer->kids, ref, preserve_rb);
+                       if (retval)
+                               return retval;
+               }
+       }
+
+       return NULL;
+}
+
+static void
+build_ocg_state (PopplerDocument *document,
+                PopplerAction   *action,
+                LinkOCGState    *ocg_state)
+{
+       GooList *st_list = ocg_state->getStateList();
+       GBool    preserve_rb = ocg_state->getPreserveRB();
+       gint     i, j;
+       GList   *layer_state = NULL;
+
+       if (!document->layers) {
+               if (!_poppler_document_get_layers (document))
+                       return;
+       }
+
+       for (i = 0; i < st_list->getLength(); ++i) {
+               LinkOCGState::StateList *list = (LinkOCGState::StateList *)st_list->get(i);
+               PopplerActionLayer *action_layer = g_new0 (PopplerActionLayer, 1);
+
+               switch (list->st) {
+               case LinkOCGState::On:
+                       action_layer->action = POPPLER_ACTION_LAYER_ON;
+                       break;
+               case LinkOCGState::Off:
+                       action_layer->action = POPPLER_ACTION_LAYER_OFF;
+                       break;
+               case LinkOCGState::Toggle:
+                       action_layer->action = POPPLER_ACTION_LAYER_TOGGLE;
+                       break;
+               }
+
+               for (j = 0; j < list->list->getLength(); ++j) {
+                       Ref *ref = (Ref *)list->list->get(j);
+                       PopplerLayer *layer = get_layer_for_ref (document, document->layers, ref, preserve_rb);
+
+                       action_layer->layers = g_list_prepend (action_layer->layers, layer);
+               }
+
+               layer_state = g_list_prepend (layer_state, action_layer);
+       }
+
+       action->ocg_state.state_list = g_list_reverse (layer_state);
+}
+
+PopplerAction *
+_poppler_action_new (PopplerDocument *document,
+                    LinkAction      *link,
+                    const gchar     *title)
+{
+       PopplerAction *action;
+
+       action = g_slice_new0 (PopplerAction);
+
+       if (title)
+               action->any.title = g_strdup (title);
+
+       if (link == NULL) {
+               action->type = POPPLER_ACTION_NONE;
+               return action;
+       }
+
+       switch (link->getKind ()) {
+       case actionGoTo:
+               action->type = POPPLER_ACTION_GOTO_DEST;
+               build_goto_dest (document, action, dynamic_cast <LinkGoTo *> (link));
+               break;
+       case actionGoToR:
+               action->type = POPPLER_ACTION_GOTO_REMOTE;
+               build_goto_remote (action, dynamic_cast <LinkGoToR *> (link));
+               break;
+       case actionLaunch:
+               action->type = POPPLER_ACTION_LAUNCH;
+               build_launch (action, dynamic_cast <LinkLaunch *> (link));
+               break;
+       case actionURI:
+               action->type = POPPLER_ACTION_URI;
+               build_uri (action, dynamic_cast <LinkURI *> (link));
+               break;
+       case actionNamed:
+               action->type = POPPLER_ACTION_NAMED;
+               build_named (action, dynamic_cast <LinkNamed *> (link));
+               break;
+       case actionMovie:
+               action->type = POPPLER_ACTION_MOVIE;
+               build_movie (document, action, dynamic_cast<LinkMovie*> (link));
+               break;
+       case actionRendition:
+               action->type = POPPLER_ACTION_RENDITION;
+               build_rendition (action, dynamic_cast<LinkRendition*> (link));
+               break;
+       case actionOCGState:
+               action->type = POPPLER_ACTION_OCG_STATE;
+               build_ocg_state (document, action, dynamic_cast<LinkOCGState*> (link));
+               break;
+       case actionJavaScript:
+               action->type = POPPLER_ACTION_JAVASCRIPT;
+               build_javascript (action, dynamic_cast<LinkJavaScript*> (link));
+               break;
+       case actionUnknown:
+       default:
+               action->type = POPPLER_ACTION_UNKNOWN;
+               break;
+       }
+
+       return action;
+}
+
+PopplerDest *
+_poppler_dest_new_goto (PopplerDocument *document,
+                       LinkDest        *link_dest)
+{
+       return dest_new_goto (document, link_dest);
+}
diff --git a/glib/poppler-action.h b/glib/poppler-action.h
new file mode 100644 (file)
index 0000000..2a5d7f8
--- /dev/null
@@ -0,0 +1,316 @@
+/* poppler-action.h: glib interface to poppler
+ * Copyright (C) 2004, Red Hat, Inc.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#ifndef __POPPLER_ACTION_H__
+#define __POPPLER_ACTION_H__
+
+#include <glib-object.h>
+#include "poppler.h"
+
+G_BEGIN_DECLS
+
+/**
+ * PopplerActionType:
+ * @POPPLER_ACTION_UNKNOWN: unknown action
+ * @POPPLER_ACTION_NONE: no action specified
+ * @POPPLER_ACTION_GOTO_DEST: go to destination
+ * @POPPLER_ACTION_GOTO_REMOTE: go to destination in another document
+ * @POPPLER_ACTION_LAUNCH: launch app (or open document
+ * @POPPLER_ACTION_URI: URI
+ * @POPPLER_ACTION_NAMED: predefined action
+ * @POPPLER_ACTION_MOVIE: play movies. Since 0.14
+ * @POPPLER_ACTION_RENDITION: play multimedia content. Since 0.14
+ * @POPPLER_ACTION_OCG_STATE: state of layer. Since 0.14
+ * @POPPLER_ACTION_JAVASCRIPT: Javascript. Since 0.18
+ *
+ * Action types
+ */
+typedef enum
+{
+       POPPLER_ACTION_UNKNOWN,         /* unknown action */
+       POPPLER_ACTION_NONE,            /* no action specified */
+       POPPLER_ACTION_GOTO_DEST,       /* go to destination */
+       POPPLER_ACTION_GOTO_REMOTE,     /* go to destination in new file */
+       POPPLER_ACTION_LAUNCH,          /* launch app (or open document) */
+       POPPLER_ACTION_URI,             /* URI */
+       POPPLER_ACTION_NAMED,           /* named action*/
+       POPPLER_ACTION_MOVIE,           /* movie action */
+       POPPLER_ACTION_RENDITION,       /* rendition action */
+       POPPLER_ACTION_OCG_STATE,       /* Set-OCG-State action */
+       POPPLER_ACTION_JAVASCRIPT       /* Javascript action */
+} PopplerActionType;
+
+/**
+ * PopplerDestType:
+ * @POPPLER_DEST_UNKNOWN: unknown destination
+ * @POPPLER_DEST_XYZ: go to page with coordinates (left, top)
+ * positioned at the upper-left corner of the window and the contents of
+ * the page magnified by the factor zoom
+ * @POPPLER_DEST_FIT: go to page with its contents magnified just
+ * enough to fit the entire page within the window both horizontally and
+ * vertically
+ * @POPPLER_DEST_FITH: go to page with the vertical coordinate top
+ * positioned at the top edge of the window and the contents of the page
+ * magnified just enough to fit the entire width of the page within the window
+ * @POPPLER_DEST_FITV: go to page with the horizontal coordinate
+ * left positioned at the left edge of the window and the contents of the
+ * page magnified just enough to fit the entire height of the page within the window
+ * @POPPLER_DEST_FITR: go to page with its contents magnified just
+ * enough to fit the rectangle specified by the coordinates left, bottom,
+ * right, and top entirely within the window both horizontally and vertically
+ * @POPPLER_DEST_FITB: go to page with its contents magnified just enough to fit
+ * its bounding box entirely within the window both horizontally and vertically
+ * @POPPLER_DEST_FITBH: go to page with the vertical
+ * coordinate top positioned at the top edge of the window and the
+ * contents of the page magnified just enough to fit the entire width of its
+ * bounding box within the window
+ * @POPPLER_DEST_FITBV: go to page with the horizontal
+ * coordinate left positioned at the left edge of the window and the
+ * contents of the page magnified just enough to fit the entire height of its
+ * bounding box within the window
+ * @POPPLER_DEST_NAMED: got to page specified by a name. See poppler_document_find_dest()
+ *
+ * Destination types
+ */
+typedef enum
+{
+       POPPLER_DEST_UNKNOWN,
+       POPPLER_DEST_XYZ,
+       POPPLER_DEST_FIT,
+       POPPLER_DEST_FITH,
+       POPPLER_DEST_FITV,
+       POPPLER_DEST_FITR,
+       POPPLER_DEST_FITB,
+       POPPLER_DEST_FITBH,
+       POPPLER_DEST_FITBV,
+       POPPLER_DEST_NAMED
+} PopplerDestType;
+
+/**
+ * PopplerActionMovieOperation:
+ * @POPPLER_ACTION_MOVIE_PLAY: play movie
+ * @POPPLER_ACTION_MOVIE_PAUSE: pause playing movie
+ * @POPPLER_ACTION_MOVIE_RESUME: resume paused movie
+ * @POPPLER_ACTION_MOVIE_STOP: stop playing movie
+ *
+ * Movie operations
+ *
+ * Since: 0.14
+ */
+typedef enum
+{
+        POPPLER_ACTION_MOVIE_PLAY,
+       POPPLER_ACTION_MOVIE_PAUSE,
+       POPPLER_ACTION_MOVIE_RESUME,
+       POPPLER_ACTION_MOVIE_STOP
+} PopplerActionMovieOperation;
+
+/**
+ * PopplerActionLayerAction:
+ * @POPPLER_ACTION_LAYER_ON: set layer visibility on
+ * @POPPLER_ACTION_LAYER_OFF: set layer visibility off
+ * @POPPLER_ACTION_LAYER_TOGGLE: reverse the layer visibility state
+ *
+ * Layer actions
+ *
+ * Since: 0.14
+ */
+typedef enum
+{
+       POPPLER_ACTION_LAYER_ON,
+       POPPLER_ACTION_LAYER_OFF,
+       POPPLER_ACTION_LAYER_TOGGLE
+} PopplerActionLayerAction;
+
+/* Define the PopplerAction types */
+typedef struct _PopplerActionAny        PopplerActionAny;
+typedef struct _PopplerActionGotoDest   PopplerActionGotoDest;
+typedef struct _PopplerActionGotoRemote PopplerActionGotoRemote;
+typedef struct _PopplerActionLaunch     PopplerActionLaunch;
+typedef struct _PopplerActionUri        PopplerActionUri;
+typedef struct _PopplerActionNamed      PopplerActionNamed;
+typedef struct _PopplerActionMovie      PopplerActionMovie;
+typedef struct _PopplerActionRendition  PopplerActionRendition;
+typedef struct _PopplerActionOCGState   PopplerActionOCGState;
+typedef struct _PopplerActionJavascript PopplerActionJavascript;
+
+/**
+ * PopplerDest:
+ * @type: type of destination
+ * @page_num: page number
+ * @left: left coordinate
+ * @bottom: bottom coordinate
+ * @right: right coordinate
+ * @top: top coordinate
+ * @zoom: scale factor
+ * @named_dest: name of the destination (#POPPLER_DEST_NAMED only)
+ * @change_left: whether left coordinate should be changed
+ * @change_top: whether top coordinate should be changed
+ * @change_zoom: whether scale factor should be changed
+ *
+ * Data structure for holding a destination
+ */
+struct _PopplerDest
+{
+       PopplerDestType type;
+
+       int page_num;
+       double left;
+       double bottom;
+       double right;
+       double top;
+       double zoom;
+       gchar *named_dest;
+       guint change_left : 1;
+       guint change_top : 1;
+       guint change_zoom : 1;
+};
+
+/**
+ * PopplerActionLayer:
+ * @action: a #PopplerActionLayerAction
+ * @layers: list of #PopplerLayer<!-- -->s
+ *
+ * Action to perform over a list of layers
+ */
+struct _PopplerActionLayer
+{
+       PopplerActionLayerAction action;
+       GList *layers;
+};
+
+struct _PopplerActionAny
+{
+       PopplerActionType type;
+       gchar *title;
+};
+
+struct _PopplerActionGotoDest
+{
+       PopplerActionType type;
+       gchar *title;
+
+       PopplerDest *dest;
+};
+
+struct _PopplerActionGotoRemote
+{
+       PopplerActionType type;
+       gchar *title;
+
+       gchar *file_name;
+       PopplerDest *dest;
+};
+
+struct _PopplerActionLaunch
+{
+       PopplerActionType type;
+       gchar *title;
+
+       gchar *file_name;
+       gchar *params;
+};
+
+struct _PopplerActionUri
+{
+       PopplerActionType type;
+       gchar *title;
+
+       char *uri;
+};
+
+struct _PopplerActionNamed
+{
+       PopplerActionType type;
+       gchar *title;
+
+       gchar *named_dest;
+};
+
+struct _PopplerActionMovie
+{
+        PopplerActionType           type;
+        gchar                      *title;
+
+        PopplerActionMovieOperation operation;
+       PopplerMovie               *movie;
+};
+
+struct _PopplerActionRendition
+{
+       PopplerActionType type;
+       gchar            *title;
+
+       gint               op;
+       PopplerMedia      *media;
+};
+
+struct _PopplerActionOCGState
+{
+       PopplerActionType type;
+       gchar            *title;
+
+       GList            *state_list;
+};
+
+struct _PopplerActionJavascript
+{
+       PopplerActionType  type;
+       gchar             *title;
+
+       gchar             *script;
+};
+
+/**
+ * PopplerAction:
+ *
+ * A data structure for holding actions
+ */
+union _PopplerAction
+{
+       PopplerActionType type;
+       PopplerActionAny any;
+       PopplerActionGotoDest goto_dest;
+       PopplerActionGotoRemote goto_remote;
+       PopplerActionLaunch launch;
+       PopplerActionUri uri;
+       PopplerActionNamed named;
+       PopplerActionMovie movie;
+       PopplerActionRendition rendition;
+       PopplerActionOCGState ocg_state;
+       PopplerActionJavascript javascript;
+};
+
+#define POPPLER_TYPE_ACTION             (poppler_action_get_type ())
+#define POPPLER_ACTION(obj)             (G_TYPE_CHECK_INSTANCE_CAST ((obj), POPPLER_TYPE_ACTION, PopplerAction))
+
+GType          poppler_action_get_type (void) G_GNUC_CONST;
+
+void           poppler_action_free     (PopplerAction *action);
+PopplerAction *poppler_action_copy     (PopplerAction *action);
+
+
+#define POPPLER_TYPE_DEST              (poppler_dest_get_type ())
+GType          poppler_dest_get_type   (void) G_GNUC_CONST;
+
+void           poppler_dest_free       (PopplerDest   *dest);
+PopplerDest   *poppler_dest_copy       (PopplerDest   *dest);
+
+G_END_DECLS
+
+#endif /* __POPPLER_GLIB_H__ */
diff --git a/glib/poppler-annot.cc b/glib/poppler-annot.cc
new file mode 100644 (file)
index 0000000..2a544f1
--- /dev/null
@@ -0,0 +1,1373 @@
+/* poppler-annot.cc: glib interface to poppler
+ *
+ * Copyright (C) 2007 Inigo Martinez <inigomartinez@gmail.com>
+ * Copyright (C) 2009 Carlos Garcia Campos <carlosgc@gnome.org>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include "config.h"
+#include "poppler.h"
+#include "poppler-private.h"
+
+/**
+ * SECTION:poppler-annot
+ * @short_description: Annotations
+ * @title: PopplerAnnot
+ */
+
+typedef struct _PopplerAnnotClass               PopplerAnnotClass;
+typedef struct _PopplerAnnotMarkupClass         PopplerAnnotMarkupClass;
+typedef struct _PopplerAnnotFreeTextClass       PopplerAnnotFreeTextClass;
+typedef struct _PopplerAnnotTextClass           PopplerAnnotTextClass;
+typedef struct _PopplerAnnotFileAttachmentClass PopplerAnnotFileAttachmentClass;
+typedef struct _PopplerAnnotMovieClass          PopplerAnnotMovieClass;
+typedef struct _PopplerAnnotScreenClass         PopplerAnnotScreenClass;
+
+struct _PopplerAnnotClass
+{
+  GObjectClass parent_class;
+};
+
+struct _PopplerAnnotMarkup
+{
+  PopplerAnnot parent_instance;
+};
+
+struct _PopplerAnnotMarkupClass
+{
+  PopplerAnnotClass parent_class;
+};
+
+struct _PopplerAnnotText
+{
+  PopplerAnnotMarkup parent_instance;
+};
+
+struct _PopplerAnnotTextClass
+{
+  PopplerAnnotMarkupClass parent_class;
+};
+
+struct _PopplerAnnotFreeText
+{
+  PopplerAnnotMarkup parent_instance;
+};
+
+struct _PopplerAnnotFreeTextClass
+{
+  PopplerAnnotMarkupClass parent_class;
+};
+
+struct _PopplerAnnotFileAttachment
+{
+  PopplerAnnotMarkup parent_instance;
+};
+
+struct _PopplerAnnotFileAttachmentClass
+{
+  PopplerAnnotMarkupClass parent_class;
+};
+
+struct _PopplerAnnotMovie
+{
+  PopplerAnnot  parent_instance;
+
+  PopplerMovie *movie;
+};
+
+struct _PopplerAnnotMovieClass
+{
+  PopplerAnnotClass parent_class;
+};
+
+struct _PopplerAnnotScreen
+{
+  PopplerAnnot  parent_instance;
+
+  PopplerAction *action;
+};
+
+struct _PopplerAnnotScreenClass
+{
+  PopplerAnnotClass parent_class;
+};
+
+
+G_DEFINE_TYPE (PopplerAnnot, poppler_annot, G_TYPE_OBJECT)
+G_DEFINE_TYPE (PopplerAnnotMarkup, poppler_annot_markup, POPPLER_TYPE_ANNOT)
+G_DEFINE_TYPE (PopplerAnnotText, poppler_annot_text, POPPLER_TYPE_ANNOT_MARKUP)
+G_DEFINE_TYPE (PopplerAnnotFreeText, poppler_annot_free_text, POPPLER_TYPE_ANNOT_MARKUP)
+G_DEFINE_TYPE (PopplerAnnotFileAttachment, poppler_annot_file_attachment, POPPLER_TYPE_ANNOT_MARKUP)
+G_DEFINE_TYPE (PopplerAnnotMovie, poppler_annot_movie, POPPLER_TYPE_ANNOT)
+G_DEFINE_TYPE (PopplerAnnotScreen, poppler_annot_screen, POPPLER_TYPE_ANNOT)
+
+static void
+poppler_annot_finalize (GObject *object)
+{
+  PopplerAnnot *poppler_annot = POPPLER_ANNOT (object);
+
+  poppler_annot->annot = NULL;
+
+  G_OBJECT_CLASS (poppler_annot_parent_class)->finalize (object);
+}
+
+static void
+poppler_annot_init (PopplerAnnot *poppler_annot)
+{
+}
+
+static void
+poppler_annot_class_init (PopplerAnnotClass *klass)
+{
+  GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
+
+  gobject_class->finalize = poppler_annot_finalize;
+}
+
+PopplerAnnot *
+_poppler_annot_new (Annot *annot)
+{
+  PopplerAnnot *poppler_annot;
+
+  poppler_annot = POPPLER_ANNOT (g_object_new (POPPLER_TYPE_ANNOT, NULL));
+  poppler_annot->annot = annot;
+
+  return poppler_annot;
+}
+
+static void
+poppler_annot_markup_init (PopplerAnnotMarkup *poppler_annot)
+{
+}
+
+static void
+poppler_annot_markup_class_init (PopplerAnnotMarkupClass *klass)
+{
+}
+
+static void
+poppler_annot_text_init (PopplerAnnotText *poppler_annot)
+{
+}
+
+static void
+poppler_annot_text_class_init (PopplerAnnotTextClass *klass)
+{
+}
+
+PopplerAnnot *
+_poppler_annot_text_new (Annot *annot)
+{
+  PopplerAnnot *poppler_annot;
+
+  poppler_annot = POPPLER_ANNOT (g_object_new (POPPLER_TYPE_ANNOT_TEXT, NULL));
+  poppler_annot->annot = annot;
+
+  return poppler_annot;
+}
+
+/**
+ * poppler_annot_text_new:
+ * @doc: a #PopplerDocument
+ * @rect: a #PopplerRectangle
+ *
+ * Creates a new Text annotation that will be
+ * located on @rect when added to a page. See
+ * poppler_page_add_annot()
+ *
+ * Return value: A newly created #PopplerAnnotText annotation
+ *
+ * Since: 0.16
+ */
+PopplerAnnot *
+poppler_annot_text_new (PopplerDocument  *doc,
+                       PopplerRectangle *rect)
+{
+  Annot *annot;
+  PDFRectangle pdf_rect(rect->x1, rect->y1,
+                       rect->x2, rect->y2);
+
+  annot = new AnnotText (doc->doc, &pdf_rect);
+
+  return _poppler_annot_text_new (annot);
+}
+
+static void
+poppler_annot_free_text_init (PopplerAnnotFreeText *poppler_annot)
+{
+}
+
+static void
+poppler_annot_free_text_class_init (PopplerAnnotFreeTextClass *klass)
+{
+}
+
+PopplerAnnot *
+_poppler_annot_free_text_new (Annot *annot)
+{
+  PopplerAnnot *poppler_annot;
+
+  poppler_annot = POPPLER_ANNOT (g_object_new (POPPLER_TYPE_ANNOT_FREE_TEXT, NULL));
+  poppler_annot->annot = annot;
+
+  return poppler_annot;
+}
+
+static void
+poppler_annot_file_attachment_init (PopplerAnnotFileAttachment *poppler_annot)
+{
+}
+
+static void
+poppler_annot_file_attachment_class_init (PopplerAnnotFileAttachmentClass *klass)
+{
+}
+
+PopplerAnnot *
+_poppler_annot_file_attachment_new (Annot *annot)
+{
+  PopplerAnnot *poppler_annot;
+
+  poppler_annot = POPPLER_ANNOT (g_object_new (POPPLER_TYPE_ANNOT_FILE_ATTACHMENT, NULL));
+  poppler_annot->annot = annot;
+
+  return poppler_annot;
+}
+
+
+static void
+poppler_annot_movie_finalize (GObject *object)
+{
+  PopplerAnnotMovie *annot_movie = POPPLER_ANNOT_MOVIE (object);
+
+  if (annot_movie->movie) {
+    g_object_unref (annot_movie->movie);
+    annot_movie->movie = NULL;
+  }
+
+  G_OBJECT_CLASS (poppler_annot_movie_parent_class)->finalize (object);
+}
+
+static void
+poppler_annot_movie_init (PopplerAnnotMovie *poppler_annot)
+{
+}
+
+static void
+poppler_annot_movie_class_init (PopplerAnnotMovieClass *klass)
+{
+  GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
+
+  gobject_class->finalize = poppler_annot_movie_finalize;
+}
+
+PopplerAnnot *
+_poppler_annot_movie_new (Annot *annot)
+{
+  PopplerAnnot *poppler_annot;
+  AnnotMovie   *annot_movie;
+
+  poppler_annot = POPPLER_ANNOT (g_object_new (POPPLER_TYPE_ANNOT_MOVIE, NULL));
+  poppler_annot->annot = annot;
+
+  annot_movie = static_cast<AnnotMovie *>(poppler_annot->annot);
+  POPPLER_ANNOT_MOVIE (poppler_annot)->movie = _poppler_movie_new (annot_movie->getMovie());
+
+  return poppler_annot;
+}
+
+static void
+poppler_annot_screen_finalize (GObject *object)
+{
+  PopplerAnnotScreen *annot_screen = POPPLER_ANNOT_SCREEN (object);
+
+  if (annot_screen->action) {
+    poppler_action_free (annot_screen->action);
+    annot_screen->action = NULL;
+  }
+
+  G_OBJECT_CLASS (poppler_annot_screen_parent_class)->finalize (object);
+}
+
+static void
+poppler_annot_screen_init (PopplerAnnotScreen *poppler_annot)
+{
+}
+
+static void
+poppler_annot_screen_class_init (PopplerAnnotScreenClass *klass)
+{
+  GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
+
+  gobject_class->finalize = poppler_annot_screen_finalize;
+}
+
+PopplerAnnot *
+_poppler_annot_screen_new (Annot *annot)
+{
+  PopplerAnnot *poppler_annot;
+  AnnotScreen  *annot_screen;
+  LinkAction   *action;
+
+  poppler_annot = POPPLER_ANNOT (g_object_new (POPPLER_TYPE_ANNOT_SCREEN, NULL));
+  poppler_annot->annot = annot;
+
+  annot_screen = static_cast<AnnotScreen *>(poppler_annot->annot);
+  action = annot_screen->getAction();
+  if (action)
+    POPPLER_ANNOT_SCREEN (poppler_annot)->action = _poppler_action_new (NULL, action, NULL);
+
+  return poppler_annot;
+}
+
+
+/* Public methods */
+/**
+ * poppler_annot_get_annot_type:
+ * @poppler_annot: a #PopplerAnnot
+ *
+ * Gets the type of @poppler_annot
+ *
+ * Return value: #PopplerAnnotType of @poppler_annot.
+ **/ 
+PopplerAnnotType
+poppler_annot_get_annot_type (PopplerAnnot *poppler_annot)
+{
+  g_return_val_if_fail (POPPLER_IS_ANNOT (poppler_annot), POPPLER_ANNOT_UNKNOWN);
+
+  switch (poppler_annot->annot->getType ())
+    {
+    case Annot::typeText:
+      return POPPLER_ANNOT_TEXT;
+    case Annot::typeLink:
+      return POPPLER_ANNOT_LINK;
+    case Annot::typeFreeText:
+      return POPPLER_ANNOT_FREE_TEXT;
+    case Annot::typeLine:
+      return POPPLER_ANNOT_LINE;
+    case Annot::typeSquare:
+      return POPPLER_ANNOT_SQUARE;
+    case Annot::typeCircle:
+      return POPPLER_ANNOT_CIRCLE;
+    case Annot::typePolygon:
+      return POPPLER_ANNOT_POLYGON;
+    case Annot::typePolyLine:
+      return POPPLER_ANNOT_POLY_LINE;
+    case Annot::typeHighlight:
+      return POPPLER_ANNOT_HIGHLIGHT;
+    case Annot::typeUnderline:
+      return POPPLER_ANNOT_UNDERLINE;
+    case Annot::typeSquiggly:
+      return POPPLER_ANNOT_SQUIGGLY;
+    case Annot::typeStrikeOut:
+      return POPPLER_ANNOT_STRIKE_OUT;
+    case Annot::typeStamp:
+      return POPPLER_ANNOT_STAMP;
+    case Annot::typeCaret:
+      return POPPLER_ANNOT_CARET;
+    case Annot::typeInk:
+      return POPPLER_ANNOT_INK;
+    case Annot::typePopup:
+      return POPPLER_ANNOT_POPUP;
+    case Annot::typeFileAttachment:
+      return POPPLER_ANNOT_FILE_ATTACHMENT;
+    case Annot::typeSound:
+      return POPPLER_ANNOT_SOUND;
+    case Annot::typeMovie:
+      return POPPLER_ANNOT_MOVIE;
+    case Annot::typeWidget:
+      return POPPLER_ANNOT_WIDGET;
+    case Annot::typeScreen:
+      return POPPLER_ANNOT_SCREEN;
+    case Annot::typePrinterMark:
+      return POPPLER_ANNOT_PRINTER_MARK;
+    case Annot::typeTrapNet:
+      return POPPLER_ANNOT_TRAP_NET;
+    case Annot::typeWatermark:
+      return POPPLER_ANNOT_WATERMARK;
+    case Annot::type3D:
+      return POPPLER_ANNOT_3D;
+    default:
+      g_warning ("Unsupported Annot Type");
+    }
+
+  return POPPLER_ANNOT_UNKNOWN;
+}
+
+/**
+ * poppler_annot_get_contents:
+ * @poppler_annot: a #PopplerAnnot
+ *
+ * Retrieves the contents of @poppler_annot.
+ *
+ * Return value: a new allocated string with the contents of @poppler_annot. It
+ *               must be freed with g_free() when done.
+ **/
+gchar *
+poppler_annot_get_contents (PopplerAnnot *poppler_annot)
+{
+  GooString *contents;
+
+  g_return_val_if_fail (POPPLER_IS_ANNOT (poppler_annot), NULL);
+
+  contents = poppler_annot->annot->getContents ();
+
+  return contents ? _poppler_goo_string_to_utf8 (contents) : NULL;
+}
+
+/**
+ * poppler_annot_set_contents:
+ * @poppler_annot: a #PopplerAnnot
+ * @contents: a text string containing the new contents
+ *
+ * Sets the contents of @poppler_annot to the given value,
+ * replacing the current contents.
+ *
+ * Since: 0.12
+ **/
+void
+poppler_annot_set_contents (PopplerAnnot *poppler_annot,
+                           const gchar  *contents)
+{
+  GooString *goo_tmp;
+  gchar *tmp;
+  gsize length = 0;
+  
+  g_return_if_fail (POPPLER_IS_ANNOT (poppler_annot));
+
+  tmp = contents ? g_convert (contents, -1, "UTF-16BE", "UTF-8", NULL, &length, NULL) : NULL;
+  goo_tmp = new GooString (tmp, length);
+  g_free (tmp);
+  poppler_annot->annot->setContents (goo_tmp);
+  delete (goo_tmp);
+}
+
+/**
+ * poppler_annot_get_name:
+ * @poppler_annot: a #PopplerAnnot
+ *
+ * Retrieves the name of @poppler_annot.
+ *
+ * Return value: a new allocated string with the name of @poppler_annot. It must
+ *               be freed with g_free() when done.
+ **/
+gchar *
+poppler_annot_get_name (PopplerAnnot *poppler_annot)
+{
+  GooString *name;
+
+  g_return_val_if_fail (POPPLER_IS_ANNOT (poppler_annot), NULL);
+
+  name = poppler_annot->annot->getName ();
+
+  return name ? _poppler_goo_string_to_utf8 (name) : NULL;
+}
+
+/**
+ * poppler_annot_get_modified:
+ * @poppler_annot: a #PopplerAnnot
+ *
+ * Retrieves the last modification data of @poppler_annot. The returned
+ * string will be either a PDF format date or a text string.
+ * See also #poppler_date_parse()
+ *
+ * Return value: a new allocated string with the last modification data of
+ *               @poppler_annot. It must be freed with g_free() when done.
+ **/
+gchar *
+poppler_annot_get_modified (PopplerAnnot *poppler_annot)
+{
+  GooString *text;
+
+  g_return_val_if_fail (POPPLER_IS_ANNOT (poppler_annot), NULL);
+
+  text = poppler_annot->annot->getModified ();
+
+  return text ? _poppler_goo_string_to_utf8 (text) : NULL;
+}
+
+/**
+ * poppler_annot_get_flags
+ * @poppler_annot: a #PopplerAnnot
+ *
+ * Retrieves the flag field specifying various characteristics of the
+ * @poppler_annot.
+ *
+ * Return value: the flag field of @poppler_annot.
+ **/
+PopplerAnnotFlag
+poppler_annot_get_flags (PopplerAnnot *poppler_annot)
+{
+  g_return_val_if_fail (POPPLER_IS_ANNOT (poppler_annot), (PopplerAnnotFlag) 0);
+
+  return (PopplerAnnotFlag) poppler_annot->annot->getFlags ();
+}
+
+/**
+ * poppler_annot_get_color:
+ * @poppler_annot: a #PopplerAnnot
+ *
+ * Retrieves the color of @poppler_annot.
+ *
+ * Return value: a new allocated #PopplerColor with the color values of
+ *               @poppler_annot, or %NULL. It must be freed with g_free() when done.
+ **/
+PopplerColor *
+poppler_annot_get_color (PopplerAnnot *poppler_annot)
+{
+  AnnotColor *color;
+  PopplerColor *poppler_color = NULL;
+
+  g_return_val_if_fail (POPPLER_IS_ANNOT (poppler_annot), NULL);
+
+  color = poppler_annot->annot->getColor ();
+
+  if (color) {
+    const double *values = color->getValues ();
+
+    switch (color->getSpace ())
+      {
+      case AnnotColor::colorGray:
+        poppler_color = g_new (PopplerColor, 1);
+       
+        poppler_color->red = (guint16) (values[0] * 65535);
+        poppler_color->green = poppler_color->red;
+        poppler_color->blue = poppler_color->red;
+
+       break;
+      case AnnotColor::colorRGB:
+        poppler_color = g_new (PopplerColor, 1);
+       
+        poppler_color->red = (guint16) (values[0] * 65535);
+        poppler_color->green = (guint16) (values[1] * 65535);
+        poppler_color->blue = (guint16) (values[2] * 65535);
+
+       break;
+      case AnnotColor::colorCMYK:
+        g_warning ("Unsupported Annot Color: colorCMYK");
+      case AnnotColor::colorTransparent:
+        break;
+      }
+  }
+
+  return poppler_color;
+}
+
+/**
+ * poppler_annot_set_color:
+ * @poppler_annot: a #PopplerAnnot
+ * @poppler_color: (allow-none): a #PopplerColor, or %NULL
+ *
+ * Sets the color of @poppler_annot.
+ *
+ * Since: 0.16
+ */
+void
+poppler_annot_set_color (PopplerAnnot *poppler_annot,
+                        PopplerColor *poppler_color)
+{
+  AnnotColor *color = NULL;
+
+  if (poppler_color) {
+    color = new AnnotColor ((double)poppler_color->red / 65535,
+                           (double)poppler_color->green / 65535,
+                           (double)poppler_color->blue / 65535);
+  }
+
+  /* Annot takes ownership of the color */
+  poppler_annot->annot->setColor (color);
+}
+
+/**
+ * poppler_annot_get_page_index:
+ * @poppler_annot: a #PopplerAnnot
+ *
+ * Returns the page index to which @poppler_annot is associated, or -1 if unknown
+ *
+ * Return value: page index or -1
+ *
+ * Since: 0.14
+ **/
+gint
+poppler_annot_get_page_index (PopplerAnnot *poppler_annot)
+{
+  gint page_num;
+
+  g_return_val_if_fail (POPPLER_IS_ANNOT (poppler_annot), -1);
+
+  page_num = poppler_annot->annot->getPageNum();
+  return page_num <= 0 ? -1 : page_num - 1;
+}
+
+/* PopplerAnnotMarkup */
+/**
+ * poppler_annot_markup_get_label:
+ * @poppler_annot: a #PopplerAnnotMarkup
+ *
+ * Retrieves the label text of @poppler_annot.
+ *
+ * Return value: the label text of @poppler_annot.
+ */
+gchar *
+poppler_annot_markup_get_label (PopplerAnnotMarkup *poppler_annot)
+{
+  AnnotMarkup *annot;
+  GooString *text;
+
+  g_return_val_if_fail (POPPLER_IS_ANNOT_MARKUP (poppler_annot), NULL);
+
+  annot = static_cast<AnnotMarkup *>(POPPLER_ANNOT (poppler_annot)->annot);
+
+  text = annot->getLabel ();
+
+  return text ? _poppler_goo_string_to_utf8 (text) : NULL;
+}
+
+/**
+ * poppler_annot_markup_set_label:
+ * @poppler_annot: a #PopplerAnnotMarkup
+ * @label: (allow-none): a text string containing the new label, or %NULL
+ *
+ * Sets the label text of @poppler_annot, replacing the current one
+ *
+ * Since: 0.16
+ */
+void
+poppler_annot_markup_set_label (PopplerAnnotMarkup *poppler_annot,
+                               const gchar        *label)
+{
+  AnnotMarkup *annot;
+  GooString *goo_tmp;
+  gchar *tmp;
+  gsize length = 0;
+
+  g_return_if_fail (POPPLER_IS_ANNOT_MARKUP (poppler_annot));
+
+  annot = static_cast<AnnotMarkup *>(POPPLER_ANNOT (poppler_annot)->annot);
+
+  tmp = label ? g_convert (label, -1, "UTF-16BE", "UTF-8", NULL, &length, NULL) : NULL;
+  goo_tmp = new GooString (tmp, length);
+  g_free (tmp);
+  annot->setLabel (goo_tmp);
+  delete goo_tmp;
+}
+
+/**
+ * poppler_annot_markup_has_popup:
+ * @poppler_annot: a #PopplerAnnotMarkup
+ *
+ * Return %TRUE if the markup annotation has a popup window associated
+ *
+ * Return value: %TRUE, if @poppler_annot has popup, %FALSE otherwise
+ *
+ * Since: 0.12
+ **/
+gboolean
+poppler_annot_markup_has_popup (PopplerAnnotMarkup *poppler_annot)
+{
+  AnnotMarkup *annot;
+
+  g_return_val_if_fail (POPPLER_IS_ANNOT_MARKUP (poppler_annot), FALSE);
+
+  annot = static_cast<AnnotMarkup *>(POPPLER_ANNOT (poppler_annot)->annot);
+
+  return annot->getPopup () != NULL;
+}
+
+/**
+ * poppler_annot_markup_set_popup:
+ * @poppler_annot: a #PopplerAnnotMarkup
+ * @popup_rect: a #PopplerRectangle
+ *
+ * Associates a new popup window for editing contents of @poppler_annot.
+ * Popup window shall be displayed by viewers at @popup_rect on the page.
+ *
+ * Since: 0.16
+ */
+void
+poppler_annot_markup_set_popup (PopplerAnnotMarkup *poppler_annot,
+                               PopplerRectangle   *popup_rect)
+{
+  AnnotMarkup *annot;
+  AnnotPopup  *popup;
+  PDFRectangle pdf_rect(popup_rect->x1, popup_rect->y1,
+                       popup_rect->x2, popup_rect->y2);
+
+  g_return_if_fail (POPPLER_IS_ANNOT_MARKUP (poppler_annot));
+
+  annot = static_cast<AnnotMarkup *>(POPPLER_ANNOT (poppler_annot)->annot);
+  popup = new AnnotPopup (annot->getDoc(), &pdf_rect);
+  annot->setPopup (popup);
+}
+
+/**
+ * poppler_annot_markup_get_popup_is_open:
+ * @poppler_annot: a #PopplerAnnotMarkup
+ *
+ * Retrieves the state of the popup window related to @poppler_annot.
+ *
+ * Return value: the state of @poppler_annot. %TRUE if it's open, %FALSE in
+ *               other case.
+ **/
+gboolean
+poppler_annot_markup_get_popup_is_open (PopplerAnnotMarkup *poppler_annot)
+{
+  AnnotMarkup *annot;
+  AnnotPopup *annot_popup;
+
+  g_return_val_if_fail (POPPLER_IS_ANNOT_MARKUP (poppler_annot), FALSE);
+
+  annot = static_cast<AnnotMarkup *>(POPPLER_ANNOT (poppler_annot)->annot);
+
+  if ((annot_popup = annot->getPopup ()))
+    return annot_popup->getOpen ();
+
+  return FALSE;
+}
+
+/**
+ * poppler_annot_markup_set_popup_is_open:
+ * @poppler_annot: a #PopplerAnnotMarkup
+ * @is_open: whether popup window should initially be displayed open
+ *
+ * Sets the state of the popup window related to @poppler_annot.
+ *
+ * Since: 0.16
+ **/
+void
+poppler_annot_markup_set_popup_is_open (PopplerAnnotMarkup *poppler_annot,
+                                       gboolean            is_open)
+{
+  AnnotMarkup *annot;
+  AnnotPopup *annot_popup;
+
+  g_return_if_fail (POPPLER_IS_ANNOT_MARKUP (poppler_annot));
+
+  annot = static_cast<AnnotMarkup *>(POPPLER_ANNOT (poppler_annot)->annot);
+
+  annot_popup = annot->getPopup ();
+  if (!annot_popup)
+    return;
+
+  if (annot_popup->getOpen () != is_open)
+    annot_popup->setOpen (is_open);
+}
+
+/**
+ * poppler_annot_markup_get_popup_rectangle:
+ * @poppler_annot: a #PopplerAnnotMarkup
+ * @poppler_rect: (out): a #PopplerRectangle to store the popup rectangle
+ *
+ * Retrieves the rectangle of the popup window related to @poppler_annot.
+ *
+ * Return value: %TRUE if #PopplerRectangle was correctly filled, %FALSE otherwise
+ *
+ * Since: 0.12
+ **/
+gboolean
+poppler_annot_markup_get_popup_rectangle (PopplerAnnotMarkup *poppler_annot,
+                                         PopplerRectangle   *poppler_rect)
+{
+  AnnotMarkup *annot;
+  Annot *annot_popup;
+  PDFRectangle *annot_rect;
+
+  g_return_val_if_fail (POPPLER_IS_ANNOT_MARKUP (poppler_annot), FALSE);
+  g_return_val_if_fail (poppler_rect != NULL, FALSE);
+
+  annot = static_cast<AnnotMarkup *>(POPPLER_ANNOT (poppler_annot)->annot);
+  annot_popup = annot->getPopup ();
+  if (!annot_popup)
+    return FALSE;
+
+  annot_rect = annot_popup->getRect ();
+  poppler_rect->x1 = annot_rect->x1;
+  poppler_rect->x2 = annot_rect->x2;
+  poppler_rect->y1 = annot_rect->y1;
+  poppler_rect->y2 = annot_rect->y2;
+
+  return TRUE;
+}
+
+/**
+ * poppler_annot_markup_get_opacity:
+ * @poppler_annot: a #PopplerAnnotMarkup
+ *
+ * Retrieves the opacity value of @poppler_annot.
+ *
+ * Return value: the opacity value of @poppler_annot,
+ *               between 0 (transparent) and 1 (opaque)
+ */
+gdouble
+poppler_annot_markup_get_opacity (PopplerAnnotMarkup *poppler_annot)
+{
+  AnnotMarkup *annot;
+
+  g_return_val_if_fail (POPPLER_IS_ANNOT_MARKUP (poppler_annot), 0);
+
+  annot = static_cast<AnnotMarkup *>(POPPLER_ANNOT (poppler_annot)->annot);
+  
+  return annot->getOpacity ();
+}
+
+/**
+ * poppler_annot_markup_set_opacity:
+ * @poppler_annot: a #PopplerAnnotMarkup
+ * @opacity: a constant opacity value, between 0 (transparent) and 1 (opaque)
+ *
+ * Sets the opacity of @poppler_annot. This value applies to
+ * all visible elements of @poppler_annot in its closed state,
+ * but not to the pop-up window that appears when it's openened
+ *
+ * Since: 0.16
+ */
+void
+poppler_annot_markup_set_opacity (PopplerAnnotMarkup *poppler_annot,
+                                 gdouble             opacity)
+{
+  AnnotMarkup *annot;
+
+  g_return_if_fail (POPPLER_IS_ANNOT_MARKUP (poppler_annot));
+
+  annot = static_cast<AnnotMarkup *>(POPPLER_ANNOT (poppler_annot)->annot);
+  annot->setOpacity(opacity);
+}
+
+/**
+ * poppler_annot_markup_get_date:
+ * @poppler_annot: a #PopplerAnnotMarkup
+ *
+ * Returns the date and time when the annotation was created
+ *
+ * Return value: (transfer full): a #GDate representing the date and time
+ *               when the annotation was created, or %NULL
+ */
+GDate *
+poppler_annot_markup_get_date (PopplerAnnotMarkup *poppler_annot)
+{
+  AnnotMarkup *annot;
+  GooString *annot_date;
+  time_t timet;
+
+  g_return_val_if_fail (POPPLER_IS_ANNOT_MARKUP (poppler_annot), NULL);
+
+  annot = static_cast<AnnotMarkup *>(POPPLER_ANNOT (poppler_annot)->annot);
+  annot_date = annot->getDate ();
+  if (!annot_date)
+    return NULL;
+
+  if (_poppler_convert_pdf_date_to_gtime (annot_date, &timet)) {
+    GDate *date;
+
+    date = g_date_new ();
+    g_date_set_time_t (date, timet);
+
+    return date;
+  }
+
+  return NULL;
+}
+
+/**
+* poppler_annot_markup_get_subject:
+* @poppler_annot: a #PopplerAnnotMarkup
+*
+* Retrives the subject text of @poppler_annot.
+*
+* Return value: the subject text of @poppler_annot.
+*/
+gchar *
+poppler_annot_markup_get_subject (PopplerAnnotMarkup *poppler_annot)
+{
+  AnnotMarkup *annot;
+  GooString *text;
+
+  g_return_val_if_fail (POPPLER_IS_ANNOT_MARKUP (poppler_annot), NULL);
+
+  annot = static_cast<AnnotMarkup *>(POPPLER_ANNOT (poppler_annot)->annot);
+
+  text = annot->getSubject ();
+
+  return text ? _poppler_goo_string_to_utf8 (text) : NULL;
+}
+
+/**
+* poppler_annot_markup_get_reply_to:
+* @poppler_annot: a #PopplerAnnotMarkup
+*
+* Gets the reply type of @poppler_annot.
+*
+* Return value: #PopplerAnnotMarkupReplyType of @poppler_annot.
+*/
+PopplerAnnotMarkupReplyType
+poppler_annot_markup_get_reply_to (PopplerAnnotMarkup *poppler_annot)
+{
+  AnnotMarkup *annot;
+
+  g_return_val_if_fail (POPPLER_IS_ANNOT_MARKUP (poppler_annot), POPPLER_ANNOT_MARKUP_REPLY_TYPE_R);
+
+  annot = static_cast<AnnotMarkup *>(POPPLER_ANNOT (poppler_annot)->annot);
+  
+  switch (annot->getReplyTo ())
+  {
+    case AnnotMarkup::replyTypeR:
+      return POPPLER_ANNOT_MARKUP_REPLY_TYPE_R;
+    case AnnotMarkup::replyTypeGroup:
+      return POPPLER_ANNOT_MARKUP_REPLY_TYPE_GROUP;
+    default:
+      g_warning ("Unsupported Annot Markup Reply To Type");
+  }
+
+  return POPPLER_ANNOT_MARKUP_REPLY_TYPE_R;
+}
+
+/**
+* poppler_annot_markup_get_external_data:
+* @poppler_annot: a #PopplerAnnotMarkup
+*
+* Gets the external data type of @poppler_annot.
+*
+* Return value: #PopplerAnnotExternalDataType of @poppler_annot.
+*/
+PopplerAnnotExternalDataType
+poppler_annot_markup_get_external_data (PopplerAnnotMarkup *poppler_annot)
+{
+  AnnotMarkup *annot;
+
+  g_return_val_if_fail (POPPLER_IS_ANNOT_MARKUP (poppler_annot), POPPLER_ANNOT_EXTERNAL_DATA_MARKUP_UNKNOWN);
+
+  annot = static_cast<AnnotMarkup *>(POPPLER_ANNOT (poppler_annot)->annot);
+
+  switch (annot->getExData ())
+    {
+    case annotExternalDataMarkup3D:
+      return POPPLER_ANNOT_EXTERNAL_DATA_MARKUP_3D;
+    case annotExternalDataMarkupUnknown:
+      return POPPLER_ANNOT_EXTERNAL_DATA_MARKUP_UNKNOWN;
+    default:
+      g_warning ("Unsupported Annot Markup External Data");
+    }
+
+  return POPPLER_ANNOT_EXTERNAL_DATA_MARKUP_UNKNOWN;
+}
+
+/* PopplerAnnotText */
+/**
+ * poppler_annot_text_get_is_open:
+ * @poppler_annot: a #PopplerAnnotText
+ *
+ * Retrieves the state of @poppler_annot.
+ *
+ * Return value: the state of @poppler_annot. %TRUE if it's open, %FALSE in
+ *               other case.
+ **/
+gboolean
+poppler_annot_text_get_is_open (PopplerAnnotText *poppler_annot)
+{
+  AnnotText *annot;
+
+  g_return_val_if_fail (POPPLER_IS_ANNOT_TEXT (poppler_annot), FALSE);
+
+  annot = static_cast<AnnotText *>(POPPLER_ANNOT (poppler_annot)->annot);
+
+  return annot->getOpen ();
+}
+
+/**
+ * poppler_annot_text_set_is_open:
+ * @poppler_annot: a #PopplerAnnotText
+ * @is_open: whether annotation should initially be displayed open
+ *
+ * Sets whether @poppler_annot should initially be displayed open
+ *
+ * Since: 0.16
+ */
+void
+poppler_annot_text_set_is_open (PopplerAnnotText *poppler_annot,
+                               gboolean          is_open)
+{
+  AnnotText *annot;
+
+  g_return_if_fail (POPPLER_IS_ANNOT_TEXT (poppler_annot));
+
+  annot = static_cast<AnnotText *>(POPPLER_ANNOT (poppler_annot)->annot);
+  annot->setOpen(is_open);
+}
+
+/**
+ * poppler_annot_text_get_icon:
+ * @poppler_annot: a #PopplerAnnotText
+ *
+ * Gets name of the icon of @poppler_annot.
+ *
+ * Return value: a new allocated string containing the icon name
+ */
+gchar *
+poppler_annot_text_get_icon (PopplerAnnotText *poppler_annot)
+{
+  AnnotText *annot;
+  GooString *text;
+
+  g_return_val_if_fail (POPPLER_IS_ANNOT_TEXT (poppler_annot), NULL);
+
+  annot = static_cast<AnnotText *>(POPPLER_ANNOT (poppler_annot)->annot);
+
+  text = annot->getIcon ();
+
+  return text ? _poppler_goo_string_to_utf8 (text) : NULL;
+}
+
+/**
+ * poppler_annot_text_set_icon:
+ * @poppler_annot: a #PopplerAnnotText
+ * @icon: the name of an icon
+ *
+ * Sets the icon of @poppler_annot. The following predefined
+ * icons are currently supported:
+ * <variablelist>
+ *  <varlistentry>
+ *   <term>#POPPLER_ANNOT_TEXT_ICON_NOTE</term>
+ *  </varlistentry>
+ *  <varlistentry>
+ *   <term>#POPPLER_ANNOT_TEXT_ICON_COMMENT</term>
+ *  </varlistentry>
+ *  <varlistentry>
+ *   <term>#POPPLER_ANNOT_TEXT_ICON_KEY</term>
+ *  </varlistentry>
+ *  <varlistentry>
+ *   <term>#POPPLER_ANNOT_TEXT_ICON_HELP</term>
+ *  </varlistentry>
+ *  <varlistentry>
+ *   <term>#POPPLER_ANNOT_TEXT_ICON_NEW_PARAGRAPH</term>
+ *  </varlistentry>
+ *  <varlistentry>
+ *   <term>#POPPLER_ANNOT_TEXT_ICON_PARAGRAPH</term>
+ *  </varlistentry>
+ *  <varlistentry>
+ *   <term>#POPPLER_ANNOT_TEXT_ICON_INSERT</term>
+ *  </varlistentry>
+ *  <varlistentry>
+ *   <term>#POPPLER_ANNOT_TEXT_ICON_CROSS</term>
+ *  </varlistentry>
+ *  <varlistentry>
+ *   <term>#POPPLER_ANNOT_TEXT_ICON_CIRCLE</term>
+ *  </varlistentry>
+ * </variablelist>
+ *
+ * Since: 0.16
+ */
+void
+poppler_annot_text_set_icon (PopplerAnnotText *poppler_annot,
+                            const gchar      *icon)
+{
+  AnnotText *annot;
+  GooString *text;
+
+  g_return_if_fail (POPPLER_IS_ANNOT_TEXT (poppler_annot));
+
+  annot = static_cast<AnnotText *>(POPPLER_ANNOT (poppler_annot)->annot);
+
+  text = new GooString(icon);
+  annot->setIcon(text);
+  delete text;
+}
+
+/**
+ * poppler_annot_text_get_state:
+ * @poppler_annot: a #PopplerAnnotText
+ *
+ * Retrieves the state of @poppler_annot.
+ *
+ * Return value: #PopplerAnnotTextState of @poppler_annot.
+ **/ 
+PopplerAnnotTextState
+poppler_annot_text_get_state (PopplerAnnotText *poppler_annot)
+{
+  AnnotText *annot;
+
+  g_return_val_if_fail (POPPLER_IS_ANNOT_TEXT (poppler_annot), POPPLER_ANNOT_TEXT_STATE_UNKNOWN);
+
+  annot = static_cast<AnnotText *>(POPPLER_ANNOT (poppler_annot)->annot);
+
+  switch (annot->getState ())
+    {
+    case AnnotText::stateUnknown:
+      return POPPLER_ANNOT_TEXT_STATE_UNKNOWN;
+    case AnnotText::stateMarked:
+      return POPPLER_ANNOT_TEXT_STATE_MARKED;
+    case AnnotText::stateUnmarked:
+      return POPPLER_ANNOT_TEXT_STATE_UNMARKED;
+    case AnnotText::stateAccepted:
+      return POPPLER_ANNOT_TEXT_STATE_ACCEPTED;
+    case AnnotText::stateRejected:
+      return POPPLER_ANNOT_TEXT_STATE_REJECTED;
+    case AnnotText::stateCancelled:
+      return POPPLER_ANNOT_TEXT_STATE_CANCELLED;
+    case AnnotText::stateCompleted:
+      return POPPLER_ANNOT_TEXT_STATE_COMPLETED;
+    case AnnotText::stateNone:
+      return POPPLER_ANNOT_TEXT_STATE_NONE;
+    default:
+      g_warning ("Unsupported Annot Text State");
+    }
+
+  return POPPLER_ANNOT_TEXT_STATE_UNKNOWN;
+}
+
+/* PopplerAnnotFreeText */
+/**
+ * poppler_annot_free_text_get_quadding:
+ * @poppler_annot: a #PopplerAnnotFreeText
+ *
+ * Retrieves the justification of the text of @poppler_annot.
+ *
+ * Return value: #PopplerAnnotFreeTextQuadding of @poppler_annot.
+ **/ 
+PopplerAnnotFreeTextQuadding
+poppler_annot_free_text_get_quadding (PopplerAnnotFreeText *poppler_annot)
+{
+  AnnotFreeText *annot;
+
+  g_return_val_if_fail (POPPLER_IS_ANNOT_FREE_TEXT (poppler_annot), POPPLER_ANNOT_FREE_TEXT_QUADDING_LEFT_JUSTIFIED);
+
+  annot = static_cast<AnnotFreeText *>(POPPLER_ANNOT (poppler_annot)->annot);
+
+  switch (annot->getQuadding ())
+  {
+    case AnnotFreeText::quaddingLeftJustified:
+      return POPPLER_ANNOT_FREE_TEXT_QUADDING_LEFT_JUSTIFIED;
+    case AnnotFreeText::quaddingCentered:
+      return POPPLER_ANNOT_FREE_TEXT_QUADDING_CENTERED;
+    case AnnotFreeText::quaddingRightJustified:
+      return POPPLER_ANNOT_FREE_TEXT_QUADDING_RIGHT_JUSTIFIED;
+    default:
+      g_warning ("Unsupported Annot Free Text Quadding");
+  }
+
+  return POPPLER_ANNOT_FREE_TEXT_QUADDING_LEFT_JUSTIFIED;
+}
+
+/**
+ * poppler_annot_free_text_get_callout_line:
+ * @poppler_annot: a #PopplerAnnotFreeText
+ *
+ * Retrieves a #PopplerAnnotCalloutLine of four or six numbers specifying a callout
+ * line attached to the @poppler_annot.
+ *
+ * Return value: a new allocated #PopplerAnnotCalloutLine if the annot has a callout
+ *               line, %NULL in other case. It must be freed with g_free() when
+ *               done.
+ **/
+PopplerAnnotCalloutLine *
+poppler_annot_free_text_get_callout_line (PopplerAnnotFreeText *poppler_annot)
+{
+  AnnotFreeText *annot;
+  AnnotCalloutLine *line;
+
+  g_return_val_if_fail (POPPLER_IS_ANNOT_FREE_TEXT (poppler_annot), NULL);
+
+  annot = static_cast<AnnotFreeText *>(POPPLER_ANNOT (poppler_annot)->annot);
+
+  if ((line = annot->getCalloutLine ())) {
+    AnnotCalloutMultiLine *multiline;
+    PopplerAnnotCalloutLine *callout = g_new0 (PopplerAnnotCalloutLine, 1);
+
+    callout->x1 = line->getX1();
+    callout->y1 = line->getY1();
+    callout->x2 = line->getX2();
+    callout->y2 = line->getY2();
+
+    if ((multiline = static_cast<AnnotCalloutMultiLine *>(line))) {
+      callout->multiline = TRUE;
+      callout->x3 = multiline->getX3();
+      callout->y3 = multiline->getY3();
+      return callout;
+    }
+
+    callout->multiline = FALSE;
+    return callout;
+  }
+
+  return NULL;
+}
+
+/* PopplerAnnotFileAttachment */
+/**
+ * poppler_annot_file_attachment_get_attachment:
+ * @poppler_annot: a #PopplerAnnotFileAttachment
+ *
+ * Creates a #PopplerAttachment for the file of the file attachment annotation @annot.
+ * The #PopplerAttachment must be unrefed with g_object_unref by the caller.
+ *
+ * Return value: (transfer full): @PopplerAttachment
+ *
+ * Since: 0.14
+ **/
+PopplerAttachment *
+poppler_annot_file_attachment_get_attachment (PopplerAnnotFileAttachment *poppler_annot)
+{
+  AnnotFileAttachment *annot;
+  PopplerAttachment *attachment;
+
+  g_return_val_if_fail (POPPLER_IS_ANNOT_FILE_ATTACHMENT (poppler_annot), NULL);
+
+  annot = static_cast<AnnotFileAttachment *>(POPPLER_ANNOT (poppler_annot)->annot);
+
+  FileSpec *file = new FileSpec (annot->getFile());
+  attachment = _poppler_attachment_new (file);
+  delete file;
+
+  return attachment;
+}
+
+/**
+ * poppler_annot_file_attachment_get_name:
+ * @poppler_annot: a #PopplerAnnotFileAttachment
+ *
+ * Retrieves the name of @poppler_annot.
+ *
+ * Return value: a new allocated string with the name of @poppler_annot. It must
+ *               be freed with g_free() when done.
+ * Since: 0.14
+ **/
+gchar *
+poppler_annot_file_attachment_get_name (PopplerAnnotFileAttachment *poppler_annot)
+{
+  AnnotFileAttachment *annot;
+  GooString *name;
+
+  g_return_val_if_fail (POPPLER_IS_ANNOT_FILE_ATTACHMENT (poppler_annot), NULL);
+
+  annot = static_cast<AnnotFileAttachment *>(POPPLER_ANNOT (poppler_annot)->annot);
+  name = annot->getName ();
+
+  return name ? _poppler_goo_string_to_utf8 (name) : NULL;
+}
+
+/* PopplerAnnotCalloutLine */
+POPPLER_DEFINE_BOXED_TYPE (PopplerAnnotCalloutLine, poppler_annot_callout_line,
+                          poppler_annot_callout_line_copy,
+                          poppler_annot_callout_line_free)
+
+/**
+ * poppler_annot_callout_line_new:
+ *
+ * Creates a new empty #PopplerAnnotCalloutLine.
+ *
+ * Return value: a new allocated #PopplerAnnotCalloutLine, %NULL in other case.
+ *               It must be freed when done.
+ **/
+PopplerAnnotCalloutLine *
+poppler_annot_callout_line_new (void)
+{
+  return g_new0 (PopplerAnnotCalloutLine, 1);
+}
+
+/**
+ * poppler_annot_callout_line_copy:
+ * @callout: the #PopplerAnnotCalloutLine to be copied.
+ *
+ * It does copy @callout to a new #PopplerAnnotCalloutLine.
+ *
+ * Return value: a new allocated #PopplerAnnotCalloutLine as exact copy of
+ *               @callout, %NULL in other case. It must be freed when done.
+ **/
+PopplerAnnotCalloutLine *
+poppler_annot_callout_line_copy (PopplerAnnotCalloutLine *callout)
+{
+  PopplerAnnotCalloutLine *new_callout;
+
+  g_return_val_if_fail (callout != NULL, NULL);
+  
+  new_callout = g_new0 (PopplerAnnotCalloutLine, 1);
+  *new_callout = *callout;
+
+  return new_callout;
+}
+
+/**
+ * poppler_annot_callout_line_free:
+ * @callout: a #PopplerAnnotCalloutLine
+ *
+ * Frees the memory used by #PopplerAnnotCalloutLine.
+ **/
+void
+poppler_annot_callout_line_free (PopplerAnnotCalloutLine *callout)
+{
+  g_free (callout);
+}
+
+
+/* PopplerAnnotMovie */
+/**
+ * poppler_annot_movie_get_title:
+ * @poppler_annot: a #PopplerAnnotMovie
+ *
+ * Retrieves the movie title of @poppler_annot.
+ *
+ * Return value: the title text of @poppler_annot.
+ *
+ * Since: 0.14
+ */
+gchar *
+poppler_annot_movie_get_title (PopplerAnnotMovie *poppler_annot)
+{
+  AnnotMovie *annot;
+  GooString *title;
+
+  g_return_val_if_fail (POPPLER_IS_ANNOT_MOVIE (poppler_annot), NULL);
+
+  annot = static_cast<AnnotMovie *>(POPPLER_ANNOT (poppler_annot)->annot);
+
+  title = annot->getTitle ();
+
+  return title ? _poppler_goo_string_to_utf8 (title) : NULL;
+}
+
+/**
+ * poppler_annot_movie_get_movie:
+ * @poppler_annot: a #PopplerAnnotMovie
+ *
+ * Retrieves the movie object (PopplerMovie) stored in the @poppler_annot.
+ *
+ * Return value: (transfer none): the movie object stored in the @poppler_annot. The returned
+ *               object is owned by #PopplerAnnotMovie and should not be freed
+ *
+ * Since: 0.14
+ */
+PopplerMovie *
+poppler_annot_movie_get_movie (PopplerAnnotMovie *poppler_annot)
+{
+  return poppler_annot->movie;
+}
+
+/* PopplerAnnotScreen */
+/**
+ * poppler_annot_screen_get_action:
+ * @poppler_annot: a #PopplerAnnotScreen
+ *
+ * Retrieves the action (#PopplerAction) that shall be performed when @poppler_annot is activated
+ *
+ * Return value: (transfer none): the action to perform. The returned
+ *               object is owned by @poppler_annot and should not be freed
+ *
+ * Since: 0.14
+ */
+PopplerAction *
+poppler_annot_screen_get_action (PopplerAnnotScreen *poppler_annot)
+{
+  return poppler_annot->action;
+}
diff --git a/glib/poppler-annot.h b/glib/poppler-annot.h
new file mode 100644 (file)
index 0000000..17440fb
--- /dev/null
@@ -0,0 +1,230 @@
+/* poppler-annot.h: glib interface to poppler
+ *
+ * Copyright (C) 2007 Inigo Martinez <inigomartinez@gmail.com>
+ * Copyright (C) 2009 Carlos Garcia Campos <carlosgc@gnome.org>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#ifndef __POPPLER_ANNOT_H__
+#define __POPPLER_ANNOT_H__
+
+#include <glib-object.h>
+#include "poppler.h"
+
+G_BEGIN_DECLS
+
+#define POPPLER_TYPE_ANNOT                   (poppler_annot_get_type ())
+#define POPPLER_ANNOT(obj)                   (G_TYPE_CHECK_INSTANCE_CAST ((obj), POPPLER_TYPE_ANNOT, PopplerAnnot))
+#define POPPLER_IS_ANNOT(obj)                (G_TYPE_CHECK_INSTANCE_TYPE ((obj), POPPLER_TYPE_ANNOT))
+
+#define POPPLER_TYPE_ANNOT_MARKUP            (poppler_annot_markup_get_type ())
+#define POPPLER_ANNOT_MARKUP(obj)            (G_TYPE_CHECK_INSTANCE_CAST ((obj), POPPLER_TYPE_ANNOT_MARKUP, PopplerAnnotMarkup))
+#define POPPLER_IS_ANNOT_MARKUP(obj)         (G_TYPE_CHECK_INSTANCE_TYPE ((obj), POPPLER_TYPE_ANNOT_MARKUP))
+
+#define POPPLER_TYPE_ANNOT_TEXT              (poppler_annot_text_get_type ())
+#define POPPLER_ANNOT_TEXT(obj)              (G_TYPE_CHECK_INSTANCE_CAST ((obj), POPPLER_TYPE_ANNOT_TEXT, PopplerAnnotText))
+#define POPPLER_IS_ANNOT_TEXT(obj)           (G_TYPE_CHECK_INSTANCE_TYPE ((obj), POPPLER_TYPE_ANNOT_TEXT))
+
+#define POPPLER_TYPE_ANNOT_FREE_TEXT         (poppler_annot_free_text_get_type ())
+#define POPPLER_ANNOT_FREE_TEXT(obj)         (G_TYPE_CHECK_INSTANCE_CAST ((obj), POPPLER_TYPE_ANNOT_FREE_TEXT, PopplerAnnotFreeText))
+#define POPPLER_IS_ANNOT_FREE_TEXT(obj)      (G_TYPE_CHECK_INSTANCE_TYPE ((obj), POPPLER_TYPE_ANNOT_FREE_TEXT))
+
+#define POPPLER_TYPE_ANNOT_FILE_ATTACHMENT   (poppler_annot_file_attachment_get_type ())
+#define POPPLER_ANNOT_FILE_ATTACHMENT(obj)   (G_TYPE_CHECK_INSTANCE_CAST ((obj), POPPLER_TYPE_ANNOT_MARKUP, PopplerAnnotFileAttachment))
+#define POPPLER_IS_ANNOT_FILE_ATTACHMENT(obj)(G_TYPE_CHECK_INSTANCE_TYPE ((obj), POPPLER_TYPE_ANNOT_FILE_ATTACHMENT))
+
+#define POPPLER_TYPE_ANNOT_MOVIE             (poppler_annot_movie_get_type ())
+#define POPPLER_ANNOT_MOVIE(obj)             (G_TYPE_CHECK_INSTANCE_CAST ((obj), POPPLER_TYPE_ANNOT_MOVIE, PopplerAnnotMovie))
+#define POPPLER_IS_ANNOT_MOVIE(obj)          (G_TYPE_CHECK_INSTANCE_TYPE ((obj), POPPLER_TYPE_ANNOT_MOVIE))
+
+#define POPPLER_TYPE_ANNOT_SCREEN            (poppler_annot_screen_get_type ())
+#define POPPLER_ANNOT_SCREEN(obj)            (G_TYPE_CHECK_INSTANCE_CAST ((obj), POPPLER_TYPE_ANNOT_SCREEN, PopplerAnnotScreen))
+#define POPPLER_IS_ANNOT_SCREEN(obj)         (G_TYPE_CHECK_INSTANCE_TYPE ((obj), POPPLER_TYPE_ANNOT_SCREEN))
+
+#define POPPLER_TYPE_ANNOT_CALLOUT_LINE      (poppler_annot_callout_line_get_type ())
+
+
+typedef enum
+{
+  POPPLER_ANNOT_UNKNOWN,
+  POPPLER_ANNOT_TEXT,
+  POPPLER_ANNOT_LINK,
+  POPPLER_ANNOT_FREE_TEXT,
+  POPPLER_ANNOT_LINE,
+  POPPLER_ANNOT_SQUARE,
+  POPPLER_ANNOT_CIRCLE,
+  POPPLER_ANNOT_POLYGON,
+  POPPLER_ANNOT_POLY_LINE,
+  POPPLER_ANNOT_HIGHLIGHT,
+  POPPLER_ANNOT_UNDERLINE,
+  POPPLER_ANNOT_SQUIGGLY,
+  POPPLER_ANNOT_STRIKE_OUT,
+  POPPLER_ANNOT_STAMP,
+  POPPLER_ANNOT_CARET,
+  POPPLER_ANNOT_INK,
+  POPPLER_ANNOT_POPUP,
+  POPPLER_ANNOT_FILE_ATTACHMENT,
+  POPPLER_ANNOT_SOUND,
+  POPPLER_ANNOT_MOVIE,
+  POPPLER_ANNOT_WIDGET,
+  POPPLER_ANNOT_SCREEN,
+  POPPLER_ANNOT_PRINTER_MARK,
+  POPPLER_ANNOT_TRAP_NET,
+  POPPLER_ANNOT_WATERMARK,
+  POPPLER_ANNOT_3D
+} PopplerAnnotType;
+
+typedef enum /*< flags >*/
+{
+  POPPLER_ANNOT_FLAG_UNKNOWN = 0,
+  POPPLER_ANNOT_FLAG_INVISIBLE = 1 << 0,
+  POPPLER_ANNOT_FLAG_HIDDEN = 1 << 1,
+  POPPLER_ANNOT_FLAG_PRINT = 1 << 2,
+  POPPLER_ANNOT_FLAG_NO_ZOOM = 1 << 3,
+  POPPLER_ANNOT_FLAG_NO_ROTATE = 1 << 4,
+  POPPLER_ANNOT_FLAG_NO_VIEW = 1 << 5,
+  POPPLER_ANNOT_FLAG_READ_ONLY = 1 << 6,
+  POPPLER_ANNOT_FLAG_LOCKED = 1 << 7,
+  POPPLER_ANNOT_FLAG_TOGGLE_NO_VIEW = 1 << 8,
+  POPPLER_ANNOT_FLAG_LOCKED_CONTENTS = 1 << 9
+} PopplerAnnotFlag;
+
+typedef enum
+{
+  POPPLER_ANNOT_MARKUP_REPLY_TYPE_R,
+  POPPLER_ANNOT_MARKUP_REPLY_TYPE_GROUP
+} PopplerAnnotMarkupReplyType;
+
+typedef enum
+{
+  POPPLER_ANNOT_EXTERNAL_DATA_MARKUP_3D,
+  POPPLER_ANNOT_EXTERNAL_DATA_MARKUP_UNKNOWN
+} PopplerAnnotExternalDataType;
+
+#define POPPLER_ANNOT_TEXT_ICON_NOTE          "Note"
+#define POPPLER_ANNOT_TEXT_ICON_COMMENT       "Comment"
+#define POPPLER_ANNOT_TEXT_ICON_KEY           "Key"
+#define POPPLER_ANNOT_TEXT_ICON_HELP          "Help"
+#define POPPLER_ANNOT_TEXT_ICON_NEW_PARAGRAPH "NewParagraph"
+#define POPPLER_ANNOT_TEXT_ICON_PARAGRAPH     "Paragraph"
+#define POPPLER_ANNOT_TEXT_ICON_INSERT        "Insert"
+#define POPPLER_ANNOT_TEXT_ICON_CROSS         "Cross"
+#define POPPLER_ANNOT_TEXT_ICON_CIRCLE        "Circle"
+
+typedef enum
+{
+  POPPLER_ANNOT_TEXT_STATE_MARKED,
+  POPPLER_ANNOT_TEXT_STATE_UNMARKED,
+  POPPLER_ANNOT_TEXT_STATE_ACCEPTED,
+  POPPLER_ANNOT_TEXT_STATE_REJECTED,
+  POPPLER_ANNOT_TEXT_STATE_CANCELLED,
+  POPPLER_ANNOT_TEXT_STATE_COMPLETED,
+  POPPLER_ANNOT_TEXT_STATE_NONE,
+  POPPLER_ANNOT_TEXT_STATE_UNKNOWN
+} PopplerAnnotTextState;
+
+typedef enum
+{
+  POPPLER_ANNOT_FREE_TEXT_QUADDING_LEFT_JUSTIFIED,
+  POPPLER_ANNOT_FREE_TEXT_QUADDING_CENTERED,
+  POPPLER_ANNOT_FREE_TEXT_QUADDING_RIGHT_JUSTIFIED
+} PopplerAnnotFreeTextQuadding;
+
+struct _PopplerAnnotCalloutLine
+{
+  gboolean multiline;
+  gdouble  x1;
+  gdouble  y1;
+  gdouble  x2;
+  gdouble  y2;
+  gdouble  x3;
+  gdouble  y3;
+};
+
+GType                         poppler_annot_get_type                           (void) G_GNUC_CONST;
+PopplerAnnotType              poppler_annot_get_annot_type                     (PopplerAnnot *poppler_annot);
+gchar                        *poppler_annot_get_contents                       (PopplerAnnot *poppler_annot);
+void                          poppler_annot_set_contents                       (PopplerAnnot *poppler_annot,
+                                                                               const gchar  *contents);
+gchar                        *poppler_annot_get_name                           (PopplerAnnot *poppler_annot);
+gchar                        *poppler_annot_get_modified                       (PopplerAnnot *poppler_annot);
+PopplerAnnotFlag              poppler_annot_get_flags                          (PopplerAnnot *poppler_annot);
+PopplerColor                 *poppler_annot_get_color                          (PopplerAnnot *poppler_annot);
+void                          poppler_annot_set_color                          (PopplerAnnot *poppler_annot,
+                                                                               PopplerColor *poppler_color);
+gint                          poppler_annot_get_page_index                     (PopplerAnnot *poppler_annot);
+
+/* PopplerAnnotMarkup */
+GType                         poppler_annot_markup_get_type                    (void) G_GNUC_CONST;
+gchar                        *poppler_annot_markup_get_label                   (PopplerAnnotMarkup *poppler_annot);
+void                          poppler_annot_markup_set_label                   (PopplerAnnotMarkup *poppler_annot,
+                                                                               const gchar        *label);
+gboolean                      poppler_annot_markup_has_popup                   (PopplerAnnotMarkup *poppler_annot);
+void                          poppler_annot_markup_set_popup                   (PopplerAnnotMarkup *poppler_annot,
+                                                                               PopplerRectangle   *popup_rect);
+gboolean                      poppler_annot_markup_get_popup_is_open           (PopplerAnnotMarkup *poppler_annot);
+void                          poppler_annot_markup_set_popup_is_open           (PopplerAnnotMarkup *poppler_annot,
+                                                                               gboolean            is_open);
+gboolean                      poppler_annot_markup_get_popup_rectangle         (PopplerAnnotMarkup *poppler_annot,
+                                                                               PopplerRectangle   *poppler_rect);
+gdouble                       poppler_annot_markup_get_opacity                 (PopplerAnnotMarkup *poppler_annot);
+void                          poppler_annot_markup_set_opacity                 (PopplerAnnotMarkup *poppler_annot,
+                                                                               gdouble             opacity);
+GDate                        *poppler_annot_markup_get_date                    (PopplerAnnotMarkup *poppler_annot);
+gchar                        *poppler_annot_markup_get_subject                 (PopplerAnnotMarkup *poppler_annot);
+PopplerAnnotMarkupReplyType   poppler_annot_markup_get_reply_to                (PopplerAnnotMarkup *poppler_annot);
+PopplerAnnotExternalDataType  poppler_annot_markup_get_external_data           (PopplerAnnotMarkup *poppler_annot);
+
+/* PopplerAnnotText */
+GType                         poppler_annot_text_get_type                      (void) G_GNUC_CONST;
+PopplerAnnot                 *poppler_annot_text_new                           (PopplerDocument  *doc,
+                                                                               PopplerRectangle *rect);
+gboolean                      poppler_annot_text_get_is_open                   (PopplerAnnotText *poppler_annot);
+void                          poppler_annot_text_set_is_open                   (PopplerAnnotText *poppler_annot,
+                                                                               gboolean          is_open);
+gchar                        *poppler_annot_text_get_icon                      (PopplerAnnotText *poppler_annot);
+void                          poppler_annot_text_set_icon                      (PopplerAnnotText *poppler_annot,
+                                                                               const gchar      *icon);
+PopplerAnnotTextState         poppler_annot_text_get_state                     (PopplerAnnotText *poppler_annot);
+
+/* PopplerAnnotFreeText */
+GType                         poppler_annot_free_text_get_type                 (void) G_GNUC_CONST;
+PopplerAnnotFreeTextQuadding  poppler_annot_free_text_get_quadding             (PopplerAnnotFreeText *poppler_annot);
+PopplerAnnotCalloutLine      *poppler_annot_free_text_get_callout_line         (PopplerAnnotFreeText *poppler_annot);
+
+/* PopplerAnnotFileAttachment */
+GType                         poppler_annot_file_attachment_get_type           (void) G_GNUC_CONST;
+PopplerAttachment            *poppler_annot_file_attachment_get_attachment     (PopplerAnnotFileAttachment *poppler_annot);
+gchar                        *poppler_annot_file_attachment_get_name           (PopplerAnnotFileAttachment *poppler_annot);
+
+/* PopplerAnnotMovie */
+GType                         poppler_annot_movie_get_type                     (void) G_GNUC_CONST;
+gchar                        *poppler_annot_movie_get_title                    (PopplerAnnotMovie *poppler_annot);
+PopplerMovie                 *poppler_annot_movie_get_movie                    (PopplerAnnotMovie *poppler_annot);
+
+/* PopplerAnnotScreen */
+GType                         poppler_annot_screen_get_type                    (void) G_GNUC_CONST;
+PopplerAction                *poppler_annot_screen_get_action                  (PopplerAnnotScreen *poppler_annot);
+
+/* PopplerAnnotCalloutLine */
+GType                         poppler_annot_callout_line_get_type              (void) G_GNUC_CONST;
+PopplerAnnotCalloutLine      *poppler_annot_callout_line_new                   (void);
+PopplerAnnotCalloutLine      *poppler_annot_callout_line_copy                  (PopplerAnnotCalloutLine *callout);
+void                          poppler_annot_callout_line_free                  (PopplerAnnotCalloutLine *callout);
+
+G_END_DECLS
+
+#endif /* __POPPLER_ANNOT_H__ */
diff --git a/glib/poppler-attachment.cc b/glib/poppler-attachment.cc
new file mode 100644 (file)
index 0000000..874bffb
--- /dev/null
@@ -0,0 +1,274 @@
+/* poppler-attachment.cc: glib wrapper for poppler
+ * Copyright (C) 2006, Red Hat, Inc.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include "config.h"
+#include <errno.h>
+#include <glib/gstdio.h>
+
+#include "poppler.h"
+#include "poppler-private.h"
+
+/**
+ * SECTION:poppler-attachment
+ * @short_description: Attachments
+ * @title: PopplerAttachment
+ */
+
+/* FIXME: We need to add gettext support sometime */
+#define _(x) (x)
+
+typedef struct _PopplerAttachmentPrivate PopplerAttachmentPrivate;
+struct _PopplerAttachmentPrivate
+{
+  Object *obj_stream;
+};
+
+#define POPPLER_ATTACHMENT_GET_PRIVATE(obj) (G_TYPE_INSTANCE_GET_PRIVATE ((obj), POPPLER_TYPE_ATTACHMENT, PopplerAttachmentPrivate))
+
+static void poppler_attachment_dispose (GObject *obj);
+static void poppler_attachment_finalize (GObject *obj);
+
+G_DEFINE_TYPE (PopplerAttachment, poppler_attachment, G_TYPE_OBJECT)
+
+static void
+poppler_attachment_init (PopplerAttachment *attachment)
+{
+}
+
+static void
+poppler_attachment_class_init (PopplerAttachmentClass *klass)
+{
+  G_OBJECT_CLASS (klass)->dispose = poppler_attachment_dispose;
+  G_OBJECT_CLASS (klass)->finalize = poppler_attachment_finalize;
+  g_type_class_add_private (klass, sizeof (PopplerAttachmentPrivate));
+}
+
+static void
+poppler_attachment_dispose (GObject *obj)
+{
+  PopplerAttachmentPrivate *priv;
+
+  priv = POPPLER_ATTACHMENT_GET_PRIVATE (obj);
+
+  if (priv->obj_stream)
+    {
+      priv->obj_stream->free();
+      delete priv->obj_stream;
+      priv->obj_stream = NULL;
+    }
+
+  G_OBJECT_CLASS (poppler_attachment_parent_class)->dispose (obj);
+}
+
+static void
+poppler_attachment_finalize (GObject *obj)
+{
+  PopplerAttachment *attachment;
+
+  attachment = (PopplerAttachment *) obj;
+
+  if (attachment->name)
+    g_free (attachment->name);
+  attachment->name = NULL;
+
+  if (attachment->description)
+    g_free (attachment->description);
+  attachment->description = NULL;
+  
+  if (attachment->checksum)
+    g_string_free (attachment->checksum, TRUE);
+  attachment->checksum = NULL;
+  
+  G_OBJECT_CLASS (poppler_attachment_parent_class)->finalize (obj);
+}
+
+/* Public functions */
+
+PopplerAttachment *
+_poppler_attachment_new (FileSpec *emb_file)
+{
+  PopplerAttachment *attachment;
+  PopplerAttachmentPrivate *priv;
+  EmbFile *embFile;
+
+  g_assert (emb_file != NULL);
+
+  attachment = (PopplerAttachment *) g_object_new (POPPLER_TYPE_ATTACHMENT, NULL);
+  priv = POPPLER_ATTACHMENT_GET_PRIVATE (attachment);
+
+  if (emb_file->getFileName ())
+    attachment->name = _poppler_goo_string_to_utf8 (emb_file->getFileName ());
+  if (emb_file->getDescription ())
+    attachment->description = _poppler_goo_string_to_utf8 (emb_file->getDescription ());
+
+  embFile = emb_file->getEmbeddedFile();
+  attachment->size = embFile->size ();
+
+  if (embFile->createDate ())
+    _poppler_convert_pdf_date_to_gtime (embFile->createDate (), (time_t *)&attachment->ctime);
+  if (embFile->modDate ())
+    _poppler_convert_pdf_date_to_gtime (embFile->modDate (), (time_t *)&attachment->mtime);
+
+  if (embFile->checksum () && embFile->checksum ()->getLength () > 0)
+    attachment->checksum = g_string_new_len (embFile->checksum ()->getCString (),
+                                             embFile->checksum ()->getLength ());
+  priv->obj_stream = new Object();
+  priv->obj_stream->initStream(embFile->stream());
+  // Copy the stream
+  embFile->stream()->incRef();
+
+  return attachment;
+}
+
+static gboolean
+save_helper (const gchar  *buf,
+            gsize         count,
+            gpointer      data,
+            GError      **error)
+{
+  FILE *f = (FILE *) data;
+  gsize n;
+
+  n = fwrite (buf, 1, count, f);
+  if (n != count)
+    {
+      g_set_error (error,
+                  G_FILE_ERROR,
+                  g_file_error_from_errno (errno),
+                  _("Error writing to image file: %s"),
+                  g_strerror (errno));
+      return FALSE;
+    }
+
+  return TRUE;
+}
+
+/**
+ * poppler_attachment_save:
+ * @attachment: A #PopplerAttachment.
+ * @filename: name of file to save
+ * @error: (allow-none): return location for error, or %NULL.
+ * 
+ * Saves @attachment to a file indicated by @filename.  If @error is set, %FALSE
+ * will be returned. Possible errors include those in the #G_FILE_ERROR domain
+ * and whatever the save function generates.
+ * 
+ * Return value: %TRUE, if the file successfully saved
+ **/
+gboolean
+poppler_attachment_save (PopplerAttachment  *attachment,
+                        const char         *filename,
+                        GError            **error)
+{
+  gboolean result;
+  FILE *f;
+  
+  g_return_val_if_fail (POPPLER_IS_ATTACHMENT (attachment), FALSE);
+
+  f = g_fopen (filename, "wb");
+
+  if (f == NULL)
+    {
+      gchar *display_name = g_filename_display_name (filename);
+      g_set_error (error,
+                  G_FILE_ERROR,
+                  g_file_error_from_errno (errno),
+                  _("Failed to open '%s' for writing: %s"),
+                  display_name,
+                  g_strerror (errno));
+      g_free (display_name);
+      return FALSE;
+    }
+
+  result = poppler_attachment_save_to_callback (attachment, save_helper, f, error);
+
+  if (fclose (f) < 0)
+    {
+      gchar *display_name = g_filename_display_name (filename);
+      g_set_error (error,
+                  G_FILE_ERROR,
+                  g_file_error_from_errno (errno),
+                  _("Failed to close '%s', all data may not have been saved: %s"),
+                  display_name,
+                  g_strerror (errno));
+      g_free (display_name);
+      return FALSE;
+    }
+
+  return result;
+}
+
+#define BUF_SIZE 1024
+
+/**
+ * poppler_attachment_save_to_callback:
+ * @attachment: A #PopplerAttachment.
+ * @save_func: (scope call): a function that is called to save each block of data that the save routine generates.
+ * @user_data: user data to pass to the save function.
+ * @error: (allow-none): return location for error, or %NULL.
+ * 
+ * Saves @attachment by feeding the produced data to @save_func. Can be used
+ * when you want to store the attachment to something other than a file, such as
+ * an in-memory buffer or a socket. If @error is set, %FALSE will be
+ * returned. Possible errors include those in the #G_FILE_ERROR domain and
+ * whatever the save function generates.
+ * 
+ * Return value: %TRUE, if the save successfully completed
+ **/
+gboolean
+poppler_attachment_save_to_callback (PopplerAttachment          *attachment,
+                                    PopplerAttachmentSaveFunc   save_func,
+                                    gpointer                    user_data,
+                                    GError                    **error)
+{
+  Stream *stream;
+  gchar buf[BUF_SIZE]; 
+  int i;
+  gboolean eof_reached = FALSE;
+
+  g_return_val_if_fail (POPPLER_IS_ATTACHMENT (attachment), FALSE);
+
+  stream = POPPLER_ATTACHMENT_GET_PRIVATE (attachment)->obj_stream->getStream();
+  stream->reset();
+
+  do
+    {
+      int data;
+
+      for (i = 0; i < BUF_SIZE; i++)
+       {
+         data = stream->getChar ();
+         if (data == EOF)
+           {
+             eof_reached = TRUE;
+             break;
+           }
+         buf[i] = data;
+       }
+
+      if (i > 0)
+       {
+         if (! (save_func) (buf, i, user_data, error))
+           return FALSE;
+       }
+    }
+  while (! eof_reached);
+
+
+  return TRUE;
+}
diff --git a/glib/poppler-attachment.h b/glib/poppler-attachment.h
new file mode 100644 (file)
index 0000000..e87971e
--- /dev/null
@@ -0,0 +1,87 @@
+/* poppler-attachment.h: glib interface to poppler
+ * Copyright (C) 2004, Red Hat, Inc.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#ifndef __POPPLER_ATTACHMENT_H__
+#define __POPPLER_ATTACHMENT_H__
+
+#include <glib.h>
+#include <glib-object.h>
+
+#include "poppler.h"
+
+G_BEGIN_DECLS
+
+
+#define POPPLER_TYPE_ATTACHMENT             (poppler_attachment_get_type ())
+#define POPPLER_ATTACHMENT(obj)             (G_TYPE_CHECK_INSTANCE_CAST ((obj), POPPLER_TYPE_ATTACHMENT, PopplerAttachment))
+#define POPPLER_IS_ATTACHMENT(obj)          (G_TYPE_CHECK_INSTANCE_TYPE ((obj), POPPLER_TYPE_ATTACHMENT))
+
+
+/**
+ * PopplerAttachmentSaveFunc:
+ * @buf: (array length=count) (element-type guint8): buffer containing
+ *   bytes to be written.
+ * @count: number of bytes in @buf.
+ * @data: (closure): user data passed to poppler_attachment_save_to_callback()
+ * @error: GError to set on error, or %NULL
+ *
+ * Specifies the type of the function passed to
+ * poppler_attachment_save_to_callback().  It is called once for each block of
+ * bytes that is "written" by poppler_attachment_save_to_callback().  If
+ * successful it should return %TRUE.  If an error occurs it should set
+ * @error and return %FALSE, in which case poppler_attachment_save_to_callback()
+ * will fail with the same error.
+ *
+ * @Returns: %TRUE if successful, %FALSE (with @error set) if failed.
+ */
+typedef gboolean (*PopplerAttachmentSaveFunc) (const gchar  *buf,
+                                              gsize         count,
+                                              gpointer      data,
+                                              GError      **error);
+
+struct _PopplerAttachment
+{
+  GObject parent;
+
+  gchar *name;
+  gchar *description;
+  gsize size;
+  GTime mtime;
+  GTime ctime;
+  GString *checksum;
+};
+
+typedef struct _PopplerAttachmentClass
+{
+  GObjectClass parent_class;
+} PopplerAttachmentClass;
+
+
+GType     poppler_attachment_get_type         (void) G_GNUC_CONST;
+gboolean  poppler_attachment_save             (PopplerAttachment          *attachment,
+                                              const char                 *filename,
+                                              GError                    **error);
+gboolean  poppler_attachment_save_to_callback (PopplerAttachment          *attachment,
+                                              PopplerAttachmentSaveFunc   save_func,
+                                              gpointer                    user_data,
+                                              GError                    **error);
+
+
+G_END_DECLS
+
+#endif /* __POPPLER_ATTACHMENT_H__ */
diff --git a/glib/poppler-date.cc b/glib/poppler-date.cc
new file mode 100644 (file)
index 0000000..e3141c1
--- /dev/null
@@ -0,0 +1,68 @@
+/* poppler-date.cc: glib interface to poppler
+ *
+ * Copyright (C) 2009 Carlos Garcia Campos <carlosgc@gnome.org>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include <DateInfo.h>
+
+#include "poppler-date.h"
+
+/**
+ * poppler_date_parse:
+ * @date: string to parse
+ * @timet: an uninitialized #time_t
+ *
+ * Parses a PDF format date string and converts it to a #time_t. Returns #FALSE
+ * if the parsing fails or the input string is not a valid PDF format date string
+ *
+ * Return value: #TRUE, if @timet was set
+ *
+ * Since: 0.12
+ **/
+gboolean
+poppler_date_parse (const gchar *date,
+                   time_t      *timet)
+{
+  gint year, mon, day, hour, min, sec, tz_hour, tz_minute;
+  gchar tz;
+  struct tm time;
+  time_t retval;
+  
+  /* See PDF Reference 1.3, Section 3.8.2 for PDF Date representation */
+  // TODO do something with the timezone information
+  if (!parseDateString (date, &year, &mon, &day, &hour, &min, &sec, &tz, &tz_hour, &tz_minute))
+    return FALSE;
+       
+  time.tm_year = year - 1900;
+  time.tm_mon = mon - 1;
+  time.tm_mday = day;
+  time.tm_hour = hour;
+  time.tm_min = min;
+  time.tm_sec = sec;
+  time.tm_wday = -1;
+  time.tm_yday = -1;
+  time.tm_isdst = -1; /* 0 = DST off, 1 = DST on, -1 = don't know */
+  /* compute tm_wday and tm_yday and check date */
+  retval = mktime (&time);
+  if (retval == (time_t) - 1)
+    return FALSE;
+    
+  *timet = retval;
+
+  return TRUE; 
+}
diff --git a/glib/poppler-date.h b/glib/poppler-date.h
new file mode 100644 (file)
index 0000000..2bb52b2
--- /dev/null
@@ -0,0 +1,30 @@
+/* poppler-date.h: glib interface to poppler
+ *
+ * Copyright (C) 2009 Carlos Garcia Campos <carlosgc@gnome.org>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#ifndef __POPPLER_DATE_H__
+#define __POPPLER_DATE_H__
+
+#include "poppler.h"
+
+G_BEGIN_DECLS
+gboolean poppler_date_parse (const gchar *date,
+                            time_t      *timet);
+G_END_DECLS
+
+#endif /* __POPPLER_DATE_H__ */
diff --git a/glib/poppler-document.cc b/glib/poppler-document.cc
new file mode 100644 (file)
index 0000000..24badd9
--- /dev/null
@@ -0,0 +1,2601 @@
+/* poppler-document.cc: glib wrapper for poppler
+ * Copyright (C) 2005, Red Hat, Inc.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include "config.h"
+#include <string.h>
+
+#ifndef __GI_SCANNER__
+#include <goo/GooList.h>
+#include <splash/SplashBitmap.h>
+#include <GlobalParams.h>
+#include <PDFDoc.h>
+#include <Outline.h>
+#include <ErrorCodes.h>
+#include <UnicodeMap.h>
+#include <GfxState.h>
+#include <SplashOutputDev.h>
+#include <Stream.h>
+#include <FontInfo.h>
+#include <PDFDocEncoding.h>
+#include <OptionalContent.h>
+#endif
+
+#include "poppler.h"
+#include "poppler-private.h"
+#include "poppler-enums.h"
+
+/**
+ * SECTION:poppler-document
+ * @short_description: Information about a document
+ * @title: PopplerDocument
+ *
+ * The #PopplerDocument is an object used to refer to a main document.
+ */
+
+enum {
+       PROP_0,
+       PROP_TITLE,
+       PROP_FORMAT,
+       PROP_FORMAT_MAJOR,
+       PROP_FORMAT_MINOR,
+       PROP_AUTHOR,
+       PROP_SUBJECT,
+       PROP_KEYWORDS,
+       PROP_CREATOR,
+       PROP_PRODUCER,
+       PROP_CREATION_DATE,
+       PROP_MOD_DATE,
+       PROP_LINEARIZED,
+       PROP_PAGE_LAYOUT,
+       PROP_PAGE_MODE,
+       PROP_VIEWER_PREFERENCES,
+       PROP_PERMISSIONS,
+       PROP_METADATA
+};
+
+static void poppler_document_layers_free (PopplerDocument *document);
+
+typedef struct _PopplerDocumentClass PopplerDocumentClass;
+struct _PopplerDocumentClass
+{
+  GObjectClass parent_class;
+};
+
+G_DEFINE_TYPE (PopplerDocument, poppler_document, G_TYPE_OBJECT)
+
+static PopplerDocument *
+_poppler_document_new_from_pdfdoc (PDFDoc  *newDoc,
+                                   GError **error)
+{
+  PopplerDocument *document;
+
+  if (!newDoc->isOk()) {
+    int fopen_errno;
+    switch (newDoc->getErrorCode())
+      {
+      case errOpenFile:
+        // If there was an error opening the file, count it as a G_FILE_ERROR 
+        // and set the GError parameters accordingly. (this assumes that the 
+        // only way to get an errOpenFile error is if newDoc was created using 
+        // a filename and thus fopen was called, which right now is true.
+        fopen_errno = newDoc->getFopenErrno();
+        g_set_error (error, G_FILE_ERROR,
+                    g_file_error_from_errno (fopen_errno),
+                    "%s", g_strerror (fopen_errno));
+       break;
+      case errBadCatalog:
+        g_set_error (error, POPPLER_ERROR,
+                    POPPLER_ERROR_BAD_CATALOG,
+                    "Failed to read the document catalog");
+       break;
+      case errDamaged:
+        g_set_error (error, POPPLER_ERROR,
+                    POPPLER_ERROR_DAMAGED,
+                    "PDF document is damaged");
+       break;
+      case errEncrypted:
+        g_set_error (error, POPPLER_ERROR,
+                    POPPLER_ERROR_ENCRYPTED,
+                    "Document is encrypted");
+       break;
+      default:
+        g_set_error (error, POPPLER_ERROR,
+                    POPPLER_ERROR_INVALID,
+                    "Failed to load document");
+    }
+    
+    delete newDoc;
+    return NULL;
+  }
+
+  document = (PopplerDocument *) g_object_new (POPPLER_TYPE_DOCUMENT, NULL);
+  document->doc = newDoc;
+
+  document->output_dev = new CairoOutputDev ();
+  document->output_dev->startDoc(document->doc);
+
+  return document;
+}
+
+static GooString *
+poppler_password_to_latin1 (const gchar *password)
+{
+  gchar *password_latin;
+  GooString *password_g;
+
+  if (!password)
+    return NULL;
+
+  password_latin = g_convert(password, -1, "ISO-8859-1", "UTF-8",
+                             NULL, NULL, NULL);
+  password_g = new GooString (password_latin);
+  g_free (password_latin);
+
+  return password_g;
+}
+
+/**
+ * poppler_document_new_from_file:
+ * @uri: uri of the file to load
+ * @password: (allow-none): password to unlock the file with, or %NULL
+ * @error: (allow-none): Return location for an error, or %NULL
+ * 
+ * Creates a new #PopplerDocument.  If %NULL is returned, then @error will be
+ * set. Possible errors include those in the #POPPLER_ERROR and #G_FILE_ERROR
+ * domains.
+ * 
+ * Return value: A newly created #PopplerDocument, or %NULL
+ **/
+PopplerDocument *
+poppler_document_new_from_file (const char  *uri,
+                               const char  *password,
+                               GError     **error)
+{
+  PDFDoc *newDoc;
+  GooString *filename_g;
+  GooString *password_g;
+  char *filename;
+
+  if (!globalParams) {
+    globalParams = new GlobalParams();
+  }
+
+  filename = g_filename_from_uri (uri, NULL, error);
+  if (!filename)
+    return NULL;
+
+  password_g = poppler_password_to_latin1(password);
+
+#ifdef G_OS_WIN32
+  wchar_t *filenameW;
+  int length;
+
+  length = MultiByteToWideChar(CP_UTF8, 0, filename, -1, NULL, 0);
+
+  filenameW = new WCHAR[length];
+  if (!filenameW)
+      return NULL;
+
+  length = MultiByteToWideChar(CP_UTF8, 0, filename, -1, filenameW, length);
+
+  newDoc = new PDFDoc(filenameW, length, password_g, password_g);
+  delete [] filenameW;
+#else
+  filename_g = new GooString (filename);
+  newDoc = new PDFDoc(filename_g, password_g, password_g);
+#endif
+  g_free (filename);
+
+  delete password_g;
+
+  return _poppler_document_new_from_pdfdoc (newDoc, error);
+}
+
+/**
+ * poppler_document_new_from_data:
+ * @data: the pdf data contained in a char array
+ * @length: the length of #data
+ * @password: (allow-none): password to unlock the file with, or %NULL
+ * @error: (allow-none): Return location for an error, or %NULL
+ * 
+ * Creates a new #PopplerDocument.  If %NULL is returned, then @error will be
+ * set. Possible errors include those in the #POPPLER_ERROR and #G_FILE_ERROR
+ * domains.
+ * 
+ * Return value: A newly created #PopplerDocument, or %NULL
+ **/
+PopplerDocument *
+poppler_document_new_from_data (char        *data,
+                                int          length,
+                                const char  *password,
+                                GError     **error)
+{
+  Object obj;
+  PDFDoc *newDoc;
+  MemStream *str;
+  GooString *password_g;
+
+  if (!globalParams) {
+    globalParams = new GlobalParams();
+  }
+  
+  // create stream
+  obj.initNull();
+  str = new MemStream(data, 0, length, &obj);
+
+  password_g = poppler_password_to_latin1(password);
+  newDoc = new PDFDoc(str, password_g, password_g);
+  delete password_g;
+
+  return _poppler_document_new_from_pdfdoc (newDoc, error);
+}
+
+static gboolean
+handle_save_error (int      err_code,
+                  GError **error)
+{
+  switch (err_code)
+    {
+    case errNone:
+      break;
+    case errOpenFile:
+      g_set_error (error, POPPLER_ERROR,
+                  POPPLER_ERROR_OPEN_FILE,
+                  "Failed to open file for writing");
+      break;
+    case errEncrypted:
+      g_set_error (error, POPPLER_ERROR,
+                  POPPLER_ERROR_ENCRYPTED,
+                  "Document is encrypted");
+      break;
+    default:
+      g_set_error (error, POPPLER_ERROR,
+                  POPPLER_ERROR_INVALID,
+                  "Failed to save document");
+    }
+
+  return err_code == errNone;
+}
+
+/**
+ * poppler_document_save:
+ * @document: a #PopplerDocument
+ * @uri: uri of file to save
+ * @error: (allow-none): return location for an error, or %NULL
+ *
+ * Saves @document. Any change made in the document such as
+ * form fields filled, annotations added or modified
+ * will be saved.
+ * If @error is set, %FALSE will be returned. Possible errors
+ * include those in the #G_FILE_ERROR domain.
+ * 
+ * Return value: %TRUE, if the document was successfully saved
+ **/
+gboolean
+poppler_document_save (PopplerDocument  *document,
+                      const char       *uri,
+                      GError          **error)
+{
+  char *filename;
+  gboolean retval = FALSE;
+
+  g_return_val_if_fail (POPPLER_IS_DOCUMENT (document), FALSE);
+
+  filename = g_filename_from_uri (uri, NULL, error);
+  if (filename != NULL) {
+    GooString *fname = new GooString (filename);
+    int err_code;
+    g_free (filename);
+
+    err_code = document->doc->saveAs (fname);
+    retval = handle_save_error (err_code, error);
+    delete fname;
+  }
+
+  return retval;
+}
+
+/**
+ * poppler_document_save_a_copy:
+ * @document: a #PopplerDocument
+ * @uri: uri of file to save
+ * @error: (allow-none): return location for an error, or %NULL
+ * 
+ * Saves a copy of the original @document.
+ * Any change made in the document such as 
+ * form fields filled by the user will not be saved. 
+ * If @error is set, %FALSE will be returned. Possible errors
+ * include those in the #G_FILE_ERROR domain.
+ * 
+ * Return value: %TRUE, if the document was successfully saved
+ **/
+gboolean
+poppler_document_save_a_copy (PopplerDocument  *document,
+                             const char       *uri,
+                             GError          **error)
+{
+  char *filename;
+  gboolean retval = FALSE;
+
+  g_return_val_if_fail (POPPLER_IS_DOCUMENT (document), FALSE);
+
+  filename = g_filename_from_uri (uri, NULL, error);
+  if (filename != NULL) {
+    GooString *fname = new GooString (filename);
+    int err_code;
+    g_free (filename);
+
+    err_code = document->doc->saveWithoutChangesAs (fname);
+    retval = handle_save_error (err_code, error);
+    delete fname;
+  }
+
+  return retval;
+}
+
+static void
+poppler_document_finalize (GObject *object)
+{
+  PopplerDocument *document = POPPLER_DOCUMENT (object);
+
+  poppler_document_layers_free (document);
+  delete document->output_dev;
+  delete document->doc;
+}
+
+/**
+ * poppler_document_get_id:
+ * @document: A #PopplerDocument
+ * @permanent_id: (out) (allow-none): location to store an allocated string, use g_free() to free the returned string
+ * @update_id: (out) (allow-none): location to store an allocated string, use g_free() to free the returned string
+ *
+ * Returns the PDF file identifier represented as two byte string arrays of size 32.
+ * @permanent_id is the permanent identifier that is built based on the file
+ * contents at the time it was originally created, so that this identifer
+ * never changes. @update_id is the update identifier that is built based on
+ * the file contents at the time it was last updated.
+ *
+ * Note that returned strings are not null-terminated, they have a fixed
+ * size of 32 bytes.
+ *
+ * Returns: %TRUE if the @document contains an id, %FALSE otherwise
+ *
+ * Since: 0.16
+ */
+gboolean
+poppler_document_get_id (PopplerDocument *document,
+                        gchar          **permanent_id,
+                        gchar          **update_id)
+{
+  GooString permanent;
+  GooString update;
+  gboolean  retval = FALSE;
+
+  g_return_val_if_fail (POPPLER_IS_DOCUMENT (document), FALSE);
+
+  if (permanent_id)
+    *permanent_id = NULL;
+  if (update_id)
+    *update_id = NULL;
+
+  if (document->doc->getID (permanent_id ? &permanent : NULL, update_id ? &update : NULL)) {
+    if (permanent_id)
+      *permanent_id = (gchar *)g_memdup (permanent.getCString(), 32);
+    if (update_id)
+      *update_id = (gchar *)g_memdup (update.getCString(), 32);
+
+    retval = TRUE;
+  }
+
+  return retval;
+}
+
+/**
+ * poppler_document_get_n_pages:
+ * @document: A #PopplerDocument
+ * 
+ * Returns the number of pages in a loaded document.
+ * 
+ * Return value: Number of pages
+ **/
+int
+poppler_document_get_n_pages (PopplerDocument *document)
+{
+  g_return_val_if_fail (POPPLER_IS_DOCUMENT (document), 0);
+
+  return document->doc->getNumPages();
+}
+
+/**
+ * poppler_document_get_page:
+ * @document: A #PopplerDocument
+ * @index: a page index 
+ * 
+ * Returns the #PopplerPage indexed at @index.  This object is owned by the
+ * caller.
+ *
+ * Return value: (transfer full) : The #PopplerPage at @index
+ **/
+PopplerPage *
+poppler_document_get_page (PopplerDocument  *document,
+                          int               index)
+{
+  Page *page;
+
+  g_return_val_if_fail (0 <= index &&
+                       index < poppler_document_get_n_pages (document),
+                       NULL);
+
+  page = document->doc->getPage (index + 1);
+  if (!page) return NULL;
+
+  return _poppler_page_new (document, page, index);
+}
+
+/**
+ * poppler_document_get_page_by_label:
+ * @document: A #PopplerDocument
+ * @label: a page label
+ * 
+ * Returns the #PopplerPage reference by @label.  This object is owned by the
+ * caller.  @label is a human-readable string representation of the page number,
+ * and can be document specific.  Typically, it is a value such as "iii" or "3".
+ *
+ * By default, "1" refers to the first page.
+ * 
+ * Return value: (transfer full) :The #PopplerPage referenced by @label
+ **/
+PopplerPage *
+poppler_document_get_page_by_label (PopplerDocument  *document,
+                                   const char       *label)
+{
+  Catalog *catalog;
+  GooString label_g(label);
+  int index;
+
+  catalog = document->doc->getCatalog();
+  if (!catalog->labelToIndex (&label_g, &index))
+    return NULL;
+
+  return poppler_document_get_page (document, index);
+}
+
+/**
+ * poppler_document_get_n_attachments:
+ * @document: A #PopplerDocument
+ *
+ * Returns the number of attachments in a loaded document.
+ * See also poppler_document_get_attachments()
+ *
+ * Return value: Number of attachments
+ *
+ * Since: 0.18
+ */
+guint
+poppler_document_get_n_attachments (PopplerDocument *document)
+{
+  Catalog *catalog;
+
+  g_return_val_if_fail (POPPLER_IS_DOCUMENT (document), 0);
+
+  catalog = document->doc->getCatalog ();
+
+  return catalog && catalog->isOk () ? catalog->numEmbeddedFiles () : 0;
+}
+
+/**
+ * poppler_document_has_attachments:
+ * @document: A #PopplerDocument
+ * 
+ * Returns %TRUE of @document has any attachments.
+ * 
+ * Return value: %TRUE, if @document has attachments.
+ **/
+gboolean
+poppler_document_has_attachments (PopplerDocument *document)
+{
+  g_return_val_if_fail (POPPLER_IS_DOCUMENT (document), FALSE);
+
+  return (poppler_document_get_n_attachments (document) != 0);
+}
+
+/**
+ * poppler_document_get_attachments:
+ * @document: A #PopplerDocument
+ *
+ * Returns a #GList containing #PopplerAttachment<!-- -->s.  These attachments
+ * are unowned, and must be unreffed, and the list must be freed with
+ * g_list_free().
+ *
+ * Return value: (element-type PopplerAttachment) (transfer full): a list of available attachments.
+ **/
+GList *
+poppler_document_get_attachments (PopplerDocument *document)
+{
+  Catalog *catalog;
+  int n_files, i;
+  GList *retval = NULL;
+
+  g_return_val_if_fail (POPPLER_IS_DOCUMENT (document), NULL);
+
+  catalog = document->doc->getCatalog ();
+  if (catalog == NULL || ! catalog->isOk ())
+    return NULL;
+
+  n_files = catalog->numEmbeddedFiles ();
+  for (i = 0; i < n_files; i++)
+    {
+      PopplerAttachment *attachment;
+      FileSpec *emb_file;
+
+      emb_file = catalog->embeddedFile (i);
+      if (!emb_file->isOk () || !emb_file->getEmbeddedFile()->isOk()) {
+        delete emb_file;
+       continue;
+      }
+
+      attachment = _poppler_attachment_new (emb_file);
+      delete emb_file;
+
+      retval = g_list_prepend (retval, attachment);
+    }
+  return g_list_reverse (retval);
+}
+
+/**
+ * poppler_document_find_dest:
+ * @document: A #PopplerDocument
+ * @link_name: a named destination
+ *
+ * Finds named destination @link_name in @document
+ *
+ * Return value: The #PopplerDest destination or %NULL if
+ * @link_name is not a destination. Returned value must
+ * be freed with #poppler_dest_free
+ **/
+PopplerDest *
+poppler_document_find_dest (PopplerDocument *document,
+                           const gchar     *link_name)
+{
+       PopplerDest *dest = NULL;
+       LinkDest *link_dest = NULL;
+       GooString *g_link_name;
+
+       g_return_val_if_fail (POPPLER_IS_DOCUMENT (document), NULL);
+       g_return_val_if_fail (link_name != NULL, NULL);
+
+       g_link_name = new GooString (link_name);
+
+       if (g_link_name) {
+               link_dest = document->doc->findDest (g_link_name);
+               delete g_link_name;
+       }
+
+       if (link_dest) {
+               dest = _poppler_dest_new_goto (document, link_dest);
+               delete link_dest;
+       }
+
+       return dest;
+}
+
+char *_poppler_goo_string_to_utf8(GooString *s)
+{
+  char *result;
+
+  if (s->hasUnicodeMarker()) {
+    result = g_convert (s->getCString () + 2,
+                       s->getLength () - 2,
+                       "UTF-8", "UTF-16BE", NULL, NULL, NULL);
+  } else {
+    int len;
+    gunichar *ucs4_temp;
+    int i;
+    
+    len = s->getLength ();
+    ucs4_temp = g_new (gunichar, len + 1);
+    for (i = 0; i < len; ++i) {
+      ucs4_temp[i] = pdfDocEncoding[(unsigned char)s->getChar(i)];
+    }
+    ucs4_temp[i] = 0;
+
+    result = g_ucs4_to_utf8 (ucs4_temp, -1, NULL, NULL, NULL);
+
+    g_free (ucs4_temp);
+  }
+
+  return result;
+}
+
+static gchar *
+info_dict_get_string (Dict *info_dict, const gchar *key)
+{
+  Object obj;
+  GooString *goo_value;
+  gchar *result;
+
+  if (!info_dict->lookup ((gchar *)key, &obj)->isString ()) {
+    obj.free ();
+    return NULL;
+  }
+
+  goo_value = obj.getString ();
+  result = _poppler_goo_string_to_utf8(goo_value);
+  obj.free ();
+
+  return result;
+}
+
+static time_t
+info_dict_get_date (Dict *info_dict, const gchar *key)
+{
+  Object obj;
+  time_t result;
+
+  if (!info_dict->lookup ((gchar *)key, &obj)->isString ()) {
+    obj.free ();
+    return (time_t)-1;
+  }
+
+  if (!_poppler_convert_pdf_date_to_gtime (obj.getString (), &result))
+    result = (time_t)-1;
+  obj.free ();
+
+  return result;
+}
+
+static PopplerPageLayout
+convert_page_layout (Catalog::PageLayout pageLayout)
+{
+  switch (pageLayout)
+    {
+    case Catalog::pageLayoutSinglePage:
+      return POPPLER_PAGE_LAYOUT_SINGLE_PAGE;
+    case Catalog::pageLayoutOneColumn:
+      return POPPLER_PAGE_LAYOUT_ONE_COLUMN;
+    case Catalog::pageLayoutTwoColumnLeft:
+      return POPPLER_PAGE_LAYOUT_TWO_COLUMN_LEFT;
+    case Catalog::pageLayoutTwoColumnRight:
+      return POPPLER_PAGE_LAYOUT_TWO_COLUMN_RIGHT;
+    case Catalog::pageLayoutTwoPageLeft:
+      return POPPLER_PAGE_LAYOUT_TWO_PAGE_LEFT;
+    case Catalog::pageLayoutTwoPageRight:
+      return POPPLER_PAGE_LAYOUT_TWO_PAGE_RIGHT;
+    case Catalog::pageLayoutNone:
+    default:
+      return POPPLER_PAGE_LAYOUT_UNSET;
+    }
+}
+
+static PopplerPageMode
+convert_page_mode (Catalog::PageMode pageMode)
+{
+  switch (pageMode)
+    {
+    case Catalog::pageModeOutlines:
+      return POPPLER_PAGE_MODE_USE_OUTLINES;
+    case Catalog::pageModeThumbs:
+      return POPPLER_PAGE_MODE_USE_THUMBS;
+    case Catalog::pageModeFullScreen:
+      return POPPLER_PAGE_MODE_FULL_SCREEN;
+    case Catalog::pageModeOC:
+      return POPPLER_PAGE_MODE_USE_OC;
+    case Catalog::pageModeAttach:
+      return POPPLER_PAGE_MODE_USE_ATTACHMENTS;
+    case Catalog::pageModeNone:
+    default:
+      return POPPLER_PAGE_MODE_UNSET;
+    }
+}
+
+/**
+ * poppler_document_get_pdf_version_string:
+ * @document: A #PopplerDocument
+ *
+ * Returns the PDF version of @document as a string (e.g. PDF-1.6)
+ *
+ * Return value: a new allocated string containing the PDF version
+ *               of @document, or %NULL
+ *
+ * Since: 0.16
+ **/
+gchar *
+poppler_document_get_pdf_version_string (PopplerDocument *document)
+{
+  gchar *retval;
+
+  g_return_val_if_fail (POPPLER_IS_DOCUMENT (document), NULL);
+
+  retval = g_strndup ("PDF-", 15); /* allocates 16 chars, pads with \0s */
+  g_ascii_formatd (retval + 4, 15 + 1 - 4, "%.2g",
+                  document->doc->getPDFMajorVersion () + document->doc->getPDFMinorVersion() / 10.0);
+  return retval;
+}
+
+/**
+ * poppler_document_get_pdf_version:
+ * @document: A #PopplerDocument
+ * @major_version: (out) (allow-none): return location for the PDF major version number
+ * @minor_version: (out) (allow-none): return location for the PDF minor version number
+ *
+ * Returns: the major and minor PDF version numbers
+ *
+ * Since: 0.16
+ **/
+void
+poppler_document_get_pdf_version (PopplerDocument *document,
+                                 guint           *major_version,
+                                 guint           *minor_version)
+{
+  g_return_if_fail (POPPLER_IS_DOCUMENT (document));
+
+  if (major_version)
+    *major_version = document->doc->getPDFMajorVersion ();
+  if (minor_version)
+    *minor_version = document->doc->getPDFMinorVersion();
+}
+
+/**
+ * poppler_document_get_title:
+ * @document: A #PopplerDocument
+ *
+ * Returns the document's title
+ *
+ * Return value: a new allocated string containing the title
+ *               of @document, or %NULL
+ *
+ * Since: 0.16
+ **/
+gchar *
+poppler_document_get_title (PopplerDocument *document)
+{
+  Object obj;
+  gchar *retval = NULL;
+
+  g_return_val_if_fail (POPPLER_IS_DOCUMENT (document), NULL);
+
+  document->doc->getDocInfo (&obj);
+  if (obj.isDict ())
+    retval = info_dict_get_string (obj.getDict(), "Title");
+  obj.free ();
+
+  return retval;
+}
+
+/**
+ * poppler_document_get_author:
+ * @document: A #PopplerDocument
+ *
+ * Returns the author of the document
+ *
+ * Return value: a new allocated string containing the author
+ *               of @document, or %NULL
+ *
+ * Since: 0.16
+ **/
+gchar *
+poppler_document_get_author (PopplerDocument *document)
+{
+  Object obj;
+  gchar *retval = NULL;
+
+  g_return_val_if_fail (POPPLER_IS_DOCUMENT (document), NULL);
+
+  document->doc->getDocInfo (&obj);
+  if (obj.isDict ())
+    retval = info_dict_get_string (obj.getDict(), "Author");
+  obj.free ();
+
+  return retval;
+}
+
+/**
+ * poppler_document_get_subject:
+ * @document: A #PopplerDocument
+ *
+ * Returns the subject of the document
+ *
+ * Return value: a new allocated string containing the subject
+ *               of @document, or %NULL
+ *
+ * Since: 0.16
+ **/
+gchar *
+poppler_document_get_subject (PopplerDocument *document)
+{
+  Object obj;
+  gchar *retval = NULL;
+
+  g_return_val_if_fail (POPPLER_IS_DOCUMENT (document), NULL);
+
+  document->doc->getDocInfo (&obj);
+  if (obj.isDict ())
+    retval = info_dict_get_string (obj.getDict(), "Subject");
+  obj.free ();
+
+  return retval;
+}
+
+/**
+ * poppler_document_get_keywords:
+ * @document: A #PopplerDocument
+ *
+ * Returns the keywords associated to the document
+ *
+ * Return value: a new allocated string containing keywords associated
+ *               to @document, or %NULL
+ *
+ * Since: 0.16
+ **/
+gchar *
+poppler_document_get_keywords (PopplerDocument *document)
+{
+  Object obj;
+  gchar *retval = NULL;
+
+  g_return_val_if_fail (POPPLER_IS_DOCUMENT (document), NULL);
+
+  document->doc->getDocInfo (&obj);
+  if (obj.isDict ())
+    retval = info_dict_get_string (obj.getDict(), "Keywords");
+  obj.free ();
+
+  return retval;
+}
+
+/**
+ * poppler_document_get_creator:
+ * @document: A #PopplerDocument
+ *
+ * Returns the creator of the document. If the document was converted
+ * from another format, the creator is the name of the product
+ * that created the original document from which it was converted.
+ *
+ * Return value: a new allocated string containing the creator
+ *               of @document, or %NULL
+ *
+ * Since: 0.16
+ **/
+gchar *
+poppler_document_get_creator (PopplerDocument *document)
+{
+  Object obj;
+  gchar *retval = NULL;
+
+  g_return_val_if_fail (POPPLER_IS_DOCUMENT (document), NULL);
+
+  document->doc->getDocInfo (&obj);
+  if (obj.isDict ())
+    retval = info_dict_get_string (obj.getDict(), "Creator");
+  obj.free ();
+
+  return retval;
+}
+
+/**
+ * poppler_document_get_producer:
+ * @document: A #PopplerDocument
+ *
+ * Returns the producer of the document. If the document was converted
+ * from another format, the producer is the name of the product
+ * that converted it to PDF
+ *
+ * Return value: a new allocated string containing the producer
+ *               of @document, or %NULL
+ *
+ * Since: 0.16
+ **/
+gchar *
+poppler_document_get_producer (PopplerDocument *document)
+{
+  Object obj;
+  gchar *retval = NULL;
+
+  g_return_val_if_fail (POPPLER_IS_DOCUMENT (document), NULL);
+
+  document->doc->getDocInfo (&obj);
+  if (obj.isDict ())
+    retval = info_dict_get_string (obj.getDict(), "Producer");
+  obj.free ();
+
+  return retval;
+}
+
+/**
+ * poppler_document_get_creation_date:
+ * @document: A #PopplerDocument
+ *
+ * Returns the date the document was created as seconds since the Epoch
+ *
+ * Return value: the date the document was created, or -1
+ *
+ * Since: 0.16
+ **/
+time_t
+poppler_document_get_creation_date (PopplerDocument *document)
+{
+  Object obj;
+  time_t retval = (time_t)-1;
+
+  g_return_val_if_fail (POPPLER_IS_DOCUMENT (document), (time_t)-1);
+
+  document->doc->getDocInfo (&obj);
+  if (obj.isDict ())
+    retval = info_dict_get_date (obj.getDict(), "CreationDate");
+  obj.free ();
+
+  return retval;
+}
+
+/**
+ * poppler_document_get_modification_date:
+ * @document: A #PopplerDocument
+ *
+ * Returns the date the document was most recently modified as seconds since the Epoch
+ *
+ * Return value: the date the document was most recently modified, or -1
+ *
+ * Since: 0.16
+ **/
+time_t
+poppler_document_get_modification_date (PopplerDocument *document)
+{
+  Object obj;
+  time_t retval = (time_t)-1;
+
+  g_return_val_if_fail (POPPLER_IS_DOCUMENT (document), (time_t)-1);
+
+  document->doc->getDocInfo (&obj);
+  if (obj.isDict ())
+    retval = info_dict_get_date (obj.getDict(), "ModDate");
+  obj.free ();
+
+  return retval;
+}
+
+/**
+ * poppler_document_is_linearized:
+ * @document: A #PopplerDocument
+ *
+ * Returns whether @document is linearized or not. Linearization of PDF
+ * enables efficient incremental access of the PDF file in a network environment.
+ *
+ * Return value: %TRUE if @document is linearized, %FALSE otherwhise
+ *
+ * Since: 0.16
+ **/
+gboolean
+poppler_document_is_linearized (PopplerDocument *document)
+{
+  g_return_val_if_fail (POPPLER_IS_DOCUMENT (document), FALSE);
+
+  return document->doc->isLinearized ();
+}
+
+/**
+ * poppler_document_get_page_layout:
+ * @document: A #PopplerDocument
+ *
+ * Returns the page layout that should be used when the document is opened
+ *
+ * Return value: a #PopplerPageLayout that should be used when the document is opened
+ *
+ * Since: 0.16
+ **/
+PopplerPageLayout
+poppler_document_get_page_layout (PopplerDocument *document)
+{
+  Catalog *catalog;
+
+  g_return_val_if_fail (POPPLER_IS_DOCUMENT (document), POPPLER_PAGE_LAYOUT_UNSET);
+
+  catalog = document->doc->getCatalog ();
+  if (catalog && catalog->isOk ())
+    return convert_page_layout (catalog->getPageLayout ());
+
+  return POPPLER_PAGE_LAYOUT_UNSET;
+}
+
+/**
+ * poppler_document_get_page_mode:
+ * @document: A #PopplerDocument
+ *
+ * Returns a #PopplerPageMode representing how the document should
+ * be initially displayed when opened.
+ *
+ * Return value: a #PopplerPageMode that should be used when document is opened
+ *
+ * Since: 0.16
+ **/
+PopplerPageMode
+poppler_document_get_page_mode (PopplerDocument *document)
+{
+  Catalog *catalog;
+
+  g_return_val_if_fail (POPPLER_IS_DOCUMENT (document), POPPLER_PAGE_MODE_UNSET);
+
+  catalog = document->doc->getCatalog ();
+  if (catalog && catalog->isOk ())
+    return convert_page_mode (catalog->getPageMode ());
+
+  return POPPLER_PAGE_MODE_UNSET;
+}
+
+/**
+ * poppler_document_get_permissions:
+ * @document: A #PopplerDocument
+ *
+ * Returns the flags specifying which operations are permitted when the document is opened.
+ *
+ * Return value: a set of falgs from  #PopplerPermissions enumeration
+ *
+ * Since: 0.16
+ **/
+PopplerPermissions
+poppler_document_get_permissions (PopplerDocument *document)
+{
+  guint flag = 0;
+
+  g_return_val_if_fail (POPPLER_IS_DOCUMENT (document), POPPLER_PERMISSIONS_FULL);
+
+  if (document->doc->okToPrint ())
+    flag |= POPPLER_PERMISSIONS_OK_TO_PRINT;
+  if (document->doc->okToChange ())
+    flag |= POPPLER_PERMISSIONS_OK_TO_MODIFY;
+  if (document->doc->okToCopy ())
+    flag |= POPPLER_PERMISSIONS_OK_TO_COPY;
+  if (document->doc->okToAddNotes ())
+    flag |= POPPLER_PERMISSIONS_OK_TO_ADD_NOTES;
+  if (document->doc->okToFillForm ())
+    flag |= POPPLER_PERMISSIONS_OK_TO_FILL_FORM;
+  if (document->doc->okToAccessibility())
+    flag |= POPPLER_PERMISSIONS_OK_TO_EXTRACT_CONTENTS;
+  if (document->doc->okToAssemble())
+    flag |= POPPLER_PERMISSIONS_OK_TO_ASSEMBLE;
+  if (document->doc->okToPrintHighRes())
+    flag |= POPPLER_PERMISSIONS_OK_TO_PRINT_HIGH_RESOLUTION;
+
+  return (PopplerPermissions)flag;
+}
+
+/**
+ * poppler_document_get_metadata:
+ * @document: A #PopplerDocument
+ *
+ * Returns the XML metadata string of the document
+ *
+ * Return value: a new allocated string containing the XML
+ *               metadata, or %NULL
+ *
+ * Since: 0.16
+ **/
+gchar *
+poppler_document_get_metadata (PopplerDocument *document)
+{
+  Catalog *catalog;
+  gchar *retval = NULL;
+
+  g_return_val_if_fail (POPPLER_IS_DOCUMENT (document), NULL);
+
+  catalog = document->doc->getCatalog ();
+  if (catalog && catalog->isOk ()) {
+    GooString *s = catalog->readMetadata ();
+
+    if (s != NULL) {
+      retval = g_strdup (s->getCString());
+      delete s;
+    }
+  }
+
+  return retval;
+}
+
+static void
+poppler_document_get_property (GObject    *object,
+                              guint       prop_id,
+                              GValue     *value,
+                              GParamSpec *pspec)
+{
+  PopplerDocument *document = POPPLER_DOCUMENT (object);
+  guint version;
+
+  switch (prop_id)
+    {
+    case PROP_TITLE:
+      g_value_take_string (value, poppler_document_get_title (document));
+      break;
+    case PROP_FORMAT:
+      g_value_take_string (value, poppler_document_get_pdf_version_string (document));
+      break;
+    case PROP_FORMAT_MAJOR:
+      poppler_document_get_pdf_version (document, &version, NULL);
+      g_value_set_uint (value, version);
+      break;
+    case PROP_FORMAT_MINOR:
+      poppler_document_get_pdf_version (document, NULL, &version);
+      g_value_set_uint (value, version);
+      break;
+    case PROP_AUTHOR:
+      g_value_take_string (value, poppler_document_get_author (document));
+      break;
+    case PROP_SUBJECT:
+      g_value_take_string (value, poppler_document_get_subject (document));
+      break;
+    case PROP_KEYWORDS:
+      g_value_take_string (value, poppler_document_get_keywords (document));
+      break;
+    case PROP_CREATOR:
+      g_value_take_string (value, poppler_document_get_creator (document));
+      break;
+    case PROP_PRODUCER:
+      g_value_take_string (value, poppler_document_get_producer (document));
+      break;
+    case PROP_CREATION_DATE:
+      g_value_set_int (value, poppler_document_get_creation_date (document));
+      break;
+    case PROP_MOD_DATE:
+      g_value_set_int (value, poppler_document_get_modification_date (document));
+      break;
+    case PROP_LINEARIZED:
+      g_value_set_boolean (value, poppler_document_is_linearized (document));
+      break;
+    case PROP_PAGE_LAYOUT:
+      g_value_set_enum (value, poppler_document_get_page_layout (document));
+      break;
+    case PROP_PAGE_MODE:
+      g_value_set_enum (value, poppler_document_get_page_mode (document));
+      break;
+    case PROP_VIEWER_PREFERENCES:
+      /* FIXME: write... */
+      g_value_set_flags (value, POPPLER_VIEWER_PREFERENCES_UNSET);
+      break;
+    case PROP_PERMISSIONS:
+      g_value_set_flags (value, poppler_document_get_permissions (document));
+      break;
+    case PROP_METADATA:
+      g_value_take_string (value, poppler_document_get_metadata (document));
+      break;
+    default:
+      G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+    }
+}
+
+static void
+poppler_document_class_init (PopplerDocumentClass *klass)
+{
+  GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
+
+  gobject_class->finalize = poppler_document_finalize;
+  gobject_class->get_property = poppler_document_get_property;
+
+  /**
+   * PopplerDocument:title:
+   *
+   * The document's title or %NULL
+   */
+  g_object_class_install_property (G_OBJECT_CLASS (klass),
+                                  PROP_TITLE,
+                                  g_param_spec_string ("title",
+                                                       "Document Title",
+                                                       "The title of the document",
+                                                       NULL,
+                                                       G_PARAM_READABLE));
+
+  /**
+   * PopplerDocument:format:
+   *
+   * The PDF version as string. See also poppler_document_get_pdf_version_string()
+   */
+  g_object_class_install_property (G_OBJECT_CLASS (klass),
+                                  PROP_FORMAT,
+                                  g_param_spec_string ("format",
+                                                       "PDF Format",
+                                                       "The PDF version of the document",
+                                                       NULL,
+                                                       G_PARAM_READABLE));
+
+  /**
+   * PopplerDocument:format-major:
+   *
+   * The PDF major version number. See also poppler_document_get_pdf_version()
+   */
+  g_object_class_install_property (G_OBJECT_CLASS (klass),
+                                  PROP_FORMAT_MAJOR,
+                                  g_param_spec_uint ("format-major",
+                                                     "PDF Format Major",
+                                                     "The PDF major version number of the document",
+                                                     0, G_MAXUINT, 1,
+                                                     G_PARAM_READABLE));
+
+  /**
+   * PopplerDocument:format-minor:
+   *
+   * The PDF minor version number. See also poppler_document_get_pdf_version()
+   */
+  g_object_class_install_property (G_OBJECT_CLASS (klass),
+                                  PROP_FORMAT_MINOR,
+                                  g_param_spec_uint ("format-minor",
+                                                     "PDF Format Minor",
+                                                     "The PDF minor version number of the document",
+                                                     0, G_MAXUINT, 0,
+                                                     G_PARAM_READABLE));
+
+  /**
+   * PopplerDocument:author:
+   *
+   * The author of the document
+   */
+  g_object_class_install_property (G_OBJECT_CLASS (klass),
+                                  PROP_AUTHOR,
+                                  g_param_spec_string ("author",
+                                                       "Author",
+                                                       "The author of the document",
+                                                       NULL,
+                                                       G_PARAM_READABLE));
+
+  /**
+   * PopplerDocument:subject:
+   *
+   * The subject of the document
+   */
+  g_object_class_install_property (G_OBJECT_CLASS (klass),
+                                  PROP_SUBJECT,
+                                  g_param_spec_string ("subject",
+                                                       "Subject",
+                                                       "Subjects the document touches",
+                                                       NULL,
+                                                       G_PARAM_READABLE));
+
+  /**
+   * PopplerDocument:keywords:
+   *
+   * The keywords associated to the document
+   */
+  g_object_class_install_property (G_OBJECT_CLASS (klass),
+                                  PROP_KEYWORDS,
+                                  g_param_spec_string ("keywords",
+                                                       "Keywords",
+                                                       "Keywords",
+                                                       NULL,
+                                                       G_PARAM_READABLE));
+
+  /**
+   * PopplerDocument:creator:
+   *
+   * The creator of the document. See also poppler_document_get_creator()
+   */
+  g_object_class_install_property (G_OBJECT_CLASS (klass),
+                                  PROP_CREATOR,
+                                  g_param_spec_string ("creator",
+                                                       "Creator",
+                                                       "The software that created the document",
+                                                       NULL,
+                                                       G_PARAM_READABLE));
+
+  /**
+   * PopplerDocument:producer:
+   *
+   * The producer of the document. See also poppler_document_get_producer()
+   */
+  g_object_class_install_property (G_OBJECT_CLASS (klass),
+                                  PROP_PRODUCER,
+                                  g_param_spec_string ("producer",
+                                                       "Producer",
+                                                       "The software that converted the document",
+                                                       NULL,
+                                                       G_PARAM_READABLE));
+
+  /**
+   * PopplerDocument:creation-date:
+   *
+   * The date the document was created as seconds since the Epoch, or -1
+   */
+  g_object_class_install_property (G_OBJECT_CLASS (klass),
+                                  PROP_CREATION_DATE,
+                                  g_param_spec_int ("creation-date",
+                                                    "Creation Date",
+                                                    "The date and time the document was created",
+                                                    -1, G_MAXINT, -1,
+                                                    G_PARAM_READABLE));
+
+  /**
+   * PopplerDocument:mod-date:
+   *
+   * The date the document was most recently modified as seconds since the Epoch, or -1
+   */
+  g_object_class_install_property (G_OBJECT_CLASS (klass),
+                                  PROP_MOD_DATE,
+                                  g_param_spec_int ("mod-date",
+                                                    "Modification Date",
+                                                    "The date and time the document was modified",
+                                                    -1, G_MAXINT, -1,
+                                                    G_PARAM_READABLE));
+
+  /**
+   * PopplerDocument:linearized:
+   *
+   * Whether document is linearized. See also poppler_document_is_linearized()
+   */
+  g_object_class_install_property (G_OBJECT_CLASS (klass),
+                                  PROP_LINEARIZED,
+                                  g_param_spec_boolean ("linearized",
+                                                        "Fast Web View Enabled",
+                                                        "Is the document optimized for web viewing?",
+                                                        FALSE,
+                                                        G_PARAM_READABLE));
+
+  /**
+   * PopplerDocument:page-layout:
+   *
+   * The page layout that should be used when the document is opened
+   */
+  g_object_class_install_property (G_OBJECT_CLASS (klass),
+                                  PROP_PAGE_LAYOUT,
+                                  g_param_spec_enum ("page-layout",
+                                                     "Page Layout",
+                                                     "Initial Page Layout",
+                                                     POPPLER_TYPE_PAGE_LAYOUT,
+                                                     POPPLER_PAGE_LAYOUT_UNSET,
+                                                     G_PARAM_READABLE));
+
+  /**
+   * PopplerDocument:page-mode:
+   *
+   * The mode that should be used when the document is opened
+   */
+  g_object_class_install_property (G_OBJECT_CLASS (klass),
+                                  PROP_PAGE_MODE,
+                                  g_param_spec_enum ("page-mode",
+                                                     "Page Mode",
+                                                     "Page Mode",
+                                                     POPPLER_TYPE_PAGE_MODE,
+                                                     POPPLER_PAGE_MODE_UNSET,
+                                                     G_PARAM_READABLE));
+
+  /**
+   * PopplerDocument:viewer-preferences:
+   */
+  g_object_class_install_property (G_OBJECT_CLASS (klass),
+                                  PROP_VIEWER_PREFERENCES,
+                                  g_param_spec_flags ("viewer-preferences",
+                                                      "Viewer Preferences",
+                                                      "Viewer Preferences",
+                                                      POPPLER_TYPE_VIEWER_PREFERENCES,
+                                                      POPPLER_VIEWER_PREFERENCES_UNSET,
+                                                      G_PARAM_READABLE));
+
+  /**
+   * PopplerDocument:permissions:
+   *
+   * Flags specifying which operations are permitted when the document is opened
+   */
+  g_object_class_install_property (G_OBJECT_CLASS (klass),
+                                  PROP_PERMISSIONS,
+                                  g_param_spec_flags ("permissions",
+                                                      "Permissions",
+                                                      "Permissions",
+                                                      POPPLER_TYPE_PERMISSIONS,
+                                                      POPPLER_PERMISSIONS_FULL,
+                                                      G_PARAM_READABLE));
+
+  /**
+   * PopplerDocument:metadata:
+   *
+   * Document metadata in XML format, or %NULL
+   */
+  g_object_class_install_property (G_OBJECT_CLASS (klass),
+                                  PROP_METADATA,
+                                  g_param_spec_string ("metadata",
+                                                       "XML Metadata",
+                                                       "Embedded XML metadata",
+                                                       NULL,
+                                                       G_PARAM_READABLE));
+}
+
+static void
+poppler_document_init (PopplerDocument *document)
+{
+}
+
+/* PopplerIndexIter: For determining the index of a tree */
+struct _PopplerIndexIter
+{
+       PopplerDocument *document;
+       GooList *items;
+       int index;
+};
+
+
+POPPLER_DEFINE_BOXED_TYPE (PopplerIndexIter, poppler_index_iter,
+                          poppler_index_iter_copy,
+                          poppler_index_iter_free)
+
+/**
+ * poppler_index_iter_copy:
+ * @iter: a #PopplerIndexIter
+ * 
+ * Creates a new #PopplerIndexIter as a copy of @iter.  This must be freed with
+ * poppler_index_iter_free().
+ * 
+ * Return value: a new #PopplerIndexIter
+ **/
+PopplerIndexIter *
+poppler_index_iter_copy (PopplerIndexIter *iter)
+{
+       PopplerIndexIter *new_iter;
+
+       g_return_val_if_fail (iter != NULL, NULL);
+
+       new_iter = g_slice_dup (PopplerIndexIter, iter);
+       new_iter->document = (PopplerDocument *) g_object_ref (new_iter->document);
+
+       return new_iter;
+}
+
+/**
+ * poppler_index_iter_new:
+ * @document: a #PopplerDocument
+ * 
+ * Returns the root #PopplerIndexIter for @document, or %NULL.  This must be
+ * freed with poppler_index_iter_free().
+ *
+ * Certain documents have an index associated with them.  This index can be used
+ * to help the user navigate the document, and is similar to a table of
+ * contents.  Each node in the index will contain a #PopplerAction that can be
+ * displayed to the user &mdash; typically a #POPPLER_ACTION_GOTO_DEST or a
+ * #POPPLER_ACTION_URI<!-- -->.
+ *
+ * Here is a simple example of some code that walks the full index:
+ *
+ * <informalexample><programlisting>
+ * static void
+ * walk_index (PopplerIndexIter *iter)
+ * {
+ *   do
+ *     {
+ *       /<!-- -->* Get the the action and do something with it *<!-- -->/
+ *       PopplerIndexIter *child = poppler_index_iter_get_child (iter);
+ *       if (child)
+ *         walk_index (child);
+ *       poppler_index_iter_free (child);
+ *     }
+ *   while (poppler_index_iter_next (iter));
+ * }
+ * ...
+ * {
+ *   iter = poppler_index_iter_new (document);
+ *   walk_index (iter);
+ *   poppler_index_iter_free (iter);
+ * }
+ *</programlisting></informalexample>
+ *
+ * Return value: a new #PopplerIndexIter
+ **/
+PopplerIndexIter *
+poppler_index_iter_new (PopplerDocument *document)
+{
+       PopplerIndexIter *iter;
+       Outline *outline;
+       GooList *items;
+
+       outline = document->doc->getOutline();
+       if (outline == NULL)
+               return NULL;
+
+       items = outline->getItems();
+       if (items == NULL)
+               return NULL;
+
+       iter = g_slice_new (PopplerIndexIter);
+       iter->document = (PopplerDocument *) g_object_ref (document);
+       iter->items = items;
+       iter->index = 0;
+
+       return iter;
+}
+
+/**
+ * poppler_index_iter_get_child:
+ * @parent: a #PopplerIndexIter
+ * 
+ * Returns a newly created child of @parent, or %NULL if the iter has no child.
+ * See poppler_index_iter_new() for more information on this function.
+ * 
+ * Return value: a new #PopplerIndexIter
+ **/
+PopplerIndexIter *
+poppler_index_iter_get_child (PopplerIndexIter *parent)
+{
+       PopplerIndexIter *child;
+       OutlineItem *item;
+
+       g_return_val_if_fail (parent != NULL, NULL);
+       
+       item = (OutlineItem *)parent->items->get (parent->index);
+       item->open ();
+       if (! (item->hasKids() && item->getKids()) )
+               return NULL;
+
+       child = g_slice_new0 (PopplerIndexIter);
+       child->document = (PopplerDocument *)g_object_ref (parent->document);
+       child->items = item->getKids ();
+
+       g_assert (child->items);
+
+       return child;
+}
+
+static gchar *
+unicode_to_char (Unicode *unicode,
+                int      len)
+{
+       static UnicodeMap *uMap = NULL;
+       if (uMap == NULL) {
+               GooString *enc = new GooString("UTF-8");
+               uMap = globalParams->getUnicodeMap(enc);
+               uMap->incRefCnt ();
+               delete enc;
+       }
+               
+       GooString gstr;
+       gchar buf[8]; /* 8 is enough for mapping an unicode char to a string */
+       int i, n;
+
+       for (i = 0; i < len; ++i) {
+               n = uMap->mapUnicode(unicode[i], buf, sizeof(buf));
+               gstr.append(buf, n);
+       }
+
+       return g_strdup (gstr.getCString ());
+}
+
+/**
+ * poppler_index_iter_is_open:
+ * @iter: a #PopplerIndexIter
+ * 
+ * Returns whether this node should be expanded by default to the user.  The
+ * document can provide a hint as to how the document's index should be expanded
+ * initially.
+ * 
+ * Return value: %TRUE, if the document wants @iter to be expanded
+ **/
+gboolean
+poppler_index_iter_is_open (PopplerIndexIter *iter)
+{
+       OutlineItem *item;
+
+       item = (OutlineItem *)iter->items->get (iter->index);
+
+       return item->isOpen();
+}
+
+/**
+ * poppler_index_iter_get_action:
+ * @iter: a #PopplerIndexIter
+ * 
+ * Returns the #PopplerAction associated with @iter.  It must be freed with
+ * poppler_action_free().
+ * 
+ * Return value: a new #PopplerAction
+ **/
+PopplerAction *
+poppler_index_iter_get_action (PopplerIndexIter  *iter)
+{
+       OutlineItem *item;
+       LinkAction *link_action;
+       PopplerAction *action;
+       gchar *title;
+
+       g_return_val_if_fail (iter != NULL, NULL);
+
+       item = (OutlineItem *)iter->items->get (iter->index);
+       link_action = item->getAction ();
+
+       title = unicode_to_char (item->getTitle(),
+                                item->getTitleLength ());
+
+       action = _poppler_action_new (iter->document, link_action, title);
+       g_free (title);
+
+       return action;
+}
+
+/**
+ * poppler_index_iter_next:
+ * @iter: a #PopplerIndexIter
+ * 
+ * Sets @iter to point to the next action at the current level, if valid.  See
+ * poppler_index_iter_new() for more information.
+ * 
+ * Return value: %TRUE, if @iter was set to the next action
+ **/
+gboolean
+poppler_index_iter_next (PopplerIndexIter *iter)
+{
+       g_return_val_if_fail (iter != NULL, FALSE);
+
+       iter->index++;
+       if (iter->index >= iter->items->getLength())
+               return FALSE;
+
+       return TRUE;
+}
+
+/**
+ * poppler_index_iter_free:
+ * @iter: a #PopplerIndexIter
+ * 
+ * Frees @iter.
+ **/
+void
+poppler_index_iter_free (PopplerIndexIter *iter)
+{
+       if (G_UNLIKELY (iter == NULL))
+               return;
+
+       g_object_unref (iter->document);
+       g_slice_free (PopplerIndexIter, iter);
+}
+
+struct _PopplerFontsIter
+{
+       GooList *items;
+       int index;
+};
+
+POPPLER_DEFINE_BOXED_TYPE (PopplerFontsIter, poppler_fonts_iter,
+                          poppler_fonts_iter_copy,
+                          poppler_fonts_iter_free)
+
+/**
+ * poppler_fonts_iter_get_full_name:
+ * @iter: a #PopplerFontsIter
+ *
+ * Returns the full name of the font associated with @iter
+ *
+ * Returns: the font full name
+ */
+const char *
+poppler_fonts_iter_get_full_name (PopplerFontsIter *iter)
+{
+       GooString *name;
+       FontInfo *info;
+
+       info = (FontInfo *)iter->items->get (iter->index);
+
+       name = info->getName();
+       if (name != NULL) {
+               return info->getName()->getCString();
+       } else {
+               return NULL;
+       }
+}
+
+/**
+ * poppler_fonts_iter_get_name:
+ * @iter: a #PopplerFontsIter
+ *
+ * Returns the name of the font associated with @iter
+ *
+ * Returns: the font name
+ */
+const char *
+poppler_fonts_iter_get_name (PopplerFontsIter *iter)
+{
+       FontInfo *info;
+       const char *name;
+
+       name = poppler_fonts_iter_get_full_name (iter);
+       info = (FontInfo *)iter->items->get (iter->index);
+
+       if (info->getSubset() && name) {
+               while (*name && *name != '+')
+                       name++;
+
+               if (*name)
+                       name++;
+       }
+
+       return name;
+}
+
+/**
+ * poppler_fonts_iter_get_substitute_name:
+ * @iter: a #PopplerFontsIter
+ *
+ * The name of the substitute font of the font associated with @iter or %NULL if
+ * the font is embedded
+ *
+ * Returns: the name of the substitute font or %NULL if font is embedded
+ *
+ * Since: 0.20
+ */
+const char *
+poppler_fonts_iter_get_substitute_name (PopplerFontsIter *iter)
+{
+       GooString *name;
+       FontInfo *info;
+
+       info = (FontInfo *)iter->items->get (iter->index);
+
+       name = info->getSubstituteName();
+       if (name != NULL) {
+               return name->getCString();
+       } else {
+               return NULL;
+       }
+}
+
+/**
+ * poppler_fonts_iter_get_file_name:
+ * @iter: a #PopplerFontsIter
+ *
+ * The filename of the font associated with @iter or %NULL if
+ * the font is embedded
+ *
+ * Returns: the filename of the font or %NULL if font is embedded
+ */
+const char *
+poppler_fonts_iter_get_file_name (PopplerFontsIter *iter)
+{
+       GooString *file;
+       FontInfo *info;
+
+       info = (FontInfo *)iter->items->get (iter->index);
+
+       file = info->getFile();
+       if (file != NULL) {
+               return file->getCString();
+       } else {
+               return NULL;
+       }
+}
+
+/**
+ * poppler_fonts_iter_get_font_type:
+ * @iter: a #PopplerFontsIter
+ *
+ * Returns the type of the font associated with @iter
+ *
+ * Returns: the font type
+ */
+PopplerFontType
+poppler_fonts_iter_get_font_type (PopplerFontsIter *iter)
+{
+       FontInfo *info;
+
+       g_return_val_if_fail (iter != NULL, POPPLER_FONT_TYPE_UNKNOWN);
+
+       info = (FontInfo *)iter->items->get (iter->index);
+
+       return (PopplerFontType)info->getType ();
+}
+
+/**
+ * poppler_fonts_iter_get_encoding:
+ * @iter: a #PopplerFontsIter
+ *
+ * Returns the encoding of the font associated with @iter
+ *
+ * Returns: the font encoding
+ *
+ * Since: 0.20
+ */
+const char *
+poppler_fonts_iter_get_encoding (PopplerFontsIter *iter)
+{
+       GooString *encoding;
+       FontInfo *info;
+
+       info = (FontInfo *)iter->items->get (iter->index);
+
+       encoding = info->getEncoding();
+       if (encoding != NULL) {
+               return encoding->getCString();
+       } else {
+               return NULL;
+       }
+}
+
+/**
+ * poppler_fonts_iter_is_embedded:
+ * @iter: a #PopplerFontsIter
+ *
+ * Returns whether the font associated with @iter is embedded in the document
+ *
+ * Returns: %TRUE if font is emebdded, %FALSE otherwise
+ */
+gboolean
+poppler_fonts_iter_is_embedded (PopplerFontsIter *iter)
+{
+       FontInfo *info;
+
+       info = (FontInfo *)iter->items->get (iter->index);
+
+       return info->getEmbedded();
+}
+
+/**
+ * poppler_fonts_iter_is_subset:
+ * @iter: a #PopplerFontsIter
+ *
+ * Returns whether the font associated with @iter is a subset of another font
+ *
+ * Returns: %TRUE if font is a subset, %FALSE otherwise
+ */
+gboolean
+poppler_fonts_iter_is_subset (PopplerFontsIter *iter)
+{
+       FontInfo *info;
+
+       info = (FontInfo *)iter->items->get (iter->index);
+
+       return info->getSubset();
+}
+
+/**
+ * poppler_fonts_iter_next:
+ * @iter: a #PopplerFontsIter
+ *
+ * Sets @iter to point to the next font
+ *
+ * Returns: %TRUE, if @iter was set to the next font
+ **/
+gboolean
+poppler_fonts_iter_next (PopplerFontsIter *iter)
+{
+       g_return_val_if_fail (iter != NULL, FALSE);
+
+       iter->index++;
+       if (iter->index >= iter->items->getLength())
+               return FALSE;
+
+       return TRUE;
+}
+
+/**
+ * poppler_fonts_iter_copy:
+ * @iter: a #PopplerFontsIter to copy
+ *
+ * Creates a copy of @iter
+ *
+ * Returns: a new allocated copy of @iter
+ */
+PopplerFontsIter *
+poppler_fonts_iter_copy (PopplerFontsIter *iter)
+{
+       PopplerFontsIter *new_iter;
+
+       g_return_val_if_fail (iter != NULL, NULL);
+
+       new_iter = g_slice_dup (PopplerFontsIter, iter);
+
+       new_iter->items = new GooList ();
+       for (int i = 0; i < iter->items->getLength(); i++) {
+               FontInfo *info = (FontInfo *)iter->items->get(i);
+               new_iter->items->append (new FontInfo (*info));
+       }
+
+       return new_iter;
+}
+
+/**
+ * poppler_fonts_iter_free:
+ * @iter: a #PopplerFontsIter
+ *
+ * Frees the given #PopplerFontsIter
+ */
+void
+poppler_fonts_iter_free (PopplerFontsIter *iter)
+{
+       if (G_UNLIKELY (iter == NULL))
+               return;
+
+       deleteGooList (iter->items, FontInfo);
+
+       g_slice_free (PopplerFontsIter, iter);
+}
+
+static PopplerFontsIter *
+poppler_fonts_iter_new (GooList *items)
+{
+       PopplerFontsIter *iter;
+
+       iter = g_slice_new (PopplerFontsIter);
+       iter->items = items;
+       iter->index = 0;
+
+       return iter;
+}
+
+
+typedef struct _PopplerFontInfoClass PopplerFontInfoClass;
+struct _PopplerFontInfoClass
+{
+        GObjectClass parent_class;
+};
+
+G_DEFINE_TYPE (PopplerFontInfo, poppler_font_info, G_TYPE_OBJECT)
+
+static void poppler_font_info_finalize (GObject *object);
+
+
+static void
+poppler_font_info_class_init (PopplerFontInfoClass *klass)
+{
+        GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
+
+        gobject_class->finalize = poppler_font_info_finalize;
+}
+
+static void
+poppler_font_info_init (PopplerFontInfo *font_info)
+{
+        font_info->document = NULL;
+        font_info->scanner = NULL;
+}
+
+static void
+poppler_font_info_finalize (GObject *object)
+{
+        PopplerFontInfo *font_info = POPPLER_FONT_INFO (object);
+
+        delete font_info->scanner;
+        g_object_unref (font_info->document);
+}
+
+/**
+ * poppler_font_info_new:
+ * @document: a #PopplerDocument
+ *
+ * Creates a new #PopplerFontInfo object
+ *
+ * Returns: a new #PopplerFontInfo instance
+ */
+PopplerFontInfo *
+poppler_font_info_new (PopplerDocument *document)
+{
+       PopplerFontInfo *font_info;
+
+       g_return_val_if_fail (POPPLER_IS_DOCUMENT (document), NULL);
+
+       font_info = (PopplerFontInfo *) g_object_new (POPPLER_TYPE_FONT_INFO,
+                                                     NULL);
+       font_info->document = (PopplerDocument *) g_object_ref (document);
+       font_info->scanner = new FontInfoScanner(document->doc);
+
+       return font_info;
+}
+
+/**
+ * poppler_font_info_scan:
+ * @font_info: a #PopplerFontInfo
+ * @n_pages: number of pages to scan
+ * @iter: (out): return location for a #PopplerFontsIter
+ *
+ * Scans the document associated with @font_info for fonts. At most
+ * @n_pages will be scanned starting from the current iterator. @iter will
+ * point to the first font scanned.
+ *
+ * Here is a simple example of code to scan fonts in a document
+ *
+ * <informalexample><programlisting>
+ * font_info = poppler_font_info_new (document);
+ * while (poppler_font_info_scan (font_info, 20, &fonts_iter)) {
+ *         if (!fonts_iter)
+ *                 continue; /<!-- -->* No fonts found in these 20 pages *<!-- -->/
+ *         do {
+ *                 /<!-- -->* Do something with font iter *<!-- -->/
+ *                 g_print ("Font Name: %s\n", poppler_fonts_iter_get_name (fonts_iter));
+ *         } while (poppler_fonts_iter_next (fonts_iter));
+ *         poppler_fonts_iter_free (fonts_iter);
+ * }
+ * </programlisting></informalexample>
+ *
+ * Returns: %TRUE, if there are more fonts left to scan
+ */
+gboolean
+poppler_font_info_scan (PopplerFontInfo   *font_info,
+                       int                n_pages,
+                       PopplerFontsIter **iter)
+{
+       GooList *items;
+
+       g_return_val_if_fail (iter != NULL, FALSE);
+
+       items = font_info->scanner->scan(n_pages);
+
+       if (items == NULL) {
+               *iter = NULL;
+       } else if (items->getLength() == 0) {
+               *iter = NULL;
+               delete items;
+       } else {
+               *iter = poppler_fonts_iter_new(items);
+       }
+       
+       return (items != NULL);
+}
+
+/* For backward compatibility */
+void
+poppler_font_info_free (PopplerFontInfo *font_info)
+{
+       g_return_if_fail (font_info != NULL);
+
+       g_object_unref (font_info);
+}
+
+
+/* Optional content (layers) */
+static Layer *
+layer_new (OptionalContentGroup *oc)
+{
+  Layer *layer;
+
+  layer = g_slice_new0 (Layer);
+  layer->oc = oc;
+
+  return layer;
+}
+
+static void
+layer_free (Layer *layer)
+{
+  if (G_UNLIKELY (!layer))
+    return;
+
+  if (layer->kids) {
+         g_list_foreach (layer->kids, (GFunc)layer_free, NULL);
+         g_list_free (layer->kids);
+  }
+
+  if (layer->label) {
+         g_free (layer->label);
+  }
+
+  g_slice_free (Layer, layer);
+}
+
+static GList *
+get_optional_content_rbgroups (OCGs *ocg)
+{
+  Array *rb;
+  GList *groups = NULL;
+  
+  rb = ocg->getRBGroupsArray ();
+  
+  if (rb) {
+    int i, j;
+
+    for (i = 0; i < rb->getLength (); ++i) {
+      Object obj;
+      Array *rb_array;
+      GList *group = NULL;
+
+      rb->get (i, &obj);
+      if (!obj.isArray ()) {
+        obj.free ();
+       continue;
+      }
+
+      rb_array = obj.getArray ();
+      for (j = 0; j < rb_array->getLength (); ++j) {
+        Object ref;
+       OptionalContentGroup *oc;
+
+       rb_array->getNF (j, &ref);
+       if (!ref.isRef ()) {
+         ref.free ();
+         continue;
+       }
+
+       oc = ocg->findOcgByRef (ref.getRef ());
+       group = g_list_prepend (group, oc);
+       ref.free ();
+      }
+      obj.free ();
+
+      groups = g_list_prepend (groups, group);
+    }
+  }
+
+  return groups;
+}
+
+GList *
+_poppler_document_get_layer_rbgroup (PopplerDocument *document,
+                                   Layer           *layer)
+{
+  GList *l;
+
+  for (l = document->layers_rbgroups; l && l->data; l = g_list_next (l)) {
+    GList *group = (GList *)l->data;
+
+    if (g_list_find (group, layer->oc))
+      return group;
+  }
+
+  return NULL;
+}
+
+static GList *
+get_optional_content_items_sorted (OCGs *ocg, Layer *parent, Array *order)
+{
+  GList *items = NULL;
+  Layer *last_item = parent;
+  int i;
+
+  for (i = 0; i < order->getLength (); ++i) {
+    Object orderItem;
+      
+    order->get (i, &orderItem);
+
+    if (orderItem.isDict ()) {
+      Object ref;
+      
+      order->getNF (i, &ref);
+      if (ref.isRef ()) {
+        OptionalContentGroup *oc = ocg->findOcgByRef (ref.getRef ());
+       Layer *layer = layer_new (oc);
+
+       items = g_list_prepend (items, layer);
+       last_item = layer;
+      }
+      ref.free ();
+    } else if (orderItem.isArray () && orderItem.arrayGetLength () > 0) {
+      if (!last_item) {
+        last_item = layer_new (NULL);
+       items = g_list_prepend (items, last_item);
+      }
+      last_item->kids = get_optional_content_items_sorted (ocg, last_item, orderItem.getArray ());
+      last_item = NULL;
+    } else if (orderItem.isString ()) {
+      last_item->label = _poppler_goo_string_to_utf8 (orderItem.getString ());
+    }
+    orderItem.free ();
+  }
+  
+  return g_list_reverse (items);
+}
+               
+static GList *
+get_optional_content_items (OCGs *ocg)
+{
+  Array *order;
+  GList *items = NULL;
+  
+  order = ocg->getOrderArray ();
+
+  if (order) {
+    items = get_optional_content_items_sorted (ocg, NULL, order);
+  } else {
+    GooList *ocgs;
+    int i;
+
+    ocgs = ocg->getOCGs ();
+    
+    for (i = 0; i < ocgs->getLength (); ++i) {
+      OptionalContentGroup *oc = (OptionalContentGroup *) ocgs->get (i);
+      Layer *layer = layer_new (oc);
+      
+      items = g_list_prepend (items, layer);
+    }
+    
+    items = g_list_reverse (items);
+  }
+
+  return items;
+}
+
+GList *
+_poppler_document_get_layers (PopplerDocument *document)
+{
+  if (!document->layers) {
+    Catalog *catalog = document->doc->getCatalog ();
+    OCGs *ocg = catalog->getOptContentConfig ();
+
+    if (!ocg)
+      return NULL;
+    
+    document->layers = get_optional_content_items (ocg);
+    document->layers_rbgroups = get_optional_content_rbgroups (ocg);
+  }
+
+  return document->layers;
+}
+
+static void
+poppler_document_layers_free (PopplerDocument *document)
+{
+  if (G_UNLIKELY (!document->layers))
+    return;
+
+  g_list_foreach (document->layers, (GFunc)layer_free, NULL);
+  g_list_free (document->layers);
+
+  g_list_foreach (document->layers_rbgroups, (GFunc)g_list_free, NULL);
+  g_list_free (document->layers_rbgroups);
+
+  document->layers = NULL;
+  document->layers_rbgroups = NULL;
+}
+
+/* PopplerLayersIter */
+struct _PopplerLayersIter {
+  PopplerDocument *document;
+  GList *items;
+  int index;
+};
+
+POPPLER_DEFINE_BOXED_TYPE (PopplerLayersIter, poppler_layers_iter,
+                          poppler_layers_iter_copy,
+                          poppler_layers_iter_free)
+
+/**
+ * poppler_layers_iter_copy:
+ * @iter: a #PopplerLayersIter
+ * 
+ * Creates a new #PopplerLayersIter as a copy of @iter.  This must be freed with
+ * poppler_layers_iter_free().
+ * 
+ * Return value: a new #PopplerLayersIter
+ *
+ * Since 0.12
+ **/
+PopplerLayersIter *
+poppler_layers_iter_copy (PopplerLayersIter *iter)
+{
+  PopplerLayersIter *new_iter;
+
+  g_return_val_if_fail (iter != NULL, NULL);
+  
+  new_iter = g_slice_dup (PopplerLayersIter, iter);
+  new_iter->document = (PopplerDocument *) g_object_ref (new_iter->document);
+  
+  return new_iter;
+}
+
+/**
+ * poppler_layers_iter_free:
+ * @iter: a #PopplerLayersIter
+ * 
+ * Frees @iter.
+ *
+ * Since: 0.12
+ **/
+void
+poppler_layers_iter_free (PopplerLayersIter *iter)
+{
+  if (G_UNLIKELY (iter == NULL))
+    return;
+
+  g_object_unref (iter->document);
+  g_slice_free (PopplerLayersIter, iter);
+}
+
+/**
+ * poppler_layers_iter_new:
+ * @document: a #PopplerDocument
+ *
+ * Since: 0.12
+ **/
+PopplerLayersIter *
+poppler_layers_iter_new (PopplerDocument *document)
+{
+  PopplerLayersIter *iter;
+  GList *items;
+
+  items = _poppler_document_get_layers (document);
+
+  if (!items)
+    return NULL;
+
+  iter = g_slice_new0 (PopplerLayersIter);
+  iter->document = (PopplerDocument *)g_object_ref (document);
+  iter->items = items;
+
+  return iter;
+}
+
+/**
+ * poppler_layers_iter_get_child:
+ * @parent: a #PopplerLayersIter
+ * 
+ * Returns a newly created child of @parent, or %NULL if the iter has no child.
+ * See poppler_layers_iter_new() for more information on this function.
+ * 
+ * Return value: a new #PopplerLayersIter, or %NULL
+ *
+ * Since: 0.12
+ **/
+PopplerLayersIter *
+poppler_layers_iter_get_child (PopplerLayersIter *parent)
+{
+  PopplerLayersIter *child;
+  Layer *layer;
+
+  g_return_val_if_fail (parent != NULL, NULL);
+       
+  layer = (Layer *) g_list_nth_data (parent->items, parent->index);
+  if (!layer || !layer->kids)
+    return NULL;
+
+  child = g_slice_new0 (PopplerLayersIter);
+  child->document = (PopplerDocument *)g_object_ref (parent->document);
+  child->items = layer->kids;
+
+  g_assert (child->items);
+
+  return child;
+}
+
+/**
+ * poppler_layers_iter_get_title:
+ * @iter: a #PopplerLayersIter
+ * 
+ * Returns the title associated with @iter.  It must be freed with
+ * g_free().
+ * 
+ * Return value: a new string containing the @iter's title or %NULL if @iter doesn't have a title.
+ * The returned string should be freed with g_free() when no longer needed.
+ *
+ * Since: 0.12
+ **/
+gchar *
+poppler_layers_iter_get_title (PopplerLayersIter *iter)
+{
+  Layer *layer;
+  
+  g_return_val_if_fail (iter != NULL, NULL);
+  
+  layer = (Layer *)g_list_nth_data (iter->items, iter->index);
+
+  return layer->label ? g_strdup (layer->label) : NULL;
+}
+
+/**
+ * poppler_layers_iter_get_layer:
+ * @iter: a #PopplerLayersIter
+ *
+ * Returns the #PopplerLayer associated with @iter.
+ *
+ * Return value: (transfer full): a new #PopplerLayer, or %NULL if
+ * there isn't any layer associated with @iter
+ *
+ * Since: 0.12
+ **/
+PopplerLayer *
+poppler_layers_iter_get_layer (PopplerLayersIter *iter)
+{
+  Layer *layer;
+  PopplerLayer *poppler_layer = NULL;
+  
+  g_return_val_if_fail (iter != NULL, NULL);
+  
+  layer = (Layer *)g_list_nth_data (iter->items, iter->index);
+  if (layer->oc) {
+    GList *rb_group = NULL;
+
+    rb_group = _poppler_document_get_layer_rbgroup (iter->document, layer);
+    poppler_layer = _poppler_layer_new (iter->document, layer, rb_group);
+  }
+  
+  return poppler_layer;
+}
+
+/**
+ * poppler_layers_iter_next:
+ * @iter: a #PopplerLayersIter
+ * 
+ * Sets @iter to point to the next action at the current level, if valid.  See
+ * poppler_layers_iter_new() for more information.
+ * 
+ * Return value: %TRUE, if @iter was set to the next action
+ *
+ * Since: 0.12
+ **/
+gboolean
+poppler_layers_iter_next (PopplerLayersIter *iter)
+{
+  g_return_val_if_fail (iter != NULL, FALSE);
+
+  iter->index++;
+  if (iter->index >= (gint)g_list_length (iter->items))
+    return FALSE;
+  
+  return TRUE;
+}
+
+typedef struct _PopplerPSFileClass PopplerPSFileClass;
+struct _PopplerPSFileClass
+{
+        GObjectClass parent_class;
+};
+
+G_DEFINE_TYPE (PopplerPSFile, poppler_ps_file, G_TYPE_OBJECT)
+
+static void poppler_ps_file_finalize (GObject *object);
+
+
+static void
+poppler_ps_file_class_init (PopplerPSFileClass *klass)
+{
+        GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
+
+        gobject_class->finalize = poppler_ps_file_finalize;
+}
+
+static void
+poppler_ps_file_init (PopplerPSFile *ps_file)
+{
+        ps_file->out = NULL;
+        ps_file->paper_width = -1;
+        ps_file->paper_height = -1;
+        ps_file->duplex = FALSE;
+}
+
+static void
+poppler_ps_file_finalize (GObject *object)
+{
+        PopplerPSFile *ps_file = POPPLER_PS_FILE (object);
+
+        delete ps_file->out;
+        g_object_unref (ps_file->document);
+        g_free (ps_file->filename);
+}
+
+/**
+ * poppler_ps_file_new:
+ * @document: a #PopplerDocument
+ * @filename: the path of the output filename
+ * @first_page: the first page to print
+ * @n_pages: the number of pages to print
+ * 
+ * Create a new postscript file to render to
+ * 
+ * Return value: a PopplerPSFile 
+ **/
+PopplerPSFile *
+poppler_ps_file_new (PopplerDocument *document, const char *filename,
+                    int first_page, int n_pages)
+{
+       PopplerPSFile *ps_file;
+
+       g_return_val_if_fail (POPPLER_IS_DOCUMENT (document), NULL);
+       g_return_val_if_fail (filename != NULL, NULL);
+       g_return_val_if_fail (n_pages > 0, NULL);
+
+        ps_file = (PopplerPSFile *) g_object_new (POPPLER_TYPE_PS_FILE, NULL);
+       ps_file->document = (PopplerDocument *) g_object_ref (document);
+        ps_file->filename = g_strdup (filename);
+        ps_file->first_page = first_page + 1;
+        ps_file->last_page = first_page + 1 + n_pages - 1;
+
+       return ps_file;
+}
+
+/**
+ * poppler_ps_file_set_paper_size:
+ * @ps_file: a PopplerPSFile which was not yet printed to.
+ * @width: the paper width in 1/72 inch
+ * @height: the paper height in 1/72 inch
+ *
+ * Set the output paper size. These values will end up in the
+ * DocumentMedia, the BoundingBox DSC comments and other places in the
+ * generated PostScript.
+ *
+ **/
+void
+poppler_ps_file_set_paper_size (PopplerPSFile *ps_file,
+                                double width, double height)
+{
+        g_return_if_fail (ps_file->out == NULL);
+        
+        ps_file->paper_width = width;
+        ps_file->paper_height = height;
+}
+
+/**
+ * poppler_ps_file_set_duplex:
+ * @ps_file: a PopplerPSFile which was not yet printed to
+ * @duplex: whether to force duplex printing (on printers which support this)
+ *
+ * Enable or disable Duplex printing. 
+ *
+ **/
+void
+poppler_ps_file_set_duplex (PopplerPSFile *ps_file, gboolean duplex)
+{
+        g_return_if_fail (ps_file->out == NULL);
+
+        ps_file->duplex = duplex;
+}
+
+/**
+ * poppler_ps_file_free:
+ * @ps_file: a PopplerPSFile
+ * 
+ * Frees @ps_file
+ * 
+ **/
+void
+poppler_ps_file_free (PopplerPSFile *ps_file)
+{
+       g_return_if_fail (ps_file != NULL);
+        g_object_unref (ps_file);
+}
+
+/**
+ * poppler_document_get_form_field:
+ * @document: a #PopplerDocument
+ * @id: an id of a #PopplerFormField
+ *
+ * Returns the #PopplerFormField for the given @id. It must be freed with
+ * g_object_unref()
+ *
+ * Return value: (transfer full): a new #PopplerFormField or %NULL if
+ * not found
+ **/
+PopplerFormField *
+poppler_document_get_form_field (PopplerDocument *document,
+                                gint             id)
+{
+  Page *page;
+  unsigned pageNum;
+  unsigned fieldNum;
+  FormPageWidgets *widgets;
+  FormWidget *field;
+
+  FormWidget::decodeID (id, &pageNum, &fieldNum);
+
+  page = document->doc->getPage (pageNum);
+  if (!page)
+    return NULL;
+
+  widgets = page->getFormWidgets ();
+  if (!widgets)
+    return NULL;
+
+  field = widgets->getWidget (fieldNum);
+  if (field)
+    return _poppler_form_field_new (document, field);
+
+  return NULL;
+}
+
+gboolean
+_poppler_convert_pdf_date_to_gtime (GooString *date,
+                                   time_t    *gdate) 
+{
+  gchar *date_string;
+  gboolean retval;
+
+  if (date->hasUnicodeMarker()) {
+    date_string = g_convert (date->getCString () + 2,
+                            date->getLength () - 2,
+                            "UTF-8", "UTF-16BE", NULL, NULL, NULL);            
+  } else {
+    date_string = g_strndup (date->getCString (), date->getLength ());
+  }
+
+  retval = poppler_date_parse (date_string, gdate);
+  g_free (date_string);
+
+  return retval;
+}
diff --git a/glib/poppler-document.h b/glib/poppler-document.h
new file mode 100644 (file)
index 0000000..7051830
--- /dev/null
@@ -0,0 +1,289 @@
+/* poppler-document.h: glib interface to poppler
+ * Copyright (C) 2004, Red Hat, Inc.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#ifndef __POPPLER_DOCUMENT_H__
+#define __POPPLER_DOCUMENT_H__
+
+#include <glib-object.h>
+#include "poppler.h"
+
+G_BEGIN_DECLS
+
+#define POPPLER_TYPE_DOCUMENT             (poppler_document_get_type ())
+#define POPPLER_DOCUMENT(obj)             (G_TYPE_CHECK_INSTANCE_CAST ((obj), POPPLER_TYPE_DOCUMENT, PopplerDocument))
+#define POPPLER_IS_DOCUMENT(obj)          (G_TYPE_CHECK_INSTANCE_TYPE ((obj), POPPLER_TYPE_DOCUMENT))
+
+/**
+ * PopplerPageLayout:
+ * @POPPLER_PAGE_LAYOUT_UNSET: no specific layout set
+ * @POPPLER_PAGE_LAYOUT_SINGLE_PAGE: one page at a time
+ * @POPPLER_PAGE_LAYOUT_ONE_COLUMN: pages in one column
+ * @POPPLER_PAGE_LAYOUT_TWO_COLUMN_LEFT: pages in two columns with odd numbered pages on the left
+ * @POPPLER_PAGE_LAYOUT_TWO_COLUMN_RIGHT: pages in two columns with odd numbered pages on the right
+ * @POPPLER_PAGE_LAYOUT_TWO_PAGE_LEFT: two pages at a time with odd numbered pages on the left
+ * @POPPLER_PAGE_LAYOUT_TWO_PAGE_RIGHT: two pages at a time with odd numbered pages on the right
+ *
+ * Page layout types
+ */
+typedef enum
+{
+  POPPLER_PAGE_LAYOUT_UNSET,
+  POPPLER_PAGE_LAYOUT_SINGLE_PAGE,
+  POPPLER_PAGE_LAYOUT_ONE_COLUMN,
+  POPPLER_PAGE_LAYOUT_TWO_COLUMN_LEFT,
+  POPPLER_PAGE_LAYOUT_TWO_COLUMN_RIGHT,
+  POPPLER_PAGE_LAYOUT_TWO_PAGE_LEFT,
+  POPPLER_PAGE_LAYOUT_TWO_PAGE_RIGHT
+} PopplerPageLayout;
+
+/**
+ * PopplerPageMode:
+ * @POPPLER_PAGE_MODE_UNSET: no specific mode set
+ * @POPPLER_PAGE_MODE_NONE: neither document outline nor thumbnails visible
+ * @POPPLER_PAGE_MODE_USE_OUTLINES: document outline visible
+ * @POPPLER_PAGE_MODE_USE_THUMBS: thumbnails visible
+ * @POPPLER_PAGE_MODE_FULL_SCREEN: full-screen mode
+ * @POPPLER_PAGE_MODE_USE_OC: layers panel visible
+ * @POPPLER_PAGE_MODE_USE_ATTACHMENTS: attachments panel visible
+ *
+ * Page modes
+ */
+typedef enum
+{
+  POPPLER_PAGE_MODE_UNSET,
+  POPPLER_PAGE_MODE_NONE,
+  POPPLER_PAGE_MODE_USE_OUTLINES,
+  POPPLER_PAGE_MODE_USE_THUMBS,
+  POPPLER_PAGE_MODE_FULL_SCREEN,
+  POPPLER_PAGE_MODE_USE_OC,
+  POPPLER_PAGE_MODE_USE_ATTACHMENTS
+} PopplerPageMode;
+
+/**
+ * PopplerFontType:
+ * @POPPLER_FONT_TYPE_UNKNOWN: unknown font type
+ * @POPPLER_FONT_TYPE_TYPE1: Type 1 font type
+ * @POPPLER_FONT_TYPE_TYPE1C: Type 1 font type embedded in Compact Font Format (CFF) font program
+ * @POPPLER_FONT_TYPE_TYPE1COT: Type 1 font type embedded in OpenType font program
+ * @POPPLER_FONT_TYPE_TYPE3: A font type that is defined with PDF graphics operators
+ * @POPPLER_FONT_TYPE_TRUETYPE: TrueType font type
+ * @POPPLER_FONT_TYPE_TRUETYPEOT: TrueType font type embedded in OpenType font program
+ * @POPPLER_FONT_TYPE_CID_TYPE0: CIDFont type based on Type 1 font technology
+ * @POPPLER_FONT_TYPE_CID_TYPE0C: CIDFont type based on Type 1 font technology embedded in CFF font program
+ * @POPPLER_FONT_TYPE_CID_TYPE0COT: CIDFont type based on Type 1 font technology embedded in OpenType font program
+ * @POPPLER_FONT_TYPE_CID_TYPE2: CIDFont type based on TrueType font technology
+ * @POPPLER_FONT_TYPE_CID_TYPE2OT: CIDFont type based on TrueType font technology embedded in OpenType font program
+ *
+ * Font types
+ */
+typedef enum
+{
+  POPPLER_FONT_TYPE_UNKNOWN,
+  POPPLER_FONT_TYPE_TYPE1,
+  POPPLER_FONT_TYPE_TYPE1C,
+  POPPLER_FONT_TYPE_TYPE1COT,
+  POPPLER_FONT_TYPE_TYPE3,
+  POPPLER_FONT_TYPE_TRUETYPE,
+  POPPLER_FONT_TYPE_TRUETYPEOT,
+  POPPLER_FONT_TYPE_CID_TYPE0,
+  POPPLER_FONT_TYPE_CID_TYPE0C,
+  POPPLER_FONT_TYPE_CID_TYPE0COT,
+  POPPLER_FONT_TYPE_CID_TYPE2,
+  POPPLER_FONT_TYPE_CID_TYPE2OT
+} PopplerFontType;
+
+/**
+ * PopplerViewerPreferences:
+ * @POPPLER_VIEWER_PREFERENCES_UNSET: no preferences set
+ * @POPPLER_VIEWER_PREFERENCES_HIDE_TOOLBAR: hider toolbars when document is active
+ * @POPPLER_VIEWER_PREFERENCES_HIDE_MENUBAR: hide menu bar when document is active
+ * @POPPLER_VIEWER_PREFERENCES_HIDE_WINDOWUI: hide UI elements in document's window
+ * @POPPLER_VIEWER_PREFERENCES_FIT_WINDOW: resize document's window to fit the size of the first displayed page
+ * @POPPLER_VIEWER_PREFERENCES_CENTER_WINDOW: position the document's window in the center of the screen
+ * @POPPLER_VIEWER_PREFERENCES_DISPLAY_DOC_TITLE: display document title in window's title bar
+ * @POPPLER_VIEWER_PREFERENCES_DIRECTION_RTL: the predominant reading order for text is right to left
+ *
+ * Viewer preferences
+ */
+typedef enum /*< flags >*/
+{
+  POPPLER_VIEWER_PREFERENCES_UNSET = 0,
+  POPPLER_VIEWER_PREFERENCES_HIDE_TOOLBAR = 1 << 0,
+  POPPLER_VIEWER_PREFERENCES_HIDE_MENUBAR = 1 << 1,
+  POPPLER_VIEWER_PREFERENCES_HIDE_WINDOWUI = 1 << 2,
+  POPPLER_VIEWER_PREFERENCES_FIT_WINDOW = 1 << 3,
+  POPPLER_VIEWER_PREFERENCES_CENTER_WINDOW = 1 << 4,
+  POPPLER_VIEWER_PREFERENCES_DISPLAY_DOC_TITLE = 1 << 5,
+  POPPLER_VIEWER_PREFERENCES_DIRECTION_RTL = 1 << 6
+} PopplerViewerPreferences;
+
+/**
+ * PopplerPermissions:
+ * @POPPLER_PERMISSIONS_OK_TO_PRINT: document can be printer
+ * @POPPLER_PERMISSIONS_OK_TO_MODIFY: document contents can be modified
+ * @POPPLER_PERMISSIONS_OK_TO_COPY: document can be copied
+ * @POPPLER_PERMISSIONS_OK_TO_ADD_NOTES: annotations can added to the document
+ * @POPPLER_PERMISSIONS_OK_TO_FILL_FORM: interactive form fields can be filled in
+ * @POPPLER_PERMISSIONS_OK_TO_EXTRACT_CONTENTS: extract text and graphics
+ * (in support of accessibility to users with disabilities or for other purposes). Since 0.18
+ * @POPPLER_PERMISSIONS_OK_TO_ASSEMBLE: assemble the document (insert, rotate, or delete pages and create
+ * bookmarks or thumbnail images). Since 0.18
+ * @POPPLER_PERMISSIONS_OK_TO_PRINT_HIGH_RESOLUTION: document can be printer at high resolution. Since 0.18
+ * @POPPLER_PERMISSIONS_FULL: document permits all operations
+ *
+ * Permissions
+ */
+typedef enum /*< flags >*/
+{
+  POPPLER_PERMISSIONS_OK_TO_PRINT = 1 << 0,
+  POPPLER_PERMISSIONS_OK_TO_MODIFY = 1 << 1,
+  POPPLER_PERMISSIONS_OK_TO_COPY = 1 << 2,
+  POPPLER_PERMISSIONS_OK_TO_ADD_NOTES = 1 << 3,
+  POPPLER_PERMISSIONS_OK_TO_FILL_FORM = 1 << 4,
+  POPPLER_PERMISSIONS_OK_TO_EXTRACT_CONTENTS = 1 << 5,
+  POPPLER_PERMISSIONS_OK_TO_ASSEMBLE = 1 << 6,
+  POPPLER_PERMISSIONS_OK_TO_PRINT_HIGH_RESOLUTION = 1 << 7,
+  POPPLER_PERMISSIONS_FULL = (POPPLER_PERMISSIONS_OK_TO_PRINT | POPPLER_PERMISSIONS_OK_TO_MODIFY | POPPLER_PERMISSIONS_OK_TO_COPY | POPPLER_PERMISSIONS_OK_TO_ADD_NOTES | POPPLER_PERMISSIONS_OK_TO_FILL_FORM | POPPLER_PERMISSIONS_OK_TO_EXTRACT_CONTENTS | POPPLER_PERMISSIONS_OK_TO_ASSEMBLE | POPPLER_PERMISSIONS_OK_TO_PRINT_HIGH_RESOLUTION)
+
+} PopplerPermissions;
+
+
+
+GType              poppler_document_get_type               (void) G_GNUC_CONST;
+PopplerDocument   *poppler_document_new_from_file          (const char      *uri,
+                                                           const char      *password,
+                                                           GError         **error);
+PopplerDocument   *poppler_document_new_from_data          (char            *data,
+                                                           int              length,
+                                                           const char      *password,
+                                                           GError         **error);
+gboolean           poppler_document_save                   (PopplerDocument *document,
+                                                           const char      *uri,
+                                                           GError         **error);
+gboolean           poppler_document_save_a_copy            (PopplerDocument *document,
+                                                           const char      *uri,
+                                                           GError         **error);
+gboolean           poppler_document_get_id                 (PopplerDocument *document,
+                                                           gchar          **permanent_id,
+                                                           gchar          **update_id);
+int                poppler_document_get_n_pages            (PopplerDocument *document);
+PopplerPage       *poppler_document_get_page               (PopplerDocument *document,
+                                                           int              index);
+PopplerPage       *poppler_document_get_page_by_label      (PopplerDocument *document,
+                                                           const char      *label);
+gchar             *poppler_document_get_pdf_version_string (PopplerDocument *document);
+void               poppler_document_get_pdf_version        (PopplerDocument *document,
+                                                           guint           *major_version,
+                                                           guint           *minor_version);
+gchar             *poppler_document_get_title              (PopplerDocument *document);
+gchar             *poppler_document_get_author             (PopplerDocument *document);
+gchar             *poppler_document_get_subject            (PopplerDocument *document);
+gchar             *poppler_document_get_keywords           (PopplerDocument *document);
+gchar             *poppler_document_get_creator            (PopplerDocument *document);
+gchar             *poppler_document_get_producer           (PopplerDocument *document);
+time_t             poppler_document_get_creation_date      (PopplerDocument *document);
+time_t             poppler_document_get_modification_date  (PopplerDocument *document);
+gboolean           poppler_document_is_linearized          (PopplerDocument *document);
+PopplerPageLayout  poppler_document_get_page_layout        (PopplerDocument *document);
+PopplerPageMode    poppler_document_get_page_mode          (PopplerDocument *document);
+PopplerPermissions poppler_document_get_permissions        (PopplerDocument *document);
+gchar             *poppler_document_get_metadata           (PopplerDocument *document);
+
+/* Attachments */
+guint              poppler_document_get_n_attachments      (PopplerDocument  *document);
+gboolean           poppler_document_has_attachments        (PopplerDocument  *document);
+GList             *poppler_document_get_attachments        (PopplerDocument  *document);
+
+/* Links */
+PopplerDest       *poppler_document_find_dest              (PopplerDocument  *document,
+                                                           const gchar      *link_name);
+
+/* Form */
+PopplerFormField  *poppler_document_get_form_field         (PopplerDocument  *document,
+                                                           gint              id);
+
+/* Interface for getting the Index of a poppler_document */
+#define POPPLER_TYPE_INDEX_ITER                 (poppler_index_iter_get_type ())
+GType             poppler_index_iter_get_type   (void) G_GNUC_CONST;
+PopplerIndexIter *poppler_index_iter_new        (PopplerDocument   *document);
+PopplerIndexIter *poppler_index_iter_copy       (PopplerIndexIter  *iter);
+void              poppler_index_iter_free       (PopplerIndexIter  *iter);
+
+PopplerIndexIter *poppler_index_iter_get_child  (PopplerIndexIter  *parent);
+gboolean         poppler_index_iter_is_open    (PopplerIndexIter  *iter);
+PopplerAction    *poppler_index_iter_get_action (PopplerIndexIter  *iter);
+gboolean          poppler_index_iter_next       (PopplerIndexIter  *iter);
+
+/* Interface for getting the Fonts of a poppler_document */
+#define POPPLER_TYPE_FONT_INFO             (poppler_font_info_get_type ())
+#define POPPLER_FONT_INFO(obj)             (G_TYPE_CHECK_INSTANCE_CAST ((obj), POPPLER_TYPE_FONT_INFO, PopplerFontInfo))
+#define POPPLER_IS_FONT_INFO(obj)          (G_TYPE_CHECK_INSTANCE_TYPE ((obj), POPPLER_TYPE_FONT_INFO))
+GType             poppler_font_info_get_type       (void) G_GNUC_CONST;
+PopplerFontInfo  *poppler_font_info_new            (PopplerDocument   *document);
+gboolean          poppler_font_info_scan           (PopplerFontInfo   *font_info,
+                                                   int                n_pages,
+                                                   PopplerFontsIter **iter);
+void             poppler_font_info_free            (PopplerFontInfo   *font_info);
+
+#define POPPLER_TYPE_FONTS_ITER                    (poppler_fonts_iter_get_type ())
+GType             poppler_fonts_iter_get_type      (void) G_GNUC_CONST;
+PopplerFontsIter *poppler_fonts_iter_copy          (PopplerFontsIter  *iter);
+void              poppler_fonts_iter_free          (PopplerFontsIter  *iter);
+const char       *poppler_fonts_iter_get_name      (PopplerFontsIter  *iter);
+const char       *poppler_fonts_iter_get_full_name (PopplerFontsIter  *iter);
+const char       *poppler_fonts_iter_get_substitute_name (PopplerFontsIter *iter);
+const char       *poppler_fonts_iter_get_file_name (PopplerFontsIter  *iter);
+PopplerFontType   poppler_fonts_iter_get_font_type (PopplerFontsIter  *iter);
+const char       *poppler_fonts_iter_get_encoding  (PopplerFontsIter *iter);
+gboolean         poppler_fonts_iter_is_embedded   (PopplerFontsIter  *iter);
+gboolean         poppler_fonts_iter_is_subset     (PopplerFontsIter  *iter);
+gboolean          poppler_fonts_iter_next          (PopplerFontsIter  *iter);
+
+/* Interface for getting the Layers of a poppler_document */
+#define POPPLER_TYPE_LAYERS_ITER                   (poppler_layers_iter_get_type ())
+GType              poppler_layers_iter_get_type    (void) G_GNUC_CONST;
+PopplerLayersIter *poppler_layers_iter_new         (PopplerDocument   *document);
+PopplerLayersIter *poppler_layers_iter_copy        (PopplerLayersIter *iter);
+void               poppler_layers_iter_free        (PopplerLayersIter *iter);
+
+PopplerLayersIter *poppler_layers_iter_get_child   (PopplerLayersIter *parent);
+gchar             *poppler_layers_iter_get_title   (PopplerLayersIter *iter);
+PopplerLayer      *poppler_layers_iter_get_layer   (PopplerLayersIter *iter);
+gboolean           poppler_layers_iter_next        (PopplerLayersIter *iter);
+
+/* Export to ps */
+#define POPPLER_TYPE_PS_FILE             (poppler_ps_file_get_type ())
+#define POPPLER_PS_FILE(obj)             (G_TYPE_CHECK_INSTANCE_CAST ((obj), POPPLER_TYPE_PS_FILE, PopplerPSFile))
+#define POPPLER_IS_PS_FILE(obj)          (G_TYPE_CHECK_INSTANCE_TYPE ((obj), POPPLER_TYPE_PS_FILE))
+GType          poppler_ps_file_get_type       (void) G_GNUC_CONST;
+PopplerPSFile *poppler_ps_file_new            (PopplerDocument *document,
+                                               const char      *filename,
+                                               int              first_page,
+                                               int              n_pages);
+void           poppler_ps_file_set_paper_size (PopplerPSFile   *ps_file,
+                                               double           width,
+                                               double           height);
+void           poppler_ps_file_set_duplex     (PopplerPSFile   *ps_file,
+                                               gboolean         duplex);
+void           poppler_ps_file_free           (PopplerPSFile   *ps_file);
+
+
+
+G_END_DECLS
+
+#endif /* __POPPLER_DOCUMENT_H__ */
diff --git a/glib/poppler-enums.c b/glib/poppler-enums.c
new file mode 100644 (file)
index 0000000..2c5dbe5
--- /dev/null
@@ -0,0 +1,678 @@
+
+/* Generated data (by glib-mkenums) */
+
+#include <config.h>
+
+#include "poppler-enums.h"
+
+/* enumerations from "poppler-action.h" */
+#include "poppler-action.h"
+GType
+poppler_action_type_get_type (void)
+{
+  static volatile gsize g_define_type_id__volatile = 0;
+  if (g_once_init_enter (&g_define_type_id__volatile)) {
+    static const GEnumValue values[] = {
+      { POPPLER_ACTION_UNKNOWN, "POPPLER_ACTION_UNKNOWN", "unknown" },
+      { POPPLER_ACTION_NONE, "POPPLER_ACTION_NONE", "none" },
+      { POPPLER_ACTION_GOTO_DEST, "POPPLER_ACTION_GOTO_DEST", "goto-dest" },
+      { POPPLER_ACTION_GOTO_REMOTE, "POPPLER_ACTION_GOTO_REMOTE", "goto-remote" },
+      { POPPLER_ACTION_LAUNCH, "POPPLER_ACTION_LAUNCH", "launch" },
+      { POPPLER_ACTION_URI, "POPPLER_ACTION_URI", "uri" },
+      { POPPLER_ACTION_NAMED, "POPPLER_ACTION_NAMED", "named" },
+      { POPPLER_ACTION_MOVIE, "POPPLER_ACTION_MOVIE", "movie" },
+      { POPPLER_ACTION_RENDITION, "POPPLER_ACTION_RENDITION", "rendition" },
+      { POPPLER_ACTION_OCG_STATE, "POPPLER_ACTION_OCG_STATE", "ocg-state" },
+      { POPPLER_ACTION_JAVASCRIPT, "POPPLER_ACTION_JAVASCRIPT", "javascript" },
+      { 0, NULL, NULL }
+    };
+    GType g_define_type_id = 
+       g_enum_register_static (g_intern_static_string ("PopplerActionType"), values);
+      
+    g_once_init_leave (&g_define_type_id__volatile, g_define_type_id);
+  }
+    
+  return g_define_type_id__volatile;
+}
+
+GType
+poppler_dest_type_get_type (void)
+{
+  static volatile gsize g_define_type_id__volatile = 0;
+  if (g_once_init_enter (&g_define_type_id__volatile)) {
+    static const GEnumValue values[] = {
+      { POPPLER_DEST_UNKNOWN, "POPPLER_DEST_UNKNOWN", "unknown" },
+      { POPPLER_DEST_XYZ, "POPPLER_DEST_XYZ", "xyz" },
+      { POPPLER_DEST_FIT, "POPPLER_DEST_FIT", "fit" },
+      { POPPLER_DEST_FITH, "POPPLER_DEST_FITH", "fith" },
+      { POPPLER_DEST_FITV, "POPPLER_DEST_FITV", "fitv" },
+      { POPPLER_DEST_FITR, "POPPLER_DEST_FITR", "fitr" },
+      { POPPLER_DEST_FITB, "POPPLER_DEST_FITB", "fitb" },
+      { POPPLER_DEST_FITBH, "POPPLER_DEST_FITBH", "fitbh" },
+      { POPPLER_DEST_FITBV, "POPPLER_DEST_FITBV", "fitbv" },
+      { POPPLER_DEST_NAMED, "POPPLER_DEST_NAMED", "named" },
+      { 0, NULL, NULL }
+    };
+    GType g_define_type_id = 
+       g_enum_register_static (g_intern_static_string ("PopplerDestType"), values);
+      
+    g_once_init_leave (&g_define_type_id__volatile, g_define_type_id);
+  }
+    
+  return g_define_type_id__volatile;
+}
+
+GType
+poppler_action_movie_operation_get_type (void)
+{
+  static volatile gsize g_define_type_id__volatile = 0;
+  if (g_once_init_enter (&g_define_type_id__volatile)) {
+    static const GEnumValue values[] = {
+      { POPPLER_ACTION_MOVIE_PLAY, "POPPLER_ACTION_MOVIE_PLAY", "play" },
+      { POPPLER_ACTION_MOVIE_PAUSE, "POPPLER_ACTION_MOVIE_PAUSE", "pause" },
+      { POPPLER_ACTION_MOVIE_RESUME, "POPPLER_ACTION_MOVIE_RESUME", "resume" },
+      { POPPLER_ACTION_MOVIE_STOP, "POPPLER_ACTION_MOVIE_STOP", "stop" },
+      { 0, NULL, NULL }
+    };
+    GType g_define_type_id = 
+       g_enum_register_static (g_intern_static_string ("PopplerActionMovieOperation"), values);
+      
+    g_once_init_leave (&g_define_type_id__volatile, g_define_type_id);
+  }
+    
+  return g_define_type_id__volatile;
+}
+
+GType
+poppler_action_layer_action_get_type (void)
+{
+  static volatile gsize g_define_type_id__volatile = 0;
+  if (g_once_init_enter (&g_define_type_id__volatile)) {
+    static const GEnumValue values[] = {
+      { POPPLER_ACTION_LAYER_ON, "POPPLER_ACTION_LAYER_ON", "on" },
+      { POPPLER_ACTION_LAYER_OFF, "POPPLER_ACTION_LAYER_OFF", "off" },
+      { POPPLER_ACTION_LAYER_TOGGLE, "POPPLER_ACTION_LAYER_TOGGLE", "toggle" },
+      { 0, NULL, NULL }
+    };
+    GType g_define_type_id = 
+       g_enum_register_static (g_intern_static_string ("PopplerActionLayerAction"), values);
+      
+    g_once_init_leave (&g_define_type_id__volatile, g_define_type_id);
+  }
+    
+  return g_define_type_id__volatile;
+}
+
+/* enumerations from "poppler-document.h" */
+#include "poppler-document.h"
+GType
+poppler_page_layout_get_type (void)
+{
+  static volatile gsize g_define_type_id__volatile = 0;
+  if (g_once_init_enter (&g_define_type_id__volatile)) {
+    static const GEnumValue values[] = {
+      { POPPLER_PAGE_LAYOUT_UNSET, "POPPLER_PAGE_LAYOUT_UNSET", "unset" },
+      { POPPLER_PAGE_LAYOUT_SINGLE_PAGE, "POPPLER_PAGE_LAYOUT_SINGLE_PAGE", "single-page" },
+      { POPPLER_PAGE_LAYOUT_ONE_COLUMN, "POPPLER_PAGE_LAYOUT_ONE_COLUMN", "one-column" },
+      { POPPLER_PAGE_LAYOUT_TWO_COLUMN_LEFT, "POPPLER_PAGE_LAYOUT_TWO_COLUMN_LEFT", "two-column-left" },
+      { POPPLER_PAGE_LAYOUT_TWO_COLUMN_RIGHT, "POPPLER_PAGE_LAYOUT_TWO_COLUMN_RIGHT", "two-column-right" },
+      { POPPLER_PAGE_LAYOUT_TWO_PAGE_LEFT, "POPPLER_PAGE_LAYOUT_TWO_PAGE_LEFT", "two-page-left" },
+      { POPPLER_PAGE_LAYOUT_TWO_PAGE_RIGHT, "POPPLER_PAGE_LAYOUT_TWO_PAGE_RIGHT", "two-page-right" },
+      { 0, NULL, NULL }
+    };
+    GType g_define_type_id = 
+       g_enum_register_static (g_intern_static_string ("PopplerPageLayout"), values);
+      
+    g_once_init_leave (&g_define_type_id__volatile, g_define_type_id);
+  }
+    
+  return g_define_type_id__volatile;
+}
+
+GType
+poppler_page_mode_get_type (void)
+{
+  static volatile gsize g_define_type_id__volatile = 0;
+  if (g_once_init_enter (&g_define_type_id__volatile)) {
+    static const GEnumValue values[] = {
+      { POPPLER_PAGE_MODE_UNSET, "POPPLER_PAGE_MODE_UNSET", "unset" },
+      { POPPLER_PAGE_MODE_NONE, "POPPLER_PAGE_MODE_NONE", "none" },
+      { POPPLER_PAGE_MODE_USE_OUTLINES, "POPPLER_PAGE_MODE_USE_OUTLINES", "use-outlines" },
+      { POPPLER_PAGE_MODE_USE_THUMBS, "POPPLER_PAGE_MODE_USE_THUMBS", "use-thumbs" },
+      { POPPLER_PAGE_MODE_FULL_SCREEN, "POPPLER_PAGE_MODE_FULL_SCREEN", "full-screen" },
+      { POPPLER_PAGE_MODE_USE_OC, "POPPLER_PAGE_MODE_USE_OC", "use-oc" },
+      { POPPLER_PAGE_MODE_USE_ATTACHMENTS, "POPPLER_PAGE_MODE_USE_ATTACHMENTS", "use-attachments" },
+      { 0, NULL, NULL }
+    };
+    GType g_define_type_id = 
+       g_enum_register_static (g_intern_static_string ("PopplerPageMode"), values);
+      
+    g_once_init_leave (&g_define_type_id__volatile, g_define_type_id);
+  }
+    
+  return g_define_type_id__volatile;
+}
+
+GType
+poppler_font_type_get_type (void)
+{
+  static volatile gsize g_define_type_id__volatile = 0;
+  if (g_once_init_enter (&g_define_type_id__volatile)) {
+    static const GEnumValue values[] = {
+      { POPPLER_FONT_TYPE_UNKNOWN, "POPPLER_FONT_TYPE_UNKNOWN", "unknown" },
+      { POPPLER_FONT_TYPE_TYPE1, "POPPLER_FONT_TYPE_TYPE1", "type1" },
+      { POPPLER_FONT_TYPE_TYPE1C, "POPPLER_FONT_TYPE_TYPE1C", "type1c" },
+      { POPPLER_FONT_TYPE_TYPE1COT, "POPPLER_FONT_TYPE_TYPE1COT", "type1cot" },
+      { POPPLER_FONT_TYPE_TYPE3, "POPPLER_FONT_TYPE_TYPE3", "type3" },
+      { POPPLER_FONT_TYPE_TRUETYPE, "POPPLER_FONT_TYPE_TRUETYPE", "truetype" },
+      { POPPLER_FONT_TYPE_TRUETYPEOT, "POPPLER_FONT_TYPE_TRUETYPEOT", "truetypeot" },
+      { POPPLER_FONT_TYPE_CID_TYPE0, "POPPLER_FONT_TYPE_CID_TYPE0", "cid-type0" },
+      { POPPLER_FONT_TYPE_CID_TYPE0C, "POPPLER_FONT_TYPE_CID_TYPE0C", "cid-type0c" },
+      { POPPLER_FONT_TYPE_CID_TYPE0COT, "POPPLER_FONT_TYPE_CID_TYPE0COT", "cid-type0cot" },
+      { POPPLER_FONT_TYPE_CID_TYPE2, "POPPLER_FONT_TYPE_CID_TYPE2", "cid-type2" },
+      { POPPLER_FONT_TYPE_CID_TYPE2OT, "POPPLER_FONT_TYPE_CID_TYPE2OT", "cid-type2ot" },
+      { 0, NULL, NULL }
+    };
+    GType g_define_type_id = 
+       g_enum_register_static (g_intern_static_string ("PopplerFontType"), values);
+      
+    g_once_init_leave (&g_define_type_id__volatile, g_define_type_id);
+  }
+    
+  return g_define_type_id__volatile;
+}
+
+GType
+poppler_viewer_preferences_get_type (void)
+{
+  static volatile gsize g_define_type_id__volatile = 0;
+  if (g_once_init_enter (&g_define_type_id__volatile)) {
+    static const GFlagsValue values[] = {
+      { POPPLER_VIEWER_PREFERENCES_UNSET, "POPPLER_VIEWER_PREFERENCES_UNSET", "unset" },
+      { POPPLER_VIEWER_PREFERENCES_HIDE_TOOLBAR, "POPPLER_VIEWER_PREFERENCES_HIDE_TOOLBAR", "hide-toolbar" },
+      { POPPLER_VIEWER_PREFERENCES_HIDE_MENUBAR, "POPPLER_VIEWER_PREFERENCES_HIDE_MENUBAR", "hide-menubar" },
+      { POPPLER_VIEWER_PREFERENCES_HIDE_WINDOWUI, "POPPLER_VIEWER_PREFERENCES_HIDE_WINDOWUI", "hide-windowui" },
+      { POPPLER_VIEWER_PREFERENCES_FIT_WINDOW, "POPPLER_VIEWER_PREFERENCES_FIT_WINDOW", "fit-window" },
+      { POPPLER_VIEWER_PREFERENCES_CENTER_WINDOW, "POPPLER_VIEWER_PREFERENCES_CENTER_WINDOW", "center-window" },
+      { POPPLER_VIEWER_PREFERENCES_DISPLAY_DOC_TITLE, "POPPLER_VIEWER_PREFERENCES_DISPLAY_DOC_TITLE", "display-doc-title" },
+      { POPPLER_VIEWER_PREFERENCES_DIRECTION_RTL, "POPPLER_VIEWER_PREFERENCES_DIRECTION_RTL", "direction-rtl" },
+      { 0, NULL, NULL }
+    };
+    GType g_define_type_id = 
+       g_flags_register_static (g_intern_static_string ("PopplerViewerPreferences"), values);
+      
+    g_once_init_leave (&g_define_type_id__volatile, g_define_type_id);
+  }
+    
+  return g_define_type_id__volatile;
+}
+
+GType
+poppler_permissions_get_type (void)
+{
+  static volatile gsize g_define_type_id__volatile = 0;
+  if (g_once_init_enter (&g_define_type_id__volatile)) {
+    static const GFlagsValue values[] = {
+      { POPPLER_PERMISSIONS_OK_TO_PRINT, "POPPLER_PERMISSIONS_OK_TO_PRINT", "ok-to-print" },
+      { POPPLER_PERMISSIONS_OK_TO_MODIFY, "POPPLER_PERMISSIONS_OK_TO_MODIFY", "ok-to-modify" },
+      { POPPLER_PERMISSIONS_OK_TO_COPY, "POPPLER_PERMISSIONS_OK_TO_COPY", "ok-to-copy" },
+      { POPPLER_PERMISSIONS_OK_TO_ADD_NOTES, "POPPLER_PERMISSIONS_OK_TO_ADD_NOTES", "ok-to-add-notes" },
+      { POPPLER_PERMISSIONS_OK_TO_FILL_FORM, "POPPLER_PERMISSIONS_OK_TO_FILL_FORM", "ok-to-fill-form" },
+      { POPPLER_PERMISSIONS_OK_TO_EXTRACT_CONTENTS, "POPPLER_PERMISSIONS_OK_TO_EXTRACT_CONTENTS", "ok-to-extract-contents" },
+      { POPPLER_PERMISSIONS_OK_TO_ASSEMBLE, "POPPLER_PERMISSIONS_OK_TO_ASSEMBLE", "ok-to-assemble" },
+      { POPPLER_PERMISSIONS_OK_TO_PRINT_HIGH_RESOLUTION, "POPPLER_PERMISSIONS_OK_TO_PRINT_HIGH_RESOLUTION", "ok-to-print-high-resolution" },
+      { POPPLER_PERMISSIONS_FULL, "POPPLER_PERMISSIONS_FULL", "full" },
+      { 0, NULL, NULL }
+    };
+    GType g_define_type_id = 
+       g_flags_register_static (g_intern_static_string ("PopplerPermissions"), values);
+      
+    g_once_init_leave (&g_define_type_id__volatile, g_define_type_id);
+  }
+    
+  return g_define_type_id__volatile;
+}
+
+/* enumerations from "poppler-form-field.h" */
+#include "poppler-form-field.h"
+GType
+poppler_form_field_type_get_type (void)
+{
+  static volatile gsize g_define_type_id__volatile = 0;
+  if (g_once_init_enter (&g_define_type_id__volatile)) {
+    static const GEnumValue values[] = {
+      { POPPLER_FORM_FIELD_UNKNOWN, "POPPLER_FORM_FIELD_UNKNOWN", "unknown" },
+      { POPPLER_FORM_FIELD_BUTTON, "POPPLER_FORM_FIELD_BUTTON", "button" },
+      { POPPLER_FORM_FIELD_TEXT, "POPPLER_FORM_FIELD_TEXT", "text" },
+      { POPPLER_FORM_FIELD_CHOICE, "POPPLER_FORM_FIELD_CHOICE", "choice" },
+      { POPPLER_FORM_FIELD_SIGNATURE, "POPPLER_FORM_FIELD_SIGNATURE", "signature" },
+      { 0, NULL, NULL }
+    };
+    GType g_define_type_id = 
+       g_enum_register_static (g_intern_static_string ("PopplerFormFieldType"), values);
+      
+    g_once_init_leave (&g_define_type_id__volatile, g_define_type_id);
+  }
+    
+  return g_define_type_id__volatile;
+}
+
+GType
+poppler_form_button_type_get_type (void)
+{
+  static volatile gsize g_define_type_id__volatile = 0;
+  if (g_once_init_enter (&g_define_type_id__volatile)) {
+    static const GEnumValue values[] = {
+      { POPPLER_FORM_BUTTON_PUSH, "POPPLER_FORM_BUTTON_PUSH", "push" },
+      { POPPLER_FORM_BUTTON_CHECK, "POPPLER_FORM_BUTTON_CHECK", "check" },
+      { POPPLER_FORM_BUTTON_RADIO, "POPPLER_FORM_BUTTON_RADIO", "radio" },
+      { 0, NULL, NULL }
+    };
+    GType g_define_type_id = 
+       g_enum_register_static (g_intern_static_string ("PopplerFormButtonType"), values);
+      
+    g_once_init_leave (&g_define_type_id__volatile, g_define_type_id);
+  }
+    
+  return g_define_type_id__volatile;
+}
+
+GType
+poppler_form_text_type_get_type (void)
+{
+  static volatile gsize g_define_type_id__volatile = 0;
+  if (g_once_init_enter (&g_define_type_id__volatile)) {
+    static const GEnumValue values[] = {
+      { POPPLER_FORM_TEXT_NORMAL, "POPPLER_FORM_TEXT_NORMAL", "normal" },
+      { POPPLER_FORM_TEXT_MULTILINE, "POPPLER_FORM_TEXT_MULTILINE", "multiline" },
+      { POPPLER_FORM_TEXT_FILE_SELECT, "POPPLER_FORM_TEXT_FILE_SELECT", "file-select" },
+      { 0, NULL, NULL }
+    };
+    GType g_define_type_id = 
+       g_enum_register_static (g_intern_static_string ("PopplerFormTextType"), values);
+      
+    g_once_init_leave (&g_define_type_id__volatile, g_define_type_id);
+  }
+    
+  return g_define_type_id__volatile;
+}
+
+GType
+poppler_form_choice_type_get_type (void)
+{
+  static volatile gsize g_define_type_id__volatile = 0;
+  if (g_once_init_enter (&g_define_type_id__volatile)) {
+    static const GEnumValue values[] = {
+      { POPPLER_FORM_CHOICE_COMBO, "POPPLER_FORM_CHOICE_COMBO", "combo" },
+      { POPPLER_FORM_CHOICE_LIST, "POPPLER_FORM_CHOICE_LIST", "list" },
+      { 0, NULL, NULL }
+    };
+    GType g_define_type_id = 
+       g_enum_register_static (g_intern_static_string ("PopplerFormChoiceType"), values);
+      
+    g_once_init_leave (&g_define_type_id__volatile, g_define_type_id);
+  }
+    
+  return g_define_type_id__volatile;
+}
+
+/* enumerations from "poppler-annot.h" */
+#include "poppler-annot.h"
+GType
+poppler_annot_type_get_type (void)
+{
+  static volatile gsize g_define_type_id__volatile = 0;
+  if (g_once_init_enter (&g_define_type_id__volatile)) {
+    static const GEnumValue values[] = {
+      { POPPLER_ANNOT_UNKNOWN, "POPPLER_ANNOT_UNKNOWN", "unknown" },
+      { POPPLER_ANNOT_TEXT, "POPPLER_ANNOT_TEXT", "text" },
+      { POPPLER_ANNOT_LINK, "POPPLER_ANNOT_LINK", "link" },
+      { POPPLER_ANNOT_FREE_TEXT, "POPPLER_ANNOT_FREE_TEXT", "free-text" },
+      { POPPLER_ANNOT_LINE, "POPPLER_ANNOT_LINE", "line" },
+      { POPPLER_ANNOT_SQUARE, "POPPLER_ANNOT_SQUARE", "square" },
+      { POPPLER_ANNOT_CIRCLE, "POPPLER_ANNOT_CIRCLE", "circle" },
+      { POPPLER_ANNOT_POLYGON, "POPPLER_ANNOT_POLYGON", "polygon" },
+      { POPPLER_ANNOT_POLY_LINE, "POPPLER_ANNOT_POLY_LINE", "poly-line" },
+      { POPPLER_ANNOT_HIGHLIGHT, "POPPLER_ANNOT_HIGHLIGHT", "highlight" },
+      { POPPLER_ANNOT_UNDERLINE, "POPPLER_ANNOT_UNDERLINE", "underline" },
+      { POPPLER_ANNOT_SQUIGGLY, "POPPLER_ANNOT_SQUIGGLY", "squiggly" },
+      { POPPLER_ANNOT_STRIKE_OUT, "POPPLER_ANNOT_STRIKE_OUT", "strike-out" },
+      { POPPLER_ANNOT_STAMP, "POPPLER_ANNOT_STAMP", "stamp" },
+      { POPPLER_ANNOT_CARET, "POPPLER_ANNOT_CARET", "caret" },
+      { POPPLER_ANNOT_INK, "POPPLER_ANNOT_INK", "ink" },
+      { POPPLER_ANNOT_POPUP, "POPPLER_ANNOT_POPUP", "popup" },
+      { POPPLER_ANNOT_FILE_ATTACHMENT, "POPPLER_ANNOT_FILE_ATTACHMENT", "file-attachment" },
+      { POPPLER_ANNOT_SOUND, "POPPLER_ANNOT_SOUND", "sound" },
+      { POPPLER_ANNOT_MOVIE, "POPPLER_ANNOT_MOVIE", "movie" },
+      { POPPLER_ANNOT_WIDGET, "POPPLER_ANNOT_WIDGET", "widget" },
+      { POPPLER_ANNOT_SCREEN, "POPPLER_ANNOT_SCREEN", "screen" },
+      { POPPLER_ANNOT_PRINTER_MARK, "POPPLER_ANNOT_PRINTER_MARK", "printer-mark" },
+      { POPPLER_ANNOT_TRAP_NET, "POPPLER_ANNOT_TRAP_NET", "trap-net" },
+      { POPPLER_ANNOT_WATERMARK, "POPPLER_ANNOT_WATERMARK", "watermark" },
+      { POPPLER_ANNOT_3D, "POPPLER_ANNOT_3D", "3d" },
+      { 0, NULL, NULL }
+    };
+    GType g_define_type_id = 
+       g_enum_register_static (g_intern_static_string ("PopplerAnnotType"), values);
+      
+    g_once_init_leave (&g_define_type_id__volatile, g_define_type_id);
+  }
+    
+  return g_define_type_id__volatile;
+}
+
+GType
+poppler_annot_flag_get_type (void)
+{
+  static volatile gsize g_define_type_id__volatile = 0;
+  if (g_once_init_enter (&g_define_type_id__volatile)) {
+    static const GFlagsValue values[] = {
+      { POPPLER_ANNOT_FLAG_UNKNOWN, "POPPLER_ANNOT_FLAG_UNKNOWN", "unknown" },
+      { POPPLER_ANNOT_FLAG_INVISIBLE, "POPPLER_ANNOT_FLAG_INVISIBLE", "invisible" },
+      { POPPLER_ANNOT_FLAG_HIDDEN, "POPPLER_ANNOT_FLAG_HIDDEN", "hidden" },
+      { POPPLER_ANNOT_FLAG_PRINT, "POPPLER_ANNOT_FLAG_PRINT", "print" },
+      { POPPLER_ANNOT_FLAG_NO_ZOOM, "POPPLER_ANNOT_FLAG_NO_ZOOM", "no-zoom" },
+      { POPPLER_ANNOT_FLAG_NO_ROTATE, "POPPLER_ANNOT_FLAG_NO_ROTATE", "no-rotate" },
+      { POPPLER_ANNOT_FLAG_NO_VIEW, "POPPLER_ANNOT_FLAG_NO_VIEW", "no-view" },
+      { POPPLER_ANNOT_FLAG_READ_ONLY, "POPPLER_ANNOT_FLAG_READ_ONLY", "read-only" },
+      { POPPLER_ANNOT_FLAG_LOCKED, "POPPLER_ANNOT_FLAG_LOCKED", "locked" },
+      { POPPLER_ANNOT_FLAG_TOGGLE_NO_VIEW, "POPPLER_ANNOT_FLAG_TOGGLE_NO_VIEW", "toggle-no-view" },
+      { POPPLER_ANNOT_FLAG_LOCKED_CONTENTS, "POPPLER_ANNOT_FLAG_LOCKED_CONTENTS", "locked-contents" },
+      { 0, NULL, NULL }
+    };
+    GType g_define_type_id = 
+       g_flags_register_static (g_intern_static_string ("PopplerAnnotFlag"), values);
+      
+    g_once_init_leave (&g_define_type_id__volatile, g_define_type_id);
+  }
+    
+  return g_define_type_id__volatile;
+}
+
+GType
+poppler_annot_markup_reply_type_get_type (void)
+{
+  static volatile gsize g_define_type_id__volatile = 0;
+  if (g_once_init_enter (&g_define_type_id__volatile)) {
+    static const GEnumValue values[] = {
+      { POPPLER_ANNOT_MARKUP_REPLY_TYPE_R, "POPPLER_ANNOT_MARKUP_REPLY_TYPE_R", "r" },
+      { POPPLER_ANNOT_MARKUP_REPLY_TYPE_GROUP, "POPPLER_ANNOT_MARKUP_REPLY_TYPE_GROUP", "group" },
+      { 0, NULL, NULL }
+    };
+    GType g_define_type_id = 
+       g_enum_register_static (g_intern_static_string ("PopplerAnnotMarkupReplyType"), values);
+      
+    g_once_init_leave (&g_define_type_id__volatile, g_define_type_id);
+  }
+    
+  return g_define_type_id__volatile;
+}
+
+GType
+poppler_annot_external_data_type_get_type (void)
+{
+  static volatile gsize g_define_type_id__volatile = 0;
+  if (g_once_init_enter (&g_define_type_id__volatile)) {
+    static const GEnumValue values[] = {
+      { POPPLER_ANNOT_EXTERNAL_DATA_MARKUP_3D, "POPPLER_ANNOT_EXTERNAL_DATA_MARKUP_3D", "3d" },
+      { POPPLER_ANNOT_EXTERNAL_DATA_MARKUP_UNKNOWN, "POPPLER_ANNOT_EXTERNAL_DATA_MARKUP_UNKNOWN", "unknown" },
+      { 0, NULL, NULL }
+    };
+    GType g_define_type_id = 
+       g_enum_register_static (g_intern_static_string ("PopplerAnnotExternalDataType"), values);
+      
+    g_once_init_leave (&g_define_type_id__volatile, g_define_type_id);
+  }
+    
+  return g_define_type_id__volatile;
+}
+
+GType
+poppler_annot_text_state_get_type (void)
+{
+  static volatile gsize g_define_type_id__volatile = 0;
+  if (g_once_init_enter (&g_define_type_id__volatile)) {
+    static const GEnumValue values[] = {
+      { POPPLER_ANNOT_TEXT_STATE_MARKED, "POPPLER_ANNOT_TEXT_STATE_MARKED", "marked" },
+      { POPPLER_ANNOT_TEXT_STATE_UNMARKED, "POPPLER_ANNOT_TEXT_STATE_UNMARKED", "unmarked" },
+      { POPPLER_ANNOT_TEXT_STATE_ACCEPTED, "POPPLER_ANNOT_TEXT_STATE_ACCEPTED", "accepted" },
+      { POPPLER_ANNOT_TEXT_STATE_REJECTED, "POPPLER_ANNOT_TEXT_STATE_REJECTED", "rejected" },
+      { POPPLER_ANNOT_TEXT_STATE_CANCELLED, "POPPLER_ANNOT_TEXT_STATE_CANCELLED", "cancelled" },
+      { POPPLER_ANNOT_TEXT_STATE_COMPLETED, "POPPLER_ANNOT_TEXT_STATE_COMPLETED", "completed" },
+      { POPPLER_ANNOT_TEXT_STATE_NONE, "POPPLER_ANNOT_TEXT_STATE_NONE", "none" },
+      { POPPLER_ANNOT_TEXT_STATE_UNKNOWN, "POPPLER_ANNOT_TEXT_STATE_UNKNOWN", "unknown" },
+      { 0, NULL, NULL }
+    };
+    GType g_define_type_id = 
+       g_enum_register_static (g_intern_static_string ("PopplerAnnotTextState"), values);
+      
+    g_once_init_leave (&g_define_type_id__volatile, g_define_type_id);
+  }
+    
+  return g_define_type_id__volatile;
+}
+
+GType
+poppler_annot_free_text_quadding_get_type (void)
+{
+  static volatile gsize g_define_type_id__volatile = 0;
+  if (g_once_init_enter (&g_define_type_id__volatile)) {
+    static const GEnumValue values[] = {
+      { POPPLER_ANNOT_FREE_TEXT_QUADDING_LEFT_JUSTIFIED, "POPPLER_ANNOT_FREE_TEXT_QUADDING_LEFT_JUSTIFIED", "left-justified" },
+      { POPPLER_ANNOT_FREE_TEXT_QUADDING_CENTERED, "POPPLER_ANNOT_FREE_TEXT_QUADDING_CENTERED", "centered" },
+      { POPPLER_ANNOT_FREE_TEXT_QUADDING_RIGHT_JUSTIFIED, "POPPLER_ANNOT_FREE_TEXT_QUADDING_RIGHT_JUSTIFIED", "right-justified" },
+      { 0, NULL, NULL }
+    };
+    GType g_define_type_id = 
+       g_enum_register_static (g_intern_static_string ("PopplerAnnotFreeTextQuadding"), values);
+      
+    g_once_init_leave (&g_define_type_id__volatile, g_define_type_id);
+  }
+    
+  return g_define_type_id__volatile;
+}
+
+/* enumerations from "poppler.h" */
+#include "poppler.h"
+GType
+poppler_error_get_type (void)
+{
+  static volatile gsize g_define_type_id__volatile = 0;
+  if (g_once_init_enter (&g_define_type_id__volatile)) {
+    static const GEnumValue values[] = {
+      { POPPLER_ERROR_INVALID, "POPPLER_ERROR_INVALID", "invalid" },
+      { POPPLER_ERROR_ENCRYPTED, "POPPLER_ERROR_ENCRYPTED", "encrypted" },
+      { POPPLER_ERROR_OPEN_FILE, "POPPLER_ERROR_OPEN_FILE", "open-file" },
+      { POPPLER_ERROR_BAD_CATALOG, "POPPLER_ERROR_BAD_CATALOG", "bad-catalog" },
+      { POPPLER_ERROR_DAMAGED, "POPPLER_ERROR_DAMAGED", "damaged" },
+      { 0, NULL, NULL }
+    };
+    GType g_define_type_id = 
+       g_enum_register_static (g_intern_static_string ("PopplerError"), values);
+      
+    g_once_init_leave (&g_define_type_id__volatile, g_define_type_id);
+  }
+    
+  return g_define_type_id__volatile;
+}
+
+GType
+poppler_orientation_get_type (void)
+{
+  static volatile gsize g_define_type_id__volatile = 0;
+  if (g_once_init_enter (&g_define_type_id__volatile)) {
+    static const GEnumValue values[] = {
+      { POPPLER_ORIENTATION_PORTRAIT, "POPPLER_ORIENTATION_PORTRAIT", "portrait" },
+      { POPPLER_ORIENTATION_LANDSCAPE, "POPPLER_ORIENTATION_LANDSCAPE", "landscape" },
+      { POPPLER_ORIENTATION_UPSIDEDOWN, "POPPLER_ORIENTATION_UPSIDEDOWN", "upsidedown" },
+      { POPPLER_ORIENTATION_SEASCAPE, "POPPLER_ORIENTATION_SEASCAPE", "seascape" },
+      { 0, NULL, NULL }
+    };
+    GType g_define_type_id = 
+       g_enum_register_static (g_intern_static_string ("PopplerOrientation"), values);
+      
+    g_once_init_leave (&g_define_type_id__volatile, g_define_type_id);
+  }
+    
+  return g_define_type_id__volatile;
+}
+
+GType
+poppler_page_transition_type_get_type (void)
+{
+  static volatile gsize g_define_type_id__volatile = 0;
+  if (g_once_init_enter (&g_define_type_id__volatile)) {
+    static const GEnumValue values[] = {
+      { POPPLER_PAGE_TRANSITION_REPLACE, "POPPLER_PAGE_TRANSITION_REPLACE", "replace" },
+      { POPPLER_PAGE_TRANSITION_SPLIT, "POPPLER_PAGE_TRANSITION_SPLIT", "split" },
+      { POPPLER_PAGE_TRANSITION_BLINDS, "POPPLER_PAGE_TRANSITION_BLINDS", "blinds" },
+      { POPPLER_PAGE_TRANSITION_BOX, "POPPLER_PAGE_TRANSITION_BOX", "box" },
+      { POPPLER_PAGE_TRANSITION_WIPE, "POPPLER_PAGE_TRANSITION_WIPE", "wipe" },
+      { POPPLER_PAGE_TRANSITION_DISSOLVE, "POPPLER_PAGE_TRANSITION_DISSOLVE", "dissolve" },
+      { POPPLER_PAGE_TRANSITION_GLITTER, "POPPLER_PAGE_TRANSITION_GLITTER", "glitter" },
+      { POPPLER_PAGE_TRANSITION_FLY, "POPPLER_PAGE_TRANSITION_FLY", "fly" },
+      { POPPLER_PAGE_TRANSITION_PUSH, "POPPLER_PAGE_TRANSITION_PUSH", "push" },
+      { POPPLER_PAGE_TRANSITION_COVER, "POPPLER_PAGE_TRANSITION_COVER", "cover" },
+      { POPPLER_PAGE_TRANSITION_UNCOVER, "POPPLER_PAGE_TRANSITION_UNCOVER", "uncover" },
+      { POPPLER_PAGE_TRANSITION_FADE, "POPPLER_PAGE_TRANSITION_FADE", "fade" },
+      { 0, NULL, NULL }
+    };
+    GType g_define_type_id = 
+       g_enum_register_static (g_intern_static_string ("PopplerPageTransitionType"), values);
+      
+    g_once_init_leave (&g_define_type_id__volatile, g_define_type_id);
+  }
+    
+  return g_define_type_id__volatile;
+}
+
+GType
+poppler_page_transition_alignment_get_type (void)
+{
+  static volatile gsize g_define_type_id__volatile = 0;
+  if (g_once_init_enter (&g_define_type_id__volatile)) {
+    static const GEnumValue values[] = {
+      { POPPLER_PAGE_TRANSITION_HORIZONTAL, "POPPLER_PAGE_TRANSITION_HORIZONTAL", "horizontal" },
+      { POPPLER_PAGE_TRANSITION_VERTICAL, "POPPLER_PAGE_TRANSITION_VERTICAL", "vertical" },
+      { 0, NULL, NULL }
+    };
+    GType g_define_type_id = 
+       g_enum_register_static (g_intern_static_string ("PopplerPageTransitionAlignment"), values);
+      
+    g_once_init_leave (&g_define_type_id__volatile, g_define_type_id);
+  }
+    
+  return g_define_type_id__volatile;
+}
+
+GType
+poppler_page_transition_direction_get_type (void)
+{
+  static volatile gsize g_define_type_id__volatile = 0;
+  if (g_once_init_enter (&g_define_type_id__volatile)) {
+    static const GEnumValue values[] = {
+      { POPPLER_PAGE_TRANSITION_INWARD, "POPPLER_PAGE_TRANSITION_INWARD", "inward" },
+      { POPPLER_PAGE_TRANSITION_OUTWARD, "POPPLER_PAGE_TRANSITION_OUTWARD", "outward" },
+      { 0, NULL, NULL }
+    };
+    GType g_define_type_id = 
+       g_enum_register_static (g_intern_static_string ("PopplerPageTransitionDirection"), values);
+      
+    g_once_init_leave (&g_define_type_id__volatile, g_define_type_id);
+  }
+    
+  return g_define_type_id__volatile;
+}
+
+GType
+poppler_selection_style_get_type (void)
+{
+  static volatile gsize g_define_type_id__volatile = 0;
+  if (g_once_init_enter (&g_define_type_id__volatile)) {
+    static const GEnumValue values[] = {
+      { POPPLER_SELECTION_GLYPH, "POPPLER_SELECTION_GLYPH", "glyph" },
+      { POPPLER_SELECTION_WORD, "POPPLER_SELECTION_WORD", "word" },
+      { POPPLER_SELECTION_LINE, "POPPLER_SELECTION_LINE", "line" },
+      { 0, NULL, NULL }
+    };
+    GType g_define_type_id = 
+       g_enum_register_static (g_intern_static_string ("PopplerSelectionStyle"), values);
+      
+    g_once_init_leave (&g_define_type_id__volatile, g_define_type_id);
+  }
+    
+  return g_define_type_id__volatile;
+}
+
+GType
+poppler_print_flags_get_type (void)
+{
+  static volatile gsize g_define_type_id__volatile = 0;
+  if (g_once_init_enter (&g_define_type_id__volatile)) {
+    static const GFlagsValue values[] = {
+      { POPPLER_PRINT_DOCUMENT, "POPPLER_PRINT_DOCUMENT", "document" },
+      { POPPLER_PRINT_MARKUP_ANNOTS, "POPPLER_PRINT_MARKUP_ANNOTS", "markup-annots" },
+      { POPPLER_PRINT_STAMP_ANNOTS_ONLY, "POPPLER_PRINT_STAMP_ANNOTS_ONLY", "stamp-annots-only" },
+      { POPPLER_PRINT_ALL, "POPPLER_PRINT_ALL", "all" },
+      { 0, NULL, NULL }
+    };
+    GType g_define_type_id = 
+       g_flags_register_static (g_intern_static_string ("PopplerPrintFlags"), values);
+      
+    g_once_init_leave (&g_define_type_id__volatile, g_define_type_id);
+  }
+    
+  return g_define_type_id__volatile;
+}
+
+GType
+poppler_backend_get_type (void)
+{
+  static volatile gsize g_define_type_id__volatile = 0;
+  if (g_once_init_enter (&g_define_type_id__volatile)) {
+    static const GEnumValue values[] = {
+      { POPPLER_BACKEND_UNKNOWN, "POPPLER_BACKEND_UNKNOWN", "unknown" },
+      { POPPLER_BACKEND_SPLASH, "POPPLER_BACKEND_SPLASH", "splash" },
+      { POPPLER_BACKEND_CAIRO, "POPPLER_BACKEND_CAIRO", "cairo" },
+      { 0, NULL, NULL }
+    };
+    GType g_define_type_id = 
+       g_enum_register_static (g_intern_static_string ("PopplerBackend"), values);
+      
+    g_once_init_leave (&g_define_type_id__volatile, g_define_type_id);
+  }
+    
+  return g_define_type_id__volatile;
+}
+
+
+
+/* Generated data ends here */
+
diff --git a/glib/poppler-enums.c.template b/glib/poppler-enums.c.template
new file mode 100644 (file)
index 0000000..26a51b4
--- /dev/null
@@ -0,0 +1,44 @@
+/*** BEGIN file-header ***/
+#include <config.h>
+
+#include "poppler-enums.h"
+
+/*** END file-header ***/
+
+/*** BEGIN file-production ***/
+/* enumerations from "@filename@" */
+#include "@filename@"
+/*** END file-production ***/
+
+
+/*** BEGIN value-header ***/
+GType
+@enum_name@_get_type (void)
+{
+  static volatile gsize g_define_type_id__volatile = 0;
+  if (g_once_init_enter (&g_define_type_id__volatile)) {
+    static const G@Type@Value values[] = {
+/*** END value-header ***/
+
+/*** BEGIN value-production ***/
+      { @VALUENAME@, "@VALUENAME@", "@valuenick@" },
+/*** END value-production ***/
+
+/*** BEGIN value-tail ***/
+      { 0, NULL, NULL }
+    };
+    GType g_define_type_id = 
+       g_@type@_register_static (g_intern_static_string ("@EnumName@"), values);
+      
+    g_once_init_leave (&g_define_type_id__volatile, g_define_type_id);
+  }
+    
+  return g_define_type_id__volatile;
+}
+
+/*** END value-tail ***/
+
+/*** BEGIN file-tail ***/
+
+/*** END file-tail ***/
diff --git a/glib/poppler-enums.h b/glib/poppler-enums.h
new file mode 100644 (file)
index 0000000..311fdec
--- /dev/null
@@ -0,0 +1,80 @@
+
+/* Generated data (by glib-mkenums) */
+
+
+#ifndef POPPLER_ENUMS_H
+#define POPPLER_ENUMS_H
+
+#include <glib-object.h>
+
+G_BEGIN_DECLS
+
+/* enumerations from "poppler-action.h" */
+GType poppler_action_type_get_type (void) G_GNUC_CONST;
+#define POPPLER_TYPE_ACTION_TYPE (poppler_action_type_get_type ())
+GType poppler_dest_type_get_type (void) G_GNUC_CONST;
+#define POPPLER_TYPE_DEST_TYPE (poppler_dest_type_get_type ())
+GType poppler_action_movie_operation_get_type (void) G_GNUC_CONST;
+#define POPPLER_TYPE_ACTION_MOVIE_OPERATION (poppler_action_movie_operation_get_type ())
+GType poppler_action_layer_action_get_type (void) G_GNUC_CONST;
+#define POPPLER_TYPE_ACTION_LAYER_ACTION (poppler_action_layer_action_get_type ())
+
+/* enumerations from "poppler-document.h" */
+GType poppler_page_layout_get_type (void) G_GNUC_CONST;
+#define POPPLER_TYPE_PAGE_LAYOUT (poppler_page_layout_get_type ())
+GType poppler_page_mode_get_type (void) G_GNUC_CONST;
+#define POPPLER_TYPE_PAGE_MODE (poppler_page_mode_get_type ())
+GType poppler_font_type_get_type (void) G_GNUC_CONST;
+#define POPPLER_TYPE_FONT_TYPE (poppler_font_type_get_type ())
+GType poppler_viewer_preferences_get_type (void) G_GNUC_CONST;
+#define POPPLER_TYPE_VIEWER_PREFERENCES (poppler_viewer_preferences_get_type ())
+GType poppler_permissions_get_type (void) G_GNUC_CONST;
+#define POPPLER_TYPE_PERMISSIONS (poppler_permissions_get_type ())
+
+/* enumerations from "poppler-form-field.h" */
+GType poppler_form_field_type_get_type (void) G_GNUC_CONST;
+#define POPPLER_TYPE_FORM_FIELD_TYPE (poppler_form_field_type_get_type ())
+GType poppler_form_button_type_get_type (void) G_GNUC_CONST;
+#define POPPLER_TYPE_FORM_BUTTON_TYPE (poppler_form_button_type_get_type ())
+GType poppler_form_text_type_get_type (void) G_GNUC_CONST;
+#define POPPLER_TYPE_FORM_TEXT_TYPE (poppler_form_text_type_get_type ())
+GType poppler_form_choice_type_get_type (void) G_GNUC_CONST;
+#define POPPLER_TYPE_FORM_CHOICE_TYPE (poppler_form_choice_type_get_type ())
+
+/* enumerations from "poppler-annot.h" */
+GType poppler_annot_type_get_type (void) G_GNUC_CONST;
+#define POPPLER_TYPE_ANNOT_TYPE (poppler_annot_type_get_type ())
+GType poppler_annot_flag_get_type (void) G_GNUC_CONST;
+#define POPPLER_TYPE_ANNOT_FLAG (poppler_annot_flag_get_type ())
+GType poppler_annot_markup_reply_type_get_type (void) G_GNUC_CONST;
+#define POPPLER_TYPE_ANNOT_MARKUP_REPLY_TYPE (poppler_annot_markup_reply_type_get_type ())
+GType poppler_annot_external_data_type_get_type (void) G_GNUC_CONST;
+#define POPPLER_TYPE_ANNOT_EXTERNAL_DATA_TYPE (poppler_annot_external_data_type_get_type ())
+GType poppler_annot_text_state_get_type (void) G_GNUC_CONST;
+#define POPPLER_TYPE_ANNOT_TEXT_STATE (poppler_annot_text_state_get_type ())
+GType poppler_annot_free_text_quadding_get_type (void) G_GNUC_CONST;
+#define POPPLER_TYPE_ANNOT_FREE_TEXT_QUADDING (poppler_annot_free_text_quadding_get_type ())
+
+/* enumerations from "poppler.h" */
+GType poppler_error_get_type (void) G_GNUC_CONST;
+#define POPPLER_TYPE_ERROR (poppler_error_get_type ())
+GType poppler_orientation_get_type (void) G_GNUC_CONST;
+#define POPPLER_TYPE_ORIENTATION (poppler_orientation_get_type ())
+GType poppler_page_transition_type_get_type (void) G_GNUC_CONST;
+#define POPPLER_TYPE_PAGE_TRANSITION_TYPE (poppler_page_transition_type_get_type ())
+GType poppler_page_transition_alignment_get_type (void) G_GNUC_CONST;
+#define POPPLER_TYPE_PAGE_TRANSITION_ALIGNMENT (poppler_page_transition_alignment_get_type ())
+GType poppler_page_transition_direction_get_type (void) G_GNUC_CONST;
+#define POPPLER_TYPE_PAGE_TRANSITION_DIRECTION (poppler_page_transition_direction_get_type ())
+GType poppler_selection_style_get_type (void) G_GNUC_CONST;
+#define POPPLER_TYPE_SELECTION_STYLE (poppler_selection_style_get_type ())
+GType poppler_print_flags_get_type (void) G_GNUC_CONST;
+#define POPPLER_TYPE_PRINT_FLAGS (poppler_print_flags_get_type ())
+GType poppler_backend_get_type (void) G_GNUC_CONST;
+#define POPPLER_TYPE_BACKEND (poppler_backend_get_type ())
+G_END_DECLS
+
+#endif /* !POPPLER_ENUMS_H */
+
+/* Generated data ends here */
+
diff --git a/glib/poppler-enums.h.template b/glib/poppler-enums.h.template
new file mode 100644 (file)
index 0000000..5d056dd
--- /dev/null
@@ -0,0 +1,25 @@
+/*** BEGIN file-header ***/
+
+#ifndef POPPLER_ENUMS_H
+#define POPPLER_ENUMS_H
+
+#include <glib-object.h>
+
+G_BEGIN_DECLS
+/*** END file-header ***/
+
+/*** BEGIN file-production ***/
+
+/* enumerations from "@filename@" */
+/*** END file-production ***/
+
+/*** BEGIN value-header ***/
+GType @enum_name@_get_type (void) G_GNUC_CONST;
+#define POPPLER_TYPE_@ENUMSHORT@ (@enum_name@_get_type ())
+/*** END value-header ***/
+
+/*** BEGIN file-tail ***/
+G_END_DECLS
+
+#endif /* !POPPLER_ENUMS_H */
+/*** END file-tail ***/
diff --git a/glib/poppler-features.h.cmake b/glib/poppler-features.h.cmake
new file mode 100644 (file)
index 0000000..1f79ce4
--- /dev/null
@@ -0,0 +1,33 @@
+/* poppler-features.h: glib interface to poppler
+ * Copyright (C) 2006, Red Hat, Inc.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#ifndef __POPPLER_FEATURES_H__
+#define __POPPLER_FEATURES_H__
+
+@CAIRO_FEATURE@
+
+#define POPPLER_MAJOR_VERSION (@POPPLER_MAJOR_VERSION@)
+#define POPPLER_MINOR_VERSION (@POPPLER_MINOR_VERSION@)
+#define POPPLER_MICRO_VERSION (@POPPLER_MICRO_VERSION@)
+
+#define POPPLER_CHECK_VERSION(major,minor,micro) \
+  (POPPLER_MAJOR_VERSION > (major) || \
+   (POPPLER_MAJOR_VERSION == (major) && POPPLER_MINOR_VERSION > (minor)) || \
+   (POPPLER_MAJOR_VERSION == (major) && POPPLER_MINOR_VERSION == (minor) && POPPLER_MICRO_VERSION >= (micro)))
+
+#endif /* __POPPLER_FEATURES_H__ */
diff --git a/glib/poppler-features.h.in b/glib/poppler-features.h.in
new file mode 100644 (file)
index 0000000..e6b3a8e
--- /dev/null
@@ -0,0 +1,88 @@
+/* poppler-features.h: glib interface to poppler
+ * Copyright (C) 2006, Red Hat, Inc.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#ifndef __POPPLER_FEATURES_H__
+#define __POPPLER_FEATURES_H__
+
+/**
+ * SECTION:poppler-features
+ * @short_description: Variables and functions to check the poppler version and features
+ * @Title: Version and Features Information
+ *
+ * Poppler provides version information, and information about features
+ * enabled at compile time. This is primarily useful in configure checks
+ * for builds that have a configure script, or for allowing code to optionally
+ * depend but not require a specific poppler version.
+ */
+
+/**
+ * POPPLER_HAS_CAIRO:
+ *
+ * Defined if poppler was compiled with cairo support.
+ */
+@CAIRO_FEATURE@
+
+/**
+ * POPPLER_MAJOR_VERSION:
+ *
+ * The major version number of the poppler header files (e.g. in poppler version
+ * 0.1.2 this is 0.)
+ *
+ * Since: 0.12
+ */
+#define POPPLER_MAJOR_VERSION (@POPPLER_MAJOR_VERSION@)
+
+/**
+ * POPPLER_MINOR_VERSION:
+ *
+ * The major version number of the poppler header files (e.g. in poppler version
+ * 0.1.2 this is 1.)
+ *
+ * Since: 0.12
+ */
+#define POPPLER_MINOR_VERSION (@POPPLER_MINOR_VERSION@)
+
+/**
+ * POPPLER_MICRO_VERSION:
+ *
+ * The micro version number of the poppler header files (e.g. in poppler version
+ * 0.1.2 this is 2.)
+ *
+ * Since: 0.12
+ */
+#define POPPLER_MICRO_VERSION (@POPPLER_MICRO_VERSION@)
+
+/**
+ * POPPLER_CHECK_VERSION:
+ * @major: major version (e.g. 0 for version 0.1.2)
+ * @minor: minor version (e.g. 1 for version 0.1.2)
+ * @micro: micro version (e.g. 2 for version 0.1.2)
+ *
+ * Checks the version fo the poppler library
+ *
+ * Returns: %TRUE if the version of the poppler header files is the same
+ * as or newer than the passed-in version
+ *
+ * Since: 0.12
+ */
+#define POPPLER_CHECK_VERSION(major,minor,micro) \
+  (POPPLER_MAJOR_VERSION > (major) || \
+   (POPPLER_MAJOR_VERSION == (major) && POPPLER_MINOR_VERSION > (minor)) || \
+   (POPPLER_MAJOR_VERSION == (major) && POPPLER_MINOR_VERSION == (minor) && POPPLER_MICRO_VERSION >= (micro)))
+
+#endif /* __POPPLER_FEATURES_H__ */
diff --git a/glib/poppler-form-field.cc b/glib/poppler-form-field.cc
new file mode 100644 (file)
index 0000000..09f8be1
--- /dev/null
@@ -0,0 +1,691 @@
+/* poppler-form-field.cc: glib interface to poppler
+ *
+ * Copyright (C) 2007 Carlos Garcia Campos <carlosgc@gnome.org>
+ * Copyright (C) 2006 Julien Rebetez
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include "poppler.h"
+#include "poppler-private.h"
+
+/**
+ * SECTION:poppler-form-field
+ * @short_description: Form Field
+ * @title: PoppplerFormField
+ */
+
+typedef struct _PopplerFormFieldClass PopplerFormFieldClass;
+struct _PopplerFormFieldClass
+{
+  GObjectClass parent_class;
+};
+
+G_DEFINE_TYPE (PopplerFormField, poppler_form_field, G_TYPE_OBJECT)
+
+static void
+poppler_form_field_finalize (GObject *object)
+{
+  PopplerFormField *field = POPPLER_FORM_FIELD (object);
+
+  if (field->document)
+    {
+      g_object_unref (field->document);
+      field->document = NULL;
+    }
+  if (field->action)
+    {
+      poppler_action_free (field->action);
+      field->action = NULL;
+    }
+  field->widget = NULL;
+
+  G_OBJECT_CLASS (poppler_form_field_parent_class)->finalize (object);
+}
+
+static void
+poppler_form_field_init (PopplerFormField *field)
+{
+}
+
+static void
+poppler_form_field_class_init (PopplerFormFieldClass *klass)
+{
+  GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
+
+  gobject_class->finalize = poppler_form_field_finalize;
+}
+
+PopplerFormField *
+_poppler_form_field_new (PopplerDocument *document,
+                        FormWidget      *field)
+{
+  PopplerFormField *poppler_field;
+
+  g_return_val_if_fail (POPPLER_IS_DOCUMENT (document), NULL);
+  g_return_val_if_fail (field != NULL, NULL);
+
+  poppler_field = POPPLER_FORM_FIELD (g_object_new (POPPLER_TYPE_FORM_FIELD, NULL));
+
+  poppler_field->document = (PopplerDocument *)g_object_ref (document);
+  poppler_field->widget = field;
+  
+  return poppler_field;
+}
+
+/* Public methods */
+/**
+ * poppler_form_field_get_field_type:
+ * @field: a #PopplerFormField
+ *
+ * Gets the type of @field
+ *
+ * Return value: #PopplerFormFieldType of @field
+ **/ 
+PopplerFormFieldType
+poppler_form_field_get_field_type (PopplerFormField *field)
+{
+  g_return_val_if_fail (POPPLER_IS_FORM_FIELD (field), POPPLER_FORM_FIELD_UNKNOWN);
+  
+  switch (field->widget->getType ())
+  {
+    case formButton:
+      return POPPLER_FORM_FIELD_BUTTON;
+    case formText:
+      return POPPLER_FORM_FIELD_TEXT;
+    case formChoice:
+      return POPPLER_FORM_FIELD_CHOICE;
+    case formSignature:
+      return POPPLER_FORM_FIELD_SIGNATURE;
+    default:
+      g_warning ("Unsupported Form Field Type");
+  }
+
+  return POPPLER_FORM_FIELD_UNKNOWN;
+}
+
+/**
+ * poppler_form_field_get_id:
+ * @field: a #PopplerFormField
+ *
+ * Gets the id of @field
+ *
+ * Return value: the id of @field
+ **/
+gint
+poppler_form_field_get_id (PopplerFormField *field)
+{
+  g_return_val_if_fail (POPPLER_IS_FORM_FIELD (field), -1);
+  
+  return field->widget->getID ();
+}
+
+/**
+ * poppler_form_field_get_font_size
+ * @field: a #PopplerFormField
+ *
+ * Gets the font size of @field
+ *
+ * Return value: the font size of @field
+ **/
+gdouble
+poppler_form_field_get_font_size (PopplerFormField *field)
+{
+  g_return_val_if_fail (POPPLER_IS_FORM_FIELD (field), 0);
+  
+  return field->widget->getFontSize ();
+}
+
+/**
+ * poppler_form_field_is_read_only
+ * @field: a #PopplerFormField
+ *
+ * Checks whether @field is read only
+ *
+ * Return value: %TRUE if @field is read only
+ **/
+gboolean
+poppler_form_field_is_read_only (PopplerFormField *field)
+{
+  g_return_val_if_fail (POPPLER_IS_FORM_FIELD (field), FALSE);
+
+  return field->widget->isReadOnly ();
+}
+
+/**
+ * poppler_form_field_get_action:
+ * @field: a #PopplerFormField
+ *
+ * Retrieves the action (#PopplerAction) that shall be
+ * performed when @field is activated, or %NULL
+ *
+ * Return value: (transfer none): the action to perform. The returned
+ *               object is owned by @field and should not be freed
+ *
+ * Since: 0.18
+ */
+PopplerAction *
+poppler_form_field_get_action (PopplerFormField *field)
+{
+  LinkAction *action;
+
+  if (field->action)
+    return field->action;
+
+  action = field->widget->getActivationAction();
+  if (!action)
+    return NULL;
+
+  field->action = _poppler_action_new (NULL, action, NULL);
+
+  return field->action;
+}
+
+/* Button Field */
+/**
+ * poppler_form_field_button_get_button_type
+ * @field: a #PopplerFormField
+ *
+ * Gets the button type of @field
+ *
+ * Return value: #PopplerFormButtonType of @field
+ **/
+PopplerFormButtonType
+poppler_form_field_button_get_button_type (PopplerFormField *field)
+{
+  g_return_val_if_fail (field->widget->getType () == formButton, POPPLER_FORM_BUTTON_PUSH);
+
+  switch (static_cast<FormWidgetButton*>(field->widget)->getButtonType ())
+    {
+      case formButtonPush:
+        return POPPLER_FORM_BUTTON_PUSH;
+      case formButtonCheck:
+        return POPPLER_FORM_BUTTON_CHECK;
+      case formButtonRadio:
+        return POPPLER_FORM_BUTTON_RADIO;
+      default:
+        g_assert_not_reached ();
+    }
+}
+
+/**
+ * poppler_form_field_button_get_state
+ * @field: a #PopplerFormField
+ *
+ * Queries a #PopplerFormField and returns its current state. Returns %TRUE if
+ * @field is pressed in and %FALSE if it is raised.
+ *
+ * Return value: current state of @field
+ **/
+gboolean
+poppler_form_field_button_get_state (PopplerFormField *field)
+{
+  g_return_val_if_fail (field->widget->getType () == formButton, FALSE);
+  
+  return static_cast<FormWidgetButton*>(field->widget)->getState ();
+}
+
+/**
+ * poppler_form_field_button_set_state
+ * @field: a #PopplerFormField
+ * @state: %TRUE or %FALSE
+ *
+ * Sets the status of @field. Set to %TRUE if you want the #PopplerFormField
+ * to be 'pressed in', and %FALSE to raise it. 
+ **/
+void
+poppler_form_field_button_set_state (PopplerFormField *field,
+                                    gboolean          state)
+{
+  g_return_if_fail (field->widget->getType () == formButton);
+
+  static_cast<FormWidgetButton*>(field->widget)->setState ((GBool)state);
+}
+
+/**
+ * poppler_form_field_get_partial_name:
+ * @field: a #PopplerFormField
+ *
+ * Gets the partial name of @field.
+ *
+ * Return value: a new allocated string. It must be freed with g_free() when done.
+ *
+ * Since: 0.16
+ **/
+gchar*
+poppler_form_field_get_partial_name (PopplerFormField *field)
+{
+  GooString *tmp;
+
+  g_return_val_if_fail (POPPLER_IS_FORM_FIELD (field), NULL);
+
+  tmp = field->widget->getPartialName();
+
+  return tmp ? _poppler_goo_string_to_utf8 (tmp) : NULL;
+}
+
+/**
+ * poppler_form_field_get_mapping_name:
+ * @field: a #PopplerFormField
+ *
+ * Gets the mapping name of @field that is used when
+ * exporting interactive form field data from the document
+ *
+ * Return value: a new allocated string. It must be freed with g_free() when done.
+ *
+ * Since: 0.16
+ **/
+gchar*
+poppler_form_field_get_mapping_name (PopplerFormField *field)
+{
+  GooString *tmp;
+
+  g_return_val_if_fail (POPPLER_IS_FORM_FIELD (field), NULL);
+
+  tmp = field->widget->getMappingName();
+
+  return tmp ? _poppler_goo_string_to_utf8 (tmp) : NULL;
+}
+
+/**
+ * poppler_form_field_get_name:
+ * @field: a #PopplerFormField
+ *
+ * Gets the fully qualified name of @field. It's constructed by concatenating
+ * the partial field names of the field and all of its ancestors.
+ *
+ * Return value: a new allocated string. It must be freed with g_free() when done.
+ *
+ * Since: 0.16
+ **/
+gchar*
+poppler_form_field_get_name (PopplerFormField *field)
+{
+  GooString *tmp;
+
+  g_return_val_if_fail (POPPLER_IS_FORM_FIELD (field), NULL);
+
+  tmp = field->widget->getFullyQualifiedName();
+
+  return tmp ? _poppler_goo_string_to_utf8 (tmp) : NULL;
+}
+
+/* Text Field */
+/**
+ * poppler_form_field_text_get_text_type:
+ * @field: a #PopplerFormField
+ *
+ * Gets the text type of @field.
+ *
+ * Return value: #PopplerFormTextType of @field
+ **/
+PopplerFormTextType
+poppler_form_field_text_get_text_type (PopplerFormField *field)
+{
+  FormWidgetText *text_field;
+  
+  g_return_val_if_fail (field->widget->getType () == formText, POPPLER_FORM_TEXT_NORMAL);
+
+  text_field = static_cast<FormWidgetText*>(field->widget);
+  
+  if (text_field->isMultiline ())
+    return POPPLER_FORM_TEXT_MULTILINE;
+  else if (text_field->isFileSelect ())
+    return POPPLER_FORM_TEXT_FILE_SELECT;
+
+  return POPPLER_FORM_TEXT_NORMAL;
+}
+
+/**
+ * poppler_form_field_text_get_text:
+ * @field: a #PopplerFormField
+ *
+ * Retrieves the contents of @field.
+ *
+ * Return value: a new allocated string. It must be freed with g_free() when done.
+ **/
+gchar *
+poppler_form_field_text_get_text (PopplerFormField *field)
+{
+  FormWidgetText *text_field;
+  GooString      *tmp;
+
+  g_return_val_if_fail (field->widget->getType () == formText, NULL);
+
+  text_field = static_cast<FormWidgetText*>(field->widget);
+  tmp = text_field->getContent ();
+
+  return tmp ? _poppler_goo_string_to_utf8 (tmp) : NULL;
+}
+
+/**
+ * poppler_form_field_text_set_text:
+ * @field: a #PopplerFormField
+ * @text: the new text
+ *
+ * Sets the text in @field to the given value, replacing the current contents.
+ **/
+void
+poppler_form_field_text_set_text (PopplerFormField *field,
+                                 const gchar      *text)
+{
+  GooString *goo_tmp;
+  gchar *tmp;
+  gsize length = 0;
+       
+  g_return_if_fail (field->widget->getType () == formText);
+
+  tmp = text ? g_convert (text, -1, "UTF-16BE", "UTF-8", NULL, &length, NULL) : NULL;
+  goo_tmp = new GooString (tmp, length);
+  g_free (tmp);
+  static_cast<FormWidgetText*>(field->widget)->setContent (goo_tmp);
+  delete goo_tmp;
+}
+
+/**
+ * poppler_form_field_text_get_max_len:
+ * @field: a #PopplerFormField
+ *
+ * Retrieves the maximum allowed length of the text in @field
+ *
+ * Return value: the maximum allowed number of characters in @field, or -1 if there is no maximum.
+ **/
+gint
+poppler_form_field_text_get_max_len (PopplerFormField *field)
+{
+  g_return_val_if_fail (field->widget->getType () == formText, 0);
+
+  return static_cast<FormWidgetText*>(field->widget)->getMaxLen ();
+}
+
+/**
+ * poppler_form_field_text_do_spell_check:
+ * @field: a #PopplerFormField
+ *
+ * Checks whether spell checking should be done for the contents of @field
+ *
+ * Return value: %TRUE if spell checking should be done for @field
+ **/
+gboolean
+poppler_form_field_text_do_spell_check (PopplerFormField *field)
+{
+  g_return_val_if_fail (field->widget->getType () == formText, FALSE);
+
+  return !static_cast<FormWidgetText*>(field->widget)->noSpellCheck ();
+}
+
+gboolean
+poppler_form_field_text_do_scroll (PopplerFormField *field)
+{
+  g_return_val_if_fail (field->widget->getType () == formText, FALSE);
+
+  return !static_cast<FormWidgetText*>(field->widget)->noScroll ();
+}
+
+/**
+ * poppler_form_field_text_is_rich_text:
+ * @field: a #PopplerFormField
+ *
+ * Checks whether the contents of @field are rich text
+ *
+ * Return value: %TRUE if the contents of @field are rich text
+ **/
+gboolean
+poppler_form_field_text_is_rich_text (PopplerFormField *field)
+{
+  g_return_val_if_fail (field->widget->getType () == formText, FALSE);
+
+  return static_cast<FormWidgetText*>(field->widget)->isRichText ();
+}
+
+/**
+ * poppler_form_field_text_is_password:
+ * @field: a #PopplerFormField
+ *
+ * Checks whether content of @field is a password and it must be hidden
+ *
+ * Return value: %TRUE if the content of @field is a password
+ **/
+gboolean
+poppler_form_field_text_is_password (PopplerFormField *field)
+{
+  g_return_val_if_fail (field->widget->getType () == formText, FALSE);
+
+  return static_cast<FormWidgetText*>(field->widget)->isPassword ();
+}
+
+/* Choice Field */
+/**
+ * poppler_form_field_choice_get_choice_type:
+ * @field: a #PopplerFormField
+ *
+ * Gets the choice type of @field
+ *
+ * Return value: #PopplerFormChoiceType of @field
+ **/
+PopplerFormChoiceType
+poppler_form_field_choice_get_choice_type (PopplerFormField *field)
+{
+  g_return_val_if_fail (field->widget->getType () == formChoice, POPPLER_FORM_CHOICE_COMBO);
+
+  if (static_cast<FormWidgetChoice*>(field->widget)->isCombo ())
+    return POPPLER_FORM_CHOICE_COMBO;
+  else
+    return POPPLER_FORM_CHOICE_LIST;
+}
+
+/**
+ * poppler_form_field_choice_is_editable:
+ * @field: a #PopplerFormField
+ *
+ * Checks whether @field is editable
+ *
+ * Return value: %TRUE if @field is editable
+ **/ 
+gboolean
+poppler_form_field_choice_is_editable (PopplerFormField *field)
+{
+  g_return_val_if_fail (field->widget->getType () == formChoice, FALSE);
+
+  return static_cast<FormWidgetChoice*>(field->widget)->hasEdit ();
+}
+
+/**
+ * poppler_form_field_choice_can_select_multiple:
+ * @field: a #PopplerFormField
+ *
+ * Checks whether @field allows multiple choices to be selected
+ *
+ * Return value: %TRUE if @field allows multiple choices to be selected
+ **/
+gboolean
+poppler_form_field_choice_can_select_multiple (PopplerFormField *field)
+{
+  g_return_val_if_fail (field->widget->getType () == formChoice, FALSE);
+
+  return static_cast<FormWidgetChoice*>(field->widget)->isMultiSelect ();
+}
+
+/**
+ * poppler_form_field_choice_do_spell_check:
+ * @field: a #PopplerFormField
+ *
+ * Checks whether spell checking should be done for the contents of @field
+ *
+ * Return value: %TRUE if spell checking should be done for @field
+ **/
+gboolean
+poppler_form_field_choice_do_spell_check (PopplerFormField *field)
+{
+  g_return_val_if_fail (field->widget->getType () == formChoice, FALSE);
+
+  return !static_cast<FormWidgetChoice*>(field->widget)->noSpellCheck ();
+}
+
+gboolean
+poppler_form_field_choice_commit_on_change (PopplerFormField *field)
+{
+  g_return_val_if_fail (field->widget->getType () == formChoice, FALSE);
+
+  return static_cast<FormWidgetChoice*>(field->widget)->commitOnSelChange ();
+}
+
+/**
+ * poppler_form_field_choice_get_n_items:
+ * @field: a #PopplerFormField
+ *
+ * Returns the number of items on @field
+ *
+ * Return value: the number of items on @field
+ **/
+gint
+poppler_form_field_choice_get_n_items (PopplerFormField *field)
+{
+  g_return_val_if_fail (field->widget->getType () == formChoice, -1);
+
+  return static_cast<FormWidgetChoice*>(field->widget)->getNumChoices ();
+}
+
+/**
+ * poppler_form_field_choice_get_item:
+ * @field: a #PopplerFormField
+ * @index: the index of the item
+ *
+ * Returns the contents of the item on @field at the given index
+ *
+ * Return value: a new allocated string. It must be freed with g_free() when done.
+ **/
+gchar *
+poppler_form_field_choice_get_item (PopplerFormField *field,
+                                   gint              index)
+{
+  GooString *tmp;
+  
+  g_return_val_if_fail (field->widget->getType () == formChoice, NULL);
+  g_return_val_if_fail (index >= 0 && index < poppler_form_field_choice_get_n_items (field), NULL);
+
+  tmp = static_cast<FormWidgetChoice*>(field->widget)->getChoice (index);
+  return tmp ? _poppler_goo_string_to_utf8 (tmp) : NULL;
+}
+
+/**
+ * poppler_form_field_choice_is_item_selected:
+ * @field: a #PopplerFormField
+ * @index: the index of the item
+ *
+ * Checks whether the item at the given index on @field is currently selected 
+ *
+ * Return value: %TRUE if item at @index is currently selected
+ **/
+gboolean
+poppler_form_field_choice_is_item_selected (PopplerFormField *field,
+                                           gint              index)
+{
+  g_return_val_if_fail (field->widget->getType () == formChoice, FALSE);
+  g_return_val_if_fail (index >= 0 && index < poppler_form_field_choice_get_n_items (field), FALSE);
+
+  return static_cast<FormWidgetChoice*>(field->widget)->isSelected (index);
+}
+
+/**
+ * poppler_form_field_choice_select_item:
+ * @field: a #PopplerFormField
+ * @index: the index of the item
+ *
+ * Selects the item at the given index on @field
+ **/
+void
+poppler_form_field_choice_select_item (PopplerFormField *field,
+                                      gint              index)
+{
+  g_return_if_fail (field->widget->getType () == formChoice);
+  g_return_if_fail (index >= 0 && index < poppler_form_field_choice_get_n_items (field));
+
+  static_cast<FormWidgetChoice*>(field->widget)->select (index);
+}
+
+/**
+ * poppler_form_field_choice_unselect_all:
+ * @field: a #PopplerFormField
+ *
+ * Unselects all the items on @field
+ **/
+void
+poppler_form_field_choice_unselect_all (PopplerFormField *field)
+{
+  g_return_if_fail (field->widget->getType () == formChoice);
+
+  static_cast<FormWidgetChoice*>(field->widget)->deselectAll ();
+}
+
+/**
+ * poppler_form_field_choice_toggle_item:
+ * @field: a #PopplerFormField
+ * @index: the index of the item
+ *
+ * Changes the state of the item at the given index
+ **/
+void
+poppler_form_field_choice_toggle_item (PopplerFormField *field,
+                                      gint              index)
+{
+  g_return_if_fail (field->widget->getType () == formChoice);
+  g_return_if_fail (index >= 0 && index < poppler_form_field_choice_get_n_items (field));
+
+  static_cast<FormWidgetChoice*>(field->widget)->toggle (index);
+}
+
+/**
+ * poppler_form_field_choice_set_text:
+ * @field: a #PopplerFormField
+ * @text: the new text
+ *
+ * Sets the text in @field to the given value, replacing the current contents
+ **/
+void
+poppler_form_field_choice_set_text (PopplerFormField *field,
+                                   const gchar      *text)
+{
+  GooString *goo_tmp;
+  gchar *tmp;
+  gsize length = 0;
+
+  g_return_if_fail (field->widget->getType () == formChoice);
+
+  tmp = text ? g_convert (text, -1, "UTF-16BE", "UTF-8", NULL, &length, NULL) : NULL;
+  goo_tmp = new GooString (tmp, length);
+  g_free (tmp);
+  static_cast<FormWidgetChoice*>(field->widget)->setEditChoice (goo_tmp);
+  delete goo_tmp;
+}
+
+/**
+ * poppler_form_field_choice_get_text:
+ * @field: a #PopplerFormField
+ *
+ * Retrieves the contents of @field.
+ *
+ * Return value: a new allocated string. It must be freed with g_free() when done.
+ **/
+gchar *
+poppler_form_field_choice_get_text (PopplerFormField *field)
+{
+  GooString *tmp;
+  
+  g_return_val_if_fail (field->widget->getType () == formChoice, NULL);
+
+  tmp = static_cast<FormWidgetChoice*>(field->widget)->getEditChoice ();
+  return tmp ? _poppler_goo_string_to_utf8 (tmp) : NULL;
+}
diff --git a/glib/poppler-form-field.h b/glib/poppler-form-field.h
new file mode 100644 (file)
index 0000000..898e0f6
--- /dev/null
@@ -0,0 +1,111 @@
+/* poppler-form-field.h: glib interface to poppler
+ *
+ * Copyright (C) 2007 Carlos Garcia Campos <carlosgc@gnome.org>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#ifndef __POPPLER_FORM_FIELD_H__
+#define __POPPLER_FORM_FIELD_H__
+
+#include <glib-object.h>
+#include "poppler.h"
+
+G_BEGIN_DECLS
+
+#define POPPLER_TYPE_FORM_FIELD             (poppler_form_field_get_type ())
+#define POPPLER_FORM_FIELD(obj)             (G_TYPE_CHECK_INSTANCE_CAST ((obj), POPPLER_TYPE_FORM_FIELD, PopplerFormField))
+#define POPPLER_IS_FORM_FIELD(obj)          (G_TYPE_CHECK_INSTANCE_TYPE ((obj), POPPLER_TYPE_FORM_FIELD))
+
+typedef enum
+{
+  POPPLER_FORM_FIELD_UNKNOWN,
+  POPPLER_FORM_FIELD_BUTTON,
+  POPPLER_FORM_FIELD_TEXT,
+  POPPLER_FORM_FIELD_CHOICE,
+  POPPLER_FORM_FIELD_SIGNATURE
+} PopplerFormFieldType;
+
+typedef enum
+{
+  POPPLER_FORM_BUTTON_PUSH,
+  POPPLER_FORM_BUTTON_CHECK,
+  POPPLER_FORM_BUTTON_RADIO
+} PopplerFormButtonType;
+
+typedef enum
+{
+  POPPLER_FORM_TEXT_NORMAL,
+  POPPLER_FORM_TEXT_MULTILINE,
+  POPPLER_FORM_TEXT_FILE_SELECT
+} PopplerFormTextType;
+
+typedef enum
+{
+  POPPLER_FORM_CHOICE_COMBO,
+  POPPLER_FORM_CHOICE_LIST
+} PopplerFormChoiceType;
+
+GType                 poppler_form_field_get_type                (void) G_GNUC_CONST;
+
+PopplerFormFieldType  poppler_form_field_get_field_type          (PopplerFormField *field);
+gint                  poppler_form_field_get_id                  (PopplerFormField *field);
+gdouble               poppler_form_field_get_font_size           (PopplerFormField *field);
+gboolean              poppler_form_field_is_read_only            (PopplerFormField *field);
+gchar                *poppler_form_field_get_partial_name        (PopplerFormField *field);
+gchar                *poppler_form_field_get_mapping_name        (PopplerFormField *field);
+gchar                *poppler_form_field_get_name                (PopplerFormField *field);
+PopplerAction        *poppler_form_field_get_action              (PopplerFormField *field);
+
+/* Button Field */
+PopplerFormButtonType poppler_form_field_button_get_button_type  (PopplerFormField *field);
+gboolean              poppler_form_field_button_get_state        (PopplerFormField *field);
+void                  poppler_form_field_button_set_state        (PopplerFormField *field,
+                                                                 gboolean          state);
+
+/* Text Field */
+PopplerFormTextType   poppler_form_field_text_get_text_type      (PopplerFormField *field);
+gchar                *poppler_form_field_text_get_text           (PopplerFormField *field);
+void                  poppler_form_field_text_set_text           (PopplerFormField *field,
+                                                                 const gchar      *text);
+gint                  poppler_form_field_text_get_max_len        (PopplerFormField *field);
+gboolean              poppler_form_field_text_do_spell_check     (PopplerFormField *field);
+gboolean              poppler_form_field_text_do_scroll          (PopplerFormField *field);
+gboolean              poppler_form_field_text_is_rich_text       (PopplerFormField *field);
+gboolean              poppler_form_field_text_is_password        (PopplerFormField *field);
+
+/* Choice Field */
+PopplerFormChoiceType poppler_form_field_choice_get_choice_type  (PopplerFormField *field);
+gboolean              poppler_form_field_choice_is_editable      (PopplerFormField *field);
+gboolean           poppler_form_field_choice_can_select_multiple (PopplerFormField *field);
+gboolean              poppler_form_field_choice_do_spell_check   (PopplerFormField *field);
+gboolean              poppler_form_field_choice_commit_on_change (PopplerFormField *field);
+gint                  poppler_form_field_choice_get_n_items      (PopplerFormField *field);
+gchar                *poppler_form_field_choice_get_item         (PopplerFormField *field,
+                                                                 gint              index);
+gboolean              poppler_form_field_choice_is_item_selected (PopplerFormField *field,
+                                                                 gint              index);
+void                  poppler_form_field_choice_select_item      (PopplerFormField *field,
+                                                                 gint              index);
+void                  poppler_form_field_choice_unselect_all     (PopplerFormField *field);
+void                  poppler_form_field_choice_toggle_item      (PopplerFormField *field,
+                                                                 gint              index);
+void                  poppler_form_field_choice_set_text         (PopplerFormField *field,
+                                                                 const gchar      *text);
+gchar                *poppler_form_field_choice_get_text         (PopplerFormField *field);
+
+G_END_DECLS
+
+#endif /* __POPPLER_FORM_FIELD_H__ */
diff --git a/glib/poppler-layer.cc b/glib/poppler-layer.cc
new file mode 100644 (file)
index 0000000..8a481dd
--- /dev/null
@@ -0,0 +1,223 @@
+/* poppler-layer.cc: glib interface to poppler
+ *
+ * Copyright (C) 2008 Carlos Garcia Campos <carlosgc@gnome.org>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include "poppler-layer.h"
+#include "poppler-private.h"
+
+/**
+ * SECTION:poppler-layer
+ * @short_description: Layers
+ * @title: PopplerLayer
+ */
+
+typedef struct _PopplerLayerClass PopplerLayerClass;
+struct _PopplerLayerClass
+{
+  GObjectClass parent_class;
+};
+
+G_DEFINE_TYPE (PopplerLayer, poppler_layer, G_TYPE_OBJECT)
+
+static void
+poppler_layer_finalize (GObject *object)
+{
+  PopplerLayer *poppler_layer = POPPLER_LAYER (object);
+
+  if (poppler_layer->document)
+    {
+      g_object_unref (poppler_layer->document);
+      poppler_layer->document = NULL;
+    }
+
+  if (poppler_layer->title)
+    {
+      g_free (poppler_layer->title);
+      poppler_layer->title = NULL;
+    }
+  poppler_layer->layer = NULL;
+  poppler_layer->rbgroup = NULL;
+
+  G_OBJECT_CLASS (poppler_layer_parent_class)->finalize (object);
+}
+
+static void
+poppler_layer_init (PopplerLayer *layer)
+{
+}
+
+static void
+poppler_layer_class_init (PopplerLayerClass *klass)
+{
+  GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
+
+  gobject_class->finalize = poppler_layer_finalize;
+}
+
+PopplerLayer *
+_poppler_layer_new (PopplerDocument *document,
+                   Layer           *layer,
+                   GList           *rbgroup)
+{
+  PopplerLayer *poppler_layer;
+  GooString    *layer_name;
+
+  g_return_val_if_fail (POPPLER_IS_DOCUMENT (document), NULL);
+  g_return_val_if_fail (layer != NULL, NULL);
+
+  poppler_layer = POPPLER_LAYER (g_object_new (POPPLER_TYPE_LAYER, NULL));
+
+  poppler_layer->document = (PopplerDocument *)g_object_ref (document);
+  poppler_layer->layer = layer;
+  poppler_layer->rbgroup = rbgroup;
+  layer_name = layer->oc->getName ();
+  poppler_layer->title = layer_name ? _poppler_goo_string_to_utf8 (layer_name) : NULL;
+  
+  return poppler_layer;
+}
+
+/**
+ * poppler_layer_get_title
+ * @layer: a #PopplerLayer
+ *
+ * Returns the name of the layer suitable for
+ * presentation as a title in a viewer's GUI
+ *
+ * Return value: a string containing the title of the layer
+ *
+ * Since: 0.12
+ **/
+const gchar *
+poppler_layer_get_title (PopplerLayer *poppler_layer)
+{
+  g_return_val_if_fail (POPPLER_IS_LAYER (poppler_layer), NULL);
+
+  return poppler_layer->title;
+}
+
+/**
+ * poppler_layer_is_visible
+ * @layer: a #PopplerLayer
+ *
+ * Returns whether @layer is visible
+ *
+ * Return value: %TRUE if @layer is visible
+ *
+ * Since: 0.12
+ **/
+gboolean
+poppler_layer_is_visible (PopplerLayer *poppler_layer)
+{
+  g_return_val_if_fail (POPPLER_IS_LAYER (poppler_layer), FALSE);
+
+  return poppler_layer->layer->oc->getState () == OptionalContentGroup::On;
+}
+
+/**
+ * poppler_layer_show
+ * @layer: a #PopplerLayer
+ *
+ * Shows @layer
+ *
+ * Since: 0.12
+ **/
+void
+poppler_layer_show (PopplerLayer *poppler_layer)
+{
+  GList *l;
+  Layer *layer;
+  
+  g_return_if_fail (POPPLER_IS_LAYER (poppler_layer));
+
+  layer = poppler_layer->layer;
+
+  if (layer->oc->getState () == OptionalContentGroup::On)
+    return;
+  
+  layer->oc->setState (OptionalContentGroup::On);
+  
+  for (l = poppler_layer->rbgroup; l && l->data; l = g_list_next (l)) {
+    OptionalContentGroup *oc = (OptionalContentGroup *)l->data;
+
+    if (oc != layer->oc)
+      oc->setState (OptionalContentGroup::Off);
+  }
+}
+
+/**
+ * poppler_layer_hide
+ * @layer: a #PopplerLayer
+ *
+ * Hides @layer. If @layer is the parent of other nested layers,
+ * such layers will be also hidden and will be blocked until @layer
+ * is shown again
+ *
+ * Since: 0.12
+ **/
+void
+poppler_layer_hide (PopplerLayer *poppler_layer)
+{
+  Layer *layer;
+  
+  g_return_if_fail (POPPLER_IS_LAYER (poppler_layer));
+
+  layer = poppler_layer->layer;
+  
+  if (layer->oc->getState () == OptionalContentGroup::Off)
+    return;
+  
+  layer->oc->setState (OptionalContentGroup::Off);
+}
+
+
+/**
+ * poppler_layer_is_parent
+ * @layer: a #PopplerLayer
+ *
+ * Returns whether @layer is parent of other nested layers.
+ *
+ * Return value: %TRUE if @layer is a parent layer
+ *
+ * Since: 0.12
+ **/
+gboolean
+poppler_layer_is_parent (PopplerLayer *poppler_layer)
+{
+  g_return_val_if_fail (POPPLER_IS_LAYER (poppler_layer), FALSE);
+
+  return poppler_layer->layer->kids != NULL;
+}
+
+/**
+ * poppler_layer_get_radio_button_group_id
+ * @layer: a #PopplerLayer
+ *
+ * Returns the numeric ID the radio button group associated with @layer.
+ *
+ * Return value: the ID of the radio button group associated with @layer,
+ * or 0 if the layer is not associated to any radio button group
+ *
+ * Since: 0.12
+ **/
+gint 
+poppler_layer_get_radio_button_group_id (PopplerLayer *poppler_layer)
+{
+  g_return_val_if_fail (POPPLER_IS_LAYER (poppler_layer), FALSE);
+
+  return GPOINTER_TO_INT (poppler_layer->rbgroup);
+}
diff --git a/glib/poppler-layer.h b/glib/poppler-layer.h
new file mode 100644 (file)
index 0000000..2434e27
--- /dev/null
@@ -0,0 +1,43 @@
+/* poppler-layer.h: glib interface to poppler
+ *
+ * Copyright (C) 2008 Carlos Garcia Campos <carlosgc@gnome.org>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#ifndef __POPPLER_LAYER_H__
+#define __POPPLER_LAYER_H__
+
+#include <glib-object.h>
+#include "poppler.h"
+
+G_BEGIN_DECLS
+
+#define POPPLER_TYPE_LAYER    (poppler_layer_get_type ())
+#define POPPLER_LAYER(obj)    (G_TYPE_CHECK_INSTANCE_CAST ((obj), POPPLER_TYPE_LAYER, PopplerLayer))
+#define POPPLER_IS_LAYER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), POPPLER_TYPE_LAYER))
+
+GType        poppler_layer_get_type                  (void) G_GNUC_CONST;
+
+const gchar *poppler_layer_get_title                 (PopplerLayer *layer);
+gboolean     poppler_layer_is_visible                (PopplerLayer *layer);
+void         poppler_layer_show                      (PopplerLayer *layer);
+void         poppler_layer_hide                      (PopplerLayer *layer);
+gboolean     poppler_layer_is_parent                 (PopplerLayer *layer);
+gint         poppler_layer_get_radio_button_group_id (PopplerLayer *layer);
+
+G_END_DECLS
+
+#endif /* __POPPLER_LAYER_H__ */
diff --git a/glib/poppler-media.cc b/glib/poppler-media.cc
new file mode 100644 (file)
index 0000000..5712371
--- /dev/null
@@ -0,0 +1,318 @@
+/* poppler-media.cc: glib interface to MediaRendition
+ *
+ * Copyright (C) 2010 Carlos Garcia Campos <carlosgc@gnome.org>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include "config.h"
+
+#include <errno.h>
+#include <glib/gstdio.h>
+
+#include "poppler-media.h"
+#include "poppler-private.h"
+
+/**
+ * SECTION: poppler-media
+ * @short_description: Media
+ * @title: PopplerMedia
+ */
+
+typedef struct _PopplerMediaClass PopplerMediaClass;
+
+struct _PopplerMedia
+{
+  GObject   parent_instance;
+
+  gchar  *filename;
+
+  gchar  *mime_type;
+  Stream *stream;
+};
+
+struct _PopplerMediaClass
+{
+  GObjectClass parent_class;
+};
+
+G_DEFINE_TYPE (PopplerMedia, poppler_media, G_TYPE_OBJECT);
+
+static void
+poppler_media_finalize (GObject *object)
+{
+  PopplerMedia *media = POPPLER_MEDIA(object);
+
+  if (media->filename) {
+    g_free (media->filename);
+    media->filename = NULL;
+  }
+
+  if (media->mime_type) {
+    g_free (media->mime_type);
+    media->mime_type = NULL;
+  }
+
+  if (media->stream) {
+    media->stream->decRef();
+    media->stream = NULL;
+  }
+
+  G_OBJECT_CLASS (poppler_media_parent_class)->finalize (object);
+}
+
+static void
+poppler_media_class_init (PopplerMediaClass *klass)
+{
+  GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
+
+  gobject_class->finalize = poppler_media_finalize;
+}
+
+static void
+poppler_media_init (PopplerMedia *media)
+{
+}
+
+PopplerMedia *
+_poppler_media_new (MediaRendition *poppler_media)
+{
+  PopplerMedia *media;
+
+  g_assert (poppler_media != NULL);
+
+  media = POPPLER_MEDIA (g_object_new (POPPLER_TYPE_MEDIA, NULL));
+
+  if (poppler_media->getIsEmbedded()) {
+    GooString* mime_type;
+
+    media->stream = poppler_media->getEmbbededStream();
+    mime_type = poppler_media->getContentType();
+    if (mime_type)
+      media->mime_type = g_strdup (mime_type->getCString());
+  } else {
+    media->filename = g_strdup (poppler_media->getFileName()->getCString());
+  }
+
+  return media;
+}
+
+/**
+* poppler_media_get_filename:
+* @poppler_media: a #PopplerMedia
+*
+* Returns the media clip filename, in case of non-embedded media. filename might be
+* a local relative or absolute path or a URI
+*
+* Return value: a filename, return value is owned by #PopplerMedia and should not be freed
+*
+* Since: 0.14
+*/
+const gchar *
+poppler_media_get_filename (PopplerMedia *poppler_media)
+{
+  g_return_val_if_fail (POPPLER_IS_MEDIA (poppler_media), NULL);
+  g_return_val_if_fail (poppler_media->stream == NULL, NULL);
+
+  return poppler_media->filename;
+}
+
+/**
+ * poppler_media_is_embedded:
+ * @poppler_media: a #PopplerMedia
+ *
+ * Whether the media clip is embedded in the PDF. If the result is %TRUE, the embedded stream
+ * can be saved with poppler_media_save() or poppler_media_save_to_callback() function.
+ * If the result is %FALSE, the media clip filename can be retrieved with
+ * poppler_media_get_filename() function.
+ *
+ * Return value: %TRUE if media clip is embedded, %FALSE otherwise
+ *
+ * Since: 0.14
+ */
+gboolean
+poppler_media_is_embedded (PopplerMedia *poppler_media)
+{
+  g_return_val_if_fail (POPPLER_IS_MEDIA (poppler_media), FALSE);
+
+  return poppler_media->stream != NULL;
+}
+
+/**
+ * poppler_media_get_mime_type:
+ * @poppler_media: a #PopplerMedia
+ *
+ * Returns the media clip mime-type
+ *
+ * Return value: the mime-type, return value is owned by #PopplerMedia and should not be freed
+ *
+ * Since: 0.14
+ */
+const gchar *
+poppler_media_get_mime_type (PopplerMedia *poppler_media)
+{
+  g_return_val_if_fail (POPPLER_IS_MEDIA (poppler_media), NULL);
+
+  return poppler_media->mime_type;
+}
+
+static gboolean
+save_helper (const gchar  *buf,
+            gsize         count,
+            gpointer      data,
+            GError      **error)
+{
+  FILE *f = (FILE *) data;
+  gsize n;
+
+  n = fwrite (buf, 1, count, f);
+  if (n != count)
+    {
+      g_set_error (error,
+                  G_FILE_ERROR,
+                  g_file_error_from_errno (errno),
+                  "Error writing to media file: %s",
+                  g_strerror (errno));
+      return FALSE;
+    }
+
+  return TRUE;
+}
+
+/**
+ * poppler_media_save:
+ * @poppler_media: a #PopplerMedia
+ * @filename: name of file to save
+ * @error: (allow-none): return location for error, or %NULL.
+ *
+ * Saves embedded stream of @poppler_media to a file indicated by @filename.
+ * If @error is set, %FALSE will be returned.
+ * Possible errors include those in the #G_FILE_ERROR domain
+ * and whatever the save function generates.
+ *
+ * Return value: %TRUE, if the file successfully saved
+ *
+ * Since: 0.14
+ */
+gboolean
+poppler_media_save (PopplerMedia *poppler_media,
+                   const char   *filename,
+                   GError      **error)
+{
+  gboolean result;
+  FILE *f;
+
+  g_return_val_if_fail (POPPLER_IS_MEDIA (poppler_media), FALSE);
+  g_return_val_if_fail (poppler_media->stream != NULL, FALSE);
+
+  f = g_fopen (filename, "wb");
+
+  if (f == NULL)
+    {
+      gchar *display_name = g_filename_display_name (filename);
+      g_set_error (error,
+                  G_FILE_ERROR,
+                  g_file_error_from_errno (errno),
+                  "Failed to open '%s' for writing: %s",
+                  display_name,
+                  g_strerror (errno));
+      g_free (display_name);
+      return FALSE;
+    }
+
+  result = poppler_media_save_to_callback (poppler_media, save_helper, f, error);
+
+  if (fclose (f) < 0)
+    {
+      gchar *display_name = g_filename_display_name (filename);
+      g_set_error (error,
+                  G_FILE_ERROR,
+                  g_file_error_from_errno (errno),
+                  "Failed to close '%s', all data may not have been saved: %s",
+                  display_name,
+                  g_strerror (errno));
+      g_free (display_name);
+      return FALSE;
+    }
+
+  return result;
+}
+
+#define BUF_SIZE 1024
+
+/**
+ * poppler_media_save_to_callback:
+ * @poppler_media: a #PopplerMedia
+ * @save_func: (scope call): a function that is called to save each block of data that the save routine generates.
+ * @user_data: user data to pass to the save function.
+ * @error: (allow-none): return location for error, or %NULL.
+ *
+ * Saves embedded stream of @poppler_media by feeding the produced data to @save_func. Can be used
+ * when you want to store the media clip stream to something other than a file, such as
+ * an in-memory buffer or a socket. If @error is set, %FALSE will be
+ * returned. Possible errors include those in the #G_FILE_ERROR domain and
+ * whatever the save function generates.
+ *
+ * Return value: %TRUE, if the save successfully completed
+ *
+ * Since: 0.14
+ */
+gboolean
+poppler_media_save_to_callback (PopplerMedia        *poppler_media,
+                               PopplerMediaSaveFunc save_func,
+                               gpointer             user_data,
+                               GError             **error)
+{
+  Stream *stream;
+  gchar buf[BUF_SIZE];
+  int i;
+  gboolean eof_reached = FALSE;
+
+  g_return_val_if_fail (POPPLER_IS_MEDIA (poppler_media), FALSE);
+  g_return_val_if_fail (poppler_media->stream != NULL, FALSE);
+
+  stream = poppler_media->stream;
+  stream->reset();
+
+  do
+    {
+      int data;
+
+      for (i = 0; i < BUF_SIZE; i++)
+       {
+         data = stream->getChar ();
+         if (data == EOF)
+           {
+             eof_reached = TRUE;
+             break;
+           }
+         buf[i] = data;
+       }
+
+      if (i > 0)
+       {
+         if (! (save_func) (buf, i, user_data, error))
+           {
+             stream->close ();
+             return FALSE;
+           }
+       }
+    }
+  while (! eof_reached);
+
+  stream->close ();
+
+  return TRUE;
+}
diff --git a/glib/poppler-media.h b/glib/poppler-media.h
new file mode 100644 (file)
index 0000000..f324e1b
--- /dev/null
@@ -0,0 +1,73 @@
+/* poppler-media.h: glib interface to MediaRendition
+ *
+ * Copyright (C) 2010 Carlos Garcia Campos <carlosgc@gnome.org>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#ifndef __POPPLER_MEDIA_H__
+#define __POPPLER_MEDIA_H__
+
+#include <glib-object.h>
+#include "poppler.h"
+
+G_BEGIN_DECLS
+
+#define POPPLER_TYPE_MEDIA                   (poppler_media_get_type ())
+#define POPPLER_MEDIA(obj)                   (G_TYPE_CHECK_INSTANCE_CAST ((obj), POPPLER_TYPE_MEDIA, PopplerMedia))
+#define POPPLER_IS_MEDIA(obj)                (G_TYPE_CHECK_INSTANCE_TYPE ((obj), POPPLER_TYPE_MEDIA))
+
+// FIXME: this should be generic (PopplerSaveToCallbackFunc)
+
+/**
+ * PopplerMediaSaveFunc:
+ * @buf: (array length=count) (element-type guint8): buffer containing
+ *   bytes to be written.
+ * @count: number of bytes in @buf.
+ * @data: (closure): user data passed to poppler_media_save_to_callback()
+ * @error: GError to set on error, or %NULL
+ *
+ * Specifies the type of the function passed to
+ * poppler_media_save_to_callback().  It is called once for each block of
+ * bytes that is "written" by poppler_media_save_to_callback().  If
+ * successful it should return %TRUE.  If an error occurs it should set
+ * @error and return %FALSE, in which case poppler_media_save_to_callback()
+ * will fail with the same error.
+ *
+ * Returns: %TRUE if successful, %FALSE (with @error set) if failed.
+ *
+ * Since: 0.14
+ */
+typedef gboolean (*PopplerMediaSaveFunc) (const gchar  *buf,
+                                         gsize         count,
+                                         gpointer      data,
+                                         GError      **error);
+
+GType        poppler_media_get_type         (void) G_GNUC_CONST;
+gboolean     poppler_media_is_embedded      (PopplerMedia        *poppler_media);
+const gchar *poppler_media_get_filename     (PopplerMedia        *poppler_media);
+const gchar *poppler_media_get_mime_type    (PopplerMedia        *poppler_media);
+gboolean     poppler_media_save             (PopplerMedia        *poppler_media,
+                                            const char          *filename,
+                                            GError             **error);
+gboolean     poppler_media_save_to_callback (PopplerMedia        *poppler_media,
+                                            PopplerMediaSaveFunc save_func,
+                                            gpointer             user_data,
+                                            GError             **error);
+
+G_END_DECLS
+
+#endif /* __POPPLER_MEDIA_H__ */
+
diff --git a/glib/poppler-movie.cc b/glib/poppler-movie.cc
new file mode 100644 (file)
index 0000000..cb5a2ad
--- /dev/null
@@ -0,0 +1,152 @@
+/* poppler-movie.cc: glib interface to Movie
+ *
+ * Copyright (C) 2010 Carlos Garcia Campos <carlosgc@gnome.org>
+ * Copyright (C) 2008 Hugo Mercier <hmercier31[@]gmail.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include "poppler-movie.h"
+#include "poppler-private.h"
+
+/**
+ * SECTION: poppler-movie
+ * @short_description: Movies
+ * @title: PopplerMovie
+ */
+
+typedef struct _PopplerMovieClass PopplerMovieClass;
+
+struct _PopplerMovie
+{
+  GObject   parent_instance;
+
+  gchar   *filename;
+  gboolean need_poster;
+  gboolean show_controls;
+};
+
+struct _PopplerMovieClass
+{
+  GObjectClass parent_class;
+};
+
+G_DEFINE_TYPE (PopplerMovie, poppler_movie, G_TYPE_OBJECT);
+
+static void
+poppler_movie_finalize (GObject *object)
+{
+  PopplerMovie* movie = POPPLER_MOVIE(object);
+
+  if (movie->filename) {
+    g_free (movie->filename);
+    movie->filename = NULL;
+  }
+
+  G_OBJECT_CLASS (poppler_movie_parent_class)->finalize (object);
+}
+
+static void
+poppler_movie_class_init (PopplerMovieClass *klass)
+{
+  GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
+
+  gobject_class->finalize = poppler_movie_finalize;
+}
+
+static void
+poppler_movie_init (PopplerMovie *movie)
+{
+}
+
+PopplerMovie *
+_poppler_movie_new (Movie *poppler_movie)
+{
+  PopplerMovie *movie;
+
+  g_assert (poppler_movie != NULL);
+
+  movie = POPPLER_MOVIE (g_object_new (POPPLER_TYPE_MOVIE, NULL));
+
+  movie->filename = g_strdup (poppler_movie->getFileName()->getCString());
+  if (poppler_movie->getShowPoster()) {
+    Object tmp;
+
+    poppler_movie->getPoster(&tmp);
+    movie->need_poster = (!tmp.isRef() && !tmp.isStream());
+    tmp.free();
+  }
+
+  movie->show_controls = poppler_movie->getActivationParameters()->showControls;
+
+  return movie;
+}
+
+/**
+* poppler_movie_get_filename:
+* @poppler_movie: a #PopplerMovie
+*
+* Returns the local filename identifying a self-describing movie file
+*
+* Return value: a local filename, return value is owned by #PopplerMovie and
+*               should not be freed
+*
+* Since: 0.14
+*/
+const gchar *
+poppler_movie_get_filename (PopplerMovie *poppler_movie)
+{
+  g_return_val_if_fail (POPPLER_IS_MOVIE (poppler_movie), NULL);
+
+  return poppler_movie->filename;
+}
+
+/**
+ * poppler_movie_need_poster:
+ * @poppler_movie: a #PopplerMovie
+ *
+ * Returns whether a poster image representing the Movie
+ * shall be displayed. The poster image must be retrieved
+ * from the movie file.
+ *
+ * Return value: %TRUE if move needs a poster image, %FALSE otherwise
+ *
+ * Since: 0.14
+ */
+gboolean
+poppler_movie_need_poster (PopplerMovie *poppler_movie)
+{
+  g_return_val_if_fail (POPPLER_IS_MOVIE (poppler_movie), FALSE);
+
+  return poppler_movie->need_poster;
+}
+
+/**
+ * poppler_movie_show_controls:
+ * @poppler_movie: a #PopplerMovie
+ *
+ * Returns whether to display a movie controller bar while playing the movie
+ *
+ * Return value: %TRUE if controller bar should be displayed, %FALSE otherwise
+ *
+ * Since: 0.14
+ */
+gboolean
+poppler_movie_show_controls (PopplerMovie *poppler_movie)
+{
+  g_return_val_if_fail (POPPLER_IS_MOVIE (poppler_movie), FALSE);
+
+  return poppler_movie->show_controls;
+}
diff --git a/glib/poppler-movie.h b/glib/poppler-movie.h
new file mode 100644 (file)
index 0000000..9e1bc32
--- /dev/null
@@ -0,0 +1,42 @@
+/* poppler-movie.h: glib interface to Movie
+ *
+ * Copyright (C) 2010 Carlos Garcia Campos <carlosgc@gnome.org>
+ * Copyright (C) 2008 Hugo Mercier <hmercier31[@]gmail.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#ifndef __POPPLER_MOVIE_H__
+#define __POPPLER_MOVIE_H__
+
+#include <glib-object.h>
+#include "poppler.h"
+
+G_BEGIN_DECLS
+
+#define POPPLER_TYPE_MOVIE                   (poppler_movie_get_type ())
+#define POPPLER_MOVIE(obj)                   (G_TYPE_CHECK_INSTANCE_CAST ((obj), POPPLER_TYPE_MOVIE, PopplerMovie))
+#define POPPLER_IS_MOVIE(obj)                (G_TYPE_CHECK_INSTANCE_TYPE ((obj), POPPLER_TYPE_MOVIE))
+
+
+GType        poppler_movie_get_type      (void) G_GNUC_CONST;
+const gchar *poppler_movie_get_filename  (PopplerMovie *poppler_movie);
+gboolean     poppler_movie_need_poster   (PopplerMovie *poppler_movie);
+gboolean     poppler_movie_show_controls (PopplerMovie *poppler_movie);
+
+G_END_DECLS
+
+#endif /* __POPPLER_MOVIE_H__ */
+
diff --git a/glib/poppler-page.cc b/glib/poppler-page.cc
new file mode 100644 (file)
index 0000000..156e2d7
--- /dev/null
@@ -0,0 +1,2108 @@
+/* poppler-page.cc: glib wrapper for poppler
+ * Copyright (C) 2005, Red Hat, Inc.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include "config.h"
+#include <math.h>
+
+#ifndef __GI_SCANNER__
+#include <goo/GooList.h>
+#include <GlobalParams.h>
+#include <PDFDoc.h>
+#include <Outline.h>
+#include <ErrorCodes.h>
+#include <UnicodeMap.h>
+#include <GfxState.h>
+#include <PageTransition.h>
+#endif
+
+#include "poppler.h"
+#include "poppler-private.h"
+
+/**
+ * SECTION:poppler-page
+ * @short_description: Information about a page in a document
+ * @title: PopplerPage
+ */
+
+enum
+{
+  PROP_0,
+  PROP_LABEL
+};
+
+typedef struct _PopplerPageClass PopplerPageClass;
+struct _PopplerPageClass
+{
+  GObjectClass parent_class;
+};
+
+G_DEFINE_TYPE (PopplerPage, poppler_page, G_TYPE_OBJECT)
+
+PopplerPage *
+_poppler_page_new (PopplerDocument *document, Page *page, int index)
+{
+  PopplerPage *poppler_page;
+
+  g_return_val_if_fail (POPPLER_IS_DOCUMENT (document), NULL);
+
+  poppler_page = (PopplerPage *) g_object_new (POPPLER_TYPE_PAGE, NULL, NULL);
+  poppler_page->document = (PopplerDocument *) g_object_ref (document);
+  poppler_page->page = page;
+  poppler_page->index = index;
+
+  return poppler_page;
+}
+
+static void
+poppler_page_finalize (GObject *object)
+{
+  PopplerPage *page = POPPLER_PAGE (object);
+
+  g_object_unref (page->document);
+  page->document = NULL;
+
+  if (page->text != NULL) 
+    page->text->decRefCnt();
+  /* page->page is owned by the document */
+}
+
+/**
+ * poppler_page_get_size:
+ * @page: A #PopplerPage
+ * @width: (out) (allow-none): return location for the width of @page
+ * @height: (out) (allow-none): return location for the height of @page
+ * 
+ * Gets the size of @page at the current scale and rotation.
+ **/
+void
+poppler_page_get_size (PopplerPage *page,
+                      double      *width,
+                      double      *height)
+{
+  double page_width, page_height;
+  int rotate;
+
+  g_return_if_fail (POPPLER_IS_PAGE (page));
+
+  rotate = page->page->getRotate ();
+  if (rotate == 90 || rotate == 270) {
+    page_height = page->page->getCropWidth ();
+    page_width = page->page->getCropHeight ();
+  } else {
+    page_width = page->page->getCropWidth ();
+    page_height = page->page->getCropHeight ();
+  }
+
+  if (width != NULL)
+    *width = page_width;
+  if (height != NULL)
+    *height = page_height;
+}
+
+/**
+ * poppler_page_get_index:
+ * @page: a #PopplerPage
+ * 
+ * Returns the index of @page
+ * 
+ * Return value: index value of @page
+ **/
+int
+poppler_page_get_index (PopplerPage *page)
+{
+  g_return_val_if_fail (POPPLER_IS_PAGE (page), 0);
+
+  return page->index;
+}
+
+/**
+ * poppler_page_get_label:
+ * @page: a #PopplerPage
+ *
+ * Returns the label of @page. Note that page labels
+ * and page indices might not coincide.
+ *
+ * Return value: a new allocated string containing the label of @page,
+ *               or %NULL if @page doesn't have a label
+ *
+ * Since: 0.16
+ **/
+gchar *
+poppler_page_get_label (PopplerPage *page)
+{
+  GooString label;
+
+  g_return_val_if_fail (POPPLER_IS_PAGE (page), NULL);
+
+  page->document->doc->getCatalog ()->indexToLabel (page->index, &label);
+  return _poppler_goo_string_to_utf8 (&label);
+}
+
+/**
+ * poppler_page_get_duration:
+ * @page: a #PopplerPage
+ *
+ * Returns the duration of @page
+ *
+ * Return value: duration in seconds of @page or -1.
+ **/
+double
+poppler_page_get_duration (PopplerPage *page)
+{
+  g_return_val_if_fail (POPPLER_IS_PAGE (page), -1);
+
+  return page->page->getDuration ();
+}
+
+/**
+ * poppler_page_get_transition:
+ * @page: a #PopplerPage
+ *
+ * Returns the transition effect of @page
+ *
+ * Return value: a #PopplerPageTransition or %NULL.
+ **/
+PopplerPageTransition *
+poppler_page_get_transition (PopplerPage *page)
+{
+  PageTransition *trans;
+  PopplerPageTransition *transition;
+  Object obj;
+  
+  g_return_val_if_fail (POPPLER_IS_PAGE (page), NULL);
+
+  trans = new PageTransition (page->page->getTrans (&obj));
+  obj.free ();
+
+  if (!trans->isOk ()) {
+    delete trans;
+    return NULL;
+  }
+
+  transition = poppler_page_transition_new ();
+
+  switch (trans->getType ())
+    {
+      case transitionReplace:
+        transition->type = POPPLER_PAGE_TRANSITION_REPLACE;
+       break;
+      case transitionSplit:
+       transition->type = POPPLER_PAGE_TRANSITION_SPLIT;
+       break;
+      case transitionBlinds:
+        transition->type = POPPLER_PAGE_TRANSITION_BLINDS;
+       break;
+      case transitionBox:
+        transition->type = POPPLER_PAGE_TRANSITION_BOX;
+       break;
+      case transitionWipe:
+        transition->type = POPPLER_PAGE_TRANSITION_WIPE;
+       break;
+      case transitionDissolve:
+        transition->type = POPPLER_PAGE_TRANSITION_DISSOLVE;
+       break;
+      case transitionGlitter:
+        transition->type = POPPLER_PAGE_TRANSITION_GLITTER;
+       break;
+      case transitionFly:
+        transition->type = POPPLER_PAGE_TRANSITION_FLY;
+       break;
+      case transitionPush:
+        transition->type = POPPLER_PAGE_TRANSITION_PUSH;
+       break;
+      case transitionCover:
+        transition->type = POPPLER_PAGE_TRANSITION_COVER;
+       break;
+      case transitionUncover:
+        transition->type = POPPLER_PAGE_TRANSITION_UNCOVER;
+        break;
+      case transitionFade:
+        transition->type = POPPLER_PAGE_TRANSITION_FADE;
+       break;
+      default:
+        g_assert_not_reached ();
+    }
+
+  transition->alignment = (trans->getAlignment() == transitionHorizontal) ?
+         POPPLER_PAGE_TRANSITION_HORIZONTAL :
+         POPPLER_PAGE_TRANSITION_VERTICAL;
+
+  transition->direction = (trans->getDirection() == transitionInward) ?
+         POPPLER_PAGE_TRANSITION_INWARD :
+         POPPLER_PAGE_TRANSITION_OUTWARD;
+
+  transition->duration = trans->getDuration();
+  transition->angle = trans->getAngle();
+  transition->scale = trans->getScale();
+  transition->rectangular = trans->isRectangular();
+  
+  delete trans;
+  
+  return transition;
+}
+
+static TextPage *
+poppler_page_get_text_page (PopplerPage *page)
+{
+  if (page->text == NULL) {
+    TextOutputDev *text_dev;
+    Gfx           *gfx;
+
+    text_dev = new TextOutputDev (NULL, gTrue, 0, gFalse, gFalse);
+    gfx = page->page->createGfx(text_dev,
+                               72.0, 72.0, 0,
+                               gFalse, /* useMediaBox */
+                               gTrue, /* Crop */
+                               -1, -1, -1, -1,
+                               gFalse, /* printing */
+                               NULL, NULL);
+    page->page->display(gfx);
+    text_dev->endPage();
+
+    page->text = text_dev->takeText();
+    delete gfx;
+    delete text_dev;
+  }
+
+  return page->text;
+}
+
+static gboolean
+annot_is_markup (Annot *annot)
+{
+  switch (annot->getType())
+    {
+      case Annot::typeLink:
+      case Annot::typePopup:
+      case Annot::typeMovie:
+      case Annot::typeScreen:
+      case Annot::typePrinterMark:
+      case Annot::typeTrapNet:
+      case Annot::typeWatermark:
+      case Annot::type3D:
+      case Annot::typeWidget:
+        return FALSE;
+      default:
+        return TRUE;
+    }
+}
+
+static GBool
+poppler_print_annot_cb (Annot *annot, void *user_data)
+{
+  PopplerPrintFlags user_print_flags = (PopplerPrintFlags)GPOINTER_TO_INT (user_data);
+
+  if (annot->getFlags () & Annot::flagHidden)
+    return gFalse;
+
+  if (user_print_flags & POPPLER_PRINT_STAMP_ANNOTS_ONLY) {
+    return (annot->getType() == Annot::typeStamp) ?
+            (annot->getFlags () & Annot::flagPrint) :
+            (annot->getType() == Annot::typeWidget);
+  }
+
+  if (user_print_flags & POPPLER_PRINT_MARKUP_ANNOTS) {
+    return annot_is_markup (annot) ?
+            (annot->getFlags () & Annot::flagPrint) :
+            (annot->getType() == Annot::typeWidget);
+  }
+
+  /* Print document only, form fields are always printed */
+  return (annot->getType() == Annot::typeWidget);
+}
+
+static void
+_poppler_page_render (PopplerPage      *page,
+                     cairo_t          *cairo,
+                     GBool             printing,
+                      PopplerPrintFlags print_flags)
+{
+  CairoOutputDev *output_dev;
+
+  g_return_if_fail (POPPLER_IS_PAGE (page));
+
+  output_dev = page->document->output_dev;
+  output_dev->setCairo (cairo);
+  output_dev->setPrinting (printing);
+
+  if (!printing)
+    output_dev->setTextPage (page->text);
+
+  /* NOTE: instead of passing -1 we should/could use cairo_clip_extents()
+   * to get a bounding box */
+  cairo_save (cairo);
+  page->page->displaySlice(output_dev,
+                          72.0, 72.0, 0,
+                          gFalse, /* useMediaBox */
+                          gTrue, /* Crop */
+                          -1, -1,
+                          -1, -1,
+                          printing,
+                          NULL, NULL,
+                          printing ? poppler_print_annot_cb : NULL,
+                           printing ? GINT_TO_POINTER ((gint)print_flags) : NULL);
+  cairo_restore (cairo);
+
+  output_dev->setCairo (NULL);
+  output_dev->setTextPage (NULL);
+}
+
+/**
+ * poppler_page_render:
+ * @page: the page to render from
+ * @cairo: cairo context to render to
+ *
+ * Render the page to the given cairo context. This function
+ * is for rendering a page that will be displayed. If you want
+ * to render a page that will be printed use
+ * poppler_page_render_for_printing() instead
+ **/
+void
+poppler_page_render (PopplerPage *page,
+                    cairo_t *cairo)
+{
+  g_return_if_fail (POPPLER_IS_PAGE (page));
+
+  if (!page->text)
+    page->text = new TextPage(gFalse);
+
+  _poppler_page_render (page, cairo, gFalse, (PopplerPrintFlags)0);
+}
+
+/**
+ * poppler_page_render_for_printing_with_options:
+ * @page: the page to render from
+ * @cairo: cairo context to render to
+ * @options: print options
+ *
+ * Render the page to the given cairo context for printing
+ * with the specified options
+ *
+ * Since: 0.16
+ **/
+void
+poppler_page_render_for_printing_with_options (PopplerPage      *page,
+                                               cairo_t          *cairo,
+                                               PopplerPrintFlags options)
+{
+  g_return_if_fail (POPPLER_IS_PAGE (page));
+
+  _poppler_page_render (page, cairo, gTrue, options);
+}
+
+/**
+ * poppler_page_render_for_printing:
+ * @page: the page to render from
+ * @cairo: cairo context to render to
+ *
+ * Render the page to the given cairo context for printing.
+ **/
+void
+poppler_page_render_for_printing (PopplerPage *page,
+                                 cairo_t *cairo)
+{
+  g_return_if_fail (POPPLER_IS_PAGE (page));
+
+  _poppler_page_render (page, cairo, gTrue, POPPLER_PRINT_ALL);
+}
+
+static cairo_surface_t *
+create_surface_from_thumbnail_data (guchar *data,
+                                   gint    width,
+                                   gint    height,
+                                   gint    rowstride)
+{
+  guchar *cairo_pixels;
+  gint cairo_stride;
+  cairo_surface_t *surface;
+  int j;
+
+  surface = cairo_image_surface_create (CAIRO_FORMAT_RGB24, width, height);
+  if (cairo_surface_status (surface))
+    return NULL;
+
+  cairo_pixels = cairo_image_surface_get_data (surface);
+  cairo_stride = cairo_image_surface_get_stride (surface);
+
+  for (j = height; j; j--) {
+    guchar *p = data;
+    guchar *q = cairo_pixels;
+    guchar *end = p + 3 * width;
+
+    while (p < end) {
+#if G_BYTE_ORDER == G_LITTLE_ENDIAN
+      q[0] = p[2];
+      q[1] = p[1];
+      q[2] = p[0];
+#else
+      q[1] = p[0];
+      q[2] = p[1];
+      q[3] = p[2];
+#endif
+      p += 3;
+      q += 4;
+    }
+
+    data += rowstride;
+    cairo_pixels += cairo_stride;
+  }
+
+  return surface;
+}
+                                   
+
+/**
+ * poppler_page_get_thumbnail:
+ * @page: the #PopplerPage to get the thumbnail for
+ * 
+ * Get the embedded thumbnail for the specified page.  If the document
+ * doesn't have an embedded thumbnail for the page, this function
+ * returns %NULL.
+ * 
+ * Return value: the tumbnail as a cairo_surface_t or %NULL if the document
+ * doesn't have a thumbnail for this page.
+ **/
+cairo_surface_t *
+poppler_page_get_thumbnail (PopplerPage *page)
+{
+  unsigned char *data;
+  int width, height, rowstride;
+  cairo_surface_t *surface;
+
+  g_return_val_if_fail (POPPLER_IS_PAGE (page), NULL);
+
+  if (!page->page->loadThumb (&data, &width, &height, &rowstride))
+    return NULL;
+
+  surface = create_surface_from_thumbnail_data (data, width, height, rowstride);
+  gfree (data);
+  
+  return surface;
+}
+
+/**
+ * poppler_page_render_selection:
+ * @page: the #PopplerPage for which to render selection
+ * @cairo: cairo context to render to
+ * @selection: start and end point of selection as a rectangle
+ * @old_selection: previous selection
+ * @style: a #PopplerSelectionStyle
+ * @glyph_color: color to use for drawing glyphs
+ * @background_color: color to use for the selection background
+ *
+ * Render the selection specified by @selection for @page to
+ * the given cairo context.  The selection will be rendered, using
+ * @glyph_color for the glyphs and @background_color for the selection
+ * background.
+ *
+ * If non-NULL, @old_selection specifies the selection that is already
+ * rendered to @cairo, in which case this function will (some day)
+ * only render the changed part of the selection.
+ **/
+void
+poppler_page_render_selection (PopplerPage           *page,
+                              cairo_t               *cairo,
+                              PopplerRectangle      *selection,
+                              PopplerRectangle      *old_selection,
+                              PopplerSelectionStyle  style, 
+                              PopplerColor          *glyph_color,
+                              PopplerColor          *background_color)
+{
+  CairoOutputDev *output_dev;
+  TextPage *text;
+  SelectionStyle selection_style = selectionStyleGlyph;
+  PDFRectangle pdf_selection(selection->x1, selection->y1,
+                            selection->x2, selection->y2);
+
+  GfxColor gfx_background_color = {
+      {
+         background_color->red,
+         background_color->green,
+         background_color->blue
+      }
+  };
+  GfxColor gfx_glyph_color = {
+      {
+         glyph_color->red,
+         glyph_color->green,
+         glyph_color->blue
+      }
+  };
+
+  switch (style)
+    {
+      case POPPLER_SELECTION_GLYPH:
+        selection_style = selectionStyleGlyph;
+       break;
+      case POPPLER_SELECTION_WORD:
+        selection_style = selectionStyleWord;
+       break;
+      case POPPLER_SELECTION_LINE:
+        selection_style = selectionStyleLine;
+       break;
+    }
+
+  output_dev = page->document->output_dev;
+  output_dev->setCairo (cairo);
+
+  text = poppler_page_get_text_page (page);
+  text->drawSelection (output_dev, 1.0, 0,
+                      &pdf_selection, selection_style,
+                      &gfx_glyph_color, &gfx_background_color);
+
+  output_dev->setCairo (NULL);
+}
+
+/**
+ * poppler_page_get_thumbnail_size:
+ * @page: A #PopplerPage
+ * @width: (out) return location for width
+ * @height: (out) return location for height
+ *
+ * Returns %TRUE if @page has a thumbnail associated with it.  It also
+ * fills in @width and @height with the width and height of the
+ * thumbnail.  The values of width and height are not changed if no
+ * appropriate thumbnail exists.
+ *
+ * Return value: %TRUE, if @page has a thumbnail associated with it.
+ **/
+gboolean
+poppler_page_get_thumbnail_size (PopplerPage *page,
+                                int         *width,
+                                int         *height)
+{
+  Object thumb;
+  Dict *dict;
+  gboolean retval = FALSE;
+
+  g_return_val_if_fail (POPPLER_IS_PAGE (page), FALSE);
+  g_return_val_if_fail (width != NULL, FALSE);
+  g_return_val_if_fail (height != NULL, FALSE);
+
+  page->page->getThumb (&thumb);
+  if (!thumb.isStream ())
+    {
+      thumb.free ();
+      return FALSE;
+    }
+
+  dict = thumb.streamGetDict();
+
+  /* Theoretically, this could succeed and you would still fail when
+   * loading the thumb */
+  if (dict->lookupInt ("Width", "W", width)  &&
+      dict->lookupInt ("Height", "H", height))
+    retval = TRUE;
+
+  thumb.free ();
+
+  return retval;
+}
+
+/**
+ * poppler_page_get_selection_region:
+ * @page: a #PopplerPage
+ * @scale: scale specified as pixels per point
+ * @style: a #PopplerSelectionStyle
+ * @selection: start and end point of selection as a rectangle
+ * 
+ * Returns a region containing the area that would be rendered by
+ * poppler_page_render_selection() as a #GList of
+ * #PopplerRectangle. The returned list must be freed with
+ * poppler_page_selection_region_free().
+ * 
+ * Return value: (element-type PopplerRectangle) (transfer full): a #GList of #PopplerRectangle
+ *
+ * Deprecated: 0.16: Use poppler_page_get_selected_region() instead.
+ **/
+GList *
+poppler_page_get_selection_region (PopplerPage           *page,
+                                  gdouble                scale,
+                                  PopplerSelectionStyle  style,
+                                  PopplerRectangle      *selection)
+{
+  PDFRectangle poppler_selection;
+  TextPage *text;
+  SelectionStyle selection_style = selectionStyleGlyph;
+  GooList *list;
+  GList *region = NULL;
+  int i;
+
+  poppler_selection.x1 = selection->x1;
+  poppler_selection.y1 = selection->y1;
+  poppler_selection.x2 = selection->x2;
+  poppler_selection.y2 = selection->y2;
+
+  switch (style)
+    {
+      case POPPLER_SELECTION_GLYPH:
+        selection_style = selectionStyleGlyph;
+       break;
+      case POPPLER_SELECTION_WORD:
+        selection_style = selectionStyleWord;
+       break;
+      case POPPLER_SELECTION_LINE:
+        selection_style = selectionStyleLine;
+       break;
+    }
+
+  text = poppler_page_get_text_page (page);
+  list = text->getSelectionRegion(&poppler_selection,
+                                 selection_style, scale);
+
+  for (i = 0; i < list->getLength(); i++) {
+    PDFRectangle *selection_rect = (PDFRectangle *) list->get(i);
+    PopplerRectangle *rect;
+
+    rect = poppler_rectangle_new ();
+    
+    rect->x1 = selection_rect->x1;
+    rect->y1 = selection_rect->y1;
+    rect->x2 = selection_rect->x2;
+    rect->y2 = selection_rect->y2;
+    
+    region = g_list_prepend (region, rect);
+    
+    delete selection_rect;
+  }
+
+  delete list;
+
+  return g_list_reverse (region);
+}
+
+/**
+ * poppler_page_selection_region_free:
+ * @region: (element-type PopplerRectangle): a #GList of
+ *   #PopplerRectangle
+ *
+ * Frees @region
+ *
+ * Deprecated: 0.16
+ */
+void
+poppler_page_selection_region_free (GList *region)
+{
+  if (G_UNLIKELY (!region))
+    return;
+
+  g_list_foreach (region, (GFunc)poppler_rectangle_free, NULL);
+  g_list_free (region);
+}
+
+/**
+ * poppler_page_get_selected_region:
+ * @page: a #PopplerPage
+ * @scale: scale specified as pixels per point
+ * @style: a #PopplerSelectionStyle
+ * @selection: start and end point of selection as a rectangle
+ *
+ * Returns a region containing the area that would be rendered by
+ * poppler_page_render_selection().
+ * The returned region must be freed with cairo_region_destroy()
+ *
+ * Return value: (transfer full): a cairo_region_t
+ *
+ * Since: 0.16
+ **/
+cairo_region_t *
+poppler_page_get_selected_region (PopplerPage           *page,
+                                  gdouble                scale,
+                                  PopplerSelectionStyle  style,
+                                  PopplerRectangle      *selection)
+{
+  PDFRectangle poppler_selection;
+  TextPage *text;
+  SelectionStyle selection_style = selectionStyleGlyph;
+  GooList *list;
+  cairo_region_t *region;
+  int i;
+
+  poppler_selection.x1 = selection->x1;
+  poppler_selection.y1 = selection->y1;
+  poppler_selection.x2 = selection->x2;
+  poppler_selection.y2 = selection->y2;
+
+  switch (style)
+    {
+      case POPPLER_SELECTION_GLYPH:
+        selection_style = selectionStyleGlyph;
+       break;
+      case POPPLER_SELECTION_WORD:
+        selection_style = selectionStyleWord;
+       break;
+      case POPPLER_SELECTION_LINE:
+        selection_style = selectionStyleLine;
+       break;
+    }
+
+  text = poppler_page_get_text_page (page);
+  list = text->getSelectionRegion(&poppler_selection,
+                                 selection_style, 1.0);
+
+  region = cairo_region_create ();
+
+  for (i = 0; i < list->getLength(); i++) {
+    PDFRectangle *selection_rect = (PDFRectangle *) list->get(i);
+    cairo_rectangle_int_t rect;
+
+    rect.x = (gint) ((selection_rect->x1 * scale) + 0.5);
+    rect.y = (gint) ((selection_rect->y1 * scale) + 0.5);
+    rect.width = (gint) (((selection_rect->x2 - selection_rect->x1) * scale) + 0.5);
+    rect.height = (gint) (((selection_rect->y2 - selection_rect->y1) * scale) + 0.5);
+    cairo_region_union_rectangle (region, &rect);
+
+    delete selection_rect;
+  }
+
+  delete list;
+
+  return region;
+}
+
+/**
+ * poppler_page_get_selected_text:
+ * @page: a #PopplerPage
+ * @style: a #PopplerSelectionStyle
+ * @selection: the #PopplerRectangle including the text
+ *
+ * Retrieves the contents of the specified @selection as text.
+ *
+ * Return value: a pointer to the contents of the @selection
+ *               as a string
+ * Since: 0.16
+ **/
+char *
+poppler_page_get_selected_text (PopplerPage          *page,
+                               PopplerSelectionStyle style,
+                               PopplerRectangle     *selection)
+{
+  GooString *sel_text;
+  char *result;
+  TextPage *text;
+  SelectionStyle selection_style = selectionStyleGlyph;
+  PDFRectangle pdf_selection;
+
+  g_return_val_if_fail (POPPLER_IS_PAGE (page), NULL);
+  g_return_val_if_fail (selection != NULL, NULL);
+
+  pdf_selection.x1 = selection->x1;
+  pdf_selection.y1 = selection->y1;
+  pdf_selection.x2 = selection->x2;
+  pdf_selection.y2 = selection->y2;
+
+  switch (style)
+    {
+      case POPPLER_SELECTION_GLYPH:
+        selection_style = selectionStyleGlyph;
+       break;
+      case POPPLER_SELECTION_WORD:
+        selection_style = selectionStyleWord;
+       break;
+      case POPPLER_SELECTION_LINE:
+        selection_style = selectionStyleLine;
+       break;
+    }
+
+  text = poppler_page_get_text_page (page);
+  sel_text = text->getSelectionText (&pdf_selection, selection_style);
+  result = g_strdup (sel_text->getCString ());
+  delete sel_text;
+
+  return result;
+}
+
+/**
+ * poppler_page_get_text:
+ * @page: a #PopplerPage
+ *
+ * Retrieves the text of @page.
+ *
+ * Return value: a pointer to the text of the @page
+ *               as a string
+ * Since: 0.16
+ **/
+char *
+poppler_page_get_text (PopplerPage *page)
+{
+  PopplerRectangle rectangle = {0, 0, 0, 0};
+
+  g_return_val_if_fail (POPPLER_IS_PAGE (page), NULL);
+
+  poppler_page_get_size (page, &rectangle.x2, &rectangle.y2);
+
+  return poppler_page_get_selected_text (page, POPPLER_SELECTION_GLYPH, &rectangle);
+}
+
+/**
+ * poppler_page_find_text:
+ * @page: a #PopplerPage
+ * @text: the text to search for (UTF-8 encoded)
+ * 
+ * A #GList of rectangles for each occurance of the text on the page.
+ * The coordinates are in PDF points.
+ * 
+ * Return value: (element-type PopplerRectangle) (transfer full): a #GList of #PopplerRectangle,
+ **/
+GList *
+poppler_page_find_text (PopplerPage *page,
+                       const char  *text)
+{
+  PopplerRectangle *match;
+  GList *matches;
+  double xMin, yMin, xMax, yMax;
+  gunichar *ucs4;
+  glong ucs4_len;
+  double height;
+  TextPage *text_dev;
+
+  g_return_val_if_fail (POPPLER_IS_PAGE (page), NULL);
+  g_return_val_if_fail (text != NULL, NULL);
+
+  text_dev = poppler_page_get_text_page (page);
+
+  ucs4 = g_utf8_to_ucs4_fast (text, -1, &ucs4_len);
+  poppler_page_get_size (page, NULL, &height);
+  
+  matches = NULL;
+  xMin = 0;
+  yMin = 0;
+
+  while (text_dev->findText (ucs4, ucs4_len,
+                            gFalse, gTrue, // startAtTop, stopAtBottom
+                            gFalse, gFalse, // startAtLast, stopAtLast
+                            gFalse, gFalse, // caseSensitive, backwards
+                            gFalse, // wholeWord
+                            &xMin, &yMin, &xMax, &yMax))
+    {
+      match = poppler_rectangle_new ();
+      match->x1 = xMin;
+      match->y1 = height - yMax;
+      match->x2 = xMax;
+      match->y2 = height - yMin;
+      matches = g_list_prepend (matches, match);
+    }
+
+  g_free (ucs4);
+
+  return g_list_reverse (matches);
+}
+
+static CairoImageOutputDev *
+poppler_page_get_image_output_dev (PopplerPage *page,
+                                  GBool (*imgDrawDeviceCbk)(int img_id, void *data),
+                                  void *imgDrawCbkData)
+{
+  CairoImageOutputDev *image_dev;
+  Gfx *gfx;
+  
+  image_dev = new CairoImageOutputDev ();
+
+  if (imgDrawDeviceCbk) {
+    image_dev->setImageDrawDecideCbk (imgDrawDeviceCbk,
+                                     imgDrawCbkData);
+  }
+
+  gfx = page->page->createGfx(image_dev,
+                             72.0, 72.0, 0,
+                             gFalse, /* useMediaBox */
+                             gTrue, /* Crop */
+                             -1, -1, -1, -1,
+                             gFalse, /* printing */
+                             NULL, NULL);
+  page->page->display(gfx);
+  delete gfx;
+
+  return image_dev;
+}
+
+/**
+ * poppler_page_get_image_mapping:
+ * @page: A #PopplerPage
+ *
+ * Returns a list of #PopplerImageMapping items that map from a
+ * location on @page to an image of the page. This list must be freed
+ * with poppler_page_free_image_mapping() when done.
+ *
+ * Return value: (element-type PopplerImageMapping) (transfer full): A #GList of #PopplerImageMapping
+ **/
+GList *
+poppler_page_get_image_mapping (PopplerPage *page)
+{
+  GList *map_list = NULL;
+  CairoImageOutputDev *out;
+  gint i;
+  
+  g_return_val_if_fail (POPPLER_IS_PAGE (page), NULL);
+
+  out = poppler_page_get_image_output_dev (page, NULL, NULL);
+
+  for (i = 0; i < out->getNumImages (); i++) {
+    PopplerImageMapping *mapping;
+    CairoImage *image;
+
+    image = out->getImage (i);
+
+    /* Create the mapping */
+    mapping = poppler_image_mapping_new ();
+
+    image->getRect (&(mapping->area.x1), &(mapping->area.y1),
+                   &(mapping->area.x2), &(mapping->area.y2));
+    mapping->image_id = i;
+    
+    mapping->area.x1 -= page->page->getCropBox()->x1;
+    mapping->area.x2 -= page->page->getCropBox()->x1;
+    mapping->area.y1 -= page->page->getCropBox()->y1;
+    mapping->area.y2 -= page->page->getCropBox()->y1;
+
+    map_list = g_list_prepend (map_list, mapping);
+  }
+
+  delete out;
+
+  return map_list;     
+}
+
+static GBool
+image_draw_decide_cb (int image_id, void *data)
+{
+  return (image_id == GPOINTER_TO_INT (data));
+}
+
+/**
+ * poppler_page_get_image:
+ * @page: A #PopplerPage
+ * @image_id: The image identifier
+ *
+ * Returns a cairo surface for the image of the @page
+ *
+ * Return value: A cairo surface for the image
+ **/
+cairo_surface_t *
+poppler_page_get_image (PopplerPage *page,
+                       gint         image_id)
+{
+  CairoImageOutputDev *out;
+  cairo_surface_t *image;
+  
+  g_return_val_if_fail (POPPLER_IS_PAGE (page), NULL);
+
+  out = poppler_page_get_image_output_dev (page,
+                                          image_draw_decide_cb,
+                                          GINT_TO_POINTER (image_id));
+
+  if (image_id >= out->getNumImages ()) {
+    delete out;
+    
+    return NULL;
+  }
+
+  image = out->getImage (image_id)->getImage ();
+  if (!image) {
+    delete out;
+
+    return NULL;
+  }
+
+  cairo_surface_reference (image);
+  delete out;
+  
+  return image;
+}
+
+/**
+ * poppler_page_free_image_mapping:
+ * @list: (element-type PopplerImageMapping): A list of
+ *   #PopplerImageMapping<!-- -->s
+ *
+ * Frees a list of #PopplerImageMapping<!-- -->s allocated by
+ * poppler_page_get_image_mapping().
+ **/
+void
+poppler_page_free_image_mapping (GList *list)
+{
+  if (G_UNLIKELY (list == NULL))
+    return;
+
+  g_list_foreach (list, (GFunc)poppler_image_mapping_free, NULL);
+  g_list_free (list);
+}
+
+/**
+ * poppler_page_render_to_ps:
+ * @page: a #PopplerPage
+ * @ps_file: the PopplerPSFile to render to
+ * 
+ * Render the page on a postscript file
+ * 
+ **/
+void
+poppler_page_render_to_ps (PopplerPage   *page,
+                          PopplerPSFile *ps_file)
+{
+  g_return_if_fail (POPPLER_IS_PAGE (page));
+  g_return_if_fail (ps_file != NULL);
+
+  if (!ps_file->out)
+    ps_file->out = new PSOutputDev (ps_file->filename,
+                                    ps_file->document->doc,
+                                    NULL,
+                                    ps_file->first_page, ps_file->last_page,
+                                    psModePS, (int)ps_file->paper_width,
+                                    (int)ps_file->paper_height, ps_file->duplex,
+                                    0, 0, 0, 0, gFalse, gFalse);
+
+
+  ps_file->document->doc->displayPage (ps_file->out, page->index + 1, 72.0, 72.0,
+                                      0, gFalse, gTrue, gFalse);
+}
+
+static void
+poppler_page_get_property (GObject    *object,
+                          guint       prop_id,
+                          GValue     *value,
+                          GParamSpec *pspec)
+{
+  PopplerPage *page = POPPLER_PAGE (object);
+
+  switch (prop_id)
+    {
+    case PROP_LABEL:
+      g_value_take_string (value, poppler_page_get_label (page));
+      break;
+    default:
+      G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+    }
+}
+
+static void
+poppler_page_class_init (PopplerPageClass *klass)
+{
+  GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
+
+  gobject_class->finalize = poppler_page_finalize;
+  gobject_class->get_property = poppler_page_get_property;
+
+  /**
+   * PopplerPage:label:
+   *
+   * The label of the page or %NULL. See also poppler_page_get_label()
+   */
+  g_object_class_install_property (G_OBJECT_CLASS (klass),
+                                  PROP_LABEL,
+                                  g_param_spec_string ("label",
+                                                       "Page Label",
+                                                       "The label of the page",
+                                                       NULL,
+                                                       G_PARAM_READABLE));
+}
+
+static void
+poppler_page_init (PopplerPage *page)
+{
+}
+
+/**
+ * poppler_page_get_link_mapping:
+ * @page: A #PopplerPage
+ * 
+ * Returns a list of #PopplerLinkMapping items that map from a
+ * location on @page to a #PopplerAction.  This list must be freed
+ * with poppler_page_free_link_mapping() when done.
+ * 
+ * Return value: (element-type PopplerLinkMapping) (transfer full): A #GList of #PopplerLinkMapping
+ **/
+GList *
+poppler_page_get_link_mapping (PopplerPage *page)
+{
+  GList *map_list = NULL;
+  gint i;
+  Links *links;
+  double width, height;
+  
+  g_return_val_if_fail (POPPLER_IS_PAGE (page), NULL);
+  
+  links = new Links (page->page->getAnnots ());
+
+  if (links == NULL)
+    return NULL;
+  
+  poppler_page_get_size (page, &width, &height);
+  
+  for (i = 0; i < links->getNumLinks (); i++)
+    {
+      PopplerLinkMapping *mapping;
+      PopplerRectangle rect;
+      LinkAction *link_action;
+      AnnotLink *link;
+      
+      link = links->getLink (i);
+      link_action = link->getAction ();
+      
+      /* Create the mapping */
+      mapping = poppler_link_mapping_new ();
+      mapping->action = _poppler_action_new (page->document, link_action, NULL);
+
+      link->getRect (&rect.x1, &rect.y1, &rect.x2, &rect.y2);
+
+      rect.x1 -= page->page->getCropBox()->x1;
+      rect.x2 -= page->page->getCropBox()->x1;
+      rect.y1 -= page->page->getCropBox()->y1;
+      rect.y2 -= page->page->getCropBox()->y1;
+      
+      switch (page->page->getRotate ())
+        {
+        case 90:
+         mapping->area.x1 = rect.y1;
+         mapping->area.y1 = height - rect.x2;
+         mapping->area.x2 = mapping->area.x1 + (rect.y2 - rect.y1);
+         mapping->area.y2 = mapping->area.y1 + (rect.x2 - rect.x1);
+         
+         break;
+       case 180:
+         mapping->area.x1 = width - rect.x2;
+         mapping->area.y1 = height - rect.y2;
+         mapping->area.x2 = mapping->area.x1 + (rect.x2 - rect.x1);
+         mapping->area.y2 = mapping->area.y1 + (rect.y2 - rect.y1);
+         
+         break;
+       case 270:
+         mapping->area.x1 = width - rect.y2;
+         mapping->area.y1 = rect.x1;
+         mapping->area.x2 = mapping->area.x1 + (rect.y2 - rect.y1);
+         mapping->area.y2 = mapping->area.y1 + (rect.x2 - rect.x1);
+         
+         break;
+       default:
+         mapping->area.x1 = rect.x1;
+         mapping->area.y1 = rect.y1;
+         mapping->area.x2 = rect.x2;
+         mapping->area.y2 = rect.y2;
+       }
+
+      map_list = g_list_prepend (map_list, mapping);
+    }
+  
+  delete links;
+  
+  return map_list;
+}
+
+/**
+ * poppler_page_free_link_mapping:
+ * @list: (element-type PopplerLinkMapping): A list of
+ *   #PopplerLinkMapping<!-- -->s
+ * 
+ * Frees a list of #PopplerLinkMapping<!-- -->s allocated by
+ * poppler_page_get_link_mapping().  It also frees the #PopplerAction<!-- -->s
+ * that each mapping contains, so if you want to keep them around, you need to
+ * copy them with poppler_action_copy().
+ **/
+void
+poppler_page_free_link_mapping (GList *list)
+{
+  if (G_UNLIKELY (list == NULL))
+    return;
+
+  g_list_foreach (list, (GFunc)poppler_link_mapping_free, NULL);
+  g_list_free (list);
+}
+
+/**
+ * poppler_page_get_form_field_mapping:
+ * @page: A #PopplerPage
+ *
+ * Returns a list of #PopplerFormFieldMapping items that map from a
+ * location on @page to a form field.  This list must be freed
+ * with poppler_page_free_form_field_mapping() when done.
+ *
+ * Return value: (element-type PopplerFormFieldMapping) (transfer full): A #GList of #PopplerFormFieldMapping
+ **/
+GList *
+poppler_page_get_form_field_mapping (PopplerPage *page)
+{
+  GList *map_list = NULL;
+  FormPageWidgets *forms;
+  gint i;
+  
+  g_return_val_if_fail (POPPLER_IS_PAGE (page), NULL);
+
+  forms = page->page->getFormWidgets ();
+
+  if (forms == NULL)
+    return NULL;
+  
+  for (i = 0; i < forms->getNumWidgets (); i++) {
+    PopplerFormFieldMapping *mapping;
+    FormWidget *field;
+
+    mapping = poppler_form_field_mapping_new ();
+    
+    field = forms->getWidget (i);
+
+    mapping->field = _poppler_form_field_new (page->document, field);
+    field->getRect (&(mapping->area.x1), &(mapping->area.y1),
+                   &(mapping->area.x2), &(mapping->area.y2));
+
+    mapping->area.x1 -= page->page->getCropBox()->x1;
+    mapping->area.x2 -= page->page->getCropBox()->x1;
+    mapping->area.y1 -= page->page->getCropBox()->y1;
+    mapping->area.y2 -= page->page->getCropBox()->y1;
+    
+    map_list = g_list_prepend (map_list, mapping);
+  }
+
+  delete forms;
+  
+  return map_list;
+}
+
+/**
+ * poppler_page_free_form_field_mapping:
+ * @list: (element-type PopplerFormFieldMapping): A list of
+ *   #PopplerFormFieldMapping<!-- -->s
+ *
+ * Frees a list of #PopplerFormFieldMapping<!-- -->s allocated by
+ * poppler_page_get_form_field_mapping().
+ **/
+void
+poppler_page_free_form_field_mapping (GList *list)
+{
+  if (G_UNLIKELY (list == NULL))
+    return;
+
+  g_list_foreach (list, (GFunc) poppler_form_field_mapping_free, NULL);
+  g_list_free (list);
+}
+
+/**
+ * poppler_page_get_annot_mapping:
+ * @page: A #PopplerPage
+ *
+ * Returns a list of #PopplerAnnotMapping items that map from a location on
+ * @page to a #PopplerAnnot.  This list must be freed with
+ * poppler_page_free_annot_mapping() when done.
+ *
+ * Return value: (element-type PopplerAnnotMapping) (transfer full): A #GList of #PopplerAnnotMapping
+ **/
+GList *
+poppler_page_get_annot_mapping (PopplerPage *page)
+{
+  GList *map_list = NULL;
+  double width, height;
+  gint i;
+  Annots *annots;
+
+  g_return_val_if_fail (POPPLER_IS_PAGE (page), NULL);
+
+  annots = page->page->getAnnots ();
+  if (!annots)
+    return NULL;
+
+  poppler_page_get_size (page, &width, &height);
+
+  for (i = 0; i < annots->getNumAnnots (); i++) {
+    PopplerAnnotMapping *mapping;
+    PopplerRectangle rect;
+    Annot *annot;
+    PDFRectangle *annot_rect;
+    gint rotation = 0;
+
+    annot = annots->getAnnot (i);
+
+    /* Create the mapping */
+    mapping = poppler_annot_mapping_new ();
+
+    switch (annot->getType ())
+      {
+      case Annot::typeText:
+        mapping->annot = _poppler_annot_text_new (annot);
+       break;
+      case Annot::typeFreeText:
+        mapping->annot = _poppler_annot_free_text_new (annot);
+       break;
+      case Annot::typeFileAttachment:
+        mapping->annot = _poppler_annot_file_attachment_new (annot);
+       break;
+      case Annot::typeMovie:
+        mapping->annot = _poppler_annot_movie_new (annot);
+       break;
+      case Annot::typeScreen:
+        mapping->annot = _poppler_annot_screen_new (annot);
+       break;
+      default:
+        mapping->annot = _poppler_annot_new (annot);
+       break;
+      }
+
+    annot_rect = annot->getRect ();
+    rect.x1 = annot_rect->x1 - page->page->getCropBox()->x1;
+    rect.y1 = annot_rect->y1 - page->page->getCropBox()->y1;
+    rect.x2 = annot_rect->x2 - page->page->getCropBox()->x1;
+    rect.y2 = annot_rect->y2 - page->page->getCropBox()->y1;
+
+    if (! (annot->getFlags () & Annot::flagNoRotate))
+      rotation = page->page->getRotate ();
+
+    switch (rotation)
+      {
+      case 90:
+        mapping->area.x1 = rect.y1;
+        mapping->area.y1 = height - rect.x2;
+        mapping->area.x2 = mapping->area.x1 + (rect.y2 - rect.y1);
+        mapping->area.y2 = mapping->area.y1 + (rect.x2 - rect.x1);
+        break;
+      case 180:
+        mapping->area.x1 = width - rect.x2;
+        mapping->area.y1 = height - rect.y2;
+        mapping->area.x2 = mapping->area.x1 + (rect.x2 - rect.x1);
+        mapping->area.y2 = mapping->area.y1 + (rect.y2 - rect.y1);
+        break;
+      case 270:
+        mapping->area.x1 = width - rect.y2;
+        mapping->area.y1 = rect.x1;
+        mapping->area.x2 = mapping->area.x1 + (rect.y2 - rect.y1);
+        mapping->area.y2 = mapping->area.y1 + (rect.x2 - rect.x1);
+        break;
+      default:
+        mapping->area.x1 = rect.x1;
+        mapping->area.y1 = rect.y1;
+        mapping->area.x2 = rect.x2;
+        mapping->area.y2 = rect.y2;
+      }
+
+    map_list = g_list_prepend (map_list, mapping);
+  }
+
+  return g_list_reverse (map_list);
+}
+
+/**
+ * poppler_page_free_annot_mapping:
+ * @list: (element-type PopplerAnnotMapping): A list of
+ *   #PopplerAnnotMapping<!-- -->s
+ *
+ * Frees a list of #PopplerAnnotMapping<!-- -->s allocated by
+ * poppler_page_get_annot_mapping().  It also unreferences the #PopplerAnnot<!-- -->s
+ * that each mapping contains, so if you want to keep them around, you need to
+ * reference them with g_object_ref().
+ **/
+void
+poppler_page_free_annot_mapping (GList *list)
+{
+  if (G_UNLIKELY (!list))
+    return;
+
+  g_list_foreach (list, (GFunc)poppler_annot_mapping_free, NULL);
+  g_list_free (list);
+}
+
+/**
+ * poppler_page_add_annot:
+ * @page: a #PopplerPage
+ * @annot: a #PopplerAnnot to add
+ *
+ * Adds annotation @annot to @page.
+ *
+ * Since: 0.16
+ */
+void
+poppler_page_add_annot (PopplerPage  *page,
+                       PopplerAnnot *annot)
+{
+  g_return_if_fail (POPPLER_IS_PAGE (page));
+  g_return_if_fail (POPPLER_IS_ANNOT (annot));
+
+  page->page->addAnnot (annot->annot);
+}
+
+/* PopplerRectangle type */
+
+POPPLER_DEFINE_BOXED_TYPE (PopplerRectangle, poppler_rectangle,
+                          poppler_rectangle_copy,
+                          poppler_rectangle_free)
+
+/**
+ * poppler_rectangle_new:
+ *
+ * Creates a new #PopplerRectangle
+ *
+ * Returns: a new #PopplerRectangle, use poppler_rectangle_free() to free it
+ */
+PopplerRectangle *
+poppler_rectangle_new (void)
+{
+  return g_slice_new0 (PopplerRectangle);
+}
+
+/**
+ * poppler_rectangle_copy:
+ * @rectangle: a #PopplerRectangle to copy
+ *
+ * Creates a copy of @rectangle
+ *
+ * Returns: a new allocated copy of @rectangle
+ */
+PopplerRectangle *
+poppler_rectangle_copy (PopplerRectangle *rectangle)
+{
+  g_return_val_if_fail (rectangle != NULL, NULL);
+
+  return g_slice_dup (PopplerRectangle, rectangle);
+}
+
+/**
+ * poppler_rectangle_free:
+ * @rectangle: a #PopplerRectangle
+ *
+ * Frees the given #PopplerRectangle
+ */
+void
+poppler_rectangle_free (PopplerRectangle *rectangle)
+{
+  g_slice_free (PopplerRectangle, rectangle);
+}
+
+/* PopplerTextAttributes type */
+
+POPPLER_DEFINE_BOXED_TYPE (PopplerTextAttributes, poppler_text_attributes,
+                          poppler_text_attributes_copy,
+                          poppler_text_attributes_free)
+
+/**
+ * poppler_text_attributes_new:
+ *
+ * Creates a new #PopplerTextAttributes
+ *
+ * Returns: a new #PopplerTextAttributes, use poppler_text_attributes_free() to free it
+ *
+ * Since: 0.18
+ */
+PopplerTextAttributes *
+poppler_text_attributes_new (void)
+{
+  return (PopplerTextAttributes *) g_slice_new0 (PopplerTextAttributes);
+}
+
+static gchar *
+get_font_name_from_word (TextWord *word)
+{
+  GooString *font_name = word->getFontName();
+  const gchar *name;
+  gboolean subset;
+  gint i;
+
+  if (!font_name || font_name->getLength () == 0)
+    return g_strdup ("Default");
+
+  // check for a font subset name: capital letters followed by a '+' sign
+  for (i = 0; i < font_name->getLength (); ++i) {
+    if (font_name->getChar (i) < 'A' || font_name->getChar (i) > 'Z') {
+      break;
+    }
+  }
+  subset = i > 0 && i < font_name->getLength () && font_name->getChar (i) == '+';
+  name = font_name->getCString ();
+  if (subset)
+    name += i + 1;
+
+  return g_strdup (name);
+}
+
+/*
+ * Allocates a new PopplerTextAttributes with word attributes
+ */
+static PopplerTextAttributes *
+poppler_text_attributes_new_from_word (TextWord *word)
+{
+  PopplerTextAttributes *attrs = poppler_text_attributes_new ();
+  gdouble r, g, b;
+
+  attrs->font_name = get_font_name_from_word (word);
+  attrs->font_size = word->getFontSize();
+  attrs->is_underlined = word->isUnderlined();
+  word->getColor (&r, &g, &b);
+  attrs->color.red = (int) (r * 65535. + 0.5);
+  attrs->color.green = (int)(g * 65535. + 0.5);
+  attrs->color.blue = (int)(b * 65535. + 0.5);
+
+  return attrs;
+}
+
+/**
+ * poppler_text_attributes_copy:
+ * @text_attrs: a #PopplerTextAttributes to copy
+ *
+ * Creates a copy of @text_attrs
+ *
+ * Returns: a new allocated copy of @text_attrs
+ *
+ * Since: 0.18
+ */
+PopplerTextAttributes *
+poppler_text_attributes_copy (PopplerTextAttributes *text_attrs)
+{
+  PopplerTextAttributes *attrs;
+
+  attrs = g_slice_dup (PopplerTextAttributes, text_attrs);
+  attrs->font_name = g_strdup (text_attrs->font_name);
+  return attrs;
+}
+
+/**
+ * poppler_text_attributes_free:
+ * @text_attrs: a #PopplerTextAttributes
+ *
+ * Frees the given #PopplerTextAttributes
+ *
+ * Since: 0.18
+ */
+void
+poppler_text_attributes_free (PopplerTextAttributes *text_attrs)
+{
+  g_free (text_attrs->font_name);
+  g_slice_free (PopplerTextAttributes, text_attrs);
+}
+
+/* PopplerColor type */
+POPPLER_DEFINE_BOXED_TYPE (PopplerColor, poppler_color, poppler_color_copy, poppler_color_free)
+
+/**
+ * poppler_color_new:
+ *
+ * Creates a new #PopplerColor
+ *
+ * Returns: a new #PopplerColor, use poppler_color_free() to free it
+ */
+PopplerColor *
+poppler_color_new (void)
+{
+  return (PopplerColor *) g_new0 (PopplerColor, 1);
+}
+
+/**
+ * poppler_color_copy:
+ * @color: a #PopplerColor to copy
+ *
+ * Creates a copy of @color
+ *
+ * Returns: a new allocated copy of @color
+ */
+PopplerColor *
+poppler_color_copy (PopplerColor *color)
+{
+  PopplerColor *new_color;
+
+  new_color = g_new (PopplerColor, 1);
+  *new_color = *color;
+
+  return new_color;
+}
+
+/**
+ * poppler_color_free:
+ * @color: a #PopplerColor
+ *
+ * Frees the given #PopplerColor
+ */
+void
+poppler_color_free (PopplerColor *color)
+{
+  g_free (color);
+}
+
+/* PopplerLinkMapping type */
+POPPLER_DEFINE_BOXED_TYPE (PopplerLinkMapping, poppler_link_mapping,
+                          poppler_link_mapping_copy,
+                          poppler_link_mapping_free)
+
+/**
+ * poppler_link_mapping_new:
+ *
+ * Creates a new #PopplerLinkMapping
+ *
+ * Returns: a new #PopplerLinkMapping, use poppler_link_mapping_free() to free it
+ */
+PopplerLinkMapping *
+poppler_link_mapping_new (void)
+{
+  return g_slice_new0 (PopplerLinkMapping);
+}
+
+/**
+ * poppler_link_mapping_copy:
+ * @mapping: a #PopplerLinkMapping to copy
+ *
+ * Creates a copy of @mapping
+ *
+ * Returns: a new allocated copy of @mapping
+ */
+PopplerLinkMapping *
+poppler_link_mapping_copy (PopplerLinkMapping *mapping)
+{
+  PopplerLinkMapping *new_mapping;
+
+  new_mapping = g_slice_dup (PopplerLinkMapping, mapping);
+
+  if (new_mapping->action)
+    new_mapping->action = poppler_action_copy (new_mapping->action);
+
+  return new_mapping;
+}
+
+/**
+ * poppler_link_mapping_free:
+ * @mapping: a #PopplerLinkMapping
+ *
+ * Frees the given #PopplerLinkMapping
+ */
+void
+poppler_link_mapping_free (PopplerLinkMapping *mapping)
+{
+  if (G_UNLIKELY (!mapping))
+    return;
+
+  if (mapping->action)
+    poppler_action_free (mapping->action);
+
+  g_slice_free (PopplerLinkMapping, mapping);
+}
+
+/* Poppler Image mapping type */
+POPPLER_DEFINE_BOXED_TYPE (PopplerImageMapping, poppler_image_mapping,
+                          poppler_image_mapping_copy,
+                          poppler_image_mapping_free)
+
+/**
+ * poppler_image_mapping_new:
+ *
+ * Creates a new #PopplerImageMapping
+ *
+ * Returns: a new #PopplerImageMapping, use poppler_image_mapping_free() to free it
+ */
+PopplerImageMapping *
+poppler_image_mapping_new (void)
+{
+  return g_slice_new0 (PopplerImageMapping);
+}
+
+/**
+ * poppler_image_mapping_copy:
+ * @mapping: a #PopplerImageMapping to copy
+ *
+ * Creates a copy of @mapping
+ *
+ * Returns: a new allocated copy of @mapping
+ */
+PopplerImageMapping *
+poppler_image_mapping_copy (PopplerImageMapping *mapping)
+{
+  return g_slice_dup (PopplerImageMapping, mapping);
+}
+
+/**
+ * poppler_image_mapping_free:
+ * @mapping: a #PopplerImageMapping
+ *
+ * Frees the given #PopplerImageMapping
+ */
+void
+poppler_image_mapping_free (PopplerImageMapping *mapping)
+{
+  g_slice_free (PopplerImageMapping, mapping);
+}
+
+/* Page Transition */
+POPPLER_DEFINE_BOXED_TYPE (PopplerPageTransition, poppler_page_transition,
+                          poppler_page_transition_copy,
+                          poppler_page_transition_free)
+
+/**
+ * poppler_page_transition_new:
+ *
+ * Creates a new #PopplerPageTransition
+ *
+ * Returns: a new #PopplerPageTransition, use poppler_page_transition_free() to free it
+ */
+PopplerPageTransition *
+poppler_page_transition_new (void)
+{
+  return (PopplerPageTransition *) g_new0 (PopplerPageTransition, 1);
+}
+
+/**
+ * poppler_page_transition_copy:
+ * @transition: a #PopplerPageTransition to copy
+ *
+ * Creates a copy of @transition
+ *
+ * Returns: a new allocated copy of @transition
+ */
+PopplerPageTransition *
+poppler_page_transition_copy (PopplerPageTransition *transition)
+{
+  PopplerPageTransition *new_transition;
+
+  new_transition = poppler_page_transition_new ();
+  *new_transition = *transition;
+  
+  return new_transition;
+}
+
+/**
+ * poppler_page_transition_free:
+ * @transition: a #PopplerPageTransition
+ *
+ * Frees the given #PopplerPageTransition
+ */
+void
+poppler_page_transition_free (PopplerPageTransition *transition)
+{
+  g_free (transition);
+}
+
+/* Form Field Mapping Type */
+POPPLER_DEFINE_BOXED_TYPE (PopplerFormFieldMapping, poppler_form_field_mapping,
+                          poppler_form_field_mapping_copy,
+                          poppler_form_field_mapping_free)
+
+/**
+ * poppler_form_field_mapping_new:
+ *
+ * Creates a new #PopplerFormFieldMapping
+ *
+ * Returns: a new #PopplerFormFieldMapping, use poppler_form_field_mapping_free() to free it
+ */
+PopplerFormFieldMapping *
+poppler_form_field_mapping_new (void)
+{
+  return g_slice_new0 (PopplerFormFieldMapping);
+}
+
+/**
+ * poppler_form_field_mapping_copy:
+ * @mapping: a #PopplerFormFieldMapping to copy
+ *
+ * Creates a copy of @mapping
+ *
+ * Returns: a new allocated copy of @mapping
+ */
+PopplerFormFieldMapping *
+poppler_form_field_mapping_copy (PopplerFormFieldMapping *mapping)
+{
+  PopplerFormFieldMapping *new_mapping;
+
+  new_mapping = g_slice_dup (PopplerFormFieldMapping, mapping);
+
+  if (mapping->field)
+         new_mapping->field = (PopplerFormField *)g_object_ref (mapping->field);
+           
+  return new_mapping;
+}
+
+/**
+ * poppler_form_field_mapping_free:
+ * @mapping: a #PopplerFormFieldMapping
+ *
+ * Frees the given #PopplerFormFieldMapping
+ */
+void
+poppler_form_field_mapping_free (PopplerFormFieldMapping *mapping)
+{
+  if (G_UNLIKELY (!mapping))
+    return;
+
+  if (mapping->field)
+    g_object_unref (mapping->field);
+
+  g_slice_free (PopplerFormFieldMapping, mapping);
+}
+
+/* PopplerAnnot Mapping Type */
+POPPLER_DEFINE_BOXED_TYPE (PopplerAnnotMapping, poppler_annot_mapping,
+                          poppler_annot_mapping_copy,
+                          poppler_annot_mapping_free)
+
+/**
+ * poppler_annot_mapping_new:
+ *
+ * Creates a new #PopplerAnnotMapping
+ *
+ * Returns: a new #PopplerAnnotMapping, use poppler_annot_mapping_free() to free it
+ */
+PopplerAnnotMapping *
+poppler_annot_mapping_new (void)
+{
+  return g_slice_new0 (PopplerAnnotMapping);
+}
+
+/**
+ * poppler_annot_mapping_copy:
+ * @mapping: a #PopplerAnnotMapping to copy
+ *
+ * Creates a copy of @mapping
+ *
+ * Returns: a new allocated copy of @mapping
+ */
+PopplerAnnotMapping *
+poppler_annot_mapping_copy (PopplerAnnotMapping *mapping)
+{
+  PopplerAnnotMapping *new_mapping;
+
+  new_mapping = g_slice_dup (PopplerAnnotMapping, mapping);
+
+  if (mapping->annot)
+    new_mapping->annot = (PopplerAnnot *) g_object_ref (mapping->annot);
+
+  return new_mapping;
+}
+
+/**
+ * poppler_annot_mapping_free:
+ * @mapping: a #PopplerAnnotMapping
+ *
+ * Frees the given #PopplerAnnotMapping
+ */
+void
+poppler_annot_mapping_free (PopplerAnnotMapping *mapping)
+{
+  if (G_UNLIKELY (!mapping))
+    return;
+
+  if (mapping->annot)
+    g_object_unref (mapping->annot);
+
+  g_slice_free (PopplerAnnotMapping, mapping);
+}
+
+/**
+ * poppler_page_get_crop_box:
+ * @page: a #PopplerPage
+ * @rect: (out): a #PopplerRectangle to fill
+ *
+ * Retrurns the crop box of @page
+ */
+void
+poppler_page_get_crop_box (PopplerPage *page, PopplerRectangle *rect)
+{
+  PDFRectangle* cropBox = page->page->getCropBox ();
+  
+  rect->x1 = cropBox->x1;
+  rect->x2 = cropBox->x2;
+  rect->y1 = cropBox->y1;
+  rect->y2 = cropBox->y2;
+}
+
+/**
+ * poppler_page_get_text_layout:
+ * @page: A #PopplerPage
+ * @rectangles: (out) (array length=n_rectangles) (transfer container): return location for an array of #PopplerRectangle
+ * @n_rectangles: (out) length of returned array
+ *
+ * Obtains the layout of the text as a list of #PopplerRectangle
+ * This array must be freed with g_free () when done.
+ *
+ * The position in the array represents an offset in the text returned by
+ * poppler_page_get_text()
+ *
+ * Return value: %TRUE if the page contains text, %FALSE otherwise
+ *
+ * Since: 0.16
+ **/
+gboolean
+poppler_page_get_text_layout (PopplerPage       *page,
+                              PopplerRectangle **rectangles,
+                              guint             *n_rectangles)
+{
+  TextPage *text;
+  TextWordList *wordlist;
+  TextWord *word, *nextword;
+  PopplerRectangle *rect;
+  int i, j, offset = 0;
+  gdouble x1, y1, x2, y2;
+  gdouble x3, y3, x4, y4;
+
+  g_return_val_if_fail (POPPLER_IS_PAGE (page), FALSE);
+
+  *n_rectangles = 0;
+
+  text = poppler_page_get_text_page (page);
+  wordlist = text->makeWordList (gFalse);
+
+  if (wordlist->getLength () <= 0)
+    {
+      delete wordlist;
+      return FALSE;
+    }
+
+  // Getting the array size
+  for (i = 0; i < wordlist->getLength (); i++)
+    {
+      word = wordlist->get (i);
+      *n_rectangles += word->getLength () + 1;
+    }
+
+  *rectangles = g_new (PopplerRectangle, *n_rectangles);
+
+  // Calculating each char position
+  for (i = 0; i < wordlist->getLength (); i++)
+    {
+      word = wordlist->get (i);
+      for (j = 0; j < word->getLength (); j++)
+        {
+          rect = *rectangles + offset;
+         word->getCharBBox (j,
+                            &(rect->x1),
+                            &(rect->y1),
+                            &(rect->x2),
+                            &(rect->y2));
+         offset++;
+       }
+
+      // adding spaces and break lines
+      rect = *rectangles + offset;
+      word->getBBox (&x1, &y1, &x2, &y2);
+
+      nextword = word->getNext ();
+      if (nextword)
+        {
+         nextword->getBBox (&x3, &y3, &x4, &y4);
+         // space is from one word to other and with the same height as
+         // first word.
+         rect->x1 = x2;
+         rect->y1 = y1;
+         rect->x2 = x3;
+         rect->y2 = y2;
+       }
+      else
+        {
+         // end of line
+         rect->x1 = x2;
+         rect->y1 = y2;
+         rect->x2 = x2;
+         rect->y2 = y2;
+       }
+      offset++;
+    }
+
+  delete wordlist;
+
+  return TRUE;
+}
+
+/**
+ * poppler_page_free_text_attributes:
+ * @list: (element-type PopplerTextAttributes): A list of
+ *   #PopplerTextAttributes<!-- -->s
+ *
+ * Frees a list of #PopplerTextAttributes<!-- -->s allocated by
+ * poppler_page_get_text_attributes().
+ *
+ * Since: 0.18
+ **/
+void
+poppler_page_free_text_attributes (GList *list)
+{
+  if (G_UNLIKELY (list == NULL))
+    return;
+
+  g_list_foreach (list, (GFunc)poppler_text_attributes_free, NULL);
+  g_list_free (list);
+}
+
+static gboolean
+word_text_attributes_equal (TextWord *a, TextWord *b)
+{
+  double ar, ag, ab, br, bg, bb;
+
+  if (!a->getFontInfo()->matches (b->getFontInfo()))
+    return FALSE;
+
+  if (a->getFontSize() != b->getFontSize())
+    return FALSE;
+
+  if (a->isUnderlined() != b->isUnderlined())
+    return FALSE;
+
+  a->getColor(&ar, &ag, &ab);
+  b->getColor(&br, &bg, &bb);
+  return (ar == br && ag == bg && ab == bb);
+}
+
+/**
+ * poppler_page_get_text_attributes:
+ * @page: A #PopplerPage
+ *
+ * Obtains the attributes of the text as a GList of #PopplerTextAttributes.
+ * This list must be freed with poppler_page_free_text_attributes() when done.
+ *
+ * Each list element is a #PopplerTextAttributes struct where start_index and
+ * end_index indicates the range of text (as returned by poppler_page_get_text())
+ * to which text attributes apply.
+ *
+ * Return value: (element-type PopplerTextAttributes) (transfer full): A #GList of #PopplerTextAttributes
+ *
+ * Since: 0.18
+ **/
+GList *
+poppler_page_get_text_attributes (PopplerPage *page)
+{
+  TextPage *text;
+  TextWordList *wordlist;
+  PopplerTextAttributes *attrs = NULL;
+  PopplerTextAttributes *previous = NULL;
+  gint i, offset = 0;
+  GList *attributes = NULL;
+
+  g_return_val_if_fail (POPPLER_IS_PAGE (page), NULL);
+
+  text = poppler_page_get_text_page (page);
+  wordlist = text->makeWordList (gFalse);
+
+  if (wordlist->getLength () <= 0)
+    {
+      delete wordlist;
+      return NULL;
+    }
+
+  // Calculating each word attributes
+  for (i = 0; i < wordlist->getLength (); i++)
+    {
+      TextWord *word = wordlist->get (i);
+
+      // each char of the word has the same attributes
+      if (i > 0 && word_text_attributes_equal (word, wordlist->get (i - 1))) {
+        attrs = previous;
+      } else {
+        attrs = poppler_text_attributes_new_from_word (word);
+        attrs->start_index = offset;
+        if (previous)
+          previous->end_index--;
+        previous = attrs;
+        attributes = g_list_prepend (attributes, attrs);
+      }
+      offset += word->getLength () + 1;
+      attrs->end_index = offset;
+    }
+  if (attrs)
+    attrs->end_index--;
+
+  delete wordlist;
+
+  return g_list_reverse(attributes);
+}
diff --git a/glib/poppler-page.h b/glib/poppler-page.h
new file mode 100644 (file)
index 0000000..7b36843
--- /dev/null
@@ -0,0 +1,311 @@
+/* poppler-page.h: glib interface to poppler
+ * Copyright (C) 2004, Red Hat, Inc.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#ifndef __POPPLER_PAGE_H__
+#define __POPPLER_PAGE_H__
+
+#include <glib-object.h>
+
+#include "poppler.h"
+
+#include <cairo.h>
+
+G_BEGIN_DECLS
+
+#define POPPLER_TYPE_PAGE             (poppler_page_get_type ())
+#define POPPLER_PAGE(obj)             (G_TYPE_CHECK_INSTANCE_CAST ((obj), POPPLER_TYPE_PAGE, PopplerPage))
+#define POPPLER_IS_PAGE(obj)          (G_TYPE_CHECK_INSTANCE_TYPE ((obj), POPPLER_TYPE_PAGE))
+
+
+GType                 poppler_page_get_type             (void) G_GNUC_CONST;
+
+void                   poppler_page_render               (PopplerPage        *page,
+                                                         cairo_t            *cairo);
+void                   poppler_page_render_for_printing  (PopplerPage        *page,
+                                                         cairo_t            *cairo);
+void       poppler_page_render_for_printing_with_options (PopplerPage        *page,
+                                                          cairo_t            *cairo,
+                                                          PopplerPrintFlags   options);
+cairo_surface_t       *poppler_page_get_thumbnail        (PopplerPage        *page);
+void                   poppler_page_render_selection     (PopplerPage        *page,
+                                                         cairo_t            *cairo,
+                                                         PopplerRectangle   *selection,
+                                                         PopplerRectangle   *old_selection,
+                                                         PopplerSelectionStyle style,
+                                                         PopplerColor       *glyph_color,
+                                                         PopplerColor       *background_color);
+
+void                   poppler_page_get_size             (PopplerPage        *page,
+                                                         double             *width,
+                                                         double             *height);
+int                    poppler_page_get_index            (PopplerPage        *page);
+gchar                 *poppler_page_get_label            (PopplerPage        *page);
+double                 poppler_page_get_duration         (PopplerPage        *page);
+PopplerPageTransition *poppler_page_get_transition       (PopplerPage        *page);
+gboolean               poppler_page_get_thumbnail_size   (PopplerPage        *page,
+                                                         int                *width,
+                                                         int                *height);
+GList                *poppler_page_find_text            (PopplerPage        *page,
+                                                         const  char        *text);
+void                   poppler_page_render_to_ps         (PopplerPage        *page,
+                                                         PopplerPSFile      *ps_file);
+char                  *poppler_page_get_text             (PopplerPage        *page);
+char                  *poppler_page_get_selected_text    (PopplerPage        *page,
+                                                         PopplerSelectionStyle style,
+                                                         PopplerRectangle   *selection);
+cairo_region_t        *poppler_page_get_selected_region  (PopplerPage        *page,
+                                                          gdouble             scale,
+                                                          PopplerSelectionStyle  style,
+                                                          PopplerRectangle   *selection);
+GList                 *poppler_page_get_selection_region (PopplerPage        *page,
+                                                         gdouble             scale,
+                                                         PopplerSelectionStyle style,
+                                                         PopplerRectangle   *selection);
+void                   poppler_page_selection_region_free(GList              *region);
+GList                 *poppler_page_get_link_mapping     (PopplerPage        *page);
+void                   poppler_page_free_link_mapping    (GList              *list);
+GList                 *poppler_page_get_image_mapping    (PopplerPage        *page);
+void                   poppler_page_free_image_mapping   (GList              *list);
+cairo_surface_t       *poppler_page_get_image            (PopplerPage        *page,
+                                                         gint                image_id);
+GList              *poppler_page_get_form_field_mapping  (PopplerPage        *page);
+void                poppler_page_free_form_field_mapping (GList              *list);
+GList                 *poppler_page_get_annot_mapping    (PopplerPage        *page);
+void                   poppler_page_free_annot_mapping   (GList              *list);
+void                   poppler_page_add_annot            (PopplerPage        *page,
+                                                         PopplerAnnot       *annot);
+void                 poppler_page_get_crop_box          (PopplerPage        *page,
+                                                         PopplerRectangle   *rect);
+gboolean               poppler_page_get_text_layout      (PopplerPage        *page,
+                                                          PopplerRectangle  **rectangles,
+                                                          guint              *n_rectangles);
+GList                 *poppler_page_get_text_attributes  (PopplerPage        *page);
+void                   poppler_page_free_text_attributes (GList              *list);
+
+/* A rectangle on a page, with coordinates in PDF points. */
+#define POPPLER_TYPE_RECTANGLE             (poppler_rectangle_get_type ())
+/**
+ * PopplerRectangle:
+ * @x1: x coordinate of lower left corner
+ * @y1: y coordinate of lower left corner
+ * @x2: x coordinate of upper right corner
+ * @y2: y coordinate of upper right corner
+ *
+ * A #PopplerRectangle is used to describe
+ * locations on a page and bounding boxes
+ */
+struct _PopplerRectangle
+{
+  gdouble x1;
+  gdouble y1;
+  gdouble x2;
+  gdouble y2;
+};
+
+GType             poppler_rectangle_get_type (void) G_GNUC_CONST;
+PopplerRectangle *poppler_rectangle_new      (void);
+PopplerRectangle *poppler_rectangle_copy     (PopplerRectangle *rectangle);
+void              poppler_rectangle_free     (PopplerRectangle *rectangle);
+
+/* A color in RGB */
+#define POPPLER_TYPE_COLOR                 (poppler_color_get_type ())
+
+/**
+ * PopplerColor:
+ * @red: the red componment of color
+ * @green: the green component of color
+ * @blue: the blue component of color
+ *
+ * A #PopplerColor describes a RGB color. Color components
+ * are values between 0 and 65535
+ */
+struct _PopplerColor
+{
+  guint16 red;
+  guint16 green;
+  guint16 blue;
+};
+
+GType             poppler_color_get_type      (void) G_GNUC_CONST;
+PopplerColor     *poppler_color_new           (void);
+PopplerColor     *poppler_color_copy          (PopplerColor *color);
+void              poppler_color_free          (PopplerColor *color);
+
+/* Text attributes. */
+#define POPPLER_TYPE_TEXT_ATTRIBUTES             (poppler_text_attributes_get_type ())
+/**
+ * PopplerTextAttributes:
+ * @font_name: font name
+ * @font_size: font size
+ * @is_underlined: if text is underlined
+ * @color: a #PopplerColor, the foreground color
+ * @start_index: start position this text attributes apply
+ * @end_index: end position this text text attributes apply
+ *
+ * A #PopplerTextAttributes is used to describe text attributes of a range of text
+ *
+ * Since: 0.18
+ */
+struct _PopplerTextAttributes
+{
+  gchar *font_name;
+  gdouble font_size;
+  gboolean is_underlined;
+  PopplerColor color;
+
+  gint start_index;
+  gint end_index;
+};
+
+GType                  poppler_text_attributes_get_type (void) G_GNUC_CONST;
+PopplerTextAttributes *poppler_text_attributes_new      (void);
+PopplerTextAttributes *poppler_text_attributes_copy     (PopplerTextAttributes *text_attrs);
+void                   poppler_text_attributes_free     (PopplerTextAttributes *text_attrs);
+
+/* Mapping between areas on the current page and PopplerActions */
+#define POPPLER_TYPE_LINK_MAPPING             (poppler_link_mapping_get_type ())
+
+/**
+ * PopplerLinkMapping:
+ * @area: a #PopplerRectangle representing an area of the page
+ * @action: a #PopplerAction
+ *
+ * A #PopplerLinkMapping structure represents the location
+ * of @action on the page
+ */
+struct  _PopplerLinkMapping
+{
+  PopplerRectangle area;
+  PopplerAction *action;
+};
+
+GType               poppler_link_mapping_get_type (void) G_GNUC_CONST;
+PopplerLinkMapping *poppler_link_mapping_new      (void);
+PopplerLinkMapping *poppler_link_mapping_copy     (PopplerLinkMapping *mapping);
+void                poppler_link_mapping_free     (PopplerLinkMapping *mapping);
+
+/* Page Transition */
+#define POPPLER_TYPE_PAGE_TRANSITION                (poppler_page_transition_get_type ())
+
+/**
+ * PopplerPageTransition:
+ * @type: the type of transtition
+ * @alignment: the dimension in which the transition effect shall occur.
+ * Only for #POPPLER_PAGE_TRANSITION_SPLIT and #POPPLER_PAGE_TRANSITION_BLINDS transition types
+ * @direction: the direccion of motion for the transition effect.
+ * Only for #POPPLER_PAGE_TRANSITION_SPLIT, #POPPLER_PAGE_TRANSITION_BOX and #POPPLER_PAGE_TRANSITION_FLY
+ * transition types
+ * @duration: the duration of the transition effect
+ * @angle: the direction in which the specified transition effect shall moves,
+ * expressed in degrees counterclockwise starting from a left-to-right direction.
+ * Only for #POPPLER_PAGE_TRANSITION_WIPE, #POPPLER_PAGE_TRANSITION_GLITTER, #POPPLER_PAGE_TRANSITION_FLY,
+ * #POPPLER_PAGE_TRANSITION_COVER, #POPPLER_PAGE_TRANSITION_UNCOVER and #POPPLER_PAGE_TRANSITION_PUSH
+ * transition types
+ * @scale: the starting or ending scale at which the changes shall be drawn.
+ * Only for #POPPLER_PAGE_TRANSITION_FLY transition type
+ * @rectangular: whether the area that will be flown is rectangular and opaque.
+ * Only for #POPPLER_PAGE_TRANSITION_FLY transition type
+ *
+ * A #PopplerPageTransition structures describes a visual transition
+ * to use when moving between pages during a presentation
+ */
+struct _PopplerPageTransition
+{
+  PopplerPageTransitionType type;
+  PopplerPageTransitionAlignment alignment;
+  PopplerPageTransitionDirection direction;
+  gint duration;
+  gint angle;
+  gdouble scale;
+  gboolean rectangular;
+};
+
+GType                  poppler_page_transition_get_type (void) G_GNUC_CONST;
+PopplerPageTransition *poppler_page_transition_new      (void);
+PopplerPageTransition *poppler_page_transition_copy     (PopplerPageTransition *transition);
+void                   poppler_page_transition_free     (PopplerPageTransition *transition);
+
+/* Mapping between areas on the current page and images */
+#define POPPLER_TYPE_IMAGE_MAPPING             (poppler_image_mapping_get_type ())
+
+/**
+ * PopplerImageMapping:
+ * @area: a #PopplerRectangle representing an area of the page
+ * @image_id: an image identifier
+ *
+ * A #PopplerImageMapping structure represents the location
+ * of an image on the page
+ */
+struct  _PopplerImageMapping
+{
+  PopplerRectangle area;
+  gint image_id;       
+};
+
+GType                  poppler_image_mapping_get_type (void) G_GNUC_CONST;
+PopplerImageMapping   *poppler_image_mapping_new      (void);
+PopplerImageMapping   *poppler_image_mapping_copy     (PopplerImageMapping *mapping);
+void                   poppler_image_mapping_free     (PopplerImageMapping *mapping);
+
+/* Mapping between areas on the current page and form fields */
+#define POPPLER_TYPE_FORM_FIELD_MAPPING               (poppler_form_field_mapping_get_type ())
+
+/**
+ * PopplerFormFieldMapping:
+ * @area: a #PopplerRectangle representing an area of the page
+ * @field: a #PopplerFormField
+ *
+ * A #PopplerFormFieldMapping structure represents the location
+ * of @field on the page
+ */
+struct  _PopplerFormFieldMapping
+{
+  PopplerRectangle area;
+  PopplerFormField *field;
+};
+
+GType                    poppler_form_field_mapping_get_type (void) G_GNUC_CONST;
+PopplerFormFieldMapping *poppler_form_field_mapping_new      (void);
+PopplerFormFieldMapping *poppler_form_field_mapping_copy     (PopplerFormFieldMapping *mapping);
+void                     poppler_form_field_mapping_free     (PopplerFormFieldMapping *mapping);
+
+/* Mapping between areas on the current page and annots */
+#define POPPLER_TYPE_ANNOT_MAPPING                  (poppler_annot_mapping_get_type ())
+
+/**
+ * PopplerAnnotMapping:
+ * @area: a #PopplerRectangle representing an area of the page
+ * @annot: a #PopplerAnnot
+ *
+ * A #PopplerAnnotMapping structure represents the location
+ * of @annot on the page
+ */
+struct _PopplerAnnotMapping
+{
+  PopplerRectangle area;
+  PopplerAnnot *annot;
+};
+
+GType                poppler_annot_mapping_get_type (void) G_GNUC_CONST;
+PopplerAnnotMapping *poppler_annot_mapping_new      (void);
+PopplerAnnotMapping *poppler_annot_mapping_copy     (PopplerAnnotMapping *mapping);
+void                 poppler_annot_mapping_free     (PopplerAnnotMapping *mapping);
+
+G_END_DECLS
+
+#endif /* __POPPLER_PAGE_H__ */
diff --git a/glib/poppler-private.h b/glib/poppler-private.h
new file mode 100644 (file)
index 0000000..ab39b49
--- /dev/null
@@ -0,0 +1,147 @@
+#ifndef __POPPLER_PRIVATE_H__
+#define __POPPLER_PRIVATE_H__
+
+#include <config.h>
+
+#ifndef __GI_SCANNER__
+#include <PDFDoc.h>
+#include <PSOutputDev.h>
+#include <Link.h>
+#include <Movie.h>
+#include <Rendition.h>
+#include <Form.h>
+#include <Gfx.h>
+#include <FontInfo.h>
+#include <TextOutputDev.h>
+#include <Catalog.h>
+#include <OptionalContent.h>
+#include <CairoOutputDev.h>
+#include <FileSpec.h>
+#endif
+
+struct _PopplerDocument
+{
+  /*< private >*/
+  GObject parent_instance;
+  PDFDoc *doc;
+
+  GList *layers;
+  GList *layers_rbgroups;
+  CairoOutputDev *output_dev;
+};
+
+struct _PopplerPSFile
+{
+  /*< private >*/
+  GObject parent_instance;
+
+  PopplerDocument *document;
+  PSOutputDev *out;
+  char *filename;
+  int first_page;
+  int last_page;
+  double paper_width;
+  double paper_height;
+  gboolean duplex;
+};
+
+struct _PopplerFontInfo
+{
+  /*< private >*/
+  GObject parent_instance;
+  PopplerDocument *document;
+  FontInfoScanner *scanner;
+};
+
+struct _PopplerPage
+{
+  /*< private >*/
+  GObject parent_instance;
+  PopplerDocument *document;
+  Page *page;
+  int index;
+  TextPage *text;
+};
+
+struct _PopplerFormField
+{
+  /*< private >*/
+  GObject parent_instance;
+  PopplerDocument *document;
+  FormWidget *widget;
+  PopplerAction *action;
+};
+
+struct _PopplerAnnot
+{
+  GObject  parent_instance;
+  Annot   *annot;
+};
+
+typedef struct _Layer {
+  /*< private >*/
+  GList *kids;
+  gchar *label;
+  OptionalContentGroup *oc;
+} Layer;
+
+struct _PopplerLayer
+{
+  /*< private >*/
+  GObject parent_instance;
+  PopplerDocument *document;
+  Layer *layer;
+  GList *rbgroup;
+  gchar *title;
+};
+
+GList         *_poppler_document_get_layers (PopplerDocument *document);
+GList         *_poppler_document_get_layer_rbgroup (PopplerDocument *document,
+                                                   Layer           *layer);
+PopplerPage   *_poppler_page_new   (PopplerDocument *document,
+                                   Page            *page,
+                                   int              index);
+PopplerAction *_poppler_action_new (PopplerDocument *document,
+                                   LinkAction      *link,
+                                   const gchar     *title);
+PopplerLayer  *_poppler_layer_new (PopplerDocument  *document,
+                                  Layer            *layer,
+                                  GList            *rbgroup);
+PopplerDest   *_poppler_dest_new_goto (PopplerDocument *document,
+                                      LinkDest        *link_dest);
+PopplerFormField *_poppler_form_field_new (PopplerDocument *document,
+                                          FormWidget      *field);
+PopplerAttachment *_poppler_attachment_new (FileSpec *file);
+PopplerMovie      *_poppler_movie_new (Movie *movie);
+PopplerMedia      *_poppler_media_new (MediaRendition *media);
+PopplerAnnot      *_poppler_annot_new           (Annot *annot);
+PopplerAnnot      *_poppler_annot_text_new      (Annot *annot);
+PopplerAnnot      *_poppler_annot_free_text_new (Annot *annot);
+PopplerAnnot      *_poppler_annot_file_attachment_new (Annot *annot);
+PopplerAnnot      *_poppler_annot_movie_new (Annot *annot);
+PopplerAnnot      *_poppler_annot_screen_new (Annot *annot);
+
+char *_poppler_goo_string_to_utf8(GooString *s);
+gboolean _poppler_convert_pdf_date_to_gtime (GooString *date,
+                                            time_t    *gdate);
+
+/*
+ * A convenience macro for boxed type implementations, which defines a
+ * type_name_get_type() function registering the boxed type.
+ */
+#define POPPLER_DEFINE_BOXED_TYPE(TypeName, type_name, copy_func, free_func)          \
+GType                                                                                 \
+type_name##_get_type (void)                                                           \
+{                                                                                     \
+        static volatile gsize g_define_type_id__volatile = 0;                         \
+       if (g_once_init_enter (&g_define_type_id__volatile)) {                        \
+               GType g_define_type_id =                                              \
+                   g_boxed_type_register_static (g_intern_static_string (#TypeName), \
+                                                 (GBoxedCopyFunc) copy_func,         \
+                                                 (GBoxedFreeFunc) free_func);        \
+               g_once_init_leave (&g_define_type_id__volatile, g_define_type_id);    \
+       }                                                                             \
+       return g_define_type_id__volatile;                                            \
+}
+
+#endif
diff --git a/glib/poppler.cc b/glib/poppler.cc
new file mode 100644 (file)
index 0000000..cc2ca4d
--- /dev/null
@@ -0,0 +1,58 @@
+/* poppler.cc: glib wrapper for poppler
+ * Copyright (C) 2005, Red Hat, Inc.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include <config.h>
+#include "poppler.h"
+
+GQuark poppler_error_quark (void)
+{
+  static GQuark q = 0;
+
+  if (q == 0)
+    q = g_quark_from_static_string ("poppler-quark");
+
+  return q;
+}
+
+/**
+ * poppler_get_backend:
+ * 
+ * Returns the backend compiled into the poppler library.
+ * 
+ * Return value: The backend used by poppler
+ **/
+PopplerBackend
+poppler_get_backend (void)
+{
+  return POPPLER_BACKEND_CAIRO;
+}
+
+static const char poppler_version[] = PACKAGE_VERSION;
+
+/**
+ * poppler_get_version:
+ * 
+ * Returns the version of poppler in use.  This result is not to be freed.
+ * 
+ * Return value: the version of poppler.
+ **/
+const char *
+poppler_get_version (void)
+{
+  return poppler_version;
+}
diff --git a/glib/poppler.h b/glib/poppler.h
new file mode 100644 (file)
index 0000000..6c2eefd
--- /dev/null
@@ -0,0 +1,213 @@
+/* poppler.h: glib interface to poppler
+ * Copyright (C) 2004, Red Hat, Inc.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#ifndef __POPPLER_GLIB_H__
+#define __POPPLER_GLIB_H__
+
+#include <glib-object.h>
+
+G_BEGIN_DECLS
+
+GQuark poppler_error_quark (void);
+
+#define POPPLER_ERROR poppler_error_quark ()
+
+/**
+ * PopplerError:
+ * @POPPLER_ERROR_INVALID: Generic error when a document opration fails
+ * @POPPLER_ERROR_ENCRYPTED: Document is encrypted
+ * @POPPLER_ERROR_OPEN_FILE: File could not be opened for writing when saving document
+ * @POPPLER_ERROR_BAD_CATALOG: Failed to read the document catalog
+ * @POPPLER_ERROR_DAMAGED: Document is damaged
+ *
+ * Error codes returned by #PopplerDocument
+ */
+typedef enum
+{
+  POPPLER_ERROR_INVALID,
+  POPPLER_ERROR_ENCRYPTED,
+  POPPLER_ERROR_OPEN_FILE,
+  POPPLER_ERROR_BAD_CATALOG,
+  POPPLER_ERROR_DAMAGED
+} PopplerError;
+
+typedef enum
+{
+  POPPLER_ORIENTATION_PORTRAIT,
+  POPPLER_ORIENTATION_LANDSCAPE,
+  POPPLER_ORIENTATION_UPSIDEDOWN,
+  POPPLER_ORIENTATION_SEASCAPE
+} PopplerOrientation;
+
+/**
+ * PopplerPageTransitionType:
+ * @POPPLER_PAGE_TRANSITION_REPLACE: the new page replace the old one
+ * @POPPLER_PAGE_TRANSITION_SPLIT: two lines sweep across the screen, revealing the new page
+ * @POPPLER_PAGE_TRANSITION_BLINDS: multiple lines, evenly spaced across the screen, synchronously
+ * sweep in the same direction to reveal the new page
+ * @POPPLER_PAGE_TRANSITION_BOX: a rectangular box sweeps inward from the edges of the page or
+ * outward from the center revealing the new page
+ * @POPPLER_PAGE_TRANSITION_WIPE: a single line sweeps across the screen from one edge to the other
+ * revealing the new page
+ * @POPPLER_PAGE_TRANSITION_DISSOLVE: the old page dissolves gradually to reveal the new one
+ * @POPPLER_PAGE_TRANSITION_GLITTER: similar to #POPPLER_PAGE_TRANSITION_DISSOLVE, except that the effect
+ * sweeps across the page in a wide band moving from one side of the screen to the other
+ * @POPPLER_PAGE_TRANSITION_FLY: changes are flown out or in to or from a location that is offscreen
+ * @POPPLER_PAGE_TRANSITION_PUSH: the old page slides off the screen while the new page slides in
+ * @POPPLER_PAGE_TRANSITION_COVER: the new page slides on to the screen covering the old page
+ * @POPPLER_PAGE_TRANSITION_UNCOVER: the old page slides off the screen uncovering the new page
+ * @POPPLER_PAGE_TRANSITION_FADE: the new page gradually becomes visible through the old one
+ *
+ * Page transition types
+ */
+typedef enum
+{
+  POPPLER_PAGE_TRANSITION_REPLACE,
+  POPPLER_PAGE_TRANSITION_SPLIT,
+  POPPLER_PAGE_TRANSITION_BLINDS,
+  POPPLER_PAGE_TRANSITION_BOX,
+  POPPLER_PAGE_TRANSITION_WIPE,
+  POPPLER_PAGE_TRANSITION_DISSOLVE,
+  POPPLER_PAGE_TRANSITION_GLITTER,
+  POPPLER_PAGE_TRANSITION_FLY,
+  POPPLER_PAGE_TRANSITION_PUSH,
+  POPPLER_PAGE_TRANSITION_COVER,
+  POPPLER_PAGE_TRANSITION_UNCOVER,
+  POPPLER_PAGE_TRANSITION_FADE
+} PopplerPageTransitionType;
+
+/**
+ * PopplerPageTransitionAlignment:
+ * @POPPLER_PAGE_TRANSITION_HORIZONTAL: horizontal dimension
+ * @POPPLER_PAGE_TRANSITION_VERTICAL: vertical dimension
+ *
+ * Page transition alignment types for #POPPLER_PAGE_TRANSITION_SPLIT
+ * and #POPPLER_PAGE_TRANSITION_BLINDS transition types
+ */
+typedef enum
+{
+  POPPLER_PAGE_TRANSITION_HORIZONTAL,
+  POPPLER_PAGE_TRANSITION_VERTICAL
+} PopplerPageTransitionAlignment;
+
+/**
+ * PopplerPageTransitionDirection:
+ * @POPPLER_PAGE_TRANSITION_INWARD: inward from the edges of the page
+ * @POPPLER_PAGE_TRANSITION_OUTWARD: outward from the center of the page
+ *
+ * Page transition direction types for #POPPLER_PAGE_TRANSITION_SPLIT,
+ * #POPPLER_PAGE_TRANSITION_BOX and #POPPLER_PAGE_TRANSITION_FLY transition types
+ */
+typedef enum
+{
+  POPPLER_PAGE_TRANSITION_INWARD,
+  POPPLER_PAGE_TRANSITION_OUTWARD
+} PopplerPageTransitionDirection;
+
+/**
+ * PopplerSelectionStyle:
+ * @POPPLER_SELECTION_GLYPH: glyph is the minimum unit for selection
+ * @POPPLER_SELECTION_WORD: word is the minimum unit for selection
+ * @POPPLER_SELECTION_LINE: line is the minimum unit for selection
+ *
+ * Selection styles
+ */
+typedef enum
+{
+  POPPLER_SELECTION_GLYPH,
+  POPPLER_SELECTION_WORD,
+  POPPLER_SELECTION_LINE
+} PopplerSelectionStyle;
+
+/**
+ * PopplerPrintFlags:
+ * @POPPLER_PRINT_DOCUMENT: print main document contents
+ * @POPPLER_PRINT_MARKUP_ANNOTS: print document and markup annotations
+ * @POPPLER_PRINT_STAMP_ANNOTS_ONLY: print document and only stamp annotations
+ * @POPPLER_PRINT_ALL: print main document contents and all markup annotations
+ *
+ * Printing flags
+ *
+ * Since: 0.16
+ */
+typedef enum /*< flags >*/
+{
+  POPPLER_PRINT_DOCUMENT          = 0,
+  POPPLER_PRINT_MARKUP_ANNOTS     = 1 << 0,
+  POPPLER_PRINT_STAMP_ANNOTS_ONLY = 1 << 1,
+  POPPLER_PRINT_ALL               = POPPLER_PRINT_MARKUP_ANNOTS
+} PopplerPrintFlags;
+
+typedef struct _PopplerDocument            PopplerDocument;
+typedef struct _PopplerIndexIter           PopplerIndexIter;
+typedef struct _PopplerFontsIter           PopplerFontsIter;
+typedef struct _PopplerLayersIter          PopplerLayersIter;
+typedef struct _PopplerRectangle           PopplerRectangle;
+typedef struct _PopplerTextAttributes      PopplerTextAttributes;
+typedef struct _PopplerColor               PopplerColor;
+typedef struct _PopplerLinkMapping         PopplerLinkMapping;
+typedef struct _PopplerPageTransition      PopplerPageTransition;
+typedef struct _PopplerImageMapping        PopplerImageMapping;
+typedef struct _PopplerFormFieldMapping    PopplerFormFieldMapping;
+typedef struct _PopplerAnnotMapping        PopplerAnnotMapping;
+typedef struct _PopplerPage                PopplerPage;
+typedef struct _PopplerFontInfo            PopplerFontInfo;
+typedef struct _PopplerLayer               PopplerLayer;
+typedef struct _PopplerPSFile              PopplerPSFile;
+typedef union  _PopplerAction              PopplerAction;
+typedef struct _PopplerDest                PopplerDest;
+typedef struct _PopplerActionLayer         PopplerActionLayer;
+typedef struct _PopplerFormField           PopplerFormField;
+typedef struct _PopplerAttachment          PopplerAttachment;
+typedef struct _PopplerMovie               PopplerMovie;
+typedef struct _PopplerMedia               PopplerMedia;
+typedef struct _PopplerAnnot               PopplerAnnot;
+typedef struct _PopplerAnnotMarkup         PopplerAnnotMarkup;
+typedef struct _PopplerAnnotText           PopplerAnnotText;
+typedef struct _PopplerAnnotFreeText       PopplerAnnotFreeText;
+typedef struct _PopplerAnnotFileAttachment PopplerAnnotFileAttachment;
+typedef struct _PopplerAnnotMovie          PopplerAnnotMovie;
+typedef struct _PopplerAnnotScreen         PopplerAnnotScreen;
+typedef struct _PopplerAnnotCalloutLine    PopplerAnnotCalloutLine;
+
+typedef enum
+{
+  POPPLER_BACKEND_UNKNOWN,
+  POPPLER_BACKEND_SPLASH,
+  POPPLER_BACKEND_CAIRO
+} PopplerBackend;
+
+PopplerBackend poppler_get_backend (void);
+const char *   poppler_get_version (void);
+
+G_END_DECLS
+
+#include "poppler-features.h"
+#include "poppler-document.h"
+#include "poppler-page.h"
+#include "poppler-layer.h"
+#include "poppler-action.h"
+#include "poppler-form-field.h"
+#include "poppler-enums.h"
+#include "poppler-attachment.h"
+#include "poppler-annot.h"
+#include "poppler-date.h"
+#include "poppler-movie.h"
+#include "poppler-media.h"
+
+#endif /* __POPPLER_GLIB_H__ */
diff --git a/glib/reference/Makefile.am b/glib/reference/Makefile.am
new file mode 100644 (file)
index 0000000..b01192d
--- /dev/null
@@ -0,0 +1,87 @@
+## Process this file with automake to produce Makefile.in
+
+# We require automake 1.6 at least.
+AUTOMAKE_OPTIONS = 1.6
+
+# This is a blank Makefile.am for using gtk-doc.
+# Copy this to your project's API docs directory and modify the variables to
+# suit your project. See the GTK+ Makefiles in gtk+/docs/reference for examples
+# of using the various options.
+
+# The name of the module, e.g. 'glib'.
+DOC_MODULE=poppler
+
+# The top-level SGML file. You can change this if you want to.
+DOC_MAIN_SGML_FILE=$(DOC_MODULE)-docs.sgml
+
+# Directories containing the source code.
+# gtk-doc will search all .c and .h files beneath these paths
+# for inline comments documenting functions and macros.
+# e.g. DOC_SOURCE_DIR=$(top_srcdir)/gtk $(top_srcdir)/gdk
+DOC_SOURCE_DIR=$(top_builddir)/glib $(top_srcdir)/glib
+
+# Extra options to pass to gtkdoc-scangobj. Not normally needed.
+SCANGOBJ_OPTIONS=
+
+# Extra options to supply to gtkdoc-scan.
+# e.g. SCAN_OPTIONS=--deprecated-guards="GTK_DISABLE_DEPRECATED" 
+SCAN_OPTIONS=
+
+# Extra options to supply to gtkdoc-mkdb.
+# e.g. MKDB_OPTIONS=--sgml-mode --output-format=xml
+MKDB_OPTIONS=--sgml-mode --output-format=xml --source-suffixes=c,cc,h
+
+# Extra options to supply to gtkdoc-mktmpl
+# e.g. MKTMPL_OPTIONS=--only-section-tmpl
+MKTMPL_OPTIONS=
+
+# Extra options to supply to gtkdoc-fixref. Not normally needed.
+# e.g. FIXXREF_OPTIONS=--extra-dir=../gdk-pixbuf/html --extra-dir=../gdk/html
+FIXXREF_OPTIONS=
+
+# Used for dependencies. The docs will be rebuilt if any of these change.
+# e.g. HFILE_GLOB=$(top_srcdir)/gtk/*.h
+# e.g. CFILE_GLOB=$(top_srcdir)/gtk/*.c
+HFILE_GLOB=$(top_srcdir)/glib/*.h
+CFILE_GLOB=$(top_srcdir)/glib/*.cc
+
+# Header files to ignore when scanning.
+# e.g. IGNORE_HFILES=gtkdebug.h gtkintl.h
+IGNORE_HFILES=demo
+
+# Images to copy into HTML directory.
+# e.g. HTML_IMAGES=$(top_srcdir)/gtk/stock-icons/stock_about_24.png
+HTML_IMAGES=
+
+# Extra SGML files that are included by $(DOC_MAIN_SGML_FILE).
+# e.g. content_files=running.sgml building.sgml changes-2.0.sgml
+content_files=version.xml
+
+# SGML files where gtk-doc abbrevations (#GtkWidget) are expanded
+# These files must be listed here *and* in content_files
+# e.g. expand_content_files=running.sgml
+expand_content_files=
+
+# CFLAGS and LDFLAGS for compiling gtkdoc-scangobj with your library.
+# Only needed if you are using gtkdoc-scangobj to dynamically query widget
+# signals and properties.
+# e.g. INCLUDES=-I$(top_srcdir) -I$(top_builddir) $(GTK_DEBUG_FLAGS)
+# e.g. GTKDOC_LIBS=$(top_builddir)/gtk/$(gtktargetlib)
+INCLUDES=-I$(top_srcdir)/glib -I$(top_builddir)/glib   \
+       $(CAIRO_CFLAGS)                                 \
+       $(POPPLER_GLIB_CFLAGS)                          \
+       $(FREETYPE_CFLAGS)
+
+GTKDOC_LIBS=$(top_builddir)/poppler/libpoppler.la      \
+       $(top_builddir)/glib/libpoppler-glib.la         \
+       $(POPPLER_GLIB_LIBS)                            \
+       $(FREETYPE_LIBS)                                \
+       $(cairo_libs)
+
+
+# This includes the standard gtk-doc make rules, copied by gtkdocize.
+include $(top_srcdir)/gtk-doc.make
+
+# Other files to distribute
+# e.g. EXTRA_DIST += version.xml.in
+EXTRA_DIST += version.xml.in
diff --git a/glib/reference/Makefile.in b/glib/reference/Makefile.in
new file mode 100644 (file)
index 0000000..402f7b5
--- /dev/null
@@ -0,0 +1,806 @@
+# Makefile.in generated by automake 1.11.5 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software
+# Foundation, Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+@SET_MAKE@
+
+# -*- mode: makefile -*-
+
+####################################
+# Everything below here is generic #
+####################################
+VPATH = @srcdir@
+am__make_dryrun = \
+  { \
+    am__dry=no; \
+    case $$MAKEFLAGS in \
+      *\\[\ \  ]*) \
+        echo 'am--echo: ; @echo "AM"  OK' | $(MAKE) -f - 2>/dev/null \
+          | grep '^AM OK$$' >/dev/null || am__dry=yes;; \
+      *) \
+        for am__flg in $$MAKEFLAGS; do \
+          case $$am__flg in \
+            *=*|--*) ;; \
+            *n*) am__dry=yes; break;; \
+          esac; \
+        done;; \
+    esac; \
+    test $$am__dry = yes; \
+  }
+pkgdatadir = $(datadir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkglibexecdir = $(libexecdir)/@PACKAGE@
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \
+       $(srcdir)/version.xml.in $(top_srcdir)/gtk-doc.make
+subdir = glib/reference
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/m4/acx_pthread.m4 \
+       $(top_srcdir)/m4/define-dir.m4 $(top_srcdir)/m4/gtk-doc.m4 \
+       $(top_srcdir)/m4/iconv.m4 $(top_srcdir)/m4/introspection.m4 \
+       $(top_srcdir)/m4/libjpeg.m4 $(top_srcdir)/m4/libtool.m4 \
+       $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \
+       $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \
+       $(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+       $(ACLOCAL_M4)
+mkinstalldirs = $(install_sh) -d
+CONFIG_HEADER = $(top_builddir)/config.h \
+       $(top_builddir)/poppler/poppler-config.h
+CONFIG_CLEAN_FILES = version.xml
+CONFIG_CLEAN_VPATH_FILES =
+AM_V_GEN = $(am__v_GEN_@AM_V@)
+am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@)
+am__v_GEN_0 = @echo "  GEN   " $@;
+AM_V_at = $(am__v_at_@AM_V@)
+am__v_at_ = $(am__v_at_@AM_DEFAULT_V@)
+am__v_at_0 = @
+SOURCES =
+DIST_SOURCES =
+am__can_run_installinfo = \
+  case $$AM_UPDATE_INFO_DIR in \
+    n|no|NO) false;; \
+    *) (install-info --version) >/dev/null 2>&1;; \
+  esac
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AR = @AR@
+AS = @AS@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CAIRO_CFLAGS = @CAIRO_CFLAGS@
+CAIRO_FEATURE = @CAIRO_FEATURE@
+CAIRO_LIBS = @CAIRO_LIBS@
+CAIRO_REQ = @CAIRO_REQ@
+CAIRO_VERSION = @CAIRO_VERSION@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CXX = @CXX@
+CXXCPP = @CXXCPP@
+CXXDEPMODE = @CXXDEPMODE@
+CXXFLAGS = @CXXFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DLLTOOL = @DLLTOOL@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+FGREP = @FGREP@
+FONTCONFIG_CFLAGS = @FONTCONFIG_CFLAGS@
+FONTCONFIG_LIBS = @FONTCONFIG_LIBS@
+FREETYPE_CFLAGS = @FREETYPE_CFLAGS@
+FREETYPE_CONFIG = @FREETYPE_CONFIG@
+FREETYPE_LIBS = @FREETYPE_LIBS@
+GLIB_MKENUMS = @GLIB_MKENUMS@
+GLIB_REQ = @GLIB_REQ@
+GLIB_REQUIRED = @GLIB_REQUIRED@
+GREP = @GREP@
+GTKDOC_CHECK = @GTKDOC_CHECK@
+GTKDOC_DEPS_CFLAGS = @GTKDOC_DEPS_CFLAGS@
+GTKDOC_DEPS_LIBS = @GTKDOC_DEPS_LIBS@
+GTKDOC_MKPDF = @GTKDOC_MKPDF@
+GTKDOC_REBASE = @GTKDOC_REBASE@
+GTK_TEST_CFLAGS = @GTK_TEST_CFLAGS@
+GTK_TEST_LIBS = @GTK_TEST_LIBS@
+HTML_DIR = @HTML_DIR@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+INTROSPECTION_CFLAGS = @INTROSPECTION_CFLAGS@
+INTROSPECTION_COMPILER = @INTROSPECTION_COMPILER@
+INTROSPECTION_GENERATE = @INTROSPECTION_GENERATE@
+INTROSPECTION_GIRDIR = @INTROSPECTION_GIRDIR@
+INTROSPECTION_LIBS = @INTROSPECTION_LIBS@
+INTROSPECTION_MAKEFILE = @INTROSPECTION_MAKEFILE@
+INTROSPECTION_SCANNER = @INTROSPECTION_SCANNER@
+INTROSPECTION_TYPELIBDIR = @INTROSPECTION_TYPELIBDIR@
+LCMS_CFLAGS = @LCMS_CFLAGS@
+LCMS_LIBS = @LCMS_LIBS@
+LD = @LD@
+LDFLAGS = @LDFLAGS@
+LIBCURL_CFLAGS = @LIBCURL_CFLAGS@
+LIBCURL_LIBS = @LIBCURL_LIBS@
+LIBICONV = @LIBICONV@
+LIBJPEG_CFLAGS = @LIBJPEG_CFLAGS@
+LIBJPEG_LIBS = @LIBJPEG_LIBS@
+LIBOBJS = @LIBOBJS@
+LIBOPENJPEG_CFLAGS = @LIBOPENJPEG_CFLAGS@
+LIBOPENJPEG_LIBS = @LIBOPENJPEG_LIBS@
+LIBPNG_CFLAGS = @LIBPNG_CFLAGS@
+LIBPNG_LIBS = @LIBPNG_LIBS@
+LIBS = @LIBS@
+LIBTIFF_CFLAGS = @LIBTIFF_CFLAGS@
+LIBTIFF_CFLAGSS = @LIBTIFF_CFLAGSS@
+LIBTIFF_LIBS = @LIBTIFF_LIBS@
+LIBTOOL = @LIBTOOL@
+LIPO = @LIPO@
+LN_S = @LN_S@
+LTLIBICONV = @LTLIBICONV@
+LTLIBOBJS = @LTLIBOBJS@
+MAKEINFO = @MAKEINFO@
+MANIFEST_TOOL = @MANIFEST_TOOL@
+MKDIR_P = @MKDIR_P@
+MOCQT4 = @MOCQT4@
+NM = @NM@
+NMEDIT = @NMEDIT@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+OTOOL = @OTOOL@
+OTOOL64 = @OTOOL64@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_URL = @PACKAGE_URL@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PC_REQUIRES = @PC_REQUIRES@
+PC_REQUIRES_PRIVATE = @PC_REQUIRES_PRIVATE@
+PDFTOCAIRO_CFLAGS = @PDFTOCAIRO_CFLAGS@
+PDFTOCAIRO_LIBS = @PDFTOCAIRO_LIBS@
+PKG_CONFIG = @PKG_CONFIG@
+PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@
+PKG_CONFIG_PATH = @PKG_CONFIG_PATH@
+POPPLER_DATADIR = @POPPLER_DATADIR@
+POPPLER_GLIB_CFLAGS = @POPPLER_GLIB_CFLAGS@
+POPPLER_GLIB_DISABLE_DEPRECATED = @POPPLER_GLIB_DISABLE_DEPRECATED@
+POPPLER_GLIB_DISABLE_SINGLE_INCLUDES = @POPPLER_GLIB_DISABLE_SINGLE_INCLUDES@
+POPPLER_GLIB_LIBS = @POPPLER_GLIB_LIBS@
+POPPLER_MAJOR_VERSION = @POPPLER_MAJOR_VERSION@
+POPPLER_MICRO_VERSION = @POPPLER_MICRO_VERSION@
+POPPLER_MINOR_VERSION = @POPPLER_MINOR_VERSION@
+POPPLER_QT4_CFLAGS = @POPPLER_QT4_CFLAGS@
+POPPLER_QT4_CXXFLAGS = @POPPLER_QT4_CXXFLAGS@
+POPPLER_QT4_LIBS = @POPPLER_QT4_LIBS@
+POPPLER_QT4_TEST_CFLAGS = @POPPLER_QT4_TEST_CFLAGS@
+POPPLER_QT4_TEST_LIBS = @POPPLER_QT4_TEST_LIBS@
+POPPLER_VERSION = @POPPLER_VERSION@
+PTHREAD_CC = @PTHREAD_CC@
+PTHREAD_CFLAGS = @PTHREAD_CFLAGS@
+PTHREAD_LIBS = @PTHREAD_LIBS@
+RANLIB = @RANLIB@
+SED = @SED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+TESTDATADIR = @TESTDATADIR@
+VERSION = @VERSION@
+XMKMF = @XMKMF@
+X_CFLAGS = @X_CFLAGS@
+X_EXTRA_LIBS = @X_EXTRA_LIBS@
+X_LIBS = @X_LIBS@
+X_PRE_LIBS = @X_PRE_LIBS@
+ZLIB_LIBS = @ZLIB_LIBS@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
+ac_ct_AR = @ac_ct_AR@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_CXX = @ac_ct_CXX@
+ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
+acx_pthread_config = @acx_pthread_config@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+auto_import_flags = @auto_import_flags@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+builddir = @builddir@
+create_shared_lib = @create_shared_lib@
+datadir = @datadir@
+datarootdir = @datarootdir@
+docdir = @docdir@
+dvidir = @dvidir@
+exec_prefix = @exec_prefix@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+htmldir = @htmldir@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localedir = @localedir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+srcdir = @srcdir@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+top_build_prefix = @top_build_prefix@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+win32_libs = @win32_libs@
+
+# We require automake 1.6 at least.
+AUTOMAKE_OPTIONS = 1.6
+
+# This is a blank Makefile.am for using gtk-doc.
+# Copy this to your project's API docs directory and modify the variables to
+# suit your project. See the GTK+ Makefiles in gtk+/docs/reference for examples
+# of using the various options.
+
+# The name of the module, e.g. 'glib'.
+DOC_MODULE = poppler
+
+# The top-level SGML file. You can change this if you want to.
+DOC_MAIN_SGML_FILE = $(DOC_MODULE)-docs.sgml
+
+# Directories containing the source code.
+# gtk-doc will search all .c and .h files beneath these paths
+# for inline comments documenting functions and macros.
+# e.g. DOC_SOURCE_DIR=$(top_srcdir)/gtk $(top_srcdir)/gdk
+DOC_SOURCE_DIR = $(top_builddir)/glib $(top_srcdir)/glib
+
+# Extra options to pass to gtkdoc-scangobj. Not normally needed.
+SCANGOBJ_OPTIONS = 
+
+# Extra options to supply to gtkdoc-scan.
+# e.g. SCAN_OPTIONS=--deprecated-guards="GTK_DISABLE_DEPRECATED" 
+SCAN_OPTIONS = 
+
+# Extra options to supply to gtkdoc-mkdb.
+# e.g. MKDB_OPTIONS=--sgml-mode --output-format=xml
+MKDB_OPTIONS = --sgml-mode --output-format=xml --source-suffixes=c,cc,h
+
+# Extra options to supply to gtkdoc-mktmpl
+# e.g. MKTMPL_OPTIONS=--only-section-tmpl
+MKTMPL_OPTIONS = 
+
+# Extra options to supply to gtkdoc-fixref. Not normally needed.
+# e.g. FIXXREF_OPTIONS=--extra-dir=../gdk-pixbuf/html --extra-dir=../gdk/html
+FIXXREF_OPTIONS = 
+
+# Used for dependencies. The docs will be rebuilt if any of these change.
+# e.g. HFILE_GLOB=$(top_srcdir)/gtk/*.h
+# e.g. CFILE_GLOB=$(top_srcdir)/gtk/*.c
+HFILE_GLOB = $(top_srcdir)/glib/*.h
+CFILE_GLOB = $(top_srcdir)/glib/*.cc
+
+# Header files to ignore when scanning.
+# e.g. IGNORE_HFILES=gtkdebug.h gtkintl.h
+IGNORE_HFILES = demo
+
+# Images to copy into HTML directory.
+# e.g. HTML_IMAGES=$(top_srcdir)/gtk/stock-icons/stock_about_24.png
+HTML_IMAGES = 
+
+# Extra SGML files that are included by $(DOC_MAIN_SGML_FILE).
+# e.g. content_files=running.sgml building.sgml changes-2.0.sgml
+content_files = version.xml
+
+# SGML files where gtk-doc abbrevations (#GtkWidget) are expanded
+# These files must be listed here *and* in content_files
+# e.g. expand_content_files=running.sgml
+expand_content_files = 
+
+# CFLAGS and LDFLAGS for compiling gtkdoc-scangobj with your library.
+# Only needed if you are using gtkdoc-scangobj to dynamically query widget
+# signals and properties.
+# e.g. INCLUDES=-I$(top_srcdir) -I$(top_builddir) $(GTK_DEBUG_FLAGS)
+# e.g. GTKDOC_LIBS=$(top_builddir)/gtk/$(gtktargetlib)
+INCLUDES = -I$(top_srcdir)/glib -I$(top_builddir)/glib \
+       $(CAIRO_CFLAGS)                                 \
+       $(POPPLER_GLIB_CFLAGS)                          \
+       $(FREETYPE_CFLAGS)
+
+GTKDOC_LIBS = $(top_builddir)/poppler/libpoppler.la    \
+       $(top_builddir)/glib/libpoppler-glib.la         \
+       $(POPPLER_GLIB_LIBS)                            \
+       $(FREETYPE_LIBS)                                \
+       $(cairo_libs)
+
+@GTK_DOC_USE_LIBTOOL_FALSE@GTKDOC_CC = $(CC) $(INCLUDES) $(GTKDOC_DEPS_CFLAGS) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
+@GTK_DOC_USE_LIBTOOL_TRUE@GTKDOC_CC = $(LIBTOOL) --tag=CC --mode=compile $(CC) $(INCLUDES) $(GTKDOC_DEPS_CFLAGS) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
+@GTK_DOC_USE_LIBTOOL_FALSE@GTKDOC_LD = $(CC) $(GTKDOC_DEPS_LIBS) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS)
+@GTK_DOC_USE_LIBTOOL_TRUE@GTKDOC_LD = $(LIBTOOL) --tag=CC --mode=link $(CC) $(GTKDOC_DEPS_LIBS) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS)
+@GTK_DOC_USE_LIBTOOL_FALSE@GTKDOC_RUN = 
+@GTK_DOC_USE_LIBTOOL_TRUE@GTKDOC_RUN = $(LIBTOOL) --mode=execute
+
+# We set GPATH here; this gives us semantics for GNU make
+# which are more like other make's VPATH, when it comes to
+# whether a source that is a target of one rule is then
+# searched for in VPATH/GPATH.
+#
+GPATH = $(srcdir)
+TARGET_DIR = $(HTML_DIR)/$(DOC_MODULE)
+SETUP_FILES = \
+       $(content_files)                \
+       $(DOC_MAIN_SGML_FILE)           \
+       $(DOC_MODULE)-sections.txt      \
+       $(DOC_MODULE)-overrides.txt
+
+
+# This includes the standard gtk-doc make rules, copied by gtkdocize.
+
+# Other files to distribute
+# e.g. EXTRA_DIST += version.xml.in
+EXTRA_DIST = $(HTML_IMAGES) $(SETUP_FILES) version.xml.in
+DOC_STAMPS = setup-build.stamp scan-build.stamp sgml-build.stamp \
+       html-build.stamp pdf-build.stamp \
+       sgml.stamp html.stamp pdf.stamp
+
+SCANOBJ_FILES = \
+       $(DOC_MODULE).args       \
+       $(DOC_MODULE).hierarchy  \
+       $(DOC_MODULE).interfaces \
+       $(DOC_MODULE).prerequisites \
+       $(DOC_MODULE).signals
+
+REPORT_FILES = \
+       $(DOC_MODULE)-undocumented.txt \
+       $(DOC_MODULE)-undeclared.txt \
+       $(DOC_MODULE)-unused.txt
+
+CLEANFILES = $(SCANOBJ_FILES) $(REPORT_FILES) $(DOC_STAMPS)
+@ENABLE_GTK_DOC_TRUE@@GTK_DOC_BUILD_HTML_FALSE@HTML_BUILD_STAMP = 
+@ENABLE_GTK_DOC_TRUE@@GTK_DOC_BUILD_HTML_TRUE@HTML_BUILD_STAMP = html-build.stamp
+@ENABLE_GTK_DOC_TRUE@@GTK_DOC_BUILD_PDF_FALSE@PDF_BUILD_STAMP = 
+@ENABLE_GTK_DOC_TRUE@@GTK_DOC_BUILD_PDF_TRUE@PDF_BUILD_STAMP = pdf-build.stamp
+all: all-am
+
+.SUFFIXES:
+$(srcdir)/Makefile.in:  $(srcdir)/Makefile.am $(top_srcdir)/gtk-doc.make $(am__configure_deps)
+       @for dep in $?; do \
+         case '$(am__configure_deps)' in \
+           *$$dep*) \
+             ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
+               && { if test -f $@; then exit 0; else break; fi; }; \
+             exit 1;; \
+         esac; \
+       done; \
+       echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign glib/reference/Makefile'; \
+       $(am__cd) $(top_srcdir) && \
+         $(AUTOMAKE) --foreign glib/reference/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+       @case '$?' in \
+         *config.status*) \
+           cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+         *) \
+           echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+           cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+       esac;
+$(top_srcdir)/gtk-doc.make:
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+       cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure:  $(am__configure_deps)
+       cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4):  $(am__aclocal_m4_deps)
+       cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(am__aclocal_m4_deps):
+version.xml: $(top_builddir)/config.status $(srcdir)/version.xml.in
+       cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@
+
+mostlyclean-libtool:
+       -rm -f *.lo
+
+clean-libtool:
+       -rm -rf .libs _libs
+tags: TAGS
+TAGS:
+
+ctags: CTAGS
+CTAGS:
+
+
+distdir: $(DISTFILES)
+       @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+       topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+       list='$(DISTFILES)'; \
+         dist_files=`for file in $$list; do echo $$file; done | \
+         sed -e "s|^$$srcdirstrip/||;t" \
+             -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+       case $$dist_files in \
+         */*) $(MKDIR_P) `echo "$$dist_files" | \
+                          sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+                          sort -u` ;; \
+       esac; \
+       for file in $$dist_files; do \
+         if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+         if test -d $$d/$$file; then \
+           dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+           if test -d "$(distdir)/$$file"; then \
+             find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+           fi; \
+           if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+             cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
+             find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+           fi; \
+           cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
+         else \
+           test -f "$(distdir)/$$file" \
+           || cp -p $$d/$$file "$(distdir)/$$file" \
+           || exit 1; \
+         fi; \
+       done
+       $(MAKE) $(AM_MAKEFLAGS) \
+         top_distdir="$(top_distdir)" distdir="$(distdir)" \
+         dist-hook
+check-am: all-am
+check: check-am
+all-am: Makefile all-local
+installdirs:
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+       @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+       if test -z '$(STRIP)'; then \
+         $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+           install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+             install; \
+       else \
+         $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+           install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+           "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
+       fi
+mostlyclean-generic:
+
+clean-generic:
+       -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES)
+
+distclean-generic:
+       -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+       -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
+
+maintainer-clean-generic:
+       @echo "This command is intended for maintainers to use"
+       @echo "it deletes files that may require special tools to rebuild."
+clean: clean-am
+
+clean-am: clean-generic clean-libtool clean-local mostlyclean-am
+
+distclean: distclean-am
+       -rm -f Makefile
+distclean-am: clean-am distclean-generic distclean-local
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+html-am:
+
+info: info-am
+
+info-am:
+
+install-data-am: install-data-local
+
+install-dvi: install-dvi-am
+
+install-dvi-am:
+
+install-exec-am:
+
+install-html: install-html-am
+
+install-html-am:
+
+install-info: install-info-am
+
+install-info-am:
+
+install-man:
+
+install-pdf: install-pdf-am
+
+install-pdf-am:
+
+install-ps: install-ps-am
+
+install-ps-am:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+       -rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic \
+       maintainer-clean-local
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-generic mostlyclean-libtool
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am: uninstall-local
+
+.MAKE: install-am install-strip
+
+.PHONY: all all-am all-local check check-am clean clean-generic \
+       clean-libtool clean-local dist-hook distclean \
+       distclean-generic distclean-libtool distclean-local distdir \
+       dvi dvi-am html html-am info info-am install install-am \
+       install-data install-data-am install-data-local install-dvi \
+       install-dvi-am install-exec install-exec-am install-html \
+       install-html-am install-info install-info-am install-man \
+       install-pdf install-pdf-am install-ps install-ps-am \
+       install-strip installcheck installcheck-am installdirs \
+       maintainer-clean maintainer-clean-generic \
+       maintainer-clean-local mostlyclean mostlyclean-generic \
+       mostlyclean-libtool pdf pdf-am ps ps-am uninstall uninstall-am \
+       uninstall-local
+
+
+@ENABLE_GTK_DOC_TRUE@all-local: $(HTML_BUILD_STAMP) $(PDF_BUILD_STAMP)
+@ENABLE_GTK_DOC_FALSE@all-local:
+
+docs: $(HTML_BUILD_STAMP) $(PDF_BUILD_STAMP)
+
+$(REPORT_FILES): sgml-build.stamp
+
+#### setup ####
+
+setup-build.stamp:
+       -@if test "$(abs_srcdir)" != "$(abs_builddir)" ; then \
+           echo '  DOC   Preparing build'; \
+           files=`echo $(SETUP_FILES) $(expand_content_files) $(DOC_MODULE).types`; \
+           if test "x$$files" != "x" ; then \
+               for file in $$files ; do \
+                   test -f $(abs_srcdir)/$$file && \
+                       cp -pu $(abs_srcdir)/$$file $(abs_builddir)/ || true; \
+               done; \
+           fi; \
+       fi
+       @touch setup-build.stamp
+
+#### scan ####
+
+scan-build.stamp: $(HFILE_GLOB) $(CFILE_GLOB)
+       @echo '  DOC   Scanning header files'
+       @_source_dir='' ; \
+       for i in $(DOC_SOURCE_DIR) ; do \
+           _source_dir="$${_source_dir} --source-dir=$$i" ; \
+       done ; \
+       gtkdoc-scan --module=$(DOC_MODULE) --ignore-headers="$(IGNORE_HFILES)" $${_source_dir} $(SCAN_OPTIONS) $(EXTRA_HFILES)
+       @if grep -l '^..*$$' $(DOC_MODULE).types > /dev/null 2>&1 ; then \
+           echo "  DOC   Introspecting gobjects"; \
+           scanobj_options=""; \
+           gtkdoc-scangobj 2>&1 --help | grep  >/dev/null "\-\-verbose"; \
+           if test "$(?)" = "0"; then \
+               if test "x$(V)" = "x1"; then \
+                   scanobj_options="--verbose"; \
+               fi; \
+           fi; \
+           CC="$(GTKDOC_CC)" LD="$(GTKDOC_LD)" RUN="$(GTKDOC_RUN)" CFLAGS="$(GTKDOC_CFLAGS) $(CFLAGS)" LDFLAGS="$(GTKDOC_LIBS) $(LDFLAGS)" \
+           gtkdoc-scangobj $(SCANGOBJ_OPTIONS) $$scanobj_options --module=$(DOC_MODULE); \
+       else \
+           for i in $(SCANOBJ_FILES) ; do \
+               test -f $$i || touch $$i ; \
+           done \
+       fi
+       @touch scan-build.stamp
+
+$(DOC_MODULE)-decl.txt $(SCANOBJ_FILES) $(DOC_MODULE)-sections.txt $(DOC_MODULE)-overrides.txt: scan-build.stamp
+       @true
+
+#### xml ####
+
+sgml-build.stamp: setup-build.stamp $(DOC_MODULE)-decl.txt $(SCANOBJ_FILES) $(DOC_MODULE)-sections.txt $(DOC_MODULE)-overrides.txt $(expand_content_files)
+       @echo '  DOC   Building XML'
+       @_source_dir='' ; \
+       for i in $(DOC_SOURCE_DIR) ; do \
+           _source_dir="$${_source_dir} --source-dir=$$i" ; \
+       done ; \
+       gtkdoc-mkdb --module=$(DOC_MODULE) --output-format=xml --expand-content-files="$(expand_content_files)" --main-sgml-file=$(DOC_MAIN_SGML_FILE) $${_source_dir} $(MKDB_OPTIONS)
+       @touch sgml-build.stamp
+
+sgml.stamp: sgml-build.stamp
+       @true
+
+#### html ####
+
+html-build.stamp: sgml.stamp $(DOC_MAIN_SGML_FILE) $(content_files)
+       @echo '  DOC   Building HTML'
+       @rm -rf html
+       @mkdir html
+       @mkhtml_options=""; \
+       gtkdoc-mkhtml 2>&1 --help | grep  >/dev/null "\-\-verbose"; \
+       if test "$(?)" = "0"; then \
+         if test "x$(V)" = "x1"; then \
+           mkhtml_options="$$mkhtml_options --verbose"; \
+         fi; \
+       fi; \
+       gtkdoc-mkhtml 2>&1 --help | grep  >/dev/null "\-\-path"; \
+       if test "$(?)" = "0"; then \
+         mkhtml_options="$$mkhtml_options --path=\"$(abs_srcdir)\""; \
+       fi; \
+       cd html && gtkdoc-mkhtml $$mkhtml_options $(MKHTML_OPTIONS) $(DOC_MODULE) ../$(DOC_MAIN_SGML_FILE)
+       -@test "x$(HTML_IMAGES)" = "x" || \
+       for file in $(HTML_IMAGES) ; do \
+         if test -f $(abs_srcdir)/$$file ; then \
+           cp $(abs_srcdir)/$$file $(abs_builddir)/html; \
+         fi; \
+         if test -f $(abs_builddir)/$$file ; then \
+           cp $(abs_builddir)/$$file $(abs_builddir)/html; \
+         fi; \
+       done;
+       @echo '  DOC   Fixing cross-references'
+       @gtkdoc-fixxref --module=$(DOC_MODULE) --module-dir=html --html-dir=$(HTML_DIR) $(FIXXREF_OPTIONS)
+       @touch html-build.stamp
+
+#### pdf ####
+
+pdf-build.stamp: sgml.stamp $(DOC_MAIN_SGML_FILE) $(content_files)
+       @echo '  DOC   Building PDF'
+       @rm -f $(DOC_MODULE).pdf
+       @mkpdf_options=""; \
+       gtkdoc-mkpdf 2>&1 --help | grep  >/dev/null "\-\-verbose"; \
+       if test "$(?)" = "0"; then \
+         if test "x$(V)" = "x1"; then \
+           mkpdf_options="$$mkpdf_options --verbose"; \
+         fi; \
+       fi; \
+       if test "x$(HTML_IMAGES)" != "x"; then \
+         for img in $(HTML_IMAGES); do \
+           part=`dirname $$img`; \
+           echo $$mkpdf_options | grep >/dev/null "\-\-imgdir=$$part "; \
+           if test $$? != 0; then \
+             mkpdf_options="$$mkpdf_options --imgdir=$$part"; \
+           fi; \
+         done; \
+       fi; \
+       gtkdoc-mkpdf --path="$(abs_srcdir)" $$mkpdf_options $(DOC_MODULE) $(DOC_MAIN_SGML_FILE) $(MKPDF_OPTIONS)
+       @touch pdf-build.stamp
+
+##############
+
+clean-local:
+       @rm -f *~ *.bak
+       @rm -rf .libs
+
+distclean-local:
+       @rm -rf xml html $(REPORT_FILES) $(DOC_MODULE).pdf \
+           $(DOC_MODULE)-decl-list.txt $(DOC_MODULE)-decl.txt
+       @if test "$(abs_srcdir)" != "$(abs_builddir)" ; then \
+           rm -f $(SETUP_FILES) $(expand_content_files) $(DOC_MODULE).types; \
+       fi
+
+maintainer-clean-local: clean
+       @rm -rf xml html
+
+install-data-local:
+       @installfiles=`echo $(builddir)/html/*`; \
+       if test "$$installfiles" = '$(builddir)/html/*'; \
+       then echo 1>&2 'Nothing to install' ; \
+       else \
+         if test -n "$(DOC_MODULE_VERSION)"; then \
+           installdir="$(DESTDIR)$(TARGET_DIR)-$(DOC_MODULE_VERSION)"; \
+         else \
+           installdir="$(DESTDIR)$(TARGET_DIR)"; \
+         fi; \
+         $(mkinstalldirs) $${installdir} ; \
+         for i in $$installfiles; do \
+           echo ' $(INSTALL_DATA) '$$i ; \
+           $(INSTALL_DATA) $$i $${installdir}; \
+         done; \
+         if test -n "$(DOC_MODULE_VERSION)"; then \
+           mv -f $${installdir}/$(DOC_MODULE).devhelp2 \
+             $${installdir}/$(DOC_MODULE)-$(DOC_MODULE_VERSION).devhelp2; \
+         fi; \
+         $(GTKDOC_REBASE) --relative --dest-dir=$(DESTDIR) --html-dir=$${installdir}; \
+       fi
+
+uninstall-local:
+       @if test -n "$(DOC_MODULE_VERSION)"; then \
+         installdir="$(DESTDIR)$(TARGET_DIR)-$(DOC_MODULE_VERSION)"; \
+       else \
+         installdir="$(DESTDIR)$(TARGET_DIR)"; \
+       fi; \
+       rm -rf $${installdir}
+
+#
+# Require gtk-doc when making dist
+#
+@ENABLE_GTK_DOC_TRUE@dist-check-gtkdoc:
+@ENABLE_GTK_DOC_FALSE@dist-check-gtkdoc:
+@ENABLE_GTK_DOC_FALSE@ @echo "*** gtk-doc must be installed and enabled in order to make dist"
+@ENABLE_GTK_DOC_FALSE@ @false
+
+dist-hook: dist-check-gtkdoc dist-hook-local
+       @mkdir $(distdir)/html
+       @cp ./html/* $(distdir)/html
+       @-cp ./$(DOC_MODULE).pdf $(distdir)/
+       @-cp ./$(DOC_MODULE).types $(distdir)/
+       @-cp ./$(DOC_MODULE)-sections.txt $(distdir)/
+       @cd $(distdir) && rm -f $(DISTCLEANFILES)
+       @$(GTKDOC_REBASE) --online --relative --html-dir=$(distdir)/html
+
+.PHONY : dist-hook-local docs
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/glib/reference/html/PopplerAnnot.html b/glib/reference/html/PopplerAnnot.html
new file mode 100644 (file)
index 0000000..fc2c4d4
--- /dev/null
@@ -0,0 +1,1298 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>PopplerAnnot</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.76.1">
+<link rel="home" href="index.html" title="Poppler Reference Manual">
+<link rel="up" href="ch01.html" title="Poppler">
+<link rel="prev" href="PopplerFormField.html" title="PoppplerFormField">
+<link rel="next" href="PopplerLayer.html" title="PopplerLayer">
+<meta name="generator" content="GTK-Doc V1.18 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="2">
+<tr valign="middle">
+<td><a accesskey="p" href="PopplerFormField.html"><img src="left.png" width="24" height="24" border="0" alt="Prev"></a></td>
+<td><a accesskey="u" href="ch01.html"><img src="up.png" width="24" height="24" border="0" alt="Up"></a></td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="24" height="24" border="0" alt="Home"></a></td>
+<th width="100%" align="center">Poppler Reference Manual</th>
+<td><a accesskey="n" href="PopplerLayer.html"><img src="right.png" width="24" height="24" border="0" alt="Next"></a></td>
+</tr>
+<tr><td colspan="5" class="shortcuts">
+<a href="#PopplerAnnot.synopsis" class="shortcut">Top</a>
+                   | 
+                  <a href="#PopplerAnnot.description" class="shortcut">Description</a>
+                   | 
+                  <a href="#PopplerAnnot.object-hierarchy" class="shortcut">Object Hierarchy</a>
+</td></tr>
+</table>
+<div class="refentry">
+<a name="PopplerAnnot"></a><div class="titlepage"></div>
+<div class="refnamediv"><table width="100%"><tr>
+<td valign="top">
+<h2><span class="refentrytitle"><a name="PopplerAnnot.top_of_page"></a>PopplerAnnot</span></h2>
+<p>PopplerAnnot — Annotations</p>
+</td>
+<td valign="top" align="right"></td>
+</tr></table></div>
+<div class="refsynopsisdiv">
+<a name="PopplerAnnot.synopsis"></a><h2>Synopsis</h2>
+<pre class="synopsis">
+#include &lt;poppler.h&gt;
+
+                    <a class="link" href="PopplerAnnot.html#PopplerAnnot-struct" title="PopplerAnnot">PopplerAnnot</a>;
+                    <a class="link" href="PopplerAnnot.html#PopplerAnnotMarkup" title="PopplerAnnotMarkup">PopplerAnnotMarkup</a>;
+                    <a class="link" href="PopplerAnnot.html#PopplerAnnotText" title="PopplerAnnotText">PopplerAnnotText</a>;
+                    <a class="link" href="PopplerAnnot.html#PopplerAnnotFreeText" title="PopplerAnnotFreeText">PopplerAnnotFreeText</a>;
+                    <a class="link" href="PopplerAnnot.html#PopplerAnnotFileAttachment" title="PopplerAnnotFileAttachment">PopplerAnnotFileAttachment</a>;
+                    <a class="link" href="PopplerAnnot.html#PopplerAnnotMovie" title="PopplerAnnotMovie">PopplerAnnotMovie</a>;
+                    <a class="link" href="PopplerAnnot.html#PopplerAnnotScreen" title="PopplerAnnotScreen">PopplerAnnotScreen</a>;
+enum                <a class="link" href="PopplerAnnot.html#PopplerAnnotType" title="enum PopplerAnnotType">PopplerAnnotType</a>;
+enum                <a class="link" href="PopplerAnnot.html#PopplerAnnotFlag" title="enum PopplerAnnotFlag">PopplerAnnotFlag</a>;
+enum                <a class="link" href="PopplerAnnot.html#PopplerAnnotExternalDataType" title="enum PopplerAnnotExternalDataType">PopplerAnnotExternalDataType</a>;
+enum                <a class="link" href="PopplerAnnot.html#PopplerAnnotMarkupReplyType" title="enum PopplerAnnotMarkupReplyType">PopplerAnnotMarkupReplyType</a>;
+enum                <a class="link" href="PopplerAnnot.html#PopplerAnnotTextState" title="enum PopplerAnnotTextState">PopplerAnnotTextState</a>;
+                    <a class="link" href="PopplerAnnot.html#PopplerAnnotCalloutLine" title="PopplerAnnotCalloutLine">PopplerAnnotCalloutLine</a>;
+enum                <a class="link" href="PopplerAnnot.html#PopplerAnnotFreeTextQuadding" title="enum PopplerAnnotFreeTextQuadding">PopplerAnnotFreeTextQuadding</a>;
+<a class="link" href="PopplerAnnot.html#PopplerAnnotType" title="enum PopplerAnnotType"><span class="returnvalue">PopplerAnnotType</span></a>    <a class="link" href="PopplerAnnot.html#poppler-annot-get-annot-type" title="poppler_annot_get_annot_type ()">poppler_annot_get_annot_type</a>        (<em class="parameter"><code><a class="link" href="PopplerAnnot.html" title="PopplerAnnot"><span class="type">PopplerAnnot</span></a> *poppler_annot</code></em>);
+<a class="link" href="PopplerAnnot.html#PopplerAnnotFlag" title="enum PopplerAnnotFlag"><span class="returnvalue">PopplerAnnotFlag</span></a>    <a class="link" href="PopplerAnnot.html#poppler-annot-get-flags" title="poppler_annot_get_flags ()">poppler_annot_get_flags</a>             (<em class="parameter"><code><a class="link" href="PopplerAnnot.html" title="PopplerAnnot"><span class="type">PopplerAnnot</span></a> *poppler_annot</code></em>);
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="returnvalue">gchar</span></a> *             <a class="link" href="PopplerAnnot.html#poppler-annot-get-name" title="poppler_annot_get_name ()">poppler_annot_get_name</a>              (<em class="parameter"><code><a class="link" href="PopplerAnnot.html" title="PopplerAnnot"><span class="type">PopplerAnnot</span></a> *poppler_annot</code></em>);
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="returnvalue">gint</span></a>                <a class="link" href="PopplerAnnot.html#poppler-annot-get-page-index" title="poppler_annot_get_page_index ()">poppler_annot_get_page_index</a>        (<em class="parameter"><code><a class="link" href="PopplerAnnot.html" title="PopplerAnnot"><span class="type">PopplerAnnot</span></a> *poppler_annot</code></em>);
+<a class="link" href="poppler-poppler.html#PopplerColor" title="PopplerColor"><span class="returnvalue">PopplerColor</span></a> *      <a class="link" href="PopplerAnnot.html#poppler-annot-get-color" title="poppler_annot_get_color ()">poppler_annot_get_color</a>             (<em class="parameter"><code><a class="link" href="PopplerAnnot.html" title="PopplerAnnot"><span class="type">PopplerAnnot</span></a> *poppler_annot</code></em>);
+<span class="returnvalue">void</span>                <a class="link" href="PopplerAnnot.html#poppler-annot-set-color" title="poppler_annot_set_color ()">poppler_annot_set_color</a>             (<em class="parameter"><code><a class="link" href="PopplerAnnot.html" title="PopplerAnnot"><span class="type">PopplerAnnot</span></a> *poppler_annot</code></em>,
+                                                         <em class="parameter"><code><a class="link" href="poppler-poppler.html#PopplerColor" title="PopplerColor"><span class="type">PopplerColor</span></a> *poppler_color</code></em>);
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="returnvalue">gchar</span></a> *             <a class="link" href="PopplerAnnot.html#poppler-annot-get-contents" title="poppler_annot_get_contents ()">poppler_annot_get_contents</a>          (<em class="parameter"><code><a class="link" href="PopplerAnnot.html" title="PopplerAnnot"><span class="type">PopplerAnnot</span></a> *poppler_annot</code></em>);
+<span class="returnvalue">void</span>                <a class="link" href="PopplerAnnot.html#poppler-annot-set-contents" title="poppler_annot_set_contents ()">poppler_annot_set_contents</a>          (<em class="parameter"><code><a class="link" href="PopplerAnnot.html" title="PopplerAnnot"><span class="type">PopplerAnnot</span></a> *poppler_annot</code></em>,
+                                                         <em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *contents</code></em>);
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="returnvalue">gchar</span></a> *             <a class="link" href="PopplerAnnot.html#poppler-annot-get-modified" title="poppler_annot_get_modified ()">poppler_annot_get_modified</a>          (<em class="parameter"><code><a class="link" href="PopplerAnnot.html" title="PopplerAnnot"><span class="type">PopplerAnnot</span></a> *poppler_annot</code></em>);
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="returnvalue">gchar</span></a> *             <a class="link" href="PopplerAnnot.html#poppler-annot-markup-get-label" title="poppler_annot_markup_get_label ()">poppler_annot_markup_get_label</a>      (<em class="parameter"><code><a class="link" href="PopplerAnnot.html#PopplerAnnotMarkup" title="PopplerAnnotMarkup"><span class="type">PopplerAnnotMarkup</span></a> *poppler_annot</code></em>);
+<span class="returnvalue">void</span>                <a class="link" href="PopplerAnnot.html#poppler-annot-markup-set-label" title="poppler_annot_markup_set_label ()">poppler_annot_markup_set_label</a>      (<em class="parameter"><code><a class="link" href="PopplerAnnot.html#PopplerAnnotMarkup" title="PopplerAnnotMarkup"><span class="type">PopplerAnnotMarkup</span></a> *poppler_annot</code></em>,
+                                                         <em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *label</code></em>);
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="returnvalue">gchar</span></a> *             <a class="link" href="PopplerAnnot.html#poppler-annot-markup-get-subject" title="poppler_annot_markup_get_subject ()">poppler_annot_markup_get_subject</a>    (<em class="parameter"><code><a class="link" href="PopplerAnnot.html#PopplerAnnotMarkup" title="PopplerAnnotMarkup"><span class="type">PopplerAnnotMarkup</span></a> *poppler_annot</code></em>);
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gdouble"><span class="returnvalue">gdouble</span></a>             <a class="link" href="PopplerAnnot.html#poppler-annot-markup-get-opacity" title="poppler_annot_markup_get_opacity ()">poppler_annot_markup_get_opacity</a>    (<em class="parameter"><code><a class="link" href="PopplerAnnot.html#PopplerAnnotMarkup" title="PopplerAnnotMarkup"><span class="type">PopplerAnnotMarkup</span></a> *poppler_annot</code></em>);
+<span class="returnvalue">void</span>                <a class="link" href="PopplerAnnot.html#poppler-annot-markup-set-opacity" title="poppler_annot_markup_set_opacity ()">poppler_annot_markup_set_opacity</a>    (<em class="parameter"><code><a class="link" href="PopplerAnnot.html#PopplerAnnotMarkup" title="PopplerAnnotMarkup"><span class="type">PopplerAnnotMarkup</span></a> *poppler_annot</code></em>,
+                                                         <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gdouble"><span class="type">gdouble</span></a> opacity</code></em>);
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a>            <a class="link" href="PopplerAnnot.html#poppler-annot-markup-has-popup" title="poppler_annot_markup_has_popup ()">poppler_annot_markup_has_popup</a>      (<em class="parameter"><code><a class="link" href="PopplerAnnot.html#PopplerAnnotMarkup" title="PopplerAnnotMarkup"><span class="type">PopplerAnnotMarkup</span></a> *poppler_annot</code></em>);
+<span class="returnvalue">void</span>                <a class="link" href="PopplerAnnot.html#poppler-annot-markup-set-popup" title="poppler_annot_markup_set_popup ()">poppler_annot_markup_set_popup</a>      (<em class="parameter"><code><a class="link" href="PopplerAnnot.html#PopplerAnnotMarkup" title="PopplerAnnotMarkup"><span class="type">PopplerAnnotMarkup</span></a> *poppler_annot</code></em>,
+                                                         <em class="parameter"><code><a class="link" href="PopplerPage.html#PopplerRectangle" title="PopplerRectangle"><span class="type">PopplerRectangle</span></a> *popup_rect</code></em>);
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a>            <a class="link" href="PopplerAnnot.html#poppler-annot-markup-get-popup-is-open" title="poppler_annot_markup_get_popup_is_open ()">poppler_annot_markup_get_popup_is_open</a>
+                                                        (<em class="parameter"><code><a class="link" href="PopplerAnnot.html#PopplerAnnotMarkup" title="PopplerAnnotMarkup"><span class="type">PopplerAnnotMarkup</span></a> *poppler_annot</code></em>);
+<span class="returnvalue">void</span>                <a class="link" href="PopplerAnnot.html#poppler-annot-markup-set-popup-is-open" title="poppler_annot_markup_set_popup_is_open ()">poppler_annot_markup_set_popup_is_open</a>
+                                                        (<em class="parameter"><code><a class="link" href="PopplerAnnot.html#PopplerAnnotMarkup" title="PopplerAnnotMarkup"><span class="type">PopplerAnnotMarkup</span></a> *poppler_annot</code></em>,
+                                                         <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a> is_open</code></em>);
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a>            <a class="link" href="PopplerAnnot.html#poppler-annot-markup-get-popup-rectangle" title="poppler_annot_markup_get_popup_rectangle ()">poppler_annot_markup_get_popup_rectangle</a>
+                                                        (<em class="parameter"><code><a class="link" href="PopplerAnnot.html#PopplerAnnotMarkup" title="PopplerAnnotMarkup"><span class="type">PopplerAnnotMarkup</span></a> *poppler_annot</code></em>,
+                                                         <em class="parameter"><code><a class="link" href="PopplerPage.html#PopplerRectangle" title="PopplerRectangle"><span class="type">PopplerRectangle</span></a> *poppler_rect</code></em>);
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Date-and-Time-Functions.html#GDate"><span class="returnvalue">GDate</span></a> *             <a class="link" href="PopplerAnnot.html#poppler-annot-markup-get-date" title="poppler_annot_markup_get_date ()">poppler_annot_markup_get_date</a>       (<em class="parameter"><code><a class="link" href="PopplerAnnot.html#PopplerAnnotMarkup" title="PopplerAnnotMarkup"><span class="type">PopplerAnnotMarkup</span></a> *poppler_annot</code></em>);
+<a class="link" href="PopplerAnnot.html#PopplerAnnotExternalDataType" title="enum PopplerAnnotExternalDataType"><span class="returnvalue">PopplerAnnotExternalDataType</span></a> <a class="link" href="PopplerAnnot.html#poppler-annot-markup-get-external-data" title="poppler_annot_markup_get_external_data ()">poppler_annot_markup_get_external_data</a>
+                                                        (<em class="parameter"><code><a class="link" href="PopplerAnnot.html#PopplerAnnotMarkup" title="PopplerAnnotMarkup"><span class="type">PopplerAnnotMarkup</span></a> *poppler_annot</code></em>);
+<a class="link" href="PopplerAnnot.html#PopplerAnnotMarkupReplyType" title="enum PopplerAnnotMarkupReplyType"><span class="returnvalue">PopplerAnnotMarkupReplyType</span></a> <a class="link" href="PopplerAnnot.html#poppler-annot-markup-get-reply-to" title="poppler_annot_markup_get_reply_to ()">poppler_annot_markup_get_reply_to</a>
+                                                        (<em class="parameter"><code><a class="link" href="PopplerAnnot.html#PopplerAnnotMarkup" title="PopplerAnnotMarkup"><span class="type">PopplerAnnotMarkup</span></a> *poppler_annot</code></em>);
+<a class="link" href="PopplerAnnot.html" title="PopplerAnnot"><span class="returnvalue">PopplerAnnot</span></a> *      <a class="link" href="PopplerAnnot.html#poppler-annot-text-new" title="poppler_annot_text_new ()">poppler_annot_text_new</a>              (<em class="parameter"><code><a class="link" href="PopplerDocument.html" title="PopplerDocument"><span class="type">PopplerDocument</span></a> *doc</code></em>,
+                                                         <em class="parameter"><code><a class="link" href="PopplerPage.html#PopplerRectangle" title="PopplerRectangle"><span class="type">PopplerRectangle</span></a> *rect</code></em>);
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="returnvalue">gchar</span></a> *             <a class="link" href="PopplerAnnot.html#poppler-annot-text-get-icon" title="poppler_annot_text_get_icon ()">poppler_annot_text_get_icon</a>         (<em class="parameter"><code><a class="link" href="PopplerAnnot.html#PopplerAnnotText" title="PopplerAnnotText"><span class="type">PopplerAnnotText</span></a> *poppler_annot</code></em>);
+#define             <a class="link" href="PopplerAnnot.html#POPPLER-ANNOT-TEXT-ICON-NOTE:CAPS" title="POPPLER_ANNOT_TEXT_ICON_NOTE">POPPLER_ANNOT_TEXT_ICON_NOTE</a>
+#define             <a class="link" href="PopplerAnnot.html#POPPLER-ANNOT-TEXT-ICON-COMMENT:CAPS" title="POPPLER_ANNOT_TEXT_ICON_COMMENT">POPPLER_ANNOT_TEXT_ICON_COMMENT</a>
+#define             <a class="link" href="PopplerAnnot.html#POPPLER-ANNOT-TEXT-ICON-KEY:CAPS" title="POPPLER_ANNOT_TEXT_ICON_KEY">POPPLER_ANNOT_TEXT_ICON_KEY</a>
+#define             <a class="link" href="PopplerAnnot.html#POPPLER-ANNOT-TEXT-ICON-HELP:CAPS" title="POPPLER_ANNOT_TEXT_ICON_HELP">POPPLER_ANNOT_TEXT_ICON_HELP</a>
+#define             <a class="link" href="PopplerAnnot.html#POPPLER-ANNOT-TEXT-ICON-NEW-PARAGRAPH:CAPS" title="POPPLER_ANNOT_TEXT_ICON_NEW_PARAGRAPH">POPPLER_ANNOT_TEXT_ICON_NEW_PARAGRAPH</a>
+#define             <a class="link" href="PopplerAnnot.html#POPPLER-ANNOT-TEXT-ICON-PARAGRAPH:CAPS" title="POPPLER_ANNOT_TEXT_ICON_PARAGRAPH">POPPLER_ANNOT_TEXT_ICON_PARAGRAPH</a>
+#define             <a class="link" href="PopplerAnnot.html#POPPLER-ANNOT-TEXT-ICON-INSERT:CAPS" title="POPPLER_ANNOT_TEXT_ICON_INSERT">POPPLER_ANNOT_TEXT_ICON_INSERT</a>
+#define             <a class="link" href="PopplerAnnot.html#POPPLER-ANNOT-TEXT-ICON-CROSS:CAPS" title="POPPLER_ANNOT_TEXT_ICON_CROSS">POPPLER_ANNOT_TEXT_ICON_CROSS</a>
+#define             <a class="link" href="PopplerAnnot.html#POPPLER-ANNOT-TEXT-ICON-CIRCLE:CAPS" title="POPPLER_ANNOT_TEXT_ICON_CIRCLE">POPPLER_ANNOT_TEXT_ICON_CIRCLE</a>
+<span class="returnvalue">void</span>                <a class="link" href="PopplerAnnot.html#poppler-annot-text-set-icon" title="poppler_annot_text_set_icon ()">poppler_annot_text_set_icon</a>         (<em class="parameter"><code><a class="link" href="PopplerAnnot.html#PopplerAnnotText" title="PopplerAnnotText"><span class="type">PopplerAnnotText</span></a> *poppler_annot</code></em>,
+                                                         <em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *icon</code></em>);
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a>            <a class="link" href="PopplerAnnot.html#poppler-annot-text-get-is-open" title="poppler_annot_text_get_is_open ()">poppler_annot_text_get_is_open</a>      (<em class="parameter"><code><a class="link" href="PopplerAnnot.html#PopplerAnnotText" title="PopplerAnnotText"><span class="type">PopplerAnnotText</span></a> *poppler_annot</code></em>);
+<span class="returnvalue">void</span>                <a class="link" href="PopplerAnnot.html#poppler-annot-text-set-is-open" title="poppler_annot_text_set_is_open ()">poppler_annot_text_set_is_open</a>      (<em class="parameter"><code><a class="link" href="PopplerAnnot.html#PopplerAnnotText" title="PopplerAnnotText"><span class="type">PopplerAnnotText</span></a> *poppler_annot</code></em>,
+                                                         <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a> is_open</code></em>);
+<a class="link" href="PopplerAnnot.html#PopplerAnnotTextState" title="enum PopplerAnnotTextState"><span class="returnvalue">PopplerAnnotTextState</span></a> <a class="link" href="PopplerAnnot.html#poppler-annot-text-get-state" title="poppler_annot_text_get_state ()">poppler_annot_text_get_state</a>      (<em class="parameter"><code><a class="link" href="PopplerAnnot.html#PopplerAnnotText" title="PopplerAnnotText"><span class="type">PopplerAnnotText</span></a> *poppler_annot</code></em>);
+<a class="link" href="PopplerAnnot.html#PopplerAnnotCalloutLine" title="PopplerAnnotCalloutLine"><span class="returnvalue">PopplerAnnotCalloutLine</span></a> * <a class="link" href="PopplerAnnot.html#poppler-annot-free-text-get-callout-line" title="poppler_annot_free_text_get_callout_line ()">poppler_annot_free_text_get_callout_line</a>
+                                                        (<em class="parameter"><code><a class="link" href="PopplerAnnot.html#PopplerAnnotFreeText" title="PopplerAnnotFreeText"><span class="type">PopplerAnnotFreeText</span></a> *poppler_annot</code></em>);
+<a class="link" href="PopplerAnnot.html#PopplerAnnotFreeTextQuadding" title="enum PopplerAnnotFreeTextQuadding"><span class="returnvalue">PopplerAnnotFreeTextQuadding</span></a> <a class="link" href="PopplerAnnot.html#poppler-annot-free-text-get-quadding" title="poppler_annot_free_text_get_quadding ()">poppler_annot_free_text_get_quadding</a>
+                                                        (<em class="parameter"><code><a class="link" href="PopplerAnnot.html#PopplerAnnotFreeText" title="PopplerAnnotFreeText"><span class="type">PopplerAnnotFreeText</span></a> *poppler_annot</code></em>);
+<a class="link" href="PopplerAttachment.html" title="PopplerAttachment"><span class="returnvalue">PopplerAttachment</span></a> * <a class="link" href="PopplerAnnot.html#poppler-annot-file-attachment-get-attachment" title="poppler_annot_file_attachment_get_attachment ()">poppler_annot_file_attachment_get_attachment</a>
+                                                        (<em class="parameter"><code><a class="link" href="PopplerAnnot.html#PopplerAnnotFileAttachment" title="PopplerAnnotFileAttachment"><span class="type">PopplerAnnotFileAttachment</span></a> *poppler_annot</code></em>);
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="returnvalue">gchar</span></a> *             <a class="link" href="PopplerAnnot.html#poppler-annot-file-attachment-get-name" title="poppler_annot_file_attachment_get_name ()">poppler_annot_file_attachment_get_name</a>
+                                                        (<em class="parameter"><code><a class="link" href="PopplerAnnot.html#PopplerAnnotFileAttachment" title="PopplerAnnotFileAttachment"><span class="type">PopplerAnnotFileAttachment</span></a> *poppler_annot</code></em>);
+<a class="link" href="poppler-PopplerAction.html#PopplerAction" title="union PopplerAction"><span class="returnvalue">PopplerAction</span></a> *     <a class="link" href="PopplerAnnot.html#poppler-annot-screen-get-action" title="poppler_annot_screen_get_action ()">poppler_annot_screen_get_action</a>     (<em class="parameter"><code><a class="link" href="PopplerAnnot.html#PopplerAnnotScreen" title="PopplerAnnotScreen"><span class="type">PopplerAnnotScreen</span></a> *poppler_annot</code></em>);
+<a class="link" href="PopplerMovie.html" title="PopplerMovie"><span class="returnvalue">PopplerMovie</span></a> *      <a class="link" href="PopplerAnnot.html#poppler-annot-movie-get-movie" title="poppler_annot_movie_get_movie ()">poppler_annot_movie_get_movie</a>       (<em class="parameter"><code><a class="link" href="PopplerAnnot.html#PopplerAnnotMovie" title="PopplerAnnotMovie"><span class="type">PopplerAnnotMovie</span></a> *poppler_annot</code></em>);
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="returnvalue">gchar</span></a> *             <a class="link" href="PopplerAnnot.html#poppler-annot-movie-get-title" title="poppler_annot_movie_get_title ()">poppler_annot_movie_get_title</a>       (<em class="parameter"><code><a class="link" href="PopplerAnnot.html#PopplerAnnotMovie" title="PopplerAnnotMovie"><span class="type">PopplerAnnotMovie</span></a> *poppler_annot</code></em>);
+<a class="link" href="PopplerAnnot.html#PopplerAnnotCalloutLine" title="PopplerAnnotCalloutLine"><span class="returnvalue">PopplerAnnotCalloutLine</span></a> * <a class="link" href="PopplerAnnot.html#poppler-annot-callout-line-new" title="poppler_annot_callout_line_new ()">poppler_annot_callout_line_new</a>
+                                                        (<em class="parameter"><code><span class="type">void</span></code></em>);
+<a class="link" href="PopplerAnnot.html#PopplerAnnotCalloutLine" title="PopplerAnnotCalloutLine"><span class="returnvalue">PopplerAnnotCalloutLine</span></a> * <a class="link" href="PopplerAnnot.html#poppler-annot-callout-line-copy" title="poppler_annot_callout_line_copy ()">poppler_annot_callout_line_copy</a>
+                                                        (<em class="parameter"><code><a class="link" href="PopplerAnnot.html#PopplerAnnotCalloutLine" title="PopplerAnnotCalloutLine"><span class="type">PopplerAnnotCalloutLine</span></a> *callout</code></em>);
+<span class="returnvalue">void</span>                <a class="link" href="PopplerAnnot.html#poppler-annot-callout-line-free" title="poppler_annot_callout_line_free ()">poppler_annot_callout_line_free</a>     (<em class="parameter"><code><a class="link" href="PopplerAnnot.html#PopplerAnnotCalloutLine" title="PopplerAnnotCalloutLine"><span class="type">PopplerAnnotCalloutLine</span></a> *callout</code></em>);
+</pre>
+</div>
+<div class="refsect1">
+<a name="PopplerAnnot.object-hierarchy"></a><h2>Object Hierarchy</h2>
+<pre class="synopsis">
+  <a href="http://library.gnome.org/devel/gobject/unstable/gobject-The-Base-Object-Type.html#GObject">GObject</a>
+   +----PopplerAnnot
+</pre>
+</div>
+<div class="refsect1">
+<a name="PopplerAnnot.description"></a><h2>Description</h2>
+</div>
+<div class="refsect1">
+<a name="PopplerAnnot.details"></a><h2>Details</h2>
+<div class="refsect2">
+<a name="PopplerAnnot-struct"></a><h3>PopplerAnnot</h3>
+<pre class="programlisting">typedef struct _PopplerAnnot PopplerAnnot;</pre>
+</div>
+<hr>
+<div class="refsect2">
+<a name="PopplerAnnotMarkup"></a><h3>PopplerAnnotMarkup</h3>
+<pre class="programlisting">typedef struct _PopplerAnnotMarkup PopplerAnnotMarkup;</pre>
+</div>
+<hr>
+<div class="refsect2">
+<a name="PopplerAnnotText"></a><h3>PopplerAnnotText</h3>
+<pre class="programlisting">typedef struct _PopplerAnnotText PopplerAnnotText;</pre>
+</div>
+<hr>
+<div class="refsect2">
+<a name="PopplerAnnotFreeText"></a><h3>PopplerAnnotFreeText</h3>
+<pre class="programlisting">typedef struct _PopplerAnnotFreeText PopplerAnnotFreeText;</pre>
+</div>
+<hr>
+<div class="refsect2">
+<a name="PopplerAnnotFileAttachment"></a><h3>PopplerAnnotFileAttachment</h3>
+<pre class="programlisting">typedef struct _PopplerAnnotFileAttachment PopplerAnnotFileAttachment;</pre>
+</div>
+<hr>
+<div class="refsect2">
+<a name="PopplerAnnotMovie"></a><h3>PopplerAnnotMovie</h3>
+<pre class="programlisting">typedef struct _PopplerAnnotMovie PopplerAnnotMovie;</pre>
+</div>
+<hr>
+<div class="refsect2">
+<a name="PopplerAnnotScreen"></a><h3>PopplerAnnotScreen</h3>
+<pre class="programlisting">typedef struct _PopplerAnnotScreen PopplerAnnotScreen;</pre>
+</div>
+<hr>
+<div class="refsect2">
+<a name="PopplerAnnotType"></a><h3>enum PopplerAnnotType</h3>
+<pre class="programlisting">typedef enum {
+  POPPLER_ANNOT_UNKNOWN,
+  POPPLER_ANNOT_TEXT,
+  POPPLER_ANNOT_LINK,
+  POPPLER_ANNOT_FREE_TEXT,
+  POPPLER_ANNOT_LINE,
+  POPPLER_ANNOT_SQUARE,
+  POPPLER_ANNOT_CIRCLE,
+  POPPLER_ANNOT_POLYGON,
+  POPPLER_ANNOT_POLY_LINE,
+  POPPLER_ANNOT_HIGHLIGHT,
+  POPPLER_ANNOT_UNDERLINE,
+  POPPLER_ANNOT_SQUIGGLY,
+  POPPLER_ANNOT_STRIKE_OUT,
+  POPPLER_ANNOT_STAMP,
+  POPPLER_ANNOT_CARET,
+  POPPLER_ANNOT_INK,
+  POPPLER_ANNOT_POPUP,
+  POPPLER_ANNOT_FILE_ATTACHMENT,
+  POPPLER_ANNOT_SOUND,
+  POPPLER_ANNOT_MOVIE,
+  POPPLER_ANNOT_WIDGET,
+  POPPLER_ANNOT_SCREEN,
+  POPPLER_ANNOT_PRINTER_MARK,
+  POPPLER_ANNOT_TRAP_NET,
+  POPPLER_ANNOT_WATERMARK,
+  POPPLER_ANNOT_3D
+} PopplerAnnotType;
+</pre>
+</div>
+<hr>
+<div class="refsect2">
+<a name="PopplerAnnotFlag"></a><h3>enum PopplerAnnotFlag</h3>
+<pre class="programlisting">typedef enum {
+  POPPLER_ANNOT_FLAG_UNKNOWN = 0,
+  POPPLER_ANNOT_FLAG_INVISIBLE = 1 &lt;&lt; 0,
+  POPPLER_ANNOT_FLAG_HIDDEN = 1 &lt;&lt; 1,
+  POPPLER_ANNOT_FLAG_PRINT = 1 &lt;&lt; 2,
+  POPPLER_ANNOT_FLAG_NO_ZOOM = 1 &lt;&lt; 3,
+  POPPLER_ANNOT_FLAG_NO_ROTATE = 1 &lt;&lt; 4,
+  POPPLER_ANNOT_FLAG_NO_VIEW = 1 &lt;&lt; 5,
+  POPPLER_ANNOT_FLAG_READ_ONLY = 1 &lt;&lt; 6,
+  POPPLER_ANNOT_FLAG_LOCKED = 1 &lt;&lt; 7,
+  POPPLER_ANNOT_FLAG_TOGGLE_NO_VIEW = 1 &lt;&lt; 8,
+  POPPLER_ANNOT_FLAG_LOCKED_CONTENTS = 1 &lt;&lt; 9
+} PopplerAnnotFlag;
+</pre>
+</div>
+<hr>
+<div class="refsect2">
+<a name="PopplerAnnotExternalDataType"></a><h3>enum PopplerAnnotExternalDataType</h3>
+<pre class="programlisting">typedef enum {
+  POPPLER_ANNOT_EXTERNAL_DATA_MARKUP_3D,
+  POPPLER_ANNOT_EXTERNAL_DATA_MARKUP_UNKNOWN
+} PopplerAnnotExternalDataType;
+</pre>
+</div>
+<hr>
+<div class="refsect2">
+<a name="PopplerAnnotMarkupReplyType"></a><h3>enum PopplerAnnotMarkupReplyType</h3>
+<pre class="programlisting">typedef enum {
+  POPPLER_ANNOT_MARKUP_REPLY_TYPE_R,
+  POPPLER_ANNOT_MARKUP_REPLY_TYPE_GROUP
+} PopplerAnnotMarkupReplyType;
+</pre>
+</div>
+<hr>
+<div class="refsect2">
+<a name="PopplerAnnotTextState"></a><h3>enum PopplerAnnotTextState</h3>
+<pre class="programlisting">typedef enum {
+  POPPLER_ANNOT_TEXT_STATE_MARKED,
+  POPPLER_ANNOT_TEXT_STATE_UNMARKED,
+  POPPLER_ANNOT_TEXT_STATE_ACCEPTED,
+  POPPLER_ANNOT_TEXT_STATE_REJECTED,
+  POPPLER_ANNOT_TEXT_STATE_CANCELLED,
+  POPPLER_ANNOT_TEXT_STATE_COMPLETED,
+  POPPLER_ANNOT_TEXT_STATE_NONE,
+  POPPLER_ANNOT_TEXT_STATE_UNKNOWN
+} PopplerAnnotTextState;
+</pre>
+</div>
+<hr>
+<div class="refsect2">
+<a name="PopplerAnnotCalloutLine"></a><h3>PopplerAnnotCalloutLine</h3>
+<pre class="programlisting">typedef struct {
+  gboolean multiline;
+  gdouble  x1;
+  gdouble  y1;
+  gdouble  x2;
+  gdouble  y2;
+  gdouble  x3;
+  gdouble  y3;
+} PopplerAnnotCalloutLine;
+</pre>
+</div>
+<hr>
+<div class="refsect2">
+<a name="PopplerAnnotFreeTextQuadding"></a><h3>enum PopplerAnnotFreeTextQuadding</h3>
+<pre class="programlisting">typedef enum {
+  POPPLER_ANNOT_FREE_TEXT_QUADDING_LEFT_JUSTIFIED,
+  POPPLER_ANNOT_FREE_TEXT_QUADDING_CENTERED,
+  POPPLER_ANNOT_FREE_TEXT_QUADDING_RIGHT_JUSTIFIED
+} PopplerAnnotFreeTextQuadding;
+</pre>
+</div>
+<hr>
+<div class="refsect2">
+<a name="poppler-annot-get-annot-type"></a><h3>poppler_annot_get_annot_type ()</h3>
+<pre class="programlisting"><a class="link" href="PopplerAnnot.html#PopplerAnnotType" title="enum PopplerAnnotType"><span class="returnvalue">PopplerAnnotType</span></a>    poppler_annot_get_annot_type        (<em class="parameter"><code><a class="link" href="PopplerAnnot.html" title="PopplerAnnot"><span class="type">PopplerAnnot</span></a> *poppler_annot</code></em>);</pre>
+<p>
+Gets the type of <em class="parameter"><code>poppler_annot</code></em>
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>poppler_annot</code></em> :</span></p></td>
+<td>a <a class="link" href="PopplerAnnot.html" title="PopplerAnnot"><span class="type">PopplerAnnot</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>
+<a class="link" href="PopplerAnnot.html#PopplerAnnotType" title="enum PopplerAnnotType"><span class="type">PopplerAnnotType</span></a> of <em class="parameter"><code>poppler_annot</code></em>.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="poppler-annot-get-flags"></a><h3>poppler_annot_get_flags ()</h3>
+<pre class="programlisting"><a class="link" href="PopplerAnnot.html#PopplerAnnotFlag" title="enum PopplerAnnotFlag"><span class="returnvalue">PopplerAnnotFlag</span></a>    poppler_annot_get_flags             (<em class="parameter"><code><a class="link" href="PopplerAnnot.html" title="PopplerAnnot"><span class="type">PopplerAnnot</span></a> *poppler_annot</code></em>);</pre>
+<p>
+Retrieves the flag field specifying various characteristics of the
+<em class="parameter"><code>poppler_annot</code></em>.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>poppler_annot</code></em> :</span></p></td>
+<td>a <a class="link" href="PopplerAnnot.html" title="PopplerAnnot"><span class="type">PopplerAnnot</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>the flag field of <em class="parameter"><code>poppler_annot</code></em>.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="poppler-annot-get-name"></a><h3>poppler_annot_get_name ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="returnvalue">gchar</span></a> *             poppler_annot_get_name              (<em class="parameter"><code><a class="link" href="PopplerAnnot.html" title="PopplerAnnot"><span class="type">PopplerAnnot</span></a> *poppler_annot</code></em>);</pre>
+<p>
+Retrieves the name of <em class="parameter"><code>poppler_annot</code></em>.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>poppler_annot</code></em> :</span></p></td>
+<td>a <a class="link" href="PopplerAnnot.html" title="PopplerAnnot"><span class="type">PopplerAnnot</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>a new allocated string with the name of <em class="parameter"><code>poppler_annot</code></em>. It must
+be freed with <a href="http://library.gnome.org/devel/glib/unstable/glib-Memory-Allocation.html#g-free"><code class="function">g_free()</code></a> when done.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="poppler-annot-get-page-index"></a><h3>poppler_annot_get_page_index ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="returnvalue">gint</span></a>                poppler_annot_get_page_index        (<em class="parameter"><code><a class="link" href="PopplerAnnot.html" title="PopplerAnnot"><span class="type">PopplerAnnot</span></a> *poppler_annot</code></em>);</pre>
+<p>
+Returns the page index to which <em class="parameter"><code>poppler_annot</code></em> is associated, or -1 if unknown
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>poppler_annot</code></em> :</span></p></td>
+<td>a <a class="link" href="PopplerAnnot.html" title="PopplerAnnot"><span class="type">PopplerAnnot</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>page index or -1</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.14</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="poppler-annot-get-color"></a><h3>poppler_annot_get_color ()</h3>
+<pre class="programlisting"><a class="link" href="poppler-poppler.html#PopplerColor" title="PopplerColor"><span class="returnvalue">PopplerColor</span></a> *      poppler_annot_get_color             (<em class="parameter"><code><a class="link" href="PopplerAnnot.html" title="PopplerAnnot"><span class="type">PopplerAnnot</span></a> *poppler_annot</code></em>);</pre>
+<p>
+Retrieves the color of <em class="parameter"><code>poppler_annot</code></em>.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>poppler_annot</code></em> :</span></p></td>
+<td>a <a class="link" href="PopplerAnnot.html" title="PopplerAnnot"><span class="type">PopplerAnnot</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>a new allocated <a class="link" href="poppler-poppler.html#PopplerColor" title="PopplerColor"><span class="type">PopplerColor</span></a> with the color values of
+<em class="parameter"><code>poppler_annot</code></em>, or <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#NULL:CAPS"><code class="literal">NULL</code></a>. It must be freed with <a href="http://library.gnome.org/devel/glib/unstable/glib-Memory-Allocation.html#g-free"><code class="function">g_free()</code></a> when done.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="poppler-annot-set-color"></a><h3>poppler_annot_set_color ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span>                poppler_annot_set_color             (<em class="parameter"><code><a class="link" href="PopplerAnnot.html" title="PopplerAnnot"><span class="type">PopplerAnnot</span></a> *poppler_annot</code></em>,
+                                                         <em class="parameter"><code><a class="link" href="poppler-poppler.html#PopplerColor" title="PopplerColor"><span class="type">PopplerColor</span></a> *poppler_color</code></em>);</pre>
+<p>
+Sets the color of <em class="parameter"><code>poppler_annot</code></em>.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>poppler_annot</code></em> :</span></p></td>
+<td>a <a class="link" href="PopplerAnnot.html" title="PopplerAnnot"><span class="type">PopplerAnnot</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>poppler_color</code></em> :</span></p></td>
+<td>a <a class="link" href="poppler-poppler.html#PopplerColor" title="PopplerColor"><span class="type">PopplerColor</span></a>, or <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#NULL:CAPS"><code class="literal">NULL</code></a>. <span class="annotation">[<acronym title="NULL is ok, both for passing and for returning."><span class="acronym">allow-none</span></acronym>]</span>
+</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.16</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="poppler-annot-get-contents"></a><h3>poppler_annot_get_contents ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="returnvalue">gchar</span></a> *             poppler_annot_get_contents          (<em class="parameter"><code><a class="link" href="PopplerAnnot.html" title="PopplerAnnot"><span class="type">PopplerAnnot</span></a> *poppler_annot</code></em>);</pre>
+<p>
+Retrieves the contents of <em class="parameter"><code>poppler_annot</code></em>.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>poppler_annot</code></em> :</span></p></td>
+<td>a <a class="link" href="PopplerAnnot.html" title="PopplerAnnot"><span class="type">PopplerAnnot</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>a new allocated string with the contents of <em class="parameter"><code>poppler_annot</code></em>. It
+must be freed with <a href="http://library.gnome.org/devel/glib/unstable/glib-Memory-Allocation.html#g-free"><code class="function">g_free()</code></a> when done.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="poppler-annot-set-contents"></a><h3>poppler_annot_set_contents ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span>                poppler_annot_set_contents          (<em class="parameter"><code><a class="link" href="PopplerAnnot.html" title="PopplerAnnot"><span class="type">PopplerAnnot</span></a> *poppler_annot</code></em>,
+                                                         <em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *contents</code></em>);</pre>
+<p>
+Sets the contents of <em class="parameter"><code>poppler_annot</code></em> to the given value,
+replacing the current contents.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>poppler_annot</code></em> :</span></p></td>
+<td>a <a class="link" href="PopplerAnnot.html" title="PopplerAnnot"><span class="type">PopplerAnnot</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>contents</code></em> :</span></p></td>
+<td>a text string containing the new contents</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.12</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="poppler-annot-get-modified"></a><h3>poppler_annot_get_modified ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="returnvalue">gchar</span></a> *             poppler_annot_get_modified          (<em class="parameter"><code><a class="link" href="PopplerAnnot.html" title="PopplerAnnot"><span class="type">PopplerAnnot</span></a> *poppler_annot</code></em>);</pre>
+<p>
+Retrieves the last modification data of <em class="parameter"><code>poppler_annot</code></em>. The returned
+string will be either a PDF format date or a text string.
+See also #<a class="link" href="poppler-poppler.html#poppler-date-parse" title="poppler_date_parse ()"><code class="function">poppler_date_parse()</code></a>
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>poppler_annot</code></em> :</span></p></td>
+<td>a <a class="link" href="PopplerAnnot.html" title="PopplerAnnot"><span class="type">PopplerAnnot</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>a new allocated string with the last modification data of
+<em class="parameter"><code>poppler_annot</code></em>. It must be freed with <a href="http://library.gnome.org/devel/glib/unstable/glib-Memory-Allocation.html#g-free"><code class="function">g_free()</code></a> when done.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="poppler-annot-markup-get-label"></a><h3>poppler_annot_markup_get_label ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="returnvalue">gchar</span></a> *             poppler_annot_markup_get_label      (<em class="parameter"><code><a class="link" href="PopplerAnnot.html#PopplerAnnotMarkup" title="PopplerAnnotMarkup"><span class="type">PopplerAnnotMarkup</span></a> *poppler_annot</code></em>);</pre>
+<p>
+Retrieves the label text of <em class="parameter"><code>poppler_annot</code></em>.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>poppler_annot</code></em> :</span></p></td>
+<td>a <a class="link" href="PopplerAnnot.html#PopplerAnnotMarkup" title="PopplerAnnotMarkup"><span class="type">PopplerAnnotMarkup</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>the label text of <em class="parameter"><code>poppler_annot</code></em>.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="poppler-annot-markup-set-label"></a><h3>poppler_annot_markup_set_label ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span>                poppler_annot_markup_set_label      (<em class="parameter"><code><a class="link" href="PopplerAnnot.html#PopplerAnnotMarkup" title="PopplerAnnotMarkup"><span class="type">PopplerAnnotMarkup</span></a> *poppler_annot</code></em>,
+                                                         <em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *label</code></em>);</pre>
+<p>
+Sets the label text of <em class="parameter"><code>poppler_annot</code></em>, replacing the current one
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>poppler_annot</code></em> :</span></p></td>
+<td>a <a class="link" href="PopplerAnnot.html#PopplerAnnotMarkup" title="PopplerAnnotMarkup"><span class="type">PopplerAnnotMarkup</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>label</code></em> :</span></p></td>
+<td>a text string containing the new label, or <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#NULL:CAPS"><code class="literal">NULL</code></a>. <span class="annotation">[<acronym title="NULL is ok, both for passing and for returning."><span class="acronym">allow-none</span></acronym>]</span>
+</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.16</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="poppler-annot-markup-get-subject"></a><h3>poppler_annot_markup_get_subject ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="returnvalue">gchar</span></a> *             poppler_annot_markup_get_subject    (<em class="parameter"><code><a class="link" href="PopplerAnnot.html#PopplerAnnotMarkup" title="PopplerAnnotMarkup"><span class="type">PopplerAnnotMarkup</span></a> *poppler_annot</code></em>);</pre>
+<p>
+Retrives the subject text of <em class="parameter"><code>poppler_annot</code></em>.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>poppler_annot</code></em> :</span></p></td>
+<td>a <a class="link" href="PopplerAnnot.html#PopplerAnnotMarkup" title="PopplerAnnotMarkup"><span class="type">PopplerAnnotMarkup</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>the subject text of <em class="parameter"><code>poppler_annot</code></em>.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="poppler-annot-markup-get-opacity"></a><h3>poppler_annot_markup_get_opacity ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gdouble"><span class="returnvalue">gdouble</span></a>             poppler_annot_markup_get_opacity    (<em class="parameter"><code><a class="link" href="PopplerAnnot.html#PopplerAnnotMarkup" title="PopplerAnnotMarkup"><span class="type">PopplerAnnotMarkup</span></a> *poppler_annot</code></em>);</pre>
+<p>
+Retrieves the opacity value of <em class="parameter"><code>poppler_annot</code></em>.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>poppler_annot</code></em> :</span></p></td>
+<td>a <a class="link" href="PopplerAnnot.html#PopplerAnnotMarkup" title="PopplerAnnotMarkup"><span class="type">PopplerAnnotMarkup</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>the opacity value of <em class="parameter"><code>poppler_annot</code></em>,
+between 0 (transparent) and 1 (opaque)</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="poppler-annot-markup-set-opacity"></a><h3>poppler_annot_markup_set_opacity ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span>                poppler_annot_markup_set_opacity    (<em class="parameter"><code><a class="link" href="PopplerAnnot.html#PopplerAnnotMarkup" title="PopplerAnnotMarkup"><span class="type">PopplerAnnotMarkup</span></a> *poppler_annot</code></em>,
+                                                         <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gdouble"><span class="type">gdouble</span></a> opacity</code></em>);</pre>
+<p>
+Sets the opacity of <em class="parameter"><code>poppler_annot</code></em>. This value applies to
+all visible elements of <em class="parameter"><code>poppler_annot</code></em> in its closed state,
+but not to the pop-up window that appears when it's openened
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>poppler_annot</code></em> :</span></p></td>
+<td>a <a class="link" href="PopplerAnnot.html#PopplerAnnotMarkup" title="PopplerAnnotMarkup"><span class="type">PopplerAnnotMarkup</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>opacity</code></em> :</span></p></td>
+<td>a constant opacity value, between 0 (transparent) and 1 (opaque)</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.16</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="poppler-annot-markup-has-popup"></a><h3>poppler_annot_markup_has_popup ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a>            poppler_annot_markup_has_popup      (<em class="parameter"><code><a class="link" href="PopplerAnnot.html#PopplerAnnotMarkup" title="PopplerAnnotMarkup"><span class="type">PopplerAnnotMarkup</span></a> *poppler_annot</code></em>);</pre>
+<p>
+Return <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#TRUE:CAPS"><code class="literal">TRUE</code></a> if the markup annotation has a popup window associated
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>poppler_annot</code></em> :</span></p></td>
+<td>a <a class="link" href="PopplerAnnot.html#PopplerAnnotMarkup" title="PopplerAnnotMarkup"><span class="type">PopplerAnnotMarkup</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#TRUE:CAPS"><code class="literal">TRUE</code></a>, if <em class="parameter"><code>poppler_annot</code></em> has popup, <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#FALSE:CAPS"><code class="literal">FALSE</code></a> otherwise</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.12</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="poppler-annot-markup-set-popup"></a><h3>poppler_annot_markup_set_popup ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span>                poppler_annot_markup_set_popup      (<em class="parameter"><code><a class="link" href="PopplerAnnot.html#PopplerAnnotMarkup" title="PopplerAnnotMarkup"><span class="type">PopplerAnnotMarkup</span></a> *poppler_annot</code></em>,
+                                                         <em class="parameter"><code><a class="link" href="PopplerPage.html#PopplerRectangle" title="PopplerRectangle"><span class="type">PopplerRectangle</span></a> *popup_rect</code></em>);</pre>
+<p>
+Associates a new popup window for editing contents of <em class="parameter"><code>poppler_annot</code></em>.
+Popup window shall be displayed by viewers at <em class="parameter"><code>popup_rect</code></em> on the page.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>poppler_annot</code></em> :</span></p></td>
+<td>a <a class="link" href="PopplerAnnot.html#PopplerAnnotMarkup" title="PopplerAnnotMarkup"><span class="type">PopplerAnnotMarkup</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>popup_rect</code></em> :</span></p></td>
+<td>a <a class="link" href="PopplerPage.html#PopplerRectangle" title="PopplerRectangle"><span class="type">PopplerRectangle</span></a>
+</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.16</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="poppler-annot-markup-get-popup-is-open"></a><h3>poppler_annot_markup_get_popup_is_open ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a>            poppler_annot_markup_get_popup_is_open
+                                                        (<em class="parameter"><code><a class="link" href="PopplerAnnot.html#PopplerAnnotMarkup" title="PopplerAnnotMarkup"><span class="type">PopplerAnnotMarkup</span></a> *poppler_annot</code></em>);</pre>
+<p>
+Retrieves the state of the popup window related to <em class="parameter"><code>poppler_annot</code></em>.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>poppler_annot</code></em> :</span></p></td>
+<td>a <a class="link" href="PopplerAnnot.html#PopplerAnnotMarkup" title="PopplerAnnotMarkup"><span class="type">PopplerAnnotMarkup</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>the state of <em class="parameter"><code>poppler_annot</code></em>. <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#TRUE:CAPS"><code class="literal">TRUE</code></a> if it's open, <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#FALSE:CAPS"><code class="literal">FALSE</code></a> in
+other case.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="poppler-annot-markup-set-popup-is-open"></a><h3>poppler_annot_markup_set_popup_is_open ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span>                poppler_annot_markup_set_popup_is_open
+                                                        (<em class="parameter"><code><a class="link" href="PopplerAnnot.html#PopplerAnnotMarkup" title="PopplerAnnotMarkup"><span class="type">PopplerAnnotMarkup</span></a> *poppler_annot</code></em>,
+                                                         <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a> is_open</code></em>);</pre>
+<p>
+Sets the state of the popup window related to <em class="parameter"><code>poppler_annot</code></em>.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>poppler_annot</code></em> :</span></p></td>
+<td>a <a class="link" href="PopplerAnnot.html#PopplerAnnotMarkup" title="PopplerAnnotMarkup"><span class="type">PopplerAnnotMarkup</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>is_open</code></em> :</span></p></td>
+<td>whether popup window should initially be displayed open</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.16</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="poppler-annot-markup-get-popup-rectangle"></a><h3>poppler_annot_markup_get_popup_rectangle ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a>            poppler_annot_markup_get_popup_rectangle
+                                                        (<em class="parameter"><code><a class="link" href="PopplerAnnot.html#PopplerAnnotMarkup" title="PopplerAnnotMarkup"><span class="type">PopplerAnnotMarkup</span></a> *poppler_annot</code></em>,
+                                                         <em class="parameter"><code><a class="link" href="PopplerPage.html#PopplerRectangle" title="PopplerRectangle"><span class="type">PopplerRectangle</span></a> *poppler_rect</code></em>);</pre>
+<p>
+Retrieves the rectangle of the popup window related to <em class="parameter"><code>poppler_annot</code></em>.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>poppler_annot</code></em> :</span></p></td>
+<td>a <a class="link" href="PopplerAnnot.html#PopplerAnnotMarkup" title="PopplerAnnotMarkup"><span class="type">PopplerAnnotMarkup</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>poppler_rect</code></em> :</span></p></td>
+<td>a <a class="link" href="PopplerPage.html#PopplerRectangle" title="PopplerRectangle"><span class="type">PopplerRectangle</span></a> to store the popup rectangle. <span class="annotation">[<acronym title="Parameter for returning results. Default is transfer full."><span class="acronym">out</span></acronym>]</span>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#TRUE:CAPS"><code class="literal">TRUE</code></a> if <a class="link" href="PopplerPage.html#PopplerRectangle" title="PopplerRectangle"><span class="type">PopplerRectangle</span></a> was correctly filled, <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#FALSE:CAPS"><code class="literal">FALSE</code></a> otherwise</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.12</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="poppler-annot-markup-get-date"></a><h3>poppler_annot_markup_get_date ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Date-and-Time-Functions.html#GDate"><span class="returnvalue">GDate</span></a> *             poppler_annot_markup_get_date       (<em class="parameter"><code><a class="link" href="PopplerAnnot.html#PopplerAnnotMarkup" title="PopplerAnnotMarkup"><span class="type">PopplerAnnotMarkup</span></a> *poppler_annot</code></em>);</pre>
+<p>
+Returns the date and time when the annotation was created
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>poppler_annot</code></em> :</span></p></td>
+<td>a <a class="link" href="PopplerAnnot.html#PopplerAnnotMarkup" title="PopplerAnnotMarkup"><span class="type">PopplerAnnotMarkup</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>a <a href="http://library.gnome.org/devel/glib/unstable/glib-Date-and-Time-Functions.html#GDate"><span class="type">GDate</span></a> representing the date and time
+when the annotation was created, or <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#NULL:CAPS"><code class="literal">NULL</code></a>. <span class="annotation">[<acronym title="Free data after the code is done."><span class="acronym">transfer full</span></acronym>]</span>
+</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="poppler-annot-markup-get-external-data"></a><h3>poppler_annot_markup_get_external_data ()</h3>
+<pre class="programlisting"><a class="link" href="PopplerAnnot.html#PopplerAnnotExternalDataType" title="enum PopplerAnnotExternalDataType"><span class="returnvalue">PopplerAnnotExternalDataType</span></a> poppler_annot_markup_get_external_data
+                                                        (<em class="parameter"><code><a class="link" href="PopplerAnnot.html#PopplerAnnotMarkup" title="PopplerAnnotMarkup"><span class="type">PopplerAnnotMarkup</span></a> *poppler_annot</code></em>);</pre>
+<p>
+Gets the external data type of <em class="parameter"><code>poppler_annot</code></em>.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>poppler_annot</code></em> :</span></p></td>
+<td>a <a class="link" href="PopplerAnnot.html#PopplerAnnotMarkup" title="PopplerAnnotMarkup"><span class="type">PopplerAnnotMarkup</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>
+<a class="link" href="PopplerAnnot.html#PopplerAnnotExternalDataType" title="enum PopplerAnnotExternalDataType"><span class="type">PopplerAnnotExternalDataType</span></a> of <em class="parameter"><code>poppler_annot</code></em>.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="poppler-annot-markup-get-reply-to"></a><h3>poppler_annot_markup_get_reply_to ()</h3>
+<pre class="programlisting"><a class="link" href="PopplerAnnot.html#PopplerAnnotMarkupReplyType" title="enum PopplerAnnotMarkupReplyType"><span class="returnvalue">PopplerAnnotMarkupReplyType</span></a> poppler_annot_markup_get_reply_to
+                                                        (<em class="parameter"><code><a class="link" href="PopplerAnnot.html#PopplerAnnotMarkup" title="PopplerAnnotMarkup"><span class="type">PopplerAnnotMarkup</span></a> *poppler_annot</code></em>);</pre>
+<p>
+Gets the reply type of <em class="parameter"><code>poppler_annot</code></em>.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>poppler_annot</code></em> :</span></p></td>
+<td>a <a class="link" href="PopplerAnnot.html#PopplerAnnotMarkup" title="PopplerAnnotMarkup"><span class="type">PopplerAnnotMarkup</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>
+<a class="link" href="PopplerAnnot.html#PopplerAnnotMarkupReplyType" title="enum PopplerAnnotMarkupReplyType"><span class="type">PopplerAnnotMarkupReplyType</span></a> of <em class="parameter"><code>poppler_annot</code></em>.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="poppler-annot-text-new"></a><h3>poppler_annot_text_new ()</h3>
+<pre class="programlisting"><a class="link" href="PopplerAnnot.html" title="PopplerAnnot"><span class="returnvalue">PopplerAnnot</span></a> *      poppler_annot_text_new              (<em class="parameter"><code><a class="link" href="PopplerDocument.html" title="PopplerDocument"><span class="type">PopplerDocument</span></a> *doc</code></em>,
+                                                         <em class="parameter"><code><a class="link" href="PopplerPage.html#PopplerRectangle" title="PopplerRectangle"><span class="type">PopplerRectangle</span></a> *rect</code></em>);</pre>
+<p>
+Creates a new Text annotation that will be
+located on <em class="parameter"><code>rect</code></em> when added to a page. See
+<a class="link" href="PopplerPage.html#poppler-page-add-annot" title="poppler_page_add_annot ()"><code class="function">poppler_page_add_annot()</code></a>
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>doc</code></em> :</span></p></td>
+<td>a <a class="link" href="PopplerDocument.html" title="PopplerDocument"><span class="type">PopplerDocument</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>rect</code></em> :</span></p></td>
+<td>a <a class="link" href="PopplerPage.html#PopplerRectangle" title="PopplerRectangle"><span class="type">PopplerRectangle</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>A newly created <a class="link" href="PopplerAnnot.html#PopplerAnnotText" title="PopplerAnnotText"><span class="type">PopplerAnnotText</span></a> annotation</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.16</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="poppler-annot-text-get-icon"></a><h3>poppler_annot_text_get_icon ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="returnvalue">gchar</span></a> *             poppler_annot_text_get_icon         (<em class="parameter"><code><a class="link" href="PopplerAnnot.html#PopplerAnnotText" title="PopplerAnnotText"><span class="type">PopplerAnnotText</span></a> *poppler_annot</code></em>);</pre>
+<p>
+Gets name of the icon of <em class="parameter"><code>poppler_annot</code></em>.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>poppler_annot</code></em> :</span></p></td>
+<td>a <a class="link" href="PopplerAnnot.html#PopplerAnnotText" title="PopplerAnnotText"><span class="type">PopplerAnnotText</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>a new allocated string containing the icon name</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="POPPLER-ANNOT-TEXT-ICON-NOTE:CAPS"></a><h3>POPPLER_ANNOT_TEXT_ICON_NOTE</h3>
+<pre class="programlisting">#define POPPLER_ANNOT_TEXT_ICON_NOTE          "Note"
+</pre>
+</div>
+<hr>
+<div class="refsect2">
+<a name="POPPLER-ANNOT-TEXT-ICON-COMMENT:CAPS"></a><h3>POPPLER_ANNOT_TEXT_ICON_COMMENT</h3>
+<pre class="programlisting">#define POPPLER_ANNOT_TEXT_ICON_COMMENT       "Comment"
+</pre>
+</div>
+<hr>
+<div class="refsect2">
+<a name="POPPLER-ANNOT-TEXT-ICON-KEY:CAPS"></a><h3>POPPLER_ANNOT_TEXT_ICON_KEY</h3>
+<pre class="programlisting">#define POPPLER_ANNOT_TEXT_ICON_KEY           "Key"
+</pre>
+</div>
+<hr>
+<div class="refsect2">
+<a name="POPPLER-ANNOT-TEXT-ICON-HELP:CAPS"></a><h3>POPPLER_ANNOT_TEXT_ICON_HELP</h3>
+<pre class="programlisting">#define POPPLER_ANNOT_TEXT_ICON_HELP          "Help"
+</pre>
+</div>
+<hr>
+<div class="refsect2">
+<a name="POPPLER-ANNOT-TEXT-ICON-NEW-PARAGRAPH:CAPS"></a><h3>POPPLER_ANNOT_TEXT_ICON_NEW_PARAGRAPH</h3>
+<pre class="programlisting">#define POPPLER_ANNOT_TEXT_ICON_NEW_PARAGRAPH "NewParagraph"
+</pre>
+</div>
+<hr>
+<div class="refsect2">
+<a name="POPPLER-ANNOT-TEXT-ICON-PARAGRAPH:CAPS"></a><h3>POPPLER_ANNOT_TEXT_ICON_PARAGRAPH</h3>
+<pre class="programlisting">#define POPPLER_ANNOT_TEXT_ICON_PARAGRAPH     "Paragraph"
+</pre>
+</div>
+<hr>
+<div class="refsect2">
+<a name="POPPLER-ANNOT-TEXT-ICON-INSERT:CAPS"></a><h3>POPPLER_ANNOT_TEXT_ICON_INSERT</h3>
+<pre class="programlisting">#define POPPLER_ANNOT_TEXT_ICON_INSERT        "Insert"
+</pre>
+</div>
+<hr>
+<div class="refsect2">
+<a name="POPPLER-ANNOT-TEXT-ICON-CROSS:CAPS"></a><h3>POPPLER_ANNOT_TEXT_ICON_CROSS</h3>
+<pre class="programlisting">#define POPPLER_ANNOT_TEXT_ICON_CROSS         "Cross"
+</pre>
+</div>
+<hr>
+<div class="refsect2">
+<a name="POPPLER-ANNOT-TEXT-ICON-CIRCLE:CAPS"></a><h3>POPPLER_ANNOT_TEXT_ICON_CIRCLE</h3>
+<pre class="programlisting">#define POPPLER_ANNOT_TEXT_ICON_CIRCLE        "Circle"
+</pre>
+</div>
+<hr>
+<div class="refsect2">
+<a name="poppler-annot-text-set-icon"></a><h3>poppler_annot_text_set_icon ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span>                poppler_annot_text_set_icon         (<em class="parameter"><code><a class="link" href="PopplerAnnot.html#PopplerAnnotText" title="PopplerAnnotText"><span class="type">PopplerAnnotText</span></a> *poppler_annot</code></em>,
+                                                         <em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *icon</code></em>);</pre>
+<p>
+Sets the icon of <em class="parameter"><code>poppler_annot</code></em>. The following predefined
+icons are currently supported:
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><a class="link" href="PopplerAnnot.html#POPPLER-ANNOT-TEXT-ICON-NOTE:CAPS" title="POPPLER_ANNOT_TEXT_ICON_NOTE"><span class="type">POPPLER_ANNOT_TEXT_ICON_NOTE</span></a></span></p></td>
+<td></td>
+</tr>
+<tr>
+<td><p><span class="term"><a class="link" href="PopplerAnnot.html#POPPLER-ANNOT-TEXT-ICON-COMMENT:CAPS" title="POPPLER_ANNOT_TEXT_ICON_COMMENT"><span class="type">POPPLER_ANNOT_TEXT_ICON_COMMENT</span></a></span></p></td>
+<td></td>
+</tr>
+<tr>
+<td><p><span class="term"><a class="link" href="PopplerAnnot.html#POPPLER-ANNOT-TEXT-ICON-KEY:CAPS" title="POPPLER_ANNOT_TEXT_ICON_KEY"><span class="type">POPPLER_ANNOT_TEXT_ICON_KEY</span></a></span></p></td>
+<td></td>
+</tr>
+<tr>
+<td><p><span class="term"><a class="link" href="PopplerAnnot.html#POPPLER-ANNOT-TEXT-ICON-HELP:CAPS" title="POPPLER_ANNOT_TEXT_ICON_HELP"><span class="type">POPPLER_ANNOT_TEXT_ICON_HELP</span></a></span></p></td>
+<td></td>
+</tr>
+<tr>
+<td><p><span class="term"><a class="link" href="PopplerAnnot.html#POPPLER-ANNOT-TEXT-ICON-NEW-PARAGRAPH:CAPS" title="POPPLER_ANNOT_TEXT_ICON_NEW_PARAGRAPH"><span class="type">POPPLER_ANNOT_TEXT_ICON_NEW_PARAGRAPH</span></a></span></p></td>
+<td></td>
+</tr>
+<tr>
+<td><p><span class="term"><a class="link" href="PopplerAnnot.html#POPPLER-ANNOT-TEXT-ICON-PARAGRAPH:CAPS" title="POPPLER_ANNOT_TEXT_ICON_PARAGRAPH"><span class="type">POPPLER_ANNOT_TEXT_ICON_PARAGRAPH</span></a></span></p></td>
+<td></td>
+</tr>
+<tr>
+<td><p><span class="term"><a class="link" href="PopplerAnnot.html#POPPLER-ANNOT-TEXT-ICON-INSERT:CAPS" title="POPPLER_ANNOT_TEXT_ICON_INSERT"><span class="type">POPPLER_ANNOT_TEXT_ICON_INSERT</span></a></span></p></td>
+<td></td>
+</tr>
+<tr>
+<td><p><span class="term"><a class="link" href="PopplerAnnot.html#POPPLER-ANNOT-TEXT-ICON-CROSS:CAPS" title="POPPLER_ANNOT_TEXT_ICON_CROSS"><span class="type">POPPLER_ANNOT_TEXT_ICON_CROSS</span></a></span></p></td>
+<td></td>
+</tr>
+<tr>
+<td><p><span class="term"><a class="link" href="PopplerAnnot.html#POPPLER-ANNOT-TEXT-ICON-CIRCLE:CAPS" title="POPPLER_ANNOT_TEXT_ICON_CIRCLE"><span class="type">POPPLER_ANNOT_TEXT_ICON_CIRCLE</span></a></span></p></td>
+<td></td>
+</tr>
+</tbody>
+</table></div>
+<p>
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>poppler_annot</code></em> :</span></p></td>
+<td>a <a class="link" href="PopplerAnnot.html#PopplerAnnotText" title="PopplerAnnotText"><span class="type">PopplerAnnotText</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>icon</code></em> :</span></p></td>
+<td>the name of an icon</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.16</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="poppler-annot-text-get-is-open"></a><h3>poppler_annot_text_get_is_open ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a>            poppler_annot_text_get_is_open      (<em class="parameter"><code><a class="link" href="PopplerAnnot.html#PopplerAnnotText" title="PopplerAnnotText"><span class="type">PopplerAnnotText</span></a> *poppler_annot</code></em>);</pre>
+<p>
+Retrieves the state of <em class="parameter"><code>poppler_annot</code></em>.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>poppler_annot</code></em> :</span></p></td>
+<td>a <a class="link" href="PopplerAnnot.html#PopplerAnnotText" title="PopplerAnnotText"><span class="type">PopplerAnnotText</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>the state of <em class="parameter"><code>poppler_annot</code></em>. <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#TRUE:CAPS"><code class="literal">TRUE</code></a> if it's open, <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#FALSE:CAPS"><code class="literal">FALSE</code></a> in
+other case.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="poppler-annot-text-set-is-open"></a><h3>poppler_annot_text_set_is_open ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span>                poppler_annot_text_set_is_open      (<em class="parameter"><code><a class="link" href="PopplerAnnot.html#PopplerAnnotText" title="PopplerAnnotText"><span class="type">PopplerAnnotText</span></a> *poppler_annot</code></em>,
+                                                         <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a> is_open</code></em>);</pre>
+<p>
+Sets whether <em class="parameter"><code>poppler_annot</code></em> should initially be displayed open
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>poppler_annot</code></em> :</span></p></td>
+<td>a <a class="link" href="PopplerAnnot.html#PopplerAnnotText" title="PopplerAnnotText"><span class="type">PopplerAnnotText</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>is_open</code></em> :</span></p></td>
+<td>whether annotation should initially be displayed open</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.16</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="poppler-annot-text-get-state"></a><h3>poppler_annot_text_get_state ()</h3>
+<pre class="programlisting"><a class="link" href="PopplerAnnot.html#PopplerAnnotTextState" title="enum PopplerAnnotTextState"><span class="returnvalue">PopplerAnnotTextState</span></a> poppler_annot_text_get_state      (<em class="parameter"><code><a class="link" href="PopplerAnnot.html#PopplerAnnotText" title="PopplerAnnotText"><span class="type">PopplerAnnotText</span></a> *poppler_annot</code></em>);</pre>
+<p>
+Retrieves the state of <em class="parameter"><code>poppler_annot</code></em>.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>poppler_annot</code></em> :</span></p></td>
+<td>a <a class="link" href="PopplerAnnot.html#PopplerAnnotText" title="PopplerAnnotText"><span class="type">PopplerAnnotText</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>
+<a class="link" href="PopplerAnnot.html#PopplerAnnotTextState" title="enum PopplerAnnotTextState"><span class="type">PopplerAnnotTextState</span></a> of <em class="parameter"><code>poppler_annot</code></em>.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="poppler-annot-free-text-get-callout-line"></a><h3>poppler_annot_free_text_get_callout_line ()</h3>
+<pre class="programlisting"><a class="link" href="PopplerAnnot.html#PopplerAnnotCalloutLine" title="PopplerAnnotCalloutLine"><span class="returnvalue">PopplerAnnotCalloutLine</span></a> * poppler_annot_free_text_get_callout_line
+                                                        (<em class="parameter"><code><a class="link" href="PopplerAnnot.html#PopplerAnnotFreeText" title="PopplerAnnotFreeText"><span class="type">PopplerAnnotFreeText</span></a> *poppler_annot</code></em>);</pre>
+<p>
+Retrieves a <a class="link" href="PopplerAnnot.html#PopplerAnnotCalloutLine" title="PopplerAnnotCalloutLine"><span class="type">PopplerAnnotCalloutLine</span></a> of four or six numbers specifying a callout
+line attached to the <em class="parameter"><code>poppler_annot</code></em>.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>poppler_annot</code></em> :</span></p></td>
+<td>a <a class="link" href="PopplerAnnot.html#PopplerAnnotFreeText" title="PopplerAnnotFreeText"><span class="type">PopplerAnnotFreeText</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>a new allocated <a class="link" href="PopplerAnnot.html#PopplerAnnotCalloutLine" title="PopplerAnnotCalloutLine"><span class="type">PopplerAnnotCalloutLine</span></a> if the annot has a callout
+line, <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#NULL:CAPS"><code class="literal">NULL</code></a> in other case. It must be freed with <a href="http://library.gnome.org/devel/glib/unstable/glib-Memory-Allocation.html#g-free"><code class="function">g_free()</code></a> when
+done.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="poppler-annot-free-text-get-quadding"></a><h3>poppler_annot_free_text_get_quadding ()</h3>
+<pre class="programlisting"><a class="link" href="PopplerAnnot.html#PopplerAnnotFreeTextQuadding" title="enum PopplerAnnotFreeTextQuadding"><span class="returnvalue">PopplerAnnotFreeTextQuadding</span></a> poppler_annot_free_text_get_quadding
+                                                        (<em class="parameter"><code><a class="link" href="PopplerAnnot.html#PopplerAnnotFreeText" title="PopplerAnnotFreeText"><span class="type">PopplerAnnotFreeText</span></a> *poppler_annot</code></em>);</pre>
+<p>
+Retrieves the justification of the text of <em class="parameter"><code>poppler_annot</code></em>.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>poppler_annot</code></em> :</span></p></td>
+<td>a <a class="link" href="PopplerAnnot.html#PopplerAnnotFreeText" title="PopplerAnnotFreeText"><span class="type">PopplerAnnotFreeText</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>
+<a class="link" href="PopplerAnnot.html#PopplerAnnotFreeTextQuadding" title="enum PopplerAnnotFreeTextQuadding"><span class="type">PopplerAnnotFreeTextQuadding</span></a> of <em class="parameter"><code>poppler_annot</code></em>.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="poppler-annot-file-attachment-get-attachment"></a><h3>poppler_annot_file_attachment_get_attachment ()</h3>
+<pre class="programlisting"><a class="link" href="PopplerAttachment.html" title="PopplerAttachment"><span class="returnvalue">PopplerAttachment</span></a> * poppler_annot_file_attachment_get_attachment
+                                                        (<em class="parameter"><code><a class="link" href="PopplerAnnot.html#PopplerAnnotFileAttachment" title="PopplerAnnotFileAttachment"><span class="type">PopplerAnnotFileAttachment</span></a> *poppler_annot</code></em>);</pre>
+<p>
+Creates a <a class="link" href="PopplerAttachment.html" title="PopplerAttachment"><span class="type">PopplerAttachment</span></a> for the file of the file attachment annotation <em class="parameter"><code>annot</code></em>.
+The <a class="link" href="PopplerAttachment.html" title="PopplerAttachment"><span class="type">PopplerAttachment</span></a> must be unrefed with g_object_unref by the caller.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>poppler_annot</code></em> :</span></p></td>
+<td>a <a class="link" href="PopplerAnnot.html#PopplerAnnotFileAttachment" title="PopplerAnnotFileAttachment"><span class="type">PopplerAnnotFileAttachment</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>
+<em class="parameter"><code>PopplerAttachment</code></em>. <span class="annotation">[<acronym title="Free data after the code is done."><span class="acronym">transfer full</span></acronym>]</span>
+</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.14</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="poppler-annot-file-attachment-get-name"></a><h3>poppler_annot_file_attachment_get_name ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="returnvalue">gchar</span></a> *             poppler_annot_file_attachment_get_name
+                                                        (<em class="parameter"><code><a class="link" href="PopplerAnnot.html#PopplerAnnotFileAttachment" title="PopplerAnnotFileAttachment"><span class="type">PopplerAnnotFileAttachment</span></a> *poppler_annot</code></em>);</pre>
+<p>
+Retrieves the name of <em class="parameter"><code>poppler_annot</code></em>.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>poppler_annot</code></em> :</span></p></td>
+<td>a <a class="link" href="PopplerAnnot.html#PopplerAnnotFileAttachment" title="PopplerAnnotFileAttachment"><span class="type">PopplerAnnotFileAttachment</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>a new allocated string with the name of <em class="parameter"><code>poppler_annot</code></em>. It must
+be freed with <a href="http://library.gnome.org/devel/glib/unstable/glib-Memory-Allocation.html#g-free"><code class="function">g_free()</code></a> when done.</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.14</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="poppler-annot-screen-get-action"></a><h3>poppler_annot_screen_get_action ()</h3>
+<pre class="programlisting"><a class="link" href="poppler-PopplerAction.html#PopplerAction" title="union PopplerAction"><span class="returnvalue">PopplerAction</span></a> *     poppler_annot_screen_get_action     (<em class="parameter"><code><a class="link" href="PopplerAnnot.html#PopplerAnnotScreen" title="PopplerAnnotScreen"><span class="type">PopplerAnnotScreen</span></a> *poppler_annot</code></em>);</pre>
+<p>
+Retrieves the action (<a class="link" href="poppler-PopplerAction.html#PopplerAction" title="union PopplerAction"><span class="type">PopplerAction</span></a>) that shall be performed when <em class="parameter"><code>poppler_annot</code></em> is activated
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>poppler_annot</code></em> :</span></p></td>
+<td>a <a class="link" href="PopplerAnnot.html#PopplerAnnotScreen" title="PopplerAnnotScreen"><span class="type">PopplerAnnotScreen</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>the action to perform. The returned
+object is owned by <em class="parameter"><code>poppler_annot</code></em> and should not be freed. <span class="annotation">[<acronym title="Don't free data after the code is done."><span class="acronym">transfer none</span></acronym>]</span>
+</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.14</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="poppler-annot-movie-get-movie"></a><h3>poppler_annot_movie_get_movie ()</h3>
+<pre class="programlisting"><a class="link" href="PopplerMovie.html" title="PopplerMovie"><span class="returnvalue">PopplerMovie</span></a> *      poppler_annot_movie_get_movie       (<em class="parameter"><code><a class="link" href="PopplerAnnot.html#PopplerAnnotMovie" title="PopplerAnnotMovie"><span class="type">PopplerAnnotMovie</span></a> *poppler_annot</code></em>);</pre>
+<p>
+Retrieves the movie object (PopplerMovie) stored in the <em class="parameter"><code>poppler_annot</code></em>.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>poppler_annot</code></em> :</span></p></td>
+<td>a <a class="link" href="PopplerAnnot.html#PopplerAnnotMovie" title="PopplerAnnotMovie"><span class="type">PopplerAnnotMovie</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>the movie object stored in the <em class="parameter"><code>poppler_annot</code></em>. The returned
+object is owned by <a class="link" href="PopplerAnnot.html#PopplerAnnotMovie" title="PopplerAnnotMovie"><span class="type">PopplerAnnotMovie</span></a> and should not be freed. <span class="annotation">[<acronym title="Don't free data after the code is done."><span class="acronym">transfer none</span></acronym>]</span>
+</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.14</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="poppler-annot-movie-get-title"></a><h3>poppler_annot_movie_get_title ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="returnvalue">gchar</span></a> *             poppler_annot_movie_get_title       (<em class="parameter"><code><a class="link" href="PopplerAnnot.html#PopplerAnnotMovie" title="PopplerAnnotMovie"><span class="type">PopplerAnnotMovie</span></a> *poppler_annot</code></em>);</pre>
+<p>
+Retrieves the movie title of <em class="parameter"><code>poppler_annot</code></em>.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>poppler_annot</code></em> :</span></p></td>
+<td>a <a class="link" href="PopplerAnnot.html#PopplerAnnotMovie" title="PopplerAnnotMovie"><span class="type">PopplerAnnotMovie</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>the title text of <em class="parameter"><code>poppler_annot</code></em>.</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.14</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="poppler-annot-callout-line-new"></a><h3>poppler_annot_callout_line_new ()</h3>
+<pre class="programlisting"><a class="link" href="PopplerAnnot.html#PopplerAnnotCalloutLine" title="PopplerAnnotCalloutLine"><span class="returnvalue">PopplerAnnotCalloutLine</span></a> * poppler_annot_callout_line_new
+                                                        (<em class="parameter"><code><span class="type">void</span></code></em>);</pre>
+<p>
+Creates a new empty <a class="link" href="PopplerAnnot.html#PopplerAnnotCalloutLine" title="PopplerAnnotCalloutLine"><span class="type">PopplerAnnotCalloutLine</span></a>.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody><tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>a new allocated <a class="link" href="PopplerAnnot.html#PopplerAnnotCalloutLine" title="PopplerAnnotCalloutLine"><span class="type">PopplerAnnotCalloutLine</span></a>, <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#NULL:CAPS"><code class="literal">NULL</code></a> in other case.
+It must be freed when done.</td>
+</tr></tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="poppler-annot-callout-line-copy"></a><h3>poppler_annot_callout_line_copy ()</h3>
+<pre class="programlisting"><a class="link" href="PopplerAnnot.html#PopplerAnnotCalloutLine" title="PopplerAnnotCalloutLine"><span class="returnvalue">PopplerAnnotCalloutLine</span></a> * poppler_annot_callout_line_copy
+                                                        (<em class="parameter"><code><a class="link" href="PopplerAnnot.html#PopplerAnnotCalloutLine" title="PopplerAnnotCalloutLine"><span class="type">PopplerAnnotCalloutLine</span></a> *callout</code></em>);</pre>
+<p>
+It does copy <em class="parameter"><code>callout</code></em> to a new <a class="link" href="PopplerAnnot.html#PopplerAnnotCalloutLine" title="PopplerAnnotCalloutLine"><span class="type">PopplerAnnotCalloutLine</span></a>.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>callout</code></em> :</span></p></td>
+<td>the <a class="link" href="PopplerAnnot.html#PopplerAnnotCalloutLine" title="PopplerAnnotCalloutLine"><span class="type">PopplerAnnotCalloutLine</span></a> to be copied.</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>a new allocated <a class="link" href="PopplerAnnot.html#PopplerAnnotCalloutLine" title="PopplerAnnotCalloutLine"><span class="type">PopplerAnnotCalloutLine</span></a> as exact copy of
+<em class="parameter"><code>callout</code></em>, <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#NULL:CAPS"><code class="literal">NULL</code></a> in other case. It must be freed when done.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="poppler-annot-callout-line-free"></a><h3>poppler_annot_callout_line_free ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span>                poppler_annot_callout_line_free     (<em class="parameter"><code><a class="link" href="PopplerAnnot.html#PopplerAnnotCalloutLine" title="PopplerAnnotCalloutLine"><span class="type">PopplerAnnotCalloutLine</span></a> *callout</code></em>);</pre>
+<p>
+Frees the memory used by <a class="link" href="PopplerAnnot.html#PopplerAnnotCalloutLine" title="PopplerAnnotCalloutLine"><span class="type">PopplerAnnotCalloutLine</span></a>.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody><tr>
+<td><p><span class="term"><em class="parameter"><code>callout</code></em> :</span></p></td>
+<td>a <a class="link" href="PopplerAnnot.html#PopplerAnnotCalloutLine" title="PopplerAnnotCalloutLine"><span class="type">PopplerAnnotCalloutLine</span></a>
+</td>
+</tr></tbody>
+</table></div>
+</div>
+</div>
+</div>
+<div class="footer">
+<hr>
+          Generated by GTK-Doc V1.18</div>
+</body>
+</html>
\ No newline at end of file
diff --git a/glib/reference/html/PopplerAttachment.html b/glib/reference/html/PopplerAttachment.html
new file mode 100644 (file)
index 0000000..66a4f2f
--- /dev/null
@@ -0,0 +1,203 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>PopplerAttachment</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.76.1">
+<link rel="home" href="index.html" title="Poppler Reference Manual">
+<link rel="up" href="ch01.html" title="Poppler">
+<link rel="prev" href="poppler-PopplerAction.html" title="PopplerAction">
+<link rel="next" href="PopplerFormField.html" title="PoppplerFormField">
+<meta name="generator" content="GTK-Doc V1.18 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="2">
+<tr valign="middle">
+<td><a accesskey="p" href="poppler-PopplerAction.html"><img src="left.png" width="24" height="24" border="0" alt="Prev"></a></td>
+<td><a accesskey="u" href="ch01.html"><img src="up.png" width="24" height="24" border="0" alt="Up"></a></td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="24" height="24" border="0" alt="Home"></a></td>
+<th width="100%" align="center">Poppler Reference Manual</th>
+<td><a accesskey="n" href="PopplerFormField.html"><img src="right.png" width="24" height="24" border="0" alt="Next"></a></td>
+</tr>
+<tr><td colspan="5" class="shortcuts">
+<a href="#PopplerAttachment.synopsis" class="shortcut">Top</a>
+                   | 
+                  <a href="#PopplerAttachment.description" class="shortcut">Description</a>
+                   | 
+                  <a href="#PopplerAttachment.object-hierarchy" class="shortcut">Object Hierarchy</a>
+</td></tr>
+</table>
+<div class="refentry">
+<a name="PopplerAttachment"></a><div class="titlepage"></div>
+<div class="refnamediv"><table width="100%"><tr>
+<td valign="top">
+<h2><span class="refentrytitle"><a name="PopplerAttachment.top_of_page"></a>PopplerAttachment</span></h2>
+<p>PopplerAttachment — Attachments</p>
+</td>
+<td valign="top" align="right"></td>
+</tr></table></div>
+<div class="refsynopsisdiv">
+<a name="PopplerAttachment.synopsis"></a><h2>Synopsis</h2>
+<pre class="synopsis">
+#include &lt;poppler.h&gt;
+
+                    <a class="link" href="PopplerAttachment.html#PopplerAttachment-struct" title="PopplerAttachment">PopplerAttachment</a>;
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a>            (<a class="link" href="PopplerAttachment.html#PopplerAttachmentSaveFunc" title="PopplerAttachmentSaveFunc ()">*PopplerAttachmentSaveFunc</a>)        (<em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *buf</code></em>,
+                                                         <em class="parameter"><code><span class="type">gsize</span> count</code></em>,
+                                                         <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gpointer"><span class="type">gpointer</span></a> data</code></em>,
+                                                         <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Error-Reporting.html#GError"><span class="type">GError</span></a> **error</code></em>);
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a>            <a class="link" href="PopplerAttachment.html#poppler-attachment-save" title="poppler_attachment_save ()">poppler_attachment_save</a>             (<em class="parameter"><code><a class="link" href="PopplerAttachment.html" title="PopplerAttachment"><span class="type">PopplerAttachment</span></a> *attachment</code></em>,
+                                                         <em class="parameter"><code>const <span class="type">char</span> *filename</code></em>,
+                                                         <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Error-Reporting.html#GError"><span class="type">GError</span></a> **error</code></em>);
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a>            <a class="link" href="PopplerAttachment.html#poppler-attachment-save-to-callback" title="poppler_attachment_save_to_callback ()">poppler_attachment_save_to_callback</a> (<em class="parameter"><code><a class="link" href="PopplerAttachment.html" title="PopplerAttachment"><span class="type">PopplerAttachment</span></a> *attachment</code></em>,
+                                                         <em class="parameter"><code><a class="link" href="PopplerAttachment.html#PopplerAttachmentSaveFunc" title="PopplerAttachmentSaveFunc ()"><span class="type">PopplerAttachmentSaveFunc</span></a> save_func</code></em>,
+                                                         <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gpointer"><span class="type">gpointer</span></a> user_data</code></em>,
+                                                         <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Error-Reporting.html#GError"><span class="type">GError</span></a> **error</code></em>);
+</pre>
+</div>
+<div class="refsect1">
+<a name="PopplerAttachment.object-hierarchy"></a><h2>Object Hierarchy</h2>
+<pre class="synopsis">
+  <a href="http://library.gnome.org/devel/gobject/unstable/gobject-The-Base-Object-Type.html#GObject">GObject</a>
+   +----PopplerAttachment
+</pre>
+</div>
+<div class="refsect1">
+<a name="PopplerAttachment.description"></a><h2>Description</h2>
+</div>
+<div class="refsect1">
+<a name="PopplerAttachment.details"></a><h2>Details</h2>
+<div class="refsect2">
+<a name="PopplerAttachment-struct"></a><h3>PopplerAttachment</h3>
+<pre class="programlisting">typedef struct _PopplerAttachment PopplerAttachment;</pre>
+</div>
+<hr>
+<div class="refsect2">
+<a name="PopplerAttachmentSaveFunc"></a><h3>PopplerAttachmentSaveFunc ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a>            (*PopplerAttachmentSaveFunc)        (<em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *buf</code></em>,
+                                                         <em class="parameter"><code><span class="type">gsize</span> count</code></em>,
+                                                         <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gpointer"><span class="type">gpointer</span></a> data</code></em>,
+                                                         <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Error-Reporting.html#GError"><span class="type">GError</span></a> **error</code></em>);</pre>
+<p>
+Specifies the type of the function passed to
+<a class="link" href="PopplerAttachment.html#poppler-attachment-save-to-callback" title="poppler_attachment_save_to_callback ()"><code class="function">poppler_attachment_save_to_callback()</code></a>.  It is called once for each block of
+bytes that is "written" by <a class="link" href="PopplerAttachment.html#poppler-attachment-save-to-callback" title="poppler_attachment_save_to_callback ()"><code class="function">poppler_attachment_save_to_callback()</code></a>.  If
+successful it should return <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#TRUE:CAPS"><code class="literal">TRUE</code></a>.  If an error occurs it should set
+<em class="parameter"><code>error</code></em> and return <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#FALSE:CAPS"><code class="literal">FALSE</code></a>, in which case <a class="link" href="PopplerAttachment.html#poppler-attachment-save-to-callback" title="poppler_attachment_save_to_callback ()"><code class="function">poppler_attachment_save_to_callback()</code></a>
+will fail with the same error.
+</p>
+<p>
+<em class="parameter"><code>Returns</code></em>: <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#TRUE:CAPS"><code class="literal">TRUE</code></a> if successful, <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#FALSE:CAPS"><code class="literal">FALSE</code></a> (with <em class="parameter"><code>error</code></em> set) if failed.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>buf</code></em> :</span></p></td>
+<td>buffer containing
+bytes to be written. <span class="annotation">[<acronym title="Parameter points to an array of items."><span class="acronym">array</span></acronym> length=count][<acronym title="Generics and defining elements of containers and arrays."><span class="acronym">element-type</span></acronym> guint8]</span>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>count</code></em> :</span></p></td>
+<td>number of bytes in <em class="parameter"><code>buf</code></em>.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>data</code></em> :</span></p></td>
+<td>user data passed to <a class="link" href="PopplerAttachment.html#poppler-attachment-save-to-callback" title="poppler_attachment_save_to_callback ()"><code class="function">poppler_attachment_save_to_callback()</code></a>. <span class="annotation">[<acronym title="This parameter is a 'user_data', for callbacks; many bindings can pass NULL here."><span class="acronym">closure</span></acronym>]</span>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>error</code></em> :</span></p></td>
+<td>GError to set on error, or <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#NULL:CAPS"><code class="literal">NULL</code></a>
+</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="poppler-attachment-save"></a><h3>poppler_attachment_save ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a>            poppler_attachment_save             (<em class="parameter"><code><a class="link" href="PopplerAttachment.html" title="PopplerAttachment"><span class="type">PopplerAttachment</span></a> *attachment</code></em>,
+                                                         <em class="parameter"><code>const <span class="type">char</span> *filename</code></em>,
+                                                         <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Error-Reporting.html#GError"><span class="type">GError</span></a> **error</code></em>);</pre>
+<p>
+Saves <em class="parameter"><code>attachment</code></em> to a file indicated by <em class="parameter"><code>filename</code></em>.  If <em class="parameter"><code>error</code></em> is set, <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#FALSE:CAPS"><code class="literal">FALSE</code></a>
+will be returned. Possible errors include those in the <a href="http://library.gnome.org/devel/glib/unstable/glib-File-Utilities.html#G-FILE-ERROR:CAPS"><span class="type">G_FILE_ERROR</span></a> domain
+and whatever the save function generates.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>attachment</code></em> :</span></p></td>
+<td>A <a class="link" href="PopplerAttachment.html" title="PopplerAttachment"><span class="type">PopplerAttachment</span></a>.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>filename</code></em> :</span></p></td>
+<td>name of file to save</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>error</code></em> :</span></p></td>
+<td>return location for error, or <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#NULL:CAPS"><code class="literal">NULL</code></a>. <span class="annotation">[<acronym title="NULL is ok, both for passing and for returning."><span class="acronym">allow-none</span></acronym>]</span>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#TRUE:CAPS"><code class="literal">TRUE</code></a>, if the file successfully saved</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="poppler-attachment-save-to-callback"></a><h3>poppler_attachment_save_to_callback ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a>            poppler_attachment_save_to_callback (<em class="parameter"><code><a class="link" href="PopplerAttachment.html" title="PopplerAttachment"><span class="type">PopplerAttachment</span></a> *attachment</code></em>,
+                                                         <em class="parameter"><code><a class="link" href="PopplerAttachment.html#PopplerAttachmentSaveFunc" title="PopplerAttachmentSaveFunc ()"><span class="type">PopplerAttachmentSaveFunc</span></a> save_func</code></em>,
+                                                         <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gpointer"><span class="type">gpointer</span></a> user_data</code></em>,
+                                                         <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Error-Reporting.html#GError"><span class="type">GError</span></a> **error</code></em>);</pre>
+<p>
+Saves <em class="parameter"><code>attachment</code></em> by feeding the produced data to <em class="parameter"><code>save_func</code></em>. Can be used
+when you want to store the attachment to something other than a file, such as
+an in-memory buffer or a socket. If <em class="parameter"><code>error</code></em> is set, <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#FALSE:CAPS"><code class="literal">FALSE</code></a> will be
+returned. Possible errors include those in the <a href="http://library.gnome.org/devel/glib/unstable/glib-File-Utilities.html#G-FILE-ERROR:CAPS"><span class="type">G_FILE_ERROR</span></a> domain and
+whatever the save function generates.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>attachment</code></em> :</span></p></td>
+<td>A <a class="link" href="PopplerAttachment.html" title="PopplerAttachment"><span class="type">PopplerAttachment</span></a>.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>save_func</code></em> :</span></p></td>
+<td>a function that is called to save each block of data that the save routine generates. <span class="annotation">[<acronym title="The callback is valid only during the call to the method."><span class="acronym">scope call</span></acronym>]</span>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>user_data</code></em> :</span></p></td>
+<td>user data to pass to the save function.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>error</code></em> :</span></p></td>
+<td>return location for error, or <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#NULL:CAPS"><code class="literal">NULL</code></a>. <span class="annotation">[<acronym title="NULL is ok, both for passing and for returning."><span class="acronym">allow-none</span></acronym>]</span>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#TRUE:CAPS"><code class="literal">TRUE</code></a>, if the save successfully completed</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+</div>
+</div>
+<div class="footer">
+<hr>
+          Generated by GTK-Doc V1.18</div>
+</body>
+</html>
\ No newline at end of file
diff --git a/glib/reference/html/PopplerDocument.html b/glib/reference/html/PopplerDocument.html
new file mode 100644 (file)
index 0000000..b1410f0
--- /dev/null
@@ -0,0 +1,2287 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>PopplerDocument</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.76.1">
+<link rel="home" href="index.html" title="Poppler Reference Manual">
+<link rel="up" href="ch01.html" title="Poppler">
+<link rel="prev" href="poppler-poppler.html" title="poppler">
+<link rel="next" href="PopplerPage.html" title="PopplerPage">
+<meta name="generator" content="GTK-Doc V1.18 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="2">
+<tr valign="middle">
+<td><a accesskey="p" href="poppler-poppler.html"><img src="left.png" width="24" height="24" border="0" alt="Prev"></a></td>
+<td><a accesskey="u" href="ch01.html"><img src="up.png" width="24" height="24" border="0" alt="Up"></a></td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="24" height="24" border="0" alt="Home"></a></td>
+<th width="100%" align="center">Poppler Reference Manual</th>
+<td><a accesskey="n" href="PopplerPage.html"><img src="right.png" width="24" height="24" border="0" alt="Next"></a></td>
+</tr>
+<tr><td colspan="5" class="shortcuts">
+<a href="#PopplerDocument.synopsis" class="shortcut">Top</a>
+                   | 
+                  <a href="#PopplerDocument.description" class="shortcut">Description</a>
+                   | 
+                  <a href="#PopplerDocument.object-hierarchy" class="shortcut">Object Hierarchy</a>
+                   | 
+                  <a href="#PopplerDocument.properties" class="shortcut">Properties</a>
+</td></tr>
+</table>
+<div class="refentry">
+<a name="PopplerDocument"></a><div class="titlepage"></div>
+<div class="refnamediv"><table width="100%"><tr>
+<td valign="top">
+<h2><span class="refentrytitle"><a name="PopplerDocument.top_of_page"></a>PopplerDocument</span></h2>
+<p>PopplerDocument — Information about a document</p>
+</td>
+<td valign="top" align="right"></td>
+</tr></table></div>
+<div class="refsynopsisdiv">
+<a name="PopplerDocument.synopsis"></a><h2>Synopsis</h2>
+<pre class="synopsis">
+#include &lt;poppler.h&gt;
+
+                    <a class="link" href="PopplerDocument.html#PopplerDocument-struct" title="PopplerDocument">PopplerDocument</a>;
+                    <a class="link" href="PopplerDocument.html#PopplerIndexIter" title="PopplerIndexIter">PopplerIndexIter</a>;
+                    <a class="link" href="PopplerDocument.html#PopplerFontsIter" title="PopplerFontsIter">PopplerFontsIter</a>;
+                    <a class="link" href="PopplerDocument.html#PopplerLayersIter" title="PopplerLayersIter">PopplerLayersIter</a>;
+enum                <a class="link" href="PopplerDocument.html#PopplerPageLayout" title="enum PopplerPageLayout">PopplerPageLayout</a>;
+enum                <a class="link" href="PopplerDocument.html#PopplerPageMode" title="enum PopplerPageMode">PopplerPageMode</a>;
+                    <a class="link" href="PopplerDocument.html#PopplerFontInfo" title="PopplerFontInfo">PopplerFontInfo</a>;
+enum                <a class="link" href="PopplerDocument.html#PopplerFontType" title="enum PopplerFontType">PopplerFontType</a>;
+                    <a class="link" href="PopplerDocument.html#PopplerPSFile" title="PopplerPSFile">PopplerPSFile</a>;
+enum                <a class="link" href="PopplerDocument.html#PopplerViewerPreferences" title="enum PopplerViewerPreferences">PopplerViewerPreferences</a>;
+enum                <a class="link" href="PopplerDocument.html#PopplerPermissions" title="enum PopplerPermissions">PopplerPermissions</a>;
+<a class="link" href="PopplerDocument.html" title="PopplerDocument"><span class="returnvalue">PopplerDocument</span></a> *   <a class="link" href="PopplerDocument.html#poppler-document-new-from-file" title="poppler_document_new_from_file ()">poppler_document_new_from_file</a>      (<em class="parameter"><code>const <span class="type">char</span> *uri</code></em>,
+                                                         <em class="parameter"><code>const <span class="type">char</span> *password</code></em>,
+                                                         <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Error-Reporting.html#GError"><span class="type">GError</span></a> **error</code></em>);
+<a class="link" href="PopplerDocument.html" title="PopplerDocument"><span class="returnvalue">PopplerDocument</span></a> *   <a class="link" href="PopplerDocument.html#poppler-document-new-from-data" title="poppler_document_new_from_data ()">poppler_document_new_from_data</a>      (<em class="parameter"><code><span class="type">char</span> *data</code></em>,
+                                                         <em class="parameter"><code><span class="type">int</span> length</code></em>,
+                                                         <em class="parameter"><code>const <span class="type">char</span> *password</code></em>,
+                                                         <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Error-Reporting.html#GError"><span class="type">GError</span></a> **error</code></em>);
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a>            <a class="link" href="PopplerDocument.html#poppler-document-save" title="poppler_document_save ()">poppler_document_save</a>               (<em class="parameter"><code><a class="link" href="PopplerDocument.html" title="PopplerDocument"><span class="type">PopplerDocument</span></a> *document</code></em>,
+                                                         <em class="parameter"><code>const <span class="type">char</span> *uri</code></em>,
+                                                         <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Error-Reporting.html#GError"><span class="type">GError</span></a> **error</code></em>);
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a>            <a class="link" href="PopplerDocument.html#poppler-document-save-a-copy" title="poppler_document_save_a_copy ()">poppler_document_save_a_copy</a>        (<em class="parameter"><code><a class="link" href="PopplerDocument.html" title="PopplerDocument"><span class="type">PopplerDocument</span></a> *document</code></em>,
+                                                         <em class="parameter"><code>const <span class="type">char</span> *uri</code></em>,
+                                                         <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Error-Reporting.html#GError"><span class="type">GError</span></a> **error</code></em>);
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a>            <a class="link" href="PopplerDocument.html#poppler-document-get-id" title="poppler_document_get_id ()">poppler_document_get_id</a>             (<em class="parameter"><code><a class="link" href="PopplerDocument.html" title="PopplerDocument"><span class="type">PopplerDocument</span></a> *document</code></em>,
+                                                         <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> **permanent_id</code></em>,
+                                                         <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> **update_id</code></em>);
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="returnvalue">gchar</span></a> *             <a class="link" href="PopplerDocument.html#poppler-document-get-pdf-version-string" title="poppler_document_get_pdf_version_string ()">poppler_document_get_pdf_version_string</a>
+                                                        (<em class="parameter"><code><a class="link" href="PopplerDocument.html" title="PopplerDocument"><span class="type">PopplerDocument</span></a> *document</code></em>);
+<span class="returnvalue">void</span>                <a class="link" href="PopplerDocument.html#poppler-document-get-pdf-version" title="poppler_document_get_pdf_version ()">poppler_document_get_pdf_version</a>    (<em class="parameter"><code><a class="link" href="PopplerDocument.html" title="PopplerDocument"><span class="type">PopplerDocument</span></a> *document</code></em>,
+                                                         <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> *major_version</code></em>,
+                                                         <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> *minor_version</code></em>);
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="returnvalue">gchar</span></a> *             <a class="link" href="PopplerDocument.html#poppler-document-get-title" title="poppler_document_get_title ()">poppler_document_get_title</a>          (<em class="parameter"><code><a class="link" href="PopplerDocument.html" title="PopplerDocument"><span class="type">PopplerDocument</span></a> *document</code></em>);
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="returnvalue">gchar</span></a> *             <a class="link" href="PopplerDocument.html#poppler-document-get-author" title="poppler_document_get_author ()">poppler_document_get_author</a>         (<em class="parameter"><code><a class="link" href="PopplerDocument.html" title="PopplerDocument"><span class="type">PopplerDocument</span></a> *document</code></em>);
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="returnvalue">gchar</span></a> *             <a class="link" href="PopplerDocument.html#poppler-document-get-subject" title="poppler_document_get_subject ()">poppler_document_get_subject</a>        (<em class="parameter"><code><a class="link" href="PopplerDocument.html" title="PopplerDocument"><span class="type">PopplerDocument</span></a> *document</code></em>);
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="returnvalue">gchar</span></a> *             <a class="link" href="PopplerDocument.html#poppler-document-get-keywords" title="poppler_document_get_keywords ()">poppler_document_get_keywords</a>       (<em class="parameter"><code><a class="link" href="PopplerDocument.html" title="PopplerDocument"><span class="type">PopplerDocument</span></a> *document</code></em>);
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="returnvalue">gchar</span></a> *             <a class="link" href="PopplerDocument.html#poppler-document-get-creator" title="poppler_document_get_creator ()">poppler_document_get_creator</a>        (<em class="parameter"><code><a class="link" href="PopplerDocument.html" title="PopplerDocument"><span class="type">PopplerDocument</span></a> *document</code></em>);
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="returnvalue">gchar</span></a> *             <a class="link" href="PopplerDocument.html#poppler-document-get-producer" title="poppler_document_get_producer ()">poppler_document_get_producer</a>       (<em class="parameter"><code><a class="link" href="PopplerDocument.html" title="PopplerDocument"><span class="type">PopplerDocument</span></a> *document</code></em>);
+<span class="returnvalue">time_t</span>              <a class="link" href="PopplerDocument.html#poppler-document-get-creation-date" title="poppler_document_get_creation_date ()">poppler_document_get_creation_date</a>  (<em class="parameter"><code><a class="link" href="PopplerDocument.html" title="PopplerDocument"><span class="type">PopplerDocument</span></a> *document</code></em>);
+<span class="returnvalue">time_t</span>              <a class="link" href="PopplerDocument.html#poppler-document-get-modification-date" title="poppler_document_get_modification_date ()">poppler_document_get_modification_date</a>
+                                                        (<em class="parameter"><code><a class="link" href="PopplerDocument.html" title="PopplerDocument"><span class="type">PopplerDocument</span></a> *document</code></em>);
+<a class="link" href="PopplerDocument.html#PopplerPageLayout" title="enum PopplerPageLayout"><span class="returnvalue">PopplerPageLayout</span></a>   <a class="link" href="PopplerDocument.html#poppler-document-get-page-layout" title="poppler_document_get_page_layout ()">poppler_document_get_page_layout</a>    (<em class="parameter"><code><a class="link" href="PopplerDocument.html" title="PopplerDocument"><span class="type">PopplerDocument</span></a> *document</code></em>);
+<a class="link" href="PopplerDocument.html#PopplerPageMode" title="enum PopplerPageMode"><span class="returnvalue">PopplerPageMode</span></a>     <a class="link" href="PopplerDocument.html#poppler-document-get-page-mode" title="poppler_document_get_page_mode ()">poppler_document_get_page_mode</a>      (<em class="parameter"><code><a class="link" href="PopplerDocument.html" title="PopplerDocument"><span class="type">PopplerDocument</span></a> *document</code></em>);
+<a class="link" href="PopplerDocument.html#PopplerPermissions" title="enum PopplerPermissions"><span class="returnvalue">PopplerPermissions</span></a>  <a class="link" href="PopplerDocument.html#poppler-document-get-permissions" title="poppler_document_get_permissions ()">poppler_document_get_permissions</a>    (<em class="parameter"><code><a class="link" href="PopplerDocument.html" title="PopplerDocument"><span class="type">PopplerDocument</span></a> *document</code></em>);
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="returnvalue">gchar</span></a> *             <a class="link" href="PopplerDocument.html#poppler-document-get-metadata" title="poppler_document_get_metadata ()">poppler_document_get_metadata</a>       (<em class="parameter"><code><a class="link" href="PopplerDocument.html" title="PopplerDocument"><span class="type">PopplerDocument</span></a> *document</code></em>);
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a>            <a class="link" href="PopplerDocument.html#poppler-document-is-linearized" title="poppler_document_is_linearized ()">poppler_document_is_linearized</a>      (<em class="parameter"><code><a class="link" href="PopplerDocument.html" title="PopplerDocument"><span class="type">PopplerDocument</span></a> *document</code></em>);
+<span class="returnvalue">int</span>                 <a class="link" href="PopplerDocument.html#poppler-document-get-n-pages" title="poppler_document_get_n_pages ()">poppler_document_get_n_pages</a>        (<em class="parameter"><code><a class="link" href="PopplerDocument.html" title="PopplerDocument"><span class="type">PopplerDocument</span></a> *document</code></em>);
+<a class="link" href="PopplerPage.html" title="PopplerPage"><span class="returnvalue">PopplerPage</span></a> *       <a class="link" href="PopplerDocument.html#poppler-document-get-page" title="poppler_document_get_page ()">poppler_document_get_page</a>           (<em class="parameter"><code><a class="link" href="PopplerDocument.html" title="PopplerDocument"><span class="type">PopplerDocument</span></a> *document</code></em>,
+                                                         <em class="parameter"><code><span class="type">int</span> index</code></em>);
+<a class="link" href="PopplerPage.html" title="PopplerPage"><span class="returnvalue">PopplerPage</span></a> *       <a class="link" href="PopplerDocument.html#poppler-document-get-page-by-label" title="poppler_document_get_page_by_label ()">poppler_document_get_page_by_label</a>  (<em class="parameter"><code><a class="link" href="PopplerDocument.html" title="PopplerDocument"><span class="type">PopplerDocument</span></a> *document</code></em>,
+                                                         <em class="parameter"><code>const <span class="type">char</span> *label</code></em>);
+<a class="link" href="poppler-PopplerAction.html#PopplerDest" title="PopplerDest"><span class="returnvalue">PopplerDest</span></a> *       <a class="link" href="PopplerDocument.html#poppler-document-find-dest" title="poppler_document_find_dest ()">poppler_document_find_dest</a>          (<em class="parameter"><code><a class="link" href="PopplerDocument.html" title="PopplerDocument"><span class="type">PopplerDocument</span></a> *document</code></em>,
+                                                         <em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *link_name</code></em>);
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="returnvalue">guint</span></a>               <a class="link" href="PopplerDocument.html#poppler-document-get-n-attachments" title="poppler_document_get_n_attachments ()">poppler_document_get_n_attachments</a>  (<em class="parameter"><code><a class="link" href="PopplerDocument.html" title="PopplerDocument"><span class="type">PopplerDocument</span></a> *document</code></em>);
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a>            <a class="link" href="PopplerDocument.html#poppler-document-has-attachments" title="poppler_document_has_attachments ()">poppler_document_has_attachments</a>    (<em class="parameter"><code><a class="link" href="PopplerDocument.html" title="PopplerDocument"><span class="type">PopplerDocument</span></a> *document</code></em>);
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Doubly-Linked-Lists.html#GList"><span class="returnvalue">GList</span></a> *             <a class="link" href="PopplerDocument.html#poppler-document-get-attachments" title="poppler_document_get_attachments ()">poppler_document_get_attachments</a>    (<em class="parameter"><code><a class="link" href="PopplerDocument.html" title="PopplerDocument"><span class="type">PopplerDocument</span></a> *document</code></em>);
+<a class="link" href="PopplerFormField.html" title="PoppplerFormField"><span class="returnvalue">PopplerFormField</span></a> *  <a class="link" href="PopplerDocument.html#poppler-document-get-form-field" title="poppler_document_get_form_field ()">poppler_document_get_form_field</a>     (<em class="parameter"><code><a class="link" href="PopplerDocument.html" title="PopplerDocument"><span class="type">PopplerDocument</span></a> *document</code></em>,
+                                                         <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="type">gint</span></a> id</code></em>);
+<a class="link" href="PopplerDocument.html#PopplerIndexIter" title="PopplerIndexIter"><span class="returnvalue">PopplerIndexIter</span></a> *  <a class="link" href="PopplerDocument.html#poppler-index-iter-new" title="poppler_index_iter_new ()">poppler_index_iter_new</a>              (<em class="parameter"><code><a class="link" href="PopplerDocument.html" title="PopplerDocument"><span class="type">PopplerDocument</span></a> *document</code></em>);
+<a class="link" href="PopplerDocument.html#PopplerIndexIter" title="PopplerIndexIter"><span class="returnvalue">PopplerIndexIter</span></a> *  <a class="link" href="PopplerDocument.html#poppler-index-iter-copy" title="poppler_index_iter_copy ()">poppler_index_iter_copy</a>             (<em class="parameter"><code><a class="link" href="PopplerDocument.html#PopplerIndexIter" title="PopplerIndexIter"><span class="type">PopplerIndexIter</span></a> *iter</code></em>);
+<span class="returnvalue">void</span>                <a class="link" href="PopplerDocument.html#poppler-index-iter-free" title="poppler_index_iter_free ()">poppler_index_iter_free</a>             (<em class="parameter"><code><a class="link" href="PopplerDocument.html#PopplerIndexIter" title="PopplerIndexIter"><span class="type">PopplerIndexIter</span></a> *iter</code></em>);
+<a class="link" href="PopplerDocument.html#PopplerIndexIter" title="PopplerIndexIter"><span class="returnvalue">PopplerIndexIter</span></a> *  <a class="link" href="PopplerDocument.html#poppler-index-iter-get-child" title="poppler_index_iter_get_child ()">poppler_index_iter_get_child</a>        (<em class="parameter"><code><a class="link" href="PopplerDocument.html#PopplerIndexIter" title="PopplerIndexIter"><span class="type">PopplerIndexIter</span></a> *parent</code></em>);
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a>            <a class="link" href="PopplerDocument.html#poppler-index-iter-is-open" title="poppler_index_iter_is_open ()">poppler_index_iter_is_open</a>          (<em class="parameter"><code><a class="link" href="PopplerDocument.html#PopplerIndexIter" title="PopplerIndexIter"><span class="type">PopplerIndexIter</span></a> *iter</code></em>);
+<a class="link" href="poppler-PopplerAction.html#PopplerAction" title="union PopplerAction"><span class="returnvalue">PopplerAction</span></a> *     <a class="link" href="PopplerDocument.html#poppler-index-iter-get-action" title="poppler_index_iter_get_action ()">poppler_index_iter_get_action</a>       (<em class="parameter"><code><a class="link" href="PopplerDocument.html#PopplerIndexIter" title="PopplerIndexIter"><span class="type">PopplerIndexIter</span></a> *iter</code></em>);
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a>            <a class="link" href="PopplerDocument.html#poppler-index-iter-next" title="poppler_index_iter_next ()">poppler_index_iter_next</a>             (<em class="parameter"><code><a class="link" href="PopplerDocument.html#PopplerIndexIter" title="PopplerIndexIter"><span class="type">PopplerIndexIter</span></a> *iter</code></em>);
+<a class="link" href="PopplerDocument.html#PopplerFontInfo" title="PopplerFontInfo"><span class="returnvalue">PopplerFontInfo</span></a> *   <a class="link" href="PopplerDocument.html#poppler-font-info-new" title="poppler_font_info_new ()">poppler_font_info_new</a>               (<em class="parameter"><code><a class="link" href="PopplerDocument.html" title="PopplerDocument"><span class="type">PopplerDocument</span></a> *document</code></em>);
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a>            <a class="link" href="PopplerDocument.html#poppler-font-info-scan" title="poppler_font_info_scan ()">poppler_font_info_scan</a>              (<em class="parameter"><code><a class="link" href="PopplerDocument.html#PopplerFontInfo" title="PopplerFontInfo"><span class="type">PopplerFontInfo</span></a> *font_info</code></em>,
+                                                         <em class="parameter"><code><span class="type">int</span> n_pages</code></em>,
+                                                         <em class="parameter"><code><a class="link" href="PopplerDocument.html#PopplerFontsIter" title="PopplerFontsIter"><span class="type">PopplerFontsIter</span></a> **iter</code></em>);
+<span class="returnvalue">void</span>                <a class="link" href="PopplerDocument.html#poppler-font-info-free" title="poppler_font_info_free ()">poppler_font_info_free</a>              (<em class="parameter"><code><a class="link" href="PopplerDocument.html#PopplerFontInfo" title="PopplerFontInfo"><span class="type">PopplerFontInfo</span></a> *font_info</code></em>);
+<a class="link" href="PopplerDocument.html#PopplerFontsIter" title="PopplerFontsIter"><span class="returnvalue">PopplerFontsIter</span></a> *  <a class="link" href="PopplerDocument.html#poppler-fonts-iter-copy" title="poppler_fonts_iter_copy ()">poppler_fonts_iter_copy</a>             (<em class="parameter"><code><a class="link" href="PopplerDocument.html#PopplerFontsIter" title="PopplerFontsIter"><span class="type">PopplerFontsIter</span></a> *iter</code></em>);
+<span class="returnvalue">void</span>                <a class="link" href="PopplerDocument.html#poppler-fonts-iter-free" title="poppler_fonts_iter_free ()">poppler_fonts_iter_free</a>             (<em class="parameter"><code><a class="link" href="PopplerDocument.html#PopplerFontsIter" title="PopplerFontsIter"><span class="type">PopplerFontsIter</span></a> *iter</code></em>);
+const <span class="returnvalue">char</span> *        <a class="link" href="PopplerDocument.html#poppler-fonts-iter-get-name" title="poppler_fonts_iter_get_name ()">poppler_fonts_iter_get_name</a>         (<em class="parameter"><code><a class="link" href="PopplerDocument.html#PopplerFontsIter" title="PopplerFontsIter"><span class="type">PopplerFontsIter</span></a> *iter</code></em>);
+const <span class="returnvalue">char</span> *        <a class="link" href="PopplerDocument.html#poppler-fonts-iter-get-full-name" title="poppler_fonts_iter_get_full_name ()">poppler_fonts_iter_get_full_name</a>    (<em class="parameter"><code><a class="link" href="PopplerDocument.html#PopplerFontsIter" title="PopplerFontsIter"><span class="type">PopplerFontsIter</span></a> *iter</code></em>);
+<a class="link" href="PopplerDocument.html#PopplerFontType" title="enum PopplerFontType"><span class="returnvalue">PopplerFontType</span></a>     <a class="link" href="PopplerDocument.html#poppler-fonts-iter-get-font-type" title="poppler_fonts_iter_get_font_type ()">poppler_fonts_iter_get_font_type</a>    (<em class="parameter"><code><a class="link" href="PopplerDocument.html#PopplerFontsIter" title="PopplerFontsIter"><span class="type">PopplerFontsIter</span></a> *iter</code></em>);
+const <span class="returnvalue">char</span> *        <a class="link" href="PopplerDocument.html#poppler-fonts-iter-get-substitute-name" title="poppler_fonts_iter_get_substitute_name ()">poppler_fonts_iter_get_substitute_name</a>
+                                                        (<em class="parameter"><code><a class="link" href="PopplerDocument.html#PopplerFontsIter" title="PopplerFontsIter"><span class="type">PopplerFontsIter</span></a> *iter</code></em>);
+const <span class="returnvalue">char</span> *        <a class="link" href="PopplerDocument.html#poppler-fonts-iter-get-file-name" title="poppler_fonts_iter_get_file_name ()">poppler_fonts_iter_get_file_name</a>    (<em class="parameter"><code><a class="link" href="PopplerDocument.html#PopplerFontsIter" title="PopplerFontsIter"><span class="type">PopplerFontsIter</span></a> *iter</code></em>);
+const <span class="returnvalue">char</span> *        <a class="link" href="PopplerDocument.html#poppler-fonts-iter-get-encoding" title="poppler_fonts_iter_get_encoding ()">poppler_fonts_iter_get_encoding</a>     (<em class="parameter"><code><a class="link" href="PopplerDocument.html#PopplerFontsIter" title="PopplerFontsIter"><span class="type">PopplerFontsIter</span></a> *iter</code></em>);
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a>            <a class="link" href="PopplerDocument.html#poppler-fonts-iter-is-embedded" title="poppler_fonts_iter_is_embedded ()">poppler_fonts_iter_is_embedded</a>      (<em class="parameter"><code><a class="link" href="PopplerDocument.html#PopplerFontsIter" title="PopplerFontsIter"><span class="type">PopplerFontsIter</span></a> *iter</code></em>);
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a>            <a class="link" href="PopplerDocument.html#poppler-fonts-iter-is-subset" title="poppler_fonts_iter_is_subset ()">poppler_fonts_iter_is_subset</a>        (<em class="parameter"><code><a class="link" href="PopplerDocument.html#PopplerFontsIter" title="PopplerFontsIter"><span class="type">PopplerFontsIter</span></a> *iter</code></em>);
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a>            <a class="link" href="PopplerDocument.html#poppler-fonts-iter-next" title="poppler_fonts_iter_next ()">poppler_fonts_iter_next</a>             (<em class="parameter"><code><a class="link" href="PopplerDocument.html#PopplerFontsIter" title="PopplerFontsIter"><span class="type">PopplerFontsIter</span></a> *iter</code></em>);
+<a class="link" href="PopplerDocument.html#PopplerLayersIter" title="PopplerLayersIter"><span class="returnvalue">PopplerLayersIter</span></a> * <a class="link" href="PopplerDocument.html#poppler-layers-iter-new" title="poppler_layers_iter_new ()">poppler_layers_iter_new</a>             (<em class="parameter"><code><a class="link" href="PopplerDocument.html" title="PopplerDocument"><span class="type">PopplerDocument</span></a> *document</code></em>);
+<a class="link" href="PopplerDocument.html#PopplerLayersIter" title="PopplerLayersIter"><span class="returnvalue">PopplerLayersIter</span></a> * <a class="link" href="PopplerDocument.html#poppler-layers-iter-copy" title="poppler_layers_iter_copy ()">poppler_layers_iter_copy</a>            (<em class="parameter"><code><a class="link" href="PopplerDocument.html#PopplerLayersIter" title="PopplerLayersIter"><span class="type">PopplerLayersIter</span></a> *iter</code></em>);
+<span class="returnvalue">void</span>                <a class="link" href="PopplerDocument.html#poppler-layers-iter-free" title="poppler_layers_iter_free ()">poppler_layers_iter_free</a>            (<em class="parameter"><code><a class="link" href="PopplerDocument.html#PopplerLayersIter" title="PopplerLayersIter"><span class="type">PopplerLayersIter</span></a> *iter</code></em>);
+<a class="link" href="PopplerDocument.html#PopplerLayersIter" title="PopplerLayersIter"><span class="returnvalue">PopplerLayersIter</span></a> * <a class="link" href="PopplerDocument.html#poppler-layers-iter-get-child" title="poppler_layers_iter_get_child ()">poppler_layers_iter_get_child</a>       (<em class="parameter"><code><a class="link" href="PopplerDocument.html#PopplerLayersIter" title="PopplerLayersIter"><span class="type">PopplerLayersIter</span></a> *parent</code></em>);
+<a class="link" href="PopplerLayer.html" title="PopplerLayer"><span class="returnvalue">PopplerLayer</span></a> *      <a class="link" href="PopplerDocument.html#poppler-layers-iter-get-layer" title="poppler_layers_iter_get_layer ()">poppler_layers_iter_get_layer</a>       (<em class="parameter"><code><a class="link" href="PopplerDocument.html#PopplerLayersIter" title="PopplerLayersIter"><span class="type">PopplerLayersIter</span></a> *iter</code></em>);
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="returnvalue">gchar</span></a> *             <a class="link" href="PopplerDocument.html#poppler-layers-iter-get-title" title="poppler_layers_iter_get_title ()">poppler_layers_iter_get_title</a>       (<em class="parameter"><code><a class="link" href="PopplerDocument.html#PopplerLayersIter" title="PopplerLayersIter"><span class="type">PopplerLayersIter</span></a> *iter</code></em>);
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a>            <a class="link" href="PopplerDocument.html#poppler-layers-iter-next" title="poppler_layers_iter_next ()">poppler_layers_iter_next</a>            (<em class="parameter"><code><a class="link" href="PopplerDocument.html#PopplerLayersIter" title="PopplerLayersIter"><span class="type">PopplerLayersIter</span></a> *iter</code></em>);
+<a class="link" href="PopplerDocument.html#PopplerPSFile" title="PopplerPSFile"><span class="returnvalue">PopplerPSFile</span></a> *     <a class="link" href="PopplerDocument.html#poppler-ps-file-new" title="poppler_ps_file_new ()">poppler_ps_file_new</a>                 (<em class="parameter"><code><a class="link" href="PopplerDocument.html" title="PopplerDocument"><span class="type">PopplerDocument</span></a> *document</code></em>,
+                                                         <em class="parameter"><code>const <span class="type">char</span> *filename</code></em>,
+                                                         <em class="parameter"><code><span class="type">int</span> first_page</code></em>,
+                                                         <em class="parameter"><code><span class="type">int</span> n_pages</code></em>);
+<span class="returnvalue">void</span>                <a class="link" href="PopplerDocument.html#poppler-ps-file-free" title="poppler_ps_file_free ()">poppler_ps_file_free</a>                (<em class="parameter"><code><a class="link" href="PopplerDocument.html#PopplerPSFile" title="PopplerPSFile"><span class="type">PopplerPSFile</span></a> *ps_file</code></em>);
+<span class="returnvalue">void</span>                <a class="link" href="PopplerDocument.html#poppler-ps-file-set-paper-size" title="poppler_ps_file_set_paper_size ()">poppler_ps_file_set_paper_size</a>      (<em class="parameter"><code><a class="link" href="PopplerDocument.html#PopplerPSFile" title="PopplerPSFile"><span class="type">PopplerPSFile</span></a> *ps_file</code></em>,
+                                                         <em class="parameter"><code><span class="type">double</span> width</code></em>,
+                                                         <em class="parameter"><code><span class="type">double</span> height</code></em>);
+<span class="returnvalue">void</span>                <a class="link" href="PopplerDocument.html#poppler-ps-file-set-duplex" title="poppler_ps_file_set_duplex ()">poppler_ps_file_set_duplex</a>          (<em class="parameter"><code><a class="link" href="PopplerDocument.html#PopplerPSFile" title="PopplerPSFile"><span class="type">PopplerPSFile</span></a> *ps_file</code></em>,
+                                                         <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a> duplex</code></em>);
+</pre>
+</div>
+<div class="refsect1">
+<a name="PopplerDocument.object-hierarchy"></a><h2>Object Hierarchy</h2>
+<pre class="synopsis">
+  <a href="http://library.gnome.org/devel/gobject/unstable/gobject-The-Base-Object-Type.html#GObject">GObject</a>
+   +----PopplerDocument
+</pre>
+</div>
+<div class="refsect1">
+<a name="PopplerDocument.properties"></a><h2>Properties</h2>
+<pre class="synopsis">
+  "<a class="link" href="PopplerDocument.html#PopplerDocument--author" title='The "author" property'>author</a>"                   <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a>*                : Read
+  "<a class="link" href="PopplerDocument.html#PopplerDocument--creation-date" title='The "creation-date" property'>creation-date</a>"            <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="type">gint</span></a>                  : Read
+  "<a class="link" href="PopplerDocument.html#PopplerDocument--creator" title='The "creator" property'>creator</a>"                  <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a>*                : Read
+  "<a class="link" href="PopplerDocument.html#PopplerDocument--format" title='The "format" property'>format</a>"                   <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a>*                : Read
+  "<a class="link" href="PopplerDocument.html#PopplerDocument--format-major" title='The "format-major" property'>format-major</a>"             <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a>                 : Read
+  "<a class="link" href="PopplerDocument.html#PopplerDocument--format-minor" title='The "format-minor" property'>format-minor</a>"             <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a>                 : Read
+  "<a class="link" href="PopplerDocument.html#PopplerDocument--keywords" title='The "keywords" property'>keywords</a>"                 <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a>*                : Read
+  "<a class="link" href="PopplerDocument.html#PopplerDocument--linearized" title='The "linearized" property'>linearized</a>"               <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a>              : Read
+  "<a class="link" href="PopplerDocument.html#PopplerDocument--metadata" title='The "metadata" property'>metadata</a>"                 <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a>*                : Read
+  "<a class="link" href="PopplerDocument.html#PopplerDocument--mod-date" title='The "mod-date" property'>mod-date</a>"                 <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="type">gint</span></a>                  : Read
+  "<a class="link" href="PopplerDocument.html#PopplerDocument--page-layout" title='The "page-layout" property'>page-layout</a>"              <a class="link" href="PopplerDocument.html#PopplerPageLayout" title="enum PopplerPageLayout"><span class="type">PopplerPageLayout</span></a>     : Read
+  "<a class="link" href="PopplerDocument.html#PopplerDocument--page-mode" title='The "page-mode" property'>page-mode</a>"                <a class="link" href="PopplerDocument.html#PopplerPageMode" title="enum PopplerPageMode"><span class="type">PopplerPageMode</span></a>       : Read
+  "<a class="link" href="PopplerDocument.html#PopplerDocument--permissions" title='The "permissions" property'>permissions</a>"              <a class="link" href="PopplerDocument.html#PopplerPermissions" title="enum PopplerPermissions"><span class="type">PopplerPermissions</span></a>    : Read
+  "<a class="link" href="PopplerDocument.html#PopplerDocument--producer" title='The "producer" property'>producer</a>"                 <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a>*                : Read
+  "<a class="link" href="PopplerDocument.html#PopplerDocument--subject" title='The "subject" property'>subject</a>"                  <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a>*                : Read
+  "<a class="link" href="PopplerDocument.html#PopplerDocument--title" title='The "title" property'>title</a>"                    <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a>*                : Read
+  "<a class="link" href="PopplerDocument.html#PopplerDocument--viewer-preferences" title='The "viewer-preferences" property'>viewer-preferences</a>"       <a class="link" href="PopplerDocument.html#PopplerViewerPreferences" title="enum PopplerViewerPreferences"><span class="type">PopplerViewerPreferences</span></a>  : Read
+</pre>
+</div>
+<div class="refsect1">
+<a name="PopplerDocument.description"></a><h2>Description</h2>
+<p>
+The <a class="link" href="PopplerDocument.html" title="PopplerDocument"><span class="type">PopplerDocument</span></a> is an object used to refer to a main document.
+</p>
+</div>
+<div class="refsect1">
+<a name="PopplerDocument.details"></a><h2>Details</h2>
+<div class="refsect2">
+<a name="PopplerDocument-struct"></a><h3>PopplerDocument</h3>
+<pre class="programlisting">typedef struct _PopplerDocument PopplerDocument;</pre>
+</div>
+<hr>
+<div class="refsect2">
+<a name="PopplerIndexIter"></a><h3>PopplerIndexIter</h3>
+<pre class="programlisting">typedef struct _PopplerIndexIter PopplerIndexIter;</pre>
+</div>
+<hr>
+<div class="refsect2">
+<a name="PopplerFontsIter"></a><h3>PopplerFontsIter</h3>
+<pre class="programlisting">typedef struct _PopplerFontsIter PopplerFontsIter;</pre>
+</div>
+<hr>
+<div class="refsect2">
+<a name="PopplerLayersIter"></a><h3>PopplerLayersIter</h3>
+<pre class="programlisting">typedef struct _PopplerLayersIter PopplerLayersIter;</pre>
+</div>
+<hr>
+<div class="refsect2">
+<a name="PopplerPageLayout"></a><h3>enum PopplerPageLayout</h3>
+<pre class="programlisting">typedef enum {
+  POPPLER_PAGE_LAYOUT_UNSET,
+  POPPLER_PAGE_LAYOUT_SINGLE_PAGE,
+  POPPLER_PAGE_LAYOUT_ONE_COLUMN,
+  POPPLER_PAGE_LAYOUT_TWO_COLUMN_LEFT,
+  POPPLER_PAGE_LAYOUT_TWO_COLUMN_RIGHT,
+  POPPLER_PAGE_LAYOUT_TWO_PAGE_LEFT,
+  POPPLER_PAGE_LAYOUT_TWO_PAGE_RIGHT
+} PopplerPageLayout;
+</pre>
+<p>
+Page layout types
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><a name="POPPLER-PAGE-LAYOUT-UNSET:CAPS"></a><span class="term"><code class="literal">POPPLER_PAGE_LAYOUT_UNSET</code></span></p></td>
+<td>no specific layout set
+</td>
+</tr>
+<tr>
+<td><p><a name="POPPLER-PAGE-LAYOUT-SINGLE-PAGE:CAPS"></a><span class="term"><code class="literal">POPPLER_PAGE_LAYOUT_SINGLE_PAGE</code></span></p></td>
+<td>one page at a time
+</td>
+</tr>
+<tr>
+<td><p><a name="POPPLER-PAGE-LAYOUT-ONE-COLUMN:CAPS"></a><span class="term"><code class="literal">POPPLER_PAGE_LAYOUT_ONE_COLUMN</code></span></p></td>
+<td>pages in one column
+</td>
+</tr>
+<tr>
+<td><p><a name="POPPLER-PAGE-LAYOUT-TWO-COLUMN-LEFT:CAPS"></a><span class="term"><code class="literal">POPPLER_PAGE_LAYOUT_TWO_COLUMN_LEFT</code></span></p></td>
+<td>pages in two columns with odd numbered pages on the left
+</td>
+</tr>
+<tr>
+<td><p><a name="POPPLER-PAGE-LAYOUT-TWO-COLUMN-RIGHT:CAPS"></a><span class="term"><code class="literal">POPPLER_PAGE_LAYOUT_TWO_COLUMN_RIGHT</code></span></p></td>
+<td>pages in two columns with odd numbered pages on the right
+</td>
+</tr>
+<tr>
+<td><p><a name="POPPLER-PAGE-LAYOUT-TWO-PAGE-LEFT:CAPS"></a><span class="term"><code class="literal">POPPLER_PAGE_LAYOUT_TWO_PAGE_LEFT</code></span></p></td>
+<td>two pages at a time with odd numbered pages on the left
+</td>
+</tr>
+<tr>
+<td><p><a name="POPPLER-PAGE-LAYOUT-TWO-PAGE-RIGHT:CAPS"></a><span class="term"><code class="literal">POPPLER_PAGE_LAYOUT_TWO_PAGE_RIGHT</code></span></p></td>
+<td>two pages at a time with odd numbered pages on the right
+</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="PopplerPageMode"></a><h3>enum PopplerPageMode</h3>
+<pre class="programlisting">typedef enum {
+  POPPLER_PAGE_MODE_UNSET,
+  POPPLER_PAGE_MODE_NONE,
+  POPPLER_PAGE_MODE_USE_OUTLINES,
+  POPPLER_PAGE_MODE_USE_THUMBS,
+  POPPLER_PAGE_MODE_FULL_SCREEN,
+  POPPLER_PAGE_MODE_USE_OC,
+  POPPLER_PAGE_MODE_USE_ATTACHMENTS
+} PopplerPageMode;
+</pre>
+<p>
+Page modes
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><a name="POPPLER-PAGE-MODE-UNSET:CAPS"></a><span class="term"><code class="literal">POPPLER_PAGE_MODE_UNSET</code></span></p></td>
+<td>no specific mode set
+</td>
+</tr>
+<tr>
+<td><p><a name="POPPLER-PAGE-MODE-NONE:CAPS"></a><span class="term"><code class="literal">POPPLER_PAGE_MODE_NONE</code></span></p></td>
+<td>neither document outline nor thumbnails visible
+</td>
+</tr>
+<tr>
+<td><p><a name="POPPLER-PAGE-MODE-USE-OUTLINES:CAPS"></a><span class="term"><code class="literal">POPPLER_PAGE_MODE_USE_OUTLINES</code></span></p></td>
+<td>document outline visible
+</td>
+</tr>
+<tr>
+<td><p><a name="POPPLER-PAGE-MODE-USE-THUMBS:CAPS"></a><span class="term"><code class="literal">POPPLER_PAGE_MODE_USE_THUMBS</code></span></p></td>
+<td>thumbnails visible
+</td>
+</tr>
+<tr>
+<td><p><a name="POPPLER-PAGE-MODE-FULL-SCREEN:CAPS"></a><span class="term"><code class="literal">POPPLER_PAGE_MODE_FULL_SCREEN</code></span></p></td>
+<td>full-screen mode
+</td>
+</tr>
+<tr>
+<td><p><a name="POPPLER-PAGE-MODE-USE-OC:CAPS"></a><span class="term"><code class="literal">POPPLER_PAGE_MODE_USE_OC</code></span></p></td>
+<td>layers panel visible
+</td>
+</tr>
+<tr>
+<td><p><a name="POPPLER-PAGE-MODE-USE-ATTACHMENTS:CAPS"></a><span class="term"><code class="literal">POPPLER_PAGE_MODE_USE_ATTACHMENTS</code></span></p></td>
+<td>attachments panel visible
+</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="PopplerFontInfo"></a><h3>PopplerFontInfo</h3>
+<pre class="programlisting">typedef struct {
+} PopplerFontInfo;
+</pre>
+</div>
+<hr>
+<div class="refsect2">
+<a name="PopplerFontType"></a><h3>enum PopplerFontType</h3>
+<pre class="programlisting">typedef enum {
+  POPPLER_FONT_TYPE_UNKNOWN,
+  POPPLER_FONT_TYPE_TYPE1,
+  POPPLER_FONT_TYPE_TYPE1C,
+  POPPLER_FONT_TYPE_TYPE1COT,
+  POPPLER_FONT_TYPE_TYPE3,
+  POPPLER_FONT_TYPE_TRUETYPE,
+  POPPLER_FONT_TYPE_TRUETYPEOT,
+  POPPLER_FONT_TYPE_CID_TYPE0,
+  POPPLER_FONT_TYPE_CID_TYPE0C,
+  POPPLER_FONT_TYPE_CID_TYPE0COT,
+  POPPLER_FONT_TYPE_CID_TYPE2,
+  POPPLER_FONT_TYPE_CID_TYPE2OT
+} PopplerFontType;
+</pre>
+<p>
+Font types
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><a name="POPPLER-FONT-TYPE-UNKNOWN:CAPS"></a><span class="term"><code class="literal">POPPLER_FONT_TYPE_UNKNOWN</code></span></p></td>
+<td>unknown font type
+</td>
+</tr>
+<tr>
+<td><p><a name="POPPLER-FONT-TYPE-TYPE1:CAPS"></a><span class="term"><code class="literal">POPPLER_FONT_TYPE_TYPE1</code></span></p></td>
+<td>Type 1 font type
+</td>
+</tr>
+<tr>
+<td><p><a name="POPPLER-FONT-TYPE-TYPE1C:CAPS"></a><span class="term"><code class="literal">POPPLER_FONT_TYPE_TYPE1C</code></span></p></td>
+<td>Type 1 font type embedded in Compact Font Format (CFF) font program
+</td>
+</tr>
+<tr>
+<td><p><a name="POPPLER-FONT-TYPE-TYPE1COT:CAPS"></a><span class="term"><code class="literal">POPPLER_FONT_TYPE_TYPE1COT</code></span></p></td>
+<td>Type 1 font type embedded in OpenType font program
+</td>
+</tr>
+<tr>
+<td><p><a name="POPPLER-FONT-TYPE-TYPE3:CAPS"></a><span class="term"><code class="literal">POPPLER_FONT_TYPE_TYPE3</code></span></p></td>
+<td>A font type that is defined with PDF graphics operators
+</td>
+</tr>
+<tr>
+<td><p><a name="POPPLER-FONT-TYPE-TRUETYPE:CAPS"></a><span class="term"><code class="literal">POPPLER_FONT_TYPE_TRUETYPE</code></span></p></td>
+<td>TrueType font type
+</td>
+</tr>
+<tr>
+<td><p><a name="POPPLER-FONT-TYPE-TRUETYPEOT:CAPS"></a><span class="term"><code class="literal">POPPLER_FONT_TYPE_TRUETYPEOT</code></span></p></td>
+<td>TrueType font type embedded in OpenType font program
+</td>
+</tr>
+<tr>
+<td><p><a name="POPPLER-FONT-TYPE-CID-TYPE0:CAPS"></a><span class="term"><code class="literal">POPPLER_FONT_TYPE_CID_TYPE0</code></span></p></td>
+<td>CIDFont type based on Type 1 font technology
+</td>
+</tr>
+<tr>
+<td><p><a name="POPPLER-FONT-TYPE-CID-TYPE0C:CAPS"></a><span class="term"><code class="literal">POPPLER_FONT_TYPE_CID_TYPE0C</code></span></p></td>
+<td>CIDFont type based on Type 1 font technology embedded in CFF font program
+</td>
+</tr>
+<tr>
+<td><p><a name="POPPLER-FONT-TYPE-CID-TYPE0COT:CAPS"></a><span class="term"><code class="literal">POPPLER_FONT_TYPE_CID_TYPE0COT</code></span></p></td>
+<td>CIDFont type based on Type 1 font technology embedded in OpenType font program
+</td>
+</tr>
+<tr>
+<td><p><a name="POPPLER-FONT-TYPE-CID-TYPE2:CAPS"></a><span class="term"><code class="literal">POPPLER_FONT_TYPE_CID_TYPE2</code></span></p></td>
+<td>CIDFont type based on TrueType font technology
+</td>
+</tr>
+<tr>
+<td><p><a name="POPPLER-FONT-TYPE-CID-TYPE2OT:CAPS"></a><span class="term"><code class="literal">POPPLER_FONT_TYPE_CID_TYPE2OT</code></span></p></td>
+<td>CIDFont type based on TrueType font technology embedded in OpenType font program
+</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="PopplerPSFile"></a><h3>PopplerPSFile</h3>
+<pre class="programlisting">typedef struct {
+} PopplerPSFile;
+</pre>
+</div>
+<hr>
+<div class="refsect2">
+<a name="PopplerViewerPreferences"></a><h3>enum PopplerViewerPreferences</h3>
+<pre class="programlisting">typedef enum {
+  POPPLER_VIEWER_PREFERENCES_UNSET = 0,
+  POPPLER_VIEWER_PREFERENCES_HIDE_TOOLBAR = 1 &lt;&lt; 0,
+  POPPLER_VIEWER_PREFERENCES_HIDE_MENUBAR = 1 &lt;&lt; 1,
+  POPPLER_VIEWER_PREFERENCES_HIDE_WINDOWUI = 1 &lt;&lt; 2,
+  POPPLER_VIEWER_PREFERENCES_FIT_WINDOW = 1 &lt;&lt; 3,
+  POPPLER_VIEWER_PREFERENCES_CENTER_WINDOW = 1 &lt;&lt; 4,
+  POPPLER_VIEWER_PREFERENCES_DISPLAY_DOC_TITLE = 1 &lt;&lt; 5,
+  POPPLER_VIEWER_PREFERENCES_DIRECTION_RTL = 1 &lt;&lt; 6
+} PopplerViewerPreferences;
+</pre>
+<p>
+Viewer preferences
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><a name="POPPLER-VIEWER-PREFERENCES-UNSET:CAPS"></a><span class="term"><code class="literal">POPPLER_VIEWER_PREFERENCES_UNSET</code></span></p></td>
+<td>no preferences set
+</td>
+</tr>
+<tr>
+<td><p><a name="POPPLER-VIEWER-PREFERENCES-HIDE-TOOLBAR:CAPS"></a><span class="term"><code class="literal">POPPLER_VIEWER_PREFERENCES_HIDE_TOOLBAR</code></span></p></td>
+<td>hider toolbars when document is active
+</td>
+</tr>
+<tr>
+<td><p><a name="POPPLER-VIEWER-PREFERENCES-HIDE-MENUBAR:CAPS"></a><span class="term"><code class="literal">POPPLER_VIEWER_PREFERENCES_HIDE_MENUBAR</code></span></p></td>
+<td>hide menu bar when document is active
+</td>
+</tr>
+<tr>
+<td><p><a name="POPPLER-VIEWER-PREFERENCES-HIDE-WINDOWUI:CAPS"></a><span class="term"><code class="literal">POPPLER_VIEWER_PREFERENCES_HIDE_WINDOWUI</code></span></p></td>
+<td>hide UI elements in document's window
+</td>
+</tr>
+<tr>
+<td><p><a name="POPPLER-VIEWER-PREFERENCES-FIT-WINDOW:CAPS"></a><span class="term"><code class="literal">POPPLER_VIEWER_PREFERENCES_FIT_WINDOW</code></span></p></td>
+<td>resize document's window to fit the size of the first displayed page
+</td>
+</tr>
+<tr>
+<td><p><a name="POPPLER-VIEWER-PREFERENCES-CENTER-WINDOW:CAPS"></a><span class="term"><code class="literal">POPPLER_VIEWER_PREFERENCES_CENTER_WINDOW</code></span></p></td>
+<td>position the document's window in the center of the screen
+</td>
+</tr>
+<tr>
+<td><p><a name="POPPLER-VIEWER-PREFERENCES-DISPLAY-DOC-TITLE:CAPS"></a><span class="term"><code class="literal">POPPLER_VIEWER_PREFERENCES_DISPLAY_DOC_TITLE</code></span></p></td>
+<td>display document title in window's title bar
+</td>
+</tr>
+<tr>
+<td><p><a name="POPPLER-VIEWER-PREFERENCES-DIRECTION-RTL:CAPS"></a><span class="term"><code class="literal">POPPLER_VIEWER_PREFERENCES_DIRECTION_RTL</code></span></p></td>
+<td>the predominant reading order for text is right to left
+</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="PopplerPermissions"></a><h3>enum PopplerPermissions</h3>
+<pre class="programlisting">typedef enum {
+  POPPLER_PERMISSIONS_OK_TO_PRINT = 1 &lt;&lt; 0,
+  POPPLER_PERMISSIONS_OK_TO_MODIFY = 1 &lt;&lt; 1,
+  POPPLER_PERMISSIONS_OK_TO_COPY = 1 &lt;&lt; 2,
+  POPPLER_PERMISSIONS_OK_TO_ADD_NOTES = 1 &lt;&lt; 3,
+  POPPLER_PERMISSIONS_OK_TO_FILL_FORM = 1 &lt;&lt; 4,
+  POPPLER_PERMISSIONS_OK_TO_EXTRACT_CONTENTS = 1 &lt;&lt; 5,
+  POPPLER_PERMISSIONS_OK_TO_ASSEMBLE = 1 &lt;&lt; 6,
+  POPPLER_PERMISSIONS_OK_TO_PRINT_HIGH_RESOLUTION = 1 &lt;&lt; 7,
+  POPPLER_PERMISSIONS_FULL = (POPPLER_PERMISSIONS_OK_TO_PRINT | POPPLER_PERMISSIONS_OK_TO_MODIFY | POPPLER_PERMISSIONS_OK_TO_COPY | POPPLER_PERMISSIONS_OK_TO_ADD_NOTES | POPPLER_PERMISSIONS_OK_TO_FILL_FORM | POPPLER_PERMISSIONS_OK_TO_EXTRACT_CONTENTS | POPPLER_PERMISSIONS_OK_TO_ASSEMBLE | POPPLER_PERMISSIONS_OK_TO_PRINT_HIGH_RESOLUTION)
+} PopplerPermissions;
+</pre>
+<p>
+Permissions
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><a name="POPPLER-PERMISSIONS-OK-TO-PRINT:CAPS"></a><span class="term"><code class="literal">POPPLER_PERMISSIONS_OK_TO_PRINT</code></span></p></td>
+<td>document can be printer
+</td>
+</tr>
+<tr>
+<td><p><a name="POPPLER-PERMISSIONS-OK-TO-MODIFY:CAPS"></a><span class="term"><code class="literal">POPPLER_PERMISSIONS_OK_TO_MODIFY</code></span></p></td>
+<td>document contents can be modified
+</td>
+</tr>
+<tr>
+<td><p><a name="POPPLER-PERMISSIONS-OK-TO-COPY:CAPS"></a><span class="term"><code class="literal">POPPLER_PERMISSIONS_OK_TO_COPY</code></span></p></td>
+<td>document can be copied
+</td>
+</tr>
+<tr>
+<td><p><a name="POPPLER-PERMISSIONS-OK-TO-ADD-NOTES:CAPS"></a><span class="term"><code class="literal">POPPLER_PERMISSIONS_OK_TO_ADD_NOTES</code></span></p></td>
+<td>annotations can added to the document
+</td>
+</tr>
+<tr>
+<td><p><a name="POPPLER-PERMISSIONS-OK-TO-FILL-FORM:CAPS"></a><span class="term"><code class="literal">POPPLER_PERMISSIONS_OK_TO_FILL_FORM</code></span></p></td>
+<td>interactive form fields can be filled in
+</td>
+</tr>
+<tr>
+<td><p><a name="POPPLER-PERMISSIONS-OK-TO-EXTRACT-CONTENTS:CAPS"></a><span class="term"><code class="literal">POPPLER_PERMISSIONS_OK_TO_EXTRACT_CONTENTS</code></span></p></td>
+<td>extract text and graphics
+(in support of accessibility to users with disabilities or for other purposes). Since 0.18
+</td>
+</tr>
+<tr>
+<td><p><a name="POPPLER-PERMISSIONS-OK-TO-ASSEMBLE:CAPS"></a><span class="term"><code class="literal">POPPLER_PERMISSIONS_OK_TO_ASSEMBLE</code></span></p></td>
+<td>assemble the document (insert, rotate, or delete pages and create
+bookmarks or thumbnail images). Since 0.18
+</td>
+</tr>
+<tr>
+<td><p><a name="POPPLER-PERMISSIONS-OK-TO-PRINT-HIGH-RESOLUTION:CAPS"></a><span class="term"><code class="literal">POPPLER_PERMISSIONS_OK_TO_PRINT_HIGH_RESOLUTION</code></span></p></td>
+<td>document can be printer at high resolution. Since 0.18
+</td>
+</tr>
+<tr>
+<td><p><a name="POPPLER-PERMISSIONS-FULL:CAPS"></a><span class="term"><code class="literal">POPPLER_PERMISSIONS_FULL</code></span></p></td>
+<td>document permits all operations
+</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="poppler-document-new-from-file"></a><h3>poppler_document_new_from_file ()</h3>
+<pre class="programlisting"><a class="link" href="PopplerDocument.html" title="PopplerDocument"><span class="returnvalue">PopplerDocument</span></a> *   poppler_document_new_from_file      (<em class="parameter"><code>const <span class="type">char</span> *uri</code></em>,
+                                                         <em class="parameter"><code>const <span class="type">char</span> *password</code></em>,
+                                                         <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Error-Reporting.html#GError"><span class="type">GError</span></a> **error</code></em>);</pre>
+<p>
+Creates a new <a class="link" href="PopplerDocument.html" title="PopplerDocument"><span class="type">PopplerDocument</span></a>.  If <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#NULL:CAPS"><code class="literal">NULL</code></a> is returned, then <em class="parameter"><code>error</code></em> will be
+set. Possible errors include those in the <a class="link" href="poppler-poppler.html#POPPLER-ERROR:CAPS" title="POPPLER_ERROR"><span class="type">POPPLER_ERROR</span></a> and <a href="http://library.gnome.org/devel/glib/unstable/glib-File-Utilities.html#G-FILE-ERROR:CAPS"><span class="type">G_FILE_ERROR</span></a>
+domains.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>uri</code></em> :</span></p></td>
+<td>uri of the file to load</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>password</code></em> :</span></p></td>
+<td>password to unlock the file with, or <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#NULL:CAPS"><code class="literal">NULL</code></a>. <span class="annotation">[<acronym title="NULL is ok, both for passing and for returning."><span class="acronym">allow-none</span></acronym>]</span>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>error</code></em> :</span></p></td>
+<td>Return location for an error, or <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#NULL:CAPS"><code class="literal">NULL</code></a>. <span class="annotation">[<acronym title="NULL is ok, both for passing and for returning."><span class="acronym">allow-none</span></acronym>]</span>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>A newly created <a class="link" href="PopplerDocument.html" title="PopplerDocument"><span class="type">PopplerDocument</span></a>, or <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#NULL:CAPS"><code class="literal">NULL</code></a>
+</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="poppler-document-new-from-data"></a><h3>poppler_document_new_from_data ()</h3>
+<pre class="programlisting"><a class="link" href="PopplerDocument.html" title="PopplerDocument"><span class="returnvalue">PopplerDocument</span></a> *   poppler_document_new_from_data      (<em class="parameter"><code><span class="type">char</span> *data</code></em>,
+                                                         <em class="parameter"><code><span class="type">int</span> length</code></em>,
+                                                         <em class="parameter"><code>const <span class="type">char</span> *password</code></em>,
+                                                         <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Error-Reporting.html#GError"><span class="type">GError</span></a> **error</code></em>);</pre>
+<p>
+Creates a new <a class="link" href="PopplerDocument.html" title="PopplerDocument"><span class="type">PopplerDocument</span></a>.  If <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#NULL:CAPS"><code class="literal">NULL</code></a> is returned, then <em class="parameter"><code>error</code></em> will be
+set. Possible errors include those in the <a class="link" href="poppler-poppler.html#POPPLER-ERROR:CAPS" title="POPPLER_ERROR"><span class="type">POPPLER_ERROR</span></a> and <a href="http://library.gnome.org/devel/glib/unstable/glib-File-Utilities.html#G-FILE-ERROR:CAPS"><span class="type">G_FILE_ERROR</span></a>
+domains.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>data</code></em> :</span></p></td>
+<td>the pdf data contained in a char array</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>length</code></em> :</span></p></td>
+<td>the length of <span class="type">data</span>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>password</code></em> :</span></p></td>
+<td>password to unlock the file with, or <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#NULL:CAPS"><code class="literal">NULL</code></a>. <span class="annotation">[<acronym title="NULL is ok, both for passing and for returning."><span class="acronym">allow-none</span></acronym>]</span>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>error</code></em> :</span></p></td>
+<td>Return location for an error, or <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#NULL:CAPS"><code class="literal">NULL</code></a>. <span class="annotation">[<acronym title="NULL is ok, both for passing and for returning."><span class="acronym">allow-none</span></acronym>]</span>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>A newly created <a class="link" href="PopplerDocument.html" title="PopplerDocument"><span class="type">PopplerDocument</span></a>, or <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#NULL:CAPS"><code class="literal">NULL</code></a>
+</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="poppler-document-save"></a><h3>poppler_document_save ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a>            poppler_document_save               (<em class="parameter"><code><a class="link" href="PopplerDocument.html" title="PopplerDocument"><span class="type">PopplerDocument</span></a> *document</code></em>,
+                                                         <em class="parameter"><code>const <span class="type">char</span> *uri</code></em>,
+                                                         <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Error-Reporting.html#GError"><span class="type">GError</span></a> **error</code></em>);</pre>
+<p>
+Saves <em class="parameter"><code>document</code></em>. Any change made in the document such as
+form fields filled, annotations added or modified
+will be saved.
+If <em class="parameter"><code>error</code></em> is set, <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#FALSE:CAPS"><code class="literal">FALSE</code></a> will be returned. Possible errors
+include those in the <a href="http://library.gnome.org/devel/glib/unstable/glib-File-Utilities.html#G-FILE-ERROR:CAPS"><span class="type">G_FILE_ERROR</span></a> domain.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>document</code></em> :</span></p></td>
+<td>a <a class="link" href="PopplerDocument.html" title="PopplerDocument"><span class="type">PopplerDocument</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>uri</code></em> :</span></p></td>
+<td>uri of file to save</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>error</code></em> :</span></p></td>
+<td>return location for an error, or <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#NULL:CAPS"><code class="literal">NULL</code></a>. <span class="annotation">[<acronym title="NULL is ok, both for passing and for returning."><span class="acronym">allow-none</span></acronym>]</span>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#TRUE:CAPS"><code class="literal">TRUE</code></a>, if the document was successfully saved</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="poppler-document-save-a-copy"></a><h3>poppler_document_save_a_copy ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a>            poppler_document_save_a_copy        (<em class="parameter"><code><a class="link" href="PopplerDocument.html" title="PopplerDocument"><span class="type">PopplerDocument</span></a> *document</code></em>,
+                                                         <em class="parameter"><code>const <span class="type">char</span> *uri</code></em>,
+                                                         <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Error-Reporting.html#GError"><span class="type">GError</span></a> **error</code></em>);</pre>
+<p>
+Saves a copy of the original <em class="parameter"><code>document</code></em>.
+Any change made in the document such as 
+form fields filled by the user will not be saved. 
+If <em class="parameter"><code>error</code></em> is set, <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#FALSE:CAPS"><code class="literal">FALSE</code></a> will be returned. Possible errors
+include those in the <a href="http://library.gnome.org/devel/glib/unstable/glib-File-Utilities.html#G-FILE-ERROR:CAPS"><span class="type">G_FILE_ERROR</span></a> domain.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>document</code></em> :</span></p></td>
+<td>a <a class="link" href="PopplerDocument.html" title="PopplerDocument"><span class="type">PopplerDocument</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>uri</code></em> :</span></p></td>
+<td>uri of file to save</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>error</code></em> :</span></p></td>
+<td>return location for an error, or <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#NULL:CAPS"><code class="literal">NULL</code></a>. <span class="annotation">[<acronym title="NULL is ok, both for passing and for returning."><span class="acronym">allow-none</span></acronym>]</span>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#TRUE:CAPS"><code class="literal">TRUE</code></a>, if the document was successfully saved</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="poppler-document-get-id"></a><h3>poppler_document_get_id ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a>            poppler_document_get_id             (<em class="parameter"><code><a class="link" href="PopplerDocument.html" title="PopplerDocument"><span class="type">PopplerDocument</span></a> *document</code></em>,
+                                                         <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> **permanent_id</code></em>,
+                                                         <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> **update_id</code></em>);</pre>
+<p>
+Returns the PDF file identifier represented as two byte string arrays of size 32.
+<em class="parameter"><code>permanent_id</code></em> is the permanent identifier that is built based on the file
+contents at the time it was originally created, so that this identifer
+never changes. <em class="parameter"><code>update_id</code></em> is the update identifier that is built based on
+the file contents at the time it was last updated.
+</p>
+<p>
+Note that returned strings are not null-terminated, they have a fixed
+size of 32 bytes.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>document</code></em> :</span></p></td>
+<td>A <a class="link" href="PopplerDocument.html" title="PopplerDocument"><span class="type">PopplerDocument</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>permanent_id</code></em> :</span></p></td>
+<td>location to store an allocated string, use <a href="http://library.gnome.org/devel/glib/unstable/glib-Memory-Allocation.html#g-free"><code class="function">g_free()</code></a> to free the returned string. <span class="annotation">[<acronym title="Parameter for returning results. Default is transfer full."><span class="acronym">out</span></acronym>][<acronym title="NULL is ok, both for passing and for returning."><span class="acronym">allow-none</span></acronym>]</span>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>update_id</code></em> :</span></p></td>
+<td>location to store an allocated string, use <a href="http://library.gnome.org/devel/glib/unstable/glib-Memory-Allocation.html#g-free"><code class="function">g_free()</code></a> to free the returned string. <span class="annotation">[<acronym title="Parameter for returning results. Default is transfer full."><span class="acronym">out</span></acronym>][<acronym title="NULL is ok, both for passing and for returning."><span class="acronym">allow-none</span></acronym>]</span>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#TRUE:CAPS"><code class="literal">TRUE</code></a> if the <em class="parameter"><code>document</code></em> contains an id, <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#FALSE:CAPS"><code class="literal">FALSE</code></a> otherwise</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.16</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="poppler-document-get-pdf-version-string"></a><h3>poppler_document_get_pdf_version_string ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="returnvalue">gchar</span></a> *             poppler_document_get_pdf_version_string
+                                                        (<em class="parameter"><code><a class="link" href="PopplerDocument.html" title="PopplerDocument"><span class="type">PopplerDocument</span></a> *document</code></em>);</pre>
+<p>
+Returns the PDF version of <em class="parameter"><code>document</code></em> as a string (e.g. PDF-1.6)
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>document</code></em> :</span></p></td>
+<td>A <a class="link" href="PopplerDocument.html" title="PopplerDocument"><span class="type">PopplerDocument</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>a new allocated string containing the PDF version
+of <em class="parameter"><code>document</code></em>, or <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#NULL:CAPS"><code class="literal">NULL</code></a>
+</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.16</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="poppler-document-get-pdf-version"></a><h3>poppler_document_get_pdf_version ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span>                poppler_document_get_pdf_version    (<em class="parameter"><code><a class="link" href="PopplerDocument.html" title="PopplerDocument"><span class="type">PopplerDocument</span></a> *document</code></em>,
+                                                         <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> *major_version</code></em>,
+                                                         <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> *minor_version</code></em>);</pre>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>document</code></em> :</span></p></td>
+<td>A <a class="link" href="PopplerDocument.html" title="PopplerDocument"><span class="type">PopplerDocument</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>major_version</code></em> :</span></p></td>
+<td>return location for the PDF major version number. <span class="annotation">[<acronym title="Parameter for returning results. Default is transfer full."><span class="acronym">out</span></acronym>][<acronym title="NULL is ok, both for passing and for returning."><span class="acronym">allow-none</span></acronym>]</span>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>minor_version</code></em> :</span></p></td>
+<td>return location for the PDF minor version number. <span class="annotation">[<acronym title="Parameter for returning results. Default is transfer full."><span class="acronym">out</span></acronym>][<acronym title="NULL is ok, both for passing and for returning."><span class="acronym">allow-none</span></acronym>]</span>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>the major and minor PDF version numbers</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.16</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="poppler-document-get-title"></a><h3>poppler_document_get_title ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="returnvalue">gchar</span></a> *             poppler_document_get_title          (<em class="parameter"><code><a class="link" href="PopplerDocument.html" title="PopplerDocument"><span class="type">PopplerDocument</span></a> *document</code></em>);</pre>
+<p>
+Returns the document's title
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>document</code></em> :</span></p></td>
+<td>A <a class="link" href="PopplerDocument.html" title="PopplerDocument"><span class="type">PopplerDocument</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>a new allocated string containing the title
+of <em class="parameter"><code>document</code></em>, or <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#NULL:CAPS"><code class="literal">NULL</code></a>
+</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.16</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="poppler-document-get-author"></a><h3>poppler_document_get_author ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="returnvalue">gchar</span></a> *             poppler_document_get_author         (<em class="parameter"><code><a class="link" href="PopplerDocument.html" title="PopplerDocument"><span class="type">PopplerDocument</span></a> *document</code></em>);</pre>
+<p>
+Returns the author of the document
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>document</code></em> :</span></p></td>
+<td>A <a class="link" href="PopplerDocument.html" title="PopplerDocument"><span class="type">PopplerDocument</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>a new allocated string containing the author
+of <em class="parameter"><code>document</code></em>, or <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#NULL:CAPS"><code class="literal">NULL</code></a>
+</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.16</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="poppler-document-get-subject"></a><h3>poppler_document_get_subject ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="returnvalue">gchar</span></a> *             poppler_document_get_subject        (<em class="parameter"><code><a class="link" href="PopplerDocument.html" title="PopplerDocument"><span class="type">PopplerDocument</span></a> *document</code></em>);</pre>
+<p>
+Returns the subject of the document
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>document</code></em> :</span></p></td>
+<td>A <a class="link" href="PopplerDocument.html" title="PopplerDocument"><span class="type">PopplerDocument</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>a new allocated string containing the subject
+of <em class="parameter"><code>document</code></em>, or <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#NULL:CAPS"><code class="literal">NULL</code></a>
+</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.16</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="poppler-document-get-keywords"></a><h3>poppler_document_get_keywords ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="returnvalue">gchar</span></a> *             poppler_document_get_keywords       (<em class="parameter"><code><a class="link" href="PopplerDocument.html" title="PopplerDocument"><span class="type">PopplerDocument</span></a> *document</code></em>);</pre>
+<p>
+Returns the keywords associated to the document
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>document</code></em> :</span></p></td>
+<td>A <a class="link" href="PopplerDocument.html" title="PopplerDocument"><span class="type">PopplerDocument</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>a new allocated string containing keywords associated
+to <em class="parameter"><code>document</code></em>, or <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#NULL:CAPS"><code class="literal">NULL</code></a>
+</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.16</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="poppler-document-get-creator"></a><h3>poppler_document_get_creator ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="returnvalue">gchar</span></a> *             poppler_document_get_creator        (<em class="parameter"><code><a class="link" href="PopplerDocument.html" title="PopplerDocument"><span class="type">PopplerDocument</span></a> *document</code></em>);</pre>
+<p>
+Returns the creator of the document. If the document was converted
+from another format, the creator is the name of the product
+that created the original document from which it was converted.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>document</code></em> :</span></p></td>
+<td>A <a class="link" href="PopplerDocument.html" title="PopplerDocument"><span class="type">PopplerDocument</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>a new allocated string containing the creator
+of <em class="parameter"><code>document</code></em>, or <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#NULL:CAPS"><code class="literal">NULL</code></a>
+</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.16</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="poppler-document-get-producer"></a><h3>poppler_document_get_producer ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="returnvalue">gchar</span></a> *             poppler_document_get_producer       (<em class="parameter"><code><a class="link" href="PopplerDocument.html" title="PopplerDocument"><span class="type">PopplerDocument</span></a> *document</code></em>);</pre>
+<p>
+Returns the producer of the document. If the document was converted
+from another format, the producer is the name of the product
+that converted it to PDF
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>document</code></em> :</span></p></td>
+<td>A <a class="link" href="PopplerDocument.html" title="PopplerDocument"><span class="type">PopplerDocument</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>a new allocated string containing the producer
+of <em class="parameter"><code>document</code></em>, or <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#NULL:CAPS"><code class="literal">NULL</code></a>
+</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.16</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="poppler-document-get-creation-date"></a><h3>poppler_document_get_creation_date ()</h3>
+<pre class="programlisting"><span class="returnvalue">time_t</span>              poppler_document_get_creation_date  (<em class="parameter"><code><a class="link" href="PopplerDocument.html" title="PopplerDocument"><span class="type">PopplerDocument</span></a> *document</code></em>);</pre>
+<p>
+Returns the date the document was created as seconds since the Epoch
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>document</code></em> :</span></p></td>
+<td>A <a class="link" href="PopplerDocument.html" title="PopplerDocument"><span class="type">PopplerDocument</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>the date the document was created, or -1</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.16</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="poppler-document-get-modification-date"></a><h3>poppler_document_get_modification_date ()</h3>
+<pre class="programlisting"><span class="returnvalue">time_t</span>              poppler_document_get_modification_date
+                                                        (<em class="parameter"><code><a class="link" href="PopplerDocument.html" title="PopplerDocument"><span class="type">PopplerDocument</span></a> *document</code></em>);</pre>
+<p>
+Returns the date the document was most recently modified as seconds since the Epoch
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>document</code></em> :</span></p></td>
+<td>A <a class="link" href="PopplerDocument.html" title="PopplerDocument"><span class="type">PopplerDocument</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>the date the document was most recently modified, or -1</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.16</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="poppler-document-get-page-layout"></a><h3>poppler_document_get_page_layout ()</h3>
+<pre class="programlisting"><a class="link" href="PopplerDocument.html#PopplerPageLayout" title="enum PopplerPageLayout"><span class="returnvalue">PopplerPageLayout</span></a>   poppler_document_get_page_layout    (<em class="parameter"><code><a class="link" href="PopplerDocument.html" title="PopplerDocument"><span class="type">PopplerDocument</span></a> *document</code></em>);</pre>
+<p>
+Returns the page layout that should be used when the document is opened
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>document</code></em> :</span></p></td>
+<td>A <a class="link" href="PopplerDocument.html" title="PopplerDocument"><span class="type">PopplerDocument</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>a <a class="link" href="PopplerDocument.html#PopplerPageLayout" title="enum PopplerPageLayout"><span class="type">PopplerPageLayout</span></a> that should be used when the document is opened</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.16</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="poppler-document-get-page-mode"></a><h3>poppler_document_get_page_mode ()</h3>
+<pre class="programlisting"><a class="link" href="PopplerDocument.html#PopplerPageMode" title="enum PopplerPageMode"><span class="returnvalue">PopplerPageMode</span></a>     poppler_document_get_page_mode      (<em class="parameter"><code><a class="link" href="PopplerDocument.html" title="PopplerDocument"><span class="type">PopplerDocument</span></a> *document</code></em>);</pre>
+<p>
+Returns a <a class="link" href="PopplerDocument.html#PopplerPageMode" title="enum PopplerPageMode"><span class="type">PopplerPageMode</span></a> representing how the document should
+be initially displayed when opened.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>document</code></em> :</span></p></td>
+<td>A <a class="link" href="PopplerDocument.html" title="PopplerDocument"><span class="type">PopplerDocument</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>a <a class="link" href="PopplerDocument.html#PopplerPageMode" title="enum PopplerPageMode"><span class="type">PopplerPageMode</span></a> that should be used when document is opened</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.16</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="poppler-document-get-permissions"></a><h3>poppler_document_get_permissions ()</h3>
+<pre class="programlisting"><a class="link" href="PopplerDocument.html#PopplerPermissions" title="enum PopplerPermissions"><span class="returnvalue">PopplerPermissions</span></a>  poppler_document_get_permissions    (<em class="parameter"><code><a class="link" href="PopplerDocument.html" title="PopplerDocument"><span class="type">PopplerDocument</span></a> *document</code></em>);</pre>
+<p>
+Returns the flags specifying which operations are permitted when the document is opened.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>document</code></em> :</span></p></td>
+<td>A <a class="link" href="PopplerDocument.html" title="PopplerDocument"><span class="type">PopplerDocument</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>a set of falgs from  <a class="link" href="PopplerDocument.html#PopplerPermissions" title="enum PopplerPermissions"><span class="type">PopplerPermissions</span></a> enumeration</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.16</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="poppler-document-get-metadata"></a><h3>poppler_document_get_metadata ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="returnvalue">gchar</span></a> *             poppler_document_get_metadata       (<em class="parameter"><code><a class="link" href="PopplerDocument.html" title="PopplerDocument"><span class="type">PopplerDocument</span></a> *document</code></em>);</pre>
+<p>
+Returns the XML metadata string of the document
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>document</code></em> :</span></p></td>
+<td>A <a class="link" href="PopplerDocument.html" title="PopplerDocument"><span class="type">PopplerDocument</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>a new allocated string containing the XML
+metadata, or <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#NULL:CAPS"><code class="literal">NULL</code></a>
+</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.16</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="poppler-document-is-linearized"></a><h3>poppler_document_is_linearized ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a>            poppler_document_is_linearized      (<em class="parameter"><code><a class="link" href="PopplerDocument.html" title="PopplerDocument"><span class="type">PopplerDocument</span></a> *document</code></em>);</pre>
+<p>
+Returns whether <em class="parameter"><code>document</code></em> is linearized or not. Linearization of PDF
+enables efficient incremental access of the PDF file in a network environment.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>document</code></em> :</span></p></td>
+<td>A <a class="link" href="PopplerDocument.html" title="PopplerDocument"><span class="type">PopplerDocument</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#TRUE:CAPS"><code class="literal">TRUE</code></a> if <em class="parameter"><code>document</code></em> is linearized, <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#FALSE:CAPS"><code class="literal">FALSE</code></a> otherwhise</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.16</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="poppler-document-get-n-pages"></a><h3>poppler_document_get_n_pages ()</h3>
+<pre class="programlisting"><span class="returnvalue">int</span>                 poppler_document_get_n_pages        (<em class="parameter"><code><a class="link" href="PopplerDocument.html" title="PopplerDocument"><span class="type">PopplerDocument</span></a> *document</code></em>);</pre>
+<p>
+Returns the number of pages in a loaded document.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>document</code></em> :</span></p></td>
+<td>A <a class="link" href="PopplerDocument.html" title="PopplerDocument"><span class="type">PopplerDocument</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>Number of pages</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="poppler-document-get-page"></a><h3>poppler_document_get_page ()</h3>
+<pre class="programlisting"><a class="link" href="PopplerPage.html" title="PopplerPage"><span class="returnvalue">PopplerPage</span></a> *       poppler_document_get_page           (<em class="parameter"><code><a class="link" href="PopplerDocument.html" title="PopplerDocument"><span class="type">PopplerDocument</span></a> *document</code></em>,
+                                                         <em class="parameter"><code><span class="type">int</span> index</code></em>);</pre>
+<p>
+Returns the <a class="link" href="PopplerPage.html" title="PopplerPage"><span class="type">PopplerPage</span></a> indexed at <em class="parameter"><code>index</code></em>.  This object is owned by the
+caller.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>document</code></em> :</span></p></td>
+<td>A <a class="link" href="PopplerDocument.html" title="PopplerDocument"><span class="type">PopplerDocument</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>index</code></em> :</span></p></td>
+<td>a page index</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>(transfer full) : The <a class="link" href="PopplerPage.html" title="PopplerPage"><span class="type">PopplerPage</span></a> at <em class="parameter"><code>index</code></em>
+</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="poppler-document-get-page-by-label"></a><h3>poppler_document_get_page_by_label ()</h3>
+<pre class="programlisting"><a class="link" href="PopplerPage.html" title="PopplerPage"><span class="returnvalue">PopplerPage</span></a> *       poppler_document_get_page_by_label  (<em class="parameter"><code><a class="link" href="PopplerDocument.html" title="PopplerDocument"><span class="type">PopplerDocument</span></a> *document</code></em>,
+                                                         <em class="parameter"><code>const <span class="type">char</span> *label</code></em>);</pre>
+<p>
+Returns the <a class="link" href="PopplerPage.html" title="PopplerPage"><span class="type">PopplerPage</span></a> reference by <em class="parameter"><code>label</code></em>.  This object is owned by the
+caller.  <em class="parameter"><code>label</code></em> is a human-readable string representation of the page number,
+and can be document specific.  Typically, it is a value such as "iii" or "3".
+</p>
+<p>
+By default, "1" refers to the first page.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>document</code></em> :</span></p></td>
+<td>A <a class="link" href="PopplerDocument.html" title="PopplerDocument"><span class="type">PopplerDocument</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>label</code></em> :</span></p></td>
+<td>a page label</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>(transfer full) :The <a class="link" href="PopplerPage.html" title="PopplerPage"><span class="type">PopplerPage</span></a> referenced by <em class="parameter"><code>label</code></em>
+</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="poppler-document-find-dest"></a><h3>poppler_document_find_dest ()</h3>
+<pre class="programlisting"><a class="link" href="poppler-PopplerAction.html#PopplerDest" title="PopplerDest"><span class="returnvalue">PopplerDest</span></a> *       poppler_document_find_dest          (<em class="parameter"><code><a class="link" href="PopplerDocument.html" title="PopplerDocument"><span class="type">PopplerDocument</span></a> *document</code></em>,
+                                                         <em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *link_name</code></em>);</pre>
+<p>
+Finds named destination <em class="parameter"><code>link_name</code></em> in <em class="parameter"><code>document</code></em>
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>document</code></em> :</span></p></td>
+<td>A <a class="link" href="PopplerDocument.html" title="PopplerDocument"><span class="type">PopplerDocument</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>link_name</code></em> :</span></p></td>
+<td>a named destination</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>The <a class="link" href="poppler-PopplerAction.html#PopplerDest" title="PopplerDest"><span class="type">PopplerDest</span></a> destination or <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#NULL:CAPS"><code class="literal">NULL</code></a> if
+<em class="parameter"><code>link_name</code></em> is not a destination. Returned value must
+be freed with <a class="link" href="poppler-PopplerAction.html#poppler-dest-free" title="poppler_dest_free ()"><span class="type">poppler_dest_free</span></a>
+</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="poppler-document-get-n-attachments"></a><h3>poppler_document_get_n_attachments ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="returnvalue">guint</span></a>               poppler_document_get_n_attachments  (<em class="parameter"><code><a class="link" href="PopplerDocument.html" title="PopplerDocument"><span class="type">PopplerDocument</span></a> *document</code></em>);</pre>
+<p>
+Returns the number of attachments in a loaded document.
+See also <a class="link" href="PopplerDocument.html#poppler-document-get-attachments" title="poppler_document_get_attachments ()"><code class="function">poppler_document_get_attachments()</code></a>
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>document</code></em> :</span></p></td>
+<td>A <a class="link" href="PopplerDocument.html" title="PopplerDocument"><span class="type">PopplerDocument</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>Number of attachments</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.18</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="poppler-document-has-attachments"></a><h3>poppler_document_has_attachments ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a>            poppler_document_has_attachments    (<em class="parameter"><code><a class="link" href="PopplerDocument.html" title="PopplerDocument"><span class="type">PopplerDocument</span></a> *document</code></em>);</pre>
+<p>
+Returns <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#TRUE:CAPS"><code class="literal">TRUE</code></a> of <em class="parameter"><code>document</code></em> has any attachments.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>document</code></em> :</span></p></td>
+<td>A <a class="link" href="PopplerDocument.html" title="PopplerDocument"><span class="type">PopplerDocument</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#TRUE:CAPS"><code class="literal">TRUE</code></a>, if <em class="parameter"><code>document</code></em> has attachments.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="poppler-document-get-attachments"></a><h3>poppler_document_get_attachments ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Doubly-Linked-Lists.html#GList"><span class="returnvalue">GList</span></a> *             poppler_document_get_attachments    (<em class="parameter"><code><a class="link" href="PopplerDocument.html" title="PopplerDocument"><span class="type">PopplerDocument</span></a> *document</code></em>);</pre>
+<p>
+Returns a <a href="http://library.gnome.org/devel/glib/unstable/glib-Doubly-Linked-Lists.html#GList"><span class="type">GList</span></a> containing <a class="link" href="PopplerAttachment.html" title="PopplerAttachment"><span class="type">PopplerAttachment</span></a>s.  These attachments
+are unowned, and must be unreffed, and the list must be freed with
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Doubly-Linked-Lists.html#g-list-free"><code class="function">g_list_free()</code></a>.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>document</code></em> :</span></p></td>
+<td>A <a class="link" href="PopplerDocument.html" title="PopplerDocument"><span class="type">PopplerDocument</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>a list of available attachments. <span class="annotation">[<acronym title="Generics and defining elements of containers and arrays."><span class="acronym">element-type</span></acronym> PopplerAttachment][<acronym title="Free data after the code is done."><span class="acronym">transfer full</span></acronym>]</span>
+</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="poppler-document-get-form-field"></a><h3>poppler_document_get_form_field ()</h3>
+<pre class="programlisting"><a class="link" href="PopplerFormField.html" title="PoppplerFormField"><span class="returnvalue">PopplerFormField</span></a> *  poppler_document_get_form_field     (<em class="parameter"><code><a class="link" href="PopplerDocument.html" title="PopplerDocument"><span class="type">PopplerDocument</span></a> *document</code></em>,
+                                                         <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="type">gint</span></a> id</code></em>);</pre>
+<p>
+Returns the <a class="link" href="PopplerFormField.html" title="PoppplerFormField"><span class="type">PopplerFormField</span></a> for the given <em class="parameter"><code>id</code></em>. It must be freed with
+<a href="http://library.gnome.org/devel/gobject/unstable/gobject-The-Base-Object-Type.html#g-object-unref"><code class="function">g_object_unref()</code></a>
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>document</code></em> :</span></p></td>
+<td>a <a class="link" href="PopplerDocument.html" title="PopplerDocument"><span class="type">PopplerDocument</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>id</code></em> :</span></p></td>
+<td>an id of a <a class="link" href="PopplerFormField.html" title="PoppplerFormField"><span class="type">PopplerFormField</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>a new <a class="link" href="PopplerFormField.html" title="PoppplerFormField"><span class="type">PopplerFormField</span></a> or <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#NULL:CAPS"><code class="literal">NULL</code></a> if
+not found. <span class="annotation">[<acronym title="Free data after the code is done."><span class="acronym">transfer full</span></acronym>]</span>
+</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="poppler-index-iter-new"></a><h3>poppler_index_iter_new ()</h3>
+<pre class="programlisting"><a class="link" href="PopplerDocument.html#PopplerIndexIter" title="PopplerIndexIter"><span class="returnvalue">PopplerIndexIter</span></a> *  poppler_index_iter_new              (<em class="parameter"><code><a class="link" href="PopplerDocument.html" title="PopplerDocument"><span class="type">PopplerDocument</span></a> *document</code></em>);</pre>
+<p>
+Returns the root <a class="link" href="PopplerDocument.html#PopplerIndexIter" title="PopplerIndexIter"><span class="type">PopplerIndexIter</span></a> for <em class="parameter"><code>document</code></em>, or <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#NULL:CAPS"><code class="literal">NULL</code></a>.  This must be
+freed with <a class="link" href="PopplerDocument.html#poppler-index-iter-free" title="poppler_index_iter_free ()"><code class="function">poppler_index_iter_free()</code></a>.
+</p>
+<p>
+Certain documents have an index associated with them.  This index can be used
+to help the user navigate the document, and is similar to a table of
+contents.  Each node in the index will contain a <a class="link" href="poppler-PopplerAction.html#PopplerAction" title="union PopplerAction"><span class="type">PopplerAction</span></a> that can be
+displayed to the user — typically a <a class="link" href="poppler-PopplerAction.html#POPPLER-ACTION-GOTO-DEST:CAPS"><span class="type">POPPLER_ACTION_GOTO_DEST</span></a> or a
+<a class="link" href="poppler-PopplerAction.html#POPPLER-ACTION-URI:CAPS"><span class="type">POPPLER_ACTION_URI</span></a>.
+</p>
+<p>
+Here is a simple example of some code that walks the full index:
+</p>
+<p>
+</p>
+<div class="informalexample"><pre class="programlisting">
+static void
+walk_index (PopplerIndexIter *iter)
+{
+  do
+    {
+      /* Get the the action and do something with it */
+      PopplerIndexIter *child = poppler_index_iter_get_child (iter);
+      if (child)
+        walk_index (child);
+      poppler_index_iter_free (child);
+    }
+  while (poppler_index_iter_next (iter));
+}
+...
+{
+  iter = poppler_index_iter_new (document);
+  walk_index (iter);
+  poppler_index_iter_free (iter);
+}
+</pre></div>
+<p>
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>document</code></em> :</span></p></td>
+<td>a <a class="link" href="PopplerDocument.html" title="PopplerDocument"><span class="type">PopplerDocument</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>a new <a class="link" href="PopplerDocument.html#PopplerIndexIter" title="PopplerIndexIter"><span class="type">PopplerIndexIter</span></a>
+</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="poppler-index-iter-copy"></a><h3>poppler_index_iter_copy ()</h3>
+<pre class="programlisting"><a class="link" href="PopplerDocument.html#PopplerIndexIter" title="PopplerIndexIter"><span class="returnvalue">PopplerIndexIter</span></a> *  poppler_index_iter_copy             (<em class="parameter"><code><a class="link" href="PopplerDocument.html#PopplerIndexIter" title="PopplerIndexIter"><span class="type">PopplerIndexIter</span></a> *iter</code></em>);</pre>
+<p>
+Creates a new <a class="link" href="PopplerDocument.html#PopplerIndexIter" title="PopplerIndexIter"><span class="type">PopplerIndexIter</span></a> as a copy of <em class="parameter"><code>iter</code></em>.  This must be freed with
+<a class="link" href="PopplerDocument.html#poppler-index-iter-free" title="poppler_index_iter_free ()"><code class="function">poppler_index_iter_free()</code></a>.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>iter</code></em> :</span></p></td>
+<td>a <a class="link" href="PopplerDocument.html#PopplerIndexIter" title="PopplerIndexIter"><span class="type">PopplerIndexIter</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>a new <a class="link" href="PopplerDocument.html#PopplerIndexIter" title="PopplerIndexIter"><span class="type">PopplerIndexIter</span></a>
+</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="poppler-index-iter-free"></a><h3>poppler_index_iter_free ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span>                poppler_index_iter_free             (<em class="parameter"><code><a class="link" href="PopplerDocument.html#PopplerIndexIter" title="PopplerIndexIter"><span class="type">PopplerIndexIter</span></a> *iter</code></em>);</pre>
+<p>
+Frees <em class="parameter"><code>iter</code></em>.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody><tr>
+<td><p><span class="term"><em class="parameter"><code>iter</code></em> :</span></p></td>
+<td>a <a class="link" href="PopplerDocument.html#PopplerIndexIter" title="PopplerIndexIter"><span class="type">PopplerIndexIter</span></a>
+</td>
+</tr></tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="poppler-index-iter-get-child"></a><h3>poppler_index_iter_get_child ()</h3>
+<pre class="programlisting"><a class="link" href="PopplerDocument.html#PopplerIndexIter" title="PopplerIndexIter"><span class="returnvalue">PopplerIndexIter</span></a> *  poppler_index_iter_get_child        (<em class="parameter"><code><a class="link" href="PopplerDocument.html#PopplerIndexIter" title="PopplerIndexIter"><span class="type">PopplerIndexIter</span></a> *parent</code></em>);</pre>
+<p>
+Returns a newly created child of <em class="parameter"><code>parent</code></em>, or <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#NULL:CAPS"><code class="literal">NULL</code></a> if the iter has no child.
+See <a class="link" href="PopplerDocument.html#poppler-index-iter-new" title="poppler_index_iter_new ()"><code class="function">poppler_index_iter_new()</code></a> for more information on this function.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>parent</code></em> :</span></p></td>
+<td>a <a class="link" href="PopplerDocument.html#PopplerIndexIter" title="PopplerIndexIter"><span class="type">PopplerIndexIter</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>a new <a class="link" href="PopplerDocument.html#PopplerIndexIter" title="PopplerIndexIter"><span class="type">PopplerIndexIter</span></a>
+</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="poppler-index-iter-is-open"></a><h3>poppler_index_iter_is_open ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a>            poppler_index_iter_is_open          (<em class="parameter"><code><a class="link" href="PopplerDocument.html#PopplerIndexIter" title="PopplerIndexIter"><span class="type">PopplerIndexIter</span></a> *iter</code></em>);</pre>
+<p>
+Returns whether this node should be expanded by default to the user.  The
+document can provide a hint as to how the document's index should be expanded
+initially.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>iter</code></em> :</span></p></td>
+<td>a <a class="link" href="PopplerDocument.html#PopplerIndexIter" title="PopplerIndexIter"><span class="type">PopplerIndexIter</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#TRUE:CAPS"><code class="literal">TRUE</code></a>, if the document wants <em class="parameter"><code>iter</code></em> to be expanded</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="poppler-index-iter-get-action"></a><h3>poppler_index_iter_get_action ()</h3>
+<pre class="programlisting"><a class="link" href="poppler-PopplerAction.html#PopplerAction" title="union PopplerAction"><span class="returnvalue">PopplerAction</span></a> *     poppler_index_iter_get_action       (<em class="parameter"><code><a class="link" href="PopplerDocument.html#PopplerIndexIter" title="PopplerIndexIter"><span class="type">PopplerIndexIter</span></a> *iter</code></em>);</pre>
+<p>
+Returns the <a class="link" href="poppler-PopplerAction.html#PopplerAction" title="union PopplerAction"><span class="type">PopplerAction</span></a> associated with <em class="parameter"><code>iter</code></em>.  It must be freed with
+<a class="link" href="poppler-PopplerAction.html#poppler-action-free" title="poppler_action_free ()"><code class="function">poppler_action_free()</code></a>.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>iter</code></em> :</span></p></td>
+<td>a <a class="link" href="PopplerDocument.html#PopplerIndexIter" title="PopplerIndexIter"><span class="type">PopplerIndexIter</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>a new <a class="link" href="poppler-PopplerAction.html#PopplerAction" title="union PopplerAction"><span class="type">PopplerAction</span></a>
+</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="poppler-index-iter-next"></a><h3>poppler_index_iter_next ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a>            poppler_index_iter_next             (<em class="parameter"><code><a class="link" href="PopplerDocument.html#PopplerIndexIter" title="PopplerIndexIter"><span class="type">PopplerIndexIter</span></a> *iter</code></em>);</pre>
+<p>
+Sets <em class="parameter"><code>iter</code></em> to point to the next action at the current level, if valid.  See
+<a class="link" href="PopplerDocument.html#poppler-index-iter-new" title="poppler_index_iter_new ()"><code class="function">poppler_index_iter_new()</code></a> for more information.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>iter</code></em> :</span></p></td>
+<td>a <a class="link" href="PopplerDocument.html#PopplerIndexIter" title="PopplerIndexIter"><span class="type">PopplerIndexIter</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#TRUE:CAPS"><code class="literal">TRUE</code></a>, if <em class="parameter"><code>iter</code></em> was set to the next action</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="poppler-font-info-new"></a><h3>poppler_font_info_new ()</h3>
+<pre class="programlisting"><a class="link" href="PopplerDocument.html#PopplerFontInfo" title="PopplerFontInfo"><span class="returnvalue">PopplerFontInfo</span></a> *   poppler_font_info_new               (<em class="parameter"><code><a class="link" href="PopplerDocument.html" title="PopplerDocument"><span class="type">PopplerDocument</span></a> *document</code></em>);</pre>
+<p>
+Creates a new <a class="link" href="PopplerDocument.html#PopplerFontInfo" title="PopplerFontInfo"><span class="type">PopplerFontInfo</span></a> object
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>document</code></em> :</span></p></td>
+<td>a <a class="link" href="PopplerDocument.html" title="PopplerDocument"><span class="type">PopplerDocument</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>a new <a class="link" href="PopplerDocument.html#PopplerFontInfo" title="PopplerFontInfo"><span class="type">PopplerFontInfo</span></a> instance</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="poppler-font-info-scan"></a><h3>poppler_font_info_scan ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a>            poppler_font_info_scan              (<em class="parameter"><code><a class="link" href="PopplerDocument.html#PopplerFontInfo" title="PopplerFontInfo"><span class="type">PopplerFontInfo</span></a> *font_info</code></em>,
+                                                         <em class="parameter"><code><span class="type">int</span> n_pages</code></em>,
+                                                         <em class="parameter"><code><a class="link" href="PopplerDocument.html#PopplerFontsIter" title="PopplerFontsIter"><span class="type">PopplerFontsIter</span></a> **iter</code></em>);</pre>
+<p>
+Scans the document associated with <em class="parameter"><code>font_info</code></em> for fonts. At most
+<em class="parameter"><code>n_pages</code></em> will be scanned starting from the current iterator. <em class="parameter"><code>iter</code></em> will
+point to the first font scanned.
+</p>
+<p>
+Here is a simple example of code to scan fonts in a document
+</p>
+<p>
+</p>
+<div class="informalexample"><pre class="programlisting">
+font_info = poppler_font_info_new (document);
+while (poppler_font_info_scan (font_info, 20, &amp;fonts_iter)) {
+        if (!fonts_iter)
+                continue; /* No fonts found in these 20 pages */
+        do {
+                /* Do something with font iter */
+                g_print ("Font Name: %s\n", poppler_fonts_iter_get_name (fonts_iter));
+        } while (poppler_fonts_iter_next (fonts_iter));
+        poppler_fonts_iter_free (fonts_iter);
+}
+</pre></div>
+<p>
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>font_info</code></em> :</span></p></td>
+<td>a <a class="link" href="PopplerDocument.html#PopplerFontInfo" title="PopplerFontInfo"><span class="type">PopplerFontInfo</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>n_pages</code></em> :</span></p></td>
+<td>number of pages to scan</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>iter</code></em> :</span></p></td>
+<td>return location for a <a class="link" href="PopplerDocument.html#PopplerFontsIter" title="PopplerFontsIter"><span class="type">PopplerFontsIter</span></a>. <span class="annotation">[<acronym title="Parameter for returning results. Default is transfer full."><span class="acronym">out</span></acronym>]</span>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#TRUE:CAPS"><code class="literal">TRUE</code></a>, if there are more fonts left to scan</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="poppler-font-info-free"></a><h3>poppler_font_info_free ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span>                poppler_font_info_free              (<em class="parameter"><code><a class="link" href="PopplerDocument.html#PopplerFontInfo" title="PopplerFontInfo"><span class="type">PopplerFontInfo</span></a> *font_info</code></em>);</pre>
+</div>
+<hr>
+<div class="refsect2">
+<a name="poppler-fonts-iter-copy"></a><h3>poppler_fonts_iter_copy ()</h3>
+<pre class="programlisting"><a class="link" href="PopplerDocument.html#PopplerFontsIter" title="PopplerFontsIter"><span class="returnvalue">PopplerFontsIter</span></a> *  poppler_fonts_iter_copy             (<em class="parameter"><code><a class="link" href="PopplerDocument.html#PopplerFontsIter" title="PopplerFontsIter"><span class="type">PopplerFontsIter</span></a> *iter</code></em>);</pre>
+<p>
+Creates a copy of <em class="parameter"><code>iter</code></em>
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>iter</code></em> :</span></p></td>
+<td>a <a class="link" href="PopplerDocument.html#PopplerFontsIter" title="PopplerFontsIter"><span class="type">PopplerFontsIter</span></a> to copy</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>a new allocated copy of <em class="parameter"><code>iter</code></em>
+</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="poppler-fonts-iter-free"></a><h3>poppler_fonts_iter_free ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span>                poppler_fonts_iter_free             (<em class="parameter"><code><a class="link" href="PopplerDocument.html#PopplerFontsIter" title="PopplerFontsIter"><span class="type">PopplerFontsIter</span></a> *iter</code></em>);</pre>
+<p>
+Frees the given <a class="link" href="PopplerDocument.html#PopplerFontsIter" title="PopplerFontsIter"><span class="type">PopplerFontsIter</span></a>
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody><tr>
+<td><p><span class="term"><em class="parameter"><code>iter</code></em> :</span></p></td>
+<td>a <a class="link" href="PopplerDocument.html#PopplerFontsIter" title="PopplerFontsIter"><span class="type">PopplerFontsIter</span></a>
+</td>
+</tr></tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="poppler-fonts-iter-get-name"></a><h3>poppler_fonts_iter_get_name ()</h3>
+<pre class="programlisting">const <span class="returnvalue">char</span> *        poppler_fonts_iter_get_name         (<em class="parameter"><code><a class="link" href="PopplerDocument.html#PopplerFontsIter" title="PopplerFontsIter"><span class="type">PopplerFontsIter</span></a> *iter</code></em>);</pre>
+<p>
+Returns the name of the font associated with <em class="parameter"><code>iter</code></em>
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>iter</code></em> :</span></p></td>
+<td>a <a class="link" href="PopplerDocument.html#PopplerFontsIter" title="PopplerFontsIter"><span class="type">PopplerFontsIter</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>the font name</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="poppler-fonts-iter-get-full-name"></a><h3>poppler_fonts_iter_get_full_name ()</h3>
+<pre class="programlisting">const <span class="returnvalue">char</span> *        poppler_fonts_iter_get_full_name    (<em class="parameter"><code><a class="link" href="PopplerDocument.html#PopplerFontsIter" title="PopplerFontsIter"><span class="type">PopplerFontsIter</span></a> *iter</code></em>);</pre>
+<p>
+Returns the full name of the font associated with <em class="parameter"><code>iter</code></em>
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>iter</code></em> :</span></p></td>
+<td>a <a class="link" href="PopplerDocument.html#PopplerFontsIter" title="PopplerFontsIter"><span class="type">PopplerFontsIter</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>the font full name</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="poppler-fonts-iter-get-font-type"></a><h3>poppler_fonts_iter_get_font_type ()</h3>
+<pre class="programlisting"><a class="link" href="PopplerDocument.html#PopplerFontType" title="enum PopplerFontType"><span class="returnvalue">PopplerFontType</span></a>     poppler_fonts_iter_get_font_type    (<em class="parameter"><code><a class="link" href="PopplerDocument.html#PopplerFontsIter" title="PopplerFontsIter"><span class="type">PopplerFontsIter</span></a> *iter</code></em>);</pre>
+<p>
+Returns the type of the font associated with <em class="parameter"><code>iter</code></em>
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>iter</code></em> :</span></p></td>
+<td>a <a class="link" href="PopplerDocument.html#PopplerFontsIter" title="PopplerFontsIter"><span class="type">PopplerFontsIter</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>the font type</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="poppler-fonts-iter-get-substitute-name"></a><h3>poppler_fonts_iter_get_substitute_name ()</h3>
+<pre class="programlisting">const <span class="returnvalue">char</span> *        poppler_fonts_iter_get_substitute_name
+                                                        (<em class="parameter"><code><a class="link" href="PopplerDocument.html#PopplerFontsIter" title="PopplerFontsIter"><span class="type">PopplerFontsIter</span></a> *iter</code></em>);</pre>
+<p>
+The name of the substitute font of the font associated with <em class="parameter"><code>iter</code></em> or <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#NULL:CAPS"><code class="literal">NULL</code></a> if
+the font is embedded
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>iter</code></em> :</span></p></td>
+<td>a <a class="link" href="PopplerDocument.html#PopplerFontsIter" title="PopplerFontsIter"><span class="type">PopplerFontsIter</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>the name of the substitute font or <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#NULL:CAPS"><code class="literal">NULL</code></a> if font is embedded</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.20</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="poppler-fonts-iter-get-file-name"></a><h3>poppler_fonts_iter_get_file_name ()</h3>
+<pre class="programlisting">const <span class="returnvalue">char</span> *        poppler_fonts_iter_get_file_name    (<em class="parameter"><code><a class="link" href="PopplerDocument.html#PopplerFontsIter" title="PopplerFontsIter"><span class="type">PopplerFontsIter</span></a> *iter</code></em>);</pre>
+<p>
+The filename of the font associated with <em class="parameter"><code>iter</code></em> or <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#NULL:CAPS"><code class="literal">NULL</code></a> if
+the font is embedded
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>iter</code></em> :</span></p></td>
+<td>a <a class="link" href="PopplerDocument.html#PopplerFontsIter" title="PopplerFontsIter"><span class="type">PopplerFontsIter</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>the filename of the font or <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#NULL:CAPS"><code class="literal">NULL</code></a> if font is embedded</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="poppler-fonts-iter-get-encoding"></a><h3>poppler_fonts_iter_get_encoding ()</h3>
+<pre class="programlisting">const <span class="returnvalue">char</span> *        poppler_fonts_iter_get_encoding     (<em class="parameter"><code><a class="link" href="PopplerDocument.html#PopplerFontsIter" title="PopplerFontsIter"><span class="type">PopplerFontsIter</span></a> *iter</code></em>);</pre>
+<p>
+Returns the encoding of the font associated with <em class="parameter"><code>iter</code></em>
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>iter</code></em> :</span></p></td>
+<td>a <a class="link" href="PopplerDocument.html#PopplerFontsIter" title="PopplerFontsIter"><span class="type">PopplerFontsIter</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>the font encoding</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.20</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="poppler-fonts-iter-is-embedded"></a><h3>poppler_fonts_iter_is_embedded ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a>            poppler_fonts_iter_is_embedded      (<em class="parameter"><code><a class="link" href="PopplerDocument.html#PopplerFontsIter" title="PopplerFontsIter"><span class="type">PopplerFontsIter</span></a> *iter</code></em>);</pre>
+<p>
+Returns whether the font associated with <em class="parameter"><code>iter</code></em> is embedded in the document
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>iter</code></em> :</span></p></td>
+<td>a <a class="link" href="PopplerDocument.html#PopplerFontsIter" title="PopplerFontsIter"><span class="type">PopplerFontsIter</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#TRUE:CAPS"><code class="literal">TRUE</code></a> if font is emebdded, <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#FALSE:CAPS"><code class="literal">FALSE</code></a> otherwise</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="poppler-fonts-iter-is-subset"></a><h3>poppler_fonts_iter_is_subset ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a>            poppler_fonts_iter_is_subset        (<em class="parameter"><code><a class="link" href="PopplerDocument.html#PopplerFontsIter" title="PopplerFontsIter"><span class="type">PopplerFontsIter</span></a> *iter</code></em>);</pre>
+<p>
+Returns whether the font associated with <em class="parameter"><code>iter</code></em> is a subset of another font
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>iter</code></em> :</span></p></td>
+<td>a <a class="link" href="PopplerDocument.html#PopplerFontsIter" title="PopplerFontsIter"><span class="type">PopplerFontsIter</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#TRUE:CAPS"><code class="literal">TRUE</code></a> if font is a subset, <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#FALSE:CAPS"><code class="literal">FALSE</code></a> otherwise</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="poppler-fonts-iter-next"></a><h3>poppler_fonts_iter_next ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a>            poppler_fonts_iter_next             (<em class="parameter"><code><a class="link" href="PopplerDocument.html#PopplerFontsIter" title="PopplerFontsIter"><span class="type">PopplerFontsIter</span></a> *iter</code></em>);</pre>
+<p>
+Sets <em class="parameter"><code>iter</code></em> to point to the next font
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>iter</code></em> :</span></p></td>
+<td>a <a class="link" href="PopplerDocument.html#PopplerFontsIter" title="PopplerFontsIter"><span class="type">PopplerFontsIter</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#TRUE:CAPS"><code class="literal">TRUE</code></a>, if <em class="parameter"><code>iter</code></em> was set to the next font</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="poppler-layers-iter-new"></a><h3>poppler_layers_iter_new ()</h3>
+<pre class="programlisting"><a class="link" href="PopplerDocument.html#PopplerLayersIter" title="PopplerLayersIter"><span class="returnvalue">PopplerLayersIter</span></a> * poppler_layers_iter_new             (<em class="parameter"><code><a class="link" href="PopplerDocument.html" title="PopplerDocument"><span class="type">PopplerDocument</span></a> *document</code></em>);</pre>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody><tr>
+<td><p><span class="term"><em class="parameter"><code>document</code></em> :</span></p></td>
+<td>a <a class="link" href="PopplerDocument.html" title="PopplerDocument"><span class="type">PopplerDocument</span></a>
+</td>
+</tr></tbody>
+</table></div>
+<p class="since">Since 0.12</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="poppler-layers-iter-copy"></a><h3>poppler_layers_iter_copy ()</h3>
+<pre class="programlisting"><a class="link" href="PopplerDocument.html#PopplerLayersIter" title="PopplerLayersIter"><span class="returnvalue">PopplerLayersIter</span></a> * poppler_layers_iter_copy            (<em class="parameter"><code><a class="link" href="PopplerDocument.html#PopplerLayersIter" title="PopplerLayersIter"><span class="type">PopplerLayersIter</span></a> *iter</code></em>);</pre>
+<p>
+Creates a new <a class="link" href="PopplerDocument.html#PopplerLayersIter" title="PopplerLayersIter"><span class="type">PopplerLayersIter</span></a> as a copy of <em class="parameter"><code>iter</code></em>.  This must be freed with
+<a class="link" href="PopplerDocument.html#poppler-layers-iter-free" title="poppler_layers_iter_free ()"><code class="function">poppler_layers_iter_free()</code></a>.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>iter</code></em> :</span></p></td>
+<td>a <a class="link" href="PopplerDocument.html#PopplerLayersIter" title="PopplerLayersIter"><span class="type">PopplerLayersIter</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>a new <a class="link" href="PopplerDocument.html#PopplerLayersIter" title="PopplerLayersIter"><span class="type">PopplerLayersIter</span></a>
+Since 0.12</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="poppler-layers-iter-free"></a><h3>poppler_layers_iter_free ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span>                poppler_layers_iter_free            (<em class="parameter"><code><a class="link" href="PopplerDocument.html#PopplerLayersIter" title="PopplerLayersIter"><span class="type">PopplerLayersIter</span></a> *iter</code></em>);</pre>
+<p>
+Frees <em class="parameter"><code>iter</code></em>.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody><tr>
+<td><p><span class="term"><em class="parameter"><code>iter</code></em> :</span></p></td>
+<td>a <a class="link" href="PopplerDocument.html#PopplerLayersIter" title="PopplerLayersIter"><span class="type">PopplerLayersIter</span></a>
+</td>
+</tr></tbody>
+</table></div>
+<p class="since">Since 0.12</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="poppler-layers-iter-get-child"></a><h3>poppler_layers_iter_get_child ()</h3>
+<pre class="programlisting"><a class="link" href="PopplerDocument.html#PopplerLayersIter" title="PopplerLayersIter"><span class="returnvalue">PopplerLayersIter</span></a> * poppler_layers_iter_get_child       (<em class="parameter"><code><a class="link" href="PopplerDocument.html#PopplerLayersIter" title="PopplerLayersIter"><span class="type">PopplerLayersIter</span></a> *parent</code></em>);</pre>
+<p>
+Returns a newly created child of <em class="parameter"><code>parent</code></em>, or <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#NULL:CAPS"><code class="literal">NULL</code></a> if the iter has no child.
+See <a class="link" href="PopplerDocument.html#poppler-layers-iter-new" title="poppler_layers_iter_new ()"><code class="function">poppler_layers_iter_new()</code></a> for more information on this function.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>parent</code></em> :</span></p></td>
+<td>a <a class="link" href="PopplerDocument.html#PopplerLayersIter" title="PopplerLayersIter"><span class="type">PopplerLayersIter</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>a new <a class="link" href="PopplerDocument.html#PopplerLayersIter" title="PopplerLayersIter"><span class="type">PopplerLayersIter</span></a>, or <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#NULL:CAPS"><code class="literal">NULL</code></a>
+</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.12</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="poppler-layers-iter-get-layer"></a><h3>poppler_layers_iter_get_layer ()</h3>
+<pre class="programlisting"><a class="link" href="PopplerLayer.html" title="PopplerLayer"><span class="returnvalue">PopplerLayer</span></a> *      poppler_layers_iter_get_layer       (<em class="parameter"><code><a class="link" href="PopplerDocument.html#PopplerLayersIter" title="PopplerLayersIter"><span class="type">PopplerLayersIter</span></a> *iter</code></em>);</pre>
+<p>
+Returns the <a class="link" href="PopplerLayer.html" title="PopplerLayer"><span class="type">PopplerLayer</span></a> associated with <em class="parameter"><code>iter</code></em>.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>iter</code></em> :</span></p></td>
+<td>a <a class="link" href="PopplerDocument.html#PopplerLayersIter" title="PopplerLayersIter"><span class="type">PopplerLayersIter</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>a new <a class="link" href="PopplerLayer.html" title="PopplerLayer"><span class="type">PopplerLayer</span></a>, or <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#NULL:CAPS"><code class="literal">NULL</code></a> if
+there isn't any layer associated with <em class="parameter"><code>iter</code></em>. <span class="annotation">[<acronym title="Free data after the code is done."><span class="acronym">transfer full</span></acronym>]</span>
+</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.12</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="poppler-layers-iter-get-title"></a><h3>poppler_layers_iter_get_title ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="returnvalue">gchar</span></a> *             poppler_layers_iter_get_title       (<em class="parameter"><code><a class="link" href="PopplerDocument.html#PopplerLayersIter" title="PopplerLayersIter"><span class="type">PopplerLayersIter</span></a> *iter</code></em>);</pre>
+<p>
+Returns the title associated with <em class="parameter"><code>iter</code></em>.  It must be freed with
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Memory-Allocation.html#g-free"><code class="function">g_free()</code></a>.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>iter</code></em> :</span></p></td>
+<td>a <a class="link" href="PopplerDocument.html#PopplerLayersIter" title="PopplerLayersIter"><span class="type">PopplerLayersIter</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>a new string containing the <em class="parameter"><code>iter</code></em>'s title or <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#NULL:CAPS"><code class="literal">NULL</code></a> if <em class="parameter"><code>iter</code></em> doesn't have a title.
+The returned string should be freed with <a href="http://library.gnome.org/devel/glib/unstable/glib-Memory-Allocation.html#g-free"><code class="function">g_free()</code></a> when no longer needed.</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.12</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="poppler-layers-iter-next"></a><h3>poppler_layers_iter_next ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a>            poppler_layers_iter_next            (<em class="parameter"><code><a class="link" href="PopplerDocument.html#PopplerLayersIter" title="PopplerLayersIter"><span class="type">PopplerLayersIter</span></a> *iter</code></em>);</pre>
+<p>
+Sets <em class="parameter"><code>iter</code></em> to point to the next action at the current level, if valid.  See
+<a class="link" href="PopplerDocument.html#poppler-layers-iter-new" title="poppler_layers_iter_new ()"><code class="function">poppler_layers_iter_new()</code></a> for more information.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>iter</code></em> :</span></p></td>
+<td>a <a class="link" href="PopplerDocument.html#PopplerLayersIter" title="PopplerLayersIter"><span class="type">PopplerLayersIter</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#TRUE:CAPS"><code class="literal">TRUE</code></a>, if <em class="parameter"><code>iter</code></em> was set to the next action</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.12</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="poppler-ps-file-new"></a><h3>poppler_ps_file_new ()</h3>
+<pre class="programlisting"><a class="link" href="PopplerDocument.html#PopplerPSFile" title="PopplerPSFile"><span class="returnvalue">PopplerPSFile</span></a> *     poppler_ps_file_new                 (<em class="parameter"><code><a class="link" href="PopplerDocument.html" title="PopplerDocument"><span class="type">PopplerDocument</span></a> *document</code></em>,
+                                                         <em class="parameter"><code>const <span class="type">char</span> *filename</code></em>,
+                                                         <em class="parameter"><code><span class="type">int</span> first_page</code></em>,
+                                                         <em class="parameter"><code><span class="type">int</span> n_pages</code></em>);</pre>
+<p>
+Create a new postscript file to render to
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>document</code></em> :</span></p></td>
+<td>a <a class="link" href="PopplerDocument.html" title="PopplerDocument"><span class="type">PopplerDocument</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>filename</code></em> :</span></p></td>
+<td>the path of the output filename</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>first_page</code></em> :</span></p></td>
+<td>the first page to print</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>n_pages</code></em> :</span></p></td>
+<td>the number of pages to print</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>a PopplerPSFile</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="poppler-ps-file-free"></a><h3>poppler_ps_file_free ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span>                poppler_ps_file_free                (<em class="parameter"><code><a class="link" href="PopplerDocument.html#PopplerPSFile" title="PopplerPSFile"><span class="type">PopplerPSFile</span></a> *ps_file</code></em>);</pre>
+<p>
+Frees <em class="parameter"><code>ps_file</code></em>
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody><tr>
+<td><p><span class="term"><em class="parameter"><code>ps_file</code></em> :</span></p></td>
+<td>a PopplerPSFile</td>
+</tr></tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="poppler-ps-file-set-paper-size"></a><h3>poppler_ps_file_set_paper_size ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span>                poppler_ps_file_set_paper_size      (<em class="parameter"><code><a class="link" href="PopplerDocument.html#PopplerPSFile" title="PopplerPSFile"><span class="type">PopplerPSFile</span></a> *ps_file</code></em>,
+                                                         <em class="parameter"><code><span class="type">double</span> width</code></em>,
+                                                         <em class="parameter"><code><span class="type">double</span> height</code></em>);</pre>
+<p>
+Set the output paper size. These values will end up in the
+DocumentMedia, the BoundingBox DSC comments and other places in the
+generated PostScript.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>ps_file</code></em> :</span></p></td>
+<td>a PopplerPSFile which was not yet printed to.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>width</code></em> :</span></p></td>
+<td>the paper width in 1/72 inch</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>height</code></em> :</span></p></td>
+<td>the paper height in 1/72 inch</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="poppler-ps-file-set-duplex"></a><h3>poppler_ps_file_set_duplex ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span>                poppler_ps_file_set_duplex          (<em class="parameter"><code><a class="link" href="PopplerDocument.html#PopplerPSFile" title="PopplerPSFile"><span class="type">PopplerPSFile</span></a> *ps_file</code></em>,
+                                                         <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a> duplex</code></em>);</pre>
+<p>
+Enable or disable Duplex printing.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>ps_file</code></em> :</span></p></td>
+<td>a PopplerPSFile which was not yet printed to</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>duplex</code></em> :</span></p></td>
+<td>whether to force duplex printing (on printers which support this)</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+</div>
+<div class="refsect1">
+<a name="PopplerDocument.property-details"></a><h2>Property Details</h2>
+<div class="refsect2">
+<a name="PopplerDocument--author"></a><h3>The <code class="literal">"author"</code> property</h3>
+<pre class="programlisting">  "author"                   <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a>*                : Read</pre>
+<p>
+The author of the document
+</p>
+<p>Default value: NULL</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="PopplerDocument--creation-date"></a><h3>The <code class="literal">"creation-date"</code> property</h3>
+<pre class="programlisting">  "creation-date"            <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="type">gint</span></a>                  : Read</pre>
+<p>
+The date the document was created as seconds since the Epoch, or -1
+</p>
+<p>Allowed values: &gt;= G_MAXULONG</p>
+<p>Default value: -1</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="PopplerDocument--creator"></a><h3>The <code class="literal">"creator"</code> property</h3>
+<pre class="programlisting">  "creator"                  <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a>*                : Read</pre>
+<p>
+The creator of the document. See also <a class="link" href="PopplerDocument.html#poppler-document-get-creator" title="poppler_document_get_creator ()"><code class="function">poppler_document_get_creator()</code></a>
+</p>
+<p>Default value: NULL</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="PopplerDocument--format"></a><h3>The <code class="literal">"format"</code> property</h3>
+<pre class="programlisting">  "format"                   <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a>*                : Read</pre>
+<p>
+The PDF version as string. See also <a class="link" href="PopplerDocument.html#poppler-document-get-pdf-version-string" title="poppler_document_get_pdf_version_string ()"><code class="function">poppler_document_get_pdf_version_string()</code></a>
+</p>
+<p>Default value: NULL</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="PopplerDocument--format-major"></a><h3>The <code class="literal">"format-major"</code> property</h3>
+<pre class="programlisting">  "format-major"             <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a>                 : Read</pre>
+<p>
+The PDF major version number. See also <a class="link" href="PopplerDocument.html#poppler-document-get-pdf-version" title="poppler_document_get_pdf_version ()"><code class="function">poppler_document_get_pdf_version()</code></a>
+</p>
+<p>Default value: 1</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="PopplerDocument--format-minor"></a><h3>The <code class="literal">"format-minor"</code> property</h3>
+<pre class="programlisting">  "format-minor"             <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a>                 : Read</pre>
+<p>
+The PDF minor version number. See also <a class="link" href="PopplerDocument.html#poppler-document-get-pdf-version" title="poppler_document_get_pdf_version ()"><code class="function">poppler_document_get_pdf_version()</code></a>
+</p>
+<p>Default value: 0</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="PopplerDocument--keywords"></a><h3>The <code class="literal">"keywords"</code> property</h3>
+<pre class="programlisting">  "keywords"                 <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a>*                : Read</pre>
+<p>
+The keywords associated to the document
+</p>
+<p>Default value: NULL</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="PopplerDocument--linearized"></a><h3>The <code class="literal">"linearized"</code> property</h3>
+<pre class="programlisting">  "linearized"               <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a>              : Read</pre>
+<p>
+Whether document is linearized. See also <a class="link" href="PopplerDocument.html#poppler-document-is-linearized" title="poppler_document_is_linearized ()"><code class="function">poppler_document_is_linearized()</code></a>
+</p>
+<p>Default value: FALSE</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="PopplerDocument--metadata"></a><h3>The <code class="literal">"metadata"</code> property</h3>
+<pre class="programlisting">  "metadata"                 <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a>*                : Read</pre>
+<p>
+Document metadata in XML format, or <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#NULL:CAPS"><code class="literal">NULL</code></a>
+</p>
+<p>Default value: NULL</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="PopplerDocument--mod-date"></a><h3>The <code class="literal">"mod-date"</code> property</h3>
+<pre class="programlisting">  "mod-date"                 <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="type">gint</span></a>                  : Read</pre>
+<p>
+The date the document was most recently modified as seconds since the Epoch, or -1
+</p>
+<p>Allowed values: &gt;= G_MAXULONG</p>
+<p>Default value: -1</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="PopplerDocument--page-layout"></a><h3>The <code class="literal">"page-layout"</code> property</h3>
+<pre class="programlisting">  "page-layout"              <a class="link" href="PopplerDocument.html#PopplerPageLayout" title="enum PopplerPageLayout"><span class="type">PopplerPageLayout</span></a>     : Read</pre>
+<p>
+The page layout that should be used when the document is opened
+</p>
+<p>Default value: POPPLER_PAGE_LAYOUT_UNSET</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="PopplerDocument--page-mode"></a><h3>The <code class="literal">"page-mode"</code> property</h3>
+<pre class="programlisting">  "page-mode"                <a class="link" href="PopplerDocument.html#PopplerPageMode" title="enum PopplerPageMode"><span class="type">PopplerPageMode</span></a>       : Read</pre>
+<p>
+The mode that should be used when the document is opened
+</p>
+<p>Default value: POPPLER_PAGE_MODE_UNSET</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="PopplerDocument--permissions"></a><h3>The <code class="literal">"permissions"</code> property</h3>
+<pre class="programlisting">  "permissions"              <a class="link" href="PopplerDocument.html#PopplerPermissions" title="enum PopplerPermissions"><span class="type">PopplerPermissions</span></a>    : Read</pre>
+<p>
+Flags specifying which operations are permitted when the document is opened
+</p>
+<p>Default value: POPPLER_PERMISSIONS_OK_TO_PRINT|POPPLER_PERMISSIONS_OK_TO_MODIFY|POPPLER_PERMISSIONS_OK_TO_COPY|POPPLER_PERMISSIONS_OK_TO_ADD_NOTES|POPPLER_PERMISSIONS_OK_TO_FILL_FORM|POPPLER_PERMISSIONS_OK_TO_EXTRACT_CONTENTS|POPPLER_PERMISSIONS_OK_TO_ASSEMBLE|POPPLER_PERMISSIONS_OK_TO_PRINT_HIGH_RESOLUTION</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="PopplerDocument--producer"></a><h3>The <code class="literal">"producer"</code> property</h3>
+<pre class="programlisting">  "producer"                 <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a>*                : Read</pre>
+<p>
+The producer of the document. See also <a class="link" href="PopplerDocument.html#poppler-document-get-producer" title="poppler_document_get_producer ()"><code class="function">poppler_document_get_producer()</code></a>
+</p>
+<p>Default value: NULL</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="PopplerDocument--subject"></a><h3>The <code class="literal">"subject"</code> property</h3>
+<pre class="programlisting">  "subject"                  <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a>*                : Read</pre>
+<p>
+The subject of the document
+</p>
+<p>Default value: NULL</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="PopplerDocument--title"></a><h3>The <code class="literal">"title"</code> property</h3>
+<pre class="programlisting">  "title"                    <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a>*                : Read</pre>
+<p>
+The document's title or <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#NULL:CAPS"><code class="literal">NULL</code></a>
+</p>
+<p>Default value: NULL</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="PopplerDocument--viewer-preferences"></a><h3>The <code class="literal">"viewer-preferences"</code> property</h3>
+<pre class="programlisting">  "viewer-preferences"       <a class="link" href="PopplerDocument.html#PopplerViewerPreferences" title="enum PopplerViewerPreferences"><span class="type">PopplerViewerPreferences</span></a>  : Read</pre>
+<p>Viewer Preferences.</p>
+</div>
+</div>
+</div>
+<div class="footer">
+<hr>
+          Generated by GTK-Doc V1.18</div>
+</body>
+</html>
\ No newline at end of file
diff --git a/glib/reference/html/PopplerFormField.html b/glib/reference/html/PopplerFormField.html
new file mode 100644 (file)
index 0000000..8d0b0c8
--- /dev/null
@@ -0,0 +1,896 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>PoppplerFormField</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.76.1">
+<link rel="home" href="index.html" title="Poppler Reference Manual">
+<link rel="up" href="ch01.html" title="Poppler">
+<link rel="prev" href="PopplerAttachment.html" title="PopplerAttachment">
+<link rel="next" href="PopplerAnnot.html" title="PopplerAnnot">
+<meta name="generator" content="GTK-Doc V1.18 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="2">
+<tr valign="middle">
+<td><a accesskey="p" href="PopplerAttachment.html"><img src="left.png" width="24" height="24" border="0" alt="Prev"></a></td>
+<td><a accesskey="u" href="ch01.html"><img src="up.png" width="24" height="24" border="0" alt="Up"></a></td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="24" height="24" border="0" alt="Home"></a></td>
+<th width="100%" align="center">Poppler Reference Manual</th>
+<td><a accesskey="n" href="PopplerAnnot.html"><img src="right.png" width="24" height="24" border="0" alt="Next"></a></td>
+</tr>
+<tr><td colspan="5" class="shortcuts">
+<a href="#PopplerFormField.synopsis" class="shortcut">Top</a>
+                   | 
+                  <a href="#PopplerFormField.description" class="shortcut">Description</a>
+                   | 
+                  <a href="#PopplerFormField.object-hierarchy" class="shortcut">Object Hierarchy</a>
+</td></tr>
+</table>
+<div class="refentry">
+<a name="PopplerFormField"></a><div class="titlepage"></div>
+<div class="refnamediv"><table width="100%"><tr>
+<td valign="top">
+<h2><span class="refentrytitle"><a name="PopplerFormField.top_of_page"></a>PoppplerFormField</span></h2>
+<p>PoppplerFormField — Form Field</p>
+</td>
+<td valign="top" align="right"></td>
+</tr></table></div>
+<div class="refsynopsisdiv">
+<a name="PopplerFormField.synopsis"></a><h2>Synopsis</h2>
+<pre class="synopsis">
+#include &lt;poppler.h&gt;
+
+                    <a class="link" href="PopplerFormField.html#PopplerFormField-struct" title="PopplerFormField">PopplerFormField</a>;
+enum                <a class="link" href="PopplerFormField.html#PopplerFormFieldType" title="enum PopplerFormFieldType">PopplerFormFieldType</a>;
+enum                <a class="link" href="PopplerFormField.html#PopplerFormButtonType" title="enum PopplerFormButtonType">PopplerFormButtonType</a>;
+enum                <a class="link" href="PopplerFormField.html#PopplerFormChoiceType" title="enum PopplerFormChoiceType">PopplerFormChoiceType</a>;
+enum                <a class="link" href="PopplerFormField.html#PopplerFormTextType" title="enum PopplerFormTextType">PopplerFormTextType</a>;
+<a class="link" href="PopplerFormField.html#PopplerFormFieldType" title="enum PopplerFormFieldType"><span class="returnvalue">PopplerFormFieldType</span></a> <a class="link" href="PopplerFormField.html#poppler-form-field-get-field-type" title="poppler_form_field_get_field_type ()">poppler_form_field_get_field_type</a>  (<em class="parameter"><code><a class="link" href="PopplerFormField.html" title="PoppplerFormField"><span class="type">PopplerFormField</span></a> *field</code></em>);
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="returnvalue">gint</span></a>                <a class="link" href="PopplerFormField.html#poppler-form-field-get-id" title="poppler_form_field_get_id ()">poppler_form_field_get_id</a>           (<em class="parameter"><code><a class="link" href="PopplerFormField.html" title="PoppplerFormField"><span class="type">PopplerFormField</span></a> *field</code></em>);
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a>            <a class="link" href="PopplerFormField.html#poppler-form-field-is-read-only" title="poppler_form_field_is_read_only ()">poppler_form_field_is_read_only</a>     (<em class="parameter"><code><a class="link" href="PopplerFormField.html" title="PoppplerFormField"><span class="type">PopplerFormField</span></a> *field</code></em>);
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gdouble"><span class="returnvalue">gdouble</span></a>             <a class="link" href="PopplerFormField.html#poppler-form-field-get-font-size" title="poppler_form_field_get_font_size ()">poppler_form_field_get_font_size</a>    (<em class="parameter"><code><a class="link" href="PopplerFormField.html" title="PoppplerFormField"><span class="type">PopplerFormField</span></a> *field</code></em>);
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="returnvalue">gchar</span></a> *             <a class="link" href="PopplerFormField.html#poppler-form-field-get-partial-name" title="poppler_form_field_get_partial_name ()">poppler_form_field_get_partial_name</a> (<em class="parameter"><code><a class="link" href="PopplerFormField.html" title="PoppplerFormField"><span class="type">PopplerFormField</span></a> *field</code></em>);
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="returnvalue">gchar</span></a> *             <a class="link" href="PopplerFormField.html#poppler-form-field-get-mapping-name" title="poppler_form_field_get_mapping_name ()">poppler_form_field_get_mapping_name</a> (<em class="parameter"><code><a class="link" href="PopplerFormField.html" title="PoppplerFormField"><span class="type">PopplerFormField</span></a> *field</code></em>);
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="returnvalue">gchar</span></a> *             <a class="link" href="PopplerFormField.html#poppler-form-field-get-name" title="poppler_form_field_get_name ()">poppler_form_field_get_name</a>         (<em class="parameter"><code><a class="link" href="PopplerFormField.html" title="PoppplerFormField"><span class="type">PopplerFormField</span></a> *field</code></em>);
+<a class="link" href="poppler-PopplerAction.html#PopplerAction" title="union PopplerAction"><span class="returnvalue">PopplerAction</span></a> *     <a class="link" href="PopplerFormField.html#poppler-form-field-get-action" title="poppler_form_field_get_action ()">poppler_form_field_get_action</a>       (<em class="parameter"><code><a class="link" href="PopplerFormField.html" title="PoppplerFormField"><span class="type">PopplerFormField</span></a> *field</code></em>);
+<a class="link" href="PopplerFormField.html#PopplerFormButtonType" title="enum PopplerFormButtonType"><span class="returnvalue">PopplerFormButtonType</span></a> <a class="link" href="PopplerFormField.html#poppler-form-field-button-get-button-type" title="poppler_form_field_button_get_button_type ()">poppler_form_field_button_get_button_type</a>
+                                                        (<em class="parameter"><code><a class="link" href="PopplerFormField.html" title="PoppplerFormField"><span class="type">PopplerFormField</span></a> *field</code></em>);
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a>            <a class="link" href="PopplerFormField.html#poppler-form-field-button-get-state" title="poppler_form_field_button_get_state ()">poppler_form_field_button_get_state</a> (<em class="parameter"><code><a class="link" href="PopplerFormField.html" title="PoppplerFormField"><span class="type">PopplerFormField</span></a> *field</code></em>);
+<span class="returnvalue">void</span>                <a class="link" href="PopplerFormField.html#poppler-form-field-button-set-state" title="poppler_form_field_button_set_state ()">poppler_form_field_button_set_state</a> (<em class="parameter"><code><a class="link" href="PopplerFormField.html" title="PoppplerFormField"><span class="type">PopplerFormField</span></a> *field</code></em>,
+                                                         <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a> state</code></em>);
+<a class="link" href="PopplerFormField.html#PopplerFormChoiceType" title="enum PopplerFormChoiceType"><span class="returnvalue">PopplerFormChoiceType</span></a> <a class="link" href="PopplerFormField.html#poppler-form-field-choice-get-choice-type" title="poppler_form_field_choice_get_choice_type ()">poppler_form_field_choice_get_choice_type</a>
+                                                        (<em class="parameter"><code><a class="link" href="PopplerFormField.html" title="PoppplerFormField"><span class="type">PopplerFormField</span></a> *field</code></em>);
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a>            <a class="link" href="PopplerFormField.html#poppler-form-field-choice-can-select-multiple" title="poppler_form_field_choice_can_select_multiple ()">poppler_form_field_choice_can_select_multiple</a>
+                                                        (<em class="parameter"><code><a class="link" href="PopplerFormField.html" title="PoppplerFormField"><span class="type">PopplerFormField</span></a> *field</code></em>);
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a>            <a class="link" href="PopplerFormField.html#poppler-form-field-choice-commit-on-change" title="poppler_form_field_choice_commit_on_change ()">poppler_form_field_choice_commit_on_change</a>
+                                                        (<em class="parameter"><code><a class="link" href="PopplerFormField.html" title="PoppplerFormField"><span class="type">PopplerFormField</span></a> *field</code></em>);
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a>            <a class="link" href="PopplerFormField.html#poppler-form-field-choice-do-spell-check" title="poppler_form_field_choice_do_spell_check ()">poppler_form_field_choice_do_spell_check</a>
+                                                        (<em class="parameter"><code><a class="link" href="PopplerFormField.html" title="PoppplerFormField"><span class="type">PopplerFormField</span></a> *field</code></em>);
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="returnvalue">gchar</span></a> *             <a class="link" href="PopplerFormField.html#poppler-form-field-choice-get-item" title="poppler_form_field_choice_get_item ()">poppler_form_field_choice_get_item</a>  (<em class="parameter"><code><a class="link" href="PopplerFormField.html" title="PoppplerFormField"><span class="type">PopplerFormField</span></a> *field</code></em>,
+                                                         <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="type">gint</span></a> index</code></em>);
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="returnvalue">gint</span></a>                <a class="link" href="PopplerFormField.html#poppler-form-field-choice-get-n-items" title="poppler_form_field_choice_get_n_items ()">poppler_form_field_choice_get_n_items</a>
+                                                        (<em class="parameter"><code><a class="link" href="PopplerFormField.html" title="PoppplerFormField"><span class="type">PopplerFormField</span></a> *field</code></em>);
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="returnvalue">gchar</span></a> *             <a class="link" href="PopplerFormField.html#poppler-form-field-choice-get-text" title="poppler_form_field_choice_get_text ()">poppler_form_field_choice_get_text</a>  (<em class="parameter"><code><a class="link" href="PopplerFormField.html" title="PoppplerFormField"><span class="type">PopplerFormField</span></a> *field</code></em>);
+<span class="returnvalue">void</span>                <a class="link" href="PopplerFormField.html#poppler-form-field-choice-set-text" title="poppler_form_field_choice_set_text ()">poppler_form_field_choice_set_text</a>  (<em class="parameter"><code><a class="link" href="PopplerFormField.html" title="PoppplerFormField"><span class="type">PopplerFormField</span></a> *field</code></em>,
+                                                         <em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *text</code></em>);
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a>            <a class="link" href="PopplerFormField.html#poppler-form-field-choice-is-editable" title="poppler_form_field_choice_is_editable ()">poppler_form_field_choice_is_editable</a>
+                                                        (<em class="parameter"><code><a class="link" href="PopplerFormField.html" title="PoppplerFormField"><span class="type">PopplerFormField</span></a> *field</code></em>);
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a>            <a class="link" href="PopplerFormField.html#poppler-form-field-choice-is-item-selected" title="poppler_form_field_choice_is_item_selected ()">poppler_form_field_choice_is_item_selected</a>
+                                                        (<em class="parameter"><code><a class="link" href="PopplerFormField.html" title="PoppplerFormField"><span class="type">PopplerFormField</span></a> *field</code></em>,
+                                                         <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="type">gint</span></a> index</code></em>);
+<span class="returnvalue">void</span>                <a class="link" href="PopplerFormField.html#poppler-form-field-choice-select-item" title="poppler_form_field_choice_select_item ()">poppler_form_field_choice_select_item</a>
+                                                        (<em class="parameter"><code><a class="link" href="PopplerFormField.html" title="PoppplerFormField"><span class="type">PopplerFormField</span></a> *field</code></em>,
+                                                         <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="type">gint</span></a> index</code></em>);
+<span class="returnvalue">void</span>                <a class="link" href="PopplerFormField.html#poppler-form-field-choice-toggle-item" title="poppler_form_field_choice_toggle_item ()">poppler_form_field_choice_toggle_item</a>
+                                                        (<em class="parameter"><code><a class="link" href="PopplerFormField.html" title="PoppplerFormField"><span class="type">PopplerFormField</span></a> *field</code></em>,
+                                                         <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="type">gint</span></a> index</code></em>);
+<span class="returnvalue">void</span>                <a class="link" href="PopplerFormField.html#poppler-form-field-choice-unselect-all" title="poppler_form_field_choice_unselect_all ()">poppler_form_field_choice_unselect_all</a>
+                                                        (<em class="parameter"><code><a class="link" href="PopplerFormField.html" title="PoppplerFormField"><span class="type">PopplerFormField</span></a> *field</code></em>);
+<a class="link" href="PopplerFormField.html#PopplerFormTextType" title="enum PopplerFormTextType"><span class="returnvalue">PopplerFormTextType</span></a> <a class="link" href="PopplerFormField.html#poppler-form-field-text-get-text-type" title="poppler_form_field_text_get_text_type ()">poppler_form_field_text_get_text_type</a>
+                                                        (<em class="parameter"><code><a class="link" href="PopplerFormField.html" title="PoppplerFormField"><span class="type">PopplerFormField</span></a> *field</code></em>);
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="returnvalue">gchar</span></a> *             <a class="link" href="PopplerFormField.html#poppler-form-field-text-get-text" title="poppler_form_field_text_get_text ()">poppler_form_field_text_get_text</a>    (<em class="parameter"><code><a class="link" href="PopplerFormField.html" title="PoppplerFormField"><span class="type">PopplerFormField</span></a> *field</code></em>);
+<span class="returnvalue">void</span>                <a class="link" href="PopplerFormField.html#poppler-form-field-text-set-text" title="poppler_form_field_text_set_text ()">poppler_form_field_text_set_text</a>    (<em class="parameter"><code><a class="link" href="PopplerFormField.html" title="PoppplerFormField"><span class="type">PopplerFormField</span></a> *field</code></em>,
+                                                         <em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *text</code></em>);
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="returnvalue">gint</span></a>                <a class="link" href="PopplerFormField.html#poppler-form-field-text-get-max-len" title="poppler_form_field_text_get_max_len ()">poppler_form_field_text_get_max_len</a> (<em class="parameter"><code><a class="link" href="PopplerFormField.html" title="PoppplerFormField"><span class="type">PopplerFormField</span></a> *field</code></em>);
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a>            <a class="link" href="PopplerFormField.html#poppler-form-field-text-do-scroll" title="poppler_form_field_text_do_scroll ()">poppler_form_field_text_do_scroll</a>   (<em class="parameter"><code><a class="link" href="PopplerFormField.html" title="PoppplerFormField"><span class="type">PopplerFormField</span></a> *field</code></em>);
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a>            <a class="link" href="PopplerFormField.html#poppler-form-field-text-do-spell-check" title="poppler_form_field_text_do_spell_check ()">poppler_form_field_text_do_spell_check</a>
+                                                        (<em class="parameter"><code><a class="link" href="PopplerFormField.html" title="PoppplerFormField"><span class="type">PopplerFormField</span></a> *field</code></em>);
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a>            <a class="link" href="PopplerFormField.html#poppler-form-field-text-is-password" title="poppler_form_field_text_is_password ()">poppler_form_field_text_is_password</a> (<em class="parameter"><code><a class="link" href="PopplerFormField.html" title="PoppplerFormField"><span class="type">PopplerFormField</span></a> *field</code></em>);
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a>            <a class="link" href="PopplerFormField.html#poppler-form-field-text-is-rich-text" title="poppler_form_field_text_is_rich_text ()">poppler_form_field_text_is_rich_text</a>
+                                                        (<em class="parameter"><code><a class="link" href="PopplerFormField.html" title="PoppplerFormField"><span class="type">PopplerFormField</span></a> *field</code></em>);
+</pre>
+</div>
+<div class="refsect1">
+<a name="PopplerFormField.object-hierarchy"></a><h2>Object Hierarchy</h2>
+<pre class="synopsis">
+  <a href="http://library.gnome.org/devel/gobject/unstable/gobject-The-Base-Object-Type.html#GObject">GObject</a>
+   +----PopplerFormField
+</pre>
+</div>
+<div class="refsect1">
+<a name="PopplerFormField.description"></a><h2>Description</h2>
+</div>
+<div class="refsect1">
+<a name="PopplerFormField.details"></a><h2>Details</h2>
+<div class="refsect2">
+<a name="PopplerFormField-struct"></a><h3>PopplerFormField</h3>
+<pre class="programlisting">typedef struct _PopplerFormField PopplerFormField;</pre>
+</div>
+<hr>
+<div class="refsect2">
+<a name="PopplerFormFieldType"></a><h3>enum PopplerFormFieldType</h3>
+<pre class="programlisting">typedef enum {
+  POPPLER_FORM_FIELD_UNKNOWN,
+  POPPLER_FORM_FIELD_BUTTON,
+  POPPLER_FORM_FIELD_TEXT,
+  POPPLER_FORM_FIELD_CHOICE,
+  POPPLER_FORM_FIELD_SIGNATURE
+} PopplerFormFieldType;
+</pre>
+</div>
+<hr>
+<div class="refsect2">
+<a name="PopplerFormButtonType"></a><h3>enum PopplerFormButtonType</h3>
+<pre class="programlisting">typedef enum {
+  POPPLER_FORM_BUTTON_PUSH,
+  POPPLER_FORM_BUTTON_CHECK,
+  POPPLER_FORM_BUTTON_RADIO
+} PopplerFormButtonType;
+</pre>
+</div>
+<hr>
+<div class="refsect2">
+<a name="PopplerFormChoiceType"></a><h3>enum PopplerFormChoiceType</h3>
+<pre class="programlisting">typedef enum {
+  POPPLER_FORM_CHOICE_COMBO,
+  POPPLER_FORM_CHOICE_LIST
+} PopplerFormChoiceType;
+</pre>
+</div>
+<hr>
+<div class="refsect2">
+<a name="PopplerFormTextType"></a><h3>enum PopplerFormTextType</h3>
+<pre class="programlisting">typedef enum {
+  POPPLER_FORM_TEXT_NORMAL,
+  POPPLER_FORM_TEXT_MULTILINE,
+  POPPLER_FORM_TEXT_FILE_SELECT
+} PopplerFormTextType;
+</pre>
+</div>
+<hr>
+<div class="refsect2">
+<a name="poppler-form-field-get-field-type"></a><h3>poppler_form_field_get_field_type ()</h3>
+<pre class="programlisting"><a class="link" href="PopplerFormField.html#PopplerFormFieldType" title="enum PopplerFormFieldType"><span class="returnvalue">PopplerFormFieldType</span></a> poppler_form_field_get_field_type  (<em class="parameter"><code><a class="link" href="PopplerFormField.html" title="PoppplerFormField"><span class="type">PopplerFormField</span></a> *field</code></em>);</pre>
+<p>
+Gets the type of <em class="parameter"><code>field</code></em>
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>field</code></em> :</span></p></td>
+<td>a <a class="link" href="PopplerFormField.html" title="PoppplerFormField"><span class="type">PopplerFormField</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>
+<a class="link" href="PopplerFormField.html#PopplerFormFieldType" title="enum PopplerFormFieldType"><span class="type">PopplerFormFieldType</span></a> of <em class="parameter"><code>field</code></em>
+</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="poppler-form-field-get-id"></a><h3>poppler_form_field_get_id ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="returnvalue">gint</span></a>                poppler_form_field_get_id           (<em class="parameter"><code><a class="link" href="PopplerFormField.html" title="PoppplerFormField"><span class="type">PopplerFormField</span></a> *field</code></em>);</pre>
+<p>
+Gets the id of <em class="parameter"><code>field</code></em>
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>field</code></em> :</span></p></td>
+<td>a <a class="link" href="PopplerFormField.html" title="PoppplerFormField"><span class="type">PopplerFormField</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>the id of <em class="parameter"><code>field</code></em>
+</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="poppler-form-field-is-read-only"></a><h3>poppler_form_field_is_read_only ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a>            poppler_form_field_is_read_only     (<em class="parameter"><code><a class="link" href="PopplerFormField.html" title="PoppplerFormField"><span class="type">PopplerFormField</span></a> *field</code></em>);</pre>
+<p>
+Checks whether <em class="parameter"><code>field</code></em> is read only
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>field</code></em> :</span></p></td>
+<td>a <a class="link" href="PopplerFormField.html" title="PoppplerFormField"><span class="type">PopplerFormField</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#TRUE:CAPS"><code class="literal">TRUE</code></a> if <em class="parameter"><code>field</code></em> is read only</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="poppler-form-field-get-font-size"></a><h3>poppler_form_field_get_font_size ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gdouble"><span class="returnvalue">gdouble</span></a>             poppler_form_field_get_font_size    (<em class="parameter"><code><a class="link" href="PopplerFormField.html" title="PoppplerFormField"><span class="type">PopplerFormField</span></a> *field</code></em>);</pre>
+<p>
+Gets the font size of <em class="parameter"><code>field</code></em>
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>field</code></em> :</span></p></td>
+<td>a <a class="link" href="PopplerFormField.html" title="PoppplerFormField"><span class="type">PopplerFormField</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>the font size of <em class="parameter"><code>field</code></em>
+</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="poppler-form-field-get-partial-name"></a><h3>poppler_form_field_get_partial_name ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="returnvalue">gchar</span></a> *             poppler_form_field_get_partial_name (<em class="parameter"><code><a class="link" href="PopplerFormField.html" title="PoppplerFormField"><span class="type">PopplerFormField</span></a> *field</code></em>);</pre>
+<p>
+Gets the partial name of <em class="parameter"><code>field</code></em>.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>field</code></em> :</span></p></td>
+<td>a <a class="link" href="PopplerFormField.html" title="PoppplerFormField"><span class="type">PopplerFormField</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>a new allocated string. It must be freed with <a href="http://library.gnome.org/devel/glib/unstable/glib-Memory-Allocation.html#g-free"><code class="function">g_free()</code></a> when done.</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.16</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="poppler-form-field-get-mapping-name"></a><h3>poppler_form_field_get_mapping_name ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="returnvalue">gchar</span></a> *             poppler_form_field_get_mapping_name (<em class="parameter"><code><a class="link" href="PopplerFormField.html" title="PoppplerFormField"><span class="type">PopplerFormField</span></a> *field</code></em>);</pre>
+<p>
+Gets the mapping name of <em class="parameter"><code>field</code></em> that is used when
+exporting interactive form field data from the document
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>field</code></em> :</span></p></td>
+<td>a <a class="link" href="PopplerFormField.html" title="PoppplerFormField"><span class="type">PopplerFormField</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>a new allocated string. It must be freed with <a href="http://library.gnome.org/devel/glib/unstable/glib-Memory-Allocation.html#g-free"><code class="function">g_free()</code></a> when done.</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.16</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="poppler-form-field-get-name"></a><h3>poppler_form_field_get_name ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="returnvalue">gchar</span></a> *             poppler_form_field_get_name         (<em class="parameter"><code><a class="link" href="PopplerFormField.html" title="PoppplerFormField"><span class="type">PopplerFormField</span></a> *field</code></em>);</pre>
+<p>
+Gets the fully qualified name of <em class="parameter"><code>field</code></em>. It's constructed by concatenating
+the partial field names of the field and all of its ancestors.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>field</code></em> :</span></p></td>
+<td>a <a class="link" href="PopplerFormField.html" title="PoppplerFormField"><span class="type">PopplerFormField</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>a new allocated string. It must be freed with <a href="http://library.gnome.org/devel/glib/unstable/glib-Memory-Allocation.html#g-free"><code class="function">g_free()</code></a> when done.</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.16</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="poppler-form-field-get-action"></a><h3>poppler_form_field_get_action ()</h3>
+<pre class="programlisting"><a class="link" href="poppler-PopplerAction.html#PopplerAction" title="union PopplerAction"><span class="returnvalue">PopplerAction</span></a> *     poppler_form_field_get_action       (<em class="parameter"><code><a class="link" href="PopplerFormField.html" title="PoppplerFormField"><span class="type">PopplerFormField</span></a> *field</code></em>);</pre>
+<p>
+Retrieves the action (<a class="link" href="poppler-PopplerAction.html#PopplerAction" title="union PopplerAction"><span class="type">PopplerAction</span></a>) that shall be
+performed when <em class="parameter"><code>field</code></em> is activated, or <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#NULL:CAPS"><code class="literal">NULL</code></a>
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>field</code></em> :</span></p></td>
+<td>a <a class="link" href="PopplerFormField.html" title="PoppplerFormField"><span class="type">PopplerFormField</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>the action to perform. The returned
+object is owned by <em class="parameter"><code>field</code></em> and should not be freed. <span class="annotation">[<acronym title="Don't free data after the code is done."><span class="acronym">transfer none</span></acronym>]</span>
+</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.18</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="poppler-form-field-button-get-button-type"></a><h3>poppler_form_field_button_get_button_type ()</h3>
+<pre class="programlisting"><a class="link" href="PopplerFormField.html#PopplerFormButtonType" title="enum PopplerFormButtonType"><span class="returnvalue">PopplerFormButtonType</span></a> poppler_form_field_button_get_button_type
+                                                        (<em class="parameter"><code><a class="link" href="PopplerFormField.html" title="PoppplerFormField"><span class="type">PopplerFormField</span></a> *field</code></em>);</pre>
+<p>
+Gets the button type of <em class="parameter"><code>field</code></em>
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>field</code></em> :</span></p></td>
+<td>a <a class="link" href="PopplerFormField.html" title="PoppplerFormField"><span class="type">PopplerFormField</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>
+<a class="link" href="PopplerFormField.html#PopplerFormButtonType" title="enum PopplerFormButtonType"><span class="type">PopplerFormButtonType</span></a> of <em class="parameter"><code>field</code></em>
+</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="poppler-form-field-button-get-state"></a><h3>poppler_form_field_button_get_state ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a>            poppler_form_field_button_get_state (<em class="parameter"><code><a class="link" href="PopplerFormField.html" title="PoppplerFormField"><span class="type">PopplerFormField</span></a> *field</code></em>);</pre>
+<p>
+Queries a <a class="link" href="PopplerFormField.html" title="PoppplerFormField"><span class="type">PopplerFormField</span></a> and returns its current state. Returns <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#TRUE:CAPS"><code class="literal">TRUE</code></a> if
+<em class="parameter"><code>field</code></em> is pressed in and <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#FALSE:CAPS"><code class="literal">FALSE</code></a> if it is raised.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>field</code></em> :</span></p></td>
+<td>a <a class="link" href="PopplerFormField.html" title="PoppplerFormField"><span class="type">PopplerFormField</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>current state of <em class="parameter"><code>field</code></em>
+</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="poppler-form-field-button-set-state"></a><h3>poppler_form_field_button_set_state ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span>                poppler_form_field_button_set_state (<em class="parameter"><code><a class="link" href="PopplerFormField.html" title="PoppplerFormField"><span class="type">PopplerFormField</span></a> *field</code></em>,
+                                                         <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a> state</code></em>);</pre>
+<p>
+Sets the status of <em class="parameter"><code>field</code></em>. Set to <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#TRUE:CAPS"><code class="literal">TRUE</code></a> if you want the <a class="link" href="PopplerFormField.html" title="PoppplerFormField"><span class="type">PopplerFormField</span></a>
+to be 'pressed in', and <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#FALSE:CAPS"><code class="literal">FALSE</code></a> to raise it.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>field</code></em> :</span></p></td>
+<td>a <a class="link" href="PopplerFormField.html" title="PoppplerFormField"><span class="type">PopplerFormField</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>state</code></em> :</span></p></td>
+<td>
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#TRUE:CAPS"><code class="literal">TRUE</code></a> or <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#FALSE:CAPS"><code class="literal">FALSE</code></a>
+</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="poppler-form-field-choice-get-choice-type"></a><h3>poppler_form_field_choice_get_choice_type ()</h3>
+<pre class="programlisting"><a class="link" href="PopplerFormField.html#PopplerFormChoiceType" title="enum PopplerFormChoiceType"><span class="returnvalue">PopplerFormChoiceType</span></a> poppler_form_field_choice_get_choice_type
+                                                        (<em class="parameter"><code><a class="link" href="PopplerFormField.html" title="PoppplerFormField"><span class="type">PopplerFormField</span></a> *field</code></em>);</pre>
+<p>
+Gets the choice type of <em class="parameter"><code>field</code></em>
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>field</code></em> :</span></p></td>
+<td>a <a class="link" href="PopplerFormField.html" title="PoppplerFormField"><span class="type">PopplerFormField</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>
+<a class="link" href="PopplerFormField.html#PopplerFormChoiceType" title="enum PopplerFormChoiceType"><span class="type">PopplerFormChoiceType</span></a> of <em class="parameter"><code>field</code></em>
+</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="poppler-form-field-choice-can-select-multiple"></a><h3>poppler_form_field_choice_can_select_multiple ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a>            poppler_form_field_choice_can_select_multiple
+                                                        (<em class="parameter"><code><a class="link" href="PopplerFormField.html" title="PoppplerFormField"><span class="type">PopplerFormField</span></a> *field</code></em>);</pre>
+<p>
+Checks whether <em class="parameter"><code>field</code></em> allows multiple choices to be selected
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>field</code></em> :</span></p></td>
+<td>a <a class="link" href="PopplerFormField.html" title="PoppplerFormField"><span class="type">PopplerFormField</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#TRUE:CAPS"><code class="literal">TRUE</code></a> if <em class="parameter"><code>field</code></em> allows multiple choices to be selected</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="poppler-form-field-choice-commit-on-change"></a><h3>poppler_form_field_choice_commit_on_change ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a>            poppler_form_field_choice_commit_on_change
+                                                        (<em class="parameter"><code><a class="link" href="PopplerFormField.html" title="PoppplerFormField"><span class="type">PopplerFormField</span></a> *field</code></em>);</pre>
+</div>
+<hr>
+<div class="refsect2">
+<a name="poppler-form-field-choice-do-spell-check"></a><h3>poppler_form_field_choice_do_spell_check ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a>            poppler_form_field_choice_do_spell_check
+                                                        (<em class="parameter"><code><a class="link" href="PopplerFormField.html" title="PoppplerFormField"><span class="type">PopplerFormField</span></a> *field</code></em>);</pre>
+<p>
+Checks whether spell checking should be done for the contents of <em class="parameter"><code>field</code></em>
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>field</code></em> :</span></p></td>
+<td>a <a class="link" href="PopplerFormField.html" title="PoppplerFormField"><span class="type">PopplerFormField</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#TRUE:CAPS"><code class="literal">TRUE</code></a> if spell checking should be done for <em class="parameter"><code>field</code></em>
+</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="poppler-form-field-choice-get-item"></a><h3>poppler_form_field_choice_get_item ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="returnvalue">gchar</span></a> *             poppler_form_field_choice_get_item  (<em class="parameter"><code><a class="link" href="PopplerFormField.html" title="PoppplerFormField"><span class="type">PopplerFormField</span></a> *field</code></em>,
+                                                         <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="type">gint</span></a> index</code></em>);</pre>
+<p>
+Returns the contents of the item on <em class="parameter"><code>field</code></em> at the given index
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>field</code></em> :</span></p></td>
+<td>a <a class="link" href="PopplerFormField.html" title="PoppplerFormField"><span class="type">PopplerFormField</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>index</code></em> :</span></p></td>
+<td>the index of the item</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>a new allocated string. It must be freed with <a href="http://library.gnome.org/devel/glib/unstable/glib-Memory-Allocation.html#g-free"><code class="function">g_free()</code></a> when done.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="poppler-form-field-choice-get-n-items"></a><h3>poppler_form_field_choice_get_n_items ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="returnvalue">gint</span></a>                poppler_form_field_choice_get_n_items
+                                                        (<em class="parameter"><code><a class="link" href="PopplerFormField.html" title="PoppplerFormField"><span class="type">PopplerFormField</span></a> *field</code></em>);</pre>
+<p>
+Returns the number of items on <em class="parameter"><code>field</code></em>
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>field</code></em> :</span></p></td>
+<td>a <a class="link" href="PopplerFormField.html" title="PoppplerFormField"><span class="type">PopplerFormField</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>the number of items on <em class="parameter"><code>field</code></em>
+</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="poppler-form-field-choice-get-text"></a><h3>poppler_form_field_choice_get_text ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="returnvalue">gchar</span></a> *             poppler_form_field_choice_get_text  (<em class="parameter"><code><a class="link" href="PopplerFormField.html" title="PoppplerFormField"><span class="type">PopplerFormField</span></a> *field</code></em>);</pre>
+<p>
+Retrieves the contents of <em class="parameter"><code>field</code></em>.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>field</code></em> :</span></p></td>
+<td>a <a class="link" href="PopplerFormField.html" title="PoppplerFormField"><span class="type">PopplerFormField</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>a new allocated string. It must be freed with <a href="http://library.gnome.org/devel/glib/unstable/glib-Memory-Allocation.html#g-free"><code class="function">g_free()</code></a> when done.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="poppler-form-field-choice-set-text"></a><h3>poppler_form_field_choice_set_text ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span>                poppler_form_field_choice_set_text  (<em class="parameter"><code><a class="link" href="PopplerFormField.html" title="PoppplerFormField"><span class="type">PopplerFormField</span></a> *field</code></em>,
+                                                         <em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *text</code></em>);</pre>
+<p>
+Sets the text in <em class="parameter"><code>field</code></em> to the given value, replacing the current contents
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>field</code></em> :</span></p></td>
+<td>a <a class="link" href="PopplerFormField.html" title="PoppplerFormField"><span class="type">PopplerFormField</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>text</code></em> :</span></p></td>
+<td>the new text</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="poppler-form-field-choice-is-editable"></a><h3>poppler_form_field_choice_is_editable ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a>            poppler_form_field_choice_is_editable
+                                                        (<em class="parameter"><code><a class="link" href="PopplerFormField.html" title="PoppplerFormField"><span class="type">PopplerFormField</span></a> *field</code></em>);</pre>
+<p>
+Checks whether <em class="parameter"><code>field</code></em> is editable
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>field</code></em> :</span></p></td>
+<td>a <a class="link" href="PopplerFormField.html" title="PoppplerFormField"><span class="type">PopplerFormField</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#TRUE:CAPS"><code class="literal">TRUE</code></a> if <em class="parameter"><code>field</code></em> is editable</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="poppler-form-field-choice-is-item-selected"></a><h3>poppler_form_field_choice_is_item_selected ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a>            poppler_form_field_choice_is_item_selected
+                                                        (<em class="parameter"><code><a class="link" href="PopplerFormField.html" title="PoppplerFormField"><span class="type">PopplerFormField</span></a> *field</code></em>,
+                                                         <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="type">gint</span></a> index</code></em>);</pre>
+<p>
+Checks whether the item at the given index on <em class="parameter"><code>field</code></em> is currently selected
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>field</code></em> :</span></p></td>
+<td>a <a class="link" href="PopplerFormField.html" title="PoppplerFormField"><span class="type">PopplerFormField</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>index</code></em> :</span></p></td>
+<td>the index of the item</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#TRUE:CAPS"><code class="literal">TRUE</code></a> if item at <em class="parameter"><code>index</code></em> is currently selected</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="poppler-form-field-choice-select-item"></a><h3>poppler_form_field_choice_select_item ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span>                poppler_form_field_choice_select_item
+                                                        (<em class="parameter"><code><a class="link" href="PopplerFormField.html" title="PoppplerFormField"><span class="type">PopplerFormField</span></a> *field</code></em>,
+                                                         <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="type">gint</span></a> index</code></em>);</pre>
+<p>
+Selects the item at the given index on <em class="parameter"><code>field</code></em>
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>field</code></em> :</span></p></td>
+<td>a <a class="link" href="PopplerFormField.html" title="PoppplerFormField"><span class="type">PopplerFormField</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>index</code></em> :</span></p></td>
+<td>the index of the item</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="poppler-form-field-choice-toggle-item"></a><h3>poppler_form_field_choice_toggle_item ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span>                poppler_form_field_choice_toggle_item
+                                                        (<em class="parameter"><code><a class="link" href="PopplerFormField.html" title="PoppplerFormField"><span class="type">PopplerFormField</span></a> *field</code></em>,
+                                                         <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="type">gint</span></a> index</code></em>);</pre>
+<p>
+Changes the state of the item at the given index
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>field</code></em> :</span></p></td>
+<td>a <a class="link" href="PopplerFormField.html" title="PoppplerFormField"><span class="type">PopplerFormField</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>index</code></em> :</span></p></td>
+<td>the index of the item</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="poppler-form-field-choice-unselect-all"></a><h3>poppler_form_field_choice_unselect_all ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span>                poppler_form_field_choice_unselect_all
+                                                        (<em class="parameter"><code><a class="link" href="PopplerFormField.html" title="PoppplerFormField"><span class="type">PopplerFormField</span></a> *field</code></em>);</pre>
+<p>
+Unselects all the items on <em class="parameter"><code>field</code></em>
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody><tr>
+<td><p><span class="term"><em class="parameter"><code>field</code></em> :</span></p></td>
+<td>a <a class="link" href="PopplerFormField.html" title="PoppplerFormField"><span class="type">PopplerFormField</span></a>
+</td>
+</tr></tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="poppler-form-field-text-get-text-type"></a><h3>poppler_form_field_text_get_text_type ()</h3>
+<pre class="programlisting"><a class="link" href="PopplerFormField.html#PopplerFormTextType" title="enum PopplerFormTextType"><span class="returnvalue">PopplerFormTextType</span></a> poppler_form_field_text_get_text_type
+                                                        (<em class="parameter"><code><a class="link" href="PopplerFormField.html" title="PoppplerFormField"><span class="type">PopplerFormField</span></a> *field</code></em>);</pre>
+<p>
+Gets the text type of <em class="parameter"><code>field</code></em>.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>field</code></em> :</span></p></td>
+<td>a <a class="link" href="PopplerFormField.html" title="PoppplerFormField"><span class="type">PopplerFormField</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>
+<a class="link" href="PopplerFormField.html#PopplerFormTextType" title="enum PopplerFormTextType"><span class="type">PopplerFormTextType</span></a> of <em class="parameter"><code>field</code></em>
+</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="poppler-form-field-text-get-text"></a><h3>poppler_form_field_text_get_text ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="returnvalue">gchar</span></a> *             poppler_form_field_text_get_text    (<em class="parameter"><code><a class="link" href="PopplerFormField.html" title="PoppplerFormField"><span class="type">PopplerFormField</span></a> *field</code></em>);</pre>
+<p>
+Retrieves the contents of <em class="parameter"><code>field</code></em>.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>field</code></em> :</span></p></td>
+<td>a <a class="link" href="PopplerFormField.html" title="PoppplerFormField"><span class="type">PopplerFormField</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>a new allocated string. It must be freed with <a href="http://library.gnome.org/devel/glib/unstable/glib-Memory-Allocation.html#g-free"><code class="function">g_free()</code></a> when done.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="poppler-form-field-text-set-text"></a><h3>poppler_form_field_text_set_text ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span>                poppler_form_field_text_set_text    (<em class="parameter"><code><a class="link" href="PopplerFormField.html" title="PoppplerFormField"><span class="type">PopplerFormField</span></a> *field</code></em>,
+                                                         <em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *text</code></em>);</pre>
+<p>
+Sets the text in <em class="parameter"><code>field</code></em> to the given value, replacing the current contents.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>field</code></em> :</span></p></td>
+<td>a <a class="link" href="PopplerFormField.html" title="PoppplerFormField"><span class="type">PopplerFormField</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>text</code></em> :</span></p></td>
+<td>the new text</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="poppler-form-field-text-get-max-len"></a><h3>poppler_form_field_text_get_max_len ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="returnvalue">gint</span></a>                poppler_form_field_text_get_max_len (<em class="parameter"><code><a class="link" href="PopplerFormField.html" title="PoppplerFormField"><span class="type">PopplerFormField</span></a> *field</code></em>);</pre>
+<p>
+Retrieves the maximum allowed length of the text in <em class="parameter"><code>field</code></em>
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>field</code></em> :</span></p></td>
+<td>a <a class="link" href="PopplerFormField.html" title="PoppplerFormField"><span class="type">PopplerFormField</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>the maximum allowed number of characters in <em class="parameter"><code>field</code></em>, or -1 if there is no maximum.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="poppler-form-field-text-do-scroll"></a><h3>poppler_form_field_text_do_scroll ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a>            poppler_form_field_text_do_scroll   (<em class="parameter"><code><a class="link" href="PopplerFormField.html" title="PoppplerFormField"><span class="type">PopplerFormField</span></a> *field</code></em>);</pre>
+</div>
+<hr>
+<div class="refsect2">
+<a name="poppler-form-field-text-do-spell-check"></a><h3>poppler_form_field_text_do_spell_check ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a>            poppler_form_field_text_do_spell_check
+                                                        (<em class="parameter"><code><a class="link" href="PopplerFormField.html" title="PoppplerFormField"><span class="type">PopplerFormField</span></a> *field</code></em>);</pre>
+<p>
+Checks whether spell checking should be done for the contents of <em class="parameter"><code>field</code></em>
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>field</code></em> :</span></p></td>
+<td>a <a class="link" href="PopplerFormField.html" title="PoppplerFormField"><span class="type">PopplerFormField</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#TRUE:CAPS"><code class="literal">TRUE</code></a> if spell checking should be done for <em class="parameter"><code>field</code></em>
+</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="poppler-form-field-text-is-password"></a><h3>poppler_form_field_text_is_password ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a>            poppler_form_field_text_is_password (<em class="parameter"><code><a class="link" href="PopplerFormField.html" title="PoppplerFormField"><span class="type">PopplerFormField</span></a> *field</code></em>);</pre>
+<p>
+Checks whether content of <em class="parameter"><code>field</code></em> is a password and it must be hidden
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>field</code></em> :</span></p></td>
+<td>a <a class="link" href="PopplerFormField.html" title="PoppplerFormField"><span class="type">PopplerFormField</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#TRUE:CAPS"><code class="literal">TRUE</code></a> if the content of <em class="parameter"><code>field</code></em> is a password</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="poppler-form-field-text-is-rich-text"></a><h3>poppler_form_field_text_is_rich_text ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a>            poppler_form_field_text_is_rich_text
+                                                        (<em class="parameter"><code><a class="link" href="PopplerFormField.html" title="PoppplerFormField"><span class="type">PopplerFormField</span></a> *field</code></em>);</pre>
+<p>
+Checks whether the contents of <em class="parameter"><code>field</code></em> are rich text
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>field</code></em> :</span></p></td>
+<td>a <a class="link" href="PopplerFormField.html" title="PoppplerFormField"><span class="type">PopplerFormField</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#TRUE:CAPS"><code class="literal">TRUE</code></a> if the contents of <em class="parameter"><code>field</code></em> are rich text</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+</div>
+</div>
+<div class="footer">
+<hr>
+          Generated by GTK-Doc V1.18</div>
+</body>
+</html>
\ No newline at end of file
diff --git a/glib/reference/html/PopplerLayer.html b/glib/reference/html/PopplerLayer.html
new file mode 100644 (file)
index 0000000..f7b1a8d
--- /dev/null
@@ -0,0 +1,210 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>PopplerLayer</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.76.1">
+<link rel="home" href="index.html" title="Poppler Reference Manual">
+<link rel="up" href="ch01.html" title="Poppler">
+<link rel="prev" href="PopplerAnnot.html" title="PopplerAnnot">
+<link rel="next" href="PopplerMedia.html" title="PopplerMedia">
+<meta name="generator" content="GTK-Doc V1.18 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="2">
+<tr valign="middle">
+<td><a accesskey="p" href="PopplerAnnot.html"><img src="left.png" width="24" height="24" border="0" alt="Prev"></a></td>
+<td><a accesskey="u" href="ch01.html"><img src="up.png" width="24" height="24" border="0" alt="Up"></a></td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="24" height="24" border="0" alt="Home"></a></td>
+<th width="100%" align="center">Poppler Reference Manual</th>
+<td><a accesskey="n" href="PopplerMedia.html"><img src="right.png" width="24" height="24" border="0" alt="Next"></a></td>
+</tr>
+<tr><td colspan="5" class="shortcuts">
+<a href="#PopplerLayer.synopsis" class="shortcut">Top</a>
+                   | 
+                  <a href="#PopplerLayer.description" class="shortcut">Description</a>
+                   | 
+                  <a href="#PopplerLayer.object-hierarchy" class="shortcut">Object Hierarchy</a>
+</td></tr>
+</table>
+<div class="refentry">
+<a name="PopplerLayer"></a><div class="titlepage"></div>
+<div class="refnamediv"><table width="100%"><tr>
+<td valign="top">
+<h2><span class="refentrytitle"><a name="PopplerLayer.top_of_page"></a>PopplerLayer</span></h2>
+<p>PopplerLayer — Layers</p>
+</td>
+<td valign="top" align="right"></td>
+</tr></table></div>
+<div class="refsynopsisdiv">
+<a name="PopplerLayer.synopsis"></a><h2>Synopsis</h2>
+<pre class="synopsis">
+#include &lt;poppler.h&gt;
+
+                    <a class="link" href="PopplerLayer.html#PopplerLayer-struct" title="PopplerLayer">PopplerLayer</a>;
+const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="returnvalue">gchar</span></a> *       <a class="link" href="PopplerLayer.html#poppler-layer-get-title" title="poppler_layer_get_title ()">poppler_layer_get_title</a>             (<em class="parameter"><code><a class="link" href="PopplerLayer.html" title="PopplerLayer"><span class="type">PopplerLayer</span></a> *layer</code></em>);
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a>            <a class="link" href="PopplerLayer.html#poppler-layer-is-visible" title="poppler_layer_is_visible ()">poppler_layer_is_visible</a>            (<em class="parameter"><code><a class="link" href="PopplerLayer.html" title="PopplerLayer"><span class="type">PopplerLayer</span></a> *layer</code></em>);
+<span class="returnvalue">void</span>                <a class="link" href="PopplerLayer.html#poppler-layer-show" title="poppler_layer_show ()">poppler_layer_show</a>                  (<em class="parameter"><code><a class="link" href="PopplerLayer.html" title="PopplerLayer"><span class="type">PopplerLayer</span></a> *layer</code></em>);
+<span class="returnvalue">void</span>                <a class="link" href="PopplerLayer.html#poppler-layer-hide" title="poppler_layer_hide ()">poppler_layer_hide</a>                  (<em class="parameter"><code><a class="link" href="PopplerLayer.html" title="PopplerLayer"><span class="type">PopplerLayer</span></a> *layer</code></em>);
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a>            <a class="link" href="PopplerLayer.html#poppler-layer-is-parent" title="poppler_layer_is_parent ()">poppler_layer_is_parent</a>             (<em class="parameter"><code><a class="link" href="PopplerLayer.html" title="PopplerLayer"><span class="type">PopplerLayer</span></a> *layer</code></em>);
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="returnvalue">gint</span></a>                <a class="link" href="PopplerLayer.html#poppler-layer-get-radio-button-group-id" title="poppler_layer_get_radio_button_group_id ()">poppler_layer_get_radio_button_group_id</a>
+                                                        (<em class="parameter"><code><a class="link" href="PopplerLayer.html" title="PopplerLayer"><span class="type">PopplerLayer</span></a> *layer</code></em>);
+</pre>
+</div>
+<div class="refsect1">
+<a name="PopplerLayer.object-hierarchy"></a><h2>Object Hierarchy</h2>
+<pre class="synopsis">
+  <a href="http://library.gnome.org/devel/gobject/unstable/gobject-The-Base-Object-Type.html#GObject">GObject</a>
+   +----PopplerLayer
+</pre>
+</div>
+<div class="refsect1">
+<a name="PopplerLayer.description"></a><h2>Description</h2>
+</div>
+<div class="refsect1">
+<a name="PopplerLayer.details"></a><h2>Details</h2>
+<div class="refsect2">
+<a name="PopplerLayer-struct"></a><h3>PopplerLayer</h3>
+<pre class="programlisting">typedef struct _PopplerLayer PopplerLayer;</pre>
+</div>
+<hr>
+<div class="refsect2">
+<a name="poppler-layer-get-title"></a><h3>poppler_layer_get_title ()</h3>
+<pre class="programlisting">const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="returnvalue">gchar</span></a> *       poppler_layer_get_title             (<em class="parameter"><code><a class="link" href="PopplerLayer.html" title="PopplerLayer"><span class="type">PopplerLayer</span></a> *layer</code></em>);</pre>
+<p>
+Returns the name of the layer suitable for
+presentation as a title in a viewer's GUI
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>layer</code></em> :</span></p></td>
+<td>a <a class="link" href="PopplerLayer.html" title="PopplerLayer"><span class="type">PopplerLayer</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>a string containing the title of the layer</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.12</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="poppler-layer-is-visible"></a><h3>poppler_layer_is_visible ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a>            poppler_layer_is_visible            (<em class="parameter"><code><a class="link" href="PopplerLayer.html" title="PopplerLayer"><span class="type">PopplerLayer</span></a> *layer</code></em>);</pre>
+<p>
+Returns whether <em class="parameter"><code>layer</code></em> is visible
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>layer</code></em> :</span></p></td>
+<td>a <a class="link" href="PopplerLayer.html" title="PopplerLayer"><span class="type">PopplerLayer</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#TRUE:CAPS"><code class="literal">TRUE</code></a> if <em class="parameter"><code>layer</code></em> is visible</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.12</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="poppler-layer-show"></a><h3>poppler_layer_show ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span>                poppler_layer_show                  (<em class="parameter"><code><a class="link" href="PopplerLayer.html" title="PopplerLayer"><span class="type">PopplerLayer</span></a> *layer</code></em>);</pre>
+<p>
+Shows <em class="parameter"><code>layer</code></em>
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody><tr>
+<td><p><span class="term"><em class="parameter"><code>layer</code></em> :</span></p></td>
+<td>a <a class="link" href="PopplerLayer.html" title="PopplerLayer"><span class="type">PopplerLayer</span></a>
+</td>
+</tr></tbody>
+</table></div>
+<p class="since">Since 0.12</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="poppler-layer-hide"></a><h3>poppler_layer_hide ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span>                poppler_layer_hide                  (<em class="parameter"><code><a class="link" href="PopplerLayer.html" title="PopplerLayer"><span class="type">PopplerLayer</span></a> *layer</code></em>);</pre>
+<p>
+Hides <em class="parameter"><code>layer</code></em>. If <em class="parameter"><code>layer</code></em> is the parent of other nested layers,
+such layers will be also hidden and will be blocked until <em class="parameter"><code>layer</code></em>
+is shown again
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody><tr>
+<td><p><span class="term"><em class="parameter"><code>layer</code></em> :</span></p></td>
+<td>a <a class="link" href="PopplerLayer.html" title="PopplerLayer"><span class="type">PopplerLayer</span></a>
+</td>
+</tr></tbody>
+</table></div>
+<p class="since">Since 0.12</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="poppler-layer-is-parent"></a><h3>poppler_layer_is_parent ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a>            poppler_layer_is_parent             (<em class="parameter"><code><a class="link" href="PopplerLayer.html" title="PopplerLayer"><span class="type">PopplerLayer</span></a> *layer</code></em>);</pre>
+<p>
+Returns whether <em class="parameter"><code>layer</code></em> is parent of other nested layers.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>layer</code></em> :</span></p></td>
+<td>a <a class="link" href="PopplerLayer.html" title="PopplerLayer"><span class="type">PopplerLayer</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#TRUE:CAPS"><code class="literal">TRUE</code></a> if <em class="parameter"><code>layer</code></em> is a parent layer</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.12</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="poppler-layer-get-radio-button-group-id"></a><h3>poppler_layer_get_radio_button_group_id ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="returnvalue">gint</span></a>                poppler_layer_get_radio_button_group_id
+                                                        (<em class="parameter"><code><a class="link" href="PopplerLayer.html" title="PopplerLayer"><span class="type">PopplerLayer</span></a> *layer</code></em>);</pre>
+<p>
+Returns the numeric ID the radio button group associated with <em class="parameter"><code>layer</code></em>.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>layer</code></em> :</span></p></td>
+<td>a <a class="link" href="PopplerLayer.html" title="PopplerLayer"><span class="type">PopplerLayer</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>the ID of the radio button group associated with <em class="parameter"><code>layer</code></em>,
+or 0 if the layer is not associated to any radio button group</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.12</p>
+</div>
+</div>
+</div>
+<div class="footer">
+<hr>
+          Generated by GTK-Doc V1.18</div>
+</body>
+</html>
\ No newline at end of file
diff --git a/glib/reference/html/PopplerMedia.html b/glib/reference/html/PopplerMedia.html
new file mode 100644 (file)
index 0000000..5d39d26
--- /dev/null
@@ -0,0 +1,288 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>PopplerMedia</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.76.1">
+<link rel="home" href="index.html" title="Poppler Reference Manual">
+<link rel="up" href="ch01.html" title="Poppler">
+<link rel="prev" href="PopplerLayer.html" title="PopplerLayer">
+<link rel="next" href="PopplerMovie.html" title="PopplerMovie">
+<meta name="generator" content="GTK-Doc V1.18 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="2">
+<tr valign="middle">
+<td><a accesskey="p" href="PopplerLayer.html"><img src="left.png" width="24" height="24" border="0" alt="Prev"></a></td>
+<td><a accesskey="u" href="ch01.html"><img src="up.png" width="24" height="24" border="0" alt="Up"></a></td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="24" height="24" border="0" alt="Home"></a></td>
+<th width="100%" align="center">Poppler Reference Manual</th>
+<td><a accesskey="n" href="PopplerMovie.html"><img src="right.png" width="24" height="24" border="0" alt="Next"></a></td>
+</tr>
+<tr><td colspan="5" class="shortcuts">
+<a href="#PopplerMedia.synopsis" class="shortcut">Top</a>
+                   | 
+                  <a href="#PopplerMedia.description" class="shortcut">Description</a>
+                   | 
+                  <a href="#PopplerMedia.object-hierarchy" class="shortcut">Object Hierarchy</a>
+</td></tr>
+</table>
+<div class="refentry">
+<a name="PopplerMedia"></a><div class="titlepage"></div>
+<div class="refnamediv"><table width="100%"><tr>
+<td valign="top">
+<h2><span class="refentrytitle"><a name="PopplerMedia.top_of_page"></a>PopplerMedia</span></h2>
+<p>PopplerMedia — Media</p>
+</td>
+<td valign="top" align="right"></td>
+</tr></table></div>
+<div class="refsynopsisdiv">
+<a name="PopplerMedia.synopsis"></a><h2>Synopsis</h2>
+<pre class="synopsis">
+#include &lt;poppler.h&gt;
+
+                    <a class="link" href="PopplerMedia.html#PopplerMedia-struct" title="PopplerMedia">PopplerMedia</a>;
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a>            (<a class="link" href="PopplerMedia.html#PopplerMediaSaveFunc" title="PopplerMediaSaveFunc ()">*PopplerMediaSaveFunc</a>)             (<em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *buf</code></em>,
+                                                         <em class="parameter"><code><span class="type">gsize</span> count</code></em>,
+                                                         <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gpointer"><span class="type">gpointer</span></a> data</code></em>,
+                                                         <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Error-Reporting.html#GError"><span class="type">GError</span></a> **error</code></em>);
+const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="returnvalue">gchar</span></a> *       <a class="link" href="PopplerMedia.html#poppler-media-get-filename" title="poppler_media_get_filename ()">poppler_media_get_filename</a>          (<em class="parameter"><code><a class="link" href="PopplerMedia.html" title="PopplerMedia"><span class="type">PopplerMedia</span></a> *poppler_media</code></em>);
+const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="returnvalue">gchar</span></a> *       <a class="link" href="PopplerMedia.html#poppler-media-get-mime-type" title="poppler_media_get_mime_type ()">poppler_media_get_mime_type</a>         (<em class="parameter"><code><a class="link" href="PopplerMedia.html" title="PopplerMedia"><span class="type">PopplerMedia</span></a> *poppler_media</code></em>);
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a>            <a class="link" href="PopplerMedia.html#poppler-media-is-embedded" title="poppler_media_is_embedded ()">poppler_media_is_embedded</a>           (<em class="parameter"><code><a class="link" href="PopplerMedia.html" title="PopplerMedia"><span class="type">PopplerMedia</span></a> *poppler_media</code></em>);
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a>            <a class="link" href="PopplerMedia.html#poppler-media-save" title="poppler_media_save ()">poppler_media_save</a>                  (<em class="parameter"><code><a class="link" href="PopplerMedia.html" title="PopplerMedia"><span class="type">PopplerMedia</span></a> *poppler_media</code></em>,
+                                                         <em class="parameter"><code>const <span class="type">char</span> *filename</code></em>,
+                                                         <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Error-Reporting.html#GError"><span class="type">GError</span></a> **error</code></em>);
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a>            <a class="link" href="PopplerMedia.html#poppler-media-save-to-callback" title="poppler_media_save_to_callback ()">poppler_media_save_to_callback</a>      (<em class="parameter"><code><a class="link" href="PopplerMedia.html" title="PopplerMedia"><span class="type">PopplerMedia</span></a> *poppler_media</code></em>,
+                                                         <em class="parameter"><code><a class="link" href="PopplerMedia.html#PopplerMediaSaveFunc" title="PopplerMediaSaveFunc ()"><span class="type">PopplerMediaSaveFunc</span></a> save_func</code></em>,
+                                                         <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gpointer"><span class="type">gpointer</span></a> user_data</code></em>,
+                                                         <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Error-Reporting.html#GError"><span class="type">GError</span></a> **error</code></em>);
+</pre>
+</div>
+<div class="refsect1">
+<a name="PopplerMedia.object-hierarchy"></a><h2>Object Hierarchy</h2>
+<pre class="synopsis">
+  <a href="http://library.gnome.org/devel/gobject/unstable/gobject-The-Base-Object-Type.html#GObject">GObject</a>
+   +----PopplerMedia
+</pre>
+</div>
+<div class="refsect1">
+<a name="PopplerMedia.description"></a><h2>Description</h2>
+</div>
+<div class="refsect1">
+<a name="PopplerMedia.details"></a><h2>Details</h2>
+<div class="refsect2">
+<a name="PopplerMedia-struct"></a><h3>PopplerMedia</h3>
+<pre class="programlisting">typedef struct _PopplerMedia PopplerMedia;</pre>
+</div>
+<hr>
+<div class="refsect2">
+<a name="PopplerMediaSaveFunc"></a><h3>PopplerMediaSaveFunc ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a>            (*PopplerMediaSaveFunc)             (<em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *buf</code></em>,
+                                                         <em class="parameter"><code><span class="type">gsize</span> count</code></em>,
+                                                         <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gpointer"><span class="type">gpointer</span></a> data</code></em>,
+                                                         <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Error-Reporting.html#GError"><span class="type">GError</span></a> **error</code></em>);</pre>
+<p>
+Specifies the type of the function passed to
+<a class="link" href="PopplerMedia.html#poppler-media-save-to-callback" title="poppler_media_save_to_callback ()"><code class="function">poppler_media_save_to_callback()</code></a>.  It is called once for each block of
+bytes that is "written" by <a class="link" href="PopplerMedia.html#poppler-media-save-to-callback" title="poppler_media_save_to_callback ()"><code class="function">poppler_media_save_to_callback()</code></a>.  If
+successful it should return <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#TRUE:CAPS"><code class="literal">TRUE</code></a>.  If an error occurs it should set
+<em class="parameter"><code>error</code></em> and return <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#FALSE:CAPS"><code class="literal">FALSE</code></a>, in which case <a class="link" href="PopplerMedia.html#poppler-media-save-to-callback" title="poppler_media_save_to_callback ()"><code class="function">poppler_media_save_to_callback()</code></a>
+will fail with the same error.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>buf</code></em> :</span></p></td>
+<td>buffer containing
+bytes to be written. <span class="annotation">[<acronym title="Parameter points to an array of items."><span class="acronym">array</span></acronym> length=count][<acronym title="Generics and defining elements of containers and arrays."><span class="acronym">element-type</span></acronym> guint8]</span>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>count</code></em> :</span></p></td>
+<td>number of bytes in <em class="parameter"><code>buf</code></em>.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>data</code></em> :</span></p></td>
+<td>user data passed to <a class="link" href="PopplerMedia.html#poppler-media-save-to-callback" title="poppler_media_save_to_callback ()"><code class="function">poppler_media_save_to_callback()</code></a>. <span class="annotation">[<acronym title="This parameter is a 'user_data', for callbacks; many bindings can pass NULL here."><span class="acronym">closure</span></acronym>]</span>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>error</code></em> :</span></p></td>
+<td>GError to set on error, or <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#NULL:CAPS"><code class="literal">NULL</code></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#TRUE:CAPS"><code class="literal">TRUE</code></a> if successful, <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#FALSE:CAPS"><code class="literal">FALSE</code></a> (with <em class="parameter"><code>error</code></em> set) if failed.</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.14</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="poppler-media-get-filename"></a><h3>poppler_media_get_filename ()</h3>
+<pre class="programlisting">const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="returnvalue">gchar</span></a> *       poppler_media_get_filename          (<em class="parameter"><code><a class="link" href="PopplerMedia.html" title="PopplerMedia"><span class="type">PopplerMedia</span></a> *poppler_media</code></em>);</pre>
+<p>
+Returns the media clip filename, in case of non-embedded media. filename might be
+a local relative or absolute path or a URI
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>poppler_media</code></em> :</span></p></td>
+<td>a <a class="link" href="PopplerMedia.html" title="PopplerMedia"><span class="type">PopplerMedia</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>a filename, return value is owned by <a class="link" href="PopplerMedia.html" title="PopplerMedia"><span class="type">PopplerMedia</span></a> and should not be freed</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.14</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="poppler-media-get-mime-type"></a><h3>poppler_media_get_mime_type ()</h3>
+<pre class="programlisting">const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="returnvalue">gchar</span></a> *       poppler_media_get_mime_type         (<em class="parameter"><code><a class="link" href="PopplerMedia.html" title="PopplerMedia"><span class="type">PopplerMedia</span></a> *poppler_media</code></em>);</pre>
+<p>
+Returns the media clip mime-type
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>poppler_media</code></em> :</span></p></td>
+<td>a <a class="link" href="PopplerMedia.html" title="PopplerMedia"><span class="type">PopplerMedia</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>the mime-type, return value is owned by <a class="link" href="PopplerMedia.html" title="PopplerMedia"><span class="type">PopplerMedia</span></a> and should not be freed</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.14</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="poppler-media-is-embedded"></a><h3>poppler_media_is_embedded ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a>            poppler_media_is_embedded           (<em class="parameter"><code><a class="link" href="PopplerMedia.html" title="PopplerMedia"><span class="type">PopplerMedia</span></a> *poppler_media</code></em>);</pre>
+<p>
+Whether the media clip is embedded in the PDF. If the result is <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#TRUE:CAPS"><code class="literal">TRUE</code></a>, the embedded stream
+can be saved with <a class="link" href="PopplerMedia.html#poppler-media-save" title="poppler_media_save ()"><code class="function">poppler_media_save()</code></a> or <a class="link" href="PopplerMedia.html#poppler-media-save-to-callback" title="poppler_media_save_to_callback ()"><code class="function">poppler_media_save_to_callback()</code></a> function.
+If the result is <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#FALSE:CAPS"><code class="literal">FALSE</code></a>, the media clip filename can be retrieved with
+<a class="link" href="PopplerMedia.html#poppler-media-get-filename" title="poppler_media_get_filename ()"><code class="function">poppler_media_get_filename()</code></a> function.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>poppler_media</code></em> :</span></p></td>
+<td>a <a class="link" href="PopplerMedia.html" title="PopplerMedia"><span class="type">PopplerMedia</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#TRUE:CAPS"><code class="literal">TRUE</code></a> if media clip is embedded, <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#FALSE:CAPS"><code class="literal">FALSE</code></a> otherwise</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.14</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="poppler-media-save"></a><h3>poppler_media_save ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a>            poppler_media_save                  (<em class="parameter"><code><a class="link" href="PopplerMedia.html" title="PopplerMedia"><span class="type">PopplerMedia</span></a> *poppler_media</code></em>,
+                                                         <em class="parameter"><code>const <span class="type">char</span> *filename</code></em>,
+                                                         <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Error-Reporting.html#GError"><span class="type">GError</span></a> **error</code></em>);</pre>
+<p>
+Saves embedded stream of <em class="parameter"><code>poppler_media</code></em> to a file indicated by <em class="parameter"><code>filename</code></em>.
+If <em class="parameter"><code>error</code></em> is set, <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#FALSE:CAPS"><code class="literal">FALSE</code></a> will be returned.
+Possible errors include those in the <a href="http://library.gnome.org/devel/glib/unstable/glib-File-Utilities.html#G-FILE-ERROR:CAPS"><span class="type">G_FILE_ERROR</span></a> domain
+and whatever the save function generates.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>poppler_media</code></em> :</span></p></td>
+<td>a <a class="link" href="PopplerMedia.html" title="PopplerMedia"><span class="type">PopplerMedia</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>filename</code></em> :</span></p></td>
+<td>name of file to save</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>error</code></em> :</span></p></td>
+<td>return location for error, or <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#NULL:CAPS"><code class="literal">NULL</code></a>. <span class="annotation">[<acronym title="NULL is ok, both for passing and for returning."><span class="acronym">allow-none</span></acronym>]</span>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#TRUE:CAPS"><code class="literal">TRUE</code></a>, if the file successfully saved</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.14</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="poppler-media-save-to-callback"></a><h3>poppler_media_save_to_callback ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a>            poppler_media_save_to_callback      (<em class="parameter"><code><a class="link" href="PopplerMedia.html" title="PopplerMedia"><span class="type">PopplerMedia</span></a> *poppler_media</code></em>,
+                                                         <em class="parameter"><code><a class="link" href="PopplerMedia.html#PopplerMediaSaveFunc" title="PopplerMediaSaveFunc ()"><span class="type">PopplerMediaSaveFunc</span></a> save_func</code></em>,
+                                                         <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gpointer"><span class="type">gpointer</span></a> user_data</code></em>,
+                                                         <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Error-Reporting.html#GError"><span class="type">GError</span></a> **error</code></em>);</pre>
+<p>
+Saves embedded stream of <em class="parameter"><code>poppler_media</code></em> by feeding the produced data to <em class="parameter"><code>save_func</code></em>. Can be used
+when you want to store the media clip stream to something other than a file, such as
+an in-memory buffer or a socket. If <em class="parameter"><code>error</code></em> is set, <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#FALSE:CAPS"><code class="literal">FALSE</code></a> will be
+returned. Possible errors include those in the <a href="http://library.gnome.org/devel/glib/unstable/glib-File-Utilities.html#G-FILE-ERROR:CAPS"><span class="type">G_FILE_ERROR</span></a> domain and
+whatever the save function generates.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>poppler_media</code></em> :</span></p></td>
+<td>a <a class="link" href="PopplerMedia.html" title="PopplerMedia"><span class="type">PopplerMedia</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>save_func</code></em> :</span></p></td>
+<td>a function that is called to save each block of data that the save routine generates. <span class="annotation">[<acronym title="The callback is valid only during the call to the method."><span class="acronym">scope call</span></acronym>]</span>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>user_data</code></em> :</span></p></td>
+<td>user data to pass to the save function.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>error</code></em> :</span></p></td>
+<td>return location for error, or <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#NULL:CAPS"><code class="literal">NULL</code></a>. <span class="annotation">[<acronym title="NULL is ok, both for passing and for returning."><span class="acronym">allow-none</span></acronym>]</span>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#TRUE:CAPS"><code class="literal">TRUE</code></a>, if the save successfully completed</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.14</p>
+</div>
+</div>
+</div>
+<div class="footer">
+<hr>
+          Generated by GTK-Doc V1.18</div>
+</body>
+</html>
\ No newline at end of file
diff --git a/glib/reference/html/PopplerMovie.html b/glib/reference/html/PopplerMovie.html
new file mode 100644 (file)
index 0000000..77d90ac
--- /dev/null
@@ -0,0 +1,147 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>PopplerMovie</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.76.1">
+<link rel="home" href="index.html" title="Poppler Reference Manual">
+<link rel="up" href="ch01.html" title="Poppler">
+<link rel="prev" href="PopplerMedia.html" title="PopplerMedia">
+<link rel="next" href="poppler-Version-and-Features-Information.html" title="Version and Features Information">
+<meta name="generator" content="GTK-Doc V1.18 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="2">
+<tr valign="middle">
+<td><a accesskey="p" href="PopplerMedia.html"><img src="left.png" width="24" height="24" border="0" alt="Prev"></a></td>
+<td><a accesskey="u" href="ch01.html"><img src="up.png" width="24" height="24" border="0" alt="Up"></a></td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="24" height="24" border="0" alt="Home"></a></td>
+<th width="100%" align="center">Poppler Reference Manual</th>
+<td><a accesskey="n" href="poppler-Version-and-Features-Information.html"><img src="right.png" width="24" height="24" border="0" alt="Next"></a></td>
+</tr>
+<tr><td colspan="5" class="shortcuts">
+<a href="#PopplerMovie.synopsis" class="shortcut">Top</a>
+                   | 
+                  <a href="#PopplerMovie.description" class="shortcut">Description</a>
+                   | 
+                  <a href="#PopplerMovie.object-hierarchy" class="shortcut">Object Hierarchy</a>
+</td></tr>
+</table>
+<div class="refentry">
+<a name="PopplerMovie"></a><div class="titlepage"></div>
+<div class="refnamediv"><table width="100%"><tr>
+<td valign="top">
+<h2><span class="refentrytitle"><a name="PopplerMovie.top_of_page"></a>PopplerMovie</span></h2>
+<p>PopplerMovie — Movies</p>
+</td>
+<td valign="top" align="right"></td>
+</tr></table></div>
+<div class="refsynopsisdiv">
+<a name="PopplerMovie.synopsis"></a><h2>Synopsis</h2>
+<pre class="synopsis">
+#include &lt;poppler.h&gt;
+
+                    <a class="link" href="PopplerMovie.html#PopplerMovie-struct" title="PopplerMovie">PopplerMovie</a>;
+const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="returnvalue">gchar</span></a> *       <a class="link" href="PopplerMovie.html#poppler-movie-get-filename" title="poppler_movie_get_filename ()">poppler_movie_get_filename</a>          (<em class="parameter"><code><a class="link" href="PopplerMovie.html" title="PopplerMovie"><span class="type">PopplerMovie</span></a> *poppler_movie</code></em>);
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a>            <a class="link" href="PopplerMovie.html#poppler-movie-need-poster" title="poppler_movie_need_poster ()">poppler_movie_need_poster</a>           (<em class="parameter"><code><a class="link" href="PopplerMovie.html" title="PopplerMovie"><span class="type">PopplerMovie</span></a> *poppler_movie</code></em>);
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a>            <a class="link" href="PopplerMovie.html#poppler-movie-show-controls" title="poppler_movie_show_controls ()">poppler_movie_show_controls</a>         (<em class="parameter"><code><a class="link" href="PopplerMovie.html" title="PopplerMovie"><span class="type">PopplerMovie</span></a> *poppler_movie</code></em>);
+</pre>
+</div>
+<div class="refsect1">
+<a name="PopplerMovie.object-hierarchy"></a><h2>Object Hierarchy</h2>
+<pre class="synopsis">
+  <a href="http://library.gnome.org/devel/gobject/unstable/gobject-The-Base-Object-Type.html#GObject">GObject</a>
+   +----PopplerMovie
+</pre>
+</div>
+<div class="refsect1">
+<a name="PopplerMovie.description"></a><h2>Description</h2>
+</div>
+<div class="refsect1">
+<a name="PopplerMovie.details"></a><h2>Details</h2>
+<div class="refsect2">
+<a name="PopplerMovie-struct"></a><h3>PopplerMovie</h3>
+<pre class="programlisting">typedef struct _PopplerMovie PopplerMovie;</pre>
+</div>
+<hr>
+<div class="refsect2">
+<a name="poppler-movie-get-filename"></a><h3>poppler_movie_get_filename ()</h3>
+<pre class="programlisting">const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="returnvalue">gchar</span></a> *       poppler_movie_get_filename          (<em class="parameter"><code><a class="link" href="PopplerMovie.html" title="PopplerMovie"><span class="type">PopplerMovie</span></a> *poppler_movie</code></em>);</pre>
+<p>
+Returns the local filename identifying a self-describing movie file
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>poppler_movie</code></em> :</span></p></td>
+<td>a <a class="link" href="PopplerMovie.html" title="PopplerMovie"><span class="type">PopplerMovie</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>a local filename, return value is owned by <a class="link" href="PopplerMovie.html" title="PopplerMovie"><span class="type">PopplerMovie</span></a> and
+should not be freed</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.14</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="poppler-movie-need-poster"></a><h3>poppler_movie_need_poster ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a>            poppler_movie_need_poster           (<em class="parameter"><code><a class="link" href="PopplerMovie.html" title="PopplerMovie"><span class="type">PopplerMovie</span></a> *poppler_movie</code></em>);</pre>
+<p>
+Returns whether a poster image representing the Movie
+shall be displayed. The poster image must be retrieved
+from the movie file.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>poppler_movie</code></em> :</span></p></td>
+<td>a <a class="link" href="PopplerMovie.html" title="PopplerMovie"><span class="type">PopplerMovie</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#TRUE:CAPS"><code class="literal">TRUE</code></a> if move needs a poster image, <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#FALSE:CAPS"><code class="literal">FALSE</code></a> otherwise</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.14</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="poppler-movie-show-controls"></a><h3>poppler_movie_show_controls ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a>            poppler_movie_show_controls         (<em class="parameter"><code><a class="link" href="PopplerMovie.html" title="PopplerMovie"><span class="type">PopplerMovie</span></a> *poppler_movie</code></em>);</pre>
+<p>
+Returns whether to display a movie controller bar while playing the movie
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>poppler_movie</code></em> :</span></p></td>
+<td>a <a class="link" href="PopplerMovie.html" title="PopplerMovie"><span class="type">PopplerMovie</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#TRUE:CAPS"><code class="literal">TRUE</code></a> if controller bar should be displayed, <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#FALSE:CAPS"><code class="literal">FALSE</code></a> otherwise</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.14</p>
+</div>
+</div>
+</div>
+<div class="footer">
+<hr>
+          Generated by GTK-Doc V1.18</div>
+</body>
+</html>
\ No newline at end of file
diff --git a/glib/reference/html/PopplerPage.html b/glib/reference/html/PopplerPage.html
new file mode 100644 (file)
index 0000000..72e101d
--- /dev/null
@@ -0,0 +1,1868 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>PopplerPage</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.76.1">
+<link rel="home" href="index.html" title="Poppler Reference Manual">
+<link rel="up" href="ch01.html" title="Poppler">
+<link rel="prev" href="PopplerDocument.html" title="PopplerDocument">
+<link rel="next" href="poppler-PopplerAction.html" title="PopplerAction">
+<meta name="generator" content="GTK-Doc V1.18 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="2">
+<tr valign="middle">
+<td><a accesskey="p" href="PopplerDocument.html"><img src="left.png" width="24" height="24" border="0" alt="Prev"></a></td>
+<td><a accesskey="u" href="ch01.html"><img src="up.png" width="24" height="24" border="0" alt="Up"></a></td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="24" height="24" border="0" alt="Home"></a></td>
+<th width="100%" align="center">Poppler Reference Manual</th>
+<td><a accesskey="n" href="poppler-PopplerAction.html"><img src="right.png" width="24" height="24" border="0" alt="Next"></a></td>
+</tr>
+<tr><td colspan="5" class="shortcuts">
+<a href="#PopplerPage.synopsis" class="shortcut">Top</a>
+                   | 
+                  <a href="#PopplerPage.description" class="shortcut">Description</a>
+                   | 
+                  <a href="#PopplerPage.object-hierarchy" class="shortcut">Object Hierarchy</a>
+                   | 
+                  <a href="#PopplerPage.properties" class="shortcut">Properties</a>
+</td></tr>
+</table>
+<div class="refentry">
+<a name="PopplerPage"></a><div class="titlepage"></div>
+<div class="refnamediv"><table width="100%"><tr>
+<td valign="top">
+<h2><span class="refentrytitle"><a name="PopplerPage.top_of_page"></a>PopplerPage</span></h2>
+<p>PopplerPage — Information about a page in a document</p>
+</td>
+<td valign="top" align="right"></td>
+</tr></table></div>
+<div class="refsynopsisdiv">
+<a name="PopplerPage.synopsis"></a><h2>Synopsis</h2>
+<pre class="synopsis">
+#include &lt;poppler.h&gt;
+
+                    <a class="link" href="PopplerPage.html#PopplerPage-struct" title="PopplerPage">PopplerPage</a>;
+                    <a class="link" href="PopplerPage.html#PopplerRectangle" title="PopplerRectangle">PopplerRectangle</a>;
+                    <a class="link" href="PopplerPage.html#PopplerPageTransition" title="PopplerPageTransition">PopplerPageTransition</a>;
+                    <a class="link" href="PopplerPage.html#PopplerLinkMapping" title="PopplerLinkMapping">PopplerLinkMapping</a>;
+                    <a class="link" href="PopplerPage.html#PopplerImageMapping" title="PopplerImageMapping">PopplerImageMapping</a>;
+                    <a class="link" href="PopplerPage.html#PopplerFormFieldMapping" title="PopplerFormFieldMapping">PopplerFormFieldMapping</a>;
+                    <a class="link" href="PopplerPage.html#PopplerAnnotMapping" title="PopplerAnnotMapping">PopplerAnnotMapping</a>;
+enum                <a class="link" href="PopplerPage.html#PopplerPageTransitionType" title="enum PopplerPageTransitionType">PopplerPageTransitionType</a>;
+enum                <a class="link" href="PopplerPage.html#PopplerPageTransitionAlignment" title="enum PopplerPageTransitionAlignment">PopplerPageTransitionAlignment</a>;
+enum                <a class="link" href="PopplerPage.html#PopplerPageTransitionDirection" title="enum PopplerPageTransitionDirection">PopplerPageTransitionDirection</a>;
+enum                <a class="link" href="PopplerPage.html#PopplerSelectionStyle" title="enum PopplerSelectionStyle">PopplerSelectionStyle</a>;
+                    <a class="link" href="PopplerPage.html#PopplerTextAttributes" title="PopplerTextAttributes">PopplerTextAttributes</a>;
+<span class="returnvalue">int</span>                 <a class="link" href="PopplerPage.html#poppler-page-get-index" title="poppler_page_get_index ()">poppler_page_get_index</a>              (<em class="parameter"><code><a class="link" href="PopplerPage.html" title="PopplerPage"><span class="type">PopplerPage</span></a> *page</code></em>);
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="returnvalue">gchar</span></a> *             <a class="link" href="PopplerPage.html#poppler-page-get-label" title="poppler_page_get_label ()">poppler_page_get_label</a>              (<em class="parameter"><code><a class="link" href="PopplerPage.html" title="PopplerPage"><span class="type">PopplerPage</span></a> *page</code></em>);
+<span class="returnvalue">void</span>                <a class="link" href="PopplerPage.html#poppler-page-get-size" title="poppler_page_get_size ()">poppler_page_get_size</a>               (<em class="parameter"><code><a class="link" href="PopplerPage.html" title="PopplerPage"><span class="type">PopplerPage</span></a> *page</code></em>,
+                                                         <em class="parameter"><code><span class="type">double</span> *width</code></em>,
+                                                         <em class="parameter"><code><span class="type">double</span> *height</code></em>);
+<span class="returnvalue">void</span>                <a class="link" href="PopplerPage.html#poppler-page-get-crop-box" title="poppler_page_get_crop_box ()">poppler_page_get_crop_box</a>           (<em class="parameter"><code><a class="link" href="PopplerPage.html" title="PopplerPage"><span class="type">PopplerPage</span></a> *page</code></em>,
+                                                         <em class="parameter"><code><a class="link" href="PopplerPage.html#PopplerRectangle" title="PopplerRectangle"><span class="type">PopplerRectangle</span></a> *rect</code></em>);
+<span class="returnvalue">double</span>              <a class="link" href="PopplerPage.html#poppler-page-get-duration" title="poppler_page_get_duration ()">poppler_page_get_duration</a>           (<em class="parameter"><code><a class="link" href="PopplerPage.html" title="PopplerPage"><span class="type">PopplerPage</span></a> *page</code></em>);
+<a class="link" href="PopplerPage.html#PopplerPageTransition" title="PopplerPageTransition"><span class="returnvalue">PopplerPageTransition</span></a> * <a class="link" href="PopplerPage.html#poppler-page-get-transition" title="poppler_page_get_transition ()">poppler_page_get_transition</a>     (<em class="parameter"><code><a class="link" href="PopplerPage.html" title="PopplerPage"><span class="type">PopplerPage</span></a> *page</code></em>);
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a>            <a class="link" href="PopplerPage.html#poppler-page-get-thumbnail-size" title="poppler_page_get_thumbnail_size ()">poppler_page_get_thumbnail_size</a>     (<em class="parameter"><code><a class="link" href="PopplerPage.html" title="PopplerPage"><span class="type">PopplerPage</span></a> *page</code></em>,
+                                                         <em class="parameter"><code><span class="type">int</span> *width</code></em>,
+                                                         <em class="parameter"><code><span class="type">int</span> *height</code></em>);
+<span class="returnvalue">cairo_surface_t</span> *   <a class="link" href="PopplerPage.html#poppler-page-get-thumbnail" title="poppler_page_get_thumbnail ()">poppler_page_get_thumbnail</a>          (<em class="parameter"><code><a class="link" href="PopplerPage.html" title="PopplerPage"><span class="type">PopplerPage</span></a> *page</code></em>);
+<span class="returnvalue">void</span>                <a class="link" href="PopplerPage.html#poppler-page-render" title="poppler_page_render ()">poppler_page_render</a>                 (<em class="parameter"><code><a class="link" href="PopplerPage.html" title="PopplerPage"><span class="type">PopplerPage</span></a> *page</code></em>,
+                                                         <em class="parameter"><code><span class="type">cairo_t</span> *cairo</code></em>);
+<span class="returnvalue">void</span>                <a class="link" href="PopplerPage.html#poppler-page-render-for-printing" title="poppler_page_render_for_printing ()">poppler_page_render_for_printing</a>    (<em class="parameter"><code><a class="link" href="PopplerPage.html" title="PopplerPage"><span class="type">PopplerPage</span></a> *page</code></em>,
+                                                         <em class="parameter"><code><span class="type">cairo_t</span> *cairo</code></em>);
+<span class="returnvalue">void</span>                <a class="link" href="PopplerPage.html#poppler-page-render-for-printing-with-options" title="poppler_page_render_for_printing_with_options ()">poppler_page_render_for_printing_with_options</a>
+                                                        (<em class="parameter"><code><a class="link" href="PopplerPage.html" title="PopplerPage"><span class="type">PopplerPage</span></a> *page</code></em>,
+                                                         <em class="parameter"><code><span class="type">cairo_t</span> *cairo</code></em>,
+                                                         <em class="parameter"><code><a class="link" href="poppler-poppler.html#PopplerPrintFlags" title="enum PopplerPrintFlags"><span class="type">PopplerPrintFlags</span></a> options</code></em>);
+<span class="returnvalue">void</span>                <a class="link" href="PopplerPage.html#poppler-page-render-to-ps" title="poppler_page_render_to_ps ()">poppler_page_render_to_ps</a>           (<em class="parameter"><code><a class="link" href="PopplerPage.html" title="PopplerPage"><span class="type">PopplerPage</span></a> *page</code></em>,
+                                                         <em class="parameter"><code><a class="link" href="PopplerDocument.html#PopplerPSFile" title="PopplerPSFile"><span class="type">PopplerPSFile</span></a> *ps_file</code></em>);
+<span class="returnvalue">void</span>                <a class="link" href="PopplerPage.html#poppler-page-render-selection" title="poppler_page_render_selection ()">poppler_page_render_selection</a>       (<em class="parameter"><code><a class="link" href="PopplerPage.html" title="PopplerPage"><span class="type">PopplerPage</span></a> *page</code></em>,
+                                                         <em class="parameter"><code><span class="type">cairo_t</span> *cairo</code></em>,
+                                                         <em class="parameter"><code><a class="link" href="PopplerPage.html#PopplerRectangle" title="PopplerRectangle"><span class="type">PopplerRectangle</span></a> *selection</code></em>,
+                                                         <em class="parameter"><code><a class="link" href="PopplerPage.html#PopplerRectangle" title="PopplerRectangle"><span class="type">PopplerRectangle</span></a> *old_selection</code></em>,
+                                                         <em class="parameter"><code><a class="link" href="PopplerPage.html#PopplerSelectionStyle" title="enum PopplerSelectionStyle"><span class="type">PopplerSelectionStyle</span></a> style</code></em>,
+                                                         <em class="parameter"><code><a class="link" href="poppler-poppler.html#PopplerColor" title="PopplerColor"><span class="type">PopplerColor</span></a> *glyph_color</code></em>,
+                                                         <em class="parameter"><code><a class="link" href="poppler-poppler.html#PopplerColor" title="PopplerColor"><span class="type">PopplerColor</span></a> *background_color</code></em>);
+<span class="returnvalue">cairo_region_t</span> *    <a class="link" href="PopplerPage.html#poppler-page-get-selected-region" title="poppler_page_get_selected_region ()">poppler_page_get_selected_region</a>    (<em class="parameter"><code><a class="link" href="PopplerPage.html" title="PopplerPage"><span class="type">PopplerPage</span></a> *page</code></em>,
+                                                         <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gdouble"><span class="type">gdouble</span></a> scale</code></em>,
+                                                         <em class="parameter"><code><a class="link" href="PopplerPage.html#PopplerSelectionStyle" title="enum PopplerSelectionStyle"><span class="type">PopplerSelectionStyle</span></a> style</code></em>,
+                                                         <em class="parameter"><code><a class="link" href="PopplerPage.html#PopplerRectangle" title="PopplerRectangle"><span class="type">PopplerRectangle</span></a> *selection</code></em>);
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Doubly-Linked-Lists.html#GList"><span class="returnvalue">GList</span></a> *             <a class="link" href="PopplerPage.html#poppler-page-get-selection-region" title="poppler_page_get_selection_region ()">poppler_page_get_selection_region</a>   (<em class="parameter"><code><a class="link" href="PopplerPage.html" title="PopplerPage"><span class="type">PopplerPage</span></a> *page</code></em>,
+                                                         <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gdouble"><span class="type">gdouble</span></a> scale</code></em>,
+                                                         <em class="parameter"><code><a class="link" href="PopplerPage.html#PopplerSelectionStyle" title="enum PopplerSelectionStyle"><span class="type">PopplerSelectionStyle</span></a> style</code></em>,
+                                                         <em class="parameter"><code><a class="link" href="PopplerPage.html#PopplerRectangle" title="PopplerRectangle"><span class="type">PopplerRectangle</span></a> *selection</code></em>);
+<span class="returnvalue">void</span>                <a class="link" href="PopplerPage.html#poppler-page-selection-region-free" title="poppler_page_selection_region_free ()">poppler_page_selection_region_free</a>  (<em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Doubly-Linked-Lists.html#GList"><span class="type">GList</span></a> *region</code></em>);
+<span class="returnvalue">char</span> *              <a class="link" href="PopplerPage.html#poppler-page-get-selected-text" title="poppler_page_get_selected_text ()">poppler_page_get_selected_text</a>      (<em class="parameter"><code><a class="link" href="PopplerPage.html" title="PopplerPage"><span class="type">PopplerPage</span></a> *page</code></em>,
+                                                         <em class="parameter"><code><a class="link" href="PopplerPage.html#PopplerSelectionStyle" title="enum PopplerSelectionStyle"><span class="type">PopplerSelectionStyle</span></a> style</code></em>,
+                                                         <em class="parameter"><code><a class="link" href="PopplerPage.html#PopplerRectangle" title="PopplerRectangle"><span class="type">PopplerRectangle</span></a> *selection</code></em>);
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Doubly-Linked-Lists.html#GList"><span class="returnvalue">GList</span></a> *             <a class="link" href="PopplerPage.html#poppler-page-find-text" title="poppler_page_find_text ()">poppler_page_find_text</a>              (<em class="parameter"><code><a class="link" href="PopplerPage.html" title="PopplerPage"><span class="type">PopplerPage</span></a> *page</code></em>,
+                                                         <em class="parameter"><code>const <span class="type">char</span> *text</code></em>);
+<span class="returnvalue">char</span> *              <a class="link" href="PopplerPage.html#poppler-page-get-text" title="poppler_page_get_text ()">poppler_page_get_text</a>               (<em class="parameter"><code><a class="link" href="PopplerPage.html" title="PopplerPage"><span class="type">PopplerPage</span></a> *page</code></em>);
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a>            <a class="link" href="PopplerPage.html#poppler-page-get-text-layout" title="poppler_page_get_text_layout ()">poppler_page_get_text_layout</a>        (<em class="parameter"><code><a class="link" href="PopplerPage.html" title="PopplerPage"><span class="type">PopplerPage</span></a> *page</code></em>,
+                                                         <em class="parameter"><code><a class="link" href="PopplerPage.html#PopplerRectangle" title="PopplerRectangle"><span class="type">PopplerRectangle</span></a> **rectangles</code></em>,
+                                                         <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> *n_rectangles</code></em>);
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Doubly-Linked-Lists.html#GList"><span class="returnvalue">GList</span></a> *             <a class="link" href="PopplerPage.html#poppler-page-get-text-attributes" title="poppler_page_get_text_attributes ()">poppler_page_get_text_attributes</a>    (<em class="parameter"><code><a class="link" href="PopplerPage.html" title="PopplerPage"><span class="type">PopplerPage</span></a> *page</code></em>);
+<span class="returnvalue">void</span>                <a class="link" href="PopplerPage.html#poppler-page-free-text-attributes" title="poppler_page_free_text_attributes ()">poppler_page_free_text_attributes</a>   (<em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Doubly-Linked-Lists.html#GList"><span class="type">GList</span></a> *list</code></em>);
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Doubly-Linked-Lists.html#GList"><span class="returnvalue">GList</span></a> *             <a class="link" href="PopplerPage.html#poppler-page-get-link-mapping" title="poppler_page_get_link_mapping ()">poppler_page_get_link_mapping</a>       (<em class="parameter"><code><a class="link" href="PopplerPage.html" title="PopplerPage"><span class="type">PopplerPage</span></a> *page</code></em>);
+<span class="returnvalue">void</span>                <a class="link" href="PopplerPage.html#poppler-page-free-link-mapping" title="poppler_page_free_link_mapping ()">poppler_page_free_link_mapping</a>      (<em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Doubly-Linked-Lists.html#GList"><span class="type">GList</span></a> *list</code></em>);
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Doubly-Linked-Lists.html#GList"><span class="returnvalue">GList</span></a> *             <a class="link" href="PopplerPage.html#poppler-page-get-image-mapping" title="poppler_page_get_image_mapping ()">poppler_page_get_image_mapping</a>      (<em class="parameter"><code><a class="link" href="PopplerPage.html" title="PopplerPage"><span class="type">PopplerPage</span></a> *page</code></em>);
+<span class="returnvalue">cairo_surface_t</span> *   <a class="link" href="PopplerPage.html#poppler-page-get-image" title="poppler_page_get_image ()">poppler_page_get_image</a>              (<em class="parameter"><code><a class="link" href="PopplerPage.html" title="PopplerPage"><span class="type">PopplerPage</span></a> *page</code></em>,
+                                                         <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="type">gint</span></a> image_id</code></em>);
+<span class="returnvalue">void</span>                <a class="link" href="PopplerPage.html#poppler-page-free-image-mapping" title="poppler_page_free_image_mapping ()">poppler_page_free_image_mapping</a>     (<em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Doubly-Linked-Lists.html#GList"><span class="type">GList</span></a> *list</code></em>);
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Doubly-Linked-Lists.html#GList"><span class="returnvalue">GList</span></a> *             <a class="link" href="PopplerPage.html#poppler-page-get-form-field-mapping" title="poppler_page_get_form_field_mapping ()">poppler_page_get_form_field_mapping</a> (<em class="parameter"><code><a class="link" href="PopplerPage.html" title="PopplerPage"><span class="type">PopplerPage</span></a> *page</code></em>);
+<span class="returnvalue">void</span>                <a class="link" href="PopplerPage.html#poppler-page-free-form-field-mapping" title="poppler_page_free_form_field_mapping ()">poppler_page_free_form_field_mapping</a>
+                                                        (<em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Doubly-Linked-Lists.html#GList"><span class="type">GList</span></a> *list</code></em>);
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Doubly-Linked-Lists.html#GList"><span class="returnvalue">GList</span></a> *             <a class="link" href="PopplerPage.html#poppler-page-get-annot-mapping" title="poppler_page_get_annot_mapping ()">poppler_page_get_annot_mapping</a>      (<em class="parameter"><code><a class="link" href="PopplerPage.html" title="PopplerPage"><span class="type">PopplerPage</span></a> *page</code></em>);
+<span class="returnvalue">void</span>                <a class="link" href="PopplerPage.html#poppler-page-free-annot-mapping" title="poppler_page_free_annot_mapping ()">poppler_page_free_annot_mapping</a>     (<em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Doubly-Linked-Lists.html#GList"><span class="type">GList</span></a> *list</code></em>);
+<span class="returnvalue">void</span>                <a class="link" href="PopplerPage.html#poppler-page-add-annot" title="poppler_page_add_annot ()">poppler_page_add_annot</a>              (<em class="parameter"><code><a class="link" href="PopplerPage.html" title="PopplerPage"><span class="type">PopplerPage</span></a> *page</code></em>,
+                                                         <em class="parameter"><code><a class="link" href="PopplerAnnot.html" title="PopplerAnnot"><span class="type">PopplerAnnot</span></a> *annot</code></em>);
+<a class="link" href="PopplerPage.html#PopplerRectangle" title="PopplerRectangle"><span class="returnvalue">PopplerRectangle</span></a> *  <a class="link" href="PopplerPage.html#poppler-rectangle-new" title="poppler_rectangle_new ()">poppler_rectangle_new</a>               (<em class="parameter"><code><span class="type">void</span></code></em>);
+<a class="link" href="PopplerPage.html#PopplerRectangle" title="PopplerRectangle"><span class="returnvalue">PopplerRectangle</span></a> *  <a class="link" href="PopplerPage.html#poppler-rectangle-copy" title="poppler_rectangle_copy ()">poppler_rectangle_copy</a>              (<em class="parameter"><code><a class="link" href="PopplerPage.html#PopplerRectangle" title="PopplerRectangle"><span class="type">PopplerRectangle</span></a> *rectangle</code></em>);
+<span class="returnvalue">void</span>                <a class="link" href="PopplerPage.html#poppler-rectangle-free" title="poppler_rectangle_free ()">poppler_rectangle_free</a>              (<em class="parameter"><code><a class="link" href="PopplerPage.html#PopplerRectangle" title="PopplerRectangle"><span class="type">PopplerRectangle</span></a> *rectangle</code></em>);
+<a class="link" href="PopplerPage.html#PopplerPageTransition" title="PopplerPageTransition"><span class="returnvalue">PopplerPageTransition</span></a> * <a class="link" href="PopplerPage.html#poppler-page-transition-new" title="poppler_page_transition_new ()">poppler_page_transition_new</a>     (<em class="parameter"><code><span class="type">void</span></code></em>);
+<a class="link" href="PopplerPage.html#PopplerPageTransition" title="PopplerPageTransition"><span class="returnvalue">PopplerPageTransition</span></a> * <a class="link" href="PopplerPage.html#poppler-page-transition-copy" title="poppler_page_transition_copy ()">poppler_page_transition_copy</a>    (<em class="parameter"><code><a class="link" href="PopplerPage.html#PopplerPageTransition" title="PopplerPageTransition"><span class="type">PopplerPageTransition</span></a> *transition</code></em>);
+<span class="returnvalue">void</span>                <a class="link" href="PopplerPage.html#poppler-page-transition-free" title="poppler_page_transition_free ()">poppler_page_transition_free</a>        (<em class="parameter"><code><a class="link" href="PopplerPage.html#PopplerPageTransition" title="PopplerPageTransition"><span class="type">PopplerPageTransition</span></a> *transition</code></em>);
+<a class="link" href="PopplerPage.html#PopplerLinkMapping" title="PopplerLinkMapping"><span class="returnvalue">PopplerLinkMapping</span></a> * <a class="link" href="PopplerPage.html#poppler-link-mapping-new" title="poppler_link_mapping_new ()">poppler_link_mapping_new</a>           (<em class="parameter"><code><span class="type">void</span></code></em>);
+<a class="link" href="PopplerPage.html#PopplerLinkMapping" title="PopplerLinkMapping"><span class="returnvalue">PopplerLinkMapping</span></a> * <a class="link" href="PopplerPage.html#poppler-link-mapping-copy" title="poppler_link_mapping_copy ()">poppler_link_mapping_copy</a>          (<em class="parameter"><code><a class="link" href="PopplerPage.html#PopplerLinkMapping" title="PopplerLinkMapping"><span class="type">PopplerLinkMapping</span></a> *mapping</code></em>);
+<span class="returnvalue">void</span>                <a class="link" href="PopplerPage.html#poppler-link-mapping-free" title="poppler_link_mapping_free ()">poppler_link_mapping_free</a>           (<em class="parameter"><code><a class="link" href="PopplerPage.html#PopplerLinkMapping" title="PopplerLinkMapping"><span class="type">PopplerLinkMapping</span></a> *mapping</code></em>);
+<a class="link" href="PopplerPage.html#PopplerImageMapping" title="PopplerImageMapping"><span class="returnvalue">PopplerImageMapping</span></a> * <a class="link" href="PopplerPage.html#poppler-image-mapping-new" title="poppler_image_mapping_new ()">poppler_image_mapping_new</a>         (<em class="parameter"><code><span class="type">void</span></code></em>);
+<a class="link" href="PopplerPage.html#PopplerImageMapping" title="PopplerImageMapping"><span class="returnvalue">PopplerImageMapping</span></a> * <a class="link" href="PopplerPage.html#poppler-image-mapping-copy" title="poppler_image_mapping_copy ()">poppler_image_mapping_copy</a>        (<em class="parameter"><code><a class="link" href="PopplerPage.html#PopplerImageMapping" title="PopplerImageMapping"><span class="type">PopplerImageMapping</span></a> *mapping</code></em>);
+<span class="returnvalue">void</span>                <a class="link" href="PopplerPage.html#poppler-image-mapping-free" title="poppler_image_mapping_free ()">poppler_image_mapping_free</a>          (<em class="parameter"><code><a class="link" href="PopplerPage.html#PopplerImageMapping" title="PopplerImageMapping"><span class="type">PopplerImageMapping</span></a> *mapping</code></em>);
+<a class="link" href="PopplerPage.html#PopplerFormFieldMapping" title="PopplerFormFieldMapping"><span class="returnvalue">PopplerFormFieldMapping</span></a> * <a class="link" href="PopplerPage.html#poppler-form-field-mapping-new" title="poppler_form_field_mapping_new ()">poppler_form_field_mapping_new</a>
+                                                        (<em class="parameter"><code><span class="type">void</span></code></em>);
+<a class="link" href="PopplerPage.html#PopplerFormFieldMapping" title="PopplerFormFieldMapping"><span class="returnvalue">PopplerFormFieldMapping</span></a> * <a class="link" href="PopplerPage.html#poppler-form-field-mapping-copy" title="poppler_form_field_mapping_copy ()">poppler_form_field_mapping_copy</a>
+                                                        (<em class="parameter"><code><a class="link" href="PopplerPage.html#PopplerFormFieldMapping" title="PopplerFormFieldMapping"><span class="type">PopplerFormFieldMapping</span></a> *mapping</code></em>);
+<span class="returnvalue">void</span>                <a class="link" href="PopplerPage.html#poppler-form-field-mapping-free" title="poppler_form_field_mapping_free ()">poppler_form_field_mapping_free</a>     (<em class="parameter"><code><a class="link" href="PopplerPage.html#PopplerFormFieldMapping" title="PopplerFormFieldMapping"><span class="type">PopplerFormFieldMapping</span></a> *mapping</code></em>);
+<a class="link" href="PopplerPage.html#PopplerAnnotMapping" title="PopplerAnnotMapping"><span class="returnvalue">PopplerAnnotMapping</span></a> * <a class="link" href="PopplerPage.html#poppler-annot-mapping-new" title="poppler_annot_mapping_new ()">poppler_annot_mapping_new</a>         (<em class="parameter"><code><span class="type">void</span></code></em>);
+<a class="link" href="PopplerPage.html#PopplerAnnotMapping" title="PopplerAnnotMapping"><span class="returnvalue">PopplerAnnotMapping</span></a> * <a class="link" href="PopplerPage.html#poppler-annot-mapping-copy" title="poppler_annot_mapping_copy ()">poppler_annot_mapping_copy</a>        (<em class="parameter"><code><a class="link" href="PopplerPage.html#PopplerAnnotMapping" title="PopplerAnnotMapping"><span class="type">PopplerAnnotMapping</span></a> *mapping</code></em>);
+<span class="returnvalue">void</span>                <a class="link" href="PopplerPage.html#poppler-annot-mapping-free" title="poppler_annot_mapping_free ()">poppler_annot_mapping_free</a>          (<em class="parameter"><code><a class="link" href="PopplerPage.html#PopplerAnnotMapping" title="PopplerAnnotMapping"><span class="type">PopplerAnnotMapping</span></a> *mapping</code></em>);
+<a class="link" href="PopplerPage.html#PopplerTextAttributes" title="PopplerTextAttributes"><span class="returnvalue">PopplerTextAttributes</span></a> * <a class="link" href="PopplerPage.html#poppler-text-attributes-new" title="poppler_text_attributes_new ()">poppler_text_attributes_new</a>     (<em class="parameter"><code><span class="type">void</span></code></em>);
+<a class="link" href="PopplerPage.html#PopplerTextAttributes" title="PopplerTextAttributes"><span class="returnvalue">PopplerTextAttributes</span></a> * <a class="link" href="PopplerPage.html#poppler-text-attributes-copy" title="poppler_text_attributes_copy ()">poppler_text_attributes_copy</a>    (<em class="parameter"><code><a class="link" href="PopplerPage.html#PopplerTextAttributes" title="PopplerTextAttributes"><span class="type">PopplerTextAttributes</span></a> *text_attrs</code></em>);
+<span class="returnvalue">void</span>                <a class="link" href="PopplerPage.html#poppler-text-attributes-free" title="poppler_text_attributes_free ()">poppler_text_attributes_free</a>        (<em class="parameter"><code><a class="link" href="PopplerPage.html#PopplerTextAttributes" title="PopplerTextAttributes"><span class="type">PopplerTextAttributes</span></a> *text_attrs</code></em>);
+</pre>
+</div>
+<div class="refsect1">
+<a name="PopplerPage.object-hierarchy"></a><h2>Object Hierarchy</h2>
+<pre class="synopsis">
+  <a href="http://library.gnome.org/devel/gobject/unstable/gobject-The-Base-Object-Type.html#GObject">GObject</a>
+   +----PopplerPage
+</pre>
+</div>
+<div class="refsect1">
+<a name="PopplerPage.properties"></a><h2>Properties</h2>
+<pre class="synopsis">
+  "<a class="link" href="PopplerPage.html#PopplerPage--label" title='The "label" property'>label</a>"                    <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a>*                : Read
+</pre>
+</div>
+<div class="refsect1">
+<a name="PopplerPage.description"></a><h2>Description</h2>
+</div>
+<div class="refsect1">
+<a name="PopplerPage.details"></a><h2>Details</h2>
+<div class="refsect2">
+<a name="PopplerPage-struct"></a><h3>PopplerPage</h3>
+<pre class="programlisting">typedef struct _PopplerPage PopplerPage;</pre>
+</div>
+<hr>
+<div class="refsect2">
+<a name="PopplerRectangle"></a><h3>PopplerRectangle</h3>
+<pre class="programlisting">typedef struct {
+  gdouble x1;
+  gdouble y1;
+  gdouble x2;
+  gdouble y2;
+} PopplerRectangle;
+</pre>
+<p>
+A <a class="link" href="PopplerPage.html#PopplerRectangle" title="PopplerRectangle"><span class="type">PopplerRectangle</span></a> is used to describe
+locations on a page and bounding boxes
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gdouble"><span class="type">gdouble</span></a> <em class="structfield"><code><a name="PopplerRectangle.x1"></a>x1</code></em>;</span></p></td>
+<td>x coordinate of lower left corner</td>
+</tr>
+<tr>
+<td><p><span class="term"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gdouble"><span class="type">gdouble</span></a> <em class="structfield"><code><a name="PopplerRectangle.y1"></a>y1</code></em>;</span></p></td>
+<td>y coordinate of lower left corner</td>
+</tr>
+<tr>
+<td><p><span class="term"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gdouble"><span class="type">gdouble</span></a> <em class="structfield"><code><a name="PopplerRectangle.x2"></a>x2</code></em>;</span></p></td>
+<td>x coordinate of upper right corner</td>
+</tr>
+<tr>
+<td><p><span class="term"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gdouble"><span class="type">gdouble</span></a> <em class="structfield"><code><a name="PopplerRectangle.y2"></a>y2</code></em>;</span></p></td>
+<td>y coordinate of upper right corner</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="PopplerPageTransition"></a><h3>PopplerPageTransition</h3>
+<pre class="programlisting">typedef struct {
+  PopplerPageTransitionType type;
+  PopplerPageTransitionAlignment alignment;
+  PopplerPageTransitionDirection direction;
+  gint duration;
+  gint angle;
+  gdouble scale;
+  gboolean rectangular;
+} PopplerPageTransition;
+</pre>
+<p>
+A <a class="link" href="PopplerPage.html#PopplerPageTransition" title="PopplerPageTransition"><span class="type">PopplerPageTransition</span></a> structures describes a visual transition
+to use when moving between pages during a presentation
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><a class="link" href="PopplerPage.html#PopplerPageTransitionType" title="enum PopplerPageTransitionType"><span class="type">PopplerPageTransitionType</span></a> <em class="structfield"><code><a name="PopplerPageTransition.type"></a>type</code></em>;</span></p></td>
+<td>the type of transtition</td>
+</tr>
+<tr>
+<td><p><span class="term"><a class="link" href="PopplerPage.html#PopplerPageTransitionAlignment" title="enum PopplerPageTransitionAlignment"><span class="type">PopplerPageTransitionAlignment</span></a> <em class="structfield"><code><a name="PopplerPageTransition.alignment"></a>alignment</code></em>;</span></p></td>
+<td>the dimension in which the transition effect shall occur.
+Only for <a class="link" href="PopplerPage.html#POPPLER-PAGE-TRANSITION-SPLIT:CAPS"><span class="type">POPPLER_PAGE_TRANSITION_SPLIT</span></a> and <a class="link" href="PopplerPage.html#POPPLER-PAGE-TRANSITION-BLINDS:CAPS"><span class="type">POPPLER_PAGE_TRANSITION_BLINDS</span></a> transition types</td>
+</tr>
+<tr>
+<td><p><span class="term"><a class="link" href="PopplerPage.html#PopplerPageTransitionDirection" title="enum PopplerPageTransitionDirection"><span class="type">PopplerPageTransitionDirection</span></a> <em class="structfield"><code><a name="PopplerPageTransition.direction"></a>direction</code></em>;</span></p></td>
+<td>the direccion of motion for the transition effect.
+Only for <a class="link" href="PopplerPage.html#POPPLER-PAGE-TRANSITION-SPLIT:CAPS"><span class="type">POPPLER_PAGE_TRANSITION_SPLIT</span></a>, <a class="link" href="PopplerPage.html#POPPLER-PAGE-TRANSITION-BOX:CAPS"><span class="type">POPPLER_PAGE_TRANSITION_BOX</span></a> and <a class="link" href="PopplerPage.html#POPPLER-PAGE-TRANSITION-FLY:CAPS"><span class="type">POPPLER_PAGE_TRANSITION_FLY</span></a>
+transition types</td>
+</tr>
+<tr>
+<td><p><span class="term"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="type">gint</span></a> <em class="structfield"><code><a name="PopplerPageTransition.duration"></a>duration</code></em>;</span></p></td>
+<td>the duration of the transition effect</td>
+</tr>
+<tr>
+<td><p><span class="term"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="type">gint</span></a> <em class="structfield"><code><a name="PopplerPageTransition.angle"></a>angle</code></em>;</span></p></td>
+<td>the direction in which the specified transition effect shall moves,
+expressed in degrees counterclockwise starting from a left-to-right direction.
+Only for <a class="link" href="PopplerPage.html#POPPLER-PAGE-TRANSITION-WIPE:CAPS"><span class="type">POPPLER_PAGE_TRANSITION_WIPE</span></a>, <a class="link" href="PopplerPage.html#POPPLER-PAGE-TRANSITION-GLITTER:CAPS"><span class="type">POPPLER_PAGE_TRANSITION_GLITTER</span></a>, <a class="link" href="PopplerPage.html#POPPLER-PAGE-TRANSITION-FLY:CAPS"><span class="type">POPPLER_PAGE_TRANSITION_FLY</span></a>,
+<a class="link" href="PopplerPage.html#POPPLER-PAGE-TRANSITION-COVER:CAPS"><span class="type">POPPLER_PAGE_TRANSITION_COVER</span></a>, <a class="link" href="PopplerPage.html#POPPLER-PAGE-TRANSITION-UNCOVER:CAPS"><span class="type">POPPLER_PAGE_TRANSITION_UNCOVER</span></a> and <a class="link" href="PopplerPage.html#POPPLER-PAGE-TRANSITION-PUSH:CAPS"><span class="type">POPPLER_PAGE_TRANSITION_PUSH</span></a>
+transition types</td>
+</tr>
+<tr>
+<td><p><span class="term"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gdouble"><span class="type">gdouble</span></a> <em class="structfield"><code><a name="PopplerPageTransition.scale"></a>scale</code></em>;</span></p></td>
+<td>the starting or ending scale at which the changes shall be drawn.
+Only for <a class="link" href="PopplerPage.html#POPPLER-PAGE-TRANSITION-FLY:CAPS"><span class="type">POPPLER_PAGE_TRANSITION_FLY</span></a> transition type</td>
+</tr>
+<tr>
+<td><p><span class="term"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a> <em class="structfield"><code><a name="PopplerPageTransition.rectangular"></a>rectangular</code></em>;</span></p></td>
+<td>whether the area that will be flown is rectangular and opaque.
+Only for <a class="link" href="PopplerPage.html#POPPLER-PAGE-TRANSITION-FLY:CAPS"><span class="type">POPPLER_PAGE_TRANSITION_FLY</span></a> transition type</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="PopplerLinkMapping"></a><h3>PopplerLinkMapping</h3>
+<pre class="programlisting">typedef struct {
+  PopplerRectangle area;
+  PopplerAction *action;
+} PopplerLinkMapping;
+</pre>
+<p>
+A <a class="link" href="PopplerPage.html#PopplerLinkMapping" title="PopplerLinkMapping"><span class="type">PopplerLinkMapping</span></a> structure represents the location
+of <em class="parameter"><code>action</code></em> on the page
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><a class="link" href="PopplerPage.html#PopplerRectangle" title="PopplerRectangle"><span class="type">PopplerRectangle</span></a> <em class="structfield"><code><a name="PopplerLinkMapping.area"></a>area</code></em>;</span></p></td>
+<td>a <a class="link" href="PopplerPage.html#PopplerRectangle" title="PopplerRectangle"><span class="type">PopplerRectangle</span></a> representing an area of the page</td>
+</tr>
+<tr>
+<td><p><span class="term"><a class="link" href="poppler-PopplerAction.html#PopplerAction" title="union PopplerAction"><span class="type">PopplerAction</span></a> *<em class="structfield"><code><a name="PopplerLinkMapping.action"></a>action</code></em>;</span></p></td>
+<td>a <a class="link" href="poppler-PopplerAction.html#PopplerAction" title="union PopplerAction"><span class="type">PopplerAction</span></a>
+</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="PopplerImageMapping"></a><h3>PopplerImageMapping</h3>
+<pre class="programlisting">typedef struct {
+  PopplerRectangle area;
+  gint image_id;       
+} PopplerImageMapping;
+</pre>
+<p>
+A <a class="link" href="PopplerPage.html#PopplerImageMapping" title="PopplerImageMapping"><span class="type">PopplerImageMapping</span></a> structure represents the location
+of an image on the page
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><a class="link" href="PopplerPage.html#PopplerRectangle" title="PopplerRectangle"><span class="type">PopplerRectangle</span></a> <em class="structfield"><code><a name="PopplerImageMapping.area"></a>area</code></em>;</span></p></td>
+<td>a <a class="link" href="PopplerPage.html#PopplerRectangle" title="PopplerRectangle"><span class="type">PopplerRectangle</span></a> representing an area of the page</td>
+</tr>
+<tr>
+<td><p><span class="term"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="type">gint</span></a> <em class="structfield"><code><a name="PopplerImageMapping.image-id"></a>image_id</code></em>;</span></p></td>
+<td>an image identifier</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="PopplerFormFieldMapping"></a><h3>PopplerFormFieldMapping</h3>
+<pre class="programlisting">typedef struct {
+  PopplerRectangle area;
+  PopplerFormField *field;
+} PopplerFormFieldMapping;
+</pre>
+<p>
+A <a class="link" href="PopplerPage.html#PopplerFormFieldMapping" title="PopplerFormFieldMapping"><span class="type">PopplerFormFieldMapping</span></a> structure represents the location
+of <em class="parameter"><code>field</code></em> on the page
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><a class="link" href="PopplerPage.html#PopplerRectangle" title="PopplerRectangle"><span class="type">PopplerRectangle</span></a> <em class="structfield"><code><a name="PopplerFormFieldMapping.area"></a>area</code></em>;</span></p></td>
+<td>a <a class="link" href="PopplerPage.html#PopplerRectangle" title="PopplerRectangle"><span class="type">PopplerRectangle</span></a> representing an area of the page</td>
+</tr>
+<tr>
+<td><p><span class="term"><a class="link" href="PopplerFormField.html" title="PoppplerFormField"><span class="type">PopplerFormField</span></a> *<em class="structfield"><code><a name="PopplerFormFieldMapping.field"></a>field</code></em>;</span></p></td>
+<td>a <a class="link" href="PopplerFormField.html" title="PoppplerFormField"><span class="type">PopplerFormField</span></a>
+</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="PopplerAnnotMapping"></a><h3>PopplerAnnotMapping</h3>
+<pre class="programlisting">typedef struct {
+  PopplerRectangle area;
+  PopplerAnnot *annot;
+} PopplerAnnotMapping;
+</pre>
+<p>
+A <a class="link" href="PopplerPage.html#PopplerAnnotMapping" title="PopplerAnnotMapping"><span class="type">PopplerAnnotMapping</span></a> structure represents the location
+of <em class="parameter"><code>annot</code></em> on the page
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><a class="link" href="PopplerPage.html#PopplerRectangle" title="PopplerRectangle"><span class="type">PopplerRectangle</span></a> <em class="structfield"><code><a name="PopplerAnnotMapping.area"></a>area</code></em>;</span></p></td>
+<td>a <a class="link" href="PopplerPage.html#PopplerRectangle" title="PopplerRectangle"><span class="type">PopplerRectangle</span></a> representing an area of the page</td>
+</tr>
+<tr>
+<td><p><span class="term"><a class="link" href="PopplerAnnot.html" title="PopplerAnnot"><span class="type">PopplerAnnot</span></a> *<em class="structfield"><code><a name="PopplerAnnotMapping.annot"></a>annot</code></em>;</span></p></td>
+<td>a <a class="link" href="PopplerAnnot.html" title="PopplerAnnot"><span class="type">PopplerAnnot</span></a>
+</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="PopplerPageTransitionType"></a><h3>enum PopplerPageTransitionType</h3>
+<pre class="programlisting">typedef enum {
+  POPPLER_PAGE_TRANSITION_REPLACE,
+  POPPLER_PAGE_TRANSITION_SPLIT,
+  POPPLER_PAGE_TRANSITION_BLINDS,
+  POPPLER_PAGE_TRANSITION_BOX,
+  POPPLER_PAGE_TRANSITION_WIPE,
+  POPPLER_PAGE_TRANSITION_DISSOLVE,
+  POPPLER_PAGE_TRANSITION_GLITTER,
+  POPPLER_PAGE_TRANSITION_FLY,
+  POPPLER_PAGE_TRANSITION_PUSH,
+  POPPLER_PAGE_TRANSITION_COVER,
+  POPPLER_PAGE_TRANSITION_UNCOVER,
+  POPPLER_PAGE_TRANSITION_FADE
+} PopplerPageTransitionType;
+</pre>
+<p>
+Page transition types
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><a name="POPPLER-PAGE-TRANSITION-REPLACE:CAPS"></a><span class="term"><code class="literal">POPPLER_PAGE_TRANSITION_REPLACE</code></span></p></td>
+<td>the new page replace the old one
+</td>
+</tr>
+<tr>
+<td><p><a name="POPPLER-PAGE-TRANSITION-SPLIT:CAPS"></a><span class="term"><code class="literal">POPPLER_PAGE_TRANSITION_SPLIT</code></span></p></td>
+<td>two lines sweep across the screen, revealing the new page
+</td>
+</tr>
+<tr>
+<td><p><a name="POPPLER-PAGE-TRANSITION-BLINDS:CAPS"></a><span class="term"><code class="literal">POPPLER_PAGE_TRANSITION_BLINDS</code></span></p></td>
+<td>multiple lines, evenly spaced across the screen, synchronously
+sweep in the same direction to reveal the new page
+</td>
+</tr>
+<tr>
+<td><p><a name="POPPLER-PAGE-TRANSITION-BOX:CAPS"></a><span class="term"><code class="literal">POPPLER_PAGE_TRANSITION_BOX</code></span></p></td>
+<td>a rectangular box sweeps inward from the edges of the page or
+outward from the center revealing the new page
+</td>
+</tr>
+<tr>
+<td><p><a name="POPPLER-PAGE-TRANSITION-WIPE:CAPS"></a><span class="term"><code class="literal">POPPLER_PAGE_TRANSITION_WIPE</code></span></p></td>
+<td>a single line sweeps across the screen from one edge to the other
+revealing the new page
+</td>
+</tr>
+<tr>
+<td><p><a name="POPPLER-PAGE-TRANSITION-DISSOLVE:CAPS"></a><span class="term"><code class="literal">POPPLER_PAGE_TRANSITION_DISSOLVE</code></span></p></td>
+<td>the old page dissolves gradually to reveal the new one
+</td>
+</tr>
+<tr>
+<td><p><a name="POPPLER-PAGE-TRANSITION-GLITTER:CAPS"></a><span class="term"><code class="literal">POPPLER_PAGE_TRANSITION_GLITTER</code></span></p></td>
+<td>similar to <a class="link" href="PopplerPage.html#POPPLER-PAGE-TRANSITION-DISSOLVE:CAPS"><span class="type">POPPLER_PAGE_TRANSITION_DISSOLVE</span></a>, except that the effect
+sweeps across the page in a wide band moving from one side of the screen to the other
+</td>
+</tr>
+<tr>
+<td><p><a name="POPPLER-PAGE-TRANSITION-FLY:CAPS"></a><span class="term"><code class="literal">POPPLER_PAGE_TRANSITION_FLY</code></span></p></td>
+<td>changes are flown out or in to or from a location that is offscreen
+</td>
+</tr>
+<tr>
+<td><p><a name="POPPLER-PAGE-TRANSITION-PUSH:CAPS"></a><span class="term"><code class="literal">POPPLER_PAGE_TRANSITION_PUSH</code></span></p></td>
+<td>the old page slides off the screen while the new page slides in
+</td>
+</tr>
+<tr>
+<td><p><a name="POPPLER-PAGE-TRANSITION-COVER:CAPS"></a><span class="term"><code class="literal">POPPLER_PAGE_TRANSITION_COVER</code></span></p></td>
+<td>the new page slides on to the screen covering the old page
+</td>
+</tr>
+<tr>
+<td><p><a name="POPPLER-PAGE-TRANSITION-UNCOVER:CAPS"></a><span class="term"><code class="literal">POPPLER_PAGE_TRANSITION_UNCOVER</code></span></p></td>
+<td>the old page slides off the screen uncovering the new page
+</td>
+</tr>
+<tr>
+<td><p><a name="POPPLER-PAGE-TRANSITION-FADE:CAPS"></a><span class="term"><code class="literal">POPPLER_PAGE_TRANSITION_FADE</code></span></p></td>
+<td>the new page gradually becomes visible through the old one
+</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="PopplerPageTransitionAlignment"></a><h3>enum PopplerPageTransitionAlignment</h3>
+<pre class="programlisting">typedef enum {
+  POPPLER_PAGE_TRANSITION_HORIZONTAL,
+  POPPLER_PAGE_TRANSITION_VERTICAL
+} PopplerPageTransitionAlignment;
+</pre>
+<p>
+Page transition alignment types for <a class="link" href="PopplerPage.html#POPPLER-PAGE-TRANSITION-SPLIT:CAPS"><span class="type">POPPLER_PAGE_TRANSITION_SPLIT</span></a>
+and <a class="link" href="PopplerPage.html#POPPLER-PAGE-TRANSITION-BLINDS:CAPS"><span class="type">POPPLER_PAGE_TRANSITION_BLINDS</span></a> transition types
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><a name="POPPLER-PAGE-TRANSITION-HORIZONTAL:CAPS"></a><span class="term"><code class="literal">POPPLER_PAGE_TRANSITION_HORIZONTAL</code></span></p></td>
+<td>horizontal dimension
+</td>
+</tr>
+<tr>
+<td><p><a name="POPPLER-PAGE-TRANSITION-VERTICAL:CAPS"></a><span class="term"><code class="literal">POPPLER_PAGE_TRANSITION_VERTICAL</code></span></p></td>
+<td>vertical dimension
+</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="PopplerPageTransitionDirection"></a><h3>enum PopplerPageTransitionDirection</h3>
+<pre class="programlisting">typedef enum {
+  POPPLER_PAGE_TRANSITION_INWARD,
+  POPPLER_PAGE_TRANSITION_OUTWARD
+} PopplerPageTransitionDirection;
+</pre>
+<p>
+Page transition direction types for <a class="link" href="PopplerPage.html#POPPLER-PAGE-TRANSITION-SPLIT:CAPS"><span class="type">POPPLER_PAGE_TRANSITION_SPLIT</span></a>,
+<a class="link" href="PopplerPage.html#POPPLER-PAGE-TRANSITION-BOX:CAPS"><span class="type">POPPLER_PAGE_TRANSITION_BOX</span></a> and <a class="link" href="PopplerPage.html#POPPLER-PAGE-TRANSITION-FLY:CAPS"><span class="type">POPPLER_PAGE_TRANSITION_FLY</span></a> transition types
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><a name="POPPLER-PAGE-TRANSITION-INWARD:CAPS"></a><span class="term"><code class="literal">POPPLER_PAGE_TRANSITION_INWARD</code></span></p></td>
+<td>inward from the edges of the page
+</td>
+</tr>
+<tr>
+<td><p><a name="POPPLER-PAGE-TRANSITION-OUTWARD:CAPS"></a><span class="term"><code class="literal">POPPLER_PAGE_TRANSITION_OUTWARD</code></span></p></td>
+<td>outward from the center of the page
+</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="PopplerSelectionStyle"></a><h3>enum PopplerSelectionStyle</h3>
+<pre class="programlisting">typedef enum {
+  POPPLER_SELECTION_GLYPH,
+  POPPLER_SELECTION_WORD,
+  POPPLER_SELECTION_LINE
+} PopplerSelectionStyle;
+</pre>
+<p>
+Selection styles
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><a name="POPPLER-SELECTION-GLYPH:CAPS"></a><span class="term"><code class="literal">POPPLER_SELECTION_GLYPH</code></span></p></td>
+<td>glyph is the minimum unit for selection
+</td>
+</tr>
+<tr>
+<td><p><a name="POPPLER-SELECTION-WORD:CAPS"></a><span class="term"><code class="literal">POPPLER_SELECTION_WORD</code></span></p></td>
+<td>word is the minimum unit for selection
+</td>
+</tr>
+<tr>
+<td><p><a name="POPPLER-SELECTION-LINE:CAPS"></a><span class="term"><code class="literal">POPPLER_SELECTION_LINE</code></span></p></td>
+<td>line is the minimum unit for selection
+</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="PopplerTextAttributes"></a><h3>PopplerTextAttributes</h3>
+<pre class="programlisting">typedef struct {
+  gchar *font_name;
+  gdouble font_size;
+  gboolean is_underlined;
+  PopplerColor color;
+
+  gint start_index;
+  gint end_index;
+} PopplerTextAttributes;
+</pre>
+<p>
+A <a class="link" href="PopplerPage.html#PopplerTextAttributes" title="PopplerTextAttributes"><span class="type">PopplerTextAttributes</span></a> is used to describe text attributes of a range of text
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *<em class="structfield"><code><a name="PopplerTextAttributes.font-name"></a>font_name</code></em>;</span></p></td>
+<td>font name</td>
+</tr>
+<tr>
+<td><p><span class="term"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gdouble"><span class="type">gdouble</span></a> <em class="structfield"><code><a name="PopplerTextAttributes.font-size"></a>font_size</code></em>;</span></p></td>
+<td>font size</td>
+</tr>
+<tr>
+<td><p><span class="term"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a> <em class="structfield"><code><a name="PopplerTextAttributes.is-underlined"></a>is_underlined</code></em>;</span></p></td>
+<td>if text is underlined</td>
+</tr>
+<tr>
+<td><p><span class="term"><a class="link" href="poppler-poppler.html#PopplerColor" title="PopplerColor"><span class="type">PopplerColor</span></a> <em class="structfield"><code><a name="PopplerTextAttributes.color"></a>color</code></em>;</span></p></td>
+<td>a <a class="link" href="poppler-poppler.html#PopplerColor" title="PopplerColor"><span class="type">PopplerColor</span></a>, the foreground color</td>
+</tr>
+<tr>
+<td><p><span class="term"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="type">gint</span></a> <em class="structfield"><code><a name="PopplerTextAttributes.start-index"></a>start_index</code></em>;</span></p></td>
+<td>start position this text attributes apply</td>
+</tr>
+<tr>
+<td><p><span class="term"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="type">gint</span></a> <em class="structfield"><code><a name="PopplerTextAttributes.end-index"></a>end_index</code></em>;</span></p></td>
+<td>end position this text text attributes apply</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.18</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="poppler-page-get-index"></a><h3>poppler_page_get_index ()</h3>
+<pre class="programlisting"><span class="returnvalue">int</span>                 poppler_page_get_index              (<em class="parameter"><code><a class="link" href="PopplerPage.html" title="PopplerPage"><span class="type">PopplerPage</span></a> *page</code></em>);</pre>
+<p>
+Returns the index of <em class="parameter"><code>page</code></em>
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>page</code></em> :</span></p></td>
+<td>a <a class="link" href="PopplerPage.html" title="PopplerPage"><span class="type">PopplerPage</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>index value of <em class="parameter"><code>page</code></em>
+</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="poppler-page-get-label"></a><h3>poppler_page_get_label ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="returnvalue">gchar</span></a> *             poppler_page_get_label              (<em class="parameter"><code><a class="link" href="PopplerPage.html" title="PopplerPage"><span class="type">PopplerPage</span></a> *page</code></em>);</pre>
+<p>
+Returns the label of <em class="parameter"><code>page</code></em>. Note that page labels
+and page indices might not coincide.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>page</code></em> :</span></p></td>
+<td>a <a class="link" href="PopplerPage.html" title="PopplerPage"><span class="type">PopplerPage</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>a new allocated string containing the label of <em class="parameter"><code>page</code></em>,
+or <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#NULL:CAPS"><code class="literal">NULL</code></a> if <em class="parameter"><code>page</code></em> doesn't have a label</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.16</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="poppler-page-get-size"></a><h3>poppler_page_get_size ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span>                poppler_page_get_size               (<em class="parameter"><code><a class="link" href="PopplerPage.html" title="PopplerPage"><span class="type">PopplerPage</span></a> *page</code></em>,
+                                                         <em class="parameter"><code><span class="type">double</span> *width</code></em>,
+                                                         <em class="parameter"><code><span class="type">double</span> *height</code></em>);</pre>
+<p>
+Gets the size of <em class="parameter"><code>page</code></em> at the current scale and rotation.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>page</code></em> :</span></p></td>
+<td>A <a class="link" href="PopplerPage.html" title="PopplerPage"><span class="type">PopplerPage</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>width</code></em> :</span></p></td>
+<td>return location for the width of <em class="parameter"><code>page</code></em>. <span class="annotation">[<acronym title="Parameter for returning results. Default is transfer full."><span class="acronym">out</span></acronym>][<acronym title="NULL is ok, both for passing and for returning."><span class="acronym">allow-none</span></acronym>]</span>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>height</code></em> :</span></p></td>
+<td>return location for the height of <em class="parameter"><code>page</code></em>. <span class="annotation">[<acronym title="Parameter for returning results. Default is transfer full."><span class="acronym">out</span></acronym>][<acronym title="NULL is ok, both for passing and for returning."><span class="acronym">allow-none</span></acronym>]</span>
+</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="poppler-page-get-crop-box"></a><h3>poppler_page_get_crop_box ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span>                poppler_page_get_crop_box           (<em class="parameter"><code><a class="link" href="PopplerPage.html" title="PopplerPage"><span class="type">PopplerPage</span></a> *page</code></em>,
+                                                         <em class="parameter"><code><a class="link" href="PopplerPage.html#PopplerRectangle" title="PopplerRectangle"><span class="type">PopplerRectangle</span></a> *rect</code></em>);</pre>
+<p>
+Retrurns the crop box of <em class="parameter"><code>page</code></em>
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>page</code></em> :</span></p></td>
+<td>a <a class="link" href="PopplerPage.html" title="PopplerPage"><span class="type">PopplerPage</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>rect</code></em> :</span></p></td>
+<td>a <a class="link" href="PopplerPage.html#PopplerRectangle" title="PopplerRectangle"><span class="type">PopplerRectangle</span></a> to fill. <span class="annotation">[<acronym title="Parameter for returning results. Default is transfer full."><span class="acronym">out</span></acronym>]</span>
+</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="poppler-page-get-duration"></a><h3>poppler_page_get_duration ()</h3>
+<pre class="programlisting"><span class="returnvalue">double</span>              poppler_page_get_duration           (<em class="parameter"><code><a class="link" href="PopplerPage.html" title="PopplerPage"><span class="type">PopplerPage</span></a> *page</code></em>);</pre>
+<p>
+Returns the duration of <em class="parameter"><code>page</code></em>
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>page</code></em> :</span></p></td>
+<td>a <a class="link" href="PopplerPage.html" title="PopplerPage"><span class="type">PopplerPage</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>duration in seconds of <em class="parameter"><code>page</code></em> or -1.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="poppler-page-get-transition"></a><h3>poppler_page_get_transition ()</h3>
+<pre class="programlisting"><a class="link" href="PopplerPage.html#PopplerPageTransition" title="PopplerPageTransition"><span class="returnvalue">PopplerPageTransition</span></a> * poppler_page_get_transition     (<em class="parameter"><code><a class="link" href="PopplerPage.html" title="PopplerPage"><span class="type">PopplerPage</span></a> *page</code></em>);</pre>
+<p>
+Returns the transition effect of <em class="parameter"><code>page</code></em>
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>page</code></em> :</span></p></td>
+<td>a <a class="link" href="PopplerPage.html" title="PopplerPage"><span class="type">PopplerPage</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>a <a class="link" href="PopplerPage.html#PopplerPageTransition" title="PopplerPageTransition"><span class="type">PopplerPageTransition</span></a> or <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#NULL:CAPS"><code class="literal">NULL</code></a>.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="poppler-page-get-thumbnail-size"></a><h3>poppler_page_get_thumbnail_size ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a>            poppler_page_get_thumbnail_size     (<em class="parameter"><code><a class="link" href="PopplerPage.html" title="PopplerPage"><span class="type">PopplerPage</span></a> *page</code></em>,
+                                                         <em class="parameter"><code><span class="type">int</span> *width</code></em>,
+                                                         <em class="parameter"><code><span class="type">int</span> *height</code></em>);</pre>
+<p>
+Returns <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#TRUE:CAPS"><code class="literal">TRUE</code></a> if <em class="parameter"><code>page</code></em> has a thumbnail associated with it.  It also
+fills in <em class="parameter"><code>width</code></em> and <em class="parameter"><code>height</code></em> with the width and height of the
+thumbnail.  The values of width and height are not changed if no
+appropriate thumbnail exists.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>page</code></em> :</span></p></td>
+<td>A <a class="link" href="PopplerPage.html" title="PopplerPage"><span class="type">PopplerPage</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>width</code></em> :</span></p></td>
+<td>(out) return location for width</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>height</code></em> :</span></p></td>
+<td>(out) return location for height</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#TRUE:CAPS"><code class="literal">TRUE</code></a>, if <em class="parameter"><code>page</code></em> has a thumbnail associated with it.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="poppler-page-get-thumbnail"></a><h3>poppler_page_get_thumbnail ()</h3>
+<pre class="programlisting"><span class="returnvalue">cairo_surface_t</span> *   poppler_page_get_thumbnail          (<em class="parameter"><code><a class="link" href="PopplerPage.html" title="PopplerPage"><span class="type">PopplerPage</span></a> *page</code></em>);</pre>
+<p>
+Get the embedded thumbnail for the specified page.  If the document
+doesn't have an embedded thumbnail for the page, this function
+returns <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#NULL:CAPS"><code class="literal">NULL</code></a>.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>page</code></em> :</span></p></td>
+<td>the <a class="link" href="PopplerPage.html" title="PopplerPage"><span class="type">PopplerPage</span></a> to get the thumbnail for</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>the tumbnail as a cairo_surface_t or <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#NULL:CAPS"><code class="literal">NULL</code></a> if the document
+doesn't have a thumbnail for this page.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="poppler-page-render"></a><h3>poppler_page_render ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span>                poppler_page_render                 (<em class="parameter"><code><a class="link" href="PopplerPage.html" title="PopplerPage"><span class="type">PopplerPage</span></a> *page</code></em>,
+                                                         <em class="parameter"><code><span class="type">cairo_t</span> *cairo</code></em>);</pre>
+<p>
+Render the page to the given cairo context. This function
+is for rendering a page that will be displayed. If you want
+to render a page that will be printed use
+<a class="link" href="PopplerPage.html#poppler-page-render-for-printing" title="poppler_page_render_for_printing ()"><code class="function">poppler_page_render_for_printing()</code></a> instead
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>page</code></em> :</span></p></td>
+<td>the page to render from</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>cairo</code></em> :</span></p></td>
+<td>cairo context to render to</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="poppler-page-render-for-printing"></a><h3>poppler_page_render_for_printing ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span>                poppler_page_render_for_printing    (<em class="parameter"><code><a class="link" href="PopplerPage.html" title="PopplerPage"><span class="type">PopplerPage</span></a> *page</code></em>,
+                                                         <em class="parameter"><code><span class="type">cairo_t</span> *cairo</code></em>);</pre>
+<p>
+Render the page to the given cairo context for printing.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>page</code></em> :</span></p></td>
+<td>the page to render from</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>cairo</code></em> :</span></p></td>
+<td>cairo context to render to</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="poppler-page-render-for-printing-with-options"></a><h3>poppler_page_render_for_printing_with_options ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span>                poppler_page_render_for_printing_with_options
+                                                        (<em class="parameter"><code><a class="link" href="PopplerPage.html" title="PopplerPage"><span class="type">PopplerPage</span></a> *page</code></em>,
+                                                         <em class="parameter"><code><span class="type">cairo_t</span> *cairo</code></em>,
+                                                         <em class="parameter"><code><a class="link" href="poppler-poppler.html#PopplerPrintFlags" title="enum PopplerPrintFlags"><span class="type">PopplerPrintFlags</span></a> options</code></em>);</pre>
+<p>
+Render the page to the given cairo context for printing
+with the specified options
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>page</code></em> :</span></p></td>
+<td>the page to render from</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>cairo</code></em> :</span></p></td>
+<td>cairo context to render to</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>options</code></em> :</span></p></td>
+<td>print options</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.16</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="poppler-page-render-to-ps"></a><h3>poppler_page_render_to_ps ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span>                poppler_page_render_to_ps           (<em class="parameter"><code><a class="link" href="PopplerPage.html" title="PopplerPage"><span class="type">PopplerPage</span></a> *page</code></em>,
+                                                         <em class="parameter"><code><a class="link" href="PopplerDocument.html#PopplerPSFile" title="PopplerPSFile"><span class="type">PopplerPSFile</span></a> *ps_file</code></em>);</pre>
+<p>
+Render the page on a postscript file
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>page</code></em> :</span></p></td>
+<td>a <a class="link" href="PopplerPage.html" title="PopplerPage"><span class="type">PopplerPage</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>ps_file</code></em> :</span></p></td>
+<td>the PopplerPSFile to render to</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="poppler-page-render-selection"></a><h3>poppler_page_render_selection ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span>                poppler_page_render_selection       (<em class="parameter"><code><a class="link" href="PopplerPage.html" title="PopplerPage"><span class="type">PopplerPage</span></a> *page</code></em>,
+                                                         <em class="parameter"><code><span class="type">cairo_t</span> *cairo</code></em>,
+                                                         <em class="parameter"><code><a class="link" href="PopplerPage.html#PopplerRectangle" title="PopplerRectangle"><span class="type">PopplerRectangle</span></a> *selection</code></em>,
+                                                         <em class="parameter"><code><a class="link" href="PopplerPage.html#PopplerRectangle" title="PopplerRectangle"><span class="type">PopplerRectangle</span></a> *old_selection</code></em>,
+                                                         <em class="parameter"><code><a class="link" href="PopplerPage.html#PopplerSelectionStyle" title="enum PopplerSelectionStyle"><span class="type">PopplerSelectionStyle</span></a> style</code></em>,
+                                                         <em class="parameter"><code><a class="link" href="poppler-poppler.html#PopplerColor" title="PopplerColor"><span class="type">PopplerColor</span></a> *glyph_color</code></em>,
+                                                         <em class="parameter"><code><a class="link" href="poppler-poppler.html#PopplerColor" title="PopplerColor"><span class="type">PopplerColor</span></a> *background_color</code></em>);</pre>
+<p>
+Render the selection specified by <em class="parameter"><code>selection</code></em> for <em class="parameter"><code>page</code></em> to
+the given cairo context.  The selection will be rendered, using
+<em class="parameter"><code>glyph_color</code></em> for the glyphs and <em class="parameter"><code>background_color</code></em> for the selection
+background.
+</p>
+<p>
+If non-NULL, <em class="parameter"><code>old_selection</code></em> specifies the selection that is already
+rendered to <em class="parameter"><code>cairo</code></em>, in which case this function will (some day)
+only render the changed part of the selection.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>page</code></em> :</span></p></td>
+<td>the <a class="link" href="PopplerPage.html" title="PopplerPage"><span class="type">PopplerPage</span></a> for which to render selection</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>cairo</code></em> :</span></p></td>
+<td>cairo context to render to</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>selection</code></em> :</span></p></td>
+<td>start and end point of selection as a rectangle</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>old_selection</code></em> :</span></p></td>
+<td>previous selection</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>style</code></em> :</span></p></td>
+<td>a <a class="link" href="PopplerPage.html#PopplerSelectionStyle" title="enum PopplerSelectionStyle"><span class="type">PopplerSelectionStyle</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>glyph_color</code></em> :</span></p></td>
+<td>color to use for drawing glyphs</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>background_color</code></em> :</span></p></td>
+<td>color to use for the selection background</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="poppler-page-get-selected-region"></a><h3>poppler_page_get_selected_region ()</h3>
+<pre class="programlisting"><span class="returnvalue">cairo_region_t</span> *    poppler_page_get_selected_region    (<em class="parameter"><code><a class="link" href="PopplerPage.html" title="PopplerPage"><span class="type">PopplerPage</span></a> *page</code></em>,
+                                                         <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gdouble"><span class="type">gdouble</span></a> scale</code></em>,
+                                                         <em class="parameter"><code><a class="link" href="PopplerPage.html#PopplerSelectionStyle" title="enum PopplerSelectionStyle"><span class="type">PopplerSelectionStyle</span></a> style</code></em>,
+                                                         <em class="parameter"><code><a class="link" href="PopplerPage.html#PopplerRectangle" title="PopplerRectangle"><span class="type">PopplerRectangle</span></a> *selection</code></em>);</pre>
+<p>
+Returns a region containing the area that would be rendered by
+<a class="link" href="PopplerPage.html#poppler-page-render-selection" title="poppler_page_render_selection ()"><code class="function">poppler_page_render_selection()</code></a>.
+The returned region must be freed with <code class="function">cairo_region_destroy()</code>
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>page</code></em> :</span></p></td>
+<td>a <a class="link" href="PopplerPage.html" title="PopplerPage"><span class="type">PopplerPage</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>scale</code></em> :</span></p></td>
+<td>scale specified as pixels per point</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>style</code></em> :</span></p></td>
+<td>a <a class="link" href="PopplerPage.html#PopplerSelectionStyle" title="enum PopplerSelectionStyle"><span class="type">PopplerSelectionStyle</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>selection</code></em> :</span></p></td>
+<td>start and end point of selection as a rectangle</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>a cairo_region_t. <span class="annotation">[<acronym title="Free data after the code is done."><span class="acronym">transfer full</span></acronym>]</span>
+</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.16</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="poppler-page-get-selection-region"></a><h3>poppler_page_get_selection_region ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Doubly-Linked-Lists.html#GList"><span class="returnvalue">GList</span></a> *             poppler_page_get_selection_region   (<em class="parameter"><code><a class="link" href="PopplerPage.html" title="PopplerPage"><span class="type">PopplerPage</span></a> *page</code></em>,
+                                                         <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gdouble"><span class="type">gdouble</span></a> scale</code></em>,
+                                                         <em class="parameter"><code><a class="link" href="PopplerPage.html#PopplerSelectionStyle" title="enum PopplerSelectionStyle"><span class="type">PopplerSelectionStyle</span></a> style</code></em>,
+                                                         <em class="parameter"><code><a class="link" href="PopplerPage.html#PopplerRectangle" title="PopplerRectangle"><span class="type">PopplerRectangle</span></a> *selection</code></em>);</pre>
+<div class="warning" style="margin-left: 0.5in; margin-right: 0.5in;">
+<h3 class="title">Warning</h3>
+<p><code class="literal">poppler_page_get_selection_region</code> has been deprecated since version 0.16 and should not be used in newly-written code. Use <a class="link" href="PopplerPage.html#poppler-page-get-selected-region" title="poppler_page_get_selected_region ()"><code class="function">poppler_page_get_selected_region()</code></a> instead.</p>
+</div>
+<p>
+Returns a region containing the area that would be rendered by
+<a class="link" href="PopplerPage.html#poppler-page-render-selection" title="poppler_page_render_selection ()"><code class="function">poppler_page_render_selection()</code></a> as a <a href="http://library.gnome.org/devel/glib/unstable/glib-Doubly-Linked-Lists.html#GList"><span class="type">GList</span></a> of
+<a class="link" href="PopplerPage.html#PopplerRectangle" title="PopplerRectangle"><span class="type">PopplerRectangle</span></a>. The returned list must be freed with
+<a class="link" href="PopplerPage.html#poppler-page-selection-region-free" title="poppler_page_selection_region_free ()"><code class="function">poppler_page_selection_region_free()</code></a>.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>page</code></em> :</span></p></td>
+<td>a <a class="link" href="PopplerPage.html" title="PopplerPage"><span class="type">PopplerPage</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>scale</code></em> :</span></p></td>
+<td>scale specified as pixels per point</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>style</code></em> :</span></p></td>
+<td>a <a class="link" href="PopplerPage.html#PopplerSelectionStyle" title="enum PopplerSelectionStyle"><span class="type">PopplerSelectionStyle</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>selection</code></em> :</span></p></td>
+<td>start and end point of selection as a rectangle</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>a <a href="http://library.gnome.org/devel/glib/unstable/glib-Doubly-Linked-Lists.html#GList"><span class="type">GList</span></a> of <a class="link" href="PopplerPage.html#PopplerRectangle" title="PopplerRectangle"><span class="type">PopplerRectangle</span></a>. <span class="annotation">[<acronym title="Generics and defining elements of containers and arrays."><span class="acronym">element-type</span></acronym> PopplerRectangle][<acronym title="Free data after the code is done."><span class="acronym">transfer full</span></acronym>]</span>
+</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="poppler-page-selection-region-free"></a><h3>poppler_page_selection_region_free ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span>                poppler_page_selection_region_free  (<em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Doubly-Linked-Lists.html#GList"><span class="type">GList</span></a> *region</code></em>);</pre>
+<div class="warning" style="margin-left: 0.5in; margin-right: 0.5in;">
+<h3 class="title">Warning</h3>
+<p><code class="literal">poppler_page_selection_region_free</code> is deprecated and should not be used in newly-written code. 0.16</p>
+</div>
+<p>
+Frees <em class="parameter"><code>region</code></em>
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody><tr>
+<td><p><span class="term"><em class="parameter"><code>region</code></em> :</span></p></td>
+<td>a <a href="http://library.gnome.org/devel/glib/unstable/glib-Doubly-Linked-Lists.html#GList"><span class="type">GList</span></a> of
+<a class="link" href="PopplerPage.html#PopplerRectangle" title="PopplerRectangle"><span class="type">PopplerRectangle</span></a>. <span class="annotation">[<acronym title="Generics and defining elements of containers and arrays."><span class="acronym">element-type</span></acronym> PopplerRectangle]</span>
+</td>
+</tr></tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="poppler-page-get-selected-text"></a><h3>poppler_page_get_selected_text ()</h3>
+<pre class="programlisting"><span class="returnvalue">char</span> *              poppler_page_get_selected_text      (<em class="parameter"><code><a class="link" href="PopplerPage.html" title="PopplerPage"><span class="type">PopplerPage</span></a> *page</code></em>,
+                                                         <em class="parameter"><code><a class="link" href="PopplerPage.html#PopplerSelectionStyle" title="enum PopplerSelectionStyle"><span class="type">PopplerSelectionStyle</span></a> style</code></em>,
+                                                         <em class="parameter"><code><a class="link" href="PopplerPage.html#PopplerRectangle" title="PopplerRectangle"><span class="type">PopplerRectangle</span></a> *selection</code></em>);</pre>
+<p>
+Retrieves the contents of the specified <em class="parameter"><code>selection</code></em> as text.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>page</code></em> :</span></p></td>
+<td>a <a class="link" href="PopplerPage.html" title="PopplerPage"><span class="type">PopplerPage</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>style</code></em> :</span></p></td>
+<td>a <a class="link" href="PopplerPage.html#PopplerSelectionStyle" title="enum PopplerSelectionStyle"><span class="type">PopplerSelectionStyle</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>selection</code></em> :</span></p></td>
+<td>the <a class="link" href="PopplerPage.html#PopplerRectangle" title="PopplerRectangle"><span class="type">PopplerRectangle</span></a> including the text</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>a pointer to the contents of the <em class="parameter"><code>selection</code></em>
+as a string</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.16</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="poppler-page-find-text"></a><h3>poppler_page_find_text ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Doubly-Linked-Lists.html#GList"><span class="returnvalue">GList</span></a> *             poppler_page_find_text              (<em class="parameter"><code><a class="link" href="PopplerPage.html" title="PopplerPage"><span class="type">PopplerPage</span></a> *page</code></em>,
+                                                         <em class="parameter"><code>const <span class="type">char</span> *text</code></em>);</pre>
+<p>
+A <a href="http://library.gnome.org/devel/glib/unstable/glib-Doubly-Linked-Lists.html#GList"><span class="type">GList</span></a> of rectangles for each occurance of the text on the page.
+The coordinates are in PDF points.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>page</code></em> :</span></p></td>
+<td>a <a class="link" href="PopplerPage.html" title="PopplerPage"><span class="type">PopplerPage</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>text</code></em> :</span></p></td>
+<td>the text to search for (UTF-8 encoded)</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>a <a href="http://library.gnome.org/devel/glib/unstable/glib-Doubly-Linked-Lists.html#GList"><span class="type">GList</span></a> of <a class="link" href="PopplerPage.html#PopplerRectangle" title="PopplerRectangle"><span class="type">PopplerRectangle</span></a>,. <span class="annotation">[<acronym title="Generics and defining elements of containers and arrays."><span class="acronym">element-type</span></acronym> PopplerRectangle][<acronym title="Free data after the code is done."><span class="acronym">transfer full</span></acronym>]</span>
+</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="poppler-page-get-text"></a><h3>poppler_page_get_text ()</h3>
+<pre class="programlisting"><span class="returnvalue">char</span> *              poppler_page_get_text               (<em class="parameter"><code><a class="link" href="PopplerPage.html" title="PopplerPage"><span class="type">PopplerPage</span></a> *page</code></em>);</pre>
+<p>
+Retrieves the text of <em class="parameter"><code>page</code></em>.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>page</code></em> :</span></p></td>
+<td>a <a class="link" href="PopplerPage.html" title="PopplerPage"><span class="type">PopplerPage</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>a pointer to the text of the <em class="parameter"><code>page</code></em>
+as a string</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.16</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="poppler-page-get-text-layout"></a><h3>poppler_page_get_text_layout ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a>            poppler_page_get_text_layout        (<em class="parameter"><code><a class="link" href="PopplerPage.html" title="PopplerPage"><span class="type">PopplerPage</span></a> *page</code></em>,
+                                                         <em class="parameter"><code><a class="link" href="PopplerPage.html#PopplerRectangle" title="PopplerRectangle"><span class="type">PopplerRectangle</span></a> **rectangles</code></em>,
+                                                         <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> *n_rectangles</code></em>);</pre>
+<p>
+Obtains the layout of the text as a list of <a class="link" href="PopplerPage.html#PopplerRectangle" title="PopplerRectangle"><span class="type">PopplerRectangle</span></a>
+This array must be freed with <a href="http://library.gnome.org/devel/glib/unstable/glib-Memory-Allocation.html#g-free"><code class="function">g_free()</code></a> when done.
+</p>
+<p>
+The position in the array represents an offset in the text returned by
+<a class="link" href="PopplerPage.html#poppler-page-get-text" title="poppler_page_get_text ()"><code class="function">poppler_page_get_text()</code></a>
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>page</code></em> :</span></p></td>
+<td>A <a class="link" href="PopplerPage.html" title="PopplerPage"><span class="type">PopplerPage</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>rectangles</code></em> :</span></p></td>
+<td>return location for an array of <a class="link" href="PopplerPage.html#PopplerRectangle" title="PopplerRectangle"><span class="type">PopplerRectangle</span></a>. <span class="annotation">[<acronym title="Parameter for returning results. Default is transfer full."><span class="acronym">out</span></acronym>][<acronym title="Parameter points to an array of items."><span class="acronym">array</span></acronym> length=n_rectangles][<acronym title="Free data container after the code is done."><span class="acronym">transfer container</span></acronym>]</span>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>n_rectangles</code></em> :</span></p></td>
+<td>(out) length of returned array</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#TRUE:CAPS"><code class="literal">TRUE</code></a> if the page contains text, <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#FALSE:CAPS"><code class="literal">FALSE</code></a> otherwise</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.16</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="poppler-page-get-text-attributes"></a><h3>poppler_page_get_text_attributes ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Doubly-Linked-Lists.html#GList"><span class="returnvalue">GList</span></a> *             poppler_page_get_text_attributes    (<em class="parameter"><code><a class="link" href="PopplerPage.html" title="PopplerPage"><span class="type">PopplerPage</span></a> *page</code></em>);</pre>
+<p>
+Obtains the attributes of the text as a GList of <a class="link" href="PopplerPage.html#PopplerTextAttributes" title="PopplerTextAttributes"><span class="type">PopplerTextAttributes</span></a>.
+This list must be freed with <a class="link" href="PopplerPage.html#poppler-page-free-text-attributes" title="poppler_page_free_text_attributes ()"><code class="function">poppler_page_free_text_attributes()</code></a> when done.
+</p>
+<p>
+Each list element is a <a class="link" href="PopplerPage.html#PopplerTextAttributes" title="PopplerTextAttributes"><span class="type">PopplerTextAttributes</span></a> struct where start_index and
+end_index indicates the range of text (as returned by <a class="link" href="PopplerPage.html#poppler-page-get-text" title="poppler_page_get_text ()"><code class="function">poppler_page_get_text()</code></a>)
+to which text attributes apply.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>page</code></em> :</span></p></td>
+<td>A <a class="link" href="PopplerPage.html" title="PopplerPage"><span class="type">PopplerPage</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>A <a href="http://library.gnome.org/devel/glib/unstable/glib-Doubly-Linked-Lists.html#GList"><span class="type">GList</span></a> of <a class="link" href="PopplerPage.html#PopplerTextAttributes" title="PopplerTextAttributes"><span class="type">PopplerTextAttributes</span></a>. <span class="annotation">[<acronym title="Generics and defining elements of containers and arrays."><span class="acronym">element-type</span></acronym> PopplerTextAttributes][<acronym title="Free data after the code is done."><span class="acronym">transfer full</span></acronym>]</span>
+</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.18</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="poppler-page-free-text-attributes"></a><h3>poppler_page_free_text_attributes ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span>                poppler_page_free_text_attributes   (<em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Doubly-Linked-Lists.html#GList"><span class="type">GList</span></a> *list</code></em>);</pre>
+<p>
+Frees a list of <a class="link" href="PopplerPage.html#PopplerTextAttributes" title="PopplerTextAttributes"><span class="type">PopplerTextAttributes</span></a>s allocated by
+<a class="link" href="PopplerPage.html#poppler-page-get-text-attributes" title="poppler_page_get_text_attributes ()"><code class="function">poppler_page_get_text_attributes()</code></a>.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody><tr>
+<td><p><span class="term"><em class="parameter"><code>list</code></em> :</span></p></td>
+<td>A list of
+<a class="link" href="PopplerPage.html#PopplerTextAttributes" title="PopplerTextAttributes"><span class="type">PopplerTextAttributes</span></a>s. <span class="annotation">[<acronym title="Generics and defining elements of containers and arrays."><span class="acronym">element-type</span></acronym> PopplerTextAttributes]</span>
+</td>
+</tr></tbody>
+</table></div>
+<p class="since">Since 0.18</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="poppler-page-get-link-mapping"></a><h3>poppler_page_get_link_mapping ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Doubly-Linked-Lists.html#GList"><span class="returnvalue">GList</span></a> *             poppler_page_get_link_mapping       (<em class="parameter"><code><a class="link" href="PopplerPage.html" title="PopplerPage"><span class="type">PopplerPage</span></a> *page</code></em>);</pre>
+<p>
+Returns a list of <a class="link" href="PopplerPage.html#PopplerLinkMapping" title="PopplerLinkMapping"><span class="type">PopplerLinkMapping</span></a> items that map from a
+location on <em class="parameter"><code>page</code></em> to a <a class="link" href="poppler-PopplerAction.html#PopplerAction" title="union PopplerAction"><span class="type">PopplerAction</span></a>.  This list must be freed
+with <a class="link" href="PopplerPage.html#poppler-page-free-link-mapping" title="poppler_page_free_link_mapping ()"><code class="function">poppler_page_free_link_mapping()</code></a> when done.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>page</code></em> :</span></p></td>
+<td>A <a class="link" href="PopplerPage.html" title="PopplerPage"><span class="type">PopplerPage</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>A <a href="http://library.gnome.org/devel/glib/unstable/glib-Doubly-Linked-Lists.html#GList"><span class="type">GList</span></a> of <a class="link" href="PopplerPage.html#PopplerLinkMapping" title="PopplerLinkMapping"><span class="type">PopplerLinkMapping</span></a>. <span class="annotation">[<acronym title="Generics and defining elements of containers and arrays."><span class="acronym">element-type</span></acronym> PopplerLinkMapping][<acronym title="Free data after the code is done."><span class="acronym">transfer full</span></acronym>]</span>
+</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="poppler-page-free-link-mapping"></a><h3>poppler_page_free_link_mapping ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span>                poppler_page_free_link_mapping      (<em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Doubly-Linked-Lists.html#GList"><span class="type">GList</span></a> *list</code></em>);</pre>
+<p>
+Frees a list of <a class="link" href="PopplerPage.html#PopplerLinkMapping" title="PopplerLinkMapping"><span class="type">PopplerLinkMapping</span></a>s allocated by
+<a class="link" href="PopplerPage.html#poppler-page-get-link-mapping" title="poppler_page_get_link_mapping ()"><code class="function">poppler_page_get_link_mapping()</code></a>.  It also frees the <a class="link" href="poppler-PopplerAction.html#PopplerAction" title="union PopplerAction"><span class="type">PopplerAction</span></a>s
+that each mapping contains, so if you want to keep them around, you need to
+copy them with <a class="link" href="poppler-PopplerAction.html#poppler-action-copy" title="poppler_action_copy ()"><code class="function">poppler_action_copy()</code></a>.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody><tr>
+<td><p><span class="term"><em class="parameter"><code>list</code></em> :</span></p></td>
+<td>A list of
+<a class="link" href="PopplerPage.html#PopplerLinkMapping" title="PopplerLinkMapping"><span class="type">PopplerLinkMapping</span></a>s. <span class="annotation">[<acronym title="Generics and defining elements of containers and arrays."><span class="acronym">element-type</span></acronym> PopplerLinkMapping]</span>
+</td>
+</tr></tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="poppler-page-get-image-mapping"></a><h3>poppler_page_get_image_mapping ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Doubly-Linked-Lists.html#GList"><span class="returnvalue">GList</span></a> *             poppler_page_get_image_mapping      (<em class="parameter"><code><a class="link" href="PopplerPage.html" title="PopplerPage"><span class="type">PopplerPage</span></a> *page</code></em>);</pre>
+<p>
+Returns a list of <a class="link" href="PopplerPage.html#PopplerImageMapping" title="PopplerImageMapping"><span class="type">PopplerImageMapping</span></a> items that map from a
+location on <em class="parameter"><code>page</code></em> to an image of the page. This list must be freed
+with <a class="link" href="PopplerPage.html#poppler-page-free-image-mapping" title="poppler_page_free_image_mapping ()"><code class="function">poppler_page_free_image_mapping()</code></a> when done.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>page</code></em> :</span></p></td>
+<td>A <a class="link" href="PopplerPage.html" title="PopplerPage"><span class="type">PopplerPage</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>A <a href="http://library.gnome.org/devel/glib/unstable/glib-Doubly-Linked-Lists.html#GList"><span class="type">GList</span></a> of <a class="link" href="PopplerPage.html#PopplerImageMapping" title="PopplerImageMapping"><span class="type">PopplerImageMapping</span></a>. <span class="annotation">[<acronym title="Generics and defining elements of containers and arrays."><span class="acronym">element-type</span></acronym> PopplerImageMapping][<acronym title="Free data after the code is done."><span class="acronym">transfer full</span></acronym>]</span>
+</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="poppler-page-get-image"></a><h3>poppler_page_get_image ()</h3>
+<pre class="programlisting"><span class="returnvalue">cairo_surface_t</span> *   poppler_page_get_image              (<em class="parameter"><code><a class="link" href="PopplerPage.html" title="PopplerPage"><span class="type">PopplerPage</span></a> *page</code></em>,
+                                                         <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="type">gint</span></a> image_id</code></em>);</pre>
+<p>
+Returns a cairo surface for the image of the <em class="parameter"><code>page</code></em>
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>page</code></em> :</span></p></td>
+<td>A <a class="link" href="PopplerPage.html" title="PopplerPage"><span class="type">PopplerPage</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>image_id</code></em> :</span></p></td>
+<td>The image identifier</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>A cairo surface for the image</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="poppler-page-free-image-mapping"></a><h3>poppler_page_free_image_mapping ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span>                poppler_page_free_image_mapping     (<em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Doubly-Linked-Lists.html#GList"><span class="type">GList</span></a> *list</code></em>);</pre>
+<p>
+Frees a list of <a class="link" href="PopplerPage.html#PopplerImageMapping" title="PopplerImageMapping"><span class="type">PopplerImageMapping</span></a>s allocated by
+<a class="link" href="PopplerPage.html#poppler-page-get-image-mapping" title="poppler_page_get_image_mapping ()"><code class="function">poppler_page_get_image_mapping()</code></a>.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody><tr>
+<td><p><span class="term"><em class="parameter"><code>list</code></em> :</span></p></td>
+<td>A list of
+<a class="link" href="PopplerPage.html#PopplerImageMapping" title="PopplerImageMapping"><span class="type">PopplerImageMapping</span></a>s. <span class="annotation">[<acronym title="Generics and defining elements of containers and arrays."><span class="acronym">element-type</span></acronym> PopplerImageMapping]</span>
+</td>
+</tr></tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="poppler-page-get-form-field-mapping"></a><h3>poppler_page_get_form_field_mapping ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Doubly-Linked-Lists.html#GList"><span class="returnvalue">GList</span></a> *             poppler_page_get_form_field_mapping (<em class="parameter"><code><a class="link" href="PopplerPage.html" title="PopplerPage"><span class="type">PopplerPage</span></a> *page</code></em>);</pre>
+<p>
+Returns a list of <a class="link" href="PopplerPage.html#PopplerFormFieldMapping" title="PopplerFormFieldMapping"><span class="type">PopplerFormFieldMapping</span></a> items that map from a
+location on <em class="parameter"><code>page</code></em> to a form field.  This list must be freed
+with <a class="link" href="PopplerPage.html#poppler-page-free-form-field-mapping" title="poppler_page_free_form_field_mapping ()"><code class="function">poppler_page_free_form_field_mapping()</code></a> when done.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>page</code></em> :</span></p></td>
+<td>A <a class="link" href="PopplerPage.html" title="PopplerPage"><span class="type">PopplerPage</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>A <a href="http://library.gnome.org/devel/glib/unstable/glib-Doubly-Linked-Lists.html#GList"><span class="type">GList</span></a> of <a class="link" href="PopplerPage.html#PopplerFormFieldMapping" title="PopplerFormFieldMapping"><span class="type">PopplerFormFieldMapping</span></a>. <span class="annotation">[<acronym title="Generics and defining elements of containers and arrays."><span class="acronym">element-type</span></acronym> PopplerFormFieldMapping][<acronym title="Free data after the code is done."><span class="acronym">transfer full</span></acronym>]</span>
+</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="poppler-page-free-form-field-mapping"></a><h3>poppler_page_free_form_field_mapping ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span>                poppler_page_free_form_field_mapping
+                                                        (<em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Doubly-Linked-Lists.html#GList"><span class="type">GList</span></a> *list</code></em>);</pre>
+<p>
+Frees a list of <a class="link" href="PopplerPage.html#PopplerFormFieldMapping" title="PopplerFormFieldMapping"><span class="type">PopplerFormFieldMapping</span></a>s allocated by
+<a class="link" href="PopplerPage.html#poppler-page-get-form-field-mapping" title="poppler_page_get_form_field_mapping ()"><code class="function">poppler_page_get_form_field_mapping()</code></a>.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody><tr>
+<td><p><span class="term"><em class="parameter"><code>list</code></em> :</span></p></td>
+<td>A list of
+<a class="link" href="PopplerPage.html#PopplerFormFieldMapping" title="PopplerFormFieldMapping"><span class="type">PopplerFormFieldMapping</span></a>s. <span class="annotation">[<acronym title="Generics and defining elements of containers and arrays."><span class="acronym">element-type</span></acronym> PopplerFormFieldMapping]</span>
+</td>
+</tr></tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="poppler-page-get-annot-mapping"></a><h3>poppler_page_get_annot_mapping ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Doubly-Linked-Lists.html#GList"><span class="returnvalue">GList</span></a> *             poppler_page_get_annot_mapping      (<em class="parameter"><code><a class="link" href="PopplerPage.html" title="PopplerPage"><span class="type">PopplerPage</span></a> *page</code></em>);</pre>
+<p>
+Returns a list of <a class="link" href="PopplerPage.html#PopplerAnnotMapping" title="PopplerAnnotMapping"><span class="type">PopplerAnnotMapping</span></a> items that map from a location on
+<em class="parameter"><code>page</code></em> to a <a class="link" href="PopplerAnnot.html" title="PopplerAnnot"><span class="type">PopplerAnnot</span></a>.  This list must be freed with
+<a class="link" href="PopplerPage.html#poppler-page-free-annot-mapping" title="poppler_page_free_annot_mapping ()"><code class="function">poppler_page_free_annot_mapping()</code></a> when done.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>page</code></em> :</span></p></td>
+<td>A <a class="link" href="PopplerPage.html" title="PopplerPage"><span class="type">PopplerPage</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>A <a href="http://library.gnome.org/devel/glib/unstable/glib-Doubly-Linked-Lists.html#GList"><span class="type">GList</span></a> of <a class="link" href="PopplerPage.html#PopplerAnnotMapping" title="PopplerAnnotMapping"><span class="type">PopplerAnnotMapping</span></a>. <span class="annotation">[<acronym title="Generics and defining elements of containers and arrays."><span class="acronym">element-type</span></acronym> PopplerAnnotMapping][<acronym title="Free data after the code is done."><span class="acronym">transfer full</span></acronym>]</span>
+</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="poppler-page-free-annot-mapping"></a><h3>poppler_page_free_annot_mapping ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span>                poppler_page_free_annot_mapping     (<em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Doubly-Linked-Lists.html#GList"><span class="type">GList</span></a> *list</code></em>);</pre>
+<p>
+Frees a list of <a class="link" href="PopplerPage.html#PopplerAnnotMapping" title="PopplerAnnotMapping"><span class="type">PopplerAnnotMapping</span></a>s allocated by
+<a class="link" href="PopplerPage.html#poppler-page-get-annot-mapping" title="poppler_page_get_annot_mapping ()"><code class="function">poppler_page_get_annot_mapping()</code></a>.  It also unreferences the <a class="link" href="PopplerAnnot.html" title="PopplerAnnot"><span class="type">PopplerAnnot</span></a>s
+that each mapping contains, so if you want to keep them around, you need to
+reference them with <a href="http://library.gnome.org/devel/gobject/unstable/gobject-The-Base-Object-Type.html#g-object-ref"><code class="function">g_object_ref()</code></a>.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody><tr>
+<td><p><span class="term"><em class="parameter"><code>list</code></em> :</span></p></td>
+<td>A list of
+<a class="link" href="PopplerPage.html#PopplerAnnotMapping" title="PopplerAnnotMapping"><span class="type">PopplerAnnotMapping</span></a>s. <span class="annotation">[<acronym title="Generics and defining elements of containers and arrays."><span class="acronym">element-type</span></acronym> PopplerAnnotMapping]</span>
+</td>
+</tr></tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="poppler-page-add-annot"></a><h3>poppler_page_add_annot ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span>                poppler_page_add_annot              (<em class="parameter"><code><a class="link" href="PopplerPage.html" title="PopplerPage"><span class="type">PopplerPage</span></a> *page</code></em>,
+                                                         <em class="parameter"><code><a class="link" href="PopplerAnnot.html" title="PopplerAnnot"><span class="type">PopplerAnnot</span></a> *annot</code></em>);</pre>
+<p>
+Adds annotation <em class="parameter"><code>annot</code></em> to <em class="parameter"><code>page</code></em>.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>page</code></em> :</span></p></td>
+<td>a <a class="link" href="PopplerPage.html" title="PopplerPage"><span class="type">PopplerPage</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>annot</code></em> :</span></p></td>
+<td>a <a class="link" href="PopplerAnnot.html" title="PopplerAnnot"><span class="type">PopplerAnnot</span></a> to add</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.16</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="poppler-rectangle-new"></a><h3>poppler_rectangle_new ()</h3>
+<pre class="programlisting"><a class="link" href="PopplerPage.html#PopplerRectangle" title="PopplerRectangle"><span class="returnvalue">PopplerRectangle</span></a> *  poppler_rectangle_new               (<em class="parameter"><code><span class="type">void</span></code></em>);</pre>
+<p>
+Creates a new <a class="link" href="PopplerPage.html#PopplerRectangle" title="PopplerRectangle"><span class="type">PopplerRectangle</span></a>
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody><tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>a new <a class="link" href="PopplerPage.html#PopplerRectangle" title="PopplerRectangle"><span class="type">PopplerRectangle</span></a>, use <a class="link" href="PopplerPage.html#poppler-rectangle-free" title="poppler_rectangle_free ()"><code class="function">poppler_rectangle_free()</code></a> to free it</td>
+</tr></tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="poppler-rectangle-copy"></a><h3>poppler_rectangle_copy ()</h3>
+<pre class="programlisting"><a class="link" href="PopplerPage.html#PopplerRectangle" title="PopplerRectangle"><span class="returnvalue">PopplerRectangle</span></a> *  poppler_rectangle_copy              (<em class="parameter"><code><a class="link" href="PopplerPage.html#PopplerRectangle" title="PopplerRectangle"><span class="type">PopplerRectangle</span></a> *rectangle</code></em>);</pre>
+<p>
+Creates a copy of <em class="parameter"><code>rectangle</code></em>
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>rectangle</code></em> :</span></p></td>
+<td>a <a class="link" href="PopplerPage.html#PopplerRectangle" title="PopplerRectangle"><span class="type">PopplerRectangle</span></a> to copy</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>a new allocated copy of <em class="parameter"><code>rectangle</code></em>
+</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="poppler-rectangle-free"></a><h3>poppler_rectangle_free ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span>                poppler_rectangle_free              (<em class="parameter"><code><a class="link" href="PopplerPage.html#PopplerRectangle" title="PopplerRectangle"><span class="type">PopplerRectangle</span></a> *rectangle</code></em>);</pre>
+<p>
+Frees the given <a class="link" href="PopplerPage.html#PopplerRectangle" title="PopplerRectangle"><span class="type">PopplerRectangle</span></a>
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody><tr>
+<td><p><span class="term"><em class="parameter"><code>rectangle</code></em> :</span></p></td>
+<td>a <a class="link" href="PopplerPage.html#PopplerRectangle" title="PopplerRectangle"><span class="type">PopplerRectangle</span></a>
+</td>
+</tr></tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="poppler-page-transition-new"></a><h3>poppler_page_transition_new ()</h3>
+<pre class="programlisting"><a class="link" href="PopplerPage.html#PopplerPageTransition" title="PopplerPageTransition"><span class="returnvalue">PopplerPageTransition</span></a> * poppler_page_transition_new     (<em class="parameter"><code><span class="type">void</span></code></em>);</pre>
+<p>
+Creates a new <a class="link" href="PopplerPage.html#PopplerPageTransition" title="PopplerPageTransition"><span class="type">PopplerPageTransition</span></a>
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody><tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>a new <a class="link" href="PopplerPage.html#PopplerPageTransition" title="PopplerPageTransition"><span class="type">PopplerPageTransition</span></a>, use <a class="link" href="PopplerPage.html#poppler-page-transition-free" title="poppler_page_transition_free ()"><code class="function">poppler_page_transition_free()</code></a> to free it</td>
+</tr></tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="poppler-page-transition-copy"></a><h3>poppler_page_transition_copy ()</h3>
+<pre class="programlisting"><a class="link" href="PopplerPage.html#PopplerPageTransition" title="PopplerPageTransition"><span class="returnvalue">PopplerPageTransition</span></a> * poppler_page_transition_copy    (<em class="parameter"><code><a class="link" href="PopplerPage.html#PopplerPageTransition" title="PopplerPageTransition"><span class="type">PopplerPageTransition</span></a> *transition</code></em>);</pre>
+<p>
+Creates a copy of <em class="parameter"><code>transition</code></em>
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>transition</code></em> :</span></p></td>
+<td>a <a class="link" href="PopplerPage.html#PopplerPageTransition" title="PopplerPageTransition"><span class="type">PopplerPageTransition</span></a> to copy</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>a new allocated copy of <em class="parameter"><code>transition</code></em>
+</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="poppler-page-transition-free"></a><h3>poppler_page_transition_free ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span>                poppler_page_transition_free        (<em class="parameter"><code><a class="link" href="PopplerPage.html#PopplerPageTransition" title="PopplerPageTransition"><span class="type">PopplerPageTransition</span></a> *transition</code></em>);</pre>
+<p>
+Frees the given <a class="link" href="PopplerPage.html#PopplerPageTransition" title="PopplerPageTransition"><span class="type">PopplerPageTransition</span></a>
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody><tr>
+<td><p><span class="term"><em class="parameter"><code>transition</code></em> :</span></p></td>
+<td>a <a class="link" href="PopplerPage.html#PopplerPageTransition" title="PopplerPageTransition"><span class="type">PopplerPageTransition</span></a>
+</td>
+</tr></tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="poppler-link-mapping-new"></a><h3>poppler_link_mapping_new ()</h3>
+<pre class="programlisting"><a class="link" href="PopplerPage.html#PopplerLinkMapping" title="PopplerLinkMapping"><span class="returnvalue">PopplerLinkMapping</span></a> * poppler_link_mapping_new           (<em class="parameter"><code><span class="type">void</span></code></em>);</pre>
+<p>
+Creates a new <a class="link" href="PopplerPage.html#PopplerLinkMapping" title="PopplerLinkMapping"><span class="type">PopplerLinkMapping</span></a>
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody><tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>a new <a class="link" href="PopplerPage.html#PopplerLinkMapping" title="PopplerLinkMapping"><span class="type">PopplerLinkMapping</span></a>, use <a class="link" href="PopplerPage.html#poppler-link-mapping-free" title="poppler_link_mapping_free ()"><code class="function">poppler_link_mapping_free()</code></a> to free it</td>
+</tr></tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="poppler-link-mapping-copy"></a><h3>poppler_link_mapping_copy ()</h3>
+<pre class="programlisting"><a class="link" href="PopplerPage.html#PopplerLinkMapping" title="PopplerLinkMapping"><span class="returnvalue">PopplerLinkMapping</span></a> * poppler_link_mapping_copy          (<em class="parameter"><code><a class="link" href="PopplerPage.html#PopplerLinkMapping" title="PopplerLinkMapping"><span class="type">PopplerLinkMapping</span></a> *mapping</code></em>);</pre>
+<p>
+Creates a copy of <em class="parameter"><code>mapping</code></em>
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>mapping</code></em> :</span></p></td>
+<td>a <a class="link" href="PopplerPage.html#PopplerLinkMapping" title="PopplerLinkMapping"><span class="type">PopplerLinkMapping</span></a> to copy</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>a new allocated copy of <em class="parameter"><code>mapping</code></em>
+</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="poppler-link-mapping-free"></a><h3>poppler_link_mapping_free ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span>                poppler_link_mapping_free           (<em class="parameter"><code><a class="link" href="PopplerPage.html#PopplerLinkMapping" title="PopplerLinkMapping"><span class="type">PopplerLinkMapping</span></a> *mapping</code></em>);</pre>
+<p>
+Frees the given <a class="link" href="PopplerPage.html#PopplerLinkMapping" title="PopplerLinkMapping"><span class="type">PopplerLinkMapping</span></a>
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody><tr>
+<td><p><span class="term"><em class="parameter"><code>mapping</code></em> :</span></p></td>
+<td>a <a class="link" href="PopplerPage.html#PopplerLinkMapping" title="PopplerLinkMapping"><span class="type">PopplerLinkMapping</span></a>
+</td>
+</tr></tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="poppler-image-mapping-new"></a><h3>poppler_image_mapping_new ()</h3>
+<pre class="programlisting"><a class="link" href="PopplerPage.html#PopplerImageMapping" title="PopplerImageMapping"><span class="returnvalue">PopplerImageMapping</span></a> * poppler_image_mapping_new         (<em class="parameter"><code><span class="type">void</span></code></em>);</pre>
+<p>
+Creates a new <a class="link" href="PopplerPage.html#PopplerImageMapping" title="PopplerImageMapping"><span class="type">PopplerImageMapping</span></a>
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody><tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>a new <a class="link" href="PopplerPage.html#PopplerImageMapping" title="PopplerImageMapping"><span class="type">PopplerImageMapping</span></a>, use <a class="link" href="PopplerPage.html#poppler-image-mapping-free" title="poppler_image_mapping_free ()"><code class="function">poppler_image_mapping_free()</code></a> to free it</td>
+</tr></tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="poppler-image-mapping-copy"></a><h3>poppler_image_mapping_copy ()</h3>
+<pre class="programlisting"><a class="link" href="PopplerPage.html#PopplerImageMapping" title="PopplerImageMapping"><span class="returnvalue">PopplerImageMapping</span></a> * poppler_image_mapping_copy        (<em class="parameter"><code><a class="link" href="PopplerPage.html#PopplerImageMapping" title="PopplerImageMapping"><span class="type">PopplerImageMapping</span></a> *mapping</code></em>);</pre>
+<p>
+Creates a copy of <em class="parameter"><code>mapping</code></em>
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>mapping</code></em> :</span></p></td>
+<td>a <a class="link" href="PopplerPage.html#PopplerImageMapping" title="PopplerImageMapping"><span class="type">PopplerImageMapping</span></a> to copy</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>a new allocated copy of <em class="parameter"><code>mapping</code></em>
+</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="poppler-image-mapping-free"></a><h3>poppler_image_mapping_free ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span>                poppler_image_mapping_free          (<em class="parameter"><code><a class="link" href="PopplerPage.html#PopplerImageMapping" title="PopplerImageMapping"><span class="type">PopplerImageMapping</span></a> *mapping</code></em>);</pre>
+<p>
+Frees the given <a class="link" href="PopplerPage.html#PopplerImageMapping" title="PopplerImageMapping"><span class="type">PopplerImageMapping</span></a>
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody><tr>
+<td><p><span class="term"><em class="parameter"><code>mapping</code></em> :</span></p></td>
+<td>a <a class="link" href="PopplerPage.html#PopplerImageMapping" title="PopplerImageMapping"><span class="type">PopplerImageMapping</span></a>
+</td>
+</tr></tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="poppler-form-field-mapping-new"></a><h3>poppler_form_field_mapping_new ()</h3>
+<pre class="programlisting"><a class="link" href="PopplerPage.html#PopplerFormFieldMapping" title="PopplerFormFieldMapping"><span class="returnvalue">PopplerFormFieldMapping</span></a> * poppler_form_field_mapping_new
+                                                        (<em class="parameter"><code><span class="type">void</span></code></em>);</pre>
+<p>
+Creates a new <a class="link" href="PopplerPage.html#PopplerFormFieldMapping" title="PopplerFormFieldMapping"><span class="type">PopplerFormFieldMapping</span></a>
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody><tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>a new <a class="link" href="PopplerPage.html#PopplerFormFieldMapping" title="PopplerFormFieldMapping"><span class="type">PopplerFormFieldMapping</span></a>, use <a class="link" href="PopplerPage.html#poppler-form-field-mapping-free" title="poppler_form_field_mapping_free ()"><code class="function">poppler_form_field_mapping_free()</code></a> to free it</td>
+</tr></tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="poppler-form-field-mapping-copy"></a><h3>poppler_form_field_mapping_copy ()</h3>
+<pre class="programlisting"><a class="link" href="PopplerPage.html#PopplerFormFieldMapping" title="PopplerFormFieldMapping"><span class="returnvalue">PopplerFormFieldMapping</span></a> * poppler_form_field_mapping_copy
+                                                        (<em class="parameter"><code><a class="link" href="PopplerPage.html#PopplerFormFieldMapping" title="PopplerFormFieldMapping"><span class="type">PopplerFormFieldMapping</span></a> *mapping</code></em>);</pre>
+<p>
+Creates a copy of <em class="parameter"><code>mapping</code></em>
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>mapping</code></em> :</span></p></td>
+<td>a <a class="link" href="PopplerPage.html#PopplerFormFieldMapping" title="PopplerFormFieldMapping"><span class="type">PopplerFormFieldMapping</span></a> to copy</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>a new allocated copy of <em class="parameter"><code>mapping</code></em>
+</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="poppler-form-field-mapping-free"></a><h3>poppler_form_field_mapping_free ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span>                poppler_form_field_mapping_free     (<em class="parameter"><code><a class="link" href="PopplerPage.html#PopplerFormFieldMapping" title="PopplerFormFieldMapping"><span class="type">PopplerFormFieldMapping</span></a> *mapping</code></em>);</pre>
+<p>
+Frees the given <a class="link" href="PopplerPage.html#PopplerFormFieldMapping" title="PopplerFormFieldMapping"><span class="type">PopplerFormFieldMapping</span></a>
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody><tr>
+<td><p><span class="term"><em class="parameter"><code>mapping</code></em> :</span></p></td>
+<td>a <a class="link" href="PopplerPage.html#PopplerFormFieldMapping" title="PopplerFormFieldMapping"><span class="type">PopplerFormFieldMapping</span></a>
+</td>
+</tr></tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="poppler-annot-mapping-new"></a><h3>poppler_annot_mapping_new ()</h3>
+<pre class="programlisting"><a class="link" href="PopplerPage.html#PopplerAnnotMapping" title="PopplerAnnotMapping"><span class="returnvalue">PopplerAnnotMapping</span></a> * poppler_annot_mapping_new         (<em class="parameter"><code><span class="type">void</span></code></em>);</pre>
+<p>
+Creates a new <a class="link" href="PopplerPage.html#PopplerAnnotMapping" title="PopplerAnnotMapping"><span class="type">PopplerAnnotMapping</span></a>
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody><tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>a new <a class="link" href="PopplerPage.html#PopplerAnnotMapping" title="PopplerAnnotMapping"><span class="type">PopplerAnnotMapping</span></a>, use <a class="link" href="PopplerPage.html#poppler-annot-mapping-free" title="poppler_annot_mapping_free ()"><code class="function">poppler_annot_mapping_free()</code></a> to free it</td>
+</tr></tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="poppler-annot-mapping-copy"></a><h3>poppler_annot_mapping_copy ()</h3>
+<pre class="programlisting"><a class="link" href="PopplerPage.html#PopplerAnnotMapping" title="PopplerAnnotMapping"><span class="returnvalue">PopplerAnnotMapping</span></a> * poppler_annot_mapping_copy        (<em class="parameter"><code><a class="link" href="PopplerPage.html#PopplerAnnotMapping" title="PopplerAnnotMapping"><span class="type">PopplerAnnotMapping</span></a> *mapping</code></em>);</pre>
+<p>
+Creates a copy of <em class="parameter"><code>mapping</code></em>
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>mapping</code></em> :</span></p></td>
+<td>a <a class="link" href="PopplerPage.html#PopplerAnnotMapping" title="PopplerAnnotMapping"><span class="type">PopplerAnnotMapping</span></a> to copy</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>a new allocated copy of <em class="parameter"><code>mapping</code></em>
+</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="poppler-annot-mapping-free"></a><h3>poppler_annot_mapping_free ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span>                poppler_annot_mapping_free          (<em class="parameter"><code><a class="link" href="PopplerPage.html#PopplerAnnotMapping" title="PopplerAnnotMapping"><span class="type">PopplerAnnotMapping</span></a> *mapping</code></em>);</pre>
+<p>
+Frees the given <a class="link" href="PopplerPage.html#PopplerAnnotMapping" title="PopplerAnnotMapping"><span class="type">PopplerAnnotMapping</span></a>
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody><tr>
+<td><p><span class="term"><em class="parameter"><code>mapping</code></em> :</span></p></td>
+<td>a <a class="link" href="PopplerPage.html#PopplerAnnotMapping" title="PopplerAnnotMapping"><span class="type">PopplerAnnotMapping</span></a>
+</td>
+</tr></tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="poppler-text-attributes-new"></a><h3>poppler_text_attributes_new ()</h3>
+<pre class="programlisting"><a class="link" href="PopplerPage.html#PopplerTextAttributes" title="PopplerTextAttributes"><span class="returnvalue">PopplerTextAttributes</span></a> * poppler_text_attributes_new     (<em class="parameter"><code><span class="type">void</span></code></em>);</pre>
+<p>
+Creates a new <a class="link" href="PopplerPage.html#PopplerTextAttributes" title="PopplerTextAttributes"><span class="type">PopplerTextAttributes</span></a>
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody><tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>a new <a class="link" href="PopplerPage.html#PopplerTextAttributes" title="PopplerTextAttributes"><span class="type">PopplerTextAttributes</span></a>, use <a class="link" href="PopplerPage.html#poppler-text-attributes-free" title="poppler_text_attributes_free ()"><code class="function">poppler_text_attributes_free()</code></a> to free it</td>
+</tr></tbody>
+</table></div>
+<p class="since">Since 0.18</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="poppler-text-attributes-copy"></a><h3>poppler_text_attributes_copy ()</h3>
+<pre class="programlisting"><a class="link" href="PopplerPage.html#PopplerTextAttributes" title="PopplerTextAttributes"><span class="returnvalue">PopplerTextAttributes</span></a> * poppler_text_attributes_copy    (<em class="parameter"><code><a class="link" href="PopplerPage.html#PopplerTextAttributes" title="PopplerTextAttributes"><span class="type">PopplerTextAttributes</span></a> *text_attrs</code></em>);</pre>
+<p>
+Creates a copy of <em class="parameter"><code>text_attrs</code></em>
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>text_attrs</code></em> :</span></p></td>
+<td>a <a class="link" href="PopplerPage.html#PopplerTextAttributes" title="PopplerTextAttributes"><span class="type">PopplerTextAttributes</span></a> to copy</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>a new allocated copy of <em class="parameter"><code>text_attrs</code></em>
+</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.18</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="poppler-text-attributes-free"></a><h3>poppler_text_attributes_free ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span>                poppler_text_attributes_free        (<em class="parameter"><code><a class="link" href="PopplerPage.html#PopplerTextAttributes" title="PopplerTextAttributes"><span class="type">PopplerTextAttributes</span></a> *text_attrs</code></em>);</pre>
+<p>
+Frees the given <a class="link" href="PopplerPage.html#PopplerTextAttributes" title="PopplerTextAttributes"><span class="type">PopplerTextAttributes</span></a>
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody><tr>
+<td><p><span class="term"><em class="parameter"><code>text_attrs</code></em> :</span></p></td>
+<td>a <a class="link" href="PopplerPage.html#PopplerTextAttributes" title="PopplerTextAttributes"><span class="type">PopplerTextAttributes</span></a>
+</td>
+</tr></tbody>
+</table></div>
+<p class="since">Since 0.18</p>
+</div>
+</div>
+<div class="refsect1">
+<a name="PopplerPage.property-details"></a><h2>Property Details</h2>
+<div class="refsect2">
+<a name="PopplerPage--label"></a><h3>The <code class="literal">"label"</code> property</h3>
+<pre class="programlisting">  "label"                    <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a>*                : Read</pre>
+<p>
+The label of the page or <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#NULL:CAPS"><code class="literal">NULL</code></a>. See also <a class="link" href="PopplerPage.html#poppler-page-get-label" title="poppler_page_get_label ()"><code class="function">poppler_page_get_label()</code></a>
+</p>
+<p>Default value: NULL</p>
+</div>
+</div>
+</div>
+<div class="footer">
+<hr>
+          Generated by GTK-Doc V1.18</div>
+</body>
+</html>
\ No newline at end of file
diff --git a/glib/reference/html/annotation-glossary.html b/glib/reference/html/annotation-glossary.html
new file mode 100644 (file)
index 0000000..36d0bda
--- /dev/null
@@ -0,0 +1,83 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>Annotation Glossary</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.76.1">
+<link rel="home" href="index.html" title="Poppler Reference Manual">
+<link rel="up" href="index.html" title="Poppler Reference Manual">
+<link rel="prev" href="api-index-0-20.html" title="Index of new symbols in 0.20">
+<meta name="generator" content="GTK-Doc V1.18 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="2">
+<tr valign="middle">
+<td><a accesskey="p" href="api-index-0-20.html"><img src="left.png" width="24" height="24" border="0" alt="Prev"></a></td>
+<td> </td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="24" height="24" border="0" alt="Home"></a></td>
+<th width="100%" align="center">Poppler Reference Manual</th>
+<td> </td>
+</tr>
+<tr><td colspan="5" class="shortcuts">
+<a class="shortcut" href="#glsO">O</a>
+                      | 
+                   <a class="shortcut" href="#glsA">A</a>
+                      | 
+                   <a class="shortcut" href="#glsC">C</a>
+                      | 
+                   <a class="shortcut" href="#glsT">T</a>
+                      | 
+                   <a class="shortcut" href="#glsA">A</a>
+                      | 
+                   <a class="shortcut" href="#glsE">E</a>
+                      | 
+                   <a class="shortcut" href="#glsT">T</a>
+                      | 
+                   <a class="shortcut" href="#glsS">S</a>
+</td></tr>
+</table>
+<div class="glossary">
+<div class="titlepage"><div><div><h2 class="title">
+<a name="annotation-glossary"></a>Annotation Glossary</h2></div></div></div>
+<a name="glsO"></a><h3 class="title">O</h3>
+<dt>
+<a name="annotation-glossterm-out"></a>out</dt>
+<dd><p>Parameter for returning results. Default is <acronym title="Free data after the code is done."><span class="acronym">transfer full</span></acronym>.</p></dd>
+<a name="glsA"></a><h3 class="title">A</h3>
+<dt>
+<a name="annotation-glossterm-allow-none"></a>allow-none</dt>
+<dd><p>NULL is ok, both for passing and for returning.</p></dd>
+<a name="glsC"></a><h3 class="title">C</h3>
+<dt>
+<a name="annotation-glossterm-closure"></a>closure</dt>
+<dd><p>This parameter is a 'user_data', for callbacks; many bindings can pass NULL here.</p></dd>
+<a name="glsT"></a><h3 class="title">T</h3>
+<dt>
+<a name="annotation-glossterm-transfer%20none"></a>transfer none</dt>
+<dd><p>Don't free data after the code is done.</p></dd>
+<a name="glsA"></a><h3 class="title">A</h3>
+<dt>
+<a name="annotation-glossterm-array"></a>array</dt>
+<dd><p>Parameter points to an array of items.</p></dd>
+<a name="glsE"></a><h3 class="title">E</h3>
+<dt>
+<a name="annotation-glossterm-element-type"></a>element-type</dt>
+<dd><p>Generics and defining elements of containers and arrays.</p></dd>
+<a name="glsT"></a><h3 class="title">T</h3>
+<dt>
+<a name="annotation-glossterm-transfer%20container"></a>transfer container</dt>
+<dd><p>Free data container after the code is done.</p></dd>
+<dt>
+<a name="annotation-glossterm-transfer%20full"></a>transfer full</dt>
+<dd><p>Free data after the code is done.</p></dd>
+<a name="glsS"></a><h3 class="title">S</h3>
+<dt>
+<a name="annotation-glossterm-scope%20call"></a>scope call</dt>
+<dd><p>The callback is valid only during the call to the method.</p></dd>
+</div>
+<div class="footer">
+<hr>
+          Generated by GTK-Doc V1.18</div>
+</body>
+</html>
\ No newline at end of file
diff --git a/glib/reference/html/api-index-0-12.html b/glib/reference/html/api-index-0-12.html
new file mode 100644 (file)
index 0000000..75d9c06
--- /dev/null
@@ -0,0 +1,128 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>Index of new symbols in 0.12</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.76.1">
+<link rel="home" href="index.html" title="Poppler Reference Manual">
+<link rel="up" href="index.html" title="Poppler Reference Manual">
+<link rel="prev" href="api-index-deprecated.html" title="Index of deprecated symbols">
+<link rel="next" href="api-index-0-14.html" title="Index of new symbols in 0.14">
+<meta name="generator" content="GTK-Doc V1.18 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="2">
+<tr valign="middle">
+<td><a accesskey="p" href="api-index-deprecated.html"><img src="left.png" width="24" height="24" border="0" alt="Prev"></a></td>
+<td> </td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="24" height="24" border="0" alt="Home"></a></td>
+<th width="100%" align="center">Poppler Reference Manual</th>
+<td><a accesskey="n" href="api-index-0-14.html"><img src="right.png" width="24" height="24" border="0" alt="Next"></a></td>
+</tr>
+<tr><td colspan="5" class="shortcuts">
+<a class="shortcut" href="#idxA">A</a>
+                      | 
+                   <a class="shortcut" href="#idxC">C</a>
+                      | 
+                   <a class="shortcut" href="#idxD">D</a>
+                      | 
+                   <a class="shortcut" href="#idxL">L</a>
+                      | 
+                   <a class="shortcut" href="#idxM">M</a>
+</td></tr>
+</table>
+<div class="index">
+<div class="titlepage"><div><div><h2 class="title">
+<a name="api-index-0-12"></a>Index of new symbols in 0.12</h2></div></div></div>
+<a name="idx"></a><a name="idxA"></a><h3 class="title">A</h3>
+<dt>
+<a class="link" href="PopplerAnnot.html#poppler-annot-markup-get-popup-rectangle" title="poppler_annot_markup_get_popup_rectangle ()">poppler_annot_markup_get_popup_rectangle</a>, function in <a class="link" href="PopplerAnnot.html" title="PopplerAnnot">PopplerAnnot</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="PopplerAnnot.html#poppler-annot-markup-has-popup" title="poppler_annot_markup_has_popup ()">poppler_annot_markup_has_popup</a>, function in <a class="link" href="PopplerAnnot.html" title="PopplerAnnot">PopplerAnnot</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="PopplerAnnot.html#poppler-annot-set-contents" title="poppler_annot_set_contents ()">poppler_annot_set_contents</a>, function in <a class="link" href="PopplerAnnot.html" title="PopplerAnnot">PopplerAnnot</a>
+</dt>
+<dd></dd>
+<a name="idxC"></a><h3 class="title">C</h3>
+<dt>
+<a class="link" href="poppler-Version-and-Features-Information.html#POPPLER-CHECK-VERSION:CAPS" title="POPPLER_CHECK_VERSION()">POPPLER_CHECK_VERSION</a>, macro in <a class="link" href="poppler-Version-and-Features-Information.html" title="Version and Features Information">Version and Features Information</a>
+</dt>
+<dd></dd>
+<a name="idxD"></a><h3 class="title">D</h3>
+<dt>
+<a class="link" href="poppler-poppler.html#poppler-date-parse" title="poppler_date_parse ()">poppler_date_parse</a>, function in <a class="link" href="poppler-poppler.html" title="poppler">poppler</a>
+</dt>
+<dd></dd>
+<a name="idxL"></a><h3 class="title">L</h3>
+<dt>
+<a class="link" href="PopplerDocument.html#poppler-layers-iter-free" title="poppler_layers_iter_free ()">poppler_layers_iter_free</a>, function in <a class="link" href="PopplerDocument.html" title="PopplerDocument">PopplerDocument</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="PopplerDocument.html#poppler-layers-iter-get-child" title="poppler_layers_iter_get_child ()">poppler_layers_iter_get_child</a>, function in <a class="link" href="PopplerDocument.html" title="PopplerDocument">PopplerDocument</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="PopplerDocument.html#poppler-layers-iter-get-layer" title="poppler_layers_iter_get_layer ()">poppler_layers_iter_get_layer</a>, function in <a class="link" href="PopplerDocument.html" title="PopplerDocument">PopplerDocument</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="PopplerDocument.html#poppler-layers-iter-get-title" title="poppler_layers_iter_get_title ()">poppler_layers_iter_get_title</a>, function in <a class="link" href="PopplerDocument.html" title="PopplerDocument">PopplerDocument</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="PopplerDocument.html#poppler-layers-iter-new" title="poppler_layers_iter_new ()">poppler_layers_iter_new</a>, function in <a class="link" href="PopplerDocument.html" title="PopplerDocument">PopplerDocument</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="PopplerDocument.html#poppler-layers-iter-next" title="poppler_layers_iter_next ()">poppler_layers_iter_next</a>, function in <a class="link" href="PopplerDocument.html" title="PopplerDocument">PopplerDocument</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="PopplerLayer.html#poppler-layer-get-radio-button-group-id" title="poppler_layer_get_radio_button_group_id ()">poppler_layer_get_radio_button_group_id</a>, function in <a class="link" href="PopplerLayer.html" title="PopplerLayer">PopplerLayer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="PopplerLayer.html#poppler-layer-get-title" title="poppler_layer_get_title ()">poppler_layer_get_title</a>, function in <a class="link" href="PopplerLayer.html" title="PopplerLayer">PopplerLayer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="PopplerLayer.html#poppler-layer-hide" title="poppler_layer_hide ()">poppler_layer_hide</a>, function in <a class="link" href="PopplerLayer.html" title="PopplerLayer">PopplerLayer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="PopplerLayer.html#poppler-layer-is-parent" title="poppler_layer_is_parent ()">poppler_layer_is_parent</a>, function in <a class="link" href="PopplerLayer.html" title="PopplerLayer">PopplerLayer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="PopplerLayer.html#poppler-layer-is-visible" title="poppler_layer_is_visible ()">poppler_layer_is_visible</a>, function in <a class="link" href="PopplerLayer.html" title="PopplerLayer">PopplerLayer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="PopplerLayer.html#poppler-layer-show" title="poppler_layer_show ()">poppler_layer_show</a>, function in <a class="link" href="PopplerLayer.html" title="PopplerLayer">PopplerLayer</a>
+</dt>
+<dd></dd>
+<a name="idxM"></a><h3 class="title">M</h3>
+<dt>
+<a class="link" href="poppler-Version-and-Features-Information.html#POPPLER-MAJOR-VERSION:CAPS" title="POPPLER_MAJOR_VERSION">POPPLER_MAJOR_VERSION</a>, macro in <a class="link" href="poppler-Version-and-Features-Information.html" title="Version and Features Information">Version and Features Information</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="poppler-Version-and-Features-Information.html#POPPLER-MICRO-VERSION:CAPS" title="POPPLER_MICRO_VERSION">POPPLER_MICRO_VERSION</a>, macro in <a class="link" href="poppler-Version-and-Features-Information.html" title="Version and Features Information">Version and Features Information</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="poppler-Version-and-Features-Information.html#POPPLER-MINOR-VERSION:CAPS" title="POPPLER_MINOR_VERSION">POPPLER_MINOR_VERSION</a>, macro in <a class="link" href="poppler-Version-and-Features-Information.html" title="Version and Features Information">Version and Features Information</a>
+</dt>
+<dd></dd>
+</div>
+<div class="footer">
+<hr>
+          Generated by GTK-Doc V1.18</div>
+</body>
+</html>
\ No newline at end of file
diff --git a/glib/reference/html/api-index-0-14.html b/glib/reference/html/api-index-0-14.html
new file mode 100644 (file)
index 0000000..a5d59ca
--- /dev/null
@@ -0,0 +1,107 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>Index of new symbols in 0.14</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.76.1">
+<link rel="home" href="index.html" title="Poppler Reference Manual">
+<link rel="up" href="index.html" title="Poppler Reference Manual">
+<link rel="prev" href="api-index-0-12.html" title="Index of new symbols in 0.12">
+<link rel="next" href="api-index-0-16.html" title="Index of new symbols in 0.16">
+<meta name="generator" content="GTK-Doc V1.18 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="2">
+<tr valign="middle">
+<td><a accesskey="p" href="api-index-0-12.html"><img src="left.png" width="24" height="24" border="0" alt="Prev"></a></td>
+<td> </td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="24" height="24" border="0" alt="Home"></a></td>
+<th width="100%" align="center">Poppler Reference Manual</th>
+<td><a accesskey="n" href="api-index-0-16.html"><img src="right.png" width="24" height="24" border="0" alt="Next"></a></td>
+</tr>
+<tr><td colspan="5" class="shortcuts">
+<a class="shortcut" href="#idxA">A</a>
+                      | 
+                   <a class="shortcut" href="#idxM">M</a>
+</td></tr>
+</table>
+<div class="index">
+<div class="titlepage"><div><div><h2 class="title">
+<a name="api-index-0-14"></a>Index of new symbols in 0.14</h2></div></div></div>
+<a name="idx"></a><a name="idxA"></a><h3 class="title">A</h3>
+<dt>
+<a class="link" href="poppler-PopplerAction.html#PopplerActionLayerAction" title="enum PopplerActionLayerAction">PopplerActionLayerAction</a>, enum in <a class="link" href="poppler-PopplerAction.html" title="PopplerAction">PopplerAction</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="poppler-PopplerAction.html#PopplerActionMovieOperation" title="enum PopplerActionMovieOperation">PopplerActionMovieOperation</a>, enum in <a class="link" href="poppler-PopplerAction.html" title="PopplerAction">PopplerAction</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="PopplerAnnot.html#poppler-annot-file-attachment-get-attachment" title="poppler_annot_file_attachment_get_attachment ()">poppler_annot_file_attachment_get_attachment</a>, function in <a class="link" href="PopplerAnnot.html" title="PopplerAnnot">PopplerAnnot</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="PopplerAnnot.html#poppler-annot-file-attachment-get-name" title="poppler_annot_file_attachment_get_name ()">poppler_annot_file_attachment_get_name</a>, function in <a class="link" href="PopplerAnnot.html" title="PopplerAnnot">PopplerAnnot</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="PopplerAnnot.html#poppler-annot-get-page-index" title="poppler_annot_get_page_index ()">poppler_annot_get_page_index</a>, function in <a class="link" href="PopplerAnnot.html" title="PopplerAnnot">PopplerAnnot</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="PopplerAnnot.html#poppler-annot-movie-get-movie" title="poppler_annot_movie_get_movie ()">poppler_annot_movie_get_movie</a>, function in <a class="link" href="PopplerAnnot.html" title="PopplerAnnot">PopplerAnnot</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="PopplerAnnot.html#poppler-annot-movie-get-title" title="poppler_annot_movie_get_title ()">poppler_annot_movie_get_title</a>, function in <a class="link" href="PopplerAnnot.html" title="PopplerAnnot">PopplerAnnot</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="PopplerAnnot.html#poppler-annot-screen-get-action" title="poppler_annot_screen_get_action ()">poppler_annot_screen_get_action</a>, function in <a class="link" href="PopplerAnnot.html" title="PopplerAnnot">PopplerAnnot</a>
+</dt>
+<dd></dd>
+<a name="idxM"></a><h3 class="title">M</h3>
+<dt>
+<a class="link" href="PopplerMedia.html#PopplerMediaSaveFunc" title="PopplerMediaSaveFunc ()">PopplerMediaSaveFunc</a>, user_function in <a class="link" href="PopplerMedia.html" title="PopplerMedia">PopplerMedia</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="PopplerMedia.html#poppler-media-get-filename" title="poppler_media_get_filename ()">poppler_media_get_filename</a>, function in <a class="link" href="PopplerMedia.html" title="PopplerMedia">PopplerMedia</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="PopplerMedia.html#poppler-media-get-mime-type" title="poppler_media_get_mime_type ()">poppler_media_get_mime_type</a>, function in <a class="link" href="PopplerMedia.html" title="PopplerMedia">PopplerMedia</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="PopplerMedia.html#poppler-media-is-embedded" title="poppler_media_is_embedded ()">poppler_media_is_embedded</a>, function in <a class="link" href="PopplerMedia.html" title="PopplerMedia">PopplerMedia</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="PopplerMedia.html#poppler-media-save" title="poppler_media_save ()">poppler_media_save</a>, function in <a class="link" href="PopplerMedia.html" title="PopplerMedia">PopplerMedia</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="PopplerMedia.html#poppler-media-save-to-callback" title="poppler_media_save_to_callback ()">poppler_media_save_to_callback</a>, function in <a class="link" href="PopplerMedia.html" title="PopplerMedia">PopplerMedia</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="PopplerMovie.html#poppler-movie-get-filename" title="poppler_movie_get_filename ()">poppler_movie_get_filename</a>, function in <a class="link" href="PopplerMovie.html" title="PopplerMovie">PopplerMovie</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="PopplerMovie.html#poppler-movie-need-poster" title="poppler_movie_need_poster ()">poppler_movie_need_poster</a>, function in <a class="link" href="PopplerMovie.html" title="PopplerMovie">PopplerMovie</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="PopplerMovie.html#poppler-movie-show-controls" title="poppler_movie_show_controls ()">poppler_movie_show_controls</a>, function in <a class="link" href="PopplerMovie.html" title="PopplerMovie">PopplerMovie</a>
+</dt>
+<dd></dd>
+</div>
+<div class="footer">
+<hr>
+          Generated by GTK-Doc V1.18</div>
+</body>
+</html>
\ No newline at end of file
diff --git a/glib/reference/html/api-index-0-16.html b/glib/reference/html/api-index-0-16.html
new file mode 100644 (file)
index 0000000..5135b5f
--- /dev/null
@@ -0,0 +1,185 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>Index of new symbols in 0.16</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.76.1">
+<link rel="home" href="index.html" title="Poppler Reference Manual">
+<link rel="up" href="index.html" title="Poppler Reference Manual">
+<link rel="prev" href="api-index-0-14.html" title="Index of new symbols in 0.14">
+<link rel="next" href="api-index-0-18.html" title="Index of new symbols in 0.18">
+<meta name="generator" content="GTK-Doc V1.18 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="2">
+<tr valign="middle">
+<td><a accesskey="p" href="api-index-0-14.html"><img src="left.png" width="24" height="24" border="0" alt="Prev"></a></td>
+<td> </td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="24" height="24" border="0" alt="Home"></a></td>
+<th width="100%" align="center">Poppler Reference Manual</th>
+<td><a accesskey="n" href="api-index-0-18.html"><img src="right.png" width="24" height="24" border="0" alt="Next"></a></td>
+</tr>
+<tr><td colspan="5" class="shortcuts">
+<a class="shortcut" href="#idxA">A</a>
+                      | 
+                   <a class="shortcut" href="#idxD">D</a>
+                      | 
+                   <a class="shortcut" href="#idxF">F</a>
+                      | 
+                   <a class="shortcut" href="#idxP">P</a>
+</td></tr>
+</table>
+<div class="index">
+<div class="titlepage"><div><div><h2 class="title">
+<a name="api-index-0-16"></a>Index of new symbols in 0.16</h2></div></div></div>
+<a name="idx"></a><a name="idxA"></a><h3 class="title">A</h3>
+<dt>
+<a class="link" href="PopplerAnnot.html#poppler-annot-markup-set-label" title="poppler_annot_markup_set_label ()">poppler_annot_markup_set_label</a>, function in <a class="link" href="PopplerAnnot.html" title="PopplerAnnot">PopplerAnnot</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="PopplerAnnot.html#poppler-annot-markup-set-opacity" title="poppler_annot_markup_set_opacity ()">poppler_annot_markup_set_opacity</a>, function in <a class="link" href="PopplerAnnot.html" title="PopplerAnnot">PopplerAnnot</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="PopplerAnnot.html#poppler-annot-markup-set-popup" title="poppler_annot_markup_set_popup ()">poppler_annot_markup_set_popup</a>, function in <a class="link" href="PopplerAnnot.html" title="PopplerAnnot">PopplerAnnot</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="PopplerAnnot.html#poppler-annot-markup-set-popup-is-open" title="poppler_annot_markup_set_popup_is_open ()">poppler_annot_markup_set_popup_is_open</a>, function in <a class="link" href="PopplerAnnot.html" title="PopplerAnnot">PopplerAnnot</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="PopplerAnnot.html#poppler-annot-set-color" title="poppler_annot_set_color ()">poppler_annot_set_color</a>, function in <a class="link" href="PopplerAnnot.html" title="PopplerAnnot">PopplerAnnot</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="PopplerAnnot.html#poppler-annot-text-new" title="poppler_annot_text_new ()">poppler_annot_text_new</a>, function in <a class="link" href="PopplerAnnot.html" title="PopplerAnnot">PopplerAnnot</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="PopplerAnnot.html#poppler-annot-text-set-icon" title="poppler_annot_text_set_icon ()">poppler_annot_text_set_icon</a>, function in <a class="link" href="PopplerAnnot.html" title="PopplerAnnot">PopplerAnnot</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="PopplerAnnot.html#poppler-annot-text-set-is-open" title="poppler_annot_text_set_is_open ()">poppler_annot_text_set_is_open</a>, function in <a class="link" href="PopplerAnnot.html" title="PopplerAnnot">PopplerAnnot</a>
+</dt>
+<dd></dd>
+<a name="idxD"></a><h3 class="title">D</h3>
+<dt>
+<a class="link" href="PopplerDocument.html#poppler-document-get-author" title="poppler_document_get_author ()">poppler_document_get_author</a>, function in <a class="link" href="PopplerDocument.html" title="PopplerDocument">PopplerDocument</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="PopplerDocument.html#poppler-document-get-creation-date" title="poppler_document_get_creation_date ()">poppler_document_get_creation_date</a>, function in <a class="link" href="PopplerDocument.html" title="PopplerDocument">PopplerDocument</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="PopplerDocument.html#poppler-document-get-creator" title="poppler_document_get_creator ()">poppler_document_get_creator</a>, function in <a class="link" href="PopplerDocument.html" title="PopplerDocument">PopplerDocument</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="PopplerDocument.html#poppler-document-get-id" title="poppler_document_get_id ()">poppler_document_get_id</a>, function in <a class="link" href="PopplerDocument.html" title="PopplerDocument">PopplerDocument</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="PopplerDocument.html#poppler-document-get-keywords" title="poppler_document_get_keywords ()">poppler_document_get_keywords</a>, function in <a class="link" href="PopplerDocument.html" title="PopplerDocument">PopplerDocument</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="PopplerDocument.html#poppler-document-get-metadata" title="poppler_document_get_metadata ()">poppler_document_get_metadata</a>, function in <a class="link" href="PopplerDocument.html" title="PopplerDocument">PopplerDocument</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="PopplerDocument.html#poppler-document-get-modification-date" title="poppler_document_get_modification_date ()">poppler_document_get_modification_date</a>, function in <a class="link" href="PopplerDocument.html" title="PopplerDocument">PopplerDocument</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="PopplerDocument.html#poppler-document-get-page-layout" title="poppler_document_get_page_layout ()">poppler_document_get_page_layout</a>, function in <a class="link" href="PopplerDocument.html" title="PopplerDocument">PopplerDocument</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="PopplerDocument.html#poppler-document-get-page-mode" title="poppler_document_get_page_mode ()">poppler_document_get_page_mode</a>, function in <a class="link" href="PopplerDocument.html" title="PopplerDocument">PopplerDocument</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="PopplerDocument.html#poppler-document-get-pdf-version" title="poppler_document_get_pdf_version ()">poppler_document_get_pdf_version</a>, function in <a class="link" href="PopplerDocument.html" title="PopplerDocument">PopplerDocument</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="PopplerDocument.html#poppler-document-get-pdf-version-string" title="poppler_document_get_pdf_version_string ()">poppler_document_get_pdf_version_string</a>, function in <a class="link" href="PopplerDocument.html" title="PopplerDocument">PopplerDocument</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="PopplerDocument.html#poppler-document-get-permissions" title="poppler_document_get_permissions ()">poppler_document_get_permissions</a>, function in <a class="link" href="PopplerDocument.html" title="PopplerDocument">PopplerDocument</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="PopplerDocument.html#poppler-document-get-producer" title="poppler_document_get_producer ()">poppler_document_get_producer</a>, function in <a class="link" href="PopplerDocument.html" title="PopplerDocument">PopplerDocument</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="PopplerDocument.html#poppler-document-get-subject" title="poppler_document_get_subject ()">poppler_document_get_subject</a>, function in <a class="link" href="PopplerDocument.html" title="PopplerDocument">PopplerDocument</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="PopplerDocument.html#poppler-document-get-title" title="poppler_document_get_title ()">poppler_document_get_title</a>, function in <a class="link" href="PopplerDocument.html" title="PopplerDocument">PopplerDocument</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="PopplerDocument.html#poppler-document-is-linearized" title="poppler_document_is_linearized ()">poppler_document_is_linearized</a>, function in <a class="link" href="PopplerDocument.html" title="PopplerDocument">PopplerDocument</a>
+</dt>
+<dd></dd>
+<a name="idxF"></a><h3 class="title">F</h3>
+<dt>
+<a class="link" href="PopplerFormField.html#poppler-form-field-get-mapping-name" title="poppler_form_field_get_mapping_name ()">poppler_form_field_get_mapping_name</a>, function in <a class="link" href="PopplerFormField.html" title="PoppplerFormField">PopplerFormField</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="PopplerFormField.html#poppler-form-field-get-name" title="poppler_form_field_get_name ()">poppler_form_field_get_name</a>, function in <a class="link" href="PopplerFormField.html" title="PoppplerFormField">PopplerFormField</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="PopplerFormField.html#poppler-form-field-get-partial-name" title="poppler_form_field_get_partial_name ()">poppler_form_field_get_partial_name</a>, function in <a class="link" href="PopplerFormField.html" title="PoppplerFormField">PopplerFormField</a>
+</dt>
+<dd></dd>
+<a name="idxP"></a><h3 class="title">P</h3>
+<dt>
+<a class="link" href="PopplerPage.html#poppler-page-add-annot" title="poppler_page_add_annot ()">poppler_page_add_annot</a>, function in <a class="link" href="PopplerPage.html" title="PopplerPage">PopplerPage</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="PopplerPage.html#poppler-page-get-label" title="poppler_page_get_label ()">poppler_page_get_label</a>, function in <a class="link" href="PopplerPage.html" title="PopplerPage">PopplerPage</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="PopplerPage.html#poppler-page-get-selected-region" title="poppler_page_get_selected_region ()">poppler_page_get_selected_region</a>, function in <a class="link" href="PopplerPage.html" title="PopplerPage">PopplerPage</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="PopplerPage.html#poppler-page-get-selected-text" title="poppler_page_get_selected_text ()">poppler_page_get_selected_text</a>, function in <a class="link" href="PopplerPage.html" title="PopplerPage">PopplerPage</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="PopplerPage.html#poppler-page-get-text" title="poppler_page_get_text ()">poppler_page_get_text</a>, function in <a class="link" href="PopplerPage.html" title="PopplerPage">PopplerPage</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="PopplerPage.html#poppler-page-get-text-layout" title="poppler_page_get_text_layout ()">poppler_page_get_text_layout</a>, function in <a class="link" href="PopplerPage.html" title="PopplerPage">PopplerPage</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="PopplerPage.html#poppler-page-render-for-printing-with-options" title="poppler_page_render_for_printing_with_options ()">poppler_page_render_for_printing_with_options</a>, function in <a class="link" href="PopplerPage.html" title="PopplerPage">PopplerPage</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="poppler-poppler.html#PopplerPrintFlags" title="enum PopplerPrintFlags">PopplerPrintFlags</a>, enum in <a class="link" href="poppler-poppler.html" title="poppler">poppler</a>
+</dt>
+<dd></dd>
+</div>
+<div class="footer">
+<hr>
+          Generated by GTK-Doc V1.18</div>
+</body>
+</html>
\ No newline at end of file
diff --git a/glib/reference/html/api-index-0-18.html b/glib/reference/html/api-index-0-18.html
new file mode 100644 (file)
index 0000000..e310d04
--- /dev/null
@@ -0,0 +1,77 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>Index of new symbols in 0.18</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.76.1">
+<link rel="home" href="index.html" title="Poppler Reference Manual">
+<link rel="up" href="index.html" title="Poppler Reference Manual">
+<link rel="prev" href="api-index-0-16.html" title="Index of new symbols in 0.16">
+<link rel="next" href="api-index-0-20.html" title="Index of new symbols in 0.20">
+<meta name="generator" content="GTK-Doc V1.18 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="2">
+<tr valign="middle">
+<td><a accesskey="p" href="api-index-0-16.html"><img src="left.png" width="24" height="24" border="0" alt="Prev"></a></td>
+<td> </td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="24" height="24" border="0" alt="Home"></a></td>
+<th width="100%" align="center">Poppler Reference Manual</th>
+<td><a accesskey="n" href="api-index-0-20.html"><img src="right.png" width="24" height="24" border="0" alt="Next"></a></td>
+</tr>
+<tr><td colspan="5" class="shortcuts">
+<a class="shortcut" href="#idxD">D</a>
+                      | 
+                   <a class="shortcut" href="#idxF">F</a>
+                      | 
+                   <a class="shortcut" href="#idxP">P</a>
+                      | 
+                   <a class="shortcut" href="#idxT">T</a>
+</td></tr>
+</table>
+<div class="index">
+<div class="titlepage"><div><div><h2 class="title">
+<a name="api-index-0-18"></a>Index of new symbols in 0.18</h2></div></div></div>
+<a name="idx"></a><a name="idxD"></a><h3 class="title">D</h3>
+<dt>
+<a class="link" href="PopplerDocument.html#poppler-document-get-n-attachments" title="poppler_document_get_n_attachments ()">poppler_document_get_n_attachments</a>, function in <a class="link" href="PopplerDocument.html" title="PopplerDocument">PopplerDocument</a>
+</dt>
+<dd></dd>
+<a name="idxF"></a><h3 class="title">F</h3>
+<dt>
+<a class="link" href="PopplerFormField.html#poppler-form-field-get-action" title="poppler_form_field_get_action ()">poppler_form_field_get_action</a>, function in <a class="link" href="PopplerFormField.html" title="PoppplerFormField">PopplerFormField</a>
+</dt>
+<dd></dd>
+<a name="idxP"></a><h3 class="title">P</h3>
+<dt>
+<a class="link" href="PopplerPage.html#poppler-page-free-text-attributes" title="poppler_page_free_text_attributes ()">poppler_page_free_text_attributes</a>, function in <a class="link" href="PopplerPage.html" title="PopplerPage">PopplerPage</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="PopplerPage.html#poppler-page-get-text-attributes" title="poppler_page_get_text_attributes ()">poppler_page_get_text_attributes</a>, function in <a class="link" href="PopplerPage.html" title="PopplerPage">PopplerPage</a>
+</dt>
+<dd></dd>
+<a name="idxT"></a><h3 class="title">T</h3>
+<dt>
+<a class="link" href="PopplerPage.html#PopplerTextAttributes" title="PopplerTextAttributes">PopplerTextAttributes</a>, struct in <a class="link" href="PopplerPage.html" title="PopplerPage">PopplerPage</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="PopplerPage.html#poppler-text-attributes-copy" title="poppler_text_attributes_copy ()">poppler_text_attributes_copy</a>, function in <a class="link" href="PopplerPage.html" title="PopplerPage">PopplerPage</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="PopplerPage.html#poppler-text-attributes-free" title="poppler_text_attributes_free ()">poppler_text_attributes_free</a>, function in <a class="link" href="PopplerPage.html" title="PopplerPage">PopplerPage</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="PopplerPage.html#poppler-text-attributes-new" title="poppler_text_attributes_new ()">poppler_text_attributes_new</a>, function in <a class="link" href="PopplerPage.html" title="PopplerPage">PopplerPage</a>
+</dt>
+<dd></dd>
+</div>
+<div class="footer">
+<hr>
+          Generated by GTK-Doc V1.18</div>
+</body>
+</html>
\ No newline at end of file
diff --git a/glib/reference/html/api-index-0-20.html b/glib/reference/html/api-index-0-20.html
new file mode 100644 (file)
index 0000000..06e5e08
--- /dev/null
@@ -0,0 +1,42 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>Index of new symbols in 0.20</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.76.1">
+<link rel="home" href="index.html" title="Poppler Reference Manual">
+<link rel="up" href="index.html" title="Poppler Reference Manual">
+<link rel="prev" href="api-index-0-18.html" title="Index of new symbols in 0.18">
+<link rel="next" href="annotation-glossary.html" title="Annotation Glossary">
+<meta name="generator" content="GTK-Doc V1.18 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="2">
+<tr valign="middle">
+<td><a accesskey="p" href="api-index-0-18.html"><img src="left.png" width="24" height="24" border="0" alt="Prev"></a></td>
+<td> </td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="24" height="24" border="0" alt="Home"></a></td>
+<th width="100%" align="center">Poppler Reference Manual</th>
+<td><a accesskey="n" href="annotation-glossary.html"><img src="right.png" width="24" height="24" border="0" alt="Next"></a></td>
+</tr>
+<tr><td colspan="5" class="shortcuts"><a class="shortcut" href="#idxF">F</a></td></tr>
+</table>
+<div class="index">
+<div class="titlepage"><div><div><h2 class="title">
+<a name="api-index-0-20"></a>Index of new symbols in 0.20</h2></div></div></div>
+<a name="idx"></a><a name="idxF"></a><h3 class="title">F</h3>
+<dt>
+<a class="link" href="PopplerDocument.html#poppler-fonts-iter-get-encoding" title="poppler_fonts_iter_get_encoding ()">poppler_fonts_iter_get_encoding</a>, function in <a class="link" href="PopplerDocument.html" title="PopplerDocument">PopplerDocument</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="PopplerDocument.html#poppler-fonts-iter-get-substitute-name" title="poppler_fonts_iter_get_substitute_name ()">poppler_fonts_iter_get_substitute_name</a>, function in <a class="link" href="PopplerDocument.html" title="PopplerDocument">PopplerDocument</a>
+</dt>
+<dd></dd>
+</div>
+<div class="footer">
+<hr>
+          Generated by GTK-Doc V1.18</div>
+</body>
+</html>
\ No newline at end of file
diff --git a/glib/reference/html/api-index-deprecated.html b/glib/reference/html/api-index-deprecated.html
new file mode 100644 (file)
index 0000000..064568d
--- /dev/null
@@ -0,0 +1,42 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>Index of deprecated symbols</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.76.1">
+<link rel="home" href="index.html" title="Poppler Reference Manual">
+<link rel="up" href="index.html" title="Poppler Reference Manual">
+<link rel="prev" href="api-index-full.html" title="Index of all symbols">
+<link rel="next" href="api-index-0-12.html" title="Index of new symbols in 0.12">
+<meta name="generator" content="GTK-Doc V1.18 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="2">
+<tr valign="middle">
+<td><a accesskey="p" href="api-index-full.html"><img src="left.png" width="24" height="24" border="0" alt="Prev"></a></td>
+<td> </td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="24" height="24" border="0" alt="Home"></a></td>
+<th width="100%" align="center">Poppler Reference Manual</th>
+<td><a accesskey="n" href="api-index-0-12.html"><img src="right.png" width="24" height="24" border="0" alt="Next"></a></td>
+</tr>
+<tr><td colspan="5" class="shortcuts"><a class="shortcut" href="#idxP">P</a></td></tr>
+</table>
+<div class="index">
+<div class="titlepage"><div><div><h2 class="title">
+<a name="api-index-deprecated"></a>Index of deprecated symbols</h2></div></div></div>
+<a name="idx"></a><a name="idxP"></a><h3 class="title">P</h3>
+<dt>
+<a class="link" href="PopplerPage.html#poppler-page-get-selection-region" title="poppler_page_get_selection_region ()">poppler_page_get_selection_region</a>, function in <a class="link" href="PopplerPage.html" title="PopplerPage">PopplerPage</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="PopplerPage.html#poppler-page-selection-region-free" title="poppler_page_selection_region_free ()">poppler_page_selection_region_free</a>, function in <a class="link" href="PopplerPage.html" title="PopplerPage">PopplerPage</a>
+</dt>
+<dd></dd>
+</div>
+<div class="footer">
+<hr>
+          Generated by GTK-Doc V1.18</div>
+</body>
+</html>
\ No newline at end of file
diff --git a/glib/reference/html/api-index-full.html b/glib/reference/html/api-index-full.html
new file mode 100644 (file)
index 0000000..7dc7b02
--- /dev/null
@@ -0,0 +1,1332 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>Index of all symbols</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.76.1">
+<link rel="home" href="index.html" title="Poppler Reference Manual">
+<link rel="up" href="index.html" title="Poppler Reference Manual">
+<link rel="prev" href="poppler-Version-and-Features-Information.html" title="Version and Features Information">
+<link rel="next" href="api-index-deprecated.html" title="Index of deprecated symbols">
+<meta name="generator" content="GTK-Doc V1.18 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="2">
+<tr valign="middle">
+<td><a accesskey="p" href="poppler-Version-and-Features-Information.html"><img src="left.png" width="24" height="24" border="0" alt="Prev"></a></td>
+<td> </td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="24" height="24" border="0" alt="Home"></a></td>
+<th width="100%" align="center">Poppler Reference Manual</th>
+<td><a accesskey="n" href="api-index-deprecated.html"><img src="right.png" width="24" height="24" border="0" alt="Next"></a></td>
+</tr>
+<tr><td colspan="5" class="shortcuts">
+<a class="shortcut" href="#idxA">A</a>
+                      | 
+                   <a class="shortcut" href="#idxB">B</a>
+                      | 
+                   <a class="shortcut" href="#idxC">C</a>
+                      | 
+                   <a class="shortcut" href="#idxD">D</a>
+                      | 
+                   <a class="shortcut" href="#idxE">E</a>
+                      | 
+                   <a class="shortcut" href="#idxF">F</a>
+                      | 
+                   <a class="shortcut" href="#idxG">G</a>
+                      | 
+                   <a class="shortcut" href="#idxH">H</a>
+                      | 
+                   <a class="shortcut" href="#idxI">I</a>
+                      | 
+                   <a class="shortcut" href="#idxL">L</a>
+                      | 
+                   <a class="shortcut" href="#idxM">M</a>
+                      | 
+                   <a class="shortcut" href="#idxO">O</a>
+                      | 
+                   <a class="shortcut" href="#idxP">P</a>
+                      | 
+                   <a class="shortcut" href="#idxR">R</a>
+                      | 
+                   <a class="shortcut" href="#idxS">S</a>
+                      | 
+                   <a class="shortcut" href="#idxT">T</a>
+                      | 
+                   <a class="shortcut" href="#idxV">V</a>
+</td></tr>
+</table>
+<div class="index">
+<div class="titlepage"><div><div><h2 class="title">
+<a name="api-index-full"></a>Index of all symbols</h2></div></div></div>
+<a name="idx"></a><a name="idxA"></a><h3 class="title">A</h3>
+<dt>
+<a class="link" href="poppler-PopplerAction.html#PopplerAction" title="union PopplerAction">PopplerAction</a>, union in <a class="link" href="poppler-PopplerAction.html" title="PopplerAction">PopplerAction</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="poppler-PopplerAction.html#PopplerActionAny" title="struct PopplerActionAny">PopplerActionAny</a>, struct in <a class="link" href="poppler-PopplerAction.html" title="PopplerAction">PopplerAction</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="poppler-PopplerAction.html#PopplerActionGotoDest" title="struct PopplerActionGotoDest">PopplerActionGotoDest</a>, struct in <a class="link" href="poppler-PopplerAction.html" title="PopplerAction">PopplerAction</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="poppler-PopplerAction.html#PopplerActionGotoRemote" title="struct PopplerActionGotoRemote">PopplerActionGotoRemote</a>, struct in <a class="link" href="poppler-PopplerAction.html" title="PopplerAction">PopplerAction</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="poppler-PopplerAction.html#PopplerActionJavascript" title="struct PopplerActionJavascript">PopplerActionJavascript</a>, struct in <a class="link" href="poppler-PopplerAction.html" title="PopplerAction">PopplerAction</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="poppler-PopplerAction.html#PopplerActionLaunch" title="struct PopplerActionLaunch">PopplerActionLaunch</a>, struct in <a class="link" href="poppler-PopplerAction.html" title="PopplerAction">PopplerAction</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="poppler-PopplerAction.html#PopplerActionLayer" title="PopplerActionLayer">PopplerActionLayer</a>, struct in <a class="link" href="poppler-PopplerAction.html" title="PopplerAction">PopplerAction</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="poppler-PopplerAction.html#PopplerActionLayerAction" title="enum PopplerActionLayerAction">PopplerActionLayerAction</a>, enum in <a class="link" href="poppler-PopplerAction.html" title="PopplerAction">PopplerAction</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="poppler-PopplerAction.html#PopplerActionMovie" title="struct PopplerActionMovie">PopplerActionMovie</a>, struct in <a class="link" href="poppler-PopplerAction.html" title="PopplerAction">PopplerAction</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="poppler-PopplerAction.html#PopplerActionMovieOperation" title="enum PopplerActionMovieOperation">PopplerActionMovieOperation</a>, enum in <a class="link" href="poppler-PopplerAction.html" title="PopplerAction">PopplerAction</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="poppler-PopplerAction.html#PopplerActionNamed" title="struct PopplerActionNamed">PopplerActionNamed</a>, struct in <a class="link" href="poppler-PopplerAction.html" title="PopplerAction">PopplerAction</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="poppler-PopplerAction.html#PopplerActionOCGState" title="struct PopplerActionOCGState">PopplerActionOCGState</a>, struct in <a class="link" href="poppler-PopplerAction.html" title="PopplerAction">PopplerAction</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="poppler-PopplerAction.html#PopplerActionRendition" title="struct PopplerActionRendition">PopplerActionRendition</a>, struct in <a class="link" href="poppler-PopplerAction.html" title="PopplerAction">PopplerAction</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="poppler-PopplerAction.html#PopplerActionType" title="enum PopplerActionType">PopplerActionType</a>, enum in <a class="link" href="poppler-PopplerAction.html" title="PopplerAction">PopplerAction</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="poppler-PopplerAction.html#PopplerActionUri" title="struct PopplerActionUri">PopplerActionUri</a>, struct in <a class="link" href="poppler-PopplerAction.html" title="PopplerAction">PopplerAction</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="poppler-PopplerAction.html#poppler-action-copy" title="poppler_action_copy ()">poppler_action_copy</a>, function in <a class="link" href="poppler-PopplerAction.html" title="PopplerAction">PopplerAction</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="poppler-PopplerAction.html#poppler-action-free" title="poppler_action_free ()">poppler_action_free</a>, function in <a class="link" href="poppler-PopplerAction.html" title="PopplerAction">PopplerAction</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="PopplerAnnot.html#PopplerAnnot-struct" title="PopplerAnnot">PopplerAnnot</a>, struct in <a class="link" href="PopplerAnnot.html" title="PopplerAnnot">PopplerAnnot</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="PopplerAnnot.html#PopplerAnnotCalloutLine" title="PopplerAnnotCalloutLine">PopplerAnnotCalloutLine</a>, struct in <a class="link" href="PopplerAnnot.html" title="PopplerAnnot">PopplerAnnot</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="PopplerAnnot.html#PopplerAnnotExternalDataType" title="enum PopplerAnnotExternalDataType">PopplerAnnotExternalDataType</a>, enum in <a class="link" href="PopplerAnnot.html" title="PopplerAnnot">PopplerAnnot</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="PopplerAnnot.html#PopplerAnnotFileAttachment" title="PopplerAnnotFileAttachment">PopplerAnnotFileAttachment</a>, struct in <a class="link" href="PopplerAnnot.html" title="PopplerAnnot">PopplerAnnot</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="PopplerAnnot.html#PopplerAnnotFlag" title="enum PopplerAnnotFlag">PopplerAnnotFlag</a>, enum in <a class="link" href="PopplerAnnot.html" title="PopplerAnnot">PopplerAnnot</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="PopplerAnnot.html#PopplerAnnotFreeText" title="PopplerAnnotFreeText">PopplerAnnotFreeText</a>, struct in <a class="link" href="PopplerAnnot.html" title="PopplerAnnot">PopplerAnnot</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="PopplerAnnot.html#PopplerAnnotFreeTextQuadding" title="enum PopplerAnnotFreeTextQuadding">PopplerAnnotFreeTextQuadding</a>, enum in <a class="link" href="PopplerAnnot.html" title="PopplerAnnot">PopplerAnnot</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="PopplerPage.html#PopplerAnnotMapping" title="PopplerAnnotMapping">PopplerAnnotMapping</a>, struct in <a class="link" href="PopplerPage.html" title="PopplerPage">PopplerPage</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="PopplerAnnot.html#PopplerAnnotMarkup" title="PopplerAnnotMarkup">PopplerAnnotMarkup</a>, struct in <a class="link" href="PopplerAnnot.html" title="PopplerAnnot">PopplerAnnot</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="PopplerAnnot.html#PopplerAnnotMarkupReplyType" title="enum PopplerAnnotMarkupReplyType">PopplerAnnotMarkupReplyType</a>, enum in <a class="link" href="PopplerAnnot.html" title="PopplerAnnot">PopplerAnnot</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="PopplerAnnot.html#PopplerAnnotMovie" title="PopplerAnnotMovie">PopplerAnnotMovie</a>, struct in <a class="link" href="PopplerAnnot.html" title="PopplerAnnot">PopplerAnnot</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="PopplerAnnot.html#PopplerAnnotScreen" title="PopplerAnnotScreen">PopplerAnnotScreen</a>, struct in <a class="link" href="PopplerAnnot.html" title="PopplerAnnot">PopplerAnnot</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="PopplerAnnot.html#PopplerAnnotText" title="PopplerAnnotText">PopplerAnnotText</a>, struct in <a class="link" href="PopplerAnnot.html" title="PopplerAnnot">PopplerAnnot</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="PopplerAnnot.html#PopplerAnnotTextState" title="enum PopplerAnnotTextState">PopplerAnnotTextState</a>, enum in <a class="link" href="PopplerAnnot.html" title="PopplerAnnot">PopplerAnnot</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="PopplerAnnot.html#PopplerAnnotType" title="enum PopplerAnnotType">PopplerAnnotType</a>, enum in <a class="link" href="PopplerAnnot.html" title="PopplerAnnot">PopplerAnnot</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="PopplerAnnot.html#poppler-annot-callout-line-copy" title="poppler_annot_callout_line_copy ()">poppler_annot_callout_line_copy</a>, function in <a class="link" href="PopplerAnnot.html" title="PopplerAnnot">PopplerAnnot</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="PopplerAnnot.html#poppler-annot-callout-line-free" title="poppler_annot_callout_line_free ()">poppler_annot_callout_line_free</a>, function in <a class="link" href="PopplerAnnot.html" title="PopplerAnnot">PopplerAnnot</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="PopplerAnnot.html#poppler-annot-callout-line-new" title="poppler_annot_callout_line_new ()">poppler_annot_callout_line_new</a>, function in <a class="link" href="PopplerAnnot.html" title="PopplerAnnot">PopplerAnnot</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="PopplerAnnot.html#poppler-annot-file-attachment-get-attachment" title="poppler_annot_file_attachment_get_attachment ()">poppler_annot_file_attachment_get_attachment</a>, function in <a class="link" href="PopplerAnnot.html" title="PopplerAnnot">PopplerAnnot</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="PopplerAnnot.html#poppler-annot-file-attachment-get-name" title="poppler_annot_file_attachment_get_name ()">poppler_annot_file_attachment_get_name</a>, function in <a class="link" href="PopplerAnnot.html" title="PopplerAnnot">PopplerAnnot</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="PopplerAnnot.html#poppler-annot-free-text-get-callout-line" title="poppler_annot_free_text_get_callout_line ()">poppler_annot_free_text_get_callout_line</a>, function in <a class="link" href="PopplerAnnot.html" title="PopplerAnnot">PopplerAnnot</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="PopplerAnnot.html#poppler-annot-free-text-get-quadding" title="poppler_annot_free_text_get_quadding ()">poppler_annot_free_text_get_quadding</a>, function in <a class="link" href="PopplerAnnot.html" title="PopplerAnnot">PopplerAnnot</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="PopplerAnnot.html#poppler-annot-get-annot-type" title="poppler_annot_get_annot_type ()">poppler_annot_get_annot_type</a>, function in <a class="link" href="PopplerAnnot.html" title="PopplerAnnot">PopplerAnnot</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="PopplerAnnot.html#poppler-annot-get-color" title="poppler_annot_get_color ()">poppler_annot_get_color</a>, function in <a class="link" href="PopplerAnnot.html" title="PopplerAnnot">PopplerAnnot</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="PopplerAnnot.html#poppler-annot-get-contents" title="poppler_annot_get_contents ()">poppler_annot_get_contents</a>, function in <a class="link" href="PopplerAnnot.html" title="PopplerAnnot">PopplerAnnot</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="PopplerAnnot.html#poppler-annot-get-flags" title="poppler_annot_get_flags ()">poppler_annot_get_flags</a>, function in <a class="link" href="PopplerAnnot.html" title="PopplerAnnot">PopplerAnnot</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="PopplerAnnot.html#poppler-annot-get-modified" title="poppler_annot_get_modified ()">poppler_annot_get_modified</a>, function in <a class="link" href="PopplerAnnot.html" title="PopplerAnnot">PopplerAnnot</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="PopplerAnnot.html#poppler-annot-get-name" title="poppler_annot_get_name ()">poppler_annot_get_name</a>, function in <a class="link" href="PopplerAnnot.html" title="PopplerAnnot">PopplerAnnot</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="PopplerAnnot.html#poppler-annot-get-page-index" title="poppler_annot_get_page_index ()">poppler_annot_get_page_index</a>, function in <a class="link" href="PopplerAnnot.html" title="PopplerAnnot">PopplerAnnot</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="PopplerPage.html#poppler-annot-mapping-copy" title="poppler_annot_mapping_copy ()">poppler_annot_mapping_copy</a>, function in <a class="link" href="PopplerPage.html" title="PopplerPage">PopplerPage</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="PopplerPage.html#poppler-annot-mapping-free" title="poppler_annot_mapping_free ()">poppler_annot_mapping_free</a>, function in <a class="link" href="PopplerPage.html" title="PopplerPage">PopplerPage</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="PopplerPage.html#poppler-annot-mapping-new" title="poppler_annot_mapping_new ()">poppler_annot_mapping_new</a>, function in <a class="link" href="PopplerPage.html" title="PopplerPage">PopplerPage</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="PopplerAnnot.html#poppler-annot-markup-get-date" title="poppler_annot_markup_get_date ()">poppler_annot_markup_get_date</a>, function in <a class="link" href="PopplerAnnot.html" title="PopplerAnnot">PopplerAnnot</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="PopplerAnnot.html#poppler-annot-markup-get-external-data" title="poppler_annot_markup_get_external_data ()">poppler_annot_markup_get_external_data</a>, function in <a class="link" href="PopplerAnnot.html" title="PopplerAnnot">PopplerAnnot</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="PopplerAnnot.html#poppler-annot-markup-get-label" title="poppler_annot_markup_get_label ()">poppler_annot_markup_get_label</a>, function in <a class="link" href="PopplerAnnot.html" title="PopplerAnnot">PopplerAnnot</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="PopplerAnnot.html#poppler-annot-markup-get-opacity" title="poppler_annot_markup_get_opacity ()">poppler_annot_markup_get_opacity</a>, function in <a class="link" href="PopplerAnnot.html" title="PopplerAnnot">PopplerAnnot</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="PopplerAnnot.html#poppler-annot-markup-get-popup-is-open" title="poppler_annot_markup_get_popup_is_open ()">poppler_annot_markup_get_popup_is_open</a>, function in <a class="link" href="PopplerAnnot.html" title="PopplerAnnot">PopplerAnnot</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="PopplerAnnot.html#poppler-annot-markup-get-popup-rectangle" title="poppler_annot_markup_get_popup_rectangle ()">poppler_annot_markup_get_popup_rectangle</a>, function in <a class="link" href="PopplerAnnot.html" title="PopplerAnnot">PopplerAnnot</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="PopplerAnnot.html#poppler-annot-markup-get-reply-to" title="poppler_annot_markup_get_reply_to ()">poppler_annot_markup_get_reply_to</a>, function in <a class="link" href="PopplerAnnot.html" title="PopplerAnnot">PopplerAnnot</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="PopplerAnnot.html#poppler-annot-markup-get-subject" title="poppler_annot_markup_get_subject ()">poppler_annot_markup_get_subject</a>, function in <a class="link" href="PopplerAnnot.html" title="PopplerAnnot">PopplerAnnot</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="PopplerAnnot.html#poppler-annot-markup-has-popup" title="poppler_annot_markup_has_popup ()">poppler_annot_markup_has_popup</a>, function in <a class="link" href="PopplerAnnot.html" title="PopplerAnnot">PopplerAnnot</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="PopplerAnnot.html#poppler-annot-markup-set-label" title="poppler_annot_markup_set_label ()">poppler_annot_markup_set_label</a>, function in <a class="link" href="PopplerAnnot.html" title="PopplerAnnot">PopplerAnnot</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="PopplerAnnot.html#poppler-annot-markup-set-opacity" title="poppler_annot_markup_set_opacity ()">poppler_annot_markup_set_opacity</a>, function in <a class="link" href="PopplerAnnot.html" title="PopplerAnnot">PopplerAnnot</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="PopplerAnnot.html#poppler-annot-markup-set-popup" title="poppler_annot_markup_set_popup ()">poppler_annot_markup_set_popup</a>, function in <a class="link" href="PopplerAnnot.html" title="PopplerAnnot">PopplerAnnot</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="PopplerAnnot.html#poppler-annot-markup-set-popup-is-open" title="poppler_annot_markup_set_popup_is_open ()">poppler_annot_markup_set_popup_is_open</a>, function in <a class="link" href="PopplerAnnot.html" title="PopplerAnnot">PopplerAnnot</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="PopplerAnnot.html#poppler-annot-movie-get-movie" title="poppler_annot_movie_get_movie ()">poppler_annot_movie_get_movie</a>, function in <a class="link" href="PopplerAnnot.html" title="PopplerAnnot">PopplerAnnot</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="PopplerAnnot.html#poppler-annot-movie-get-title" title="poppler_annot_movie_get_title ()">poppler_annot_movie_get_title</a>, function in <a class="link" href="PopplerAnnot.html" title="PopplerAnnot">PopplerAnnot</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="PopplerAnnot.html#poppler-annot-screen-get-action" title="poppler_annot_screen_get_action ()">poppler_annot_screen_get_action</a>, function in <a class="link" href="PopplerAnnot.html" title="PopplerAnnot">PopplerAnnot</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="PopplerAnnot.html#poppler-annot-set-color" title="poppler_annot_set_color ()">poppler_annot_set_color</a>, function in <a class="link" href="PopplerAnnot.html" title="PopplerAnnot">PopplerAnnot</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="PopplerAnnot.html#poppler-annot-set-contents" title="poppler_annot_set_contents ()">poppler_annot_set_contents</a>, function in <a class="link" href="PopplerAnnot.html" title="PopplerAnnot">PopplerAnnot</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="PopplerAnnot.html#poppler-annot-text-get-icon" title="poppler_annot_text_get_icon ()">poppler_annot_text_get_icon</a>, function in <a class="link" href="PopplerAnnot.html" title="PopplerAnnot">PopplerAnnot</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="PopplerAnnot.html#poppler-annot-text-get-is-open" title="poppler_annot_text_get_is_open ()">poppler_annot_text_get_is_open</a>, function in <a class="link" href="PopplerAnnot.html" title="PopplerAnnot">PopplerAnnot</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="PopplerAnnot.html#poppler-annot-text-get-state" title="poppler_annot_text_get_state ()">poppler_annot_text_get_state</a>, function in <a class="link" href="PopplerAnnot.html" title="PopplerAnnot">PopplerAnnot</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="PopplerAnnot.html#POPPLER-ANNOT-TEXT-ICON-CIRCLE:CAPS" title="POPPLER_ANNOT_TEXT_ICON_CIRCLE">POPPLER_ANNOT_TEXT_ICON_CIRCLE</a>, macro in <a class="link" href="PopplerAnnot.html" title="PopplerAnnot">PopplerAnnot</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="PopplerAnnot.html#POPPLER-ANNOT-TEXT-ICON-COMMENT:CAPS" title="POPPLER_ANNOT_TEXT_ICON_COMMENT">POPPLER_ANNOT_TEXT_ICON_COMMENT</a>, macro in <a class="link" href="PopplerAnnot.html" title="PopplerAnnot">PopplerAnnot</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="PopplerAnnot.html#POPPLER-ANNOT-TEXT-ICON-CROSS:CAPS" title="POPPLER_ANNOT_TEXT_ICON_CROSS">POPPLER_ANNOT_TEXT_ICON_CROSS</a>, macro in <a class="link" href="PopplerAnnot.html" title="PopplerAnnot">PopplerAnnot</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="PopplerAnnot.html#POPPLER-ANNOT-TEXT-ICON-HELP:CAPS" title="POPPLER_ANNOT_TEXT_ICON_HELP">POPPLER_ANNOT_TEXT_ICON_HELP</a>, macro in <a class="link" href="PopplerAnnot.html" title="PopplerAnnot">PopplerAnnot</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="PopplerAnnot.html#POPPLER-ANNOT-TEXT-ICON-INSERT:CAPS" title="POPPLER_ANNOT_TEXT_ICON_INSERT">POPPLER_ANNOT_TEXT_ICON_INSERT</a>, macro in <a class="link" href="PopplerAnnot.html" title="PopplerAnnot">PopplerAnnot</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="PopplerAnnot.html#POPPLER-ANNOT-TEXT-ICON-KEY:CAPS" title="POPPLER_ANNOT_TEXT_ICON_KEY">POPPLER_ANNOT_TEXT_ICON_KEY</a>, macro in <a class="link" href="PopplerAnnot.html" title="PopplerAnnot">PopplerAnnot</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="PopplerAnnot.html#POPPLER-ANNOT-TEXT-ICON-NEW-PARAGRAPH:CAPS" title="POPPLER_ANNOT_TEXT_ICON_NEW_PARAGRAPH">POPPLER_ANNOT_TEXT_ICON_NEW_PARAGRAPH</a>, macro in <a class="link" href="PopplerAnnot.html" title="PopplerAnnot">PopplerAnnot</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="PopplerAnnot.html#POPPLER-ANNOT-TEXT-ICON-NOTE:CAPS" title="POPPLER_ANNOT_TEXT_ICON_NOTE">POPPLER_ANNOT_TEXT_ICON_NOTE</a>, macro in <a class="link" href="PopplerAnnot.html" title="PopplerAnnot">PopplerAnnot</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="PopplerAnnot.html#POPPLER-ANNOT-TEXT-ICON-PARAGRAPH:CAPS" title="POPPLER_ANNOT_TEXT_ICON_PARAGRAPH">POPPLER_ANNOT_TEXT_ICON_PARAGRAPH</a>, macro in <a class="link" href="PopplerAnnot.html" title="PopplerAnnot">PopplerAnnot</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="PopplerAnnot.html#poppler-annot-text-new" title="poppler_annot_text_new ()">poppler_annot_text_new</a>, function in <a class="link" href="PopplerAnnot.html" title="PopplerAnnot">PopplerAnnot</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="PopplerAnnot.html#poppler-annot-text-set-icon" title="poppler_annot_text_set_icon ()">poppler_annot_text_set_icon</a>, function in <a class="link" href="PopplerAnnot.html" title="PopplerAnnot">PopplerAnnot</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="PopplerAnnot.html#poppler-annot-text-set-is-open" title="poppler_annot_text_set_is_open ()">poppler_annot_text_set_is_open</a>, function in <a class="link" href="PopplerAnnot.html" title="PopplerAnnot">PopplerAnnot</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="PopplerAttachment.html#PopplerAttachment-struct" title="PopplerAttachment">PopplerAttachment</a>, struct in <a class="link" href="PopplerAttachment.html" title="PopplerAttachment">PopplerAttachment</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="PopplerAttachment.html#PopplerAttachmentSaveFunc" title="PopplerAttachmentSaveFunc ()">PopplerAttachmentSaveFunc</a>, user_function in <a class="link" href="PopplerAttachment.html" title="PopplerAttachment">PopplerAttachment</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="PopplerAttachment.html#poppler-attachment-save" title="poppler_attachment_save ()">poppler_attachment_save</a>, function in <a class="link" href="PopplerAttachment.html" title="PopplerAttachment">PopplerAttachment</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="PopplerAttachment.html#poppler-attachment-save-to-callback" title="poppler_attachment_save_to_callback ()">poppler_attachment_save_to_callback</a>, function in <a class="link" href="PopplerAttachment.html" title="PopplerAttachment">PopplerAttachment</a>
+</dt>
+<dd></dd>
+<a name="idxB"></a><h3 class="title">B</h3>
+<dt>
+<a class="link" href="poppler-poppler.html#PopplerBackend" title="enum PopplerBackend">PopplerBackend</a>, enum in <a class="link" href="poppler-poppler.html" title="poppler">poppler</a>
+</dt>
+<dd></dd>
+<a name="idxC"></a><h3 class="title">C</h3>
+<dt>
+<a class="link" href="poppler-Version-and-Features-Information.html#POPPLER-CHECK-VERSION:CAPS" title="POPPLER_CHECK_VERSION()">POPPLER_CHECK_VERSION</a>, macro in <a class="link" href="poppler-Version-and-Features-Information.html" title="Version and Features Information">Version and Features Information</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="poppler-poppler.html#PopplerColor" title="PopplerColor">PopplerColor</a>, struct in <a class="link" href="poppler-poppler.html" title="poppler">poppler</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="poppler-poppler.html#poppler-color-copy" title="poppler_color_copy ()">poppler_color_copy</a>, function in <a class="link" href="poppler-poppler.html" title="poppler">poppler</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="poppler-poppler.html#poppler-color-free" title="poppler_color_free ()">poppler_color_free</a>, function in <a class="link" href="poppler-poppler.html" title="poppler">poppler</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="poppler-poppler.html#poppler-color-new" title="poppler_color_new ()">poppler_color_new</a>, function in <a class="link" href="poppler-poppler.html" title="poppler">poppler</a>
+</dt>
+<dd></dd>
+<a name="idxD"></a><h3 class="title">D</h3>
+<dt>
+<a class="link" href="poppler-poppler.html#poppler-date-parse" title="poppler_date_parse ()">poppler_date_parse</a>, function in <a class="link" href="poppler-poppler.html" title="poppler">poppler</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="poppler-PopplerAction.html#PopplerDest" title="PopplerDest">PopplerDest</a>, struct in <a class="link" href="poppler-PopplerAction.html" title="PopplerAction">PopplerAction</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="poppler-PopplerAction.html#PopplerDestType" title="enum PopplerDestType">PopplerDestType</a>, enum in <a class="link" href="poppler-PopplerAction.html" title="PopplerAction">PopplerAction</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="poppler-PopplerAction.html#poppler-dest-copy" title="poppler_dest_copy ()">poppler_dest_copy</a>, function in <a class="link" href="poppler-PopplerAction.html" title="PopplerAction">PopplerAction</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="poppler-PopplerAction.html#poppler-dest-free" title="poppler_dest_free ()">poppler_dest_free</a>, function in <a class="link" href="poppler-PopplerAction.html" title="PopplerAction">PopplerAction</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="PopplerDocument.html#PopplerDocument-struct" title="PopplerDocument">PopplerDocument</a>, struct in <a class="link" href="PopplerDocument.html" title="PopplerDocument">PopplerDocument</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="PopplerDocument.html#PopplerDocument--author" title='The "author" property'>PopplerDocument:author</a>, object property in <a class="link" href="PopplerDocument.html" title="PopplerDocument">PopplerDocument</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="PopplerDocument.html#PopplerDocument--creation-date" title='The "creation-date" property'>PopplerDocument:creation-date</a>, object property in <a class="link" href="PopplerDocument.html" title="PopplerDocument">PopplerDocument</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="PopplerDocument.html#PopplerDocument--creator" title='The "creator" property'>PopplerDocument:creator</a>, object property in <a class="link" href="PopplerDocument.html" title="PopplerDocument">PopplerDocument</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="PopplerDocument.html#PopplerDocument--format" title='The "format" property'>PopplerDocument:format</a>, object property in <a class="link" href="PopplerDocument.html" title="PopplerDocument">PopplerDocument</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="PopplerDocument.html#PopplerDocument--format-major" title='The "format-major" property'>PopplerDocument:format-major</a>, object property in <a class="link" href="PopplerDocument.html" title="PopplerDocument">PopplerDocument</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="PopplerDocument.html#PopplerDocument--format-minor" title='The "format-minor" property'>PopplerDocument:format-minor</a>, object property in <a class="link" href="PopplerDocument.html" title="PopplerDocument">PopplerDocument</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="PopplerDocument.html#PopplerDocument--keywords" title='The "keywords" property'>PopplerDocument:keywords</a>, object property in <a class="link" href="PopplerDocument.html" title="PopplerDocument">PopplerDocument</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="PopplerDocument.html#PopplerDocument--linearized" title='The "linearized" property'>PopplerDocument:linearized</a>, object property in <a class="link" href="PopplerDocument.html" title="PopplerDocument">PopplerDocument</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="PopplerDocument.html#PopplerDocument--metadata" title='The "metadata" property'>PopplerDocument:metadata</a>, object property in <a class="link" href="PopplerDocument.html" title="PopplerDocument">PopplerDocument</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="PopplerDocument.html#PopplerDocument--mod-date" title='The "mod-date" property'>PopplerDocument:mod-date</a>, object property in <a class="link" href="PopplerDocument.html" title="PopplerDocument">PopplerDocument</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="PopplerDocument.html#PopplerDocument--page-layout" title='The "page-layout" property'>PopplerDocument:page-layout</a>, object property in <a class="link" href="PopplerDocument.html" title="PopplerDocument">PopplerDocument</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="PopplerDocument.html#PopplerDocument--page-mode" title='The "page-mode" property'>PopplerDocument:page-mode</a>, object property in <a class="link" href="PopplerDocument.html" title="PopplerDocument">PopplerDocument</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="PopplerDocument.html#PopplerDocument--permissions" title='The "permissions" property'>PopplerDocument:permissions</a>, object property in <a class="link" href="PopplerDocument.html" title="PopplerDocument">PopplerDocument</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="PopplerDocument.html#PopplerDocument--producer" title='The "producer" property'>PopplerDocument:producer</a>, object property in <a class="link" href="PopplerDocument.html" title="PopplerDocument">PopplerDocument</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="PopplerDocument.html#PopplerDocument--subject" title='The "subject" property'>PopplerDocument:subject</a>, object property in <a class="link" href="PopplerDocument.html" title="PopplerDocument">PopplerDocument</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="PopplerDocument.html#PopplerDocument--title" title='The "title" property'>PopplerDocument:title</a>, object property in <a class="link" href="PopplerDocument.html" title="PopplerDocument">PopplerDocument</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="PopplerDocument.html#PopplerDocument--viewer-preferences" title='The "viewer-preferences" property'>PopplerDocument:viewer-preferences</a>, object property in <a class="link" href="PopplerDocument.html" title="PopplerDocument">PopplerDocument</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="PopplerDocument.html#poppler-document-find-dest" title="poppler_document_find_dest ()">poppler_document_find_dest</a>, function in <a class="link" href="PopplerDocument.html" title="PopplerDocument">PopplerDocument</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="PopplerDocument.html#poppler-document-get-attachments" title="poppler_document_get_attachments ()">poppler_document_get_attachments</a>, function in <a class="link" href="PopplerDocument.html" title="PopplerDocument">PopplerDocument</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="PopplerDocument.html#poppler-document-get-author" title="poppler_document_get_author ()">poppler_document_get_author</a>, function in <a class="link" href="PopplerDocument.html" title="PopplerDocument">PopplerDocument</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="PopplerDocument.html#poppler-document-get-creation-date" title="poppler_document_get_creation_date ()">poppler_document_get_creation_date</a>, function in <a class="link" href="PopplerDocument.html" title="PopplerDocument">PopplerDocument</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="PopplerDocument.html#poppler-document-get-creator" title="poppler_document_get_creator ()">poppler_document_get_creator</a>, function in <a class="link" href="PopplerDocument.html" title="PopplerDocument">PopplerDocument</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="PopplerDocument.html#poppler-document-get-form-field" title="poppler_document_get_form_field ()">poppler_document_get_form_field</a>, function in <a class="link" href="PopplerDocument.html" title="PopplerDocument">PopplerDocument</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="PopplerDocument.html#poppler-document-get-id" title="poppler_document_get_id ()">poppler_document_get_id</a>, function in <a class="link" href="PopplerDocument.html" title="PopplerDocument">PopplerDocument</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="PopplerDocument.html#poppler-document-get-keywords" title="poppler_document_get_keywords ()">poppler_document_get_keywords</a>, function in <a class="link" href="PopplerDocument.html" title="PopplerDocument">PopplerDocument</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="PopplerDocument.html#poppler-document-get-metadata" title="poppler_document_get_metadata ()">poppler_document_get_metadata</a>, function in <a class="link" href="PopplerDocument.html" title="PopplerDocument">PopplerDocument</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="PopplerDocument.html#poppler-document-get-modification-date" title="poppler_document_get_modification_date ()">poppler_document_get_modification_date</a>, function in <a class="link" href="PopplerDocument.html" title="PopplerDocument">PopplerDocument</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="PopplerDocument.html#poppler-document-get-n-attachments" title="poppler_document_get_n_attachments ()">poppler_document_get_n_attachments</a>, function in <a class="link" href="PopplerDocument.html" title="PopplerDocument">PopplerDocument</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="PopplerDocument.html#poppler-document-get-n-pages" title="poppler_document_get_n_pages ()">poppler_document_get_n_pages</a>, function in <a class="link" href="PopplerDocument.html" title="PopplerDocument">PopplerDocument</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="PopplerDocument.html#poppler-document-get-page" title="poppler_document_get_page ()">poppler_document_get_page</a>, function in <a class="link" href="PopplerDocument.html" title="PopplerDocument">PopplerDocument</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="PopplerDocument.html#poppler-document-get-page-by-label" title="poppler_document_get_page_by_label ()">poppler_document_get_page_by_label</a>, function in <a class="link" href="PopplerDocument.html" title="PopplerDocument">PopplerDocument</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="PopplerDocument.html#poppler-document-get-page-layout" title="poppler_document_get_page_layout ()">poppler_document_get_page_layout</a>, function in <a class="link" href="PopplerDocument.html" title="PopplerDocument">PopplerDocument</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="PopplerDocument.html#poppler-document-get-page-mode" title="poppler_document_get_page_mode ()">poppler_document_get_page_mode</a>, function in <a class="link" href="PopplerDocument.html" title="PopplerDocument">PopplerDocument</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="PopplerDocument.html#poppler-document-get-pdf-version" title="poppler_document_get_pdf_version ()">poppler_document_get_pdf_version</a>, function in <a class="link" href="PopplerDocument.html" title="PopplerDocument">PopplerDocument</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="PopplerDocument.html#poppler-document-get-pdf-version-string" title="poppler_document_get_pdf_version_string ()">poppler_document_get_pdf_version_string</a>, function in <a class="link" href="PopplerDocument.html" title="PopplerDocument">PopplerDocument</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="PopplerDocument.html#poppler-document-get-permissions" title="poppler_document_get_permissions ()">poppler_document_get_permissions</a>, function in <a class="link" href="PopplerDocument.html" title="PopplerDocument">PopplerDocument</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="PopplerDocument.html#poppler-document-get-producer" title="poppler_document_get_producer ()">poppler_document_get_producer</a>, function in <a class="link" href="PopplerDocument.html" title="PopplerDocument">PopplerDocument</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="PopplerDocument.html#poppler-document-get-subject" title="poppler_document_get_subject ()">poppler_document_get_subject</a>, function in <a class="link" href="PopplerDocument.html" title="PopplerDocument">PopplerDocument</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="PopplerDocument.html#poppler-document-get-title" title="poppler_document_get_title ()">poppler_document_get_title</a>, function in <a class="link" href="PopplerDocument.html" title="PopplerDocument">PopplerDocument</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="PopplerDocument.html#poppler-document-has-attachments" title="poppler_document_has_attachments ()">poppler_document_has_attachments</a>, function in <a class="link" href="PopplerDocument.html" title="PopplerDocument">PopplerDocument</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="PopplerDocument.html#poppler-document-is-linearized" title="poppler_document_is_linearized ()">poppler_document_is_linearized</a>, function in <a class="link" href="PopplerDocument.html" title="PopplerDocument">PopplerDocument</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="PopplerDocument.html#poppler-document-new-from-data" title="poppler_document_new_from_data ()">poppler_document_new_from_data</a>, function in <a class="link" href="PopplerDocument.html" title="PopplerDocument">PopplerDocument</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="PopplerDocument.html#poppler-document-new-from-file" title="poppler_document_new_from_file ()">poppler_document_new_from_file</a>, function in <a class="link" href="PopplerDocument.html" title="PopplerDocument">PopplerDocument</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="PopplerDocument.html#poppler-document-save" title="poppler_document_save ()">poppler_document_save</a>, function in <a class="link" href="PopplerDocument.html" title="PopplerDocument">PopplerDocument</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="PopplerDocument.html#poppler-document-save-a-copy" title="poppler_document_save_a_copy ()">poppler_document_save_a_copy</a>, function in <a class="link" href="PopplerDocument.html" title="PopplerDocument">PopplerDocument</a>
+</dt>
+<dd></dd>
+<a name="idxE"></a><h3 class="title">E</h3>
+<dt>
+<a class="link" href="poppler-poppler.html#POPPLER-ERROR:CAPS" title="POPPLER_ERROR">POPPLER_ERROR</a>, macro in <a class="link" href="poppler-poppler.html" title="poppler">poppler</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="poppler-poppler.html#PopplerError" title="enum PopplerError">PopplerError</a>, enum in <a class="link" href="poppler-poppler.html" title="poppler">poppler</a>
+</dt>
+<dd></dd>
+<a name="idxF"></a><h3 class="title">F</h3>
+<dt>
+<a class="link" href="PopplerDocument.html#PopplerFontInfo" title="PopplerFontInfo">PopplerFontInfo</a>, struct in <a class="link" href="PopplerDocument.html" title="PopplerDocument">PopplerDocument</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="PopplerDocument.html#PopplerFontsIter" title="PopplerFontsIter">PopplerFontsIter</a>, struct in <a class="link" href="PopplerDocument.html" title="PopplerDocument">PopplerDocument</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="PopplerDocument.html#poppler-fonts-iter-copy" title="poppler_fonts_iter_copy ()">poppler_fonts_iter_copy</a>, function in <a class="link" href="PopplerDocument.html" title="PopplerDocument">PopplerDocument</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="PopplerDocument.html#poppler-fonts-iter-free" title="poppler_fonts_iter_free ()">poppler_fonts_iter_free</a>, function in <a class="link" href="PopplerDocument.html" title="PopplerDocument">PopplerDocument</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="PopplerDocument.html#poppler-fonts-iter-get-encoding" title="poppler_fonts_iter_get_encoding ()">poppler_fonts_iter_get_encoding</a>, function in <a class="link" href="PopplerDocument.html" title="PopplerDocument">PopplerDocument</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="PopplerDocument.html#poppler-fonts-iter-get-file-name" title="poppler_fonts_iter_get_file_name ()">poppler_fonts_iter_get_file_name</a>, function in <a class="link" href="PopplerDocument.html" title="PopplerDocument">PopplerDocument</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="PopplerDocument.html#poppler-fonts-iter-get-font-type" title="poppler_fonts_iter_get_font_type ()">poppler_fonts_iter_get_font_type</a>, function in <a class="link" href="PopplerDocument.html" title="PopplerDocument">PopplerDocument</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="PopplerDocument.html#poppler-fonts-iter-get-full-name" title="poppler_fonts_iter_get_full_name ()">poppler_fonts_iter_get_full_name</a>, function in <a class="link" href="PopplerDocument.html" title="PopplerDocument">PopplerDocument</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="PopplerDocument.html#poppler-fonts-iter-get-name" title="poppler_fonts_iter_get_name ()">poppler_fonts_iter_get_name</a>, function in <a class="link" href="PopplerDocument.html" title="PopplerDocument">PopplerDocument</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="PopplerDocument.html#poppler-fonts-iter-get-substitute-name" title="poppler_fonts_iter_get_substitute_name ()">poppler_fonts_iter_get_substitute_name</a>, function in <a class="link" href="PopplerDocument.html" title="PopplerDocument">PopplerDocument</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="PopplerDocument.html#poppler-fonts-iter-is-embedded" title="poppler_fonts_iter_is_embedded ()">poppler_fonts_iter_is_embedded</a>, function in <a class="link" href="PopplerDocument.html" title="PopplerDocument">PopplerDocument</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="PopplerDocument.html#poppler-fonts-iter-is-subset" title="poppler_fonts_iter_is_subset ()">poppler_fonts_iter_is_subset</a>, function in <a class="link" href="PopplerDocument.html" title="PopplerDocument">PopplerDocument</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="PopplerDocument.html#poppler-fonts-iter-next" title="poppler_fonts_iter_next ()">poppler_fonts_iter_next</a>, function in <a class="link" href="PopplerDocument.html" title="PopplerDocument">PopplerDocument</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="PopplerDocument.html#PopplerFontType" title="enum PopplerFontType">PopplerFontType</a>, enum in <a class="link" href="PopplerDocument.html" title="PopplerDocument">PopplerDocument</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="PopplerDocument.html#poppler-font-info-free" title="poppler_font_info_free ()">poppler_font_info_free</a>, function in <a class="link" href="PopplerDocument.html" title="PopplerDocument">PopplerDocument</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="PopplerDocument.html#poppler-font-info-new" title="poppler_font_info_new ()">poppler_font_info_new</a>, function in <a class="link" href="PopplerDocument.html" title="PopplerDocument">PopplerDocument</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="PopplerDocument.html#poppler-font-info-scan" title="poppler_font_info_scan ()">poppler_font_info_scan</a>, function in <a class="link" href="PopplerDocument.html" title="PopplerDocument">PopplerDocument</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="PopplerFormField.html#PopplerFormButtonType" title="enum PopplerFormButtonType">PopplerFormButtonType</a>, enum in <a class="link" href="PopplerFormField.html" title="PoppplerFormField">PopplerFormField</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="PopplerFormField.html#PopplerFormChoiceType" title="enum PopplerFormChoiceType">PopplerFormChoiceType</a>, enum in <a class="link" href="PopplerFormField.html" title="PoppplerFormField">PopplerFormField</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="PopplerFormField.html#PopplerFormField-struct" title="PopplerFormField">PopplerFormField</a>, struct in <a class="link" href="PopplerFormField.html" title="PoppplerFormField">PopplerFormField</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="PopplerPage.html#PopplerFormFieldMapping" title="PopplerFormFieldMapping">PopplerFormFieldMapping</a>, struct in <a class="link" href="PopplerPage.html" title="PopplerPage">PopplerPage</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="PopplerFormField.html#PopplerFormFieldType" title="enum PopplerFormFieldType">PopplerFormFieldType</a>, enum in <a class="link" href="PopplerFormField.html" title="PoppplerFormField">PopplerFormField</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="PopplerFormField.html#PopplerFormTextType" title="enum PopplerFormTextType">PopplerFormTextType</a>, enum in <a class="link" href="PopplerFormField.html" title="PoppplerFormField">PopplerFormField</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="PopplerFormField.html#poppler-form-field-button-get-button-type" title="poppler_form_field_button_get_button_type ()">poppler_form_field_button_get_button_type</a>, function in <a class="link" href="PopplerFormField.html" title="PoppplerFormField">PopplerFormField</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="PopplerFormField.html#poppler-form-field-button-get-state" title="poppler_form_field_button_get_state ()">poppler_form_field_button_get_state</a>, function in <a class="link" href="PopplerFormField.html" title="PoppplerFormField">PopplerFormField</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="PopplerFormField.html#poppler-form-field-button-set-state" title="poppler_form_field_button_set_state ()">poppler_form_field_button_set_state</a>, function in <a class="link" href="PopplerFormField.html" title="PoppplerFormField">PopplerFormField</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="PopplerFormField.html#poppler-form-field-choice-can-select-multiple" title="poppler_form_field_choice_can_select_multiple ()">poppler_form_field_choice_can_select_multiple</a>, function in <a class="link" href="PopplerFormField.html" title="PoppplerFormField">PopplerFormField</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="PopplerFormField.html#poppler-form-field-choice-commit-on-change" title="poppler_form_field_choice_commit_on_change ()">poppler_form_field_choice_commit_on_change</a>, function in <a class="link" href="PopplerFormField.html" title="PoppplerFormField">PopplerFormField</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="PopplerFormField.html#poppler-form-field-choice-do-spell-check" title="poppler_form_field_choice_do_spell_check ()">poppler_form_field_choice_do_spell_check</a>, function in <a class="link" href="PopplerFormField.html" title="PoppplerFormField">PopplerFormField</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="PopplerFormField.html#poppler-form-field-choice-get-choice-type" title="poppler_form_field_choice_get_choice_type ()">poppler_form_field_choice_get_choice_type</a>, function in <a class="link" href="PopplerFormField.html" title="PoppplerFormField">PopplerFormField</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="PopplerFormField.html#poppler-form-field-choice-get-item" title="poppler_form_field_choice_get_item ()">poppler_form_field_choice_get_item</a>, function in <a class="link" href="PopplerFormField.html" title="PoppplerFormField">PopplerFormField</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="PopplerFormField.html#poppler-form-field-choice-get-n-items" title="poppler_form_field_choice_get_n_items ()">poppler_form_field_choice_get_n_items</a>, function in <a class="link" href="PopplerFormField.html" title="PoppplerFormField">PopplerFormField</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="PopplerFormField.html#poppler-form-field-choice-get-text" title="poppler_form_field_choice_get_text ()">poppler_form_field_choice_get_text</a>, function in <a class="link" href="PopplerFormField.html" title="PoppplerFormField">PopplerFormField</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="PopplerFormField.html#poppler-form-field-choice-is-editable" title="poppler_form_field_choice_is_editable ()">poppler_form_field_choice_is_editable</a>, function in <a class="link" href="PopplerFormField.html" title="PoppplerFormField">PopplerFormField</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="PopplerFormField.html#poppler-form-field-choice-is-item-selected" title="poppler_form_field_choice_is_item_selected ()">poppler_form_field_choice_is_item_selected</a>, function in <a class="link" href="PopplerFormField.html" title="PoppplerFormField">PopplerFormField</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="PopplerFormField.html#poppler-form-field-choice-select-item" title="poppler_form_field_choice_select_item ()">poppler_form_field_choice_select_item</a>, function in <a class="link" href="PopplerFormField.html" title="PoppplerFormField">PopplerFormField</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="PopplerFormField.html#poppler-form-field-choice-set-text" title="poppler_form_field_choice_set_text ()">poppler_form_field_choice_set_text</a>, function in <a class="link" href="PopplerFormField.html" title="PoppplerFormField">PopplerFormField</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="PopplerFormField.html#poppler-form-field-choice-toggle-item" title="poppler_form_field_choice_toggle_item ()">poppler_form_field_choice_toggle_item</a>, function in <a class="link" href="PopplerFormField.html" title="PoppplerFormField">PopplerFormField</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="PopplerFormField.html#poppler-form-field-choice-unselect-all" title="poppler_form_field_choice_unselect_all ()">poppler_form_field_choice_unselect_all</a>, function in <a class="link" href="PopplerFormField.html" title="PoppplerFormField">PopplerFormField</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="PopplerFormField.html#poppler-form-field-get-action" title="poppler_form_field_get_action ()">poppler_form_field_get_action</a>, function in <a class="link" href="PopplerFormField.html" title="PoppplerFormField">PopplerFormField</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="PopplerFormField.html#poppler-form-field-get-field-type" title="poppler_form_field_get_field_type ()">poppler_form_field_get_field_type</a>, function in <a class="link" href="PopplerFormField.html" title="PoppplerFormField">PopplerFormField</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="PopplerFormField.html#poppler-form-field-get-font-size" title="poppler_form_field_get_font_size ()">poppler_form_field_get_font_size</a>, function in <a class="link" href="PopplerFormField.html" title="PoppplerFormField">PopplerFormField</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="PopplerFormField.html#poppler-form-field-get-id" title="poppler_form_field_get_id ()">poppler_form_field_get_id</a>, function in <a class="link" href="PopplerFormField.html" title="PoppplerFormField">PopplerFormField</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="PopplerFormField.html#poppler-form-field-get-mapping-name" title="poppler_form_field_get_mapping_name ()">poppler_form_field_get_mapping_name</a>, function in <a class="link" href="PopplerFormField.html" title="PoppplerFormField">PopplerFormField</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="PopplerFormField.html#poppler-form-field-get-name" title="poppler_form_field_get_name ()">poppler_form_field_get_name</a>, function in <a class="link" href="PopplerFormField.html" title="PoppplerFormField">PopplerFormField</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="PopplerFormField.html#poppler-form-field-get-partial-name" title="poppler_form_field_get_partial_name ()">poppler_form_field_get_partial_name</a>, function in <a class="link" href="PopplerFormField.html" title="PoppplerFormField">PopplerFormField</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="PopplerFormField.html#poppler-form-field-is-read-only" title="poppler_form_field_is_read_only ()">poppler_form_field_is_read_only</a>, function in <a class="link" href="PopplerFormField.html" title="PoppplerFormField">PopplerFormField</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="PopplerPage.html#poppler-form-field-mapping-copy" title="poppler_form_field_mapping_copy ()">poppler_form_field_mapping_copy</a>, function in <a class="link" href="PopplerPage.html" title="PopplerPage">PopplerPage</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="PopplerPage.html#poppler-form-field-mapping-free" title="poppler_form_field_mapping_free ()">poppler_form_field_mapping_free</a>, function in <a class="link" href="PopplerPage.html" title="PopplerPage">PopplerPage</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="PopplerPage.html#poppler-form-field-mapping-new" title="poppler_form_field_mapping_new ()">poppler_form_field_mapping_new</a>, function in <a class="link" href="PopplerPage.html" title="PopplerPage">PopplerPage</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="PopplerFormField.html#poppler-form-field-text-do-scroll" title="poppler_form_field_text_do_scroll ()">poppler_form_field_text_do_scroll</a>, function in <a class="link" href="PopplerFormField.html" title="PoppplerFormField">PopplerFormField</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="PopplerFormField.html#poppler-form-field-text-do-spell-check" title="poppler_form_field_text_do_spell_check ()">poppler_form_field_text_do_spell_check</a>, function in <a class="link" href="PopplerFormField.html" title="PoppplerFormField">PopplerFormField</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="PopplerFormField.html#poppler-form-field-text-get-max-len" title="poppler_form_field_text_get_max_len ()">poppler_form_field_text_get_max_len</a>, function in <a class="link" href="PopplerFormField.html" title="PoppplerFormField">PopplerFormField</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="PopplerFormField.html#poppler-form-field-text-get-text" title="poppler_form_field_text_get_text ()">poppler_form_field_text_get_text</a>, function in <a class="link" href="PopplerFormField.html" title="PoppplerFormField">PopplerFormField</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="PopplerFormField.html#poppler-form-field-text-get-text-type" title="poppler_form_field_text_get_text_type ()">poppler_form_field_text_get_text_type</a>, function in <a class="link" href="PopplerFormField.html" title="PoppplerFormField">PopplerFormField</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="PopplerFormField.html#poppler-form-field-text-is-password" title="poppler_form_field_text_is_password ()">poppler_form_field_text_is_password</a>, function in <a class="link" href="PopplerFormField.html" title="PoppplerFormField">PopplerFormField</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="PopplerFormField.html#poppler-form-field-text-is-rich-text" title="poppler_form_field_text_is_rich_text ()">poppler_form_field_text_is_rich_text</a>, function in <a class="link" href="PopplerFormField.html" title="PoppplerFormField">PopplerFormField</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="PopplerFormField.html#poppler-form-field-text-set-text" title="poppler_form_field_text_set_text ()">poppler_form_field_text_set_text</a>, function in <a class="link" href="PopplerFormField.html" title="PoppplerFormField">PopplerFormField</a>
+</dt>
+<dd></dd>
+<a name="idxG"></a><h3 class="title">G</h3>
+<dt>
+<a class="link" href="poppler-poppler.html#poppler-get-backend" title="poppler_get_backend ()">poppler_get_backend</a>, function in <a class="link" href="poppler-poppler.html" title="poppler">poppler</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="poppler-poppler.html#poppler-get-version" title="poppler_get_version ()">poppler_get_version</a>, function in <a class="link" href="poppler-poppler.html" title="poppler">poppler</a>
+</dt>
+<dd></dd>
+<a name="idxH"></a><h3 class="title">H</h3>
+<dt>
+<a class="link" href="poppler-Version-and-Features-Information.html#POPPLER-HAS-CAIRO:CAPS" title="POPPLER_HAS_CAIRO">POPPLER_HAS_CAIRO</a>, macro in <a class="link" href="poppler-Version-and-Features-Information.html" title="Version and Features Information">Version and Features Information</a>
+</dt>
+<dd></dd>
+<a name="idxI"></a><h3 class="title">I</h3>
+<dt>
+<a class="link" href="PopplerPage.html#PopplerImageMapping" title="PopplerImageMapping">PopplerImageMapping</a>, struct in <a class="link" href="PopplerPage.html" title="PopplerPage">PopplerPage</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="PopplerPage.html#poppler-image-mapping-copy" title="poppler_image_mapping_copy ()">poppler_image_mapping_copy</a>, function in <a class="link" href="PopplerPage.html" title="PopplerPage">PopplerPage</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="PopplerPage.html#poppler-image-mapping-free" title="poppler_image_mapping_free ()">poppler_image_mapping_free</a>, function in <a class="link" href="PopplerPage.html" title="PopplerPage">PopplerPage</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="PopplerPage.html#poppler-image-mapping-new" title="poppler_image_mapping_new ()">poppler_image_mapping_new</a>, function in <a class="link" href="PopplerPage.html" title="PopplerPage">PopplerPage</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="PopplerDocument.html#PopplerIndexIter" title="PopplerIndexIter">PopplerIndexIter</a>, struct in <a class="link" href="PopplerDocument.html" title="PopplerDocument">PopplerDocument</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="PopplerDocument.html#poppler-index-iter-copy" title="poppler_index_iter_copy ()">poppler_index_iter_copy</a>, function in <a class="link" href="PopplerDocument.html" title="PopplerDocument">PopplerDocument</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="PopplerDocument.html#poppler-index-iter-free" title="poppler_index_iter_free ()">poppler_index_iter_free</a>, function in <a class="link" href="PopplerDocument.html" title="PopplerDocument">PopplerDocument</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="PopplerDocument.html#poppler-index-iter-get-action" title="poppler_index_iter_get_action ()">poppler_index_iter_get_action</a>, function in <a class="link" href="PopplerDocument.html" title="PopplerDocument">PopplerDocument</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="PopplerDocument.html#poppler-index-iter-get-child" title="poppler_index_iter_get_child ()">poppler_index_iter_get_child</a>, function in <a class="link" href="PopplerDocument.html" title="PopplerDocument">PopplerDocument</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="PopplerDocument.html#poppler-index-iter-is-open" title="poppler_index_iter_is_open ()">poppler_index_iter_is_open</a>, function in <a class="link" href="PopplerDocument.html" title="PopplerDocument">PopplerDocument</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="PopplerDocument.html#poppler-index-iter-new" title="poppler_index_iter_new ()">poppler_index_iter_new</a>, function in <a class="link" href="PopplerDocument.html" title="PopplerDocument">PopplerDocument</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="PopplerDocument.html#poppler-index-iter-next" title="poppler_index_iter_next ()">poppler_index_iter_next</a>, function in <a class="link" href="PopplerDocument.html" title="PopplerDocument">PopplerDocument</a>
+</dt>
+<dd></dd>
+<a name="idxL"></a><h3 class="title">L</h3>
+<dt>
+<a class="link" href="PopplerLayer.html#PopplerLayer-struct" title="PopplerLayer">PopplerLayer</a>, struct in <a class="link" href="PopplerLayer.html" title="PopplerLayer">PopplerLayer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="PopplerDocument.html#PopplerLayersIter" title="PopplerLayersIter">PopplerLayersIter</a>, struct in <a class="link" href="PopplerDocument.html" title="PopplerDocument">PopplerDocument</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="PopplerDocument.html#poppler-layers-iter-copy" title="poppler_layers_iter_copy ()">poppler_layers_iter_copy</a>, function in <a class="link" href="PopplerDocument.html" title="PopplerDocument">PopplerDocument</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="PopplerDocument.html#poppler-layers-iter-free" title="poppler_layers_iter_free ()">poppler_layers_iter_free</a>, function in <a class="link" href="PopplerDocument.html" title="PopplerDocument">PopplerDocument</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="PopplerDocument.html#poppler-layers-iter-get-child" title="poppler_layers_iter_get_child ()">poppler_layers_iter_get_child</a>, function in <a class="link" href="PopplerDocument.html" title="PopplerDocument">PopplerDocument</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="PopplerDocument.html#poppler-layers-iter-get-layer" title="poppler_layers_iter_get_layer ()">poppler_layers_iter_get_layer</a>, function in <a class="link" href="PopplerDocument.html" title="PopplerDocument">PopplerDocument</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="PopplerDocument.html#poppler-layers-iter-get-title" title="poppler_layers_iter_get_title ()">poppler_layers_iter_get_title</a>, function in <a class="link" href="PopplerDocument.html" title="PopplerDocument">PopplerDocument</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="PopplerDocument.html#poppler-layers-iter-new" title="poppler_layers_iter_new ()">poppler_layers_iter_new</a>, function in <a class="link" href="PopplerDocument.html" title="PopplerDocument">PopplerDocument</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="PopplerDocument.html#poppler-layers-iter-next" title="poppler_layers_iter_next ()">poppler_layers_iter_next</a>, function in <a class="link" href="PopplerDocument.html" title="PopplerDocument">PopplerDocument</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="PopplerLayer.html#poppler-layer-get-radio-button-group-id" title="poppler_layer_get_radio_button_group_id ()">poppler_layer_get_radio_button_group_id</a>, function in <a class="link" href="PopplerLayer.html" title="PopplerLayer">PopplerLayer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="PopplerLayer.html#poppler-layer-get-title" title="poppler_layer_get_title ()">poppler_layer_get_title</a>, function in <a class="link" href="PopplerLayer.html" title="PopplerLayer">PopplerLayer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="PopplerLayer.html#poppler-layer-hide" title="poppler_layer_hide ()">poppler_layer_hide</a>, function in <a class="link" href="PopplerLayer.html" title="PopplerLayer">PopplerLayer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="PopplerLayer.html#poppler-layer-is-parent" title="poppler_layer_is_parent ()">poppler_layer_is_parent</a>, function in <a class="link" href="PopplerLayer.html" title="PopplerLayer">PopplerLayer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="PopplerLayer.html#poppler-layer-is-visible" title="poppler_layer_is_visible ()">poppler_layer_is_visible</a>, function in <a class="link" href="PopplerLayer.html" title="PopplerLayer">PopplerLayer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="PopplerLayer.html#poppler-layer-show" title="poppler_layer_show ()">poppler_layer_show</a>, function in <a class="link" href="PopplerLayer.html" title="PopplerLayer">PopplerLayer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="PopplerPage.html#PopplerLinkMapping" title="PopplerLinkMapping">PopplerLinkMapping</a>, struct in <a class="link" href="PopplerPage.html" title="PopplerPage">PopplerPage</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="PopplerPage.html#poppler-link-mapping-copy" title="poppler_link_mapping_copy ()">poppler_link_mapping_copy</a>, function in <a class="link" href="PopplerPage.html" title="PopplerPage">PopplerPage</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="PopplerPage.html#poppler-link-mapping-free" title="poppler_link_mapping_free ()">poppler_link_mapping_free</a>, function in <a class="link" href="PopplerPage.html" title="PopplerPage">PopplerPage</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="PopplerPage.html#poppler-link-mapping-new" title="poppler_link_mapping_new ()">poppler_link_mapping_new</a>, function in <a class="link" href="PopplerPage.html" title="PopplerPage">PopplerPage</a>
+</dt>
+<dd></dd>
+<a name="idxM"></a><h3 class="title">M</h3>
+<dt>
+<a class="link" href="poppler-Version-and-Features-Information.html#POPPLER-MAJOR-VERSION:CAPS" title="POPPLER_MAJOR_VERSION">POPPLER_MAJOR_VERSION</a>, macro in <a class="link" href="poppler-Version-and-Features-Information.html" title="Version and Features Information">Version and Features Information</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="PopplerMedia.html#PopplerMedia-struct" title="PopplerMedia">PopplerMedia</a>, struct in <a class="link" href="PopplerMedia.html" title="PopplerMedia">PopplerMedia</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="PopplerMedia.html#PopplerMediaSaveFunc" title="PopplerMediaSaveFunc ()">PopplerMediaSaveFunc</a>, user_function in <a class="link" href="PopplerMedia.html" title="PopplerMedia">PopplerMedia</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="PopplerMedia.html#poppler-media-get-filename" title="poppler_media_get_filename ()">poppler_media_get_filename</a>, function in <a class="link" href="PopplerMedia.html" title="PopplerMedia">PopplerMedia</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="PopplerMedia.html#poppler-media-get-mime-type" title="poppler_media_get_mime_type ()">poppler_media_get_mime_type</a>, function in <a class="link" href="PopplerMedia.html" title="PopplerMedia">PopplerMedia</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="PopplerMedia.html#poppler-media-is-embedded" title="poppler_media_is_embedded ()">poppler_media_is_embedded</a>, function in <a class="link" href="PopplerMedia.html" title="PopplerMedia">PopplerMedia</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="PopplerMedia.html#poppler-media-save" title="poppler_media_save ()">poppler_media_save</a>, function in <a class="link" href="PopplerMedia.html" title="PopplerMedia">PopplerMedia</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="PopplerMedia.html#poppler-media-save-to-callback" title="poppler_media_save_to_callback ()">poppler_media_save_to_callback</a>, function in <a class="link" href="PopplerMedia.html" title="PopplerMedia">PopplerMedia</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="poppler-Version-and-Features-Information.html#POPPLER-MICRO-VERSION:CAPS" title="POPPLER_MICRO_VERSION">POPPLER_MICRO_VERSION</a>, macro in <a class="link" href="poppler-Version-and-Features-Information.html" title="Version and Features Information">Version and Features Information</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="poppler-Version-and-Features-Information.html#POPPLER-MINOR-VERSION:CAPS" title="POPPLER_MINOR_VERSION">POPPLER_MINOR_VERSION</a>, macro in <a class="link" href="poppler-Version-and-Features-Information.html" title="Version and Features Information">Version and Features Information</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="PopplerMovie.html#PopplerMovie-struct" title="PopplerMovie">PopplerMovie</a>, struct in <a class="link" href="PopplerMovie.html" title="PopplerMovie">PopplerMovie</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="PopplerMovie.html#poppler-movie-get-filename" title="poppler_movie_get_filename ()">poppler_movie_get_filename</a>, function in <a class="link" href="PopplerMovie.html" title="PopplerMovie">PopplerMovie</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="PopplerMovie.html#poppler-movie-need-poster" title="poppler_movie_need_poster ()">poppler_movie_need_poster</a>, function in <a class="link" href="PopplerMovie.html" title="PopplerMovie">PopplerMovie</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="PopplerMovie.html#poppler-movie-show-controls" title="poppler_movie_show_controls ()">poppler_movie_show_controls</a>, function in <a class="link" href="PopplerMovie.html" title="PopplerMovie">PopplerMovie</a>
+</dt>
+<dd></dd>
+<a name="idxO"></a><h3 class="title">O</h3>
+<dt>
+<a class="link" href="poppler-poppler.html#PopplerOrientation" title="enum PopplerOrientation">PopplerOrientation</a>, enum in <a class="link" href="poppler-poppler.html" title="poppler">poppler</a>
+</dt>
+<dd></dd>
+<a name="idxP"></a><h3 class="title">P</h3>
+<dt>
+<a class="link" href="PopplerPage.html#PopplerPage-struct" title="PopplerPage">PopplerPage</a>, struct in <a class="link" href="PopplerPage.html" title="PopplerPage">PopplerPage</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="PopplerPage.html#PopplerPage--label" title='The "label" property'>PopplerPage:label</a>, object property in <a class="link" href="PopplerPage.html" title="PopplerPage">PopplerPage</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="PopplerDocument.html#PopplerPageLayout" title="enum PopplerPageLayout">PopplerPageLayout</a>, enum in <a class="link" href="PopplerDocument.html" title="PopplerDocument">PopplerDocument</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="PopplerDocument.html#PopplerPageMode" title="enum PopplerPageMode">PopplerPageMode</a>, enum in <a class="link" href="PopplerDocument.html" title="PopplerDocument">PopplerDocument</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="PopplerPage.html#PopplerPageTransition" title="PopplerPageTransition">PopplerPageTransition</a>, struct in <a class="link" href="PopplerPage.html" title="PopplerPage">PopplerPage</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="PopplerPage.html#PopplerPageTransitionAlignment" title="enum PopplerPageTransitionAlignment">PopplerPageTransitionAlignment</a>, enum in <a class="link" href="PopplerPage.html" title="PopplerPage">PopplerPage</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="PopplerPage.html#PopplerPageTransitionDirection" title="enum PopplerPageTransitionDirection">PopplerPageTransitionDirection</a>, enum in <a class="link" href="PopplerPage.html" title="PopplerPage">PopplerPage</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="PopplerPage.html#PopplerPageTransitionType" title="enum PopplerPageTransitionType">PopplerPageTransitionType</a>, enum in <a class="link" href="PopplerPage.html" title="PopplerPage">PopplerPage</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="PopplerPage.html#poppler-page-add-annot" title="poppler_page_add_annot ()">poppler_page_add_annot</a>, function in <a class="link" href="PopplerPage.html" title="PopplerPage">PopplerPage</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="PopplerPage.html#poppler-page-find-text" title="poppler_page_find_text ()">poppler_page_find_text</a>, function in <a class="link" href="PopplerPage.html" title="PopplerPage">PopplerPage</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="PopplerPage.html#poppler-page-free-annot-mapping" title="poppler_page_free_annot_mapping ()">poppler_page_free_annot_mapping</a>, function in <a class="link" href="PopplerPage.html" title="PopplerPage">PopplerPage</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="PopplerPage.html#poppler-page-free-form-field-mapping" title="poppler_page_free_form_field_mapping ()">poppler_page_free_form_field_mapping</a>, function in <a class="link" href="PopplerPage.html" title="PopplerPage">PopplerPage</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="PopplerPage.html#poppler-page-free-image-mapping" title="poppler_page_free_image_mapping ()">poppler_page_free_image_mapping</a>, function in <a class="link" href="PopplerPage.html" title="PopplerPage">PopplerPage</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="PopplerPage.html#poppler-page-free-link-mapping" title="poppler_page_free_link_mapping ()">poppler_page_free_link_mapping</a>, function in <a class="link" href="PopplerPage.html" title="PopplerPage">PopplerPage</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="PopplerPage.html#poppler-page-free-text-attributes" title="poppler_page_free_text_attributes ()">poppler_page_free_text_attributes</a>, function in <a class="link" href="PopplerPage.html" title="PopplerPage">PopplerPage</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="PopplerPage.html#poppler-page-get-annot-mapping" title="poppler_page_get_annot_mapping ()">poppler_page_get_annot_mapping</a>, function in <a class="link" href="PopplerPage.html" title="PopplerPage">PopplerPage</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="PopplerPage.html#poppler-page-get-crop-box" title="poppler_page_get_crop_box ()">poppler_page_get_crop_box</a>, function in <a class="link" href="PopplerPage.html" title="PopplerPage">PopplerPage</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="PopplerPage.html#poppler-page-get-duration" title="poppler_page_get_duration ()">poppler_page_get_duration</a>, function in <a class="link" href="PopplerPage.html" title="PopplerPage">PopplerPage</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="PopplerPage.html#poppler-page-get-form-field-mapping" title="poppler_page_get_form_field_mapping ()">poppler_page_get_form_field_mapping</a>, function in <a class="link" href="PopplerPage.html" title="PopplerPage">PopplerPage</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="PopplerPage.html#poppler-page-get-image" title="poppler_page_get_image ()">poppler_page_get_image</a>, function in <a class="link" href="PopplerPage.html" title="PopplerPage">PopplerPage</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="PopplerPage.html#poppler-page-get-image-mapping" title="poppler_page_get_image_mapping ()">poppler_page_get_image_mapping</a>, function in <a class="link" href="PopplerPage.html" title="PopplerPage">PopplerPage</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="PopplerPage.html#poppler-page-get-index" title="poppler_page_get_index ()">poppler_page_get_index</a>, function in <a class="link" href="PopplerPage.html" title="PopplerPage">PopplerPage</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="PopplerPage.html#poppler-page-get-label" title="poppler_page_get_label ()">poppler_page_get_label</a>, function in <a class="link" href="PopplerPage.html" title="PopplerPage">PopplerPage</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="PopplerPage.html#poppler-page-get-link-mapping" title="poppler_page_get_link_mapping ()">poppler_page_get_link_mapping</a>, function in <a class="link" href="PopplerPage.html" title="PopplerPage">PopplerPage</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="PopplerPage.html#poppler-page-get-selected-region" title="poppler_page_get_selected_region ()">poppler_page_get_selected_region</a>, function in <a class="link" href="PopplerPage.html" title="PopplerPage">PopplerPage</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="PopplerPage.html#poppler-page-get-selected-text" title="poppler_page_get_selected_text ()">poppler_page_get_selected_text</a>, function in <a class="link" href="PopplerPage.html" title="PopplerPage">PopplerPage</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="PopplerPage.html#poppler-page-get-selection-region" title="poppler_page_get_selection_region ()">poppler_page_get_selection_region</a>, function in <a class="link" href="PopplerPage.html" title="PopplerPage">PopplerPage</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="PopplerPage.html#poppler-page-get-size" title="poppler_page_get_size ()">poppler_page_get_size</a>, function in <a class="link" href="PopplerPage.html" title="PopplerPage">PopplerPage</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="PopplerPage.html#poppler-page-get-text" title="poppler_page_get_text ()">poppler_page_get_text</a>, function in <a class="link" href="PopplerPage.html" title="PopplerPage">PopplerPage</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="PopplerPage.html#poppler-page-get-text-attributes" title="poppler_page_get_text_attributes ()">poppler_page_get_text_attributes</a>, function in <a class="link" href="PopplerPage.html" title="PopplerPage">PopplerPage</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="PopplerPage.html#poppler-page-get-text-layout" title="poppler_page_get_text_layout ()">poppler_page_get_text_layout</a>, function in <a class="link" href="PopplerPage.html" title="PopplerPage">PopplerPage</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="PopplerPage.html#poppler-page-get-thumbnail" title="poppler_page_get_thumbnail ()">poppler_page_get_thumbnail</a>, function in <a class="link" href="PopplerPage.html" title="PopplerPage">PopplerPage</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="PopplerPage.html#poppler-page-get-thumbnail-size" title="poppler_page_get_thumbnail_size ()">poppler_page_get_thumbnail_size</a>, function in <a class="link" href="PopplerPage.html" title="PopplerPage">PopplerPage</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="PopplerPage.html#poppler-page-get-transition" title="poppler_page_get_transition ()">poppler_page_get_transition</a>, function in <a class="link" href="PopplerPage.html" title="PopplerPage">PopplerPage</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="PopplerPage.html#poppler-page-render" title="poppler_page_render ()">poppler_page_render</a>, function in <a class="link" href="PopplerPage.html" title="PopplerPage">PopplerPage</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="PopplerPage.html#poppler-page-render-for-printing" title="poppler_page_render_for_printing ()">poppler_page_render_for_printing</a>, function in <a class="link" href="PopplerPage.html" title="PopplerPage">PopplerPage</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="PopplerPage.html#poppler-page-render-for-printing-with-options" title="poppler_page_render_for_printing_with_options ()">poppler_page_render_for_printing_with_options</a>, function in <a class="link" href="PopplerPage.html" title="PopplerPage">PopplerPage</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="PopplerPage.html#poppler-page-render-selection" title="poppler_page_render_selection ()">poppler_page_render_selection</a>, function in <a class="link" href="PopplerPage.html" title="PopplerPage">PopplerPage</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="PopplerPage.html#poppler-page-render-to-ps" title="poppler_page_render_to_ps ()">poppler_page_render_to_ps</a>, function in <a class="link" href="PopplerPage.html" title="PopplerPage">PopplerPage</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="PopplerPage.html#poppler-page-selection-region-free" title="poppler_page_selection_region_free ()">poppler_page_selection_region_free</a>, function in <a class="link" href="PopplerPage.html" title="PopplerPage">PopplerPage</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="PopplerPage.html#poppler-page-transition-copy" title="poppler_page_transition_copy ()">poppler_page_transition_copy</a>, function in <a class="link" href="PopplerPage.html" title="PopplerPage">PopplerPage</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="PopplerPage.html#poppler-page-transition-free" title="poppler_page_transition_free ()">poppler_page_transition_free</a>, function in <a class="link" href="PopplerPage.html" title="PopplerPage">PopplerPage</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="PopplerPage.html#poppler-page-transition-new" title="poppler_page_transition_new ()">poppler_page_transition_new</a>, function in <a class="link" href="PopplerPage.html" title="PopplerPage">PopplerPage</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="PopplerDocument.html#PopplerPermissions" title="enum PopplerPermissions">PopplerPermissions</a>, enum in <a class="link" href="PopplerDocument.html" title="PopplerDocument">PopplerDocument</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="poppler-poppler.html#PopplerPrintFlags" title="enum PopplerPrintFlags">PopplerPrintFlags</a>, enum in <a class="link" href="poppler-poppler.html" title="poppler">poppler</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="PopplerDocument.html#PopplerPSFile" title="PopplerPSFile">PopplerPSFile</a>, struct in <a class="link" href="PopplerDocument.html" title="PopplerDocument">PopplerDocument</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="PopplerDocument.html#poppler-ps-file-free" title="poppler_ps_file_free ()">poppler_ps_file_free</a>, function in <a class="link" href="PopplerDocument.html" title="PopplerDocument">PopplerDocument</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="PopplerDocument.html#poppler-ps-file-new" title="poppler_ps_file_new ()">poppler_ps_file_new</a>, function in <a class="link" href="PopplerDocument.html" title="PopplerDocument">PopplerDocument</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="PopplerDocument.html#poppler-ps-file-set-duplex" title="poppler_ps_file_set_duplex ()">poppler_ps_file_set_duplex</a>, function in <a class="link" href="PopplerDocument.html" title="PopplerDocument">PopplerDocument</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="PopplerDocument.html#poppler-ps-file-set-paper-size" title="poppler_ps_file_set_paper_size ()">poppler_ps_file_set_paper_size</a>, function in <a class="link" href="PopplerDocument.html" title="PopplerDocument">PopplerDocument</a>
+</dt>
+<dd></dd>
+<a name="idxR"></a><h3 class="title">R</h3>
+<dt>
+<a class="link" href="PopplerPage.html#PopplerRectangle" title="PopplerRectangle">PopplerRectangle</a>, struct in <a class="link" href="PopplerPage.html" title="PopplerPage">PopplerPage</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="PopplerPage.html#poppler-rectangle-copy" title="poppler_rectangle_copy ()">poppler_rectangle_copy</a>, function in <a class="link" href="PopplerPage.html" title="PopplerPage">PopplerPage</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="PopplerPage.html#poppler-rectangle-free" title="poppler_rectangle_free ()">poppler_rectangle_free</a>, function in <a class="link" href="PopplerPage.html" title="PopplerPage">PopplerPage</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="PopplerPage.html#poppler-rectangle-new" title="poppler_rectangle_new ()">poppler_rectangle_new</a>, function in <a class="link" href="PopplerPage.html" title="PopplerPage">PopplerPage</a>
+</dt>
+<dd></dd>
+<a name="idxS"></a><h3 class="title">S</h3>
+<dt>
+<a class="link" href="PopplerPage.html#PopplerSelectionStyle" title="enum PopplerSelectionStyle">PopplerSelectionStyle</a>, enum in <a class="link" href="PopplerPage.html" title="PopplerPage">PopplerPage</a>
+</dt>
+<dd></dd>
+<a name="idxT"></a><h3 class="title">T</h3>
+<dt>
+<a class="link" href="PopplerPage.html#PopplerTextAttributes" title="PopplerTextAttributes">PopplerTextAttributes</a>, struct in <a class="link" href="PopplerPage.html" title="PopplerPage">PopplerPage</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="PopplerPage.html#poppler-text-attributes-copy" title="poppler_text_attributes_copy ()">poppler_text_attributes_copy</a>, function in <a class="link" href="PopplerPage.html" title="PopplerPage">PopplerPage</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="PopplerPage.html#poppler-text-attributes-free" title="poppler_text_attributes_free ()">poppler_text_attributes_free</a>, function in <a class="link" href="PopplerPage.html" title="PopplerPage">PopplerPage</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="PopplerPage.html#poppler-text-attributes-new" title="poppler_text_attributes_new ()">poppler_text_attributes_new</a>, function in <a class="link" href="PopplerPage.html" title="PopplerPage">PopplerPage</a>
+</dt>
+<dd></dd>
+<a name="idxV"></a><h3 class="title">V</h3>
+<dt>
+<a class="link" href="PopplerDocument.html#PopplerViewerPreferences" title="enum PopplerViewerPreferences">PopplerViewerPreferences</a>, enum in <a class="link" href="PopplerDocument.html" title="PopplerDocument">PopplerDocument</a>
+</dt>
+<dd></dd>
+</div>
+<div class="footer">
+<hr>
+          Generated by GTK-Doc V1.18</div>
+</body>
+</html>
\ No newline at end of file
diff --git a/glib/reference/html/ch01.html b/glib/reference/html/ch01.html
new file mode 100644 (file)
index 0000000..6450a2c
--- /dev/null
@@ -0,0 +1,65 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>Poppler</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.76.1">
+<link rel="home" href="index.html" title="Poppler Reference Manual">
+<link rel="up" href="index.html" title="Poppler Reference Manual">
+<link rel="prev" href="index.html" title="Poppler Reference Manual">
+<link rel="next" href="poppler-poppler.html" title="poppler">
+<meta name="generator" content="GTK-Doc V1.18 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="2"><tr valign="middle">
+<td><a accesskey="p" href="index.html"><img src="left.png" width="24" height="24" border="0" alt="Prev"></a></td>
+<td> </td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="24" height="24" border="0" alt="Home"></a></td>
+<th width="100%" align="center">Poppler Reference Manual</th>
+<td><a accesskey="n" href="poppler-poppler.html"><img src="right.png" width="24" height="24" border="0" alt="Next"></a></td>
+</tr></table>
+<div class="chapter">
+<div class="titlepage"><div><div><h2 class="title">
+<a name="idp898464"></a>Poppler</h2></div></div></div>
+<div class="toc"><dl>
+<dt>
+<span class="refentrytitle"><a href="poppler-poppler.html">poppler</a></span><span class="refpurpose"></span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="PopplerDocument.html">PopplerDocument</a></span><span class="refpurpose"> — Information about a document</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="PopplerPage.html">PopplerPage</a></span><span class="refpurpose"> — Information about a page in a document</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="poppler-PopplerAction.html">PopplerAction</a></span><span class="refpurpose"> — Action links</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="PopplerAttachment.html">PopplerAttachment</a></span><span class="refpurpose"> — Attachments</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="PopplerFormField.html">PoppplerFormField</a></span><span class="refpurpose"> — Form Field</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="PopplerAnnot.html">PopplerAnnot</a></span><span class="refpurpose"> — Annotations</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="PopplerLayer.html">PopplerLayer</a></span><span class="refpurpose"> — Layers</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="PopplerMedia.html">PopplerMedia</a></span><span class="refpurpose"> — Media</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="PopplerMovie.html">PopplerMovie</a></span><span class="refpurpose"> — Movies</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="poppler-Version-and-Features-Information.html">Version and Features Information</a></span><span class="refpurpose"> — Variables and functions to check the poppler version and features</span>
+</dt>
+</dl></div>
+</div>
+<div class="footer">
+<hr>
+          Generated by GTK-Doc V1.18</div>
+</body>
+</html>
\ No newline at end of file
diff --git a/glib/reference/html/home.png b/glib/reference/html/home.png
new file mode 100644 (file)
index 0000000..fb60b55
Binary files /dev/null and b/glib/reference/html/home.png differ
diff --git a/glib/reference/html/index.html b/glib/reference/html/index.html
new file mode 100644 (file)
index 0000000..c685708
--- /dev/null
@@ -0,0 +1,75 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>Poppler Reference Manual</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.76.1">
+<link rel="home" href="index.html" title="Poppler Reference Manual">
+<link rel="next" href="ch01.html" title="Poppler">
+<meta name="generator" content="GTK-Doc V1.18 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<div class="book">
+<div class="titlepage">
+<div>
+<div><table class="navigation" id="top" width="100%" cellpadding="2" cellspacing="0"><tr><th valign="middle"><p class="title">Poppler Reference Manual</p></th></tr></table></div>
+<div><p class="releaseinfo">
+      for Poppler 0.20.4
+
+    </p></div>
+</div>
+<hr>
+</div>
+<div class="toc"><dl>
+<dt><span class="chapter"><a href="ch01.html">Poppler</a></span></dt>
+<dd><dl>
+<dt>
+<span class="refentrytitle"><a href="poppler-poppler.html">poppler</a></span><span class="refpurpose"></span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="PopplerDocument.html">PopplerDocument</a></span><span class="refpurpose"> — Information about a document</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="PopplerPage.html">PopplerPage</a></span><span class="refpurpose"> — Information about a page in a document</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="poppler-PopplerAction.html">PopplerAction</a></span><span class="refpurpose"> — Action links</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="PopplerAttachment.html">PopplerAttachment</a></span><span class="refpurpose"> — Attachments</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="PopplerFormField.html">PoppplerFormField</a></span><span class="refpurpose"> — Form Field</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="PopplerAnnot.html">PopplerAnnot</a></span><span class="refpurpose"> — Annotations</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="PopplerLayer.html">PopplerLayer</a></span><span class="refpurpose"> — Layers</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="PopplerMedia.html">PopplerMedia</a></span><span class="refpurpose"> — Media</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="PopplerMovie.html">PopplerMovie</a></span><span class="refpurpose"> — Movies</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="poppler-Version-and-Features-Information.html">Version and Features Information</a></span><span class="refpurpose"> — Variables and functions to check the poppler version and features</span>
+</dt>
+</dl></dd>
+<dt><span class="index"><a href="api-index-full.html">Index of all symbols</a></span></dt>
+<dt><span class="index"><a href="api-index-deprecated.html">Index of deprecated symbols</a></span></dt>
+<dt><span class="index"><a href="api-index-0-12.html">Index of new symbols in 0.12</a></span></dt>
+<dt><span class="index"><a href="api-index-0-14.html">Index of new symbols in 0.14</a></span></dt>
+<dt><span class="index"><a href="api-index-0-16.html">Index of new symbols in 0.16</a></span></dt>
+<dt><span class="index"><a href="api-index-0-18.html">Index of new symbols in 0.18</a></span></dt>
+<dt><span class="index"><a href="api-index-0-20.html">Index of new symbols in 0.20</a></span></dt>
+<dt><span class="glossary"><a href="annotation-glossary.html">Annotation Glossary</a></span></dt>
+</dl></div>
+</div>
+<div class="footer">
+<hr>
+          Generated by GTK-Doc V1.18</div>
+</body>
+</html>
\ No newline at end of file
diff --git a/glib/reference/html/index.sgml b/glib/reference/html/index.sgml
new file mode 100644 (file)
index 0000000..91c955a
--- /dev/null
@@ -0,0 +1,476 @@
+<ANCHOR id="poppler-poppler" href="poppler/poppler-poppler.html">
+<ANCHOR id="poppler-poppler.synopsis" href="poppler/poppler-poppler.html#poppler-poppler.synopsis">
+<ANCHOR id="poppler-poppler.description" href="poppler/poppler-poppler.html#poppler-poppler.description">
+<ANCHOR id="poppler-poppler.details" href="poppler/poppler-poppler.html#poppler-poppler.details">
+<ANCHOR id="POPPLER-ERROR:CAPS" href="poppler/poppler-poppler.html#POPPLER-ERROR:CAPS">
+<ANCHOR id="PopplerError" href="poppler/poppler-poppler.html#PopplerError">
+<ANCHOR id="POPPLER-ERROR-INVALID:CAPS" href="poppler/poppler-poppler.html#POPPLER-ERROR-INVALID:CAPS">
+<ANCHOR id="POPPLER-ERROR-ENCRYPTED:CAPS" href="poppler/poppler-poppler.html#POPPLER-ERROR-ENCRYPTED:CAPS">
+<ANCHOR id="POPPLER-ERROR-OPEN-FILE:CAPS" href="poppler/poppler-poppler.html#POPPLER-ERROR-OPEN-FILE:CAPS">
+<ANCHOR id="POPPLER-ERROR-BAD-CATALOG:CAPS" href="poppler/poppler-poppler.html#POPPLER-ERROR-BAD-CATALOG:CAPS">
+<ANCHOR id="POPPLER-ERROR-DAMAGED:CAPS" href="poppler/poppler-poppler.html#POPPLER-ERROR-DAMAGED:CAPS">
+<ANCHOR id="PopplerOrientation" href="poppler/poppler-poppler.html#PopplerOrientation">
+<ANCHOR id="PopplerBackend" href="poppler/poppler-poppler.html#PopplerBackend">
+<ANCHOR id="PopplerColor" href="poppler/poppler-poppler.html#PopplerColor">
+<ANCHOR id="PopplerPrintFlags" href="poppler/poppler-poppler.html#PopplerPrintFlags">
+<ANCHOR id="POPPLER-PRINT-DOCUMENT:CAPS" href="poppler/poppler-poppler.html#POPPLER-PRINT-DOCUMENT:CAPS">
+<ANCHOR id="POPPLER-PRINT-MARKUP-ANNOTS:CAPS" href="poppler/poppler-poppler.html#POPPLER-PRINT-MARKUP-ANNOTS:CAPS">
+<ANCHOR id="POPPLER-PRINT-STAMP-ANNOTS-ONLY:CAPS" href="poppler/poppler-poppler.html#POPPLER-PRINT-STAMP-ANNOTS-ONLY:CAPS">
+<ANCHOR id="POPPLER-PRINT-ALL:CAPS" href="poppler/poppler-poppler.html#POPPLER-PRINT-ALL:CAPS">
+<ANCHOR id="poppler-get-backend" href="poppler/poppler-poppler.html#poppler-get-backend">
+<ANCHOR id="poppler-get-version" href="poppler/poppler-poppler.html#poppler-get-version">
+<ANCHOR id="poppler-date-parse" href="poppler/poppler-poppler.html#poppler-date-parse">
+<ANCHOR id="poppler-color-new" href="poppler/poppler-poppler.html#poppler-color-new">
+<ANCHOR id="poppler-color-copy" href="poppler/poppler-poppler.html#poppler-color-copy">
+<ANCHOR id="poppler-color-free" href="poppler/poppler-poppler.html#poppler-color-free">
+<ANCHOR id="PopplerDocument" href="poppler/PopplerDocument.html">
+<ANCHOR id="PopplerDocument.synopsis" href="poppler/PopplerDocument.html#PopplerDocument.synopsis">
+<ANCHOR id="PopplerDocument.object-hierarchy" href="poppler/PopplerDocument.html#PopplerDocument.object-hierarchy">
+<ANCHOR id="PopplerDocument.properties" href="poppler/PopplerDocument.html#PopplerDocument.properties">
+<ANCHOR id="PopplerDocument.description" href="poppler/PopplerDocument.html#PopplerDocument.description">
+<ANCHOR id="PopplerDocument.details" href="poppler/PopplerDocument.html#PopplerDocument.details">
+<ANCHOR id="PopplerDocument-struct" href="poppler/PopplerDocument.html#PopplerDocument-struct">
+<ANCHOR id="PopplerIndexIter" href="poppler/PopplerDocument.html#PopplerIndexIter">
+<ANCHOR id="PopplerFontsIter" href="poppler/PopplerDocument.html#PopplerFontsIter">
+<ANCHOR id="PopplerLayersIter" href="poppler/PopplerDocument.html#PopplerLayersIter">
+<ANCHOR id="PopplerPageLayout" href="poppler/PopplerDocument.html#PopplerPageLayout">
+<ANCHOR id="POPPLER-PAGE-LAYOUT-UNSET:CAPS" href="poppler/PopplerDocument.html#POPPLER-PAGE-LAYOUT-UNSET:CAPS">
+<ANCHOR id="POPPLER-PAGE-LAYOUT-SINGLE-PAGE:CAPS" href="poppler/PopplerDocument.html#POPPLER-PAGE-LAYOUT-SINGLE-PAGE:CAPS">
+<ANCHOR id="POPPLER-PAGE-LAYOUT-ONE-COLUMN:CAPS" href="poppler/PopplerDocument.html#POPPLER-PAGE-LAYOUT-ONE-COLUMN:CAPS">
+<ANCHOR id="POPPLER-PAGE-LAYOUT-TWO-COLUMN-LEFT:CAPS" href="poppler/PopplerDocument.html#POPPLER-PAGE-LAYOUT-TWO-COLUMN-LEFT:CAPS">
+<ANCHOR id="POPPLER-PAGE-LAYOUT-TWO-COLUMN-RIGHT:CAPS" href="poppler/PopplerDocument.html#POPPLER-PAGE-LAYOUT-TWO-COLUMN-RIGHT:CAPS">
+<ANCHOR id="POPPLER-PAGE-LAYOUT-TWO-PAGE-LEFT:CAPS" href="poppler/PopplerDocument.html#POPPLER-PAGE-LAYOUT-TWO-PAGE-LEFT:CAPS">
+<ANCHOR id="POPPLER-PAGE-LAYOUT-TWO-PAGE-RIGHT:CAPS" href="poppler/PopplerDocument.html#POPPLER-PAGE-LAYOUT-TWO-PAGE-RIGHT:CAPS">
+<ANCHOR id="PopplerPageMode" href="poppler/PopplerDocument.html#PopplerPageMode">
+<ANCHOR id="POPPLER-PAGE-MODE-UNSET:CAPS" href="poppler/PopplerDocument.html#POPPLER-PAGE-MODE-UNSET:CAPS">
+<ANCHOR id="POPPLER-PAGE-MODE-NONE:CAPS" href="poppler/PopplerDocument.html#POPPLER-PAGE-MODE-NONE:CAPS">
+<ANCHOR id="POPPLER-PAGE-MODE-USE-OUTLINES:CAPS" href="poppler/PopplerDocument.html#POPPLER-PAGE-MODE-USE-OUTLINES:CAPS">
+<ANCHOR id="POPPLER-PAGE-MODE-USE-THUMBS:CAPS" href="poppler/PopplerDocument.html#POPPLER-PAGE-MODE-USE-THUMBS:CAPS">
+<ANCHOR id="POPPLER-PAGE-MODE-FULL-SCREEN:CAPS" href="poppler/PopplerDocument.html#POPPLER-PAGE-MODE-FULL-SCREEN:CAPS">
+<ANCHOR id="POPPLER-PAGE-MODE-USE-OC:CAPS" href="poppler/PopplerDocument.html#POPPLER-PAGE-MODE-USE-OC:CAPS">
+<ANCHOR id="POPPLER-PAGE-MODE-USE-ATTACHMENTS:CAPS" href="poppler/PopplerDocument.html#POPPLER-PAGE-MODE-USE-ATTACHMENTS:CAPS">
+<ANCHOR id="PopplerFontInfo" href="poppler/PopplerDocument.html#PopplerFontInfo">
+<ANCHOR id="PopplerFontType" href="poppler/PopplerDocument.html#PopplerFontType">
+<ANCHOR id="POPPLER-FONT-TYPE-UNKNOWN:CAPS" href="poppler/PopplerDocument.html#POPPLER-FONT-TYPE-UNKNOWN:CAPS">
+<ANCHOR id="POPPLER-FONT-TYPE-TYPE1:CAPS" href="poppler/PopplerDocument.html#POPPLER-FONT-TYPE-TYPE1:CAPS">
+<ANCHOR id="POPPLER-FONT-TYPE-TYPE1C:CAPS" href="poppler/PopplerDocument.html#POPPLER-FONT-TYPE-TYPE1C:CAPS">
+<ANCHOR id="POPPLER-FONT-TYPE-TYPE1COT:CAPS" href="poppler/PopplerDocument.html#POPPLER-FONT-TYPE-TYPE1COT:CAPS">
+<ANCHOR id="POPPLER-FONT-TYPE-TYPE3:CAPS" href="poppler/PopplerDocument.html#POPPLER-FONT-TYPE-TYPE3:CAPS">
+<ANCHOR id="POPPLER-FONT-TYPE-TRUETYPE:CAPS" href="poppler/PopplerDocument.html#POPPLER-FONT-TYPE-TRUETYPE:CAPS">
+<ANCHOR id="POPPLER-FONT-TYPE-TRUETYPEOT:CAPS" href="poppler/PopplerDocument.html#POPPLER-FONT-TYPE-TRUETYPEOT:CAPS">
+<ANCHOR id="POPPLER-FONT-TYPE-CID-TYPE0:CAPS" href="poppler/PopplerDocument.html#POPPLER-FONT-TYPE-CID-TYPE0:CAPS">
+<ANCHOR id="POPPLER-FONT-TYPE-CID-TYPE0C:CAPS" href="poppler/PopplerDocument.html#POPPLER-FONT-TYPE-CID-TYPE0C:CAPS">
+<ANCHOR id="POPPLER-FONT-TYPE-CID-TYPE0COT:CAPS" href="poppler/PopplerDocument.html#POPPLER-FONT-TYPE-CID-TYPE0COT:CAPS">
+<ANCHOR id="POPPLER-FONT-TYPE-CID-TYPE2:CAPS" href="poppler/PopplerDocument.html#POPPLER-FONT-TYPE-CID-TYPE2:CAPS">
+<ANCHOR id="POPPLER-FONT-TYPE-CID-TYPE2OT:CAPS" href="poppler/PopplerDocument.html#POPPLER-FONT-TYPE-CID-TYPE2OT:CAPS">
+<ANCHOR id="PopplerPSFile" href="poppler/PopplerDocument.html#PopplerPSFile">
+<ANCHOR id="PopplerViewerPreferences" href="poppler/PopplerDocument.html#PopplerViewerPreferences">
+<ANCHOR id="POPPLER-VIEWER-PREFERENCES-UNSET:CAPS" href="poppler/PopplerDocument.html#POPPLER-VIEWER-PREFERENCES-UNSET:CAPS">
+<ANCHOR id="POPPLER-VIEWER-PREFERENCES-HIDE-TOOLBAR:CAPS" href="poppler/PopplerDocument.html#POPPLER-VIEWER-PREFERENCES-HIDE-TOOLBAR:CAPS">
+<ANCHOR id="POPPLER-VIEWER-PREFERENCES-HIDE-MENUBAR:CAPS" href="poppler/PopplerDocument.html#POPPLER-VIEWER-PREFERENCES-HIDE-MENUBAR:CAPS">
+<ANCHOR id="POPPLER-VIEWER-PREFERENCES-HIDE-WINDOWUI:CAPS" href="poppler/PopplerDocument.html#POPPLER-VIEWER-PREFERENCES-HIDE-WINDOWUI:CAPS">
+<ANCHOR id="POPPLER-VIEWER-PREFERENCES-FIT-WINDOW:CAPS" href="poppler/PopplerDocument.html#POPPLER-VIEWER-PREFERENCES-FIT-WINDOW:CAPS">
+<ANCHOR id="POPPLER-VIEWER-PREFERENCES-CENTER-WINDOW:CAPS" href="poppler/PopplerDocument.html#POPPLER-VIEWER-PREFERENCES-CENTER-WINDOW:CAPS">
+<ANCHOR id="POPPLER-VIEWER-PREFERENCES-DISPLAY-DOC-TITLE:CAPS" href="poppler/PopplerDocument.html#POPPLER-VIEWER-PREFERENCES-DISPLAY-DOC-TITLE:CAPS">
+<ANCHOR id="POPPLER-VIEWER-PREFERENCES-DIRECTION-RTL:CAPS" href="poppler/PopplerDocument.html#POPPLER-VIEWER-PREFERENCES-DIRECTION-RTL:CAPS">
+<ANCHOR id="PopplerPermissions" href="poppler/PopplerDocument.html#PopplerPermissions">
+<ANCHOR id="POPPLER-PERMISSIONS-OK-TO-PRINT:CAPS" href="poppler/PopplerDocument.html#POPPLER-PERMISSIONS-OK-TO-PRINT:CAPS">
+<ANCHOR id="POPPLER-PERMISSIONS-OK-TO-MODIFY:CAPS" href="poppler/PopplerDocument.html#POPPLER-PERMISSIONS-OK-TO-MODIFY:CAPS">
+<ANCHOR id="POPPLER-PERMISSIONS-OK-TO-COPY:CAPS" href="poppler/PopplerDocument.html#POPPLER-PERMISSIONS-OK-TO-COPY:CAPS">
+<ANCHOR id="POPPLER-PERMISSIONS-OK-TO-ADD-NOTES:CAPS" href="poppler/PopplerDocument.html#POPPLER-PERMISSIONS-OK-TO-ADD-NOTES:CAPS">
+<ANCHOR id="POPPLER-PERMISSIONS-OK-TO-FILL-FORM:CAPS" href="poppler/PopplerDocument.html#POPPLER-PERMISSIONS-OK-TO-FILL-FORM:CAPS">
+<ANCHOR id="POPPLER-PERMISSIONS-OK-TO-EXTRACT-CONTENTS:CAPS" href="poppler/PopplerDocument.html#POPPLER-PERMISSIONS-OK-TO-EXTRACT-CONTENTS:CAPS">
+<ANCHOR id="POPPLER-PERMISSIONS-OK-TO-ASSEMBLE:CAPS" href="poppler/PopplerDocument.html#POPPLER-PERMISSIONS-OK-TO-ASSEMBLE:CAPS">
+<ANCHOR id="POPPLER-PERMISSIONS-OK-TO-PRINT-HIGH-RESOLUTION:CAPS" href="poppler/PopplerDocument.html#POPPLER-PERMISSIONS-OK-TO-PRINT-HIGH-RESOLUTION:CAPS">
+<ANCHOR id="POPPLER-PERMISSIONS-FULL:CAPS" href="poppler/PopplerDocument.html#POPPLER-PERMISSIONS-FULL:CAPS">
+<ANCHOR id="poppler-document-new-from-file" href="poppler/PopplerDocument.html#poppler-document-new-from-file">
+<ANCHOR id="poppler-document-new-from-data" href="poppler/PopplerDocument.html#poppler-document-new-from-data">
+<ANCHOR id="poppler-document-save" href="poppler/PopplerDocument.html#poppler-document-save">
+<ANCHOR id="poppler-document-save-a-copy" href="poppler/PopplerDocument.html#poppler-document-save-a-copy">
+<ANCHOR id="poppler-document-get-id" href="poppler/PopplerDocument.html#poppler-document-get-id">
+<ANCHOR id="poppler-document-get-pdf-version-string" href="poppler/PopplerDocument.html#poppler-document-get-pdf-version-string">
+<ANCHOR id="poppler-document-get-pdf-version" href="poppler/PopplerDocument.html#poppler-document-get-pdf-version">
+<ANCHOR id="poppler-document-get-title" href="poppler/PopplerDocument.html#poppler-document-get-title">
+<ANCHOR id="poppler-document-get-author" href="poppler/PopplerDocument.html#poppler-document-get-author">
+<ANCHOR id="poppler-document-get-subject" href="poppler/PopplerDocument.html#poppler-document-get-subject">
+<ANCHOR id="poppler-document-get-keywords" href="poppler/PopplerDocument.html#poppler-document-get-keywords">
+<ANCHOR id="poppler-document-get-creator" href="poppler/PopplerDocument.html#poppler-document-get-creator">
+<ANCHOR id="poppler-document-get-producer" href="poppler/PopplerDocument.html#poppler-document-get-producer">
+<ANCHOR id="poppler-document-get-creation-date" href="poppler/PopplerDocument.html#poppler-document-get-creation-date">
+<ANCHOR id="poppler-document-get-modification-date" href="poppler/PopplerDocument.html#poppler-document-get-modification-date">
+<ANCHOR id="poppler-document-get-page-layout" href="poppler/PopplerDocument.html#poppler-document-get-page-layout">
+<ANCHOR id="poppler-document-get-page-mode" href="poppler/PopplerDocument.html#poppler-document-get-page-mode">
+<ANCHOR id="poppler-document-get-permissions" href="poppler/PopplerDocument.html#poppler-document-get-permissions">
+<ANCHOR id="poppler-document-get-metadata" href="poppler/PopplerDocument.html#poppler-document-get-metadata">
+<ANCHOR id="poppler-document-is-linearized" href="poppler/PopplerDocument.html#poppler-document-is-linearized">
+<ANCHOR id="poppler-document-get-n-pages" href="poppler/PopplerDocument.html#poppler-document-get-n-pages">
+<ANCHOR id="poppler-document-get-page" href="poppler/PopplerDocument.html#poppler-document-get-page">
+<ANCHOR id="poppler-document-get-page-by-label" href="poppler/PopplerDocument.html#poppler-document-get-page-by-label">
+<ANCHOR id="poppler-document-find-dest" href="poppler/PopplerDocument.html#poppler-document-find-dest">
+<ANCHOR id="poppler-document-get-n-attachments" href="poppler/PopplerDocument.html#poppler-document-get-n-attachments">
+<ANCHOR id="poppler-document-has-attachments" href="poppler/PopplerDocument.html#poppler-document-has-attachments">
+<ANCHOR id="poppler-document-get-attachments" href="poppler/PopplerDocument.html#poppler-document-get-attachments">
+<ANCHOR id="poppler-document-get-form-field" href="poppler/PopplerDocument.html#poppler-document-get-form-field">
+<ANCHOR id="poppler-index-iter-new" href="poppler/PopplerDocument.html#poppler-index-iter-new">
+<ANCHOR id="poppler-index-iter-copy" href="poppler/PopplerDocument.html#poppler-index-iter-copy">
+<ANCHOR id="poppler-index-iter-free" href="poppler/PopplerDocument.html#poppler-index-iter-free">
+<ANCHOR id="poppler-index-iter-get-child" href="poppler/PopplerDocument.html#poppler-index-iter-get-child">
+<ANCHOR id="poppler-index-iter-is-open" href="poppler/PopplerDocument.html#poppler-index-iter-is-open">
+<ANCHOR id="poppler-index-iter-get-action" href="poppler/PopplerDocument.html#poppler-index-iter-get-action">
+<ANCHOR id="poppler-index-iter-next" href="poppler/PopplerDocument.html#poppler-index-iter-next">
+<ANCHOR id="poppler-font-info-new" href="poppler/PopplerDocument.html#poppler-font-info-new">
+<ANCHOR id="poppler-font-info-scan" href="poppler/PopplerDocument.html#poppler-font-info-scan">
+<ANCHOR id="poppler-font-info-free" href="poppler/PopplerDocument.html#poppler-font-info-free">
+<ANCHOR id="poppler-fonts-iter-copy" href="poppler/PopplerDocument.html#poppler-fonts-iter-copy">
+<ANCHOR id="poppler-fonts-iter-free" href="poppler/PopplerDocument.html#poppler-fonts-iter-free">
+<ANCHOR id="poppler-fonts-iter-get-name" href="poppler/PopplerDocument.html#poppler-fonts-iter-get-name">
+<ANCHOR id="poppler-fonts-iter-get-full-name" href="poppler/PopplerDocument.html#poppler-fonts-iter-get-full-name">
+<ANCHOR id="poppler-fonts-iter-get-font-type" href="poppler/PopplerDocument.html#poppler-fonts-iter-get-font-type">
+<ANCHOR id="poppler-fonts-iter-get-substitute-name" href="poppler/PopplerDocument.html#poppler-fonts-iter-get-substitute-name">
+<ANCHOR id="poppler-fonts-iter-get-file-name" href="poppler/PopplerDocument.html#poppler-fonts-iter-get-file-name">
+<ANCHOR id="poppler-fonts-iter-get-encoding" href="poppler/PopplerDocument.html#poppler-fonts-iter-get-encoding">
+<ANCHOR id="poppler-fonts-iter-is-embedded" href="poppler/PopplerDocument.html#poppler-fonts-iter-is-embedded">
+<ANCHOR id="poppler-fonts-iter-is-subset" href="poppler/PopplerDocument.html#poppler-fonts-iter-is-subset">
+<ANCHOR id="poppler-fonts-iter-next" href="poppler/PopplerDocument.html#poppler-fonts-iter-next">
+<ANCHOR id="poppler-layers-iter-new" href="poppler/PopplerDocument.html#poppler-layers-iter-new">
+<ANCHOR id="poppler-layers-iter-copy" href="poppler/PopplerDocument.html#poppler-layers-iter-copy">
+<ANCHOR id="poppler-layers-iter-free" href="poppler/PopplerDocument.html#poppler-layers-iter-free">
+<ANCHOR id="poppler-layers-iter-get-child" href="poppler/PopplerDocument.html#poppler-layers-iter-get-child">
+<ANCHOR id="poppler-layers-iter-get-layer" href="poppler/PopplerDocument.html#poppler-layers-iter-get-layer">
+<ANCHOR id="poppler-layers-iter-get-title" href="poppler/PopplerDocument.html#poppler-layers-iter-get-title">
+<ANCHOR id="poppler-layers-iter-next" href="poppler/PopplerDocument.html#poppler-layers-iter-next">
+<ANCHOR id="poppler-ps-file-new" href="poppler/PopplerDocument.html#poppler-ps-file-new">
+<ANCHOR id="poppler-ps-file-free" href="poppler/PopplerDocument.html#poppler-ps-file-free">
+<ANCHOR id="poppler-ps-file-set-paper-size" href="poppler/PopplerDocument.html#poppler-ps-file-set-paper-size">
+<ANCHOR id="poppler-ps-file-set-duplex" href="poppler/PopplerDocument.html#poppler-ps-file-set-duplex">
+<ANCHOR id="PopplerDocument.property-details" href="poppler/PopplerDocument.html#PopplerDocument.property-details">
+<ANCHOR id="PopplerDocument--author" href="poppler/PopplerDocument.html#PopplerDocument--author">
+<ANCHOR id="PopplerDocument--creation-date" href="poppler/PopplerDocument.html#PopplerDocument--creation-date">
+<ANCHOR id="PopplerDocument--creator" href="poppler/PopplerDocument.html#PopplerDocument--creator">
+<ANCHOR id="PopplerDocument--format" href="poppler/PopplerDocument.html#PopplerDocument--format">
+<ANCHOR id="PopplerDocument--format-major" href="poppler/PopplerDocument.html#PopplerDocument--format-major">
+<ANCHOR id="PopplerDocument--format-minor" href="poppler/PopplerDocument.html#PopplerDocument--format-minor">
+<ANCHOR id="PopplerDocument--keywords" href="poppler/PopplerDocument.html#PopplerDocument--keywords">
+<ANCHOR id="PopplerDocument--linearized" href="poppler/PopplerDocument.html#PopplerDocument--linearized">
+<ANCHOR id="PopplerDocument--metadata" href="poppler/PopplerDocument.html#PopplerDocument--metadata">
+<ANCHOR id="PopplerDocument--mod-date" href="poppler/PopplerDocument.html#PopplerDocument--mod-date">
+<ANCHOR id="PopplerDocument--page-layout" href="poppler/PopplerDocument.html#PopplerDocument--page-layout">
+<ANCHOR id="PopplerDocument--page-mode" href="poppler/PopplerDocument.html#PopplerDocument--page-mode">
+<ANCHOR id="PopplerDocument--permissions" href="poppler/PopplerDocument.html#PopplerDocument--permissions">
+<ANCHOR id="PopplerDocument--producer" href="poppler/PopplerDocument.html#PopplerDocument--producer">
+<ANCHOR id="PopplerDocument--subject" href="poppler/PopplerDocument.html#PopplerDocument--subject">
+<ANCHOR id="PopplerDocument--title" href="poppler/PopplerDocument.html#PopplerDocument--title">
+<ANCHOR id="PopplerDocument--viewer-preferences" href="poppler/PopplerDocument.html#PopplerDocument--viewer-preferences">
+<ANCHOR id="PopplerPage" href="poppler/PopplerPage.html">
+<ANCHOR id="PopplerPage.synopsis" href="poppler/PopplerPage.html#PopplerPage.synopsis">
+<ANCHOR id="PopplerPage.object-hierarchy" href="poppler/PopplerPage.html#PopplerPage.object-hierarchy">
+<ANCHOR id="PopplerPage.properties" href="poppler/PopplerPage.html#PopplerPage.properties">
+<ANCHOR id="PopplerPage.description" href="poppler/PopplerPage.html#PopplerPage.description">
+<ANCHOR id="PopplerPage.details" href="poppler/PopplerPage.html#PopplerPage.details">
+<ANCHOR id="PopplerPage-struct" href="poppler/PopplerPage.html#PopplerPage-struct">
+<ANCHOR id="PopplerRectangle" href="poppler/PopplerPage.html#PopplerRectangle">
+<ANCHOR id="PopplerPageTransition" href="poppler/PopplerPage.html#PopplerPageTransition">
+<ANCHOR id="PopplerLinkMapping" href="poppler/PopplerPage.html#PopplerLinkMapping">
+<ANCHOR id="PopplerImageMapping" href="poppler/PopplerPage.html#PopplerImageMapping">
+<ANCHOR id="PopplerFormFieldMapping" href="poppler/PopplerPage.html#PopplerFormFieldMapping">
+<ANCHOR id="PopplerAnnotMapping" href="poppler/PopplerPage.html#PopplerAnnotMapping">
+<ANCHOR id="PopplerPageTransitionType" href="poppler/PopplerPage.html#PopplerPageTransitionType">
+<ANCHOR id="POPPLER-PAGE-TRANSITION-REPLACE:CAPS" href="poppler/PopplerPage.html#POPPLER-PAGE-TRANSITION-REPLACE:CAPS">
+<ANCHOR id="POPPLER-PAGE-TRANSITION-SPLIT:CAPS" href="poppler/PopplerPage.html#POPPLER-PAGE-TRANSITION-SPLIT:CAPS">
+<ANCHOR id="POPPLER-PAGE-TRANSITION-BLINDS:CAPS" href="poppler/PopplerPage.html#POPPLER-PAGE-TRANSITION-BLINDS:CAPS">
+<ANCHOR id="POPPLER-PAGE-TRANSITION-BOX:CAPS" href="poppler/PopplerPage.html#POPPLER-PAGE-TRANSITION-BOX:CAPS">
+<ANCHOR id="POPPLER-PAGE-TRANSITION-WIPE:CAPS" href="poppler/PopplerPage.html#POPPLER-PAGE-TRANSITION-WIPE:CAPS">
+<ANCHOR id="POPPLER-PAGE-TRANSITION-DISSOLVE:CAPS" href="poppler/PopplerPage.html#POPPLER-PAGE-TRANSITION-DISSOLVE:CAPS">
+<ANCHOR id="POPPLER-PAGE-TRANSITION-GLITTER:CAPS" href="poppler/PopplerPage.html#POPPLER-PAGE-TRANSITION-GLITTER:CAPS">
+<ANCHOR id="POPPLER-PAGE-TRANSITION-FLY:CAPS" href="poppler/PopplerPage.html#POPPLER-PAGE-TRANSITION-FLY:CAPS">
+<ANCHOR id="POPPLER-PAGE-TRANSITION-PUSH:CAPS" href="poppler/PopplerPage.html#POPPLER-PAGE-TRANSITION-PUSH:CAPS">
+<ANCHOR id="POPPLER-PAGE-TRANSITION-COVER:CAPS" href="poppler/PopplerPage.html#POPPLER-PAGE-TRANSITION-COVER:CAPS">
+<ANCHOR id="POPPLER-PAGE-TRANSITION-UNCOVER:CAPS" href="poppler/PopplerPage.html#POPPLER-PAGE-TRANSITION-UNCOVER:CAPS">
+<ANCHOR id="POPPLER-PAGE-TRANSITION-FADE:CAPS" href="poppler/PopplerPage.html#POPPLER-PAGE-TRANSITION-FADE:CAPS">
+<ANCHOR id="PopplerPageTransitionAlignment" href="poppler/PopplerPage.html#PopplerPageTransitionAlignment">
+<ANCHOR id="POPPLER-PAGE-TRANSITION-HORIZONTAL:CAPS" href="poppler/PopplerPage.html#POPPLER-PAGE-TRANSITION-HORIZONTAL:CAPS">
+<ANCHOR id="POPPLER-PAGE-TRANSITION-VERTICAL:CAPS" href="poppler/PopplerPage.html#POPPLER-PAGE-TRANSITION-VERTICAL:CAPS">
+<ANCHOR id="PopplerPageTransitionDirection" href="poppler/PopplerPage.html#PopplerPageTransitionDirection">
+<ANCHOR id="POPPLER-PAGE-TRANSITION-INWARD:CAPS" href="poppler/PopplerPage.html#POPPLER-PAGE-TRANSITION-INWARD:CAPS">
+<ANCHOR id="POPPLER-PAGE-TRANSITION-OUTWARD:CAPS" href="poppler/PopplerPage.html#POPPLER-PAGE-TRANSITION-OUTWARD:CAPS">
+<ANCHOR id="PopplerSelectionStyle" href="poppler/PopplerPage.html#PopplerSelectionStyle">
+<ANCHOR id="POPPLER-SELECTION-GLYPH:CAPS" href="poppler/PopplerPage.html#POPPLER-SELECTION-GLYPH:CAPS">
+<ANCHOR id="POPPLER-SELECTION-WORD:CAPS" href="poppler/PopplerPage.html#POPPLER-SELECTION-WORD:CAPS">
+<ANCHOR id="POPPLER-SELECTION-LINE:CAPS" href="poppler/PopplerPage.html#POPPLER-SELECTION-LINE:CAPS">
+<ANCHOR id="PopplerTextAttributes" href="poppler/PopplerPage.html#PopplerTextAttributes">
+<ANCHOR id="poppler-page-get-index" href="poppler/PopplerPage.html#poppler-page-get-index">
+<ANCHOR id="poppler-page-get-label" href="poppler/PopplerPage.html#poppler-page-get-label">
+<ANCHOR id="poppler-page-get-size" href="poppler/PopplerPage.html#poppler-page-get-size">
+<ANCHOR id="poppler-page-get-crop-box" href="poppler/PopplerPage.html#poppler-page-get-crop-box">
+<ANCHOR id="poppler-page-get-duration" href="poppler/PopplerPage.html#poppler-page-get-duration">
+<ANCHOR id="poppler-page-get-transition" href="poppler/PopplerPage.html#poppler-page-get-transition">
+<ANCHOR id="poppler-page-get-thumbnail-size" href="poppler/PopplerPage.html#poppler-page-get-thumbnail-size">
+<ANCHOR id="poppler-page-get-thumbnail" href="poppler/PopplerPage.html#poppler-page-get-thumbnail">
+<ANCHOR id="poppler-page-render" href="poppler/PopplerPage.html#poppler-page-render">
+<ANCHOR id="poppler-page-render-for-printing" href="poppler/PopplerPage.html#poppler-page-render-for-printing">
+<ANCHOR id="poppler-page-render-for-printing-with-options" href="poppler/PopplerPage.html#poppler-page-render-for-printing-with-options">
+<ANCHOR id="poppler-page-render-to-ps" href="poppler/PopplerPage.html#poppler-page-render-to-ps">
+<ANCHOR id="poppler-page-render-selection" href="poppler/PopplerPage.html#poppler-page-render-selection">
+<ANCHOR id="poppler-page-get-selected-region" href="poppler/PopplerPage.html#poppler-page-get-selected-region">
+<ANCHOR id="poppler-page-get-selection-region" href="poppler/PopplerPage.html#poppler-page-get-selection-region">
+<ANCHOR id="poppler-page-selection-region-free" href="poppler/PopplerPage.html#poppler-page-selection-region-free">
+<ANCHOR id="poppler-page-get-selected-text" href="poppler/PopplerPage.html#poppler-page-get-selected-text">
+<ANCHOR id="poppler-page-find-text" href="poppler/PopplerPage.html#poppler-page-find-text">
+<ANCHOR id="poppler-page-get-text" href="poppler/PopplerPage.html#poppler-page-get-text">
+<ANCHOR id="poppler-page-get-text-layout" href="poppler/PopplerPage.html#poppler-page-get-text-layout">
+<ANCHOR id="poppler-page-get-text-attributes" href="poppler/PopplerPage.html#poppler-page-get-text-attributes">
+<ANCHOR id="poppler-page-free-text-attributes" href="poppler/PopplerPage.html#poppler-page-free-text-attributes">
+<ANCHOR id="poppler-page-get-link-mapping" href="poppler/PopplerPage.html#poppler-page-get-link-mapping">
+<ANCHOR id="poppler-page-free-link-mapping" href="poppler/PopplerPage.html#poppler-page-free-link-mapping">
+<ANCHOR id="poppler-page-get-image-mapping" href="poppler/PopplerPage.html#poppler-page-get-image-mapping">
+<ANCHOR id="poppler-page-get-image" href="poppler/PopplerPage.html#poppler-page-get-image">
+<ANCHOR id="poppler-page-free-image-mapping" href="poppler/PopplerPage.html#poppler-page-free-image-mapping">
+<ANCHOR id="poppler-page-get-form-field-mapping" href="poppler/PopplerPage.html#poppler-page-get-form-field-mapping">
+<ANCHOR id="poppler-page-free-form-field-mapping" href="poppler/PopplerPage.html#poppler-page-free-form-field-mapping">
+<ANCHOR id="poppler-page-get-annot-mapping" href="poppler/PopplerPage.html#poppler-page-get-annot-mapping">
+<ANCHOR id="poppler-page-free-annot-mapping" href="poppler/PopplerPage.html#poppler-page-free-annot-mapping">
+<ANCHOR id="poppler-page-add-annot" href="poppler/PopplerPage.html#poppler-page-add-annot">
+<ANCHOR id="poppler-rectangle-new" href="poppler/PopplerPage.html#poppler-rectangle-new">
+<ANCHOR id="poppler-rectangle-copy" href="poppler/PopplerPage.html#poppler-rectangle-copy">
+<ANCHOR id="poppler-rectangle-free" href="poppler/PopplerPage.html#poppler-rectangle-free">
+<ANCHOR id="poppler-page-transition-new" href="poppler/PopplerPage.html#poppler-page-transition-new">
+<ANCHOR id="poppler-page-transition-copy" href="poppler/PopplerPage.html#poppler-page-transition-copy">
+<ANCHOR id="poppler-page-transition-free" href="poppler/PopplerPage.html#poppler-page-transition-free">
+<ANCHOR id="poppler-link-mapping-new" href="poppler/PopplerPage.html#poppler-link-mapping-new">
+<ANCHOR id="poppler-link-mapping-copy" href="poppler/PopplerPage.html#poppler-link-mapping-copy">
+<ANCHOR id="poppler-link-mapping-free" href="poppler/PopplerPage.html#poppler-link-mapping-free">
+<ANCHOR id="poppler-image-mapping-new" href="poppler/PopplerPage.html#poppler-image-mapping-new">
+<ANCHOR id="poppler-image-mapping-copy" href="poppler/PopplerPage.html#poppler-image-mapping-copy">
+<ANCHOR id="poppler-image-mapping-free" href="poppler/PopplerPage.html#poppler-image-mapping-free">
+<ANCHOR id="poppler-form-field-mapping-new" href="poppler/PopplerPage.html#poppler-form-field-mapping-new">
+<ANCHOR id="poppler-form-field-mapping-copy" href="poppler/PopplerPage.html#poppler-form-field-mapping-copy">
+<ANCHOR id="poppler-form-field-mapping-free" href="poppler/PopplerPage.html#poppler-form-field-mapping-free">
+<ANCHOR id="poppler-annot-mapping-new" href="poppler/PopplerPage.html#poppler-annot-mapping-new">
+<ANCHOR id="poppler-annot-mapping-copy" href="poppler/PopplerPage.html#poppler-annot-mapping-copy">
+<ANCHOR id="poppler-annot-mapping-free" href="poppler/PopplerPage.html#poppler-annot-mapping-free">
+<ANCHOR id="poppler-text-attributes-new" href="poppler/PopplerPage.html#poppler-text-attributes-new">
+<ANCHOR id="poppler-text-attributes-copy" href="poppler/PopplerPage.html#poppler-text-attributes-copy">
+<ANCHOR id="poppler-text-attributes-free" href="poppler/PopplerPage.html#poppler-text-attributes-free">
+<ANCHOR id="PopplerPage.property-details" href="poppler/PopplerPage.html#PopplerPage.property-details">
+<ANCHOR id="PopplerPage--label" href="poppler/PopplerPage.html#PopplerPage--label">
+<ANCHOR id="poppler-PopplerAction" href="poppler/poppler-PopplerAction.html">
+<ANCHOR id="poppler-PopplerAction.synopsis" href="poppler/poppler-PopplerAction.html#poppler-PopplerAction.synopsis">
+<ANCHOR id="poppler-PopplerAction.description" href="poppler/poppler-PopplerAction.html#poppler-PopplerAction.description">
+<ANCHOR id="poppler-PopplerAction.details" href="poppler/poppler-PopplerAction.html#poppler-PopplerAction.details">
+<ANCHOR id="PopplerAction" href="poppler/poppler-PopplerAction.html#PopplerAction">
+<ANCHOR id="PopplerDest" href="poppler/poppler-PopplerAction.html#PopplerDest">
+<ANCHOR id="PopplerActionAny" href="poppler/poppler-PopplerAction.html#PopplerActionAny">
+<ANCHOR id="PopplerActionGotoDest" href="poppler/poppler-PopplerAction.html#PopplerActionGotoDest">
+<ANCHOR id="PopplerActionGotoRemote" href="poppler/poppler-PopplerAction.html#PopplerActionGotoRemote">
+<ANCHOR id="PopplerActionLaunch" href="poppler/poppler-PopplerAction.html#PopplerActionLaunch">
+<ANCHOR id="PopplerActionUri" href="poppler/poppler-PopplerAction.html#PopplerActionUri">
+<ANCHOR id="PopplerActionNamed" href="poppler/poppler-PopplerAction.html#PopplerActionNamed">
+<ANCHOR id="PopplerActionMovie" href="poppler/poppler-PopplerAction.html#PopplerActionMovie">
+<ANCHOR id="PopplerActionRendition" href="poppler/poppler-PopplerAction.html#PopplerActionRendition">
+<ANCHOR id="PopplerActionOCGState" href="poppler/poppler-PopplerAction.html#PopplerActionOCGState">
+<ANCHOR id="PopplerActionJavascript" href="poppler/poppler-PopplerAction.html#PopplerActionJavascript">
+<ANCHOR id="PopplerActionType" href="poppler/poppler-PopplerAction.html#PopplerActionType">
+<ANCHOR id="POPPLER-ACTION-UNKNOWN:CAPS" href="poppler/poppler-PopplerAction.html#POPPLER-ACTION-UNKNOWN:CAPS">
+<ANCHOR id="POPPLER-ACTION-NONE:CAPS" href="poppler/poppler-PopplerAction.html#POPPLER-ACTION-NONE:CAPS">
+<ANCHOR id="POPPLER-ACTION-GOTO-DEST:CAPS" href="poppler/poppler-PopplerAction.html#POPPLER-ACTION-GOTO-DEST:CAPS">
+<ANCHOR id="POPPLER-ACTION-GOTO-REMOTE:CAPS" href="poppler/poppler-PopplerAction.html#POPPLER-ACTION-GOTO-REMOTE:CAPS">
+<ANCHOR id="POPPLER-ACTION-LAUNCH:CAPS" href="poppler/poppler-PopplerAction.html#POPPLER-ACTION-LAUNCH:CAPS">
+<ANCHOR id="POPPLER-ACTION-URI:CAPS" href="poppler/poppler-PopplerAction.html#POPPLER-ACTION-URI:CAPS">
+<ANCHOR id="POPPLER-ACTION-NAMED:CAPS" href="poppler/poppler-PopplerAction.html#POPPLER-ACTION-NAMED:CAPS">
+<ANCHOR id="POPPLER-ACTION-MOVIE:CAPS" href="poppler/poppler-PopplerAction.html#POPPLER-ACTION-MOVIE:CAPS">
+<ANCHOR id="POPPLER-ACTION-RENDITION:CAPS" href="poppler/poppler-PopplerAction.html#POPPLER-ACTION-RENDITION:CAPS">
+<ANCHOR id="POPPLER-ACTION-OCG-STATE:CAPS" href="poppler/poppler-PopplerAction.html#POPPLER-ACTION-OCG-STATE:CAPS">
+<ANCHOR id="POPPLER-ACTION-JAVASCRIPT:CAPS" href="poppler/poppler-PopplerAction.html#POPPLER-ACTION-JAVASCRIPT:CAPS">
+<ANCHOR id="PopplerDestType" href="poppler/poppler-PopplerAction.html#PopplerDestType">
+<ANCHOR id="POPPLER-DEST-UNKNOWN:CAPS" href="poppler/poppler-PopplerAction.html#POPPLER-DEST-UNKNOWN:CAPS">
+<ANCHOR id="POPPLER-DEST-XYZ:CAPS" href="poppler/poppler-PopplerAction.html#POPPLER-DEST-XYZ:CAPS">
+<ANCHOR id="POPPLER-DEST-FIT:CAPS" href="poppler/poppler-PopplerAction.html#POPPLER-DEST-FIT:CAPS">
+<ANCHOR id="POPPLER-DEST-FITH:CAPS" href="poppler/poppler-PopplerAction.html#POPPLER-DEST-FITH:CAPS">
+<ANCHOR id="POPPLER-DEST-FITV:CAPS" href="poppler/poppler-PopplerAction.html#POPPLER-DEST-FITV:CAPS">
+<ANCHOR id="POPPLER-DEST-FITR:CAPS" href="poppler/poppler-PopplerAction.html#POPPLER-DEST-FITR:CAPS">
+<ANCHOR id="POPPLER-DEST-FITB:CAPS" href="poppler/poppler-PopplerAction.html#POPPLER-DEST-FITB:CAPS">
+<ANCHOR id="POPPLER-DEST-FITBH:CAPS" href="poppler/poppler-PopplerAction.html#POPPLER-DEST-FITBH:CAPS">
+<ANCHOR id="POPPLER-DEST-FITBV:CAPS" href="poppler/poppler-PopplerAction.html#POPPLER-DEST-FITBV:CAPS">
+<ANCHOR id="POPPLER-DEST-NAMED:CAPS" href="poppler/poppler-PopplerAction.html#POPPLER-DEST-NAMED:CAPS">
+<ANCHOR id="PopplerActionMovieOperation" href="poppler/poppler-PopplerAction.html#PopplerActionMovieOperation">
+<ANCHOR id="POPPLER-ACTION-MOVIE-PLAY:CAPS" href="poppler/poppler-PopplerAction.html#POPPLER-ACTION-MOVIE-PLAY:CAPS">
+<ANCHOR id="POPPLER-ACTION-MOVIE-PAUSE:CAPS" href="poppler/poppler-PopplerAction.html#POPPLER-ACTION-MOVIE-PAUSE:CAPS">
+<ANCHOR id="POPPLER-ACTION-MOVIE-RESUME:CAPS" href="poppler/poppler-PopplerAction.html#POPPLER-ACTION-MOVIE-RESUME:CAPS">
+<ANCHOR id="POPPLER-ACTION-MOVIE-STOP:CAPS" href="poppler/poppler-PopplerAction.html#POPPLER-ACTION-MOVIE-STOP:CAPS">
+<ANCHOR id="PopplerActionLayer" href="poppler/poppler-PopplerAction.html#PopplerActionLayer">
+<ANCHOR id="PopplerActionLayerAction" href="poppler/poppler-PopplerAction.html#PopplerActionLayerAction">
+<ANCHOR id="POPPLER-ACTION-LAYER-ON:CAPS" href="poppler/poppler-PopplerAction.html#POPPLER-ACTION-LAYER-ON:CAPS">
+<ANCHOR id="POPPLER-ACTION-LAYER-OFF:CAPS" href="poppler/poppler-PopplerAction.html#POPPLER-ACTION-LAYER-OFF:CAPS">
+<ANCHOR id="POPPLER-ACTION-LAYER-TOGGLE:CAPS" href="poppler/poppler-PopplerAction.html#POPPLER-ACTION-LAYER-TOGGLE:CAPS">
+<ANCHOR id="poppler-action-copy" href="poppler/poppler-PopplerAction.html#poppler-action-copy">
+<ANCHOR id="poppler-action-free" href="poppler/poppler-PopplerAction.html#poppler-action-free">
+<ANCHOR id="poppler-dest-copy" href="poppler/poppler-PopplerAction.html#poppler-dest-copy">
+<ANCHOR id="poppler-dest-free" href="poppler/poppler-PopplerAction.html#poppler-dest-free">
+<ANCHOR id="PopplerAttachment" href="poppler/PopplerAttachment.html">
+<ANCHOR id="PopplerAttachment.synopsis" href="poppler/PopplerAttachment.html#PopplerAttachment.synopsis">
+<ANCHOR id="PopplerAttachment.object-hierarchy" href="poppler/PopplerAttachment.html#PopplerAttachment.object-hierarchy">
+<ANCHOR id="PopplerAttachment.description" href="poppler/PopplerAttachment.html#PopplerAttachment.description">
+<ANCHOR id="PopplerAttachment.details" href="poppler/PopplerAttachment.html#PopplerAttachment.details">
+<ANCHOR id="PopplerAttachment-struct" href="poppler/PopplerAttachment.html#PopplerAttachment-struct">
+<ANCHOR id="PopplerAttachmentSaveFunc" href="poppler/PopplerAttachment.html#PopplerAttachmentSaveFunc">
+<ANCHOR id="poppler-attachment-save" href="poppler/PopplerAttachment.html#poppler-attachment-save">
+<ANCHOR id="poppler-attachment-save-to-callback" href="poppler/PopplerAttachment.html#poppler-attachment-save-to-callback">
+<ANCHOR id="PopplerFormField" href="poppler/PopplerFormField.html">
+<ANCHOR id="PopplerFormField.synopsis" href="poppler/PopplerFormField.html#PopplerFormField.synopsis">
+<ANCHOR id="PopplerFormField.object-hierarchy" href="poppler/PopplerFormField.html#PopplerFormField.object-hierarchy">
+<ANCHOR id="PopplerFormField.description" href="poppler/PopplerFormField.html#PopplerFormField.description">
+<ANCHOR id="PopplerFormField.details" href="poppler/PopplerFormField.html#PopplerFormField.details">
+<ANCHOR id="PopplerFormField-struct" href="poppler/PopplerFormField.html#PopplerFormField-struct">
+<ANCHOR id="PopplerFormFieldType" href="poppler/PopplerFormField.html#PopplerFormFieldType">
+<ANCHOR id="PopplerFormButtonType" href="poppler/PopplerFormField.html#PopplerFormButtonType">
+<ANCHOR id="PopplerFormChoiceType" href="poppler/PopplerFormField.html#PopplerFormChoiceType">
+<ANCHOR id="PopplerFormTextType" href="poppler/PopplerFormField.html#PopplerFormTextType">
+<ANCHOR id="poppler-form-field-get-field-type" href="poppler/PopplerFormField.html#poppler-form-field-get-field-type">
+<ANCHOR id="poppler-form-field-get-id" href="poppler/PopplerFormField.html#poppler-form-field-get-id">
+<ANCHOR id="poppler-form-field-is-read-only" href="poppler/PopplerFormField.html#poppler-form-field-is-read-only">
+<ANCHOR id="poppler-form-field-get-font-size" href="poppler/PopplerFormField.html#poppler-form-field-get-font-size">
+<ANCHOR id="poppler-form-field-get-partial-name" href="poppler/PopplerFormField.html#poppler-form-field-get-partial-name">
+<ANCHOR id="poppler-form-field-get-mapping-name" href="poppler/PopplerFormField.html#poppler-form-field-get-mapping-name">
+<ANCHOR id="poppler-form-field-get-name" href="poppler/PopplerFormField.html#poppler-form-field-get-name">
+<ANCHOR id="poppler-form-field-get-action" href="poppler/PopplerFormField.html#poppler-form-field-get-action">
+<ANCHOR id="poppler-form-field-button-get-button-type" href="poppler/PopplerFormField.html#poppler-form-field-button-get-button-type">
+<ANCHOR id="poppler-form-field-button-get-state" href="poppler/PopplerFormField.html#poppler-form-field-button-get-state">
+<ANCHOR id="poppler-form-field-button-set-state" href="poppler/PopplerFormField.html#poppler-form-field-button-set-state">
+<ANCHOR id="poppler-form-field-choice-get-choice-type" href="poppler/PopplerFormField.html#poppler-form-field-choice-get-choice-type">
+<ANCHOR id="poppler-form-field-choice-can-select-multiple" href="poppler/PopplerFormField.html#poppler-form-field-choice-can-select-multiple">
+<ANCHOR id="poppler-form-field-choice-commit-on-change" href="poppler/PopplerFormField.html#poppler-form-field-choice-commit-on-change">
+<ANCHOR id="poppler-form-field-choice-do-spell-check" href="poppler/PopplerFormField.html#poppler-form-field-choice-do-spell-check">
+<ANCHOR id="poppler-form-field-choice-get-item" href="poppler/PopplerFormField.html#poppler-form-field-choice-get-item">
+<ANCHOR id="poppler-form-field-choice-get-n-items" href="poppler/PopplerFormField.html#poppler-form-field-choice-get-n-items">
+<ANCHOR id="poppler-form-field-choice-get-text" href="poppler/PopplerFormField.html#poppler-form-field-choice-get-text">
+<ANCHOR id="poppler-form-field-choice-set-text" href="poppler/PopplerFormField.html#poppler-form-field-choice-set-text">
+<ANCHOR id="poppler-form-field-choice-is-editable" href="poppler/PopplerFormField.html#poppler-form-field-choice-is-editable">
+<ANCHOR id="poppler-form-field-choice-is-item-selected" href="poppler/PopplerFormField.html#poppler-form-field-choice-is-item-selected">
+<ANCHOR id="poppler-form-field-choice-select-item" href="poppler/PopplerFormField.html#poppler-form-field-choice-select-item">
+<ANCHOR id="poppler-form-field-choice-toggle-item" href="poppler/PopplerFormField.html#poppler-form-field-choice-toggle-item">
+<ANCHOR id="poppler-form-field-choice-unselect-all" href="poppler/PopplerFormField.html#poppler-form-field-choice-unselect-all">
+<ANCHOR id="poppler-form-field-text-get-text-type" href="poppler/PopplerFormField.html#poppler-form-field-text-get-text-type">
+<ANCHOR id="poppler-form-field-text-get-text" href="poppler/PopplerFormField.html#poppler-form-field-text-get-text">
+<ANCHOR id="poppler-form-field-text-set-text" href="poppler/PopplerFormField.html#poppler-form-field-text-set-text">
+<ANCHOR id="poppler-form-field-text-get-max-len" href="poppler/PopplerFormField.html#poppler-form-field-text-get-max-len">
+<ANCHOR id="poppler-form-field-text-do-scroll" href="poppler/PopplerFormField.html#poppler-form-field-text-do-scroll">
+<ANCHOR id="poppler-form-field-text-do-spell-check" href="poppler/PopplerFormField.html#poppler-form-field-text-do-spell-check">
+<ANCHOR id="poppler-form-field-text-is-password" href="poppler/PopplerFormField.html#poppler-form-field-text-is-password">
+<ANCHOR id="poppler-form-field-text-is-rich-text" href="poppler/PopplerFormField.html#poppler-form-field-text-is-rich-text">
+<ANCHOR id="PopplerAnnot" href="poppler/PopplerAnnot.html">
+<ANCHOR id="PopplerAnnot.synopsis" href="poppler/PopplerAnnot.html#PopplerAnnot.synopsis">
+<ANCHOR id="PopplerAnnot.object-hierarchy" href="poppler/PopplerAnnot.html#PopplerAnnot.object-hierarchy">
+<ANCHOR id="PopplerAnnot.description" href="poppler/PopplerAnnot.html#PopplerAnnot.description">
+<ANCHOR id="PopplerAnnot.details" href="poppler/PopplerAnnot.html#PopplerAnnot.details">
+<ANCHOR id="PopplerAnnot-struct" href="poppler/PopplerAnnot.html#PopplerAnnot-struct">
+<ANCHOR id="PopplerAnnotMarkup" href="poppler/PopplerAnnot.html#PopplerAnnotMarkup">
+<ANCHOR id="PopplerAnnotText" href="poppler/PopplerAnnot.html#PopplerAnnotText">
+<ANCHOR id="PopplerAnnotFreeText" href="poppler/PopplerAnnot.html#PopplerAnnotFreeText">
+<ANCHOR id="PopplerAnnotFileAttachment" href="poppler/PopplerAnnot.html#PopplerAnnotFileAttachment">
+<ANCHOR id="PopplerAnnotMovie" href="poppler/PopplerAnnot.html#PopplerAnnotMovie">
+<ANCHOR id="PopplerAnnotScreen" href="poppler/PopplerAnnot.html#PopplerAnnotScreen">
+<ANCHOR id="PopplerAnnotType" href="poppler/PopplerAnnot.html#PopplerAnnotType">
+<ANCHOR id="PopplerAnnotFlag" href="poppler/PopplerAnnot.html#PopplerAnnotFlag">
+<ANCHOR id="PopplerAnnotExternalDataType" href="poppler/PopplerAnnot.html#PopplerAnnotExternalDataType">
+<ANCHOR id="PopplerAnnotMarkupReplyType" href="poppler/PopplerAnnot.html#PopplerAnnotMarkupReplyType">
+<ANCHOR id="PopplerAnnotTextState" href="poppler/PopplerAnnot.html#PopplerAnnotTextState">
+<ANCHOR id="PopplerAnnotCalloutLine" href="poppler/PopplerAnnot.html#PopplerAnnotCalloutLine">
+<ANCHOR id="PopplerAnnotFreeTextQuadding" href="poppler/PopplerAnnot.html#PopplerAnnotFreeTextQuadding">
+<ANCHOR id="poppler-annot-get-annot-type" href="poppler/PopplerAnnot.html#poppler-annot-get-annot-type">
+<ANCHOR id="poppler-annot-get-flags" href="poppler/PopplerAnnot.html#poppler-annot-get-flags">
+<ANCHOR id="poppler-annot-get-name" href="poppler/PopplerAnnot.html#poppler-annot-get-name">
+<ANCHOR id="poppler-annot-get-page-index" href="poppler/PopplerAnnot.html#poppler-annot-get-page-index">
+<ANCHOR id="poppler-annot-get-color" href="poppler/PopplerAnnot.html#poppler-annot-get-color">
+<ANCHOR id="poppler-annot-set-color" href="poppler/PopplerAnnot.html#poppler-annot-set-color">
+<ANCHOR id="poppler-annot-get-contents" href="poppler/PopplerAnnot.html#poppler-annot-get-contents">
+<ANCHOR id="poppler-annot-set-contents" href="poppler/PopplerAnnot.html#poppler-annot-set-contents">
+<ANCHOR id="poppler-annot-get-modified" href="poppler/PopplerAnnot.html#poppler-annot-get-modified">
+<ANCHOR id="poppler-annot-markup-get-label" href="poppler/PopplerAnnot.html#poppler-annot-markup-get-label">
+<ANCHOR id="poppler-annot-markup-set-label" href="poppler/PopplerAnnot.html#poppler-annot-markup-set-label">
+<ANCHOR id="poppler-annot-markup-get-subject" href="poppler/PopplerAnnot.html#poppler-annot-markup-get-subject">
+<ANCHOR id="poppler-annot-markup-get-opacity" href="poppler/PopplerAnnot.html#poppler-annot-markup-get-opacity">
+<ANCHOR id="poppler-annot-markup-set-opacity" href="poppler/PopplerAnnot.html#poppler-annot-markup-set-opacity">
+<ANCHOR id="poppler-annot-markup-has-popup" href="poppler/PopplerAnnot.html#poppler-annot-markup-has-popup">
+<ANCHOR id="poppler-annot-markup-set-popup" href="poppler/PopplerAnnot.html#poppler-annot-markup-set-popup">
+<ANCHOR id="poppler-annot-markup-get-popup-is-open" href="poppler/PopplerAnnot.html#poppler-annot-markup-get-popup-is-open">
+<ANCHOR id="poppler-annot-markup-set-popup-is-open" href="poppler/PopplerAnnot.html#poppler-annot-markup-set-popup-is-open">
+<ANCHOR id="poppler-annot-markup-get-popup-rectangle" href="poppler/PopplerAnnot.html#poppler-annot-markup-get-popup-rectangle">
+<ANCHOR id="poppler-annot-markup-get-date" href="poppler/PopplerAnnot.html#poppler-annot-markup-get-date">
+<ANCHOR id="poppler-annot-markup-get-external-data" href="poppler/PopplerAnnot.html#poppler-annot-markup-get-external-data">
+<ANCHOR id="poppler-annot-markup-get-reply-to" href="poppler/PopplerAnnot.html#poppler-annot-markup-get-reply-to">
+<ANCHOR id="poppler-annot-text-new" href="poppler/PopplerAnnot.html#poppler-annot-text-new">
+<ANCHOR id="poppler-annot-text-get-icon" href="poppler/PopplerAnnot.html#poppler-annot-text-get-icon">
+<ANCHOR id="POPPLER-ANNOT-TEXT-ICON-NOTE:CAPS" href="poppler/PopplerAnnot.html#POPPLER-ANNOT-TEXT-ICON-NOTE:CAPS">
+<ANCHOR id="POPPLER-ANNOT-TEXT-ICON-COMMENT:CAPS" href="poppler/PopplerAnnot.html#POPPLER-ANNOT-TEXT-ICON-COMMENT:CAPS">
+<ANCHOR id="POPPLER-ANNOT-TEXT-ICON-KEY:CAPS" href="poppler/PopplerAnnot.html#POPPLER-ANNOT-TEXT-ICON-KEY:CAPS">
+<ANCHOR id="POPPLER-ANNOT-TEXT-ICON-HELP:CAPS" href="poppler/PopplerAnnot.html#POPPLER-ANNOT-TEXT-ICON-HELP:CAPS">
+<ANCHOR id="POPPLER-ANNOT-TEXT-ICON-NEW-PARAGRAPH:CAPS" href="poppler/PopplerAnnot.html#POPPLER-ANNOT-TEXT-ICON-NEW-PARAGRAPH:CAPS">
+<ANCHOR id="POPPLER-ANNOT-TEXT-ICON-PARAGRAPH:CAPS" href="poppler/PopplerAnnot.html#POPPLER-ANNOT-TEXT-ICON-PARAGRAPH:CAPS">
+<ANCHOR id="POPPLER-ANNOT-TEXT-ICON-INSERT:CAPS" href="poppler/PopplerAnnot.html#POPPLER-ANNOT-TEXT-ICON-INSERT:CAPS">
+<ANCHOR id="POPPLER-ANNOT-TEXT-ICON-CROSS:CAPS" href="poppler/PopplerAnnot.html#POPPLER-ANNOT-TEXT-ICON-CROSS:CAPS">
+<ANCHOR id="POPPLER-ANNOT-TEXT-ICON-CIRCLE:CAPS" href="poppler/PopplerAnnot.html#POPPLER-ANNOT-TEXT-ICON-CIRCLE:CAPS">
+<ANCHOR id="poppler-annot-text-set-icon" href="poppler/PopplerAnnot.html#poppler-annot-text-set-icon">
+<ANCHOR id="poppler-annot-text-get-is-open" href="poppler/PopplerAnnot.html#poppler-annot-text-get-is-open">
+<ANCHOR id="poppler-annot-text-set-is-open" href="poppler/PopplerAnnot.html#poppler-annot-text-set-is-open">
+<ANCHOR id="poppler-annot-text-get-state" href="poppler/PopplerAnnot.html#poppler-annot-text-get-state">
+<ANCHOR id="poppler-annot-free-text-get-callout-line" href="poppler/PopplerAnnot.html#poppler-annot-free-text-get-callout-line">
+<ANCHOR id="poppler-annot-free-text-get-quadding" href="poppler/PopplerAnnot.html#poppler-annot-free-text-get-quadding">
+<ANCHOR id="poppler-annot-file-attachment-get-attachment" href="poppler/PopplerAnnot.html#poppler-annot-file-attachment-get-attachment">
+<ANCHOR id="poppler-annot-file-attachment-get-name" href="poppler/PopplerAnnot.html#poppler-annot-file-attachment-get-name">
+<ANCHOR id="poppler-annot-screen-get-action" href="poppler/PopplerAnnot.html#poppler-annot-screen-get-action">
+<ANCHOR id="poppler-annot-movie-get-movie" href="poppler/PopplerAnnot.html#poppler-annot-movie-get-movie">
+<ANCHOR id="poppler-annot-movie-get-title" href="poppler/PopplerAnnot.html#poppler-annot-movie-get-title">
+<ANCHOR id="poppler-annot-callout-line-new" href="poppler/PopplerAnnot.html#poppler-annot-callout-line-new">
+<ANCHOR id="poppler-annot-callout-line-copy" href="poppler/PopplerAnnot.html#poppler-annot-callout-line-copy">
+<ANCHOR id="poppler-annot-callout-line-free" href="poppler/PopplerAnnot.html#poppler-annot-callout-line-free">
+<ANCHOR id="PopplerLayer" href="poppler/PopplerLayer.html">
+<ANCHOR id="PopplerLayer.synopsis" href="poppler/PopplerLayer.html#PopplerLayer.synopsis">
+<ANCHOR id="PopplerLayer.object-hierarchy" href="poppler/PopplerLayer.html#PopplerLayer.object-hierarchy">
+<ANCHOR id="PopplerLayer.description" href="poppler/PopplerLayer.html#PopplerLayer.description">
+<ANCHOR id="PopplerLayer.details" href="poppler/PopplerLayer.html#PopplerLayer.details">
+<ANCHOR id="PopplerLayer-struct" href="poppler/PopplerLayer.html#PopplerLayer-struct">
+<ANCHOR id="poppler-layer-get-title" href="poppler/PopplerLayer.html#poppler-layer-get-title">
+<ANCHOR id="poppler-layer-is-visible" href="poppler/PopplerLayer.html#poppler-layer-is-visible">
+<ANCHOR id="poppler-layer-show" href="poppler/PopplerLayer.html#poppler-layer-show">
+<ANCHOR id="poppler-layer-hide" href="poppler/PopplerLayer.html#poppler-layer-hide">
+<ANCHOR id="poppler-layer-is-parent" href="poppler/PopplerLayer.html#poppler-layer-is-parent">
+<ANCHOR id="poppler-layer-get-radio-button-group-id" href="poppler/PopplerLayer.html#poppler-layer-get-radio-button-group-id">
+<ANCHOR id="PopplerMedia" href="poppler/PopplerMedia.html">
+<ANCHOR id="PopplerMedia.synopsis" href="poppler/PopplerMedia.html#PopplerMedia.synopsis">
+<ANCHOR id="PopplerMedia.object-hierarchy" href="poppler/PopplerMedia.html#PopplerMedia.object-hierarchy">
+<ANCHOR id="PopplerMedia.description" href="poppler/PopplerMedia.html#PopplerMedia.description">
+<ANCHOR id="PopplerMedia.details" href="poppler/PopplerMedia.html#PopplerMedia.details">
+<ANCHOR id="PopplerMedia-struct" href="poppler/PopplerMedia.html#PopplerMedia-struct">
+<ANCHOR id="PopplerMediaSaveFunc" href="poppler/PopplerMedia.html#PopplerMediaSaveFunc">
+<ANCHOR id="poppler-media-get-filename" href="poppler/PopplerMedia.html#poppler-media-get-filename">
+<ANCHOR id="poppler-media-get-mime-type" href="poppler/PopplerMedia.html#poppler-media-get-mime-type">
+<ANCHOR id="poppler-media-is-embedded" href="poppler/PopplerMedia.html#poppler-media-is-embedded">
+<ANCHOR id="poppler-media-save" href="poppler/PopplerMedia.html#poppler-media-save">
+<ANCHOR id="poppler-media-save-to-callback" href="poppler/PopplerMedia.html#poppler-media-save-to-callback">
+<ANCHOR id="PopplerMovie" href="poppler/PopplerMovie.html">
+<ANCHOR id="PopplerMovie.synopsis" href="poppler/PopplerMovie.html#PopplerMovie.synopsis">
+<ANCHOR id="PopplerMovie.object-hierarchy" href="poppler/PopplerMovie.html#PopplerMovie.object-hierarchy">
+<ANCHOR id="PopplerMovie.description" href="poppler/PopplerMovie.html#PopplerMovie.description">
+<ANCHOR id="PopplerMovie.details" href="poppler/PopplerMovie.html#PopplerMovie.details">
+<ANCHOR id="PopplerMovie-struct" href="poppler/PopplerMovie.html#PopplerMovie-struct">
+<ANCHOR id="poppler-movie-get-filename" href="poppler/PopplerMovie.html#poppler-movie-get-filename">
+<ANCHOR id="poppler-movie-need-poster" href="poppler/PopplerMovie.html#poppler-movie-need-poster">
+<ANCHOR id="poppler-movie-show-controls" href="poppler/PopplerMovie.html#poppler-movie-show-controls">
+<ANCHOR id="poppler-Version-and-Features-Information" href="poppler/poppler-Version-and-Features-Information.html">
+<ANCHOR id="poppler-Version-and-Features-Information.synopsis" href="poppler/poppler-Version-and-Features-Information.html#poppler-Version-and-Features-Information.synopsis">
+<ANCHOR id="poppler-Version-and-Features-Information.description" href="poppler/poppler-Version-and-Features-Information.html#poppler-Version-and-Features-Information.description">
+<ANCHOR id="poppler-Version-and-Features-Information.details" href="poppler/poppler-Version-and-Features-Information.html#poppler-Version-and-Features-Information.details">
+<ANCHOR id="POPPLER-HAS-CAIRO:CAPS" href="poppler/poppler-Version-and-Features-Information.html#POPPLER-HAS-CAIRO:CAPS">
+<ANCHOR id="POPPLER-MAJOR-VERSION:CAPS" href="poppler/poppler-Version-and-Features-Information.html#POPPLER-MAJOR-VERSION:CAPS">
+<ANCHOR id="POPPLER-MINOR-VERSION:CAPS" href="poppler/poppler-Version-and-Features-Information.html#POPPLER-MINOR-VERSION:CAPS">
+<ANCHOR id="POPPLER-MICRO-VERSION:CAPS" href="poppler/poppler-Version-and-Features-Information.html#POPPLER-MICRO-VERSION:CAPS">
+<ANCHOR id="POPPLER-CHECK-VERSION:CAPS" href="poppler/poppler-Version-and-Features-Information.html#POPPLER-CHECK-VERSION:CAPS">
+<ANCHOR id="annotation-glossterm-out" href="poppler/annotation-glossary.html#annotation-glossterm-out">
+<ANCHOR id="annotation-glossterm-allow-none" href="poppler/annotation-glossary.html#annotation-glossterm-allow-none">
+<ANCHOR id="annotation-glossterm-closure" href="poppler/annotation-glossary.html#annotation-glossterm-closure">
+<ANCHOR id="annotation-glossterm-transfer none" href="poppler/annotation-glossary.html#annotation-glossterm-transfer none">
+<ANCHOR id="annotation-glossterm-array" href="poppler/annotation-glossary.html#annotation-glossterm-array">
+<ANCHOR id="annotation-glossterm-element-type" href="poppler/annotation-glossary.html#annotation-glossterm-element-type">
+<ANCHOR id="annotation-glossterm-transfer container" href="poppler/annotation-glossary.html#annotation-glossterm-transfer container">
+<ANCHOR id="annotation-glossterm-transfer full" href="poppler/annotation-glossary.html#annotation-glossterm-transfer full">
+<ANCHOR id="annotation-glossterm-scope call" href="poppler/annotation-glossary.html#annotation-glossterm-scope call">
diff --git a/glib/reference/html/left.png b/glib/reference/html/left.png
new file mode 100644 (file)
index 0000000..48cab27
Binary files /dev/null and b/glib/reference/html/left.png differ
diff --git a/glib/reference/html/poppler-PopplerAction.html b/glib/reference/html/poppler-PopplerAction.html
new file mode 100644 (file)
index 0000000..b2c7df2
--- /dev/null
@@ -0,0 +1,632 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>PopplerAction</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.76.1">
+<link rel="home" href="index.html" title="Poppler Reference Manual">
+<link rel="up" href="ch01.html" title="Poppler">
+<link rel="prev" href="PopplerPage.html" title="PopplerPage">
+<link rel="next" href="PopplerAttachment.html" title="PopplerAttachment">
+<meta name="generator" content="GTK-Doc V1.18 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="2">
+<tr valign="middle">
+<td><a accesskey="p" href="PopplerPage.html"><img src="left.png" width="24" height="24" border="0" alt="Prev"></a></td>
+<td><a accesskey="u" href="ch01.html"><img src="up.png" width="24" height="24" border="0" alt="Up"></a></td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="24" height="24" border="0" alt="Home"></a></td>
+<th width="100%" align="center">Poppler Reference Manual</th>
+<td><a accesskey="n" href="PopplerAttachment.html"><img src="right.png" width="24" height="24" border="0" alt="Next"></a></td>
+</tr>
+<tr><td colspan="5" class="shortcuts">
+<a href="#poppler-PopplerAction.synopsis" class="shortcut">Top</a>
+                   | 
+                  <a href="#poppler-PopplerAction.description" class="shortcut">Description</a>
+</td></tr>
+</table>
+<div class="refentry">
+<a name="poppler-PopplerAction"></a><div class="titlepage"></div>
+<div class="refnamediv"><table width="100%"><tr>
+<td valign="top">
+<h2><span class="refentrytitle"><a name="poppler-PopplerAction.top_of_page"></a>PopplerAction</span></h2>
+<p>PopplerAction — Action links</p>
+</td>
+<td valign="top" align="right"></td>
+</tr></table></div>
+<div class="refsynopsisdiv">
+<a name="poppler-PopplerAction.synopsis"></a><h2>Synopsis</h2>
+<pre class="synopsis">
+#include &lt;poppler.h&gt;
+
+union               <a class="link" href="poppler-PopplerAction.html#PopplerAction" title="union PopplerAction">PopplerAction</a>;
+                    <a class="link" href="poppler-PopplerAction.html#PopplerDest" title="PopplerDest">PopplerDest</a>;
+struct              <a class="link" href="poppler-PopplerAction.html#PopplerActionAny" title="struct PopplerActionAny">PopplerActionAny</a>;
+struct              <a class="link" href="poppler-PopplerAction.html#PopplerActionGotoDest" title="struct PopplerActionGotoDest">PopplerActionGotoDest</a>;
+struct              <a class="link" href="poppler-PopplerAction.html#PopplerActionGotoRemote" title="struct PopplerActionGotoRemote">PopplerActionGotoRemote</a>;
+struct              <a class="link" href="poppler-PopplerAction.html#PopplerActionLaunch" title="struct PopplerActionLaunch">PopplerActionLaunch</a>;
+struct              <a class="link" href="poppler-PopplerAction.html#PopplerActionUri" title="struct PopplerActionUri">PopplerActionUri</a>;
+struct              <a class="link" href="poppler-PopplerAction.html#PopplerActionNamed" title="struct PopplerActionNamed">PopplerActionNamed</a>;
+struct              <a class="link" href="poppler-PopplerAction.html#PopplerActionMovie" title="struct PopplerActionMovie">PopplerActionMovie</a>;
+struct              <a class="link" href="poppler-PopplerAction.html#PopplerActionRendition" title="struct PopplerActionRendition">PopplerActionRendition</a>;
+struct              <a class="link" href="poppler-PopplerAction.html#PopplerActionOCGState" title="struct PopplerActionOCGState">PopplerActionOCGState</a>;
+struct              <a class="link" href="poppler-PopplerAction.html#PopplerActionJavascript" title="struct PopplerActionJavascript">PopplerActionJavascript</a>;
+enum                <a class="link" href="poppler-PopplerAction.html#PopplerActionType" title="enum PopplerActionType">PopplerActionType</a>;
+enum                <a class="link" href="poppler-PopplerAction.html#PopplerDestType" title="enum PopplerDestType">PopplerDestType</a>;
+enum                <a class="link" href="poppler-PopplerAction.html#PopplerActionMovieOperation" title="enum PopplerActionMovieOperation">PopplerActionMovieOperation</a>;
+                    <a class="link" href="poppler-PopplerAction.html#PopplerActionLayer" title="PopplerActionLayer">PopplerActionLayer</a>;
+enum                <a class="link" href="poppler-PopplerAction.html#PopplerActionLayerAction" title="enum PopplerActionLayerAction">PopplerActionLayerAction</a>;
+<a class="link" href="poppler-PopplerAction.html#PopplerAction" title="union PopplerAction"><span class="returnvalue">PopplerAction</span></a> *     <a class="link" href="poppler-PopplerAction.html#poppler-action-copy" title="poppler_action_copy ()">poppler_action_copy</a>                 (<em class="parameter"><code><a class="link" href="poppler-PopplerAction.html#PopplerAction" title="union PopplerAction"><span class="type">PopplerAction</span></a> *action</code></em>);
+<span class="returnvalue">void</span>                <a class="link" href="poppler-PopplerAction.html#poppler-action-free" title="poppler_action_free ()">poppler_action_free</a>                 (<em class="parameter"><code><a class="link" href="poppler-PopplerAction.html#PopplerAction" title="union PopplerAction"><span class="type">PopplerAction</span></a> *action</code></em>);
+<a class="link" href="poppler-PopplerAction.html#PopplerDest" title="PopplerDest"><span class="returnvalue">PopplerDest</span></a> *       <a class="link" href="poppler-PopplerAction.html#poppler-dest-copy" title="poppler_dest_copy ()">poppler_dest_copy</a>                   (<em class="parameter"><code><a class="link" href="poppler-PopplerAction.html#PopplerDest" title="PopplerDest"><span class="type">PopplerDest</span></a> *dest</code></em>);
+<span class="returnvalue">void</span>                <a class="link" href="poppler-PopplerAction.html#poppler-dest-free" title="poppler_dest_free ()">poppler_dest_free</a>                   (<em class="parameter"><code><a class="link" href="poppler-PopplerAction.html#PopplerDest" title="PopplerDest"><span class="type">PopplerDest</span></a> *dest</code></em>);
+</pre>
+</div>
+<div class="refsect1">
+<a name="poppler-PopplerAction.description"></a><h2>Description</h2>
+</div>
+<div class="refsect1">
+<a name="poppler-PopplerAction.details"></a><h2>Details</h2>
+<div class="refsect2">
+<a name="PopplerAction"></a><h3>union PopplerAction</h3>
+<pre class="programlisting">union _PopplerAction
+{
+       PopplerActionType type;
+       PopplerActionAny any;
+       PopplerActionGotoDest goto_dest;
+       PopplerActionGotoRemote goto_remote;
+       PopplerActionLaunch launch;
+       PopplerActionUri uri;
+       PopplerActionNamed named;
+       PopplerActionMovie movie;
+       PopplerActionRendition rendition;
+       PopplerActionOCGState ocg_state;
+       PopplerActionJavascript javascript;
+};
+</pre>
+<p>
+A data structure for holding actions
+</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="PopplerDest"></a><h3>PopplerDest</h3>
+<pre class="programlisting">typedef struct {
+       PopplerDestType type;
+
+       int page_num;
+       double left;
+       double bottom;
+       double right;
+       double top;
+       double zoom;
+       gchar *named_dest;
+       guint change_left : 1;
+       guint change_top : 1;
+       guint change_zoom : 1;
+} PopplerDest;
+</pre>
+<p>
+Data structure for holding a destination
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><a class="link" href="poppler-PopplerAction.html#PopplerDestType" title="enum PopplerDestType"><span class="type">PopplerDestType</span></a> <em class="structfield"><code><a name="PopplerDest.type"></a>type</code></em>;</span></p></td>
+<td>type of destination</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="type">int</span> <em class="structfield"><code><a name="PopplerDest.page-num"></a>page_num</code></em>;</span></p></td>
+<td>page number</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="type">double</span> <em class="structfield"><code><a name="PopplerDest.left"></a>left</code></em>;</span></p></td>
+<td>left coordinate</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="type">double</span> <em class="structfield"><code><a name="PopplerDest.bottom"></a>bottom</code></em>;</span></p></td>
+<td>bottom coordinate</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="type">double</span> <em class="structfield"><code><a name="PopplerDest.right"></a>right</code></em>;</span></p></td>
+<td>right coordinate</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="type">double</span> <em class="structfield"><code><a name="PopplerDest.top"></a>top</code></em>;</span></p></td>
+<td>top coordinate</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="type">double</span> <em class="structfield"><code><a name="PopplerDest.zoom"></a>zoom</code></em>;</span></p></td>
+<td>scale factor</td>
+</tr>
+<tr>
+<td><p><span class="term"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *<em class="structfield"><code><a name="PopplerDest.named-dest"></a>named_dest</code></em>;</span></p></td>
+<td>name of the destination (<a class="link" href="poppler-PopplerAction.html#POPPLER-DEST-NAMED:CAPS"><span class="type">POPPLER_DEST_NAMED</span></a> only)</td>
+</tr>
+<tr>
+<td><p><span class="term"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> <em class="structfield"><code><a name="PopplerDest.change-left"></a>change_left</code></em> : 1;</span></p></td>
+<td>whether left coordinate should be changed</td>
+</tr>
+<tr>
+<td><p><span class="term"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> <em class="structfield"><code><a name="PopplerDest.change-top"></a>change_top</code></em> : 1;</span></p></td>
+<td>whether top coordinate should be changed</td>
+</tr>
+<tr>
+<td><p><span class="term"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> <em class="structfield"><code><a name="PopplerDest.change-zoom"></a>change_zoom</code></em> : 1;</span></p></td>
+<td>whether scale factor should be changed</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="PopplerActionAny"></a><h3>struct PopplerActionAny</h3>
+<pre class="programlisting">struct PopplerActionAny {
+       PopplerActionType type;
+       gchar *title;
+};
+</pre>
+</div>
+<hr>
+<div class="refsect2">
+<a name="PopplerActionGotoDest"></a><h3>struct PopplerActionGotoDest</h3>
+<pre class="programlisting">struct PopplerActionGotoDest {
+       PopplerActionType type;
+       gchar *title;
+
+       PopplerDest *dest;
+};
+</pre>
+</div>
+<hr>
+<div class="refsect2">
+<a name="PopplerActionGotoRemote"></a><h3>struct PopplerActionGotoRemote</h3>
+<pre class="programlisting">struct PopplerActionGotoRemote {
+       PopplerActionType type;
+       gchar *title;
+
+       gchar *file_name;
+       PopplerDest *dest;
+};
+</pre>
+</div>
+<hr>
+<div class="refsect2">
+<a name="PopplerActionLaunch"></a><h3>struct PopplerActionLaunch</h3>
+<pre class="programlisting">struct PopplerActionLaunch {
+       PopplerActionType type;
+       gchar *title;
+
+       gchar *file_name;
+       gchar *params;
+};
+</pre>
+</div>
+<hr>
+<div class="refsect2">
+<a name="PopplerActionUri"></a><h3>struct PopplerActionUri</h3>
+<pre class="programlisting">struct PopplerActionUri {
+       PopplerActionType type;
+       gchar *title;
+
+       char *uri;
+};
+</pre>
+</div>
+<hr>
+<div class="refsect2">
+<a name="PopplerActionNamed"></a><h3>struct PopplerActionNamed</h3>
+<pre class="programlisting">struct PopplerActionNamed {
+       PopplerActionType type;
+       gchar *title;
+
+       gchar *named_dest;
+};
+</pre>
+</div>
+<hr>
+<div class="refsect2">
+<a name="PopplerActionMovie"></a><h3>struct PopplerActionMovie</h3>
+<pre class="programlisting">struct PopplerActionMovie {
+        PopplerActionType           type;
+        gchar                      *title;
+
+        PopplerActionMovieOperation operation;
+       PopplerMovie               *movie;
+};
+</pre>
+</div>
+<hr>
+<div class="refsect2">
+<a name="PopplerActionRendition"></a><h3>struct PopplerActionRendition</h3>
+<pre class="programlisting">struct PopplerActionRendition {
+       PopplerActionType type;
+       gchar            *title;
+
+       gint               op;
+       PopplerMedia      *media;
+};
+</pre>
+</div>
+<hr>
+<div class="refsect2">
+<a name="PopplerActionOCGState"></a><h3>struct PopplerActionOCGState</h3>
+<pre class="programlisting">struct PopplerActionOCGState {
+       PopplerActionType type;
+       gchar            *title;
+
+       GList            *state_list;
+};
+</pre>
+</div>
+<hr>
+<div class="refsect2">
+<a name="PopplerActionJavascript"></a><h3>struct PopplerActionJavascript</h3>
+<pre class="programlisting">struct PopplerActionJavascript {
+       PopplerActionType  type;
+       gchar             *title;
+
+       gchar             *script;
+};
+</pre>
+</div>
+<hr>
+<div class="refsect2">
+<a name="PopplerActionType"></a><h3>enum PopplerActionType</h3>
+<pre class="programlisting">typedef enum {
+       POPPLER_ACTION_UNKNOWN,         /* unknown action */
+       POPPLER_ACTION_NONE,            /* no action specified */
+       POPPLER_ACTION_GOTO_DEST, /* go to destination */
+       POPPLER_ACTION_GOTO_REMOTE, /* go to destination in new file */
+       POPPLER_ACTION_LAUNCH,          /* launch app (or open document) */
+       POPPLER_ACTION_URI,             /* URI */
+       POPPLER_ACTION_NAMED,           /* named action*/
+       POPPLER_ACTION_MOVIE,           /* movie action */
+       POPPLER_ACTION_RENDITION,       /* rendition action */
+       POPPLER_ACTION_OCG_STATE,       /* Set-OCG-State action */
+       POPPLER_ACTION_JAVASCRIPT /* Javascript action */
+} PopplerActionType;
+</pre>
+<p>
+Action types
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><a name="POPPLER-ACTION-UNKNOWN:CAPS"></a><span class="term"><code class="literal">POPPLER_ACTION_UNKNOWN</code></span></p></td>
+<td>unknown action
+</td>
+</tr>
+<tr>
+<td><p><a name="POPPLER-ACTION-NONE:CAPS"></a><span class="term"><code class="literal">POPPLER_ACTION_NONE</code></span></p></td>
+<td>no action specified
+</td>
+</tr>
+<tr>
+<td><p><a name="POPPLER-ACTION-GOTO-DEST:CAPS"></a><span class="term"><code class="literal">POPPLER_ACTION_GOTO_DEST</code></span></p></td>
+<td>go to destination
+</td>
+</tr>
+<tr>
+<td><p><a name="POPPLER-ACTION-GOTO-REMOTE:CAPS"></a><span class="term"><code class="literal">POPPLER_ACTION_GOTO_REMOTE</code></span></p></td>
+<td>go to destination in another document
+</td>
+</tr>
+<tr>
+<td><p><a name="POPPLER-ACTION-LAUNCH:CAPS"></a><span class="term"><code class="literal">POPPLER_ACTION_LAUNCH</code></span></p></td>
+<td>launch app (or open document
+</td>
+</tr>
+<tr>
+<td><p><a name="POPPLER-ACTION-URI:CAPS"></a><span class="term"><code class="literal">POPPLER_ACTION_URI</code></span></p></td>
+<td>URI
+</td>
+</tr>
+<tr>
+<td><p><a name="POPPLER-ACTION-NAMED:CAPS"></a><span class="term"><code class="literal">POPPLER_ACTION_NAMED</code></span></p></td>
+<td>predefined action
+</td>
+</tr>
+<tr>
+<td><p><a name="POPPLER-ACTION-MOVIE:CAPS"></a><span class="term"><code class="literal">POPPLER_ACTION_MOVIE</code></span></p></td>
+<td>play movies. Since 0.14
+</td>
+</tr>
+<tr>
+<td><p><a name="POPPLER-ACTION-RENDITION:CAPS"></a><span class="term"><code class="literal">POPPLER_ACTION_RENDITION</code></span></p></td>
+<td>play multimedia content. Since 0.14
+</td>
+</tr>
+<tr>
+<td><p><a name="POPPLER-ACTION-OCG-STATE:CAPS"></a><span class="term"><code class="literal">POPPLER_ACTION_OCG_STATE</code></span></p></td>
+<td>state of layer. Since 0.14
+</td>
+</tr>
+<tr>
+<td><p><a name="POPPLER-ACTION-JAVASCRIPT:CAPS"></a><span class="term"><code class="literal">POPPLER_ACTION_JAVASCRIPT</code></span></p></td>
+<td>Javascript. Since 0.18
+</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="PopplerDestType"></a><h3>enum PopplerDestType</h3>
+<pre class="programlisting">typedef enum {
+       POPPLER_DEST_UNKNOWN,
+       POPPLER_DEST_XYZ,
+       POPPLER_DEST_FIT,
+       POPPLER_DEST_FITH,
+       POPPLER_DEST_FITV,
+       POPPLER_DEST_FITR,
+       POPPLER_DEST_FITB,
+       POPPLER_DEST_FITBH,
+       POPPLER_DEST_FITBV,
+       POPPLER_DEST_NAMED
+} PopplerDestType;
+</pre>
+<p>
+Destination types
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><a name="POPPLER-DEST-UNKNOWN:CAPS"></a><span class="term"><code class="literal">POPPLER_DEST_UNKNOWN</code></span></p></td>
+<td>unknown destination
+</td>
+</tr>
+<tr>
+<td><p><a name="POPPLER-DEST-XYZ:CAPS"></a><span class="term"><code class="literal">POPPLER_DEST_XYZ</code></span></p></td>
+<td>go to page with coordinates (left, top)
+positioned at the upper-left corner of the window and the contents of
+the page magnified by the factor zoom
+</td>
+</tr>
+<tr>
+<td><p><a name="POPPLER-DEST-FIT:CAPS"></a><span class="term"><code class="literal">POPPLER_DEST_FIT</code></span></p></td>
+<td>go to page with its contents magnified just
+enough to fit the entire page within the window both horizontally and
+vertically
+</td>
+</tr>
+<tr>
+<td><p><a name="POPPLER-DEST-FITH:CAPS"></a><span class="term"><code class="literal">POPPLER_DEST_FITH</code></span></p></td>
+<td>go to page with the vertical coordinate top
+positioned at the top edge of the window and the contents of the page
+magnified just enough to fit the entire width of the page within the window
+</td>
+</tr>
+<tr>
+<td><p><a name="POPPLER-DEST-FITV:CAPS"></a><span class="term"><code class="literal">POPPLER_DEST_FITV</code></span></p></td>
+<td>go to page with the horizontal coordinate
+left positioned at the left edge of the window and the contents of the
+page magnified just enough to fit the entire height of the page within the window
+</td>
+</tr>
+<tr>
+<td><p><a name="POPPLER-DEST-FITR:CAPS"></a><span class="term"><code class="literal">POPPLER_DEST_FITR</code></span></p></td>
+<td>go to page with its contents magnified just
+enough to fit the rectangle specified by the coordinates left, bottom,
+right, and top entirely within the window both horizontally and vertically
+</td>
+</tr>
+<tr>
+<td><p><a name="POPPLER-DEST-FITB:CAPS"></a><span class="term"><code class="literal">POPPLER_DEST_FITB</code></span></p></td>
+<td>go to page with its contents magnified just enough to fit
+its bounding box entirely within the window both horizontally and vertically
+</td>
+</tr>
+<tr>
+<td><p><a name="POPPLER-DEST-FITBH:CAPS"></a><span class="term"><code class="literal">POPPLER_DEST_FITBH</code></span></p></td>
+<td>go to page with the vertical
+coordinate top positioned at the top edge of the window and the
+contents of the page magnified just enough to fit the entire width of its
+bounding box within the window
+</td>
+</tr>
+<tr>
+<td><p><a name="POPPLER-DEST-FITBV:CAPS"></a><span class="term"><code class="literal">POPPLER_DEST_FITBV</code></span></p></td>
+<td>go to page with the horizontal
+coordinate left positioned at the left edge of the window and the
+contents of the page magnified just enough to fit the entire height of its
+bounding box within the window
+</td>
+</tr>
+<tr>
+<td><p><a name="POPPLER-DEST-NAMED:CAPS"></a><span class="term"><code class="literal">POPPLER_DEST_NAMED</code></span></p></td>
+<td>got to page specified by a name. See <a class="link" href="PopplerDocument.html#poppler-document-find-dest" title="poppler_document_find_dest ()"><code class="function">poppler_document_find_dest()</code></a>
+</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="PopplerActionMovieOperation"></a><h3>enum PopplerActionMovieOperation</h3>
+<pre class="programlisting">typedef enum {
+        POPPLER_ACTION_MOVIE_PLAY,
+       POPPLER_ACTION_MOVIE_PAUSE,
+       POPPLER_ACTION_MOVIE_RESUME,
+       POPPLER_ACTION_MOVIE_STOP
+} PopplerActionMovieOperation;
+</pre>
+<p>
+Movie operations
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><a name="POPPLER-ACTION-MOVIE-PLAY:CAPS"></a><span class="term"><code class="literal">POPPLER_ACTION_MOVIE_PLAY</code></span></p></td>
+<td>play movie
+</td>
+</tr>
+<tr>
+<td><p><a name="POPPLER-ACTION-MOVIE-PAUSE:CAPS"></a><span class="term"><code class="literal">POPPLER_ACTION_MOVIE_PAUSE</code></span></p></td>
+<td>pause playing movie
+</td>
+</tr>
+<tr>
+<td><p><a name="POPPLER-ACTION-MOVIE-RESUME:CAPS"></a><span class="term"><code class="literal">POPPLER_ACTION_MOVIE_RESUME</code></span></p></td>
+<td>resume paused movie
+</td>
+</tr>
+<tr>
+<td><p><a name="POPPLER-ACTION-MOVIE-STOP:CAPS"></a><span class="term"><code class="literal">POPPLER_ACTION_MOVIE_STOP</code></span></p></td>
+<td>stop playing movie
+</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.14</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="PopplerActionLayer"></a><h3>PopplerActionLayer</h3>
+<pre class="programlisting">typedef struct {
+       PopplerActionLayerAction action;
+       GList *layers;
+} PopplerActionLayer;
+</pre>
+<p>
+Action to perform over a list of layers
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><a class="link" href="poppler-PopplerAction.html#PopplerActionLayerAction" title="enum PopplerActionLayerAction"><span class="type">PopplerActionLayerAction</span></a> <em class="structfield"><code><a name="PopplerActionLayer.action"></a>action</code></em>;</span></p></td>
+<td>a <a class="link" href="poppler-PopplerAction.html#PopplerActionLayerAction" title="enum PopplerActionLayerAction"><span class="type">PopplerActionLayerAction</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><a href="http://library.gnome.org/devel/glib/unstable/glib-Doubly-Linked-Lists.html#GList"><span class="type">GList</span></a> *<em class="structfield"><code><a name="PopplerActionLayer.layers"></a>layers</code></em>;</span></p></td>
+<td>list of <a class="link" href="PopplerLayer.html" title="PopplerLayer"><span class="type">PopplerLayer</span></a>s</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="PopplerActionLayerAction"></a><h3>enum PopplerActionLayerAction</h3>
+<pre class="programlisting">typedef enum {
+       POPPLER_ACTION_LAYER_ON,
+       POPPLER_ACTION_LAYER_OFF,
+       POPPLER_ACTION_LAYER_TOGGLE
+} PopplerActionLayerAction;
+</pre>
+<p>
+Layer actions
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><a name="POPPLER-ACTION-LAYER-ON:CAPS"></a><span class="term"><code class="literal">POPPLER_ACTION_LAYER_ON</code></span></p></td>
+<td>set layer visibility on
+</td>
+</tr>
+<tr>
+<td><p><a name="POPPLER-ACTION-LAYER-OFF:CAPS"></a><span class="term"><code class="literal">POPPLER_ACTION_LAYER_OFF</code></span></p></td>
+<td>set layer visibility off
+</td>
+</tr>
+<tr>
+<td><p><a name="POPPLER-ACTION-LAYER-TOGGLE:CAPS"></a><span class="term"><code class="literal">POPPLER_ACTION_LAYER_TOGGLE</code></span></p></td>
+<td>reverse the layer visibility state
+</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.14</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="poppler-action-copy"></a><h3>poppler_action_copy ()</h3>
+<pre class="programlisting"><a class="link" href="poppler-PopplerAction.html#PopplerAction" title="union PopplerAction"><span class="returnvalue">PopplerAction</span></a> *     poppler_action_copy                 (<em class="parameter"><code><a class="link" href="poppler-PopplerAction.html#PopplerAction" title="union PopplerAction"><span class="type">PopplerAction</span></a> *action</code></em>);</pre>
+<p>
+Copies <em class="parameter"><code>action</code></em>, creating an identical <a class="link" href="poppler-PopplerAction.html#PopplerAction" title="union PopplerAction"><span class="type">PopplerAction</span></a>.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>action</code></em> :</span></p></td>
+<td>a <a class="link" href="poppler-PopplerAction.html#PopplerAction" title="union PopplerAction"><span class="type">PopplerAction</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>a new action identical to <em class="parameter"><code>action</code></em>
+</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="poppler-action-free"></a><h3>poppler_action_free ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span>                poppler_action_free                 (<em class="parameter"><code><a class="link" href="poppler-PopplerAction.html#PopplerAction" title="union PopplerAction"><span class="type">PopplerAction</span></a> *action</code></em>);</pre>
+<p>
+Frees <em class="parameter"><code>action</code></em>
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody><tr>
+<td><p><span class="term"><em class="parameter"><code>action</code></em> :</span></p></td>
+<td>a <a class="link" href="poppler-PopplerAction.html#PopplerAction" title="union PopplerAction"><span class="type">PopplerAction</span></a>
+</td>
+</tr></tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="poppler-dest-copy"></a><h3>poppler_dest_copy ()</h3>
+<pre class="programlisting"><a class="link" href="poppler-PopplerAction.html#PopplerDest" title="PopplerDest"><span class="returnvalue">PopplerDest</span></a> *       poppler_dest_copy                   (<em class="parameter"><code><a class="link" href="poppler-PopplerAction.html#PopplerDest" title="PopplerDest"><span class="type">PopplerDest</span></a> *dest</code></em>);</pre>
+<p>
+Copies <em class="parameter"><code>dest</code></em>, creating an identical <a class="link" href="poppler-PopplerAction.html#PopplerDest" title="PopplerDest"><span class="type">PopplerDest</span></a>.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>dest</code></em> :</span></p></td>
+<td>a <a class="link" href="poppler-PopplerAction.html#PopplerDest" title="PopplerDest"><span class="type">PopplerDest</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>a new destination identical to <em class="parameter"><code>dest</code></em>
+</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="poppler-dest-free"></a><h3>poppler_dest_free ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span>                poppler_dest_free                   (<em class="parameter"><code><a class="link" href="poppler-PopplerAction.html#PopplerDest" title="PopplerDest"><span class="type">PopplerDest</span></a> *dest</code></em>);</pre>
+<p>
+Frees <em class="parameter"><code>dest</code></em>
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody><tr>
+<td><p><span class="term"><em class="parameter"><code>dest</code></em> :</span></p></td>
+<td>a <a class="link" href="poppler-PopplerAction.html#PopplerDest" title="PopplerDest"><span class="type">PopplerDest</span></a>
+</td>
+</tr></tbody>
+</table></div>
+</div>
+</div>
+</div>
+<div class="footer">
+<hr>
+          Generated by GTK-Doc V1.18</div>
+</body>
+</html>
\ No newline at end of file
diff --git a/glib/reference/html/poppler-Version-and-Features-Information.html b/glib/reference/html/poppler-Version-and-Features-Information.html
new file mode 100644 (file)
index 0000000..adb25e6
--- /dev/null
@@ -0,0 +1,142 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>Version and Features Information</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.76.1">
+<link rel="home" href="index.html" title="Poppler Reference Manual">
+<link rel="up" href="ch01.html" title="Poppler">
+<link rel="prev" href="PopplerMovie.html" title="PopplerMovie">
+<link rel="next" href="api-index-full.html" title="Index of all symbols">
+<meta name="generator" content="GTK-Doc V1.18 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="2">
+<tr valign="middle">
+<td><a accesskey="p" href="PopplerMovie.html"><img src="left.png" width="24" height="24" border="0" alt="Prev"></a></td>
+<td><a accesskey="u" href="ch01.html"><img src="up.png" width="24" height="24" border="0" alt="Up"></a></td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="24" height="24" border="0" alt="Home"></a></td>
+<th width="100%" align="center">Poppler Reference Manual</th>
+<td><a accesskey="n" href="api-index-full.html"><img src="right.png" width="24" height="24" border="0" alt="Next"></a></td>
+</tr>
+<tr><td colspan="5" class="shortcuts">
+<a href="#poppler-Version-and-Features-Information.synopsis" class="shortcut">Top</a>
+                   | 
+                  <a href="#poppler-Version-and-Features-Information.description" class="shortcut">Description</a>
+</td></tr>
+</table>
+<div class="refentry">
+<a name="poppler-Version-and-Features-Information"></a><div class="titlepage"></div>
+<div class="refnamediv"><table width="100%"><tr>
+<td valign="top">
+<h2><span class="refentrytitle"><a name="poppler-Version-and-Features-Information.top_of_page"></a>Version and Features Information</span></h2>
+<p>Version and Features Information — Variables and functions to check the poppler version and features</p>
+</td>
+<td valign="top" align="right"></td>
+</tr></table></div>
+<div class="refsynopsisdiv">
+<a name="poppler-Version-and-Features-Information.synopsis"></a><h2>Synopsis</h2>
+<pre class="synopsis">
+#include &lt;poppler.h&gt;
+
+#define             <a class="link" href="poppler-Version-and-Features-Information.html#POPPLER-HAS-CAIRO:CAPS" title="POPPLER_HAS_CAIRO">POPPLER_HAS_CAIRO</a>
+#define             <a class="link" href="poppler-Version-and-Features-Information.html#POPPLER-MAJOR-VERSION:CAPS" title="POPPLER_MAJOR_VERSION">POPPLER_MAJOR_VERSION</a>
+#define             <a class="link" href="poppler-Version-and-Features-Information.html#POPPLER-MINOR-VERSION:CAPS" title="POPPLER_MINOR_VERSION">POPPLER_MINOR_VERSION</a>
+#define             <a class="link" href="poppler-Version-and-Features-Information.html#POPPLER-MICRO-VERSION:CAPS" title="POPPLER_MICRO_VERSION">POPPLER_MICRO_VERSION</a>
+#define             <a class="link" href="poppler-Version-and-Features-Information.html#POPPLER-CHECK-VERSION:CAPS" title="POPPLER_CHECK_VERSION()">POPPLER_CHECK_VERSION</a>               (major,
+                                                         minor,
+                                                         micro)
+</pre>
+</div>
+<div class="refsect1">
+<a name="poppler-Version-and-Features-Information.description"></a><h2>Description</h2>
+<p>
+Poppler provides version information, and information about features
+enabled at compile time. This is primarily useful in configure checks
+for builds that have a configure script, or for allowing code to optionally
+depend but not require a specific poppler version.
+</p>
+</div>
+<div class="refsect1">
+<a name="poppler-Version-and-Features-Information.details"></a><h2>Details</h2>
+<div class="refsect2">
+<a name="POPPLER-HAS-CAIRO:CAPS"></a><h3>POPPLER_HAS_CAIRO</h3>
+<pre class="programlisting">#define POPPLER_HAS_CAIRO 1
+</pre>
+<p>
+Defined if poppler was compiled with cairo support.
+</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="POPPLER-MAJOR-VERSION:CAPS"></a><h3>POPPLER_MAJOR_VERSION</h3>
+<pre class="programlisting">#define POPPLER_MAJOR_VERSION (0)
+</pre>
+<p>
+The major version number of the poppler header files (e.g. in poppler version
+0.1.2 this is 0.)
+</p>
+<p class="since">Since 0.12</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="POPPLER-MINOR-VERSION:CAPS"></a><h3>POPPLER_MINOR_VERSION</h3>
+<pre class="programlisting">#define POPPLER_MINOR_VERSION (20)
+</pre>
+<p>
+The major version number of the poppler header files (e.g. in poppler version
+0.1.2 this is 1.)
+</p>
+<p class="since">Since 0.12</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="POPPLER-MICRO-VERSION:CAPS"></a><h3>POPPLER_MICRO_VERSION</h3>
+<pre class="programlisting">#define POPPLER_MICRO_VERSION (4)
+</pre>
+<p>
+The micro version number of the poppler header files (e.g. in poppler version
+0.1.2 this is 2.)
+</p>
+<p class="since">Since 0.12</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="POPPLER-CHECK-VERSION:CAPS"></a><h3>POPPLER_CHECK_VERSION()</h3>
+<pre class="programlisting">#define             POPPLER_CHECK_VERSION(major,minor,micro)</pre>
+<p>
+Checks the version fo the poppler library
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>major</code></em> :</span></p></td>
+<td>major version (e.g. 0 for version 0.1.2)</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>minor</code></em> :</span></p></td>
+<td>minor version (e.g. 1 for version 0.1.2)</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>micro</code></em> :</span></p></td>
+<td>micro version (e.g. 2 for version 0.1.2)</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#TRUE:CAPS"><code class="literal">TRUE</code></a> if the version of the poppler header files is the same
+as or newer than the passed-in version</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.12</p>
+</div>
+</div>
+</div>
+<div class="footer">
+<hr>
+          Generated by GTK-Doc V1.18</div>
+</body>
+</html>
\ No newline at end of file
diff --git a/glib/reference/html/poppler-poppler.html b/glib/reference/html/poppler-poppler.html
new file mode 100644 (file)
index 0000000..dc853f6
--- /dev/null
@@ -0,0 +1,324 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>poppler</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.76.1">
+<link rel="home" href="index.html" title="Poppler Reference Manual">
+<link rel="up" href="ch01.html" title="Poppler">
+<link rel="prev" href="ch01.html" title="Poppler">
+<link rel="next" href="PopplerDocument.html" title="PopplerDocument">
+<meta name="generator" content="GTK-Doc V1.18 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="2">
+<tr valign="middle">
+<td><a accesskey="p" href="ch01.html"><img src="left.png" width="24" height="24" border="0" alt="Prev"></a></td>
+<td><a accesskey="u" href="ch01.html"><img src="up.png" width="24" height="24" border="0" alt="Up"></a></td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="24" height="24" border="0" alt="Home"></a></td>
+<th width="100%" align="center">Poppler Reference Manual</th>
+<td><a accesskey="n" href="PopplerDocument.html"><img src="right.png" width="24" height="24" border="0" alt="Next"></a></td>
+</tr>
+<tr><td colspan="5" class="shortcuts">
+<a href="#poppler-poppler.synopsis" class="shortcut">Top</a>
+                   | 
+                  <a href="#poppler-poppler.description" class="shortcut">Description</a>
+</td></tr>
+</table>
+<div class="refentry">
+<a name="poppler-poppler"></a><div class="titlepage"></div>
+<div class="refnamediv"><table width="100%"><tr>
+<td valign="top">
+<h2><span class="refentrytitle"><a name="poppler-poppler.top_of_page"></a>poppler</span></h2>
+<p>poppler</p>
+</td>
+<td valign="top" align="right"></td>
+</tr></table></div>
+<div class="refsynopsisdiv">
+<a name="poppler-poppler.synopsis"></a><h2>Synopsis</h2>
+<pre class="synopsis">
+#include &lt;poppler.h&gt;
+
+#define             <a class="link" href="poppler-poppler.html#POPPLER-ERROR:CAPS" title="POPPLER_ERROR">POPPLER_ERROR</a>
+enum                <a class="link" href="poppler-poppler.html#PopplerError" title="enum PopplerError">PopplerError</a>;
+enum                <a class="link" href="poppler-poppler.html#PopplerOrientation" title="enum PopplerOrientation">PopplerOrientation</a>;
+enum                <a class="link" href="poppler-poppler.html#PopplerBackend" title="enum PopplerBackend">PopplerBackend</a>;
+                    <a class="link" href="poppler-poppler.html#PopplerColor" title="PopplerColor">PopplerColor</a>;
+enum                <a class="link" href="poppler-poppler.html#PopplerPrintFlags" title="enum PopplerPrintFlags">PopplerPrintFlags</a>;
+<a class="link" href="poppler-poppler.html#PopplerBackend" title="enum PopplerBackend"><span class="returnvalue">PopplerBackend</span></a>      <a class="link" href="poppler-poppler.html#poppler-get-backend" title="poppler_get_backend ()">poppler_get_backend</a>                 (<em class="parameter"><code><span class="type">void</span></code></em>);
+const <span class="returnvalue">char</span> *        <a class="link" href="poppler-poppler.html#poppler-get-version" title="poppler_get_version ()">poppler_get_version</a>                 (<em class="parameter"><code><span class="type">void</span></code></em>);
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a>            <a class="link" href="poppler-poppler.html#poppler-date-parse" title="poppler_date_parse ()">poppler_date_parse</a>                  (<em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *date</code></em>,
+                                                         <em class="parameter"><code><span class="type">time_t</span> *timet</code></em>);
+<a class="link" href="poppler-poppler.html#PopplerColor" title="PopplerColor"><span class="returnvalue">PopplerColor</span></a> *      <a class="link" href="poppler-poppler.html#poppler-color-new" title="poppler_color_new ()">poppler_color_new</a>                   (<em class="parameter"><code><span class="type">void</span></code></em>);
+<a class="link" href="poppler-poppler.html#PopplerColor" title="PopplerColor"><span class="returnvalue">PopplerColor</span></a> *      <a class="link" href="poppler-poppler.html#poppler-color-copy" title="poppler_color_copy ()">poppler_color_copy</a>                  (<em class="parameter"><code><a class="link" href="poppler-poppler.html#PopplerColor" title="PopplerColor"><span class="type">PopplerColor</span></a> *color</code></em>);
+<span class="returnvalue">void</span>                <a class="link" href="poppler-poppler.html#poppler-color-free" title="poppler_color_free ()">poppler_color_free</a>                  (<em class="parameter"><code><a class="link" href="poppler-poppler.html#PopplerColor" title="PopplerColor"><span class="type">PopplerColor</span></a> *color</code></em>);
+</pre>
+</div>
+<div class="refsect1">
+<a name="poppler-poppler.description"></a><h2>Description</h2>
+</div>
+<div class="refsect1">
+<a name="poppler-poppler.details"></a><h2>Details</h2>
+<div class="refsect2">
+<a name="POPPLER-ERROR:CAPS"></a><h3>POPPLER_ERROR</h3>
+<pre class="programlisting">#define POPPLER_ERROR poppler_error_quark ()
+</pre>
+</div>
+<hr>
+<div class="refsect2">
+<a name="PopplerError"></a><h3>enum PopplerError</h3>
+<pre class="programlisting">typedef enum {
+  POPPLER_ERROR_INVALID,
+  POPPLER_ERROR_ENCRYPTED,
+  POPPLER_ERROR_OPEN_FILE,
+  POPPLER_ERROR_BAD_CATALOG,
+  POPPLER_ERROR_DAMAGED
+} PopplerError;
+</pre>
+<p>
+Error codes returned by <a class="link" href="PopplerDocument.html" title="PopplerDocument"><span class="type">PopplerDocument</span></a>
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><a name="POPPLER-ERROR-INVALID:CAPS"></a><span class="term"><code class="literal">POPPLER_ERROR_INVALID</code></span></p></td>
+<td>Generic error when a document opration fails
+</td>
+</tr>
+<tr>
+<td><p><a name="POPPLER-ERROR-ENCRYPTED:CAPS"></a><span class="term"><code class="literal">POPPLER_ERROR_ENCRYPTED</code></span></p></td>
+<td>Document is encrypted
+</td>
+</tr>
+<tr>
+<td><p><a name="POPPLER-ERROR-OPEN-FILE:CAPS"></a><span class="term"><code class="literal">POPPLER_ERROR_OPEN_FILE</code></span></p></td>
+<td>File could not be opened for writing when saving document
+</td>
+</tr>
+<tr>
+<td><p><a name="POPPLER-ERROR-BAD-CATALOG:CAPS"></a><span class="term"><code class="literal">POPPLER_ERROR_BAD_CATALOG</code></span></p></td>
+<td>Failed to read the document catalog
+</td>
+</tr>
+<tr>
+<td><p><a name="POPPLER-ERROR-DAMAGED:CAPS"></a><span class="term"><code class="literal">POPPLER_ERROR_DAMAGED</code></span></p></td>
+<td>Document is damaged
+</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="PopplerOrientation"></a><h3>enum PopplerOrientation</h3>
+<pre class="programlisting">typedef enum {
+  POPPLER_ORIENTATION_PORTRAIT,
+  POPPLER_ORIENTATION_LANDSCAPE,
+  POPPLER_ORIENTATION_UPSIDEDOWN,
+  POPPLER_ORIENTATION_SEASCAPE
+} PopplerOrientation;
+</pre>
+</div>
+<hr>
+<div class="refsect2">
+<a name="PopplerBackend"></a><h3>enum PopplerBackend</h3>
+<pre class="programlisting">typedef enum {
+  POPPLER_BACKEND_UNKNOWN,
+  POPPLER_BACKEND_SPLASH,
+  POPPLER_BACKEND_CAIRO
+} PopplerBackend;
+</pre>
+</div>
+<hr>
+<div class="refsect2">
+<a name="PopplerColor"></a><h3>PopplerColor</h3>
+<pre class="programlisting">typedef struct {
+  guint16 red;
+  guint16 green;
+  guint16 blue;
+} PopplerColor;
+</pre>
+<p>
+A <a class="link" href="poppler-poppler.html#PopplerColor" title="PopplerColor"><span class="type">PopplerColor</span></a> describes a RGB color. Color components
+are values between 0 and 65535
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><span class="type">guint16</span> <em class="structfield"><code><a name="PopplerColor.red"></a>red</code></em>;</span></p></td>
+<td>the red componment of color</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="type">guint16</span> <em class="structfield"><code><a name="PopplerColor.green"></a>green</code></em>;</span></p></td>
+<td>the green component of color</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="type">guint16</span> <em class="structfield"><code><a name="PopplerColor.blue"></a>blue</code></em>;</span></p></td>
+<td>the blue component of color</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="PopplerPrintFlags"></a><h3>enum PopplerPrintFlags</h3>
+<pre class="programlisting">typedef enum {
+  POPPLER_PRINT_DOCUMENT          = 0,
+  POPPLER_PRINT_MARKUP_ANNOTS     = 1 &lt;&lt; 0,
+  POPPLER_PRINT_STAMP_ANNOTS_ONLY = 1 &lt;&lt; 1,
+  POPPLER_PRINT_ALL               = POPPLER_PRINT_MARKUP_ANNOTS
+} PopplerPrintFlags;
+</pre>
+<p>
+Printing flags
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><a name="POPPLER-PRINT-DOCUMENT:CAPS"></a><span class="term"><code class="literal">POPPLER_PRINT_DOCUMENT</code></span></p></td>
+<td>print main document contents
+</td>
+</tr>
+<tr>
+<td><p><a name="POPPLER-PRINT-MARKUP-ANNOTS:CAPS"></a><span class="term"><code class="literal">POPPLER_PRINT_MARKUP_ANNOTS</code></span></p></td>
+<td>print document and markup annotations
+</td>
+</tr>
+<tr>
+<td><p><a name="POPPLER-PRINT-STAMP-ANNOTS-ONLY:CAPS"></a><span class="term"><code class="literal">POPPLER_PRINT_STAMP_ANNOTS_ONLY</code></span></p></td>
+<td>print document and only stamp annotations
+</td>
+</tr>
+<tr>
+<td><p><a name="POPPLER-PRINT-ALL:CAPS"></a><span class="term"><code class="literal">POPPLER_PRINT_ALL</code></span></p></td>
+<td>print main document contents and all markup annotations
+</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.16</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="poppler-get-backend"></a><h3>poppler_get_backend ()</h3>
+<pre class="programlisting"><a class="link" href="poppler-poppler.html#PopplerBackend" title="enum PopplerBackend"><span class="returnvalue">PopplerBackend</span></a>      poppler_get_backend                 (<em class="parameter"><code><span class="type">void</span></code></em>);</pre>
+<p>
+Returns the backend compiled into the poppler library.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody><tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>The backend used by poppler</td>
+</tr></tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="poppler-get-version"></a><h3>poppler_get_version ()</h3>
+<pre class="programlisting">const <span class="returnvalue">char</span> *        poppler_get_version                 (<em class="parameter"><code><span class="type">void</span></code></em>);</pre>
+<p>
+Returns the version of poppler in use.  This result is not to be freed.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody><tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>the version of poppler.</td>
+</tr></tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="poppler-date-parse"></a><h3>poppler_date_parse ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a>            poppler_date_parse                  (<em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *date</code></em>,
+                                                         <em class="parameter"><code><span class="type">time_t</span> *timet</code></em>);</pre>
+<p>
+Parses a PDF format date string and converts it to a <span class="type">time_t</span>. Returns <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#FALSE:CAPS"><span class="type">FALSE</span></a>
+if the parsing fails or the input string is not a valid PDF format date string
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>date</code></em> :</span></p></td>
+<td>string to parse</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>timet</code></em> :</span></p></td>
+<td>an uninitialized <span class="type">time_t</span>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#TRUE:CAPS"><span class="type">TRUE</span></a>, if <em class="parameter"><code>timet</code></em> was set</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.12</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="poppler-color-new"></a><h3>poppler_color_new ()</h3>
+<pre class="programlisting"><a class="link" href="poppler-poppler.html#PopplerColor" title="PopplerColor"><span class="returnvalue">PopplerColor</span></a> *      poppler_color_new                   (<em class="parameter"><code><span class="type">void</span></code></em>);</pre>
+<p>
+Creates a new <a class="link" href="poppler-poppler.html#PopplerColor" title="PopplerColor"><span class="type">PopplerColor</span></a>
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody><tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>a new <a class="link" href="poppler-poppler.html#PopplerColor" title="PopplerColor"><span class="type">PopplerColor</span></a>, use <a class="link" href="poppler-poppler.html#poppler-color-free" title="poppler_color_free ()"><code class="function">poppler_color_free()</code></a> to free it</td>
+</tr></tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="poppler-color-copy"></a><h3>poppler_color_copy ()</h3>
+<pre class="programlisting"><a class="link" href="poppler-poppler.html#PopplerColor" title="PopplerColor"><span class="returnvalue">PopplerColor</span></a> *      poppler_color_copy                  (<em class="parameter"><code><a class="link" href="poppler-poppler.html#PopplerColor" title="PopplerColor"><span class="type">PopplerColor</span></a> *color</code></em>);</pre>
+<p>
+Creates a copy of <em class="parameter"><code>color</code></em>
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>color</code></em> :</span></p></td>
+<td>a <a class="link" href="poppler-poppler.html#PopplerColor" title="PopplerColor"><span class="type">PopplerColor</span></a> to copy</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>a new allocated copy of <em class="parameter"><code>color</code></em>
+</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="poppler-color-free"></a><h3>poppler_color_free ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span>                poppler_color_free                  (<em class="parameter"><code><a class="link" href="poppler-poppler.html#PopplerColor" title="PopplerColor"><span class="type">PopplerColor</span></a> *color</code></em>);</pre>
+<p>
+Frees the given <a class="link" href="poppler-poppler.html#PopplerColor" title="PopplerColor"><span class="type">PopplerColor</span></a>
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody><tr>
+<td><p><span class="term"><em class="parameter"><code>color</code></em> :</span></p></td>
+<td>a <a class="link" href="poppler-poppler.html#PopplerColor" title="PopplerColor"><span class="type">PopplerColor</span></a>
+</td>
+</tr></tbody>
+</table></div>
+</div>
+</div>
+</div>
+<div class="footer">
+<hr>
+          Generated by GTK-Doc V1.18</div>
+</body>
+</html>
\ No newline at end of file
diff --git a/glib/reference/html/poppler.devhelp2 b/glib/reference/html/poppler.devhelp2
new file mode 100644 (file)
index 0000000..acae862
--- /dev/null
@@ -0,0 +1,440 @@
+<?xml version="1.0" encoding="utf-8" standalone="no"?>
+<!DOCTYPE book PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "">
+<book xmlns="http://www.devhelp.net/book" title="Poppler Reference Manual" link="index.html" author="" name="poppler" version="2" language="c">
+  <chapters>
+    <sub name="Poppler" link="ch01.html">
+      <sub name="poppler" link="poppler-poppler.html"/>
+      <sub name="PopplerDocument" link="PopplerDocument.html"/>
+      <sub name="PopplerPage" link="PopplerPage.html"/>
+      <sub name="PopplerAction" link="poppler-PopplerAction.html"/>
+      <sub name="PopplerAttachment" link="PopplerAttachment.html"/>
+      <sub name="PoppplerFormField" link="PopplerFormField.html"/>
+      <sub name="PopplerAnnot" link="PopplerAnnot.html"/>
+      <sub name="PopplerLayer" link="PopplerLayer.html"/>
+      <sub name="PopplerMedia" link="PopplerMedia.html"/>
+      <sub name="PopplerMovie" link="PopplerMovie.html"/>
+      <sub name="Version and Features Information" link="poppler-Version-and-Features-Information.html"/>
+    </sub>
+    <sub name="Index of all symbols" link="api-index-full.html"/>
+    <sub name="Index of deprecated symbols" link="api-index-deprecated.html"/>
+    <sub name="Index of new symbols in 0.12" link="api-index-0-12.html"/>
+    <sub name="Index of new symbols in 0.14" link="api-index-0-14.html"/>
+    <sub name="Index of new symbols in 0.16" link="api-index-0-16.html"/>
+    <sub name="Index of new symbols in 0.18" link="api-index-0-18.html"/>
+    <sub name="Index of new symbols in 0.20" link="api-index-0-20.html"/>
+    <sub name="Annotation Glossary" link="annotation-glossary.html"/>
+  </chapters>
+  <functions>
+    <keyword type="macro" name="POPPLER_ERROR" link="poppler-poppler.html#POPPLER-ERROR:CAPS"/>
+    <keyword type="enum" name="enum PopplerError" link="poppler-poppler.html#PopplerError"/>
+    <keyword type="enum" name="enum PopplerOrientation" link="poppler-poppler.html#PopplerOrientation"/>
+    <keyword type="enum" name="enum PopplerBackend" link="poppler-poppler.html#PopplerBackend"/>
+    <keyword type="struct" name="PopplerColor" link="poppler-poppler.html#PopplerColor"/>
+    <keyword type="enum" name="enum PopplerPrintFlags" link="poppler-poppler.html#PopplerPrintFlags" since="0.16"/>
+    <keyword type="function" name="poppler_get_backend ()" link="poppler-poppler.html#poppler-get-backend"/>
+    <keyword type="function" name="poppler_get_version ()" link="poppler-poppler.html#poppler-get-version"/>
+    <keyword type="function" name="poppler_date_parse ()" link="poppler-poppler.html#poppler-date-parse" since="0.12"/>
+    <keyword type="function" name="poppler_color_new ()" link="poppler-poppler.html#poppler-color-new"/>
+    <keyword type="function" name="poppler_color_copy ()" link="poppler-poppler.html#poppler-color-copy"/>
+    <keyword type="function" name="poppler_color_free ()" link="poppler-poppler.html#poppler-color-free"/>
+    <keyword type="struct" name="PopplerDocument" link="PopplerDocument.html#PopplerDocument-struct"/>
+    <keyword type="struct" name="PopplerIndexIter" link="PopplerDocument.html#PopplerIndexIter"/>
+    <keyword type="struct" name="PopplerFontsIter" link="PopplerDocument.html#PopplerFontsIter"/>
+    <keyword type="struct" name="PopplerLayersIter" link="PopplerDocument.html#PopplerLayersIter"/>
+    <keyword type="enum" name="enum PopplerPageLayout" link="PopplerDocument.html#PopplerPageLayout"/>
+    <keyword type="enum" name="enum PopplerPageMode" link="PopplerDocument.html#PopplerPageMode"/>
+    <keyword type="struct" name="PopplerFontInfo" link="PopplerDocument.html#PopplerFontInfo"/>
+    <keyword type="enum" name="enum PopplerFontType" link="PopplerDocument.html#PopplerFontType"/>
+    <keyword type="struct" name="PopplerPSFile" link="PopplerDocument.html#PopplerPSFile"/>
+    <keyword type="enum" name="enum PopplerViewerPreferences" link="PopplerDocument.html#PopplerViewerPreferences"/>
+    <keyword type="enum" name="enum PopplerPermissions" link="PopplerDocument.html#PopplerPermissions"/>
+    <keyword type="function" name="poppler_document_new_from_file ()" link="PopplerDocument.html#poppler-document-new-from-file"/>
+    <keyword type="function" name="poppler_document_new_from_data ()" link="PopplerDocument.html#poppler-document-new-from-data"/>
+    <keyword type="function" name="poppler_document_save ()" link="PopplerDocument.html#poppler-document-save"/>
+    <keyword type="function" name="poppler_document_save_a_copy ()" link="PopplerDocument.html#poppler-document-save-a-copy"/>
+    <keyword type="function" name="poppler_document_get_id ()" link="PopplerDocument.html#poppler-document-get-id" since="0.16"/>
+    <keyword type="function" name="poppler_document_get_pdf_version_string ()" link="PopplerDocument.html#poppler-document-get-pdf-version-string" since="0.16"/>
+    <keyword type="function" name="poppler_document_get_pdf_version ()" link="PopplerDocument.html#poppler-document-get-pdf-version" since="0.16"/>
+    <keyword type="function" name="poppler_document_get_title ()" link="PopplerDocument.html#poppler-document-get-title" since="0.16"/>
+    <keyword type="function" name="poppler_document_get_author ()" link="PopplerDocument.html#poppler-document-get-author" since="0.16"/>
+    <keyword type="function" name="poppler_document_get_subject ()" link="PopplerDocument.html#poppler-document-get-subject" since="0.16"/>
+    <keyword type="function" name="poppler_document_get_keywords ()" link="PopplerDocument.html#poppler-document-get-keywords" since="0.16"/>
+    <keyword type="function" name="poppler_document_get_creator ()" link="PopplerDocument.html#poppler-document-get-creator" since="0.16"/>
+    <keyword type="function" name="poppler_document_get_producer ()" link="PopplerDocument.html#poppler-document-get-producer" since="0.16"/>
+    <keyword type="function" name="poppler_document_get_creation_date ()" link="PopplerDocument.html#poppler-document-get-creation-date" since="0.16"/>
+    <keyword type="function" name="poppler_document_get_modification_date ()" link="PopplerDocument.html#poppler-document-get-modification-date" since="0.16"/>
+    <keyword type="function" name="poppler_document_get_page_layout ()" link="PopplerDocument.html#poppler-document-get-page-layout" since="0.16"/>
+    <keyword type="function" name="poppler_document_get_page_mode ()" link="PopplerDocument.html#poppler-document-get-page-mode" since="0.16"/>
+    <keyword type="function" name="poppler_document_get_permissions ()" link="PopplerDocument.html#poppler-document-get-permissions" since="0.16"/>
+    <keyword type="function" name="poppler_document_get_metadata ()" link="PopplerDocument.html#poppler-document-get-metadata" since="0.16"/>
+    <keyword type="function" name="poppler_document_is_linearized ()" link="PopplerDocument.html#poppler-document-is-linearized" since="0.16"/>
+    <keyword type="function" name="poppler_document_get_n_pages ()" link="PopplerDocument.html#poppler-document-get-n-pages"/>
+    <keyword type="function" name="poppler_document_get_page ()" link="PopplerDocument.html#poppler-document-get-page"/>
+    <keyword type="function" name="poppler_document_get_page_by_label ()" link="PopplerDocument.html#poppler-document-get-page-by-label"/>
+    <keyword type="function" name="poppler_document_find_dest ()" link="PopplerDocument.html#poppler-document-find-dest"/>
+    <keyword type="function" name="poppler_document_get_n_attachments ()" link="PopplerDocument.html#poppler-document-get-n-attachments" since="0.18"/>
+    <keyword type="function" name="poppler_document_has_attachments ()" link="PopplerDocument.html#poppler-document-has-attachments"/>
+    <keyword type="function" name="poppler_document_get_attachments ()" link="PopplerDocument.html#poppler-document-get-attachments"/>
+    <keyword type="function" name="poppler_document_get_form_field ()" link="PopplerDocument.html#poppler-document-get-form-field"/>
+    <keyword type="function" name="poppler_index_iter_new ()" link="PopplerDocument.html#poppler-index-iter-new"/>
+    <keyword type="function" name="poppler_index_iter_copy ()" link="PopplerDocument.html#poppler-index-iter-copy"/>
+    <keyword type="function" name="poppler_index_iter_free ()" link="PopplerDocument.html#poppler-index-iter-free"/>
+    <keyword type="function" name="poppler_index_iter_get_child ()" link="PopplerDocument.html#poppler-index-iter-get-child"/>
+    <keyword type="function" name="poppler_index_iter_is_open ()" link="PopplerDocument.html#poppler-index-iter-is-open"/>
+    <keyword type="function" name="poppler_index_iter_get_action ()" link="PopplerDocument.html#poppler-index-iter-get-action"/>
+    <keyword type="function" name="poppler_index_iter_next ()" link="PopplerDocument.html#poppler-index-iter-next"/>
+    <keyword type="function" name="poppler_font_info_new ()" link="PopplerDocument.html#poppler-font-info-new"/>
+    <keyword type="function" name="poppler_font_info_scan ()" link="PopplerDocument.html#poppler-font-info-scan"/>
+    <keyword type="function" name="poppler_font_info_free ()" link="PopplerDocument.html#poppler-font-info-free"/>
+    <keyword type="function" name="poppler_fonts_iter_copy ()" link="PopplerDocument.html#poppler-fonts-iter-copy"/>
+    <keyword type="function" name="poppler_fonts_iter_free ()" link="PopplerDocument.html#poppler-fonts-iter-free"/>
+    <keyword type="function" name="poppler_fonts_iter_get_name ()" link="PopplerDocument.html#poppler-fonts-iter-get-name"/>
+    <keyword type="function" name="poppler_fonts_iter_get_full_name ()" link="PopplerDocument.html#poppler-fonts-iter-get-full-name"/>
+    <keyword type="function" name="poppler_fonts_iter_get_font_type ()" link="PopplerDocument.html#poppler-fonts-iter-get-font-type"/>
+    <keyword type="function" name="poppler_fonts_iter_get_substitute_name ()" link="PopplerDocument.html#poppler-fonts-iter-get-substitute-name" since="0.20"/>
+    <keyword type="function" name="poppler_fonts_iter_get_file_name ()" link="PopplerDocument.html#poppler-fonts-iter-get-file-name"/>
+    <keyword type="function" name="poppler_fonts_iter_get_encoding ()" link="PopplerDocument.html#poppler-fonts-iter-get-encoding" since="0.20"/>
+    <keyword type="function" name="poppler_fonts_iter_is_embedded ()" link="PopplerDocument.html#poppler-fonts-iter-is-embedded"/>
+    <keyword type="function" name="poppler_fonts_iter_is_subset ()" link="PopplerDocument.html#poppler-fonts-iter-is-subset"/>
+    <keyword type="function" name="poppler_fonts_iter_next ()" link="PopplerDocument.html#poppler-fonts-iter-next"/>
+    <keyword type="function" name="poppler_layers_iter_new ()" link="PopplerDocument.html#poppler-layers-iter-new" since="0.12"/>
+    <keyword type="function" name="poppler_layers_iter_copy ()" link="PopplerDocument.html#poppler-layers-iter-copy"/>
+    <keyword type="function" name="poppler_layers_iter_free ()" link="PopplerDocument.html#poppler-layers-iter-free" since="0.12"/>
+    <keyword type="function" name="poppler_layers_iter_get_child ()" link="PopplerDocument.html#poppler-layers-iter-get-child" since="0.12"/>
+    <keyword type="function" name="poppler_layers_iter_get_layer ()" link="PopplerDocument.html#poppler-layers-iter-get-layer" since="0.12"/>
+    <keyword type="function" name="poppler_layers_iter_get_title ()" link="PopplerDocument.html#poppler-layers-iter-get-title" since="0.12"/>
+    <keyword type="function" name="poppler_layers_iter_next ()" link="PopplerDocument.html#poppler-layers-iter-next" since="0.12"/>
+    <keyword type="function" name="poppler_ps_file_new ()" link="PopplerDocument.html#poppler-ps-file-new"/>
+    <keyword type="function" name="poppler_ps_file_free ()" link="PopplerDocument.html#poppler-ps-file-free"/>
+    <keyword type="function" name="poppler_ps_file_set_paper_size ()" link="PopplerDocument.html#poppler-ps-file-set-paper-size"/>
+    <keyword type="function" name="poppler_ps_file_set_duplex ()" link="PopplerDocument.html#poppler-ps-file-set-duplex"/>
+    <keyword type="property" name="The &quot;author&quot; property" link="PopplerDocument.html#PopplerDocument--author"/>
+    <keyword type="property" name="The &quot;creation-date&quot; property" link="PopplerDocument.html#PopplerDocument--creation-date"/>
+    <keyword type="property" name="The &quot;creator&quot; property" link="PopplerDocument.html#PopplerDocument--creator"/>
+    <keyword type="property" name="The &quot;format&quot; property" link="PopplerDocument.html#PopplerDocument--format"/>
+    <keyword type="property" name="The &quot;format-major&quot; property" link="PopplerDocument.html#PopplerDocument--format-major"/>
+    <keyword type="property" name="The &quot;format-minor&quot; property" link="PopplerDocument.html#PopplerDocument--format-minor"/>
+    <keyword type="property" name="The &quot;keywords&quot; property" link="PopplerDocument.html#PopplerDocument--keywords"/>
+    <keyword type="property" name="The &quot;linearized&quot; property" link="PopplerDocument.html#PopplerDocument--linearized"/>
+    <keyword type="property" name="The &quot;metadata&quot; property" link="PopplerDocument.html#PopplerDocument--metadata"/>
+    <keyword type="property" name="The &quot;mod-date&quot; property" link="PopplerDocument.html#PopplerDocument--mod-date"/>
+    <keyword type="property" name="The &quot;page-layout&quot; property" link="PopplerDocument.html#PopplerDocument--page-layout"/>
+    <keyword type="property" name="The &quot;page-mode&quot; property" link="PopplerDocument.html#PopplerDocument--page-mode"/>
+    <keyword type="property" name="The &quot;permissions&quot; property" link="PopplerDocument.html#PopplerDocument--permissions"/>
+    <keyword type="property" name="The &quot;producer&quot; property" link="PopplerDocument.html#PopplerDocument--producer"/>
+    <keyword type="property" name="The &quot;subject&quot; property" link="PopplerDocument.html#PopplerDocument--subject"/>
+    <keyword type="property" name="The &quot;title&quot; property" link="PopplerDocument.html#PopplerDocument--title"/>
+    <keyword type="property" name="The &quot;viewer-preferences&quot; property" link="PopplerDocument.html#PopplerDocument--viewer-preferences"/>
+    <keyword type="struct" name="PopplerPage" link="PopplerPage.html#PopplerPage-struct"/>
+    <keyword type="struct" name="PopplerRectangle" link="PopplerPage.html#PopplerRectangle"/>
+    <keyword type="struct" name="PopplerPageTransition" link="PopplerPage.html#PopplerPageTransition"/>
+    <keyword type="struct" name="PopplerLinkMapping" link="PopplerPage.html#PopplerLinkMapping"/>
+    <keyword type="struct" name="PopplerImageMapping" link="PopplerPage.html#PopplerImageMapping"/>
+    <keyword type="struct" name="PopplerFormFieldMapping" link="PopplerPage.html#PopplerFormFieldMapping"/>
+    <keyword type="struct" name="PopplerAnnotMapping" link="PopplerPage.html#PopplerAnnotMapping"/>
+    <keyword type="enum" name="enum PopplerPageTransitionType" link="PopplerPage.html#PopplerPageTransitionType"/>
+    <keyword type="enum" name="enum PopplerPageTransitionAlignment" link="PopplerPage.html#PopplerPageTransitionAlignment"/>
+    <keyword type="enum" name="enum PopplerPageTransitionDirection" link="PopplerPage.html#PopplerPageTransitionDirection"/>
+    <keyword type="enum" name="enum PopplerSelectionStyle" link="PopplerPage.html#PopplerSelectionStyle"/>
+    <keyword type="struct" name="PopplerTextAttributes" link="PopplerPage.html#PopplerTextAttributes" since="0.18"/>
+    <keyword type="function" name="poppler_page_get_index ()" link="PopplerPage.html#poppler-page-get-index"/>
+    <keyword type="function" name="poppler_page_get_label ()" link="PopplerPage.html#poppler-page-get-label" since="0.16"/>
+    <keyword type="function" name="poppler_page_get_size ()" link="PopplerPage.html#poppler-page-get-size"/>
+    <keyword type="function" name="poppler_page_get_crop_box ()" link="PopplerPage.html#poppler-page-get-crop-box"/>
+    <keyword type="function" name="poppler_page_get_duration ()" link="PopplerPage.html#poppler-page-get-duration"/>
+    <keyword type="function" name="poppler_page_get_transition ()" link="PopplerPage.html#poppler-page-get-transition"/>
+    <keyword type="function" name="poppler_page_get_thumbnail_size ()" link="PopplerPage.html#poppler-page-get-thumbnail-size"/>
+    <keyword type="function" name="poppler_page_get_thumbnail ()" link="PopplerPage.html#poppler-page-get-thumbnail"/>
+    <keyword type="function" name="poppler_page_render ()" link="PopplerPage.html#poppler-page-render"/>
+    <keyword type="function" name="poppler_page_render_for_printing ()" link="PopplerPage.html#poppler-page-render-for-printing"/>
+    <keyword type="function" name="poppler_page_render_for_printing_with_options ()" link="PopplerPage.html#poppler-page-render-for-printing-with-options" since="0.16"/>
+    <keyword type="function" name="poppler_page_render_to_ps ()" link="PopplerPage.html#poppler-page-render-to-ps"/>
+    <keyword type="function" name="poppler_page_render_selection ()" link="PopplerPage.html#poppler-page-render-selection"/>
+    <keyword type="function" name="poppler_page_get_selected_region ()" link="PopplerPage.html#poppler-page-get-selected-region" since="0.16"/>
+    <keyword type="function" name="poppler_page_get_selection_region ()" link="PopplerPage.html#poppler-page-get-selection-region" deprecated="0.16: Use poppler_page_get_selected_region() instead."/>
+    <keyword type="function" name="poppler_page_selection_region_free ()" link="PopplerPage.html#poppler-page-selection-region-free" deprecated="0.16"/>
+    <keyword type="function" name="poppler_page_get_selected_text ()" link="PopplerPage.html#poppler-page-get-selected-text" since="0.16"/>
+    <keyword type="function" name="poppler_page_find_text ()" link="PopplerPage.html#poppler-page-find-text"/>
+    <keyword type="function" name="poppler_page_get_text ()" link="PopplerPage.html#poppler-page-get-text" since="0.16"/>
+    <keyword type="function" name="poppler_page_get_text_layout ()" link="PopplerPage.html#poppler-page-get-text-layout" since="0.16"/>
+    <keyword type="function" name="poppler_page_get_text_attributes ()" link="PopplerPage.html#poppler-page-get-text-attributes" since="0.18"/>
+    <keyword type="function" name="poppler_page_free_text_attributes ()" link="PopplerPage.html#poppler-page-free-text-attributes" since="0.18"/>
+    <keyword type="function" name="poppler_page_get_link_mapping ()" link="PopplerPage.html#poppler-page-get-link-mapping"/>
+    <keyword type="function" name="poppler_page_free_link_mapping ()" link="PopplerPage.html#poppler-page-free-link-mapping"/>
+    <keyword type="function" name="poppler_page_get_image_mapping ()" link="PopplerPage.html#poppler-page-get-image-mapping"/>
+    <keyword type="function" name="poppler_page_get_image ()" link="PopplerPage.html#poppler-page-get-image"/>
+    <keyword type="function" name="poppler_page_free_image_mapping ()" link="PopplerPage.html#poppler-page-free-image-mapping"/>
+    <keyword type="function" name="poppler_page_get_form_field_mapping ()" link="PopplerPage.html#poppler-page-get-form-field-mapping"/>
+    <keyword type="function" name="poppler_page_free_form_field_mapping ()" link="PopplerPage.html#poppler-page-free-form-field-mapping"/>
+    <keyword type="function" name="poppler_page_get_annot_mapping ()" link="PopplerPage.html#poppler-page-get-annot-mapping"/>
+    <keyword type="function" name="poppler_page_free_annot_mapping ()" link="PopplerPage.html#poppler-page-free-annot-mapping"/>
+    <keyword type="function" name="poppler_page_add_annot ()" link="PopplerPage.html#poppler-page-add-annot" since="0.16"/>
+    <keyword type="function" name="poppler_rectangle_new ()" link="PopplerPage.html#poppler-rectangle-new"/>
+    <keyword type="function" name="poppler_rectangle_copy ()" link="PopplerPage.html#poppler-rectangle-copy"/>
+    <keyword type="function" name="poppler_rectangle_free ()" link="PopplerPage.html#poppler-rectangle-free"/>
+    <keyword type="function" name="poppler_page_transition_new ()" link="PopplerPage.html#poppler-page-transition-new"/>
+    <keyword type="function" name="poppler_page_transition_copy ()" link="PopplerPage.html#poppler-page-transition-copy"/>
+    <keyword type="function" name="poppler_page_transition_free ()" link="PopplerPage.html#poppler-page-transition-free"/>
+    <keyword type="function" name="poppler_link_mapping_new ()" link="PopplerPage.html#poppler-link-mapping-new"/>
+    <keyword type="function" name="poppler_link_mapping_copy ()" link="PopplerPage.html#poppler-link-mapping-copy"/>
+    <keyword type="function" name="poppler_link_mapping_free ()" link="PopplerPage.html#poppler-link-mapping-free"/>
+    <keyword type="function" name="poppler_image_mapping_new ()" link="PopplerPage.html#poppler-image-mapping-new"/>
+    <keyword type="function" name="poppler_image_mapping_copy ()" link="PopplerPage.html#poppler-image-mapping-copy"/>
+    <keyword type="function" name="poppler_image_mapping_free ()" link="PopplerPage.html#poppler-image-mapping-free"/>
+    <keyword type="function" name="poppler_form_field_mapping_new ()" link="PopplerPage.html#poppler-form-field-mapping-new"/>
+    <keyword type="function" name="poppler_form_field_mapping_copy ()" link="PopplerPage.html#poppler-form-field-mapping-copy"/>
+    <keyword type="function" name="poppler_form_field_mapping_free ()" link="PopplerPage.html#poppler-form-field-mapping-free"/>
+    <keyword type="function" name="poppler_annot_mapping_new ()" link="PopplerPage.html#poppler-annot-mapping-new"/>
+    <keyword type="function" name="poppler_annot_mapping_copy ()" link="PopplerPage.html#poppler-annot-mapping-copy"/>
+    <keyword type="function" name="poppler_annot_mapping_free ()" link="PopplerPage.html#poppler-annot-mapping-free"/>
+    <keyword type="function" name="poppler_text_attributes_new ()" link="PopplerPage.html#poppler-text-attributes-new" since="0.18"/>
+    <keyword type="function" name="poppler_text_attributes_copy ()" link="PopplerPage.html#poppler-text-attributes-copy" since="0.18"/>
+    <keyword type="function" name="poppler_text_attributes_free ()" link="PopplerPage.html#poppler-text-attributes-free" since="0.18"/>
+    <keyword type="property" name="The &quot;label&quot; property" link="PopplerPage.html#PopplerPage--label"/>
+    <keyword type="union" name="union PopplerAction" link="poppler-PopplerAction.html#PopplerAction"/>
+    <keyword type="struct" name="PopplerDest" link="poppler-PopplerAction.html#PopplerDest"/>
+    <keyword type="struct" name="struct PopplerActionAny" link="poppler-PopplerAction.html#PopplerActionAny"/>
+    <keyword type="struct" name="struct PopplerActionGotoDest" link="poppler-PopplerAction.html#PopplerActionGotoDest"/>
+    <keyword type="struct" name="struct PopplerActionGotoRemote" link="poppler-PopplerAction.html#PopplerActionGotoRemote"/>
+    <keyword type="struct" name="struct PopplerActionLaunch" link="poppler-PopplerAction.html#PopplerActionLaunch"/>
+    <keyword type="struct" name="struct PopplerActionUri" link="poppler-PopplerAction.html#PopplerActionUri"/>
+    <keyword type="struct" name="struct PopplerActionNamed" link="poppler-PopplerAction.html#PopplerActionNamed"/>
+    <keyword type="struct" name="struct PopplerActionMovie" link="poppler-PopplerAction.html#PopplerActionMovie"/>
+    <keyword type="struct" name="struct PopplerActionRendition" link="poppler-PopplerAction.html#PopplerActionRendition"/>
+    <keyword type="struct" name="struct PopplerActionOCGState" link="poppler-PopplerAction.html#PopplerActionOCGState"/>
+    <keyword type="struct" name="struct PopplerActionJavascript" link="poppler-PopplerAction.html#PopplerActionJavascript"/>
+    <keyword type="enum" name="enum PopplerActionType" link="poppler-PopplerAction.html#PopplerActionType"/>
+    <keyword type="enum" name="enum PopplerDestType" link="poppler-PopplerAction.html#PopplerDestType"/>
+    <keyword type="enum" name="enum PopplerActionMovieOperation" link="poppler-PopplerAction.html#PopplerActionMovieOperation" since="0.14"/>
+    <keyword type="struct" name="PopplerActionLayer" link="poppler-PopplerAction.html#PopplerActionLayer"/>
+    <keyword type="enum" name="enum PopplerActionLayerAction" link="poppler-PopplerAction.html#PopplerActionLayerAction" since="0.14"/>
+    <keyword type="function" name="poppler_action_copy ()" link="poppler-PopplerAction.html#poppler-action-copy"/>
+    <keyword type="function" name="poppler_action_free ()" link="poppler-PopplerAction.html#poppler-action-free"/>
+    <keyword type="function" name="poppler_dest_copy ()" link="poppler-PopplerAction.html#poppler-dest-copy"/>
+    <keyword type="function" name="poppler_dest_free ()" link="poppler-PopplerAction.html#poppler-dest-free"/>
+    <keyword type="struct" name="PopplerAttachment" link="PopplerAttachment.html#PopplerAttachment-struct"/>
+    <keyword type="function" name="PopplerAttachmentSaveFunc ()" link="PopplerAttachment.html#PopplerAttachmentSaveFunc"/>
+    <keyword type="function" name="poppler_attachment_save ()" link="PopplerAttachment.html#poppler-attachment-save"/>
+    <keyword type="function" name="poppler_attachment_save_to_callback ()" link="PopplerAttachment.html#poppler-attachment-save-to-callback"/>
+    <keyword type="struct" name="PopplerFormField" link="PopplerFormField.html#PopplerFormField-struct"/>
+    <keyword type="enum" name="enum PopplerFormFieldType" link="PopplerFormField.html#PopplerFormFieldType"/>
+    <keyword type="enum" name="enum PopplerFormButtonType" link="PopplerFormField.html#PopplerFormButtonType"/>
+    <keyword type="enum" name="enum PopplerFormChoiceType" link="PopplerFormField.html#PopplerFormChoiceType"/>
+    <keyword type="enum" name="enum PopplerFormTextType" link="PopplerFormField.html#PopplerFormTextType"/>
+    <keyword type="function" name="poppler_form_field_get_field_type ()" link="PopplerFormField.html#poppler-form-field-get-field-type"/>
+    <keyword type="function" name="poppler_form_field_get_id ()" link="PopplerFormField.html#poppler-form-field-get-id"/>
+    <keyword type="function" name="poppler_form_field_is_read_only ()" link="PopplerFormField.html#poppler-form-field-is-read-only"/>
+    <keyword type="function" name="poppler_form_field_get_font_size ()" link="PopplerFormField.html#poppler-form-field-get-font-size"/>
+    <keyword type="function" name="poppler_form_field_get_partial_name ()" link="PopplerFormField.html#poppler-form-field-get-partial-name" since="0.16"/>
+    <keyword type="function" name="poppler_form_field_get_mapping_name ()" link="PopplerFormField.html#poppler-form-field-get-mapping-name" since="0.16"/>
+    <keyword type="function" name="poppler_form_field_get_name ()" link="PopplerFormField.html#poppler-form-field-get-name" since="0.16"/>
+    <keyword type="function" name="poppler_form_field_get_action ()" link="PopplerFormField.html#poppler-form-field-get-action" since="0.18"/>
+    <keyword type="function" name="poppler_form_field_button_get_button_type ()" link="PopplerFormField.html#poppler-form-field-button-get-button-type"/>
+    <keyword type="function" name="poppler_form_field_button_get_state ()" link="PopplerFormField.html#poppler-form-field-button-get-state"/>
+    <keyword type="function" name="poppler_form_field_button_set_state ()" link="PopplerFormField.html#poppler-form-field-button-set-state"/>
+    <keyword type="function" name="poppler_form_field_choice_get_choice_type ()" link="PopplerFormField.html#poppler-form-field-choice-get-choice-type"/>
+    <keyword type="function" name="poppler_form_field_choice_can_select_multiple ()" link="PopplerFormField.html#poppler-form-field-choice-can-select-multiple"/>
+    <keyword type="function" name="poppler_form_field_choice_commit_on_change ()" link="PopplerFormField.html#poppler-form-field-choice-commit-on-change"/>
+    <keyword type="function" name="poppler_form_field_choice_do_spell_check ()" link="PopplerFormField.html#poppler-form-field-choice-do-spell-check"/>
+    <keyword type="function" name="poppler_form_field_choice_get_item ()" link="PopplerFormField.html#poppler-form-field-choice-get-item"/>
+    <keyword type="function" name="poppler_form_field_choice_get_n_items ()" link="PopplerFormField.html#poppler-form-field-choice-get-n-items"/>
+    <keyword type="function" name="poppler_form_field_choice_get_text ()" link="PopplerFormField.html#poppler-form-field-choice-get-text"/>
+    <keyword type="function" name="poppler_form_field_choice_set_text ()" link="PopplerFormField.html#poppler-form-field-choice-set-text"/>
+    <keyword type="function" name="poppler_form_field_choice_is_editable ()" link="PopplerFormField.html#poppler-form-field-choice-is-editable"/>
+    <keyword type="function" name="poppler_form_field_choice_is_item_selected ()" link="PopplerFormField.html#poppler-form-field-choice-is-item-selected"/>
+    <keyword type="function" name="poppler_form_field_choice_select_item ()" link="PopplerFormField.html#poppler-form-field-choice-select-item"/>
+    <keyword type="function" name="poppler_form_field_choice_toggle_item ()" link="PopplerFormField.html#poppler-form-field-choice-toggle-item"/>
+    <keyword type="function" name="poppler_form_field_choice_unselect_all ()" link="PopplerFormField.html#poppler-form-field-choice-unselect-all"/>
+    <keyword type="function" name="poppler_form_field_text_get_text_type ()" link="PopplerFormField.html#poppler-form-field-text-get-text-type"/>
+    <keyword type="function" name="poppler_form_field_text_get_text ()" link="PopplerFormField.html#poppler-form-field-text-get-text"/>
+    <keyword type="function" name="poppler_form_field_text_set_text ()" link="PopplerFormField.html#poppler-form-field-text-set-text"/>
+    <keyword type="function" name="poppler_form_field_text_get_max_len ()" link="PopplerFormField.html#poppler-form-field-text-get-max-len"/>
+    <keyword type="function" name="poppler_form_field_text_do_scroll ()" link="PopplerFormField.html#poppler-form-field-text-do-scroll"/>
+    <keyword type="function" name="poppler_form_field_text_do_spell_check ()" link="PopplerFormField.html#poppler-form-field-text-do-spell-check"/>
+    <keyword type="function" name="poppler_form_field_text_is_password ()" link="PopplerFormField.html#poppler-form-field-text-is-password"/>
+    <keyword type="function" name="poppler_form_field_text_is_rich_text ()" link="PopplerFormField.html#poppler-form-field-text-is-rich-text"/>
+    <keyword type="struct" name="PopplerAnnot" link="PopplerAnnot.html#PopplerAnnot-struct"/>
+    <keyword type="struct" name="PopplerAnnotMarkup" link="PopplerAnnot.html#PopplerAnnotMarkup"/>
+    <keyword type="struct" name="PopplerAnnotText" link="PopplerAnnot.html#PopplerAnnotText"/>
+    <keyword type="struct" name="PopplerAnnotFreeText" link="PopplerAnnot.html#PopplerAnnotFreeText"/>
+    <keyword type="struct" name="PopplerAnnotFileAttachment" link="PopplerAnnot.html#PopplerAnnotFileAttachment"/>
+    <keyword type="struct" name="PopplerAnnotMovie" link="PopplerAnnot.html#PopplerAnnotMovie"/>
+    <keyword type="struct" name="PopplerAnnotScreen" link="PopplerAnnot.html#PopplerAnnotScreen"/>
+    <keyword type="enum" name="enum PopplerAnnotType" link="PopplerAnnot.html#PopplerAnnotType"/>
+    <keyword type="enum" name="enum PopplerAnnotFlag" link="PopplerAnnot.html#PopplerAnnotFlag"/>
+    <keyword type="enum" name="enum PopplerAnnotExternalDataType" link="PopplerAnnot.html#PopplerAnnotExternalDataType"/>
+    <keyword type="enum" name="enum PopplerAnnotMarkupReplyType" link="PopplerAnnot.html#PopplerAnnotMarkupReplyType"/>
+    <keyword type="enum" name="enum PopplerAnnotTextState" link="PopplerAnnot.html#PopplerAnnotTextState"/>
+    <keyword type="struct" name="PopplerAnnotCalloutLine" link="PopplerAnnot.html#PopplerAnnotCalloutLine"/>
+    <keyword type="enum" name="enum PopplerAnnotFreeTextQuadding" link="PopplerAnnot.html#PopplerAnnotFreeTextQuadding"/>
+    <keyword type="function" name="poppler_annot_get_annot_type ()" link="PopplerAnnot.html#poppler-annot-get-annot-type"/>
+    <keyword type="function" name="poppler_annot_get_flags ()" link="PopplerAnnot.html#poppler-annot-get-flags"/>
+    <keyword type="function" name="poppler_annot_get_name ()" link="PopplerAnnot.html#poppler-annot-get-name"/>
+    <keyword type="function" name="poppler_annot_get_page_index ()" link="PopplerAnnot.html#poppler-annot-get-page-index" since="0.14"/>
+    <keyword type="function" name="poppler_annot_get_color ()" link="PopplerAnnot.html#poppler-annot-get-color"/>
+    <keyword type="function" name="poppler_annot_set_color ()" link="PopplerAnnot.html#poppler-annot-set-color" since="0.16"/>
+    <keyword type="function" name="poppler_annot_get_contents ()" link="PopplerAnnot.html#poppler-annot-get-contents"/>
+    <keyword type="function" name="poppler_annot_set_contents ()" link="PopplerAnnot.html#poppler-annot-set-contents" since="0.12"/>
+    <keyword type="function" name="poppler_annot_get_modified ()" link="PopplerAnnot.html#poppler-annot-get-modified"/>
+    <keyword type="function" name="poppler_annot_markup_get_label ()" link="PopplerAnnot.html#poppler-annot-markup-get-label"/>
+    <keyword type="function" name="poppler_annot_markup_set_label ()" link="PopplerAnnot.html#poppler-annot-markup-set-label" since="0.16"/>
+    <keyword type="function" name="poppler_annot_markup_get_subject ()" link="PopplerAnnot.html#poppler-annot-markup-get-subject"/>
+    <keyword type="function" name="poppler_annot_markup_get_opacity ()" link="PopplerAnnot.html#poppler-annot-markup-get-opacity"/>
+    <keyword type="function" name="poppler_annot_markup_set_opacity ()" link="PopplerAnnot.html#poppler-annot-markup-set-opacity" since="0.16"/>
+    <keyword type="function" name="poppler_annot_markup_has_popup ()" link="PopplerAnnot.html#poppler-annot-markup-has-popup" since="0.12"/>
+    <keyword type="function" name="poppler_annot_markup_set_popup ()" link="PopplerAnnot.html#poppler-annot-markup-set-popup" since="0.16"/>
+    <keyword type="function" name="poppler_annot_markup_get_popup_is_open ()" link="PopplerAnnot.html#poppler-annot-markup-get-popup-is-open"/>
+    <keyword type="function" name="poppler_annot_markup_set_popup_is_open ()" link="PopplerAnnot.html#poppler-annot-markup-set-popup-is-open" since="0.16"/>
+    <keyword type="function" name="poppler_annot_markup_get_popup_rectangle ()" link="PopplerAnnot.html#poppler-annot-markup-get-popup-rectangle" since="0.12"/>
+    <keyword type="function" name="poppler_annot_markup_get_date ()" link="PopplerAnnot.html#poppler-annot-markup-get-date"/>
+    <keyword type="function" name="poppler_annot_markup_get_external_data ()" link="PopplerAnnot.html#poppler-annot-markup-get-external-data"/>
+    <keyword type="function" name="poppler_annot_markup_get_reply_to ()" link="PopplerAnnot.html#poppler-annot-markup-get-reply-to"/>
+    <keyword type="function" name="poppler_annot_text_new ()" link="PopplerAnnot.html#poppler-annot-text-new" since="0.16"/>
+    <keyword type="function" name="poppler_annot_text_get_icon ()" link="PopplerAnnot.html#poppler-annot-text-get-icon"/>
+    <keyword type="macro" name="POPPLER_ANNOT_TEXT_ICON_NOTE" link="PopplerAnnot.html#POPPLER-ANNOT-TEXT-ICON-NOTE:CAPS"/>
+    <keyword type="macro" name="POPPLER_ANNOT_TEXT_ICON_COMMENT" link="PopplerAnnot.html#POPPLER-ANNOT-TEXT-ICON-COMMENT:CAPS"/>
+    <keyword type="macro" name="POPPLER_ANNOT_TEXT_ICON_KEY" link="PopplerAnnot.html#POPPLER-ANNOT-TEXT-ICON-KEY:CAPS"/>
+    <keyword type="macro" name="POPPLER_ANNOT_TEXT_ICON_HELP" link="PopplerAnnot.html#POPPLER-ANNOT-TEXT-ICON-HELP:CAPS"/>
+    <keyword type="macro" name="POPPLER_ANNOT_TEXT_ICON_NEW_PARAGRAPH" link="PopplerAnnot.html#POPPLER-ANNOT-TEXT-ICON-NEW-PARAGRAPH:CAPS"/>
+    <keyword type="macro" name="POPPLER_ANNOT_TEXT_ICON_PARAGRAPH" link="PopplerAnnot.html#POPPLER-ANNOT-TEXT-ICON-PARAGRAPH:CAPS"/>
+    <keyword type="macro" name="POPPLER_ANNOT_TEXT_ICON_INSERT" link="PopplerAnnot.html#POPPLER-ANNOT-TEXT-ICON-INSERT:CAPS"/>
+    <keyword type="macro" name="POPPLER_ANNOT_TEXT_ICON_CROSS" link="PopplerAnnot.html#POPPLER-ANNOT-TEXT-ICON-CROSS:CAPS"/>
+    <keyword type="macro" name="POPPLER_ANNOT_TEXT_ICON_CIRCLE" link="PopplerAnnot.html#POPPLER-ANNOT-TEXT-ICON-CIRCLE:CAPS"/>
+    <keyword type="function" name="poppler_annot_text_set_icon ()" link="PopplerAnnot.html#poppler-annot-text-set-icon" since="0.16"/>
+    <keyword type="function" name="poppler_annot_text_get_is_open ()" link="PopplerAnnot.html#poppler-annot-text-get-is-open"/>
+    <keyword type="function" name="poppler_annot_text_set_is_open ()" link="PopplerAnnot.html#poppler-annot-text-set-is-open" since="0.16"/>
+    <keyword type="function" name="poppler_annot_text_get_state ()" link="PopplerAnnot.html#poppler-annot-text-get-state"/>
+    <keyword type="function" name="poppler_annot_free_text_get_callout_line ()" link="PopplerAnnot.html#poppler-annot-free-text-get-callout-line"/>
+    <keyword type="function" name="poppler_annot_free_text_get_quadding ()" link="PopplerAnnot.html#poppler-annot-free-text-get-quadding"/>
+    <keyword type="function" name="poppler_annot_file_attachment_get_attachment ()" link="PopplerAnnot.html#poppler-annot-file-attachment-get-attachment" since="0.14"/>
+    <keyword type="function" name="poppler_annot_file_attachment_get_name ()" link="PopplerAnnot.html#poppler-annot-file-attachment-get-name" since="0.14"/>
+    <keyword type="function" name="poppler_annot_screen_get_action ()" link="PopplerAnnot.html#poppler-annot-screen-get-action" since="0.14"/>
+    <keyword type="function" name="poppler_annot_movie_get_movie ()" link="PopplerAnnot.html#poppler-annot-movie-get-movie" since="0.14"/>
+    <keyword type="function" name="poppler_annot_movie_get_title ()" link="PopplerAnnot.html#poppler-annot-movie-get-title" since="0.14"/>
+    <keyword type="function" name="poppler_annot_callout_line_new ()" link="PopplerAnnot.html#poppler-annot-callout-line-new"/>
+    <keyword type="function" name="poppler_annot_callout_line_copy ()" link="PopplerAnnot.html#poppler-annot-callout-line-copy"/>
+    <keyword type="function" name="poppler_annot_callout_line_free ()" link="PopplerAnnot.html#poppler-annot-callout-line-free"/>
+    <keyword type="struct" name="PopplerLayer" link="PopplerLayer.html#PopplerLayer-struct"/>
+    <keyword type="function" name="poppler_layer_get_title ()" link="PopplerLayer.html#poppler-layer-get-title" since="0.12"/>
+    <keyword type="function" name="poppler_layer_is_visible ()" link="PopplerLayer.html#poppler-layer-is-visible" since="0.12"/>
+    <keyword type="function" name="poppler_layer_show ()" link="PopplerLayer.html#poppler-layer-show" since="0.12"/>
+    <keyword type="function" name="poppler_layer_hide ()" link="PopplerLayer.html#poppler-layer-hide" since="0.12"/>
+    <keyword type="function" name="poppler_layer_is_parent ()" link="PopplerLayer.html#poppler-layer-is-parent" since="0.12"/>
+    <keyword type="function" name="poppler_layer_get_radio_button_group_id ()" link="PopplerLayer.html#poppler-layer-get-radio-button-group-id" since="0.12"/>
+    <keyword type="struct" name="PopplerMedia" link="PopplerMedia.html#PopplerMedia-struct"/>
+    <keyword type="function" name="PopplerMediaSaveFunc ()" link="PopplerMedia.html#PopplerMediaSaveFunc" since="0.14"/>
+    <keyword type="function" name="poppler_media_get_filename ()" link="PopplerMedia.html#poppler-media-get-filename" since="0.14"/>
+    <keyword type="function" name="poppler_media_get_mime_type ()" link="PopplerMedia.html#poppler-media-get-mime-type" since="0.14"/>
+    <keyword type="function" name="poppler_media_is_embedded ()" link="PopplerMedia.html#poppler-media-is-embedded" since="0.14"/>
+    <keyword type="function" name="poppler_media_save ()" link="PopplerMedia.html#poppler-media-save" since="0.14"/>
+    <keyword type="function" name="poppler_media_save_to_callback ()" link="PopplerMedia.html#poppler-media-save-to-callback" since="0.14"/>
+    <keyword type="struct" name="PopplerMovie" link="PopplerMovie.html#PopplerMovie-struct"/>
+    <keyword type="function" name="poppler_movie_get_filename ()" link="PopplerMovie.html#poppler-movie-get-filename" since="0.14"/>
+    <keyword type="function" name="poppler_movie_need_poster ()" link="PopplerMovie.html#poppler-movie-need-poster" since="0.14"/>
+    <keyword type="function" name="poppler_movie_show_controls ()" link="PopplerMovie.html#poppler-movie-show-controls" since="0.14"/>
+    <keyword type="macro" name="POPPLER_HAS_CAIRO" link="poppler-Version-and-Features-Information.html#POPPLER-HAS-CAIRO:CAPS"/>
+    <keyword type="macro" name="POPPLER_MAJOR_VERSION" link="poppler-Version-and-Features-Information.html#POPPLER-MAJOR-VERSION:CAPS" since="0.12"/>
+    <keyword type="macro" name="POPPLER_MINOR_VERSION" link="poppler-Version-and-Features-Information.html#POPPLER-MINOR-VERSION:CAPS" since="0.12"/>
+    <keyword type="macro" name="POPPLER_MICRO_VERSION" link="poppler-Version-and-Features-Information.html#POPPLER-MICRO-VERSION:CAPS" since="0.12"/>
+    <keyword type="macro" name="POPPLER_CHECK_VERSION()" link="poppler-Version-and-Features-Information.html#POPPLER-CHECK-VERSION:CAPS" since="0.12"/>
+    <keyword type="constant" name="POPPLER_ERROR_INVALID" link="poppler-poppler.html#POPPLER-ERROR-INVALID:CAPS"/>
+    <keyword type="constant" name="POPPLER_ERROR_ENCRYPTED" link="poppler-poppler.html#POPPLER-ERROR-ENCRYPTED:CAPS"/>
+    <keyword type="constant" name="POPPLER_ERROR_OPEN_FILE" link="poppler-poppler.html#POPPLER-ERROR-OPEN-FILE:CAPS"/>
+    <keyword type="constant" name="POPPLER_ERROR_BAD_CATALOG" link="poppler-poppler.html#POPPLER-ERROR-BAD-CATALOG:CAPS"/>
+    <keyword type="constant" name="POPPLER_ERROR_DAMAGED" link="poppler-poppler.html#POPPLER-ERROR-DAMAGED:CAPS"/>
+    <keyword type="constant" name="POPPLER_PRINT_DOCUMENT" link="poppler-poppler.html#POPPLER-PRINT-DOCUMENT:CAPS"/>
+    <keyword type="constant" name="POPPLER_PRINT_MARKUP_ANNOTS" link="poppler-poppler.html#POPPLER-PRINT-MARKUP-ANNOTS:CAPS"/>
+    <keyword type="constant" name="POPPLER_PRINT_STAMP_ANNOTS_ONLY" link="poppler-poppler.html#POPPLER-PRINT-STAMP-ANNOTS-ONLY:CAPS"/>
+    <keyword type="constant" name="POPPLER_PRINT_ALL" link="poppler-poppler.html#POPPLER-PRINT-ALL:CAPS"/>
+    <keyword type="constant" name="POPPLER_PAGE_LAYOUT_UNSET" link="PopplerDocument.html#POPPLER-PAGE-LAYOUT-UNSET:CAPS"/>
+    <keyword type="constant" name="POPPLER_PAGE_LAYOUT_SINGLE_PAGE" link="PopplerDocument.html#POPPLER-PAGE-LAYOUT-SINGLE-PAGE:CAPS"/>
+    <keyword type="constant" name="POPPLER_PAGE_LAYOUT_ONE_COLUMN" link="PopplerDocument.html#POPPLER-PAGE-LAYOUT-ONE-COLUMN:CAPS"/>
+    <keyword type="constant" name="POPPLER_PAGE_LAYOUT_TWO_COLUMN_LEFT" link="PopplerDocument.html#POPPLER-PAGE-LAYOUT-TWO-COLUMN-LEFT:CAPS"/>
+    <keyword type="constant" name="POPPLER_PAGE_LAYOUT_TWO_COLUMN_RIGHT" link="PopplerDocument.html#POPPLER-PAGE-LAYOUT-TWO-COLUMN-RIGHT:CAPS"/>
+    <keyword type="constant" name="POPPLER_PAGE_LAYOUT_TWO_PAGE_LEFT" link="PopplerDocument.html#POPPLER-PAGE-LAYOUT-TWO-PAGE-LEFT:CAPS"/>
+    <keyword type="constant" name="POPPLER_PAGE_LAYOUT_TWO_PAGE_RIGHT" link="PopplerDocument.html#POPPLER-PAGE-LAYOUT-TWO-PAGE-RIGHT:CAPS"/>
+    <keyword type="constant" name="POPPLER_PAGE_MODE_UNSET" link="PopplerDocument.html#POPPLER-PAGE-MODE-UNSET:CAPS"/>
+    <keyword type="constant" name="POPPLER_PAGE_MODE_NONE" link="PopplerDocument.html#POPPLER-PAGE-MODE-NONE:CAPS"/>
+    <keyword type="constant" name="POPPLER_PAGE_MODE_USE_OUTLINES" link="PopplerDocument.html#POPPLER-PAGE-MODE-USE-OUTLINES:CAPS"/>
+    <keyword type="constant" name="POPPLER_PAGE_MODE_USE_THUMBS" link="PopplerDocument.html#POPPLER-PAGE-MODE-USE-THUMBS:CAPS"/>
+    <keyword type="constant" name="POPPLER_PAGE_MODE_FULL_SCREEN" link="PopplerDocument.html#POPPLER-PAGE-MODE-FULL-SCREEN:CAPS"/>
+    <keyword type="constant" name="POPPLER_PAGE_MODE_USE_OC" link="PopplerDocument.html#POPPLER-PAGE-MODE-USE-OC:CAPS"/>
+    <keyword type="constant" name="POPPLER_PAGE_MODE_USE_ATTACHMENTS" link="PopplerDocument.html#POPPLER-PAGE-MODE-USE-ATTACHMENTS:CAPS"/>
+    <keyword type="constant" name="POPPLER_FONT_TYPE_UNKNOWN" link="PopplerDocument.html#POPPLER-FONT-TYPE-UNKNOWN:CAPS"/>
+    <keyword type="constant" name="POPPLER_FONT_TYPE_TYPE1" link="PopplerDocument.html#POPPLER-FONT-TYPE-TYPE1:CAPS"/>
+    <keyword type="constant" name="POPPLER_FONT_TYPE_TYPE1C" link="PopplerDocument.html#POPPLER-FONT-TYPE-TYPE1C:CAPS"/>
+    <keyword type="constant" name="POPPLER_FONT_TYPE_TYPE1COT" link="PopplerDocument.html#POPPLER-FONT-TYPE-TYPE1COT:CAPS"/>
+    <keyword type="constant" name="POPPLER_FONT_TYPE_TYPE3" link="PopplerDocument.html#POPPLER-FONT-TYPE-TYPE3:CAPS"/>
+    <keyword type="constant" name="POPPLER_FONT_TYPE_TRUETYPE" link="PopplerDocument.html#POPPLER-FONT-TYPE-TRUETYPE:CAPS"/>
+    <keyword type="constant" name="POPPLER_FONT_TYPE_TRUETYPEOT" link="PopplerDocument.html#POPPLER-FONT-TYPE-TRUETYPEOT:CAPS"/>
+    <keyword type="constant" name="POPPLER_FONT_TYPE_CID_TYPE0" link="PopplerDocument.html#POPPLER-FONT-TYPE-CID-TYPE0:CAPS"/>
+    <keyword type="constant" name="POPPLER_FONT_TYPE_CID_TYPE0C" link="PopplerDocument.html#POPPLER-FONT-TYPE-CID-TYPE0C:CAPS"/>
+    <keyword type="constant" name="POPPLER_FONT_TYPE_CID_TYPE0COT" link="PopplerDocument.html#POPPLER-FONT-TYPE-CID-TYPE0COT:CAPS"/>
+    <keyword type="constant" name="POPPLER_FONT_TYPE_CID_TYPE2" link="PopplerDocument.html#POPPLER-FONT-TYPE-CID-TYPE2:CAPS"/>
+    <keyword type="constant" name="POPPLER_FONT_TYPE_CID_TYPE2OT" link="PopplerDocument.html#POPPLER-FONT-TYPE-CID-TYPE2OT:CAPS"/>
+    <keyword type="constant" name="POPPLER_VIEWER_PREFERENCES_UNSET" link="PopplerDocument.html#POPPLER-VIEWER-PREFERENCES-UNSET:CAPS"/>
+    <keyword type="constant" name="POPPLER_VIEWER_PREFERENCES_HIDE_TOOLBAR" link="PopplerDocument.html#POPPLER-VIEWER-PREFERENCES-HIDE-TOOLBAR:CAPS"/>
+    <keyword type="constant" name="POPPLER_VIEWER_PREFERENCES_HIDE_MENUBAR" link="PopplerDocument.html#POPPLER-VIEWER-PREFERENCES-HIDE-MENUBAR:CAPS"/>
+    <keyword type="constant" name="POPPLER_VIEWER_PREFERENCES_HIDE_WINDOWUI" link="PopplerDocument.html#POPPLER-VIEWER-PREFERENCES-HIDE-WINDOWUI:CAPS"/>
+    <keyword type="constant" name="POPPLER_VIEWER_PREFERENCES_FIT_WINDOW" link="PopplerDocument.html#POPPLER-VIEWER-PREFERENCES-FIT-WINDOW:CAPS"/>
+    <keyword type="constant" name="POPPLER_VIEWER_PREFERENCES_CENTER_WINDOW" link="PopplerDocument.html#POPPLER-VIEWER-PREFERENCES-CENTER-WINDOW:CAPS"/>
+    <keyword type="constant" name="POPPLER_VIEWER_PREFERENCES_DISPLAY_DOC_TITLE" link="PopplerDocument.html#POPPLER-VIEWER-PREFERENCES-DISPLAY-DOC-TITLE:CAPS"/>
+    <keyword type="constant" name="POPPLER_VIEWER_PREFERENCES_DIRECTION_RTL" link="PopplerDocument.html#POPPLER-VIEWER-PREFERENCES-DIRECTION-RTL:CAPS"/>
+    <keyword type="constant" name="POPPLER_PERMISSIONS_OK_TO_PRINT" link="PopplerDocument.html#POPPLER-PERMISSIONS-OK-TO-PRINT:CAPS"/>
+    <keyword type="constant" name="POPPLER_PERMISSIONS_OK_TO_MODIFY" link="PopplerDocument.html#POPPLER-PERMISSIONS-OK-TO-MODIFY:CAPS"/>
+    <keyword type="constant" name="POPPLER_PERMISSIONS_OK_TO_COPY" link="PopplerDocument.html#POPPLER-PERMISSIONS-OK-TO-COPY:CAPS"/>
+    <keyword type="constant" name="POPPLER_PERMISSIONS_OK_TO_ADD_NOTES" link="PopplerDocument.html#POPPLER-PERMISSIONS-OK-TO-ADD-NOTES:CAPS"/>
+    <keyword type="constant" name="POPPLER_PERMISSIONS_OK_TO_FILL_FORM" link="PopplerDocument.html#POPPLER-PERMISSIONS-OK-TO-FILL-FORM:CAPS"/>
+    <keyword type="constant" name="POPPLER_PERMISSIONS_OK_TO_EXTRACT_CONTENTS" link="PopplerDocument.html#POPPLER-PERMISSIONS-OK-TO-EXTRACT-CONTENTS:CAPS"/>
+    <keyword type="constant" name="POPPLER_PERMISSIONS_OK_TO_ASSEMBLE" link="PopplerDocument.html#POPPLER-PERMISSIONS-OK-TO-ASSEMBLE:CAPS"/>
+    <keyword type="constant" name="POPPLER_PERMISSIONS_OK_TO_PRINT_HIGH_RESOLUTION" link="PopplerDocument.html#POPPLER-PERMISSIONS-OK-TO-PRINT-HIGH-RESOLUTION:CAPS"/>
+    <keyword type="constant" name="POPPLER_PERMISSIONS_FULL" link="PopplerDocument.html#POPPLER-PERMISSIONS-FULL:CAPS"/>
+    <keyword type="constant" name="POPPLER_PAGE_TRANSITION_REPLACE" link="PopplerPage.html#POPPLER-PAGE-TRANSITION-REPLACE:CAPS"/>
+    <keyword type="constant" name="POPPLER_PAGE_TRANSITION_SPLIT" link="PopplerPage.html#POPPLER-PAGE-TRANSITION-SPLIT:CAPS"/>
+    <keyword type="constant" name="POPPLER_PAGE_TRANSITION_BLINDS" link="PopplerPage.html#POPPLER-PAGE-TRANSITION-BLINDS:CAPS"/>
+    <keyword type="constant" name="POPPLER_PAGE_TRANSITION_BOX" link="PopplerPage.html#POPPLER-PAGE-TRANSITION-BOX:CAPS"/>
+    <keyword type="constant" name="POPPLER_PAGE_TRANSITION_WIPE" link="PopplerPage.html#POPPLER-PAGE-TRANSITION-WIPE:CAPS"/>
+    <keyword type="constant" name="POPPLER_PAGE_TRANSITION_DISSOLVE" link="PopplerPage.html#POPPLER-PAGE-TRANSITION-DISSOLVE:CAPS"/>
+    <keyword type="constant" name="POPPLER_PAGE_TRANSITION_GLITTER" link="PopplerPage.html#POPPLER-PAGE-TRANSITION-GLITTER:CAPS"/>
+    <keyword type="constant" name="POPPLER_PAGE_TRANSITION_FLY" link="PopplerPage.html#POPPLER-PAGE-TRANSITION-FLY:CAPS"/>
+    <keyword type="constant" name="POPPLER_PAGE_TRANSITION_PUSH" link="PopplerPage.html#POPPLER-PAGE-TRANSITION-PUSH:CAPS"/>
+    <keyword type="constant" name="POPPLER_PAGE_TRANSITION_COVER" link="PopplerPage.html#POPPLER-PAGE-TRANSITION-COVER:CAPS"/>
+    <keyword type="constant" name="POPPLER_PAGE_TRANSITION_UNCOVER" link="PopplerPage.html#POPPLER-PAGE-TRANSITION-UNCOVER:CAPS"/>
+    <keyword type="constant" name="POPPLER_PAGE_TRANSITION_FADE" link="PopplerPage.html#POPPLER-PAGE-TRANSITION-FADE:CAPS"/>
+    <keyword type="constant" name="POPPLER_PAGE_TRANSITION_HORIZONTAL" link="PopplerPage.html#POPPLER-PAGE-TRANSITION-HORIZONTAL:CAPS"/>
+    <keyword type="constant" name="POPPLER_PAGE_TRANSITION_VERTICAL" link="PopplerPage.html#POPPLER-PAGE-TRANSITION-VERTICAL:CAPS"/>
+    <keyword type="constant" name="POPPLER_PAGE_TRANSITION_INWARD" link="PopplerPage.html#POPPLER-PAGE-TRANSITION-INWARD:CAPS"/>
+    <keyword type="constant" name="POPPLER_PAGE_TRANSITION_OUTWARD" link="PopplerPage.html#POPPLER-PAGE-TRANSITION-OUTWARD:CAPS"/>
+    <keyword type="constant" name="POPPLER_SELECTION_GLYPH" link="PopplerPage.html#POPPLER-SELECTION-GLYPH:CAPS"/>
+    <keyword type="constant" name="POPPLER_SELECTION_WORD" link="PopplerPage.html#POPPLER-SELECTION-WORD:CAPS"/>
+    <keyword type="constant" name="POPPLER_SELECTION_LINE" link="PopplerPage.html#POPPLER-SELECTION-LINE:CAPS"/>
+    <keyword type="constant" name="POPPLER_ACTION_UNKNOWN" link="poppler-PopplerAction.html#POPPLER-ACTION-UNKNOWN:CAPS"/>
+    <keyword type="constant" name="POPPLER_ACTION_NONE" link="poppler-PopplerAction.html#POPPLER-ACTION-NONE:CAPS"/>
+    <keyword type="constant" name="POPPLER_ACTION_GOTO_DEST" link="poppler-PopplerAction.html#POPPLER-ACTION-GOTO-DEST:CAPS"/>
+    <keyword type="constant" name="POPPLER_ACTION_GOTO_REMOTE" link="poppler-PopplerAction.html#POPPLER-ACTION-GOTO-REMOTE:CAPS"/>
+    <keyword type="constant" name="POPPLER_ACTION_LAUNCH" link="poppler-PopplerAction.html#POPPLER-ACTION-LAUNCH:CAPS"/>
+    <keyword type="constant" name="POPPLER_ACTION_URI" link="poppler-PopplerAction.html#POPPLER-ACTION-URI:CAPS"/>
+    <keyword type="constant" name="POPPLER_ACTION_NAMED" link="poppler-PopplerAction.html#POPPLER-ACTION-NAMED:CAPS"/>
+    <keyword type="constant" name="POPPLER_ACTION_MOVIE" link="poppler-PopplerAction.html#POPPLER-ACTION-MOVIE:CAPS"/>
+    <keyword type="constant" name="POPPLER_ACTION_RENDITION" link="poppler-PopplerAction.html#POPPLER-ACTION-RENDITION:CAPS"/>
+    <keyword type="constant" name="POPPLER_ACTION_OCG_STATE" link="poppler-PopplerAction.html#POPPLER-ACTION-OCG-STATE:CAPS"/>
+    <keyword type="constant" name="POPPLER_ACTION_JAVASCRIPT" link="poppler-PopplerAction.html#POPPLER-ACTION-JAVASCRIPT:CAPS"/>
+    <keyword type="constant" name="POPPLER_DEST_UNKNOWN" link="poppler-PopplerAction.html#POPPLER-DEST-UNKNOWN:CAPS"/>
+    <keyword type="constant" name="POPPLER_DEST_XYZ" link="poppler-PopplerAction.html#POPPLER-DEST-XYZ:CAPS"/>
+    <keyword type="constant" name="POPPLER_DEST_FIT" link="poppler-PopplerAction.html#POPPLER-DEST-FIT:CAPS"/>
+    <keyword type="constant" name="POPPLER_DEST_FITH" link="poppler-PopplerAction.html#POPPLER-DEST-FITH:CAPS"/>
+    <keyword type="constant" name="POPPLER_DEST_FITV" link="poppler-PopplerAction.html#POPPLER-DEST-FITV:CAPS"/>
+    <keyword type="constant" name="POPPLER_DEST_FITR" link="poppler-PopplerAction.html#POPPLER-DEST-FITR:CAPS"/>
+    <keyword type="constant" name="POPPLER_DEST_FITB" link="poppler-PopplerAction.html#POPPLER-DEST-FITB:CAPS"/>
+    <keyword type="constant" name="POPPLER_DEST_FITBH" link="poppler-PopplerAction.html#POPPLER-DEST-FITBH:CAPS"/>
+    <keyword type="constant" name="POPPLER_DEST_FITBV" link="poppler-PopplerAction.html#POPPLER-DEST-FITBV:CAPS"/>
+    <keyword type="constant" name="POPPLER_DEST_NAMED" link="poppler-PopplerAction.html#POPPLER-DEST-NAMED:CAPS"/>
+    <keyword type="constant" name="POPPLER_ACTION_MOVIE_PLAY" link="poppler-PopplerAction.html#POPPLER-ACTION-MOVIE-PLAY:CAPS"/>
+    <keyword type="constant" name="POPPLER_ACTION_MOVIE_PAUSE" link="poppler-PopplerAction.html#POPPLER-ACTION-MOVIE-PAUSE:CAPS"/>
+    <keyword type="constant" name="POPPLER_ACTION_MOVIE_RESUME" link="poppler-PopplerAction.html#POPPLER-ACTION-MOVIE-RESUME:CAPS"/>
+    <keyword type="constant" name="POPPLER_ACTION_MOVIE_STOP" link="poppler-PopplerAction.html#POPPLER-ACTION-MOVIE-STOP:CAPS"/>
+    <keyword type="constant" name="POPPLER_ACTION_LAYER_ON" link="poppler-PopplerAction.html#POPPLER-ACTION-LAYER-ON:CAPS"/>
+    <keyword type="constant" name="POPPLER_ACTION_LAYER_OFF" link="poppler-PopplerAction.html#POPPLER-ACTION-LAYER-OFF:CAPS"/>
+    <keyword type="constant" name="POPPLER_ACTION_LAYER_TOGGLE" link="poppler-PopplerAction.html#POPPLER-ACTION-LAYER-TOGGLE:CAPS"/>
+  </functions>
+</book>
diff --git a/glib/reference/html/right.png b/glib/reference/html/right.png
new file mode 100644 (file)
index 0000000..ed55207
Binary files /dev/null and b/glib/reference/html/right.png differ
diff --git a/glib/reference/html/style.css b/glib/reference/html/style.css
new file mode 100644 (file)
index 0000000..d6f6c26
--- /dev/null
@@ -0,0 +1,266 @@
+.synopsis, .classsynopsis
+{
+  /* tango:aluminium 1/2 */
+  background: #eeeeec;
+  border: solid 1px #d3d7cf;
+  padding: 0.5em;
+}
+.programlisting
+{
+  /* tango:sky blue 0/1 */
+  background: #e6f3ff;
+  border: solid 1px #729fcf;
+  padding: 0.5em;
+}
+.variablelist
+{
+  padding: 4px;
+  margin-left: 3em;
+}
+.variablelist td:first-child
+{
+  vertical-align: top;
+}
+
+@media screen {
+  sup a.footnote
+  {
+    position: relative;
+    top: 0em ! important;
+    
+  }
+  /* this is needed so that the local anchors are displayed below the naviagtion */
+  div.footnote a[name], div.refnamediv a[name], div.refsect1 a[name], div.refsect2 a[name], div.index a[name], div.glossary a[name], div.sect1 a[name]
+  {
+    display: inline-block;
+    position: relative;
+    top:-5em;
+  }
+  /* this seems to be a bug in the xsl style sheets when generating indexes */
+  div.index div.index
+  {
+    top: 0em;
+  }
+  /* make space for the fixed navigation bar and add space at the bottom so that
+   * link targets appear somewhat close to top
+   */
+  body
+  {
+    padding-top: 3.2em;
+    padding-bottom: 20em;
+  }
+  /* style and size the navigation bar */
+  table.navigation#top
+  {
+    position: fixed;
+    /* tango:scarlet red 0/1 */
+    background: #ffe6e6;
+    border: solid 1px #ef2929;
+    margin-top: 0;
+    margin-bottom: 0;
+    top: 0;
+    left: 0;
+    height: 3em;
+    z-index: 10;
+  }
+  .navigation a, .navigation a:visited
+  {
+    /* tango:scarlet red 3 */
+    color: #a40000;
+  }
+  .navigation a:hover
+  {
+    /* tango:scarlet red 1 */
+    color: #ef2929;
+  }
+  td.shortcuts
+  {
+    /* tango:scarlet red 1 */
+    color: #ef2929;
+    font-size: 80%;
+    white-space: nowrap;
+  }
+}
+@media print {
+  table.navigation {
+    visibility: collapse;
+    display: none;
+  }
+  div.titlepage table.navigation {
+    visibility: visible;
+    display: table;
+    /* tango:scarlet red 0/1 */
+    background: #ffe6e6;
+    border: solid 1px #ef2929;
+    margin-top: 0;
+    margin-bottom: 0;
+    top: 0;
+    left: 0;
+    height: 3em;
+  }
+}
+
+.navigation .title
+{
+  font-size: 200%;
+}
+
+div.gallery-float
+{
+  float: left;
+  padding: 10px;
+}
+div.gallery-float img
+{
+  border-style: none;
+}
+div.gallery-spacer
+{
+  clear: both;
+}
+
+a, a:visited
+{
+  text-decoration: none;
+  /* tango:sky blue 2 */
+  color: #3465a4;
+}
+a:hover
+{
+  text-decoration: underline;
+  /* tango:sky blue 1 */
+  color: #729fcf;
+}
+
+div.table table
+{
+  border-collapse: collapse;
+  border-spacing: 0px;
+  /* tango:aluminium 3 */
+  border: solid 1px #babdb6;
+}
+
+div.table table td, div.table table th
+{
+  /* tango:aluminium 3 */
+  border: solid 1px #babdb6;
+  padding: 3px;
+  vertical-align: top;
+}
+
+div.table table th
+{
+  /* tango:aluminium 2 */
+  background-color: #d3d7cf;
+}
+
+hr
+{
+  /* tango:aluminium 3 */
+  color: #babdb6;
+  background: #babdb6;
+  border: none 0px;
+  height: 1px;
+  clear: both;
+}
+
+.footer
+{
+  padding-top: 3.5em;
+  /* tango:aluminium 3 */
+  color: #babdb6;
+  text-align: center;
+  font-size: 80%;
+}
+
+.warning
+{
+  /* tango:orange 0/1 */
+  background: #ffeed9;
+  border-color: #ffb04f;
+}
+.note
+{
+  /* tango:chameleon 0/0.5 */
+  background: #d8ffb2;
+  border-color: #abf562;
+}
+.note, .warning
+{
+  padding: 0.5em;
+  border-width: 1px;
+  border-style: solid;
+}
+.note h3, .warning h3
+{
+  margin-top: 0.0em
+}
+.note p, .warning p
+{
+  margin-bottom: 0.0em
+}
+
+/* blob links */
+h2 .extralinks, h3 .extralinks
+{
+  float: right;
+  /* tango:aluminium 3 */
+  color: #babdb6;
+  font-size: 80%;
+  font-weight: normal;
+}
+
+.annotation
+{
+  /* tango:aluminium 5 */
+  color: #555753;
+  font-size: 80%;
+  font-weight: normal;
+}
+
+/* code listings */
+
+.listing_code .programlisting .cbracket   { color: #a40000; } /* tango: scarlet red 3 */
+.listing_code .programlisting .comment    { color: #a1a39d; } /* tango: aluminium 4 */
+.listing_code .programlisting .function   { color: #000000; font-weight: bold; }
+.listing_code .programlisting .function a { color: #11326b; font-weight: bold; } /* tango: sky blue 4 */
+.listing_code .programlisting .keyword    { color: #4e9a06; } /* tango: chameleon 3  */
+.listing_code .programlisting .linenum    { color: #babdb6; } /* tango: aluminium 3 */
+.listing_code .programlisting .normal     { color: #000000; }
+.listing_code .programlisting .number     { color: #75507b; } /* tango: plum 2 */
+.listing_code .programlisting .preproc    { color: #204a87; } /* tango: sky blue 3  */
+.listing_code .programlisting .string     { color: #c17d11; } /* tango: chocolate 2 */
+.listing_code .programlisting .type       { color: #000000; }
+.listing_code .programlisting .type a     { color: #11326b; } /* tango: sky blue 4 */
+.listing_code .programlisting .symbol     { color: #ce5c00; } /* tango: orange 3 */
+
+.listing_frame {
+  /* tango:sky blue 1 */
+  border: solid 1px #729fcf;
+  padding: 0px;
+}
+
+.listing_lines, .listing_code {
+  margin-top: 0px;
+  margin-bottom: 0px;
+  padding: 0.5em;
+}
+.listing_lines {
+  /* tango:sky blue 0.5 */
+  background: #a6c5e3;
+  /* tango:aluminium 6 */
+  color: #2e3436;
+}
+.listing_code {
+  /* tango:sky blue 0 */
+  background: #e6f3ff;
+}
+.listing_code .programlisting {
+  /* override from previous */
+  border: none 0px;
+  padding: 0px;
+}
+.listing_lines pre, .listing_code pre {
+  margin: 0px;
+}
+
diff --git a/glib/reference/html/up.png b/glib/reference/html/up.png
new file mode 100644 (file)
index 0000000..8eb591f
Binary files /dev/null and b/glib/reference/html/up.png differ
diff --git a/glib/reference/poppler-docs.sgml b/glib/reference/poppler-docs.sgml
new file mode 100644 (file)
index 0000000..d15bd18
--- /dev/null
@@ -0,0 +1,59 @@
+<?xml version="1.0"?>
+<!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook XML V4.1.2//EN" 
+               "http://www.oasis-open.org/docbook/xml/4.1.2/docbookx.dtd" [
+<!ENTITY version SYSTEM "version.xml">
+]>
+<book id="index" xmlns:xi="http://www.w3.org/2003/XInclude">
+  <bookinfo>
+    <title>Poppler Reference Manual</title>
+    <releaseinfo>
+      for Poppler &version;
+    </releaseinfo>
+  </bookinfo>
+
+  <chapter>
+    <title>Poppler</title>
+    <xi:include href="xml/poppler.xml"/>
+    <xi:include href="xml/poppler-document.xml"/>
+    <xi:include href="xml/poppler-page.xml"/>
+    <xi:include href="xml/poppler-action.xml"/>
+    <xi:include href="xml/poppler-attachment.xml"/>
+    <xi:include href="xml/poppler-form-field.xml"/>
+    <xi:include href="xml/poppler-annot.xml"/>
+    <xi:include href="xml/poppler-layer.xml"/>
+    <xi:include href="xml/poppler-media.xml"/>
+    <xi:include href="xml/poppler-movie.xml"/>
+    <xi:include href="xml/poppler-features.xml"/>
+  </chapter>
+
+  <index id="api-index-full">
+    <title>Index of all symbols</title>
+    <xi:include href="xml/api-index-full.xml"><xi:fallback /></xi:include>
+  </index>
+  <index id="api-index-deprecated" role="deprecated">
+    <title>Index of deprecated symbols</title>
+    <xi:include href="xml/api-index-deprecated.xml"><xi:fallback /></xi:include>
+  </index>
+  <index id="api-index-0-12">
+    <title>Index of new symbols in 0.12</title>
+    <xi:include href="xml/api-index-0.12.xml"><xi:fallback /></xi:include>
+  </index>
+  <index id="api-index-0-14">
+    <title>Index of new symbols in 0.14</title>
+    <xi:include href="xml/api-index-0.14.xml"><xi:fallback /></xi:include>
+  </index>
+  <index id="api-index-0-16">
+    <title>Index of new symbols in 0.16</title>
+    <xi:include href="xml/api-index-0.16.xml"><xi:fallback /></xi:include>
+  </index>
+  <index id="api-index-0-18">
+    <title>Index of new symbols in 0.18</title>
+    <xi:include href="xml/api-index-0.18.xml"><xi:fallback /></xi:include>
+  </index>
+  <index id="api-index-0-20">
+    <title>Index of new symbols in 0.20</title>
+    <xi:include href="xml/api-index-0.20.xml"><xi:fallback /></xi:include>
+  </index>
+
+  <xi:include href="xml/annotation-glossary.xml"><xi:fallback /></xi:include>
+</book>
diff --git a/glib/reference/poppler-overrides.txt b/glib/reference/poppler-overrides.txt
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/glib/reference/poppler-sections.txt b/glib/reference/poppler-sections.txt
new file mode 100644 (file)
index 0000000..5a6708b
--- /dev/null
@@ -0,0 +1,539 @@
+<INCLUDE>poppler.h</INCLUDE>
+
+<SECTION>
+<FILE>poppler-page</FILE>
+<TITLE>PopplerPage</TITLE>
+PopplerPage
+PopplerRectangle
+PopplerPageTransition
+PopplerLinkMapping
+PopplerImageMapping
+PopplerFormFieldMapping
+PopplerAnnotMapping
+PopplerPageTransitionType
+PopplerPageTransitionAlignment
+PopplerPageTransitionDirection
+PopplerSelectionStyle
+PopplerTextAttributes
+poppler_page_get_index
+poppler_page_get_label
+poppler_page_get_size
+poppler_page_get_crop_box
+poppler_page_get_duration
+poppler_page_get_transition
+poppler_page_get_thumbnail_size
+poppler_page_get_thumbnail
+poppler_page_render
+poppler_page_render_for_printing
+poppler_page_render_for_printing_with_options
+poppler_page_render_to_ps
+poppler_page_render_selection
+poppler_page_get_selected_region
+poppler_page_get_selection_region
+poppler_page_selection_region_free
+poppler_page_get_selected_text
+poppler_page_find_text
+poppler_page_get_text
+poppler_page_get_text_layout
+poppler_page_get_text_attributes
+poppler_page_free_text_attributes
+poppler_page_get_link_mapping
+poppler_page_free_link_mapping
+poppler_page_get_image_mapping
+poppler_page_get_image
+poppler_page_free_image_mapping
+poppler_page_get_form_field_mapping
+poppler_page_free_form_field_mapping
+poppler_page_get_annot_mapping
+poppler_page_free_annot_mapping
+poppler_page_add_annot
+poppler_rectangle_new
+poppler_rectangle_copy
+poppler_rectangle_free
+poppler_page_transition_new
+poppler_page_transition_copy
+poppler_page_transition_free
+poppler_link_mapping_new
+poppler_link_mapping_copy
+poppler_link_mapping_free
+poppler_image_mapping_new
+poppler_image_mapping_copy
+poppler_image_mapping_free
+poppler_form_field_mapping_new
+poppler_form_field_mapping_copy
+poppler_form_field_mapping_free
+poppler_annot_mapping_new
+poppler_annot_mapping_copy
+poppler_annot_mapping_free
+poppler_text_attributes_new
+poppler_text_attributes_copy
+poppler_text_attributes_free
+
+<SUBSECTION Standard>
+POPPLER_PAGE
+POPPLER_IS_PAGE
+POPPLER_TYPE_PAGE
+POPPLER_TYPE_RECTANGLE
+POPPLER_TYPE_TEXT_ATTRIBUTES
+POPPLER_TYPE_PAGE_TRANSITION
+POPPLER_TYPE_LINK_MAPPING
+POPPLER_TYPE_IMAGE_MAPPING
+POPPLER_TYPE_FORM_FIELD_MAPPING
+POPPLER_TYPE_ANNOT_MAPPING
+POPPLER_TYPE_PAGE_TRANSITION_ALIGNMENT
+POPPLER_TYPE_PAGE_TRANSITION_DIRECTION
+POPPLER_TYPE_PAGE_TRANSITION_TYPE
+POPPLER_TYPE_SELECTION_STYLE
+<SUBSECTION Private>
+poppler_page_get_type
+poppler_rectangle_get_type
+poppler_page_transition_get_type
+poppler_link_mapping_get_type
+poppler_image_mapping_get_type
+poppler_form_field_mapping_get_type
+poppler_annot_mapping_get_type
+poppler_page_transition_alignment_get_type
+poppler_page_transition_direction_get_type
+poppler_page_transition_type_get_type
+poppler_selection_style_get_type
+poppler_text_attributes_get_type
+</SECTION>
+
+<SECTION>
+<FILE>poppler-document</FILE>
+<TITLE>PopplerDocument</TITLE>
+PopplerDocument
+PopplerIndexIter
+PopplerFontsIter
+PopplerLayersIter
+PopplerPageLayout
+PopplerPageMode
+PopplerFontInfo
+PopplerFontType
+PopplerPSFile
+PopplerViewerPreferences
+PopplerPermissions
+poppler_document_new_from_file
+poppler_document_new_from_data
+poppler_document_save
+poppler_document_save_a_copy
+poppler_document_get_id
+poppler_document_get_pdf_version_string
+poppler_document_get_pdf_version
+poppler_document_get_title
+poppler_document_get_author
+poppler_document_get_subject
+poppler_document_get_keywords
+poppler_document_get_creator
+poppler_document_get_producer
+poppler_document_get_creation_date
+poppler_document_get_modification_date
+poppler_document_get_page_layout
+poppler_document_get_page_mode
+poppler_document_get_permissions
+poppler_document_get_metadata
+poppler_document_is_linearized
+poppler_document_get_n_pages
+poppler_document_get_page
+poppler_document_get_page_by_label
+poppler_document_find_dest
+poppler_document_get_n_attachments
+poppler_document_has_attachments
+poppler_document_get_attachments
+poppler_document_get_form_field
+poppler_index_iter_new
+poppler_index_iter_copy
+poppler_index_iter_free
+poppler_index_iter_get_child
+poppler_index_iter_is_open
+poppler_index_iter_get_action
+poppler_index_iter_next
+poppler_font_info_new
+poppler_font_info_scan
+poppler_font_info_free
+poppler_fonts_iter_copy
+poppler_fonts_iter_free
+poppler_fonts_iter_get_name
+poppler_fonts_iter_get_full_name
+poppler_fonts_iter_get_font_type
+poppler_fonts_iter_get_substitute_name
+poppler_fonts_iter_get_file_name
+poppler_fonts_iter_get_encoding
+poppler_fonts_iter_is_embedded
+poppler_fonts_iter_is_subset
+poppler_fonts_iter_next
+poppler_layers_iter_new
+poppler_layers_iter_copy
+poppler_layers_iter_free
+poppler_layers_iter_get_child
+poppler_layers_iter_get_layer
+poppler_layers_iter_get_title
+poppler_layers_iter_next
+poppler_ps_file_new
+poppler_ps_file_free
+poppler_ps_file_set_paper_size
+poppler_ps_file_set_duplex
+
+<SUBSECTION Standard>
+POPPLER_DOCUMENT
+POPPLER_IS_DOCUMENT
+POPPLER_TYPE_DOCUMENT
+POPPLER_FONT_INFO
+POPPLER_IS_FONT_INFO
+POPPLER_TYPE_FONT_INFO
+POPPLER_TYPE_FONTS_ITER
+POPPLER_TYPE_INDEX_ITER
+POPPLER_TYPE_LAYER
+POPPLER_TYPE_LAYERS_ITER
+POPPLER_PS_FILE
+POPPLER_IS_PS_FILE
+POPPLER_TYPE_PS_FILE
+POPPLER_TYPE_FONT_TYPE
+POPPLER_TYPE_PAGE_LAYOUT
+POPPLER_TYPE_PAGE_MODE
+POPPLER_TYPE_PERMISSIONS
+POPPLER_TYPE_VIEWER_PREFERENCES
+
+<SUBSECTION Private>
+poppler_document_get_type
+poppler_index_iter_get_type
+poppler_font_info_get_type
+poppler_fonts_iter_get_type
+poppler_layers_iter_get_type
+poppler_ps_file_get_type
+poppler_font_type_get_type
+poppler_page_layout_get_type
+poppler_page_mode_get_type
+poppler_permissions_get_type
+poppler_viewer_preferences_get_type
+</SECTION>
+
+<SECTION>
+<FILE>poppler-action</FILE>
+<TITLE>PopplerAction</TITLE>
+PopplerAction
+PopplerDest
+PopplerActionAny
+PopplerActionGotoDest
+PopplerActionGotoRemote
+PopplerActionLaunch
+PopplerActionUri
+PopplerActionNamed
+PopplerActionMovie
+PopplerActionRendition
+PopplerActionOCGState
+PopplerActionJavascript
+PopplerActionType
+PopplerDestType
+PopplerActionMovieOperation
+PopplerActionLayer
+PopplerActionLayerAction
+poppler_action_copy
+poppler_action_free
+poppler_dest_copy
+poppler_dest_free
+
+<SUBSECTION Standard>
+POPPLER_ACTION
+POPPLER_TYPE_ACTION
+POPPLER_TYPE_ACTION_TYPE
+POPPLER_TYPE_DEST
+POPPLER_TYPE_DEST_TYPE
+POPPLER_TYPE_ACTION_LAYER_ACTION
+POPPLER_TYPE_ACTION_MOVIE_OPERATION
+
+
+<SUBSECTION Private>
+poppler_action_get_type
+poppler_dest_get_type
+poppler_action_type_get_type
+poppler_dest_type_get_type
+poppler_action_layer_action_get_type
+poppler_action_movie_operation_get_type
+</SECTION>
+
+<SECTION>
+<FILE>poppler-attachment</FILE>
+<TITLE>PopplerAttachment</TITLE>
+PopplerAttachment
+PopplerAttachmentSaveFunc
+poppler_attachment_save
+poppler_attachment_save_to_callback
+
+<SUBSECTION Standard>
+POPPLER_ATTACHMENT
+POPPLER_IS_ATTACHMENT
+POPPLER_TYPE_ATTACHMENT
+
+<SUBSECTION Private>
+poppler_attachment_get_type
+</SECTION>
+
+<SECTION>
+<FILE>poppler-form-field</FILE>
+<TITLE>PopplerFormField</TITLE>
+PopplerFormField
+PopplerFormFieldType
+PopplerFormButtonType
+PopplerFormChoiceType
+PopplerFormTextType
+poppler_form_field_get_field_type
+poppler_form_field_get_id
+poppler_form_field_is_read_only
+poppler_form_field_get_font_size
+poppler_form_field_get_partial_name
+poppler_form_field_get_mapping_name
+poppler_form_field_get_name
+poppler_form_field_get_action
+poppler_form_field_button_get_button_type
+poppler_form_field_button_get_state
+poppler_form_field_button_set_state
+poppler_form_field_choice_get_choice_type
+poppler_form_field_choice_can_select_multiple
+poppler_form_field_choice_commit_on_change
+poppler_form_field_choice_do_spell_check
+poppler_form_field_choice_get_item
+poppler_form_field_choice_get_n_items
+poppler_form_field_choice_get_text
+poppler_form_field_choice_set_text
+poppler_form_field_choice_is_editable
+poppler_form_field_choice_is_item_selected
+poppler_form_field_choice_select_item
+poppler_form_field_choice_toggle_item
+poppler_form_field_choice_unselect_all
+poppler_form_field_text_get_text_type
+poppler_form_field_text_get_text
+poppler_form_field_text_set_text
+poppler_form_field_text_get_max_len
+poppler_form_field_text_do_scroll
+poppler_form_field_text_do_spell_check
+poppler_form_field_text_is_password
+poppler_form_field_text_is_rich_text
+
+<SUBSECTION Standard>
+POPPLER_FORM_FIELD
+POPPLER_IS_FORM_FIELD
+POPPLER_TYPE_FORM_FIELD
+POPPLER_TYPE_FORM_BUTTON_TYPE
+POPPLER_TYPE_FORM_CHOICE_TYPE
+POPPLER_TYPE_FORM_FIELD_TYPE
+POPPLER_TYPE_FORM_TEXT_TYPE
+
+<SUBSECTION Private>
+poppler_form_field_get_type
+poppler_form_field_type_get_type
+poppler_form_button_type_get_type
+poppler_form_choice_type_get_type
+poppler_form_text_type_get_type
+</SECTION>
+
+<SECTION>
+<FILE>poppler</FILE>
+POPPLER_ERROR
+PopplerError
+PopplerOrientation
+PopplerBackend
+PopplerColor
+PopplerPrintFlags
+poppler_get_backend
+poppler_get_version
+poppler_date_parse
+poppler_color_new
+poppler_color_copy
+poppler_color_free
+
+<SUBSECTION Standard>
+POPPLER_TYPE_COLOR
+POPPLER_TYPE_BACKEND
+POPPLER_TYPE_ERROR
+POPPLER_TYPE_ORIENTATION
+POPPLER_TYPE_PRINT_FLAGS
+
+<SUBSECTION Private>
+POPPLER_DEFINE_BOXED_TYPE
+poppler_error_get_type
+poppler_error_quark
+poppler_backend_get_type
+poppler_color_get_type
+poppler_orientation_get_type
+poppler_print_flags_get_type
+</SECTION>
+
+<SECTION>
+<FILE>poppler-annot</FILE>
+<TITLE>PopplerAnnot</TITLE>
+PopplerAnnot
+PopplerAnnotMarkup
+PopplerAnnotText
+PopplerAnnotFreeText
+PopplerAnnotFileAttachment
+PopplerAnnotMovie
+PopplerAnnotScreen
+PopplerAnnotType
+PopplerAnnotFlag
+PopplerAnnotExternalDataType
+PopplerAnnotMarkupReplyType
+PopplerAnnotTextState
+PopplerAnnotCalloutLine
+PopplerAnnotFreeTextQuadding
+poppler_annot_get_annot_type
+poppler_annot_get_flags
+poppler_annot_get_name
+poppler_annot_get_page_index
+poppler_annot_get_color
+poppler_annot_set_color
+poppler_annot_get_contents
+poppler_annot_set_contents
+poppler_annot_get_modified
+poppler_annot_markup_get_label
+poppler_annot_markup_set_label
+poppler_annot_markup_get_subject
+poppler_annot_markup_get_opacity
+poppler_annot_markup_set_opacity
+poppler_annot_markup_has_popup
+poppler_annot_markup_set_popup
+poppler_annot_markup_get_popup_is_open
+poppler_annot_markup_set_popup_is_open
+poppler_annot_markup_get_popup_rectangle
+poppler_annot_markup_get_date
+poppler_annot_markup_get_external_data
+poppler_annot_markup_get_reply_to
+poppler_annot_text_new
+poppler_annot_text_get_icon
+POPPLER_ANNOT_TEXT_ICON_NOTE
+POPPLER_ANNOT_TEXT_ICON_COMMENT
+POPPLER_ANNOT_TEXT_ICON_KEY
+POPPLER_ANNOT_TEXT_ICON_HELP
+POPPLER_ANNOT_TEXT_ICON_NEW_PARAGRAPH
+POPPLER_ANNOT_TEXT_ICON_PARAGRAPH
+POPPLER_ANNOT_TEXT_ICON_INSERT
+POPPLER_ANNOT_TEXT_ICON_CROSS
+POPPLER_ANNOT_TEXT_ICON_CIRCLE
+poppler_annot_text_set_icon
+poppler_annot_text_get_is_open
+poppler_annot_text_set_is_open
+poppler_annot_text_get_state
+poppler_annot_free_text_get_callout_line
+poppler_annot_free_text_get_quadding
+poppler_annot_file_attachment_get_attachment
+poppler_annot_file_attachment_get_name
+poppler_annot_screen_get_action
+poppler_annot_movie_get_movie
+poppler_annot_movie_get_title
+poppler_annot_callout_line_new
+poppler_annot_callout_line_copy
+poppler_annot_callout_line_free
+
+<SUBSECTION Standard>
+POPPLER_ANNOT
+POPPLER_IS_ANNOT
+POPPLER_TYPE_ANNOT
+POPPLER_ANNOT_FILE_ATTACHMENT
+POPPLER_IS_ANNOT_FILE_ATTACHMENT
+POPPLER_TYPE_ANNOT_FILE_ATTACHMENT
+POPPLER_ANNOT_FREE_TEXT
+POPPLER_IS_ANNOT_FREE_TEXT
+POPPLER_TYPE_ANNOT_FREE_TEXT
+POPPLER_ANNOT_MARKUP
+POPPLER_IS_ANNOT_MARKUP
+POPPLER_TYPE_ANNOT_MARKUP
+POPPLER_ANNOT_MOVIE
+POPPLER_IS_ANNOT_MOVIE
+POPPLER_TYPE_ANNOT_MOVIE
+POPPLER_ANNOT_SCREEN
+POPPLER_IS_ANNOT_SCREEN
+POPPLER_TYPE_ANNOT_SCREEN
+POPPLER_ANNOT_TEXT
+POPPLER_IS_ANNOT_TEXT
+POPPLER_TYPE_ANNOT_TEXT
+POPPLER_TYPE_ANNOT_CALLOUT_LINE
+POPPLER_TYPE_ANNOT_EXTERNAL_DATA_TYPE
+POPPLER_TYPE_ANNOT_FLAG
+POPPLER_TYPE_ANNOT_MARKUP_REPLY_TYPE
+POPPLER_TYPE_ANNOT_TEXT_STATE
+POPPLER_TYPE_ANNOT_FREE_TEXT_QUADDING
+POPPLER_TYPE_ANNOT_TYPE
+
+<SUBSECTION Private>
+poppler_annot_get_type
+poppler_annot_type_get_type
+poppler_annot_markup_get_type
+poppler_annot_text_get_type
+poppler_annot_free_text_get_type
+poppler_annot_file_attachment_get_type
+poppler_annot_screen_get_type
+poppler_annot_movie_get_type
+poppler_annot_flag_get_type
+poppler_annot_external_data_type_get_type
+poppler_annot_markup_reply_type_get_type
+poppler_annot_callout_line_get_type
+poppler_annot_text_state_get_type
+poppler_annot_free_text_quadding_get_type
+</SECTION>
+
+<SECTION>
+<FILE>poppler-layer</FILE>
+<TITLE>PopplerLayer</TITLE>
+PopplerLayer
+poppler_layer_get_title
+poppler_layer_is_visible
+poppler_layer_show
+poppler_layer_hide
+poppler_layer_is_parent
+poppler_layer_get_radio_button_group_id
+
+<SUBSECTION Standard>
+POPPLER_LAYER
+POPPLER_IS_LAYER
+POPPLER_TYPE_LAYER
+
+<SUBSECTION Private>
+Layer
+poppler_layer_get_type
+</SECTION>
+
+<SECTION>
+<FILE>poppler-media</FILE>
+<TITLE>PopplerMedia</TITLE>
+PopplerMedia
+PopplerMediaSaveFunc
+poppler_media_get_filename
+poppler_media_get_mime_type
+poppler_media_is_embedded
+poppler_media_save
+poppler_media_save_to_callback
+
+<SUBSECTION Standard>
+POPPLER_MEDIA
+POPPLER_IS_MEDIA
+POPPLER_TYPE_MEDIA
+
+<SUBSECTION Private>
+poppler_media_get_type
+</SECTION>
+
+<SECTION>
+<FILE>poppler-movie</FILE>
+<TITLE>PopplerMovie</TITLE>
+PopplerMovie
+poppler_movie_get_filename
+poppler_movie_need_poster
+poppler_movie_show_controls
+
+<SUBSECTION Standard>
+POPPLER_MOVIE
+POPPLER_IS_MOVIE
+POPPLER_TYPE_MOVIE
+<SUBSECTION Private>
+poppler_movie_get_type
+
+</SECTION>
+
+<SECTION>
+<FILE>poppler-features</FILE>
+POPPLER_HAS_CAIRO
+POPPLER_MAJOR_VERSION
+POPPLER_MINOR_VERSION
+POPPLER_MICRO_VERSION
+POPPLER_CHECK_VERSION
+</SECTION>
diff --git a/glib/reference/poppler.types b/glib/reference/poppler.types
new file mode 100644 (file)
index 0000000..eed9849
--- /dev/null
@@ -0,0 +1,10 @@
+#include <poppler.h>
+
+poppler_document_get_type
+poppler_page_get_type
+poppler_attachment_get_type
+poppler_form_field_get_type
+poppler_annot_get_type
+poppler_layer_get_type
+poppler_media_get_type
+poppler_movie_get_type
diff --git a/glib/reference/version.xml b/glib/reference/version.xml
new file mode 100644 (file)
index 0000000..6dd4602
--- /dev/null
@@ -0,0 +1 @@
+0.20.4
diff --git a/glib/reference/version.xml.in b/glib/reference/version.xml.in
new file mode 100644 (file)
index 0000000..9b6e99e
--- /dev/null
@@ -0,0 +1 @@
+@POPPLER_VERSION@
diff --git a/goo/FixedPoint.cc b/goo/FixedPoint.cc
new file mode 100644 (file)
index 0000000..26b2f0f
--- /dev/null
@@ -0,0 +1,135 @@
+//========================================================================
+//
+// FixedPoint.cc
+//
+// Fixed point type, with C++ operators.
+//
+// Copyright 2004 Glyph & Cog, LLC
+//
+//========================================================================
+
+#include <config.h>
+
+#if USE_FIXEDPOINT
+
+#ifdef USE_GCC_PRAGMAS
+#pragma implementation
+#endif
+
+#include "FixedPoint.h"
+
+#define ln2 ((FixedPoint)0.69314718)
+
+#define ln2 ((FixedPoint)0.69314718)
+
+FixedPoint FixedPoint::sqrt(FixedPoint x) {
+  FixedPoint y0, y1, z;
+
+  if (x.val <= 0) {
+    y1.val = 0;
+  } else {
+    y1.val = x.val == 1 ? 2 : x.val >> 1;
+    do {
+      y0.val = y1.val;
+      z = x / y0;
+      y1.val = (y0.val + z.val) >> 1;
+    } while (::abs(y0.val - y1.val) > 1);
+  }
+  return y1;
+}
+
+FixedPoint FixedPoint::pow(FixedPoint x, FixedPoint y) {
+  FixedPoint t, t2, lnx0, lnx, z0, z;
+  int d, n, i;
+
+  if (y.val <= 0) {
+    z.val = 0;
+  } else {
+    // y * ln(x)
+    t = (x - 1) / (x + 1);
+    t2 = t * t;
+    d = 1;
+    lnx = 0;
+    do {
+      lnx0 = lnx;
+      lnx += t / d;
+      t *= t2;
+      d += 2;
+    } while (::abs(lnx.val - lnx0.val) > 2);
+    lnx.val <<= 1;
+    t = y * lnx;
+    // exp(y * ln(x))
+    n = floor(t / ln2);
+    t -= ln2 * n;
+    t2 = t;
+    d = 1;
+    i = 1;
+    z = 1;
+    do {
+      z0 = z;
+      z += t2 / d;
+      t2 *= t;
+      ++i;
+      d *= i;
+    } while (::abs(z.val - z0.val) > 2 && d < (1 << fixptShift));
+    if (n >= 0) {
+      z.val <<= n;
+    } else if (n < 0) {
+      z.val >>= -n;
+    }
+  }
+  return z;
+}
+
+int FixedPoint::mul(int x, int y) {
+  FixPtInt64 z;
+
+  z = ((FixPtInt64)x * y) >> fixptShift;
+  if (z > 0x7fffffffLL) {
+    return 0x7fffffff;
+  } else if (z < -0x80000000LL) {
+    return 0x80000000;
+  } else {
+    return (int)z;
+  }
+}
+
+int FixedPoint::div(int x, int y) {
+  FixPtInt64 z;
+
+  z = ((FixPtInt64)x << fixptShift) / y;
+  if (z > 0x7fffffffLL) {
+    return 0x7fffffff;
+  } else if (z < -0x80000000LL) {
+    return 0x80000000;
+  } else {
+    return (int)z;
+  }
+}
+
+GBool FixedPoint::divCheck(FixedPoint x, FixedPoint y, FixedPoint *result) {
+  FixPtInt64 z;
+
+  z = ((FixPtInt64)x.val << fixptShift) / y.val;
+  if ((z == 0 && x != 0) ||
+      z >= ((FixPtInt64)1 << 31) || z < -((FixPtInt64)1 << 31)) {
+    return gFalse;
+  }
+  result->val = z;
+  return gTrue;
+}
+
+GBool FixedPoint::checkDet(FixedPoint m11, FixedPoint m12,
+                          FixedPoint m21, FixedPoint m22,
+                          FixedPoint epsilon) {
+  FixPtInt64 det, e;
+
+  det = (FixPtInt64)m11.val * (FixPtInt64)m22.val
+        - (FixPtInt64)m12.val * (FixPtInt64)m21.val;
+  e = (FixPtInt64)epsilon.val << fixptShift;
+  // NB: this comparison has to be >= not > because epsilon can be
+  // truncated to zero as a fixed point value.
+  return det >= e || det <= -e;
+}
+
+#endif // USE_FIXEDPOINT
diff --git a/goo/FixedPoint.h b/goo/FixedPoint.h
new file mode 100644 (file)
index 0000000..9974980
--- /dev/null
@@ -0,0 +1,166 @@
+//========================================================================
+//
+// FixedPoint.h
+//
+// Fixed point type, with C++ operators.
+//
+// Copyright 2004 Glyph & Cog, LLC
+//
+//========================================================================
+
+#ifndef FIXEDPOINT_H
+#define FIXEDPOINT_H
+
+#include "poppler-config.h"
+
+#if USE_FIXEDPOINT
+
+#ifdef USE_GCC_PRAGMAS
+#pragma interface
+#endif
+
+#include <stdio.h>
+#include <stdlib.h>
+#include "gtypes.h"
+
+#define fixptShift 16
+#define fixptMaskL ((1 << fixptShift) - 1)
+#define fixptMaskH (~fixptMaskL)
+
+typedef long long FixPtInt64;
+
+class FixedPoint {
+public:
+
+  FixedPoint() { val = 0; }
+  FixedPoint(const FixedPoint &x) { val = x.val; }
+  FixedPoint(double x) { val = (int)(x * (1 << fixptShift) + 0.5); }
+  FixedPoint(int x) { val = x << fixptShift; }
+  FixedPoint(long x) { val = x << fixptShift; }
+
+  operator float()
+    { return (float) val * ((float)1 / (float)(1 << fixptShift)); }
+  operator double()
+    { return (double) val * (1.0 / (double)(1 << fixptShift)); }
+  operator int()
+    { return val >> fixptShift; }
+
+  int get16Dot16() { return val; }
+
+  FixedPoint operator =(FixedPoint x) { val = x.val; return *this; }
+
+  int operator ==(FixedPoint x) { return val == x.val; }
+  int operator ==(double x) { return *this == (FixedPoint)x; }
+  int operator ==(int x) { return *this == (FixedPoint)x; }
+  int operator ==(long x) { return *this == (FixedPoint)x; }
+
+  int operator !=(FixedPoint x) { return val != x.val; }
+  int operator !=(double x) { return *this != (FixedPoint)x; }
+  int operator !=(int x) { return *this != (FixedPoint)x; }
+  int operator !=(long x) { return *this != (FixedPoint)x; }
+
+  int operator <(FixedPoint x) { return val < x.val; }
+  int operator <(double x) { return *this < (FixedPoint)x; }
+  int operator <(int x) { return *this < (FixedPoint)x; }
+  int operator <(long x) { return *this < (FixedPoint)x; }
+
+  int operator <=(FixedPoint x) { return val <= x.val; }
+  int operator <=(double x) { return *this <= (FixedPoint)x; }
+  int operator <=(int x) { return *this <= (FixedPoint)x; }
+  int operator <=(long x) { return *this <= (FixedPoint)x; }
+
+  int operator >(FixedPoint x) { return val > x.val; }
+  int operator >(double x) { return *this > (FixedPoint)x; }
+  int operator >(int x) { return *this > (FixedPoint)x; }
+  int operator >(long x) { return *this > (FixedPoint)x; }
+
+  int operator >=(FixedPoint x) { return val >= x.val; }
+  int operator >=(double x) { return *this >= (FixedPoint)x; }
+  int operator >=(int x) { return *this >= (FixedPoint)x; }
+  int operator >=(long x) { return *this >= (FixedPoint)x; }
+
+  FixedPoint operator -() { return make(-val); }
+
+  FixedPoint operator +(FixedPoint x) { return make(val + x.val); }
+  FixedPoint operator +(double x) { return *this + (FixedPoint)x; }
+  FixedPoint operator +(int x) { return *this + (FixedPoint)x; }
+  FixedPoint operator +(long x) { return *this + (FixedPoint)x; }
+
+  FixedPoint operator +=(FixedPoint x) { val = val + x.val; return *this; }
+  FixedPoint operator +=(double x) { return *this += (FixedPoint)x; }
+  FixedPoint operator +=(int x) { return *this += (FixedPoint)x; }
+  FixedPoint operator +=(long x) { return *this += (FixedPoint)x; }
+
+  FixedPoint operator -(FixedPoint x) { return make(val - x.val); }
+  FixedPoint operator -(double x) { return *this - (FixedPoint)x; }
+  FixedPoint operator -(int x) { return *this - (FixedPoint)x; }
+  FixedPoint operator -(long x) { return *this - (FixedPoint)x; }
+
+  FixedPoint operator -=(FixedPoint x) { val = val - x.val; return *this; }
+  FixedPoint operator -=(double x) { return *this -= (FixedPoint)x; }
+  FixedPoint operator -=(int x) { return *this -= (FixedPoint)x; }
+  FixedPoint operator -=(long x) { return *this -= (FixedPoint)x; }
+
+  FixedPoint operator *(FixedPoint x) { return make(mul(val, x.val)); }
+  FixedPoint operator *(double x) { return *this * (FixedPoint)x; }
+  FixedPoint operator *(int x) { return *this * (FixedPoint)x; }
+  FixedPoint operator *(long x) { return *this * (FixedPoint)x; }
+
+  FixedPoint operator *=(FixedPoint x) { val = mul(val, x.val); return *this; }
+  FixedPoint operator *=(double x) { return *this *= (FixedPoint)x; }
+  FixedPoint operator *=(int x) { return *this *= (FixedPoint)x; }
+  FixedPoint operator *=(long x) { return *this *= (FixedPoint)x; }
+
+  FixedPoint operator /(FixedPoint x) { return make(div(val, x.val)); }
+  FixedPoint operator /(double x) { return *this / (FixedPoint)x; }
+  FixedPoint operator /(int x) { return *this / (FixedPoint)x; }
+  FixedPoint operator /(long x) { return *this / (FixedPoint)x; }
+
+  FixedPoint operator /=(FixedPoint x) { val = div(val, x.val); return *this; }
+  FixedPoint operator /=(double x) { return *this /= (FixedPoint)x; }
+  FixedPoint operator /=(int x) { return *this /= (FixedPoint)x; }
+  FixedPoint operator /=(long x) { return *this /= (FixedPoint)x; }
+
+  static FixedPoint abs(FixedPoint x) { return make(::abs(x.val)); }
+
+  static int floor(FixedPoint x) { return x.val >> fixptShift; }
+
+  static int ceil(FixedPoint x)
+    { return (x.val & fixptMaskL) ? ((x.val >> fixptShift) + 1)
+                                 : (x.val >> fixptShift); }
+
+  static int round(FixedPoint x)
+    { return (x.val + (1 << (fixptShift - 1))) >> fixptShift; }
+
+  // Computes (x+y)/2 avoiding overflow and LSbit accuracy issues.
+  static FixedPoint avg(FixedPoint x, FixedPoint y)
+    { return make((x.val >> 1) + (y.val >> 1) + ((x.val | y.val) & 1)); }
+
+
+  static FixedPoint sqrt(FixedPoint x);
+
+  static FixedPoint pow(FixedPoint x, FixedPoint y);
+
+  // Compute *result = x/y; return false if there is an underflow or
+  // overflow.
+  static GBool divCheck(FixedPoint x, FixedPoint y, FixedPoint *result);
+
+  // Compute abs(m11*m22 - m12*m21) >= epsilon, handling the case
+  // where the multiplications overflow.
+  static GBool checkDet(FixedPoint m11, FixedPoint m12,
+                       FixedPoint m21, FixedPoint m22,
+                       FixedPoint epsilon);
+
+private:
+
+  static FixedPoint make(int valA) { FixedPoint x; x.val = valA; return x; }
+
+  static int mul(int x, int y);
+  static int div(int x, int y);
+
+  int val;                // fixed point: (n-fixptShift).(fixptShift)
+};
+
+#endif // USE_FIXEDPOINT
+
+#endif
diff --git a/goo/GooHash.cc b/goo/GooHash.cc
new file mode 100644 (file)
index 0000000..f4a92f1
--- /dev/null
@@ -0,0 +1,384 @@
+//========================================================================
+//
+// GooHash.cc
+//
+// Copyright 2001-2003 Glyph & Cog, LLC
+//
+//========================================================================
+
+#include <config.h>
+
+#ifdef USE_GCC_PRAGMAS
+#pragma implementation
+#endif
+
+#include "gmem.h"
+#include "GooString.h"
+#include "GooHash.h"
+
+//------------------------------------------------------------------------
+
+struct GooHashBucket {
+  GooString *key;
+  union {
+    void *p;
+    int i;
+  } val;
+  GooHashBucket *next;
+};
+
+struct GooHashIter {
+  int h;
+  GooHashBucket *p;
+};
+
+//------------------------------------------------------------------------
+
+GooHash::GooHash(GBool deleteKeysA) {
+  int h;
+
+  deleteKeys = deleteKeysA;
+  size = 7;
+  tab = (GooHashBucket **)gmallocn(size, sizeof(GooHashBucket *));
+  for (h = 0; h < size; ++h) {
+    tab[h] = NULL;
+  }
+  len = 0;
+}
+
+GooHash::~GooHash() {
+  GooHashBucket *p;
+  int h;
+
+  for (h = 0; h < size; ++h) {
+    while (tab[h]) {
+      p = tab[h];
+      tab[h] = p->next;
+      if (deleteKeys) {
+       delete p->key;
+      }
+      delete p;
+    }
+  }
+  gfree(tab);
+}
+
+void GooHash::add(GooString *key, void *val) {
+  GooHashBucket *p;
+  int h;
+
+  // expand the table if necessary
+  if (len >= size) {
+    expand();
+  }
+
+  // add the new symbol
+  p = new GooHashBucket;
+  p->key = key;
+  p->val.p = val;
+  h = hash(key);
+  p->next = tab[h];
+  tab[h] = p;
+  ++len;
+}
+
+void GooHash::add(GooString *key, int val) {
+  GooHashBucket *p;
+  int h;
+
+  // expand the table if necessary
+  if (len >= size) {
+    expand();
+  }
+
+  // add the new symbol
+  p = new GooHashBucket;
+  p->key = key;
+  p->val.i = val;
+  h = hash(key);
+  p->next = tab[h];
+  tab[h] = p;
+  ++len;
+}
+
+void GooHash::replace(GooString *key, void *val) {
+  GooHashBucket *p;
+  int h;
+
+  if ((p = find(key, &h))) {
+    p->val.p = val;
+    if (deleteKeys) {
+      delete key;
+    }
+  } else {
+    add(key, val);
+  }
+}
+
+void GooHash::replace(GooString *key, int val) {
+  GooHashBucket *p;
+  int h;
+
+  if ((p = find(key, &h))) {
+    p->val.i = val;
+    if (deleteKeys) {
+      delete key;
+    }
+  } else {
+    add(key, val);
+  }
+}
+
+void *GooHash::lookup(GooString *key) {
+  GooHashBucket *p;
+  int h;
+
+  if (!(p = find(key, &h))) {
+    return NULL;
+  }
+  return p->val.p;
+}
+
+int GooHash::lookupInt(GooString *key) {
+  GooHashBucket *p;
+  int h;
+
+  if (!(p = find(key, &h))) {
+    return 0;
+  }
+  return p->val.i;
+}
+
+void *GooHash::lookup(const char *key) {
+  GooHashBucket *p;
+  int h;
+
+  if (!(p = find(key, &h))) {
+    return NULL;
+  }
+  return p->val.p;
+}
+
+int GooHash::lookupInt(const char *key) {
+  GooHashBucket *p;
+  int h;
+
+  if (!(p = find(key, &h))) {
+    return 0;
+  }
+  return p->val.i;
+}
+
+void *GooHash::remove(GooString *key) {
+  GooHashBucket *p;
+  GooHashBucket **q;
+  void *val;
+  int h;
+
+  if (!(p = find(key, &h))) {
+    return NULL;
+  }
+  q = &tab[h];
+  while (*q != p) {
+    q = &((*q)->next);
+  }
+  *q = p->next;
+  if (deleteKeys) {
+    delete p->key;
+  }
+  val = p->val.p;
+  delete p;
+  --len;
+  return val;
+}
+
+int GooHash::removeInt(GooString *key) {
+  GooHashBucket *p;
+  GooHashBucket **q;
+  int val;
+  int h;
+
+  if (!(p = find(key, &h))) {
+    return 0;
+  }
+  q = &tab[h];
+  while (*q != p) {
+    q = &((*q)->next);
+  }
+  *q = p->next;
+  if (deleteKeys) {
+    delete p->key;
+  }
+  val = p->val.i;
+  delete p;
+  --len;
+  return val;
+}
+
+void *GooHash::remove(const char *key) {
+  GooHashBucket *p;
+  GooHashBucket **q;
+  void *val;
+  int h;
+
+  if (!(p = find(key, &h))) {
+    return NULL;
+  }
+  q = &tab[h];
+  while (*q != p) {
+    q = &((*q)->next);
+  }
+  *q = p->next;
+  if (deleteKeys) {
+    delete p->key;
+  }
+  val = p->val.p;
+  delete p;
+  --len;
+  return val;
+}
+
+int GooHash::removeInt(const char *key) {
+  GooHashBucket *p;
+  GooHashBucket **q;
+  int val;
+  int h;
+
+  if (!(p = find(key, &h))) {
+    return 0;
+  }
+  q = &tab[h];
+  while (*q != p) {
+    q = &((*q)->next);
+  }
+  *q = p->next;
+  if (deleteKeys) {
+    delete p->key;
+  }
+  val = p->val.i;
+  delete p;
+  --len;
+  return val;
+}
+
+void GooHash::startIter(GooHashIter **iter) {
+  *iter = new GooHashIter;
+  (*iter)->h = -1;
+  (*iter)->p = NULL;
+}
+
+GBool GooHash::getNext(GooHashIter **iter, GooString **key, void **val) {
+  if (!*iter) {
+    return gFalse;
+  }
+  if ((*iter)->p) {
+    (*iter)->p = (*iter)->p->next;
+  }
+  while (!(*iter)->p) {
+    if (++(*iter)->h == size) {
+      delete *iter;
+      *iter = NULL;
+      return gFalse;
+    }
+    (*iter)->p = tab[(*iter)->h];
+  }
+  *key = (*iter)->p->key;
+  *val = (*iter)->p->val.p;
+  return gTrue;
+}
+
+GBool GooHash::getNext(GooHashIter **iter, GooString **key, int *val) {
+  if (!*iter) {
+    return gFalse;
+  }
+  if ((*iter)->p) {
+    (*iter)->p = (*iter)->p->next;
+  }
+  while (!(*iter)->p) {
+    if (++(*iter)->h == size) {
+      delete *iter;
+      *iter = NULL;
+      return gFalse;
+    }
+    (*iter)->p = tab[(*iter)->h];
+  }
+  *key = (*iter)->p->key;
+  *val = (*iter)->p->val.i;
+  return gTrue;
+}
+
+void GooHash::killIter(GooHashIter **iter) {
+  delete *iter;
+  *iter = NULL;
+}
+
+void GooHash::expand() {
+  GooHashBucket **oldTab;
+  GooHashBucket *p;
+  int oldSize, h, i;
+
+  oldSize = size;
+  oldTab = tab;
+  size = 2*size + 1;
+  tab = (GooHashBucket **)gmallocn(size, sizeof(GooHashBucket *));
+  for (h = 0; h < size; ++h) {
+    tab[h] = NULL;
+  }
+  for (i = 0; i < oldSize; ++i) {
+    while (oldTab[i]) {
+      p = oldTab[i];
+      oldTab[i] = oldTab[i]->next;
+      h = hash(p->key);
+      p->next = tab[h];
+      tab[h] = p;
+    }
+  }
+  gfree(oldTab);
+}
+
+GooHashBucket *GooHash::find(GooString *key, int *h) {
+  GooHashBucket *p;
+
+  *h = hash(key);
+  for (p = tab[*h]; p; p = p->next) {
+    if (!p->key->cmp(key)) {
+      return p;
+    }
+  }
+  return NULL;
+}
+
+GooHashBucket *GooHash::find(const char *key, int *h) {
+  GooHashBucket *p;
+
+  *h = hash(key);
+  for (p = tab[*h]; p; p = p->next) {
+    if (!p->key->cmp(key)) {
+      return p;
+    }
+  }
+  return NULL;
+}
+
+int GooHash::hash(GooString *key) {
+  const char *p;
+  unsigned int h;
+  int i;
+
+  h = 0;
+  for (p = key->getCString(), i = 0; i < key->getLength(); ++p, ++i) {
+    h = 17 * h + (int)(*p & 0xff);
+  }
+  return (int)(h % size);
+}
+
+int GooHash::hash(const char *key) {
+  const char *p;
+  unsigned int h;
+
+  h = 0;
+  for (p = key; *p; ++p) {
+    h = 17 * h + (int)(*p & 0xff);
+  }
+  return (int)(h % size);
+}
diff --git a/goo/GooHash.h b/goo/GooHash.h
new file mode 100644 (file)
index 0000000..b973a93
--- /dev/null
@@ -0,0 +1,76 @@
+//========================================================================
+//
+// GooHash.h
+//
+// Copyright 2001-2003 Glyph & Cog, LLC
+//
+//========================================================================
+
+#ifndef GHASH_H
+#define GHASH_H
+
+#ifdef USE_GCC_PRAGMAS
+#pragma interface
+#endif
+
+#include "gtypes.h"
+
+class GooString;
+struct GooHashBucket;
+struct GooHashIter;
+
+//------------------------------------------------------------------------
+
+class GooHash {
+public:
+
+  GooHash(GBool deleteKeysA = gFalse);
+  ~GooHash();
+  void add(GooString *key, void *val);
+  void add(GooString *key, int val);
+  void replace(GooString *key, void *val);
+  void replace(GooString *key, int val);
+  void *lookup(GooString *key);
+  int lookupInt(GooString *key);
+  void *lookup(const char *key);
+  int lookupInt(const char *key);
+  void *remove(GooString *key);
+  int removeInt(GooString *key);
+  void *remove(const char *key);
+  int removeInt(const char *key);
+  int getLength() { return len; }
+  void startIter(GooHashIter **iter);
+  GBool getNext(GooHashIter **iter, GooString **key, void **val);
+  GBool getNext(GooHashIter **iter, GooString **key, int *val);
+  void killIter(GooHashIter **iter);
+
+private:
+
+  void expand();
+  GooHashBucket *find(GooString *key, int *h);
+  GooHashBucket *find(const char *key, int *h);
+  int hash(GooString *key);
+  int hash(const char *key);
+
+  GBool deleteKeys;            // set if key strings should be deleted
+  int size;                    // number of buckets
+  int len;                     // number of entries
+  GooHashBucket **tab;
+};
+
+#define deleteGooHash(hash, T)                       \
+  do {                                             \
+    GooHash *_hash = (hash);                         \
+    {                                              \
+      GooHashIter *_iter;                            \
+      GooString *_key;                               \
+      void *_p;                                    \
+      _hash->startIter(&_iter);                    \
+      while (_hash->getNext(&_iter, &_key, &_p)) { \
+        delete (T*)_p;                             \
+      }                                            \
+      delete _hash;                                \
+    }                                              \
+  } while(0)
+
+#endif
diff --git a/goo/GooLikely.h b/goo/GooLikely.h
new file mode 100644 (file)
index 0000000..724ccf0
--- /dev/null
@@ -0,0 +1,22 @@
+//========================================================================
+//
+// GooLikely.h
+//
+// This file is licensed under the GPLv2 or later
+//
+// Copyright (C) 2008 Kees Cook <kees@outflux.net>
+//
+//========================================================================
+
+#ifndef GOOLIKELY_H
+#define GOOLIKELY_H
+
+#if defined(__GNUC__) && (__GNUC__ > 2) && defined(__OPTIMIZE__)
+# define likely(x)      __builtin_expect((x), 1)
+# define unlikely(x)    __builtin_expect((x), 0)
+#else
+# define likely(x)      (x)
+# define unlikely(x)    (x)
+#endif
+
+#endif
diff --git a/goo/GooList.cc b/goo/GooList.cc
new file mode 100644 (file)
index 0000000..6ce4952
--- /dev/null
@@ -0,0 +1,122 @@
+//========================================================================
+//
+// GooList.cc
+//
+// Copyright 2001-2003 Glyph & Cog, LLC
+//
+//========================================================================
+
+#include <config.h>
+
+#ifdef USE_GCC_PRAGMAS
+#pragma implementation
+#endif
+
+#include <stdlib.h>
+#include <string.h>
+#include "gmem.h"
+#include "GooList.h"
+
+//------------------------------------------------------------------------
+// GooList
+//------------------------------------------------------------------------
+
+GooList::GooList() {
+  size = 8;
+  data = (void **)gmallocn(size, sizeof(void*));
+  length = 0;
+  inc = 0;
+}
+
+GooList::GooList(int sizeA) {
+  size = sizeA ? sizeA : 8;
+  data = (void **)gmallocn(size, sizeof(void*));
+  length = 0;
+  inc = 0;
+}
+
+GooList::~GooList() {
+  gfree(data);
+}
+
+GooList *GooList::copy() {
+  GooList *ret;
+
+  ret = new GooList(length);
+  ret->length = length;
+  memcpy(ret->data, data, length * sizeof(void *));
+  ret->inc = inc;
+  return ret;
+}
+
+void GooList::append(void *p) {
+  if (length >= size) {
+    expand();
+  }
+  data[length++] = p;
+}
+
+void GooList::append(GooList *list) {
+  int i;
+
+  while (length + list->length > size) {
+    expand();
+  }
+  for (i = 0; i < list->length; ++i) {
+    data[length++] = list->data[i];
+  }
+}
+
+void GooList::insert(int i, void *p) {
+  if (length >= size) {
+    expand();
+  }
+  if (i < 0) {
+    i = 0;
+  }
+  if (i < length) {
+    memmove(data+i+1, data+i, (length - i) * sizeof(void *));
+  }
+  data[i] = p;
+  ++length;
+}
+
+void *GooList::del(int i) {
+  void *p;
+
+  p = data[i];
+  if (i < length - 1) {
+    memmove(data+i, data+i+1, (length - i - 1) * sizeof(void *));
+  }
+  --length;
+  if (size - length >= ((inc > 0) ? inc : size/2)) {
+    shrink();
+  }
+  return p;
+}
+
+void GooList::sort(int (*cmp)(const void *obj1, const void *obj2)) {
+  qsort(data, length, sizeof(void *), cmp);
+}
+
+void GooList::reverse() {
+  void *t;
+  int n, i;
+
+  n = length / 2;
+  for (i = 0; i < n; ++i) {
+    t = data[i];
+    data[i] = data[length - 1 - i];
+    data[length - 1 - i] = t;
+  }
+}
+
+void GooList::expand() {
+  size += (inc > 0) ? inc : size;
+  data = (void **)greallocn(data, size, sizeof(void*));
+}
+
+void GooList::shrink() {
+  size -= (inc > 0) ? inc : size/2;
+  data = (void **)greallocn(data, size, sizeof(void*));
+}
diff --git a/goo/GooList.h b/goo/GooList.h
new file mode 100644 (file)
index 0000000..964568a
--- /dev/null
@@ -0,0 +1,104 @@
+//========================================================================
+//
+// GooList.h
+//
+// Copyright 2001-2003 Glyph & Cog, LLC
+//
+//========================================================================
+
+#ifndef GLIST_H
+#define GLIST_H
+
+#ifdef USE_GCC_PRAGMAS
+#pragma interface
+#endif
+
+#include "gtypes.h"
+
+//------------------------------------------------------------------------
+// GooList
+//------------------------------------------------------------------------
+
+class GooList {
+public:
+
+  // Create an empty list.
+  GooList();
+
+  // Create an empty list with space for <size1> elements.
+  GooList(int sizeA);
+
+  // Destructor - does not free pointed-to objects.
+  ~GooList();
+
+  //----- general
+
+  // Get the number of elements.
+  int getLength() { return length; }
+
+  // Returns a (shallow) copy of this list.
+  GooList *copy();
+
+  //----- ordered list support
+
+  // Return the <i>th element.
+  // Assumes 0 <= i < length.
+  void *get(int i) { return data[i]; }
+
+  // Replace the <i>th element.
+  // Assumes 0 <= i < length.
+  void put(int i, void *p) { data[i] = p; }
+
+  // Append an element to the end of the list.
+  void append(void *p);
+
+  // Append another list to the end of this one.
+  void append(GooList *list);
+
+  // Insert an element at index <i>.
+  // Assumes 0 <= i <= length.
+  void insert(int i, void *p);
+
+  // Deletes and returns the element at index <i>.
+  // Assumes 0 <= i < length.
+  void *del(int i);
+
+  // Sort the list accoring to the given comparison function.
+  // NB: this sorts an array of pointers, so the pointer args need to
+  // be double-dereferenced.
+  void sort(int (*cmp)(const void *ptr1, const void *ptr2));
+
+  // Reverse the list.
+  void reverse();
+
+  //----- control
+
+  // Set allocation increment to <inc>.  If inc > 0, that many
+  // elements will be allocated every time the list is expanded.
+  // If inc <= 0, the list will be doubled in size.
+  void setAllocIncr(int incA) { inc = incA; }
+
+private:
+
+  void expand();
+  void shrink();
+
+  void **data;                 // the list elements
+  int size;                    // size of data array
+  int length;                  // number of elements on list
+  int inc;                     // allocation increment
+};
+
+#define deleteGooList(list, T)                        \
+  do {                                              \
+    GooList *_list = (list);                          \
+    {                                               \
+      int _i;                                       \
+      for (_i = 0; _i < _list->getLength(); ++_i) { \
+        delete (T*)_list->get(_i);                  \
+      }                                             \
+      delete _list;                                 \
+    }                                               \
+  } while (0)
+
+#endif
diff --git a/goo/GooMutex.h b/goo/GooMutex.h
new file mode 100644 (file)
index 0000000..3f53a62
--- /dev/null
@@ -0,0 +1,63 @@
+//========================================================================
+//
+// GooMutex.h
+//
+// Portable mutex macros.
+//
+// Copyright 2002-2003 Glyph & Cog, LLC
+//
+//========================================================================
+
+//========================================================================
+//
+// Modified under the Poppler project - http://poppler.freedesktop.org
+//
+// All changes made under the Poppler project to this file are licensed
+// under GPL version 2 or later
+//
+// Copyright (C) 2009 Kovid Goyal <kovid@kovidgoyal.net>
+//
+// To see a description of the changes please see the Changelog file that
+// came with your tarball or type make ChangeLog if you are building from git
+//
+//========================================================================
+
+#ifndef GMUTEX_H
+#define GMUTEX_H
+
+// Usage:
+//
+// GooMutex m;
+// gInitMutex(&m);
+// ...
+// gLockMutex(&m);
+//   ... critical section ...
+// gUnlockMutex(&m);
+// ...
+// gDestroyMutex(&m);
+
+#ifdef _WIN32
+
+#include <windows.h>
+
+typedef CRITICAL_SECTION GooMutex;
+
+#define gInitMutex(m) InitializeCriticalSection(m)
+#define gDestroyMutex(m) DeleteCriticalSection(m)
+#define gLockMutex(m) EnterCriticalSection(m)
+#define gUnlockMutex(m) LeaveCriticalSection(m)
+
+#else // assume pthreads
+
+#include <pthread.h>
+
+typedef pthread_mutex_t GooMutex;
+
+#define gInitMutex(m) pthread_mutex_init(m, NULL)
+#define gDestroyMutex(m) pthread_mutex_destroy(m)
+#define gLockMutex(m) pthread_mutex_lock(m)
+#define gUnlockMutex(m) pthread_mutex_unlock(m)
+
+#endif
+
+#endif
diff --git a/goo/GooString.cc b/goo/GooString.cc
new file mode 100644 (file)
index 0000000..fc78d90
--- /dev/null
@@ -0,0 +1,894 @@
+//========================================================================
+//
+// GooString.cc
+//
+// Simple variable-length string type.
+//
+// Copyright 1996-2003 Glyph & Cog, LLC
+//
+//========================================================================
+
+//========================================================================
+//
+// Modified under the Poppler project - http://poppler.freedesktop.org
+//
+// All changes made under the Poppler project to this file are licensed
+// under GPL version 2 or later
+//
+// Copyright (C) 2006 Kristian Høgsberg <krh@redhat.com>
+// Copyright (C) 2006 Krzysztof Kowalczyk <kkowalczyk@gmail.com>
+// Copyright (C) 2007 Jeff Muizelaar <jeff@infidigm.net>
+// Copyright (C) 2008-2011 Albert Astals Cid <aacid@kde.org>
+// Copyright (C) 2011 Kenji Uno <ku@digitaldolphins.jp>
+//
+// To see a description of the changes please see the Changelog file that
+// came with your tarball or type make ChangeLog if you are building from git
+//
+//========================================================================
+
+#include <config.h>
+
+#ifdef USE_GCC_PRAGMAS
+#pragma implementation
+#endif
+
+#include <stdlib.h>
+#include <stddef.h>
+#include <string.h>
+#include <ctype.h>
+#include <assert.h>
+#include <math.h>
+#include "gmem.h"
+#include "GooString.h"
+
+static const int MAXIMUM_DOUBLE_PREC = 16;
+
+//------------------------------------------------------------------------
+
+union GooStringFormatArg {
+  int i;
+  Guint ui;
+  long l;
+  Gulong ul;
+#ifdef LLONG_MAX
+  long long ll;
+#endif
+#ifdef ULLONG_MAX
+  unsigned long long ull;
+#endif
+  double f;
+  char c;
+  char *s;
+  GooString *gs;
+};
+
+enum GooStringFormatType {
+  fmtIntDecimal,
+  fmtIntHex,
+  fmtIntOctal,
+  fmtIntBinary,
+  fmtUIntDecimal,
+  fmtUIntHex,
+  fmtUIntOctal,
+  fmtUIntBinary,
+  fmtLongDecimal,
+  fmtLongHex,
+  fmtLongOctal,
+  fmtLongBinary,
+  fmtULongDecimal,
+  fmtULongHex,
+  fmtULongOctal,
+  fmtULongBinary,
+#ifdef LLONG_MAX
+  fmtLongLongDecimal,
+  fmtLongLongHex,
+  fmtLongLongOctal,
+  fmtLongLongBinary,
+#endif
+#ifdef ULLONG_MAX
+  fmtULongLongDecimal,
+  fmtULongLongHex,
+  fmtULongLongOctal,
+  fmtULongLongBinary,
+#endif
+  fmtDouble,
+  fmtDoubleTrimSmallAware,
+  fmtDoubleTrim,
+  fmtChar,
+  fmtString,
+  fmtGooString,
+  fmtSpace
+};
+
+static const char *formatStrings[] = {
+  "d", "x", "o", "b", "ud", "ux", "uo", "ub",
+  "ld", "lx", "lo", "lb", "uld", "ulx", "ulo", "ulb",
+#ifdef LLONG_MAX
+  "lld", "llx", "llo", "llb",
+#endif
+#ifdef ULLONG_MAX
+  "ulld", "ullx", "ullo", "ullb",
+#endif
+  "f", "gs", "g",
+  "c",
+  "s",
+  "t",
+  "w",
+  NULL
+};
+
+//------------------------------------------------------------------------
+
+int inline GooString::roundedSize(int len) {
+  int delta;
+  if (len <= STR_STATIC_SIZE-1)
+      return STR_STATIC_SIZE;
+  delta = len < 256 ? 7 : 255;
+  return ((len + 1) + delta) & ~delta;
+}
+
+// Make sure that the buffer is big enough to contain <newLength> characters
+// plus terminating 0.
+// We assume that if this is being called from the constructor, <s> was set
+// to NULL and <length> was set to 0 to indicate unused string before calling us.
+void inline GooString::resize(int newLength) {
+  char *s1 = s;
+
+  if (!s || (roundedSize(length) != roundedSize(newLength))) {
+    // requires re-allocating data for string
+    if (newLength < STR_STATIC_SIZE) {
+      s1 = sStatic;
+    } else {
+      // allocate a rounded amount
+      if (s == sStatic)
+       s1 = (char*)gmalloc(roundedSize(newLength));
+      else
+       s1 = (char*)grealloc(s, roundedSize(newLength));
+    }
+    if (s == sStatic || s1 == sStatic) {
+      // copy the minimum, we only need to if are moving to or
+      // from sStatic.
+      // assert(s != s1) the roundedSize condition ensures this
+      if (newLength < length) {
+       memcpy(s1, s, newLength);
+      } else {
+       memcpy(s1, s, length);
+      }
+      if (s != sStatic)
+       gfree(s);
+    }
+
+  }
+
+  s = s1;
+  length = newLength;
+  s[length] = '\0';
+}
+
+GooString* GooString::Set(const char *s1, int s1Len, const char *s2, int s2Len)
+{
+    int newLen = 0;
+    char *p;
+
+    if (s1) {
+        if (CALC_STRING_LEN == s1Len) {
+            s1Len = strlen(s1);
+        } else
+            assert(s1Len >= 0);
+        newLen += s1Len;
+    }
+
+    if (s2) {
+        if (CALC_STRING_LEN == s2Len) {
+            s2Len = strlen(s2);
+        } else
+            assert(s2Len >= 0);
+        newLen += s2Len;
+    }
+
+    resize(newLen);
+    p = s;
+    if (s1) {
+        memcpy(p, s1, s1Len);
+        p += s1Len;
+    }
+    if (s2) {
+        memcpy(p, s2, s2Len);
+        p += s2Len;
+    }
+    return this;
+}
+
+GooString::GooString() {
+  s = NULL;
+  length = 0;
+  Set(NULL);
+}
+
+GooString::GooString(const char *sA) {
+  s = NULL;
+  length = 0;
+  Set(sA, CALC_STRING_LEN);
+}
+
+GooString::GooString(const char *sA, int lengthA) {
+  s = NULL;
+  length = 0;
+  Set(sA, lengthA);
+}
+
+GooString::GooString(GooString *str, int idx, int lengthA) {
+  s = NULL;
+  length = 0;
+  assert(idx + lengthA <= str->length);
+  Set(str->getCString() + idx, lengthA);
+}
+
+GooString::GooString(const GooString *str) {
+  s = NULL;
+  length = 0;
+  Set(str->getCString(), str->length);
+}
+
+GooString::GooString(GooString *str1, GooString *str2) {
+  s = NULL;
+  length = 0;
+  Set(str1->getCString(), str1->length, str2->getCString(), str2->length);
+}
+
+GooString *GooString::fromInt(int x) {
+  char buf[24]; // enough space for 64-bit ints plus a little extra
+  char *p;
+  int len;
+  formatInt(x, buf, sizeof(buf), gFalse, 0, 10, &p, &len);
+  return new GooString(p, len);
+}
+
+GooString *GooString::format(const char *fmt, ...) {
+  va_list argList;
+  GooString *s;
+
+  s = new GooString();
+  va_start(argList, fmt);
+  s->appendfv(fmt, argList);
+  va_end(argList);
+  return s;
+}
+
+GooString *GooString::formatv(const char *fmt, va_list argList) {
+  GooString *s;
+
+  s = new GooString();
+  s->appendfv(fmt, argList);
+  return s;
+}
+
+GooString::~GooString() {
+  if (s != sStatic)
+    gfree(s);
+}
+
+GooString *GooString::clear() {
+  resize(0);
+  return this;
+}
+
+GooString *GooString::append(char c) {
+  return append((const char*)&c, 1);
+}
+
+GooString *GooString::append(GooString *str) {
+  return append(str->getCString(), str->getLength());
+}
+
+GooString *GooString::append(const char *str, int lengthA) {
+  int prevLen = length;
+  if (CALC_STRING_LEN == lengthA)
+    lengthA = strlen(str);
+  resize(length + lengthA);
+  memcpy(s + prevLen, str, lengthA);
+  return this;
+}
+
+GooString *GooString::appendf(const char *fmt, ...) {
+  va_list argList;
+
+  va_start(argList, fmt);
+  appendfv(fmt, argList);
+  va_end(argList);
+  return this;
+}
+
+GooString *GooString::appendfv(const char *fmt, va_list argList) {
+  GooStringFormatArg *args;
+  int argsLen, argsSize;
+  GooStringFormatArg arg;
+  int idx, width, prec;
+  GBool reverseAlign, zeroFill;
+  GooStringFormatType ft;
+  char buf[65];
+  int len, i;
+  const char *p0, *p1;
+  char *str;
+
+  argsLen = 0;
+  argsSize = 8;
+  args = (GooStringFormatArg *)gmallocn(argsSize, sizeof(GooStringFormatArg));
+
+  p0 = fmt;
+  while (*p0) {
+    if (*p0 == '{') {
+      ++p0;
+      if (*p0 == '{') {
+       ++p0;
+       append('{');
+      } else {
+
+       // parse the format string
+       if (!(*p0 >= '0' && *p0 <= '9')) {
+         break;
+       }
+       idx = *p0 - '0';
+       for (++p0; *p0 >= '0' && *p0 <= '9'; ++p0) {
+         idx = 10 * idx + (*p0 - '0');
+       }
+       if (*p0 != ':') {
+         break;
+       }
+       ++p0;
+       if (*p0 == '-') {
+         reverseAlign = gTrue;
+         ++p0;
+       } else {
+         reverseAlign = gFalse;
+       }
+       width = 0;
+       zeroFill = *p0 == '0';
+       for (; *p0 >= '0' && *p0 <= '9'; ++p0) {
+         width = 10 * width + (*p0 - '0');
+       }
+       if (width < 0) {
+         width = 0;
+       }
+       if (*p0 == '.') {
+         ++p0;
+         prec = 0;
+         for (; *p0 >= '0' && *p0 <= '9'; ++p0) {
+           prec = 10 * prec + (*p0 - '0');
+         }
+       } else {
+         prec = 0;
+       }
+       for (ft = (GooStringFormatType)0;
+            formatStrings[ft];
+            ft = (GooStringFormatType)(ft + 1)) {
+         if (!strncmp(p0, formatStrings[ft], strlen(formatStrings[ft]))) {
+           break;
+         }
+       }
+       if (!formatStrings[ft]) {
+         break;
+       }
+       p0 += strlen(formatStrings[ft]);
+       if (*p0 != '}') {
+         break;
+       }
+       ++p0;
+
+       // fetch the argument
+       if (idx > argsLen) {
+         break;
+       }
+       if (idx == argsLen) {
+         if (argsLen == argsSize) {
+           argsSize *= 2;
+           args = (GooStringFormatArg *)greallocn(args, argsSize,
+                                                sizeof(GooStringFormatArg));
+         }
+         switch (ft) {
+         case fmtIntDecimal:
+         case fmtIntHex:
+         case fmtIntOctal:
+         case fmtIntBinary:
+         case fmtSpace:
+           args[argsLen].i = va_arg(argList, int);
+           break;
+         case fmtUIntDecimal:
+         case fmtUIntHex:
+         case fmtUIntOctal:
+         case fmtUIntBinary:
+           args[argsLen].ui = va_arg(argList, Guint);
+           break;
+         case fmtLongDecimal:
+         case fmtLongHex:
+         case fmtLongOctal:
+         case fmtLongBinary:
+           args[argsLen].l = va_arg(argList, long);
+           break;
+         case fmtULongDecimal:
+         case fmtULongHex:
+         case fmtULongOctal:
+         case fmtULongBinary:
+           args[argsLen].ul = va_arg(argList, Gulong);
+           break;
+#ifdef LLONG_MAX
+         case fmtLongLongDecimal:
+         case fmtLongLongHex:
+         case fmtLongLongOctal:
+         case fmtLongLongBinary:
+           args[argsLen].ll = va_arg(argList, long long);
+           break;
+#endif
+#ifdef ULLONG_MAX
+         case fmtULongLongDecimal:
+         case fmtULongLongHex:
+         case fmtULongLongOctal:
+         case fmtULongLongBinary:
+           args[argsLen].ull = va_arg(argList, unsigned long long);
+           break;
+#endif
+         case fmtDouble:
+         case fmtDoubleTrim:
+         case fmtDoubleTrimSmallAware:
+           args[argsLen].f = va_arg(argList, double);
+           break;
+         case fmtChar:
+           args[argsLen].c = (char)va_arg(argList, int);
+           break;
+         case fmtString:
+           args[argsLen].s = va_arg(argList, char *);
+           break;
+         case fmtGooString:
+           args[argsLen].gs = va_arg(argList, GooString *);
+           break;
+         }
+         ++argsLen;
+       }
+
+       // format the argument
+       arg = args[idx];
+       switch (ft) {
+       case fmtIntDecimal:
+         formatInt(arg.i, buf, sizeof(buf), zeroFill, width, 10, &str, &len);
+         break;
+       case fmtIntHex:
+         formatInt(arg.i, buf, sizeof(buf), zeroFill, width, 16, &str, &len);
+         break;
+       case fmtIntOctal:
+         formatInt(arg.i, buf, sizeof(buf), zeroFill, width, 8, &str, &len);
+         break;
+       case fmtIntBinary:
+         formatInt(arg.i, buf, sizeof(buf), zeroFill, width, 2, &str, &len);
+         break;
+       case fmtUIntDecimal:
+         formatUInt(arg.ui, buf, sizeof(buf), zeroFill, width, 10,
+                    &str, &len);
+         break;
+       case fmtUIntHex:
+         formatUInt(arg.ui, buf, sizeof(buf), zeroFill, width, 16,
+                    &str, &len);
+         break;
+       case fmtUIntOctal:
+         formatUInt(arg.ui, buf, sizeof(buf), zeroFill, width, 8, &str, &len);
+         break;
+       case fmtUIntBinary:
+         formatUInt(arg.ui, buf, sizeof(buf), zeroFill, width, 2, &str, &len);
+         break;
+       case fmtLongDecimal:
+         formatInt(arg.l, buf, sizeof(buf), zeroFill, width, 10, &str, &len);
+         break;
+       case fmtLongHex:
+         formatInt(arg.l, buf, sizeof(buf), zeroFill, width, 16, &str, &len);
+         break;
+       case fmtLongOctal:
+         formatInt(arg.l, buf, sizeof(buf), zeroFill, width, 8, &str, &len);
+         break;
+       case fmtLongBinary:
+         formatInt(arg.l, buf, sizeof(buf), zeroFill, width, 2, &str, &len);
+         break;
+       case fmtULongDecimal:
+         formatUInt(arg.ul, buf, sizeof(buf), zeroFill, width, 10,
+                    &str, &len);
+         break;
+       case fmtULongHex:
+         formatUInt(arg.ul, buf, sizeof(buf), zeroFill, width, 16,
+                    &str, &len);
+         break;
+       case fmtULongOctal:
+         formatUInt(arg.ul, buf, sizeof(buf), zeroFill, width, 8, &str, &len);
+         break;
+       case fmtULongBinary:
+         formatUInt(arg.ul, buf, sizeof(buf), zeroFill, width, 2, &str, &len);
+         break;
+#ifdef LLONG_MAX
+       case fmtLongLongDecimal:
+         formatInt(arg.ll, buf, sizeof(buf), zeroFill, width, 10, &str, &len);
+         break;
+       case fmtLongLongHex:
+         formatInt(arg.ll, buf, sizeof(buf), zeroFill, width, 16, &str, &len);
+         break;
+       case fmtLongLongOctal:
+         formatInt(arg.ll, buf, sizeof(buf), zeroFill, width, 8, &str, &len);
+         break;
+       case fmtLongLongBinary:
+         formatInt(arg.ll, buf, sizeof(buf), zeroFill, width, 2, &str, &len);
+         break;
+#endif
+#ifdef ULLONG_MAX
+       case fmtULongLongDecimal:
+         formatUInt(arg.ull, buf, sizeof(buf), zeroFill, width, 10,
+                    &str, &len);
+         break;
+       case fmtULongLongHex:
+         formatUInt(arg.ull, buf, sizeof(buf), zeroFill, width, 16,
+                    &str, &len);
+         break;
+       case fmtULongLongOctal:
+         formatUInt(arg.ull, buf, sizeof(buf), zeroFill, width, 8,
+                    &str, &len);
+         break;
+       case fmtULongLongBinary:
+         formatUInt(arg.ull, buf, sizeof(buf), zeroFill, width, 2,
+                    &str, &len);
+         break;
+#endif
+       case fmtDouble:
+         formatDouble(arg.f, buf, sizeof(buf), prec, gFalse, &str, &len);
+         break;
+       case fmtDoubleTrim:
+         formatDouble(arg.f, buf, sizeof(buf), prec, gTrue, &str, &len);
+         break;
+       case fmtDoubleTrimSmallAware:
+         formatDoubleSmallAware(arg.f, buf, sizeof(buf), prec, gTrue, &str, &len);
+         break;
+       case fmtChar:
+         buf[0] = arg.c;
+         str = buf;
+         len = 1;
+         reverseAlign = !reverseAlign;
+         break;
+       case fmtString:
+         str = arg.s;
+         len = strlen(str);
+         reverseAlign = !reverseAlign;
+         break;
+       case fmtGooString:
+         str = arg.gs->getCString();
+         len = arg.gs->getLength();
+         reverseAlign = !reverseAlign;
+         break;
+       case fmtSpace:
+         str = buf;
+         len = 0;
+         width = arg.i;
+         break;
+       }
+
+       // append the formatted arg, handling width and alignment
+       if (!reverseAlign && len < width) {
+         for (i = len; i < width; ++i) {
+           append(' ');
+         }
+       }
+       append(str, len);
+       if (reverseAlign && len < width) {
+         for (i = len; i < width; ++i) {
+           append(' ');
+         }
+       }
+      }
+
+    } else if (*p0 == '}') {
+      ++p0;
+      if (*p0 == '}') {
+       ++p0;
+      }
+      append('}');
+      
+    } else {
+      for (p1 = p0 + 1; *p1 && *p1 != '{' && *p1 != '}'; ++p1) ;
+      append(p0, p1 - p0);
+      p0 = p1;
+    }
+  }
+
+  gfree(args);
+  return this;
+}
+#ifdef LLONG_MAX
+void GooString::formatInt(long long x, char *buf, int bufSize,
+                          GBool zeroFill, int width, int base,
+                          char **p, int *len) {
+#else
+void GooString::formatInt(long x, char *buf, int bufSize,
+                          GBool zeroFill, int width, int base,
+                          char **p, int *len) {
+#endif
+  static char vals[17] = "0123456789abcdef";
+  GBool neg;
+  int start, i, j;
+
+  i = bufSize;
+  if ((neg = x < 0)) {
+    x = -x;
+  }
+  start = neg ? 1 : 0;
+  if (x == 0) {
+    buf[--i] = '0';
+  } else {
+    while (i > start && x) {
+      buf[--i] = vals[x % base];
+      x /= base;
+    }
+  }
+  if (zeroFill) {
+    for (j = bufSize - i; i > start && j < width - start; ++j) {
+      buf[--i] = '0';
+    }
+  }
+  if (neg) {
+    buf[--i] = '-';
+  }
+  *p = buf + i;
+  *len = bufSize - i;
+}
+
+#ifdef ULLONG_MAX
+void GooString::formatUInt(unsigned long long x, char *buf, int bufSize,
+                           GBool zeroFill, int width, int base,
+                           char **p, int *len) {
+#else
+void GooString::formatUInt(Gulong x, char *buf, int bufSize,
+                           GBool zeroFill, int width, int base,
+                           char **p, int *len) {
+#endif
+  static char vals[17] = "0123456789abcdef";
+  int i, j;
+
+  i = bufSize;
+  if (x == 0) {
+    buf[--i] = '0';
+  } else {
+    while (i > 0 && x) {
+      buf[--i] = vals[x % base];
+      x /= base;
+    }
+  }
+  if (zeroFill) {
+    for (j = bufSize - i; i > 0 && j < width; ++j) {
+      buf[--i] = '0';
+    }
+  }
+  *p = buf + i;
+  *len = bufSize - i;
+}
+
+void GooString::formatDouble(double x, char *buf, int bufSize, int prec,
+                          GBool trim, char **p, int *len) {
+  GBool neg, started;
+  double x2;
+  int d, i, j;
+
+  if ((neg = x < 0)) {
+    x = -x;
+  }
+  x = floor(x * pow(10.0, prec) + 0.5);
+  i = bufSize;
+  started = !trim;
+  for (j = 0; j < prec && i > 1; ++j) {
+    x2 = floor(0.1 * (x + 0.5));
+    d = (int)floor(x - 10 * x2 + 0.5);
+    if (started || d != 0) {
+      buf[--i] = '0' + d;
+      started = gTrue;
+    }
+    x = x2;
+  }
+  if (i > 1 && started) {
+    buf[--i] = '.';
+  }
+  if (i > 1) {
+    do {
+      x2 = floor(0.1 * (x + 0.5));
+      d = (int)floor(x - 10 * x2 + 0.5);
+      buf[--i] = '0' + d;
+      x = x2;
+    } while (i > 1 && x);
+  }
+  if (neg) {
+    buf[--i] = '-';
+  }
+  *p = buf + i;
+  *len = bufSize - i;
+}
+
+void GooString::formatDoubleSmallAware(double x, char *buf, int bufSize, int prec,
+                                     GBool trim, char **p, int *len)
+{
+  double absX = fabs(x);
+  if (absX >= 0.1) {
+    formatDouble(x, buf, bufSize, prec, trim, p, len);
+  } else {
+    while (absX < 0.1 && prec < MAXIMUM_DOUBLE_PREC)
+    {
+      absX = absX * 10;
+      prec++;
+    }
+    formatDouble(x, buf, bufSize, prec, trim, p, len);
+  }
+}
+
+GooString *GooString::insert(int i, char c) {
+  return insert(i, (const char*)&c, 1);
+}
+
+GooString *GooString::insert(int i, GooString *str) {
+  return insert(i, str->getCString(), str->getLength());
+}
+
+GooString *GooString::insert(int i, const char *str, int lengthA) {
+  int j;
+  int prevLen = length;
+  if (CALC_STRING_LEN == lengthA)
+    lengthA = strlen(str);
+
+  resize(length + lengthA);
+  for (j = prevLen; j >= i; --j)
+    s[j+lengthA] = s[j];
+  memcpy(s+i, str, lengthA);
+  return this;
+}
+
+GooString *GooString::del(int i, int n) {
+  int j;
+
+  if (i >= 0 && n > 0 && i + n > 0) {
+    if (i + n > length) {
+      n = length - i;
+    }
+    for (j = i; j <= length - n; ++j) {
+      s[j] = s[j + n];
+    }
+    resize(length - n);
+  }
+  return this;
+}
+
+GooString *GooString::upperCase() {
+  int i;
+
+  for (i = 0; i < length; ++i) {
+    if (islower(s[i]))
+      s[i] = toupper(s[i]);
+  }
+  return this;
+}
+
+GooString *GooString::lowerCase() {
+  int i;
+
+  for (i = 0; i < length; ++i) {
+    if (isupper(s[i]))
+      s[i] = tolower(s[i]);
+  }
+  return this;
+}
+
+int GooString::cmp(GooString *str) const {
+  int n1, n2, i, x;
+  char *p1, *p2;
+
+  n1 = length;
+  n2 = str->length;
+  for (i = 0, p1 = s, p2 = str->s; i < n1 && i < n2; ++i, ++p1, ++p2) {
+    x = *p1 - *p2;
+    if (x != 0) {
+      return x;
+    }
+  }
+  return n1 - n2;
+}
+
+int GooString::cmpN(GooString *str, int n) const {
+  int n1, n2, i, x;
+  char *p1, *p2;
+
+  n1 = length;
+  n2 = str->length;
+  for (i = 0, p1 = s, p2 = str->s;
+       i < n1 && i < n2 && i < n;
+       ++i, ++p1, ++p2) {
+    x = *p1 - *p2;
+    if (x != 0) {
+      return x;
+    }
+  }
+  if (i == n) {
+    return 0;
+  }
+  return n1 - n2;
+}
+
+int GooString::cmp(const char *sA) const {
+  int n1, i, x;
+  const char *p1, *p2;
+
+  n1 = length;
+  for (i = 0, p1 = s, p2 = sA; i < n1 && *p2; ++i, ++p1, ++p2) {
+    x = *p1 - *p2;
+    if (x != 0) {
+      return x;
+    }
+  }
+  if (i < n1) {
+    return 1;
+  }
+  if (*p2) {
+    return -1;
+  }
+  return 0;
+}
+
+int GooString::cmpN(const char *sA, int n) const {
+  int n1, i, x;
+  const char *p1, *p2;
+
+  n1 = length;
+  for (i = 0, p1 = s, p2 = sA; i < n1 && *p2 && i < n; ++i, ++p1, ++p2) {
+    x = *p1 - *p2;
+    if (x != 0) {
+      return x;
+    }
+  }
+  if (i == n) {
+    return 0;
+  }
+  if (i < n1) {
+    return 1;
+  }
+  if (*p2) {
+    return -1;
+  }
+  return 0;
+}
+
+GBool GooString::hasUnicodeMarker(void)
+{
+    return (s[0] & 0xff) == 0xfe && (s[1] & 0xff) == 0xff;
+}
+
+GooString *GooString::sanitizedName(GBool psmode)
+{
+  GooString *name;
+  char buf[8];
+  int i;
+  char c;
+
+  name = new GooString();
+
+  if (psmode)
+  {
+    // ghostscript chokes on names that begin with out-of-limits
+    // numbers, e.g., 1e4foo is handled correctly (as a name), but
+    // 1e999foo generates a limitcheck error
+    c = getChar(0);
+    if (c >= '0' && c <= '9') {
+      name->append('f');
+    }
+  }
+
+  for (i = 0; i < getLength(); ++i) {
+    c = getChar(i);
+    if (c <= (char)0x20 || c >= (char)0x7f ||
+       c == ' ' ||
+       c == '(' || c == ')' || c == '<' || c == '>' ||
+       c == '[' || c == ']' || c == '{' || c == '}' ||
+       c == '/' || c == '%' || c == '#') {
+      sprintf(buf, "#%02x", c & 0xff);
+      name->append(buf);
+    } else {
+      name->append(c);
+    }
+  }
+  return name;
+}
diff --git a/goo/GooString.h b/goo/GooString.h
new file mode 100644 (file)
index 0000000..23558b0
--- /dev/null
@@ -0,0 +1,194 @@
+//========================================================================
+//
+// GooString.h
+//
+// Simple variable-length string type.
+//
+// Copyright 1996-2003 Glyph & Cog, LLC
+//
+//========================================================================
+
+//========================================================================
+//
+// Modified under the Poppler project - http://poppler.freedesktop.org
+//
+// All changes made under the Poppler project to this file are licensed
+// under GPL version 2 or later
+//
+// Copyright (C) 2006 Kristian Høgsberg <krh@redhat.com>
+// Copyright (C) 2006 Krzysztof Kowalczyk <kkowalczyk@gmail.com>
+// Copyright (C) 2008-2010, 2012 Albert Astals Cid <aacid@kde.org>
+//
+// To see a description of the changes please see the Changelog file that
+// came with your tarball or type make ChangeLog if you are building from git
+//
+//========================================================================
+
+#ifndef GooString_H
+#define GooString_H
+
+#ifdef USE_GCC_PRAGMAS
+#pragma interface
+#endif
+
+#include <limits.h> // for LLONG_MAX and ULLONG_MAX
+#include <stdarg.h>
+#include <stdlib.h> // for NULL
+#include "gtypes.h"
+
+class GooString {
+public:
+
+  // Create an empty string.
+  GooString();
+
+  // Create a string from a C string.
+  explicit GooString(const char *sA);
+
+  // Create a string from <lengthA> chars at <sA>.  This string
+  // can contain null characters.
+  GooString(const char *sA, int lengthA);
+
+  // Create a string from <lengthA> chars at <idx> in <str>.
+  GooString(GooString *str, int idx, int lengthA);
+
+  // Set content of a string to concatination of <s1> and <s2>. They can both
+  // be NULL. if <s1Len> or <s2Len> is CALC_STRING_LEN, then length of the string
+  // will be calculated with strlen(). Otherwise we assume they are a valid
+  // length of string (or its substring)
+  GooString* Set(const char *s1, int s1Len=CALC_STRING_LEN, const char *s2=NULL, int s2Len=CALC_STRING_LEN);
+
+  // Copy a string.
+  explicit GooString(const GooString *str);
+  GooString *copy() const { return new GooString(this); }
+
+  // Concatenate two strings.
+  GooString(GooString *str1, GooString *str2);
+
+  // Convert an integer to a string.
+  static GooString *fromInt(int x);
+
+  // Create a formatted string.  Similar to printf, but without the
+  // string overflow issues.  Formatting elements consist of:
+  //     {<arg>:[<width>][.<precision>]<type>}
+  // where:
+  // - <arg> is the argument number (arg 0 is the first argument
+  //   following the format string) -- NB: args must be first used in
+  //   order; they can be reused in any order
+  // - <width> is the field width -- negative to reverse the alignment;
+  //   starting with a leading zero to zero-fill (for integers)
+  // - <precision> is the number of digits to the right of the decimal
+  //   point (for floating point numbers)
+  // - <type> is one of:
+  //     d, x, o, b -- int in decimal, hex, octal, binary
+  //     ud, ux, uo, ub -- unsigned int
+  //     ld, lx, lo, lb, uld, ulx, ulo, ulb -- long, unsigned long
+  //     lld, llx, llo, llb, ulld, ullx, ullo, ullb
+  //         -- long long, unsigned long long
+  //     f, g -- double
+  //     c -- char
+  //     s -- string (char *)
+  //     t -- GooString *
+  //     w -- blank space; arg determines width
+  // To get literal curly braces, use {{ or }}.
+  static GooString *format(const char *fmt, ...);
+  static GooString *formatv(const char *fmt, va_list argList);
+
+  // Destructor.
+  ~GooString();
+
+  // Get length.
+  int getLength() { return length; }
+
+  // Get C string.
+  char *getCString() const { return s; }
+
+  // Get <i>th character.
+  char getChar(int i) { return s[i]; }
+
+  // Change <i>th character.
+  void setChar(int i, char c) { s[i] = c; }
+
+  // Clear string to zero length.
+  GooString *clear();
+
+  // Append a character or string.
+  GooString *append(char c);
+  GooString *append(GooString *str);
+  GooString *append(const char *str, int lengthA=CALC_STRING_LEN);
+
+  // Append a formatted string.
+  GooString *appendf(const char *fmt, ...);
+  GooString *appendfv(const char *fmt, va_list argList);
+
+  // Insert a character or string.
+  GooString *insert(int i, char c);
+  GooString *insert(int i, GooString *str);
+  GooString *insert(int i, const char *str, int lengthA=CALC_STRING_LEN);
+
+  // Delete a character or range of characters.
+  GooString *del(int i, int n = 1);
+
+  // Convert string to all-upper/all-lower case.
+  GooString *upperCase();
+  GooString *lowerCase();
+
+  // Compare two strings:  -1:<  0:=  +1:>
+  int cmp(GooString *str) const;
+  int cmpN(GooString *str, int n) const;
+  int cmp(const char *sA) const;
+  int cmpN(const char *sA, int n) const;
+
+  GBool hasUnicodeMarker(void);
+
+  // Sanitizes the string so that it does
+  // not contain any ( ) < > [ ] { } / %
+  // The postscript mode also has some more strict checks
+  // The caller owns the return value
+  GooString *sanitizedName(GBool psmode);
+
+private:
+  GooString(const GooString &other);
+  GooString& operator=(const GooString &other);
+
+  // you can tweak this number for a different speed/memory usage tradeoffs.
+  // In libc malloc() rounding is 16 so it's best to choose a value that
+  // results in sizeof(GooString) be a multiple of 16.
+  // 24 makes sizeof(GooString) to be 32.
+  static const int STR_STATIC_SIZE = 24;
+  // a special value telling that the length of the string is not given
+  // so it must be calculated from the strings
+  static const int CALC_STRING_LEN = -1;
+
+  int  roundedSize(int len);
+
+  char sStatic[STR_STATIC_SIZE];
+  int length;
+  char *s;
+
+  void resize(int newLength);
+#ifdef LLONG_MAX
+  static void formatInt(long long x, char *buf, int bufSize,
+                       GBool zeroFill, int width, int base,
+                       char **p, int *len);
+#else
+  static void formatInt(long x, char *buf, int bufSize,
+                       GBool zeroFill, int width, int base,
+                       char **p, int *len);
+#endif
+#ifdef ULLONG_MAX
+  static void formatUInt(unsigned long long x, char *buf, int bufSize,
+                        GBool zeroFill, int width, int base,
+                        char **p, int *len);
+#else
+  static void formatUInt(Gulong x, char *buf, int bufSize,
+                        GBool zeroFill, int width, int base,
+                        char **p, int *len);
+#endif
+  static void formatDouble(double x, char *buf, int bufSize, int prec,
+                          GBool trim, char **p, int *len);
+  static void formatDoubleSmallAware(double x, char *buf, int bufSize, int prec,
+                                    GBool trim, char **p, int *len);
+};
+
+#endif
diff --git a/goo/GooTimer.cc b/goo/GooTimer.cc
new file mode 100644 (file)
index 0000000..c766c6b
--- /dev/null
@@ -0,0 +1,95 @@
+//========================================================================
+//
+// GooTimer.cc
+//
+// This file is licensed under GPLv2 or later
+//
+// Copyright 2005 Jonathan Blandford <jrb@redhat.com>
+// Copyright 2007 Krzysztof Kowalczyk <kkowalczyk@gmail.com>
+// Copyright 2010 Hib Eris <hib@hiberis.nl>
+// Inspired by gtimer.c in glib, which is Copyright 2000 by the GLib Team
+//
+//========================================================================
+
+#include <config.h>
+
+#ifdef USE_GCC_PRAGMAS
+#pragma implementation
+#endif
+
+#include "GooTimer.h"
+#include <string.h>
+
+#define USEC_PER_SEC 1000000
+
+//------------------------------------------------------------------------
+// GooTimer
+//------------------------------------------------------------------------
+
+GooTimer::GooTimer() {
+  start();
+}
+
+void GooTimer::start() {
+#ifdef HAVE_GETTIMEOFDAY
+  gettimeofday(&start_time, NULL);
+#elif defined(_WIN32)
+  QueryPerformanceCounter(&start_time);
+#endif
+  active = true;
+}
+
+void GooTimer::stop() {
+#ifdef HAVE_GETTIMEOFDAY
+  gettimeofday(&end_time, NULL);
+#elif defined(_WIN32)
+  QueryPerformanceCounter(&end_time);
+#endif
+  active = false;
+}
+
+#ifdef HAVE_GETTIMEOFDAY
+double GooTimer::getElapsed()
+{
+  double total;
+  struct timeval elapsed;
+
+  if (active)
+    gettimeofday(&end_time, NULL);
+
+  if (start_time.tv_usec > end_time.tv_usec) {
+      end_time.tv_usec += USEC_PER_SEC;
+      end_time.tv_sec--;
+  }
+
+  elapsed.tv_usec = end_time.tv_usec - start_time.tv_usec;
+  elapsed.tv_sec = end_time.tv_sec - start_time.tv_sec;
+
+  total = elapsed.tv_sec + ((double) elapsed.tv_usec / 1e6);
+  if (total < 0)
+      total = 0;
+
+  return total;
+}
+#elif defined(_WIN32)
+double GooTimer::getElapsed()
+{
+  LARGE_INTEGER   freq;
+  double          time_in_secs;
+  QueryPerformanceFrequency(&freq);
+
+  if (active)
+    QueryPerformanceCounter(&end_time);
+
+  time_in_secs = (double)(end_time.QuadPart-start_time.QuadPart)/(double)freq.QuadPart;
+  return time_in_secs * 1000.0;
+
+}
+#else
+double GooTimer::getElapsed()
+{
+#warning "no support for GooTimer"
+  return 0;
+}
+#endif
+
diff --git a/goo/GooTimer.h b/goo/GooTimer.h
new file mode 100644 (file)
index 0000000..d77373e
--- /dev/null
@@ -0,0 +1,57 @@
+//========================================================================
+//
+// GooTimer.cc
+//
+// This file is licensed under GPLv2 or later
+//
+// Copyright 2005 Jonathan Blandford <jrb@redhat.com>
+// Copyright 2007 Krzysztof Kowalczyk <kkowalczyk@gmail.com>
+// Copyright 2010 Hib Eris <hib@hiberis.nl>
+// Copyright 2011 Albert Astals cid <aacid@kde.org>
+// Inspired by gtimer.c in glib, which is Copyright 2000 by the GLib Team
+//
+//========================================================================
+
+#ifndef GOOTIMER_H
+#define GOOTIMER_H
+
+#ifdef USE_GCC_PRAGMAS
+#pragma interface
+#endif
+
+#include "poppler-config.h"
+#include "gtypes.h"
+#ifdef HAVE_GETTIMEOFDAY
+#include <sys/time.h>
+#endif
+
+#ifdef _WIN32
+#include <windows.h>
+#endif
+
+//------------------------------------------------------------------------
+// GooTimer
+//------------------------------------------------------------------------
+
+class GooTimer {
+public:
+
+  // Create a new timer.
+  GooTimer();
+
+  void start();
+  void stop();
+  double getElapsed();
+
+private:
+#ifdef HAVE_GETTIMEOFDAY
+  struct timeval start_time;
+  struct timeval end_time;
+#elif defined(_WIN32)
+  LARGE_INTEGER start_time;
+  LARGE_INTEGER end_time;
+#endif
+  GBool active;
+};
+
+#endif
diff --git a/goo/ImgWriter.cc b/goo/ImgWriter.cc
new file mode 100644 (file)
index 0000000..a30d26d
--- /dev/null
@@ -0,0 +1,15 @@
+//========================================================================
+//
+// ImgWriter.cpp
+//
+// This file is licensed under the GPLv2 or later
+//
+// Copyright (C) 2009 Albert Astals Cid <aacid@kde.org>
+//
+//========================================================================
+
+#include "ImgWriter.h"
+
+ImgWriter::~ImgWriter()
+{
+}
diff --git a/goo/ImgWriter.h b/goo/ImgWriter.h
new file mode 100644 (file)
index 0000000..185c230
--- /dev/null
@@ -0,0 +1,33 @@
+//========================================================================
+//
+// ImgWriter.h
+//
+// This file is licensed under the GPLv2 or later
+//
+// Copyright (C) 2009 Stefan Thomas <thomas@eload24.com>
+// Copyright (C) 2009, 2011 Albert Astals Cid <aacid@kde.org>
+// Copyright (C) 2010 Adrian Johnson <ajohnson@redneon.com>
+// Copyright (C) 2010 Brian Cameron <brian.cameron@oracle.com>
+// Copyright (C) 2011 Thomas Freitag <Thomas.Freitag@alfa.de>
+//
+//========================================================================
+
+#ifndef IMGWRITER_H
+#define IMGWRITER_H
+
+#include <stdio.h>
+       
+class ImgWriter
+{
+       public:
+               virtual ~ImgWriter();
+               virtual bool init(FILE *f, int width, int height, int hDPI, int vDPI) = 0;
+               
+               virtual bool writePointers(unsigned char **rowPointers, int rowCount) = 0;
+               virtual bool writeRow(unsigned char **row) = 0;
+               
+               virtual bool close() = 0;
+               virtual bool supportCMYK() { return false; }
+};
+
+#endif
diff --git a/goo/JpegWriter.cc b/goo/JpegWriter.cc
new file mode 100644 (file)
index 0000000..2fe3d32
--- /dev/null
@@ -0,0 +1,147 @@
+//========================================================================
+//
+// JpegWriter.cc
+//
+// This file is licensed under the GPLv2 or later
+//
+// Copyright (C) 2009 Stefan Thomas <thomas@eload24.com>
+// Copyright (C) 2010, 2012 Adrian Johnson <ajohnson@redneon.com>
+// Copyright (C) 2010 Harry Roberts <harry.roberts@midnight-labs.org>
+// Copyright (C) 2011 Thomas Freitag <Thomas.Freitag@alfa.de>
+//
+//========================================================================
+
+#include "JpegWriter.h"
+
+#ifdef ENABLE_LIBJPEG
+
+#include "poppler/Error.h"
+
+void outputMessage(j_common_ptr cinfo)
+{
+       char buffer[JMSG_LENGTH_MAX];
+
+       // Create the message
+       (*cinfo->err->format_message) (cinfo, buffer);
+
+       // Send it to poppler's error handler
+       error(errInternal, -1, "{0:s}", buffer);
+}
+
+JpegWriter::JpegWriter(int q, bool p, J_COLOR_SPACE cm)
+: progressive(p), quality(q), colorMode(cm)
+{
+}
+
+JpegWriter::JpegWriter(J_COLOR_SPACE cm)
+: progressive(false), quality(-1), colorMode(cm)
+{
+}
+
+JpegWriter::~JpegWriter()
+{
+       // cleanup
+       jpeg_destroy_compress(&cinfo);
+}
+
+bool JpegWriter::init(FILE *f, int width, int height, int hDPI, int vDPI)
+{
+       // Setup error handler
+       cinfo.err = jpeg_std_error(&jerr);
+       jerr.output_message = &outputMessage;
+
+       // Initialize libjpeg
+       jpeg_create_compress(&cinfo);
+       
+        // Set colorspace and initialise defaults
+       cinfo.in_color_space = colorMode; /* colorspace of input image */
+       jpeg_set_defaults(&cinfo);
+
+       // Set destination file
+       jpeg_stdio_dest(&cinfo, f);
+       
+       // Set libjpeg configuration
+       cinfo.image_width = width;
+       cinfo.image_height = height;
+       cinfo.density_unit = 1; // dots per inch
+       cinfo.X_density = hDPI;
+       cinfo.Y_density = vDPI;
+       /* # of color components per pixel */
+       switch (colorMode) {
+               case JCS_GRAYSCALE:
+                       cinfo.input_components = 1;     
+                       break;
+               case JCS_RGB:
+                       cinfo.input_components = 3;     
+                       break;
+               case JCS_CMYK:
+                       cinfo.input_components = 4;     
+                       break;
+               default:
+                       return false;
+       }
+       if (cinfo.in_color_space == JCS_CMYK) {
+               jpeg_set_colorspace(&cinfo, JCS_YCCK);
+               cinfo.write_JFIF_header = TRUE;
+       }
+       
+       // Set quality
+       if( quality >= 0 && quality <= 100 ) { 
+               jpeg_set_quality(&cinfo, quality, true);
+       }
+       
+       // Use progressive mode
+       if( progressive) {
+               jpeg_simple_progression(&cinfo);
+       }
+       
+       // Get ready for data
+       jpeg_start_compress(&cinfo, TRUE);
+       
+       return true;
+}
+
+bool JpegWriter::writePointers(unsigned char **rowPointers, int rowCount)
+{
+       if (colorMode == JCS_CMYK) {
+               for (int y = 0; y < rowCount; y++) {
+                       unsigned char *row = rowPointers[y];
+                       for (unsigned int x = 0; x < cinfo.image_width; x++) {
+                               for (int n = 0; n < 4; n++) {
+                                       *row = 0xff - *row;
+                                       row++;
+                               }
+                       }
+               }
+       }
+       // Write all rows to the file
+       jpeg_write_scanlines(&cinfo, rowPointers, rowCount);
+       
+       return true;
+}
+
+bool JpegWriter::writeRow(unsigned char **rowPointer)
+{
+       if (colorMode == JCS_CMYK) {
+               unsigned char *row = rowPointer[0];
+               for (unsigned int x = 0; x < cinfo.image_width; x++) {
+                       for (int n = 0; n < 4; n++) {
+                               *row = 0xff - *row;
+                               row++;
+                       }
+               }
+       }
+       // Write the row to the file
+       jpeg_write_scanlines(&cinfo, rowPointer, 1);
+       
+       return true;
+}
+
+bool JpegWriter::close()
+{
+       jpeg_finish_compress(&cinfo);
+       
+       return true;
+}
+
+#endif
diff --git a/goo/JpegWriter.h b/goo/JpegWriter.h
new file mode 100644 (file)
index 0000000..d076224
--- /dev/null
@@ -0,0 +1,56 @@
+//========================================================================
+//
+// JpegWriter.h
+//
+// This file is licensed under the GPLv2 or later
+//
+// Copyright (C) 2009 Stefan Thomas <thomas@eload24.com>
+// Copyright (C) 2010 Adrian Johnson <ajohnson@redneon.com>
+// Copyright (C) 2010 Jürg Billeter <j@bitron.ch>
+// Copyright (C) 2010 Harry Roberts <harry.roberts@midnight-labs.org>
+// Copyright (C) 2010 Brian Cameron <brian.cameron@oracle.com>
+// Copyright (C) 2011 Albert Astals Cid <aacid@kde.org>
+// Copyright (C) 2011 Thomas Freitag <Thomas.Freitag@alfa.de>
+//
+//========================================================================
+
+#ifndef JPEGWRITER_H
+#define JPEGWRITER_H
+
+#include "poppler-config.h"
+
+#ifdef ENABLE_LIBJPEG
+
+#include <sys/types.h>
+#include "ImgWriter.h"
+
+extern "C" {
+#include <jpeglib.h>
+}
+
+class JpegWriter : public ImgWriter
+{
+       public:
+               JpegWriter(int quality, bool progressive, J_COLOR_SPACE colorMode = JCS_RGB);
+               JpegWriter(J_COLOR_SPACE colorMode = JCS_RGB);
+               ~JpegWriter();
+               
+               bool init(FILE *f, int width, int height, int hDPI, int vDPI);
+               
+               bool writePointers(unsigned char **rowPointers, int rowCount);
+               bool writeRow(unsigned char **row);
+               
+               bool close();
+               bool supportCMYK() { return colorMode == JCS_CMYK; }
+       
+       private:
+               bool progressive;
+               int quality;
+               J_COLOR_SPACE colorMode;
+               struct jpeg_compress_struct cinfo;
+               struct jpeg_error_mgr jerr;
+};
+
+#endif
+
+#endif
diff --git a/goo/Makefile.am b/goo/Makefile.am
new file mode 100644 (file)
index 0000000..f4f9730
--- /dev/null
@@ -0,0 +1,62 @@
+noinst_LTLIBRARIES = libgoo.la
+
+if ENABLE_XPDF_HEADERS
+
+poppler_goo_includedir = $(includedir)/poppler/goo
+poppler_goo_include_HEADERS =                  \
+       GooHash.h                               \
+       GooList.h                               \
+       GooTimer.h                              \
+       GooMutex.h                              \
+       GooString.h                             \
+       gtypes.h                                \
+       gmem.h                                  \
+       gfile.h                                 \
+       FixedPoint.h                            \
+       PNGWriter.h                             \
+       JpegWriter.h                            \
+       TiffWriter.h                            \
+       ImgWriter.h                             \
+       GooLikely.h                             \
+       gstrtod.h
+
+endif
+
+if BUILD_LIBJPEG
+libjpeg_includes = $(LIBJPEG_CFLAGS)
+endif
+
+if BUILD_LIBTIFF
+libtiff_includes = $(LIBTIFF_CFLAGS)
+endif
+
+if BUILD_LIBOPENJPEG
+libjpeg2000_includes = $(LIBOPENJPEG_CFLAGS)
+endif
+
+if BUILD_LIBPNG
+libpng_includes = $(LIBPNG_CFLAGS)
+endif
+
+INCLUDES =                                     \
+       -I$(top_srcdir)                         \
+       $(libjpeg_includes)                     \
+       $(libtiff_includes)                     \
+       $(libjpeg2000_includes)                 \
+       $(libpng_includes)
+
+libgoo_la_SOURCES =                            \
+       gfile.cc                                \
+       gmempp.cc                               \
+       GooHash.cc                              \
+       GooList.cc                              \
+       GooTimer.cc                             \
+       GooString.cc                            \
+       gmem.cc                                 \
+       FixedPoint.cc                           \
+       PNGWriter.cc                            \
+       JpegWriter.cc                           \
+       TiffWriter.cc                           \
+       ImgWriter.cc                            \
+       gtypes_p.h                              \
+       gstrtod.cc
diff --git a/goo/Makefile.in b/goo/Makefile.in
new file mode 100644 (file)
index 0000000..4e52ade
--- /dev/null
@@ -0,0 +1,737 @@
+# Makefile.in generated by automake 1.11.5 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software
+# Foundation, Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+@SET_MAKE@
+
+
+VPATH = @srcdir@
+am__make_dryrun = \
+  { \
+    am__dry=no; \
+    case $$MAKEFLAGS in \
+      *\\[\ \  ]*) \
+        echo 'am--echo: ; @echo "AM"  OK' | $(MAKE) -f - 2>/dev/null \
+          | grep '^AM OK$$' >/dev/null || am__dry=yes;; \
+      *) \
+        for am__flg in $$MAKEFLAGS; do \
+          case $$am__flg in \
+            *=*|--*) ;; \
+            *n*) am__dry=yes; break;; \
+          esac; \
+        done;; \
+    esac; \
+    test $$am__dry = yes; \
+  }
+pkgdatadir = $(datadir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkglibexecdir = $(libexecdir)/@PACKAGE@
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+subdir = goo
+DIST_COMMON = $(am__poppler_goo_include_HEADERS_DIST) \
+       $(srcdir)/Makefile.am $(srcdir)/Makefile.in
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/m4/acx_pthread.m4 \
+       $(top_srcdir)/m4/define-dir.m4 $(top_srcdir)/m4/gtk-doc.m4 \
+       $(top_srcdir)/m4/iconv.m4 $(top_srcdir)/m4/introspection.m4 \
+       $(top_srcdir)/m4/libjpeg.m4 $(top_srcdir)/m4/libtool.m4 \
+       $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \
+       $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \
+       $(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+       $(ACLOCAL_M4)
+mkinstalldirs = $(install_sh) -d
+CONFIG_HEADER = $(top_builddir)/config.h \
+       $(top_builddir)/poppler/poppler-config.h
+CONFIG_CLEAN_FILES =
+CONFIG_CLEAN_VPATH_FILES =
+LTLIBRARIES = $(noinst_LTLIBRARIES)
+libgoo_la_LIBADD =
+am_libgoo_la_OBJECTS = gfile.lo gmempp.lo GooHash.lo GooList.lo \
+       GooTimer.lo GooString.lo gmem.lo FixedPoint.lo PNGWriter.lo \
+       JpegWriter.lo TiffWriter.lo ImgWriter.lo gstrtod.lo
+libgoo_la_OBJECTS = $(am_libgoo_la_OBJECTS)
+AM_V_lt = $(am__v_lt_@AM_V@)
+am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@)
+am__v_lt_0 = --silent
+DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) -I$(top_builddir)/poppler
+depcomp = $(SHELL) $(top_srcdir)/depcomp
+am__depfiles_maybe = depfiles
+am__mv = mv -f
+CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
+       $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)
+LTCXXCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \
+       $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) \
+       $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
+       $(AM_CXXFLAGS) $(CXXFLAGS)
+AM_V_CXX = $(am__v_CXX_@AM_V@)
+am__v_CXX_ = $(am__v_CXX_@AM_DEFAULT_V@)
+am__v_CXX_0 = @echo "  CXX   " $@;
+AM_V_at = $(am__v_at_@AM_V@)
+am__v_at_ = $(am__v_at_@AM_DEFAULT_V@)
+am__v_at_0 = @
+CXXLD = $(CXX)
+CXXLINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \
+       $(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \
+       $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
+AM_V_CXXLD = $(am__v_CXXLD_@AM_V@)
+am__v_CXXLD_ = $(am__v_CXXLD_@AM_DEFAULT_V@)
+am__v_CXXLD_0 = @echo "  CXXLD " $@;
+COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
+       $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
+LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
+       $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \
+       $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
+       $(AM_CFLAGS) $(CFLAGS)
+AM_V_CC = $(am__v_CC_@AM_V@)
+am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@)
+am__v_CC_0 = @echo "  CC    " $@;
+CCLD = $(CC)
+LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
+       $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
+       $(AM_LDFLAGS) $(LDFLAGS) -o $@
+AM_V_CCLD = $(am__v_CCLD_@AM_V@)
+am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@)
+am__v_CCLD_0 = @echo "  CCLD  " $@;
+AM_V_GEN = $(am__v_GEN_@AM_V@)
+am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@)
+am__v_GEN_0 = @echo "  GEN   " $@;
+SOURCES = $(libgoo_la_SOURCES)
+DIST_SOURCES = $(libgoo_la_SOURCES)
+am__can_run_installinfo = \
+  case $$AM_UPDATE_INFO_DIR in \
+    n|no|NO) false;; \
+    *) (install-info --version) >/dev/null 2>&1;; \
+  esac
+am__poppler_goo_include_HEADERS_DIST = GooHash.h GooList.h GooTimer.h \
+       GooMutex.h GooString.h gtypes.h gmem.h gfile.h FixedPoint.h \
+       PNGWriter.h JpegWriter.h TiffWriter.h ImgWriter.h GooLikely.h \
+       gstrtod.h
+am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
+am__vpath_adj = case $$p in \
+    $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
+    *) f=$$p;; \
+  esac;
+am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`;
+am__install_max = 40
+am__nobase_strip_setup = \
+  srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'`
+am__nobase_strip = \
+  for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||"
+am__nobase_list = $(am__nobase_strip_setup); \
+  for p in $$list; do echo "$$p $$p"; done | \
+  sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \
+  $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \
+    if (++n[$$2] == $(am__install_max)) \
+      { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \
+    END { for (dir in files) print dir, files[dir] }'
+am__base_list = \
+  sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
+  sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
+am__uninstall_files_from_dir = { \
+  test -z "$$files" \
+    || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \
+    || { echo " ( cd '$$dir' && rm -f" $$files ")"; \
+         $(am__cd) "$$dir" && rm -f $$files; }; \
+  }
+am__installdirs = "$(DESTDIR)$(poppler_goo_includedir)"
+HEADERS = $(poppler_goo_include_HEADERS)
+ETAGS = etags
+CTAGS = ctags
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AR = @AR@
+AS = @AS@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CAIRO_CFLAGS = @CAIRO_CFLAGS@
+CAIRO_FEATURE = @CAIRO_FEATURE@
+CAIRO_LIBS = @CAIRO_LIBS@
+CAIRO_REQ = @CAIRO_REQ@
+CAIRO_VERSION = @CAIRO_VERSION@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CXX = @CXX@
+CXXCPP = @CXXCPP@
+CXXDEPMODE = @CXXDEPMODE@
+CXXFLAGS = @CXXFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DLLTOOL = @DLLTOOL@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+FGREP = @FGREP@
+FONTCONFIG_CFLAGS = @FONTCONFIG_CFLAGS@
+FONTCONFIG_LIBS = @FONTCONFIG_LIBS@
+FREETYPE_CFLAGS = @FREETYPE_CFLAGS@
+FREETYPE_CONFIG = @FREETYPE_CONFIG@
+FREETYPE_LIBS = @FREETYPE_LIBS@
+GLIB_MKENUMS = @GLIB_MKENUMS@
+GLIB_REQ = @GLIB_REQ@
+GLIB_REQUIRED = @GLIB_REQUIRED@
+GREP = @GREP@
+GTKDOC_CHECK = @GTKDOC_CHECK@
+GTKDOC_DEPS_CFLAGS = @GTKDOC_DEPS_CFLAGS@
+GTKDOC_DEPS_LIBS = @GTKDOC_DEPS_LIBS@
+GTKDOC_MKPDF = @GTKDOC_MKPDF@
+GTKDOC_REBASE = @GTKDOC_REBASE@
+GTK_TEST_CFLAGS = @GTK_TEST_CFLAGS@
+GTK_TEST_LIBS = @GTK_TEST_LIBS@
+HTML_DIR = @HTML_DIR@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+INTROSPECTION_CFLAGS = @INTROSPECTION_CFLAGS@
+INTROSPECTION_COMPILER = @INTROSPECTION_COMPILER@
+INTROSPECTION_GENERATE = @INTROSPECTION_GENERATE@
+INTROSPECTION_GIRDIR = @INTROSPECTION_GIRDIR@
+INTROSPECTION_LIBS = @INTROSPECTION_LIBS@
+INTROSPECTION_MAKEFILE = @INTROSPECTION_MAKEFILE@
+INTROSPECTION_SCANNER = @INTROSPECTION_SCANNER@
+INTROSPECTION_TYPELIBDIR = @INTROSPECTION_TYPELIBDIR@
+LCMS_CFLAGS = @LCMS_CFLAGS@
+LCMS_LIBS = @LCMS_LIBS@
+LD = @LD@
+LDFLAGS = @LDFLAGS@
+LIBCURL_CFLAGS = @LIBCURL_CFLAGS@
+LIBCURL_LIBS = @LIBCURL_LIBS@
+LIBICONV = @LIBICONV@
+LIBJPEG_CFLAGS = @LIBJPEG_CFLAGS@
+LIBJPEG_LIBS = @LIBJPEG_LIBS@
+LIBOBJS = @LIBOBJS@
+LIBOPENJPEG_CFLAGS = @LIBOPENJPEG_CFLAGS@
+LIBOPENJPEG_LIBS = @LIBOPENJPEG_LIBS@
+LIBPNG_CFLAGS = @LIBPNG_CFLAGS@
+LIBPNG_LIBS = @LIBPNG_LIBS@
+LIBS = @LIBS@
+LIBTIFF_CFLAGS = @LIBTIFF_CFLAGS@
+LIBTIFF_CFLAGSS = @LIBTIFF_CFLAGSS@
+LIBTIFF_LIBS = @LIBTIFF_LIBS@
+LIBTOOL = @LIBTOOL@
+LIPO = @LIPO@
+LN_S = @LN_S@
+LTLIBICONV = @LTLIBICONV@
+LTLIBOBJS = @LTLIBOBJS@
+MAKEINFO = @MAKEINFO@
+MANIFEST_TOOL = @MANIFEST_TOOL@
+MKDIR_P = @MKDIR_P@
+MOCQT4 = @MOCQT4@
+NM = @NM@
+NMEDIT = @NMEDIT@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+OTOOL = @OTOOL@
+OTOOL64 = @OTOOL64@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_URL = @PACKAGE_URL@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PC_REQUIRES = @PC_REQUIRES@
+PC_REQUIRES_PRIVATE = @PC_REQUIRES_PRIVATE@
+PDFTOCAIRO_CFLAGS = @PDFTOCAIRO_CFLAGS@
+PDFTOCAIRO_LIBS = @PDFTOCAIRO_LIBS@
+PKG_CONFIG = @PKG_CONFIG@
+PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@
+PKG_CONFIG_PATH = @PKG_CONFIG_PATH@
+POPPLER_DATADIR = @POPPLER_DATADIR@
+POPPLER_GLIB_CFLAGS = @POPPLER_GLIB_CFLAGS@
+POPPLER_GLIB_DISABLE_DEPRECATED = @POPPLER_GLIB_DISABLE_DEPRECATED@
+POPPLER_GLIB_DISABLE_SINGLE_INCLUDES = @POPPLER_GLIB_DISABLE_SINGLE_INCLUDES@
+POPPLER_GLIB_LIBS = @POPPLER_GLIB_LIBS@
+POPPLER_MAJOR_VERSION = @POPPLER_MAJOR_VERSION@
+POPPLER_MICRO_VERSION = @POPPLER_MICRO_VERSION@
+POPPLER_MINOR_VERSION = @POPPLER_MINOR_VERSION@
+POPPLER_QT4_CFLAGS = @POPPLER_QT4_CFLAGS@
+POPPLER_QT4_CXXFLAGS = @POPPLER_QT4_CXXFLAGS@
+POPPLER_QT4_LIBS = @POPPLER_QT4_LIBS@
+POPPLER_QT4_TEST_CFLAGS = @POPPLER_QT4_TEST_CFLAGS@
+POPPLER_QT4_TEST_LIBS = @POPPLER_QT4_TEST_LIBS@
+POPPLER_VERSION = @POPPLER_VERSION@
+PTHREAD_CC = @PTHREAD_CC@
+PTHREAD_CFLAGS = @PTHREAD_CFLAGS@
+PTHREAD_LIBS = @PTHREAD_LIBS@
+RANLIB = @RANLIB@
+SED = @SED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+TESTDATADIR = @TESTDATADIR@
+VERSION = @VERSION@
+XMKMF = @XMKMF@
+X_CFLAGS = @X_CFLAGS@
+X_EXTRA_LIBS = @X_EXTRA_LIBS@
+X_LIBS = @X_LIBS@
+X_PRE_LIBS = @X_PRE_LIBS@
+ZLIB_LIBS = @ZLIB_LIBS@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
+ac_ct_AR = @ac_ct_AR@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_CXX = @ac_ct_CXX@
+ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
+acx_pthread_config = @acx_pthread_config@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+auto_import_flags = @auto_import_flags@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+builddir = @builddir@
+create_shared_lib = @create_shared_lib@
+datadir = @datadir@
+datarootdir = @datarootdir@
+docdir = @docdir@
+dvidir = @dvidir@
+exec_prefix = @exec_prefix@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+htmldir = @htmldir@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localedir = @localedir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+srcdir = @srcdir@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+top_build_prefix = @top_build_prefix@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+win32_libs = @win32_libs@
+noinst_LTLIBRARIES = libgoo.la
+@ENABLE_XPDF_HEADERS_TRUE@poppler_goo_includedir = $(includedir)/poppler/goo
+@ENABLE_XPDF_HEADERS_TRUE@poppler_goo_include_HEADERS = \
+@ENABLE_XPDF_HEADERS_TRUE@     GooHash.h                               \
+@ENABLE_XPDF_HEADERS_TRUE@     GooList.h                               \
+@ENABLE_XPDF_HEADERS_TRUE@     GooTimer.h                              \
+@ENABLE_XPDF_HEADERS_TRUE@     GooMutex.h                              \
+@ENABLE_XPDF_HEADERS_TRUE@     GooString.h                             \
+@ENABLE_XPDF_HEADERS_TRUE@     gtypes.h                                \
+@ENABLE_XPDF_HEADERS_TRUE@     gmem.h                                  \
+@ENABLE_XPDF_HEADERS_TRUE@     gfile.h                                 \
+@ENABLE_XPDF_HEADERS_TRUE@     FixedPoint.h                            \
+@ENABLE_XPDF_HEADERS_TRUE@     PNGWriter.h                             \
+@ENABLE_XPDF_HEADERS_TRUE@     JpegWriter.h                            \
+@ENABLE_XPDF_HEADERS_TRUE@     TiffWriter.h                            \
+@ENABLE_XPDF_HEADERS_TRUE@     ImgWriter.h                             \
+@ENABLE_XPDF_HEADERS_TRUE@     GooLikely.h                             \
+@ENABLE_XPDF_HEADERS_TRUE@     gstrtod.h
+
+@BUILD_LIBJPEG_TRUE@libjpeg_includes = $(LIBJPEG_CFLAGS)
+@BUILD_LIBTIFF_TRUE@libtiff_includes = $(LIBTIFF_CFLAGS)
+@BUILD_LIBOPENJPEG_TRUE@libjpeg2000_includes = $(LIBOPENJPEG_CFLAGS)
+@BUILD_LIBPNG_TRUE@libpng_includes = $(LIBPNG_CFLAGS)
+INCLUDES = \
+       -I$(top_srcdir)                         \
+       $(libjpeg_includes)                     \
+       $(libtiff_includes)                     \
+       $(libjpeg2000_includes)                 \
+       $(libpng_includes)
+
+libgoo_la_SOURCES = \
+       gfile.cc                                \
+       gmempp.cc                               \
+       GooHash.cc                              \
+       GooList.cc                              \
+       GooTimer.cc                             \
+       GooString.cc                            \
+       gmem.cc                                 \
+       FixedPoint.cc                           \
+       PNGWriter.cc                            \
+       JpegWriter.cc                           \
+       TiffWriter.cc                           \
+       ImgWriter.cc                            \
+       gtypes_p.h                              \
+       gstrtod.cc
+
+all: all-am
+
+.SUFFIXES:
+.SUFFIXES: .cc .lo .o .obj
+$(srcdir)/Makefile.in:  $(srcdir)/Makefile.am  $(am__configure_deps)
+       @for dep in $?; do \
+         case '$(am__configure_deps)' in \
+           *$$dep*) \
+             ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
+               && { if test -f $@; then exit 0; else break; fi; }; \
+             exit 1;; \
+         esac; \
+       done; \
+       echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign goo/Makefile'; \
+       $(am__cd) $(top_srcdir) && \
+         $(AUTOMAKE) --foreign goo/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+       @case '$?' in \
+         *config.status*) \
+           cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+         *) \
+           echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+           cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+       esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+       cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure:  $(am__configure_deps)
+       cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4):  $(am__aclocal_m4_deps)
+       cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(am__aclocal_m4_deps):
+
+clean-noinstLTLIBRARIES:
+       -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES)
+       @list='$(noinst_LTLIBRARIES)'; for p in $$list; do \
+         dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \
+         test "$$dir" != "$$p" || dir=.; \
+         echo "rm -f \"$${dir}/so_locations\""; \
+         rm -f "$${dir}/so_locations"; \
+       done
+libgoo.la: $(libgoo_la_OBJECTS) $(libgoo_la_DEPENDENCIES) $(EXTRA_libgoo_la_DEPENDENCIES) 
+       $(AM_V_CXXLD)$(CXXLINK)  $(libgoo_la_OBJECTS) $(libgoo_la_LIBADD) $(LIBS)
+
+mostlyclean-compile:
+       -rm -f *.$(OBJEXT)
+
+distclean-compile:
+       -rm -f *.tab.c
+
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FixedPoint.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/GooHash.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/GooList.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/GooString.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/GooTimer.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ImgWriter.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/JpegWriter.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/PNGWriter.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/TiffWriter.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gfile.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gmem.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gmempp.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gstrtod.Plo@am__quote@
+
+.cc.o:
+@am__fastdepCXX_TRUE@  $(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
+@am__fastdepCXX_TRUE@  $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ $<
+
+.cc.obj:
+@am__fastdepCXX_TRUE@  $(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'`
+@am__fastdepCXX_TRUE@  $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
+
+.cc.lo:
+@am__fastdepCXX_TRUE@  $(AM_V_CXX)$(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
+@am__fastdepCXX_TRUE@  $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     $(AM_V_CXX)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LTCXXCOMPILE) -c -o $@ $<
+
+mostlyclean-libtool:
+       -rm -f *.lo
+
+clean-libtool:
+       -rm -rf .libs _libs
+install-poppler_goo_includeHEADERS: $(poppler_goo_include_HEADERS)
+       @$(NORMAL_INSTALL)
+       @list='$(poppler_goo_include_HEADERS)'; test -n "$(poppler_goo_includedir)" || list=; \
+       if test -n "$$list"; then \
+         echo " $(MKDIR_P) '$(DESTDIR)$(poppler_goo_includedir)'"; \
+         $(MKDIR_P) "$(DESTDIR)$(poppler_goo_includedir)" || exit 1; \
+       fi; \
+       for p in $$list; do \
+         if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+         echo "$$d$$p"; \
+       done | $(am__base_list) | \
+       while read files; do \
+         echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(poppler_goo_includedir)'"; \
+         $(INSTALL_HEADER) $$files "$(DESTDIR)$(poppler_goo_includedir)" || exit $$?; \
+       done
+
+uninstall-poppler_goo_includeHEADERS:
+       @$(NORMAL_UNINSTALL)
+       @list='$(poppler_goo_include_HEADERS)'; test -n "$(poppler_goo_includedir)" || list=; \
+       files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
+       dir='$(DESTDIR)$(poppler_goo_includedir)'; $(am__uninstall_files_from_dir)
+
+ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
+       list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+       unique=`for i in $$list; do \
+           if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+         done | \
+         $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
+             END { if (nonempty) { for (i in files) print i; }; }'`; \
+       mkid -fID $$unique
+tags: TAGS
+
+TAGS:  $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
+               $(TAGS_FILES) $(LISP)
+       set x; \
+       here=`pwd`; \
+       list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
+       unique=`for i in $$list; do \
+           if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+         done | \
+         $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
+             END { if (nonempty) { for (i in files) print i; }; }'`; \
+       shift; \
+       if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
+         test -n "$$unique" || unique=$$empty_fix; \
+         if test $$# -gt 0; then \
+           $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+             "$$@" $$unique; \
+         else \
+           $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+             $$unique; \
+         fi; \
+       fi
+ctags: CTAGS
+CTAGS:  $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
+               $(TAGS_FILES) $(LISP)
+       list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
+       unique=`for i in $$list; do \
+           if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+         done | \
+         $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
+             END { if (nonempty) { for (i in files) print i; }; }'`; \
+       test -z "$(CTAGS_ARGS)$$unique" \
+         || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+            $$unique
+
+GTAGS:
+       here=`$(am__cd) $(top_builddir) && pwd` \
+         && $(am__cd) $(top_srcdir) \
+         && gtags -i $(GTAGS_ARGS) "$$here"
+
+distclean-tags:
+       -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+
+distdir: $(DISTFILES)
+       @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+       topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+       list='$(DISTFILES)'; \
+         dist_files=`for file in $$list; do echo $$file; done | \
+         sed -e "s|^$$srcdirstrip/||;t" \
+             -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+       case $$dist_files in \
+         */*) $(MKDIR_P) `echo "$$dist_files" | \
+                          sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+                          sort -u` ;; \
+       esac; \
+       for file in $$dist_files; do \
+         if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+         if test -d $$d/$$file; then \
+           dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+           if test -d "$(distdir)/$$file"; then \
+             find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+           fi; \
+           if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+             cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
+             find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+           fi; \
+           cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
+         else \
+           test -f "$(distdir)/$$file" \
+           || cp -p $$d/$$file "$(distdir)/$$file" \
+           || exit 1; \
+         fi; \
+       done
+check-am: all-am
+check: check-am
+all-am: Makefile $(LTLIBRARIES) $(HEADERS)
+installdirs:
+       for dir in "$(DESTDIR)$(poppler_goo_includedir)"; do \
+         test -z "$$dir" || $(MKDIR_P) "$$dir"; \
+       done
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+       @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+       if test -z '$(STRIP)'; then \
+         $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+           install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+             install; \
+       else \
+         $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+           install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+           "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
+       fi
+mostlyclean-generic:
+
+clean-generic:
+
+distclean-generic:
+       -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+       -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
+
+maintainer-clean-generic:
+       @echo "This command is intended for maintainers to use"
+       @echo "it deletes files that may require special tools to rebuild."
+clean: clean-am
+
+clean-am: clean-generic clean-libtool clean-noinstLTLIBRARIES \
+       mostlyclean-am
+
+distclean: distclean-am
+       -rm -rf ./$(DEPDIR)
+       -rm -f Makefile
+distclean-am: clean-am distclean-compile distclean-generic \
+       distclean-tags
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+html-am:
+
+info: info-am
+
+info-am:
+
+install-data-am: install-poppler_goo_includeHEADERS
+
+install-dvi: install-dvi-am
+
+install-dvi-am:
+
+install-exec-am:
+
+install-html: install-html-am
+
+install-html-am:
+
+install-info: install-info-am
+
+install-info-am:
+
+install-man:
+
+install-pdf: install-pdf-am
+
+install-pdf-am:
+
+install-ps: install-ps-am
+
+install-ps-am:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+       -rm -rf ./$(DEPDIR)
+       -rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-compile mostlyclean-generic \
+       mostlyclean-libtool
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am: uninstall-poppler_goo_includeHEADERS
+
+.MAKE: install-am install-strip
+
+.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \
+       clean-libtool clean-noinstLTLIBRARIES ctags distclean \
+       distclean-compile distclean-generic distclean-libtool \
+       distclean-tags distdir dvi dvi-am html html-am info info-am \
+       install install-am install-data install-data-am install-dvi \
+       install-dvi-am install-exec install-exec-am install-html \
+       install-html-am install-info install-info-am install-man \
+       install-pdf install-pdf-am install-poppler_goo_includeHEADERS \
+       install-ps install-ps-am install-strip installcheck \
+       installcheck-am installdirs maintainer-clean \
+       maintainer-clean-generic mostlyclean mostlyclean-compile \
+       mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \
+       tags uninstall uninstall-am \
+       uninstall-poppler_goo_includeHEADERS
+
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/goo/PNGWriter.cc b/goo/PNGWriter.cc
new file mode 100644 (file)
index 0000000..fe8b79e
--- /dev/null
@@ -0,0 +1,176 @@
+//========================================================================
+//
+// PNGWriter.cc
+//
+// This file is licensed under the GPLv2 or later
+//
+// Copyright (C) 2009 Warren Toomey <wkt@tuhs.org>
+// Copyright (C) 2009 Shen Liang <shenzhuxi@gmail.com>
+// Copyright (C) 2009, 2011 Albert Astals Cid <aacid@kde.org>
+// Copyright (C) 2009 Stefan Thomas <thomas@eload24.com>
+// Copyright (C) 2010, 2011 Adrian Johnson <ajohnson@redneon.com>
+// Copyright (C) 2011 Thomas Klausner <wiz@danbala.tuwien.ac.at>
+//
+//========================================================================
+
+#include "PNGWriter.h"
+
+#ifdef ENABLE_LIBPNG
+
+#include <zlib.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "poppler/Error.h"
+#include "goo/gmem.h"
+
+PNGWriter::PNGWriter(Format formatA) : format(formatA)
+{
+       icc_data = NULL;
+       icc_data_size = 0;
+       icc_name = NULL;
+       sRGB_profile = false;
+}
+
+PNGWriter::~PNGWriter()
+{
+       /* cleanup heap allocation */
+       png_destroy_write_struct(&png_ptr, &info_ptr);
+       if (icc_data) {
+               gfree(icc_data);
+               free(icc_name);
+       }
+}
+
+void PNGWriter::setICCProfile(const char *name, unsigned char *data, int size)
+{
+       icc_data = (unsigned char *)gmalloc(size);
+       memcpy(icc_data, data, size);
+       icc_data_size = size;
+       icc_name = strdup(name);
+}
+
+void PNGWriter::setSRGBProfile()
+{
+       sRGB_profile = true;
+}
+
+bool PNGWriter::init(FILE *f, int width, int height, int hDPI, int vDPI)
+{
+  /* libpng changed the png_set_iCCP() prototype in 1.5.0 */
+#if PNG_LIBPNG_VER < 10500
+        png_charp icc_data_ptr = (png_charp)icc_data;
+#else
+        png_const_bytep icc_data_ptr = (png_const_bytep)icc_data;
+#endif
+
+       /* initialize stuff */
+       png_ptr = png_create_write_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL);
+       if (!png_ptr) {
+               error(errInternal, -1, "png_create_write_struct failed");
+               return false;
+       }
+
+       info_ptr = png_create_info_struct(png_ptr);
+       if (!info_ptr) {
+               error(errInternal, -1, "png_create_info_struct failed");
+               return false;
+       }
+
+       if (setjmp(png_jmpbuf(png_ptr))) {
+               error(errInternal, -1, "png_jmpbuf failed");
+               return false;
+       }
+
+       /* write header */
+       png_init_io(png_ptr, f);
+       if (setjmp(png_jmpbuf(png_ptr))) {
+               error(errInternal, -1, "Error during writing header");
+               return false;
+       }
+       
+       // Set up the type of PNG image and the compression level
+       png_set_compression_level(png_ptr, Z_BEST_COMPRESSION);
+
+       // Silence silly gcc
+       png_byte bit_depth = -1;
+       png_byte color_type = -1;
+       switch (format) {
+               case RGB:
+                       bit_depth = 8;
+                       color_type = PNG_COLOR_TYPE_RGB;
+                       break;
+               case RGBA:
+                       bit_depth = 8;
+                       color_type = PNG_COLOR_TYPE_RGB_ALPHA;
+                       break;
+               case GRAY:
+                       bit_depth = 8;
+                       color_type = PNG_COLOR_TYPE_GRAY;
+                       break;
+               case MONOCHROME:
+                       bit_depth = 1;
+                       color_type = PNG_COLOR_TYPE_GRAY;
+                       break;
+       }
+       png_byte interlace_type = PNG_INTERLACE_NONE;
+
+       png_set_IHDR(png_ptr, info_ptr, width, height, bit_depth, color_type, interlace_type, PNG_COMPRESSION_TYPE_DEFAULT, PNG_FILTER_TYPE_DEFAULT);
+
+       png_set_pHYs(png_ptr, info_ptr, hDPI/0.0254, vDPI/0.0254, PNG_RESOLUTION_METER);
+
+       if (icc_data)
+               png_set_iCCP(png_ptr, info_ptr, icc_name, PNG_COMPRESSION_TYPE_BASE, icc_data_ptr, icc_data_size);
+       else if (sRGB_profile)
+               png_set_sRGB(png_ptr, info_ptr, PNG_sRGB_INTENT_RELATIVE);
+
+       png_write_info(png_ptr, info_ptr);
+       if (setjmp(png_jmpbuf(png_ptr))) {
+               error(errInternal, -1, "error during writing png info bytes");
+               return false;
+       }
+
+       // pack 1 pixel/byte rows into 8 pixels/byte
+       if (format == MONOCHROME)
+               png_set_packing(png_ptr);
+
+       return true;
+}
+
+bool PNGWriter::writePointers(unsigned char **rowPointers, int rowCount)
+{
+       png_write_image(png_ptr, rowPointers);
+       /* write bytes */
+       if (setjmp(png_jmpbuf(png_ptr))) {
+               error(errInternal, -1, "Error during writing bytes");
+               return false;
+       }
+       
+       return true;
+}
+
+bool PNGWriter::writeRow(unsigned char **row)
+{
+       // Write the row to the file
+       png_write_rows(png_ptr, row, 1);
+       if (setjmp(png_jmpbuf(png_ptr))) {
+               error(errInternal, -1, "error during png row write");
+               return false;
+       }
+       
+       return true;
+}
+
+bool PNGWriter::close()
+{
+       /* end write */
+       png_write_end(png_ptr, info_ptr);
+       if (setjmp(png_jmpbuf(png_ptr))) {
+               error(errInternal, -1, "Error during end of write");
+               return false;
+       }
+       
+       return true;
+}
+
+#endif
diff --git a/goo/PNGWriter.h b/goo/PNGWriter.h
new file mode 100644 (file)
index 0000000..9e412b4
--- /dev/null
@@ -0,0 +1,63 @@
+//========================================================================
+//
+// PNGWriter.h
+//
+// This file is licensed under the GPLv2 or later
+//
+// Copyright (C) 2009 Warren Toomey <wkt@tuhs.org>
+// Copyright (C) 2009 Shen Liang <shenzhuxi@gmail.com>
+// Copyright (C) 2009, 2011 Albert Astals Cid <aacid@kde.org>
+// Copyright (C) 2009 Stefan Thomas <thomas@eload24.com>
+// Copyright (C) 2010, 2011 Adrian Johnson <ajohnson@redneon.com>
+//
+//========================================================================
+
+#ifndef PNGWRITER_H
+#define PNGWRITER_H
+
+#include "poppler-config.h"
+
+#ifdef ENABLE_LIBPNG
+
+#include <cstdio>
+#include <png.h>
+#include "ImgWriter.h"
+
+class PNGWriter : public ImgWriter
+{
+       public:
+
+               /* RGB        - 3 bytes/pixel
+                * RGBA       - 4 bytes/pixel
+                * GRAY       - 1 byte/pixel
+                * MONOCHROME - 1 byte/pixel. PNGWriter will bitpack to 8 pixels/byte
+                */
+               enum Format { RGB, RGBA, GRAY, MONOCHROME };
+
+               PNGWriter(Format format = RGB);
+               ~PNGWriter();
+
+               void setICCProfile(const char *name, unsigned char *data, int size);
+               void setSRGBProfile();
+
+               
+               bool init(FILE *f, int width, int height, int hDPI, int vDPI);
+               
+               bool writePointers(unsigned char **rowPointers, int rowCount);
+               bool writeRow(unsigned char **row);
+               
+               bool close();
+       
+       private:
+               Format format;
+               png_structp png_ptr;
+               png_infop info_ptr;
+               unsigned char *icc_data;
+               int icc_data_size;
+               char *icc_name;
+               bool sRGB_profile;
+};
+
+#endif
+
+#endif
diff --git a/goo/TiffWriter.cc b/goo/TiffWriter.cc
new file mode 100644 (file)
index 0000000..f63b245
--- /dev/null
@@ -0,0 +1,202 @@
+//========================================================================
+//
+// TiffWriter.cc
+//
+// This file is licensed under the GPLv2 or later
+//
+// Copyright (C) 2010 William Bader <williambader@hotmail.com>
+//
+//========================================================================
+
+#include "TiffWriter.h"
+
+#if ENABLE_LIBTIFF
+
+#include <string.h>
+
+TiffWriter::~TiffWriter()
+{
+  // no cleanup needed
+}
+
+TiffWriter::TiffWriter()
+{
+  f = NULL;
+  numRows = 0;
+  curRow = 0;
+  compressionString = NULL;
+  splashMode = splashModeRGB8;
+}
+
+// Set the compression type
+
+void TiffWriter::setCompressionString(const char *compressionStringArg)
+{
+  compressionString = compressionStringArg;
+}
+
+// Set the bitmap mode
+
+void TiffWriter::setSplashMode(SplashColorMode splashModeArg)
+{
+  splashMode = splashModeArg;
+}
+
+// Write a TIFF file.
+
+bool TiffWriter::init(FILE *openedFile, int width, int height, int hDPI, int vDPI)
+{
+  unsigned int compression;
+  uint16 photometric;
+  uint32 rowsperstrip = (uint32) -1;
+  int bitspersample;
+  uint16 samplesperpixel;
+  const struct compression_name_tag {
+    const char *compressionName;               // name of the compression option from the command line
+    unsigned int compressionCode;              // internal libtiff code
+    const char *compressionDescription;                // descriptive name
+  } compressionList[] = {
+    { "none",  COMPRESSION_NONE,       "no compression" },
+    { "ccittrle", COMPRESSION_CCITTRLE,        "CCITT modified Huffman RLE" },
+    { "ccittfax3", COMPRESSION_CCITTFAX3,"CCITT Group 3 fax encoding" },
+    { "ccittt4", COMPRESSION_CCITT_T4, "CCITT T.4 (TIFF 6 name)" },
+    { "ccittfax4", COMPRESSION_CCITTFAX4, "CCITT Group 4 fax encoding" },
+    { "ccittt6", COMPRESSION_CCITT_T6, "CCITT T.6 (TIFF 6 name)" },
+    { "lzw",   COMPRESSION_LZW,        "Lempel-Ziv  & Welch" },
+    { "ojpeg", COMPRESSION_OJPEG,      "!6.0 JPEG" },
+    { "jpeg",  COMPRESSION_JPEG,       "%JPEG DCT compression" },
+    { "next",  COMPRESSION_NEXT,       "NeXT 2-bit RLE" },
+    { "packbits", COMPRESSION_PACKBITS,        "Macintosh RLE" },
+    { "ccittrlew", COMPRESSION_CCITTRLEW, "CCITT modified Huffman RLE w/ word alignment" },
+    { "deflate", COMPRESSION_DEFLATE,  "Deflate compression" },
+    { "adeflate", COMPRESSION_ADOBE_DEFLATE, "Deflate compression, as recognized by Adobe" },
+    { "dcs",   COMPRESSION_DCS,        "Kodak DCS encoding" },
+    { "jbig",  COMPRESSION_JBIG,       "ISO JBIG" },
+    { "jp2000",        COMPRESSION_JP2000,     "Leadtools JPEG2000" },
+    { NULL,    0,                      NULL }
+  };
+
+  // Initialize
+
+  f = NULL;
+  curRow = 0;
+
+  // Store the number of rows
+
+  numRows = height;
+
+  // Set the compression
+
+  compression = COMPRESSION_NONE;
+
+  if (compressionString == NULL || strcmp(compressionString, "") == 0) {
+    compression = COMPRESSION_NONE;
+  } else {
+    int i;
+    for (i = 0; compressionList[i].compressionName != NULL; i++) {
+      if (strcmp(compressionString, compressionList[i].compressionName) == 0) {
+       compression = compressionList[i].compressionCode;
+       break;
+      }
+    }
+    if (compressionList[i].compressionName == NULL) {
+      fprintf(stderr, "TiffWriter: Unknown compression type '%.10s', using 'none'.\n", compressionString);
+      fprintf(stderr, "Known compression types (the tiff library might not support every type)\n");
+      for (i = 0; compressionList[i].compressionName != NULL; i++) {
+       fprintf(stderr, "%10s %s\n", compressionList[i].compressionName, compressionList[i].compressionDescription);
+      }
+    }
+  }
+
+  // Set bits per sample, samples per pixel, and photometric type from the splash mode
+
+  bitspersample = (splashMode == splashModeMono1? 1: 8);
+
+  switch (splashMode) {
+
+  case splashModeMono1:
+  case splashModeMono8:
+    samplesperpixel = 1;
+    photometric = PHOTOMETRIC_MINISBLACK;
+    break;
+
+  case splashModeRGB8:
+  case splashModeBGR8:
+    samplesperpixel = 3;
+    photometric = PHOTOMETRIC_RGB;
+    break;
+
+  default:
+    fprintf(stderr, "TiffWriter: Mode %d not supported\n", splashMode);
+    return false;
+  }
+
+  // Open the file
+
+  if (openedFile == NULL) {
+    fprintf(stderr, "TiffWriter: No output file given.\n");
+    return false;
+  }
+
+  f = TIFFFdOpen(fileno(openedFile), "-", "w");
+
+  if (!f) {
+    return false;
+  }
+
+  // Set TIFF tags
+
+  TIFFSetField(f, TIFFTAG_IMAGEWIDTH,  width);
+  TIFFSetField(f, TIFFTAG_IMAGELENGTH, height);
+  TIFFSetField(f, TIFFTAG_ORIENTATION, ORIENTATION_TOPLEFT);
+  TIFFSetField(f, TIFFTAG_SAMPLESPERPIXEL, samplesperpixel);
+  TIFFSetField(f, TIFFTAG_BITSPERSAMPLE, bitspersample);
+  TIFFSetField(f, TIFFTAG_PLANARCONFIG, PLANARCONFIG_CONTIG);
+  TIFFSetField(f, TIFFTAG_PHOTOMETRIC, photometric);
+  TIFFSetField(f, TIFFTAG_COMPRESSION, (uint16) compression);
+  TIFFSetField(f, TIFFTAG_ROWSPERSTRIP, TIFFDefaultStripSize(f, rowsperstrip));
+  TIFFSetField(f, TIFFTAG_XRESOLUTION, (double) hDPI);
+  TIFFSetField(f, TIFFTAG_YRESOLUTION, (double) vDPI);
+  TIFFSetField(f, TIFFTAG_RESOLUTIONUNIT, RESUNIT_INCH);
+
+  return true;
+}
+
+bool TiffWriter::writePointers(unsigned char **rowPointers, int rowCount)
+{
+  // Write all rows to the file
+
+  for (int row = 0; row < rowCount; row++) {
+    if (TIFFWriteScanline(f, rowPointers[row], row, 0) < 0) {
+      fprintf(stderr, "TiffWriter: Error writing tiff row %d\n", row);
+      return false;
+    }
+  }
+
+  return true;
+}
+
+bool TiffWriter::writeRow(unsigned char **rowData)
+{
+  // Add a single row
+
+  if (TIFFWriteScanline(f, *rowData, curRow, 0) < 0) {
+    fprintf(stderr, "TiffWriter: Error writing tiff row %d\n", curRow);
+    return false;
+  }
+
+  curRow++;
+
+  return true;
+}
+
+bool TiffWriter::close()
+{
+  // Close the file
+
+  TIFFClose(f);
+
+  return true;
+}
+
+#endif
diff --git a/goo/TiffWriter.h b/goo/TiffWriter.h
new file mode 100644 (file)
index 0000000..1f4b5eb
--- /dev/null
@@ -0,0 +1,54 @@
+//========================================================================
+//
+// TiffWriter.h
+//
+// This file is licensed under the GPLv2 or later
+//
+// Copyright (C) 2010 William Bader <williambader@hotmail.com>
+// Copyright (C) 2011 Albert Astals Cid <aacid@kde.org>
+//
+//========================================================================
+
+#ifndef TIFFWRITER_H
+#define TIFFWRITER_H
+
+#include "poppler-config.h"
+
+#ifdef ENABLE_LIBTIFF
+
+#include <sys/types.h>
+#include "ImgWriter.h"
+#include "splash/SplashTypes.h"
+
+extern "C" {
+#include "tiffio.h"
+}
+
+class TiffWriter : public ImgWriter
+{
+       public:
+               TiffWriter();
+               ~TiffWriter();
+               
+               void setCompressionString(const char *compressionStringArg);
+               void setSplashMode(SplashColorMode splashModeArg);
+
+               bool init(FILE *openedFile, int width, int height, int hDPI, int vDPI);
+               
+               bool writePointers(unsigned char **rowPointers, int rowCount);
+               bool writeRow(unsigned char **rowData);
+               
+               bool close();
+       
+       private:
+               TIFF *f;                                // LibTiff file context
+               int numRows;                            // number of rows in the image
+               int curRow;                             // number of rows written
+               const char *compressionString;          // compression type
+               SplashColorMode splashMode;             // format of image data
+
+};
+
+#endif
+
+#endif
diff --git a/goo/gfile.cc b/goo/gfile.cc
new file mode 100644 (file)
index 0000000..7522424
--- /dev/null
@@ -0,0 +1,827 @@
+//========================================================================
+//
+// gfile.cc
+//
+// Miscellaneous file and directory name manipulation.
+//
+// Copyright 1996-2003 Glyph & Cog, LLC
+//
+//========================================================================
+
+//========================================================================
+//
+// Modified under the Poppler project - http://poppler.freedesktop.org
+//
+// All changes made under the Poppler project to this file are licensed
+// under GPL version 2 or later
+//
+// Copyright (C) 2006 Takashi Iwai <tiwai@suse.de>
+// Copyright (C) 2006 Kristian Høgsberg <krh@redhat.com>
+// Copyright (C) 2008 Adam Batkin <adam@batkin.net>
+// Copyright (C) 2008, 2010 Hib Eris <hib@hiberis.nl>
+// Copyright (C) 2009 Albert Astals Cid <aacid@kde.org>
+// Copyright (C) 2009 Kovid Goyal <kovid@kovidgoyal.net>
+//
+// To see a description of the changes please see the Changelog file that
+// came with your tarball or type make ChangeLog if you are building from git
+//
+//========================================================================
+
+#include <config.h>
+
+#ifdef _WIN32
+#  include <time.h>
+#else
+#  if defined(MACOS)
+#    include <sys/stat.h>
+#  elif !defined(ACORN)
+#    include <sys/types.h>
+#    include <sys/stat.h>
+#    include <fcntl.h>
+#  endif
+#  include <time.h>
+#  include <limits.h>
+#  include <string.h>
+#  if !defined(VMS) && !defined(ACORN) && !defined(MACOS)
+#    include <pwd.h>
+#  endif
+#  if defined(VMS) && (__DECCXX_VER < 50200000)
+#    include <unixlib.h>
+#  endif
+#endif // _WIN32
+#include "GooString.h"
+#include "gfile.h"
+
+// Some systems don't define this, so just make it something reasonably
+// large.
+#ifndef PATH_MAX
+#define PATH_MAX 1024
+#endif
+
+//------------------------------------------------------------------------
+
+GooString *getHomeDir() {
+#ifdef VMS
+  //---------- VMS ----------
+  return new GooString("SYS$LOGIN:");
+
+#elif defined(__EMX__) || defined(_WIN32)
+  //---------- OS/2+EMX and Win32 ----------
+  char *s;
+  GooString *ret;
+
+  if ((s = getenv("HOME")))
+    ret = new GooString(s);
+  else
+    ret = new GooString(".");
+  return ret;
+
+#elif defined(ACORN)
+  //---------- RISCOS ----------
+  return new GooString("@");
+
+#elif defined(MACOS)
+  //---------- MacOS ----------
+  return new GooString(":");
+
+#else
+  //---------- Unix ----------
+  char *s;
+  struct passwd *pw;
+  GooString *ret;
+
+  if ((s = getenv("HOME"))) {
+    ret = new GooString(s);
+  } else {
+    if ((s = getenv("USER")))
+      pw = getpwnam(s);
+    else
+      pw = getpwuid(getuid());
+    if (pw)
+      ret = new GooString(pw->pw_dir);
+    else
+      ret = new GooString(".");
+  }
+  return ret;
+#endif
+}
+
+GooString *getCurrentDir() {
+  char buf[PATH_MAX+1];
+
+#if defined(__EMX__)
+  if (_getcwd2(buf, sizeof(buf)))
+#elif defined(_WIN32)
+  if (GetCurrentDirectory(sizeof(buf), buf))
+#elif defined(ACORN)
+  if (strcpy(buf, "@"))
+#elif defined(MACOS)
+  if (strcpy(buf, ":"))
+#else
+  if (getcwd(buf, sizeof(buf)))
+#endif
+    return new GooString(buf);
+  return new GooString();
+}
+
+GooString *appendToPath(GooString *path, const char *fileName) {
+#if defined(VMS)
+  //---------- VMS ----------
+  //~ this should handle everything necessary for file
+  //~ requesters, but it's certainly not complete
+  char *p0, *p1, *p2;
+  char *q1;
+
+  p0 = path->getCString();
+  p1 = p0 + path->getLength() - 1;
+  if (!strcmp(fileName, "-")) {
+    if (*p1 == ']') {
+      for (p2 = p1; p2 > p0 && *p2 != '.' && *p2 != '['; --p2) ;
+      if (*p2 == '[')
+       ++p2;
+      path->del(p2 - p0, p1 - p2);
+    } else if (*p1 == ':') {
+      path->append("[-]");
+    } else {
+      path->clear();
+      path->append("[-]");
+    }
+  } else if ((q1 = strrchr(fileName, '.')) && !strncmp(q1, ".DIR;", 5)) {
+    if (*p1 == ']') {
+      path->insert(p1 - p0, '.');
+      path->insert(p1 - p0 + 1, fileName, q1 - fileName);
+    } else if (*p1 == ':') {
+      path->append('[');
+      path->append(']');
+      path->append(fileName, q1 - fileName);
+    } else {
+      path->clear();
+      path->append(fileName, q1 - fileName);
+    }
+  } else {
+    if (*p1 != ']' && *p1 != ':')
+      path->clear();
+    path->append(fileName);
+  }
+  return path;
+
+#elif defined(_WIN32)
+  //---------- Win32 ----------
+  GooString *tmp;
+  char buf[256];
+  char *fp;
+
+  tmp = new GooString(path);
+  tmp->append('/');
+  tmp->append(fileName);
+  GetFullPathName(tmp->getCString(), sizeof(buf), buf, &fp);
+  delete tmp;
+  path->clear();
+  path->append(buf);
+  return path;
+
+#elif defined(ACORN)
+  //---------- RISCOS ----------
+  char *p;
+  int i;
+
+  path->append(".");
+  i = path->getLength();
+  path->append(fileName);
+  for (p = path->getCString() + i; *p; ++p) {
+    if (*p == '/') {
+      *p = '.';
+    } else if (*p == '.') {
+      *p = '/';
+    }
+  }
+  return path;
+
+#elif defined(MACOS)
+  //---------- MacOS ----------
+  char *p;
+  int i;
+
+  path->append(":");
+  i = path->getLength();
+  path->append(fileName);
+  for (p = path->getCString() + i; *p; ++p) {
+    if (*p == '/') {
+      *p = ':';
+    } else if (*p == '.') {
+      *p = ':';
+    }
+  }
+  return path;
+
+#elif defined(__EMX__)
+  //---------- OS/2+EMX ----------
+  int i;
+
+  // appending "." does nothing
+  if (!strcmp(fileName, "."))
+    return path;
+
+  // appending ".." goes up one directory
+  if (!strcmp(fileName, "..")) {
+    for (i = path->getLength() - 2; i >= 0; --i) {
+      if (path->getChar(i) == '/' || path->getChar(i) == '\\' ||
+         path->getChar(i) == ':')
+       break;
+    }
+    if (i <= 0) {
+      if (path->getChar(0) == '/' || path->getChar(0) == '\\') {
+       path->del(1, path->getLength() - 1);
+      } else if (path->getLength() >= 2 && path->getChar(1) == ':') {
+       path->del(2, path->getLength() - 2);
+      } else {
+       path->clear();
+       path->append("..");
+      }
+    } else {
+      if (path->getChar(i-1) == ':')
+       ++i;
+      path->del(i, path->getLength() - i);
+    }
+    return path;
+  }
+
+  // otherwise, append "/" and new path component
+  if (path->getLength() > 0 &&
+      path->getChar(path->getLength() - 1) != '/' &&
+      path->getChar(path->getLength() - 1) != '\\')
+    path->append('/');
+  path->append(fileName);
+  return path;
+
+#else
+  //---------- Unix ----------
+  int i;
+
+  // appending "." does nothing
+  if (!strcmp(fileName, "."))
+    return path;
+
+  // appending ".." goes up one directory
+  if (!strcmp(fileName, "..")) {
+    for (i = path->getLength() - 2; i >= 0; --i) {
+      if (path->getChar(i) == '/')
+       break;
+    }
+    if (i <= 0) {
+      if (path->getChar(0) == '/') {
+       path->del(1, path->getLength() - 1);
+      } else {
+       path->clear();
+       path->append("..");
+      }
+    } else {
+      path->del(i, path->getLength() - i);
+    }
+    return path;
+  }
+
+  // otherwise, append "/" and new path component
+  if (path->getLength() > 0 &&
+      path->getChar(path->getLength() - 1) != '/')
+    path->append('/');
+  path->append(fileName);
+  return path;
+#endif
+}
+
+GooString *grabPath(char *fileName) {
+#ifdef VMS
+  //---------- VMS ----------
+  char *p;
+
+  if ((p = strrchr(fileName, ']')))
+    return new GooString(fileName, p + 1 - fileName);
+  if ((p = strrchr(fileName, ':')))
+    return new GooString(fileName, p + 1 - fileName);
+  return new GooString();
+
+#elif defined(__EMX__) || defined(_WIN32)
+  //---------- OS/2+EMX and Win32 ----------
+  char *p;
+
+  if ((p = strrchr(fileName, '/')))
+    return new GooString(fileName, p - fileName);
+  if ((p = strrchr(fileName, '\\')))
+    return new GooString(fileName, p - fileName);
+  if ((p = strrchr(fileName, ':')))
+    return new GooString(fileName, p + 1 - fileName);
+  return new GooString();
+
+#elif defined(ACORN)
+  //---------- RISCOS ----------
+  char *p;
+
+  if ((p = strrchr(fileName, '.')))
+    return new GooString(fileName, p - fileName);
+  return new GooString();
+
+#elif defined(MACOS)
+  //---------- MacOS ----------
+  char *p;
+
+  if ((p = strrchr(fileName, ':')))
+    return new GooString(fileName, p - fileName);
+  return new GooString();
+
+#else
+  //---------- Unix ----------
+  char *p;
+
+  if ((p = strrchr(fileName, '/')))
+    return new GooString(fileName, p - fileName);
+  return new GooString();
+#endif
+}
+
+GBool isAbsolutePath(char *path) {
+#ifdef VMS
+  //---------- VMS ----------
+  return strchr(path, ':') ||
+        (path[0] == '[' && path[1] != '.' && path[1] != '-');
+
+#elif defined(__EMX__) || defined(_WIN32)
+  //---------- OS/2+EMX and Win32 ----------
+  return path[0] == '/' || path[0] == '\\' || path[1] == ':';
+
+#elif defined(ACORN)
+  //---------- RISCOS ----------
+  return path[0] == '$';
+
+#elif defined(MACOS)
+  //---------- MacOS ----------
+  return path[0] != ':';
+
+#else
+  //---------- Unix ----------
+  return path[0] == '/';
+#endif
+}
+
+GooString *makePathAbsolute(GooString *path) {
+#ifdef VMS
+  //---------- VMS ----------
+  char buf[PATH_MAX+1];
+
+  if (!isAbsolutePath(path->getCString())) {
+    if (getcwd(buf, sizeof(buf))) {
+      path->insert(0, buf);
+    }
+  }
+  return path;
+
+#elif defined(_WIN32)
+  //---------- Win32 ----------
+  char buf[MAX_PATH];
+  char *fp;
+
+  buf[0] = '\0';
+  if (!GetFullPathName(path->getCString(), MAX_PATH, buf, &fp)) {
+    path->clear();
+    return path;
+  }
+  path->clear();
+  path->append(buf);
+  return path;
+
+#elif defined(ACORN)
+  //---------- RISCOS ----------
+  path->insert(0, '@');
+  return path;
+
+#elif defined(MACOS)
+  //---------- MacOS ----------
+  path->del(0, 1);
+  return path;
+
+#else
+  //---------- Unix and OS/2+EMX ----------
+  struct passwd *pw;
+  char buf[PATH_MAX+1];
+  GooString *s;
+  char *p1, *p2;
+  int n;
+
+  if (path->getChar(0) == '~') {
+    if (path->getChar(1) == '/' ||
+#ifdef __EMX__
+       path->getChar(1) == '\\' ||
+#endif
+       path->getLength() == 1) {
+      path->del(0, 1);
+      s = getHomeDir();
+      path->insert(0, s);
+      delete s;
+    } else {
+      p1 = path->getCString() + 1;
+#ifdef __EMX__
+      for (p2 = p1; *p2 && *p2 != '/' && *p2 != '\\'; ++p2) ;
+#else
+      for (p2 = p1; *p2 && *p2 != '/'; ++p2) ;
+#endif
+      if ((n = p2 - p1) > PATH_MAX)
+       n = PATH_MAX;
+      strncpy(buf, p1, n);
+      buf[n] = '\0';
+      if ((pw = getpwnam(buf))) {
+       path->del(0, p2 - p1 + 1);
+       path->insert(0, pw->pw_dir);
+      }
+    }
+  } else if (!isAbsolutePath(path->getCString())) {
+    if (getcwd(buf, sizeof(buf))) {
+#ifndef __EMX__
+      path->insert(0, '/');
+#endif
+      path->insert(0, buf);
+    }
+  }
+  return path;
+#endif
+}
+
+time_t getModTime(char *fileName) {
+#ifdef _WIN32
+  //~ should implement this, but it's (currently) only used in xpdf
+  return 0;
+#else
+  struct stat statBuf;
+
+  if (stat(fileName, &statBuf)) {
+    return 0;
+  }
+  return statBuf.st_mtime;
+#endif
+}
+
+GBool openTempFile(GooString **name, FILE **f, const char *mode) {
+#if defined(_WIN32)
+  //---------- Win32 ----------
+  char *tempDir;
+  GooString *s, *s2;
+  char buf[32];
+  FILE *f2;
+  int t, i;
+
+  // this has the standard race condition problem, but I haven't found
+  // a better way to generate temp file names with extensions on
+  // Windows
+  if ((tempDir = getenv("TEMP"))) {
+    s = new GooString(tempDir);
+    s->append('\\');
+  } else {
+    s = new GooString();
+  }
+  s->appendf("x_{0:d}_{1:d}_",
+            (int)GetCurrentProcessId(), (int)GetCurrentThreadId());
+  t = (int)time(NULL);
+  for (i = 0; i < 1000; ++i) {
+    s2 = s->copy()->appendf("{0:d}", t + i);
+    if (!(f2 = fopen(s2->getCString(), "r"))) {
+      if (!(f2 = fopen(s2->getCString(), mode))) {
+       delete s2;
+       delete s;
+        return gFalse;
+      }
+      *name = s2;
+      *f = f2;
+      delete s;
+      return gTrue;
+    }
+    fclose(f2);
+    delete s2;
+  }
+  delete s;
+  return gFalse;
+#elif defined(VMS) || defined(__EMX__) || defined(ACORN) || defined(MACOS)
+  //---------- non-Unix ----------
+  char *s;
+
+  // There is a security hole here: an attacker can create a symlink
+  // with this file name after the tmpnam call and before the fopen
+  // call.  I will happily accept fixes to this function for non-Unix
+  // OSs.
+  if (!(s = tmpnam(NULL))) {
+    return gFalse;
+  }
+  *name = new GooString(s);
+  if (!(*f = fopen((*name)->getCString(), mode))) {
+    delete (*name);
+    *name = NULL;
+    return gFalse;
+  }
+  return gTrue;
+#else
+  //---------- Unix ----------
+  char *s;
+  int fd;
+
+#if HAVE_MKSTEMP
+  if ((s = getenv("TMPDIR"))) {
+    *name = new GooString(s);
+  } else {
+    *name = new GooString("/tmp");
+  }
+  (*name)->append("/XXXXXX");
+  fd = mkstemp((*name)->getCString());
+#else // HAVE_MKSTEMP
+  if (!(s = tmpnam(NULL))) {
+    return gFalse;
+  }
+  *name = new GooString(s);
+  fd = open((*name)->getCString(), O_WRONLY | O_CREAT | O_EXCL, 0600);
+#endif // HAVE_MKSTEMP
+  if (fd < 0 || !(*f = fdopen(fd, mode))) {
+    delete *name;
+    *name = NULL;
+    return gFalse;
+  }
+  return gTrue;
+#endif
+}
+
+GBool executeCommand(char *cmd) {
+#ifdef VMS
+  return system(cmd) ? gTrue : gFalse;
+#else
+  return system(cmd) ? gFalse : gTrue;
+#endif
+}
+
+#ifdef WIN32
+GooString *fileNameToUTF8(char *path) {
+  GooString *s;
+  char *p;
+
+  s = new GooString();
+  for (p = path; *p; ++p) {
+    if (*p & 0x80) {
+      s->append((char)(0xc0 | ((*p >> 6) & 0x03)));
+      s->append((char)(0x80 | (*p & 0x3f)));
+    } else {
+      s->append(*p);
+    }
+  }
+  return s;
+}
+
+GooString *fileNameToUTF8(wchar_t *path) {
+  GooString *s;
+  wchar_t *p;
+
+  s = new GooString();
+  for (p = path; *p; ++p) {
+    if (*p < 0x80) {
+      s->append((char)*p);
+    } else if (*p < 0x800) {
+      s->append((char)(0xc0 | ((*p >> 6) & 0x1f)));
+      s->append((char)(0x80 | (*p & 0x3f)));
+    } else {
+      s->append((char)(0xe0 | ((*p >> 12) & 0x0f)));
+      s->append((char)(0x80 | ((*p >> 6) & 0x3f)));
+      s->append((char)(0x80 | (*p & 0x3f)));
+    }
+  }
+  return s;
+}
+#endif
+
+FILE *openFile(const char *path, const char *mode) {
+#ifdef WIN32
+  OSVERSIONINFO version;
+  wchar_t wPath[_MAX_PATH + 1];
+  char nPath[_MAX_PATH + 1];
+  wchar_t wMode[8];
+  const char *p;
+  int i;
+
+  // NB: _wfopen is only available in NT
+  version.dwOSVersionInfoSize = sizeof(version);
+  GetVersionEx(&version);
+  if (version.dwPlatformId == VER_PLATFORM_WIN32_NT) {
+    for (p = path, i = 0; *p && i < _MAX_PATH; ++i) {
+      if ((p[0] & 0xe0) == 0xc0 &&
+         p[1] && (p[1] & 0xc0) == 0x80) {
+       wPath[i] = (wchar_t)(((p[0] & 0x1f) << 6) |
+                            (p[1] & 0x3f));
+       p += 2;
+      } else if ((p[0] & 0xf0) == 0xe0 &&
+                p[1] && (p[1] & 0xc0) == 0x80 &&
+                p[2] && (p[2] & 0xc0) == 0x80) {
+       wPath[i] = (wchar_t)(((p[0] & 0x0f) << 12) |
+                            ((p[1] & 0x3f) << 6) |
+                            (p[2] & 0x3f));
+       p += 3;
+      } else {
+       wPath[i] = (wchar_t)(p[0] & 0xff);
+       p += 1;
+      }
+    }
+    wPath[i] = (wchar_t)0;
+    for (i = 0; mode[i] && i < sizeof(mode) - 1; ++i) {
+      wMode[i] = (wchar_t)(mode[i] & 0xff);
+    }
+    wMode[i] = (wchar_t)0;
+    return _wfopen(wPath, wMode);
+  } else {
+    for (p = path, i = 0; *p && i < _MAX_PATH; ++i) {
+      if ((p[0] & 0xe0) == 0xc0 &&
+         p[1] && (p[1] & 0xc0) == 0x80) {
+       nPath[i] = (char)(((p[0] & 0x1f) << 6) |
+                         (p[1] & 0x3f));
+       p += 2;
+      } else if ((p[0] & 0xf0) == 0xe0 &&
+                p[1] && (p[1] & 0xc0) == 0x80 &&
+                p[2] && (p[2] & 0xc0) == 0x80) {
+       nPath[i] = (char)(((p[1] & 0x3f) << 6) |
+                         (p[2] & 0x3f));
+       p += 3;
+      } else {
+       nPath[i] = p[0];
+       p += 1;
+      }
+    }
+    nPath[i] = '\0';
+    return fopen(nPath, mode);
+  }
+#else
+  return fopen(path, mode);
+#endif
+}
+
+char *getLine(char *buf, int size, FILE *f) {
+  int c, i;
+
+  i = 0;
+  while (i < size - 1) {
+    if ((c = fgetc(f)) == EOF) {
+      break;
+    }
+    buf[i++] = (char)c;
+    if (c == '\x0a') {
+      break;
+    }
+    if (c == '\x0d') {
+      c = fgetc(f);
+      if (c == '\x0a' && i < size - 1) {
+       buf[i++] = (char)c;
+      } else if (c != EOF) {
+       ungetc(c, f);
+      }
+      break;
+    }
+  }
+  buf[i] = '\0';
+  if (i == 0) {
+    return NULL;
+  }
+  return buf;
+}
+
+//------------------------------------------------------------------------
+// GDir and GDirEntry
+//------------------------------------------------------------------------
+
+GDirEntry::GDirEntry(char *dirPath, char *nameA, GBool doStat) {
+#ifdef VMS
+  char *p;
+#elif defined(_WIN32)
+  DWORD fa;
+#elif defined(ACORN)
+#else
+  struct stat st;
+#endif
+
+  name = new GooString(nameA);
+  dir = gFalse;
+  fullPath = new GooString(dirPath);
+  appendToPath(fullPath, nameA);
+  if (doStat) {
+#ifdef VMS
+    if (!strcmp(nameA, "-") ||
+       ((p = strrchr(nameA, '.')) && !strncmp(p, ".DIR;", 5)))
+      dir = gTrue;
+#elif defined(ACORN)
+#else
+#ifdef _WIN32
+    fa = GetFileAttributes(fullPath->getCString());
+    dir = (fa != 0xFFFFFFFF && (fa & FILE_ATTRIBUTE_DIRECTORY));
+#else
+    if (stat(fullPath->getCString(), &st) == 0)
+      dir = S_ISDIR(st.st_mode);
+#endif
+#endif
+  }
+}
+
+GDirEntry::~GDirEntry() {
+  delete fullPath;
+  delete name;
+}
+
+GDir::GDir(char *name, GBool doStatA) {
+  path = new GooString(name);
+  doStat = doStatA;
+#if defined(_WIN32)
+  GooString *tmp;
+
+  tmp = path->copy();
+  tmp->append("/*.*");
+  hnd = FindFirstFile(tmp->getCString(), &ffd);
+  delete tmp;
+#elif defined(ACORN)
+#elif defined(MACOS)
+#else
+  dir = opendir(name);
+#ifdef VMS
+  needParent = strchr(name, '[') != NULL;
+#endif
+#endif
+}
+
+GDir::~GDir() {
+  delete path;
+#if defined(_WIN32)
+  if (hnd != INVALID_HANDLE_VALUE) {
+    FindClose(hnd);
+    hnd = INVALID_HANDLE_VALUE;
+  }
+#elif defined(ACORN)
+#elif defined(MACOS)
+#else
+  if (dir)
+    closedir(dir);
+#endif
+}
+
+GDirEntry *GDir::getNextEntry() {
+  GDirEntry *e;
+
+#if defined(_WIN32)
+  if (hnd != INVALID_HANDLE_VALUE) {
+    e = new GDirEntry(path->getCString(), ffd.cFileName, doStat);
+    if (!FindNextFile(hnd, &ffd)) {
+      FindClose(hnd);
+      hnd = INVALID_HANDLE_VALUE;
+    }
+  } else {
+    e = NULL;
+  }
+#elif defined(ACORN)
+#elif defined(MACOS)
+#elif defined(VMS)
+  struct dirent *ent;
+  e = NULL;
+  if (dir) {
+    if (needParent) {
+      e = new GDirEntry(path->getCString(), "-", doStat);
+      needParent = gFalse;
+      return e;
+    }
+    ent = readdir(dir);
+    if (ent) {
+      e = new GDirEntry(path->getCString(), ent->d_name, doStat);
+    }
+  }
+#else
+  struct dirent *ent;
+  e = NULL;
+  if (dir) {
+    do {
+      ent = readdir(dir);
+    }
+    while (ent && (!strcmp(ent->d_name, ".") || !strcmp(ent->d_name, "..")));
+    if (ent) {
+      e = new GDirEntry(path->getCString(), ent->d_name, doStat);
+    }
+  }
+#endif
+
+  return e;
+}
+
+void GDir::rewind() {
+#ifdef _WIN32
+  GooString *tmp;
+
+  if (hnd != INVALID_HANDLE_VALUE)
+    FindClose(hnd);
+  tmp = path->copy();
+  tmp->append("/*.*");
+  hnd = FindFirstFile(tmp->getCString(), &ffd);
+  delete tmp;
+#elif defined(ACORN)
+#elif defined(MACOS)
+#else
+  if (dir)
+    rewinddir(dir);
+#ifdef VMS
+  needParent = strchr(path->getCString(), '[') != NULL;
+#endif
+#endif
+}
diff --git a/goo/gfile.h b/goo/gfile.h
new file mode 100644 (file)
index 0000000..46b8958
--- /dev/null
@@ -0,0 +1,172 @@
+//========================================================================
+//
+// gfile.h
+//
+// Miscellaneous file and directory name manipulation.
+//
+// Copyright 1996-2003 Glyph & Cog, LLC
+//
+//========================================================================
+
+//========================================================================
+//
+// Modified under the Poppler project - http://poppler.freedesktop.org
+//
+// All changes made under the Poppler project to this file are licensed
+// under GPL version 2 or later
+//
+// Copyright (C) 2006 Kristian Høgsberg <krh@redhat.com>
+// Copyright (C) 2009, 2011 Albert Astals Cid <aacid@kde.org>
+// Copyright (C) 2009 Kovid Goyal <kovid@kovidgoyal.net>
+//
+// To see a description of the changes please see the Changelog file that
+// came with your tarball or type make ChangeLog if you are building from git
+//
+//========================================================================
+
+#ifndef GFILE_H
+#define GFILE_H
+
+#include "poppler-config.h"
+#include <stdio.h>
+#include <stdlib.h>
+#include <stddef.h>
+extern "C" {
+#if defined(_WIN32)
+#  include <sys/stat.h>
+#  ifdef FPTEX
+#    include <win32lib.h>
+#  else
+#    include <windows.h>
+#  endif
+#elif defined(ACORN)
+#elif defined(MACOS)
+#  include <ctime.h>
+#else
+#  include <unistd.h>
+#  include <sys/types.h>
+#  ifdef VMS
+#    include "vms_dirent.h"
+#  elif HAVE_DIRENT_H
+#    include <dirent.h>
+#    define NAMLEN(d) strlen((d)->d_name)
+#  else
+#    define dirent direct
+#    define NAMLEN(d) (d)->d_namlen
+#    if HAVE_SYS_NDIR_H
+#      include <sys/ndir.h>
+#    endif
+#    if HAVE_SYS_DIR_H
+#      include <sys/dir.h>
+#    endif
+#    if HAVE_NDIR_H
+#      include <ndir.h>
+#    endif
+#  endif
+#endif
+}
+#include "gtypes.h"
+
+class GooString;
+
+//------------------------------------------------------------------------
+
+// Get home directory path.
+extern GooString *getHomeDir();
+
+// Get current directory.
+extern GooString *getCurrentDir();
+
+// Append a file name to a path string.  <path> may be an empty
+// string, denoting the current directory).  Returns <path>.
+extern GooString *appendToPath(GooString *path, const char *fileName);
+
+// Grab the path from the front of the file name.  If there is no
+// directory component in <fileName>, returns an empty string.
+extern GooString *grabPath(char *fileName);
+
+// Is this an absolute path or file name?
+extern GBool isAbsolutePath(char *path);
+
+// Make this path absolute by prepending current directory (if path is
+// relative) or prepending user's directory (if path starts with '~').
+extern GooString *makePathAbsolute(GooString *path);
+
+// Get the modification time for <fileName>.  Returns 0 if there is an
+// error.
+extern time_t getModTime(char *fileName);
+
+// Create a temporary file and open it for writing.  If <ext> is not
+// NULL, it will be used as the file name extension.  Returns both the
+// name and the file pointer.  For security reasons, all writing
+// should be done to the returned file pointer; the file may be
+// reopened later for reading, but not for writing.  The <mode> string
+// should be "w" or "wb".  Returns true on success.
+extern GBool openTempFile(GooString **name, FILE **f, const char *mode);
+
+// Execute <command>.  Returns true on success.
+extern GBool executeCommand(char *cmd);
+
+#ifdef WIN32
+// Convert a file name from Latin-1 to UTF-8.
+extern GooString *fileNameToUTF8(char *path);
+
+// Convert a file name from UCS-2 to UTF-8.
+extern GooString *fileNameToUTF8(wchar_t *path);
+#endif
+
+// Open a file.  On Windows, this converts the path from UTF-8 to
+// UCS-2 and calls _wfopen (if available).  On other OSes, this simply
+// calls fopen.
+extern FILE *openFile(const char *path, const char *mode);
+
+// Just like fgets, but handles Unix, Mac, and/or DOS end-of-line
+// conventions.
+extern char *getLine(char *buf, int size, FILE *f);
+
+//------------------------------------------------------------------------
+// GDir and GDirEntry
+//------------------------------------------------------------------------
+
+class GDirEntry {
+public:
+
+  GDirEntry(char *dirPath, char *nameA, GBool doStat);
+  ~GDirEntry();
+  GooString *getName() { return name; }
+  GooString *getFullPath() { return fullPath; }
+  GBool isDir() { return dir; }
+
+private:
+
+  GooString *name;             // dir/file name
+  GooString *fullPath;
+  GBool dir;                   // is it a directory?
+};
+
+class GDir {
+public:
+
+  GDir(char *name, GBool doStatA = gTrue);
+  ~GDir();
+  GDirEntry *getNextEntry();
+  void rewind();
+
+private:
+
+  GooString *path;             // directory path
+  GBool doStat;                        // call stat() for each entry?
+#if defined(_WIN32)
+  WIN32_FIND_DATA ffd;
+  HANDLE hnd;
+#elif defined(ACORN)
+#elif defined(MACOS)
+#else
+  DIR *dir;                    // the DIR structure from opendir()
+#ifdef VMS
+  GBool needParent;            // need to return an entry for [-]
+#endif
+#endif
+};
+
+#endif
diff --git a/goo/gmem.cc b/goo/gmem.cc
new file mode 100644 (file)
index 0000000..768b283
--- /dev/null
@@ -0,0 +1,346 @@
+/*
+ * gmem.c
+ *
+ * Memory routines with out-of-memory checking.
+ *
+ * Copyright 1996-2003 Glyph & Cog, LLC
+ */
+
+//========================================================================
+//
+// Modified under the Poppler project - http://poppler.freedesktop.org
+//
+// All changes made under the Poppler project to this file are licensed
+// under GPL version 2 or later
+//
+// Copyright (C) 2005 Takashi Iwai <tiwai@suse.de>
+// Copyright (C) 2007-2010 Albert Astals Cid <aacid@kde.org>
+// Copyright (C) 2008 Jonathan Kew <jonathan_kew@sil.org>
+//
+// To see a description of the changes please see the Changelog file that
+// came with your tarball or type make ChangeLog if you are building from git
+//
+//========================================================================
+
+#include <config.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <stddef.h>
+#include <string.h>
+#include <limits.h>
+#include "gmem.h"
+
+#ifdef DEBUG_MEM
+
+typedef struct _GMemHdr {
+  unsigned int magic;
+  int size;
+  int index;
+  struct _GMemHdr *next, *prev;
+} GMemHdr;
+
+#define gMemHdrSize ((sizeof(GMemHdr) + 7) & ~7)
+#define gMemTrlSize (sizeof(long))
+
+#define gMemMagic 0xabcd9999
+
+#if gmemTrlSize==8
+#define gMemDeadVal 0xdeadbeefdeadbeefUL
+#else
+#define gMemDeadVal 0xdeadbeefUL
+#endif
+
+/* round data size so trailer will be aligned */
+#define gMemDataSize(size) \
+  ((((size) + gMemTrlSize - 1) / gMemTrlSize) * gMemTrlSize)
+
+static GMemHdr *gMemHead = NULL;
+static GMemHdr *gMemTail = NULL;
+
+static int gMemIndex = 0;
+static int gMemAlloc = 0;
+static int gMemInUse = 0;
+
+#endif /* DEBUG_MEM */
+
+inline static void *gmalloc(size_t size, bool checkoverflow) {
+#ifdef DEBUG_MEM
+  int size1;
+  char *mem;
+  GMemHdr *hdr;
+  void *data;
+  unsigned long *trl, *p;
+
+  if (size < 0) {
+    fprintf(stderr, "Invalid memory allocation size\n");
+    if (checkoverflow) return NULL;
+    else exit(1);
+  }
+  if (size == 0) {
+    return NULL;
+  }
+  size1 = gMemDataSize(size);
+  if (!(mem = (char *)malloc(size1 + gMemHdrSize + gMemTrlSize))) {
+    fprintf(stderr, "Out of memory\n");
+    if (checkoverflow) return NULL;
+    else exit(1);
+  }
+  hdr = (GMemHdr *)mem;
+  data = (void *)(mem + gMemHdrSize);
+  trl = (unsigned long *)(mem + gMemHdrSize + size1);
+  hdr->magic = gMemMagic;
+  hdr->size = size;
+  hdr->index = gMemIndex++;
+  if (gMemTail) {
+    gMemTail->next = hdr;
+    hdr->prev = gMemTail;
+    gMemTail = hdr;
+  } else {
+    hdr->prev = NULL;
+    gMemHead = gMemTail = hdr;
+  }
+  hdr->next = NULL;
+  ++gMemAlloc;
+  gMemInUse += size;
+  for (p = (unsigned long *)data; p <= trl; ++p) {
+    *p = gMemDeadVal;
+  }
+  return data;
+#else
+  void *p;
+
+  if (size < 0) {
+    fprintf(stderr, "Invalid memory allocation size\n");
+    if (checkoverflow) return NULL;
+    else exit(1);
+  }
+  if (size == 0) {
+    return NULL;
+  }
+  if (!(p = malloc(size))) {
+    fprintf(stderr, "Out of memory\n");
+    if (checkoverflow) return NULL;
+    else exit(1);
+  }
+  return p;
+#endif
+}
+
+void *gmalloc(size_t size) {
+  return gmalloc(size, false);
+}
+
+void *gmalloc_checkoverflow(size_t size) {
+  return gmalloc(size, true);
+}
+
+inline static void *grealloc(void *p, size_t size, bool checkoverflow) {
+#ifdef DEBUG_MEM
+  GMemHdr *hdr;
+  void *q;
+  int oldSize;
+
+  if (size < 0) {
+    fprintf(stderr, "Invalid memory allocation size\n");
+    if (checkoverflow) return NULL;
+    else exit(1);
+  }
+  if (size == 0) {
+    if (p) {
+      gfree(p);
+    }
+    return NULL;
+  }
+  if (p) {
+    hdr = (GMemHdr *)((char *)p - gMemHdrSize);
+    oldSize = hdr->size;
+    q = gmalloc(size, checkoverflow);
+    memcpy(q, p, size < oldSize ? size : oldSize);
+    gfree(p);
+  } else {
+    q = gmalloc(size, checkoverflow);
+  }
+  return q;
+#else
+  void *q;
+
+  if (size < 0) {
+    fprintf(stderr, "Invalid memory allocation size\n");
+    if (checkoverflow) return NULL;
+    else exit(1);
+  }
+  if (size == 0) {
+    if (p) {
+      free(p);
+    }
+    return NULL;
+  }
+  if (p) {
+    q = realloc(p, size);
+  } else {
+    q = malloc(size);
+  }
+  if (!q) {
+    fprintf(stderr, "Out of memory\n");
+    if (checkoverflow) return NULL;
+    else exit(1);
+  }
+  return q;
+#endif
+}
+
+void *grealloc(void *p, size_t size) {
+  return grealloc(p, size, false);
+}
+
+void *grealloc_checkoverflow(void *p, size_t size) {
+  return grealloc(p, size, true);
+}
+
+inline static void *gmallocn(int nObjs, int objSize, bool checkoverflow) {
+  int n;
+
+  if (nObjs == 0) {
+    return NULL;
+  }
+  n = nObjs * objSize;
+  if (objSize <= 0 || nObjs < 0 || nObjs >= INT_MAX / objSize) {
+    fprintf(stderr, "Bogus memory allocation size\n");
+    if (checkoverflow) return NULL;
+    else exit(1);
+  }
+  return gmalloc(n, checkoverflow);
+}
+
+void *gmallocn(int nObjs, int objSize) {
+  return gmallocn(nObjs, objSize, false);
+}
+
+void *gmallocn_checkoverflow(int nObjs, int objSize) {
+  return gmallocn(nObjs, objSize, true);
+}
+
+inline static void *gmallocn3(int a, int b, int c, bool checkoverflow) {
+  int n = a * b;
+  if (b <= 0 || a < 0 || a >= INT_MAX / b) {
+    fprintf(stderr, "Bogus memory allocation size\n");
+    if (checkoverflow) return NULL;
+    else exit(1);
+  }
+  return gmallocn(n, c, checkoverflow);
+}
+
+void *gmallocn3(int a, int b, int c) {
+  return gmallocn3(a, b, c, false);
+}
+
+void *gmallocn3_checkoverflow(int a, int b, int c) {
+  return gmallocn3(a, b, c, true);
+}
+
+inline static void *greallocn(void *p, int nObjs, int objSize, bool checkoverflow) {
+  int n;
+
+  if (nObjs == 0) {
+    if (p) {
+      gfree(p);
+    }
+    return NULL;
+  }
+  n = nObjs * objSize;
+  if (objSize <= 0 || nObjs < 0 || nObjs >= INT_MAX / objSize) {
+    fprintf(stderr, "Bogus memory allocation size\n");
+    if (checkoverflow) {
+      gfree(p);
+      return NULL;
+    } else {
+      exit(1);
+    }
+  }
+  return grealloc(p, n, checkoverflow);
+}
+
+void *greallocn(void *p, int nObjs, int objSize) {
+  return greallocn(p, nObjs, objSize, false);
+}
+
+void *greallocn_checkoverflow(void *p, int nObjs, int objSize) {
+  return greallocn(p, nObjs, objSize, true);
+}
+
+void gfree(void *p) {
+#ifdef DEBUG_MEM
+  int size;
+  GMemHdr *hdr;
+  unsigned long *trl, *clr;
+
+  if (p) {
+    hdr = (GMemHdr *)((char *)p - gMemHdrSize);
+    if (hdr->magic == gMemMagic &&
+       ((hdr->prev == NULL) == (hdr == gMemHead)) &&
+       ((hdr->next == NULL) == (hdr == gMemTail))) {
+      if (hdr->prev) {
+       hdr->prev->next = hdr->next;
+      } else {
+       gMemHead = hdr->next;
+      }
+      if (hdr->next) {
+       hdr->next->prev = hdr->prev;
+      } else {
+       gMemTail = hdr->prev;
+      }
+      --gMemAlloc;
+      gMemInUse -= hdr->size;
+      size = gMemDataSize(hdr->size);
+      trl = (unsigned long *)((char *)hdr + gMemHdrSize + size);
+      if (*trl != gMemDeadVal) {
+       fprintf(stderr, "Overwrite past end of block %d at address %p\n",
+               hdr->index, p);
+      }
+      for (clr = (unsigned long *)hdr; clr <= trl; ++clr) {
+       *clr = gMemDeadVal;
+      }
+      free(hdr);
+    } else {
+      fprintf(stderr, "Attempted to free bad address %p\n", p);
+    }
+  }
+#else
+  if (p) {
+    free(p);
+  }
+#endif
+}
+
+#ifdef DEBUG_MEM
+void gMemReport(FILE *f) {
+  GMemHdr *p;
+
+  fprintf(f, "%d memory allocations in all\n", gMemIndex);
+  if (gMemAlloc > 0) {
+    fprintf(f, "%d memory blocks left allocated:\n", gMemAlloc);
+    fprintf(f, " index     size\n");
+    fprintf(f, "-------- --------\n");
+    for (p = gMemHead; p; p = p->next) {
+      fprintf(f, "%8d %8d\n", p->index, p->size);
+    }
+  } else {
+    fprintf(f, "No memory blocks left allocated\n");
+  }
+}
+#endif
+
+char *copyString(const char *s) {
+  char *s1;
+
+  s1 = (char *)gmalloc(strlen(s) + 1);
+  strcpy(s1, s);
+  return s1;
+}
+
+char *gstrndup(const char *s, size_t n) {
+  char *s1 = (char*)gmalloc(n + 1); /* cannot return NULL for size > 0 */
+  s1[n] = '\0';
+  memcpy(s1, s, n);
+  return s1;
+}
diff --git a/goo/gmem.h b/goo/gmem.h
new file mode 100644 (file)
index 0000000..898f339
--- /dev/null
@@ -0,0 +1,92 @@
+/*
+ * gmem.h
+ *
+ * Memory routines with out-of-memory checking.
+ *
+ * Copyright 1996-2003 Glyph & Cog, LLC
+ */
+
+//========================================================================
+//
+// Modified under the Poppler project - http://poppler.freedesktop.org
+//
+// All changes made under the Poppler project to this file are licensed
+// under GPL version 2 or later
+//
+// Copyright (C) 2005 Takashi Iwai <tiwai@suse.de>
+// Copyright (C) 2007-2010 Albert Astals Cid <aacid@kde.org>
+// Copyright (C) 2008 Jonathan Kew <jonathan_kew@sil.org>
+//
+// To see a description of the changes please see the Changelog file that
+// came with your tarball or type make ChangeLog if you are building from git
+//
+//========================================================================
+
+#ifndef GMEM_H
+#define GMEM_H
+
+#include <stdio.h>
+#include "poppler-config.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*
+ * Same as malloc, but prints error message and exits if malloc()
+ * returns NULL.
+ */
+extern void *gmalloc(size_t size);
+extern void *gmalloc_checkoverflow(size_t size);
+
+/*
+ * Same as realloc, but prints error message and exits if realloc()
+ * returns NULL.  If <p> is NULL, calls malloc instead of realloc().
+ */
+extern void *grealloc(void *p, size_t size);
+extern void *grealloc_checkoverflow(size_t size);
+
+/*
+ * These are similar to gmalloc and grealloc, but take an object count
+ * and size.  The result is similar to allocating nObjs * objSize
+ * bytes, but there is an additional error check that the total size
+ * doesn't overflow an int.
+ * The gmallocn_checkoverflow variant returns NULL instead of exiting
+ * the application if a overflow is detected
+ */
+extern void *gmallocn(int nObjs, int objSize);
+extern void *gmallocn_checkoverflow(int nObjs, int objSize);
+extern void *gmallocn3(int a, int b, int c);
+extern void *gmallocn3_checkoverflow(int a, int b, int c);
+extern void *greallocn(void *p, int nObjs, int objSize);
+extern void *greallocn_checkoverflow(void *p, int nObjs, int objSize);
+
+/*
+ * Same as free, but checks for and ignores NULL pointers.
+ */
+extern void gfree(void *p);
+
+#ifdef DEBUG_MEM
+/*
+ * Report on unfreed memory.
+ */
+extern void gMemReport(FILE *f);
+#else
+#define gMemReport(f)
+#endif
+
+/*
+ * Allocate memory and copy a string into it.
+ */
+extern char *copyString(const char *s);
+
+/*
+ * Allocate memory and copy a limited-length string to it.
+ */
+extern char *gstrndup(const char *s, size_t n);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/goo/gmempp.cc b/goo/gmempp.cc
new file mode 100644 (file)
index 0000000..a70338c
--- /dev/null
@@ -0,0 +1,32 @@
+//========================================================================
+//
+// gmempp.cc
+//
+// Use gmalloc/gfree for C++ new/delete operators.
+//
+// Copyright 1996-2003 Glyph & Cog, LLC
+//
+//========================================================================
+
+#include <config.h>
+#include "gmem.h"
+
+#ifdef DEBUG_MEM
+
+void *operator new(size_t size) {
+  return gmalloc((int)size);
+}
+
+void *operator new[](size_t size) {
+  return gmalloc((int)size);
+}
+
+void operator delete(void *p) {
+  gfree(p);
+}
+
+void operator delete[](void *p) {
+  gfree(p);
+}
+
+#endif
diff --git a/goo/gstrtod.cc b/goo/gstrtod.cc
new file mode 100644 (file)
index 0000000..cd1d5b5
--- /dev/null
@@ -0,0 +1,147 @@
+/* This file is part of Libspectre.
+ * 
+ * Copyright (C) 2007, 2012 Albert Astals Cid <aacid@kde.org>
+ * Copyright (C) 2007 Carlos Garcia Campos <carlosgc@gnome.org>
+ *
+ * Libspectre is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * Libspectre is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
+ */
+
+/* This function comes from spectre-utils from libspectre */
+
+#include "gstrtod.h"
+
+#include <locale.h>
+#include <errno.h>
+#include <stdlib.h>
+#include <string.h>
+
+#define ascii_isspace(c) \
+  (c == ' ' || c == '\f' || c == '\n' || c == '\r' || c == '\t' || c == '\v')
+#define ascii_isdigit(c) \
+  (c >= '0' && c <= '9')
+  
+double gatof(const char *nptr)
+{
+  return gstrtod(nptr, NULL);
+}
+
+double gstrtod(const char *nptr, char **endptr)
+{
+  char *fail_pos;
+  double val;
+  struct lconv *locale_data;
+  const char *decimal_point;
+  int decimal_point_len;
+  const char *p, *decimal_point_pos;
+  const char *end = NULL; /* Silence gcc */
+  int strtod_errno;
+
+  fail_pos = NULL;
+
+  locale_data = localeconv ();
+  decimal_point = locale_data->decimal_point;
+  decimal_point_len = strlen (decimal_point);
+
+  decimal_point_pos = NULL;
+  end = NULL;
+
+  if (decimal_point[0] != '.' || decimal_point[1] != 0) {
+    p = nptr;
+    /* Skip leading space */
+    while (ascii_isspace (*p))
+      p++;
+    
+    /* Skip leading optional sign */
+    if (*p == '+' || *p == '-')
+      p++;
+    
+    if (ascii_isdigit (*p) || *p == '.') {
+      while (ascii_isdigit (*p))
+        p++;
+      
+      if (*p == '.')
+        decimal_point_pos = p++;
+
+      while (ascii_isdigit (*p))
+        p++;
+
+      if (*p == 'e' || *p == 'E')
+        p++;
+      if (*p == '+' || *p == '-')
+        p++;
+      while (ascii_isdigit (*p))
+        p++;
+
+      end = p;
+    }
+    /* For the other cases, we need not convert the decimal point */
+  }
+
+  if (decimal_point_pos) {
+    char *copy, *c;
+    
+    /* We need to convert the '.' to the locale specific decimal point */
+    copy = (char *) malloc (end - nptr + 1 + decimal_point_len);
+    
+    c = copy;
+    memcpy (c, nptr, decimal_point_pos - nptr);
+    c += decimal_point_pos - nptr;
+    memcpy (c, decimal_point, decimal_point_len);
+    c += decimal_point_len;
+    memcpy (c, decimal_point_pos + 1, end - (decimal_point_pos + 1));
+    c += end - (decimal_point_pos + 1);
+    *c = 0;
+
+    errno = 0;
+    val = strtod (copy, &fail_pos);
+    strtod_errno = errno;
+
+    if (fail_pos) {
+      if (fail_pos - copy > decimal_point_pos - nptr)
+        fail_pos = (char *)nptr + (fail_pos - copy) - (decimal_point_len - 1);
+      else
+        fail_pos = (char *)nptr + (fail_pos - copy);
+    }
+
+    free (copy);
+  } else if (end) {
+    char *copy;
+    
+    copy = (char *) malloc (end - (char *)nptr + 1);
+    memcpy (copy, nptr, end - nptr);
+    *(copy + (end - (char *)nptr)) = 0;
+    
+    errno = 0;
+    val = strtod (copy, &fail_pos);
+    strtod_errno = errno;
+
+    if (fail_pos) {
+      fail_pos = (char *)nptr + (fail_pos - copy);
+    }
+
+    free (copy);
+  } else {
+    errno = 0;
+    val = strtod (nptr, &fail_pos);
+    strtod_errno = errno;
+  }
+
+  if (endptr)
+    *endptr = fail_pos;
+
+  errno = strtod_errno;
+
+  return val;
+}
diff --git a/goo/gstrtod.h b/goo/gstrtod.h
new file mode 100644 (file)
index 0000000..e8abdad
--- /dev/null
@@ -0,0 +1,43 @@
+/* This file is part of Libspectre.
+ * 
+ * Copyright (C) 2007 Albert Astals Cid <aacid@kde.org>
+ * Copyright (C) 2007 Carlos Garcia Campos <carlosgc@gnome.org>
+ *
+ * Libspectre is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * Libspectre is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
+ */
+
+/* This function comes from spectre-utils from libspectre */
+
+#ifndef GSTRTOD_H
+#define GSTRTOD_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* This function behaves like the standard atof()/(strtod() function
+ * does in the C locale. It does this without actually changing
+ * the current locale, since that would not be thread-safe.
+ * A limitation of the implementation is that this function
+ * will still accept localized versions of infinities and NANs.
+ */
+double gatof(const char *nptr);
+double gstrtod(const char *nptr, char **endptr);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/goo/gtypes.h b/goo/gtypes.h
new file mode 100644 (file)
index 0000000..b7a2dd2
--- /dev/null
@@ -0,0 +1,48 @@
+/*
+ * gtypes.h
+ *
+ * Some useful simple types.
+ *
+ * Copyright 1996-2003 Glyph & Cog, LLC
+ */
+
+//========================================================================
+//
+// Modified under the Poppler project - http://poppler.freedesktop.org
+//
+// All changes made under the Poppler project to this file are licensed
+// under GPL version 2 or later
+//
+// Copyright (C) 2010 Patrick Spendrin <ps_ml@gmx.de>
+// Copyright (C) 2010 Albert Astals Cid <aacid@kde.org>
+//
+// To see a description of the changes please see the Changelog file that
+// came with your tarball or type make ChangeLog if you are building from git
+//
+//========================================================================
+
+#ifndef GTYPES_H
+#define GTYPES_H
+
+/*
+ * These have stupid names to avoid conflicts with some (but not all)
+ * C++ compilers which define them.
+ */
+typedef bool GBool;
+#define gTrue true
+#define gFalse false
+
+#ifdef _MSC_VER
+#pragma warning(disable: 4800) /* 'type' : forcing value to bool 'true' or 'false' (performance warning) */
+#endif
+
+/*
+ * These have stupid names to avoid conflicts with <sys/types.h>,
+ * which on various systems defines some random subset of these.
+ */
+typedef unsigned char Guchar;
+typedef unsigned short Gushort;
+typedef unsigned int Guint;
+typedef unsigned long Gulong;
+
+#endif
diff --git a/goo/gtypes_p.h b/goo/gtypes_p.h
new file mode 100644 (file)
index 0000000..cc4866e
--- /dev/null
@@ -0,0 +1,30 @@
+/*
+ * gtypes_p.h
+ *
+ * Some useful simple types.
+ *
+ * Copyright (C) 2011 Adrian Johnson <ajohnson@redneon.com>
+ */
+
+#ifndef GTYPES_P_H
+#define GTYPES_P_H
+
+#include "config.h"
+
+/*
+ * Define precise integer types.
+ */
+#if HAVE_STDINT_H
+#include <stdint.h>
+#elif _MSC_VER
+typedef signed   __int8  int8_t;
+typedef unsigned __int8  uint8_t;
+typedef signed   __int16 int16_t;
+typedef unsigned __int16 uint16_t;
+typedef signed   __int32 int32_t;
+typedef unsigned __int32 uint32_t;
+typedef signed   __int64 int64_t;
+typedef unsigned __int64 uint64_t;
+#endif
+
+#endif
diff --git a/gtk-doc.make b/gtk-doc.make
new file mode 100644 (file)
index 0000000..9841de4
--- /dev/null
@@ -0,0 +1,256 @@
+# -*- mode: makefile -*-
+
+####################################
+# Everything below here is generic #
+####################################
+
+if GTK_DOC_USE_LIBTOOL
+GTKDOC_CC = $(LIBTOOL) --tag=CC --mode=compile $(CC) $(INCLUDES) $(GTKDOC_DEPS_CFLAGS) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
+GTKDOC_LD = $(LIBTOOL) --tag=CC --mode=link $(CC) $(GTKDOC_DEPS_LIBS) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS)
+GTKDOC_RUN = $(LIBTOOL) --mode=execute
+else
+GTKDOC_CC = $(CC) $(INCLUDES) $(GTKDOC_DEPS_CFLAGS) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
+GTKDOC_LD = $(CC) $(GTKDOC_DEPS_LIBS) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS)
+GTKDOC_RUN =
+endif
+
+# We set GPATH here; this gives us semantics for GNU make
+# which are more like other make's VPATH, when it comes to
+# whether a source that is a target of one rule is then
+# searched for in VPATH/GPATH.
+#
+GPATH = $(srcdir)
+
+TARGET_DIR=$(HTML_DIR)/$(DOC_MODULE)
+
+SETUP_FILES = \
+       $(content_files)                \
+       $(DOC_MAIN_SGML_FILE)           \
+       $(DOC_MODULE)-sections.txt      \
+       $(DOC_MODULE)-overrides.txt
+
+EXTRA_DIST =                           \
+       $(HTML_IMAGES)                  \
+       $(SETUP_FILES)
+
+DOC_STAMPS=setup-build.stamp scan-build.stamp sgml-build.stamp \
+       html-build.stamp pdf-build.stamp \
+       sgml.stamp html.stamp pdf.stamp
+
+SCANOBJ_FILES =                 \
+       $(DOC_MODULE).args       \
+       $(DOC_MODULE).hierarchy  \
+       $(DOC_MODULE).interfaces \
+       $(DOC_MODULE).prerequisites \
+       $(DOC_MODULE).signals
+
+REPORT_FILES = \
+       $(DOC_MODULE)-undocumented.txt \
+       $(DOC_MODULE)-undeclared.txt \
+       $(DOC_MODULE)-unused.txt
+
+CLEANFILES = $(SCANOBJ_FILES) $(REPORT_FILES) $(DOC_STAMPS)
+
+if ENABLE_GTK_DOC
+if GTK_DOC_BUILD_HTML
+HTML_BUILD_STAMP=html-build.stamp
+else
+HTML_BUILD_STAMP=
+endif
+if GTK_DOC_BUILD_PDF
+PDF_BUILD_STAMP=pdf-build.stamp
+else
+PDF_BUILD_STAMP=
+endif
+
+all-local: $(HTML_BUILD_STAMP) $(PDF_BUILD_STAMP)
+else
+all-local:
+endif
+
+docs: $(HTML_BUILD_STAMP) $(PDF_BUILD_STAMP)
+
+$(REPORT_FILES): sgml-build.stamp
+
+#### setup ####
+
+setup-build.stamp:
+       -@if test "$(abs_srcdir)" != "$(abs_builddir)" ; then \
+           echo '  DOC   Preparing build'; \
+           files=`echo $(SETUP_FILES) $(expand_content_files) $(DOC_MODULE).types`; \
+           if test "x$$files" != "x" ; then \
+               for file in $$files ; do \
+                   test -f $(abs_srcdir)/$$file && \
+                       cp -pu $(abs_srcdir)/$$file $(abs_builddir)/ || true; \
+               done; \
+           fi; \
+       fi
+       @touch setup-build.stamp
+
+
+#### scan ####
+
+scan-build.stamp: $(HFILE_GLOB) $(CFILE_GLOB)
+       @echo '  DOC   Scanning header files'
+       @_source_dir='' ; \
+       for i in $(DOC_SOURCE_DIR) ; do \
+           _source_dir="$${_source_dir} --source-dir=$$i" ; \
+       done ; \
+       gtkdoc-scan --module=$(DOC_MODULE) --ignore-headers="$(IGNORE_HFILES)" $${_source_dir} $(SCAN_OPTIONS) $(EXTRA_HFILES)
+       @if grep -l '^..*$$' $(DOC_MODULE).types > /dev/null 2>&1 ; then \
+           echo "  DOC   Introspecting gobjects"; \
+           scanobj_options=""; \
+           gtkdoc-scangobj 2>&1 --help | grep  >/dev/null "\-\-verbose"; \
+           if test "$(?)" = "0"; then \
+               if test "x$(V)" = "x1"; then \
+                   scanobj_options="--verbose"; \
+               fi; \
+           fi; \
+           CC="$(GTKDOC_CC)" LD="$(GTKDOC_LD)" RUN="$(GTKDOC_RUN)" CFLAGS="$(GTKDOC_CFLAGS) $(CFLAGS)" LDFLAGS="$(GTKDOC_LIBS) $(LDFLAGS)" \
+           gtkdoc-scangobj $(SCANGOBJ_OPTIONS) $$scanobj_options --module=$(DOC_MODULE); \
+       else \
+           for i in $(SCANOBJ_FILES) ; do \
+               test -f $$i || touch $$i ; \
+           done \
+       fi
+       @touch scan-build.stamp
+
+$(DOC_MODULE)-decl.txt $(SCANOBJ_FILES) $(DOC_MODULE)-sections.txt $(DOC_MODULE)-overrides.txt: scan-build.stamp
+       @true
+
+#### xml ####
+
+sgml-build.stamp: setup-build.stamp $(DOC_MODULE)-decl.txt $(SCANOBJ_FILES) $(DOC_MODULE)-sections.txt $(DOC_MODULE)-overrides.txt $(expand_content_files)
+       @echo '  DOC   Building XML'
+       @_source_dir='' ; \
+       for i in $(DOC_SOURCE_DIR) ; do \
+           _source_dir="$${_source_dir} --source-dir=$$i" ; \
+       done ; \
+       gtkdoc-mkdb --module=$(DOC_MODULE) --output-format=xml --expand-content-files="$(expand_content_files)" --main-sgml-file=$(DOC_MAIN_SGML_FILE) $${_source_dir} $(MKDB_OPTIONS)
+       @touch sgml-build.stamp
+
+sgml.stamp: sgml-build.stamp
+       @true
+
+#### html ####
+
+html-build.stamp: sgml.stamp $(DOC_MAIN_SGML_FILE) $(content_files)
+       @echo '  DOC   Building HTML'
+       @rm -rf html
+       @mkdir html
+       @mkhtml_options=""; \
+       gtkdoc-mkhtml 2>&1 --help | grep  >/dev/null "\-\-verbose"; \
+       if test "$(?)" = "0"; then \
+         if test "x$(V)" = "x1"; then \
+           mkhtml_options="$$mkhtml_options --verbose"; \
+         fi; \
+       fi; \
+       gtkdoc-mkhtml 2>&1 --help | grep  >/dev/null "\-\-path"; \
+       if test "$(?)" = "0"; then \
+         mkhtml_options="$$mkhtml_options --path=\"$(abs_srcdir)\""; \
+       fi; \
+       cd html && gtkdoc-mkhtml $$mkhtml_options $(MKHTML_OPTIONS) $(DOC_MODULE) ../$(DOC_MAIN_SGML_FILE)
+       -@test "x$(HTML_IMAGES)" = "x" || \
+       for file in $(HTML_IMAGES) ; do \
+         if test -f $(abs_srcdir)/$$file ; then \
+           cp $(abs_srcdir)/$$file $(abs_builddir)/html; \
+         fi; \
+         if test -f $(abs_builddir)/$$file ; then \
+           cp $(abs_builddir)/$$file $(abs_builddir)/html; \
+         fi; \
+       done;
+       @echo '  DOC   Fixing cross-references'
+       @gtkdoc-fixxref --module=$(DOC_MODULE) --module-dir=html --html-dir=$(HTML_DIR) $(FIXXREF_OPTIONS)
+       @touch html-build.stamp
+
+#### pdf ####
+
+pdf-build.stamp: sgml.stamp $(DOC_MAIN_SGML_FILE) $(content_files)
+       @echo '  DOC   Building PDF'
+       @rm -f $(DOC_MODULE).pdf
+       @mkpdf_options=""; \
+       gtkdoc-mkpdf 2>&1 --help | grep  >/dev/null "\-\-verbose"; \
+       if test "$(?)" = "0"; then \
+         if test "x$(V)" = "x1"; then \
+           mkpdf_options="$$mkpdf_options --verbose"; \
+         fi; \
+       fi; \
+       if test "x$(HTML_IMAGES)" != "x"; then \
+         for img in $(HTML_IMAGES); do \
+           part=`dirname $$img`; \
+           echo $$mkpdf_options | grep >/dev/null "\-\-imgdir=$$part "; \
+           if test $$? != 0; then \
+             mkpdf_options="$$mkpdf_options --imgdir=$$part"; \
+           fi; \
+         done; \
+       fi; \
+       gtkdoc-mkpdf --path="$(abs_srcdir)" $$mkpdf_options $(DOC_MODULE) $(DOC_MAIN_SGML_FILE) $(MKPDF_OPTIONS)
+       @touch pdf-build.stamp
+
+##############
+
+clean-local:
+       @rm -f *~ *.bak
+       @rm -rf .libs
+
+distclean-local:
+       @rm -rf xml html $(REPORT_FILES) $(DOC_MODULE).pdf \
+           $(DOC_MODULE)-decl-list.txt $(DOC_MODULE)-decl.txt
+       @if test "$(abs_srcdir)" != "$(abs_builddir)" ; then \
+           rm -f $(SETUP_FILES) $(expand_content_files) $(DOC_MODULE).types; \
+       fi
+
+maintainer-clean-local: clean
+       @rm -rf xml html
+
+install-data-local:
+       @installfiles=`echo $(builddir)/html/*`; \
+       if test "$$installfiles" = '$(builddir)/html/*'; \
+       then echo 1>&2 'Nothing to install' ; \
+       else \
+         if test -n "$(DOC_MODULE_VERSION)"; then \
+           installdir="$(DESTDIR)$(TARGET_DIR)-$(DOC_MODULE_VERSION)"; \
+         else \
+           installdir="$(DESTDIR)$(TARGET_DIR)"; \
+         fi; \
+         $(mkinstalldirs) $${installdir} ; \
+         for i in $$installfiles; do \
+           echo ' $(INSTALL_DATA) '$$i ; \
+           $(INSTALL_DATA) $$i $${installdir}; \
+         done; \
+         if test -n "$(DOC_MODULE_VERSION)"; then \
+           mv -f $${installdir}/$(DOC_MODULE).devhelp2 \
+             $${installdir}/$(DOC_MODULE)-$(DOC_MODULE_VERSION).devhelp2; \
+         fi; \
+         $(GTKDOC_REBASE) --relative --dest-dir=$(DESTDIR) --html-dir=$${installdir}; \
+       fi
+
+uninstall-local:
+       @if test -n "$(DOC_MODULE_VERSION)"; then \
+         installdir="$(DESTDIR)$(TARGET_DIR)-$(DOC_MODULE_VERSION)"; \
+       else \
+         installdir="$(DESTDIR)$(TARGET_DIR)"; \
+       fi; \
+       rm -rf $${installdir}
+
+#
+# Require gtk-doc when making dist
+#
+if ENABLE_GTK_DOC
+dist-check-gtkdoc:
+else
+dist-check-gtkdoc:
+       @echo "*** gtk-doc must be installed and enabled in order to make dist"
+       @false
+endif
+
+dist-hook: dist-check-gtkdoc dist-hook-local
+       @mkdir $(distdir)/html
+       @cp ./html/* $(distdir)/html
+       @-cp ./$(DOC_MODULE).pdf $(distdir)/
+       @-cp ./$(DOC_MODULE).types $(distdir)/
+       @-cp ./$(DOC_MODULE)-sections.txt $(distdir)/
+       @cd $(distdir) && rm -f $(DISTCLEANFILES)
+       @$(GTKDOC_REBASE) --online --relative --html-dir=$(distdir)/html
+
+.PHONY : dist-hook-local docs
diff --git a/install-sh b/install-sh
new file mode 100755 (executable)
index 0000000..6781b98
--- /dev/null
@@ -0,0 +1,520 @@
+#!/bin/sh
+# install - install a program, script, or datafile
+
+scriptversion=2009-04-28.21; # UTC
+
+# This originates from X11R5 (mit/util/scripts/install.sh), which was
+# later released in X11R6 (xc/config/util/install.sh) with the
+# following copyright and license.
+#
+# Copyright (C) 1994 X Consortium
+#
+# Permission is hereby granted, free of charge, to any person obtaining a copy
+# of this software and associated documentation files (the "Software"), to
+# deal in the Software without restriction, including without limitation the
+# rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+# sell copies of the Software, and to permit persons to whom the Software is
+# furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be included in
+# all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
+# X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
+# AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC-
+# TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+# Except as contained in this notice, the name of the X Consortium shall not
+# be used in advertising or otherwise to promote the sale, use or other deal-
+# ings in this Software without prior written authorization from the X Consor-
+# tium.
+#
+#
+# FSF changes to this file are in the public domain.
+#
+# Calling this script install-sh is preferred over install.sh, to prevent
+# `make' implicit rules from creating a file called install from it
+# when there is no Makefile.
+#
+# This script is compatible with the BSD install script, but was written
+# from scratch.
+
+nl='
+'
+IFS=" ""       $nl"
+
+# set DOITPROG to echo to test this script
+
+# Don't use :- since 4.3BSD and earlier shells don't like it.
+doit=${DOITPROG-}
+if test -z "$doit"; then
+  doit_exec=exec
+else
+  doit_exec=$doit
+fi
+
+# Put in absolute file names if you don't have them in your path;
+# or use environment vars.
+
+chgrpprog=${CHGRPPROG-chgrp}
+chmodprog=${CHMODPROG-chmod}
+chownprog=${CHOWNPROG-chown}
+cmpprog=${CMPPROG-cmp}
+cpprog=${CPPROG-cp}
+mkdirprog=${MKDIRPROG-mkdir}
+mvprog=${MVPROG-mv}
+rmprog=${RMPROG-rm}
+stripprog=${STRIPPROG-strip}
+
+posix_glob='?'
+initialize_posix_glob='
+  test "$posix_glob" != "?" || {
+    if (set -f) 2>/dev/null; then
+      posix_glob=
+    else
+      posix_glob=:
+    fi
+  }
+'
+
+posix_mkdir=
+
+# Desired mode of installed file.
+mode=0755
+
+chgrpcmd=
+chmodcmd=$chmodprog
+chowncmd=
+mvcmd=$mvprog
+rmcmd="$rmprog -f"
+stripcmd=
+
+src=
+dst=
+dir_arg=
+dst_arg=
+
+copy_on_change=false
+no_target_directory=
+
+usage="\
+Usage: $0 [OPTION]... [-T] SRCFILE DSTFILE
+   or: $0 [OPTION]... SRCFILES... DIRECTORY
+   or: $0 [OPTION]... -t DIRECTORY SRCFILES...
+   or: $0 [OPTION]... -d DIRECTORIES...
+
+In the 1st form, copy SRCFILE to DSTFILE.
+In the 2nd and 3rd, copy all SRCFILES to DIRECTORY.
+In the 4th, create DIRECTORIES.
+
+Options:
+     --help     display this help and exit.
+     --version  display version info and exit.
+
+  -c            (ignored)
+  -C            install only if different (preserve the last data modification time)
+  -d            create directories instead of installing files.
+  -g GROUP      $chgrpprog installed files to GROUP.
+  -m MODE       $chmodprog installed files to MODE.
+  -o USER       $chownprog installed files to USER.
+  -s            $stripprog installed files.
+  -t DIRECTORY  install into DIRECTORY.
+  -T            report an error if DSTFILE is a directory.
+
+Environment variables override the default commands:
+  CHGRPPROG CHMODPROG CHOWNPROG CMPPROG CPPROG MKDIRPROG MVPROG
+  RMPROG STRIPPROG
+"
+
+while test $# -ne 0; do
+  case $1 in
+    -c) ;;
+
+    -C) copy_on_change=true;;
+
+    -d) dir_arg=true;;
+
+    -g) chgrpcmd="$chgrpprog $2"
+       shift;;
+
+    --help) echo "$usage"; exit $?;;
+
+    -m) mode=$2
+       case $mode in
+         *' '* | *'    '* | *'
+'*       | *'*'* | *'?'* | *'['*)
+           echo "$0: invalid mode: $mode" >&2
+           exit 1;;
+       esac
+       shift;;
+
+    -o) chowncmd="$chownprog $2"
+       shift;;
+
+    -s) stripcmd=$stripprog;;
+
+    -t) dst_arg=$2
+       shift;;
+
+    -T) no_target_directory=true;;
+
+    --version) echo "$0 $scriptversion"; exit $?;;
+
+    --)        shift
+       break;;
+
+    -*)        echo "$0: invalid option: $1" >&2
+       exit 1;;
+
+    *)  break;;
+  esac
+  shift
+done
+
+if test $# -ne 0 && test -z "$dir_arg$dst_arg"; then
+  # When -d is used, all remaining arguments are directories to create.
+  # When -t is used, the destination is already specified.
+  # Otherwise, the last argument is the destination.  Remove it from $@.
+  for arg
+  do
+    if test -n "$dst_arg"; then
+      # $@ is not empty: it contains at least $arg.
+      set fnord "$@" "$dst_arg"
+      shift # fnord
+    fi
+    shift # arg
+    dst_arg=$arg
+  done
+fi
+
+if test $# -eq 0; then
+  if test -z "$dir_arg"; then
+    echo "$0: no input file specified." >&2
+    exit 1
+  fi
+  # It's OK to call `install-sh -d' without argument.
+  # This can happen when creating conditional directories.
+  exit 0
+fi
+
+if test -z "$dir_arg"; then
+  trap '(exit $?); exit' 1 2 13 15
+
+  # Set umask so as not to create temps with too-generous modes.
+  # However, 'strip' requires both read and write access to temps.
+  case $mode in
+    # Optimize common cases.
+    *644) cp_umask=133;;
+    *755) cp_umask=22;;
+
+    *[0-7])
+      if test -z "$stripcmd"; then
+       u_plus_rw=
+      else
+       u_plus_rw='% 200'
+      fi
+      cp_umask=`expr '(' 777 - $mode % 1000 ')' $u_plus_rw`;;
+    *)
+      if test -z "$stripcmd"; then
+       u_plus_rw=
+      else
+       u_plus_rw=,u+rw
+      fi
+      cp_umask=$mode$u_plus_rw;;
+  esac
+fi
+
+for src
+do
+  # Protect names starting with `-'.
+  case $src in
+    -*) src=./$src;;
+  esac
+
+  if test -n "$dir_arg"; then
+    dst=$src
+    dstdir=$dst
+    test -d "$dstdir"
+    dstdir_status=$?
+  else
+
+    # Waiting for this to be detected by the "$cpprog $src $dsttmp" command
+    # might cause directories to be created, which would be especially bad
+    # if $src (and thus $dsttmp) contains '*'.
+    if test ! -f "$src" && test ! -d "$src"; then
+      echo "$0: $src does not exist." >&2
+      exit 1
+    fi
+
+    if test -z "$dst_arg"; then
+      echo "$0: no destination specified." >&2
+      exit 1
+    fi
+
+    dst=$dst_arg
+    # Protect names starting with `-'.
+    case $dst in
+      -*) dst=./$dst;;
+    esac
+
+    # If destination is a directory, append the input filename; won't work
+    # if double slashes aren't ignored.
+    if test -d "$dst"; then
+      if test -n "$no_target_directory"; then
+       echo "$0: $dst_arg: Is a directory" >&2
+       exit 1
+      fi
+      dstdir=$dst
+      dst=$dstdir/`basename "$src"`
+      dstdir_status=0
+    else
+      # Prefer dirname, but fall back on a substitute if dirname fails.
+      dstdir=`
+       (dirname "$dst") 2>/dev/null ||
+       expr X"$dst" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+            X"$dst" : 'X\(//\)[^/]' \| \
+            X"$dst" : 'X\(//\)$' \| \
+            X"$dst" : 'X\(/\)' \| . 2>/dev/null ||
+       echo X"$dst" |
+           sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+                  s//\1/
+                  q
+                }
+                /^X\(\/\/\)[^/].*/{
+                  s//\1/
+                  q
+                }
+                /^X\(\/\/\)$/{
+                  s//\1/
+                  q
+                }
+                /^X\(\/\).*/{
+                  s//\1/
+                  q
+                }
+                s/.*/./; q'
+      `
+
+      test -d "$dstdir"
+      dstdir_status=$?
+    fi
+  fi
+
+  obsolete_mkdir_used=false
+
+  if test $dstdir_status != 0; then
+    case $posix_mkdir in
+      '')
+       # Create intermediate dirs using mode 755 as modified by the umask.
+       # This is like FreeBSD 'install' as of 1997-10-28.
+       umask=`umask`
+       case $stripcmd.$umask in
+         # Optimize common cases.
+         *[2367][2367]) mkdir_umask=$umask;;
+         .*0[02][02] | .[02][02] | .[02]) mkdir_umask=22;;
+
+         *[0-7])
+           mkdir_umask=`expr $umask + 22 \
+             - $umask % 100 % 40 + $umask % 20 \
+             - $umask % 10 % 4 + $umask % 2
+           `;;
+         *) mkdir_umask=$umask,go-w;;
+       esac
+
+       # With -d, create the new directory with the user-specified mode.
+       # Otherwise, rely on $mkdir_umask.
+       if test -n "$dir_arg"; then
+         mkdir_mode=-m$mode
+       else
+         mkdir_mode=
+       fi
+
+       posix_mkdir=false
+       case $umask in
+         *[123567][0-7][0-7])
+           # POSIX mkdir -p sets u+wx bits regardless of umask, which
+           # is incompatible with FreeBSD 'install' when (umask & 300) != 0.
+           ;;
+         *)
+           tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$
+           trap 'ret=$?; rmdir "$tmpdir/d" "$tmpdir" 2>/dev/null; exit $ret' 0
+
+           if (umask $mkdir_umask &&
+               exec $mkdirprog $mkdir_mode -p -- "$tmpdir/d") >/dev/null 2>&1
+           then
+             if test -z "$dir_arg" || {
+                  # Check for POSIX incompatibilities with -m.
+                  # HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or
+                  # other-writeable bit of parent directory when it shouldn't.
+                  # FreeBSD 6.1 mkdir -m -p sets mode of existing directory.
+                  ls_ld_tmpdir=`ls -ld "$tmpdir"`
+                  case $ls_ld_tmpdir in
+                    d????-?r-*) different_mode=700;;
+                    d????-?--*) different_mode=755;;
+                    *) false;;
+                  esac &&
+                  $mkdirprog -m$different_mode -p -- "$tmpdir" && {
+                    ls_ld_tmpdir_1=`ls -ld "$tmpdir"`
+                    test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1"
+                  }
+                }
+             then posix_mkdir=:
+             fi
+             rmdir "$tmpdir/d" "$tmpdir"
+           else
+             # Remove any dirs left behind by ancient mkdir implementations.
+             rmdir ./$mkdir_mode ./-p ./-- 2>/dev/null
+           fi
+           trap '' 0;;
+       esac;;
+    esac
+
+    if
+      $posix_mkdir && (
+       umask $mkdir_umask &&
+       $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir"
+      )
+    then :
+    else
+
+      # The umask is ridiculous, or mkdir does not conform to POSIX,
+      # or it failed possibly due to a race condition.  Create the
+      # directory the slow way, step by step, checking for races as we go.
+
+      case $dstdir in
+       /*) prefix='/';;
+       -*) prefix='./';;
+       *)  prefix='';;
+      esac
+
+      eval "$initialize_posix_glob"
+
+      oIFS=$IFS
+      IFS=/
+      $posix_glob set -f
+      set fnord $dstdir
+      shift
+      $posix_glob set +f
+      IFS=$oIFS
+
+      prefixes=
+
+      for d
+      do
+       test -z "$d" && continue
+
+       prefix=$prefix$d
+       if test -d "$prefix"; then
+         prefixes=
+       else
+         if $posix_mkdir; then
+           (umask=$mkdir_umask &&
+            $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir") && break
+           # Don't fail if two instances are running concurrently.
+           test -d "$prefix" || exit 1
+         else
+           case $prefix in
+             *\'*) qprefix=`echo "$prefix" | sed "s/'/'\\\\\\\\''/g"`;;
+             *) qprefix=$prefix;;
+           esac
+           prefixes="$prefixes '$qprefix'"
+         fi
+       fi
+       prefix=$prefix/
+      done
+
+      if test -n "$prefixes"; then
+       # Don't fail if two instances are running concurrently.
+       (umask $mkdir_umask &&
+        eval "\$doit_exec \$mkdirprog $prefixes") ||
+         test -d "$dstdir" || exit 1
+       obsolete_mkdir_used=true
+      fi
+    fi
+  fi
+
+  if test -n "$dir_arg"; then
+    { test -z "$chowncmd" || $doit $chowncmd "$dst"; } &&
+    { test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } &&
+    { test "$obsolete_mkdir_used$chowncmd$chgrpcmd" = false ||
+      test -z "$chmodcmd" || $doit $chmodcmd $mode "$dst"; } || exit 1
+  else
+
+    # Make a couple of temp file names in the proper directory.
+    dsttmp=$dstdir/_inst.$$_
+    rmtmp=$dstdir/_rm.$$_
+
+    # Trap to clean up those temp files at exit.
+    trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0
+
+    # Copy the file name to the temp name.
+    (umask $cp_umask && $doit_exec $cpprog "$src" "$dsttmp") &&
+
+    # and set any options; do chmod last to preserve setuid bits.
+    #
+    # If any of these fail, we abort the whole thing.  If we want to
+    # ignore errors from any of these, just make sure not to ignore
+    # errors from the above "$doit $cpprog $src $dsttmp" command.
+    #
+    { test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } &&
+    { test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } &&
+    { test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } &&
+    { test -z "$chmodcmd" || $doit $chmodcmd $mode "$dsttmp"; } &&
+
+    # If -C, don't bother to copy if it wouldn't change the file.
+    if $copy_on_change &&
+       old=`LC_ALL=C ls -dlL "$dst"    2>/dev/null` &&
+       new=`LC_ALL=C ls -dlL "$dsttmp" 2>/dev/null` &&
+
+       eval "$initialize_posix_glob" &&
+       $posix_glob set -f &&
+       set X $old && old=:$2:$4:$5:$6 &&
+       set X $new && new=:$2:$4:$5:$6 &&
+       $posix_glob set +f &&
+
+       test "$old" = "$new" &&
+       $cmpprog "$dst" "$dsttmp" >/dev/null 2>&1
+    then
+      rm -f "$dsttmp"
+    else
+      # Rename the file to the real destination.
+      $doit $mvcmd -f "$dsttmp" "$dst" 2>/dev/null ||
+
+      # The rename failed, perhaps because mv can't rename something else
+      # to itself, or perhaps because mv is so ancient that it does not
+      # support -f.
+      {
+       # Now remove or move aside any old file at destination location.
+       # We try this two ways since rm can't unlink itself on some
+       # systems and the destination file might be busy for other
+       # reasons.  In this case, the final cleanup might fail but the new
+       # file should still install successfully.
+       {
+         test ! -f "$dst" ||
+         $doit $rmcmd -f "$dst" 2>/dev/null ||
+         { $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null &&
+           { $doit $rmcmd -f "$rmtmp" 2>/dev/null; :; }
+         } ||
+         { echo "$0: cannot unlink or rename $dst" >&2
+           (exit 1); exit 1
+         }
+       } &&
+
+       # Now rename the file to the real destination.
+       $doit $mvcmd "$dsttmp" "$dst"
+      }
+    fi || exit 1
+
+    trap '' 0
+  fi
+done
+
+# Local variables:
+# eval: (add-hook 'write-file-hooks 'time-stamp)
+# time-stamp-start: "scriptversion="
+# time-stamp-format: "%:y-%02m-%02d.%02H"
+# time-stamp-time-zone: "UTC"
+# time-stamp-end: "; # UTC"
+# End:
diff --git a/libpoppler-cpp.manifest b/libpoppler-cpp.manifest
new file mode 100644 (file)
index 0000000..81ace0c
--- /dev/null
@@ -0,0 +1,6 @@
+<manifest>
+       <request>
+               <domain name="_"/>
+       </request>
+</manifest>
+
diff --git a/libpoppler-glib.manifest b/libpoppler-glib.manifest
new file mode 100644 (file)
index 0000000..81ace0c
--- /dev/null
@@ -0,0 +1,6 @@
+<manifest>
+       <request>
+               <domain name="_"/>
+       </request>
+</manifest>
+
diff --git a/libpoppler.manifest b/libpoppler.manifest
new file mode 100644 (file)
index 0000000..81ace0c
--- /dev/null
@@ -0,0 +1,6 @@
+<manifest>
+       <request>
+               <domain name="_"/>
+       </request>
+</manifest>
+
diff --git a/ltmain.sh b/ltmain.sh
new file mode 100644 (file)
index 0000000..c2852d8
--- /dev/null
+++ b/ltmain.sh
@@ -0,0 +1,9661 @@
+
+# libtool (GNU libtool) 2.4.2
+# Written by Gordon Matzigkeit <gord@gnu.ai.mit.edu>, 1996
+
+# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, 2006,
+# 2007, 2008, 2009, 2010, 2011 Free Software Foundation, Inc.
+# This is free software; see the source for copying conditions.  There is NO
+# warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+
+# GNU Libtool is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# As a special exception to the GNU General Public License,
+# if you distribute this file as part of a program or library that
+# is built using GNU Libtool, you may include this file under the
+# same distribution terms that you use for the rest of that program.
+#
+# GNU Libtool is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GNU Libtool; see the file COPYING.  If not, a copy
+# can be downloaded from http://www.gnu.org/licenses/gpl.html,
+# or obtained by writing to the Free Software Foundation, Inc.,
+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+
+# Usage: $progname [OPTION]... [MODE-ARG]...
+#
+# Provide generalized library-building support services.
+#
+#       --config             show all configuration variables
+#       --debug              enable verbose shell tracing
+#   -n, --dry-run            display commands without modifying any files
+#       --features           display basic configuration information and exit
+#       --mode=MODE          use operation mode MODE
+#       --preserve-dup-deps  don't remove duplicate dependency libraries
+#       --quiet, --silent    don't print informational messages
+#       --no-quiet, --no-silent
+#                            print informational messages (default)
+#       --no-warn            don't display warning messages
+#       --tag=TAG            use configuration variables from tag TAG
+#   -v, --verbose            print more informational messages than default
+#       --no-verbose         don't print the extra informational messages
+#       --version            print version information
+#   -h, --help, --help-all   print short, long, or detailed help message
+#
+# MODE must be one of the following:
+#
+#         clean              remove files from the build directory
+#         compile            compile a source file into a libtool object
+#         execute            automatically set library path, then run a program
+#         finish             complete the installation of libtool libraries
+#         install            install libraries or executables
+#         link               create a library or an executable
+#         uninstall          remove libraries from an installed directory
+#
+# MODE-ARGS vary depending on the MODE.  When passed as first option,
+# `--mode=MODE' may be abbreviated as `MODE' or a unique abbreviation of that.
+# Try `$progname --help --mode=MODE' for a more detailed description of MODE.
+#
+# When reporting a bug, please describe a test case to reproduce it and
+# include the following information:
+#
+#         host-triplet:        $host
+#         shell:               $SHELL
+#         compiler:            $LTCC
+#         compiler flags:              $LTCFLAGS
+#         linker:              $LD (gnu? $with_gnu_ld)
+#         $progname:   (GNU libtool) 2.4.2 Debian-2.4.2-1ubuntu1
+#         automake:    $automake_version
+#         autoconf:    $autoconf_version
+#
+# Report bugs to <bug-libtool@gnu.org>.
+# GNU libtool home page: <http://www.gnu.org/software/libtool/>.
+# General help using GNU software: <http://www.gnu.org/gethelp/>.
+
+PROGRAM=libtool
+PACKAGE=libtool
+VERSION="2.4.2 Debian-2.4.2-1ubuntu1"
+TIMESTAMP=""
+package_revision=1.3337
+
+# Be Bourne compatible
+if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then
+  emulate sh
+  NULLCMD=:
+  # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which
+  # is contrary to our usage.  Disable this feature.
+  alias -g '${1+"$@"}'='"$@"'
+  setopt NO_GLOB_SUBST
+else
+  case `(set -o) 2>/dev/null` in *posix*) set -o posix;; esac
+fi
+BIN_SH=xpg4; export BIN_SH # for Tru64
+DUALCASE=1; export DUALCASE # for MKS sh
+
+# A function that is used when there is no print builtin or printf.
+func_fallback_echo ()
+{
+  eval 'cat <<_LTECHO_EOF
+$1
+_LTECHO_EOF'
+}
+
+# NLS nuisances: We save the old values to restore during execute mode.
+lt_user_locale=
+lt_safe_locale=
+for lt_var in LANG LANGUAGE LC_ALL LC_CTYPE LC_COLLATE LC_MESSAGES
+do
+  eval "if test \"\${$lt_var+set}\" = set; then
+          save_$lt_var=\$$lt_var
+          $lt_var=C
+         export $lt_var
+         lt_user_locale=\"$lt_var=\\\$save_\$lt_var; \$lt_user_locale\"
+         lt_safe_locale=\"$lt_var=C; \$lt_safe_locale\"
+       fi"
+done
+LC_ALL=C
+LANGUAGE=C
+export LANGUAGE LC_ALL
+
+$lt_unset CDPATH
+
+
+# Work around backward compatibility issue on IRIX 6.5. On IRIX 6.4+, sh
+# is ksh but when the shell is invoked as "sh" and the current value of
+# the _XPG environment variable is not equal to 1 (one), the special
+# positional parameter $0, within a function call, is the name of the
+# function.
+progpath="$0"
+
+
+
+: ${CP="cp -f"}
+test "${ECHO+set}" = set || ECHO=${as_echo-'printf %s\n'}
+: ${MAKE="make"}
+: ${MKDIR="mkdir"}
+: ${MV="mv -f"}
+: ${RM="rm -f"}
+: ${SHELL="${CONFIG_SHELL-/bin/sh}"}
+: ${Xsed="$SED -e 1s/^X//"}
+
+# Global variables:
+EXIT_SUCCESS=0
+EXIT_FAILURE=1
+EXIT_MISMATCH=63  # $? = 63 is used to indicate version mismatch to missing.
+EXIT_SKIP=77     # $? = 77 is used to indicate a skipped test to automake.
+
+exit_status=$EXIT_SUCCESS
+
+# Make sure IFS has a sensible default
+lt_nl='
+'
+IFS="  $lt_nl"
+
+dirname="s,/[^/]*$,,"
+basename="s,^.*/,,"
+
+# func_dirname file append nondir_replacement
+# Compute the dirname of FILE.  If nonempty, add APPEND to the result,
+# otherwise set result to NONDIR_REPLACEMENT.
+func_dirname ()
+{
+    func_dirname_result=`$ECHO "${1}" | $SED "$dirname"`
+    if test "X$func_dirname_result" = "X${1}"; then
+      func_dirname_result="${3}"
+    else
+      func_dirname_result="$func_dirname_result${2}"
+    fi
+} # func_dirname may be replaced by extended shell implementation
+
+
+# func_basename file
+func_basename ()
+{
+    func_basename_result=`$ECHO "${1}" | $SED "$basename"`
+} # func_basename may be replaced by extended shell implementation
+
+
+# func_dirname_and_basename file append nondir_replacement
+# perform func_basename and func_dirname in a single function
+# call:
+#   dirname:  Compute the dirname of FILE.  If nonempty,
+#             add APPEND to the result, otherwise set result
+#             to NONDIR_REPLACEMENT.
+#             value returned in "$func_dirname_result"
+#   basename: Compute filename of FILE.
+#             value retuned in "$func_basename_result"
+# Implementation must be kept synchronized with func_dirname
+# and func_basename. For efficiency, we do not delegate to
+# those functions but instead duplicate the functionality here.
+func_dirname_and_basename ()
+{
+    # Extract subdirectory from the argument.
+    func_dirname_result=`$ECHO "${1}" | $SED -e "$dirname"`
+    if test "X$func_dirname_result" = "X${1}"; then
+      func_dirname_result="${3}"
+    else
+      func_dirname_result="$func_dirname_result${2}"
+    fi
+    func_basename_result=`$ECHO "${1}" | $SED -e "$basename"`
+} # func_dirname_and_basename may be replaced by extended shell implementation
+
+
+# func_stripname prefix suffix name
+# strip PREFIX and SUFFIX off of NAME.
+# PREFIX and SUFFIX must not contain globbing or regex special
+# characters, hashes, percent signs, but SUFFIX may contain a leading
+# dot (in which case that matches only a dot).
+# func_strip_suffix prefix name
+func_stripname ()
+{
+    case ${2} in
+      .*) func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%\\\\${2}\$%%"`;;
+      *)  func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%${2}\$%%"`;;
+    esac
+} # func_stripname may be replaced by extended shell implementation
+
+
+# These SED scripts presuppose an absolute path with a trailing slash.
+pathcar='s,^/\([^/]*\).*$,\1,'
+pathcdr='s,^/[^/]*,,'
+removedotparts=':dotsl
+               s@/\./@/@g
+               t dotsl
+               s,/\.$,/,'
+collapseslashes='s@/\{1,\}@/@g'
+finalslash='s,/*$,/,'
+
+# func_normal_abspath PATH
+# Remove doubled-up and trailing slashes, "." path components,
+# and cancel out any ".." path components in PATH after making
+# it an absolute path.
+#             value returned in "$func_normal_abspath_result"
+func_normal_abspath ()
+{
+  # Start from root dir and reassemble the path.
+  func_normal_abspath_result=
+  func_normal_abspath_tpath=$1
+  func_normal_abspath_altnamespace=
+  case $func_normal_abspath_tpath in
+    "")
+      # Empty path, that just means $cwd.
+      func_stripname '' '/' "`pwd`"
+      func_normal_abspath_result=$func_stripname_result
+      return
+    ;;
+    # The next three entries are used to spot a run of precisely
+    # two leading slashes without using negated character classes;
+    # we take advantage of case's first-match behaviour.
+    ///*)
+      # Unusual form of absolute path, do nothing.
+    ;;
+    //*)
+      # Not necessarily an ordinary path; POSIX reserves leading '//'
+      # and for example Cygwin uses it to access remote file shares
+      # over CIFS/SMB, so we conserve a leading double slash if found.
+      func_normal_abspath_altnamespace=/
+    ;;
+    /*)
+      # Absolute path, do nothing.
+    ;;
+    *)
+      # Relative path, prepend $cwd.
+      func_normal_abspath_tpath=`pwd`/$func_normal_abspath_tpath
+    ;;
+  esac
+  # Cancel out all the simple stuff to save iterations.  We also want
+  # the path to end with a slash for ease of parsing, so make sure
+  # there is one (and only one) here.
+  func_normal_abspath_tpath=`$ECHO "$func_normal_abspath_tpath" | $SED \
+        -e "$removedotparts" -e "$collapseslashes" -e "$finalslash"`
+  while :; do
+    # Processed it all yet?
+    if test "$func_normal_abspath_tpath" = / ; then
+      # If we ascended to the root using ".." the result may be empty now.
+      if test -z "$func_normal_abspath_result" ; then
+        func_normal_abspath_result=/
+      fi
+      break
+    fi
+    func_normal_abspath_tcomponent=`$ECHO "$func_normal_abspath_tpath" | $SED \
+        -e "$pathcar"`
+    func_normal_abspath_tpath=`$ECHO "$func_normal_abspath_tpath" | $SED \
+        -e "$pathcdr"`
+    # Figure out what to do with it
+    case $func_normal_abspath_tcomponent in
+      "")
+        # Trailing empty path component, ignore it.
+      ;;
+      ..)
+        # Parent dir; strip last assembled component from result.
+        func_dirname "$func_normal_abspath_result"
+        func_normal_abspath_result=$func_dirname_result
+      ;;
+      *)
+        # Actual path component, append it.
+        func_normal_abspath_result=$func_normal_abspath_result/$func_normal_abspath_tcomponent
+      ;;
+    esac
+  done
+  # Restore leading double-slash if one was found on entry.
+  func_normal_abspath_result=$func_normal_abspath_altnamespace$func_normal_abspath_result
+}
+
+# func_relative_path SRCDIR DSTDIR
+# generates a relative path from SRCDIR to DSTDIR, with a trailing
+# slash if non-empty, suitable for immediately appending a filename
+# without needing to append a separator.
+#             value returned in "$func_relative_path_result"
+func_relative_path ()
+{
+  func_relative_path_result=
+  func_normal_abspath "$1"
+  func_relative_path_tlibdir=$func_normal_abspath_result
+  func_normal_abspath "$2"
+  func_relative_path_tbindir=$func_normal_abspath_result
+
+  # Ascend the tree starting from libdir
+  while :; do
+    # check if we have found a prefix of bindir
+    case $func_relative_path_tbindir in
+      $func_relative_path_tlibdir)
+        # found an exact match
+        func_relative_path_tcancelled=
+        break
+        ;;
+      $func_relative_path_tlibdir*)
+        # found a matching prefix
+        func_stripname "$func_relative_path_tlibdir" '' "$func_relative_path_tbindir"
+        func_relative_path_tcancelled=$func_stripname_result
+        if test -z "$func_relative_path_result"; then
+          func_relative_path_result=.
+        fi
+        break
+        ;;
+      *)
+        func_dirname $func_relative_path_tlibdir
+        func_relative_path_tlibdir=${func_dirname_result}
+        if test "x$func_relative_path_tlibdir" = x ; then
+          # Have to descend all the way to the root!
+          func_relative_path_result=../$func_relative_path_result
+          func_relative_path_tcancelled=$func_relative_path_tbindir
+          break
+        fi
+        func_relative_path_result=../$func_relative_path_result
+        ;;
+    esac
+  done
+
+  # Now calculate path; take care to avoid doubling-up slashes.
+  func_stripname '' '/' "$func_relative_path_result"
+  func_relative_path_result=$func_stripname_result
+  func_stripname '/' '/' "$func_relative_path_tcancelled"
+  if test "x$func_stripname_result" != x ; then
+    func_relative_path_result=${func_relative_path_result}/${func_stripname_result}
+  fi
+
+  # Normalisation. If bindir is libdir, return empty string,
+  # else relative path ending with a slash; either way, target
+  # file name can be directly appended.
+  if test ! -z "$func_relative_path_result"; then
+    func_stripname './' '' "$func_relative_path_result/"
+    func_relative_path_result=$func_stripname_result
+  fi
+}
+
+# The name of this program:
+func_dirname_and_basename "$progpath"
+progname=$func_basename_result
+
+# Make sure we have an absolute path for reexecution:
+case $progpath in
+  [\\/]*|[A-Za-z]:\\*) ;;
+  *[\\/]*)
+     progdir=$func_dirname_result
+     progdir=`cd "$progdir" && pwd`
+     progpath="$progdir/$progname"
+     ;;
+  *)
+     save_IFS="$IFS"
+     IFS=${PATH_SEPARATOR-:}
+     for progdir in $PATH; do
+       IFS="$save_IFS"
+       test -x "$progdir/$progname" && break
+     done
+     IFS="$save_IFS"
+     test -n "$progdir" || progdir=`pwd`
+     progpath="$progdir/$progname"
+     ;;
+esac
+
+# Sed substitution that helps us do robust quoting.  It backslashifies
+# metacharacters that are still active within double-quoted strings.
+Xsed="${SED}"' -e 1s/^X//'
+sed_quote_subst='s/\([`"$\\]\)/\\\1/g'
+
+# Same as above, but do not quote variable references.
+double_quote_subst='s/\(["`\\]\)/\\\1/g'
+
+# Sed substitution that turns a string into a regex matching for the
+# string literally.
+sed_make_literal_regex='s,[].[^$\\*\/],\\&,g'
+
+# Sed substitution that converts a w32 file name or path
+# which contains forward slashes, into one that contains
+# (escaped) backslashes.  A very naive implementation.
+lt_sed_naive_backslashify='s|\\\\*|\\|g;s|/|\\|g;s|\\|\\\\|g'
+
+# Re-`\' parameter expansions in output of double_quote_subst that were
+# `\'-ed in input to the same.  If an odd number of `\' preceded a '$'
+# in input to double_quote_subst, that '$' was protected from expansion.
+# Since each input `\' is now two `\'s, look for any number of runs of
+# four `\'s followed by two `\'s and then a '$'.  `\' that '$'.
+bs='\\'
+bs2='\\\\'
+bs4='\\\\\\\\'
+dollar='\$'
+sed_double_backslash="\
+  s/$bs4/&\\
+/g
+  s/^$bs2$dollar/$bs&/
+  s/\\([^$bs]\\)$bs2$dollar/\\1$bs2$bs$dollar/g
+  s/\n//g"
+
+# Standard options:
+opt_dry_run=false
+opt_help=false
+opt_quiet=false
+opt_verbose=false
+opt_warning=:
+
+# func_echo arg...
+# Echo program name prefixed message, along with the current mode
+# name if it has been set yet.
+func_echo ()
+{
+    $ECHO "$progname: ${opt_mode+$opt_mode: }$*"
+}
+
+# func_verbose arg...
+# Echo program name prefixed message in verbose mode only.
+func_verbose ()
+{
+    $opt_verbose && func_echo ${1+"$@"}
+
+    # A bug in bash halts the script if the last line of a function
+    # fails when set -e is in force, so we need another command to
+    # work around that:
+    :
+}
+
+# func_echo_all arg...
+# Invoke $ECHO with all args, space-separated.
+func_echo_all ()
+{
+    $ECHO "$*"
+}
+
+# func_error arg...
+# Echo program name prefixed message to standard error.
+func_error ()
+{
+    $ECHO "$progname: ${opt_mode+$opt_mode: }"${1+"$@"} 1>&2
+}
+
+# func_warning arg...
+# Echo program name prefixed warning message to standard error.
+func_warning ()
+{
+    $opt_warning && $ECHO "$progname: ${opt_mode+$opt_mode: }warning: "${1+"$@"} 1>&2
+
+    # bash bug again:
+    :
+}
+
+# func_fatal_error arg...
+# Echo program name prefixed message to standard error, and exit.
+func_fatal_error ()
+{
+    func_error ${1+"$@"}
+    exit $EXIT_FAILURE
+}
+
+# func_fatal_help arg...
+# Echo program name prefixed message to standard error, followed by
+# a help hint, and exit.
+func_fatal_help ()
+{
+    func_error ${1+"$@"}
+    func_fatal_error "$help"
+}
+help="Try \`$progname --help' for more information."  ## default
+
+
+# func_grep expression filename
+# Check whether EXPRESSION matches any line of FILENAME, without output.
+func_grep ()
+{
+    $GREP "$1" "$2" >/dev/null 2>&1
+}
+
+
+# func_mkdir_p directory-path
+# Make sure the entire path to DIRECTORY-PATH is available.
+func_mkdir_p ()
+{
+    my_directory_path="$1"
+    my_dir_list=
+
+    if test -n "$my_directory_path" && test "$opt_dry_run" != ":"; then
+
+      # Protect directory names starting with `-'
+      case $my_directory_path in
+        -*) my_directory_path="./$my_directory_path" ;;
+      esac
+
+      # While some portion of DIR does not yet exist...
+      while test ! -d "$my_directory_path"; do
+        # ...make a list in topmost first order.  Use a colon delimited
+       # list incase some portion of path contains whitespace.
+        my_dir_list="$my_directory_path:$my_dir_list"
+
+        # If the last portion added has no slash in it, the list is done
+        case $my_directory_path in */*) ;; *) break ;; esac
+
+        # ...otherwise throw away the child directory and loop
+        my_directory_path=`$ECHO "$my_directory_path" | $SED -e "$dirname"`
+      done
+      my_dir_list=`$ECHO "$my_dir_list" | $SED 's,:*$,,'`
+
+      save_mkdir_p_IFS="$IFS"; IFS=':'
+      for my_dir in $my_dir_list; do
+       IFS="$save_mkdir_p_IFS"
+        # mkdir can fail with a `File exist' error if two processes
+        # try to create one of the directories concurrently.  Don't
+        # stop in that case!
+        $MKDIR "$my_dir" 2>/dev/null || :
+      done
+      IFS="$save_mkdir_p_IFS"
+
+      # Bail out if we (or some other process) failed to create a directory.
+      test -d "$my_directory_path" || \
+        func_fatal_error "Failed to create \`$1'"
+    fi
+}
+
+
+# func_mktempdir [string]
+# Make a temporary directory that won't clash with other running
+# libtool processes, and avoids race conditions if possible.  If
+# given, STRING is the basename for that directory.
+func_mktempdir ()
+{
+    my_template="${TMPDIR-/tmp}/${1-$progname}"
+
+    if test "$opt_dry_run" = ":"; then
+      # Return a directory name, but don't create it in dry-run mode
+      my_tmpdir="${my_template}-$$"
+    else
+
+      # If mktemp works, use that first and foremost
+      my_tmpdir=`mktemp -d "${my_template}-XXXXXXXX" 2>/dev/null`
+
+      if test ! -d "$my_tmpdir"; then
+        # Failing that, at least try and use $RANDOM to avoid a race
+        my_tmpdir="${my_template}-${RANDOM-0}$$"
+
+        save_mktempdir_umask=`umask`
+        umask 0077
+        $MKDIR "$my_tmpdir"
+        umask $save_mktempdir_umask
+      fi
+
+      # If we're not in dry-run mode, bomb out on failure
+      test -d "$my_tmpdir" || \
+        func_fatal_error "cannot create temporary directory \`$my_tmpdir'"
+    fi
+
+    $ECHO "$my_tmpdir"
+}
+
+
+# func_quote_for_eval arg
+# Aesthetically quote ARG to be evaled later.
+# This function returns two values: FUNC_QUOTE_FOR_EVAL_RESULT
+# is double-quoted, suitable for a subsequent eval, whereas
+# FUNC_QUOTE_FOR_EVAL_UNQUOTED_RESULT has merely all characters
+# which are still active within double quotes backslashified.
+func_quote_for_eval ()
+{
+    case $1 in
+      *[\\\`\"\$]*)
+       func_quote_for_eval_unquoted_result=`$ECHO "$1" | $SED "$sed_quote_subst"` ;;
+      *)
+        func_quote_for_eval_unquoted_result="$1" ;;
+    esac
+
+    case $func_quote_for_eval_unquoted_result in
+      # Double-quote args containing shell metacharacters to delay
+      # word splitting, command substitution and and variable
+      # expansion for a subsequent eval.
+      # Many Bourne shells cannot handle close brackets correctly
+      # in scan sets, so we specify it separately.
+      *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \    ]*|*]*|"")
+        func_quote_for_eval_result="\"$func_quote_for_eval_unquoted_result\""
+        ;;
+      *)
+        func_quote_for_eval_result="$func_quote_for_eval_unquoted_result"
+    esac
+}
+
+
+# func_quote_for_expand arg
+# Aesthetically quote ARG to be evaled later; same as above,
+# but do not quote variable references.
+func_quote_for_expand ()
+{
+    case $1 in
+      *[\\\`\"]*)
+       my_arg=`$ECHO "$1" | $SED \
+           -e "$double_quote_subst" -e "$sed_double_backslash"` ;;
+      *)
+        my_arg="$1" ;;
+    esac
+
+    case $my_arg in
+      # Double-quote args containing shell metacharacters to delay
+      # word splitting and command substitution for a subsequent eval.
+      # Many Bourne shells cannot handle close brackets correctly
+      # in scan sets, so we specify it separately.
+      *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \    ]*|*]*|"")
+        my_arg="\"$my_arg\""
+        ;;
+    esac
+
+    func_quote_for_expand_result="$my_arg"
+}
+
+
+# func_show_eval cmd [fail_exp]
+# Unless opt_silent is true, then output CMD.  Then, if opt_dryrun is
+# not true, evaluate CMD.  If the evaluation of CMD fails, and FAIL_EXP
+# is given, then evaluate it.
+func_show_eval ()
+{
+    my_cmd="$1"
+    my_fail_exp="${2-:}"
+
+    ${opt_silent-false} || {
+      func_quote_for_expand "$my_cmd"
+      eval "func_echo $func_quote_for_expand_result"
+    }
+
+    if ${opt_dry_run-false}; then :; else
+      eval "$my_cmd"
+      my_status=$?
+      if test "$my_status" -eq 0; then :; else
+       eval "(exit $my_status); $my_fail_exp"
+      fi
+    fi
+}
+
+
+# func_show_eval_locale cmd [fail_exp]
+# Unless opt_silent is true, then output CMD.  Then, if opt_dryrun is
+# not true, evaluate CMD.  If the evaluation of CMD fails, and FAIL_EXP
+# is given, then evaluate it.  Use the saved locale for evaluation.
+func_show_eval_locale ()
+{
+    my_cmd="$1"
+    my_fail_exp="${2-:}"
+
+    ${opt_silent-false} || {
+      func_quote_for_expand "$my_cmd"
+      eval "func_echo $func_quote_for_expand_result"
+    }
+
+    if ${opt_dry_run-false}; then :; else
+      eval "$lt_user_locale
+           $my_cmd"
+      my_status=$?
+      eval "$lt_safe_locale"
+      if test "$my_status" -eq 0; then :; else
+       eval "(exit $my_status); $my_fail_exp"
+      fi
+    fi
+}
+
+# func_tr_sh
+# Turn $1 into a string suitable for a shell variable name.
+# Result is stored in $func_tr_sh_result.  All characters
+# not in the set a-zA-Z0-9_ are replaced with '_'. Further,
+# if $1 begins with a digit, a '_' is prepended as well.
+func_tr_sh ()
+{
+  case $1 in
+  [0-9]* | *[!a-zA-Z0-9_]*)
+    func_tr_sh_result=`$ECHO "$1" | $SED 's/^\([0-9]\)/_\1/; s/[^a-zA-Z0-9_]/_/g'`
+    ;;
+  * )
+    func_tr_sh_result=$1
+    ;;
+  esac
+}
+
+
+# func_version
+# Echo version message to standard output and exit.
+func_version ()
+{
+    $opt_debug
+
+    $SED -n '/(C)/!b go
+       :more
+       /\./!{
+         N
+         s/\n# / /
+         b more
+       }
+       :go
+       /^# '$PROGRAM' (GNU /,/# warranty; / {
+        s/^# //
+       s/^# *$//
+        s/\((C)\)[ 0-9,-]*\( [1-9][0-9]*\)/\1\2/
+        p
+     }' < "$progpath"
+     exit $?
+}
+
+# func_usage
+# Echo short help message to standard output and exit.
+func_usage ()
+{
+    $opt_debug
+
+    $SED -n '/^# Usage:/,/^#  *.*--help/ {
+        s/^# //
+       s/^# *$//
+       s/\$progname/'$progname'/
+       p
+    }' < "$progpath"
+    echo
+    $ECHO "run \`$progname --help | more' for full usage"
+    exit $?
+}
+
+# func_help [NOEXIT]
+# Echo long help message to standard output and exit,
+# unless 'noexit' is passed as argument.
+func_help ()
+{
+    $opt_debug
+
+    $SED -n '/^# Usage:/,/# Report bugs to/ {
+       :print
+        s/^# //
+       s/^# *$//
+       s*\$progname*'$progname'*
+       s*\$host*'"$host"'*
+       s*\$SHELL*'"$SHELL"'*
+       s*\$LTCC*'"$LTCC"'*
+       s*\$LTCFLAGS*'"$LTCFLAGS"'*
+       s*\$LD*'"$LD"'*
+       s/\$with_gnu_ld/'"$with_gnu_ld"'/
+       s/\$automake_version/'"`(${AUTOMAKE-automake} --version) 2>/dev/null |$SED 1q`"'/
+       s/\$autoconf_version/'"`(${AUTOCONF-autoconf} --version) 2>/dev/null |$SED 1q`"'/
+       p
+       d
+     }
+     /^# .* home page:/b print
+     /^# General help using/b print
+     ' < "$progpath"
+    ret=$?
+    if test -z "$1"; then
+      exit $ret
+    fi
+}
+
+# func_missing_arg argname
+# Echo program name prefixed message to standard error and set global
+# exit_cmd.
+func_missing_arg ()
+{
+    $opt_debug
+
+    func_error "missing argument for $1."
+    exit_cmd=exit
+}
+
+
+# func_split_short_opt shortopt
+# Set func_split_short_opt_name and func_split_short_opt_arg shell
+# variables after splitting SHORTOPT after the 2nd character.
+func_split_short_opt ()
+{
+    my_sed_short_opt='1s/^\(..\).*$/\1/;q'
+    my_sed_short_rest='1s/^..\(.*\)$/\1/;q'
+
+    func_split_short_opt_name=`$ECHO "$1" | $SED "$my_sed_short_opt"`
+    func_split_short_opt_arg=`$ECHO "$1" | $SED "$my_sed_short_rest"`
+} # func_split_short_opt may be replaced by extended shell implementation
+
+
+# func_split_long_opt longopt
+# Set func_split_long_opt_name and func_split_long_opt_arg shell
+# variables after splitting LONGOPT at the `=' sign.
+func_split_long_opt ()
+{
+    my_sed_long_opt='1s/^\(--[^=]*\)=.*/\1/;q'
+    my_sed_long_arg='1s/^--[^=]*=//'
+
+    func_split_long_opt_name=`$ECHO "$1" | $SED "$my_sed_long_opt"`
+    func_split_long_opt_arg=`$ECHO "$1" | $SED "$my_sed_long_arg"`
+} # func_split_long_opt may be replaced by extended shell implementation
+
+exit_cmd=:
+
+
+
+
+
+magic="%%%MAGIC variable%%%"
+magic_exe="%%%MAGIC EXE variable%%%"
+
+# Global variables.
+nonopt=
+preserve_args=
+lo2o="s/\\.lo\$/.${objext}/"
+o2lo="s/\\.${objext}\$/.lo/"
+extracted_archives=
+extracted_serial=0
+
+# If this variable is set in any of the actions, the command in it
+# will be execed at the end.  This prevents here-documents from being
+# left over by shells.
+exec_cmd=
+
+# func_append var value
+# Append VALUE to the end of shell variable VAR.
+func_append ()
+{
+    eval "${1}=\$${1}\${2}"
+} # func_append may be replaced by extended shell implementation
+
+# func_append_quoted var value
+# Quote VALUE and append to the end of shell variable VAR, separated
+# by a space.
+func_append_quoted ()
+{
+    func_quote_for_eval "${2}"
+    eval "${1}=\$${1}\\ \$func_quote_for_eval_result"
+} # func_append_quoted may be replaced by extended shell implementation
+
+
+# func_arith arithmetic-term...
+func_arith ()
+{
+    func_arith_result=`expr "${@}"`
+} # func_arith may be replaced by extended shell implementation
+
+
+# func_len string
+# STRING may not start with a hyphen.
+func_len ()
+{
+    func_len_result=`expr "${1}" : ".*" 2>/dev/null || echo $max_cmd_len`
+} # func_len may be replaced by extended shell implementation
+
+
+# func_lo2o object
+func_lo2o ()
+{
+    func_lo2o_result=`$ECHO "${1}" | $SED "$lo2o"`
+} # func_lo2o may be replaced by extended shell implementation
+
+
+# func_xform libobj-or-source
+func_xform ()
+{
+    func_xform_result=`$ECHO "${1}" | $SED 's/\.[^.]*$/.lo/'`
+} # func_xform may be replaced by extended shell implementation
+
+
+# func_fatal_configuration arg...
+# Echo program name prefixed message to standard error, followed by
+# a configuration failure hint, and exit.
+func_fatal_configuration ()
+{
+    func_error ${1+"$@"}
+    func_error "See the $PACKAGE documentation for more information."
+    func_fatal_error "Fatal configuration error."
+}
+
+
+# func_config
+# Display the configuration for all the tags in this script.
+func_config ()
+{
+    re_begincf='^# ### BEGIN LIBTOOL'
+    re_endcf='^# ### END LIBTOOL'
+
+    # Default configuration.
+    $SED "1,/$re_begincf CONFIG/d;/$re_endcf CONFIG/,\$d" < "$progpath"
+
+    # Now print the configurations for the tags.
+    for tagname in $taglist; do
+      $SED -n "/$re_begincf TAG CONFIG: $tagname\$/,/$re_endcf TAG CONFIG: $tagname\$/p" < "$progpath"
+    done
+
+    exit $?
+}
+
+# func_features
+# Display the features supported by this script.
+func_features ()
+{
+    echo "host: $host"
+    if test "$build_libtool_libs" = yes; then
+      echo "enable shared libraries"
+    else
+      echo "disable shared libraries"
+    fi
+    if test "$build_old_libs" = yes; then
+      echo "enable static libraries"
+    else
+      echo "disable static libraries"
+    fi
+
+    exit $?
+}
+
+# func_enable_tag tagname
+# Verify that TAGNAME is valid, and either flag an error and exit, or
+# enable the TAGNAME tag.  We also add TAGNAME to the global $taglist
+# variable here.
+func_enable_tag ()
+{
+  # Global variable:
+  tagname="$1"
+
+  re_begincf="^# ### BEGIN LIBTOOL TAG CONFIG: $tagname\$"
+  re_endcf="^# ### END LIBTOOL TAG CONFIG: $tagname\$"
+  sed_extractcf="/$re_begincf/,/$re_endcf/p"
+
+  # Validate tagname.
+  case $tagname in
+    *[!-_A-Za-z0-9,/]*)
+      func_fatal_error "invalid tag name: $tagname"
+      ;;
+  esac
+
+  # Don't test for the "default" C tag, as we know it's
+  # there but not specially marked.
+  case $tagname in
+    CC) ;;
+    *)
+      if $GREP "$re_begincf" "$progpath" >/dev/null 2>&1; then
+       taglist="$taglist $tagname"
+
+       # Evaluate the configuration.  Be careful to quote the path
+       # and the sed script, to avoid splitting on whitespace, but
+       # also don't use non-portable quotes within backquotes within
+       # quotes we have to do it in 2 steps:
+       extractedcf=`$SED -n -e "$sed_extractcf" < "$progpath"`
+       eval "$extractedcf"
+      else
+       func_error "ignoring unknown tag $tagname"
+      fi
+      ;;
+  esac
+}
+
+# func_check_version_match
+# Ensure that we are using m4 macros, and libtool script from the same
+# release of libtool.
+func_check_version_match ()
+{
+  if test "$package_revision" != "$macro_revision"; then
+    if test "$VERSION" != "$macro_version"; then
+      if test -z "$macro_version"; then
+        cat >&2 <<_LT_EOF
+$progname: Version mismatch error.  This is $PACKAGE $VERSION, but the
+$progname: definition of this LT_INIT comes from an older release.
+$progname: You should recreate aclocal.m4 with macros from $PACKAGE $VERSION
+$progname: and run autoconf again.
+_LT_EOF
+      else
+        cat >&2 <<_LT_EOF
+$progname: Version mismatch error.  This is $PACKAGE $VERSION, but the
+$progname: definition of this LT_INIT comes from $PACKAGE $macro_version.
+$progname: You should recreate aclocal.m4 with macros from $PACKAGE $VERSION
+$progname: and run autoconf again.
+_LT_EOF
+      fi
+    else
+      cat >&2 <<_LT_EOF
+$progname: Version mismatch error.  This is $PACKAGE $VERSION, revision $package_revision,
+$progname: but the definition of this LT_INIT comes from revision $macro_revision.
+$progname: You should recreate aclocal.m4 with macros from revision $package_revision
+$progname: of $PACKAGE $VERSION and run autoconf again.
+_LT_EOF
+    fi
+
+    exit $EXIT_MISMATCH
+  fi
+}
+
+
+# Shorthand for --mode=foo, only valid as the first argument
+case $1 in
+clean|clea|cle|cl)
+  shift; set dummy --mode clean ${1+"$@"}; shift
+  ;;
+compile|compil|compi|comp|com|co|c)
+  shift; set dummy --mode compile ${1+"$@"}; shift
+  ;;
+execute|execut|execu|exec|exe|ex|e)
+  shift; set dummy --mode execute ${1+"$@"}; shift
+  ;;
+finish|finis|fini|fin|fi|f)
+  shift; set dummy --mode finish ${1+"$@"}; shift
+  ;;
+install|instal|insta|inst|ins|in|i)
+  shift; set dummy --mode install ${1+"$@"}; shift
+  ;;
+link|lin|li|l)
+  shift; set dummy --mode link ${1+"$@"}; shift
+  ;;
+uninstall|uninstal|uninsta|uninst|unins|unin|uni|un|u)
+  shift; set dummy --mode uninstall ${1+"$@"}; shift
+  ;;
+esac
+
+
+
+# Option defaults:
+opt_debug=:
+opt_dry_run=false
+opt_config=false
+opt_preserve_dup_deps=false
+opt_features=false
+opt_finish=false
+opt_help=false
+opt_help_all=false
+opt_silent=:
+opt_warning=:
+opt_verbose=:
+opt_silent=false
+opt_verbose=false
+
+
+# Parse options once, thoroughly.  This comes as soon as possible in the
+# script to make things like `--version' happen as quickly as we can.
+{
+  # this just eases exit handling
+  while test $# -gt 0; do
+    opt="$1"
+    shift
+    case $opt in
+      --debug|-x)      opt_debug='set -x'
+                       func_echo "enabling shell trace mode"
+                       $opt_debug
+                       ;;
+      --dry-run|--dryrun|-n)
+                       opt_dry_run=:
+                       ;;
+      --config)
+                       opt_config=:
+func_config
+                       ;;
+      --dlopen|-dlopen)
+                       optarg="$1"
+                       opt_dlopen="${opt_dlopen+$opt_dlopen
+}$optarg"
+                       shift
+                       ;;
+      --preserve-dup-deps)
+                       opt_preserve_dup_deps=:
+                       ;;
+      --features)
+                       opt_features=:
+func_features
+                       ;;
+      --finish)
+                       opt_finish=:
+set dummy --mode finish ${1+"$@"}; shift
+                       ;;
+      --help)
+                       opt_help=:
+                       ;;
+      --help-all)
+                       opt_help_all=:
+opt_help=': help-all'
+                       ;;
+      --mode)
+                       test $# = 0 && func_missing_arg $opt && break
+                       optarg="$1"
+                       opt_mode="$optarg"
+case $optarg in
+  # Valid mode arguments:
+  clean|compile|execute|finish|install|link|relink|uninstall) ;;
+
+  # Catch anything else as an error
+  *) func_error "invalid argument for $opt"
+     exit_cmd=exit
+     break
+     ;;
+esac
+                       shift
+                       ;;
+      --no-silent|--no-quiet)
+                       opt_silent=false
+func_append preserve_args " $opt"
+                       ;;
+      --no-warning|--no-warn)
+                       opt_warning=false
+func_append preserve_args " $opt"
+                       ;;
+      --no-verbose)
+                       opt_verbose=false
+func_append preserve_args " $opt"
+                       ;;
+      --silent|--quiet)
+                       opt_silent=:
+func_append preserve_args " $opt"
+        opt_verbose=false
+                       ;;
+      --verbose|-v)
+                       opt_verbose=:
+func_append preserve_args " $opt"
+opt_silent=false
+                       ;;
+      --tag)
+                       test $# = 0 && func_missing_arg $opt && break
+                       optarg="$1"
+                       opt_tag="$optarg"
+func_append preserve_args " $opt $optarg"
+func_enable_tag "$optarg"
+                       shift
+                       ;;
+
+      -\?|-h)          func_usage                              ;;
+      --help)          func_help                               ;;
+      --version)       func_version                            ;;
+
+      # Separate optargs to long options:
+      --*=*)
+                       func_split_long_opt "$opt"
+                       set dummy "$func_split_long_opt_name" "$func_split_long_opt_arg" ${1+"$@"}
+                       shift
+                       ;;
+
+      # Separate non-argument short options:
+      -\?*|-h*|-n*|-v*)
+                       func_split_short_opt "$opt"
+                       set dummy "$func_split_short_opt_name" "-$func_split_short_opt_arg" ${1+"$@"}
+                       shift
+                       ;;
+
+      --)              break                                   ;;
+      -*)              func_fatal_help "unrecognized option \`$opt'" ;;
+      *)               set dummy "$opt" ${1+"$@"};     shift; break  ;;
+    esac
+  done
+
+  # Validate options:
+
+  # save first non-option argument
+  if test "$#" -gt 0; then
+    nonopt="$opt"
+    shift
+  fi
+
+  # preserve --debug
+  test "$opt_debug" = : || func_append preserve_args " --debug"
+
+  case $host in
+    *cygwin* | *mingw* | *pw32* | *cegcc*)
+      # don't eliminate duplications in $postdeps and $predeps
+      opt_duplicate_compiler_generated_deps=:
+      ;;
+    *)
+      opt_duplicate_compiler_generated_deps=$opt_preserve_dup_deps
+      ;;
+  esac
+
+  $opt_help || {
+    # Sanity checks first:
+    func_check_version_match
+
+    if test "$build_libtool_libs" != yes && test "$build_old_libs" != yes; then
+      func_fatal_configuration "not configured to build any kind of library"
+    fi
+
+    # Darwin sucks
+    eval std_shrext=\"$shrext_cmds\"
+
+    # Only execute mode is allowed to have -dlopen flags.
+    if test -n "$opt_dlopen" && test "$opt_mode" != execute; then
+      func_error "unrecognized option \`-dlopen'"
+      $ECHO "$help" 1>&2
+      exit $EXIT_FAILURE
+    fi
+
+    # Change the help message to a mode-specific one.
+    generic_help="$help"
+    help="Try \`$progname --help --mode=$opt_mode' for more information."
+  }
+
+
+  # Bail if the options were screwed
+  $exit_cmd $EXIT_FAILURE
+}
+
+
+
+
+## ----------- ##
+##    Main.    ##
+## ----------- ##
+
+# func_lalib_p file
+# True iff FILE is a libtool `.la' library or `.lo' object file.
+# This function is only a basic sanity check; it will hardly flush out
+# determined imposters.
+func_lalib_p ()
+{
+    test -f "$1" &&
+      $SED -e 4q "$1" 2>/dev/null \
+        | $GREP "^# Generated by .*$PACKAGE" > /dev/null 2>&1
+}
+
+# func_lalib_unsafe_p file
+# True iff FILE is a libtool `.la' library or `.lo' object file.
+# This function implements the same check as func_lalib_p without
+# resorting to external programs.  To this end, it redirects stdin and
+# closes it afterwards, without saving the original file descriptor.
+# As a safety measure, use it only where a negative result would be
+# fatal anyway.  Works if `file' does not exist.
+func_lalib_unsafe_p ()
+{
+    lalib_p=no
+    if test -f "$1" && test -r "$1" && exec 5<&0 <"$1"; then
+       for lalib_p_l in 1 2 3 4
+       do
+           read lalib_p_line
+           case "$lalib_p_line" in
+               \#\ Generated\ by\ *$PACKAGE* ) lalib_p=yes; break;;
+           esac
+       done
+       exec 0<&5 5<&-
+    fi
+    test "$lalib_p" = yes
+}
+
+# func_ltwrapper_script_p file
+# True iff FILE is a libtool wrapper script
+# This function is only a basic sanity check; it will hardly flush out
+# determined imposters.
+func_ltwrapper_script_p ()
+{
+    func_lalib_p "$1"
+}
+
+# func_ltwrapper_executable_p file
+# True iff FILE is a libtool wrapper executable
+# This function is only a basic sanity check; it will hardly flush out
+# determined imposters.
+func_ltwrapper_executable_p ()
+{
+    func_ltwrapper_exec_suffix=
+    case $1 in
+    *.exe) ;;
+    *) func_ltwrapper_exec_suffix=.exe ;;
+    esac
+    $GREP "$magic_exe" "$1$func_ltwrapper_exec_suffix" >/dev/null 2>&1
+}
+
+# func_ltwrapper_scriptname file
+# Assumes file is an ltwrapper_executable
+# uses $file to determine the appropriate filename for a
+# temporary ltwrapper_script.
+func_ltwrapper_scriptname ()
+{
+    func_dirname_and_basename "$1" "" "."
+    func_stripname '' '.exe' "$func_basename_result"
+    func_ltwrapper_scriptname_result="$func_dirname_result/$objdir/${func_stripname_result}_ltshwrapper"
+}
+
+# func_ltwrapper_p file
+# True iff FILE is a libtool wrapper script or wrapper executable
+# This function is only a basic sanity check; it will hardly flush out
+# determined imposters.
+func_ltwrapper_p ()
+{
+    func_ltwrapper_script_p "$1" || func_ltwrapper_executable_p "$1"
+}
+
+
+# func_execute_cmds commands fail_cmd
+# Execute tilde-delimited COMMANDS.
+# If FAIL_CMD is given, eval that upon failure.
+# FAIL_CMD may read-access the current command in variable CMD!
+func_execute_cmds ()
+{
+    $opt_debug
+    save_ifs=$IFS; IFS='~'
+    for cmd in $1; do
+      IFS=$save_ifs
+      eval cmd=\"$cmd\"
+      func_show_eval "$cmd" "${2-:}"
+    done
+    IFS=$save_ifs
+}
+
+
+# func_source file
+# Source FILE, adding directory component if necessary.
+# Note that it is not necessary on cygwin/mingw to append a dot to
+# FILE even if both FILE and FILE.exe exist: automatic-append-.exe
+# behavior happens only for exec(3), not for open(2)!  Also, sourcing
+# `FILE.' does not work on cygwin managed mounts.
+func_source ()
+{
+    $opt_debug
+    case $1 in
+    */* | *\\*)        . "$1" ;;
+    *)         . "./$1" ;;
+    esac
+}
+
+
+# func_resolve_sysroot PATH
+# Replace a leading = in PATH with a sysroot.  Store the result into
+# func_resolve_sysroot_result
+func_resolve_sysroot ()
+{
+  func_resolve_sysroot_result=$1
+  case $func_resolve_sysroot_result in
+  =*)
+    func_stripname '=' '' "$func_resolve_sysroot_result"
+    func_resolve_sysroot_result=$lt_sysroot$func_stripname_result
+    ;;
+  esac
+}
+
+# func_replace_sysroot PATH
+# If PATH begins with the sysroot, replace it with = and
+# store the result into func_replace_sysroot_result.
+func_replace_sysroot ()
+{
+  case "$lt_sysroot:$1" in
+  ?*:"$lt_sysroot"*)
+    func_stripname "$lt_sysroot" '' "$1"
+    func_replace_sysroot_result="=$func_stripname_result"
+    ;;
+  *)
+    # Including no sysroot.
+    func_replace_sysroot_result=$1
+    ;;
+  esac
+}
+
+# func_infer_tag arg
+# Infer tagged configuration to use if any are available and
+# if one wasn't chosen via the "--tag" command line option.
+# Only attempt this if the compiler in the base compile
+# command doesn't match the default compiler.
+# arg is usually of the form 'gcc ...'
+func_infer_tag ()
+{
+    $opt_debug
+    if test -n "$available_tags" && test -z "$tagname"; then
+      CC_quoted=
+      for arg in $CC; do
+       func_append_quoted CC_quoted "$arg"
+      done
+      CC_expanded=`func_echo_all $CC`
+      CC_quoted_expanded=`func_echo_all $CC_quoted`
+      case $@ in
+      # Blanks in the command may have been stripped by the calling shell,
+      # but not from the CC environment variable when configure was run.
+      " $CC "* | "$CC "* | " $CC_expanded "* | "$CC_expanded "* | \
+      " $CC_quoted"* | "$CC_quoted "* | " $CC_quoted_expanded "* | "$CC_quoted_expanded "*) ;;
+      # Blanks at the start of $base_compile will cause this to fail
+      # if we don't check for them as well.
+      *)
+       for z in $available_tags; do
+         if $GREP "^# ### BEGIN LIBTOOL TAG CONFIG: $z$" < "$progpath" > /dev/null; then
+           # Evaluate the configuration.
+           eval "`${SED} -n -e '/^# ### BEGIN LIBTOOL TAG CONFIG: '$z'$/,/^# ### END LIBTOOL TAG CONFIG: '$z'$/p' < $progpath`"
+           CC_quoted=
+           for arg in $CC; do
+             # Double-quote args containing other shell metacharacters.
+             func_append_quoted CC_quoted "$arg"
+           done
+           CC_expanded=`func_echo_all $CC`
+           CC_quoted_expanded=`func_echo_all $CC_quoted`
+           case "$@ " in
+           " $CC "* | "$CC "* | " $CC_expanded "* | "$CC_expanded "* | \
+           " $CC_quoted"* | "$CC_quoted "* | " $CC_quoted_expanded "* | "$CC_quoted_expanded "*)
+             # The compiler in the base compile command matches
+             # the one in the tagged configuration.
+             # Assume this is the tagged configuration we want.
+             tagname=$z
+             break
+             ;;
+           esac
+         fi
+       done
+       # If $tagname still isn't set, then no tagged configuration
+       # was found and let the user know that the "--tag" command
+       # line option must be used.
+       if test -z "$tagname"; then
+         func_echo "unable to infer tagged configuration"
+         func_fatal_error "specify a tag with \`--tag'"
+#      else
+#        func_verbose "using $tagname tagged configuration"
+       fi
+       ;;
+      esac
+    fi
+}
+
+
+
+# func_write_libtool_object output_name pic_name nonpic_name
+# Create a libtool object file (analogous to a ".la" file),
+# but don't create it if we're doing a dry run.
+func_write_libtool_object ()
+{
+    write_libobj=${1}
+    if test "$build_libtool_libs" = yes; then
+      write_lobj=\'${2}\'
+    else
+      write_lobj=none
+    fi
+
+    if test "$build_old_libs" = yes; then
+      write_oldobj=\'${3}\'
+    else
+      write_oldobj=none
+    fi
+
+    $opt_dry_run || {
+      cat >${write_libobj}T <<EOF
+# $write_libobj - a libtool object file
+# Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION
+#
+# Please DO NOT delete this file!
+# It is necessary for linking the library.
+
+# Name of the PIC object.
+pic_object=$write_lobj
+
+# Name of the non-PIC object
+non_pic_object=$write_oldobj
+
+EOF
+      $MV "${write_libobj}T" "${write_libobj}"
+    }
+}
+
+
+##################################################
+# FILE NAME AND PATH CONVERSION HELPER FUNCTIONS #
+##################################################
+
+# func_convert_core_file_wine_to_w32 ARG
+# Helper function used by file name conversion functions when $build is *nix,
+# and $host is mingw, cygwin, or some other w32 environment. Relies on a
+# correctly configured wine environment available, with the winepath program
+# in $build's $PATH.
+#
+# ARG is the $build file name to be converted to w32 format.
+# Result is available in $func_convert_core_file_wine_to_w32_result, and will
+# be empty on error (or when ARG is empty)
+func_convert_core_file_wine_to_w32 ()
+{
+  $opt_debug
+  func_convert_core_file_wine_to_w32_result="$1"
+  if test -n "$1"; then
+    # Unfortunately, winepath does not exit with a non-zero error code, so we
+    # are forced to check the contents of stdout. On the other hand, if the
+    # command is not found, the shell will set an exit code of 127 and print
+    # *an error message* to stdout. So we must check for both error code of
+    # zero AND non-empty stdout, which explains the odd construction:
+    func_convert_core_file_wine_to_w32_tmp=`winepath -w "$1" 2>/dev/null`
+    if test "$?" -eq 0 && test -n "${func_convert_core_file_wine_to_w32_tmp}"; then
+      func_convert_core_file_wine_to_w32_result=`$ECHO "$func_convert_core_file_wine_to_w32_tmp" |
+        $SED -e "$lt_sed_naive_backslashify"`
+    else
+      func_convert_core_file_wine_to_w32_result=
+    fi
+  fi
+}
+# end: func_convert_core_file_wine_to_w32
+
+
+# func_convert_core_path_wine_to_w32 ARG
+# Helper function used by path conversion functions when $build is *nix, and
+# $host is mingw, cygwin, or some other w32 environment. Relies on a correctly
+# configured wine environment available, with the winepath program in $build's
+# $PATH. Assumes ARG has no leading or trailing path separator characters.
+#
+# ARG is path to be converted from $build format to win32.
+# Result is available in $func_convert_core_path_wine_to_w32_result.
+# Unconvertible file (directory) names in ARG are skipped; if no directory names
+# are convertible, then the result may be empty.
+func_convert_core_path_wine_to_w32 ()
+{
+  $opt_debug
+  # unfortunately, winepath doesn't convert paths, only file names
+  func_convert_core_path_wine_to_w32_result=""
+  if test -n "$1"; then
+    oldIFS=$IFS
+    IFS=:
+    for func_convert_core_path_wine_to_w32_f in $1; do
+      IFS=$oldIFS
+      func_convert_core_file_wine_to_w32 "$func_convert_core_path_wine_to_w32_f"
+      if test -n "$func_convert_core_file_wine_to_w32_result" ; then
+        if test -z "$func_convert_core_path_wine_to_w32_result"; then
+          func_convert_core_path_wine_to_w32_result="$func_convert_core_file_wine_to_w32_result"
+        else
+          func_append func_convert_core_path_wine_to_w32_result ";$func_convert_core_file_wine_to_w32_result"
+        fi
+      fi
+    done
+    IFS=$oldIFS
+  fi
+}
+# end: func_convert_core_path_wine_to_w32
+
+
+# func_cygpath ARGS...
+# Wrapper around calling the cygpath program via LT_CYGPATH. This is used when
+# when (1) $build is *nix and Cygwin is hosted via a wine environment; or (2)
+# $build is MSYS and $host is Cygwin, or (3) $build is Cygwin. In case (1) or
+# (2), returns the Cygwin file name or path in func_cygpath_result (input
+# file name or path is assumed to be in w32 format, as previously converted
+# from $build's *nix or MSYS format). In case (3), returns the w32 file name
+# or path in func_cygpath_result (input file name or path is assumed to be in
+# Cygwin format). Returns an empty string on error.
+#
+# ARGS are passed to cygpath, with the last one being the file name or path to
+# be converted.
+#
+# Specify the absolute *nix (or w32) name to cygpath in the LT_CYGPATH
+# environment variable; do not put it in $PATH.
+func_cygpath ()
+{
+  $opt_debug
+  if test -n "$LT_CYGPATH" && test -f "$LT_CYGPATH"; then
+    func_cygpath_result=`$LT_CYGPATH "$@" 2>/dev/null`
+    if test "$?" -ne 0; then
+      # on failure, ensure result is empty
+      func_cygpath_result=
+    fi
+  else
+    func_cygpath_result=
+    func_error "LT_CYGPATH is empty or specifies non-existent file: \`$LT_CYGPATH'"
+  fi
+}
+#end: func_cygpath
+
+
+# func_convert_core_msys_to_w32 ARG
+# Convert file name or path ARG from MSYS format to w32 format.  Return
+# result in func_convert_core_msys_to_w32_result.
+func_convert_core_msys_to_w32 ()
+{
+  $opt_debug
+  # awkward: cmd appends spaces to result
+  func_convert_core_msys_to_w32_result=`( cmd //c echo "$1" ) 2>/dev/null |
+    $SED -e 's/[ ]*$//' -e "$lt_sed_naive_backslashify"`
+}
+#end: func_convert_core_msys_to_w32
+
+
+# func_convert_file_check ARG1 ARG2
+# Verify that ARG1 (a file name in $build format) was converted to $host
+# format in ARG2. Otherwise, emit an error message, but continue (resetting
+# func_to_host_file_result to ARG1).
+func_convert_file_check ()
+{
+  $opt_debug
+  if test -z "$2" && test -n "$1" ; then
+    func_error "Could not determine host file name corresponding to"
+    func_error "  \`$1'"
+    func_error "Continuing, but uninstalled executables may not work."
+    # Fallback:
+    func_to_host_file_result="$1"
+  fi
+}
+# end func_convert_file_check
+
+
+# func_convert_path_check FROM_PATHSEP TO_PATHSEP FROM_PATH TO_PATH
+# Verify that FROM_PATH (a path in $build format) was converted to $host
+# format in TO_PATH. Otherwise, emit an error message, but continue, resetting
+# func_to_host_file_result to a simplistic fallback value (see below).
+func_convert_path_check ()
+{
+  $opt_debug
+  if test -z "$4" && test -n "$3"; then
+    func_error "Could not determine the host path corresponding to"
+    func_error "  \`$3'"
+    func_error "Continuing, but uninstalled executables may not work."
+    # Fallback.  This is a deliberately simplistic "conversion" and
+    # should not be "improved".  See libtool.info.
+    if test "x$1" != "x$2"; then
+      lt_replace_pathsep_chars="s|$1|$2|g"
+      func_to_host_path_result=`echo "$3" |
+        $SED -e "$lt_replace_pathsep_chars"`
+    else
+      func_to_host_path_result="$3"
+    fi
+  fi
+}
+# end func_convert_path_check
+
+
+# func_convert_path_front_back_pathsep FRONTPAT BACKPAT REPL ORIG
+# Modifies func_to_host_path_result by prepending REPL if ORIG matches FRONTPAT
+# and appending REPL if ORIG matches BACKPAT.
+func_convert_path_front_back_pathsep ()
+{
+  $opt_debug
+  case $4 in
+  $1 ) func_to_host_path_result="$3$func_to_host_path_result"
+    ;;
+  esac
+  case $4 in
+  $2 ) func_append func_to_host_path_result "$3"
+    ;;
+  esac
+}
+# end func_convert_path_front_back_pathsep
+
+
+##################################################
+# $build to $host FILE NAME CONVERSION FUNCTIONS #
+##################################################
+# invoked via `$to_host_file_cmd ARG'
+#
+# In each case, ARG is the path to be converted from $build to $host format.
+# Result will be available in $func_to_host_file_result.
+
+
+# func_to_host_file ARG
+# Converts the file name ARG from $build format to $host format. Return result
+# in func_to_host_file_result.
+func_to_host_file ()
+{
+  $opt_debug
+  $to_host_file_cmd "$1"
+}
+# end func_to_host_file
+
+
+# func_to_tool_file ARG LAZY
+# converts the file name ARG from $build format to toolchain format. Return
+# result in func_to_tool_file_result.  If the conversion in use is listed
+# in (the comma separated) LAZY, no conversion takes place.
+func_to_tool_file ()
+{
+  $opt_debug
+  case ,$2, in
+    *,"$to_tool_file_cmd",*)
+      func_to_tool_file_result=$1
+      ;;
+    *)
+      $to_tool_file_cmd "$1"
+      func_to_tool_file_result=$func_to_host_file_result
+      ;;
+  esac
+}
+# end func_to_tool_file
+
+
+# func_convert_file_noop ARG
+# Copy ARG to func_to_host_file_result.
+func_convert_file_noop ()
+{
+  func_to_host_file_result="$1"
+}
+# end func_convert_file_noop
+
+
+# func_convert_file_msys_to_w32 ARG
+# Convert file name ARG from (mingw) MSYS to (mingw) w32 format; automatic
+# conversion to w32 is not available inside the cwrapper.  Returns result in
+# func_to_host_file_result.
+func_convert_file_msys_to_w32 ()
+{
+  $opt_debug
+  func_to_host_file_result="$1"
+  if test -n "$1"; then
+    func_convert_core_msys_to_w32 "$1"
+    func_to_host_file_result="$func_convert_core_msys_to_w32_result"
+  fi
+  func_convert_file_check "$1" "$func_to_host_file_result"
+}
+# end func_convert_file_msys_to_w32
+
+
+# func_convert_file_cygwin_to_w32 ARG
+# Convert file name ARG from Cygwin to w32 format.  Returns result in
+# func_to_host_file_result.
+func_convert_file_cygwin_to_w32 ()
+{
+  $opt_debug
+  func_to_host_file_result="$1"
+  if test -n "$1"; then
+    # because $build is cygwin, we call "the" cygpath in $PATH; no need to use
+    # LT_CYGPATH in this case.
+    func_to_host_file_result=`cygpath -m "$1"`
+  fi
+  func_convert_file_check "$1" "$func_to_host_file_result"
+}
+# end func_convert_file_cygwin_to_w32
+
+
+# func_convert_file_nix_to_w32 ARG
+# Convert file name ARG from *nix to w32 format.  Requires a wine environment
+# and a working winepath. Returns result in func_to_host_file_result.
+func_convert_file_nix_to_w32 ()
+{
+  $opt_debug
+  func_to_host_file_result="$1"
+  if test -n "$1"; then
+    func_convert_core_file_wine_to_w32 "$1"
+    func_to_host_file_result="$func_convert_core_file_wine_to_w32_result"
+  fi
+  func_convert_file_check "$1" "$func_to_host_file_result"
+}
+# end func_convert_file_nix_to_w32
+
+
+# func_convert_file_msys_to_cygwin ARG
+# Convert file name ARG from MSYS to Cygwin format.  Requires LT_CYGPATH set.
+# Returns result in func_to_host_file_result.
+func_convert_file_msys_to_cygwin ()
+{
+  $opt_debug
+  func_to_host_file_result="$1"
+  if test -n "$1"; then
+    func_convert_core_msys_to_w32 "$1"
+    func_cygpath -u "$func_convert_core_msys_to_w32_result"
+    func_to_host_file_result="$func_cygpath_result"
+  fi
+  func_convert_file_check "$1" "$func_to_host_file_result"
+}
+# end func_convert_file_msys_to_cygwin
+
+
+# func_convert_file_nix_to_cygwin ARG
+# Convert file name ARG from *nix to Cygwin format.  Requires Cygwin installed
+# in a wine environment, working winepath, and LT_CYGPATH set.  Returns result
+# in func_to_host_file_result.
+func_convert_file_nix_to_cygwin ()
+{
+  $opt_debug
+  func_to_host_file_result="$1"
+  if test -n "$1"; then
+    # convert from *nix to w32, then use cygpath to convert from w32 to cygwin.
+    func_convert_core_file_wine_to_w32 "$1"
+    func_cygpath -u "$func_convert_core_file_wine_to_w32_result"
+    func_to_host_file_result="$func_cygpath_result"
+  fi
+  func_convert_file_check "$1" "$func_to_host_file_result"
+}
+# end func_convert_file_nix_to_cygwin
+
+
+#############################################
+# $build to $host PATH CONVERSION FUNCTIONS #
+#############################################
+# invoked via `$to_host_path_cmd ARG'
+#
+# In each case, ARG is the path to be converted from $build to $host format.
+# The result will be available in $func_to_host_path_result.
+#
+# Path separators are also converted from $build format to $host format.  If
+# ARG begins or ends with a path separator character, it is preserved (but
+# converted to $host format) on output.
+#
+# All path conversion functions are named using the following convention:
+#   file name conversion function    : func_convert_file_X_to_Y ()
+#   path conversion function         : func_convert_path_X_to_Y ()
+# where, for any given $build/$host combination the 'X_to_Y' value is the
+# same.  If conversion functions are added for new $build/$host combinations,
+# the two new functions must follow this pattern, or func_init_to_host_path_cmd
+# will break.
+
+
+# func_init_to_host_path_cmd
+# Ensures that function "pointer" variable $to_host_path_cmd is set to the
+# appropriate value, based on the value of $to_host_file_cmd.
+to_host_path_cmd=
+func_init_to_host_path_cmd ()
+{
+  $opt_debug
+  if test -z "$to_host_path_cmd"; then
+    func_stripname 'func_convert_file_' '' "$to_host_file_cmd"
+    to_host_path_cmd="func_convert_path_${func_stripname_result}"
+  fi
+}
+
+
+# func_to_host_path ARG
+# Converts the path ARG from $build format to $host format. Return result
+# in func_to_host_path_result.
+func_to_host_path ()
+{
+  $opt_debug
+  func_init_to_host_path_cmd
+  $to_host_path_cmd "$1"
+}
+# end func_to_host_path
+
+
+# func_convert_path_noop ARG
+# Copy ARG to func_to_host_path_result.
+func_convert_path_noop ()
+{
+  func_to_host_path_result="$1"
+}
+# end func_convert_path_noop
+
+
+# func_convert_path_msys_to_w32 ARG
+# Convert path ARG from (mingw) MSYS to (mingw) w32 format; automatic
+# conversion to w32 is not available inside the cwrapper.  Returns result in
+# func_to_host_path_result.
+func_convert_path_msys_to_w32 ()
+{
+  $opt_debug
+  func_to_host_path_result="$1"
+  if test -n "$1"; then
+    # Remove leading and trailing path separator characters from ARG.  MSYS
+    # behavior is inconsistent here; cygpath turns them into '.;' and ';.';
+    # and winepath ignores them completely.
+    func_stripname : : "$1"
+    func_to_host_path_tmp1=$func_stripname_result
+    func_convert_core_msys_to_w32 "$func_to_host_path_tmp1"
+    func_to_host_path_result="$func_convert_core_msys_to_w32_result"
+    func_convert_path_check : ";" \
+      "$func_to_host_path_tmp1" "$func_to_host_path_result"
+    func_convert_path_front_back_pathsep ":*" "*:" ";" "$1"
+  fi
+}
+# end func_convert_path_msys_to_w32
+
+
+# func_convert_path_cygwin_to_w32 ARG
+# Convert path ARG from Cygwin to w32 format.  Returns result in
+# func_to_host_file_result.
+func_convert_path_cygwin_to_w32 ()
+{
+  $opt_debug
+  func_to_host_path_result="$1"
+  if test -n "$1"; then
+    # See func_convert_path_msys_to_w32:
+    func_stripname : : "$1"
+    func_to_host_path_tmp1=$func_stripname_result
+    func_to_host_path_result=`cygpath -m -p "$func_to_host_path_tmp1"`
+    func_convert_path_check : ";" \
+      "$func_to_host_path_tmp1" "$func_to_host_path_result"
+    func_convert_path_front_back_pathsep ":*" "*:" ";" "$1"
+  fi
+}
+# end func_convert_path_cygwin_to_w32
+
+
+# func_convert_path_nix_to_w32 ARG
+# Convert path ARG from *nix to w32 format.  Requires a wine environment and
+# a working winepath.  Returns result in func_to_host_file_result.
+func_convert_path_nix_to_w32 ()
+{
+  $opt_debug
+  func_to_host_path_result="$1"
+  if test -n "$1"; then
+    # See func_convert_path_msys_to_w32:
+    func_stripname : : "$1"
+    func_to_host_path_tmp1=$func_stripname_result
+    func_convert_core_path_wine_to_w32 "$func_to_host_path_tmp1"
+    func_to_host_path_result="$func_convert_core_path_wine_to_w32_result"
+    func_convert_path_check : ";" \
+      "$func_to_host_path_tmp1" "$func_to_host_path_result"
+    func_convert_path_front_back_pathsep ":*" "*:" ";" "$1"
+  fi
+}
+# end func_convert_path_nix_to_w32
+
+
+# func_convert_path_msys_to_cygwin ARG
+# Convert path ARG from MSYS to Cygwin format.  Requires LT_CYGPATH set.
+# Returns result in func_to_host_file_result.
+func_convert_path_msys_to_cygwin ()
+{
+  $opt_debug
+  func_to_host_path_result="$1"
+  if test -n "$1"; then
+    # See func_convert_path_msys_to_w32:
+    func_stripname : : "$1"
+    func_to_host_path_tmp1=$func_stripname_result
+    func_convert_core_msys_to_w32 "$func_to_host_path_tmp1"
+    func_cygpath -u -p "$func_convert_core_msys_to_w32_result"
+    func_to_host_path_result="$func_cygpath_result"
+    func_convert_path_check : : \
+      "$func_to_host_path_tmp1" "$func_to_host_path_result"
+    func_convert_path_front_back_pathsep ":*" "*:" : "$1"
+  fi
+}
+# end func_convert_path_msys_to_cygwin
+
+
+# func_convert_path_nix_to_cygwin ARG
+# Convert path ARG from *nix to Cygwin format.  Requires Cygwin installed in a
+# a wine environment, working winepath, and LT_CYGPATH set.  Returns result in
+# func_to_host_file_result.
+func_convert_path_nix_to_cygwin ()
+{
+  $opt_debug
+  func_to_host_path_result="$1"
+  if test -n "$1"; then
+    # Remove leading and trailing path separator characters from
+    # ARG. msys behavior is inconsistent here, cygpath turns them
+    # into '.;' and ';.', and winepath ignores them completely.
+    func_stripname : : "$1"
+    func_to_host_path_tmp1=$func_stripname_result
+    func_convert_core_path_wine_to_w32 "$func_to_host_path_tmp1"
+    func_cygpath -u -p "$func_convert_core_path_wine_to_w32_result"
+    func_to_host_path_result="$func_cygpath_result"
+    func_convert_path_check : : \
+      "$func_to_host_path_tmp1" "$func_to_host_path_result"
+    func_convert_path_front_back_pathsep ":*" "*:" : "$1"
+  fi
+}
+# end func_convert_path_nix_to_cygwin
+
+
+# func_mode_compile arg...
+func_mode_compile ()
+{
+    $opt_debug
+    # Get the compilation command and the source file.
+    base_compile=
+    srcfile="$nonopt"  #  always keep a non-empty value in "srcfile"
+    suppress_opt=yes
+    suppress_output=
+    arg_mode=normal
+    libobj=
+    later=
+    pie_flag=
+
+    for arg
+    do
+      case $arg_mode in
+      arg  )
+       # do not "continue".  Instead, add this to base_compile
+       lastarg="$arg"
+       arg_mode=normal
+       ;;
+
+      target )
+       libobj="$arg"
+       arg_mode=normal
+       continue
+       ;;
+
+      normal )
+       # Accept any command-line options.
+       case $arg in
+       -o)
+         test -n "$libobj" && \
+           func_fatal_error "you cannot specify \`-o' more than once"
+         arg_mode=target
+         continue
+         ;;
+
+       -pie | -fpie | -fPIE)
+          func_append pie_flag " $arg"
+         continue
+         ;;
+
+       -shared | -static | -prefer-pic | -prefer-non-pic)
+         func_append later " $arg"
+         continue
+         ;;
+
+       -no-suppress)
+         suppress_opt=no
+         continue
+         ;;
+
+       -Xcompiler)
+         arg_mode=arg  #  the next one goes into the "base_compile" arg list
+         continue      #  The current "srcfile" will either be retained or
+         ;;            #  replaced later.  I would guess that would be a bug.
+
+       -Wc,*)
+         func_stripname '-Wc,' '' "$arg"
+         args=$func_stripname_result
+         lastarg=
+         save_ifs="$IFS"; IFS=','
+         for arg in $args; do
+           IFS="$save_ifs"
+           func_append_quoted lastarg "$arg"
+         done
+         IFS="$save_ifs"
+         func_stripname ' ' '' "$lastarg"
+         lastarg=$func_stripname_result
+
+         # Add the arguments to base_compile.
+         func_append base_compile " $lastarg"
+         continue
+         ;;
+
+       *)
+         # Accept the current argument as the source file.
+         # The previous "srcfile" becomes the current argument.
+         #
+         lastarg="$srcfile"
+         srcfile="$arg"
+         ;;
+       esac  #  case $arg
+       ;;
+      esac    #  case $arg_mode
+
+      # Aesthetically quote the previous argument.
+      func_append_quoted base_compile "$lastarg"
+    done # for arg
+
+    case $arg_mode in
+    arg)
+      func_fatal_error "you must specify an argument for -Xcompile"
+      ;;
+    target)
+      func_fatal_error "you must specify a target with \`-o'"
+      ;;
+    *)
+      # Get the name of the library object.
+      test -z "$libobj" && {
+       func_basename "$srcfile"
+       libobj="$func_basename_result"
+      }
+      ;;
+    esac
+
+    # Recognize several different file suffixes.
+    # If the user specifies -o file.o, it is replaced with file.lo
+    case $libobj in
+    *.[cCFSifmso] | \
+    *.ada | *.adb | *.ads | *.asm | \
+    *.c++ | *.cc | *.ii | *.class | *.cpp | *.cxx | \
+    *.[fF][09]? | *.for | *.java | *.go | *.obj | *.sx | *.cu | *.cup)
+      func_xform "$libobj"
+      libobj=$func_xform_result
+      ;;
+    esac
+
+    case $libobj in
+    *.lo) func_lo2o "$libobj"; obj=$func_lo2o_result ;;
+    *)
+      func_fatal_error "cannot determine name of library object from \`$libobj'"
+      ;;
+    esac
+
+    func_infer_tag $base_compile
+
+    for arg in $later; do
+      case $arg in
+      -shared)
+       test "$build_libtool_libs" != yes && \
+         func_fatal_configuration "can not build a shared library"
+       build_old_libs=no
+       continue
+       ;;
+
+      -static)
+       build_libtool_libs=no
+       build_old_libs=yes
+       continue
+       ;;
+
+      -prefer-pic)
+       pic_mode=yes
+       continue
+       ;;
+
+      -prefer-non-pic)
+       pic_mode=no
+       continue
+       ;;
+      esac
+    done
+
+    func_quote_for_eval "$libobj"
+    test "X$libobj" != "X$func_quote_for_eval_result" \
+      && $ECHO "X$libobj" | $GREP '[]~#^*{};<>?"'"'"'   &()|`$[]' \
+      && func_warning "libobj name \`$libobj' may not contain shell special characters."
+    func_dirname_and_basename "$obj" "/" ""
+    objname="$func_basename_result"
+    xdir="$func_dirname_result"
+    lobj=${xdir}$objdir/$objname
+
+    test -z "$base_compile" && \
+      func_fatal_help "you must specify a compilation command"
+
+    # Delete any leftover library objects.
+    if test "$build_old_libs" = yes; then
+      removelist="$obj $lobj $libobj ${libobj}T"
+    else
+      removelist="$lobj $libobj ${libobj}T"
+    fi
+
+    # On Cygwin there's no "real" PIC flag so we must build both object types
+    case $host_os in
+    cygwin* | mingw* | pw32* | os2* | cegcc*)
+      pic_mode=default
+      ;;
+    esac
+    if test "$pic_mode" = no && test "$deplibs_check_method" != pass_all; then
+      # non-PIC code in shared libraries is not supported
+      pic_mode=default
+    fi
+
+    # Calculate the filename of the output object if compiler does
+    # not support -o with -c
+    if test "$compiler_c_o" = no; then
+      output_obj=`$ECHO "$srcfile" | $SED 's%^.*/%%; s%\.[^.]*$%%'`.${objext}
+      lockfile="$output_obj.lock"
+    else
+      output_obj=
+      need_locks=no
+      lockfile=
+    fi
+
+    # Lock this critical section if it is needed
+    # We use this script file to make the link, it avoids creating a new file
+    if test "$need_locks" = yes; then
+      until $opt_dry_run || ln "$progpath" "$lockfile" 2>/dev/null; do
+       func_echo "Waiting for $lockfile to be removed"
+       sleep 2
+      done
+    elif test "$need_locks" = warn; then
+      if test -f "$lockfile"; then
+       $ECHO "\
+*** ERROR, $lockfile exists and contains:
+`cat $lockfile 2>/dev/null`
+
+This indicates that another process is trying to use the same
+temporary object file, and libtool could not work around it because
+your compiler does not support \`-c' and \`-o' together.  If you
+repeat this compilation, it may succeed, by chance, but you had better
+avoid parallel builds (make -j) in this platform, or get a better
+compiler."
+
+       $opt_dry_run || $RM $removelist
+       exit $EXIT_FAILURE
+      fi
+      func_append removelist " $output_obj"
+      $ECHO "$srcfile" > "$lockfile"
+    fi
+
+    $opt_dry_run || $RM $removelist
+    func_append removelist " $lockfile"
+    trap '$opt_dry_run || $RM $removelist; exit $EXIT_FAILURE' 1 2 15
+
+    func_to_tool_file "$srcfile" func_convert_file_msys_to_w32
+    srcfile=$func_to_tool_file_result
+    func_quote_for_eval "$srcfile"
+    qsrcfile=$func_quote_for_eval_result
+
+    # Only build a PIC object if we are building libtool libraries.
+    if test "$build_libtool_libs" = yes; then
+      # Without this assignment, base_compile gets emptied.
+      fbsd_hideous_sh_bug=$base_compile
+
+      if test "$pic_mode" != no; then
+       command="$base_compile $qsrcfile $pic_flag"
+      else
+       # Don't build PIC code
+       command="$base_compile $qsrcfile"
+      fi
+
+      func_mkdir_p "$xdir$objdir"
+
+      if test -z "$output_obj"; then
+       # Place PIC objects in $objdir
+       func_append command " -o $lobj"
+      fi
+
+      func_show_eval_locale "$command" \
+          'test -n "$output_obj" && $RM $removelist; exit $EXIT_FAILURE'
+
+      if test "$need_locks" = warn &&
+        test "X`cat $lockfile 2>/dev/null`" != "X$srcfile"; then
+       $ECHO "\
+*** ERROR, $lockfile contains:
+`cat $lockfile 2>/dev/null`
+
+but it should contain:
+$srcfile
+
+This indicates that another process is trying to use the same
+temporary object file, and libtool could not work around it because
+your compiler does not support \`-c' and \`-o' together.  If you
+repeat this compilation, it may succeed, by chance, but you had better
+avoid parallel builds (make -j) in this platform, or get a better
+compiler."
+
+       $opt_dry_run || $RM $removelist
+       exit $EXIT_FAILURE
+      fi
+
+      # Just move the object if needed, then go on to compile the next one
+      if test -n "$output_obj" && test "X$output_obj" != "X$lobj"; then
+       func_show_eval '$MV "$output_obj" "$lobj"' \
+         'error=$?; $opt_dry_run || $RM $removelist; exit $error'
+      fi
+
+      # Allow error messages only from the first compilation.
+      if test "$suppress_opt" = yes; then
+       suppress_output=' >/dev/null 2>&1'
+      fi
+    fi
+
+    # Only build a position-dependent object if we build old libraries.
+    if test "$build_old_libs" = yes; then
+      if test "$pic_mode" != yes; then
+       # Don't build PIC code
+       command="$base_compile $qsrcfile$pie_flag"
+      else
+       command="$base_compile $qsrcfile $pic_flag"
+      fi
+      if test "$compiler_c_o" = yes; then
+       func_append command " -o $obj"
+      fi
+
+      # Suppress compiler output if we already did a PIC compilation.
+      func_append command "$suppress_output"
+      func_show_eval_locale "$command" \
+        '$opt_dry_run || $RM $removelist; exit $EXIT_FAILURE'
+
+      if test "$need_locks" = warn &&
+        test "X`cat $lockfile 2>/dev/null`" != "X$srcfile"; then
+       $ECHO "\
+*** ERROR, $lockfile contains:
+`cat $lockfile 2>/dev/null`
+
+but it should contain:
+$srcfile
+
+This indicates that another process is trying to use the same
+temporary object file, and libtool could not work around it because
+your compiler does not support \`-c' and \`-o' together.  If you
+repeat this compilation, it may succeed, by chance, but you had better
+avoid parallel builds (make -j) in this platform, or get a better
+compiler."
+
+       $opt_dry_run || $RM $removelist
+       exit $EXIT_FAILURE
+      fi
+
+      # Just move the object if needed
+      if test -n "$output_obj" && test "X$output_obj" != "X$obj"; then
+       func_show_eval '$MV "$output_obj" "$obj"' \
+         'error=$?; $opt_dry_run || $RM $removelist; exit $error'
+      fi
+    fi
+
+    $opt_dry_run || {
+      func_write_libtool_object "$libobj" "$objdir/$objname" "$objname"
+
+      # Unlock the critical section if it was locked
+      if test "$need_locks" != no; then
+       removelist=$lockfile
+        $RM "$lockfile"
+      fi
+    }
+
+    exit $EXIT_SUCCESS
+}
+
+$opt_help || {
+  test "$opt_mode" = compile && func_mode_compile ${1+"$@"}
+}
+
+func_mode_help ()
+{
+    # We need to display help for each of the modes.
+    case $opt_mode in
+      "")
+        # Generic help is extracted from the usage comments
+        # at the start of this file.
+        func_help
+        ;;
+
+      clean)
+        $ECHO \
+"Usage: $progname [OPTION]... --mode=clean RM [RM-OPTION]... FILE...
+
+Remove files from the build directory.
+
+RM is the name of the program to use to delete files associated with each FILE
+(typically \`/bin/rm').  RM-OPTIONS are options (such as \`-f') to be passed
+to RM.
+
+If FILE is a libtool library, object or program, all the files associated
+with it are deleted. Otherwise, only FILE itself is deleted using RM."
+        ;;
+
+      compile)
+      $ECHO \
+"Usage: $progname [OPTION]... --mode=compile COMPILE-COMMAND... SOURCEFILE
+
+Compile a source file into a libtool library object.
+
+This mode accepts the following additional options:
+
+  -o OUTPUT-FILE    set the output file name to OUTPUT-FILE
+  -no-suppress      do not suppress compiler output for multiple passes
+  -prefer-pic       try to build PIC objects only
+  -prefer-non-pic   try to build non-PIC objects only
+  -shared           do not build a \`.o' file suitable for static linking
+  -static           only build a \`.o' file suitable for static linking
+  -Wc,FLAG          pass FLAG directly to the compiler
+
+COMPILE-COMMAND is a command to be used in creating a \`standard' object file
+from the given SOURCEFILE.
+
+The output file name is determined by removing the directory component from
+SOURCEFILE, then substituting the C source code suffix \`.c' with the
+library object suffix, \`.lo'."
+        ;;
+
+      execute)
+        $ECHO \
+"Usage: $progname [OPTION]... --mode=execute COMMAND [ARGS]...
+
+Automatically set library path, then run a program.
+
+This mode accepts the following additional options:
+
+  -dlopen FILE      add the directory containing FILE to the library path
+
+This mode sets the library path environment variable according to \`-dlopen'
+flags.
+
+If any of the ARGS are libtool executable wrappers, then they are translated
+into their corresponding uninstalled binary, and any of their required library
+directories are added to the library path.
+
+Then, COMMAND is executed, with ARGS as arguments."
+        ;;
+
+      finish)
+        $ECHO \
+"Usage: $progname [OPTION]... --mode=finish [LIBDIR]...
+
+Complete the installation of libtool libraries.
+
+Each LIBDIR is a directory that contains libtool libraries.
+
+The commands that this mode executes may require superuser privileges.  Use
+the \`--dry-run' option if you just want to see what would be executed."
+        ;;
+
+      install)
+        $ECHO \
+"Usage: $progname [OPTION]... --mode=install INSTALL-COMMAND...
+
+Install executables or libraries.
+
+INSTALL-COMMAND is the installation command.  The first component should be
+either the \`install' or \`cp' program.
+
+The following components of INSTALL-COMMAND are treated specially:
+
+  -inst-prefix-dir PREFIX-DIR  Use PREFIX-DIR as a staging area for installation
+
+The rest of the components are interpreted as arguments to that command (only
+BSD-compatible install options are recognized)."
+        ;;
+
+      link)
+        $ECHO \
+"Usage: $progname [OPTION]... --mode=link LINK-COMMAND...
+
+Link object files or libraries together to form another library, or to
+create an executable program.
+
+LINK-COMMAND is a command using the C compiler that you would use to create
+a program from several object files.
+
+The following components of LINK-COMMAND are treated specially:
+
+  -all-static       do not do any dynamic linking at all
+  -avoid-version    do not add a version suffix if possible
+  -bindir BINDIR    specify path to binaries directory (for systems where
+                    libraries must be found in the PATH setting at runtime)
+  -dlopen FILE      \`-dlpreopen' FILE if it cannot be dlopened at runtime
+  -dlpreopen FILE   link in FILE and add its symbols to lt_preloaded_symbols
+  -export-dynamic   allow symbols from OUTPUT-FILE to be resolved with dlsym(3)
+  -export-symbols SYMFILE
+                    try to export only the symbols listed in SYMFILE
+  -export-symbols-regex REGEX
+                    try to export only the symbols matching REGEX
+  -LLIBDIR          search LIBDIR for required installed libraries
+  -lNAME            OUTPUT-FILE requires the installed library libNAME
+  -module           build a library that can dlopened
+  -no-fast-install  disable the fast-install mode
+  -no-install       link a not-installable executable
+  -no-undefined     declare that a library does not refer to external symbols
+  -o OUTPUT-FILE    create OUTPUT-FILE from the specified objects
+  -objectlist FILE  Use a list of object files found in FILE to specify objects
+  -precious-files-regex REGEX
+                    don't remove output files matching REGEX
+  -release RELEASE  specify package release information
+  -rpath LIBDIR     the created library will eventually be installed in LIBDIR
+  -R[ ]LIBDIR       add LIBDIR to the runtime path of programs and libraries
+  -shared           only do dynamic linking of libtool libraries
+  -shrext SUFFIX    override the standard shared library file extension
+  -static           do not do any dynamic linking of uninstalled libtool libraries
+  -static-libtool-libs
+                    do not do any dynamic linking of libtool libraries
+  -version-info CURRENT[:REVISION[:AGE]]
+                    specify library version info [each variable defaults to 0]
+  -weak LIBNAME     declare that the target provides the LIBNAME interface
+  -Wc,FLAG
+  -Xcompiler FLAG   pass linker-specific FLAG directly to the compiler
+  -Wl,FLAG
+  -Xlinker FLAG     pass linker-specific FLAG directly to the linker
+  -XCClinker FLAG   pass link-specific FLAG to the compiler driver (CC)
+
+All other options (arguments beginning with \`-') are ignored.
+
+Every other argument is treated as a filename.  Files ending in \`.la' are
+treated as uninstalled libtool libraries, other files are standard or library
+object files.
+
+If the OUTPUT-FILE ends in \`.la', then a libtool library is created,
+only library objects (\`.lo' files) may be specified, and \`-rpath' is
+required, except when creating a convenience library.
+
+If OUTPUT-FILE ends in \`.a' or \`.lib', then a standard library is created
+using \`ar' and \`ranlib', or on Windows using \`lib'.
+
+If OUTPUT-FILE ends in \`.lo' or \`.${objext}', then a reloadable object file
+is created, otherwise an executable program is created."
+        ;;
+
+      uninstall)
+        $ECHO \
+"Usage: $progname [OPTION]... --mode=uninstall RM [RM-OPTION]... FILE...
+
+Remove libraries from an installation directory.
+
+RM is the name of the program to use to delete files associated with each FILE
+(typically \`/bin/rm').  RM-OPTIONS are options (such as \`-f') to be passed
+to RM.
+
+If FILE is a libtool library, all the files associated with it are deleted.
+Otherwise, only FILE itself is deleted using RM."
+        ;;
+
+      *)
+        func_fatal_help "invalid operation mode \`$opt_mode'"
+        ;;
+    esac
+
+    echo
+    $ECHO "Try \`$progname --help' for more information about other modes."
+}
+
+# Now that we've collected a possible --mode arg, show help if necessary
+if $opt_help; then
+  if test "$opt_help" = :; then
+    func_mode_help
+  else
+    {
+      func_help noexit
+      for opt_mode in compile link execute install finish uninstall clean; do
+       func_mode_help
+      done
+    } | sed -n '1p; 2,$s/^Usage:/  or: /p'
+    {
+      func_help noexit
+      for opt_mode in compile link execute install finish uninstall clean; do
+       echo
+       func_mode_help
+      done
+    } |
+    sed '1d
+      /^When reporting/,/^Report/{
+       H
+       d
+      }
+      $x
+      /information about other modes/d
+      /more detailed .*MODE/d
+      s/^Usage:.*--mode=\([^ ]*\) .*/Description of \1 mode:/'
+  fi
+  exit $?
+fi
+
+
+# func_mode_execute arg...
+func_mode_execute ()
+{
+    $opt_debug
+    # The first argument is the command name.
+    cmd="$nonopt"
+    test -z "$cmd" && \
+      func_fatal_help "you must specify a COMMAND"
+
+    # Handle -dlopen flags immediately.
+    for file in $opt_dlopen; do
+      test -f "$file" \
+       || func_fatal_help "\`$file' is not a file"
+
+      dir=
+      case $file in
+      *.la)
+       func_resolve_sysroot "$file"
+       file=$func_resolve_sysroot_result
+
+       # Check to see that this really is a libtool archive.
+       func_lalib_unsafe_p "$file" \
+         || func_fatal_help "\`$lib' is not a valid libtool archive"
+
+       # Read the libtool library.
+       dlname=
+       library_names=
+       func_source "$file"
+
+       # Skip this library if it cannot be dlopened.
+       if test -z "$dlname"; then
+         # Warn if it was a shared library.
+         test -n "$library_names" && \
+           func_warning "\`$file' was not linked with \`-export-dynamic'"
+         continue
+       fi
+
+       func_dirname "$file" "" "."
+       dir="$func_dirname_result"
+
+       if test -f "$dir/$objdir/$dlname"; then
+         func_append dir "/$objdir"
+       else
+         if test ! -f "$dir/$dlname"; then
+           func_fatal_error "cannot find \`$dlname' in \`$dir' or \`$dir/$objdir'"
+         fi
+       fi
+       ;;
+
+      *.lo)
+       # Just add the directory containing the .lo file.
+       func_dirname "$file" "" "."
+       dir="$func_dirname_result"
+       ;;
+
+      *)
+       func_warning "\`-dlopen' is ignored for non-libtool libraries and objects"
+       continue
+       ;;
+      esac
+
+      # Get the absolute pathname.
+      absdir=`cd "$dir" && pwd`
+      test -n "$absdir" && dir="$absdir"
+
+      # Now add the directory to shlibpath_var.
+      if eval "test -z \"\$$shlibpath_var\""; then
+       eval "$shlibpath_var=\"\$dir\""
+      else
+       eval "$shlibpath_var=\"\$dir:\$$shlibpath_var\""
+      fi
+    done
+
+    # This variable tells wrapper scripts just to set shlibpath_var
+    # rather than running their programs.
+    libtool_execute_magic="$magic"
+
+    # Check if any of the arguments is a wrapper script.
+    args=
+    for file
+    do
+      case $file in
+      -* | *.la | *.lo ) ;;
+      *)
+       # Do a test to see if this is really a libtool program.
+       if func_ltwrapper_script_p "$file"; then
+         func_source "$file"
+         # Transform arg to wrapped name.
+         file="$progdir/$program"
+       elif func_ltwrapper_executable_p "$file"; then
+         func_ltwrapper_scriptname "$file"
+         func_source "$func_ltwrapper_scriptname_result"
+         # Transform arg to wrapped name.
+         file="$progdir/$program"
+       fi
+       ;;
+      esac
+      # Quote arguments (to preserve shell metacharacters).
+      func_append_quoted args "$file"
+    done
+
+    if test "X$opt_dry_run" = Xfalse; then
+      if test -n "$shlibpath_var"; then
+       # Export the shlibpath_var.
+       eval "export $shlibpath_var"
+      fi
+
+      # Restore saved environment variables
+      for lt_var in LANG LANGUAGE LC_ALL LC_CTYPE LC_COLLATE LC_MESSAGES
+      do
+       eval "if test \"\${save_$lt_var+set}\" = set; then
+                $lt_var=\$save_$lt_var; export $lt_var
+             else
+               $lt_unset $lt_var
+             fi"
+      done
+
+      # Now prepare to actually exec the command.
+      exec_cmd="\$cmd$args"
+    else
+      # Display what would be done.
+      if test -n "$shlibpath_var"; then
+       eval "\$ECHO \"\$shlibpath_var=\$$shlibpath_var\""
+       echo "export $shlibpath_var"
+      fi
+      $ECHO "$cmd$args"
+      exit $EXIT_SUCCESS
+    fi
+}
+
+test "$opt_mode" = execute && func_mode_execute ${1+"$@"}
+
+
+# func_mode_finish arg...
+func_mode_finish ()
+{
+    $opt_debug
+    libs=
+    libdirs=
+    admincmds=
+
+    for opt in "$nonopt" ${1+"$@"}
+    do
+      if test -d "$opt"; then
+       func_append libdirs " $opt"
+
+      elif test -f "$opt"; then
+       if func_lalib_unsafe_p "$opt"; then
+         func_append libs " $opt"
+       else
+         func_warning "\`$opt' is not a valid libtool archive"
+       fi
+
+      else
+       func_fatal_error "invalid argument \`$opt'"
+      fi
+    done
+
+    if test -n "$libs"; then
+      if test -n "$lt_sysroot"; then
+        sysroot_regex=`$ECHO "$lt_sysroot" | $SED "$sed_make_literal_regex"`
+        sysroot_cmd="s/\([ ']\)$sysroot_regex/\1/g;"
+      else
+        sysroot_cmd=
+      fi
+
+      # Remove sysroot references
+      if $opt_dry_run; then
+        for lib in $libs; do
+          echo "removing references to $lt_sysroot and \`=' prefixes from $lib"
+        done
+      else
+        tmpdir=`func_mktempdir`
+        for lib in $libs; do
+         sed -e "${sysroot_cmd} s/\([ ']-[LR]\)=/\1/g; s/\([ ']\)=/\1/g" $lib \
+           > $tmpdir/tmp-la
+         mv -f $tmpdir/tmp-la $lib
+       done
+        ${RM}r "$tmpdir"
+      fi
+    fi
+
+    if test -n "$finish_cmds$finish_eval" && test -n "$libdirs"; then
+      for libdir in $libdirs; do
+       if test -n "$finish_cmds"; then
+         # Do each command in the finish commands.
+         func_execute_cmds "$finish_cmds" 'admincmds="$admincmds
+'"$cmd"'"'
+       fi
+       if test -n "$finish_eval"; then
+         # Do the single finish_eval.
+         eval cmds=\"$finish_eval\"
+         $opt_dry_run || eval "$cmds" || func_append admincmds "
+       $cmds"
+       fi
+      done
+    fi
+
+    # Exit here if they wanted silent mode.
+    $opt_silent && exit $EXIT_SUCCESS
+
+    if test -n "$finish_cmds$finish_eval" && test -n "$libdirs"; then
+      echo "----------------------------------------------------------------------"
+      echo "Libraries have been installed in:"
+      for libdir in $libdirs; do
+       $ECHO "   $libdir"
+      done
+      echo
+      echo "If you ever happen to want to link against installed libraries"
+      echo "in a given directory, LIBDIR, you must either use libtool, and"
+      echo "specify the full pathname of the library, or use the \`-LLIBDIR'"
+      echo "flag during linking and do at least one of the following:"
+      if test -n "$shlibpath_var"; then
+       echo "   - add LIBDIR to the \`$shlibpath_var' environment variable"
+       echo "     during execution"
+      fi
+      if test -n "$runpath_var"; then
+       echo "   - add LIBDIR to the \`$runpath_var' environment variable"
+       echo "     during linking"
+      fi
+      if test -n "$hardcode_libdir_flag_spec"; then
+       libdir=LIBDIR
+       eval flag=\"$hardcode_libdir_flag_spec\"
+
+       $ECHO "   - use the \`$flag' linker flag"
+      fi
+      if test -n "$admincmds"; then
+       $ECHO "   - have your system administrator run these commands:$admincmds"
+      fi
+      if test -f /etc/ld.so.conf; then
+       echo "   - have your system administrator add LIBDIR to \`/etc/ld.so.conf'"
+      fi
+      echo
+
+      echo "See any operating system documentation about shared libraries for"
+      case $host in
+       solaris2.[6789]|solaris2.1[0-9])
+         echo "more information, such as the ld(1), crle(1) and ld.so(8) manual"
+         echo "pages."
+         ;;
+       *)
+         echo "more information, such as the ld(1) and ld.so(8) manual pages."
+         ;;
+      esac
+      echo "----------------------------------------------------------------------"
+    fi
+    exit $EXIT_SUCCESS
+}
+
+test "$opt_mode" = finish && func_mode_finish ${1+"$@"}
+
+
+# func_mode_install arg...
+func_mode_install ()
+{
+    $opt_debug
+    # There may be an optional sh(1) argument at the beginning of
+    # install_prog (especially on Windows NT).
+    if test "$nonopt" = "$SHELL" || test "$nonopt" = /bin/sh ||
+       # Allow the use of GNU shtool's install command.
+       case $nonopt in *shtool*) :;; *) false;; esac; then
+      # Aesthetically quote it.
+      func_quote_for_eval "$nonopt"
+      install_prog="$func_quote_for_eval_result "
+      arg=$1
+      shift
+    else
+      install_prog=
+      arg=$nonopt
+    fi
+
+    # The real first argument should be the name of the installation program.
+    # Aesthetically quote it.
+    func_quote_for_eval "$arg"
+    func_append install_prog "$func_quote_for_eval_result"
+    install_shared_prog=$install_prog
+    case " $install_prog " in
+      *[\\\ /]cp\ *) install_cp=: ;;
+      *) install_cp=false ;;
+    esac
+
+    # We need to accept at least all the BSD install flags.
+    dest=
+    files=
+    opts=
+    prev=
+    install_type=
+    isdir=no
+    stripme=
+    no_mode=:
+    for arg
+    do
+      arg2=
+      if test -n "$dest"; then
+       func_append files " $dest"
+       dest=$arg
+       continue
+      fi
+
+      case $arg in
+      -d) isdir=yes ;;
+      -f)
+       if $install_cp; then :; else
+         prev=$arg
+       fi
+       ;;
+      -g | -m | -o)
+       prev=$arg
+       ;;
+      -s)
+       stripme=" -s"
+       continue
+       ;;
+      -*)
+       ;;
+      *)
+       # If the previous option needed an argument, then skip it.
+       if test -n "$prev"; then
+         if test "x$prev" = x-m && test -n "$install_override_mode"; then
+           arg2=$install_override_mode
+           no_mode=false
+         fi
+         prev=
+       else
+         dest=$arg
+         continue
+       fi
+       ;;
+      esac
+
+      # Aesthetically quote the argument.
+      func_quote_for_eval "$arg"
+      func_append install_prog " $func_quote_for_eval_result"
+      if test -n "$arg2"; then
+       func_quote_for_eval "$arg2"
+      fi
+      func_append install_shared_prog " $func_quote_for_eval_result"
+    done
+
+    test -z "$install_prog" && \
+      func_fatal_help "you must specify an install program"
+
+    test -n "$prev" && \
+      func_fatal_help "the \`$prev' option requires an argument"
+
+    if test -n "$install_override_mode" && $no_mode; then
+      if $install_cp; then :; else
+       func_quote_for_eval "$install_override_mode"
+       func_append install_shared_prog " -m $func_quote_for_eval_result"
+      fi
+    fi
+
+    if test -z "$files"; then
+      if test -z "$dest"; then
+       func_fatal_help "no file or destination specified"
+      else
+       func_fatal_help "you must specify a destination"
+      fi
+    fi
+
+    # Strip any trailing slash from the destination.
+    func_stripname '' '/' "$dest"
+    dest=$func_stripname_result
+
+    # Check to see that the destination is a directory.
+    test -d "$dest" && isdir=yes
+    if test "$isdir" = yes; then
+      destdir="$dest"
+      destname=
+    else
+      func_dirname_and_basename "$dest" "" "."
+      destdir="$func_dirname_result"
+      destname="$func_basename_result"
+
+      # Not a directory, so check to see that there is only one file specified.
+      set dummy $files; shift
+      test "$#" -gt 1 && \
+       func_fatal_help "\`$dest' is not a directory"
+    fi
+    case $destdir in
+    [\\/]* | [A-Za-z]:[\\/]*) ;;
+    *)
+      for file in $files; do
+       case $file in
+       *.lo) ;;
+       *)
+         func_fatal_help "\`$destdir' must be an absolute directory name"
+         ;;
+       esac
+      done
+      ;;
+    esac
+
+    # This variable tells wrapper scripts just to set variables rather
+    # than running their programs.
+    libtool_install_magic="$magic"
+
+    staticlibs=
+    future_libdirs=
+    current_libdirs=
+    for file in $files; do
+
+      # Do each installation.
+      case $file in
+      *.$libext)
+       # Do the static libraries later.
+       func_append staticlibs " $file"
+       ;;
+
+      *.la)
+       func_resolve_sysroot "$file"
+       file=$func_resolve_sysroot_result
+
+       # Check to see that this really is a libtool archive.
+       func_lalib_unsafe_p "$file" \
+         || func_fatal_help "\`$file' is not a valid libtool archive"
+
+       library_names=
+       old_library=
+       relink_command=
+       func_source "$file"
+
+       # Add the libdir to current_libdirs if it is the destination.
+       if test "X$destdir" = "X$libdir"; then
+         case "$current_libdirs " in
+         *" $libdir "*) ;;
+         *) func_append current_libdirs " $libdir" ;;
+         esac
+       else
+         # Note the libdir as a future libdir.
+         case "$future_libdirs " in
+         *" $libdir "*) ;;
+         *) func_append future_libdirs " $libdir" ;;
+         esac
+       fi
+
+       func_dirname "$file" "/" ""
+       dir="$func_dirname_result"
+       func_append dir "$objdir"
+
+       if test -n "$relink_command"; then
+         # Determine the prefix the user has applied to our future dir.
+         inst_prefix_dir=`$ECHO "$destdir" | $SED -e "s%$libdir\$%%"`
+
+         # Don't allow the user to place us outside of our expected
+         # location b/c this prevents finding dependent libraries that
+         # are installed to the same prefix.
+         # At present, this check doesn't affect windows .dll's that
+         # are installed into $libdir/../bin (currently, that works fine)
+         # but it's something to keep an eye on.
+         test "$inst_prefix_dir" = "$destdir" && \
+           func_fatal_error "error: cannot install \`$file' to a directory not ending in $libdir"
+
+         if test -n "$inst_prefix_dir"; then
+           # Stick the inst_prefix_dir data into the link command.
+           relink_command=`$ECHO "$relink_command" | $SED "s%@inst_prefix_dir@%-inst-prefix-dir $inst_prefix_dir%"`
+         else
+           relink_command=`$ECHO "$relink_command" | $SED "s%@inst_prefix_dir@%%"`
+         fi
+
+         func_warning "relinking \`$file'"
+         func_show_eval "$relink_command" \
+           'func_fatal_error "error: relink \`$file'\'' with the above command before installing it"'
+       fi
+
+       # See the names of the shared library.
+       set dummy $library_names; shift
+       if test -n "$1"; then
+         realname="$1"
+         shift
+
+         srcname="$realname"
+         test -n "$relink_command" && srcname="$realname"T
+
+         # Install the shared library and build the symlinks.
+         func_show_eval "$install_shared_prog $dir/$srcname $destdir/$realname" \
+             'exit $?'
+         tstripme="$stripme"
+         case $host_os in
+         cygwin* | mingw* | pw32* | cegcc*)
+           case $realname in
+           *.dll.a)
+             tstripme=""
+             ;;
+           esac
+           ;;
+         esac
+         if test -n "$tstripme" && test -n "$striplib"; then
+           func_show_eval "$striplib $destdir/$realname" 'exit $?'
+         fi
+
+         if test "$#" -gt 0; then
+           # Delete the old symlinks, and create new ones.
+           # Try `ln -sf' first, because the `ln' binary might depend on
+           # the symlink we replace!  Solaris /bin/ln does not understand -f,
+           # so we also need to try rm && ln -s.
+           for linkname
+           do
+             test "$linkname" != "$realname" \
+               && func_show_eval "(cd $destdir && { $LN_S -f $realname $linkname || { $RM $linkname && $LN_S $realname $linkname; }; })"
+           done
+         fi
+
+         # Do each command in the postinstall commands.
+         lib="$destdir/$realname"
+         func_execute_cmds "$postinstall_cmds" 'exit $?'
+       fi
+
+       # Install the pseudo-library for information purposes.
+       func_basename "$file"
+       name="$func_basename_result"
+       instname="$dir/$name"i
+       func_show_eval "$install_prog $instname $destdir/$name" 'exit $?'
+
+       # Maybe install the static library, too.
+       test -n "$old_library" && func_append staticlibs " $dir/$old_library"
+       ;;
+
+      *.lo)
+       # Install (i.e. copy) a libtool object.
+
+       # Figure out destination file name, if it wasn't already specified.
+       if test -n "$destname"; then
+         destfile="$destdir/$destname"
+       else
+         func_basename "$file"
+         destfile="$func_basename_result"
+         destfile="$destdir/$destfile"
+       fi
+
+       # Deduce the name of the destination old-style object file.
+       case $destfile in
+       *.lo)
+         func_lo2o "$destfile"
+         staticdest=$func_lo2o_result
+         ;;
+       *.$objext)
+         staticdest="$destfile"
+         destfile=
+         ;;
+       *)
+         func_fatal_help "cannot copy a libtool object to \`$destfile'"
+         ;;
+       esac
+
+       # Install the libtool object if requested.
+       test -n "$destfile" && \
+         func_show_eval "$install_prog $file $destfile" 'exit $?'
+
+       # Install the old object if enabled.
+       if test "$build_old_libs" = yes; then
+         # Deduce the name of the old-style object file.
+         func_lo2o "$file"
+         staticobj=$func_lo2o_result
+         func_show_eval "$install_prog \$staticobj \$staticdest" 'exit $?'
+       fi
+       exit $EXIT_SUCCESS
+       ;;
+
+      *)
+       # Figure out destination file name, if it wasn't already specified.
+       if test -n "$destname"; then
+         destfile="$destdir/$destname"
+       else
+         func_basename "$file"
+         destfile="$func_basename_result"
+         destfile="$destdir/$destfile"
+       fi
+
+       # If the file is missing, and there is a .exe on the end, strip it
+       # because it is most likely a libtool script we actually want to
+       # install
+       stripped_ext=""
+       case $file in
+         *.exe)
+           if test ! -f "$file"; then
+             func_stripname '' '.exe' "$file"
+             file=$func_stripname_result
+             stripped_ext=".exe"
+           fi
+           ;;
+       esac
+
+       # Do a test to see if this is really a libtool program.
+       case $host in
+       *cygwin* | *mingw*)
+           if func_ltwrapper_executable_p "$file"; then
+             func_ltwrapper_scriptname "$file"
+             wrapper=$func_ltwrapper_scriptname_result
+           else
+             func_stripname '' '.exe' "$file"
+             wrapper=$func_stripname_result
+           fi
+           ;;
+       *)
+           wrapper=$file
+           ;;
+       esac
+       if func_ltwrapper_script_p "$wrapper"; then
+         notinst_deplibs=
+         relink_command=
+
+         func_source "$wrapper"
+
+         # Check the variables that should have been set.
+         test -z "$generated_by_libtool_version" && \
+           func_fatal_error "invalid libtool wrapper script \`$wrapper'"
+
+         finalize=yes
+         for lib in $notinst_deplibs; do
+           # Check to see that each library is installed.
+           libdir=
+           if test -f "$lib"; then
+             func_source "$lib"
+           fi
+           libfile="$libdir/"`$ECHO "$lib" | $SED 's%^.*/%%g'` ### testsuite: skip nested quoting test
+           if test -n "$libdir" && test ! -f "$libfile"; then
+             func_warning "\`$lib' has not been installed in \`$libdir'"
+             finalize=no
+           fi
+         done
+
+         relink_command=
+         func_source "$wrapper"
+
+         outputname=
+         if test "$fast_install" = no && test -n "$relink_command"; then
+           $opt_dry_run || {
+             if test "$finalize" = yes; then
+               tmpdir=`func_mktempdir`
+               func_basename "$file$stripped_ext"
+               file="$func_basename_result"
+               outputname="$tmpdir/$file"
+               # Replace the output file specification.
+               relink_command=`$ECHO "$relink_command" | $SED 's%@OUTPUT@%'"$outputname"'%g'`
+
+               $opt_silent || {
+                 func_quote_for_expand "$relink_command"
+                 eval "func_echo $func_quote_for_expand_result"
+               }
+               if eval "$relink_command"; then :
+                 else
+                 func_error "error: relink \`$file' with the above command before installing it"
+                 $opt_dry_run || ${RM}r "$tmpdir"
+                 continue
+               fi
+               file="$outputname"
+             else
+               func_warning "cannot relink \`$file'"
+             fi
+           }
+         else
+           # Install the binary that we compiled earlier.
+           file=`$ECHO "$file$stripped_ext" | $SED "s%\([^/]*\)$%$objdir/\1%"`
+         fi
+       fi
+
+       # remove .exe since cygwin /usr/bin/install will append another
+       # one anyway
+       case $install_prog,$host in
+       */usr/bin/install*,*cygwin*)
+         case $file:$destfile in
+         *.exe:*.exe)
+           # this is ok
+           ;;
+         *.exe:*)
+           destfile=$destfile.exe
+           ;;
+         *:*.exe)
+           func_stripname '' '.exe' "$destfile"
+           destfile=$func_stripname_result
+           ;;
+         esac
+         ;;
+       esac
+       func_show_eval "$install_prog\$stripme \$file \$destfile" 'exit $?'
+       $opt_dry_run || if test -n "$outputname"; then
+         ${RM}r "$tmpdir"
+       fi
+       ;;
+      esac
+    done
+
+    for file in $staticlibs; do
+      func_basename "$file"
+      name="$func_basename_result"
+
+      # Set up the ranlib parameters.
+      oldlib="$destdir/$name"
+      func_to_tool_file "$oldlib" func_convert_file_msys_to_w32
+      tool_oldlib=$func_to_tool_file_result
+
+      func_show_eval "$install_prog \$file \$oldlib" 'exit $?'
+
+      if test -n "$stripme" && test -n "$old_striplib"; then
+       func_show_eval "$old_striplib $tool_oldlib" 'exit $?'
+      fi
+
+      # Do each command in the postinstall commands.
+      func_execute_cmds "$old_postinstall_cmds" 'exit $?'
+    done
+
+    test -n "$future_libdirs" && \
+      func_warning "remember to run \`$progname --finish$future_libdirs'"
+
+    if test -n "$current_libdirs"; then
+      # Maybe just do a dry run.
+      $opt_dry_run && current_libdirs=" -n$current_libdirs"
+      exec_cmd='$SHELL $progpath $preserve_args --finish$current_libdirs'
+    else
+      exit $EXIT_SUCCESS
+    fi
+}
+
+test "$opt_mode" = install && func_mode_install ${1+"$@"}
+
+
+# func_generate_dlsyms outputname originator pic_p
+# Extract symbols from dlprefiles and create ${outputname}S.o with
+# a dlpreopen symbol table.
+func_generate_dlsyms ()
+{
+    $opt_debug
+    my_outputname="$1"
+    my_originator="$2"
+    my_pic_p="${3-no}"
+    my_prefix=`$ECHO "$my_originator" | sed 's%[^a-zA-Z0-9]%_%g'`
+    my_dlsyms=
+
+    if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then
+      if test -n "$NM" && test -n "$global_symbol_pipe"; then
+       my_dlsyms="${my_outputname}S.c"
+      else
+       func_error "not configured to extract global symbols from dlpreopened files"
+      fi
+    fi
+
+    if test -n "$my_dlsyms"; then
+      case $my_dlsyms in
+      "") ;;
+      *.c)
+       # Discover the nlist of each of the dlfiles.
+       nlist="$output_objdir/${my_outputname}.nm"
+
+       func_show_eval "$RM $nlist ${nlist}S ${nlist}T"
+
+       # Parse the name list into a source file.
+       func_verbose "creating $output_objdir/$my_dlsyms"
+
+       $opt_dry_run || $ECHO > "$output_objdir/$my_dlsyms" "\
+/* $my_dlsyms - symbol resolution table for \`$my_outputname' dlsym emulation. */
+/* Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION */
+
+#ifdef __cplusplus
+extern \"C\" {
+#endif
+
+#if defined(__GNUC__) && (((__GNUC__ == 4) && (__GNUC_MINOR__ >= 4)) || (__GNUC__ > 4))
+#pragma GCC diagnostic ignored \"-Wstrict-prototypes\"
+#endif
+
+/* Keep this code in sync between libtool.m4, ltmain, lt_system.h, and tests.  */
+#if defined(_WIN32) || defined(__CYGWIN__) || defined(_WIN32_WCE)
+/* DATA imports from DLLs on WIN32 con't be const, because runtime
+   relocations are performed -- see ld's documentation on pseudo-relocs.  */
+# define LT_DLSYM_CONST
+#elif defined(__osf__)
+/* This system does not cope well with relocations in const data.  */
+# define LT_DLSYM_CONST
+#else
+# define LT_DLSYM_CONST const
+#endif
+
+/* External symbol declarations for the compiler. */\
+"
+
+       if test "$dlself" = yes; then
+         func_verbose "generating symbol list for \`$output'"
+
+         $opt_dry_run || echo ': @PROGRAM@ ' > "$nlist"
+
+         # Add our own program objects to the symbol list.
+         progfiles=`$ECHO "$objs$old_deplibs" | $SP2NL | $SED "$lo2o" | $NL2SP`
+         for progfile in $progfiles; do
+           func_to_tool_file "$progfile" func_convert_file_msys_to_w32
+           func_verbose "extracting global C symbols from \`$func_to_tool_file_result'"
+           $opt_dry_run || eval "$NM $func_to_tool_file_result | $global_symbol_pipe >> '$nlist'"
+         done
+
+         if test -n "$exclude_expsyms"; then
+           $opt_dry_run || {
+             eval '$EGREP -v " ($exclude_expsyms)$" "$nlist" > "$nlist"T'
+             eval '$MV "$nlist"T "$nlist"'
+           }
+         fi
+
+         if test -n "$export_symbols_regex"; then
+           $opt_dry_run || {
+             eval '$EGREP -e "$export_symbols_regex" "$nlist" > "$nlist"T'
+             eval '$MV "$nlist"T "$nlist"'
+           }
+         fi
+
+         # Prepare the list of exported symbols
+         if test -z "$export_symbols"; then
+           export_symbols="$output_objdir/$outputname.exp"
+           $opt_dry_run || {
+             $RM $export_symbols
+             eval "${SED} -n -e '/^: @PROGRAM@ $/d' -e 's/^.* \(.*\)$/\1/p' "'< "$nlist" > "$export_symbols"'
+             case $host in
+             *cygwin* | *mingw* | *cegcc* )
+                eval "echo EXPORTS "'> "$output_objdir/$outputname.def"'
+                eval 'cat "$export_symbols" >> "$output_objdir/$outputname.def"'
+               ;;
+             esac
+           }
+         else
+           $opt_dry_run || {
+             eval "${SED} -e 's/\([].[*^$]\)/\\\\\1/g' -e 's/^/ /' -e 's/$/$/'"' < "$export_symbols" > "$output_objdir/$outputname.exp"'
+             eval '$GREP -f "$output_objdir/$outputname.exp" < "$nlist" > "$nlist"T'
+             eval '$MV "$nlist"T "$nlist"'
+             case $host in
+               *cygwin* | *mingw* | *cegcc* )
+                 eval "echo EXPORTS "'> "$output_objdir/$outputname.def"'
+                 eval 'cat "$nlist" >> "$output_objdir/$outputname.def"'
+                 ;;
+             esac
+           }
+         fi
+       fi
+
+       for dlprefile in $dlprefiles; do
+         func_verbose "extracting global C symbols from \`$dlprefile'"
+         func_basename "$dlprefile"
+         name="$func_basename_result"
+          case $host in
+           *cygwin* | *mingw* | *cegcc* )
+             # if an import library, we need to obtain dlname
+             if func_win32_import_lib_p "$dlprefile"; then
+               func_tr_sh "$dlprefile"
+               eval "curr_lafile=\$libfile_$func_tr_sh_result"
+               dlprefile_dlbasename=""
+               if test -n "$curr_lafile" && func_lalib_p "$curr_lafile"; then
+                 # Use subshell, to avoid clobbering current variable values
+                 dlprefile_dlname=`source "$curr_lafile" && echo "$dlname"`
+                 if test -n "$dlprefile_dlname" ; then
+                   func_basename "$dlprefile_dlname"
+                   dlprefile_dlbasename="$func_basename_result"
+                 else
+                   # no lafile. user explicitly requested -dlpreopen <import library>.
+                   $sharedlib_from_linklib_cmd "$dlprefile"
+                   dlprefile_dlbasename=$sharedlib_from_linklib_result
+                 fi
+               fi
+               $opt_dry_run || {
+                 if test -n "$dlprefile_dlbasename" ; then
+                   eval '$ECHO ": $dlprefile_dlbasename" >> "$nlist"'
+                 else
+                   func_warning "Could not compute DLL name from $name"
+                   eval '$ECHO ": $name " >> "$nlist"'
+                 fi
+                 func_to_tool_file "$dlprefile" func_convert_file_msys_to_w32
+                 eval "$NM \"$func_to_tool_file_result\" 2>/dev/null | $global_symbol_pipe |
+                   $SED -e '/I __imp/d' -e 's/I __nm_/D /;s/_nm__//' >> '$nlist'"
+               }
+             else # not an import lib
+               $opt_dry_run || {
+                 eval '$ECHO ": $name " >> "$nlist"'
+                 func_to_tool_file "$dlprefile" func_convert_file_msys_to_w32
+                 eval "$NM \"$func_to_tool_file_result\" 2>/dev/null | $global_symbol_pipe >> '$nlist'"
+               }
+             fi
+           ;;
+           *)
+             $opt_dry_run || {
+               eval '$ECHO ": $name " >> "$nlist"'
+               func_to_tool_file "$dlprefile" func_convert_file_msys_to_w32
+               eval "$NM \"$func_to_tool_file_result\" 2>/dev/null | $global_symbol_pipe >> '$nlist'"
+             }
+           ;;
+          esac
+       done
+
+       $opt_dry_run || {
+         # Make sure we have at least an empty file.
+         test -f "$nlist" || : > "$nlist"
+
+         if test -n "$exclude_expsyms"; then
+           $EGREP -v " ($exclude_expsyms)$" "$nlist" > "$nlist"T
+           $MV "$nlist"T "$nlist"
+         fi
+
+         # Try sorting and uniquifying the output.
+         if $GREP -v "^: " < "$nlist" |
+             if sort -k 3 </dev/null >/dev/null 2>&1; then
+               sort -k 3
+             else
+               sort +2
+             fi |
+             uniq > "$nlist"S; then
+           :
+         else
+           $GREP -v "^: " < "$nlist" > "$nlist"S
+         fi
+
+         if test -f "$nlist"S; then
+           eval "$global_symbol_to_cdecl"' < "$nlist"S >> "$output_objdir/$my_dlsyms"'
+         else
+           echo '/* NONE */' >> "$output_objdir/$my_dlsyms"
+         fi
+
+         echo >> "$output_objdir/$my_dlsyms" "\
+
+/* The mapping between symbol names and symbols.  */
+typedef struct {
+  const char *name;
+  void *address;
+} lt_dlsymlist;
+extern LT_DLSYM_CONST lt_dlsymlist
+lt_${my_prefix}_LTX_preloaded_symbols[];
+LT_DLSYM_CONST lt_dlsymlist
+lt_${my_prefix}_LTX_preloaded_symbols[] =
+{\
+  { \"$my_originator\", (void *) 0 },"
+
+         case $need_lib_prefix in
+         no)
+           eval "$global_symbol_to_c_name_address" < "$nlist" >> "$output_objdir/$my_dlsyms"
+           ;;
+         *)
+           eval "$global_symbol_to_c_name_address_lib_prefix" < "$nlist" >> "$output_objdir/$my_dlsyms"
+           ;;
+         esac
+         echo >> "$output_objdir/$my_dlsyms" "\
+  {0, (void *) 0}
+};
+
+/* This works around a problem in FreeBSD linker */
+#ifdef FREEBSD_WORKAROUND
+static const void *lt_preloaded_setup() {
+  return lt_${my_prefix}_LTX_preloaded_symbols;
+}
+#endif
+
+#ifdef __cplusplus
+}
+#endif\
+"
+       } # !$opt_dry_run
+
+       pic_flag_for_symtable=
+       case "$compile_command " in
+       *" -static "*) ;;
+       *)
+         case $host in
+         # compiling the symbol table file with pic_flag works around
+         # a FreeBSD bug that causes programs to crash when -lm is
+         # linked before any other PIC object.  But we must not use
+         # pic_flag when linking with -static.  The problem exists in
+         # FreeBSD 2.2.6 and is fixed in FreeBSD 3.1.
+         *-*-freebsd2.*|*-*-freebsd3.0*|*-*-freebsdelf3.0*)
+           pic_flag_for_symtable=" $pic_flag -DFREEBSD_WORKAROUND" ;;
+         *-*-hpux*)
+           pic_flag_for_symtable=" $pic_flag"  ;;
+         *)
+           if test "X$my_pic_p" != Xno; then
+             pic_flag_for_symtable=" $pic_flag"
+           fi
+           ;;
+         esac
+         ;;
+       esac
+       symtab_cflags=
+       for arg in $LTCFLAGS; do
+         case $arg in
+         -pie | -fpie | -fPIE) ;;
+         *) func_append symtab_cflags " $arg" ;;
+         esac
+       done
+
+       # Now compile the dynamic symbol file.
+       func_show_eval '(cd $output_objdir && $LTCC$symtab_cflags -c$no_builtin_flag$pic_flag_for_symtable "$my_dlsyms")' 'exit $?'
+
+       # Clean up the generated files.
+       func_show_eval '$RM "$output_objdir/$my_dlsyms" "$nlist" "${nlist}S" "${nlist}T"'
+
+       # Transform the symbol file into the correct name.
+       symfileobj="$output_objdir/${my_outputname}S.$objext"
+       case $host in
+       *cygwin* | *mingw* | *cegcc* )
+         if test -f "$output_objdir/$my_outputname.def"; then
+           compile_command=`$ECHO "$compile_command" | $SED "s%@SYMFILE@%$output_objdir/$my_outputname.def $symfileobj%"`
+           finalize_command=`$ECHO "$finalize_command" | $SED "s%@SYMFILE@%$output_objdir/$my_outputname.def $symfileobj%"`
+         else
+           compile_command=`$ECHO "$compile_command" | $SED "s%@SYMFILE@%$symfileobj%"`
+           finalize_command=`$ECHO "$finalize_command" | $SED "s%@SYMFILE@%$symfileobj%"`
+         fi
+         ;;
+       *)
+         compile_command=`$ECHO "$compile_command" | $SED "s%@SYMFILE@%$symfileobj%"`
+         finalize_command=`$ECHO "$finalize_command" | $SED "s%@SYMFILE@%$symfileobj%"`
+         ;;
+       esac
+       ;;
+      *)
+       func_fatal_error "unknown suffix for \`$my_dlsyms'"
+       ;;
+      esac
+    else
+      # We keep going just in case the user didn't refer to
+      # lt_preloaded_symbols.  The linker will fail if global_symbol_pipe
+      # really was required.
+
+      # Nullify the symbol file.
+      compile_command=`$ECHO "$compile_command" | $SED "s% @SYMFILE@%%"`
+      finalize_command=`$ECHO "$finalize_command" | $SED "s% @SYMFILE@%%"`
+    fi
+}
+
+# func_win32_libid arg
+# return the library type of file 'arg'
+#
+# Need a lot of goo to handle *both* DLLs and import libs
+# Has to be a shell function in order to 'eat' the argument
+# that is supplied when $file_magic_command is called.
+# Despite the name, also deal with 64 bit binaries.
+func_win32_libid ()
+{
+  $opt_debug
+  win32_libid_type="unknown"
+  win32_fileres=`file -L $1 2>/dev/null`
+  case $win32_fileres in
+  *ar\ archive\ import\ library*) # definitely import
+    win32_libid_type="x86 archive import"
+    ;;
+  *ar\ archive*) # could be an import, or static
+    # Keep the egrep pattern in sync with the one in _LT_CHECK_MAGIC_METHOD.
+    if eval $OBJDUMP -f $1 | $SED -e '10q' 2>/dev/null |
+       $EGREP 'file format (pei*-i386(.*architecture: i386)?|pe-arm-wince|pe-x86-64)' >/dev/null; then
+      func_to_tool_file "$1" func_convert_file_msys_to_w32
+      win32_nmres=`eval $NM -f posix -A \"$func_to_tool_file_result\" |
+       $SED -n -e '
+           1,100{
+               / I /{
+                   s,.*,import,
+                   p
+                   q
+               }
+           }'`
+      case $win32_nmres in
+      import*)  win32_libid_type="x86 archive import";;
+      *)        win32_libid_type="x86 archive static";;
+      esac
+    fi
+    ;;
+  *DLL*)
+    win32_libid_type="x86 DLL"
+    ;;
+  *executable*) # but shell scripts are "executable" too...
+    case $win32_fileres in
+    *MS\ Windows\ PE\ Intel*)
+      win32_libid_type="x86 DLL"
+      ;;
+    esac
+    ;;
+  esac
+  $ECHO "$win32_libid_type"
+}
+
+# func_cygming_dll_for_implib ARG
+#
+# Platform-specific function to extract the
+# name of the DLL associated with the specified
+# import library ARG.
+# Invoked by eval'ing the libtool variable
+#    $sharedlib_from_linklib_cmd
+# Result is available in the variable
+#    $sharedlib_from_linklib_result
+func_cygming_dll_for_implib ()
+{
+  $opt_debug
+  sharedlib_from_linklib_result=`$DLLTOOL --identify-strict --identify "$1"`
+}
+
+# func_cygming_dll_for_implib_fallback_core SECTION_NAME LIBNAMEs
+#
+# The is the core of a fallback implementation of a
+# platform-specific function to extract the name of the
+# DLL associated with the specified import library LIBNAME.
+#
+# SECTION_NAME is either .idata$6 or .idata$7, depending
+# on the platform and compiler that created the implib.
+#
+# Echos the name of the DLL associated with the
+# specified import library.
+func_cygming_dll_for_implib_fallback_core ()
+{
+  $opt_debug
+  match_literal=`$ECHO "$1" | $SED "$sed_make_literal_regex"`
+  $OBJDUMP -s --section "$1" "$2" 2>/dev/null |
+    $SED '/^Contents of section '"$match_literal"':/{
+      # Place marker at beginning of archive member dllname section
+      s/.*/====MARK====/
+      p
+      d
+    }
+    # These lines can sometimes be longer than 43 characters, but
+    # are always uninteresting
+    /:[         ]*file format pe[i]\{,1\}-/d
+    /^In archive [^:]*:/d
+    # Ensure marker is printed
+    /^====MARK====/p
+    # Remove all lines with less than 43 characters
+    /^.\{43\}/!d
+    # From remaining lines, remove first 43 characters
+    s/^.\{43\}//' |
+    $SED -n '
+      # Join marker and all lines until next marker into a single line
+      /^====MARK====/ b para
+      H
+      $ b para
+      b
+      :para
+      x
+      s/\n//g
+      # Remove the marker
+      s/^====MARK====//
+      # Remove trailing dots and whitespace
+      s/[\. \t]*$//
+      # Print
+      /./p' |
+    # we now have a list, one entry per line, of the stringified
+    # contents of the appropriate section of all members of the
+    # archive which possess that section. Heuristic: eliminate
+    # all those which have a first or second character that is
+    # a '.' (that is, objdump's representation of an unprintable
+    # character.) This should work for all archives with less than
+    # 0x302f exports -- but will fail for DLLs whose name actually
+    # begins with a literal '.' or a single character followed by
+    # a '.'.
+    #
+    # Of those that remain, print the first one.
+    $SED -e '/^\./d;/^.\./d;q'
+}
+
+# func_cygming_gnu_implib_p ARG
+# This predicate returns with zero status (TRUE) if
+# ARG is a GNU/binutils-style import library. Returns
+# with nonzero status (FALSE) otherwise.
+func_cygming_gnu_implib_p ()
+{
+  $opt_debug
+  func_to_tool_file "$1" func_convert_file_msys_to_w32
+  func_cygming_gnu_implib_tmp=`$NM "$func_to_tool_file_result" | eval "$global_symbol_pipe" | $EGREP ' (_head_[A-Za-z0-9_]+_[ad]l*|[A-Za-z0-9_]+_[ad]l*_iname)$'`
+  test -n "$func_cygming_gnu_implib_tmp"
+}
+
+# func_cygming_ms_implib_p ARG
+# This predicate returns with zero status (TRUE) if
+# ARG is an MS-style import library. Returns
+# with nonzero status (FALSE) otherwise.
+func_cygming_ms_implib_p ()
+{
+  $opt_debug
+  func_to_tool_file "$1" func_convert_file_msys_to_w32
+  func_cygming_ms_implib_tmp=`$NM "$func_to_tool_file_result" | eval "$global_symbol_pipe" | $GREP '_NULL_IMPORT_DESCRIPTOR'`
+  test -n "$func_cygming_ms_implib_tmp"
+}
+
+# func_cygming_dll_for_implib_fallback ARG
+# Platform-specific function to extract the
+# name of the DLL associated with the specified
+# import library ARG.
+#
+# This fallback implementation is for use when $DLLTOOL
+# does not support the --identify-strict option.
+# Invoked by eval'ing the libtool variable
+#    $sharedlib_from_linklib_cmd
+# Result is available in the variable
+#    $sharedlib_from_linklib_result
+func_cygming_dll_for_implib_fallback ()
+{
+  $opt_debug
+  if func_cygming_gnu_implib_p "$1" ; then
+    # binutils import library
+    sharedlib_from_linklib_result=`func_cygming_dll_for_implib_fallback_core '.idata$7' "$1"`
+  elif func_cygming_ms_implib_p "$1" ; then
+    # ms-generated import library
+    sharedlib_from_linklib_result=`func_cygming_dll_for_implib_fallback_core '.idata$6' "$1"`
+  else
+    # unknown
+    sharedlib_from_linklib_result=""
+  fi
+}
+
+
+# func_extract_an_archive dir oldlib
+func_extract_an_archive ()
+{
+    $opt_debug
+    f_ex_an_ar_dir="$1"; shift
+    f_ex_an_ar_oldlib="$1"
+    if test "$lock_old_archive_extraction" = yes; then
+      lockfile=$f_ex_an_ar_oldlib.lock
+      until $opt_dry_run || ln "$progpath" "$lockfile" 2>/dev/null; do
+       func_echo "Waiting for $lockfile to be removed"
+       sleep 2
+      done
+    fi
+    func_show_eval "(cd \$f_ex_an_ar_dir && $AR x \"\$f_ex_an_ar_oldlib\")" \
+                  'stat=$?; rm -f "$lockfile"; exit $stat'
+    if test "$lock_old_archive_extraction" = yes; then
+      $opt_dry_run || rm -f "$lockfile"
+    fi
+    if ($AR t "$f_ex_an_ar_oldlib" | sort | sort -uc >/dev/null 2>&1); then
+     :
+    else
+      func_fatal_error "object name conflicts in archive: $f_ex_an_ar_dir/$f_ex_an_ar_oldlib"
+    fi
+}
+
+
+# func_extract_archives gentop oldlib ...
+func_extract_archives ()
+{
+    $opt_debug
+    my_gentop="$1"; shift
+    my_oldlibs=${1+"$@"}
+    my_oldobjs=""
+    my_xlib=""
+    my_xabs=""
+    my_xdir=""
+
+    for my_xlib in $my_oldlibs; do
+      # Extract the objects.
+      case $my_xlib in
+       [\\/]* | [A-Za-z]:[\\/]*) my_xabs="$my_xlib" ;;
+       *) my_xabs=`pwd`"/$my_xlib" ;;
+      esac
+      func_basename "$my_xlib"
+      my_xlib="$func_basename_result"
+      my_xlib_u=$my_xlib
+      while :; do
+        case " $extracted_archives " in
+       *" $my_xlib_u "*)
+         func_arith $extracted_serial + 1
+         extracted_serial=$func_arith_result
+         my_xlib_u=lt$extracted_serial-$my_xlib ;;
+       *) break ;;
+       esac
+      done
+      extracted_archives="$extracted_archives $my_xlib_u"
+      my_xdir="$my_gentop/$my_xlib_u"
+
+      func_mkdir_p "$my_xdir"
+
+      case $host in
+      *-darwin*)
+       func_verbose "Extracting $my_xabs"
+       # Do not bother doing anything if just a dry run
+       $opt_dry_run || {
+         darwin_orig_dir=`pwd`
+         cd $my_xdir || exit $?
+         darwin_archive=$my_xabs
+         darwin_curdir=`pwd`
+         darwin_base_archive=`basename "$darwin_archive"`
+         darwin_arches=`$LIPO -info "$darwin_archive" 2>/dev/null | $GREP Architectures 2>/dev/null || true`
+         if test -n "$darwin_arches"; then
+           darwin_arches=`$ECHO "$darwin_arches" | $SED -e 's/.*are://'`
+           darwin_arch=
+           func_verbose "$darwin_base_archive has multiple architectures $darwin_arches"
+           for darwin_arch in  $darwin_arches ; do
+             func_mkdir_p "unfat-$$/${darwin_base_archive}-${darwin_arch}"
+             $LIPO -thin $darwin_arch -output "unfat-$$/${darwin_base_archive}-${darwin_arch}/${darwin_base_archive}" "${darwin_archive}"
+             cd "unfat-$$/${darwin_base_archive}-${darwin_arch}"
+             func_extract_an_archive "`pwd`" "${darwin_base_archive}"
+             cd "$darwin_curdir"
+             $RM "unfat-$$/${darwin_base_archive}-${darwin_arch}/${darwin_base_archive}"
+           done # $darwin_arches
+            ## Okay now we've a bunch of thin objects, gotta fatten them up :)
+           darwin_filelist=`find unfat-$$ -type f -name \*.o -print -o -name \*.lo -print | $SED -e "$basename" | sort -u`
+           darwin_file=
+           darwin_files=
+           for darwin_file in $darwin_filelist; do
+             darwin_files=`find unfat-$$ -name $darwin_file -print | sort | $NL2SP`
+             $LIPO -create -output "$darwin_file" $darwin_files
+           done # $darwin_filelist
+           $RM -rf unfat-$$
+           cd "$darwin_orig_dir"
+         else
+           cd $darwin_orig_dir
+           func_extract_an_archive "$my_xdir" "$my_xabs"
+         fi # $darwin_arches
+       } # !$opt_dry_run
+       ;;
+      *)
+        func_extract_an_archive "$my_xdir" "$my_xabs"
+       ;;
+      esac
+      my_oldobjs="$my_oldobjs "`find $my_xdir -name \*.$objext -print -o -name \*.lo -print | sort | $NL2SP`
+    done
+
+    func_extract_archives_result="$my_oldobjs"
+}
+
+
+# func_emit_wrapper [arg=no]
+#
+# Emit a libtool wrapper script on stdout.
+# Don't directly open a file because we may want to
+# incorporate the script contents within a cygwin/mingw
+# wrapper executable.  Must ONLY be called from within
+# func_mode_link because it depends on a number of variables
+# set therein.
+#
+# ARG is the value that the WRAPPER_SCRIPT_BELONGS_IN_OBJDIR
+# variable will take.  If 'yes', then the emitted script
+# will assume that the directory in which it is stored is
+# the $objdir directory.  This is a cygwin/mingw-specific
+# behavior.
+func_emit_wrapper ()
+{
+       func_emit_wrapper_arg1=${1-no}
+
+       $ECHO "\
+#! $SHELL
+
+# $output - temporary wrapper script for $objdir/$outputname
+# Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION
+#
+# The $output program cannot be directly executed until all the libtool
+# libraries that it depends on are installed.
+#
+# This wrapper script should never be moved out of the build directory.
+# If it is, it will not operate correctly.
+
+# Sed substitution that helps us do robust quoting.  It backslashifies
+# metacharacters that are still active within double-quoted strings.
+sed_quote_subst='$sed_quote_subst'
+
+# Be Bourne compatible
+if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then
+  emulate sh
+  NULLCMD=:
+  # Zsh 3.x and 4.x performs word splitting on \${1+\"\$@\"}, which
+  # is contrary to our usage.  Disable this feature.
+  alias -g '\${1+\"\$@\"}'='\"\$@\"'
+  setopt NO_GLOB_SUBST
+else
+  case \`(set -o) 2>/dev/null\` in *posix*) set -o posix;; esac
+fi
+BIN_SH=xpg4; export BIN_SH # for Tru64
+DUALCASE=1; export DUALCASE # for MKS sh
+
+# The HP-UX ksh and POSIX shell print the target directory to stdout
+# if CDPATH is set.
+(unset CDPATH) >/dev/null 2>&1 && unset CDPATH
+
+relink_command=\"$relink_command\"
+
+# This environment variable determines our operation mode.
+if test \"\$libtool_install_magic\" = \"$magic\"; then
+  # install mode needs the following variables:
+  generated_by_libtool_version='$macro_version'
+  notinst_deplibs='$notinst_deplibs'
+else
+  # When we are sourced in execute mode, \$file and \$ECHO are already set.
+  if test \"\$libtool_execute_magic\" != \"$magic\"; then
+    file=\"\$0\""
+
+    qECHO=`$ECHO "$ECHO" | $SED "$sed_quote_subst"`
+    $ECHO "\
+
+# A function that is used when there is no print builtin or printf.
+func_fallback_echo ()
+{
+  eval 'cat <<_LTECHO_EOF
+\$1
+_LTECHO_EOF'
+}
+    ECHO=\"$qECHO\"
+  fi
+
+# Very basic option parsing. These options are (a) specific to
+# the libtool wrapper, (b) are identical between the wrapper
+# /script/ and the wrapper /executable/ which is used only on
+# windows platforms, and (c) all begin with the string "--lt-"
+# (application programs are unlikely to have options which match
+# this pattern).
+#
+# There are only two supported options: --lt-debug and
+# --lt-dump-script. There is, deliberately, no --lt-help.
+#
+# The first argument to this parsing function should be the
+# script's $0 value, followed by "$@".
+lt_option_debug=
+func_parse_lt_options ()
+{
+  lt_script_arg0=\$0
+  shift
+  for lt_opt
+  do
+    case \"\$lt_opt\" in
+    --lt-debug) lt_option_debug=1 ;;
+    --lt-dump-script)
+        lt_dump_D=\`\$ECHO \"X\$lt_script_arg0\" | $SED -e 's/^X//' -e 's%/[^/]*$%%'\`
+        test \"X\$lt_dump_D\" = \"X\$lt_script_arg0\" && lt_dump_D=.
+        lt_dump_F=\`\$ECHO \"X\$lt_script_arg0\" | $SED -e 's/^X//' -e 's%^.*/%%'\`
+        cat \"\$lt_dump_D/\$lt_dump_F\"
+        exit 0
+      ;;
+    --lt-*)
+        \$ECHO \"Unrecognized --lt- option: '\$lt_opt'\" 1>&2
+        exit 1
+      ;;
+    esac
+  done
+
+  # Print the debug banner immediately:
+  if test -n \"\$lt_option_debug\"; then
+    echo \"${outputname}:${output}:\${LINENO}: libtool wrapper (GNU $PACKAGE$TIMESTAMP) $VERSION\" 1>&2
+  fi
+}
+
+# Used when --lt-debug. Prints its arguments to stdout
+# (redirection is the responsibility of the caller)
+func_lt_dump_args ()
+{
+  lt_dump_args_N=1;
+  for lt_arg
+  do
+    \$ECHO \"${outputname}:${output}:\${LINENO}: newargv[\$lt_dump_args_N]: \$lt_arg\"
+    lt_dump_args_N=\`expr \$lt_dump_args_N + 1\`
+  done
+}
+
+# Core function for launching the target application
+func_exec_program_core ()
+{
+"
+  case $host in
+  # Backslashes separate directories on plain windows
+  *-*-mingw | *-*-os2* | *-cegcc*)
+    $ECHO "\
+      if test -n \"\$lt_option_debug\"; then
+        \$ECHO \"${outputname}:${output}:\${LINENO}: newargv[0]: \$progdir\\\\\$program\" 1>&2
+        func_lt_dump_args \${1+\"\$@\"} 1>&2
+      fi
+      exec \"\$progdir\\\\\$program\" \${1+\"\$@\"}
+"
+    ;;
+
+  *)
+    $ECHO "\
+      if test -n \"\$lt_option_debug\"; then
+        \$ECHO \"${outputname}:${output}:\${LINENO}: newargv[0]: \$progdir/\$program\" 1>&2
+        func_lt_dump_args \${1+\"\$@\"} 1>&2
+      fi
+      exec \"\$progdir/\$program\" \${1+\"\$@\"}
+"
+    ;;
+  esac
+  $ECHO "\
+      \$ECHO \"\$0: cannot exec \$program \$*\" 1>&2
+      exit 1
+}
+
+# A function to encapsulate launching the target application
+# Strips options in the --lt-* namespace from \$@ and
+# launches target application with the remaining arguments.
+func_exec_program ()
+{
+  case \" \$* \" in
+  *\\ --lt-*)
+    for lt_wr_arg
+    do
+      case \$lt_wr_arg in
+      --lt-*) ;;
+      *) set x \"\$@\" \"\$lt_wr_arg\"; shift;;
+      esac
+      shift
+    done ;;
+  esac
+  func_exec_program_core \${1+\"\$@\"}
+}
+
+  # Parse options
+  func_parse_lt_options \"\$0\" \${1+\"\$@\"}
+
+  # Find the directory that this script lives in.
+  thisdir=\`\$ECHO \"\$file\" | $SED 's%/[^/]*$%%'\`
+  test \"x\$thisdir\" = \"x\$file\" && thisdir=.
+
+  # Follow symbolic links until we get to the real thisdir.
+  file=\`ls -ld \"\$file\" | $SED -n 's/.*-> //p'\`
+  while test -n \"\$file\"; do
+    destdir=\`\$ECHO \"\$file\" | $SED 's%/[^/]*\$%%'\`
+
+    # If there was a directory component, then change thisdir.
+    if test \"x\$destdir\" != \"x\$file\"; then
+      case \"\$destdir\" in
+      [\\\\/]* | [A-Za-z]:[\\\\/]*) thisdir=\"\$destdir\" ;;
+      *) thisdir=\"\$thisdir/\$destdir\" ;;
+      esac
+    fi
+
+    file=\`\$ECHO \"\$file\" | $SED 's%^.*/%%'\`
+    file=\`ls -ld \"\$thisdir/\$file\" | $SED -n 's/.*-> //p'\`
+  done
+
+  # Usually 'no', except on cygwin/mingw when embedded into
+  # the cwrapper.
+  WRAPPER_SCRIPT_BELONGS_IN_OBJDIR=$func_emit_wrapper_arg1
+  if test \"\$WRAPPER_SCRIPT_BELONGS_IN_OBJDIR\" = \"yes\"; then
+    # special case for '.'
+    if test \"\$thisdir\" = \".\"; then
+      thisdir=\`pwd\`
+    fi
+    # remove .libs from thisdir
+    case \"\$thisdir\" in
+    *[\\\\/]$objdir ) thisdir=\`\$ECHO \"\$thisdir\" | $SED 's%[\\\\/][^\\\\/]*$%%'\` ;;
+    $objdir )   thisdir=. ;;
+    esac
+  fi
+
+  # Try to get the absolute directory name.
+  absdir=\`cd \"\$thisdir\" && pwd\`
+  test -n \"\$absdir\" && thisdir=\"\$absdir\"
+"
+
+       if test "$fast_install" = yes; then
+         $ECHO "\
+  program=lt-'$outputname'$exeext
+  progdir=\"\$thisdir/$objdir\"
+
+  if test ! -f \"\$progdir/\$program\" ||
+     { file=\`ls -1dt \"\$progdir/\$program\" \"\$progdir/../\$program\" 2>/dev/null | ${SED} 1q\`; \\
+       test \"X\$file\" != \"X\$progdir/\$program\"; }; then
+
+    file=\"\$\$-\$program\"
+
+    if test ! -d \"\$progdir\"; then
+      $MKDIR \"\$progdir\"
+    else
+      $RM \"\$progdir/\$file\"
+    fi"
+
+         $ECHO "\
+
+    # relink executable if necessary
+    if test -n \"\$relink_command\"; then
+      if relink_command_output=\`eval \$relink_command 2>&1\`; then :
+      else
+       $ECHO \"\$relink_command_output\" >&2
+       $RM \"\$progdir/\$file\"
+       exit 1
+      fi
+    fi
+
+    $MV \"\$progdir/\$file\" \"\$progdir/\$program\" 2>/dev/null ||
+    { $RM \"\$progdir/\$program\";
+      $MV \"\$progdir/\$file\" \"\$progdir/\$program\"; }
+    $RM \"\$progdir/\$file\"
+  fi"
+       else
+         $ECHO "\
+  program='$outputname'
+  progdir=\"\$thisdir/$objdir\"
+"
+       fi
+
+       $ECHO "\
+
+  if test -f \"\$progdir/\$program\"; then"
+
+       # fixup the dll searchpath if we need to.
+       #
+       # Fix the DLL searchpath if we need to.  Do this before prepending
+       # to shlibpath, because on Windows, both are PATH and uninstalled
+       # libraries must come first.
+       if test -n "$dllsearchpath"; then
+         $ECHO "\
+    # Add the dll search path components to the executable PATH
+    PATH=$dllsearchpath:\$PATH
+"
+       fi
+
+       # Export our shlibpath_var if we have one.
+       if test "$shlibpath_overrides_runpath" = yes && test -n "$shlibpath_var" && test -n "$temp_rpath"; then
+         $ECHO "\
+    # Add our own library path to $shlibpath_var
+    $shlibpath_var=\"$temp_rpath\$$shlibpath_var\"
+
+    # Some systems cannot cope with colon-terminated $shlibpath_var
+    # The second colon is a workaround for a bug in BeOS R4 sed
+    $shlibpath_var=\`\$ECHO \"\$$shlibpath_var\" | $SED 's/::*\$//'\`
+
+    export $shlibpath_var
+"
+       fi
+
+       $ECHO "\
+    if test \"\$libtool_execute_magic\" != \"$magic\"; then
+      # Run the actual program with our arguments.
+      func_exec_program \${1+\"\$@\"}
+    fi
+  else
+    # The program doesn't exist.
+    \$ECHO \"\$0: error: \\\`\$progdir/\$program' does not exist\" 1>&2
+    \$ECHO \"This script is just a wrapper for \$program.\" 1>&2
+    \$ECHO \"See the $PACKAGE documentation for more information.\" 1>&2
+    exit 1
+  fi
+fi\
+"
+}
+
+
+# func_emit_cwrapperexe_src
+# emit the source code for a wrapper executable on stdout
+# Must ONLY be called from within func_mode_link because
+# it depends on a number of variable set therein.
+func_emit_cwrapperexe_src ()
+{
+       cat <<EOF
+
+/* $cwrappersource - temporary wrapper executable for $objdir/$outputname
+   Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION
+
+   The $output program cannot be directly executed until all the libtool
+   libraries that it depends on are installed.
+
+   This wrapper executable should never be moved out of the build directory.
+   If it is, it will not operate correctly.
+*/
+EOF
+           cat <<"EOF"
+#ifdef _MSC_VER
+# define _CRT_SECURE_NO_DEPRECATE 1
+#endif
+#include <stdio.h>
+#include <stdlib.h>
+#ifdef _MSC_VER
+# include <direct.h>
+# include <process.h>
+# include <io.h>
+#else
+# include <unistd.h>
+# include <stdint.h>
+# ifdef __CYGWIN__
+#  include <io.h>
+# endif
+#endif
+#include <malloc.h>
+#include <stdarg.h>
+#include <assert.h>
+#include <string.h>
+#include <ctype.h>
+#include <errno.h>
+#include <fcntl.h>
+#include <sys/stat.h>
+
+/* declarations of non-ANSI functions */
+#if defined(__MINGW32__)
+# ifdef __STRICT_ANSI__
+int _putenv (const char *);
+# endif
+#elif defined(__CYGWIN__)
+# ifdef __STRICT_ANSI__
+char *realpath (const char *, char *);
+int putenv (char *);
+int setenv (const char *, const char *, int);
+# endif
+/* #elif defined (other platforms) ... */
+#endif
+
+/* portability defines, excluding path handling macros */
+#if defined(_MSC_VER)
+# define setmode _setmode
+# define stat    _stat
+# define chmod   _chmod
+# define getcwd  _getcwd
+# define putenv  _putenv
+# define S_IXUSR _S_IEXEC
+# ifndef _INTPTR_T_DEFINED
+#  define _INTPTR_T_DEFINED
+#  define intptr_t int
+# endif
+#elif defined(__MINGW32__)
+# define setmode _setmode
+# define stat    _stat
+# define chmod   _chmod
+# define getcwd  _getcwd
+# define putenv  _putenv
+#elif defined(__CYGWIN__)
+# define HAVE_SETENV
+# define FOPEN_WB "wb"
+/* #elif defined (other platforms) ... */
+#endif
+
+#if defined(PATH_MAX)
+# define LT_PATHMAX PATH_MAX
+#elif defined(MAXPATHLEN)
+# define LT_PATHMAX MAXPATHLEN
+#else
+# define LT_PATHMAX 1024
+#endif
+
+#ifndef S_IXOTH
+# define S_IXOTH 0
+#endif
+#ifndef S_IXGRP
+# define S_IXGRP 0
+#endif
+
+/* path handling portability macros */
+#ifndef DIR_SEPARATOR
+# define DIR_SEPARATOR '/'
+# define PATH_SEPARATOR ':'
+#endif
+
+#if defined (_WIN32) || defined (__MSDOS__) || defined (__DJGPP__) || \
+  defined (__OS2__)
+# define HAVE_DOS_BASED_FILE_SYSTEM
+# define FOPEN_WB "wb"
+# ifndef DIR_SEPARATOR_2
+#  define DIR_SEPARATOR_2 '\\'
+# endif
+# ifndef PATH_SEPARATOR_2
+#  define PATH_SEPARATOR_2 ';'
+# endif
+#endif
+
+#ifndef DIR_SEPARATOR_2
+# define IS_DIR_SEPARATOR(ch) ((ch) == DIR_SEPARATOR)
+#else /* DIR_SEPARATOR_2 */
+# define IS_DIR_SEPARATOR(ch) \
+       (((ch) == DIR_SEPARATOR) || ((ch) == DIR_SEPARATOR_2))
+#endif /* DIR_SEPARATOR_2 */
+
+#ifndef PATH_SEPARATOR_2
+# define IS_PATH_SEPARATOR(ch) ((ch) == PATH_SEPARATOR)
+#else /* PATH_SEPARATOR_2 */
+# define IS_PATH_SEPARATOR(ch) ((ch) == PATH_SEPARATOR_2)
+#endif /* PATH_SEPARATOR_2 */
+
+#ifndef FOPEN_WB
+# define FOPEN_WB "w"
+#endif
+#ifndef _O_BINARY
+# define _O_BINARY 0
+#endif
+
+#define XMALLOC(type, num)      ((type *) xmalloc ((num) * sizeof(type)))
+#define XFREE(stale) do { \
+  if (stale) { free ((void *) stale); stale = 0; } \
+} while (0)
+
+#if defined(LT_DEBUGWRAPPER)
+static int lt_debug = 1;
+#else
+static int lt_debug = 0;
+#endif
+
+const char *program_name = "libtool-wrapper"; /* in case xstrdup fails */
+
+void *xmalloc (size_t num);
+char *xstrdup (const char *string);
+const char *base_name (const char *name);
+char *find_executable (const char *wrapper);
+char *chase_symlinks (const char *pathspec);
+int make_executable (const char *path);
+int check_executable (const char *path);
+char *strendzap (char *str, const char *pat);
+void lt_debugprintf (const char *file, int line, const char *fmt, ...);
+void lt_fatal (const char *file, int line, const char *message, ...);
+static const char *nonnull (const char *s);
+static const char *nonempty (const char *s);
+void lt_setenv (const char *name, const char *value);
+char *lt_extend_str (const char *orig_value, const char *add, int to_end);
+void lt_update_exe_path (const char *name, const char *value);
+void lt_update_lib_path (const char *name, const char *value);
+char **prepare_spawn (char **argv);
+void lt_dump_script (FILE *f);
+EOF
+
+           cat <<EOF
+volatile const char * MAGIC_EXE = "$magic_exe";
+const char * LIB_PATH_VARNAME = "$shlibpath_var";
+EOF
+
+           if test "$shlibpath_overrides_runpath" = yes && test -n "$shlibpath_var" && test -n "$temp_rpath"; then
+              func_to_host_path "$temp_rpath"
+             cat <<EOF
+const char * LIB_PATH_VALUE   = "$func_to_host_path_result";
+EOF
+           else
+             cat <<"EOF"
+const char * LIB_PATH_VALUE   = "";
+EOF
+           fi
+
+           if test -n "$dllsearchpath"; then
+              func_to_host_path "$dllsearchpath:"
+             cat <<EOF
+const char * EXE_PATH_VARNAME = "PATH";
+const char * EXE_PATH_VALUE   = "$func_to_host_path_result";
+EOF
+           else
+             cat <<"EOF"
+const char * EXE_PATH_VARNAME = "";
+const char * EXE_PATH_VALUE   = "";
+EOF
+           fi
+
+           if test "$fast_install" = yes; then
+             cat <<EOF
+const char * TARGET_PROGRAM_NAME = "lt-$outputname"; /* hopefully, no .exe */
+EOF
+           else
+             cat <<EOF
+const char * TARGET_PROGRAM_NAME = "$outputname"; /* hopefully, no .exe */
+EOF
+           fi
+
+
+           cat <<"EOF"
+
+#define LTWRAPPER_OPTION_PREFIX         "--lt-"
+
+static const char *ltwrapper_option_prefix = LTWRAPPER_OPTION_PREFIX;
+static const char *dumpscript_opt       = LTWRAPPER_OPTION_PREFIX "dump-script";
+static const char *debug_opt            = LTWRAPPER_OPTION_PREFIX "debug";
+
+int
+main (int argc, char *argv[])
+{
+  char **newargz;
+  int  newargc;
+  char *tmp_pathspec;
+  char *actual_cwrapper_path;
+  char *actual_cwrapper_name;
+  char *target_name;
+  char *lt_argv_zero;
+  intptr_t rval = 127;
+
+  int i;
+
+  program_name = (char *) xstrdup (base_name (argv[0]));
+  newargz = XMALLOC (char *, argc + 1);
+
+  /* very simple arg parsing; don't want to rely on getopt
+   * also, copy all non cwrapper options to newargz, except
+   * argz[0], which is handled differently
+   */
+  newargc=0;
+  for (i = 1; i < argc; i++)
+    {
+      if (strcmp (argv[i], dumpscript_opt) == 0)
+       {
+EOF
+           case "$host" in
+             *mingw* | *cygwin* )
+               # make stdout use "unix" line endings
+               echo "          setmode(1,_O_BINARY);"
+               ;;
+             esac
+
+           cat <<"EOF"
+         lt_dump_script (stdout);
+         return 0;
+       }
+      if (strcmp (argv[i], debug_opt) == 0)
+       {
+          lt_debug = 1;
+          continue;
+       }
+      if (strcmp (argv[i], ltwrapper_option_prefix) == 0)
+        {
+          /* however, if there is an option in the LTWRAPPER_OPTION_PREFIX
+             namespace, but it is not one of the ones we know about and
+             have already dealt with, above (inluding dump-script), then
+             report an error. Otherwise, targets might begin to believe
+             they are allowed to use options in the LTWRAPPER_OPTION_PREFIX
+             namespace. The first time any user complains about this, we'll
+             need to make LTWRAPPER_OPTION_PREFIX a configure-time option
+             or a configure.ac-settable value.
+           */
+          lt_fatal (__FILE__, __LINE__,
+                   "unrecognized %s option: '%s'",
+                    ltwrapper_option_prefix, argv[i]);
+        }
+      /* otherwise ... */
+      newargz[++newargc] = xstrdup (argv[i]);
+    }
+  newargz[++newargc] = NULL;
+
+EOF
+           cat <<EOF
+  /* The GNU banner must be the first non-error debug message */
+  lt_debugprintf (__FILE__, __LINE__, "libtool wrapper (GNU $PACKAGE$TIMESTAMP) $VERSION\n");
+EOF
+           cat <<"EOF"
+  lt_debugprintf (__FILE__, __LINE__, "(main) argv[0]: %s\n", argv[0]);
+  lt_debugprintf (__FILE__, __LINE__, "(main) program_name: %s\n", program_name);
+
+  tmp_pathspec = find_executable (argv[0]);
+  if (tmp_pathspec == NULL)
+    lt_fatal (__FILE__, __LINE__, "couldn't find %s", argv[0]);
+  lt_debugprintf (__FILE__, __LINE__,
+                  "(main) found exe (before symlink chase) at: %s\n",
+                 tmp_pathspec);
+
+  actual_cwrapper_path = chase_symlinks (tmp_pathspec);
+  lt_debugprintf (__FILE__, __LINE__,
+                  "(main) found exe (after symlink chase) at: %s\n",
+                 actual_cwrapper_path);
+  XFREE (tmp_pathspec);
+
+  actual_cwrapper_name = xstrdup (base_name (actual_cwrapper_path));
+  strendzap (actual_cwrapper_path, actual_cwrapper_name);
+
+  /* wrapper name transforms */
+  strendzap (actual_cwrapper_name, ".exe");
+  tmp_pathspec = lt_extend_str (actual_cwrapper_name, ".exe", 1);
+  XFREE (actual_cwrapper_name);
+  actual_cwrapper_name = tmp_pathspec;
+  tmp_pathspec = 0;
+
+  /* target_name transforms -- use actual target program name; might have lt- prefix */
+  target_name = xstrdup (base_name (TARGET_PROGRAM_NAME));
+  strendzap (target_name, ".exe");
+  tmp_pathspec = lt_extend_str (target_name, ".exe", 1);
+  XFREE (target_name);
+  target_name = tmp_pathspec;
+  tmp_pathspec = 0;
+
+  lt_debugprintf (__FILE__, __LINE__,
+                 "(main) libtool target name: %s\n",
+                 target_name);
+EOF
+
+           cat <<EOF
+  newargz[0] =
+    XMALLOC (char, (strlen (actual_cwrapper_path) +
+                   strlen ("$objdir") + 1 + strlen (actual_cwrapper_name) + 1));
+  strcpy (newargz[0], actual_cwrapper_path);
+  strcat (newargz[0], "$objdir");
+  strcat (newargz[0], "/");
+EOF
+
+           cat <<"EOF"
+  /* stop here, and copy so we don't have to do this twice */
+  tmp_pathspec = xstrdup (newargz[0]);
+
+  /* do NOT want the lt- prefix here, so use actual_cwrapper_name */
+  strcat (newargz[0], actual_cwrapper_name);
+
+  /* DO want the lt- prefix here if it exists, so use target_name */
+  lt_argv_zero = lt_extend_str (tmp_pathspec, target_name, 1);
+  XFREE (tmp_pathspec);
+  tmp_pathspec = NULL;
+EOF
+
+           case $host_os in
+             mingw*)
+           cat <<"EOF"
+  {
+    char* p;
+    while ((p = strchr (newargz[0], '\\')) != NULL)
+      {
+       *p = '/';
+      }
+    while ((p = strchr (lt_argv_zero, '\\')) != NULL)
+      {
+       *p = '/';
+      }
+  }
+EOF
+           ;;
+           esac
+
+           cat <<"EOF"
+  XFREE (target_name);
+  XFREE (actual_cwrapper_path);
+  XFREE (actual_cwrapper_name);
+
+  lt_setenv ("BIN_SH", "xpg4"); /* for Tru64 */
+  lt_setenv ("DUALCASE", "1");  /* for MSK sh */
+  /* Update the DLL searchpath.  EXE_PATH_VALUE ($dllsearchpath) must
+     be prepended before (that is, appear after) LIB_PATH_VALUE ($temp_rpath)
+     because on Windows, both *_VARNAMEs are PATH but uninstalled
+     libraries must come first. */
+  lt_update_exe_path (EXE_PATH_VARNAME, EXE_PATH_VALUE);
+  lt_update_lib_path (LIB_PATH_VARNAME, LIB_PATH_VALUE);
+
+  lt_debugprintf (__FILE__, __LINE__, "(main) lt_argv_zero: %s\n",
+                 nonnull (lt_argv_zero));
+  for (i = 0; i < newargc; i++)
+    {
+      lt_debugprintf (__FILE__, __LINE__, "(main) newargz[%d]: %s\n",
+                     i, nonnull (newargz[i]));
+    }
+
+EOF
+
+           case $host_os in
+             mingw*)
+               cat <<"EOF"
+  /* execv doesn't actually work on mingw as expected on unix */
+  newargz = prepare_spawn (newargz);
+  rval = _spawnv (_P_WAIT, lt_argv_zero, (const char * const *) newargz);
+  if (rval == -1)
+    {
+      /* failed to start process */
+      lt_debugprintf (__FILE__, __LINE__,
+                     "(main) failed to launch target \"%s\": %s\n",
+                     lt_argv_zero, nonnull (strerror (errno)));
+      return 127;
+    }
+  return rval;
+EOF
+               ;;
+             *)
+               cat <<"EOF"
+  execv (lt_argv_zero, newargz);
+  return rval; /* =127, but avoids unused variable warning */
+EOF
+               ;;
+           esac
+
+           cat <<"EOF"
+}
+
+void *
+xmalloc (size_t num)
+{
+  void *p = (void *) malloc (num);
+  if (!p)
+    lt_fatal (__FILE__, __LINE__, "memory exhausted");
+
+  return p;
+}
+
+char *
+xstrdup (const char *string)
+{
+  return string ? strcpy ((char *) xmalloc (strlen (string) + 1),
+                         string) : NULL;
+}
+
+const char *
+base_name (const char *name)
+{
+  const char *base;
+
+#if defined (HAVE_DOS_BASED_FILE_SYSTEM)
+  /* Skip over the disk name in MSDOS pathnames. */
+  if (isalpha ((unsigned char) name[0]) && name[1] == ':')
+    name += 2;
+#endif
+
+  for (base = name; *name; name++)
+    if (IS_DIR_SEPARATOR (*name))
+      base = name + 1;
+  return base;
+}
+
+int
+check_executable (const char *path)
+{
+  struct stat st;
+
+  lt_debugprintf (__FILE__, __LINE__, "(check_executable): %s\n",
+                  nonempty (path));
+  if ((!path) || (!*path))
+    return 0;
+
+  if ((stat (path, &st) >= 0)
+      && (st.st_mode & (S_IXUSR | S_IXGRP | S_IXOTH)))
+    return 1;
+  else
+    return 0;
+}
+
+int
+make_executable (const char *path)
+{
+  int rval = 0;
+  struct stat st;
+
+  lt_debugprintf (__FILE__, __LINE__, "(make_executable): %s\n",
+                  nonempty (path));
+  if ((!path) || (!*path))
+    return 0;
+
+  if (stat (path, &st) >= 0)
+    {
+      rval = chmod (path, st.st_mode | S_IXOTH | S_IXGRP | S_IXUSR);
+    }
+  return rval;
+}
+
+/* Searches for the full path of the wrapper.  Returns
+   newly allocated full path name if found, NULL otherwise
+   Does not chase symlinks, even on platforms that support them.
+*/
+char *
+find_executable (const char *wrapper)
+{
+  int has_slash = 0;
+  const char *p;
+  const char *p_next;
+  /* static buffer for getcwd */
+  char tmp[LT_PATHMAX + 1];
+  int tmp_len;
+  char *concat_name;
+
+  lt_debugprintf (__FILE__, __LINE__, "(find_executable): %s\n",
+                  nonempty (wrapper));
+
+  if ((wrapper == NULL) || (*wrapper == '\0'))
+    return NULL;
+
+  /* Absolute path? */
+#if defined (HAVE_DOS_BASED_FILE_SYSTEM)
+  if (isalpha ((unsigned char) wrapper[0]) && wrapper[1] == ':')
+    {
+      concat_name = xstrdup (wrapper);
+      if (check_executable (concat_name))
+       return concat_name;
+      XFREE (concat_name);
+    }
+  else
+    {
+#endif
+      if (IS_DIR_SEPARATOR (wrapper[0]))
+       {
+         concat_name = xstrdup (wrapper);
+         if (check_executable (concat_name))
+           return concat_name;
+         XFREE (concat_name);
+       }
+#if defined (HAVE_DOS_BASED_FILE_SYSTEM)
+    }
+#endif
+
+  for (p = wrapper; *p; p++)
+    if (*p == '/')
+      {
+       has_slash = 1;
+       break;
+      }
+  if (!has_slash)
+    {
+      /* no slashes; search PATH */
+      const char *path = getenv ("PATH");
+      if (path != NULL)
+       {
+         for (p = path; *p; p = p_next)
+           {
+             const char *q;
+             size_t p_len;
+             for (q = p; *q; q++)
+               if (IS_PATH_SEPARATOR (*q))
+                 break;
+             p_len = q - p;
+             p_next = (*q == '\0' ? q : q + 1);
+             if (p_len == 0)
+               {
+                 /* empty path: current directory */
+                 if (getcwd (tmp, LT_PATHMAX) == NULL)
+                   lt_fatal (__FILE__, __LINE__, "getcwd failed: %s",
+                              nonnull (strerror (errno)));
+                 tmp_len = strlen (tmp);
+                 concat_name =
+                   XMALLOC (char, tmp_len + 1 + strlen (wrapper) + 1);
+                 memcpy (concat_name, tmp, tmp_len);
+                 concat_name[tmp_len] = '/';
+                 strcpy (concat_name + tmp_len + 1, wrapper);
+               }
+             else
+               {
+                 concat_name =
+                   XMALLOC (char, p_len + 1 + strlen (wrapper) + 1);
+                 memcpy (concat_name, p, p_len);
+                 concat_name[p_len] = '/';
+                 strcpy (concat_name + p_len + 1, wrapper);
+               }
+             if (check_executable (concat_name))
+               return concat_name;
+             XFREE (concat_name);
+           }
+       }
+      /* not found in PATH; assume curdir */
+    }
+  /* Relative path | not found in path: prepend cwd */
+  if (getcwd (tmp, LT_PATHMAX) == NULL)
+    lt_fatal (__FILE__, __LINE__, "getcwd failed: %s",
+              nonnull (strerror (errno)));
+  tmp_len = strlen (tmp);
+  concat_name = XMALLOC (char, tmp_len + 1 + strlen (wrapper) + 1);
+  memcpy (concat_name, tmp, tmp_len);
+  concat_name[tmp_len] = '/';
+  strcpy (concat_name + tmp_len + 1, wrapper);
+
+  if (check_executable (concat_name))
+    return concat_name;
+  XFREE (concat_name);
+  return NULL;
+}
+
+char *
+chase_symlinks (const char *pathspec)
+{
+#ifndef S_ISLNK
+  return xstrdup (pathspec);
+#else
+  char buf[LT_PATHMAX];
+  struct stat s;
+  char *tmp_pathspec = xstrdup (pathspec);
+  char *p;
+  int has_symlinks = 0;
+  while (strlen (tmp_pathspec) && !has_symlinks)
+    {
+      lt_debugprintf (__FILE__, __LINE__,
+                     "checking path component for symlinks: %s\n",
+                     tmp_pathspec);
+      if (lstat (tmp_pathspec, &s) == 0)
+       {
+         if (S_ISLNK (s.st_mode) != 0)
+           {
+             has_symlinks = 1;
+             break;
+           }
+
+         /* search backwards for last DIR_SEPARATOR */
+         p = tmp_pathspec + strlen (tmp_pathspec) - 1;
+         while ((p > tmp_pathspec) && (!IS_DIR_SEPARATOR (*p)))
+           p--;
+         if ((p == tmp_pathspec) && (!IS_DIR_SEPARATOR (*p)))
+           {
+             /* no more DIR_SEPARATORS left */
+             break;
+           }
+         *p = '\0';
+       }
+      else
+       {
+         lt_fatal (__FILE__, __LINE__,
+                   "error accessing file \"%s\": %s",
+                   tmp_pathspec, nonnull (strerror (errno)));
+       }
+    }
+  XFREE (tmp_pathspec);
+
+  if (!has_symlinks)
+    {
+      return xstrdup (pathspec);
+    }
+
+  tmp_pathspec = realpath (pathspec, buf);
+  if (tmp_pathspec == 0)
+    {
+      lt_fatal (__FILE__, __LINE__,
+               "could not follow symlinks for %s", pathspec);
+    }
+  return xstrdup (tmp_pathspec);
+#endif
+}
+
+char *
+strendzap (char *str, const char *pat)
+{
+  size_t len, patlen;
+
+  assert (str != NULL);
+  assert (pat != NULL);
+
+  len = strlen (str);
+  patlen = strlen (pat);
+
+  if (patlen <= len)
+    {
+      str += len - patlen;
+      if (strcmp (str, pat) == 0)
+       *str = '\0';
+    }
+  return str;
+}
+
+void
+lt_debugprintf (const char *file, int line, const char *fmt, ...)
+{
+  va_list args;
+  if (lt_debug)
+    {
+      (void) fprintf (stderr, "%s:%s:%d: ", program_name, file, line);
+      va_start (args, fmt);
+      (void) vfprintf (stderr, fmt, args);
+      va_end (args);
+    }
+}
+
+static void
+lt_error_core (int exit_status, const char *file,
+              int line, const char *mode,
+              const char *message, va_list ap)
+{
+  fprintf (stderr, "%s:%s:%d: %s: ", program_name, file, line, mode);
+  vfprintf (stderr, message, ap);
+  fprintf (stderr, ".\n");
+
+  if (exit_status >= 0)
+    exit (exit_status);
+}
+
+void
+lt_fatal (const char *file, int line, const char *message, ...)
+{
+  va_list ap;
+  va_start (ap, message);
+  lt_error_core (EXIT_FAILURE, file, line, "FATAL", message, ap);
+  va_end (ap);
+}
+
+static const char *
+nonnull (const char *s)
+{
+  return s ? s : "(null)";
+}
+
+static const char *
+nonempty (const char *s)
+{
+  return (s && !*s) ? "(empty)" : nonnull (s);
+}
+
+void
+lt_setenv (const char *name, const char *value)
+{
+  lt_debugprintf (__FILE__, __LINE__,
+                 "(lt_setenv) setting '%s' to '%s'\n",
+                  nonnull (name), nonnull (value));
+  {
+#ifdef HAVE_SETENV
+    /* always make a copy, for consistency with !HAVE_SETENV */
+    char *str = xstrdup (value);
+    setenv (name, str, 1);
+#else
+    int len = strlen (name) + 1 + strlen (value) + 1;
+    char *str = XMALLOC (char, len);
+    sprintf (str, "%s=%s", name, value);
+    if (putenv (str) != EXIT_SUCCESS)
+      {
+        XFREE (str);
+      }
+#endif
+  }
+}
+
+char *
+lt_extend_str (const char *orig_value, const char *add, int to_end)
+{
+  char *new_value;
+  if (orig_value && *orig_value)
+    {
+      int orig_value_len = strlen (orig_value);
+      int add_len = strlen (add);
+      new_value = XMALLOC (char, add_len + orig_value_len + 1);
+      if (to_end)
+        {
+          strcpy (new_value, orig_value);
+          strcpy (new_value + orig_value_len, add);
+        }
+      else
+        {
+          strcpy (new_value, add);
+          strcpy (new_value + add_len, orig_value);
+        }
+    }
+  else
+    {
+      new_value = xstrdup (add);
+    }
+  return new_value;
+}
+
+void
+lt_update_exe_path (const char *name, const char *value)
+{
+  lt_debugprintf (__FILE__, __LINE__,
+                 "(lt_update_exe_path) modifying '%s' by prepending '%s'\n",
+                  nonnull (name), nonnull (value));
+
+  if (name && *name && value && *value)
+    {
+      char *new_value = lt_extend_str (getenv (name), value, 0);
+      /* some systems can't cope with a ':'-terminated path #' */
+      int len = strlen (new_value);
+      while (((len = strlen (new_value)) > 0) && IS_PATH_SEPARATOR (new_value[len-1]))
+        {
+          new_value[len-1] = '\0';
+        }
+      lt_setenv (name, new_value);
+      XFREE (new_value);
+    }
+}
+
+void
+lt_update_lib_path (const char *name, const char *value)
+{
+  lt_debugprintf (__FILE__, __LINE__,
+                 "(lt_update_lib_path) modifying '%s' by prepending '%s'\n",
+                  nonnull (name), nonnull (value));
+
+  if (name && *name && value && *value)
+    {
+      char *new_value = lt_extend_str (getenv (name), value, 0);
+      lt_setenv (name, new_value);
+      XFREE (new_value);
+    }
+}
+
+EOF
+           case $host_os in
+             mingw*)
+               cat <<"EOF"
+
+/* Prepares an argument vector before calling spawn().
+   Note that spawn() does not by itself call the command interpreter
+     (getenv ("COMSPEC") != NULL ? getenv ("COMSPEC") :
+      ({ OSVERSIONINFO v; v.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
+         GetVersionEx(&v);
+         v.dwPlatformId == VER_PLATFORM_WIN32_NT;
+      }) ? "cmd.exe" : "command.com").
+   Instead it simply concatenates the arguments, separated by ' ', and calls
+   CreateProcess().  We must quote the arguments since Win32 CreateProcess()
+   interprets characters like ' ', '\t', '\\', '"' (but not '<' and '>') in a
+   special way:
+   - Space and tab are interpreted as delimiters. They are not treated as
+     delimiters if they are surrounded by double quotes: "...".
+   - Unescaped double quotes are removed from the input. Their only effect is
+     that within double quotes, space and tab are treated like normal
+     characters.
+   - Backslashes not followed by double quotes are not special.
+   - But 2*n+1 backslashes followed by a double quote become
+     n backslashes followed by a double quote (n >= 0):
+       \" -> "
+       \\\" -> \"
+       \\\\\" -> \\"
+ */
+#define SHELL_SPECIAL_CHARS "\"\\ \001\002\003\004\005\006\007\010\011\012\013\014\015\016\017\020\021\022\023\024\025\026\027\030\031\032\033\034\035\036\037"
+#define SHELL_SPACE_CHARS " \001\002\003\004\005\006\007\010\011\012\013\014\015\016\017\020\021\022\023\024\025\026\027\030\031\032\033\034\035\036\037"
+char **
+prepare_spawn (char **argv)
+{
+  size_t argc;
+  char **new_argv;
+  size_t i;
+
+  /* Count number of arguments.  */
+  for (argc = 0; argv[argc] != NULL; argc++)
+    ;
+
+  /* Allocate new argument vector.  */
+  new_argv = XMALLOC (char *, argc + 1);
+
+  /* Put quoted arguments into the new argument vector.  */
+  for (i = 0; i < argc; i++)
+    {
+      const char *string = argv[i];
+
+      if (string[0] == '\0')
+       new_argv[i] = xstrdup ("\"\"");
+      else if (strpbrk (string, SHELL_SPECIAL_CHARS) != NULL)
+       {
+         int quote_around = (strpbrk (string, SHELL_SPACE_CHARS) != NULL);
+         size_t length;
+         unsigned int backslashes;
+         const char *s;
+         char *quoted_string;
+         char *p;
+
+         length = 0;
+         backslashes = 0;
+         if (quote_around)
+           length++;
+         for (s = string; *s != '\0'; s++)
+           {
+             char c = *s;
+             if (c == '"')
+               length += backslashes + 1;
+             length++;
+             if (c == '\\')
+               backslashes++;
+             else
+               backslashes = 0;
+           }
+         if (quote_around)
+           length += backslashes + 1;
+
+         quoted_string = XMALLOC (char, length + 1);
+
+         p = quoted_string;
+         backslashes = 0;
+         if (quote_around)
+           *p++ = '"';
+         for (s = string; *s != '\0'; s++)
+           {
+             char c = *s;
+             if (c == '"')
+               {
+                 unsigned int j;
+                 for (j = backslashes + 1; j > 0; j--)
+                   *p++ = '\\';
+               }
+             *p++ = c;
+             if (c == '\\')
+               backslashes++;
+             else
+               backslashes = 0;
+           }
+         if (quote_around)
+           {
+             unsigned int j;
+             for (j = backslashes; j > 0; j--)
+               *p++ = '\\';
+             *p++ = '"';
+           }
+         *p = '\0';
+
+         new_argv[i] = quoted_string;
+       }
+      else
+       new_argv[i] = (char *) string;
+    }
+  new_argv[argc] = NULL;
+
+  return new_argv;
+}
+EOF
+               ;;
+           esac
+
+            cat <<"EOF"
+void lt_dump_script (FILE* f)
+{
+EOF
+           func_emit_wrapper yes |
+             $SED -n -e '
+s/^\(.\{79\}\)\(..*\)/\1\
+\2/
+h
+s/\([\\"]\)/\\\1/g
+s/$/\\n/
+s/\([^\n]*\).*/  fputs ("\1", f);/p
+g
+D'
+            cat <<"EOF"
+}
+EOF
+}
+# end: func_emit_cwrapperexe_src
+
+# func_win32_import_lib_p ARG
+# True if ARG is an import lib, as indicated by $file_magic_cmd
+func_win32_import_lib_p ()
+{
+    $opt_debug
+    case `eval $file_magic_cmd \"\$1\" 2>/dev/null | $SED -e 10q` in
+    *import*) : ;;
+    *) false ;;
+    esac
+}
+
+# func_mode_link arg...
+func_mode_link ()
+{
+    $opt_debug
+    case $host in
+    *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*)
+      # It is impossible to link a dll without this setting, and
+      # we shouldn't force the makefile maintainer to figure out
+      # which system we are compiling for in order to pass an extra
+      # flag for every libtool invocation.
+      # allow_undefined=no
+
+      # FIXME: Unfortunately, there are problems with the above when trying
+      # to make a dll which has undefined symbols, in which case not
+      # even a static library is built.  For now, we need to specify
+      # -no-undefined on the libtool link line when we can be certain
+      # that all symbols are satisfied, otherwise we get a static library.
+      allow_undefined=yes
+      ;;
+    *)
+      allow_undefined=yes
+      ;;
+    esac
+    libtool_args=$nonopt
+    base_compile="$nonopt $@"
+    compile_command=$nonopt
+    finalize_command=$nonopt
+
+    compile_rpath=
+    finalize_rpath=
+    compile_shlibpath=
+    finalize_shlibpath=
+    convenience=
+    old_convenience=
+    deplibs=
+    old_deplibs=
+    compiler_flags=
+    linker_flags=
+    dllsearchpath=
+    lib_search_path=`pwd`
+    inst_prefix_dir=
+    new_inherited_linker_flags=
+
+    avoid_version=no
+    bindir=
+    dlfiles=
+    dlprefiles=
+    dlself=no
+    export_dynamic=no
+    export_symbols=
+    export_symbols_regex=
+    generated=
+    libobjs=
+    ltlibs=
+    module=no
+    no_install=no
+    objs=
+    non_pic_objects=
+    precious_files_regex=
+    prefer_static_libs=no
+    preload=no
+    prev=
+    prevarg=
+    release=
+    rpath=
+    xrpath=
+    perm_rpath=
+    temp_rpath=
+    thread_safe=no
+    vinfo=
+    vinfo_number=no
+    weak_libs=
+    single_module="${wl}-single_module"
+    func_infer_tag $base_compile
+
+    # We need to know -static, to get the right output filenames.
+    for arg
+    do
+      case $arg in
+      -shared)
+       test "$build_libtool_libs" != yes && \
+         func_fatal_configuration "can not build a shared library"
+       build_old_libs=no
+       break
+       ;;
+      -all-static | -static | -static-libtool-libs)
+       case $arg in
+       -all-static)
+         if test "$build_libtool_libs" = yes && test -z "$link_static_flag"; then
+           func_warning "complete static linking is impossible in this configuration"
+         fi
+         if test -n "$link_static_flag"; then
+           dlopen_self=$dlopen_self_static
+         fi
+         prefer_static_libs=yes
+         ;;
+       -static)
+         if test -z "$pic_flag" && test -n "$link_static_flag"; then
+           dlopen_self=$dlopen_self_static
+         fi
+         prefer_static_libs=built
+         ;;
+       -static-libtool-libs)
+         if test -z "$pic_flag" && test -n "$link_static_flag"; then
+           dlopen_self=$dlopen_self_static
+         fi
+         prefer_static_libs=yes
+         ;;
+       esac
+       build_libtool_libs=no
+       build_old_libs=yes
+       break
+       ;;
+      esac
+    done
+
+    # See if our shared archives depend on static archives.
+    test -n "$old_archive_from_new_cmds" && build_old_libs=yes
+
+    # Go through the arguments, transforming them on the way.
+    while test "$#" -gt 0; do
+      arg="$1"
+      shift
+      func_quote_for_eval "$arg"
+      qarg=$func_quote_for_eval_unquoted_result
+      func_append libtool_args " $func_quote_for_eval_result"
+
+      # If the previous option needs an argument, assign it.
+      if test -n "$prev"; then
+       case $prev in
+       output)
+         func_append compile_command " @OUTPUT@"
+         func_append finalize_command " @OUTPUT@"
+         ;;
+       esac
+
+       case $prev in
+       bindir)
+         bindir="$arg"
+         prev=
+         continue
+         ;;
+       dlfiles|dlprefiles)
+         if test "$preload" = no; then
+           # Add the symbol object into the linking commands.
+           func_append compile_command " @SYMFILE@"
+           func_append finalize_command " @SYMFILE@"
+           preload=yes
+         fi
+         case $arg in
+         *.la | *.lo) ;;  # We handle these cases below.
+         force)
+           if test "$dlself" = no; then
+             dlself=needless
+             export_dynamic=yes
+           fi
+           prev=
+           continue
+           ;;
+         self)
+           if test "$prev" = dlprefiles; then
+             dlself=yes
+           elif test "$prev" = dlfiles && test "$dlopen_self" != yes; then
+             dlself=yes
+           else
+             dlself=needless
+             export_dynamic=yes
+           fi
+           prev=
+           continue
+           ;;
+         *)
+           if test "$prev" = dlfiles; then
+             func_append dlfiles " $arg"
+           else
+             func_append dlprefiles " $arg"
+           fi
+           prev=
+           continue
+           ;;
+         esac
+         ;;
+       expsyms)
+         export_symbols="$arg"
+         test -f "$arg" \
+           || func_fatal_error "symbol file \`$arg' does not exist"
+         prev=
+         continue
+         ;;
+       expsyms_regex)
+         export_symbols_regex="$arg"
+         prev=
+         continue
+         ;;
+       framework)
+         case $host in
+           *-*-darwin*)
+             case "$deplibs " in
+               *" $qarg.ltframework "*) ;;
+               *) func_append deplibs " $qarg.ltframework" # this is fixed later
+                  ;;
+             esac
+             ;;
+         esac
+         prev=
+         continue
+         ;;
+       inst_prefix)
+         inst_prefix_dir="$arg"
+         prev=
+         continue
+         ;;
+       objectlist)
+         if test -f "$arg"; then
+           save_arg=$arg
+           moreargs=
+           for fil in `cat "$save_arg"`
+           do
+#            func_append moreargs " $fil"
+             arg=$fil
+             # A libtool-controlled object.
+
+             # Check to see that this really is a libtool object.
+             if func_lalib_unsafe_p "$arg"; then
+               pic_object=
+               non_pic_object=
+
+               # Read the .lo file
+               func_source "$arg"
+
+               if test -z "$pic_object" ||
+                  test -z "$non_pic_object" ||
+                  test "$pic_object" = none &&
+                  test "$non_pic_object" = none; then
+                 func_fatal_error "cannot find name of object for \`$arg'"
+               fi
+
+               # Extract subdirectory from the argument.
+               func_dirname "$arg" "/" ""
+               xdir="$func_dirname_result"
+
+               if test "$pic_object" != none; then
+                 # Prepend the subdirectory the object is found in.
+                 pic_object="$xdir$pic_object"
+
+                 if test "$prev" = dlfiles; then
+                   if test "$build_libtool_libs" = yes && test "$dlopen_support" = yes; then
+                     func_append dlfiles " $pic_object"
+                     prev=
+                     continue
+                   else
+                     # If libtool objects are unsupported, then we need to preload.
+                     prev=dlprefiles
+                   fi
+                 fi
+
+                 # CHECK ME:  I think I busted this.  -Ossama
+                 if test "$prev" = dlprefiles; then
+                   # Preload the old-style object.
+                   func_append dlprefiles " $pic_object"
+                   prev=
+                 fi
+
+                 # A PIC object.
+                 func_append libobjs " $pic_object"
+                 arg="$pic_object"
+               fi
+
+               # Non-PIC object.
+               if test "$non_pic_object" != none; then
+                 # Prepend the subdirectory the object is found in.
+                 non_pic_object="$xdir$non_pic_object"
+
+                 # A standard non-PIC object
+                 func_append non_pic_objects " $non_pic_object"
+                 if test -z "$pic_object" || test "$pic_object" = none ; then
+                   arg="$non_pic_object"
+                 fi
+               else
+                 # If the PIC object exists, use it instead.
+                 # $xdir was prepended to $pic_object above.
+                 non_pic_object="$pic_object"
+                 func_append non_pic_objects " $non_pic_object"
+               fi
+             else
+               # Only an error if not doing a dry-run.
+               if $opt_dry_run; then
+                 # Extract subdirectory from the argument.
+                 func_dirname "$arg" "/" ""
+                 xdir="$func_dirname_result"
+
+                 func_lo2o "$arg"
+                 pic_object=$xdir$objdir/$func_lo2o_result
+                 non_pic_object=$xdir$func_lo2o_result
+                 func_append libobjs " $pic_object"
+                 func_append non_pic_objects " $non_pic_object"
+               else
+                 func_fatal_error "\`$arg' is not a valid libtool object"
+               fi
+             fi
+           done
+         else
+           func_fatal_error "link input file \`$arg' does not exist"
+         fi
+         arg=$save_arg
+         prev=
+         continue
+         ;;
+       precious_regex)
+         precious_files_regex="$arg"
+         prev=
+         continue
+         ;;
+       release)
+         release="-$arg"
+         prev=
+         continue
+         ;;
+       rpath | xrpath)
+         # We need an absolute path.
+         case $arg in
+         [\\/]* | [A-Za-z]:[\\/]*) ;;
+         *)
+           func_fatal_error "only absolute run-paths are allowed"
+           ;;
+         esac
+         if test "$prev" = rpath; then
+           case "$rpath " in
+           *" $arg "*) ;;
+           *) func_append rpath " $arg" ;;
+           esac
+         else
+           case "$xrpath " in
+           *" $arg "*) ;;
+           *) func_append xrpath " $arg" ;;
+           esac
+         fi
+         prev=
+         continue
+         ;;
+       shrext)
+         shrext_cmds="$arg"
+         prev=
+         continue
+         ;;
+       weak)
+         func_append weak_libs " $arg"
+         prev=
+         continue
+         ;;
+       xcclinker)
+         func_append linker_flags " $qarg"
+         func_append compiler_flags " $qarg"
+         prev=
+         func_append compile_command " $qarg"
+         func_append finalize_command " $qarg"
+         continue
+         ;;
+       xcompiler)
+         func_append compiler_flags " $qarg"
+         prev=
+         func_append compile_command " $qarg"
+         func_append finalize_command " $qarg"
+         continue
+         ;;
+       xlinker)
+         func_append linker_flags " $qarg"
+         func_append compiler_flags " $wl$qarg"
+         prev=
+         func_append compile_command " $wl$qarg"
+         func_append finalize_command " $wl$qarg"
+         continue
+         ;;
+       *)
+         eval "$prev=\"\$arg\""
+         prev=
+         continue
+         ;;
+       esac
+      fi # test -n "$prev"
+
+      prevarg="$arg"
+
+      case $arg in
+      -all-static)
+       if test -n "$link_static_flag"; then
+         # See comment for -static flag below, for more details.
+         func_append compile_command " $link_static_flag"
+         func_append finalize_command " $link_static_flag"
+       fi
+       continue
+       ;;
+
+      -allow-undefined)
+       # FIXME: remove this flag sometime in the future.
+       func_fatal_error "\`-allow-undefined' must not be used because it is the default"
+       ;;
+
+      -avoid-version)
+       avoid_version=yes
+       continue
+       ;;
+
+      -bindir)
+       prev=bindir
+       continue
+       ;;
+
+      -dlopen)
+       prev=dlfiles
+       continue
+       ;;
+
+      -dlpreopen)
+       prev=dlprefiles
+       continue
+       ;;
+
+      -export-dynamic)
+       export_dynamic=yes
+       continue
+       ;;
+
+      -export-symbols | -export-symbols-regex)
+       if test -n "$export_symbols" || test -n "$export_symbols_regex"; then
+         func_fatal_error "more than one -exported-symbols argument is not allowed"
+       fi
+       if test "X$arg" = "X-export-symbols"; then
+         prev=expsyms
+       else
+         prev=expsyms_regex
+       fi
+       continue
+       ;;
+
+      -framework)
+       prev=framework
+       continue
+       ;;
+
+      -inst-prefix-dir)
+       prev=inst_prefix
+       continue
+       ;;
+
+      # The native IRIX linker understands -LANG:*, -LIST:* and -LNO:*
+      # so, if we see these flags be careful not to treat them like -L
+      -L[A-Z][A-Z]*:*)
+       case $with_gcc/$host in
+       no/*-*-irix* | /*-*-irix*)
+         func_append compile_command " $arg"
+         func_append finalize_command " $arg"
+         ;;
+       esac
+       continue
+       ;;
+
+      -L*)
+       func_stripname "-L" '' "$arg"
+       if test -z "$func_stripname_result"; then
+         if test "$#" -gt 0; then
+           func_fatal_error "require no space between \`-L' and \`$1'"
+         else
+           func_fatal_error "need path for \`-L' option"
+         fi
+       fi
+       func_resolve_sysroot "$func_stripname_result"
+       dir=$func_resolve_sysroot_result
+       # We need an absolute path.
+       case $dir in
+       [\\/]* | [A-Za-z]:[\\/]*) ;;
+       *)
+         absdir=`cd "$dir" && pwd`
+         test -z "$absdir" && \
+           func_fatal_error "cannot determine absolute directory name of \`$dir'"
+         dir="$absdir"
+         ;;
+       esac
+       case "$deplibs " in
+       *" -L$dir "* | *" $arg "*)
+         # Will only happen for absolute or sysroot arguments
+         ;;
+       *)
+         # Preserve sysroot, but never include relative directories
+         case $dir in
+           [\\/]* | [A-Za-z]:[\\/]* | =*) func_append deplibs " $arg" ;;
+           *) func_append deplibs " -L$dir" ;;
+         esac
+         func_append lib_search_path " $dir"
+         ;;
+       esac
+       case $host in
+       *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*)
+         testbindir=`$ECHO "$dir" | $SED 's*/lib$*/bin*'`
+         case :$dllsearchpath: in
+         *":$dir:"*) ;;
+         ::) dllsearchpath=$dir;;
+         *) func_append dllsearchpath ":$dir";;
+         esac
+         case :$dllsearchpath: in
+         *":$testbindir:"*) ;;
+         ::) dllsearchpath=$testbindir;;
+         *) func_append dllsearchpath ":$testbindir";;
+         esac
+         ;;
+       esac
+       continue
+       ;;
+
+      -l*)
+       if test "X$arg" = "X-lc" || test "X$arg" = "X-lm"; then
+         case $host in
+         *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-beos* | *-cegcc* | *-*-haiku*)
+           # These systems don't actually have a C or math library (as such)
+           continue
+           ;;
+         *-*-os2*)
+           # These systems don't actually have a C library (as such)
+           test "X$arg" = "X-lc" && continue
+           ;;
+         *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*)
+           # Do not include libc due to us having libc/libc_r.
+           test "X$arg" = "X-lc" && continue
+           ;;
+         *-*-rhapsody* | *-*-darwin1.[012])
+           # Rhapsody C and math libraries are in the System framework
+           func_append deplibs " System.ltframework"
+           continue
+           ;;
+         *-*-sco3.2v5* | *-*-sco5v6*)
+           # Causes problems with __ctype
+           test "X$arg" = "X-lc" && continue
+           ;;
+         *-*-sysv4.2uw2* | *-*-sysv5* | *-*-unixware* | *-*-OpenUNIX*)
+           # Compiler inserts libc in the correct place for threads to work
+           test "X$arg" = "X-lc" && continue
+           ;;
+         esac
+       elif test "X$arg" = "X-lc_r"; then
+        case $host in
+        *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*)
+          # Do not include libc_r directly, use -pthread flag.
+          continue
+          ;;
+        esac
+       fi
+       func_append deplibs " $arg"
+       continue
+       ;;
+
+      -module)
+       module=yes
+       continue
+       ;;
+
+      # Tru64 UNIX uses -model [arg] to determine the layout of C++
+      # classes, name mangling, and exception handling.
+      # Darwin uses the -arch flag to determine output architecture.
+      -model|-arch|-isysroot|--sysroot)
+       func_append compiler_flags " $arg"
+       func_append compile_command " $arg"
+       func_append finalize_command " $arg"
+       prev=xcompiler
+       continue
+       ;;
+
+      -mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe \
+      |-threads|-fopenmp|-openmp|-mp|-xopenmp|-omp|-qsmp=*)
+       func_append compiler_flags " $arg"
+       func_append compile_command " $arg"
+       func_append finalize_command " $arg"
+       case "$new_inherited_linker_flags " in
+           *" $arg "*) ;;
+           * ) func_append new_inherited_linker_flags " $arg" ;;
+       esac
+       continue
+       ;;
+
+      -multi_module)
+       single_module="${wl}-multi_module"
+       continue
+       ;;
+
+      -no-fast-install)
+       fast_install=no
+       continue
+       ;;
+
+      -no-install)
+       case $host in
+       *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-*-darwin* | *-cegcc*)
+         # The PATH hackery in wrapper scripts is required on Windows
+         # and Darwin in order for the loader to find any dlls it needs.
+         func_warning "\`-no-install' is ignored for $host"
+         func_warning "assuming \`-no-fast-install' instead"
+         fast_install=no
+         ;;
+       *) no_install=yes ;;
+       esac
+       continue
+       ;;
+
+      -no-undefined)
+       allow_undefined=no
+       continue
+       ;;
+
+      -objectlist)
+       prev=objectlist
+       continue
+       ;;
+
+      -o) prev=output ;;
+
+      -precious-files-regex)
+       prev=precious_regex
+       continue
+       ;;
+
+      -release)
+       prev=release
+       continue
+       ;;
+
+      -rpath)
+       prev=rpath
+       continue
+       ;;
+
+      -R)
+       prev=xrpath
+       continue
+       ;;
+
+      -R*)
+       func_stripname '-R' '' "$arg"
+       dir=$func_stripname_result
+       # We need an absolute path.
+       case $dir in
+       [\\/]* | [A-Za-z]:[\\/]*) ;;
+       =*)
+         func_stripname '=' '' "$dir"
+         dir=$lt_sysroot$func_stripname_result
+         ;;
+       *)
+         func_fatal_error "only absolute run-paths are allowed"
+         ;;
+       esac
+       case "$xrpath " in
+       *" $dir "*) ;;
+       *) func_append xrpath " $dir" ;;
+       esac
+       continue
+       ;;
+
+      -shared)
+       # The effects of -shared are defined in a previous loop.
+       continue
+       ;;
+
+      -shrext)
+       prev=shrext
+       continue
+       ;;
+
+      -static | -static-libtool-libs)
+       # The effects of -static are defined in a previous loop.
+       # We used to do the same as -all-static on platforms that
+       # didn't have a PIC flag, but the assumption that the effects
+       # would be equivalent was wrong.  It would break on at least
+       # Digital Unix and AIX.
+       continue
+       ;;
+
+      -thread-safe)
+       thread_safe=yes
+       continue
+       ;;
+
+      -version-info)
+       prev=vinfo
+       continue
+       ;;
+
+      -version-number)
+       prev=vinfo
+       vinfo_number=yes
+       continue
+       ;;
+
+      -weak)
+        prev=weak
+       continue
+       ;;
+
+      -Wc,*)
+       func_stripname '-Wc,' '' "$arg"
+       args=$func_stripname_result
+       arg=
+       save_ifs="$IFS"; IFS=','
+       for flag in $args; do
+         IFS="$save_ifs"
+          func_quote_for_eval "$flag"
+         func_append arg " $func_quote_for_eval_result"
+         func_append compiler_flags " $func_quote_for_eval_result"
+       done
+       IFS="$save_ifs"
+       func_stripname ' ' '' "$arg"
+       arg=$func_stripname_result
+       ;;
+
+      -Wl,*)
+       func_stripname '-Wl,' '' "$arg"
+       args=$func_stripname_result
+       arg=
+       save_ifs="$IFS"; IFS=','
+       for flag in $args; do
+         IFS="$save_ifs"
+          func_quote_for_eval "$flag"
+         func_append arg " $wl$func_quote_for_eval_result"
+         func_append compiler_flags " $wl$func_quote_for_eval_result"
+         func_append linker_flags " $func_quote_for_eval_result"
+       done
+       IFS="$save_ifs"
+       func_stripname ' ' '' "$arg"
+       arg=$func_stripname_result
+       ;;
+
+      -Xcompiler)
+       prev=xcompiler
+       continue
+       ;;
+
+      -Xlinker)
+       prev=xlinker
+       continue
+       ;;
+
+      -XCClinker)
+       prev=xcclinker
+       continue
+       ;;
+
+      # -msg_* for osf cc
+      -msg_*)
+       func_quote_for_eval "$arg"
+       arg="$func_quote_for_eval_result"
+       ;;
+
+      # Flags to be passed through unchanged, with rationale:
+      # -64, -mips[0-9]      enable 64-bit mode for the SGI compiler
+      # -r[0-9][0-9]*        specify processor for the SGI compiler
+      # -xarch=*, -xtarget=* enable 64-bit mode for the Sun compiler
+      # +DA*, +DD*           enable 64-bit mode for the HP compiler
+      # -q*                  compiler args for the IBM compiler
+      # -m*, -t[45]*, -txscale* architecture-specific flags for GCC
+      # -F/path              path to uninstalled frameworks, gcc on darwin
+      # -p, -pg, --coverage, -fprofile-*  profiling flags for GCC
+      # @file                GCC response files
+      # -tp=*                Portland pgcc target processor selection
+      # --sysroot=*          for sysroot support
+      # -O*, -flto*, -fwhopr*, -fuse-linker-plugin GCC link-time optimization
+      -64|-mips[0-9]|-r[0-9][0-9]*|-xarch=*|-xtarget=*|+DA*|+DD*|-q*|-m*| \
+      -t[45]*|-txscale*|-p|-pg|--coverage|-fprofile-*|-F*|@*|-tp=*|--sysroot=*| \
+      -O*|-flto*|-fwhopr*|-fuse-linker-plugin)
+        func_quote_for_eval "$arg"
+       arg="$func_quote_for_eval_result"
+        func_append compile_command " $arg"
+        func_append finalize_command " $arg"
+        func_append compiler_flags " $arg"
+        continue
+        ;;
+
+      # Some other compiler flag.
+      -* | +*)
+        func_quote_for_eval "$arg"
+       arg="$func_quote_for_eval_result"
+       ;;
+
+      *.$objext)
+       # A standard object.
+       func_append objs " $arg"
+       ;;
+
+      *.lo)
+       # A libtool-controlled object.
+
+       # Check to see that this really is a libtool object.
+       if func_lalib_unsafe_p "$arg"; then
+         pic_object=
+         non_pic_object=
+
+         # Read the .lo file
+         func_source "$arg"
+
+         if test -z "$pic_object" ||
+            test -z "$non_pic_object" ||
+            test "$pic_object" = none &&
+            test "$non_pic_object" = none; then
+           func_fatal_error "cannot find name of object for \`$arg'"
+         fi
+
+         # Extract subdirectory from the argument.
+         func_dirname "$arg" "/" ""
+         xdir="$func_dirname_result"
+
+         if test "$pic_object" != none; then
+           # Prepend the subdirectory the object is found in.
+           pic_object="$xdir$pic_object"
+
+           if test "$prev" = dlfiles; then
+             if test "$build_libtool_libs" = yes && test "$dlopen_support" = yes; then
+               func_append dlfiles " $pic_object"
+               prev=
+               continue
+             else
+               # If libtool objects are unsupported, then we need to preload.
+               prev=dlprefiles
+             fi
+           fi
+
+           # CHECK ME:  I think I busted this.  -Ossama
+           if test "$prev" = dlprefiles; then
+             # Preload the old-style object.
+             func_append dlprefiles " $pic_object"
+             prev=
+           fi
+
+           # A PIC object.
+           func_append libobjs " $pic_object"
+           arg="$pic_object"
+         fi
+
+         # Non-PIC object.
+         if test "$non_pic_object" != none; then
+           # Prepend the subdirectory the object is found in.
+           non_pic_object="$xdir$non_pic_object"
+
+           # A standard non-PIC object
+           func_append non_pic_objects " $non_pic_object"
+           if test -z "$pic_object" || test "$pic_object" = none ; then
+             arg="$non_pic_object"
+           fi
+         else
+           # If the PIC object exists, use it instead.
+           # $xdir was prepended to $pic_object above.
+           non_pic_object="$pic_object"
+           func_append non_pic_objects " $non_pic_object"
+         fi
+       else
+         # Only an error if not doing a dry-run.
+         if $opt_dry_run; then
+           # Extract subdirectory from the argument.
+           func_dirname "$arg" "/" ""
+           xdir="$func_dirname_result"
+
+           func_lo2o "$arg"
+           pic_object=$xdir$objdir/$func_lo2o_result
+           non_pic_object=$xdir$func_lo2o_result
+           func_append libobjs " $pic_object"
+           func_append non_pic_objects " $non_pic_object"
+         else
+           func_fatal_error "\`$arg' is not a valid libtool object"
+         fi
+       fi
+       ;;
+
+      *.$libext)
+       # An archive.
+       func_append deplibs " $arg"
+       func_append old_deplibs " $arg"
+       continue
+       ;;
+
+      *.la)
+       # A libtool-controlled library.
+
+       func_resolve_sysroot "$arg"
+       if test "$prev" = dlfiles; then
+         # This library was specified with -dlopen.
+         func_append dlfiles " $func_resolve_sysroot_result"
+         prev=
+       elif test "$prev" = dlprefiles; then
+         # The library was specified with -dlpreopen.
+         func_append dlprefiles " $func_resolve_sysroot_result"
+         prev=
+       else
+         func_append deplibs " $func_resolve_sysroot_result"
+       fi
+       continue
+       ;;
+
+      # Some other compiler argument.
+      *)
+       # Unknown arguments in both finalize_command and compile_command need
+       # to be aesthetically quoted because they are evaled later.
+       func_quote_for_eval "$arg"
+       arg="$func_quote_for_eval_result"
+       ;;
+      esac # arg
+
+      # Now actually substitute the argument into the commands.
+      if test -n "$arg"; then
+       func_append compile_command " $arg"
+       func_append finalize_command " $arg"
+      fi
+    done # argument parsing loop
+
+    test -n "$prev" && \
+      func_fatal_help "the \`$prevarg' option requires an argument"
+
+    if test "$export_dynamic" = yes && test -n "$export_dynamic_flag_spec"; then
+      eval arg=\"$export_dynamic_flag_spec\"
+      func_append compile_command " $arg"
+      func_append finalize_command " $arg"
+    fi
+
+    oldlibs=
+    # calculate the name of the file, without its directory
+    func_basename "$output"
+    outputname="$func_basename_result"
+    libobjs_save="$libobjs"
+
+    if test -n "$shlibpath_var"; then
+      # get the directories listed in $shlibpath_var
+      eval shlib_search_path=\`\$ECHO \"\${$shlibpath_var}\" \| \$SED \'s/:/ /g\'\`
+    else
+      shlib_search_path=
+    fi
+    eval sys_lib_search_path=\"$sys_lib_search_path_spec\"
+    eval sys_lib_dlsearch_path=\"$sys_lib_dlsearch_path_spec\"
+
+    func_dirname "$output" "/" ""
+    output_objdir="$func_dirname_result$objdir"
+    func_to_tool_file "$output_objdir/"
+    tool_output_objdir=$func_to_tool_file_result
+    # Create the object directory.
+    func_mkdir_p "$output_objdir"
+
+    # Determine the type of output
+    case $output in
+    "")
+      func_fatal_help "you must specify an output file"
+      ;;
+    *.$libext) linkmode=oldlib ;;
+    *.lo | *.$objext) linkmode=obj ;;
+    *.la) linkmode=lib ;;
+    *) linkmode=prog ;; # Anything else should be a program.
+    esac
+
+    specialdeplibs=
+
+    libs=
+    # Find all interdependent deplibs by searching for libraries
+    # that are linked more than once (e.g. -la -lb -la)
+    for deplib in $deplibs; do
+      if $opt_preserve_dup_deps ; then
+       case "$libs " in
+       *" $deplib "*) func_append specialdeplibs " $deplib" ;;
+       esac
+      fi
+      func_append libs " $deplib"
+    done
+
+    if test "$linkmode" = lib; then
+      libs="$predeps $libs $compiler_lib_search_path $postdeps"
+
+      # Compute libraries that are listed more than once in $predeps
+      # $postdeps and mark them as special (i.e., whose duplicates are
+      # not to be eliminated).
+      pre_post_deps=
+      if $opt_duplicate_compiler_generated_deps; then
+       for pre_post_dep in $predeps $postdeps; do
+         case "$pre_post_deps " in
+         *" $pre_post_dep "*) func_append specialdeplibs " $pre_post_deps" ;;
+         esac
+         func_append pre_post_deps " $pre_post_dep"
+       done
+      fi
+      pre_post_deps=
+    fi
+
+    deplibs=
+    newdependency_libs=
+    newlib_search_path=
+    need_relink=no # whether we're linking any uninstalled libtool libraries
+    notinst_deplibs= # not-installed libtool libraries
+    notinst_path= # paths that contain not-installed libtool libraries
+
+    case $linkmode in
+    lib)
+       passes="conv dlpreopen link"
+       for file in $dlfiles $dlprefiles; do
+         case $file in
+         *.la) ;;
+         *)
+           func_fatal_help "libraries can \`-dlopen' only libtool libraries: $file"
+           ;;
+         esac
+       done
+       ;;
+    prog)
+       compile_deplibs=
+       finalize_deplibs=
+       alldeplibs=no
+       newdlfiles=
+       newdlprefiles=
+       passes="conv scan dlopen dlpreopen link"
+       ;;
+    *)  passes="conv"
+       ;;
+    esac
+
+    for pass in $passes; do
+      # The preopen pass in lib mode reverses $deplibs; put it back here
+      # so that -L comes before libs that need it for instance...
+      if test "$linkmode,$pass" = "lib,link"; then
+       ## FIXME: Find the place where the list is rebuilt in the wrong
+       ##        order, and fix it there properly
+        tmp_deplibs=
+       for deplib in $deplibs; do
+         tmp_deplibs="$deplib $tmp_deplibs"
+       done
+       deplibs="$tmp_deplibs"
+      fi
+
+      if test "$linkmode,$pass" = "lib,link" ||
+        test "$linkmode,$pass" = "prog,scan"; then
+       libs="$deplibs"
+       deplibs=
+      fi
+      if test "$linkmode" = prog; then
+       case $pass in
+       dlopen) libs="$dlfiles" ;;
+       dlpreopen) libs="$dlprefiles" ;;
+       link)
+         libs="$deplibs %DEPLIBS%"
+         test "X$link_all_deplibs" != Xno && libs="$libs $dependency_libs"
+         ;;
+       esac
+      fi
+      if test "$linkmode,$pass" = "lib,dlpreopen"; then
+       # Collect and forward deplibs of preopened libtool libs
+       for lib in $dlprefiles; do
+         # Ignore non-libtool-libs
+         dependency_libs=
+         func_resolve_sysroot "$lib"
+         case $lib in
+         *.la) func_source "$func_resolve_sysroot_result" ;;
+         esac
+
+         # Collect preopened libtool deplibs, except any this library
+         # has declared as weak libs
+         for deplib in $dependency_libs; do
+           func_basename "$deplib"
+            deplib_base=$func_basename_result
+           case " $weak_libs " in
+           *" $deplib_base "*) ;;
+           *) func_append deplibs " $deplib" ;;
+           esac
+         done
+       done
+       libs="$dlprefiles"
+      fi
+      if test "$pass" = dlopen; then
+       # Collect dlpreopened libraries
+       save_deplibs="$deplibs"
+       deplibs=
+      fi
+
+      for deplib in $libs; do
+       lib=
+       found=no
+       case $deplib in
+       -mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe \
+        |-threads|-fopenmp|-openmp|-mp|-xopenmp|-omp|-qsmp=*)
+         if test "$linkmode,$pass" = "prog,link"; then
+           compile_deplibs="$deplib $compile_deplibs"
+           finalize_deplibs="$deplib $finalize_deplibs"
+         else
+           func_append compiler_flags " $deplib"
+           if test "$linkmode" = lib ; then
+               case "$new_inherited_linker_flags " in
+                   *" $deplib "*) ;;
+                   * ) func_append new_inherited_linker_flags " $deplib" ;;
+               esac
+           fi
+         fi
+         continue
+         ;;
+       -l*)
+         if test "$linkmode" != lib && test "$linkmode" != prog; then
+           func_warning "\`-l' is ignored for archives/objects"
+           continue
+         fi
+         func_stripname '-l' '' "$deplib"
+         name=$func_stripname_result
+         if test "$linkmode" = lib; then
+           searchdirs="$newlib_search_path $lib_search_path $compiler_lib_search_dirs $sys_lib_search_path $shlib_search_path"
+         else
+           searchdirs="$newlib_search_path $lib_search_path $sys_lib_search_path $shlib_search_path"
+         fi
+         for searchdir in $searchdirs; do
+           for search_ext in .la $std_shrext .so .a; do
+             # Search the libtool library
+             lib="$searchdir/lib${name}${search_ext}"
+             if test -f "$lib"; then
+               if test "$search_ext" = ".la"; then
+                 found=yes
+               else
+                 found=no
+               fi
+               break 2
+             fi
+           done
+         done
+         if test "$found" != yes; then
+           # deplib doesn't seem to be a libtool library
+           if test "$linkmode,$pass" = "prog,link"; then
+             compile_deplibs="$deplib $compile_deplibs"
+             finalize_deplibs="$deplib $finalize_deplibs"
+           else
+             deplibs="$deplib $deplibs"
+             test "$linkmode" = lib && newdependency_libs="$deplib $newdependency_libs"
+           fi
+           continue
+         else # deplib is a libtool library
+           # If $allow_libtool_libs_with_static_runtimes && $deplib is a stdlib,
+           # We need to do some special things here, and not later.
+           if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then
+             case " $predeps $postdeps " in
+             *" $deplib "*)
+               if func_lalib_p "$lib"; then
+                 library_names=
+                 old_library=
+                 func_source "$lib"
+                 for l in $old_library $library_names; do
+                   ll="$l"
+                 done
+                 if test "X$ll" = "X$old_library" ; then # only static version available
+                   found=no
+                   func_dirname "$lib" "" "."
+                   ladir="$func_dirname_result"
+                   lib=$ladir/$old_library
+                   if test "$linkmode,$pass" = "prog,link"; then
+                     compile_deplibs="$deplib $compile_deplibs"
+                     finalize_deplibs="$deplib $finalize_deplibs"
+                   else
+                     deplibs="$deplib $deplibs"
+                     test "$linkmode" = lib && newdependency_libs="$deplib $newdependency_libs"
+                   fi
+                   continue
+                 fi
+               fi
+               ;;
+             *) ;;
+             esac
+           fi
+         fi
+         ;; # -l
+       *.ltframework)
+         if test "$linkmode,$pass" = "prog,link"; then
+           compile_deplibs="$deplib $compile_deplibs"
+           finalize_deplibs="$deplib $finalize_deplibs"
+         else
+           deplibs="$deplib $deplibs"
+           if test "$linkmode" = lib ; then
+               case "$new_inherited_linker_flags " in
+                   *" $deplib "*) ;;
+                   * ) func_append new_inherited_linker_flags " $deplib" ;;
+               esac
+           fi
+         fi
+         continue
+         ;;
+       -L*)
+         case $linkmode in
+         lib)
+           deplibs="$deplib $deplibs"
+           test "$pass" = conv && continue
+           newdependency_libs="$deplib $newdependency_libs"
+           func_stripname '-L' '' "$deplib"
+           func_resolve_sysroot "$func_stripname_result"
+           func_append newlib_search_path " $func_resolve_sysroot_result"
+           ;;
+         prog)
+           if test "$pass" = conv; then
+             deplibs="$deplib $deplibs"
+             continue
+           fi
+           if test "$pass" = scan; then
+             deplibs="$deplib $deplibs"
+           else
+             compile_deplibs="$deplib $compile_deplibs"
+             finalize_deplibs="$deplib $finalize_deplibs"
+           fi
+           func_stripname '-L' '' "$deplib"
+           func_resolve_sysroot "$func_stripname_result"
+           func_append newlib_search_path " $func_resolve_sysroot_result"
+           ;;
+         *)
+           func_warning "\`-L' is ignored for archives/objects"
+           ;;
+         esac # linkmode
+         continue
+         ;; # -L
+       -R*)
+         if test "$pass" = link; then
+           func_stripname '-R' '' "$deplib"
+           func_resolve_sysroot "$func_stripname_result"
+           dir=$func_resolve_sysroot_result
+           # Make sure the xrpath contains only unique directories.
+           case "$xrpath " in
+           *" $dir "*) ;;
+           *) func_append xrpath " $dir" ;;
+           esac
+         fi
+         deplibs="$deplib $deplibs"
+         continue
+         ;;
+       *.la)
+         func_resolve_sysroot "$deplib"
+         lib=$func_resolve_sysroot_result
+         ;;
+       *.$libext)
+         if test "$pass" = conv; then
+           deplibs="$deplib $deplibs"
+           continue
+         fi
+         case $linkmode in
+         lib)
+           # Linking convenience modules into shared libraries is allowed,
+           # but linking other static libraries is non-portable.
+           case " $dlpreconveniencelibs " in
+           *" $deplib "*) ;;
+           *)
+             valid_a_lib=no
+             case $deplibs_check_method in
+               match_pattern*)
+                 set dummy $deplibs_check_method; shift
+                 match_pattern_regex=`expr "$deplibs_check_method" : "$1 \(.*\)"`
+                 if eval "\$ECHO \"$deplib\"" 2>/dev/null | $SED 10q \
+                   | $EGREP "$match_pattern_regex" > /dev/null; then
+                   valid_a_lib=yes
+                 fi
+               ;;
+               pass_all)
+                 valid_a_lib=yes
+               ;;
+             esac
+             if test "$valid_a_lib" != yes; then
+               echo
+               $ECHO "*** Warning: Trying to link with static lib archive $deplib."
+               echo "*** I have the capability to make that library automatically link in when"
+               echo "*** you link to this library.  But I can only do this if you have a"
+               echo "*** shared version of the library, which you do not appear to have"
+               echo "*** because the file extensions .$libext of this argument makes me believe"
+               echo "*** that it is just a static archive that I should not use here."
+             else
+               echo
+               $ECHO "*** Warning: Linking the shared library $output against the"
+               $ECHO "*** static library $deplib is not portable!"
+               deplibs="$deplib $deplibs"
+             fi
+             ;;
+           esac
+           continue
+           ;;
+         prog)
+           if test "$pass" != link; then
+             deplibs="$deplib $deplibs"
+           else
+             compile_deplibs="$deplib $compile_deplibs"
+             finalize_deplibs="$deplib $finalize_deplibs"
+           fi
+           continue
+           ;;
+         esac # linkmode
+         ;; # *.$libext
+       *.lo | *.$objext)
+         if test "$pass" = conv; then
+           deplibs="$deplib $deplibs"
+         elif test "$linkmode" = prog; then
+           if test "$pass" = dlpreopen || test "$dlopen_support" != yes || test "$build_libtool_libs" = no; then
+             # If there is no dlopen support or we're linking statically,
+             # we need to preload.
+             func_append newdlprefiles " $deplib"
+             compile_deplibs="$deplib $compile_deplibs"
+             finalize_deplibs="$deplib $finalize_deplibs"
+           else
+             func_append newdlfiles " $deplib"
+           fi
+         fi
+         continue
+         ;;
+       %DEPLIBS%)
+         alldeplibs=yes
+         continue
+         ;;
+       esac # case $deplib
+
+       if test "$found" = yes || test -f "$lib"; then :
+       else
+         func_fatal_error "cannot find the library \`$lib' or unhandled argument \`$deplib'"
+       fi
+
+       # Check to see that this really is a libtool archive.
+       func_lalib_unsafe_p "$lib" \
+         || func_fatal_error "\`$lib' is not a valid libtool archive"
+
+       func_dirname "$lib" "" "."
+       ladir="$func_dirname_result"
+
+       dlname=
+       dlopen=
+       dlpreopen=
+       libdir=
+       library_names=
+       old_library=
+       inherited_linker_flags=
+       # If the library was installed with an old release of libtool,
+       # it will not redefine variables installed, or shouldnotlink
+       installed=yes
+       shouldnotlink=no
+       avoidtemprpath=
+
+
+       # Read the .la file
+       func_source "$lib"
+
+       # Convert "-framework foo" to "foo.ltframework"
+       if test -n "$inherited_linker_flags"; then
+         tmp_inherited_linker_flags=`$ECHO "$inherited_linker_flags" | $SED 's/-framework \([^ $]*\)/\1.ltframework/g'`
+         for tmp_inherited_linker_flag in $tmp_inherited_linker_flags; do
+           case " $new_inherited_linker_flags " in
+             *" $tmp_inherited_linker_flag "*) ;;
+             *) func_append new_inherited_linker_flags " $tmp_inherited_linker_flag";;
+           esac
+         done
+       fi
+       dependency_libs=`$ECHO " $dependency_libs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'`
+       if test "$linkmode,$pass" = "lib,link" ||
+          test "$linkmode,$pass" = "prog,scan" ||
+          { test "$linkmode" != prog && test "$linkmode" != lib; }; then
+         test -n "$dlopen" && func_append dlfiles " $dlopen"
+         test -n "$dlpreopen" && func_append dlprefiles " $dlpreopen"
+       fi
+
+       if test "$pass" = conv; then
+         # Only check for convenience libraries
+         deplibs="$lib $deplibs"
+         if test -z "$libdir"; then
+           if test -z "$old_library"; then
+             func_fatal_error "cannot find name of link library for \`$lib'"
+           fi
+           # It is a libtool convenience library, so add in its objects.
+           func_append convenience " $ladir/$objdir/$old_library"
+           func_append old_convenience " $ladir/$objdir/$old_library"
+           tmp_libs=
+           for deplib in $dependency_libs; do
+             deplibs="$deplib $deplibs"
+             if $opt_preserve_dup_deps ; then
+               case "$tmp_libs " in
+               *" $deplib "*) func_append specialdeplibs " $deplib" ;;
+               esac
+             fi
+             func_append tmp_libs " $deplib"
+           done
+         elif test "$linkmode" != prog && test "$linkmode" != lib; then
+           func_fatal_error "\`$lib' is not a convenience library"
+         fi
+         continue
+       fi # $pass = conv
+
+
+       # Get the name of the library we link against.
+       linklib=
+       if test -n "$old_library" &&
+          { test "$prefer_static_libs" = yes ||
+            test "$prefer_static_libs,$installed" = "built,no"; }; then
+         linklib=$old_library
+       else
+         for l in $old_library $library_names; do
+           linklib="$l"
+         done
+       fi
+       if test -z "$linklib"; then
+         func_fatal_error "cannot find name of link library for \`$lib'"
+       fi
+
+       # This library was specified with -dlopen.
+       if test "$pass" = dlopen; then
+         if test -z "$libdir"; then
+           func_fatal_error "cannot -dlopen a convenience library: \`$lib'"
+         fi
+         if test -z "$dlname" ||
+            test "$dlopen_support" != yes ||
+            test "$build_libtool_libs" = no; then
+           # If there is no dlname, no dlopen support or we're linking
+           # statically, we need to preload.  We also need to preload any
+           # dependent libraries so libltdl's deplib preloader doesn't
+           # bomb out in the load deplibs phase.
+           func_append dlprefiles " $lib $dependency_libs"
+         else
+           func_append newdlfiles " $lib"
+         fi
+         continue
+       fi # $pass = dlopen
+
+       # We need an absolute path.
+       case $ladir in
+       [\\/]* | [A-Za-z]:[\\/]*) abs_ladir="$ladir" ;;
+       *)
+         abs_ladir=`cd "$ladir" && pwd`
+         if test -z "$abs_ladir"; then
+           func_warning "cannot determine absolute directory name of \`$ladir'"
+           func_warning "passing it literally to the linker, although it might fail"
+           abs_ladir="$ladir"
+         fi
+         ;;
+       esac
+       func_basename "$lib"
+       laname="$func_basename_result"
+
+       # Find the relevant object directory and library name.
+       if test "X$installed" = Xyes; then
+         if test ! -f "$lt_sysroot$libdir/$linklib" && test -f "$abs_ladir/$linklib"; then
+           func_warning "library \`$lib' was moved."
+           dir="$ladir"
+           absdir="$abs_ladir"
+           libdir="$abs_ladir"
+         else
+           dir="$lt_sysroot$libdir"
+           absdir="$lt_sysroot$libdir"
+         fi
+         test "X$hardcode_automatic" = Xyes && avoidtemprpath=yes
+       else
+         if test ! -f "$ladir/$objdir/$linklib" && test -f "$abs_ladir/$linklib"; then
+           dir="$ladir"
+           absdir="$abs_ladir"
+           # Remove this search path later
+           func_append notinst_path " $abs_ladir"
+         else
+           dir="$ladir/$objdir"
+           absdir="$abs_ladir/$objdir"
+           # Remove this search path later
+           func_append notinst_path " $abs_ladir"
+         fi
+       fi # $installed = yes
+       func_stripname 'lib' '.la' "$laname"
+       name=$func_stripname_result
+
+       # This library was specified with -dlpreopen.
+       if test "$pass" = dlpreopen; then
+         if test -z "$libdir" && test "$linkmode" = prog; then
+           func_fatal_error "only libraries may -dlpreopen a convenience library: \`$lib'"
+         fi
+         case "$host" in
+           # special handling for platforms with PE-DLLs.
+           *cygwin* | *mingw* | *cegcc* )
+             # Linker will automatically link against shared library if both
+             # static and shared are present.  Therefore, ensure we extract
+             # symbols from the import library if a shared library is present
+             # (otherwise, the dlopen module name will be incorrect).  We do
+             # this by putting the import library name into $newdlprefiles.
+             # We recover the dlopen module name by 'saving' the la file
+             # name in a special purpose variable, and (later) extracting the
+             # dlname from the la file.
+             if test -n "$dlname"; then
+               func_tr_sh "$dir/$linklib"
+               eval "libfile_$func_tr_sh_result=\$abs_ladir/\$laname"
+               func_append newdlprefiles " $dir/$linklib"
+             else
+               func_append newdlprefiles " $dir/$old_library"
+               # Keep a list of preopened convenience libraries to check
+               # that they are being used correctly in the link pass.
+               test -z "$libdir" && \
+                 func_append dlpreconveniencelibs " $dir/$old_library"
+             fi
+           ;;
+           * )
+             # Prefer using a static library (so that no silly _DYNAMIC symbols
+             # are required to link).
+             if test -n "$old_library"; then
+               func_append newdlprefiles " $dir/$old_library"
+               # Keep a list of preopened convenience libraries to check
+               # that they are being used correctly in the link pass.
+               test -z "$libdir" && \
+                 func_append dlpreconveniencelibs " $dir/$old_library"
+             # Otherwise, use the dlname, so that lt_dlopen finds it.
+             elif test -n "$dlname"; then
+               func_append newdlprefiles " $dir/$dlname"
+             else
+               func_append newdlprefiles " $dir/$linklib"
+             fi
+           ;;
+         esac
+       fi # $pass = dlpreopen
+
+       if test -z "$libdir"; then
+         # Link the convenience library
+         if test "$linkmode" = lib; then
+           deplibs="$dir/$old_library $deplibs"
+         elif test "$linkmode,$pass" = "prog,link"; then
+           compile_deplibs="$dir/$old_library $compile_deplibs"
+           finalize_deplibs="$dir/$old_library $finalize_deplibs"
+         else
+           deplibs="$lib $deplibs" # used for prog,scan pass
+         fi
+         continue
+       fi
+
+
+       if test "$linkmode" = prog && test "$pass" != link; then
+         func_append newlib_search_path " $ladir"
+         deplibs="$lib $deplibs"
+
+         linkalldeplibs=no
+         if test "$link_all_deplibs" != no || test -z "$library_names" ||
+            test "$build_libtool_libs" = no; then
+           linkalldeplibs=yes
+         fi
+
+         tmp_libs=
+         for deplib in $dependency_libs; do
+           case $deplib in
+           -L*) func_stripname '-L' '' "$deplib"
+                func_resolve_sysroot "$func_stripname_result"
+                func_append newlib_search_path " $func_resolve_sysroot_result"
+                ;;
+           esac
+           # Need to link against all dependency_libs?
+           if test "$linkalldeplibs" = yes; then
+             deplibs="$deplib $deplibs"
+           else
+             # Need to hardcode shared library paths
+             # or/and link against static libraries
+             newdependency_libs="$deplib $newdependency_libs"
+           fi
+           if $opt_preserve_dup_deps ; then
+             case "$tmp_libs " in
+             *" $deplib "*) func_append specialdeplibs " $deplib" ;;
+             esac
+           fi
+           func_append tmp_libs " $deplib"
+         done # for deplib
+         continue
+       fi # $linkmode = prog...
+
+       if test "$linkmode,$pass" = "prog,link"; then
+         if test -n "$library_names" &&
+            { { test "$prefer_static_libs" = no ||
+                test "$prefer_static_libs,$installed" = "built,yes"; } ||
+              test -z "$old_library"; }; then
+           # We need to hardcode the library path
+           if test -n "$shlibpath_var" && test -z "$avoidtemprpath" ; then
+             # Make sure the rpath contains only unique directories.
+             case "$temp_rpath:" in
+             *"$absdir:"*) ;;
+             *) func_append temp_rpath "$absdir:" ;;
+             esac
+           fi
+
+           # Hardcode the library path.
+           # Skip directories that are in the system default run-time
+           # search path.
+           case " $sys_lib_dlsearch_path " in
+           *" $absdir "*) ;;
+           *)
+             case "$compile_rpath " in
+             *" $absdir "*) ;;
+             *) func_append compile_rpath " $absdir" ;;
+             esac
+             ;;
+           esac
+           case " $sys_lib_dlsearch_path " in
+           *" $libdir "*) ;;
+           *)
+             case "$finalize_rpath " in
+             *" $libdir "*) ;;
+             *) func_append finalize_rpath " $libdir" ;;
+             esac
+             ;;
+           esac
+         fi # $linkmode,$pass = prog,link...
+
+         if test "$alldeplibs" = yes &&
+            { test "$deplibs_check_method" = pass_all ||
+              { test "$build_libtool_libs" = yes &&
+                test -n "$library_names"; }; }; then
+           # We only need to search for static libraries
+           continue
+         fi
+       fi
+
+       link_static=no # Whether the deplib will be linked statically
+       use_static_libs=$prefer_static_libs
+       if test "$use_static_libs" = built && test "$installed" = yes; then
+         use_static_libs=no
+       fi
+       if test -n "$library_names" &&
+          { test "$use_static_libs" = no || test -z "$old_library"; }; then
+         case $host in
+         *cygwin* | *mingw* | *cegcc*)
+             # No point in relinking DLLs because paths are not encoded
+             func_append notinst_deplibs " $lib"
+             need_relink=no
+           ;;
+         *)
+           if test "$installed" = no; then
+             func_append notinst_deplibs " $lib"
+             need_relink=yes
+           fi
+           ;;
+         esac
+         # This is a shared library
+
+         # Warn about portability, can't link against -module's on some
+         # systems (darwin).  Don't bleat about dlopened modules though!
+         dlopenmodule=""
+         for dlpremoduletest in $dlprefiles; do
+           if test "X$dlpremoduletest" = "X$lib"; then
+             dlopenmodule="$dlpremoduletest"
+             break
+           fi
+         done
+         if test -z "$dlopenmodule" && test "$shouldnotlink" = yes && test "$pass" = link; then
+           echo
+           if test "$linkmode" = prog; then
+             $ECHO "*** Warning: Linking the executable $output against the loadable module"
+           else
+             $ECHO "*** Warning: Linking the shared library $output against the loadable module"
+           fi
+           $ECHO "*** $linklib is not portable!"
+         fi
+         if test "$linkmode" = lib &&
+            test "$hardcode_into_libs" = yes; then
+           # Hardcode the library path.
+           # Skip directories that are in the system default run-time
+           # search path.
+           case " $sys_lib_dlsearch_path " in
+           *" $absdir "*) ;;
+           *)
+             case "$compile_rpath " in
+             *" $absdir "*) ;;
+             *) func_append compile_rpath " $absdir" ;;
+             esac
+             ;;
+           esac
+           case " $sys_lib_dlsearch_path " in
+           *" $libdir "*) ;;
+           *)
+             case "$finalize_rpath " in
+             *" $libdir "*) ;;
+             *) func_append finalize_rpath " $libdir" ;;
+             esac
+             ;;
+           esac
+         fi
+
+         if test -n "$old_archive_from_expsyms_cmds"; then
+           # figure out the soname
+           set dummy $library_names
+           shift
+           realname="$1"
+           shift
+           libname=`eval "\\$ECHO \"$libname_spec\""`
+           # use dlname if we got it. it's perfectly good, no?
+           if test -n "$dlname"; then
+             soname="$dlname"
+           elif test -n "$soname_spec"; then
+             # bleh windows
+             case $host in
+             *cygwin* | mingw* | *cegcc*)
+               func_arith $current - $age
+               major=$func_arith_result
+               versuffix="-$major"
+               ;;
+             esac
+             eval soname=\"$soname_spec\"
+           else
+             soname="$realname"
+           fi
+
+           # Make a new name for the extract_expsyms_cmds to use
+           soroot="$soname"
+           func_basename "$soroot"
+           soname="$func_basename_result"
+           func_stripname 'lib' '.dll' "$soname"
+           newlib=libimp-$func_stripname_result.a
+
+           # If the library has no export list, then create one now
+           if test -f "$output_objdir/$soname-def"; then :
+           else
+             func_verbose "extracting exported symbol list from \`$soname'"
+             func_execute_cmds "$extract_expsyms_cmds" 'exit $?'
+           fi
+
+           # Create $newlib
+           if test -f "$output_objdir/$newlib"; then :; else
+             func_verbose "generating import library for \`$soname'"
+             func_execute_cmds "$old_archive_from_expsyms_cmds" 'exit $?'
+           fi
+           # make sure the library variables are pointing to the new library
+           dir=$output_objdir
+           linklib=$newlib
+         fi # test -n "$old_archive_from_expsyms_cmds"
+
+         if test "$linkmode" = prog || test "$opt_mode" != relink; then
+           add_shlibpath=
+           add_dir=
+           add=
+           lib_linked=yes
+           case $hardcode_action in
+           immediate | unsupported)
+             if test "$hardcode_direct" = no; then
+               add="$dir/$linklib"
+               case $host in
+                 *-*-sco3.2v5.0.[024]*) add_dir="-L$dir" ;;
+                 *-*-sysv4*uw2*) add_dir="-L$dir" ;;
+                 *-*-sysv5OpenUNIX* | *-*-sysv5UnixWare7.[01].[10]* | \
+                   *-*-unixware7*) add_dir="-L$dir" ;;
+                 *-*-darwin* )
+                   # if the lib is a (non-dlopened) module then we can not
+                   # link against it, someone is ignoring the earlier warnings
+                   if /usr/bin/file -L $add 2> /dev/null |
+                        $GREP ": [^:]* bundle" >/dev/null ; then
+                     if test "X$dlopenmodule" != "X$lib"; then
+                       $ECHO "*** Warning: lib $linklib is a module, not a shared library"
+                       if test -z "$old_library" ; then
+                         echo
+                         echo "*** And there doesn't seem to be a static archive available"
+                         echo "*** The link will probably fail, sorry"
+                       else
+                         add="$dir/$old_library"
+                       fi
+                     elif test -n "$old_library"; then
+                       add="$dir/$old_library"
+                     fi
+                   fi
+               esac
+             elif test "$hardcode_minus_L" = no; then
+               case $host in
+               *-*-sunos*) add_shlibpath="$dir" ;;
+               esac
+               add_dir="-L$dir"
+               add="-l$name"
+             elif test "$hardcode_shlibpath_var" = no; then
+               add_shlibpath="$dir"
+               add="-l$name"
+             else
+               lib_linked=no
+             fi
+             ;;
+           relink)
+             if test "$hardcode_direct" = yes &&
+                test "$hardcode_direct_absolute" = no; then
+               add="$dir/$linklib"
+             elif test "$hardcode_minus_L" = yes; then
+               add_dir="-L$absdir"
+               # Try looking first in the location we're being installed to.
+               if test -n "$inst_prefix_dir"; then
+                 case $libdir in
+                   [\\/]*)
+                     func_append add_dir " -L$inst_prefix_dir$libdir"
+                     ;;
+                 esac
+               fi
+               add="-l$name"
+             elif test "$hardcode_shlibpath_var" = yes; then
+               add_shlibpath="$dir"
+               add="-l$name"
+             else
+               lib_linked=no
+             fi
+             ;;
+           *) lib_linked=no ;;
+           esac
+
+           if test "$lib_linked" != yes; then
+             func_fatal_configuration "unsupported hardcode properties"
+           fi
+
+           if test -n "$add_shlibpath"; then
+             case :$compile_shlibpath: in
+             *":$add_shlibpath:"*) ;;
+             *) func_append compile_shlibpath "$add_shlibpath:" ;;
+             esac
+           fi
+           if test "$linkmode" = prog; then
+             test -n "$add_dir" && compile_deplibs="$add_dir $compile_deplibs"
+             test -n "$add" && compile_deplibs="$add $compile_deplibs"
+           else
+             test -n "$add_dir" && deplibs="$add_dir $deplibs"
+             test -n "$add" && deplibs="$add $deplibs"
+             if test "$hardcode_direct" != yes &&
+                test "$hardcode_minus_L" != yes &&
+                test "$hardcode_shlibpath_var" = yes; then
+               case :$finalize_shlibpath: in
+               *":$libdir:"*) ;;
+               *) func_append finalize_shlibpath "$libdir:" ;;
+               esac
+             fi
+           fi
+         fi
+
+         if test "$linkmode" = prog || test "$opt_mode" = relink; then
+           add_shlibpath=
+           add_dir=
+           add=
+           # Finalize command for both is simple: just hardcode it.
+           if test "$hardcode_direct" = yes &&
+              test "$hardcode_direct_absolute" = no; then
+             add="$libdir/$linklib"
+           elif test "$hardcode_minus_L" = yes; then
+             add_dir="-L$libdir"
+             add="-l$name"
+           elif test "$hardcode_shlibpath_var" = yes; then
+             case :$finalize_shlibpath: in
+             *":$libdir:"*) ;;
+             *) func_append finalize_shlibpath "$libdir:" ;;
+             esac
+             add="-l$name"
+           elif test "$hardcode_automatic" = yes; then
+             if test -n "$inst_prefix_dir" &&
+                test -f "$inst_prefix_dir$libdir/$linklib" ; then
+               add="$inst_prefix_dir$libdir/$linklib"
+             else
+               add="$libdir/$linklib"
+             fi
+           else
+             # We cannot seem to hardcode it, guess we'll fake it.
+             add_dir="-L$libdir"
+             # Try looking first in the location we're being installed to.
+             if test -n "$inst_prefix_dir"; then
+               case $libdir in
+                 [\\/]*)
+                   func_append add_dir " -L$inst_prefix_dir$libdir"
+                   ;;
+               esac
+             fi
+             add="-l$name"
+           fi
+
+           if test "$linkmode" = prog; then
+             test -n "$add_dir" && finalize_deplibs="$add_dir $finalize_deplibs"
+             test -n "$add" && finalize_deplibs="$add $finalize_deplibs"
+           else
+             test -n "$add_dir" && deplibs="$add_dir $deplibs"
+             test -n "$add" && deplibs="$add $deplibs"
+           fi
+         fi
+       elif test "$linkmode" = prog; then
+         # Here we assume that one of hardcode_direct or hardcode_minus_L
+         # is not unsupported.  This is valid on all known static and
+         # shared platforms.
+         if test "$hardcode_direct" != unsupported; then
+           test -n "$old_library" && linklib="$old_library"
+           compile_deplibs="$dir/$linklib $compile_deplibs"
+           finalize_deplibs="$dir/$linklib $finalize_deplibs"
+         else
+           compile_deplibs="-l$name -L$dir $compile_deplibs"
+           finalize_deplibs="-l$name -L$dir $finalize_deplibs"
+         fi
+       elif test "$build_libtool_libs" = yes; then
+         # Not a shared library
+         if test "$deplibs_check_method" != pass_all; then
+           # We're trying link a shared library against a static one
+           # but the system doesn't support it.
+
+           # Just print a warning and add the library to dependency_libs so
+           # that the program can be linked against the static library.
+           echo
+           $ECHO "*** Warning: This system can not link to static lib archive $lib."
+           echo "*** I have the capability to make that library automatically link in when"
+           echo "*** you link to this library.  But I can only do this if you have a"
+           echo "*** shared version of the library, which you do not appear to have."
+           if test "$module" = yes; then
+             echo "*** But as you try to build a module library, libtool will still create "
+             echo "*** a static module, that should work as long as the dlopening application"
+             echo "*** is linked with the -dlopen flag to resolve symbols at runtime."
+             if test -z "$global_symbol_pipe"; then
+               echo
+               echo "*** However, this would only work if libtool was able to extract symbol"
+               echo "*** lists from a program, using \`nm' or equivalent, but libtool could"
+               echo "*** not find such a program.  So, this module is probably useless."
+               echo "*** \`nm' from GNU binutils and a full rebuild may help."
+             fi
+             if test "$build_old_libs" = no; then
+               build_libtool_libs=module
+               build_old_libs=yes
+             else
+               build_libtool_libs=no
+             fi
+           fi
+         else
+           deplibs="$dir/$old_library $deplibs"
+           link_static=yes
+         fi
+       fi # link shared/static library?
+
+       if test "$linkmode" = lib; then
+         if test -n "$dependency_libs" &&
+            { test "$hardcode_into_libs" != yes ||
+              test "$build_old_libs" = yes ||
+              test "$link_static" = yes; }; then
+           # Extract -R from dependency_libs
+           temp_deplibs=
+           for libdir in $dependency_libs; do
+             case $libdir in
+             -R*) func_stripname '-R' '' "$libdir"
+                  temp_xrpath=$func_stripname_result
+                  case " $xrpath " in
+                  *" $temp_xrpath "*) ;;
+                  *) func_append xrpath " $temp_xrpath";;
+                  esac;;
+             *) func_append temp_deplibs " $libdir";;
+             esac
+           done
+           dependency_libs="$temp_deplibs"
+         fi
+
+         func_append newlib_search_path " $absdir"
+         # Link against this library
+         test "$link_static" = no && newdependency_libs="$abs_ladir/$laname $newdependency_libs"
+         # ... and its dependency_libs
+         tmp_libs=
+         for deplib in $dependency_libs; do
+           newdependency_libs="$deplib $newdependency_libs"
+           case $deplib in
+              -L*) func_stripname '-L' '' "$deplib"
+                   func_resolve_sysroot "$func_stripname_result";;
+              *) func_resolve_sysroot "$deplib" ;;
+            esac
+           if $opt_preserve_dup_deps ; then
+             case "$tmp_libs " in
+             *" $func_resolve_sysroot_result "*)
+                func_append specialdeplibs " $func_resolve_sysroot_result" ;;
+             esac
+           fi
+           func_append tmp_libs " $func_resolve_sysroot_result"
+         done
+
+         if test "$link_all_deplibs" != no; then
+           # Add the search paths of all dependency libraries
+           for deplib in $dependency_libs; do
+             path=
+             case $deplib in
+             -L*) path="$deplib" ;;
+             *.la)
+               func_resolve_sysroot "$deplib"
+               deplib=$func_resolve_sysroot_result
+               func_dirname "$deplib" "" "."
+               dir=$func_dirname_result
+               # We need an absolute path.
+               case $dir in
+               [\\/]* | [A-Za-z]:[\\/]*) absdir="$dir" ;;
+               *)
+                 absdir=`cd "$dir" && pwd`
+                 if test -z "$absdir"; then
+                   func_warning "cannot determine absolute directory name of \`$dir'"
+                   absdir="$dir"
+                 fi
+                 ;;
+               esac
+               if $GREP "^installed=no" $deplib > /dev/null; then
+               case $host in
+               *-*-darwin*)
+                 depdepl=
+                 eval deplibrary_names=`${SED} -n -e 's/^library_names=\(.*\)$/\1/p' $deplib`
+                 if test -n "$deplibrary_names" ; then
+                   for tmp in $deplibrary_names ; do
+                     depdepl=$tmp
+                   done
+                   if test -f "$absdir/$objdir/$depdepl" ; then
+                     depdepl="$absdir/$objdir/$depdepl"
+                     darwin_install_name=`${OTOOL} -L $depdepl | awk '{if (NR == 2) {print $1;exit}}'`
+                      if test -z "$darwin_install_name"; then
+                          darwin_install_name=`${OTOOL64} -L $depdepl  | awk '{if (NR == 2) {print $1;exit}}'`
+                      fi
+                     func_append compiler_flags " ${wl}-dylib_file ${wl}${darwin_install_name}:${depdepl}"
+                     func_append linker_flags " -dylib_file ${darwin_install_name}:${depdepl}"
+                     path=
+                   fi
+                 fi
+                 ;;
+               *)
+                 path="-L$absdir/$objdir"
+                 ;;
+               esac
+               else
+                 eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $deplib`
+                 test -z "$libdir" && \
+                   func_fatal_error "\`$deplib' is not a valid libtool archive"
+                 test "$absdir" != "$libdir" && \
+                   func_warning "\`$deplib' seems to be moved"
+
+                 path="-L$absdir"
+               fi
+               ;;
+             esac
+             case " $deplibs " in
+             *" $path "*) ;;
+             *) deplibs="$path $deplibs" ;;
+             esac
+           done
+         fi # link_all_deplibs != no
+       fi # linkmode = lib
+      done # for deplib in $libs
+      if test "$pass" = link; then
+       if test "$linkmode" = "prog"; then
+         compile_deplibs="$new_inherited_linker_flags $compile_deplibs"
+         finalize_deplibs="$new_inherited_linker_flags $finalize_deplibs"
+       else
+         compiler_flags="$compiler_flags "`$ECHO " $new_inherited_linker_flags" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'`
+       fi
+      fi
+      dependency_libs="$newdependency_libs"
+      if test "$pass" = dlpreopen; then
+       # Link the dlpreopened libraries before other libraries
+       for deplib in $save_deplibs; do
+         deplibs="$deplib $deplibs"
+       done
+      fi
+      if test "$pass" != dlopen; then
+       if test "$pass" != conv; then
+         # Make sure lib_search_path contains only unique directories.
+         lib_search_path=
+         for dir in $newlib_search_path; do
+           case "$lib_search_path " in
+           *" $dir "*) ;;
+           *) func_append lib_search_path " $dir" ;;
+           esac
+         done
+         newlib_search_path=
+       fi
+
+       if test "$linkmode,$pass" != "prog,link"; then
+         vars="deplibs"
+       else
+         vars="compile_deplibs finalize_deplibs"
+       fi
+       for var in $vars dependency_libs; do
+         # Add libraries to $var in reverse order
+         eval tmp_libs=\"\$$var\"
+         new_libs=
+         for deplib in $tmp_libs; do
+           # FIXME: Pedantically, this is the right thing to do, so
+           #        that some nasty dependency loop isn't accidentally
+           #        broken:
+           #new_libs="$deplib $new_libs"
+           # Pragmatically, this seems to cause very few problems in
+           # practice:
+           case $deplib in
+           -L*) new_libs="$deplib $new_libs" ;;
+           -R*) ;;
+           *)
+             # And here is the reason: when a library appears more
+             # than once as an explicit dependence of a library, or
+             # is implicitly linked in more than once by the
+             # compiler, it is considered special, and multiple
+             # occurrences thereof are not removed.  Compare this
+             # with having the same library being listed as a
+             # dependency of multiple other libraries: in this case,
+             # we know (pedantically, we assume) the library does not
+             # need to be listed more than once, so we keep only the
+             # last copy.  This is not always right, but it is rare
+             # enough that we require users that really mean to play
+             # such unportable linking tricks to link the library
+             # using -Wl,-lname, so that libtool does not consider it
+             # for duplicate removal.
+             case " $specialdeplibs " in
+             *" $deplib "*) new_libs="$deplib $new_libs" ;;
+             *)
+               case " $new_libs " in
+               *" $deplib "*) ;;
+               *) new_libs="$deplib $new_libs" ;;
+               esac
+               ;;
+             esac
+             ;;
+           esac
+         done
+         tmp_libs=
+         for deplib in $new_libs; do
+           case $deplib in
+           -L*)
+             case " $tmp_libs " in
+             *" $deplib "*) ;;
+             *) func_append tmp_libs " $deplib" ;;
+             esac
+             ;;
+           *) func_append tmp_libs " $deplib" ;;
+           esac
+         done
+         eval $var=\"$tmp_libs\"
+       done # for var
+      fi
+      # Last step: remove runtime libs from dependency_libs
+      # (they stay in deplibs)
+      tmp_libs=
+      for i in $dependency_libs ; do
+       case " $predeps $postdeps $compiler_lib_search_path " in
+       *" $i "*)
+         i=""
+         ;;
+       esac
+       if test -n "$i" ; then
+         func_append tmp_libs " $i"
+       fi
+      done
+      dependency_libs=$tmp_libs
+    done # for pass
+    if test "$linkmode" = prog; then
+      dlfiles="$newdlfiles"
+    fi
+    if test "$linkmode" = prog || test "$linkmode" = lib; then
+      dlprefiles="$newdlprefiles"
+    fi
+
+    case $linkmode in
+    oldlib)
+      if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then
+       func_warning "\`-dlopen' is ignored for archives"
+      fi
+
+      case " $deplibs" in
+      *\ -l* | *\ -L*)
+       func_warning "\`-l' and \`-L' are ignored for archives" ;;
+      esac
+
+      test -n "$rpath" && \
+       func_warning "\`-rpath' is ignored for archives"
+
+      test -n "$xrpath" && \
+       func_warning "\`-R' is ignored for archives"
+
+      test -n "$vinfo" && \
+       func_warning "\`-version-info/-version-number' is ignored for archives"
+
+      test -n "$release" && \
+       func_warning "\`-release' is ignored for archives"
+
+      test -n "$export_symbols$export_symbols_regex" && \
+       func_warning "\`-export-symbols' is ignored for archives"
+
+      # Now set the variables for building old libraries.
+      build_libtool_libs=no
+      oldlibs="$output"
+      func_append objs "$old_deplibs"
+      ;;
+
+    lib)
+      # Make sure we only generate libraries of the form `libNAME.la'.
+      case $outputname in
+      lib*)
+       func_stripname 'lib' '.la' "$outputname"
+       name=$func_stripname_result
+       eval shared_ext=\"$shrext_cmds\"
+       eval libname=\"$libname_spec\"
+       ;;
+      *)
+       test "$module" = no && \
+         func_fatal_help "libtool library \`$output' must begin with \`lib'"
+
+       if test "$need_lib_prefix" != no; then
+         # Add the "lib" prefix for modules if required
+         func_stripname '' '.la' "$outputname"
+         name=$func_stripname_result
+         eval shared_ext=\"$shrext_cmds\"
+         eval libname=\"$libname_spec\"
+       else
+         func_stripname '' '.la' "$outputname"
+         libname=$func_stripname_result
+       fi
+       ;;
+      esac
+
+      if test -n "$objs"; then
+       if test "$deplibs_check_method" != pass_all; then
+         func_fatal_error "cannot build libtool library \`$output' from non-libtool objects on this host:$objs"
+       else
+         echo
+         $ECHO "*** Warning: Linking the shared library $output against the non-libtool"
+         $ECHO "*** objects $objs is not portable!"
+         func_append libobjs " $objs"
+       fi
+      fi
+
+      test "$dlself" != no && \
+       func_warning "\`-dlopen self' is ignored for libtool libraries"
+
+      set dummy $rpath
+      shift
+      test "$#" -gt 1 && \
+       func_warning "ignoring multiple \`-rpath's for a libtool library"
+
+      install_libdir="$1"
+
+      oldlibs=
+      if test -z "$rpath"; then
+       if test "$build_libtool_libs" = yes; then
+         # Building a libtool convenience library.
+         # Some compilers have problems with a `.al' extension so
+         # convenience libraries should have the same extension an
+         # archive normally would.
+         oldlibs="$output_objdir/$libname.$libext $oldlibs"
+         build_libtool_libs=convenience
+         build_old_libs=yes
+       fi
+
+       test -n "$vinfo" && \
+         func_warning "\`-version-info/-version-number' is ignored for convenience libraries"
+
+       test -n "$release" && \
+         func_warning "\`-release' is ignored for convenience libraries"
+      else
+
+       # Parse the version information argument.
+       save_ifs="$IFS"; IFS=':'
+       set dummy $vinfo 0 0 0
+       shift
+       IFS="$save_ifs"
+
+       test -n "$7" && \
+         func_fatal_help "too many parameters to \`-version-info'"
+
+       # convert absolute version numbers to libtool ages
+       # this retains compatibility with .la files and attempts
+       # to make the code below a bit more comprehensible
+
+       case $vinfo_number in
+       yes)
+         number_major="$1"
+         number_minor="$2"
+         number_revision="$3"
+         #
+         # There are really only two kinds -- those that
+         # use the current revision as the major version
+         # and those that subtract age and use age as
+         # a minor version.  But, then there is irix
+         # which has an extra 1 added just for fun
+         #
+         case $version_type in
+         # correct linux to gnu/linux during the next big refactor
+         darwin|linux|osf|windows|none)
+           func_arith $number_major + $number_minor
+           current=$func_arith_result
+           age="$number_minor"
+           revision="$number_revision"
+           ;;
+         freebsd-aout|freebsd-elf|qnx|sunos)
+           current="$number_major"
+           revision="$number_minor"
+           age="0"
+           ;;
+         irix|nonstopux)
+           func_arith $number_major + $number_minor
+           current=$func_arith_result
+           age="$number_minor"
+           revision="$number_minor"
+           lt_irix_increment=no
+           ;;
+         *)
+           func_fatal_configuration "$modename: unknown library version type \`$version_type'"
+           ;;
+         esac
+         ;;
+       no)
+         current="$1"
+         revision="$2"
+         age="$3"
+         ;;
+       esac
+
+       # Check that each of the things are valid numbers.
+       case $current in
+       0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;;
+       *)
+         func_error "CURRENT \`$current' must be a nonnegative integer"
+         func_fatal_error "\`$vinfo' is not valid version information"
+         ;;
+       esac
+
+       case $revision in
+       0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;;
+       *)
+         func_error "REVISION \`$revision' must be a nonnegative integer"
+         func_fatal_error "\`$vinfo' is not valid version information"
+         ;;
+       esac
+
+       case $age in
+       0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;;
+       *)
+         func_error "AGE \`$age' must be a nonnegative integer"
+         func_fatal_error "\`$vinfo' is not valid version information"
+         ;;
+       esac
+
+       if test "$age" -gt "$current"; then
+         func_error "AGE \`$age' is greater than the current interface number \`$current'"
+         func_fatal_error "\`$vinfo' is not valid version information"
+       fi
+
+       # Calculate the version variables.
+       major=
+       versuffix=
+       verstring=
+       case $version_type in
+       none) ;;
+
+       darwin)
+         # Like Linux, but with the current version available in
+         # verstring for coding it into the library header
+         func_arith $current - $age
+         major=.$func_arith_result
+         versuffix="$major.$age.$revision"
+         # Darwin ld doesn't like 0 for these options...
+         func_arith $current + 1
+         minor_current=$func_arith_result
+         xlcverstring="${wl}-compatibility_version ${wl}$minor_current ${wl}-current_version ${wl}$minor_current.$revision"
+         verstring="-compatibility_version $minor_current -current_version $minor_current.$revision"
+         ;;
+
+       freebsd-aout)
+         major=".$current"
+         versuffix=".$current.$revision";
+         ;;
+
+       freebsd-elf)
+         major=".$current"
+         versuffix=".$current"
+         ;;
+
+       irix | nonstopux)
+         if test "X$lt_irix_increment" = "Xno"; then
+           func_arith $current - $age
+         else
+           func_arith $current - $age + 1
+         fi
+         major=$func_arith_result
+
+         case $version_type in
+           nonstopux) verstring_prefix=nonstopux ;;
+           *)         verstring_prefix=sgi ;;
+         esac
+         verstring="$verstring_prefix$major.$revision"
+
+         # Add in all the interfaces that we are compatible with.
+         loop=$revision
+         while test "$loop" -ne 0; do
+           func_arith $revision - $loop
+           iface=$func_arith_result
+           func_arith $loop - 1
+           loop=$func_arith_result
+           verstring="$verstring_prefix$major.$iface:$verstring"
+         done
+
+         # Before this point, $major must not contain `.'.
+         major=.$major
+         versuffix="$major.$revision"
+         ;;
+
+       linux) # correct to gnu/linux during the next big refactor
+         func_arith $current - $age
+         major=.$func_arith_result
+         versuffix="$major.$age.$revision"
+         ;;
+
+       osf)
+         func_arith $current - $age
+         major=.$func_arith_result
+         versuffix=".$current.$age.$revision"
+         verstring="$current.$age.$revision"
+
+         # Add in all the interfaces that we are compatible with.
+         loop=$age
+         while test "$loop" -ne 0; do
+           func_arith $current - $loop
+           iface=$func_arith_result
+           func_arith $loop - 1
+           loop=$func_arith_result
+           verstring="$verstring:${iface}.0"
+         done
+
+         # Make executables depend on our current version.
+         func_append verstring ":${current}.0"
+         ;;
+
+       qnx)
+         major=".$current"
+         versuffix=".$current"
+         ;;
+
+       sunos)
+         major=".$current"
+         versuffix=".$current.$revision"
+         ;;
+
+       windows)
+         # Use '-' rather than '.', since we only want one
+         # extension on DOS 8.3 filesystems.
+         func_arith $current - $age
+         major=$func_arith_result
+         versuffix="-$major"
+         ;;
+
+       *)
+         func_fatal_configuration "unknown library version type \`$version_type'"
+         ;;
+       esac
+
+       # Clear the version info if we defaulted, and they specified a release.
+       if test -z "$vinfo" && test -n "$release"; then
+         major=
+         case $version_type in
+         darwin)
+           # we can't check for "0.0" in archive_cmds due to quoting
+           # problems, so we reset it completely
+           verstring=
+           ;;
+         *)
+           verstring="0.0"
+           ;;
+         esac
+         if test "$need_version" = no; then
+           versuffix=
+         else
+           versuffix=".0.0"
+         fi
+       fi
+
+       # Remove version info from name if versioning should be avoided
+       if test "$avoid_version" = yes && test "$need_version" = no; then
+         major=
+         versuffix=
+         verstring=""
+       fi
+
+       # Check to see if the archive will have undefined symbols.
+       if test "$allow_undefined" = yes; then
+         if test "$allow_undefined_flag" = unsupported; then
+           func_warning "undefined symbols not allowed in $host shared libraries"
+           build_libtool_libs=no
+           build_old_libs=yes
+         fi
+       else
+         # Don't allow undefined symbols.
+         allow_undefined_flag="$no_undefined_flag"
+       fi
+
+      fi
+
+      func_generate_dlsyms "$libname" "$libname" "yes"
+      func_append libobjs " $symfileobj"
+      test "X$libobjs" = "X " && libobjs=
+
+      if test "$opt_mode" != relink; then
+       # Remove our outputs, but don't remove object files since they
+       # may have been created when compiling PIC objects.
+       removelist=
+       tempremovelist=`$ECHO "$output_objdir/*"`
+       for p in $tempremovelist; do
+         case $p in
+           *.$objext | *.gcno)
+              ;;
+           $output_objdir/$outputname | $output_objdir/$libname.* | $output_objdir/${libname}${release}.*)
+              if test "X$precious_files_regex" != "X"; then
+                if $ECHO "$p" | $EGREP -e "$precious_files_regex" >/dev/null 2>&1
+                then
+                  continue
+                fi
+              fi
+              func_append removelist " $p"
+              ;;
+           *) ;;
+         esac
+       done
+       test -n "$removelist" && \
+         func_show_eval "${RM}r \$removelist"
+      fi
+
+      # Now set the variables for building old libraries.
+      if test "$build_old_libs" = yes && test "$build_libtool_libs" != convenience ; then
+       func_append oldlibs " $output_objdir/$libname.$libext"
+
+       # Transform .lo files to .o files.
+       oldobjs="$objs "`$ECHO "$libobjs" | $SP2NL | $SED "/\.${libext}$/d; $lo2o" | $NL2SP`
+      fi
+
+      # Eliminate all temporary directories.
+      #for path in $notinst_path; do
+      #        lib_search_path=`$ECHO "$lib_search_path " | $SED "s% $path % %g"`
+      #        deplibs=`$ECHO "$deplibs " | $SED "s% -L$path % %g"`
+      #        dependency_libs=`$ECHO "$dependency_libs " | $SED "s% -L$path % %g"`
+      #done
+
+      if test -n "$xrpath"; then
+       # If the user specified any rpath flags, then add them.
+       temp_xrpath=
+       for libdir in $xrpath; do
+         func_replace_sysroot "$libdir"
+         func_append temp_xrpath " -R$func_replace_sysroot_result"
+         case "$finalize_rpath " in
+         *" $libdir "*) ;;
+         *) func_append finalize_rpath " $libdir" ;;
+         esac
+       done
+       if test "$hardcode_into_libs" != yes || test "$build_old_libs" = yes; then
+         dependency_libs="$temp_xrpath $dependency_libs"
+       fi
+      fi
+
+      # Make sure dlfiles contains only unique files that won't be dlpreopened
+      old_dlfiles="$dlfiles"
+      dlfiles=
+      for lib in $old_dlfiles; do
+       case " $dlprefiles $dlfiles " in
+       *" $lib "*) ;;
+       *) func_append dlfiles " $lib" ;;
+       esac
+      done
+
+      # Make sure dlprefiles contains only unique files
+      old_dlprefiles="$dlprefiles"
+      dlprefiles=
+      for lib in $old_dlprefiles; do
+       case "$dlprefiles " in
+       *" $lib "*) ;;
+       *) func_append dlprefiles " $lib" ;;
+       esac
+      done
+
+      if test "$build_libtool_libs" = yes; then
+       if test -n "$rpath"; then
+         case $host in
+         *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-*-beos* | *-cegcc* | *-*-haiku*)
+           # these systems don't actually have a c library (as such)!
+           ;;
+         *-*-rhapsody* | *-*-darwin1.[012])
+           # Rhapsody C library is in the System framework
+           func_append deplibs " System.ltframework"
+           ;;
+         *-*-netbsd*)
+           # Don't link with libc until the a.out ld.so is fixed.
+           ;;
+         *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*)
+           # Do not include libc due to us having libc/libc_r.
+           ;;
+         *-*-sco3.2v5* | *-*-sco5v6*)
+           # Causes problems with __ctype
+           ;;
+         *-*-sysv4.2uw2* | *-*-sysv5* | *-*-unixware* | *-*-OpenUNIX*)
+           # Compiler inserts libc in the correct place for threads to work
+           ;;
+         *)
+           # Add libc to deplibs on all other systems if necessary.
+           if test "$build_libtool_need_lc" = "yes"; then
+             func_append deplibs " -lc"
+           fi
+           ;;
+         esac
+       fi
+
+       # Transform deplibs into only deplibs that can be linked in shared.
+       name_save=$name
+       libname_save=$libname
+       release_save=$release
+       versuffix_save=$versuffix
+       major_save=$major
+       # I'm not sure if I'm treating the release correctly.  I think
+       # release should show up in the -l (ie -lgmp5) so we don't want to
+       # add it in twice.  Is that correct?
+       release=""
+       versuffix=""
+       major=""
+       newdeplibs=
+       droppeddeps=no
+       case $deplibs_check_method in
+       pass_all)
+         # Don't check for shared/static.  Everything works.
+         # This might be a little naive.  We might want to check
+         # whether the library exists or not.  But this is on
+         # osf3 & osf4 and I'm not really sure... Just
+         # implementing what was already the behavior.
+         newdeplibs=$deplibs
+         ;;
+       test_compile)
+         # This code stresses the "libraries are programs" paradigm to its
+         # limits. Maybe even breaks it.  We compile a program, linking it
+         # against the deplibs as a proxy for the library.  Then we can check
+         # whether they linked in statically or dynamically with ldd.
+         $opt_dry_run || $RM conftest.c
+         cat > conftest.c <<EOF
+         int main() { return 0; }
+EOF
+         $opt_dry_run || $RM conftest
+         if $LTCC $LTCFLAGS -o conftest conftest.c $deplibs; then
+           ldd_output=`ldd conftest`
+           for i in $deplibs; do
+             case $i in
+             -l*)
+               func_stripname -l '' "$i"
+               name=$func_stripname_result
+               if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then
+                 case " $predeps $postdeps " in
+                 *" $i "*)
+                   func_append newdeplibs " $i"
+                   i=""
+                   ;;
+                 esac
+               fi
+               if test -n "$i" ; then
+                 libname=`eval "\\$ECHO \"$libname_spec\""`
+                 deplib_matches=`eval "\\$ECHO \"$library_names_spec\""`
+                 set dummy $deplib_matches; shift
+                 deplib_match=$1
+                 if test `expr "$ldd_output" : ".*$deplib_match"` -ne 0 ; then
+                   func_append newdeplibs " $i"
+                 else
+                   droppeddeps=yes
+                   echo
+                   $ECHO "*** Warning: dynamic linker does not accept needed library $i."
+                   echo "*** I have the capability to make that library automatically link in when"
+                   echo "*** you link to this library.  But I can only do this if you have a"
+                   echo "*** shared version of the library, which I believe you do not have"
+                   echo "*** because a test_compile did reveal that the linker did not use it for"
+                   echo "*** its dynamic dependency list that programs get resolved with at runtime."
+                 fi
+               fi
+               ;;
+             *)
+               func_append newdeplibs " $i"
+               ;;
+             esac
+           done
+         else
+           # Error occurred in the first compile.  Let's try to salvage
+           # the situation: Compile a separate program for each library.
+           for i in $deplibs; do
+             case $i in
+             -l*)
+               func_stripname -l '' "$i"
+               name=$func_stripname_result
+               $opt_dry_run || $RM conftest
+               if $LTCC $LTCFLAGS -o conftest conftest.c $i; then
+                 ldd_output=`ldd conftest`
+                 if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then
+                   case " $predeps $postdeps " in
+                   *" $i "*)
+                     func_append newdeplibs " $i"
+                     i=""
+                     ;;
+                   esac
+                 fi
+                 if test -n "$i" ; then
+                   libname=`eval "\\$ECHO \"$libname_spec\""`
+                   deplib_matches=`eval "\\$ECHO \"$library_names_spec\""`
+                   set dummy $deplib_matches; shift
+                   deplib_match=$1
+                   if test `expr "$ldd_output" : ".*$deplib_match"` -ne 0 ; then
+                     func_append newdeplibs " $i"
+                   else
+                     droppeddeps=yes
+                     echo
+                     $ECHO "*** Warning: dynamic linker does not accept needed library $i."
+                     echo "*** I have the capability to make that library automatically link in when"
+                     echo "*** you link to this library.  But I can only do this if you have a"
+                     echo "*** shared version of the library, which you do not appear to have"
+                     echo "*** because a test_compile did reveal that the linker did not use this one"
+                     echo "*** as a dynamic dependency that programs can get resolved with at runtime."
+                   fi
+                 fi
+               else
+                 droppeddeps=yes
+                 echo
+                 $ECHO "*** Warning!  Library $i is needed by this library but I was not able to"
+                 echo "*** make it link in!  You will probably need to install it or some"
+                 echo "*** library that it depends on before this library will be fully"
+                 echo "*** functional.  Installing it before continuing would be even better."
+               fi
+               ;;
+             *)
+               func_append newdeplibs " $i"
+               ;;
+             esac
+           done
+         fi
+         ;;
+       file_magic*)
+         set dummy $deplibs_check_method; shift
+         file_magic_regex=`expr "$deplibs_check_method" : "$1 \(.*\)"`
+         for a_deplib in $deplibs; do
+           case $a_deplib in
+           -l*)
+             func_stripname -l '' "$a_deplib"
+             name=$func_stripname_result
+             if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then
+               case " $predeps $postdeps " in
+               *" $a_deplib "*)
+                 func_append newdeplibs " $a_deplib"
+                 a_deplib=""
+                 ;;
+               esac
+             fi
+             if test -n "$a_deplib" ; then
+               libname=`eval "\\$ECHO \"$libname_spec\""`
+               if test -n "$file_magic_glob"; then
+                 libnameglob=`func_echo_all "$libname" | $SED -e $file_magic_glob`
+               else
+                 libnameglob=$libname
+               fi
+               test "$want_nocaseglob" = yes && nocaseglob=`shopt -p nocaseglob`
+               for i in $lib_search_path $sys_lib_search_path $shlib_search_path; do
+                 if test "$want_nocaseglob" = yes; then
+                   shopt -s nocaseglob
+                   potential_libs=`ls $i/$libnameglob[.-]* 2>/dev/null`
+                   $nocaseglob
+                 else
+                   potential_libs=`ls $i/$libnameglob[.-]* 2>/dev/null`
+                 fi
+                 for potent_lib in $potential_libs; do
+                     # Follow soft links.
+                     if ls -lLd "$potent_lib" 2>/dev/null |
+                        $GREP " -> " >/dev/null; then
+                       continue
+                     fi
+                     # The statement above tries to avoid entering an
+                     # endless loop below, in case of cyclic links.
+                     # We might still enter an endless loop, since a link
+                     # loop can be closed while we follow links,
+                     # but so what?
+                     potlib="$potent_lib"
+                     while test -h "$potlib" 2>/dev/null; do
+                       potliblink=`ls -ld $potlib | ${SED} 's/.* -> //'`
+                       case $potliblink in
+                       [\\/]* | [A-Za-z]:[\\/]*) potlib="$potliblink";;
+                       *) potlib=`$ECHO "$potlib" | $SED 's,[^/]*$,,'`"$potliblink";;
+                       esac
+                     done
+                     if eval $file_magic_cmd \"\$potlib\" 2>/dev/null |
+                        $SED -e 10q |
+                        $EGREP "$file_magic_regex" > /dev/null; then
+                       func_append newdeplibs " $a_deplib"
+                       a_deplib=""
+                       break 2
+                     fi
+                 done
+               done
+             fi
+             if test -n "$a_deplib" ; then
+               droppeddeps=yes
+               echo
+               $ECHO "*** Warning: linker path does not have real file for library $a_deplib."
+               echo "*** I have the capability to make that library automatically link in when"
+               echo "*** you link to this library.  But I can only do this if you have a"
+               echo "*** shared version of the library, which you do not appear to have"
+               echo "*** because I did check the linker path looking for a file starting"
+               if test -z "$potlib" ; then
+                 $ECHO "*** with $libname but no candidates were found. (...for file magic test)"
+               else
+                 $ECHO "*** with $libname and none of the candidates passed a file format test"
+                 $ECHO "*** using a file magic. Last file checked: $potlib"
+               fi
+             fi
+             ;;
+           *)
+             # Add a -L argument.
+             func_append newdeplibs " $a_deplib"
+             ;;
+           esac
+         done # Gone through all deplibs.
+         ;;
+       match_pattern*)
+         set dummy $deplibs_check_method; shift
+         match_pattern_regex=`expr "$deplibs_check_method" : "$1 \(.*\)"`
+         for a_deplib in $deplibs; do
+           case $a_deplib in
+           -l*)
+             func_stripname -l '' "$a_deplib"
+             name=$func_stripname_result
+             if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then
+               case " $predeps $postdeps " in
+               *" $a_deplib "*)
+                 func_append newdeplibs " $a_deplib"
+                 a_deplib=""
+                 ;;
+               esac
+             fi
+             if test -n "$a_deplib" ; then
+               libname=`eval "\\$ECHO \"$libname_spec\""`
+               for i in $lib_search_path $sys_lib_search_path $shlib_search_path; do
+                 potential_libs=`ls $i/$libname[.-]* 2>/dev/null`
+                 for potent_lib in $potential_libs; do
+                   potlib="$potent_lib" # see symlink-check above in file_magic test
+                   if eval "\$ECHO \"$potent_lib\"" 2>/dev/null | $SED 10q | \
+                      $EGREP "$match_pattern_regex" > /dev/null; then
+                     func_append newdeplibs " $a_deplib"
+                     a_deplib=""
+                     break 2
+                   fi
+                 done
+               done
+             fi
+             if test -n "$a_deplib" ; then
+               droppeddeps=yes
+               echo
+               $ECHO "*** Warning: linker path does not have real file for library $a_deplib."
+               echo "*** I have the capability to make that library automatically link in when"
+               echo "*** you link to this library.  But I can only do this if you have a"
+               echo "*** shared version of the library, which you do not appear to have"
+               echo "*** because I did check the linker path looking for a file starting"
+               if test -z "$potlib" ; then
+                 $ECHO "*** with $libname but no candidates were found. (...for regex pattern test)"
+               else
+                 $ECHO "*** with $libname and none of the candidates passed a file format test"
+                 $ECHO "*** using a regex pattern. Last file checked: $potlib"
+               fi
+             fi
+             ;;
+           *)
+             # Add a -L argument.
+             func_append newdeplibs " $a_deplib"
+             ;;
+           esac
+         done # Gone through all deplibs.
+         ;;
+       none | unknown | *)
+         newdeplibs=""
+         tmp_deplibs=`$ECHO " $deplibs" | $SED 's/ -lc$//; s/ -[LR][^ ]*//g'`
+         if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then
+           for i in $predeps $postdeps ; do
+             # can't use Xsed below, because $i might contain '/'
+             tmp_deplibs=`$ECHO " $tmp_deplibs" | $SED "s,$i,,"`
+           done
+         fi
+         case $tmp_deplibs in
+         *[!\  \ ]*)
+           echo
+           if test "X$deplibs_check_method" = "Xnone"; then
+             echo "*** Warning: inter-library dependencies are not supported in this platform."
+           else
+             echo "*** Warning: inter-library dependencies are not known to be supported."
+           fi
+           echo "*** All declared inter-library dependencies are being dropped."
+           droppeddeps=yes
+           ;;
+         esac
+         ;;
+       esac
+       versuffix=$versuffix_save
+       major=$major_save
+       release=$release_save
+       libname=$libname_save
+       name=$name_save
+
+       case $host in
+       *-*-rhapsody* | *-*-darwin1.[012])
+         # On Rhapsody replace the C library with the System framework
+         newdeplibs=`$ECHO " $newdeplibs" | $SED 's/ -lc / System.ltframework /'`
+         ;;
+       esac
+
+       if test "$droppeddeps" = yes; then
+         if test "$module" = yes; then
+           echo
+           echo "*** Warning: libtool could not satisfy all declared inter-library"
+           $ECHO "*** dependencies of module $libname.  Therefore, libtool will create"
+           echo "*** a static module, that should work as long as the dlopening"
+           echo "*** application is linked with the -dlopen flag."
+           if test -z "$global_symbol_pipe"; then
+             echo
+             echo "*** However, this would only work if libtool was able to extract symbol"
+             echo "*** lists from a program, using \`nm' or equivalent, but libtool could"
+             echo "*** not find such a program.  So, this module is probably useless."
+             echo "*** \`nm' from GNU binutils and a full rebuild may help."
+           fi
+           if test "$build_old_libs" = no; then
+             oldlibs="$output_objdir/$libname.$libext"
+             build_libtool_libs=module
+             build_old_libs=yes
+           else
+             build_libtool_libs=no
+           fi
+         else
+           echo "*** The inter-library dependencies that have been dropped here will be"
+           echo "*** automatically added whenever a program is linked with this library"
+           echo "*** or is declared to -dlopen it."
+
+           if test "$allow_undefined" = no; then
+             echo
+             echo "*** Since this library must not contain undefined symbols,"
+             echo "*** because either the platform does not support them or"
+             echo "*** it was explicitly requested with -no-undefined,"
+             echo "*** libtool will only create a static version of it."
+             if test "$build_old_libs" = no; then
+               oldlibs="$output_objdir/$libname.$libext"
+               build_libtool_libs=module
+               build_old_libs=yes
+             else
+               build_libtool_libs=no
+             fi
+           fi
+         fi
+       fi
+       # Done checking deplibs!
+       deplibs=$newdeplibs
+      fi
+      # Time to change all our "foo.ltframework" stuff back to "-framework foo"
+      case $host in
+       *-*-darwin*)
+         newdeplibs=`$ECHO " $newdeplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'`
+         new_inherited_linker_flags=`$ECHO " $new_inherited_linker_flags" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'`
+         deplibs=`$ECHO " $deplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'`
+         ;;
+      esac
+
+      # move library search paths that coincide with paths to not yet
+      # installed libraries to the beginning of the library search list
+      new_libs=
+      for path in $notinst_path; do
+       case " $new_libs " in
+       *" -L$path/$objdir "*) ;;
+       *)
+         case " $deplibs " in
+         *" -L$path/$objdir "*)
+           func_append new_libs " -L$path/$objdir" ;;
+         esac
+         ;;
+       esac
+      done
+      for deplib in $deplibs; do
+       case $deplib in
+       -L*)
+         case " $new_libs " in
+         *" $deplib "*) ;;
+         *) func_append new_libs " $deplib" ;;
+         esac
+         ;;
+       *) func_append new_libs " $deplib" ;;
+       esac
+      done
+      deplibs="$new_libs"
+
+      # All the library-specific variables (install_libdir is set above).
+      library_names=
+      old_library=
+      dlname=
+
+      # Test again, we may have decided not to build it any more
+      if test "$build_libtool_libs" = yes; then
+       # Remove ${wl} instances when linking with ld.
+       # FIXME: should test the right _cmds variable.
+       case $archive_cmds in
+         *\$LD\ *) wl= ;;
+        esac
+       if test "$hardcode_into_libs" = yes; then
+         # Hardcode the library paths
+         hardcode_libdirs=
+         dep_rpath=
+         rpath="$finalize_rpath"
+         test "$opt_mode" != relink && rpath="$compile_rpath$rpath"
+         for libdir in $rpath; do
+           if test -n "$hardcode_libdir_flag_spec"; then
+             if test -n "$hardcode_libdir_separator"; then
+               func_replace_sysroot "$libdir"
+               libdir=$func_replace_sysroot_result
+               if test -z "$hardcode_libdirs"; then
+                 hardcode_libdirs="$libdir"
+               else
+                 # Just accumulate the unique libdirs.
+                 case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in
+                 *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*)
+                   ;;
+                 *)
+                   func_append hardcode_libdirs "$hardcode_libdir_separator$libdir"
+                   ;;
+                 esac
+               fi
+             else
+               eval flag=\"$hardcode_libdir_flag_spec\"
+               func_append dep_rpath " $flag"
+             fi
+           elif test -n "$runpath_var"; then
+             case "$perm_rpath " in
+             *" $libdir "*) ;;
+             *) func_append perm_rpath " $libdir" ;;
+             esac
+           fi
+         done
+         # Substitute the hardcoded libdirs into the rpath.
+         if test -n "$hardcode_libdir_separator" &&
+            test -n "$hardcode_libdirs"; then
+           libdir="$hardcode_libdirs"
+           eval "dep_rpath=\"$hardcode_libdir_flag_spec\""
+         fi
+         if test -n "$runpath_var" && test -n "$perm_rpath"; then
+           # We should set the runpath_var.
+           rpath=
+           for dir in $perm_rpath; do
+             func_append rpath "$dir:"
+           done
+           eval "$runpath_var='$rpath\$$runpath_var'; export $runpath_var"
+         fi
+         test -n "$dep_rpath" && deplibs="$dep_rpath $deplibs"
+       fi
+
+       shlibpath="$finalize_shlibpath"
+       test "$opt_mode" != relink && shlibpath="$compile_shlibpath$shlibpath"
+       if test -n "$shlibpath"; then
+         eval "$shlibpath_var='$shlibpath\$$shlibpath_var'; export $shlibpath_var"
+       fi
+
+       # Get the real and link names of the library.
+       eval shared_ext=\"$shrext_cmds\"
+       eval library_names=\"$library_names_spec\"
+       set dummy $library_names
+       shift
+       realname="$1"
+       shift
+
+       if test -n "$soname_spec"; then
+         eval soname=\"$soname_spec\"
+       else
+         soname="$realname"
+       fi
+       if test -z "$dlname"; then
+         dlname=$soname
+       fi
+
+       lib="$output_objdir/$realname"
+       linknames=
+       for link
+       do
+         func_append linknames " $link"
+       done
+
+       # Use standard objects if they are pic
+       test -z "$pic_flag" && libobjs=`$ECHO "$libobjs" | $SP2NL | $SED "$lo2o" | $NL2SP`
+       test "X$libobjs" = "X " && libobjs=
+
+       delfiles=
+       if test -n "$export_symbols" && test -n "$include_expsyms"; then
+         $opt_dry_run || cp "$export_symbols" "$output_objdir/$libname.uexp"
+         export_symbols="$output_objdir/$libname.uexp"
+         func_append delfiles " $export_symbols"
+       fi
+
+       orig_export_symbols=
+       case $host_os in
+       cygwin* | mingw* | cegcc*)
+         if test -n "$export_symbols" && test -z "$export_symbols_regex"; then
+           # exporting using user supplied symfile
+           if test "x`$SED 1q $export_symbols`" != xEXPORTS; then
+             # and it's NOT already a .def file. Must figure out
+             # which of the given symbols are data symbols and tag
+             # them as such. So, trigger use of export_symbols_cmds.
+             # export_symbols gets reassigned inside the "prepare
+             # the list of exported symbols" if statement, so the
+             # include_expsyms logic still works.
+             orig_export_symbols="$export_symbols"
+             export_symbols=
+             always_export_symbols=yes
+           fi
+         fi
+         ;;
+       esac
+
+       # Prepare the list of exported symbols
+       if test -z "$export_symbols"; then
+         if test "$always_export_symbols" = yes || test -n "$export_symbols_regex"; then
+           func_verbose "generating symbol list for \`$libname.la'"
+           export_symbols="$output_objdir/$libname.exp"
+           $opt_dry_run || $RM $export_symbols
+           cmds=$export_symbols_cmds
+           save_ifs="$IFS"; IFS='~'
+           for cmd1 in $cmds; do
+             IFS="$save_ifs"
+             # Take the normal branch if the nm_file_list_spec branch
+             # doesn't work or if tool conversion is not needed.
+             case $nm_file_list_spec~$to_tool_file_cmd in
+               *~func_convert_file_noop | *~func_convert_file_msys_to_w32 | ~*)
+                 try_normal_branch=yes
+                 eval cmd=\"$cmd1\"
+                 func_len " $cmd"
+                 len=$func_len_result
+                 ;;
+               *)
+                 try_normal_branch=no
+                 ;;
+             esac
+             if test "$try_normal_branch" = yes \
+                && { test "$len" -lt "$max_cmd_len" \
+                     || test "$max_cmd_len" -le -1; }
+             then
+               func_show_eval "$cmd" 'exit $?'
+               skipped_export=false
+             elif test -n "$nm_file_list_spec"; then
+               func_basename "$output"
+               output_la=$func_basename_result
+               save_libobjs=$libobjs
+               save_output=$output
+               output=${output_objdir}/${output_la}.nm
+               func_to_tool_file "$output"
+               libobjs=$nm_file_list_spec$func_to_tool_file_result
+               func_append delfiles " $output"
+               func_verbose "creating $NM input file list: $output"
+               for obj in $save_libobjs; do
+                 func_to_tool_file "$obj"
+                 $ECHO "$func_to_tool_file_result"
+               done > "$output"
+               eval cmd=\"$cmd1\"
+               func_show_eval "$cmd" 'exit $?'
+               output=$save_output
+               libobjs=$save_libobjs
+               skipped_export=false
+             else
+               # The command line is too long to execute in one step.
+               func_verbose "using reloadable object file for export list..."
+               skipped_export=:
+               # Break out early, otherwise skipped_export may be
+               # set to false by a later but shorter cmd.
+               break
+             fi
+           done
+           IFS="$save_ifs"
+           if test -n "$export_symbols_regex" && test "X$skipped_export" != "X:"; then
+             func_show_eval '$EGREP -e "$export_symbols_regex" "$export_symbols" > "${export_symbols}T"'
+             func_show_eval '$MV "${export_symbols}T" "$export_symbols"'
+           fi
+         fi
+       fi
+
+       if test -n "$export_symbols" && test -n "$include_expsyms"; then
+         tmp_export_symbols="$export_symbols"
+         test -n "$orig_export_symbols" && tmp_export_symbols="$orig_export_symbols"
+         $opt_dry_run || eval '$ECHO "$include_expsyms" | $SP2NL >> "$tmp_export_symbols"'
+       fi
+
+       if test "X$skipped_export" != "X:" && test -n "$orig_export_symbols"; then
+         # The given exports_symbols file has to be filtered, so filter it.
+         func_verbose "filter symbol list for \`$libname.la' to tag DATA exports"
+         # FIXME: $output_objdir/$libname.filter potentially contains lots of
+         # 's' commands which not all seds can handle. GNU sed should be fine
+         # though. Also, the filter scales superlinearly with the number of
+         # global variables. join(1) would be nice here, but unfortunately
+         # isn't a blessed tool.
+         $opt_dry_run || $SED -e '/[ ,]DATA/!d;s,\(.*\)\([ \,].*\),s|^\1$|\1\2|,' < $export_symbols > $output_objdir/$libname.filter
+         func_append delfiles " $export_symbols $output_objdir/$libname.filter"
+         export_symbols=$output_objdir/$libname.def
+         $opt_dry_run || $SED -f $output_objdir/$libname.filter < $orig_export_symbols > $export_symbols
+       fi
+
+       tmp_deplibs=
+       for test_deplib in $deplibs; do
+         case " $convenience " in
+         *" $test_deplib "*) ;;
+         *)
+           func_append tmp_deplibs " $test_deplib"
+           ;;
+         esac
+       done
+       deplibs="$tmp_deplibs"
+
+       if test -n "$convenience"; then
+         if test -n "$whole_archive_flag_spec" &&
+           test "$compiler_needs_object" = yes &&
+           test -z "$libobjs"; then
+           # extract the archives, so we have objects to list.
+           # TODO: could optimize this to just extract one archive.
+           whole_archive_flag_spec=
+         fi
+         if test -n "$whole_archive_flag_spec"; then
+           save_libobjs=$libobjs
+           eval libobjs=\"\$libobjs $whole_archive_flag_spec\"
+           test "X$libobjs" = "X " && libobjs=
+         else
+           gentop="$output_objdir/${outputname}x"
+           func_append generated " $gentop"
+
+           func_extract_archives $gentop $convenience
+           func_append libobjs " $func_extract_archives_result"
+           test "X$libobjs" = "X " && libobjs=
+         fi
+       fi
+
+       if test "$thread_safe" = yes && test -n "$thread_safe_flag_spec"; then
+         eval flag=\"$thread_safe_flag_spec\"
+         func_append linker_flags " $flag"
+       fi
+
+       # Make a backup of the uninstalled library when relinking
+       if test "$opt_mode" = relink; then
+         $opt_dry_run || eval '(cd $output_objdir && $RM ${realname}U && $MV $realname ${realname}U)' || exit $?
+       fi
+
+       # Do each of the archive commands.
+       if test "$module" = yes && test -n "$module_cmds" ; then
+         if test -n "$export_symbols" && test -n "$module_expsym_cmds"; then
+           eval test_cmds=\"$module_expsym_cmds\"
+           cmds=$module_expsym_cmds
+         else
+           eval test_cmds=\"$module_cmds\"
+           cmds=$module_cmds
+         fi
+       else
+         if test -n "$export_symbols" && test -n "$archive_expsym_cmds"; then
+           eval test_cmds=\"$archive_expsym_cmds\"
+           cmds=$archive_expsym_cmds
+         else
+           eval test_cmds=\"$archive_cmds\"
+           cmds=$archive_cmds
+         fi
+       fi
+
+       if test "X$skipped_export" != "X:" &&
+          func_len " $test_cmds" &&
+          len=$func_len_result &&
+          test "$len" -lt "$max_cmd_len" || test "$max_cmd_len" -le -1; then
+         :
+       else
+         # The command line is too long to link in one step, link piecewise
+         # or, if using GNU ld and skipped_export is not :, use a linker
+         # script.
+
+         # Save the value of $output and $libobjs because we want to
+         # use them later.  If we have whole_archive_flag_spec, we
+         # want to use save_libobjs as it was before
+         # whole_archive_flag_spec was expanded, because we can't
+         # assume the linker understands whole_archive_flag_spec.
+         # This may have to be revisited, in case too many
+         # convenience libraries get linked in and end up exceeding
+         # the spec.
+         if test -z "$convenience" || test -z "$whole_archive_flag_spec"; then
+           save_libobjs=$libobjs
+         fi
+         save_output=$output
+         func_basename "$output"
+         output_la=$func_basename_result
+
+         # Clear the reloadable object creation command queue and
+         # initialize k to one.
+         test_cmds=
+         concat_cmds=
+         objlist=
+         last_robj=
+         k=1
+
+         if test -n "$save_libobjs" && test "X$skipped_export" != "X:" && test "$with_gnu_ld" = yes; then
+           output=${output_objdir}/${output_la}.lnkscript
+           func_verbose "creating GNU ld script: $output"
+           echo 'INPUT (' > $output
+           for obj in $save_libobjs
+           do
+             func_to_tool_file "$obj"
+             $ECHO "$func_to_tool_file_result" >> $output
+           done
+           echo ')' >> $output
+           func_append delfiles " $output"
+           func_to_tool_file "$output"
+           output=$func_to_tool_file_result
+         elif test -n "$save_libobjs" && test "X$skipped_export" != "X:" && test "X$file_list_spec" != X; then
+           output=${output_objdir}/${output_la}.lnk
+           func_verbose "creating linker input file list: $output"
+           : > $output
+           set x $save_libobjs
+           shift
+           firstobj=
+           if test "$compiler_needs_object" = yes; then
+             firstobj="$1 "
+             shift
+           fi
+           for obj
+           do
+             func_to_tool_file "$obj"
+             $ECHO "$func_to_tool_file_result" >> $output
+           done
+           func_append delfiles " $output"
+           func_to_tool_file "$output"
+           output=$firstobj\"$file_list_spec$func_to_tool_file_result\"
+         else
+           if test -n "$save_libobjs"; then
+             func_verbose "creating reloadable object files..."
+             output=$output_objdir/$output_la-${k}.$objext
+             eval test_cmds=\"$reload_cmds\"
+             func_len " $test_cmds"
+             len0=$func_len_result
+             len=$len0
+
+             # Loop over the list of objects to be linked.
+             for obj in $save_libobjs
+             do
+               func_len " $obj"
+               func_arith $len + $func_len_result
+               len=$func_arith_result
+               if test "X$objlist" = X ||
+                  test "$len" -lt "$max_cmd_len"; then
+                 func_append objlist " $obj"
+               else
+                 # The command $test_cmds is almost too long, add a
+                 # command to the queue.
+                 if test "$k" -eq 1 ; then
+                   # The first file doesn't have a previous command to add.
+                   reload_objs=$objlist
+                   eval concat_cmds=\"$reload_cmds\"
+                 else
+                   # All subsequent reloadable object files will link in
+                   # the last one created.
+                   reload_objs="$objlist $last_robj"
+                   eval concat_cmds=\"\$concat_cmds~$reload_cmds~\$RM $last_robj\"
+                 fi
+                 last_robj=$output_objdir/$output_la-${k}.$objext
+                 func_arith $k + 1
+                 k=$func_arith_result
+                 output=$output_objdir/$output_la-${k}.$objext
+                 objlist=" $obj"
+                 func_len " $last_robj"
+                 func_arith $len0 + $func_len_result
+                 len=$func_arith_result
+               fi
+             done
+             # Handle the remaining objects by creating one last
+             # reloadable object file.  All subsequent reloadable object
+             # files will link in the last one created.
+             test -z "$concat_cmds" || concat_cmds=$concat_cmds~
+             reload_objs="$objlist $last_robj"
+             eval concat_cmds=\"\${concat_cmds}$reload_cmds\"
+             if test -n "$last_robj"; then
+               eval concat_cmds=\"\${concat_cmds}~\$RM $last_robj\"
+             fi
+             func_append delfiles " $output"
+
+           else
+             output=
+           fi
+
+           if ${skipped_export-false}; then
+             func_verbose "generating symbol list for \`$libname.la'"
+             export_symbols="$output_objdir/$libname.exp"
+             $opt_dry_run || $RM $export_symbols
+             libobjs=$output
+             # Append the command to create the export file.
+             test -z "$concat_cmds" || concat_cmds=$concat_cmds~
+             eval concat_cmds=\"\$concat_cmds$export_symbols_cmds\"
+             if test -n "$last_robj"; then
+               eval concat_cmds=\"\$concat_cmds~\$RM $last_robj\"
+             fi
+           fi
+
+           test -n "$save_libobjs" &&
+             func_verbose "creating a temporary reloadable object file: $output"
+
+           # Loop through the commands generated above and execute them.
+           save_ifs="$IFS"; IFS='~'
+           for cmd in $concat_cmds; do
+             IFS="$save_ifs"
+             $opt_silent || {
+                 func_quote_for_expand "$cmd"
+                 eval "func_echo $func_quote_for_expand_result"
+             }
+             $opt_dry_run || eval "$cmd" || {
+               lt_exit=$?
+
+               # Restore the uninstalled library and exit
+               if test "$opt_mode" = relink; then
+                 ( cd "$output_objdir" && \
+                   $RM "${realname}T" && \
+                   $MV "${realname}U" "$realname" )
+               fi
+
+               exit $lt_exit
+             }
+           done
+           IFS="$save_ifs"
+
+           if test -n "$export_symbols_regex" && ${skipped_export-false}; then
+             func_show_eval '$EGREP -e "$export_symbols_regex" "$export_symbols" > "${export_symbols}T"'
+             func_show_eval '$MV "${export_symbols}T" "$export_symbols"'
+           fi
+         fi
+
+          if ${skipped_export-false}; then
+           if test -n "$export_symbols" && test -n "$include_expsyms"; then
+             tmp_export_symbols="$export_symbols"
+             test -n "$orig_export_symbols" && tmp_export_symbols="$orig_export_symbols"
+             $opt_dry_run || eval '$ECHO "$include_expsyms" | $SP2NL >> "$tmp_export_symbols"'
+           fi
+
+           if test -n "$orig_export_symbols"; then
+             # The given exports_symbols file has to be filtered, so filter it.
+             func_verbose "filter symbol list for \`$libname.la' to tag DATA exports"
+             # FIXME: $output_objdir/$libname.filter potentially contains lots of
+             # 's' commands which not all seds can handle. GNU sed should be fine
+             # though. Also, the filter scales superlinearly with the number of
+             # global variables. join(1) would be nice here, but unfortunately
+             # isn't a blessed tool.
+             $opt_dry_run || $SED -e '/[ ,]DATA/!d;s,\(.*\)\([ \,].*\),s|^\1$|\1\2|,' < $export_symbols > $output_objdir/$libname.filter
+             func_append delfiles " $export_symbols $output_objdir/$libname.filter"
+             export_symbols=$output_objdir/$libname.def
+             $opt_dry_run || $SED -f $output_objdir/$libname.filter < $orig_export_symbols > $export_symbols
+           fi
+         fi
+
+         libobjs=$output
+         # Restore the value of output.
+         output=$save_output
+
+         if test -n "$convenience" && test -n "$whole_archive_flag_spec"; then
+           eval libobjs=\"\$libobjs $whole_archive_flag_spec\"
+           test "X$libobjs" = "X " && libobjs=
+         fi
+         # Expand the library linking commands again to reset the
+         # value of $libobjs for piecewise linking.
+
+         # Do each of the archive commands.
+         if test "$module" = yes && test -n "$module_cmds" ; then
+           if test -n "$export_symbols" && test -n "$module_expsym_cmds"; then
+             cmds=$module_expsym_cmds
+           else
+             cmds=$module_cmds
+           fi
+         else
+           if test -n "$export_symbols" && test -n "$archive_expsym_cmds"; then
+             cmds=$archive_expsym_cmds
+           else
+             cmds=$archive_cmds
+           fi
+         fi
+       fi
+
+       if test -n "$delfiles"; then
+         # Append the command to remove temporary files to $cmds.
+         eval cmds=\"\$cmds~\$RM $delfiles\"
+       fi
+
+       # Add any objects from preloaded convenience libraries
+       if test -n "$dlprefiles"; then
+         gentop="$output_objdir/${outputname}x"
+         func_append generated " $gentop"
+
+         func_extract_archives $gentop $dlprefiles
+         func_append libobjs " $func_extract_archives_result"
+         test "X$libobjs" = "X " && libobjs=
+       fi
+
+       save_ifs="$IFS"; IFS='~'
+       for cmd in $cmds; do
+         IFS="$save_ifs"
+         eval cmd=\"$cmd\"
+         $opt_silent || {
+           func_quote_for_expand "$cmd"
+           eval "func_echo $func_quote_for_expand_result"
+         }
+         $opt_dry_run || eval "$cmd" || {
+           lt_exit=$?
+
+           # Restore the uninstalled library and exit
+           if test "$opt_mode" = relink; then
+             ( cd "$output_objdir" && \
+               $RM "${realname}T" && \
+               $MV "${realname}U" "$realname" )
+           fi
+
+           exit $lt_exit
+         }
+       done
+       IFS="$save_ifs"
+
+       # Restore the uninstalled library and exit
+       if test "$opt_mode" = relink; then
+         $opt_dry_run || eval '(cd $output_objdir && $RM ${realname}T && $MV $realname ${realname}T && $MV ${realname}U $realname)' || exit $?
+
+         if test -n "$convenience"; then
+           if test -z "$whole_archive_flag_spec"; then
+             func_show_eval '${RM}r "$gentop"'
+           fi
+         fi
+
+         exit $EXIT_SUCCESS
+       fi
+
+       # Create links to the real library.
+       for linkname in $linknames; do
+         if test "$realname" != "$linkname"; then
+           func_show_eval '(cd "$output_objdir" && $RM "$linkname" && $LN_S "$realname" "$linkname")' 'exit $?'
+         fi
+       done
+
+       # If -module or -export-dynamic was specified, set the dlname.
+       if test "$module" = yes || test "$export_dynamic" = yes; then
+         # On all known operating systems, these are identical.
+         dlname="$soname"
+       fi
+      fi
+      ;;
+
+    obj)
+      if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then
+       func_warning "\`-dlopen' is ignored for objects"
+      fi
+
+      case " $deplibs" in
+      *\ -l* | *\ -L*)
+       func_warning "\`-l' and \`-L' are ignored for objects" ;;
+      esac
+
+      test -n "$rpath" && \
+       func_warning "\`-rpath' is ignored for objects"
+
+      test -n "$xrpath" && \
+       func_warning "\`-R' is ignored for objects"
+
+      test -n "$vinfo" && \
+       func_warning "\`-version-info' is ignored for objects"
+
+      test -n "$release" && \
+       func_warning "\`-release' is ignored for objects"
+
+      case $output in
+      *.lo)
+       test -n "$objs$old_deplibs" && \
+         func_fatal_error "cannot build library object \`$output' from non-libtool objects"
+
+       libobj=$output
+       func_lo2o "$libobj"
+       obj=$func_lo2o_result
+       ;;
+      *)
+       libobj=
+       obj="$output"
+       ;;
+      esac
+
+      # Delete the old objects.
+      $opt_dry_run || $RM $obj $libobj
+
+      # Objects from convenience libraries.  This assumes
+      # single-version convenience libraries.  Whenever we create
+      # different ones for PIC/non-PIC, this we'll have to duplicate
+      # the extraction.
+      reload_conv_objs=
+      gentop=
+      # reload_cmds runs $LD directly, so let us get rid of
+      # -Wl from whole_archive_flag_spec and hope we can get by with
+      # turning comma into space..
+      wl=
+
+      if test -n "$convenience"; then
+       if test -n "$whole_archive_flag_spec"; then
+         eval tmp_whole_archive_flags=\"$whole_archive_flag_spec\"
+         reload_conv_objs=$reload_objs\ `$ECHO "$tmp_whole_archive_flags" | $SED 's|,| |g'`
+       else
+         gentop="$output_objdir/${obj}x"
+         func_append generated " $gentop"
+
+         func_extract_archives $gentop $convenience
+         reload_conv_objs="$reload_objs $func_extract_archives_result"
+       fi
+      fi
+
+      # If we're not building shared, we need to use non_pic_objs
+      test "$build_libtool_libs" != yes && libobjs="$non_pic_objects"
+
+      # Create the old-style object.
+      reload_objs="$objs$old_deplibs "`$ECHO "$libobjs" | $SP2NL | $SED "/\.${libext}$/d; /\.lib$/d; $lo2o" | $NL2SP`" $reload_conv_objs" ### testsuite: skip nested quoting test
+
+      output="$obj"
+      func_execute_cmds "$reload_cmds" 'exit $?'
+
+      # Exit if we aren't doing a library object file.
+      if test -z "$libobj"; then
+       if test -n "$gentop"; then
+         func_show_eval '${RM}r "$gentop"'
+       fi
+
+       exit $EXIT_SUCCESS
+      fi
+
+      if test "$build_libtool_libs" != yes; then
+       if test -n "$gentop"; then
+         func_show_eval '${RM}r "$gentop"'
+       fi
+
+       # Create an invalid libtool object if no PIC, so that we don't
+       # accidentally link it into a program.
+       # $show "echo timestamp > $libobj"
+       # $opt_dry_run || eval "echo timestamp > $libobj" || exit $?
+       exit $EXIT_SUCCESS
+      fi
+
+      if test -n "$pic_flag" || test "$pic_mode" != default; then
+       # Only do commands if we really have different PIC objects.
+       reload_objs="$libobjs $reload_conv_objs"
+       output="$libobj"
+       func_execute_cmds "$reload_cmds" 'exit $?'
+      fi
+
+      if test -n "$gentop"; then
+       func_show_eval '${RM}r "$gentop"'
+      fi
+
+      exit $EXIT_SUCCESS
+      ;;
+
+    prog)
+      case $host in
+       *cygwin*) func_stripname '' '.exe' "$output"
+                 output=$func_stripname_result.exe;;
+      esac
+      test -n "$vinfo" && \
+       func_warning "\`-version-info' is ignored for programs"
+
+      test -n "$release" && \
+       func_warning "\`-release' is ignored for programs"
+
+      test "$preload" = yes \
+        && test "$dlopen_support" = unknown \
+       && test "$dlopen_self" = unknown \
+       && test "$dlopen_self_static" = unknown && \
+         func_warning "\`LT_INIT([dlopen])' not used. Assuming no dlopen support."
+
+      case $host in
+      *-*-rhapsody* | *-*-darwin1.[012])
+       # On Rhapsody replace the C library is the System framework
+       compile_deplibs=`$ECHO " $compile_deplibs" | $SED 's/ -lc / System.ltframework /'`
+       finalize_deplibs=`$ECHO " $finalize_deplibs" | $SED 's/ -lc / System.ltframework /'`
+       ;;
+      esac
+
+      case $host in
+      *-*-darwin*)
+       # Don't allow lazy linking, it breaks C++ global constructors
+       # But is supposedly fixed on 10.4 or later (yay!).
+       if test "$tagname" = CXX ; then
+         case ${MACOSX_DEPLOYMENT_TARGET-10.0} in
+           10.[0123])
+             func_append compile_command " ${wl}-bind_at_load"
+             func_append finalize_command " ${wl}-bind_at_load"
+           ;;
+         esac
+       fi
+       # Time to change all our "foo.ltframework" stuff back to "-framework foo"
+       compile_deplibs=`$ECHO " $compile_deplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'`
+       finalize_deplibs=`$ECHO " $finalize_deplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'`
+       ;;
+      esac
+
+
+      # move library search paths that coincide with paths to not yet
+      # installed libraries to the beginning of the library search list
+      new_libs=
+      for path in $notinst_path; do
+       case " $new_libs " in
+       *" -L$path/$objdir "*) ;;
+       *)
+         case " $compile_deplibs " in
+         *" -L$path/$objdir "*)
+           func_append new_libs " -L$path/$objdir" ;;
+         esac
+         ;;
+       esac
+      done
+      for deplib in $compile_deplibs; do
+       case $deplib in
+       -L*)
+         case " $new_libs " in
+         *" $deplib "*) ;;
+         *) func_append new_libs " $deplib" ;;
+         esac
+         ;;
+       *) func_append new_libs " $deplib" ;;
+       esac
+      done
+      compile_deplibs="$new_libs"
+
+
+      func_append compile_command " $compile_deplibs"
+      func_append finalize_command " $finalize_deplibs"
+
+      if test -n "$rpath$xrpath"; then
+       # If the user specified any rpath flags, then add them.
+       for libdir in $rpath $xrpath; do
+         # This is the magic to use -rpath.
+         case "$finalize_rpath " in
+         *" $libdir "*) ;;
+         *) func_append finalize_rpath " $libdir" ;;
+         esac
+       done
+      fi
+
+      # Now hardcode the library paths
+      rpath=
+      hardcode_libdirs=
+      for libdir in $compile_rpath $finalize_rpath; do
+       if test -n "$hardcode_libdir_flag_spec"; then
+         if test -n "$hardcode_libdir_separator"; then
+           if test -z "$hardcode_libdirs"; then
+             hardcode_libdirs="$libdir"
+           else
+             # Just accumulate the unique libdirs.
+             case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in
+             *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*)
+               ;;
+             *)
+               func_append hardcode_libdirs "$hardcode_libdir_separator$libdir"
+               ;;
+             esac
+           fi
+         else
+           eval flag=\"$hardcode_libdir_flag_spec\"
+           func_append rpath " $flag"
+         fi
+       elif test -n "$runpath_var"; then
+         case "$perm_rpath " in
+         *" $libdir "*) ;;
+         *) func_append perm_rpath " $libdir" ;;
+         esac
+       fi
+       case $host in
+       *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*)
+         testbindir=`${ECHO} "$libdir" | ${SED} -e 's*/lib$*/bin*'`
+         case :$dllsearchpath: in
+         *":$libdir:"*) ;;
+         ::) dllsearchpath=$libdir;;
+         *) func_append dllsearchpath ":$libdir";;
+         esac
+         case :$dllsearchpath: in
+         *":$testbindir:"*) ;;
+         ::) dllsearchpath=$testbindir;;
+         *) func_append dllsearchpath ":$testbindir";;
+         esac
+         ;;
+       esac
+      done
+      # Substitute the hardcoded libdirs into the rpath.
+      if test -n "$hardcode_libdir_separator" &&
+        test -n "$hardcode_libdirs"; then
+       libdir="$hardcode_libdirs"
+       eval rpath=\" $hardcode_libdir_flag_spec\"
+      fi
+      compile_rpath="$rpath"
+
+      rpath=
+      hardcode_libdirs=
+      for libdir in $finalize_rpath; do
+       if test -n "$hardcode_libdir_flag_spec"; then
+         if test -n "$hardcode_libdir_separator"; then
+           if test -z "$hardcode_libdirs"; then
+             hardcode_libdirs="$libdir"
+           else
+             # Just accumulate the unique libdirs.
+             case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in
+             *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*)
+               ;;
+             *)
+               func_append hardcode_libdirs "$hardcode_libdir_separator$libdir"
+               ;;
+             esac
+           fi
+         else
+           eval flag=\"$hardcode_libdir_flag_spec\"
+           func_append rpath " $flag"
+         fi
+       elif test -n "$runpath_var"; then
+         case "$finalize_perm_rpath " in
+         *" $libdir "*) ;;
+         *) func_append finalize_perm_rpath " $libdir" ;;
+         esac
+       fi
+      done
+      # Substitute the hardcoded libdirs into the rpath.
+      if test -n "$hardcode_libdir_separator" &&
+        test -n "$hardcode_libdirs"; then
+       libdir="$hardcode_libdirs"
+       eval rpath=\" $hardcode_libdir_flag_spec\"
+      fi
+      finalize_rpath="$rpath"
+
+      if test -n "$libobjs" && test "$build_old_libs" = yes; then
+       # Transform all the library objects into standard objects.
+       compile_command=`$ECHO "$compile_command" | $SP2NL | $SED "$lo2o" | $NL2SP`
+       finalize_command=`$ECHO "$finalize_command" | $SP2NL | $SED "$lo2o" | $NL2SP`
+      fi
+
+      func_generate_dlsyms "$outputname" "@PROGRAM@" "no"
+
+      # template prelinking step
+      if test -n "$prelink_cmds"; then
+       func_execute_cmds "$prelink_cmds" 'exit $?'
+      fi
+
+      wrappers_required=yes
+      case $host in
+      *cegcc* | *mingw32ce*)
+        # Disable wrappers for cegcc and mingw32ce hosts, we are cross compiling anyway.
+        wrappers_required=no
+        ;;
+      *cygwin* | *mingw* )
+        if test "$build_libtool_libs" != yes; then
+          wrappers_required=no
+        fi
+        ;;
+      *)
+        if test "$need_relink" = no || test "$build_libtool_libs" != yes; then
+          wrappers_required=no
+        fi
+        ;;
+      esac
+      if test "$wrappers_required" = no; then
+       # Replace the output file specification.
+       compile_command=`$ECHO "$compile_command" | $SED 's%@OUTPUT@%'"$output"'%g'`
+       link_command="$compile_command$compile_rpath"
+
+       # We have no uninstalled library dependencies, so finalize right now.
+       exit_status=0
+       func_show_eval "$link_command" 'exit_status=$?'
+
+       if test -n "$postlink_cmds"; then
+         func_to_tool_file "$output"
+         postlink_cmds=`func_echo_all "$postlink_cmds" | $SED -e 's%@OUTPUT@%'"$output"'%g' -e 's%@TOOL_OUTPUT@%'"$func_to_tool_file_result"'%g'`
+         func_execute_cmds "$postlink_cmds" 'exit $?'
+       fi
+
+       # Delete the generated files.
+       if test -f "$output_objdir/${outputname}S.${objext}"; then
+         func_show_eval '$RM "$output_objdir/${outputname}S.${objext}"'
+       fi
+
+       exit $exit_status
+      fi
+
+      if test -n "$compile_shlibpath$finalize_shlibpath"; then
+       compile_command="$shlibpath_var=\"$compile_shlibpath$finalize_shlibpath\$$shlibpath_var\" $compile_command"
+      fi
+      if test -n "$finalize_shlibpath"; then
+       finalize_command="$shlibpath_var=\"$finalize_shlibpath\$$shlibpath_var\" $finalize_command"
+      fi
+
+      compile_var=
+      finalize_var=
+      if test -n "$runpath_var"; then
+       if test -n "$perm_rpath"; then
+         # We should set the runpath_var.
+         rpath=
+         for dir in $perm_rpath; do
+           func_append rpath "$dir:"
+         done
+         compile_var="$runpath_var=\"$rpath\$$runpath_var\" "
+       fi
+       if test -n "$finalize_perm_rpath"; then
+         # We should set the runpath_var.
+         rpath=
+         for dir in $finalize_perm_rpath; do
+           func_append rpath "$dir:"
+         done
+         finalize_var="$runpath_var=\"$rpath\$$runpath_var\" "
+       fi
+      fi
+
+      if test "$no_install" = yes; then
+       # We don't need to create a wrapper script.
+       link_command="$compile_var$compile_command$compile_rpath"
+       # Replace the output file specification.
+       link_command=`$ECHO "$link_command" | $SED 's%@OUTPUT@%'"$output"'%g'`
+       # Delete the old output file.
+       $opt_dry_run || $RM $output
+       # Link the executable and exit
+       func_show_eval "$link_command" 'exit $?'
+
+       if test -n "$postlink_cmds"; then
+         func_to_tool_file "$output"
+         postlink_cmds=`func_echo_all "$postlink_cmds" | $SED -e 's%@OUTPUT@%'"$output"'%g' -e 's%@TOOL_OUTPUT@%'"$func_to_tool_file_result"'%g'`
+         func_execute_cmds "$postlink_cmds" 'exit $?'
+       fi
+
+       exit $EXIT_SUCCESS
+      fi
+
+      if test "$hardcode_action" = relink; then
+       # Fast installation is not supported
+       link_command="$compile_var$compile_command$compile_rpath"
+       relink_command="$finalize_var$finalize_command$finalize_rpath"
+
+       func_warning "this platform does not like uninstalled shared libraries"
+       func_warning "\`$output' will be relinked during installation"
+      else
+       if test "$fast_install" != no; then
+         link_command="$finalize_var$compile_command$finalize_rpath"
+         if test "$fast_install" = yes; then
+           relink_command=`$ECHO "$compile_var$compile_command$compile_rpath" | $SED 's%@OUTPUT@%\$progdir/\$file%g'`
+         else
+           # fast_install is set to needless
+           relink_command=
+         fi
+       else
+         link_command="$compile_var$compile_command$compile_rpath"
+         relink_command="$finalize_var$finalize_command$finalize_rpath"
+       fi
+      fi
+
+      # Replace the output file specification.
+      link_command=`$ECHO "$link_command" | $SED 's%@OUTPUT@%'"$output_objdir/$outputname"'%g'`
+
+      # Delete the old output files.
+      $opt_dry_run || $RM $output $output_objdir/$outputname $output_objdir/lt-$outputname
+
+      func_show_eval "$link_command" 'exit $?'
+
+      if test -n "$postlink_cmds"; then
+       func_to_tool_file "$output_objdir/$outputname"
+       postlink_cmds=`func_echo_all "$postlink_cmds" | $SED -e 's%@OUTPUT@%'"$output_objdir/$outputname"'%g' -e 's%@TOOL_OUTPUT@%'"$func_to_tool_file_result"'%g'`
+       func_execute_cmds "$postlink_cmds" 'exit $?'
+      fi
+
+      # Now create the wrapper script.
+      func_verbose "creating $output"
+
+      # Quote the relink command for shipping.
+      if test -n "$relink_command"; then
+       # Preserve any variables that may affect compiler behavior
+       for var in $variables_saved_for_relink; do
+         if eval test -z \"\${$var+set}\"; then
+           relink_command="{ test -z \"\${$var+set}\" || $lt_unset $var || { $var=; export $var; }; }; $relink_command"
+         elif eval var_value=\$$var; test -z "$var_value"; then
+           relink_command="$var=; export $var; $relink_command"
+         else
+           func_quote_for_eval "$var_value"
+           relink_command="$var=$func_quote_for_eval_result; export $var; $relink_command"
+         fi
+       done
+       relink_command="(cd `pwd`; $relink_command)"
+       relink_command=`$ECHO "$relink_command" | $SED "$sed_quote_subst"`
+      fi
+
+      # Only actually do things if not in dry run mode.
+      $opt_dry_run || {
+       # win32 will think the script is a binary if it has
+       # a .exe suffix, so we strip it off here.
+       case $output in
+         *.exe) func_stripname '' '.exe' "$output"
+                output=$func_stripname_result ;;
+       esac
+       # test for cygwin because mv fails w/o .exe extensions
+       case $host in
+         *cygwin*)
+           exeext=.exe
+           func_stripname '' '.exe' "$outputname"
+           outputname=$func_stripname_result ;;
+         *) exeext= ;;
+       esac
+       case $host in
+         *cygwin* | *mingw* )
+           func_dirname_and_basename "$output" "" "."
+           output_name=$func_basename_result
+           output_path=$func_dirname_result
+           cwrappersource="$output_path/$objdir/lt-$output_name.c"
+           cwrapper="$output_path/$output_name.exe"
+           $RM $cwrappersource $cwrapper
+           trap "$RM $cwrappersource $cwrapper; exit $EXIT_FAILURE" 1 2 15
+
+           func_emit_cwrapperexe_src > $cwrappersource
+
+           # The wrapper executable is built using the $host compiler,
+           # because it contains $host paths and files. If cross-
+           # compiling, it, like the target executable, must be
+           # executed on the $host or under an emulation environment.
+           $opt_dry_run || {
+             $LTCC $LTCFLAGS -o $cwrapper $cwrappersource
+             $STRIP $cwrapper
+           }
+
+           # Now, create the wrapper script for func_source use:
+           func_ltwrapper_scriptname $cwrapper
+           $RM $func_ltwrapper_scriptname_result
+           trap "$RM $func_ltwrapper_scriptname_result; exit $EXIT_FAILURE" 1 2 15
+           $opt_dry_run || {
+             # note: this script will not be executed, so do not chmod.
+             if test "x$build" = "x$host" ; then
+               $cwrapper --lt-dump-script > $func_ltwrapper_scriptname_result
+             else
+               func_emit_wrapper no > $func_ltwrapper_scriptname_result
+             fi
+           }
+         ;;
+         * )
+           $RM $output
+           trap "$RM $output; exit $EXIT_FAILURE" 1 2 15
+
+           func_emit_wrapper no > $output
+           chmod +x $output
+         ;;
+       esac
+      }
+      exit $EXIT_SUCCESS
+      ;;
+    esac
+
+    # See if we need to build an old-fashioned archive.
+    for oldlib in $oldlibs; do
+
+      if test "$build_libtool_libs" = convenience; then
+       oldobjs="$libobjs_save $symfileobj"
+       addlibs="$convenience"
+       build_libtool_libs=no
+      else
+       if test "$build_libtool_libs" = module; then
+         oldobjs="$libobjs_save"
+         build_libtool_libs=no
+       else
+         oldobjs="$old_deplibs $non_pic_objects"
+         if test "$preload" = yes && test -f "$symfileobj"; then
+           func_append oldobjs " $symfileobj"
+         fi
+       fi
+       addlibs="$old_convenience"
+      fi
+
+      if test -n "$addlibs"; then
+       gentop="$output_objdir/${outputname}x"
+       func_append generated " $gentop"
+
+       func_extract_archives $gentop $addlibs
+       func_append oldobjs " $func_extract_archives_result"
+      fi
+
+      # Do each command in the archive commands.
+      if test -n "$old_archive_from_new_cmds" && test "$build_libtool_libs" = yes; then
+       cmds=$old_archive_from_new_cmds
+      else
+
+       # Add any objects from preloaded convenience libraries
+       if test -n "$dlprefiles"; then
+         gentop="$output_objdir/${outputname}x"
+         func_append generated " $gentop"
+
+         func_extract_archives $gentop $dlprefiles
+         func_append oldobjs " $func_extract_archives_result"
+       fi
+
+       # POSIX demands no paths to be encoded in archives.  We have
+       # to avoid creating archives with duplicate basenames if we
+       # might have to extract them afterwards, e.g., when creating a
+       # static archive out of a convenience library, or when linking
+       # the entirety of a libtool archive into another (currently
+       # not supported by libtool).
+       if (for obj in $oldobjs
+           do
+             func_basename "$obj"
+             $ECHO "$func_basename_result"
+           done | sort | sort -uc >/dev/null 2>&1); then
+         :
+       else
+         echo "copying selected object files to avoid basename conflicts..."
+         gentop="$output_objdir/${outputname}x"
+         func_append generated " $gentop"
+         func_mkdir_p "$gentop"
+         save_oldobjs=$oldobjs
+         oldobjs=
+         counter=1
+         for obj in $save_oldobjs
+         do
+           func_basename "$obj"
+           objbase="$func_basename_result"
+           case " $oldobjs " in
+           " ") oldobjs=$obj ;;
+           *[\ /]"$objbase "*)
+             while :; do
+               # Make sure we don't pick an alternate name that also
+               # overlaps.
+               newobj=lt$counter-$objbase
+               func_arith $counter + 1
+               counter=$func_arith_result
+               case " $oldobjs " in
+               *[\ /]"$newobj "*) ;;
+               *) if test ! -f "$gentop/$newobj"; then break; fi ;;
+               esac
+             done
+             func_show_eval "ln $obj $gentop/$newobj || cp $obj $gentop/$newobj"
+             func_append oldobjs " $gentop/$newobj"
+             ;;
+           *) func_append oldobjs " $obj" ;;
+           esac
+         done
+       fi
+       func_to_tool_file "$oldlib" func_convert_file_msys_to_w32
+       tool_oldlib=$func_to_tool_file_result
+       eval cmds=\"$old_archive_cmds\"
+
+       func_len " $cmds"
+       len=$func_len_result
+       if test "$len" -lt "$max_cmd_len" || test "$max_cmd_len" -le -1; then
+         cmds=$old_archive_cmds
+       elif test -n "$archiver_list_spec"; then
+         func_verbose "using command file archive linking..."
+         for obj in $oldobjs
+         do
+           func_to_tool_file "$obj"
+           $ECHO "$func_to_tool_file_result"
+         done > $output_objdir/$libname.libcmd
+         func_to_tool_file "$output_objdir/$libname.libcmd"
+         oldobjs=" $archiver_list_spec$func_to_tool_file_result"
+         cmds=$old_archive_cmds
+       else
+         # the command line is too long to link in one step, link in parts
+         func_verbose "using piecewise archive linking..."
+         save_RANLIB=$RANLIB
+         RANLIB=:
+         objlist=
+         concat_cmds=
+         save_oldobjs=$oldobjs
+         oldobjs=
+         # Is there a better way of finding the last object in the list?
+         for obj in $save_oldobjs
+         do
+           last_oldobj=$obj
+         done
+         eval test_cmds=\"$old_archive_cmds\"
+         func_len " $test_cmds"
+         len0=$func_len_result
+         len=$len0
+         for obj in $save_oldobjs
+         do
+           func_len " $obj"
+           func_arith $len + $func_len_result
+           len=$func_arith_result
+           func_append objlist " $obj"
+           if test "$len" -lt "$max_cmd_len"; then
+             :
+           else
+             # the above command should be used before it gets too long
+             oldobjs=$objlist
+             if test "$obj" = "$last_oldobj" ; then
+               RANLIB=$save_RANLIB
+             fi
+             test -z "$concat_cmds" || concat_cmds=$concat_cmds~
+             eval concat_cmds=\"\${concat_cmds}$old_archive_cmds\"
+             objlist=
+             len=$len0
+           fi
+         done
+         RANLIB=$save_RANLIB
+         oldobjs=$objlist
+         if test "X$oldobjs" = "X" ; then
+           eval cmds=\"\$concat_cmds\"
+         else
+           eval cmds=\"\$concat_cmds~\$old_archive_cmds\"
+         fi
+       fi
+      fi
+      func_execute_cmds "$cmds" 'exit $?'
+    done
+
+    test -n "$generated" && \
+      func_show_eval "${RM}r$generated"
+
+    # Now create the libtool archive.
+    case $output in
+    *.la)
+      old_library=
+      test "$build_old_libs" = yes && old_library="$libname.$libext"
+      func_verbose "creating $output"
+
+      # Preserve any variables that may affect compiler behavior
+      for var in $variables_saved_for_relink; do
+       if eval test -z \"\${$var+set}\"; then
+         relink_command="{ test -z \"\${$var+set}\" || $lt_unset $var || { $var=; export $var; }; }; $relink_command"
+       elif eval var_value=\$$var; test -z "$var_value"; then
+         relink_command="$var=; export $var; $relink_command"
+       else
+         func_quote_for_eval "$var_value"
+         relink_command="$var=$func_quote_for_eval_result; export $var; $relink_command"
+       fi
+      done
+      # Quote the link command for shipping.
+      relink_command="(cd `pwd`; $SHELL $progpath $preserve_args --mode=relink $libtool_args @inst_prefix_dir@)"
+      relink_command=`$ECHO "$relink_command" | $SED "$sed_quote_subst"`
+      if test "$hardcode_automatic" = yes ; then
+       relink_command=
+      fi
+
+      # Only create the output if not a dry run.
+      $opt_dry_run || {
+       for installed in no yes; do
+         if test "$installed" = yes; then
+           if test -z "$install_libdir"; then
+             break
+           fi
+           output="$output_objdir/$outputname"i
+           # Replace all uninstalled libtool libraries with the installed ones
+           newdependency_libs=
+           for deplib in $dependency_libs; do
+             case $deplib in
+             *.la)
+               func_basename "$deplib"
+               name="$func_basename_result"
+               func_resolve_sysroot "$deplib"
+               eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $func_resolve_sysroot_result`
+               test -z "$libdir" && \
+                 func_fatal_error "\`$deplib' is not a valid libtool archive"
+               func_append newdependency_libs " ${lt_sysroot:+=}$libdir/$name"
+               ;;
+             -L*)
+               func_stripname -L '' "$deplib"
+               func_replace_sysroot "$func_stripname_result"
+               func_append newdependency_libs " -L$func_replace_sysroot_result"
+               ;;
+             -R*)
+               func_stripname -R '' "$deplib"
+               func_replace_sysroot "$func_stripname_result"
+               func_append newdependency_libs " -R$func_replace_sysroot_result"
+               ;;
+             *) func_append newdependency_libs " $deplib" ;;
+             esac
+           done
+           dependency_libs="$newdependency_libs"
+           newdlfiles=
+
+           for lib in $dlfiles; do
+             case $lib in
+             *.la)
+               func_basename "$lib"
+               name="$func_basename_result"
+               eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $lib`
+               test -z "$libdir" && \
+                 func_fatal_error "\`$lib' is not a valid libtool archive"
+               func_append newdlfiles " ${lt_sysroot:+=}$libdir/$name"
+               ;;
+             *) func_append newdlfiles " $lib" ;;
+             esac
+           done
+           dlfiles="$newdlfiles"
+           newdlprefiles=
+           for lib in $dlprefiles; do
+             case $lib in
+             *.la)
+               # Only pass preopened files to the pseudo-archive (for
+               # eventual linking with the app. that links it) if we
+               # didn't already link the preopened objects directly into
+               # the library:
+               func_basename "$lib"
+               name="$func_basename_result"
+               eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $lib`
+               test -z "$libdir" && \
+                 func_fatal_error "\`$lib' is not a valid libtool archive"
+               func_append newdlprefiles " ${lt_sysroot:+=}$libdir/$name"
+               ;;
+             esac
+           done
+           dlprefiles="$newdlprefiles"
+         else
+           newdlfiles=
+           for lib in $dlfiles; do
+             case $lib in
+               [\\/]* | [A-Za-z]:[\\/]*) abs="$lib" ;;
+               *) abs=`pwd`"/$lib" ;;
+             esac
+             func_append newdlfiles " $abs"
+           done
+           dlfiles="$newdlfiles"
+           newdlprefiles=
+           for lib in $dlprefiles; do
+             case $lib in
+               [\\/]* | [A-Za-z]:[\\/]*) abs="$lib" ;;
+               *) abs=`pwd`"/$lib" ;;
+             esac
+             func_append newdlprefiles " $abs"
+           done
+           dlprefiles="$newdlprefiles"
+         fi
+         $RM $output
+         # place dlname in correct position for cygwin
+         # In fact, it would be nice if we could use this code for all target
+         # systems that can't hard-code library paths into their executables
+         # and that have no shared library path variable independent of PATH,
+         # but it turns out we can't easily determine that from inspecting
+         # libtool variables, so we have to hard-code the OSs to which it
+         # applies here; at the moment, that means platforms that use the PE
+         # object format with DLL files.  See the long comment at the top of
+         # tests/bindir.at for full details.
+         tdlname=$dlname
+         case $host,$output,$installed,$module,$dlname in
+           *cygwin*,*lai,yes,no,*.dll | *mingw*,*lai,yes,no,*.dll | *cegcc*,*lai,yes,no,*.dll)
+             # If a -bindir argument was supplied, place the dll there.
+             if test "x$bindir" != x ;
+             then
+               func_relative_path "$install_libdir" "$bindir"
+               tdlname=$func_relative_path_result$dlname
+             else
+               # Otherwise fall back on heuristic.
+               tdlname=../bin/$dlname
+             fi
+             ;;
+         esac
+         $ECHO > $output "\
+# $outputname - a libtool library file
+# Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION
+#
+# Please DO NOT delete this file!
+# It is necessary for linking the library.
+
+# The name that we can dlopen(3).
+dlname='$tdlname'
+
+# Names of this library.
+library_names='$library_names'
+
+# The name of the static archive.
+old_library='$old_library'
+
+# Linker flags that can not go in dependency_libs.
+inherited_linker_flags='$new_inherited_linker_flags'
+
+# Libraries that this one depends upon.
+dependency_libs='$dependency_libs'
+
+# Names of additional weak libraries provided by this library
+weak_library_names='$weak_libs'
+
+# Version information for $libname.
+current=$current
+age=$age
+revision=$revision
+
+# Is this an already installed library?
+installed=$installed
+
+# Should we warn about portability when linking against -modules?
+shouldnotlink=$module
+
+# Files to dlopen/dlpreopen
+dlopen='$dlfiles'
+dlpreopen='$dlprefiles'
+
+# Directory that this library needs to be installed in:
+libdir='$install_libdir'"
+         if test "$installed" = no && test "$need_relink" = yes; then
+           $ECHO >> $output "\
+relink_command=\"$relink_command\""
+         fi
+       done
+      }
+
+      # Do a symbolic link so that the libtool archive can be found in
+      # LD_LIBRARY_PATH before the program is installed.
+      func_show_eval '( cd "$output_objdir" && $RM "$outputname" && $LN_S "../$outputname" "$outputname" )' 'exit $?'
+      ;;
+    esac
+    exit $EXIT_SUCCESS
+}
+
+{ test "$opt_mode" = link || test "$opt_mode" = relink; } &&
+    func_mode_link ${1+"$@"}
+
+
+# func_mode_uninstall arg...
+func_mode_uninstall ()
+{
+    $opt_debug
+    RM="$nonopt"
+    files=
+    rmforce=
+    exit_status=0
+
+    # This variable tells wrapper scripts just to set variables rather
+    # than running their programs.
+    libtool_install_magic="$magic"
+
+    for arg
+    do
+      case $arg in
+      -f) func_append RM " $arg"; rmforce=yes ;;
+      -*) func_append RM " $arg" ;;
+      *) func_append files " $arg" ;;
+      esac
+    done
+
+    test -z "$RM" && \
+      func_fatal_help "you must specify an RM program"
+
+    rmdirs=
+
+    for file in $files; do
+      func_dirname "$file" "" "."
+      dir="$func_dirname_result"
+      if test "X$dir" = X.; then
+       odir="$objdir"
+      else
+       odir="$dir/$objdir"
+      fi
+      func_basename "$file"
+      name="$func_basename_result"
+      test "$opt_mode" = uninstall && odir="$dir"
+
+      # Remember odir for removal later, being careful to avoid duplicates
+      if test "$opt_mode" = clean; then
+       case " $rmdirs " in
+         *" $odir "*) ;;
+         *) func_append rmdirs " $odir" ;;
+       esac
+      fi
+
+      # Don't error if the file doesn't exist and rm -f was used.
+      if { test -L "$file"; } >/dev/null 2>&1 ||
+        { test -h "$file"; } >/dev/null 2>&1 ||
+        test -f "$file"; then
+       :
+      elif test -d "$file"; then
+       exit_status=1
+       continue
+      elif test "$rmforce" = yes; then
+       continue
+      fi
+
+      rmfiles="$file"
+
+      case $name in
+      *.la)
+       # Possibly a libtool archive, so verify it.
+       if func_lalib_p "$file"; then
+         func_source $dir/$name
+
+         # Delete the libtool libraries and symlinks.
+         for n in $library_names; do
+           func_append rmfiles " $odir/$n"
+         done
+         test -n "$old_library" && func_append rmfiles " $odir/$old_library"
+
+         case "$opt_mode" in
+         clean)
+           case " $library_names " in
+           *" $dlname "*) ;;
+           *) test -n "$dlname" && func_append rmfiles " $odir/$dlname" ;;
+           esac
+           test -n "$libdir" && func_append rmfiles " $odir/$name $odir/${name}i"
+           ;;
+         uninstall)
+           if test -n "$library_names"; then
+             # Do each command in the postuninstall commands.
+             func_execute_cmds "$postuninstall_cmds" 'test "$rmforce" = yes || exit_status=1'
+           fi
+
+           if test -n "$old_library"; then
+             # Do each command in the old_postuninstall commands.
+             func_execute_cmds "$old_postuninstall_cmds" 'test "$rmforce" = yes || exit_status=1'
+           fi
+           # FIXME: should reinstall the best remaining shared library.
+           ;;
+         esac
+       fi
+       ;;
+
+      *.lo)
+       # Possibly a libtool object, so verify it.
+       if func_lalib_p "$file"; then
+
+         # Read the .lo file
+         func_source $dir/$name
+
+         # Add PIC object to the list of files to remove.
+         if test -n "$pic_object" &&
+            test "$pic_object" != none; then
+           func_append rmfiles " $dir/$pic_object"
+         fi
+
+         # Add non-PIC object to the list of files to remove.
+         if test -n "$non_pic_object" &&
+            test "$non_pic_object" != none; then
+           func_append rmfiles " $dir/$non_pic_object"
+         fi
+       fi
+       ;;
+
+      *)
+       if test "$opt_mode" = clean ; then
+         noexename=$name
+         case $file in
+         *.exe)
+           func_stripname '' '.exe' "$file"
+           file=$func_stripname_result
+           func_stripname '' '.exe' "$name"
+           noexename=$func_stripname_result
+           # $file with .exe has already been added to rmfiles,
+           # add $file without .exe
+           func_append rmfiles " $file"
+           ;;
+         esac
+         # Do a test to see if this is a libtool program.
+         if func_ltwrapper_p "$file"; then
+           if func_ltwrapper_executable_p "$file"; then
+             func_ltwrapper_scriptname "$file"
+             relink_command=
+             func_source $func_ltwrapper_scriptname_result
+             func_append rmfiles " $func_ltwrapper_scriptname_result"
+           else
+             relink_command=
+             func_source $dir/$noexename
+           fi
+
+           # note $name still contains .exe if it was in $file originally
+           # as does the version of $file that was added into $rmfiles
+           func_append rmfiles " $odir/$name $odir/${name}S.${objext}"
+           if test "$fast_install" = yes && test -n "$relink_command"; then
+             func_append rmfiles " $odir/lt-$name"
+           fi
+           if test "X$noexename" != "X$name" ; then
+             func_append rmfiles " $odir/lt-${noexename}.c"
+           fi
+         fi
+       fi
+       ;;
+      esac
+      func_show_eval "$RM $rmfiles" 'exit_status=1'
+    done
+
+    # Try to remove the ${objdir}s in the directories where we deleted files
+    for dir in $rmdirs; do
+      if test -d "$dir"; then
+       func_show_eval "rmdir $dir >/dev/null 2>&1"
+      fi
+    done
+
+    exit $exit_status
+}
+
+{ test "$opt_mode" = uninstall || test "$opt_mode" = clean; } &&
+    func_mode_uninstall ${1+"$@"}
+
+test -z "$opt_mode" && {
+  help="$generic_help"
+  func_fatal_help "you must specify a MODE"
+}
+
+test -z "$exec_cmd" && \
+  func_fatal_help "invalid operation mode \`$opt_mode'"
+
+if test -n "$exec_cmd"; then
+  eval exec "$exec_cmd"
+  exit $EXIT_FAILURE
+fi
+
+exit $exit_status
+
+
+# The TAGs below are defined such that we never get into a situation
+# in which we disable both kinds of libraries.  Given conflicting
+# choices, we go for a static library, that is the most portable,
+# since we can't tell whether shared libraries were disabled because
+# the user asked for that or because the platform doesn't support
+# them.  This is particularly important on AIX, because we don't
+# support having both static and shared libraries enabled at the same
+# time on that platform, so we default to a shared-only configuration.
+# If a disable-shared tag is given, we'll fallback to a static-only
+# configuration.  But we'll never go from static-only to shared-only.
+
+# ### BEGIN LIBTOOL TAG CONFIG: disable-shared
+build_libtool_libs=no
+build_old_libs=yes
+# ### END LIBTOOL TAG CONFIG: disable-shared
+
+# ### BEGIN LIBTOOL TAG CONFIG: disable-static
+build_old_libs=`case $build_libtool_libs in yes) echo no;; *) echo yes;; esac`
+# ### END LIBTOOL TAG CONFIG: disable-static
+
+# Local Variables:
+# mode:shell-script
+# sh-indentation:2
+# End:
+# vi:sw=2
+
diff --git a/m4/acx_pthread.m4 b/m4/acx_pthread.m4
new file mode 100644 (file)
index 0000000..7ac8ffd
--- /dev/null
@@ -0,0 +1,280 @@
+##### http://autoconf-archive.cryp.to/acx_pthread.html
+#
+# SYNOPSIS
+#
+#   ACX_PTHREAD([ACTION-IF-FOUND[, ACTION-IF-NOT-FOUND]])
+#
+# DESCRIPTION
+#
+#   This macro figures out how to build C programs using POSIX threads.
+#   It sets the PTHREAD_LIBS output variable to the threads library and
+#   linker flags, and the PTHREAD_CFLAGS output variable to any special
+#   C compiler flags that are needed. (The user can also force certain
+#   compiler flags/libs to be tested by setting these environment
+#   variables.)
+#
+#   Also sets PTHREAD_CC to any special C compiler that is needed for
+#   multi-threaded programs (defaults to the value of CC otherwise).
+#   (This is necessary on AIX to use the special cc_r compiler alias.)
+#
+#   NOTE: You are assumed to not only compile your program with these
+#   flags, but also link it with them as well. e.g. you should link
+#   with $PTHREAD_CC $CFLAGS $PTHREAD_CFLAGS $LDFLAGS ... $PTHREAD_LIBS
+#   $LIBS
+#
+#   If you are only building threads programs, you may wish to use
+#   these variables in your default LIBS, CFLAGS, and CC:
+#
+#          LIBS="$PTHREAD_LIBS $LIBS"
+#          CFLAGS="$CFLAGS $PTHREAD_CFLAGS"
+#          CC="$PTHREAD_CC"
+#
+#   In addition, if the PTHREAD_CREATE_JOINABLE thread-attribute
+#   constant has a nonstandard name, defines PTHREAD_CREATE_JOINABLE to
+#   that name (e.g. PTHREAD_CREATE_UNDETACHED on AIX).
+#
+#   ACTION-IF-FOUND is a list of shell commands to run if a threads
+#   library is found, and ACTION-IF-NOT-FOUND is a list of commands to
+#   run it if it is not found. If ACTION-IF-FOUND is not specified, the
+#   default action will define HAVE_PTHREAD.
+#
+#   Please let the authors know if this macro fails on any platform, or
+#   if you have any other suggestions or comments. This macro was based
+#   on work by SGJ on autoconf scripts for FFTW (http://www.fftw.org/)
+#   (with help from M. Frigo), as well as ac_pthread and hb_pthread
+#   macros posted by Alejandro Forero Cuervo to the autoconf macro
+#   repository. We are also grateful for the helpful feedback of
+#   numerous users.
+#
+# LAST MODIFICATION
+#
+#   2006-05-29
+#
+# COPYLEFT
+#
+#   Copyright (c) 2006 Steven G. Johnson <stevenj@alum.mit.edu>
+#
+#   This program is free software; you can redistribute it and/or
+#   modify it under the terms of the GNU General Public License as
+#   published by the Free Software Foundation; either version 2 of the
+#   License, or (at your option) any later version.
+#
+#   This program is distributed in the hope that it will be useful, but
+#   WITHOUT ANY WARRANTY; without even the implied warranty of
+#   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+#   General Public License for more details.
+#
+#   You should have received a copy of the GNU General Public License
+#   along with this program; if not, write to the Free Software
+#   Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
+#   02111-1307, USA.
+#
+#   As a special exception, the respective Autoconf Macro's copyright
+#   owner gives unlimited permission to copy, distribute and modify the
+#   configure scripts that are the output of Autoconf when processing
+#   the Macro. You need not follow the terms of the GNU General Public
+#   License when using or distributing such scripts, even though
+#   portions of the text of the Macro appear in them. The GNU General
+#   Public License (GPL) does govern all other use of the material that
+#   constitutes the Autoconf Macro.
+#
+#   This special exception to the GPL applies to versions of the
+#   Autoconf Macro released by the Autoconf Macro Archive. When you
+#   make and distribute a modified version of the Autoconf Macro, you
+#   may extend this special exception to the GPL to apply to your
+#   modified version as well.
+
+AC_DEFUN([ACX_PTHREAD], [
+AC_REQUIRE([AC_CANONICAL_HOST])
+AC_LANG_SAVE
+AC_LANG_C
+acx_pthread_ok=no
+
+# We used to check for pthread.h first, but this fails if pthread.h
+# requires special compiler flags (e.g. on True64 or Sequent).
+# It gets checked for in the link test anyway.
+
+# First of all, check if the user has set any of the PTHREAD_LIBS,
+# etcetera environment variables, and if threads linking works using
+# them:
+if test x"$PTHREAD_LIBS$PTHREAD_CFLAGS" != x; then
+        save_CFLAGS="$CFLAGS"
+        CFLAGS="$CFLAGS $PTHREAD_CFLAGS"
+        save_LIBS="$LIBS"
+        LIBS="$PTHREAD_LIBS $LIBS"
+        AC_MSG_CHECKING([for pthread_join in LIBS=$PTHREAD_LIBS with CFLAGS=$PTHREAD_CFLAGS])
+        AC_TRY_LINK_FUNC(pthread_join, acx_pthread_ok=yes)
+        AC_MSG_RESULT($acx_pthread_ok)
+        if test x"$acx_pthread_ok" = xno; then
+                PTHREAD_LIBS=""
+                PTHREAD_CFLAGS=""
+        fi
+        LIBS="$save_LIBS"
+        CFLAGS="$save_CFLAGS"
+fi
+
+# We must check for the threads library under a number of different
+# names; the ordering is very important because some systems
+# (e.g. DEC) have both -lpthread and -lpthreads, where one of the
+# libraries is broken (non-POSIX).
+
+# Create a list of thread flags to try.  Items starting with a "-" are
+# C compiler flags, and other items are library names, except for "none"
+# which indicates that we try without any flags at all, and "pthread-config"
+# which is a program returning the flags for the Pth emulation library.
+
+acx_pthread_flags="pthreads none -Kthread -kthread lthread -pthread -pthreads -mthreads pthread --thread-safe -mt pthread-config"
+
+# The ordering *is* (sometimes) important.  Some notes on the
+# individual items follow:
+
+# pthreads: AIX (must check this before -lpthread)
+# none: in case threads are in libc; should be tried before -Kthread and
+#       other compiler flags to prevent continual compiler warnings
+# -Kthread: Sequent (threads in libc, but -Kthread needed for pthread.h)
+# -kthread: FreeBSD kernel threads (preferred to -pthread since SMP-able)
+# lthread: LinuxThreads port on FreeBSD (also preferred to -pthread)
+# -pthread: Linux/gcc (kernel threads), BSD/gcc (userland threads)
+# -pthreads: Solaris/gcc
+# -mthreads: Mingw32/gcc, Lynx/gcc
+# -mt: Sun Workshop C (may only link SunOS threads [-lthread], but it
+#      doesn't hurt to check since this sometimes defines pthreads too;
+#      also defines -D_REENTRANT)
+#      ... -mt is also the pthreads flag for HP/aCC
+# pthread: Linux, etcetera
+# --thread-safe: KAI C++
+# pthread-config: use pthread-config program (for GNU Pth library)
+
+case "${host_cpu}-${host_os}" in
+        *solaris*)
+
+        # On Solaris (at least, for some versions), libc contains stubbed
+        # (non-functional) versions of the pthreads routines, so link-based
+        # tests will erroneously succeed.  (We need to link with -pthreads/-mt/
+        # -lpthread.)  (The stubs are missing pthread_cleanup_push, or rather
+        # a function called by this macro, so we could check for that, but
+        # who knows whether they'll stub that too in a future libc.)  So,
+        # we'll just look for -pthreads and -lpthread first:
+
+        acx_pthread_flags="-pthreads pthread -mt -pthread $acx_pthread_flags"
+        ;;
+esac
+
+if test x"$acx_pthread_ok" = xno; then
+for flag in $acx_pthread_flags; do
+
+        case $flag in
+                none)
+                AC_MSG_CHECKING([whether pthreads work without any flags])
+                ;;
+
+                -*)
+                AC_MSG_CHECKING([whether pthreads work with $flag])
+                PTHREAD_CFLAGS="$flag"
+                ;;
+
+               pthread-config)
+               AC_CHECK_PROG(acx_pthread_config, pthread-config, yes, no)
+               if test x"$acx_pthread_config" = xno; then continue; fi
+               PTHREAD_CFLAGS="`pthread-config --cflags`"
+               PTHREAD_LIBS="`pthread-config --ldflags` `pthread-config --libs`"
+               ;;
+
+                *)
+                AC_MSG_CHECKING([for the pthreads library -l$flag])
+                PTHREAD_LIBS="-l$flag"
+                ;;
+        esac
+
+        save_LIBS="$LIBS"
+        save_CFLAGS="$CFLAGS"
+        LIBS="$PTHREAD_LIBS $LIBS"
+        CFLAGS="$CFLAGS $PTHREAD_CFLAGS"
+
+        # Check for various functions.  We must include pthread.h,
+        # since some functions may be macros.  (On the Sequent, we
+        # need a special flag -Kthread to make this header compile.)
+        # We check for pthread_join because it is in -lpthread on IRIX
+        # while pthread_create is in libc.  We check for pthread_attr_init
+        # due to DEC craziness with -lpthreads.  We check for
+        # pthread_cleanup_push because it is one of the few pthread
+        # functions on Solaris that doesn't have a non-functional libc stub.
+        # We try pthread_create on general principles.
+        AC_TRY_LINK([#include <pthread.h>],
+                    [pthread_t th; pthread_join(th, 0);
+                     pthread_attr_init(0); pthread_cleanup_push(0, 0);
+                     pthread_create(0,0,0,0); pthread_cleanup_pop(0); ],
+                    [acx_pthread_ok=yes])
+
+        LIBS="$save_LIBS"
+        CFLAGS="$save_CFLAGS"
+
+        AC_MSG_RESULT($acx_pthread_ok)
+        if test "x$acx_pthread_ok" = xyes; then
+                break;
+        fi
+
+        PTHREAD_LIBS=""
+        PTHREAD_CFLAGS=""
+done
+fi
+
+# Various other checks:
+if test "x$acx_pthread_ok" = xyes; then
+        save_LIBS="$LIBS"
+        LIBS="$PTHREAD_LIBS $LIBS"
+        save_CFLAGS="$CFLAGS"
+        CFLAGS="$CFLAGS $PTHREAD_CFLAGS"
+
+        # Detect AIX lossage: JOINABLE attribute is called UNDETACHED.
+       AC_MSG_CHECKING([for joinable pthread attribute])
+       attr_name=unknown
+       for attr in PTHREAD_CREATE_JOINABLE PTHREAD_CREATE_UNDETACHED; do
+           AC_TRY_LINK([#include <pthread.h>], [int attr=$attr; return attr;],
+                        [attr_name=$attr; break])
+       done
+        AC_MSG_RESULT($attr_name)
+        if test "$attr_name" != PTHREAD_CREATE_JOINABLE; then
+            AC_DEFINE_UNQUOTED(PTHREAD_CREATE_JOINABLE, $attr_name,
+                               [Define to necessary symbol if this constant
+                                uses a non-standard name on your system.])
+        fi
+
+        AC_MSG_CHECKING([if more special flags are required for pthreads])
+        flag=no
+        case "${host_cpu}-${host_os}" in
+            *-aix* | *-freebsd* | *-darwin*) flag="-D_THREAD_SAFE";;
+            *solaris* | *-osf* | *-hpux*) flag="-D_REENTRANT";;
+        esac
+        AC_MSG_RESULT(${flag})
+        if test "x$flag" != xno; then
+            PTHREAD_CFLAGS="$flag $PTHREAD_CFLAGS"
+        fi
+
+        LIBS="$save_LIBS"
+        CFLAGS="$save_CFLAGS"
+
+        # More AIX lossage: must compile with xlc_r or cc_r
+       if test x"$GCC" != xyes; then
+          AC_CHECK_PROGS(PTHREAD_CC, xlc_r cc_r, ${CC})
+        else
+          PTHREAD_CC=$CC
+       fi
+else
+        PTHREAD_CC="$CC"
+fi
+
+AC_SUBST(PTHREAD_LIBS)
+AC_SUBST(PTHREAD_CFLAGS)
+AC_SUBST(PTHREAD_CC)
+
+# Finally, execute ACTION-IF-FOUND/ACTION-IF-NOT-FOUND:
+if test x"$acx_pthread_ok" = xyes; then
+        ifelse([$1],,AC_DEFINE(HAVE_PTHREAD,1,[Define if you have POSIX threads libraries and header files.]),[$1])
+        :
+else
+        acx_pthread_ok=no
+        $2
+fi
+AC_LANG_RESTORE
+])dnl ACX_PTHREAD
diff --git a/m4/define-dir.m4 b/m4/define-dir.m4
new file mode 100644 (file)
index 0000000..5e8c5ae
--- /dev/null
@@ -0,0 +1,34 @@
+dnl @synopsis AC_DEFINE_DIR(VARNAME, DIR [, DESCRIPTION])
+dnl
+dnl This macro sets VARNAME to the expansion of the DIR variable,
+dnl taking care of fixing up ${prefix} and such.
+dnl
+dnl VARNAME is then offered as both an output variable and a C
+dnl preprocessor symbol.
+dnl
+dnl Example:
+dnl
+dnl    AC_DEFINE_DIR([DATADIR], [datadir], [Where data are placed to.])
+dnl
+dnl @category Misc
+dnl @author Stepan Kasal <kasal@ucw.cz>
+dnl @author Andreas Schwab <schwab@suse.de>
+dnl @author Guido Draheim <guidod@gmx.de>
+dnl @author Alexandre Oliva
+dnl @version 2005-07-29
+dnl @license AllPermissive
+
+AC_DEFUN([AC_DEFINE_DIR], [
+  prefix_NONE=
+  exec_prefix_NONE=
+  test "x$prefix" = xNONE && prefix_NONE=yes && prefix=$ac_default_prefix
+  test "x$exec_prefix" = xNONE && exec_prefix_NONE=yes && exec_prefix=$prefix
+dnl In Autoconf 2.60, ${datadir} refers to ${datarootdir}, which in turn
+dnl refers to ${prefix}.  Thus we have to use `eval' twice.
+  eval ac_define_dir="\"[$]$2\""
+  eval ac_define_dir="\"$ac_define_dir\""
+  AC_SUBST($1, "$ac_define_dir")
+  AC_DEFINE_UNQUOTED($1, "$ac_define_dir", [$3])
+  test "$prefix_NONE" && prefix=NONE
+  test "$exec_prefix_NONE" && exec_prefix=NONE
+])
diff --git a/m4/gtk-doc.m4 b/m4/gtk-doc.m4
new file mode 100644 (file)
index 0000000..0ada151
--- /dev/null
@@ -0,0 +1,67 @@
+dnl -*- mode: autoconf -*-
+
+# serial 1
+
+dnl Usage:
+dnl   GTK_DOC_CHECK([minimum-gtk-doc-version])
+AC_DEFUN([GTK_DOC_CHECK],
+[
+  AC_REQUIRE([PKG_PROG_PKG_CONFIG])
+  AC_BEFORE([AC_PROG_LIBTOOL],[$0])dnl setup libtool first
+  AC_BEFORE([AM_PROG_LIBTOOL],[$0])dnl setup libtool first
+
+  dnl check for tools we added during development
+  AC_PATH_PROG([GTKDOC_CHECK],[gtkdoc-check])
+  AC_PATH_PROGS([GTKDOC_REBASE],[gtkdoc-rebase],[true])
+  AC_PATH_PROG([GTKDOC_MKPDF],[gtkdoc-mkpdf])
+
+  dnl for overriding the documentation installation directory
+  AC_ARG_WITH([html-dir],
+    AS_HELP_STRING([--with-html-dir=PATH], [path to installed docs]),,
+    [with_html_dir='${datadir}/gtk-doc/html'])
+  HTML_DIR="$with_html_dir"
+  AC_SUBST([HTML_DIR])
+
+  dnl enable/disable documentation building
+  AC_ARG_ENABLE([gtk-doc],
+    AS_HELP_STRING([--enable-gtk-doc],
+                   [use gtk-doc to build documentation [[default=no]]]),,
+    [enable_gtk_doc=no])
+
+  if test x$enable_gtk_doc = xyes; then
+    ifelse([$1],[],
+      [PKG_CHECK_EXISTS([gtk-doc],,
+                        AC_MSG_ERROR([gtk-doc not installed and --enable-gtk-doc requested]))],
+      [PKG_CHECK_EXISTS([gtk-doc >= $1],,
+                        AC_MSG_ERROR([You need to have gtk-doc >= $1 installed to build $PACKAGE_NAME]))])
+    dnl don't check for glib if we build glib
+    if test "x$PACKAGE_NAME" != "xglib"; then
+      dnl don't fail if someone does not have glib
+      PKG_CHECK_MODULES(GTKDOC_DEPS, glib-2.0 >= 2.10.0 gobject-2.0  >= 2.10.0,,)
+    fi
+  fi
+
+  AC_MSG_CHECKING([whether to build gtk-doc documentation])
+  AC_MSG_RESULT($enable_gtk_doc)
+
+  dnl enable/disable output formats
+  AC_ARG_ENABLE([gtk-doc-html],
+    AS_HELP_STRING([--enable-gtk-doc-html],
+                   [build documentation in html format [[default=yes]]]),,
+    [enable_gtk_doc_html=yes])
+    AC_ARG_ENABLE([gtk-doc-pdf],
+      AS_HELP_STRING([--enable-gtk-doc-pdf],
+                     [build documentation in pdf format [[default=no]]]),,
+      [enable_gtk_doc_pdf=no])
+
+  if test -z "$GTKDOC_MKPDF"; then
+    enable_gtk_doc_pdf=no
+  fi
+
+
+  AM_CONDITIONAL([ENABLE_GTK_DOC], [test x$enable_gtk_doc = xyes])
+  AM_CONDITIONAL([GTK_DOC_BUILD_HTML], [test x$enable_gtk_doc_html = xyes])
+  AM_CONDITIONAL([GTK_DOC_BUILD_PDF], [test x$enable_gtk_doc_pdf = xyes])
+  AM_CONDITIONAL([GTK_DOC_USE_LIBTOOL], [test -n "$LIBTOOL"])
+  AM_CONDITIONAL([GTK_DOC_USE_REBASE], [test -n "$GTKDOC_REBASE"])
+])
diff --git a/m4/iconv.m4 b/m4/iconv.m4
new file mode 100644 (file)
index 0000000..b2156eb
--- /dev/null
@@ -0,0 +1,180 @@
+# iconv.m4 serial AM6 (gettext-0.17)
+dnl Copyright (C) 2000-2002, 2007 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+dnl From Bruno Haible.
+
+AC_DEFUN([AM_ICONV_LINKFLAGS_BODY],
+[
+  dnl Prerequisites of AC_LIB_LINKFLAGS_BODY.
+  AC_REQUIRE([AC_LIB_PREPARE_PREFIX])
+  dnl AC_REQUIRE([AC_LIB_RPATH])
+
+  dnl Search for libiconv and define LIBICONV, LTLIBICONV and INCICONV
+  dnl accordingly.
+  AC_LIB_LINKFLAGS_BODY([iconv])
+])
+
+AC_DEFUN([AM_ICONV_LINK],
+[
+  dnl Some systems have iconv in libc, some have it in libiconv (OSF/1 and
+  dnl those with the standalone portable GNU libiconv installed).
+  AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
+
+  dnl Search for libiconv and define LIBICONV, LTLIBICONV and INCICONV
+  dnl accordingly.
+  AC_REQUIRE([AM_ICONV_LINKFLAGS_BODY])
+
+  dnl Add $INCICONV to CPPFLAGS before performing the following checks,
+  dnl because if the user has installed libiconv and not disabled its use
+  dnl via --without-libiconv-prefix, he wants to use it. The first
+  dnl AC_TRY_LINK will then fail, the second AC_TRY_LINK will succeed.
+  am_save_CPPFLAGS="$CPPFLAGS"
+  AC_LIB_APPENDTOVAR([CPPFLAGS], [$INCICONV])
+
+  AC_CACHE_CHECK([for iconv], am_cv_func_iconv, [
+    am_cv_func_iconv="no, consider installing GNU libiconv"
+    am_cv_lib_iconv=no
+    AC_TRY_LINK([#include <stdlib.h>
+#include <iconv.h>],
+      [iconv_t cd = iconv_open("","");
+       iconv(cd,NULL,NULL,NULL,NULL);
+       iconv_close(cd);],
+      am_cv_func_iconv=yes)
+    if test "$am_cv_func_iconv" != yes; then
+      am_save_LIBS="$LIBS"
+      LIBS="$LIBS $LIBICONV"
+      AC_TRY_LINK([#include <stdlib.h>
+#include <iconv.h>],
+        [iconv_t cd = iconv_open("","");
+         iconv(cd,NULL,NULL,NULL,NULL);
+         iconv_close(cd);],
+        am_cv_lib_iconv=yes
+        am_cv_func_iconv=yes)
+      LIBS="$am_save_LIBS"
+    fi
+  ])
+  if test "$am_cv_func_iconv" = yes; then
+    AC_CACHE_CHECK([for working iconv], am_cv_func_iconv_works, [
+      dnl This tests against bugs in AIX 5.1 and HP-UX 11.11.
+      am_save_LIBS="$LIBS"
+      if test $am_cv_lib_iconv = yes; then
+        LIBS="$LIBS $LIBICONV"
+      fi
+      AC_TRY_RUN([
+#include <iconv.h>
+#include <string.h>
+int main ()
+{
+  /* Test against AIX 5.1 bug: Failures are not distinguishable from successful
+     returns.  */
+  {
+    iconv_t cd_utf8_to_88591 = iconv_open ("ISO8859-1", "UTF-8");
+    if (cd_utf8_to_88591 != (iconv_t)(-1))
+      {
+        static const char input[] = "\342\202\254"; /* EURO SIGN */
+        char buf[10];
+        const char *inptr = input;
+        size_t inbytesleft = strlen (input);
+        char *outptr = buf;
+        size_t outbytesleft = sizeof (buf);
+        size_t res = iconv (cd_utf8_to_88591,
+                            (char **) &inptr, &inbytesleft,
+                            &outptr, &outbytesleft);
+        if (res == 0)
+          return 1;
+      }
+  }
+#if 0 /* This bug could be worked around by the caller.  */
+  /* Test against HP-UX 11.11 bug: Positive return value instead of 0.  */
+  {
+    iconv_t cd_88591_to_utf8 = iconv_open ("utf8", "iso88591");
+    if (cd_88591_to_utf8 != (iconv_t)(-1))
+      {
+        static const char input[] = "\304rger mit b\366sen B\374bchen ohne Augenma\337";
+        char buf[50];
+        const char *inptr = input;
+        size_t inbytesleft = strlen (input);
+        char *outptr = buf;
+        size_t outbytesleft = sizeof (buf);
+        size_t res = iconv (cd_88591_to_utf8,
+                            (char **) &inptr, &inbytesleft,
+                            &outptr, &outbytesleft);
+        if ((int)res > 0)
+          return 1;
+      }
+  }
+#endif
+  /* Test against HP-UX 11.11 bug: No converter from EUC-JP to UTF-8 is
+     provided.  */
+  if (/* Try standardized names.  */
+      iconv_open ("UTF-8", "EUC-JP") == (iconv_t)(-1)
+      /* Try IRIX, OSF/1 names.  */
+      && iconv_open ("UTF-8", "eucJP") == (iconv_t)(-1)
+      /* Try AIX names.  */
+      && iconv_open ("UTF-8", "IBM-eucJP") == (iconv_t)(-1)
+      /* Try HP-UX names.  */
+      && iconv_open ("utf8", "eucJP") == (iconv_t)(-1))
+    return 1;
+  return 0;
+}], [am_cv_func_iconv_works=yes], [am_cv_func_iconv_works=no],
+        [case "$host_os" in
+           aix* | hpux*) am_cv_func_iconv_works="guessing no" ;;
+           *)            am_cv_func_iconv_works="guessing yes" ;;
+         esac])
+      LIBS="$am_save_LIBS"
+    ])
+    case "$am_cv_func_iconv_works" in
+      *no) am_func_iconv=no am_cv_lib_iconv=no ;;
+      *)   am_func_iconv=yes ;;
+    esac
+  else
+    am_func_iconv=no am_cv_lib_iconv=no
+  fi
+  if test "$am_func_iconv" = yes; then
+    AC_DEFINE(HAVE_ICONV, 1,
+      [Define if you have the iconv() function and it works.])
+  fi
+  if test "$am_cv_lib_iconv" = yes; then
+    AC_MSG_CHECKING([how to link with libiconv])
+    AC_MSG_RESULT([$LIBICONV])
+  else
+    dnl If $LIBICONV didn't lead to a usable library, we don't need $INCICONV
+    dnl either.
+    CPPFLAGS="$am_save_CPPFLAGS"
+    LIBICONV=
+    LTLIBICONV=
+  fi
+  AC_SUBST(LIBICONV)
+  AC_SUBST(LTLIBICONV)
+])
+
+AC_DEFUN([AM_ICONV],
+[
+  AM_ICONV_LINK
+  if test "$am_cv_func_iconv" = yes; then
+    AC_MSG_CHECKING([for iconv declaration])
+    AC_CACHE_VAL(am_cv_proto_iconv, [
+      AC_TRY_COMPILE([
+#include <stdlib.h>
+#include <iconv.h>
+extern
+#ifdef __cplusplus
+"C"
+#endif
+#if defined(__STDC__) || defined(__cplusplus)
+size_t iconv (iconv_t cd, char * *inbuf, size_t *inbytesleft, char * *outbuf, size_t *outbytesleft);
+#else
+size_t iconv();
+#endif
+], [], am_cv_proto_iconv_arg1="", am_cv_proto_iconv_arg1="const")
+      am_cv_proto_iconv="extern size_t iconv (iconv_t cd, $am_cv_proto_iconv_arg1 char * *inbuf, size_t *inbytesleft, char * *outbuf, size_t *outbytesleft);"])
+    am_cv_proto_iconv=`echo "[$]am_cv_proto_iconv" | tr -s ' ' | sed -e 's/( /(/'`
+    AC_MSG_RESULT([$]{ac_t:-
+         }[$]am_cv_proto_iconv)
+    AC_DEFINE_UNQUOTED(ICONV_CONST, $am_cv_proto_iconv_arg1,
+      [Define as const if the declaration of iconv() needs const.])
+  fi
+])
diff --git a/m4/introspection.m4 b/m4/introspection.m4
new file mode 100644 (file)
index 0000000..589721c
--- /dev/null
@@ -0,0 +1,94 @@
+dnl -*- mode: autoconf -*-
+dnl Copyright 2009 Johan Dahlin
+dnl
+dnl This file is free software; the author(s) gives unlimited
+dnl permission to copy and/or distribute it, with or without
+dnl modifications, as long as this notice is preserved.
+dnl
+
+# serial 1
+
+m4_define([_GOBJECT_INTROSPECTION_CHECK_INTERNAL],
+[
+    AC_BEFORE([AC_PROG_LIBTOOL],[$0])dnl setup libtool first
+    AC_BEFORE([AM_PROG_LIBTOOL],[$0])dnl setup libtool first
+    AC_BEFORE([LT_INIT],[$0])dnl setup libtool first
+
+    dnl enable/disable introspection
+    m4_if([$2], [require],
+    [dnl
+        enable_introspection=yes
+    ],[dnl
+        AC_ARG_ENABLE(introspection,
+                  AS_HELP_STRING([--enable-introspection[=@<:@no/auto/yes@:>@]],
+                                 [Enable introspection for this build]),, 
+                                 [enable_introspection=auto])
+    ])dnl
+
+    AC_MSG_CHECKING([for gobject-introspection])
+
+    dnl presence/version checking
+    AS_CASE([$enable_introspection],
+    [no], [dnl
+        found_introspection="no (disabled, use --enable-introspection to enable)"
+    ],dnl
+    [yes],[dnl
+        PKG_CHECK_EXISTS([gobject-introspection-1.0],,
+                         AC_MSG_ERROR([gobject-introspection-1.0 is not installed]))
+        PKG_CHECK_EXISTS([gobject-introspection-1.0 >= $1],
+                         found_introspection=yes,
+                         AC_MSG_ERROR([You need to have gobject-introspection >= $1 installed to build AC_PACKAGE_NAME]))
+    ],dnl
+    [auto],[dnl
+        PKG_CHECK_EXISTS([gobject-introspection-1.0 >= $1], found_introspection=yes, found_introspection=no)
+    ],dnl
+    [dnl       
+        AC_MSG_ERROR([invalid argument passed to --enable-introspection, should be one of @<:@no/auto/yes@:>@])
+    ])dnl
+
+    AC_MSG_RESULT([$found_introspection])
+
+    INTROSPECTION_SCANNER=
+    INTROSPECTION_COMPILER=
+    INTROSPECTION_GENERATE=
+    INTROSPECTION_GIRDIR=
+    INTROSPECTION_TYPELIBDIR=
+    if test "x$found_introspection" = "xyes"; then
+       INTROSPECTION_SCANNER=`$PKG_CONFIG --variable=g_ir_scanner gobject-introspection-1.0`
+       INTROSPECTION_COMPILER=`$PKG_CONFIG --variable=g_ir_compiler gobject-introspection-1.0`
+       INTROSPECTION_GENERATE=`$PKG_CONFIG --variable=g_ir_generate gobject-introspection-1.0`
+       INTROSPECTION_GIRDIR=`$PKG_CONFIG --variable=girdir gobject-introspection-1.0`
+       INTROSPECTION_TYPELIBDIR="$($PKG_CONFIG --variable=typelibdir gobject-introspection-1.0)"
+       INTROSPECTION_CFLAGS=`$PKG_CONFIG --cflags gobject-introspection-1.0`
+       INTROSPECTION_LIBS=`$PKG_CONFIG --libs gobject-introspection-1.0`
+       INTROSPECTION_MAKEFILE=`$PKG_CONFIG --variable=datadir gobject-introspection-1.0`/gobject-introspection-1.0/Makefile.introspection
+    fi
+    AC_SUBST(INTROSPECTION_SCANNER)
+    AC_SUBST(INTROSPECTION_COMPILER)
+    AC_SUBST(INTROSPECTION_GENERATE)
+    AC_SUBST(INTROSPECTION_GIRDIR)
+    AC_SUBST(INTROSPECTION_TYPELIBDIR)
+    AC_SUBST(INTROSPECTION_CFLAGS)
+    AC_SUBST(INTROSPECTION_LIBS)
+    AC_SUBST(INTROSPECTION_MAKEFILE)
+
+    AM_CONDITIONAL(HAVE_INTROSPECTION, test "x$found_introspection" = "xyes")
+])
+
+
+dnl Usage:
+dnl   GOBJECT_INTROSPECTION_CHECK([minimum-g-i-version])
+
+AC_DEFUN([GOBJECT_INTROSPECTION_CHECK],
+[
+  _GOBJECT_INTROSPECTION_CHECK_INTERNAL([$1])
+])
+
+dnl Usage:
+dnl   GOBJECT_INTROSPECTION_REQUIRE([minimum-g-i-version])
+
+
+AC_DEFUN([GOBJECT_INTROSPECTION_REQUIRE],
+[
+  _GOBJECT_INTROSPECTION_CHECK_INTERNAL([$1], [require])
+])
diff --git a/m4/libjpeg.m4 b/m4/libjpeg.m4
new file mode 100644 (file)
index 0000000..d384343
--- /dev/null
@@ -0,0 +1,114 @@
+dnl Based on Xpdf configure.in and evince configure.ac
+dnl Based on kde acinclude.m4.in, LGPL Licensed
+
+AC_DEFUN([AC_FIND_FILE],
+[
+$3=NO
+for i in $2;
+do
+  for j in $1;
+  do
+    echo "configure: __oline__: $i/$j" >&AC_FD_CC
+    if test -r "$i/$j"; then
+      echo "taking that" >&AC_FD_CC
+      $3=$i
+      break 2
+    fi
+  done
+done
+])
+
+AC_DEFUN([KDE_FIND_JPEG_HELPER],
+[
+AC_MSG_CHECKING([for libjpeg$2])
+AC_CACHE_VAL(ac_cv_lib_jpeg_$1,
+[
+ac_save_LIBS="$LIBS"
+LIBS="$all_libraries $USER_LDFLAGS -ljpeg$2 -lm"
+ac_save_CFLAGS="$CFLAGS"
+CFLAGS="$CFLAGS $all_includes $USER_INCLUDES"
+AC_TRY_LINK(
+[
+#ifdef __cplusplus
+extern "C" {
+#endif
+void jpeg_CreateDecompress();
+#ifdef __cplusplus
+}
+#endif
+],
+[jpeg_CreateDecompress();],
+            eval "ac_cv_lib_jpeg_$1=-ljpeg$2",
+            eval "ac_cv_lib_jpeg_$1=no")
+LIBS="$ac_save_LIBS"
+CFLAGS="$ac_save_CFLAGS"
+])
+
+if eval "test ! \"`echo $ac_cv_lib_jpeg_$1`\" = no"; then
+  enable_libjpeg=yes
+  LIBJPEG_LIBS="$ac_cv_lib_jpeg_$1"
+  AC_MSG_RESULT($ac_cv_lib_jpeg_$1)
+else
+  AC_MSG_RESULT(no)
+  $3
+fi
+])
+
+
+AC_DEFUN([POPPLER_FIND_JPEG],
+[
+dnl first look for libraries
+KDE_FIND_JPEG_HELPER(6b, 6b,
+   KDE_FIND_JPEG_HELPER(normal, [],
+    [
+       LIBJPEG_LIBS=
+    ]
+   )
+)
+
+dnl then search the headers (can't use simply AC_TRY_xxx, as jpeglib.h
+dnl requires system dependent includes loaded before it)
+ac_save_CPPFLAGS="$CPPFLAGS"
+ac_save_CFLAGS="$CFLAGS"
+CPPFLAGS="$CFLAGS $all_includes $USER_INCLUDES"
+CFLAGS="$CFLAGS $all_includes $USER_INCLUDES"
+AC_CHECK_HEADER([jpeglib.h], [jpeg_incdir=yes], [jpeg_incdir=NO])
+CPPFLAGS="$ac_save_CPPFLAGS"
+CFLAGS="$ac_save_CFLAGS"
+test "x$jpeg_incdir" = xNO && jpeg_incdir=
+
+dnl if headers _and_ libraries are missing, this is no error, and we
+dnl continue with a warning (the user will get no jpeg support)
+dnl if only one is missing, it means a configuration error, but we still
+dnl only warn
+if test -n "$jpeg_incdir" && test -n "$LIBJPEG_LIBS" ; then
+  AC_DEFINE_UNQUOTED(ENABLE_LIBJPEG, 1, [Define if you have libjpeg])
+else
+  if test -n "$jpeg_incdir" || test -n "$LIBJPEG_LIBS" ; then
+    AC_MSG_WARN([
+There is an installation error in jpeg support. You seem to have only one
+of either the headers _or_ the libraries installed. You may need to either
+provide correct --with-extra-... options, or the development package of
+libjpeg6b. You can get a source package of libjpeg from http://www.ijg.org/
+Disabling JPEG support.
+])
+  else
+    AC_MSG_WARN([libjpeg not found. disable JPEG support.])
+  fi
+  jpeg_incdir=
+  enable_libjpeg=no
+  LIBJPEG_LIBS=
+fi
+
+AC_SUBST(LIBJPEG_LIBS)
+AH_VERBATIM(_AC_CHECK_JPEG,
+[/*
+ * jpeg.h needs HAVE_BOOLEAN, when the system uses boolean in system
+ * headers and I'm too lazy to write a configure test as long as only
+ * unixware is related
+ */
+#ifdef _UNIXWARE
+#define HAVE_BOOLEAN
+#endif
+])
+])
diff --git a/m4/libtool.m4 b/m4/libtool.m4
new file mode 100644 (file)
index 0000000..828104c
--- /dev/null
@@ -0,0 +1,8001 @@
+# libtool.m4 - Configure libtool for the host system. -*-Autoconf-*-
+#
+#   Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005,
+#                 2006, 2007, 2008, 2009, 2010, 2011 Free Software
+#                 Foundation, Inc.
+#   Written by Gordon Matzigkeit, 1996
+#
+# This file is free software; the Free Software Foundation gives
+# unlimited permission to copy and/or distribute it, with or without
+# modifications, as long as this notice is preserved.
+
+m4_define([_LT_COPYING], [dnl
+#   Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005,
+#                 2006, 2007, 2008, 2009, 2010, 2011 Free Software
+#                 Foundation, Inc.
+#   Written by Gordon Matzigkeit, 1996
+#
+#   This file is part of GNU Libtool.
+#
+# GNU Libtool is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License as
+# published by the Free Software Foundation; either version 2 of
+# the License, or (at your option) any later version.
+#
+# As a special exception to the GNU General Public License,
+# if you distribute this file as part of a program or library that
+# is built using GNU Libtool, you may include this file under the
+# same distribution terms that you use for the rest of that program.
+#
+# GNU Libtool is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GNU Libtool; see the file COPYING.  If not, a copy
+# can be downloaded from http://www.gnu.org/licenses/gpl.html, or
+# obtained by writing to the Free Software Foundation, Inc.,
+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+])
+
+# serial 57 LT_INIT
+
+
+# LT_PREREQ(VERSION)
+# ------------------
+# Complain and exit if this libtool version is less that VERSION.
+m4_defun([LT_PREREQ],
+[m4_if(m4_version_compare(m4_defn([LT_PACKAGE_VERSION]), [$1]), -1,
+       [m4_default([$3],
+                  [m4_fatal([Libtool version $1 or higher is required],
+                            63)])],
+       [$2])])
+
+
+# _LT_CHECK_BUILDDIR
+# ------------------
+# Complain if the absolute build directory name contains unusual characters
+m4_defun([_LT_CHECK_BUILDDIR],
+[case `pwd` in
+  *\ * | *\    *)
+    AC_MSG_WARN([Libtool does not cope well with whitespace in `pwd`]) ;;
+esac
+])
+
+
+# LT_INIT([OPTIONS])
+# ------------------
+AC_DEFUN([LT_INIT],
+[AC_PREREQ([2.58])dnl We use AC_INCLUDES_DEFAULT
+AC_REQUIRE([AC_CONFIG_AUX_DIR_DEFAULT])dnl
+AC_BEFORE([$0], [LT_LANG])dnl
+AC_BEFORE([$0], [LT_OUTPUT])dnl
+AC_BEFORE([$0], [LTDL_INIT])dnl
+m4_require([_LT_CHECK_BUILDDIR])dnl
+
+dnl Autoconf doesn't catch unexpanded LT_ macros by default:
+m4_pattern_forbid([^_?LT_[A-Z_]+$])dnl
+m4_pattern_allow([^(_LT_EOF|LT_DLGLOBAL|LT_DLLAZY_OR_NOW|LT_MULTI_MODULE)$])dnl
+dnl aclocal doesn't pull ltoptions.m4, ltsugar.m4, or ltversion.m4
+dnl unless we require an AC_DEFUNed macro:
+AC_REQUIRE([LTOPTIONS_VERSION])dnl
+AC_REQUIRE([LTSUGAR_VERSION])dnl
+AC_REQUIRE([LTVERSION_VERSION])dnl
+AC_REQUIRE([LTOBSOLETE_VERSION])dnl
+m4_require([_LT_PROG_LTMAIN])dnl
+
+_LT_SHELL_INIT([SHELL=${CONFIG_SHELL-/bin/sh}])
+
+dnl Parse OPTIONS
+_LT_SET_OPTIONS([$0], [$1])
+
+# This can be used to rebuild libtool when needed
+LIBTOOL_DEPS="$ltmain"
+
+# Always use our own libtool.
+LIBTOOL='$(SHELL) $(top_builddir)/libtool'
+AC_SUBST(LIBTOOL)dnl
+
+_LT_SETUP
+
+# Only expand once:
+m4_define([LT_INIT])
+])# LT_INIT
+
+# Old names:
+AU_ALIAS([AC_PROG_LIBTOOL], [LT_INIT])
+AU_ALIAS([AM_PROG_LIBTOOL], [LT_INIT])
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([AC_PROG_LIBTOOL], [])
+dnl AC_DEFUN([AM_PROG_LIBTOOL], [])
+
+
+# _LT_CC_BASENAME(CC)
+# -------------------
+# Calculate cc_basename.  Skip known compiler wrappers and cross-prefix.
+m4_defun([_LT_CC_BASENAME],
+[for cc_temp in $1""; do
+  case $cc_temp in
+    compile | *[[\\/]]compile | ccache | *[[\\/]]ccache ) ;;
+    distcc | *[[\\/]]distcc | purify | *[[\\/]]purify ) ;;
+    \-*) ;;
+    *) break;;
+  esac
+done
+cc_basename=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"`
+])
+
+
+# _LT_FILEUTILS_DEFAULTS
+# ----------------------
+# It is okay to use these file commands and assume they have been set
+# sensibly after `m4_require([_LT_FILEUTILS_DEFAULTS])'.
+m4_defun([_LT_FILEUTILS_DEFAULTS],
+[: ${CP="cp -f"}
+: ${MV="mv -f"}
+: ${RM="rm -f"}
+])# _LT_FILEUTILS_DEFAULTS
+
+
+# _LT_SETUP
+# ---------
+m4_defun([_LT_SETUP],
+[AC_REQUIRE([AC_CANONICAL_HOST])dnl
+AC_REQUIRE([AC_CANONICAL_BUILD])dnl
+AC_REQUIRE([_LT_PREPARE_SED_QUOTE_VARS])dnl
+AC_REQUIRE([_LT_PROG_ECHO_BACKSLASH])dnl
+
+_LT_DECL([], [PATH_SEPARATOR], [1], [The PATH separator for the build system])dnl
+dnl
+_LT_DECL([], [host_alias], [0], [The host system])dnl
+_LT_DECL([], [host], [0])dnl
+_LT_DECL([], [host_os], [0])dnl
+dnl
+_LT_DECL([], [build_alias], [0], [The build system])dnl
+_LT_DECL([], [build], [0])dnl
+_LT_DECL([], [build_os], [0])dnl
+dnl
+AC_REQUIRE([AC_PROG_CC])dnl
+AC_REQUIRE([LT_PATH_LD])dnl
+AC_REQUIRE([LT_PATH_NM])dnl
+dnl
+AC_REQUIRE([AC_PROG_LN_S])dnl
+test -z "$LN_S" && LN_S="ln -s"
+_LT_DECL([], [LN_S], [1], [Whether we need soft or hard links])dnl
+dnl
+AC_REQUIRE([LT_CMD_MAX_LEN])dnl
+_LT_DECL([objext], [ac_objext], [0], [Object file suffix (normally "o")])dnl
+_LT_DECL([], [exeext], [0], [Executable file suffix (normally "")])dnl
+dnl
+m4_require([_LT_FILEUTILS_DEFAULTS])dnl
+m4_require([_LT_CHECK_SHELL_FEATURES])dnl
+m4_require([_LT_PATH_CONVERSION_FUNCTIONS])dnl
+m4_require([_LT_CMD_RELOAD])dnl
+m4_require([_LT_CHECK_MAGIC_METHOD])dnl
+m4_require([_LT_CHECK_SHAREDLIB_FROM_LINKLIB])dnl
+m4_require([_LT_CMD_OLD_ARCHIVE])dnl
+m4_require([_LT_CMD_GLOBAL_SYMBOLS])dnl
+m4_require([_LT_WITH_SYSROOT])dnl
+
+_LT_CONFIG_LIBTOOL_INIT([
+# See if we are running on zsh, and set the options which allow our
+# commands through without removal of \ escapes INIT.
+if test -n "\${ZSH_VERSION+set}" ; then
+   setopt NO_GLOB_SUBST
+fi
+])
+if test -n "${ZSH_VERSION+set}" ; then
+   setopt NO_GLOB_SUBST
+fi
+
+_LT_CHECK_OBJDIR
+
+m4_require([_LT_TAG_COMPILER])dnl
+
+case $host_os in
+aix3*)
+  # AIX sometimes has problems with the GCC collect2 program.  For some
+  # reason, if we set the COLLECT_NAMES environment variable, the problems
+  # vanish in a puff of smoke.
+  if test "X${COLLECT_NAMES+set}" != Xset; then
+    COLLECT_NAMES=
+    export COLLECT_NAMES
+  fi
+  ;;
+esac
+
+# Global variables:
+ofile=libtool
+can_build_shared=yes
+
+# All known linkers require a `.a' archive for static linking (except MSVC,
+# which needs '.lib').
+libext=a
+
+with_gnu_ld="$lt_cv_prog_gnu_ld"
+
+old_CC="$CC"
+old_CFLAGS="$CFLAGS"
+
+# Set sane defaults for various variables
+test -z "$CC" && CC=cc
+test -z "$LTCC" && LTCC=$CC
+test -z "$LTCFLAGS" && LTCFLAGS=$CFLAGS
+test -z "$LD" && LD=ld
+test -z "$ac_objext" && ac_objext=o
+
+_LT_CC_BASENAME([$compiler])
+
+# Only perform the check for file, if the check method requires it
+test -z "$MAGIC_CMD" && MAGIC_CMD=file
+case $deplibs_check_method in
+file_magic*)
+  if test "$file_magic_cmd" = '$MAGIC_CMD'; then
+    _LT_PATH_MAGIC
+  fi
+  ;;
+esac
+
+# Use C for the default configuration in the libtool script
+LT_SUPPORTED_TAG([CC])
+_LT_LANG_C_CONFIG
+_LT_LANG_DEFAULT_CONFIG
+_LT_CONFIG_COMMANDS
+])# _LT_SETUP
+
+
+# _LT_PREPARE_SED_QUOTE_VARS
+# --------------------------
+# Define a few sed substitution that help us do robust quoting.
+m4_defun([_LT_PREPARE_SED_QUOTE_VARS],
+[# Backslashify metacharacters that are still active within
+# double-quoted strings.
+sed_quote_subst='s/\([["`$\\]]\)/\\\1/g'
+
+# Same as above, but do not quote variable references.
+double_quote_subst='s/\([["`\\]]\)/\\\1/g'
+
+# Sed substitution to delay expansion of an escaped shell variable in a
+# double_quote_subst'ed string.
+delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g'
+
+# Sed substitution to delay expansion of an escaped single quote.
+delay_single_quote_subst='s/'\''/'\'\\\\\\\'\''/g'
+
+# Sed substitution to avoid accidental globbing in evaled expressions
+no_glob_subst='s/\*/\\\*/g'
+])
+
+# _LT_PROG_LTMAIN
+# ---------------
+# Note that this code is called both from `configure', and `config.status'
+# now that we use AC_CONFIG_COMMANDS to generate libtool.  Notably,
+# `config.status' has no value for ac_aux_dir unless we are using Automake,
+# so we pass a copy along to make sure it has a sensible value anyway.
+m4_defun([_LT_PROG_LTMAIN],
+[m4_ifdef([AC_REQUIRE_AUX_FILE], [AC_REQUIRE_AUX_FILE([ltmain.sh])])dnl
+_LT_CONFIG_LIBTOOL_INIT([ac_aux_dir='$ac_aux_dir'])
+ltmain="$ac_aux_dir/ltmain.sh"
+])# _LT_PROG_LTMAIN
+
+
+## ------------------------------------- ##
+## Accumulate code for creating libtool. ##
+## ------------------------------------- ##
+
+# So that we can recreate a full libtool script including additional
+# tags, we accumulate the chunks of code to send to AC_CONFIG_COMMANDS
+# in macros and then make a single call at the end using the `libtool'
+# label.
+
+
+# _LT_CONFIG_LIBTOOL_INIT([INIT-COMMANDS])
+# ----------------------------------------
+# Register INIT-COMMANDS to be passed to AC_CONFIG_COMMANDS later.
+m4_define([_LT_CONFIG_LIBTOOL_INIT],
+[m4_ifval([$1],
+          [m4_append([_LT_OUTPUT_LIBTOOL_INIT],
+                     [$1
+])])])
+
+# Initialize.
+m4_define([_LT_OUTPUT_LIBTOOL_INIT])
+
+
+# _LT_CONFIG_LIBTOOL([COMMANDS])
+# ------------------------------
+# Register COMMANDS to be passed to AC_CONFIG_COMMANDS later.
+m4_define([_LT_CONFIG_LIBTOOL],
+[m4_ifval([$1],
+          [m4_append([_LT_OUTPUT_LIBTOOL_COMMANDS],
+                     [$1
+])])])
+
+# Initialize.
+m4_define([_LT_OUTPUT_LIBTOOL_COMMANDS])
+
+
+# _LT_CONFIG_SAVE_COMMANDS([COMMANDS], [INIT_COMMANDS])
+# -----------------------------------------------------
+m4_defun([_LT_CONFIG_SAVE_COMMANDS],
+[_LT_CONFIG_LIBTOOL([$1])
+_LT_CONFIG_LIBTOOL_INIT([$2])
+])
+
+
+# _LT_FORMAT_COMMENT([COMMENT])
+# -----------------------------
+# Add leading comment marks to the start of each line, and a trailing
+# full-stop to the whole comment if one is not present already.
+m4_define([_LT_FORMAT_COMMENT],
+[m4_ifval([$1], [
+m4_bpatsubst([m4_bpatsubst([$1], [^ *], [# ])],
+              [['`$\]], [\\\&])]m4_bmatch([$1], [[!?.]$], [], [.])
+)])
+
+
+
+## ------------------------ ##
+## FIXME: Eliminate VARNAME ##
+## ------------------------ ##
+
+
+# _LT_DECL([CONFIGNAME], VARNAME, VALUE, [DESCRIPTION], [IS-TAGGED?])
+# -------------------------------------------------------------------
+# CONFIGNAME is the name given to the value in the libtool script.
+# VARNAME is the (base) name used in the configure script.
+# VALUE may be 0, 1 or 2 for a computed quote escaped value based on
+# VARNAME.  Any other value will be used directly.
+m4_define([_LT_DECL],
+[lt_if_append_uniq([lt_decl_varnames], [$2], [, ],
+    [lt_dict_add_subkey([lt_decl_dict], [$2], [libtool_name],
+       [m4_ifval([$1], [$1], [$2])])
+    lt_dict_add_subkey([lt_decl_dict], [$2], [value], [$3])
+    m4_ifval([$4],
+       [lt_dict_add_subkey([lt_decl_dict], [$2], [description], [$4])])
+    lt_dict_add_subkey([lt_decl_dict], [$2],
+       [tagged?], [m4_ifval([$5], [yes], [no])])])
+])
+
+
+# _LT_TAGDECL([CONFIGNAME], VARNAME, VALUE, [DESCRIPTION])
+# --------------------------------------------------------
+m4_define([_LT_TAGDECL], [_LT_DECL([$1], [$2], [$3], [$4], [yes])])
+
+
+# lt_decl_tag_varnames([SEPARATOR], [VARNAME1...])
+# ------------------------------------------------
+m4_define([lt_decl_tag_varnames],
+[_lt_decl_filter([tagged?], [yes], $@)])
+
+
+# _lt_decl_filter(SUBKEY, VALUE, [SEPARATOR], [VARNAME1..])
+# ---------------------------------------------------------
+m4_define([_lt_decl_filter],
+[m4_case([$#],
+  [0], [m4_fatal([$0: too few arguments: $#])],
+  [1], [m4_fatal([$0: too few arguments: $#: $1])],
+  [2], [lt_dict_filter([lt_decl_dict], [$1], [$2], [], lt_decl_varnames)],
+  [3], [lt_dict_filter([lt_decl_dict], [$1], [$2], [$3], lt_decl_varnames)],
+  [lt_dict_filter([lt_decl_dict], $@)])[]dnl
+])
+
+
+# lt_decl_quote_varnames([SEPARATOR], [VARNAME1...])
+# --------------------------------------------------
+m4_define([lt_decl_quote_varnames],
+[_lt_decl_filter([value], [1], $@)])
+
+
+# lt_decl_dquote_varnames([SEPARATOR], [VARNAME1...])
+# ---------------------------------------------------
+m4_define([lt_decl_dquote_varnames],
+[_lt_decl_filter([value], [2], $@)])
+
+
+# lt_decl_varnames_tagged([SEPARATOR], [VARNAME1...])
+# ---------------------------------------------------
+m4_define([lt_decl_varnames_tagged],
+[m4_assert([$# <= 2])dnl
+_$0(m4_quote(m4_default([$1], [[, ]])),
+    m4_ifval([$2], [[$2]], [m4_dquote(lt_decl_tag_varnames)]),
+    m4_split(m4_normalize(m4_quote(_LT_TAGS)), [ ]))])
+m4_define([_lt_decl_varnames_tagged],
+[m4_ifval([$3], [lt_combine([$1], [$2], [_], $3)])])
+
+
+# lt_decl_all_varnames([SEPARATOR], [VARNAME1...])
+# ------------------------------------------------
+m4_define([lt_decl_all_varnames],
+[_$0(m4_quote(m4_default([$1], [[, ]])),
+     m4_if([$2], [],
+          m4_quote(lt_decl_varnames),
+       m4_quote(m4_shift($@))))[]dnl
+])
+m4_define([_lt_decl_all_varnames],
+[lt_join($@, lt_decl_varnames_tagged([$1],
+                       lt_decl_tag_varnames([[, ]], m4_shift($@))))dnl
+])
+
+
+# _LT_CONFIG_STATUS_DECLARE([VARNAME])
+# ------------------------------------
+# Quote a variable value, and forward it to `config.status' so that its
+# declaration there will have the same value as in `configure'.  VARNAME
+# must have a single quote delimited value for this to work.
+m4_define([_LT_CONFIG_STATUS_DECLARE],
+[$1='`$ECHO "$][$1" | $SED "$delay_single_quote_subst"`'])
+
+
+# _LT_CONFIG_STATUS_DECLARATIONS
+# ------------------------------
+# We delimit libtool config variables with single quotes, so when
+# we write them to config.status, we have to be sure to quote all
+# embedded single quotes properly.  In configure, this macro expands
+# each variable declared with _LT_DECL (and _LT_TAGDECL) into:
+#
+#    <var>='`$ECHO "$<var>" | $SED "$delay_single_quote_subst"`'
+m4_defun([_LT_CONFIG_STATUS_DECLARATIONS],
+[m4_foreach([_lt_var], m4_quote(lt_decl_all_varnames),
+    [m4_n([_LT_CONFIG_STATUS_DECLARE(_lt_var)])])])
+
+
+# _LT_LIBTOOL_TAGS
+# ----------------
+# Output comment and list of tags supported by the script
+m4_defun([_LT_LIBTOOL_TAGS],
+[_LT_FORMAT_COMMENT([The names of the tagged configurations supported by this script])dnl
+available_tags="_LT_TAGS"dnl
+])
+
+
+# _LT_LIBTOOL_DECLARE(VARNAME, [TAG])
+# -----------------------------------
+# Extract the dictionary values for VARNAME (optionally with TAG) and
+# expand to a commented shell variable setting:
+#
+#    # Some comment about what VAR is for.
+#    visible_name=$lt_internal_name
+m4_define([_LT_LIBTOOL_DECLARE],
+[_LT_FORMAT_COMMENT(m4_quote(lt_dict_fetch([lt_decl_dict], [$1],
+                                          [description])))[]dnl
+m4_pushdef([_libtool_name],
+    m4_quote(lt_dict_fetch([lt_decl_dict], [$1], [libtool_name])))[]dnl
+m4_case(m4_quote(lt_dict_fetch([lt_decl_dict], [$1], [value])),
+    [0], [_libtool_name=[$]$1],
+    [1], [_libtool_name=$lt_[]$1],
+    [2], [_libtool_name=$lt_[]$1],
+    [_libtool_name=lt_dict_fetch([lt_decl_dict], [$1], [value])])[]dnl
+m4_ifval([$2], [_$2])[]m4_popdef([_libtool_name])[]dnl
+])
+
+
+# _LT_LIBTOOL_CONFIG_VARS
+# -----------------------
+# Produce commented declarations of non-tagged libtool config variables
+# suitable for insertion in the LIBTOOL CONFIG section of the `libtool'
+# script.  Tagged libtool config variables (even for the LIBTOOL CONFIG
+# section) are produced by _LT_LIBTOOL_TAG_VARS.
+m4_defun([_LT_LIBTOOL_CONFIG_VARS],
+[m4_foreach([_lt_var],
+    m4_quote(_lt_decl_filter([tagged?], [no], [], lt_decl_varnames)),
+    [m4_n([_LT_LIBTOOL_DECLARE(_lt_var)])])])
+
+
+# _LT_LIBTOOL_TAG_VARS(TAG)
+# -------------------------
+m4_define([_LT_LIBTOOL_TAG_VARS],
+[m4_foreach([_lt_var], m4_quote(lt_decl_tag_varnames),
+    [m4_n([_LT_LIBTOOL_DECLARE(_lt_var, [$1])])])])
+
+
+# _LT_TAGVAR(VARNAME, [TAGNAME])
+# ------------------------------
+m4_define([_LT_TAGVAR], [m4_ifval([$2], [$1_$2], [$1])])
+
+
+# _LT_CONFIG_COMMANDS
+# -------------------
+# Send accumulated output to $CONFIG_STATUS.  Thanks to the lists of
+# variables for single and double quote escaping we saved from calls
+# to _LT_DECL, we can put quote escaped variables declarations
+# into `config.status', and then the shell code to quote escape them in
+# for loops in `config.status'.  Finally, any additional code accumulated
+# from calls to _LT_CONFIG_LIBTOOL_INIT is expanded.
+m4_defun([_LT_CONFIG_COMMANDS],
+[AC_PROVIDE_IFELSE([LT_OUTPUT],
+       dnl If the libtool generation code has been placed in $CONFIG_LT,
+       dnl instead of duplicating it all over again into config.status,
+       dnl then we will have config.status run $CONFIG_LT later, so it
+       dnl needs to know what name is stored there:
+        [AC_CONFIG_COMMANDS([libtool],
+            [$SHELL $CONFIG_LT || AS_EXIT(1)], [CONFIG_LT='$CONFIG_LT'])],
+    dnl If the libtool generation code is destined for config.status,
+    dnl expand the accumulated commands and init code now:
+    [AC_CONFIG_COMMANDS([libtool],
+        [_LT_OUTPUT_LIBTOOL_COMMANDS], [_LT_OUTPUT_LIBTOOL_COMMANDS_INIT])])
+])#_LT_CONFIG_COMMANDS
+
+
+# Initialize.
+m4_define([_LT_OUTPUT_LIBTOOL_COMMANDS_INIT],
+[
+
+# The HP-UX ksh and POSIX shell print the target directory to stdout
+# if CDPATH is set.
+(unset CDPATH) >/dev/null 2>&1 && unset CDPATH
+
+sed_quote_subst='$sed_quote_subst'
+double_quote_subst='$double_quote_subst'
+delay_variable_subst='$delay_variable_subst'
+_LT_CONFIG_STATUS_DECLARATIONS
+LTCC='$LTCC'
+LTCFLAGS='$LTCFLAGS'
+compiler='$compiler_DEFAULT'
+
+# A function that is used when there is no print builtin or printf.
+func_fallback_echo ()
+{
+  eval 'cat <<_LTECHO_EOF
+\$[]1
+_LTECHO_EOF'
+}
+
+# Quote evaled strings.
+for var in lt_decl_all_varnames([[ \
+]], lt_decl_quote_varnames); do
+    case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in
+    *[[\\\\\\\`\\"\\\$]]*)
+      eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED \\"\\\$sed_quote_subst\\"\\\`\\\\\\""
+      ;;
+    *)
+      eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\""
+      ;;
+    esac
+done
+
+# Double-quote double-evaled strings.
+for var in lt_decl_all_varnames([[ \
+]], lt_decl_dquote_varnames); do
+    case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in
+    *[[\\\\\\\`\\"\\\$]]*)
+      eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED -e \\"\\\$double_quote_subst\\" -e \\"\\\$sed_quote_subst\\" -e \\"\\\$delay_variable_subst\\"\\\`\\\\\\""
+      ;;
+    *)
+      eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\""
+      ;;
+    esac
+done
+
+_LT_OUTPUT_LIBTOOL_INIT
+])
+
+# _LT_GENERATED_FILE_INIT(FILE, [COMMENT])
+# ------------------------------------
+# Generate a child script FILE with all initialization necessary to
+# reuse the environment learned by the parent script, and make the
+# file executable.  If COMMENT is supplied, it is inserted after the
+# `#!' sequence but before initialization text begins.  After this
+# macro, additional text can be appended to FILE to form the body of
+# the child script.  The macro ends with non-zero status if the
+# file could not be fully written (such as if the disk is full).
+m4_ifdef([AS_INIT_GENERATED],
+[m4_defun([_LT_GENERATED_FILE_INIT],[AS_INIT_GENERATED($@)])],
+[m4_defun([_LT_GENERATED_FILE_INIT],
+[m4_require([AS_PREPARE])]dnl
+[m4_pushdef([AS_MESSAGE_LOG_FD])]dnl
+[lt_write_fail=0
+cat >$1 <<_ASEOF || lt_write_fail=1
+#! $SHELL
+# Generated by $as_me.
+$2
+SHELL=\${CONFIG_SHELL-$SHELL}
+export SHELL
+_ASEOF
+cat >>$1 <<\_ASEOF || lt_write_fail=1
+AS_SHELL_SANITIZE
+_AS_PREPARE
+exec AS_MESSAGE_FD>&1
+_ASEOF
+test $lt_write_fail = 0 && chmod +x $1[]dnl
+m4_popdef([AS_MESSAGE_LOG_FD])])])# _LT_GENERATED_FILE_INIT
+
+# LT_OUTPUT
+# ---------
+# This macro allows early generation of the libtool script (before
+# AC_OUTPUT is called), incase it is used in configure for compilation
+# tests.
+AC_DEFUN([LT_OUTPUT],
+[: ${CONFIG_LT=./config.lt}
+AC_MSG_NOTICE([creating $CONFIG_LT])
+_LT_GENERATED_FILE_INIT(["$CONFIG_LT"],
+[# Run this file to recreate a libtool stub with the current configuration.])
+
+cat >>"$CONFIG_LT" <<\_LTEOF
+lt_cl_silent=false
+exec AS_MESSAGE_LOG_FD>>config.log
+{
+  echo
+  AS_BOX([Running $as_me.])
+} >&AS_MESSAGE_LOG_FD
+
+lt_cl_help="\
+\`$as_me' creates a local libtool stub from the current configuration,
+for use in further configure time tests before the real libtool is
+generated.
+
+Usage: $[0] [[OPTIONS]]
+
+  -h, --help      print this help, then exit
+  -V, --version   print version number, then exit
+  -q, --quiet     do not print progress messages
+  -d, --debug     don't remove temporary files
+
+Report bugs to <bug-libtool@gnu.org>."
+
+lt_cl_version="\
+m4_ifset([AC_PACKAGE_NAME], [AC_PACKAGE_NAME ])config.lt[]dnl
+m4_ifset([AC_PACKAGE_VERSION], [ AC_PACKAGE_VERSION])
+configured by $[0], generated by m4_PACKAGE_STRING.
+
+Copyright (C) 2011 Free Software Foundation, Inc.
+This config.lt script is free software; the Free Software Foundation
+gives unlimited permision to copy, distribute and modify it."
+
+while test $[#] != 0
+do
+  case $[1] in
+    --version | --v* | -V )
+      echo "$lt_cl_version"; exit 0 ;;
+    --help | --h* | -h )
+      echo "$lt_cl_help"; exit 0 ;;
+    --debug | --d* | -d )
+      debug=: ;;
+    --quiet | --q* | --silent | --s* | -q )
+      lt_cl_silent=: ;;
+
+    -*) AC_MSG_ERROR([unrecognized option: $[1]
+Try \`$[0] --help' for more information.]) ;;
+
+    *) AC_MSG_ERROR([unrecognized argument: $[1]
+Try \`$[0] --help' for more information.]) ;;
+  esac
+  shift
+done
+
+if $lt_cl_silent; then
+  exec AS_MESSAGE_FD>/dev/null
+fi
+_LTEOF
+
+cat >>"$CONFIG_LT" <<_LTEOF
+_LT_OUTPUT_LIBTOOL_COMMANDS_INIT
+_LTEOF
+
+cat >>"$CONFIG_LT" <<\_LTEOF
+AC_MSG_NOTICE([creating $ofile])
+_LT_OUTPUT_LIBTOOL_COMMANDS
+AS_EXIT(0)
+_LTEOF
+chmod +x "$CONFIG_LT"
+
+# configure is writing to config.log, but config.lt does its own redirection,
+# appending to config.log, which fails on DOS, as config.log is still kept
+# open by configure.  Here we exec the FD to /dev/null, effectively closing
+# config.log, so it can be properly (re)opened and appended to by config.lt.
+lt_cl_success=:
+test "$silent" = yes &&
+  lt_config_lt_args="$lt_config_lt_args --quiet"
+exec AS_MESSAGE_LOG_FD>/dev/null
+$SHELL "$CONFIG_LT" $lt_config_lt_args || lt_cl_success=false
+exec AS_MESSAGE_LOG_FD>>config.log
+$lt_cl_success || AS_EXIT(1)
+])# LT_OUTPUT
+
+
+# _LT_CONFIG(TAG)
+# ---------------
+# If TAG is the built-in tag, create an initial libtool script with a
+# default configuration from the untagged config vars.  Otherwise add code
+# to config.status for appending the configuration named by TAG from the
+# matching tagged config vars.
+m4_defun([_LT_CONFIG],
+[m4_require([_LT_FILEUTILS_DEFAULTS])dnl
+_LT_CONFIG_SAVE_COMMANDS([
+  m4_define([_LT_TAG], m4_if([$1], [], [C], [$1]))dnl
+  m4_if(_LT_TAG, [C], [
+    # See if we are running on zsh, and set the options which allow our
+    # commands through without removal of \ escapes.
+    if test -n "${ZSH_VERSION+set}" ; then
+      setopt NO_GLOB_SUBST
+    fi
+
+    cfgfile="${ofile}T"
+    trap "$RM \"$cfgfile\"; exit 1" 1 2 15
+    $RM "$cfgfile"
+
+    cat <<_LT_EOF >> "$cfgfile"
+#! $SHELL
+
+# `$ECHO "$ofile" | sed 's%^.*/%%'` - Provide generalized library-building support services.
+# Generated automatically by $as_me ($PACKAGE$TIMESTAMP) $VERSION
+# Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`:
+# NOTE: Changes made to this file will be lost: look at ltmain.sh.
+#
+_LT_COPYING
+_LT_LIBTOOL_TAGS
+
+# ### BEGIN LIBTOOL CONFIG
+_LT_LIBTOOL_CONFIG_VARS
+_LT_LIBTOOL_TAG_VARS
+# ### END LIBTOOL CONFIG
+
+_LT_EOF
+
+  case $host_os in
+  aix3*)
+    cat <<\_LT_EOF >> "$cfgfile"
+# AIX sometimes has problems with the GCC collect2 program.  For some
+# reason, if we set the COLLECT_NAMES environment variable, the problems
+# vanish in a puff of smoke.
+if test "X${COLLECT_NAMES+set}" != Xset; then
+  COLLECT_NAMES=
+  export COLLECT_NAMES
+fi
+_LT_EOF
+    ;;
+  esac
+
+  _LT_PROG_LTMAIN
+
+  # We use sed instead of cat because bash on DJGPP gets confused if
+  # if finds mixed CR/LF and LF-only lines.  Since sed operates in
+  # text mode, it properly converts lines to CR/LF.  This bash problem
+  # is reportedly fixed, but why not run on old versions too?
+  sed '$q' "$ltmain" >> "$cfgfile" \
+     || (rm -f "$cfgfile"; exit 1)
+
+  _LT_PROG_REPLACE_SHELLFNS
+
+   mv -f "$cfgfile" "$ofile" ||
+    (rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile")
+  chmod +x "$ofile"
+],
+[cat <<_LT_EOF >> "$ofile"
+
+dnl Unfortunately we have to use $1 here, since _LT_TAG is not expanded
+dnl in a comment (ie after a #).
+# ### BEGIN LIBTOOL TAG CONFIG: $1
+_LT_LIBTOOL_TAG_VARS(_LT_TAG)
+# ### END LIBTOOL TAG CONFIG: $1
+_LT_EOF
+])dnl /m4_if
+],
+[m4_if([$1], [], [
+    PACKAGE='$PACKAGE'
+    VERSION='$VERSION'
+    TIMESTAMP='$TIMESTAMP'
+    RM='$RM'
+    ofile='$ofile'], [])
+])dnl /_LT_CONFIG_SAVE_COMMANDS
+])# _LT_CONFIG
+
+
+# LT_SUPPORTED_TAG(TAG)
+# ---------------------
+# Trace this macro to discover what tags are supported by the libtool
+# --tag option, using:
+#    autoconf --trace 'LT_SUPPORTED_TAG:$1'
+AC_DEFUN([LT_SUPPORTED_TAG], [])
+
+
+# C support is built-in for now
+m4_define([_LT_LANG_C_enabled], [])
+m4_define([_LT_TAGS], [])
+
+
+# LT_LANG(LANG)
+# -------------
+# Enable libtool support for the given language if not already enabled.
+AC_DEFUN([LT_LANG],
+[AC_BEFORE([$0], [LT_OUTPUT])dnl
+m4_case([$1],
+  [C],                 [_LT_LANG(C)],
+  [C++],               [_LT_LANG(CXX)],
+  [Go],                        [_LT_LANG(GO)],
+  [Java],              [_LT_LANG(GCJ)],
+  [Fortran 77],                [_LT_LANG(F77)],
+  [Fortran],           [_LT_LANG(FC)],
+  [Windows Resource],  [_LT_LANG(RC)],
+  [m4_ifdef([_LT_LANG_]$1[_CONFIG],
+    [_LT_LANG($1)],
+    [m4_fatal([$0: unsupported language: "$1"])])])dnl
+])# LT_LANG
+
+
+# _LT_LANG(LANGNAME)
+# ------------------
+m4_defun([_LT_LANG],
+[m4_ifdef([_LT_LANG_]$1[_enabled], [],
+  [LT_SUPPORTED_TAG([$1])dnl
+  m4_append([_LT_TAGS], [$1 ])dnl
+  m4_define([_LT_LANG_]$1[_enabled], [])dnl
+  _LT_LANG_$1_CONFIG($1)])dnl
+])# _LT_LANG
+
+
+m4_ifndef([AC_PROG_GO], [
+############################################################
+# NOTE: This macro has been submitted for inclusion into   #
+#  GNU Autoconf as AC_PROG_GO.  When it is available in    #
+#  a released version of Autoconf we should remove this    #
+#  macro and use it instead.                               #
+############################################################
+m4_defun([AC_PROG_GO],
+[AC_LANG_PUSH(Go)dnl
+AC_ARG_VAR([GOC],     [Go compiler command])dnl
+AC_ARG_VAR([GOFLAGS], [Go compiler flags])dnl
+_AC_ARG_VAR_LDFLAGS()dnl
+AC_CHECK_TOOL(GOC, gccgo)
+if test -z "$GOC"; then
+  if test -n "$ac_tool_prefix"; then
+    AC_CHECK_PROG(GOC, [${ac_tool_prefix}gccgo], [${ac_tool_prefix}gccgo])
+  fi
+fi
+if test -z "$GOC"; then
+  AC_CHECK_PROG(GOC, gccgo, gccgo, false)
+fi
+])#m4_defun
+])#m4_ifndef
+
+
+# _LT_LANG_DEFAULT_CONFIG
+# -----------------------
+m4_defun([_LT_LANG_DEFAULT_CONFIG],
+[AC_PROVIDE_IFELSE([AC_PROG_CXX],
+  [LT_LANG(CXX)],
+  [m4_define([AC_PROG_CXX], defn([AC_PROG_CXX])[LT_LANG(CXX)])])
+
+AC_PROVIDE_IFELSE([AC_PROG_F77],
+  [LT_LANG(F77)],
+  [m4_define([AC_PROG_F77], defn([AC_PROG_F77])[LT_LANG(F77)])])
+
+AC_PROVIDE_IFELSE([AC_PROG_FC],
+  [LT_LANG(FC)],
+  [m4_define([AC_PROG_FC], defn([AC_PROG_FC])[LT_LANG(FC)])])
+
+dnl The call to [A][M_PROG_GCJ] is quoted like that to stop aclocal
+dnl pulling things in needlessly.
+AC_PROVIDE_IFELSE([AC_PROG_GCJ],
+  [LT_LANG(GCJ)],
+  [AC_PROVIDE_IFELSE([A][M_PROG_GCJ],
+    [LT_LANG(GCJ)],
+    [AC_PROVIDE_IFELSE([LT_PROG_GCJ],
+      [LT_LANG(GCJ)],
+      [m4_ifdef([AC_PROG_GCJ],
+       [m4_define([AC_PROG_GCJ], defn([AC_PROG_GCJ])[LT_LANG(GCJ)])])
+       m4_ifdef([A][M_PROG_GCJ],
+       [m4_define([A][M_PROG_GCJ], defn([A][M_PROG_GCJ])[LT_LANG(GCJ)])])
+       m4_ifdef([LT_PROG_GCJ],
+       [m4_define([LT_PROG_GCJ], defn([LT_PROG_GCJ])[LT_LANG(GCJ)])])])])])
+
+AC_PROVIDE_IFELSE([AC_PROG_GO],
+  [LT_LANG(GO)],
+  [m4_define([AC_PROG_GO], defn([AC_PROG_GO])[LT_LANG(GO)])])
+
+AC_PROVIDE_IFELSE([LT_PROG_RC],
+  [LT_LANG(RC)],
+  [m4_define([LT_PROG_RC], defn([LT_PROG_RC])[LT_LANG(RC)])])
+])# _LT_LANG_DEFAULT_CONFIG
+
+# Obsolete macros:
+AU_DEFUN([AC_LIBTOOL_CXX], [LT_LANG(C++)])
+AU_DEFUN([AC_LIBTOOL_F77], [LT_LANG(Fortran 77)])
+AU_DEFUN([AC_LIBTOOL_FC], [LT_LANG(Fortran)])
+AU_DEFUN([AC_LIBTOOL_GCJ], [LT_LANG(Java)])
+AU_DEFUN([AC_LIBTOOL_RC], [LT_LANG(Windows Resource)])
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([AC_LIBTOOL_CXX], [])
+dnl AC_DEFUN([AC_LIBTOOL_F77], [])
+dnl AC_DEFUN([AC_LIBTOOL_FC], [])
+dnl AC_DEFUN([AC_LIBTOOL_GCJ], [])
+dnl AC_DEFUN([AC_LIBTOOL_RC], [])
+
+
+# _LT_TAG_COMPILER
+# ----------------
+m4_defun([_LT_TAG_COMPILER],
+[AC_REQUIRE([AC_PROG_CC])dnl
+
+_LT_DECL([LTCC], [CC], [1], [A C compiler])dnl
+_LT_DECL([LTCFLAGS], [CFLAGS], [1], [LTCC compiler flags])dnl
+_LT_TAGDECL([CC], [compiler], [1], [A language specific compiler])dnl
+_LT_TAGDECL([with_gcc], [GCC], [0], [Is the compiler the GNU compiler?])dnl
+
+# If no C compiler was specified, use CC.
+LTCC=${LTCC-"$CC"}
+
+# If no C compiler flags were specified, use CFLAGS.
+LTCFLAGS=${LTCFLAGS-"$CFLAGS"}
+
+# Allow CC to be a program name with arguments.
+compiler=$CC
+])# _LT_TAG_COMPILER
+
+
+# _LT_COMPILER_BOILERPLATE
+# ------------------------
+# Check for compiler boilerplate output or warnings with
+# the simple compiler test code.
+m4_defun([_LT_COMPILER_BOILERPLATE],
+[m4_require([_LT_DECL_SED])dnl
+ac_outfile=conftest.$ac_objext
+echo "$lt_simple_compile_test_code" >conftest.$ac_ext
+eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err
+_lt_compiler_boilerplate=`cat conftest.err`
+$RM conftest*
+])# _LT_COMPILER_BOILERPLATE
+
+
+# _LT_LINKER_BOILERPLATE
+# ----------------------
+# Check for linker boilerplate output or warnings with
+# the simple link test code.
+m4_defun([_LT_LINKER_BOILERPLATE],
+[m4_require([_LT_DECL_SED])dnl
+ac_outfile=conftest.$ac_objext
+echo "$lt_simple_link_test_code" >conftest.$ac_ext
+eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err
+_lt_linker_boilerplate=`cat conftest.err`
+$RM -r conftest*
+])# _LT_LINKER_BOILERPLATE
+
+# _LT_REQUIRED_DARWIN_CHECKS
+# -------------------------
+m4_defun_once([_LT_REQUIRED_DARWIN_CHECKS],[
+  case $host_os in
+    rhapsody* | darwin*)
+    AC_CHECK_TOOL([DSYMUTIL], [dsymutil], [:])
+    AC_CHECK_TOOL([NMEDIT], [nmedit], [:])
+    AC_CHECK_TOOL([LIPO], [lipo], [:])
+    AC_CHECK_TOOL([OTOOL], [otool], [:])
+    AC_CHECK_TOOL([OTOOL64], [otool64], [:])
+    _LT_DECL([], [DSYMUTIL], [1],
+      [Tool to manipulate archived DWARF debug symbol files on Mac OS X])
+    _LT_DECL([], [NMEDIT], [1],
+      [Tool to change global to local symbols on Mac OS X])
+    _LT_DECL([], [LIPO], [1],
+      [Tool to manipulate fat objects and archives on Mac OS X])
+    _LT_DECL([], [OTOOL], [1],
+      [ldd/readelf like tool for Mach-O binaries on Mac OS X])
+    _LT_DECL([], [OTOOL64], [1],
+      [ldd/readelf like tool for 64 bit Mach-O binaries on Mac OS X 10.4])
+
+    AC_CACHE_CHECK([for -single_module linker flag],[lt_cv_apple_cc_single_mod],
+      [lt_cv_apple_cc_single_mod=no
+      if test -z "${LT_MULTI_MODULE}"; then
+       # By default we will add the -single_module flag. You can override
+       # by either setting the environment variable LT_MULTI_MODULE
+       # non-empty at configure time, or by adding -multi_module to the
+       # link flags.
+       rm -rf libconftest.dylib*
+       echo "int foo(void){return 1;}" > conftest.c
+       echo "$LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \
+-dynamiclib -Wl,-single_module conftest.c" >&AS_MESSAGE_LOG_FD
+       $LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \
+         -dynamiclib -Wl,-single_module conftest.c 2>conftest.err
+        _lt_result=$?
+       # If there is a non-empty error log, and "single_module"
+       # appears in it, assume the flag caused a linker warning
+        if test -s conftest.err && $GREP single_module conftest.err; then
+         cat conftest.err >&AS_MESSAGE_LOG_FD
+       # Otherwise, if the output was created with a 0 exit code from
+       # the compiler, it worked.
+       elif test -f libconftest.dylib && test $_lt_result -eq 0; then
+         lt_cv_apple_cc_single_mod=yes
+       else
+         cat conftest.err >&AS_MESSAGE_LOG_FD
+       fi
+       rm -rf libconftest.dylib*
+       rm -f conftest.*
+      fi])
+
+    AC_CACHE_CHECK([for -exported_symbols_list linker flag],
+      [lt_cv_ld_exported_symbols_list],
+      [lt_cv_ld_exported_symbols_list=no
+      save_LDFLAGS=$LDFLAGS
+      echo "_main" > conftest.sym
+      LDFLAGS="$LDFLAGS -Wl,-exported_symbols_list,conftest.sym"
+      AC_LINK_IFELSE([AC_LANG_PROGRAM([],[])],
+       [lt_cv_ld_exported_symbols_list=yes],
+       [lt_cv_ld_exported_symbols_list=no])
+       LDFLAGS="$save_LDFLAGS"
+    ])
+
+    AC_CACHE_CHECK([for -force_load linker flag],[lt_cv_ld_force_load],
+      [lt_cv_ld_force_load=no
+      cat > conftest.c << _LT_EOF
+int forced_loaded() { return 2;}
+_LT_EOF
+      echo "$LTCC $LTCFLAGS -c -o conftest.o conftest.c" >&AS_MESSAGE_LOG_FD
+      $LTCC $LTCFLAGS -c -o conftest.o conftest.c 2>&AS_MESSAGE_LOG_FD
+      echo "$AR cru libconftest.a conftest.o" >&AS_MESSAGE_LOG_FD
+      $AR cru libconftest.a conftest.o 2>&AS_MESSAGE_LOG_FD
+      echo "$RANLIB libconftest.a" >&AS_MESSAGE_LOG_FD
+      $RANLIB libconftest.a 2>&AS_MESSAGE_LOG_FD
+      cat > conftest.c << _LT_EOF
+int main() { return 0;}
+_LT_EOF
+      echo "$LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a" >&AS_MESSAGE_LOG_FD
+      $LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a 2>conftest.err
+      _lt_result=$?
+      if test -s conftest.err && $GREP force_load conftest.err; then
+       cat conftest.err >&AS_MESSAGE_LOG_FD
+      elif test -f conftest && test $_lt_result -eq 0 && $GREP forced_load conftest >/dev/null 2>&1 ; then
+       lt_cv_ld_force_load=yes
+      else
+       cat conftest.err >&AS_MESSAGE_LOG_FD
+      fi
+        rm -f conftest.err libconftest.a conftest conftest.c
+        rm -rf conftest.dSYM
+    ])
+    case $host_os in
+    rhapsody* | darwin1.[[012]])
+      _lt_dar_allow_undefined='${wl}-undefined ${wl}suppress' ;;
+    darwin1.*)
+      _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;;
+    darwin*) # darwin 5.x on
+      # if running on 10.5 or later, the deployment target defaults
+      # to the OS version, if on x86, and 10.4, the deployment
+      # target defaults to 10.4. Don't you love it?
+      case ${MACOSX_DEPLOYMENT_TARGET-10.0},$host in
+       10.0,*86*-darwin8*|10.0,*-darwin[[91]]*)
+         _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;;
+       10.[[012]]*)
+         _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;;
+       10.*)
+         _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;;
+      esac
+    ;;
+  esac
+    if test "$lt_cv_apple_cc_single_mod" = "yes"; then
+      _lt_dar_single_mod='$single_module'
+    fi
+    if test "$lt_cv_ld_exported_symbols_list" = "yes"; then
+      _lt_dar_export_syms=' ${wl}-exported_symbols_list,$output_objdir/${libname}-symbols.expsym'
+    else
+      _lt_dar_export_syms='~$NMEDIT -s $output_objdir/${libname}-symbols.expsym ${lib}'
+    fi
+    if test "$DSYMUTIL" != ":" && test "$lt_cv_ld_force_load" = "no"; then
+      _lt_dsymutil='~$DSYMUTIL $lib || :'
+    else
+      _lt_dsymutil=
+    fi
+    ;;
+  esac
+])
+
+
+# _LT_DARWIN_LINKER_FEATURES([TAG])
+# ---------------------------------
+# Checks for linker and compiler features on darwin
+m4_defun([_LT_DARWIN_LINKER_FEATURES],
+[
+  m4_require([_LT_REQUIRED_DARWIN_CHECKS])
+  _LT_TAGVAR(archive_cmds_need_lc, $1)=no
+  _LT_TAGVAR(hardcode_direct, $1)=no
+  _LT_TAGVAR(hardcode_automatic, $1)=yes
+  _LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported
+  if test "$lt_cv_ld_force_load" = "yes"; then
+    _LT_TAGVAR(whole_archive_flag_spec, $1)='`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience ${wl}-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`'
+    m4_case([$1], [F77], [_LT_TAGVAR(compiler_needs_object, $1)=yes],
+                  [FC],  [_LT_TAGVAR(compiler_needs_object, $1)=yes])
+  else
+    _LT_TAGVAR(whole_archive_flag_spec, $1)=''
+  fi
+  _LT_TAGVAR(link_all_deplibs, $1)=yes
+  _LT_TAGVAR(allow_undefined_flag, $1)="$_lt_dar_allow_undefined"
+  case $cc_basename in
+     ifort*) _lt_dar_can_shared=yes ;;
+     *) _lt_dar_can_shared=$GCC ;;
+  esac
+  if test "$_lt_dar_can_shared" = "yes"; then
+    output_verbose_link_cmd=func_echo_all
+    _LT_TAGVAR(archive_cmds, $1)="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod${_lt_dsymutil}"
+    _LT_TAGVAR(module_cmds, $1)="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dsymutil}"
+    _LT_TAGVAR(archive_expsym_cmds, $1)="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring ${_lt_dar_single_mod}${_lt_dar_export_syms}${_lt_dsymutil}"
+    _LT_TAGVAR(module_expsym_cmds, $1)="sed -e 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dar_export_syms}${_lt_dsymutil}"
+    m4_if([$1], [CXX],
+[   if test "$lt_cv_apple_cc_single_mod" != "yes"; then
+      _LT_TAGVAR(archive_cmds, $1)="\$CC -r -keep_private_externs -nostdlib -o \${lib}-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \${lib}-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring${_lt_dsymutil}"
+      _LT_TAGVAR(archive_expsym_cmds, $1)="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -r -keep_private_externs -nostdlib -o \${lib}-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \${lib}-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring${_lt_dar_export_syms}${_lt_dsymutil}"
+    fi
+],[])
+  else
+  _LT_TAGVAR(ld_shlibs, $1)=no
+  fi
+])
+
+# _LT_SYS_MODULE_PATH_AIX([TAGNAME])
+# ----------------------------------
+# Links a minimal program and checks the executable
+# for the system default hardcoded library path. In most cases,
+# this is /usr/lib:/lib, but when the MPI compilers are used
+# the location of the communication and MPI libs are included too.
+# If we don't find anything, use the default library path according
+# to the aix ld manual.
+# Store the results from the different compilers for each TAGNAME.
+# Allow to override them for all tags through lt_cv_aix_libpath.
+m4_defun([_LT_SYS_MODULE_PATH_AIX],
+[m4_require([_LT_DECL_SED])dnl
+if test "${lt_cv_aix_libpath+set}" = set; then
+  aix_libpath=$lt_cv_aix_libpath
+else
+  AC_CACHE_VAL([_LT_TAGVAR([lt_cv_aix_libpath_], [$1])],
+  [AC_LINK_IFELSE([AC_LANG_PROGRAM],[
+  lt_aix_libpath_sed='[
+      /Import File Strings/,/^$/ {
+         /^0/ {
+             s/^0  *\([^ ]*\) *$/\1/
+             p
+         }
+      }]'
+  _LT_TAGVAR([lt_cv_aix_libpath_], [$1])=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
+  # Check for a 64-bit object if we didn't find anything.
+  if test -z "$_LT_TAGVAR([lt_cv_aix_libpath_], [$1])"; then
+    _LT_TAGVAR([lt_cv_aix_libpath_], [$1])=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
+  fi],[])
+  if test -z "$_LT_TAGVAR([lt_cv_aix_libpath_], [$1])"; then
+    _LT_TAGVAR([lt_cv_aix_libpath_], [$1])="/usr/lib:/lib"
+  fi
+  ])
+  aix_libpath=$_LT_TAGVAR([lt_cv_aix_libpath_], [$1])
+fi
+])# _LT_SYS_MODULE_PATH_AIX
+
+
+# _LT_SHELL_INIT(ARG)
+# -------------------
+m4_define([_LT_SHELL_INIT],
+[m4_divert_text([M4SH-INIT], [$1
+])])# _LT_SHELL_INIT
+
+
+
+# _LT_PROG_ECHO_BACKSLASH
+# -----------------------
+# Find how we can fake an echo command that does not interpret backslash.
+# In particular, with Autoconf 2.60 or later we add some code to the start
+# of the generated configure script which will find a shell with a builtin
+# printf (which we can use as an echo command).
+m4_defun([_LT_PROG_ECHO_BACKSLASH],
+[ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'
+ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO
+ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO$ECHO
+
+AC_MSG_CHECKING([how to print strings])
+# Test print first, because it will be a builtin if present.
+if test "X`( print -r -- -n ) 2>/dev/null`" = X-n && \
+   test "X`print -r -- $ECHO 2>/dev/null`" = "X$ECHO"; then
+  ECHO='print -r --'
+elif test "X`printf %s $ECHO 2>/dev/null`" = "X$ECHO"; then
+  ECHO='printf %s\n'
+else
+  # Use this function as a fallback that always works.
+  func_fallback_echo ()
+  {
+    eval 'cat <<_LTECHO_EOF
+$[]1
+_LTECHO_EOF'
+  }
+  ECHO='func_fallback_echo'
+fi
+
+# func_echo_all arg...
+# Invoke $ECHO with all args, space-separated.
+func_echo_all ()
+{
+    $ECHO "$*" 
+}
+
+case "$ECHO" in
+  printf*) AC_MSG_RESULT([printf]) ;;
+  print*) AC_MSG_RESULT([print -r]) ;;
+  *) AC_MSG_RESULT([cat]) ;;
+esac
+
+m4_ifdef([_AS_DETECT_SUGGESTED],
+[_AS_DETECT_SUGGESTED([
+  test -n "${ZSH_VERSION+set}${BASH_VERSION+set}" || (
+    ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'
+    ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO
+    ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO$ECHO
+    PATH=/empty FPATH=/empty; export PATH FPATH
+    test "X`printf %s $ECHO`" = "X$ECHO" \
+      || test "X`print -r -- $ECHO`" = "X$ECHO" )])])
+
+_LT_DECL([], [SHELL], [1], [Shell to use when invoking shell scripts])
+_LT_DECL([], [ECHO], [1], [An echo program that protects backslashes])
+])# _LT_PROG_ECHO_BACKSLASH
+
+
+# _LT_WITH_SYSROOT
+# ----------------
+AC_DEFUN([_LT_WITH_SYSROOT],
+[AC_MSG_CHECKING([for sysroot])
+AC_ARG_WITH([sysroot],
+[  --with-sysroot[=DIR] Search for dependent libraries within DIR
+                        (or the compiler's sysroot if not specified).],
+[], [with_sysroot=no])
+
+dnl lt_sysroot will always be passed unquoted.  We quote it here
+dnl in case the user passed a directory name.
+lt_sysroot=
+case ${with_sysroot} in #(
+ yes)
+   if test "$GCC" = yes; then
+     lt_sysroot=`$CC --print-sysroot 2>/dev/null`
+   fi
+   ;; #(
+ /*)
+   lt_sysroot=`echo "$with_sysroot" | sed -e "$sed_quote_subst"`
+   ;; #(
+ no|'')
+   ;; #(
+ *)
+   AC_MSG_RESULT([${with_sysroot}])
+   AC_MSG_ERROR([The sysroot must be an absolute path.])
+   ;;
+esac
+
+ AC_MSG_RESULT([${lt_sysroot:-no}])
+_LT_DECL([], [lt_sysroot], [0], [The root where to search for ]dnl
+[dependent libraries, and in which our libraries should be installed.])])
+
+# _LT_ENABLE_LOCK
+# ---------------
+m4_defun([_LT_ENABLE_LOCK],
+[AC_ARG_ENABLE([libtool-lock],
+  [AS_HELP_STRING([--disable-libtool-lock],
+    [avoid locking (might break parallel builds)])])
+test "x$enable_libtool_lock" != xno && enable_libtool_lock=yes
+
+# Some flags need to be propagated to the compiler or linker for good
+# libtool support.
+case $host in
+ia64-*-hpux*)
+  # Find out which ABI we are using.
+  echo 'int i;' > conftest.$ac_ext
+  if AC_TRY_EVAL(ac_compile); then
+    case `/usr/bin/file conftest.$ac_objext` in
+      *ELF-32*)
+       HPUX_IA64_MODE="32"
+       ;;
+      *ELF-64*)
+       HPUX_IA64_MODE="64"
+       ;;
+    esac
+  fi
+  rm -rf conftest*
+  ;;
+*-*-irix6*)
+  # Find out which ABI we are using.
+  echo '[#]line '$LINENO' "configure"' > conftest.$ac_ext
+  if AC_TRY_EVAL(ac_compile); then
+    if test "$lt_cv_prog_gnu_ld" = yes; then
+      case `/usr/bin/file conftest.$ac_objext` in
+       *32-bit*)
+         LD="${LD-ld} -melf32bsmip"
+         ;;
+       *N32*)
+         LD="${LD-ld} -melf32bmipn32"
+         ;;
+       *64-bit*)
+         LD="${LD-ld} -melf64bmip"
+       ;;
+      esac
+    else
+      case `/usr/bin/file conftest.$ac_objext` in
+       *32-bit*)
+         LD="${LD-ld} -32"
+         ;;
+       *N32*)
+         LD="${LD-ld} -n32"
+         ;;
+       *64-bit*)
+         LD="${LD-ld} -64"
+         ;;
+      esac
+    fi
+  fi
+  rm -rf conftest*
+  ;;
+
+x86_64-*kfreebsd*-gnu|x86_64-*linux*|ppc*-*linux*|powerpc*-*linux*| \
+s390*-*linux*|s390*-*tpf*|sparc*-*linux*)
+  # Find out which ABI we are using.
+  echo 'int i;' > conftest.$ac_ext
+  if AC_TRY_EVAL(ac_compile); then
+    case `/usr/bin/file conftest.o` in
+      *32-bit*)
+       case $host in
+         x86_64-*kfreebsd*-gnu)
+           LD="${LD-ld} -m elf_i386_fbsd"
+           ;;
+         x86_64-*linux*)
+           LD="${LD-ld} -m elf_i386"
+           ;;
+         ppc64-*linux*|powerpc64-*linux*)
+           LD="${LD-ld} -m elf32ppclinux"
+           ;;
+         s390x-*linux*)
+           LD="${LD-ld} -m elf_s390"
+           ;;
+         sparc64-*linux*)
+           LD="${LD-ld} -m elf32_sparc"
+           ;;
+       esac
+       ;;
+      *64-bit*)
+       case $host in
+         x86_64-*kfreebsd*-gnu)
+           LD="${LD-ld} -m elf_x86_64_fbsd"
+           ;;
+         x86_64-*linux*)
+           LD="${LD-ld} -m elf_x86_64"
+           ;;
+         ppc*-*linux*|powerpc*-*linux*)
+           LD="${LD-ld} -m elf64ppc"
+           ;;
+         s390*-*linux*|s390*-*tpf*)
+           LD="${LD-ld} -m elf64_s390"
+           ;;
+         sparc*-*linux*)
+           LD="${LD-ld} -m elf64_sparc"
+           ;;
+       esac
+       ;;
+    esac
+  fi
+  rm -rf conftest*
+  ;;
+
+*-*-sco3.2v5*)
+  # On SCO OpenServer 5, we need -belf to get full-featured binaries.
+  SAVE_CFLAGS="$CFLAGS"
+  CFLAGS="$CFLAGS -belf"
+  AC_CACHE_CHECK([whether the C compiler needs -belf], lt_cv_cc_needs_belf,
+    [AC_LANG_PUSH(C)
+     AC_LINK_IFELSE([AC_LANG_PROGRAM([[]],[[]])],[lt_cv_cc_needs_belf=yes],[lt_cv_cc_needs_belf=no])
+     AC_LANG_POP])
+  if test x"$lt_cv_cc_needs_belf" != x"yes"; then
+    # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf
+    CFLAGS="$SAVE_CFLAGS"
+  fi
+  ;;
+*-*solaris*)
+  # Find out which ABI we are using.
+  echo 'int i;' > conftest.$ac_ext
+  if AC_TRY_EVAL(ac_compile); then
+    case `/usr/bin/file conftest.o` in
+    *64-bit*)
+      case $lt_cv_prog_gnu_ld in
+      yes*)
+        case $host in
+        i?86-*-solaris*)
+          LD="${LD-ld} -m elf_x86_64"
+          ;;
+        sparc*-*-solaris*)
+          LD="${LD-ld} -m elf64_sparc"
+          ;;
+        esac
+        # GNU ld 2.21 introduced _sol2 emulations.  Use them if available.
+        if ${LD-ld} -V | grep _sol2 >/dev/null 2>&1; then
+          LD="${LD-ld}_sol2"
+        fi
+        ;;
+      *)
+       if ${LD-ld} -64 -r -o conftest2.o conftest.o >/dev/null 2>&1; then
+         LD="${LD-ld} -64"
+       fi
+       ;;
+      esac
+      ;;
+    esac
+  fi
+  rm -rf conftest*
+  ;;
+esac
+
+need_locks="$enable_libtool_lock"
+])# _LT_ENABLE_LOCK
+
+
+# _LT_PROG_AR
+# -----------
+m4_defun([_LT_PROG_AR],
+[AC_CHECK_TOOLS(AR, [ar], false)
+: ${AR=ar}
+: ${AR_FLAGS=cru}
+_LT_DECL([], [AR], [1], [The archiver])
+_LT_DECL([], [AR_FLAGS], [1], [Flags to create an archive])
+
+AC_CACHE_CHECK([for archiver @FILE support], [lt_cv_ar_at_file],
+  [lt_cv_ar_at_file=no
+   AC_COMPILE_IFELSE([AC_LANG_PROGRAM],
+     [echo conftest.$ac_objext > conftest.lst
+      lt_ar_try='$AR $AR_FLAGS libconftest.a @conftest.lst >&AS_MESSAGE_LOG_FD'
+      AC_TRY_EVAL([lt_ar_try])
+      if test "$ac_status" -eq 0; then
+       # Ensure the archiver fails upon bogus file names.
+       rm -f conftest.$ac_objext libconftest.a
+       AC_TRY_EVAL([lt_ar_try])
+       if test "$ac_status" -ne 0; then
+          lt_cv_ar_at_file=@
+        fi
+      fi
+      rm -f conftest.* libconftest.a
+     ])
+  ])
+
+if test "x$lt_cv_ar_at_file" = xno; then
+  archiver_list_spec=
+else
+  archiver_list_spec=$lt_cv_ar_at_file
+fi
+_LT_DECL([], [archiver_list_spec], [1],
+  [How to feed a file listing to the archiver])
+])# _LT_PROG_AR
+
+
+# _LT_CMD_OLD_ARCHIVE
+# -------------------
+m4_defun([_LT_CMD_OLD_ARCHIVE],
+[_LT_PROG_AR
+
+AC_CHECK_TOOL(STRIP, strip, :)
+test -z "$STRIP" && STRIP=:
+_LT_DECL([], [STRIP], [1], [A symbol stripping program])
+
+AC_CHECK_TOOL(RANLIB, ranlib, :)
+test -z "$RANLIB" && RANLIB=:
+_LT_DECL([], [RANLIB], [1],
+    [Commands used to install an old-style archive])
+
+# Determine commands to create old-style static archives.
+old_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs'
+old_postinstall_cmds='chmod 644 $oldlib'
+old_postuninstall_cmds=
+
+if test -n "$RANLIB"; then
+  case $host_os in
+  openbsd*)
+    old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB -t \$tool_oldlib"
+    ;;
+  *)
+    old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB \$tool_oldlib"
+    ;;
+  esac
+  old_archive_cmds="$old_archive_cmds~\$RANLIB \$tool_oldlib"
+fi
+
+case $host_os in
+  darwin*)
+    lock_old_archive_extraction=yes ;;
+  *)
+    lock_old_archive_extraction=no ;;
+esac
+_LT_DECL([], [old_postinstall_cmds], [2])
+_LT_DECL([], [old_postuninstall_cmds], [2])
+_LT_TAGDECL([], [old_archive_cmds], [2],
+    [Commands used to build an old-style archive])
+_LT_DECL([], [lock_old_archive_extraction], [0],
+    [Whether to use a lock for old archive extraction])
+])# _LT_CMD_OLD_ARCHIVE
+
+
+# _LT_COMPILER_OPTION(MESSAGE, VARIABLE-NAME, FLAGS,
+#              [OUTPUT-FILE], [ACTION-SUCCESS], [ACTION-FAILURE])
+# ----------------------------------------------------------------
+# Check whether the given compiler option works
+AC_DEFUN([_LT_COMPILER_OPTION],
+[m4_require([_LT_FILEUTILS_DEFAULTS])dnl
+m4_require([_LT_DECL_SED])dnl
+AC_CACHE_CHECK([$1], [$2],
+  [$2=no
+   m4_if([$4], , [ac_outfile=conftest.$ac_objext], [ac_outfile=$4])
+   echo "$lt_simple_compile_test_code" > conftest.$ac_ext
+   lt_compiler_flag="$3"
+   # Insert the option either (1) after the last *FLAGS variable, or
+   # (2) before a word containing "conftest.", or (3) at the end.
+   # Note that $ac_compile itself does not contain backslashes and begins
+   # with a dollar sign (not a hyphen), so the echo should work correctly.
+   # The option is referenced via a variable to avoid confusing sed.
+   lt_compile=`echo "$ac_compile" | $SED \
+   -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
+   -e 's: [[^ ]]*conftest\.: $lt_compiler_flag&:; t' \
+   -e 's:$: $lt_compiler_flag:'`
+   (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&AS_MESSAGE_LOG_FD)
+   (eval "$lt_compile" 2>conftest.err)
+   ac_status=$?
+   cat conftest.err >&AS_MESSAGE_LOG_FD
+   echo "$as_me:$LINENO: \$? = $ac_status" >&AS_MESSAGE_LOG_FD
+   if (exit $ac_status) && test -s "$ac_outfile"; then
+     # The compiler can only warn and ignore the option if not recognized
+     # So say no if there are warnings other than the usual output.
+     $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp
+     $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
+     if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then
+       $2=yes
+     fi
+   fi
+   $RM conftest*
+])
+
+if test x"[$]$2" = xyes; then
+    m4_if([$5], , :, [$5])
+else
+    m4_if([$6], , :, [$6])
+fi
+])# _LT_COMPILER_OPTION
+
+# Old name:
+AU_ALIAS([AC_LIBTOOL_COMPILER_OPTION], [_LT_COMPILER_OPTION])
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([AC_LIBTOOL_COMPILER_OPTION], [])
+
+
+# _LT_LINKER_OPTION(MESSAGE, VARIABLE-NAME, FLAGS,
+#                  [ACTION-SUCCESS], [ACTION-FAILURE])
+# ----------------------------------------------------
+# Check whether the given linker option works
+AC_DEFUN([_LT_LINKER_OPTION],
+[m4_require([_LT_FILEUTILS_DEFAULTS])dnl
+m4_require([_LT_DECL_SED])dnl
+AC_CACHE_CHECK([$1], [$2],
+  [$2=no
+   save_LDFLAGS="$LDFLAGS"
+   LDFLAGS="$LDFLAGS $3"
+   echo "$lt_simple_link_test_code" > conftest.$ac_ext
+   if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then
+     # The linker can only warn and ignore the option if not recognized
+     # So say no if there are warnings
+     if test -s conftest.err; then
+       # Append any errors to the config.log.
+       cat conftest.err 1>&AS_MESSAGE_LOG_FD
+       $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp
+       $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
+       if diff conftest.exp conftest.er2 >/dev/null; then
+         $2=yes
+       fi
+     else
+       $2=yes
+     fi
+   fi
+   $RM -r conftest*
+   LDFLAGS="$save_LDFLAGS"
+])
+
+if test x"[$]$2" = xyes; then
+    m4_if([$4], , :, [$4])
+else
+    m4_if([$5], , :, [$5])
+fi
+])# _LT_LINKER_OPTION
+
+# Old name:
+AU_ALIAS([AC_LIBTOOL_LINKER_OPTION], [_LT_LINKER_OPTION])
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([AC_LIBTOOL_LINKER_OPTION], [])
+
+
+# LT_CMD_MAX_LEN
+#---------------
+AC_DEFUN([LT_CMD_MAX_LEN],
+[AC_REQUIRE([AC_CANONICAL_HOST])dnl
+# find the maximum length of command line arguments
+AC_MSG_CHECKING([the maximum length of command line arguments])
+AC_CACHE_VAL([lt_cv_sys_max_cmd_len], [dnl
+  i=0
+  teststring="ABCD"
+
+  case $build_os in
+  msdosdjgpp*)
+    # On DJGPP, this test can blow up pretty badly due to problems in libc
+    # (any single argument exceeding 2000 bytes causes a buffer overrun
+    # during glob expansion).  Even if it were fixed, the result of this
+    # check would be larger than it should be.
+    lt_cv_sys_max_cmd_len=12288;    # 12K is about right
+    ;;
+
+  gnu*)
+    # Under GNU Hurd, this test is not required because there is
+    # no limit to the length of command line arguments.
+    # Libtool will interpret -1 as no limit whatsoever
+    lt_cv_sys_max_cmd_len=-1;
+    ;;
+
+  cygwin* | mingw* | cegcc*)
+    # On Win9x/ME, this test blows up -- it succeeds, but takes
+    # about 5 minutes as the teststring grows exponentially.
+    # Worse, since 9x/ME are not pre-emptively multitasking,
+    # you end up with a "frozen" computer, even though with patience
+    # the test eventually succeeds (with a max line length of 256k).
+    # Instead, let's just punt: use the minimum linelength reported by
+    # all of the supported platforms: 8192 (on NT/2K/XP).
+    lt_cv_sys_max_cmd_len=8192;
+    ;;
+
+  mint*)
+    # On MiNT this can take a long time and run out of memory.
+    lt_cv_sys_max_cmd_len=8192;
+    ;;
+
+  amigaos*)
+    # On AmigaOS with pdksh, this test takes hours, literally.
+    # So we just punt and use a minimum line length of 8192.
+    lt_cv_sys_max_cmd_len=8192;
+    ;;
+
+  netbsd* | freebsd* | openbsd* | darwin* | dragonfly*)
+    # This has been around since 386BSD, at least.  Likely further.
+    if test -x /sbin/sysctl; then
+      lt_cv_sys_max_cmd_len=`/sbin/sysctl -n kern.argmax`
+    elif test -x /usr/sbin/sysctl; then
+      lt_cv_sys_max_cmd_len=`/usr/sbin/sysctl -n kern.argmax`
+    else
+      lt_cv_sys_max_cmd_len=65536      # usable default for all BSDs
+    fi
+    # And add a safety zone
+    lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4`
+    lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3`
+    ;;
+
+  interix*)
+    # We know the value 262144 and hardcode it with a safety zone (like BSD)
+    lt_cv_sys_max_cmd_len=196608
+    ;;
+
+  os2*)
+    # The test takes a long time on OS/2.
+    lt_cv_sys_max_cmd_len=8192
+    ;;
+
+  osf*)
+    # Dr. Hans Ekkehard Plesser reports seeing a kernel panic running configure
+    # due to this test when exec_disable_arg_limit is 1 on Tru64. It is not
+    # nice to cause kernel panics so lets avoid the loop below.
+    # First set a reasonable default.
+    lt_cv_sys_max_cmd_len=16384
+    #
+    if test -x /sbin/sysconfig; then
+      case `/sbin/sysconfig -q proc exec_disable_arg_limit` in
+        *1*) lt_cv_sys_max_cmd_len=-1 ;;
+      esac
+    fi
+    ;;
+  sco3.2v5*)
+    lt_cv_sys_max_cmd_len=102400
+    ;;
+  sysv5* | sco5v6* | sysv4.2uw2*)
+    kargmax=`grep ARG_MAX /etc/conf/cf.d/stune 2>/dev/null`
+    if test -n "$kargmax"; then
+      lt_cv_sys_max_cmd_len=`echo $kargmax | sed 's/.*[[        ]]//'`
+    else
+      lt_cv_sys_max_cmd_len=32768
+    fi
+    ;;
+  *)
+    lt_cv_sys_max_cmd_len=`(getconf ARG_MAX) 2> /dev/null`
+    if test -n "$lt_cv_sys_max_cmd_len"; then
+      lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4`
+      lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3`
+    else
+      # Make teststring a little bigger before we do anything with it.
+      # a 1K string should be a reasonable start.
+      for i in 1 2 3 4 5 6 7 8 ; do
+        teststring=$teststring$teststring
+      done
+      SHELL=${SHELL-${CONFIG_SHELL-/bin/sh}}
+      # If test is not a shell built-in, we'll probably end up computing a
+      # maximum length that is only half of the actual maximum length, but
+      # we can't tell.
+      while { test "X"`env echo "$teststring$teststring" 2>/dev/null` \
+                = "X$teststring$teststring"; } >/dev/null 2>&1 &&
+             test $i != 17 # 1/2 MB should be enough
+      do
+        i=`expr $i + 1`
+        teststring=$teststring$teststring
+      done
+      # Only check the string length outside the loop.
+      lt_cv_sys_max_cmd_len=`expr "X$teststring" : ".*" 2>&1`
+      teststring=
+      # Add a significant safety factor because C++ compilers can tack on
+      # massive amounts of additional arguments before passing them to the
+      # linker.  It appears as though 1/2 is a usable value.
+      lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 2`
+    fi
+    ;;
+  esac
+])
+if test -n $lt_cv_sys_max_cmd_len ; then
+  AC_MSG_RESULT($lt_cv_sys_max_cmd_len)
+else
+  AC_MSG_RESULT(none)
+fi
+max_cmd_len=$lt_cv_sys_max_cmd_len
+_LT_DECL([], [max_cmd_len], [0],
+    [What is the maximum length of a command?])
+])# LT_CMD_MAX_LEN
+
+# Old name:
+AU_ALIAS([AC_LIBTOOL_SYS_MAX_CMD_LEN], [LT_CMD_MAX_LEN])
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([AC_LIBTOOL_SYS_MAX_CMD_LEN], [])
+
+
+# _LT_HEADER_DLFCN
+# ----------------
+m4_defun([_LT_HEADER_DLFCN],
+[AC_CHECK_HEADERS([dlfcn.h], [], [], [AC_INCLUDES_DEFAULT])dnl
+])# _LT_HEADER_DLFCN
+
+
+# _LT_TRY_DLOPEN_SELF (ACTION-IF-TRUE, ACTION-IF-TRUE-W-USCORE,
+#                      ACTION-IF-FALSE, ACTION-IF-CROSS-COMPILING)
+# ----------------------------------------------------------------
+m4_defun([_LT_TRY_DLOPEN_SELF],
+[m4_require([_LT_HEADER_DLFCN])dnl
+if test "$cross_compiling" = yes; then :
+  [$4]
+else
+  lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
+  lt_status=$lt_dlunknown
+  cat > conftest.$ac_ext <<_LT_EOF
+[#line $LINENO "configure"
+#include "confdefs.h"
+
+#if HAVE_DLFCN_H
+#include <dlfcn.h>
+#endif
+
+#include <stdio.h>
+
+#ifdef RTLD_GLOBAL
+#  define LT_DLGLOBAL          RTLD_GLOBAL
+#else
+#  ifdef DL_GLOBAL
+#    define LT_DLGLOBAL                DL_GLOBAL
+#  else
+#    define LT_DLGLOBAL                0
+#  endif
+#endif
+
+/* We may have to define LT_DLLAZY_OR_NOW in the command line if we
+   find out it does not work in some platform. */
+#ifndef LT_DLLAZY_OR_NOW
+#  ifdef RTLD_LAZY
+#    define LT_DLLAZY_OR_NOW           RTLD_LAZY
+#  else
+#    ifdef DL_LAZY
+#      define LT_DLLAZY_OR_NOW         DL_LAZY
+#    else
+#      ifdef RTLD_NOW
+#        define LT_DLLAZY_OR_NOW       RTLD_NOW
+#      else
+#        ifdef DL_NOW
+#          define LT_DLLAZY_OR_NOW     DL_NOW
+#        else
+#          define LT_DLLAZY_OR_NOW     0
+#        endif
+#      endif
+#    endif
+#  endif
+#endif
+
+/* When -fvisbility=hidden is used, assume the code has been annotated
+   correspondingly for the symbols needed.  */
+#if defined(__GNUC__) && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3))
+int fnord () __attribute__((visibility("default")));
+#endif
+
+int fnord () { return 42; }
+int main ()
+{
+  void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW);
+  int status = $lt_dlunknown;
+
+  if (self)
+    {
+      if (dlsym (self,"fnord"))       status = $lt_dlno_uscore;
+      else
+        {
+         if (dlsym( self,"_fnord"))  status = $lt_dlneed_uscore;
+          else puts (dlerror ());
+       }
+      /* dlclose (self); */
+    }
+  else
+    puts (dlerror ());
+
+  return status;
+}]
+_LT_EOF
+  if AC_TRY_EVAL(ac_link) && test -s conftest${ac_exeext} 2>/dev/null; then
+    (./conftest; exit; ) >&AS_MESSAGE_LOG_FD 2>/dev/null
+    lt_status=$?
+    case x$lt_status in
+      x$lt_dlno_uscore) $1 ;;
+      x$lt_dlneed_uscore) $2 ;;
+      x$lt_dlunknown|x*) $3 ;;
+    esac
+  else :
+    # compilation failed
+    $3
+  fi
+fi
+rm -fr conftest*
+])# _LT_TRY_DLOPEN_SELF
+
+
+# LT_SYS_DLOPEN_SELF
+# ------------------
+AC_DEFUN([LT_SYS_DLOPEN_SELF],
+[m4_require([_LT_HEADER_DLFCN])dnl
+if test "x$enable_dlopen" != xyes; then
+  enable_dlopen=unknown
+  enable_dlopen_self=unknown
+  enable_dlopen_self_static=unknown
+else
+  lt_cv_dlopen=no
+  lt_cv_dlopen_libs=
+
+  case $host_os in
+  beos*)
+    lt_cv_dlopen="load_add_on"
+    lt_cv_dlopen_libs=
+    lt_cv_dlopen_self=yes
+    ;;
+
+  mingw* | pw32* | cegcc*)
+    lt_cv_dlopen="LoadLibrary"
+    lt_cv_dlopen_libs=
+    ;;
+
+  cygwin*)
+    lt_cv_dlopen="dlopen"
+    lt_cv_dlopen_libs=
+    ;;
+
+  darwin*)
+  # if libdl is installed we need to link against it
+    AC_CHECK_LIB([dl], [dlopen],
+               [lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"],[
+    lt_cv_dlopen="dyld"
+    lt_cv_dlopen_libs=
+    lt_cv_dlopen_self=yes
+    ])
+    ;;
+
+  *)
+    AC_CHECK_FUNC([shl_load],
+         [lt_cv_dlopen="shl_load"],
+      [AC_CHECK_LIB([dld], [shl_load],
+           [lt_cv_dlopen="shl_load" lt_cv_dlopen_libs="-ldld"],
+       [AC_CHECK_FUNC([dlopen],
+             [lt_cv_dlopen="dlopen"],
+         [AC_CHECK_LIB([dl], [dlopen],
+               [lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"],
+           [AC_CHECK_LIB([svld], [dlopen],
+                 [lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-lsvld"],
+             [AC_CHECK_LIB([dld], [dld_link],
+                   [lt_cv_dlopen="dld_link" lt_cv_dlopen_libs="-ldld"])
+             ])
+           ])
+         ])
+       ])
+      ])
+    ;;
+  esac
+
+  if test "x$lt_cv_dlopen" != xno; then
+    enable_dlopen=yes
+  else
+    enable_dlopen=no
+  fi
+
+  case $lt_cv_dlopen in
+  dlopen)
+    save_CPPFLAGS="$CPPFLAGS"
+    test "x$ac_cv_header_dlfcn_h" = xyes && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H"
+
+    save_LDFLAGS="$LDFLAGS"
+    wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\"
+
+    save_LIBS="$LIBS"
+    LIBS="$lt_cv_dlopen_libs $LIBS"
+
+    AC_CACHE_CHECK([whether a program can dlopen itself],
+         lt_cv_dlopen_self, [dnl
+         _LT_TRY_DLOPEN_SELF(
+           lt_cv_dlopen_self=yes, lt_cv_dlopen_self=yes,
+           lt_cv_dlopen_self=no, lt_cv_dlopen_self=cross)
+    ])
+
+    if test "x$lt_cv_dlopen_self" = xyes; then
+      wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $lt_prog_compiler_static\"
+      AC_CACHE_CHECK([whether a statically linked program can dlopen itself],
+         lt_cv_dlopen_self_static, [dnl
+         _LT_TRY_DLOPEN_SELF(
+           lt_cv_dlopen_self_static=yes, lt_cv_dlopen_self_static=yes,
+           lt_cv_dlopen_self_static=no,  lt_cv_dlopen_self_static=cross)
+      ])
+    fi
+
+    CPPFLAGS="$save_CPPFLAGS"
+    LDFLAGS="$save_LDFLAGS"
+    LIBS="$save_LIBS"
+    ;;
+  esac
+
+  case $lt_cv_dlopen_self in
+  yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;;
+  *) enable_dlopen_self=unknown ;;
+  esac
+
+  case $lt_cv_dlopen_self_static in
+  yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;;
+  *) enable_dlopen_self_static=unknown ;;
+  esac
+fi
+_LT_DECL([dlopen_support], [enable_dlopen], [0],
+        [Whether dlopen is supported])
+_LT_DECL([dlopen_self], [enable_dlopen_self], [0],
+        [Whether dlopen of programs is supported])
+_LT_DECL([dlopen_self_static], [enable_dlopen_self_static], [0],
+        [Whether dlopen of statically linked programs is supported])
+])# LT_SYS_DLOPEN_SELF
+
+# Old name:
+AU_ALIAS([AC_LIBTOOL_DLOPEN_SELF], [LT_SYS_DLOPEN_SELF])
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([AC_LIBTOOL_DLOPEN_SELF], [])
+
+
+# _LT_COMPILER_C_O([TAGNAME])
+# ---------------------------
+# Check to see if options -c and -o are simultaneously supported by compiler.
+# This macro does not hard code the compiler like AC_PROG_CC_C_O.
+m4_defun([_LT_COMPILER_C_O],
+[m4_require([_LT_DECL_SED])dnl
+m4_require([_LT_FILEUTILS_DEFAULTS])dnl
+m4_require([_LT_TAG_COMPILER])dnl
+AC_CACHE_CHECK([if $compiler supports -c -o file.$ac_objext],
+  [_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)],
+  [_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=no
+   $RM -r conftest 2>/dev/null
+   mkdir conftest
+   cd conftest
+   mkdir out
+   echo "$lt_simple_compile_test_code" > conftest.$ac_ext
+
+   lt_compiler_flag="-o out/conftest2.$ac_objext"
+   # Insert the option either (1) after the last *FLAGS variable, or
+   # (2) before a word containing "conftest.", or (3) at the end.
+   # Note that $ac_compile itself does not contain backslashes and begins
+   # with a dollar sign (not a hyphen), so the echo should work correctly.
+   lt_compile=`echo "$ac_compile" | $SED \
+   -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
+   -e 's: [[^ ]]*conftest\.: $lt_compiler_flag&:; t' \
+   -e 's:$: $lt_compiler_flag:'`
+   (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&AS_MESSAGE_LOG_FD)
+   (eval "$lt_compile" 2>out/conftest.err)
+   ac_status=$?
+   cat out/conftest.err >&AS_MESSAGE_LOG_FD
+   echo "$as_me:$LINENO: \$? = $ac_status" >&AS_MESSAGE_LOG_FD
+   if (exit $ac_status) && test -s out/conftest2.$ac_objext
+   then
+     # The compiler can only warn and ignore the option if not recognized
+     # So say no if there are warnings
+     $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp
+     $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2
+     if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then
+       _LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=yes
+     fi
+   fi
+   chmod u+w . 2>&AS_MESSAGE_LOG_FD
+   $RM conftest*
+   # SGI C++ compiler will create directory out/ii_files/ for
+   # template instantiation
+   test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files
+   $RM out/* && rmdir out
+   cd ..
+   $RM -r conftest
+   $RM conftest*
+])
+_LT_TAGDECL([compiler_c_o], [lt_cv_prog_compiler_c_o], [1],
+       [Does compiler simultaneously support -c and -o options?])
+])# _LT_COMPILER_C_O
+
+
+# _LT_COMPILER_FILE_LOCKS([TAGNAME])
+# ----------------------------------
+# Check to see if we can do hard links to lock some files if needed
+m4_defun([_LT_COMPILER_FILE_LOCKS],
+[m4_require([_LT_ENABLE_LOCK])dnl
+m4_require([_LT_FILEUTILS_DEFAULTS])dnl
+_LT_COMPILER_C_O([$1])
+
+hard_links="nottested"
+if test "$_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)" = no && test "$need_locks" != no; then
+  # do not overwrite the value of need_locks provided by the user
+  AC_MSG_CHECKING([if we can lock with hard links])
+  hard_links=yes
+  $RM conftest*
+  ln conftest.a conftest.b 2>/dev/null && hard_links=no
+  touch conftest.a
+  ln conftest.a conftest.b 2>&5 || hard_links=no
+  ln conftest.a conftest.b 2>/dev/null && hard_links=no
+  AC_MSG_RESULT([$hard_links])
+  if test "$hard_links" = no; then
+    AC_MSG_WARN([`$CC' does not support `-c -o', so `make -j' may be unsafe])
+    need_locks=warn
+  fi
+else
+  need_locks=no
+fi
+_LT_DECL([], [need_locks], [1], [Must we lock files when doing compilation?])
+])# _LT_COMPILER_FILE_LOCKS
+
+
+# _LT_CHECK_OBJDIR
+# ----------------
+m4_defun([_LT_CHECK_OBJDIR],
+[AC_CACHE_CHECK([for objdir], [lt_cv_objdir],
+[rm -f .libs 2>/dev/null
+mkdir .libs 2>/dev/null
+if test -d .libs; then
+  lt_cv_objdir=.libs
+else
+  # MS-DOS does not allow filenames that begin with a dot.
+  lt_cv_objdir=_libs
+fi
+rmdir .libs 2>/dev/null])
+objdir=$lt_cv_objdir
+_LT_DECL([], [objdir], [0],
+         [The name of the directory that contains temporary libtool files])dnl
+m4_pattern_allow([LT_OBJDIR])dnl
+AC_DEFINE_UNQUOTED(LT_OBJDIR, "$lt_cv_objdir/",
+  [Define to the sub-directory in which libtool stores uninstalled libraries.])
+])# _LT_CHECK_OBJDIR
+
+
+# _LT_LINKER_HARDCODE_LIBPATH([TAGNAME])
+# --------------------------------------
+# Check hardcoding attributes.
+m4_defun([_LT_LINKER_HARDCODE_LIBPATH],
+[AC_MSG_CHECKING([how to hardcode library paths into programs])
+_LT_TAGVAR(hardcode_action, $1)=
+if test -n "$_LT_TAGVAR(hardcode_libdir_flag_spec, $1)" ||
+   test -n "$_LT_TAGVAR(runpath_var, $1)" ||
+   test "X$_LT_TAGVAR(hardcode_automatic, $1)" = "Xyes" ; then
+
+  # We can hardcode non-existent directories.
+  if test "$_LT_TAGVAR(hardcode_direct, $1)" != no &&
+     # If the only mechanism to avoid hardcoding is shlibpath_var, we
+     # have to relink, otherwise we might link with an installed library
+     # when we should be linking with a yet-to-be-installed one
+     ## test "$_LT_TAGVAR(hardcode_shlibpath_var, $1)" != no &&
+     test "$_LT_TAGVAR(hardcode_minus_L, $1)" != no; then
+    # Linking always hardcodes the temporary library directory.
+    _LT_TAGVAR(hardcode_action, $1)=relink
+  else
+    # We can link without hardcoding, and we can hardcode nonexisting dirs.
+    _LT_TAGVAR(hardcode_action, $1)=immediate
+  fi
+else
+  # We cannot hardcode anything, or else we can only hardcode existing
+  # directories.
+  _LT_TAGVAR(hardcode_action, $1)=unsupported
+fi
+AC_MSG_RESULT([$_LT_TAGVAR(hardcode_action, $1)])
+
+if test "$_LT_TAGVAR(hardcode_action, $1)" = relink ||
+   test "$_LT_TAGVAR(inherit_rpath, $1)" = yes; then
+  # Fast installation is not supported
+  enable_fast_install=no
+elif test "$shlibpath_overrides_runpath" = yes ||
+     test "$enable_shared" = no; then
+  # Fast installation is not necessary
+  enable_fast_install=needless
+fi
+_LT_TAGDECL([], [hardcode_action], [0],
+    [How to hardcode a shared library path into an executable])
+])# _LT_LINKER_HARDCODE_LIBPATH
+
+
+# _LT_CMD_STRIPLIB
+# ----------------
+m4_defun([_LT_CMD_STRIPLIB],
+[m4_require([_LT_DECL_EGREP])
+striplib=
+old_striplib=
+AC_MSG_CHECKING([whether stripping libraries is possible])
+if test -n "$STRIP" && $STRIP -V 2>&1 | $GREP "GNU strip" >/dev/null; then
+  test -z "$old_striplib" && old_striplib="$STRIP --strip-debug"
+  test -z "$striplib" && striplib="$STRIP --strip-unneeded"
+  AC_MSG_RESULT([yes])
+else
+# FIXME - insert some real tests, host_os isn't really good enough
+  case $host_os in
+  darwin*)
+    if test -n "$STRIP" ; then
+      striplib="$STRIP -x"
+      old_striplib="$STRIP -S"
+      AC_MSG_RESULT([yes])
+    else
+      AC_MSG_RESULT([no])
+    fi
+    ;;
+  *)
+    AC_MSG_RESULT([no])
+    ;;
+  esac
+fi
+_LT_DECL([], [old_striplib], [1], [Commands to strip libraries])
+_LT_DECL([], [striplib], [1])
+])# _LT_CMD_STRIPLIB
+
+
+# _LT_SYS_DYNAMIC_LINKER([TAG])
+# -----------------------------
+# PORTME Fill in your ld.so characteristics
+m4_defun([_LT_SYS_DYNAMIC_LINKER],
+[AC_REQUIRE([AC_CANONICAL_HOST])dnl
+m4_require([_LT_DECL_EGREP])dnl
+m4_require([_LT_FILEUTILS_DEFAULTS])dnl
+m4_require([_LT_DECL_OBJDUMP])dnl
+m4_require([_LT_DECL_SED])dnl
+m4_require([_LT_CHECK_SHELL_FEATURES])dnl
+AC_MSG_CHECKING([dynamic linker characteristics])
+m4_if([$1],
+       [], [
+if test "$GCC" = yes; then
+  case $host_os in
+    darwin*) lt_awk_arg="/^libraries:/,/LR/" ;;
+    *) lt_awk_arg="/^libraries:/" ;;
+  esac
+  case $host_os in
+    mingw* | cegcc*) lt_sed_strip_eq="s,=\([[A-Za-z]]:\),\1,g" ;;
+    *) lt_sed_strip_eq="s,=/,/,g" ;;
+  esac
+  lt_search_path_spec=`$CC -print-search-dirs | awk $lt_awk_arg | $SED -e "s/^libraries://" -e $lt_sed_strip_eq`
+  case $lt_search_path_spec in
+  *\;*)
+    # if the path contains ";" then we assume it to be the separator
+    # otherwise default to the standard path separator (i.e. ":") - it is
+    # assumed that no part of a normal pathname contains ";" but that should
+    # okay in the real world where ";" in dirpaths is itself problematic.
+    lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED 's/;/ /g'`
+    ;;
+  *)
+    lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED "s/$PATH_SEPARATOR/ /g"`
+    ;;
+  esac
+  # Ok, now we have the path, separated by spaces, we can step through it
+  # and add multilib dir if necessary.
+  lt_tmp_lt_search_path_spec=
+  lt_multi_os_dir=`$CC $CPPFLAGS $CFLAGS $LDFLAGS -print-multi-os-directory 2>/dev/null`
+  for lt_sys_path in $lt_search_path_spec; do
+    if test -d "$lt_sys_path/$lt_multi_os_dir"; then
+      lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path/$lt_multi_os_dir"
+    else
+      test -d "$lt_sys_path" && \
+       lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path"
+    fi
+  done
+  lt_search_path_spec=`$ECHO "$lt_tmp_lt_search_path_spec" | awk '
+BEGIN {RS=" "; FS="/|\n";} {
+  lt_foo="";
+  lt_count=0;
+  for (lt_i = NF; lt_i > 0; lt_i--) {
+    if ($lt_i != "" && $lt_i != ".") {
+      if ($lt_i == "..") {
+        lt_count++;
+      } else {
+        if (lt_count == 0) {
+          lt_foo="/" $lt_i lt_foo;
+        } else {
+          lt_count--;
+        }
+      }
+    }
+  }
+  if (lt_foo != "") { lt_freq[[lt_foo]]++; }
+  if (lt_freq[[lt_foo]] == 1) { print lt_foo; }
+}'`
+  # AWK program above erroneously prepends '/' to C:/dos/paths
+  # for these hosts.
+  case $host_os in
+    mingw* | cegcc*) lt_search_path_spec=`$ECHO "$lt_search_path_spec" |\
+      $SED 's,/\([[A-Za-z]]:\),\1,g'` ;;
+  esac
+  sys_lib_search_path_spec=`$ECHO "$lt_search_path_spec" | $lt_NL2SP`
+else
+  sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib"
+fi])
+library_names_spec=
+libname_spec='lib$name'
+soname_spec=
+shrext_cmds=".so"
+postinstall_cmds=
+postuninstall_cmds=
+finish_cmds=
+finish_eval=
+shlibpath_var=
+shlibpath_overrides_runpath=unknown
+version_type=none
+dynamic_linker="$host_os ld.so"
+sys_lib_dlsearch_path_spec="/lib /usr/lib"
+need_lib_prefix=unknown
+hardcode_into_libs=no
+
+# when you set need_version to no, make sure it does not cause -set_version
+# flags to be left without arguments
+need_version=unknown
+
+case $host_os in
+aix3*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a'
+  shlibpath_var=LIBPATH
+
+  # AIX 3 has no versioning support, so we append a major version to the name.
+  soname_spec='${libname}${release}${shared_ext}$major'
+  ;;
+
+aix[[4-9]]*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  need_lib_prefix=no
+  need_version=no
+  hardcode_into_libs=yes
+  if test "$host_cpu" = ia64; then
+    # AIX 5 supports IA64
+    library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}'
+    shlibpath_var=LD_LIBRARY_PATH
+  else
+    # With GCC up to 2.95.x, collect2 would create an import file
+    # for dependence libraries.  The import file would start with
+    # the line `#! .'.  This would cause the generated library to
+    # depend on `.', always an invalid library.  This was fixed in
+    # development snapshots of GCC prior to 3.0.
+    case $host_os in
+      aix4 | aix4.[[01]] | aix4.[[01]].*)
+      if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)'
+          echo ' yes '
+          echo '#endif'; } | ${CC} -E - | $GREP yes > /dev/null; then
+       :
+      else
+       can_build_shared=no
+      fi
+      ;;
+    esac
+    # AIX (on Power*) has no versioning support, so currently we can not hardcode correct
+    # soname into executable. Probably we can add versioning support to
+    # collect2, so additional links can be useful in future.
+    if test "$aix_use_runtimelinking" = yes; then
+      # If using run time linking (on AIX 4.2 or later) use lib<name>.so
+      # instead of lib<name>.a to let people know that these are not
+      # typical AIX shared libraries.
+      library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+    else
+      # We preserve .a as extension for shared libraries through AIX4.2
+      # and later when we are not doing run time linking.
+      library_names_spec='${libname}${release}.a $libname.a'
+      soname_spec='${libname}${release}${shared_ext}$major'
+    fi
+    shlibpath_var=LIBPATH
+  fi
+  ;;
+
+amigaos*)
+  case $host_cpu in
+  powerpc)
+    # Since July 2007 AmigaOS4 officially supports .so libraries.
+    # When compiling the executable, add -use-dynld -Lsobjs: to the compileline.
+    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+    ;;
+  m68k)
+    library_names_spec='$libname.ixlibrary $libname.a'
+    # Create ${libname}_ixlibrary.a entries in /sys/libs.
+    finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`func_echo_all "$lib" | $SED '\''s%^.*/\([[^/]]*\)\.ixlibrary$%\1%'\''`; test $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done'
+    ;;
+  esac
+  ;;
+
+beos*)
+  library_names_spec='${libname}${shared_ext}'
+  dynamic_linker="$host_os ld.so"
+  shlibpath_var=LIBRARY_PATH
+  ;;
+
+bsdi[[45]]*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir'
+  shlibpath_var=LD_LIBRARY_PATH
+  sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib"
+  sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib"
+  # the default ld.so.conf also contains /usr/contrib/lib and
+  # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow
+  # libtool to hard-code these into programs
+  ;;
+
+cygwin* | mingw* | pw32* | cegcc*)
+  version_type=windows
+  shrext_cmds=".dll"
+  need_version=no
+  need_lib_prefix=no
+
+  case $GCC,$cc_basename in
+  yes,*)
+    # gcc
+    library_names_spec='$libname.dll.a'
+    # DLL is installed to $(libdir)/../bin by postinstall_cmds
+    postinstall_cmds='base_file=`basename \${file}`~
+      dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~
+      dldir=$destdir/`dirname \$dlpath`~
+      test -d \$dldir || mkdir -p \$dldir~
+      $install_prog $dir/$dlname \$dldir/$dlname~
+      chmod a+x \$dldir/$dlname~
+      if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then
+        eval '\''$striplib \$dldir/$dlname'\'' || exit \$?;
+      fi'
+    postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~
+      dlpath=$dir/\$dldll~
+       $RM \$dlpath'
+    shlibpath_overrides_runpath=yes
+
+    case $host_os in
+    cygwin*)
+      # Cygwin DLLs use 'cyg' prefix rather than 'lib'
+      soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}'
+m4_if([$1], [],[
+      sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/lib/w32api"])
+      ;;
+    mingw* | cegcc*)
+      # MinGW DLLs use traditional 'lib' prefix
+      soname_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}'
+      ;;
+    pw32*)
+      # pw32 DLLs use 'pw' prefix rather than 'lib'
+      library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}'
+      ;;
+    esac
+    dynamic_linker='Win32 ld.exe'
+    ;;
+
+  *,cl*)
+    # Native MSVC
+    libname_spec='$name'
+    soname_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}'
+    library_names_spec='${libname}.dll.lib'
+
+    case $build_os in
+    mingw*)
+      sys_lib_search_path_spec=
+      lt_save_ifs=$IFS
+      IFS=';'
+      for lt_path in $LIB
+      do
+        IFS=$lt_save_ifs
+        # Let DOS variable expansion print the short 8.3 style file name.
+        lt_path=`cd "$lt_path" 2>/dev/null && cmd //C "for %i in (".") do @echo %~si"`
+        sys_lib_search_path_spec="$sys_lib_search_path_spec $lt_path"
+      done
+      IFS=$lt_save_ifs
+      # Convert to MSYS style.
+      sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | sed -e 's|\\\\|/|g' -e 's| \\([[a-zA-Z]]\\):| /\\1|g' -e 's|^ ||'`
+      ;;
+    cygwin*)
+      # Convert to unix form, then to dos form, then back to unix form
+      # but this time dos style (no spaces!) so that the unix form looks
+      # like /cygdrive/c/PROGRA~1:/cygdr...
+      sys_lib_search_path_spec=`cygpath --path --unix "$LIB"`
+      sys_lib_search_path_spec=`cygpath --path --dos "$sys_lib_search_path_spec" 2>/dev/null`
+      sys_lib_search_path_spec=`cygpath --path --unix "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"`
+      ;;
+    *)
+      sys_lib_search_path_spec="$LIB"
+      if $ECHO "$sys_lib_search_path_spec" | [$GREP ';[c-zC-Z]:/' >/dev/null]; then
+        # It is most probably a Windows format PATH.
+        sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'`
+      else
+        sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"`
+      fi
+      # FIXME: find the short name or the path components, as spaces are
+      # common. (e.g. "Program Files" -> "PROGRA~1")
+      ;;
+    esac
+
+    # DLL is installed to $(libdir)/../bin by postinstall_cmds
+    postinstall_cmds='base_file=`basename \${file}`~
+      dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~
+      dldir=$destdir/`dirname \$dlpath`~
+      test -d \$dldir || mkdir -p \$dldir~
+      $install_prog $dir/$dlname \$dldir/$dlname'
+    postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~
+      dlpath=$dir/\$dldll~
+       $RM \$dlpath'
+    shlibpath_overrides_runpath=yes
+    dynamic_linker='Win32 link.exe'
+    ;;
+
+  *)
+    # Assume MSVC wrapper
+    library_names_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext} $libname.lib'
+    dynamic_linker='Win32 ld.exe'
+    ;;
+  esac
+  # FIXME: first we should search . and the directory the executable is in
+  shlibpath_var=PATH
+  ;;
+
+darwin* | rhapsody*)
+  dynamic_linker="$host_os dyld"
+  version_type=darwin
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${major}$shared_ext ${libname}$shared_ext'
+  soname_spec='${libname}${release}${major}$shared_ext'
+  shlibpath_overrides_runpath=yes
+  shlibpath_var=DYLD_LIBRARY_PATH
+  shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`'
+m4_if([$1], [],[
+  sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/local/lib"])
+  sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib'
+  ;;
+
+dgux*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  ;;
+
+freebsd* | dragonfly*)
+  # DragonFly does not have aout.  When/if they implement a new
+  # versioning mechanism, adjust this.
+  if test -x /usr/bin/objformat; then
+    objformat=`/usr/bin/objformat`
+  else
+    case $host_os in
+    freebsd[[23]].*) objformat=aout ;;
+    *) objformat=elf ;;
+    esac
+  fi
+  version_type=freebsd-$objformat
+  case $version_type in
+    freebsd-elf*)
+      library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}'
+      need_version=no
+      need_lib_prefix=no
+      ;;
+    freebsd-*)
+      library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix'
+      need_version=yes
+      ;;
+  esac
+  shlibpath_var=LD_LIBRARY_PATH
+  case $host_os in
+  freebsd2.*)
+    shlibpath_overrides_runpath=yes
+    ;;
+  freebsd3.[[01]]* | freebsdelf3.[[01]]*)
+    shlibpath_overrides_runpath=yes
+    hardcode_into_libs=yes
+    ;;
+  freebsd3.[[2-9]]* | freebsdelf3.[[2-9]]* | \
+  freebsd4.[[0-5]] | freebsdelf4.[[0-5]] | freebsd4.1.1 | freebsdelf4.1.1)
+    shlibpath_overrides_runpath=no
+    hardcode_into_libs=yes
+    ;;
+  *) # from 4.6 on, and DragonFly
+    shlibpath_overrides_runpath=yes
+    hardcode_into_libs=yes
+    ;;
+  esac
+  ;;
+
+gnu*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=no
+  hardcode_into_libs=yes
+  ;;
+
+haiku*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  need_lib_prefix=no
+  need_version=no
+  dynamic_linker="$host_os runtime_loader"
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  sys_lib_dlsearch_path_spec='/boot/home/config/lib /boot/common/lib /boot/system/lib'
+  hardcode_into_libs=yes
+  ;;
+
+hpux9* | hpux10* | hpux11*)
+  # Give a soname corresponding to the major version so that dld.sl refuses to
+  # link against other versions.
+  version_type=sunos
+  need_lib_prefix=no
+  need_version=no
+  case $host_cpu in
+  ia64*)
+    shrext_cmds='.so'
+    hardcode_into_libs=yes
+    dynamic_linker="$host_os dld.so"
+    shlibpath_var=LD_LIBRARY_PATH
+    shlibpath_overrides_runpath=yes # Unless +noenvvar is specified.
+    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+    soname_spec='${libname}${release}${shared_ext}$major'
+    if test "X$HPUX_IA64_MODE" = X32; then
+      sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib"
+    else
+      sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64"
+    fi
+    sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
+    ;;
+  hppa*64*)
+    shrext_cmds='.sl'
+    hardcode_into_libs=yes
+    dynamic_linker="$host_os dld.sl"
+    shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH
+    shlibpath_overrides_runpath=yes # Unless +noenvvar is specified.
+    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+    soname_spec='${libname}${release}${shared_ext}$major'
+    sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64"
+    sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
+    ;;
+  *)
+    shrext_cmds='.sl'
+    dynamic_linker="$host_os dld.sl"
+    shlibpath_var=SHLIB_PATH
+    shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH
+    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+    soname_spec='${libname}${release}${shared_ext}$major'
+    ;;
+  esac
+  # HP-UX runs *really* slowly unless shared libraries are mode 555, ...
+  postinstall_cmds='chmod 555 $lib'
+  # or fails outright, so override atomically:
+  install_override_mode=555
+  ;;
+
+interix[[3-9]]*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=no
+  hardcode_into_libs=yes
+  ;;
+
+irix5* | irix6* | nonstopux*)
+  case $host_os in
+    nonstopux*) version_type=nonstopux ;;
+    *)
+       if test "$lt_cv_prog_gnu_ld" = yes; then
+               version_type=linux # correct to gnu/linux during the next big refactor
+       else
+               version_type=irix
+       fi ;;
+  esac
+  need_lib_prefix=no
+  need_version=no
+  soname_spec='${libname}${release}${shared_ext}$major'
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}'
+  case $host_os in
+  irix5* | nonstopux*)
+    libsuff= shlibsuff=
+    ;;
+  *)
+    case $LD in # libtool.m4 will add one of these switches to LD
+    *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ")
+      libsuff= shlibsuff= libmagic=32-bit;;
+    *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ")
+      libsuff=32 shlibsuff=N32 libmagic=N32;;
+    *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ")
+      libsuff=64 shlibsuff=64 libmagic=64-bit;;
+    *) libsuff= shlibsuff= libmagic=never-match;;
+    esac
+    ;;
+  esac
+  shlibpath_var=LD_LIBRARY${shlibsuff}_PATH
+  shlibpath_overrides_runpath=no
+  sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}"
+  sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}"
+  hardcode_into_libs=yes
+  ;;
+
+# No shared lib support for Linux oldld, aout, or coff.
+linux*oldld* | linux*aout* | linux*coff*)
+  dynamic_linker=no
+  ;;
+
+# This must be glibc/ELF.
+linux* | k*bsd*-gnu | kopensolaris*-gnu)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=no
+
+  # Some binutils ld are patched to set DT_RUNPATH
+  AC_CACHE_VAL([lt_cv_shlibpath_overrides_runpath],
+    [lt_cv_shlibpath_overrides_runpath=no
+    save_LDFLAGS=$LDFLAGS
+    save_libdir=$libdir
+    eval "libdir=/foo; wl=\"$_LT_TAGVAR(lt_prog_compiler_wl, $1)\"; \
+        LDFLAGS=\"\$LDFLAGS $_LT_TAGVAR(hardcode_libdir_flag_spec, $1)\""
+    AC_LINK_IFELSE([AC_LANG_PROGRAM([],[])],
+      [AS_IF([ ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null],
+        [lt_cv_shlibpath_overrides_runpath=yes])])
+    LDFLAGS=$save_LDFLAGS
+    libdir=$save_libdir
+    ])
+  shlibpath_overrides_runpath=$lt_cv_shlibpath_overrides_runpath
+
+  # This implies no fast_install, which is unacceptable.
+  # Some rework will be needed to allow for fast_install
+  # before this can be enabled.
+  hardcode_into_libs=yes
+
+  # Append ld.so.conf contents to the search path
+  if test -f /etc/ld.so.conf; then
+    lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \[$]2)); skip = 1; } { if (!skip) print \[$]0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[  ]*hwcap[        ]/d;s/[:,      ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;s/"//g;/^$/d' | tr '\n' ' '`
+    sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra"
+  fi
+
+  # We used to test for /lib/ld.so.1 and disable shared libraries on
+  # powerpc, because MkLinux only supported shared libraries with the
+  # GNU dynamic linker.  Since this was broken with cross compilers,
+  # most powerpc-linux boxes support dynamic linking these days and
+  # people can always --disable-shared, the test was removed, and we
+  # assume the GNU/Linux dynamic linker is in use.
+  dynamic_linker='GNU/Linux ld.so'
+  ;;
+
+netbsdelf*-gnu)
+  version_type=linux
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=no
+  hardcode_into_libs=yes
+  dynamic_linker='NetBSD ld.elf_so'
+  ;;
+
+netbsd*)
+  version_type=sunos
+  need_lib_prefix=no
+  need_version=no
+  if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
+    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
+    finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
+    dynamic_linker='NetBSD (a.out) ld.so'
+  else
+    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
+    soname_spec='${libname}${release}${shared_ext}$major'
+    dynamic_linker='NetBSD ld.elf_so'
+  fi
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  hardcode_into_libs=yes
+  ;;
+
+newsos6)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  ;;
+
+*nto* | *qnx*)
+  version_type=qnx
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=no
+  hardcode_into_libs=yes
+  dynamic_linker='ldqnx.so'
+  ;;
+
+openbsd*)
+  version_type=sunos
+  sys_lib_dlsearch_path_spec="/usr/lib"
+  need_lib_prefix=no
+  # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs.
+  case $host_os in
+    openbsd3.3 | openbsd3.3.*) need_version=yes ;;
+    *)                         need_version=no  ;;
+  esac
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
+  finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
+  shlibpath_var=LD_LIBRARY_PATH
+  if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
+    case $host_os in
+      openbsd2.[[89]] | openbsd2.[[89]].*)
+       shlibpath_overrides_runpath=no
+       ;;
+      *)
+       shlibpath_overrides_runpath=yes
+       ;;
+      esac
+  else
+    shlibpath_overrides_runpath=yes
+  fi
+  ;;
+
+os2*)
+  libname_spec='$name'
+  shrext_cmds=".dll"
+  need_lib_prefix=no
+  library_names_spec='$libname${shared_ext} $libname.a'
+  dynamic_linker='OS/2 ld.exe'
+  shlibpath_var=LIBPATH
+  ;;
+
+osf3* | osf4* | osf5*)
+  version_type=osf
+  need_lib_prefix=no
+  need_version=no
+  soname_spec='${libname}${release}${shared_ext}$major'
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  shlibpath_var=LD_LIBRARY_PATH
+  sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib"
+  sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec"
+  ;;
+
+rdos*)
+  dynamic_linker=no
+  ;;
+
+solaris*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  hardcode_into_libs=yes
+  # ldd complains unless libraries are executable
+  postinstall_cmds='chmod +x $lib'
+  ;;
+
+sunos4*)
+  version_type=sunos
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
+  finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  if test "$with_gnu_ld" = yes; then
+    need_lib_prefix=no
+  fi
+  need_version=yes
+  ;;
+
+sysv4 | sysv4.3*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  case $host_vendor in
+    sni)
+      shlibpath_overrides_runpath=no
+      need_lib_prefix=no
+      runpath_var=LD_RUN_PATH
+      ;;
+    siemens)
+      need_lib_prefix=no
+      ;;
+    motorola)
+      need_lib_prefix=no
+      need_version=no
+      shlibpath_overrides_runpath=no
+      sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib'
+      ;;
+  esac
+  ;;
+
+sysv4*MP*)
+  if test -d /usr/nec ;then
+    version_type=linux # correct to gnu/linux during the next big refactor
+    library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}'
+    soname_spec='$libname${shared_ext}.$major'
+    shlibpath_var=LD_LIBRARY_PATH
+  fi
+  ;;
+
+sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*)
+  version_type=freebsd-elf
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  hardcode_into_libs=yes
+  if test "$with_gnu_ld" = yes; then
+    sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib'
+  else
+    sys_lib_search_path_spec='/usr/ccs/lib /usr/lib'
+    case $host_os in
+      sco3.2v5*)
+        sys_lib_search_path_spec="$sys_lib_search_path_spec /lib"
+       ;;
+    esac
+  fi
+  sys_lib_dlsearch_path_spec='/usr/lib'
+  ;;
+
+tpf*)
+  # TPF is a cross-target only.  Preferred cross-host = GNU/Linux.
+  version_type=linux # correct to gnu/linux during the next big refactor
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=no
+  hardcode_into_libs=yes
+  ;;
+
+uts4*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  ;;
+
+*)
+  dynamic_linker=no
+  ;;
+esac
+AC_MSG_RESULT([$dynamic_linker])
+test "$dynamic_linker" = no && can_build_shared=no
+
+variables_saved_for_relink="PATH $shlibpath_var $runpath_var"
+if test "$GCC" = yes; then
+  variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH"
+fi
+
+if test "${lt_cv_sys_lib_search_path_spec+set}" = set; then
+  sys_lib_search_path_spec="$lt_cv_sys_lib_search_path_spec"
+fi
+if test "${lt_cv_sys_lib_dlsearch_path_spec+set}" = set; then
+  sys_lib_dlsearch_path_spec="$lt_cv_sys_lib_dlsearch_path_spec"
+fi
+
+_LT_DECL([], [variables_saved_for_relink], [1],
+    [Variables whose values should be saved in libtool wrapper scripts and
+    restored at link time])
+_LT_DECL([], [need_lib_prefix], [0],
+    [Do we need the "lib" prefix for modules?])
+_LT_DECL([], [need_version], [0], [Do we need a version for libraries?])
+_LT_DECL([], [version_type], [0], [Library versioning type])
+_LT_DECL([], [runpath_var], [0],  [Shared library runtime path variable])
+_LT_DECL([], [shlibpath_var], [0],[Shared library path variable])
+_LT_DECL([], [shlibpath_overrides_runpath], [0],
+    [Is shlibpath searched before the hard-coded library search path?])
+_LT_DECL([], [libname_spec], [1], [Format of library name prefix])
+_LT_DECL([], [library_names_spec], [1],
+    [[List of archive names.  First name is the real one, the rest are links.
+    The last name is the one that the linker finds with -lNAME]])
+_LT_DECL([], [soname_spec], [1],
+    [[The coded name of the library, if different from the real name]])
+_LT_DECL([], [install_override_mode], [1],
+    [Permission mode override for installation of shared libraries])
+_LT_DECL([], [postinstall_cmds], [2],
+    [Command to use after installation of a shared archive])
+_LT_DECL([], [postuninstall_cmds], [2],
+    [Command to use after uninstallation of a shared archive])
+_LT_DECL([], [finish_cmds], [2],
+    [Commands used to finish a libtool library installation in a directory])
+_LT_DECL([], [finish_eval], [1],
+    [[As "finish_cmds", except a single script fragment to be evaled but
+    not shown]])
+_LT_DECL([], [hardcode_into_libs], [0],
+    [Whether we should hardcode library paths into libraries])
+_LT_DECL([], [sys_lib_search_path_spec], [2],
+    [Compile-time system search path for libraries])
+_LT_DECL([], [sys_lib_dlsearch_path_spec], [2],
+    [Run-time system search path for libraries])
+])# _LT_SYS_DYNAMIC_LINKER
+
+
+# _LT_PATH_TOOL_PREFIX(TOOL)
+# --------------------------
+# find a file program which can recognize shared library
+AC_DEFUN([_LT_PATH_TOOL_PREFIX],
+[m4_require([_LT_DECL_EGREP])dnl
+AC_MSG_CHECKING([for $1])
+AC_CACHE_VAL(lt_cv_path_MAGIC_CMD,
+[case $MAGIC_CMD in
+[[\\/*] |  ?:[\\/]*])
+  lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path.
+  ;;
+*)
+  lt_save_MAGIC_CMD="$MAGIC_CMD"
+  lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
+dnl $ac_dummy forces splitting on constant user-supplied paths.
+dnl POSIX.2 word splitting is done only on the output of word expansions,
+dnl not every word.  This closes a longstanding sh security hole.
+  ac_dummy="m4_if([$2], , $PATH, [$2])"
+  for ac_dir in $ac_dummy; do
+    IFS="$lt_save_ifs"
+    test -z "$ac_dir" && ac_dir=.
+    if test -f $ac_dir/$1; then
+      lt_cv_path_MAGIC_CMD="$ac_dir/$1"
+      if test -n "$file_magic_test_file"; then
+       case $deplibs_check_method in
+       "file_magic "*)
+         file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"`
+         MAGIC_CMD="$lt_cv_path_MAGIC_CMD"
+         if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null |
+           $EGREP "$file_magic_regex" > /dev/null; then
+           :
+         else
+           cat <<_LT_EOF 1>&2
+
+*** Warning: the command libtool uses to detect shared libraries,
+*** $file_magic_cmd, produces output that libtool cannot recognize.
+*** The result is that libtool may fail to recognize shared libraries
+*** as such.  This will affect the creation of libtool libraries that
+*** depend on shared libraries, but programs linked with such libtool
+*** libraries will work regardless of this problem.  Nevertheless, you
+*** may want to report the problem to your system manager and/or to
+*** bug-libtool@gnu.org
+
+_LT_EOF
+         fi ;;
+       esac
+      fi
+      break
+    fi
+  done
+  IFS="$lt_save_ifs"
+  MAGIC_CMD="$lt_save_MAGIC_CMD"
+  ;;
+esac])
+MAGIC_CMD="$lt_cv_path_MAGIC_CMD"
+if test -n "$MAGIC_CMD"; then
+  AC_MSG_RESULT($MAGIC_CMD)
+else
+  AC_MSG_RESULT(no)
+fi
+_LT_DECL([], [MAGIC_CMD], [0],
+        [Used to examine libraries when file_magic_cmd begins with "file"])dnl
+])# _LT_PATH_TOOL_PREFIX
+
+# Old name:
+AU_ALIAS([AC_PATH_TOOL_PREFIX], [_LT_PATH_TOOL_PREFIX])
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([AC_PATH_TOOL_PREFIX], [])
+
+
+# _LT_PATH_MAGIC
+# --------------
+# find a file program which can recognize a shared library
+m4_defun([_LT_PATH_MAGIC],
+[_LT_PATH_TOOL_PREFIX(${ac_tool_prefix}file, /usr/bin$PATH_SEPARATOR$PATH)
+if test -z "$lt_cv_path_MAGIC_CMD"; then
+  if test -n "$ac_tool_prefix"; then
+    _LT_PATH_TOOL_PREFIX(file, /usr/bin$PATH_SEPARATOR$PATH)
+  else
+    MAGIC_CMD=:
+  fi
+fi
+])# _LT_PATH_MAGIC
+
+
+# LT_PATH_LD
+# ----------
+# find the pathname to the GNU or non-GNU linker
+AC_DEFUN([LT_PATH_LD],
+[AC_REQUIRE([AC_PROG_CC])dnl
+AC_REQUIRE([AC_CANONICAL_HOST])dnl
+AC_REQUIRE([AC_CANONICAL_BUILD])dnl
+m4_require([_LT_DECL_SED])dnl
+m4_require([_LT_DECL_EGREP])dnl
+m4_require([_LT_PROG_ECHO_BACKSLASH])dnl
+
+AC_ARG_WITH([gnu-ld],
+    [AS_HELP_STRING([--with-gnu-ld],
+       [assume the C compiler uses GNU ld @<:@default=no@:>@])],
+    [test "$withval" = no || with_gnu_ld=yes],
+    [with_gnu_ld=no])dnl
+
+ac_prog=ld
+if test "$GCC" = yes; then
+  # Check if gcc -print-prog-name=ld gives a path.
+  AC_MSG_CHECKING([for ld used by $CC])
+  case $host in
+  *-*-mingw*)
+    # gcc leaves a trailing carriage return which upsets mingw
+    ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;;
+  *)
+    ac_prog=`($CC -print-prog-name=ld) 2>&5` ;;
+  esac
+  case $ac_prog in
+    # Accept absolute paths.
+    [[\\/]]* | ?:[[\\/]]*)
+      re_direlt='/[[^/]][[^/]]*/\.\./'
+      # Canonicalize the pathname of ld
+      ac_prog=`$ECHO "$ac_prog"| $SED 's%\\\\%/%g'`
+      while $ECHO "$ac_prog" | $GREP "$re_direlt" > /dev/null 2>&1; do
+       ac_prog=`$ECHO $ac_prog| $SED "s%$re_direlt%/%"`
+      done
+      test -z "$LD" && LD="$ac_prog"
+      ;;
+  "")
+    # If it fails, then pretend we aren't using GCC.
+    ac_prog=ld
+    ;;
+  *)
+    # If it is relative, then search for the first ld in PATH.
+    with_gnu_ld=unknown
+    ;;
+  esac
+elif test "$with_gnu_ld" = yes; then
+  AC_MSG_CHECKING([for GNU ld])
+else
+  AC_MSG_CHECKING([for non-GNU ld])
+fi
+AC_CACHE_VAL(lt_cv_path_LD,
+[if test -z "$LD"; then
+  lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
+  for ac_dir in $PATH; do
+    IFS="$lt_save_ifs"
+    test -z "$ac_dir" && ac_dir=.
+    if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then
+      lt_cv_path_LD="$ac_dir/$ac_prog"
+      # Check to see if the program is GNU ld.  I'd rather use --version,
+      # but apparently some variants of GNU ld only accept -v.
+      # Break only if it was the GNU/non-GNU ld that we prefer.
+      case `"$lt_cv_path_LD" -v 2>&1 </dev/null` in
+      *GNU* | *'with BFD'*)
+       test "$with_gnu_ld" != no && break
+       ;;
+      *)
+       test "$with_gnu_ld" != yes && break
+       ;;
+      esac
+    fi
+  done
+  IFS="$lt_save_ifs"
+else
+  lt_cv_path_LD="$LD" # Let the user override the test with a path.
+fi])
+LD="$lt_cv_path_LD"
+if test -n "$LD"; then
+  AC_MSG_RESULT($LD)
+else
+  AC_MSG_RESULT(no)
+fi
+test -z "$LD" && AC_MSG_ERROR([no acceptable ld found in \$PATH])
+_LT_PATH_LD_GNU
+AC_SUBST([LD])
+
+_LT_TAGDECL([], [LD], [1], [The linker used to build libraries])
+])# LT_PATH_LD
+
+# Old names:
+AU_ALIAS([AM_PROG_LD], [LT_PATH_LD])
+AU_ALIAS([AC_PROG_LD], [LT_PATH_LD])
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([AM_PROG_LD], [])
+dnl AC_DEFUN([AC_PROG_LD], [])
+
+
+# _LT_PATH_LD_GNU
+#- --------------
+m4_defun([_LT_PATH_LD_GNU],
+[AC_CACHE_CHECK([if the linker ($LD) is GNU ld], lt_cv_prog_gnu_ld,
+[# I'd rather use --version here, but apparently some GNU lds only accept -v.
+case `$LD -v 2>&1 </dev/null` in
+*GNU* | *'with BFD'*)
+  lt_cv_prog_gnu_ld=yes
+  ;;
+*)
+  lt_cv_prog_gnu_ld=no
+  ;;
+esac])
+with_gnu_ld=$lt_cv_prog_gnu_ld
+])# _LT_PATH_LD_GNU
+
+
+# _LT_CMD_RELOAD
+# --------------
+# find reload flag for linker
+#   -- PORTME Some linkers may need a different reload flag.
+m4_defun([_LT_CMD_RELOAD],
+[AC_CACHE_CHECK([for $LD option to reload object files],
+  lt_cv_ld_reload_flag,
+  [lt_cv_ld_reload_flag='-r'])
+reload_flag=$lt_cv_ld_reload_flag
+case $reload_flag in
+"" | " "*) ;;
+*) reload_flag=" $reload_flag" ;;
+esac
+reload_cmds='$LD$reload_flag -o $output$reload_objs'
+case $host_os in
+  cygwin* | mingw* | pw32* | cegcc*)
+    if test "$GCC" != yes; then
+      reload_cmds=false
+    fi
+    ;;
+  darwin*)
+    if test "$GCC" = yes; then
+      reload_cmds='$LTCC $LTCFLAGS -nostdlib ${wl}-r -o $output$reload_objs'
+    else
+      reload_cmds='$LD$reload_flag -o $output$reload_objs'
+    fi
+    ;;
+esac
+_LT_TAGDECL([], [reload_flag], [1], [How to create reloadable object files])dnl
+_LT_TAGDECL([], [reload_cmds], [2])dnl
+])# _LT_CMD_RELOAD
+
+
+# _LT_CHECK_MAGIC_METHOD
+# ----------------------
+# how to check for library dependencies
+#  -- PORTME fill in with the dynamic library characteristics
+m4_defun([_LT_CHECK_MAGIC_METHOD],
+[m4_require([_LT_DECL_EGREP])
+m4_require([_LT_DECL_OBJDUMP])
+AC_CACHE_CHECK([how to recognize dependent libraries],
+lt_cv_deplibs_check_method,
+[lt_cv_file_magic_cmd='$MAGIC_CMD'
+lt_cv_file_magic_test_file=
+lt_cv_deplibs_check_method='unknown'
+# Need to set the preceding variable on all platforms that support
+# interlibrary dependencies.
+# 'none' -- dependencies not supported.
+# `unknown' -- same as none, but documents that we really don't know.
+# 'pass_all' -- all dependencies passed with no checks.
+# 'test_compile' -- check by making test program.
+# 'file_magic [[regex]]' -- check by looking for files in library path
+# which responds to the $file_magic_cmd with a given extended regex.
+# If you have `file' or equivalent on your system and you're not sure
+# whether `pass_all' will *always* work, you probably want this one.
+
+case $host_os in
+aix[[4-9]]*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+beos*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+bsdi[[45]]*)
+  lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (shared object|dynamic lib)'
+  lt_cv_file_magic_cmd='/usr/bin/file -L'
+  lt_cv_file_magic_test_file=/shlib/libc.so
+  ;;
+
+cygwin*)
+  # func_win32_libid is a shell function defined in ltmain.sh
+  lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL'
+  lt_cv_file_magic_cmd='func_win32_libid'
+  ;;
+
+mingw* | pw32*)
+  # Base MSYS/MinGW do not provide the 'file' command needed by
+  # func_win32_libid shell function, so use a weaker test based on 'objdump',
+  # unless we find 'file', for example because we are cross-compiling.
+  # func_win32_libid assumes BSD nm, so disallow it if using MS dumpbin.
+  if ( test "$lt_cv_nm_interface" = "BSD nm" && file / ) >/dev/null 2>&1; then
+    lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL'
+    lt_cv_file_magic_cmd='func_win32_libid'
+  else
+    # Keep this pattern in sync with the one in func_win32_libid.
+    lt_cv_deplibs_check_method='file_magic file format (pei*-i386(.*architecture: i386)?|pe-arm-wince|pe-x86-64)'
+    lt_cv_file_magic_cmd='$OBJDUMP -f'
+  fi
+  ;;
+
+cegcc*)
+  # use the weaker test based on 'objdump'. See mingw*.
+  lt_cv_deplibs_check_method='file_magic file format pe-arm-.*little(.*architecture: arm)?'
+  lt_cv_file_magic_cmd='$OBJDUMP -f'
+  ;;
+
+darwin* | rhapsody*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+freebsd* | dragonfly*)
+  if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then
+    case $host_cpu in
+    i*86 )
+      # Not sure whether the presence of OpenBSD here was a mistake.
+      # Let's accept both of them until this is cleared up.
+      lt_cv_deplibs_check_method='file_magic (FreeBSD|OpenBSD|DragonFly)/i[[3-9]]86 (compact )?demand paged shared library'
+      lt_cv_file_magic_cmd=/usr/bin/file
+      lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*`
+      ;;
+    esac
+  else
+    lt_cv_deplibs_check_method=pass_all
+  fi
+  ;;
+
+gnu*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+haiku*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+hpux10.20* | hpux11*)
+  lt_cv_file_magic_cmd=/usr/bin/file
+  case $host_cpu in
+  ia64*)
+    lt_cv_deplibs_check_method='file_magic (s[[0-9]][[0-9]][[0-9]]|ELF-[[0-9]][[0-9]]) shared object file - IA64'
+    lt_cv_file_magic_test_file=/usr/lib/hpux32/libc.so
+    ;;
+  hppa*64*)
+    [lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF[ -][0-9][0-9])(-bit)?( [LM]SB)? shared object( file)?[, -]* PA-RISC [0-9]\.[0-9]']
+    lt_cv_file_magic_test_file=/usr/lib/pa20_64/libc.sl
+    ;;
+  *)
+    lt_cv_deplibs_check_method='file_magic (s[[0-9]][[0-9]][[0-9]]|PA-RISC[[0-9]]\.[[0-9]]) shared library'
+    lt_cv_file_magic_test_file=/usr/lib/libc.sl
+    ;;
+  esac
+  ;;
+
+interix[[3-9]]*)
+  # PIC code is broken on Interix 3.x, that's why |\.a not |_pic\.a here
+  lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so|\.a)$'
+  ;;
+
+irix5* | irix6* | nonstopux*)
+  case $LD in
+  *-32|*"-32 ") libmagic=32-bit;;
+  *-n32|*"-n32 ") libmagic=N32;;
+  *-64|*"-64 ") libmagic=64-bit;;
+  *) libmagic=never-match;;
+  esac
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+# This must be glibc/ELF.
+linux* | k*bsd*-gnu | kopensolaris*-gnu)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+netbsd* | netbsdelf*-gnu)
+  if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then
+    lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|_pic\.a)$'
+  else
+    lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so|_pic\.a)$'
+  fi
+  ;;
+
+newos6*)
+  lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (executable|dynamic lib)'
+  lt_cv_file_magic_cmd=/usr/bin/file
+  lt_cv_file_magic_test_file=/usr/lib/libnls.so
+  ;;
+
+*nto* | *qnx*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+openbsd*)
+  if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
+    lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|\.so|_pic\.a)$'
+  else
+    lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|_pic\.a)$'
+  fi
+  ;;
+
+osf3* | osf4* | osf5*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+rdos*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+solaris*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+sysv4 | sysv4.3*)
+  case $host_vendor in
+  motorola)
+    lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (shared object|dynamic lib) M[[0-9]][[0-9]]* Version [[0-9]]'
+    lt_cv_file_magic_test_file=`echo /usr/lib/libc.so*`
+    ;;
+  ncr)
+    lt_cv_deplibs_check_method=pass_all
+    ;;
+  sequent)
+    lt_cv_file_magic_cmd='/bin/file'
+    lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB (shared object|dynamic lib )'
+    ;;
+  sni)
+    lt_cv_file_magic_cmd='/bin/file'
+    lt_cv_deplibs_check_method="file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB dynamic lib"
+    lt_cv_file_magic_test_file=/lib/libc.so
+    ;;
+  siemens)
+    lt_cv_deplibs_check_method=pass_all
+    ;;
+  pc)
+    lt_cv_deplibs_check_method=pass_all
+    ;;
+  esac
+  ;;
+
+tpf*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+esac
+])
+
+file_magic_glob=
+want_nocaseglob=no
+if test "$build" = "$host"; then
+  case $host_os in
+  mingw* | pw32*)
+    if ( shopt | grep nocaseglob ) >/dev/null 2>&1; then
+      want_nocaseglob=yes
+    else
+      file_magic_glob=`echo aAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsStTuUvVwWxXyYzZ | $SED -e "s/\(..\)/s\/[[\1]]\/[[\1]]\/g;/g"`
+    fi
+    ;;
+  esac
+fi
+
+file_magic_cmd=$lt_cv_file_magic_cmd
+deplibs_check_method=$lt_cv_deplibs_check_method
+test -z "$deplibs_check_method" && deplibs_check_method=unknown
+
+_LT_DECL([], [deplibs_check_method], [1],
+    [Method to check whether dependent libraries are shared objects])
+_LT_DECL([], [file_magic_cmd], [1],
+    [Command to use when deplibs_check_method = "file_magic"])
+_LT_DECL([], [file_magic_glob], [1],
+    [How to find potential files when deplibs_check_method = "file_magic"])
+_LT_DECL([], [want_nocaseglob], [1],
+    [Find potential files using nocaseglob when deplibs_check_method = "file_magic"])
+])# _LT_CHECK_MAGIC_METHOD
+
+
+# LT_PATH_NM
+# ----------
+# find the pathname to a BSD- or MS-compatible name lister
+AC_DEFUN([LT_PATH_NM],
+[AC_REQUIRE([AC_PROG_CC])dnl
+AC_CACHE_CHECK([for BSD- or MS-compatible name lister (nm)], lt_cv_path_NM,
+[if test -n "$NM"; then
+  # Let the user override the test.
+  lt_cv_path_NM="$NM"
+else
+  lt_nm_to_check="${ac_tool_prefix}nm"
+  if test -n "$ac_tool_prefix" && test "$build" = "$host"; then
+    lt_nm_to_check="$lt_nm_to_check nm"
+  fi
+  for lt_tmp_nm in $lt_nm_to_check; do
+    lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
+    for ac_dir in $PATH /usr/ccs/bin/elf /usr/ccs/bin /usr/ucb /bin; do
+      IFS="$lt_save_ifs"
+      test -z "$ac_dir" && ac_dir=.
+      tmp_nm="$ac_dir/$lt_tmp_nm"
+      if test -f "$tmp_nm" || test -f "$tmp_nm$ac_exeext" ; then
+       # Check to see if the nm accepts a BSD-compat flag.
+       # Adding the `sed 1q' prevents false positives on HP-UX, which says:
+       #   nm: unknown option "B" ignored
+       # Tru64's nm complains that /dev/null is an invalid object file
+       case `"$tmp_nm" -B /dev/null 2>&1 | sed '1q'` in
+       */dev/null* | *'Invalid file or object type'*)
+         lt_cv_path_NM="$tmp_nm -B"
+         break
+         ;;
+       *)
+         case `"$tmp_nm" -p /dev/null 2>&1 | sed '1q'` in
+         */dev/null*)
+           lt_cv_path_NM="$tmp_nm -p"
+           break
+           ;;
+         *)
+           lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but
+           continue # so that we can try to find one that supports BSD flags
+           ;;
+         esac
+         ;;
+       esac
+      fi
+    done
+    IFS="$lt_save_ifs"
+  done
+  : ${lt_cv_path_NM=no}
+fi])
+if test "$lt_cv_path_NM" != "no"; then
+  NM="$lt_cv_path_NM"
+else
+  # Didn't find any BSD compatible name lister, look for dumpbin.
+  if test -n "$DUMPBIN"; then :
+    # Let the user override the test.
+  else
+    AC_CHECK_TOOLS(DUMPBIN, [dumpbin "link -dump"], :)
+    case `$DUMPBIN -symbols /dev/null 2>&1 | sed '1q'` in
+    *COFF*)
+      DUMPBIN="$DUMPBIN -symbols"
+      ;;
+    *)
+      DUMPBIN=:
+      ;;
+    esac
+  fi
+  AC_SUBST([DUMPBIN])
+  if test "$DUMPBIN" != ":"; then
+    NM="$DUMPBIN"
+  fi
+fi
+test -z "$NM" && NM=nm
+AC_SUBST([NM])
+_LT_DECL([], [NM], [1], [A BSD- or MS-compatible name lister])dnl
+
+AC_CACHE_CHECK([the name lister ($NM) interface], [lt_cv_nm_interface],
+  [lt_cv_nm_interface="BSD nm"
+  echo "int some_variable = 0;" > conftest.$ac_ext
+  (eval echo "\"\$as_me:$LINENO: $ac_compile\"" >&AS_MESSAGE_LOG_FD)
+  (eval "$ac_compile" 2>conftest.err)
+  cat conftest.err >&AS_MESSAGE_LOG_FD
+  (eval echo "\"\$as_me:$LINENO: $NM \\\"conftest.$ac_objext\\\"\"" >&AS_MESSAGE_LOG_FD)
+  (eval "$NM \"conftest.$ac_objext\"" 2>conftest.err > conftest.out)
+  cat conftest.err >&AS_MESSAGE_LOG_FD
+  (eval echo "\"\$as_me:$LINENO: output\"" >&AS_MESSAGE_LOG_FD)
+  cat conftest.out >&AS_MESSAGE_LOG_FD
+  if $GREP 'External.*some_variable' conftest.out > /dev/null; then
+    lt_cv_nm_interface="MS dumpbin"
+  fi
+  rm -f conftest*])
+])# LT_PATH_NM
+
+# Old names:
+AU_ALIAS([AM_PROG_NM], [LT_PATH_NM])
+AU_ALIAS([AC_PROG_NM], [LT_PATH_NM])
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([AM_PROG_NM], [])
+dnl AC_DEFUN([AC_PROG_NM], [])
+
+# _LT_CHECK_SHAREDLIB_FROM_LINKLIB
+# --------------------------------
+# how to determine the name of the shared library
+# associated with a specific link library.
+#  -- PORTME fill in with the dynamic library characteristics
+m4_defun([_LT_CHECK_SHAREDLIB_FROM_LINKLIB],
+[m4_require([_LT_DECL_EGREP])
+m4_require([_LT_DECL_OBJDUMP])
+m4_require([_LT_DECL_DLLTOOL])
+AC_CACHE_CHECK([how to associate runtime and link libraries],
+lt_cv_sharedlib_from_linklib_cmd,
+[lt_cv_sharedlib_from_linklib_cmd='unknown'
+
+case $host_os in
+cygwin* | mingw* | pw32* | cegcc*)
+  # two different shell functions defined in ltmain.sh
+  # decide which to use based on capabilities of $DLLTOOL
+  case `$DLLTOOL --help 2>&1` in
+  *--identify-strict*)
+    lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib
+    ;;
+  *)
+    lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib_fallback
+    ;;
+  esac
+  ;;
+*)
+  # fallback: assume linklib IS sharedlib
+  lt_cv_sharedlib_from_linklib_cmd="$ECHO"
+  ;;
+esac
+])
+sharedlib_from_linklib_cmd=$lt_cv_sharedlib_from_linklib_cmd
+test -z "$sharedlib_from_linklib_cmd" && sharedlib_from_linklib_cmd=$ECHO
+
+_LT_DECL([], [sharedlib_from_linklib_cmd], [1],
+    [Command to associate shared and link libraries])
+])# _LT_CHECK_SHAREDLIB_FROM_LINKLIB
+
+
+# _LT_PATH_MANIFEST_TOOL
+# ----------------------
+# locate the manifest tool
+m4_defun([_LT_PATH_MANIFEST_TOOL],
+[AC_CHECK_TOOL(MANIFEST_TOOL, mt, :)
+test -z "$MANIFEST_TOOL" && MANIFEST_TOOL=mt
+AC_CACHE_CHECK([if $MANIFEST_TOOL is a manifest tool], [lt_cv_path_mainfest_tool],
+  [lt_cv_path_mainfest_tool=no
+  echo "$as_me:$LINENO: $MANIFEST_TOOL '-?'" >&AS_MESSAGE_LOG_FD
+  $MANIFEST_TOOL '-?' 2>conftest.err > conftest.out
+  cat conftest.err >&AS_MESSAGE_LOG_FD
+  if $GREP 'Manifest Tool' conftest.out > /dev/null; then
+    lt_cv_path_mainfest_tool=yes
+  fi
+  rm -f conftest*])
+if test "x$lt_cv_path_mainfest_tool" != xyes; then
+  MANIFEST_TOOL=:
+fi
+_LT_DECL([], [MANIFEST_TOOL], [1], [Manifest tool])dnl
+])# _LT_PATH_MANIFEST_TOOL
+
+
+# LT_LIB_M
+# --------
+# check for math library
+AC_DEFUN([LT_LIB_M],
+[AC_REQUIRE([AC_CANONICAL_HOST])dnl
+LIBM=
+case $host in
+*-*-beos* | *-*-cegcc* | *-*-cygwin* | *-*-haiku* | *-*-pw32* | *-*-darwin*)
+  # These system don't have libm, or don't need it
+  ;;
+*-ncr-sysv4.3*)
+  AC_CHECK_LIB(mw, _mwvalidcheckl, LIBM="-lmw")
+  AC_CHECK_LIB(m, cos, LIBM="$LIBM -lm")
+  ;;
+*)
+  AC_CHECK_LIB(m, cos, LIBM="-lm")
+  ;;
+esac
+AC_SUBST([LIBM])
+])# LT_LIB_M
+
+# Old name:
+AU_ALIAS([AC_CHECK_LIBM], [LT_LIB_M])
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([AC_CHECK_LIBM], [])
+
+
+# _LT_COMPILER_NO_RTTI([TAGNAME])
+# -------------------------------
+m4_defun([_LT_COMPILER_NO_RTTI],
+[m4_require([_LT_TAG_COMPILER])dnl
+
+_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=
+
+if test "$GCC" = yes; then
+  case $cc_basename in
+  nvcc*)
+    _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -Xcompiler -fno-builtin' ;;
+  *)
+    _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -fno-builtin' ;;
+  esac
+
+  _LT_COMPILER_OPTION([if $compiler supports -fno-rtti -fno-exceptions],
+    lt_cv_prog_compiler_rtti_exceptions,
+    [-fno-rtti -fno-exceptions], [],
+    [_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)="$_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1) -fno-rtti -fno-exceptions"])
+fi
+_LT_TAGDECL([no_builtin_flag], [lt_prog_compiler_no_builtin_flag], [1],
+       [Compiler flag to turn off builtin functions])
+])# _LT_COMPILER_NO_RTTI
+
+
+# _LT_CMD_GLOBAL_SYMBOLS
+# ----------------------
+m4_defun([_LT_CMD_GLOBAL_SYMBOLS],
+[AC_REQUIRE([AC_CANONICAL_HOST])dnl
+AC_REQUIRE([AC_PROG_CC])dnl
+AC_REQUIRE([AC_PROG_AWK])dnl
+AC_REQUIRE([LT_PATH_NM])dnl
+AC_REQUIRE([LT_PATH_LD])dnl
+m4_require([_LT_DECL_SED])dnl
+m4_require([_LT_DECL_EGREP])dnl
+m4_require([_LT_TAG_COMPILER])dnl
+
+# Check for command to grab the raw symbol name followed by C symbol from nm.
+AC_MSG_CHECKING([command to parse $NM output from $compiler object])
+AC_CACHE_VAL([lt_cv_sys_global_symbol_pipe],
+[
+# These are sane defaults that work on at least a few old systems.
+# [They come from Ultrix.  What could be older than Ultrix?!! ;)]
+
+# Character class describing NM global symbol codes.
+symcode='[[BCDEGRST]]'
+
+# Regexp to match symbols that can be accessed directly from C.
+sympat='\([[_A-Za-z]][[_A-Za-z0-9]]*\)'
+
+# Define system-specific variables.
+case $host_os in
+aix*)
+  symcode='[[BCDT]]'
+  ;;
+cygwin* | mingw* | pw32* | cegcc*)
+  symcode='[[ABCDGISTW]]'
+  ;;
+hpux*)
+  if test "$host_cpu" = ia64; then
+    symcode='[[ABCDEGRST]]'
+  fi
+  ;;
+irix* | nonstopux*)
+  symcode='[[BCDEGRST]]'
+  ;;
+osf*)
+  symcode='[[BCDEGQRST]]'
+  ;;
+solaris*)
+  symcode='[[BDRT]]'
+  ;;
+sco3.2v5*)
+  symcode='[[DT]]'
+  ;;
+sysv4.2uw2*)
+  symcode='[[DT]]'
+  ;;
+sysv5* | sco5v6* | unixware* | OpenUNIX*)
+  symcode='[[ABDT]]'
+  ;;
+sysv4)
+  symcode='[[DFNSTU]]'
+  ;;
+esac
+
+# If we're using GNU nm, then use its standard symbol codes.
+case `$NM -V 2>&1` in
+*GNU* | *'with BFD'*)
+  symcode='[[ABCDGIRSTW]]' ;;
+esac
+
+# Transform an extracted symbol line into a proper C declaration.
+# Some systems (esp. on ia64) link data and code symbols differently,
+# so use this general approach.
+lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern int \1();/p' -e 's/^$symcode* .* \(.*\)$/extern char \1;/p'"
+
+# Transform an extracted symbol line into symbol name and symbol address
+lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([[^ ]]*\)[[ ]]*$/  {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([[^ ]]*\) \([[^ ]]*\)$/  {\"\2\", (void *) \&\2},/p'"
+lt_cv_sys_global_symbol_to_c_name_address_lib_prefix="sed -n -e 's/^: \([[^ ]]*\)[[ ]]*$/  {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([[^ ]]*\) \(lib[[^ ]]*\)$/  {\"\2\", (void *) \&\2},/p' -e 's/^$symcode* \([[^ ]]*\) \([[^ ]]*\)$/  {\"lib\2\", (void *) \&\2},/p'"
+
+# Handle CRLF in mingw tool chain
+opt_cr=
+case $build_os in
+mingw*)
+  opt_cr=`$ECHO 'x\{0,1\}' | tr x '\015'` # option cr in regexp
+  ;;
+esac
+
+# Try without a prefix underscore, then with it.
+for ac_symprfx in "" "_"; do
+
+  # Transform symcode, sympat, and symprfx into a raw symbol and a C symbol.
+  symxfrm="\\1 $ac_symprfx\\2 \\2"
+
+  # Write the raw and C identifiers.
+  if test "$lt_cv_nm_interface" = "MS dumpbin"; then
+    # Fake it for dumpbin and say T for any non-static function
+    # and D for any global variable.
+    # Also find C++ and __fastcall symbols from MSVC++,
+    # which start with @ or ?.
+    lt_cv_sys_global_symbol_pipe="$AWK ['"\
+"     {last_section=section; section=\$ 3};"\
+"     /^COFF SYMBOL TABLE/{for(i in hide) delete hide[i]};"\
+"     /Section length .*#relocs.*(pick any)/{hide[last_section]=1};"\
+"     \$ 0!~/External *\|/{next};"\
+"     / 0+ UNDEF /{next}; / UNDEF \([^|]\)*()/{next};"\
+"     {if(hide[section]) next};"\
+"     {f=0}; \$ 0~/\(\).*\|/{f=1}; {printf f ? \"T \" : \"D \"};"\
+"     {split(\$ 0, a, /\||\r/); split(a[2], s)};"\
+"     s[1]~/^[@?]/{print s[1], s[1]; next};"\
+"     s[1]~prfx {split(s[1],t,\"@\"); print t[1], substr(t[1],length(prfx))}"\
+"     ' prfx=^$ac_symprfx]"
+  else
+    lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[[    ]]\($symcode$symcode*\)[[       ]][[    ]]*$ac_symprfx$sympat$opt_cr$/$symxfrm/p'"
+  fi
+  lt_cv_sys_global_symbol_pipe="$lt_cv_sys_global_symbol_pipe | sed '/ __gnu_lto/d'"
+
+  # Check to see that the pipe works correctly.
+  pipe_works=no
+
+  rm -f conftest*
+  cat > conftest.$ac_ext <<_LT_EOF
+#ifdef __cplusplus
+extern "C" {
+#endif
+char nm_test_var;
+void nm_test_func(void);
+void nm_test_func(void){}
+#ifdef __cplusplus
+}
+#endif
+int main(){nm_test_var='a';nm_test_func();return(0);}
+_LT_EOF
+
+  if AC_TRY_EVAL(ac_compile); then
+    # Now try to grab the symbols.
+    nlist=conftest.nm
+    if AC_TRY_EVAL(NM conftest.$ac_objext \| "$lt_cv_sys_global_symbol_pipe" \> $nlist) && test -s "$nlist"; then
+      # Try sorting and uniquifying the output.
+      if sort "$nlist" | uniq > "$nlist"T; then
+       mv -f "$nlist"T "$nlist"
+      else
+       rm -f "$nlist"T
+      fi
+
+      # Make sure that we snagged all the symbols we need.
+      if $GREP ' nm_test_var$' "$nlist" >/dev/null; then
+       if $GREP ' nm_test_func$' "$nlist" >/dev/null; then
+         cat <<_LT_EOF > conftest.$ac_ext
+/* Keep this code in sync between libtool.m4, ltmain, lt_system.h, and tests.  */
+#if defined(_WIN32) || defined(__CYGWIN__) || defined(_WIN32_WCE)
+/* DATA imports from DLLs on WIN32 con't be const, because runtime
+   relocations are performed -- see ld's documentation on pseudo-relocs.  */
+# define LT@&t@_DLSYM_CONST
+#elif defined(__osf__)
+/* This system does not cope well with relocations in const data.  */
+# define LT@&t@_DLSYM_CONST
+#else
+# define LT@&t@_DLSYM_CONST const
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+_LT_EOF
+         # Now generate the symbol file.
+         eval "$lt_cv_sys_global_symbol_to_cdecl"' < "$nlist" | $GREP -v main >> conftest.$ac_ext'
+
+         cat <<_LT_EOF >> conftest.$ac_ext
+
+/* The mapping between symbol names and symbols.  */
+LT@&t@_DLSYM_CONST struct {
+  const char *name;
+  void       *address;
+}
+lt__PROGRAM__LTX_preloaded_symbols[[]] =
+{
+  { "@PROGRAM@", (void *) 0 },
+_LT_EOF
+         $SED "s/^$symcode$symcode* \(.*\) \(.*\)$/  {\"\2\", (void *) \&\2},/" < "$nlist" | $GREP -v main >> conftest.$ac_ext
+         cat <<\_LT_EOF >> conftest.$ac_ext
+  {0, (void *) 0}
+};
+
+/* This works around a problem in FreeBSD linker */
+#ifdef FREEBSD_WORKAROUND
+static const void *lt_preloaded_setup() {
+  return lt__PROGRAM__LTX_preloaded_symbols;
+}
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+_LT_EOF
+         # Now try linking the two files.
+         mv conftest.$ac_objext conftstm.$ac_objext
+         lt_globsym_save_LIBS=$LIBS
+         lt_globsym_save_CFLAGS=$CFLAGS
+         LIBS="conftstm.$ac_objext"
+         CFLAGS="$CFLAGS$_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)"
+         if AC_TRY_EVAL(ac_link) && test -s conftest${ac_exeext}; then
+           pipe_works=yes
+         fi
+         LIBS=$lt_globsym_save_LIBS
+         CFLAGS=$lt_globsym_save_CFLAGS
+       else
+         echo "cannot find nm_test_func in $nlist" >&AS_MESSAGE_LOG_FD
+       fi
+      else
+       echo "cannot find nm_test_var in $nlist" >&AS_MESSAGE_LOG_FD
+      fi
+    else
+      echo "cannot run $lt_cv_sys_global_symbol_pipe" >&AS_MESSAGE_LOG_FD
+    fi
+  else
+    echo "$progname: failed program was:" >&AS_MESSAGE_LOG_FD
+    cat conftest.$ac_ext >&5
+  fi
+  rm -rf conftest* conftst*
+
+  # Do not use the global_symbol_pipe unless it works.
+  if test "$pipe_works" = yes; then
+    break
+  else
+    lt_cv_sys_global_symbol_pipe=
+  fi
+done
+])
+if test -z "$lt_cv_sys_global_symbol_pipe"; then
+  lt_cv_sys_global_symbol_to_cdecl=
+fi
+if test -z "$lt_cv_sys_global_symbol_pipe$lt_cv_sys_global_symbol_to_cdecl"; then
+  AC_MSG_RESULT(failed)
+else
+  AC_MSG_RESULT(ok)
+fi
+
+# Response file support.
+if test "$lt_cv_nm_interface" = "MS dumpbin"; then
+  nm_file_list_spec='@'
+elif $NM --help 2>/dev/null | grep '[[@]]FILE' >/dev/null; then
+  nm_file_list_spec='@'
+fi
+
+_LT_DECL([global_symbol_pipe], [lt_cv_sys_global_symbol_pipe], [1],
+    [Take the output of nm and produce a listing of raw symbols and C names])
+_LT_DECL([global_symbol_to_cdecl], [lt_cv_sys_global_symbol_to_cdecl], [1],
+    [Transform the output of nm in a proper C declaration])
+_LT_DECL([global_symbol_to_c_name_address],
+    [lt_cv_sys_global_symbol_to_c_name_address], [1],
+    [Transform the output of nm in a C name address pair])
+_LT_DECL([global_symbol_to_c_name_address_lib_prefix],
+    [lt_cv_sys_global_symbol_to_c_name_address_lib_prefix], [1],
+    [Transform the output of nm in a C name address pair when lib prefix is needed])
+_LT_DECL([], [nm_file_list_spec], [1],
+    [Specify filename containing input files for $NM])
+]) # _LT_CMD_GLOBAL_SYMBOLS
+
+
+# _LT_COMPILER_PIC([TAGNAME])
+# ---------------------------
+m4_defun([_LT_COMPILER_PIC],
+[m4_require([_LT_TAG_COMPILER])dnl
+_LT_TAGVAR(lt_prog_compiler_wl, $1)=
+_LT_TAGVAR(lt_prog_compiler_pic, $1)=
+_LT_TAGVAR(lt_prog_compiler_static, $1)=
+
+m4_if([$1], [CXX], [
+  # C++ specific cases for pic, static, wl, etc.
+  if test "$GXX" = yes; then
+    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+    _LT_TAGVAR(lt_prog_compiler_static, $1)='-static'
+
+    case $host_os in
+    aix*)
+      # All AIX code is PIC.
+      if test "$host_cpu" = ia64; then
+       # AIX 5 now supports IA64 processor
+       _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+      fi
+      ;;
+
+    amigaos*)
+      case $host_cpu in
+      powerpc)
+            # see comment about AmigaOS4 .so support
+            _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
+        ;;
+      m68k)
+            # FIXME: we need at least 68020 code to build shared libraries, but
+            # adding the `-m68020' flag to GCC prevents building anything better,
+            # like `-m68040'.
+            _LT_TAGVAR(lt_prog_compiler_pic, $1)='-m68020 -resident32 -malways-restore-a4'
+        ;;
+      esac
+      ;;
+
+    beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*)
+      # PIC is the default for these OSes.
+      ;;
+    mingw* | cygwin* | os2* | pw32* | cegcc*)
+      # This hack is so that the source file can tell whether it is being
+      # built for inclusion in a dll (and should export symbols for example).
+      # Although the cygwin gcc ignores -fPIC, still need this for old-style
+      # (--disable-auto-import) libraries
+      m4_if([$1], [GCJ], [],
+       [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT'])
+      ;;
+    darwin* | rhapsody*)
+      # PIC is the default on this platform
+      # Common symbols not allowed in MH_DYLIB files
+      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common'
+      ;;
+    *djgpp*)
+      # DJGPP does not support shared libraries at all
+      _LT_TAGVAR(lt_prog_compiler_pic, $1)=
+      ;;
+    haiku*)
+      # PIC is the default for Haiku.
+      # The "-static" flag exists, but is broken.
+      _LT_TAGVAR(lt_prog_compiler_static, $1)=
+      ;;
+    interix[[3-9]]*)
+      # Interix 3.x gcc -fpic/-fPIC options generate broken code.
+      # Instead, we relocate shared libraries at runtime.
+      ;;
+    sysv4*MP*)
+      if test -d /usr/nec; then
+       _LT_TAGVAR(lt_prog_compiler_pic, $1)=-Kconform_pic
+      fi
+      ;;
+    hpux*)
+      # PIC is the default for 64-bit PA HP-UX, but not for 32-bit
+      # PA HP-UX.  On IA64 HP-UX, PIC is the default but the pic flag
+      # sets the default TLS model and affects inlining.
+      case $host_cpu in
+      hppa*64*)
+       ;;
+      *)
+       _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
+       ;;
+      esac
+      ;;
+    *qnx* | *nto*)
+      # QNX uses GNU C++, but need to define -shared option too, otherwise
+      # it will coredump.
+      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared'
+      ;;
+    *)
+      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
+      ;;
+    esac
+  else
+    case $host_os in
+      aix[[4-9]]*)
+       # All AIX code is PIC.
+       if test "$host_cpu" = ia64; then
+         # AIX 5 now supports IA64 processor
+         _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+       else
+         _LT_TAGVAR(lt_prog_compiler_static, $1)='-bnso -bI:/lib/syscalls.exp'
+       fi
+       ;;
+      chorus*)
+       case $cc_basename in
+       cxch68*)
+         # Green Hills C++ Compiler
+         # _LT_TAGVAR(lt_prog_compiler_static, $1)="--no_auto_instantiation -u __main -u __premain -u _abort -r $COOL_DIR/lib/libOrb.a $MVME_DIR/lib/CC/libC.a $MVME_DIR/lib/classix/libcx.s.a"
+         ;;
+       esac
+       ;;
+      mingw* | cygwin* | os2* | pw32* | cegcc*)
+       # This hack is so that the source file can tell whether it is being
+       # built for inclusion in a dll (and should export symbols for example).
+       m4_if([$1], [GCJ], [],
+         [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT'])
+       ;;
+      dgux*)
+       case $cc_basename in
+         ec++*)
+           _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+           ;;
+         ghcx*)
+           # Green Hills C++ Compiler
+           _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic'
+           ;;
+         *)
+           ;;
+       esac
+       ;;
+      freebsd* | dragonfly*)
+       # FreeBSD uses GNU C++
+       ;;
+      hpux9* | hpux10* | hpux11*)
+       case $cc_basename in
+         CC*)
+           _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+           _LT_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive'
+           if test "$host_cpu" != ia64; then
+             _LT_TAGVAR(lt_prog_compiler_pic, $1)='+Z'
+           fi
+           ;;
+         aCC*)
+           _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+           _LT_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive'
+           case $host_cpu in
+           hppa*64*|ia64*)
+             # +Z the default
+             ;;
+           *)
+             _LT_TAGVAR(lt_prog_compiler_pic, $1)='+Z'
+             ;;
+           esac
+           ;;
+         *)
+           ;;
+       esac
+       ;;
+      interix*)
+       # This is c89, which is MS Visual C++ (no shared libs)
+       # Anyone wants to do a port?
+       ;;
+      irix5* | irix6* | nonstopux*)
+       case $cc_basename in
+         CC*)
+           _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+           _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared'
+           # CC pic flag -KPIC is the default.
+           ;;
+         *)
+           ;;
+       esac
+       ;;
+      linux* | k*bsd*-gnu | kopensolaris*-gnu)
+       case $cc_basename in
+         KCC*)
+           # KAI C++ Compiler
+           _LT_TAGVAR(lt_prog_compiler_wl, $1)='--backend -Wl,'
+           _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
+           ;;
+         ecpc* )
+           # old Intel C++ for x86_64 which still supported -KPIC.
+           _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+           _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+           _LT_TAGVAR(lt_prog_compiler_static, $1)='-static'
+           ;;
+         icpc* )
+           # Intel C++, used to be incompatible with GCC.
+           # ICC 10 doesn't accept -KPIC any more.
+           _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+           _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
+           _LT_TAGVAR(lt_prog_compiler_static, $1)='-static'
+           ;;
+         pgCC* | pgcpp*)
+           # Portland Group C++ compiler
+           _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+           _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fpic'
+           _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+           ;;
+         cxx*)
+           # Compaq C++
+           # Make sure the PIC flag is empty.  It appears that all Alpha
+           # Linux and Compaq Tru64 Unix objects are PIC.
+           _LT_TAGVAR(lt_prog_compiler_pic, $1)=
+           _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared'
+           ;;
+         xlc* | xlC* | bgxl[[cC]]* | mpixl[[cC]]*)
+           # IBM XL 8.0, 9.0 on PPC and BlueGene
+           _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+           _LT_TAGVAR(lt_prog_compiler_pic, $1)='-qpic'
+           _LT_TAGVAR(lt_prog_compiler_static, $1)='-qstaticlink'
+           ;;
+         *)
+           case `$CC -V 2>&1 | sed 5q` in
+           *Sun\ C*)
+             # Sun C++ 5.9
+             _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+             _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+             _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld '
+             ;;
+           esac
+           ;;
+       esac
+       ;;
+      lynxos*)
+       ;;
+      m88k*)
+       ;;
+      mvs*)
+       case $cc_basename in
+         cxx*)
+           _LT_TAGVAR(lt_prog_compiler_pic, $1)='-W c,exportall'
+           ;;
+         *)
+           ;;
+       esac
+       ;;
+      netbsd* | netbsdelf*-gnu)
+       ;;
+      *qnx* | *nto*)
+        # QNX uses GNU C++, but need to define -shared option too, otherwise
+        # it will coredump.
+        _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared'
+        ;;
+      osf3* | osf4* | osf5*)
+       case $cc_basename in
+         KCC*)
+           _LT_TAGVAR(lt_prog_compiler_wl, $1)='--backend -Wl,'
+           ;;
+         RCC*)
+           # Rational C++ 2.4.1
+           _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic'
+           ;;
+         cxx*)
+           # Digital/Compaq C++
+           _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+           # Make sure the PIC flag is empty.  It appears that all Alpha
+           # Linux and Compaq Tru64 Unix objects are PIC.
+           _LT_TAGVAR(lt_prog_compiler_pic, $1)=
+           _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared'
+           ;;
+         *)
+           ;;
+       esac
+       ;;
+      psos*)
+       ;;
+      solaris*)
+       case $cc_basename in
+         CC* | sunCC*)
+           # Sun C++ 4.2, 5.x and Centerline C++
+           _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+           _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+           _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld '
+           ;;
+         gcx*)
+           # Green Hills C++ Compiler
+           _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC'
+           ;;
+         *)
+           ;;
+       esac
+       ;;
+      sunos4*)
+       case $cc_basename in
+         CC*)
+           # Sun C++ 4.x
+           _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic'
+           _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+           ;;
+         lcc*)
+           # Lucid
+           _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic'
+           ;;
+         *)
+           ;;
+       esac
+       ;;
+      sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*)
+       case $cc_basename in
+         CC*)
+           _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+           _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+           _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+           ;;
+       esac
+       ;;
+      tandem*)
+       case $cc_basename in
+         NCC*)
+           # NonStop-UX NCC 3.20
+           _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+           ;;
+         *)
+           ;;
+       esac
+       ;;
+      vxworks*)
+       ;;
+      *)
+       _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no
+       ;;
+    esac
+  fi
+],
+[
+  if test "$GCC" = yes; then
+    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+    _LT_TAGVAR(lt_prog_compiler_static, $1)='-static'
+
+    case $host_os in
+      aix*)
+      # All AIX code is PIC.
+      if test "$host_cpu" = ia64; then
+       # AIX 5 now supports IA64 processor
+       _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+      fi
+      ;;
+
+    amigaos*)
+      case $host_cpu in
+      powerpc)
+            # see comment about AmigaOS4 .so support
+            _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
+        ;;
+      m68k)
+            # FIXME: we need at least 68020 code to build shared libraries, but
+            # adding the `-m68020' flag to GCC prevents building anything better,
+            # like `-m68040'.
+            _LT_TAGVAR(lt_prog_compiler_pic, $1)='-m68020 -resident32 -malways-restore-a4'
+        ;;
+      esac
+      ;;
+
+    beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*)
+      # PIC is the default for these OSes.
+      ;;
+
+    mingw* | cygwin* | pw32* | os2* | cegcc*)
+      # This hack is so that the source file can tell whether it is being
+      # built for inclusion in a dll (and should export symbols for example).
+      # Although the cygwin gcc ignores -fPIC, still need this for old-style
+      # (--disable-auto-import) libraries
+      m4_if([$1], [GCJ], [],
+       [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT'])
+      ;;
+
+    darwin* | rhapsody*)
+      # PIC is the default on this platform
+      # Common symbols not allowed in MH_DYLIB files
+      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common'
+      ;;
+
+    haiku*)
+      # PIC is the default for Haiku.
+      # The "-static" flag exists, but is broken.
+      _LT_TAGVAR(lt_prog_compiler_static, $1)=
+      ;;
+
+    hpux*)
+      # PIC is the default for 64-bit PA HP-UX, but not for 32-bit
+      # PA HP-UX.  On IA64 HP-UX, PIC is the default but the pic flag
+      # sets the default TLS model and affects inlining.
+      case $host_cpu in
+      hppa*64*)
+       # +Z the default
+       ;;
+      *)
+       _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
+       ;;
+      esac
+      ;;
+
+    interix[[3-9]]*)
+      # Interix 3.x gcc -fpic/-fPIC options generate broken code.
+      # Instead, we relocate shared libraries at runtime.
+      ;;
+
+    msdosdjgpp*)
+      # Just because we use GCC doesn't mean we suddenly get shared libraries
+      # on systems that don't support them.
+      _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no
+      enable_shared=no
+      ;;
+
+    *nto* | *qnx*)
+      # QNX uses GNU C++, but need to define -shared option too, otherwise
+      # it will coredump.
+      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared'
+      ;;
+
+    sysv4*MP*)
+      if test -d /usr/nec; then
+       _LT_TAGVAR(lt_prog_compiler_pic, $1)=-Kconform_pic
+      fi
+      ;;
+
+    *)
+      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
+      ;;
+    esac
+
+    case $cc_basename in
+    nvcc*) # Cuda Compiler Driver 2.2
+      _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Xlinker '
+      if test -n "$_LT_TAGVAR(lt_prog_compiler_pic, $1)"; then
+        _LT_TAGVAR(lt_prog_compiler_pic, $1)="-Xcompiler $_LT_TAGVAR(lt_prog_compiler_pic, $1)"
+      fi
+      ;;
+    esac
+  else
+    # PORTME Check for flag to pass linker flags through the system compiler.
+    case $host_os in
+    aix*)
+      _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+      if test "$host_cpu" = ia64; then
+       # AIX 5 now supports IA64 processor
+       _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+      else
+       _LT_TAGVAR(lt_prog_compiler_static, $1)='-bnso -bI:/lib/syscalls.exp'
+      fi
+      ;;
+
+    mingw* | cygwin* | pw32* | os2* | cegcc*)
+      # This hack is so that the source file can tell whether it is being
+      # built for inclusion in a dll (and should export symbols for example).
+      m4_if([$1], [GCJ], [],
+       [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT'])
+      ;;
+
+    hpux9* | hpux10* | hpux11*)
+      _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+      # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but
+      # not for PA HP-UX.
+      case $host_cpu in
+      hppa*64*|ia64*)
+       # +Z the default
+       ;;
+      *)
+       _LT_TAGVAR(lt_prog_compiler_pic, $1)='+Z'
+       ;;
+      esac
+      # Is there a better lt_prog_compiler_static that works with the bundled CC?
+      _LT_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive'
+      ;;
+
+    irix5* | irix6* | nonstopux*)
+      _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+      # PIC (with -KPIC) is the default.
+      _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared'
+      ;;
+
+    linux* | k*bsd*-gnu | kopensolaris*-gnu)
+      case $cc_basename in
+      # old Intel for x86_64 which still supported -KPIC.
+      ecc*)
+       _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+       _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+       _LT_TAGVAR(lt_prog_compiler_static, $1)='-static'
+        ;;
+      # icc used to be incompatible with GCC.
+      # ICC 10 doesn't accept -KPIC any more.
+      icc* | ifort*)
+       _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+       _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
+       _LT_TAGVAR(lt_prog_compiler_static, $1)='-static'
+        ;;
+      # Lahey Fortran 8.1.
+      lf95*)
+       _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+       _LT_TAGVAR(lt_prog_compiler_pic, $1)='--shared'
+       _LT_TAGVAR(lt_prog_compiler_static, $1)='--static'
+       ;;
+      nagfor*)
+       # NAG Fortran compiler
+       _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,-Wl,,'
+       _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC'
+       _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+       ;;
+      pgcc* | pgf77* | pgf90* | pgf95* | pgfortran*)
+        # Portland Group compilers (*not* the Pentium gcc compiler,
+       # which looks to be a dead project)
+       _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+       _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fpic'
+       _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+        ;;
+      ccc*)
+        _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+        # All Alpha code is PIC.
+        _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared'
+        ;;
+      xl* | bgxl* | bgf* | mpixl*)
+       # IBM XL C 8.0/Fortran 10.1, 11.1 on PPC and BlueGene
+       _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+       _LT_TAGVAR(lt_prog_compiler_pic, $1)='-qpic'
+       _LT_TAGVAR(lt_prog_compiler_static, $1)='-qstaticlink'
+       ;;
+      *)
+       case `$CC -V 2>&1 | sed 5q` in
+       *Sun\ Ceres\ Fortran* | *Sun*Fortran*\ [[1-7]].* | *Sun*Fortran*\ 8.[[0-3]]*)
+         # Sun Fortran 8.3 passes all unrecognized flags to the linker
+         _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+         _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+         _LT_TAGVAR(lt_prog_compiler_wl, $1)=''
+         ;;
+       *Sun\ F* | *Sun*Fortran*)
+         _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+         _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+         _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld '
+         ;;
+       *Sun\ C*)
+         # Sun C 5.9
+         _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+         _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+         _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+         ;;
+        *Intel*\ [[CF]]*Compiler*)
+         _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+         _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
+         _LT_TAGVAR(lt_prog_compiler_static, $1)='-static'
+         ;;
+       *Portland\ Group*)
+         _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+         _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fpic'
+         _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+         ;;
+       esac
+       ;;
+      esac
+      ;;
+
+    newsos6)
+      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+      _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+      ;;
+
+    *nto* | *qnx*)
+      # QNX uses GNU C++, but need to define -shared option too, otherwise
+      # it will coredump.
+      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared'
+      ;;
+
+    osf3* | osf4* | osf5*)
+      _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+      # All OSF/1 code is PIC.
+      _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared'
+      ;;
+
+    rdos*)
+      _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared'
+      ;;
+
+    solaris*)
+      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+      _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+      case $cc_basename in
+      f77* | f90* | f95* | sunf77* | sunf90* | sunf95*)
+       _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ';;
+      *)
+       _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,';;
+      esac
+      ;;
+
+    sunos4*)
+      _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld '
+      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC'
+      _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+      ;;
+
+    sysv4 | sysv4.2uw2* | sysv4.3*)
+      _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+      _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+      ;;
+
+    sysv4*MP*)
+      if test -d /usr/nec ;then
+       _LT_TAGVAR(lt_prog_compiler_pic, $1)='-Kconform_pic'
+       _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+      fi
+      ;;
+
+    sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*)
+      _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+      _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+      ;;
+
+    unicos*)
+      _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+      _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no
+      ;;
+
+    uts4*)
+      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic'
+      _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+      ;;
+
+    *)
+      _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no
+      ;;
+    esac
+  fi
+])
+case $host_os in
+  # For platforms which do not support PIC, -DPIC is meaningless:
+  *djgpp*)
+    _LT_TAGVAR(lt_prog_compiler_pic, $1)=
+    ;;
+  *)
+    _LT_TAGVAR(lt_prog_compiler_pic, $1)="$_LT_TAGVAR(lt_prog_compiler_pic, $1)@&t@m4_if([$1],[],[ -DPIC],[m4_if([$1],[CXX],[ -DPIC],[])])"
+    ;;
+esac
+
+AC_CACHE_CHECK([for $compiler option to produce PIC],
+  [_LT_TAGVAR(lt_cv_prog_compiler_pic, $1)],
+  [_LT_TAGVAR(lt_cv_prog_compiler_pic, $1)=$_LT_TAGVAR(lt_prog_compiler_pic, $1)])
+_LT_TAGVAR(lt_prog_compiler_pic, $1)=$_LT_TAGVAR(lt_cv_prog_compiler_pic, $1)
+
+#
+# Check to make sure the PIC flag actually works.
+#
+if test -n "$_LT_TAGVAR(lt_prog_compiler_pic, $1)"; then
+  _LT_COMPILER_OPTION([if $compiler PIC flag $_LT_TAGVAR(lt_prog_compiler_pic, $1) works],
+    [_LT_TAGVAR(lt_cv_prog_compiler_pic_works, $1)],
+    [$_LT_TAGVAR(lt_prog_compiler_pic, $1)@&t@m4_if([$1],[],[ -DPIC],[m4_if([$1],[CXX],[ -DPIC],[])])], [],
+    [case $_LT_TAGVAR(lt_prog_compiler_pic, $1) in
+     "" | " "*) ;;
+     *) _LT_TAGVAR(lt_prog_compiler_pic, $1)=" $_LT_TAGVAR(lt_prog_compiler_pic, $1)" ;;
+     esac],
+    [_LT_TAGVAR(lt_prog_compiler_pic, $1)=
+     _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no])
+fi
+_LT_TAGDECL([pic_flag], [lt_prog_compiler_pic], [1],
+       [Additional compiler flags for building library objects])
+
+_LT_TAGDECL([wl], [lt_prog_compiler_wl], [1],
+       [How to pass a linker flag through the compiler])
+#
+# Check to make sure the static flag actually works.
+#
+wl=$_LT_TAGVAR(lt_prog_compiler_wl, $1) eval lt_tmp_static_flag=\"$_LT_TAGVAR(lt_prog_compiler_static, $1)\"
+_LT_LINKER_OPTION([if $compiler static flag $lt_tmp_static_flag works],
+  _LT_TAGVAR(lt_cv_prog_compiler_static_works, $1),
+  $lt_tmp_static_flag,
+  [],
+  [_LT_TAGVAR(lt_prog_compiler_static, $1)=])
+_LT_TAGDECL([link_static_flag], [lt_prog_compiler_static], [1],
+       [Compiler flag to prevent dynamic linking])
+])# _LT_COMPILER_PIC
+
+
+# _LT_LINKER_SHLIBS([TAGNAME])
+# ----------------------------
+# See if the linker supports building shared libraries.
+m4_defun([_LT_LINKER_SHLIBS],
+[AC_REQUIRE([LT_PATH_LD])dnl
+AC_REQUIRE([LT_PATH_NM])dnl
+m4_require([_LT_PATH_MANIFEST_TOOL])dnl
+m4_require([_LT_FILEUTILS_DEFAULTS])dnl
+m4_require([_LT_DECL_EGREP])dnl
+m4_require([_LT_DECL_SED])dnl
+m4_require([_LT_CMD_GLOBAL_SYMBOLS])dnl
+m4_require([_LT_TAG_COMPILER])dnl
+AC_MSG_CHECKING([whether the $compiler linker ($LD) supports shared libraries])
+m4_if([$1], [CXX], [
+  _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols'
+  _LT_TAGVAR(exclude_expsyms, $1)=['_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*']
+  case $host_os in
+  aix[[4-9]]*)
+    # If we're using GNU nm, then we don't want the "-C" option.
+    # -C means demangle to AIX nm, but means don't demangle with GNU nm
+    # Also, AIX nm treats weak defined symbols like other global defined
+    # symbols, whereas GNU nm marks them as "W".
+    if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then
+      _LT_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols'
+    else
+      _LT_TAGVAR(export_symbols_cmds, $1)='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols'
+    fi
+    ;;
+  pw32*)
+    _LT_TAGVAR(export_symbols_cmds, $1)="$ltdll_cmds"
+    ;;
+  cygwin* | mingw* | cegcc*)
+    case $cc_basename in
+    cl*)
+      _LT_TAGVAR(exclude_expsyms, $1)='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*'
+      ;;
+    *)
+      _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1 DATA/;s/^.*[[ ]]__nm__\([[^ ]]*\)[[ ]][[^ ]]*/\1 DATA/;/^I[[ ]]/d;/^[[AITW]][[ ]]/s/.* //'\'' | sort | uniq > $export_symbols'
+      _LT_TAGVAR(exclude_expsyms, $1)=['[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname']
+      ;;
+    esac
+    ;;
+  linux* | k*bsd*-gnu | gnu*)
+    _LT_TAGVAR(link_all_deplibs, $1)=no
+    ;;
+  *)
+    _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols'
+    ;;
+  esac
+], [
+  runpath_var=
+  _LT_TAGVAR(allow_undefined_flag, $1)=
+  _LT_TAGVAR(always_export_symbols, $1)=no
+  _LT_TAGVAR(archive_cmds, $1)=
+  _LT_TAGVAR(archive_expsym_cmds, $1)=
+  _LT_TAGVAR(compiler_needs_object, $1)=no
+  _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no
+  _LT_TAGVAR(export_dynamic_flag_spec, $1)=
+  _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols'
+  _LT_TAGVAR(hardcode_automatic, $1)=no
+  _LT_TAGVAR(hardcode_direct, $1)=no
+  _LT_TAGVAR(hardcode_direct_absolute, $1)=no
+  _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=
+  _LT_TAGVAR(hardcode_libdir_separator, $1)=
+  _LT_TAGVAR(hardcode_minus_L, $1)=no
+  _LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported
+  _LT_TAGVAR(inherit_rpath, $1)=no
+  _LT_TAGVAR(link_all_deplibs, $1)=unknown
+  _LT_TAGVAR(module_cmds, $1)=
+  _LT_TAGVAR(module_expsym_cmds, $1)=
+  _LT_TAGVAR(old_archive_from_new_cmds, $1)=
+  _LT_TAGVAR(old_archive_from_expsyms_cmds, $1)=
+  _LT_TAGVAR(thread_safe_flag_spec, $1)=
+  _LT_TAGVAR(whole_archive_flag_spec, $1)=
+  # include_expsyms should be a list of space-separated symbols to be *always*
+  # included in the symbol list
+  _LT_TAGVAR(include_expsyms, $1)=
+  # exclude_expsyms can be an extended regexp of symbols to exclude
+  # it will be wrapped by ` (' and `)$', so one must not match beginning or
+  # end of line.  Example: `a|bc|.*d.*' will exclude the symbols `a' and `bc',
+  # as well as any symbol that contains `d'.
+  _LT_TAGVAR(exclude_expsyms, $1)=['_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*']
+  # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out
+  # platforms (ab)use it in PIC code, but their linkers get confused if
+  # the symbol is explicitly referenced.  Since portable code cannot
+  # rely on this symbol name, it's probably fine to never include it in
+  # preloaded symbol tables.
+  # Exclude shared library initialization/finalization symbols.
+dnl Note also adjust exclude_expsyms for C++ above.
+  extract_expsyms_cmds=
+
+  case $host_os in
+  cygwin* | mingw* | pw32* | cegcc*)
+    # FIXME: the MSVC++ port hasn't been tested in a loooong time
+    # When not using gcc, we currently assume that we are using
+    # Microsoft Visual C++.
+    if test "$GCC" != yes; then
+      with_gnu_ld=no
+    fi
+    ;;
+  interix*)
+    # we just hope/assume this is gcc and not c89 (= MSVC++)
+    with_gnu_ld=yes
+    ;;
+  openbsd*)
+    with_gnu_ld=no
+    ;;
+  linux* | k*bsd*-gnu | gnu*)
+    _LT_TAGVAR(link_all_deplibs, $1)=no
+    ;;
+  esac
+
+  _LT_TAGVAR(ld_shlibs, $1)=yes
+
+  # On some targets, GNU ld is compatible enough with the native linker
+  # that we're better off using the native interface for both.
+  lt_use_gnu_ld_interface=no
+  if test "$with_gnu_ld" = yes; then
+    case $host_os in
+      aix*)
+       # The AIX port of GNU ld has always aspired to compatibility
+       # with the native linker.  However, as the warning in the GNU ld
+       # block says, versions before 2.19.5* couldn't really create working
+       # shared libraries, regardless of the interface used.
+       case `$LD -v 2>&1` in
+         *\ \(GNU\ Binutils\)\ 2.19.5*) ;;
+         *\ \(GNU\ Binutils\)\ 2.[[2-9]]*) ;;
+         *\ \(GNU\ Binutils\)\ [[3-9]]*) ;;
+         *)
+           lt_use_gnu_ld_interface=yes
+           ;;
+       esac
+       ;;
+      *)
+       lt_use_gnu_ld_interface=yes
+       ;;
+    esac
+  fi
+
+  if test "$lt_use_gnu_ld_interface" = yes; then
+    # If archive_cmds runs LD, not CC, wlarc should be empty
+    wlarc='${wl}'
+
+    # Set some defaults for GNU ld with shared library support. These
+    # are reset later if shared libraries are not supported. Putting them
+    # here allows them to be overridden if necessary.
+    runpath_var=LD_RUN_PATH
+    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
+    _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic'
+    # ancient GNU ld didn't support --whole-archive et. al.
+    if $LD --help 2>&1 | $GREP 'no-whole-archive' > /dev/null; then
+      _LT_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive'
+    else
+      _LT_TAGVAR(whole_archive_flag_spec, $1)=
+    fi
+    supports_anon_versioning=no
+    case `$LD -v 2>&1` in
+      *GNU\ gold*) supports_anon_versioning=yes ;;
+      *\ [[01]].* | *\ 2.[[0-9]].* | *\ 2.10.*) ;; # catch versions < 2.11
+      *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ...
+      *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ...
+      *\ 2.11.*) ;; # other 2.11 versions
+      *) supports_anon_versioning=yes ;;
+    esac
+
+    # See if GNU ld supports shared libraries.
+    case $host_os in
+    aix[[3-9]]*)
+      # On AIX/PPC, the GNU linker is very broken
+      if test "$host_cpu" != ia64; then
+       _LT_TAGVAR(ld_shlibs, $1)=no
+       cat <<_LT_EOF 1>&2
+
+*** Warning: the GNU linker, at least up to release 2.19, is reported
+*** to be unable to reliably create shared libraries on AIX.
+*** Therefore, libtool is disabling shared libraries support.  If you
+*** really care for shared libraries, you may want to install binutils
+*** 2.20 or above, or modify your PATH so that a non-GNU linker is found.
+*** You will then need to restart the configuration process.
+
+_LT_EOF
+      fi
+      ;;
+
+    amigaos*)
+      case $host_cpu in
+      powerpc)
+            # see comment about AmigaOS4 .so support
+            _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+            _LT_TAGVAR(archive_expsym_cmds, $1)=''
+        ;;
+      m68k)
+            _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)'
+            _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
+            _LT_TAGVAR(hardcode_minus_L, $1)=yes
+        ;;
+      esac
+      ;;
+
+    beos*)
+      if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
+       _LT_TAGVAR(allow_undefined_flag, $1)=unsupported
+       # Joseph Beckenbach <jrb3@best.com> says some releases of gcc
+       # support --undefined.  This deserves some investigation.  FIXME
+       _LT_TAGVAR(archive_cmds, $1)='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+      else
+       _LT_TAGVAR(ld_shlibs, $1)=no
+      fi
+      ;;
+
+    cygwin* | mingw* | pw32* | cegcc*)
+      # _LT_TAGVAR(hardcode_libdir_flag_spec, $1) is actually meaningless,
+      # as there is no search path for DLLs.
+      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
+      _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-all-symbols'
+      _LT_TAGVAR(allow_undefined_flag, $1)=unsupported
+      _LT_TAGVAR(always_export_symbols, $1)=no
+      _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes
+      _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1 DATA/;s/^.*[[ ]]__nm__\([[^ ]]*\)[[ ]][[^ ]]*/\1 DATA/;/^I[[ ]]/d;/^[[AITW]][[ ]]/s/.* //'\'' | sort | uniq > $export_symbols'
+      _LT_TAGVAR(exclude_expsyms, $1)=['[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname']
+
+      if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then
+        _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
+       # If the export-symbols file already is a .def file (1st line
+       # is EXPORTS), use it as is; otherwise, prepend...
+       _LT_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then
+         cp $export_symbols $output_objdir/$soname.def;
+       else
+         echo EXPORTS > $output_objdir/$soname.def;
+         cat $export_symbols >> $output_objdir/$soname.def;
+       fi~
+       $CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
+      else
+       _LT_TAGVAR(ld_shlibs, $1)=no
+      fi
+      ;;
+
+    haiku*)
+      _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+      _LT_TAGVAR(link_all_deplibs, $1)=yes
+      ;;
+
+    interix[[3-9]]*)
+      _LT_TAGVAR(hardcode_direct, $1)=no
+      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'
+      _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
+      # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc.
+      # Instead, shared libraries are loaded at an image base (0x10000000 by
+      # default) and relocated if they conflict, which is a slow very memory
+      # consuming and fragmenting process.  To avoid this, we pick a random,
+      # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link
+      # time.  Moving up from 0x10000000 also allows more sbrk(2) space.
+      _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
+      _LT_TAGVAR(archive_expsym_cmds, $1)='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
+      ;;
+
+    gnu* | linux* | tpf* | k*bsd*-gnu | kopensolaris*-gnu)
+      tmp_diet=no
+      if test "$host_os" = linux-dietlibc; then
+       case $cc_basename in
+         diet\ *) tmp_diet=yes;;       # linux-dietlibc with static linking (!diet-dyn)
+       esac
+      fi
+      if $LD --help 2>&1 | $EGREP ': supported targets:.* elf' > /dev/null \
+        && test "$tmp_diet" = no
+      then
+       tmp_addflag=' $pic_flag'
+       tmp_sharedflag='-shared'
+       case $cc_basename,$host_cpu in
+        pgcc*)                         # Portland Group C compiler
+         _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive'
+         tmp_addflag=' $pic_flag'
+         ;;
+       pgf77* | pgf90* | pgf95* | pgfortran*)
+                                       # Portland Group f77 and f90 compilers
+         _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive'
+         tmp_addflag=' $pic_flag -Mnomain' ;;
+       ecc*,ia64* | icc*,ia64*)        # Intel C compiler on ia64
+         tmp_addflag=' -i_dynamic' ;;
+       efc*,ia64* | ifort*,ia64*)      # Intel Fortran compiler on ia64
+         tmp_addflag=' -i_dynamic -nofor_main' ;;
+       ifc* | ifort*)                  # Intel Fortran compiler
+         tmp_addflag=' -nofor_main' ;;
+       lf95*)                          # Lahey Fortran 8.1
+         _LT_TAGVAR(whole_archive_flag_spec, $1)=
+         tmp_sharedflag='--shared' ;;
+       xl[[cC]]* | bgxl[[cC]]* | mpixl[[cC]]*) # IBM XL C 8.0 on PPC (deal with xlf below)
+         tmp_sharedflag='-qmkshrobj'
+         tmp_addflag= ;;
+       nvcc*)  # Cuda Compiler Driver 2.2
+         _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive'
+         _LT_TAGVAR(compiler_needs_object, $1)=yes
+         ;;
+       esac
+       case `$CC -V 2>&1 | sed 5q` in
+       *Sun\ C*)                       # Sun C 5.9
+         _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive'
+         _LT_TAGVAR(compiler_needs_object, $1)=yes
+         tmp_sharedflag='-G' ;;
+       *Sun\ F*)                       # Sun Fortran 8.3
+         tmp_sharedflag='-G' ;;
+       esac
+       _LT_TAGVAR(archive_cmds, $1)='$CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+
+        if test "x$supports_anon_versioning" = xyes; then
+          _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~
+           cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~
+           echo "local: *; };" >> $output_objdir/$libname.ver~
+           $CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib'
+        fi
+
+       case $cc_basename in
+       xlf* | bgf* | bgxlf* | mpixlf*)
+         # IBM XL Fortran 10.1 on PPC cannot create shared libs itself
+         _LT_TAGVAR(whole_archive_flag_spec, $1)='--whole-archive$convenience --no-whole-archive'
+         _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
+         _LT_TAGVAR(archive_cmds, $1)='$LD -shared $libobjs $deplibs $linker_flags -soname $soname -o $lib'
+         if test "x$supports_anon_versioning" = xyes; then
+           _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~
+             cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~
+             echo "local: *; };" >> $output_objdir/$libname.ver~
+             $LD -shared $libobjs $deplibs $linker_flags -soname $soname -version-script $output_objdir/$libname.ver -o $lib'
+         fi
+         ;;
+       esac
+      else
+        _LT_TAGVAR(ld_shlibs, $1)=no
+      fi
+      ;;
+
+    netbsd* | netbsdelf*-gnu)
+      if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
+       _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib'
+       wlarc=
+      else
+       _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+       _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+      fi
+      ;;
+
+    solaris*)
+      if $LD -v 2>&1 | $GREP 'BFD 2\.8' > /dev/null; then
+       _LT_TAGVAR(ld_shlibs, $1)=no
+       cat <<_LT_EOF 1>&2
+
+*** Warning: The releases 2.8.* of the GNU linker cannot reliably
+*** create shared libraries on Solaris systems.  Therefore, libtool
+*** is disabling shared libraries support.  We urge you to upgrade GNU
+*** binutils to release 2.9.1 or newer.  Another option is to modify
+*** your PATH or compiler configuration so that the native linker is
+*** used, and then restart.
+
+_LT_EOF
+      elif $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
+       _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+       _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+      else
+       _LT_TAGVAR(ld_shlibs, $1)=no
+      fi
+      ;;
+
+    sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*)
+      case `$LD -v 2>&1` in
+        *\ [[01]].* | *\ 2.[[0-9]].* | *\ 2.1[[0-5]].*)
+       _LT_TAGVAR(ld_shlibs, $1)=no
+       cat <<_LT_EOF 1>&2
+
+*** Warning: Releases of the GNU linker prior to 2.16.91.0.3 can not
+*** reliably create shared libraries on SCO systems.  Therefore, libtool
+*** is disabling shared libraries support.  We urge you to upgrade GNU
+*** binutils to release 2.16.91.0.3 or newer.  Another option is to modify
+*** your PATH or compiler configuration so that the native linker is
+*** used, and then restart.
+
+_LT_EOF
+       ;;
+       *)
+         # For security reasons, it is highly recommended that you always
+         # use absolute paths for naming shared libraries, and exclude the
+         # DT_RUNPATH tag from executables and libraries.  But doing so
+         # requires that you compile everything twice, which is a pain.
+         if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
+           _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
+           _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+           _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+         else
+           _LT_TAGVAR(ld_shlibs, $1)=no
+         fi
+       ;;
+      esac
+      ;;
+
+    sunos4*)
+      _LT_TAGVAR(archive_cmds, $1)='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags'
+      wlarc=
+      _LT_TAGVAR(hardcode_direct, $1)=yes
+      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+      ;;
+
+    *)
+      if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
+       _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+       _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+      else
+       _LT_TAGVAR(ld_shlibs, $1)=no
+      fi
+      ;;
+    esac
+
+    if test "$_LT_TAGVAR(ld_shlibs, $1)" = no; then
+      runpath_var=
+      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=
+      _LT_TAGVAR(export_dynamic_flag_spec, $1)=
+      _LT_TAGVAR(whole_archive_flag_spec, $1)=
+    fi
+  else
+    # PORTME fill in a description of your system's linker (not GNU ld)
+    case $host_os in
+    aix3*)
+      _LT_TAGVAR(allow_undefined_flag, $1)=unsupported
+      _LT_TAGVAR(always_export_symbols, $1)=yes
+      _LT_TAGVAR(archive_expsym_cmds, $1)='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname'
+      # Note: this linker hardcodes the directories in LIBPATH if there
+      # are no directories specified by -L.
+      _LT_TAGVAR(hardcode_minus_L, $1)=yes
+      if test "$GCC" = yes && test -z "$lt_prog_compiler_static"; then
+       # Neither direct hardcoding nor static linking is supported with a
+       # broken collect2.
+       _LT_TAGVAR(hardcode_direct, $1)=unsupported
+      fi
+      ;;
+
+    aix[[4-9]]*)
+      if test "$host_cpu" = ia64; then
+       # On IA64, the linker does run time linking by default, so we don't
+       # have to do anything special.
+       aix_use_runtimelinking=no
+       exp_sym_flag='-Bexport'
+       no_entry_flag=""
+      else
+       # If we're using GNU nm, then we don't want the "-C" option.
+       # -C means demangle to AIX nm, but means don't demangle with GNU nm
+       # Also, AIX nm treats weak defined symbols like other global
+       # defined symbols, whereas GNU nm marks them as "W".
+       if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then
+         _LT_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols'
+       else
+         _LT_TAGVAR(export_symbols_cmds, $1)='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols'
+       fi
+       aix_use_runtimelinking=no
+
+       # Test if we are trying to use run time linking or normal
+       # AIX style linking. If -brtl is somewhere in LDFLAGS, we
+       # need to do runtime linking.
+       case $host_os in aix4.[[23]]|aix4.[[23]].*|aix[[5-9]]*)
+         for ld_flag in $LDFLAGS; do
+         if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then
+           aix_use_runtimelinking=yes
+           break
+         fi
+         done
+         ;;
+       esac
+
+       exp_sym_flag='-bexport'
+       no_entry_flag='-bnoentry'
+      fi
+
+      # When large executables or shared objects are built, AIX ld can
+      # have problems creating the table of contents.  If linking a library
+      # or program results in "error TOC overflow" add -mminimal-toc to
+      # CXXFLAGS/CFLAGS for g++/gcc.  In the cases where that is not
+      # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS.
+
+      _LT_TAGVAR(archive_cmds, $1)=''
+      _LT_TAGVAR(hardcode_direct, $1)=yes
+      _LT_TAGVAR(hardcode_direct_absolute, $1)=yes
+      _LT_TAGVAR(hardcode_libdir_separator, $1)=':'
+      _LT_TAGVAR(link_all_deplibs, $1)=yes
+      _LT_TAGVAR(file_list_spec, $1)='${wl}-f,'
+
+      if test "$GCC" = yes; then
+       case $host_os in aix4.[[012]]|aix4.[[012]].*)
+       # We only want to do this on AIX 4.2 and lower, the check
+       # below for broken collect2 doesn't work under 4.3+
+         collect2name=`${CC} -print-prog-name=collect2`
+         if test -f "$collect2name" &&
+          strings "$collect2name" | $GREP resolve_lib_name >/dev/null
+         then
+         # We have reworked collect2
+         :
+         else
+         # We have old collect2
+         _LT_TAGVAR(hardcode_direct, $1)=unsupported
+         # It fails to find uninstalled libraries when the uninstalled
+         # path is not listed in the libpath.  Setting hardcode_minus_L
+         # to unsupported forces relinking
+         _LT_TAGVAR(hardcode_minus_L, $1)=yes
+         _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
+         _LT_TAGVAR(hardcode_libdir_separator, $1)=
+         fi
+         ;;
+       esac
+       shared_flag='-shared'
+       if test "$aix_use_runtimelinking" = yes; then
+         shared_flag="$shared_flag "'${wl}-G'
+       fi
+       _LT_TAGVAR(link_all_deplibs, $1)=no
+      else
+       # not using gcc
+       if test "$host_cpu" = ia64; then
+       # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release
+       # chokes on -Wl,-G. The following line is correct:
+         shared_flag='-G'
+       else
+         if test "$aix_use_runtimelinking" = yes; then
+           shared_flag='${wl}-G'
+         else
+           shared_flag='${wl}-bM:SRE'
+         fi
+       fi
+      fi
+
+      _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-bexpall'
+      # It seems that -bexpall does not export symbols beginning with
+      # underscore (_), so it is better to generate a list of symbols to export.
+      _LT_TAGVAR(always_export_symbols, $1)=yes
+      if test "$aix_use_runtimelinking" = yes; then
+       # Warning - without using the other runtime loading flags (-brtl),
+       # -berok will link without error, but may produce a broken library.
+       _LT_TAGVAR(allow_undefined_flag, $1)='-berok'
+        # Determine the default libpath from the value encoded in an
+        # empty executable.
+        _LT_SYS_MODULE_PATH_AIX([$1])
+        _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath"
+        _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then func_echo_all "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag"
+      else
+       if test "$host_cpu" = ia64; then
+         _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $libdir:/usr/lib:/lib'
+         _LT_TAGVAR(allow_undefined_flag, $1)="-z nodefs"
+         _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols"
+       else
+        # Determine the default libpath from the value encoded in an
+        # empty executable.
+        _LT_SYS_MODULE_PATH_AIX([$1])
+        _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath"
+         # Warning - without using the other run time loading flags,
+         # -berok will link without error, but may produce a broken library.
+         _LT_TAGVAR(no_undefined_flag, $1)=' ${wl}-bernotok'
+         _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-berok'
+         if test "$with_gnu_ld" = yes; then
+           # We only use this code for GNU lds that support --whole-archive.
+           _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive$convenience ${wl}--no-whole-archive'
+         else
+           # Exported symbols can be pulled into shared objects from archives
+           _LT_TAGVAR(whole_archive_flag_spec, $1)='$convenience'
+         fi
+         _LT_TAGVAR(archive_cmds_need_lc, $1)=yes
+         # This is similar to how AIX traditionally builds its shared libraries.
+         _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname'
+       fi
+      fi
+      ;;
+
+    amigaos*)
+      case $host_cpu in
+      powerpc)
+            # see comment about AmigaOS4 .so support
+            _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+            _LT_TAGVAR(archive_expsym_cmds, $1)=''
+        ;;
+      m68k)
+            _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)'
+            _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
+            _LT_TAGVAR(hardcode_minus_L, $1)=yes
+        ;;
+      esac
+      ;;
+
+    bsdi[[45]]*)
+      _LT_TAGVAR(export_dynamic_flag_spec, $1)=-rdynamic
+      ;;
+
+    cygwin* | mingw* | pw32* | cegcc*)
+      # When not using gcc, we currently assume that we are using
+      # Microsoft Visual C++.
+      # hardcode_libdir_flag_spec is actually meaningless, as there is
+      # no search path for DLLs.
+      case $cc_basename in
+      cl*)
+       # Native MSVC
+       _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=' '
+       _LT_TAGVAR(allow_undefined_flag, $1)=unsupported
+       _LT_TAGVAR(always_export_symbols, $1)=yes
+       _LT_TAGVAR(file_list_spec, $1)='@'
+       # Tell ltmain to make .lib files, not .a files.
+       libext=lib
+       # Tell ltmain to make .dll files, not .so files.
+       shrext_cmds=".dll"
+       # FIXME: Setting linknames here is a bad hack.
+       _LT_TAGVAR(archive_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-dll~linknames='
+       _LT_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then
+           sed -n -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' -e '1\\\!p' < $export_symbols > $output_objdir/$soname.exp;
+         else
+           sed -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' < $export_symbols > $output_objdir/$soname.exp;
+         fi~
+         $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~
+         linknames='
+       # The linker will not automatically build a static lib if we build a DLL.
+       # _LT_TAGVAR(old_archive_from_new_cmds, $1)='true'
+       _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes
+       _LT_TAGVAR(exclude_expsyms, $1)='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*'
+       _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1,DATA/'\'' | $SED -e '\''/^[[AITW]][[ ]]/s/.*[[ ]]//'\'' | sort | uniq > $export_symbols'
+       # Don't use ranlib
+       _LT_TAGVAR(old_postinstall_cmds, $1)='chmod 644 $oldlib'
+       _LT_TAGVAR(postlink_cmds, $1)='lt_outputfile="@OUTPUT@"~
+         lt_tool_outputfile="@TOOL_OUTPUT@"~
+         case $lt_outputfile in
+           *.exe|*.EXE) ;;
+           *)
+             lt_outputfile="$lt_outputfile.exe"
+             lt_tool_outputfile="$lt_tool_outputfile.exe"
+             ;;
+         esac~
+         if test "$MANIFEST_TOOL" != ":" && test -f "$lt_outputfile.manifest"; then
+           $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1;
+           $RM "$lt_outputfile.manifest";
+         fi'
+       ;;
+      *)
+       # Assume MSVC wrapper
+       _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=' '
+       _LT_TAGVAR(allow_undefined_flag, $1)=unsupported
+       # Tell ltmain to make .lib files, not .a files.
+       libext=lib
+       # Tell ltmain to make .dll files, not .so files.
+       shrext_cmds=".dll"
+       # FIXME: Setting linknames here is a bad hack.
+       _LT_TAGVAR(archive_cmds, $1)='$CC -o $lib $libobjs $compiler_flags `func_echo_all "$deplibs" | $SED '\''s/ -lc$//'\''` -link -dll~linknames='
+       # The linker will automatically build a .lib file if we build a DLL.
+       _LT_TAGVAR(old_archive_from_new_cmds, $1)='true'
+       # FIXME: Should let the user specify the lib program.
+       _LT_TAGVAR(old_archive_cmds, $1)='lib -OUT:$oldlib$oldobjs$old_deplibs'
+       _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes
+       ;;
+      esac
+      ;;
+
+    darwin* | rhapsody*)
+      _LT_DARWIN_LINKER_FEATURES($1)
+      ;;
+
+    dgux*)
+      _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
+      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+      ;;
+
+    # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor
+    # support.  Future versions do this automatically, but an explicit c++rt0.o
+    # does not break anything, and helps significantly (at the cost of a little
+    # extra space).
+    freebsd2.2*)
+      _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o'
+      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'
+      _LT_TAGVAR(hardcode_direct, $1)=yes
+      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+      ;;
+
+    # Unfortunately, older versions of FreeBSD 2 do not have this feature.
+    freebsd2.*)
+      _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'
+      _LT_TAGVAR(hardcode_direct, $1)=yes
+      _LT_TAGVAR(hardcode_minus_L, $1)=yes
+      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+      ;;
+
+    # FreeBSD 3 and greater uses gcc -shared to do shared libraries.
+    freebsd* | dragonfly*)
+      _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
+      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'
+      _LT_TAGVAR(hardcode_direct, $1)=yes
+      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+      ;;
+
+    hpux9*)
+      if test "$GCC" = yes; then
+       _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -shared $pic_flag ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'
+      else
+       _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'
+      fi
+      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir'
+      _LT_TAGVAR(hardcode_libdir_separator, $1)=:
+      _LT_TAGVAR(hardcode_direct, $1)=yes
+
+      # hardcode_minus_L: Not really in the search PATH,
+      # but as the default location of the library.
+      _LT_TAGVAR(hardcode_minus_L, $1)=yes
+      _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
+      ;;
+
+    hpux10*)
+      if test "$GCC" = yes && test "$with_gnu_ld" = no; then
+       _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
+      else
+       _LT_TAGVAR(archive_cmds, $1)='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags'
+      fi
+      if test "$with_gnu_ld" = no; then
+       _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir'
+       _LT_TAGVAR(hardcode_libdir_separator, $1)=:
+       _LT_TAGVAR(hardcode_direct, $1)=yes
+       _LT_TAGVAR(hardcode_direct_absolute, $1)=yes
+       _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
+       # hardcode_minus_L: Not really in the search PATH,
+       # but as the default location of the library.
+       _LT_TAGVAR(hardcode_minus_L, $1)=yes
+      fi
+      ;;
+
+    hpux11*)
+      if test "$GCC" = yes && test "$with_gnu_ld" = no; then
+       case $host_cpu in
+       hppa*64*)
+         _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'
+         ;;
+       ia64*)
+         _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags'
+         ;;
+       *)
+         _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
+         ;;
+       esac
+      else
+       case $host_cpu in
+       hppa*64*)
+         _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'
+         ;;
+       ia64*)
+         _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags'
+         ;;
+       *)
+       m4_if($1, [], [
+         # Older versions of the 11.00 compiler do not understand -b yet
+         # (HP92453-01 A.11.01.20 doesn't, HP92453-01 B.11.X.35175-35176.GP does)
+         _LT_LINKER_OPTION([if $CC understands -b],
+           _LT_TAGVAR(lt_cv_prog_compiler__b, $1), [-b],
+           [_LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'],
+           [_LT_TAGVAR(archive_cmds, $1)='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags'])],
+         [_LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'])
+         ;;
+       esac
+      fi
+      if test "$with_gnu_ld" = no; then
+       _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir'
+       _LT_TAGVAR(hardcode_libdir_separator, $1)=:
+
+       case $host_cpu in
+       hppa*64*|ia64*)
+         _LT_TAGVAR(hardcode_direct, $1)=no
+         _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+         ;;
+       *)
+         _LT_TAGVAR(hardcode_direct, $1)=yes
+         _LT_TAGVAR(hardcode_direct_absolute, $1)=yes
+         _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
+
+         # hardcode_minus_L: Not really in the search PATH,
+         # but as the default location of the library.
+         _LT_TAGVAR(hardcode_minus_L, $1)=yes
+         ;;
+       esac
+      fi
+      ;;
+
+    irix5* | irix6* | nonstopux*)
+      if test "$GCC" = yes; then
+       _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+       # Try to use the -exported_symbol ld option, if it does not
+       # work, assume that -exports_file does not work either and
+       # implicitly export all symbols.
+       # This should be the same for all languages, so no per-tag cache variable.
+       AC_CACHE_CHECK([whether the $host_os linker accepts -exported_symbol],
+         [lt_cv_irix_exported_symbol],
+         [save_LDFLAGS="$LDFLAGS"
+          LDFLAGS="$LDFLAGS -shared ${wl}-exported_symbol ${wl}foo ${wl}-update_registry ${wl}/dev/null"
+          AC_LINK_IFELSE(
+            [AC_LANG_SOURCE(
+               [AC_LANG_CASE([C], [[int foo (void) { return 0; }]],
+                             [C++], [[int foo (void) { return 0; }]],
+                             [Fortran 77], [[
+      subroutine foo
+      end]],
+                             [Fortran], [[
+      subroutine foo
+      end]])])],
+             [lt_cv_irix_exported_symbol=yes],
+             [lt_cv_irix_exported_symbol=no])
+           LDFLAGS="$save_LDFLAGS"])
+       if test "$lt_cv_irix_exported_symbol" = yes; then
+          _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations ${wl}-exports_file ${wl}$export_symbols -o $lib'
+       fi
+      else
+       _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib'
+       _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -exports_file $export_symbols -o $lib'
+      fi
+      _LT_TAGVAR(archive_cmds_need_lc, $1)='no'
+      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
+      _LT_TAGVAR(hardcode_libdir_separator, $1)=:
+      _LT_TAGVAR(inherit_rpath, $1)=yes
+      _LT_TAGVAR(link_all_deplibs, $1)=yes
+      ;;
+
+    netbsd* | netbsdelf*-gnu)
+      if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
+       _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'  # a.out
+      else
+       _LT_TAGVAR(archive_cmds, $1)='$LD -shared -o $lib $libobjs $deplibs $linker_flags'      # ELF
+      fi
+      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'
+      _LT_TAGVAR(hardcode_direct, $1)=yes
+      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+      ;;
+
+    newsos6)
+      _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+      _LT_TAGVAR(hardcode_direct, $1)=yes
+      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
+      _LT_TAGVAR(hardcode_libdir_separator, $1)=:
+      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+      ;;
+
+    *nto* | *qnx*)
+      ;;
+
+    openbsd*)
+      if test -f /usr/libexec/ld.so; then
+       _LT_TAGVAR(hardcode_direct, $1)=yes
+       _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+       _LT_TAGVAR(hardcode_direct_absolute, $1)=yes
+       if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
+         _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
+         _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-retain-symbols-file,$export_symbols'
+         _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'
+         _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
+       else
+         case $host_os in
+          openbsd[[01]].* | openbsd2.[[0-7]] | openbsd2.[[0-7]].*)
+            _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'
+            _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'
+            ;;
+          *)
+            _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
+            _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'
+            ;;
+         esac
+       fi
+      else
+       _LT_TAGVAR(ld_shlibs, $1)=no
+      fi
+      ;;
+
+    os2*)
+      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
+      _LT_TAGVAR(hardcode_minus_L, $1)=yes
+      _LT_TAGVAR(allow_undefined_flag, $1)=unsupported
+      _LT_TAGVAR(archive_cmds, $1)='$ECHO "LIBRARY $libname INITINSTANCE" > $output_objdir/$libname.def~$ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~echo DATA >> $output_objdir/$libname.def~echo " SINGLE NONSHARED" >> $output_objdir/$libname.def~echo EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $compiler_flags $output_objdir/$libname.def'
+      _LT_TAGVAR(old_archive_from_new_cmds, $1)='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def'
+      ;;
+
+    osf3*)
+      if test "$GCC" = yes; then
+       _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*'
+       _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+      else
+       _LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*'
+       _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib'
+      fi
+      _LT_TAGVAR(archive_cmds_need_lc, $1)='no'
+      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
+      _LT_TAGVAR(hardcode_libdir_separator, $1)=:
+      ;;
+
+    osf4* | osf5*)     # as osf3* with the addition of -msym flag
+      if test "$GCC" = yes; then
+       _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*'
+       _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $pic_flag $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+       _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
+      else
+       _LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*'
+       _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib'
+       _LT_TAGVAR(archive_expsym_cmds, $1)='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; printf "%s\\n" "-hidden">> $lib.exp~
+       $CC -shared${allow_undefined_flag} ${wl}-input ${wl}$lib.exp $compiler_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib~$RM $lib.exp'
+
+       # Both c and cxx compiler support -rpath directly
+       _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir'
+      fi
+      _LT_TAGVAR(archive_cmds_need_lc, $1)='no'
+      _LT_TAGVAR(hardcode_libdir_separator, $1)=:
+      ;;
+
+    solaris*)
+      _LT_TAGVAR(no_undefined_flag, $1)=' -z defs'
+      if test "$GCC" = yes; then
+       wlarc='${wl}'
+       _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag ${wl}-z ${wl}text ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'
+       _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
+         $CC -shared $pic_flag ${wl}-z ${wl}text ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp'
+      else
+       case `$CC -V 2>&1` in
+       *"Compilers 5.0"*)
+         wlarc=''
+         _LT_TAGVAR(archive_cmds, $1)='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags'
+         _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
+         $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$RM $lib.exp'
+         ;;
+       *)
+         wlarc='${wl}'
+         _LT_TAGVAR(archive_cmds, $1)='$CC -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $compiler_flags'
+         _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
+         $CC -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp'
+         ;;
+       esac
+      fi
+      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'
+      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+      case $host_os in
+      solaris2.[[0-5]] | solaris2.[[0-5]].*) ;;
+      *)
+       # The compiler driver will combine and reorder linker options,
+       # but understands `-z linker_flag'.  GCC discards it without `$wl',
+       # but is careful enough not to reorder.
+       # Supported since Solaris 2.6 (maybe 2.5.1?)
+       if test "$GCC" = yes; then
+         _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract'
+       else
+         _LT_TAGVAR(whole_archive_flag_spec, $1)='-z allextract$convenience -z defaultextract'
+       fi
+       ;;
+      esac
+      _LT_TAGVAR(link_all_deplibs, $1)=yes
+      ;;
+
+    sunos4*)
+      if test "x$host_vendor" = xsequent; then
+       # Use $CC to link under sequent, because it throws in some extra .o
+       # files that make .init and .fini sections work.
+       _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h $soname -o $lib $libobjs $deplibs $compiler_flags'
+      else
+       _LT_TAGVAR(archive_cmds, $1)='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags'
+      fi
+      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
+      _LT_TAGVAR(hardcode_direct, $1)=yes
+      _LT_TAGVAR(hardcode_minus_L, $1)=yes
+      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+      ;;
+
+    sysv4)
+      case $host_vendor in
+       sni)
+         _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+         _LT_TAGVAR(hardcode_direct, $1)=yes # is this really true???
+       ;;
+       siemens)
+         ## LD is ld it makes a PLAMLIB
+         ## CC just makes a GrossModule.
+         _LT_TAGVAR(archive_cmds, $1)='$LD -G -o $lib $libobjs $deplibs $linker_flags'
+         _LT_TAGVAR(reload_cmds, $1)='$CC -r -o $output$reload_objs'
+         _LT_TAGVAR(hardcode_direct, $1)=no
+        ;;
+       motorola)
+         _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+         _LT_TAGVAR(hardcode_direct, $1)=no #Motorola manual says yes, but my tests say they lie
+       ;;
+      esac
+      runpath_var='LD_RUN_PATH'
+      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+      ;;
+
+    sysv4.3*)
+      _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+      _LT_TAGVAR(export_dynamic_flag_spec, $1)='-Bexport'
+      ;;
+
+    sysv4*MP*)
+      if test -d /usr/nec; then
+       _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+       _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+       runpath_var=LD_RUN_PATH
+       hardcode_runpath_var=yes
+       _LT_TAGVAR(ld_shlibs, $1)=yes
+      fi
+      ;;
+
+    sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[[01]].[[10]]* | unixware7* | sco3.2v5.0.[[024]]*)
+      _LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text'
+      _LT_TAGVAR(archive_cmds_need_lc, $1)=no
+      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+      runpath_var='LD_RUN_PATH'
+
+      if test "$GCC" = yes; then
+       _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+       _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+      else
+       _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+       _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+      fi
+      ;;
+
+    sysv5* | sco3.2v5* | sco5v6*)
+      # Note: We can NOT use -z defs as we might desire, because we do not
+      # link with -lc, and that would cause any symbols used from libc to
+      # always be unresolved, which means just about no library would
+      # ever link correctly.  If we're not using GNU ld we use -z text
+      # though, which does catch some bad symbols but isn't as heavy-handed
+      # as -z defs.
+      _LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text'
+      _LT_TAGVAR(allow_undefined_flag, $1)='${wl}-z,nodefs'
+      _LT_TAGVAR(archive_cmds_need_lc, $1)=no
+      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R,$libdir'
+      _LT_TAGVAR(hardcode_libdir_separator, $1)=':'
+      _LT_TAGVAR(link_all_deplibs, $1)=yes
+      _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Bexport'
+      runpath_var='LD_RUN_PATH'
+
+      if test "$GCC" = yes; then
+       _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+       _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+      else
+       _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+       _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+      fi
+      ;;
+
+    uts4*)
+      _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
+      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+      ;;
+
+    *)
+      _LT_TAGVAR(ld_shlibs, $1)=no
+      ;;
+    esac
+
+    if test x$host_vendor = xsni; then
+      case $host in
+      sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*)
+       _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Blargedynsym'
+       ;;
+      esac
+    fi
+  fi
+])
+AC_MSG_RESULT([$_LT_TAGVAR(ld_shlibs, $1)])
+test "$_LT_TAGVAR(ld_shlibs, $1)" = no && can_build_shared=no
+
+_LT_TAGVAR(with_gnu_ld, $1)=$with_gnu_ld
+
+_LT_DECL([], [libext], [0], [Old archive suffix (normally "a")])dnl
+_LT_DECL([], [shrext_cmds], [1], [Shared library suffix (normally ".so")])dnl
+_LT_DECL([], [extract_expsyms_cmds], [2],
+    [The commands to extract the exported symbol list from a shared archive])
+
+#
+# Do we need to explicitly link libc?
+#
+case "x$_LT_TAGVAR(archive_cmds_need_lc, $1)" in
+x|xyes)
+  # Assume -lc should be added
+  _LT_TAGVAR(archive_cmds_need_lc, $1)=yes
+
+  if test "$enable_shared" = yes && test "$GCC" = yes; then
+    case $_LT_TAGVAR(archive_cmds, $1) in
+    *'~'*)
+      # FIXME: we may have to deal with multi-command sequences.
+      ;;
+    '$CC '*)
+      # Test whether the compiler implicitly links with -lc since on some
+      # systems, -lgcc has to come before -lc. If gcc already passes -lc
+      # to ld, don't add -lc before -lgcc.
+      AC_CACHE_CHECK([whether -lc should be explicitly linked in],
+       [lt_cv_]_LT_TAGVAR(archive_cmds_need_lc, $1),
+       [$RM conftest*
+       echo "$lt_simple_compile_test_code" > conftest.$ac_ext
+
+       if AC_TRY_EVAL(ac_compile) 2>conftest.err; then
+         soname=conftest
+         lib=conftest
+         libobjs=conftest.$ac_objext
+         deplibs=
+         wl=$_LT_TAGVAR(lt_prog_compiler_wl, $1)
+         pic_flag=$_LT_TAGVAR(lt_prog_compiler_pic, $1)
+         compiler_flags=-v
+         linker_flags=-v
+         verstring=
+         output_objdir=.
+         libname=conftest
+         lt_save_allow_undefined_flag=$_LT_TAGVAR(allow_undefined_flag, $1)
+         _LT_TAGVAR(allow_undefined_flag, $1)=
+         if AC_TRY_EVAL(_LT_TAGVAR(archive_cmds, $1) 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1)
+         then
+           lt_cv_[]_LT_TAGVAR(archive_cmds_need_lc, $1)=no
+         else
+           lt_cv_[]_LT_TAGVAR(archive_cmds_need_lc, $1)=yes
+         fi
+         _LT_TAGVAR(allow_undefined_flag, $1)=$lt_save_allow_undefined_flag
+       else
+         cat conftest.err 1>&5
+       fi
+       $RM conftest*
+       ])
+      _LT_TAGVAR(archive_cmds_need_lc, $1)=$lt_cv_[]_LT_TAGVAR(archive_cmds_need_lc, $1)
+      ;;
+    esac
+  fi
+  ;;
+esac
+
+_LT_TAGDECL([build_libtool_need_lc], [archive_cmds_need_lc], [0],
+    [Whether or not to add -lc for building shared libraries])
+_LT_TAGDECL([allow_libtool_libs_with_static_runtimes],
+    [enable_shared_with_static_runtimes], [0],
+    [Whether or not to disallow shared libs when runtime libs are static])
+_LT_TAGDECL([], [export_dynamic_flag_spec], [1],
+    [Compiler flag to allow reflexive dlopens])
+_LT_TAGDECL([], [whole_archive_flag_spec], [1],
+    [Compiler flag to generate shared objects directly from archives])
+_LT_TAGDECL([], [compiler_needs_object], [1],
+    [Whether the compiler copes with passing no objects directly])
+_LT_TAGDECL([], [old_archive_from_new_cmds], [2],
+    [Create an old-style archive from a shared archive])
+_LT_TAGDECL([], [old_archive_from_expsyms_cmds], [2],
+    [Create a temporary old-style archive to link instead of a shared archive])
+_LT_TAGDECL([], [archive_cmds], [2], [Commands used to build a shared archive])
+_LT_TAGDECL([], [archive_expsym_cmds], [2])
+_LT_TAGDECL([], [module_cmds], [2],
+    [Commands used to build a loadable module if different from building
+    a shared archive.])
+_LT_TAGDECL([], [module_expsym_cmds], [2])
+_LT_TAGDECL([], [with_gnu_ld], [1],
+    [Whether we are building with GNU ld or not])
+_LT_TAGDECL([], [allow_undefined_flag], [1],
+    [Flag that allows shared libraries with undefined symbols to be built])
+_LT_TAGDECL([], [no_undefined_flag], [1],
+    [Flag that enforces no undefined symbols])
+_LT_TAGDECL([], [hardcode_libdir_flag_spec], [1],
+    [Flag to hardcode $libdir into a binary during linking.
+    This must work even if $libdir does not exist])
+_LT_TAGDECL([], [hardcode_libdir_separator], [1],
+    [Whether we need a single "-rpath" flag with a separated argument])
+_LT_TAGDECL([], [hardcode_direct], [0],
+    [Set to "yes" if using DIR/libNAME${shared_ext} during linking hardcodes
+    DIR into the resulting binary])
+_LT_TAGDECL([], [hardcode_direct_absolute], [0],
+    [Set to "yes" if using DIR/libNAME${shared_ext} during linking hardcodes
+    DIR into the resulting binary and the resulting library dependency is
+    "absolute", i.e impossible to change by setting ${shlibpath_var} if the
+    library is relocated])
+_LT_TAGDECL([], [hardcode_minus_L], [0],
+    [Set to "yes" if using the -LDIR flag during linking hardcodes DIR
+    into the resulting binary])
+_LT_TAGDECL([], [hardcode_shlibpath_var], [0],
+    [Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR
+    into the resulting binary])
+_LT_TAGDECL([], [hardcode_automatic], [0],
+    [Set to "yes" if building a shared library automatically hardcodes DIR
+    into the library and all subsequent libraries and executables linked
+    against it])
+_LT_TAGDECL([], [inherit_rpath], [0],
+    [Set to yes if linker adds runtime paths of dependent libraries
+    to runtime path list])
+_LT_TAGDECL([], [link_all_deplibs], [0],
+    [Whether libtool must link a program against all its dependency libraries])
+_LT_TAGDECL([], [always_export_symbols], [0],
+    [Set to "yes" if exported symbols are required])
+_LT_TAGDECL([], [export_symbols_cmds], [2],
+    [The commands to list exported symbols])
+_LT_TAGDECL([], [exclude_expsyms], [1],
+    [Symbols that should not be listed in the preloaded symbols])
+_LT_TAGDECL([], [include_expsyms], [1],
+    [Symbols that must always be exported])
+_LT_TAGDECL([], [prelink_cmds], [2],
+    [Commands necessary for linking programs (against libraries) with templates])
+_LT_TAGDECL([], [postlink_cmds], [2],
+    [Commands necessary for finishing linking programs])
+_LT_TAGDECL([], [file_list_spec], [1],
+    [Specify filename containing input files])
+dnl FIXME: Not yet implemented
+dnl _LT_TAGDECL([], [thread_safe_flag_spec], [1],
+dnl    [Compiler flag to generate thread safe objects])
+])# _LT_LINKER_SHLIBS
+
+
+# _LT_LANG_C_CONFIG([TAG])
+# ------------------------
+# Ensure that the configuration variables for a C compiler are suitably
+# defined.  These variables are subsequently used by _LT_CONFIG to write
+# the compiler configuration to `libtool'.
+m4_defun([_LT_LANG_C_CONFIG],
+[m4_require([_LT_DECL_EGREP])dnl
+lt_save_CC="$CC"
+AC_LANG_PUSH(C)
+
+# Source file extension for C test sources.
+ac_ext=c
+
+# Object file extension for compiled C test sources.
+objext=o
+_LT_TAGVAR(objext, $1)=$objext
+
+# Code to be used in simple compile tests
+lt_simple_compile_test_code="int some_variable = 0;"
+
+# Code to be used in simple link tests
+lt_simple_link_test_code='int main(){return(0);}'
+
+_LT_TAG_COMPILER
+# Save the default compiler, since it gets overwritten when the other
+# tags are being tested, and _LT_TAGVAR(compiler, []) is a NOP.
+compiler_DEFAULT=$CC
+
+# save warnings/boilerplate of simple test code
+_LT_COMPILER_BOILERPLATE
+_LT_LINKER_BOILERPLATE
+
+## CAVEAT EMPTOR:
+## There is no encapsulation within the following macros, do not change
+## the running order or otherwise move them around unless you know exactly
+## what you are doing...
+if test -n "$compiler"; then
+  _LT_COMPILER_NO_RTTI($1)
+  _LT_COMPILER_PIC($1)
+  _LT_COMPILER_C_O($1)
+  _LT_COMPILER_FILE_LOCKS($1)
+  _LT_LINKER_SHLIBS($1)
+  _LT_SYS_DYNAMIC_LINKER($1)
+  _LT_LINKER_HARDCODE_LIBPATH($1)
+  LT_SYS_DLOPEN_SELF
+  _LT_CMD_STRIPLIB
+
+  # Report which library types will actually be built
+  AC_MSG_CHECKING([if libtool supports shared libraries])
+  AC_MSG_RESULT([$can_build_shared])
+
+  AC_MSG_CHECKING([whether to build shared libraries])
+  test "$can_build_shared" = "no" && enable_shared=no
+
+  # On AIX, shared libraries and static libraries use the same namespace, and
+  # are all built from PIC.
+  case $host_os in
+  aix3*)
+    test "$enable_shared" = yes && enable_static=no
+    if test -n "$RANLIB"; then
+      archive_cmds="$archive_cmds~\$RANLIB \$lib"
+      postinstall_cmds='$RANLIB $lib'
+    fi
+    ;;
+
+  aix[[4-9]]*)
+    if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then
+      test "$enable_shared" = yes && enable_static=no
+    fi
+    ;;
+  esac
+  AC_MSG_RESULT([$enable_shared])
+
+  AC_MSG_CHECKING([whether to build static libraries])
+  # Make sure either enable_shared or enable_static is yes.
+  test "$enable_shared" = yes || enable_static=yes
+  AC_MSG_RESULT([$enable_static])
+
+  _LT_CONFIG($1)
+fi
+AC_LANG_POP
+CC="$lt_save_CC"
+])# _LT_LANG_C_CONFIG
+
+
+# _LT_LANG_CXX_CONFIG([TAG])
+# --------------------------
+# Ensure that the configuration variables for a C++ compiler are suitably
+# defined.  These variables are subsequently used by _LT_CONFIG to write
+# the compiler configuration to `libtool'.
+m4_defun([_LT_LANG_CXX_CONFIG],
+[m4_require([_LT_FILEUTILS_DEFAULTS])dnl
+m4_require([_LT_DECL_EGREP])dnl
+m4_require([_LT_PATH_MANIFEST_TOOL])dnl
+if test -n "$CXX" && ( test "X$CXX" != "Xno" &&
+    ( (test "X$CXX" = "Xg++" && `g++ -v >/dev/null 2>&1` ) ||
+    (test "X$CXX" != "Xg++"))) ; then
+  AC_PROG_CXXCPP
+else
+  _lt_caught_CXX_error=yes
+fi
+
+AC_LANG_PUSH(C++)
+_LT_TAGVAR(archive_cmds_need_lc, $1)=no
+_LT_TAGVAR(allow_undefined_flag, $1)=
+_LT_TAGVAR(always_export_symbols, $1)=no
+_LT_TAGVAR(archive_expsym_cmds, $1)=
+_LT_TAGVAR(compiler_needs_object, $1)=no
+_LT_TAGVAR(export_dynamic_flag_spec, $1)=
+_LT_TAGVAR(hardcode_direct, $1)=no
+_LT_TAGVAR(hardcode_direct_absolute, $1)=no
+_LT_TAGVAR(hardcode_libdir_flag_spec, $1)=
+_LT_TAGVAR(hardcode_libdir_separator, $1)=
+_LT_TAGVAR(hardcode_minus_L, $1)=no
+_LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported
+_LT_TAGVAR(hardcode_automatic, $1)=no
+_LT_TAGVAR(inherit_rpath, $1)=no
+_LT_TAGVAR(module_cmds, $1)=
+_LT_TAGVAR(module_expsym_cmds, $1)=
+_LT_TAGVAR(link_all_deplibs, $1)=unknown
+_LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds
+_LT_TAGVAR(reload_flag, $1)=$reload_flag
+_LT_TAGVAR(reload_cmds, $1)=$reload_cmds
+_LT_TAGVAR(no_undefined_flag, $1)=
+_LT_TAGVAR(whole_archive_flag_spec, $1)=
+_LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no
+
+# Source file extension for C++ test sources.
+ac_ext=cpp
+
+# Object file extension for compiled C++ test sources.
+objext=o
+_LT_TAGVAR(objext, $1)=$objext
+
+# No sense in running all these tests if we already determined that
+# the CXX compiler isn't working.  Some variables (like enable_shared)
+# are currently assumed to apply to all compilers on this platform,
+# and will be corrupted by setting them based on a non-working compiler.
+if test "$_lt_caught_CXX_error" != yes; then
+  # Code to be used in simple compile tests
+  lt_simple_compile_test_code="int some_variable = 0;"
+
+  # Code to be used in simple link tests
+  lt_simple_link_test_code='int main(int, char *[[]]) { return(0); }'
+
+  # ltmain only uses $CC for tagged configurations so make sure $CC is set.
+  _LT_TAG_COMPILER
+
+  # save warnings/boilerplate of simple test code
+  _LT_COMPILER_BOILERPLATE
+  _LT_LINKER_BOILERPLATE
+
+  # Allow CC to be a program name with arguments.
+  lt_save_CC=$CC
+  lt_save_CFLAGS=$CFLAGS
+  lt_save_LD=$LD
+  lt_save_GCC=$GCC
+  GCC=$GXX
+  lt_save_with_gnu_ld=$with_gnu_ld
+  lt_save_path_LD=$lt_cv_path_LD
+  if test -n "${lt_cv_prog_gnu_ldcxx+set}"; then
+    lt_cv_prog_gnu_ld=$lt_cv_prog_gnu_ldcxx
+  else
+    $as_unset lt_cv_prog_gnu_ld
+  fi
+  if test -n "${lt_cv_path_LDCXX+set}"; then
+    lt_cv_path_LD=$lt_cv_path_LDCXX
+  else
+    $as_unset lt_cv_path_LD
+  fi
+  test -z "${LDCXX+set}" || LD=$LDCXX
+  CC=${CXX-"c++"}
+  CFLAGS=$CXXFLAGS
+  compiler=$CC
+  _LT_TAGVAR(compiler, $1)=$CC
+  _LT_CC_BASENAME([$compiler])
+
+  if test -n "$compiler"; then
+    # We don't want -fno-exception when compiling C++ code, so set the
+    # no_builtin_flag separately
+    if test "$GXX" = yes; then
+      _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -fno-builtin'
+    else
+      _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=
+    fi
+
+    if test "$GXX" = yes; then
+      # Set up default GNU C++ configuration
+
+      LT_PATH_LD
+
+      # Check if GNU C++ uses GNU ld as the underlying linker, since the
+      # archiving commands below assume that GNU ld is being used.
+      if test "$with_gnu_ld" = yes; then
+        _LT_TAGVAR(archive_cmds, $1)='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib'
+        _LT_TAGVAR(archive_expsym_cmds, $1)='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+
+        _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
+        _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic'
+
+        # If archive_cmds runs LD, not CC, wlarc should be empty
+        # XXX I think wlarc can be eliminated in ltcf-cxx, but I need to
+        #     investigate it a little bit more. (MM)
+        wlarc='${wl}'
+
+        # ancient GNU ld didn't support --whole-archive et. al.
+        if eval "`$CC -print-prog-name=ld` --help 2>&1" |
+         $GREP 'no-whole-archive' > /dev/null; then
+          _LT_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive'
+        else
+          _LT_TAGVAR(whole_archive_flag_spec, $1)=
+        fi
+      else
+        with_gnu_ld=no
+        wlarc=
+
+        # A generic and very simple default shared library creation
+        # command for GNU C++ for the case where it uses the native
+        # linker, instead of GNU ld.  If possible, this setting should
+        # overridden to take advantage of the native linker features on
+        # the platform it is being used on.
+        _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib'
+      fi
+
+      # Commands to make compiler produce verbose output that lists
+      # what "hidden" libraries, object files and flags are used when
+      # linking a shared library.
+      output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"'
+
+    else
+      GXX=no
+      with_gnu_ld=no
+      wlarc=
+    fi
+
+    # PORTME: fill in a description of your system's C++ link characteristics
+    AC_MSG_CHECKING([whether the $compiler linker ($LD) supports shared libraries])
+    _LT_TAGVAR(ld_shlibs, $1)=yes
+    case $host_os in
+      aix3*)
+        # FIXME: insert proper C++ library support
+        _LT_TAGVAR(ld_shlibs, $1)=no
+        ;;
+      aix[[4-9]]*)
+        if test "$host_cpu" = ia64; then
+          # On IA64, the linker does run time linking by default, so we don't
+          # have to do anything special.
+          aix_use_runtimelinking=no
+          exp_sym_flag='-Bexport'
+          no_entry_flag=""
+        else
+          aix_use_runtimelinking=no
+
+          # Test if we are trying to use run time linking or normal
+          # AIX style linking. If -brtl is somewhere in LDFLAGS, we
+          # need to do runtime linking.
+          case $host_os in aix4.[[23]]|aix4.[[23]].*|aix[[5-9]]*)
+           for ld_flag in $LDFLAGS; do
+             case $ld_flag in
+             *-brtl*)
+               aix_use_runtimelinking=yes
+               break
+               ;;
+             esac
+           done
+           ;;
+          esac
+
+          exp_sym_flag='-bexport'
+          no_entry_flag='-bnoentry'
+        fi
+
+        # When large executables or shared objects are built, AIX ld can
+        # have problems creating the table of contents.  If linking a library
+        # or program results in "error TOC overflow" add -mminimal-toc to
+        # CXXFLAGS/CFLAGS for g++/gcc.  In the cases where that is not
+        # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS.
+
+        _LT_TAGVAR(archive_cmds, $1)=''
+        _LT_TAGVAR(hardcode_direct, $1)=yes
+        _LT_TAGVAR(hardcode_direct_absolute, $1)=yes
+        _LT_TAGVAR(hardcode_libdir_separator, $1)=':'
+        _LT_TAGVAR(link_all_deplibs, $1)=yes
+        _LT_TAGVAR(file_list_spec, $1)='${wl}-f,'
+
+        if test "$GXX" = yes; then
+          case $host_os in aix4.[[012]]|aix4.[[012]].*)
+          # We only want to do this on AIX 4.2 and lower, the check
+          # below for broken collect2 doesn't work under 4.3+
+         collect2name=`${CC} -print-prog-name=collect2`
+         if test -f "$collect2name" &&
+            strings "$collect2name" | $GREP resolve_lib_name >/dev/null
+         then
+           # We have reworked collect2
+           :
+         else
+           # We have old collect2
+           _LT_TAGVAR(hardcode_direct, $1)=unsupported
+           # It fails to find uninstalled libraries when the uninstalled
+           # path is not listed in the libpath.  Setting hardcode_minus_L
+           # to unsupported forces relinking
+           _LT_TAGVAR(hardcode_minus_L, $1)=yes
+           _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
+           _LT_TAGVAR(hardcode_libdir_separator, $1)=
+         fi
+          esac
+          shared_flag='-shared'
+         if test "$aix_use_runtimelinking" = yes; then
+           shared_flag="$shared_flag "'${wl}-G'
+         fi
+        else
+          # not using gcc
+          if test "$host_cpu" = ia64; then
+         # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release
+         # chokes on -Wl,-G. The following line is correct:
+         shared_flag='-G'
+          else
+           if test "$aix_use_runtimelinking" = yes; then
+             shared_flag='${wl}-G'
+           else
+             shared_flag='${wl}-bM:SRE'
+           fi
+          fi
+        fi
+
+        _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-bexpall'
+        # It seems that -bexpall does not export symbols beginning with
+        # underscore (_), so it is better to generate a list of symbols to
+       # export.
+        _LT_TAGVAR(always_export_symbols, $1)=yes
+        if test "$aix_use_runtimelinking" = yes; then
+          # Warning - without using the other runtime loading flags (-brtl),
+          # -berok will link without error, but may produce a broken library.
+          _LT_TAGVAR(allow_undefined_flag, $1)='-berok'
+          # Determine the default libpath from the value encoded in an empty
+          # executable.
+          _LT_SYS_MODULE_PATH_AIX([$1])
+          _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath"
+
+          _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then func_echo_all "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag"
+        else
+          if test "$host_cpu" = ia64; then
+           _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $libdir:/usr/lib:/lib'
+           _LT_TAGVAR(allow_undefined_flag, $1)="-z nodefs"
+           _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols"
+          else
+           # Determine the default libpath from the value encoded in an
+           # empty executable.
+           _LT_SYS_MODULE_PATH_AIX([$1])
+           _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath"
+           # Warning - without using the other run time loading flags,
+           # -berok will link without error, but may produce a broken library.
+           _LT_TAGVAR(no_undefined_flag, $1)=' ${wl}-bernotok'
+           _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-berok'
+           if test "$with_gnu_ld" = yes; then
+             # We only use this code for GNU lds that support --whole-archive.
+             _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive$convenience ${wl}--no-whole-archive'
+           else
+             # Exported symbols can be pulled into shared objects from archives
+             _LT_TAGVAR(whole_archive_flag_spec, $1)='$convenience'
+           fi
+           _LT_TAGVAR(archive_cmds_need_lc, $1)=yes
+           # This is similar to how AIX traditionally builds its shared
+           # libraries.
+           _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname'
+          fi
+        fi
+        ;;
+
+      beos*)
+       if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
+         _LT_TAGVAR(allow_undefined_flag, $1)=unsupported
+         # Joseph Beckenbach <jrb3@best.com> says some releases of gcc
+         # support --undefined.  This deserves some investigation.  FIXME
+         _LT_TAGVAR(archive_cmds, $1)='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+       else
+         _LT_TAGVAR(ld_shlibs, $1)=no
+       fi
+       ;;
+
+      chorus*)
+        case $cc_basename in
+          *)
+         # FIXME: insert proper C++ library support
+         _LT_TAGVAR(ld_shlibs, $1)=no
+         ;;
+        esac
+        ;;
+
+      cygwin* | mingw* | pw32* | cegcc*)
+       case $GXX,$cc_basename in
+       ,cl* | no,cl*)
+         # Native MSVC
+         # hardcode_libdir_flag_spec is actually meaningless, as there is
+         # no search path for DLLs.
+         _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=' '
+         _LT_TAGVAR(allow_undefined_flag, $1)=unsupported
+         _LT_TAGVAR(always_export_symbols, $1)=yes
+         _LT_TAGVAR(file_list_spec, $1)='@'
+         # Tell ltmain to make .lib files, not .a files.
+         libext=lib
+         # Tell ltmain to make .dll files, not .so files.
+         shrext_cmds=".dll"
+         # FIXME: Setting linknames here is a bad hack.
+         _LT_TAGVAR(archive_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-dll~linknames='
+         _LT_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then
+             $SED -n -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' -e '1\\\!p' < $export_symbols > $output_objdir/$soname.exp;
+           else
+             $SED -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' < $export_symbols > $output_objdir/$soname.exp;
+           fi~
+           $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~
+           linknames='
+         # The linker will not automatically build a static lib if we build a DLL.
+         # _LT_TAGVAR(old_archive_from_new_cmds, $1)='true'
+         _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes
+         # Don't use ranlib
+         _LT_TAGVAR(old_postinstall_cmds, $1)='chmod 644 $oldlib'
+         _LT_TAGVAR(postlink_cmds, $1)='lt_outputfile="@OUTPUT@"~
+           lt_tool_outputfile="@TOOL_OUTPUT@"~
+           case $lt_outputfile in
+             *.exe|*.EXE) ;;
+             *)
+               lt_outputfile="$lt_outputfile.exe"
+               lt_tool_outputfile="$lt_tool_outputfile.exe"
+               ;;
+           esac~
+           func_to_tool_file "$lt_outputfile"~
+           if test "$MANIFEST_TOOL" != ":" && test -f "$lt_outputfile.manifest"; then
+             $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1;
+             $RM "$lt_outputfile.manifest";
+           fi'
+         ;;
+       *)
+         # g++
+         # _LT_TAGVAR(hardcode_libdir_flag_spec, $1) is actually meaningless,
+         # as there is no search path for DLLs.
+         _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
+         _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-all-symbols'
+         _LT_TAGVAR(allow_undefined_flag, $1)=unsupported
+         _LT_TAGVAR(always_export_symbols, $1)=no
+         _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes
+
+         if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then
+           _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
+           # If the export-symbols file already is a .def file (1st line
+           # is EXPORTS), use it as is; otherwise, prepend...
+           _LT_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then
+             cp $export_symbols $output_objdir/$soname.def;
+           else
+             echo EXPORTS > $output_objdir/$soname.def;
+             cat $export_symbols >> $output_objdir/$soname.def;
+           fi~
+           $CC -shared -nostdlib $output_objdir/$soname.def $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
+         else
+           _LT_TAGVAR(ld_shlibs, $1)=no
+         fi
+         ;;
+       esac
+       ;;
+      darwin* | rhapsody*)
+        _LT_DARWIN_LINKER_FEATURES($1)
+       ;;
+
+      dgux*)
+        case $cc_basename in
+          ec++*)
+           # FIXME: insert proper C++ library support
+           _LT_TAGVAR(ld_shlibs, $1)=no
+           ;;
+          ghcx*)
+           # Green Hills C++ Compiler
+           # FIXME: insert proper C++ library support
+           _LT_TAGVAR(ld_shlibs, $1)=no
+           ;;
+          *)
+           # FIXME: insert proper C++ library support
+           _LT_TAGVAR(ld_shlibs, $1)=no
+           ;;
+        esac
+        ;;
+
+      freebsd2.*)
+        # C++ shared libraries reported to be fairly broken before
+       # switch to ELF
+        _LT_TAGVAR(ld_shlibs, $1)=no
+        ;;
+
+      freebsd-elf*)
+        _LT_TAGVAR(archive_cmds_need_lc, $1)=no
+        ;;
+
+      freebsd* | dragonfly*)
+        # FreeBSD 3 and later use GNU C++ and GNU ld with standard ELF
+        # conventions
+        _LT_TAGVAR(ld_shlibs, $1)=yes
+        ;;
+
+      gnu*)
+        ;;
+
+      haiku*)
+        _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+        _LT_TAGVAR(link_all_deplibs, $1)=yes
+        ;;
+
+      hpux9*)
+        _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir'
+        _LT_TAGVAR(hardcode_libdir_separator, $1)=:
+        _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
+        _LT_TAGVAR(hardcode_direct, $1)=yes
+        _LT_TAGVAR(hardcode_minus_L, $1)=yes # Not in the search PATH,
+                                            # but as the default
+                                            # location of the library.
+
+        case $cc_basename in
+          CC*)
+            # FIXME: insert proper C++ library support
+            _LT_TAGVAR(ld_shlibs, $1)=no
+            ;;
+          aCC*)
+            _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -b ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'
+            # Commands to make compiler produce verbose output that lists
+            # what "hidden" libraries, object files and flags are used when
+            # linking a shared library.
+            #
+            # There doesn't appear to be a way to prevent this compiler from
+            # explicitly linking system object files so we need to strip them
+            # from the output so that they don't get included in the library
+            # dependencies.
+            output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $EGREP "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"'
+            ;;
+          *)
+            if test "$GXX" = yes; then
+              _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -shared -nostdlib $pic_flag ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'
+            else
+              # FIXME: insert proper C++ library support
+              _LT_TAGVAR(ld_shlibs, $1)=no
+            fi
+            ;;
+        esac
+        ;;
+
+      hpux10*|hpux11*)
+        if test $with_gnu_ld = no; then
+         _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir'
+         _LT_TAGVAR(hardcode_libdir_separator, $1)=:
+
+          case $host_cpu in
+            hppa*64*|ia64*)
+              ;;
+            *)
+             _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
+              ;;
+          esac
+        fi
+        case $host_cpu in
+          hppa*64*|ia64*)
+            _LT_TAGVAR(hardcode_direct, $1)=no
+            _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+            ;;
+          *)
+            _LT_TAGVAR(hardcode_direct, $1)=yes
+            _LT_TAGVAR(hardcode_direct_absolute, $1)=yes
+            _LT_TAGVAR(hardcode_minus_L, $1)=yes # Not in the search PATH,
+                                                # but as the default
+                                                # location of the library.
+            ;;
+        esac
+
+        case $cc_basename in
+          CC*)
+           # FIXME: insert proper C++ library support
+           _LT_TAGVAR(ld_shlibs, $1)=no
+           ;;
+          aCC*)
+           case $host_cpu in
+             hppa*64*)
+               _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+               ;;
+             ia64*)
+               _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+               ;;
+             *)
+               _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+               ;;
+           esac
+           # Commands to make compiler produce verbose output that lists
+           # what "hidden" libraries, object files and flags are used when
+           # linking a shared library.
+           #
+           # There doesn't appear to be a way to prevent this compiler from
+           # explicitly linking system object files so we need to strip them
+           # from the output so that they don't get included in the library
+           # dependencies.
+           output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $GREP "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"'
+           ;;
+          *)
+           if test "$GXX" = yes; then
+             if test $with_gnu_ld = no; then
+               case $host_cpu in
+                 hppa*64*)
+                   _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+                   ;;
+                 ia64*)
+                   _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $pic_flag ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+                   ;;
+                 *)
+                   _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+                   ;;
+               esac
+             fi
+           else
+             # FIXME: insert proper C++ library support
+             _LT_TAGVAR(ld_shlibs, $1)=no
+           fi
+           ;;
+        esac
+        ;;
+
+      interix[[3-9]]*)
+       _LT_TAGVAR(hardcode_direct, $1)=no
+       _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+       _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'
+       _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
+       # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc.
+       # Instead, shared libraries are loaded at an image base (0x10000000 by
+       # default) and relocated if they conflict, which is a slow very memory
+       # consuming and fragmenting process.  To avoid this, we pick a random,
+       # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link
+       # time.  Moving up from 0x10000000 also allows more sbrk(2) space.
+       _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
+       _LT_TAGVAR(archive_expsym_cmds, $1)='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
+       ;;
+      irix5* | irix6*)
+        case $cc_basename in
+          CC*)
+           # SGI C++
+           _LT_TAGVAR(archive_cmds, $1)='$CC -shared -all -multigot $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib'
+
+           # Archives containing C++ object files must be created using
+           # "CC -ar", where "CC" is the IRIX C++ compiler.  This is
+           # necessary to make sure instantiated templates are included
+           # in the archive.
+           _LT_TAGVAR(old_archive_cmds, $1)='$CC -ar -WR,-u -o $oldlib $oldobjs'
+           ;;
+          *)
+           if test "$GXX" = yes; then
+             if test "$with_gnu_ld" = no; then
+               _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+             else
+               _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` -o $lib'
+             fi
+           fi
+           _LT_TAGVAR(link_all_deplibs, $1)=yes
+           ;;
+        esac
+        _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
+        _LT_TAGVAR(hardcode_libdir_separator, $1)=:
+        _LT_TAGVAR(inherit_rpath, $1)=yes
+        ;;
+
+      linux* | k*bsd*-gnu | kopensolaris*-gnu)
+        case $cc_basename in
+          KCC*)
+           # Kuck and Associates, Inc. (KAI) C++ Compiler
+
+           # KCC will only create a shared library if the output file
+           # ends with ".so" (or ".sl" for HP-UX), so rename the library
+           # to its proper name (with version) after linking.
+           _LT_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib'
+           _LT_TAGVAR(archive_expsym_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib ${wl}-retain-symbols-file,$export_symbols; mv \$templib $lib'
+           # Commands to make compiler produce verbose output that lists
+           # what "hidden" libraries, object files and flags are used when
+           # linking a shared library.
+           #
+           # There doesn't appear to be a way to prevent this compiler from
+           # explicitly linking system object files so we need to strip them
+           # from the output so that they don't get included in the library
+           # dependencies.
+           output_verbose_link_cmd='templist=`$CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 | $GREP "ld"`; rm -f libconftest$shared_ext; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"'
+
+           _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'
+           _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic'
+
+           # Archives containing C++ object files must be created using
+           # "CC -Bstatic", where "CC" is the KAI C++ compiler.
+           _LT_TAGVAR(old_archive_cmds, $1)='$CC -Bstatic -o $oldlib $oldobjs'
+           ;;
+         icpc* | ecpc* )
+           # Intel C++
+           with_gnu_ld=yes
+           # version 8.0 and above of icpc choke on multiply defined symbols
+           # if we add $predep_objects and $postdep_objects, however 7.1 and
+           # earlier do not add the objects themselves.
+           case `$CC -V 2>&1` in
+             *"Version 7."*)
+               _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib'
+               _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+               ;;
+             *)  # Version 8.0 or newer
+               tmp_idyn=
+               case $host_cpu in
+                 ia64*) tmp_idyn=' -i_dynamic';;
+               esac
+               _LT_TAGVAR(archive_cmds, $1)='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+               _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+               ;;
+           esac
+           _LT_TAGVAR(archive_cmds_need_lc, $1)=no
+           _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'
+           _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic'
+           _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive$convenience ${wl}--no-whole-archive'
+           ;;
+          pgCC* | pgcpp*)
+            # Portland Group C++ compiler
+           case `$CC -V` in
+           *pgCC\ [[1-5]].* | *pgcpp\ [[1-5]].*)
+             _LT_TAGVAR(prelink_cmds, $1)='tpldir=Template.dir~
+               rm -rf $tpldir~
+               $CC --prelink_objects --instantiation_dir $tpldir $objs $libobjs $compile_deplibs~
+               compile_command="$compile_command `find $tpldir -name \*.o | sort | $NL2SP`"'
+             _LT_TAGVAR(old_archive_cmds, $1)='tpldir=Template.dir~
+               rm -rf $tpldir~
+               $CC --prelink_objects --instantiation_dir $tpldir $oldobjs$old_deplibs~
+               $AR $AR_FLAGS $oldlib$oldobjs$old_deplibs `find $tpldir -name \*.o | sort | $NL2SP`~
+               $RANLIB $oldlib'
+             _LT_TAGVAR(archive_cmds, $1)='tpldir=Template.dir~
+               rm -rf $tpldir~
+               $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~
+               $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib'
+             _LT_TAGVAR(archive_expsym_cmds, $1)='tpldir=Template.dir~
+               rm -rf $tpldir~
+               $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~
+               $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib'
+             ;;
+           *) # Version 6 and above use weak symbols
+             _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib'
+             _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib'
+             ;;
+           esac
+
+           _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}--rpath ${wl}$libdir'
+           _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic'
+           _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive'
+            ;;
+         cxx*)
+           # Compaq C++
+           _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib'
+           _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname  -o $lib ${wl}-retain-symbols-file $wl$export_symbols'
+
+           runpath_var=LD_RUN_PATH
+           _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir'
+           _LT_TAGVAR(hardcode_libdir_separator, $1)=:
+
+           # Commands to make compiler produce verbose output that lists
+           # what "hidden" libraries, object files and flags are used when
+           # linking a shared library.
+           #
+           # There doesn't appear to be a way to prevent this compiler from
+           # explicitly linking system object files so we need to strip them
+           # from the output so that they don't get included in the library
+           # dependencies.
+           output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld .*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "X$list" | $Xsed'
+           ;;
+         xl* | mpixl* | bgxl*)
+           # IBM XL 8.0 on PPC, with GNU ld
+           _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
+           _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic'
+           _LT_TAGVAR(archive_cmds, $1)='$CC -qmkshrobj $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+           if test "x$supports_anon_versioning" = xyes; then
+             _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~
+               cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~
+               echo "local: *; };" >> $output_objdir/$libname.ver~
+               $CC -qmkshrobj $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib'
+           fi
+           ;;
+         *)
+           case `$CC -V 2>&1 | sed 5q` in
+           *Sun\ C*)
+             # Sun C++ 5.9
+             _LT_TAGVAR(no_undefined_flag, $1)=' -zdefs'
+             _LT_TAGVAR(archive_cmds, $1)='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+             _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file ${wl}$export_symbols'
+             _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'
+             _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive'
+             _LT_TAGVAR(compiler_needs_object, $1)=yes
+
+             # Not sure whether something based on
+             # $CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1
+             # would be better.
+             output_verbose_link_cmd='func_echo_all'
+
+             # Archives containing C++ object files must be created using
+             # "CC -xar", where "CC" is the Sun C++ compiler.  This is
+             # necessary to make sure instantiated templates are included
+             # in the archive.
+             _LT_TAGVAR(old_archive_cmds, $1)='$CC -xar -o $oldlib $oldobjs'
+             ;;
+           esac
+           ;;
+       esac
+       ;;
+
+      lynxos*)
+        # FIXME: insert proper C++ library support
+       _LT_TAGVAR(ld_shlibs, $1)=no
+       ;;
+
+      m88k*)
+        # FIXME: insert proper C++ library support
+        _LT_TAGVAR(ld_shlibs, $1)=no
+       ;;
+
+      mvs*)
+        case $cc_basename in
+          cxx*)
+           # FIXME: insert proper C++ library support
+           _LT_TAGVAR(ld_shlibs, $1)=no
+           ;;
+         *)
+           # FIXME: insert proper C++ library support
+           _LT_TAGVAR(ld_shlibs, $1)=no
+           ;;
+       esac
+       ;;
+
+      netbsd*)
+        if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
+         _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable  -o $lib $predep_objects $libobjs $deplibs $postdep_objects $linker_flags'
+         wlarc=
+         _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'
+         _LT_TAGVAR(hardcode_direct, $1)=yes
+         _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+       fi
+       # Workaround some broken pre-1.5 toolchains
+       output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP conftest.$objext | $SED -e "s:-lgcc -lc -lgcc::"'
+       ;;
+
+      *nto* | *qnx*)
+        _LT_TAGVAR(ld_shlibs, $1)=yes
+       ;;
+
+      openbsd2*)
+        # C++ shared libraries are fairly broken
+       _LT_TAGVAR(ld_shlibs, $1)=no
+       ;;
+
+      openbsd*)
+       if test -f /usr/libexec/ld.so; then
+         _LT_TAGVAR(hardcode_direct, $1)=yes
+         _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+         _LT_TAGVAR(hardcode_direct_absolute, $1)=yes
+         _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib'
+         _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'
+         if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
+           _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file,$export_symbols -o $lib'
+           _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
+           _LT_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive'
+         fi
+         output_verbose_link_cmd=func_echo_all
+       else
+         _LT_TAGVAR(ld_shlibs, $1)=no
+       fi
+       ;;
+
+      osf3* | osf4* | osf5*)
+        case $cc_basename in
+          KCC*)
+           # Kuck and Associates, Inc. (KAI) C++ Compiler
+
+           # KCC will only create a shared library if the output file
+           # ends with ".so" (or ".sl" for HP-UX), so rename the library
+           # to its proper name (with version) after linking.
+           _LT_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo "$lib" | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib'
+
+           _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'
+           _LT_TAGVAR(hardcode_libdir_separator, $1)=:
+
+           # Archives containing C++ object files must be created using
+           # the KAI C++ compiler.
+           case $host in
+             osf3*) _LT_TAGVAR(old_archive_cmds, $1)='$CC -Bstatic -o $oldlib $oldobjs' ;;
+             *) _LT_TAGVAR(old_archive_cmds, $1)='$CC -o $oldlib $oldobjs' ;;
+           esac
+           ;;
+          RCC*)
+           # Rational C++ 2.4.1
+           # FIXME: insert proper C++ library support
+           _LT_TAGVAR(ld_shlibs, $1)=no
+           ;;
+          cxx*)
+           case $host in
+             osf3*)
+               _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*'
+               _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $soname `test -n "$verstring" && func_echo_all "${wl}-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib'
+               _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
+               ;;
+             *)
+               _LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*'
+               _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib'
+               _LT_TAGVAR(archive_expsym_cmds, $1)='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done~
+                 echo "-hidden">> $lib.exp~
+                 $CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname ${wl}-input ${wl}$lib.exp  `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib~
+                 $RM $lib.exp'
+               _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir'
+               ;;
+           esac
+
+           _LT_TAGVAR(hardcode_libdir_separator, $1)=:
+
+           # Commands to make compiler produce verbose output that lists
+           # what "hidden" libraries, object files and flags are used when
+           # linking a shared library.
+           #
+           # There doesn't appear to be a way to prevent this compiler from
+           # explicitly linking system object files so we need to strip them
+           # from the output so that they don't get included in the library
+           # dependencies.
+           output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld" | $GREP -v "ld:"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"'
+           ;;
+         *)
+           if test "$GXX" = yes && test "$with_gnu_ld" = no; then
+             _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*'
+             case $host in
+               osf3*)
+                 _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+                 ;;
+               *)
+                 _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+                 ;;
+             esac
+
+             _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
+             _LT_TAGVAR(hardcode_libdir_separator, $1)=:
+
+             # Commands to make compiler produce verbose output that lists
+             # what "hidden" libraries, object files and flags are used when
+             # linking a shared library.
+             output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"'
+
+           else
+             # FIXME: insert proper C++ library support
+             _LT_TAGVAR(ld_shlibs, $1)=no
+           fi
+           ;;
+        esac
+        ;;
+
+      psos*)
+        # FIXME: insert proper C++ library support
+        _LT_TAGVAR(ld_shlibs, $1)=no
+        ;;
+
+      sunos4*)
+        case $cc_basename in
+          CC*)
+           # Sun C++ 4.x
+           # FIXME: insert proper C++ library support
+           _LT_TAGVAR(ld_shlibs, $1)=no
+           ;;
+          lcc*)
+           # Lucid
+           # FIXME: insert proper C++ library support
+           _LT_TAGVAR(ld_shlibs, $1)=no
+           ;;
+          *)
+           # FIXME: insert proper C++ library support
+           _LT_TAGVAR(ld_shlibs, $1)=no
+           ;;
+        esac
+        ;;
+
+      solaris*)
+        case $cc_basename in
+          CC* | sunCC*)
+           # Sun C++ 4.2, 5.x and Centerline C++
+            _LT_TAGVAR(archive_cmds_need_lc,$1)=yes
+           _LT_TAGVAR(no_undefined_flag, $1)=' -zdefs'
+           _LT_TAGVAR(archive_cmds, $1)='$CC -G${allow_undefined_flag}  -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+           _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
+             $CC -G${allow_undefined_flag} ${wl}-M ${wl}$lib.exp -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp'
+
+           _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'
+           _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+           case $host_os in
+             solaris2.[[0-5]] | solaris2.[[0-5]].*) ;;
+             *)
+               # The compiler driver will combine and reorder linker options,
+               # but understands `-z linker_flag'.
+               # Supported since Solaris 2.6 (maybe 2.5.1?)
+               _LT_TAGVAR(whole_archive_flag_spec, $1)='-z allextract$convenience -z defaultextract'
+               ;;
+           esac
+           _LT_TAGVAR(link_all_deplibs, $1)=yes
+
+           output_verbose_link_cmd='func_echo_all'
+
+           # Archives containing C++ object files must be created using
+           # "CC -xar", where "CC" is the Sun C++ compiler.  This is
+           # necessary to make sure instantiated templates are included
+           # in the archive.
+           _LT_TAGVAR(old_archive_cmds, $1)='$CC -xar -o $oldlib $oldobjs'
+           ;;
+          gcx*)
+           # Green Hills C++ Compiler
+           _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib'
+
+           # The C++ compiler must be used to create the archive.
+           _LT_TAGVAR(old_archive_cmds, $1)='$CC $LDFLAGS -archive -o $oldlib $oldobjs'
+           ;;
+          *)
+           # GNU C++ compiler with Solaris linker
+           if test "$GXX" = yes && test "$with_gnu_ld" = no; then
+             _LT_TAGVAR(no_undefined_flag, $1)=' ${wl}-z ${wl}defs'
+             if $CC --version | $GREP -v '^2\.7' > /dev/null; then
+               _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib'
+               _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
+                 $CC -shared $pic_flag -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp'
+
+               # Commands to make compiler produce verbose output that lists
+               # what "hidden" libraries, object files and flags are used when
+               # linking a shared library.
+               output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"'
+             else
+               # g++ 2.7 appears to require `-G' NOT `-shared' on this
+               # platform.
+               _LT_TAGVAR(archive_cmds, $1)='$CC -G -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib'
+               _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
+                 $CC -G -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp'
+
+               # Commands to make compiler produce verbose output that lists
+               # what "hidden" libraries, object files and flags are used when
+               # linking a shared library.
+               output_verbose_link_cmd='$CC -G $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"'
+             fi
+
+             _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $wl$libdir'
+             case $host_os in
+               solaris2.[[0-5]] | solaris2.[[0-5]].*) ;;
+               *)
+                 _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract'
+                 ;;
+             esac
+           fi
+           ;;
+        esac
+        ;;
+
+    sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[[01]].[[10]]* | unixware7* | sco3.2v5.0.[[024]]*)
+      _LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text'
+      _LT_TAGVAR(archive_cmds_need_lc, $1)=no
+      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+      runpath_var='LD_RUN_PATH'
+
+      case $cc_basename in
+        CC*)
+         _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+         _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+         ;;
+       *)
+         _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+         _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+         ;;
+      esac
+      ;;
+
+      sysv5* | sco3.2v5* | sco5v6*)
+       # Note: We can NOT use -z defs as we might desire, because we do not
+       # link with -lc, and that would cause any symbols used from libc to
+       # always be unresolved, which means just about no library would
+       # ever link correctly.  If we're not using GNU ld we use -z text
+       # though, which does catch some bad symbols but isn't as heavy-handed
+       # as -z defs.
+       _LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text'
+       _LT_TAGVAR(allow_undefined_flag, $1)='${wl}-z,nodefs'
+       _LT_TAGVAR(archive_cmds_need_lc, $1)=no
+       _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+       _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R,$libdir'
+       _LT_TAGVAR(hardcode_libdir_separator, $1)=':'
+       _LT_TAGVAR(link_all_deplibs, $1)=yes
+       _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Bexport'
+       runpath_var='LD_RUN_PATH'
+
+       case $cc_basename in
+          CC*)
+           _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+           _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+           _LT_TAGVAR(old_archive_cmds, $1)='$CC -Tprelink_objects $oldobjs~
+             '"$_LT_TAGVAR(old_archive_cmds, $1)"
+           _LT_TAGVAR(reload_cmds, $1)='$CC -Tprelink_objects $reload_objs~
+             '"$_LT_TAGVAR(reload_cmds, $1)"
+           ;;
+         *)
+           _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+           _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+           ;;
+       esac
+      ;;
+
+      tandem*)
+        case $cc_basename in
+          NCC*)
+           # NonStop-UX NCC 3.20
+           # FIXME: insert proper C++ library support
+           _LT_TAGVAR(ld_shlibs, $1)=no
+           ;;
+          *)
+           # FIXME: insert proper C++ library support
+           _LT_TAGVAR(ld_shlibs, $1)=no
+           ;;
+        esac
+        ;;
+
+      vxworks*)
+        # FIXME: insert proper C++ library support
+        _LT_TAGVAR(ld_shlibs, $1)=no
+        ;;
+
+      *)
+        # FIXME: insert proper C++ library support
+        _LT_TAGVAR(ld_shlibs, $1)=no
+        ;;
+    esac
+
+    AC_MSG_RESULT([$_LT_TAGVAR(ld_shlibs, $1)])
+    test "$_LT_TAGVAR(ld_shlibs, $1)" = no && can_build_shared=no
+
+    _LT_TAGVAR(GCC, $1)="$GXX"
+    _LT_TAGVAR(LD, $1)="$LD"
+
+    ## CAVEAT EMPTOR:
+    ## There is no encapsulation within the following macros, do not change
+    ## the running order or otherwise move them around unless you know exactly
+    ## what you are doing...
+    _LT_SYS_HIDDEN_LIBDEPS($1)
+    _LT_COMPILER_PIC($1)
+    _LT_COMPILER_C_O($1)
+    _LT_COMPILER_FILE_LOCKS($1)
+    _LT_LINKER_SHLIBS($1)
+    _LT_SYS_DYNAMIC_LINKER($1)
+    _LT_LINKER_HARDCODE_LIBPATH($1)
+
+    _LT_CONFIG($1)
+  fi # test -n "$compiler"
+
+  CC=$lt_save_CC
+  CFLAGS=$lt_save_CFLAGS
+  LDCXX=$LD
+  LD=$lt_save_LD
+  GCC=$lt_save_GCC
+  with_gnu_ld=$lt_save_with_gnu_ld
+  lt_cv_path_LDCXX=$lt_cv_path_LD
+  lt_cv_path_LD=$lt_save_path_LD
+  lt_cv_prog_gnu_ldcxx=$lt_cv_prog_gnu_ld
+  lt_cv_prog_gnu_ld=$lt_save_with_gnu_ld
+fi # test "$_lt_caught_CXX_error" != yes
+
+AC_LANG_POP
+])# _LT_LANG_CXX_CONFIG
+
+
+# _LT_FUNC_STRIPNAME_CNF
+# ----------------------
+# func_stripname_cnf prefix suffix name
+# strip PREFIX and SUFFIX off of NAME.
+# PREFIX and SUFFIX must not contain globbing or regex special
+# characters, hashes, percent signs, but SUFFIX may contain a leading
+# dot (in which case that matches only a dot).
+#
+# This function is identical to the (non-XSI) version of func_stripname,
+# except this one can be used by m4 code that may be executed by configure,
+# rather than the libtool script.
+m4_defun([_LT_FUNC_STRIPNAME_CNF],[dnl
+AC_REQUIRE([_LT_DECL_SED])
+AC_REQUIRE([_LT_PROG_ECHO_BACKSLASH])
+func_stripname_cnf ()
+{
+  case ${2} in
+  .*) func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%\\\\${2}\$%%"`;;
+  *)  func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%${2}\$%%"`;;
+  esac
+} # func_stripname_cnf
+])# _LT_FUNC_STRIPNAME_CNF
+
+# _LT_SYS_HIDDEN_LIBDEPS([TAGNAME])
+# ---------------------------------
+# Figure out "hidden" library dependencies from verbose
+# compiler output when linking a shared library.
+# Parse the compiler output and extract the necessary
+# objects, libraries and library flags.
+m4_defun([_LT_SYS_HIDDEN_LIBDEPS],
+[m4_require([_LT_FILEUTILS_DEFAULTS])dnl
+AC_REQUIRE([_LT_FUNC_STRIPNAME_CNF])dnl
+# Dependencies to place before and after the object being linked:
+_LT_TAGVAR(predep_objects, $1)=
+_LT_TAGVAR(postdep_objects, $1)=
+_LT_TAGVAR(predeps, $1)=
+_LT_TAGVAR(postdeps, $1)=
+_LT_TAGVAR(compiler_lib_search_path, $1)=
+
+dnl we can't use the lt_simple_compile_test_code here,
+dnl because it contains code intended for an executable,
+dnl not a library.  It's possible we should let each
+dnl tag define a new lt_????_link_test_code variable,
+dnl but it's only used here...
+m4_if([$1], [], [cat > conftest.$ac_ext <<_LT_EOF
+int a;
+void foo (void) { a = 0; }
+_LT_EOF
+], [$1], [CXX], [cat > conftest.$ac_ext <<_LT_EOF
+class Foo
+{
+public:
+  Foo (void) { a = 0; }
+private:
+  int a;
+};
+_LT_EOF
+], [$1], [F77], [cat > conftest.$ac_ext <<_LT_EOF
+      subroutine foo
+      implicit none
+      integer*4 a
+      a=0
+      return
+      end
+_LT_EOF
+], [$1], [FC], [cat > conftest.$ac_ext <<_LT_EOF
+      subroutine foo
+      implicit none
+      integer a
+      a=0
+      return
+      end
+_LT_EOF
+], [$1], [GCJ], [cat > conftest.$ac_ext <<_LT_EOF
+public class foo {
+  private int a;
+  public void bar (void) {
+    a = 0;
+  }
+};
+_LT_EOF
+], [$1], [GO], [cat > conftest.$ac_ext <<_LT_EOF
+package foo
+func foo() {
+}
+_LT_EOF
+])
+
+_lt_libdeps_save_CFLAGS=$CFLAGS
+case "$CC $CFLAGS " in #(
+*\ -flto*\ *) CFLAGS="$CFLAGS -fno-lto" ;;
+*\ -fwhopr*\ *) CFLAGS="$CFLAGS -fno-whopr" ;;
+*\ -fuse-linker-plugin*\ *) CFLAGS="$CFLAGS -fno-use-linker-plugin" ;;
+esac
+
+dnl Parse the compiler output and extract the necessary
+dnl objects, libraries and library flags.
+if AC_TRY_EVAL(ac_compile); then
+  # Parse the compiler output and extract the necessary
+  # objects, libraries and library flags.
+
+  # Sentinel used to keep track of whether or not we are before
+  # the conftest object file.
+  pre_test_object_deps_done=no
+
+  for p in `eval "$output_verbose_link_cmd"`; do
+    case ${prev}${p} in
+
+    -L* | -R* | -l*)
+       # Some compilers place space between "-{L,R}" and the path.
+       # Remove the space.
+       if test $p = "-L" ||
+          test $p = "-R"; then
+        prev=$p
+        continue
+       fi
+
+       # Expand the sysroot to ease extracting the directories later.
+       if test -z "$prev"; then
+         case $p in
+         -L*) func_stripname_cnf '-L' '' "$p"; prev=-L; p=$func_stripname_result ;;
+         -R*) func_stripname_cnf '-R' '' "$p"; prev=-R; p=$func_stripname_result ;;
+         -l*) func_stripname_cnf '-l' '' "$p"; prev=-l; p=$func_stripname_result ;;
+         esac
+       fi
+       case $p in
+       =*) func_stripname_cnf '=' '' "$p"; p=$lt_sysroot$func_stripname_result ;;
+       esac
+       if test "$pre_test_object_deps_done" = no; then
+        case ${prev} in
+        -L | -R)
+          # Internal compiler library paths should come after those
+          # provided the user.  The postdeps already come after the
+          # user supplied libs so there is no need to process them.
+          if test -z "$_LT_TAGVAR(compiler_lib_search_path, $1)"; then
+            _LT_TAGVAR(compiler_lib_search_path, $1)="${prev}${p}"
+          else
+            _LT_TAGVAR(compiler_lib_search_path, $1)="${_LT_TAGVAR(compiler_lib_search_path, $1)} ${prev}${p}"
+          fi
+          ;;
+        # The "-l" case would never come before the object being
+        # linked, so don't bother handling this case.
+        esac
+       else
+        if test -z "$_LT_TAGVAR(postdeps, $1)"; then
+          _LT_TAGVAR(postdeps, $1)="${prev}${p}"
+        else
+          _LT_TAGVAR(postdeps, $1)="${_LT_TAGVAR(postdeps, $1)} ${prev}${p}"
+        fi
+       fi
+       prev=
+       ;;
+
+    *.lto.$objext) ;; # Ignore GCC LTO objects
+    *.$objext)
+       # This assumes that the test object file only shows up
+       # once in the compiler output.
+       if test "$p" = "conftest.$objext"; then
+        pre_test_object_deps_done=yes
+        continue
+       fi
+
+       if test "$pre_test_object_deps_done" = no; then
+        if test -z "$_LT_TAGVAR(predep_objects, $1)"; then
+          _LT_TAGVAR(predep_objects, $1)="$p"
+        else
+          _LT_TAGVAR(predep_objects, $1)="$_LT_TAGVAR(predep_objects, $1) $p"
+        fi
+       else
+        if test -z "$_LT_TAGVAR(postdep_objects, $1)"; then
+          _LT_TAGVAR(postdep_objects, $1)="$p"
+        else
+          _LT_TAGVAR(postdep_objects, $1)="$_LT_TAGVAR(postdep_objects, $1) $p"
+        fi
+       fi
+       ;;
+
+    *) ;; # Ignore the rest.
+
+    esac
+  done
+
+  # Clean up.
+  rm -f a.out a.exe
+else
+  echo "libtool.m4: error: problem compiling $1 test program"
+fi
+
+$RM -f confest.$objext
+CFLAGS=$_lt_libdeps_save_CFLAGS
+
+# PORTME: override above test on systems where it is broken
+m4_if([$1], [CXX],
+[case $host_os in
+interix[[3-9]]*)
+  # Interix 3.5 installs completely hosed .la files for C++, so rather than
+  # hack all around it, let's just trust "g++" to DTRT.
+  _LT_TAGVAR(predep_objects,$1)=
+  _LT_TAGVAR(postdep_objects,$1)=
+  _LT_TAGVAR(postdeps,$1)=
+  ;;
+
+linux*)
+  case `$CC -V 2>&1 | sed 5q` in
+  *Sun\ C*)
+    # Sun C++ 5.9
+
+    # The more standards-conforming stlport4 library is
+    # incompatible with the Cstd library. Avoid specifying
+    # it if it's in CXXFLAGS. Ignore libCrun as
+    # -library=stlport4 depends on it.
+    case " $CXX $CXXFLAGS " in
+    *" -library=stlport4 "*)
+      solaris_use_stlport4=yes
+      ;;
+    esac
+
+    if test "$solaris_use_stlport4" != yes; then
+      _LT_TAGVAR(postdeps,$1)='-library=Cstd -library=Crun'
+    fi
+    ;;
+  esac
+  ;;
+
+solaris*)
+  case $cc_basename in
+  CC* | sunCC*)
+    # The more standards-conforming stlport4 library is
+    # incompatible with the Cstd library. Avoid specifying
+    # it if it's in CXXFLAGS. Ignore libCrun as
+    # -library=stlport4 depends on it.
+    case " $CXX $CXXFLAGS " in
+    *" -library=stlport4 "*)
+      solaris_use_stlport4=yes
+      ;;
+    esac
+
+    # Adding this requires a known-good setup of shared libraries for
+    # Sun compiler versions before 5.6, else PIC objects from an old
+    # archive will be linked into the output, leading to subtle bugs.
+    if test "$solaris_use_stlport4" != yes; then
+      _LT_TAGVAR(postdeps,$1)='-library=Cstd -library=Crun'
+    fi
+    ;;
+  esac
+  ;;
+esac
+])
+
+case " $_LT_TAGVAR(postdeps, $1) " in
+*" -lc "*) _LT_TAGVAR(archive_cmds_need_lc, $1)=no ;;
+esac
+ _LT_TAGVAR(compiler_lib_search_dirs, $1)=
+if test -n "${_LT_TAGVAR(compiler_lib_search_path, $1)}"; then
+ _LT_TAGVAR(compiler_lib_search_dirs, $1)=`echo " ${_LT_TAGVAR(compiler_lib_search_path, $1)}" | ${SED} -e 's! -L! !g' -e 's!^ !!'`
+fi
+_LT_TAGDECL([], [compiler_lib_search_dirs], [1],
+    [The directories searched by this compiler when creating a shared library])
+_LT_TAGDECL([], [predep_objects], [1],
+    [Dependencies to place before and after the objects being linked to
+    create a shared library])
+_LT_TAGDECL([], [postdep_objects], [1])
+_LT_TAGDECL([], [predeps], [1])
+_LT_TAGDECL([], [postdeps], [1])
+_LT_TAGDECL([], [compiler_lib_search_path], [1],
+    [The library search path used internally by the compiler when linking
+    a shared library])
+])# _LT_SYS_HIDDEN_LIBDEPS
+
+
+# _LT_LANG_F77_CONFIG([TAG])
+# --------------------------
+# Ensure that the configuration variables for a Fortran 77 compiler are
+# suitably defined.  These variables are subsequently used by _LT_CONFIG
+# to write the compiler configuration to `libtool'.
+m4_defun([_LT_LANG_F77_CONFIG],
+[AC_LANG_PUSH(Fortran 77)
+if test -z "$F77" || test "X$F77" = "Xno"; then
+  _lt_disable_F77=yes
+fi
+
+_LT_TAGVAR(archive_cmds_need_lc, $1)=no
+_LT_TAGVAR(allow_undefined_flag, $1)=
+_LT_TAGVAR(always_export_symbols, $1)=no
+_LT_TAGVAR(archive_expsym_cmds, $1)=
+_LT_TAGVAR(export_dynamic_flag_spec, $1)=
+_LT_TAGVAR(hardcode_direct, $1)=no
+_LT_TAGVAR(hardcode_direct_absolute, $1)=no
+_LT_TAGVAR(hardcode_libdir_flag_spec, $1)=
+_LT_TAGVAR(hardcode_libdir_separator, $1)=
+_LT_TAGVAR(hardcode_minus_L, $1)=no
+_LT_TAGVAR(hardcode_automatic, $1)=no
+_LT_TAGVAR(inherit_rpath, $1)=no
+_LT_TAGVAR(module_cmds, $1)=
+_LT_TAGVAR(module_expsym_cmds, $1)=
+_LT_TAGVAR(link_all_deplibs, $1)=unknown
+_LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds
+_LT_TAGVAR(reload_flag, $1)=$reload_flag
+_LT_TAGVAR(reload_cmds, $1)=$reload_cmds
+_LT_TAGVAR(no_undefined_flag, $1)=
+_LT_TAGVAR(whole_archive_flag_spec, $1)=
+_LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no
+
+# Source file extension for f77 test sources.
+ac_ext=f
+
+# Object file extension for compiled f77 test sources.
+objext=o
+_LT_TAGVAR(objext, $1)=$objext
+
+# No sense in running all these tests if we already determined that
+# the F77 compiler isn't working.  Some variables (like enable_shared)
+# are currently assumed to apply to all compilers on this platform,
+# and will be corrupted by setting them based on a non-working compiler.
+if test "$_lt_disable_F77" != yes; then
+  # Code to be used in simple compile tests
+  lt_simple_compile_test_code="\
+      subroutine t
+      return
+      end
+"
+
+  # Code to be used in simple link tests
+  lt_simple_link_test_code="\
+      program t
+      end
+"
+
+  # ltmain only uses $CC for tagged configurations so make sure $CC is set.
+  _LT_TAG_COMPILER
+
+  # save warnings/boilerplate of simple test code
+  _LT_COMPILER_BOILERPLATE
+  _LT_LINKER_BOILERPLATE
+
+  # Allow CC to be a program name with arguments.
+  lt_save_CC="$CC"
+  lt_save_GCC=$GCC
+  lt_save_CFLAGS=$CFLAGS
+  CC=${F77-"f77"}
+  CFLAGS=$FFLAGS
+  compiler=$CC
+  _LT_TAGVAR(compiler, $1)=$CC
+  _LT_CC_BASENAME([$compiler])
+  GCC=$G77
+  if test -n "$compiler"; then
+    AC_MSG_CHECKING([if libtool supports shared libraries])
+    AC_MSG_RESULT([$can_build_shared])
+
+    AC_MSG_CHECKING([whether to build shared libraries])
+    test "$can_build_shared" = "no" && enable_shared=no
+
+    # On AIX, shared libraries and static libraries use the same namespace, and
+    # are all built from PIC.
+    case $host_os in
+      aix3*)
+        test "$enable_shared" = yes && enable_static=no
+        if test -n "$RANLIB"; then
+          archive_cmds="$archive_cmds~\$RANLIB \$lib"
+          postinstall_cmds='$RANLIB $lib'
+        fi
+        ;;
+      aix[[4-9]]*)
+       if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then
+         test "$enable_shared" = yes && enable_static=no
+       fi
+        ;;
+    esac
+    AC_MSG_RESULT([$enable_shared])
+
+    AC_MSG_CHECKING([whether to build static libraries])
+    # Make sure either enable_shared or enable_static is yes.
+    test "$enable_shared" = yes || enable_static=yes
+    AC_MSG_RESULT([$enable_static])
+
+    _LT_TAGVAR(GCC, $1)="$G77"
+    _LT_TAGVAR(LD, $1)="$LD"
+
+    ## CAVEAT EMPTOR:
+    ## There is no encapsulation within the following macros, do not change
+    ## the running order or otherwise move them around unless you know exactly
+    ## what you are doing...
+    _LT_COMPILER_PIC($1)
+    _LT_COMPILER_C_O($1)
+    _LT_COMPILER_FILE_LOCKS($1)
+    _LT_LINKER_SHLIBS($1)
+    _LT_SYS_DYNAMIC_LINKER($1)
+    _LT_LINKER_HARDCODE_LIBPATH($1)
+
+    _LT_CONFIG($1)
+  fi # test -n "$compiler"
+
+  GCC=$lt_save_GCC
+  CC="$lt_save_CC"
+  CFLAGS="$lt_save_CFLAGS"
+fi # test "$_lt_disable_F77" != yes
+
+AC_LANG_POP
+])# _LT_LANG_F77_CONFIG
+
+
+# _LT_LANG_FC_CONFIG([TAG])
+# -------------------------
+# Ensure that the configuration variables for a Fortran compiler are
+# suitably defined.  These variables are subsequently used by _LT_CONFIG
+# to write the compiler configuration to `libtool'.
+m4_defun([_LT_LANG_FC_CONFIG],
+[AC_LANG_PUSH(Fortran)
+
+if test -z "$FC" || test "X$FC" = "Xno"; then
+  _lt_disable_FC=yes
+fi
+
+_LT_TAGVAR(archive_cmds_need_lc, $1)=no
+_LT_TAGVAR(allow_undefined_flag, $1)=
+_LT_TAGVAR(always_export_symbols, $1)=no
+_LT_TAGVAR(archive_expsym_cmds, $1)=
+_LT_TAGVAR(export_dynamic_flag_spec, $1)=
+_LT_TAGVAR(hardcode_direct, $1)=no
+_LT_TAGVAR(hardcode_direct_absolute, $1)=no
+_LT_TAGVAR(hardcode_libdir_flag_spec, $1)=
+_LT_TAGVAR(hardcode_libdir_separator, $1)=
+_LT_TAGVAR(hardcode_minus_L, $1)=no
+_LT_TAGVAR(hardcode_automatic, $1)=no
+_LT_TAGVAR(inherit_rpath, $1)=no
+_LT_TAGVAR(module_cmds, $1)=
+_LT_TAGVAR(module_expsym_cmds, $1)=
+_LT_TAGVAR(link_all_deplibs, $1)=unknown
+_LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds
+_LT_TAGVAR(reload_flag, $1)=$reload_flag
+_LT_TAGVAR(reload_cmds, $1)=$reload_cmds
+_LT_TAGVAR(no_undefined_flag, $1)=
+_LT_TAGVAR(whole_archive_flag_spec, $1)=
+_LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no
+
+# Source file extension for fc test sources.
+ac_ext=${ac_fc_srcext-f}
+
+# Object file extension for compiled fc test sources.
+objext=o
+_LT_TAGVAR(objext, $1)=$objext
+
+# No sense in running all these tests if we already determined that
+# the FC compiler isn't working.  Some variables (like enable_shared)
+# are currently assumed to apply to all compilers on this platform,
+# and will be corrupted by setting them based on a non-working compiler.
+if test "$_lt_disable_FC" != yes; then
+  # Code to be used in simple compile tests
+  lt_simple_compile_test_code="\
+      subroutine t
+      return
+      end
+"
+
+  # Code to be used in simple link tests
+  lt_simple_link_test_code="\
+      program t
+      end
+"
+
+  # ltmain only uses $CC for tagged configurations so make sure $CC is set.
+  _LT_TAG_COMPILER
+
+  # save warnings/boilerplate of simple test code
+  _LT_COMPILER_BOILERPLATE
+  _LT_LINKER_BOILERPLATE
+
+  # Allow CC to be a program name with arguments.
+  lt_save_CC="$CC"
+  lt_save_GCC=$GCC
+  lt_save_CFLAGS=$CFLAGS
+  CC=${FC-"f95"}
+  CFLAGS=$FCFLAGS
+  compiler=$CC
+  GCC=$ac_cv_fc_compiler_gnu
+
+  _LT_TAGVAR(compiler, $1)=$CC
+  _LT_CC_BASENAME([$compiler])
+
+  if test -n "$compiler"; then
+    AC_MSG_CHECKING([if libtool supports shared libraries])
+    AC_MSG_RESULT([$can_build_shared])
+
+    AC_MSG_CHECKING([whether to build shared libraries])
+    test "$can_build_shared" = "no" && enable_shared=no
+
+    # On AIX, shared libraries and static libraries use the same namespace, and
+    # are all built from PIC.
+    case $host_os in
+      aix3*)
+        test "$enable_shared" = yes && enable_static=no
+        if test -n "$RANLIB"; then
+          archive_cmds="$archive_cmds~\$RANLIB \$lib"
+          postinstall_cmds='$RANLIB $lib'
+        fi
+        ;;
+      aix[[4-9]]*)
+       if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then
+         test "$enable_shared" = yes && enable_static=no
+       fi
+        ;;
+    esac
+    AC_MSG_RESULT([$enable_shared])
+
+    AC_MSG_CHECKING([whether to build static libraries])
+    # Make sure either enable_shared or enable_static is yes.
+    test "$enable_shared" = yes || enable_static=yes
+    AC_MSG_RESULT([$enable_static])
+
+    _LT_TAGVAR(GCC, $1)="$ac_cv_fc_compiler_gnu"
+    _LT_TAGVAR(LD, $1)="$LD"
+
+    ## CAVEAT EMPTOR:
+    ## There is no encapsulation within the following macros, do not change
+    ## the running order or otherwise move them around unless you know exactly
+    ## what you are doing...
+    _LT_SYS_HIDDEN_LIBDEPS($1)
+    _LT_COMPILER_PIC($1)
+    _LT_COMPILER_C_O($1)
+    _LT_COMPILER_FILE_LOCKS($1)
+    _LT_LINKER_SHLIBS($1)
+    _LT_SYS_DYNAMIC_LINKER($1)
+    _LT_LINKER_HARDCODE_LIBPATH($1)
+
+    _LT_CONFIG($1)
+  fi # test -n "$compiler"
+
+  GCC=$lt_save_GCC
+  CC=$lt_save_CC
+  CFLAGS=$lt_save_CFLAGS
+fi # test "$_lt_disable_FC" != yes
+
+AC_LANG_POP
+])# _LT_LANG_FC_CONFIG
+
+
+# _LT_LANG_GCJ_CONFIG([TAG])
+# --------------------------
+# Ensure that the configuration variables for the GNU Java Compiler compiler
+# are suitably defined.  These variables are subsequently used by _LT_CONFIG
+# to write the compiler configuration to `libtool'.
+m4_defun([_LT_LANG_GCJ_CONFIG],
+[AC_REQUIRE([LT_PROG_GCJ])dnl
+AC_LANG_SAVE
+
+# Source file extension for Java test sources.
+ac_ext=java
+
+# Object file extension for compiled Java test sources.
+objext=o
+_LT_TAGVAR(objext, $1)=$objext
+
+# Code to be used in simple compile tests
+lt_simple_compile_test_code="class foo {}"
+
+# Code to be used in simple link tests
+lt_simple_link_test_code='public class conftest { public static void main(String[[]] argv) {}; }'
+
+# ltmain only uses $CC for tagged configurations so make sure $CC is set.
+_LT_TAG_COMPILER
+
+# save warnings/boilerplate of simple test code
+_LT_COMPILER_BOILERPLATE
+_LT_LINKER_BOILERPLATE
+
+# Allow CC to be a program name with arguments.
+lt_save_CC=$CC
+lt_save_CFLAGS=$CFLAGS
+lt_save_GCC=$GCC
+GCC=yes
+CC=${GCJ-"gcj"}
+CFLAGS=$GCJFLAGS
+compiler=$CC
+_LT_TAGVAR(compiler, $1)=$CC
+_LT_TAGVAR(LD, $1)="$LD"
+_LT_CC_BASENAME([$compiler])
+
+# GCJ did not exist at the time GCC didn't implicitly link libc in.
+_LT_TAGVAR(archive_cmds_need_lc, $1)=no
+
+_LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds
+_LT_TAGVAR(reload_flag, $1)=$reload_flag
+_LT_TAGVAR(reload_cmds, $1)=$reload_cmds
+
+## CAVEAT EMPTOR:
+## There is no encapsulation within the following macros, do not change
+## the running order or otherwise move them around unless you know exactly
+## what you are doing...
+if test -n "$compiler"; then
+  _LT_COMPILER_NO_RTTI($1)
+  _LT_COMPILER_PIC($1)
+  _LT_COMPILER_C_O($1)
+  _LT_COMPILER_FILE_LOCKS($1)
+  _LT_LINKER_SHLIBS($1)
+  _LT_LINKER_HARDCODE_LIBPATH($1)
+
+  _LT_CONFIG($1)
+fi
+
+AC_LANG_RESTORE
+
+GCC=$lt_save_GCC
+CC=$lt_save_CC
+CFLAGS=$lt_save_CFLAGS
+])# _LT_LANG_GCJ_CONFIG
+
+
+# _LT_LANG_GO_CONFIG([TAG])
+# --------------------------
+# Ensure that the configuration variables for the GNU Go compiler
+# are suitably defined.  These variables are subsequently used by _LT_CONFIG
+# to write the compiler configuration to `libtool'.
+m4_defun([_LT_LANG_GO_CONFIG],
+[AC_REQUIRE([LT_PROG_GO])dnl
+AC_LANG_SAVE
+
+# Source file extension for Go test sources.
+ac_ext=go
+
+# Object file extension for compiled Go test sources.
+objext=o
+_LT_TAGVAR(objext, $1)=$objext
+
+# Code to be used in simple compile tests
+lt_simple_compile_test_code="package main; func main() { }"
+
+# Code to be used in simple link tests
+lt_simple_link_test_code='package main; func main() { }'
+
+# ltmain only uses $CC for tagged configurations so make sure $CC is set.
+_LT_TAG_COMPILER
+
+# save warnings/boilerplate of simple test code
+_LT_COMPILER_BOILERPLATE
+_LT_LINKER_BOILERPLATE
+
+# Allow CC to be a program name with arguments.
+lt_save_CC=$CC
+lt_save_CFLAGS=$CFLAGS
+lt_save_GCC=$GCC
+GCC=yes
+CC=${GOC-"gccgo"}
+CFLAGS=$GOFLAGS
+compiler=$CC
+_LT_TAGVAR(compiler, $1)=$CC
+_LT_TAGVAR(LD, $1)="$LD"
+_LT_CC_BASENAME([$compiler])
+
+# Go did not exist at the time GCC didn't implicitly link libc in.
+_LT_TAGVAR(archive_cmds_need_lc, $1)=no
+
+_LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds
+_LT_TAGVAR(reload_flag, $1)=$reload_flag
+_LT_TAGVAR(reload_cmds, $1)=$reload_cmds
+
+## CAVEAT EMPTOR:
+## There is no encapsulation within the following macros, do not change
+## the running order or otherwise move them around unless you know exactly
+## what you are doing...
+if test -n "$compiler"; then
+  _LT_COMPILER_NO_RTTI($1)
+  _LT_COMPILER_PIC($1)
+  _LT_COMPILER_C_O($1)
+  _LT_COMPILER_FILE_LOCKS($1)
+  _LT_LINKER_SHLIBS($1)
+  _LT_LINKER_HARDCODE_LIBPATH($1)
+
+  _LT_CONFIG($1)
+fi
+
+AC_LANG_RESTORE
+
+GCC=$lt_save_GCC
+CC=$lt_save_CC
+CFLAGS=$lt_save_CFLAGS
+])# _LT_LANG_GO_CONFIG
+
+
+# _LT_LANG_RC_CONFIG([TAG])
+# -------------------------
+# Ensure that the configuration variables for the Windows resource compiler
+# are suitably defined.  These variables are subsequently used by _LT_CONFIG
+# to write the compiler configuration to `libtool'.
+m4_defun([_LT_LANG_RC_CONFIG],
+[AC_REQUIRE([LT_PROG_RC])dnl
+AC_LANG_SAVE
+
+# Source file extension for RC test sources.
+ac_ext=rc
+
+# Object file extension for compiled RC test sources.
+objext=o
+_LT_TAGVAR(objext, $1)=$objext
+
+# Code to be used in simple compile tests
+lt_simple_compile_test_code='sample MENU { MENUITEM "&Soup", 100, CHECKED }'
+
+# Code to be used in simple link tests
+lt_simple_link_test_code="$lt_simple_compile_test_code"
+
+# ltmain only uses $CC for tagged configurations so make sure $CC is set.
+_LT_TAG_COMPILER
+
+# save warnings/boilerplate of simple test code
+_LT_COMPILER_BOILERPLATE
+_LT_LINKER_BOILERPLATE
+
+# Allow CC to be a program name with arguments.
+lt_save_CC="$CC"
+lt_save_CFLAGS=$CFLAGS
+lt_save_GCC=$GCC
+GCC=
+CC=${RC-"windres"}
+CFLAGS=
+compiler=$CC
+_LT_TAGVAR(compiler, $1)=$CC
+_LT_CC_BASENAME([$compiler])
+_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=yes
+
+if test -n "$compiler"; then
+  :
+  _LT_CONFIG($1)
+fi
+
+GCC=$lt_save_GCC
+AC_LANG_RESTORE
+CC=$lt_save_CC
+CFLAGS=$lt_save_CFLAGS
+])# _LT_LANG_RC_CONFIG
+
+
+# LT_PROG_GCJ
+# -----------
+AC_DEFUN([LT_PROG_GCJ],
+[m4_ifdef([AC_PROG_GCJ], [AC_PROG_GCJ],
+  [m4_ifdef([A][M_PROG_GCJ], [A][M_PROG_GCJ],
+    [AC_CHECK_TOOL(GCJ, gcj,)
+      test "x${GCJFLAGS+set}" = xset || GCJFLAGS="-g -O2"
+      AC_SUBST(GCJFLAGS)])])[]dnl
+])
+
+# Old name:
+AU_ALIAS([LT_AC_PROG_GCJ], [LT_PROG_GCJ])
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([LT_AC_PROG_GCJ], [])
+
+
+# LT_PROG_GO
+# ----------
+AC_DEFUN([LT_PROG_GO],
+[AC_CHECK_TOOL(GOC, gccgo,)
+])
+
+
+# LT_PROG_RC
+# ----------
+AC_DEFUN([LT_PROG_RC],
+[AC_CHECK_TOOL(RC, windres,)
+])
+
+# Old name:
+AU_ALIAS([LT_AC_PROG_RC], [LT_PROG_RC])
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([LT_AC_PROG_RC], [])
+
+
+# _LT_DECL_EGREP
+# --------------
+# If we don't have a new enough Autoconf to choose the best grep
+# available, choose the one first in the user's PATH.
+m4_defun([_LT_DECL_EGREP],
+[AC_REQUIRE([AC_PROG_EGREP])dnl
+AC_REQUIRE([AC_PROG_FGREP])dnl
+test -z "$GREP" && GREP=grep
+_LT_DECL([], [GREP], [1], [A grep program that handles long lines])
+_LT_DECL([], [EGREP], [1], [An ERE matcher])
+_LT_DECL([], [FGREP], [1], [A literal string matcher])
+dnl Non-bleeding-edge autoconf doesn't subst GREP, so do it here too
+AC_SUBST([GREP])
+])
+
+
+# _LT_DECL_OBJDUMP
+# --------------
+# If we don't have a new enough Autoconf to choose the best objdump
+# available, choose the one first in the user's PATH.
+m4_defun([_LT_DECL_OBJDUMP],
+[AC_CHECK_TOOL(OBJDUMP, objdump, false)
+test -z "$OBJDUMP" && OBJDUMP=objdump
+_LT_DECL([], [OBJDUMP], [1], [An object symbol dumper])
+AC_SUBST([OBJDUMP])
+])
+
+# _LT_DECL_DLLTOOL
+# ----------------
+# Ensure DLLTOOL variable is set.
+m4_defun([_LT_DECL_DLLTOOL],
+[AC_CHECK_TOOL(DLLTOOL, dlltool, false)
+test -z "$DLLTOOL" && DLLTOOL=dlltool
+_LT_DECL([], [DLLTOOL], [1], [DLL creation program])
+AC_SUBST([DLLTOOL])
+])
+
+# _LT_DECL_SED
+# ------------
+# Check for a fully-functional sed program, that truncates
+# as few characters as possible.  Prefer GNU sed if found.
+m4_defun([_LT_DECL_SED],
+[AC_PROG_SED
+test -z "$SED" && SED=sed
+Xsed="$SED -e 1s/^X//"
+_LT_DECL([], [SED], [1], [A sed program that does not truncate output])
+_LT_DECL([], [Xsed], ["\$SED -e 1s/^X//"],
+    [Sed that helps us avoid accidentally triggering echo(1) options like -n])
+])# _LT_DECL_SED
+
+m4_ifndef([AC_PROG_SED], [
+############################################################
+# NOTE: This macro has been submitted for inclusion into   #
+#  GNU Autoconf as AC_PROG_SED.  When it is available in   #
+#  a released version of Autoconf we should remove this    #
+#  macro and use it instead.                               #
+############################################################
+
+m4_defun([AC_PROG_SED],
+[AC_MSG_CHECKING([for a sed that does not truncate output])
+AC_CACHE_VAL(lt_cv_path_SED,
+[# Loop through the user's path and test for sed and gsed.
+# Then use that list of sed's as ones to test for truncation.
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for lt_ac_prog in sed gsed; do
+    for ac_exec_ext in '' $ac_executable_extensions; do
+      if $as_executable_p "$as_dir/$lt_ac_prog$ac_exec_ext"; then
+        lt_ac_sed_list="$lt_ac_sed_list $as_dir/$lt_ac_prog$ac_exec_ext"
+      fi
+    done
+  done
+done
+IFS=$as_save_IFS
+lt_ac_max=0
+lt_ac_count=0
+# Add /usr/xpg4/bin/sed as it is typically found on Solaris
+# along with /bin/sed that truncates output.
+for lt_ac_sed in $lt_ac_sed_list /usr/xpg4/bin/sed; do
+  test ! -f $lt_ac_sed && continue
+  cat /dev/null > conftest.in
+  lt_ac_count=0
+  echo $ECHO_N "0123456789$ECHO_C" >conftest.in
+  # Check for GNU sed and select it if it is found.
+  if "$lt_ac_sed" --version 2>&1 < /dev/null | grep 'GNU' > /dev/null; then
+    lt_cv_path_SED=$lt_ac_sed
+    break
+  fi
+  while true; do
+    cat conftest.in conftest.in >conftest.tmp
+    mv conftest.tmp conftest.in
+    cp conftest.in conftest.nl
+    echo >>conftest.nl
+    $lt_ac_sed -e 's/a$//' < conftest.nl >conftest.out || break
+    cmp -s conftest.out conftest.nl || break
+    # 10000 chars as input seems more than enough
+    test $lt_ac_count -gt 10 && break
+    lt_ac_count=`expr $lt_ac_count + 1`
+    if test $lt_ac_count -gt $lt_ac_max; then
+      lt_ac_max=$lt_ac_count
+      lt_cv_path_SED=$lt_ac_sed
+    fi
+  done
+done
+])
+SED=$lt_cv_path_SED
+AC_SUBST([SED])
+AC_MSG_RESULT([$SED])
+])#AC_PROG_SED
+])#m4_ifndef
+
+# Old name:
+AU_ALIAS([LT_AC_PROG_SED], [AC_PROG_SED])
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([LT_AC_PROG_SED], [])
+
+
+# _LT_CHECK_SHELL_FEATURES
+# ------------------------
+# Find out whether the shell is Bourne or XSI compatible,
+# or has some other useful features.
+m4_defun([_LT_CHECK_SHELL_FEATURES],
+[AC_MSG_CHECKING([whether the shell understands some XSI constructs])
+# Try some XSI features
+xsi_shell=no
+( _lt_dummy="a/b/c"
+  test "${_lt_dummy##*/},${_lt_dummy%/*},${_lt_dummy#??}"${_lt_dummy%"$_lt_dummy"}, \
+      = c,a/b,b/c, \
+    && eval 'test $(( 1 + 1 )) -eq 2 \
+    && test "${#_lt_dummy}" -eq 5' ) >/dev/null 2>&1 \
+  && xsi_shell=yes
+AC_MSG_RESULT([$xsi_shell])
+_LT_CONFIG_LIBTOOL_INIT([xsi_shell='$xsi_shell'])
+
+AC_MSG_CHECKING([whether the shell understands "+="])
+lt_shell_append=no
+( foo=bar; set foo baz; eval "$[1]+=\$[2]" && test "$foo" = barbaz ) \
+    >/dev/null 2>&1 \
+  && lt_shell_append=yes
+AC_MSG_RESULT([$lt_shell_append])
+_LT_CONFIG_LIBTOOL_INIT([lt_shell_append='$lt_shell_append'])
+
+if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then
+  lt_unset=unset
+else
+  lt_unset=false
+fi
+_LT_DECL([], [lt_unset], [0], [whether the shell understands "unset"])dnl
+
+# test EBCDIC or ASCII
+case `echo X|tr X '\101'` in
+ A) # ASCII based system
+    # \n is not interpreted correctly by Solaris 8 /usr/ucb/tr
+  lt_SP2NL='tr \040 \012'
+  lt_NL2SP='tr \015\012 \040\040'
+  ;;
+ *) # EBCDIC based system
+  lt_SP2NL='tr \100 \n'
+  lt_NL2SP='tr \r\n \100\100'
+  ;;
+esac
+_LT_DECL([SP2NL], [lt_SP2NL], [1], [turn spaces into newlines])dnl
+_LT_DECL([NL2SP], [lt_NL2SP], [1], [turn newlines into spaces])dnl
+])# _LT_CHECK_SHELL_FEATURES
+
+
+# _LT_PROG_FUNCTION_REPLACE (FUNCNAME, REPLACEMENT-BODY)
+# ------------------------------------------------------
+# In `$cfgfile', look for function FUNCNAME delimited by `^FUNCNAME ()$' and
+# '^} FUNCNAME ', and replace its body with REPLACEMENT-BODY.
+m4_defun([_LT_PROG_FUNCTION_REPLACE],
+[dnl {
+sed -e '/^$1 ()$/,/^} # $1 /c\
+$1 ()\
+{\
+m4_bpatsubsts([$2], [$], [\\], [^\([    ]\)], [\\\1])
+} # Extended-shell $1 implementation' "$cfgfile" > $cfgfile.tmp \
+  && mv -f "$cfgfile.tmp" "$cfgfile" \
+    || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
+test 0 -eq $? || _lt_function_replace_fail=:
+])
+
+
+# _LT_PROG_REPLACE_SHELLFNS
+# -------------------------
+# Replace existing portable implementations of several shell functions with
+# equivalent extended shell implementations where those features are available..
+m4_defun([_LT_PROG_REPLACE_SHELLFNS],
+[if test x"$xsi_shell" = xyes; then
+  _LT_PROG_FUNCTION_REPLACE([func_dirname], [dnl
+    case ${1} in
+      */*) func_dirname_result="${1%/*}${2}" ;;
+      *  ) func_dirname_result="${3}" ;;
+    esac])
+
+  _LT_PROG_FUNCTION_REPLACE([func_basename], [dnl
+    func_basename_result="${1##*/}"])
+
+  _LT_PROG_FUNCTION_REPLACE([func_dirname_and_basename], [dnl
+    case ${1} in
+      */*) func_dirname_result="${1%/*}${2}" ;;
+      *  ) func_dirname_result="${3}" ;;
+    esac
+    func_basename_result="${1##*/}"])
+
+  _LT_PROG_FUNCTION_REPLACE([func_stripname], [dnl
+    # pdksh 5.2.14 does not do ${X%$Y} correctly if both X and Y are
+    # positional parameters, so assign one to ordinary parameter first.
+    func_stripname_result=${3}
+    func_stripname_result=${func_stripname_result#"${1}"}
+    func_stripname_result=${func_stripname_result%"${2}"}])
+
+  _LT_PROG_FUNCTION_REPLACE([func_split_long_opt], [dnl
+    func_split_long_opt_name=${1%%=*}
+    func_split_long_opt_arg=${1#*=}])
+
+  _LT_PROG_FUNCTION_REPLACE([func_split_short_opt], [dnl
+    func_split_short_opt_arg=${1#??}
+    func_split_short_opt_name=${1%"$func_split_short_opt_arg"}])
+
+  _LT_PROG_FUNCTION_REPLACE([func_lo2o], [dnl
+    case ${1} in
+      *.lo) func_lo2o_result=${1%.lo}.${objext} ;;
+      *)    func_lo2o_result=${1} ;;
+    esac])
+
+  _LT_PROG_FUNCTION_REPLACE([func_xform], [    func_xform_result=${1%.*}.lo])
+
+  _LT_PROG_FUNCTION_REPLACE([func_arith], [    func_arith_result=$(( $[*] ))])
+
+  _LT_PROG_FUNCTION_REPLACE([func_len], [    func_len_result=${#1}])
+fi
+
+if test x"$lt_shell_append" = xyes; then
+  _LT_PROG_FUNCTION_REPLACE([func_append], [    eval "${1}+=\\${2}"])
+
+  _LT_PROG_FUNCTION_REPLACE([func_append_quoted], [dnl
+    func_quote_for_eval "${2}"
+dnl m4 expansion turns \\\\ into \\, and then the shell eval turns that into \
+    eval "${1}+=\\\\ \\$func_quote_for_eval_result"])
+
+  # Save a `func_append' function call where possible by direct use of '+='
+  sed -e 's%func_append \([[a-zA-Z_]]\{1,\}\) "%\1+="%g' $cfgfile > $cfgfile.tmp \
+    && mv -f "$cfgfile.tmp" "$cfgfile" \
+      || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
+  test 0 -eq $? || _lt_function_replace_fail=:
+else
+  # Save a `func_append' function call even when '+=' is not available
+  sed -e 's%func_append \([[a-zA-Z_]]\{1,\}\) "%\1="$\1%g' $cfgfile > $cfgfile.tmp \
+    && mv -f "$cfgfile.tmp" "$cfgfile" \
+      || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
+  test 0 -eq $? || _lt_function_replace_fail=:
+fi
+
+if test x"$_lt_function_replace_fail" = x":"; then
+  AC_MSG_WARN([Unable to substitute extended shell functions in $ofile])
+fi
+])
+
+# _LT_PATH_CONVERSION_FUNCTIONS
+# -----------------------------
+# Determine which file name conversion functions should be used by
+# func_to_host_file (and, implicitly, by func_to_host_path).  These are needed
+# for certain cross-compile configurations and native mingw.
+m4_defun([_LT_PATH_CONVERSION_FUNCTIONS],
+[AC_REQUIRE([AC_CANONICAL_HOST])dnl
+AC_REQUIRE([AC_CANONICAL_BUILD])dnl
+AC_MSG_CHECKING([how to convert $build file names to $host format])
+AC_CACHE_VAL(lt_cv_to_host_file_cmd,
+[case $host in
+  *-*-mingw* )
+    case $build in
+      *-*-mingw* ) # actually msys
+        lt_cv_to_host_file_cmd=func_convert_file_msys_to_w32
+        ;;
+      *-*-cygwin* )
+        lt_cv_to_host_file_cmd=func_convert_file_cygwin_to_w32
+        ;;
+      * ) # otherwise, assume *nix
+        lt_cv_to_host_file_cmd=func_convert_file_nix_to_w32
+        ;;
+    esac
+    ;;
+  *-*-cygwin* )
+    case $build in
+      *-*-mingw* ) # actually msys
+        lt_cv_to_host_file_cmd=func_convert_file_msys_to_cygwin
+        ;;
+      *-*-cygwin* )
+        lt_cv_to_host_file_cmd=func_convert_file_noop
+        ;;
+      * ) # otherwise, assume *nix
+        lt_cv_to_host_file_cmd=func_convert_file_nix_to_cygwin
+        ;;
+    esac
+    ;;
+  * ) # unhandled hosts (and "normal" native builds)
+    lt_cv_to_host_file_cmd=func_convert_file_noop
+    ;;
+esac
+])
+to_host_file_cmd=$lt_cv_to_host_file_cmd
+AC_MSG_RESULT([$lt_cv_to_host_file_cmd])
+_LT_DECL([to_host_file_cmd], [lt_cv_to_host_file_cmd],
+         [0], [convert $build file names to $host format])dnl
+
+AC_MSG_CHECKING([how to convert $build file names to toolchain format])
+AC_CACHE_VAL(lt_cv_to_tool_file_cmd,
+[#assume ordinary cross tools, or native build.
+lt_cv_to_tool_file_cmd=func_convert_file_noop
+case $host in
+  *-*-mingw* )
+    case $build in
+      *-*-mingw* ) # actually msys
+        lt_cv_to_tool_file_cmd=func_convert_file_msys_to_w32
+        ;;
+    esac
+    ;;
+esac
+])
+to_tool_file_cmd=$lt_cv_to_tool_file_cmd
+AC_MSG_RESULT([$lt_cv_to_tool_file_cmd])
+_LT_DECL([to_tool_file_cmd], [lt_cv_to_tool_file_cmd],
+         [0], [convert $build files to toolchain format])dnl
+])# _LT_PATH_CONVERSION_FUNCTIONS
diff --git a/m4/ltoptions.m4 b/m4/ltoptions.m4
new file mode 100644 (file)
index 0000000..5d9acd8
--- /dev/null
@@ -0,0 +1,384 @@
+# Helper functions for option handling.                    -*- Autoconf -*-
+#
+#   Copyright (C) 2004, 2005, 2007, 2008, 2009 Free Software Foundation,
+#   Inc.
+#   Written by Gary V. Vaughan, 2004
+#
+# This file is free software; the Free Software Foundation gives
+# unlimited permission to copy and/or distribute it, with or without
+# modifications, as long as this notice is preserved.
+
+# serial 7 ltoptions.m4
+
+# This is to help aclocal find these macros, as it can't see m4_define.
+AC_DEFUN([LTOPTIONS_VERSION], [m4_if([1])])
+
+
+# _LT_MANGLE_OPTION(MACRO-NAME, OPTION-NAME)
+# ------------------------------------------
+m4_define([_LT_MANGLE_OPTION],
+[[_LT_OPTION_]m4_bpatsubst($1__$2, [[^a-zA-Z0-9_]], [_])])
+
+
+# _LT_SET_OPTION(MACRO-NAME, OPTION-NAME)
+# ---------------------------------------
+# Set option OPTION-NAME for macro MACRO-NAME, and if there is a
+# matching handler defined, dispatch to it.  Other OPTION-NAMEs are
+# saved as a flag.
+m4_define([_LT_SET_OPTION],
+[m4_define(_LT_MANGLE_OPTION([$1], [$2]))dnl
+m4_ifdef(_LT_MANGLE_DEFUN([$1], [$2]),
+        _LT_MANGLE_DEFUN([$1], [$2]),
+    [m4_warning([Unknown $1 option `$2'])])[]dnl
+])
+
+
+# _LT_IF_OPTION(MACRO-NAME, OPTION-NAME, IF-SET, [IF-NOT-SET])
+# ------------------------------------------------------------
+# Execute IF-SET if OPTION is set, IF-NOT-SET otherwise.
+m4_define([_LT_IF_OPTION],
+[m4_ifdef(_LT_MANGLE_OPTION([$1], [$2]), [$3], [$4])])
+
+
+# _LT_UNLESS_OPTIONS(MACRO-NAME, OPTION-LIST, IF-NOT-SET)
+# -------------------------------------------------------
+# Execute IF-NOT-SET unless all options in OPTION-LIST for MACRO-NAME
+# are set.
+m4_define([_LT_UNLESS_OPTIONS],
+[m4_foreach([_LT_Option], m4_split(m4_normalize([$2])),
+           [m4_ifdef(_LT_MANGLE_OPTION([$1], _LT_Option),
+                     [m4_define([$0_found])])])[]dnl
+m4_ifdef([$0_found], [m4_undefine([$0_found])], [$3
+])[]dnl
+])
+
+
+# _LT_SET_OPTIONS(MACRO-NAME, OPTION-LIST)
+# ----------------------------------------
+# OPTION-LIST is a space-separated list of Libtool options associated
+# with MACRO-NAME.  If any OPTION has a matching handler declared with
+# LT_OPTION_DEFINE, dispatch to that macro; otherwise complain about
+# the unknown option and exit.
+m4_defun([_LT_SET_OPTIONS],
+[# Set options
+m4_foreach([_LT_Option], m4_split(m4_normalize([$2])),
+    [_LT_SET_OPTION([$1], _LT_Option)])
+
+m4_if([$1],[LT_INIT],[
+  dnl
+  dnl Simply set some default values (i.e off) if boolean options were not
+  dnl specified:
+  _LT_UNLESS_OPTIONS([LT_INIT], [dlopen], [enable_dlopen=no
+  ])
+  _LT_UNLESS_OPTIONS([LT_INIT], [win32-dll], [enable_win32_dll=no
+  ])
+  dnl
+  dnl If no reference was made to various pairs of opposing options, then
+  dnl we run the default mode handler for the pair.  For example, if neither
+  dnl `shared' nor `disable-shared' was passed, we enable building of shared
+  dnl archives by default:
+  _LT_UNLESS_OPTIONS([LT_INIT], [shared disable-shared], [_LT_ENABLE_SHARED])
+  _LT_UNLESS_OPTIONS([LT_INIT], [static disable-static], [_LT_ENABLE_STATIC])
+  _LT_UNLESS_OPTIONS([LT_INIT], [pic-only no-pic], [_LT_WITH_PIC])
+  _LT_UNLESS_OPTIONS([LT_INIT], [fast-install disable-fast-install],
+                  [_LT_ENABLE_FAST_INSTALL])
+  ])
+])# _LT_SET_OPTIONS
+
+
+## --------------------------------- ##
+## Macros to handle LT_INIT options. ##
+## --------------------------------- ##
+
+# _LT_MANGLE_DEFUN(MACRO-NAME, OPTION-NAME)
+# -----------------------------------------
+m4_define([_LT_MANGLE_DEFUN],
+[[_LT_OPTION_DEFUN_]m4_bpatsubst(m4_toupper([$1__$2]), [[^A-Z0-9_]], [_])])
+
+
+# LT_OPTION_DEFINE(MACRO-NAME, OPTION-NAME, CODE)
+# -----------------------------------------------
+m4_define([LT_OPTION_DEFINE],
+[m4_define(_LT_MANGLE_DEFUN([$1], [$2]), [$3])[]dnl
+])# LT_OPTION_DEFINE
+
+
+# dlopen
+# ------
+LT_OPTION_DEFINE([LT_INIT], [dlopen], [enable_dlopen=yes
+])
+
+AU_DEFUN([AC_LIBTOOL_DLOPEN],
+[_LT_SET_OPTION([LT_INIT], [dlopen])
+AC_DIAGNOSE([obsolete],
+[$0: Remove this warning and the call to _LT_SET_OPTION when you
+put the `dlopen' option into LT_INIT's first parameter.])
+])
+
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([AC_LIBTOOL_DLOPEN], [])
+
+
+# win32-dll
+# ---------
+# Declare package support for building win32 dll's.
+LT_OPTION_DEFINE([LT_INIT], [win32-dll],
+[enable_win32_dll=yes
+
+case $host in
+*-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-cegcc*)
+  AC_CHECK_TOOL(AS, as, false)
+  AC_CHECK_TOOL(DLLTOOL, dlltool, false)
+  AC_CHECK_TOOL(OBJDUMP, objdump, false)
+  ;;
+esac
+
+test -z "$AS" && AS=as
+_LT_DECL([], [AS],      [1], [Assembler program])dnl
+
+test -z "$DLLTOOL" && DLLTOOL=dlltool
+_LT_DECL([], [DLLTOOL], [1], [DLL creation program])dnl
+
+test -z "$OBJDUMP" && OBJDUMP=objdump
+_LT_DECL([], [OBJDUMP], [1], [Object dumper program])dnl
+])# win32-dll
+
+AU_DEFUN([AC_LIBTOOL_WIN32_DLL],
+[AC_REQUIRE([AC_CANONICAL_HOST])dnl
+_LT_SET_OPTION([LT_INIT], [win32-dll])
+AC_DIAGNOSE([obsolete],
+[$0: Remove this warning and the call to _LT_SET_OPTION when you
+put the `win32-dll' option into LT_INIT's first parameter.])
+])
+
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([AC_LIBTOOL_WIN32_DLL], [])
+
+
+# _LT_ENABLE_SHARED([DEFAULT])
+# ----------------------------
+# implement the --enable-shared flag, and supports the `shared' and
+# `disable-shared' LT_INIT options.
+# DEFAULT is either `yes' or `no'.  If omitted, it defaults to `yes'.
+m4_define([_LT_ENABLE_SHARED],
+[m4_define([_LT_ENABLE_SHARED_DEFAULT], [m4_if($1, no, no, yes)])dnl
+AC_ARG_ENABLE([shared],
+    [AS_HELP_STRING([--enable-shared@<:@=PKGS@:>@],
+       [build shared libraries @<:@default=]_LT_ENABLE_SHARED_DEFAULT[@:>@])],
+    [p=${PACKAGE-default}
+    case $enableval in
+    yes) enable_shared=yes ;;
+    no) enable_shared=no ;;
+    *)
+      enable_shared=no
+      # Look at the argument we got.  We use all the common list separators.
+      lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR,"
+      for pkg in $enableval; do
+       IFS="$lt_save_ifs"
+       if test "X$pkg" = "X$p"; then
+         enable_shared=yes
+       fi
+      done
+      IFS="$lt_save_ifs"
+      ;;
+    esac],
+    [enable_shared=]_LT_ENABLE_SHARED_DEFAULT)
+
+    _LT_DECL([build_libtool_libs], [enable_shared], [0],
+       [Whether or not to build shared libraries])
+])# _LT_ENABLE_SHARED
+
+LT_OPTION_DEFINE([LT_INIT], [shared], [_LT_ENABLE_SHARED([yes])])
+LT_OPTION_DEFINE([LT_INIT], [disable-shared], [_LT_ENABLE_SHARED([no])])
+
+# Old names:
+AC_DEFUN([AC_ENABLE_SHARED],
+[_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[shared])
+])
+
+AC_DEFUN([AC_DISABLE_SHARED],
+[_LT_SET_OPTION([LT_INIT], [disable-shared])
+])
+
+AU_DEFUN([AM_ENABLE_SHARED], [AC_ENABLE_SHARED($@)])
+AU_DEFUN([AM_DISABLE_SHARED], [AC_DISABLE_SHARED($@)])
+
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([AM_ENABLE_SHARED], [])
+dnl AC_DEFUN([AM_DISABLE_SHARED], [])
+
+
+
+# _LT_ENABLE_STATIC([DEFAULT])
+# ----------------------------
+# implement the --enable-static flag, and support the `static' and
+# `disable-static' LT_INIT options.
+# DEFAULT is either `yes' or `no'.  If omitted, it defaults to `yes'.
+m4_define([_LT_ENABLE_STATIC],
+[m4_define([_LT_ENABLE_STATIC_DEFAULT], [m4_if($1, no, no, yes)])dnl
+AC_ARG_ENABLE([static],
+    [AS_HELP_STRING([--enable-static@<:@=PKGS@:>@],
+       [build static libraries @<:@default=]_LT_ENABLE_STATIC_DEFAULT[@:>@])],
+    [p=${PACKAGE-default}
+    case $enableval in
+    yes) enable_static=yes ;;
+    no) enable_static=no ;;
+    *)
+     enable_static=no
+      # Look at the argument we got.  We use all the common list separators.
+      lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR,"
+      for pkg in $enableval; do
+       IFS="$lt_save_ifs"
+       if test "X$pkg" = "X$p"; then
+         enable_static=yes
+       fi
+      done
+      IFS="$lt_save_ifs"
+      ;;
+    esac],
+    [enable_static=]_LT_ENABLE_STATIC_DEFAULT)
+
+    _LT_DECL([build_old_libs], [enable_static], [0],
+       [Whether or not to build static libraries])
+])# _LT_ENABLE_STATIC
+
+LT_OPTION_DEFINE([LT_INIT], [static], [_LT_ENABLE_STATIC([yes])])
+LT_OPTION_DEFINE([LT_INIT], [disable-static], [_LT_ENABLE_STATIC([no])])
+
+# Old names:
+AC_DEFUN([AC_ENABLE_STATIC],
+[_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[static])
+])
+
+AC_DEFUN([AC_DISABLE_STATIC],
+[_LT_SET_OPTION([LT_INIT], [disable-static])
+])
+
+AU_DEFUN([AM_ENABLE_STATIC], [AC_ENABLE_STATIC($@)])
+AU_DEFUN([AM_DISABLE_STATIC], [AC_DISABLE_STATIC($@)])
+
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([AM_ENABLE_STATIC], [])
+dnl AC_DEFUN([AM_DISABLE_STATIC], [])
+
+
+
+# _LT_ENABLE_FAST_INSTALL([DEFAULT])
+# ----------------------------------
+# implement the --enable-fast-install flag, and support the `fast-install'
+# and `disable-fast-install' LT_INIT options.
+# DEFAULT is either `yes' or `no'.  If omitted, it defaults to `yes'.
+m4_define([_LT_ENABLE_FAST_INSTALL],
+[m4_define([_LT_ENABLE_FAST_INSTALL_DEFAULT], [m4_if($1, no, no, yes)])dnl
+AC_ARG_ENABLE([fast-install],
+    [AS_HELP_STRING([--enable-fast-install@<:@=PKGS@:>@],
+    [optimize for fast installation @<:@default=]_LT_ENABLE_FAST_INSTALL_DEFAULT[@:>@])],
+    [p=${PACKAGE-default}
+    case $enableval in
+    yes) enable_fast_install=yes ;;
+    no) enable_fast_install=no ;;
+    *)
+      enable_fast_install=no
+      # Look at the argument we got.  We use all the common list separators.
+      lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR,"
+      for pkg in $enableval; do
+       IFS="$lt_save_ifs"
+       if test "X$pkg" = "X$p"; then
+         enable_fast_install=yes
+       fi
+      done
+      IFS="$lt_save_ifs"
+      ;;
+    esac],
+    [enable_fast_install=]_LT_ENABLE_FAST_INSTALL_DEFAULT)
+
+_LT_DECL([fast_install], [enable_fast_install], [0],
+        [Whether or not to optimize for fast installation])dnl
+])# _LT_ENABLE_FAST_INSTALL
+
+LT_OPTION_DEFINE([LT_INIT], [fast-install], [_LT_ENABLE_FAST_INSTALL([yes])])
+LT_OPTION_DEFINE([LT_INIT], [disable-fast-install], [_LT_ENABLE_FAST_INSTALL([no])])
+
+# Old names:
+AU_DEFUN([AC_ENABLE_FAST_INSTALL],
+[_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[fast-install])
+AC_DIAGNOSE([obsolete],
+[$0: Remove this warning and the call to _LT_SET_OPTION when you put
+the `fast-install' option into LT_INIT's first parameter.])
+])
+
+AU_DEFUN([AC_DISABLE_FAST_INSTALL],
+[_LT_SET_OPTION([LT_INIT], [disable-fast-install])
+AC_DIAGNOSE([obsolete],
+[$0: Remove this warning and the call to _LT_SET_OPTION when you put
+the `disable-fast-install' option into LT_INIT's first parameter.])
+])
+
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([AC_ENABLE_FAST_INSTALL], [])
+dnl AC_DEFUN([AM_DISABLE_FAST_INSTALL], [])
+
+
+# _LT_WITH_PIC([MODE])
+# --------------------
+# implement the --with-pic flag, and support the `pic-only' and `no-pic'
+# LT_INIT options.
+# MODE is either `yes' or `no'.  If omitted, it defaults to `both'.
+m4_define([_LT_WITH_PIC],
+[AC_ARG_WITH([pic],
+    [AS_HELP_STRING([--with-pic@<:@=PKGS@:>@],
+       [try to use only PIC/non-PIC objects @<:@default=use both@:>@])],
+    [lt_p=${PACKAGE-default}
+    case $withval in
+    yes|no) pic_mode=$withval ;;
+    *)
+      pic_mode=default
+      # Look at the argument we got.  We use all the common list separators.
+      lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR,"
+      for lt_pkg in $withval; do
+       IFS="$lt_save_ifs"
+       if test "X$lt_pkg" = "X$lt_p"; then
+         pic_mode=yes
+       fi
+      done
+      IFS="$lt_save_ifs"
+      ;;
+    esac],
+    [pic_mode=default])
+
+test -z "$pic_mode" && pic_mode=m4_default([$1], [default])
+
+_LT_DECL([], [pic_mode], [0], [What type of objects to build])dnl
+])# _LT_WITH_PIC
+
+LT_OPTION_DEFINE([LT_INIT], [pic-only], [_LT_WITH_PIC([yes])])
+LT_OPTION_DEFINE([LT_INIT], [no-pic], [_LT_WITH_PIC([no])])
+
+# Old name:
+AU_DEFUN([AC_LIBTOOL_PICMODE],
+[_LT_SET_OPTION([LT_INIT], [pic-only])
+AC_DIAGNOSE([obsolete],
+[$0: Remove this warning and the call to _LT_SET_OPTION when you
+put the `pic-only' option into LT_INIT's first parameter.])
+])
+
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([AC_LIBTOOL_PICMODE], [])
+
+## ----------------- ##
+## LTDL_INIT Options ##
+## ----------------- ##
+
+m4_define([_LTDL_MODE], [])
+LT_OPTION_DEFINE([LTDL_INIT], [nonrecursive],
+                [m4_define([_LTDL_MODE], [nonrecursive])])
+LT_OPTION_DEFINE([LTDL_INIT], [recursive],
+                [m4_define([_LTDL_MODE], [recursive])])
+LT_OPTION_DEFINE([LTDL_INIT], [subproject],
+                [m4_define([_LTDL_MODE], [subproject])])
+
+m4_define([_LTDL_TYPE], [])
+LT_OPTION_DEFINE([LTDL_INIT], [installable],
+                [m4_define([_LTDL_TYPE], [installable])])
+LT_OPTION_DEFINE([LTDL_INIT], [convenience],
+                [m4_define([_LTDL_TYPE], [convenience])])
diff --git a/m4/ltsugar.m4 b/m4/ltsugar.m4
new file mode 100644 (file)
index 0000000..9000a05
--- /dev/null
@@ -0,0 +1,123 @@
+# ltsugar.m4 -- libtool m4 base layer.                         -*-Autoconf-*-
+#
+# Copyright (C) 2004, 2005, 2007, 2008 Free Software Foundation, Inc.
+# Written by Gary V. Vaughan, 2004
+#
+# This file is free software; the Free Software Foundation gives
+# unlimited permission to copy and/or distribute it, with or without
+# modifications, as long as this notice is preserved.
+
+# serial 6 ltsugar.m4
+
+# This is to help aclocal find these macros, as it can't see m4_define.
+AC_DEFUN([LTSUGAR_VERSION], [m4_if([0.1])])
+
+
+# lt_join(SEP, ARG1, [ARG2...])
+# -----------------------------
+# Produce ARG1SEPARG2...SEPARGn, omitting [] arguments and their
+# associated separator.
+# Needed until we can rely on m4_join from Autoconf 2.62, since all earlier
+# versions in m4sugar had bugs.
+m4_define([lt_join],
+[m4_if([$#], [1], [],
+       [$#], [2], [[$2]],
+       [m4_if([$2], [], [], [[$2]_])$0([$1], m4_shift(m4_shift($@)))])])
+m4_define([_lt_join],
+[m4_if([$#$2], [2], [],
+       [m4_if([$2], [], [], [[$1$2]])$0([$1], m4_shift(m4_shift($@)))])])
+
+
+# lt_car(LIST)
+# lt_cdr(LIST)
+# ------------
+# Manipulate m4 lists.
+# These macros are necessary as long as will still need to support
+# Autoconf-2.59 which quotes differently.
+m4_define([lt_car], [[$1]])
+m4_define([lt_cdr],
+[m4_if([$#], 0, [m4_fatal([$0: cannot be called without arguments])],
+       [$#], 1, [],
+       [m4_dquote(m4_shift($@))])])
+m4_define([lt_unquote], $1)
+
+
+# lt_append(MACRO-NAME, STRING, [SEPARATOR])
+# ------------------------------------------
+# Redefine MACRO-NAME to hold its former content plus `SEPARATOR'`STRING'.
+# Note that neither SEPARATOR nor STRING are expanded; they are appended
+# to MACRO-NAME as is (leaving the expansion for when MACRO-NAME is invoked).
+# No SEPARATOR is output if MACRO-NAME was previously undefined (different
+# than defined and empty).
+#
+# This macro is needed until we can rely on Autoconf 2.62, since earlier
+# versions of m4sugar mistakenly expanded SEPARATOR but not STRING.
+m4_define([lt_append],
+[m4_define([$1],
+          m4_ifdef([$1], [m4_defn([$1])[$3]])[$2])])
+
+
+
+# lt_combine(SEP, PREFIX-LIST, INFIX, SUFFIX1, [SUFFIX2...])
+# ----------------------------------------------------------
+# Produce a SEP delimited list of all paired combinations of elements of
+# PREFIX-LIST with SUFFIX1 through SUFFIXn.  Each element of the list
+# has the form PREFIXmINFIXSUFFIXn.
+# Needed until we can rely on m4_combine added in Autoconf 2.62.
+m4_define([lt_combine],
+[m4_if(m4_eval([$# > 3]), [1],
+       [m4_pushdef([_Lt_sep], [m4_define([_Lt_sep], m4_defn([lt_car]))])]]dnl
+[[m4_foreach([_Lt_prefix], [$2],
+            [m4_foreach([_Lt_suffix],
+               ]m4_dquote(m4_dquote(m4_shift(m4_shift(m4_shift($@)))))[,
+       [_Lt_sep([$1])[]m4_defn([_Lt_prefix])[$3]m4_defn([_Lt_suffix])])])])])
+
+
+# lt_if_append_uniq(MACRO-NAME, VARNAME, [SEPARATOR], [UNIQ], [NOT-UNIQ])
+# -----------------------------------------------------------------------
+# Iff MACRO-NAME does not yet contain VARNAME, then append it (delimited
+# by SEPARATOR if supplied) and expand UNIQ, else NOT-UNIQ.
+m4_define([lt_if_append_uniq],
+[m4_ifdef([$1],
+         [m4_if(m4_index([$3]m4_defn([$1])[$3], [$3$2$3]), [-1],
+                [lt_append([$1], [$2], [$3])$4],
+                [$5])],
+         [lt_append([$1], [$2], [$3])$4])])
+
+
+# lt_dict_add(DICT, KEY, VALUE)
+# -----------------------------
+m4_define([lt_dict_add],
+[m4_define([$1($2)], [$3])])
+
+
+# lt_dict_add_subkey(DICT, KEY, SUBKEY, VALUE)
+# --------------------------------------------
+m4_define([lt_dict_add_subkey],
+[m4_define([$1($2:$3)], [$4])])
+
+
+# lt_dict_fetch(DICT, KEY, [SUBKEY])
+# ----------------------------------
+m4_define([lt_dict_fetch],
+[m4_ifval([$3],
+       m4_ifdef([$1($2:$3)], [m4_defn([$1($2:$3)])]),
+    m4_ifdef([$1($2)], [m4_defn([$1($2)])]))])
+
+
+# lt_if_dict_fetch(DICT, KEY, [SUBKEY], VALUE, IF-TRUE, [IF-FALSE])
+# -----------------------------------------------------------------
+m4_define([lt_if_dict_fetch],
+[m4_if(lt_dict_fetch([$1], [$2], [$3]), [$4],
+       [$5],
+    [$6])])
+
+
+# lt_dict_filter(DICT, [SUBKEY], VALUE, [SEPARATOR], KEY, [...])
+# --------------------------------------------------------------
+m4_define([lt_dict_filter],
+[m4_if([$5], [], [],
+  [lt_join(m4_quote(m4_default([$4], [[, ]])),
+           lt_unquote(m4_split(m4_normalize(m4_foreach(_Lt_key, lt_car([m4_shiftn(4, $@)]),
+                     [lt_if_dict_fetch([$1], _Lt_key, [$2], [$3], [_Lt_key ])])))))])[]dnl
+])
diff --git a/m4/ltversion.m4 b/m4/ltversion.m4
new file mode 100644 (file)
index 0000000..07a8602
--- /dev/null
@@ -0,0 +1,23 @@
+# ltversion.m4 -- version numbers                      -*- Autoconf -*-
+#
+#   Copyright (C) 2004 Free Software Foundation, Inc.
+#   Written by Scott James Remnant, 2004
+#
+# This file is free software; the Free Software Foundation gives
+# unlimited permission to copy and/or distribute it, with or without
+# modifications, as long as this notice is preserved.
+
+# @configure_input@
+
+# serial 3337 ltversion.m4
+# This file is part of GNU Libtool
+
+m4_define([LT_PACKAGE_VERSION], [2.4.2])
+m4_define([LT_PACKAGE_REVISION], [1.3337])
+
+AC_DEFUN([LTVERSION_VERSION],
+[macro_version='2.4.2'
+macro_revision='1.3337'
+_LT_DECL(, macro_version, 0, [Which release of libtool.m4 was used?])
+_LT_DECL(, macro_revision, 0)
+])
diff --git a/m4/lt~obsolete.m4 b/m4/lt~obsolete.m4
new file mode 100644 (file)
index 0000000..c573da9
--- /dev/null
@@ -0,0 +1,98 @@
+# lt~obsolete.m4 -- aclocal satisfying obsolete definitions.    -*-Autoconf-*-
+#
+#   Copyright (C) 2004, 2005, 2007, 2009 Free Software Foundation, Inc.
+#   Written by Scott James Remnant, 2004.
+#
+# This file is free software; the Free Software Foundation gives
+# unlimited permission to copy and/or distribute it, with or without
+# modifications, as long as this notice is preserved.
+
+# serial 5 lt~obsolete.m4
+
+# These exist entirely to fool aclocal when bootstrapping libtool.
+#
+# In the past libtool.m4 has provided macros via AC_DEFUN (or AU_DEFUN)
+# which have later been changed to m4_define as they aren't part of the
+# exported API, or moved to Autoconf or Automake where they belong.
+#
+# The trouble is, aclocal is a bit thick.  It'll see the old AC_DEFUN
+# in /usr/share/aclocal/libtool.m4 and remember it, then when it sees us
+# using a macro with the same name in our local m4/libtool.m4 it'll
+# pull the old libtool.m4 in (it doesn't see our shiny new m4_define
+# and doesn't know about Autoconf macros at all.)
+#
+# So we provide this file, which has a silly filename so it's always
+# included after everything else.  This provides aclocal with the
+# AC_DEFUNs it wants, but when m4 processes it, it doesn't do anything
+# because those macros already exist, or will be overwritten later.
+# We use AC_DEFUN over AU_DEFUN for compatibility with aclocal-1.6. 
+#
+# Anytime we withdraw an AC_DEFUN or AU_DEFUN, remember to add it here.
+# Yes, that means every name once taken will need to remain here until
+# we give up compatibility with versions before 1.7, at which point
+# we need to keep only those names which we still refer to.
+
+# This is to help aclocal find these macros, as it can't see m4_define.
+AC_DEFUN([LTOBSOLETE_VERSION], [m4_if([1])])
+
+m4_ifndef([AC_LIBTOOL_LINKER_OPTION],  [AC_DEFUN([AC_LIBTOOL_LINKER_OPTION])])
+m4_ifndef([AC_PROG_EGREP],             [AC_DEFUN([AC_PROG_EGREP])])
+m4_ifndef([_LT_AC_PROG_ECHO_BACKSLASH],        [AC_DEFUN([_LT_AC_PROG_ECHO_BACKSLASH])])
+m4_ifndef([_LT_AC_SHELL_INIT],         [AC_DEFUN([_LT_AC_SHELL_INIT])])
+m4_ifndef([_LT_AC_SYS_LIBPATH_AIX],    [AC_DEFUN([_LT_AC_SYS_LIBPATH_AIX])])
+m4_ifndef([_LT_PROG_LTMAIN],           [AC_DEFUN([_LT_PROG_LTMAIN])])
+m4_ifndef([_LT_AC_TAGVAR],             [AC_DEFUN([_LT_AC_TAGVAR])])
+m4_ifndef([AC_LTDL_ENABLE_INSTALL],    [AC_DEFUN([AC_LTDL_ENABLE_INSTALL])])
+m4_ifndef([AC_LTDL_PREOPEN],           [AC_DEFUN([AC_LTDL_PREOPEN])])
+m4_ifndef([_LT_AC_SYS_COMPILER],       [AC_DEFUN([_LT_AC_SYS_COMPILER])])
+m4_ifndef([_LT_AC_LOCK],               [AC_DEFUN([_LT_AC_LOCK])])
+m4_ifndef([AC_LIBTOOL_SYS_OLD_ARCHIVE],        [AC_DEFUN([AC_LIBTOOL_SYS_OLD_ARCHIVE])])
+m4_ifndef([_LT_AC_TRY_DLOPEN_SELF],    [AC_DEFUN([_LT_AC_TRY_DLOPEN_SELF])])
+m4_ifndef([AC_LIBTOOL_PROG_CC_C_O],    [AC_DEFUN([AC_LIBTOOL_PROG_CC_C_O])])
+m4_ifndef([AC_LIBTOOL_SYS_HARD_LINK_LOCKS], [AC_DEFUN([AC_LIBTOOL_SYS_HARD_LINK_LOCKS])])
+m4_ifndef([AC_LIBTOOL_OBJDIR],         [AC_DEFUN([AC_LIBTOOL_OBJDIR])])
+m4_ifndef([AC_LTDL_OBJDIR],            [AC_DEFUN([AC_LTDL_OBJDIR])])
+m4_ifndef([AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH], [AC_DEFUN([AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH])])
+m4_ifndef([AC_LIBTOOL_SYS_LIB_STRIP],  [AC_DEFUN([AC_LIBTOOL_SYS_LIB_STRIP])])
+m4_ifndef([AC_PATH_MAGIC],             [AC_DEFUN([AC_PATH_MAGIC])])
+m4_ifndef([AC_PROG_LD_GNU],            [AC_DEFUN([AC_PROG_LD_GNU])])
+m4_ifndef([AC_PROG_LD_RELOAD_FLAG],    [AC_DEFUN([AC_PROG_LD_RELOAD_FLAG])])
+m4_ifndef([AC_DEPLIBS_CHECK_METHOD],   [AC_DEFUN([AC_DEPLIBS_CHECK_METHOD])])
+m4_ifndef([AC_LIBTOOL_PROG_COMPILER_NO_RTTI], [AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_NO_RTTI])])
+m4_ifndef([AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE], [AC_DEFUN([AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE])])
+m4_ifndef([AC_LIBTOOL_PROG_COMPILER_PIC], [AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_PIC])])
+m4_ifndef([AC_LIBTOOL_PROG_LD_SHLIBS], [AC_DEFUN([AC_LIBTOOL_PROG_LD_SHLIBS])])
+m4_ifndef([AC_LIBTOOL_POSTDEP_PREDEP], [AC_DEFUN([AC_LIBTOOL_POSTDEP_PREDEP])])
+m4_ifndef([LT_AC_PROG_EGREP],          [AC_DEFUN([LT_AC_PROG_EGREP])])
+m4_ifndef([LT_AC_PROG_SED],            [AC_DEFUN([LT_AC_PROG_SED])])
+m4_ifndef([_LT_CC_BASENAME],           [AC_DEFUN([_LT_CC_BASENAME])])
+m4_ifndef([_LT_COMPILER_BOILERPLATE],  [AC_DEFUN([_LT_COMPILER_BOILERPLATE])])
+m4_ifndef([_LT_LINKER_BOILERPLATE],    [AC_DEFUN([_LT_LINKER_BOILERPLATE])])
+m4_ifndef([_AC_PROG_LIBTOOL],          [AC_DEFUN([_AC_PROG_LIBTOOL])])
+m4_ifndef([AC_LIBTOOL_SETUP],          [AC_DEFUN([AC_LIBTOOL_SETUP])])
+m4_ifndef([_LT_AC_CHECK_DLFCN],                [AC_DEFUN([_LT_AC_CHECK_DLFCN])])
+m4_ifndef([AC_LIBTOOL_SYS_DYNAMIC_LINKER],     [AC_DEFUN([AC_LIBTOOL_SYS_DYNAMIC_LINKER])])
+m4_ifndef([_LT_AC_TAGCONFIG],          [AC_DEFUN([_LT_AC_TAGCONFIG])])
+m4_ifndef([AC_DISABLE_FAST_INSTALL],   [AC_DEFUN([AC_DISABLE_FAST_INSTALL])])
+m4_ifndef([_LT_AC_LANG_CXX],           [AC_DEFUN([_LT_AC_LANG_CXX])])
+m4_ifndef([_LT_AC_LANG_F77],           [AC_DEFUN([_LT_AC_LANG_F77])])
+m4_ifndef([_LT_AC_LANG_GCJ],           [AC_DEFUN([_LT_AC_LANG_GCJ])])
+m4_ifndef([AC_LIBTOOL_LANG_C_CONFIG],  [AC_DEFUN([AC_LIBTOOL_LANG_C_CONFIG])])
+m4_ifndef([_LT_AC_LANG_C_CONFIG],      [AC_DEFUN([_LT_AC_LANG_C_CONFIG])])
+m4_ifndef([AC_LIBTOOL_LANG_CXX_CONFIG],        [AC_DEFUN([AC_LIBTOOL_LANG_CXX_CONFIG])])
+m4_ifndef([_LT_AC_LANG_CXX_CONFIG],    [AC_DEFUN([_LT_AC_LANG_CXX_CONFIG])])
+m4_ifndef([AC_LIBTOOL_LANG_F77_CONFIG],        [AC_DEFUN([AC_LIBTOOL_LANG_F77_CONFIG])])
+m4_ifndef([_LT_AC_LANG_F77_CONFIG],    [AC_DEFUN([_LT_AC_LANG_F77_CONFIG])])
+m4_ifndef([AC_LIBTOOL_LANG_GCJ_CONFIG],        [AC_DEFUN([AC_LIBTOOL_LANG_GCJ_CONFIG])])
+m4_ifndef([_LT_AC_LANG_GCJ_CONFIG],    [AC_DEFUN([_LT_AC_LANG_GCJ_CONFIG])])
+m4_ifndef([AC_LIBTOOL_LANG_RC_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_RC_CONFIG])])
+m4_ifndef([_LT_AC_LANG_RC_CONFIG],     [AC_DEFUN([_LT_AC_LANG_RC_CONFIG])])
+m4_ifndef([AC_LIBTOOL_CONFIG],         [AC_DEFUN([AC_LIBTOOL_CONFIG])])
+m4_ifndef([_LT_AC_FILE_LTDLL_C],       [AC_DEFUN([_LT_AC_FILE_LTDLL_C])])
+m4_ifndef([_LT_REQUIRED_DARWIN_CHECKS],        [AC_DEFUN([_LT_REQUIRED_DARWIN_CHECKS])])
+m4_ifndef([_LT_AC_PROG_CXXCPP],                [AC_DEFUN([_LT_AC_PROG_CXXCPP])])
+m4_ifndef([_LT_PREPARE_SED_QUOTE_VARS],        [AC_DEFUN([_LT_PREPARE_SED_QUOTE_VARS])])
+m4_ifndef([_LT_PROG_ECHO_BACKSLASH],   [AC_DEFUN([_LT_PROG_ECHO_BACKSLASH])])
+m4_ifndef([_LT_PROG_F77],              [AC_DEFUN([_LT_PROG_F77])])
+m4_ifndef([_LT_PROG_FC],               [AC_DEFUN([_LT_PROG_FC])])
+m4_ifndef([_LT_PROG_CXX],              [AC_DEFUN([_LT_PROG_CXX])])
diff --git a/missing b/missing
new file mode 100755 (executable)
index 0000000..86a8fc3
--- /dev/null
+++ b/missing
@@ -0,0 +1,331 @@
+#! /bin/sh
+# Common stub for a few missing GNU programs while installing.
+
+scriptversion=2012-01-06.13; # UTC
+
+# Copyright (C) 1996, 1997, 1999, 2000, 2002, 2003, 2004, 2005, 2006,
+# 2008, 2009, 2010, 2011, 2012 Free Software Foundation, Inc.
+# Originally by Fran,cois Pinard <pinard@iro.umontreal.ca>, 1996.
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program that contains a
+# configuration script generated by Autoconf, you may include it under
+# the same distribution terms that you use for the rest of that program.
+
+if test $# -eq 0; then
+  echo 1>&2 "Try \`$0 --help' for more information"
+  exit 1
+fi
+
+run=:
+sed_output='s/.* --output[ =]\([^ ]*\).*/\1/p'
+sed_minuso='s/.* -o \([^ ]*\).*/\1/p'
+
+# In the cases where this matters, `missing' is being run in the
+# srcdir already.
+if test -f configure.ac; then
+  configure_ac=configure.ac
+else
+  configure_ac=configure.in
+fi
+
+msg="missing on your system"
+
+case $1 in
+--run)
+  # Try to run requested program, and just exit if it succeeds.
+  run=
+  shift
+  "$@" && exit 0
+  # Exit code 63 means version mismatch.  This often happens
+  # when the user try to use an ancient version of a tool on
+  # a file that requires a minimum version.  In this case we
+  # we should proceed has if the program had been absent, or
+  # if --run hadn't been passed.
+  if test $? = 63; then
+    run=:
+    msg="probably too old"
+  fi
+  ;;
+
+  -h|--h|--he|--hel|--help)
+    echo "\
+$0 [OPTION]... PROGRAM [ARGUMENT]...
+
+Handle \`PROGRAM [ARGUMENT]...' for when PROGRAM is missing, or return an
+error status if there is no known handling for PROGRAM.
+
+Options:
+  -h, --help      display this help and exit
+  -v, --version   output version information and exit
+  --run           try to run the given command, and emulate it if it fails
+
+Supported PROGRAM values:
+  aclocal      touch file \`aclocal.m4'
+  autoconf     touch file \`configure'
+  autoheader   touch file \`config.h.in'
+  autom4te     touch the output file, or create a stub one
+  automake     touch all \`Makefile.in' files
+  bison        create \`y.tab.[ch]', if possible, from existing .[ch]
+  flex         create \`lex.yy.c', if possible, from existing .c
+  help2man     touch the output file
+  lex          create \`lex.yy.c', if possible, from existing .c
+  makeinfo     touch the output file
+  yacc         create \`y.tab.[ch]', if possible, from existing .[ch]
+
+Version suffixes to PROGRAM as well as the prefixes \`gnu-', \`gnu', and
+\`g' are ignored when checking the name.
+
+Send bug reports to <bug-automake@gnu.org>."
+    exit $?
+    ;;
+
+  -v|--v|--ve|--ver|--vers|--versi|--versio|--version)
+    echo "missing $scriptversion (GNU Automake)"
+    exit $?
+    ;;
+
+  -*)
+    echo 1>&2 "$0: Unknown \`$1' option"
+    echo 1>&2 "Try \`$0 --help' for more information"
+    exit 1
+    ;;
+
+esac
+
+# normalize program name to check for.
+program=`echo "$1" | sed '
+  s/^gnu-//; t
+  s/^gnu//; t
+  s/^g//; t'`
+
+# Now exit if we have it, but it failed.  Also exit now if we
+# don't have it and --version was passed (most likely to detect
+# the program).  This is about non-GNU programs, so use $1 not
+# $program.
+case $1 in
+  lex*|yacc*)
+    # Not GNU programs, they don't have --version.
+    ;;
+
+  *)
+    if test -z "$run" && ($1 --version) > /dev/null 2>&1; then
+       # We have it, but it failed.
+       exit 1
+    elif test "x$2" = "x--version" || test "x$2" = "x--help"; then
+       # Could not run --version or --help.  This is probably someone
+       # running `$TOOL --version' or `$TOOL --help' to check whether
+       # $TOOL exists and not knowing $TOOL uses missing.
+       exit 1
+    fi
+    ;;
+esac
+
+# If it does not exist, or fails to run (possibly an outdated version),
+# try to emulate it.
+case $program in
+  aclocal*)
+    echo 1>&2 "\
+WARNING: \`$1' is $msg.  You should only need it if
+         you modified \`acinclude.m4' or \`${configure_ac}'.  You might want
+         to install the \`Automake' and \`Perl' packages.  Grab them from
+         any GNU archive site."
+    touch aclocal.m4
+    ;;
+
+  autoconf*)
+    echo 1>&2 "\
+WARNING: \`$1' is $msg.  You should only need it if
+         you modified \`${configure_ac}'.  You might want to install the
+         \`Autoconf' and \`GNU m4' packages.  Grab them from any GNU
+         archive site."
+    touch configure
+    ;;
+
+  autoheader*)
+    echo 1>&2 "\
+WARNING: \`$1' is $msg.  You should only need it if
+         you modified \`acconfig.h' or \`${configure_ac}'.  You might want
+         to install the \`Autoconf' and \`GNU m4' packages.  Grab them
+         from any GNU archive site."
+    files=`sed -n 's/^[ ]*A[CM]_CONFIG_HEADER(\([^)]*\)).*/\1/p' ${configure_ac}`
+    test -z "$files" && files="config.h"
+    touch_files=
+    for f in $files; do
+      case $f in
+      *:*) touch_files="$touch_files "`echo "$f" |
+                                      sed -e 's/^[^:]*://' -e 's/:.*//'`;;
+      *) touch_files="$touch_files $f.in";;
+      esac
+    done
+    touch $touch_files
+    ;;
+
+  automake*)
+    echo 1>&2 "\
+WARNING: \`$1' is $msg.  You should only need it if
+         you modified \`Makefile.am', \`acinclude.m4' or \`${configure_ac}'.
+         You might want to install the \`Automake' and \`Perl' packages.
+         Grab them from any GNU archive site."
+    find . -type f -name Makefile.am -print |
+          sed 's/\.am$/.in/' |
+          while read f; do touch "$f"; done
+    ;;
+
+  autom4te*)
+    echo 1>&2 "\
+WARNING: \`$1' is needed, but is $msg.
+         You might have modified some files without having the
+         proper tools for further handling them.
+         You can get \`$1' as part of \`Autoconf' from any GNU
+         archive site."
+
+    file=`echo "$*" | sed -n "$sed_output"`
+    test -z "$file" && file=`echo "$*" | sed -n "$sed_minuso"`
+    if test -f "$file"; then
+       touch $file
+    else
+       test -z "$file" || exec >$file
+       echo "#! /bin/sh"
+       echo "# Created by GNU Automake missing as a replacement of"
+       echo "#  $ $@"
+       echo "exit 0"
+       chmod +x $file
+       exit 1
+    fi
+    ;;
+
+  bison*|yacc*)
+    echo 1>&2 "\
+WARNING: \`$1' $msg.  You should only need it if
+         you modified a \`.y' file.  You may need the \`Bison' package
+         in order for those modifications to take effect.  You can get
+         \`Bison' from any GNU archive site."
+    rm -f y.tab.c y.tab.h
+    if test $# -ne 1; then
+        eval LASTARG=\${$#}
+       case $LASTARG in
+       *.y)
+           SRCFILE=`echo "$LASTARG" | sed 's/y$/c/'`
+           if test -f "$SRCFILE"; then
+                cp "$SRCFILE" y.tab.c
+           fi
+           SRCFILE=`echo "$LASTARG" | sed 's/y$/h/'`
+           if test -f "$SRCFILE"; then
+                cp "$SRCFILE" y.tab.h
+           fi
+         ;;
+       esac
+    fi
+    if test ! -f y.tab.h; then
+       echo >y.tab.h
+    fi
+    if test ! -f y.tab.c; then
+       echo 'main() { return 0; }' >y.tab.c
+    fi
+    ;;
+
+  lex*|flex*)
+    echo 1>&2 "\
+WARNING: \`$1' is $msg.  You should only need it if
+         you modified a \`.l' file.  You may need the \`Flex' package
+         in order for those modifications to take effect.  You can get
+         \`Flex' from any GNU archive site."
+    rm -f lex.yy.c
+    if test $# -ne 1; then
+        eval LASTARG=\${$#}
+       case $LASTARG in
+       *.l)
+           SRCFILE=`echo "$LASTARG" | sed 's/l$/c/'`
+           if test -f "$SRCFILE"; then
+                cp "$SRCFILE" lex.yy.c
+           fi
+         ;;
+       esac
+    fi
+    if test ! -f lex.yy.c; then
+       echo 'main() { return 0; }' >lex.yy.c
+    fi
+    ;;
+
+  help2man*)
+    echo 1>&2 "\
+WARNING: \`$1' is $msg.  You should only need it if
+        you modified a dependency of a manual page.  You may need the
+        \`Help2man' package in order for those modifications to take
+        effect.  You can get \`Help2man' from any GNU archive site."
+
+    file=`echo "$*" | sed -n "$sed_output"`
+    test -z "$file" && file=`echo "$*" | sed -n "$sed_minuso"`
+    if test -f "$file"; then
+       touch $file
+    else
+       test -z "$file" || exec >$file
+       echo ".ab help2man is required to generate this page"
+       exit $?
+    fi
+    ;;
+
+  makeinfo*)
+    echo 1>&2 "\
+WARNING: \`$1' is $msg.  You should only need it if
+         you modified a \`.texi' or \`.texinfo' file, or any other file
+         indirectly affecting the aspect of the manual.  The spurious
+         call might also be the consequence of using a buggy \`make' (AIX,
+         DU, IRIX).  You might want to install the \`Texinfo' package or
+         the \`GNU make' package.  Grab either from any GNU archive site."
+    # The file to touch is that specified with -o ...
+    file=`echo "$*" | sed -n "$sed_output"`
+    test -z "$file" && file=`echo "$*" | sed -n "$sed_minuso"`
+    if test -z "$file"; then
+      # ... or it is the one specified with @setfilename ...
+      infile=`echo "$*" | sed 's/.* \([^ ]*\) *$/\1/'`
+      file=`sed -n '
+       /^@setfilename/{
+         s/.* \([^ ]*\) *$/\1/
+         p
+         q
+       }' $infile`
+      # ... or it is derived from the source name (dir/f.texi becomes f.info)
+      test -z "$file" && file=`echo "$infile" | sed 's,.*/,,;s,.[^.]*$,,'`.info
+    fi
+    # If the file does not exist, the user really needs makeinfo;
+    # let's fail without touching anything.
+    test -f $file || exit 1
+    touch $file
+    ;;
+
+  *)
+    echo 1>&2 "\
+WARNING: \`$1' is needed, and is $msg.
+         You might have modified some files without having the
+         proper tools for further handling them.  Check the \`README' file,
+         it often tells you about the needed prerequisites for installing
+         this package.  You may also peek at any GNU archive site, in case
+         some other package would contain this missing \`$1' program."
+    exit 1
+    ;;
+esac
+
+exit 0
+
+# Local variables:
+# eval: (add-hook 'write-file-hooks 'time-stamp)
+# time-stamp-start: "scriptversion="
+# time-stamp-format: "%:y-%02m-%02d.%02H"
+# time-stamp-time-zone: "UTC"
+# time-stamp-end: "; # UTC"
+# End:
diff --git a/packaging/poppler-0.12.4-annot-appearance.patch b/packaging/poppler-0.12.4-annot-appearance.patch
new file mode 100644 (file)
index 0000000..2d5323d
--- /dev/null
@@ -0,0 +1,14 @@
+--- poppler-0.12.4/poppler/Annot.cc    2010-01-17 01:06:58.000000000 +0100
++++ poppler-0.12.4/poppler/Annot.cc    2010-03-04 12:50:56.000000000 +0100
+@@ -3173,7 +3173,10 @@ void AnnotWidget::generateFieldAppearanc
+   obj1.free();
+   // get the default appearance string
+-  if (Form::fieldLookup(field, "DA", &obj1)->isNull()) {
++  if (Form::fieldLookup(annot, "DA", &obj1)->isNull()) {
++    obj1.free();
++  }
++  if (!obj1.isString() && Form::fieldLookup(field, "DA", &obj1)->isNull()) {
+     obj1.free();
+     acroForm->lookup("DA", &obj1);
+   }
diff --git a/packaging/poppler-0.20.1-empty-password.patch b/packaging/poppler-0.20.1-empty-password.patch
new file mode 100644 (file)
index 0000000..26eb892
--- /dev/null
@@ -0,0 +1,27 @@
+commit a53e0641365608f832b455404f1ee584d278e0c4
+Author: Albert Astals Cid <aacid@kde.org>
+Date:   Sun Aug 5 15:07:16 2012 +0200
+
+    If NULL, NULL fails as password try EMPTY, EMPTY before failing
+    
+    Reviewed by Jose Aliste
+    Bug #3498
+
+diff --git a/poppler/SecurityHandler.cc b/poppler/SecurityHandler.cc
+index 00c4ae1..a48449a 100644
+--- a/poppler/SecurityHandler.cc
++++ b/poppler/SecurityHandler.cc
+@@ -105,7 +105,12 @@ GBool SecurityHandler::checkEncryption(GooString *ownerPassword,
+     }
+   }
+   if (!ok) {
+-    error(errCommandLine, -1, "Incorrect password");
++    if (!ownerPassword && !userPassword) {
++      GooString dummy;
++      return checkEncryption(&dummy, &dummy);
++    } else {
++      error(errCommandLine, -1, "Incorrect password");
++    }
+   }
+   return ok;
+ }
diff --git a/packaging/poppler-0.20.2-ps-conversion.patch b/packaging/poppler-0.20.2-ps-conversion.patch
new file mode 100644 (file)
index 0000000..0b52ff2
--- /dev/null
@@ -0,0 +1,37 @@
+commit ef7c2418e12d3e6a79f1d89a0051b005fadbc344
+Author: Thomas Freitag <Thomas.Freitag@alfa.de>
+Date:   Sat Jul 21 00:01:49 2012 +0200
+
+    Fix conversion to ps when having multiple strips
+    
+    Bug 51982
+
+diff --git a/poppler/PSOutputDev.cc b/poppler/PSOutputDev.cc
+index 540f74b..a01a4b3 100644
+--- a/poppler/PSOutputDev.cc
++++ b/poppler/PSOutputDev.cc
+@@ -3049,7 +3049,7 @@ GBool PSOutputDev::checkPageSlice(Page *page, double /*hDPI*/, double /*vDPI*/,
+   double m0, m1, m2, m3, m4, m5;
+   int nStripes, stripeH, stripeY;
+   int c, w, h, x, y, comp, i;
+-  int numComps;
++  int numComps, initialNumComps;
+ #endif
+   char hexBuf[32*2 + 2];      // 32 values X 2 chars/value + line ending + null
+   Guchar digit;
+@@ -3132,6 +3132,7 @@ GBool PSOutputDev::checkPageSlice(Page *page, double /*hDPI*/, double /*vDPI*/,
+   stripeH = (sliceH + nStripes - 1) / nStripes;
+   // render the stripes
++  initialNumComps = numComps;
+   for (stripeY = sliceY; stripeY < sliceH; stripeY += stripeH) {
+     // rasterize a stripe
+@@ -3151,6 +3152,7 @@ GBool PSOutputDev::checkPageSlice(Page *page, double /*hDPI*/, double /*vDPI*/,
+     // draw the rasterized image
+     bitmap = splashOut->getBitmap();
++    numComps = initialNumComps;
+     w = bitmap->getWidth();
+     h = bitmap->getHeight();
+     writePS("gsave\n");
diff --git a/packaging/poppler-0.20.2-scale-init.patch b/packaging/poppler-0.20.2-scale-init.patch
new file mode 100644 (file)
index 0000000..39bdfe4
--- /dev/null
@@ -0,0 +1,45 @@
+commit dcbc923bd3592a81876f84005fbaddcea18641cc
+Author: Thomas Freitag <Thomas.Freitag@alfa.de>
+Date:   Sun Jul 22 18:40:46 2012 +0200
+
+    Make sure xScale and yScale are always initialized
+    
+    Bug #52215
+
+diff --git a/poppler/PSOutputDev.cc b/poppler/PSOutputDev.cc
+index a01a4b3..e15c2e9 100644
+--- a/poppler/PSOutputDev.cc
++++ b/poppler/PSOutputDev.cc
+@@ -3521,6 +3521,7 @@ void PSOutputDev::startPage(int pageNum, GfxState *state) {
+     saveState(NULL);
+   }
++  xScale = yScale = 1;
+   switch (mode) {
+   case psModePSOrigPageSizes:
+@@ -3631,8 +3632,6 @@ void PSOutputDev::startPage(int pageNum, GfxState *state) {
+       } else {
+       yScale = xScale;
+       }
+-    } else {
+-      xScale = yScale = 1;
+     }
+     // deal with odd bounding boxes or clipping
+     if (clipLLX0 < clipURX0 && clipLLY0 < clipURY0) {
+@@ -3694,7 +3693,6 @@ void PSOutputDev::startPage(int pageNum, GfxState *state) {
+     if (tx != 0 || ty != 0) {
+       writePSFmt("{0:.6g} {1:.6g} translate\n", tx, ty);
+     }
+-    xScale = yScale = 1;
+     break;
+   case psModeForm:
+@@ -3702,7 +3700,6 @@ void PSOutputDev::startPage(int pageNum, GfxState *state) {
+     writePS("begin xpdf begin\n");
+     writePS("pdfStartPage\n");
+     tx = ty = 0;
+-    xScale = yScale = 1;
+     rotate = 0;
+     break;
+   }
diff --git a/packaging/poppler.spec b/packaging/poppler.spec
new file mode 100644 (file)
index 0000000..04e6f74
--- /dev/null
@@ -0,0 +1,1643 @@
+#
+# spec file for package poppler
+#
+# Copyright (c) 2012 SUSE LINUX Products GmbH, Nuernberg, Germany.
+#
+# All modifications and additions to the file contributed by third parties
+# remain the property of their copyright owners, unless otherwise agreed
+# upon. The license for this file, and modifications and additions to the
+# file, is the same license as for the pristine package itself (unless the
+# license for the pristine package is not an Open Source License, in which
+# case the license is the MIT License). An "Open Source License" is a
+# license that conforms to the Open Source Definition (Version 1.9)
+# published by the Open Source Initiative.
+
+# Please submit bugfixes or comments via http://bugs.opensuse.org/
+#
+
+%define _unpackaged_files_terminate_build 0
+
+Name:           poppler
+Version:        0.20.4
+Release:        8
+# Actual version of poppler-data:
+%define poppler_data_version 0.2.1
+%define poppler_soname 25
+%define poppler_cpp_soname 0
+%define poppler_glib_soname 8
+%define poppler_qt4_soname 4
+%define poppler_api 0.18
+%define poppler_apipkg 0_18
+Url:            http://poppler.freedesktop.org/
+Summary:        PDF Rendering Library
+License:        GPL-2.0+
+Group:          System/Libraries
+Source:         %{name}-%{version}.tar.gz
+
+BuildRequires:  gcc-c++
+#BuildRequires:  gobject-introspection-devel
+BuildRequires:  libjpeg-turbo-devel
+BuildRequires:  libtiff-devel
+BuildRequires:  curl-devel
+#BuildRequires:  libqt4-devel
+#BuildRequires:  openjpeg-devel
+#BuildRequires:  update-desktop-files
+BuildRequires:  zlib-devel
+BuildRequires:  pkgconfig(cairo) >= 1.10.0
+BuildRequires:  pkgconfig(cairo-ft) >= 1.10.0
+BuildRequires:  pkgconfig(cairo-pdf)
+BuildRequires:  pkgconfig(cairo-ps)
+BuildRequires:  pkgconfig(cairo-svg)
+BuildRequires:  pkgconfig(fontconfig)
+BuildRequires:  pkgconfig(freetype2)
+#BuildRequires:  pkgconfig(gobject-2.0) >= 2.18
+BuildRequires:  pkgconfig(lcms2)
+BuildRequires:  pkgconfig(libpng)
+BuildRoot:      %{_tmppath}/%{name}-%{version}-build
+
+%description
+Poppler is a PDF rendering library, forked from the xpdf PDF viewer
+developed by Derek Noonburg of Glyph and Cog, LLC.
+
+%package -n libpoppler%{poppler_soname}
+Summary:        PDF Rendering Library
+License:        GPL-2.0
+Group:          System/Libraries
+#Recommends:     poppler-data >= %{poppler_data_version}
+Provides:       poppler = %{version}
+Obsoletes:      poppler < %{version}
+
+%description -n libpoppler%{poppler_soname}
+Poppler is a PDF rendering library, forked from the xpdf PDF viewer
+developed by Derek Noonburg of Glyph and Cog, LLC.
+
+%package -n libpoppler-cpp%{poppler_cpp_soname}
+Summary:        PDF Rendering Library
+License:        GPL-2.0+
+Group:          System/Libraries
+Requires:       libpoppler%{poppler_soname} >= %{version}
+Provides:       poppler-cpp = %{version}
+Obsoletes:      poppler-cpp < %{version}
+
+%description -n libpoppler-cpp%{poppler_cpp_soname}
+Poppler is a PDF rendering library, forked from the xpdf PDF viewer
+developed by Derek Noonburg of Glyph and Cog, LLC.
+
+%package -n libpoppler-glib%{poppler_glib_soname}
+Summary:        PDF Rendering Library - GLib Wrapper
+License:        GPL-2.0+
+Group:          System/Libraries
+Requires:       libpoppler%{poppler_soname} >= %{version}
+Provides:       poppler-glib = %{version}
+Obsoletes:      poppler-glib < %{version}
+
+%description -n libpoppler-glib%{poppler_glib_soname}
+Poppler is a PDF rendering library, forked from the xpdf PDF viewer
+developed by Derek Noonburg of Glyph and Cog, LLC.
+
+#%package -n typelib-1_0-Poppler-%{poppler_apipkg}
+#Summary:        PDF Rendering Library - Introspection bindings
+#License:        GPL-2.0+
+#Group:          System/Libraries
+
+#%description -n typelib-1_0-Poppler-%{poppler_apipkg}
+#Poppler is a PDF rendering library, forked from the xpdf PDF viewer
+#developed by Derek Noonburg of Glyph and Cog, LLC.
+#
+#This package provides the GObject Introspection bindings for Poppler.
+
+#%package -n libpoppler-qt4-%{poppler_qt4_soname}
+#Summary:        PDF Rendering Library - Qt4 Wrapper
+#License:        GPL-2.0+
+#Group:          System/Libraries
+#Requires:       libpoppler%{poppler_soname} >= %{version}
+# Last appeared in OpenSUSE 10.3:
+#Provides:       poppler-qt4 = %{version}
+#Obsoletes:      poppler-qt4 < %{version}
+
+#%description -n libpoppler-qt4-%{poppler_qt4_soname}
+#Poppler is a PDF rendering library, forked from the xpdf PDF viewer
+#developed by Derek Noonburg of Glyph and Cog, LLC.
+
+%package tools
+Summary:        PDF Rendering Library Tools
+License:        GPL-2.0
+Group:          Productivity/Publishing/PDF
+Requires:       libpoppler%{poppler_soname} >= %{version}
+# last version in openSUSE 11.1/SLE11
+Provides:       poppler-tools = %{version}
+Provides:       xpdf-tools = 3.02
+Obsoletes:      xpdf-tools < 3.02
+Provides:       pdftools_any
+
+%description tools
+Poppler is a PDF rendering library, forked from the xpdf PDF viewer
+developed by Derek Noonburg of Glyph and Cog, LLC.
+
+%package -n libpoppler-devel
+Summary:        PDF rendering library
+License:        GPL-2.0
+Group:          Development/Libraries/C and C++
+Requires:       libpoppler%{poppler_soname} = %{version}
+Requires:       libstdc++-devel
+# Last appeared in OpenSUSE 10.3:
+Provides:       poppler-devel = %{version}
+Obsoletes:      poppler-devel < %{version}
+
+%description -n libpoppler-devel
+Poppler is a PDF rendering library, forked from the xpdf PDF viewer
+developed by Derek Noonburg of Glyph and Cog, LLC.
+
+%package -n libpoppler-glib-devel
+Summary:        PDF rendering library - GLib Wrapper
+License:        GPL-2.0
+Group:          Development/Libraries/C and C++
+Requires:       libpoppler-glib%{poppler_glib_soname} = %{version}
+#Requires:       typelib-1_0-Poppler-%{poppler_apipkg} = %{version}
+# Last appeared in OpenSUSE 10.3:
+Provides:       poppler-devel:%{_libdir}/libpoppler-glib.so
+# Last appeared in 11.4
+Provides:       libpoppler-doc = %{version}
+Obsoletes:      libpoppler-doc < %{version}
+# Last appeared in OpenSUSE 10.3:
+Provides:       poppler-doc = %{version}
+Obsoletes:      poppler-doc < %{version}
+
+%description -n libpoppler-glib-devel
+Poppler is a PDF rendering library, forked from the xpdf PDF viewer
+developed by Derek Noonburg of Glyph and Cog, LLC.
+
+%package -n libpoppler-cpp-devel
+Summary:        PDF rendering library - CPP Wrapper
+License:        GPL-2.0
+Group:          Development/Libraries/C and C++
+Requires:       libpoppler-cpp%{poppler_cpp_soname} = %{version}
+
+
+Provides:       poppler-cpp-devel = %{version}
+Obsoletes:      poppler-cpp-devel < %{version}
+
+
+
+
+%description -n libpoppler-cpp-devel
+Poppler is a PDF rendering library, forked from the xpdf PDF viewer
+developed by Derek Noonburg of Glyph and Cog, LLC.
+
+#%package -n libpoppler-qt4-devel
+#Summary:        PDF rendering library - Qt4 Wrapper
+#License:        GPL-2.0+
+#Group:          Development/Libraries/C and C++
+#Requires:       libpoppler-devel = %{version}
+#Requires:       libpoppler-qt4-%{poppler_qt4_soname} = %{version}
+#Requires:       libqt4-devel
+# Last appeared in OpenSUSE 10.3:
+#Provides:       poppler-devel:%{_libdir}/libpoppler-qt4.so
+
+#%description -n libpoppler-qt4-devel
+#Poppler is a PDF rendering library, forked from the xpdf PDF viewer
+#developed by Derek Noonburg of Glyph and Cog, LLC.
+
+%prep
+%setup -q
+
+%build
+#%define PREFIX /usr
+#%define DATAROOTDIR /usr/share
+#%define SYSCONFDIR /opt/etc
+#%define LOCALSTATEDIR /opt/var
+
+#--prefix=%{PREFIX} --localstatedir=%{LOCALSTATEDIR} --sysconfdir=%{SYSCONFDIR} --datarootdir=%{DATAROOTDIR} \
+
+%configure \
+    --prefix=/usr --localstatedir=/opt/var --sysconfdir=/opt/etc --datarootdir=/usr/share \
+    --enable-shared \
+    --enable-libjpeg --disable-libopenjpeg --enable-libtiff \
+    --enable-largefile \
+    --enable-zlib --enable-libcurl \
+    --enable-libpng \
+    --enable-cairo-output \
+    --enable-splash-output \
+    --enable-poppler-glib \
+    --enable-introspection=auto \
+    --disable-gtk-doc --disable-gtk-doc-html --disable-gtk-doc-pdf \
+    --disable-poppler-qt4 --enable-poppler-cpp \
+    --disable-gtk-test \
+    --enable-xpdf-headers \
+    --enable-compile-warnings=yes \
+    --enable-cms --without-x --with-font-configuration=fontconfig
+
+make %{?_smp_mflags}
+
+%install
+rm -rf %{buildroot}
+%makeinstall
+rm %{buildroot}%{_libdir}/*.la
+mkdir -p %{buildroot}/usr/share/license
+cp %{_builddir}/%{buildsubdir}/COPYING %{buildroot}/usr/share/license/libpoppler%{poppler_soname}
+cp %{_builddir}/%{buildsubdir}/COPYING %{buildroot}/usr/share/license/libpoppler-cpp%{poppler_cpp_soname}
+cp %{_builddir}/%{buildsubdir}/COPYING %{buildroot}/usr/share/license/libpoppler-glib%{poppler_glib_soname}
+cp %{_builddir}/%{buildsubdir}/COPYING %{buildroot}/usr/share/license/libpoppler-cpp-devel
+cp %{_builddir}/%{buildsubdir}/COPYING %{buildroot}/usr/share/license/%{name}-tools
+cp %{_builddir}/%{buildsubdir}/COPYING %{buildroot}/usr/share/license/libpoppler-devel
+cp %{_builddir}/%{buildsubdir}/COPYING %{buildroot}/usr/share/license/libpoppler-glib-devel
+
+%post -n libpoppler%{poppler_soname}
+/sbin/ldconfig
+
+%post -n libpoppler-glib%{poppler_glib_soname}
+/sbin/ldconfig
+
+#%post -n libpoppler-qt4-%{poppler_qt4_soname} -p /sbin/ldconfig
+
+%postun -n libpoppler%{poppler_soname}
+/sbin/ldconfig
+
+%postun -n libpoppler-glib%{poppler_glib_soname}
+/sbin/ldconfig
+
+%post -n libpoppler-cpp%{poppler_cpp_soname}
+/sbin/ldconfig
+
+%postun -n libpoppler-cpp%{poppler_cpp_soname}
+/sbin/ldconfig
+
+#%postun -n libpoppler-qt4-%{poppler_qt4_soname} -p /sbin/ldconfig
+
+#%files -n libpoppler-qt4-%{poppler_qt4_soname}
+#%defattr (-, root, root)
+#%{_libdir}/libpoppler-qt4.so.%{poppler_qt4_soname}*
+
+#%files -n libpoppler-qt4-devel
+#%defattr (-, root, root)
+#%dir %{_includedir}/poppler
+#%{_includedir}/poppler/qt4
+#%{_libdir}/libpoppler-qt4.so
+#%{_libdir}/pkgconfig/poppler-qt4.pc
+
+%files -n libpoppler%{poppler_soname}
+%manifest libpoppler.manifest
+%defattr (-, root, root)
+#%doc AUTHORS COPYING ChangeLog NEWS README README-XPDF TODO
+/usr/share/license/libpoppler%{poppler_soname}
+%{_libdir}/libpoppler.so.%{poppler_soname}*
+
+%files -n libpoppler-glib%{poppler_glib_soname}
+%manifest libpoppler-glib.manifest
+%defattr (-, root, root)
+/usr/share/license/libpoppler-glib%{poppler_glib_soname}
+%{_libdir}/libpoppler-glib.so.%{poppler_glib_soname}*
+
+#%files -n typelib-1_0-Poppler-%{poppler_apipkg}
+#%defattr (-, root, root)
+#%{_libdir}/girepository-1.0/Poppler-%{poppler_api}.typelib
+
+%files tools
+%manifest poppler-tools.manifest
+%defattr (-, root, root)
+/usr/share/license/%{name}-tools
+#%doc COPYING
+%{_bindir}/pdfdetach
+%{_bindir}/pdffonts
+%{_bindir}/pdfimages
+%{_bindir}/pdfinfo
+%{_bindir}/pdfseparate
+%{_bindir}/pdftocairo
+%{_bindir}/pdftohtml
+%{_bindir}/pdftoppm
+%{_bindir}/pdftops
+%{_bindir}/pdftotext
+%{_bindir}/pdfunite
+#%doc %{_mandir}/man1/*.*
+
+%files -n libpoppler-cpp%{poppler_cpp_soname}
+%manifest libpoppler-cpp.manifest
+%defattr(-, root, root)
+/usr/share/license/libpoppler-cpp%{poppler_cpp_soname}
+%{_libdir}/libpoppler-cpp.so.%{poppler_cpp_soname}*
+
+%files -n libpoppler-devel
+%defattr (-, root, root)
+%{_includedir}/poppler/*.h
+%{_includedir}/poppler/fofi/*.h
+%{_includedir}/poppler/goo/*.h
+%{_includedir}/poppler/splash/*.h
+%exclude %{_includedir}/poppler/cpp
+%exclude %{_includedir}/poppler/glib
+%{_libdir}/libpoppler.so
+%{_libdir}/libpoppler.a
+%exclude %{_libdir}/libpoppler-cpp.so
+%{_libdir}/pkgconfig/poppler.pc
+%{_libdir}/pkgconfig/poppler-cairo.pc
+%exclude %{_libdir}/pkgconfig/poppler-cpp.pc
+%{_libdir}/pkgconfig/poppler-splash.pc
+/usr/share/license/libpoppler-devel
+
+%files -n libpoppler-glib-devel
+%defattr (-, root, root)
+%{_includedir}/poppler/glib
+%{_libdir}/libpoppler-glib.so
+%{_libdir}/pkgconfig/poppler-glib.pc
+/usr/share/license/libpoppler-glib-devel
+%files -n libpoppler-cpp-devel
+%defattr (-, root, root)
+%{_includedir}/poppler/cpp
+%{_libdir}/libpoppler-cpp.so
+%{_libdir}/pkgconfig/poppler-cpp.pc
+/usr/share/license/libpoppler-cpp-devel
+
+#%{_datadir}/gir-1.0/Poppler-%{poppler_api}.gir
+#%doc %{_datadir}/gtk-doc/html/poppler/
+
+%changelog
+* Mon May 14 2012 vuntz@opensuse.org
+- Change pkgconfig(lcms) to pkgconfig(lcms2) since poppler 0.20 now
+  supports lcms2.
+* Thu May 10 2012 badshah400@gmail.com
+- Update to version 0.20.0:
+  + Core:
+  - Merge Xpdf 3.03
+  - Annotation improvements
+  - CairoOutputDev:
+    . Fix regression caused by mesh gradients
+    . Use correct userfont font bbox (fdo#48399)
+    . Fix paintTransparencyGroup when both mask and fill opacity
+    are required (fdo#48453)
+    . Ensure 0 width lines with stroke_adjust are aligned
+    . Only align stroke coords for horizontal and vertical lines
+    (fdo#48318)
+    . Fix stroke pattern with transparency group (fdo#48468)
+    . Update cairo mesh pattern to 1.12 api
+    . Fix some transparency issues (fdo#47739)
+    . Fix regression in some shadings
+    . Avoid setting huge clip area when printing (fdo#44002)
+    . Fix test for rotation (fdo#14619)
+    . Don't read inline image streams twice (fdo#45668)
+    . Set mask matrix before drawing an image with a mask
+    (fdo#40828)
+  - SplashOutputDev:
+    . Implement Overprint
+    . Fix slow rendering of pdf with a lot of image masks in
+    pattern colorspace
+    . Fix rendering of knockout groups (fdo#12185)
+    . Fix cmyk transfer bug (fdo#49341)
+  - PSOutputDev: Implement Overprint
+  - TextOutputDev: Don't add newline to last line extracted by
+    TextSelectionDumper (fdo#45955)
+  - Add support for lcms2
+  - More compatible file writing
+  - CJK font improvements
+  - ttc<->ttf fallback is expected for CJK font list in for
+    Windows (fdo#48046)
+  - Improve font matching for non embedded fonts
+  - Fix typos glyph names in truetype 'post' table standard mac
+    ordering
+  - Fix page labels to not have a null character at the end
+  - Fix logic error in Rendition parsing code (fdo#47063)
+  - Minor API changes to SplashOutputDev (fdo#46622)
+  - Expand glyph name ligatures such as "ff", "ffi" etc to
+    normal form (fdo#7002)
+  - Use an Identity CharCodeToUnicode for Adobe-Identity and
+    Adobe-UCS collections (fdo#35468)
+  - Update glyph names to Unicode values mapping (fdo#13131)
+  - Only use Hints table when there are no parse errors
+    (fdo#46459)
+  - Fix crash in JBIG2Stream decoding
+  - Fix crashes in broken documents
+  - Expose POPPLER_VERSION in poppler-config.h
+  - Reconstruct xref table if xref needed but missing
+    (fdo#40719)
+  - Fix getFullyQualifiedName with unicode field names
+    (fdo#49256)
+  - Bring back the Outputdev::begin/endMarkedContent virtuals
+  + Qt4:
+  - Annotations can now be modified/added/removed
+  - Form support improvements
+  - Support for LinkMovie object (fdo#40561)
+  - Support for Media Rendition
+  - Add the option of PSConverter creating EPS
+  - Convert propertly unicode encoded field qualified names
+  + Glib:
+  - Add poppler_fonts_iter_get_encoding
+  - Add poppler_fonts_iter_get_substitute_name
+  - Demo improvements
+  - Update gtk-doc makefile and m4 file
+  - Fix typos in documentation
+  - glib: Use delete[] to free array allocated with new[]
+    (fdo#48447)
+  + Utils:
+  - pdftohtml:
+    . Fix crash when the destination file does not exist
+    . Add producer and version to xml output
+    . Fix the mask inversion for PNG
+    . Extract mask images even if they are not JPEG (fdo#47186)
+    . Flip images if they need to (fdo#32340)
+    . Add possibilty of controlling word breaks percentage
+    (fdo#47022)
+    . Output images in -xml mode if no -i option is specified
+    . Get rid of static data members; merge duplicated jpeg
+    dumping code
+    . Be more consistent generating the outlines
+    . Generate outlines in pdftohtml in -xml mode (fdo#56993)
+    . Combine UTF16 surrogate pairs (fdo#46521)
+  - pdffonts:
+    . List the encoding of each font. (fdo#46888)
+    . Add -subst option to list the substitute font name and
+    filename
+  - pdfinfo:
+    . Report page rotation
+    . Decode utf-16 surrogate pairs
+  - pdftotext: Add missing section heading to man page
+  - pdftops: Fix -passfonts regression. (fdo#46744)
+  - pdftoppm: Allow one of -scale-to-[xy] = -1 to mean the
+    aspect ratio is to be preserved (fdo#43393)
+  - pdftocairo: Allow one of -scale-to-[xy] = -1 to mean the
+    aspect ratio is to be preserved
+  - pdfseparate: Produce PDF/X conformant pdf pages if the
+    original PDF was PDF/X conformant
+  - pdfimages: Add -list option to list all images (fdo#46066)
+  - Improve various manpages
+  + Build system:
+  - autotools:
+    . Do not append "-ansi" to CXXFLAG, if "-std=XXX" is already
+    specified.
+    . Do not clear FREETYPE_CFLAGS, FREETYPE_LIBS before
+    PKG_CHECK_MODULES()
+    . Copying graphics library CFLAGS to cpp frontend Makefile.am
+    . Print the cairo version required if not found (fdo#44619)
+    . Print the glib version required if not found
+    . Use pkgconfig to check for libopenjpeg (fdo#21789)
+    . Replace openjpeg compile test with a version test
+  - Minor cmake fixes
+  - Add a configuration option for the test data dir
+- Updated sonames for shared libraries in keeping with upstream
+  package changes: poppler_soname is now 25, poppler_qt4_soname is
+  now 4.
+* Sun Mar  4 2012 asterios.dramis@gmail.com
+- Enabled build requirement for openjpeg.
+* Thu Feb 16 2012 vuntz@opensuse.org
+- Update to version 0.18.4:
+  + core:
+  - CairoOutputDev:
+    . Restore temporary clip used in CairoOutputDev::fill when
+    painting a mask
+    . Ensure paintTransparencyGroup uses same ctm as
+    beginTransparencyGroup (fdo#29968).
+    . Use fabs when comparing the transformed line width
+    (fdo#43441).
+    . Remove unused variable in CairoFontEngine.cc (fdo#45442).
+  - SplashOutputDev: Do not use 50Kb of stack in
+    SplashXPath::addCurve (fdo#44905).
+  - JpegWriter: set image parameters after jpeg_set_defaults()
+    (fdo#45224).
+  - OpenJPEG decoder: Set
+    OPJ_DPARAMETERS_IGNORE_PCLR_CMAP_CDEF_FLAG if you have it
+    (fdo#43414).
+  - Lexer: convert integer to real when overflow occurs
+    (fdo#45605).
+  + glib:
+  - Various minor introspection and documentation improvements
+    (fdo#44790).
+  - Fix return values (fdo#45440, fdo#45441).
+  - gtk-doc improvements (fdo#45549).
+  - Introspection improvements (fdo#45455).
+  + qt4:
+  - remove non-existing 'qt' include dirs
+  + utils:
+  - HtmlOutputDev:
+    . Proper unicode support when dumping PDF outline
+    (fdo#45572).
+    . Fix leaks (fdo#45805).
+    . Close li tags in generated outlines (fdo#45807).
+  - man pages: fix minor issues with hypens and %%
+  + build system:
+  - automake: Link to lcms if needed
+  - automake: Fix build for builddir != srcdir (fdo#45434).
+  - automake: Improve moc detection when cross compiling
+  - Fix build with latest mingw-w64 headers (fdo#45407).
+* Mon Jan 16 2012 vuntz@opensuse.org
+- Update to version 0.18.3:
+  + core:
+  - Do not fail if we are trying to save a file with Encrypt that
+    has not been modified (kde#288045)
+  - Include .otf fonts when finding substitute fonts (fdo#44412)
+  - Fix stack overflow in PDFDoc::markObject() (fdo#44660)
+  - Include strings.h as we use memcpy (fdo#43558)
+  + utils:
+  - pdfunite: Properly initialize globalParams (fdo#44659)
+  - pdfseparate: Properly initialize globalParams
+  - Fix iniliazialization of GooString arguments
+  + build system:
+  - autoconf: Check for cairo-ft and other cairo backends
+    (fdo#43969)
+- Add explicit pkgconfig() BuildRequires, following upstream
+  changes, for: cairo-ft, cairo-pdf, cairo-ps, cairo-svg.
+* Mon Jan  9 2012 vuntz@opensuse.org
+- Split typelib file into typelib-1_0-Poppler-0_18 subpackage.
+- Add typelib-1_0-Poppler-0_18 Requires to libpoppler-glib-devel
+  subpackage.
+* Wed Jan  4 2012 vuntz@opensuse.org
+- Update to version 0.18.2:
+  + core:
+  - Fix leak in GooString when resizing to a smaller string
+  - Fix crash if failing to parse the colorspace (fdo#42793)
+  - Make GfxColorSpace::parse accept dicts
+  + qt4:
+  - Use PDFDoc(wchar_t *, ...) on Windows (fdo#35378)
+  - Add missing include
+  - Minor fixes in documentation
+  + utils:
+  - pdftocairo: Fix crash when rendering only odd/even pages in a
+    printing format
+  + build system:
+  - Fix pkg-config files
+* Tue Nov 15 2011 vuntz@opensuse.org
+- Update to version 0.18.1:
+  + core:
+  - PSOutputDev:
+    . Output PS that does not confuse libspectre
+    . Fix tiling pattern fill matrix (fdo#41374)
+    . Emit non repeating patterns just once
+    . Fix uncolored tiling patterns (fdo#41462)
+  - CairoOutputDev:
+    . Fix crash when using poppler_page_get_image()
+    . Fix various setSoftMask bugs (fdo#41005)
+  + utils:
+  - pdftocairo:
+    . Flush/close files one we are done using them
+    . Compile on Windows
+  + build system:
+  - CMake:
+    . Fix typo in option description
+    . Correctly include fontconfig include dir
+  - Remove poppler-cairo dependency from poppler-glib pkg-config
+    file
+  + qt4:
+  - Minor fixes in documentation
+- Bump poppler_soname to 19, following library soversion change.
+* Tue Sep 27 2011 vuntz@opensuse.org
+- Update to version 0.18.0:
+  + core:
+  - Fix small memory leak when dealing with marked content
+  - Remove DCTStream::getRawStream since Stream::getNextStream
+    does the same
+  + utils:
+  - Rename pdfmerge to pdfunite
+  - Rename pdfextract to pdfseparate
+  - pdfseparate: Complain if %%d is not present and it should
+  - Add pdfseparate and pdfunite man pages
+  + build system:
+  - Minor cleanup in regarding removed qt code
+- Bump poppler_soname to 18, following upstream soversion change.
+* Fri Sep 16 2011 vuntz@opensuse.org
+- Update to version 0.17.4:
+  + core:
+  - SplashOutputDev: Compile when defining USE_FIXEDPOINT
+  - PNGWriter: Compile with libpng >= 1.5.0
+- Bump poppler_api define since the typelib file is now versioned
+  0.18.
+* Sat Sep 10 2011 vuntz@opensuse.org
+- Update to version 0.17.3:
+  + core:
+  - PSOutputDev:
+    . Use Patterns for tiling fill when PS level >= 2
+    . Avoid using /PatternType if only one instance of the
+    pattern is used
+    . Add poppler version as comment in the file
+  - CairoOutputDev:
+    . Set mime data for soft masked images (fdo#40192)
+    . Assume printer pixel size is 1/600" when stroking 0 width
+    lines (fdo#39067)
+    . Use cairo_show_text_glyphs() when printing
+    . Fix stroke patterns (fdo#11719)
+    . Fix unique id mime data
+    . Fix stroking of very thin lines
+    . Align strokes when Stroke Adjust is true and line
+    width <= 1 (fdo#4536)
+  - TextOutputDev: Add TextFontInfo::matches()
+  - Improve PNGWriter
+  - Rework writing of PDF files
+  + utils:
+  - Introduce pdftocairo: utility for creating
+    png/jpeg/ps/eps/pdf/svg using CairoOutputDev
+  - Introduce pdfextract: utility to extract PDF pages
+  - Introduce pdfmerge: utility to merge PDF files
+  - Fix compilation warning
+  - pdftohtml: Support text rotation (fdo#38586)
+  - Update SEE ALSO section of man pages
+  + glib:
+  - Add poppler_page_get_text_attributes()
+  - Add text attributes information to text demo
+  + qt4:
+  - Add a way to get the fully qualified name of a FormField
+  - Minor documentation improvements
+- Changes from version 0.17.2:
+  + core:
+  - EmbeddedFile improvements
+  - Don't gmalloc(-1) upon ftell failure
+  - Fix missing content in some pages (fdo#39637)
+  - Improve selection of CJK fonts (fdo#36474)
+  - SplashOutputDev:
+    . Implement overprint
+    . Render dots for 0 length dashed lines (fdo#34150)
+    . Fix bad memory access when not using antialias (fdo#37189)
+  - PSOutputDev:
+    . Make level2sep and level3sep write cmyk instead of rgb
+    . Make level1sep, level2sep and level3sep write gray instead
+    of rgb for gray images
+  - Fix numerical overflow in libopenjpeg JPXStream (fdo#39361)
+  - Fix crash on truncated JPEG/DCT stream (fdo#36693)
+  - Make sure the dict is a page dict (fdo#35925, fdo#39072)
+  - Fix calculation of startXRefPos
+  - Handle missing startxref properly (fdo#38209)
+  - Parse the "Medium" modifier when asking fontconfig for a font
+  - Header cleanup
+  - Include cleanup
+  - Define cleanup
+  + glib:
+  - Add missing permissions flags to PopplerPermissions
+  - Add missing permission flags to info demo
+  - Update gtk-doc.make
+  - Add poppler_document_get_n_attachments()
+  + utils:
+  - pdftohtml:
+    . Fix encoding of PDF document metadata (fdo#37900)
+    . Fix vertical spacing issues  (fdo#38019)
+  - pdftotext: Fix -htmlmeta to correctly output U+2019 in PDF
+    metadata (fdo#37900)
+  - pdftoppm: Implement overprint
+  + qt4:
+  - Rework EmbeddedFile internals
+  - Fix possible crash in test
+- Changes from version 0.17.1:
+  + core:
+  - Rework the way form fields tree is built
+  - Cleanup unused parameters/variables
+  + glib:
+  - Add JavaScript actions
+  - demo: Show javascript actions in actions view
+  + qt4:
+  - tests: Turn some assignments to bool into QVERIFY checks
+- Changes from version 0.17.0:
+  + core:
+  - Splash:
+    . Implement tiling patterns
+    . Support slight hinting
+    . Radial shading improvements
+    . General speed improvements
+  - Arthur: Add Hinting API
+  - Cairo:
+    . Implement Type 4,5,6,7 shadings using cairo mesh gradients
+    . Use the new cairo unique id to set the surface id when
+    printing
+  - PS:
+    . Add PS level1 non standard binary output option
+    . Allow setting the rasterization resolution
+  - Form support improvements
+  - Annotation support improvements
+  - General speed improvements
+  - Add support for handling ViewerPreferences
+  - Remove abiword output device
+  + utils:
+  - pdftoppm:
+    . Add -singlefile option (fdo#32025)
+    . Add TIFF output format support (fdo#32027)
+  - pdftops:
+    . Add PS level1 non standard binary output option
+    . Allow setting the rasterization resolution
+  - pdftoabw has been removed
+  + glib:
+  - Add poppler_form_field_get_action() (fdo#33174)
+  - Remove GDK API
+  - Remove test-poppler-glib
+  - demo:
+    . Add a tooltip with current selected character in text demo
+    . Show the activation action of form fields if there's one
+  + cpp:
+  - Add TIFF output possibility
+  - Add PNM output possibility
+  + qt4:
+  - Support slight hinting
+  - Form support improvements
+  + qt3:
+  - The Qt3 frontend has been removed
+  + tests:
+  - Merge splash and cairo tests into a single gtk-test tool
+- Drop poppler-pdftoabw-overflow.patch: the abiword output device
+  got removed.
+- Drop poppler-0.16.5-disable-demo.patch: we don't need it anymore,
+  as we won't build the test program anyway.
+- Bump the soname macros to follow upstream soversion changes.
+- Add libtiff-devel BuildRequires: new dependency.
+- Remove unneeded gtk-doc, gtk2-devel and libxml2-devel
+  BuildRequires (GTK+ is only needed for a test tool).
+- Remove pkg-config BuildRequires: by depending on glib, we know it
+  will be there.
+- Remove qt3-devel BuildReqiures: the Qt3 frontend has been
+  removed.
+- Move to pkgconfig()-style BuildRequires:
+  + Old ones: liblcms-devel, libpng-devel.
+  + New ones: lcms, libpng.
+- Add pkgconfig() BuildRequires that were brought in by gtk2-devel
+  before: cairo, fontconfig, freetype2, gobject-2.0.
+- Remove cairo-devel and libjpeg-devel Requires from
+  libpoppler-devel: those are not needed.
+- Remove libpoppler-devel, cairo-devel, glib2-devel and gtk2-devel
+  Requires from libpoppler-glib-devel: the right Requires will
+  automatically be added the pkgconfig() way.
+- Drop libpoppler-qt and libpoppler-qt3-devel subpackages as the
+  Qt3 frontend has been removed.
+- Merge libpoppler-doc subpackage with libpoppler-glib-devel, as
+  the documentation is only for the glib API. Add appropriate
+  Provides/Obsoletes, and move the Provides/Obsoletes that
+  libpoppler-doc had too.
+- Remove call to autoreconf: it was only needed for one of the
+  patches.
+- Pass --disable-gtk-test: don't bother building the GTK+ test
+  program.
+* Fri Aug 12 2011 dmueller@suse.de
+- remove requires on libdrm-devel
+* Fri May 20 2011 idonmez@novell.com
+- Add poppler-0.16.5-disable-demo.patch: disable glib demo, its
+  using deprecated GTK+ functions
+* Mon May  2 2011 vuntz@opensuse.org
+- Update to version 0.16.5:
+  + core:
+  - Fix a memleak in AnnotScreen::initialize
+  - Properly initialize pageObjectNum to 0 (fdo#35925)
+  + utils:
+  - pdftotext: bbox coordinates are relative to MediaBox size,
+    not CropBox size
+  + cpp:
+  - Fix page_transition::operator=
+- Changes from version 0.16.4:
+  + core:
+  - Small improvements in Annot parsing
+  + glib:
+  - Add g_return macros to make sure index is correct in form
+    field choice methods
+  - Fix a crash when a choice form field has no items selected in
+    glib-demo
+  + utils:
+  - Small fixes to the pdftohtml manpage
+  - Fix copyright years
+  + qt4:
+  - Fix caption of push button fields
+- Changes from version 0.16.3:
+  + core:
+  - Increase precision in PS output device
+  - Workaround bug when converting pdf to ps with level1
+    (fdo#31926)
+  - Fix crash in Splash output device in some broken pdf
+  - Fix infinite loop in some broken files
+  - Fix rendering of some substituted fonts (fdo#34522)
+  - Do not ask Freetype for 0x0 fonts in Splash output device
+    (fdo#34602)
+  - Don't assume y1 > y3 for points of a highlight annotation
+    (bgo#643028)
+  - Handle fontCIDType2OT when creating freetype font in Cairo
+    output device (bgo#643273)
+  - Fix crash in some pdf that use ICC color space (fdo#34357)
+  + glib:
+  - Don't use an uninitialized local variable in demo
+  - Add some introspection markers
+  + qt4:
+  - Fix crash regression in unicodeToQString (again)
+  + utils:
+  - pdftotext: Do not crash when using -bbox
+- Ship COPYING in poppler-tools subpackage. Fixes bnc#678887.
+- Update poppler_soname as the soname has changed again.
+* Wed Feb 23 2011 fcrozat@novell.com
+- Update to version 0.16.2:
+  + Core:
+  - Fix text extraction for some files
+  + qt4:
+  - Fix crash regression in unicodeToQString
+- Changes from version 0.16.1:
+  + Core:
+  - Fix colorspace issues in the Cairo backend (fdo#32746)
+  - Remove declaration of function without implementation
+  - Do not crash in case jpeg_create_decompress fails (fdo#32890)
+  - Fix variable access mismatch (fdo#33063)
+  - Fix converting some pdf to ps with -level1sep (fdo#32365)
+  - Fix line selection, dont check y for Line selections
+  - Include zlib header in PNGWriter.cc
+  - Fix memleaks
+  + glib:
+  - Use NULL instead of FALSE for functions returning a pointer
+  - Fix memory leak in poppler_page_get_text_layout() for pages
+    with no text
+  + qt4:
+  - Fix unicodeToQString() to correctly decode the Unicode
+    sequence
+- Changes from version 0.16.0:
+  + core:
+  - Improve the correctness of radial shadings (fdo#32349)
+  - Adapt the zlib-based FlateStream code to API changes
+    (fdo#32065)
+  - Make PreScanOutputDev be less agressive when deciding to
+    rasterize (fdo#30107)
+  - Fix some warnings in newer gcc in Splash backend
+  - Fix the preliminary bbox/clip calculation in Splash backend
+  - Use A1 instead of A8 for imagemask in the Cairo backend
+  + utils:
+  - Do not return 99 (or 1) with -h, -v and -printenc (fdo#32149)
+  + build system:
+  - Add more warning flags to the default gcc builds
+  - Enable GObject introspection support in the cmake build system
+- Changes from version 0.15.3:
+  + core:
+  - Improve rendering of radial shadings
+  - Open a broken file (fdo#31861)
+  - Correct parsing of linearization table (fdo#31627)
+  - Find fonts inside patterns (fdo#31948)
+  - Use a std::vector<char> instead of a var-length-array of
+    chars
+  - Fix crashes in broken files
+  - Use sets instead of arrays for looking for duplicate fonts
+  + cpp:
+  - Include correction
+  + utils:
+  - pdffonts: Remove duplicated code
+- Changes from version 0.15.2:
+  + core:
+  - Improve shadings and antialias in the Splash backend
+    (fdo#30436)
+  - Linearization improvements
+  - Small improvements to the Arthur backend
+  - Fix calculation of the size of some pages (fdo#30784)
+  - Fix crashes in broken documents
+  + qt4:
+  - Add Page::renderToPainter() method
+  - Add setDebugErrorFunction() method
+  + cpp:
+  - Add the hability to render pages to an image
+  + utils:
+  - Add -p flag to pdfimages
+- Changes from version 0.15.1:
+  + core:
+  - Consider render value when colorizing text (fdo#2807)
+  - Improve rendering of Shading Type 6 and 7
+  - Improve dict lookup speed for big dicts
+  - Fix multiple crashes in malformed PDF files
+  - Fix memory leak in in malformed PDF files
+  - Fix memory leak in the Catalog names
+  - Fix uninitialized uses on DCTScanInfo
+  - Fix a crash when drawing square/circle annots without a
+    border (fdo#30580)
+  - Only clip boxes to mediabox if we are at the page level
+    (fdo#30784)
+  - Do not omit the notdef glyph in the Splash backend
+  - Fix a crash when redering documents with invalid type 3
+    fonts in the Cairo backend
+  - Form improvements
+  - Add a method to get the PDF file identifier
+  + glib:
+  - Add more printing options to the API
+  - Add a method to get the PDF file identifier
+  - Add accessor for all PopplerDocument properties
+  - Form improvements
+  - Documentation improvements
+  - Improvements to the demo
+  + qt4:
+  - Add a callback to know which page has been printed
+  - Add a method to get the PDF file identifier
+  - Optimize GooString to QString conversion
+  - Update Doxyfile (enables .qch file for assistant)
+  + utils:
+  - pdftohtml: Add -s option to generate a single HTML page
+  - pdftotext: Add -bbox option
+  + cpp:
+  - Add the possibility of loading a document from raw data
+  - Add a method to get the PDF file identifier
+  - Improve Unicode to ustring conversion
+  - Documentation improvements
+  - Update Doxyfile
+- Changes from version 0.15.0:
+  + core:
+  - Remove exception support
+  - Improve creation of Annotations
+  - Fix failure to parse PDF with damaged internal structure.
+    (fdo#29189, fdo#3870)
+  - Add a way to access the raw text of a page
+  - Speed improvements when reading multiple characters from a
+    given Stream
+  - Speed improvements in the Splash backend
+  - Speed improvement in gray color space calculations
+  - Speed improvement in ICC color space calculations
+  - Speed improvement when reading some fonts
+  - Make GBool a bool instead of an int
+  + glib:
+  - Add GObject introspection support
+  - Improve creation of Annotations
+  - Add a way to get the coordinates of each character of a page
+  - Add a way to get the page label
+  - Documentation improvements
+  - Support password protected documents in the demo
+  - Support for selection in the demo
+  - Support for adding annotationss in the demo
+  + qt4:
+  - Add a way to access the raw text of a page
+  - Recognize "Print" as named action
+  - Documentation improvements
+  + build system:
+  - Improvements when build the glib frontend with CMake
+  + utils:
+  - pdftohtml: Use splash instead of external gs invocation to
+    render the background
+  - pdftohtml: Let the user specify the resolution of the
+    background. (fdo#29551)
+  + cpp:
+  - Add a way to access the raw text of a page
+- Changes from version 0.14.3:
+  + core:
+  - Tell Windows we are writing/reading binary data from
+    stdout/stdio (fdo#29329)
+  - Fix crash when parsing some Movie elements (kde#249586)
+- Bump soname for glib / cpp / qt / qt4 libraries
+- Add gobject-introspection-devel BuildRequires to enable
+  introspection support.
+* Thu Nov 11 2010 coolo@novell.com
+- own parent directories for poppler-qt
+* Sat Oct  9 2010 vuntz@opensuse.org
+- Update to version 0.14.4:
+  + core:
+  - Set initial state of optional content groups based on
+    BaseState field
+  - Fix multiple crashes in malformed PDF files
+  - Fix memory leak in in malformed PDF files
+  - Fix memory leak in the Catalog names
+  - Fix uninitialized uses on DCTScanInfo
+  - Fix a crash when drawing square/circle annots without a
+    border (fdo#30580)
+  + glib:
+  - Fix layers array generation when it contains multiple arrays
+  - Fix a crash when building layer actions (fdo#30106)
+* Sat Sep 11 2010 vuntz@opensuse.org
+- Update to version 0.14.3:
+  + core:
+  - Tell Windows we are writing/reading binary data from
+    stdout/stdio (bgo#29329)
+  - Fix crash when parsing some Movie elements (kde#249586)
+* Thu Aug 19 2010 vuntz@opensuse.org
+- Update to version 0.14.2:
+  + core:
+  - Fix rendering of some documents involving tilingPatternFill
+    in the cairo output device
+  - Improve rendering of some annotations
+  - Handle ColorTransform in DCT streams when using libjpeg
+    (fdo#28873)
+  - Fix crash in the ps output device in some files (kde#246269)
+  - Fix crash in some malformed files (fdo#28842)
+  + build system:
+  - Improve build on windows
+  - Add uninstalled .pc file support when using autoconf
+  + glib:
+  - Fix a crash when a layer doesn't have a name (fdo#28842)
+  + utils:
+  - Fix padding of names in pdftoppm
+- Bump poppler_soname from 6 to 7.
+* Thu Jul 15 2010 dimstar@opensuse.org
+- Update to version 0.14.1:
+  + Core:
+  - fdo#26759: Add ObjectStream caching, makes opening some files
+    ten times faster
+  - fdo#28480: Fix crash when writing to negative coordinates
+  - Check objects are the type we want them to be when parsing
+    GfxICCBasedColorSpace
+  - Optimize Splash::compositeBackground
+  - Optimize color space calculations by using sqrt instead of
+    pow 0.5
+  - Fix crash in JBIG2Stream with malformed documents
+  + build system:
+  - Make sure we ship two needed cmake files
+  - Do not distribute glib/poppler-features.h and
+    poppler/poppler-config.h
+  - Improve compilation with Sun Studio
+  - Fix linking of the cpp frontend when using autotools
+  + glib:
+  - fdo#28588: Fix links/annots area for some documents
+  - fdo#27927: Fix poppler_page_find_tex() when called more than
+    once
+  + utils:
+  - Add -cropbox to pdftoppm manual
+* Thu May 20 2010 coolo@novell.com
+- fix last change
+* Mon May 17 2010 coolo@novell.com
+- Split out qt bindings in a spec file, to speed up build.
+* Thu Dec 24 2009 vuntz@opensuse.org
+- Update to version 0.12.3:
+  + core:
+  - Be more lenient with /Decode key on images. fdo#17439
+  - Correctly initialize fileName in LinkGoToR. fdo#25221
+  - Improve the reconstruction of the XRef for broken files
+  - [Cairo backend] Do not crash on malformed files. fdo#24575
+  - Accept Fontname if FontName is not present. kde#217013
+  - Make PSOutputDev code a bit more resilient
+  - Fix writing of null objects. fdo#25465
+  - [Cairo backend] Fix crash in some documents. bgo#603934
+  - Correctly initialize profileCommands in Gfx constructor
+  + build system:
+  - Check for openjpeg in the C++ part as it uses bool in the
+    header. fdo#25103
+* Fri Dec 18 2009 jengelh@medozas.de
+- Package documentation as noarch
+* Sat Dec  5 2009 vuntz@opensuse.org
+- Update to version 0.12.2:
+  + core:
+  - Fix a memory leak when converting to PostScript
+  - Fix crash when reading a font fails. fdo#24525
+  - Make the ICC cache per page instead of global. fdo#24686
+  - Do not accept negative interval lengths in the page labels
+    tree. fdo#24721
+  - Do not crash on files Aspect of Movie objects are reals
+    instead of integers. fdo#24733
+  - Do not render patterns when using CairoImageOutputDev
+  - Allow Transitions dictionary to be a Ref
+  - Do not crash if jpeg_start_decompress fails. kde#214317
+  + glib:
+  - Fix CVE-2009-3607
+  + qt4:
+  - Use '.' in the annotations XML instead of the decimal
+    separator of the current locale
+- Drop poppler-CVE-2009-3607.patch: fixed upstream.
+- Remove poppler_spec-prepare.sh, and instead integrate its code in
+  pre_checkin.sh.
+* Fri Nov 13 2009 vuntz@opensuse.org
+- Update to version 0.12.1:
+  + core:
+  - Fix compilation on some compilers
+  - Only initialize the font list once in Windows32/MSVC
+  - Do not crash on fonts without CharCodeToUnicode. fdo#24036
+  - Fix regression due to not setting LC_NUMERIC anymore
+  - Improve realibility for Streams with broken Length. fdo#6841
+  - Write the Info into the trailer dict if there is one.
+    fdo#24091
+  - Do not crash when saving files that come from a stream
+    without name. fdo#24090
+  - Improve relability of the save function
+  - Fix the Length value if it was wrong when saving
+  - Fix includes for those using internal headers
+  - Rework how hinting is used in the splash backend. It is
+    disabled by default now
+  - fix constructor of DCTStream when using internal decoder
+  - Security fixes based xpdf 3.02pl4
+  + qt4:
+  - Add the possibility of setting wheter to use or not font
+    hinting
+  - Add a way for converters to return more exact errors they had
+    when converting
+  - Check the document is not locked when converting to PS
+  + build system:
+  - Compile on Cygwin
+  - Use _WIN32 instead of WIN32. Bug #24259
+  - Add the possibility to pass LIB_SUFFIX when using CMake
+- Drop poppler-change-hinting-flags.patch: fixed upstream.
+- Drop poppler-CVE-2009-3608.patch: fixed upstream.
+- Update description of the packages to be less verbose without
+  being less informative.
+- Fix self-obsoletion rpmlint warnings: when we provide a version
+  of a package, don't obsolete <= this version, but <.
+* Tue Oct 27 2009 bili@novell.com
+- Help Vincent submit these patches.
+- Add poppler-CVE-2009-3607.patch: fix an integer overflow,
+  bnc#546393, swampid#27127.
+- Add poppler-CVE-2009-3608.patch: fix an integer overflow,
+  bnc#543090, swampid#27127.
+- Add poppler-pdftoabw-overflow.patch to fix string overflows in
+  pdftoabw, bnc#537171, swampid#27127.
+* Thu Oct  1 2009 wstephenson@suse.de
+- Add patch to disable autohinting in the Splash backend, except
+  when the bytecode interpreter is enabled, for consistency with
+  other backends and better results
+* Wed Sep  9 2009 vuntz@opensuse.org
+- Update to version 0.12.0:
+  + core:
+  - Fix printf format security warnings
+  - Improve rendering of radial shadings. fdo#20238
+  - Better fallback when there's a font type mismatch. fdo#17252
+  - Do not crash on attachments without data stream. fdo#10386
+  - Fix infinite loop in JBIG2Decoder. fdo#23025
+  + build system:
+  - Minimizes pkg-config dependencies for Qt frontends
+  - Add automake 1.11 support
+  - Use the newest automake found and not the oldest
+  - Support AM_SILENT_RULES when using automake 1.11
+  + utils:
+  - Add common options to pdftoabw
+* Tue Aug 25 2009 vuntz@novell.com
+- Update to version 0.11.3:
+  + core:
+  - Optimization in the Cairo renderer for some fonts
+  - Do not apply masks when fill color space mode is csPattern in
+    the Cairo renderer. fdo#22216
+  - Check for overflow when parsing integers. fdo#23078
+  - Do not save the font file twice for FreeType fonts in the
+    Cairo renderer. fdo#20491
+  - Use current fill_opacity when drawing images in the Cairo renderer
+  - Fix alpha rendering in some files in the Splash renderer.
+    fdo#22143, fdo#22152
+  - Implement tiling patterns in the Cairo renderer
+  - When converting a cm matrix to PS write 4 significant digits
+    for numbers < 1 not 4 decimals. fdo#23332
+  - Fix changing of locale, now poppler no longer changes LC_NUMERIC to "C"
+  - Return PDF version as two integers instead of as a double
+  + Qt4:
+  - Addition of the Color Management API
+  - Small fix to documentation
+  - Fix backwards text search
+  + utils:
+  - Add the -png flag to pdftoppm to output to PNG
+* Mon Aug  3 2009 vuntz@novell.com
+- Update to version 0.11.2:
+  + core:
+  - Make DecryptStream return sane values for getPos(). fdo#19706
+  - Fix bug when printing pdf with multiple page sizes in duplex
+    mode
+  - Initilize AnnotColot properly when the Array is not correct
+  - Fix crash on some files with forms. fdo#22485
+  - Fix crash in files with invalid embedded files. fdo#22551
+  - Improve FileSpec attribute parsing
+  - Cairo output device improvements. fdo#10942, fdo#18017,
+    fdo#14160
+  - Implement blend modes in cairo backend
+  - Handle fontType1COT fonts in CairoFontEngine
+  - Fix generation of PS for some files. fdo#18908
+  - Don't use byte_lookup table when color space doesn't support
+    getLine methods. fdo#11027
+  - Fix rendering of PDF files with malformed patterns. fdo#22835
+  - Add the possibility of disabling font substitution in
+    pdftops. fdo#23030
+  - Fix some radio buttons not being detected as such
+  + glib:
+  - Improvements to the demo
+  + Qt4:
+  - Improvements to the demo
+  + build system:
+  - Use gtkbuilder rather than libglade for some tests
+  + utils:
+  - Fix bug with noCrop parameter in pdftops
+* Tue Jul 28 2009 coolo@novell.com
+- disable build of gtk-doc subpackage, the auto* macros are broken
+  (may be fixed in next beta)
+* Tue Jul 28 2009 coolo@novell.com
+- update to version 0.11.1:
+  core:
+  * Support colorizing text in pattern colorspace. Bug #19670 and #19994
+  * Add the possibility of forcing no hinting of fonts in the Splash backend
+  * Support multiple page sizes when converting to PS. Bug #19777
+  * Also tokens with leading 00 when parsing the char to unicode map. Bug #22025
+  * Improvements of rendering speed in documents using PS transformations a lot. Bug #21562
+  * More work on Annotations support
+  * Use Interpolate flag to decide whether applying image interpolation during rendering. Bug #9860
+  * Handle Streams in CMap definitions. Bug #22334
+  * Fix pdftops crash on file from KDE bug #174899
+  * Fix PS generation in some files. Bug #20420
+  * Do not create the GfxColorTransform if the lcms could not be created. Bug #20108
+  * Give an error when using level1sep in pdftops without having CMYK support. Bug #22026
+  * Kill support for specifying extension in openTmpFile. Bug #21713
+  glib:
+  * Add poppler_annot_markup_has_popup()
+  * Hyphenate UTF-8 and UTF-16BE. Bug #21953
+  * Use g_strerror instead of strerror. Bug #22095
+  * Fix a crash when a destination points to an invalid page
+  * Improvements to the demo
+  Qt4:
+  * Add LinkDestination::destinationName()
+  * Do not try to resolve named destinations for GoTo links pointing to external documents
+  * Add Page::thumbnail()
+* Thu May 21 2009 pgajdos@suse.cz
+- added GlobalParams::forceNoFTAutoHinting()
+  - no-hinting.patch
+  + force-no-hinting.patch
+- this patch was upstreamed and should appear in next release
+* Sun May 17 2009 vuntz@novell.com
+- Update to version 0.11.0:
+  + core:
+  - Add initial support for color management
+  - Remove case-insensitive matching of filenames in PDFDoc
+    constructor
+  - Fix extraction of some ActualText content
+  - More work on Annotations support
+  - Improve font rendering in Cairo output device
+  - Fix bug in cairo backend with nested masks
+  - Fix cairo luminosity smask rendering
+  - Add optionally text support to Cairo output device
+  - Add the possibility of setting the datadir on runtime
+  - Return an error code instead of a boolean when saving
+  - Make the font scanner more versatile
+  - Small opimization in documents that use PostScriptFunction
+    transforms
+  - Minor optimization to Stream handling
+  - Fix some compile warnings
+  + glib:
+  - Optional content support
+  - More work on Annotations support
+  - Improvements to the demo
+  - Documentation improvements
+  - Fix build when compiling with GTK_DISABLE_SINGLE_INCLUDES
+  + Qt4:
+  - Support URI actions for Table Of Contents items
+  - Documentation improvements
+  - Improvements to the demo
+  - Add a FontIterator for iterating through the fonts of the
+    document
+  + utils:
+  - Allow the use of cropbox in pdftoppm
+  - Make pdftohtml output png images when the image stream is not
+    a jpeg
+  - Make pdftotext accept cropping options like pdftoppm
+  - Support rendering non-square pixels in pdftoppm
+  + build system:
+  - Require Cairo 1.8.4 for the Cairo output device
+  - Require CMake 2.6 when using the CMake build system
+  - Optionally require libpng for pdftohtml
+  - Optionally require libcms for color management
+- Add liblcms-devel and libpng-devel BuildRequires.
+- Rename libpoppler4 to libpoppler5.
+* Fri Apr 17 2009 vuntz@novell.com
+- Update to version 0.10.6:
+  + core:
+  - Fix problems that happen when parsing broken JBIG2 files.
+    CVE-2009-0799, CVE-2009-0800, CVE-2009-1179, CVE-2009-1180,
+    CVE-2009-1181, CVE-2009-1182, CVE-2009-1183, CVE-2009-1187,
+    CVE-2009-1188
+  - Fix parsing of incorrect border arrays. fdo#19761
+  - Fix clip test for fonts. fdo#20950
+  - Fix getGlyphAdvance to behave correctly on font size changes.
+    fdo#20769
+  - Misc build fixes
+  + build system:
+  - Fix the Qt4 version we need
+* Mon Mar 30 2009 pgajdos@suse.cz
+- poppler tools now provides and obsoletes xpdf-tools
+* Tue Mar 24 2009 pgajdos@suse.cz
+- disable hinting -- patch moved from xpdf splash copy to
+  poppler's splash, reason:
+    xpdf is going to use splash from poppler instead of own and
+    unmaintained copy of splash. Without it, the xpdf rendering
+    of pdf is very poor, when pdf font is small (e. g. document
+    was zoomed out).
+  * no-hinting.patch
+* Sun Mar 15 2009 vuntz@novell.com
+- Update to version 0.10.5:
+  + core:
+  - Read the UF entry if present and prefer it over F in Filespec
+    dictionary
+  - Fix typo that was making CairoOutputDev crash on some files.
+    fdo#17337
+  - Make JBIG2Stream more robust to corrupt input data
+  - Do not blindly follow loops parsing OutlineItem. fdo#18364
+  - Set up the error manager before calling
+    jpeg_create_decompress. fdo#20484
+  - Check there is an optional content config before using it.
+    fdo#20587
+  - Fix rendering of some PDF with OpenType fonts. fdo#20605
+  + build system:
+  - Yet more support for build on windows
+  - Use AC_CHECK_HEADER to find headers. fdo#20538
+  - Check for pkgconfig before using it
+  - General autotools improvements
+* Wed Feb 25 2009 vuntz@novell.com
+- Remove autoreconf & libtool workaround: we have no reason to call
+  autoreconf.
+- Remove -fno-strict-aliasing from CXXFLAGS: it's not needed for
+  the build.
+- Remove -fstack-protector: it's a default flag now.
+- Remove QTINC and QTLIB definition: it's not needed for the build.
+* Mon Feb 23 2009 dmueller@suse.de
+- use the distro provided libtool
+* Wed Feb 11 2009 vuntz@novell.com
+- Update to version 0.10.4:
+  + core:
+  - Fix a memory leak when asking for a document-level JS
+  - Do not crash in some PDF we do not parse correctly.
+    (fdo#19702)
+  - Fix crash on unexepcted form Opt value. (fdo#19790)
+  + utils:
+  - Fix pdfimages to extract i color components per pixel jpeg
+    images. (fdo#19789)
+* Thu Feb  5 2009 vuntz@novell.com
+- Update to version 0.10.3:
+  + core:
+  - Fix a crash on documents with malformed outline. fdo#19024
+  - Fix leak on AnnotScreen destructor. fdo#19095
+  - Fix wrong PS generation when a large image is in Patterns.
+    fdo#18908
+  - Remove BaseFile.h it was never used. fdo#19298
+  - Improve document saving
+  - Fix PS generation of PDF with malformed font Length2
+    definition
+  - Fix a leak while parsing annotations
+  - Fix rendering of some checkboxes
+  + Qt4:
+  - Fix positioning of Form rects on PDF with cropbox
+  - Fix positioning of Annotation rects on PDF with cropbox.
+    fdo#18558.
+  - Small documentation improvements
+  - Make Document::fonts() work when called more than once.
+    fdo#19405
+  + build system:
+  - CMake: look harder for openjpeg
+  - CMake: update the poppler core headers installation
+  - Autotools: do not install Function.cc as it's not a header
+  + Qt:
+  - Fix deserialization of links right coordinate
+- Changes from version 0.10.2:
+  + core:
+  - Fix a crash when selecting text in word mode
+  - Fix a crash in some malformed documents (second argument of
+    opMarkPoint is not a dictionary)
+  - Ensure cairo font matrix is invertable. Fixes fdo#18254 and
+    fdo#18429
+  - Fix a memory leak (fdo#18924)
+  + Qt4:
+  - Fix deserization of links right coordinate
+  + misc:
+  - Fix build on Solaris 10 + Sun Studio 12
+  - Compile with -pedantic
+* Mon Nov 24 2008 sbrabec@suse.cz
+- Updated to version 0.10.1:
+  * Improvements in Optional Content support
+  * Small fixes in ActualText and Form support
+  * Fixed memory leaks and crashes
+  * Invalid rendering fixes
+  * Do not try to save documents that have Encryption
+  * Fix rendering regression on some fonts
+  * Documentation improvements
+  * Improve memory usage of the cairo renderer
+  * Initial JavaScript support
+  * Added a JPEG2000 decoder
+  * Emulate Adobe Reader behaviour on documents with duplicate keys
+    in Dictionaries
+  * Annotation improvements
+  * Add the possibility of extracting embedded fonts
+  * Added -listenc to pdfinfo and pdftotext
+* Fri Sep 12 2008 maw@suse.de
+- Update to version 0.8.7:
+  + Call error() when font loading fails
+  + Be less strict parsing TTF tables (bfo#16940)
+  + Fix crash due to uninitialized variable
+  + Fix regression in Form rendering
+  + Fix memory leak in the cairo backend
+  + Qt 4 frontend:
+  * Make the paper color setting working as it should
+  * Make sure to use the correct page width/height for form
+    widgets coordinates.
+* Thu Aug 14 2008 sbrabec@suse.cz
+- Updated to version 0.8.5:
+  * Use a single global FT_Library in CairoOutputDev.
+  * Do not limit CharCodeToUnicodeString to 8 characters
+  * crash, bug and leak fixes
+  * pdftohtml improvements
+* Thu Jul 31 2008 dmueller@suse.de
+- don't do poppler-devel rename for older distros
+* Wed Jul  2 2008 maw@suse.de
+- Add poppler-pagewidgets-null.patch (bnc#404955 and
+  CVE-2008-2950).
+* Wed Jun  4 2008 sbrabec@suse.cz
+- Updated to version 0.8.2:
+  * Add missing return in Object.h (fixes regression in 0.8.1)
+- Backported annotation crash fixes from upstream (bnc#396634).
+* Mon May 19 2008 maw@suse.de
+- Provide pdftools_any in the -tools subpackage (bnc#378434).
+* Mon May 12 2008 sbrabec@suse.cz
+- Check for optional content before using it (bnc#389090,
+  fdo#15899).
+* Tue Apr 29 2008 sbrabec@suse.cz
+- Updated to version 0.8.1:
+  * Do not call FT_Done_Face on a live cairo_font_face_t as it
+    might cause crashes
+  * Do not take into account Colorspace resource subdictionary for
+    image XObjects
+  * Downsample 16 bit per component images to 8 bit per component
+    so they render
+  * Link to pthread when the system needs it
+* Sat Apr 19 2008 schwab@suse.de
+- Work around broken qt check.
+* Fri Apr 11 2008 dmueller@suse.de
+- remove obsoletes for older distros - it is just asking
+  for trouble for buildservice users
+* Thu Apr  3 2008 sbrabec@suse.cz
+- Updated to version 0.8.0:
+  * Public api changes
+  * Many bug fixes
+  * Better error handling
+  * Check the document stream is seekable when opening it
+  * Improve font matching not forcing default values onto
+    Fontconfig
+  * Add preliminary annotations support in the glib frontend
+  * Initial Movie support in the core
+  * Make GDK dependency optional in glib bindings
+  * Really distribute CMake files as optional build tool
+  * Initial Optional Content support in core and in the Qt4
+    frontend
+  * Saving support
+  * Partial annotation support
+  * Forms improvements
+  * Add support for ActualText entries
+  * Display characters outside of unicode BMP with TT font
+  * CJK rendering fixes
+  * Implement Adobe Glyph Naming convention for fonts
+  * CMake as optional build tool
+  * Better font scaling for non embedded fonts
+  * Preserve PDF page labels when we output as postscript
+* Thu Jan 31 2008 maw@suse.de
+- Update to version 0.6.4:
+  Qt4 frontend:
+  * Fix crash on links that point to a non existant page
+  * Make Document::renderHints return the correct render hints
+  * Fix infinite loop when parsing LineAnnotation
+  core:
+  * Fix crash in the Splash renderer when T3 fonts are badly defined
+  * Draw underlined Links correctly
+  utils:
+  * Fix two use after free bugs in HtmlOutputDev.cc
+  build system:
+  * Fix build on mingw32
+  tests:
+  * Distribute the glade file of pdf-inspector.
+* Fri Jan 25 2008 maw@suse.de
+- Update to version 0.6.3:
+  + core:
+  * Fix CVE-2007-4352, CVE-2007-5392 and CVE-2007-5393
+  * Fix a crash on documents with wrong CCITTFaxStream
+  * Fix a crash in the Cairo renderer with invalid embedded fonts
+  * Fix a crash with invalid TrueType fonts
+  * Check if font is inside the clip area before rendering
+    it to a temporary bitmap in the Splash renderer. Fixes crashes
+    on incorrect documents
+  * Do not use exit(1) on DCTStream errors
+  * Detect form fields at any depth level
+  * Do not generate appearance stream for radio buttons that are
+    not active
+  * mingw fixes
+  * Fix crash in extra debug code
+  + glib frontend:
+  * Make sure passwords are passed correctly to poppler core
+  + Qt frontend:
+  * Improved documentation
+  * Fix crash on documents that specify an empty date
+  + Misc build improvements
+- Remove xpdf2-CVE-2007-4352.diff, xpdf2-CVE-2007-5392.diff,
+  and xpdf2-CVE-2007-5393.diff, all of which have been upstreamed.
+* Fri Jan 25 2008 stbinner@suse.de
+- fix build on 10.2
+* Mon Nov  5 2007 maw@suse.de
+- Add xpdf2-CVE-2007-4352.diff, xpdf2-CVE-2007-5392.diff,
+  and xpdf2-CVE-2007-5393.diff (#335637, CVE-2007-4352,
+  CVE-2007-5392, and CVE-2007-5393).
+* Wed Oct 31 2007 sbrabec@suse.cz
+- Provide and obsolete poppler-doc (#338021).
+* Tue Oct 23 2007 sbrabec@suse.cz
+- Use split-provides. Obsoleting something another package provides
+  creates a conflict between them.
+* Tue Oct 23 2007 jpr@suse.de
+- Updated to version 0.6.1:
+  * Fix printing with different x and y scale
+  * Fix crash when Form Fields array contains references to non
+  existent objects
+  * Fix crash in CairoOutputDev::drawMaskedImage()
+  * Fix embedded file description not working on some cases
+  * Fix printing issue with qt4
+  * Avoid double free with qt4
+  * Fix memory leak when dealing with embedded files in qt4
+  * Fix build with --disable-cairo-output for glib
+  * Do not return unknown field type for signature form fields for
+  glib
+  * Support automake-1.10
+  * More compatible sh code in qt.m4
+  * Fix build on Sun Studio compiler
+- For libpoppler-qt3-devel, libpoppler-qt4-devel and
+  libpoppler-glib-devel require libpoppler-devel not poppler-devel since
+  for obsoletion reasons that is provided by those packages (#335567)
+-Add gnome-common to the build requires to remove configure errors
+* Thu Oct 11 2007 sbrabec@suse.cz
+- Use less strict dependencies for shared libraries.
+- poppler devel package names prepended by "lib".
+- poppler-qt-devel renamed to libpoppler-qt3-devel
+- Fixed poppler_spec-prepare.sh to not alter %%changes.
+* Mon Oct  8 2007 sbrabec@suse.cz
+- Updated to version 0.6:
+  * CairoOutputDev fixes
+  * Allow pdftoppm to read/write from stdin/stdout
+  * API work on Qt4 frontend
+  * Fix pdfimages produces inverted image for black & white image
+  * Fix error on the NFKC text matching routine
+  * Add support for word and line selections
+  * Do not enforce %%%%EOF at the end of file
+  * Pad zeroes instead of aborting when rendering 1-bit images
+    and the stream is too short
+  * Update glib bindings documentation
+  * Merge xpdf 3.02 changes
+  * Qt4 frontend is not marked anymore as unstable
+  * Support for Sound objects
+  * Support for Opening/Closing page actions
+  * Support for page duration
+  * Improve PS Tokenizer performance thanks
+  * Various speed ups
+  * Beginning of Interactive Form support
+  * xpdfrc is no longer used for anything
+  * Add AbiWord output device and pdftoabw program
+  * Fix security issue MOAB-06-01-2007
+  * Lots of bugs fixed
+- Rename packages according to shared library naming policy.
+- Make devel packages binding specific to deliver correct
+  dependencies (#249436).
+* Sat Mar 10 2007 dmueller@suse.de
+- remove now broken .la files from devel package
+  to fix build of all depending packages
+* Mon Mar  5 2007 sbrabec@suse.cz
+- Fixed devel dependencies (#249436).
+- Removed some devel dependencies to force less to install.
+* Mon Feb  5 2007 werner@suse.de
+- Simplify usage of class UGooString
+* Fri Jan 19 2007 maw@suse.de
+- Add poppler-PageTree-depth-CVE-2007-0104.patch, fixing an
+  infinite loop in page tree (#233133 and CVE-2007-0104).
+* Mon Jan 15 2007 dmueller@suse.de
+- don't build static libs
+* Fri Jan 12 2007 dmueller@suse.de
+- fix pedantic warnings in qt4 headers
+* Tue Jan  2 2007 sbrabec@suse.cz
+- Fixed qt detection (#229896).
+- Fixed dependencies.
+- Reverted poppler-qt3 back to poppler-qt (#229896).
+* Fri Dec 29 2006 james@usr-local-bin.org
+- New subpackage: poppler-qt4
+- Rename poppler-qt to be poppler-qt3
+* Sat Dec 23 2006 james@usr-local-bin.org
+- Add wildcard to use QT3 and QT4 bindings
+* Tue Dec 19 2006 sbrabec@suse.cz
+- Spec file cleanup.
+- Splitted poppler-doc from poppler.
+* Thu Oct 26 2006 jhargadon@suse.de
+- added --sysconfdir=/etc option to ./configure in the specfile
+  as another part of the fix for bug #201739
+* Wed Oct  4 2006 jhargadon@suse.de
+- moved man pages to the poppler-tools subpackage [#201739]
+* Wed Sep 27 2006 jhargadon@suse.de
+- update to version 0.5.4
+- Automatically read in CJK encoding files if they're installed
+- Speed ups
+- Patch from Dom Lachowicz to let the utils take input on stdin
+- many bug fixes
+* Mon Sep  4 2006 sbrabec@suse.cz
+- Define conflict poppler-tools x xpdf-tools (#201739#c4).
+* Thu Aug 31 2006 sbrabec@suse.cz
+- Created poppler-tools providing xpdf-tools (#201739).
+- Enabled parallel build.
+* Fri Jul  7 2006 aj@suse.de
+- Add back missing headers.
+* Thu Jul  6 2006 gekker@suse.de
+- Update to version 0.5.3
+- Remove upstreamed patches
+* Tue Jun 13 2006 gekker@suse.de
+- Fix evince crasher when selecting text (#152780)
+* Thu Mar 23 2006 sbrabec@suse.cz
+- Display CJK with cairo correctly (Mandriva patch, #160230).
+- Fixed devel dependencies.
+* Tue Feb  7 2006 sbrabec@suse.cz
+- Fixed SplashXPathScanner heap overflow (#141242, CVE-2006-0301).
+* Wed Jan 25 2006 mls@suse.de
+- converted neededforbuild to BuildRequires
+* Tue Jan 17 2006 nadvornik@suse.cz
+- updated to 0.4.4
+- security patches merged upstream
+* Mon Jan 16 2006 meissner@suse.de
+- added -fno-strict-aliasing.
+* Mon Jan 16 2006 meissner@suse.de
+- use -fstack-protector.
+* Wed Jan 11 2006 sbrabec@suse.cz
+- Removed libpixman from neededforbuild.
+* Thu Dec 15 2005 sbrabec@suse.cz
+- Fixed more xpdf overflows and signed integer multiplications
+  (Chris Evans, Martin Pitt, #137156).
+* Wed Dec  7 2005 sbrabec@suse.cz
+- Xpdf heap owerflow fixes (#137156, CAN-2005-3191, CAN-2005-3192,
+  CAN-2005-3193).
+* Mon Oct 24 2005 stbinner@suse.de
+- remove remaining extra qualifications
+* Tue Oct 18 2005 dmueller@suse.de
+- fix extra qualifications in installed headers
+* Fri Sep  2 2005 gekker@suse.de
+- Update to version 0.4.2
+- Fixes to work with new cairo version
+- Required by evince update for GNOME 2.12
+* Thu Aug 18 2005 gekker@suse.de
+- Update to version 0.4.0
+- Remove uptreamed patchs
+* Thu Jul 21 2005 gekker@suse.de
+- Update to version 0.3.3
+* Mon Jun 27 2005 meissner@suse.de
+- supply format attributes.
+* Wed Jun  1 2005 sbrabec@suse.cz
+-  Fixed pkgconfig file.
+* Tue May 24 2005 sbrabec@suse.cz
+- Updated to version 0.3.2.
+* Mon May 23 2005 sbrabec@suse.cz
+- Split poppler-glib to subpackage.
+* Sun May 22 2005 aj@suse.de
+- Fix build with GCC4.
+* Mon May  9 2005 sbrabec@suse.cz
+- New SuSE package, version 0.3.1.
diff --git a/poppler-cairo-uninstalled.pc.in b/poppler-cairo-uninstalled.pc.in
new file mode 100644 (file)
index 0000000..2458eb2
--- /dev/null
@@ -0,0 +1,6 @@
+Name: poppler-cairo
+Description: Cairo backend for Poppler PDF rendering library - uninstalled
+Version: @VERSION@
+Requires: poppler = @VERSION@ cairo >= @CAIRO_VERSION@
+
+Libs: ${pc_top_builddir}/${pcfiledir}/poppler/libpoppler-cairo.la
diff --git a/poppler-cairo.pc.cmake b/poppler-cairo.pc.cmake
new file mode 100644 (file)
index 0000000..b32f118
--- /dev/null
@@ -0,0 +1,9 @@
+prefix=@CMAKE_INSTALL_PREFIX@
+exec_prefix=${prefix}
+libdir=${exec_prefix}/lib@LIB_SUFFIX@
+includedir=${prefix}/include
+
+Name: poppler-cairo
+Description: Cairo backend for Poppler PDF rendering library
+Version: @POPPLER_VERSION@
+Requires: poppler = @POPPLER_VERSION@ cairo >= @CAIRO_VERSION@
diff --git a/poppler-cairo.pc.in b/poppler-cairo.pc.in
new file mode 100644 (file)
index 0000000..367a5b6
--- /dev/null
@@ -0,0 +1,9 @@
+prefix=@prefix@
+exec_prefix=@exec_prefix@
+libdir=@libdir@
+includedir=@includedir@
+
+Name: poppler-cairo
+Description: Cairo backend for Poppler PDF rendering library
+Version: @VERSION@
+Requires: poppler = @VERSION@ cairo >= @CAIRO_VERSION@
diff --git a/poppler-cpp-uninstalled.pc.in b/poppler-cpp-uninstalled.pc.in
new file mode 100644 (file)
index 0000000..af3640e
--- /dev/null
@@ -0,0 +1,7 @@
+Name: poppler-cpp
+Description: cpp backend for Poppler PDF rendering library - uninstalled
+Version: @VERSION@
+Requires: poppler = @VERSION@
+
+Libs: ${pc_top_builddir}/${pcfiledir}/cpp/libpoppler-cpp.la
+Cflags: -I${pc_top_builddir}/${pcfiledir}/cpp
diff --git a/poppler-cpp.pc.cmake b/poppler-cpp.pc.cmake
new file mode 100644 (file)
index 0000000..3f56b3d
--- /dev/null
@@ -0,0 +1,13 @@
+prefix=@CMAKE_INSTALL_PREFIX@
+exec_prefix=${prefix}
+libdir=${exec_prefix}/lib@LIB_SUFFIX@
+includedir=${prefix}/include
+
+Name: poppler-cpp
+Description: cpp backend for Poppler PDF rendering library
+Version: @POPPLER_VERSION@
+Requires: @PC_REQUIRES@
+@PC_REQUIRES_PRIVATE@
+
+Libs: -L${libdir} -lpoppler-cpp
+Cflags: -I${includedir}/poppler/cpp
diff --git a/poppler-cpp.pc.in b/poppler-cpp.pc.in
new file mode 100644 (file)
index 0000000..a7e97c2
--- /dev/null
@@ -0,0 +1,13 @@
+prefix=@prefix@
+exec_prefix=@exec_prefix@
+libdir=@libdir@
+includedir=@includedir@
+
+Name: poppler-cpp
+Description: cpp backend for Poppler PDF rendering library
+Version: @VERSION@
+Requires: @PC_REQUIRES@
+@PC_REQUIRES_PRIVATE@
+
+Libs: -L${libdir} -lpoppler-cpp
+Cflags: -I${includedir}/poppler/cpp
diff --git a/poppler-glib-uninstalled.pc.in b/poppler-glib-uninstalled.pc.in
new file mode 100644 (file)
index 0000000..5fcb6f2
--- /dev/null
@@ -0,0 +1,7 @@
+Name: poppler-glib
+Description: GLib wrapper for poppler - uninstalled
+Version: @VERSION@
+Requires: glib-2.0 >= @GLIB_REQUIRED@ gobject-2.0 >= @GLIB_REQUIRED@ cairo >= @CAIRO_VERSION@
+
+Libs: ${pc_top_builddir}/${pcfiledir}/glib/libpoppler-glib.la
+Cflags: -I${pc_top_builddir}/${pcfiledir}/glib
diff --git a/poppler-glib.pc.cmake b/poppler-glib.pc.cmake
new file mode 100644 (file)
index 0000000..e15e669
--- /dev/null
@@ -0,0 +1,13 @@
+prefix=@CMAKE_INSTALL_PREFIX@
+exec_prefix=${prefix}
+libdir=${exec_prefix}/lib@LIB_SUFFIX@
+includedir=${prefix}/include
+
+Name: poppler-glib
+Description: GLib wrapper for poppler
+Version: @POPPLER_VERSION@
+Requires: glib-2.0 >= @GLIB_REQUIRED@ gobject-2.0 >= @GLIB_REQUIRED@ cairo >= @CAIRO_VERSION@
+@PC_REQUIRES_PRIVATE@
+
+Libs: -L${libdir} -lpoppler-glib
+Cflags: -I${includedir}/poppler/glib
diff --git a/poppler-glib.pc.in b/poppler-glib.pc.in
new file mode 100644 (file)
index 0000000..9ba8978
--- /dev/null
@@ -0,0 +1,13 @@
+prefix=@prefix@
+exec_prefix=@exec_prefix@
+libdir=@libdir@
+includedir=@includedir@
+
+Name: poppler-glib
+Description: GLib wrapper for poppler
+Version: @VERSION@
+Requires: glib-2.0 >= @GLIB_REQUIRED@ gobject-2.0 >= @GLIB_REQUIRED@ cairo >= @CAIRO_VERSION@
+@PC_REQUIRES_PRIVATE@
+
+Libs: -L${libdir} -lpoppler-glib
+Cflags: -I${includedir}/poppler/glib
diff --git a/poppler-qt4-uninstalled.pc.in b/poppler-qt4-uninstalled.pc.in
new file mode 100644 (file)
index 0000000..3a336c6
--- /dev/null
@@ -0,0 +1,7 @@
+Name: poppler-qt4
+Description: Qt4 bindings for poppler - uninstalled
+Version: @VERSION@
+Requires: poppler = @VERSION@ 
+
+Libs: ${pc_top_builddir}/${pcfiledir}/qt4/src/libpoppler-qt4.la
+Cflags: -I${pc_top_builddir}/${pcfiledir}/qt4/src
diff --git a/poppler-qt4.pc.cmake b/poppler-qt4.pc.cmake
new file mode 100644 (file)
index 0000000..b17fd5d
--- /dev/null
@@ -0,0 +1,13 @@
+prefix=@CMAKE_INSTALL_PREFIX@
+exec_prefix=${prefix}
+libdir=${exec_prefix}/lib@LIB_SUFFIX@
+includedir=${prefix}/include
+
+Name: poppler-qt4
+Description: Qt4 bindings for poppler
+Version: @POPPLER_VERSION@
+Requires: @PC_REQUIRES@
+@PC_REQUIRES_PRIVATE@
+
+Libs: -L${libdir} -lpoppler-qt4
+Cflags: -I${includedir}/poppler/qt4
diff --git a/poppler-qt4.pc.in b/poppler-qt4.pc.in
new file mode 100644 (file)
index 0000000..306ae46
--- /dev/null
@@ -0,0 +1,13 @@
+prefix=@prefix@
+exec_prefix=@exec_prefix@
+libdir=@libdir@
+includedir=@includedir@
+
+Name: poppler-qt4
+Description: Qt4 bindings for poppler
+Version: @VERSION@
+Requires: @PC_REQUIRES@
+@PC_REQUIRES_PRIVATE@
+
+Libs: -L${libdir} -lpoppler-qt4
+Cflags: -I${includedir}/poppler/qt4
diff --git a/poppler-splash-uninstalled.pc.in b/poppler-splash-uninstalled.pc.in
new file mode 100644 (file)
index 0000000..436ecdb
--- /dev/null
@@ -0,0 +1,7 @@
+Name: poppler-splash
+Description: Splash backend for Poppler PDF rendering library - uninstalled
+Version: @VERSION@
+Requires: poppler = @VERSION@
+
+Libs: ${pc_top_builddir}/${pcfiledir}/splash/libsplash.la
+
diff --git a/poppler-splash.pc.cmake b/poppler-splash.pc.cmake
new file mode 100644 (file)
index 0000000..cb95b3d
--- /dev/null
@@ -0,0 +1,9 @@
+prefix=@CMAKE_INSTALL_PREFIX@
+exec_prefix=${prefix}
+libdir=${exec_prefix}/lib@LIB_SUFFIX@
+includedir=${prefix}/include
+
+Name: poppler-splash
+Description: Splash backend for Poppler PDF rendering library
+Version: @POPPLER_VERSION@
+Requires: poppler = @POPPLER_VERSION@
diff --git a/poppler-splash.pc.in b/poppler-splash.pc.in
new file mode 100644 (file)
index 0000000..cf3491f
--- /dev/null
@@ -0,0 +1,9 @@
+prefix=@prefix@
+exec_prefix=@exec_prefix@
+libdir=@libdir@
+includedir=@includedir@
+
+Name: poppler-splash
+Description: Splash backend for Poppler PDF rendering library
+Version: @VERSION@
+Requires: poppler = @VERSION@
diff --git a/poppler-tools.manifest b/poppler-tools.manifest
new file mode 100644 (file)
index 0000000..dacbf7f
--- /dev/null
@@ -0,0 +1,9 @@
+<manifest>
+       <define>
+               <domain name="org.tizen.mobileprint" policy="restricted" plist="poppler-tools,avahi-data,avahi,cups-data,cups,hplip,epson-inkjet-printer-escpr,epson-laser-printer-escpage,samsungcupsfilter,cups-filters,print-service,org.tizen.mobileprint"/>
+       </define>
+       <request>
+               <domain name="org.tizen.mobileprint"/>
+       </request>
+</manifest>
+
diff --git a/poppler-uninstalled.pc.in b/poppler-uninstalled.pc.in
new file mode 100644 (file)
index 0000000..6076e80
--- /dev/null
@@ -0,0 +1,6 @@
+Name: poppler
+Description: PDF rendering library - uninstalled
+Version: @VERSION@
+
+Libs: ${pc_top_builddir}/${pcfiledir}/poppler/libpoppler.la
+Cflags: -I${pc_top_builddir}/${pcfiledir}/poppler
diff --git a/poppler.pc.cmake b/poppler.pc.cmake
new file mode 100644 (file)
index 0000000..f1aebed
--- /dev/null
@@ -0,0 +1,11 @@
+prefix=@CMAKE_INSTALL_PREFIX@
+exec_prefix=${prefix}
+libdir=${exec_prefix}/lib@LIB_SUFFIX@
+includedir=${prefix}/include
+
+Name: poppler
+Description: PDF rendering library
+Version: @POPPLER_VERSION@
+
+Libs: -L${libdir} -lpoppler
+Cflags: -I${includedir}/poppler
diff --git a/poppler.pc.in b/poppler.pc.in
new file mode 100644 (file)
index 0000000..8605b28
--- /dev/null
@@ -0,0 +1,11 @@
+prefix=@prefix@
+exec_prefix=@exec_prefix@
+libdir=@libdir@
+includedir=@includedir@
+
+Name: poppler
+Description: PDF rendering library
+Version: @VERSION@
+
+Libs: -L${libdir} -lpoppler
+Cflags: -I${includedir}/poppler
diff --git a/poppler/Annot.cc b/poppler/Annot.cc
new file mode 100644 (file)
index 0000000..aa8b9a8
--- /dev/null
@@ -0,0 +1,6582 @@
+//========================================================================
+//
+// Annot.cc
+//
+// Copyright 2000-2003 Glyph & Cog, LLC
+//
+//========================================================================
+
+//========================================================================
+//
+// Modified under the Poppler project - http://poppler.freedesktop.org
+//
+// All changes made under the Poppler project to this file are licensed
+// under GPL version 2 or later
+//
+// Copyright (C) 2006 Scott Turner <scotty1024@mac.com>
+// Copyright (C) 2007, 2008 Julien Rebetez <julienr@svn.gnome.org>
+// Copyright (C) 2007-2012 Albert Astals Cid <aacid@kde.org>
+// Copyright (C) 2007-2011 Carlos Garcia Campos <carlosgc@gnome.org>
+// Copyright (C) 2007, 2008 Iñigo Martínez <inigomartinez@gmail.com>
+// Copyright (C) 2007 Jeff Muizelaar <jeff@infidigm.net>
+// Copyright (C) 2008, 2011 Pino Toscano <pino@kde.org>
+// Copyright (C) 2008 Michael Vrable <mvrable@cs.ucsd.edu>
+// Copyright (C) 2008 Hugo Mercier <hmercier31@gmail.com>
+// Copyright (C) 2009 Ilya Gorenbein <igorenbein@finjan.com>
+// Copyright (C) 2011 José Aliste <jaliste@src.gnome.org>
+// Copyright (C) 2012 Fabio D'Urso <fabiodurso@hotmail.it>
+// Copyright (C) 2012 Thomas Freitag <Thomas.Freitag@alfa.de>
+//
+// To see a description of the changes please see the Changelog file that
+// came with your tarball or type make ChangeLog if you are building from git
+//
+//========================================================================
+
+#include <config.h>
+
+#ifdef USE_GCC_PRAGMAS
+#pragma implementation
+#endif
+
+#include <stdlib.h>
+#include <math.h>
+#include <assert.h>
+#include "goo/gmem.h"
+#include "goo/gstrtod.h"
+#include "GooList.h"
+#include "Error.h"
+#include "Object.h"
+#include "Catalog.h"
+#include "Gfx.h"
+#include "Lexer.h"
+#include "PDFDoc.h"
+#include "Page.h"
+#include "Annot.h"
+#include "GfxFont.h"
+#include "CharCodeToUnicode.h"
+#include "PDFDocEncoding.h"
+#include "Form.h"
+#include "Error.h"
+#include "XRef.h"
+#include "Movie.h"
+#include "OptionalContent.h"
+#include "Sound.h"
+#include "FileSpec.h"
+#include "DateInfo.h"
+#include "Link.h"
+#include <string.h>
+
+#define fieldFlagReadOnly           0x00000001
+#define fieldFlagRequired           0x00000002
+#define fieldFlagNoExport           0x00000004
+#define fieldFlagMultiline          0x00001000
+#define fieldFlagPassword           0x00002000
+#define fieldFlagNoToggleToOff      0x00004000
+#define fieldFlagRadio              0x00008000
+#define fieldFlagPushbutton         0x00010000
+#define fieldFlagCombo              0x00020000
+#define fieldFlagEdit               0x00040000
+#define fieldFlagSort               0x00080000
+#define fieldFlagFileSelect         0x00100000
+#define fieldFlagMultiSelect        0x00200000
+#define fieldFlagDoNotSpellCheck    0x00400000
+#define fieldFlagDoNotScroll        0x00800000
+#define fieldFlagComb               0x01000000
+#define fieldFlagRichText           0x02000000
+#define fieldFlagRadiosInUnison     0x02000000
+#define fieldFlagCommitOnSelChange  0x04000000
+
+#define fieldQuadLeft   0
+#define fieldQuadCenter 1
+#define fieldQuadRight  2
+
+// distance of Bezier control point from center for circle approximation
+// = (4 * (sqrt(2) - 1) / 3) * r
+#define bezierCircle 0.55228475
+
+AnnotLineEndingStyle parseAnnotLineEndingStyle(GooString *string) {
+  if (string != NULL) {
+    if (!string->cmp("Square")) {
+      return annotLineEndingSquare;
+    } else if (!string->cmp("Circle")) {
+      return annotLineEndingCircle;
+    } else if (!string->cmp("Diamond")) {
+      return annotLineEndingDiamond;
+    } else if (!string->cmp("OpenArrow")) {
+      return annotLineEndingOpenArrow;
+    } else if (!string->cmp("ClosedArrow")) {
+      return annotLineEndingClosedArrow;
+    } else if (!string->cmp("Butt")) {
+      return annotLineEndingButt;
+    } else if (!string->cmp("ROpenArrow")) {
+      return annotLineEndingROpenArrow;
+    } else if (!string->cmp("RClosedArrow")) {
+      return annotLineEndingRClosedArrow;
+    } else if (!string->cmp("Slash")) {
+      return annotLineEndingSlash;
+    } else {
+      return annotLineEndingNone;
+    }
+  } else {
+    return annotLineEndingNone;
+  }  
+}
+
+const char* convertAnnotLineEndingStyle(AnnotLineEndingStyle style) {
+  switch (style) {
+    case annotLineEndingSquare:
+      return "Square";
+    case annotLineEndingCircle:
+      return "Circle";
+    case annotLineEndingDiamond:
+      return "Diamond";
+    case annotLineEndingOpenArrow:
+      return "OpenArrow";
+    case annotLineEndingClosedArrow:
+      return "ClosedArrow";
+    case annotLineEndingButt:
+      return "Butt";
+    case annotLineEndingROpenArrow:
+      return "ROpenArrow";
+    case annotLineEndingRClosedArrow:
+      return "RClosedArrow";
+    case annotLineEndingSlash:
+      return "Slash";
+    default:
+      return "None";
+  }
+}
+
+static AnnotExternalDataType parseAnnotExternalData(Dict* dict) {
+  Object obj1;
+  AnnotExternalDataType type;
+
+  if (dict->lookup("Subtype", &obj1)->isName()) {
+    const char *typeName = obj1.getName();
+
+    if (!strcmp(typeName, "Markup3D")) {
+      type = annotExternalDataMarkup3D;
+    } else {
+      type = annotExternalDataMarkupUnknown;
+    }
+  } else {
+    type = annotExternalDataMarkupUnknown;
+  }
+  obj1.free();
+
+  return type;
+}
+
+PDFRectangle *parseDiffRectangle(Array *array, PDFRectangle *rect) {
+  PDFRectangle *newRect = NULL;
+  if (array->getLength() == 4) {
+    // deltas
+    Object obj1;
+    double dx1 = (array->get(0, &obj1)->isNum() ? obj1.getNum() : 0);
+    obj1.free();
+    double dy1 = (array->get(1, &obj1)->isNum() ? obj1.getNum() : 0);
+    obj1.free();
+    double dx2 = (array->get(2, &obj1)->isNum() ? obj1.getNum() : 0);
+    obj1.free();
+    double dy2 = (array->get(3, &obj1)->isNum() ? obj1.getNum() : 0);
+    obj1.free();
+
+    // checking that the numbers are valid (i.e. >= 0),
+    // and that applying the differences still give us a valid rect
+    if (dx1 >= 0 && dy1 >= 0 && dx2 >= 0 && dy2
+        && (rect->x2 - rect->x1 - dx1 - dx2) >= 0
+        && (rect->y2 - rect->y1 - dy1 - dy2) >= 0) {
+      newRect = new PDFRectangle();
+      newRect->x1 = rect->x1 + dx1;
+      newRect->y1 = rect->y1 + dy1;
+      newRect->x2 = rect->x2 - dx2;
+      newRect->y2 = rect->y2 - dy2;
+    }
+  }
+  return newRect;
+}
+
+//------------------------------------------------------------------------
+// AnnotBorderEffect
+//------------------------------------------------------------------------
+
+AnnotBorderEffect::AnnotBorderEffect(Dict *dict) {
+  Object obj1;
+
+  if (dict->lookup("S", &obj1)->isName()) {
+    const char *effectName = obj1.getName();
+
+    if (!strcmp(effectName, "C"))
+      effectType = borderEffectCloudy;
+    else
+      effectType = borderEffectNoEffect;
+  } else {
+    effectType = borderEffectNoEffect;
+  }
+  obj1.free();
+
+  if ((dict->lookup("I", &obj1)->isNum()) && effectType == borderEffectCloudy) {
+    intensity = obj1.getNum();
+  } else {
+    intensity = 0;
+  }
+  obj1.free();
+}
+
+//------------------------------------------------------------------------
+// AnnotPath
+//------------------------------------------------------------------------
+
+AnnotPath::AnnotPath() {
+  coords = NULL;
+  coordsLength = 0;
+}
+
+AnnotPath::AnnotPath(Array *array) {
+  coords = NULL;
+  coordsLength = 0;
+  parsePathArray(array);
+}
+
+AnnotPath::AnnotPath(AnnotCoord **coords, int coordsLength) {
+  this->coords = coords;
+  this->coordsLength = coordsLength;
+}
+
+AnnotPath::~AnnotPath() {
+  if (coords) {
+    for (int i = 0; i < coordsLength; ++i)
+      delete coords[i];
+    gfree(coords);
+  }
+}
+
+double AnnotPath::getX(int coord) const {
+  if (coord >= 0 && coord < coordsLength)
+    return coords[coord]->getX();
+  return 0;
+}
+
+double AnnotPath::getY(int coord) const {
+  if (coord >= 0 && coord < coordsLength)
+    return coords[coord]->getY();
+  return 0;
+}
+
+AnnotCoord *AnnotPath::getCoord(int coord) const {
+  if (coord >= 0 && coord < coordsLength)
+    return coords[coord];
+  return NULL;
+}
+
+void AnnotPath::parsePathArray(Array *array) {
+  int tempLength;
+  AnnotCoord **tempCoords;
+  GBool correct = gTrue;
+
+  if (array->getLength() % 2) {
+    error(errSyntaxError, -1, "Bad Annot Path");
+    return;
+  }
+
+  tempLength = array->getLength() / 2;
+  tempCoords = (AnnotCoord **) gmallocn (tempLength, sizeof(AnnotCoord *));
+  memset(tempCoords, 0, tempLength * sizeof(AnnotCoord *));
+  for (int i = 0; i < tempLength && correct; i++) {
+    Object obj1;
+    double x = 0, y = 0;
+
+    if (array->get(i * 2, &obj1)->isNum()) {
+      x = obj1.getNum();
+    } else {
+      correct = gFalse;
+    }
+    obj1.free();
+
+    if (array->get((i * 2) + 1, &obj1)->isNum()) {
+      y = obj1.getNum();
+    } else {
+      correct = gFalse;
+    }
+    obj1.free();
+
+    if (!correct) {
+      for (int j = i - 1; j >= 0; j--)
+        delete tempCoords[j];
+      gfree (tempCoords);
+      return;
+    }
+
+    tempCoords[i] = new AnnotCoord(x, y);
+  }
+
+  coords = tempCoords;
+  coordsLength = tempLength;
+}
+
+//------------------------------------------------------------------------
+// AnnotCalloutLine
+//------------------------------------------------------------------------
+
+AnnotCalloutLine::AnnotCalloutLine(double x1, double y1, double x2, double y2)
+    :  coord1(x1, y1), coord2(x2, y2) {
+}
+
+//------------------------------------------------------------------------
+// AnnotCalloutMultiLine
+//------------------------------------------------------------------------
+
+AnnotCalloutMultiLine::AnnotCalloutMultiLine(double x1, double y1, double x2,
+                                             double y2, double x3, double y3)
+    : AnnotCalloutLine(x1, y1, x2, y2), coord3(x3, y3) {
+}
+
+//------------------------------------------------------------------------
+// AnnotQuadrilateral
+//------------------------------------------------------------------------
+
+AnnotQuadrilaterals::AnnotQuadrilaterals(Array *array, PDFRectangle *rect) {
+  int arrayLength = array->getLength();
+  GBool correct = gTrue;
+  int quadsLength = 0;
+  AnnotQuadrilateral **quads;
+  double quadArray[8];
+
+  // default values
+  quadrilaterals = NULL;
+  quadrilateralsLength = 0;
+
+  if ((arrayLength % 8) == 0) {
+    int i;
+
+    quadsLength = arrayLength / 8;
+    quads = (AnnotQuadrilateral **) gmallocn
+        ((quadsLength), sizeof(AnnotQuadrilateral *));
+    memset(quads, 0, quadsLength * sizeof(AnnotQuadrilateral *));
+
+    for (i = 0; i < quadsLength; i++) {
+      for (int j = 0; j < 8; j++) {
+        Object obj;
+        if (array->get(i * 8 + j, &obj)->isNum()) {
+          quadArray[j] = obj.getNum();
+        } else {
+            correct = gFalse;
+           obj.free();
+           error (errSyntaxError, -1, "Invalid QuadPoint in annot");
+           break;
+        }
+        obj.free();
+      }
+
+      if (!correct)
+        break;
+
+      quads[i] = new AnnotQuadrilateral(quadArray[0], quadArray[1],
+                                       quadArray[2], quadArray[3],
+                                       quadArray[4], quadArray[5],
+                                       quadArray[6], quadArray[7]);
+    }
+
+    if (correct) {
+      quadrilateralsLength = quadsLength;
+      quadrilaterals = quads;
+    } else {
+      for (int j = 0; j < i; j++)
+        delete quads[j];
+      gfree (quads);
+    }
+  }
+}
+
+AnnotQuadrilaterals::AnnotQuadrilaterals(AnnotQuadrilaterals::AnnotQuadrilateral **quads, int quadsLength) {
+  quadrilaterals = quads;
+  quadrilateralsLength = quadsLength;
+}
+
+AnnotQuadrilaterals::~AnnotQuadrilaterals() {
+  if (quadrilaterals) {
+    for(int i = 0; i < quadrilateralsLength; i++)
+      delete quadrilaterals[i];
+
+    gfree (quadrilaterals);
+  }
+}
+
+double AnnotQuadrilaterals::getX1(int quadrilateral) {
+  if (quadrilateral >= 0  && quadrilateral < quadrilateralsLength)
+    return quadrilaterals[quadrilateral]->coord1.getX();
+  return 0;
+}
+
+double AnnotQuadrilaterals::getY1(int quadrilateral) {
+  if (quadrilateral >= 0  && quadrilateral < quadrilateralsLength)
+    return quadrilaterals[quadrilateral]->coord1.getY();
+  return 0;
+}
+
+double AnnotQuadrilaterals::getX2(int quadrilateral) {
+  if (quadrilateral >= 0  && quadrilateral < quadrilateralsLength)
+    return quadrilaterals[quadrilateral]->coord2.getX();
+  return 0;
+}
+
+double AnnotQuadrilaterals::getY2(int quadrilateral) {
+  if (quadrilateral >= 0  && quadrilateral < quadrilateralsLength)
+    return quadrilaterals[quadrilateral]->coord2.getY();
+  return 0;
+}
+
+double AnnotQuadrilaterals::getX3(int quadrilateral) {
+  if (quadrilateral >= 0  && quadrilateral < quadrilateralsLength)
+    return quadrilaterals[quadrilateral]->coord3.getX();
+  return 0;
+}
+
+double AnnotQuadrilaterals::getY3(int quadrilateral) {
+  if (quadrilateral >= 0  && quadrilateral < quadrilateralsLength)
+    return quadrilaterals[quadrilateral]->coord3.getY();
+  return 0;
+}
+
+double AnnotQuadrilaterals::getX4(int quadrilateral) {
+  if (quadrilateral >= 0  && quadrilateral < quadrilateralsLength)
+    return quadrilaterals[quadrilateral]->coord4.getX();
+  return 0;
+}
+
+double AnnotQuadrilaterals::getY4(int quadrilateral) {
+  if (quadrilateral >= 0  && quadrilateral < quadrilateralsLength)
+    return quadrilaterals[quadrilateral]->coord4.getY();
+  return 0;
+}
+
+AnnotQuadrilaterals::AnnotQuadrilateral::AnnotQuadrilateral(double x1, double y1,
+    double x2, double y2, double x3, double y3, double x4, double y4)
+    : coord1(x1, y1), coord2(x2, y2), coord3(x3, y3), coord4(x4, y4) {
+}
+
+//------------------------------------------------------------------------
+// AnnotBorder
+//------------------------------------------------------------------------
+AnnotBorder::AnnotBorder() {
+  type = typeUnknown;
+  width = 1;
+  dashLength = 0;
+  dash = NULL;
+  style = borderSolid;
+}
+
+GBool AnnotBorder::parseDashArray(Object *dashObj) {
+  GBool correct = gTrue;
+  int tempLength = dashObj->arrayGetLength();
+  double *tempDash = (double *) gmallocn (tempLength, sizeof (double));
+
+  // TODO: check not all zero (Line Dash Pattern Page 217 PDF 8.1)
+  for (int i = 0; i < tempLength && i < DASH_LIMIT && correct; i++) {
+    Object obj1;
+
+    if (dashObj->arrayGet(i, &obj1)->isNum()) {
+      tempDash[i] = obj1.getNum();
+
+      correct = tempDash[i] >= 0;
+      obj1.free();
+    }
+  }
+
+  if (correct) {
+    dashLength = tempLength;
+    dash = tempDash;
+    style = borderDashed;
+  } else {
+    gfree (tempDash);
+  }
+
+  return correct;
+}
+
+AnnotBorder::~AnnotBorder() {
+  if (dash)
+    gfree (dash); 
+}
+  
+//------------------------------------------------------------------------
+// AnnotBorderArray
+//------------------------------------------------------------------------
+
+AnnotBorderArray::AnnotBorderArray() {
+  type = typeArray;
+  horizontalCorner = 0;
+  verticalCorner = 0;
+}
+
+AnnotBorderArray::AnnotBorderArray(Array *array) {
+  Object obj1;
+  int arrayLength = array->getLength();
+
+  GBool correct = gTrue;
+  if (arrayLength == 3 || arrayLength == 4) {
+    // implementation note 81 in Appendix H.
+
+    if (array->get(0, &obj1)->isNum())
+      horizontalCorner = obj1.getNum();
+    else
+      correct = gFalse;
+    obj1.free();
+
+    if (array->get(1, &obj1)->isNum())
+      verticalCorner = obj1.getNum();
+    else
+      correct = gFalse;
+    obj1.free();
+
+    if (array->get(2, &obj1)->isNum())
+      width = obj1.getNum();
+    else
+      correct = gFalse;
+    obj1.free();
+
+    if (arrayLength == 4) {
+      if (array->get(3, &obj1)->isArray())
+        correct = parseDashArray(&obj1);
+      else
+        correct = gFalse;
+      obj1.free();
+    }
+  } else {
+    correct = gFalse;
+  }
+  
+  if (!correct) {
+    width = 0;
+  }
+}
+
+void AnnotBorderArray::writeToObject(XRef *xref, Object *obj1) const {
+  Object obj2;
+
+  obj1->initArray(xref);
+  obj1->arrayAdd(obj2.initReal( horizontalCorner ));
+  obj1->arrayAdd(obj2.initReal( verticalCorner ));
+  obj1->arrayAdd(obj2.initReal( width ));
+  // TODO: Dash array
+}
+
+//------------------------------------------------------------------------
+// AnnotBorderBS
+//------------------------------------------------------------------------
+
+AnnotBorderBS::AnnotBorderBS() {
+  type = typeBS;
+}
+
+AnnotBorderBS::AnnotBorderBS(Dict *dict) {
+  Object obj1, obj2;
+
+  // acroread 8 seems to need both W and S entries for
+  // any border to be drawn, even though the spec
+  // doesn't claim anything of that sort. We follow
+  // that behaviour by veryifying both entries exist
+  // otherwise we set the borderWidth to 0
+  // --jrmuizel
+  dict->lookup("W", &obj1);
+  dict->lookup("S", &obj2);
+  if (obj1.isNum() && obj2.isName()) {
+    const char *styleName = obj2.getName();
+
+    width = obj1.getNum();
+
+    if (!strcmp(styleName, "S")) {
+      style = borderSolid;
+    } else if (!strcmp(styleName, "D")) {
+      style = borderDashed;
+    } else if (!strcmp(styleName, "B")) {
+      style = borderBeveled;
+    } else if (!strcmp(styleName, "I")) {
+      style = borderInset;
+    } else if (!strcmp(styleName, "U")) {
+      style = borderUnderlined;
+    } else {
+      style = borderSolid;
+    }
+  } else {
+    width = 0;
+  }
+  obj2.free();
+  obj1.free();
+
+  if (style == borderDashed) {
+    if (dict->lookup("D", &obj1)->isArray())
+      parseDashArray(&obj1);
+    obj1.free();
+
+    if (!dash) {
+      dashLength = 1;
+      dash = (double *) gmallocn (dashLength, sizeof (double));
+      dash[0] = 3;
+    }
+  }
+}
+
+//------------------------------------------------------------------------
+// AnnotColor
+//------------------------------------------------------------------------
+
+AnnotColor::AnnotColor() {
+  length = 0;
+}
+
+AnnotColor::AnnotColor(double gray) {
+  length = 1;
+
+  values[0] = gray;
+}
+
+AnnotColor::AnnotColor(double r, double g, double b) {
+  length = 3;
+
+  values[0] = r;
+  values[1] = g;
+  values[2] = b;
+}
+
+AnnotColor::AnnotColor(double c, double m, double y, double k) {
+  length = 4;
+
+  values[0] = c;
+  values[1] = m;
+  values[2] = y;
+  values[3] = k;
+}
+
+// If <adjust> is +1, color is brightened;
+// if <adjust> is -1, color is darkened;
+// otherwise color is not modified.
+AnnotColor::AnnotColor(Array *array, int adjust) {
+  int i;
+
+  length = array->getLength();
+  if (length > 4)
+    length = 4;
+
+  for (i = 0; i < length; i++) {
+    Object obj1;
+
+    if (array->get(i, &obj1)->isNum()) {
+      values[i] = obj1.getNum();
+
+      if (values[i] < 0 || values[i] > 1)
+        values[i] = 0;
+    } else {
+      values[i] = 0;
+    }
+    obj1.free();
+  }
+
+  if (adjust != 0)
+    adjustColor(adjust);
+}
+
+void AnnotColor::adjustColor(int adjust) {
+  int i;
+
+  if (length == 4) {
+    adjust = -adjust;
+  }
+  if (adjust > 0) {
+    for (i = 0; i < length; ++i) {
+      values[i] = 0.5 * values[i] + 0.5;
+    }
+  } else if (adjust < 0) {
+    for (i = 0; i < length; ++i) {
+      values[i] = 0.5 * values[i];
+    }
+  }
+}
+
+void AnnotColor::writeToObject(XRef *xref, Object *obj1) const {
+  Object obj2;
+  int i;
+
+  if (length == 0) {
+    obj1->initNull(); // Transparent (no color)
+  } else {
+    obj1->initArray(xref);
+    for (i = 0; i < length; ++i)
+      obj1->arrayAdd( obj2.initReal( values[i] ) );
+  }
+}
+
+//------------------------------------------------------------------------
+// AnnotIconFit
+//------------------------------------------------------------------------
+
+AnnotIconFit::AnnotIconFit(Dict* dict) {
+  Object obj1;
+
+  if (dict->lookup("SW", &obj1)->isName()) {
+    const char *scaleName = obj1.getName();
+
+    if(!strcmp(scaleName, "B")) {
+      scaleWhen = scaleBigger;
+    } else if(!strcmp(scaleName, "S")) {
+      scaleWhen = scaleSmaller;
+    } else if(!strcmp(scaleName, "N")) {
+      scaleWhen = scaleNever;
+    } else {
+      scaleWhen = scaleAlways;
+    }
+  } else {
+    scaleWhen = scaleAlways;
+  }
+  obj1.free();
+
+  if (dict->lookup("S", &obj1)->isName()) {
+    const char *scaleName = obj1.getName();
+
+    if(!strcmp(scaleName, "A")) {
+      scale = scaleAnamorphic;
+    } else {
+      scale = scaleProportional;
+    }
+  } else {
+    scale = scaleProportional;
+  }
+  obj1.free();
+
+  if (dict->lookup("A", &obj1)->isArray() && obj1.arrayGetLength() == 2) {
+    Object obj2;
+    (obj1.arrayGet(0, &obj2)->isNum() ? left = obj2.getNum() : left = 0);
+    obj2.free();
+    (obj1.arrayGet(1, &obj2)->isNum() ? bottom = obj2.getNum() : bottom = 0);
+    obj2.free();
+
+    if (left < 0 || left > 1)
+      left = 0.5;
+
+    if (bottom < 0 || bottom > 1)
+      bottom = 0.5;
+
+  } else {
+    left = bottom = 0.5;
+  }
+  obj1.free();
+
+  if (dict->lookup("FB", &obj1)->isBool()) {
+    fullyBounds = obj1.getBool();
+  } else {
+    fullyBounds = gFalse;
+  }
+  obj1.free();
+}
+
+//------------------------------------------------------------------------
+// AnnotAppearance
+//------------------------------------------------------------------------
+
+AnnotAppearance::AnnotAppearance(PDFDoc *docA, Object *dict) {
+  assert(dict->isDict());
+  doc = docA;
+  xref = docA->getXRef();
+  dict->copy(&appearDict);
+}
+
+AnnotAppearance::~AnnotAppearance() {
+  appearDict.free();
+}
+
+void AnnotAppearance::getAppearanceStream(AnnotAppearance::AnnotAppearanceType type, const char *state, Object *dest) {
+  Object apData, stream;
+  apData.initNull();
+
+  // Obtain dictionary or stream associated to appearance type
+  if (type == appearRollover) {
+    appearDict.dictLookupNF("R", &apData);
+  } else if (type == appearDown) {
+    appearDict.dictLookupNF("D", &apData);
+  }
+  if (apData.isNull()) { // Normal appearance, also used as fallback
+    appearDict.dictLookupNF("N", &apData);
+  }
+
+  // Search state if it's a subdictionary
+  if (apData.isDict() && state) {
+    Object obj1;
+    apData.dictLookupNF(state, &obj1);
+    apData.free();
+    obj1.copy(&apData);
+    obj1.free();
+  }
+
+  dest->initNull();
+  // Sanity check on the value we are about to return: it must be a ref to stream
+  if (apData.isRef()) {
+    apData.fetch(xref, &stream);
+    if (stream.isStream()) {
+      apData.copy(dest);
+    } else {
+      error(errSyntaxWarning, -1, "AP points to a non-stream object");
+    }
+    stream.free();
+  }
+  apData.free();
+}
+
+GooString * AnnotAppearance::getStateKey(int i) {
+  Object obj1;
+  GooString * res = NULL;
+  appearDict.dictLookupNF("N", &obj1);
+  if (obj1.isDict()) {
+    res = new GooString(obj1.dictGetKey(i));
+  }
+  obj1.free();
+  return res;
+}
+
+int AnnotAppearance::getNumStates() {
+  Object obj1;
+  int res = 0;
+  appearDict.dictLookupNF("N", &obj1);
+  if (obj1.isDict()) {
+    res = obj1.dictGetLength();
+  }
+  obj1.free();
+  return res;
+}
+
+// Test if stateObj (a Ref or a Dict) points to the specified stream
+GBool AnnotAppearance::referencesStream(Object *stateObj, Ref refToStream) {
+  if (stateObj->isRef()) {
+    Ref r = stateObj->getRef();
+    if (r.num == refToStream.num && r.gen == refToStream.gen) {
+      return gTrue;
+    }
+  } else if (stateObj->isDict()) { // Test each value
+    const int size = stateObj->dictGetLength();
+    for (int i = 0; i < size; ++i) {
+      Object obj1;
+      stateObj->dictGetValNF(i, &obj1);
+      if (obj1.isRef()) {
+        Ref r = obj1.getRef();
+        if (r.num == refToStream.num && r.gen == refToStream.gen) {
+          return gTrue;
+        }
+      }
+      obj1.free();
+    }
+  }
+  return gFalse; // Not found
+}
+
+// Test if this AnnotAppearance references the specified stream
+GBool AnnotAppearance::referencesStream(Ref refToStream) {
+  Object obj1;
+  GBool found;
+
+  // Scan each state's ref/subdictionary
+  appearDict.dictLookupNF("N", &obj1);
+  found = referencesStream(&obj1, refToStream);
+  obj1.free();
+  if (found)
+    return gTrue;
+
+  appearDict.dictLookupNF("R", &obj1);
+  found = referencesStream(&obj1, refToStream);
+  obj1.free();
+  if (found)
+    return gTrue;
+
+  appearDict.dictLookupNF("D", &obj1);
+  found = referencesStream(&obj1, refToStream);
+  obj1.free();
+  return found;
+}
+
+// If this is the only annotation in the document that references the
+// specified appearance stream, remove the appearance stream
+void AnnotAppearance::removeStream(Ref refToStream) {
+  const int lastpage = doc->getNumPages();
+  for (int pg = 1; pg <= lastpage; ++pg) { // Scan all annotations in the document
+    Page *page = doc->getPage(pg);
+    if (!page) {
+      error(errSyntaxError, -1, "Failed check for shared annotation stream at page {0:d}", pg);
+      continue;
+    }
+    Annots *annots = page->getAnnots();
+    for (int i = 0; i < annots->getNumAnnots(); ++i) {
+      AnnotAppearance *annotAp = annots->getAnnot(i)->getAppearStreams();
+      if (annotAp && annotAp != this && annotAp->referencesStream(refToStream)) {
+        return; // Another annotation points to the stream -> Don't delete it
+      }
+    }
+  }
+
+  // TODO: stream resources (e.g. font), AP name tree
+  xref->removeIndirectObject(refToStream);
+}
+
+// Removes stream if obj is a Ref, or removes pointed streams if obj is a Dict
+void AnnotAppearance::removeStateStreams(Object *obj1) {
+  if (obj1->isRef()) {
+    removeStream(obj1->getRef());
+  } else if (obj1->isDict()) {
+    const int size = obj1->dictGetLength();
+    for (int i = 0; i < size; ++i) {
+      Object obj2;
+      obj1->dictGetValNF(i, &obj2);
+      if (obj2.isRef()) {
+        removeStream(obj2.getRef());
+      }
+      obj2.free();
+    }
+  }
+}
+
+void AnnotAppearance::removeAllStreams() {
+  Object obj1;
+  appearDict.dictLookupNF("N", &obj1);
+  removeStateStreams(&obj1);
+  obj1.free();
+  appearDict.dictLookupNF("R", &obj1);
+  removeStateStreams(&obj1);
+  obj1.free();
+  appearDict.dictLookupNF("D", &obj1);
+  removeStateStreams(&obj1);
+  obj1.free();
+}
+
+//------------------------------------------------------------------------
+// AnnotAppearanceCharacs
+//------------------------------------------------------------------------
+
+AnnotAppearanceCharacs::AnnotAppearanceCharacs(Dict *dict) {
+  Object obj1;
+
+  if (dict->lookup("R", &obj1)->isInt()) {
+    rotation = obj1.getInt();
+  } else {
+    rotation = 0;
+  }
+  obj1.free();
+
+  if (dict->lookup("BC", &obj1)->isArray()) {
+    borderColor = new AnnotColor(obj1.getArray());
+  } else {
+    borderColor = NULL;
+  }
+  obj1.free();
+
+  if (dict->lookup("BG", &obj1)->isArray()) {
+    backColor = new AnnotColor(obj1.getArray());
+  } else {
+    backColor = NULL;
+  }
+  obj1.free();
+
+  if (dict->lookup("CA", &obj1)->isString()) {
+    normalCaption = new GooString(obj1.getString());
+  } else {
+    normalCaption = NULL;
+  }
+  obj1.free();
+
+  if (dict->lookup("RC", &obj1)->isString()) {
+    rolloverCaption = new GooString(obj1.getString());
+  } else {
+    rolloverCaption = NULL;
+  }
+  obj1.free();
+
+  if (dict->lookup("AC", &obj1)->isString()) {
+    alternateCaption = new GooString(obj1.getString());
+  } else {
+    alternateCaption = NULL;
+  }
+  obj1.free();
+
+  if (dict->lookup("IF", &obj1)->isDict()) {
+    iconFit = new AnnotIconFit(obj1.getDict());
+  } else {
+    iconFit = NULL;
+  }
+  obj1.free();
+
+  if (dict->lookup("TP", &obj1)->isInt()) {
+    position = (AnnotAppearanceCharacsTextPos) obj1.getInt();
+  } else {
+    position = captionNoIcon;
+  }
+  obj1.free();
+}
+
+AnnotAppearanceCharacs::~AnnotAppearanceCharacs() {
+  if (borderColor)
+    delete borderColor;
+
+  if (backColor)
+    delete backColor;
+
+  if (normalCaption)
+    delete normalCaption;
+
+  if (rolloverCaption)
+    delete rolloverCaption;
+
+  if (alternateCaption)
+    delete alternateCaption;
+
+  if (iconFit)
+    delete iconFit;
+}
+
+//------------------------------------------------------------------------
+// AnnotAppearanceBBox
+//------------------------------------------------------------------------
+
+AnnotAppearanceBBox::AnnotAppearanceBBox(PDFRectangle *rect) {
+  origX = rect->x1;
+  origY = rect->y1;
+  borderWidth = 0;
+
+  // Initially set the same size as rect
+  minX = 0;
+  minY = 0;
+  maxX = rect->x2 - rect->x1;
+  maxY = rect->y2 - rect->y1;
+}
+
+void AnnotAppearanceBBox::extendTo(double x, double y) {
+  if (x < minX) {
+    minX = x;
+  } else if (x > maxX) {
+    maxX = x;
+  }
+  if (y < minY) {
+    minY = y;
+  } else if (y > maxY) {
+    maxY = y;
+  }
+}
+
+void AnnotAppearanceBBox::getBBoxRect(double bbox[4]) const {
+  Object obj2;
+  bbox[0] = minX - borderWidth;
+  bbox[1] = minY - borderWidth;
+  bbox[2] = maxX + borderWidth;
+  bbox[3] = maxY + borderWidth;
+}
+
+double AnnotAppearanceBBox::getPageXMin() const {
+  return origX + minX - borderWidth;
+}
+
+double AnnotAppearanceBBox::getPageYMin() const {
+  return origY + minY - borderWidth;
+}
+
+double AnnotAppearanceBBox::getPageXMax() const {
+  return origX + maxX + borderWidth;
+}
+
+double AnnotAppearanceBBox::getPageYMax() const {
+  return origY + maxY + borderWidth;
+}
+
+//------------------------------------------------------------------------
+// Annot
+//------------------------------------------------------------------------
+
+Annot::Annot(PDFDoc *docA, PDFRectangle *rectA) {
+  Object obj1;
+
+  refCnt = 1;
+  flags = flagUnknown;
+  type = typeUnknown;
+
+  obj1.initArray (docA->getXRef());
+  Object obj2;
+  obj1.arrayAdd (obj2.initReal (rectA->x1));
+  obj1.arrayAdd (obj2.initReal (rectA->y1));
+  obj1.arrayAdd (obj2.initReal (rectA->x2));
+  obj1.arrayAdd (obj2.initReal (rectA->y2));
+  obj2.free ();
+
+  annotObj.initDict (docA->getXRef());
+  annotObj.dictSet ("Type", obj2.initName ("Annot"));
+  annotObj.dictSet ("Rect", &obj1);
+  // obj1 is owned by the dict
+
+  ref = docA->getXRef()->addIndirectObject (&annotObj);
+
+  initialize (docA, annotObj.getDict());
+}
+
+Annot::Annot(PDFDoc *docA, Dict *dict) {
+  refCnt = 1;
+  hasRef = false;
+  flags = flagUnknown;
+  type = typeUnknown;
+  annotObj.initDict (dict);
+  initialize (docA, dict);
+}
+
+Annot::Annot(PDFDoc *docA, Dict *dict, Object *obj) {
+  refCnt = 1;
+  if (obj->isRef()) {
+    hasRef = gTrue;
+    ref = obj->getRef();
+  } else {
+    hasRef = gFalse;
+  }
+  flags = flagUnknown;
+  type = typeUnknown;
+  annotObj.initDict (dict);
+  initialize (docA, dict);
+}
+
+void Annot::initialize(PDFDoc *docA, Dict *dict) {
+  Object apObj, asObj, obj1, obj2;
+
+  ok = gTrue;
+  doc = docA;
+  xref = doc->getXRef();
+  appearStreams = NULL;
+  appearBBox = NULL;
+  appearState = NULL;
+  appearBuf = NULL;
+  fontSize = 0;
+
+  appearance.initNull();
+
+  //----- parse the rectangle
+  rect = new PDFRectangle();
+  if (dict->lookup("Rect", &obj1)->isArray() && obj1.arrayGetLength() == 4) {
+    Object obj2;
+    (obj1.arrayGet(0, &obj2)->isNum() ? rect->x1 = obj2.getNum() : rect->x1 = 0);
+    obj2.free();
+    (obj1.arrayGet(1, &obj2)->isNum() ? rect->y1 = obj2.getNum() : rect->y1 = 0);
+    obj2.free();
+    (obj1.arrayGet(2, &obj2)->isNum() ? rect->x2 = obj2.getNum() : rect->x2 = 1);
+    obj2.free();
+    (obj1.arrayGet(3, &obj2)->isNum() ? rect->y2 = obj2.getNum() : rect->y2 = 1);
+    obj2.free();
+
+    if (rect->x1 > rect->x2) {
+      double t = rect->x1;
+      rect->x1 = rect->x2;
+      rect->x2 = t;
+    }
+
+    if (rect->y1 > rect->y2) {
+      double t = rect->y1;
+      rect->y1 = rect->y2;
+      rect->y2 = t;
+    }
+  } else {
+    rect->x1 = rect->y1 = 0;
+    rect->x2 = rect->y2 = 1;
+    error(errSyntaxError, -1, "Bad bounding box for annotation");
+    ok = gFalse;
+  }
+  obj1.free();
+
+  if (dict->lookup("Contents", &obj1)->isString()) {
+    contents = obj1.getString()->copy();
+  } else {
+    contents = NULL;
+  }
+  obj1.free();
+
+  if (dict->lookupNF("P", &obj1)->isRef()) {
+    Ref ref = obj1.getRef();
+
+    page = doc->getCatalog()->findPage (ref.num, ref.gen);
+  } else {
+    page = 0;
+  }
+  obj1.free();
+
+  if (dict->lookup("NM", &obj1)->isString()) {
+    name = obj1.getString()->copy();
+  } else {
+    name = NULL;
+  }
+  obj1.free();
+
+  if (dict->lookup("M", &obj1)->isString()) {
+    modified = obj1.getString()->copy();
+  } else {
+    modified = NULL;
+  }
+  obj1.free();
+
+  //----- get the flags
+  if (dict->lookup("F", &obj1)->isInt()) {
+    flags |= obj1.getInt();
+  } else {
+    flags = flagUnknown;
+  }
+  obj1.free();
+
+  //----- get the annotation appearance dictionary
+  dict->lookup("AP", &apObj);
+  if (apObj.isDict()) {
+    appearStreams = new AnnotAppearance(doc, &apObj);
+  }
+  apObj.free();
+
+  //----- get the appearance state
+  dict->lookup("AS", &asObj);
+  if (asObj.isName()) {
+    appearState = new GooString(asObj.getName());
+  } else if (appearStreams && appearStreams->getNumStates() != 0) {
+    error (errSyntaxError, -1, "Invalid or missing AS value in annotation containing one or more appearance subdictionaries");
+    // AS value is required in this case, but if the
+    // N dictionary contains only one entry
+    // take it as default appearance.
+    if (appearStreams->getNumStates() == 1) {
+      appearState = appearStreams->getStateKey(0);
+    }
+  }
+  if (!appearState) {
+    appearState = new GooString("Off");
+  }
+  asObj.free();
+
+  //----- get the annotation appearance
+  if (appearStreams) {
+    appearStreams->getAppearanceStream(AnnotAppearance::appearNormal, appearState->getCString(), &appearance);
+  }
+
+  //----- parse the border style
+  if (dict->lookup("BS", &obj1)->isDict()) {
+    border = new AnnotBorderBS(obj1.getDict());
+  } else {
+    obj1.free();
+
+    if (dict->lookup("Border", &obj1)->isArray())
+      border = new AnnotBorderArray(obj1.getArray());
+    else
+      // Adobe draws no border at all if the last element is of
+      // the wrong type.
+      border = NULL;
+  }
+  obj1.free();
+
+  if (dict->lookup("C", &obj1)->isArray()) {
+    color = new AnnotColor(obj1.getArray());
+  } else {
+    color = NULL;
+  }
+  obj1.free();
+
+  if (dict->lookup("StructParent", &obj1)->isInt()) {
+    treeKey = obj1.getInt();
+  } else {
+    treeKey = 0;
+  }
+  obj1.free();
+
+  dict->lookupNF("OC", &oc);
+}
+
+void Annot::getRect(double *x1, double *y1, double *x2, double *y2) const {
+  *x1 = rect->x1;
+  *y1 = rect->y1;
+  *x2 = rect->x2;
+  *y2 = rect->y2;
+}
+
+void Annot::setRect(PDFRectangle *rect) {
+    setRect(rect->x1, rect->y1, rect->x2, rect->y2);
+}
+
+void Annot::setRect(double x1, double y1, double x2, double y2) {
+  Object obj1, obj2;
+
+  if (x1 < x2) {
+    rect->x1 = x1;
+    rect->x2 = x2;
+  } else {
+    rect->x1 = x2;
+    rect->x2 = x1;
+  }
+
+  if (y1 < y2) {
+    rect->y1 = y1;
+    rect->y2 = y2;
+  } else {
+    rect->y1 = y2;
+    rect->y2 = y1;
+  }
+
+  obj1.initArray (xref);
+  obj1.arrayAdd (obj2.initReal (rect->x1));
+  obj1.arrayAdd (obj2.initReal (rect->y1));
+  obj1.arrayAdd (obj2.initReal (rect->x2));
+  obj1.arrayAdd (obj2.initReal (rect->y2));
+
+  update("Rect", &obj1);
+}
+
+GBool Annot::inRect(double x, double y) const {
+  return rect->contains(x, y);
+}
+
+void Annot::update(const char *key, Object *value) {
+  /* Set M to current time, unless we are updating M itself */
+  if (strcmp(key, "M") != 0) {
+    delete modified;
+    modified = timeToDateString(NULL);
+
+    Object obj1;
+    obj1.initString (modified->copy());
+    annotObj.dictSet("M", &obj1);
+  }
+
+  annotObj.dictSet(const_cast<char*>(key), value);
+  
+  xref->setModifiedObject(&annotObj, ref);
+}
+
+void Annot::setContents(GooString *new_content) {
+  delete contents;
+
+  if (new_content) {
+    contents = new GooString(new_content);
+    //append the unicode marker <FE FF> if needed      
+    if (!contents->hasUnicodeMarker()) {
+      contents->insert(0, 0xff);
+      contents->insert(0, 0xfe);
+    }
+  } else {
+    contents = new GooString();
+  }
+  
+  Object obj1;
+  obj1.initString(contents->copy());
+  update ("Contents", &obj1);
+}
+
+void Annot::setName(GooString *new_name) {
+  delete name;
+
+  if (new_name) {
+    name = new GooString(new_name);
+  } else {
+    name = new GooString();
+  }
+
+  Object obj1;
+  obj1.initString(name->copy());
+  update ("NM", &obj1);
+}
+
+void Annot::setModified(GooString *new_modified) {
+  delete modified;
+
+  if (new_modified)
+    modified = new GooString(new_modified);
+  else
+    modified = new GooString();
+
+  Object obj1;
+  obj1.initString(modified->copy());
+  update ("M", &obj1);
+}
+
+void Annot::setFlags(Guint new_flags) {
+  Object obj1;
+  flags = new_flags;
+  obj1.initInt(flags);
+  update ("F", &obj1);
+}
+
+void Annot::setBorder(AnnotBorderArray *new_border) {
+  delete border;
+
+  if (new_border) {
+    Object obj1;
+    new_border->writeToObject(xref, &obj1);
+    update ("Border", &obj1);
+    border = new_border;
+  } else {
+    border = NULL;
+  }
+}
+
+void Annot::setColor(AnnotColor *new_color) {
+  delete color;
+
+  if (new_color) {
+    Object obj1;
+    new_color->writeToObject(xref, &obj1);
+    update ("C", &obj1);
+    color = new_color;
+  } else {
+    color = NULL;
+  }
+}
+
+void Annot::setPage(Ref *pageRef, int pageIndex)
+{
+  Object obj1;
+
+  obj1.initRef(pageRef->num, pageRef->gen);
+  update("P", &obj1);
+  page = pageIndex;
+}
+
+void Annot::setAppearanceState(const char *state) {
+  if (!state)
+    return;
+
+  delete appearState;
+  appearState = new GooString(state);
+
+  delete appearBBox;
+  appearBBox = NULL;
+
+  Object obj1;
+  obj1.initName(state);
+  update ("AS", &obj1);
+
+  // The appearance state determines the current appearance stream
+  appearance.free();
+  if (appearStreams) {
+    appearStreams->getAppearanceStream(AnnotAppearance::appearNormal, appearState->getCString(), &appearance);
+  } else {
+    appearance.initNull();
+  }
+}
+
+void Annot::invalidateAppearance() {
+  if (appearStreams) { // Remove existing appearance streams
+    appearStreams->removeAllStreams();
+  }
+  delete appearStreams;
+  appearStreams = NULL;
+
+  setAppearanceState("Off"); // Default appearance state
+
+  Object obj1;
+  obj1.initNull();
+  update ("AP", &obj1); // Remove AP
+  update ("AS", &obj1); // Remove AS
+}
+
+double Annot::getXMin() {
+  return rect->x1;
+}
+
+double Annot::getYMin() {
+  return rect->y1;
+}
+
+void Annot::readArrayNum(Object *pdfArray, int key, double *value) {
+  Object valueObject;
+
+  pdfArray->arrayGet(key, &valueObject);
+  if (valueObject.isNum()) {
+    *value = valueObject.getNum();
+  } else {
+    *value = 0;
+    ok = gFalse;
+  }
+  valueObject.free();
+}
+
+void Annot::incRefCnt() {
+  refCnt++;
+}
+
+void Annot::decRefCnt() {
+  if (--refCnt == 0)
+    delete this;
+}
+
+Annot::~Annot() {
+  annotObj.free();
+  
+  delete rect;
+  
+  if (contents)
+    delete contents;
+
+  if (name)
+    delete name;
+
+  if (modified)
+    delete modified;
+
+  delete appearStreams;
+  delete appearBBox;
+  appearance.free();
+
+  if (appearState)
+    delete appearState;
+
+  if (border)
+    delete border;
+
+  if (color)
+    delete color;
+
+  oc.free();
+}
+
+void Annot::setColor(AnnotColor *color, GBool fill) {
+  const double *values = color->getValues();
+
+  switch (color->getSpace()) {
+  case AnnotColor::colorCMYK:
+    appearBuf->appendf("{0:.2f} {1:.2f} {2:.2f} {3:.2f} {4:c}\n",
+                      values[0], values[1], values[2], values[3],
+                      fill ? 'k' : 'K');
+    break;
+  case AnnotColor::colorRGB:
+    appearBuf->appendf("{0:.2f} {1:.2f} {2:.2f} {3:s}\n",
+                      values[0], values[1], values[2],
+                      fill ? "rg" : "RG");
+    break;
+  case AnnotColor::colorGray:
+    appearBuf->appendf("{0:.2f} {1:c}\n",
+                      values[0],
+                      fill ? 'g' : 'G');
+    break;
+  case AnnotColor::colorTransparent:
+  default:
+    break;
+  }
+}
+
+// Draw an (approximate) circle of radius <r> centered at (<cx>, <cy>).
+// If <fill> is true, the circle is filled; otherwise it is stroked.
+void Annot::drawCircle(double cx, double cy, double r, GBool fill) {
+  appearBuf->appendf("{0:.2f} {1:.2f} m\n",
+      cx + r, cy);
+  appearBuf->appendf("{0:.2f} {1:.2f} {2:.2f} {3:.2f} {4:.2f} {5:.2f} c\n",
+      cx + r, cy + bezierCircle * r,
+      cx + bezierCircle * r, cy + r,
+      cx, cy + r);
+  appearBuf->appendf("{0:.2f} {1:.2f} {2:.2f} {3:.2f} {4:.2f} {5:.2f} c\n",
+      cx - bezierCircle * r, cy + r,
+      cx - r, cy + bezierCircle * r,
+      cx - r, cy);
+  appearBuf->appendf("{0:.2f} {1:.2f} {2:.2f} {3:.2f} {4:.2f} {5:.2f} c\n",
+      cx - r, cy - bezierCircle * r,
+      cx - bezierCircle * r, cy - r,
+      cx, cy - r);
+  appearBuf->appendf("{0:.2f} {1:.2f} {2:.2f} {3:.2f} {4:.2f} {5:.2f} c\n",
+      cx + bezierCircle * r, cy - r,
+      cx + r, cy - bezierCircle * r,
+      cx + r, cy);
+  appearBuf->append(fill ? "f\n" : "s\n");
+}
+
+// Draw the top-left half of an (approximate) circle of radius <r>
+// centered at (<cx>, <cy>).
+void Annot::drawCircleTopLeft(double cx, double cy, double r) {
+  double r2;
+
+  r2 = r / sqrt(2.0);
+  appearBuf->appendf("{0:.2f} {1:.2f} m\n",
+      cx + r2, cy + r2);
+  appearBuf->appendf("{0:.2f} {1:.2f} {2:.2f} {3:.2f} {4:.2f} {5:.2f} c\n",
+      cx + (1 - bezierCircle) * r2,
+      cy + (1 + bezierCircle) * r2,
+      cx - (1 - bezierCircle) * r2,
+      cy + (1 + bezierCircle) * r2,
+      cx - r2,
+      cy + r2);
+  appearBuf->appendf("{0:.2f} {1:.2f} {2:.2f} {3:.2f} {4:.2f} {5:.2f} c\n",
+      cx - (1 + bezierCircle) * r2,
+      cy + (1 - bezierCircle) * r2,
+      cx - (1 + bezierCircle) * r2,
+      cy - (1 - bezierCircle) * r2,
+      cx - r2,
+      cy - r2);
+  appearBuf->append("S\n");
+}
+
+// Draw the bottom-right half of an (approximate) circle of radius <r>
+// centered at (<cx>, <cy>).
+void Annot::drawCircleBottomRight(double cx, double cy, double r) {
+  double r2;
+
+  r2 = r / sqrt(2.0);
+  appearBuf->appendf("{0:.2f} {1:.2f} m\n",
+      cx - r2, cy - r2);
+  appearBuf->appendf("{0:.2f} {1:.2f} {2:.2f} {3:.2f} {4:.2f} {5:.2f} c\n",
+      cx - (1 - bezierCircle) * r2,
+      cy - (1 + bezierCircle) * r2,
+      cx + (1 - bezierCircle) * r2,
+      cy - (1 + bezierCircle) * r2,
+      cx + r2,
+      cy - r2);
+  appearBuf->appendf("{0:.2f} {1:.2f} {2:.2f} {3:.2f} {4:.2f} {5:.2f} c\n",
+      cx + (1 + bezierCircle) * r2,
+      cy - (1 - bezierCircle) * r2,
+      cx + (1 + bezierCircle) * r2,
+      cy + (1 - bezierCircle) * r2,
+      cx + r2,
+      cy + r2);
+  appearBuf->append("S\n");
+}
+
+void Annot::createForm(double *bbox, GBool transparencyGroup, Object *resDict, Object *aStream) {
+  Object obj1, obj2;
+  Object appearDict;
+
+  appearDict.initDict(xref);
+  appearDict.dictSet("Length", obj1.initInt(appearBuf->getLength()));
+  appearDict.dictSet("Subtype", obj1.initName("Form"));
+  obj1.initArray(xref);
+  obj1.arrayAdd(obj2.initReal(bbox[0]));
+  obj1.arrayAdd(obj2.initReal(bbox[1]));
+  obj1.arrayAdd(obj2.initReal(bbox[2]));
+  obj1.arrayAdd(obj2.initReal(bbox[3]));
+  appearDict.dictSet("BBox", &obj1);
+  if (transparencyGroup) {
+    Object transDict;
+    transDict.initDict(xref);
+    transDict.dictSet("S", obj1.initName("Transparency"));
+    appearDict.dictSet("Group", &transDict);
+  }
+  if (resDict)
+    appearDict.dictSet("Resources", resDict);
+
+  MemStream *mStream = new MemStream(copyString(appearBuf->getCString()), 0,
+                                    appearBuf->getLength(), &appearDict);
+  mStream->setNeedFree(gTrue);
+  aStream->initStream(mStream);
+}
+
+void Annot::createResourcesDict(const char *formName, Object *formStream,
+                               const char *stateName,
+                               double opacity, const char *blendMode,
+                               Object *resDict) {
+  Object gsDict, stateDict, formDict, obj1;
+
+  gsDict.initDict(xref);
+  if (opacity != 1) {
+    gsDict.dictSet("CA", obj1.initReal(opacity));
+    gsDict.dictSet("ca", obj1.initReal(opacity));
+  }
+  if (blendMode)
+    gsDict.dictSet("BM", obj1.initName(blendMode));
+  stateDict.initDict(xref);
+  stateDict.dictSet(stateName, &gsDict);
+  formDict.initDict(xref);
+  formDict.dictSet(formName, formStream);
+
+  resDict->initDict(xref);
+  resDict->dictSet("ExtGState", &stateDict);
+  resDict->dictSet("XObject", &formDict);
+}
+
+Object *Annot::getAppearanceResDict(Object *dest) {
+  Object obj1, obj2;
+
+  dest->initNull(); // Default value
+
+  // Fetch appearance's resource dict (if any)
+  appearance.fetch(xref, &obj1);
+  if (obj1.isStream()) {
+    obj1.streamGetDict()->lookup("Resources", &obj2);
+    if (obj2.isDict()) {
+      obj2.copy(dest);
+    }
+    obj2.free();
+  }
+  obj1.free();
+
+  return dest;
+}
+
+GBool Annot::isVisible(GBool printing) {
+  // check the flags
+  if ((flags & flagHidden) ||
+      (printing && !(flags & flagPrint)) ||
+      (!printing && (flags & flagNoView))) {
+    return gFalse;
+  }
+
+  // check the OC
+  OCGs *optContentConfig = doc->getCatalog()->getOptContentConfig();
+  if (optContentConfig) {
+    if (! optContentConfig->optContentIsVisible(&oc))
+      return gFalse;
+  }
+
+  return gTrue;
+}
+
+void Annot::draw(Gfx *gfx, GBool printing) {
+  Object obj;
+
+  if (!isVisible (printing))
+    return;
+
+  // draw the appearance stream
+  appearance.fetch(xref, &obj);
+  gfx->drawAnnot(&obj, (AnnotBorder *)NULL, color,
+      rect->x1, rect->y1, rect->x2, rect->y2);
+  obj.free();
+}
+
+//------------------------------------------------------------------------
+// AnnotPopup
+//------------------------------------------------------------------------
+
+AnnotPopup::AnnotPopup(PDFDoc *docA, PDFRectangle *rect) :
+    Annot(docA, rect) {
+  Object obj1;
+
+  type = typePopup;
+
+  annotObj.dictSet ("Subtype", obj1.initName ("Popup"));
+  initialize (docA, annotObj.getDict());
+}
+
+AnnotPopup::AnnotPopup(PDFDoc *docA, Dict *dict, Object *obj) :
+    Annot(docA, dict, obj) {
+  type = typePopup;
+  initialize(docA, dict);
+}
+
+AnnotPopup::~AnnotPopup() {
+  parent.free();
+}
+
+void AnnotPopup::initialize(PDFDoc *docA, Dict *dict) {
+  Object obj1;
+
+  if (!dict->lookupNF("Parent", &parent)->isRef()) {
+    parent.initNull();
+  }
+
+  if (dict->lookup("Open", &obj1)->isBool()) {
+    open = obj1.getBool();
+  } else {
+    open = gFalse;
+  }
+  obj1.free();
+}
+
+void AnnotPopup::setParent(Object *parentA) {
+  parentA->copy(&parent);
+  update ("Parent", &parent);
+}
+
+void AnnotPopup::setParent(Annot *parentA) {
+  Ref parentRef = parentA->getRef();
+  parent.initRef(parentRef.num, parentRef.gen);
+  update ("Parent", &parent);
+}
+
+void AnnotPopup::setOpen(GBool openA) {
+  Object obj1;
+
+  open = openA;
+  obj1.initBool(open);
+  update ("Open", &obj1);
+}
+
+//------------------------------------------------------------------------
+// AnnotMarkup
+//------------------------------------------------------------------------
+AnnotMarkup::AnnotMarkup(PDFDoc *docA, PDFRectangle *rect) :
+    Annot(docA, rect) {
+  initialize(docA, annotObj.getDict(), &annotObj);
+}
+
+AnnotMarkup::AnnotMarkup(PDFDoc *docA, Dict *dict, Object *obj) :
+    Annot(docA, dict, obj) {
+  initialize(docA, dict, obj);
+}
+
+AnnotMarkup::~AnnotMarkup() {
+  if (label)
+    delete label;
+
+  if (popup)
+    delete popup;
+
+  if (date)
+    delete date;
+
+  if (subject)
+    delete subject;
+}
+
+void AnnotMarkup::initialize(PDFDoc *docA, Dict *dict, Object *obj) {
+  Object obj1, obj2;
+
+  if (dict->lookup("T", &obj1)->isString()) {
+    label = obj1.getString()->copy();
+  } else {
+    label = NULL;
+  }
+  obj1.free();
+
+  if (dict->lookup("Popup", &obj1)->isDict() && dict->lookupNF("Popup", &obj2)->isRef()) {
+    popup = new AnnotPopup(docA, obj1.getDict(), &obj2);
+  } else {
+    popup = NULL;
+  }
+  obj1.free();
+
+  if (dict->lookup("CA", &obj1)->isNum()) {
+    opacity = obj1.getNum();
+  } else {
+    opacity = 1.0;
+  }
+  obj1.free();
+
+  if (dict->lookup("CreationDate", &obj1)->isString()) {
+    date = obj1.getString()->copy();
+  } else {
+    date = NULL;
+  }
+  obj1.free();
+
+  if (dict->lookupNF("IRT", &obj1)->isRef()) {
+    inReplyTo = obj1.getRef();
+  } else {
+    inReplyTo.num = 0;
+    inReplyTo.gen = 0;
+  }
+  obj1.free();
+
+  if (dict->lookup("Subj", &obj1)->isString()) {
+    subject = obj1.getString()->copy();
+  } else {
+    subject = NULL;
+  }
+  obj1.free();
+
+  if (dict->lookup("RT", &obj1)->isName()) {
+    const char *replyName = obj1.getName();
+
+    if (!strcmp(replyName, "R")) {
+      replyTo = replyTypeR;
+    } else if (!strcmp(replyName, "Group")) {
+      replyTo = replyTypeGroup;
+    } else {
+      replyTo = replyTypeR;
+    }
+  } else {
+    replyTo = replyTypeR;
+  }
+  obj1.free();
+
+  if (dict->lookup("ExData", &obj1)->isDict()) {
+    exData = parseAnnotExternalData(obj1.getDict());
+  } else {
+    exData = annotExternalDataMarkupUnknown;
+  }
+  obj1.free();
+}
+
+void AnnotMarkup::setLabel(GooString *new_label) {
+  delete label;
+
+  if (new_label) {
+    label = new GooString(new_label);
+    //append the unicode marker <FE FF> if needed
+    if (!label->hasUnicodeMarker()) {
+      label->insert(0, 0xff);
+      label->insert(0, 0xfe);
+    }
+  } else {
+    label = new GooString();
+  }
+
+  Object obj1;
+  obj1.initString(label->copy());
+  update ("T", &obj1);
+}
+
+void AnnotMarkup::setPopup(AnnotPopup *new_popup) {
+  delete popup;
+
+  if (new_popup) {
+    Object obj1;
+    Ref popupRef = new_popup->getRef();
+
+    obj1.initRef (popupRef.num, popupRef.gen);
+    update ("Popup", &obj1);
+
+    new_popup->setParent(this);
+    popup = new_popup;
+  } else {
+    popup = NULL;
+  }
+}
+
+void AnnotMarkup::setOpacity(double opacityA) {
+  Object obj1;
+
+  opacity = opacityA;
+  obj1.initReal(opacity);
+  update ("CA", &obj1);
+}
+
+void AnnotMarkup::setDate(GooString *new_date) {
+  delete date;
+
+  if (new_date)
+    date = new GooString(new_date);
+  else
+    date = new GooString();
+
+  Object obj1;
+  obj1.initString(date->copy());
+  update ("CreationDate", &obj1);
+}
+
+//------------------------------------------------------------------------
+// AnnotText
+//------------------------------------------------------------------------
+
+AnnotText::AnnotText(PDFDoc *docA, PDFRectangle *rect) :
+    AnnotMarkup(docA, rect) {
+  Object obj1;
+
+  type = typeText;
+  flags |= flagNoZoom | flagNoRotate;
+
+  annotObj.dictSet ("Subtype", obj1.initName ("Text"));
+  initialize (docA, annotObj.getDict());
+}
+
+AnnotText::AnnotText(PDFDoc *docA, Dict *dict, Object *obj) :
+    AnnotMarkup(docA, dict, obj) {
+
+  type = typeText;
+  flags |= flagNoZoom | flagNoRotate;
+  initialize (docA, dict);
+}
+
+AnnotText::~AnnotText() {
+  delete icon;
+}
+
+void AnnotText::initialize(PDFDoc *docA, Dict *dict) {
+  Object obj1;
+
+  if (dict->lookup("Open", &obj1)->isBool())
+    open = obj1.getBool();
+  else
+    open = gFalse;
+  obj1.free();
+
+  if (dict->lookup("Name", &obj1)->isName()) {
+    icon = new GooString(obj1.getName());
+  } else {
+    icon = new GooString("Note");
+  }
+  obj1.free();
+
+  if (dict->lookup("StateModel", &obj1)->isString()) {
+    Object obj2;
+    GooString *modelName = obj1.getString();
+
+    if (dict->lookup("State", &obj2)->isString()) {
+      GooString *stateName = obj2.getString();
+
+      if (!stateName->cmp("Marked")) {
+        state = stateMarked;
+      } else if (!stateName->cmp("Unmarked")) {
+        state = stateUnmarked;
+      } else if (!stateName->cmp("Accepted")) {
+        state = stateAccepted;
+      } else if (!stateName->cmp("Rejected")) {
+        state = stateRejected;
+      } else if (!stateName->cmp("Cancelled")) {
+        state = stateCancelled;
+      } else if (!stateName->cmp("Completed")) {
+        state = stateCompleted;
+      } else if (!stateName->cmp("None")) {
+        state = stateNone;
+      } else {
+        state = stateUnknown;
+      }
+    } else {
+      state = stateUnknown;
+    }
+    obj2.free();
+
+    if (!modelName->cmp("Marked")) {
+      switch (state) {
+        case stateUnknown:
+          state = stateMarked;
+          break;
+        case stateAccepted:
+        case stateRejected:
+        case stateCancelled:
+        case stateCompleted:
+        case stateNone:
+          state = stateUnknown;
+          break;
+        default:
+          break;
+      }
+    } else if (!modelName->cmp("Review")) {
+      switch (state) {
+        case stateUnknown:
+          state = stateNone;
+          break;
+        case stateMarked:
+        case stateUnmarked:
+          state = stateUnknown;
+          break;
+        default:
+          break;
+      }
+    } else {
+      state = stateUnknown;
+    }
+  } else {
+    state = stateUnknown;
+  }
+  obj1.free();
+}
+
+void AnnotText::setOpen(GBool openA) {
+  Object obj1;
+
+  open = openA;
+  obj1.initBool(open);
+  update ("Open", &obj1);
+}
+
+void AnnotText::setIcon(GooString *new_icon) {
+  if (new_icon && icon->cmp(new_icon) == 0)
+    return;
+
+  delete icon;
+
+  if (new_icon) {
+    icon = new GooString (new_icon);
+  } else {
+    icon = new GooString("Note");
+  }
+
+  Object obj1;
+  obj1.initName (icon->getCString());
+  update("Name", &obj1);
+}
+
+#define ANNOT_TEXT_AP_NOTE                                                    \
+  "3.602 24 m 20.398 24 l 22.387 24 24 22.387 24 20.398 c 24 3.602 l 24\n"    \
+  "1.613 22.387 0 20.398 0 c 3.602 0 l 1.613 0 0 1.613 0 3.602 c 0 20.398\n"  \
+  "l 0 22.387 1.613 24 3.602 24 c h\n"                                        \
+  "3.602 24 m f\n"                                                            \
+  "0.533333 0.541176 0.521569 RG 2 w\n"                                       \
+  "1 J\n"                                                                     \
+  "1 j\n"                                                                     \
+  "[] 0.0 d\n"                                                                \
+  "4 M 9 18 m 4 18 l 4 7 4 4 6 3 c 20 3 l 18 4 18 7 18 18 c 17 18 l S\n"      \
+  "1.5 w\n"                                                                   \
+  "0 j\n"                                                                     \
+  "10 16 m 14 21 l S\n"                                                       \
+  "1.85625 w\n"                                                               \
+  "1 j\n"                                                                     \
+  "15.07 20.523 m 15.07 19.672 14.379 18.977 13.523 18.977 c 12.672 18.977\n" \
+  "11.977 19.672 11.977 20.523 c 11.977 21.379 12.672 22.07 13.523 22.07 c\n" \
+  "14.379 22.07 15.07 21.379 15.07 20.523 c h\n"                              \
+  "15.07 20.523 m S\n"                                                        \
+  "1 w\n"                                                                     \
+  "0 j\n"                                                                     \
+  "6.5 13.5 m 15.5 13.5 l S\n"                                                \
+  "6.5 10.5 m 13.5 10.5 l S\n"                                                \
+  "6.801 7.5 m 15.5 7.5 l S\n"                                                \
+  "0.729412 0.741176 0.713725 RG 2 w\n"                                       \
+  "1 j\n"                                                                     \
+  "9 19 m 4 19 l 4 8 4 5 6 4 c 20 4 l 18 5 18 8 18 19 c 17 19 l S\n"          \
+  "1.5 w\n"                                                                   \
+  "0 j\n"                                                                     \
+  "10 17 m 14 22 l S\n"                                                       \
+  "1.85625 w\n"                                                               \
+  "1 j\n"                                                                     \
+  "15.07 21.523 m 15.07 20.672 14.379 19.977 13.523 19.977 c 12.672 19.977\n" \
+  "11.977 20.672 11.977 21.523 c 11.977 22.379 12.672 23.07 13.523 23.07 c\n" \
+  "14.379 23.07 15.07 22.379 15.07 21.523 c h\n"                              \
+  "15.07 21.523 m S\n"                                                        \
+  "1 w\n"                                                                     \
+  "0 j\n"                                                                     \
+  "6.5 14.5 m 15.5 14.5 l S\n"                                                \
+  "6.5 11.5 m 13.5 11.5 l S\n"                                                \
+  "6.801 8.5 m 15.5 8.5 l S\n"
+
+#define ANNOT_TEXT_AP_COMMENT                                                   \
+  "4.301 23 m 19.699 23 l 21.523 23 23 21.523 23 19.699 c 23 4.301 l 23\n"      \
+  "2.477 21.523 1 19.699 1 c 4.301 1 l 2.477 1 1 2.477 1 4.301 c 1 19.699\n"    \
+  "l 1 21.523 2.477 23 4.301 23 c h\n"                                          \
+  "4.301 23 m f\n"                                                              \
+  "0.533333 0.541176 0.521569 RG 2 w\n"                                         \
+  "0 J\n"                                                                       \
+  "1 j\n"                                                                       \
+  "[] 0.0 d\n"                                                                  \
+  "4 M 8 20 m 16 20 l 18.363 20 20 18.215 20 16 c 20 13 l 20 10.785 18.363 9\n" \
+  "16 9 c 13 9 l 8 3 l 8 9 l 8 9 l 5.637 9 4 10.785 4 13 c 4 16 l 4 18.215\n"   \
+  "5.637 20 8 20 c h\n"                                                         \
+  "8 20 m S\n"                                                                  \
+  "0.729412 0.741176 0.713725 RG 8 21 m 16 21 l 18.363 21 20 19.215 20 17\n"    \
+  "c 20 14 l 20 11.785 18.363 10\n"                                             \
+  "16 10 c 13 10 l 8 4 l 8 10 l 8 10 l 5.637 10 4 11.785 4 14 c 4 17 l 4\n"     \
+  "19.215 5.637 21 8 21 c h\n"                                                  \
+  "8 21 m S\n"
+
+#define ANNOT_TEXT_AP_KEY                                                    \
+  "4.301 23 m 19.699 23 l 21.523 23 23 21.523 23 19.699 c 23 4.301 l 23\n"   \
+  "2.477 21.523 1 19.699 1 c 4.301 1 l 2.477 1 1 2.477 1 4.301 c 1 19.699\n" \
+  "l 1 21.523 2.477 23 4.301 23 c h\n"                                       \
+  "4.301 23 m f\n"                                                           \
+  "0.533333 0.541176 0.521569 RG 2 w\n"                                      \
+  "1 J\n"                                                                    \
+  "0 j\n"                                                                    \
+  "[] 0.0 d\n"                                                               \
+  "4 M 11.895 18.754 m 13.926 20.625 17.09 20.496 18.961 18.465 c 20.832\n"  \
+  "16.434 20.699 13.27 18.668 11.398 c 17.164 10.016 15.043 9.746 13.281\n"  \
+  "10.516 c 12.473 9.324 l 11.281 10.078 l 9.547 8.664 l 9.008 6.496 l\n"    \
+  "7.059 6.059 l 6.34 4.121 l 5.543 3.668 l 3.375 4.207 l 2.938 6.156 l\n"   \
+  "10.57 13.457 l 9.949 15.277 10.391 17.367 11.895 18.754 c h\n"            \
+  "11.895 18.754 m S\n"                                                      \
+  "1.5 w\n"                                                                  \
+  "16.059 15.586 m 16.523 15.078 17.316 15.043 17.824 15.512 c 18.332\n"     \
+  "15.98 18.363 16.77 17.895 17.277 c 17.43 17.785 16.637 17.816 16.129\n"   \
+  "17.352 c 15.621 16.883 15.59 16.094 16.059 15.586 c h\n"                  \
+  "16.059 15.586 m S\n"                                                      \
+  "0.729412 0.741176 0.713725 RG 2 w\n"                                      \
+  "11.895 19.754 m 13.926 21.625 17.09 21.496 18.961 19.465 c 20.832\n"      \
+  "17.434 20.699 14.27 18.668 12.398 c 17.164 11.016 15.043 10.746 13.281\n" \
+  "11.516 c 12.473 10.324 l 11.281 11.078 l 9.547 9.664 l 9.008 7.496 l\n"   \
+  "7.059 7.059 l 6.34 5.121 l 5.543 4.668 l 3.375 5.207 l 2.938 7.156 l\n"   \
+  "10.57 14.457 l 9.949 16.277 10.391 18.367 11.895 19.754 c h\n"            \
+  "11.895 19.754 m S\n"                                                      \
+  "1.5 w\n"                                                                  \
+  "16.059 16.586 m 16.523 16.078 17.316 16.043 17.824 16.512 c 18.332\n"     \
+  "16.98 18.363 17.77 17.895 18.277 c 17.43 18.785 16.637 18.816 16.129\n"   \
+  "18.352 c 15.621 17.883 15.59 17.094 16.059 16.586 c h\n"                  \
+  "16.059 16.586 m S\n"
+
+#define ANNOT_TEXT_AP_HELP                                                        \
+  "4.301 23 m 19.699 23 l 21.523 23 23 21.523 23 19.699 c 23 4.301 l 23\n"        \
+  "2.477 21.523 1 19.699 1 c 4.301 1 l 2.477 1 1 2.477 1 4.301 c 1 19.699\n"      \
+  "l 1 21.523 2.477 23 4.301 23 c h\n"                                            \
+  "4.301 23 m f\n"                                                                \
+  "0.533333 0.541176 0.521569 RG 2.5 w\n"                                         \
+  "1 J\n"                                                                         \
+  "1 j\n"                                                                         \
+  "[] 0.0 d\n"                                                                    \
+  "4 M 8.289 16.488 m 8.824 17.828 10.043 18.773 11.473 18.965 c 12.902 19.156\n" \
+  "14.328 18.559 15.195 17.406 c 16.062 16.254 16.242 14.723 15.664 13.398\n"     \
+  "c S\n"                                                                         \
+  "0 j\n"                                                                         \
+  "12 8 m 12 12 16 11 16 15 c S\n"                                                \
+  "1.539286 w\n"                                                                  \
+  "1 j\n"                                                                         \
+  "q 1 0 0 -0.999991 0 24 cm\n"                                                   \
+  "12.684 20.891 m 12.473 21.258 12.004 21.395 11.629 21.196 c 11.254\n"          \
+  "20.992 11.105 20.531 11.297 20.149 c 11.488 19.77 11.945 19.61 12.332\n"       \
+  "19.789 c 12.719 19.969 12.891 20.426 12.719 20.817 c S Q\n"                    \
+  "0.729412 0.741176 0.713725 RG 2.5 w\n"                                         \
+  "8.289 17.488 m 9.109 19.539 11.438 20.535 13.488 19.711 c 15.539 18.891\n"     \
+  "16.535 16.562 15.711 14.512 c 15.699 14.473 15.684 14.438 15.664 14.398\n"     \
+  "c S\n"                                                                         \
+  "0 j\n"                                                                         \
+  "12 9 m 12 13 16 12 16 16 c S\n"                                                \
+  "1.539286 w\n"                                                                  \
+  "1 j\n"                                                                         \
+  "q 1 0 0 -0.999991 0 24 cm\n"                                                   \
+  "12.684 19.891 m 12.473 20.258 12.004 20.395 11.629 20.195 c 11.254\n"          \
+  "19.992 11.105 19.531 11.297 19.149 c 11.488 18.77 11.945 18.61 12.332\n"       \
+  "18.789 c 12.719 18.969 12.891 19.426 12.719 19.817 c S Q\n"
+
+#define ANNOT_TEXT_AP_NEW_PARAGRAPH                                               \
+  "4.301 23 m 19.699 23 l 21.523 23 23 21.523 23 19.699 c 23 4.301 l 23\n"        \
+  "2.477 21.523 1 19.699 1 c 4.301 1 l 2.477 1 1 2.477 1 4.301 c 1 19.699\n"      \
+  "l 1 21.523 2.477 23 4.301 23 c h\n"                                            \
+  "4.301 23 m f\n"                                                                \
+  "0.533333 0.541176 0.521569 RG 4 w\n"                                           \
+  "0 J\n"                                                                         \
+  "2 j\n"                                                                         \
+  "[] 0.0 d\n"                                                                    \
+  "4 M q 1 0 0 -1 0 24 cm\n"                                                      \
+  "9.211 11.988 m 8.449 12.07 7.711 11.707 7.305 11.059 c 6.898 10.41\n"          \
+  "6.898 9.59 7.305 8.941 c 7.711 8.293 8.449 7.93 9.211 8.012 c S Q\n"           \
+  "1.004413 w\n"                                                                  \
+  "1 J\n"                                                                         \
+  "1 j\n"                                                                         \
+  "q 1 0 0 -0.991232 0 24 cm\n"                                                   \
+  "18.07 11.511 m 15.113 10.014 l 12.199 11.602 l 12.711 8.323 l 10.301\n"        \
+  "6.045 l 13.574 5.517 l 14.996 2.522 l 16.512 5.474 l 19.801 5.899 l\n"         \
+  "17.461 8.252 l 18.07 11.511 l h\n"                                             \
+  "18.07 11.511 m S Q\n"                                                          \
+  "2 w\n"                                                                         \
+  "0 j\n"                                                                         \
+  "11 17 m 10 17 l 10 3 l S\n"                                                    \
+  "14 3 m 14 13 l S\n"                                                            \
+  "0.729412 0.741176 0.713725 RG 4 w\n"                                           \
+  "0 J\n"                                                                         \
+  "2 j\n"                                                                         \
+  "q 1 0 0 -1 0 24 cm\n"                                                          \
+  "9.211 10.988 m 8.109 11.105 7.125 10.309 7.012 9.211 c 6.895 8.109\n"          \
+  "7.691 7.125 8.789 7.012 c 8.93 6.996 9.07 6.996 9.211 7.012 c S Q\n"           \
+  "1.004413 w\n"                                                                  \
+  "1 J\n"                                                                         \
+  "1 j\n"                                                                         \
+  "q 1 0 0 -0.991232 0 24 cm\n"                                                   \
+  "18.07 10.502 m 15.113 9.005 l 12.199 10.593 l 12.711 7.314 l 10.301\n"         \
+  "5.036 l 13.574 4.508 l 14.996 1.513 l 16.512 4.465 l 19.801 4.891 l\n"         \
+  "17.461 7.243 l 18.07 10.502 l h\n"                                             \
+  "18.07 10.502 m S Q\n"                                                          \
+  "2 w\n"                                                                         \
+  "0 j\n"                                                                         \
+  "11 18 m 10 18 l 10 4 l S\n"                                                    \
+  "14 4 m 14 14 l S\n"
+
+#define ANNOT_TEXT_AP_PARAGRAPH                                              \
+  "4.301 23 m 19.699 23 l 21.523 23 23 21.523 23 19.699 c 23 4.301 l 23\n"   \
+  "2.477 21.523 1 19.699 1 c 4.301 1 l 2.477 1 1 2.477 1 4.301 c 1 19.699\n" \
+  "l 1 21.523 2.477 23 4.301 23 c h\n"                                       \
+  "4.301 23 m f\n"                                                           \
+  "0.533333 0.541176 0.521569 RG 2 w\n"                                      \
+  "1 J\n"                                                                    \
+  "1 j\n"                                                                    \
+  "[] 0.0 d\n"                                                               \
+  "4 M 15 3 m 15 18 l 11 18 l 11 3 l S\n"                                    \
+  "4 w\n"                                                                    \
+  "q 1 0 0 -1 0 24 cm\n"                                                     \
+  "9.777 10.988 m 8.746 10.871 7.973 9.988 8 8.949 c 8.027 7.91 8.844\n"     \
+  "7.066 9.879 7.004 c S Q\n"                                                \
+  "0.729412 0.741176 0.713725 RG 2 w\n"                                      \
+  "15 4 m 15 19 l 11 19 l 11 4 l S\n"                                        \
+  "4 w\n"                                                                    \
+  "q 1 0 0 -1 0 24 cm\n"                                                     \
+  "9.777 9.988 m 8.746 9.871 7.973 8.988 8 7.949 c 8.027 6.91 8.844 6.066\n" \
+  "9.879 6.004 c S Q\n"
+
+#define ANNOT_TEXT_AP_INSERT                                                 \
+  "4.301 23 m 19.699 23 l 21.523 23 23 21.523 23 19.699 c 23 4.301 l 23\n"   \
+  "2.477 21.523 1 19.699 1 c 4.301 1 l 2.477 1 1 2.477 1 4.301 c 1 19.699\n" \
+  "l 1 21.523 2.477 23 4.301 23 c h\n"                                       \
+  "4.301 23 m f\n"                                                           \
+  "0.533333 0.541176 0.521569 RG 2 w\n"                                      \
+  "1 J\n"                                                                    \
+  "0 j\n"                                                                    \
+  "[] 0.0 d\n"                                                               \
+  "4 M 12 18.012 m 20 18 l S\n"                                              \
+  "9 10 m 17 10 l S\n"                                                       \
+  "12 14.012 m 20 14 l S\n"                                                  \
+  "12 6.012 m 20 6.012 l S\n"                                                \
+  "4 12 m 6 10 l 4 8 l S\n"                                                  \
+  "4 12 m 4 8 l S\n"                                                         \
+  "0.729412 0.741176 0.713725 RG 12 19.012 m 20 19 l S\n"                    \
+  "9 11 m 17 11 l S\n"                                                       \
+  "12 15.012 m 20 15 l S\n"                                                  \
+  "12 7.012 m 20 7.012 l S\n"                                                \
+  "4 13 m 6 11 l 4 9 l S\n"                                                  \
+  "4 13 m 4 9 l S\n"
+
+#define ANNOT_TEXT_AP_CROSS                                                  \
+  "4.301 23 m 19.699 23 l 21.523 23 23 21.523 23 19.699 c 23 4.301 l 23\n"   \
+  "2.477 21.523 1 19.699 1 c 4.301 1 l 2.477 1 1 2.477 1 4.301 c 1 19.699\n" \
+  "l 1 21.523 2.477 23 4.301 23 c h\n"                                       \
+  "4.301 23 m f\n"                                                           \
+  "0.533333 0.541176 0.521569 RG 2.5 w\n"                                    \
+  "1 J\n"                                                                    \
+  "0 j\n"                                                                    \
+  "[] 0.0 d\n"                                                               \
+  "4 M 18 5 m 6 17 l S\n"                                                    \
+  "6 5 m 18 17 l S\n"                                                        \
+  "0.729412 0.741176 0.713725 RG 18 6 m 6 18 l S\n"                          \
+  "6 6 m 18 18 l S\n"
+
+#define ANNOT_TEXT_AP_CIRCLE                                                      \
+  "4.301 23 m 19.699 23 l 21.523 23 23 21.523 23 19.699 c 23 4.301 l 23\n"        \
+  "2.477 21.523 1 19.699 1 c 4.301 1 l 2.477 1 1 2.477 1 4.301 c 1 19.699\n"      \
+  "l 1 21.523 2.477 23 4.301 23 c h\n"                                            \
+  "4.301 23 m f\n"                                                                \
+  "0.533333 0.541176 0.521569 RG 2.5 w\n"                                         \
+  "1 J\n"                                                                         \
+  "1 j\n"                                                                         \
+  "[] 0.0 d\n"                                                                    \
+  "4 M 19.5 11.5 m 19.5 7.359 16.141 4 12 4 c 7.859 4 4.5 7.359 4.5 11.5 c 4.5\n" \
+  "15.641 7.859 19 12 19 c 16.141 19 19.5 15.641 19.5 11.5 c h\n"                 \
+  "19.5 11.5 m S\n"                                                               \
+  "0.729412 0.741176 0.713725 RG 19.5 12.5 m 19.5 8.359 16.141 5 12 5 c\n"        \
+  "7.859 5 4.5 8.359 4.5 12.5 c 4.5\n"                                            \
+  "16.641 7.859 20 12 20 c 16.141 20 19.5 16.641 19.5 12.5 c h\n"                 \
+  "19.5 12.5 m S\n"
+
+void AnnotText::draw(Gfx *gfx, GBool printing) {
+  Object obj;
+  double ca = 1;
+
+  if (!isVisible (printing))
+    return;
+
+  if (appearance.isNull()) {
+    ca = opacity;
+
+    appearBuf = new GooString ();
+
+    appearBuf->append ("q\n");
+    if (color)
+      setColor(color, gTrue);
+    else
+      appearBuf->append ("1 1 1 rg\n");
+    if (!icon->cmp("Note"))
+      appearBuf->append (ANNOT_TEXT_AP_NOTE);
+    else if (!icon->cmp("Comment"))
+      appearBuf->append (ANNOT_TEXT_AP_COMMENT);
+    else if (!icon->cmp("Key"))
+      appearBuf->append (ANNOT_TEXT_AP_KEY);
+    else if (!icon->cmp("Help"))
+      appearBuf->append (ANNOT_TEXT_AP_HELP);
+    else if (!icon->cmp("NewParagraph"))
+      appearBuf->append (ANNOT_TEXT_AP_NEW_PARAGRAPH);
+    else if (!icon->cmp("Paragraph"))
+      appearBuf->append (ANNOT_TEXT_AP_PARAGRAPH);
+    else if (!icon->cmp("Insert"))
+      appearBuf->append (ANNOT_TEXT_AP_INSERT);
+    else if (!icon->cmp("Cross"))
+      appearBuf->append (ANNOT_TEXT_AP_CROSS);
+    else if (!icon->cmp("Circle"))
+      appearBuf->append (ANNOT_TEXT_AP_CIRCLE);
+    appearBuf->append ("Q\n");
+
+    // Force 24x24 rectangle
+    PDFRectangle fixedRect(rect->x1, rect->y1, rect->x1 + 24, rect->y1 + 24);
+    appearBBox = new AnnotAppearanceBBox(&fixedRect);
+    double bbox[4];
+    appearBBox->getBBoxRect(bbox);
+    if (ca == 1) {
+      createForm(bbox, gFalse, NULL, &appearance);
+    } else {
+      Object aStream, resDict;
+
+      createForm(bbox, gTrue, NULL, &aStream);
+      delete appearBuf;
+
+      appearBuf = new GooString ("/GS0 gs\n/Fm0 Do");
+      createResourcesDict("Fm0", &aStream, "GS0", ca, NULL, &resDict);
+      createForm(bbox, gFalse, &resDict, &appearance);
+    }
+    delete appearBuf;
+  }
+
+  // draw the appearance stream
+  appearance.fetch(xref, &obj);
+  if (appearBBox) {
+    gfx->drawAnnot(&obj, (AnnotBorder *)NULL, color,
+                   appearBBox->getPageXMin(), appearBBox->getPageYMin(),
+                   appearBBox->getPageXMax(), appearBBox->getPageYMax());
+  } else {
+    gfx->drawAnnot(&obj, (AnnotBorder *)NULL, color,
+                   rect->x1, rect->y1, rect->x2, rect->y2);
+  }
+  obj.free();
+}
+
+//------------------------------------------------------------------------
+// AnnotLink
+//------------------------------------------------------------------------
+AnnotLink::AnnotLink(PDFDoc *docA, PDFRectangle *rect) :
+    Annot(docA, rect) {
+  Object obj1;
+
+  type = typeLink;
+  annotObj.dictSet ("Subtype", obj1.initName ("Link"));
+  initialize (docA, annotObj.getDict());
+}
+
+AnnotLink::AnnotLink(PDFDoc *docA, Dict *dict, Object *obj) :
+    Annot(docA, dict, obj) {
+
+  type = typeLink;
+  initialize (docA, dict);
+}
+
+AnnotLink::~AnnotLink() {
+  delete action;
+  /*
+  if (uriAction)
+    delete uriAction;
+  */
+  if (quadrilaterals)
+    delete quadrilaterals;
+}
+
+void AnnotLink::initialize(PDFDoc *docA, Dict *dict) {
+  Object obj1;
+
+  action = NULL;
+
+  // look for destination
+  if (!dict->lookup("Dest", &obj1)->isNull()) {
+    action = LinkAction::parseDest(&obj1);
+  // look for action
+  } else {
+    obj1.free();
+    if (dict->lookup("A", &obj1)->isDict()) {
+      action = LinkAction::parseAction(&obj1, doc->getCatalog()->getBaseURI());
+    }
+  }
+  obj1.free();
+
+  if (dict->lookup("H", &obj1)->isName()) {
+    const char *effect = obj1.getName();
+
+    if (!strcmp(effect, "N")) {
+      linkEffect = effectNone;
+    } else if (!strcmp(effect, "I")) {
+      linkEffect = effectInvert;
+    } else if (!strcmp(effect, "O")) {
+      linkEffect = effectOutline;
+    } else if (!strcmp(effect, "P")) {
+      linkEffect = effectPush;
+    } else {
+      linkEffect = effectInvert;
+    }
+  } else {
+    linkEffect = effectInvert;
+  }
+  obj1.free();
+  /*
+  if (dict->lookup("PA", &obj1)->isDict()) {
+    uriAction = NULL;
+  } else {
+    uriAction = NULL;
+  }
+  obj1.free();
+  */
+  if (dict->lookup("QuadPoints", &obj1)->isArray()) {
+    quadrilaterals = new AnnotQuadrilaterals(obj1.getArray(), rect);
+  } else {
+    quadrilaterals = NULL;
+  }
+  obj1.free();
+}
+
+void AnnotLink::draw(Gfx *gfx, GBool printing) {
+  Object obj;
+
+  if (!isVisible (printing))
+    return;
+
+  // draw the appearance stream
+  appearance.fetch(xref, &obj);
+  gfx->drawAnnot(&obj, border, color,
+                rect->x1, rect->y1, rect->x2, rect->y2);
+  obj.free();
+}
+
+//------------------------------------------------------------------------
+// AnnotFreeText
+//------------------------------------------------------------------------
+AnnotFreeText::AnnotFreeText(PDFDoc *docA, PDFRectangle *rect, GooString *da) :
+    AnnotMarkup(docA, rect) {
+  Object obj1;
+
+  type = typeFreeText;
+
+  annotObj.dictSet ("Subtype", obj1.initName ("FreeText"));
+
+  Object obj2;
+  obj2.initString (da->copy());
+  annotObj.dictSet("DA", &obj2);
+
+  initialize (docA, annotObj.getDict());
+}
+
+AnnotFreeText::AnnotFreeText(PDFDoc *docA, Dict *dict, Object *obj) :
+    AnnotMarkup(docA, dict, obj) {
+  type = typeFreeText;
+  initialize(docA, dict);
+}
+
+AnnotFreeText::~AnnotFreeText() {
+  delete appearanceString;
+
+  if (styleString)
+    delete styleString;
+
+  if (calloutLine)
+    delete calloutLine;
+
+  if (borderEffect)
+    delete borderEffect;
+
+  if (rectangle)
+    delete rectangle;
+}
+
+void AnnotFreeText::initialize(PDFDoc *docA, Dict *dict) {
+  Object obj1;
+
+  if (dict->lookup("DA", &obj1)->isString()) {
+    appearanceString = obj1.getString()->copy();
+  } else {
+    appearanceString = new GooString();
+    error(errSyntaxError, -1, "Bad appearance for annotation");
+    ok = gFalse;
+  }
+  obj1.free();
+
+  if (dict->lookup("Q", &obj1)->isInt()) {
+    quadding = (AnnotFreeTextQuadding) obj1.getInt();
+  } else {
+    quadding = quaddingLeftJustified;
+  }
+  obj1.free();
+
+  if (dict->lookup("DS", &obj1)->isString()) {
+    styleString = obj1.getString()->copy();
+  } else {
+    styleString = NULL;
+  }
+  obj1.free();
+
+  if (dict->lookup("CL", &obj1)->isArray() && obj1.arrayGetLength() >= 4) {
+    double x1, y1, x2, y2;
+    Object obj2;
+
+    (obj1.arrayGet(0, &obj2)->isNum() ? x1 = obj2.getNum() : x1 = 0);
+    obj2.free();
+    (obj1.arrayGet(1, &obj2)->isNum() ? y1 = obj2.getNum() : y1 = 0);
+    obj2.free();
+    (obj1.arrayGet(2, &obj2)->isNum() ? x2 = obj2.getNum() : x2 = 0);
+    obj2.free();
+    (obj1.arrayGet(3, &obj2)->isNum() ? y2 = obj2.getNum() : y2 = 0);
+    obj2.free();
+
+    if (obj1.arrayGetLength() == 6) {
+      double x3, y3;
+      (obj1.arrayGet(4, &obj2)->isNum() ? x3 = obj2.getNum() : x3 = 0);
+      obj2.free();
+      (obj1.arrayGet(5, &obj2)->isNum() ? y3 = obj2.getNum() : y3 = 0);
+      obj2.free();
+      calloutLine = new AnnotCalloutMultiLine(x1, y1, x2, y2, x3, y3);
+    } else {
+      calloutLine = new AnnotCalloutLine(x1, y1, x2, y2);
+    }
+  } else {
+    calloutLine = NULL;
+  }
+  obj1.free();
+
+  if (dict->lookup("IT", &obj1)->isName()) {
+    const char *intentName = obj1.getName();
+
+    if (!strcmp(intentName, "FreeText")) {
+      intent = intentFreeText;
+    } else if (!strcmp(intentName, "FreeTextCallout")) {
+      intent = intentFreeTextCallout;
+    } else if (!strcmp(intentName, "FreeTextTypeWriter")) {
+      intent = intentFreeTextTypeWriter;
+    } else {
+      intent = intentFreeText;
+    }
+  } else {
+    intent = intentFreeText;
+  }
+  obj1.free();
+
+  if (dict->lookup("BE", &obj1)->isDict()) {
+    borderEffect = new AnnotBorderEffect(obj1.getDict());
+  } else {
+    borderEffect = NULL;
+  }
+  obj1.free();
+
+  if (dict->lookup("RD", &obj1)->isArray()) {
+    rectangle = parseDiffRectangle(obj1.getArray(), rect);
+  } else {
+    rectangle = NULL;
+  }
+  obj1.free();
+
+  if (dict->lookup("LE", &obj1)->isName()) {
+    GooString styleName(obj1.getName());
+    endStyle = parseAnnotLineEndingStyle(&styleName);
+  } else {
+    endStyle = annotLineEndingNone;
+  }
+  obj1.free();
+}
+
+void AnnotFreeText::setAppearanceString(GooString *new_string) {
+  delete appearanceString;
+
+  if (new_string) {
+    appearanceString = new GooString(new_string);
+  } else {
+    appearanceString = new GooString();
+  }
+
+  Object obj1;
+  obj1.initString(appearanceString->copy());
+  update ("DA", &obj1);
+}
+
+void AnnotFreeText::setQuadding(AnnotFreeTextQuadding new_quadding) {
+  Object obj1;
+  quadding = new_quadding;
+  obj1.initInt((int)quadding);
+  update ("Q", &obj1);
+}
+
+void AnnotFreeText::setStyleString(GooString *new_string) {
+  delete styleString;
+
+  if (new_string) {
+    styleString = new GooString(new_string);
+    //append the unicode marker <FE FF> if needed
+    if (!styleString->hasUnicodeMarker()) {
+      styleString->insert(0, 0xff);
+      styleString->insert(0, 0xfe);
+    }
+  } else {
+    styleString = new GooString();
+  }
+
+  Object obj1;
+  obj1.initString(styleString->copy());
+  update ("DS", &obj1);
+}
+
+void AnnotFreeText::setCalloutLine(AnnotCalloutLine *line) {
+  delete calloutLine;
+
+  Object obj1;
+  if (line == NULL) {
+    obj1.initNull();
+    calloutLine = NULL;
+  } else {
+    double x1 = line->getX1(), y1 = line->getY1();
+    double x2 = line->getX2(), y2 = line->getY2();
+    Object obj2;
+    obj1.initArray(xref);
+    obj1.arrayAdd( obj2.initReal(x1) );
+    obj1.arrayAdd( obj2.initReal(y1) );
+    obj1.arrayAdd( obj2.initReal(x2) );
+    obj1.arrayAdd( obj2.initReal(y2) );
+
+    AnnotCalloutMultiLine *mline = dynamic_cast<AnnotCalloutMultiLine*>(line);
+    if (mline) {
+      double x3 = mline->getX3(), y3 = mline->getY3();
+      obj1.arrayAdd( obj2.initReal(x3) );
+      obj1.arrayAdd( obj2.initReal(y3) );
+      calloutLine = new AnnotCalloutMultiLine(x1, y1, x2, y2, x3, y3);
+    } else {
+      calloutLine = new AnnotCalloutLine(x1, y1, x2, y2);
+    }
+  }
+
+  update("CL", &obj1);
+}
+
+void AnnotFreeText::setIntent(AnnotFreeTextIntent new_intent) {
+  Object obj1;
+
+  intent = new_intent;
+  if (new_intent == intentFreeText)
+    obj1.initName("FreeText");
+  else if (new_intent == intentFreeTextCallout)
+    obj1.initName("FreeTextCallout");
+  else // intentFreeTextTypeWriter
+    obj1.initName("FreeTextTypeWriter");
+  update ("IT", &obj1);
+}
+
+static GfxFont * createAnnotDrawFont(XRef * xref, Object *fontResDict)
+{
+  Ref dummyRef = { -1, -1 };
+
+  Object baseFontObj, subtypeObj, encodingObj;
+  baseFontObj.initName("Helvetica");
+  subtypeObj.initName("Type0");
+  encodingObj.initName("WinAnsiEncoding");
+
+  Object fontDictObj;
+  Dict *fontDict = new Dict(xref);
+  fontDict->decRef();
+  fontDict->add(copyString("BaseFont"), &baseFontObj);
+  fontDict->add(copyString("Subtype"), &subtypeObj);
+  fontDict->add(copyString("Encoding"), &encodingObj);
+  fontDictObj.initDict(fontDict);
+
+  Object fontsDictObj;
+  Dict *fontsDict = new Dict(xref);
+  fontsDict->decRef();
+  fontsDict->add(copyString("AnnotDrawFont"), &fontDictObj);
+  fontsDictObj.initDict(fontsDict);
+
+  Dict *dict = new Dict(xref);
+  dict->add(copyString("Font"), &fontsDictObj);
+
+  fontResDict->initDict(dict);
+  return GfxFont::makeFont(xref, "AnnotDrawFont", dummyRef, fontDict);
+}
+
+void AnnotFreeText::parseAppearanceString(GooString *da, double &fontsize, AnnotColor* &fontcolor) {
+  fontsize = -1;
+  fontcolor = NULL;
+  if (da) {
+    GooList * daToks = new GooList();
+    int j, i = 0;
+
+    // Tokenize
+    while (i < da->getLength()) {
+      while (i < da->getLength() && Lexer::isSpace(da->getChar(i))) {
+        ++i;
+      }
+      if (i < da->getLength()) {
+        for (j = i + 1; j < da->getLength() && !Lexer::isSpace(da->getChar(j)); ++j) {
+        }
+        daToks->append(new GooString(da, i, j - i));
+        i = j;
+      }
+    }
+
+    // Scan backwards: we are looking for the last set value
+    for (i = daToks->getLength()-1; i >= 0; --i) {
+      if (fontsize == -1) {
+        if (!((GooString *)daToks->get(i))->cmp("Tf") && i >= 2) {
+            // TODO: Font name
+            fontsize = gatof(( (GooString *)daToks->get(i-1) )->getCString());
+        }
+      }
+      if (fontcolor == NULL) {
+        if (!((GooString *)daToks->get(i))->cmp("g") && i >= 1) {
+          fontcolor = new AnnotColor(gatof(( (GooString *)daToks->get(i-1) )->getCString()));
+        } else if (!((GooString *)daToks->get(i))->cmp("rg") && i >= 3) {
+          fontcolor = new AnnotColor(gatof(( (GooString *)daToks->get(i-3) )->getCString()),
+                                     gatof(( (GooString *)daToks->get(i-2) )->getCString()),
+                                     gatof(( (GooString *)daToks->get(i-1) )->getCString()));
+        } else if (!((GooString *)daToks->get(i))->cmp("k") && i >= 4) {
+          fontcolor = new AnnotColor(gatof(( (GooString *)daToks->get(i-4) )->getCString()),
+                                     gatof(( (GooString *)daToks->get(i-3) )->getCString()),
+                                     gatof(( (GooString *)daToks->get(i-2) )->getCString()),
+                                     gatof(( (GooString *)daToks->get(i-1) )->getCString()));
+        }
+      }
+    }
+    deleteGooList(daToks, GooString);
+  }
+}
+
+void AnnotFreeText::generateFreeTextAppearance()
+{
+  double borderWidth, ca = opacity;
+
+  appearBuf = new GooString ();
+  appearBuf->append ("q\n");
+  
+  if (border) {
+    int i, dashLength;
+    double *dash;
+    borderWidth = border->getWidth();
+
+    switch (border->getStyle()) {
+    case AnnotBorder::borderDashed:
+      appearBuf->append("[");
+      dashLength = border->getDashLength();
+      dash = border->getDash();
+      for (i = 0; i < dashLength; ++i)
+        appearBuf->appendf(" {0:.2f}", dash[i]);
+      appearBuf->append(" ] 0 d\n");
+      break;
+    default:
+      appearBuf->append("[] 0 d\n");
+      break;
+    }
+    appearBuf->appendf("{0:.2f} w\n", borderWidth);
+  } else {
+    borderWidth = 0; // No border
+  }
+
+  // Box size
+  const double width = rect->x2 - rect->x1;
+  const double height = rect->y2 - rect->y1;
+
+  // Parse some properties from the appearance string
+  double fontsize;
+  AnnotColor *fontcolor;
+  parseAppearanceString(appearanceString, fontsize, fontcolor);
+  // Default values
+  if (fontsize <= 0)
+    fontsize = 10;
+  if (fontcolor == NULL)
+    fontcolor = new AnnotColor(0, 0, 0); // Black
+
+  // Draw box
+  GBool doFill = (color && color->getSpace() != AnnotColor::colorTransparent);
+  GBool doStroke = (borderWidth != 0);
+  if (doFill || doStroke) {
+    if (doStroke) {
+      setColor(fontcolor, gFalse); // Border color: same as font color
+    }
+    appearBuf->appendf ("{0:.2f} {0:.2f} {1:.2f} {2:.2f} re\n", borderWidth/2, width-borderWidth, height-borderWidth);
+    if (doFill) {
+      setColor(color, gTrue);
+      appearBuf->append(doStroke ? "B\n" : "f\n");
+    } else {
+      appearBuf->append("S\n");
+    }
+  }
+
+  // Setup text clipping
+  const double textmargin = borderWidth * 2;
+  const double textwidth = width - 2*textmargin;
+  appearBuf->appendf ("{0:.2f} {0:.2f} {1:.2f} {2:.2f} re W n\n", textmargin, textwidth, height - 2*textmargin);
+
+  Object fontResDict;
+  GfxFont *font = createAnnotDrawFont(xref, &fontResDict);
+
+  // Set font state
+  setColor(fontcolor, gTrue);
+  appearBuf->appendf ("BT 1 0 0 1 {0:.2f} {1:.2f} Tm\n", textmargin, height - textmargin - fontsize * font->getDescent());
+  appearBuf->appendf ("/AnnotDrawFont {0:.2f} Tf\n", fontsize);
+
+  int i = 0;
+  double xposPrev = 0;
+  while (i < contents->getLength()) {
+    GooString out;
+    double linewidth, xpos;
+    layoutText(contents, &out, &i, font, &linewidth, textwidth/fontsize, NULL, gFalse);
+    linewidth *= fontsize;
+    switch (quadding) {
+    case quaddingCentered:
+      xpos = (textwidth - linewidth) / 2;
+      break;
+    case quaddingRightJustified:
+      xpos = textwidth - linewidth;
+      break;
+    default: // quaddingLeftJustified:
+      xpos = 0;
+      break;
+    }
+    appearBuf->appendf("{0:.2f} {1:.2f} Td\n", xpos - xposPrev, -fontsize);
+    writeString(&out, appearBuf);
+    appearBuf->append("Tj\n");
+    xposPrev = xpos;
+  }
+
+  font->decRefCnt();
+  delete fontcolor;
+  appearBuf->append ("ET Q\n");
+
+  double bbox[4];
+  bbox[0] = bbox[1] = 0;
+  bbox[2] = rect->x2 - rect->x1;
+  bbox[3] = rect->y2 - rect->y1;
+
+  if (ca == 1) {
+    createForm(bbox, gFalse, &fontResDict, &appearance);
+  } else {
+    Object aStream, resDict;
+
+    createForm(bbox, gTrue, &fontResDict, &aStream);
+    delete appearBuf;
+
+    appearBuf = new GooString ("/GS0 gs\n/Fm0 Do");
+    createResourcesDict("Fm0", &aStream, "GS0", ca, NULL, &resDict);
+    createForm(bbox, gFalse, &resDict, &appearance);
+  }
+  delete appearBuf;
+}
+
+void AnnotFreeText::draw(Gfx *gfx, GBool printing) {
+  Object obj;
+
+  if (!isVisible (printing))
+    return;
+
+  if (appearance.isNull()) {
+    generateFreeTextAppearance();
+  }
+
+  // draw the appearance stream
+  appearance.fetch(xref, &obj);
+  gfx->drawAnnot(&obj, (AnnotBorder *)NULL, color,
+                 rect->x1, rect->y1, rect->x2, rect->y2);
+  obj.free();
+}
+
+// Before retrieving the res dict, regenerate the appearance stream if needed,
+// because AnnotFreeText::draw needs to store font info in the res dict
+Object *AnnotFreeText::getAppearanceResDict(Object *dest) {
+  if (appearance.isNull()) {
+    generateFreeTextAppearance();
+  }
+  return Annot::getAppearanceResDict(dest);
+}
+
+//------------------------------------------------------------------------
+// AnnotLine
+//------------------------------------------------------------------------
+
+AnnotLine::AnnotLine(PDFDoc *docA, PDFRectangle *rect, PDFRectangle *lRect) :
+    AnnotMarkup(docA, rect) {
+  Object obj1;
+
+  type = typeLine;
+  annotObj.dictSet ("Subtype", obj1.initName ("Line"));
+
+  Object obj2, obj3;
+  obj2.initArray (doc->getXRef());
+  obj2.arrayAdd (obj3.initReal (lRect->x1));
+  obj2.arrayAdd (obj3.initReal (lRect->y1));
+  obj2.arrayAdd (obj3.initReal (lRect->x2));
+  obj2.arrayAdd (obj3.initReal (lRect->y2));
+  annotObj.dictSet ("L", &obj2);
+
+  initialize (docA, annotObj.getDict());
+}
+
+AnnotLine::AnnotLine(PDFDoc *docA, Dict *dict, Object *obj) :
+    AnnotMarkup(docA, dict, obj) {
+  type = typeLine;
+  initialize(docA, dict);
+}
+
+AnnotLine::~AnnotLine() {
+  delete coord1;
+  delete coord2;
+
+  if (interiorColor)
+    delete interiorColor;
+
+  if (measure)
+    delete measure;
+}
+
+void AnnotLine::initialize(PDFDoc *docA, Dict *dict) {
+  Object obj1;
+
+  if (dict->lookup("L", &obj1)->isArray() && obj1.arrayGetLength() == 4) {
+    Object obj2;
+    double x1, y1, x2, y2;
+
+    (obj1.arrayGet(0, &obj2)->isNum() ? x1 = obj2.getNum() : x1 = 0);
+    obj2.free();
+    (obj1.arrayGet(1, &obj2)->isNum() ? y1 = obj2.getNum() : y1 = 0);
+    obj2.free();
+    (obj1.arrayGet(2, &obj2)->isNum() ? x2 = obj2.getNum() : x2 = 0);
+    obj2.free();
+    (obj1.arrayGet(3, &obj2)->isNum() ? y2 = obj2.getNum() : y2 = 0);
+    obj2.free();
+
+    coord1 = new AnnotCoord(x1, y1);
+    coord2 = new AnnotCoord(x2, y2);
+  } else {
+    coord1 = new AnnotCoord();
+    coord2 = new AnnotCoord();
+  }
+  obj1.free();
+
+  if (dict->lookup("LE", &obj1)->isArray() && obj1.arrayGetLength() == 2) {
+    Object obj2;
+
+    if(obj1.arrayGet(0, &obj2)->isString())
+      startStyle = parseAnnotLineEndingStyle(obj2.getString());
+    else
+      startStyle = annotLineEndingNone;
+    obj2.free();
+
+    if(obj1.arrayGet(1, &obj2)->isString())
+      endStyle = parseAnnotLineEndingStyle(obj2.getString());
+    else
+      endStyle = annotLineEndingNone;
+    obj2.free();
+
+  } else {
+    startStyle = endStyle = annotLineEndingNone;
+  }
+  obj1.free();
+
+  if (dict->lookup("IC", &obj1)->isArray()) {
+    interiorColor = new AnnotColor(obj1.getArray());
+  } else {
+    interiorColor = NULL;
+  }
+  obj1.free();
+
+  if (dict->lookup("LL", &obj1)->isNum()) {
+    leaderLineLength = obj1.getNum();
+  } else {
+    leaderLineLength = 0;
+  }
+  obj1.free();
+
+  if (dict->lookup("LLE", &obj1)->isNum()) {
+    leaderLineExtension = obj1.getNum();
+
+    if (leaderLineExtension < 0)
+      leaderLineExtension = 0;
+  } else {
+    leaderLineExtension = 0;
+  }
+  obj1.free();
+
+  if (dict->lookup("Cap", &obj1)->isBool()) {
+    caption = obj1.getBool();
+  } else {
+    caption = gFalse;
+  }
+  obj1.free();
+
+  if (dict->lookup("IT", &obj1)->isName()) {
+    const char *intentName = obj1.getName();
+
+    if(!strcmp(intentName, "LineArrow")) {
+      intent = intentLineArrow;
+    } else if(!strcmp(intentName, "LineDimension")) {
+      intent = intentLineDimension;
+    } else {
+      intent = intentLineArrow;
+    }
+  } else {
+    intent = intentLineArrow;
+  }
+  obj1.free();
+
+  if (dict->lookup("LLO", &obj1)->isNum()) {
+    leaderLineOffset = obj1.getNum();
+
+    if (leaderLineOffset < 0)
+      leaderLineOffset = 0;
+  } else {
+    leaderLineOffset = 0;
+  }
+  obj1.free();
+
+  if (dict->lookup("CP", &obj1)->isName()) {
+    const char *captionName = obj1.getName();
+
+    if(!strcmp(captionName, "Inline")) {
+      captionPos = captionPosInline;
+    } else if(!strcmp(captionName, "Top")) {
+      captionPos = captionPosTop;
+    } else {
+      captionPos = captionPosInline;
+    }
+  } else {
+    captionPos = captionPosInline;
+  }
+  obj1.free();
+
+  if (dict->lookup("Measure", &obj1)->isDict()) {
+    measure = NULL;
+  } else {
+    measure = NULL;
+  }
+  obj1.free();
+
+  if ((dict->lookup("CO", &obj1)->isArray()) && (obj1.arrayGetLength() == 2)) {
+    Object obj2;
+
+    (obj1.arrayGet(0, &obj2)->isNum() ? captionTextHorizontal = obj2.getNum() :
+      captionTextHorizontal = 0);
+    obj2.free();
+    (obj1.arrayGet(1, &obj2)->isNum() ? captionTextVertical = obj2.getNum() :
+      captionTextVertical = 0);
+    obj2.free();
+  } else {
+    captionTextHorizontal = captionTextVertical = 0;
+  }
+  obj1.free();
+}
+
+void AnnotLine::setVertices(double x1, double y1, double x2, double y2) {
+  Object obj1, obj2;
+
+  delete coord1;
+  coord1 = new AnnotCoord(x1, y1);
+  delete coord2;
+  coord2 = new AnnotCoord(x2, y2);
+
+  obj1.initArray(xref);
+  obj1.arrayAdd( obj2.initReal(x1) );
+  obj1.arrayAdd( obj2.initReal(y1) );
+  obj1.arrayAdd( obj2.initReal(x2) );
+  obj1.arrayAdd( obj2.initReal(y2) );
+
+  update("L", &obj1);
+}
+
+void AnnotLine::setStartEndStyle(AnnotLineEndingStyle start, AnnotLineEndingStyle end) {
+  Object obj1, obj2;
+
+  startStyle = start;
+  endStyle = end;
+
+  obj1.initArray(xref);
+  obj1.arrayAdd( obj2.initName(convertAnnotLineEndingStyle( startStyle )) );
+  obj1.arrayAdd( obj2.initName(convertAnnotLineEndingStyle( endStyle )) );
+
+  update("LE", &obj1);
+}
+
+void AnnotLine::setInteriorColor(AnnotColor *new_color) {
+  delete interiorColor;
+
+  if (new_color) {
+    Object obj1;
+    new_color->writeToObject(xref, &obj1);
+    update ("IC", &obj1);
+    interiorColor = new_color;
+  } else {
+    interiorColor = NULL;
+  }
+}
+
+void AnnotLine::setLeaderLineLength(double len) {
+  Object obj1;
+
+  leaderLineLength = len;
+  obj1.initReal(len);
+  update ("LL", &obj1);
+}
+
+void AnnotLine::setLeaderLineExtension(double len) {
+  Object obj1;
+
+  leaderLineExtension = len;
+  obj1.initReal(len);
+  update ("LLE", &obj1);
+
+  // LL is required if LLE is present
+  obj1.initReal(leaderLineLength);
+  update ("LL", &obj1);
+}
+
+void AnnotLine::setCaption(bool new_cap) {
+  Object obj1;
+
+  caption = new_cap;
+  obj1.initBool(new_cap);
+  update ("Cap", &obj1);
+}
+
+void AnnotLine::setIntent(AnnotLineIntent new_intent) {
+  Object obj1;
+
+  intent = new_intent;
+  if (new_intent == intentLineArrow)
+    obj1.initName("LineArrow");
+  else // intentLineDimension
+    obj1.initName("LineDimension");
+  update ("IT", &obj1);
+}
+
+void AnnotLine::generateLineAppearance()
+{
+  double borderWidth, ca = opacity;
+
+  appearBBox = new AnnotAppearanceBBox(rect);
+  appearBuf = new GooString ();
+  appearBuf->append ("q\n");
+  if (color) {
+    setColor(color, gFalse);
+  }
+
+  if (border) {
+    int i, dashLength;
+    double *dash;
+
+    switch (border->getStyle()) {
+    case AnnotBorder::borderDashed:
+      appearBuf->append("[");
+      dashLength = border->getDashLength();
+      dash = border->getDash();
+      for (i = 0; i < dashLength; ++i)
+        appearBuf->appendf(" {0:.2f}", dash[i]);
+      appearBuf->append(" ] 0 d\n");
+      break;
+    default:
+      appearBuf->append("[] 0 d\n");
+      break;
+    }
+    borderWidth = border->getWidth();
+    appearBuf->appendf("{0:.2f} w\n", borderWidth);
+    appearBBox->setBorderWidth(borderWidth);
+  } else {
+    borderWidth = 0;
+  }
+
+  const double x1 = coord1->getX();
+  const double y1 = coord1->getY();
+  const double x2 = coord2->getX();
+  const double y2 = coord2->getY();
+
+  // Main segment length
+  const double main_len = sqrt((x2-x1)*(x2-x1) + (y2-y1)*(y2-y1));
+
+  // Main segment becomes positive x direction, coord1 becomes (0,0)
+  Matrix matr;
+  const double angle = atan2(y2 - y1, x2 - x1);
+  matr.m[0] = matr.m[3] = cos(angle);
+  matr.m[1] = sin(angle);
+  matr.m[2] = -matr.m[1];
+  matr.m[4] = x1-rect->x1;
+  matr.m[5] = y1-rect->y1;
+
+  double tx, ty, captionwidth = 0, captionheight = 0;
+  AnnotLineCaptionPos actualCaptionPos = captionPos;
+  const double fontsize = 9;
+  const double captionhmargin = 2; // Left and right margin (inline caption only)
+  const double captionmaxwidth = main_len - 2 * captionhmargin;
+
+  Object fontResDict;
+  GfxFont *font;
+
+  // Calculate caption width and height
+  if (caption) {
+    font = createAnnotDrawFont(xref, &fontResDict);
+    int lines = 0;
+    int i = 0;
+    while (i < contents->getLength()) {
+      GooString out;
+      double linewidth;
+      layoutText(contents, &out, &i, font, &linewidth, 0, NULL, gFalse);
+      linewidth *= fontsize;
+      if (linewidth > captionwidth) {
+        captionwidth = linewidth;
+      }
+      ++lines;
+    }
+    captionheight = lines * fontsize;
+    // If text is longer than available space, turn into captionPosTop
+    if (captionwidth > captionmaxwidth) {
+      actualCaptionPos = captionPosTop;
+    }
+  } else {
+    fontResDict.initNull();
+    font = NULL;
+  }
+
+  // Draw main segment
+  matr.transform (0, leaderLineLength, &tx, &ty);
+  appearBuf->appendf ("{0:.2f} {1:.2f} m\n", tx, ty);
+  appearBBox->extendTo (tx, ty);
+
+  if (captionwidth != 0 && actualCaptionPos == captionPosInline) { // Break in the middle
+    matr.transform ((main_len-captionwidth)/2 - captionhmargin, leaderLineLength, &tx, &ty);
+    appearBuf->appendf ("{0:.2f} {1:.2f} l S\n", tx, ty);
+
+    matr.transform ((main_len+captionwidth)/2 + captionhmargin, leaderLineLength, &tx, &ty);
+    appearBuf->appendf ("{0:.2f} {1:.2f} m\n", tx, ty);
+  }
+
+  matr.transform (main_len, leaderLineLength, &tx, &ty);
+  appearBuf->appendf ("{0:.2f} {1:.2f} l S\n", tx, ty);
+  appearBBox->extendTo (tx, ty);
+
+  // TODO: Line endings
+
+  // Draw caption text
+  if (caption) {
+    double tlx = (main_len - captionwidth) / 2, tly; // Top-left coords
+    if (actualCaptionPos == captionPosInline) {
+      tly = leaderLineLength + captionheight / 2;
+    } else {
+      tly = leaderLineLength + captionheight + 2*borderWidth;
+    }
+
+    tlx += captionTextHorizontal;
+    tly += captionTextVertical;
+
+    // Adjust bounding box
+    matr.transform (tlx, tly-captionheight, &tx, &ty);
+    appearBBox->extendTo (tx, ty);
+    matr.transform (tlx+captionwidth, tly-captionheight, &tx, &ty);
+    appearBBox->extendTo (tx, ty);
+    matr.transform (tlx+captionwidth, tly, &tx, &ty);
+    appearBBox->extendTo (tx, ty);
+    matr.transform (tlx, tly, &tx, &ty);
+    appearBBox->extendTo (tx, ty);
+
+    // Setup text state (reusing transformed top-left coord)
+    appearBuf->appendf ("0 g BT /AnnotDrawFont {0:.2f} Tf\n", fontsize); // Font color: black
+    appearBuf->appendf ("{0:.2f} {1:.2f} {2:.2f} {3:.2f} {4:.2f} {5:.2f} Tm\n",
+                        matr.m[0], matr.m[1], matr.m[2], matr.m[3], tx, ty);
+    appearBuf->appendf ("0 {0:.2f} Td\n",  -fontsize * font->getDescent());
+    // Draw text
+    int i = 0;
+    double xposPrev = 0;
+    while (i < contents->getLength()) {
+      GooString out;
+      double linewidth, xpos;
+      layoutText(contents, &out, &i, font, &linewidth, 0, NULL, gFalse);
+      linewidth *= fontsize;
+      xpos = (captionwidth - linewidth) / 2;
+      appearBuf->appendf("{0:.2f} {1:.2f} Td\n", xpos - xposPrev, -fontsize);
+      writeString(&out, appearBuf);
+      appearBuf->append ("Tj\n");
+      xposPrev = xpos;
+    }
+    appearBuf->append ("ET\n");
+    font->decRefCnt();
+  }
+
+  // Draw leader lines
+  double ll_len = fabs(leaderLineLength) + leaderLineExtension;
+  double sign = leaderLineLength >= 0 ? 1 : -1;
+  if (ll_len != 0) {
+    matr.transform (0, 0, &tx, &ty);
+    appearBuf->appendf ("{0:.2f} {1:.2f} m\n", tx, ty);
+    appearBBox->extendTo (tx, ty);
+    matr.transform (0, sign*ll_len, &tx, &ty);
+    appearBuf->appendf ("{0:.2f} {1:.2f} l S\n", tx, ty);
+    appearBBox->extendTo (tx, ty);
+
+    matr.transform (main_len, 0, &tx, &ty);
+    appearBuf->appendf ("{0:.2f} {1:.2f} m\n", tx, ty);
+    appearBBox->extendTo (tx, ty);
+    matr.transform (main_len, sign*ll_len, &tx, &ty);
+    appearBuf->appendf ("{0:.2f} {1:.2f} l S\n", tx, ty);
+    appearBBox->extendTo (tx, ty);
+  }
+
+  appearBuf->append ("Q\n");
+
+  double bbox[4];
+  appearBBox->getBBoxRect(bbox);
+  if (ca == 1) {
+    createForm(bbox, gFalse, &fontResDict, &appearance);
+  } else {
+    Object aStream, resDict;
+
+    createForm(bbox, gTrue, &fontResDict, &aStream);
+    delete appearBuf;
+
+    appearBuf = new GooString ("/GS0 gs\n/Fm0 Do");
+    createResourcesDict("Fm0", &aStream, "GS0", ca, NULL, &resDict);
+    createForm(bbox, gFalse, &resDict, &appearance);
+  }
+  delete appearBuf;
+}
+
+void AnnotLine::draw(Gfx *gfx, GBool printing) {
+  Object obj;
+
+  if (!isVisible (printing))
+    return;
+
+  if (appearance.isNull()) {
+    generateLineAppearance();
+  }
+
+  // draw the appearance stream
+  appearance.fetch(xref, &obj);
+  if (appearBBox) {
+    gfx->drawAnnot(&obj, (AnnotBorder *)NULL, color,
+                   appearBBox->getPageXMin(), appearBBox->getPageYMin(),
+                   appearBBox->getPageXMax(), appearBBox->getPageYMax());
+  } else {
+    gfx->drawAnnot(&obj, (AnnotBorder *)NULL, color,
+                   rect->x1, rect->y1, rect->x2, rect->y2);
+  }
+  obj.free();
+}
+
+// Before retrieving the res dict, regenerate the appearance stream if needed,
+// because AnnotLine::draw may need to store font info in the res dict
+Object *AnnotLine::getAppearanceResDict(Object *dest) {
+  if (appearance.isNull()) {
+    generateLineAppearance();
+  }
+  return Annot::getAppearanceResDict(dest);
+}
+
+//------------------------------------------------------------------------
+// AnnotTextMarkup
+//------------------------------------------------------------------------
+AnnotTextMarkup::AnnotTextMarkup(PDFDoc *docA, PDFRectangle *rect, AnnotSubtype subType,
+                                AnnotQuadrilaterals *quadPoints) :
+    AnnotMarkup(docA, rect) {
+  Object obj1;
+
+  switch (subType) {
+    case typeHighlight:
+      annotObj.dictSet ("Subtype", obj1.initName ("Highlight"));
+      break;
+    case typeUnderline:
+      annotObj.dictSet ("Subtype", obj1.initName ("Underline"));
+      break;
+    case typeSquiggly:
+      annotObj.dictSet ("Subtype", obj1.initName ("Squiggly"));
+      break;
+    case typeStrikeOut:
+      annotObj.dictSet ("Subtype", obj1.initName ("StrikeOut"));
+      break;
+    default:
+      assert (0 && "Invalid subtype for AnnotTextMarkup\n");
+  }
+
+  Object obj2;
+  obj2.initArray (doc->getXRef());
+
+  for (int i = 0; i < quadPoints->getQuadrilateralsLength(); ++i) {
+    Object obj3;
+
+    obj2.arrayAdd (obj3.initReal (quadPoints->getX1(i)));
+    obj2.arrayAdd (obj3.initReal (quadPoints->getY1(i)));
+    obj2.arrayAdd (obj3.initReal (quadPoints->getX2(i)));
+    obj2.arrayAdd (obj3.initReal (quadPoints->getY2(i)));
+    obj2.arrayAdd (obj3.initReal (quadPoints->getX3(i)));
+    obj2.arrayAdd (obj3.initReal (quadPoints->getY3(i)));
+    obj2.arrayAdd (obj3.initReal (quadPoints->getX4(i)));
+    obj2.arrayAdd (obj3.initReal (quadPoints->getY4(i)));
+  }
+
+  annotObj.dictSet ("QuadPoints", &obj2);
+
+  initialize(docA, annotObj.getDict());
+}
+
+AnnotTextMarkup::AnnotTextMarkup(PDFDoc *docA, Dict *dict, Object *obj) :
+  AnnotMarkup(docA, dict, obj) {
+  // the real type will be read in initialize()
+  type = typeHighlight;
+  initialize(docA, dict);
+}
+
+void AnnotTextMarkup::initialize(PDFDoc *docA, Dict *dict) {
+  Object obj1;
+
+  if (dict->lookup("Subtype", &obj1)->isName()) {
+    GooString typeName(obj1.getName());
+    if (!typeName.cmp("Highlight")) {
+      type = typeHighlight;
+    } else if (!typeName.cmp("Underline")) {
+      type = typeUnderline;
+    } else if (!typeName.cmp("Squiggly")) {
+      type = typeSquiggly;
+    } else if (!typeName.cmp("StrikeOut")) {
+      type = typeStrikeOut;
+    }
+  }
+  obj1.free();
+
+  if(dict->lookup("QuadPoints", &obj1)->isArray()) {
+    quadrilaterals = new AnnotQuadrilaterals(obj1.getArray(), rect);
+  } else {
+    error(errSyntaxError, -1, "Bad Annot Text Markup QuadPoints");
+    quadrilaterals = NULL;
+    ok = gFalse;
+  }
+  obj1.free();
+}
+
+AnnotTextMarkup::~AnnotTextMarkup() {
+  if(quadrilaterals) {
+    delete quadrilaterals;
+  }
+}
+
+void AnnotTextMarkup::setType(AnnotSubtype new_type) {
+  Object obj1;
+
+  switch (new_type) {
+    case typeHighlight:
+      obj1.initName("Highlight");
+      break;
+    case typeUnderline:
+      obj1.initName("Underline");
+      break;
+    case typeSquiggly:
+      obj1.initName("Squiggly");
+      break;
+    case typeStrikeOut:
+      obj1.initName("StrikeOut");
+      break;
+    default:
+      assert(!"Invalid subtype");
+  }
+
+  type = new_type;
+  update("Subtype", &obj1);
+}
+
+void AnnotTextMarkup::setQuadrilaterals(AnnotQuadrilaterals *quadPoints) {
+  Object obj1, obj2;
+  obj1.initArray (xref);
+
+  for (int i = 0; i < quadPoints->getQuadrilateralsLength(); ++i) {
+    obj1.arrayAdd (obj2.initReal (quadPoints->getX1(i)));
+    obj1.arrayAdd (obj2.initReal (quadPoints->getY1(i)));
+    obj1.arrayAdd (obj2.initReal (quadPoints->getX2(i)));
+    obj1.arrayAdd (obj2.initReal (quadPoints->getY2(i)));
+    obj1.arrayAdd (obj2.initReal (quadPoints->getX3(i)));
+    obj1.arrayAdd (obj2.initReal (quadPoints->getY3(i)));
+    obj1.arrayAdd (obj2.initReal (quadPoints->getX4(i)));
+    obj1.arrayAdd (obj2.initReal (quadPoints->getY4(i)));
+  }
+
+  quadrilaterals = new AnnotQuadrilaterals(obj1.getArray(), rect);
+
+  annotObj.dictSet ("QuadPoints", &obj1);
+}
+
+void AnnotTextMarkup::draw(Gfx *gfx, GBool printing) {
+  Object obj;
+  double ca = 1;
+  int i;
+  Object obj1, obj2;
+
+  if (!isVisible (printing))
+    return;
+
+  if (appearance.isNull() || type == typeHighlight) {
+    GBool blendMultiply = gTrue;
+    ca = opacity;
+
+    appearBuf = new GooString ();
+    appearBuf->append ("q\n");
+
+    /* Adjust BBox */
+    delete appearBBox;
+    appearBBox = new AnnotAppearanceBBox(rect);
+    for (i = 0; i < quadrilaterals->getQuadrilateralsLength(); ++i) {
+      appearBBox->extendTo (quadrilaterals->getX1(i) - rect->x1, quadrilaterals->getY1(i) - rect->y1);
+      appearBBox->extendTo (quadrilaterals->getX2(i) - rect->x1, quadrilaterals->getY2(i) - rect->y1);
+      appearBBox->extendTo (quadrilaterals->getX3(i) - rect->x1, quadrilaterals->getY3(i) - rect->y1);
+      appearBBox->extendTo (quadrilaterals->getX4(i) - rect->x1, quadrilaterals->getY4(i) - rect->y1);
+    }
+
+    switch (type) {
+    case typeUnderline:
+      if (color) {
+        setColor(color, gFalse);
+      }
+      appearBuf->append ("[] 0 d 1 w\n");
+
+      for (i = 0; i < quadrilaterals->getQuadrilateralsLength(); ++i) {
+        double x1, x2, y3;
+
+       x1 = quadrilaterals->getX1(i);
+       x2 = quadrilaterals->getX2(i);
+       y3 = quadrilaterals->getY3(i);
+
+       appearBuf->appendf ("{0:.2f} {1:.2f} m\n", x1, y3);
+       appearBuf->appendf ("{0:.2f} {1:.2f} l\n", x2, y3);
+       appearBuf->append ("S\n");
+      }
+      break;
+    case typeStrikeOut:
+      if (color) {
+        setColor(color, gFalse);
+      }
+      blendMultiply = gFalse;
+      appearBuf->append ("[] 0 d 1 w\n");
+
+      for (i = 0; i < quadrilaterals->getQuadrilateralsLength(); ++i) {
+        double x1, y1, x2, y3;
+       double h2;
+
+       x1 = quadrilaterals->getX1(i);
+       y1 = quadrilaterals->getY1(i);
+       x2 = quadrilaterals->getX2(i);
+       y3 = quadrilaterals->getY3(i);
+       h2 = (y1 - y3) / 2.0;
+
+       appearBuf->appendf ("{0:.2f} {1:.2f} m\n", x1, y3+h2);
+       appearBuf->appendf ("{0:.2f} {1:.2f} l\n", x2, y3+h2);
+       appearBuf->append ("S\n");
+      }
+      break;
+    case typeSquiggly:
+      if (color) {
+        setColor(color, gFalse);
+      }
+      appearBuf->append ("[] 0 d 1 w\n");
+
+      for (i = 0; i < quadrilaterals->getQuadrilateralsLength(); ++i) {
+        double x1, y1, x2, y3;
+        double h6;
+
+        x1 = quadrilaterals->getX1(i);
+        y1 = quadrilaterals->getY1(i);
+        x2 = quadrilaterals->getX2(i);
+        y3 = quadrilaterals->getY3(i);
+        h6 = (y1 - y3) / 6.0;
+
+        appearBuf->appendf ("{0:.2f} {1:.2f} m\n", x1, y3+h6);
+        bool down = false;
+        do {
+          down = !down; // Zigzag line
+          x1 += 2;
+          appearBuf->appendf ("{0:.2f} {1:.2f} l\n", x1, y3 + (down ? 0 : h6));
+        } while (x1 < x2);
+        appearBuf->append ("S\n");
+      }
+      break;
+    default:
+    case typeHighlight:
+      appearance.free();
+
+      if (color)
+        setColor(color, gTrue);
+
+      double biggestBorder = 0;
+      for (i = 0; i < quadrilaterals->getQuadrilateralsLength(); ++i) {
+        double x1, y1, x2, y2, x3, y3, x4, y4;
+       double h4;
+
+       x1 = quadrilaterals->getX1(i);
+       y1 = quadrilaterals->getY1(i);
+       x2 = quadrilaterals->getX2(i);
+       y2 = quadrilaterals->getY2(i);
+       x3 = quadrilaterals->getX3(i);
+       y3 = quadrilaterals->getY3(i);
+       x4 = quadrilaterals->getX4(i);
+       y4 = quadrilaterals->getY4(i);
+       h4 = fabs(y1 - y3) / 4.0;
+
+       if (h4 > biggestBorder) {
+         biggestBorder = h4;
+       }
+
+       appearBuf->appendf ("{0:.2f} {1:.2f} m\n", x3, y3);
+       appearBuf->appendf ("{0:.2f} {1:.2f} {2:.2f} {3:.2f} {4:.2f} {5:.2f} c\n",
+                           x3 - h4, y3 + h4, x1 - h4, y1 - h4, x1, y1);
+       appearBuf->appendf ("{0:.2f} {1:.2f} l\n", x2, y2);
+       appearBuf->appendf ("{0:.2f} {1:.2f} {2:.2f} {3:.2f} {4:.2f} {5:.2f} c\n",
+                           x2 + h4, y2 - h4, x4 + h4, y4 + h4, x4, y4);
+       appearBuf->append ("f\n");
+      }
+      appearBBox->setBorderWidth(biggestBorder);
+      break;
+    }
+    appearBuf->append ("Q\n");
+
+    Object aStream, resDict;
+    double bbox[4];
+    bbox[0] = appearBBox->getPageXMin();
+    bbox[1] = appearBBox->getPageYMin();
+    bbox[2] = appearBBox->getPageXMax();
+    bbox[3] = appearBBox->getPageYMax();
+    createForm(bbox, gTrue, NULL, &aStream);
+    delete appearBuf;
+
+    appearBuf = new GooString ("/GS0 gs\n/Fm0 Do");
+    createResourcesDict("Fm0", &aStream, "GS0", 1, blendMultiply ? "Multiply" : NULL, &resDict);
+    if (ca == 1) {
+      createForm(bbox, gFalse, &resDict, &appearance);
+    } else {
+      createForm(bbox, gTrue, &resDict, &aStream);
+      delete appearBuf;
+
+      appearBuf = new GooString ("/GS0 gs\n/Fm0 Do");
+      createResourcesDict("Fm0", &aStream, "GS0", ca, NULL, &resDict);
+      createForm(bbox, gFalse, &resDict, &appearance);
+    }
+    delete appearBuf;
+  }
+
+  // draw the appearance stream
+  appearance.fetch(xref, &obj);
+  if (appearBBox) {
+    gfx->drawAnnot(&obj, (AnnotBorder *)NULL, color,
+                   appearBBox->getPageXMin(), appearBBox->getPageYMin(),
+                   appearBBox->getPageXMax(), appearBBox->getPageYMax());
+  } else {
+    gfx->drawAnnot(&obj, (AnnotBorder *)NULL, color,
+                   rect->x1, rect->y1, rect->x2, rect->y2);
+  }
+  obj.free();
+}
+
+//------------------------------------------------------------------------
+// AnnotWidget
+//------------------------------------------------------------------------
+
+AnnotWidget::AnnotWidget(PDFDoc *docA, Dict *dict, Object *obj) :
+    Annot(docA, dict, obj) {
+  type = typeWidget;
+  field = NULL;
+  initialize(docA, dict);
+}
+
+AnnotWidget::AnnotWidget(PDFDoc *docA, Dict *dict, Object *obj, FormField *fieldA) :
+    Annot(docA, dict, obj) {
+  type = typeWidget;
+  field = fieldA;
+  initialize(docA, dict);
+}
+
+AnnotWidget::~AnnotWidget() {
+  if (appearCharacs)
+    delete appearCharacs;
+  
+  if (action)
+    delete action;
+    
+  if (additionActions)
+    delete additionActions;
+    
+  if (parent)
+    delete parent;
+}
+
+void AnnotWidget::initialize(PDFDoc *docA, Dict *dict) {
+  Object obj1;
+
+  form = doc->getCatalog()->getForm();
+
+  if(dict->lookup("H", &obj1)->isName()) {
+    const char *modeName = obj1.getName();
+
+    if(!strcmp(modeName, "N")) {
+      mode = highlightModeNone;
+    } else if(!strcmp(modeName, "O")) {
+      mode = highlightModeOutline;
+    } else if(!strcmp(modeName, "P") || !strcmp(modeName, "T")) {
+      mode = highlightModePush;
+    } else {
+      mode = highlightModeInvert;
+    }
+  } else {
+    mode = highlightModeInvert;
+  }
+  obj1.free();
+
+  if(dict->lookup("MK", &obj1)->isDict()) {
+    appearCharacs = new AnnotAppearanceCharacs(obj1.getDict());
+  } else {
+    appearCharacs = NULL;
+  }
+  obj1.free();
+
+  action = NULL;
+  if(dict->lookup("A", &obj1)->isDict()) {
+    action = LinkAction::parseAction(&obj1, doc->getCatalog()->getBaseURI());
+  }
+  obj1.free();
+
+  if(dict->lookup("AA", &obj1)->isDict()) {
+    additionActions = NULL;
+  } else {
+    additionActions = NULL;
+  }
+  obj1.free();
+
+  if(dict->lookup("Parent", &obj1)->isDict()) {
+    parent = NULL;
+  } else {
+    parent = NULL;
+  }
+  obj1.free();
+}
+
+// Grand unified handler for preparing text strings to be drawn into form
+// fields.  Takes as input a text string (in PDFDocEncoding or UTF-16).
+// Converts some or all of this string to the appropriate encoding for the
+// specified font, and computes the width of the text.  Can optionally stop
+// converting when a specified width has been reached, to perform line-breaking
+// for multi-line fields.
+//
+// Parameters:
+//   text: input text string to convert
+//   outBuf: buffer for writing re-encoded string
+//   i: index at which to start converting; will be updated to point just after
+//      last character processed
+//   font: the font which will be used for display
+//   width: computed width (unscaled by font size) will be stored here
+//   widthLimit: if non-zero, stop converting to keep width under this value
+//      (should be scaled down by font size)
+//   charCount: count of number of characters will be stored here
+//   noReencode: if set, do not try to translate the character encoding
+//      (useful for Zapf Dingbats or other unusual encodings)
+//      can only be used with simple fonts, not CID-keyed fonts
+//
+// TODO: Handle surrogate pairs in UTF-16.
+//       Should be able to generate output for any CID-keyed font.
+//       Doesn't handle vertical fonts--should it?
+void Annot::layoutText(GooString *text, GooString *outBuf, int *i,
+                             GfxFont *font, double *width, double widthLimit,
+                             int *charCount, GBool noReencode)
+{
+  CharCode c;
+  Unicode uChar, *uAux;
+  double w = 0.0;
+  int uLen, n;
+  double dx, dy, ox, oy;
+  GBool unicode = text->hasUnicodeMarker();
+  GBool spacePrev;              // previous character was a space
+
+  // State for backtracking when more text has been processed than fits within
+  // widthLimit.  We track for both input (text) and output (outBuf) the offset
+  // to the first character to discard.
+  //
+  // We keep track of several points:
+  //   1 - end of previous completed word which fits
+  //   2 - previous character which fit
+  int last_i1, last_i2, last_o1, last_o2;
+
+  if (unicode && text->getLength() % 2 != 0) {
+    error(errSyntaxError, -1, "AnnotWidget::layoutText, bad unicode string");
+    return;
+  }
+
+  // skip Unicode marker on string if needed
+  if (unicode && *i == 0)
+    *i = 2;
+
+  // Start decoding and copying characters, until either:
+  //   we reach the end of the string
+  //   we reach the maximum width
+  //   we reach a newline character
+  // As we copy characters, keep track of the last full word to fit, so that we
+  // can backtrack if we exceed the maximum width.
+  last_i1 = last_i2 = *i;
+  last_o1 = last_o2 = 0;
+  spacePrev = gFalse;
+  outBuf->clear();
+
+  while (*i < text->getLength()) {
+    last_i2 = *i;
+    last_o2 = outBuf->getLength();
+
+    if (unicode) {
+      uChar = (unsigned char)(text->getChar(*i)) << 8;
+      uChar += (unsigned char)(text->getChar(*i + 1));
+      *i += 2;
+    } else {
+      if (noReencode)
+        uChar = text->getChar(*i) & 0xff;
+      else
+        uChar = pdfDocEncoding[text->getChar(*i) & 0xff];
+      *i += 1;
+    }
+
+    // Explicit line break?
+    if (uChar == '\r' || uChar == '\n') {
+      // Treat a <CR><LF> sequence as a single line break
+      if (uChar == '\r' && *i < text->getLength()) {
+        if (unicode && text->getChar(*i) == '\0'
+            && text->getChar(*i + 1) == '\n')
+          *i += 2;
+        else if (!unicode && text->getChar(*i) == '\n')
+          *i += 1;
+      }
+
+      break;
+    }
+
+    if (noReencode) {
+      outBuf->append(uChar);
+    } else {
+      CharCodeToUnicode *ccToUnicode = font->getToUnicode();
+      if (!ccToUnicode) {
+        // This assumes an identity CMap.
+        outBuf->append((uChar >> 8) & 0xff);
+        outBuf->append(uChar & 0xff);
+      } else if (ccToUnicode->mapToCharCode(&uChar, &c, 1)) {
+        ccToUnicode->decRefCnt();
+        if (font->isCIDFont()) {
+          // TODO: This assumes an identity CMap.  It should be extended to
+          // handle the general case.
+          outBuf->append((c >> 8) & 0xff);
+          outBuf->append(c & 0xff);
+        } else {
+          // 8-bit font
+          outBuf->append(c);
+        }
+      } else {
+        ccToUnicode->decRefCnt();
+        fprintf(stderr,
+                "warning: layoutText: cannot convert U+%04X\n", uChar);
+      }
+    }
+
+    // If we see a space, then we have a linebreak opportunity.
+    if (uChar == ' ') {
+      last_i1 = *i;
+      if (!spacePrev)
+        last_o1 = last_o2;
+      spacePrev = gTrue;
+    } else {
+      spacePrev = gFalse;
+    }
+
+    // Compute width of character just output
+    if (outBuf->getLength() > last_o2) {
+      dx = 0.0;
+      font->getNextChar(outBuf->getCString() + last_o2,
+                        outBuf->getLength() - last_o2,
+                        &c, &uAux, &uLen, &dx, &dy, &ox, &oy);
+      w += dx;
+    }
+
+    // Current line over-full now?
+    if (widthLimit > 0.0 && w > widthLimit) {
+      if (last_o1 > 0) {
+        // Back up to the previous word which fit, if there was a previous
+        // word.
+        *i = last_i1;
+        outBuf->del(last_o1, outBuf->getLength() - last_o1);
+      } else if (last_o2 > 0) {
+        // Otherwise, back up to the previous character (in the only word on
+        // this line)
+        *i = last_i2;
+        outBuf->del(last_o2, outBuf->getLength() - last_o2);
+      } else {
+        // Otherwise, we were trying to fit the first character; include it
+        // anyway even if it overflows the space--no updates to make.
+      }
+      break;
+    }
+  }
+
+  // If splitting input into lines because we reached the width limit, then
+  // consume any remaining trailing spaces that would go on this line from the
+  // input.  If in doing so we reach a newline, consume that also.  This code
+  // won't run if we stopped at a newline above, since in that case w <=
+  // widthLimit still.
+  if (widthLimit > 0.0 && w > widthLimit) {
+    if (unicode) {
+      while (*i < text->getLength()
+             && text->getChar(*i) == '\0' && text->getChar(*i + 1) == ' ')
+        *i += 2;
+      if (*i < text->getLength()
+          && text->getChar(*i) == '\0' && text->getChar(*i + 1) == '\r')
+        *i += 2;
+      if (*i < text->getLength()
+          && text->getChar(*i) == '\0' && text->getChar(*i + 1) == '\n')
+        *i += 2;
+    } else {
+      while (*i < text->getLength() && text->getChar(*i) == ' ')
+        *i += 1;
+      if (*i < text->getLength() && text->getChar(*i) == '\r')
+        *i += 1;
+      if (*i < text->getLength() && text->getChar(*i) == '\n')
+        *i += 1;
+    }
+  }
+
+  // Compute the actual width and character count of the final string, based on
+  // breakpoint, if this information is requested by the caller.
+  if (width != NULL || charCount != NULL) {
+    char *s = outBuf->getCString();
+    int len = outBuf->getLength();
+
+    if (width != NULL)
+      *width = 0.0;
+    if (charCount != NULL)
+      *charCount = 0;
+
+    while (len > 0) {
+      dx = 0.0;
+      n = font->getNextChar(s, len, &c, &uAux, &uLen, &dx, &dy, &ox, &oy);
+
+      if (n == 0) {
+        break;
+      }
+
+      if (width != NULL)
+        *width += dx;
+      if (charCount != NULL)
+        *charCount += 1;
+
+      s += n;
+      len -= n;
+    }
+  }
+}
+
+// Copy the given string to appearBuf, adding parentheses around it and
+// escaping characters as appropriate.
+void Annot::writeString(GooString *str, GooString *appearBuf)
+{
+  char c;
+  int i;
+
+  appearBuf->append('(');
+
+  for (i = 0; i < str->getLength(); ++i) {
+    c = str->getChar(i);
+    if (c == '(' || c == ')' || c == '\\') {
+      appearBuf->append('\\');
+      appearBuf->append(c);
+    } else if (c < 0x20) {
+      appearBuf->appendf("\\{0:03o}", (unsigned char)c);
+    } else {
+      appearBuf->append(c);
+    }
+  }
+
+  appearBuf->append(')');
+}
+
+// Draw the variable text or caption for a field.
+void AnnotWidget::drawText(GooString *text, GooString *da, GfxResources *resources,
+    GBool multiline, int comb, int quadding,
+    GBool txField, GBool forceZapfDingbats,
+    GBool password) {
+  GooList *daToks;
+  GooString *tok, *convertedText;
+  GfxFont *font;
+  double dx, dy;
+  double fontSize, fontSize2, borderWidth, x, xPrev, y, w, wMax;
+  int tfPos, tmPos, i, j;
+  int rot;
+  GBool freeText = gFalse;      // true if text should be freed before return
+  GBool freeFont = gFalse;
+
+  //~ if there is no MK entry, this should use the existing content stream,
+  //~ and only replace the marked content portion of it
+  //~ (this is only relevant for Tx fields)
+  
+  // parse the default appearance string
+  tfPos = tmPos = -1;
+  if (da) {
+    daToks = new GooList();
+    i = 0;
+    while (i < da->getLength()) {
+      while (i < da->getLength() && Lexer::isSpace(da->getChar(i))) {
+        ++i;
+      }
+      if (i < da->getLength()) {
+        for (j = i + 1;
+            j < da->getLength() && !Lexer::isSpace(da->getChar(j));
+            ++j) ;
+        daToks->append(new GooString(da, i, j - i));
+        i = j;
+      }
+    }
+    for (i = 2; i < daToks->getLength(); ++i) {
+      if (i >= 2 && !((GooString *)daToks->get(i))->cmp("Tf")) {
+        tfPos = i - 2;
+      } else if (i >= 6 && !((GooString *)daToks->get(i))->cmp("Tm")) {
+        tmPos = i - 6;
+      }
+    }
+  } else {
+    daToks = NULL;
+  }
+
+  // force ZapfDingbats
+  if (forceZapfDingbats) {
+    if (tfPos >= 0) {
+      tok = (GooString *)daToks->get(tfPos);
+      if (tok->cmp("/ZaDb")) {
+        tok->clear();
+        tok->append("/ZaDb");
+      }
+    }
+  }
+  // get the font and font size
+  font = NULL;
+  fontSize = 0;
+  if (tfPos >= 0) {
+    tok = (GooString *)daToks->get(tfPos);
+    if (tok->getLength() >= 1 && tok->getChar(0) == '/') {
+      if (!resources || !(font = resources->lookupFont(tok->getCString() + 1))) {
+        if (forceZapfDingbats) {
+          // We are forcing ZaDb but the font does not exist
+          // so create a fake one
+          Ref r; // dummy Ref, it's not used at all in this codepath
+          r.num = -1;
+          r.gen = -1;
+          Dict *d = new Dict(xref);
+          font = new Gfx8BitFont(xref, "ZaDb", r, new GooString("ZapfDingbats"), fontType1, r, d);
+          delete d;
+          freeFont = gTrue;
+          addDingbatsResource = gTrue;
+        } else {
+          error(errSyntaxError, -1, "Unknown font in field's DA string");
+        }
+      }
+    } else {
+      error(errSyntaxError, -1, "Invalid font name in 'Tf' operator in field's DA string");
+    }
+    tok = (GooString *)daToks->get(tfPos + 1);
+    fontSize = gatof(tok->getCString());
+  } else {
+    error(errSyntaxError, -1, "Missing 'Tf' operator in field's DA string");
+  }
+  if (!font) {
+    if (daToks) {
+      deleteGooList(daToks, GooString);
+    }
+    return;
+  }
+
+  // get the border width
+  borderWidth = border ? border->getWidth() : 0;
+
+  // for a password field, replace all characters with asterisks
+  if (password) {
+    int len;
+    if (text->hasUnicodeMarker())
+      len = (text->getLength() - 2) / 2;
+    else
+      len = text->getLength();
+
+    text = new GooString;
+    for (i = 0; i < len; ++i)
+      text->append('*');
+    freeText = gTrue;
+  }
+
+  convertedText = new GooString;
+
+  // setup
+  if (txField) {
+    appearBuf->append("/Tx BMC\n");
+  }
+  appearBuf->append("q\n");
+  rot = appearCharacs ? appearCharacs->getRotation() : 0;
+  switch (rot) {
+  case 90:
+    appearBuf->appendf("0 1 -1 0 {0:.2f} 0 cm\n", rect->x2 - rect->x1);
+    dx = rect->y2 - rect->y1;
+    dy = rect->x2 - rect->x1;
+    break;
+  case 180:
+    appearBuf->appendf("-1 0 0 -1 {0:.2f} {1:.2f} cm\n",
+                      rect->x2 - rect->x1, rect->y2 - rect->y1);
+    dx = rect->x2 - rect->y2;
+    dy = rect->y2 - rect->y1;
+    break;
+  case 270:
+    appearBuf->appendf("0 -1 1 0 0 {0:.2f} cm\n", rect->y2 - rect->y1);
+    dx = rect->y2 - rect->y1;
+    dy = rect->x2 - rect->x1;
+    break;
+  default: // assume rot == 0
+    dx = rect->x2 - rect->x1;
+    dy = rect->y2 - rect->y1;
+    break;
+  }
+  appearBuf->append("BT\n");
+  // multi-line text
+  if (multiline) {
+    // note: the comb flag is ignored in multiline mode
+
+    wMax = dx - 2 * borderWidth - 4;
+
+    // compute font autosize
+    if (fontSize == 0) {
+      for (fontSize = 20; fontSize > 1; --fontSize) {
+        y = dy - 3;
+        i = 0;
+        while (i < text->getLength()) {
+          layoutText(text, convertedText, &i, font, &w, wMax / fontSize, NULL,
+                     forceZapfDingbats);
+          y -= fontSize;
+        }
+        // approximate the descender for the last line
+        if (y >= 0.33 * fontSize) {
+          break;
+        }
+      }
+      if (tfPos >= 0) {
+        tok = (GooString *)daToks->get(tfPos + 1);
+        tok->clear();
+        tok->appendf("{0:.2f}", fontSize);
+      }
+    }
+
+    // starting y coordinate
+    // (note: each line of text starts with a Td operator that moves
+    // down a line)
+    y = dy - 3;
+
+    // set the font matrix
+    if (tmPos >= 0) {
+      tok = (GooString *)daToks->get(tmPos + 4);
+      tok->clear();
+      tok->append('0');
+      tok = (GooString *)daToks->get(tmPos + 5);
+      tok->clear();
+      tok->appendf("{0:.2f}", y);
+    }
+
+    // write the DA string
+    if (daToks) {
+      for (i = 0; i < daToks->getLength(); ++i) {
+        appearBuf->append((GooString *)daToks->get(i))->append(' ');
+      }
+    }
+
+    // write the font matrix (if not part of the DA string)
+    if (tmPos < 0) {
+      appearBuf->appendf("1 0 0 1 0 {0:.2f} Tm\n", y);
+    }
+
+    // write a series of lines of text
+    i = 0;
+    xPrev = 0;
+    while (i < text->getLength()) {
+      layoutText(text, convertedText, &i, font, &w, wMax / fontSize, NULL,
+                 forceZapfDingbats);
+      w *= fontSize;
+
+      // compute text start position
+      switch (quadding) {
+      case quaddingLeftJustified:
+      default:
+        x = borderWidth + 2;
+        break;
+      case quaddingCentered:
+        x = (dx - w) / 2;
+        break;
+      case quaddingRightJustified:
+        x = dx - borderWidth - 2 - w;
+        break;
+      }
+
+      // draw the line
+      appearBuf->appendf("{0:.2f} {1:.2f} Td\n", x - xPrev, -fontSize);
+      writeString(convertedText, appearBuf);
+      appearBuf->append(" Tj\n");
+
+      // next line
+      xPrev = x;
+    }
+
+    // single-line text
+  } else {
+    //~ replace newlines with spaces? - what does Acrobat do?
+
+    // comb formatting
+    if (comb > 0) {
+      int charCount;
+
+      // compute comb spacing
+      w = (dx - 2 * borderWidth) / comb;
+
+      // compute font autosize
+      if (fontSize == 0) {
+        fontSize = dy - 2 * borderWidth;
+        if (w < fontSize) {
+          fontSize = w;
+        }
+        fontSize = floor(fontSize);
+        if (tfPos >= 0) {
+          tok = (GooString *)daToks->get(tfPos + 1);
+          tok->clear();
+          tok->appendf("{0:.2f}", fontSize);
+        }
+      }
+
+      i = 0;
+      layoutText(text, convertedText, &i, font, NULL, 0.0, &charCount,
+                 forceZapfDingbats);
+      if (charCount > comb)
+        charCount = comb;
+
+      // compute starting text cell
+      switch (quadding) {
+      case quaddingLeftJustified:
+      default:
+          x = borderWidth;
+        break;
+      case quaddingCentered:
+        x = borderWidth + (comb - charCount) / 2 * w;
+        break;
+      case quaddingRightJustified:
+        x = borderWidth + (comb - charCount) * w;
+        break;
+      }
+      y = 0.5 * dy - 0.4 * fontSize;
+
+      // set the font matrix
+      if (tmPos >= 0) {
+        tok = (GooString *)daToks->get(tmPos + 4);
+        tok->clear();
+        tok->appendf("{0:.2f}", x);
+        tok = (GooString *)daToks->get(tmPos + 5);
+        tok->clear();
+        tok->appendf("{0:.2f}", y);
+      }
+
+      // write the DA string
+      if (daToks) {
+        for (i = 0; i < daToks->getLength(); ++i) {
+          appearBuf->append((GooString *)daToks->get(i))->append(' ');
+        }
+      }
+
+      // write the font matrix (if not part of the DA string)
+      if (tmPos < 0) {
+        appearBuf->appendf("1 0 0 1 {0:.2f} {1:.2f} Tm\n", x, y);
+      }
+
+      // write the text string
+      char *s = convertedText->getCString();
+      int len = convertedText->getLength();
+      i = 0;
+      xPrev = w;                // so that first character is placed properly
+      while (i < comb && len > 0) {
+        CharCode code;
+        Unicode *uAux;
+        int uLen, n;
+        double dx, dy, ox, oy;
+
+        dx = 0.0;
+        n = font->getNextChar(s, len, &code, &uAux, &uLen, &dx, &dy, &ox, &oy);
+        dx *= fontSize;
+
+        // center each character within its cell, by advancing the text
+        // position the appropriate amount relative to the start of the
+        // previous character
+        x = 0.5 * (w - dx);
+        appearBuf->appendf("{0:.2f} 0 Td\n", x - xPrev + w);
+
+        GooString *charBuf = new GooString(s, n);
+        writeString(charBuf, appearBuf);
+        appearBuf->append(" Tj\n");
+        delete charBuf;
+
+        i++;
+        s += n;
+        len -= n;
+        xPrev = x;
+      }
+
+      // regular (non-comb) formatting
+    } else {
+      i = 0;
+      layoutText(text, convertedText, &i, font, &w, 0.0, NULL,
+                 forceZapfDingbats);
+
+      // compute font autosize
+      if (fontSize == 0) {
+        fontSize = dy - 2 * borderWidth;
+        fontSize2 = (dx - 4 - 2 * borderWidth) / w;
+        if (fontSize2 < fontSize) {
+          fontSize = fontSize2;
+        }
+        fontSize = floor(fontSize);
+        if (tfPos >= 0) {
+          tok = (GooString *)daToks->get(tfPos + 1);
+          tok->clear();
+          tok->appendf("{0:.2f}", fontSize);
+        }
+      }
+
+      // compute text start position
+      w *= fontSize;
+      switch (quadding) {
+      case quaddingLeftJustified:
+      default:
+        x = borderWidth + 2;
+        break;
+      case quaddingCentered:
+        x = (dx - w) / 2;
+        break;
+      case quaddingRightJustified:
+        x = dx - borderWidth - 2 - w;
+        break;
+      }
+      y = 0.5 * dy - 0.4 * fontSize;
+
+      // set the font matrix
+      if (tmPos >= 0) {
+        tok = (GooString *)daToks->get(tmPos + 4);
+        tok->clear();
+        tok->appendf("{0:.2f}", x);
+        tok = (GooString *)daToks->get(tmPos + 5);
+        tok->clear();
+        tok->appendf("{0:.2f}", y);
+      }
+
+      // write the DA string
+      if (daToks) {
+        for (i = 0; i < daToks->getLength(); ++i) {
+          appearBuf->append((GooString *)daToks->get(i))->append(' ');
+        }
+      }
+
+      // write the font matrix (if not part of the DA string)
+      if (tmPos < 0) {
+        appearBuf->appendf("1 0 0 1 {0:.2f} {1:.2f} Tm\n", x, y);
+      }
+
+      // write the text string
+      writeString(convertedText, appearBuf);
+      appearBuf->append(" Tj\n");
+    }
+  }
+  // cleanup
+  appearBuf->append("ET\n");
+  appearBuf->append("Q\n");
+  if (txField) {
+    appearBuf->append("EMC\n");
+  }
+  if (daToks) {
+    deleteGooList(daToks, GooString);
+  }
+  if (freeText) {
+    delete text;
+  }
+  delete convertedText;
+  if (freeFont) {
+    font->decRefCnt();
+  }
+}
+
+// Draw the variable text or caption for a field.
+void AnnotWidget::drawListBox(FormFieldChoice *fieldChoice,
+                             GooString *da, GfxResources *resources, int quadding) {
+  GooList *daToks;
+  GooString *tok, *convertedText;
+  GfxFont *font;
+  double fontSize, fontSize2, borderWidth, x, y, w, wMax;
+  int tfPos, tmPos, i, j;
+
+  //~ if there is no MK entry, this should use the existing content stream,
+  //~ and only replace the marked content portion of it
+  //~ (this is only relevant for Tx fields)
+
+  // parse the default appearance string
+  tfPos = tmPos = -1;
+  if (da) {
+    daToks = new GooList();
+    i = 0;
+    while (i < da->getLength()) {
+      while (i < da->getLength() && Lexer::isSpace(da->getChar(i))) {
+       ++i;
+       }
+      if (i < da->getLength()) {
+       for (j = i + 1;
+            j < da->getLength() && !Lexer::isSpace(da->getChar(j));
+            ++j) ;
+       daToks->append(new GooString(da, i, j - i));
+       i = j;
+      }
+    }
+    for (i = 2; i < daToks->getLength(); ++i) {
+      if (i >= 2 && !((GooString *)daToks->get(i))->cmp("Tf")) {
+       tfPos = i - 2;
+      } else if (i >= 6 && !((GooString *)daToks->get(i))->cmp("Tm")) {
+       tmPos = i - 6;
+      }
+    }
+  } else {
+    daToks = NULL;
+  }
+
+  // get the font and font size
+  font = NULL;
+  fontSize = 0;
+  if (tfPos >= 0) {
+    tok = (GooString *)daToks->get(tfPos);
+    if (tok->getLength() >= 1 && tok->getChar(0) == '/') {
+      if (!resources || !(font = resources->lookupFont(tok->getCString() + 1))) {
+        error(errSyntaxError, -1, "Unknown font in field's DA string");
+      }
+    } else {
+      error(errSyntaxError, -1, "Invalid font name in 'Tf' operator in field's DA string");
+    }
+    tok = (GooString *)daToks->get(tfPos + 1);
+    fontSize = gatof(tok->getCString());
+  } else {
+    error(errSyntaxError, -1, "Missing 'Tf' operator in field's DA string");
+  }
+  if (!font) {
+    if (daToks) {
+      deleteGooList(daToks, GooString);
+    }
+    return;
+  }
+
+  convertedText = new GooString;
+
+  // get the border width
+  borderWidth = border ? border->getWidth() : 0;
+
+  // compute font autosize
+  if (fontSize == 0) {
+    wMax = 0;
+    for (i = 0; i < fieldChoice->getNumChoices(); ++i) {
+      j = 0;
+      if (fieldChoice->getChoice(i) == NULL) {
+        error(errSyntaxError, -1, "Invalid annotation listbox");
+        if (daToks) {
+          deleteGooList(daToks, GooString);
+        }
+        delete convertedText;
+        return;
+      }
+      layoutText(fieldChoice->getChoice(i), convertedText, &j, font, &w, 0.0, NULL, gFalse);
+      if (w > wMax) {
+        wMax = w;
+      }
+    }
+    fontSize = rect->y2 - rect->y1 - 2 * borderWidth;
+    fontSize2 = (rect->x2 - rect->x1 - 4 - 2 * borderWidth) / wMax;
+    if (fontSize2 < fontSize) {
+      fontSize = fontSize2;
+    }
+    fontSize = floor(fontSize);
+    if (tfPos >= 0) {
+      tok = (GooString *)daToks->get(tfPos + 1);
+      tok->clear();
+      tok->appendf("{0:.2f}", fontSize);
+    }
+  }
+  // draw the text
+  y = rect->y2 - rect->y1 - 1.1 * fontSize;
+  for (i = fieldChoice->getTopIndex(); i < fieldChoice->getNumChoices(); ++i) {
+    // setup
+    appearBuf->append("q\n");
+
+    // draw the background if selected
+    if (fieldChoice->isSelected(i)) {
+      appearBuf->append("0 g f\n");
+      appearBuf->appendf("{0:.2f} {1:.2f} {2:.2f} {3:.2f} re f\n",
+          borderWidth,
+          y - 0.2 * fontSize,
+          rect->x2 - rect->x1 - 2 * borderWidth,
+          1.1 * fontSize);
+    }
+
+    // setup
+    appearBuf->append("BT\n");
+
+    // compute text width and start position
+    j = 0;
+    layoutText(fieldChoice->getChoice(i), convertedText, &j, font, &w, 0.0, NULL, gFalse);
+    w *= fontSize;
+    switch (quadding) {
+    case quaddingLeftJustified:
+    default:
+      x = borderWidth + 2;
+      break;
+    case quaddingCentered:
+      x = (rect->x2 - rect->x1 - w) / 2;
+      break;
+    case quaddingRightJustified:
+      x = rect->x2 - rect->x1 - borderWidth - 2 - w;
+      break;
+    }
+
+    // set the font matrix
+    if (tmPos >= 0) {
+      tok = (GooString *)daToks->get(tmPos + 4);
+      tok->clear();
+      tok->appendf("{0:.2f}", x);
+      tok = (GooString *)daToks->get(tmPos + 5);
+      tok->clear();
+      tok->appendf("{0:.2f}", y);
+    }
+
+    // write the DA string
+    if (daToks) {
+      for (j = 0; j < daToks->getLength(); ++j) {
+        appearBuf->append((GooString *)daToks->get(j))->append(' ');
+      }
+    }
+
+    // write the font matrix (if not part of the DA string)
+    if (tmPos < 0) {
+      appearBuf->appendf("1 0 0 1 {0:.2f} {1:.2f} Tm\n", x, y);
+    }
+
+    // change the text color if selected
+    if (fieldChoice->isSelected(i)) {
+      appearBuf->append("1 g\n");
+    }
+
+    // write the text string
+    writeString(convertedText, appearBuf);
+    appearBuf->append(" Tj\n");
+
+    // cleanup
+    appearBuf->append("ET\n");
+    appearBuf->append("Q\n");
+
+    // next line
+    y -= 1.1 * fontSize;
+  }
+
+  if (daToks) {
+    deleteGooList(daToks, GooString);
+  }
+
+  delete convertedText;
+}
+
+void AnnotWidget::drawBorder() {
+  int dashLength;
+  double *dash;
+  AnnotColor adjustedColor;
+  double w = border->getWidth();
+
+  AnnotColor *aColor = appearCharacs->getBorderColor();
+  if (!aColor)
+    aColor = appearCharacs->getBackColor();
+  if (!aColor)
+    return;
+
+  double dx = rect->x2 - rect->x1;
+  double dy = rect->y2 - rect->y1;
+
+  // radio buttons with no caption have a round border
+  GBool hasCaption = appearCharacs->getNormalCaption() != NULL;
+  if (field->getType() == formButton &&
+      static_cast<FormFieldButton*>(field)->getButtonType() == formButtonRadio && !hasCaption) {
+    double r = 0.5 * (dx < dy ? dx : dy);
+    switch (border->getStyle()) {
+    case AnnotBorder::borderDashed:
+      appearBuf->append("[");
+      dashLength = border->getDashLength();
+      dash = border->getDash();
+      for (int i = 0; i < dashLength; ++i) {
+        appearBuf->appendf(" {0:.2f}", dash[i]);
+      }
+      appearBuf->append("] 0 d\n");
+      // fall through to the solid case
+    case AnnotBorder::borderSolid:
+    case AnnotBorder::borderUnderlined:
+      appearBuf->appendf("{0:.2f} w\n", w);
+      setColor(aColor, gFalse);
+      drawCircle(0.5 * dx, 0.5 * dy, r - 0.5 * w, gFalse);
+      break;
+    case AnnotBorder::borderBeveled:
+    case AnnotBorder::borderInset:
+      appearBuf->appendf("{0:.2f} w\n", 0.5 * w);
+      setColor(aColor, gFalse);
+      drawCircle(0.5 * dx, 0.5 * dy, r - 0.25 * w, gFalse);
+      adjustedColor = AnnotColor(*aColor);
+      adjustedColor.adjustColor(border->getStyle() == AnnotBorder::borderBeveled ? 1 : -1);
+      setColor(&adjustedColor, gFalse);
+      drawCircleTopLeft(0.5 * dx, 0.5 * dy, r - 0.75 * w);
+      adjustedColor = AnnotColor(*aColor);
+      adjustedColor.adjustColor(border->getStyle() == AnnotBorder::borderBeveled ? -1 : 1);
+      setColor(&adjustedColor, gFalse);
+      drawCircleBottomRight(0.5 * dx, 0.5 * dy, r - 0.75 * w);
+      break;
+    }
+  } else {
+    switch (border->getStyle()) {
+    case AnnotBorder::borderDashed:
+      appearBuf->append("[");
+      dashLength = border->getDashLength();
+      dash = border->getDash();
+      for (int i = 0; i < dashLength; ++i) {
+        appearBuf->appendf(" {0:.2f}", dash[i]);
+      }
+      appearBuf->append("] 0 d\n");
+      // fall through to the solid case
+    case AnnotBorder::borderSolid:
+      appearBuf->appendf("{0:.2f} w\n", w);
+      setColor(aColor, gFalse);
+      appearBuf->appendf("{0:.2f} {0:.2f} {1:.2f} {2:.2f} re s\n",
+                         0.5 * w, dx - w, dy - w);
+      break;
+    case AnnotBorder::borderBeveled:
+    case AnnotBorder::borderInset:
+      adjustedColor = AnnotColor(*aColor);
+      adjustedColor.adjustColor(border->getStyle() == AnnotBorder::borderBeveled ? 1 : -1);
+      setColor(&adjustedColor, gTrue);
+      appearBuf->append("0 0 m\n");
+      appearBuf->appendf("0 {0:.2f} l\n", dy);
+      appearBuf->appendf("{0:.2f} {1:.2f} l\n", dx, dy);
+      appearBuf->appendf("{0:.2f} {1:.2f} l\n", dx - w, dy - w);
+      appearBuf->appendf("{0:.2f} {1:.2f} l\n", w, dy - w);
+      appearBuf->appendf("{0:.2f} {0:.2f} l\n", w);
+      appearBuf->append("f\n");
+      adjustedColor = AnnotColor(*aColor);
+      adjustedColor.adjustColor(border->getStyle() == AnnotBorder::borderBeveled ? -1 : 1);
+      setColor(&adjustedColor, gTrue);
+      appearBuf->append("0 0 m\n");
+      appearBuf->appendf("{0:.2f} 0 l\n", dx);
+      appearBuf->appendf("{0:.2f} {1:.2f} l\n", dx, dy);
+      appearBuf->appendf("{0:.2f} {1:.2f} l\n", dx - w, dy - w);
+      appearBuf->appendf("{0:.2f} {1:.2f} l\n", dx - w, w);
+      appearBuf->appendf("{0:.2f} {0:.2f} l\n", w);
+      appearBuf->append("f\n");
+      break;
+    case AnnotBorder::borderUnderlined:
+      appearBuf->appendf("{0:.2f} w\n", w);
+      setColor(aColor, gFalse);
+      appearBuf->appendf("0 0 m {0:.2f} 0 l s\n", dx);
+      break;
+    }
+
+    // clip to the inside of the border
+    appearBuf->appendf("{0:.2f} {0:.2f} {1:.2f} {2:.2f} re W n\n",
+                       w, dx - 2 * w, dy - 2 * w);
+  }
+}
+
+void AnnotWidget::drawFormFieldButton(GfxResources *resources, GooString *da) {
+  GooString *caption = NULL;
+  if (appearCharacs)
+    caption = appearCharacs->getNormalCaption();
+
+  switch (static_cast<FormFieldButton *>(field)->getButtonType()) {
+  case formButtonRadio: {
+    //~ Acrobat doesn't draw a caption if there is no AP dict (?)
+    if (appearState && appearState->cmp("Off") != 0) {
+      if (caption) {
+        drawText(caption, da, resources, gFalse, 0, fieldQuadCenter,
+                 gFalse, gTrue);
+      } else if (appearCharacs) {
+        AnnotColor *aColor = appearCharacs->getBorderColor();
+        if (aColor) {
+          double dx = rect->x2 - rect->x1;
+          double dy = rect->y2 - rect->y1;
+          setColor(aColor, gTrue);
+          drawCircle(0.5 * dx, 0.5 * dy, 0.2 * (dx < dy ? dx : dy), gTrue);
+        }
+      }
+    }
+  }
+    break;
+  case formButtonPush:
+    if (caption)
+      drawText(caption, da, resources, gFalse, 0, fieldQuadCenter, gFalse, gFalse);
+    break;
+  case formButtonCheck:
+    if (appearState && appearState->cmp("Off") != 0) {
+      if (!caption) {
+        GooString checkMark("3");
+        drawText(&checkMark, da, resources, gFalse, 0, fieldQuadCenter, gFalse, gTrue);
+      } else {
+        drawText(caption, da, resources, gFalse, 0, fieldQuadCenter, gFalse, gTrue);
+      }
+    }
+    break;
+  }
+}
+
+void AnnotWidget::drawFormFieldText(GfxResources *resources, GooString *da) {
+  VariableTextQuadding quadding;
+  GooString *contents;
+  FormFieldText *fieldText = static_cast<FormFieldText *>(field);
+
+  contents = fieldText->getContent();
+  if (contents) {
+    quadding = field->hasTextQuadding() ? field->getTextQuadding() : form->getTextQuadding();
+
+    int comb = 0;
+    if (fieldText->isComb())
+      comb = fieldText->getMaxLen();
+
+    drawText(contents, da, resources,
+             fieldText->isMultiline(), comb, quadding, gTrue, gFalse, fieldText->isPassword());
+  }
+}
+
+void AnnotWidget::drawFormFieldChoice(GfxResources *resources, GooString *da) {
+  GooString *selected;
+  VariableTextQuadding quadding;
+  FormFieldChoice *fieldChoice = static_cast<FormFieldChoice *>(field);
+
+  quadding = field->hasTextQuadding() ? field->getTextQuadding() : form->getTextQuadding();
+
+  if (fieldChoice->isCombo()) {
+    selected = fieldChoice->getSelectedChoice();
+    if (selected) {
+      drawText(selected, da, resources, gFalse, 0, quadding, gTrue, gFalse);
+      //~ Acrobat draws a popup icon on the right side
+    }
+  // list box
+  } else {
+    drawListBox(fieldChoice, da, resources, quadding);
+  }
+}
+
+void AnnotWidget::generateFieldAppearance() {
+  Object appearDict, obj1, obj2;
+  GfxResources *resources;
+  MemStream *appearStream;
+  GooString *da;
+
+  appearBuf = new GooString ();
+
+  // draw the background
+  if (appearCharacs) {
+    AnnotColor *aColor = appearCharacs->getBackColor();
+    if (aColor) {
+      setColor(aColor, gTrue);
+      appearBuf->appendf("0 0 {0:.2f} {1:.2f} re f\n",
+                         rect->x2 - rect->x1, rect->y2 - rect->y1);
+    }
+  }
+
+  // draw the border
+  if (appearCharacs && border && border->getWidth() > 0)
+    drawBorder();
+
+  da = field->getDefaultAppearance();
+  if (!da)
+    da = form->getDefaultAppearance();
+
+  resources = form->getDefaultResources();
+
+  // draw the field contents
+  switch (field->getType()) {
+  case formButton:
+    drawFormFieldButton(resources, da);
+    break;
+  case formText:
+    drawFormFieldText(resources, da);
+    break;
+  case formChoice:
+    drawFormFieldChoice(resources, da);
+    break;
+  case formSignature:
+    //~unimp
+    break;
+  case formUndef:
+  default:
+    error(errSyntaxError, -1, "Unknown field type");
+  }
+
+  // build the appearance stream dictionary
+  appearDict.initDict(xref);
+  appearDict.dictAdd(copyString("Length"),
+      obj1.initInt(appearBuf->getLength()));
+  appearDict.dictAdd(copyString("Subtype"), obj1.initName("Form"));
+  obj1.initArray(xref);
+  obj1.arrayAdd(obj2.initReal(0));
+  obj1.arrayAdd(obj2.initReal(0));
+  obj1.arrayAdd(obj2.initReal(rect->x2 - rect->x1));
+  obj1.arrayAdd(obj2.initReal(rect->y2 - rect->y1));
+  appearDict.dictAdd(copyString("BBox"), &obj1);
+
+  // set the resource dictionary
+  Object *resDict = form->getDefaultResourcesObj();
+  if (resDict->isDict()) {
+    appearDict.dictAdd(copyString("Resources"), resDict->copy(&obj1));
+  }
+
+  // build the appearance stream
+  appearStream = new MemStream(strdup(appearBuf->getCString()), 0,
+      appearBuf->getLength(), &appearDict);
+  appearance.free();
+  appearance.initStream(appearStream);
+  delete appearBuf;
+
+  appearStream->setNeedFree(gTrue);
+}
+
+
+void AnnotWidget::draw(Gfx *gfx, GBool printing) {
+  Object obj;
+
+  if (!isVisible (printing))
+    return;
+
+  addDingbatsResource = gFalse;
+
+  // Only construct the appearance stream when
+  // - annot doesn't have an AP or
+  // - it's a field containing text (text and choices) and
+  // - NeedAppearances is true or
+  // - widget has been modified or
+  if (field) {
+    if (appearance.isNull() || (form && form->getNeedAppearances()) ||
+        ((field->getType() == formText || field->getType() == formChoice) &&
+         field->isModified()))
+      generateFieldAppearance();
+  }
+
+  // draw the appearance stream
+  appearance.fetch(xref, &obj);
+  if (addDingbatsResource) {
+    // We are forcing ZaDb but the font does not exist
+    // so create a fake one
+    Object baseFontObj, subtypeObj;
+    baseFontObj.initName("ZapfDingbats");
+    subtypeObj.initName("Type1");
+
+    Object fontDictObj;
+    Dict *fontDict = new Dict(xref);
+    fontDict->decRef();
+    fontDict->add(copyString("BaseFont"), &baseFontObj);
+    fontDict->add(copyString("Subtype"), &subtypeObj);
+    fontDictObj.initDict(fontDict);
+
+    Object fontsDictObj;
+    Dict *fontsDict = new Dict(xref);
+    fontsDict->decRef();
+    fontsDict->add(copyString("ZaDb"), &fontDictObj);
+    fontsDictObj.initDict(fontsDict);
+
+    Dict *dict = new Dict(xref);
+    dict->add(copyString("Font"), &fontsDictObj);
+    gfx->pushResources(dict);
+    delete dict;
+  }
+  gfx->drawAnnot(&obj, (AnnotBorder *)NULL, color,
+                rect->x1, rect->y1, rect->x2, rect->y2);
+  if (addDingbatsResource) {
+    gfx->popResources();
+  }
+  obj.free();
+}
+
+
+//------------------------------------------------------------------------
+// AnnotMovie
+//------------------------------------------------------------------------
+AnnotMovie::AnnotMovie(PDFDoc *docA, PDFRectangle *rect, Movie *movieA) :
+    Annot(docA, rect) {
+  Object obj1;
+
+  type = typeMovie;
+  annotObj.dictSet ("Subtype", obj1.initName ("Movie"));
+
+  movie = movieA->copy();
+  // TODO: create movie dict from movieA
+
+  initialize(docA, annotObj.getDict());
+}
+
+AnnotMovie::AnnotMovie(PDFDoc *docA, Dict *dict, Object *obj) :
+  Annot(docA, dict, obj) {
+  type = typeMovie;
+  initialize(docA, dict);
+}
+
+AnnotMovie::~AnnotMovie() {
+  if (title)
+    delete title;
+  delete movie;
+}
+
+void AnnotMovie::initialize(PDFDoc *docA, Dict* dict) {
+  Object obj1;
+
+  if (dict->lookup("T", &obj1)->isString()) {
+    title = obj1.getString()->copy();
+  } else {
+    title = NULL;
+  }
+  obj1.free();
+
+  Object movieDict;
+  if (dict->lookup("Movie", &movieDict)->isDict()) {
+    Object obj2;
+    dict->lookup("A", &obj2);
+    if (obj2.isDict())
+      movie = new Movie (&movieDict, &obj2);
+    else
+      movie = new Movie (&movieDict);
+    if (!movie->isOk()) {
+      delete movie;
+      movie = NULL;
+      ok = gFalse;
+    }
+    obj2.free();
+  } else {
+    error(errSyntaxError, -1, "Bad Annot Movie");
+    movie = NULL;
+    ok = gFalse;
+  }
+  movieDict.free();
+}
+
+void AnnotMovie::draw(Gfx *gfx, GBool printing) {
+  Object obj;
+
+  if (!isVisible (printing))
+    return;
+
+  if (appearance.isNull() && movie->getShowPoster()) {
+    int width, height;
+    Object poster;
+    movie->getPoster(&poster);
+    movie->getAspect(&width, &height);
+
+    if (width != -1 && height != -1 && !poster.isNone()) {
+      MemStream *mStream;
+
+      appearBuf = new GooString ();
+      appearBuf->append ("q\n");
+      appearBuf->appendf ("{0:d} 0 0 {1:d} 0 0 cm\n", width, height);
+      appearBuf->append ("/MImg Do\n");
+      appearBuf->append ("Q\n");
+
+      Object imgDict;
+      imgDict.initDict(xref);
+      imgDict.dictSet ("MImg", &poster);
+
+      Object resDict;
+      resDict.initDict(xref);
+      resDict.dictSet ("XObject", &imgDict);
+
+      Object formDict, obj1, obj2;
+      formDict.initDict(xref);
+      formDict.dictSet("Length", obj1.initInt(appearBuf->getLength()));
+      formDict.dictSet("Subtype", obj1.initName("Form"));
+      formDict.dictSet("Name", obj1.initName("FRM"));
+      obj1.initArray(xref);
+      obj1.arrayAdd(obj2.initInt(0));
+      obj1.arrayAdd(obj2.initInt(0));
+      obj1.arrayAdd(obj2.initInt(width));
+      obj1.arrayAdd(obj2.initInt(height));
+      formDict.dictSet("BBox", &obj1);
+      obj1.initArray(xref);
+      obj1.arrayAdd(obj2.initInt(1));
+      obj1.arrayAdd(obj2.initInt(0));
+      obj1.arrayAdd(obj2.initInt(0));
+      obj1.arrayAdd(obj2.initInt(1));
+      obj1.arrayAdd(obj2.initInt(-width / 2));
+      obj1.arrayAdd(obj2.initInt(-height / 2));
+      formDict.dictSet("Matrix", &obj1);
+      formDict.dictSet("Resources", &resDict);
+
+      Object aStream;
+      mStream = new MemStream(copyString(appearBuf->getCString()), 0,
+                             appearBuf->getLength(), &formDict);
+      mStream->setNeedFree(gTrue);
+      aStream.initStream(mStream);
+      delete appearBuf;
+
+      Object objDict;
+      objDict.initDict(xref);
+      objDict.dictSet ("FRM", &aStream);
+
+      resDict.initDict(xref);
+      resDict.dictSet ("XObject", &objDict);
+
+      appearBuf = new GooString ();
+      appearBuf->append ("q\n");
+      appearBuf->appendf ("0 0 {0:d} {1:d} re W n\n", width, height);
+      appearBuf->append ("q\n");
+      appearBuf->appendf ("0 0 {0:d} {1:d} re W n\n", width, height);
+      appearBuf->appendf ("1 0 0 1 {0:d} {1:d} cm\n", width / 2, height / 2);
+      appearBuf->append ("/FRM Do\n");
+      appearBuf->append ("Q\n");
+      appearBuf->append ("Q\n");
+
+      double bbox[4];
+      bbox[0] = bbox[1] = 0;
+      bbox[2] = width;
+      bbox[3] = height;
+      createForm(bbox, gFalse, &resDict, &appearance);
+      delete appearBuf;
+    }
+    poster.free();
+  }
+
+  // draw the appearance stream
+  appearance.fetch(xref, &obj);
+  gfx->drawAnnot(&obj, (AnnotBorder *)NULL, color,
+                rect->x1, rect->y1, rect->x2, rect->y2);
+  obj.free();
+}
+
+//------------------------------------------------------------------------
+// AnnotScreen
+//------------------------------------------------------------------------
+AnnotScreen::AnnotScreen(PDFDoc *docA, PDFRectangle *rect) :
+    Annot(docA, rect) {
+  Object obj1;
+
+  type = typeScreen;
+
+  annotObj.dictSet ("Subtype", obj1.initName ("Screen"));
+  initialize(docA, annotObj.getDict());
+}
+
+AnnotScreen::AnnotScreen(PDFDoc *docA, Dict *dict, Object *obj) :
+  Annot(docA, dict, obj) {
+  type = typeScreen;
+  initialize(docA, dict);
+}
+
+AnnotScreen::~AnnotScreen() {
+  if (title)
+    delete title;
+  if (appearCharacs)
+    delete appearCharacs;
+  if (action)
+    delete action;
+
+  additionAction.free();
+}
+
+void AnnotScreen::initialize(PDFDoc *docA, Dict* dict) {
+  Object obj1;
+
+  title = NULL;
+  if (dict->lookup("T", &obj1)->isString()) {
+    title = obj1.getString()->copy();
+  }
+  obj1.free();
+
+  action = NULL;
+  if (dict->lookup("A", &obj1)->isDict()) {
+    action = LinkAction::parseAction(&obj1, doc->getCatalog()->getBaseURI());
+    if (action->getKind() == actionRendition && page == 0) {
+      error (errSyntaxError, -1, "Invalid Rendition action: associated screen annotation without P");
+      delete action;
+      action = NULL;
+      ok = gFalse;
+    }
+  }
+  obj1.free();
+
+  dict->lookup("AA", &additionAction);
+
+  appearCharacs = NULL;
+  if(dict->lookup("MK", &obj1)->isDict()) {
+    appearCharacs = new AnnotAppearanceCharacs(obj1.getDict());
+  }
+  obj1.free();
+
+}
+
+//------------------------------------------------------------------------
+// AnnotStamp
+//------------------------------------------------------------------------
+AnnotStamp::AnnotStamp(PDFDoc *docA, PDFRectangle *rect) :
+  AnnotMarkup(docA, rect) {
+  Object obj1;
+
+  type = typeStamp;
+  annotObj.dictSet ("Subtype", obj1.initName ("Stamp"));
+  initialize(docA, annotObj.getDict());
+}
+
+AnnotStamp::AnnotStamp(PDFDoc *docA, Dict *dict, Object *obj) :
+  AnnotMarkup(docA, dict, obj) {
+  type = typeStamp;
+  initialize(docA, dict);
+}
+
+AnnotStamp::~AnnotStamp() {
+  delete icon;
+}
+
+void AnnotStamp::initialize(PDFDoc *docA, Dict* dict) {
+  Object obj1;
+
+  if (dict->lookup("Name", &obj1)->isName()) {
+    icon = new GooString(obj1.getName());
+  } else {
+    icon = new GooString("Draft");
+  }
+  obj1.free();
+
+}
+
+void AnnotStamp::setIcon(GooString *new_icon) {
+  delete icon;
+
+  if (new_icon) {
+    icon = new GooString (new_icon);
+  } else {
+    icon = new GooString();
+  }
+
+  Object obj1;
+  obj1.initName (icon->getCString());
+  update("Name", &obj1);
+}
+
+//------------------------------------------------------------------------
+// AnnotGeometry
+//------------------------------------------------------------------------
+AnnotGeometry::AnnotGeometry(PDFDoc *docA, PDFRectangle *rect, AnnotSubtype subType) :
+    AnnotMarkup(docA, rect) {
+  Object obj1;
+
+  switch (subType) {
+    case typeSquare:
+      annotObj.dictSet ("Subtype", obj1.initName ("Square"));
+      break;
+    case typeCircle:
+      annotObj.dictSet ("Subtype", obj1.initName ("Circle"));
+      break;
+    default:
+      assert (0 && "Invalid subtype for AnnotGeometry\n");
+  }
+
+  initialize(docA, annotObj.getDict());
+}
+
+AnnotGeometry::AnnotGeometry(PDFDoc *docA, Dict *dict, Object *obj) :
+  AnnotMarkup(docA, dict, obj) {
+  // the real type will be read in initialize()
+  type = typeSquare;
+  initialize(docA, dict);
+}
+
+AnnotGeometry::~AnnotGeometry() {
+  delete interiorColor;
+  delete borderEffect;
+  delete geometryRect;
+}
+
+void AnnotGeometry::initialize(PDFDoc *docA, Dict* dict) {
+  Object obj1;
+
+  if (dict->lookup("Subtype", &obj1)->isName()) {
+    GooString typeName(obj1.getName());
+    if (!typeName.cmp("Square")) {
+      type = typeSquare;
+    } else if (!typeName.cmp("Circle")) {
+      type = typeCircle;
+    }
+  }
+  obj1.free();
+
+  if (dict->lookup("IC", &obj1)->isArray()) {
+    interiorColor = new AnnotColor(obj1.getArray());
+  } else {
+    interiorColor = NULL;
+  }
+  obj1.free();
+
+  if (dict->lookup("BE", &obj1)->isDict()) {
+    borderEffect = new AnnotBorderEffect(obj1.getDict());
+  } else {
+    borderEffect = NULL;
+  }
+  obj1.free();
+
+  geometryRect = NULL;
+  if (dict->lookup("RD", &obj1)->isArray()) {
+    geometryRect = parseDiffRectangle(obj1.getArray(), rect);
+  }
+  obj1.free();
+
+}
+
+void AnnotGeometry::setType(AnnotSubtype new_type) {
+  Object obj1;
+
+  switch (new_type) {
+    case typeSquare:
+      obj1.initName("Square");
+      break;
+    case typeCircle:
+      obj1.initName("Circle");
+      break;
+    default:
+      assert(!"Invalid subtype");
+  }
+
+  type = new_type;
+  update("Subtype", &obj1);
+}
+
+void AnnotGeometry::setInteriorColor(AnnotColor *new_color) {
+  delete interiorColor;
+
+  if (new_color) {
+    Object obj1;
+    new_color->writeToObject(xref, &obj1);
+    update ("IC", &obj1);
+    interiorColor = new_color;
+  } else {
+    interiorColor = NULL;
+  }
+}
+
+void AnnotGeometry::draw(Gfx *gfx, GBool printing) {
+  Object obj;
+  double ca = 1;
+
+  if (!isVisible (printing))
+    return;
+
+  if (appearance.isNull()) {
+    ca = opacity;
+
+    appearBuf = new GooString ();
+    appearBuf->append ("q\n");
+    if (color)
+      setColor(color, gFalse);
+
+    if (border) {
+      int i, dashLength;
+      double *dash;
+      double borderWidth = border->getWidth();
+
+      switch (border->getStyle()) {
+      case AnnotBorder::borderDashed:
+        appearBuf->append("[");
+       dashLength = border->getDashLength();
+       dash = border->getDash();
+       for (i = 0; i < dashLength; ++i)
+         appearBuf->appendf(" {0:.2f}", dash[i]);
+       appearBuf->append(" ] 0 d\n");
+       break;
+      default:
+        appearBuf->append("[] 0 d\n");
+        break;
+      }
+      appearBuf->appendf("{0:.2f} w\n", borderWidth);
+
+      if (interiorColor)
+        setColor(interiorColor, gTrue);
+
+      if (type == typeSquare) {
+        appearBuf->appendf ("{0:.2f} {1:.2f} {2:.2f} {3:.2f} re\n",
+                           borderWidth / 2.0, borderWidth / 2.0,
+                           (rect->x2 - rect->x1) - borderWidth,
+                           (rect->y2 - rect->y1) - borderWidth);
+      } else {
+        double width, height;
+       double b;
+       double x1, y1, x2, y2, x3, y3;
+
+       width = rect->x2 - rect->x1;
+       height = rect->y2 - rect->y1;
+       b = borderWidth / 2.0;
+
+       x1 = b;
+       y1 = height / 2.0;
+       appearBuf->appendf ("{0:.2f} {1:.2f} m\n", x1, y1);
+
+       y1 += height / 4.0;
+       x2 = width / 4.0;
+       y2 = height - b;
+       x3 = width / 2.0;
+       y3 = y2;
+       appearBuf->appendf ("{0:.2f} {1:.2f} {2:.2f} {3:.2f} {4:.2f} {5:.2f} c\n",
+                           x1, y1, x2, y2, x3, y3);
+       x2 = width - b;
+       y2 = y1;
+       x1 = x3 + (width / 4.0);
+       y1 = y3;
+       x3 = x2;
+       y3 = height / 2.0;
+       appearBuf->appendf ("{0:.2f} {1:.2f} {2:.2f} {3:.2f} {4:.2f} {5:.2f} c\n",
+                           x1, y1, x2, y2, x3, y3);
+
+       x2 = x1;
+       y2 = b;
+       x1 = x3;
+       y1 = height / 4.0;
+       x3 = width / 2.0;
+       y3 = b;
+       appearBuf->appendf ("{0:.2f} {1:.2f} {2:.2f} {3:.2f} {4:.2f} {5:.2f} c\n",
+                           x1, y1, x2, y2, x3, y3);
+
+       x2 = b;
+       y2 = y1;
+       x1 = width / 4.0;
+       y1 = b;
+       x3 = b;
+       y3 = height / 2.0;
+       appearBuf->appendf ("{0:.2f} {1:.2f} {2:.2f} {3:.2f} {4:.2f} {5:.2f} c\n",
+                           x1, y1, x2, y2, x3, y3);
+
+      }
+
+      if (interiorColor && interiorColor->getSpace() != AnnotColor::colorTransparent)
+        appearBuf->append ("b\n");
+      else
+        appearBuf->append ("S\n");
+    }
+    appearBuf->append ("Q\n");
+
+    double bbox[4];
+    bbox[0] = bbox[1] = 0;
+    bbox[2] = rect->x2 - rect->x1;
+    bbox[3] = rect->y2 - rect->y1;
+    if (ca == 1) {
+      createForm(bbox, gFalse, NULL, &appearance);
+    } else {
+      Object aStream;
+
+      createForm(bbox, gTrue, NULL, &aStream);
+      delete appearBuf;
+
+      Object resDict;
+      appearBuf = new GooString ("/GS0 gs\n/Fm0 Do");
+      createResourcesDict("Fm0", &aStream, "GS0", ca, NULL, &resDict);
+      createForm(bbox, gFalse, &resDict, &appearance);
+    }
+    delete appearBuf;
+  }
+
+  // draw the appearance stream
+  appearance.fetch(xref, &obj);
+  gfx->drawAnnot(&obj, (AnnotBorder *)NULL, color,
+                rect->x1, rect->y1, rect->x2, rect->y2);
+  obj.free();
+}
+
+//------------------------------------------------------------------------
+// AnnotPolygon
+//------------------------------------------------------------------------
+AnnotPolygon::AnnotPolygon(PDFDoc *docA, PDFRectangle *rect, AnnotSubtype subType, AnnotPath *path) :
+    AnnotMarkup(docA, rect) {
+  Object obj1;
+
+  switch (subType) {
+    case typePolygon:
+      annotObj.dictSet ("Subtype", obj1.initName ("Polygon"));
+      break;
+    case typePolyLine:
+      annotObj.dictSet ("Subtype", obj1.initName ("PolyLine"));
+      break;
+    default:
+      assert (0 && "Invalid subtype for AnnotGeometry\n");
+  }
+
+  Object obj2;
+  obj2.initArray (doc->getXRef());
+
+  for (int i = 0; i < path->getCoordsLength(); ++i) {
+    Object obj3;
+
+    obj2.arrayAdd (obj3.initReal (path->getX(i)));
+    obj2.arrayAdd (obj3.initReal (path->getY(i)));
+  }
+
+  annotObj.dictSet ("Vertices", &obj2);
+
+  initialize(docA, annotObj.getDict());
+}
+
+AnnotPolygon::AnnotPolygon(PDFDoc *docA, Dict *dict, Object *obj) :
+  AnnotMarkup(docA, dict, obj) {
+  // the real type will be read in initialize()
+  type = typePolygon;
+  initialize(docA, dict);
+}
+
+AnnotPolygon::~AnnotPolygon() {
+  delete vertices;
+
+  if (interiorColor)
+    delete interiorColor;
+
+  if (borderEffect)
+    delete borderEffect;
+}
+
+void AnnotPolygon::initialize(PDFDoc *docA, Dict* dict) {
+  Object obj1;
+
+  if (dict->lookup("Subtype", &obj1)->isName()) {
+    GooString typeName(obj1.getName());
+    if (!typeName.cmp("Polygon")) {
+      type = typePolygon;
+    } else if (!typeName.cmp("PolyLine")) {
+      type = typePolyLine;
+    }
+  }
+  obj1.free();
+
+  if (dict->lookup("Vertices", &obj1)->isArray()) {
+    vertices = new AnnotPath(obj1.getArray());
+  } else {
+    vertices = new AnnotPath();
+    error(errSyntaxError, -1, "Bad Annot Polygon Vertices");
+    ok = gFalse;
+  }
+  obj1.free();
+
+  if (dict->lookup("LE", &obj1)->isArray() && obj1.arrayGetLength() == 2) {
+    Object obj2;
+
+    if(obj1.arrayGet(0, &obj2)->isString())
+      startStyle = parseAnnotLineEndingStyle(obj2.getString());
+    else
+      startStyle = annotLineEndingNone;
+    obj2.free();
+
+    if(obj1.arrayGet(1, &obj2)->isString())
+      endStyle = parseAnnotLineEndingStyle(obj2.getString());
+    else
+      endStyle = annotLineEndingNone;
+    obj2.free();
+
+  } else {
+    startStyle = endStyle = annotLineEndingNone;
+  }
+  obj1.free();
+
+  if (dict->lookup("IC", &obj1)->isArray()) {
+    interiorColor = new AnnotColor(obj1.getArray());
+  } else {
+    interiorColor = NULL;
+  }
+  obj1.free();
+
+  if (dict->lookup("BE", &obj1)->isDict()) {
+    borderEffect = new AnnotBorderEffect(obj1.getDict());
+  } else {
+    borderEffect = NULL;
+  }
+  obj1.free();
+
+  if (dict->lookup("IT", &obj1)->isName()) {
+    const char *intentName = obj1.getName();
+
+    if(!strcmp(intentName, "PolygonCloud")) {
+      intent = polygonCloud;
+    } else if(!strcmp(intentName, "PolyLineDimension")) {
+      intent = polylineDimension;
+    } else {
+      intent = polygonDimension;
+    }
+  } else {
+    intent = polygonCloud;
+  }
+  obj1.free();
+}
+
+void AnnotPolygon::setType(AnnotSubtype new_type) {
+  Object obj1;
+
+  switch (new_type) {
+    case typePolygon:
+      obj1.initName("Polygon");
+      break;
+    case typePolyLine:
+      obj1.initName("PolyLine");
+      break;
+    default:
+      assert(!"Invalid subtype");
+  }
+
+  type = new_type;
+  update("Subtype", &obj1);
+}
+
+void AnnotPolygon::setVertices(AnnotPath *path) {
+  Object obj1, obj2;
+  delete vertices;
+
+  obj1.initArray(xref);
+
+  for (int i = 0; i < path->getCoordsLength(); i++) {
+    obj1.arrayAdd (obj2.initReal (path->getX(i)));
+    obj1.arrayAdd (obj2.initReal (path->getY(i)));
+  }
+
+  vertices = new AnnotPath(obj1.getArray());
+
+  update("Vertices", &obj1);
+}
+
+void AnnotPolygon::setStartEndStyle(AnnotLineEndingStyle start, AnnotLineEndingStyle end) {
+  Object obj1, obj2;
+
+  startStyle = start;
+  endStyle = end;
+
+  obj1.initArray(xref);
+  obj1.arrayAdd( obj2.initName(convertAnnotLineEndingStyle( startStyle )) );
+  obj1.arrayAdd( obj2.initName(convertAnnotLineEndingStyle( endStyle )) );
+
+  update("LE", &obj1);
+}
+
+void AnnotPolygon::setInteriorColor(AnnotColor *new_color) {
+  delete interiorColor;
+
+  if (new_color) {
+    Object obj1;
+    new_color->writeToObject(xref, &obj1);
+    update ("IC", &obj1);
+    interiorColor = new_color;
+  } else {
+    interiorColor = NULL;
+  }
+}
+
+void AnnotPolygon::setIntent(AnnotPolygonIntent new_intent) {
+  Object obj1;
+
+  intent = new_intent;
+  if (new_intent == polygonCloud)
+    obj1.initName("PolygonCloud");
+  else if (new_intent == polylineDimension)
+    obj1.initName("PolyLineDimension");
+  else // polygonDimension
+    obj1.initName("PolygonDimension");
+  update ("IT", &obj1);
+}
+
+void AnnotPolygon::draw(Gfx *gfx, GBool printing) {
+  Object obj;
+  double ca = 1;
+
+  if (!isVisible (printing))
+    return;
+
+  if (appearance.isNull()) {
+    appearBBox = new AnnotAppearanceBBox(rect);
+    ca = opacity;
+
+    appearBuf = new GooString ();
+    appearBuf->append ("q\n");
+
+    if (color) {
+      setColor(color, gFalse);
+    }
+
+    if (border) {
+      int i, dashLength;
+      double *dash;
+
+      switch (border->getStyle()) {
+      case AnnotBorder::borderDashed:
+        appearBuf->append("[");
+        dashLength = border->getDashLength();
+        dash = border->getDash();
+        for (i = 0; i < dashLength; ++i)
+          appearBuf->appendf(" {0:.2f}", dash[i]);
+        appearBuf->append(" ] 0 d\n");
+        break;
+      default:
+        appearBuf->append("[] 0 d\n");
+        break;
+      }
+      appearBuf->appendf("{0:.2f} w\n", border->getWidth());
+      appearBBox->setBorderWidth(border->getWidth());
+    }
+
+    if (interiorColor) {
+      setColor(interiorColor, gTrue);
+    }
+
+    if (vertices->getCoordsLength() != 0) {
+      appearBuf->appendf ("{0:.2f} {1:.2f} m\n", vertices->getX(0) - rect->x1, vertices->getY(0) - rect->y1);
+      appearBBox->extendTo (vertices->getX(0) - rect->x1, vertices->getY(0) - rect->y1);
+
+      for (int i = 1; i < vertices->getCoordsLength(); ++i) {
+        appearBuf->appendf ("{0:.2f} {1:.2f} l\n", vertices->getX(i) - rect->x1, vertices->getY(i) - rect->y1);
+        appearBBox->extendTo (vertices->getX(i) - rect->x1, vertices->getY(i) - rect->y1);
+      }
+
+      if (type == typePolygon) {
+        if (interiorColor && interiorColor->getSpace() != AnnotColor::colorTransparent) {
+          appearBuf->append ("b\n");
+        } else {
+          appearBuf->append ("s\n");
+        }
+      } else {
+        appearBuf->append ("S\n");
+      }
+    }
+
+    appearBuf->append ("Q\n");
+
+    double bbox[4];
+    appearBBox->getBBoxRect(bbox);
+    if (ca == 1) {
+      createForm(bbox, gFalse, NULL, &appearance);
+    } else {
+      Object aStream, resDict;
+
+      createForm(bbox, gTrue, NULL, &aStream);
+      delete appearBuf;
+
+      appearBuf = new GooString ("/GS0 gs\n/Fm0 Do");
+      createResourcesDict("Fm0", &aStream, "GS0", ca, NULL, &resDict);
+      createForm(bbox, gFalse, &resDict, &appearance);
+    }
+    delete appearBuf;
+  }
+
+  // draw the appearance stream
+  appearance.fetch(xref, &obj);
+  if (appearBBox) {
+    gfx->drawAnnot(&obj, (AnnotBorder *)NULL, color,
+                   appearBBox->getPageXMin(), appearBBox->getPageYMin(),
+                   appearBBox->getPageXMax(), appearBBox->getPageYMax());
+  } else {
+    gfx->drawAnnot(&obj, (AnnotBorder *)NULL, color,
+                   rect->x1, rect->y1, rect->x2, rect->y2);
+  }
+  obj.free();
+}
+
+//------------------------------------------------------------------------
+// AnnotCaret
+//------------------------------------------------------------------------
+AnnotCaret::AnnotCaret(PDFDoc *docA, PDFRectangle *rect) :
+    AnnotMarkup(docA, rect) {
+  Object obj1;
+
+  type = typeCaret;
+
+  annotObj.dictSet ("Subtype", obj1.initName ("Caret"));
+  initialize(docA, annotObj.getDict());
+}
+
+AnnotCaret::AnnotCaret(PDFDoc *docA, Dict *dict, Object *obj) :
+  AnnotMarkup(docA, dict, obj) {
+  type = typeCaret;
+  initialize(docA, dict);
+}
+
+AnnotCaret::~AnnotCaret() {
+  delete caretRect;
+}
+
+void AnnotCaret::initialize(PDFDoc *docA, Dict* dict) {
+  Object obj1;
+
+  symbol = symbolNone;
+  if (dict->lookup("Sy", &obj1)->isName()) {
+    GooString typeName(obj1.getName());
+    if (!typeName.cmp("P")) {
+      symbol = symbolP;
+    } else if (!typeName.cmp("None")) {
+      symbol = symbolNone;
+    }
+  }
+  obj1.free();
+
+  if (dict->lookup("RD", &obj1)->isArray()) {
+    caretRect = parseDiffRectangle(obj1.getArray(), rect);
+  } else {
+    caretRect = NULL;
+  }
+  obj1.free();
+
+}
+
+void AnnotCaret::setSymbol(AnnotCaretSymbol new_symbol) {
+  Object obj1;
+  obj1.initName( new_symbol == symbolP ? "P" : "None" );
+  symbol = new_symbol;
+  update("Sy", &obj1);
+}
+
+//------------------------------------------------------------------------
+// AnnotInk
+//------------------------------------------------------------------------
+AnnotInk::AnnotInk(PDFDoc *docA, PDFRectangle *rect, AnnotPath **paths, int n_paths) :
+    AnnotMarkup(docA, rect) {
+  Object obj1;
+
+  type = typeInk;
+
+  annotObj.dictSet ("Subtype", obj1.initName ("Ink"));
+
+  Object obj2;
+  obj2.initArray (doc->getXRef());
+  writeInkList(paths, n_paths, obj2.getArray());
+
+  annotObj.dictSet ("InkList", &obj2);
+
+  initialize(docA, annotObj.getDict());
+}
+
+AnnotInk::AnnotInk(PDFDoc *docA, Dict *dict, Object *obj) :
+  AnnotMarkup(docA, dict, obj) {
+  type = typeInk;
+  initialize(docA, dict);
+}
+
+AnnotInk::~AnnotInk() {
+  freeInkList();
+}
+
+void AnnotInk::initialize(PDFDoc *docA, Dict* dict) {
+  Object obj1;
+
+  if (dict->lookup("InkList", &obj1)->isArray()) {
+    parseInkList(obj1.getArray());
+  } else {
+    inkListLength = 0;
+    inkList = NULL;
+    error(errSyntaxError, -1, "Bad Annot Ink List");
+    ok = gFalse;
+  }
+  obj1.free();
+}
+
+void AnnotInk::writeInkList(AnnotPath **paths, int n_paths, Array *dest_array) {
+  Object obj1, obj2;
+  for (int i = 0; i < n_paths; ++i) {
+    AnnotPath *path = paths[i];
+    obj1.initArray (xref);
+    for (int j = 0; j < path->getCoordsLength(); ++j) {
+      obj1.arrayAdd (obj2.initReal (path->getX(j)));
+      obj1.arrayAdd (obj2.initReal (path->getY(j)));
+    }
+    dest_array->add (&obj1);
+  }
+}
+
+void AnnotInk::parseInkList(Array *array) {
+  inkListLength = array->getLength();
+  inkList = (AnnotPath **) gmallocn ((inkListLength), sizeof(AnnotPath *));
+  memset(inkList, 0, inkListLength * sizeof(AnnotPath *));
+  for (int i = 0; i < inkListLength; i++) {
+    Object obj2;
+    if (array->get(i, &obj2)->isArray())
+      inkList[i] = new AnnotPath(obj2.getArray());
+    obj2.free();
+  }
+}
+
+void AnnotInk::freeInkList() {
+  if (inkList) {
+    for (int i = 0; i < inkListLength; ++i)
+      delete inkList[i];
+    gfree(inkList);
+  }
+}
+
+void AnnotInk::setInkList(AnnotPath **paths, int n_paths) {
+  Object obj1;
+
+  freeInkList();
+
+  obj1.initArray (xref);
+  writeInkList(paths, n_paths, obj1.getArray());
+
+  parseInkList(obj1.getArray());
+  annotObj.dictSet ("InkList", &obj1);
+}
+
+void AnnotInk::draw(Gfx *gfx, GBool printing) {
+  Object obj;
+  double ca = 1;
+
+  if (!isVisible (printing))
+    return;
+
+  if (appearance.isNull()) {
+    appearBBox = new AnnotAppearanceBBox(rect);
+    ca = opacity;
+
+    appearBuf = new GooString ();
+    appearBuf->append ("q\n");
+
+    if (color) {
+      setColor(color, gFalse);
+    }
+
+    if (border) {
+      appearBuf->appendf("{0:.2f} w\n", border->getWidth());
+      appearBBox->setBorderWidth(border->getWidth());
+    }
+
+    for (int i = 0; i < inkListLength; ++i) {
+      const AnnotPath * path = inkList[i];
+      if (path->getCoordsLength() != 0) {
+        appearBuf->appendf ("{0:.2f} {1:.2f} m\n", path->getX(0) - rect->x1, path->getY(0) - rect->y1);
+        appearBBox->extendTo (path->getX(0) - rect->x1, path->getY(0) - rect->y1);
+
+        for (int j = 1; j < path->getCoordsLength(); ++j) {
+          appearBuf->appendf ("{0:.2f} {1:.2f} l\n", path->getX(j) - rect->x1, path->getY(j) - rect->y1);
+          appearBBox->extendTo (path->getX(j) - rect->x1, path->getY(j) - rect->y1);
+        }
+
+        appearBuf->append ("S\n");
+      }
+    }
+
+    appearBuf->append ("Q\n");
+
+    double bbox[4];
+    appearBBox->getBBoxRect(bbox);
+    if (ca == 1) {
+      createForm(bbox, gFalse, NULL, &appearance);
+    } else {
+      Object aStream, resDict;
+
+      createForm(bbox, gTrue, NULL, &aStream);
+      delete appearBuf;
+
+      appearBuf = new GooString ("/GS0 gs\n/Fm0 Do");
+      createResourcesDict("Fm0", &aStream, "GS0", ca, NULL, &resDict);
+      createForm(bbox, gFalse, &resDict, &appearance);
+    }
+    delete appearBuf;
+  }
+
+  // draw the appearance stream
+  appearance.fetch(xref, &obj);
+  if (appearBBox) {
+    gfx->drawAnnot(&obj, (AnnotBorder *)NULL, color,
+                   appearBBox->getPageXMin(), appearBBox->getPageYMin(),
+                   appearBBox->getPageXMax(), appearBBox->getPageYMax());
+  } else {
+    gfx->drawAnnot(&obj, (AnnotBorder *)NULL, color,
+                   rect->x1, rect->y1, rect->x2, rect->y2);
+  }
+  obj.free();
+}
+
+//------------------------------------------------------------------------
+// AnnotFileAttachment
+//------------------------------------------------------------------------
+AnnotFileAttachment::AnnotFileAttachment(PDFDoc *docA, PDFRectangle *rect, GooString *filename) :
+    AnnotMarkup(docA, rect) {
+  Object obj1;
+
+  type = typeFileAttachment;
+
+  annotObj.dictSet ("Subtype", obj1.initName ("FileAttachment"));
+
+  Object obj2;
+  obj2.initString(filename->copy());
+  annotObj.dictSet ("FS", &obj2);
+
+  initialize(docA, annotObj.getDict());
+}
+
+AnnotFileAttachment::AnnotFileAttachment(PDFDoc *docA, Dict *dict, Object *obj) :
+  AnnotMarkup(docA, dict, obj) {
+  type = typeFileAttachment;
+  initialize(docA, dict);
+}
+
+AnnotFileAttachment::~AnnotFileAttachment() {
+  file.free();
+
+  if (name)
+    delete name;
+}
+
+void AnnotFileAttachment::initialize(PDFDoc *docA, Dict* dict) {
+  Object obj1;
+
+  if (dict->lookup("FS", &obj1)->isDict() || dict->lookup("FS", &obj1)->isString()) {
+    obj1.copy(&file);
+  } else {
+    error(errSyntaxError, -1, "Bad Annot File Attachment");
+    ok = gFalse;
+  }
+  obj1.free();
+
+  if (dict->lookup("Name", &obj1)->isName()) {
+    name = new GooString(obj1.getName());
+  } else {
+    name = new GooString("PushPin");
+  }
+  obj1.free();
+}
+
+#define ANNOT_FILE_ATTACHMENT_AP_PUSHPIN                                         \
+  "4.301 23 m 19.699 23 l 21.523 23 23 21.523 23 19.699 c 23 4.301 l 23\n"       \
+  "2.477 21.523 1 19.699 1 c 4.301 1 l 2.477 1 1 2.477 1 4.301 c 1 19.699\n"     \
+  "l 1 21.523 2.477 23 4.301 23 c h\n"                                           \
+  "4.301 23 m f\n"                                                               \
+  "0.533333 0.541176 0.521569 RG 2 w\n"                                          \
+  "1 J\n"                                                                        \
+  "1 j\n"                                                                        \
+  "[] 0.0 d\n"                                                                   \
+  "4 M 5 4 m 6 5 l S\n"                                                          \
+  "2 w\n"                                                                        \
+  "11 14 m 9 12 l 6 12 l 13 5 l 13 8 l 15 10 l 18 11 l 20 11 l 12 19 l 12\n"     \
+  "17 l 11 14 l h\n"                                                             \
+  "11 14 m S\n"                                                                  \
+  "3 w\n"                                                                        \
+  "6 5 m 9 8 l S\n"                                                              \
+  "0.729412 0.741176 0.713725 RG 2 w\n"                                          \
+  "5 5 m 6 6 l S\n"                                                              \
+  "2 w\n"                                                                        \
+  "11 15 m 9 13 l 6 13 l 13 6 l 13 9 l 15 11 l 18 12 l 20 12 l 12 20 l 12\n"     \
+  "18 l 11 15 l h\n"                                                             \
+  "11 15 m S\n"                                                                  \
+  "3 w\n"                                                                        \
+  "6 6 m 9 9 l S\n"
+
+#define ANNOT_FILE_ATTACHMENT_AP_PAPERCLIP                                       \
+  "4.301 23 m 19.699 23 l 21.523 23 23 21.523 23 19.699 c 23 4.301 l 23\n"       \
+  "2.477 21.523 1 19.699 1 c 4.301 1 l 2.477 1 1 2.477 1 4.301 c 1 19.699\n"     \
+  "l 1 21.523 2.477 23 4.301 23 c h\n"                                           \
+  "4.301 23 m f\n"                                                               \
+  "0.533333 0.541176 0.521569 RG 2 w\n"                                          \
+  "1 J\n"                                                                        \
+  "1 j\n"                                                                        \
+  "[] 0.0 d\n"                                                                   \
+  "4 M 16.645 12.035 m 12.418 7.707 l 10.902 6.559 6.402 11.203 8.09 12.562 c\n" \
+  "14.133 18.578 l 14.949 19.387 16.867 19.184 17.539 18.465 c 20.551\n"         \
+  "15.23 l 21.191 14.66 21.336 12.887 20.426 12.102 c 13.18 4.824 l 12.18\n"     \
+  "3.82 6.25 2.566 4.324 4.461 c 3 6.395 3.383 11.438 4.711 12.801 c 9.648\n"    \
+  "17.887 l S\n"                                                                 \
+  "0.729412 0.741176 0.713725 RG 16.645 13.035 m 12.418 8.707 l\n"               \
+  "10.902 7.559 6.402 12.203 8.09 13.562 c\n"                                    \
+  "14.133 19.578 l 14.949 20.387 16.867 20.184 17.539 19.465 c 20.551\n"         \
+  "16.23 l 21.191 15.66 21.336 13.887 20.426 13.102 c 13.18 5.824 l 12.18\n"     \
+  "4.82 6.25 3.566 4.324 5.461 c 3 7.395 3.383 12.438 4.711 13.801 c 9.648\n"    \
+  "18.887 l S\n"
+
+#define ANNOT_FILE_ATTACHMENT_AP_GRAPH                                           \
+  "4.301 23 m 19.699 23 l 21.523 23 23 21.523 23 19.699 c 23 4.301 l 23\n"       \
+  "2.477 21.523 1 19.699 1 c 4.301 1 l 2.477 1 1 2.477 1 4.301 c 1 19.699\n"     \
+  "l 1 21.523 2.477 23 4.301 23 c h\n"                                           \
+  "4.301 23 m f\n"                                                               \
+  "0.533333 0.541176 0.521569 RG 1 w\n"                                          \
+  "1 J\n"                                                                        \
+  "0 j\n"                                                                        \
+  "[] 0.0 d\n"                                                                   \
+  "4 M 18.5 15.5 m 18.5 13.086 l 16.086 15.5 l 18.5 15.5 l h\n"                  \
+  "18.5 15.5 m S\n"                                                              \
+  "7 7 m 10 11 l 13 9 l 18 15 l S\n"                                             \
+  "0.729412 0.741176 0.713725 RG 7 8 m 10 12 l 13 10 l 18 16 l S\n"              \
+  "18.5 16.5 m 18.5 14.086 l 16.086 16.5 l 18.5 16.5 l h\n"                      \
+  "18.5 16.5 m S\n"                                                              \
+  "0.533333 0.541176 0.521569 RG 2 w\n"                                          \
+  "1 j\n"                                                                        \
+  "3 19 m 3 3 l 21 3 l S\n"                                                      \
+  "0.729412 0.741176 0.713725 RG 3 20 m 3 4 l 21 4 l S\n"
+
+#define ANNOT_FILE_ATTACHMENT_AP_TAG                                             \
+  "4.301 23 m 19.699 23 l 21.523 23 23 21.523 23 19.699 c 23 4.301 l 23\n"       \
+  "2.477 21.523 1 19.699 1 c 4.301 1 l 2.477 1 1 2.477 1 4.301 c 1 19.699\n"     \
+  "l 1 21.523 2.477 23 4.301 23 c h\n"                                           \
+  "4.301 23 m f\n"                                                               \
+  "0.533333 0.541176 0.521569 RG 0.999781 w\n"                                   \
+  "1 J\n"                                                                        \
+  "1 j\n"                                                                        \
+  "[] 0.0 d\n"                                                                   \
+  "4 M q 1 0 0 -1 0 24 cm\n"                                                     \
+  "8.492 8.707 m 8.492 9.535 7.82 10.207 6.992 10.207 c 6.164 10.207 5.492\n"    \
+  "9.535 5.492 8.707 c 5.492 7.879 6.164 7.207 6.992 7.207 c 7.82 7.207\n"       \
+  "8.492 7.879 8.492 8.707 c h\n"                                                \
+  "8.492 8.707 m S Q\n"                                                          \
+  "2 w\n"                                                                        \
+  "20.078 11.414 m 20.891 10.602 20.785 9.293 20.078 8.586 c 14.422 2.93 l\n"    \
+  "13.715 2.223 12.301 2.223 11.594 2.93 c 3.816 10.707 l 3.109 11.414\n"        \
+  "2.402 17.781 3.816 19.195 c 5.23 20.609 11.594 19.902 12.301 19.195 c\n"      \
+  "20.078 11.414 l h\n"                                                          \
+  "20.078 11.414 m S\n"                                                          \
+  "0.729412 0.741176 0.713725 RG 20.078 12.414 m\n"                              \
+  "20.891 11.605 20.785 10.293 20.078 9.586 c 14.422 3.93 l\n"                   \
+  "13.715 3.223 12.301 3.223 11.594 3.93 c 3.816 11.707 l 3.109 12.414\n"        \
+  "2.402 18.781 3.816 20.195 c 5.23 21.609 11.594 20.902 12.301 20.195 c\n"      \
+  "20.078 12.414 l h\n"                                                          \
+  "20.078 12.414 m S\n"                                                          \
+  "0.533333 0.541176 0.521569 RG 1 w\n"                                          \
+  "0 j\n"                                                                        \
+  "11.949 13.184 m 16.191 8.941 l S\n"                                           \
+  "0.729412 0.741176 0.713725 RG 11.949 14.184 m 16.191 9.941 l S\n"             \
+  "0.533333 0.541176 0.521569 RG 14.07 6.82 m 9.828 11.062 l S\n"                \
+  "0.729412 0.741176 0.713725 RG 14.07 7.82 m 9.828 12.062 l S\n"                \
+  "0.533333 0.541176 0.521569 RG 6.93 15.141 m 8 20 14.27 20.5 16 20.5 c\n"      \
+  "18.094 20.504 19.5 20 19.5 18 c 19.5 16.699 20.91 16.418 22.5 16.5 c S\n"     \
+  "0.729412 0.741176 0.713725 RG 0.999781 w\n"                                   \
+  "1 j\n"                                                                        \
+  "q 1 0 0 -1 0 24 cm\n"                                                         \
+  "8.492 7.707 m 8.492 8.535 7.82 9.207 6.992 9.207 c 6.164 9.207 5.492\n"       \
+  "8.535 5.492 7.707 c 5.492 6.879 6.164 6.207 6.992 6.207 c 7.82 6.207\n"       \
+  "8.492 6.879 8.492 7.707 c h\n"                                                \
+  "8.492 7.707 m S Q\n"                                                          \
+  "1 w\n"                                                                        \
+  "0 j\n"                                                                        \
+  "6.93 16.141 m 8 21 14.27 21.5 16 21.5 c 18.094 21.504 19.5 21 19.5 19 c\n"    \
+  "19.5 17.699 20.91 17.418 22.5 17.5 c S\n"
+
+void AnnotFileAttachment::draw(Gfx *gfx, GBool printing) {
+  Object obj;
+  double ca = 1;
+
+  if (!isVisible (printing))
+    return;
+
+  if (appearance.isNull()) {
+    ca = opacity;
+
+    appearBuf = new GooString ();
+
+    appearBuf->append ("q\n");
+    if (color)
+      setColor(color, gTrue);
+    else
+      appearBuf->append ("1 1 1 rg\n");
+    if (!name->cmp("PushPin"))
+      appearBuf->append (ANNOT_FILE_ATTACHMENT_AP_PUSHPIN);
+    else if (!name->cmp("Paperclip"))
+      appearBuf->append (ANNOT_FILE_ATTACHMENT_AP_PAPERCLIP);
+    else if (!name->cmp("Graph"))
+      appearBuf->append (ANNOT_FILE_ATTACHMENT_AP_GRAPH);
+    else if (!name->cmp("Tag"))
+      appearBuf->append (ANNOT_FILE_ATTACHMENT_AP_TAG);
+    appearBuf->append ("Q\n");
+
+    double bbox[4];
+    bbox[0] = bbox[1] = 0;
+    bbox[2] = bbox[3] = 24;
+    if (ca == 1) {
+      createForm (bbox, gFalse, NULL, &appearance);
+    } else {
+      Object aStream;
+
+      createForm (bbox, gTrue, NULL, &aStream);
+      delete appearBuf;
+
+      Object resDict;
+      appearBuf = new GooString ("/GS0 gs\n/Fm0 Do");
+      createResourcesDict("Fm0", &aStream, "GS0", ca, NULL, &resDict);
+      createForm(bbox, gFalse, &resDict, &appearance);
+    }
+    delete appearBuf;
+  }
+
+  // draw the appearance stream
+  appearance.fetch(xref, &obj);
+  gfx->drawAnnot(&obj, border, color,
+                rect->x1, rect->y1, rect->x2, rect->y2);
+  obj.free();
+}
+
+//------------------------------------------------------------------------
+// AnnotSound
+//------------------------------------------------------------------------
+AnnotSound::AnnotSound(PDFDoc *docA, PDFRectangle *rect, Sound *soundA) :
+    AnnotMarkup(docA, rect) {
+  Object obj1;
+
+  type = typeSound;
+
+  annotObj.dictSet ("Subtype", obj1.initName ("Sound"));
+
+  Object obj2;
+  Stream *str = soundA->getStream();
+  obj2.initStream (str);
+  str->incRef(); //FIXME: initStream should do this?
+  annotObj.dictSet ("Sound", &obj2);
+
+  initialize(docA, annotObj.getDict());
+}
+
+AnnotSound::AnnotSound(PDFDoc *docA, Dict *dict, Object *obj) :
+  AnnotMarkup(docA, dict, obj) {
+  type = typeSound;
+  initialize(docA, dict);
+}
+
+AnnotSound::~AnnotSound() {
+  delete sound;
+
+  delete name;
+}
+
+void AnnotSound::initialize(PDFDoc *docA, Dict* dict) {
+  Object obj1;
+
+  sound = Sound::parseSound(dict->lookup("Sound", &obj1));
+  if (!sound) {
+    error(errSyntaxError, -1, "Bad Annot Sound");
+    ok = gFalse;
+  }
+  obj1.free();
+
+  if (dict->lookup("Name", &obj1)->isName()) {
+    name = new GooString(obj1.getName());
+  } else {
+    name = new GooString("Speaker");
+  }
+  obj1.free();
+}
+
+#define ANNOT_SOUND_AP_SPEAKER                                               \
+  "4.301 23 m 19.699 23 l 21.523 23 23 21.523 23 19.699 c 23 4.301 l 23\n"   \
+  "2.477 21.523 1 19.699 1 c 4.301 1 l 2.477 1 1 2.477 1 4.301 c 1 19.699\n" \
+  "l 1 21.523 2.477 23 4.301 23 c h\n"                                       \
+  "4.301 23 m f\n"                                                           \
+  "0.533333 0.541176 0.521569 RG 2 w\n"                                      \
+  "0 J\n"                                                                    \
+  "1 j\n"                                                                    \
+  "[] 0.0 d\n"                                                               \
+  "4 M 4 14 m 4.086 8.043 l 7 8 l 11 4 l 11 18 l 7 14 l 4 14 l h\n"          \
+  "4 14 m S\n"                                                               \
+  "1 w\n"                                                                    \
+  "1 J\n"                                                                    \
+  "0 j\n"                                                                    \
+  "13.699 15.398 m 14.699 13.398 14.699 9.398 13.699 7.398 c S\n"            \
+  "18.199 19.398 m 21.199 17.398 21.199 5.398 18.199 3.398 c S\n"            \
+  "16 17.398 m 18 16.398 18 7.398 16 5.398 c S\n"                            \
+  "0.729412 0.741176 0.713725 RG 2 w\n"                                      \
+  "0 J\n"                                                                    \
+  "1 j\n"                                                                    \
+  "4 15 m 4.086 9.043 l 7 9 l 11 5 l 11 19 l 7 15 l 4 15 l h\n"              \
+  "4 15 m S\n"                                                               \
+  "1 w\n"                                                                    \
+  "1 J\n"                                                                    \
+  "0 j\n"                                                                    \
+  "13.699 16 m 14.699 14 14.699 10 13.699 8 c S\n"                           \
+  "18.199 20 m 21.199 18 21.199 6 18.199 4 c S\n"                            \
+  "16 18 m 18 17 18 8 16 6 c S\n"
+
+#define ANNOT_SOUND_AP_MIC                                                        \
+  "4.301 23 m 19.699 23 l 21.523 23 23 21.523 23 19.699 c 23 4.301 l 23\n"        \
+  "2.477 21.523 1 19.699 1 c 4.301 1 l 2.477 1 1 2.477 1 4.301 c 1 19.699\n"      \
+  "l 1 21.523 2.477 23 4.301 23 c h\n"                                            \
+  "4.301 23 m f\n"                                                                \
+  "0.533333 0.541176 0.521569 RG 2 w\n"                                           \
+  "1 J\n"                                                                         \
+  "0 j\n"                                                                         \
+  "[] 0.0 d\n"                                                                    \
+  "4 M 12 20 m 12 20 l 13.656 20 15 18.656 15 17 c 15 13 l 15 11.344 13.656 10\n" \
+  "12 10 c 12 10 l 10.344 10 9 11.344 9 13 c 9 17 l 9 18.656 10.344 20 12\n"      \
+  "20 c h\n"                                                                      \
+  "12 20 m S\n"                                                                   \
+  "1 w\n"                                                                         \
+  "17.5 14.5 m 17.5 11.973 l 17.5 8.941 15.047 6.5 12 6.5 c 8.953 6.5 6.5\n"      \
+  "8.941 6.5 11.973 c 6.5 14.5 l S\n"                                             \
+  "2 w\n"                                                                         \
+  "0 J\n"                                                                         \
+  "12 6.52 m 12 3 l S\n"                                                          \
+  "1 J\n"                                                                         \
+  "8 3 m 16 3 l S\n"                                                              \
+  "0.729412 0.741176 0.713725 RG 12 21 m 12 21 l 13.656 21 15 19.656 15 18 c\n"   \
+  "15 14 l 15 12.344 13.656 11 12 11 c 12 11 l 10.344 11 9 12.344 9 14 c\n"       \
+  "9 18 l 9 19.656 10.344 21 12 21 c h\n"                                         \
+  "12 21 m S\n"                                                                   \
+  "1 w\n"                                                                         \
+  "17.5 15.5 m 17.5 12.973 l 17.5 9.941 15.047 7.5 12 7.5 c 8.953 7.5 6.5\n"      \
+  "9.941 6.5 12.973 c 6.5 15.5 l S\n"                                             \
+  "2 w\n"                                                                         \
+  "0 J\n"                                                                         \
+  "12 7.52 m 12 4 l S\n"                                                          \
+  "1 J\n"                                                                         \
+  "8 4 m 16 4 l S\n"
+
+void AnnotSound::draw(Gfx *gfx, GBool printing) {
+  Object obj;
+  double ca = 1;
+
+  if (!isVisible (printing))
+    return;
+
+  if (appearance.isNull()) {
+    ca = opacity;
+
+    appearBuf = new GooString ();
+
+    appearBuf->append ("q\n");
+    if (color)
+      setColor(color, gTrue);
+    else
+      appearBuf->append ("1 1 1 rg\n");
+    if (!name->cmp("Speaker"))
+      appearBuf->append (ANNOT_SOUND_AP_SPEAKER);
+    else if (!name->cmp("Mic"))
+      appearBuf->append (ANNOT_SOUND_AP_MIC);
+    appearBuf->append ("Q\n");
+
+    double bbox[4];
+    bbox[0] = bbox[1] = 0;
+    bbox[2] = bbox[3] = 24;
+    if (ca == 1) {
+      createForm(bbox, gFalse, NULL, &appearance);
+    } else {
+      Object aStream, resDict;
+
+      createForm(bbox, gTrue, NULL, &aStream);
+      delete appearBuf;
+
+      appearBuf = new GooString ("/GS0 gs\n/Fm0 Do");
+      createResourcesDict("Fm0", &aStream, "GS0", ca, NULL, &resDict);
+      createForm(bbox, gFalse, &resDict, &appearance);
+    }
+    delete appearBuf;
+  }
+
+  // draw the appearance stream
+  appearance.fetch(xref, &obj);
+  gfx->drawAnnot(&obj, border, color,
+                rect->x1, rect->y1, rect->x2, rect->y2);
+  obj.free();
+}
+
+//------------------------------------------------------------------------
+// Annot3D
+//------------------------------------------------------------------------
+Annot3D::Annot3D(PDFDoc *docA, PDFRectangle *rect) :
+    Annot(docA, rect) {
+  Object obj1;
+
+  type = type3D;
+
+  annotObj.dictSet ("Subtype", obj1.initName ("3D"));
+
+  initialize(docA, annotObj.getDict());
+}
+
+Annot3D::Annot3D(PDFDoc *docA, Dict *dict, Object *obj) :
+  Annot(docA, dict, obj) {
+  type = type3D;
+  initialize(docA, dict);
+}
+
+Annot3D::~Annot3D() {
+  if (activation)
+    delete activation;
+}
+
+void Annot3D::initialize(PDFDoc *docA, Dict* dict) {
+  Object obj1;
+
+  if (dict->lookup("3DA", &obj1)->isDict()) {
+    activation = new Activation(obj1.getDict());
+  } else {
+    activation = NULL;
+  }
+  obj1.free();
+}
+
+Annot3D::Activation::Activation(Dict *dict) {
+  Object obj1;
+
+  if (dict->lookup("A", &obj1)->isName()) {
+    const char *name = obj1.getName();
+
+    if(!strcmp(name, "PO")) {
+      aTrigger = aTriggerPageOpened;
+    } else if(!strcmp(name, "PV")) {
+      aTrigger = aTriggerPageVisible;
+    } else if(!strcmp(name, "XA")) {
+      aTrigger = aTriggerUserAction;
+    } else {
+      aTrigger = aTriggerUnknown;
+    }
+  } else {
+    aTrigger = aTriggerUnknown;
+  }
+  obj1.free();
+
+  if(dict->lookup("AIS", &obj1)->isName()) {
+    const char *name = obj1.getName();
+
+    if(!strcmp(name, "I")) {
+      aState = aStateEnabled;
+    } else if(!strcmp(name, "L")) {
+      aState = aStateDisabled;
+    } else {
+      aState = aStateUnknown;
+    }
+  } else {
+    aState = aStateUnknown;
+  }
+  obj1.free();
+
+  if(dict->lookup("D", &obj1)->isName()) {
+    const char *name = obj1.getName();
+
+    if(!strcmp(name, "PC")) {
+      dTrigger = dTriggerPageClosed;
+    } else if(!strcmp(name, "PI")) {
+      dTrigger = dTriggerPageInvisible;
+    } else if(!strcmp(name, "XD")) {
+      dTrigger = dTriggerUserAction;
+    } else {
+      dTrigger = dTriggerUnknown;
+    }
+  } else {
+    dTrigger = dTriggerUnknown;
+  }
+  obj1.free();
+
+  if(dict->lookup("DIS", &obj1)->isName()) {
+    const char *name = obj1.getName();
+
+    if(!strcmp(name, "U")) {
+      dState = dStateUninstantiaded;
+    } else if(!strcmp(name, "I")) {
+      dState = dStateInstantiated;
+    } else if(!strcmp(name, "L")) {
+      dState = dStateLive;
+    } else {
+      dState = dStateUnknown;
+    }
+  } else {
+    dState = dStateUnknown;
+  }
+  obj1.free();
+
+  if (dict->lookup("TB", &obj1)->isBool()) {
+    displayToolbar = obj1.getBool();
+  } else {
+    displayToolbar = gTrue;
+  }
+  obj1.free();
+
+  if (dict->lookup("NP", &obj1)->isBool()) {
+    displayNavigation = obj1.getBool();
+  } else {
+    displayNavigation = gFalse;
+  }
+  obj1.free();
+}
+
+//------------------------------------------------------------------------
+// Annots
+//------------------------------------------------------------------------
+
+Annots::Annots(PDFDoc *docA, Object *annotsObj) {
+  Annot *annot;
+  Object obj1;
+  int i;
+
+  doc = docA;
+  annots = NULL;
+  size = 0;
+  nAnnots = 0;
+
+  if (annotsObj->isArray()) {
+    for (i = 0; i < annotsObj->arrayGetLength(); ++i) {
+      //get the Ref to this annot and pass it to Annot constructor 
+      //this way, it'll be possible for the annot to retrieve the corresponding
+      //form widget
+      Object obj2;
+      if (annotsObj->arrayGet(i, &obj1)->isDict()) {
+        annotsObj->arrayGetNF(i, &obj2);
+        annot = createAnnot (obj1.getDict(), &obj2);
+        if (annot) {
+          if (annot->isOk()) {
+            appendAnnot(annot);
+          }
+          annot->decRefCnt();
+        }
+      }
+      obj2.free();
+      obj1.free();
+    }
+  }
+}
+
+void Annots::appendAnnot(Annot *annot) {
+  if (annot && annot->isOk()) {
+    if (nAnnots >= size) {
+      size += 16;
+      annots = (Annot **)greallocn(annots, size, sizeof(Annot *));
+    }
+    annots[nAnnots++] = annot;
+    annot->incRefCnt();
+  }
+}
+
+GBool Annots::removeAnnot(Annot *annot) {
+  int idx = -1;
+  // Search annot and determine its index
+  for (int i = 0; idx == -1 && i < nAnnots; i++) {
+    if (annots[i] == annot) {
+      idx = i;
+    }
+  }
+  if (idx == -1) {
+    return gFalse;
+  } else {
+    --nAnnots;
+    memmove( annots + idx, annots + idx + 1, sizeof(annots[0]) * (nAnnots - idx) );
+    annot->decRefCnt();
+    return gTrue;
+  }
+}
+
+Annot *Annots::createAnnot(Dict* dict, Object *obj) {
+  Annot *annot = NULL;
+  Object obj1;
+
+  if (dict->lookup("Subtype", &obj1)->isName()) {
+    const char *typeName = obj1.getName();
+
+    if (!strcmp(typeName, "Text")) {
+      annot = new AnnotText(doc, dict, obj);
+    } else if (!strcmp(typeName, "Link")) {
+      annot = new AnnotLink(doc, dict, obj);
+    } else if (!strcmp(typeName, "FreeText")) {
+      annot = new AnnotFreeText(doc, dict, obj);
+    } else if (!strcmp(typeName, "Line")) {
+      annot = new AnnotLine(doc, dict, obj);
+    } else if (!strcmp(typeName, "Square")) {
+      annot = new AnnotGeometry(doc, dict, obj);
+    } else if (!strcmp(typeName, "Circle")) {
+      annot = new AnnotGeometry(doc, dict, obj);
+    } else if (!strcmp(typeName, "Polygon")) {
+      annot = new AnnotPolygon(doc, dict, obj);
+    } else if (!strcmp(typeName, "PolyLine")) {
+      annot = new AnnotPolygon(doc, dict, obj);
+    } else if (!strcmp(typeName, "Highlight")) {
+      annot = new AnnotTextMarkup(doc, dict, obj);
+    } else if (!strcmp(typeName, "Underline")) {
+      annot = new AnnotTextMarkup(doc, dict, obj);
+    } else if (!strcmp(typeName, "Squiggly")) {
+      annot = new AnnotTextMarkup(doc, dict, obj);
+    } else if (!strcmp(typeName, "StrikeOut")) {
+      annot = new AnnotTextMarkup(doc, dict, obj);
+    } else if (!strcmp(typeName, "Stamp")) {
+      annot = new AnnotStamp(doc, dict, obj);
+    } else if (!strcmp(typeName, "Caret")) {
+      annot = new AnnotCaret(doc, dict, obj);
+    } else if (!strcmp(typeName, "Ink")) {
+      annot = new AnnotInk(doc, dict, obj);
+    } else if (!strcmp(typeName, "FileAttachment")) {
+      annot = new AnnotFileAttachment(doc, dict, obj);
+    } else if (!strcmp(typeName, "Sound")) {
+      annot = new AnnotSound(doc, dict, obj);
+    } else if(!strcmp(typeName, "Movie")) {
+      annot = new AnnotMovie(doc, dict, obj);
+    } else if(!strcmp(typeName, "Widget")) {
+      // Find the annot in forms
+      if (obj->isRef()) {
+        Form *form = doc->getCatalog()->getForm();
+        if (form) {
+          FormWidget *widget = form->findWidgetByRef(obj->getRef());
+          if (widget) {
+            annot = widget->getWidgetAnnotation();
+            annot->incRefCnt();
+          }
+        }
+      }
+      if (!annot)
+        annot = new AnnotWidget(doc, dict, obj);
+    } else if(!strcmp(typeName, "Screen")) {
+      annot = new AnnotScreen(doc, dict, obj);
+    } else if(!strcmp(typeName, "PrinterMark")) {
+      annot = new Annot(doc, dict, obj);
+    } else if (!strcmp(typeName, "TrapNet")) {
+      annot = new Annot(doc, dict, obj);
+    } else if (!strcmp(typeName, "Watermark")) {
+      annot = new Annot(doc, dict, obj);
+    } else if (!strcmp(typeName, "3D")) {
+      annot = new Annot3D(doc, dict, obj);
+    } else if (!strcmp(typeName, "Popup")) {
+      /* Popup annots are already handled by markup annots
+       * Here we only care about popup annots without a
+       * markup annotation associated
+       */
+      Object obj2;
+
+      if (dict->lookup("Parent", &obj2)->isNull())
+        annot = new AnnotPopup(doc, dict, obj);
+      else
+        annot = NULL;
+      
+      obj2.free();
+    } else {
+      annot = new Annot(doc, dict, obj);
+    }
+  }
+  obj1.free();
+
+  return annot;
+}
+
+Annot *Annots::findAnnot(Ref *ref) {
+  int i;
+
+  for (i = 0; i < nAnnots; ++i) {
+    if (annots[i]->match(ref)) {
+      return annots[i];
+    }
+  }
+  return NULL;
+}
+
+
+Annots::~Annots() {
+  int i;
+
+  for (i = 0; i < nAnnots; ++i) {
+    annots[i]->decRefCnt();
+  }
+  gfree(annots);
+}
diff --git a/poppler/Annot.h b/poppler/Annot.h
new file mode 100644 (file)
index 0000000..04a1301
--- /dev/null
@@ -0,0 +1,1389 @@
+//========================================================================
+//
+// Annot.h
+//
+// Copyright 2000-2003 Glyph & Cog, LLC
+//
+//========================================================================
+
+//========================================================================
+//
+// Modified under the Poppler project - http://poppler.freedesktop.org
+//
+// All changes made under the Poppler project to this file are licensed
+// under GPL version 2 or later
+//
+// Copyright (C) 2006 Scott Turner <scotty1024@mac.com>
+// Copyright (C) 2007, 2008 Julien Rebetez <julienr@svn.gnome.org>
+// Copyright (C) 2007-2011 Carlos Garcia Campos <carlosgc@gnome.org>
+// Copyright (C) 2007, 2008 Iñigo Martínez <inigomartinez@gmail.com>
+// Copyright (C) 2008 Michael Vrable <mvrable@cs.ucsd.edu>
+// Copyright (C) 2008 Hugo Mercier <hmercier31@gmail.com>
+// Copyright (C) 2008 Pino Toscano <pino@kde.org>
+// Copyright (C) 2008 Tomas Are Haavet <tomasare@gmail.com>
+// Copyright (C) 2009-2011 Albert Astals Cid <aacid@kde.org>
+// Copyright (C) 2012 Fabio D'Urso <fabiodurso@hotmail.it>
+//
+// To see a description of the changes please see the Changelog file that
+// came with your tarball or type make ChangeLog if you are building from git
+//
+//========================================================================
+
+#ifndef ANNOT_H
+#define ANNOT_H
+
+#ifdef USE_GCC_PRAGMAS
+#pragma interface
+#endif
+
+#include "Object.h"
+
+class XRef;
+class Gfx;
+class CharCodeToUnicode;
+class GfxFont;
+class GfxResources;
+class PDFDoc;
+class Form;
+class FormWidget;
+class FormField;
+class FormFieldChoice;
+class PDFRectangle;
+class Movie;
+class LinkAction;
+class Sound;
+
+enum AnnotLineEndingStyle {
+  annotLineEndingSquare,        // Square
+  annotLineEndingCircle,        // Circle
+  annotLineEndingDiamond,       // Diamond
+  annotLineEndingOpenArrow,     // OpenArrow
+  annotLineEndingClosedArrow,   // ClosedArrow
+  annotLineEndingNone,          // None
+  annotLineEndingButt,          // Butt
+  annotLineEndingROpenArrow,    // ROpenArrow
+  annotLineEndingRClosedArrow,  // RClosedArrow
+  annotLineEndingSlash          // Slash
+};
+
+enum AnnotExternalDataType {
+  annotExternalDataMarkupUnknown,
+  annotExternalDataMarkup3D       // Markup3D
+};
+
+//------------------------------------------------------------------------
+// AnnotCoord
+//------------------------------------------------------------------------
+
+class AnnotCoord {
+public:
+
+  AnnotCoord() : x(0), y(0) { }
+  AnnotCoord(double _x, double _y) : x(_x), y(_y) { }
+
+  double getX() const { return x; }
+  double getY() const { return y; }
+  
+protected:
+
+  double x, y;
+};
+
+//------------------------------------------------------------------------
+// AnnotPath
+//------------------------------------------------------------------------
+
+class AnnotPath {
+public:
+  AnnotPath();
+  AnnotPath(Array *array);
+  AnnotPath(AnnotCoord **coords, int coordLength);
+  ~AnnotPath();
+
+  double getX(int coord) const;
+  double getY(int coord) const;
+  AnnotCoord *getCoord(int coord) const;
+  int getCoordsLength() const { return coordsLength; }
+protected:
+  AnnotCoord **coords;
+  int coordsLength;
+
+  void parsePathArray(Array *array);
+};
+  
+//------------------------------------------------------------------------
+// AnnotCalloutLine
+//------------------------------------------------------------------------
+
+class AnnotCalloutLine {
+public:
+
+  AnnotCalloutLine(double x1, double y1, double x2, double y2);
+  virtual ~AnnotCalloutLine() { }
+
+  double getX1() const { return coord1.getX(); }
+  double getY1() const { return coord1.getY(); }
+  double getX2() const { return coord2.getX(); }
+  double getY2() const { return coord2.getY(); }
+  
+protected:
+
+  AnnotCoord coord1, coord2;
+};
+
+//------------------------------------------------------------------------
+// AnnotCalloutMultiLine
+//------------------------------------------------------------------------
+
+class AnnotCalloutMultiLine: public AnnotCalloutLine {
+public:
+
+  AnnotCalloutMultiLine(double x1, double y1, double x2, double y2,
+    double x3, double y3);
+
+  double getX3() const { return coord3.getX(); }
+  double getY3() const { return coord3.getY(); }
+
+protected:
+
+  AnnotCoord coord3;
+};
+
+//------------------------------------------------------------------------
+// AnnotBorderEffect
+//------------------------------------------------------------------------
+
+class AnnotBorderEffect {
+public:
+
+  enum AnnotBorderEffectType {
+    borderEffectNoEffect, // S
+    borderEffectCloudy    // C
+  };
+
+  AnnotBorderEffect(Dict *dict);
+
+  AnnotBorderEffectType getEffectType() const { return effectType; }
+  double getIntensity() const { return intensity; }
+
+private:
+
+  AnnotBorderEffectType effectType; // S  (Default S)
+  double intensity;                 // I  (Default 0)
+};
+
+//------------------------------------------------------------------------
+// AnnotQuadrilateral
+//------------------------------------------------------------------------
+
+class AnnotQuadrilaterals {
+public:
+  class AnnotQuadrilateral {
+  public:
+    AnnotQuadrilateral(double x1, double y1, double x2, double y2, double x3,
+      double y3, double x4, double y4);
+
+    AnnotCoord coord1, coord2, coord3, coord4;
+  };
+
+  AnnotQuadrilaterals(Array *array, PDFRectangle *rect);
+  AnnotQuadrilaterals(AnnotQuadrilateral **quads, int quadsLength);
+  ~AnnotQuadrilaterals();
+
+  double getX1(int quadrilateral);
+  double getY1(int quadrilateral);
+  double getX2(int quadrilateral);
+  double getY2(int quadrilateral);
+  double getX3(int quadrilateral);
+  double getY3(int quadrilateral);
+  double getX4(int quadrilateral);
+  double getY4(int quadrilateral);
+  int getQuadrilateralsLength() const { return quadrilateralsLength; }
+protected:
+
+  AnnotQuadrilateral** quadrilaterals;
+  int quadrilateralsLength;
+};
+
+//------------------------------------------------------------------------
+// AnnotBorder
+//------------------------------------------------------------------------
+
+class AnnotBorder {
+public:
+  enum AnnotBorderType {
+    typeUnknown,
+    typeArray,
+    typeBS
+  };
+
+  enum AnnotBorderStyle {
+    borderSolid,      // Solid
+    borderDashed,     // Dashed
+    borderBeveled,    // Beveled
+    borderInset,      // Inset
+    borderUnderlined  // Underlined
+  };
+
+  AnnotBorder();
+  virtual ~AnnotBorder();
+
+  virtual void setWidth(double new_width) { width = new_width; }
+
+  virtual AnnotBorderType getType() const { return type; }
+  virtual double getWidth() const { return width; }
+  virtual int getDashLength() const { return dashLength; }
+  virtual double *getDash() const { return dash; }
+  virtual AnnotBorderStyle getStyle() const { return style; }
+
+protected:
+  GBool parseDashArray(Object *dashObj);
+
+  AnnotBorderType type;
+  double width;
+  static const int DASH_LIMIT = 10; // implementation note 82 in Appendix H.
+  int dashLength;
+  double *dash;
+  AnnotBorderStyle style;
+};
+
+//------------------------------------------------------------------------
+// AnnotBorderArray
+//------------------------------------------------------------------------
+
+class AnnotBorderArray: public AnnotBorder {
+public:
+  AnnotBorderArray();
+  AnnotBorderArray(Array *array);
+
+  void writeToObject(XRef *xref, Object *dest) const;
+
+  void setHorizontalCorner(double hc) { horizontalCorner = hc; }
+  void setVerticalCorner(double vc) { verticalCorner = vc; }
+
+  double getHorizontalCorner() const { return horizontalCorner; }
+  double getVerticalCorner() const { return verticalCorner; }
+
+protected:
+  double horizontalCorner;          // (Default 0)
+  double verticalCorner;            // (Default 0)
+  // double width;                  // (Default 1)  (inherited from AnnotBorder)
+};
+
+//------------------------------------------------------------------------
+// AnnotBorderBS
+//------------------------------------------------------------------------
+
+class AnnotBorderBS: public AnnotBorder {
+public:
+
+  AnnotBorderBS();
+  AnnotBorderBS(Dict *dict);
+
+private:
+  // double width;           // W  (Default 1)   (inherited from AnnotBorder)
+  // AnnotBorderStyle style; // S  (Default S)   (inherited from AnnotBorder)
+  // double *dash;           // D  (Default [3]) (inherited from AnnotBorder)
+};
+
+//------------------------------------------------------------------------
+// AnnotColor
+//------------------------------------------------------------------------
+
+class AnnotColor {
+public:
+
+  enum AnnotColorSpace {
+    colorTransparent = 0,
+    colorGray        = 1,
+    colorRGB         = 3,
+    colorCMYK        = 4
+  };
+
+  AnnotColor();
+  AnnotColor(double gray);
+  AnnotColor(double r, double g, double b);
+  AnnotColor(double c, double m, double y, double k);
+  AnnotColor(Array *array, int adjust = 0);
+
+  void adjustColor(int adjust);
+
+  AnnotColorSpace getSpace() const { return (AnnotColorSpace) length; }
+  const double *getValues() const { return values; }
+
+  void writeToObject(XRef *xref, Object *dest) const;
+
+private:
+
+  double values[4];
+  int length;
+};
+
+//------------------------------------------------------------------------
+// AnnotIconFit
+//------------------------------------------------------------------------
+
+class AnnotIconFit {
+public:
+
+  enum AnnotIconFitScaleWhen {
+    scaleAlways,  // A
+    scaleBigger,  // B
+    scaleSmaller, // S
+    scaleNever    // N
+  };
+
+  enum AnnotIconFitScale {
+    scaleAnamorphic,  // A
+    scaleProportional // P
+  };
+
+  AnnotIconFit(Dict *dict);
+
+  AnnotIconFitScaleWhen getScaleWhen() { return scaleWhen; }
+  AnnotIconFitScale getScale() { return scale; }
+  double getLeft() { return left; }
+  double getBottom() { return bottom; }
+  bool getFullyBounds() { return fullyBounds; }
+
+protected:
+
+  AnnotIconFitScaleWhen scaleWhen;  // SW (Default A)
+  AnnotIconFitScale scale;          // S  (Default P)
+  double left;                      // A  (Default [0.5 0.5]
+  double bottom;                    // Only if scale is P
+  bool fullyBounds;                 // FB (Default false)
+};
+
+//------------------------------------------------------------------------
+// AnnotAppearance
+//------------------------------------------------------------------------
+
+class AnnotAppearance {
+public:
+
+  enum AnnotAppearanceType {
+    appearNormal,
+    appearRollover,
+    appearDown
+  };
+
+  AnnotAppearance(PDFDoc *docA, Object *dict);
+  ~AnnotAppearance();
+
+  // State is ignored if no subdictionary is present
+  void getAppearanceStream(AnnotAppearanceType type, const char *state, Object *dest);
+
+  // Access keys in normal appearance subdictionary (N)
+  GooString * getStateKey(int i);
+  int getNumStates();
+
+  // Removes all associated streams in the xref table. Caller is required to
+  // reset parent annotation's AP and AS after this call.
+  void removeAllStreams();
+
+  // Test if this AnnotAppearance references the specified stream
+  GBool referencesStream(Ref targetStreamRef);
+
+private:
+  static GBool referencesStream(Object *stateObj, Ref targetStreamRef);
+  void removeStream(Ref refToStream);
+  void removeStateStreams(Object *state);
+
+protected:
+  PDFDoc *doc;
+  XRef *xref;                   // the xref table for this PDF file
+  Object appearDict;            // Annotation's AP
+};
+
+//------------------------------------------------------------------------
+// AnnotAppearanceCharacs
+//------------------------------------------------------------------------
+
+class AnnotAppearanceCharacs {
+public:
+
+  enum AnnotAppearanceCharacsTextPos {
+    captionNoIcon,    // 0
+    captionNoCaption, // 1
+    captionBelow,     // 2
+    captionAbove,     // 3
+    captionRight,     // 4
+    captionLeft,      // 5
+    captionOverlaid   // 6
+  };
+
+  AnnotAppearanceCharacs(Dict *dict);
+  ~AnnotAppearanceCharacs();
+
+  int getRotation() { return rotation; }
+  AnnotColor *getBorderColor() { return borderColor; }
+  AnnotColor *getBackColor() { return backColor; }
+  GooString *getNormalCaption() { return normalCaption; }
+  GooString *getRolloverCaption() { return rolloverCaption; }
+  GooString *getAlternateCaption() { return alternateCaption; }
+  AnnotIconFit *getIconFit() { return iconFit; }
+  AnnotAppearanceCharacsTextPos getPosition() { return position; }
+
+protected:
+
+  int rotation;                           // R  (Default 0)
+  AnnotColor *borderColor;                // BC
+  AnnotColor *backColor;                  // BG
+  GooString *normalCaption;               // CA
+  GooString *rolloverCaption;             // RC
+  GooString *alternateCaption;            // AC
+  // I
+  // RI
+  // IX
+  AnnotIconFit *iconFit;                  // IF
+  AnnotAppearanceCharacsTextPos position; // TP (Default 0)
+};
+
+//------------------------------------------------------------------------
+// AnnotAppearanceBBox
+//------------------------------------------------------------------------
+
+class AnnotAppearanceBBox
+{
+public:
+  AnnotAppearanceBBox(PDFRectangle *init);
+
+  void setBorderWidth(double w) { borderWidth = w; }
+
+  // The following functions operate on coords relative to [origX origY]
+  void extendTo(double x, double y);
+  void getBBoxRect(double bbox[4]) const;
+
+  // Get boundaries in page coordinates
+  double getPageXMin() const;
+  double getPageYMin() const;
+  double getPageXMax() const;
+  double getPageYMax() const;
+
+private:
+  double origX, origY, borderWidth;
+  double minX, minY, maxX, maxY;
+};
+
+//------------------------------------------------------------------------
+// Annot
+//------------------------------------------------------------------------
+
+class Annot {
+public:
+  enum AnnotFlag {
+    flagUnknown        = 0x0000,
+    flagInvisible      = 0x0001,
+    flagHidden         = 0x0002,
+    flagPrint          = 0x0004,
+    flagNoZoom         = 0x0008,
+    flagNoRotate       = 0x0010,
+    flagNoView         = 0x0020,
+    flagReadOnly       = 0x0040,
+    flagLocked         = 0x0080,
+    flagToggleNoView   = 0x0100,
+    flagLockedContents = 0x0200
+  };
+
+  enum AnnotSubtype {
+    typeUnknown,        //                 0
+    typeText,           // Text            1
+    typeLink,           // Link            2
+    typeFreeText,       // FreeText        3
+    typeLine,           // Line            4
+    typeSquare,         // Square          5
+    typeCircle,         // Circle          6
+    typePolygon,        // Polygon         7
+    typePolyLine,       // PolyLine        8
+    typeHighlight,      // Highlight       9
+    typeUnderline,      // Underline      10
+    typeSquiggly,       // Squiggly       11
+    typeStrikeOut,      // StrikeOut      12
+    typeStamp,          // Stamp          13
+    typeCaret,          // Caret          14
+    typeInk,            // Ink            15
+    typePopup,          // Popup          16
+    typeFileAttachment, // FileAttachment 17
+    typeSound,          // Sound          18
+    typeMovie,          // Movie          19
+    typeWidget,         // Widget         20
+    typeScreen,         // Screen         21
+    typePrinterMark,    // PrinterMark    22
+    typeTrapNet,        // TrapNet        23
+    typeWatermark,      // Watermark      24
+    type3D              // 3D             25
+  };
+
+  Annot(PDFDoc *docA, PDFRectangle *rectA);
+  Annot(PDFDoc *docA, Dict *dict);
+  Annot(PDFDoc *docA, Dict *dict, Object *obj);
+  GBool isOk() { return ok; }
+
+  void incRefCnt();
+  void decRefCnt();
+
+  virtual void draw(Gfx *gfx, GBool printing);
+  // Get the resource dict of the appearance stream
+  virtual Object *getAppearanceResDict(Object *dest);
+
+  GBool match(Ref *refA)
+    { return ref.num == refA->num && ref.gen == refA->gen; }
+
+  double getXMin();
+  double getYMin();
+
+  double getFontSize() { return fontSize; }
+
+  void setRect(PDFRectangle *rect);
+  void setRect(double x1, double y1, double x2, double y2);
+
+  // Sets the annot contents to new_content
+  // new_content should never be NULL
+  void setContents(GooString *new_content);
+  void setName(GooString *new_name);
+  void setModified(GooString *new_date);
+  void setFlags(Guint new_flags);
+
+  void setBorder(AnnotBorderArray *new_border); // Takes ownership
+
+  // The annotation takes the ownership of
+  // new_color. 
+  void setColor(AnnotColor *new_color);
+
+  void setPage(Ref *pageRef, int pageIndex);
+
+  void setAppearanceState(const char *state);
+
+  // Delete appearance streams and reset appearance state
+  void invalidateAppearance();
+
+  // getters
+  PDFDoc *getDoc() const { return doc; }
+  XRef *getXRef() const { return xref; }
+  GBool getHasRef() const { return hasRef; }
+  Ref getRef() const { return ref; }
+  AnnotSubtype getType() const { return type; }
+  PDFRectangle *getRect() const { return rect; }
+  void getRect(double *x1, double *y1, double *x2, double *y2) const;
+  GooString *getContents() const { return contents; }
+  int getPageNum() const { return page; }
+  GooString *getName() const { return name; }
+  GooString *getModified() const { return modified; }
+  Guint getFlags() const { return flags; }
+  AnnotAppearance *getAppearStreams() const { return appearStreams; }
+  GooString *getAppearState() const { return appearState; }
+  AnnotBorder *getBorder() const { return border; }
+  AnnotColor *getColor() const { return color; }
+  int getTreeKey() const { return treeKey; }
+
+  int getId() { return ref.num; }
+
+  // Check if point is inside the annot rectangle.
+  GBool inRect(double x, double y) const;
+
+private:
+  void readArrayNum(Object *pdfArray, int key, double *value);
+  // write vStr[i:j[ in appearBuf
+
+  void initialize (PDFDoc *docA, Dict *dict);
+
+
+protected:
+  virtual ~Annot();
+  void setColor(AnnotColor *color, GBool fill);
+  void drawCircle(double cx, double cy, double r, GBool fill);
+  void drawCircleTopLeft(double cx, double cy, double r);
+  void drawCircleBottomRight(double cx, double cy, double r);
+  void layoutText(GooString *text, GooString *outBuf, int *i, GfxFont *font,
+                 double *width, double widthLimit, int *charCount,
+                 GBool noReencode);
+  void writeString(GooString *str, GooString *appearBuf);
+  void createForm(double *bbox, GBool transparencyGroup, Object *resDict, Object *aStream);
+  void createResourcesDict(const char *formName, Object *formStream, const char *stateName,
+                          double opacity, const char *blendMode, Object *resDict);
+  GBool isVisible(GBool printing);
+
+  // Updates the field key of the annotation dictionary
+  // and sets M to the current time
+  void update(const char *key, Object *value);
+
+  int refCnt;
+
+  Object annotObj;
+  
+  // required data
+  AnnotSubtype type;                // Annotation type
+  PDFRectangle *rect;               // Rect
+
+  // optional data
+  GooString *contents;              // Contents
+  int       page;                   // P
+  GooString *name;                  // NM
+  GooString *modified;              // M
+  Guint flags;                      // F (must be a 32 bit unsigned int)
+  AnnotAppearance *appearStreams;   // AP
+  Object appearance;     // a reference to the Form XObject stream
+                         //   for the normal appearance
+  AnnotAppearanceBBox *appearBBox;  // BBox of generated appearance
+  GooString *appearState;           // AS
+  int treeKey;                      // Struct Parent;
+  Object oc;                        // OC
+
+  PDFDoc *doc;
+  XRef *xref;                  // the xref table for this PDF file
+  Ref ref;                      // object ref identifying this annotation
+  GooString *appearBuf;
+  AnnotBorder *border;          // Border, BS
+  AnnotColor *color;            // C
+  double fontSize; 
+  GBool ok;
+
+  bool hasRef;
+};
+
+//------------------------------------------------------------------------
+// AnnotPopup
+//------------------------------------------------------------------------
+
+class AnnotPopup: public Annot {
+public:
+  AnnotPopup(PDFDoc *docA, PDFRectangle *rect);
+  AnnotPopup(PDFDoc *docA, Dict *dict, Object *obj);
+  ~AnnotPopup();
+
+  Object *getParent(Object *obj) { return parent.fetch (xref, obj); }
+  Object *getParentNF(Object *obj) { return &parent; }
+  void setParent(Object *parentA);
+  void setParent(Annot *parentA);
+  GBool getOpen() const { return open; }
+  void setOpen(GBool openA);
+
+protected:
+  void initialize(PDFDoc *docA, Dict *dict);
+
+  Object parent; // Parent
+  GBool open;   // Open
+};
+
+//------------------------------------------------------------------------
+// AnnotMarkup
+//------------------------------------------------------------------------
+
+class AnnotMarkup: public Annot {
+public:
+  enum  AnnotMarkupReplyType {
+    replyTypeR,     // R
+    replyTypeGroup  // Group
+  };
+
+  AnnotMarkup(PDFDoc *docA, PDFRectangle *rect);
+  AnnotMarkup(PDFDoc *docA, Dict *dict, Object *obj);
+  virtual ~AnnotMarkup();
+
+  // getters
+  GooString *getLabel() const { return label; }
+  AnnotPopup *getPopup() const { return popup; }
+  double getOpacity() const { return opacity; }
+  // getRC
+  GooString *getDate() const { return date; }
+  int getInReplyToID() const { return inReplyTo.num; }
+  GooString *getSubject() const { return subject; }
+  AnnotMarkupReplyType getReplyTo() const { return replyTo; }
+  AnnotExternalDataType getExData() const { return exData; }
+
+  // The annotation takes the ownership of new_popup
+  void setPopup(AnnotPopup *new_popup);
+  void setLabel(GooString *new_label);
+  void setOpacity(double opacityA);
+  void setDate(GooString *new_date);
+
+protected:
+  GooString *label;             // T            (Default autor)
+  AnnotPopup *popup;            // Popup
+  double opacity;               // CA           (Default 1.0)
+  // RC
+  GooString *date;              // CreationDate
+  Ref inReplyTo;                // IRT
+  GooString *subject;           // Subj
+  AnnotMarkupReplyType replyTo; // RT           (Default R)
+  // this object is overrided by the custom intent fields defined in some
+  // annotation types.
+  //GooString *intent;          // IT
+  AnnotExternalDataType exData; // ExData
+
+private:
+  void initialize(PDFDoc *docA, Dict *dict, Object *obj);
+};
+
+//------------------------------------------------------------------------
+// AnnotText
+//------------------------------------------------------------------------
+
+class AnnotText: public AnnotMarkup {
+public:
+  enum AnnotTextState {
+    stateUnknown,
+    // Marked state model
+    stateMarked,    // Marked
+    stateUnmarked,  // Unmarked
+    // Review state model
+    stateAccepted,  // Accepted
+    stateRejected,  // Rejected
+    stateCancelled, // Cancelled
+    stateCompleted, // Completed
+    stateNone       // None
+  };
+
+  AnnotText(PDFDoc *docA, PDFRectangle *rect);
+  AnnotText(PDFDoc *docA, Dict *dict, Object *obj);
+  ~AnnotText();
+
+  virtual void draw(Gfx *gfx, GBool printing);
+
+  // getters
+  GBool getOpen() const { return open; }
+  GooString *getIcon() const { return icon; }
+  AnnotTextState getState() const { return state; }
+
+  void setOpen(GBool openA);
+  void setIcon(GooString *new_icon);
+
+private:
+
+  void initialize(PDFDoc *docA, Dict *dict);
+
+  GBool open;                       // Open       (Default false)
+  GooString *icon;                  // Name       (Default Note)
+  AnnotTextState state;             // State      (Default Umarked if
+                                    //             StateModel Marked
+                                    //             None if StareModel Review)
+};
+
+//------------------------------------------------------------------------
+// AnnotMovie
+//------------------------------------------------------------------------
+
+
+
+class AnnotMovie: public Annot {
+ public:
+  AnnotMovie(PDFDoc *docA, PDFRectangle *rect, Movie *movieA);
+  AnnotMovie(PDFDoc *docA, Dict *dict, Object *obj);
+  ~AnnotMovie();
+
+  virtual void draw(Gfx *gfx, GBool printing);
+
+  GooString* getTitle() { return title; }
+  Movie* getMovie() { return movie; }
+
+ private:
+  void initialize(PDFDoc *docA, Dict *dict);
+
+  GooString* title;      // T
+  Movie* movie;          // Movie + A
+};
+
+
+//------------------------------------------------------------------------
+// AnnotScreen
+//------------------------------------------------------------------------
+
+class AnnotScreen: public Annot {
+ public:
+
+  AnnotScreen(PDFDoc *docA, PDFRectangle *rect);
+  AnnotScreen(PDFDoc *docA, Dict *dict, Object *obj);
+  ~AnnotScreen();
+
+  GooString* getTitle() { return title; }
+
+  AnnotAppearanceCharacs *getAppearCharacs() { return appearCharacs; }
+  LinkAction* getAction() { return action; }
+  Object* getAdditionActions() { return &additionAction; }
+
+ private:
+  void initialize(PDFDoc *docA, Dict *dict);
+
+
+  GooString* title;                      // T
+
+  AnnotAppearanceCharacs* appearCharacs; // MK
+
+  LinkAction *action;                    // A
+  Object additionAction;                 // AA
+};
+
+//------------------------------------------------------------------------
+// AnnotLink
+//------------------------------------------------------------------------
+
+class AnnotLink: public Annot {
+public:
+
+  enum AnnotLinkEffect {
+    effectNone,     // N
+    effectInvert,   // I
+    effectOutline,  // O
+    effectPush      // P
+  };
+
+  AnnotLink(PDFDoc *docA, PDFRectangle *rect);
+  AnnotLink(PDFDoc *docA, Dict *dict, Object *obj);
+  virtual ~AnnotLink();
+
+  virtual void draw(Gfx *gfx, GBool printing);
+
+  // getters
+  LinkAction *getAction() const { return action; }
+  AnnotLinkEffect getLinkEffect() const { return linkEffect; }
+  Dict *getUriAction() const { return uriAction; }
+  AnnotQuadrilaterals *getQuadrilaterals() const { return quadrilaterals; }
+
+protected:
+
+  void initialize(PDFDoc *docA, Dict *dict);
+
+  LinkAction *action;                  // A, Dest
+  AnnotLinkEffect linkEffect;          // H          (Default I)
+  Dict *uriAction;                     // PA
+
+  AnnotQuadrilaterals *quadrilaterals; // QuadPoints
+};
+
+//------------------------------------------------------------------------
+// AnnotFreeText
+//------------------------------------------------------------------------
+
+class AnnotFreeText: public AnnotMarkup {
+public:
+
+  enum AnnotFreeTextQuadding {
+    quaddingLeftJustified,  // 0
+    quaddingCentered,       // 1
+    quaddingRightJustified  // 2
+  };
+
+  enum AnnotFreeTextIntent {
+    intentFreeText,           // FreeText
+    intentFreeTextCallout,    // FreeTextCallout
+    intentFreeTextTypeWriter  // FreeTextTypeWriter
+  };
+
+  AnnotFreeText(PDFDoc *docA, PDFRectangle *rect, GooString *da);
+  AnnotFreeText(PDFDoc *docA, Dict *dict, Object *obj);
+  ~AnnotFreeText();
+
+  virtual void draw(Gfx *gfx, GBool printing);
+  virtual Object *getAppearanceResDict(Object *dest);
+
+  void setAppearanceString(GooString *new_string);
+  void setQuadding(AnnotFreeTextQuadding new_quadding);
+  void setStyleString(GooString *new_string);
+  void setCalloutLine(AnnotCalloutLine *line);
+  void setIntent(AnnotFreeTextIntent new_intent);
+
+  // getters
+  GooString *getAppearanceString() const { return appearanceString; }
+  AnnotFreeTextQuadding getQuadding() const { return quadding; }
+  // return rc
+  GooString *getStyleString() const { return styleString; }
+  AnnotCalloutLine *getCalloutLine() const {  return calloutLine; }
+  AnnotFreeTextIntent getIntent() const { return intent; }
+  AnnotBorderEffect *getBorderEffect() const { return borderEffect; }
+  PDFRectangle *getRectangle() const { return rectangle; }
+  AnnotLineEndingStyle getEndStyle() const { return endStyle; }
+
+protected:
+
+  void initialize(PDFDoc *docA, Dict *dict);
+  static void parseAppearanceString(GooString *da, double &fontsize, AnnotColor* &fontcolor);
+  void generateFreeTextAppearance();
+
+  // required
+  GooString *appearanceString;      // DA
+
+  // optional
+  AnnotFreeTextQuadding quadding;   // Q  (Default 0)
+  // RC
+  GooString *styleString;           // DS
+  AnnotCalloutLine *calloutLine;    // CL
+  AnnotFreeTextIntent intent;       // IT
+  AnnotBorderEffect *borderEffect;  // BE
+  PDFRectangle *rectangle;          // RD
+  // inherited  from Annot
+  // AnnotBorderBS border;          // BS
+  AnnotLineEndingStyle endStyle;    // LE (Default None)
+};
+
+//------------------------------------------------------------------------
+// AnnotLine
+//------------------------------------------------------------------------
+
+class AnnotLine: public AnnotMarkup {
+public:
+
+  enum AnnotLineIntent {
+    intentLineArrow,    // LineArrow
+    intentLineDimension // LineDimension
+  };
+
+  enum AnnotLineCaptionPos {
+    captionPosInline, // Inline
+    captionPosTop     // Top
+  };
+
+  AnnotLine(PDFDoc *docA, PDFRectangle *rect, PDFRectangle *lRect);
+  AnnotLine(PDFDoc *docA, Dict *dict, Object *obj);
+  ~AnnotLine();
+
+  virtual void draw(Gfx *gfx, GBool printing);
+  virtual Object *getAppearanceResDict(Object *dest);
+
+  void setVertices(double x1, double y1, double x2, double y2);
+  void setStartEndStyle(AnnotLineEndingStyle start, AnnotLineEndingStyle end);
+  void setInteriorColor(AnnotColor *new_color);
+  void setLeaderLineLength(double len);
+  void setLeaderLineExtension(double len);
+  void setCaption(bool new_cap);
+  void setIntent(AnnotLineIntent new_intent);
+
+  // getters
+  AnnotLineEndingStyle getStartStyle() const { return startStyle; }
+  AnnotLineEndingStyle getEndStyle() const { return endStyle; }
+  AnnotColor *getInteriorColor() const { return interiorColor; }
+  double getLeaderLineLength() const { return leaderLineLength; }
+  double getLeaderLineExtension() const { return leaderLineExtension; }
+  bool getCaption() const { return caption; }
+  AnnotLineIntent getIntent() const { return intent; }
+  double  getLeaderLineOffset() const { return leaderLineOffset; }
+  AnnotLineCaptionPos getCaptionPos() const { return captionPos; }
+  Dict *getMeasure() const { return measure; }
+  double getCaptionTextHorizontal() const { return captionTextHorizontal; }
+  double getCaptionTextVertical() const { return captionTextVertical; }
+  double getX1() const { return coord1->getX(); }
+  double getY1() const { return coord1->getY(); }
+  double getX2() const { return coord2->getX(); }
+  double getY2() const { return coord2->getY(); }
+
+protected:
+
+  void initialize(PDFDoc *docA, Dict *dict);
+  void generateLineAppearance();
+
+  // required
+  AnnotCoord *coord1, *coord2;
+  
+  // optional
+  // inherited  from Annot
+  // AnnotBorderBS border;          // BS
+  AnnotLineEndingStyle startStyle;  // LE       (Default [/None /None])
+  AnnotLineEndingStyle endStyle;    //
+  AnnotColor *interiorColor;        // IC
+  double leaderLineLength;          // LL       (Default 0)
+  double leaderLineExtension;       // LLE      (Default 0)
+  bool caption;                     // Cap      (Default false)
+  AnnotLineIntent intent;           // IT
+  double leaderLineOffset;          // LLO
+  AnnotLineCaptionPos captionPos;   // CP       (Default Inline)
+  Dict *measure;                    // Measure
+  double captionTextHorizontal;     // CO       (Default [0, 0])
+  double captionTextVertical;       //
+};
+
+//------------------------------------------------------------------------
+// AnnotTextMarkup
+//------------------------------------------------------------------------
+
+class AnnotTextMarkup: public AnnotMarkup {
+public:
+
+  AnnotTextMarkup(PDFDoc *docA, PDFRectangle *rect, AnnotSubtype subType,
+                 AnnotQuadrilaterals *quadPoints);
+  AnnotTextMarkup(PDFDoc *docA, Dict *dict, Object *obj);
+  virtual ~AnnotTextMarkup();
+
+  virtual void draw(Gfx *gfx, GBool printing);
+
+  // typeHighlight, typeUnderline, typeSquiggly or typeStrikeOut
+  void setType(AnnotSubtype new_type);
+
+  void setQuadrilaterals(AnnotQuadrilaterals *quadPoints);
+
+  AnnotQuadrilaterals *getQuadrilaterals() const { return quadrilaterals; }
+
+protected:
+
+  void initialize(PDFDoc *docA, Dict *dict);
+  
+  AnnotQuadrilaterals *quadrilaterals; // QuadPoints
+};
+
+//------------------------------------------------------------------------
+// AnnotStamp
+//------------------------------------------------------------------------
+
+class AnnotStamp: public AnnotMarkup {
+public:
+
+  AnnotStamp(PDFDoc *docA, PDFRectangle *rect);
+  AnnotStamp(PDFDoc *docA, Dict *dict, Object *obj);
+  ~AnnotStamp();
+
+  void setIcon(GooString *new_icon);
+
+  // getters
+  GooString *getIcon() const { return icon; }
+
+private:
+
+  void initialize(PDFDoc *docA, Dict *dict);
+
+  GooString *icon;                  // Name       (Default Draft)
+};
+
+//------------------------------------------------------------------------
+// AnnotGeometry
+//------------------------------------------------------------------------
+
+class AnnotGeometry: public AnnotMarkup {
+public:
+
+  AnnotGeometry(PDFDoc *docA, PDFRectangle *rect, AnnotSubtype subType);
+  AnnotGeometry(PDFDoc *docA, Dict *dict, Object *obj);
+  ~AnnotGeometry();
+
+  virtual void draw(Gfx *gfx, GBool printing);
+
+  void setType(AnnotSubtype new_type); // typeSquare or typeCircle
+  void setInteriorColor(AnnotColor *new_color);
+
+  // getters
+  AnnotColor *getInteriorColor() const { return interiorColor; }
+  AnnotBorderEffect *getBorderEffect() const { return borderEffect; }
+  PDFRectangle *getGeometryRect() const { return geometryRect; }
+
+private:
+
+  void initialize(PDFDoc *docA, Dict *dict);
+
+  AnnotColor *interiorColor;        // IC
+  AnnotBorderEffect *borderEffect;  // BE
+  PDFRectangle *geometryRect;       // RD (combined with Rect)
+};
+
+//------------------------------------------------------------------------
+// AnnotPolygon
+//------------------------------------------------------------------------
+
+class AnnotPolygon: public AnnotMarkup {
+public:
+
+  enum AnnotPolygonIntent {
+    polygonCloud,      // PolygonCloud
+    polylineDimension, // PolyLineDimension
+    polygonDimension   // PolygonDimension
+  };
+
+  AnnotPolygon(PDFDoc *docA, PDFRectangle *rect, AnnotSubtype subType, AnnotPath *path);
+  AnnotPolygon(PDFDoc *docA, Dict *dict, Object *obj);
+  ~AnnotPolygon();
+
+  virtual void draw(Gfx *gfx, GBool printing);
+
+  void setType(AnnotSubtype new_type); // typePolygon or typePolyLine
+  void setVertices(AnnotPath *path);
+  void setStartEndStyle(AnnotLineEndingStyle start, AnnotLineEndingStyle end);
+  void setInteriorColor(AnnotColor *new_color);
+  void setIntent(AnnotPolygonIntent new_intent);
+
+  // getters
+  AnnotPath *getVertices() const { return vertices; }
+  AnnotLineEndingStyle getStartStyle() const { return startStyle; }
+  AnnotLineEndingStyle getEndStyle() const { return endStyle; }
+  AnnotColor *getInteriorColor() const { return interiorColor; }
+  AnnotBorderEffect *getBorderEffect() const { return borderEffect; }
+  AnnotPolygonIntent getIntent() const { return intent; }
+
+private:
+
+  void initialize(PDFDoc *docA, Dict *dict);
+
+  // required
+  AnnotPath *vertices;              // Vertices
+
+  // optional
+  AnnotLineEndingStyle startStyle;  // LE       (Default [/None /None])
+  AnnotLineEndingStyle endStyle;    //
+  // inherited  from Annot
+  // AnnotBorderBS border;          // BS
+  AnnotColor *interiorColor;        // IC
+  AnnotBorderEffect *borderEffect;  // BE
+  AnnotPolygonIntent intent;        // IT
+  // Measure
+};
+
+//------------------------------------------------------------------------
+// AnnotCaret
+//------------------------------------------------------------------------
+
+class AnnotCaret: public AnnotMarkup {
+public:
+
+  enum AnnotCaretSymbol {
+    symbolNone,     // None
+    symbolP         // P
+  };
+
+  AnnotCaret(PDFDoc *docA, PDFRectangle *rect);
+  AnnotCaret(PDFDoc *docA, Dict *dict, Object *obj);
+  ~AnnotCaret();
+
+  void setSymbol(AnnotCaretSymbol new_symbol);
+
+  // getters
+  AnnotCaretSymbol getSymbol() const { return symbol; }
+  PDFRectangle *getCaretRect() const { return caretRect; }
+
+private:
+
+  void initialize(PDFDoc *docA, Dict *dict);
+
+  AnnotCaretSymbol symbol;       // Sy         (Default None)
+  PDFRectangle *caretRect;       // RD (combined with Rect)
+};
+
+//------------------------------------------------------------------------
+// AnnotInk
+//------------------------------------------------------------------------
+
+class AnnotInk: public AnnotMarkup {
+public:
+
+  AnnotInk(PDFDoc *docA, PDFRectangle *rect, AnnotPath **paths, int n_paths);
+  AnnotInk(PDFDoc *docA, Dict *dict, Object *obj);
+  ~AnnotInk();
+
+  virtual void draw(Gfx *gfx, GBool printing);
+
+  void setInkList(AnnotPath **paths, int n_paths);
+
+  // getters
+  AnnotPath **getInkList() const { return inkList; }
+  int getInkListLength() const { return inkListLength; }
+
+private:
+
+  void initialize(PDFDoc *docA, Dict *dict);
+  void writeInkList(AnnotPath **paths, int n_paths, Array *dest_array);
+  void parseInkList(Array *src_array);
+  void freeInkList();
+
+  // required
+  AnnotPath **inkList;       // InkList
+  int inkListLength;
+
+  // optional
+  // inherited from Annot
+  // AnnotBorderBS border;  // BS
+};
+
+//------------------------------------------------------------------------
+// AnnotFileAttachment
+//------------------------------------------------------------------------
+
+class AnnotFileAttachment: public AnnotMarkup {
+public:
+
+  AnnotFileAttachment(PDFDoc *docA, PDFRectangle *rect, GooString *filename);
+  AnnotFileAttachment(PDFDoc *docA, Dict *dict, Object *obj);
+  ~AnnotFileAttachment();
+
+  virtual void draw(Gfx *gfx, GBool printing);
+
+  // getters
+  Object *getFile() { return &file; }
+  GooString *getName() const { return name; }
+
+private:
+
+  void initialize(PDFDoc *docA, Dict *dict);
+
+  // required
+  Object file;      // FS
+
+  // optional
+  GooString *name;  // Name
+};
+
+//------------------------------------------------------------------------
+// AnnotSound
+//------------------------------------------------------------------------
+
+class AnnotSound: public AnnotMarkup {
+public:
+
+  AnnotSound(PDFDoc *docA, PDFRectangle *rect, Sound *soundA);
+  AnnotSound(PDFDoc *docA, Dict *dict, Object *obj);
+  ~AnnotSound();
+
+  virtual void draw(Gfx *gfx, GBool printing);
+
+  // getters
+  Sound *getSound() { return sound; }
+  GooString *getName() const { return name; }
+
+private:
+
+  void initialize(PDFDoc *docA, Dict *dict);
+
+  // required
+  Sound *sound;                  // Sound
+
+  // optional
+  GooString *name;               // Name
+};
+
+//------------------------------------------------------------------------
+// AnnotWidget
+//------------------------------------------------------------------------
+
+class AnnotWidget: public Annot {
+public:
+
+  enum AnnotWidgetHighlightMode {
+    highlightModeNone,    // N
+    highlightModeInvert,  // I
+    highlightModeOutline, // O
+    highlightModePush     // P,T
+  };
+
+  AnnotWidget(PDFDoc *docA, Dict *dict, Object *obj);
+  AnnotWidget(PDFDoc *docA, Dict *dict, Object *obj, FormField *fieldA);
+  virtual ~AnnotWidget();
+
+  virtual void draw(Gfx *gfx, GBool printing);
+
+  void drawBorder();
+  void drawFormFieldButton(GfxResources *resources, GooString *da);
+  void drawFormFieldText(GfxResources *resources, GooString *da);
+  void drawFormFieldChoice(GfxResources *resources, GooString *da);
+  void generateFieldAppearance ();
+
+  AnnotWidgetHighlightMode getMode() { return mode; }
+  AnnotAppearanceCharacs *getAppearCharacs() { return appearCharacs; }
+  LinkAction *getAction() { return action; }
+  Dict *getAdditionActions() { return additionActions; }
+  Dict *getParent() { return parent; }
+
+private:
+
+  void initialize(PDFDoc *docA, Dict *dict);
+
+  void drawText(GooString *text, GooString *da, GfxResources *resources,
+               GBool multiline, int comb, int quadding,
+               GBool txField, GBool forceZapfDingbats,
+               GBool password=false);
+  void drawListBox(FormFieldChoice *fieldChoice,
+                  GooString *da, GfxResources *resources, int quadding);
+
+  Form *form;
+  FormField *field;                       // FormField object for this annotation
+  AnnotWidgetHighlightMode mode;          // H  (Default I)
+  AnnotAppearanceCharacs *appearCharacs;  // MK
+  LinkAction *action;                     // A
+  Dict *additionActions;                  // AA
+  // inherited  from Annot
+  // AnnotBorderBS border;                // BS
+  Dict *parent;                           // Parent
+  GBool addDingbatsResource;
+};
+
+//------------------------------------------------------------------------
+// Annot3D
+//------------------------------------------------------------------------
+
+class Annot3D: public Annot {
+  class Activation {
+  public:
+    enum ActivationATrigger {
+      aTriggerUnknown,
+      aTriggerPageOpened,  // PO
+      aTriggerPageVisible, // PV
+      aTriggerUserAction   // XA
+    };
+
+    enum ActivationAState {
+      aStateUnknown,
+      aStateEnabled, // I
+      aStateDisabled // L
+    };
+
+    enum ActivationDTrigger {
+      dTriggerUnknown,
+      dTriggerPageClosed,    // PC
+      dTriggerPageInvisible, // PI
+      dTriggerUserAction     // XD
+    };
+
+    enum ActivationDState {
+      dStateUnknown,
+      dStateUninstantiaded, // U
+      dStateInstantiated,   // I
+      dStateLive            // L
+    };
+
+    Activation(Dict *dict);
+  private:
+    
+    ActivationATrigger aTrigger;  // A   (Default XA)
+    ActivationAState aState;      // AIS (Default L)
+    ActivationDTrigger dTrigger;  // D   (Default PI)
+    ActivationDState dState;      // DIS (Default U)
+    GBool displayToolbar;         // TB  (Default true)
+    GBool displayNavigation;      // NP  (Default false);
+  };
+public:
+
+  Annot3D(PDFDoc *docA, PDFRectangle *rect);
+  Annot3D(PDFDoc *docA, Dict *dict, Object *obj);
+  ~Annot3D();
+
+  // getters
+
+private:
+
+  void initialize(PDFDoc *docA, Dict *dict);
+
+  Activation *activation;  // 3DA
+};
+
+//------------------------------------------------------------------------
+// Annots
+//------------------------------------------------------------------------
+
+class Annots {
+public:
+
+  // Build a list of Annot objects.
+  Annots(PDFDoc *docA, Object *annotsObj);
+
+  ~Annots();
+
+  // Iterate through list of annotations.
+  int getNumAnnots() { return nAnnots; }
+  Annot *getAnnot(int i) { return annots[i]; }
+  void appendAnnot(Annot *annot);
+  GBool removeAnnot(Annot *annot);
+
+private:
+  Annot* createAnnot(Dict* dict, Object *obj);
+  Annot *findAnnot(Ref *ref);
+
+  PDFDoc *doc;
+  Annot **annots;
+  int nAnnots;
+  int size;
+};
+
+#endif
diff --git a/poppler/Array.cc b/poppler/Array.cc
new file mode 100644 (file)
index 0000000..cb22432
--- /dev/null
@@ -0,0 +1,115 @@
+//========================================================================
+//
+// Array.cc
+//
+// Copyright 1996-2003 Glyph & Cog, LLC
+//
+//========================================================================
+
+//========================================================================
+//
+// Modified under the Poppler project - http://poppler.freedesktop.org
+//
+// All changes made under the Poppler project to this file are licensed
+// under GPL version 2 or later
+//
+// Copyright (C) 2005 Kristian Høgsberg <krh@redhat.com>
+// Copyright (C) 2012 Fabio D'Urso <fabiodurso@hotmail.it>
+//
+// To see a description of the changes please see the Changelog file that
+// came with your tarball or type make ChangeLog if you are building from git
+//
+//========================================================================
+
+#include <config.h>
+
+#ifdef USE_GCC_PRAGMAS
+#pragma implementation
+#endif
+
+#include <stdlib.h>
+#include <stddef.h>
+#include "goo/gmem.h"
+#include "Object.h"
+#include "Array.h"
+
+//------------------------------------------------------------------------
+// Array
+//------------------------------------------------------------------------
+
+Array::Array(XRef *xrefA) {
+  xref = xrefA;
+  elems = NULL;
+  size = length = 0;
+  ref = 1;
+}
+
+Array::~Array() {
+  int i;
+
+  for (i = 0; i < length; ++i)
+    elems[i].free();
+  gfree(elems);
+}
+
+void Array::add(Object *elem) {
+  if (length == size) {
+    if (length == 0) {
+      size = 8;
+    } else {
+      size *= 2;
+    }
+    elems = (Object *)greallocn(elems, size, sizeof(Object));
+  }
+  elems[length] = *elem;
+  ++length;
+}
+
+void Array::remove(int i) {
+  if (i < 0 || i >= length) {
+#ifdef DEBUG_MEM
+    abort();
+#else
+    return;
+#endif
+  }
+  --length;
+  memmove( elems + i, elems + i + 1, sizeof(elems[0]) * (length - i) );
+}
+
+Object *Array::get(int i, Object *obj) {
+  if (i < 0 || i >= length) {
+#ifdef DEBUG_MEM
+    abort();
+#else
+    return obj->initNull();
+#endif
+  }
+  return elems[i].fetch(xref, obj);
+}
+
+Object *Array::getNF(int i, Object *obj) {
+  if (i < 0 || i >= length) {
+#ifdef DEBUG_MEM
+    abort();
+#else
+    return obj->initNull();
+#endif
+  }
+  return elems[i].copy(obj);
+}
+
+GBool Array::getString(int i, GooString *string)
+{
+  Object obj;
+
+  if (getNF(i, &obj)->isString()) {
+    string->clear();
+    string->append(obj.getString());
+    obj.free();
+    return gTrue;
+  } else {
+    obj.free();
+    return gFalse;
+  }
+}
diff --git a/poppler/Array.h b/poppler/Array.h
new file mode 100644 (file)
index 0000000..666a409
--- /dev/null
@@ -0,0 +1,75 @@
+//========================================================================
+//
+// Array.h
+//
+// Copyright 1996-2003 Glyph & Cog, LLC
+//
+//========================================================================
+
+//========================================================================
+//
+// Modified under the Poppler project - http://poppler.freedesktop.org
+//
+// All changes made under the Poppler project to this file are licensed
+// under GPL version 2 or later
+//
+// Copyright (C) 2005 Kristian Høgsberg <krh@redhat.com>
+// Copyright (C) 2012 Fabio D'Urso <fabiodurso@hotmail.it>
+//
+// To see a description of the changes please see the Changelog file that
+// came with your tarball or type make ChangeLog if you are building from git
+//
+//========================================================================
+
+#ifndef ARRAY_H
+#define ARRAY_H
+
+#ifdef USE_GCC_PRAGMAS
+#pragma interface
+#endif
+
+#include "Object.h"
+
+class XRef;
+
+//------------------------------------------------------------------------
+// Array
+//------------------------------------------------------------------------
+
+class Array {
+public:
+
+  // Constructor.
+  Array(XRef *xrefA);
+
+  // Destructor.
+  ~Array();
+
+  // Reference counting.
+  int incRef() { return ++ref; }
+  int decRef() { return --ref; }
+
+  // Get number of elements.
+  int getLength() { return length; }
+
+  // Add an element.
+  void add(Object *elem);
+
+  // Remove an element by position
+  void remove(int i);
+
+  // Accessors.
+  Object *get(int i, Object *obj);
+  Object *getNF(int i, Object *obj);
+  GBool getString(int i, GooString *string);
+
+private:
+
+  XRef *xref;                  // the xref table for this PDF file
+  Object *elems;               // array of elements
+  int size;                    // size of <elems> array
+  int length;                  // number of elements in array
+  int ref;                     // reference count
+};
+
+#endif
diff --git a/poppler/ArthurOutputDev.cc b/poppler/ArthurOutputDev.cc
new file mode 100644 (file)
index 0000000..a1cb89d
--- /dev/null
@@ -0,0 +1,815 @@
+//========================================================================
+//
+// ArthurOutputDev.cc
+//
+// Copyright 2003 Glyph & Cog, LLC
+//
+//========================================================================
+
+//========================================================================
+//
+// Modified under the Poppler project - http://poppler.freedesktop.org
+//
+// All changes made under the Poppler project to this file are licensed
+// under GPL version 2 or later
+//
+// Copyright (C) 2005 Brad Hards <bradh@frogmouth.net>
+// Copyright (C) 2005-2009, 2011, 2012 Albert Astals Cid <aacid@kde.org>
+// Copyright (C) 2008, 2010 Pino Toscano <pino@kde.org>
+// Copyright (C) 2009, 2011 Carlos Garcia Campos <carlosgc@gnome.org>
+// Copyright (C) 2009 Petr Gajdos <pgajdos@novell.com>
+// Copyright (C) 2010 Matthias Fauconneau <matthias.fauconneau@gmail.com>
+// Copyright (C) 2011 Andreas Hartmetz <ahartmetz@gmail.com>
+//
+// To see a description of the changes please see the Changelog file that
+// came with your tarball or type make ChangeLog if you are building from git
+//
+//========================================================================
+
+#include <config.h>
+
+#ifdef USE_GCC_PRAGMAS
+#pragma implementation
+#endif
+
+#include <string.h>
+#include <math.h>
+
+#include "goo/gfile.h"
+#include "GlobalParams.h"
+#include "Error.h"
+#include "Object.h"
+#include "GfxState.h"
+#include "GfxFont.h"
+#include "Link.h"
+#include "FontEncodingTables.h"
+#include <fofi/FoFiTrueType.h>
+#include "ArthurOutputDev.h"
+
+#include <QtCore/QtDebug>
+#include <QtGui/QPainterPath>
+//------------------------------------------------------------------------
+
+#ifdef HAVE_SPLASH
+#include "splash/SplashFontFileID.h"
+#include "splash/SplashFontFile.h"
+#include "splash/SplashFontEngine.h"
+#include "splash/SplashFont.h"
+#include "splash/SplashMath.h"
+#include "splash/SplashPath.h"
+#include "splash/SplashGlyphBitmap.h"
+//------------------------------------------------------------------------
+// SplashOutFontFileID
+//------------------------------------------------------------------------
+
+class SplashOutFontFileID: public SplashFontFileID {
+public:
+
+  SplashOutFontFileID(Ref *rA) { r = *rA; }
+
+  ~SplashOutFontFileID() {}
+
+  GBool matches(SplashFontFileID *id) {
+    return ((SplashOutFontFileID *)id)->r.num == r.num &&
+           ((SplashOutFontFileID *)id)->r.gen == r.gen;
+  }
+
+private:
+
+  Ref r;
+};
+
+#endif
+
+//------------------------------------------------------------------------
+// ArthurOutputDev
+//------------------------------------------------------------------------
+
+ArthurOutputDev::ArthurOutputDev(QPainter *painter):
+  m_painter(painter),
+  m_fontHinting(NoHinting)
+{
+  m_currentBrush = QBrush(Qt::SolidPattern);
+  m_fontEngine = 0;
+  m_font = 0;
+}
+
+ArthurOutputDev::~ArthurOutputDev()
+{
+#ifdef HAVE_SPLASH
+  delete m_fontEngine;
+#endif
+}
+
+void ArthurOutputDev::startDoc(XRef *xrefA) {
+  xref = xrefA;
+#ifdef HAVE_SPLASH
+  delete m_fontEngine;
+
+  const bool isHintingEnabled = m_fontHinting != NoHinting;
+  const bool isSlightHinting = m_fontHinting == SlightHinting;
+
+  m_fontEngine = new SplashFontEngine(
+#if HAVE_T1LIB_H
+  globalParams->getEnableT1lib(),
+#endif
+#if HAVE_FREETYPE_FREETYPE_H || HAVE_FREETYPE_H
+  globalParams->getEnableFreeType(),
+  isHintingEnabled,
+  isSlightHinting,
+#endif
+  m_painter->testRenderHint(QPainter::TextAntialiasing));
+#endif
+}
+
+void ArthurOutputDev::startPage(int pageNum, GfxState *state)
+{
+  // fill page with white background.
+  int w = static_cast<int>(state->getPageWidth());
+  int h = static_cast<int>(state->getPageHeight());
+  QColor fillColour(Qt::white);
+  QBrush fill(fillColour);
+  m_painter->save();
+  m_painter->setPen(fillColour);
+  m_painter->setBrush(fill);
+  m_painter->drawRect(0, 0, w, h);
+  m_painter->restore();
+}
+
+void ArthurOutputDev::endPage() {
+}
+
+void ArthurOutputDev::saveState(GfxState *state)
+{
+  m_painter->save();
+}
+
+void ArthurOutputDev::restoreState(GfxState *state)
+{
+  m_painter->restore();
+}
+
+void ArthurOutputDev::updateAll(GfxState *state)
+{
+  OutputDev::updateAll(state);
+  m_needFontUpdate = gTrue;
+}
+
+// This looks wrong - why aren't adjusting the matrix?
+void ArthurOutputDev::updateCTM(GfxState *state, double m11, double m12,
+                               double m21, double m22,
+                               double m31, double m32)
+{
+  updateLineDash(state);
+  updateLineJoin(state);
+  updateLineCap(state);
+  updateLineWidth(state);
+}
+
+void ArthurOutputDev::updateLineDash(GfxState *state)
+{
+  double *dashPattern;
+  int dashLength;
+  double dashStart;
+  state->getLineDash(&dashPattern, &dashLength, &dashStart);
+  QVector<qreal> pattern(dashLength);
+  for (int i = 0; i < dashLength; ++i) {
+    pattern[i] = dashPattern[i];
+  }
+  m_currentPen.setDashPattern(pattern);
+  m_currentPen.setDashOffset(dashStart);
+  m_painter->setPen(m_currentPen);
+}
+
+void ArthurOutputDev::updateFlatness(GfxState *state)
+{
+  // qDebug() << "updateFlatness";
+}
+
+void ArthurOutputDev::updateLineJoin(GfxState *state)
+{
+  switch (state->getLineJoin()) {
+  case 0:
+    m_currentPen.setJoinStyle(Qt::MiterJoin);
+    break;
+  case 1:
+    m_currentPen.setJoinStyle(Qt::RoundJoin);
+    break;
+  case 2:
+    m_currentPen.setJoinStyle(Qt::BevelJoin);
+    break;
+  }
+  m_painter->setPen(m_currentPen);
+}
+
+void ArthurOutputDev::updateLineCap(GfxState *state)
+{
+  switch (state->getLineCap()) {
+  case 0:
+    m_currentPen.setCapStyle(Qt::FlatCap);
+    break;
+  case 1:
+    m_currentPen.setCapStyle(Qt::RoundCap);
+    break;
+  case 2:
+    m_currentPen.setCapStyle(Qt::SquareCap);
+    break;
+  }
+  m_painter->setPen(m_currentPen);
+}
+
+void ArthurOutputDev::updateMiterLimit(GfxState *state)
+{
+  m_currentPen.setMiterLimit(state->getMiterLimit());
+  m_painter->setPen(m_currentPen);
+}
+
+void ArthurOutputDev::updateLineWidth(GfxState *state)
+{
+  m_currentPen.setWidthF(state->getLineWidth());
+  m_painter->setPen(m_currentPen);
+}
+
+void ArthurOutputDev::updateFillColor(GfxState *state)
+{
+  GfxRGB rgb;
+  QColor brushColour = m_currentBrush.color();
+  state->getFillRGB(&rgb);
+  brushColour.setRgbF(colToDbl(rgb.r), colToDbl(rgb.g), colToDbl(rgb.b), brushColour.alphaF());
+  m_currentBrush.setColor(brushColour);
+}
+
+void ArthurOutputDev::updateStrokeColor(GfxState *state)
+{
+  GfxRGB rgb;
+  QColor penColour = m_currentPen.color();
+  state->getStrokeRGB(&rgb);
+  penColour.setRgbF(colToDbl(rgb.r), colToDbl(rgb.g), colToDbl(rgb.b), penColour.alphaF());
+  m_currentPen.setColor(penColour);
+  m_painter->setPen(m_currentPen);
+}
+
+void ArthurOutputDev::updateFillOpacity(GfxState *state)
+{
+  QColor brushColour= m_currentBrush.color();
+  brushColour.setAlphaF(state->getFillOpacity());
+  m_currentBrush.setColor(brushColour);
+}
+
+void ArthurOutputDev::updateStrokeOpacity(GfxState *state)
+{
+  QColor penColour= m_currentPen.color();
+  penColour.setAlphaF(state->getStrokeOpacity());
+  m_currentPen.setColor(penColour);
+  m_painter->setPen(m_currentPen);
+}
+
+void ArthurOutputDev::updateFont(GfxState *state)
+{
+#ifdef HAVE_SPLASH
+  GfxFont *gfxFont;
+  GfxFontLoc *fontLoc;
+  GfxFontType fontType;
+  SplashOutFontFileID *id;
+  SplashFontFile *fontFile;
+  SplashFontSrc *fontsrc = NULL;
+  FoFiTrueType *ff;
+  Object refObj, strObj;
+  GooString *fileName;
+  char *tmpBuf;
+  int tmpBufLen;
+  int *codeToGID;
+  double *textMat;
+  double m11, m12, m21, m22, fontSize;
+  SplashCoord mat[4];
+  int n;
+  int faceIndex = 0;
+  SplashCoord matrix[6];
+
+  m_needFontUpdate = false;
+  m_font = NULL;
+  fileName = NULL;
+  tmpBuf = NULL;
+  fontLoc = NULL;
+
+  if (!(gfxFont = state->getFont())) {
+    goto err1;
+  }
+  fontType = gfxFont->getType();
+  if (fontType == fontType3) {
+    goto err1;
+  }
+
+  // check the font file cache
+  id = new SplashOutFontFileID(gfxFont->getID());
+  if ((fontFile = m_fontEngine->getFontFile(id))) {
+    delete id;
+
+  } else {
+
+    if (!(fontLoc = gfxFont->locateFont(xref, gFalse))) {
+      error(errSyntaxError, -1, "Couldn't find a font for '{0:s}'",
+           gfxFont->getName() ? gfxFont->getName()->getCString()
+                              : "(unnamed)");
+      goto err2;
+    }
+
+    // embedded font
+    if (fontLoc->locType == gfxFontLocEmbedded) {
+      // if there is an embedded font, read it to memory
+      tmpBuf = gfxFont->readEmbFontFile(xref, &tmpBufLen);
+      if (! tmpBuf)
+       goto err2;
+
+    // external font
+    } else { // gfxFontLocExternal
+      fileName = fontLoc->path;
+      fontType = fontLoc->fontType;
+    }
+
+    fontsrc = new SplashFontSrc;
+    if (fileName)
+      fontsrc->setFile(fileName, gFalse);
+    else
+      fontsrc->setBuf(tmpBuf, tmpBufLen, gTrue);
+    
+    // load the font file
+    switch (fontType) {
+    case fontType1:
+      if (!(fontFile = m_fontEngine->loadType1Font(
+                          id,
+                          fontsrc,
+                          (const char **)((Gfx8BitFont *)gfxFont)->getEncoding()))) {
+       error(errSyntaxError, -1, "Couldn't create a font for '{0:s}'",
+             gfxFont->getName() ? gfxFont->getName()->getCString()
+                                : "(unnamed)");
+       goto err2;
+      }
+      break;
+    case fontType1C:
+      if (!(fontFile = m_fontEngine->loadType1CFont(
+                          id,
+                          fontsrc,
+                          (const char **)((Gfx8BitFont *)gfxFont)->getEncoding()))) {
+       error(errSyntaxError, -1, "Couldn't create a font for '{0:s}'",
+             gfxFont->getName() ? gfxFont->getName()->getCString()
+                                : "(unnamed)");
+       goto err2;
+      }
+      break;
+    case fontType1COT:
+      if (!(fontFile = m_fontEngine->loadOpenTypeT1CFont(
+                          id,
+                          fontsrc,
+                          (const char **)((Gfx8BitFont *)gfxFont)->getEncoding()))) {
+       error(errSyntaxError, -1, "Couldn't create a font for '{0:s}'",
+             gfxFont->getName() ? gfxFont->getName()->getCString()
+                                : "(unnamed)");
+       goto err2;
+      }
+      break;
+    case fontTrueType:
+    case fontTrueTypeOT:
+       if (fileName)
+        ff = FoFiTrueType::load(fileName->getCString());
+       else
+       ff = FoFiTrueType::make(tmpBuf, tmpBufLen);
+      if (ff) {
+       codeToGID = ((Gfx8BitFont *)gfxFont)->getCodeToGIDMap(ff);
+       n = 256;
+       delete ff;
+      } else {
+       codeToGID = NULL;
+       n = 0;
+      }
+      if (!(fontFile = m_fontEngine->loadTrueTypeFont(
+                          id,
+                          fontsrc,
+                          codeToGID, n))) {
+       error(errSyntaxError, -1, "Couldn't create a font for '{0:s}'",
+             gfxFont->getName() ? gfxFont->getName()->getCString()
+                                : "(unnamed)");
+       goto err2;
+      }
+      break;
+    case fontCIDType0:
+    case fontCIDType0C:
+      if (!(fontFile = m_fontEngine->loadCIDFont(
+                          id,
+                          fontsrc))) {
+       error(errSyntaxError, -1, "Couldn't create a font for '{0:s}'",
+             gfxFont->getName() ? gfxFont->getName()->getCString()
+                                : "(unnamed)");
+       goto err2;
+      }
+      break;
+    case fontCIDType0COT:
+      if (((GfxCIDFont *)gfxFont)->getCIDToGID()) {
+       n = ((GfxCIDFont *)gfxFont)->getCIDToGIDLen();
+       codeToGID = (int *)gmallocn(n, sizeof(int));
+       memcpy(codeToGID, ((GfxCIDFont *)gfxFont)->getCIDToGID(),
+              n * sizeof(int));
+      } else {
+       codeToGID = NULL;
+       n = 0;
+      }      
+      if (!(fontFile = m_fontEngine->loadOpenTypeCFFFont(
+                          id,
+                          fontsrc,
+                          codeToGID, n))) {
+       error(errSyntaxError, -1, "Couldn't create a font for '{0:s}'",
+             gfxFont->getName() ? gfxFont->getName()->getCString()
+                                : "(unnamed)");
+       goto err2;
+      }
+      break;
+    case fontCIDType2:
+    case fontCIDType2OT:
+      codeToGID = NULL;
+      n = 0;
+      if (((GfxCIDFont *)gfxFont)->getCIDToGID()) {
+       n = ((GfxCIDFont *)gfxFont)->getCIDToGIDLen();
+       if (n) {
+         codeToGID = (int *)gmallocn(n, sizeof(int));
+         memcpy(codeToGID, ((GfxCIDFont *)gfxFont)->getCIDToGID(),
+                 n * sizeof(Gushort));
+       }
+      } else {
+       if (fileName)
+         ff = FoFiTrueType::load(fileName->getCString());
+       else
+         ff = FoFiTrueType::make(tmpBuf, tmpBufLen);
+       if (! ff)
+         goto err2;
+       codeToGID = ((GfxCIDFont *)gfxFont)->getCodeToGIDMap(ff, &n);
+       delete ff;
+      }
+      if (!(fontFile = m_fontEngine->loadTrueTypeFont(
+                          id,
+                          fontsrc,
+                          codeToGID, n, faceIndex))) {
+       error(errSyntaxError, -1, "Couldn't create a font for '{0:s}'",
+             gfxFont->getName() ? gfxFont->getName()->getCString()
+                                : "(unnamed)");
+       goto err2;
+      }
+      break;
+    default:
+      // this shouldn't happen
+      goto err2;
+    }
+  }
+
+  // get the font matrix
+  textMat = state->getTextMat();
+  fontSize = state->getFontSize();
+  m11 = textMat[0] * fontSize * state->getHorizScaling();
+  m12 = textMat[1] * fontSize * state->getHorizScaling();
+  m21 = textMat[2] * fontSize;
+  m22 = textMat[3] * fontSize;
+
+  {
+  QMatrix painterMatrix = m_painter->worldMatrix();
+  matrix[0] = painterMatrix.m11();
+  matrix[1] = painterMatrix.m12();
+  matrix[2] = painterMatrix.m21();
+  matrix[3] = painterMatrix.m22();
+  matrix[4] = painterMatrix.dx();
+  matrix[5] = painterMatrix.dy();
+  }
+
+  // create the scaled font
+  mat[0] = m11;  mat[1] = -m12;
+  mat[2] = m21;  mat[3] = -m22;
+  m_font = m_fontEngine->getFont(fontFile, mat, matrix);
+
+  delete fontLoc;
+  if (fontsrc && !fontsrc->isFile)
+      fontsrc->unref();
+  return;
+
+ err2:
+  delete id;
+  delete fontLoc;
+ err1:
+  if (fontsrc && !fontsrc->isFile)
+      fontsrc->unref();
+  return;
+#endif
+}
+
+static QPainterPath convertPath(GfxState *state, GfxPath *path, Qt::FillRule fillRule)
+{
+  GfxSubpath *subpath;
+  double x1, y1, x2, y2, x3, y3;
+  int i, j;
+
+  QPainterPath qPath;
+  qPath.setFillRule(fillRule);
+  for (i = 0; i < path->getNumSubpaths(); ++i) {
+    subpath = path->getSubpath(i);
+    if (subpath->getNumPoints() > 0) {
+      state->transform(subpath->getX(0), subpath->getY(0), &x1, &y1);
+      qPath.moveTo(x1, y1);
+      j = 1;
+      while (j < subpath->getNumPoints()) {
+       if (subpath->getCurve(j)) {
+         state->transform(subpath->getX(j), subpath->getY(j), &x1, &y1);
+         state->transform(subpath->getX(j+1), subpath->getY(j+1), &x2, &y2);
+         state->transform(subpath->getX(j+2), subpath->getY(j+2), &x3, &y3);
+         qPath.cubicTo( x1, y1, x2, y2, x3, y3);
+         j += 3;
+       } else {
+         state->transform(subpath->getX(j), subpath->getY(j), &x1, &y1);
+         qPath.lineTo(x1, y1);
+         ++j;
+       }
+      }
+      if (subpath->isClosed()) {
+       qPath.closeSubpath();
+      }
+    }
+  }
+  return qPath;
+}
+
+void ArthurOutputDev::stroke(GfxState *state)
+{
+  m_painter->strokePath( convertPath( state, state->getPath(), Qt::OddEvenFill ), m_currentPen );
+}
+
+void ArthurOutputDev::fill(GfxState *state)
+{
+  m_painter->fillPath( convertPath( state, state->getPath(), Qt::WindingFill ), m_currentBrush );
+}
+
+void ArthurOutputDev::eoFill(GfxState *state)
+{
+  m_painter->fillPath( convertPath( state, state->getPath(), Qt::OddEvenFill ), m_currentBrush );
+}
+
+void ArthurOutputDev::clip(GfxState *state)
+{
+  m_painter->setClipPath(convertPath( state, state->getPath(), Qt::WindingFill ) );
+}
+
+void ArthurOutputDev::eoClip(GfxState *state)
+{
+  m_painter->setClipPath(convertPath( state, state->getPath(), Qt::OddEvenFill ) );
+}
+
+void ArthurOutputDev::drawChar(GfxState *state, double x, double y,
+                              double dx, double dy,
+                              double originX, double originY,
+                              CharCode code, int nBytes, Unicode *u, int uLen) {
+#ifdef HAVE_SPLASH
+  double x1, y1;
+  double x2, y2;
+//   SplashPath *path;
+  int render;
+
+  if (m_needFontUpdate) {
+    updateFont(state);
+  }
+  if (!m_font) {
+    return;
+  }
+
+  // check for invisible text -- this is used by Acrobat Capture
+  render = state->getRender();
+  if (render == 3) {
+    return;
+  }
+
+  x -= originX;
+  y -= originY;
+
+  // fill
+  if (!(render & 1)) {
+    SplashPath * fontPath;
+    fontPath = m_font->getGlyphPath(code);
+    if (fontPath) {
+      QPainterPath qPath;
+      qPath.setFillRule(Qt::WindingFill);
+      for (int i = 0; i < fontPath->length; ++i) {
+        if (fontPath->flags[i] & splashPathFirst) {
+            state->transform(fontPath->pts[i].x+x, -fontPath->pts[i].y+y, &x1, &y1);
+            qPath.moveTo(x1,y1);
+        } else if (fontPath->flags[i] & splashPathCurve) {
+            state->transform(fontPath->pts[i].x+x, -fontPath->pts[i].y+y, &x1, &y1);
+            state->transform(fontPath->pts[i+1].x+x, -fontPath->pts[i+1].y+y, &x2, &y2);
+            qPath.quadTo(x1,y1,x2,y2);
+            ++i;
+        }
+        // FIXME fix this
+        //     else if (fontPath->flags[i] & splashPathArcCW) {
+        //       qDebug() << "Need to implement arc";
+        //     }
+        else {
+            state->transform(fontPath->pts[i].x+x, -fontPath->pts[i].y+y, &x1, &y1);
+            qPath.lineTo(x1,y1);
+        }
+        if (fontPath->flags[i] & splashPathLast) {
+            qPath.closeSubpath();
+        }
+      }
+      GfxRGB rgb;
+      QColor brushColour = m_currentBrush.color();
+      state->getFillRGB(&rgb);
+      brushColour.setRgbF(colToDbl(rgb.r), colToDbl(rgb.g), colToDbl(rgb.b), state->getFillOpacity());
+      m_painter->setBrush(brushColour);
+      QColor penColour = m_currentPen.color();
+      state->getStrokeRGB(&rgb);
+      penColour.setRgbF(colToDbl(rgb.r), colToDbl(rgb.g), colToDbl(rgb.b), state->getStrokeOpacity());
+      m_painter->setPen(penColour);
+      m_painter->drawPath( qPath );
+      delete fontPath;
+    }
+  }
+
+  // stroke
+  if ((render & 3) == 1 || (render & 3) == 2) {
+    qDebug() << "no stroke";
+    /*
+    if ((path = m_font->getGlyphPath(code))) {
+      path->offset((SplashCoord)x1, (SplashCoord)y1);
+      splash->stroke(path);
+      delete path;
+    }
+    */
+  }
+
+  // clip
+  if (render & 4) {
+    qDebug() << "no clip";
+    /*
+    path = m_font->getGlyphPath(code);
+    path->offset((SplashCoord)x1, (SplashCoord)y1);
+    if (textClipPath) {
+      textClipPath->append(path);
+      delete path;
+    } else {
+      textClipPath = path;
+    }
+    */
+  }
+#endif
+}
+
+GBool ArthurOutputDev::beginType3Char(GfxState *state, double x, double y,
+                                     double dx, double dy,
+                                     CharCode code, Unicode *u, int uLen)
+{
+  return gFalse;
+}
+
+void ArthurOutputDev::endType3Char(GfxState *state)
+{
+}
+
+void ArthurOutputDev::type3D0(GfxState *state, double wx, double wy)
+{
+}
+
+void ArthurOutputDev::type3D1(GfxState *state, double wx, double wy,
+                             double llx, double lly, double urx, double ury)
+{
+}
+
+void ArthurOutputDev::endTextObject(GfxState *state)
+{
+}
+
+
+void ArthurOutputDev::drawImageMask(GfxState *state, Object *ref, Stream *str,
+                                   int width, int height, GBool invert,
+                                   GBool interpolate, GBool inlineImg)
+{
+  qDebug() << "drawImageMask";
+#if 0
+  unsigned char *buffer;
+  unsigned char *dest;
+  cairo_surface_t *image;
+  cairo_pattern_t *pattern;
+  int x, y;
+  ImageStream *imgStr;
+  Guchar *pix;
+  double *ctm;
+  cairo_matrix_t matrix;
+  int invert_bit;
+  int row_stride;
+
+  row_stride = (width + 3) & ~3;
+  buffer = (unsigned char *) malloc (height * row_stride);
+  if (buffer == NULL) {
+    error(-1, "Unable to allocate memory for image.");
+    return;
+  }
+
+  /* TODO: Do we want to cache these? */
+  imgStr = new ImageStream(str, width, 1, 1);
+  imgStr->reset();
+
+  invert_bit = invert ? 1 : 0;
+
+  for (y = 0; y < height; y++) {
+    pix = imgStr->getLine();
+    dest = buffer + y * row_stride;
+    for (x = 0; x < width; x++) {
+
+      if (pix[x] ^ invert_bit)
+       *dest++ = 0;
+      else
+       *dest++ = 255;
+    }
+  }
+
+  image = cairo_image_surface_create_for_data (buffer, CAIRO_FORMAT_A8,
+                                         width, height, row_stride);
+  if (image == NULL)
+    return;
+  pattern = cairo_pattern_create_for_surface (image);
+  if (pattern == NULL)
+    return;
+
+  ctm = state->getCTM();
+  LOG (printf ("drawImageMask %dx%d, matrix: %f, %f, %f, %f, %f, %f\n",
+              width, height, ctm[0], ctm[1], ctm[2], ctm[3], ctm[4], ctm[5]));
+  matrix.xx = ctm[0] / width;
+  matrix.xy = -ctm[2] / height;
+  matrix.yx = ctm[1] / width;
+  matrix.yy = -ctm[3] / height;
+  matrix.x0 = ctm[2] + ctm[4];
+  matrix.y0 = ctm[3] + ctm[5];
+  cairo_matrix_invert (&matrix);
+  cairo_pattern_set_matrix (pattern, &matrix);
+
+  cairo_pattern_set_filter (pattern, CAIRO_FILTER_BEST);
+  /* FIXME: Doesn't the image mask support any colorspace? */
+  cairo_set_source_rgb (cairo, fill_color.r, fill_color.g, fill_color.b);
+  cairo_mask (cairo, pattern);
+
+  cairo_pattern_destroy (pattern);
+  cairo_surface_destroy (image);
+  free (buffer);
+  imgStr->close ();
+  delete imgStr;
+#endif
+}
+
+//TODO: lots more work here.
+void ArthurOutputDev::drawImage(GfxState *state, Object *ref, Stream *str,
+                               int width, int height,
+                               GfxImageColorMap *colorMap,
+                               GBool interpolate, int *maskColors, GBool inlineImg)
+{
+  unsigned int *data;
+  unsigned int *line;
+  int x, y;
+  ImageStream *imgStr;
+  Guchar *pix;
+  int i;
+  double *ctm;
+  QMatrix matrix;
+  QImage image;
+  int stride;
+  
+  /* TODO: Do we want to cache these? */
+  imgStr = new ImageStream(str, width,
+                          colorMap->getNumPixelComps(),
+                          colorMap->getBits());
+  imgStr->reset();
+  
+  image = QImage(width, height, QImage::Format_ARGB32);
+  data = (unsigned int *)image.bits();
+  stride = image.bytesPerLine()/4;
+  for (y = 0; y < height; y++) {
+    pix = imgStr->getLine();
+    line = data+y*stride;
+    colorMap->getRGBLine(pix, line, width);
+
+    if (maskColors) {
+      for (x = 0; x < width; x++) {
+        for (i = 0; i < colorMap->getNumPixelComps(); ++i) {
+            if (pix[i] < maskColors[2*i] * 255||
+                pix[i] > maskColors[2*i+1] * 255) {
+                *line = *line | 0xff000000;
+                break;
+            }
+        }
+        pix += colorMap->getNumPixelComps();
+        line++;
+      }
+    } else {
+      for (x = 0; x < width; x++) { *line = *line | 0xff000000; line++; }
+    }
+  }
+
+  ctm = state->getCTM();
+  matrix.setMatrix(ctm[0] / width, ctm[1] / width, -ctm[2] / height, -ctm[3] / height, ctm[2] + ctm[4], ctm[3] + ctm[5]);
+
+  m_painter->setMatrix(matrix, true);
+  m_painter->drawImage( QPoint(0,0), image );
+  delete imgStr;
+
+}
diff --git a/poppler/ArthurOutputDev.h b/poppler/ArthurOutputDev.h
new file mode 100644 (file)
index 0000000..ed631a0
--- /dev/null
@@ -0,0 +1,169 @@
+//========================================================================
+//
+// ArthurOutputDev.h
+//
+// Copyright 2003 Glyph & Cog, LLC
+//
+//========================================================================
+
+//========================================================================
+//
+// Modified under the Poppler project - http://poppler.freedesktop.org
+//
+// All changes made under the Poppler project to this file are licensed
+// under GPL version 2 or later
+//
+// Copyright (C) 2005 Brad Hards <bradh@frogmouth.net>
+// Copyright (C) 2005 Albert Astals Cid <aacid@kde.org>
+// Copyright (C) 2009, 2011 Carlos Garcia Campos <carlosgc@gnome.org>
+// Copyright (C) 2010 Pino Toscano <pino@kde.org>
+// Copyright (C) 2011 Andreas Hartmetz <ahartmetz@gmail.com>
+//
+// To see a description of the changes please see the Changelog file that
+// came with your tarball or type make ChangeLog if you are building from git
+//
+//========================================================================
+
+#ifndef ARTHUROUTPUTDEV_H
+#define ARTHUROUTPUTDEV_H
+
+#ifdef USE_GCC_PRAGMAS
+#pragma interface
+#endif
+
+#include "goo/gtypes.h"
+#include "OutputDev.h"
+#include "GfxState.h"
+
+#include <QtGui/QPainter>
+
+class GfxState;
+class GfxPath;
+class Gfx8BitFont;
+struct GfxRGB;
+
+class SplashFont;
+class SplashFontEngine;
+struct SplashGlyphBitmap;
+
+//------------------------------------------------------------------------
+// ArthurOutputDev - Qt 4 QPainter renderer
+//------------------------------------------------------------------------
+
+class ArthurOutputDev: public OutputDev {
+public:
+  /**
+   * Describes how fonts are distorted (aka hinted) to fit the pixel grid.
+   * More hinting means sharper edges and less adherence to the true letter shapes.
+   */
+  enum FontHinting {
+    NoHinting = 0, ///< Font shapes are left unchanged
+    SlightHinting, ///< Font shapes are distorted vertically only
+    FullHinting ///< Font shapes are distorted horizontally and vertically
+  };
+
+  // Constructor.
+  ArthurOutputDev(QPainter *painter );
+
+  // Destructor.
+  virtual ~ArthurOutputDev();
+
+  void setFontHinting(FontHinting hinting) { m_fontHinting = hinting; }
+
+  //----- get info about output device
+
+  // Does this device use upside-down coordinates?
+  // (Upside-down means (0,0) is the top left corner of the page.)
+  virtual GBool upsideDown() { return gTrue; }
+
+  // Does this device use drawChar() or drawString()?
+  virtual GBool useDrawChar() { return gTrue; }
+
+  // Does this device use beginType3Char/endType3Char?  Otherwise,
+  // text in Type 3 fonts will be drawn with drawChar/drawString.
+  virtual GBool interpretType3Chars() { return gTrue; }
+
+  //----- initialization and control
+
+  // Start a page.
+  virtual void startPage(int pageNum, GfxState *state);
+
+  // End a page.
+  virtual void endPage();
+
+  //----- save/restore graphics state
+  virtual void saveState(GfxState *state);
+  virtual void restoreState(GfxState *state);
+
+  //----- update graphics state
+  virtual void updateAll(GfxState *state);
+  virtual void updateCTM(GfxState *state, double m11, double m12,
+                        double m21, double m22, double m31, double m32);
+  virtual void updateLineDash(GfxState *state);
+  virtual void updateFlatness(GfxState *state);
+  virtual void updateLineJoin(GfxState *state);
+  virtual void updateLineCap(GfxState *state);
+  virtual void updateMiterLimit(GfxState *state);
+  virtual void updateLineWidth(GfxState *state);
+  virtual void updateFillColor(GfxState *state);
+  virtual void updateStrokeColor(GfxState *state);
+  virtual void updateFillOpacity(GfxState *state);
+  virtual void updateStrokeOpacity(GfxState *state);
+
+  //----- update text state
+  virtual void updateFont(GfxState *state);
+
+  //----- path painting
+  virtual void stroke(GfxState *state);
+  virtual void fill(GfxState *state);
+  virtual void eoFill(GfxState *state);
+
+  //----- path clipping
+  virtual void clip(GfxState *state);
+  virtual void eoClip(GfxState *state);
+
+  //----- text drawing
+  //   virtual void drawString(GfxState *state, GooString *s);
+  virtual void drawChar(GfxState *state, double x, double y,
+                       double dx, double dy,
+                       double originX, double originY,
+                       CharCode code, int nBytes, Unicode *u, int uLen);
+  virtual GBool beginType3Char(GfxState *state, double x, double y,
+                              double dx, double dy,
+                              CharCode code, Unicode *u, int uLen);
+  virtual void endType3Char(GfxState *state);
+  virtual void endTextObject(GfxState *state);
+
+  //----- image drawing
+  virtual void drawImageMask(GfxState *state, Object *ref, Stream *str,
+                            int width, int height, GBool invert,
+                            GBool interpolate, GBool inlineImg);
+  virtual void drawImage(GfxState *state, Object *ref, Stream *str,
+                        int width, int height, GfxImageColorMap *colorMap,
+                        GBool interpolate, int *maskColors, GBool inlineImg);
+
+  //----- Type 3 font operators
+  virtual void type3D0(GfxState *state, double wx, double wy);
+  virtual void type3D1(GfxState *state, double wx, double wy,
+                      double llx, double lly, double urx, double ury);
+
+  //----- special access
+
+  // Called to indicate that a new PDF document has been loaded.
+  void startDoc(XRef *xrefA);
+  GBool isReverseVideo() { return gFalse; }
+  
+private:
+  QPainter *m_painter;
+  FontHinting m_fontHinting;
+  QFont m_currentFont;
+  QPen m_currentPen;
+  QBrush m_currentBrush;
+  GBool m_needFontUpdate;              // set when the font needs to be updated
+  SplashFontEngine *m_fontEngine;
+  SplashFont *m_font;          // current font
+  XRef *xref;                  // xref table for current document
+};
+
+#endif
diff --git a/poppler/BuiltinFont.cc b/poppler/BuiltinFont.cc
new file mode 100644 (file)
index 0000000..20a297d
--- /dev/null
@@ -0,0 +1,65 @@
+//========================================================================
+//
+// BuiltinFont.cc
+//
+// Copyright 2001-2003 Glyph & Cog, LLC
+//
+//========================================================================
+
+#include <config.h>
+
+#ifdef USE_GCC_PRAGMAS
+#pragma implementation
+#endif
+
+#include <stdlib.h>
+#include <string.h>
+#include "goo/gmem.h"
+#include "FontEncodingTables.h"
+#include "BuiltinFont.h"
+
+//------------------------------------------------------------------------
+
+BuiltinFontWidths::BuiltinFontWidths(BuiltinFontWidth *widths, int sizeA) {
+  int i, h;
+
+  size = sizeA;
+  tab = (BuiltinFontWidth **)gmallocn(size, sizeof(BuiltinFontWidth *));
+  for (i = 0; i < size; ++i) {
+    tab[i] = NULL;
+  }
+  for (i = 0; i < sizeA; ++i) {
+    h = hash(widths[i].name);
+    widths[i].next = tab[h];
+    tab[h] = &widths[i];
+  }
+}
+
+BuiltinFontWidths::~BuiltinFontWidths() {
+  gfree(tab);
+}
+
+GBool BuiltinFontWidths::getWidth(const char *name, Gushort *width) {
+  int h;
+  BuiltinFontWidth *p;
+
+  h = hash(name);
+  for (p = tab[h]; p; p = p->next) {
+    if (!strcmp(p->name, name)) {
+      *width = p->width;
+      return gTrue;
+    }
+  }
+  return gFalse;
+}
+
+int BuiltinFontWidths::hash(const char *name) {
+  const char *p;
+  unsigned int h;
+
+  h = 0;
+  for (p = name; *p; ++p) {
+    h = 17 * h + (int)(*p & 0xff);
+  }
+  return (int)(h % size);
+}
diff --git a/poppler/BuiltinFont.h b/poppler/BuiltinFont.h
new file mode 100644 (file)
index 0000000..bbdd055
--- /dev/null
@@ -0,0 +1,55 @@
+//========================================================================
+//
+// BuiltinFont.h
+//
+// Copyright 2001-2003 Glyph & Cog, LLC
+//
+//========================================================================
+
+#ifndef BUILTINFONT_H
+#define BUILTINFONT_H
+
+#ifdef USE_GCC_PRAGMAS
+#pragma interface
+#endif
+
+#include "goo/gtypes.h"
+
+struct BuiltinFont;
+class BuiltinFontWidths;
+
+//------------------------------------------------------------------------
+
+struct BuiltinFont {
+  const char *name;
+  const char **defaultBaseEnc;
+  short ascent;
+  short descent;
+  short bbox[4];
+  BuiltinFontWidths *widths;
+};
+
+//------------------------------------------------------------------------
+
+struct BuiltinFontWidth {
+  const char *name;
+  Gushort width;
+  BuiltinFontWidth *next;
+};
+
+class BuiltinFontWidths {
+public:
+
+  BuiltinFontWidths(BuiltinFontWidth *widths, int sizeA);
+  ~BuiltinFontWidths();
+  GBool getWidth(const char *name, Gushort *width);
+
+private:
+
+  int hash(const char *name);
+
+  BuiltinFontWidth **tab;
+  int size;
+};
+
+#endif
diff --git a/poppler/BuiltinFontTables.cc b/poppler/BuiltinFontTables.cc
new file mode 100644 (file)
index 0000000..5115b7b
--- /dev/null
@@ -0,0 +1,4284 @@
+//========================================================================
+//
+// BuiltinFontTables.cc
+//
+// Copyright 2001-2003 Glyph & Cog, LLC
+//
+//========================================================================
+
+#include <config.h>
+#include <stdlib.h>
+#include "FontEncodingTables.h"
+#include "BuiltinFontTables.h"
+
+static BuiltinFontWidth courierWidthsTab[] = {
+  { "Ntilde",                            600, NULL },
+  { "rcaron",                            600, NULL },
+  { "kcommaaccent",                      600, NULL },
+  { "Ncommaaccent",                      600, NULL },
+  { "Zacute",                            600, NULL },
+  { "comma",                             600, NULL },
+  { "cedilla",                           600, NULL },
+  { "plusminus",                         600, NULL },
+  { "circumflex",                        600, NULL },
+  { "dotaccent",                         600, NULL },
+  { "edotaccent",                        600, NULL },
+  { "asciitilde",                        600, NULL },
+  { "colon",                             600, NULL },
+  { "onehalf",                           600, NULL },
+  { "dollar",                            600, NULL },
+  { "Lcaron",                            600, NULL },
+  { "ntilde",                            600, NULL },
+  { "Aogonek",                           600, NULL },
+  { "ncommaaccent",                      600, NULL },
+  { "minus",                             600, NULL },
+  { "Iogonek",                           600, NULL },
+  { "zacute",                            600, NULL },
+  { "yen",                               600, NULL },
+  { "space",                             600, NULL },
+  { "Omacron",                           600, NULL },
+  { "questiondown",                      600, NULL },
+  { "emdash",                            600, NULL },
+  { "Agrave",                            600, NULL },
+  { "three",                             600, NULL },
+  { "numbersign",                        600, NULL },
+  { "lcaron",                            600, NULL },
+  { "A",                                 600, NULL },
+  { "B",                                 600, NULL },
+  { "C",                                 600, NULL },
+  { "aogonek",                           600, NULL },
+  { "D",                                 600, NULL },
+  { "E",                                 600, NULL },
+  { "onequarter",                        600, NULL },
+  { "F",                                 600, NULL },
+  { "G",                                 600, NULL },
+  { "H",                                 600, NULL },
+  { "I",                                 600, NULL },
+  { "J",                                 600, NULL },
+  { "K",                                 600, NULL },
+  { "iogonek",                           600, NULL },
+  { "L",                                 600, NULL },
+  { "backslash",                         600, NULL },
+  { "periodcentered",                    600, NULL },
+  { "M",                                 600, NULL },
+  { "N",                                 600, NULL },
+  { "omacron",                           600, NULL },
+  { "Tcommaaccent",                      600, NULL },
+  { "O",                                 600, NULL },
+  { "P",                                 600, NULL },
+  { "Q",                                 600, NULL },
+  { "Uhungarumlaut",                     600, NULL },
+  { "R",                                 600, NULL },
+  { "Aacute",                            600, NULL },
+  { "caron",                             600, NULL },
+  { "S",                                 600, NULL },
+  { "T",                                 600, NULL },
+  { "U",                                 600, NULL },
+  { "agrave",                            600, NULL },
+  { "V",                                 600, NULL },
+  { "W",                                 600, NULL },
+  { "equal",                             600, NULL },
+  { "question",                          600, NULL },
+  { "X",                                 600, NULL },
+  { "Y",                                 600, NULL },
+  { "Z",                                 600, NULL },
+  { "four",                              600, NULL },
+  { "a",                                 600, NULL },
+  { "Gcommaaccent",                      600, NULL },
+  { "b",                                 600, NULL },
+  { "c",                                 600, NULL },
+  { "d",                                 600, NULL },
+  { "e",                                 600, NULL },
+  { "f",                                 600, NULL },
+  { "g",                                 600, NULL },
+  { "bullet",                            600, NULL },
+  { "h",                                 600, NULL },
+  { "i",                                 600, NULL },
+  { "Oslash",                            600, NULL },
+  { "dagger",                            600, NULL },
+  { "j",                                 600, NULL },
+  { "k",                                 600, NULL },
+  { "l",                                 600, NULL },
+  { "m",                                 600, NULL },
+  { "n",                                 600, NULL },
+  { "tcommaaccent",                      600, NULL },
+  { "o",                                 600, NULL },
+  { "ordfeminine",                       600, NULL },
+  { "ring",                              600, NULL },
+  { "p",                                 600, NULL },
+  { "q",                                 600, NULL },
+  { "uhungarumlaut",                     600, NULL },
+  { "r",                                 600, NULL },
+  { "twosuperior",                       600, NULL },
+  { "aacute",                            600, NULL },
+  { "s",                                 600, NULL },
+  { "OE",                                600, NULL },
+  { "t",                                 600, NULL },
+  { "divide",                            600, NULL },
+  { "u",                                 600, NULL },
+  { "Ccaron",                            600, NULL },
+  { "v",                                 600, NULL },
+  { "w",                                 600, NULL },
+  { "x",                                 600, NULL },
+  { "y",                                 600, NULL },
+  { "z",                                 600, NULL },
+  { "Gbreve",                            600, NULL },
+  { "commaaccent",                       600, NULL },
+  { "hungarumlaut",                      600, NULL },
+  { "Idotaccent",                        600, NULL },
+  { "Nacute",                            600, NULL },
+  { "quotedbl",                          600, NULL },
+  { "gcommaaccent",                      600, NULL },
+  { "mu",                                600, NULL },
+  { "greaterequal",                      600, NULL },
+  { "Scaron",                            600, NULL },
+  { "Lslash",                            600, NULL },
+  { "semicolon",                         600, NULL },
+  { "oslash",                            600, NULL },
+  { "lessequal",                         600, NULL },
+  { "lozenge",                           600, NULL },
+  { "parenright",                        600, NULL },
+  { "ccaron",                            600, NULL },
+  { "Ecircumflex",                       600, NULL },
+  { "gbreve",                            600, NULL },
+  { "trademark",                         600, NULL },
+  { "daggerdbl",                         600, NULL },
+  { "nacute",                            600, NULL },
+  { "macron",                            600, NULL },
+  { "Otilde",                            600, NULL },
+  { "Emacron",                           600, NULL },
+  { "ellipsis",                          600, NULL },
+  { "scaron",                            600, NULL },
+  { "AE",                                600, NULL },
+  { "Ucircumflex",                       600, NULL },
+  { "lslash",                            600, NULL },
+  { "quotedblleft",                      600, NULL },
+  { "hyphen",                            600, NULL },
+  { "guilsinglright",                    600, NULL },
+  { "quotesingle",                       600, NULL },
+  { "eight",                             600, NULL },
+  { "exclamdown",                        600, NULL },
+  { "endash",                            600, NULL },
+  { "oe",                                600, NULL },
+  { "Abreve",                            600, NULL },
+  { "Umacron",                           600, NULL },
+  { "ecircumflex",                       600, NULL },
+  { "Adieresis",                         600, NULL },
+  { "copyright",                         600, NULL },
+  { "Egrave",                            600, NULL },
+  { "slash",                             600, NULL },
+  { "Edieresis",                         600, NULL },
+  { "otilde",                            600, NULL },
+  { "Idieresis",                         600, NULL },
+  { "parenleft",                         600, NULL },
+  { "one",                               600, NULL },
+  { "emacron",                           600, NULL },
+  { "Odieresis",                         600, NULL },
+  { "ucircumflex",                       600, NULL },
+  { "bracketleft",                       600, NULL },
+  { "Ugrave",                            600, NULL },
+  { "quoteright",                        600, NULL },
+  { "Udieresis",                         600, NULL },
+  { "perthousand",                       600, NULL },
+  { "Ydieresis",                         600, NULL },
+  { "umacron",                           600, NULL },
+  { "abreve",                            600, NULL },
+  { "Eacute",                            600, NULL },
+  { "adieresis",                         600, NULL },
+  { "egrave",                            600, NULL },
+  { "edieresis",                         600, NULL },
+  { "idieresis",                         600, NULL },
+  { "Eth",                               600, NULL },
+  { "ae",                                600, NULL },
+  { "asterisk",                          600, NULL },
+  { "odieresis",                         600, NULL },
+  { "Uacute",                            600, NULL },
+  { "ugrave",                            600, NULL },
+  { "five",                              600, NULL },
+  { "nine",                              600, NULL },
+  { "udieresis",                         600, NULL },
+  { "Zcaron",                            600, NULL },
+  { "Scommaaccent",                      600, NULL },
+  { "threequarters",                     600, NULL },
+  { "guillemotright",                    600, NULL },
+  { "Ccedilla",                          600, NULL },
+  { "ydieresis",                         600, NULL },
+  { "tilde",                             600, NULL },
+  { "at",                                600, NULL },
+  { "eacute",                            600, NULL },
+  { "underscore",                        600, NULL },
+  { "Euro",                              600, NULL },
+  { "Dcroat",                            600, NULL },
+  { "zero",                              600, NULL },
+  { "multiply",                          600, NULL },
+  { "eth",                               600, NULL },
+  { "Scedilla",                          600, NULL },
+  { "Racute",                            600, NULL },
+  { "Ograve",                            600, NULL },
+  { "partialdiff",                       600, NULL },
+  { "uacute",                            600, NULL },
+  { "braceleft",                         600, NULL },
+  { "Thorn",                             600, NULL },
+  { "zcaron",                            600, NULL },
+  { "scommaaccent",                      600, NULL },
+  { "ccedilla",                          600, NULL },
+  { "Dcaron",                            600, NULL },
+  { "dcroat",                            600, NULL },
+  { "scedilla",                          600, NULL },
+  { "Oacute",                            600, NULL },
+  { "Ocircumflex",                       600, NULL },
+  { "ogonek",                            600, NULL },
+  { "ograve",                            600, NULL },
+  { "racute",                            600, NULL },
+  { "Tcaron",                            600, NULL },
+  { "Eogonek",                           600, NULL },
+  { "thorn",                             600, NULL },
+  { "degree",                            600, NULL },
+  { "registered",                        600, NULL },
+  { "radical",                           600, NULL },
+  { "Aring",                             600, NULL },
+  { "percent",                           600, NULL },
+  { "six",                               600, NULL },
+  { "paragraph",                         600, NULL },
+  { "dcaron",                            600, NULL },
+  { "Uogonek",                           600, NULL },
+  { "two",                               600, NULL },
+  { "summation",                         600, NULL },
+  { "Igrave",                            600, NULL },
+  { "Lacute",                            600, NULL },
+  { "ocircumflex",                       600, NULL },
+  { "oacute",                            600, NULL },
+  { "Uring",                             600, NULL },
+  { "Lcommaaccent",                      600, NULL },
+  { "tcaron",                            600, NULL },
+  { "eogonek",                           600, NULL },
+  { "Delta",                             600, NULL },
+  { "Ohungarumlaut",                     600, NULL },
+  { "asciicircum",                       600, NULL },
+  { "aring",                             600, NULL },
+  { "grave",                             600, NULL },
+  { "uogonek",                           600, NULL },
+  { "bracketright",                      600, NULL },
+  { "ampersand",                         600, NULL },
+  { "Iacute",                            600, NULL },
+  { "lacute",                            600, NULL },
+  { "igrave",                            600, NULL },
+  { "Ncaron",                            600, NULL },
+  { "plus",                              600, NULL },
+  { "uring",                             600, NULL },
+  { "quotesinglbase",                    600, NULL },
+  { "lcommaaccent",                      600, NULL },
+  { "Yacute",                            600, NULL },
+  { "ohungarumlaut",                     600, NULL },
+  { "threesuperior",                     600, NULL },
+  { "acute",                             600, NULL },
+  { "section",                           600, NULL },
+  { "dieresis",                          600, NULL },
+  { "quotedblbase",                      600, NULL },
+  { "iacute",                            600, NULL },
+  { "ncaron",                            600, NULL },
+  { "florin",                            600, NULL },
+  { "yacute",                            600, NULL },
+  { "Rcommaaccent",                      600, NULL },
+  { "fi",                                600, NULL },
+  { "fl",                                600, NULL },
+  { "Acircumflex",                       600, NULL },
+  { "Cacute",                            600, NULL },
+  { "Icircumflex",                       600, NULL },
+  { "guillemotleft",                     600, NULL },
+  { "germandbls",                        600, NULL },
+  { "seven",                             600, NULL },
+  { "Amacron",                           600, NULL },
+  { "Sacute",                            600, NULL },
+  { "ordmasculine",                      600, NULL },
+  { "dotlessi",                          600, NULL },
+  { "sterling",                          600, NULL },
+  { "notequal",                          600, NULL },
+  { "Imacron",                           600, NULL },
+  { "rcommaaccent",                      600, NULL },
+  { "Zdotaccent",                        600, NULL },
+  { "acircumflex",                       600, NULL },
+  { "cacute",                            600, NULL },
+  { "Ecaron",                            600, NULL },
+  { "braceright",                        600, NULL },
+  { "icircumflex",                       600, NULL },
+  { "quotedblright",                     600, NULL },
+  { "amacron",                           600, NULL },
+  { "sacute",                            600, NULL },
+  { "imacron",                           600, NULL },
+  { "cent",                              600, NULL },
+  { "currency",                          600, NULL },
+  { "logicalnot",                        600, NULL },
+  { "zdotaccent",                        600, NULL },
+  { "Atilde",                            600, NULL },
+  { "breve",                             600, NULL },
+  { "bar",                               600, NULL },
+  { "fraction",                          600, NULL },
+  { "less",                              600, NULL },
+  { "ecaron",                            600, NULL },
+  { "guilsinglleft",                     600, NULL },
+  { "exclam",                            600, NULL },
+  { "period",                            600, NULL },
+  { "Rcaron",                            600, NULL },
+  { "Kcommaaccent",                      600, NULL },
+  { "greater",                           600, NULL },
+  { "atilde",                            600, NULL },
+  { "brokenbar",                         600, NULL },
+  { "quoteleft",                         600, NULL },
+  { "Edotaccent",                        600, NULL },
+  { "onesuperior",                       600, NULL }
+};
+
+static BuiltinFontWidth courierBoldWidthsTab[] = {
+  { "Ntilde",                            600, NULL },
+  { "rcaron",                            600, NULL },
+  { "kcommaaccent",                      600, NULL },
+  { "Ncommaaccent",                      600, NULL },
+  { "Zacute",                            600, NULL },
+  { "comma",                             600, NULL },
+  { "cedilla",                           600, NULL },
+  { "plusminus",                         600, NULL },
+  { "circumflex",                        600, NULL },
+  { "dotaccent",                         600, NULL },
+  { "edotaccent",                        600, NULL },
+  { "asciitilde",                        600, NULL },
+  { "colon",                             600, NULL },
+  { "onehalf",                           600, NULL },
+  { "dollar",                            600, NULL },
+  { "Lcaron",                            600, NULL },
+  { "ntilde",                            600, NULL },
+  { "Aogonek",                           600, NULL },
+  { "ncommaaccent",                      600, NULL },
+  { "minus",                             600, NULL },
+  { "Iogonek",                           600, NULL },
+  { "zacute",                            600, NULL },
+  { "yen",                               600, NULL },
+  { "space",                             600, NULL },
+  { "Omacron",                           600, NULL },
+  { "questiondown",                      600, NULL },
+  { "emdash",                            600, NULL },
+  { "Agrave",                            600, NULL },
+  { "three",                             600, NULL },
+  { "numbersign",                        600, NULL },
+  { "lcaron",                            600, NULL },
+  { "A",                                 600, NULL },
+  { "B",                                 600, NULL },
+  { "C",                                 600, NULL },
+  { "aogonek",                           600, NULL },
+  { "D",                                 600, NULL },
+  { "E",                                 600, NULL },
+  { "onequarter",                        600, NULL },
+  { "F",                                 600, NULL },
+  { "G",                                 600, NULL },
+  { "H",                                 600, NULL },
+  { "I",                                 600, NULL },
+  { "J",                                 600, NULL },
+  { "K",                                 600, NULL },
+  { "iogonek",                           600, NULL },
+  { "backslash",                         600, NULL },
+  { "L",                                 600, NULL },
+  { "periodcentered",                    600, NULL },
+  { "M",                                 600, NULL },
+  { "N",                                 600, NULL },
+  { "omacron",                           600, NULL },
+  { "Tcommaaccent",                      600, NULL },
+  { "O",                                 600, NULL },
+  { "P",                                 600, NULL },
+  { "Q",                                 600, NULL },
+  { "Uhungarumlaut",                     600, NULL },
+  { "R",                                 600, NULL },
+  { "Aacute",                            600, NULL },
+  { "caron",                             600, NULL },
+  { "S",                                 600, NULL },
+  { "T",                                 600, NULL },
+  { "U",                                 600, NULL },
+  { "agrave",                            600, NULL },
+  { "V",                                 600, NULL },
+  { "W",                                 600, NULL },
+  { "X",                                 600, NULL },
+  { "question",                          600, NULL },
+  { "equal",                             600, NULL },
+  { "Y",                                 600, NULL },
+  { "Z",                                 600, NULL },
+  { "four",                              600, NULL },
+  { "a",                                 600, NULL },
+  { "Gcommaaccent",                      600, NULL },
+  { "b",                                 600, NULL },
+  { "c",                                 600, NULL },
+  { "d",                                 600, NULL },
+  { "e",                                 600, NULL },
+  { "f",                                 600, NULL },
+  { "g",                                 600, NULL },
+  { "bullet",                            600, NULL },
+  { "h",                                 600, NULL },
+  { "i",                                 600, NULL },
+  { "Oslash",                            600, NULL },
+  { "dagger",                            600, NULL },
+  { "j",                                 600, NULL },
+  { "k",                                 600, NULL },
+  { "l",                                 600, NULL },
+  { "m",                                 600, NULL },
+  { "n",                                 600, NULL },
+  { "tcommaaccent",                      600, NULL },
+  { "o",                                 600, NULL },
+  { "ordfeminine",                       600, NULL },
+  { "ring",                              600, NULL },
+  { "p",                                 600, NULL },
+  { "q",                                 600, NULL },
+  { "uhungarumlaut",                     600, NULL },
+  { "r",                                 600, NULL },
+  { "twosuperior",                       600, NULL },
+  { "aacute",                            600, NULL },
+  { "s",                                 600, NULL },
+  { "OE",                                600, NULL },
+  { "t",                                 600, NULL },
+  { "divide",                            600, NULL },
+  { "u",                                 600, NULL },
+  { "Ccaron",                            600, NULL },
+  { "v",                                 600, NULL },
+  { "w",                                 600, NULL },
+  { "x",                                 600, NULL },
+  { "y",                                 600, NULL },
+  { "z",                                 600, NULL },
+  { "Gbreve",                            600, NULL },
+  { "commaaccent",                       600, NULL },
+  { "hungarumlaut",                      600, NULL },
+  { "Idotaccent",                        600, NULL },
+  { "Nacute",                            600, NULL },
+  { "quotedbl",                          600, NULL },
+  { "gcommaaccent",                      600, NULL },
+  { "mu",                                600, NULL },
+  { "greaterequal",                      600, NULL },
+  { "Scaron",                            600, NULL },
+  { "Lslash",                            600, NULL },
+  { "semicolon",                         600, NULL },
+  { "oslash",                            600, NULL },
+  { "lessequal",                         600, NULL },
+  { "lozenge",                           600, NULL },
+  { "parenright",                        600, NULL },
+  { "ccaron",                            600, NULL },
+  { "Ecircumflex",                       600, NULL },
+  { "gbreve",                            600, NULL },
+  { "trademark",                         600, NULL },
+  { "daggerdbl",                         600, NULL },
+  { "nacute",                            600, NULL },
+  { "macron",                            600, NULL },
+  { "Otilde",                            600, NULL },
+  { "Emacron",                           600, NULL },
+  { "ellipsis",                          600, NULL },
+  { "scaron",                            600, NULL },
+  { "AE",                                600, NULL },
+  { "Ucircumflex",                       600, NULL },
+  { "lslash",                            600, NULL },
+  { "quotedblleft",                      600, NULL },
+  { "guilsinglright",                    600, NULL },
+  { "hyphen",                            600, NULL },
+  { "quotesingle",                       600, NULL },
+  { "eight",                             600, NULL },
+  { "exclamdown",                        600, NULL },
+  { "endash",                            600, NULL },
+  { "oe",                                600, NULL },
+  { "Abreve",                            600, NULL },
+  { "Umacron",                           600, NULL },
+  { "ecircumflex",                       600, NULL },
+  { "Adieresis",                         600, NULL },
+  { "copyright",                         600, NULL },
+  { "Egrave",                            600, NULL },
+  { "slash",                             600, NULL },
+  { "Edieresis",                         600, NULL },
+  { "otilde",                            600, NULL },
+  { "Idieresis",                         600, NULL },
+  { "parenleft",                         600, NULL },
+  { "one",                               600, NULL },
+  { "emacron",                           600, NULL },
+  { "Odieresis",                         600, NULL },
+  { "ucircumflex",                       600, NULL },
+  { "bracketleft",                       600, NULL },
+  { "Ugrave",                            600, NULL },
+  { "quoteright",                        600, NULL },
+  { "Udieresis",                         600, NULL },
+  { "perthousand",                       600, NULL },
+  { "Ydieresis",                         600, NULL },
+  { "umacron",                           600, NULL },
+  { "abreve",                            600, NULL },
+  { "Eacute",                            600, NULL },
+  { "adieresis",                         600, NULL },
+  { "egrave",                            600, NULL },
+  { "edieresis",                         600, NULL },
+  { "idieresis",                         600, NULL },
+  { "Eth",                               600, NULL },
+  { "ae",                                600, NULL },
+  { "asterisk",                          600, NULL },
+  { "odieresis",                         600, NULL },
+  { "Uacute",                            600, NULL },
+  { "ugrave",                            600, NULL },
+  { "nine",                              600, NULL },
+  { "five",                              600, NULL },
+  { "udieresis",                         600, NULL },
+  { "Zcaron",                            600, NULL },
+  { "Scommaaccent",                      600, NULL },
+  { "threequarters",                     600, NULL },
+  { "guillemotright",                    600, NULL },
+  { "Ccedilla",                          600, NULL },
+  { "ydieresis",                         600, NULL },
+  { "tilde",                             600, NULL },
+  { "at",                                600, NULL },
+  { "eacute",                            600, NULL },
+  { "underscore",                        600, NULL },
+  { "Euro",                              600, NULL },
+  { "Dcroat",                            600, NULL },
+  { "multiply",                          600, NULL },
+  { "zero",                              600, NULL },
+  { "eth",                               600, NULL },
+  { "Scedilla",                          600, NULL },
+  { "Ograve",                            600, NULL },
+  { "Racute",                            600, NULL },
+  { "partialdiff",                       600, NULL },
+  { "uacute",                            600, NULL },
+  { "braceleft",                         600, NULL },
+  { "Thorn",                             600, NULL },
+  { "zcaron",                            600, NULL },
+  { "scommaaccent",                      600, NULL },
+  { "ccedilla",                          600, NULL },
+  { "Dcaron",                            600, NULL },
+  { "dcroat",                            600, NULL },
+  { "Ocircumflex",                       600, NULL },
+  { "Oacute",                            600, NULL },
+  { "scedilla",                          600, NULL },
+  { "ogonek",                            600, NULL },
+  { "ograve",                            600, NULL },
+  { "racute",                            600, NULL },
+  { "Tcaron",                            600, NULL },
+  { "Eogonek",                           600, NULL },
+  { "thorn",                             600, NULL },
+  { "degree",                            600, NULL },
+  { "registered",                        600, NULL },
+  { "radical",                           600, NULL },
+  { "Aring",                             600, NULL },
+  { "percent",                           600, NULL },
+  { "six",                               600, NULL },
+  { "paragraph",                         600, NULL },
+  { "dcaron",                            600, NULL },
+  { "Uogonek",                           600, NULL },
+  { "two",                               600, NULL },
+  { "summation",                         600, NULL },
+  { "Igrave",                            600, NULL },
+  { "Lacute",                            600, NULL },
+  { "ocircumflex",                       600, NULL },
+  { "oacute",                            600, NULL },
+  { "Uring",                             600, NULL },
+  { "Lcommaaccent",                      600, NULL },
+  { "tcaron",                            600, NULL },
+  { "eogonek",                           600, NULL },
+  { "Delta",                             600, NULL },
+  { "Ohungarumlaut",                     600, NULL },
+  { "asciicircum",                       600, NULL },
+  { "aring",                             600, NULL },
+  { "grave",                             600, NULL },
+  { "uogonek",                           600, NULL },
+  { "bracketright",                      600, NULL },
+  { "Iacute",                            600, NULL },
+  { "ampersand",                         600, NULL },
+  { "igrave",                            600, NULL },
+  { "lacute",                            600, NULL },
+  { "Ncaron",                            600, NULL },
+  { "plus",                              600, NULL },
+  { "uring",                             600, NULL },
+  { "quotesinglbase",                    600, NULL },
+  { "lcommaaccent",                      600, NULL },
+  { "Yacute",                            600, NULL },
+  { "ohungarumlaut",                     600, NULL },
+  { "threesuperior",                     600, NULL },
+  { "acute",                             600, NULL },
+  { "section",                           600, NULL },
+  { "dieresis",                          600, NULL },
+  { "iacute",                            600, NULL },
+  { "quotedblbase",                      600, NULL },
+  { "ncaron",                            600, NULL },
+  { "florin",                            600, NULL },
+  { "yacute",                            600, NULL },
+  { "Rcommaaccent",                      600, NULL },
+  { "fi",                                600, NULL },
+  { "fl",                                600, NULL },
+  { "Acircumflex",                       600, NULL },
+  { "Cacute",                            600, NULL },
+  { "Icircumflex",                       600, NULL },
+  { "guillemotleft",                     600, NULL },
+  { "germandbls",                        600, NULL },
+  { "Amacron",                           600, NULL },
+  { "seven",                             600, NULL },
+  { "Sacute",                            600, NULL },
+  { "ordmasculine",                      600, NULL },
+  { "dotlessi",                          600, NULL },
+  { "sterling",                          600, NULL },
+  { "notequal",                          600, NULL },
+  { "Imacron",                           600, NULL },
+  { "rcommaaccent",                      600, NULL },
+  { "Zdotaccent",                        600, NULL },
+  { "acircumflex",                       600, NULL },
+  { "cacute",                            600, NULL },
+  { "Ecaron",                            600, NULL },
+  { "icircumflex",                       600, NULL },
+  { "braceright",                        600, NULL },
+  { "quotedblright",                     600, NULL },
+  { "amacron",                           600, NULL },
+  { "sacute",                            600, NULL },
+  { "imacron",                           600, NULL },
+  { "cent",                              600, NULL },
+  { "currency",                          600, NULL },
+  { "logicalnot",                        600, NULL },
+  { "zdotaccent",                        600, NULL },
+  { "Atilde",                            600, NULL },
+  { "breve",                             600, NULL },
+  { "bar",                               600, NULL },
+  { "fraction",                          600, NULL },
+  { "less",                              600, NULL },
+  { "ecaron",                            600, NULL },
+  { "guilsinglleft",                     600, NULL },
+  { "exclam",                            600, NULL },
+  { "period",                            600, NULL },
+  { "Rcaron",                            600, NULL },
+  { "Kcommaaccent",                      600, NULL },
+  { "greater",                           600, NULL },
+  { "atilde",                            600, NULL },
+  { "brokenbar",                         600, NULL },
+  { "quoteleft",                         600, NULL },
+  { "Edotaccent",                        600, NULL },
+  { "onesuperior",                       600, NULL }
+};
+
+static BuiltinFontWidth courierBoldObliqueWidthsTab[] = {
+  { "Ntilde",                            600, NULL },
+  { "rcaron",                            600, NULL },
+  { "kcommaaccent",                      600, NULL },
+  { "Ncommaaccent",                      600, NULL },
+  { "Zacute",                            600, NULL },
+  { "comma",                             600, NULL },
+  { "cedilla",                           600, NULL },
+  { "plusminus",                         600, NULL },
+  { "circumflex",                        600, NULL },
+  { "dotaccent",                         600, NULL },
+  { "edotaccent",                        600, NULL },
+  { "asciitilde",                        600, NULL },
+  { "colon",                             600, NULL },
+  { "onehalf",                           600, NULL },
+  { "dollar",                            600, NULL },
+  { "Lcaron",                            600, NULL },
+  { "ntilde",                            600, NULL },
+  { "Aogonek",                           600, NULL },
+  { "ncommaaccent",                      600, NULL },
+  { "minus",                             600, NULL },
+  { "Iogonek",                           600, NULL },
+  { "zacute",                            600, NULL },
+  { "yen",                               600, NULL },
+  { "space",                             600, NULL },
+  { "Omacron",                           600, NULL },
+  { "questiondown",                      600, NULL },
+  { "emdash",                            600, NULL },
+  { "Agrave",                            600, NULL },
+  { "three",                             600, NULL },
+  { "numbersign",                        600, NULL },
+  { "lcaron",                            600, NULL },
+  { "A",                                 600, NULL },
+  { "B",                                 600, NULL },
+  { "C",                                 600, NULL },
+  { "aogonek",                           600, NULL },
+  { "D",                                 600, NULL },
+  { "E",                                 600, NULL },
+  { "onequarter",                        600, NULL },
+  { "F",                                 600, NULL },
+  { "G",                                 600, NULL },
+  { "H",                                 600, NULL },
+  { "I",                                 600, NULL },
+  { "J",                                 600, NULL },
+  { "K",                                 600, NULL },
+  { "iogonek",                           600, NULL },
+  { "backslash",                         600, NULL },
+  { "L",                                 600, NULL },
+  { "periodcentered",                    600, NULL },
+  { "M",                                 600, NULL },
+  { "N",                                 600, NULL },
+  { "omacron",                           600, NULL },
+  { "Tcommaaccent",                      600, NULL },
+  { "O",                                 600, NULL },
+  { "P",                                 600, NULL },
+  { "Q",                                 600, NULL },
+  { "Uhungarumlaut",                     600, NULL },
+  { "R",                                 600, NULL },
+  { "Aacute",                            600, NULL },
+  { "caron",                             600, NULL },
+  { "S",                                 600, NULL },
+  { "T",                                 600, NULL },
+  { "U",                                 600, NULL },
+  { "agrave",                            600, NULL },
+  { "V",                                 600, NULL },
+  { "W",                                 600, NULL },
+  { "X",                                 600, NULL },
+  { "question",                          600, NULL },
+  { "equal",                             600, NULL },
+  { "Y",                                 600, NULL },
+  { "Z",                                 600, NULL },
+  { "four",                              600, NULL },
+  { "a",                                 600, NULL },
+  { "Gcommaaccent",                      600, NULL },
+  { "b",                                 600, NULL },
+  { "c",                                 600, NULL },
+  { "d",                                 600, NULL },
+  { "e",                                 600, NULL },
+  { "f",                                 600, NULL },
+  { "g",                                 600, NULL },
+  { "bullet",                            600, NULL },
+  { "h",                                 600, NULL },
+  { "i",                                 600, NULL },
+  { "Oslash",                            600, NULL },
+  { "dagger",                            600, NULL },
+  { "j",                                 600, NULL },
+  { "k",                                 600, NULL },
+  { "l",                                 600, NULL },
+  { "m",                                 600, NULL },
+  { "n",                                 600, NULL },
+  { "tcommaaccent",                      600, NULL },
+  { "o",                                 600, NULL },
+  { "ordfeminine",                       600, NULL },
+  { "ring",                              600, NULL },
+  { "p",                                 600, NULL },
+  { "q",                                 600, NULL },
+  { "uhungarumlaut",                     600, NULL },
+  { "r",                                 600, NULL },
+  { "twosuperior",                       600, NULL },
+  { "aacute",                            600, NULL },
+  { "s",                                 600, NULL },
+  { "OE",                                600, NULL },
+  { "t",                                 600, NULL },
+  { "divide",                            600, NULL },
+  { "u",                                 600, NULL },
+  { "Ccaron",                            600, NULL },
+  { "v",                                 600, NULL },
+  { "w",                                 600, NULL },
+  { "x",                                 600, NULL },
+  { "y",                                 600, NULL },
+  { "z",                                 600, NULL },
+  { "Gbreve",                            600, NULL },
+  { "commaaccent",                       600, NULL },
+  { "hungarumlaut",                      600, NULL },
+  { "Idotaccent",                        600, NULL },
+  { "Nacute",                            600, NULL },
+  { "quotedbl",                          600, NULL },
+  { "gcommaaccent",                      600, NULL },
+  { "mu",                                600, NULL },
+  { "greaterequal",                      600, NULL },
+  { "Scaron",                            600, NULL },
+  { "Lslash",                            600, NULL },
+  { "semicolon",                         600, NULL },
+  { "oslash",                            600, NULL },
+  { "lessequal",                         600, NULL },
+  { "lozenge",                           600, NULL },
+  { "parenright",                        600, NULL },
+  { "ccaron",                            600, NULL },
+  { "Ecircumflex",                       600, NULL },
+  { "gbreve",                            600, NULL },
+  { "trademark",                         600, NULL },
+  { "daggerdbl",                         600, NULL },
+  { "nacute",                            600, NULL },
+  { "macron",                            600, NULL },
+  { "Otilde",                            600, NULL },
+  { "Emacron",                           600, NULL },
+  { "ellipsis",                          600, NULL },
+  { "scaron",                            600, NULL },
+  { "AE",                                600, NULL },
+  { "Ucircumflex",                       600, NULL },
+  { "lslash",                            600, NULL },
+  { "quotedblleft",                      600, NULL },
+  { "guilsinglright",                    600, NULL },
+  { "hyphen",                            600, NULL },
+  { "quotesingle",                       600, NULL },
+  { "eight",                             600, NULL },
+  { "exclamdown",                        600, NULL },
+  { "endash",                            600, NULL },
+  { "oe",                                600, NULL },
+  { "Abreve",                            600, NULL },
+  { "Umacron",                           600, NULL },
+  { "ecircumflex",                       600, NULL },
+  { "Adieresis",                         600, NULL },
+  { "copyright",                         600, NULL },
+  { "Egrave",                            600, NULL },
+  { "slash",                             600, NULL },
+  { "Edieresis",                         600, NULL },
+  { "otilde",                            600, NULL },
+  { "Idieresis",                         600, NULL },
+  { "parenleft",                         600, NULL },
+  { "one",                               600, NULL },
+  { "emacron",                           600, NULL },
+  { "Odieresis",                         600, NULL },
+  { "ucircumflex",                       600, NULL },
+  { "bracketleft",                       600, NULL },
+  { "Ugrave",                            600, NULL },
+  { "quoteright",                        600, NULL },
+  { "Udieresis",                         600, NULL },
+  { "perthousand",                       600, NULL },
+  { "Ydieresis",                         600, NULL },
+  { "umacron",                           600, NULL },
+  { "abreve",                            600, NULL },
+  { "Eacute",                            600, NULL },
+  { "adieresis",                         600, NULL },
+  { "egrave",                            600, NULL },
+  { "edieresis",                         600, NULL },
+  { "idieresis",                         600, NULL },
+  { "Eth",                               600, NULL },
+  { "ae",                                600, NULL },
+  { "asterisk",                          600, NULL },
+  { "odieresis",                         600, NULL },
+  { "Uacute",                            600, NULL },
+  { "ugrave",                            600, NULL },
+  { "nine",                              600, NULL },
+  { "five",                              600, NULL },
+  { "udieresis",                         600, NULL },
+  { "Zcaron",                            600, NULL },
+  { "Scommaaccent",                      600, NULL },
+  { "threequarters",                     600, NULL },
+  { "guillemotright",                    600, NULL },
+  { "Ccedilla",                          600, NULL },
+  { "ydieresis",                         600, NULL },
+  { "tilde",                             600, NULL },
+  { "at",                                600, NULL },
+  { "eacute",                            600, NULL },
+  { "underscore",                        600, NULL },
+  { "Euro",                              600, NULL },
+  { "Dcroat",                            600, NULL },
+  { "multiply",                          600, NULL },
+  { "zero",                              600, NULL },
+  { "eth",                               600, NULL },
+  { "Scedilla",                          600, NULL },
+  { "Ograve",                            600, NULL },
+  { "Racute",                            600, NULL },
+  { "partialdiff",                       600, NULL },
+  { "uacute",                            600, NULL },
+  { "braceleft",                         600, NULL },
+  { "Thorn",                             600, NULL },
+  { "zcaron",                            600, NULL },
+  { "scommaaccent",                      600, NULL },
+  { "ccedilla",                          600, NULL },
+  { "Dcaron",                            600, NULL },
+  { "dcroat",                            600, NULL },
+  { "Ocircumflex",                       600, NULL },
+  { "Oacute",                            600, NULL },
+  { "scedilla",                          600, NULL },
+  { "ogonek",                            600, NULL },
+  { "ograve",                            600, NULL },
+  { "racute",                            600, NULL },
+  { "Tcaron",                            600, NULL },
+  { "Eogonek",                           600, NULL },
+  { "thorn",                             600, NULL },
+  { "degree",                            600, NULL },
+  { "registered",                        600, NULL },
+  { "radical",                           600, NULL },
+  { "Aring",                             600, NULL },
+  { "percent",                           600, NULL },
+  { "six",                               600, NULL },
+  { "paragraph",                         600, NULL },
+  { "dcaron",                            600, NULL },
+  { "Uogonek",                           600, NULL },
+  { "two",                               600, NULL },
+  { "summation",                         600, NULL },
+  { "Igrave",                            600, NULL },
+  { "Lacute",                            600, NULL },
+  { "ocircumflex",                       600, NULL },
+  { "oacute",                            600, NULL },
+  { "Uring",                             600, NULL },
+  { "Lcommaaccent",                      600, NULL },
+  { "tcaron",                            600, NULL },
+  { "eogonek",                           600, NULL },
+  { "Delta",                             600, NULL },
+  { "Ohungarumlaut",                     600, NULL },
+  { "asciicircum",                       600, NULL },
+  { "aring",                             600, NULL },
+  { "grave",                             600, NULL },
+  { "uogonek",                           600, NULL },
+  { "bracketright",                      600, NULL },
+  { "Iacute",                            600, NULL },
+  { "ampersand",                         600, NULL },
+  { "igrave",                            600, NULL },
+  { "lacute",                            600, NULL },
+  { "Ncaron",                            600, NULL },
+  { "plus",                              600, NULL },
+  { "uring",                             600, NULL },
+  { "quotesinglbase",                    600, NULL },
+  { "lcommaaccent",                      600, NULL },
+  { "Yacute",                            600, NULL },
+  { "ohungarumlaut",                     600, NULL },
+  { "threesuperior",                     600, NULL },
+  { "acute",                             600, NULL },
+  { "section",                           600, NULL },
+  { "dieresis",                          600, NULL },
+  { "iacute",                            600, NULL },
+  { "quotedblbase",                      600, NULL },
+  { "ncaron",                            600, NULL },
+  { "florin",                            600, NULL },
+  { "yacute",                            600, NULL },
+  { "Rcommaaccent",                      600, NULL },
+  { "fi",                                600, NULL },
+  { "fl",                                600, NULL },
+  { "Acircumflex",                       600, NULL },
+  { "Cacute",                            600, NULL },
+  { "Icircumflex",                       600, NULL },
+  { "guillemotleft",                     600, NULL },
+  { "germandbls",                        600, NULL },
+  { "Amacron",                           600, NULL },
+  { "seven",                             600, NULL },
+  { "Sacute",                            600, NULL },
+  { "ordmasculine",                      600, NULL },
+  { "dotlessi",                          600, NULL },
+  { "sterling",                          600, NULL },
+  { "notequal",                          600, NULL },
+  { "Imacron",                           600, NULL },
+  { "rcommaaccent",                      600, NULL },
+  { "Zdotaccent",                        600, NULL },
+  { "acircumflex",                       600, NULL },
+  { "cacute",                            600, NULL },
+  { "Ecaron",                            600, NULL },
+  { "icircumflex",                       600, NULL },
+  { "braceright",                        600, NULL },
+  { "quotedblright",                     600, NULL },
+  { "amacron",                           600, NULL },
+  { "sacute",                            600, NULL },
+  { "imacron",                           600, NULL },
+  { "cent",                              600, NULL },
+  { "currency",                          600, NULL },
+  { "logicalnot",                        600, NULL },
+  { "zdotaccent",                        600, NULL },
+  { "Atilde",                            600, NULL },
+  { "breve",                             600, NULL },
+  { "bar",                               600, NULL },
+  { "fraction",                          600, NULL },
+  { "less",                              600, NULL },
+  { "ecaron",                            600, NULL },
+  { "guilsinglleft",                     600, NULL },
+  { "exclam",                            600, NULL },
+  { "period",                            600, NULL },
+  { "Rcaron",                            600, NULL },
+  { "Kcommaaccent",                      600, NULL },
+  { "greater",                           600, NULL },
+  { "atilde",                            600, NULL },
+  { "brokenbar",                         600, NULL },
+  { "quoteleft",                         600, NULL },
+  { "Edotaccent",                        600, NULL },
+  { "onesuperior",                       600, NULL }
+};
+
+static BuiltinFontWidth courierObliqueWidthsTab[] = {
+  { "Ntilde",                            600, NULL },
+  { "rcaron",                            600, NULL },
+  { "kcommaaccent",                      600, NULL },
+  { "Ncommaaccent",                      600, NULL },
+  { "Zacute",                            600, NULL },
+  { "comma",                             600, NULL },
+  { "cedilla",                           600, NULL },
+  { "plusminus",                         600, NULL },
+  { "circumflex",                        600, NULL },
+  { "dotaccent",                         600, NULL },
+  { "edotaccent",                        600, NULL },
+  { "asciitilde",                        600, NULL },
+  { "colon",                             600, NULL },
+  { "onehalf",                           600, NULL },
+  { "dollar",                            600, NULL },
+  { "Lcaron",                            600, NULL },
+  { "ntilde",                            600, NULL },
+  { "Aogonek",                           600, NULL },
+  { "ncommaaccent",                      600, NULL },
+  { "minus",                             600, NULL },
+  { "Iogonek",                           600, NULL },
+  { "zacute",                            600, NULL },
+  { "yen",                               600, NULL },
+  { "space",                             600, NULL },
+  { "Omacron",                           600, NULL },
+  { "questiondown",                      600, NULL },
+  { "emdash",                            600, NULL },
+  { "Agrave",                            600, NULL },
+  { "three",                             600, NULL },
+  { "numbersign",                        600, NULL },
+  { "lcaron",                            600, NULL },
+  { "A",                                 600, NULL },
+  { "B",                                 600, NULL },
+  { "C",                                 600, NULL },
+  { "aogonek",                           600, NULL },
+  { "D",                                 600, NULL },
+  { "E",                                 600, NULL },
+  { "onequarter",                        600, NULL },
+  { "F",                                 600, NULL },
+  { "G",                                 600, NULL },
+  { "H",                                 600, NULL },
+  { "I",                                 600, NULL },
+  { "J",                                 600, NULL },
+  { "K",                                 600, NULL },
+  { "iogonek",                           600, NULL },
+  { "backslash",                         600, NULL },
+  { "L",                                 600, NULL },
+  { "periodcentered",                    600, NULL },
+  { "M",                                 600, NULL },
+  { "N",                                 600, NULL },
+  { "omacron",                           600, NULL },
+  { "Tcommaaccent",                      600, NULL },
+  { "O",                                 600, NULL },
+  { "P",                                 600, NULL },
+  { "Q",                                 600, NULL },
+  { "Uhungarumlaut",                     600, NULL },
+  { "R",                                 600, NULL },
+  { "Aacute",                            600, NULL },
+  { "caron",                             600, NULL },
+  { "S",                                 600, NULL },
+  { "T",                                 600, NULL },
+  { "U",                                 600, NULL },
+  { "agrave",                            600, NULL },
+  { "V",                                 600, NULL },
+  { "W",                                 600, NULL },
+  { "X",                                 600, NULL },
+  { "question",                          600, NULL },
+  { "equal",                             600, NULL },
+  { "Y",                                 600, NULL },
+  { "Z",                                 600, NULL },
+  { "four",                              600, NULL },
+  { "a",                                 600, NULL },
+  { "Gcommaaccent",                      600, NULL },
+  { "b",                                 600, NULL },
+  { "c",                                 600, NULL },
+  { "d",                                 600, NULL },
+  { "e",                                 600, NULL },
+  { "f",                                 600, NULL },
+  { "g",                                 600, NULL },
+  { "bullet",                            600, NULL },
+  { "h",                                 600, NULL },
+  { "i",                                 600, NULL },
+  { "Oslash",                            600, NULL },
+  { "dagger",                            600, NULL },
+  { "j",                                 600, NULL },
+  { "k",                                 600, NULL },
+  { "l",                                 600, NULL },
+  { "m",                                 600, NULL },
+  { "n",                                 600, NULL },
+  { "tcommaaccent",                      600, NULL },
+  { "o",                                 600, NULL },
+  { "ordfeminine",                       600, NULL },
+  { "ring",                              600, NULL },
+  { "p",                                 600, NULL },
+  { "q",                                 600, NULL },
+  { "uhungarumlaut",                     600, NULL },
+  { "r",                                 600, NULL },
+  { "twosuperior",                       600, NULL },
+  { "aacute",                            600, NULL },
+  { "s",                                 600, NULL },
+  { "OE",                                600, NULL },
+  { "t",                                 600, NULL },
+  { "divide",                            600, NULL },
+  { "u",                                 600, NULL },
+  { "Ccaron",                            600, NULL },
+  { "v",                                 600, NULL },
+  { "w",                                 600, NULL },
+  { "x",                                 600, NULL },
+  { "y",                                 600, NULL },
+  { "z",                                 600, NULL },
+  { "Gbreve",                            600, NULL },
+  { "commaaccent",                       600, NULL },
+  { "hungarumlaut",                      600, NULL },
+  { "Idotaccent",                        600, NULL },
+  { "Nacute",                            600, NULL },
+  { "quotedbl",                          600, NULL },
+  { "gcommaaccent",                      600, NULL },
+  { "mu",                                600, NULL },
+  { "greaterequal",                      600, NULL },
+  { "Scaron",                            600, NULL },
+  { "Lslash",                            600, NULL },
+  { "semicolon",                         600, NULL },
+  { "oslash",                            600, NULL },
+  { "lessequal",                         600, NULL },
+  { "lozenge",                           600, NULL },
+  { "parenright",                        600, NULL },
+  { "ccaron",                            600, NULL },
+  { "Ecircumflex",                       600, NULL },
+  { "gbreve",                            600, NULL },
+  { "trademark",                         600, NULL },
+  { "daggerdbl",                         600, NULL },
+  { "nacute",                            600, NULL },
+  { "macron",                            600, NULL },
+  { "Otilde",                            600, NULL },
+  { "Emacron",                           600, NULL },
+  { "ellipsis",                          600, NULL },
+  { "scaron",                            600, NULL },
+  { "AE",                                600, NULL },
+  { "Ucircumflex",                       600, NULL },
+  { "lslash",                            600, NULL },
+  { "quotedblleft",                      600, NULL },
+  { "guilsinglright",                    600, NULL },
+  { "hyphen",                            600, NULL },
+  { "quotesingle",                       600, NULL },
+  { "eight",                             600, NULL },
+  { "exclamdown",                        600, NULL },
+  { "endash",                            600, NULL },
+  { "oe",                                600, NULL },
+  { "Abreve",                            600, NULL },
+  { "Umacron",                           600, NULL },
+  { "ecircumflex",                       600, NULL },
+  { "Adieresis",                         600, NULL },
+  { "copyright",                         600, NULL },
+  { "Egrave",                            600, NULL },
+  { "slash",                             600, NULL },
+  { "Edieresis",                         600, NULL },
+  { "otilde",                            600, NULL },
+  { "Idieresis",                         600, NULL },
+  { "parenleft",                         600, NULL },
+  { "one",                               600, NULL },
+  { "emacron",                           600, NULL },
+  { "Odieresis",                         600, NULL },
+  { "ucircumflex",                       600, NULL },
+  { "bracketleft",                       600, NULL },
+  { "Ugrave",                            600, NULL },
+  { "quoteright",                        600, NULL },
+  { "Udieresis",                         600, NULL },
+  { "perthousand",                       600, NULL },
+  { "Ydieresis",                         600, NULL },
+  { "umacron",                           600, NULL },
+  { "abreve",                            600, NULL },
+  { "Eacute",                            600, NULL },
+  { "adieresis",                         600, NULL },
+  { "egrave",                            600, NULL },
+  { "edieresis",                         600, NULL },
+  { "idieresis",                         600, NULL },
+  { "Eth",                               600, NULL },
+  { "ae",                                600, NULL },
+  { "asterisk",                          600, NULL },
+  { "odieresis",                         600, NULL },
+  { "Uacute",                            600, NULL },
+  { "ugrave",                            600, NULL },
+  { "nine",                              600, NULL },
+  { "five",                              600, NULL },
+  { "udieresis",                         600, NULL },
+  { "Zcaron",                            600, NULL },
+  { "Scommaaccent",                      600, NULL },
+  { "threequarters",                     600, NULL },
+  { "guillemotright",                    600, NULL },
+  { "Ccedilla",                          600, NULL },
+  { "ydieresis",                         600, NULL },
+  { "tilde",                             600, NULL },
+  { "at",                                600, NULL },
+  { "eacute",                            600, NULL },
+  { "underscore",                        600, NULL },
+  { "Euro",                              600, NULL },
+  { "Dcroat",                            600, NULL },
+  { "multiply",                          600, NULL },
+  { "zero",                              600, NULL },
+  { "eth",                               600, NULL },
+  { "Scedilla",                          600, NULL },
+  { "Ograve",                            600, NULL },
+  { "Racute",                            600, NULL },
+  { "partialdiff",                       600, NULL },
+  { "uacute",                            600, NULL },
+  { "braceleft",                         600, NULL },
+  { "Thorn",                             600, NULL },
+  { "zcaron",                            600, NULL },
+  { "scommaaccent",                      600, NULL },
+  { "ccedilla",                          600, NULL },
+  { "Dcaron",                            600, NULL },
+  { "dcroat",                            600, NULL },
+  { "Ocircumflex",                       600, NULL },
+  { "Oacute",                            600, NULL },
+  { "scedilla",                          600, NULL },
+  { "ogonek",                            600, NULL },
+  { "ograve",                            600, NULL },
+  { "racute",                            600, NULL },
+  { "Tcaron",                            600, NULL },
+  { "Eogonek",                           600, NULL },
+  { "thorn",                             600, NULL },
+  { "degree",                            600, NULL },
+  { "registered",                        600, NULL },
+  { "radical",                           600, NULL },
+  { "Aring",                             600, NULL },
+  { "percent",                           600, NULL },
+  { "six",                               600, NULL },
+  { "paragraph",                         600, NULL },
+  { "dcaron",                            600, NULL },
+  { "Uogonek",                           600, NULL },
+  { "two",                               600, NULL },
+  { "summation",                         600, NULL },
+  { "Igrave",                            600, NULL },
+  { "Lacute",                            600, NULL },
+  { "ocircumflex",                       600, NULL },
+  { "oacute",                            600, NULL },
+  { "Uring",                             600, NULL },
+  { "Lcommaaccent",                      600, NULL },
+  { "tcaron",                            600, NULL },
+  { "eogonek",                           600, NULL },
+  { "Delta",                             600, NULL },
+  { "Ohungarumlaut",                     600, NULL },
+  { "asciicircum",                       600, NULL },
+  { "aring",                             600, NULL },
+  { "grave",                             600, NULL },
+  { "uogonek",                           600, NULL },
+  { "bracketright",                      600, NULL },
+  { "Iacute",                            600, NULL },
+  { "ampersand",                         600, NULL },
+  { "igrave",                            600, NULL },
+  { "lacute",                            600, NULL },
+  { "Ncaron",                            600, NULL },
+  { "plus",                              600, NULL },
+  { "uring",                             600, NULL },
+  { "quotesinglbase",                    600, NULL },
+  { "lcommaaccent",                      600, NULL },
+  { "Yacute",                            600, NULL },
+  { "ohungarumlaut",                     600, NULL },
+  { "threesuperior",                     600, NULL },
+  { "acute",                             600, NULL },
+  { "section",                           600, NULL },
+  { "dieresis",                          600, NULL },
+  { "iacute",                            600, NULL },
+  { "quotedblbase",                      600, NULL },
+  { "ncaron",                            600, NULL },
+  { "florin",                            600, NULL },
+  { "yacute",                            600, NULL },
+  { "Rcommaaccent",                      600, NULL },
+  { "fi",                                600, NULL },
+  { "fl",                                600, NULL },
+  { "Acircumflex",                       600, NULL },
+  { "Cacute",                            600, NULL },
+  { "Icircumflex",                       600, NULL },
+  { "guillemotleft",                     600, NULL },
+  { "germandbls",                        600, NULL },
+  { "Amacron",                           600, NULL },
+  { "seven",                             600, NULL },
+  { "Sacute",                            600, NULL },
+  { "ordmasculine",                      600, NULL },
+  { "dotlessi",                          600, NULL },
+  { "sterling",                          600, NULL },
+  { "notequal",                          600, NULL },
+  { "Imacron",                           600, NULL },
+  { "rcommaaccent",                      600, NULL },
+  { "Zdotaccent",                        600, NULL },
+  { "acircumflex",                       600, NULL },
+  { "cacute",                            600, NULL },
+  { "Ecaron",                            600, NULL },
+  { "icircumflex",                       600, NULL },
+  { "braceright",                        600, NULL },
+  { "quotedblright",                     600, NULL },
+  { "amacron",                           600, NULL },
+  { "sacute",                            600, NULL },
+  { "imacron",                           600, NULL },
+  { "cent",                              600, NULL },
+  { "currency",                          600, NULL },
+  { "logicalnot",                        600, NULL },
+  { "zdotaccent",                        600, NULL },
+  { "Atilde",                            600, NULL },
+  { "breve",                             600, NULL },
+  { "bar",                               600, NULL },
+  { "fraction",                          600, NULL },
+  { "less",                              600, NULL },
+  { "ecaron",                            600, NULL },
+  { "guilsinglleft",                     600, NULL },
+  { "exclam",                            600, NULL },
+  { "period",                            600, NULL },
+  { "Rcaron",                            600, NULL },
+  { "Kcommaaccent",                      600, NULL },
+  { "greater",                           600, NULL },
+  { "atilde",                            600, NULL },
+  { "brokenbar",                         600, NULL },
+  { "quoteleft",                         600, NULL },
+  { "Edotaccent",                        600, NULL },
+  { "onesuperior",                       600, NULL }
+};
+
+static BuiltinFontWidth helveticaWidthsTab[] = {
+  { "Ntilde",                            722, NULL },
+  { "rcaron",                            333, NULL },
+  { "kcommaaccent",                      500, NULL },
+  { "Ncommaaccent",                      722, NULL },
+  { "Zacute",                            611, NULL },
+  { "comma",                             278, NULL },
+  { "cedilla",                           333, NULL },
+  { "plusminus",                         584, NULL },
+  { "circumflex",                        333, NULL },
+  { "dotaccent",                         333, NULL },
+  { "edotaccent",                        556, NULL },
+  { "asciitilde",                        584, NULL },
+  { "colon",                             278, NULL },
+  { "onehalf",                           834, NULL },
+  { "dollar",                            556, NULL },
+  { "Lcaron",                            556, NULL },
+  { "ntilde",                            556, NULL },
+  { "Aogonek",                           667, NULL },
+  { "ncommaaccent",                      556, NULL },
+  { "minus",                             584, NULL },
+  { "Iogonek",                           278, NULL },
+  { "zacute",                            500, NULL },
+  { "yen",                               556, NULL },
+  { "space",                             278, NULL },
+  { "Omacron",                           778, NULL },
+  { "questiondown",                      611, NULL },
+  { "emdash",                           1000, NULL },
+  { "Agrave",                            667, NULL },
+  { "three",                             556, NULL },
+  { "numbersign",                        556, NULL },
+  { "lcaron",                            299, NULL },
+  { "A",                                 667, NULL },
+  { "B",                                 667, NULL },
+  { "C",                                 722, NULL },
+  { "aogonek",                           556, NULL },
+  { "D",                                 722, NULL },
+  { "E",                                 667, NULL },
+  { "onequarter",                        834, NULL },
+  { "F",                                 611, NULL },
+  { "G",                                 778, NULL },
+  { "H",                                 722, NULL },
+  { "I",                                 278, NULL },
+  { "J",                                 500, NULL },
+  { "K",                                 667, NULL },
+  { "iogonek",                           222, NULL },
+  { "backslash",                         278, NULL },
+  { "L",                                 556, NULL },
+  { "periodcentered",                    278, NULL },
+  { "M",                                 833, NULL },
+  { "N",                                 722, NULL },
+  { "omacron",                           556, NULL },
+  { "Tcommaaccent",                      611, NULL },
+  { "O",                                 778, NULL },
+  { "P",                                 667, NULL },
+  { "Q",                                 778, NULL },
+  { "Uhungarumlaut",                     722, NULL },
+  { "R",                                 722, NULL },
+  { "Aacute",                            667, NULL },
+  { "caron",                             333, NULL },
+  { "S",                                 667, NULL },
+  { "T",                                 611, NULL },
+  { "U",                                 722, NULL },
+  { "agrave",                            556, NULL },
+  { "V",                                 667, NULL },
+  { "W",                                 944, NULL },
+  { "X",                                 667, NULL },
+  { "question",                          556, NULL },
+  { "equal",                             584, NULL },
+  { "Y",                                 667, NULL },
+  { "Z",                                 611, NULL },
+  { "four",                              556, NULL },
+  { "a",                                 556, NULL },
+  { "Gcommaaccent",                      778, NULL },
+  { "b",                                 556, NULL },
+  { "c",                                 500, NULL },
+  { "d",                                 556, NULL },
+  { "e",                                 556, NULL },
+  { "f",                                 278, NULL },
+  { "g",                                 556, NULL },
+  { "bullet",                            350, NULL },
+  { "h",                                 556, NULL },
+  { "i",                                 222, NULL },
+  { "Oslash",                            778, NULL },
+  { "dagger",                            556, NULL },
+  { "j",                                 222, NULL },
+  { "k",                                 500, NULL },
+  { "l",                                 222, NULL },
+  { "m",                                 833, NULL },
+  { "n",                                 556, NULL },
+  { "tcommaaccent",                      278, NULL },
+  { "o",                                 556, NULL },
+  { "ordfeminine",                       370, NULL },
+  { "ring",                              333, NULL },
+  { "p",                                 556, NULL },
+  { "q",                                 556, NULL },
+  { "uhungarumlaut",                     556, NULL },
+  { "r",                                 333, NULL },
+  { "twosuperior",                       333, NULL },
+  { "aacute",                            556, NULL },
+  { "s",                                 500, NULL },
+  { "OE",                               1000, NULL },
+  { "t",                                 278, NULL },
+  { "divide",                            584, NULL },
+  { "u",                                 556, NULL },
+  { "Ccaron",                            722, NULL },
+  { "v",                                 500, NULL },
+  { "w",                                 722, NULL },
+  { "x",                                 500, NULL },
+  { "y",                                 500, NULL },
+  { "z",                                 500, NULL },
+  { "Gbreve",                            778, NULL },
+  { "commaaccent",                       250, NULL },
+  { "hungarumlaut",                      333, NULL },
+  { "Idotaccent",                        278, NULL },
+  { "Nacute",                            722, NULL },
+  { "quotedbl",                          355, NULL },
+  { "gcommaaccent",                      556, NULL },
+  { "mu",                                556, NULL },
+  { "greaterequal",                      549, NULL },
+  { "Scaron",                            667, NULL },
+  { "Lslash",                            556, NULL },
+  { "semicolon",                         278, NULL },
+  { "oslash",                            611, NULL },
+  { "lessequal",                         549, NULL },
+  { "lozenge",                           471, NULL },
+  { "parenright",                        333, NULL },
+  { "ccaron",                            500, NULL },
+  { "Ecircumflex",                       667, NULL },
+  { "gbreve",                            556, NULL },
+  { "trademark",                        1000, NULL },
+  { "daggerdbl",                         556, NULL },
+  { "nacute",                            556, NULL },
+  { "macron",                            333, NULL },
+  { "Otilde",                            778, NULL },
+  { "Emacron",                           667, NULL },
+  { "ellipsis",                         1000, NULL },
+  { "scaron",                            500, NULL },
+  { "AE",                               1000, NULL },
+  { "Ucircumflex",                       722, NULL },
+  { "lslash",                            222, NULL },
+  { "quotedblleft",                      333, NULL },
+  { "guilsinglright",                    333, NULL },
+  { "hyphen",                            333, NULL },
+  { "quotesingle",                       191, NULL },
+  { "eight",                             556, NULL },
+  { "exclamdown",                        333, NULL },
+  { "endash",                            556, NULL },
+  { "oe",                                944, NULL },
+  { "Abreve",                            667, NULL },
+  { "Umacron",                           722, NULL },
+  { "ecircumflex",                       556, NULL },
+  { "Adieresis",                         667, NULL },
+  { "copyright",                         737, NULL },
+  { "Egrave",                            667, NULL },
+  { "slash",                             278, NULL },
+  { "Edieresis",                         667, NULL },
+  { "otilde",                            556, NULL },
+  { "Idieresis",                         278, NULL },
+  { "parenleft",                         333, NULL },
+  { "one",                               556, NULL },
+  { "emacron",                           556, NULL },
+  { "Odieresis",                         778, NULL },
+  { "ucircumflex",                       556, NULL },
+  { "bracketleft",                       278, NULL },
+  { "Ugrave",                            722, NULL },
+  { "quoteright",                        222, NULL },
+  { "Udieresis",                         722, NULL },
+  { "perthousand",                      1000, NULL },
+  { "Ydieresis",                         667, NULL },
+  { "umacron",                           556, NULL },
+  { "abreve",                            556, NULL },
+  { "Eacute",                            667, NULL },
+  { "adieresis",                         556, NULL },
+  { "egrave",                            556, NULL },
+  { "edieresis",                         556, NULL },
+  { "idieresis",                         278, NULL },
+  { "Eth",                               722, NULL },
+  { "ae",                                889, NULL },
+  { "asterisk",                          389, NULL },
+  { "odieresis",                         556, NULL },
+  { "Uacute",                            722, NULL },
+  { "ugrave",                            556, NULL },
+  { "nine",                              556, NULL },
+  { "five",                              556, NULL },
+  { "udieresis",                         556, NULL },
+  { "Zcaron",                            611, NULL },
+  { "Scommaaccent",                      667, NULL },
+  { "threequarters",                     834, NULL },
+  { "guillemotright",                    556, NULL },
+  { "Ccedilla",                          722, NULL },
+  { "ydieresis",                         500, NULL },
+  { "tilde",                             333, NULL },
+  { "at",                               1015, NULL },
+  { "eacute",                            556, NULL },
+  { "underscore",                        556, NULL },
+  { "Euro",                              556, NULL },
+  { "Dcroat",                            722, NULL },
+  { "multiply",                          584, NULL },
+  { "zero",                              556, NULL },
+  { "eth",                               556, NULL },
+  { "Scedilla",                          667, NULL },
+  { "Ograve",                            778, NULL },
+  { "Racute",                            722, NULL },
+  { "partialdiff",                       476, NULL },
+  { "uacute",                            556, NULL },
+  { "braceleft",                         334, NULL },
+  { "Thorn",                             667, NULL },
+  { "zcaron",                            500, NULL },
+  { "scommaaccent",                      500, NULL },
+  { "ccedilla",                          500, NULL },
+  { "Dcaron",                            722, NULL },
+  { "dcroat",                            556, NULL },
+  { "Ocircumflex",                       778, NULL },
+  { "Oacute",                            778, NULL },
+  { "scedilla",                          500, NULL },
+  { "ogonek",                            333, NULL },
+  { "ograve",                            556, NULL },
+  { "racute",                            333, NULL },
+  { "Tcaron",                            611, NULL },
+  { "Eogonek",                           667, NULL },
+  { "thorn",                             556, NULL },
+  { "degree",                            400, NULL },
+  { "registered",                        737, NULL },
+  { "radical",                           453, NULL },
+  { "Aring",                             667, NULL },
+  { "percent",                           889, NULL },
+  { "six",                               556, NULL },
+  { "paragraph",                         537, NULL },
+  { "dcaron",                            643, NULL },
+  { "Uogonek",                           722, NULL },
+  { "two",                               556, NULL },
+  { "summation",                         600, NULL },
+  { "Igrave",                            278, NULL },
+  { "Lacute",                            556, NULL },
+  { "ocircumflex",                       556, NULL },
+  { "oacute",                            556, NULL },
+  { "Uring",                             722, NULL },
+  { "Lcommaaccent",                      556, NULL },
+  { "tcaron",                            317, NULL },
+  { "eogonek",                           556, NULL },
+  { "Delta",                             612, NULL },
+  { "Ohungarumlaut",                     778, NULL },
+  { "asciicircum",                       469, NULL },
+  { "aring",                             556, NULL },
+  { "grave",                             333, NULL },
+  { "uogonek",                           556, NULL },
+  { "bracketright",                      278, NULL },
+  { "Iacute",                            278, NULL },
+  { "ampersand",                         667, NULL },
+  { "igrave",                            278, NULL },
+  { "lacute",                            222, NULL },
+  { "Ncaron",                            722, NULL },
+  { "plus",                              584, NULL },
+  { "uring",                             556, NULL },
+  { "quotesinglbase",                    222, NULL },
+  { "lcommaaccent",                      222, NULL },
+  { "Yacute",                            667, NULL },
+  { "ohungarumlaut",                     556, NULL },
+  { "threesuperior",                     333, NULL },
+  { "acute",                             333, NULL },
+  { "section",                           556, NULL },
+  { "dieresis",                          333, NULL },
+  { "iacute",                            278, NULL },
+  { "quotedblbase",                      333, NULL },
+  { "ncaron",                            556, NULL },
+  { "florin",                            556, NULL },
+  { "yacute",                            500, NULL },
+  { "Rcommaaccent",                      722, NULL },
+  { "fi",                                500, NULL },
+  { "fl",                                500, NULL },
+  { "Acircumflex",                       667, NULL },
+  { "Cacute",                            722, NULL },
+  { "Icircumflex",                       278, NULL },
+  { "guillemotleft",                     556, NULL },
+  { "germandbls",                        611, NULL },
+  { "Amacron",                           667, NULL },
+  { "seven",                             556, NULL },
+  { "Sacute",                            667, NULL },
+  { "ordmasculine",                      365, NULL },
+  { "dotlessi",                          278, NULL },
+  { "sterling",                          556, NULL },
+  { "notequal",                          549, NULL },
+  { "Imacron",                           278, NULL },
+  { "rcommaaccent",                      333, NULL },
+  { "Zdotaccent",                        611, NULL },
+  { "acircumflex",                       556, NULL },
+  { "cacute",                            500, NULL },
+  { "Ecaron",                            667, NULL },
+  { "icircumflex",                       278, NULL },
+  { "braceright",                        334, NULL },
+  { "quotedblright",                     333, NULL },
+  { "amacron",                           556, NULL },
+  { "sacute",                            500, NULL },
+  { "imacron",                           278, NULL },
+  { "cent",                              556, NULL },
+  { "currency",                          556, NULL },
+  { "logicalnot",                        584, NULL },
+  { "zdotaccent",                        500, NULL },
+  { "Atilde",                            667, NULL },
+  { "breve",                             333, NULL },
+  { "bar",                               260, NULL },
+  { "fraction",                          167, NULL },
+  { "less",                              584, NULL },
+  { "ecaron",                            556, NULL },
+  { "guilsinglleft",                     333, NULL },
+  { "exclam",                            278, NULL },
+  { "period",                            278, NULL },
+  { "Rcaron",                            722, NULL },
+  { "Kcommaaccent",                      667, NULL },
+  { "greater",                           584, NULL },
+  { "atilde",                            556, NULL },
+  { "brokenbar",                         260, NULL },
+  { "quoteleft",                         222, NULL },
+  { "Edotaccent",                        667, NULL },
+  { "onesuperior",                       333, NULL }
+};
+
+static BuiltinFontWidth helveticaBoldWidthsTab[] = {
+  { "Ntilde",                            722, NULL },
+  { "rcaron",                            389, NULL },
+  { "kcommaaccent",                      556, NULL },
+  { "Ncommaaccent",                      722, NULL },
+  { "Zacute",                            611, NULL },
+  { "comma",                             278, NULL },
+  { "cedilla",                           333, NULL },
+  { "plusminus",                         584, NULL },
+  { "circumflex",                        333, NULL },
+  { "dotaccent",                         333, NULL },
+  { "edotaccent",                        556, NULL },
+  { "asciitilde",                        584, NULL },
+  { "colon",                             333, NULL },
+  { "onehalf",                           834, NULL },
+  { "dollar",                            556, NULL },
+  { "Lcaron",                            611, NULL },
+  { "ntilde",                            611, NULL },
+  { "Aogonek",                           722, NULL },
+  { "ncommaaccent",                      611, NULL },
+  { "minus",                             584, NULL },
+  { "Iogonek",                           278, NULL },
+  { "zacute",                            500, NULL },
+  { "yen",                               556, NULL },
+  { "space",                             278, NULL },
+  { "Omacron",                           778, NULL },
+  { "questiondown",                      611, NULL },
+  { "emdash",                           1000, NULL },
+  { "Agrave",                            722, NULL },
+  { "three",                             556, NULL },
+  { "numbersign",                        556, NULL },
+  { "lcaron",                            400, NULL },
+  { "A",                                 722, NULL },
+  { "B",                                 722, NULL },
+  { "C",                                 722, NULL },
+  { "aogonek",                           556, NULL },
+  { "D",                                 722, NULL },
+  { "E",                                 667, NULL },
+  { "onequarter",                        834, NULL },
+  { "F",                                 611, NULL },
+  { "G",                                 778, NULL },
+  { "H",                                 722, NULL },
+  { "I",                                 278, NULL },
+  { "J",                                 556, NULL },
+  { "K",                                 722, NULL },
+  { "iogonek",                           278, NULL },
+  { "backslash",                         278, NULL },
+  { "L",                                 611, NULL },
+  { "periodcentered",                    278, NULL },
+  { "M",                                 833, NULL },
+  { "N",                                 722, NULL },
+  { "omacron",                           611, NULL },
+  { "Tcommaaccent",                      611, NULL },
+  { "O",                                 778, NULL },
+  { "P",                                 667, NULL },
+  { "Q",                                 778, NULL },
+  { "Uhungarumlaut",                     722, NULL },
+  { "R",                                 722, NULL },
+  { "Aacute",                            722, NULL },
+  { "caron",                             333, NULL },
+  { "S",                                 667, NULL },
+  { "T",                                 611, NULL },
+  { "U",                                 722, NULL },
+  { "agrave",                            556, NULL },
+  { "V",                                 667, NULL },
+  { "W",                                 944, NULL },
+  { "X",                                 667, NULL },
+  { "question",                          611, NULL },
+  { "equal",                             584, NULL },
+  { "Y",                                 667, NULL },
+  { "Z",                                 611, NULL },
+  { "four",                              556, NULL },
+  { "a",                                 556, NULL },
+  { "Gcommaaccent",                      778, NULL },
+  { "b",                                 611, NULL },
+  { "c",                                 556, NULL },
+  { "d",                                 611, NULL },
+  { "e",                                 556, NULL },
+  { "f",                                 333, NULL },
+  { "g",                                 611, NULL },
+  { "bullet",                            350, NULL },
+  { "h",                                 611, NULL },
+  { "i",                                 278, NULL },
+  { "Oslash",                            778, NULL },
+  { "dagger",                            556, NULL },
+  { "j",                                 278, NULL },
+  { "k",                                 556, NULL },
+  { "l",                                 278, NULL },
+  { "m",                                 889, NULL },
+  { "n",                                 611, NULL },
+  { "tcommaaccent",                      333, NULL },
+  { "o",                                 611, NULL },
+  { "ordfeminine",                       370, NULL },
+  { "ring",                              333, NULL },
+  { "p",                                 611, NULL },
+  { "q",                                 611, NULL },
+  { "uhungarumlaut",                     611, NULL },
+  { "r",                                 389, NULL },
+  { "twosuperior",                       333, NULL },
+  { "aacute",                            556, NULL },
+  { "s",                                 556, NULL },
+  { "OE",                               1000, NULL },
+  { "t",                                 333, NULL },
+  { "divide",                            584, NULL },
+  { "u",                                 611, NULL },
+  { "Ccaron",                            722, NULL },
+  { "v",                                 556, NULL },
+  { "w",                                 778, NULL },
+  { "x",                                 556, NULL },
+  { "y",                                 556, NULL },
+  { "z",                                 500, NULL },
+  { "Gbreve",                            778, NULL },
+  { "commaaccent",                       250, NULL },
+  { "hungarumlaut",                      333, NULL },
+  { "Idotaccent",                        278, NULL },
+  { "Nacute",                            722, NULL },
+  { "quotedbl",                          474, NULL },
+  { "gcommaaccent",                      611, NULL },
+  { "mu",                                611, NULL },
+  { "greaterequal",                      549, NULL },
+  { "Scaron",                            667, NULL },
+  { "Lslash",                            611, NULL },
+  { "semicolon",                         333, NULL },
+  { "oslash",                            611, NULL },
+  { "lessequal",                         549, NULL },
+  { "lozenge",                           494, NULL },
+  { "parenright",                        333, NULL },
+  { "ccaron",                            556, NULL },
+  { "Ecircumflex",                       667, NULL },
+  { "gbreve",                            611, NULL },
+  { "trademark",                        1000, NULL },
+  { "daggerdbl",                         556, NULL },
+  { "nacute",                            611, NULL },
+  { "macron",                            333, NULL },
+  { "Otilde",                            778, NULL },
+  { "Emacron",                           667, NULL },
+  { "ellipsis",                         1000, NULL },
+  { "scaron",                            556, NULL },
+  { "AE",                               1000, NULL },
+  { "Ucircumflex",                       722, NULL },
+  { "lslash",                            278, NULL },
+  { "quotedblleft",                      500, NULL },
+  { "guilsinglright",                    333, NULL },
+  { "hyphen",                            333, NULL },
+  { "quotesingle",                       238, NULL },
+  { "eight",                             556, NULL },
+  { "exclamdown",                        333, NULL },
+  { "endash",                            556, NULL },
+  { "oe",                                944, NULL },
+  { "Abreve",                            722, NULL },
+  { "Umacron",                           722, NULL },
+  { "ecircumflex",                       556, NULL },
+  { "Adieresis",                         722, NULL },
+  { "copyright",                         737, NULL },
+  { "Egrave",                            667, NULL },
+  { "slash",                             278, NULL },
+  { "Edieresis",                         667, NULL },
+  { "otilde",                            611, NULL },
+  { "Idieresis",                         278, NULL },
+  { "parenleft",                         333, NULL },
+  { "one",                               556, NULL },
+  { "emacron",                           556, NULL },
+  { "Odieresis",                         778, NULL },
+  { "ucircumflex",                       611, NULL },
+  { "bracketleft",                       333, NULL },
+  { "Ugrave",                            722, NULL },
+  { "quoteright",                        278, NULL },
+  { "Udieresis",                         722, NULL },
+  { "perthousand",                      1000, NULL },
+  { "Ydieresis",                         667, NULL },
+  { "umacron",                           611, NULL },
+  { "abreve",                            556, NULL },
+  { "Eacute",                            667, NULL },
+  { "adieresis",                         556, NULL },
+  { "egrave",                            556, NULL },
+  { "edieresis",                         556, NULL },
+  { "idieresis",                         278, NULL },
+  { "Eth",                               722, NULL },
+  { "ae",                                889, NULL },
+  { "asterisk",                          389, NULL },
+  { "odieresis",                         611, NULL },
+  { "Uacute",                            722, NULL },
+  { "ugrave",                            611, NULL },
+  { "nine",                              556, NULL },
+  { "five",                              556, NULL },
+  { "udieresis",                         611, NULL },
+  { "Zcaron",                            611, NULL },
+  { "Scommaaccent",                      667, NULL },
+  { "threequarters",                     834, NULL },
+  { "guillemotright",                    556, NULL },
+  { "Ccedilla",                          722, NULL },
+  { "ydieresis",                         556, NULL },
+  { "tilde",                             333, NULL },
+  { "dbldaggerumlaut",                   556, NULL },
+  { "at",                                975, NULL },
+  { "eacute",                            556, NULL },
+  { "underscore",                        556, NULL },
+  { "Euro",                              556, NULL },
+  { "Dcroat",                            722, NULL },
+  { "multiply",                          584, NULL },
+  { "zero",                              556, NULL },
+  { "eth",                               611, NULL },
+  { "Scedilla",                          667, NULL },
+  { "Ograve",                            778, NULL },
+  { "Racute",                            722, NULL },
+  { "partialdiff",                       494, NULL },
+  { "uacute",                            611, NULL },
+  { "braceleft",                         389, NULL },
+  { "Thorn",                             667, NULL },
+  { "zcaron",                            500, NULL },
+  { "scommaaccent",                      556, NULL },
+  { "ccedilla",                          556, NULL },
+  { "Dcaron",                            722, NULL },
+  { "dcroat",                            611, NULL },
+  { "Ocircumflex",                       778, NULL },
+  { "Oacute",                            778, NULL },
+  { "scedilla",                          556, NULL },
+  { "ogonek",                            333, NULL },
+  { "ograve",                            611, NULL },
+  { "racute",                            389, NULL },
+  { "Tcaron",                            611, NULL },
+  { "Eogonek",                           667, NULL },
+  { "thorn",                             611, NULL },
+  { "degree",                            400, NULL },
+  { "registered",                        737, NULL },
+  { "radical",                           549, NULL },
+  { "Aring",                             722, NULL },
+  { "percent",                           889, NULL },
+  { "six",                               556, NULL },
+  { "paragraph",                         556, NULL },
+  { "dcaron",                            743, NULL },
+  { "Uogonek",                           722, NULL },
+  { "two",                               556, NULL },
+  { "summation",                         600, NULL },
+  { "Igrave",                            278, NULL },
+  { "Lacute",                            611, NULL },
+  { "ocircumflex",                       611, NULL },
+  { "oacute",                            611, NULL },
+  { "Uring",                             722, NULL },
+  { "Lcommaaccent",                      611, NULL },
+  { "tcaron",                            389, NULL },
+  { "eogonek",                           556, NULL },
+  { "Delta",                             612, NULL },
+  { "Ohungarumlaut",                     778, NULL },
+  { "asciicircum",                       584, NULL },
+  { "aring",                             556, NULL },
+  { "grave",                             333, NULL },
+  { "uogonek",                           611, NULL },
+  { "bracketright",                      333, NULL },
+  { "Iacute",                            278, NULL },
+  { "ampersand",                         722, NULL },
+  { "igrave",                            278, NULL },
+  { "lacute",                            278, NULL },
+  { "Ncaron",                            722, NULL },
+  { "plus",                              584, NULL },
+  { "uring",                             611, NULL },
+  { "quotesinglbase",                    278, NULL },
+  { "lcommaaccent",                      278, NULL },
+  { "Yacute",                            667, NULL },
+  { "ohungarumlaut",                     611, NULL },
+  { "threesuperior",                     333, NULL },
+  { "acute",                             333, NULL },
+  { "section",                           556, NULL },
+  { "dieresis",                          333, NULL },
+  { "iacute",                            278, NULL },
+  { "quotedblbase",                      500, NULL },
+  { "ncaron",                            611, NULL },
+  { "florin",                            556, NULL },
+  { "yacute",                            556, NULL },
+  { "Rcommaaccent",                      722, NULL },
+  { "fi",                                611, NULL },
+  { "fl",                                611, NULL },
+  { "Acircumflex",                       722, NULL },
+  { "Cacute",                            722, NULL },
+  { "Icircumflex",                       278, NULL },
+  { "guillemotleft",                     556, NULL },
+  { "germandbls",                        611, NULL },
+  { "Amacron",                           722, NULL },
+  { "seven",                             556, NULL },
+  { "Sacute",                            667, NULL },
+  { "ordmasculine",                      365, NULL },
+  { "dotlessi",                          278, NULL },
+  { "sterling",                          556, NULL },
+  { "notequal",                          549, NULL },
+  { "Imacron",                           278, NULL },
+  { "rcommaaccent",                      389, NULL },
+  { "Zdotaccent",                        611, NULL },
+  { "acircumflex",                       556, NULL },
+  { "cacute",                            556, NULL },
+  { "Ecaron",                            667, NULL },
+  { "icircumflex",                       278, NULL },
+  { "braceright",                        389, NULL },
+  { "quotedblright",                     500, NULL },
+  { "amacron",                           556, NULL },
+  { "sacute",                            556, NULL },
+  { "imacron",                           278, NULL },
+  { "cent",                              556, NULL },
+  { "currency",                          556, NULL },
+  { "logicalnot",                        584, NULL },
+  { "zdotaccent",                        500, NULL },
+  { "Atilde",                            722, NULL },
+  { "breve",                             333, NULL },
+  { "bar",                               280, NULL },
+  { "fraction",                          167, NULL },
+  { "less",                              584, NULL },
+  { "ecaron",                            556, NULL },
+  { "guilsinglleft",                     333, NULL },
+  { "exclam",                            333, NULL },
+  { "period",                            278, NULL },
+  { "Rcaron",                            722, NULL },
+  { "Kcommaaccent",                      722, NULL },
+  { "greater",                           584, NULL },
+  { "atilde",                            556, NULL },
+  { "brokenbar",                         280, NULL },
+  { "quoteleft",                         278, NULL },
+  { "Edotaccent",                        667, NULL },
+  { "onesuperior",                       333, NULL }
+};
+
+static BuiltinFontWidth helveticaBoldObliqueWidthsTab[] = {
+  { "Ntilde",                            722, NULL },
+  { "rcaron",                            389, NULL },
+  { "kcommaaccent",                      556, NULL },
+  { "Ncommaaccent",                      722, NULL },
+  { "Zacute",                            611, NULL },
+  { "comma",                             278, NULL },
+  { "cedilla",                           333, NULL },
+  { "plusminus",                         584, NULL },
+  { "circumflex",                        333, NULL },
+  { "dotaccent",                         333, NULL },
+  { "edotaccent",                        556, NULL },
+  { "asciitilde",                        584, NULL },
+  { "colon",                             333, NULL },
+  { "onehalf",                           834, NULL },
+  { "dollar",                            556, NULL },
+  { "Lcaron",                            611, NULL },
+  { "ntilde",                            611, NULL },
+  { "Aogonek",                           722, NULL },
+  { "ncommaaccent",                      611, NULL },
+  { "minus",                             584, NULL },
+  { "Iogonek",                           278, NULL },
+  { "zacute",                            500, NULL },
+  { "yen",                               556, NULL },
+  { "space",                             278, NULL },
+  { "Omacron",                           778, NULL },
+  { "questiondown",                      611, NULL },
+  { "emdash",                           1000, NULL },
+  { "Agrave",                            722, NULL },
+  { "three",                             556, NULL },
+  { "numbersign",                        556, NULL },
+  { "lcaron",                            400, NULL },
+  { "A",                                 722, NULL },
+  { "B",                                 722, NULL },
+  { "C",                                 722, NULL },
+  { "aogonek",                           556, NULL },
+  { "D",                                 722, NULL },
+  { "E",                                 667, NULL },
+  { "onequarter",                        834, NULL },
+  { "F",                                 611, NULL },
+  { "G",                                 778, NULL },
+  { "H",                                 722, NULL },
+  { "I",                                 278, NULL },
+  { "J",                                 556, NULL },
+  { "K",                                 722, NULL },
+  { "iogonek",                           278, NULL },
+  { "backslash",                         278, NULL },
+  { "L",                                 611, NULL },
+  { "periodcentered",                    278, NULL },
+  { "M",                                 833, NULL },
+  { "N",                                 722, NULL },
+  { "omacron",                           611, NULL },
+  { "Tcommaaccent",                      611, NULL },
+  { "O",                                 778, NULL },
+  { "P",                                 667, NULL },
+  { "Q",                                 778, NULL },
+  { "Uhungarumlaut",                     722, NULL },
+  { "R",                                 722, NULL },
+  { "Aacute",                            722, NULL },
+  { "caron",                             333, NULL },
+  { "S",                                 667, NULL },
+  { "T",                                 611, NULL },
+  { "U",                                 722, NULL },
+  { "agrave",                            556, NULL },
+  { "V",                                 667, NULL },
+  { "W",                                 944, NULL },
+  { "X",                                 667, NULL },
+  { "question",                          611, NULL },
+  { "equal",                             584, NULL },
+  { "Y",                                 667, NULL },
+  { "Z",                                 611, NULL },
+  { "four",                              556, NULL },
+  { "a",                                 556, NULL },
+  { "Gcommaaccent",                      778, NULL },
+  { "b",                                 611, NULL },
+  { "c",                                 556, NULL },
+  { "d",                                 611, NULL },
+  { "e",                                 556, NULL },
+  { "f",                                 333, NULL },
+  { "g",                                 611, NULL },
+  { "bullet",                            350, NULL },
+  { "h",                                 611, NULL },
+  { "i",                                 278, NULL },
+  { "Oslash",                            778, NULL },
+  { "dagger",                            556, NULL },
+  { "j",                                 278, NULL },
+  { "k",                                 556, NULL },
+  { "l",                                 278, NULL },
+  { "m",                                 889, NULL },
+  { "n",                                 611, NULL },
+  { "tcommaaccent",                      333, NULL },
+  { "o",                                 611, NULL },
+  { "ordfeminine",                       370, NULL },
+  { "ring",                              333, NULL },
+  { "p",                                 611, NULL },
+  { "q",                                 611, NULL },
+  { "uhungarumlaut",                     611, NULL },
+  { "r",                                 389, NULL },
+  { "twosuperior",                       333, NULL },
+  { "aacute",                            556, NULL },
+  { "s",                                 556, NULL },
+  { "OE",                               1000, NULL },
+  { "t",                                 333, NULL },
+  { "divide",                            584, NULL },
+  { "u",                                 611, NULL },
+  { "Ccaron",                            722, NULL },
+  { "v",                                 556, NULL },
+  { "w",                                 778, NULL },
+  { "x",                                 556, NULL },
+  { "y",                                 556, NULL },
+  { "z",                                 500, NULL },
+  { "Gbreve",                            778, NULL },
+  { "commaaccent",                       250, NULL },
+  { "hungarumlaut",                      333, NULL },
+  { "Idotaccent",                        278, NULL },
+  { "Nacute",                            722, NULL },
+  { "quotedbl",                          474, NULL },
+  { "gcommaaccent",                      611, NULL },
+  { "mu",                                611, NULL },
+  { "greaterequal",                      549, NULL },
+  { "Scaron",                            667, NULL },
+  { "Lslash",                            611, NULL },
+  { "semicolon",                         333, NULL },
+  { "oslash",                            611, NULL },
+  { "lessequal",                         549, NULL },
+  { "lozenge",                           494, NULL },
+  { "parenright",                        333, NULL },
+  { "ccaron",                            556, NULL },
+  { "Ecircumflex",                       667, NULL },
+  { "gbreve",                            611, NULL },
+  { "trademark",                        1000, NULL },
+  { "daggerdbl",                         556, NULL },
+  { "nacute",                            611, NULL },
+  { "macron",                            333, NULL },
+  { "Otilde",                            778, NULL },
+  { "Emacron",                           667, NULL },
+  { "ellipsis",                         1000, NULL },
+  { "scaron",                            556, NULL },
+  { "AE",                               1000, NULL },
+  { "Ucircumflex",                       722, NULL },
+  { "lslash",                            278, NULL },
+  { "quotedblleft",                      500, NULL },
+  { "guilsinglright",                    333, NULL },
+  { "hyphen",                            333, NULL },
+  { "quotesingle",                       238, NULL },
+  { "eight",                             556, NULL },
+  { "exclamdown",                        333, NULL },
+  { "endash",                            556, NULL },
+  { "oe",                                944, NULL },
+  { "Abreve",                            722, NULL },
+  { "Umacron",                           722, NULL },
+  { "ecircumflex",                       556, NULL },
+  { "Adieresis",                         722, NULL },
+  { "copyright",                         737, NULL },
+  { "Egrave",                            667, NULL },
+  { "slash",                             278, NULL },
+  { "Edieresis",                         667, NULL },
+  { "otilde",                            611, NULL },
+  { "Idieresis",                         278, NULL },
+  { "parenleft",                         333, NULL },
+  { "one",                               556, NULL },
+  { "emacron",                           556, NULL },
+  { "Odieresis",                         778, NULL },
+  { "ucircumflex",                       611, NULL },
+  { "bracketleft",                       333, NULL },
+  { "Ugrave",                            722, NULL },
+  { "quoteright",                        278, NULL },
+  { "Udieresis",                         722, NULL },
+  { "perthousand",                      1000, NULL },
+  { "Ydieresis",                         667, NULL },
+  { "umacron",                           611, NULL },
+  { "abreve",                            556, NULL },
+  { "Eacute",                            667, NULL },
+  { "adieresis",                         556, NULL },
+  { "egrave",                            556, NULL },
+  { "edieresis",                         556, NULL },
+  { "idieresis",                         278, NULL },
+  { "Eth",                               722, NULL },
+  { "ae",                                889, NULL },
+  { "asterisk",                          389, NULL },
+  { "odieresis",                         611, NULL },
+  { "Uacute",                            722, NULL },
+  { "ugrave",                            611, NULL },
+  { "nine",                              556, NULL },
+  { "five",                              556, NULL },
+  { "udieresis",                         611, NULL },
+  { "Zcaron",                            611, NULL },
+  { "Scommaaccent",                      667, NULL },
+  { "threequarters",                     834, NULL },
+  { "guillemotright",                    556, NULL },
+  { "Ccedilla",                          722, NULL },
+  { "ydieresis",                         556, NULL },
+  { "tilde",                             333, NULL },
+  { "at",                                975, NULL },
+  { "eacute",                            556, NULL },
+  { "underscore",                        556, NULL },
+  { "Euro",                              556, NULL },
+  { "Dcroat",                            722, NULL },
+  { "multiply",                          584, NULL },
+  { "zero",                              556, NULL },
+  { "eth",                               611, NULL },
+  { "Scedilla",                          667, NULL },
+  { "Ograve",                            778, NULL },
+  { "Racute",                            722, NULL },
+  { "partialdiff",                       494, NULL },
+  { "uacute",                            611, NULL },
+  { "braceleft",                         389, NULL },
+  { "Thorn",                             667, NULL },
+  { "zcaron",                            500, NULL },
+  { "scommaaccent",                      556, NULL },
+  { "ccedilla",                          556, NULL },
+  { "Dcaron",                            722, NULL },
+  { "dcroat",                            611, NULL },
+  { "Ocircumflex",                       778, NULL },
+  { "Oacute",                            778, NULL },
+  { "scedilla",                          556, NULL },
+  { "ogonek",                            333, NULL },
+  { "ograve",                            611, NULL },
+  { "racute",                            389, NULL },
+  { "Tcaron",                            611, NULL },
+  { "Eogonek",                           667, NULL },
+  { "thorn",                             611, NULL },
+  { "degree",                            400, NULL },
+  { "registered",                        737, NULL },
+  { "radical",                           549, NULL },
+  { "Aring",                             722, NULL },
+  { "percent",                           889, NULL },
+  { "six",                               556, NULL },
+  { "paragraph",                         556, NULL },
+  { "dcaron",                            743, NULL },
+  { "Uogonek",                           722, NULL },
+  { "two",                               556, NULL },
+  { "summation",                         600, NULL },
+  { "Igrave",                            278, NULL },
+  { "Lacute",                            611, NULL },
+  { "ocircumflex",                       611, NULL },
+  { "oacute",                            611, NULL },
+  { "Uring",                             722, NULL },
+  { "Lcommaaccent",                      611, NULL },
+  { "tcaron",                            389, NULL },
+  { "eogonek",                           556, NULL },
+  { "Delta",                             612, NULL },
+  { "Ohungarumlaut",                     778, NULL },
+  { "asciicircum",                       584, NULL },
+  { "aring",                             556, NULL },
+  { "grave",                             333, NULL },
+  { "uogonek",                           611, NULL },
+  { "bracketright",                      333, NULL },
+  { "Iacute",                            278, NULL },
+  { "ampersand",                         722, NULL },
+  { "igrave",                            278, NULL },
+  { "lacute",                            278, NULL },
+  { "Ncaron",                            722, NULL },
+  { "plus",                              584, NULL },
+  { "uring",                             611, NULL },
+  { "quotesinglbase",                    278, NULL },
+  { "lcommaaccent",                      278, NULL },
+  { "Yacute",                            667, NULL },
+  { "ohungarumlaut",                     611, NULL },
+  { "threesuperior",                     333, NULL },
+  { "acute",                             333, NULL },
+  { "section",                           556, NULL },
+  { "dieresis",                          333, NULL },
+  { "iacute",                            278, NULL },
+  { "quotedblbase",                      500, NULL },
+  { "ncaron",                            611, NULL },
+  { "florin",                            556, NULL },
+  { "yacute",                            556, NULL },
+  { "Rcommaaccent",                      722, NULL },
+  { "fi",                                611, NULL },
+  { "fl",                                611, NULL },
+  { "Acircumflex",                       722, NULL },
+  { "Cacute",                            722, NULL },
+  { "Icircumflex",                       278, NULL },
+  { "guillemotleft",                     556, NULL },
+  { "germandbls",                        611, NULL },
+  { "Amacron",                           722, NULL },
+  { "seven",                             556, NULL },
+  { "Sacute",                            667, NULL },
+  { "ordmasculine",                      365, NULL },
+  { "dotlessi",                          278, NULL },
+  { "sterling",                          556, NULL },
+  { "notequal",                          549, NULL },
+  { "Imacron",                           278, NULL },
+  { "rcommaaccent",                      389, NULL },
+  { "Zdotaccent",                        611, NULL },
+  { "acircumflex",                       556, NULL },
+  { "cacute",                            556, NULL },
+  { "Ecaron",                            667, NULL },
+  { "icircumflex",                       278, NULL },
+  { "braceright",                        389, NULL },
+  { "quotedblright",                     500, NULL },
+  { "amacron",                           556, NULL },
+  { "sacute",                            556, NULL },
+  { "imacron",                           278, NULL },
+  { "cent",                              556, NULL },
+  { "currency",                          556, NULL },
+  { "logicalnot",                        584, NULL },
+  { "zdotaccent",                        500, NULL },
+  { "Atilde",                            722, NULL },
+  { "breve",                             333, NULL },
+  { "bar",                               280, NULL },
+  { "fraction",                          167, NULL },
+  { "less",                              584, NULL },
+  { "ecaron",                            556, NULL },
+  { "guilsinglleft",                     333, NULL },
+  { "exclam",                            333, NULL },
+  { "period",                            278, NULL },
+  { "Rcaron",                            722, NULL },
+  { "Kcommaaccent",                      722, NULL },
+  { "greater",                           584, NULL },
+  { "atilde",                            556, NULL },
+  { "brokenbar",                         280, NULL },
+  { "quoteleft",                         278, NULL },
+  { "Edotaccent",                        667, NULL },
+  { "onesuperior",                       333, NULL }
+};
+
+static BuiltinFontWidth helveticaObliqueWidthsTab[] = {
+  { "Ntilde",                            722, NULL },
+  { "rcaron",                            333, NULL },
+  { "kcommaaccent",                      500, NULL },
+  { "Ncommaaccent",                      722, NULL },
+  { "Zacute",                            611, NULL },
+  { "comma",                             278, NULL },
+  { "cedilla",                           333, NULL },
+  { "plusminus",                         584, NULL },
+  { "circumflex",                        333, NULL },
+  { "dotaccent",                         333, NULL },
+  { "edotaccent",                        556, NULL },
+  { "asciitilde",                        584, NULL },
+  { "colon",                             278, NULL },
+  { "onehalf",                           834, NULL },
+  { "dollar",                            556, NULL },
+  { "Lcaron",                            556, NULL },
+  { "ntilde",                            556, NULL },
+  { "Aogonek",                           667, NULL },
+  { "ncommaaccent",                      556, NULL },
+  { "minus",                             584, NULL },
+  { "Iogonek",                           278, NULL },
+  { "zacute",                            500, NULL },
+  { "yen",                               556, NULL },
+  { "space",                             278, NULL },
+  { "Omacron",                           778, NULL },
+  { "questiondown",                      611, NULL },
+  { "emdash",                           1000, NULL },
+  { "Agrave",                            667, NULL },
+  { "three",                             556, NULL },
+  { "numbersign",                        556, NULL },
+  { "lcaron",                            299, NULL },
+  { "A",                                 667, NULL },
+  { "B",                                 667, NULL },
+  { "C",                                 722, NULL },
+  { "aogonek",                           556, NULL },
+  { "D",                                 722, NULL },
+  { "E",                                 667, NULL },
+  { "onequarter",                        834, NULL },
+  { "F",                                 611, NULL },
+  { "G",                                 778, NULL },
+  { "H",                                 722, NULL },
+  { "I",                                 278, NULL },
+  { "J",                                 500, NULL },
+  { "K",                                 667, NULL },
+  { "iogonek",                           222, NULL },
+  { "backslash",                         278, NULL },
+  { "L",                                 556, NULL },
+  { "periodcentered",                    278, NULL },
+  { "M",                                 833, NULL },
+  { "N",                                 722, NULL },
+  { "omacron",                           556, NULL },
+  { "Tcommaaccent",                      611, NULL },
+  { "O",                                 778, NULL },
+  { "P",                                 667, NULL },
+  { "Q",                                 778, NULL },
+  { "Uhungarumlaut",                     722, NULL },
+  { "R",                                 722, NULL },
+  { "Aacute",                            667, NULL },
+  { "caron",                             333, NULL },
+  { "S",                                 667, NULL },
+  { "T",                                 611, NULL },
+  { "U",                                 722, NULL },
+  { "agrave",                            556, NULL },
+  { "V",                                 667, NULL },
+  { "W",                                 944, NULL },
+  { "X",                                 667, NULL },
+  { "question",                          556, NULL },
+  { "equal",                             584, NULL },
+  { "Y",                                 667, NULL },
+  { "Z",                                 611, NULL },
+  { "four",                              556, NULL },
+  { "a",                                 556, NULL },
+  { "Gcommaaccent",                      778, NULL },
+  { "b",                                 556, NULL },
+  { "c",                                 500, NULL },
+  { "d",                                 556, NULL },
+  { "e",                                 556, NULL },
+  { "f",                                 278, NULL },
+  { "g",                                 556, NULL },
+  { "bullet",                            350, NULL },
+  { "h",                                 556, NULL },
+  { "i",                                 222, NULL },
+  { "Oslash",                            778, NULL },
+  { "dagger",                            556, NULL },
+  { "j",                                 222, NULL },
+  { "k",                                 500, NULL },
+  { "l",                                 222, NULL },
+  { "m",                                 833, NULL },
+  { "n",                                 556, NULL },
+  { "tcommaaccent",                      278, NULL },
+  { "o",                                 556, NULL },
+  { "ordfeminine",                       370, NULL },
+  { "ring",                              333, NULL },
+  { "p",                                 556, NULL },
+  { "q",                                 556, NULL },
+  { "uhungarumlaut",                     556, NULL },
+  { "r",                                 333, NULL },
+  { "twosuperior",                       333, NULL },
+  { "aacute",                            556, NULL },
+  { "s",                                 500, NULL },
+  { "OE",                               1000, NULL },
+  { "t",                                 278, NULL },
+  { "divide",                            584, NULL },
+  { "u",                                 556, NULL },
+  { "Ccaron",                            722, NULL },
+  { "v",                                 500, NULL },
+  { "w",                                 722, NULL },
+  { "x",                                 500, NULL },
+  { "y",                                 500, NULL },
+  { "z",                                 500, NULL },
+  { "Gbreve",                            778, NULL },
+  { "commaaccent",                       250, NULL },
+  { "hungarumlaut",                      333, NULL },
+  { "Idotaccent",                        278, NULL },
+  { "Nacute",                            722, NULL },
+  { "quotedbl",                          355, NULL },
+  { "gcommaaccent",                      556, NULL },
+  { "mu",                                556, NULL },
+  { "greaterequal",                      549, NULL },
+  { "Scaron",                            667, NULL },
+  { "Lslash",                            556, NULL },
+  { "semicolon",                         278, NULL },
+  { "oslash",                            611, NULL },
+  { "lessequal",                         549, NULL },
+  { "lozenge",                           471, NULL },
+  { "parenright",                        333, NULL },
+  { "ccaron",                            500, NULL },
+  { "Ecircumflex",                       667, NULL },
+  { "gbreve",                            556, NULL },
+  { "trademark",                        1000, NULL },
+  { "daggerdbl",                         556, NULL },
+  { "nacute",                            556, NULL },
+  { "macron",                            333, NULL },
+  { "Otilde",                            778, NULL },
+  { "Emacron",                           667, NULL },
+  { "ellipsis",                         1000, NULL },
+  { "scaron",                            500, NULL },
+  { "AE",                               1000, NULL },
+  { "Ucircumflex",                       722, NULL },
+  { "lslash",                            222, NULL },
+  { "quotedblleft",                      333, NULL },
+  { "guilsinglright",                    333, NULL },
+  { "hyphen",                            333, NULL },
+  { "quotesingle",                       191, NULL },
+  { "eight",                             556, NULL },
+  { "exclamdown",                        333, NULL },
+  { "endash",                            556, NULL },
+  { "oe",                                944, NULL },
+  { "Abreve",                            667, NULL },
+  { "Umacron",                           722, NULL },
+  { "ecircumflex",                       556, NULL },
+  { "Adieresis",                         667, NULL },
+  { "copyright",                         737, NULL },
+  { "Egrave",                            667, NULL },
+  { "slash",                             278, NULL },
+  { "Edieresis",                         667, NULL },
+  { "otilde",                            556, NULL },
+  { "Idieresis",                         278, NULL },
+  { "parenleft",                         333, NULL },
+  { "one",                               556, NULL },
+  { "emacron",                           556, NULL },
+  { "Odieresis",                         778, NULL },
+  { "ucircumflex",                       556, NULL },
+  { "bracketleft",                       278, NULL },
+  { "Ugrave",                            722, NULL },
+  { "quoteright",                        222, NULL },
+  { "Udieresis",                         722, NULL },
+  { "perthousand",                      1000, NULL },
+  { "Ydieresis",                         667, NULL },
+  { "umacron",                           556, NULL },
+  { "abreve",                            556, NULL },
+  { "Eacute",                            667, NULL },
+  { "adieresis",                         556, NULL },
+  { "egrave",                            556, NULL },
+  { "edieresis",                         556, NULL },
+  { "idieresis",                         278, NULL },
+  { "Eth",                               722, NULL },
+  { "ae",                                889, NULL },
+  { "asterisk",                          389, NULL },
+  { "odieresis",                         556, NULL },
+  { "Uacute",                            722, NULL },
+  { "ugrave",                            556, NULL },
+  { "nine",                              556, NULL },
+  { "five",                              556, NULL },
+  { "udieresis",                         556, NULL },
+  { "Zcaron",                            611, NULL },
+  { "Scommaaccent",                      667, NULL },
+  { "threequarters",                     834, NULL },
+  { "guillemotright",                    556, NULL },
+  { "Ccedilla",                          722, NULL },
+  { "ydieresis",                         500, NULL },
+  { "tilde",                             333, NULL },
+  { "at",                               1015, NULL },
+  { "eacute",                            556, NULL },
+  { "underscore",                        556, NULL },
+  { "Euro",                              556, NULL },
+  { "Dcroat",                            722, NULL },
+  { "multiply",                          584, NULL },
+  { "zero",                              556, NULL },
+  { "eth",                               556, NULL },
+  { "Scedilla",                          667, NULL },
+  { "Ograve",                            778, NULL },
+  { "Racute",                            722, NULL },
+  { "partialdiff",                       476, NULL },
+  { "uacute",                            556, NULL },
+  { "braceleft",                         334, NULL },
+  { "Thorn",                             667, NULL },
+  { "zcaron",                            500, NULL },
+  { "scommaaccent",                      500, NULL },
+  { "ccedilla",                          500, NULL },
+  { "Dcaron",                            722, NULL },
+  { "dcroat",                            556, NULL },
+  { "Ocircumflex",                       778, NULL },
+  { "Oacute",                            778, NULL },
+  { "scedilla",                          500, NULL },
+  { "ogonek",                            333, NULL },
+  { "ograve",                            556, NULL },
+  { "racute",                            333, NULL },
+  { "Tcaron",                            611, NULL },
+  { "Eogonek",                           667, NULL },
+  { "thorn",                             556, NULL },
+  { "degree",                            400, NULL },
+  { "registered",                        737, NULL },
+  { "radical",                           453, NULL },
+  { "Aring",                             667, NULL },
+  { "percent",                           889, NULL },
+  { "six",                               556, NULL },
+  { "paragraph",                         537, NULL },
+  { "dcaron",                            643, NULL },
+  { "Uogonek",                           722, NULL },
+  { "two",                               556, NULL },
+  { "summation",                         600, NULL },
+  { "Igrave",                            278, NULL },
+  { "Lacute",                            556, NULL },
+  { "ocircumflex",                       556, NULL },
+  { "oacute",                            556, NULL },
+  { "Uring",                             722, NULL },
+  { "Lcommaaccent",                      556, NULL },
+  { "tcaron",                            317, NULL },
+  { "eogonek",                           556, NULL },
+  { "Delta",                             612, NULL },
+  { "Ohungarumlaut",                     778, NULL },
+  { "asciicircum",                       469, NULL },
+  { "aring",                             556, NULL },
+  { "grave",                             333, NULL },
+  { "uogonek",                           556, NULL },
+  { "bracketright",                      278, NULL },
+  { "Iacute",                            278, NULL },
+  { "ampersand",                         667, NULL },
+  { "igrave",                            278, NULL },
+  { "lacute",                            222, NULL },
+  { "Ncaron",                            722, NULL },
+  { "plus",                              584, NULL },
+  { "uring",                             556, NULL },
+  { "quotesinglbase",                    222, NULL },
+  { "lcommaaccent",                      222, NULL },
+  { "Yacute",                            667, NULL },
+  { "ohungarumlaut",                     556, NULL },
+  { "threesuperior",                     333, NULL },
+  { "acute",                             333, NULL },
+  { "section",                           556, NULL },
+  { "dieresis",                          333, NULL },
+  { "iacute",                            278, NULL },
+  { "quotedblbase",                      333, NULL },
+  { "ncaron",                            556, NULL },
+  { "florin",                            556, NULL },
+  { "yacute",                            500, NULL },
+  { "Rcommaaccent",                      722, NULL },
+  { "fi",                                500, NULL },
+  { "fl",                                500, NULL },
+  { "Acircumflex",                       667, NULL },
+  { "Cacute",                            722, NULL },
+  { "Icircumflex",                       278, NULL },
+  { "guillemotleft",                     556, NULL },
+  { "germandbls",                        611, NULL },
+  { "Amacron",                           667, NULL },
+  { "seven",                             556, NULL },
+  { "Sacute",                            667, NULL },
+  { "ordmasculine",                      365, NULL },
+  { "dotlessi",                          278, NULL },
+  { "sterling",                          556, NULL },
+  { "notequal",                          549, NULL },
+  { "Imacron",                           278, NULL },
+  { "rcommaaccent",                      333, NULL },
+  { "Zdotaccent",                        611, NULL },
+  { "acircumflex",                       556, NULL },
+  { "cacute",                            500, NULL },
+  { "Ecaron",                            667, NULL },
+  { "icircumflex",                       278, NULL },
+  { "braceright",                        334, NULL },
+  { "quotedblright",                     333, NULL },
+  { "amacron",                           556, NULL },
+  { "sacute",                            500, NULL },
+  { "imacron",                           278, NULL },
+  { "cent",                              556, NULL },
+  { "currency",                          556, NULL },
+  { "logicalnot",                        584, NULL },
+  { "zdotaccent",                        500, NULL },
+  { "Atilde",                            667, NULL },
+  { "breve",                             333, NULL },
+  { "bar",                               260, NULL },
+  { "fraction",                          167, NULL },
+  { "less",                              584, NULL },
+  { "ecaron",                            556, NULL },
+  { "guilsinglleft",                     333, NULL },
+  { "exclam",                            278, NULL },
+  { "period",                            278, NULL },
+  { "Rcaron",                            722, NULL },
+  { "Kcommaaccent",                      667, NULL },
+  { "greater",                           584, NULL },
+  { "atilde",                            556, NULL },
+  { "brokenbar",                         260, NULL },
+  { "quoteleft",                         222, NULL },
+  { "Edotaccent",                        667, NULL },
+  { "onesuperior",                       333, NULL }
+};
+
+static BuiltinFontWidth symbolWidthsTab[] = {
+  { "bracketleftex",                     384, NULL },
+  { "alpha",                             631, NULL },
+  { "union",                             768, NULL },
+  { "infinity",                          713, NULL },
+  { "comma",                             250, NULL },
+  { "copyrightsans",                     790, NULL },
+  { "plusminus",                         549, NULL },
+  { "arrowup",                           603, NULL },
+  { "apple",                             790, NULL },
+  { "parenleftbt",                       384, NULL },
+  { "notelement",                        713, NULL },
+  { "colon",                             278, NULL },
+  { "beta",                              549, NULL },
+  { "braceleftbt",                       494, NULL },
+  { "Lambda",                            686, NULL },
+  { "Phi",                               763, NULL },
+  { "minus",                             549, NULL },
+  { "space",                             250, NULL },
+  { "Sigma",                             592, NULL },
+  { "approxequal",                       549, NULL },
+  { "minute",                            247, NULL },
+  { "circleplus",                        768, NULL },
+  { "Omicron",                           722, NULL },
+  { "three",                             500, NULL },
+  { "numbersign",                        500, NULL },
+  { "lambda",                            549, NULL },
+  { "phi",                               521, NULL },
+  { "aleph",                             823, NULL },
+  { "Tau",                               611, NULL },
+  { "spade",                             753, NULL },
+  { "logicaland",                        603, NULL },
+  { "sigma",                             603, NULL },
+  { "propersuperset",                    713, NULL },
+  { "omicron",                           549, NULL },
+  { "question",                          444, NULL },
+  { "equal",                             549, NULL },
+  { "Epsilon",                           611, NULL },
+  { "emptyset",                          823, NULL },
+  { "diamond",                           753, NULL },
+  { "four",                              500, NULL },
+  { "Mu",                                889, NULL },
+  { "parenlefttp",                       384, NULL },
+  { "club",                              753, NULL },
+  { "bullet",                            460, NULL },
+  { "Omega",                             768, NULL },
+  { "tau",                               439, NULL },
+  { "Upsilon",                           690, NULL },
+  { "bracelefttp",                       494, NULL },
+  { "heart",                             753, NULL },
+  { "divide",                            549, NULL },
+  { "epsilon",                           439, NULL },
+  { "logicalor",                         603, NULL },
+  { "parenleftex",                       384, NULL },
+  { "greaterequal",                      549, NULL },
+  { "mu",                                576, NULL },
+  { "Nu",                                722, NULL },
+  { "therefore",                         863, NULL },
+  { "notsubset",                         713, NULL },
+  { "omega",                             686, NULL },
+  { "semicolon",                         278, NULL },
+  { "element",                           713, NULL },
+  { "upsilon",                           576, NULL },
+  { "existential",                       549, NULL },
+  { "integralbt",                        686, NULL },
+  { "lessequal",                         549, NULL },
+  { "phi1",                              603, NULL },
+  { "lozenge",                           494, NULL },
+  { "trademarkserif",                    890, NULL },
+  { "parenright",                        333, NULL },
+  { "reflexsuperset",                    713, NULL },
+  { "sigma1",                            439, NULL },
+  { "nu",                                521, NULL },
+  { "Gamma",                             603, NULL },
+  { "angleright",                        329, NULL },
+  { "ellipsis",                         1000, NULL },
+  { "Rho",                               556, NULL },
+  { "parenrightbt",                      384, NULL },
+  { "radicalex",                         500, NULL },
+  { "eight",                             500, NULL },
+  { "angleleft",                         329, NULL },
+  { "arrowdbldown",                      603, NULL },
+  { "congruent",                         549, NULL },
+  { "Theta",                             741, NULL },
+  { "intersection",                      768, NULL },
+  { "Pi",                                768, NULL },
+  { "slash",                             278, NULL },
+  { "registerserif",                     790, NULL },
+  { "parenleft",                         333, NULL },
+  { "one",                               500, NULL },
+  { "gamma",                             411, NULL },
+  { "bracketleft",                       333, NULL },
+  { "rho",                               549, NULL },
+  { "circlemultiply",                    768, NULL },
+  { "Chi",                               722, NULL },
+  { "theta",                             521, NULL },
+  { "pi",                                549, NULL },
+  { "integraltp",                        686, NULL },
+  { "Eta",                               722, NULL },
+  { "product",                           823, NULL },
+  { "nine",                              500, NULL },
+  { "five",                              500, NULL },
+  { "propersubset",                      713, NULL },
+  { "bracketrightbt",                    384, NULL },
+  { "trademarksans",                     786, NULL },
+  { "dotmath",                           250, NULL },
+  { "integralex",                        686, NULL },
+  { "chi",                               549, NULL },
+  { "parenrighttp",                      384, NULL },
+  { "eta",                               603, NULL },
+  { "underscore",                        500, NULL },
+  { "Euro",                              750, NULL },
+  { "multiply",                          549, NULL },
+  { "zero",                              500, NULL },
+  { "partialdiff",                       494, NULL },
+  { "angle",                             768, NULL },
+  { "arrowdblleft",                      987, NULL },
+  { "braceleft",                         480, NULL },
+  { "parenrightex",                      384, NULL },
+  { "Rfraktur",                          795, NULL },
+  { "Zeta",                              611, NULL },
+  { "braceex",                           494, NULL },
+  { "arrowdblup",                        603, NULL },
+  { "arrowdown",                         603, NULL },
+  { "Ifraktur",                          686, NULL },
+  { "degree",                            400, NULL },
+  { "Iota",                              333, NULL },
+  { "perpendicular",                     658, NULL },
+  { "radical",                           549, NULL },
+  { "asteriskmath",                      500, NULL },
+  { "percent",                           833, NULL },
+  { "zeta",                              494, NULL },
+  { "six",                               500, NULL },
+  { "two",                               500, NULL },
+  { "weierstrass",                       987, NULL },
+  { "summation",                         713, NULL },
+  { "bracketrighttp",                    384, NULL },
+  { "carriagereturn",                    658, NULL },
+  { "suchthat",                          439, NULL },
+  { "arrowvertex",                       603, NULL },
+  { "Delta",                             612, NULL },
+  { "iota",                              329, NULL },
+  { "arrowhorizex",                     1000, NULL },
+  { "bracketrightex",                    384, NULL },
+  { "bracketright",                      333, NULL },
+  { "ampersand",                         778, NULL },
+  { "plus",                              549, NULL },
+  { "proportional",                      713, NULL },
+  { "delta",                             494, NULL },
+  { "copyrightserif",                    790, NULL },
+  { "bracerightmid",                     494, NULL },
+  { "arrowleft",                         987, NULL },
+  { "second",                            411, NULL },
+  { "arrowdblboth",                     1042, NULL },
+  { "florin",                            500, NULL },
+  { "Psi",                               795, NULL },
+  { "bracerightbt",                      494, NULL },
+  { "bracketleftbt",                     384, NULL },
+  { "seven",                             500, NULL },
+  { "braceleftmid",                      494, NULL },
+  { "notequal",                          549, NULL },
+  { "psi",                               686, NULL },
+  { "equivalence",                       549, NULL },
+  { "universal",                         713, NULL },
+  { "arrowdblright",                     987, NULL },
+  { "braceright",                        480, NULL },
+  { "reflexsubset",                      713, NULL },
+  { "Xi",                                645, NULL },
+  { "theta1",                            631, NULL },
+  { "logicalnot",                        713, NULL },
+  { "Kappa",                             722, NULL },
+  { "similar",                           549, NULL },
+  { "bar",                               200, NULL },
+  { "fraction",                          167, NULL },
+  { "less",                              549, NULL },
+  { "registersans",                      790, NULL },
+  { "omega1",                            713, NULL },
+  { "exclam",                            333, NULL },
+  { "Upsilon1",                          620, NULL },
+  { "bracerighttp",                      494, NULL },
+  { "xi",                                493, NULL },
+  { "period",                            250, NULL },
+  { "Alpha",                             722, NULL },
+  { "arrowright",                        987, NULL },
+  { "greater",                           549, NULL },
+  { "bracketlefttp",                     384, NULL },
+  { "kappa",                             549, NULL },
+  { "gradient",                          713, NULL },
+  { "integral",                          274, NULL },
+  { "arrowboth",                        1042, NULL },
+  { "Beta",                              667, NULL }
+};
+
+static BuiltinFontWidth timesBoldWidthsTab[] = {
+  { "Ntilde",                            722, NULL },
+  { "rcaron",                            444, NULL },
+  { "kcommaaccent",                      556, NULL },
+  { "Ncommaaccent",                      722, NULL },
+  { "Zacute",                            667, NULL },
+  { "comma",                             250, NULL },
+  { "cedilla",                           333, NULL },
+  { "plusminus",                         570, NULL },
+  { "circumflex",                        333, NULL },
+  { "dotaccent",                         333, NULL },
+  { "edotaccent",                        444, NULL },
+  { "asciitilde",                        520, NULL },
+  { "colon",                             333, NULL },
+  { "onehalf",                           750, NULL },
+  { "dollar",                            500, NULL },
+  { "Lcaron",                            667, NULL },
+  { "ntilde",                            556, NULL },
+  { "Aogonek",                           722, NULL },
+  { "ncommaaccent",                      556, NULL },
+  { "minus",                             570, NULL },
+  { "Iogonek",                           389, NULL },
+  { "zacute",                            444, NULL },
+  { "yen",                               500, NULL },
+  { "space",                             250, NULL },
+  { "Omacron",                           778, NULL },
+  { "questiondown",                      500, NULL },
+  { "emdash",                           1000, NULL },
+  { "Agrave",                            722, NULL },
+  { "three",                             500, NULL },
+  { "numbersign",                        500, NULL },
+  { "lcaron",                            394, NULL },
+  { "A",                                 722, NULL },
+  { "B",                                 667, NULL },
+  { "C",                                 722, NULL },
+  { "aogonek",                           500, NULL },
+  { "D",                                 722, NULL },
+  { "E",                                 667, NULL },
+  { "onequarter",                        750, NULL },
+  { "F",                                 611, NULL },
+  { "G",                                 778, NULL },
+  { "H",                                 778, NULL },
+  { "I",                                 389, NULL },
+  { "J",                                 500, NULL },
+  { "K",                                 778, NULL },
+  { "iogonek",                           278, NULL },
+  { "backslash",                         278, NULL },
+  { "L",                                 667, NULL },
+  { "periodcentered",                    250, NULL },
+  { "M",                                 944, NULL },
+  { "N",                                 722, NULL },
+  { "omacron",                           500, NULL },
+  { "Tcommaaccent",                      667, NULL },
+  { "O",                                 778, NULL },
+  { "P",                                 611, NULL },
+  { "Q",                                 778, NULL },
+  { "Uhungarumlaut",                     722, NULL },
+  { "R",                                 722, NULL },
+  { "Aacute",                            722, NULL },
+  { "caron",                             333, NULL },
+  { "S",                                 556, NULL },
+  { "T",                                 667, NULL },
+  { "U",                                 722, NULL },
+  { "agrave",                            500, NULL },
+  { "V",                                 722, NULL },
+  { "W",                                1000, NULL },
+  { "X",                                 722, NULL },
+  { "question",                          500, NULL },
+  { "equal",                             570, NULL },
+  { "Y",                                 722, NULL },
+  { "Z",                                 667, NULL },
+  { "four",                              500, NULL },
+  { "a",                                 500, NULL },
+  { "Gcommaaccent",                      778, NULL },
+  { "b",                                 556, NULL },
+  { "c",                                 444, NULL },
+  { "d",                                 556, NULL },
+  { "e",                                 444, NULL },
+  { "f",                                 333, NULL },
+  { "g",                                 500, NULL },
+  { "bullet",                            350, NULL },
+  { "h",                                 556, NULL },
+  { "i",                                 278, NULL },
+  { "Oslash",                            778, NULL },
+  { "dagger",                            500, NULL },
+  { "j",                                 333, NULL },
+  { "k",                                 556, NULL },
+  { "l",                                 278, NULL },
+  { "m",                                 833, NULL },
+  { "n",                                 556, NULL },
+  { "tcommaaccent",                      333, NULL },
+  { "o",                                 500, NULL },
+  { "ordfeminine",                       300, NULL },
+  { "ring",                              333, NULL },
+  { "p",                                 556, NULL },
+  { "q",                                 556, NULL },
+  { "uhungarumlaut",                     556, NULL },
+  { "r",                                 444, NULL },
+  { "twosuperior",                       300, NULL },
+  { "aacute",                            500, NULL },
+  { "s",                                 389, NULL },
+  { "OE",                               1000, NULL },
+  { "t",                                 333, NULL },
+  { "divide",                            570, NULL },
+  { "u",                                 556, NULL },
+  { "Ccaron",                            722, NULL },
+  { "v",                                 500, NULL },
+  { "w",                                 722, NULL },
+  { "x",                                 500, NULL },
+  { "y",                                 500, NULL },
+  { "z",                                 444, NULL },
+  { "Gbreve",                            778, NULL },
+  { "commaaccent",                       250, NULL },
+  { "hungarumlaut",                      333, NULL },
+  { "Idotaccent",                        389, NULL },
+  { "Nacute",                            722, NULL },
+  { "quotedbl",                          555, NULL },
+  { "gcommaaccent",                      500, NULL },
+  { "mu",                                556, NULL },
+  { "greaterequal",                      549, NULL },
+  { "Scaron",                            556, NULL },
+  { "Lslash",                            667, NULL },
+  { "semicolon",                         333, NULL },
+  { "oslash",                            500, NULL },
+  { "lessequal",                         549, NULL },
+  { "lozenge",                           494, NULL },
+  { "parenright",                        333, NULL },
+  { "ccaron",                            444, NULL },
+  { "Ecircumflex",                       667, NULL },
+  { "gbreve",                            500, NULL },
+  { "trademark",                        1000, NULL },
+  { "daggerdbl",                         500, NULL },
+  { "nacute",                            556, NULL },
+  { "macron",                            333, NULL },
+  { "Otilde",                            778, NULL },
+  { "Emacron",                           667, NULL },
+  { "ellipsis",                         1000, NULL },
+  { "scaron",                            389, NULL },
+  { "AE",                               1000, NULL },
+  { "Ucircumflex",                       722, NULL },
+  { "lslash",                            278, NULL },
+  { "quotedblleft",                      500, NULL },
+  { "guilsinglright",                    333, NULL },
+  { "hyphen",                            333, NULL },
+  { "quotesingle",                       278, NULL },
+  { "eight",                             500, NULL },
+  { "exclamdown",                        333, NULL },
+  { "endash",                            500, NULL },
+  { "oe",                                722, NULL },
+  { "Abreve",                            722, NULL },
+  { "Umacron",                           722, NULL },
+  { "ecircumflex",                       444, NULL },
+  { "Adieresis",                         722, NULL },
+  { "copyright",                         747, NULL },
+  { "Egrave",                            667, NULL },
+  { "slash",                             278, NULL },
+  { "Edieresis",                         667, NULL },
+  { "otilde",                            500, NULL },
+  { "Idieresis",                         389, NULL },
+  { "parenleft",                         333, NULL },
+  { "one",                               500, NULL },
+  { "emacron",                           444, NULL },
+  { "Odieresis",                         778, NULL },
+  { "ucircumflex",                       556, NULL },
+  { "bracketleft",                       333, NULL },
+  { "Ugrave",                            722, NULL },
+  { "quoteright",                        333, NULL },
+  { "Udieresis",                         722, NULL },
+  { "perthousand",                      1000, NULL },
+  { "Ydieresis",                         722, NULL },
+  { "umacron",                           556, NULL },
+  { "abreve",                            500, NULL },
+  { "Eacute",                            667, NULL },
+  { "adieresis",                         500, NULL },
+  { "egrave",                            444, NULL },
+  { "edieresis",                         444, NULL },
+  { "idieresis",                         278, NULL },
+  { "Eth",                               722, NULL },
+  { "ae",                                722, NULL },
+  { "asterisk",                          500, NULL },
+  { "odieresis",                         500, NULL },
+  { "Uacute",                            722, NULL },
+  { "ugrave",                            556, NULL },
+  { "nine",                              500, NULL },
+  { "five",                              500, NULL },
+  { "udieresis",                         556, NULL },
+  { "Zcaron",                            667, NULL },
+  { "Scommaaccent",                      556, NULL },
+  { "threequarters",                     750, NULL },
+  { "guillemotright",                    500, NULL },
+  { "Ccedilla",                          722, NULL },
+  { "ydieresis",                         500, NULL },
+  { "tilde",                             333, NULL },
+  { "at",                                930, NULL },
+  { "eacute",                            444, NULL },
+  { "underscore",                        500, NULL },
+  { "Euro",                              500, NULL },
+  { "Dcroat",                            722, NULL },
+  { "multiply",                          570, NULL },
+  { "zero",                              500, NULL },
+  { "eth",                               500, NULL },
+  { "Scedilla",                          556, NULL },
+  { "Ograve",                            778, NULL },
+  { "Racute",                            722, NULL },
+  { "partialdiff",                       494, NULL },
+  { "uacute",                            556, NULL },
+  { "braceleft",                         394, NULL },
+  { "Thorn",                             611, NULL },
+  { "zcaron",                            444, NULL },
+  { "scommaaccent",                      389, NULL },
+  { "ccedilla",                          444, NULL },
+  { "Dcaron",                            722, NULL },
+  { "dcroat",                            556, NULL },
+  { "Ocircumflex",                       778, NULL },
+  { "Oacute",                            778, NULL },
+  { "scedilla",                          389, NULL },
+  { "ogonek",                            333, NULL },
+  { "ograve",                            500, NULL },
+  { "racute",                            444, NULL },
+  { "Tcaron",                            667, NULL },
+  { "Eogonek",                           667, NULL },
+  { "thorn",                             556, NULL },
+  { "degree",                            400, NULL },
+  { "registered",                        747, NULL },
+  { "radical",                           549, NULL },
+  { "Aring",                             722, NULL },
+  { "percent",                          1000, NULL },
+  { "six",                               500, NULL },
+  { "paragraph",                         540, NULL },
+  { "dcaron",                            672, NULL },
+  { "Uogonek",                           722, NULL },
+  { "two",                               500, NULL },
+  { "summation",                         600, NULL },
+  { "Igrave",                            389, NULL },
+  { "Lacute",                            667, NULL },
+  { "ocircumflex",                       500, NULL },
+  { "oacute",                            500, NULL },
+  { "Uring",                             722, NULL },
+  { "Lcommaaccent",                      667, NULL },
+  { "tcaron",                            416, NULL },
+  { "eogonek",                           444, NULL },
+  { "Delta",                             612, NULL },
+  { "Ohungarumlaut",                     778, NULL },
+  { "asciicircum",                       581, NULL },
+  { "aring",                             500, NULL },
+  { "grave",                             333, NULL },
+  { "uogonek",                           556, NULL },
+  { "bracketright",                      333, NULL },
+  { "Iacute",                            389, NULL },
+  { "ampersand",                         833, NULL },
+  { "igrave",                            278, NULL },
+  { "lacute",                            278, NULL },
+  { "Ncaron",                            722, NULL },
+  { "plus",                              570, NULL },
+  { "uring",                             556, NULL },
+  { "quotesinglbase",                    333, NULL },
+  { "lcommaaccent",                      278, NULL },
+  { "Yacute",                            722, NULL },
+  { "ohungarumlaut",                     500, NULL },
+  { "threesuperior",                     300, NULL },
+  { "acute",                             333, NULL },
+  { "section",                           500, NULL },
+  { "dieresis",                          333, NULL },
+  { "iacute",                            278, NULL },
+  { "quotedblbase",                      500, NULL },
+  { "ncaron",                            556, NULL },
+  { "florin",                            500, NULL },
+  { "yacute",                            500, NULL },
+  { "Rcommaaccent",                      722, NULL },
+  { "fi",                                556, NULL },
+  { "fl",                                556, NULL },
+  { "Acircumflex",                       722, NULL },
+  { "Cacute",                            722, NULL },
+  { "Icircumflex",                       389, NULL },
+  { "guillemotleft",                     500, NULL },
+  { "germandbls",                        556, NULL },
+  { "Amacron",                           722, NULL },
+  { "seven",                             500, NULL },
+  { "Sacute",                            556, NULL },
+  { "ordmasculine",                      330, NULL },
+  { "dotlessi",                          278, NULL },
+  { "sterling",                          500, NULL },
+  { "notequal",                          549, NULL },
+  { "Imacron",                           389, NULL },
+  { "rcommaaccent",                      444, NULL },
+  { "Zdotaccent",                        667, NULL },
+  { "acircumflex",                       500, NULL },
+  { "cacute",                            444, NULL },
+  { "Ecaron",                            667, NULL },
+  { "icircumflex",                       278, NULL },
+  { "braceright",                        394, NULL },
+  { "quotedblright",                     500, NULL },
+  { "amacron",                           500, NULL },
+  { "sacute",                            389, NULL },
+  { "imacron",                           278, NULL },
+  { "cent",                              500, NULL },
+  { "currency",                          500, NULL },
+  { "logicalnot",                        570, NULL },
+  { "zdotaccent",                        444, NULL },
+  { "Atilde",                            722, NULL },
+  { "breve",                             333, NULL },
+  { "bar",                               220, NULL },
+  { "fraction",                          167, NULL },
+  { "less",                              570, NULL },
+  { "ecaron",                            444, NULL },
+  { "guilsinglleft",                     333, NULL },
+  { "exclam",                            333, NULL },
+  { "period",                            250, NULL },
+  { "Rcaron",                            722, NULL },
+  { "Kcommaaccent",                      778, NULL },
+  { "greater",                           570, NULL },
+  { "atilde",                            500, NULL },
+  { "brokenbar",                         220, NULL },
+  { "quoteleft",                         333, NULL },
+  { "Edotaccent",                        667, NULL },
+  { "onesuperior",                       300, NULL }
+};
+
+static BuiltinFontWidth timesBoldItalicWidthsTab[] = {
+  { "Ntilde",                            722, NULL },
+  { "rcaron",                            389, NULL },
+  { "kcommaaccent",                      500, NULL },
+  { "Ncommaaccent",                      722, NULL },
+  { "Zacute",                            611, NULL },
+  { "comma",                             250, NULL },
+  { "cedilla",                           333, NULL },
+  { "plusminus",                         570, NULL },
+  { "circumflex",                        333, NULL },
+  { "dotaccent",                         333, NULL },
+  { "edotaccent",                        444, NULL },
+  { "asciitilde",                        570, NULL },
+  { "colon",                             333, NULL },
+  { "onehalf",                           750, NULL },
+  { "dollar",                            500, NULL },
+  { "Lcaron",                            611, NULL },
+  { "ntilde",                            556, NULL },
+  { "Aogonek",                           667, NULL },
+  { "ncommaaccent",                      556, NULL },
+  { "minus",                             606, NULL },
+  { "Iogonek",                           389, NULL },
+  { "zacute",                            389, NULL },
+  { "yen",                               500, NULL },
+  { "space",                             250, NULL },
+  { "Omacron",                           722, NULL },
+  { "questiondown",                      500, NULL },
+  { "emdash",                           1000, NULL },
+  { "Agrave",                            667, NULL },
+  { "three",                             500, NULL },
+  { "numbersign",                        500, NULL },
+  { "lcaron",                            382, NULL },
+  { "A",                                 667, NULL },
+  { "B",                                 667, NULL },
+  { "C",                                 667, NULL },
+  { "aogonek",                           500, NULL },
+  { "D",                                 722, NULL },
+  { "E",                                 667, NULL },
+  { "onequarter",                        750, NULL },
+  { "F",                                 667, NULL },
+  { "G",                                 722, NULL },
+  { "H",                                 778, NULL },
+  { "I",                                 389, NULL },
+  { "J",                                 500, NULL },
+  { "K",                                 667, NULL },
+  { "iogonek",                           278, NULL },
+  { "backslash",                         278, NULL },
+  { "L",                                 611, NULL },
+  { "periodcentered",                    250, NULL },
+  { "M",                                 889, NULL },
+  { "N",                                 722, NULL },
+  { "omacron",                           500, NULL },
+  { "Tcommaaccent",                      611, NULL },
+  { "O",                                 722, NULL },
+  { "P",                                 611, NULL },
+  { "Q",                                 722, NULL },
+  { "Uhungarumlaut",                     722, NULL },
+  { "R",                                 667, NULL },
+  { "Aacute",                            667, NULL },
+  { "caron",                             333, NULL },
+  { "S",                                 556, NULL },
+  { "T",                                 611, NULL },
+  { "U",                                 722, NULL },
+  { "agrave",                            500, NULL },
+  { "V",                                 667, NULL },
+  { "W",                                 889, NULL },
+  { "X",                                 667, NULL },
+  { "question",                          500, NULL },
+  { "equal",                             570, NULL },
+  { "Y",                                 611, NULL },
+  { "Z",                                 611, NULL },
+  { "four",                              500, NULL },
+  { "a",                                 500, NULL },
+  { "Gcommaaccent",                      722, NULL },
+  { "b",                                 500, NULL },
+  { "c",                                 444, NULL },
+  { "d",                                 500, NULL },
+  { "e",                                 444, NULL },
+  { "f",                                 333, NULL },
+  { "g",                                 500, NULL },
+  { "bullet",                            350, NULL },
+  { "h",                                 556, NULL },
+  { "i",                                 278, NULL },
+  { "Oslash",                            722, NULL },
+  { "dagger",                            500, NULL },
+  { "j",                                 278, NULL },
+  { "k",                                 500, NULL },
+  { "l",                                 278, NULL },
+  { "m",                                 778, NULL },
+  { "n",                                 556, NULL },
+  { "tcommaaccent",                      278, NULL },
+  { "o",                                 500, NULL },
+  { "ordfeminine",                       266, NULL },
+  { "ring",                              333, NULL },
+  { "p",                                 500, NULL },
+  { "q",                                 500, NULL },
+  { "uhungarumlaut",                     556, NULL },
+  { "r",                                 389, NULL },
+  { "twosuperior",                       300, NULL },
+  { "aacute",                            500, NULL },
+  { "s",                                 389, NULL },
+  { "OE",                                944, NULL },
+  { "t",                                 278, NULL },
+  { "divide",                            570, NULL },
+  { "u",                                 556, NULL },
+  { "Ccaron",                            667, NULL },
+  { "v",                                 444, NULL },
+  { "w",                                 667, NULL },
+  { "x",                                 500, NULL },
+  { "y",                                 444, NULL },
+  { "z",                                 389, NULL },
+  { "Gbreve",                            722, NULL },
+  { "commaaccent",                       250, NULL },
+  { "hungarumlaut",                      333, NULL },
+  { "Idotaccent",                        389, NULL },
+  { "Nacute",                            722, NULL },
+  { "quotedbl",                          555, NULL },
+  { "gcommaaccent",                      500, NULL },
+  { "mu",                                576, NULL },
+  { "greaterequal",                      549, NULL },
+  { "Scaron",                            556, NULL },
+  { "Lslash",                            611, NULL },
+  { "semicolon",                         333, NULL },
+  { "oslash",                            500, NULL },
+  { "lessequal",                         549, NULL },
+  { "lozenge",                           494, NULL },
+  { "parenright",                        333, NULL },
+  { "ccaron",                            444, NULL },
+  { "Ecircumflex",                       667, NULL },
+  { "gbreve",                            500, NULL },
+  { "trademark",                        1000, NULL },
+  { "daggerdbl",                         500, NULL },
+  { "nacute",                            556, NULL },
+  { "macron",                            333, NULL },
+  { "Otilde",                            722, NULL },
+  { "Emacron",                           667, NULL },
+  { "ellipsis",                         1000, NULL },
+  { "scaron",                            389, NULL },
+  { "AE",                                944, NULL },
+  { "Ucircumflex",                       722, NULL },
+  { "lslash",                            278, NULL },
+  { "quotedblleft",                      500, NULL },
+  { "guilsinglright",                    333, NULL },
+  { "hyphen",                            333, NULL },
+  { "quotesingle",                       278, NULL },
+  { "eight",                             500, NULL },
+  { "exclamdown",                        389, NULL },
+  { "endash",                            500, NULL },
+  { "oe",                                722, NULL },
+  { "Abreve",                            667, NULL },
+  { "Umacron",                           722, NULL },
+  { "ecircumflex",                       444, NULL },
+  { "Adieresis",                         667, NULL },
+  { "copyright",                         747, NULL },
+  { "Egrave",                            667, NULL },
+  { "slash",                             278, NULL },
+  { "Edieresis",                         667, NULL },
+  { "otilde",                            500, NULL },
+  { "Idieresis",                         389, NULL },
+  { "parenleft",                         333, NULL },
+  { "one",                               500, NULL },
+  { "emacron",                           444, NULL },
+  { "Odieresis",                         722, NULL },
+  { "ucircumflex",                       556, NULL },
+  { "bracketleft",                       333, NULL },
+  { "Ugrave",                            722, NULL },
+  { "quoteright",                        333, NULL },
+  { "Udieresis",                         722, NULL },
+  { "perthousand",                      1000, NULL },
+  { "Ydieresis",                         611, NULL },
+  { "umacron",                           556, NULL },
+  { "abreve",                            500, NULL },
+  { "Eacute",                            667, NULL },
+  { "adieresis",                         500, NULL },
+  { "egrave",                            444, NULL },
+  { "edieresis",                         444, NULL },
+  { "idieresis",                         278, NULL },
+  { "Eth",                               722, NULL },
+  { "ae",                                722, NULL },
+  { "asterisk",                          500, NULL },
+  { "odieresis",                         500, NULL },
+  { "Uacute",                            722, NULL },
+  { "ugrave",                            556, NULL },
+  { "nine",                              500, NULL },
+  { "five",                              500, NULL },
+  { "udieresis",                         556, NULL },
+  { "Zcaron",                            611, NULL },
+  { "Scommaaccent",                      556, NULL },
+  { "threequarters",                     750, NULL },
+  { "guillemotright",                    500, NULL },
+  { "Ccedilla",                          667, NULL },
+  { "ydieresis",                         444, NULL },
+  { "tilde",                             333, NULL },
+  { "at",                                832, NULL },
+  { "eacute",                            444, NULL },
+  { "underscore",                        500, NULL },
+  { "Euro",                              500, NULL },
+  { "Dcroat",                            722, NULL },
+  { "multiply",                          570, NULL },
+  { "zero",                              500, NULL },
+  { "eth",                               500, NULL },
+  { "Scedilla",                          556, NULL },
+  { "Ograve",                            722, NULL },
+  { "Racute",                            667, NULL },
+  { "partialdiff",                       494, NULL },
+  { "uacute",                            556, NULL },
+  { "braceleft",                         348, NULL },
+  { "Thorn",                             611, NULL },
+  { "zcaron",                            389, NULL },
+  { "scommaaccent",                      389, NULL },
+  { "ccedilla",                          444, NULL },
+  { "Dcaron",                            722, NULL },
+  { "dcroat",                            500, NULL },
+  { "Ocircumflex",                       722, NULL },
+  { "Oacute",                            722, NULL },
+  { "scedilla",                          389, NULL },
+  { "ogonek",                            333, NULL },
+  { "ograve",                            500, NULL },
+  { "racute",                            389, NULL },
+  { "Tcaron",                            611, NULL },
+  { "Eogonek",                           667, NULL },
+  { "thorn",                             500, NULL },
+  { "degree",                            400, NULL },
+  { "registered",                        747, NULL },
+  { "radical",                           549, NULL },
+  { "Aring",                             667, NULL },
+  { "percent",                           833, NULL },
+  { "six",                               500, NULL },
+  { "paragraph",                         500, NULL },
+  { "dcaron",                            608, NULL },
+  { "Uogonek",                           722, NULL },
+  { "two",                               500, NULL },
+  { "summation",                         600, NULL },
+  { "Igrave",                            389, NULL },
+  { "Lacute",                            611, NULL },
+  { "ocircumflex",                       500, NULL },
+  { "oacute",                            500, NULL },
+  { "Uring",                             722, NULL },
+  { "Lcommaaccent",                      611, NULL },
+  { "tcaron",                            366, NULL },
+  { "eogonek",                           444, NULL },
+  { "Delta",                             612, NULL },
+  { "Ohungarumlaut",                     722, NULL },
+  { "asciicircum",                       570, NULL },
+  { "aring",                             500, NULL },
+  { "grave",                             333, NULL },
+  { "uogonek",                           556, NULL },
+  { "bracketright",                      333, NULL },
+  { "Iacute",                            389, NULL },
+  { "ampersand",                         778, NULL },
+  { "igrave",                            278, NULL },
+  { "lacute",                            278, NULL },
+  { "Ncaron",                            722, NULL },
+  { "plus",                              570, NULL },
+  { "uring",                             556, NULL },
+  { "quotesinglbase",                    333, NULL },
+  { "lcommaaccent",                      278, NULL },
+  { "Yacute",                            611, NULL },
+  { "ohungarumlaut",                     500, NULL },
+  { "threesuperior",                     300, NULL },
+  { "acute",                             333, NULL },
+  { "section",                           500, NULL },
+  { "dieresis",                          333, NULL },
+  { "iacute",                            278, NULL },
+  { "quotedblbase",                      500, NULL },
+  { "ncaron",                            556, NULL },
+  { "florin",                            500, NULL },
+  { "yacute",                            444, NULL },
+  { "Rcommaaccent",                      667, NULL },
+  { "fi",                                556, NULL },
+  { "fl",                                556, NULL },
+  { "Acircumflex",                       667, NULL },
+  { "Cacute",                            667, NULL },
+  { "Icircumflex",                       389, NULL },
+  { "guillemotleft",                     500, NULL },
+  { "germandbls",                        500, NULL },
+  { "Amacron",                           667, NULL },
+  { "seven",                             500, NULL },
+  { "Sacute",                            556, NULL },
+  { "ordmasculine",                      300, NULL },
+  { "dotlessi",                          278, NULL },
+  { "sterling",                          500, NULL },
+  { "notequal",                          549, NULL },
+  { "Imacron",                           389, NULL },
+  { "rcommaaccent",                      389, NULL },
+  { "Zdotaccent",                        611, NULL },
+  { "acircumflex",                       500, NULL },
+  { "cacute",                            444, NULL },
+  { "Ecaron",                            667, NULL },
+  { "icircumflex",                       278, NULL },
+  { "braceright",                        348, NULL },
+  { "quotedblright",                     500, NULL },
+  { "amacron",                           500, NULL },
+  { "sacute",                            389, NULL },
+  { "imacron",                           278, NULL },
+  { "cent",                              500, NULL },
+  { "currency",                          500, NULL },
+  { "logicalnot",                        606, NULL },
+  { "zdotaccent",                        389, NULL },
+  { "Atilde",                            667, NULL },
+  { "breve",                             333, NULL },
+  { "bar",                               220, NULL },
+  { "fraction",                          167, NULL },
+  { "less",                              570, NULL },
+  { "ecaron",                            444, NULL },
+  { "guilsinglleft",                     333, NULL },
+  { "exclam",                            389, NULL },
+  { "period",                            250, NULL },
+  { "Rcaron",                            667, NULL },
+  { "Kcommaaccent",                      667, NULL },
+  { "greater",                           570, NULL },
+  { "atilde",                            500, NULL },
+  { "brokenbar",                         220, NULL },
+  { "quoteleft",                         333, NULL },
+  { "Edotaccent",                        667, NULL },
+  { "onesuperior",                       300, NULL }
+};
+
+static BuiltinFontWidth timesItalicWidthsTab[] = {
+  { "Ntilde",                            667, NULL },
+  { "rcaron",                            389, NULL },
+  { "kcommaaccent",                      444, NULL },
+  { "Ncommaaccent",                      667, NULL },
+  { "Zacute",                            556, NULL },
+  { "comma",                             250, NULL },
+  { "cedilla",                           333, NULL },
+  { "plusminus",                         675, NULL },
+  { "circumflex",                        333, NULL },
+  { "dotaccent",                         333, NULL },
+  { "edotaccent",                        444, NULL },
+  { "asciitilde",                        541, NULL },
+  { "colon",                             333, NULL },
+  { "onehalf",                           750, NULL },
+  { "dollar",                            500, NULL },
+  { "Lcaron",                            611, NULL },
+  { "ntilde",                            500, NULL },
+  { "Aogonek",                           611, NULL },
+  { "ncommaaccent",                      500, NULL },
+  { "minus",                             675, NULL },
+  { "Iogonek",                           333, NULL },
+  { "zacute",                            389, NULL },
+  { "yen",                               500, NULL },
+  { "space",                             250, NULL },
+  { "Omacron",                           722, NULL },
+  { "questiondown",                      500, NULL },
+  { "emdash",                            889, NULL },
+  { "Agrave",                            611, NULL },
+  { "three",                             500, NULL },
+  { "numbersign",                        500, NULL },
+  { "lcaron",                            300, NULL },
+  { "A",                                 611, NULL },
+  { "B",                                 611, NULL },
+  { "C",                                 667, NULL },
+  { "aogonek",                           500, NULL },
+  { "D",                                 722, NULL },
+  { "E",                                 611, NULL },
+  { "onequarter",                        750, NULL },
+  { "F",                                 611, NULL },
+  { "G",                                 722, NULL },
+  { "H",                                 722, NULL },
+  { "I",                                 333, NULL },
+  { "J",                                 444, NULL },
+  { "K",                                 667, NULL },
+  { "iogonek",                           278, NULL },
+  { "backslash",                         278, NULL },
+  { "L",                                 556, NULL },
+  { "periodcentered",                    250, NULL },
+  { "M",                                 833, NULL },
+  { "N",                                 667, NULL },
+  { "omacron",                           500, NULL },
+  { "Tcommaaccent",                      556, NULL },
+  { "O",                                 722, NULL },
+  { "P",                                 611, NULL },
+  { "Q",                                 722, NULL },
+  { "Uhungarumlaut",                     722, NULL },
+  { "R",                                 611, NULL },
+  { "Aacute",                            611, NULL },
+  { "caron",                             333, NULL },
+  { "S",                                 500, NULL },
+  { "T",                                 556, NULL },
+  { "U",                                 722, NULL },
+  { "agrave",                            500, NULL },
+  { "V",                                 611, NULL },
+  { "W",                                 833, NULL },
+  { "X",                                 611, NULL },
+  { "question",                          500, NULL },
+  { "equal",                             675, NULL },
+  { "Y",                                 556, NULL },
+  { "Z",                                 556, NULL },
+  { "four",                              500, NULL },
+  { "a",                                 500, NULL },
+  { "Gcommaaccent",                      722, NULL },
+  { "b",                                 500, NULL },
+  { "c",                                 444, NULL },
+  { "d",                                 500, NULL },
+  { "e",                                 444, NULL },
+  { "f",                                 278, NULL },
+  { "g",                                 500, NULL },
+  { "bullet",                            350, NULL },
+  { "h",                                 500, NULL },
+  { "i",                                 278, NULL },
+  { "Oslash",                            722, NULL },
+  { "dagger",                            500, NULL },
+  { "j",                                 278, NULL },
+  { "k",                                 444, NULL },
+  { "l",                                 278, NULL },
+  { "m",                                 722, NULL },
+  { "n",                                 500, NULL },
+  { "tcommaaccent",                      278, NULL },
+  { "o",                                 500, NULL },
+  { "ordfeminine",                       276, NULL },
+  { "ring",                              333, NULL },
+  { "p",                                 500, NULL },
+  { "q",                                 500, NULL },
+  { "uhungarumlaut",                     500, NULL },
+  { "r",                                 389, NULL },
+  { "twosuperior",                       300, NULL },
+  { "aacute",                            500, NULL },
+  { "s",                                 389, NULL },
+  { "OE",                                944, NULL },
+  { "t",                                 278, NULL },
+  { "divide",                            675, NULL },
+  { "u",                                 500, NULL },
+  { "Ccaron",                            667, NULL },
+  { "v",                                 444, NULL },
+  { "w",                                 667, NULL },
+  { "x",                                 444, NULL },
+  { "y",                                 444, NULL },
+  { "z",                                 389, NULL },
+  { "Gbreve",                            722, NULL },
+  { "commaaccent",                       250, NULL },
+  { "hungarumlaut",                      333, NULL },
+  { "Idotaccent",                        333, NULL },
+  { "Nacute",                            667, NULL },
+  { "quotedbl",                          420, NULL },
+  { "gcommaaccent",                      500, NULL },
+  { "mu",                                500, NULL },
+  { "greaterequal",                      549, NULL },
+  { "Scaron",                            500, NULL },
+  { "Lslash",                            556, NULL },
+  { "semicolon",                         333, NULL },
+  { "oslash",                            500, NULL },
+  { "lessequal",                         549, NULL },
+  { "lozenge",                           471, NULL },
+  { "parenright",                        333, NULL },
+  { "ccaron",                            444, NULL },
+  { "Ecircumflex",                       611, NULL },
+  { "gbreve",                            500, NULL },
+  { "trademark",                         980, NULL },
+  { "daggerdbl",                         500, NULL },
+  { "nacute",                            500, NULL },
+  { "macron",                            333, NULL },
+  { "Otilde",                            722, NULL },
+  { "Emacron",                           611, NULL },
+  { "ellipsis",                          889, NULL },
+  { "scaron",                            389, NULL },
+  { "AE",                                889, NULL },
+  { "Ucircumflex",                       722, NULL },
+  { "lslash",                            278, NULL },
+  { "quotedblleft",                      556, NULL },
+  { "guilsinglright",                    333, NULL },
+  { "hyphen",                            333, NULL },
+  { "quotesingle",                       214, NULL },
+  { "eight",                             500, NULL },
+  { "exclamdown",                        389, NULL },
+  { "endash",                            500, NULL },
+  { "oe",                                667, NULL },
+  { "Abreve",                            611, NULL },
+  { "Umacron",                           722, NULL },
+  { "ecircumflex",                       444, NULL },
+  { "Adieresis",                         611, NULL },
+  { "copyright",                         760, NULL },
+  { "Egrave",                            611, NULL },
+  { "slash",                             278, NULL },
+  { "Edieresis",                         611, NULL },
+  { "otilde",                            500, NULL },
+  { "Idieresis",                         333, NULL },
+  { "parenleft",                         333, NULL },
+  { "one",                               500, NULL },
+  { "emacron",                           444, NULL },
+  { "Odieresis",                         722, NULL },
+  { "ucircumflex",                       500, NULL },
+  { "bracketleft",                       389, NULL },
+  { "Ugrave",                            722, NULL },
+  { "quoteright",                        333, NULL },
+  { "Udieresis",                         722, NULL },
+  { "perthousand",                      1000, NULL },
+  { "Ydieresis",                         556, NULL },
+  { "umacron",                           500, NULL },
+  { "abreve",                            500, NULL },
+  { "Eacute",                            611, NULL },
+  { "adieresis",                         500, NULL },
+  { "egrave",                            444, NULL },
+  { "edieresis",                         444, NULL },
+  { "idieresis",                         278, NULL },
+  { "Eth",                               722, NULL },
+  { "ae",                                667, NULL },
+  { "asterisk",                          500, NULL },
+  { "odieresis",                         500, NULL },
+  { "Uacute",                            722, NULL },
+  { "ugrave",                            500, NULL },
+  { "nine",                              500, NULL },
+  { "five",                              500, NULL },
+  { "udieresis",                         500, NULL },
+  { "Zcaron",                            556, NULL },
+  { "Scommaaccent",                      500, NULL },
+  { "threequarters",                     750, NULL },
+  { "guillemotright",                    500, NULL },
+  { "Ccedilla",                          667, NULL },
+  { "ydieresis",                         444, NULL },
+  { "tilde",                             333, NULL },
+  { "at",                                920, NULL },
+  { "eacute",                            444, NULL },
+  { "underscore",                        500, NULL },
+  { "Euro",                              500, NULL },
+  { "Dcroat",                            722, NULL },
+  { "multiply",                          675, NULL },
+  { "zero",                              500, NULL },
+  { "eth",                               500, NULL },
+  { "Scedilla",                          500, NULL },
+  { "Ograve",                            722, NULL },
+  { "Racute",                            611, NULL },
+  { "partialdiff",                       476, NULL },
+  { "uacute",                            500, NULL },
+  { "braceleft",                         400, NULL },
+  { "Thorn",                             611, NULL },
+  { "zcaron",                            389, NULL },
+  { "scommaaccent",                      389, NULL },
+  { "ccedilla",                          444, NULL },
+  { "Dcaron",                            722, NULL },
+  { "dcroat",                            500, NULL },
+  { "Ocircumflex",                       722, NULL },
+  { "Oacute",                            722, NULL },
+  { "scedilla",                          389, NULL },
+  { "ogonek",                            333, NULL },
+  { "ograve",                            500, NULL },
+  { "racute",                            389, NULL },
+  { "Tcaron",                            556, NULL },
+  { "Eogonek",                           611, NULL },
+  { "thorn",                             500, NULL },
+  { "degree",                            400, NULL },
+  { "registered",                        760, NULL },
+  { "radical",                           453, NULL },
+  { "Aring",                             611, NULL },
+  { "percent",                           833, NULL },
+  { "six",                               500, NULL },
+  { "paragraph",                         523, NULL },
+  { "dcaron",                            544, NULL },
+  { "Uogonek",                           722, NULL },
+  { "two",                               500, NULL },
+  { "summation",                         600, NULL },
+  { "Igrave",                            333, NULL },
+  { "Lacute",                            556, NULL },
+  { "ocircumflex",                       500, NULL },
+  { "oacute",                            500, NULL },
+  { "Uring",                             722, NULL },
+  { "Lcommaaccent",                      556, NULL },
+  { "tcaron",                            300, NULL },
+  { "eogonek",                           444, NULL },
+  { "Delta",                             612, NULL },
+  { "Ohungarumlaut",                     722, NULL },
+  { "asciicircum",                       422, NULL },
+  { "aring",                             500, NULL },
+  { "grave",                             333, NULL },
+  { "uogonek",                           500, NULL },
+  { "bracketright",                      389, NULL },
+  { "Iacute",                            333, NULL },
+  { "ampersand",                         778, NULL },
+  { "igrave",                            278, NULL },
+  { "lacute",                            278, NULL },
+  { "Ncaron",                            667, NULL },
+  { "plus",                              675, NULL },
+  { "uring",                             500, NULL },
+  { "quotesinglbase",                    333, NULL },
+  { "lcommaaccent",                      278, NULL },
+  { "Yacute",                            556, NULL },
+  { "ohungarumlaut",                     500, NULL },
+  { "threesuperior",                     300, NULL },
+  { "acute",                             333, NULL },
+  { "section",                           500, NULL },
+  { "dieresis",                          333, NULL },
+  { "iacute",                            278, NULL },
+  { "quotedblbase",                      556, NULL },
+  { "ncaron",                            500, NULL },
+  { "florin",                            500, NULL },
+  { "yacute",                            444, NULL },
+  { "Rcommaaccent",                      611, NULL },
+  { "fi",                                500, NULL },
+  { "fl",                                500, NULL },
+  { "Acircumflex",                       611, NULL },
+  { "Cacute",                            667, NULL },
+  { "Icircumflex",                       333, NULL },
+  { "guillemotleft",                     500, NULL },
+  { "germandbls",                        500, NULL },
+  { "Amacron",                           611, NULL },
+  { "seven",                             500, NULL },
+  { "Sacute",                            500, NULL },
+  { "ordmasculine",                      310, NULL },
+  { "dotlessi",                          278, NULL },
+  { "sterling",                          500, NULL },
+  { "notequal",                          549, NULL },
+  { "Imacron",                           333, NULL },
+  { "rcommaaccent",                      389, NULL },
+  { "Zdotaccent",                        556, NULL },
+  { "acircumflex",                       500, NULL },
+  { "cacute",                            444, NULL },
+  { "Ecaron",                            611, NULL },
+  { "icircumflex",                       278, NULL },
+  { "braceright",                        400, NULL },
+  { "quotedblright",                     556, NULL },
+  { "amacron",                           500, NULL },
+  { "sacute",                            389, NULL },
+  { "imacron",                           278, NULL },
+  { "cent",                              500, NULL },
+  { "currency",                          500, NULL },
+  { "logicalnot",                        675, NULL },
+  { "zdotaccent",                        389, NULL },
+  { "Atilde",                            611, NULL },
+  { "breve",                             333, NULL },
+  { "bar",                               275, NULL },
+  { "fraction",                          167, NULL },
+  { "less",                              675, NULL },
+  { "ecaron",                            444, NULL },
+  { "guilsinglleft",                     333, NULL },
+  { "exclam",                            333, NULL },
+  { "period",                            250, NULL },
+  { "Rcaron",                            611, NULL },
+  { "Kcommaaccent",                      667, NULL },
+  { "greater",                           675, NULL },
+  { "atilde",                            500, NULL },
+  { "brokenbar",                         275, NULL },
+  { "quoteleft",                         333, NULL },
+  { "Edotaccent",                        611, NULL },
+  { "onesuperior",                       300, NULL }
+};
+
+static BuiltinFontWidth timesRomanWidthsTab[] = {
+  { "Ntilde",                            722, NULL },
+  { "rcaron",                            333, NULL },
+  { "kcommaaccent",                      500, NULL },
+  { "Ncommaaccent",                      722, NULL },
+  { "Zacute",                            611, NULL },
+  { "comma",                             250, NULL },
+  { "cedilla",                           333, NULL },
+  { "plusminus",                         564, NULL },
+  { "circumflex",                        333, NULL },
+  { "dotaccent",                         333, NULL },
+  { "edotaccent",                        444, NULL },
+  { "asciitilde",                        541, NULL },
+  { "colon",                             278, NULL },
+  { "onehalf",                           750, NULL },
+  { "dollar",                            500, NULL },
+  { "Lcaron",                            611, NULL },
+  { "ntilde",                            500, NULL },
+  { "Aogonek",                           722, NULL },
+  { "ncommaaccent",                      500, NULL },
+  { "minus",                             564, NULL },
+  { "Iogonek",                           333, NULL },
+  { "zacute",                            444, NULL },
+  { "yen",                               500, NULL },
+  { "space",                             250, NULL },
+  { "Omacron",                           722, NULL },
+  { "questiondown",                      444, NULL },
+  { "emdash",                           1000, NULL },
+  { "Agrave",                            722, NULL },
+  { "three",                             500, NULL },
+  { "numbersign",                        500, NULL },
+  { "lcaron",                            344, NULL },
+  { "A",                                 722, NULL },
+  { "B",                                 667, NULL },
+  { "C",                                 667, NULL },
+  { "aogonek",                           444, NULL },
+  { "D",                                 722, NULL },
+  { "E",                                 611, NULL },
+  { "onequarter",                        750, NULL },
+  { "F",                                 556, NULL },
+  { "G",                                 722, NULL },
+  { "H",                                 722, NULL },
+  { "I",                                 333, NULL },
+  { "J",                                 389, NULL },
+  { "K",                                 722, NULL },
+  { "iogonek",                           278, NULL },
+  { "backslash",                         278, NULL },
+  { "L",                                 611, NULL },
+  { "periodcentered",                    250, NULL },
+  { "M",                                 889, NULL },
+  { "N",                                 722, NULL },
+  { "omacron",                           500, NULL },
+  { "Tcommaaccent",                      611, NULL },
+  { "O",                                 722, NULL },
+  { "P",                                 556, NULL },
+  { "Q",                                 722, NULL },
+  { "Uhungarumlaut",                     722, NULL },
+  { "R",                                 667, NULL },
+  { "Aacute",                            722, NULL },
+  { "caron",                             333, NULL },
+  { "S",                                 556, NULL },
+  { "T",                                 611, NULL },
+  { "U",                                 722, NULL },
+  { "agrave",                            444, NULL },
+  { "V",                                 722, NULL },
+  { "W",                                 944, NULL },
+  { "X",                                 722, NULL },
+  { "question",                          444, NULL },
+  { "equal",                             564, NULL },
+  { "Y",                                 722, NULL },
+  { "Z",                                 611, NULL },
+  { "four",                              500, NULL },
+  { "a",                                 444, NULL },
+  { "Gcommaaccent",                      722, NULL },
+  { "b",                                 500, NULL },
+  { "c",                                 444, NULL },
+  { "d",                                 500, NULL },
+  { "e",                                 444, NULL },
+  { "f",                                 333, NULL },
+  { "g",                                 500, NULL },
+  { "bullet",                            350, NULL },
+  { "h",                                 500, NULL },
+  { "i",                                 278, NULL },
+  { "Oslash",                            722, NULL },
+  { "dagger",                            500, NULL },
+  { "j",                                 278, NULL },
+  { "k",                                 500, NULL },
+  { "l",                                 278, NULL },
+  { "m",                                 778, NULL },
+  { "n",                                 500, NULL },
+  { "tcommaaccent",                      278, NULL },
+  { "o",                                 500, NULL },
+  { "ordfeminine",                       276, NULL },
+  { "ring",                              333, NULL },
+  { "p",                                 500, NULL },
+  { "q",                                 500, NULL },
+  { "uhungarumlaut",                     500, NULL },
+  { "r",                                 333, NULL },
+  { "twosuperior",                       300, NULL },
+  { "aacute",                            444, NULL },
+  { "s",                                 389, NULL },
+  { "OE",                                889, NULL },
+  { "t",                                 278, NULL },
+  { "divide",                            564, NULL },
+  { "u",                                 500, NULL },
+  { "Ccaron",                            667, NULL },
+  { "v",                                 500, NULL },
+  { "w",                                 722, NULL },
+  { "x",                                 500, NULL },
+  { "y",                                 500, NULL },
+  { "z",                                 444, NULL },
+  { "Gbreve",                            722, NULL },
+  { "commaaccent",                       250, NULL },
+  { "hungarumlaut",                      333, NULL },
+  { "Idotaccent",                        333, NULL },
+  { "Nacute",                            722, NULL },
+  { "quotedbl",                          408, NULL },
+  { "gcommaaccent",                      500, NULL },
+  { "mu",                                500, NULL },
+  { "greaterequal",                      549, NULL },
+  { "Scaron",                            556, NULL },
+  { "Lslash",                            611, NULL },
+  { "semicolon",                         278, NULL },
+  { "oslash",                            500, NULL },
+  { "lessequal",                         549, NULL },
+  { "lozenge",                           471, NULL },
+  { "parenright",                        333, NULL },
+  { "ccaron",                            444, NULL },
+  { "Ecircumflex",                       611, NULL },
+  { "gbreve",                            500, NULL },
+  { "trademark",                         980, NULL },
+  { "daggerdbl",                         500, NULL },
+  { "nacute",                            500, NULL },
+  { "macron",                            333, NULL },
+  { "Otilde",                            722, NULL },
+  { "Emacron",                           611, NULL },
+  { "ellipsis",                         1000, NULL },
+  { "scaron",                            389, NULL },
+  { "AE",                                889, NULL },
+  { "Ucircumflex",                       722, NULL },
+  { "lslash",                            278, NULL },
+  { "quotedblleft",                      444, NULL },
+  { "guilsinglright",                    333, NULL },
+  { "hyphen",                            333, NULL },
+  { "quotesingle",                       180, NULL },
+  { "eight",                             500, NULL },
+  { "exclamdown",                        333, NULL },
+  { "endash",                            500, NULL },
+  { "oe",                                722, NULL },
+  { "Abreve",                            722, NULL },
+  { "Umacron",                           722, NULL },
+  { "ecircumflex",                       444, NULL },
+  { "Adieresis",                         722, NULL },
+  { "copyright",                         760, NULL },
+  { "Egrave",                            611, NULL },
+  { "slash",                             278, NULL },
+  { "Edieresis",                         611, NULL },
+  { "otilde",                            500, NULL },
+  { "Idieresis",                         333, NULL },
+  { "parenleft",                         333, NULL },
+  { "one",                               500, NULL },
+  { "emacron",                           444, NULL },
+  { "Odieresis",                         722, NULL },
+  { "ucircumflex",                       500, NULL },
+  { "bracketleft",                       333, NULL },
+  { "Ugrave",                            722, NULL },
+  { "quoteright",                        333, NULL },
+  { "Udieresis",                         722, NULL },
+  { "perthousand",                      1000, NULL },
+  { "Ydieresis",                         722, NULL },
+  { "umacron",                           500, NULL },
+  { "abreve",                            444, NULL },
+  { "Eacute",                            611, NULL },
+  { "adieresis",                         444, NULL },
+  { "egrave",                            444, NULL },
+  { "edieresis",                         444, NULL },
+  { "idieresis",                         278, NULL },
+  { "Eth",                               722, NULL },
+  { "ae",                                667, NULL },
+  { "asterisk",                          500, NULL },
+  { "odieresis",                         500, NULL },
+  { "Uacute",                            722, NULL },
+  { "ugrave",                            500, NULL },
+  { "nine",                              500, NULL },
+  { "five",                              500, NULL },
+  { "udieresis",                         500, NULL },
+  { "Zcaron",                            611, NULL },
+  { "Scommaaccent",                      556, NULL },
+  { "threequarters",                     750, NULL },
+  { "guillemotright",                    500, NULL },
+  { "Ccedilla",                          667, NULL },
+  { "ydieresis",                         500, NULL },
+  { "tilde",                             333, NULL },
+  { "at",                                921, NULL },
+  { "eacute",                            444, NULL },
+  { "underscore",                        500, NULL },
+  { "Euro",                              500, NULL },
+  { "Dcroat",                            722, NULL },
+  { "multiply",                          564, NULL },
+  { "zero",                              500, NULL },
+  { "eth",                               500, NULL },
+  { "Scedilla",                          556, NULL },
+  { "Ograve",                            722, NULL },
+  { "Racute",                            667, NULL },
+  { "partialdiff",                       476, NULL },
+  { "uacute",                            500, NULL },
+  { "braceleft",                         480, NULL },
+  { "Thorn",                             556, NULL },
+  { "zcaron",                            444, NULL },
+  { "scommaaccent",                      389, NULL },
+  { "ccedilla",                          444, NULL },
+  { "Dcaron",                            722, NULL },
+  { "dcroat",                            500, NULL },
+  { "Ocircumflex",                       722, NULL },
+  { "Oacute",                            722, NULL },
+  { "scedilla",                          389, NULL },
+  { "ogonek",                            333, NULL },
+  { "ograve",                            500, NULL },
+  { "racute",                            333, NULL },
+  { "Tcaron",                            611, NULL },
+  { "Eogonek",                           611, NULL },
+  { "thorn",                             500, NULL },
+  { "degree",                            400, NULL },
+  { "registered",                        760, NULL },
+  { "radical",                           453, NULL },
+  { "Aring",                             722, NULL },
+  { "percent",                           833, NULL },
+  { "six",                               500, NULL },
+  { "paragraph",                         453, NULL },
+  { "dcaron",                            588, NULL },
+  { "Uogonek",                           722, NULL },
+  { "two",                               500, NULL },
+  { "summation",                         600, NULL },
+  { "Igrave",                            333, NULL },
+  { "Lacute",                            611, NULL },
+  { "ocircumflex",                       500, NULL },
+  { "oacute",                            500, NULL },
+  { "Uring",                             722, NULL },
+  { "Lcommaaccent",                      611, NULL },
+  { "tcaron",                            326, NULL },
+  { "eogonek",                           444, NULL },
+  { "Delta",                             612, NULL },
+  { "Ohungarumlaut",                     722, NULL },
+  { "asciicircum",                       469, NULL },
+  { "aring",                             444, NULL },
+  { "grave",                             333, NULL },
+  { "uogonek",                           500, NULL },
+  { "bracketright",                      333, NULL },
+  { "Iacute",                            333, NULL },
+  { "ampersand",                         778, NULL },
+  { "igrave",                            278, NULL },
+  { "lacute",                            278, NULL },
+  { "Ncaron",                            722, NULL },
+  { "plus",                              564, NULL },
+  { "uring",                             500, NULL },
+  { "quotesinglbase",                    333, NULL },
+  { "lcommaaccent",                      278, NULL },
+  { "Yacute",                            722, NULL },
+  { "ohungarumlaut",                     500, NULL },
+  { "threesuperior",                     300, NULL },
+  { "acute",                             333, NULL },
+  { "section",                           500, NULL },
+  { "dieresis",                          333, NULL },
+  { "iacute",                            278, NULL },
+  { "quotedblbase",                      444, NULL },
+  { "ncaron",                            500, NULL },
+  { "florin",                            500, NULL },
+  { "yacute",                            500, NULL },
+  { "Rcommaaccent",                      667, NULL },
+  { "fi",                                556, NULL },
+  { "fl",                                556, NULL },
+  { "Acircumflex",                       722, NULL },
+  { "Cacute",                            667, NULL },
+  { "Icircumflex",                       333, NULL },
+  { "guillemotleft",                     500, NULL },
+  { "germandbls",                        500, NULL },
+  { "Amacron",                           722, NULL },
+  { "seven",                             500, NULL },
+  { "Sacute",                            556, NULL },
+  { "ordmasculine",                      310, NULL },
+  { "dotlessi",                          278, NULL },
+  { "sterling",                          500, NULL },
+  { "notequal",                          549, NULL },
+  { "Imacron",                           333, NULL },
+  { "rcommaaccent",                      333, NULL },
+  { "Zdotaccent",                        611, NULL },
+  { "acircumflex",                       444, NULL },
+  { "cacute",                            444, NULL },
+  { "Ecaron",                            611, NULL },
+  { "icircumflex",                       278, NULL },
+  { "braceright",                        480, NULL },
+  { "quotedblright",                     444, NULL },
+  { "amacron",                           444, NULL },
+  { "sacute",                            389, NULL },
+  { "imacron",                           278, NULL },
+  { "cent",                              500, NULL },
+  { "currency",                          500, NULL },
+  { "logicalnot",                        564, NULL },
+  { "zdotaccent",                        444, NULL },
+  { "Atilde",                            722, NULL },
+  { "breve",                             333, NULL },
+  { "bar",                               200, NULL },
+  { "fraction",                          167, NULL },
+  { "less",                              564, NULL },
+  { "ecaron",                            444, NULL },
+  { "guilsinglleft",                     333, NULL },
+  { "exclam",                            333, NULL },
+  { "period",                            250, NULL },
+  { "Rcaron",                            667, NULL },
+  { "Kcommaaccent",                      722, NULL },
+  { "greater",                           564, NULL },
+  { "atilde",                            444, NULL },
+  { "brokenbar",                         200, NULL },
+  { "quoteleft",                         333, NULL },
+  { "Edotaccent",                        611, NULL },
+  { "onesuperior",                       300, NULL }
+};
+
+static BuiltinFontWidth zapfDingbatsWidthsTab[] = {
+  { "a81",                               438, NULL },
+  { "a82",                               138, NULL },
+  { "a83",                               277, NULL },
+  { "a84",                               415, NULL },
+  { "a85",                               509, NULL },
+  { "a86",                               410, NULL },
+  { "a87",                               234, NULL },
+  { "a88",                               234, NULL },
+  { "a89",                               390, NULL },
+  { "a140",                              788, NULL },
+  { "a141",                              788, NULL },
+  { "a142",                              788, NULL },
+  { "a143",                              788, NULL },
+  { "a144",                              788, NULL },
+  { "a145",                              788, NULL },
+  { "a146",                              788, NULL },
+  { "a147",                              788, NULL },
+  { "a148",                              788, NULL },
+  { "a149",                              788, NULL },
+  { "a90",                               390, NULL },
+  { "a91",                               276, NULL },
+  { "a92",                               276, NULL },
+  { "space",                             278, NULL },
+  { "a93",                               317, NULL },
+  { "a94",                               317, NULL },
+  { "a95",                               334, NULL },
+  { "a96",                               334, NULL },
+  { "a97",                               392, NULL },
+  { "a98",                               392, NULL },
+  { "a99",                               668, NULL },
+  { "a150",                              788, NULL },
+  { "a151",                              788, NULL },
+  { "a152",                              788, NULL },
+  { "a153",                              788, NULL },
+  { "a154",                              788, NULL },
+  { "a155",                              788, NULL },
+  { "a156",                              788, NULL },
+  { "a157",                              788, NULL },
+  { "a158",                              788, NULL },
+  { "a159",                              788, NULL },
+  { "a160",                              894, NULL },
+  { "a161",                              838, NULL },
+  { "a162",                              924, NULL },
+  { "a163",                             1016, NULL },
+  { "a164",                              458, NULL },
+  { "a165",                              924, NULL },
+  { "a166",                              918, NULL },
+  { "a167",                              927, NULL },
+  { "a168",                              928, NULL },
+  { "a169",                              928, NULL },
+  { "a170",                              834, NULL },
+  { "a171",                              873, NULL },
+  { "a172",                              828, NULL },
+  { "a173",                              924, NULL },
+  { "a174",                              917, NULL },
+  { "a175",                              930, NULL },
+  { "a176",                              931, NULL },
+  { "a177",                              463, NULL },
+  { "a178",                              883, NULL },
+  { "a179",                              836, NULL },
+  { "a180",                              867, NULL },
+  { "a181",                              696, NULL },
+  { "a182",                              874, NULL },
+  { "a183",                              760, NULL },
+  { "a184",                              946, NULL },
+  { "a185",                              865, NULL },
+  { "a186",                              967, NULL },
+  { "a187",                              831, NULL },
+  { "a188",                              873, NULL },
+  { "a189",                              927, NULL },
+  { "a1",                                974, NULL },
+  { "a2",                                961, NULL },
+  { "a3",                                980, NULL },
+  { "a4",                                719, NULL },
+  { "a5",                                789, NULL },
+  { "a6",                                494, NULL },
+  { "a7",                                552, NULL },
+  { "a8",                                537, NULL },
+  { "a9",                                577, NULL },
+  { "a190",                              970, NULL },
+  { "a191",                              918, NULL },
+  { "a192",                              748, NULL },
+  { "a193",                              836, NULL },
+  { "a194",                              771, NULL },
+  { "a195",                              888, NULL },
+  { "a196",                              748, NULL },
+  { "a197",                              771, NULL },
+  { "a198",                              888, NULL },
+  { "a199",                              867, NULL },
+  { "a10",                               692, NULL },
+  { "a11",                               960, NULL },
+  { "a12",                               939, NULL },
+  { "a13",                               549, NULL },
+  { "a14",                               855, NULL },
+  { "a15",                               911, NULL },
+  { "a16",                               933, NULL },
+  { "a17",                               945, NULL },
+  { "a18",                               974, NULL },
+  { "a19",                               755, NULL },
+  { "a20",                               846, NULL },
+  { "a21",                               762, NULL },
+  { "a22",                               761, NULL },
+  { "a23",                               571, NULL },
+  { "a24",                               677, NULL },
+  { "a25",                               763, NULL },
+  { "a26",                               760, NULL },
+  { "a27",                               759, NULL },
+  { "a28",                               754, NULL },
+  { "a29",                               786, NULL },
+  { "a30",                               788, NULL },
+  { "a31",                               788, NULL },
+  { "a32",                               790, NULL },
+  { "a33",                               793, NULL },
+  { "a34",                               794, NULL },
+  { "a35",                               816, NULL },
+  { "a36",                               823, NULL },
+  { "a37",                               789, NULL },
+  { "a38",                               841, NULL },
+  { "a39",                               823, NULL },
+  { "a40",                               833, NULL },
+  { "a41",                               816, NULL },
+  { "a42",                               831, NULL },
+  { "a43",                               923, NULL },
+  { "a44",                               744, NULL },
+  { "a45",                               723, NULL },
+  { "a46",                               749, NULL },
+  { "a47",                               790, NULL },
+  { "a48",                               792, NULL },
+  { "a49",                               695, NULL },
+  { "a100",                              668, NULL },
+  { "a101",                              732, NULL },
+  { "a102",                              544, NULL },
+  { "a103",                              544, NULL },
+  { "a104",                              910, NULL },
+  { "a105",                              911, NULL },
+  { "a106",                              667, NULL },
+  { "a107",                              760, NULL },
+  { "a108",                              760, NULL },
+  { "a109",                              626, NULL },
+  { "a50",                               776, NULL },
+  { "a51",                               768, NULL },
+  { "a52",                               792, NULL },
+  { "a53",                               759, NULL },
+  { "a54",                               707, NULL },
+  { "a55",                               708, NULL },
+  { "a56",                               682, NULL },
+  { "a57",                               701, NULL },
+  { "a58",                               826, NULL },
+  { "a59",                               815, NULL },
+  { "a110",                              694, NULL },
+  { "a111",                              595, NULL },
+  { "a112",                              776, NULL },
+  { "a117",                              690, NULL },
+  { "a118",                              791, NULL },
+  { "a119",                              790, NULL },
+  { "a60",                               789, NULL },
+  { "a61",                               789, NULL },
+  { "a62",                               707, NULL },
+  { "a63",                               687, NULL },
+  { "a64",                               696, NULL },
+  { "a65",                               689, NULL },
+  { "a66",                               786, NULL },
+  { "a67",                               787, NULL },
+  { "a68",                               713, NULL },
+  { "a69",                               791, NULL },
+  { "a200",                              696, NULL },
+  { "a201",                              874, NULL },
+  { "a120",                              788, NULL },
+  { "a121",                              788, NULL },
+  { "a202",                              974, NULL },
+  { "a122",                              788, NULL },
+  { "a203",                              762, NULL },
+  { "a123",                              788, NULL },
+  { "a204",                              759, NULL },
+  { "a124",                              788, NULL },
+  { "a205",                              509, NULL },
+  { "a125",                              788, NULL },
+  { "a206",                              410, NULL },
+  { "a126",                              788, NULL },
+  { "a127",                              788, NULL },
+  { "a128",                              788, NULL },
+  { "a129",                              788, NULL },
+  { "a70",                               785, NULL },
+  { "a71",                               791, NULL },
+  { "a72",                               873, NULL },
+  { "a73",                               761, NULL },
+  { "a74",                               762, NULL },
+  { "a75",                               759, NULL },
+  { "a76",                               892, NULL },
+  { "a77",                               892, NULL },
+  { "a78",                               788, NULL },
+  { "a79",                               784, NULL },
+  { "a130",                              788, NULL },
+  { "a131",                              788, NULL },
+  { "a132",                              788, NULL },
+  { "a133",                              788, NULL },
+  { "a134",                              788, NULL },
+  { "a135",                              788, NULL },
+  { "a136",                              788, NULL },
+  { "a137",                              788, NULL },
+  { "a138",                              788, NULL },
+  { "a139",                              788, NULL }
+};
+
+BuiltinFont builtinFonts[] = {
+  { "Courier",               standardEncoding,            629, -157, { -23, -250,  715,  805}, NULL },
+  { "Courier-Bold",          standardEncoding,            629, -157, {-113, -250,  749,  801}, NULL },
+  { "Courier-BoldOblique",   standardEncoding,            629, -157, { -57, -250,  869,  801}, NULL },
+  { "Courier-Oblique",       standardEncoding,            629, -157, { -27, -250,  849,  805}, NULL },
+  { "Helvetica",             standardEncoding,            718, -207, {-166, -225, 1000,  931}, NULL },
+  { "Helvetica-Bold",        standardEncoding,            718, -207, {-170, -228, 1003,  962}, NULL },
+  { "Helvetica-BoldOblique", standardEncoding,            718, -207, {-174, -228, 1114,  962}, NULL },
+  { "Helvetica-Oblique",     standardEncoding,            718, -207, {-170, -225, 1116,  931}, NULL },
+  { "Symbol",                symbolEncoding,             1010, -293, {-180, -293, 1090, 1010}, NULL },
+  { "Times-Bold",            standardEncoding,            683, -217, {-168, -218, 1000,  935}, NULL },
+  { "Times-BoldItalic",      standardEncoding,            683, -217, {-200, -218,  996,  921}, NULL },
+  { "Times-Italic",          standardEncoding,            683, -217, {-169, -217, 1010,  883}, NULL },
+  { "Times-Roman",           standardEncoding,            683, -217, {-168, -218, 1000,  898}, NULL },
+  { "ZapfDingbats",          zapfDingbatsEncoding,        820, -143, {  -1, -143,  981,  820}, NULL }
+};
+
+BuiltinFont *builtinFontSubst[] = {
+  &builtinFonts[0],
+  &builtinFonts[3],
+  &builtinFonts[1],
+  &builtinFonts[2],
+  &builtinFonts[4],
+  &builtinFonts[7],
+  &builtinFonts[5],
+  &builtinFonts[6],
+  &builtinFonts[12],
+  &builtinFonts[11],
+  &builtinFonts[9],
+  &builtinFonts[10]
+};
+
+void initBuiltinFontTables() {
+  builtinFonts[0].widths = new BuiltinFontWidths(courierWidthsTab, 315);
+  builtinFonts[1].widths = new BuiltinFontWidths(courierBoldWidthsTab, 315);
+  builtinFonts[2].widths = new BuiltinFontWidths(courierBoldObliqueWidthsTab, 315);
+  builtinFonts[3].widths = new BuiltinFontWidths(courierObliqueWidthsTab, 315);
+  builtinFonts[4].widths = new BuiltinFontWidths(helveticaWidthsTab, 315);
+  builtinFonts[5].widths = new BuiltinFontWidths(helveticaBoldWidthsTab, 316);
+  builtinFonts[6].widths = new BuiltinFontWidths(helveticaBoldObliqueWidthsTab, 315);
+  builtinFonts[7].widths = new BuiltinFontWidths(helveticaObliqueWidthsTab, 315);
+  builtinFonts[8].widths = new BuiltinFontWidths(symbolWidthsTab, 190);
+  builtinFonts[9].widths = new BuiltinFontWidths(timesBoldWidthsTab, 315);
+  builtinFonts[10].widths = new BuiltinFontWidths(timesBoldItalicWidthsTab, 315);
+  builtinFonts[11].widths = new BuiltinFontWidths(timesItalicWidthsTab, 315);
+  builtinFonts[12].widths = new BuiltinFontWidths(timesRomanWidthsTab, 315);
+  builtinFonts[13].widths = new BuiltinFontWidths(zapfDingbatsWidthsTab, 202);
+}
+
+void freeBuiltinFontTables() {
+  int i;
+
+  for (i = 0; i < 14; ++i) {
+    delete builtinFonts[i].widths;
+  }
+}
diff --git a/poppler/BuiltinFontTables.h b/poppler/BuiltinFontTables.h
new file mode 100644 (file)
index 0000000..eb45549
--- /dev/null
@@ -0,0 +1,23 @@
+//========================================================================
+//
+// BuiltinFontTables.h
+//
+// Copyright 2001-2003 Glyph & Cog, LLC
+//
+//========================================================================
+
+#ifndef BUILTINFONTTABLES_H
+#define BUILTINFONTTABLES_H
+
+#include "BuiltinFont.h"
+
+#define nBuiltinFonts      14
+#define nBuiltinFontSubsts 12
+
+extern BuiltinFont builtinFonts[nBuiltinFonts];
+extern BuiltinFont *builtinFontSubst[nBuiltinFontSubsts];
+
+extern void initBuiltinFontTables();
+extern void freeBuiltinFontTables();
+
+#endif
diff --git a/poppler/CMap.cc b/poppler/CMap.cc
new file mode 100644 (file)
index 0000000..13f293a
--- /dev/null
@@ -0,0 +1,597 @@
+//========================================================================
+//
+// CMap.cc
+//
+// Copyright 2001-2003 Glyph & Cog, LLC
+//
+//========================================================================
+
+//========================================================================
+//
+// Modified under the Poppler project - http://poppler.freedesktop.org
+//
+// All changes made under the Poppler project to this file are licensed
+// under GPL version 2 or later
+//
+// Copyright (C) 2008 Koji Otani <sho@bbr.jp>
+// Copyright (C) 2008, 2009 Albert Astals Cid <aacid@kde.org>
+//
+// To see a description of the changes please see the Changelog file that
+// came with your tarball or type make ChangeLog if you are building from git
+//
+//========================================================================
+
+#include <config.h>
+
+#ifdef USE_GCC_PRAGMAS
+#pragma implementation
+#endif
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <ctype.h>
+#include "goo/gmem.h"
+#include "goo/gfile.h"
+#include "goo/GooString.h"
+#include "Error.h"
+#include "GlobalParams.h"
+#include "PSTokenizer.h"
+#include "CMap.h"
+#include "Object.h"
+
+//------------------------------------------------------------------------
+
+struct CMapVectorEntry {
+  GBool isVector;
+  union {
+    CMapVectorEntry *vector;
+    CID cid;
+  };
+};
+
+//------------------------------------------------------------------------
+
+static int getCharFromFile(void *data) {
+  return fgetc((FILE *)data);
+}
+
+static int getCharFromStream(void *data) {
+  return ((Stream *)data)->getChar();
+}
+
+//------------------------------------------------------------------------
+
+CMap *CMap::parse(CMapCache *cache, GooString *collectionA, Object *obj) {
+  CMap *cMap;
+  GooString *cMapNameA;
+
+  if (obj->isName()) {
+    cMapNameA = new GooString(obj->getName());
+    if (!(cMap = globalParams->getCMap(collectionA, cMapNameA))) {
+      error(errSyntaxError, -1,
+           "Unknown CMap '{0:t}' for character collection '{1:t}'",
+           cMapNameA, collectionA);
+    }
+    delete cMapNameA;
+  } else if (obj->isStream()) {
+    if (!(cMap = CMap::parse(NULL, collectionA, obj->getStream()))) {
+      error(errSyntaxError, -1, "Invalid CMap in Type 0 font");
+    }
+  } else {
+    error(errSyntaxError, -1, "Invalid Encoding in Type 0 font");
+    return NULL;
+  }
+  return cMap;
+}
+
+CMap *CMap::parse(CMapCache *cache, GooString *collectionA,
+                 GooString *cMapNameA) {
+  FILE *f;
+  CMap *cMap;
+
+  if (!(f = globalParams->findCMapFile(collectionA, cMapNameA))) {
+
+    // Check for an identity CMap.
+    if (!cMapNameA->cmp("Identity") || !cMapNameA->cmp("Identity-H")) {
+      return new CMap(collectionA->copy(), cMapNameA->copy(), 0);
+    }
+    if (!cMapNameA->cmp("Identity-V")) {
+      return new CMap(collectionA->copy(), cMapNameA->copy(), 1);
+    }
+
+    error(errSyntaxError, -1,
+         "Couldn't find '{0:t}' CMap file for '{1:t}' collection",
+         cMapNameA, collectionA);
+    return NULL;
+  }
+
+  cMap = new CMap(collectionA->copy(), cMapNameA->copy());
+  cMap->parse2(cache, &getCharFromFile, f);
+
+  fclose(f);
+
+  return cMap;
+}
+
+CMap *CMap::parse(CMapCache *cache, GooString *collectionA, Stream *str) {
+  Object obj1;
+  CMap *cMap;
+
+  cMap = new CMap(collectionA->copy(), NULL);
+
+  if (!str->getDict()->lookup("UseCMap", &obj1)->isNull()) {
+    cMap->useCMap(cache, &obj1);
+  }
+  obj1.free();
+
+  str->reset();
+  cMap->parse2(cache, &getCharFromStream, str);
+  str->close();
+  return cMap;
+}
+
+CMap *CMap::parse(CMapCache *cache, GooString *collectionA,
+                 GooString *cMapNameA, Stream *stream) {
+  FILE *f = NULL;
+  CMap *cmap;
+  PSTokenizer *pst;
+  char tok1[256], tok2[256], tok3[256];
+  int n1, n2, n3;
+  Guint start, end, code;
+
+  if (stream) {
+    stream->reset();
+    pst = new PSTokenizer(&getCharFromStream, stream);
+  } else {
+    if (!(f = globalParams->findCMapFile(collectionA, cMapNameA))) {
+
+      // Check for an identity CMap.
+      if (!cMapNameA->cmp("Identity") || !cMapNameA->cmp("Identity-H")) {
+        return new CMap(collectionA->copy(), cMapNameA->copy(), 0);
+      }
+      if (!cMapNameA->cmp("Identity-V")) {
+        return new CMap(collectionA->copy(), cMapNameA->copy(), 1);
+      }
+
+      error(errSyntaxError, -1, "Couldn't find '{0:t}' CMap file for '{1:t}' collection",
+           cMapNameA, collectionA);
+      return NULL;
+    }
+    pst = new PSTokenizer(&getCharFromFile, f);
+  }
+
+  cmap = new CMap(collectionA->copy(), cMapNameA->copy());
+
+  pst->getToken(tok1, sizeof(tok1), &n1);
+  while (pst->getToken(tok2, sizeof(tok2), &n2)) {
+    if (!strcmp(tok2, "usecmap")) {
+      if (tok1[0] == '/') {
+       cmap->useCMap(cache, tok1 + 1);
+      }
+      pst->getToken(tok1, sizeof(tok1), &n1);
+    } else if (!strcmp(tok1, "/WMode")) {
+      cmap->wMode = atoi(tok2);
+      pst->getToken(tok1, sizeof(tok1), &n1);
+    } else if (!strcmp(tok2, "begincidchar")) {
+      while (pst->getToken(tok1, sizeof(tok1), &n1)) {
+       if (!strcmp(tok1, "endcidchar")) {
+         break;
+       }
+       if (!pst->getToken(tok2, sizeof(tok2), &n2) ||
+           !strcmp(tok2, "endcidchar")) {
+         error(errSyntaxError, -1, "Illegal entry in cidchar block in CMap");
+         break;
+       }
+       if (!(tok1[0] == '<' && tok1[n1 - 1] == '>' &&
+             n1 >= 4 && (n1 & 1) == 0)) {
+         error(errSyntaxError, -1, "Illegal entry in cidchar block in CMap");
+         continue;
+       }
+       tok1[n1 - 1] = '\0';
+       if (sscanf(tok1 + 1, "%x", &code) != 1) {
+         error(errSyntaxError, -1, "Illegal entry in cidchar block in CMap");
+         continue;
+       }
+       n1 = (n1 - 2) / 2;
+       cmap->addCIDs(code, code, n1, (CID)atoi(tok2));
+      }
+      pst->getToken(tok1, sizeof(tok1), &n1);
+    } else if (!strcmp(tok2, "begincidrange")) {
+      while (pst->getToken(tok1, sizeof(tok1), &n1)) {
+       if (!strcmp(tok1, "endcidrange")) {
+         break;
+       }
+       if (!pst->getToken(tok2, sizeof(tok2), &n2) ||
+           !strcmp(tok2, "endcidrange") ||
+           !pst->getToken(tok3, sizeof(tok3), &n3) ||
+           !strcmp(tok3, "endcidrange")) {
+         error(errSyntaxError, -1, "Illegal entry in cidrange block in CMap");
+         break;
+       }
+       if (tok1[0] == '<' && tok2[0] == '<' &&
+           n1 == n2 && n1 >= 4 && (n1 & 1) == 0) {
+         tok1[n1 - 1] = tok2[n1 - 1] = '\0';
+         sscanf(tok1 + 1, "%x", &start);
+         sscanf(tok2 + 1, "%x", &end);
+         n1 = (n1 - 2) / 2;
+         cmap->addCIDs(start, end, n1, (CID)atoi(tok3));
+       }
+      }
+      pst->getToken(tok1, sizeof(tok1), &n1);
+    } else {
+      strcpy(tok1, tok2);
+    }
+  }
+  delete pst;
+
+  if (f) {
+    fclose(f);
+  }
+
+  return cmap;
+}
+
+void CMap::parse2(CMapCache *cache, int (*getCharFunc)(void *), void *data) {
+  PSTokenizer *pst;
+  char tok1[256], tok2[256], tok3[256];
+  int n1, n2, n3;
+  Guint start, end, code;
+
+  pst = new PSTokenizer(getCharFunc, data);
+  pst->getToken(tok1, sizeof(tok1), &n1);
+  while (pst->getToken(tok2, sizeof(tok2), &n2)) {
+    if (!strcmp(tok2, "usecmap")) {
+      if (tok1[0] == '/') {
+       useCMap(cache, tok1 + 1);
+      }
+      pst->getToken(tok1, sizeof(tok1), &n1);
+    } else if (!strcmp(tok1, "/WMode")) {
+      wMode = atoi(tok2);
+      pst->getToken(tok1, sizeof(tok1), &n1);
+    } else if (!strcmp(tok2, "begincidchar")) {
+      while (pst->getToken(tok1, sizeof(tok1), &n1)) {
+       if (!strcmp(tok1, "endcidchar")) {
+         break;
+       }
+       if (!pst->getToken(tok2, sizeof(tok2), &n2) ||
+           !strcmp(tok2, "endcidchar")) {
+         error(errSyntaxError, -1, "Illegal entry in cidchar block in CMap");
+         break;
+       }
+       if (!(tok1[0] == '<' && tok1[n1 - 1] == '>' &&
+             n1 >= 4 && (n1 & 1) == 0)) {
+         error(errSyntaxError, -1, "Illegal entry in cidchar block in CMap");
+         continue;
+       }
+       tok1[n1 - 1] = '\0';
+       if (sscanf(tok1 + 1, "%x", &code) != 1) {
+         error(errSyntaxError, -1, "Illegal entry in cidchar block in CMap");
+         continue;
+       }
+       n1 = (n1 - 2) / 2;
+       addCIDs(code, code, n1, (CID)atoi(tok2));
+      }
+      pst->getToken(tok1, sizeof(tok1), &n1);
+    } else if (!strcmp(tok2, "begincidrange")) {
+      while (pst->getToken(tok1, sizeof(tok1), &n1)) {
+       if (!strcmp(tok1, "endcidrange")) {
+         break;
+       }
+       if (!pst->getToken(tok2, sizeof(tok2), &n2) ||
+           !strcmp(tok2, "endcidrange") ||
+           !pst->getToken(tok3, sizeof(tok3), &n3) ||
+           !strcmp(tok3, "endcidrange")) {
+         error(errSyntaxError, -1, "Illegal entry in cidrange block in CMap");
+         break;
+       }
+       if (tok1[0] == '<' && tok2[0] == '<' &&
+           n1 == n2 && n1 >= 4 && (n1 & 1) == 0) {
+         tok1[n1 - 1] = tok2[n1 - 1] = '\0';
+         sscanf(tok1 + 1, "%x", &start);
+         sscanf(tok2 + 1, "%x", &end);
+         n1 = (n1 - 2) / 2;
+         addCIDs(start, end, n1, (CID)atoi(tok3));
+       }
+      }
+      pst->getToken(tok1, sizeof(tok1), &n1);
+    } else {
+      strcpy(tok1, tok2);
+    }
+  }
+  delete pst;
+}
+
+CMap::CMap(GooString *collectionA, GooString *cMapNameA) {
+  int i;
+
+  collection = collectionA;
+  cMapName = cMapNameA;
+  isIdent = gFalse;
+  wMode = 0;
+  vector = (CMapVectorEntry *)gmallocn(256, sizeof(CMapVectorEntry));
+  for (i = 0; i < 256; ++i) {
+    vector[i].isVector = gFalse;
+    vector[i].cid = 0;
+  }
+  refCnt = 1;
+#if MULTITHREADED
+  gInitMutex(&mutex);
+#endif
+}
+
+CMap::CMap(GooString *collectionA, GooString *cMapNameA, int wModeA) {
+  collection = collectionA;
+  cMapName = cMapNameA;
+  isIdent = gTrue;
+  wMode = wModeA;
+  vector = NULL;
+  refCnt = 1;
+#if MULTITHREADED
+  gInitMutex(&mutex);
+#endif
+}
+
+void CMap::useCMap(CMapCache *cache, char *useName) {
+  GooString *useNameStr;
+  CMap *subCMap;
+
+  useNameStr = new GooString(useName);
+  // if cache is non-NULL, we already have a lock, and we can use
+  // CMapCache::getCMap() directly; otherwise, we need to use
+  // GlobalParams::getCMap() in order to acqure the lock need to use
+  // GlobalParams::getCMap
+  if (cache) {
+    subCMap = cache->getCMap(collection, useNameStr, NULL);
+  } else {
+    subCMap = globalParams->getCMap(collection, useNameStr);
+  }
+  delete useNameStr;
+  if (!subCMap) {
+    return;
+  }
+  isIdent = subCMap->isIdent;
+  if (subCMap->vector) {
+    copyVector(vector, subCMap->vector);
+  }
+  subCMap->decRefCnt();
+}
+
+void CMap::useCMap(CMapCache *cache, Object *obj) {
+  CMap *subCMap;
+
+  subCMap = CMap::parse(cache, collection, obj);
+  if (!subCMap) {
+    return;
+  }
+  isIdent = subCMap->isIdent;
+  if (subCMap->vector) {
+    copyVector(vector, subCMap->vector);
+  }
+  subCMap->decRefCnt();
+}
+
+void CMap::copyVector(CMapVectorEntry *dest, CMapVectorEntry *src) {
+  int i, j;
+
+  for (i = 0; i < 256; ++i) {
+    if (src[i].isVector) {
+      if (!dest[i].isVector) {
+       dest[i].isVector = gTrue;
+       dest[i].vector =
+         (CMapVectorEntry *)gmallocn(256, sizeof(CMapVectorEntry));
+       for (j = 0; j < 256; ++j) {
+         dest[i].vector[j].isVector = gFalse;
+         dest[i].vector[j].cid = 0;
+       }
+      }
+      copyVector(dest[i].vector, src[i].vector);
+    } else {
+      if (dest[i].isVector) {
+       error(errSyntaxError, -1, "Collision in usecmap");
+      } else {
+       dest[i].cid = src[i].cid;
+      }
+    }
+  }
+}
+
+void CMap::addCIDs(Guint start, Guint end, Guint nBytes, CID firstCID) {
+  CMapVectorEntry *vec;
+  CID cid;
+  int byte;
+  Guint i, j;
+
+  vec = vector;
+  for (i = nBytes - 1; i >= 1; --i) {
+    byte = (start >> (8 * i)) & 0xff;
+    if (!vec[byte].isVector) {
+      vec[byte].isVector = gTrue;
+      vec[byte].vector =
+         (CMapVectorEntry *)gmallocn(256, sizeof(CMapVectorEntry));
+      for (j = 0; j < 256; ++j) {
+       vec[byte].vector[j].isVector = gFalse;
+       vec[byte].vector[j].cid = 0;
+      }
+    }
+    vec = vec[byte].vector;
+  }
+  cid = firstCID;
+  for (byte = (int)(start & 0xff); byte <= (int)(end & 0xff); ++byte) {
+    if (vec[byte].isVector) {
+      error(errSyntaxError, -1,
+           "Invalid CID ({0:x} - {1:x} [{2:d} bytes]) in CMap",
+           start, end, nBytes);
+    } else {
+      vec[byte].cid = cid;
+    }
+    ++cid;
+  }
+}
+
+CMap::~CMap() {
+  delete collection;
+  delete cMapName;
+  if (vector) {
+    freeCMapVector(vector);
+  }
+#if MULTITHREADED
+  gDestroyMutex(&mutex);
+#endif
+}
+
+void CMap::freeCMapVector(CMapVectorEntry *vec) {
+  int i;
+
+  for (i = 0; i < 256; ++i) {
+    if (vec[i].isVector) {
+      freeCMapVector(vec[i].vector);
+    }
+  }
+  gfree(vec);
+}
+
+void CMap::incRefCnt() {
+#if MULTITHREADED
+  gLockMutex(&mutex);
+#endif
+  ++refCnt;
+#if MULTITHREADED
+  gUnlockMutex(&mutex);
+#endif
+}
+
+void CMap::decRefCnt() {
+  GBool done;
+
+#if MULTITHREADED
+  gLockMutex(&mutex);
+#endif
+  done = --refCnt == 0;
+#if MULTITHREADED
+  gUnlockMutex(&mutex);
+#endif
+  if (done) {
+    delete this;
+  }
+}
+
+GBool CMap::match(GooString *collectionA, GooString *cMapNameA) {
+  return !collection->cmp(collectionA) && !cMapName->cmp(cMapNameA);
+}
+
+CID CMap::getCID(char *s, int len, CharCode *c, int *nUsed) {
+  CMapVectorEntry *vec;
+  CharCode cc;
+  int n, i;
+
+  vec = vector;
+  cc = 0;
+  n = 0;
+  while (vec && n < len) {
+    i = s[n++] & 0xff;
+    cc = (cc << 8) | i;
+    if (!vec[i].isVector) {
+      *c = cc;
+      *nUsed = n;
+      return vec[i].cid;
+    }
+    vec = vec[i].vector;
+  }
+  if (isIdent && len >= 2) {
+    // identity CMap
+    *nUsed = 2;
+    *c = cc = ((s[0] & 0xff) << 8) + (s[1] & 0xff);
+    return cc;
+  }
+  *nUsed = 1;
+  *c = s[0] & 0xff;
+  return 0;
+}
+
+void CMap::setReverseMapVector(Guint startCode, CMapVectorEntry *vec,
+ Guint *rmap, Guint rmapSize, Guint ncand) {
+  int i;
+
+  if (vec == 0) return;
+  for (i = 0;i < 256;i++) {
+    if (vec[i].isVector) {
+      setReverseMapVector((startCode+i) << 8,
+         vec[i].vector,rmap,rmapSize,ncand);
+    } else {
+      Guint cid = vec[i].cid;
+
+      if (cid < rmapSize) {
+       Guint cand;
+
+       for (cand = 0;cand < ncand;cand++) {
+         Guint code = startCode+i;
+         Guint idx = cid*ncand+cand;
+         if (rmap[idx] == 0) {
+           rmap[idx] = code;
+           break;
+         } else if (rmap[idx] == code) {
+           break;
+         }
+       }
+      }
+    }
+  }
+}
+
+void CMap::setReverseMap(Guint *rmap, Guint rmapSize, Guint ncand) {
+  setReverseMapVector(0,vector,rmap,rmapSize,ncand);
+}
+
+//------------------------------------------------------------------------
+
+CMapCache::CMapCache() {
+  int i;
+
+  for (i = 0; i < cMapCacheSize; ++i) {
+    cache[i] = NULL;
+  }
+}
+
+CMapCache::~CMapCache() {
+  int i;
+
+  for (i = 0; i < cMapCacheSize; ++i) {
+    if (cache[i]) {
+      cache[i]->decRefCnt();
+    }
+  }
+}
+
+CMap *CMapCache::getCMap(GooString *collection, GooString *cMapName, Stream *stream) {
+  CMap *cmap;
+  int i, j;
+
+  if (cache[0] && cache[0]->match(collection, cMapName)) {
+    cache[0]->incRefCnt();
+    return cache[0];
+  }
+  for (i = 1; i < cMapCacheSize; ++i) {
+    if (cache[i] && cache[i]->match(collection, cMapName)) {
+      cmap = cache[i];
+      for (j = i; j >= 1; --j) {
+       cache[j] = cache[j - 1];
+      }
+      cache[0] = cmap;
+      cmap->incRefCnt();
+      return cmap;
+    }
+  }
+  if ((cmap = CMap::parse(this, collection, cMapName, stream))) {
+    if (cache[cMapCacheSize - 1]) {
+      cache[cMapCacheSize - 1]->decRefCnt();
+    }
+    for (j = cMapCacheSize - 1; j >= 1; --j) {
+      cache[j] = cache[j - 1];
+    }
+    cache[0] = cmap;
+    cmap->incRefCnt();
+    return cmap;
+  }
+  return NULL;
+}
diff --git a/poppler/CMap.h b/poppler/CMap.h
new file mode 100644 (file)
index 0000000..f4f5a91
--- /dev/null
@@ -0,0 +1,145 @@
+//========================================================================
+//
+// CMap.h
+//
+// Copyright 2001-2003 Glyph & Cog, LLC
+//
+//========================================================================
+
+//========================================================================
+//
+// Modified under the Poppler project - http://poppler.freedesktop.org
+//
+// All changes made under the Poppler project to this file are licensed
+// under GPL version 2 or later
+//
+// Copyright (C) 2008 Koji Otani <sho@bbr.jp>
+// Copyright (C) 2009 Albert Astals Cid <aacid@kde.org>
+// Copyright (C) 2012 Adrian Johnson <ajohnson@redneon.com>
+//
+// To see a description of the changes please see the Changelog file that
+// came with your tarball or type make ChangeLog if you are building from git
+//
+//========================================================================
+
+#ifndef CMAP_H
+#define CMAP_H
+
+#ifdef USE_GCC_PRAGMAS
+#pragma interface
+#endif
+
+#include "poppler-config.h"
+#include "goo/gtypes.h"
+#include "CharTypes.h"
+
+#if MULTITHREADED
+#include "goo/GooMutex.h"
+#endif
+
+class GooString;
+class Object;
+struct CMapVectorEntry;
+class CMapCache;
+class Stream;
+
+//------------------------------------------------------------------------
+
+class CMap {
+public:
+
+  // Parse a CMap from <obj>, which can be a name or a stream.  Sets
+  // the initial reference count to 1.  Returns NULL on failure.
+  static CMap *parse(CMapCache *cache, GooString *collectionA, Object *obj);
+
+  // Create the CMap specified by <collection> and <cMapName>.  Sets
+  // the initial reference count to 1.  Returns NULL on failure.
+  static CMap *parse(CMapCache *cache, GooString *collectionA,
+                    GooString *cMapNameA);
+
+  // Parse a CMap from <str>.  Sets the initial reference count to 1.
+  // Returns NULL on failure.
+  static CMap *parse(CMapCache *cache, GooString *collectionA, Stream *str);
+
+  // Create the CMap specified by <collection> and <cMapName>.  Sets
+  // the initial reference count to 1.
+  // Stream is a stream containing the CMap, can be NULL and 
+  // this means the CMap will be searched in the CMap files
+  // Returns NULL on failure.
+  static CMap *parse(CMapCache *cache, GooString *collectionA,
+                    GooString *cMapNameA, Stream *stream);
+
+  ~CMap();
+
+  void incRefCnt();
+  void decRefCnt();
+
+  // Return collection name (<registry>-<ordering>).
+  GooString *getCollection() { return collection; }
+
+  GooString *getCMapName() { return cMapName; }
+
+  // Return true if this CMap matches the specified <collectionA>, and
+  // <cMapNameA>.
+  GBool match(GooString *collectionA, GooString *cMapNameA);
+
+  // Return the CID corresponding to the character code starting at
+  // <s>, which contains <len> bytes.  Sets *<c> to the char code, and
+  // *<nUsed> to the number of bytes used by the char code.
+  CID getCID(char *s, int len, CharCode *c, int *nUsed);
+
+  // Return the writing mode (0=horizontal, 1=vertical).
+  int getWMode() { return wMode; }
+
+  void setReverseMap(Guint *rmap, Guint rmapSize, Guint ncand);
+
+private:
+
+  void parse2(CMapCache *cache, int (*getCharFunc)(void *), void *data);
+  CMap(GooString *collectionA, GooString *cMapNameA);
+  CMap(GooString *collectionA, GooString *cMapNameA, int wModeA);
+  void useCMap(CMapCache *cache, char *useName);
+  void useCMap(CMapCache *cache, Object *obj);
+  void copyVector(CMapVectorEntry *dest, CMapVectorEntry *src);
+  void addCIDs(Guint start, Guint end, Guint nBytes, CID firstCID);
+  void freeCMapVector(CMapVectorEntry *vec);
+  void setReverseMapVector(Guint startCode, CMapVectorEntry *vec,
+          Guint *rmap, Guint rmapSize, Guint ncand);
+
+  GooString *collection;
+  GooString *cMapName;
+  GBool isIdent;               // true if this CMap is an identity mapping,
+                               //   or is based on one (via usecmap)
+  int wMode;                   // writing mode (0=horizontal, 1=vertical)
+  CMapVectorEntry *vector;     // vector for first byte (NULL for
+                               //   identity CMap)
+  int refCnt;
+#if MULTITHREADED
+  GooMutex mutex;
+#endif
+};
+
+//------------------------------------------------------------------------
+
+#define cMapCacheSize 4
+
+class CMapCache {
+public:
+
+  CMapCache();
+  ~CMapCache();
+
+  // Get the <cMapName> CMap for the specified character collection.
+  // Increments its reference count; there will be one reference for
+  // the cache plus one for the caller of this function.
+  // Stream is a stream containing the CMap, can be NULL and 
+  // this means the CMap will be searched in the CMap files
+  // Returns NULL on failure.
+  CMap *getCMap(GooString *collection, GooString *cMapName, Stream *stream);
+
+private:
+
+  CMap *cache[cMapCacheSize];
+};
+
+#endif
diff --git a/poppler/CachedFile.cc b/poppler/CachedFile.cc
new file mode 100644 (file)
index 0000000..4c20dae
--- /dev/null
@@ -0,0 +1,256 @@
+//========================================================================
+//
+// CachedFile.cc
+//
+// This file is licensed under the GPLv2 or later
+//
+// Copyright 2009 Stefan Thomas <thomas@eload24.com>
+// Copyright 2010, 2011 Hib Eris <hib@hiberis.nl>
+// Copyright 2010 Albert Astals Cid <aacid@kde.org>
+//
+//========================================================================
+
+#include <config.h>
+#include "CachedFile.h"
+
+//------------------------------------------------------------------------
+// CachedFile
+//------------------------------------------------------------------------
+
+CachedFile::CachedFile(CachedFileLoader *cachedFileLoaderA, GooString *uriA)
+{
+  uri = uriA;
+  loader = cachedFileLoaderA;
+
+  streamPos = 0;
+  chunks = new std::vector<Chunk>();
+  length = 0;
+
+  length = loader->init(uri, this);
+  refCnt = 1;
+
+  if (length != ((size_t) -1)) {
+    chunks->resize(length/CachedFileChunkSize + 1);
+  }
+  else {
+    error(errInternal, -1, "Failed to initialize file cache for '{0:t}'.", uri);
+    chunks->resize(0);
+  }
+}
+
+CachedFile::~CachedFile()
+{
+  delete uri;
+  delete loader;
+  delete chunks;
+}
+
+void CachedFile::incRefCnt() {
+  refCnt++;
+}
+
+void CachedFile::decRefCnt() {
+  if (--refCnt == 0)
+    delete this;
+}
+
+long int CachedFile::tell() {
+  return streamPos;
+}
+
+int CachedFile::seek(long int offset, int origin)
+{
+  if (origin == SEEK_SET) {
+    streamPos = offset;
+  } else if (origin == SEEK_CUR) {
+    streamPos += offset;
+  } else {
+    streamPos = length + offset;
+  }
+
+  if (streamPos > length) {
+    streamPos = 0;
+    return 1;
+  }
+
+  return 0;
+}
+
+int CachedFile::cache(const std::vector<ByteRange> &origRanges)
+{
+  std::vector<int> loadChunks;
+  int numChunks = length/CachedFileChunkSize + 1;
+  std::vector<bool> chunkNeeded(numChunks);
+  int startChunk, endChunk;
+  std::vector<ByteRange> chunk_ranges, all;
+  ByteRange range;
+  const std::vector<ByteRange> *ranges = &origRanges;
+
+  if (ranges->empty()) {
+    range.offset = 0;
+    range.length = length;
+    all.push_back(range);
+    ranges = &all;
+  }
+
+  for (int i = 0; i < numChunks; ++i)
+    chunkNeeded[i] = false;
+  for (size_t i = 0; i < ranges->size(); i++) {
+
+    if ((*ranges)[i].length == 0) continue;
+    if ((*ranges)[i].offset >= length) continue;
+
+    size_t start = (*ranges)[i].offset;
+    size_t end = start + (*ranges)[i].length - 1;
+    if (end >= length) end = length - 1;
+
+    startChunk = start / CachedFileChunkSize;
+    endChunk = end / CachedFileChunkSize;
+    for (int chunk = startChunk; chunk <= endChunk; chunk++) {
+      if ((*chunks)[chunk].state == chunkStateNew) {
+           chunkNeeded[chunk] = true;
+      }
+    }
+  }
+
+  int chunk = 0;
+  while (chunk < numChunks) {
+    while (!chunkNeeded[chunk] && (++chunk != numChunks)) ;
+    if (chunk == numChunks) break;
+    startChunk = chunk;
+    loadChunks.push_back(chunk);
+
+    while ((++chunk != numChunks) && chunkNeeded[chunk]) {
+      loadChunks.push_back(chunk);
+    }
+    endChunk = chunk - 1;
+
+    range.offset = startChunk * CachedFileChunkSize;
+    range.length = (endChunk - startChunk + 1) * CachedFileChunkSize;
+
+    chunk_ranges.push_back(range);
+  }
+
+  if (chunk_ranges.size() > 0) {
+    CachedFileWriter writer =
+        CachedFileWriter(this, &loadChunks);
+    return loader->load(chunk_ranges, &writer);
+  }
+
+  return 0;
+}
+
+size_t CachedFile::read(void *ptr, size_t unitsize, size_t count)
+{
+  size_t bytes = unitsize*count;
+  if (length < (streamPos + bytes)) {
+    bytes = length - streamPos;
+  }
+
+  if (bytes == 0) return 0;
+
+  // Load data
+  if (cache(streamPos, bytes) != 0) return 0;
+
+  // Copy data to buffer
+  size_t toCopy = bytes;
+  while (toCopy) {
+    int chunk = streamPos / CachedFileChunkSize;
+    int offset = streamPos % CachedFileChunkSize;
+    size_t len = CachedFileChunkSize-offset;
+
+    if (len > toCopy)
+      len = toCopy;
+
+    memcpy(ptr, (*chunks)[chunk].data + offset, len);
+    streamPos += len;
+    toCopy -= len;
+    ptr = (char*)ptr + len;
+  }
+
+  return bytes;
+}
+
+int CachedFile::cache(size_t offset, size_t length)
+{
+  std::vector<ByteRange> r;
+  ByteRange range;
+  range.offset = offset;
+  range.length = length;
+  r.push_back(range);
+  return cache(r);
+}
+
+//------------------------------------------------------------------------
+// CachedFileWriter
+//------------------------------------------------------------------------
+
+CachedFileWriter::CachedFileWriter(CachedFile *cachedFileA, std::vector<int> *chunksA)
+{
+   cachedFile = cachedFileA;
+   chunks = chunksA;
+
+   if (chunks) {
+     offset = 0;
+     it = (*chunks).begin();
+   }
+}
+
+CachedFileWriter::~CachedFileWriter()
+{
+}
+
+size_t CachedFileWriter::write(const char *ptr, size_t size)
+{
+  const char *cp = ptr;
+  size_t len = size;
+  size_t nfree, ncopy;
+  size_t written = 0;
+  size_t chunk;
+
+  if (!len) return 0;
+
+  while (len) {
+    if (chunks) {
+      if (offset == CachedFileChunkSize) {
+         it++;
+         if (it == (*chunks).end()) return written;
+         offset = 0;
+      }
+      chunk = *it;
+    } else {
+      offset = cachedFile->length % CachedFileChunkSize;
+      chunk = cachedFile->length / CachedFileChunkSize;
+    }
+
+    if (chunk >= cachedFile->chunks->size()) {
+       cachedFile->chunks->resize(chunk + 1);
+    }
+
+    nfree = CachedFileChunkSize - offset;
+    ncopy = (len >= nfree) ? nfree : len;
+    memcpy(&((*cachedFile->chunks)[chunk].data[offset]), cp, ncopy);
+    len -= ncopy;
+    cp += ncopy;
+    offset += ncopy;
+    written += ncopy;
+
+    if (!chunks) {
+      cachedFile->length += ncopy;
+    }
+
+    if (offset == CachedFileChunkSize) {
+       (*cachedFile->chunks)[chunk].state = CachedFile::chunkStateLoaded;
+    }
+  }
+
+  if ((chunk == (cachedFile->length / CachedFileChunkSize)) &&
+      (offset == (cachedFile->length % CachedFileChunkSize))) {
+     (*cachedFile->chunks)[chunk].state = CachedFile::chunkStateLoaded;
+  }
+
+  return written;
+}
+
+//------------------------------------------------------------------------
+
diff --git a/poppler/CachedFile.h b/poppler/CachedFile.h
new file mode 100644 (file)
index 0000000..b99ea1e
--- /dev/null
@@ -0,0 +1,146 @@
+//========================================================================
+//
+// CachedFile.h
+//
+// Caching files support.
+//
+// This file is licensed under the GPLv2 or later
+//
+// Copyright 2009 Stefan Thomas <thomas@eload24.com>
+// Copyright 2010 Hib Eris <hib@hiberis.nl>
+// Copyright 2010 Albert Astals Cid <aacid@kde.org>
+//
+//========================================================================
+
+#ifndef CACHEDFILE_H
+#define CACHEDFILE_H
+
+#include "poppler-config.h"
+
+#include "goo/gtypes.h"
+#include "Object.h"
+#include "Stream.h"
+
+#include <vector>
+
+//------------------------------------------------------------------------
+
+#define CachedFileChunkSize 8192 // This should be a multiple of cachedStreamBufSize
+
+class GooString;
+class CachedFileLoader;
+
+//------------------------------------------------------------------------
+// CachedFile
+//
+// CachedFile gives FILE-like access to a document at a specified URI.
+// In the constructor, you specify a CachedFileLoader that handles loading
+// the data from the document. The CachedFile requests no more data then it
+// needs from the CachedFileLoader.
+//------------------------------------------------------------------------
+
+class CachedFile {
+
+friend class CachedFileWriter;
+
+public:
+
+  CachedFile(CachedFileLoader *cacheLoader, GooString *uri);
+
+  Guint getLength() { return length; }
+  long int tell();
+  int seek(long int offset, int origin);
+  size_t read(void * ptr, size_t unitsize, size_t count);
+  size_t write(const char *ptr, size_t size, size_t fromByte);
+  int cache(const std::vector<ByteRange> &ranges);
+
+  // Reference counting.
+  void incRefCnt();
+  void decRefCnt();
+
+private:
+
+  ~CachedFile();
+
+  enum ChunkState {
+    chunkStateNew = 0,
+    chunkStateLoaded
+  };
+
+  typedef struct {
+    ChunkState state;
+    char data[CachedFileChunkSize];
+  } Chunk;
+
+  int cache(size_t offset, size_t length);
+
+  CachedFileLoader *loader;
+  GooString *uri;
+
+  size_t length;
+  size_t streamPos;
+
+  std::vector<Chunk> *chunks;
+
+  int refCnt;  // reference count
+
+};
+
+//------------------------------------------------------------------------
+// CachedFileWriter
+//
+// CachedFileWriter handles sequential writes to a CachedFile.
+// On construction, you specify the CachedFile and the chunks of it to which data
+// should be written.
+//------------------------------------------------------------------------
+
+class CachedFileWriter {
+
+public:
+
+  // Construct a CachedFile Writer.
+  // The caller is responsible for deleting the cachedFile and chunksA.
+  CachedFileWriter(CachedFile *cachedFile, std::vector<int> *chunksA);
+
+  ~CachedFileWriter();
+
+  // Writes size bytes from ptr to cachedFile, returns number of bytes written.
+  size_t write(const char *ptr, size_t size);
+
+private:
+
+  CachedFile *cachedFile;
+  std::vector<int> *chunks;
+  std::vector<int>::iterator it;
+  size_t offset;
+
+};
+
+//------------------------------------------------------------------------
+// CachedFileLoader
+//
+// CachedFileLoader is an abstact class that specifies the interface for
+// loadng data from an URI into a CachedFile.
+//------------------------------------------------------------------------
+
+class CachedFileLoader {
+
+public:
+
+  virtual ~CachedFileLoader() {};
+
+  // Initializes the file load.
+  // Returns the length of the file.
+  // The caller is responsible for deleting uri and cachedFile.
+  virtual size_t init(GooString *uri, CachedFile *cachedFile) = 0;
+
+  // Loads speficified byte ranges and passes it to the writer to store them.
+  // Returns 0 on success, Anything but 0 on failure.
+  // The caller is responsible for deleting the writer.
+  virtual int load(const std::vector<ByteRange> &ranges, CachedFileWriter *writer) = 0;
+
+};
+
+//------------------------------------------------------------------------
+
+#endif
diff --git a/poppler/CairoFontEngine.cc b/poppler/CairoFontEngine.cc
new file mode 100644 (file)
index 0000000..c4493e8
--- /dev/null
@@ -0,0 +1,804 @@
+//========================================================================
+//
+// CairoFontEngine.cc
+//
+// Copyright 2003 Glyph & Cog, LLC
+// Copyright 2004 Red Hat, Inc
+//
+//========================================================================
+
+//========================================================================
+//
+// Modified under the Poppler project - http://poppler.freedesktop.org
+//
+// All changes made under the Poppler project to this file are licensed
+// under GPL version 2 or later
+//
+// Copyright (C) 2005-2007 Jeff Muizelaar <jeff@infidigm.net>
+// Copyright (C) 2005, 2006 Kristian Høgsberg <krh@redhat.com>
+// Copyright (C) 2005 Martin Kretzschmar <martink@gnome.org>
+// Copyright (C) 2005, 2009, 2012 Albert Astals Cid <aacid@kde.org>
+// Copyright (C) 2006, 2007, 2010, 2011 Carlos Garcia Campos <carlosgc@gnome.org>
+// Copyright (C) 2007 Koji Otani <sho@bbr.jp>
+// Copyright (C) 2008, 2009 Chris Wilson <chris@chris-wilson.co.uk>
+// Copyright (C) 2008, 2012 Adrian Johnson <ajohnson@redneon.com>
+// Copyright (C) 2009 Darren Kenny <darren.kenny@sun.com>
+// Copyright (C) 2010 Suzuki Toshiya <mpsuzuki@hiroshima-u.ac.jp>
+// Copyright (C) 2010 Jan Kümmel <jan+freedesktop@snorc.org>
+// Copyright (C) 2012 Hib Eris <hib@hiberis.nl>
+//
+// To see a description of the changes please see the Changelog file that
+// came with your tarball or type make ChangeLog if you are building from git
+//
+//========================================================================
+
+#include <config.h>
+
+#include "config.h"
+#include <string.h>
+#include "CairoFontEngine.h"
+#include "CairoOutputDev.h"
+#include "GlobalParams.h"
+#include <fofi/FoFiTrueType.h>
+#include <fofi/FoFiType1C.h>
+#include "goo/gfile.h"
+#include "Error.h"
+#include "XRef.h"
+#include "Gfx.h"
+#include "Page.h"
+
+#if HAVE_FCNTL_H && HAVE_SYS_MMAN_H && HAVE_SYS_STAT_H
+#include <fcntl.h>
+#include <sys/stat.h>
+#include <sys/mman.h>
+#define CAN_CHECK_OPEN_FACES 1
+#endif
+
+#ifdef USE_GCC_PRAGMAS
+#pragma implementation
+#endif
+
+
+//------------------------------------------------------------------------
+// CairoFont
+//------------------------------------------------------------------------
+
+CairoFont::CairoFont(Ref ref,
+                    cairo_font_face_t *cairo_font_face,
+                    int *codeToGID,
+                    Guint codeToGIDLen,
+                    GBool substitute,
+                    GBool printing) : ref(ref),
+                                      cairo_font_face(cairo_font_face),
+                                      codeToGID(codeToGID),
+                                      codeToGIDLen(codeToGIDLen),
+                                      substitute(substitute),
+                                      printing(printing)      { }
+
+CairoFont::~CairoFont() {
+  cairo_font_face_destroy (cairo_font_face);
+  gfree(codeToGID);
+}
+
+GBool
+CairoFont::matches(Ref &other, GBool printingA) {
+  return (other.num == ref.num && other.gen == ref.gen);
+}
+
+cairo_font_face_t *
+CairoFont::getFontFace(void) {
+  return cairo_font_face;
+}
+
+unsigned long
+CairoFont::getGlyph(CharCode code,
+                   Unicode *u, int uLen) {
+  FT_UInt gid;
+
+  if (codeToGID && code < codeToGIDLen) {
+    gid = (FT_UInt)codeToGID[code];
+  } else {
+    gid = (FT_UInt)code;
+  }
+  return gid;
+}
+
+double
+CairoFont::getSubstitutionCorrection(GfxFont *gfxFont)
+{
+  double w1, w2;
+  CharCode code;
+  char *name;
+
+  // for substituted fonts: adjust the font matrix -- compare the
+  // width of 'm' in the original font and the substituted font
+  if (isSubstitute() && !gfxFont->isCIDFont()) {
+    for (code = 0; code < 256; ++code) {
+      if ((name = ((Gfx8BitFont *)gfxFont)->getCharName(code)) &&
+         name[0] == 'm' && name[1] == '\0') {
+       break;
+      }
+    }
+    if (code < 256) {
+      w1 = ((Gfx8BitFont *)gfxFont)->getWidth(code);
+      {
+       cairo_matrix_t m;
+       cairo_matrix_init_identity(&m);
+       cairo_font_options_t *options = cairo_font_options_create();
+       cairo_font_options_set_hint_style(options, CAIRO_HINT_STYLE_NONE);
+       cairo_font_options_set_hint_metrics(options, CAIRO_HINT_METRICS_OFF);
+       cairo_scaled_font_t *scaled_font = cairo_scaled_font_create(cairo_font_face, &m, &m, options);
+
+       cairo_text_extents_t extents;
+       cairo_scaled_font_text_extents(scaled_font, "m", &extents);
+
+       cairo_scaled_font_destroy(scaled_font);
+       cairo_font_options_destroy(options);
+       w2 = extents.x_advance;
+      }
+      if (!gfxFont->isSymbolic()) {
+       // if real font is substantially narrower than substituted
+       // font, reduce the font size accordingly
+       if (w1 > 0.01 && w1 < 0.9 * w2) {
+         w1 /= w2;
+         return w1;
+       }
+      }
+    }
+  }
+  return 1.0;
+}
+
+//------------------------------------------------------------------------
+// CairoFreeTypeFont
+//------------------------------------------------------------------------
+
+static cairo_user_data_key_t _ft_cairo_key;
+
+static void
+_ft_done_face_uncached (void *closure)
+{
+    FT_Face face = (FT_Face) closure;
+    FT_Done_Face (face);
+}
+
+static GBool
+_ft_new_face_uncached (FT_Library lib,
+                      const char *filename,
+                      char *font_data,
+                      int font_data_len,
+                      FT_Face *face_out,
+                      cairo_font_face_t **font_face_out)
+{
+  FT_Face face;
+  cairo_font_face_t *font_face;
+
+  if (font_data == NULL) {
+    if (FT_New_Face (lib, filename, 0, &face))
+      return gFalse;
+  } else {
+    if (FT_New_Memory_Face (lib, (unsigned char *)font_data, font_data_len, 0, &face))
+      return gFalse;
+  }
+
+  font_face = cairo_ft_font_face_create_for_ft_face (face,
+                                                         FT_LOAD_NO_HINTING |
+                                                         FT_LOAD_NO_BITMAP);
+  if (cairo_font_face_set_user_data (font_face,
+                                    &_ft_cairo_key,
+                                    face,
+                                    _ft_done_face_uncached))
+  {
+    _ft_done_face_uncached (face);
+    cairo_font_face_destroy (font_face);
+    return gFalse;
+  }
+
+  *face_out = face;
+  *font_face_out = font_face;
+  return gTrue;
+}
+
+#if CAN_CHECK_OPEN_FACES
+static struct _ft_face_data {
+  struct _ft_face_data *prev, *next, **head;
+
+  int fd;
+  unsigned long hash;
+  size_t size;
+  unsigned char *bytes;
+
+  FT_Library lib;
+  FT_Face face;
+  cairo_font_face_t *font_face;
+} *_ft_open_faces;
+
+static unsigned long
+_djb_hash (const unsigned char *bytes, size_t len)
+{
+  unsigned long hash = 5381;
+  while (len--) {
+    unsigned char c = *bytes++;
+    hash *= 33;
+    hash ^= c;
+  }
+  return hash;
+}
+
+static GBool
+_ft_face_data_equal (struct _ft_face_data *a, struct _ft_face_data *b)
+{
+  if (a->lib != b->lib)
+    return gFalse;
+  if (a->size != b->size)
+    return gFalse;
+  if (a->hash != b->hash)
+    return gFalse;
+
+  return memcmp (a->bytes, b->bytes, a->size) == 0;
+}
+
+static void
+_ft_done_face (void *closure)
+{
+  struct _ft_face_data *data = (struct _ft_face_data *) closure;
+
+  if (data->next)
+    data->next->prev = data->prev;
+  if (data->prev)
+    data->prev->next = data->next;
+  else
+    _ft_open_faces = data->next;
+
+#if defined(__SUNPRO_CC) && defined(__sun) && defined(__SVR4)
+  munmap ((char*)data->bytes, data->size);
+#else
+  munmap (data->bytes, data->size);
+#endif
+  close (data->fd);
+
+  FT_Done_Face (data->face);
+  gfree (data);
+}
+
+static GBool
+_ft_new_face (FT_Library lib,
+             const char *filename,
+             char *font_data,
+             int font_data_len,
+             FT_Face *face_out,
+             cairo_font_face_t **font_face_out)
+{
+  struct _ft_face_data *l;
+  struct stat st;
+  struct _ft_face_data tmpl;
+
+  tmpl.fd = -1;
+
+  if (font_data == NULL) {
+    /* if we fail to mmap the file, just pass it to FreeType instead */
+    tmpl.fd = open (filename, O_RDONLY);
+    if (tmpl.fd == -1)
+      return _ft_new_face_uncached (lib, filename, font_data, font_data_len, face_out, font_face_out);
+
+    if (fstat (tmpl.fd, &st) == -1) {
+      close (tmpl.fd);
+      return _ft_new_face_uncached (lib, filename, font_data, font_data_len, face_out, font_face_out);
+    }
+
+    tmpl.bytes = (unsigned char *) mmap (NULL, st.st_size,
+                                        PROT_READ, MAP_PRIVATE,
+                                        tmpl.fd, 0);
+    if (tmpl.bytes == MAP_FAILED) {
+      close (tmpl.fd);
+      return _ft_new_face_uncached (lib, filename, font_data, font_data_len, face_out, font_face_out);
+    }
+    tmpl.size = st.st_size;
+  } else {
+    tmpl.bytes = (unsigned char*) font_data;
+    tmpl.size = font_data_len;
+  }
+
+  /* check to see if this is a duplicate of any of the currently open fonts */
+  tmpl.lib = lib;
+  tmpl.hash = _djb_hash (tmpl.bytes, tmpl.size);
+
+  for (l = _ft_open_faces; l; l = l->next) {
+    if (_ft_face_data_equal (l, &tmpl)) {
+      if (tmpl.fd != -1) {
+#if defined(__SUNPRO_CC) && defined(__sun) && defined(__SVR4)
+        munmap ((char*)tmpl.bytes, tmpl.size);
+#else
+        munmap (tmpl.bytes, tmpl.size);
+#endif
+        close (tmpl.fd);
+      }
+      *face_out = l->face;
+      *font_face_out = cairo_font_face_reference (l->font_face);
+      return gTrue;
+    }
+  }
+
+  /* not a dup, open and insert into list */
+  if (FT_New_Memory_Face (lib,
+                         (FT_Byte *) tmpl.bytes, tmpl.size,
+                         0, &tmpl.face))
+  {
+    if (tmpl.fd != -1) {
+#if defined(__SUNPRO_CC) && defined(__sun) && defined(__SVR4)
+      munmap ((char*)tmpl.bytes, tmpl.size);
+#else
+      munmap (tmpl.bytes, tmpl.size);
+#endif
+
+      close (tmpl.fd);
+    }
+    return gFalse;
+  }
+
+  l = (struct _ft_face_data *) gmallocn (1, sizeof (struct _ft_face_data));
+  *l = tmpl;
+  l->prev = NULL;
+  l->next = _ft_open_faces;
+  if (_ft_open_faces)
+    _ft_open_faces->prev = l;
+  _ft_open_faces = l;
+
+  l->font_face = cairo_ft_font_face_create_for_ft_face (tmpl.face,
+                                                         FT_LOAD_NO_HINTING |
+                                                         FT_LOAD_NO_BITMAP);
+  if (cairo_font_face_set_user_data (l->font_face,
+                                    &_ft_cairo_key,
+                                    l,
+                                    _ft_done_face))
+  {
+    cairo_font_face_destroy (l->font_face);
+    _ft_done_face (l);
+    return gFalse;
+  }
+
+  *face_out = l->face;
+  *font_face_out = l->font_face;
+  return gTrue;
+}
+#else
+#define _ft_new_face _ft_new_face_uncached
+#endif
+
+CairoFreeTypeFont::CairoFreeTypeFont(Ref ref,
+                                    cairo_font_face_t *cairo_font_face,
+                                    int *codeToGID,
+                                    Guint codeToGIDLen,
+                                    GBool substitute) : CairoFont(ref,
+                                                                  cairo_font_face,
+                                                                  codeToGID,
+                                                                  codeToGIDLen,
+                                                                  substitute,
+                                                                  gTrue) { }
+
+CairoFreeTypeFont::~CairoFreeTypeFont() { }
+
+CairoFreeTypeFont *CairoFreeTypeFont::create(GfxFont *gfxFont, XRef *xref,
+                                            FT_Library lib, GBool useCIDs) {
+  Object refObj, strObj;
+  GooString *fileName;
+  char *fileNameC;
+  char *font_data;
+  int font_data_len;
+  int i, n;
+  GfxFontType fontType;
+  GfxFontLoc *fontLoc;
+  char **enc;
+  char *name;
+  FoFiTrueType *ff;
+  FoFiType1C *ff1c;
+  Ref ref;
+  FT_Face face;
+  cairo_font_face_t *font_face;
+
+  int *codeToGID;
+  Guint codeToGIDLen;
+  
+  codeToGID = NULL;
+  codeToGIDLen = 0;
+  font_data = NULL;
+  font_data_len = 0;
+  fileName = NULL;
+  fileNameC = NULL;
+
+  GBool substitute = gFalse;
+  
+  ref = *gfxFont->getID();
+  fontType = gfxFont->getType();
+
+  if (!(fontLoc = gfxFont->locateFont(xref, gFalse))) {
+    error(errSyntaxError, -1, "Couldn't find a font for '{0:s}'",
+       gfxFont->getName() ? gfxFont->getName()->getCString()
+                              : "(unnamed)");
+    goto err2;
+  }
+
+  // embedded font
+  if (fontLoc->locType == gfxFontLocEmbedded) {
+    font_data = gfxFont->readEmbFontFile(xref, &font_data_len);
+    if (NULL == font_data)
+      goto err2;
+
+  // external font
+  } else { // gfxFontLocExternal
+    fileName = fontLoc->path;
+    fontType = fontLoc->fontType;
+    substitute = gTrue;
+  }
+
+  if (fileName != NULL) {
+    fileNameC = fileName->getCString();
+  }
+
+  switch (fontType) {
+  case fontType1:
+  case fontType1C:
+  case fontType1COT:
+    if (! _ft_new_face (lib, fileNameC, font_data, font_data_len, &face, &font_face)) {
+      error(errSyntaxError, -1, "could not create type1 face");
+      goto err2;
+    }
+    
+    enc = ((Gfx8BitFont *)gfxFont)->getEncoding();
+    
+    codeToGID = (int *)gmallocn(256, sizeof(int));
+    codeToGIDLen = 256;
+    for (i = 0; i < 256; ++i) {
+      codeToGID[i] = 0;
+      if ((name = enc[i])) {
+       codeToGID[i] = FT_Get_Name_Index(face, name);
+      }
+    }
+    break;
+  case fontCIDType2:
+  case fontCIDType2OT:
+    codeToGID = NULL;
+    n = 0;
+    if (((GfxCIDFont *)gfxFont)->getCIDToGID()) {
+      n = ((GfxCIDFont *)gfxFont)->getCIDToGIDLen();
+      if (n) {
+       codeToGID = (int *)gmallocn(n, sizeof(int));
+       memcpy(codeToGID, ((GfxCIDFont *)gfxFont)->getCIDToGID(),
+               n * sizeof(int));
+      }
+    } else {
+      if (font_data != NULL) {
+        ff = FoFiTrueType::make(font_data, font_data_len);
+      } else {
+        ff = FoFiTrueType::load(fileNameC);
+      }
+      if (! ff)
+       goto err2;
+      codeToGID = ((GfxCIDFont *)gfxFont)->getCodeToGIDMap(ff, &n);
+      delete ff;
+    }
+    codeToGIDLen = n;
+    /* Fall through */
+  case fontTrueType:
+    if (font_data != NULL) {
+      ff = FoFiTrueType::make(font_data, font_data_len);
+    } else {
+      ff = FoFiTrueType::load(fileNameC);
+    }
+    if (! ff) {
+      error(errSyntaxError, -1, "failed to load truetype font\n");
+      goto err2;
+    }
+    /* This might be set already for the CIDType2 case */
+    if (fontType == fontTrueType) {
+      codeToGID = ((Gfx8BitFont *)gfxFont)->getCodeToGIDMap(ff);
+      codeToGIDLen = 256;
+    }
+    delete ff;
+    if (! _ft_new_face (lib, fileNameC, font_data, font_data_len, &face, &font_face)) {
+      error(errSyntaxError, -1, "could not create truetype face\n");
+      goto err2;
+    }
+    break;
+    
+  case fontCIDType0:
+  case fontCIDType0C:
+
+    codeToGID = NULL;
+    codeToGIDLen = 0;
+
+    if (!useCIDs)
+    {
+      if (font_data != NULL) {
+        ff1c = FoFiType1C::make(font_data, font_data_len);
+      } else {
+        ff1c = FoFiType1C::load(fileNameC);
+      }
+      if (ff1c) {
+        codeToGID = ff1c->getCIDToGIDMap((int *)&codeToGIDLen);
+        delete ff1c;
+      }
+    }
+
+    if (! _ft_new_face (lib, fileNameC, font_data, font_data_len, &face, &font_face)) {
+      gfree(codeToGID);
+      codeToGID = NULL;
+      error(errSyntaxError, -1, "could not create cid face\n");
+      goto err2;
+    }
+    break;
+    
+  default:
+    fprintf (stderr, "font type %d not handled\n", (int)fontType);
+    goto err2;
+    break;
+  }
+
+  delete fontLoc;
+  return new CairoFreeTypeFont(ref,
+                      font_face,
+                      codeToGID, codeToGIDLen,
+                      substitute);
+
+ err2:
+  /* hmm? */
+  delete fontLoc;
+  fprintf (stderr, "some font thing failed\n");
+  return NULL;
+}
+
+//------------------------------------------------------------------------
+// CairoType3Font
+//------------------------------------------------------------------------
+
+static const cairo_user_data_key_t type3_font_key = {0};
+
+typedef struct _type3_font_info {
+  GfxFont *font;
+  PDFDoc *doc;
+  CairoFontEngine *fontEngine;
+  GBool printing;
+} type3_font_info_t;
+
+static void
+_free_type3_font_info(void *closure)
+{
+  type3_font_info_t *info = (type3_font_info_t *) closure;
+
+  info->font->decRefCnt();
+  free (info);
+}
+
+static cairo_status_t
+_init_type3_glyph (cairo_scaled_font_t  *scaled_font,
+                   cairo_t              *cr,
+                   cairo_font_extents_t *extents)
+{
+  type3_font_info_t *info;
+  GfxFont *font;
+  double *mat;
+
+  info = (type3_font_info_t *)
+    cairo_font_face_get_user_data (cairo_scaled_font_get_font_face (scaled_font),
+                                  &type3_font_key);
+  font = info->font;
+  mat = font->getFontBBox();
+  extents->ascent = mat[3]; /* y2 */
+  extents->descent = -mat[3]; /* -y1 */
+  extents->height = extents->ascent + extents->descent;
+  extents->max_x_advance = mat[2] - mat[1]; /* x2 - x1 */
+  extents->max_y_advance = 0;
+
+  return CAIRO_STATUS_SUCCESS;
+}
+
+static cairo_status_t
+_render_type3_glyph (cairo_scaled_font_t  *scaled_font,
+                    unsigned long         glyph,
+                    cairo_t              *cr,
+                    cairo_text_extents_t *metrics)
+{
+  Dict *charProcs;
+  Object charProc;
+  CairoOutputDev *output_dev;
+  cairo_matrix_t matrix, invert_y_axis;
+  double *mat;
+  double wx, wy;
+  PDFRectangle box;
+  type3_font_info_t *info;
+  GfxFont *font;
+  Dict *resDict;
+  Gfx *gfx;
+
+  info = (type3_font_info_t *)
+    cairo_font_face_get_user_data (cairo_scaled_font_get_font_face (scaled_font),
+                                  &type3_font_key);
+
+  font = info->font;
+  resDict = ((Gfx8BitFont *)font)->getResources();
+  charProcs = ((Gfx8BitFont *)(info->font))->getCharProcs();
+  if (!charProcs)
+    return CAIRO_STATUS_USER_FONT_ERROR;
+
+  if ((int)glyph >= charProcs->getLength())
+    return CAIRO_STATUS_USER_FONT_ERROR;
+
+  mat = font->getFontMatrix();
+  matrix.xx = mat[0];
+  matrix.yx = mat[1];
+  matrix.xy = mat[2];
+  matrix.yy = mat[3];
+  matrix.x0 = mat[4];
+  matrix.y0 = mat[5];
+  cairo_matrix_init_scale (&invert_y_axis, 1, -1);
+  cairo_matrix_multiply (&matrix, &matrix, &invert_y_axis);
+  cairo_transform (cr, &matrix);
+
+  output_dev = new CairoOutputDev();
+  output_dev->setCairo(cr);
+  output_dev->setPrinting(info->printing);
+
+  mat = font->getFontBBox();
+  box.x1 = mat[0];
+  box.y1 = mat[1];
+  box.x2 = mat[2];
+  box.y2 = mat[3];
+  gfx = new Gfx(info->doc, output_dev, resDict, &box, NULL);
+  output_dev->startDoc(info->doc, info->fontEngine);
+  output_dev->startPage (1, gfx->getState());
+  output_dev->setInType3Char(gTrue);
+  gfx->display(charProcs->getVal(glyph, &charProc));
+
+  output_dev->getType3GlyphWidth (&wx, &wy);
+  cairo_matrix_transform_distance (&matrix, &wx, &wy);
+  metrics->x_advance = wx;
+  metrics->y_advance = wy;
+  if (output_dev->hasType3GlyphBBox()) {
+    double *bbox = output_dev->getType3GlyphBBox();
+
+    cairo_matrix_transform_point (&matrix, &bbox[0], &bbox[1]);
+    cairo_matrix_transform_point (&matrix, &bbox[2], &bbox[3]);
+    metrics->x_bearing = bbox[0];
+    metrics->y_bearing = bbox[1];
+    metrics->width = bbox[2] - bbox[0];
+    metrics->height = bbox[3] - bbox[1];
+  }
+
+  delete gfx;
+  delete output_dev;
+  charProc.free();
+
+  return CAIRO_STATUS_SUCCESS;
+}
+
+
+CairoType3Font *CairoType3Font::create(GfxFont *gfxFont, PDFDoc *doc,
+                                      CairoFontEngine *fontEngine,
+                                      GBool printing) {
+  Object refObj, strObj;
+  type3_font_info_t *info;
+  cairo_font_face_t *font_face;
+  Ref ref;
+  int *codeToGID;
+  Guint codeToGIDLen;
+  int i, j;
+  char **enc;
+  Dict *charProcs;
+  char *name;
+
+  charProcs = ((Gfx8BitFont *)gfxFont)->getCharProcs();
+  info = (type3_font_info_t *) malloc(sizeof(*info));
+  ref = *gfxFont->getID();
+  font_face = cairo_user_font_face_create();
+  cairo_user_font_face_set_init_func (font_face, _init_type3_glyph);
+  cairo_user_font_face_set_render_glyph_func (font_face, _render_type3_glyph);
+  gfxFont->incRefCnt();
+  info->font = gfxFont;
+  info->doc = doc;
+  info->fontEngine = fontEngine;
+  info->printing = printing;
+
+  cairo_font_face_set_user_data (font_face, &type3_font_key, (void *) info, _free_type3_font_info);
+
+  enc = ((Gfx8BitFont *)gfxFont)->getEncoding();
+  codeToGID = (int *)gmallocn(256, sizeof(int));
+  codeToGIDLen = 256;
+  for (i = 0; i < 256; ++i) {
+    codeToGID[i] = 0;
+    if (charProcs && (name = enc[i])) {
+      for (j = 0; j < charProcs->getLength(); j++) {
+       if (strcmp(name, charProcs->getKey(j)) == 0) {
+         codeToGID[i] = j;
+       }
+      }
+    }
+  }
+
+  return new CairoType3Font(ref, doc, font_face, codeToGID, codeToGIDLen, printing);
+}
+
+CairoType3Font::CairoType3Font(Ref ref,
+                              PDFDoc *doc,
+                              cairo_font_face_t *cairo_font_face,
+                              int *codeToGID,
+                              Guint codeToGIDLen,
+                              GBool printing) : CairoFont(ref,
+                                                          cairo_font_face,
+                                                          codeToGID,
+                                                          codeToGIDLen,
+                                                          gFalse,
+                                                          printing),
+                                                doc(doc) { }
+
+CairoType3Font::~CairoType3Font() { }
+
+GBool
+CairoType3Font::matches(Ref &other, GBool printingA) {
+  return (other.num == ref.num && other.gen == ref.gen && printing == printingA);
+}
+
+
+//------------------------------------------------------------------------
+// CairoFontEngine
+//------------------------------------------------------------------------
+
+CairoFontEngine::CairoFontEngine(FT_Library libA) {
+  int i;
+
+  lib = libA;
+  for (i = 0; i < cairoFontCacheSize; ++i) {
+    fontCache[i] = NULL;
+  }
+  
+  FT_Int major, minor, patch;
+  // as of FT 2.1.8, CID fonts are indexed by CID instead of GID
+  FT_Library_Version(lib, &major, &minor, &patch);
+  useCIDs = major > 2 ||
+            (major == 2 && (minor > 1 || (minor == 1 && patch > 7)));
+}
+
+CairoFontEngine::~CairoFontEngine() {
+  int i;
+  
+  for (i = 0; i < cairoFontCacheSize; ++i) {
+    if (fontCache[i])
+      delete fontCache[i];
+  }
+}
+
+CairoFont *
+CairoFontEngine::getFont(GfxFont *gfxFont, PDFDoc *doc, GBool printing) {
+  int i, j;
+  Ref ref;
+  CairoFont *font;
+  GfxFontType fontType;
+  
+  ref = *gfxFont->getID();
+
+  for (i = 0; i < cairoFontCacheSize; ++i) {
+    font = fontCache[i];
+    if (font && font->matches(ref, printing)) {
+      for (j = i; j > 0; --j) {
+       fontCache[j] = fontCache[j-1];
+      }
+      fontCache[0] = font;
+      return font;
+    }
+  }
+  
+  fontType = gfxFont->getType();
+  if (fontType == fontType3)
+    font = CairoType3Font::create (gfxFont, doc, this, printing);
+  else
+    font = CairoFreeTypeFont::create (gfxFont, doc->getXRef(), lib, useCIDs);
+
+  //XXX: if font is null should we still insert it into the cache?
+  if (fontCache[cairoFontCacheSize - 1]) {
+    delete fontCache[cairoFontCacheSize - 1];
+  }
+  for (j = cairoFontCacheSize - 1; j > 0; --j) {
+    fontCache[j] = fontCache[j-1];
+  }
+  fontCache[0] = font;
+  return font;
+}
diff --git a/poppler/CairoFontEngine.h b/poppler/CairoFontEngine.h
new file mode 100644 (file)
index 0000000..6335348
--- /dev/null
@@ -0,0 +1,124 @@
+//========================================================================
+//
+// CairoFontEngine.h
+//
+// Copyright 2003 Glyph & Cog, LLC
+// Copyright 2004 Red Hat, Inc
+//
+//========================================================================
+
+//========================================================================
+//
+// Modified under the Poppler project - http://poppler.freedesktop.org
+//
+// All changes made under the Poppler project to this file are licensed
+// under GPL version 2 or later
+//
+// Copyright (C) 2005, 2006 Kristian Høgsberg <krh@redhat.com>
+// Copyright (C) 2005 Albert Astals Cid <aacid@kde.org>
+// Copyright (C) 2006, 2007 Jeff Muizelaar <jeff@infidigm.net>
+// Copyright (C) 2006, 2010 Carlos Garcia Campos <carlosgc@gnome.org>
+// Copyright (C) 2008 Adrian Johnson <ajohnson@redneon.com>
+//
+// To see a description of the changes please see the Changelog file that
+// came with your tarball or type make ChangeLog if you are building from git
+//
+//========================================================================
+
+#ifndef CAIROFONTENGINE_H
+#define CAIROFONTENGINE_H
+
+#ifdef USE_GCC_PRAGMAS
+#pragma interface
+#endif
+
+#include "goo/gtypes.h"
+#include <cairo-ft.h>
+
+#include "GfxFont.h"
+#include "PDFDoc.h"
+
+class CairoFontEngine;
+
+class CairoFont {
+public:
+  CairoFont(Ref ref,
+           cairo_font_face_t *face,
+           int *codeToGID,
+           Guint codeToGIDLen,
+           GBool substitute,
+           GBool printing);
+  virtual ~CairoFont();
+
+  virtual GBool matches(Ref &other, GBool printing);
+  cairo_font_face_t *getFontFace(void);
+  unsigned long getGlyph(CharCode code, Unicode *u, int uLen);
+  double getSubstitutionCorrection(GfxFont *gfxFont);
+
+  GBool isSubstitute() { return substitute; }
+protected:
+  Ref ref;
+  cairo_font_face_t *cairo_font_face;
+
+  int *codeToGID;
+  Guint codeToGIDLen;
+
+  GBool substitute;
+  GBool printing;
+};
+
+//------------------------------------------------------------------------
+
+class CairoFreeTypeFont : public CairoFont {
+public:
+  static CairoFreeTypeFont *create(GfxFont *gfxFont, XRef *xref, FT_Library lib, GBool useCIDs);
+  virtual ~CairoFreeTypeFont();
+
+private:
+  CairoFreeTypeFont(Ref ref, cairo_font_face_t *cairo_font_face,
+           int *codeToGID, Guint codeToGIDLen, GBool substitute);
+};
+
+//------------------------------------------------------------------------
+
+class CairoType3Font : public CairoFont {
+public:
+  static CairoType3Font *create(GfxFont *gfxFont, PDFDoc *doc,
+                               CairoFontEngine *fontEngine,
+                               GBool printing);
+  virtual ~CairoType3Font();
+
+  virtual GBool matches(Ref &other, GBool printing);
+
+private:
+  CairoType3Font(Ref ref, PDFDoc *doc,
+                cairo_font_face_t *cairo_font_face,
+                int *codeToGID, Guint codeToGIDLen,
+                GBool printing);
+  PDFDoc *doc;
+};
+
+//------------------------------------------------------------------------
+
+#define cairoFontCacheSize 64
+
+//------------------------------------------------------------------------
+// CairoFontEngine
+//------------------------------------------------------------------------
+
+class CairoFontEngine {
+public:
+
+  // Create a font engine.
+  CairoFontEngine(FT_Library libA);
+  ~CairoFontEngine();
+
+  CairoFont *getFont(GfxFont *gfxFont, PDFDoc *doc, GBool printing);
+
+private:
+  CairoFont *fontCache[cairoFontCacheSize];
+  FT_Library lib;
+  GBool useCIDs;
+};
+
+#endif
diff --git a/poppler/CairoOutputDev.cc b/poppler/CairoOutputDev.cc
new file mode 100644 (file)
index 0000000..b70183e
--- /dev/null
@@ -0,0 +1,3121 @@
+//========================================================================
+//
+// CairoOutputDev.cc
+//
+// Copyright 2003 Glyph & Cog, LLC
+// Copyright 2004 Red Hat, Inc
+//
+//========================================================================
+
+//========================================================================
+//
+// Modified under the Poppler project - http://poppler.freedesktop.org
+//
+// All changes made under the Poppler project to this file are licensed
+// under GPL version 2 or later
+//
+// Copyright (C) 2005-2008 Jeff Muizelaar <jeff@infidigm.net>
+// Copyright (C) 2005, 2006 Kristian Høgsberg <krh@redhat.com>
+// Copyright (C) 2005, 2009, 2012 Albert Astals Cid <aacid@kde.org>
+// Copyright (C) 2005 Nickolay V. Shmyrev <nshmyrev@yandex.ru>
+// Copyright (C) 2006-2011 Carlos Garcia Campos <carlosgc@gnome.org>
+// Copyright (C) 2008 Carl Worth <cworth@cworth.org>
+// Copyright (C) 2008-2012 Adrian Johnson <ajohnson@redneon.com>
+// Copyright (C) 2008 Michael Vrable <mvrable@cs.ucsd.edu>
+// Copyright (C) 2008, 2009 Chris Wilson <chris@chris-wilson.co.uk>
+// Copyright (C) 2008 Hib Eris <hib@hiberis.nl>
+// Copyright (C) 2009, 2010 David Benjamin <davidben@mit.edu>
+// Copyright (C) 2011, 2012 Thomas Freitag <Thomas.Freitag@alfa.de>
+// Copyright (C) 2012 Patrick Pfeifer <p2000@mailinator.com>
+//
+// To see a description of the changes please see the Changelog file that
+// came with your tarball or type make ChangeLog if you are building from git
+//
+//========================================================================
+
+#include <config.h>
+
+#ifdef USE_GCC_PRAGMAS
+#pragma implementation
+#endif
+
+#include <string.h>
+#include <math.h>
+#include <assert.h>
+#include <cairo.h>
+
+#include "goo/gfile.h"
+#include "goo/gtypes_p.h"
+#include "GlobalParams.h"
+#include "Error.h"
+#include "Object.h"
+#include "Gfx.h"
+#include "GfxState.h"
+#include "GfxFont.h"
+#include "Page.h"
+#include "Link.h"
+#include "FontEncodingTables.h"
+#include "PDFDocEncoding.h"
+#include <fofi/FoFiTrueType.h>
+#include <splash/SplashBitmap.h>
+#include "CairoOutputDev.h"
+#include "CairoFontEngine.h"
+#include "CairoRescaleBox.h"
+#include "UTF8.h"
+//------------------------------------------------------------------------
+
+// #define LOG_CAIRO
+
+#ifdef LOG_CAIRO
+#define LOG(x) (x)
+#else
+#define LOG(x)
+#endif
+
+static inline void printMatrix(cairo_matrix_t *matrix){
+       printf("%f %f, %f %f (%f %f)\n", matrix->xx, matrix->yx,
+                       matrix->xy, matrix->yy,
+                       matrix->x0, matrix->y0);
+}
+
+
+#define MIN(a,b) (((a) < (b)) ? (a) : (b))
+#define MAX(a,b) (((a) > (b)) ? (a) : (b))
+
+
+//------------------------------------------------------------------------
+// CairoImage
+//------------------------------------------------------------------------
+
+CairoImage::CairoImage (double x1, double y1, double x2, double y2) {
+  this->image = NULL;
+  this->x1 = x1;
+  this->y1 = y1;
+  this->x2 = x2;
+  this->y2 = y2;
+}
+
+CairoImage::~CairoImage () {
+  if (image)
+    cairo_surface_destroy (image);
+}
+
+void CairoImage::setImage (cairo_surface_t *image) {
+  if (this->image)
+    cairo_surface_destroy (this->image);
+  this->image = cairo_surface_reference (image);
+}
+
+//------------------------------------------------------------------------
+// CairoOutputDev
+//------------------------------------------------------------------------
+
+// We cannot tie the lifetime of an FT_Library object to that of
+// CairoOutputDev, since any FT_Faces created with it may end up with a
+// reference by Cairo which can be held long after the CairoOutputDev is
+// deleted.  The simplest way to avoid problems is to never tear down the
+// FT_Library instance; to avoid leaks, just use a single global instance
+// initialized the first time it is needed.
+FT_Library CairoOutputDev::ft_lib;
+GBool CairoOutputDev::ft_lib_initialized = gFalse;
+
+CairoOutputDev::CairoOutputDev() {
+  doc = NULL;
+
+  if (!ft_lib_initialized) {
+    FT_Init_FreeType(&ft_lib);
+    ft_lib_initialized = gTrue;
+  }
+
+  fontEngine = NULL;
+  fontEngine_owner = gFalse;
+  glyphs = NULL;
+  fill_pattern = NULL;
+  fill_color.r = fill_color.g = fill_color.b = 0;
+  stroke_pattern = NULL;
+  stroke_color.r = stroke_color.g = stroke_color.b = 0;
+  stroke_opacity = 1.0;
+  fill_opacity = 1.0;
+  textClipPath = NULL;
+  strokePathClip = NULL;
+  cairo = NULL;
+  currentFont = NULL;
+  prescaleImages = gTrue;
+  printing = gTrue;
+  use_show_text_glyphs = gFalse;
+  inType3Char = gFalse;
+  t3_glyph_has_bbox = gFalse;
+
+  groupColorSpaceStack = NULL;
+  maskStack = NULL;
+  group = NULL;
+  mask = NULL;
+  shape = NULL;
+  cairo_shape = NULL;
+  knockoutCount = 0;
+
+  text = NULL;
+  actualText = NULL;
+
+  // the SA parameter supposedly defaults to false, but Acrobat
+  // apparently hardwires it to true
+  stroke_adjust = globalParams->getStrokeAdjust();
+  align_stroke_coords = gFalse;
+  adjusted_stroke_width = gFalse;
+}
+
+CairoOutputDev::~CairoOutputDev() {
+  if (fontEngine_owner && fontEngine) {
+    delete fontEngine;
+  }
+
+  if (cairo)
+    cairo_destroy (cairo);
+  cairo_pattern_destroy (stroke_pattern);
+  cairo_pattern_destroy (fill_pattern);
+  if (group)
+    cairo_pattern_destroy (group);
+  if (mask)
+    cairo_pattern_destroy (mask);
+  if (shape)
+    cairo_pattern_destroy (shape);
+  if (text) 
+    text->decRefCnt();
+  if (actualText)
+    delete actualText;  
+}
+
+void CairoOutputDev::setCairo(cairo_t *cairo)
+{
+  if (this->cairo != NULL) {
+    cairo_status_t status = cairo_status (this->cairo);
+    if (status) {
+      error(errInternal, -1, "cairo context error: {0:s}\n", cairo_status_to_string(status));
+    }
+    cairo_destroy (this->cairo);
+    assert(!cairo_shape);
+  }
+  if (cairo != NULL) {
+    this->cairo = cairo_reference (cairo);
+       /* save the initial matrix so that we can use it for type3 fonts. */
+       //XXX: is this sufficient? could we miss changes to the matrix somehow?
+       cairo_get_matrix(cairo, &orig_matrix);
+  } else {
+    this->cairo = NULL;
+    this->cairo_shape = NULL;
+  }
+}
+
+void CairoOutputDev::setTextPage(TextPage *text)
+{
+  if (this->text) 
+    this->text->decRefCnt();
+  if (actualText)
+    delete actualText;
+  if (text) {
+    this->text = text;
+    this->text->incRefCnt();
+    actualText = new ActualText(text);
+  } else {
+    this->text = NULL;
+    actualText = NULL;
+  }
+}
+
+void CairoOutputDev::startDoc(PDFDoc *docA,
+                             CairoFontEngine *parentFontEngine) {
+  doc = docA;
+  if (parentFontEngine) {
+    fontEngine = parentFontEngine;
+  } else {
+    if (fontEngine) {
+      delete fontEngine;
+    }
+    fontEngine = new CairoFontEngine(ft_lib);
+    fontEngine_owner = gTrue;
+  }
+}
+
+void CairoOutputDev::startPage(int pageNum, GfxState *state) {
+  /* set up some per page defaults */
+  cairo_pattern_destroy(fill_pattern);
+  cairo_pattern_destroy(stroke_pattern);
+
+  fill_pattern = cairo_pattern_create_rgb(0., 0., 0.);
+  stroke_pattern = cairo_pattern_reference(fill_pattern);
+
+  if (text)
+    text->startPage(state);
+}
+
+void CairoOutputDev::endPage() {
+  if (text) {
+    text->endPage();
+    text->coalesce(gTrue, 0, gFalse);
+  }
+}
+
+void CairoOutputDev::saveState(GfxState *state) {
+  LOG(printf ("save\n"));
+  cairo_save (cairo);
+  if (cairo_shape)
+      cairo_save (cairo_shape);
+
+  MaskStack *ms = new MaskStack;
+  ms->mask = cairo_pattern_reference(mask);
+  ms->mask_matrix = mask_matrix;
+  ms->next = maskStack;
+  maskStack = ms;
+}
+
+void CairoOutputDev::restoreState(GfxState *state) {
+  LOG(printf ("restore\n"));
+  cairo_restore (cairo);
+  if (cairo_shape)
+      cairo_restore (cairo_shape);
+
+  /* These aren't restored by cairo_restore() since we keep them in
+   * the output device. */
+  updateFillColor(state);
+  updateStrokeColor(state);
+  updateFillOpacity(state);
+  updateStrokeOpacity(state);
+  updateBlendMode(state);
+
+  MaskStack* ms = maskStack;
+  if (ms) {
+    if (mask)
+      cairo_pattern_destroy(mask);
+    mask = ms->mask;
+    mask_matrix = ms->mask_matrix;
+    maskStack = ms->next;
+    delete ms;
+  }
+}
+
+void CairoOutputDev::updateAll(GfxState *state) {
+  updateLineDash(state);
+  updateLineJoin(state);
+  updateLineCap(state);
+  updateLineWidth(state);
+  updateFlatness(state);
+  updateMiterLimit(state);
+  updateFillColor(state);
+  updateStrokeColor(state);
+  updateFillOpacity(state);
+  updateStrokeOpacity(state);
+  updateBlendMode(state);
+  needFontUpdate = gTrue;
+  if (text)
+    text->updateFont(state);
+}
+
+void CairoOutputDev::setDefaultCTM(double *ctm) {
+  cairo_matrix_t matrix;
+  matrix.xx = ctm[0];
+  matrix.yx = ctm[1];
+  matrix.xy = ctm[2];
+  matrix.yy = ctm[3];
+  matrix.x0 = ctm[4];
+  matrix.y0 = ctm[5];
+
+  cairo_transform (cairo, &matrix);
+  if (cairo_shape)
+      cairo_transform (cairo_shape, &matrix);
+
+  OutputDev::setDefaultCTM(ctm);
+}
+
+void CairoOutputDev::updateCTM(GfxState *state, double m11, double m12,
+                               double m21, double m22,
+                               double m31, double m32) {
+  cairo_matrix_t matrix, invert_matrix;
+  matrix.xx = m11;
+  matrix.yx = m12;
+  matrix.xy = m21;
+  matrix.yy = m22;
+  matrix.x0 = m31;
+  matrix.y0 = m32;
+
+  /* Make sure the matrix is invertible before setting it.
+   * cairo will blow up if we give it a matrix that's not
+   * invertible, so we need to check before passing it
+   * to cairo_transform. Ignoring it is likely to give better
+   * results than not rendering anything at all. See #14398
+   *
+   * Ideally, we could do the cairo_transform
+   * and then check if anything went wrong and fix it then
+   * instead of having to invert the matrix. */
+  invert_matrix = matrix;
+  if (cairo_matrix_invert(&invert_matrix)) {
+    error(errSyntaxWarning, -1, "matrix not invertible\n");
+    return;
+  }
+
+  cairo_transform (cairo, &matrix);
+  if (cairo_shape)
+    cairo_transform (cairo_shape, &matrix);
+  updateLineDash(state);
+  updateLineJoin(state);
+  updateLineCap(state);
+  updateLineWidth(state);
+}
+
+void CairoOutputDev::updateLineDash(GfxState *state) {
+  double *dashPattern;
+  int dashLength;
+  double dashStart;
+
+  state->getLineDash(&dashPattern, &dashLength, &dashStart);
+  cairo_set_dash (cairo, dashPattern, dashLength, dashStart);
+  if (cairo_shape)
+    cairo_set_dash (cairo_shape, dashPattern, dashLength, dashStart);
+}
+
+void CairoOutputDev::updateFlatness(GfxState *state) {
+  // cairo_set_tolerance (cairo, state->getFlatness());
+}
+
+void CairoOutputDev::updateLineJoin(GfxState *state) {
+  switch (state->getLineJoin()) {
+  case 0:
+    cairo_set_line_join (cairo, CAIRO_LINE_JOIN_MITER);
+    break;
+  case 1:
+    cairo_set_line_join (cairo, CAIRO_LINE_JOIN_ROUND);
+    break;
+  case 2:
+    cairo_set_line_join (cairo, CAIRO_LINE_JOIN_BEVEL);
+    break;
+  }
+  if (cairo_shape)
+    cairo_set_line_join (cairo_shape, cairo_get_line_join(cairo));
+}
+
+void CairoOutputDev::updateLineCap(GfxState *state) {
+  switch (state->getLineCap()) {
+  case 0:
+    cairo_set_line_cap (cairo, CAIRO_LINE_CAP_BUTT);
+    break;
+  case 1:
+    cairo_set_line_cap (cairo, CAIRO_LINE_CAP_ROUND);
+    break;
+  case 2:
+    cairo_set_line_cap (cairo, CAIRO_LINE_CAP_SQUARE);
+    break;
+  }
+  if (cairo_shape)
+    cairo_set_line_cap (cairo_shape, cairo_get_line_cap(cairo));
+}
+
+void CairoOutputDev::updateMiterLimit(GfxState *state) {
+  cairo_set_miter_limit (cairo, state->getMiterLimit());
+  if (cairo_shape)
+    cairo_set_miter_limit (cairo_shape, state->getMiterLimit());
+}
+
+void CairoOutputDev::updateLineWidth(GfxState *state) {
+  LOG(printf ("line width: %f\n", state->getLineWidth()));
+  adjusted_stroke_width = gFalse;
+  double width = state->getLineWidth();
+  if (stroke_adjust && !printing) {
+    double x, y;
+    x = y = width;
+
+    /* find out line width in device units */
+    cairo_user_to_device_distance(cairo, &x, &y);
+    if (fabs(x) <= 1.0 && fabs(y) <= 1.0) {
+      /* adjust width to at least one device pixel */
+      x = y = 1.0;
+      cairo_device_to_user_distance(cairo, &x, &y);
+      width = MIN(fabs(x),fabs(y));
+      adjusted_stroke_width = gTrue;
+    }
+  } else if (width == 0.0) {
+    /* Cairo does not support 0 line width == 1 device pixel. Find out
+     * how big pixels (device unit) are in the x and y
+     * directions. Choose the smaller of the two as our line width.
+     */
+    double x = 1.0, y = 1.0;
+    if (printing) {
+      // assume printer pixel size is 1/600 inch
+      x = 72.0/600;
+      y = 72.0/600;
+    }
+    cairo_device_to_user_distance(cairo, &x, &y);
+    width = MIN(fabs(x),fabs(y));
+  }
+  cairo_set_line_width (cairo, width);
+  if (cairo_shape)
+    cairo_set_line_width (cairo_shape, cairo_get_line_width (cairo));
+}
+
+void CairoOutputDev::updateFillColor(GfxState *state) {
+  GfxRGB color = fill_color;
+
+  state->getFillRGB(&fill_color);
+  if (cairo_pattern_get_type (fill_pattern) != CAIRO_PATTERN_TYPE_SOLID ||
+      color.r != fill_color.r ||
+      color.g != fill_color.g ||
+      color.b != fill_color.b)
+  {
+    cairo_pattern_destroy(fill_pattern);
+    fill_pattern = cairo_pattern_create_rgba(colToDbl(fill_color.r),
+                                            colToDbl(fill_color.g),
+                                            colToDbl(fill_color.b),
+                                            fill_opacity);
+
+    LOG(printf ("fill color: %d %d %d\n",
+               fill_color.r, fill_color.g, fill_color.b));
+  }
+}
+
+void CairoOutputDev::updateStrokeColor(GfxState *state) {
+  GfxRGB color = stroke_color;
+
+  state->getStrokeRGB(&stroke_color);
+  if (cairo_pattern_get_type (fill_pattern) != CAIRO_PATTERN_TYPE_SOLID ||
+      color.r != stroke_color.r ||
+      color.g != stroke_color.g ||
+      color.b != stroke_color.b)
+  {
+    cairo_pattern_destroy(stroke_pattern);
+    stroke_pattern = cairo_pattern_create_rgba(colToDbl(stroke_color.r),
+                                              colToDbl(stroke_color.g),
+                                              colToDbl(stroke_color.b),
+                                              stroke_opacity);
+
+    LOG(printf ("stroke color: %d %d %d\n",
+               stroke_color.r, stroke_color.g, stroke_color.b));
+  }
+}
+
+void CairoOutputDev::updateFillOpacity(GfxState *state) {
+  double opacity = fill_opacity;
+
+  fill_opacity = state->getFillOpacity();
+  if (opacity != fill_opacity) {
+    cairo_pattern_destroy(fill_pattern);
+    fill_pattern = cairo_pattern_create_rgba(colToDbl(fill_color.r),
+                                            colToDbl(fill_color.g),
+                                            colToDbl(fill_color.b),
+                                            fill_opacity);
+
+    LOG(printf ("fill opacity: %f\n", fill_opacity));
+  }
+}
+
+void CairoOutputDev::updateStrokeOpacity(GfxState *state) {
+  double opacity = stroke_opacity;
+
+  stroke_opacity = state->getStrokeOpacity();
+  if (opacity != stroke_opacity) {
+    cairo_pattern_destroy(stroke_pattern);
+    stroke_pattern = cairo_pattern_create_rgba(colToDbl(stroke_color.r),
+                                              colToDbl(stroke_color.g),
+                                              colToDbl(stroke_color.b),
+                                              stroke_opacity);
+
+    LOG(printf ("stroke opacity: %f\n", stroke_opacity));
+  }
+}
+
+void CairoOutputDev::updateFillColorStop(GfxState *state, double offset) {
+  state->getFillRGB(&fill_color);
+
+  cairo_pattern_add_color_stop_rgba(fill_pattern, offset,
+                                   colToDbl(fill_color.r),
+                                   colToDbl(fill_color.g),
+                                   colToDbl(fill_color.b),
+                                   fill_opacity);
+  LOG(printf ("fill color stop: %f (%d, %d, %d)\n",
+             offset, fill_color.r, fill_color.g, fill_color.b));
+}
+
+void CairoOutputDev::updateBlendMode(GfxState *state) {
+  switch (state->getBlendMode()) {
+  default:
+  case gfxBlendNormal:
+    cairo_set_operator (cairo, CAIRO_OPERATOR_OVER);
+    break;
+  case gfxBlendMultiply:
+    cairo_set_operator (cairo, CAIRO_OPERATOR_MULTIPLY);
+    break;
+  case gfxBlendScreen:
+    cairo_set_operator (cairo, CAIRO_OPERATOR_SCREEN);
+    break;
+  case gfxBlendOverlay:
+    cairo_set_operator (cairo, CAIRO_OPERATOR_OVERLAY);
+    break;
+  case gfxBlendDarken:
+    cairo_set_operator (cairo, CAIRO_OPERATOR_DARKEN);
+    break;
+  case gfxBlendLighten:
+    cairo_set_operator (cairo, CAIRO_OPERATOR_LIGHTEN);
+    break;
+  case gfxBlendColorDodge:
+    cairo_set_operator (cairo, CAIRO_OPERATOR_COLOR_DODGE);
+    break;
+  case gfxBlendColorBurn:
+    cairo_set_operator (cairo, CAIRO_OPERATOR_COLOR_BURN);
+    break;
+  case gfxBlendHardLight:
+    cairo_set_operator (cairo, CAIRO_OPERATOR_HARD_LIGHT);
+    break;
+  case gfxBlendSoftLight:
+    cairo_set_operator (cairo, CAIRO_OPERATOR_SOFT_LIGHT);
+    break;
+  case gfxBlendDifference:
+    cairo_set_operator (cairo, CAIRO_OPERATOR_DIFFERENCE);
+    break;
+  case gfxBlendExclusion:
+    cairo_set_operator (cairo, CAIRO_OPERATOR_EXCLUSION);
+    break;
+  case gfxBlendHue:
+    cairo_set_operator (cairo, CAIRO_OPERATOR_HSL_HUE);
+    break;
+  case gfxBlendSaturation:
+    cairo_set_operator (cairo, CAIRO_OPERATOR_HSL_SATURATION);
+    break;
+  case gfxBlendColor:
+    cairo_set_operator (cairo, CAIRO_OPERATOR_HSL_COLOR);
+    break;
+  case gfxBlendLuminosity:
+    cairo_set_operator (cairo, CAIRO_OPERATOR_HSL_LUMINOSITY);
+    break;
+  }
+  LOG(printf ("blend mode: %d\n", (int)state->getBlendMode()));
+}
+
+void CairoOutputDev::updateFont(GfxState *state) {
+  cairo_font_face_t *font_face;
+  cairo_matrix_t matrix, invert_matrix;
+
+  LOG(printf ("updateFont() font=%s\n", state->getFont()->getName()->getCString()));
+
+  needFontUpdate = gFalse;
+
+  //FIXME: use cairo font engine?
+  if (text)
+    text->updateFont(state);
+  
+  currentFont = fontEngine->getFont (state->getFont(), doc, printing);
+
+  if (!currentFont)
+    return;
+
+  font_face = currentFont->getFontFace();
+  cairo_set_font_face (cairo, font_face);
+
+  use_show_text_glyphs = state->getFont()->hasToUnicodeCMap() &&
+    cairo_surface_has_show_text_glyphs (cairo_get_target (cairo));
+  double fontSize = state->getFontSize();
+  double *m = state->getTextMat();
+  /* NOTE: adjusting by a constant is hack. The correct solution
+   * is probably to use user-fonts and compute the scale on a per
+   * glyph basis instead of for the entire font */
+  double w = currentFont->getSubstitutionCorrection(state->getFont());
+  matrix.xx = m[0] * fontSize * state->getHorizScaling() * w;
+  matrix.yx = m[1] * fontSize * state->getHorizScaling() * w;
+  matrix.xy = -m[2] * fontSize;
+  matrix.yy = -m[3] * fontSize;
+  matrix.x0 = 0;
+  matrix.y0 = 0;
+
+  LOG(printf ("font matrix: %f %f %f %f\n", matrix.xx, matrix.yx, matrix.xy, matrix.yy));
+
+ /* Make sure the font matrix is invertible before setting it.  cairo
+  * will blow up if we give it a matrix that's not invertible, so we
+  * need to check before passing it to cairo_set_font_matrix. Ignoring it
+  * is likely to give better results than not rendering anything at
+  * all. See #18254.
+  */
+  invert_matrix = matrix;
+  if (cairo_matrix_invert(&invert_matrix)) {
+    error(errSyntaxWarning, -1, "font matrix not invertible\n");
+    return;
+  }
+
+  cairo_set_font_matrix (cairo, &matrix);
+}
+
+/* Tolerance in pixels for checking if strokes are horizontal or vertical
+ * lines in device space */
+#define STROKE_COORD_TOLERANCE 0.5
+
+/* Align stroke coordinate i if the point is the start or end of a
+ * horizontal or vertical line */
+void CairoOutputDev::alignStrokeCoords(GfxSubpath *subpath, int i, double *x, double *y)
+{
+  double x1, y1, x2, y2;
+  GBool align = gFalse;
+
+  x1 = subpath->getX(i);
+  y1 = subpath->getY(i);
+  cairo_user_to_device (cairo, &x1, &y1);
+
+  // Does the current coord and prev coord form a horiz or vert line?
+  if (i > 0 && !subpath->getCurve(i - 1)) {
+    x2 = subpath->getX(i - 1);
+    y2 = subpath->getY(i - 1);
+    cairo_user_to_device (cairo, &x2, &y2);
+    if (fabs(x2 - x1) < STROKE_COORD_TOLERANCE || fabs(y2 - y1) < STROKE_COORD_TOLERANCE)
+      align = gTrue;
+  }
+
+  // Does the current coord and next coord form a horiz or vert line?
+  if (i < subpath->getNumPoints() - 1 && !subpath->getCurve(i + 1)) {
+    x2 = subpath->getX(i + 1);
+    y2 = subpath->getY(i + 1);
+    cairo_user_to_device (cairo, &x2, &y2);
+    if (fabs(x2 - x1) < STROKE_COORD_TOLERANCE || fabs(y2 - y1) < STROKE_COORD_TOLERANCE)
+      align = gTrue;
+  }
+
+  *x = subpath->getX(i);
+  *y = subpath->getY(i);
+  if (align) {
+    /* see http://www.cairographics.org/FAQ/#sharp_lines */
+    cairo_user_to_device (cairo, x, y);
+    *x = floor(*x) + 0.5;
+    *y = floor(*y) + 0.5;
+    cairo_device_to_user (cairo, x, y);
+  }
+}
+
+#undef STROKE_COORD_TOLERANCE
+
+void CairoOutputDev::doPath(cairo_t *cairo, GfxState *state, GfxPath *path) {
+  GfxSubpath *subpath;
+  int i, j;
+  double x, y;
+  cairo_new_path (cairo);
+  for (i = 0; i < path->getNumSubpaths(); ++i) {
+    subpath = path->getSubpath(i);
+    if (subpath->getNumPoints() > 0) {
+      if (align_stroke_coords) {
+        alignStrokeCoords(subpath, 0, &x, &y);
+      } else {
+        x = subpath->getX(0);
+        y = subpath->getY(0);
+      }
+      cairo_move_to (cairo, x, y);
+      j = 1;
+      while (j < subpath->getNumPoints()) {
+       if (subpath->getCurve(j)) {
+         if (align_stroke_coords) {
+            alignStrokeCoords(subpath, j + 2, &x, &y);
+          } else {
+            x = subpath->getX(j+2);
+            y = subpath->getY(j+2);
+          }
+         cairo_curve_to( cairo,
+                         subpath->getX(j), subpath->getY(j),
+                         subpath->getX(j+1), subpath->getY(j+1),
+                         x, y);
+
+         j += 3;
+       } else {
+         if (align_stroke_coords) {
+            alignStrokeCoords(subpath, j, &x, &y);
+          } else {
+            x = subpath->getX(j);
+            y = subpath->getY(j);
+          }
+          cairo_line_to (cairo, x, y);
+         ++j;
+       }
+      }
+      if (subpath->isClosed()) {
+       LOG (printf ("close\n"));
+       cairo_close_path (cairo);
+      }
+    }
+  }
+}
+
+void CairoOutputDev::stroke(GfxState *state) {
+  if (inType3Char) {
+      GfxGray gray;
+      state->getFillGray(&gray);
+      if (colToDbl(gray) > 0.5)
+         return;
+  }
+
+  if (adjusted_stroke_width)
+    align_stroke_coords = gTrue;
+  doPath (cairo, state, state->getPath());
+  align_stroke_coords = gFalse;
+  cairo_set_source (cairo, stroke_pattern);
+  LOG(printf ("stroke\n"));
+  cairo_stroke (cairo);
+  if (cairo_shape) {
+    doPath (cairo_shape, state, state->getPath());
+    cairo_stroke (cairo_shape);
+  }
+}
+
+void CairoOutputDev::fill(GfxState *state) {
+  if (inType3Char) {
+      GfxGray gray;
+      state->getFillGray(&gray);
+      if (colToDbl(gray) > 0.5)
+         return;
+  }
+
+  doPath (cairo, state, state->getPath());
+  cairo_set_fill_rule (cairo, CAIRO_FILL_RULE_WINDING);
+  cairo_set_source (cairo, fill_pattern);
+  LOG(printf ("fill\n"));
+  //XXX: how do we get the path
+  if (mask) {
+    cairo_save (cairo);
+    cairo_clip (cairo);
+    cairo_set_matrix (cairo, &mask_matrix);
+    cairo_mask (cairo, mask);
+    cairo_restore (cairo);
+  } else if (strokePathClip) {
+    fillToStrokePathClip(state);
+  } else {
+    cairo_fill (cairo);
+  }
+  if (cairo_shape) {
+    cairo_set_fill_rule (cairo_shape, CAIRO_FILL_RULE_WINDING);
+    doPath (cairo_shape, state, state->getPath());
+    cairo_fill (cairo_shape);
+  }
+}
+
+void CairoOutputDev::eoFill(GfxState *state) {
+  doPath (cairo, state, state->getPath());
+  cairo_set_fill_rule (cairo, CAIRO_FILL_RULE_EVEN_ODD);
+  cairo_set_source (cairo, fill_pattern);
+  LOG(printf ("fill-eo\n"));
+  cairo_fill (cairo);
+
+  if (cairo_shape) {
+    cairo_set_fill_rule (cairo_shape, CAIRO_FILL_RULE_EVEN_ODD);
+    doPath (cairo_shape, state, state->getPath());
+    cairo_fill (cairo_shape);
+  }
+
+}
+
+GBool CairoOutputDev::tilingPatternFill(GfxState *state, Gfx *gfx1, Catalog *cat, Object *str,
+                                       double *pmat, int paintType, int /*tilingType*/, Dict *resDict,
+                                       double *mat, double *bbox,
+                                       int x0, int y0, int x1, int y1,
+                                       double xStep, double yStep)
+{
+  PDFRectangle box;
+  Gfx *gfx;
+  cairo_pattern_t *pattern;
+  cairo_surface_t *surface;
+  cairo_matrix_t matrix;
+  cairo_t *old_cairo;
+  double xMin, yMin, xMax, yMax;
+  double width, height;
+  int surface_width, surface_height;
+  StrokePathClip *strokePathTmp;
+
+  width = bbox[2] - bbox[0];
+  height = bbox[3] - bbox[1];
+
+  if (xStep != width || yStep != height)
+    return gFalse;
+  /* TODO: implement the other cases here too */
+
+  surface_width = (int) ceil (width);
+  surface_height = (int) ceil (height);
+
+  surface = cairo_surface_create_similar (cairo_get_target (cairo),
+                                         CAIRO_CONTENT_COLOR_ALPHA,
+                                         surface_width, surface_height);
+  if (cairo_surface_status (surface))
+    return gFalse;
+
+  old_cairo = cairo;
+  cairo = cairo_create (surface);
+  cairo_surface_destroy (surface);
+
+  box.x1 = bbox[0]; box.y1 = bbox[1];
+  box.x2 = bbox[2]; box.y2 = bbox[3];
+  strokePathTmp = strokePathClip;
+  strokePathClip = NULL;
+  gfx = new Gfx(doc, this, resDict, &box, NULL);
+  gfx->display(str);
+  delete gfx;
+  strokePathClip = strokePathTmp;
+
+  pattern = cairo_pattern_create_for_surface (cairo_get_target (cairo));
+  cairo_destroy (cairo);
+  cairo = old_cairo;
+  if (cairo_pattern_status (pattern))
+    return gFalse;
+
+  state->getUserClipBBox(&xMin, &yMin, &xMax, &yMax);
+  cairo_rectangle (cairo, xMin, yMin, xMax - xMin, yMax - yMin);
+
+  cairo_matrix_init_scale (&matrix, surface_width / width, surface_height / height);
+  cairo_pattern_set_matrix (pattern, &matrix);
+
+  cairo_matrix_init (&matrix, mat[0], mat[1], mat[2], mat[3], mat[4], mat[5]);
+  cairo_transform (cairo, &matrix);
+  cairo_set_source (cairo, pattern);
+  cairo_pattern_set_extend (pattern, CAIRO_EXTEND_REPEAT);
+  if (strokePathClip) {
+    fillToStrokePathClip(state);
+  } else {
+    cairo_fill (cairo);
+  }
+
+  cairo_pattern_destroy (pattern);
+
+  return gTrue;
+}
+
+GBool CairoOutputDev::axialShadedFill(GfxState *state, GfxAxialShading *shading, double tMin, double tMax) {
+  double x0, y0, x1, y1;
+  double dx, dy;
+
+  shading->getCoords(&x0, &y0, &x1, &y1);
+  dx = x1 - x0;
+  dy = y1 - y0;
+
+  cairo_pattern_destroy(fill_pattern);
+  fill_pattern = cairo_pattern_create_linear (x0 + tMin * dx, y0 + tMin * dy,
+                                             x0 + tMax * dx, y0 + tMax * dy);
+  if (!shading->getExtend0() && !shading->getExtend1())
+    cairo_pattern_set_extend (fill_pattern, CAIRO_EXTEND_NONE);
+  else
+    cairo_pattern_set_extend (fill_pattern, CAIRO_EXTEND_PAD);
+
+  LOG (printf ("axial-sh\n"));
+
+  // TODO: use the actual stops in the shading in the case
+  // of linear interpolation (Type 2 Exponential functions with N=1)
+  return gFalse;
+}
+
+GBool CairoOutputDev::axialShadedSupportExtend(GfxState *state, GfxAxialShading *shading)
+{
+  return (shading->getExtend0() == shading->getExtend1());
+}
+
+GBool CairoOutputDev::radialShadedFill(GfxState *state, GfxRadialShading *shading, double sMin, double sMax) {
+  double x0, y0, r0, x1, y1, r1;
+  double dx, dy, dr;
+
+  shading->getCoords(&x0, &y0, &r0, &x1, &y1, &r1);
+  dx = x1 - x0;
+  dy = y1 - y0;
+  dr = r1 - r0;
+  cairo_pattern_destroy(fill_pattern);
+  fill_pattern = cairo_pattern_create_radial (x0 + sMin * dx,
+                                             y0 + sMin * dy,
+                                             r0 + sMin * dr,
+                                             x0 + sMax * dx,
+                                             y0 + sMax * dy,
+                                             r0 + sMax * dr);
+  if (shading->getExtend0() && shading->getExtend1())
+    cairo_pattern_set_extend (fill_pattern, CAIRO_EXTEND_PAD);
+  else
+    cairo_pattern_set_extend (fill_pattern, CAIRO_EXTEND_NONE);
+
+  LOG (printf ("radial-sh\n"));
+
+  return gFalse;
+}
+
+GBool CairoOutputDev::radialShadedSupportExtend(GfxState *state, GfxRadialShading *shading)
+{
+  return (shading->getExtend0() == shading->getExtend1());
+}
+
+#if CAIRO_VERSION >= CAIRO_VERSION_ENCODE(1, 12, 0)
+GBool CairoOutputDev::gouraudTriangleShadedFill(GfxState *state, GfxGouraudTriangleShading *shading)
+{
+  double x0, y0, x1, y1, x2, y2;
+  GfxColor color[3];
+  int i, j;
+  GfxRGB rgb;
+
+  cairo_pattern_destroy(fill_pattern);
+  fill_pattern = cairo_pattern_create_mesh ();
+
+  for (i = 0; i < shading->getNTriangles(); i++) {
+    shading->getTriangle(i,
+                        &x0, &y0, &color[0],
+                        &x1, &y1, &color[1],
+                        &x2, &y2, &color[2]);
+
+    cairo_mesh_pattern_begin_patch (fill_pattern);
+
+    cairo_mesh_pattern_move_to (fill_pattern, x0, y0);
+    cairo_mesh_pattern_line_to (fill_pattern, x1, y1);
+    cairo_mesh_pattern_line_to (fill_pattern, x2, y2);
+
+    for (j = 0; j < 3; j++) {
+       shading->getColorSpace()->getRGB(&color[j], &rgb);
+       cairo_mesh_pattern_set_corner_color_rgb (fill_pattern, j,
+                                                colToDbl(rgb.r),
+                                                colToDbl(rgb.g),
+                                                colToDbl(rgb.b));
+    }
+
+    cairo_mesh_pattern_end_patch (fill_pattern);
+  }
+
+  double xMin, yMin, xMax, yMax;
+  // get the clip region bbox
+  state->getUserClipBBox(&xMin, &yMin, &xMax, &yMax);
+  state->moveTo(xMin, yMin);
+  state->lineTo(xMin, yMax);
+  state->lineTo(xMax, yMax);
+  state->lineTo(xMax, yMin);
+  state->closePath();
+  fill(state);
+  state->clearPath();
+
+  return gTrue;
+}
+
+GBool CairoOutputDev::patchMeshShadedFill(GfxState *state, GfxPatchMeshShading *shading)
+{
+  int i, j, k;
+
+  cairo_pattern_destroy(fill_pattern);
+  fill_pattern = cairo_pattern_create_mesh ();
+
+  for (i = 0; i < shading->getNPatches(); i++) {
+    GfxPatch *patch = shading->getPatch(i);
+    GfxColor color;
+    GfxRGB rgb;
+
+    cairo_mesh_pattern_begin_patch (fill_pattern);
+
+    cairo_mesh_pattern_move_to (fill_pattern, patch->x[0][0], patch->y[0][0]);
+    cairo_mesh_pattern_curve_to (fill_pattern,
+                           patch->x[0][1], patch->y[0][1],
+                           patch->x[0][2], patch->y[0][2],
+                           patch->x[0][3], patch->y[0][3]);
+
+    cairo_mesh_pattern_curve_to (fill_pattern,
+                           patch->x[1][3], patch->y[1][3],
+                           patch->x[2][3], patch->y[2][3],
+                           patch->x[3][3], patch->y[3][3]);
+
+    cairo_mesh_pattern_curve_to (fill_pattern,
+                           patch->x[3][2], patch->y[3][2],
+                           patch->x[3][1], patch->y[3][1],
+                           patch->x[3][0], patch->y[3][0]);
+
+    cairo_mesh_pattern_curve_to (fill_pattern,
+                           patch->x[2][0], patch->y[2][0],
+                           patch->x[1][0], patch->y[1][0],
+                           patch->x[0][0], patch->y[0][0]);
+
+    cairo_mesh_pattern_set_control_point (fill_pattern, 0, patch->x[1][1], patch->y[1][1]);
+    cairo_mesh_pattern_set_control_point (fill_pattern, 1, patch->x[1][2], patch->y[1][2]);
+    cairo_mesh_pattern_set_control_point (fill_pattern, 2, patch->x[2][2], patch->y[2][2]);
+    cairo_mesh_pattern_set_control_point (fill_pattern, 3, patch->x[2][1], patch->y[2][1]);
+
+    for (j = 0; j < 4; j++) {
+      int u, v;
+
+      switch (j) {
+       case 0:
+         u = 0; v = 0;
+         break;
+       case 1:
+         u = 0; v = 1;
+         break;
+       case 2:
+         u = 1; v = 1;
+         break;
+       case 3:
+         u = 1; v = 0;
+         break;
+      }
+
+      if (shading->isParameterized()) {
+       shading->getParameterizedColor (patch->color[u][v].c[0], &color);
+      } else {
+       for (k = 0; k < shading->getColorSpace()->getNComps(); k++) {
+          // simply cast to the desired type; that's all what is needed.
+         color.c[k] = GfxColorComp (patch->color[u][v].c[k]);
+       }
+      }
+
+      shading->getColorSpace()->getRGB(&color, &rgb);
+      cairo_mesh_pattern_set_corner_color_rgb (fill_pattern, j,
+                                              colToDbl(rgb.r),
+                                              colToDbl(rgb.g),
+                                              colToDbl(rgb.b));
+    }
+    cairo_mesh_pattern_end_patch (fill_pattern);
+  }
+
+  double xMin, yMin, xMax, yMax;
+  // get the clip region bbox
+  state->getUserClipBBox(&xMin, &yMin, &xMax, &yMax);
+  state->moveTo(xMin, yMin);
+  state->lineTo(xMin, yMax);
+  state->lineTo(xMax, yMax);
+  state->lineTo(xMax, yMin);
+  state->closePath();
+  fill(state);
+  state->clearPath();
+
+  return gTrue;
+}
+#endif /* CAIRO_VERSION >= CAIRO_VERSION_ENCODE(1, 12, 0) */
+
+void CairoOutputDev::clip(GfxState *state) {
+  doPath (cairo, state, state->getPath());
+  cairo_set_fill_rule (cairo, CAIRO_FILL_RULE_WINDING);
+  cairo_clip (cairo);
+  LOG (printf ("clip\n"));
+  if (cairo_shape) {
+    doPath (cairo_shape, state, state->getPath());
+    cairo_set_fill_rule (cairo_shape, CAIRO_FILL_RULE_WINDING);
+    cairo_clip (cairo_shape);
+  }
+}
+
+void CairoOutputDev::eoClip(GfxState *state) {
+  doPath (cairo, state, state->getPath());
+  cairo_set_fill_rule (cairo, CAIRO_FILL_RULE_EVEN_ODD);
+  cairo_clip (cairo);
+  LOG (printf ("clip-eo\n"));
+  if (cairo_shape) {
+    doPath (cairo_shape, state, state->getPath());
+    cairo_set_fill_rule (cairo_shape, CAIRO_FILL_RULE_EVEN_ODD);
+    cairo_clip (cairo_shape);
+  }
+
+}
+
+void CairoOutputDev::clipToStrokePath(GfxState *state) {
+  LOG(printf("clip-to-stroke-path\n"));
+  strokePathClip = (StrokePathClip*)gmalloc (sizeof(*strokePathClip));
+  strokePathClip->path = state->getPath()->copy();
+  cairo_get_matrix (cairo, &strokePathClip->ctm);
+  strokePathClip->line_width = cairo_get_line_width (cairo);
+  strokePathClip->dash_count = cairo_get_dash_count (cairo);
+  if (strokePathClip->dash_count) {
+    strokePathClip->dashes = (double*) gmallocn (sizeof(double), strokePathClip->dash_count);
+    cairo_get_dash (cairo, strokePathClip->dashes, &strokePathClip->dash_offset);
+  } else {
+    strokePathClip->dashes = NULL;
+  }
+  strokePathClip->cap = cairo_get_line_cap (cairo);
+  strokePathClip->join = cairo_get_line_join (cairo);
+  strokePathClip->miter = cairo_get_miter_limit (cairo);
+}
+
+void CairoOutputDev::fillToStrokePathClip(GfxState *state) {
+  cairo_save (cairo);
+
+  cairo_set_matrix (cairo, &strokePathClip->ctm);
+  cairo_set_line_width (cairo, strokePathClip->line_width);
+  strokePathClip->dash_count = cairo_get_dash_count (cairo);
+  cairo_set_dash (cairo, strokePathClip->dashes, strokePathClip->dash_count, strokePathClip->dash_offset);
+  cairo_set_line_cap (cairo, strokePathClip->cap);
+  cairo_set_line_join (cairo, strokePathClip->join);
+  cairo_set_miter_limit (cairo, strokePathClip->miter);
+  doPath (cairo, state, strokePathClip->path);
+  cairo_stroke (cairo);
+
+  cairo_restore (cairo);
+
+  delete strokePathClip->path;
+  if (strokePathClip->dashes)
+    gfree (strokePathClip->dashes);
+  gfree (strokePathClip);
+  strokePathClip = NULL;
+}
+
+void CairoOutputDev::beginString(GfxState *state, GooString *s)
+{
+  int len = s->getLength();
+
+  if (needFontUpdate)
+    updateFont(state);
+
+  if (!currentFont)
+    return;
+
+  glyphs = (cairo_glyph_t *) gmallocn (len, sizeof (cairo_glyph_t));
+  glyphCount = 0;
+  if (use_show_text_glyphs) {
+    clusters = (cairo_text_cluster_t *) gmallocn (len, sizeof (cairo_text_cluster_t));
+    clusterCount = 0;
+    utf8Max = len*2; // start with twice the number of glyphs. we will realloc if we need more.
+    utf8 = (char *) gmalloc (utf8Max);
+    utf8Count = 0;
+  }
+}
+
+void CairoOutputDev::drawChar(GfxState *state, double x, double y,
+                             double dx, double dy,
+                             double originX, double originY,
+                             CharCode code, int nBytes, Unicode *u, int uLen)
+{
+  if (currentFont) {
+    glyphs[glyphCount].index = currentFont->getGlyph (code, u, uLen);
+    glyphs[glyphCount].x = x - originX;
+    glyphs[glyphCount].y = y - originY;
+    glyphCount++;
+    if (use_show_text_glyphs) {
+      if (utf8Max - utf8Count < uLen*6) {
+        // utf8 encoded characters can be up to 6 bytes
+       if (utf8Max > uLen*6)
+         utf8Max *= 2;
+       else
+         utf8Max += 2*uLen*6;
+       utf8 = (char *) grealloc (utf8, utf8Max);
+      }
+      clusters[clusterCount].num_bytes = 0;
+      for (int i = 0; i < uLen; i++) {
+       int size = mapUTF8 (u[i], utf8 + utf8Count, utf8Max - utf8Count);
+       utf8Count += size;
+       clusters[clusterCount].num_bytes += size;
+      }
+      clusters[clusterCount].num_glyphs = 1;
+      clusterCount++;
+    }
+  }
+
+  if (!text)
+    return;
+  actualText->addChar (state, x, y, dx, dy, code, nBytes, u, uLen);
+}
+
+void CairoOutputDev::endString(GfxState *state)
+{
+  int render;
+
+  if (!currentFont)
+    return;
+
+  // endString can be called without a corresponding beginString. If this
+  // happens glyphs will be null so don't draw anything, just return.
+  // XXX: OutputDevs should probably not have to deal with this...
+  if (!glyphs)
+    return;
+
+  // ignore empty strings and invisible text -- this is used by
+  // Acrobat Capture
+  render = state->getRender();
+  if (render == 3 || glyphCount == 0) {
+    gfree(glyphs);
+    glyphs = NULL;
+    return;
+  }
+
+  if (!(render & 1)) {
+    LOG (printf ("fill string\n"));
+    cairo_set_source (cairo, fill_pattern);
+    if (use_show_text_glyphs)
+      cairo_show_text_glyphs (cairo, utf8, utf8Count, glyphs, glyphCount, clusters, clusterCount, (cairo_text_cluster_flags_t)0);
+    else
+        cairo_show_glyphs (cairo, glyphs, glyphCount);
+    if (cairo_shape)
+      cairo_show_glyphs (cairo_shape, glyphs, glyphCount);
+  }
+
+  // stroke
+  if ((render & 3) == 1 || (render & 3) == 2) {
+    LOG (printf ("stroke string\n"));
+    cairo_set_source (cairo, stroke_pattern);
+    cairo_glyph_path (cairo, glyphs, glyphCount);
+    cairo_stroke (cairo);
+    if (cairo_shape) {
+      cairo_glyph_path (cairo_shape, glyphs, glyphCount);
+      cairo_stroke (cairo_shape);
+    }
+  }
+
+  // clip
+  if ((render & 4)) {
+    LOG (printf ("clip string\n"));
+    // append the glyph path to textClipPath.
+
+    // set textClipPath as the currentPath
+    if (textClipPath) {
+      cairo_append_path (cairo, textClipPath);
+      if (cairo_shape) {
+       cairo_append_path (cairo_shape, textClipPath);
+      }
+      cairo_path_destroy (textClipPath);
+    }
+    
+    // append the glyph path
+    cairo_glyph_path (cairo, glyphs, glyphCount);
+   
+    // move the path back into textClipPath 
+    // and clear the current path
+    textClipPath = cairo_copy_path (cairo);
+    cairo_new_path (cairo);
+    if (cairo_shape) {
+      cairo_new_path (cairo_shape);
+    }
+  }
+
+  gfree (glyphs);
+  glyphs = NULL;
+  if (use_show_text_glyphs) {
+    gfree (clusters);
+    clusters = NULL;
+    gfree (utf8);
+    utf8 = NULL;
+  }
+}
+
+
+GBool CairoOutputDev::beginType3Char(GfxState *state, double x, double y,
+                                     double dx, double dy,
+                                     CharCode code, Unicode *u, int uLen) {
+
+  cairo_save (cairo);
+  double *ctm;
+  cairo_matrix_t matrix;
+
+  ctm = state->getCTM();
+  matrix.xx = ctm[0];
+  matrix.yx = ctm[1];
+  matrix.xy = ctm[2];
+  matrix.yy = ctm[3];
+  matrix.x0 = ctm[4];
+  matrix.y0 = ctm[5];
+  /* Restore the original matrix and then transform to matrix needed for the
+   * type3 font. This is ugly but seems to work. Perhaps there is a better way to do it?*/
+  cairo_set_matrix(cairo, &orig_matrix);
+  cairo_transform(cairo, &matrix);
+  if (cairo_shape) {
+    cairo_save (cairo_shape);
+    cairo_set_matrix(cairo_shape, &orig_matrix);
+    cairo_transform(cairo_shape, &matrix);
+  }
+  cairo_pattern_destroy(stroke_pattern);
+  cairo_pattern_reference(fill_pattern);
+  stroke_pattern = fill_pattern;
+  return gFalse;
+}
+
+void CairoOutputDev::endType3Char(GfxState *state) {
+  cairo_restore (cairo);
+  if (cairo_shape) {
+    cairo_restore (cairo_shape);
+  }
+}
+
+void CairoOutputDev::type3D0(GfxState *state, double wx, double wy) {
+  t3_glyph_wx = wx;
+  t3_glyph_wy = wy;
+}
+
+void CairoOutputDev::type3D1(GfxState *state, double wx, double wy,
+                            double llx, double lly, double urx, double ury) {
+  t3_glyph_wx = wx;
+  t3_glyph_wy = wy;
+  t3_glyph_bbox[0] = llx;
+  t3_glyph_bbox[1] = lly;
+  t3_glyph_bbox[2] = urx;
+  t3_glyph_bbox[3] = ury;
+  t3_glyph_has_bbox = gTrue;
+}
+
+void CairoOutputDev::beginTextObject(GfxState *state) {
+}
+
+void CairoOutputDev::endTextObject(GfxState *state) {
+  if (textClipPath) {
+    // clip the accumulated text path
+    cairo_append_path (cairo, textClipPath);
+    cairo_clip (cairo);
+    if (cairo_shape) {
+      cairo_append_path (cairo_shape, textClipPath);
+      cairo_clip (cairo_shape);
+    }
+    cairo_path_destroy (textClipPath);
+    textClipPath = NULL;
+  }
+}
+
+void CairoOutputDev::beginActualText(GfxState *state, GooString *text)
+{
+  if (this->text)
+    actualText->begin(state, text);
+}
+
+void CairoOutputDev::endActualText(GfxState *state)
+{
+  if (text)
+    actualText->end(state);
+}
+
+static inline int splashRound(SplashCoord x) {
+  return (int)floor(x + 0.5);
+}
+
+static inline int splashCeil(SplashCoord x) {
+  return (int)ceil(x);
+}
+
+static inline int splashFloor(SplashCoord x) {
+  return (int)floor(x);
+}
+
+static
+cairo_surface_t *cairo_surface_create_similar_clip (cairo_t *cairo, cairo_content_t content)
+{
+  double x1, y1, x2, y2;
+  int width, height;
+  cairo_clip_extents (cairo, &x1, &y1, &x2, &y2);
+  cairo_matrix_t matrix;
+  cairo_get_matrix (cairo, &matrix);
+  //cairo_matrix_transform_point(&matrix, &x1, &y1);
+  //cairo_matrix_transform_point(&matrix, &x2, &y2);*/
+  cairo_user_to_device(cairo, &x1, &y1);
+  cairo_user_to_device(cairo, &x2, &y2);
+  width = splashCeil(x2) - splashFloor(x1);
+  //XXX: negative matrix
+  ////height = splashCeil(y2) - splashFloor(y1);
+  height = splashFloor(y1) - splashCeil(y2);
+  cairo_surface_t *target = cairo_get_target (cairo);
+  cairo_surface_t *result;
+
+  result = cairo_surface_create_similar (target, content, width, height);
+  double x_offset, y_offset;
+    cairo_surface_get_device_offset(target, &x_offset, &y_offset);
+    cairo_surface_set_device_offset(result, x_offset, y_offset);
+
+  return result;
+}
+
+
+
+void CairoOutputDev::beginTransparencyGroup(GfxState * /*state*/, double * /*bbox*/,
+                                      GfxColorSpace * blendingColorSpace,
+                                      GBool /*isolated*/, GBool knockout,
+                                     GBool forSoftMask) {
+  /* push color space */
+  ColorSpaceStack* css = new ColorSpaceStack;
+  css->cs = blendingColorSpace;
+  css->knockout = knockout;
+  cairo_get_matrix(cairo, &css->group_matrix);
+  css->next = groupColorSpaceStack;
+  groupColorSpaceStack = css;
+
+  LOG(printf ("begin transparency group. knockout: %s\n", knockout ? "yes":"no"));
+
+  if (knockout) {
+    knockoutCount++;
+    if (!cairo_shape) {
+      /* create a surface for tracking the shape */
+      cairo_surface_t *cairo_shape_surface = cairo_surface_create_similar_clip (cairo, CAIRO_CONTENT_ALPHA);
+      cairo_shape = cairo_create (cairo_shape_surface);
+      cairo_surface_destroy (cairo_shape_surface);
+
+      /* the color doesn't matter as long as it is opaque */
+      cairo_set_source_rgb (cairo_shape, 0, 0, 0);
+      cairo_matrix_t matrix;
+      cairo_get_matrix (cairo, &matrix);
+      //printMatrix(&matrix);
+      cairo_set_matrix (cairo_shape, &matrix);
+    } else {
+      cairo_reference (cairo_shape);
+    }
+  }
+  if (groupColorSpaceStack->next && groupColorSpaceStack->next->knockout) {
+    /* we need to track the shape */
+    cairo_push_group (cairo_shape);
+  }
+  if (0 && forSoftMask)
+    cairo_push_group_with_content (cairo, CAIRO_CONTENT_ALPHA);
+  else
+    cairo_push_group (cairo);
+
+  /* push_group has an implicit cairo_save() */
+  if (knockout) {
+    /*XXX: let's hope this matches the semantics needed */
+    cairo_set_operator(cairo, CAIRO_OPERATOR_SOURCE);
+  } else {
+    cairo_set_operator(cairo, CAIRO_OPERATOR_OVER);
+  }
+}
+
+void CairoOutputDev::endTransparencyGroup(GfxState * /*state*/) {
+  if (group)
+    cairo_pattern_destroy(group);
+  group = cairo_pop_group (cairo);
+
+  LOG(printf ("end transparency group\n"));
+
+  if (groupColorSpaceStack->next && groupColorSpaceStack->next->knockout) {
+    if (shape)
+      cairo_pattern_destroy(shape);
+    shape = cairo_pop_group (cairo_shape);
+  }
+}
+
+void CairoOutputDev::paintTransparencyGroup(GfxState * /*state*/, double * /*bbox*/) {
+  LOG(printf ("paint transparency group\n"));
+
+  cairo_save (cairo);
+  cairo_set_matrix (cairo, &groupColorSpaceStack->group_matrix);
+  cairo_set_source (cairo, group);
+
+  if (!mask) {
+    //XXX: deal with mask && shape case
+    if (shape) {
+      cairo_save (cairo);
+
+      /* OPERATOR_SOURCE w/ a mask is defined as (src IN mask) ADD (dest OUT mask)
+       * however our source has already been clipped to mask so we only need to
+       * do ADD and OUT */
+
+      /* clear the shape mask */
+      cairo_set_source (cairo, shape);
+      cairo_set_operator (cairo, CAIRO_OPERATOR_DEST_OUT);
+      cairo_paint (cairo);
+
+      cairo_set_operator (cairo, CAIRO_OPERATOR_ADD);
+      cairo_set_source (cairo, group);
+      cairo_paint (cairo);
+
+      cairo_restore (cairo);
+
+      cairo_pattern_destroy (shape);
+      shape = NULL;
+    } else {
+      cairo_paint_with_alpha (cairo, fill_opacity);
+    }
+    cairo_status_t status = cairo_status(cairo);
+    if (status)
+      printf("BAD status: %s\n", cairo_status_to_string(status));
+  } else {
+    if (fill_opacity < 1.0) {
+      cairo_push_group(cairo);
+    }
+    cairo_save(cairo);
+    cairo_set_matrix(cairo, &mask_matrix);
+    cairo_mask(cairo, mask);
+    cairo_restore(cairo);
+    if (fill_opacity < 1.0) {
+      cairo_pop_group_to_source(cairo);
+      cairo_paint_with_alpha (cairo, fill_opacity);
+    }
+    cairo_pattern_destroy(mask);
+    mask = NULL;
+  }
+
+  popTransparencyGroup();
+  cairo_restore(cairo);
+}
+
+static int luminocity(uint32_t x)
+{
+  int r = (x >> 16) & 0xff;
+  int g = (x >>  8) & 0xff;
+  int b = (x >>  0) & 0xff;
+  // an arbitrary integer approximation of .3*r + .59*g + .11*b
+  int y = (r*19661+g*38666+b*7209 + 32829)>>16;
+  return y;
+}
+
+
+/* XXX: do we need to deal with shape here? */
+void CairoOutputDev::setSoftMask(GfxState * state, double * bbox, GBool alpha,
+                                 Function * transferFunc, GfxColor * backdropColor) {
+  cairo_pattern_destroy(mask);
+
+  LOG(printf ("set softMask\n"));
+
+  if (alpha == false) {
+    /* We need to mask according to the luminocity of the group.
+     * So we paint the group to an image surface convert it to a luminocity map
+     * and then use that as the mask. */
+
+    /* Get clip extents in device space */
+    double x1, y1, x2, y2, x_min, y_min, x_max, y_max;
+    cairo_clip_extents(cairo, &x1, &y1, &x2, &y2);
+    cairo_user_to_device(cairo, &x1, &y1);
+    cairo_user_to_device(cairo, &x2, &y2);
+    x_min = MIN(x1, x2);
+    y_min = MIN(y1, y2);
+    x_max = MAX(x1, x2);
+    y_max = MAX(y1, y2);
+    cairo_clip_extents(cairo, &x1, &y1, &x2, &y2);
+    cairo_user_to_device(cairo, &x1, &y2);
+    cairo_user_to_device(cairo, &x2, &y1);
+    x_min = MIN(x_min,MIN(x1, x2));
+    y_min = MIN(y_min,MIN(y1, y2));
+    x_max = MAX(x_max,MAX(x1, x2));
+    y_max = MAX(y_max,MAX(y1, y2));
+
+    int width = (int)(ceil(x_max) - floor(x_min));
+    int height = (int)(ceil(y_max) - floor(y_min));
+
+    /* Get group device offset */
+    double x_offset, y_offset;
+    if (cairo_get_group_target(cairo) == cairo_get_target(cairo)) {
+      cairo_surface_get_device_offset(cairo_get_group_target(cairo), &x_offset, &y_offset);
+    } else {
+      cairo_surface_t *pats;
+      cairo_pattern_get_surface(group, &pats);
+      cairo_surface_get_device_offset(pats, &x_offset, &y_offset);
+    }
+
+    /* Adjust extents by group offset */
+    x_min += x_offset;
+    y_min += y_offset;
+
+    cairo_surface_t *source = cairo_image_surface_create(CAIRO_FORMAT_ARGB32, width, height);
+    cairo_t *maskCtx = cairo_create(source);
+
+    //XXX: hopefully this uses the correct color space */
+    GfxRGB backdropColorRGB;
+    groupColorSpaceStack->cs->getRGB(backdropColor, &backdropColorRGB);
+    /* paint the backdrop */
+    cairo_set_source_rgb(maskCtx,
+                        colToDbl(backdropColorRGB.r),
+                        colToDbl(backdropColorRGB.g),
+                        colToDbl(backdropColorRGB.b));
+    cairo_paint(maskCtx);
+
+    /* Copy source ctm to mask ctm and translate origin so that the
+     * mask appears it the same location on the source surface.  */
+    cairo_matrix_t mat, tmat;
+    cairo_matrix_init_translate(&tmat, -x_min, -y_min);
+    cairo_get_matrix(cairo, &mat);
+    cairo_matrix_multiply(&mat, &mat, &tmat);
+    cairo_set_matrix(maskCtx, &mat);
+
+    /* make the device offset of the new mask match that of the group */
+    cairo_surface_set_device_offset(source, x_offset, y_offset);
+
+    /* paint the group */
+    cairo_set_source(maskCtx, group);
+    cairo_paint(maskCtx);
+
+    /* XXX status = cairo_status(maskCtx); */
+    cairo_destroy(maskCtx);
+
+    /* convert to a luminocity map */
+    uint32_t *source_data = (uint32_t*)cairo_image_surface_get_data(source);
+    /* get stride in units of 32 bits */
+    int stride = cairo_image_surface_get_stride(source)/4;
+    for (int y=0; y<height; y++) {
+      for (int x=0; x<width; x++) {
+       int lum;
+       lum = luminocity(source_data[y*stride + x]);
+       if (transferFunc) {
+         double lum_in, lum_out;
+         lum_in = lum/256.0;
+         transferFunc->transform(&lum_in, &lum_out);
+         lum = (int)(lum_out * 255.0 + 0.5);
+       }
+       source_data[y*stride + x] = lum << 24;
+      }
+    }
+    cairo_surface_mark_dirty (source);
+
+    /* setup the new mask pattern */
+    mask = cairo_pattern_create_for_surface(source);
+    cairo_get_matrix(cairo, &mask_matrix);
+
+    if (cairo_get_group_target(cairo) == cairo_get_target(cairo)) {
+      cairo_pattern_set_matrix(mask, &mat);
+    } else {
+      cairo_matrix_t patMatrix;
+      cairo_pattern_get_matrix(group, &patMatrix);
+      /* Apply x_min, y_min offset to it appears in the same location as source. */
+      cairo_matrix_multiply(&patMatrix, &patMatrix, &tmat);
+      cairo_pattern_set_matrix(mask, &patMatrix);
+    }
+
+    cairo_surface_destroy(source);
+  } else {
+    mask = cairo_pattern_reference(group);
+    cairo_get_matrix(cairo, &mask_matrix);
+  }
+
+  popTransparencyGroup();
+}
+
+void CairoOutputDev::popTransparencyGroup() {
+  /* pop color space */
+  ColorSpaceStack *css = groupColorSpaceStack;
+  if (css->knockout) {
+    knockoutCount--;
+    if (!knockoutCount) {
+      /* we don't need to track the shape anymore because
+       * we are not above any knockout groups */
+      cairo_destroy(cairo_shape);
+      cairo_shape = NULL;
+    }
+  }
+  groupColorSpaceStack = css->next;
+  delete css;
+}
+
+
+void CairoOutputDev::clearSoftMask(GfxState * /*state*/) {
+  if (mask)
+    cairo_pattern_destroy(mask);
+  mask = NULL;
+}
+
+/* Taken from cairo/doc/tutorial/src/singular.c */
+static void
+get_singular_values (const cairo_matrix_t *matrix,
+                    double               *major,
+                    double               *minor)
+{
+       double xx = matrix->xx, xy = matrix->xy;
+       double yx = matrix->yx, yy = matrix->yy;
+
+       double a = xx*xx+yx*yx;
+       double b = xy*xy+yy*yy;
+       double k = xx*xy+yx*yy;
+
+       double f = (a+b) * .5;
+       double g = (a-b) * .5;
+       double delta = sqrt (g*g + k*k);
+
+       if (major)
+               *major = sqrt (f + delta);
+       if (minor)
+               *minor = sqrt (f - delta);
+}
+
+void CairoOutputDev::getScaledSize(int  orig_width,
+                                  int  orig_height,
+                                  int *scaledWidth,
+                                  int *scaledHeight) {
+  cairo_matrix_t matrix;
+  cairo_get_matrix(cairo, &matrix);
+
+  double xScale;
+  double yScale;
+  if (orig_width > orig_height)
+    get_singular_values (&matrix, &xScale, &yScale);
+  else
+    get_singular_values (&matrix, &yScale, &xScale);
+
+  int tx, tx2, ty, ty2; /* the integer co-oridinates of the resulting image */
+  if (xScale >= 0) {
+    tx = splashRound(matrix.x0 - 0.01);
+    tx2 = splashRound(matrix.x0 + xScale + 0.01) - 1;
+  } else {
+    tx = splashRound(matrix.x0 + 0.01) - 1;
+    tx2 = splashRound(matrix.x0 + xScale - 0.01);
+  }
+  *scaledWidth = abs(tx2 - tx) + 1;
+  //scaledWidth = splashRound(fabs(xScale));
+  if (*scaledWidth == 0) {
+    // technically, this should draw nothing, but it generally seems
+    // better to draw a one-pixel-wide stripe rather than throwing it
+    // away
+    *scaledWidth = 1;
+  }
+  if (yScale >= 0) {
+    ty = splashFloor(matrix.y0 + 0.01);
+    ty2 = splashCeil(matrix.y0 + yScale - 0.01);
+  } else {
+    ty = splashCeil(matrix.y0 - 0.01);
+    ty2 = splashFloor(matrix.y0 + yScale + 0.01);
+  }
+  *scaledHeight = abs(ty2 - ty);
+  if (*scaledHeight == 0) {
+    *scaledHeight = 1;
+  }
+}
+
+cairo_surface_t *CairoOutputDev::downscaleSurface(cairo_surface_t *orig_surface) {
+  cairo_surface_t *dest_surface;
+  unsigned char *dest_buffer;
+  int dest_stride;
+  unsigned char *orig_buffer;
+  int orig_width, orig_height;
+  int orig_stride;
+  int scaledHeight;
+  int scaledWidth;
+  GBool res;
+
+  if (printing)
+    return NULL;
+
+  orig_width = cairo_image_surface_get_width (orig_surface);
+  orig_height = cairo_image_surface_get_height (orig_surface);
+  getScaledSize (orig_width, orig_height, &scaledWidth, &scaledHeight);
+  if (scaledWidth >= orig_width || scaledHeight >= orig_height)
+    return NULL;
+
+  dest_surface = cairo_surface_create_similar (orig_surface,
+                                              cairo_surface_get_content (orig_surface),
+                                              scaledWidth, scaledHeight);
+  dest_buffer = cairo_image_surface_get_data (dest_surface);
+  dest_stride = cairo_image_surface_get_stride (dest_surface);
+
+  orig_buffer = cairo_image_surface_get_data (orig_surface);
+  orig_stride = cairo_image_surface_get_stride (orig_surface);
+
+  res = downscale_box_filter((uint32_t *)orig_buffer,
+                            orig_stride, orig_width, orig_height,
+                            scaledWidth, scaledHeight, 0, 0,
+                            scaledWidth, scaledHeight,
+                            (uint32_t *)dest_buffer, dest_stride);
+  if (!res) {
+    cairo_surface_destroy (dest_surface);
+    return NULL;
+  }
+
+  return dest_surface;
+
+}
+
+cairo_filter_t
+CairoOutputDev::getFilterForSurface(cairo_surface_t *image,
+                                   GBool interpolate)
+{
+  if (interpolate)
+    return CAIRO_FILTER_BILINEAR;
+
+  int orig_width = cairo_image_surface_get_width (image);
+  int orig_height = cairo_image_surface_get_height (image);
+  if (orig_width == 0 || orig_height == 0)
+         return CAIRO_FILTER_NEAREST;
+
+  int scaled_width, scaled_height;
+  getScaledSize (orig_width, orig_height, &scaled_width, &scaled_height);
+
+  /* When scale factor is >= 400% we don't interpolate. See bugs #25268, #9860 */
+  if (scaled_width / orig_width >= 4 || scaled_height / orig_height >= 4)
+         return CAIRO_FILTER_NEAREST;
+
+  return CAIRO_FILTER_BILINEAR;
+}
+
+void CairoOutputDev::drawImageMask(GfxState *state, Object *ref, Stream *str,
+                                  int width, int height, GBool invert,
+                                  GBool interpolate, GBool inlineImg) {
+
+  /* FIXME: Doesn't the image mask support any colorspace? */
+  cairo_set_source (cairo, fill_pattern);
+
+  /* work around a cairo bug when scaling 1x1 surfaces */
+  if (width == 1 && height == 1) {
+    ImageStream *imgStr;
+    Guchar pix;
+    int invert_bit;
+
+    imgStr = new ImageStream(str, width, 1, 1);
+    imgStr->reset();
+    imgStr->getPixel(&pix);
+    imgStr->close();
+    delete imgStr;
+
+    invert_bit = invert ? 1 : 0;
+    if (pix ^ invert_bit)
+      return;
+
+    cairo_save (cairo);
+    cairo_rectangle (cairo, 0., 0., width, height);
+    cairo_fill (cairo);
+    cairo_restore (cairo);
+    if (cairo_shape) {
+      cairo_save (cairo_shape);
+      cairo_rectangle (cairo_shape, 0., 0., width, height);
+      cairo_fill (cairo_shape);
+      cairo_restore (cairo_shape);
+    }
+    return;
+  }
+
+  /* shape is 1.0 for painted areas, 0.0 for unpainted ones */
+
+  cairo_matrix_t matrix;
+  cairo_get_matrix (cairo, &matrix);
+  //XXX: it is possible that we should only do sub pixel positioning if 
+  // we are rendering fonts */
+  if (!printing && prescaleImages
+      /* not rotated */
+      && matrix.xy == 0 && matrix.yx == 0
+      /* axes not flipped / not 180 deg rotated */
+      && matrix.xx > 0 && (upsideDown() ? -1 : 1) * matrix.yy > 0) {
+    drawImageMaskPrescaled(state, ref, str, width, height, invert, interpolate, inlineImg);
+  } else {
+    drawImageMaskRegular(state, ref, str, width, height, invert, interpolate, inlineImg);
+  }
+
+}
+
+void CairoOutputDev::setSoftMaskFromImageMask(GfxState *state, Object *ref, Stream *str,
+                                  int width, int height, GBool invert,
+                                  GBool inlineImg, double *baseMatrix) {
+
+  /* FIXME: Doesn't the image mask support any colorspace? */
+  cairo_set_source (cairo, fill_pattern);
+
+  /* work around a cairo bug when scaling 1x1 surfaces */
+  if (width == 1 && height == 1) {
+    ImageStream *imgStr;
+    Guchar pix;
+    int invert_bit;
+
+    imgStr = new ImageStream(str, width, 1, 1);
+    imgStr->reset();
+    imgStr->getPixel(&pix);
+    imgStr->close();
+    delete imgStr;
+
+    invert_bit = invert ? 1 : 0;
+    if (pix ^ invert_bit)
+      return;
+
+    cairo_save (cairo);
+    cairo_rectangle (cairo, 0., 0., width, height);
+    cairo_fill (cairo);
+    cairo_restore (cairo);
+    if (cairo_shape) {
+      cairo_save (cairo_shape);
+      cairo_rectangle (cairo_shape, 0., 0., width, height);
+      cairo_fill (cairo_shape);
+      cairo_restore (cairo_shape);
+    }
+    return;
+  }
+
+  cairo_push_group_with_content (cairo, CAIRO_CONTENT_ALPHA);
+
+  /* shape is 1.0 for painted areas, 0.0 for unpainted ones */
+
+  cairo_matrix_t matrix;
+  cairo_get_matrix (cairo, &matrix);
+  //XXX: it is possible that we should only do sub pixel positioning if 
+  // we are rendering fonts */
+  if (!printing && prescaleImages && matrix.xy == 0.0 && matrix.yx == 0.0) {
+    drawImageMaskPrescaled(state, ref, str, width, height, invert, gFalse, inlineImg);
+  } else {
+    drawImageMaskRegular(state, ref, str, width, height, invert, gFalse, inlineImg);
+  }
+
+  if (state->getFillColorSpace()->getMode() == csPattern) {
+    cairo_set_source_rgb (cairo, 1, 1, 1);
+    cairo_set_matrix (cairo, &mask_matrix);
+    cairo_mask (cairo, mask);
+  }
+
+  if (mask)
+    cairo_pattern_destroy (mask);
+  mask = cairo_pop_group (cairo);
+
+  saveState(state);
+  double bbox[4] = {0,0,1,1}; // dummy
+  beginTransparencyGroup(state, bbox, state->getFillColorSpace(),
+                         gTrue, gFalse, gFalse);
+}
+
+void CairoOutputDev::unsetSoftMaskFromImageMask(GfxState *state, double *baseMatrix) {
+  double bbox[4] = {0,0,1,1}; // dummy
+
+  endTransparencyGroup(state);
+  restoreState(state);
+  paintTransparencyGroup(state, bbox);
+  clearSoftMask(state);
+}
+
+void CairoOutputDev::drawImageMaskRegular(GfxState *state, Object *ref, Stream *str,
+                                         int width, int height, GBool invert,
+                                         GBool interpolate, GBool inlineImg) {
+  unsigned char *buffer;
+  unsigned char *dest;
+  cairo_surface_t *image;
+  cairo_pattern_t *pattern;
+  int x, y, i, bit;
+  ImageStream *imgStr;
+  Guchar *pix;
+  cairo_matrix_t matrix;
+  int invert_bit;
+  int row_stride;
+  cairo_filter_t filter;
+
+  /* TODO: Do we want to cache these? */
+  imgStr = new ImageStream(str, width, 1, 1);
+  imgStr->reset();
+
+  image = cairo_image_surface_create (CAIRO_FORMAT_A1, width, height);
+  if (cairo_surface_status (image))
+    goto cleanup;
+
+  buffer = cairo_image_surface_get_data (image);
+  row_stride = cairo_image_surface_get_stride (image);
+
+  invert_bit = invert ? 1 : 0;
+
+  for (y = 0; y < height; y++) {
+    pix = imgStr->getLine();
+    dest = buffer + y * row_stride;
+    i = 0;
+    bit = 0;
+    for (x = 0; x < width; x++) {
+      if (bit == 0)
+       dest[i] = 0;
+      if (!(pix[x] ^ invert_bit)) {
+#ifdef WORDS_BIGENDIAN
+       dest[i] |= (1 << (7 - bit));
+#else
+       dest[i] |= (1 << bit);
+#endif
+      }
+      bit++;
+      if (bit > 7) {
+       bit = 0;
+       i++;
+      }
+    }
+  }
+
+  filter = getFilterForSurface (image, interpolate);
+
+  cairo_surface_mark_dirty (image);
+  pattern = cairo_pattern_create_for_surface (image);
+  cairo_surface_destroy (image);
+  if (cairo_pattern_status (pattern))
+    goto cleanup;
+
+  LOG (printf ("drawImageMask %dx%d\n", width, height));
+
+  cairo_pattern_set_filter (pattern, filter);
+
+  if (!printing)
+    cairo_pattern_set_extend (pattern, CAIRO_EXTEND_PAD);
+
+  cairo_matrix_init_translate (&matrix, 0, height);
+  cairo_matrix_scale (&matrix, width, -height);
+  cairo_pattern_set_matrix (pattern, &matrix);
+  if (cairo_pattern_status (pattern)) {
+    cairo_pattern_destroy (pattern);
+    goto cleanup;
+  }
+
+  if (state->getFillColorSpace()->getMode() == csPattern) {
+    mask = cairo_pattern_reference (pattern);
+    cairo_get_matrix (cairo, &mask_matrix);
+  } else if (!printing) {
+    cairo_save (cairo);
+    cairo_rectangle (cairo, 0., 0., 1., 1.);
+    cairo_clip (cairo);
+    cairo_mask (cairo, pattern);
+    cairo_restore (cairo);
+  } else {
+    cairo_mask (cairo, pattern);
+  }
+
+  if (cairo_shape) {
+    cairo_save (cairo_shape);
+    cairo_set_source (cairo_shape, pattern);
+    if (!printing) {
+      cairo_rectangle (cairo_shape, 0., 0., 1., 1.);
+      cairo_fill (cairo_shape);
+    } else {
+      cairo_mask (cairo_shape, pattern);
+    }
+    cairo_restore (cairo_shape);
+  }
+
+  cairo_pattern_destroy (pattern);
+
+cleanup:
+  imgStr->close();
+  delete imgStr;
+}
+
+
+void CairoOutputDev::drawImageMaskPrescaled(GfxState *state, Object *ref, Stream *str,
+                                           int width, int height, GBool invert,
+                                           GBool interpolate, GBool inlineImg) {
+  unsigned char *buffer;
+  cairo_surface_t *image;
+  cairo_pattern_t *pattern;
+  ImageStream *imgStr;
+  Guchar *pix;
+  cairo_matrix_t matrix;
+  int invert_bit;
+  int row_stride;
+
+  /* cairo does a very poor job of scaling down images so we scale them ourselves */
+
+  LOG (printf ("drawImageMaskPrescaled %dx%d\n", width, height));
+
+  /* this scaling code is adopted from the splash image scaling code */
+  cairo_get_matrix(cairo, &matrix);
+#if 0
+  printf("[%f %f], [%f %f], %f %f\n", matrix.xx, matrix.xy, matrix.yx, matrix.yy, matrix.x0, matrix.y0);
+#endif
+  /* this whole computation should be factored out */
+  double xScale = matrix.xx;
+  double yScale = matrix.yy;
+  int tx, tx2, ty, ty2; /* the integer co-oridinates of the resulting image */
+  int scaledHeight;
+  int scaledWidth;
+  if (xScale >= 0) {
+    tx = splashRound(matrix.x0 - 0.01);
+    tx2 = splashRound(matrix.x0 + xScale + 0.01) - 1;
+  } else {
+    tx = splashRound(matrix.x0 + 0.01) - 1;
+    tx2 = splashRound(matrix.x0 + xScale - 0.01);
+  }
+  scaledWidth = abs(tx2 - tx) + 1;
+  //scaledWidth = splashRound(fabs(xScale));
+  if (scaledWidth == 0) {
+    // technically, this should draw nothing, but it generally seems
+    // better to draw a one-pixel-wide stripe rather than throwing it
+    // away
+    scaledWidth = 1;
+  }
+  if (yScale >= 0) {
+    ty = splashFloor(matrix.y0 + 0.01);
+    ty2 = splashCeil(matrix.y0 + yScale - 0.01);
+  } else {
+    ty = splashCeil(matrix.y0 - 0.01);
+    ty2 = splashFloor(matrix.y0 + yScale + 0.01);
+  }
+  scaledHeight = abs(ty2 - ty);
+  if (scaledHeight == 0) {
+    scaledHeight = 1;
+  }
+#if 0
+  printf("xscale: %g, yscale: %g\n", xScale, yScale);
+  printf("width: %d, height: %d\n", width, height);
+  printf("scaledWidth: %d, scaledHeight: %d\n", scaledWidth, scaledHeight);
+#endif
+
+  /* compute the required padding */
+  /* Padding is used to preserve the aspect ratio.
+     We compute total_pad to make (height+total_pad)/scaledHeight as close to height/yScale as possible */
+  int head_pad = 0;
+  int tail_pad = 0;
+  int total_pad = splashRound(height*(scaledHeight/fabs(yScale)) - height);
+
+  /* compute the two pieces of padding */
+  if (total_pad > 0) {
+    //XXX: i'm not positive fabs() is correct
+    float tail_error = fabs(matrix.y0 - ty);
+    float head_error = fabs(ty2 - (matrix.y0 + yScale));
+    float tail_fraction = tail_error/(tail_error + head_error);
+    tail_pad = splashRound(total_pad*tail_fraction);
+    head_pad = total_pad - tail_pad;
+  } else {
+    tail_pad = 0;
+    head_pad = 0;
+  }
+  int origHeight = height;
+  height += tail_pad;
+  height += head_pad;
+#if 0
+  printf("head_pad: %d tail_pad: %d\n", head_pad, tail_pad);
+  printf("origHeight: %d height: %d\n", origHeight, height);
+  printf("ty: %d, ty2: %d\n", ty, ty2);
+#endif
+
+  /* TODO: Do we want to cache these? */
+  imgStr = new ImageStream(str, width, 1, 1);
+  imgStr->reset();
+
+  invert_bit = invert ? 1 : 0;
+
+  image = cairo_image_surface_create (CAIRO_FORMAT_A8, scaledWidth, scaledHeight);
+  if (cairo_surface_status (image)) {
+    imgStr->close();
+    delete imgStr;
+    return;
+  }
+
+  buffer = cairo_image_surface_get_data (image);
+  row_stride = cairo_image_surface_get_stride (image);
+
+  int yp = height / scaledHeight;
+  int yq = height % scaledHeight;
+  int xp = width / scaledWidth;
+  int xq = width % scaledWidth;
+  int yt = 0;
+  int origHeight_c = origHeight;
+  /* use MIN() because yp might be > origHeight because of padding */
+  unsigned char *pixBuf = (unsigned char *)malloc(MIN(yp+1, origHeight)*width);
+  int lastYStep = 1;
+  int total = 0;
+  for (int y = 0; y < scaledHeight; y++) {
+    // y scale Bresenham
+    int yStep = yp;
+    yt += yq;
+
+    if (yt >= scaledHeight) {
+      yt -= scaledHeight;
+      ++yStep;
+    }
+
+    // read row (s) from image ignoring the padding as appropriate
+    {
+      int n = (yp > 0) ? yStep : lastYStep;
+      total += n;
+      if (n > 0) {
+       unsigned char *p = pixBuf;
+       int head_pad_count = head_pad;
+       int origHeight_count = origHeight;
+       int tail_pad_count = tail_pad;
+       for (int i=0; i<n; i++) {
+         // get row
+         if (head_pad_count) {
+           head_pad_count--;
+         } else if (origHeight_count) {
+           pix = imgStr->getLine();
+           for (int j=0; j<width; j++) {
+             if (pix[j] ^ invert_bit)
+               p[j] = 0;
+             else
+               p[j] = 255;
+           }
+           origHeight_count--;
+           p += width;
+         } else if (tail_pad_count) {
+           tail_pad_count--;
+         } else {
+           printf("%d %d\n", n, total);
+           assert(0 && "over run\n");
+         }
+       }
+      }
+    }
+
+    lastYStep = yStep;
+    int k1 = y;
+
+    int xt = 0;
+    int xSrc = 0;
+    int x1 = k1;
+    int n = yStep > 0 ? yStep : 1;
+    int origN = n;
+
+    /* compute the size of padding and pixels that will be used for this row */
+    int head_pad_size = MIN(n, head_pad);
+    n -= head_pad_size;
+    head_pad -= MIN(head_pad_size, yStep);
+
+    int pix_size = MIN(n, origHeight);
+    n -= pix_size;
+    origHeight -= MIN(pix_size, yStep);
+
+    int tail_pad_size = MIN(n, tail_pad);
+    n -= tail_pad_size;
+    tail_pad -= MIN(tail_pad_size, yStep);
+    if (n != 0) {
+      printf("n = %d (%d %d %d)\n", n, head_pad_size, pix_size, tail_pad_size);
+      assert(n == 0);
+    }
+
+    for (int x = 0; x < scaledWidth; ++x) {
+      int xStep = xp;
+      xt += xq;
+      if (xt >= scaledWidth) {
+       xt -= scaledWidth;
+       ++xStep;
+      }
+      int m = xStep > 0 ? xStep : 1;
+      float pixAcc0 = 0;
+      /* could m * head_pad_size * tail_pad_size  overflow? */
+      if (invert_bit) {
+       pixAcc0 += m * head_pad_size * tail_pad_size * 255;
+      } else {
+       pixAcc0 += m * head_pad_size * tail_pad_size * 0;
+      }
+      /* Accumulate all of the source pixels for the destination pixel */
+      for (int i = 0; i < pix_size; ++i) {
+       for (int j = 0; j< m; ++j) {
+         if (xSrc + i*width + j > MIN(yp + 1, origHeight_c)*width) {
+           printf("%d > %d (%d %d %d %d) (%d %d %d)\n", xSrc + i*width + j, MIN(yp + 1, origHeight_c)*width, xSrc, i , width, j, yp, origHeight_c, width);
+           printf("%d %d %d\n", head_pad_size, pix_size, tail_pad_size);
+           assert(0 && "bad access\n");
+         }
+         pixAcc0 += pixBuf[xSrc + i*width + j];
+       }
+      }
+      buffer[y * row_stride + x] = splashFloor(pixAcc0 / (origN*m));
+      xSrc += xStep;
+      x1 += 1;
+    }
+
+  }
+  free(pixBuf);
+
+  cairo_surface_mark_dirty (image);
+  pattern = cairo_pattern_create_for_surface (image);
+  cairo_surface_destroy (image);
+  if (cairo_pattern_status (pattern)) {
+    imgStr->close();
+    delete imgStr;
+    return;
+  }
+
+  /* we should actually be using CAIRO_FILTER_NEAREST here. However,
+   * cairo doesn't yet do minifaction filtering causing scaled down
+   * images with CAIRO_FILTER_NEAREST to look really bad */
+  cairo_pattern_set_filter (pattern,
+                           interpolate ? CAIRO_FILTER_BEST : CAIRO_FILTER_FAST);
+  cairo_pattern_set_extend (pattern, CAIRO_EXTEND_PAD);
+
+  if (state->getFillColorSpace()->getMode() == csPattern) {
+    cairo_matrix_init_translate (&matrix, 0, scaledHeight);
+    cairo_matrix_scale (&matrix, scaledWidth, -scaledHeight);
+    cairo_pattern_set_matrix (pattern, &matrix);
+    if (cairo_pattern_status (pattern)) {
+      cairo_pattern_destroy (pattern);
+      imgStr->close();
+      delete imgStr;
+      return;
+    }
+
+    mask = cairo_pattern_reference (pattern);
+    cairo_get_matrix (cairo, &mask_matrix);
+  } else {
+    cairo_save (cairo);
+
+    /* modify our current transformation so that the prescaled image
+     * goes where it is supposed to */
+    cairo_get_matrix(cairo, &matrix);
+    cairo_scale(cairo, 1.0/matrix.xx, 1.0/matrix.yy);
+    // get integer co-ords
+    cairo_translate (cairo, tx - matrix.x0, ty2 - matrix.y0);
+    if (yScale > 0)
+      cairo_scale(cairo, 1, -1);
+
+    cairo_rectangle (cairo, 0., 0., scaledWidth, scaledHeight);
+    cairo_clip (cairo);
+    cairo_mask (cairo, pattern);
+
+    //cairo_get_matrix(cairo, &matrix);
+    //printf("mask at: [%f %f], [%f %f], %f %f\n\n", matrix.xx, matrix.xy, matrix.yx, matrix.yy, matrix.x0, matrix.y0);
+    cairo_restore(cairo);
+  }
+
+  if (cairo_shape) {
+    cairo_save (cairo_shape);
+
+    /* modify our current transformation so that the prescaled image
+     * goes where it is supposed to */
+    cairo_get_matrix(cairo_shape, &matrix);
+    cairo_scale(cairo_shape, 1.0/matrix.xx, 1.0/matrix.yy);
+    // get integer co-ords
+    cairo_translate (cairo_shape, tx - matrix.x0, ty2 - matrix.y0);
+    if (yScale > 0)
+      cairo_scale(cairo_shape, 1, -1);
+
+    cairo_rectangle (cairo_shape, 0., 0., scaledWidth, scaledHeight);
+    cairo_fill (cairo_shape);
+
+    cairo_restore(cairo_shape);
+  }
+
+  cairo_pattern_destroy (pattern);
+
+  imgStr->close();
+  delete imgStr;
+}
+
+void CairoOutputDev::drawMaskedImage(GfxState *state, Object *ref,
+                                    Stream *str, int width, int height,
+                                    GfxImageColorMap *colorMap,
+                                    GBool interpolate,
+                                    Stream *maskStr, int maskWidth,
+                                    int maskHeight, GBool maskInvert,
+                                    GBool maskInterpolate)
+{
+  ImageStream *maskImgStr, *imgStr;
+  int row_stride;
+  unsigned char *maskBuffer, *buffer;
+  unsigned char *maskDest;
+  unsigned int *dest;
+  cairo_surface_t *maskImage, *image;
+  cairo_pattern_t *maskPattern, *pattern;
+  cairo_matrix_t matrix;
+  cairo_matrix_t maskMatrix;
+  Guchar *pix;
+  int x, y;
+  int invert_bit;
+  cairo_filter_t filter;
+  cairo_filter_t maskFilter;
+
+  maskImgStr = new ImageStream(maskStr, maskWidth, 1, 1);
+  maskImgStr->reset();
+
+  maskImage = cairo_image_surface_create (CAIRO_FORMAT_A8, maskWidth, maskHeight);
+  if (cairo_surface_status (maskImage)) {
+    maskImgStr->close();
+    delete maskImgStr;
+    return;
+  }
+
+  maskBuffer = cairo_image_surface_get_data (maskImage);
+  row_stride = cairo_image_surface_get_stride (maskImage);
+
+  invert_bit = maskInvert ? 1 : 0;
+
+  for (y = 0; y < maskHeight; y++) {
+    pix = maskImgStr->getLine();
+    maskDest = maskBuffer + y * row_stride;
+    for (x = 0; x < maskWidth; x++) {
+      if (pix[x] ^ invert_bit)
+       *maskDest++ = 0;
+      else
+       *maskDest++ = 255;
+    }
+  }
+
+  maskImgStr->close();
+  delete maskImgStr;
+
+  maskFilter = getFilterForSurface (maskImage, maskInterpolate);
+
+  cairo_surface_mark_dirty (maskImage);
+  maskPattern = cairo_pattern_create_for_surface (maskImage);
+  cairo_surface_destroy (maskImage);
+  if (cairo_pattern_status (maskPattern))
+    return;
+
+#if 0
+  /* ICCBased color space doesn't do any color correction
+   * so check its underlying color space as well */
+  int is_identity_transform;
+  is_identity_transform = colorMap->getColorSpace()->getMode() == csDeviceRGB ||
+                 (colorMap->getColorSpace()->getMode() == csICCBased && 
+                  ((GfxICCBasedColorSpace*)colorMap->getColorSpace())->getAlt()->getMode() == csDeviceRGB);
+#endif
+
+  /* TODO: Do we want to cache these? */
+  imgStr = new ImageStream(str, width,
+                          colorMap->getNumPixelComps(),
+                          colorMap->getBits());
+  imgStr->reset();
+
+  image = cairo_image_surface_create (CAIRO_FORMAT_RGB24, width, height);
+  if (cairo_surface_status (image))
+    goto cleanup;
+
+  buffer = cairo_image_surface_get_data (image);
+  row_stride = cairo_image_surface_get_stride (image);
+  for (y = 0; y < height; y++) {
+    dest = (unsigned int *) (buffer + y * row_stride);
+    pix = imgStr->getLine();
+    colorMap->getRGBLine (pix, dest, width);
+  }
+
+  filter = getFilterForSurface (image, interpolate);
+
+  cairo_surface_mark_dirty (image);
+  pattern = cairo_pattern_create_for_surface (image);
+  cairo_surface_destroy (image);
+  if (cairo_pattern_status (pattern))
+    goto cleanup;
+
+  LOG (printf ("drawMaskedImage %dx%d\n", width, height));
+
+  cairo_pattern_set_filter (pattern, filter);
+  cairo_pattern_set_filter (maskPattern, maskFilter);
+
+  if (!printing) {
+    cairo_pattern_set_extend (pattern, CAIRO_EXTEND_PAD);
+    cairo_pattern_set_extend (maskPattern, CAIRO_EXTEND_PAD);
+  }
+
+  cairo_matrix_init_translate (&matrix, 0, height);
+  cairo_matrix_scale (&matrix, width, -height);
+  cairo_pattern_set_matrix (pattern, &matrix);
+  if (cairo_pattern_status (pattern)) {
+    cairo_pattern_destroy (pattern);
+    cairo_pattern_destroy (maskPattern);
+    goto cleanup;
+  }
+
+  cairo_matrix_init_translate (&maskMatrix, 0, maskHeight);
+  cairo_matrix_scale (&maskMatrix, maskWidth, -maskHeight);
+  cairo_pattern_set_matrix (maskPattern, &maskMatrix);
+  if (cairo_pattern_status (maskPattern)) {
+    cairo_pattern_destroy (maskPattern);
+    cairo_pattern_destroy (pattern);
+    goto cleanup;
+  }
+
+  if (!printing) {
+    cairo_save (cairo);
+    cairo_set_source (cairo, pattern);
+    cairo_rectangle (cairo, 0., 0., 1., 1.);
+    cairo_clip (cairo);
+    cairo_mask (cairo, maskPattern);
+    cairo_restore (cairo);
+  } else {
+    cairo_set_source (cairo, pattern);
+    cairo_mask (cairo, maskPattern);
+  }
+
+  if (cairo_shape) {
+    cairo_save (cairo_shape);
+    cairo_set_source (cairo_shape, pattern);
+    if (!printing) {
+      cairo_rectangle (cairo_shape, 0., 0., 1., 1.);
+      cairo_fill (cairo_shape);
+    } else {
+      cairo_mask (cairo_shape, pattern);
+    }
+    cairo_restore (cairo_shape);
+  }
+
+  cairo_pattern_destroy (maskPattern);
+  cairo_pattern_destroy (pattern);
+
+cleanup:
+  imgStr->close();
+  delete imgStr;
+}
+
+
+//XXX: is this affect by AIS(alpha is shape)?
+void CairoOutputDev::drawSoftMaskedImage(GfxState *state, Object *ref, Stream *str,
+                                        int width, int height,
+                                        GfxImageColorMap *colorMap,
+                                        GBool interpolate,
+                                        Stream *maskStr,
+                                        int maskWidth, int maskHeight,
+                                        GfxImageColorMap *maskColorMap,
+                                        GBool maskInterpolate)
+{
+  ImageStream *maskImgStr, *imgStr;
+  int row_stride;
+  unsigned char *maskBuffer, *buffer;
+  unsigned char *maskDest;
+  unsigned int *dest;
+  cairo_surface_t *maskImage, *image;
+  cairo_pattern_t *maskPattern, *pattern;
+  cairo_matrix_t maskMatrix, matrix;
+  Guchar *pix;
+  int y;
+  cairo_filter_t filter;
+  cairo_filter_t maskFilter;
+
+  maskImgStr = new ImageStream(maskStr, maskWidth,
+                              maskColorMap->getNumPixelComps(),
+                              maskColorMap->getBits());
+  maskImgStr->reset();
+
+  maskImage = cairo_image_surface_create (CAIRO_FORMAT_A8, maskWidth, maskHeight);
+  if (cairo_surface_status (maskImage)) {
+    maskImgStr->close();
+    delete maskImgStr;
+    return;
+  }
+
+  maskBuffer = cairo_image_surface_get_data (maskImage);
+  row_stride = cairo_image_surface_get_stride (maskImage);
+  for (y = 0; y < maskHeight; y++) {
+    maskDest = (unsigned char *) (maskBuffer + y * row_stride);
+    pix = maskImgStr->getLine();
+    maskColorMap->getGrayLine (pix, maskDest, maskWidth);
+  }
+
+  maskImgStr->close();
+  delete maskImgStr;
+
+  maskFilter = getFilterForSurface (maskImage, maskInterpolate);
+
+  cairo_surface_mark_dirty (maskImage);
+  maskPattern = cairo_pattern_create_for_surface (maskImage);
+  cairo_surface_destroy (maskImage);
+  if (cairo_pattern_status (maskPattern))
+    return;
+
+#if 0
+  /* ICCBased color space doesn't do any color correction
+   * so check its underlying color space as well */
+  int is_identity_transform;
+  is_identity_transform = colorMap->getColorSpace()->getMode() == csDeviceRGB ||
+                 (colorMap->getColorSpace()->getMode() == csICCBased &&
+                  ((GfxICCBasedColorSpace*)colorMap->getColorSpace())->getAlt()->getMode() == csDeviceRGB);
+#endif
+
+  /* TODO: Do we want to cache these? */
+  imgStr = new ImageStream(str, width,
+                          colorMap->getNumPixelComps(),
+                          colorMap->getBits());
+  imgStr->reset();
+
+  image = cairo_image_surface_create (CAIRO_FORMAT_RGB24, width, height);
+  if (cairo_surface_status (image))
+    goto cleanup;
+
+  buffer = cairo_image_surface_get_data (image);
+  row_stride = cairo_image_surface_get_stride (image);
+  for (y = 0; y < height; y++) {
+    dest = (unsigned int *) (buffer + y * row_stride);
+    pix = imgStr->getLine();
+    colorMap->getRGBLine (pix, dest, width);
+  }
+
+  filter = getFilterForSurface (image, interpolate);
+
+  cairo_surface_mark_dirty (image);
+
+  setMimeData(str, ref, image);
+
+  pattern = cairo_pattern_create_for_surface (image);
+  cairo_surface_destroy (image);
+  if (cairo_pattern_status (pattern))
+    goto cleanup;
+
+  LOG (printf ("drawSoftMaskedImage %dx%d\n", width, height));
+
+  cairo_pattern_set_filter (pattern, filter);
+  cairo_pattern_set_filter (maskPattern, maskFilter);
+
+  if (!printing) {
+    cairo_pattern_set_extend (pattern, CAIRO_EXTEND_PAD);
+    cairo_pattern_set_extend (maskPattern, CAIRO_EXTEND_PAD);
+  }
+
+  cairo_matrix_init_translate (&matrix, 0, height);
+  cairo_matrix_scale (&matrix, width, -height);
+  cairo_pattern_set_matrix (pattern, &matrix);
+  if (cairo_pattern_status (pattern)) {
+    cairo_pattern_destroy (pattern);
+    cairo_pattern_destroy (maskPattern);
+    goto cleanup;
+  }
+
+  cairo_matrix_init_translate (&maskMatrix, 0, maskHeight);
+  cairo_matrix_scale (&maskMatrix, maskWidth, -maskHeight);
+  cairo_pattern_set_matrix (maskPattern, &maskMatrix);
+  if (cairo_pattern_status (maskPattern)) {
+    cairo_pattern_destroy (maskPattern);
+    cairo_pattern_destroy (pattern);
+    goto cleanup;
+  }
+
+  if (fill_opacity != 1.0)
+    cairo_push_group (cairo);
+  else
+    cairo_save (cairo);
+
+  cairo_set_source (cairo, pattern);
+  if (!printing) {
+    cairo_rectangle (cairo, 0., 0.,
+                    MIN (width, maskWidth) / (double)width,
+                    MIN (height, maskHeight) / (double)height);
+    cairo_clip (cairo);
+  }
+  cairo_mask (cairo, maskPattern);
+
+  if (fill_opacity != 1.0) {
+    cairo_pop_group_to_source (cairo);
+    cairo_save (cairo);
+    if (!printing) {
+      cairo_rectangle (cairo, 0., 0.,
+                      MIN (width, maskWidth) / (double)width,
+                      MIN (height, maskHeight) / (double)height);
+      cairo_clip (cairo);
+    }
+    cairo_paint_with_alpha (cairo, fill_opacity);
+  }
+  cairo_restore (cairo);
+
+  if (cairo_shape) {
+    cairo_save (cairo_shape);
+    cairo_set_source (cairo_shape, pattern);
+    if (!printing) {
+      cairo_rectangle (cairo_shape, 0., 0.,
+                      MIN (width, maskWidth) / (double)width,
+                      MIN (height, maskHeight) / (double)height);
+      cairo_fill (cairo_shape);
+    } else {
+      cairo_mask (cairo_shape, pattern);
+    }
+    cairo_restore (cairo_shape);
+  }
+
+  cairo_pattern_destroy (maskPattern);
+  cairo_pattern_destroy (pattern);
+
+cleanup:
+  imgStr->close();
+  delete imgStr;
+}
+
+GBool CairoOutputDev::getStreamData (Stream *str, char **buffer, int *length)
+{
+  int len, i;
+  char *strBuffer;
+
+  len = 0;
+  str->close();
+  str->reset();
+  while (str->getChar() != EOF) len++;
+  if (len == 0)
+    return gFalse;
+
+  strBuffer = (char *)gmalloc (len);
+
+  str->close();
+  str->reset();
+  for (i = 0; i < len; ++i)
+    strBuffer[i] = str->getChar();
+
+  *buffer = strBuffer;
+  *length = len;
+
+  return gTrue;
+}
+
+void CairoOutputDev::setMimeData(Stream *str, Object *ref, cairo_surface_t *image)
+{
+  char *strBuffer;
+  int len;
+  Object obj;
+
+  if (!printing || !(str->getKind() == strDCT || str->getKind() == strJPX))
+    return;
+
+  // colorspace in stream dict may be different from colorspace in jpx
+  // data
+  if (str->getKind() == strJPX) {
+    GBool hasColorSpace = !str->getDict()->lookup("ColorSpace", &obj)->isNull();
+    obj.free();
+    if (hasColorSpace)
+      return;
+  }
+
+  if (getStreamData (str->getNextStream(), &strBuffer, &len)) {
+    cairo_status_t st;
+
+#if CAIRO_VERSION >= CAIRO_VERSION_ENCODE(1, 11, 2)
+    if (ref && ref->isRef()) {
+      Ref imgRef = ref->getRef();
+      GooString *surfaceId = new GooString("poppler-surface-");
+      surfaceId->appendf("{0:d}-{1:d}", imgRef.gen, imgRef.num);
+      char *idBuffer = copyString(surfaceId->getCString());
+      st = cairo_surface_set_mime_data (image, CAIRO_MIME_TYPE_UNIQUE_ID,
+                                        (const unsigned char *)idBuffer,
+                                        surfaceId->getLength(),
+                                        gfree, idBuffer);
+      if (st)
+        gfree(idBuffer);
+      delete surfaceId;
+    }
+#endif
+
+    st = cairo_surface_set_mime_data (image,
+                                     str->getKind() == strDCT ?
+                                     CAIRO_MIME_TYPE_JPEG : CAIRO_MIME_TYPE_JP2,
+                                     (const unsigned char *)strBuffer, len,
+                                     gfree, strBuffer);
+    if (st)
+      gfree (strBuffer);
+  }
+}
+
+void CairoOutputDev::drawImage(GfxState *state, Object *ref, Stream *str,
+                              int width, int height,
+                              GfxImageColorMap *colorMap,
+                              GBool interpolate,
+                              int *maskColors, GBool inlineImg)
+{
+  cairo_surface_t *image;
+  cairo_pattern_t *pattern, *maskPattern;
+  ImageStream *imgStr;
+  cairo_matrix_t matrix;
+  unsigned char *buffer;
+  int stride, i;
+  GfxRGB *lookup = NULL;
+  cairo_filter_t filter = CAIRO_FILTER_BILINEAR;
+
+  /* TODO: Do we want to cache these? */
+  imgStr = new ImageStream(str, width,
+                          colorMap->getNumPixelComps(),
+                          colorMap->getBits());
+  imgStr->reset();
+
+#if 0
+  /* ICCBased color space doesn't do any color correction
+   * so check its underlying color space as well */
+  int is_identity_transform;
+  is_identity_transform = colorMap->getColorSpace()->getMode() == csDeviceRGB ||
+                 (colorMap->getColorSpace()->getMode() == csICCBased &&
+                  ((GfxICCBasedColorSpace*)colorMap->getColorSpace())->getAlt()->getMode() == csDeviceRGB);
+#endif
+
+  image = cairo_image_surface_create (maskColors ?
+                                     CAIRO_FORMAT_ARGB32 :
+                                     CAIRO_FORMAT_RGB24,
+                                     width, height);
+  if (cairo_surface_status (image))
+    goto cleanup;
+
+  // special case for one-channel (monochrome/gray/separation) images:
+  // build a lookup table here
+  if (colorMap->getNumPixelComps() == 1) {
+    int n;
+    Guchar pix;
+
+    n = 1 << colorMap->getBits();
+    lookup = (GfxRGB *)gmallocn(n, sizeof(GfxRGB));
+    for (i = 0; i < n; ++i) {
+      pix = (Guchar)i;
+
+      colorMap->getRGB(&pix, &lookup[i]);
+    }
+  }
+
+  buffer = cairo_image_surface_get_data (image);
+  stride = cairo_image_surface_get_stride (image);
+  for (int y = 0; y < height; y++) {
+    uint32_t *dest = (uint32_t *) (buffer + y * stride);
+    Guchar *pix = imgStr->getLine();
+
+    if (lookup) {
+      Guchar *p = pix;
+      GfxRGB rgb;
+
+      for (i = 0; i < width; i++) {
+        rgb = lookup[*p];
+        dest[i] =
+               ((int) colToByte(rgb.r) << 16) |
+               ((int) colToByte(rgb.g) << 8) |
+               ((int) colToByte(rgb.b) << 0);
+       p++;
+      }
+    } else {
+      colorMap->getRGBLine (pix, dest, width);
+    }
+
+    if (maskColors) {
+      for (int x = 0; x < width; x++) {
+       bool is_opaque = false;
+       for (int i = 0; i < colorMap->getNumPixelComps(); ++i) {
+         if (pix[i] < maskColors[2*i] ||
+             pix[i] > maskColors[2*i+1]) {
+           is_opaque = true;
+           break;
+         }
+       }
+       if (is_opaque)
+         *dest |= 0xff000000;
+       else
+         *dest = 0;
+       dest++;
+       pix += colorMap->getNumPixelComps();
+      }
+    }
+  }
+  gfree(lookup);
+
+  LOG (printf ("drawImage %dx%d\n", width, height));
+
+  cairo_surface_t *scaled_surface;
+
+  scaled_surface = downscaleSurface (image);
+  if (scaled_surface) {
+    if (cairo_surface_status (scaled_surface))
+      goto cleanup;
+    cairo_surface_destroy (image);
+    image = scaled_surface;
+    width = cairo_image_surface_get_width (image);
+    height = cairo_image_surface_get_height (image);
+  } else {
+    filter = getFilterForSurface (image, interpolate);
+  }
+
+  cairo_surface_mark_dirty (image);
+
+  if (!inlineImg) /* don't read stream twice if it is an inline image */
+    setMimeData(str, ref, image);
+
+  pattern = cairo_pattern_create_for_surface (image);
+  cairo_surface_destroy (image);
+  if (cairo_pattern_status (pattern))
+    goto cleanup;
+
+  cairo_pattern_set_filter (pattern, filter);
+
+  if (!printing)
+    cairo_pattern_set_extend (pattern, CAIRO_EXTEND_PAD);
+
+  cairo_matrix_init_translate (&matrix, 0, height);
+  cairo_matrix_scale (&matrix, width, -height);
+  cairo_pattern_set_matrix (pattern, &matrix);
+  if (cairo_pattern_status (pattern)) {
+    cairo_pattern_destroy (pattern);
+    goto cleanup;
+  }
+
+  if (!mask && fill_opacity != 1.0) {
+    maskPattern = cairo_pattern_create_rgba (1., 1., 1., fill_opacity);
+  } else if (mask) {
+    maskPattern = cairo_pattern_reference (mask);
+  } else {
+    maskPattern = NULL;
+  }
+
+  cairo_save (cairo);
+  cairo_set_source (cairo, pattern);
+  if (!printing)
+    cairo_rectangle (cairo, 0., 0., 1., 1.);
+  if (maskPattern) {
+    if (!printing)
+      cairo_clip (cairo);
+    cairo_set_matrix (cairo, &mask_matrix);
+    cairo_mask (cairo, maskPattern);
+  } else {
+    if (printing)
+      cairo_paint (cairo);
+    else
+      cairo_fill (cairo);
+  }
+  cairo_restore (cairo);
+
+  cairo_pattern_destroy (maskPattern);
+
+  if (cairo_shape) {
+    cairo_save (cairo_shape);
+    cairo_set_source (cairo_shape, pattern);
+    if (printing) {
+      cairo_paint (cairo_shape);
+    } else {
+      cairo_rectangle (cairo_shape, 0., 0., 1., 1.);
+      cairo_fill (cairo_shape);
+    }
+    cairo_restore (cairo_shape);
+  }
+
+  cairo_pattern_destroy (pattern);
+
+cleanup:
+  imgStr->close();
+  delete imgStr;
+}
+
+
+//------------------------------------------------------------------------
+// ImageOutputDev
+//------------------------------------------------------------------------
+
+CairoImageOutputDev::CairoImageOutputDev()
+{
+  images = NULL;
+  numImages = 0;
+  size = 0;
+  imgDrawCbk = NULL;
+  imgDrawCbkData = NULL;
+}
+
+CairoImageOutputDev::~CairoImageOutputDev()
+{
+  int i;
+
+  for (i = 0; i < numImages; i++)
+    delete images[i];
+  gfree (images);
+}
+
+void CairoImageOutputDev::saveImage(CairoImage *image)
+{ 
+  if (numImages >= size) {
+         size += 16;
+         images = (CairoImage **) greallocn (images, size, sizeof (CairoImage *));
+  }
+  images[numImages++] = image;
+}      
+
+void CairoImageOutputDev::drawImageMask(GfxState *state, Object *ref, Stream *str,
+                                       int width, int height, GBool invert,
+                                       GBool interpolate, GBool inlineImg)
+{
+  cairo_t *cr;
+  cairo_surface_t *surface;
+  double x1, y1, x2, y2;
+  double *ctm;
+  double mat[6];
+  CairoImage *image;
+
+  ctm = state->getCTM();
+  
+  mat[0] = ctm[0];
+  mat[1] = ctm[1];
+  mat[2] = -ctm[2];
+  mat[3] = -ctm[3];
+  mat[4] = ctm[2] + ctm[4];
+  mat[5] = ctm[3] + ctm[5];
+  x1 = mat[4];
+  y1 = mat[5];
+  x2 = x1 + width;
+  y2 = y1 + height;
+
+  image = new CairoImage (x1, y1, x2, y2);
+  saveImage (image);
+
+  if (imgDrawCbk && imgDrawCbk (numImages - 1, imgDrawCbkData)) {
+    surface = cairo_image_surface_create (CAIRO_FORMAT_ARGB32, width, height);
+    cr = cairo_create (surface);
+    setCairo (cr);
+    cairo_translate (cr, 0, height);
+    cairo_scale (cr, width, -height);
+
+    CairoOutputDev::drawImageMask(state, ref, str, width, height, invert, interpolate, inlineImg);
+    image->setImage (surface);
+
+    setCairo (NULL);
+    cairo_surface_destroy (surface);
+    cairo_destroy (cr);
+  }
+}
+
+void CairoImageOutputDev::drawImage(GfxState *state, Object *ref, Stream *str,
+                                   int width, int height, GfxImageColorMap *colorMap,
+                                   GBool interpolate, int *maskColors, GBool inlineImg)
+{
+  cairo_t *cr;
+  cairo_surface_t *surface;
+  double x1, y1, x2, y2;
+  double *ctm;
+  double mat[6];
+  CairoImage *image;
+
+  ctm = state->getCTM();
+  
+  mat[0] = ctm[0];
+  mat[1] = ctm[1];
+  mat[2] = -ctm[2];
+  mat[3] = -ctm[3];
+  mat[4] = ctm[2] + ctm[4];
+  mat[5] = ctm[3] + ctm[5];
+  x1 = mat[4];
+  y1 = mat[5];
+  x2 = x1 + width;
+  y2 = y1 + height;
+
+  image = new CairoImage (x1, y1, x2, y2);
+  saveImage (image);
+
+  if (imgDrawCbk && imgDrawCbk (numImages - 1, imgDrawCbkData)) {
+    surface = cairo_image_surface_create (CAIRO_FORMAT_ARGB32, width, height);
+    cr = cairo_create (surface);
+    setCairo (cr);
+    cairo_translate (cr, 0, height);
+    cairo_scale (cr, width, -height);
+    
+    CairoOutputDev::drawImage(state, ref, str, width, height, colorMap, interpolate, maskColors, inlineImg);
+    image->setImage (surface);
+    
+    setCairo (NULL);
+    cairo_surface_destroy (surface);
+    cairo_destroy (cr);
+  }
+}
+
+void CairoImageOutputDev::drawSoftMaskedImage(GfxState *state, Object *ref, Stream *str,
+                                             int width, int height,
+                                             GfxImageColorMap *colorMap,
+                                             GBool interpolate,
+                                             Stream *maskStr,
+                                             int maskWidth, int maskHeight,
+                                             GfxImageColorMap *maskColorMap,
+                                             GBool maskInterpolate)
+{
+  cairo_t *cr;
+  cairo_surface_t *surface;
+  double x1, y1, x2, y2;
+  double *ctm;
+  double mat[6];
+  CairoImage *image;
+
+  ctm = state->getCTM();
+  
+  mat[0] = ctm[0];
+  mat[1] = ctm[1];
+  mat[2] = -ctm[2];
+  mat[3] = -ctm[3];
+  mat[4] = ctm[2] + ctm[4];
+  mat[5] = ctm[3] + ctm[5];
+  x1 = mat[4];
+  y1 = mat[5];
+  x2 = x1 + width;
+  y2 = y1 + height;
+
+  image = new CairoImage (x1, y1, x2, y2);
+  saveImage (image);
+
+  if (imgDrawCbk && imgDrawCbk (numImages - 1, imgDrawCbkData)) {
+    surface = cairo_image_surface_create (CAIRO_FORMAT_ARGB32, width, height);
+    cr = cairo_create (surface);
+    setCairo (cr);
+    cairo_translate (cr, 0, height);
+    cairo_scale (cr, width, -height);
+    
+    CairoOutputDev::drawSoftMaskedImage(state, ref, str, width, height, colorMap, interpolate,
+                                       maskStr, maskWidth, maskHeight, maskColorMap, maskInterpolate);
+    image->setImage (surface);
+    
+    setCairo (NULL);
+    cairo_surface_destroy (surface);
+    cairo_destroy (cr);
+  }
+}
+
+void CairoImageOutputDev::drawMaskedImage(GfxState *state, Object *ref, Stream *str,
+                                         int width, int height,
+                                         GfxImageColorMap *colorMap,
+                                         GBool interpolate,
+                                         Stream *maskStr,
+                                         int maskWidth, int maskHeight,
+                                         GBool maskInvert, GBool maskInterpolate)
+{
+  cairo_t *cr;
+  cairo_surface_t *surface;
+  double x1, y1, x2, y2;
+  double *ctm;
+  double mat[6];
+  CairoImage *image;
+
+  ctm = state->getCTM();
+  
+  mat[0] = ctm[0];
+  mat[1] = ctm[1];
+  mat[2] = -ctm[2];
+  mat[3] = -ctm[3];
+  mat[4] = ctm[2] + ctm[4];
+  mat[5] = ctm[3] + ctm[5];
+  x1 = mat[4];
+  y1 = mat[5];
+  x2 = x1 + width;
+  y2 = y1 + height;
+
+  image = new CairoImage (x1, y1, x2, y2);
+  saveImage (image);
+
+  if (imgDrawCbk && imgDrawCbk (numImages - 1, imgDrawCbkData)) {
+    surface = cairo_image_surface_create (CAIRO_FORMAT_ARGB32, width, height);
+    cr = cairo_create (surface);
+    setCairo (cr);
+    cairo_translate (cr, 0, height);
+    cairo_scale (cr, width, -height);
+    
+    CairoOutputDev::drawMaskedImage(state, ref, str, width, height, colorMap, interpolate,
+                                   maskStr, maskWidth, maskHeight, maskInvert, maskInterpolate);
+    image->setImage (surface);
+    
+    setCairo (NULL);
+    cairo_surface_destroy (surface);
+    cairo_destroy (cr);
+  }
+}
diff --git a/poppler/CairoOutputDev.h b/poppler/CairoOutputDev.h
new file mode 100644 (file)
index 0000000..df76975
--- /dev/null
@@ -0,0 +1,498 @@
+//========================================================================
+//
+// CairoOutputDev.h
+//
+// Copyright 2003 Glyph & Cog, LLC
+// Copyright 2004 Red Hat, INC
+//
+//========================================================================
+
+//========================================================================
+//
+// Modified under the Poppler project - http://poppler.freedesktop.org
+//
+// All changes made under the Poppler project to this file are licensed
+// under GPL version 2 or later
+//
+// Copyright (C) 2005-2008 Jeff Muizelaar <jeff@infidigm.net>
+// Copyright (C) 2005, 2006 Kristian Høgsberg <krh@redhat.com>
+// Copyright (C) 2005 Nickolay V. Shmyrev <nshmyrev@yandex.ru>
+// Copyright (C) 2006-2011 Carlos Garcia Campos <carlosgc@gnome.org>
+// Copyright (C) 2008, 2009, 2011, 2012 Adrian Johnson <ajohnson@redneon.com>
+// Copyright (C) 2008 Michael Vrable <mvrable@cs.ucsd.edu>
+// Copyright (C) 2010-2012 Thomas Freitag <Thomas.Freitag@alfa.de>
+//
+// To see a description of the changes please see the Changelog file that
+// came with your tarball or type make ChangeLog if you are building from git
+//
+//========================================================================
+
+#ifndef CAIROOUTPUTDEV_H
+#define CAIROOUTPUTDEV_H
+
+#ifdef USE_GCC_PRAGMAS
+#pragma interface
+#endif
+
+#include "goo/gtypes.h"
+#include <cairo-ft.h>
+#include "OutputDev.h"
+#include "TextOutputDev.h"
+#include "GfxState.h"
+
+class PDFDoc;
+class GfxState;
+class GfxPath;
+class Gfx8BitFont;
+struct GfxRGB;
+class CairoFontEngine;
+class CairoFont;
+
+//------------------------------------------------------------------------
+
+//------------------------------------------------------------------------
+// CairoImage
+//------------------------------------------------------------------------
+class CairoImage {
+public:
+  // Constructor.
+  CairoImage (double x1, double y1, double x2, double y2);
+
+  // Destructor.
+  ~CairoImage ();
+
+  // Set the image cairo surface
+  void setImage (cairo_surface_t *image);
+  
+  // Get the image cairo surface
+  cairo_surface_t *getImage () const { return image; }
+
+  // Get the image rectangle
+  void getRect (double *xa1, double *ya1, double *xa2, double *ya2)
+         { *xa1 = x1; *ya1 = y1; *xa2 = x2; *ya2 = y2; }
+  
+private:
+  cairo_surface_t *image;  // image cairo surface
+  double x1, y1;          // upper left corner
+  double x2, y2;          // lower right corner
+};
+
+
+//------------------------------------------------------------------------
+// CairoOutputDev
+//------------------------------------------------------------------------
+
+class CairoOutputDev: public OutputDev {
+public:
+
+  // Constructor.
+  CairoOutputDev();
+
+  // Destructor.
+  virtual ~CairoOutputDev();
+
+  //----- get info about output device
+
+  // Does this device use upside-down coordinates?
+  // (Upside-down means (0,0) is the top left corner of the page.)
+  virtual GBool upsideDown() { return gTrue; }
+
+  // Does this device use drawChar() or drawString()?
+  virtual GBool useDrawChar() { return gTrue; }
+
+  // Does this device use tilingPatternFill()?  If this returns false,
+  // tiling pattern fills will be reduced to a series of other drawing
+  // operations.
+  virtual GBool useTilingPatternFill() { return gTrue; }
+
+  // Does this device use functionShadedFill(), axialShadedFill(), and
+  // radialShadedFill()?  If this returns false, these shaded fills
+  // will be reduced to a series of other drawing operations.
+#if CAIRO_VERSION >= CAIRO_VERSION_ENCODE(1, 12, 0)
+  virtual GBool useShadedFills(int type) { return type <= 7; }
+#else
+  virtual GBool useShadedFills(int type) { return type < 4; }
+#endif
+
+  // Does this device use FillColorStop()?
+  virtual GBool useFillColorStop() { return gTrue; }
+
+  // Does this device use beginType3Char/endType3Char?  Otherwise,
+  // text in Type 3 fonts will be drawn with drawChar/drawString.
+  virtual GBool interpretType3Chars() { return gFalse; }
+
+  //----- initialization and control
+
+  // Start a page.
+  virtual void startPage(int pageNum, GfxState *state);
+
+  // End a page.
+  virtual void endPage();
+
+  //----- save/restore graphics state
+  virtual void saveState(GfxState *state);
+  virtual void restoreState(GfxState *state);
+
+  //----- update graphics state
+  virtual void updateAll(GfxState *state);
+  virtual void setDefaultCTM(double *ctm);
+  virtual void updateCTM(GfxState *state, double m11, double m12,
+                        double m21, double m22, double m31, double m32);
+  virtual void updateLineDash(GfxState *state);
+  virtual void updateFlatness(GfxState *state);
+  virtual void updateLineJoin(GfxState *state);
+  virtual void updateLineCap(GfxState *state);
+  virtual void updateMiterLimit(GfxState *state);
+  virtual void updateLineWidth(GfxState *state);
+  virtual void updateFillColor(GfxState *state);
+  virtual void updateStrokeColor(GfxState *state);
+  virtual void updateFillOpacity(GfxState *state);
+  virtual void updateStrokeOpacity(GfxState *state);
+  virtual void updateFillColorStop(GfxState *state, double offset);
+  virtual void updateBlendMode(GfxState *state);
+
+  //----- update text state
+  virtual void updateFont(GfxState *state);
+
+  //----- path painting
+  virtual void stroke(GfxState *state);
+  virtual void fill(GfxState *state);
+  virtual void eoFill(GfxState *state);
+  virtual void clipToStrokePath(GfxState *state);
+  virtual GBool tilingPatternFill(GfxState *state, Gfx *gfx, Catalog *cat, Object *str,
+                                 double *pmat, int paintType, int tilingType, Dict *resDict,
+                                 double *mat, double *bbox,
+                                 int x0, int y0, int x1, int y1,
+                                 double xStep, double yStep);
+  virtual GBool axialShadedFill(GfxState *state, GfxAxialShading *shading, double tMin, double tMax);
+  virtual GBool axialShadedSupportExtend(GfxState *state, GfxAxialShading *shading);
+  virtual GBool radialShadedFill(GfxState *state, GfxRadialShading *shading, double sMin, double sMax);
+  virtual GBool radialShadedSupportExtend(GfxState *state, GfxRadialShading *shading);
+#if CAIRO_VERSION >= CAIRO_VERSION_ENCODE(1, 12, 0)
+  virtual GBool gouraudTriangleShadedFill(GfxState *state, GfxGouraudTriangleShading *shading);
+  virtual GBool patchMeshShadedFill(GfxState *state, GfxPatchMeshShading *shading);
+#endif
+
+  //----- path clipping
+  virtual void clip(GfxState *state);
+  virtual void eoClip(GfxState *state);
+
+  //----- text drawing
+  void beginString(GfxState *state, GooString *s);
+  void endString(GfxState *state);
+  void drawChar(GfxState *state, double x, double y,
+               double dx, double dy,
+               double originX, double originY,
+               CharCode code, int nBytes, Unicode *u, int uLen);
+  void beginActualText(GfxState *state, GooString *text);
+  void endActualText(GfxState *state);
+
+  virtual GBool beginType3Char(GfxState *state, double x, double y,
+                              double dx, double dy,
+                              CharCode code, Unicode *u, int uLen);
+  virtual void endType3Char(GfxState *state);
+  virtual void beginTextObject(GfxState *state);
+  virtual GBool deviceHasTextClip(GfxState *state) { return textClipPath; }
+  virtual void endTextObject(GfxState *state);
+
+  //----- image drawing
+  virtual void drawImageMask(GfxState *state, Object *ref, Stream *str,
+                            int width, int height, GBool invert, GBool interpolate,
+                            GBool inlineImg);
+  virtual void setSoftMaskFromImageMask(GfxState *state,
+                                       Object *ref, Stream *str,
+                                       int width, int height, GBool invert,
+                                       GBool inlineImg, double *baseMatrix);
+  virtual void unsetSoftMaskFromImageMask(GfxState *state, double *baseMatrix);
+  void drawImageMaskPrescaled(GfxState *state, Object *ref, Stream *str,
+                             int width, int height, GBool invert, GBool interpolate,
+                             GBool inlineImg);
+  void drawImageMaskRegular(GfxState *state, Object *ref, Stream *str,
+                           int width, int height, GBool invert, GBool interpolate,
+                           GBool inlineImg);
+
+  virtual void drawImage(GfxState *state, Object *ref, Stream *str,
+                        int width, int height, GfxImageColorMap *colorMap,
+                        GBool interpolate, int *maskColors, GBool inlineImg);
+  virtual void drawSoftMaskedImage(GfxState *state, Object *ref, Stream *str,
+                                  int width, int height,
+                                  GfxImageColorMap *colorMap,
+                                  GBool interpolate,
+                                  Stream *maskStr,
+                                  int maskWidth, int maskHeight,
+                                  GfxImageColorMap *maskColorMap,
+                                  GBool maskInterpolate);
+
+  virtual void drawMaskedImage(GfxState *state, Object *ref, Stream *str,
+                              int width, int height,
+                              GfxImageColorMap *colorMap,
+                              GBool interpolate,
+                              Stream *maskStr,
+                              int maskWidth, int maskHeight,
+                              GBool maskInvert, GBool maskInterpolate);
+
+  //----- transparency groups and soft masks
+  virtual void beginTransparencyGroup(GfxState * /*state*/, double * /*bbox*/,
+                                      GfxColorSpace * /*blendingColorSpace*/,
+                                      GBool /*isolated*/, GBool /*knockout*/,
+                                      GBool /*forSoftMask*/);
+  virtual void endTransparencyGroup(GfxState * /*state*/);
+  void popTransparencyGroup();
+  virtual void paintTransparencyGroup(GfxState * /*state*/, double * /*bbox*/);
+  virtual void setSoftMask(GfxState * /*state*/, double * /*bbox*/, GBool /*alpha*/,
+                           Function * /*transferFunc*/, GfxColor * /*backdropColor*/);
+  virtual void clearSoftMask(GfxState * /*state*/);
+
+  //----- Type 3 font operators
+  virtual void type3D0(GfxState *state, double wx, double wy);
+  virtual void type3D1(GfxState *state, double wx, double wy,
+      double llx, double lly, double urx, double ury);
+
+  //----- special access
+  
+  // Called to indicate that a new PDF document has been loaded.
+  void startDoc(PDFDoc *docA, CairoFontEngine *fontEngine = NULL);
+  GBool isReverseVideo() { return gFalse; }
+  
+  void setCairo (cairo_t *cr);
+  void setTextPage (TextPage *text);
+  void setPrinting (GBool printing) { this->printing = printing; needFontUpdate = gTrue; }
+
+  void setInType3Char(GBool inType3Char) { this->inType3Char = inType3Char; }
+  void getType3GlyphWidth (double *wx, double *wy) { *wx = t3_glyph_wx; *wy = t3_glyph_wy; }
+  GBool hasType3GlyphBBox () { return t3_glyph_has_bbox; }
+  double *getType3GlyphBBox () { return t3_glyph_bbox; }
+
+protected:
+  void doPath(cairo_t *cairo, GfxState *state, GfxPath *path);
+  cairo_surface_t *downscaleSurface(cairo_surface_t *orig_surface);
+  void getScaledSize(int orig_width, int orig_height,
+                    int *scaledWidth, int *scaledHeight);
+  cairo_filter_t getFilterForSurface(cairo_surface_t *image,
+                                    GBool interpolate);
+  GBool getStreamData (Stream *str, char **buffer, int *length);
+  void setMimeData(Stream *str, Object *ref, cairo_surface_t *image);
+  void fillToStrokePathClip(GfxState *state);
+  void alignStrokeCoords(GfxSubpath *subpath, int i, double *x, double *y);
+
+  GfxRGB fill_color, stroke_color;
+  cairo_pattern_t *fill_pattern, *stroke_pattern;
+  double fill_opacity;
+  double stroke_opacity;
+  GBool stroke_adjust;
+  GBool adjusted_stroke_width;
+  GBool align_stroke_coords;
+  CairoFont *currentFont;
+
+  struct StrokePathClip {
+    GfxPath *path;
+    cairo_matrix_t ctm;
+    double line_width;
+    double *dashes;
+    int dash_count;
+    double dash_offset;
+    cairo_line_cap_t cap;
+    cairo_line_join_t join;
+    double miter;
+  } *strokePathClip;
+
+  PDFDoc *doc;                 // the current document
+
+  static FT_Library ft_lib;
+  static GBool ft_lib_initialized;
+
+  CairoFontEngine *fontEngine;
+  GBool fontEngine_owner;
+
+  cairo_t *cairo;
+  cairo_matrix_t orig_matrix;
+  GBool needFontUpdate;                // set when the font needs to be updated
+  GBool printing;
+  GBool use_show_text_glyphs;
+  cairo_surface_t *surface;
+  cairo_glyph_t *glyphs;
+  int glyphCount;
+  cairo_text_cluster_t *clusters;
+  int clusterCount;
+  char *utf8;
+  int utf8Count;
+  int utf8Max;
+  cairo_path_t *textClipPath;
+  GBool inType3Char;           // inside a Type 3 CharProc
+  double t3_glyph_wx, t3_glyph_wy;
+  GBool t3_glyph_has_bbox;
+  double t3_glyph_bbox[4];
+
+  GBool prescaleImages;
+
+  TextPage *text;              // text for the current page
+  ActualText *actualText;
+
+  cairo_pattern_t *group;
+  cairo_pattern_t *shape;
+  cairo_pattern_t *mask;
+  cairo_matrix_t mask_matrix;
+  cairo_surface_t *cairo_shape_surface;
+  cairo_t *cairo_shape;
+  int knockoutCount;
+  struct ColorSpaceStack {
+    GBool knockout;
+    GfxColorSpace *cs;
+    cairo_matrix_t group_matrix;
+    struct ColorSpaceStack *next;
+  } * groupColorSpaceStack;
+
+  struct MaskStack {
+    cairo_pattern_t *mask;
+    cairo_matrix_t mask_matrix;
+    struct MaskStack *next;
+  } *maskStack;
+
+};
+
+//------------------------------------------------------------------------
+// CairoImageOutputDev
+//------------------------------------------------------------------------
+
+//XXX: this should ideally not inherit from CairoOutputDev but use it instead perhaps
+class CairoImageOutputDev: public CairoOutputDev {
+public:
+
+  // Constructor.
+  CairoImageOutputDev();
+
+  // Destructor.
+  virtual ~CairoImageOutputDev();
+
+  //----- get info about output device
+
+  // Does this device use upside-down coordinates?
+  // (Upside-down means (0,0) is the top left corner of the page.)
+  virtual GBool upsideDown() { return gTrue; }
+
+  // Does this device use drawChar() or drawString()?
+  virtual GBool useDrawChar() { return gFalse; }
+
+  // Does this device use tilingPatternFill()?  If this returns false,
+  // tiling pattern fills will be reduced to a series of other drawing
+  // operations.
+  virtual GBool useTilingPatternFill() { return gTrue; }
+
+  // Does this device use functionShadedFill(), axialShadedFill(), and
+  // radialShadedFill()?  If this returns false, these shaded fills
+  // will be reduced to a series of other drawing operations.
+#if CAIRO_VERSION >= CAIRO_VERSION_ENCODE(1, 11, 2)
+  virtual GBool useShadedFills(int type) { return type <= 7; }
+#else
+  virtual GBool useShadedFills(int type) { return type < 4; }
+#endif
+
+  // Does this device use FillColorStop()?
+  virtual GBool useFillColorStop() { return gFalse; }
+
+  // Does this device use beginType3Char/endType3Char?  Otherwise,
+  // text in Type 3 fonts will be drawn with drawChar/drawString.
+  virtual GBool interpretType3Chars() { return gFalse; }
+
+  // Does this device need non-text content?
+  virtual GBool needNonText() { return gTrue; }
+
+  //----- save/restore graphics state
+  virtual void saveState(GfxState *state) { }
+  virtual void restoreState(GfxState *state) { }
+
+  //----- update graphics state
+  virtual void updateAll(GfxState *state) { }
+  virtual void setDefaultCTM(double *ctm) { }
+  virtual void updateCTM(GfxState *state, double m11, double m12,
+                                double m21, double m22, double m31, double m32) { }
+  virtual void updateLineDash(GfxState *state) { }
+  virtual void updateFlatness(GfxState *state) { }
+  virtual void updateLineJoin(GfxState *state) { }
+  virtual void updateLineCap(GfxState *state) { }
+  virtual void updateMiterLimit(GfxState *state) { }
+  virtual void updateLineWidth(GfxState *state) { }
+  virtual void updateFillColor(GfxState *state) { }
+  virtual void updateStrokeColor(GfxState *state) { }
+  virtual void updateFillOpacity(GfxState *state) { }
+  virtual void updateStrokeOpacity(GfxState *state) { }
+  virtual void updateBlendMode(GfxState *state) { }
+
+  //----- update text state
+  virtual void updateFont(GfxState *state) { }
+
+  //----- path painting
+  virtual void stroke(GfxState *state) { }
+  virtual void fill(GfxState *state) { }
+  virtual void eoFill(GfxState *state) { }
+  virtual void clipToStrokePath(GfxState *state) { }
+  virtual GBool tilingPatternFill(GfxState *state, Gfx *gfx, Catalog *cat, Object *str,
+                                 double *pmat, int paintType, int tilingType, Dict *resDict,
+                                 double *mat, double *bbox,
+                                 int x0, int y0, int x1, int y1,
+                                 double xStep, double yStep) { return gTrue; }
+  virtual GBool axialShadedFill(GfxState *state,
+                               GfxAxialShading *shading,
+                               double tMin, double tMax) { return gTrue; }
+  virtual GBool radialShadedFill(GfxState *state,
+                                GfxRadialShading *shading,
+                                double sMin, double sMax) { return gTrue; }
+
+  //----- path clipping
+  virtual void clip(GfxState *state) { }
+  virtual void eoClip(GfxState *state) { }
+
+  //----- image drawing
+  virtual void drawImageMask(GfxState *state, Object *ref, Stream *str,
+                            int width, int height, GBool invert,
+                            GBool interpolate, GBool inlineImg);
+  virtual void drawImage(GfxState *state, Object *ref, Stream *str,
+                        int width, int height, GfxImageColorMap *colorMap,
+                        GBool interpolate, int *maskColors, GBool inlineImg);
+  virtual void drawSoftMaskedImage(GfxState *state, Object *ref, Stream *str,
+                                  int width, int height,
+                                  GfxImageColorMap *colorMap,
+                                  GBool interpolate,
+                                  Stream *maskStr,
+                                  int maskWidth, int maskHeight,
+                                  GfxImageColorMap *maskColorMap,
+                                  GBool maskInterpolate);
+  virtual void drawMaskedImage(GfxState *state, Object *ref, Stream *str,
+                              int width, int height,
+                              GfxImageColorMap *colorMap,
+                              GBool interpolate,
+                              Stream *maskStr,
+                              int maskWidth, int maskHeight,
+                              GBool maskInvert, GBool maskInterpolate);
+
+  //----- transparency groups and soft masks
+  virtual void beginTransparencyGroup(GfxState * /*state*/, double * /*bbox*/,
+                                     GfxColorSpace * /*blendingColorSpace*/,
+                                     GBool /*isolated*/, GBool /*knockout*/,
+                                     GBool /*forSoftMask*/) {}
+  virtual void endTransparencyGroup(GfxState * /*state*/) {}
+  virtual void paintTransparencyGroup(GfxState * /*state*/, double * /*bbox*/) {}
+  virtual void setSoftMask(GfxState * /*state*/, double * /*bbox*/, GBool /*alpha*/,
+                          Function * /*transferFunc*/, GfxColor * /*backdropColor*/) {}
+  virtual void clearSoftMask(GfxState * /*state*/) {}
+
+  //----- Image list
+  // By default images are not rendred
+  void setImageDrawDecideCbk(GBool (*cbk)(int img_id, void *data),
+                            void *data) { imgDrawCbk = cbk; imgDrawCbkData = data; }
+  // Iterate through list of images.
+  int getNumImages() const { return numImages; }
+  CairoImage *getImage(int i) const { return images[i]; }
+
+private:
+  void saveImage(CairoImage *image);
+  
+  CairoImage **images;
+  int numImages;
+  int size;
+  GBool (*imgDrawCbk)(int img_id, void *data);
+  void *imgDrawCbkData;
+};
+
+#endif
diff --git a/poppler/CairoRescaleBox.cc b/poppler/CairoRescaleBox.cc
new file mode 100644 (file)
index 0000000..68a0c4c
--- /dev/null
@@ -0,0 +1,366 @@
+/* -*- Mode: c; c-basic-offset: 4; tab-width: 8; indent-tabs-mode: t; -*- */
+/*
+ * Copyright © 2009 Mozilla Corporation
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation, and that the name of Mozilla Corporation not be used in
+ * advertising or publicity pertaining to distribution of the software without
+ * specific, written prior permission.  Mozilla Corporation makes no
+ * representations about the suitability of this software for any purpose.  It
+ * is provided "as is" without express or implied warranty.
+ *
+ * MOZILLA CORPORATION DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
+ * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT
+ * SHALL MOZILLA CORPORATION BE LIABLE FOR ANY SPECIAL, INDIRECT OR
+ * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
+ * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
+ * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
+ * OF THIS SOFTWARE.
+ *
+ * Author: Jeff Muizelaar, Mozilla Corp.
+ */
+
+//========================================================================
+//
+// Modified under the Poppler project - http://poppler.freedesktop.org
+//
+// All changes made under the Poppler project to this file are licensed
+// under GPL version 2 or later
+//
+// Copyright (C) 2012 Hib Eris <hib@hiberis.nl>
+//
+// To see a description of the changes please see the Changelog file that
+// came with your tarball or type make ChangeLog if you are building from git
+//
+//========================================================================
+
+
+/* This implements a box filter that supports non-integer box sizes */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <stdint.h>
+#include <stdio.h>
+#include <assert.h>
+#include <stdlib.h>
+#include <math.h>
+#include "goo/gmem.h"
+#include "goo/gtypes_p.h"
+#include "CairoRescaleBox.h"
+
+
+/* we work in fixed point where 1. == 1 << 24 */
+#define FIXED_SHIFT 24
+
+static void downsample_row_box_filter (
+        int start, int width,
+        uint32_t *src, uint32_t *dest,
+        int coverage[], int pixel_coverage)
+{
+    /* we need an array of the pixel contribution of each destination pixel on the boundaries.
+     * we invert the value to get the value on the other size of the box */
+    /*
+
+       value  = a * contribution * 1/box_size
+       value += a * 1/box_size
+       value += a * 1/box_size
+       value += a * 1/box_size
+       value += a * (1 - contribution) * 1/box_size
+                a * (1/box_size - contribution * 1/box_size)
+
+        box size is constant
+
+
+       value = a * contribtion_a * 1/box_size + b * contribution_b * 1/box_size
+               contribution_b = (1 - contribution_a)
+                              = (1 - contribution_a_next)
+    */
+
+    /* box size = ceil(src_width/dest_width) */
+    int x = 0;
+
+    /* skip to start */
+    /* XXX: it might be possible to do this directly instead of iteratively, however
+     * the iterative solution is simple */
+    while (x < start)
+    {
+        int box = 1 << FIXED_SHIFT;
+        int start_coverage = coverage[x];
+        box -= start_coverage;
+        src++;
+        while (box >= pixel_coverage)
+        {
+            src++;
+            box -= pixel_coverage;
+        }
+        x++;
+    }
+
+    while (x < start + width)
+    {
+        uint32_t a = 0;
+        uint32_t r = 0;
+        uint32_t g = 0;
+        uint32_t b = 0;
+        int box = 1 << FIXED_SHIFT;
+        int start_coverage = coverage[x];
+
+        a = ((*src >> 24) & 0xff) * start_coverage;
+        r = ((*src >> 16) & 0xff) * start_coverage;
+        g = ((*src >>  8) & 0xff) * start_coverage;
+        b = ((*src >>  0) & 0xff) * start_coverage;
+        src++;
+        x++;
+        box -= start_coverage;
+
+        while (box >= pixel_coverage)
+        {
+            a += ((*src >> 24) & 0xff) * pixel_coverage;
+            r += ((*src >> 16) & 0xff) * pixel_coverage;
+            g += ((*src >>  8) & 0xff) * pixel_coverage;
+            b += ((*src >>  0) & 0xff) * pixel_coverage;
+            src++;
+
+            box -= pixel_coverage;
+        }
+
+        /* multiply by whatever is leftover
+         * this ensures that we don't bias down.
+         * i.e. start_coverage + n*pixel_coverage + box == 1 << 24 */
+        if (box > 0)
+        {
+            a += ((*src >> 24) & 0xff) * box;
+            r += ((*src >> 16) & 0xff) * box;
+            g += ((*src >>  8) & 0xff) * box;
+            b += ((*src >>  0) & 0xff) * box;
+        }
+
+        a >>= FIXED_SHIFT;
+        r >>= FIXED_SHIFT;
+        g >>= FIXED_SHIFT;
+        b >>= FIXED_SHIFT;
+
+        *dest = (a << 24) | (r << 16) | (g << 8) | b;
+        dest++;
+    }
+}
+
+static void downsample_columns_box_filter (
+        int n,
+        int start_coverage,
+        int pixel_coverage,
+        uint32_t *src, uint32_t *dest)
+{
+    int stride = n;
+    while (n--) {
+        uint32_t a = 0;
+        uint32_t r = 0;
+        uint32_t g = 0;
+        uint32_t b = 0;
+        uint32_t *column_src = src;
+        int box = 1 << FIXED_SHIFT;
+
+        a = ((*column_src >> 24) & 0xff) * start_coverage;
+        r = ((*column_src >> 16) & 0xff) * start_coverage;
+        g = ((*column_src >>  8) & 0xff) * start_coverage;
+        b = ((*column_src >>  0) & 0xff) * start_coverage;
+        column_src += stride;
+        box -= start_coverage;
+
+        while (box >= pixel_coverage)
+        {
+            a += ((*column_src >> 24) & 0xff) * pixel_coverage;
+            r += ((*column_src >> 16) & 0xff) * pixel_coverage;
+            g += ((*column_src >>  8) & 0xff) * pixel_coverage;
+            b += ((*column_src >>  0) & 0xff) * pixel_coverage;
+            column_src += stride;
+            box -= pixel_coverage;
+        }
+
+        if (box > 0) {
+            a += ((*column_src >> 24) & 0xff) * box;
+            r += ((*column_src >> 16) & 0xff) * box;
+            g += ((*column_src >>  8) & 0xff) * box;
+            b += ((*column_src >>  0) & 0xff) * box;
+        }
+
+        a >>= FIXED_SHIFT;
+        r >>= FIXED_SHIFT;
+        g >>= FIXED_SHIFT;
+        b >>= FIXED_SHIFT;
+
+        *dest = (a << 24) | (r << 16) | (g << 8) | b;
+        dest++;
+        src++;
+    }
+}
+
+static int compute_coverage (int coverage[], int src_length, int dest_length)
+{
+    int i;
+    /* num = src_length/dest_length
+       total = sum(pixel) / num
+
+       pixel * 1/num == pixel * dest_length / src_length
+    */
+    /* the average contribution of each source pixel */
+    int ratio = ((1 << 24)*(long long int)dest_length)/src_length;
+    /* because ((1 << 24)*(long long int)dest_length) won't always be divisible by src_length
+     * we'll need someplace to put the other bits.
+     *
+     * We want to ensure a + n*ratio < 1<<24
+     *
+     * 1<<24
+     * */
+
+    double scale = (double)src_length/dest_length;
+
+    /* for each destination pixel compute the coverage of the left most pixel included in the box */
+    /* I have a proof of this, which this margin is too narrow to contain */
+    for (i=0; i<dest_length; i++)
+    {
+        float left_side = i*scale;
+        float right_side = (i+1)*scale;
+        float right_fract = right_side - floor (right_side);
+        float left_fract = ceil (left_side) - left_side;
+        int overage;
+        /* find out how many source pixels will be used to fill the box */
+        int count = floor (right_side) - ceil (left_side);
+        /* what's the maximum value this expression can become?
+           floor((i+1)*scale) - ceil(i*scale)
+
+           (i+1)*scale - i*scale == scale
+
+           since floor((i+1)*scale) <= (i+1)*scale
+           and   ceil(i*scale)      >= i*scale
+
+           floor((i+1)*scale) - ceil(i*scale) <= scale
+
+           further since: floor((i+1)*scale) - ceil(i*scale) is an integer
+
+           therefore:
+           floor((i+1)*scale) - ceil(i*scale) <= floor(scale)
+        */
+
+        if (left_fract == 0.)
+            count--;
+
+        /* compute how much the right-most pixel contributes */
+        overage = ratio*(right_fract);
+
+        /* the remainder is the the amount that the left-most pixel
+         * contributes */
+        coverage[i] = (1<<24) - (count * ratio + overage);
+    }
+
+    return ratio;
+}
+
+GBool downscale_box_filter(uint32_t *orig, int orig_stride, unsigned orig_width, unsigned orig_height,
+                          signed scaled_width, signed scaled_height,
+                          uint16_t start_column, uint16_t start_row,
+                          uint16_t width, uint16_t height,
+                          uint32_t *dest, int dst_stride)
+{
+    int pixel_coverage_x, pixel_coverage_y;
+    int dest_y;
+    int src_y = 0;
+    uint32_t *scanline = orig;
+    int *x_coverage = NULL;
+    int *y_coverage = NULL;
+    uint32_t *temp_buf = NULL;
+    GBool retval = gFalse;
+
+    x_coverage = (int *)gmallocn3 (orig_width, 1, sizeof(int));
+    y_coverage = (int *)gmallocn3 (orig_height, 1, sizeof(int));
+
+    /* we need to allocate enough room for ceil(src_height/dest_height)+1
+      Example:
+      src_height = 140
+      dest_height = 50
+      src_height/dest_height = 2.8
+
+      |-------------|       2.8 pixels
+      |----|----|----|----| 4 pixels
+      need to sample 3 pixels
+
+         |-------------|       2.8 pixels
+      |----|----|----|----| 4 pixels
+      need to sample 4 pixels
+    */
+
+    temp_buf = (uint32_t *)gmallocn3 ((orig_height + scaled_height-1)/scaled_height+1, scaled_width, sizeof(uint32_t));
+
+    if (!x_coverage || !y_coverage || !scanline || !temp_buf)
+       goto cleanup;
+
+    pixel_coverage_x = compute_coverage (x_coverage, orig_width, scaled_width);
+    pixel_coverage_y = compute_coverage (y_coverage, orig_height, scaled_height);
+
+    assert (width + start_column <= scaled_width);
+
+    /* skip the rows at the beginning */
+    for (dest_y = 0; dest_y < start_row; dest_y++)
+    {
+        int box = 1 << FIXED_SHIFT;
+        int start_coverage_y = y_coverage[dest_y];
+        box -= start_coverage_y;
+        src_y++;
+        while (box >= pixel_coverage_y)
+        {
+            box -= pixel_coverage_y;
+            src_y++;
+        }
+    }
+
+    for (; dest_y < start_row + height; dest_y++)
+    {
+        int columns = 0;
+        int box = 1 << FIXED_SHIFT;
+        int start_coverage_y = y_coverage[dest_y];
+
+       scanline = orig + src_y * orig_stride / 4;
+        downsample_row_box_filter (start_column, width, scanline, temp_buf + width * columns, x_coverage, pixel_coverage_x);
+        columns++;
+        src_y++;
+        box -= start_coverage_y;
+
+        while (box >= pixel_coverage_y)
+        {
+           scanline = orig + src_y * orig_stride / 4;
+            downsample_row_box_filter (start_column, width, scanline, temp_buf + width * columns, x_coverage, pixel_coverage_x);
+            columns++;
+            src_y++;
+            box -= pixel_coverage_y;
+        }
+
+        /* downsample any leftovers */
+        if (box > 0)
+        {
+           scanline = orig + src_y * orig_stride / 4;
+            downsample_row_box_filter (start_column, width, scanline, temp_buf + width * columns, x_coverage, pixel_coverage_x);
+            columns++;
+        }
+
+        /* now scale the rows we just downsampled in the y direction */
+        downsample_columns_box_filter (width, start_coverage_y, pixel_coverage_y, temp_buf, dest);
+        dest += dst_stride / 4;
+
+//        assert(width*columns <= ((orig_height + scaled_height-1)/scaled_height+1) * width);
+    }
+//    assert (src_y<=orig_height);
+
+    retval = gTrue;
+
+cleanup:
+    free (x_coverage);
+    free (y_coverage);
+    free (temp_buf);
+
+    return retval;
+}
diff --git a/poppler/CairoRescaleBox.h b/poppler/CairoRescaleBox.h
new file mode 100644 (file)
index 0000000..5349c87
--- /dev/null
@@ -0,0 +1,12 @@
+#ifndef CAIRO_RESCALE_BOX_H
+#define CAIRO_RESCALE_BOX_H
+
+#include "goo/gtypes.h"
+
+GBool downscale_box_filter(unsigned int *orig, int orig_stride, unsigned orig_width, unsigned orig_height,
+                          signed scaled_width, signed scaled_height,
+                          unsigned short int start_column, unsigned short int start_row,
+                          unsigned short int width, unsigned short int height,
+                          unsigned int *dest, int dst_stride);
+
+#endif /* CAIRO_RESCALE_BOX_H */
diff --git a/poppler/Catalog.cc b/poppler/Catalog.cc
new file mode 100644 (file)
index 0000000..0f42356
--- /dev/null
@@ -0,0 +1,966 @@
+//========================================================================
+//
+// Catalog.cc
+//
+// Copyright 1996-2007 Glyph & Cog, LLC
+//
+//========================================================================
+
+//========================================================================
+//
+// Modified under the Poppler project - http://poppler.freedesktop.org
+//
+// All changes made under the Poppler project to this file are licensed
+// under GPL version 2 or later
+//
+// Copyright (C) 2005 Kristian Høgsberg <krh@redhat.com>
+// Copyright (C) 2005-2012 Albert Astals Cid <aacid@kde.org>
+// Copyright (C) 2005 Jeff Muizelaar <jrmuizel@nit.ca>
+// Copyright (C) 2005 Jonathan Blandford <jrb@redhat.com>
+// Copyright (C) 2005 Marco Pesenti Gritti <mpg@redhat.com>
+// Copyright (C) 2005, 2006, 2008 Brad Hards <bradh@frogmouth.net>
+// Copyright (C) 2006, 2008, 2011 Carlos Garcia Campos <carlosgc@gnome.org>
+// Copyright (C) 2007 Julien Rebetez <julienr@svn.gnome.org>
+// Copyright (C) 2008, 2011 Pino Toscano <pino@kde.org>
+// Copyright (C) 2009 Ilya Gorenbein <igorenbein@finjan.com>
+// Copyright (C) 2010 Hib Eris <hib@hiberis.nl>
+//
+// To see a description of the changes please see the Changelog file that
+// came with your tarball or type make ChangeLog if you are building from git
+//
+//========================================================================
+
+#include <config.h>
+
+#ifdef USE_GCC_PRAGMAS
+#pragma implementation
+#endif
+
+#include <stddef.h>
+#include <stdlib.h>
+#include "goo/gmem.h"
+#include "Object.h"
+#include "PDFDoc.h"
+#include "XRef.h"
+#include "Array.h"
+#include "Dict.h"
+#include "Page.h"
+#include "Error.h"
+#include "Link.h"
+#include "PageLabelInfo.h"
+#include "Catalog.h"
+#include "Form.h"
+#include "OptionalContent.h"
+#include "ViewerPreferences.h"
+#include "FileSpec.h"
+
+//------------------------------------------------------------------------
+// Catalog
+//------------------------------------------------------------------------
+
+Catalog::Catalog(PDFDoc *docA) {
+  Object catDict, pagesDict, pagesDictRef;
+  Object obj, obj2;
+  Object optContentProps;
+
+  ok = gTrue;
+  doc = docA;
+  xref = doc->getXRef();
+  pages = NULL;
+  pageRefs = NULL;
+  numPages = -1;
+  pagesSize = 0;
+  baseURI = NULL;
+  pageLabelInfo = NULL;
+  form = NULL;
+  optContent = NULL;
+  pageMode = pageModeNull;
+  pageLayout = pageLayoutNull;
+  destNameTree = NULL;
+  embeddedFileNameTree = NULL;
+  jsNameTree = NULL;
+  viewerPrefs = NULL;
+
+  pagesList = NULL;
+  pagesRefList = NULL;
+  attrsList = NULL;
+  kidsIdxList = NULL;
+  lastCachedPage = 0;
+
+  xref->getCatalog(&catDict);
+  if (!catDict.isDict()) {
+    error(errSyntaxError, -1, "Catalog object is wrong type ({0:s})", catDict.getTypeName());
+    goto err1;
+  }
+  // get the AcroForm dictionary
+  catDict.dictLookup("AcroForm", &acroForm);
+
+  // read base URI
+  if (catDict.dictLookup("URI", &obj)->isDict()) {
+    if (obj.dictLookup("Base", &obj2)->isString()) {
+      baseURI = obj2.getString()->copy();
+    }
+    obj2.free();
+  }
+  obj.free();
+
+  // get the Optional Content dictionary
+  if (catDict.dictLookup("OCProperties", &optContentProps)->isDict()) {
+    optContent = new OCGs(&optContentProps, xref);
+    if (!optContent->isOk ()) {
+      delete optContent;
+      optContent = NULL;
+    }
+  }
+  optContentProps.free();
+
+  // get the ViewerPreferences dictionary
+  catDict.dictLookup("ViewerPreferences", &viewerPreferences);
+  catDict.free();
+  return;
+
+ err1:
+  catDict.free();
+  ok = gFalse;
+}
+
+Catalog::~Catalog() {
+  delete kidsIdxList;
+  if (attrsList) {
+    std::vector<PageAttrs *>::iterator it;
+    for (it = attrsList->begin() ; it < attrsList->end(); it++ ) {
+      delete *it;
+    }
+    delete attrsList;
+  }
+  delete pagesRefList;
+  if (pagesList) {
+    std::vector<Dict *>::iterator it;
+    for (it = pagesList->begin() ; it < pagesList->end(); it++ ) {
+      if (!(*it)->decRef()) {
+         delete *it;
+      }
+    }
+    delete pagesList;
+  }
+  if (pages) {
+    for (int i = 0; i < pagesSize; ++i) {
+      if (pages[i]) {
+       delete pages[i];
+      }
+    }
+    gfree(pages);
+    gfree(pageRefs);
+  }
+  names.free();
+  dests.free();
+  delete destNameTree;
+  delete embeddedFileNameTree;
+  delete jsNameTree;
+  if (baseURI) {
+    delete baseURI;
+  }
+  delete pageLabelInfo;
+  delete form;
+  delete optContent;
+  delete viewerPrefs;
+  metadata.free();
+  structTreeRoot.free();
+  outline.free();
+  acroForm.free();
+  viewerPreferences.free();
+}
+
+GooString *Catalog::readMetadata() {
+  GooString *s;
+  Dict *dict;
+  Object obj;
+
+  if (metadata.isNone()) {
+    Object catDict;
+
+    xref->getCatalog(&catDict);
+    if (catDict.isDict()) {
+      catDict.dictLookup("Metadata", &metadata);
+    } else {
+      error(errSyntaxError, -1, "Catalog object is wrong type ({0:s})", catDict.getTypeName());
+      metadata.initNull();
+    }
+    catDict.free();
+  }
+
+  if (!metadata.isStream()) {
+    return NULL;
+  }
+  dict = metadata.streamGetDict();
+  if (!dict->lookup("Subtype", &obj)->isName("XML")) {
+    error(errSyntaxWarning, -1, "Unknown Metadata type: '{0:s}'",
+         obj.isName() ? obj.getName() : "???");
+  }
+  obj.free();
+  s = new GooString();
+  metadata.getStream()->fillGooString(s);
+  metadata.streamClose();
+  return s;
+}
+
+Page *Catalog::getPage(int i)
+{
+  if (i < 1) return NULL;
+
+  if (i > lastCachedPage) {
+     if (cachePageTree(i) == gFalse) return NULL;
+  }
+  return pages[i-1];
+}
+
+Ref *Catalog::getPageRef(int i)
+{
+  if (i < 1) return NULL;
+
+  if (i > lastCachedPage) {
+     if (cachePageTree(i) == gFalse) return NULL;
+  }
+  return &pageRefs[i-1];
+}
+
+GBool Catalog::cachePageTree(int page)
+{
+  Dict *pagesDict;
+
+  if (pagesList == NULL) {
+
+    Object catDict;
+    Ref pagesRef;
+
+    xref->getCatalog(&catDict);
+
+    if (catDict.isDict()) {
+      Object pagesDictRef;
+      if (catDict.dictLookupNF("Pages", &pagesDictRef)->isRef() &&
+          pagesDictRef.getRefNum() >= 0 &&
+          pagesDictRef.getRefNum() < xref->getNumObjects()) {
+        pagesRef = pagesDictRef.getRef();
+        pagesDictRef.free();
+      } else {
+        error(errSyntaxError, -1, "Catalog dictionary does not contain a valid \"Pages\" entry");
+        pagesDictRef.free();
+        catDict.free();
+        return gFalse;
+      }
+    } else {
+      error(errSyntaxError, -1, "Could not find catalog dictionary");
+      catDict.free();
+      return gFalse;
+    }
+
+    Object obj;
+    catDict.dictLookup("Pages", &obj);
+    catDict.free();
+    // This should really be isDict("Pages"), but I've seen at least one
+    // PDF file where the /Type entry is missing.
+    if (obj.isDict()) {
+      obj.getDict()->incRef();
+      pagesDict = obj.getDict();
+      obj.free();
+    }
+    else {
+      error(errSyntaxError, -1, "Top-level pages object is wrong type ({0:s})", obj.getTypeName());
+      obj.free();
+      return gFalse;
+    }
+
+    pagesSize = getNumPages();
+    pages = (Page **)gmallocn(pagesSize, sizeof(Page *));
+    pageRefs = (Ref *)gmallocn(pagesSize, sizeof(Ref));
+    for (int i = 0; i < pagesSize; ++i) {
+      pages[i] = NULL;
+      pageRefs[i].num = -1;
+      pageRefs[i].gen = -1;
+    }
+
+    pagesList = new std::vector<Dict *>();
+    pagesList->push_back(pagesDict);
+    pagesRefList = new std::vector<Ref>();
+    pagesRefList->push_back(pagesRef);
+    attrsList = new std::vector<PageAttrs *>();
+    attrsList->push_back(new PageAttrs(NULL, pagesDict));
+    kidsIdxList = new std::vector<int>();
+    kidsIdxList->push_back(0);
+    lastCachedPage = 0;
+
+  }
+
+  while(1) {
+
+    if (page <= lastCachedPage) return gTrue;
+
+    if (pagesList->empty()) return gFalse;
+
+    pagesDict = pagesList->back();
+    Object kids;
+    pagesDict->lookup("Kids", &kids);
+    if (!kids.isArray()) {
+      error(errSyntaxError, -1, "Kids object (page {0:d}) is wrong type ({1:s})",
+            lastCachedPage+1, kids.getTypeName());
+      kids.free();
+      return gFalse;
+    }
+
+    int kidsIdx = kidsIdxList->back();
+    if (kidsIdx >= kids.arrayGetLength()) {
+       if (!pagesList->back()->decRef()) {
+         delete pagesList->back();
+       }
+       pagesList->pop_back();
+       pagesRefList->pop_back();
+       delete attrsList->back();
+       attrsList->pop_back();
+       kidsIdxList->pop_back();
+       if (!kidsIdxList->empty()) kidsIdxList->back()++;
+       kids.free();
+       continue;
+    }
+
+    Object kidRef;
+    kids.arrayGetNF(kidsIdx, &kidRef);
+    if (!kidRef.isRef()) {
+      error(errSyntaxError, -1, "Kid object (page {0:d}) is not an indirect reference ({1:s})",
+            lastCachedPage+1, kidRef.getTypeName());
+      kidRef.free();
+      kids.free();
+      return gFalse;
+    }
+
+    GBool loop = gFalse;;
+    for (size_t i = 0; i < pagesRefList->size(); i++) {
+      if (((*pagesRefList)[i]).num == kidRef.getRefNum()) {
+         loop = gTrue;
+         break;
+      }
+    }
+    if (loop) {
+      error(errSyntaxError, -1, "Loop in Pages tree");
+      kidRef.free();
+      kids.free();
+      kidsIdxList->back()++;
+      continue;
+    }
+
+    Object kid;
+    kids.arrayGet(kidsIdx, &kid);
+    kids.free();
+    if (kid.isDict("Page") || (kid.isDict() && !kid.getDict()->hasKey("Kids"))) {
+      PageAttrs *attrs = new PageAttrs(attrsList->back(), kid.getDict());
+      Page *p = new Page(doc, lastCachedPage+1, kid.getDict(),
+                     kidRef.getRef(), attrs, form);
+      if (!p->isOk()) {
+        error(errSyntaxError, -1, "Failed to create page (page {0:d})", lastCachedPage+1);
+        delete p;
+        kidRef.free();
+        kid.free();
+        return gFalse;
+      }
+
+      if (lastCachedPage >= numPages) {
+        error(errSyntaxError, -1, "Page count in top-level pages object is incorrect");
+        kidRef.free();
+        kid.free();
+        return gFalse;
+      }
+
+      pages[lastCachedPage] = p;
+      pageRefs[lastCachedPage].num = kidRef.getRefNum();
+      pageRefs[lastCachedPage].gen = kidRef.getRefGen();
+
+      lastCachedPage++;
+      kidsIdxList->back()++;
+
+    // This should really be isDict("Pages"), but I've seen at least one
+    // PDF file where the /Type entry is missing.
+    } else if (kid.isDict()) {
+      attrsList->push_back(new PageAttrs(attrsList->back(), kid.getDict()));
+      pagesRefList->push_back(kidRef.getRef());
+      kid.getDict()->incRef();
+      pagesList->push_back(kid.getDict());
+      kidsIdxList->push_back(0);
+    } else {
+      error(errSyntaxError, -1, "Kid object (page {0:d}) is wrong type ({1:s})",
+            lastCachedPage+1, kid.getTypeName());
+      kidsIdxList->back()++;
+    }
+    kidRef.free();
+    kid.free();
+
+  }
+
+  return gFalse;
+}
+
+int Catalog::findPage(int num, int gen) {
+  int i;
+
+  for (i = 0; i < getNumPages(); ++i) {
+    Ref *ref = getPageRef(i+1);
+    if (ref != NULL && ref->num == num && ref->gen == gen)
+      return i + 1;
+  }
+  return 0;
+}
+
+LinkDest *Catalog::findDest(GooString *name) {
+  LinkDest *dest;
+  Object obj1, obj2;
+  GBool found;
+
+  // try named destination dictionary then name tree
+  found = gFalse;
+  if (getDests()->isDict()) {
+    if (!getDests()->dictLookup(name->getCString(), &obj1)->isNull())
+      found = gTrue;
+    else
+      obj1.free();
+  }
+  if (!found) {
+    if (getDestNameTree()->lookup(name, &obj1))
+      found = gTrue;
+    else
+      obj1.free();
+  }
+  if (!found)
+    return NULL;
+
+  // construct LinkDest
+  dest = NULL;
+  if (obj1.isArray()) {
+    dest = new LinkDest(obj1.getArray());
+  } else if (obj1.isDict()) {
+    if (obj1.dictLookup("D", &obj2)->isArray())
+      dest = new LinkDest(obj2.getArray());
+    else
+      error(errSyntaxWarning, -1, "Bad named destination value");
+    obj2.free();
+  } else {
+    error(errSyntaxWarning, -1, "Bad named destination value");
+  }
+  obj1.free();
+  if (dest && !dest->isOk()) {
+    delete dest;
+    dest = NULL;
+  }
+
+  return dest;
+}
+
+FileSpec *Catalog::embeddedFile(int i)
+{
+    Object efDict;
+    Object obj;
+    obj = getEmbeddedFileNameTree()->getValue(i);
+    FileSpec *embeddedFile = 0;
+    if (obj.isRef()) {
+      Object fsDict;
+      embeddedFile = new FileSpec(obj.fetch(xref, &fsDict));
+      fsDict.free();
+    } else if (obj.isDict()) {
+      embeddedFile = new FileSpec(&obj);
+    } else {
+      Object null;
+      embeddedFile = new FileSpec(&null);
+    }
+    return embeddedFile;
+}
+
+GooString *Catalog::getJS(int i)
+{
+  Object obj;
+  // getJSNameTree()->getValue(i) returns a shallow copy of the object so we
+  // do not need to free it
+  getJSNameTree()->getValue(i).fetch(xref, &obj);
+
+  if (!obj.isDict()) {
+    obj.free();
+    return 0;
+  }
+  Object obj2;
+  if (!obj.dictLookup("S", &obj2)->isName()) {
+    obj2.free();
+    obj.free();
+    return 0;
+  }
+  if (strcmp(obj2.getName(), "JavaScript")) {
+    obj2.free();
+    obj.free();
+    return 0;
+  }
+  obj2.free();
+  obj.dictLookup("JS", &obj2);
+  GooString *js = 0;
+  if (obj2.isString()) {
+    js = new GooString(obj2.getString());
+  }
+  else if (obj2.isStream()) {
+    Stream *stream = obj2.getStream();
+    js = new GooString();
+    stream->fillGooString(js);
+  }
+  obj2.free();
+  obj.free();
+  return js;
+}
+
+Catalog::PageMode Catalog::getPageMode() {
+
+  if (pageMode == pageModeNull) {
+
+    Object catDict, obj;
+
+    pageMode = pageModeNone;
+
+    xref->getCatalog(&catDict);
+    if (!catDict.isDict()) {
+      error(errSyntaxError, -1, "Catalog object is wrong type ({0:s})", catDict.getTypeName());
+      catDict.free();
+      return pageMode;
+    }
+
+    if (catDict.dictLookup("PageMode", &obj)->isName()) {
+      if (obj.isName("UseNone"))
+        pageMode = pageModeNone;
+      else if (obj.isName("UseOutlines"))
+        pageMode = pageModeOutlines;
+      else if (obj.isName("UseThumbs"))
+        pageMode = pageModeThumbs;
+      else if (obj.isName("FullScreen"))
+        pageMode = pageModeFullScreen;
+      else if (obj.isName("UseOC"))
+        pageMode = pageModeOC;
+      else if (obj.isName("UseAttachments"))
+        pageMode = pageModeAttach;
+    }
+    obj.free();
+    catDict.free();
+  }
+  return pageMode;
+}
+
+Catalog::PageLayout Catalog::getPageLayout() {
+
+  if (pageLayout == pageLayoutNull) {
+
+    Object catDict, obj;
+
+    pageLayout = pageLayoutNone;
+
+    xref->getCatalog(&catDict);
+    if (!catDict.isDict()) {
+      error(errSyntaxError, -1, "Catalog object is wrong type ({0:s})", catDict.getTypeName());
+      catDict.free();
+      return pageLayout;
+    }
+
+    pageLayout = pageLayoutNone;
+    if (catDict.dictLookup("PageLayout", &obj)->isName()) {
+      if (obj.isName("SinglePage"))
+        pageLayout = pageLayoutSinglePage;
+      if (obj.isName("OneColumn"))
+        pageLayout = pageLayoutOneColumn;
+      if (obj.isName("TwoColumnLeft"))
+        pageLayout = pageLayoutTwoColumnLeft;
+      if (obj.isName("TwoColumnRight"))
+        pageLayout = pageLayoutTwoColumnRight;
+      if (obj.isName("TwoPageLeft"))
+        pageLayout = pageLayoutTwoPageLeft;
+      if (obj.isName("TwoPageRight"))
+        pageLayout = pageLayoutTwoPageRight;
+    }
+    obj.free();
+    catDict.free();
+  }
+  return pageLayout;
+}
+
+NameTree::NameTree()
+{
+  size = 0;
+  length = 0;
+  entries = NULL;
+}
+
+NameTree::~NameTree()
+{
+  int i;
+
+  for (i = 0; i < length; i++)
+    delete entries[i];
+
+  gfree(entries);
+}
+
+NameTree::Entry::Entry(Array *array, int index) {
+    if (!array->getString(index, &name) || !array->getNF(index + 1, &value)) {
+      Object aux;
+      array->get(index, &aux);
+      if (aux.isString() && array->getNF(index + 1, &value) )
+      {
+        name.append(aux.getString());
+      }
+      else
+        error(errSyntaxError, -1, "Invalid page tree");
+    }
+}
+
+NameTree::Entry::~Entry() {
+  value.free();
+}
+
+void NameTree::addEntry(Entry *entry)
+{
+  if (length == size) {
+    if (length == 0) {
+      size = 8;
+    } else {
+      size *= 2;
+    }
+    entries = (Entry **) grealloc (entries, sizeof (Entry *) * size);
+  }
+
+  entries[length] = entry;
+  ++length;
+}
+
+void NameTree::init(XRef *xrefA, Object *tree) {
+  xref = xrefA;
+  parse(tree);
+}
+
+void NameTree::parse(Object *tree) {
+  Object names;
+  Object kids, kid;
+  int i;
+
+  if (!tree->isDict())
+    return;
+
+  // leaf node
+  if (tree->dictLookup("Names", &names)->isArray()) {
+    for (i = 0; i < names.arrayGetLength(); i += 2) {
+      NameTree::Entry *entry;
+
+      entry = new Entry(names.getArray(), i);
+      addEntry(entry);
+    }
+  }
+  names.free();
+
+  // root or intermediate node
+  if (tree->dictLookup("Kids", &kids)->isArray()) {
+    for (i = 0; i < kids.arrayGetLength(); ++i) {
+      if (kids.arrayGet(i, &kid)->isDict())
+       parse(&kid);
+      kid.free();
+    }
+  }
+  kids.free();
+}
+
+int NameTree::Entry::cmp(const void *voidKey, const void *voidEntry)
+{
+  GooString *key = (GooString *) voidKey;
+  Entry *entry = *(NameTree::Entry **) voidEntry;
+
+  return key->cmp(&entry->name);
+}
+
+GBool NameTree::lookup(GooString *name, Object *obj)
+{
+  Entry **entry;
+
+  entry = (Entry **) bsearch(name, entries,
+                            length, sizeof(Entry *), Entry::cmp);
+  if (entry != NULL) {
+    (*entry)->value.fetch(xref, obj);
+    return gTrue;
+  } else {
+    printf("failed to look up %s\n", name->getCString());
+    obj->initNull();
+    return gFalse;
+  }
+}
+
+Object NameTree::getValue(int index)
+{
+  if (index < length) {
+    return entries[index]->value;
+  } else {
+    return Object();
+  }
+}
+
+GooString *NameTree::getName(int index)
+{
+    if (index < length) {
+       return &entries[index]->name;
+    } else {
+       return NULL;
+    }
+}
+
+GBool Catalog::labelToIndex(GooString *label, int *index)
+{
+  char *end;
+
+  PageLabelInfo *pli = getPageLabelInfo();
+  if (pli != NULL) {
+    if (!pli->labelToIndex(label, index))
+      return gFalse;
+  } else {
+    *index = strtol(label->getCString(), &end, 10) - 1;
+    if (*end != '\0')
+      return gFalse;
+  }
+
+  if (*index < 0 || *index >= getNumPages())
+    return gFalse;
+
+  return gTrue;
+}
+
+GBool Catalog::indexToLabel(int index, GooString *label)
+{
+  char buffer[32];
+
+  if (index < 0 || index >= getNumPages())
+    return gFalse;
+
+  PageLabelInfo *pli = getPageLabelInfo();
+  if (pli != NULL) {
+    return pli->indexToLabel(index, label);
+  } else {
+    snprintf(buffer, sizeof (buffer), "%d", index + 1);
+    label->append(buffer);           
+    return gTrue;
+  }
+}
+
+int Catalog::getNumPages()
+{
+  if (numPages == -1)
+  {
+    Object catDict, pagesDict, obj;
+
+    xref->getCatalog(&catDict);
+    if (!catDict.isDict()) {
+      error(errSyntaxError, -1, "Catalog object is wrong type ({0:s})", catDict.getTypeName());
+      catDict.free();
+      return 0;
+    }
+    catDict.dictLookup("Pages", &pagesDict);
+    catDict.free();
+
+    // This should really be isDict("Pages"), but I've seen at least one
+    // PDF file where the /Type entry is missing.
+    if (!pagesDict.isDict()) {
+      error(errSyntaxError, -1, "Top-level pages object is wrong type ({0:s})",
+          pagesDict.getTypeName());
+      pagesDict.free();
+      return 0;
+    }
+
+    pagesDict.dictLookup("Count", &obj);
+    // some PDF files actually use real numbers here ("/Count 9.0")
+    if (!obj.isNum()) {
+      error(errSyntaxError, -1, "Page count in top-level pages object is wrong type ({0:s})",
+         obj.getTypeName());
+      numPages = 0;
+    } else {
+      numPages = (int)obj.getNum();
+    }
+
+    obj.free();
+    pagesDict.free();
+  }
+
+  return numPages;
+}
+
+PageLabelInfo *Catalog::getPageLabelInfo()
+{
+  if (!pageLabelInfo) {
+    Object catDict;
+    Object obj;
+
+    xref->getCatalog(&catDict);
+    if (!catDict.isDict()) {
+      error(errSyntaxError, -1, "Catalog object is wrong type ({0:s})", catDict.getTypeName());
+      catDict.free();
+      return NULL;
+    }
+
+    if (catDict.dictLookup("PageLabels", &obj)->isDict()) {
+      pageLabelInfo = new PageLabelInfo(&obj, getNumPages());
+    }
+    obj.free();
+    catDict.free();
+  }
+
+  return pageLabelInfo;
+}
+
+Object *Catalog::getStructTreeRoot()
+{
+  if (structTreeRoot.isNone())
+  {
+     Object catDict;
+
+     xref->getCatalog(&catDict);
+     if (catDict.isDict()) {
+       catDict.dictLookup("StructTreeRoot", &structTreeRoot);
+     } else {
+       error(errSyntaxError, -1, "Catalog object is wrong type ({0:s})", catDict.getTypeName());
+       structTreeRoot.initNull();
+     }
+     catDict.free();
+  }
+
+  return &structTreeRoot;
+}
+
+Object *Catalog::getOutline()
+{
+  if (outline.isNone())
+  {
+     Object catDict;
+
+     xref->getCatalog(&catDict);
+     if (catDict.isDict()) {
+       catDict.dictLookup("Outlines", &outline);
+     } else {
+       error(errSyntaxError, -1, "Catalog object is wrong type ({0:s})", catDict.getTypeName());
+       outline.initNull();
+     }
+     catDict.free();
+  }
+
+  return &outline;
+}
+
+Object *Catalog::getDests()
+{
+  if (dests.isNone())
+  {
+     Object catDict;
+
+     xref->getCatalog(&catDict);
+     if (catDict.isDict()) {
+       catDict.dictLookup("Dests", &dests);
+     } else {
+       error(errSyntaxError, -1, "Catalog object is wrong type ({0:s})", catDict.getTypeName());
+       dests.initNull();
+     }
+     catDict.free();
+  }
+
+  return &dests;
+}
+
+Form *Catalog::getForm()
+{
+  if (!form) {
+    if (acroForm.isDict()) {
+      form = new Form(doc, &acroForm);
+      // perform form-related loading after all widgets have been loaded
+      form->postWidgetsLoad();
+    }
+  }
+
+  return form;
+}
+
+ViewerPreferences *Catalog::getViewerPreferences()
+{
+  if (!viewerPrefs) {
+    if (viewerPreferences.isDict()) {
+      viewerPrefs = new ViewerPreferences(viewerPreferences.getDict());
+    }
+  }
+
+  return viewerPrefs;
+}
+
+Object *Catalog::getNames()
+{
+  if (names.isNone())
+  {
+     Object catDict;
+
+     xref->getCatalog(&catDict);
+     if (catDict.isDict()) {
+       catDict.dictLookup("Names", &names);
+     } else {
+       error(errSyntaxError, -1, "Catalog object is wrong type ({0:s})", catDict.getTypeName());
+       names.initNull();
+     }
+     catDict.free();
+  }
+
+  return &names;
+}
+
+NameTree *Catalog::getDestNameTree()
+{
+  if (!destNameTree) {
+
+    destNameTree = new NameTree();
+
+    if (getNames()->isDict()) {
+       Object obj;
+
+       getNames()->dictLookup("Dests", &obj);
+       destNameTree->init(xref, &obj);
+       obj.free();
+    }
+
+  }
+
+  return destNameTree;
+}
+
+NameTree *Catalog::getEmbeddedFileNameTree()
+{
+  if (!embeddedFileNameTree) {
+
+    embeddedFileNameTree = new NameTree();
+
+    if (getNames()->isDict()) {
+       Object obj;
+
+       getNames()->dictLookup("EmbeddedFiles", &obj);
+       embeddedFileNameTree->init(xref, &obj);
+       obj.free();
+    }
+
+  }
+
+  return embeddedFileNameTree;
+}
+
+NameTree *Catalog::getJSNameTree()
+{
+  if (!jsNameTree) {
+
+    jsNameTree = new NameTree();
+
+    if (getNames()->isDict()) {
+       Object obj;
+
+       getNames()->dictLookup("JavaScript", &obj);
+       jsNameTree->init(xref, &obj);
+       obj.free();
+    }
+
+  }
+
+  return jsNameTree;
+}
+
diff --git a/poppler/Catalog.h b/poppler/Catalog.h
new file mode 100644 (file)
index 0000000..cdb1f13
--- /dev/null
@@ -0,0 +1,229 @@
+//========================================================================
+//
+// Catalog.h
+//
+// Copyright 1996-2007 Glyph & Cog, LLC
+//
+//========================================================================
+
+//========================================================================
+//
+// Modified under the Poppler project - http://poppler.freedesktop.org
+//
+// All changes made under the Poppler project to this file are licensed
+// under GPL version 2 or later
+//
+// Copyright (C) 2005 Kristian Høgsberg <krh@redhat.com>
+// Copyright (C) 2005, 2007, 2009-2011 Albert Astals Cid <aacid@kde.org>
+// Copyright (C) 2005 Jonathan Blandford <jrb@redhat.com>
+// Copyright (C) 2005, 2006, 2008 Brad Hards <bradh@frogmouth.net>
+// Copyright (C) 2007 Julien Rebetez <julienr@svn.gnome.org>
+// Copyright (C) 2008, 2011 Pino Toscano <pino@kde.org>
+// Copyright (C) 2010 Hib Eris <hib@hiberis.nl>
+//
+// To see a description of the changes please see the Changelog file that
+// came with your tarball or type make ChangeLog if you are building from git
+//
+//========================================================================
+
+#ifndef CATALOG_H
+#define CATALOG_H
+
+#ifdef USE_GCC_PRAGMAS
+#pragma interface
+#endif
+
+#include "Object.h"
+
+#include <vector>
+
+class PDFDoc;
+class XRef;
+class Object;
+class Page;
+class PageAttrs;
+struct Ref;
+class LinkDest;
+class PageLabelInfo;
+class Form;
+class OCGs;
+class ViewerPreferences;
+class FileSpec;
+
+//------------------------------------------------------------------------
+// NameTree
+//------------------------------------------------------------------------
+
+class NameTree {
+public:
+  NameTree();
+  ~NameTree();
+  void init(XRef *xref, Object *tree);
+  GBool lookup(GooString *name, Object *obj);
+  int numEntries() { return length; };
+  // iterator accessor, note it returns a shallow copy, do not free the object
+  Object getValue(int i);
+  GooString *getName(int i);
+
+private:
+  struct Entry {
+    Entry(Array *array, int index);
+    ~Entry();
+    GooString name;
+    Object value;
+    void free();
+    static int cmp(const void *key, const void *entry);
+  };
+
+  void parse(Object *tree);
+  void addEntry(Entry *entry);
+
+  XRef *xref;
+  Object *root;
+  Entry **entries;
+  int size, length; // size is the number of entries in
+                    // the array of Entry*
+                    // length is the number of real Entry
+};
+
+//------------------------------------------------------------------------
+// Catalog
+//------------------------------------------------------------------------
+
+class Catalog {
+public:
+
+  // Constructor.
+  Catalog(PDFDoc *docA);
+
+  // Destructor.
+  ~Catalog();
+
+  // Is catalog valid?
+  GBool isOk() { return ok; }
+
+  // Get number of pages.
+  int getNumPages();
+
+  // Get a page.
+  Page *getPage(int i);
+
+  // Get the reference for a page object.
+  Ref *getPageRef(int i);
+
+  // Return base URI, or NULL if none.
+  GooString *getBaseURI() { return baseURI; }
+
+  // Return the contents of the metadata stream, or NULL if there is
+  // no metadata.
+  GooString *readMetadata();
+
+  // Return the structure tree root object.
+  Object *getStructTreeRoot();
+
+  // Find a page, given its object ID.  Returns page number, or 0 if
+  // not found.
+  int findPage(int num, int gen);
+
+  // Find a named destination.  Returns the link destination, or
+  // NULL if <name> is not a destination.
+  LinkDest *findDest(GooString *name);
+
+  Object *getDests();
+
+  // Get the number of embedded files
+  int numEmbeddedFiles() { return getEmbeddedFileNameTree()->numEntries(); }
+
+  // Get the i'th file embedded (at the Document level) in the document
+  FileSpec *embeddedFile(int i);
+
+  // Get the number of javascript scripts
+  int numJS() { return getJSNameTree()->numEntries(); }
+
+  // Get the i'th JavaScript script (at the Document level) in the document
+  GooString *getJS(int i);
+
+  // Convert between page indices and page labels.
+  GBool labelToIndex(GooString *label, int *index);
+  GBool indexToLabel(int index, GooString *label);
+
+  Object *getOutline();
+
+  Object *getAcroForm() { return &acroForm; }
+
+  OCGs *getOptContentConfig() { return optContent; }
+
+  Form* getForm();
+
+  ViewerPreferences *getViewerPreferences();
+
+  enum PageMode {
+    pageModeNone,
+    pageModeOutlines,
+    pageModeThumbs,
+    pageModeFullScreen,
+    pageModeOC,
+    pageModeAttach,
+    pageModeNull
+  };
+  enum PageLayout {
+    pageLayoutNone,
+    pageLayoutSinglePage,
+    pageLayoutOneColumn,
+    pageLayoutTwoColumnLeft,
+    pageLayoutTwoColumnRight,
+    pageLayoutTwoPageLeft,
+    pageLayoutTwoPageRight,
+    pageLayoutNull
+  };
+
+  // Returns the page mode.
+  PageMode getPageMode();
+  PageLayout getPageLayout();
+
+private:
+
+  // Get page label info.
+  PageLabelInfo *getPageLabelInfo();
+
+  PDFDoc *doc;
+  XRef *xref;                  // the xref table for this PDF file
+  Page **pages;                        // array of pages
+  Ref *pageRefs;               // object ID for each page
+  int lastCachedPage;
+  std::vector<Dict *> *pagesList;
+  std::vector<Ref> *pagesRefList;
+  std::vector<PageAttrs *> *attrsList;
+  std::vector<int> *kidsIdxList;
+  Form *form;
+  ViewerPreferences *viewerPrefs;
+  int numPages;                        // number of pages
+  int pagesSize;               // size of pages array
+  Object dests;                        // named destination dictionary
+  Object names;                        // named names dictionary
+  NameTree *destNameTree;      // named destination name-tree
+  NameTree *embeddedFileNameTree;  // embedded file name-tree
+  NameTree *jsNameTree;                // Java Script name-tree
+  GooString *baseURI;          // base URI for URI-type links
+  Object metadata;             // metadata stream
+  Object structTreeRoot;       // structure tree root dictionary
+  Object outline;              // outline dictionary
+  Object acroForm;             // AcroForm dictionary
+  Object viewerPreferences;     // ViewerPreference dictionary
+  OCGs *optContent;            // Optional Content groups
+  GBool ok;                    // true if catalog is valid
+  PageLabelInfo *pageLabelInfo; // info about page labels
+  PageMode pageMode;           // page mode
+  PageLayout pageLayout;       // page layout
+
+  GBool cachePageTree(int page); // Cache first <page> pages.
+  Object *findDestInTree(Object *tree, GooString *name, Object *obj);
+
+  Object *getNames();
+  NameTree *getDestNameTree();
+  NameTree *getEmbeddedFileNameTree();
+  NameTree *getJSNameTree();
+
+};
+
+#endif
diff --git a/poppler/CharCodeToUnicode.cc b/poppler/CharCodeToUnicode.cc
new file mode 100644 (file)
index 0000000..d0e6c7f
--- /dev/null
@@ -0,0 +1,716 @@
+//========================================================================
+//
+// CharCodeToUnicode.cc
+//
+// Copyright 2001-2003 Glyph & Cog, LLC
+//
+//========================================================================
+
+//========================================================================
+//
+// Modified under the Poppler project - http://poppler.freedesktop.org
+//
+// All changes made under the Poppler project to this file are licensed
+// under GPL version 2 or later
+//
+// Copyright (C) 2006, 2008-2010, 2012 Albert Astals Cid <aacid@kde.org>
+// Copyright (C) 2007 Julien Rebetez <julienr@svn.gnome.org>
+// Copyright (C) 2007 Koji Otani <sho@bbr.jp>
+// Copyright (C) 2008 Michael Vrable <mvrable@cs.ucsd.edu>
+// Copyright (C) 2008 Vasile Gaburici <gaburici@cs.umd.edu>
+// Copyright (C) 2010 William Bader <williambader@hotmail.com>
+// Copyright (C) 2010 Jakub Wilk <ubanus@users.sf.net>
+// Copyright (C) 2012 Thomas Freitag <Thomas.Freitag@alfa.de>
+//
+// To see a description of the changes please see the Changelog file that
+// came with your tarball or type make ChangeLog if you are building from git
+//
+//========================================================================
+
+#include <config.h>
+
+#ifdef USE_GCC_PRAGMAS
+#pragma implementation
+#endif
+
+#include <stdio.h>
+#include <string.h>
+#include "goo/gmem.h"
+#include "goo/gfile.h"
+#include "goo/GooLikely.h"
+#include "goo/GooString.h"
+#include "Error.h"
+#include "GlobalParams.h"
+#include "PSTokenizer.h"
+#include "CharCodeToUnicode.h"
+
+//------------------------------------------------------------------------
+
+struct CharCodeToUnicodeString {
+  CharCode c;
+  Unicode *u;
+  int len;
+};
+
+//------------------------------------------------------------------------
+
+static int getCharFromString(void *data) {
+  char *p;
+  int c;
+
+  p = *(char **)data;
+  if (*p) {
+    c = *p++;
+    *(char **)data = p;
+  } else {
+    c = EOF;
+  }
+  return c;
+}
+
+static int getCharFromFile(void *data) {
+  return fgetc((FILE *)data);
+}
+
+//------------------------------------------------------------------------
+
+static int hexCharVals[256] = {
+  -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, // 0x
+  -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, // 1x
+  -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, // 2x
+   0,  1,  2,  3,  4,  5,  6,  7,  8,  9, -1, -1, -1, -1, -1, -1, // 3x
+  -1, 10, 11, 12, 13, 14, 15, -1, -1, -1, -1, -1, -1, -1, -1, -1, // 4x
+  -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, // 5x
+  -1, 10, 11, 12, 13, 14, 15, -1, -1, -1, -1, -1, -1, -1, -1, -1, // 6x
+  -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, // 7x
+  -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, // 8x
+  -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, // 9x
+  -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, // Ax
+  -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, // Bx
+  -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, // Cx
+  -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, // Dx
+  -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, // Ex
+  -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1  // Fx
+};
+
+// Parse a <len>-byte hex string <s> into *<val>.  Returns false on
+// error.
+static GBool parseHex(char *s, int len, Guint *val) {
+  int i, x;
+
+  *val = 0;
+  for (i = 0; i < len; ++i) {
+    x = hexCharVals[s[i] & 0xff];
+    if (x < 0) {
+      return gFalse;
+    }
+    *val = (*val << 4) + x;
+  }
+  return gTrue;
+}
+
+//------------------------------------------------------------------------
+
+CharCodeToUnicode *CharCodeToUnicode::makeIdentityMapping() {
+  CharCodeToUnicode *ctu = new CharCodeToUnicode();
+  ctu->isIdentity = gTrue;
+  ctu->mapLen = 1;
+  ctu->map = (Unicode *)gmallocn(ctu->mapLen, sizeof(Unicode));
+  return ctu;
+}
+
+CharCodeToUnicode *CharCodeToUnicode::parseCIDToUnicode(GooString *fileName,
+                                                       GooString *collection) {
+  FILE *f;
+  Unicode *mapA;
+  CharCode size, mapLenA;
+  char buf[64];
+  Unicode u;
+  CharCodeToUnicode *ctu;
+
+  if (!(f = openFile(fileName->getCString(), "r"))) {
+    error(errIO, -1, "Couldn't open cidToUnicode file '{0:t}'",
+         fileName);
+    return NULL;
+  }
+
+  size = 32768;
+  mapA = (Unicode *)gmallocn(size, sizeof(Unicode));
+  mapLenA = 0;
+
+  while (getLine(buf, sizeof(buf), f)) {
+    if (mapLenA == size) {
+      size *= 2;
+      mapA = (Unicode *)greallocn(mapA, size, sizeof(Unicode));
+    }
+    if (sscanf(buf, "%x", &u) == 1) {
+      mapA[mapLenA] = u;
+    } else {
+      error(errSyntaxWarning, -1, "Bad line ({0:d}) in cidToUnicode file '{1:t}'",
+           (int)(mapLenA + 1), fileName);
+      mapA[mapLenA] = 0;
+    }
+    ++mapLenA;
+  }
+  fclose(f);
+
+  ctu = new CharCodeToUnicode(collection->copy(), mapA, mapLenA, gTrue,
+                             NULL, 0, 0);
+  gfree(mapA);
+  return ctu;
+}
+
+CharCodeToUnicode *CharCodeToUnicode::parseUnicodeToUnicode(
+                                                   GooString *fileName) {
+  FILE *f;
+  Unicode *mapA;
+  CharCodeToUnicodeString *sMapA;
+  CharCode size, oldSize, len, sMapSizeA, sMapLenA;
+  char buf[256];
+  char *tok;
+  Unicode u0;
+  int uBufSize = 8;
+  Unicode *uBuf = (Unicode *)gmallocn(uBufSize, sizeof(Unicode));
+  CharCodeToUnicode *ctu;
+  int line, n, i;
+  char *tokptr;
+
+  if (!(f = openFile(fileName->getCString(), "r"))) {
+    gfree(uBuf);
+    error(errIO, -1, "Couldn't open unicodeToUnicode file '{0:t}'",
+         fileName);
+    return NULL;
+  }
+
+  size = 4096;
+  mapA = (Unicode *)gmallocn(size, sizeof(Unicode));
+  memset(mapA, 0, size * sizeof(Unicode));
+  len = 0;
+  sMapA = NULL;
+  sMapSizeA = sMapLenA = 0;
+
+  line = 0;
+  while (getLine(buf, sizeof(buf), f)) {
+    ++line;
+    if (!(tok = strtok_r(buf, " \t\r\n", &tokptr)) ||
+       !parseHex(tok, strlen(tok), &u0)) {
+      error(errSyntaxWarning, -1, "Bad line ({0:d}) in unicodeToUnicode file '{1:t}'",
+           line, fileName);
+      continue;
+    }
+    n = 0;
+    while ((tok = strtok_r(NULL, " \t\r\n", &tokptr))) {
+      if (n >= uBufSize)
+      {
+        uBufSize += 8;
+        uBuf = (Unicode *)greallocn(uBuf, uBufSize, sizeof(Unicode));
+      }
+      if (!parseHex(tok, strlen(tok), &uBuf[n])) {
+       error(errSyntaxWarning, -1, "Bad line ({0:d}) in unicodeToUnicode file '{1:t}'",
+             line, fileName);
+       break;
+      }
+      ++n;
+    }
+    if (n < 1) {
+      error(errSyntaxWarning, -1, "Bad line ({0:d}) in unicodeToUnicode file '{1:t}'",
+           line, fileName);
+      continue;
+    }
+    if (u0 >= size) {
+      oldSize = size;
+      while (u0 >= size) {
+       size *= 2;
+      }
+      mapA = (Unicode *)greallocn(mapA, size, sizeof(Unicode));
+      memset(mapA + oldSize, 0, (size - oldSize) * sizeof(Unicode));
+    }
+    if (n == 1) {
+      mapA[u0] = uBuf[0];
+    } else {
+      mapA[u0] = 0;
+      if (sMapLenA == sMapSizeA) {
+       sMapSizeA += 16;
+       sMapA = (CharCodeToUnicodeString *)
+                 greallocn(sMapA, sMapSizeA, sizeof(CharCodeToUnicodeString));
+      }
+      sMapA[sMapLenA].c = u0;
+      sMapA[sMapLenA].u = (Unicode*)gmallocn(n, sizeof(Unicode));
+      for (i = 0; i < n; ++i) {
+       sMapA[sMapLenA].u[i] = uBuf[i];
+      }
+      sMapA[sMapLenA].len = n;
+      ++sMapLenA;
+    }
+    if (u0 >= len) {
+      len = u0 + 1;
+    }
+  }
+  fclose(f);
+
+  ctu = new CharCodeToUnicode(fileName->copy(), mapA, len, gTrue,
+                             sMapA, sMapLenA, sMapSizeA);
+  gfree(mapA);
+  gfree(uBuf);
+  return ctu;
+}
+
+CharCodeToUnicode *CharCodeToUnicode::make8BitToUnicode(Unicode *toUnicode) {
+  return new CharCodeToUnicode(NULL, toUnicode, 256, gTrue, NULL, 0, 0);
+}
+
+CharCodeToUnicode *CharCodeToUnicode::parseCMap(GooString *buf, int nBits) {
+  CharCodeToUnicode *ctu;
+  char *p;
+
+  ctu = new CharCodeToUnicode(NULL);
+  p = buf->getCString();
+  ctu->parseCMap1(&getCharFromString, &p, nBits);
+  return ctu;
+}
+
+CharCodeToUnicode *CharCodeToUnicode::parseCMapFromFile(GooString *fileName,
+  int nBits) {
+  CharCodeToUnicode *ctu;
+  FILE *f;
+
+  ctu = new CharCodeToUnicode(NULL);
+  if ((f = globalParams->findToUnicodeFile(fileName))) {
+    ctu->parseCMap1(&getCharFromFile, f, nBits);
+    fclose(f);
+  } else {
+    error(errSyntaxError, -1, "Couldn't find ToUnicode CMap file for '{0:t}'",
+         fileName);
+  }
+  return ctu;
+}
+
+void CharCodeToUnicode::mergeCMap(GooString *buf, int nBits) {
+  char *p;
+
+  p = buf->getCString();
+  parseCMap1(&getCharFromString, &p, nBits);
+}
+
+void CharCodeToUnicode::parseCMap1(int (*getCharFunc)(void *), void *data,
+                                  int nBits) {
+  PSTokenizer *pst;
+  char tok1[256], tok2[256], tok3[256];
+  int n1, n2, n3;
+  CharCode i;
+  CharCode maxCode, code1, code2;
+  GooString *name;
+  FILE *f;
+
+  maxCode = (nBits == 8) ? 0xff : (nBits == 16) ? 0xffff : 0xffffffff;
+  pst = new PSTokenizer(getCharFunc, data);
+  pst->getToken(tok1, sizeof(tok1), &n1);
+  while (pst->getToken(tok2, sizeof(tok2), &n2)) {
+    if (!strcmp(tok2, "usecmap")) {
+      if (tok1[0] == '/') {
+       name = new GooString(tok1 + 1);
+       if ((f = globalParams->findToUnicodeFile(name))) {
+         parseCMap1(&getCharFromFile, f, nBits);
+         fclose(f);
+       } else {
+         error(errSyntaxError, -1, "Couldn't find ToUnicode CMap file for '{0:t}'",
+               name);
+       }
+       delete name;
+      }
+      pst->getToken(tok1, sizeof(tok1), &n1);
+    } else if (!strcmp(tok2, "beginbfchar")) {
+      while (pst->getToken(tok1, sizeof(tok1), &n1)) {
+       if (!strcmp(tok1, "endbfchar")) {
+         break;
+       }
+       if (!pst->getToken(tok2, sizeof(tok2), &n2) ||
+           !strcmp(tok2, "endbfchar")) {
+         error(errSyntaxWarning, -1, "Illegal entry in bfchar block in ToUnicode CMap");
+         break;
+       }
+       if (!(tok1[0] == '<' && tok1[n1 - 1] == '>' &&
+             tok2[0] == '<' && tok2[n2 - 1] == '>')) {
+         error(errSyntaxWarning, -1, "Illegal entry in bfchar block in ToUnicode CMap");
+         continue;
+       }
+       tok1[n1 - 1] = tok2[n2 - 1] = '\0';
+       if (!parseHex(tok1 + 1, n1 - 2, &code1)) {
+         error(errSyntaxWarning, -1, "Illegal entry in bfchar block in ToUnicode CMap");
+         continue;
+       }
+       if (code1 > maxCode) {
+         error(errSyntaxWarning, -1,
+               "Invalid entry in bfchar block in ToUnicode CMap");
+       }
+       addMapping(code1, tok2 + 1, n2 - 2, 0);
+      }
+      pst->getToken(tok1, sizeof(tok1), &n1);
+    } else if (!strcmp(tok2, "beginbfrange")) {
+      while (pst->getToken(tok1, sizeof(tok1), &n1)) {
+       if (!strcmp(tok1, "endbfrange")) {
+         break;
+       }
+       if (!pst->getToken(tok2, sizeof(tok2), &n2) ||
+           !strcmp(tok2, "endbfrange") ||
+           !pst->getToken(tok3, sizeof(tok3), &n3) ||
+           !strcmp(tok3, "endbfrange")) {
+         error(errSyntaxWarning, -1, "Illegal entry in bfrange block in ToUnicode CMap");
+         break;
+       }
+       if (!(tok1[0] == '<' && tok1[n1 - 1] == '>' &&
+             tok2[0] == '<' && tok2[n2 - 1] == '>')) {
+         error(errSyntaxWarning, -1, "Illegal entry in bfrange block in ToUnicode CMap");
+         continue;
+       }
+       tok1[n1 - 1] = tok2[n2 - 1] = '\0';
+       if (!parseHex(tok1 + 1, n1 - 2, &code1) ||
+           !parseHex(tok2 + 1, n2 - 2, &code2)) {
+         error(errSyntaxWarning, -1, "Illegal entry in bfrange block in ToUnicode CMap");
+         continue;
+       }
+       if (code1 > maxCode || code2 > maxCode) {
+         error(errSyntaxWarning, -1,
+               "Invalid entry in bfrange block in ToUnicode CMap");
+         if (code1 > maxCode) {
+           code1 = maxCode;
+         }
+         if (code2 > maxCode) {
+           code2 = maxCode;
+         }
+       }
+       if (!strcmp(tok3, "[")) {
+         i = 0;
+         while (pst->getToken(tok1, sizeof(tok1), &n1) &&
+                code1 + i <= code2) {
+           if (!strcmp(tok1, "]")) {
+             break;
+           }
+           if (tok1[0] == '<' && tok1[n1 - 1] == '>') {
+             tok1[n1 - 1] = '\0';
+             addMapping(code1 + i, tok1 + 1, n1 - 2, 0);
+           } else {
+             error(errSyntaxWarning, -1, "Illegal entry in bfrange block in ToUnicode CMap");
+           }
+           ++i;
+         }
+       } else if (tok3[0] == '<' && tok3[n3 - 1] == '>') {
+         tok3[n3 - 1] = '\0';
+         for (i = 0; code1 <= code2; ++code1, ++i) {
+           addMapping(code1, tok3 + 1, n3 - 2, i);
+         }
+
+       } else {
+         error(errSyntaxWarning, -1, "Illegal entry in bfrange block in ToUnicode CMap");
+       }
+      }
+      pst->getToken(tok1, sizeof(tok1), &n1);
+    } else {
+      strcpy(tok1, tok2);
+    }
+  }
+  delete pst;
+}
+
+void CharCodeToUnicode::addMapping(CharCode code, char *uStr, int n,
+                                  int offset) {
+  CharCode oldLen, i;
+  Unicode u;
+  int j;
+
+  if (code > 0xffffff) {
+    // This is an arbitrary limit to avoid integer overflow issues.
+    // (I've seen CMaps with mappings for <ffffffff>.)
+    return;
+  }
+  if (code >= mapLen) {
+    oldLen = mapLen;
+    mapLen = mapLen ? 2 * mapLen : 256;
+    if (code >= mapLen) {
+      mapLen = (code + 256) & ~255;
+    }
+    if (unlikely(code >= mapLen)) {
+      error(errSyntaxWarning, -1, "Illegal code value in CharCodeToUnicode::addMapping");
+      return;
+    } else {
+      map = (Unicode *)greallocn(map, mapLen, sizeof(Unicode));
+      for (i = oldLen; i < mapLen; ++i) {
+        map[i] = 0;
+      }
+       }
+  }
+  if (n <= 4) {
+    if (!parseHex(uStr, n, &u)) {
+      error(errSyntaxWarning, -1, "Illegal entry in ToUnicode CMap");
+      return;
+    }
+    map[code] = u + offset;
+  } else {
+    if (sMapLen >= sMapSize) {
+      sMapSize = sMapSize + 16;
+      sMap = (CharCodeToUnicodeString *)
+              greallocn(sMap, sMapSize, sizeof(CharCodeToUnicodeString));
+    }
+    map[code] = 0;
+    sMap[sMapLen].c = code;
+    sMap[sMapLen].len = n / 4;
+    sMap[sMapLen].u = (Unicode*)gmallocn(sMap[sMapLen].len, sizeof(Unicode));
+    for (j = 0; j < sMap[sMapLen].len; ++j) {
+      if (!parseHex(uStr + j*4, 4, &sMap[sMapLen].u[j])) {
+       error(errSyntaxWarning, -1, "Illegal entry in ToUnicode CMap");
+       return;
+      }
+    }
+    sMap[sMapLen].u[sMap[sMapLen].len - 1] += offset;
+    ++sMapLen;
+  }
+}
+
+CharCodeToUnicode::CharCodeToUnicode() {
+  tag = NULL;
+  map = NULL;
+  mapLen = 0;
+  sMap = NULL;
+  sMapLen = sMapSize = 0;
+  refCnt = 1;
+  isIdentity = gFalse;
+#if MULTITHREADED
+  gInitMutex(&mutex);
+#endif
+}
+
+CharCodeToUnicode::CharCodeToUnicode(GooString *tagA) {
+  CharCode i;
+
+  tag = tagA;
+  mapLen = 256;
+  map = (Unicode *)gmallocn(mapLen, sizeof(Unicode));
+  for (i = 0; i < mapLen; ++i) {
+    map[i] = 0;
+  }
+  sMap = NULL;
+  sMapLen = sMapSize = 0;
+  refCnt = 1;
+  isIdentity = gFalse;
+#if MULTITHREADED
+  gInitMutex(&mutex);
+#endif
+}
+
+CharCodeToUnicode::CharCodeToUnicode(GooString *tagA, Unicode *mapA,
+                                    CharCode mapLenA, GBool copyMap,
+                                    CharCodeToUnicodeString *sMapA,
+                                    int sMapLenA, int sMapSizeA) {
+  tag = tagA;
+  mapLen = mapLenA;
+  if (copyMap) {
+    map = (Unicode *)gmallocn(mapLen, sizeof(Unicode));
+    memcpy(map, mapA, mapLen * sizeof(Unicode));
+  } else {
+    map = mapA;
+  }
+  sMap = sMapA;
+  sMapLen = sMapLenA;
+  sMapSize = sMapSizeA;
+  refCnt = 1;
+  isIdentity = gFalse;
+#if MULTITHREADED
+  gInitMutex(&mutex);
+#endif
+}
+
+CharCodeToUnicode::~CharCodeToUnicode() {
+  if (tag) {
+    delete tag;
+  }
+  gfree(map);
+  if (sMap) {
+    for (int i = 0; i < sMapLen; ++i) gfree(sMap[i].u);
+    gfree(sMap);
+  }
+#if MULTITHREADED
+  gDestroyMutex(&mutex);
+#endif
+}
+
+void CharCodeToUnicode::incRefCnt() {
+#if MULTITHREADED
+  gLockMutex(&mutex);
+#endif
+  ++refCnt;
+#if MULTITHREADED
+  gUnlockMutex(&mutex);
+#endif
+}
+
+void CharCodeToUnicode::decRefCnt() {
+  GBool done;
+
+#if MULTITHREADED
+  gLockMutex(&mutex);
+#endif
+  done = --refCnt == 0;
+#if MULTITHREADED
+  gUnlockMutex(&mutex);
+#endif
+  if (done) {
+    delete this;
+  }
+}
+
+GBool CharCodeToUnicode::match(GooString *tagA) {
+  return tag && !tag->cmp(tagA);
+}
+
+void CharCodeToUnicode::setMapping(CharCode c, Unicode *u, int len) {
+  int i, j;
+
+  if (!map || isIdentity) {
+    return;
+  }
+  if (len == 1) {
+    map[c] = u[0];
+  } else {
+    for (i = 0; i < sMapLen; ++i) {
+      if (sMap[i].c == c) {
+       gfree(sMap[i].u);
+       break;
+      }
+    }
+    if (i == sMapLen) {
+      if (sMapLen == sMapSize) {
+       sMapSize += 8;
+       sMap = (CharCodeToUnicodeString *)
+                greallocn(sMap, sMapSize, sizeof(CharCodeToUnicodeString));
+      }
+      ++sMapLen;
+    }
+    map[c] = 0;
+    sMap[i].c = c;
+    sMap[i].len = len;
+    sMap[i].u = (Unicode*)gmallocn(len, sizeof(Unicode));
+    for (j = 0; j < len; ++j) {
+      sMap[i].u[j] = u[j];
+    }
+  }
+}
+
+int CharCodeToUnicode::mapToUnicode(CharCode c, Unicode **u) {
+  int i;
+
+  if (isIdentity) {
+    map[0] = (Unicode)c;
+    *u = map;
+    return 1;
+  }
+  if (c >= mapLen) {
+    return 0;
+  }
+  if (map[c]) {
+    *u = &map[c];
+    return 1;
+  }
+  for (i = sMapLen - 1; i >= 0; --i) { // in reverse so CMap takes precedence
+    if (sMap[i].c == c) {
+      *u = sMap[i].u;
+      return sMap[i].len;
+    }
+  }
+  return 0;
+}
+
+int CharCodeToUnicode::mapToCharCode(Unicode* u, CharCode *c, int usize) {
+  //look for charcode in map
+  if (usize == 1) {
+    if (isIdentity) {
+      *c = (CharCode) *u;
+      return 1;
+    }
+    for (CharCode i=0; i<mapLen; i++) {
+      if (map[i] == *u) {
+        *c = i;
+        return 1;
+      }
+    }
+    *c = 'x';
+  } else {
+    int i, j;
+    //for each entry in the sMap
+    for (i=0; i<sMapLen; i++) {
+      //if the entry's unicode length isn't the same are usize, the strings 
+      // are obviously differents
+      if (sMap[i].len != usize) continue;
+      //compare the string char by char
+      for (j=0; j<sMap[i].len; j++) {
+        if (sMap[i].u[j] != u[j]) {
+          continue;
+        }
+      }
+
+      //we have the same strings
+      if (j==sMap[i].len) { 
+        *c = sMap[i].c;
+        return 1;
+      }
+    }
+  }
+  return 0;
+}
+
+//------------------------------------------------------------------------
+
+CharCodeToUnicodeCache::CharCodeToUnicodeCache(int sizeA) {
+  int i;
+
+  size = sizeA;
+  cache = (CharCodeToUnicode **)gmallocn(size, sizeof(CharCodeToUnicode *));
+  for (i = 0; i < size; ++i) {
+    cache[i] = NULL;
+  }
+}
+
+CharCodeToUnicodeCache::~CharCodeToUnicodeCache() {
+  int i;
+
+  for (i = 0; i < size; ++i) {
+    if (cache[i]) {
+      cache[i]->decRefCnt();
+    }
+  }
+  gfree(cache);
+}
+
+CharCodeToUnicode *CharCodeToUnicodeCache::getCharCodeToUnicode(GooString *tag) {
+  CharCodeToUnicode *ctu;
+  int i, j;
+
+  if (cache[0] && cache[0]->match(tag)) {
+    cache[0]->incRefCnt();
+    return cache[0];
+  }
+  for (i = 1; i < size; ++i) {
+    if (cache[i] && cache[i]->match(tag)) {
+      ctu = cache[i];
+      for (j = i; j >= 1; --j) {
+       cache[j] = cache[j - 1];
+      }
+      cache[0] = ctu;
+      ctu->incRefCnt();
+      return ctu;
+    }
+  }
+  return NULL;
+}
+
+void CharCodeToUnicodeCache::add(CharCodeToUnicode *ctu) {
+  int i;
+
+  if (cache[size - 1]) {
+    cache[size - 1]->decRefCnt();
+  }
+  for (i = size - 1; i >= 1; --i) {
+    cache[i] = cache[i - 1];
+  }
+  cache[0] = ctu;
+  ctu->incRefCnt();
+}
diff --git a/poppler/CharCodeToUnicode.h b/poppler/CharCodeToUnicode.h
new file mode 100644 (file)
index 0000000..1672105
--- /dev/null
@@ -0,0 +1,146 @@
+//========================================================================
+//
+// CharCodeToUnicode.h
+//
+// Mapping from character codes to Unicode.
+//
+// Copyright 2001-2003 Glyph & Cog, LLC
+//
+//========================================================================
+
+//========================================================================
+//
+// Modified under the Poppler project - http://poppler.freedesktop.org
+//
+// All changes made under the Poppler project to this file are licensed
+// under GPL version 2 or later
+//
+// Copyright (C) 2007 Julien Rebetez <julienr@svn.gnome.org>
+// Copyright (C) 2007 Koji Otani <sho@bbr.jp>
+// Copyright (C) 2008, 2011, 2012 Albert Astals Cid <aacid@kde.org>
+//
+// To see a description of the changes please see the Changelog file that
+// came with your tarball or type make ChangeLog if you are building from git
+//
+//========================================================================
+
+#ifndef CHARCODETOUNICODE_H
+#define CHARCODETOUNICODE_H
+
+#ifdef USE_GCC_PRAGMAS
+#pragma interface
+#endif
+
+#include "poppler-config.h"
+#include "CharTypes.h"
+#include "goo/gtypes.h"
+
+#if MULTITHREADED
+#include "goo/GooMutex.h"
+#endif
+
+struct CharCodeToUnicodeString;
+class GooString;
+
+//------------------------------------------------------------------------
+
+class CharCodeToUnicode {
+friend class UnicodeToCharCode;
+public:
+
+  // Create an identity mapping (Unicode = CharCode).
+  static CharCodeToUnicode *makeIdentityMapping();
+
+  // Read the CID-to-Unicode mapping for <collection> from the file
+  // specified by <fileName>.  Sets the initial reference count to 1.
+  // Returns NULL on failure.
+  static CharCodeToUnicode *parseCIDToUnicode(GooString *fileName,
+                                             GooString *collection);
+
+  // Create a Unicode-to-Unicode mapping from the file specified by
+  // <fileName>.  Sets the initial reference count to 1.  Returns NULL
+  // on failure.
+  static CharCodeToUnicode *parseUnicodeToUnicode(GooString *fileName);
+
+  // Create the CharCode-to-Unicode mapping for an 8-bit font.
+  // <toUnicode> is an array of 256 Unicode indexes.  Sets the initial
+  // reference count to 1.
+  static CharCodeToUnicode *make8BitToUnicode(Unicode *toUnicode);
+
+  // Parse a ToUnicode CMap for an 8- or 16-bit font.
+  static CharCodeToUnicode *parseCMap(GooString *buf, int nBits);
+  static CharCodeToUnicode *parseCMapFromFile(GooString *fileName, int nBits);
+
+  // Parse a ToUnicode CMap for an 8- or 16-bit font, merging it into
+  // <this>.
+  void mergeCMap(GooString *buf, int nBits);
+
+  ~CharCodeToUnicode();
+
+  void incRefCnt();
+  void decRefCnt();
+
+  // Return true if this mapping matches the specified <tagA>.
+  GBool match(GooString *tagA);
+
+  // Set the mapping for <c>.
+  void setMapping(CharCode c, Unicode *u, int len);
+
+  // Map a CharCode to Unicode. Returns a pointer in u to internal storage
+  // so never store the pointers it returns, just the data, otherwise
+  // your pointed values might get changed by future calls
+  int mapToUnicode(CharCode c, Unicode **u);
+
+  // Map a Unicode to CharCode.
+  int mapToCharCode(Unicode* u, CharCode *c, int usize);
+
+  // Return the mapping's length, i.e., one more than the max char
+  // code supported by the mapping.
+  CharCode getLength() { return mapLen; }
+
+private:
+
+  void parseCMap1(int (*getCharFunc)(void *), void *data, int nBits);
+  void addMapping(CharCode code, char *uStr, int n, int offset);
+  CharCodeToUnicode();
+  CharCodeToUnicode(GooString *tagA);
+  CharCodeToUnicode(GooString *tagA, Unicode *mapA,
+                   CharCode mapLenA, GBool copyMap,
+                   CharCodeToUnicodeString *sMapA,
+                   int sMapLenA, int sMapSizeA);
+
+  GooString *tag;
+  Unicode *map;
+  CharCode mapLen;
+  CharCodeToUnicodeString *sMap;
+  int sMapLen, sMapSize;
+  int refCnt;
+  GBool isIdentity;
+#if MULTITHREADED
+  GooMutex mutex;
+#endif
+};
+
+//------------------------------------------------------------------------
+
+class CharCodeToUnicodeCache {
+public:
+
+  CharCodeToUnicodeCache(int sizeA);
+  ~CharCodeToUnicodeCache();
+
+  // Get the CharCodeToUnicode object for <tag>.  Increments its
+  // reference count; there will be one reference for the cache plus
+  // one for the caller of this function.  Returns NULL on failure.
+  CharCodeToUnicode *getCharCodeToUnicode(GooString *tag);
+
+  // Insert <ctu> into the cache, in the most-recently-used position.
+  void add(CharCodeToUnicode *ctu);
+
+private:
+
+  CharCodeToUnicode **cache;
+  int size;
+};
+
+#endif
diff --git a/poppler/CharTypes.h b/poppler/CharTypes.h
new file mode 100644 (file)
index 0000000..d0df630
--- /dev/null
@@ -0,0 +1,24 @@
+//========================================================================
+//
+// CharTypes.h
+//
+// Copyright 2001-2003 Glyph & Cog, LLC
+//
+//========================================================================
+
+#ifndef CHARTYPES_H
+#define CHARTYPES_H
+
+// Unicode character.
+typedef unsigned int Unicode;
+
+// Character ID for CID character collections.
+typedef unsigned int CID;
+
+// This is large enough to hold any of the following:
+// - 8-bit char code
+// - 16-bit CID
+// - Unicode
+typedef unsigned int CharCode;
+
+#endif
diff --git a/poppler/CompactFontTables.h b/poppler/CompactFontTables.h
new file mode 100644 (file)
index 0000000..cfbfdaf
--- /dev/null
@@ -0,0 +1,480 @@
+//========================================================================
+//
+// CompactFontTables.h
+//
+// Copyright 1999-2003 Glyph & Cog, LLC
+//
+//========================================================================
+
+//========================================================================
+//
+// Modified under the Poppler project - http://poppler.freedesktop.org
+//
+// All changes made under the Poppler project to this file are licensed
+// under GPL version 2 or later
+//
+// Copyright (C) 2011 Albert Astals Cid <aacid@kde.org>
+//
+// To see a description of the changes please see the Changelog file that
+// came with your tarball or type make ChangeLog if you are building from git
+//
+//========================================================================
+
+#ifndef COMPACTFONTINFO_H
+#define COMPACTFONTINFO_H
+
+#include "goo/gtypes.h"
+
+static char *type1CStdStrings[391] = {
+  ".notdef",
+  "space",
+  "exclam",
+  "quotedbl",
+  "numbersign",
+  "dollar",
+  "percent",
+  "ampersand",
+  "quoteright",
+  "parenleft",
+  "parenright",
+  "asterisk",
+  "plus",
+  "comma",
+  "hyphen",
+  "period",
+  "slash",
+  "zero",
+  "one",
+  "two",
+  "three",
+  "four",
+  "five",
+  "six",
+  "seven",
+  "eight",
+  "nine",
+  "colon",
+  "semicolon",
+  "less",
+  "equal",
+  "greater",
+  "question",
+  "at",
+  "A",
+  "B",
+  "C",
+  "D",
+  "E",
+  "F",
+  "G",
+  "H",
+  "I",
+  "J",
+  "K",
+  "L",
+  "M",
+  "N",
+  "O",
+  "P",
+  "Q",
+  "R",
+  "S",
+  "T",
+  "U",
+  "V",
+  "W",
+  "X",
+  "Y",
+  "Z",
+  "bracketleft",
+  "backslash",
+  "bracketright",
+  "asciicircum",
+  "underscore",
+  "quoteleft",
+  "a",
+  "b",
+  "c",
+  "d",
+  "e",
+  "f",
+  "g",
+  "h",
+  "i",
+  "j",
+  "k",
+  "l",
+  "m",
+  "n",
+  "o",
+  "p",
+  "q",
+  "r",
+  "s",
+  "t",
+  "u",
+  "v",
+  "w",
+  "x",
+  "y",
+  "z",
+  "braceleft",
+  "bar",
+  "braceright",
+  "asciitilde",
+  "exclamdown",
+  "cent",
+  "sterling",
+  "fraction",
+  "yen",
+  "florin",
+  "section",
+  "currency",
+  "quotesingle",
+  "quotedblleft",
+  "guillemotleft",
+  "guilsinglleft",
+  "guilsinglright",
+  "fi",
+  "fl",
+  "endash",
+  "dagger",
+  "daggerdbl",
+  "periodcentered",
+  "paragraph",
+  "bullet",
+  "quotesinglbase",
+  "quotedblbase",
+  "quotedblright",
+  "guillemotright",
+  "ellipsis",
+  "perthousand",
+  "questiondown",
+  "grave",
+  "acute",
+  "circumflex",
+  "tilde",
+  "macron",
+  "breve",
+  "dotaccent",
+  "dieresis",
+  "ring",
+  "cedilla",
+  "hungarumlaut",
+  "ogonek",
+  "caron",
+  "emdash",
+  "AE",
+  "ordfeminine",
+  "Lslash",
+  "Oslash",
+  "OE",
+  "ordmasculine",
+  "ae",
+  "dotlessi",
+  "lslash",
+  "oslash",
+  "oe",
+  "germandbls",
+  "onesuperior",
+  "logicalnot",
+  "mu",
+  "trademark",
+  "Eth",
+  "onehalf",
+  "plusminus",
+  "Thorn",
+  "onequarter",
+  "divide",
+  "brokenbar",
+  "degree",
+  "thorn",
+  "threequarters",
+  "twosuperior",
+  "registered",
+  "minus",
+  "eth",
+  "multiply",
+  "threesuperior",
+  "copyright",
+  "Aacute",
+  "Acircumflex",
+  "Adieresis",
+  "Agrave",
+  "Aring",
+  "Atilde",
+  "Ccedilla",
+  "Eacute",
+  "Ecircumflex",
+  "Edieresis",
+  "Egrave",
+  "Iacute",
+  "Icircumflex",
+  "Idieresis",
+  "Igrave",
+  "Ntilde",
+  "Oacute",
+  "Ocircumflex",
+  "Odieresis",
+  "Ograve",
+  "Otilde",
+  "Scaron",
+  "Uacute",
+  "Ucircumflex",
+  "Udieresis",
+  "Ugrave",
+  "Yacute",
+  "Ydieresis",
+  "Zcaron",
+  "aacute",
+  "acircumflex",
+  "adieresis",
+  "agrave",
+  "aring",
+  "atilde",
+  "ccedilla",
+  "eacute",
+  "ecircumflex",
+  "edieresis",
+  "egrave",
+  "iacute",
+  "icircumflex",
+  "idieresis",
+  "igrave",
+  "ntilde",
+  "oacute",
+  "ocircumflex",
+  "odieresis",
+  "ograve",
+  "otilde",
+  "scaron",
+  "uacute",
+  "ucircumflex",
+  "udieresis",
+  "ugrave",
+  "yacute",
+  "ydieresis",
+  "zcaron",
+  "exclamsmall",
+  "Hungarumlautsmall",
+  "dollaroldstyle",
+  "dollarsuperior",
+  "ampersandsmall",
+  "Acutesmall",
+  "parenleftsuperior",
+  "parenrightsuperior",
+  "twodotenleader",
+  "onedotenleader",
+  "zerooldstyle",
+  "oneoldstyle",
+  "twooldstyle",
+  "threeoldstyle",
+  "fouroldstyle",
+  "fiveoldstyle",
+  "sixoldstyle",
+  "sevenoldstyle",
+  "eightoldstyle",
+  "nineoldstyle",
+  "commasuperior",
+  "threequartersemdash",
+  "periodsuperior",
+  "questionsmall",
+  "asuperior",
+  "bsuperior",
+  "centsuperior",
+  "dsuperior",
+  "esuperior",
+  "isuperior",
+  "lsuperior",
+  "msuperior",
+  "nsuperior",
+  "osuperior",
+  "rsuperior",
+  "ssuperior",
+  "tsuperior",
+  "ff",
+  "ffi",
+  "ffl",
+  "parenleftinferior",
+  "parenrightinferior",
+  "Circumflexsmall",
+  "hyphensuperior",
+  "Gravesmall",
+  "Asmall",
+  "Bsmall",
+  "Csmall",
+  "Dsmall",
+  "Esmall",
+  "Fsmall",
+  "Gsmall",
+  "Hsmall",
+  "Ismall",
+  "Jsmall",
+  "Ksmall",
+  "Lsmall",
+  "Msmall",
+  "Nsmall",
+  "Osmall",
+  "Psmall",
+  "Qsmall",
+  "Rsmall",
+  "Ssmall",
+  "Tsmall",
+  "Usmall",
+  "Vsmall",
+  "Wsmall",
+  "Xsmall",
+  "Ysmall",
+  "Zsmall",
+  "colonmonetary",
+  "onefitted",
+  "rupiah",
+  "Tildesmall",
+  "exclamdownsmall",
+  "centoldstyle",
+  "Lslashsmall",
+  "Scaronsmall",
+  "Zcaronsmall",
+  "Dieresissmall",
+  "Brevesmall",
+  "Caronsmall",
+  "Dotaccentsmall",
+  "Macronsmall",
+  "figuredash",
+  "hypheninferior",
+  "Ogoneksmall",
+  "Ringsmall",
+  "Cedillasmall",
+  "questiondownsmall",
+  "oneeighth",
+  "threeeighths",
+  "fiveeighths",
+  "seveneighths",
+  "onethird",
+  "twothirds",
+  "zerosuperior",
+  "foursuperior",
+  "fivesuperior",
+  "sixsuperior",
+  "sevensuperior",
+  "eightsuperior",
+  "ninesuperior",
+  "zeroinferior",
+  "oneinferior",
+  "twoinferior",
+  "threeinferior",
+  "fourinferior",
+  "fiveinferior",
+  "sixinferior",
+  "seveninferior",
+  "eightinferior",
+  "nineinferior",
+  "centinferior",
+  "dollarinferior",
+  "periodinferior",
+  "commainferior",
+  "Agravesmall",
+  "Aacutesmall",
+  "Acircumflexsmall",
+  "Atildesmall",
+  "Adieresissmall",
+  "Aringsmall",
+  "AEsmall",
+  "Ccedillasmall",
+  "Egravesmall",
+  "Eacutesmall",
+  "Ecircumflexsmall",
+  "Edieresissmall",
+  "Igravesmall",
+  "Iacutesmall",
+  "Icircumflexsmall",
+  "Idieresissmall",
+  "Ethsmall",
+  "Ntildesmall",
+  "Ogravesmall",
+  "Oacutesmall",
+  "Ocircumflexsmall",
+  "Otildesmall",
+  "Odieresissmall",
+  "OEsmall",
+  "Oslashsmall",
+  "Ugravesmall",
+  "Uacutesmall",
+  "Ucircumflexsmall",
+  "Udieresissmall",
+  "Yacutesmall",
+  "Thornsmall",
+  "Ydieresissmall",
+  "001.000",
+  "001.001",
+  "001.002",
+  "001.003",
+  "Black",
+  "Bold",
+  "Book",
+  "Light",
+  "Medium",
+  "Regular",
+  "Roman",
+  "Semibold"
+};
+
+static Gushort type1CISOAdobeCharset[229] = {
+    0,   1,   2,   3,   4,   5,   6,   7,   8,   9,
+   10,  11,  12,  13,  14,  15,  16,  17,  18,  19,
+   20,  21,  22,  23,  24,  25,  26,  27,  28,  29,
+   30,  31,  32,  33,  34,  35,  36,  37,  38,  39,
+   40,  41,  42,  43,  44,  45,  46,  47,  48,  49,
+   50,  51,  52,  53,  54,  55,  56,  57,  58,  59,
+   60,  61,  62,  63,  64,  65,  66,  67,  68,  69,
+   70,  71,  72,  73,  74,  75,  76,  77,  78,  79,
+   80,  81,  82,  83,  84,  85,  86,  87,  88,  89,
+   90,  91,  92,  93,  94,  95,  96,  97,  98,  99,
+  100, 101, 102, 103, 104, 105, 106, 107, 108, 109,
+  110, 111, 112, 113, 114, 115, 116, 117, 118, 119,
+  120, 121, 122, 123, 124, 125, 126, 127, 128, 129,
+  130, 131, 132, 133, 134, 135, 136, 137, 138, 139,
+  140, 141, 142, 143, 144, 145, 146, 147, 148, 149,
+  150, 151, 152, 153, 154, 155, 156, 157, 158, 159,
+  160, 161, 162, 163, 164, 165, 166, 167, 168, 169,
+  170, 171, 172, 173, 174, 175, 176, 177, 178, 179,
+  180, 181, 182, 183, 184, 185, 186, 187, 188, 189,
+  190, 191, 192, 193, 194, 195, 196, 197, 198, 199,
+  200, 201, 202, 203, 204, 205, 206, 207, 208, 209,
+  210, 211, 212, 213, 214, 215, 216, 217, 218, 219,
+  220, 221, 222, 223, 224, 225, 226, 227, 228
+};
+
+static const Gushort type1CExpertCharset[166] = {
+    0,   1, 229, 230, 231, 232, 233, 234, 235, 236,
+  237, 238,  13,  14,  15,  99, 239, 240, 241, 242,
+  243, 244, 245, 246, 247, 248,  27,  28, 249, 250,
+  251, 252, 253, 254, 255, 256, 257, 258, 259, 260,
+  261, 262, 263, 264, 265, 266, 109, 110, 267, 268,
+  269, 270, 271, 272, 273, 274, 275, 276, 277, 278,
+  279, 280, 281, 282, 283, 284, 285, 286, 287, 288,
+  289, 290, 291, 292, 293, 294, 295, 296, 297, 298,
+  299, 300, 301, 302, 303, 304, 305, 306, 307, 308,
+  309, 310, 311, 312, 313, 314, 315, 316, 317, 318,
+  158, 155, 163, 319, 320, 321, 322, 323, 324, 325,
+  326, 150, 164, 169, 327, 328, 329, 330, 331, 332,
+  333, 334, 335, 336, 337, 338, 339, 340, 341, 342,
+  343, 344, 345, 346, 347, 348, 349, 350, 351, 352,
+  353, 354, 355, 356, 357, 358, 359, 360, 361, 362,
+  363, 364, 365, 366, 367, 368, 369, 370, 371, 372,
+  373, 374, 375, 376, 377, 378
+};
+
+static Gushort type1CExpertSubsetCharset[87] = {
+    0,   1, 231, 232, 235, 236, 237, 238,  13,  14,
+   15,  99, 239, 240, 241, 242, 243, 244, 245, 246,
+  247, 248,  27,  28, 249, 250, 251, 253, 254, 255,
+  256, 257, 258, 259, 260, 261, 262, 263, 264, 265,
+  266, 109, 110, 267, 268, 269, 270, 272, 300, 301,
+  302, 305, 314, 315, 158, 155, 163, 320, 321, 322,
+  323, 324, 325, 326, 150, 164, 169, 327, 328, 329,
+  330, 331, 332, 333, 334, 335, 336, 337, 338, 339,
+  340, 341, 342, 343, 344, 345, 346
+};
+
+#endif
diff --git a/poppler/CurlCachedFile.cc b/poppler/CurlCachedFile.cc
new file mode 100644 (file)
index 0000000..af4c2b6
--- /dev/null
@@ -0,0 +1,99 @@
+//========================================================================
+//
+// CurlCachedFile.cc
+//
+// This file is licensed under the GPLv2 or later
+//
+// Copyright 2009 Stefan Thomas <thomas@eload24.com>
+// Copyright 2010, 2011 Hib Eris <hib@hiberis.nl>
+// Copyright 2010 Albert Astals Cid <aacid@kde.org>
+//
+//========================================================================
+
+#include <config.h>
+
+#include "CurlCachedFile.h"
+
+#include "goo/GooString.h"
+
+//------------------------------------------------------------------------
+
+CurlCachedFileLoader::CurlCachedFileLoader()
+{
+  url = NULL;
+  cachedFile = NULL;
+  curl = NULL;
+}
+
+CurlCachedFileLoader::~CurlCachedFileLoader() {
+  curl_easy_cleanup(curl);
+}
+
+static size_t
+noop_cb(char *ptr, size_t size, size_t nmemb, void *ptr2)
+{
+  return size*nmemb;
+}
+
+size_t
+CurlCachedFileLoader::init(GooString *urlA, CachedFile *cachedFileA)
+{
+  double contentLength = -1;
+  long code = 0;
+  size_t size;
+
+  url = urlA;
+  cachedFile = cachedFileA;
+  curl = curl_easy_init();
+
+  curl_easy_setopt(curl, CURLOPT_URL, url->getCString());
+  curl_easy_setopt(curl, CURLOPT_HEADER, 1);
+  curl_easy_setopt(curl, CURLOPT_NOBODY, 1);
+  curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, &noop_cb);
+  curl_easy_perform(curl);
+  curl_easy_getinfo(curl, CURLINFO_RESPONSE_CODE, &code);
+  if (code) {
+     curl_easy_getinfo(curl, CURLINFO_CONTENT_LENGTH_DOWNLOAD, &contentLength);
+     size = contentLength;
+  } else {
+     error(errInternal, -1, "Failed to get size of '{0:t}'.", url);
+     size = -1;
+  }
+  curl_easy_reset(curl);
+
+  return size;
+}
+
+static
+size_t load_cb(const char *ptr, size_t size, size_t nmemb, void *data)
+{
+  CachedFileWriter *writer = (CachedFileWriter *) data;
+  return (writer->write) (ptr, size*nmemb);
+}
+
+int CurlCachedFileLoader::load(const std::vector<ByteRange> &ranges, CachedFileWriter *writer)
+{
+  CURLcode r = CURLE_OK;
+  size_t fromByte, toByte;
+  for (size_t i = 0; i < ranges.size(); i++) {
+
+     fromByte = ranges[i].offset;
+     toByte = fromByte + ranges[i].length - 1;
+     GooString *range = GooString::format("{0:ud}-{1:ud}", fromByte, toByte);
+
+     curl_easy_setopt(curl, CURLOPT_URL, url->getCString());
+     curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, load_cb);
+     curl_easy_setopt(curl, CURLOPT_WRITEDATA, writer);
+     curl_easy_setopt(curl, CURLOPT_RANGE, range->getCString());
+     r = curl_easy_perform(curl);
+     curl_easy_reset(curl);
+
+     delete range;
+
+     if (r != CURLE_OK) break;
+  }
+  return r;
+}
+
+//------------------------------------------------------------------------
+
diff --git a/poppler/CurlCachedFile.h b/poppler/CurlCachedFile.h
new file mode 100644 (file)
index 0000000..49882ab
--- /dev/null
@@ -0,0 +1,40 @@
+//========================================================================
+//
+// CurlCachedFile.h
+//
+// This file is licensed under the GPLv2 or later
+//
+// Copyright 2010 Hib Eris <hib@hiberis.nl>
+// Copyright 2010 Albert Astals Cid <aacid@kde.org>
+//
+//========================================================================
+
+#ifndef CURLCACHELOADER_H
+#define CURLCACHELOADER_H
+
+#include "poppler-config.h"
+#include "CachedFile.h"
+
+#include <curl/curl.h>
+
+//------------------------------------------------------------------------
+
+class CurlCachedFileLoader : public CachedFileLoader {
+
+public:
+
+  CurlCachedFileLoader();
+  ~CurlCachedFileLoader();
+  size_t init(GooString *url, CachedFile* cachedFile);
+  int load(const std::vector<ByteRange> &ranges, CachedFileWriter *writer);
+
+private:
+
+  GooString *url;
+  CachedFile *cachedFile;
+  CURL *curl;
+
+};
+
+#endif
+
diff --git a/poppler/CurlPDFDocBuilder.cc b/poppler/CurlPDFDocBuilder.cc
new file mode 100644 (file)
index 0000000..5b02b14
--- /dev/null
@@ -0,0 +1,47 @@
+//========================================================================
+//
+// CurlPDFDocBuilder.cc
+//
+// This file is licensed under the GPLv2 or later
+//
+// Copyright 2010 Hib Eris <hib@hiberis.nl>
+// Copyright 2010 Albert Astals Cid <aacid@kde.org>
+//
+//========================================================================
+
+#include <config.h>
+
+#include "CurlPDFDocBuilder.h"
+
+#include "CachedFile.h"
+#include "CurlCachedFile.h"
+
+//------------------------------------------------------------------------
+// CurlPDFDocBuilder
+//------------------------------------------------------------------------
+
+PDFDoc *
+CurlPDFDocBuilder::buildPDFDoc(const GooString &uri,
+        GooString *ownerPassword, GooString *userPassword, void *guiDataA)
+{
+    Object obj;
+
+    CachedFile *cachedFile = new CachedFile(
+        new CurlCachedFileLoader(), uri.copy());
+
+    obj.initNull();
+    BaseStream *str = new CachedFileStream(
+         cachedFile, 0, gFalse, cachedFile->getLength(), &obj);
+
+    return new PDFDoc(str, ownerPassword, userPassword, guiDataA);
+}
+
+GBool CurlPDFDocBuilder::supports(const GooString &uri)
+{
+  if (uri.cmpN("http://", 7) == 0 || uri.cmpN("https://", 8) == 0) {
+    return gTrue;
+  } else {
+    return gFalse;
+  }
+}
+
diff --git a/poppler/CurlPDFDocBuilder.h b/poppler/CurlPDFDocBuilder.h
new file mode 100644 (file)
index 0000000..fb34862
--- /dev/null
@@ -0,0 +1,33 @@
+//========================================================================
+//
+// CurlPDFDocBuilder.h
+//
+// This file is licensed under the GPLv2 or later
+//
+// Copyright 2010 Hib Eris <hib@hiberis.nl>
+// Copyright 2010 Albert Astals Cid <aacid@kde.org>
+//
+//========================================================================
+
+#ifndef CURLPDFDOCBUILDER_H
+#define CURLPDFDOCBUILDER_H
+
+#include "PDFDocBuilder.h"
+
+//------------------------------------------------------------------------
+// CurlPDFDocBuilder
+//
+// The CurlPDFDocBuilder implements a PDFDocBuilder for 'http(s)://'.
+//------------------------------------------------------------------------
+
+class CurlPDFDocBuilder : public PDFDocBuilder {
+
+public:
+
+  PDFDoc *buildPDFDoc(const GooString &uri, GooString *ownerPassword = NULL,
+    GooString *userPassword = NULL, void *guiDataA = NULL);
+  GBool supports(const GooString &uri);
+
+};
+
+#endif /* CURLPDFDOCBUILDER_H */
diff --git a/poppler/DCTStream.cc b/poppler/DCTStream.cc
new file mode 100644 (file)
index 0000000..6302c8b
--- /dev/null
@@ -0,0 +1,247 @@
+//========================================================================
+//
+// DCTStream.cc
+//
+// This file is licensed under the GPLv2 or later
+//
+// Copyright 2005 Jeff Muizelaar <jeff@infidigm.net>
+// Copyright 2005-2010, 2012 Albert Astals Cid <aacid@kde.org>
+// Copyright 2009 Ryszard Trojnacki <rysiek@menel.com>
+// Copyright 2010 Carlos Garcia Campos <carlosgc@gnome.org>
+// Copyright 2011 Daiki Ueno <ueno@unixuser.org>
+// Copyright 2011 Tomas Hoger <thoger@redhat.com>
+// Copyright 2012 Thomas Freitag <Thomas.Freitag@alfa.de>
+//
+//========================================================================
+
+#include "DCTStream.h"
+
+static void str_init_source(j_decompress_ptr cinfo)
+{
+}
+
+static boolean str_fill_input_buffer(j_decompress_ptr cinfo)
+{
+  int c;
+  struct str_src_mgr * src = (struct str_src_mgr *)cinfo->src;
+  if (src->index == 0) {
+    c = 0xFF;
+    src->index++;
+  }
+  else if (src->index == 1) {
+    c = 0xD8;
+    src->index++;
+  }
+  else c = src->str->getChar();
+  if (c != EOF)
+  {
+    src->buffer = c;
+    src->pub.next_input_byte = &src->buffer;
+    src->pub.bytes_in_buffer = 1;
+    return TRUE;
+  }
+  else return FALSE;
+}
+
+static void str_skip_input_data(j_decompress_ptr cinfo, long num_bytes)
+{
+  struct str_src_mgr * src = (struct str_src_mgr *)cinfo->src;
+  if (num_bytes > 0) {
+    while (num_bytes > (long) src->pub.bytes_in_buffer) {
+      num_bytes -= (long) src->pub.bytes_in_buffer;
+      str_fill_input_buffer(cinfo);
+    }
+    src->pub.next_input_byte += (size_t) num_bytes;
+    src->pub.bytes_in_buffer -= (size_t) num_bytes;
+  }
+}
+
+static void str_term_source(j_decompress_ptr cinfo)
+{
+}
+
+DCTStream::DCTStream(Stream *strA, int colorXformA) :
+  FilterStream(strA) {
+  colorXform = colorXformA;
+  init();
+}
+
+DCTStream::~DCTStream() {
+  jpeg_destroy_decompress(&cinfo);
+  delete str;
+}
+
+static void exitErrorHandler(jpeg_common_struct *error) {
+  j_decompress_ptr cinfo = (j_decompress_ptr)error;
+  str_error_mgr * err = (struct str_error_mgr *)cinfo->err;
+  longjmp(err->setjmp_buffer, 1);
+}
+
+void DCTStream::init()
+{
+  jpeg_std_error(&err.pub);
+  err.pub.error_exit = &exitErrorHandler;
+  src.pub.init_source = str_init_source;
+  src.pub.fill_input_buffer = str_fill_input_buffer;
+  src.pub.skip_input_data = str_skip_input_data;
+  src.pub.resync_to_restart = jpeg_resync_to_restart;
+  src.pub.term_source = str_term_source;
+  src.pub.bytes_in_buffer = 0;
+  src.pub.next_input_byte = NULL;
+  src.str = str;
+  src.index = 0;
+  current = NULL;
+  limit = NULL;
+  
+  cinfo.err = &err.pub;
+  if (!setjmp(err.setjmp_buffer)) {
+    jpeg_create_decompress(&cinfo);
+    cinfo.src = (jpeg_source_mgr *)&src;
+  }
+  row_buffer = NULL;
+}
+
+void DCTStream::reset() {
+  int row_stride;
+
+  str->reset();
+
+  if (row_buffer)
+  {
+    jpeg_destroy_decompress(&cinfo);
+    init();
+  }
+
+  // JPEG data has to start with 0xFF 0xD8
+  // but some pdf like the one on 
+  // https://bugs.freedesktop.org/show_bug.cgi?id=3299
+  // does have some garbage before that this seeks for
+  // the start marker...
+  bool startFound = false;
+  int c = 0, c2 = 0;
+  while (!startFound)
+  {
+    if (!c)
+    {
+      c = str->getChar();
+      if (c == -1)
+      {
+        error(errSyntaxError, -1, "Could not find start of jpeg data");
+        return;
+      }
+      if (c != 0xFF) c = 0;
+    }
+    else
+    {
+      c2 = str->getChar();
+      if (c2 != 0xD8)
+      {
+        c = 0;
+        c2 = 0;
+      }
+      else startFound = true;
+    }
+  }
+
+  if (!setjmp(err.setjmp_buffer) && jpeg_read_header(&cinfo, TRUE) != JPEG_SUSPENDED)
+  {
+    // figure out color transform
+    if (colorXform == -1 && !cinfo.saw_Adobe_marker) {
+      if (cinfo.num_components == 3) {
+        if (cinfo.saw_JFIF_marker) {
+         colorXform = 1;
+        } else if (cinfo.cur_comp_info[0]->component_id == 82 &&
+                  cinfo.cur_comp_info[1]->component_id == 71 &&
+                  cinfo.cur_comp_info[2]->component_id == 66) { // ASCII "RGB"
+         colorXform = 0;
+       } else {
+         colorXform = 1;
+       }
+      } else {
+        colorXform = 0;
+      }
+    } else if (cinfo.saw_Adobe_marker) {
+      colorXform = cinfo.Adobe_transform;
+    }
+
+    switch (cinfo.num_components) {
+    case 3:
+           cinfo.jpeg_color_space = colorXform ? JCS_YCbCr : JCS_RGB;
+           break;
+    case 4:
+           cinfo.jpeg_color_space = colorXform ? JCS_YCCK : JCS_CMYK;
+           break;
+    }
+
+    jpeg_start_decompress(&cinfo);
+
+    row_stride = cinfo.output_width * cinfo.output_components;
+    row_buffer = cinfo.mem->alloc_sarray((j_common_ptr) &cinfo, JPOOL_IMAGE, row_stride, 1);
+  }
+}
+
+// we can not go with inline since gcc
+// refuses to inline because of setjmp
+#define DO_GET_CHAR \
+  if (current == limit) { \
+    if (cinfo.output_scanline < cinfo.output_height) \
+    { \
+      if (!setjmp(err.setjmp_buffer)) \
+      { \
+        if (!jpeg_read_scanlines(&cinfo, row_buffer, 1)) c = EOF; \
+        else { \
+          current = &row_buffer[0][0]; \
+          limit = &row_buffer[0][(cinfo.output_width - 1) * cinfo.output_components] + cinfo.output_components; \
+          c = *current; \
+          ++current; \
+        } \
+      } \
+      else c = EOF; \
+    } \
+    else c = EOF; \
+  } else { \
+    c = *current; \
+    ++current; \
+  } \
+
+int DCTStream::getChar() {
+  int c;
+
+  DO_GET_CHAR
+  
+  return c;
+}
+
+int DCTStream::getChars(int nChars, Guchar *buffer) {
+  int c;
+  for (int i = 0; i < nChars; ++i) {
+    DO_GET_CHAR
+    if (likely(c != EOF)) buffer[i] = c;
+    else return i;
+  }
+  return nChars;
+}
+
+int DCTStream::lookChar() {
+  if (unlikely(current == NULL)) {
+    return EOF;
+  }
+  return *current;
+}
+
+GooString *DCTStream::getPSFilter(int psLevel, const char *indent) {
+  GooString *s;
+
+  if (psLevel < 2) {
+    return NULL;
+  }
+  if (!(s = str->getPSFilter(psLevel, indent))) {
+    return NULL;
+  }
+  s->append(indent)->append("<< >> /DCTDecode filter\n");
+  return s;
+}
+
+GBool DCTStream::isBinary(GBool last) {
+  return str->isBinary(gTrue);
+}
diff --git a/poppler/DCTStream.h b/poppler/DCTStream.h
new file mode 100644 (file)
index 0000000..55bd985
--- /dev/null
@@ -0,0 +1,87 @@
+//========================================================================
+//
+// DCTStream.h
+//
+// This file is licensed under the GPLv2 or later
+//
+// Copyright 2005 Jeff Muizelaar <jeff@infidigm.net>
+// Copyright 2005 Martin Kretzschmar <martink@gnome.org>
+// Copyright 2005-2007, 2009-2011 Albert Astals Cid <aacid@kde.org>
+// Copyright 2010 Carlos Garcia Campos <carlosgc@gnome.org>
+// Copyright 2011 Daiki Ueno <ueno@unixuser.org>
+//
+//========================================================================
+
+#ifndef DCTSTREAM_H
+#define DCTSTREAM_H
+
+#ifdef USE_GCC_PRAGMAS
+#pragma interface
+#endif
+
+
+#ifdef USE_GCC_PRAGMAS
+#pragma implementation
+#endif
+
+#include "poppler-config.h"
+#include <stdio.h>
+#include <stdlib.h>
+#include <stddef.h>
+#include <setjmp.h>
+#ifdef HAVE_UNISTD_H
+#include <unistd.h>
+#endif
+#include <string.h>
+#include <ctype.h>
+#include "goo/gmem.h"
+#include "goo/gfile.h"
+#include "Error.h"
+#include "Object.h"
+#include "Decrypt.h"
+#include "Stream.h"
+
+extern "C" {
+#include <jpeglib.h>
+}
+
+struct str_src_mgr {
+    struct jpeg_source_mgr pub;
+    JOCTET buffer;
+    Stream *str;
+    int index;
+};
+
+struct str_error_mgr {
+  struct jpeg_error_mgr pub;
+  jmp_buf setjmp_buffer;
+};
+
+class DCTStream: public FilterStream {
+public:
+
+  DCTStream(Stream *strA, int colorXformA);
+  virtual ~DCTStream();
+  virtual StreamKind getKind() { return strDCT; }
+  virtual void reset();
+  virtual int getChar();
+  virtual int lookChar();
+  virtual GooString *getPSFilter(int psLevel, const char *indent);
+  virtual GBool isBinary(GBool last = gTrue);
+
+private:
+  void init();
+
+  virtual GBool hasGetChars() { return true; }
+  virtual int getChars(int nChars, Guchar *buffer);
+
+  int colorXform;
+  JSAMPLE *current;
+  JSAMPLE *limit;
+  struct jpeg_decompress_struct cinfo;
+  struct str_error_mgr err;
+  struct str_src_mgr src;
+  JSAMPARRAY row_buffer;
+};
+
+#endif 
diff --git a/poppler/DateInfo.cc b/poppler/DateInfo.cc
new file mode 100644 (file)
index 0000000..563204a
--- /dev/null
@@ -0,0 +1,118 @@
+//========================================================================
+//
+// DateInfo.cc
+//
+// Copyright (C) 2008 Albert Astals Cid <aacid@kde.org>
+// Copyright (C) 2009 Carlos Garcia Campos <carlosgc@gnome.org>
+//
+// To see a description of the changes please see the Changelog file that
+// came with your tarball or type make ChangeLog if you are building from git
+//
+//========================================================================
+
+//========================================================================
+//
+// Based on code from pdfinfo.cc
+//
+// Copyright 1998-2003 Glyph & Cog, LLC
+//
+//========================================================================
+
+#include <config.h>
+
+#include "DateInfo.h"
+
+#include <stdio.h>
+#include <string.h>
+
+/* See PDF Reference 1.3, Section 3.8.2 for PDF Date representation */
+GBool parseDateString(const char *dateString, int *year, int *month, int *day, int *hour, int *minute, int *second, char *tz, int *tzHour, int *tzMinute)
+{
+    if ( dateString == NULL ) return gFalse;
+    if ( strlen(dateString) < 2 ) return gFalse;
+
+    if ( dateString[0] == 'D' && dateString[1] == ':' )
+        dateString += 2;
+
+    *month = 1;
+    *day = 1;
+    *hour = 0;
+    *minute = 0;
+    *second = 0;
+    *tz = 0x00;
+    *tzHour = 0;
+    *tzMinute = 0;
+
+    if ( sscanf( dateString,
+                 "%4d%2d%2d%2d%2d%2d%c%2d%*c%2d",
+                 year, month, day, hour, minute, second,
+                 tz, tzHour, tzMinute ) > 0 ) {
+        /* Workaround for y2k bug in Distiller 3 stolen from gpdf, hoping that it won't
+        * be used after y2.2k */
+        if ( *year < 1930 && strlen (dateString) > 14)
+        {
+           int century, years_since_1900;
+           if ( sscanf( dateString,
+                        "%2d%3d%2d%2d%2d%2d%2d",
+                        &century, &years_since_1900, month, day, hour, minute, second) == 7 )
+           {
+               *year = century * 100 + years_since_1900;
+           }
+           else
+           {
+               return gFalse;
+           }
+       }
+
+       if (*year <= 0) return gFalse;
+
+       return gTrue;
+   }
+
+   return gFalse;
+}
+
+
+GooString *timeToDateString(time_t *timet) {
+  GooString *dateString;
+  char s[5];
+  struct tm *gt;
+  size_t len;
+  time_t timep = timet ? *timet : time(NULL);
+  
+#ifdef HAVE_GMTIME_R
+  struct tm t;
+  gt = gmtime_r (&timep, &t);
+#else
+  gt = gmtime (&timep);
+#endif
+
+  dateString = new GooString ("D:");
+
+  /* Year YYYY */
+  len = strftime (s, sizeof(s), "%Y", gt);
+  dateString->append (s, len);
+
+  /* Month MM */
+  len = strftime (s, sizeof(s), "%m", gt);
+  dateString->append (s, len);
+
+  /* Day DD */
+  len = strftime (s, sizeof(s), "%d", gt);
+  dateString->append (s, len);
+
+  /* Hour HH */
+  len = strftime (s, sizeof(s), "%H", gt);
+  dateString->append (s, len);
+
+  /* Minute mm */
+  len = strftime (s, sizeof(s), "%M", gt);
+  dateString->append (s, len);
+
+  /* Second SS */
+  len = strftime (s, sizeof(s), "%S", gt);
+  dateString->append (s, len);
+
+  return dateString;
+}
+
diff --git a/poppler/DateInfo.h b/poppler/DateInfo.h
new file mode 100644 (file)
index 0000000..116350f
--- /dev/null
@@ -0,0 +1,35 @@
+//========================================================================
+//
+// DateInfo.h
+//
+// Copyright (C) 2008 Albert Astals Cid <aacid@kde.org>
+// Copyright (C) 2009 Carlos Garcia Campos <carlosgc@gnome.org>
+//
+// To see a description of the changes please see the Changelog file that
+// came with your tarball or type make ChangeLog if you are building from git
+//
+//========================================================================
+
+//========================================================================
+//
+// Based on code from pdfinfo.cc
+//
+// Copyright 1998-2003 Glyph & Cog, LLC
+//
+//========================================================================
+
+#ifndef DATE_INFO_H
+#define DATE_INFO_H
+
+#include "goo/gtypes.h"
+#include "goo/GooString.h"
+#include <time.h>
+
+GBool parseDateString(const char *string, int *year, int *month, int *day, int *hour, int *minute, int *second, char *tz, int *tzHour, int *tzMinute);
+
+/* Converts the time_t into a PDF Date format string.
+ * If timet is NULL, current time is used.
+ */
+GooString *timeToDateString(time_t *timet);
+
+#endif
diff --git a/poppler/Decrypt.cc b/poppler/Decrypt.cc
new file mode 100644 (file)
index 0000000..24af996
--- /dev/null
@@ -0,0 +1,1185 @@
+//========================================================================
+//
+// Decrypt.cc
+//
+// Copyright 1996-2003 Glyph & Cog, LLC
+//
+//========================================================================
+
+//========================================================================
+//
+// Modified under the Poppler project - http://poppler.freedesktop.org
+//
+// All changes made under the Poppler project to this file are licensed
+// under GPL version 2 or later
+//
+// Copyright (C) 2008 Julien Rebetez <julien@fhtagn.net>
+// Copyright (C) 2008, 2010 Albert Astals Cid <aacid@kde.org>
+// Copyright (C) 2009 Matthias Franz <matthias@ktug.or.kr>
+// Copyright (C) 2009 David Benjamin <davidben@mit.edu>
+//
+// To see a description of the changes please see the Changelog file that
+// came with your tarball or type make ChangeLog if you are building from git
+//
+//========================================================================
+
+#include <config.h>
+
+#ifdef USE_GCC_PRAGMAS
+#pragma implementation
+#endif
+
+#include <string.h>
+#include "goo/gmem.h"
+#include "Decrypt.h"
+#include "Error.h"
+
+static void aesKeyExpansion(DecryptAESState *s,
+                           Guchar *objKey, int objKeyLen);
+static void aesDecryptBlock(DecryptAESState *s, Guchar *in, GBool last);
+static void aes256KeyExpansion(DecryptAES256State *s,
+                              Guchar *objKey, int objKeyLen);
+static void aes256DecryptBlock(DecryptAES256State *s, Guchar *in, GBool last);
+static void sha256(Guchar *msg, int msgLen, Guchar *hash);
+
+static const Guchar passwordPad[32] = {
+  0x28, 0xbf, 0x4e, 0x5e, 0x4e, 0x75, 0x8a, 0x41,
+  0x64, 0x00, 0x4e, 0x56, 0xff, 0xfa, 0x01, 0x08, 
+  0x2e, 0x2e, 0x00, 0xb6, 0xd0, 0x68, 0x3e, 0x80, 
+  0x2f, 0x0c, 0xa9, 0xfe, 0x64, 0x53, 0x69, 0x7a
+};
+
+//------------------------------------------------------------------------
+// Decrypt
+//------------------------------------------------------------------------
+
+GBool Decrypt::makeFileKey(int encVersion, int encRevision, int keyLength,
+                          GooString *ownerKey, GooString *userKey,
+                          GooString *ownerEnc, GooString *userEnc,
+                          int permissions, GooString *fileID,
+                          GooString *ownerPassword, GooString *userPassword,
+                          Guchar *fileKey, GBool encryptMetadata,
+                          GBool *ownerPasswordOk) {
+  DecryptAES256State state;
+  Guchar test[127 + 56], test2[32];
+  GooString *userPassword2;
+  Guchar fState[256];
+  Guchar tmpKey[16];
+  Guchar fx, fy;
+  int len, i, j;
+
+  *ownerPasswordOk = gFalse;
+
+  if (encRevision == 5) {
+
+    // check the owner password
+    if (ownerPassword) {
+      //~ this is supposed to convert the password to UTF-8 using "SASLprep"
+      len = ownerPassword->getLength();
+      if (len > 127) {
+       len = 127;
+      }
+      memcpy(test, ownerPassword->getCString(), len);
+      memcpy(test + len, ownerKey->getCString() + 32, 8);
+      memcpy(test + len + 8, userKey->getCString(), 48);
+      sha256(test, len + 56, test);
+      if (!memcmp(test, ownerKey->getCString(), 32)) {
+
+       // compute the file key from the owner password
+       memcpy(test, ownerPassword->getCString(), len);
+       memcpy(test + len, ownerKey->getCString() + 40, 8);
+       memcpy(test + len + 8, userKey->getCString(), 48);
+       sha256(test, len + 56, test);
+       aes256KeyExpansion(&state, test, 32);
+       for (i = 0; i < 16; ++i) {
+         state.cbc[i] = 0;
+       }
+       aes256DecryptBlock(&state, (Guchar *)ownerEnc->getCString(), gFalse);
+       memcpy(fileKey, state.buf, 16);
+       aes256DecryptBlock(&state, (Guchar *)ownerEnc->getCString() + 16,
+                          gFalse);
+       memcpy(fileKey + 16, state.buf, 16);
+
+       *ownerPasswordOk = gTrue;
+       return gTrue;
+      }
+    }
+
+    // check the user password
+    if (userPassword) {
+      //~ this is supposed to convert the password to UTF-8 using "SASLprep"
+      len = userPassword->getLength();
+      if (len > 127) {
+       len = 127;
+      }
+      memcpy(test, userPassword->getCString(), len);
+      memcpy(test + len, userKey->getCString() + 32, 8);
+      sha256(test, len + 8, test);
+      if (!memcmp(test, userKey->getCString(), 32)) {
+
+       // compute the file key from the user password
+       memcpy(test, userPassword->getCString(), len);
+       memcpy(test + len, userKey->getCString() + 40, 8);
+       sha256(test, len + 8, test);
+       aes256KeyExpansion(&state, test, 32);
+       for (i = 0; i < 16; ++i) {
+         state.cbc[i] = 0;
+       }
+       aes256DecryptBlock(&state, (Guchar *)userEnc->getCString(), gFalse);
+       memcpy(fileKey, state.buf, 16);
+       aes256DecryptBlock(&state, (Guchar *)userEnc->getCString() + 16,
+                          gFalse);
+       memcpy(fileKey + 16, state.buf, 16);
+
+       return gTrue; 
+      }
+    }
+
+    return gFalse;
+  } else {
+
+    // try using the supplied owner password to generate the user password
+    if (ownerPassword) {
+      len = ownerPassword->getLength();
+      if (len < 32) {
+       memcpy(test, ownerPassword->getCString(), len);
+       memcpy(test + len, passwordPad, 32 - len);
+      } else {
+       memcpy(test, ownerPassword->getCString(), 32);
+      }
+      md5(test, 32, test);
+      if (encRevision == 3) {
+       for (i = 0; i < 50; ++i) {
+         md5(test, keyLength, test);
+       }
+      }
+      if (encRevision == 2) {
+       rc4InitKey(test, keyLength, fState);
+       fx = fy = 0;
+       for (i = 0; i < 32; ++i) {
+         test2[i] = rc4DecryptByte(fState, &fx, &fy, ownerKey->getChar(i));
+       }
+      } else {
+       memcpy(test2, ownerKey->getCString(), 32);
+       for (i = 19; i >= 0; --i) {
+         for (j = 0; j < keyLength; ++j) {
+           tmpKey[j] = test[j] ^ i;
+         }
+         rc4InitKey(tmpKey, keyLength, fState);
+         fx = fy = 0;
+         for (j = 0; j < 32; ++j) {
+           test2[j] = rc4DecryptByte(fState, &fx, &fy, test2[j]);
+         }
+       }
+      }
+      userPassword2 = new GooString((char *)test2, 32);
+      if (makeFileKey2(encVersion, encRevision, keyLength, ownerKey, userKey,
+                      permissions, fileID, userPassword2, fileKey,
+                      encryptMetadata)) {
+       *ownerPasswordOk = gTrue;
+       delete userPassword2;
+       return gTrue;
+      }
+      delete userPassword2;
+    }
+
+    // try using the supplied user password
+    return makeFileKey2(encVersion, encRevision, keyLength, ownerKey, userKey,
+                       permissions, fileID, userPassword, fileKey,
+                       encryptMetadata);
+  }
+}
+
+GBool Decrypt::makeFileKey2(int encVersion, int encRevision, int keyLength,
+                           GooString *ownerKey, GooString *userKey,
+                           int permissions, GooString *fileID,
+                           GooString *userPassword, Guchar *fileKey,
+                           GBool encryptMetadata) {
+  Guchar *buf;
+  Guchar test[32];
+  Guchar fState[256];
+  Guchar tmpKey[16];
+  Guchar fx, fy;
+  int len, i, j;
+  GBool ok;
+
+  // generate file key
+  buf = (Guchar *)gmalloc(72 + fileID->getLength());
+  if (userPassword) {
+    len = userPassword->getLength();
+    if (len < 32) {
+      memcpy(buf, userPassword->getCString(), len);
+      memcpy(buf + len, passwordPad, 32 - len);
+    } else {
+      memcpy(buf, userPassword->getCString(), 32);
+    }
+  } else {
+    memcpy(buf, passwordPad, 32);
+  }
+  memcpy(buf + 32, ownerKey->getCString(), 32);
+  buf[64] = permissions & 0xff;
+  buf[65] = (permissions >> 8) & 0xff;
+  buf[66] = (permissions >> 16) & 0xff;
+  buf[67] = (permissions >> 24) & 0xff;
+  memcpy(buf + 68, fileID->getCString(), fileID->getLength());
+  len = 68 + fileID->getLength();
+  if (!encryptMetadata) {
+    buf[len++] = 0xff;
+    buf[len++] = 0xff;
+    buf[len++] = 0xff;
+    buf[len++] = 0xff;
+  }
+  md5(buf, len, fileKey);
+  if (encRevision == 3) {
+    for (i = 0; i < 50; ++i) {
+      md5(fileKey, keyLength, fileKey);
+    }
+  }
+
+  // test user password
+  if (encRevision == 2) {
+    rc4InitKey(fileKey, keyLength, fState);
+    fx = fy = 0;
+    for (i = 0; i < 32; ++i) {
+      test[i] = rc4DecryptByte(fState, &fx, &fy, userKey->getChar(i));
+    }
+    ok = memcmp(test, passwordPad, 32) == 0;
+  } else if (encRevision == 3) {
+    memcpy(test, userKey->getCString(), 32);
+    for (i = 19; i >= 0; --i) {
+      for (j = 0; j < keyLength; ++j) {
+       tmpKey[j] = fileKey[j] ^ i;
+      }
+      rc4InitKey(tmpKey, keyLength, fState);
+      fx = fy = 0;
+      for (j = 0; j < 32; ++j) {
+       test[j] = rc4DecryptByte(fState, &fx, &fy, test[j]);
+      }
+    }
+    memcpy(buf, passwordPad, 32);
+    memcpy(buf + 32, fileID->getCString(), fileID->getLength());
+    md5(buf, 32 + fileID->getLength(), buf);
+    ok = memcmp(test, buf, 16) == 0;
+  } else {
+    ok = gFalse;
+  }
+
+  gfree(buf);
+  return ok;
+}
+
+//------------------------------------------------------------------------
+// DecryptStream
+//------------------------------------------------------------------------
+
+DecryptStream::DecryptStream(Stream *strA, Guchar *fileKey,
+                            CryptAlgorithm algoA, int keyLength,
+                            int objNum, int objGen):
+  FilterStream(strA)
+{
+  int i;
+
+  algo = algoA;
+
+  // construct object key
+  for (i = 0; i < keyLength; ++i) {
+    objKey[i] = fileKey[i];
+  }
+  switch (algo) {
+  case cryptRC4:
+    objKey[keyLength] = objNum & 0xff;
+    objKey[keyLength + 1] = (objNum >> 8) & 0xff;
+    objKey[keyLength + 2] = (objNum >> 16) & 0xff;
+    objKey[keyLength + 3] = objGen & 0xff;
+    objKey[keyLength + 4] = (objGen >> 8) & 0xff;
+    md5(objKey, keyLength + 5, objKey);
+    if ((objKeyLength = keyLength + 5) > 16) {
+      objKeyLength = 16;
+    }
+    break;
+  case cryptAES:
+    objKey[keyLength] = objNum & 0xff;
+    objKey[keyLength + 1] = (objNum >> 8) & 0xff;
+    objKey[keyLength + 2] = (objNum >> 16) & 0xff;
+    objKey[keyLength + 3] = objGen & 0xff;
+    objKey[keyLength + 4] = (objGen >> 8) & 0xff;
+    objKey[keyLength + 5] = 0x73; // 's'
+    objKey[keyLength + 6] = 0x41; // 'A'
+    objKey[keyLength + 7] = 0x6c; // 'l'
+    objKey[keyLength + 8] = 0x54; // 'T'
+    md5(objKey, keyLength + 9, objKey);
+    if ((objKeyLength = keyLength + 5) > 16) {
+      objKeyLength = 16;
+    }
+    break;
+  case cryptAES256:
+    objKeyLength = keyLength;
+    break;
+  }
+
+  charactersRead = 0;
+}
+
+DecryptStream::~DecryptStream() {
+  delete str;
+}
+
+void DecryptStream::reset() {
+  int i;
+
+  charactersRead = 0;
+  str->reset();
+  switch (algo) {
+  case cryptRC4:
+    state.rc4.x = state.rc4.y = 0;
+    rc4InitKey(objKey, objKeyLength, state.rc4.state);
+    state.rc4.buf = EOF;
+    break;
+  case cryptAES:
+    aesKeyExpansion(&state.aes, objKey, objKeyLength);
+    for (i = 0; i < 16; ++i) {
+      state.aes.cbc[i] = str->getChar();
+    }
+    state.aes.bufIdx = 16;
+    break;
+  case cryptAES256:
+    aes256KeyExpansion(&state.aes256, objKey, objKeyLength);
+    for (i = 0; i < 16; ++i) {
+      state.aes256.cbc[i] = str->getChar();
+    }
+    state.aes256.bufIdx = 16;
+    break;
+  }
+}
+
+int DecryptStream::getPos() {
+  return charactersRead;
+}
+
+int DecryptStream::getChar() {
+  Guchar in[16];
+  int c, i;
+
+  c = EOF; // make gcc happy
+  switch (algo) {
+  case cryptRC4:
+    if (state.rc4.buf == EOF) {
+      c = str->getChar();
+      if (c != EOF) {
+       state.rc4.buf = rc4DecryptByte(state.rc4.state, &state.rc4.x,
+                                      &state.rc4.y, (Guchar)c);
+      }
+    }
+    c = state.rc4.buf;
+    state.rc4.buf = EOF;
+    break;
+  case cryptAES:
+    if (state.aes.bufIdx == 16) {
+      for (i = 0; i < 16; ++i) {
+       if ((c = str->getChar()) == EOF) {
+         return EOF;
+       }
+       in[i] = (Guchar)c;
+      }
+      aesDecryptBlock(&state.aes, in, str->lookChar() == EOF);
+    }
+    if (state.aes.bufIdx == 16) {
+      c = EOF;
+    } else {
+      c = state.aes.buf[state.aes.bufIdx++];
+    }
+    break;
+  case cryptAES256:
+    if (state.aes256.bufIdx == 16) {
+      for (i = 0; i < 16; ++i) {
+       if ((c = str->getChar()) == EOF) {
+         return EOF;
+       }
+       in[i] = (Guchar)c;
+      }
+      aes256DecryptBlock(&state.aes256, in, str->lookChar() == EOF);
+    }
+    if (state.aes256.bufIdx == 16) {
+      c = EOF;
+    } else {
+      c = state.aes256.buf[state.aes256.bufIdx++];
+    }
+    break;
+  }
+  if (c != EOF)
+    charactersRead++;
+  return c;
+}
+
+int DecryptStream::lookChar() {
+  Guchar in[16];
+  int c, i;
+
+  c = EOF; // make gcc happy
+  switch (algo) {
+  case cryptRC4:
+    if (state.rc4.buf == EOF) {
+      c = str->getChar();
+      if (c != EOF) {
+       state.rc4.buf = rc4DecryptByte(state.rc4.state, &state.rc4.x,
+                                      &state.rc4.y, (Guchar)c);
+      }
+    }
+    c = state.rc4.buf;
+    break;
+  case cryptAES:
+    if (state.aes.bufIdx == 16) {
+      for (i = 0; i < 16; ++i) {
+       if ((c = str->getChar()) == EOF) {
+         return EOF;
+       }
+       in[i] = c;
+      }
+      aesDecryptBlock(&state.aes, in, str->lookChar() == EOF);
+    }
+    if (state.aes.bufIdx == 16) {
+      c = EOF;
+    } else {
+      c = state.aes.buf[state.aes.bufIdx];
+    }
+    break;
+  case cryptAES256:
+    if (state.aes256.bufIdx == 16) {
+      for (i = 0; i < 16; ++i) {
+       if ((c = str->getChar()) == EOF) {
+         return EOF;
+       }
+       in[i] = c;
+      }
+      aes256DecryptBlock(&state.aes256, in, str->lookChar() == EOF);
+    }
+    if (state.aes256.bufIdx == 16) {
+      c = EOF;
+    } else {
+      c = state.aes256.buf[state.aes256.bufIdx];
+    }
+    break;
+  }
+  return c;
+}
+
+GBool DecryptStream::isBinary(GBool last) {
+  return str->isBinary(last);
+}
+
+//------------------------------------------------------------------------
+// RC4-compatible decryption
+//------------------------------------------------------------------------
+
+void rc4InitKey(Guchar *key, int keyLen, Guchar *state) {
+  Guchar index1, index2;
+  Guchar t;
+  int i;
+
+  for (i = 0; i < 256; ++i)
+    state[i] = i;
+
+  if (unlikely(keyLen == 0))
+    return;
+
+  index1 = index2 = 0;
+  for (i = 0; i < 256; ++i) {
+    index2 = (key[index1] + state[i] + index2) % 256;
+    t = state[i];
+    state[i] = state[index2];
+    state[index2] = t;
+    index1 = (index1 + 1) % keyLen;
+  }
+}
+
+Guchar rc4DecryptByte(Guchar *state, Guchar *x, Guchar *y, Guchar c) {
+  Guchar x1, y1, tx, ty;
+
+  x1 = *x = (*x + 1) % 256;
+  y1 = *y = (state[*x] + *y) % 256;
+  tx = state[x1];
+  ty = state[y1];
+  state[x1] = ty;
+  state[y1] = tx;
+  return c ^ state[(tx + ty) % 256];
+}
+
+//------------------------------------------------------------------------
+// AES decryption
+//------------------------------------------------------------------------
+
+static const Guchar sbox[256] = {
+  0x63, 0x7c, 0x77, 0x7b, 0xf2, 0x6b, 0x6f, 0xc5, 0x30, 0x01, 0x67, 0x2b, 0xfe, 0xd7, 0xab, 0x76,
+  0xca, 0x82, 0xc9, 0x7d, 0xfa, 0x59, 0x47, 0xf0, 0xad, 0xd4, 0xa2, 0xaf, 0x9c, 0xa4, 0x72, 0xc0,
+  0xb7, 0xfd, 0x93, 0x26, 0x36, 0x3f, 0xf7, 0xcc, 0x34, 0xa5, 0xe5, 0xf1, 0x71, 0xd8, 0x31, 0x15,
+  0x04, 0xc7, 0x23, 0xc3, 0x18, 0x96, 0x05, 0x9a, 0x07, 0x12, 0x80, 0xe2, 0xeb, 0x27, 0xb2, 0x75,
+  0x09, 0x83, 0x2c, 0x1a, 0x1b, 0x6e, 0x5a, 0xa0, 0x52, 0x3b, 0xd6, 0xb3, 0x29, 0xe3, 0x2f, 0x84,
+  0x53, 0xd1, 0x00, 0xed, 0x20, 0xfc, 0xb1, 0x5b, 0x6a, 0xcb, 0xbe, 0x39, 0x4a, 0x4c, 0x58, 0xcf,
+  0xd0, 0xef, 0xaa, 0xfb, 0x43, 0x4d, 0x33, 0x85, 0x45, 0xf9, 0x02, 0x7f, 0x50, 0x3c, 0x9f, 0xa8,
+  0x51, 0xa3, 0x40, 0x8f, 0x92, 0x9d, 0x38, 0xf5, 0xbc, 0xb6, 0xda, 0x21, 0x10, 0xff, 0xf3, 0xd2,
+  0xcd, 0x0c, 0x13, 0xec, 0x5f, 0x97, 0x44, 0x17, 0xc4, 0xa7, 0x7e, 0x3d, 0x64, 0x5d, 0x19, 0x73,
+  0x60, 0x81, 0x4f, 0xdc, 0x22, 0x2a, 0x90, 0x88, 0x46, 0xee, 0xb8, 0x14, 0xde, 0x5e, 0x0b, 0xdb,
+  0xe0, 0x32, 0x3a, 0x0a, 0x49, 0x06, 0x24, 0x5c, 0xc2, 0xd3, 0xac, 0x62, 0x91, 0x95, 0xe4, 0x79,
+  0xe7, 0xc8, 0x37, 0x6d, 0x8d, 0xd5, 0x4e, 0xa9, 0x6c, 0x56, 0xf4, 0xea, 0x65, 0x7a, 0xae, 0x08,
+  0xba, 0x78, 0x25, 0x2e, 0x1c, 0xa6, 0xb4, 0xc6, 0xe8, 0xdd, 0x74, 0x1f, 0x4b, 0xbd, 0x8b, 0x8a,
+  0x70, 0x3e, 0xb5, 0x66, 0x48, 0x03, 0xf6, 0x0e, 0x61, 0x35, 0x57, 0xb9, 0x86, 0xc1, 0x1d, 0x9e,
+  0xe1, 0xf8, 0x98, 0x11, 0x69, 0xd9, 0x8e, 0x94, 0x9b, 0x1e, 0x87, 0xe9, 0xce, 0x55, 0x28, 0xdf,
+  0x8c, 0xa1, 0x89, 0x0d, 0xbf, 0xe6, 0x42, 0x68, 0x41, 0x99, 0x2d, 0x0f, 0xb0, 0x54, 0xbb, 0x16
+};
+
+static const Guchar invSbox[256] = {
+  0x52, 0x09, 0x6a, 0xd5, 0x30, 0x36, 0xa5, 0x38, 0xbf, 0x40, 0xa3, 0x9e, 0x81, 0xf3, 0xd7, 0xfb,
+  0x7c, 0xe3, 0x39, 0x82, 0x9b, 0x2f, 0xff, 0x87, 0x34, 0x8e, 0x43, 0x44, 0xc4, 0xde, 0xe9, 0xcb,
+  0x54, 0x7b, 0x94, 0x32, 0xa6, 0xc2, 0x23, 0x3d, 0xee, 0x4c, 0x95, 0x0b, 0x42, 0xfa, 0xc3, 0x4e,
+  0x08, 0x2e, 0xa1, 0x66, 0x28, 0xd9, 0x24, 0xb2, 0x76, 0x5b, 0xa2, 0x49, 0x6d, 0x8b, 0xd1, 0x25,
+  0x72, 0xf8, 0xf6, 0x64, 0x86, 0x68, 0x98, 0x16, 0xd4, 0xa4, 0x5c, 0xcc, 0x5d, 0x65, 0xb6, 0x92,
+  0x6c, 0x70, 0x48, 0x50, 0xfd, 0xed, 0xb9, 0xda, 0x5e, 0x15, 0x46, 0x57, 0xa7, 0x8d, 0x9d, 0x84,
+  0x90, 0xd8, 0xab, 0x00, 0x8c, 0xbc, 0xd3, 0x0a, 0xf7, 0xe4, 0x58, 0x05, 0xb8, 0xb3, 0x45, 0x06,
+  0xd0, 0x2c, 0x1e, 0x8f, 0xca, 0x3f, 0x0f, 0x02, 0xc1, 0xaf, 0xbd, 0x03, 0x01, 0x13, 0x8a, 0x6b,
+  0x3a, 0x91, 0x11, 0x41, 0x4f, 0x67, 0xdc, 0xea, 0x97, 0xf2, 0xcf, 0xce, 0xf0, 0xb4, 0xe6, 0x73,
+  0x96, 0xac, 0x74, 0x22, 0xe7, 0xad, 0x35, 0x85, 0xe2, 0xf9, 0x37, 0xe8, 0x1c, 0x75, 0xdf, 0x6e,
+  0x47, 0xf1, 0x1a, 0x71, 0x1d, 0x29, 0xc5, 0x89, 0x6f, 0xb7, 0x62, 0x0e, 0xaa, 0x18, 0xbe, 0x1b,
+  0xfc, 0x56, 0x3e, 0x4b, 0xc6, 0xd2, 0x79, 0x20, 0x9a, 0xdb, 0xc0, 0xfe, 0x78, 0xcd, 0x5a, 0xf4,
+  0x1f, 0xdd, 0xa8, 0x33, 0x88, 0x07, 0xc7, 0x31, 0xb1, 0x12, 0x10, 0x59, 0x27, 0x80, 0xec, 0x5f,
+  0x60, 0x51, 0x7f, 0xa9, 0x19, 0xb5, 0x4a, 0x0d, 0x2d, 0xe5, 0x7a, 0x9f, 0x93, 0xc9, 0x9c, 0xef,
+  0xa0, 0xe0, 0x3b, 0x4d, 0xae, 0x2a, 0xf5, 0xb0, 0xc8, 0xeb, 0xbb, 0x3c, 0x83, 0x53, 0x99, 0x61,
+  0x17, 0x2b, 0x04, 0x7e, 0xba, 0x77, 0xd6, 0x26, 0xe1, 0x69, 0x14, 0x63, 0x55, 0x21, 0x0c, 0x7d
+};
+
+static const Guint rcon[11] = {
+  0x00000000, // unused
+  0x01000000,
+  0x02000000,
+  0x04000000,
+  0x08000000,
+  0x10000000,
+  0x20000000,
+  0x40000000,
+  0x80000000,
+  0x1b000000,
+  0x36000000
+};
+
+static inline Guint subWord(Guint x) {
+  return (sbox[x >> 24] << 24)
+         | (sbox[(x >> 16) & 0xff] << 16)
+         | (sbox[(x >> 8) & 0xff] << 8)
+         | sbox[x & 0xff];
+}
+
+static inline Guint rotWord(Guint x) {
+  return ((x << 8) & 0xffffffff) | (x >> 24);
+}
+
+static inline void invSubBytes(Guchar *state) {
+  int i;
+
+  for (i = 0; i < 16; ++i) {
+    state[i] = invSbox[state[i]];
+  }
+}
+
+static inline void invShiftRows(Guchar *state) {
+  Guchar t;
+
+  t = state[7];
+  state[7] = state[6];
+  state[6] = state[5];
+  state[5] = state[4];
+  state[4] = t;
+
+  t = state[8];
+  state[8] = state[10];
+  state[10] = t;
+  t = state[9];
+  state[9] = state[11];
+  state[11] = t;
+
+  t = state[12];
+  state[12] = state[13];
+  state[13] = state[14];
+  state[14] = state[15];
+  state[15] = t;
+}
+
+// {09} \cdot s
+static inline Guchar mul09(Guchar s) {
+  Guchar s2, s4, s8;
+
+  s2 = (s & 0x80) ? ((s << 1) ^ 0x1b) : (s << 1);
+  s4 = (s2 & 0x80) ? ((s2 << 1) ^ 0x1b) : (s2 << 1);
+  s8 = (s4 & 0x80) ? ((s4 << 1) ^ 0x1b) : (s4 << 1);
+  return s ^ s8;
+}
+
+// {0b} \cdot s
+static inline Guchar mul0b(Guchar s) {
+  Guchar s2, s4, s8;
+
+  s2 = (s & 0x80) ? ((s << 1) ^ 0x1b) : (s << 1);
+  s4 = (s2 & 0x80) ? ((s2 << 1) ^ 0x1b) : (s2 << 1);
+  s8 = (s4 & 0x80) ? ((s4 << 1) ^ 0x1b) : (s4 << 1);
+  return s ^ s2 ^ s8;
+}
+
+// {0d} \cdot s
+static inline Guchar mul0d(Guchar s) {
+  Guchar s2, s4, s8;
+
+  s2 = (s & 0x80) ? ((s << 1) ^ 0x1b) : (s << 1);
+  s4 = (s2 & 0x80) ? ((s2 << 1) ^ 0x1b) : (s2 << 1);
+  s8 = (s4 & 0x80) ? ((s4 << 1) ^ 0x1b) : (s4 << 1);
+  return s ^ s4 ^ s8;
+}
+
+// {0e} \cdot s
+static inline Guchar mul0e(Guchar s) {
+  Guchar s2, s4, s8;
+
+  s2 = (s & 0x80) ? ((s << 1) ^ 0x1b) : (s << 1);
+  s4 = (s2 & 0x80) ? ((s2 << 1) ^ 0x1b) : (s2 << 1);
+  s8 = (s4 & 0x80) ? ((s4 << 1) ^ 0x1b) : (s4 << 1);
+  return s2 ^ s4 ^ s8;
+}
+
+static inline void invMixColumns(Guchar *state) {
+  int c;
+  Guchar s0, s1, s2, s3;
+
+  for (c = 0; c < 4; ++c) {
+    s0 = state[c];
+    s1 = state[4+c];
+    s2 = state[8+c];
+    s3 = state[12+c];
+    state[c] =    mul0e(s0) ^ mul0b(s1) ^ mul0d(s2) ^ mul09(s3);
+    state[4+c] =  mul09(s0) ^ mul0e(s1) ^ mul0b(s2) ^ mul0d(s3);
+    state[8+c] =  mul0d(s0) ^ mul09(s1) ^ mul0e(s2) ^ mul0b(s3);
+    state[12+c] = mul0b(s0) ^ mul0d(s1) ^ mul09(s2) ^ mul0e(s3);
+  }
+}
+
+static inline void invMixColumnsW(Guint *w) {
+  int c;
+  Guchar s0, s1, s2, s3;
+
+  for (c = 0; c < 4; ++c) {
+    s0 = w[c] >> 24;
+    s1 = w[c] >> 16;
+    s2 = w[c] >> 8;
+    s3 = w[c];
+    w[c] = ((mul0e(s0) ^ mul0b(s1) ^ mul0d(s2) ^ mul09(s3)) << 24)
+           | ((mul09(s0) ^ mul0e(s1) ^ mul0b(s2) ^ mul0d(s3)) << 16)
+           | ((mul0d(s0) ^ mul09(s1) ^ mul0e(s2) ^ mul0b(s3)) << 8)
+           | (mul0b(s0) ^ mul0d(s1) ^ mul09(s2) ^ mul0e(s3));
+  }
+}
+
+static inline void addRoundKey(Guchar *state, Guint *w) {
+  int c;
+
+  for (c = 0; c < 4; ++c) {
+    state[c] ^= w[c] >> 24;
+    state[4+c] ^= w[c] >> 16;
+    state[8+c] ^= w[c] >> 8;
+    state[12+c] ^= w[c];
+  }
+}
+
+static void aesKeyExpansion(DecryptAESState *s,
+                           Guchar *objKey, int /*objKeyLen*/) {
+  Guint temp;
+  int i, round;
+
+  //~ this assumes objKeyLen == 16
+
+  for (i = 0; i < 4; ++i) {
+    s->w[i] = (objKey[4*i] << 24) + (objKey[4*i+1] << 16) +
+              (objKey[4*i+2] << 8) + objKey[4*i+3];
+  }
+  for (i = 4; i < 44; ++i) {
+    temp = s->w[i-1];
+    if (!(i & 3)) {
+      temp = subWord(rotWord(temp)) ^ rcon[i/4];
+    }
+    s->w[i] = s->w[i-4] ^ temp;
+  }
+  for (round = 1; round <= 9; ++round) {
+    invMixColumnsW(&s->w[round * 4]);
+  }
+}
+
+static void aesDecryptBlock(DecryptAESState *s, Guchar *in, GBool last) {
+  int c, round, n, i;
+
+  // initial state
+  for (c = 0; c < 4; ++c) {
+    s->state[c] = in[4*c];
+    s->state[4+c] = in[4*c+1];
+    s->state[8+c] = in[4*c+2];
+    s->state[12+c] = in[4*c+3];
+  }
+
+  // round 0
+  addRoundKey(s->state, &s->w[10 * 4]);
+
+  // rounds 1-9
+  for (round = 9; round >= 1; --round) {
+    invSubBytes(s->state);
+    invShiftRows(s->state);
+    invMixColumns(s->state);
+    addRoundKey(s->state, &s->w[round * 4]);
+  }
+
+  // round 10
+  invSubBytes(s->state);
+  invShiftRows(s->state);
+  addRoundKey(s->state, &s->w[0]);
+
+  // CBC
+  for (c = 0; c < 4; ++c) {
+    s->buf[4*c] = s->state[c] ^ s->cbc[4*c];
+    s->buf[4*c+1] = s->state[4+c] ^ s->cbc[4*c+1];
+    s->buf[4*c+2] = s->state[8+c] ^ s->cbc[4*c+2];
+    s->buf[4*c+3] = s->state[12+c] ^ s->cbc[4*c+3];
+  }
+
+  // save the input block for the next CBC
+  for (i = 0; i < 16; ++i) {
+    s->cbc[i] = in[i];
+  }
+
+  // remove padding
+  s->bufIdx = 0;
+  if (last) {
+    n = s->buf[15];
+    if (n < 1 || n > 16) { // this should never happen
+      n = 16;
+    }
+    for (i = 15; i >= n; --i) {
+      s->buf[i] = s->buf[i-n];
+    }
+    s->bufIdx = n;
+  }
+}
+
+//------------------------------------------------------------------------
+// AES-256 decryption
+//------------------------------------------------------------------------
+
+static void aes256KeyExpansion(DecryptAES256State *s,
+                              Guchar *objKey, int objKeyLen) {
+  Guint temp;
+  int i, round;
+
+  //~ this assumes objKeyLen == 32
+
+  for (i = 0; i < 8; ++i) {
+    s->w[i] = (objKey[4*i] << 24) + (objKey[4*i+1] << 16) +
+              (objKey[4*i+2] << 8) + objKey[4*i+3];
+  }
+  for (i = 8; i < 60; ++i) {
+    temp = s->w[i-1];
+    if ((i & 7) == 0) {
+      temp = subWord(rotWord(temp)) ^ rcon[i/8];
+    } else if ((i & 7) == 4) {
+      temp = subWord(temp);
+    }
+    s->w[i] = s->w[i-8] ^ temp;
+  }
+  for (round = 1; round <= 13; ++round) {
+    invMixColumnsW(&s->w[round * 4]);
+  }
+}
+
+static void aes256DecryptBlock(DecryptAES256State *s, Guchar *in, GBool last) {
+  int c, round, n, i;
+
+  // initial state
+  for (c = 0; c < 4; ++c) {
+    s->state[c] = in[4*c];
+    s->state[4+c] = in[4*c+1];
+    s->state[8+c] = in[4*c+2];
+    s->state[12+c] = in[4*c+3];
+  }
+
+  // round 0
+  addRoundKey(s->state, &s->w[14 * 4]);
+
+  // rounds 13-1
+  for (round = 13; round >= 1; --round) {
+    invSubBytes(s->state);
+    invShiftRows(s->state);
+    invMixColumns(s->state);
+    addRoundKey(s->state, &s->w[round * 4]);
+  }
+
+  // round 14
+  invSubBytes(s->state);
+  invShiftRows(s->state);
+  addRoundKey(s->state, &s->w[0]);
+
+  // CBC
+  for (c = 0; c < 4; ++c) {
+    s->buf[4*c] = s->state[c] ^ s->cbc[4*c];
+    s->buf[4*c+1] = s->state[4+c] ^ s->cbc[4*c+1];
+    s->buf[4*c+2] = s->state[8+c] ^ s->cbc[4*c+2];
+    s->buf[4*c+3] = s->state[12+c] ^ s->cbc[4*c+3];
+  }
+
+  // save the input block for the next CBC
+  for (i = 0; i < 16; ++i) {
+    s->cbc[i] = in[i];
+  }
+
+  // remove padding
+  s->bufIdx = 0;
+  if (last) {
+    n = s->buf[15];
+    if (n < 1 || n > 16) { // this should never happen
+      n = 16;
+    }
+    for (i = 15; i >= n; --i) {
+      s->buf[i] = s->buf[i-n];
+    }
+    s->bufIdx = n;
+    if (n > 16)
+    {
+      error(errSyntaxError, -1, "Reducing bufIdx from {0:d} to 16 to not crash", n);
+      s->bufIdx = 16;
+    }
+  }
+}
+
+//------------------------------------------------------------------------
+// MD5 message digest
+//------------------------------------------------------------------------
+
+// this works around a bug in older Sun compilers
+static inline Gulong rotateLeft(Gulong x, int r) {
+  x &= 0xffffffff;
+  return ((x << r) | (x >> (32 - r))) & 0xffffffff;
+}
+
+static inline Gulong md5Round1(Gulong a, Gulong b, Gulong c, Gulong d,
+                              Gulong Xk,  Gulong s, Gulong Ti) {
+  return b + rotateLeft((a + ((b & c) | (~b & d)) + Xk + Ti), s);
+}
+
+static inline Gulong md5Round2(Gulong a, Gulong b, Gulong c, Gulong d,
+                              Gulong Xk,  Gulong s, Gulong Ti) {
+  return b + rotateLeft((a + ((b & d) | (c & ~d)) + Xk + Ti), s);
+}
+
+static inline Gulong md5Round3(Gulong a, Gulong b, Gulong c, Gulong d,
+                              Gulong Xk,  Gulong s, Gulong Ti) {
+  return b + rotateLeft((a + (b ^ c ^ d) + Xk + Ti), s);
+}
+
+static inline Gulong md5Round4(Gulong a, Gulong b, Gulong c, Gulong d,
+                              Gulong Xk,  Gulong s, Gulong Ti) {
+  return b + rotateLeft((a + (c ^ (b | ~d)) + Xk + Ti), s);
+}
+
+void md5(Guchar *msg, int msgLen, Guchar *digest) {
+  Gulong x[16];
+  Gulong a, b, c, d, aa, bb, cc, dd;
+  int n64;
+  int i, j, k;
+
+  // sanity check
+  if (msgLen < 0) {
+    return;
+  }
+
+  // compute number of 64-byte blocks
+  // (length + pad byte (0x80) + 8 bytes for length)
+  n64 = (msgLen + 1 + 8 + 63) / 64;
+
+  // initialize a, b, c, d
+  a = 0x67452301;
+  b = 0xefcdab89;
+  c = 0x98badcfe;
+  d = 0x10325476;
+
+  // loop through blocks
+  k = 0;
+  for (i = 0; i < n64; ++i) {
+
+    // grab a 64-byte block
+    for (j = 0; j < 16 && k < msgLen - 3; ++j, k += 4)
+      x[j] = (((((msg[k+3] << 8) + msg[k+2]) << 8) + msg[k+1]) << 8) + msg[k];
+    if (i == n64 - 1) {
+      if (k == msgLen - 3)
+       x[j] = 0x80000000 + (((msg[k+2] << 8) + msg[k+1]) << 8) + msg[k];
+      else if (k == msgLen - 2)
+       x[j] = 0x800000 + (msg[k+1] << 8) + msg[k];
+      else if (k == msgLen - 1)
+       x[j] = 0x8000 + msg[k];
+      else
+       x[j] = 0x80;
+      ++j;
+      while (j < 16)
+       x[j++] = 0;
+      x[14] = msgLen << 3;
+    }
+
+    // save a, b, c, d
+    aa = a;
+    bb = b;
+    cc = c;
+    dd = d;
+
+    // round 1
+    a = md5Round1(a, b, c, d, x[0],   7, 0xd76aa478);
+    d = md5Round1(d, a, b, c, x[1],  12, 0xe8c7b756);
+    c = md5Round1(c, d, a, b, x[2],  17, 0x242070db);
+    b = md5Round1(b, c, d, a, x[3],  22, 0xc1bdceee);
+    a = md5Round1(a, b, c, d, x[4],   7, 0xf57c0faf);
+    d = md5Round1(d, a, b, c, x[5],  12, 0x4787c62a);
+    c = md5Round1(c, d, a, b, x[6],  17, 0xa8304613);
+    b = md5Round1(b, c, d, a, x[7],  22, 0xfd469501);
+    a = md5Round1(a, b, c, d, x[8],   7, 0x698098d8);
+    d = md5Round1(d, a, b, c, x[9],  12, 0x8b44f7af);
+    c = md5Round1(c, d, a, b, x[10], 17, 0xffff5bb1);
+    b = md5Round1(b, c, d, a, x[11], 22, 0x895cd7be);
+    a = md5Round1(a, b, c, d, x[12],  7, 0x6b901122);
+    d = md5Round1(d, a, b, c, x[13], 12, 0xfd987193);
+    c = md5Round1(c, d, a, b, x[14], 17, 0xa679438e);
+    b = md5Round1(b, c, d, a, x[15], 22, 0x49b40821);
+
+    // round 2
+    a = md5Round2(a, b, c, d, x[1],   5, 0xf61e2562);
+    d = md5Round2(d, a, b, c, x[6],   9, 0xc040b340);
+    c = md5Round2(c, d, a, b, x[11], 14, 0x265e5a51);
+    b = md5Round2(b, c, d, a, x[0],  20, 0xe9b6c7aa);
+    a = md5Round2(a, b, c, d, x[5],   5, 0xd62f105d);
+    d = md5Round2(d, a, b, c, x[10],  9, 0x02441453);
+    c = md5Round2(c, d, a, b, x[15], 14, 0xd8a1e681);
+    b = md5Round2(b, c, d, a, x[4],  20, 0xe7d3fbc8);
+    a = md5Round2(a, b, c, d, x[9],   5, 0x21e1cde6);
+    d = md5Round2(d, a, b, c, x[14],  9, 0xc33707d6);
+    c = md5Round2(c, d, a, b, x[3],  14, 0xf4d50d87);
+    b = md5Round2(b, c, d, a, x[8],  20, 0x455a14ed);
+    a = md5Round2(a, b, c, d, x[13],  5, 0xa9e3e905);
+    d = md5Round2(d, a, b, c, x[2],   9, 0xfcefa3f8);
+    c = md5Round2(c, d, a, b, x[7],  14, 0x676f02d9);
+    b = md5Round2(b, c, d, a, x[12], 20, 0x8d2a4c8a);
+
+    // round 3
+    a = md5Round3(a, b, c, d, x[5],   4, 0xfffa3942);
+    d = md5Round3(d, a, b, c, x[8],  11, 0x8771f681);
+    c = md5Round3(c, d, a, b, x[11], 16, 0x6d9d6122);
+    b = md5Round3(b, c, d, a, x[14], 23, 0xfde5380c);
+    a = md5Round3(a, b, c, d, x[1],   4, 0xa4beea44);
+    d = md5Round3(d, a, b, c, x[4],  11, 0x4bdecfa9);
+    c = md5Round3(c, d, a, b, x[7],  16, 0xf6bb4b60);
+    b = md5Round3(b, c, d, a, x[10], 23, 0xbebfbc70);
+    a = md5Round3(a, b, c, d, x[13],  4, 0x289b7ec6);
+    d = md5Round3(d, a, b, c, x[0],  11, 0xeaa127fa);
+    c = md5Round3(c, d, a, b, x[3],  16, 0xd4ef3085);
+    b = md5Round3(b, c, d, a, x[6],  23, 0x04881d05);
+    a = md5Round3(a, b, c, d, x[9],   4, 0xd9d4d039);
+    d = md5Round3(d, a, b, c, x[12], 11, 0xe6db99e5);
+    c = md5Round3(c, d, a, b, x[15], 16, 0x1fa27cf8);
+    b = md5Round3(b, c, d, a, x[2],  23, 0xc4ac5665);
+
+    // round 4
+    a = md5Round4(a, b, c, d, x[0],   6, 0xf4292244);
+    d = md5Round4(d, a, b, c, x[7],  10, 0x432aff97);
+    c = md5Round4(c, d, a, b, x[14], 15, 0xab9423a7);
+    b = md5Round4(b, c, d, a, x[5],  21, 0xfc93a039);
+    a = md5Round4(a, b, c, d, x[12],  6, 0x655b59c3);
+    d = md5Round4(d, a, b, c, x[3],  10, 0x8f0ccc92);
+    c = md5Round4(c, d, a, b, x[10], 15, 0xffeff47d);
+    b = md5Round4(b, c, d, a, x[1],  21, 0x85845dd1);
+    a = md5Round4(a, b, c, d, x[8],   6, 0x6fa87e4f);
+    d = md5Round4(d, a, b, c, x[15], 10, 0xfe2ce6e0);
+    c = md5Round4(c, d, a, b, x[6],  15, 0xa3014314);
+    b = md5Round4(b, c, d, a, x[13], 21, 0x4e0811a1);
+    a = md5Round4(a, b, c, d, x[4],   6, 0xf7537e82);
+    d = md5Round4(d, a, b, c, x[11], 10, 0xbd3af235);
+    c = md5Round4(c, d, a, b, x[2],  15, 0x2ad7d2bb);
+    b = md5Round4(b, c, d, a, x[9],  21, 0xeb86d391);
+
+    // increment a, b, c, d
+    a += aa;
+    b += bb;
+    c += cc;
+    d += dd;
+  }
+
+  // break digest into bytes
+  digest[0] = (Guchar)(a & 0xff);
+  digest[1] = (Guchar)((a >>= 8) & 0xff);
+  digest[2] = (Guchar)((a >>= 8) & 0xff);
+  digest[3] = (Guchar)((a >>= 8) & 0xff);
+  digest[4] = (Guchar)(b & 0xff);
+  digest[5] = (Guchar)((b >>= 8) & 0xff);
+  digest[6] = (Guchar)((b >>= 8) & 0xff);
+  digest[7] = (Guchar)((b >>= 8) & 0xff);
+  digest[8] = (Guchar)(c & 0xff);
+  digest[9] = (Guchar)((c >>= 8) & 0xff);
+  digest[10] = (Guchar)((c >>= 8) & 0xff);
+  digest[11] = (Guchar)((c >>= 8) & 0xff);
+  digest[12] = (Guchar)(d & 0xff);
+  digest[13] = (Guchar)((d >>= 8) & 0xff);
+  digest[14] = (Guchar)((d >>= 8) & 0xff);
+  digest[15] = (Guchar)((d >>= 8) & 0xff);
+}
+
+//------------------------------------------------------------------------
+// SHA-256 hash
+//------------------------------------------------------------------------
+
+static Guint sha256K[64] = {
+  0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5,
+  0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5,
+  0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3,
+  0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174,
+  0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc,
+  0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da,
+  0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7,
+  0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967,
+  0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13,
+  0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85,
+  0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3,
+  0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070,
+  0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5,
+  0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3,
+  0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208,
+  0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2
+};
+
+static inline Guint rotr(Guint x, Guint n) {
+  return (x >> n) | (x << (32 - n));
+}
+
+static inline Guint sha256Ch(Guint x, Guint y, Guint z) {
+  return (x & y) ^ (~x & z);
+}
+
+static inline Guint sha256Maj(Guint x, Guint y, Guint z) {
+  return (x & y) ^ (x & z) ^ (y & z);
+}
+
+static inline Guint sha256Sigma0(Guint x) {
+  return rotr(x, 2) ^ rotr(x, 13) ^ rotr(x, 22);
+}
+
+static inline Guint sha256Sigma1(Guint x) {
+  return rotr(x, 6) ^ rotr(x, 11) ^ rotr(x, 25);
+}
+
+static inline Guint sha256sigma0(Guint x) {
+  return rotr(x, 7) ^ rotr(x, 18) ^ (x >> 3);
+}
+
+static inline Guint sha256sigma1(Guint x) {
+  return rotr(x, 17) ^ rotr(x, 19) ^ (x >> 10);
+}
+
+void sha256HashBlock(Guchar *blk, Guint *H) {
+  Guint W[64];
+  Guint a, b, c, d, e, f, g, h;
+  Guint T1, T2;
+  Guint t;
+
+  // 1. prepare the message schedule
+  for (t = 0; t < 16; ++t) {
+    W[t] = (blk[t*4] << 24) |
+           (blk[t*4 + 1] << 16) |
+           (blk[t*4 + 2] << 8) |
+           blk[t*4 + 3];
+  }
+  for (t = 16; t < 64; ++t) {
+    W[t] = sha256sigma1(W[t-2]) + W[t-7] + sha256sigma0(W[t-15]) + W[t-16];
+  }
+
+  // 2. initialize the eight working variables
+  a = H[0];
+  b = H[1];
+  c = H[2];
+  d = H[3];
+  e = H[4];
+  f = H[5];
+  g = H[6];
+  h = H[7];
+
+  // 3.
+  for (t = 0; t < 64; ++t) {
+    T1 = h + sha256Sigma1(e) + sha256Ch(e,f,g) + sha256K[t] + W[t];
+    T2 = sha256Sigma0(a) + sha256Maj(a,b,c);
+    h = g;
+    g = f;
+    f = e;
+    e = d + T1;
+    d = c;
+    c = b;
+    b = a;
+    a = T1 + T2;
+  }
+
+  // 4. compute the intermediate hash value
+  H[0] += a;
+  H[1] += b;
+  H[2] += c;
+  H[3] += d;
+  H[4] += e;
+  H[5] += f;
+  H[6] += g;
+  H[7] += h;
+}
+
+static void sha256(Guchar *msg, int msgLen, Guchar *hash) {
+  Guchar blk[64];
+  Guint H[8];
+  int blkLen, i;
+
+  H[0] = 0x6a09e667;
+  H[1] = 0xbb67ae85;
+  H[2] = 0x3c6ef372;
+  H[3] = 0xa54ff53a;
+  H[4] = 0x510e527f;
+  H[5] = 0x9b05688c;
+  H[6] = 0x1f83d9ab;
+  H[7] = 0x5be0cd19;
+
+  blkLen = 0;
+  for (i = 0; i + 64 <= msgLen; i += 64) {
+    sha256HashBlock(msg + i, H);
+  }
+  blkLen = msgLen - i;
+  if (blkLen > 0) {
+    memcpy(blk, msg + i, blkLen);
+  }
+
+  // pad the message
+  blk[blkLen++] = 0x80;
+  if (blkLen > 56) {
+    while (blkLen < 64) {
+      blk[blkLen++] = 0;
+    }
+    sha256HashBlock(blk, H);
+    blkLen = 0;
+  }
+  while (blkLen < 56) {
+    blk[blkLen++] = 0;
+  }
+  blk[56] = 0;
+  blk[57] = 0;
+  blk[58] = 0;
+  blk[59] = 0;
+  blk[60] = (Guchar)(msgLen >> 21);
+  blk[61] = (Guchar)(msgLen >> 13);
+  blk[62] = (Guchar)(msgLen >> 5);
+  blk[63] = (Guchar)(msgLen << 3);
+  sha256HashBlock(blk, H);
+
+  // copy the output into the buffer (convert words to bytes)
+  for (i = 0; i < 8; ++i) {
+    hash[i*4]     = (Guchar)(H[i] >> 24);
+    hash[i*4 + 1] = (Guchar)(H[i] >> 16);
+    hash[i*4 + 2] = (Guchar)(H[i] >> 8);
+    hash[i*4 + 3] = (Guchar)H[i];
+  }
+}
diff --git a/poppler/Decrypt.h b/poppler/Decrypt.h
new file mode 100644 (file)
index 0000000..d947f41
--- /dev/null
@@ -0,0 +1,126 @@
+//========================================================================
+//
+// Decrypt.h
+//
+// Copyright 1996-2003 Glyph & Cog, LLC
+//
+//========================================================================
+
+//========================================================================
+//
+// Modified under the Poppler project - http://poppler.freedesktop.org
+//
+// All changes made under the Poppler project to this file are licensed
+// under GPL version 2 or later
+//
+// Copyright (C) 2008 Julien Rebetez <julien@fhtagn.net>
+// Copyright (C) 2009 David Benjamin <davidben@mit.edu>
+//
+// To see a description of the changes please see the Changelog file that
+// came with your tarball or type make ChangeLog if you are building from git
+//
+//========================================================================
+
+#ifndef DECRYPT_H
+#define DECRYPT_H
+
+#ifdef USE_GCC_PRAGMAS
+#pragma interface
+#endif
+
+#include "goo/gtypes.h"
+#include "goo/GooString.h"
+#include "Object.h"
+#include "Stream.h"
+
+//------------------------------------------------------------------------
+// Decrypt
+//------------------------------------------------------------------------
+
+class Decrypt {
+public:
+
+  // Generate a file key.  The <fileKey> buffer must have space for at
+  // least 16 bytes.  Checks <ownerPassword> and then <userPassword>
+  // and returns true if either is correct.  Sets <ownerPasswordOk> if
+  // the owner password was correct.  Either or both of the passwords
+  // may be NULL, which is treated as an empty string.
+  static GBool makeFileKey(int encVersion, int encRevision, int keyLength,
+                          GooString *ownerKey, GooString *userKey,
+                          GooString *ownerEnc, GooString *userEnc,
+                          int permissions, GooString *fileID,
+                          GooString *ownerPassword, GooString *userPassword,
+                          Guchar *fileKey, GBool encryptMetadata,
+                          GBool *ownerPasswordOk);
+
+private:
+
+  static GBool makeFileKey2(int encVersion, int encRevision, int keyLength,
+                           GooString *ownerKey, GooString *userKey,
+                           int permissions, GooString *fileID,
+                           GooString *userPassword, Guchar *fileKey,
+                           GBool encryptMetadata);
+};
+
+//------------------------------------------------------------------------
+// DecryptStream
+//------------------------------------------------------------------------
+
+struct DecryptRC4State {
+  Guchar state[256];
+  Guchar x, y;
+  int buf;
+};
+
+struct DecryptAESState {
+  Guint w[44];
+  Guchar state[16];
+  Guchar cbc[16];
+  Guchar buf[16];
+  int bufIdx;
+};
+
+struct DecryptAES256State {
+  Guint w[60];
+  Guchar state[16];
+  Guchar cbc[16];
+  Guchar buf[16];
+  int bufIdx;
+};
+
+class DecryptStream: public FilterStream {
+public:
+
+  DecryptStream(Stream *strA, Guchar *fileKey,
+               CryptAlgorithm algoA, int keyLength,
+               int objNum, int objGen);
+  virtual ~DecryptStream();
+  virtual StreamKind getKind() { return strWeird; }
+  virtual void reset();
+  virtual int getChar();
+  virtual int lookChar();
+  virtual int getPos();
+  virtual GBool isBinary(GBool last);
+  virtual Stream *getUndecodedStream() { return this; }
+
+private:
+
+  CryptAlgorithm algo;
+  int objKeyLength;
+  Guchar objKey[32];
+  int charactersRead; // so that getPos() can be correct
+
+  union {
+    DecryptRC4State rc4;
+    DecryptAESState aes;
+    DecryptAES256State aes256;
+  } state;
+};
+//------------------------------------------------------------------------
+
+extern void rc4InitKey(Guchar *key, int keyLen, Guchar *state);
+extern Guchar rc4DecryptByte(Guchar *state, Guchar *x, Guchar *y, Guchar c);
+extern void md5(Guchar *msg, int msgLen, Guchar *digest);
+
+#endif
diff --git a/poppler/Dict.cc b/poppler/Dict.cc
new file mode 100644 (file)
index 0000000..c4f667b
--- /dev/null
@@ -0,0 +1,243 @@
+//========================================================================
+//
+// Dict.cc
+//
+// Copyright 1996-2003 Glyph & Cog, LLC
+//
+//========================================================================
+
+//========================================================================
+//
+// Modified under the Poppler project - http://poppler.freedesktop.org
+//
+// All changes made under the Poppler project to this file are licensed
+// under GPL version 2 or later
+//
+// Copyright (C) 2005 Kristian Høgsberg <krh@redhat.com>
+// Copyright (C) 2006 Krzysztof Kowalczyk <kkowalczyk@gmail.com>
+// Copyright (C) 2007-2008 Julien Rebetez <julienr@svn.gnome.org>
+// Copyright (C) 2008, 2010 Albert Astals Cid <aacid@kde.org>
+// Copyright (C) 2010 Paweł Wiejacha <pawel.wiejacha@gmail.com>
+// Copyright (C) 2012 Fabio D'Urso <fabiodurso@hotmail.it>
+//
+// To see a description of the changes please see the Changelog file that
+// came with your tarball or type make ChangeLog if you are building from git
+//
+//========================================================================
+
+#include <config.h>
+
+#ifdef USE_GCC_PRAGMAS
+#pragma implementation
+#endif
+
+#include <algorithm>
+#include <stddef.h>
+#include <string.h>
+#include "goo/gmem.h"
+#include "Object.h"
+#include "XRef.h"
+#include "Dict.h"
+
+//------------------------------------------------------------------------
+// Dict
+//------------------------------------------------------------------------
+
+static const int SORT_LENGTH_LOWER_LIMIT = 32;
+
+static inline bool cmpDictEntries(const DictEntry &e1, const DictEntry &e2)
+{
+  return strcmp(e1.key, e2.key) < 0;
+}
+
+static int binarySearch(const char *key, DictEntry *entries, int length)
+{
+  int first = 0;
+  int end = length - 1;
+  while (first <= end) {
+    const int middle = (first + end) / 2;
+    const int res = strcmp(key, entries[middle].key);
+    if (res == 0) {
+      return middle;
+    } else if (res < 0) {
+      end = middle - 1;
+    } else {
+      first = middle + 1;
+    }
+  }
+  return -1;
+}
+
+Dict::Dict(XRef *xrefA) {
+  xref = xrefA;
+  entries = NULL;
+  size = length = 0;
+  ref = 1;
+  sorted = gFalse;
+}
+
+Dict::Dict(Dict* dictA) {
+  xref = dictA->xref;
+  size = length = dictA->length;
+  ref = 1;
+
+  sorted = dictA->sorted;
+  entries = (DictEntry *)gmallocn(size, sizeof(DictEntry));
+  for (int i=0; i<length; i++) {
+    entries[i].key = strdup(dictA->entries[i].key);
+    dictA->entries[i].val.copy(&entries[i].val);
+  }
+}
+
+Dict::~Dict() {
+  int i;
+
+  for (i = 0; i < length; ++i) {
+    gfree(entries[i].key);
+    entries[i].val.free();
+  }
+  gfree(entries);
+}
+
+void Dict::add(char *key, Object *val) {
+  if (sorted) {
+    // We use add on very few occasions so
+    // virtually this will never be hit
+    sorted = gFalse;
+  }
+
+  if (length == size) {
+    if (length == 0) {
+      size = 8;
+    } else {
+      size *= 2;
+    }
+    entries = (DictEntry *)greallocn(entries, size, sizeof(DictEntry));
+  }
+  entries[length].key = key;
+  entries[length].val = *val;
+  ++length;
+}
+
+inline DictEntry *Dict::find(const char *key) {
+  if (!sorted && length >= SORT_LENGTH_LOWER_LIMIT)
+  {
+      sorted = gTrue;
+      std::sort(entries, entries+length, cmpDictEntries);
+  }
+
+  if (sorted) {
+    const int pos = binarySearch(key, entries, length);
+    if (pos != -1) {
+      return &entries[pos];
+    }
+  } else {
+    int i;
+
+    for (i = length - 1; i >=0; --i) {
+      if (!strcmp(key, entries[i].key))
+        return &entries[i];
+    }
+  }
+  return NULL;
+}
+
+GBool Dict::hasKey(const char *key) {
+  return find(key) != NULL;
+}
+
+void Dict::remove(const char *key) {
+  if (sorted) {
+    const int pos = binarySearch(key, entries, length);
+    if (pos != -1) {
+      length -= 1;
+      if (pos != length) {
+        memmove(&entries[pos], &entries[pos + 1], (length - pos) * sizeof(DictEntry));
+      }
+    }
+  } else {
+    int i; 
+    bool found = false;
+    DictEntry tmp;
+    if(length == 0) return;
+
+    for(i=0; i<length; i++) {
+      if (!strcmp(key, entries[i].key)) {
+        found = true;
+        break;
+      }
+    }
+    if(!found) return;
+    //replace the deleted entry with the last entry
+    length -= 1;
+    tmp = entries[length];
+    if (i!=length) //don't copy the last entry if it is deleted 
+      entries[i] = tmp;
+  }
+}
+
+void Dict::set(const char *key, Object *val) {
+  DictEntry *e;
+  if (val->isNull()) {
+    remove(key);
+    return;
+  }
+  e = find (key);
+  if (e) {
+    e->val.free();
+    e->val = *val;
+  } else {
+    add (copyString(key), val);
+  }
+}
+
+
+GBool Dict::is(const char *type) {
+  DictEntry *e;
+
+  return (e = find("Type")) && e->val.isName(type);
+}
+
+Object *Dict::lookup(const char *key, Object *obj, int recursion) {
+  DictEntry *e;
+
+  return (e = find(key)) ? e->val.fetch(xref, obj, recursion) : obj->initNull();
+}
+
+Object *Dict::lookupNF(const char *key, Object *obj) {
+  DictEntry *e;
+
+  return (e = find(key)) ? e->val.copy(obj) : obj->initNull();
+}
+
+GBool Dict::lookupInt(const char *key, const char *alt_key, int *value)
+{
+  Object obj1;
+  GBool success = gFalse;
+  
+  lookup ((char *) key, &obj1);
+  if (obj1.isNull () && alt_key != NULL) {
+    obj1.free ();
+    lookup ((char *) alt_key, &obj1);
+  }
+  if (obj1.isInt ()) {
+    *value = obj1.getInt ();
+    success = gTrue;
+  }
+
+  obj1.free ();
+
+  return success;
+}
+
+char *Dict::getKey(int i) {
+  return entries[i].key;
+}
+
+Object *Dict::getVal(int i, Object *obj) {
+  return entries[i].val.fetch(xref, obj);
+}
+
+Object *Dict::getValNF(int i, Object *obj) {
+  return entries[i].val.copy(obj);
+}
diff --git a/poppler/Dict.h b/poppler/Dict.h
new file mode 100644 (file)
index 0000000..897f221
--- /dev/null
@@ -0,0 +1,105 @@
+//========================================================================
+//
+// Dict.h
+//
+// Copyright 1996-2003 Glyph & Cog, LLC
+//
+//========================================================================
+
+//========================================================================
+//
+// Modified under the Poppler project - http://poppler.freedesktop.org
+//
+// All changes made under the Poppler project to this file are licensed
+// under GPL version 2 or later
+//
+// Copyright (C) 2005 Kristian Høgsberg <krh@redhat.com>
+// Copyright (C) 2006 Krzysztof Kowalczyk <kkowalczyk@gmail.com>
+// Copyright (C) 2007-2008 Julien Rebetez <julienr@svn.gnome.org>
+// Copyright (C) 2010 Albert Astals Cid <aacid@kde.org>
+// Copyright (C) 2010 Paweł Wiejacha <pawel.wiejacha@gmail.com>
+//
+// To see a description of the changes please see the Changelog file that
+// came with your tarball or type make ChangeLog if you are building from git
+//
+//========================================================================
+
+#ifndef DICT_H
+#define DICT_H
+
+#ifdef USE_GCC_PRAGMAS
+#pragma interface
+#endif
+
+#include "Object.h"
+
+//------------------------------------------------------------------------
+// Dict
+//------------------------------------------------------------------------
+
+struct DictEntry {
+  char *key;
+  Object val;
+};
+
+class Dict {
+public:
+
+  // Constructor.
+  Dict(XRef *xrefA);
+  Dict(Dict* dictA);
+
+  // Destructor.
+  ~Dict();
+
+  // Reference counting.
+  int incRef() { return ++ref; }
+  int decRef() { return --ref; }
+
+  // Get number of entries.
+  int getLength() { return length; }
+
+  // Add an entry.  NB: does not copy key.
+  void add(char *key, Object *val);
+
+  // Update the value of an existing entry, otherwise create it
+  void set(const char *key, Object *val);
+  // Remove an entry. This invalidate indexes
+  void remove(const char *key);
+
+  // Check if dictionary is of specified type.
+  GBool is(const char *type);
+
+  // Look up an entry and return the value.  Returns a null object
+  // if <key> is not in the dictionary.
+  Object *lookup(const char *key, Object *obj, int recursion = 0);
+  Object *lookupNF(const char *key, Object *obj);
+  GBool lookupInt(const char *key, const char *alt_key, int *value);
+
+  // Iterative accessors.
+  char *getKey(int i);
+  Object *getVal(int i, Object *obj);
+  Object *getValNF(int i, Object *obj);
+
+  // Set the xref pointer.  This is only used in one special case: the
+  // trailer dictionary, which is read before the xref table is
+  // parsed.
+  void setXRef(XRef *xrefA) { xref = xrefA; }
+  
+  XRef *getXRef() { return xref; }
+  
+  GBool hasKey(const char *key);
+
+private:
+
+  GBool sorted;
+  XRef *xref;                  // the xref table for this PDF file
+  DictEntry *entries;          // array of entries
+  int size;                    // size of <entries> array
+  int length;                  // number of entries in dictionary
+  int ref;                     // reference count
+
+  DictEntry *find(const char *key);
+};
+
+#endif
diff --git a/poppler/Error.cc b/poppler/Error.cc
new file mode 100644 (file)
index 0000000..9d044bc
--- /dev/null
@@ -0,0 +1,84 @@
+//========================================================================
+//
+// Error.cc
+//
+// Copyright 1996-2003 Glyph & Cog, LLC
+//
+//========================================================================
+
+//========================================================================
+//
+// Modified under the Poppler project - http://poppler.freedesktop.org
+//
+// All changes made under the Poppler project to this file are licensed
+// under GPL version 2 or later
+//
+// Copyright (C) 2005, 2007 Jeff Muizelaar <jeff@infidigm.net>
+// Copyright (C) 2005 Albert Astals Cid <aacid@kde.org>
+// Copyright (C) 2007 Krzysztof Kowalczyk <kkowalczyk@gmail.com>
+//
+// To see a description of the changes please see the Changelog file that
+// came with your tarball or type make ChangeLog if you are building from git
+//
+//========================================================================
+
+#include <config.h>
+
+#ifdef USE_GCC_PRAGMAS
+#pragma implementation
+#endif
+
+#include <stdio.h>
+#include <stddef.h>
+#include <stdarg.h>
+#include "GooString.h"
+#include "GlobalParams.h"
+#include "Error.h"
+
+static const char *errorCategoryNames[] = {
+  "Syntax Warning",
+  "Syntax Error",
+  "Config Error",
+  "Command Line Error",
+  "I/O Error",
+  "Permission Error",
+  "Unimplemented Feature",
+  "Internal Error"
+};
+
+static void (*errorCbk)(void *data, ErrorCategory category,
+                       int pos, char *msg) = NULL;
+static void *errorCbkData = NULL;
+
+void setErrorCallback(void (*cbk)(void *data, ErrorCategory category,
+                                 int pos, char *msg),
+                     void *data) {
+  errorCbk = cbk;
+  errorCbkData = data;
+}
+
+void CDECL error(ErrorCategory category, int pos, const char *msg, ...) {
+  va_list args;
+  GooString *s;
+
+  // NB: this can be called before the globalParams object is created
+  if (!errorCbk && globalParams && globalParams->getErrQuiet()) {
+    return;
+  }
+  va_start(args, msg);
+  s = GooString::formatv(msg, args);
+  va_end(args);
+  if (errorCbk) {
+    (*errorCbk)(errorCbkData, category, pos, s->getCString());
+  } else {
+    if (pos >= 0) {
+      fprintf(stderr, "%s (%d): %s\n",
+             errorCategoryNames[category], pos, s->getCString());
+    } else {
+      fprintf(stderr, "%s: %s\n",
+             errorCategoryNames[category], s->getCString());
+    }
+    fflush(stderr);
+  }
+  delete s;
+}
diff --git a/poppler/Error.h b/poppler/Error.h
new file mode 100644 (file)
index 0000000..d7a0991
--- /dev/null
@@ -0,0 +1,56 @@
+//========================================================================
+//
+// Error.h
+//
+// Copyright 1996-2003 Glyph & Cog, LLC
+//
+//========================================================================
+
+//========================================================================
+//
+// Modified under the Poppler project - http://poppler.freedesktop.org
+//
+// All changes made under the Poppler project to this file are licensed
+// under GPL version 2 or later
+//
+// Copyright (C) 2005, 2007 Jeff Muizelaar <jeff@infidigm.net>
+// Copyright (C) 2005 Albert Astals Cid <aacid@kde.org>
+// Copyright (C) 2005 Kristian Høgsberg <krh@redhat.com>
+//
+// To see a description of the changes please see the Changelog file that
+// came with your tarball or type make ChangeLog if you are building from git
+//
+//========================================================================
+
+#ifndef ERROR_H
+#define ERROR_H
+
+#ifdef USE_GCC_PRAGMAS
+#pragma interface
+#endif
+
+#include <stdarg.h>
+#include "poppler-config.h"
+
+enum ErrorCategory {
+  errSyntaxWarning,    // PDF syntax error which can be worked around;
+                       //   output will probably be correct
+  errSyntaxError,      // PDF syntax error which can be worked around;
+                       //   output will probably be incorrect
+  errConfig,           // error in Xpdf config info (xpdfrc file, etc.)
+  errCommandLine,      // error in user-supplied parameters, action not
+                       //   allowed, etc. (only used by command-line tools)
+  errIO,               // error in file I/O
+  errNotAllowed,       // action not allowed by PDF permission bits
+  errUnimplemented,    // unimplemented PDF feature - display will be
+                       //   incorrect
+  errInternal          // internal error - malfunction within the Xpdf code
+};
+
+extern void setErrorCallback(void (*cbk)(void *data, ErrorCategory category,
+                                        int pos, char *msg),
+                            void *data);
+
+extern void CDECL error(ErrorCategory category, int pos, const char *msg, ...);
+
+#endif
diff --git a/poppler/ErrorCodes.h b/poppler/ErrorCodes.h
new file mode 100644 (file)
index 0000000..b28528d
--- /dev/null
@@ -0,0 +1,36 @@
+//========================================================================
+//
+// ErrorCodes.h
+//
+// Copyright 2002-2003 Glyph & Cog, LLC
+//
+//========================================================================
+
+#ifndef ERRORCODES_H
+#define ERRORCODES_H
+
+#define errNone             0  // no error
+
+#define errOpenFile         1  // couldn't open the PDF file
+
+#define errBadCatalog       2  // couldn't read the page catalog
+
+#define errDamaged          3  // PDF file was damaged and couldn't be
+                               // repaired
+
+#define errEncrypted        4  // file was encrypted and password was
+                               // incorrect or not supplied
+
+#define errHighlightFile    5  // nonexistent or invalid highlight file
+
+#define errBadPrinter       6   // invalid printer
+
+#define errPrinting         7   // error during printing
+
+#define errPermission       8  // PDF file doesn't allow that operation
+
+#define errBadPageNum       9  // invalid page number
+
+#define errFileIO          10   // file I/O error
+
+#endif
diff --git a/poppler/FileSpec.cc b/poppler/FileSpec.cc
new file mode 100644 (file)
index 0000000..1adcf5b
--- /dev/null
@@ -0,0 +1,294 @@
+//========================================================================
+//
+// FileSpec.cc
+//
+// All changes made under the Poppler project to this file are licensed
+// under GPL version 2 or later
+//
+// Copyright (C) 2008-2009 Carlos Garcia Campos <carlosgc@gnome.org>
+// Copyright (C) 2009 Kovid Goyal <kovid@kovidgoyal.net>
+// Copyright (C) 2012 Albert Astals Cid <aacid@kde.org>
+//
+// To see a description of the changes please see the Changelog file that
+// came with your tarball or type make ChangeLog if you are building from git
+//
+//========================================================================
+
+//========================================================================
+//
+// Most of the code from Link.cc and PSOutputDev.cc
+//
+// Copyright 1996-2003 Glyph & Cog, LLC 
+//
+//========================================================================
+
+#include <config.h>
+
+#include "FileSpec.h"
+
+EmbFile::EmbFile(Object *efStream)
+{
+  m_size = -1;
+  m_createDate = NULL;
+  m_modDate = NULL;
+  m_checksum = NULL;
+  m_mimetype = NULL;
+
+  efStream->copy(&m_objStr);
+
+  if (efStream->isStream()) {
+    // dataDict corresponds to Table 3.41 in the PDF1.6 spec.
+    Dict *dataDict = efStream->streamGetDict();
+
+    // subtype is normally the mimetype
+    Object subtypeName;
+    if (dataDict->lookup("Subtype", &subtypeName)->isName()) {
+      m_mimetype = new GooString(subtypeName.getName());
+    }
+    subtypeName.free();
+
+    // paramDict corresponds to Table 3.42 in the PDF1.6 spec
+    Object paramDict;
+    if (dataDict->lookup("Params", &paramDict)->isDict()) {
+      Object paramObj;
+      if (paramDict.dictLookup("ModDate", &paramObj)->isString())
+        m_modDate = new GooString(paramObj.getString());
+      paramObj.free();
+
+      if (paramDict.dictLookup("CreationDate", &paramObj)->isString())
+        m_createDate = new GooString(paramObj.getString());
+      paramObj.free();
+
+      if (paramDict.dictLookup("Size", &paramObj)->isInt())
+        m_size = paramObj.getInt();
+      paramObj.free();
+
+      if (paramDict.dictLookup("CheckSum", &paramObj)->isString())
+        m_checksum = new GooString(paramObj.getString());
+      paramObj.free();
+    }
+    paramDict.free();
+  }
+}
+
+EmbFile::~EmbFile()
+{
+  delete m_createDate;
+  delete m_modDate;
+  delete m_checksum;
+  delete m_mimetype;
+  m_objStr.free();
+}
+
+GBool EmbFile::save(const char *path) {
+  FILE *f;
+  GBool ret;
+
+  if (!(f = fopen(path, "wb"))) {
+    return gFalse;
+  }
+  ret = save2(f);
+  fclose(f);
+  return ret;
+}
+
+GBool EmbFile::save2(FILE *f) {
+  int c;
+
+  m_objStr.streamReset();
+  while ((c = m_objStr.streamGetChar()) != EOF) {
+    fputc(c, f);
+  }
+  return gTrue;
+}
+
+FileSpec::FileSpec(Object *fileSpecA)
+{
+  ok = gTrue;
+  fileName = NULL;
+  platformFileName = NULL;
+  embFile = NULL;
+  desc = NULL;
+  fileSpecA->copy(&fileSpec);
+
+  Object obj1;
+  if (!getFileSpecName(fileSpecA, &obj1)) {
+    ok = gFalse;
+    obj1.free();
+    error(errSyntaxError, -1, "Invalid FileSpec");
+    return;
+  }
+
+  fileName = obj1.getString()->copy();
+  obj1.free();
+
+  if (fileSpec.isDict()) {
+    if (fileSpec.dictLookup("EF", &obj1)->isDict()) {
+      if (!obj1.dictLookupNF("F", &fileStream)->isRef()) {
+        ok = gFalse;
+        fileStream.free();
+        error(errSyntaxError, -1, "Invalid FileSpec: Embedded file stream is not an indirect reference");
+        obj1.free();
+        return;
+      }
+    }
+    obj1.free();
+  }
+
+  if (fileSpec.dictLookup("Desc", &obj1)->isString())
+    desc = obj1.getString()->copy();
+  obj1.free();
+}
+
+FileSpec::~FileSpec()
+{
+  fileSpec.free();
+  fileStream.free();
+  delete fileName;
+  delete platformFileName;
+  delete embFile;
+  delete desc;
+}
+
+EmbFile *FileSpec::getEmbeddedFile()
+{
+  if(!ok)
+    return NULL;
+
+  if (embFile)
+    return embFile;
+
+  Object obj1;
+  XRef *xref = fileSpec.getDict()->getXRef();
+  embFile = new EmbFile(fileStream.fetch(xref, &obj1));
+  obj1.free();
+
+  return embFile;
+}
+
+GooString *FileSpec::getFileNameForPlatform()
+{
+  if (platformFileName)
+    return platformFileName;
+
+  Object obj1;
+  if (getFileSpecNameForPlatform(&fileSpec, &obj1))
+    platformFileName = obj1.getString()->copy();
+  obj1.free();
+
+  return platformFileName;
+}
+
+GBool getFileSpecName (Object *fileSpec, Object *fileName)
+{
+  if (fileSpec->isString()) {
+    fileSpec->copy(fileName);
+    return gTrue;
+  }
+  
+  if (fileSpec->isDict()) {
+    fileSpec->dictLookup("UF", fileName);
+    if (fileName->isString()) {
+      return gTrue;
+    }
+    fileName->free();
+    fileSpec->dictLookup("F", fileName);
+    if (fileName->isString()) {
+      return gTrue;
+    }
+    fileName->free();
+    fileSpec->dictLookup("DOS", fileName);
+    if (fileName->isString()) {
+      return gTrue;
+    }
+    fileName->free();
+    fileSpec->dictLookup("Mac", fileName);
+    if (fileName->isString()) {
+      return gTrue;
+    }
+    fileName->free();
+    fileSpec->dictLookup("Unix", fileName);
+    if (fileName->isString()) {
+      return gTrue;
+    }
+    fileName->free();
+  }
+  return gFalse;
+}
+
+GBool getFileSpecNameForPlatform (Object *fileSpec, Object *fileName)
+{
+  if (fileSpec->isString()) {
+    fileSpec->copy(fileName);
+    return gTrue;
+  }
+
+  if (fileSpec->isDict()) {
+    if (!fileSpec->dictLookup("UF", fileName)->isString ()) {
+      fileName->free();
+      if (!fileSpec->dictLookup("F", fileName)->isString ()) {
+        fileName->free();
+#ifdef _WIN32
+       char *platform = "DOS";
+#else
+       const char *platform = "Unix";
+#endif
+       if (!fileSpec->dictLookup(platform, fileName)->isString ()) {
+         fileName->free();
+         error(errSyntaxError, -1, "Illegal file spec");
+         return gFalse;
+       }
+      }
+    }
+  } else {
+    error(errSyntaxError, -1, "Illegal file spec");
+    return gFalse;
+  }
+
+  // system-dependent path manipulation
+#ifdef _WIN32
+  int i, j;
+  GooString *name = fileName->getString();
+  // "//...."             --> "\...."
+  // "/x/...."            --> "x:\...."
+  // "/server/share/...." --> "\\server\share\...."
+  // convert escaped slashes to slashes and unescaped slashes to backslashes
+  i = 0;
+  if (name->getChar(0) == '/') {
+    if (name->getLength() >= 2 && name->getChar(1) == '/') {
+      name->del(0);
+      i = 0;
+    } else if (name->getLength() >= 2 &&
+              ((name->getChar(1) >= 'a' && name->getChar(1) <= 'z') ||
+               (name->getChar(1) >= 'A' && name->getChar(1) <= 'Z')) &&
+              (name->getLength() == 2 || name->getChar(2) == '/')) {
+      name->setChar(0, name->getChar(1));
+      name->setChar(1, ':');
+      i = 2;
+    } else {
+      for (j = 2; j < name->getLength(); ++j) {
+        if (name->getChar(j-1) != '\\' &&
+           name->getChar(j) == '/') {
+         break;
+       }
+      }
+      if (j < name->getLength()) {
+        name->setChar(0, '\\');
+       name->insert(0, '\\');
+       i = 2;
+      }
+    }
+  }
+  for (; i < name->getLength(); ++i) {
+    if (name->getChar(i) == '/') {
+      name->setChar(i, '\\');
+    } else if (name->getChar(i) == '\\' &&
+              i+1 < name->getLength() &&
+              name->getChar(i+1) == '/') {
+      name->del(i);
+    }
+  }
+#endif /* _WIN32 */
+
+  return gTrue;
+}
diff --git a/poppler/FileSpec.h b/poppler/FileSpec.h
new file mode 100644 (file)
index 0000000..9f2f6fc
--- /dev/null
@@ -0,0 +1,76 @@
+//========================================================================
+//
+// FileSpec.h
+//
+// All changes made under the Poppler project to this file are licensed
+// under GPL version 2 or later
+//
+// Copyright (C) 2008 Carlos Garcia Campos <carlosgc@gnome.org>
+//
+// To see a description of the changes please see the Changelog file that
+// came with your tarball or type make ChangeLog if you are building from git
+//
+//========================================================================
+
+#ifndef FILE_SPEC_H
+#define FILE_SPEC_H
+
+#ifdef USE_GCC_PRAGMAS
+#pragma interface
+#endif
+
+#include "Object.h"
+
+class EmbFile {
+public:
+  EmbFile(Object *efStream);
+  ~EmbFile();
+
+  int size() { return m_size; }
+  GooString *modDate() { return m_modDate; }
+  GooString *createDate() { return m_createDate; }
+  GooString *checksum() { return m_checksum; }
+  GooString *mimeType() { return m_mimetype; }
+  Stream *stream() { return isOk() ? m_objStr.getStream() : NULL; }
+  GBool isOk() { return m_objStr.isStream(); }
+  GBool save(const char *path);
+
+private:
+  GBool save2(FILE *f);
+
+  int m_size;
+  GooString *m_createDate;
+  GooString *m_modDate;
+  GooString *m_checksum;
+  GooString *m_mimetype;
+  Object m_objStr;
+};
+
+class FileSpec {
+public:
+  FileSpec(Object *fileSpec);
+  ~FileSpec();
+
+  GBool isOk() { return ok; }
+
+  GooString *getFileName() const { return fileName; }
+  GooString *getFileNameForPlatform();
+  GooString *getDescription() const { return desc; }
+  EmbFile *getEmbeddedFile();
+
+private:
+  GBool ok;
+
+  Object fileSpec;
+
+  GooString *fileName;         // F, UF, DOS, Mac, Unix
+  GooString *platformFileName;
+  Object fileStream;           // Ref to F entry in UF
+  EmbFile *embFile;
+  GooString *desc;             // Desc
+};
+
+GBool getFileSpecName (Object *fileSpec, Object *fileName);
+GBool getFileSpecNameForPlatform (Object *fileSpec, Object *fileName);
+
+#endif /* FILE_SPEC_H */
diff --git a/poppler/FlateStream.cc b/poppler/FlateStream.cc
new file mode 100644 (file)
index 0000000..7990dad
--- /dev/null
@@ -0,0 +1,128 @@
+//========================================================================
+//
+// FlateStream.cc
+//
+// Copyright (C) 2005, Jeff Muizelaar <jeff@infidigm.net>
+// Copyright (C) 2010, Albert Astals Cid <aacid@kde.org>
+//
+// This file is under the GPLv2 or later license
+//
+//========================================================================
+#include "FlateStream.h"
+FlateStream::FlateStream(Stream *strA, int predictor, int columns, int colors, int bits) :
+  FilterStream(strA)
+{
+  if (predictor != 1) {
+    pred = new StreamPredictor(this, predictor, columns, colors, bits);
+  } else {
+    pred = NULL;
+  }
+  out_pos = 0;
+  memset(&d_stream, 0, sizeof(d_stream));
+  inflateInit(&d_stream);
+}
+
+FlateStream::~FlateStream() {
+  inflateEnd(&d_stream);
+  delete pred;
+  delete str;
+}
+
+void FlateStream::reset() {
+  //FIXME: what are the semantics of reset?
+  //i.e. how much intialization has to happen in the constructor?
+
+  /* reinitialize zlib */
+  inflateEnd(&d_stream);
+  memset(&d_stream, 0, sizeof(d_stream));
+  inflateInit(&d_stream);
+
+  str->reset();
+  d_stream.avail_in = 0;
+  status = Z_OK;
+  out_pos = 0;
+  out_buf_len = 0;
+}
+
+int FlateStream::getRawChar() {
+  return doGetRawChar();
+}
+
+void FlateStream::getRawChars(int nChars, int *buffer) {
+  for (int i = 0; i < nChars; ++i)
+    buffer[i] = doGetRawChar();
+}
+
+int FlateStream::getChar() {
+  if (pred)
+    return pred->getChar();
+  else
+    return getRawChar();
+}
+
+int FlateStream::lookChar() {
+  if (pred)
+    return pred->lookChar();
+
+  if (fill_buffer())
+    return EOF;
+
+  return out_buf[out_pos];
+}
+
+int FlateStream::fill_buffer() {
+  /* only fill the buffer if it has all been used */
+  if (out_pos >= out_buf_len) {
+    /* check if the flatestream has been exhausted */
+    if (status == Z_STREAM_END) {
+      return -1;
+    }
+
+    /* set to the begining of out_buf */
+    d_stream.avail_out = sizeof(out_buf);
+    d_stream.next_out = out_buf;
+    out_pos = 0;
+
+    while (1) {
+      /* buffer is empty so we need to fill it */
+      if (d_stream.avail_in == 0) {
+       int c;
+       /* read from the source stream */
+       while (d_stream.avail_in < sizeof(in_buf) && (c = str->getChar()) != EOF) {
+         in_buf[d_stream.avail_in++] = c;
+       }
+       d_stream.next_in = in_buf;
+      }
+
+      /* keep decompressing until we can't anymore */
+      if (d_stream.avail_out == 0 || d_stream.avail_in == 0 || (status != Z_OK && status != Z_BUF_ERROR))
+       break;
+      status = inflate(&d_stream, Z_SYNC_FLUSH);
+    }
+
+    out_buf_len = sizeof(out_buf) - d_stream.avail_out;
+    if (status != Z_OK && status != Z_STREAM_END)
+      return -1;
+    if (!out_buf_len)
+      return -1;
+  }
+
+  return 0;
+}
+
+GooString *FlateStream::getPSFilter(int psLevel, const char *indent) {
+  GooString *s;
+
+  if (psLevel < 3 || pred) {
+    return NULL;
+  }
+  if (!(s = str->getPSFilter(psLevel, indent))) {
+    return NULL;
+  }
+  s->append(indent)->append("<< >> /FlateDecode filter\n");
+  return s;
+}
+
+GBool FlateStream::isBinary(GBool last) {
+  return str->isBinary(gTrue);
+}
diff --git a/poppler/FlateStream.h b/poppler/FlateStream.h
new file mode 100644 (file)
index 0000000..9e3835f
--- /dev/null
@@ -0,0 +1,77 @@
+//========================================================================
+//
+// FlateStream.h
+//
+// Copyright (C) 2005, Jeff Muizelaar <jeff@infidigm.net>
+// Copyright (C) 2010, 2011, Albert Astals Cid <aacid@kde.org>
+//
+// This file is under the GPLv2 or later license
+//
+//========================================================================
+
+#ifndef FLATESTREAM_H
+#define FLATESTREAM_H
+
+#ifdef USE_GCC_PRAGMAS
+#pragma interface
+#endif
+
+
+#ifdef USE_GCC_PRAGMAS
+#pragma implementation
+#endif
+
+#include "poppler-config.h"
+#include <stdio.h>
+#include <stdlib.h>
+#include <stddef.h>
+#ifdef HAVE_UNISTD_H
+#include <unistd.h>
+#endif
+#include <string.h>
+#include <ctype.h>
+#include "goo/gmem.h"
+#include "goo/gfile.h"
+#include "Error.h"
+#include "Object.h"
+#include "Decrypt.h"
+#include "Stream.h"
+
+extern "C" {
+#include <zlib.h>
+}
+
+class FlateStream: public FilterStream {
+public:
+
+  FlateStream(Stream *strA, int predictor, int columns, int colors, int bits);
+  virtual ~FlateStream();
+  virtual StreamKind getKind() { return strFlate; }
+  virtual void reset();
+  virtual int getChar();
+  virtual int lookChar();
+  virtual int getRawChar();
+  virtual void getRawChars(int nChars, int *buffer);
+  virtual GooString *getPSFilter(int psLevel, const char *indent);
+  virtual GBool isBinary(GBool last = gTrue);
+
+private:
+  inline int doGetRawChar() {
+    if (fill_buffer())
+      return EOF;
+
+    return out_buf[out_pos++];
+  }
+
+  int fill_buffer(void);
+  z_stream d_stream;
+  StreamPredictor *pred;
+  int status;
+  /* in_buf currently needs to be 1 or we over read from EmbedStreams */
+  unsigned char in_buf[1];
+  unsigned char out_buf[4096];
+  int out_pos;
+  int out_buf_len;
+};
+
+#endif
diff --git a/poppler/FontEncodingTables.cc b/poppler/FontEncodingTables.cc
new file mode 100644 (file)
index 0000000..6ebef78
--- /dev/null
@@ -0,0 +1,1824 @@
+//========================================================================
+//
+// FontEncodingTables.cc
+//
+// Copyright 2001-2003 Glyph & Cog, LLC
+//
+//========================================================================
+
+#include <config.h>
+#include <stdlib.h>
+#include "FontEncodingTables.h"
+
+const char *macRomanEncoding[256] = {
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  "space",
+  "exclam",
+  "quotedbl",
+  "numbersign",
+  "dollar",
+  "percent",
+  "ampersand",
+  "quotesingle",
+  "parenleft",
+  "parenright",
+  "asterisk",
+  "plus",
+  "comma",
+  "hyphen",
+  "period",
+  "slash",
+  "zero",
+  "one",
+  "two",
+  "three",
+  "four",
+  "five",
+  "six",
+  "seven",
+  "eight",
+  "nine",
+  "colon",
+  "semicolon",
+  "less",
+  "equal",
+  "greater",
+  "question",
+  "at",
+  "A",
+  "B",
+  "C",
+  "D",
+  "E",
+  "F",
+  "G",
+  "H",
+  "I",
+  "J",
+  "K",
+  "L",
+  "M",
+  "N",
+  "O",
+  "P",
+  "Q",
+  "R",
+  "S",
+  "T",
+  "U",
+  "V",
+  "W",
+  "X",
+  "Y",
+  "Z",
+  "bracketleft",
+  "backslash",
+  "bracketright",
+  "asciicircum",
+  "underscore",
+  "grave",
+  "a",
+  "b",
+  "c",
+  "d",
+  "e",
+  "f",
+  "g",
+  "h",
+  "i",
+  "j",
+  "k",
+  "l",
+  "m",
+  "n",
+  "o",
+  "p",
+  "q",
+  "r",
+  "s",
+  "t",
+  "u",
+  "v",
+  "w",
+  "x",
+  "y",
+  "z",
+  "braceleft",
+  "bar",
+  "braceright",
+  "asciitilde",
+  NULL,
+  "Adieresis",
+  "Aring",
+  "Ccedilla",
+  "Eacute",
+  "Ntilde",
+  "Odieresis",
+  "Udieresis",
+  "aacute",
+  "agrave",
+  "acircumflex",
+  "adieresis",
+  "atilde",
+  "aring",
+  "ccedilla",
+  "eacute",
+  "egrave",
+  "ecircumflex",
+  "edieresis",
+  "iacute",
+  "igrave",
+  "icircumflex",
+  "idieresis",
+  "ntilde",
+  "oacute",
+  "ograve",
+  "ocircumflex",
+  "odieresis",
+  "otilde",
+  "uacute",
+  "ugrave",
+  "ucircumflex",
+  "udieresis",
+  "dagger",
+  "degree",
+  "cent",
+  "sterling",
+  "section",
+  "bullet",
+  "paragraph",
+  "germandbls",
+  "registered",
+  "copyright",
+  "trademark",
+  "acute",
+  "dieresis",
+  "notequal",
+  "AE",
+  "Oslash",
+  "infinity",
+  "plusminus",
+  "lessequal",
+  "greaterequal",
+  "yen",
+  "mu",
+  "partialdiff",
+  "summation",
+  "product",
+  "pi",
+  "integral",
+  "ordfeminine",
+  "ordmasculine",
+  "Omega",
+  "ae",
+  "oslash",
+  "questiondown",
+  "exclamdown",
+  "logicalnot",
+  "radical",
+  "florin",
+  "approxequal",
+  "Delta",
+  "guillemotleft",
+  "guillemotright",
+  "ellipsis",
+  "space",
+  "Agrave",
+  "Atilde",
+  "Otilde",
+  "OE",
+  "oe",
+  "endash",
+  "emdash",
+  "quotedblleft",
+  "quotedblright",
+  "quoteleft",
+  "quoteright",
+  "divide",
+  "lozenge",
+  "ydieresis",
+  "Ydieresis",
+  "fraction",
+  "currency",
+  "guilsinglleft",
+  "guilsinglright",
+  "fi",
+  "fl",
+  "daggerdbl",
+  "periodcentered",
+  "quotesinglbase",
+  "quotedblbase",
+  "perthousand",
+  "Acircumflex",
+  "Ecircumflex",
+  "Aacute",
+  "Edieresis",
+  "Egrave",
+  "Iacute",
+  "Icircumflex",
+  "Idieresis",
+  "Igrave",
+  "Oacute",
+  "Ocircumflex",
+  "apple",
+  "Ograve",
+  "Uacute",
+  "Ucircumflex",
+  "Ugrave",
+  "dotlessi",
+  "circumflex",
+  "tilde",
+  "macron",
+  "breve",
+  "dotaccent",
+  "ring",
+  "cedilla",
+  "hungarumlaut",
+  "ogonek",
+  "caron"
+};
+
+const char *macExpertEncoding[256] = {
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  "space",
+  "exclamsmall",
+  "Hungarumlautsmall",
+  "centoldstyle",
+  "dollaroldstyle",
+  "dollarsuperior",
+  "ampersandsmall",
+  "Acutesmall",
+  "parenleftsuperior",
+  "parenrightsuperior",
+  "twodotenleader",
+  "onedotenleader",
+  "comma",
+  "hyphen",
+  "period",
+  "fraction",
+  "zerooldstyle",
+  "oneoldstyle",
+  "twooldstyle",
+  "threeoldstyle",
+  "fouroldstyle",
+  "fiveoldstyle",
+  "sixoldstyle",
+  "sevenoldstyle",
+  "eightoldstyle",
+  "nineoldstyle",
+  "colon",
+  "semicolon",
+  NULL,
+  "threequartersemdash",
+  NULL,
+  "questionsmall",
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  "Ethsmall",
+  NULL,
+  NULL,
+  "onequarter",
+  "onehalf",
+  "threequarters",
+  "oneeighth",
+  "threeeighths",
+  "fiveeighths",
+  "seveneighths",
+  "onethird",
+  "twothirds",
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  "ff",
+  "fi",
+  "fl",
+  "ffi",
+  "ffl",
+  "parenleftinferior",
+  NULL,
+  "parenrightinferior",
+  "Circumflexsmall",
+  "hypheninferior",
+  "Gravesmall",
+  "Asmall",
+  "Bsmall",
+  "Csmall",
+  "Dsmall",
+  "Esmall",
+  "Fsmall",
+  "Gsmall",
+  "Hsmall",
+  "Ismall",
+  "Jsmall",
+  "Ksmall",
+  "Lsmall",
+  "Msmall",
+  "Nsmall",
+  "Osmall",
+  "Psmall",
+  "Qsmall",
+  "Rsmall",
+  "Ssmall",
+  "Tsmall",
+  "Usmall",
+  "Vsmall",
+  "Wsmall",
+  "Xsmall",
+  "Ysmall",
+  "Zsmall",
+  "colonmonetary",
+  "onefitted",
+  "rupiah",
+  "Tildesmall",
+  NULL,
+  NULL,
+  "asuperior",
+  "centsuperior",
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  "Aacutesmall",
+  "Agravesmall",
+  "Acircumflexsmall",
+  "Adieresissmall",
+  "Atildesmall",
+  "Aringsmall",
+  "Ccedillasmall",
+  "Eacutesmall",
+  "Egravesmall",
+  "Ecircumflexsmall",
+  "Edieresissmall",
+  "Iacutesmall",
+  "Igravesmall",
+  "Icircumflexsmall",
+  "Idieresissmall",
+  "Ntildesmall",
+  "Oacutesmall",
+  "Ogravesmall",
+  "Ocircumflexsmall",
+  "Odieresissmall",
+  "Otildesmall",
+  "Uacutesmall",
+  "Ugravesmall",
+  "Ucircumflexsmall",
+  "Udieresissmall",
+  NULL,
+  "eightsuperior",
+  "fourinferior",
+  "threeinferior",
+  "sixinferior",
+  "eightinferior",
+  "seveninferior",
+  "Scaronsmall",
+  NULL,
+  "centinferior",
+  "twoinferior",
+  NULL,
+  "Dieresissmall",
+  NULL,
+  "Caronsmall",
+  "osuperior",
+  "fiveinferior",
+  NULL,
+  "commainferior",
+  "periodinferior",
+  "Yacutesmall",
+  NULL,
+  "dollarinferior",
+  NULL,
+  NULL,
+  "Thornsmall",
+  NULL,
+  "nineinferior",
+  "zeroinferior",
+  "Zcaronsmall",
+  "AEsmall",
+  "Oslashsmall",
+  "questiondownsmall",
+  "oneinferior",
+  "Lslashsmall",
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  "Cedillasmall",
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  "OEsmall",
+  "figuredash",
+  "hyphensuperior",
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  "exclamdownsmall",
+  NULL,
+  "Ydieresissmall",
+  NULL,
+  "onesuperior",
+  "twosuperior",
+  "threesuperior",
+  "foursuperior",
+  "fivesuperior",
+  "sixsuperior",
+  "sevensuperior",
+  "ninesuperior",
+  "zerosuperior",
+  NULL,
+  "esuperior",
+  "rsuperior",
+  "tsuperior",
+  NULL,
+  NULL,
+  "isuperior",
+  "ssuperior",
+  "dsuperior",
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  "lsuperior",
+  "Ogoneksmall",
+  "Brevesmall",
+  "Macronsmall",
+  "bsuperior",
+  "nsuperior",
+  "msuperior",
+  "commasuperior",
+  "periodsuperior",
+  "Dotaccentsmall",
+  "Ringsmall",
+  NULL,
+  NULL,
+  NULL,
+  NULL
+};
+
+const char *winAnsiEncoding[256] = {
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  "space",
+  "exclam",
+  "quotedbl",
+  "numbersign",
+  "dollar",
+  "percent",
+  "ampersand",
+  "quotesingle",
+  "parenleft",
+  "parenright",
+  "asterisk",
+  "plus",
+  "comma",
+  "hyphen",
+  "period",
+  "slash",
+  "zero",
+  "one",
+  "two",
+  "three",
+  "four",
+  "five",
+  "six",
+  "seven",
+  "eight",
+  "nine",
+  "colon",
+  "semicolon",
+  "less",
+  "equal",
+  "greater",
+  "question",
+  "at",
+  "A",
+  "B",
+  "C",
+  "D",
+  "E",
+  "F",
+  "G",
+  "H",
+  "I",
+  "J",
+  "K",
+  "L",
+  "M",
+  "N",
+  "O",
+  "P",
+  "Q",
+  "R",
+  "S",
+  "T",
+  "U",
+  "V",
+  "W",
+  "X",
+  "Y",
+  "Z",
+  "bracketleft",
+  "backslash",
+  "bracketright",
+  "asciicircum",
+  "underscore",
+  "grave",
+  "a",
+  "b",
+  "c",
+  "d",
+  "e",
+  "f",
+  "g",
+  "h",
+  "i",
+  "j",
+  "k",
+  "l",
+  "m",
+  "n",
+  "o",
+  "p",
+  "q",
+  "r",
+  "s",
+  "t",
+  "u",
+  "v",
+  "w",
+  "x",
+  "y",
+  "z",
+  "braceleft",
+  "bar",
+  "braceright",
+  "asciitilde",
+  "bullet",
+  "Euro",
+  "bullet",
+  "quotesinglbase",
+  "florin",
+  "quotedblbase",
+  "ellipsis",
+  "dagger",
+  "daggerdbl",
+  "circumflex",
+  "perthousand",
+  "Scaron",
+  "guilsinglleft",
+  "OE",
+  "bullet",
+  "Zcaron",
+  "bullet",
+  "bullet",
+  "quoteleft",
+  "quoteright",
+  "quotedblleft",
+  "quotedblright",
+  "bullet",
+  "endash",
+  "emdash",
+  "tilde",
+  "trademark",
+  "scaron",
+  "guilsinglright",
+  "oe",
+  "bullet",
+  "zcaron",
+  "Ydieresis",
+  "space",
+  "exclamdown",
+  "cent",
+  "sterling",
+  "currency",
+  "yen",
+  "brokenbar",
+  "section",
+  "dieresis",
+  "copyright",
+  "ordfeminine",
+  "guillemotleft",
+  "logicalnot",
+  "hyphen",
+  "registered",
+  "macron",
+  "degree",
+  "plusminus",
+  "twosuperior",
+  "threesuperior",
+  "acute",
+  "mu",
+  "paragraph",
+  "periodcentered",
+  "cedilla",
+  "onesuperior",
+  "ordmasculine",
+  "guillemotright",
+  "onequarter",
+  "onehalf",
+  "threequarters",
+  "questiondown",
+  "Agrave",
+  "Aacute",
+  "Acircumflex",
+  "Atilde",
+  "Adieresis",
+  "Aring",
+  "AE",
+  "Ccedilla",
+  "Egrave",
+  "Eacute",
+  "Ecircumflex",
+  "Edieresis",
+  "Igrave",
+  "Iacute",
+  "Icircumflex",
+  "Idieresis",
+  "Eth",
+  "Ntilde",
+  "Ograve",
+  "Oacute",
+  "Ocircumflex",
+  "Otilde",
+  "Odieresis",
+  "multiply",
+  "Oslash",
+  "Ugrave",
+  "Uacute",
+  "Ucircumflex",
+  "Udieresis",
+  "Yacute",
+  "Thorn",
+  "germandbls",
+  "agrave",
+  "aacute",
+  "acircumflex",
+  "atilde",
+  "adieresis",
+  "aring",
+  "ae",
+  "ccedilla",
+  "egrave",
+  "eacute",
+  "ecircumflex",
+  "edieresis",
+  "igrave",
+  "iacute",
+  "icircumflex",
+  "idieresis",
+  "eth",
+  "ntilde",
+  "ograve",
+  "oacute",
+  "ocircumflex",
+  "otilde",
+  "odieresis",
+  "divide",
+  "oslash",
+  "ugrave",
+  "uacute",
+  "ucircumflex",
+  "udieresis",
+  "yacute",
+  "thorn",
+  "ydieresis"
+};
+
+const char *standardEncoding[256] = {
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  "space",
+  "exclam",
+  "quotedbl",
+  "numbersign",
+  "dollar",
+  "percent",
+  "ampersand",
+  "quoteright",
+  "parenleft",
+  "parenright",
+  "asterisk",
+  "plus",
+  "comma",
+  "hyphen",
+  "period",
+  "slash",
+  "zero",
+  "one",
+  "two",
+  "three",
+  "four",
+  "five",
+  "six",
+  "seven",
+  "eight",
+  "nine",
+  "colon",
+  "semicolon",
+  "less",
+  "equal",
+  "greater",
+  "question",
+  "at",
+  "A",
+  "B",
+  "C",
+  "D",
+  "E",
+  "F",
+  "G",
+  "H",
+  "I",
+  "J",
+  "K",
+  "L",
+  "M",
+  "N",
+  "O",
+  "P",
+  "Q",
+  "R",
+  "S",
+  "T",
+  "U",
+  "V",
+  "W",
+  "X",
+  "Y",
+  "Z",
+  "bracketleft",
+  "backslash",
+  "bracketright",
+  "asciicircum",
+  "underscore",
+  "quoteleft",
+  "a",
+  "b",
+  "c",
+  "d",
+  "e",
+  "f",
+  "g",
+  "h",
+  "i",
+  "j",
+  "k",
+  "l",
+  "m",
+  "n",
+  "o",
+  "p",
+  "q",
+  "r",
+  "s",
+  "t",
+  "u",
+  "v",
+  "w",
+  "x",
+  "y",
+  "z",
+  "braceleft",
+  "bar",
+  "braceright",
+  "asciitilde",
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  "exclamdown",
+  "cent",
+  "sterling",
+  "fraction",
+  "yen",
+  "florin",
+  "section",
+  "currency",
+  "quotesingle",
+  "quotedblleft",
+  "guillemotleft",
+  "guilsinglleft",
+  "guilsinglright",
+  "fi",
+  "fl",
+  NULL,
+  "endash",
+  "dagger",
+  "daggerdbl",
+  "periodcentered",
+  NULL,
+  "paragraph",
+  "bullet",
+  "quotesinglbase",
+  "quotedblbase",
+  "quotedblright",
+  "guillemotright",
+  "ellipsis",
+  "perthousand",
+  NULL,
+  "questiondown",
+  NULL,
+  "grave",
+  "acute",
+  "circumflex",
+  "tilde",
+  "macron",
+  "breve",
+  "dotaccent",
+  "dieresis",
+  NULL,
+  "ring",
+  "cedilla",
+  NULL,
+  "hungarumlaut",
+  "ogonek",
+  "caron",
+  "emdash",
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  "AE",
+  NULL,
+  "ordfeminine",
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  "Lslash",
+  "Oslash",
+  "OE",
+  "ordmasculine",
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  "ae",
+  NULL,
+  NULL,
+  NULL,
+  "dotlessi",
+  NULL,
+  NULL,
+  "lslash",
+  "oslash",
+  "oe",
+  "germandbls",
+  NULL,
+  NULL,
+  NULL,
+  NULL
+};
+
+const char *expertEncoding[256] = {
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  "space",
+  "exclamsmall",
+  "Hungarumlautsmall",
+  NULL,
+  "dollaroldstyle",
+  "dollarsuperior",
+  "ampersandsmall",
+  "Acutesmall",
+  "parenleftsuperior",
+  "parenrightsuperior",
+  "twodotenleader",
+  "onedotenleader",
+  "comma",
+  "hyphen",
+  "period",
+  "fraction",
+  "zerooldstyle",
+  "oneoldstyle",
+  "twooldstyle",
+  "threeoldstyle",
+  "fouroldstyle",
+  "fiveoldstyle",
+  "sixoldstyle",
+  "sevenoldstyle",
+  "eightoldstyle",
+  "nineoldstyle",
+  "colon",
+  "semicolon",
+  "commasuperior",
+  "threequartersemdash",
+  "periodsuperior",
+  "questionsmall",
+  NULL,
+  "asuperior",
+  "bsuperior",
+  "centsuperior",
+  "dsuperior",
+  "esuperior",
+  NULL,
+  NULL,
+  NULL,
+  "isuperior",
+  NULL,
+  NULL,
+  "lsuperior",
+  "msuperior",
+  "nsuperior",
+  "osuperior",
+  NULL,
+  NULL,
+  "rsuperior",
+  "ssuperior",
+  "tsuperior",
+  NULL,
+  "ff",
+  "fi",
+  "fl",
+  "ffi",
+  "ffl",
+  "parenleftinferior",
+  NULL,
+  "parenrightinferior",
+  "Circumflexsmall",
+  "hyphensuperior",
+  "Gravesmall",
+  "Asmall",
+  "Bsmall",
+  "Csmall",
+  "Dsmall",
+  "Esmall",
+  "Fsmall",
+  "Gsmall",
+  "Hsmall",
+  "Ismall",
+  "Jsmall",
+  "Ksmall",
+  "Lsmall",
+  "Msmall",
+  "Nsmall",
+  "Osmall",
+  "Psmall",
+  "Qsmall",
+  "Rsmall",
+  "Ssmall",
+  "Tsmall",
+  "Usmall",
+  "Vsmall",
+  "Wsmall",
+  "Xsmall",
+  "Ysmall",
+  "Zsmall",
+  "colonmonetary",
+  "onefitted",
+  "rupiah",
+  "Tildesmall",
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  "exclamdownsmall",
+  "centoldstyle",
+  "Lslashsmall",
+  NULL,
+  NULL,
+  "Scaronsmall",
+  "Zcaronsmall",
+  "Dieresissmall",
+  "Brevesmall",
+  "Caronsmall",
+  NULL,
+  "Dotaccentsmall",
+  NULL,
+  NULL,
+  "Macronsmall",
+  NULL,
+  NULL,
+  "figuredash",
+  "hypheninferior",
+  NULL,
+  NULL,
+  "Ogoneksmall",
+  "Ringsmall",
+  "Cedillasmall",
+  NULL,
+  NULL,
+  NULL,
+  "onequarter",
+  "onehalf",
+  "threequarters",
+  "questiondownsmall",
+  "oneeighth",
+  "threeeighths",
+  "fiveeighths",
+  "seveneighths",
+  "onethird",
+  "twothirds",
+  NULL,
+  NULL,
+  "zerosuperior",
+  "onesuperior",
+  "twosuperior",
+  "threesuperior",
+  "foursuperior",
+  "fivesuperior",
+  "sixsuperior",
+  "sevensuperior",
+  "eightsuperior",
+  "ninesuperior",
+  "zeroinferior",
+  "oneinferior",
+  "twoinferior",
+  "threeinferior",
+  "fourinferior",
+  "fiveinferior",
+  "sixinferior",
+  "seveninferior",
+  "eightinferior",
+  "nineinferior",
+  "centinferior",
+  "dollarinferior",
+  "periodinferior",
+  "commainferior",
+  "Agravesmall",
+  "Aacutesmall",
+  "Acircumflexsmall",
+  "Atildesmall",
+  "Adieresissmall",
+  "Aringsmall",
+  "AEsmall",
+  "Ccedillasmall",
+  "Egravesmall",
+  "Eacutesmall",
+  "Ecircumflexsmall",
+  "Edieresissmall",
+  "Igravesmall",
+  "Iacutesmall",
+  "Icircumflexsmall",
+  "Idieresissmall",
+  "Ethsmall",
+  "Ntildesmall",
+  "Ogravesmall",
+  "Oacutesmall",
+  "Ocircumflexsmall",
+  "Otildesmall",
+  "Odieresissmall",
+  "OEsmall",
+  "Oslashsmall",
+  "Ugravesmall",
+  "Uacutesmall",
+  "Ucircumflexsmall",
+  "Udieresissmall",
+  "Yacutesmall",
+  "Thornsmall",
+  "Ydieresissmall"
+};
+
+const char *symbolEncoding[256] = {
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  "space",
+  "exclam",
+  "universal",
+  "numbersign",
+  "existential",
+  "percent",
+  "ampersand",
+  "suchthat",
+  "parenleft",
+  "parenright",
+  "asteriskmath",
+  "plus",
+  "comma",
+  "minus",
+  "period",
+  "slash",
+  "zero",
+  "one",
+  "two",
+  "three",
+  "four",
+  "five",
+  "six",
+  "seven",
+  "eight",
+  "nine",
+  "colon",
+  "semicolon",
+  "less",
+  "equal",
+  "greater",
+  "question",
+  "congruent",
+  "Alpha",
+  "Beta",
+  "Chi",
+  "Delta",
+  "Epsilon",
+  "Phi",
+  "Gamma",
+  "Eta",
+  "Iota",
+  "theta1",
+  "Kappa",
+  "Lambda",
+  "Mu",
+  "Nu",
+  "Omicron",
+  "Pi",
+  "Theta",
+  "Rho",
+  "Sigma",
+  "Tau",
+  "Upsilon",
+  "sigma1",
+  "Omega",
+  "Xi",
+  "Psi",
+  "Zeta",
+  "bracketleft",
+  "therefore",
+  "bracketright",
+  "perpendicular",
+  "underscore",
+  "radicalex",
+  "alpha",
+  "beta",
+  "chi",
+  "delta",
+  "epsilon",
+  "phi",
+  "gamma",
+  "eta",
+  "iota",
+  "phi1",
+  "kappa",
+  "lambda",
+  "mu",
+  "nu",
+  "omicron",
+  "pi",
+  "theta",
+  "rho",
+  "sigma",
+  "tau",
+  "upsilon",
+  "omega1",
+  "omega",
+  "xi",
+  "psi",
+  "zeta",
+  "braceleft",
+  "bar",
+  "braceright",
+  "similar",
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  "Upsilon1",
+  "minute",
+  "lessequal",
+  "fraction",
+  "infinity",
+  "florin",
+  "club",
+  "diamond",
+  "heart",
+  "spade",
+  "arrowboth",
+  "arrowleft",
+  "arrowup",
+  "arrowright",
+  "arrowdown",
+  "degree",
+  "plusminus",
+  "second",
+  "greaterequal",
+  "multiply",
+  "proportional",
+  "partialdiff",
+  "bullet",
+  "divide",
+  "notequal",
+  "equivalence",
+  "approxequal",
+  "ellipsis",
+  "arrowvertex",
+  "arrowhorizex",
+  "carriagereturn",
+  "aleph",
+  "Ifraktur",
+  "Rfraktur",
+  "weierstrass",
+  "circlemultiply",
+  "circleplus",
+  "emptyset",
+  "intersection",
+  "union",
+  "propersuperset",
+  "reflexsuperset",
+  "notsubset",
+  "propersubset",
+  "reflexsubset",
+  "element",
+  "notelement",
+  "angle",
+  "gradient",
+  "registerserif",
+  "copyrightserif",
+  "trademarkserif",
+  "product",
+  "radical",
+  "dotmath",
+  "logicalnot",
+  "logicaland",
+  "logicalor",
+  "arrowdblboth",
+  "arrowdblleft",
+  "arrowdblup",
+  "arrowdblright",
+  "arrowdbldown",
+  "lozenge",
+  "angleleft",
+  "registersans",
+  "copyrightsans",
+  "trademarksans",
+  "summation",
+  "parenlefttp",
+  "parenleftex",
+  "parenleftbt",
+  "bracketlefttp",
+  "bracketleftex",
+  "bracketleftbt",
+  "bracelefttp",
+  "braceleftmid",
+  "braceleftbt",
+  "braceex",
+  NULL,
+  "angleright",
+  "integral",
+  "integraltp",
+  "integralex",
+  "integralbt",
+  "parenrighttp",
+  "parenrightex",
+  "parenrightbt",
+  "bracketrighttp",
+  "bracketrightex",
+  "bracketrightbt",
+  "bracerighttp",
+  "bracerightmid",
+  "bracerightbt",
+  NULL
+};
+
+const char *zapfDingbatsEncoding[256] = {
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  "space",
+  "a1",
+  "a2",
+  "a202",
+  "a3",
+  "a4",
+  "a5",
+  "a119",
+  "a118",
+  "a117",
+  "a11",
+  "a12",
+  "a13",
+  "a14",
+  "a15",
+  "a16",
+  "a105",
+  "a17",
+  "a18",
+  "a19",
+  "a20",
+  "a21",
+  "a22",
+  "a23",
+  "a24",
+  "a25",
+  "a26",
+  "a27",
+  "a28",
+  "a6",
+  "a7",
+  "a8",
+  "a9",
+  "a10",
+  "a29",
+  "a30",
+  "a31",
+  "a32",
+  "a33",
+  "a34",
+  "a35",
+  "a36",
+  "a37",
+  "a38",
+  "a39",
+  "a40",
+  "a41",
+  "a42",
+  "a43",
+  "a44",
+  "a45",
+  "a46",
+  "a47",
+  "a48",
+  "a49",
+  "a50",
+  "a51",
+  "a52",
+  "a53",
+  "a54",
+  "a55",
+  "a56",
+  "a57",
+  "a58",
+  "a59",
+  "a60",
+  "a61",
+  "a62",
+  "a63",
+  "a64",
+  "a65",
+  "a66",
+  "a67",
+  "a68",
+  "a69",
+  "a70",
+  "a71",
+  "a72",
+  "a73",
+  "a74",
+  "a203",
+  "a75",
+  "a204",
+  "a76",
+  "a77",
+  "a78",
+  "a79",
+  "a81",
+  "a82",
+  "a83",
+  "a84",
+  "a97",
+  "a98",
+  "a99",
+  "a100",
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  "a101",
+  "a102",
+  "a103",
+  "a104",
+  "a106",
+  "a107",
+  "a108",
+  "a112",
+  "a111",
+  "a110",
+  "a109",
+  "a120",
+  "a121",
+  "a122",
+  "a123",
+  "a124",
+  "a125",
+  "a126",
+  "a127",
+  "a128",
+  "a129",
+  "a130",
+  "a131",
+  "a132",
+  "a133",
+  "a134",
+  "a135",
+  "a136",
+  "a137",
+  "a138",
+  "a139",
+  "a140",
+  "a141",
+  "a142",
+  "a143",
+  "a144",
+  "a145",
+  "a146",
+  "a147",
+  "a148",
+  "a149",
+  "a150",
+  "a151",
+  "a152",
+  "a153",
+  "a154",
+  "a155",
+  "a156",
+  "a157",
+  "a158",
+  "a159",
+  "a160",
+  "a161",
+  "a163",
+  "a164",
+  "a196",
+  "a165",
+  "a192",
+  "a166",
+  "a167",
+  "a168",
+  "a169",
+  "a170",
+  "a171",
+  "a172",
+  "a173",
+  "a162",
+  "a174",
+  "a175",
+  "a176",
+  "a177",
+  "a178",
+  "a179",
+  "a193",
+  "a180",
+  "a199",
+  "a181",
+  "a200",
+  "a182",
+  NULL,
+  "a201",
+  "a183",
+  "a184",
+  "a197",
+  "a185",
+  "a194",
+  "a198",
+  "a186",
+  "a195",
+  "a187",
+  "a188",
+  "a189",
+  "a190",
+  "a191",
+  NULL
+};
diff --git a/poppler/FontEncodingTables.h b/poppler/FontEncodingTables.h
new file mode 100644 (file)
index 0000000..a417b32
--- /dev/null
@@ -0,0 +1,20 @@
+//========================================================================
+//
+// FontEncodingTables.h
+//
+// Copyright 2001-2003 Glyph & Cog, LLC
+//
+//========================================================================
+
+#ifndef FONTENCODINGTABLES_H
+#define FONTENCODINGTABLES_H
+
+extern const char *macRomanEncoding[];
+extern const char *macExpertEncoding[];
+extern const char *winAnsiEncoding[];
+extern const char *standardEncoding[];
+extern const char *expertEncoding[];
+extern const char *symbolEncoding[];
+extern const char *zapfDingbatsEncoding[];
+
+#endif
diff --git a/poppler/FontInfo.cc b/poppler/FontInfo.cc
new file mode 100644 (file)
index 0000000..35d5f5f
--- /dev/null
@@ -0,0 +1,242 @@
+//========================================================================
+//
+// FontInfo.cc
+//
+// Copyright (C) 2005, 2006 Kristian Høgsberg <krh@redhat.com>
+// Copyright (C) 2005-2008, 2010 Albert Astals Cid <aacid@kde.org>
+// Copyright (C) 2005 Brad Hards <bradh@frogmouth.net>
+// Copyright (C) 2006 Kouhei Sutou <kou@cozmixng.org>
+// Copyright (C) 2009 Pino Toscano <pino@kde.org>
+// Copyright (C) 2010 Hib Eris <hib@hiberis.nl>
+// Copyright (C) 2010, 2012 Adrian Johnson <ajohnson@redneon.com>
+// Copyright (C) 2010 Thomas Freitag <Thomas.Freitag@alfa.de>
+// Copyright (C) 2011 Carlos Garcia Campos <carlosgc@gnome.org>
+// Copyright (C) 2012 Fabio D'Urso <fabiodurso@hotmail.it>
+//
+// To see a description of the changes please see the Changelog file that
+// came with your tarball or type make ChangeLog if you are building from git
+//
+//========================================================================
+
+//========================================================================
+//
+// Based on code from pdffonts.cc
+//
+// Copyright 2001-2007 Glyph & Cog, LLC
+//
+//========================================================================
+
+#include "config.h"
+#include <stdio.h>
+#include <stdlib.h>
+#include <stddef.h>
+#include <string.h>
+#include <math.h>
+#include "GlobalParams.h"
+#include "Error.h"
+#include "Object.h"
+#include "Dict.h"
+#include "GfxFont.h"
+#include "Annot.h"
+#include "PDFDoc.h"
+#include "FontInfo.h"
+
+FontInfoScanner::FontInfoScanner(PDFDoc *docA, int firstPage) {
+  doc = docA;
+  currentPage = firstPage + 1;
+}
+
+FontInfoScanner::~FontInfoScanner() {
+}
+
+GooList *FontInfoScanner::scan(int nPages) {
+  GooList *result;
+  Page *page;
+  Dict *resDict;
+  Annots *annots;
+  Object obj1;
+  int lastPage;
+
+  if (currentPage > doc->getNumPages()) {
+    return NULL;
+  }
+  result = new GooList();
+
+  lastPage = currentPage + nPages;
+  if (lastPage > doc->getNumPages() + 1) {
+    lastPage = doc->getNumPages() + 1;
+  }
+
+  for (int pg = currentPage; pg < lastPage; ++pg) {
+    page = doc->getPage(pg);
+    if (!page) continue;
+
+    if ((resDict = page->getResourceDict())) {
+      scanFonts(resDict, result);
+    }
+    annots = page->getAnnots();
+    for (int i = 0; i < annots->getNumAnnots(); ++i) {
+      if (annots->getAnnot(i)->getAppearanceResDict(&obj1)->isDict()) {
+        scanFonts(obj1.getDict(), result);
+      }
+      obj1.free();
+    }
+  }
+
+  currentPage = lastPage;
+
+  return result;
+}
+
+void FontInfoScanner::scanFonts(Dict *resDict, GooList *fontsList) {
+  Object obj1, obj2, objDict, resObj;
+  Ref r;
+  GfxFontDict *gfxFontDict;
+  GfxFont *font;
+  int i;
+
+  // scan the fonts in this resource dictionary
+  gfxFontDict = NULL;
+  resDict->lookupNF("Font", &obj1);
+  if (obj1.isRef()) {
+    obj1.fetch(doc->getXRef(), &obj2);
+    if (obj2.isDict()) {
+      r = obj1.getRef();
+      gfxFontDict = new GfxFontDict(doc->getXRef(), &r, obj2.getDict());
+    }
+    obj2.free();
+  } else if (obj1.isDict()) {
+    gfxFontDict = new GfxFontDict(doc->getXRef(), NULL, obj1.getDict());
+  }
+  if (gfxFontDict) {
+    for (i = 0; i < gfxFontDict->getNumFonts(); ++i) {
+      if ((font = gfxFontDict->getFont(i))) {
+        Ref fontRef = *font->getID();
+
+        // add this font to the list if not already found
+        if (fonts.find(fontRef.num) == fonts.end()) {
+          fontsList->append(new FontInfo(font, doc));
+          fonts.insert(fontRef.num);
+        }
+      }
+    }
+    delete gfxFontDict;
+  }
+  obj1.free();
+
+  // recursively scan any resource dictionaries in objects in this
+  // resource dictionary
+  const char *resTypes[] = { "XObject", "Pattern" };
+  for (Guint resType = 0; resType < sizeof(resTypes) / sizeof(resTypes[0]); ++resType) {
+    resDict->lookup(resTypes[resType], &objDict);
+    if (objDict.isDict()) {
+      for (i = 0; i < objDict.dictGetLength(); ++i) {
+        objDict.dictGetValNF(i, &obj1);
+        if (obj1.isRef()) {
+          // check for an already-seen object
+          const Ref r = obj1.getRef();
+          if (visitedObjects.find(r.num) != visitedObjects.end()) {
+            obj1.free();
+            continue;
+          }
+
+          visitedObjects.insert(r.num);
+        }
+
+        obj1.fetch(doc->getXRef(), &obj2);
+
+        if (obj2.isStream()) {
+          obj2.streamGetDict()->lookup("Resources", &resObj);
+          if (resObj.isDict() && resObj.getDict() != resDict) {
+            scanFonts(resObj.getDict(), fontsList);
+          }
+          resObj.free();
+        }
+        obj1.free();
+        obj2.free();
+      }
+    }
+    objDict.free();
+  }
+}
+
+FontInfo::FontInfo(GfxFont *font, PDFDoc *doc) {
+  GooString *origName;
+  Object fontObj, toUnicodeObj;
+  int i;
+
+  fontRef = *font->getID();
+
+  // font name
+  origName = font->getName();
+  if (origName != NULL) {
+    name = font->getName()->copy();
+  } else {
+    name = NULL;
+  }
+
+  // font type
+  type = (FontInfo::Type)font->getType();
+
+  // check for an embedded font
+  if (font->getType() == fontType3) {
+    emb = gTrue;
+  } else {
+    emb = font->getEmbeddedFontID(&embRef);
+  }
+
+  file = NULL;
+  substituteName = NULL;
+  if (!emb)
+  {
+    SysFontType dummy;
+    int dummy2;
+    GooString substituteNameAux;
+    file = globalParams->findSystemFontFile(font, &dummy, &dummy2, &substituteNameAux);
+    if (substituteNameAux.getLength() > 0)
+       substituteName = substituteNameAux.copy();
+  }
+  encoding = font->getEncodingName()->copy();
+
+  // look for a ToUnicode map
+  hasToUnicode = gFalse;
+  if (doc->getXRef()->fetch(fontRef.num, fontRef.gen, &fontObj)->isDict()) {
+    hasToUnicode = fontObj.dictLookup("ToUnicode", &toUnicodeObj)->isStream();
+    toUnicodeObj.free();
+  }
+  fontObj.free();
+
+  // check for a font subset name: capital letters followed by a '+'
+  // sign
+  subset = gFalse;
+  if (name) {
+    for (i = 0; i < name->getLength(); ++i) {
+      if (name->getChar(i) < 'A' || name->getChar(i) > 'Z') {
+       break;
+      }
+    }
+    subset = i > 0 && i < name->getLength() && name->getChar(i) == '+';
+  }
+}
+
+FontInfo::FontInfo(FontInfo& f) {
+  name = f.name ? f.name->copy() : NULL;
+  file = f.file ? f.file->copy() : NULL;
+  encoding = f.encoding ? f.encoding->copy() : NULL;
+  substituteName = f.substituteName ? f.substituteName->copy() : NULL;
+  type = f.type;
+  emb = f.emb;
+  subset = f.subset;
+  hasToUnicode = f.hasToUnicode;
+  fontRef = f.fontRef;
+  embRef = f.embRef;
+}
+
+FontInfo::~FontInfo() {
+  delete name;
+  delete file;
+  delete encoding;
+  if (substituteName)
+    delete substituteName;
+}
diff --git a/poppler/FontInfo.h b/poppler/FontInfo.h
new file mode 100644 (file)
index 0000000..db90440
--- /dev/null
@@ -0,0 +1,102 @@
+//========================================================================
+//
+// FontInfo.h
+//
+// Copyright (C) 2005 Kristian Høgsberg <krh@redhat.com>
+// Copyright (C) 2005-2008, 2010, 2011 Albert Astals Cid <aacid@kde.org>
+// Copyright (C) 2005 Brad Hards <bradh@frogmouth.net>
+// Copyright (C) 2009 Pino Toscano <pino@kde.org>
+// Copyright (C) 2012 Adrian Johnson <ajohnson@redneon.com>
+//
+// To see a description of the changes please see the Changelog file that
+// came with your tarball or type make ChangeLog if you are building from git
+//
+//========================================================================
+
+//========================================================================
+//
+// Based on code from pdffonts.cc
+//
+// Copyright 2001-2007 Glyph & Cog, LLC
+//
+//========================================================================
+
+#ifndef FONT_INFO_H
+#define FONT_INFO_H
+
+#include "Object.h"
+#include "goo/gtypes.h"
+#include "goo/GooList.h"
+
+class GfxFont;
+class PDFDoc;
+
+class FontInfo {
+public:
+  enum Type {
+    unknown,
+    Type1,
+    Type1C,
+    Type1COT,
+    Type3,
+    TrueType,
+    TrueTypeOT,
+    CIDType0,
+    CIDType0C,
+    CIDType0COT,
+    CIDTrueType,
+    CIDTrueTypeOT
+  };
+    
+  // Constructor.
+  FontInfo(GfxFont *fontA, PDFDoc *doc);
+  // Copy constructor
+  FontInfo(FontInfo& f);
+  // Destructor.
+  ~FontInfo();
+
+  GooString *getName()      { return name; };
+  GooString *getSubstituteName() { return substituteName; };
+  GooString *getFile()      { return file; };
+  GooString *getEncoding()      { return encoding; };
+  Type       getType()      { return type; };
+  GBool      getEmbedded()  { return emb; };
+  GBool      getSubset()    { return subset; };
+  GBool      getToUnicode() { return hasToUnicode; };
+  Ref        getRef()       { return fontRef; };
+  Ref        getEmbRef()    { return embRef; };
+
+private:
+  GooString *name;
+  GooString *substituteName;
+  GooString *file;
+  GooString *encoding;
+  Type type;
+  GBool emb;
+  GBool subset;
+  GBool hasToUnicode;
+  Ref fontRef;
+  Ref embRef;
+};
+
+class FontInfoScanner {
+public:
+
+  // Constructor.
+  FontInfoScanner(PDFDoc *doc, int firstPage = 0);
+  // Destructor.
+  ~FontInfoScanner();
+
+  GooList *scan(int nPages);
+
+private:
+
+  PDFDoc *doc;
+  int currentPage;
+  std::set<int> fonts;
+  std::set<int> visitedObjects;
+
+  void scanFonts(Dict *resDict, GooList *fontsList);
+};
+
+#endif
diff --git a/poppler/Form.cc b/poppler/Form.cc
new file mode 100644 (file)
index 0000000..7d32ae0
--- /dev/null
@@ -0,0 +1,1517 @@
+//========================================================================
+//
+// Form.cc
+//
+// This file is licensed under the GPLv2 or later
+//
+// Copyright 2006-2008 Julien Rebetez <julienr@svn.gnome.org>
+// Copyright 2007-2012 Albert Astals Cid <aacid@kde.org>
+// Copyright 2007-2008, 2011 Carlos Garcia Campos <carlosgc@gnome.org>
+// Copyright 2007 Adrian Johnson <ajohnson@redneon.com>
+// Copyright 2007 Iñigo Martínez <inigomartinez@gmail.com>
+// Copyright 2008, 2011 Pino Toscano <pino@kde.org>
+// Copyright 2008 Michael Vrable <mvrable@cs.ucsd.edu>
+// Copyright 2009 Matthias Drochner <M.Drochner@fz-juelich.de>
+// Copyright 2009 KDAB via Guillermo Amaral <gamaral@amaral.com.mx>
+// Copyright 2010, 2012 Mark Riedesel <mark@klowner.com>
+// 
+//========================================================================
+
+#include <config.h>
+
+#ifdef USE_GCC_PRAGMAS
+#pragma implementation
+#endif
+
+#include <set>
+#include <stddef.h>
+#include <string.h>
+#include "goo/gmem.h"
+#include "goo/GooString.h"
+#include "Error.h"
+#include "Object.h"
+#include "Array.h"
+#include "Dict.h"
+#include "Gfx.h"
+#include "Form.h"
+#include "PDFDoc.h"
+#include "XRef.h"
+#include "PDFDocEncoding.h"
+#include "Annot.h"
+#include "Link.h"
+
+//return a newly allocated char* containing an UTF16BE string of size length
+char* pdfDocEncodingToUTF16 (GooString* orig, int* length)
+{
+  //double size, a unicode char takes 2 char, add 2 for the unicode marker
+  *length = 2+2*orig->getLength();
+  char *result = new char[(*length)];
+  char *cstring = orig->getCString();
+  //unicode marker
+  result[0] = 0xfe;
+  result[1] = 0xff;
+  //convert to utf16
+  for(int i=2,j=0; i<(*length); i+=2,j++) {
+    Unicode u = pdfDocEncoding[(unsigned int)((unsigned char)cstring[j])]&0xffff;
+    result[i] = (u >> 8) & 0xff;
+    result[i+1] = u & 0xff;
+  }
+  return result;
+}
+
+static GooString *convertToUtf16(GooString *pdfDocEncodingString)
+{
+  int tmp_length;
+  char* tmp_str = pdfDocEncodingToUTF16(pdfDocEncodingString, &tmp_length);
+  delete pdfDocEncodingString;
+  pdfDocEncodingString = new GooString(tmp_str, tmp_length);
+  delete [] tmp_str;
+  return pdfDocEncodingString;
+}
+
+
+FormWidget::FormWidget(PDFDoc *docA, Object *aobj, unsigned num, Ref aref, FormField *fieldA)
+{
+  ref = aref;
+  ID = 0;
+  childNum = num;
+  doc = docA;
+  xref = doc->getXRef();
+  aobj->copy(&obj);
+  type = formUndef;
+  field = fieldA;
+  widget = NULL;
+}
+
+FormWidget::~FormWidget()
+{
+  if (widget)
+    widget->decRefCnt();
+  obj.free ();
+}
+
+#ifdef DEBUG_FORMS
+void FormWidget::print(int indent) {
+  printf ("%*s+ (%d %d): [widget]\n", indent, "", ref.num, ref.gen);
+}
+#endif
+
+void FormWidget::createWidgetAnnotation() {
+  if (widget)
+    return;
+
+  Object obj1;
+  obj1.initRef(ref.num, ref.gen);
+  widget = new AnnotWidget(doc, obj.getDict(), &obj1, field);
+  obj1.free();
+}
+
+GBool FormWidget::inRect(double x, double y) const {
+  return widget ? widget->inRect(x, y) : gFalse;
+}
+
+void FormWidget::getRect(double *x1, double *y1, double *x2, double *y2) const {
+  if (widget)
+    widget->getRect(x1, y1, x2, y2);
+}
+
+double FormWidget::getFontSize() const {
+  return widget ? widget->getFontSize() : 0.;
+}
+
+bool FormWidget::isReadOnly() const
+{
+  return field->isReadOnly();
+}
+
+GBool FormWidget::isModified() const {
+  return field->isModified();
+}
+
+int FormWidget::encodeID (unsigned pageNum, unsigned fieldNum)
+{
+  return (pageNum << 4*sizeof(unsigned)) + fieldNum;
+}
+
+void FormWidget::decodeID (unsigned id, unsigned* pageNum, unsigned* fieldNum)
+{
+  *pageNum = id >> 4*sizeof(unsigned);
+  *fieldNum = (id << 4*sizeof(unsigned)) >> 4*sizeof(unsigned);
+}
+
+GooString *FormWidget::getPartialName() const {
+  return field->getPartialName();
+}
+
+GooString *FormWidget::getAlternateUiName() const {
+  return field->getAlternateUiName();
+}
+
+GooString *FormWidget::getMappingName() const {
+  return field->getMappingName();
+}
+
+GooString *FormWidget::getFullyQualifiedName() {
+  return field->getFullyQualifiedName();
+}
+
+LinkAction *FormWidget::getActivationAction() {
+  return widget ? widget->getAction() : NULL;
+}
+
+FormWidgetButton::FormWidgetButton (PDFDoc *docA, Object *aobj, unsigned num, Ref ref, FormField *p) :
+       FormWidget(docA, aobj, num, ref, p)
+{
+  type = formButton;
+  parent = static_cast<FormFieldButton*>(field);
+  onStr = NULL;
+  siblingsID = NULL;
+  numSiblingsID = 0;
+
+  Object obj1, obj2;
+
+  // Find the name of the ON state in the AP dictionnary
+  // The reference say the Off state, if it existe, _must_ be stored in the AP dict under the name /Off
+  // The "on" state may be stored under any other name
+  if (obj.dictLookup("AP", &obj1)->isDict()) {
+    if (obj1.dictLookup("N", &obj2)->isDict()) {
+      for (int i = 0; i < obj2.dictGetLength(); i++) {
+        char *key = obj2.dictGetKey(i);
+        if (strcmp (key, "Off") != 0) {
+          onStr = new GooString (key);
+          break;
+        }
+      }
+    }
+    obj2.free();
+  }
+  obj1.free();
+}
+
+char *FormWidgetButton::getOnStr() {
+  if (onStr)
+    return onStr->getCString();
+
+  // 12.7.4.2.3 Check Boxes
+  //  Yes should be used as the name for the on state
+  return parent->getButtonType() == formButtonCheck ? (char *)"Yes" : NULL;
+}
+
+FormWidgetButton::~FormWidgetButton ()
+{
+  if (siblingsID)
+    gfree(siblingsID);
+  delete onStr;
+}
+
+FormButtonType FormWidgetButton::getButtonType () const
+{
+  return parent->getButtonType ();
+}
+
+void FormWidgetButton::setAppearanceState(const char *state) {
+  if (!widget)
+    return;
+  widget->setAppearanceState(state);
+}
+
+void FormWidgetButton::setState (GBool astate)
+{
+  //pushButtons don't have state
+  if (parent->getButtonType() == formButtonPush)
+    return;
+
+  // Silently return if can't set ON state
+  if (astate && !onStr)
+    return;
+
+  parent->setState(astate ? onStr->getCString() : (char *)"Off");
+  // Parent will call setAppearanceState()
+}
+
+GBool FormWidgetButton::getState ()
+{
+  return onStr ? parent->getState(onStr->getCString()) : gFalse;
+}
+
+void FormWidgetButton::setNumSiblingsID (int i)
+{ 
+  numSiblingsID = i; 
+  siblingsID = (unsigned*)greallocn(siblingsID, numSiblingsID, sizeof(unsigned));
+}
+
+
+FormWidgetText::FormWidgetText (PDFDoc *docA, Object *aobj, unsigned num, Ref ref, FormField *p) :
+       FormWidget(docA, aobj, num, ref, p)
+{
+  type = formText;
+  parent = static_cast<FormFieldText*>(field);
+}
+
+GooString* FormWidgetText::getContent ()
+{
+  return parent->getContent(); 
+}
+
+GooString* FormWidgetText::getContentCopy ()
+{
+  return parent->getContentCopy();
+}
+  
+bool FormWidgetText::isMultiline () const 
+{ 
+  return parent->isMultiline(); 
+}
+
+bool FormWidgetText::isPassword () const 
+{ 
+  return parent->isPassword(); 
+}
+
+bool FormWidgetText::isFileSelect () const 
+{ 
+  return parent->isFileSelect(); 
+}
+
+bool FormWidgetText::noSpellCheck () const 
+{ 
+  return parent->noSpellCheck(); 
+}
+
+bool FormWidgetText::noScroll () const 
+{ 
+  return parent->noScroll(); 
+}
+
+bool FormWidgetText::isComb () const 
+{ 
+  return parent->isComb(); 
+}
+
+bool FormWidgetText::isRichText () const 
+{ 
+  return parent->isRichText(); 
+}
+
+int FormWidgetText::getMaxLen () const
+{
+  return parent->getMaxLen ();
+}
+
+void FormWidgetText::setContent(GooString* new_content)
+{
+  if (isReadOnly()) {
+    error(errInternal, -1, "FormWidgetText::setContentCopy called on a read only field\n");
+    return;
+  }
+
+  parent->setContentCopy(new_content);
+}
+
+FormWidgetChoice::FormWidgetChoice(PDFDoc *docA, Object *aobj, unsigned num, Ref ref, FormField *p) :
+       FormWidget(docA, aobj, num, ref, p)
+{
+  type = formChoice;
+  parent = static_cast<FormFieldChoice*>(field);
+}
+
+FormWidgetChoice::~FormWidgetChoice()
+{
+}
+
+bool FormWidgetChoice::_checkRange (int i)
+{
+  if (i < 0 || i >= parent->getNumChoices()) {
+    error(errInternal, -1, "FormWidgetChoice::_checkRange i out of range : {0:d}", i);
+    return false;
+  } 
+  return true;
+}
+
+void FormWidgetChoice::select (int i)
+{
+  if (isReadOnly()) {
+    error(errInternal, -1, "FormWidgetChoice::select called on a read only field\n");
+    return;
+  }
+  if (!_checkRange(i)) return;
+  parent->select(i);
+}
+
+void FormWidgetChoice::toggle (int i)
+{
+  if (isReadOnly()) {
+    error(errInternal, -1, "FormWidgetChoice::toggle called on a read only field\n");
+    return;
+  }
+  if (!_checkRange(i)) return;
+  parent->toggle(i);
+}
+
+void FormWidgetChoice::deselectAll ()
+{
+  if (isReadOnly()) {
+    error(errInternal, -1, "FormWidgetChoice::deselectAll called on a read only field\n");
+    return;
+  }
+  parent->deselectAll();
+}
+
+GooString* FormWidgetChoice::getEditChoice ()
+{
+  if (!hasEdit()) {
+    error(errInternal, -1, "FormFieldChoice::getEditChoice called on a non-editable choice\n");
+    return NULL;
+  }
+  return parent->getEditChoice();
+}
+
+bool FormWidgetChoice::isSelected (int i)
+{
+  if (!_checkRange(i)) return false;
+  return parent->isSelected(i);
+}
+
+void FormWidgetChoice::setEditChoice (GooString* new_content)
+{
+  if (isReadOnly()) {
+    error(errInternal, -1, "FormWidgetText::setEditChoice called on a read only field\n");
+    return;
+  }
+  if (!hasEdit()) {
+    error(errInternal, -1, "FormFieldChoice::setEditChoice : trying to edit an non-editable choice\n");
+    return;
+  }
+
+  parent->setEditChoice(new_content);
+}
+
+int FormWidgetChoice::getNumChoices() 
+{ 
+  return parent->getNumChoices(); 
+}
+
+GooString* FormWidgetChoice::getChoice(int i) 
+{ 
+  return parent->getChoice(i); 
+}
+
+bool FormWidgetChoice::isCombo () const 
+{ 
+  return parent->isCombo(); 
+}
+
+bool FormWidgetChoice::hasEdit () const 
+{ 
+  return parent->hasEdit(); 
+}
+
+bool FormWidgetChoice::isMultiSelect () const 
+{ 
+  return parent->isMultiSelect(); 
+}
+
+bool FormWidgetChoice::noSpellCheck () const 
+{ 
+  return parent->noSpellCheck(); 
+}
+
+bool FormWidgetChoice::commitOnSelChange () const 
+{ 
+  return parent->commitOnSelChange(); 
+}
+
+bool FormWidgetChoice::isListBox () const
+{
+  return parent->isListBox();
+}
+
+FormWidgetSignature::FormWidgetSignature(PDFDoc *docA, Object *aobj, unsigned num, Ref ref, FormField *p) :
+       FormWidget(docA, aobj, num, ref, p)
+{
+  type = formSignature;
+  parent = static_cast<FormFieldSignature*>(field);
+}
+
+
+//========================================================================
+// FormField
+//========================================================================
+
+FormField::FormField(PDFDoc *docA, Object *aobj, const Ref& aref, FormField *parentA, std::set<int> *usedParents, FormFieldType ty)
+{
+  doc = docA;
+  xref = doc->getXRef();
+  aobj->copy(&obj);
+  Dict* dict = obj.getDict();
+  ref.num = ref.gen = 0;
+  type = ty;
+  parent = parentA;
+  numChildren = 0;
+  children = NULL;
+  terminal = false;
+  widgets = NULL;
+  readOnly = false;
+  defaultAppearance = NULL;
+  fullyQualifiedName = NULL;
+  quadding = quaddingLeftJustified;
+  hasQuadding = gFalse;
+  modified = gFalse;
+
+  ref = aref;
+
+  Object obj1;
+  //childs
+  if (dict->lookup("Kids", &obj1)->isArray()) {
+    // Load children
+    for (int i = 0 ; i < obj1.arrayGetLength(); i++) {
+      Object childRef, childObj;
+
+      if (!obj1.arrayGetNF(i, &childRef)->isRef()) {
+        error (errSyntaxError, -1, "Invalid form field renference");
+        childRef.free();
+        continue;
+      }
+      if (!obj1.arrayGet(i, &childObj)->isDict()) {
+        error (errSyntaxError, -1, "Form field child is not a dictionary");
+        childObj.free();
+        childRef.free();
+        continue;
+      }
+
+      const Ref ref = childRef.getRef();
+      if (usedParents->find(ref.num) == usedParents->end()) {
+        Object obj2, obj3;
+        // Field child: it could be a form field or a widget or composed dict
+        if (childObj.dictLookupNF("Parent", &obj2)->isRef() || childObj.dictLookup("Parent", &obj3)->isDict()) {
+          // Child is a form field or composed dict
+          // We create the field, if it's composed
+          // it will create the widget as a child
+          std::set<int> usedParentsAux = *usedParents;
+          usedParentsAux.insert(ref.num);
+          obj2.free();
+          obj3.free();
+
+          if (terminal) {
+            error(errSyntaxWarning, -1, "Field can't have both Widget AND Field as kids\n");
+            continue;
+          }
+
+          numChildren++;
+          children = (FormField**)greallocn(children, numChildren, sizeof(FormField*));
+          children[numChildren - 1] = Form::createFieldFromDict(&childObj, doc, ref, this, &usedParentsAux);
+        } else if (childObj.dictLookup("Subtype", &obj2)->isName("Widget")) {
+          // Child is a widget annotation
+          if (!terminal && numChildren > 0) {
+            error(errSyntaxWarning, -1, "Field can't have both Widget AND Field as kids\n");
+            obj2.free();
+            obj3.free();
+            continue;
+          }
+          _createWidget(&childObj, ref);
+        }
+        obj2.free();
+        obj3.free();
+      }
+      childObj.free();
+      childRef.free();
+    }
+  } else {
+    // No children, if it's a composed dict, create the child widget
+    obj1.free();
+    if (dict->lookup("Subtype", &obj1)->isName("Widget"))
+      _createWidget(&obj, ref);
+  }
+  obj1.free();
+
+  //flags
+  if (Form::fieldLookup(dict, "Ff", &obj1)->isInt()) {
+    int flags = obj1.getInt();
+    if (flags & 0x1) { // 1 -> ReadOnly
+      readOnly = true;
+    }
+    if (flags & 0x2) { // 2 -> Required
+      //TODO
+    }
+    if (flags & 0x4) { // 3 -> NoExport
+      //TODO
+    }
+  }
+  obj1.free();
+
+  // Variable Text
+  if (Form::fieldLookup(dict, "DA", &obj1)->isString())
+    defaultAppearance = obj1.getString()->copy();
+  obj1.free();
+
+  if (Form::fieldLookup(dict, "Q", &obj1)->isInt()) {
+    quadding = static_cast<VariableTextQuadding>(obj1.getInt());
+    hasQuadding = gTrue;
+  }
+  obj1.free();
+
+  if (dict->lookup("T", &obj1)->isString()) {
+    partialName = obj1.getString()->copy();
+  } else {
+    partialName = NULL;
+  }
+  obj1.free();
+
+  if (dict->lookup("TU", &obj1)->isString()) {
+    alternateUiName = obj1.getString()->copy();
+  } else {
+    alternateUiName = NULL;
+  }
+  obj1.free();
+
+  if(dict->lookup("TM", &obj1)->isString()) {
+    mappingName = obj1.getString()->copy();
+  } else {
+    mappingName = NULL;
+  }
+  obj1.free();
+}
+
+FormField::~FormField()
+{
+  if (!terminal) {
+    if(children) {
+      for (int i=0; i<numChildren; i++)
+        delete children[i];
+      gfree(children);
+    }
+  } else {
+    for (int i = 0; i < numChildren; ++i)
+      delete widgets[i];
+    gfree (widgets);
+  }
+  obj.free();
+
+  delete defaultAppearance;
+  delete partialName;
+  delete alternateUiName;
+  delete mappingName;
+  delete fullyQualifiedName;
+}
+
+#ifdef DEBUG_FORMS
+void FormField::print(int indent)
+{
+  printf ("%*s- (%d %d): [container] terminal: %s children: %d\n", indent, "", ref.num, ref.gen,
+          terminal ? "Yes" : "No", numChildren);
+}
+
+void FormField::printTree(int indent)
+{
+  print(indent);
+  if (terminal) {
+    for (int i = 0; i < numChildren; i++)
+      widgets[i]->print(indent + 4);
+  } else {
+    for (int i = 0; i < numChildren; i++)
+      children[i]->printTree(indent + 4);
+  }
+}
+#endif
+
+void FormField::fillChildrenSiblingsID()
+{
+  if (terminal)
+    return;
+  for (int i = 0; i < numChildren; i++) {
+    children[i]->fillChildrenSiblingsID();
+  }
+}
+
+void FormField::createWidgetAnnotations() {
+  if (terminal) {
+    for (int i = 0; i < numChildren; i++)
+      widgets[i]->createWidgetAnnotation();
+  } else {
+    for (int i = 0; i < numChildren; i++)
+      children[i]->createWidgetAnnotations();
+  }
+}
+
+GBool FormField::isModified() const {
+  return modified ? gTrue : parent ? parent->isModified() : gFalse;
+}
+
+void FormField::_createWidget (Object *obj, Ref aref)
+{
+  terminal = true;
+  numChildren++;
+  widgets = (FormWidget**)greallocn(widgets, numChildren, sizeof(FormWidget*));
+  //ID = index in "widgets" table
+  switch (type) {
+  case formButton:
+    widgets[numChildren-1] = new FormWidgetButton(doc, obj, numChildren-1, aref, this);
+    break;
+  case formText:
+    widgets[numChildren-1] = new FormWidgetText(doc, obj, numChildren-1, aref, this);
+    break;
+  case formChoice:
+    widgets[numChildren-1] = new FormWidgetChoice(doc, obj, numChildren-1, aref, this);
+    break;
+  case formSignature:
+    widgets[numChildren-1] = new FormWidgetSignature(doc, obj, numChildren-1, aref, this);
+    break;
+  default:
+    error(errSyntaxWarning, -1, "SubType on non-terminal field, invalid document?");
+    numChildren--;
+    terminal = false;
+  }
+}
+
+FormWidget* FormField::findWidgetByRef (Ref aref)
+{
+  if (terminal) {
+    for(int i=0; i<numChildren; i++) {
+      if (widgets[i]->getRef().num == aref.num 
+          && widgets[i]->getRef().gen == aref.gen)
+        return widgets[i];
+    }
+  } else {
+    for(int i=0; i<numChildren; i++) {
+      FormWidget* result = children[i]->findWidgetByRef(aref);
+      if(result) return result;
+    }
+  }
+  return NULL;
+}
+
+GooString* FormField::getFullyQualifiedName() {
+  Object obj1, obj2;
+  Object parent;
+  GooString *parent_name;
+  GooString *full_name;
+  GBool unicode_encoded = gFalse;
+
+  if (fullyQualifiedName)
+    return fullyQualifiedName;
+
+  full_name = new GooString();
+
+  obj.copy(&obj1);
+  while (obj1.dictLookup("Parent", &parent)->isDict()) {
+    if (parent.dictLookup("T", &obj2)->isString()) {
+      parent_name = obj2.getString();
+
+      if (unicode_encoded) {
+        full_name->insert(0, "\0.", 2); // 2-byte unicode period
+        if (parent_name->hasUnicodeMarker()) {
+          full_name->insert(0, parent_name->getCString() + 2, parent_name->getLength() - 2); // Remove the unicode BOM
+        } else {
+          int tmp_length;
+          char* tmp_str = pdfDocEncodingToUTF16(parent_name, &tmp_length);
+          full_name->insert(0, tmp_str + 2, tmp_length - 2); // Remove the unicode BOM
+          delete [] tmp_str;
+        }
+      } else {
+        full_name->insert(0, '.'); // 1-byte ascii period
+        if (parent_name->hasUnicodeMarker()) {          
+          unicode_encoded = gTrue;
+          full_name = convertToUtf16(full_name);
+          full_name->insert(0, parent_name->getCString() + 2, parent_name->getLength() - 2); // Remove the unicode BOM
+        } else {
+          full_name->insert(0, parent_name);
+        }
+      }
+      obj2.free();
+    }
+    obj1.free();
+    parent.copy(&obj1);
+    parent.free();
+  }
+  obj1.free();
+  parent.free();
+
+  if (partialName) {
+    if (unicode_encoded) {
+      if (partialName->hasUnicodeMarker()) {
+        full_name->append(partialName->getCString() + 2, partialName->getLength() - 2); // Remove the unicode BOM
+      } else {
+        int tmp_length;
+        char* tmp_str = pdfDocEncodingToUTF16(partialName, &tmp_length);
+        full_name->append(tmp_str + 2, tmp_length - 2); // Remove the unicode BOM
+        delete [] tmp_str;
+      }
+    } else {
+      if (partialName->hasUnicodeMarker()) {
+          unicode_encoded = gTrue;        
+          full_name = convertToUtf16(full_name);
+          full_name->append(partialName->getCString() + 2, partialName->getLength() - 2); // Remove the unicode BOM
+      } else {
+        full_name->append(partialName);
+      }
+    }
+  } else {
+    int len = full_name->getLength();
+    // Remove the last period
+    if (unicode_encoded) {
+      if (len > 1) {
+        full_name->del(len - 2, 2);
+      }
+    } else {
+      if (len > 0) {
+        full_name->del(len - 1, 1);
+      }
+    }
+  }
+  
+  if (unicode_encoded) {
+    full_name->insert(0, 0xff);
+    full_name->insert(0, 0xfe);
+  }
+
+  fullyQualifiedName = full_name;
+  return fullyQualifiedName;
+}
+
+//------------------------------------------------------------------------
+// FormFieldButton
+//------------------------------------------------------------------------
+FormFieldButton::FormFieldButton(PDFDoc *docA, Object *aobj, const Ref& ref, FormField *parent, std::set<int> *usedParents)
+  : FormField(docA, aobj, ref, parent, usedParents, formButton)
+{
+  Dict* dict = obj.getDict();
+  active_child = -1;
+  noAllOff = false;
+  appearanceState.initNull();
+
+  Object obj1;
+  btype = formButtonCheck; 
+  if (Form::fieldLookup(dict, "Ff", &obj1)->isInt()) {
+    int flags = obj1.getInt();
+    
+    if (flags & 0x10000) { // 17 -> push button
+      btype = formButtonPush;
+    } else if (flags & 0x8000) { // 16 -> radio button
+      btype = formButtonRadio;
+      if (flags & 0x4000) { // 15 -> noToggleToOff
+        noAllOff = true;
+      }
+    } 
+    if (flags & 0x1000000) { // 26 -> radiosInUnison
+      error(errUnimplemented, -1, "FormFieldButton:: radiosInUnison flag unimplemented, please report a bug with a testcase\n");
+    } 
+  }
+
+  if (btype != formButtonPush) {
+    // Even though V is inheritable we are interested in the value of this
+    // field, if not present it's probably because it's a button in a set.
+    dict->lookup("V", &appearanceState);
+  }
+}
+
+#ifdef DEBUG_FORMS
+static char *_getButtonType(FormButtonType type)
+{
+  switch (type) {
+  case formButtonPush:
+    return "push";
+  case formButtonCheck:
+    return "check";
+  case formButtonRadio:
+    return "radio";
+  default:
+    break;
+  }
+  return "unknown";
+}
+
+void FormFieldButton::print(int indent)
+{
+  printf ("%*s- (%d %d): [%s] terminal: %s children: %d\n", indent, "", ref.num, ref.gen,
+          _getButtonType(btype), terminal ? "Yes" : "No", numChildren);
+}
+#endif
+
+void FormFieldButton::fillChildrenSiblingsID()
+{
+  if (!terminal) {
+    for(int i=0; i<numChildren; i++) {
+      children[i]->fillChildrenSiblingsID();
+    }
+  } else {
+    for(int i=0; i<numChildren; i++) {
+      FormWidgetButton *btn = static_cast<FormWidgetButton*>(widgets[i]);
+      btn->setNumSiblingsID(numChildren-1);
+      for(int j=0, counter=0; j<numChildren; j++) {
+        if (i == j) continue;
+        btn->setSiblingsID(counter, widgets[j]->getID());
+        counter++;
+      }
+    }
+  }
+}
+
+GBool FormFieldButton::setState(char *state)
+{
+  if (readOnly) {
+    error(errInternal, -1, "FormFieldButton::setState called on a readOnly field\n");
+    return gFalse;
+  }
+
+  // A check button could behave as a radio button
+  // when it's in a set of more than 1 buttons
+  if (btype != formButtonRadio && btype != formButtonCheck)
+    return gFalse;
+
+  if (terminal && parent && parent->getType() == formButton && appearanceState.isNull()) {
+    // It's button in a set, set state on parent
+    if (static_cast<FormFieldButton*>(parent)->setState(state)) {
+      modified = gTrue;
+      return gTrue;
+    }
+    return gFalse;
+  }
+
+  GBool isOn = strcmp(state, "Off") != 0;
+
+  if (!isOn && noAllOff)
+    return gFalse; // Don't allow to set all radio to off
+
+  char *current = getAppearanceState();
+  GBool currentFound = gFalse, newFound = gFalse;
+
+  for (int i = 0; i < numChildren; i++) {
+    FormWidgetButton *widget;
+
+    // If radio button is a terminal field we want the widget at i, but
+    // if it's not terminal, the child widget is a composed dict, so
+    // we want the ony child widget of the children at i
+    if (terminal)
+      widget = static_cast<FormWidgetButton*>(widgets[i]);
+    else
+      widget = static_cast<FormWidgetButton*>(children[i]->getWidget(0));
+
+    if (!widget->getOnStr())
+      continue;
+
+    char *onStr = widget->getOnStr();
+    if (current && strcmp(current, onStr) == 0) {
+      widget->setAppearanceState("Off");
+      if (!isOn)
+        break;
+      currentFound = gTrue;
+    }
+
+    if (isOn && strcmp(state, onStr) == 0) {
+      widget->setAppearanceState(state);
+      newFound = gTrue;
+    }
+
+    if (currentFound && newFound)
+      break;
+  }
+
+  updateState(state);
+  modified = gTrue;
+
+  return gTrue;
+}
+
+GBool FormFieldButton::getState(char *state) {
+  if (appearanceState.isName(state))
+    return gTrue;
+
+  return (parent && parent->getType() == formButton) ? static_cast<FormFieldButton*>(parent)->getState(state) : gFalse;
+}
+
+void FormFieldButton::updateState(char *state) {
+  Object obj1;
+
+  appearanceState.free();
+  appearanceState.initName(state);
+
+  appearanceState.copy(&obj1);
+  obj.getDict()->set("V", &obj1);
+  xref->setModifiedObject(&obj, ref);
+}
+
+FormFieldButton::~FormFieldButton()
+{
+  appearanceState.free();
+}
+
+//------------------------------------------------------------------------
+// FormFieldText
+//------------------------------------------------------------------------
+FormFieldText::FormFieldText(PDFDoc *docA, Object *aobj, const Ref& ref, FormField *parent, std::set<int> *usedParents)
+  : FormField(docA, aobj, ref, parent, usedParents, formText)
+{
+  Dict* dict = obj.getDict();
+  Object obj1;
+  content = NULL;
+  multiline = password = fileSelect = doNotSpellCheck = doNotScroll = comb = richText = false;
+  maxLen = 0;
+
+  if (Form::fieldLookup(dict, "Ff", &obj1)->isInt()) {
+    int flags = obj1.getInt();
+    if (flags & 0x1000) // 13 -> Multiline
+      multiline = true;
+    if (flags & 0x2000) // 14 -> Password
+      password = true;
+    if (flags & 0x100000) // 21 -> FileSelect
+      fileSelect = true;
+    if (flags & 0x400000)// 23 -> DoNotSpellCheck
+      doNotSpellCheck = true;
+    if (flags & 0x800000) // 24 -> DoNotScroll
+      doNotScroll = true;
+    if (flags & 0x1000000) // 25 -> Comb
+      comb = true;
+    if (flags & 0x2000000)// 26 -> RichText
+      richText = true;
+  }
+  obj1.free();
+
+  if (Form::fieldLookup(dict, "MaxLen", &obj1)->isInt()) {
+    maxLen = obj1.getInt();
+  }
+  obj1.free();
+
+  if (Form::fieldLookup(dict, "V", &obj1)->isString()) {
+    if (obj1.getString()->hasUnicodeMarker()) {
+      if (obj1.getString()->getLength() > 2)
+        content = obj1.getString()->copy();
+    } else if (obj1.getString()->getLength() > 0) {
+      //non-unicode string -- assume pdfDocEncoding and try to convert to UTF16BE
+      int tmp_length;
+      char* tmp_str = pdfDocEncodingToUTF16(obj1.getString(), &tmp_length);
+      content = new GooString(tmp_str, tmp_length);
+      delete [] tmp_str;
+    }
+  }
+  obj1.free();
+}
+
+#ifdef DEBUG_FORMS
+void FormFieldText::print(int indent)
+{
+  printf ("%*s- (%d %d): [text] terminal: %s children: %d\n", indent, "", ref.num, ref.gen,
+          terminal ? "Yes" : "No", numChildren);
+}
+#endif
+
+GooString* FormFieldText::getContentCopy ()
+{
+  if (!content) return NULL;
+  return new GooString(content);
+}
+
+void FormFieldText::setContentCopy (GooString* new_content)
+{
+  delete content;
+  content = NULL;
+
+  if (new_content) {
+    content = new_content->copy();
+
+    //append the unicode marker <FE FF> if needed
+    if (!content->hasUnicodeMarker()) {
+      content->insert(0, 0xff);
+      content->insert(0, 0xfe);
+    }
+  }
+
+  Object obj1;
+  obj1.initString(content ? content->copy() : new GooString(""));
+  obj.getDict()->set("V", &obj1);
+  xref->setModifiedObject(&obj, ref);
+  modified = gTrue;
+}
+
+FormFieldText::~FormFieldText()
+{
+  delete content;
+}
+
+
+//------------------------------------------------------------------------
+// FormFieldChoice
+//------------------------------------------------------------------------
+FormFieldChoice::FormFieldChoice(PDFDoc *docA, Object *aobj, const Ref& ref, FormField *parent, std::set<int> *usedParents)
+  : FormField(docA, aobj, ref, parent, usedParents, formChoice)
+{
+  numChoices = 0;
+  choices = NULL;
+  editedChoice = NULL;
+  topIdx = 0;
+
+  Dict* dict = obj.getDict();
+  Object obj1;
+
+  combo = edit = multiselect = doNotSpellCheck = doCommitOnSelChange = false;
+
+  if (Form::fieldLookup(dict, "Ff", &obj1)->isInt()) {
+    int flags = obj1.getInt();
+    if (flags & 0x20000) // 18 -> Combo
+      combo = true; 
+    if (flags & 0x40000) // 19 -> Edit
+      edit = true;
+    if (flags & 0x200000) // 22 -> MultiSelect
+      multiselect = true;
+    if (flags & 0x400000) // 23 -> DoNotSpellCheck
+      doNotSpellCheck = true;
+    if (flags & 0x4000000) // 27 -> CommitOnSelChange
+      doCommitOnSelChange = true;
+  }
+  obj1.free();
+
+  if (dict->lookup("TI", &obj1)->isInt())
+    topIdx = obj1.getInt();
+  obj1.free();
+
+  if (dict->lookup("Opt", &obj1)->isArray()) {
+    Object obj2;
+
+    numChoices = obj1.arrayGetLength();
+    choices = new ChoiceOpt[numChoices];
+    memset(choices, 0, sizeof(ChoiceOpt) * numChoices);
+
+    for (int i = 0; i < numChoices; i++) {
+      if (obj1.arrayGet(i, &obj2)->isString()) {
+        choices[i].optionName = obj2.getString()->copy();
+      } else if (obj2.isArray()) { // [Export_value, Displayed_text]
+        Object obj3;
+
+        if (obj2.arrayGetLength() < 2) {
+          error(errSyntaxError, -1, "FormWidgetChoice:: invalid Opt entry -- array's length < 2\n");
+          continue;
+        }
+        if (obj2.arrayGet(0, &obj3)->isString())
+          choices[i].exportVal = obj3.getString()->copy();
+        else
+          error(errSyntaxError, -1, "FormWidgetChoice:: invalid Opt entry -- exported value not a string\n");
+        obj3.free();
+
+        if (obj2.arrayGet(1, &obj3)->isString())
+          choices[i].optionName = obj3.getString()->copy();
+        else
+          error(errSyntaxError, -1, "FormWidgetChoice:: invalid Opt entry -- choice name not a string\n");
+        obj3.free();
+      } else {
+        error(errSyntaxError, -1, "FormWidgetChoice:: invalid {0:d} Opt entry\n", i);
+      }
+      obj2.free();
+    }
+  } else {
+    //empty choice
+  }
+  obj1.free();
+
+  // find selected items and convert choice's human readable strings to UTF16
+  if (Form::fieldLookup(dict, "V", &obj1)->isString()) {
+    for (int i = 0; i < numChoices; i++) {
+      if (!choices[i].optionName)
+        continue;
+
+      if (choices[i].optionName->cmp(obj1.getString()) == 0)
+        choices[i].selected = true;
+
+      if (!choices[i].optionName->hasUnicodeMarker()) {
+        int len;
+        char* buffer = pdfDocEncodingToUTF16(choices[i].optionName, &len);
+        choices[i].optionName->Set(buffer, len);
+        delete [] buffer;
+      }
+    }
+  } else if (obj1.isArray()) {
+    for (int i = 0; i < numChoices; i++) {
+      if (!choices[i].optionName)
+        continue;
+
+      for (int j = 0; j < obj1.arrayGetLength(); j++) {
+        Object obj2;
+
+        obj1.arrayGet(i, &obj2);
+        if (choices[i].optionName->cmp(obj2.getString()) == 0) {
+          choices[i].selected = true;
+          obj2.free();
+          break;
+        }
+        obj2.free();
+      }
+
+      if (!choices[i].optionName->hasUnicodeMarker()) {
+        int len;
+        char* buffer = pdfDocEncodingToUTF16(choices[i].optionName, &len);
+        choices[i].optionName->Set(buffer, len);
+        delete [] buffer;
+      }
+    }
+  }
+  obj1.free();
+}
+
+FormFieldChoice::~FormFieldChoice()
+{
+  for (int i = 0; i < numChoices; i++) {
+    delete choices[i].exportVal;
+    delete choices[i].optionName;
+  }
+  delete [] choices;
+  delete editedChoice;
+}
+
+#ifdef DEBUG_FORMS
+void FormFieldChoice::print(int indent)
+{
+  printf ("%*s- (%d %d): [choice] terminal: %s children: %d\n", indent, "", ref.num, ref.gen,
+          terminal ? "Yes" : "No", numChildren);
+}
+#endif
+
+void FormFieldChoice::updateSelection() {
+  Object obj1;
+
+  //this is an editable combo-box with user-entered text
+  if (edit && editedChoice) {
+    obj1.initString(editedChoice->copy());
+  } else {
+    int numSelected = getNumSelected();
+    if (numSelected == 0) {
+      obj1.initString(new GooString(""));
+    } else if (numSelected == 1) {
+      for (int i = 0; numChoices; i++) {
+        if (choices[i].optionName && choices[i].selected) {
+          obj1.initString(choices[i].optionName->copy());
+          break;
+        }
+      }
+    } else {
+      obj1.initArray(xref);
+      for (int i = 0; i < numChoices; i++) {
+        if (choices[i].optionName && choices[i].selected) {
+          Object obj2;
+          obj2.initString(choices[i].optionName->copy());
+          obj1.arrayAdd(&obj2);
+        }
+      }
+    }
+  }
+
+  obj.getDict()->set("V", &obj1);
+  xref->setModifiedObject(&obj, ref);
+  modified = gTrue;
+}
+
+void FormFieldChoice::unselectAll ()
+{
+  for (int i = 0; i < numChoices; i++) {
+    choices[i].selected = false;
+  }
+}
+
+void FormFieldChoice::deselectAll () {
+  unselectAll();
+  updateSelection();
+}
+
+void FormFieldChoice::toggle (int i)
+{
+  choices[i].selected = !choices[i].selected;
+  updateSelection();
+}
+
+void FormFieldChoice::select (int i)
+{
+  if (!multiselect)
+    unselectAll();
+  choices[i].selected = true;
+  updateSelection();
+}
+
+void FormFieldChoice::setEditChoice (GooString* new_content)
+{
+  delete editedChoice;
+  editedChoice = NULL;
+
+  unselectAll();
+
+  if (new_content) {
+    editedChoice = new_content->copy();
+
+    //append the unicode marker <FE FF> if needed
+    if (!editedChoice->hasUnicodeMarker()) {
+      editedChoice->insert(0, 0xff);
+      editedChoice->insert(0, 0xfe);
+    }
+  }
+  updateSelection();
+}
+
+GooString* FormFieldChoice::getEditChoice ()
+{
+  return editedChoice;
+}
+
+int FormFieldChoice::getNumSelected ()
+{
+  int cnt = 0;
+  for(int i=0; i<numChoices; i++) {
+    if (choices[i].selected)
+      cnt++;
+  }
+  return cnt;
+}
+
+GooString *FormFieldChoice::getSelectedChoice() {
+  if (edit && editedChoice)
+    return editedChoice;
+
+  for (int i = 0; i < numChoices; i++) {
+    if (choices[i].optionName && choices[i].selected)
+      return choices[i].optionName;
+  }
+
+  return NULL;
+}
+
+//------------------------------------------------------------------------
+// FormFieldSignature
+//------------------------------------------------------------------------
+FormFieldSignature::FormFieldSignature(PDFDoc *docA, Object *dict, const Ref& ref, FormField *parent, std::set<int> *usedParents)
+  : FormField(docA, dict, ref, parent, usedParents, formSignature)
+{
+}
+
+FormFieldSignature::~FormFieldSignature()
+{
+
+}
+
+#ifdef DEBUG_FORMS
+void FormFieldSignature::print(int indent)
+{
+  printf ("%*s- (%d %d): [signature] terminal: %s children: %d\n", indent, "", ref.num, ref.gen,
+          terminal ? "Yes" : "No", numChildren);
+}
+#endif
+
+//------------------------------------------------------------------------
+// Form
+//------------------------------------------------------------------------
+
+Form::Form(PDFDoc *docA, Object* acroFormA)
+{
+  Object obj1;
+
+  doc = docA;
+  xref = doc->getXRef();
+  acroForm = acroFormA;
+  
+  size = 0;
+  numFields = 0;
+  rootFields = NULL;
+  quadding = quaddingLeftJustified;
+  defaultAppearance = NULL;
+  defaultResources = NULL;
+
+  acroForm->dictLookup("NeedAppearances", &obj1);
+  needAppearances = (obj1.isBool() && obj1.getBool());
+  obj1.free();
+
+  if (acroForm->dictLookup("DA", &obj1)->isString())
+    defaultAppearance = obj1.getString()->copy();
+  obj1.free();
+
+  if (acroForm->dictLookup("Q", &obj1)->isInt())
+    quadding = static_cast<VariableTextQuadding>(obj1.getInt());
+  obj1.free();
+
+  acroForm->dictLookup("DR", &resDict);
+  if (resDict.isDict()) {
+    // At a minimum, this dictionary shall contain a Font entry
+    if (resDict.dictLookup("Font", &obj1)->isDict())
+      defaultResources = new GfxResources(xref, resDict.getDict(), NULL);
+    obj1.free();
+  }
+  if (!defaultResources) {
+    resDict.free();
+    resDict.initNull();
+  }
+
+  acroForm->dictLookup("Fields", &obj1);
+  if (obj1.isArray()) {
+    Array *array = obj1.getArray();
+    Object obj2;
+    
+    for(int i=0; i<array->getLength(); i++) {
+      Object oref;
+      array->get(i, &obj2);
+      array->getNF(i, &oref);
+      if (!oref.isRef()) {
+        error(errSyntaxWarning, -1, "Direct object in rootFields");
+       obj2.free();
+       oref.free();
+        continue;
+      }
+
+      if (!obj2.isDict()) {
+        error(errSyntaxWarning, -1, "Reference in Fields array to an invalid or non existant object");
+       obj2.free();
+       oref.free();
+       continue;
+      }
+
+      if (numFields >= size) {
+        size += 16;
+        rootFields = (FormField**)greallocn(rootFields,size,sizeof(FormField*));
+      }
+
+      std::set<int> usedParents;
+      rootFields[numFields++] = createFieldFromDict (&obj2, doc, oref.getRef(), NULL, &usedParents);
+
+      obj2.free();
+      oref.free();
+    }
+  } else {
+    error(errSyntaxError, -1, "Can't get Fields array\n");
+  }
+  obj1.free ();
+
+#ifdef DEBUG_FORMS
+  for (int i = 0; i < numFields; i++)
+    rootFields[i]->printTree();
+#endif
+}
+
+Form::~Form() {
+  int i;
+  for(i = 0; i< numFields; ++i)
+    delete rootFields[i];
+  gfree (rootFields);
+  delete defaultAppearance;
+  delete defaultResources;
+  resDict.free();
+}
+
+// Look up an inheritable field dictionary entry.
+static Object *fieldLookup(Dict *field, const char *key, Object *obj, std::set<int> *usedParents) {
+  Dict *dict;
+  Object parent;
+
+  dict = field;
+  if (!dict->lookup(key, obj)->isNull()) {
+    return obj;
+  }
+  obj->free();
+  dict->lookupNF("Parent", &parent);
+  if (parent.isRef()) {
+    const Ref ref = parent.getRef();
+    if (usedParents->find(ref.num) == usedParents->end()) {
+      usedParents->insert(ref.num);
+
+      Object obj2;
+      parent.fetch(dict->getXRef(), &obj2);
+      if (obj2.isDict()) {
+        fieldLookup(obj2.getDict(), key, obj, usedParents);
+      } else {
+        obj->initNull();
+      }
+      obj2.free();
+    }
+  } else if (parent.isDict()) {
+    fieldLookup(parent.getDict(), key, obj, usedParents);
+  } else {
+    obj->initNull();
+  }
+  parent.free();
+  return obj;
+}
+
+Object *Form::fieldLookup(Dict *field, const char *key, Object *obj) {
+  std::set<int> usedParents;
+  return ::fieldLookup(field, key, obj, &usedParents);
+}
+
+FormField *Form::createFieldFromDict (Object* obj, PDFDoc *docA, const Ref& pref, FormField *parent, std::set<int> *usedParents)
+{
+    Object obj2;
+    FormField *field;
+
+    if (Form::fieldLookup(obj->getDict (), "FT", &obj2)->isName("Btn")) {
+      field = new FormFieldButton(docA, obj, pref, parent, usedParents);
+    } else if (obj2.isName("Tx")) {
+      field = new FormFieldText(docA, obj, pref, parent, usedParents);
+    } else if (obj2.isName("Ch")) {
+      field = new FormFieldChoice(docA, obj, pref, parent, usedParents);
+    } else if (obj2.isName("Sig")) {
+      field = new FormFieldSignature(docA, obj, pref, parent, usedParents);
+    } else { //we don't have an FT entry => non-terminal field
+      field = new FormField(docA, obj, pref, parent, usedParents);
+    }
+    obj2.free();
+
+    return field;
+}
+
+void Form::postWidgetsLoad()
+{
+  // We create the widget annotations associated to
+  // every form widget here, because the AnnotWidget constructor
+  // needs the form object that gets from the catalog. When constructing
+  // a FormWidget the Catalog is still creating the form object
+  for (int i = 0; i < numFields; i++) {
+    rootFields[i]->fillChildrenSiblingsID();
+    rootFields[i]->createWidgetAnnotations();
+  }
+}
+
+FormWidget* Form::findWidgetByRef (Ref aref)
+{
+  for(int i=0; i<numFields; i++) {
+    FormWidget *result = rootFields[i]->findWidgetByRef(aref);
+    if(result) return result;
+  }
+  return NULL;
+}
+
+//------------------------------------------------------------------------
+// FormPageWidgets
+//------------------------------------------------------------------------
+
+FormPageWidgets::FormPageWidgets (Annots *annots, unsigned int page, Form *form)
+{
+  numWidgets = 0;
+  widgets = NULL;
+
+  if (annots && annots->getNumAnnots() > 0 && form) {
+    size = annots->getNumAnnots();
+    widgets = (FormWidget**)greallocn(widgets, size, sizeof(FormWidget*));
+
+    /* For each entry in the page 'Annots' dict, try to find
+       a matching form field */
+    for (int i = 0; i < size; ++i) {
+      Annot *annot = annots->getAnnot(i);
+
+      if (annot->getType() != Annot::typeWidget)
+        continue;
+
+      if (!annot->getHasRef()) {
+        /* Since all entry in a form field's kid dict needs to be
+           indirect references, if this annot isn't indirect, it isn't 
+           related to a form field */
+        continue;
+      }
+
+      Ref r = annot->getRef();
+
+      /* Try to find a form field which either has this Annot in its Kids entry
+          or  is merged with this Annot */
+      FormWidget* tmp = form->findWidgetByRef(r);
+      if (tmp) {
+        // We've found a corresponding form field, link it
+        tmp->setID(FormWidget::encodeID(page, numWidgets));
+        widgets[numWidgets++] = tmp;
+      }
+    }
+  }
+}
+
+FormPageWidgets::~FormPageWidgets()
+{
+  gfree (widgets);
+}
diff --git a/poppler/Form.h b/poppler/Form.h
new file mode 100644 (file)
index 0000000..fa3c718
--- /dev/null
@@ -0,0 +1,552 @@
+//========================================================================
+//
+// Form.h
+//
+// This file is licensed under the GPLv2 or later
+//
+// Copyright 2006 Julien Rebetez <julienr@svn.gnome.org>
+// Copyright 2007, 2008, 2011 Carlos Garcia Campos <carlosgc@gnome.org>
+// Copyright 2007-2010 Albert Astals Cid <aacid@kde.org>
+// Copyright 2010 Mark Riedesel <mark@klowner.com>
+// Copyright 2011 Pino Toscano <pino@kde.org>
+//
+//========================================================================
+
+#ifndef FORM_H
+#define FORM_H
+
+#ifdef USE_GCC_PRAGMAS
+#pragma interface
+#endif
+
+#include "Object.h"
+
+#include <set>
+
+class GooString;
+class Array;
+class Dict;
+class Annot;
+class AnnotWidget;
+class Annots;
+class LinkAction;
+class GfxResources;
+class PDFDoc;
+
+enum FormFieldType {
+  formButton,
+  formText,
+  formChoice,
+  formSignature,
+  formUndef
+};
+
+enum FormButtonType {
+  formButtonCheck,
+  formButtonPush,
+  formButtonRadio
+};
+
+enum VariableTextQuadding {
+  quaddingLeftJustified,
+  quaddingCentered,
+  quaddingRightJustified
+};
+
+class Form;
+class FormField;
+class FormFieldButton;
+class FormFieldText;
+class FormFieldSignature;
+class FormFieldChoice;
+
+//------------------------------------------------------------------------
+// FormWidget
+// A FormWidget represents the graphical part of a field and is "attached"
+// to a page.
+//------------------------------------------------------------------------
+
+class FormWidget {
+public:
+  virtual ~FormWidget();
+
+  // Check if point is inside the field bounding rect
+  GBool inRect(double x, double y) const;
+
+  // Get the field bounding rect
+  void getRect(double *x1, double *y1, double *x2, double *y2) const;
+
+  unsigned getID () { return ID; }
+  void setID (unsigned int i) { ID=i; }
+
+  FormField *getField () { return field; }
+  FormFieldType getType() { return type; }
+
+  Object* getObj() { return &obj; }
+  Ref getRef() { return ref; }
+
+  void setChildNum (unsigned i) { childNum = i; }
+  unsigned getChildNum () { return childNum; }
+
+  double getFontSize() const;
+
+  GooString *getPartialName() const;
+  GooString *getAlternateUiName() const;
+  GooString *getMappingName() const;
+  GooString *getFullyQualifiedName();
+
+  GBool isModified () const;
+
+  bool isReadOnly() const;
+
+  LinkAction *getActivationAction();
+
+  // return the unique ID corresponding to pageNum/fieldNum
+  static int encodeID (unsigned pageNum, unsigned fieldNum);
+  // decode id and retrieve pageNum and fieldNum
+  static void decodeID (unsigned id, unsigned* pageNum, unsigned* fieldNum);
+
+  void createWidgetAnnotation();
+  AnnotWidget *getWidgetAnnotation() const { return widget; }
+
+#ifdef DEBUG_FORMS
+  void print(int indent = 0);
+#endif
+
+protected:
+  FormWidget(PDFDoc *docA, Object *aobj, unsigned num, Ref aref, FormField *fieldA);
+
+  AnnotWidget *widget;
+  FormField* field;
+  FormFieldType type;
+  Object obj;
+  Ref ref;
+  PDFDoc *doc;
+  XRef *xref;
+
+  //index of this field in the parent's child list
+  unsigned childNum;
+
+  /*
+  Field ID is an (unsigned) integer, calculated as follow :
+  the first sizeof/2 bits are the field number, relative to the page
+  the last sizeof/2 bits are the page number
+  [page number | field number]
+  (encoding) id = (pageNum << 4*sizeof(unsigned)) + fieldNum;
+  (decoding) pageNum = id >> 4*sizeof(unsigned); fieldNum = (id << 4*sizeof(unsigned)) >> 4*sizeof(unsigned);
+  */
+  unsigned ID; 
+};
+
+//------------------------------------------------------------------------
+// FormWidgetButton
+//------------------------------------------------------------------------
+
+class FormWidgetButton: public FormWidget {
+public:
+  FormWidgetButton(PDFDoc *docA, Object *dict, unsigned num, Ref ref, FormField *p);
+  ~FormWidgetButton ();
+
+  FormButtonType getButtonType() const;
+  
+  void setState (GBool state);
+  GBool getState ();
+
+  char* getOnStr();
+  void setAppearanceState(const char *state);
+
+  void setNumSiblingsID (int i);
+  void setSiblingsID (int i, unsigned id) { siblingsID[i] = id; }
+
+  //For radio buttons, return the IDs of the other radio buttons in the same group
+  unsigned* getSiblingsID () const { return siblingsID; }
+  int getNumSiblingsID () const { return numSiblingsID; }
+
+protected:
+  unsigned* siblingsID; // IDs of dependent buttons (each button of a radio field has all the others buttons
+                        // of the same field in this array)
+  int numSiblingsID;
+  GooString *onStr;
+  FormFieldButton *parent;
+};
+
+//------------------------------------------------------------------------
+// FormWidgetText
+//------------------------------------------------------------------------
+
+class FormWidgetText: public FormWidget {
+public:
+  FormWidgetText(PDFDoc *docA, Object *dict, unsigned num, Ref ref, FormField *p);
+  //return the field's content (UTF16BE)
+  GooString* getContent() ;
+  //return a copy of the field's content (UTF16BE)
+  GooString* getContentCopy();
+
+  //except a UTF16BE string
+  void setContent(GooString* new_content);
+
+  bool isMultiline () const; 
+  bool isPassword () const; 
+  bool isFileSelect () const; 
+  bool noSpellCheck () const; 
+  bool noScroll () const; 
+  bool isComb () const; 
+  bool isRichText () const;
+  int getMaxLen () const;
+protected:
+  FormFieldText *parent;
+};
+
+//------------------------------------------------------------------------
+// FormWidgetChoice
+//------------------------------------------------------------------------
+
+class FormWidgetChoice: public FormWidget {
+public:
+  FormWidgetChoice(PDFDoc *docA, Object *dict, unsigned num, Ref ref, FormField *p);
+  ~FormWidgetChoice();
+
+  int getNumChoices();
+  //return the display name of the i-th choice (UTF16BE)
+  GooString* getChoice(int i);
+  //select the i-th choice
+  void select (int i); 
+
+  //toggle selection of the i-th choice
+  void toggle (int i);
+
+  //deselect everything
+  void deselectAll ();
+
+  //except a UTF16BE string
+  //only work for editable combo box, set the user-entered text as the current choice
+  void setEditChoice(GooString* new_content);
+
+  GooString* getEditChoice ();
+
+  bool isSelected (int i);
+
+  bool isCombo () const; 
+  bool hasEdit () const; 
+  bool isMultiSelect () const; 
+  bool noSpellCheck () const; 
+  bool commitOnSelChange () const; 
+  bool isListBox () const;
+protected:
+  bool _checkRange (int i);
+  FormFieldChoice *parent;
+};
+
+//------------------------------------------------------------------------
+// FormWidgetSignature
+//------------------------------------------------------------------------
+
+class FormWidgetSignature: public FormWidget {
+public:
+  FormWidgetSignature(PDFDoc *docA, Object *dict, unsigned num, Ref ref, FormField *p);
+protected:
+  FormFieldSignature *parent;
+};
+
+//------------------------------------------------------------------------
+// FormField
+// A FormField implements the logical side of a field and is "attached" to
+// the Catalog. This is an internal class and client applications should
+// only interact with FormWidgets.
+//------------------------------------------------------------------------
+
+class FormField {
+public:
+  FormField(PDFDoc *docA, Object *aobj, const Ref& aref, FormField *parent, std::set<int> *usedParents, FormFieldType t=formUndef);
+
+  virtual ~FormField();
+
+  // Accessors.
+  FormFieldType getType() { return type; }
+  Object* getObj() { return &obj; }
+  Ref getRef() { return ref; }
+
+  void setReadOnly (bool b) { readOnly = b; }
+  bool isReadOnly () const { return readOnly; }
+
+  GBool isModified () const;
+
+  GooString* getDefaultAppearance() const { return defaultAppearance; }
+  GBool hasTextQuadding() const { return hasQuadding; }
+  VariableTextQuadding getTextQuadding() const { return quadding; }
+
+  GooString *getPartialName() const { return partialName; }
+  GooString *getAlternateUiName() const { return alternateUiName; }
+  GooString *getMappingName() const { return mappingName; }
+  GooString *getFullyQualifiedName();
+
+  FormWidget* findWidgetByRef (Ref aref);
+  FormWidget *getWidget(int i) { return terminal ? widgets[i] : NULL; }
+
+  // only implemented in FormFieldButton
+  virtual void fillChildrenSiblingsID ();
+
+  void createWidgetAnnotations();
+
+#ifdef DEBUG_FORMS
+  void printTree(int indent = 0);
+  virtual void print(int indent = 0);
+#endif
+
+
+ protected:
+  void _createWidget (Object *obj, Ref aref);
+  void createChildren(std::set<int> *usedParents);
+
+  FormFieldType type;           // field type
+  Ref ref;
+  bool terminal;
+  Object obj;
+  PDFDoc *doc;
+  XRef *xref;
+  FormField **children;
+  FormField *parent;
+  int numChildren;
+  FormWidget **widgets;
+  bool readOnly;
+  GBool modified;
+
+  GooString *partialName; // T field
+  GooString *alternateUiName; // TU field
+  GooString *mappingName; // TM field
+  GooString *fullyQualifiedName;
+
+  // Variable Text
+  GooString *defaultAppearance;
+  GBool hasQuadding;
+  VariableTextQuadding quadding;
+
+private:
+  FormField() {}
+};
+
+
+//------------------------------------------------------------------------
+// FormFieldButton
+//------------------------------------------------------------------------
+
+class FormFieldButton: public FormField {
+public:
+  FormFieldButton(PDFDoc *docA, Object *dict, const Ref& ref, FormField *parent, std::set<int> *usedParents);
+
+  FormButtonType getButtonType () { return btype; }
+
+  bool noToggleToOff () const { return noAllOff; }
+
+  // returns gTrue if the state modification is accepted
+  GBool setState (char *state);
+  GBool getState(char *state);
+
+  char *getAppearanceState() { return appearanceState.isName() ? appearanceState.getName() : NULL; }
+
+  void fillChildrenSiblingsID ();
+
+#ifdef DEBUG_FORMS
+  void print(int indent = 0);
+#endif
+
+  virtual ~FormFieldButton();
+protected:
+  void updateState(char *state);
+
+  FormButtonType btype;
+  int size;
+  int active_child; //only used for combo box
+  bool noAllOff;
+  Object appearanceState; // V
+};
+
+//------------------------------------------------------------------------
+// FormFieldText
+//------------------------------------------------------------------------
+
+class FormFieldText: public FormField {
+public:
+  FormFieldText(PDFDoc *docA, Object *dict, const Ref& ref, FormField *parent, std::set<int> *usedParents);
+  
+  GooString* getContent () { return content; }
+  GooString* getContentCopy ();
+  void setContentCopy (GooString* new_content);
+  virtual ~FormFieldText();
+
+  bool isMultiline () const { return multiline; }
+  bool isPassword () const { return password; }
+  bool isFileSelect () const { return fileSelect; }
+  bool noSpellCheck () const { return doNotSpellCheck; }
+  bool noScroll () const { return doNotScroll; }
+  bool isComb () const { return comb; }
+  bool isRichText () const { return richText; }
+
+  int getMaxLen () const { return maxLen; }
+
+#ifdef DEBUG_FORMS
+  void print(int indent = 0);
+#endif
+protected:
+  GooString* content;
+  bool multiline;
+  bool password;
+  bool fileSelect;
+  bool doNotSpellCheck;
+  bool doNotScroll;
+  bool comb;
+  bool richText;
+  int maxLen;
+};
+
+//------------------------------------------------------------------------
+// FormFieldChoice
+//------------------------------------------------------------------------
+
+class FormFieldChoice: public FormField {
+public:
+  FormFieldChoice(PDFDoc *docA, Object *aobj, const Ref& ref, FormField *parent, std::set<int> *usedParents);
+
+  virtual ~FormFieldChoice();
+
+  int getNumChoices() { return numChoices; }
+  GooString* getChoice(int i) { return choices ? choices[i].optionName : NULL; }
+  GooString* getExportVal (int i) { return choices ? choices[i].exportVal : NULL; }
+  // For multi-select choices it returns the first one
+  GooString* getSelectedChoice();
+
+  //select the i-th choice
+  void select (int i); 
+
+  //toggle selection of the i-th choice
+  void toggle (int i);
+
+  //deselect everything
+  void deselectAll ();
+
+  //only work for editable combo box, set the user-entered text as the current choice
+  void setEditChoice(GooString* new_content);
+
+  GooString* getEditChoice ();
+
+  bool isSelected (int i) { return choices[i].selected; }
+
+  int getNumSelected ();
+
+  bool isCombo () const { return combo; }
+  bool hasEdit () const { return edit; }
+  bool isMultiSelect () const { return multiselect; }
+  bool noSpellCheck () const { return doNotSpellCheck; }
+  bool commitOnSelChange () const { return doCommitOnSelChange; }
+  bool isListBox () const { return !combo; }
+
+  int getTopIndex() const { return topIdx; }
+
+#ifdef DEBUG_FORMS
+  void print(int indent = 0);
+#endif
+
+protected:
+  void unselectAll();
+  void updateSelection();
+
+  bool combo;
+  bool edit;
+  bool multiselect;
+  bool doNotSpellCheck;
+  bool doCommitOnSelChange;
+
+  struct ChoiceOpt {
+    GooString* exportVal; //the export value ("internal" name)
+    GooString* optionName; //displayed name
+    bool selected; //if this choice is selected
+  };
+
+  int numChoices;
+  ChoiceOpt* choices;
+  GooString* editedChoice;
+  int topIdx; // TI
+};
+
+//------------------------------------------------------------------------
+// FormFieldSignature
+//------------------------------------------------------------------------
+
+class FormFieldSignature: public FormField {
+public:
+  FormFieldSignature(PDFDoc *docA, Object *dict, const Ref& ref, FormField *parent, std::set<int> *usedParents);
+
+  virtual ~FormFieldSignature();
+
+#ifdef DEBUG_FORMS
+  void print(int indent = 0);
+#endif
+};
+
+//------------------------------------------------------------------------
+// Form
+// This class handle the document-wide part of Form (things in the acroForm
+// Catalog entry).
+//------------------------------------------------------------------------
+
+class Form {
+public:
+  Form(PDFDoc *docA, Object* acroForm);
+
+  ~Form();
+
+  // Look up an inheritable field dictionary entry.
+  static Object *fieldLookup(Dict *field, const char *key, Object *obj);
+  
+  /* Creates a new Field of the type specified in obj's dict.
+     used in Form::Form and FormField::FormField */
+  static FormField *createFieldFromDict (Object* obj, PDFDoc *docA, const Ref& aref, FormField *parent, std::set<int> *usedParents);
+
+  Object *getObj () const { return acroForm; }
+  GBool getNeedAppearances () const { return needAppearances; }
+  int getNumFields() const { return numFields; }
+  FormField* getRootField(int i) const { return rootFields[i]; }
+  GooString* getDefaultAppearance() const { return defaultAppearance; }
+  VariableTextQuadding getTextQuadding() const { return quadding; }
+  GfxResources* getDefaultResources() const { return defaultResources; }
+  Object* getDefaultResourcesObj() { return &resDict; }
+
+  FormWidget* findWidgetByRef (Ref aref);
+
+  void postWidgetsLoad();
+private:
+  FormField** rootFields;
+  int numFields;
+  int size;
+  PDFDoc *doc;
+  XRef* xref;
+  Object *acroForm;
+  GBool needAppearances;
+  GfxResources *defaultResources;
+  Object resDict;
+
+  // Variable Text
+  GooString *defaultAppearance;
+  VariableTextQuadding quadding;
+};
+
+//------------------------------------------------------------------------
+// FormPageWidgets
+//------------------------------------------------------------------------
+
+class FormPageWidgets {
+public:
+  FormPageWidgets (Annots* annots, unsigned int page, Form *form);
+  ~FormPageWidgets();
+  
+  int getNumWidgets() const { return numWidgets; }
+  FormWidget* getWidget(int i) const { return widgets[i]; }
+
+private:
+  FormWidget** widgets;
+  int numWidgets;
+  int size;
+};
+
+#endif
+
diff --git a/poppler/Function.cc b/poppler/Function.cc
new file mode 100644 (file)
index 0000000..2c3aa8a
--- /dev/null
@@ -0,0 +1,1724 @@
+//========================================================================
+//
+// Function.cc
+//
+// Copyright 2001-2003 Glyph & Cog, LLC
+//
+//========================================================================
+
+//========================================================================
+//
+// Modified under the Poppler project - http://poppler.freedesktop.org
+//
+// All changes made under the Poppler project to this file are licensed
+// under GPL version 2 or later
+//
+// Copyright (C) 2006, 2008-2010 Albert Astals Cid <aacid@kde.org>
+// Copyright (C) 2006 Jeff Muizelaar <jeff@infidigm.net>
+// Copyright (C) 2010 Christian Feuersänger <cfeuersaenger@googlemail.com>
+// Copyright (C) 2011 Andrea Canciani <ranma42@gmail.com>
+// Copyright (C) 2012 Thomas Freitag <Thomas.Freitag@alfa.de>
+//
+// To see a description of the changes please see the Changelog file that
+// came with your tarball or type make ChangeLog if you are building from git
+//
+//========================================================================
+
+#include <config.h>
+
+#ifdef USE_GCC_PRAGMAS
+#pragma implementation
+#endif
+
+#include <stdlib.h>
+#include <string.h>
+#include <ctype.h>
+#include <math.h>
+#include "goo/gmem.h"
+#include "goo/gstrtod.h"
+#include "Object.h"
+#include "Dict.h"
+#include "Stream.h"
+#include "Error.h"
+#include "Function.h"
+
+#ifndef M_PI
+#define M_PI 3.14159265358979323846
+#endif
+
+//------------------------------------------------------------------------
+// Function
+//------------------------------------------------------------------------
+
+Function::Function() {
+}
+
+Function::~Function() {
+}
+
+Function *Function::parse(Object *funcObj) {
+  std::set<int> usedParents;
+  return parse(funcObj, &usedParents);
+}
+
+Function *Function::parse(Object *funcObj, std::set<int> *usedParents) {
+  Function *func;
+  Dict *dict;
+  int funcType;
+  Object obj1;
+
+  if (funcObj->isStream()) {
+    dict = funcObj->streamGetDict();
+  } else if (funcObj->isDict()) {
+    dict = funcObj->getDict();
+  } else if (funcObj->isName("Identity")) {
+    return new IdentityFunction();
+  } else {
+    error(errSyntaxError, -1, "Expected function dictionary or stream");
+    return NULL;
+  }
+
+  if (!dict->lookup("FunctionType", &obj1)->isInt()) {
+    error(errSyntaxError, -1, "Function type is missing or wrong type");
+    obj1.free();
+    return NULL;
+  }
+  funcType = obj1.getInt();
+  obj1.free();
+
+  if (funcType == 0) {
+    func = new SampledFunction(funcObj, dict);
+  } else if (funcType == 2) {
+    func = new ExponentialFunction(funcObj, dict);
+  } else if (funcType == 3) {
+    func = new StitchingFunction(funcObj, dict, usedParents);
+  } else if (funcType == 4) {
+    func = new PostScriptFunction(funcObj, dict);
+  } else {
+    error(errSyntaxError, -1, "Unimplemented function type ({0:d})", funcType);
+    return NULL;
+  }
+  if (!func->isOk()) {
+    delete func;
+    return NULL;
+  }
+
+  return func;
+}
+
+GBool Function::init(Dict *dict) {
+  Object obj1, obj2;
+  int i;
+
+  //----- Domain
+  if (!dict->lookup("Domain", &obj1)->isArray()) {
+    error(errSyntaxError, -1, "Function is missing domain");
+    goto err2;
+  }
+  m = obj1.arrayGetLength() / 2;
+  if (m > funcMaxInputs) {
+    error(errSyntaxError, -1, "Functions with more than {0:d} inputs are unsupported",
+         funcMaxInputs);
+    goto err2;
+  }
+  for (i = 0; i < m; ++i) {
+    obj1.arrayGet(2*i, &obj2);
+    if (!obj2.isNum()) {
+      error(errSyntaxError, -1, "Illegal value in function domain array");
+      goto err1;
+    }
+    domain[i][0] = obj2.getNum();
+    obj2.free();
+    obj1.arrayGet(2*i+1, &obj2);
+    if (!obj2.isNum()) {
+      error(errSyntaxError, -1, "Illegal value in function domain array");
+      goto err1;
+    }
+    domain[i][1] = obj2.getNum();
+    obj2.free();
+  }
+  obj1.free();
+
+  //----- Range
+  hasRange = gFalse;
+  n = 0;
+  if (dict->lookup("Range", &obj1)->isArray()) {
+    hasRange = gTrue;
+    n = obj1.arrayGetLength() / 2;
+    if (n > funcMaxOutputs) {
+      error(errSyntaxError, -1, "Functions with more than {0:d} outputs are unsupported",
+           funcMaxOutputs);
+      goto err2;
+    }
+    for (i = 0; i < n; ++i) {
+      obj1.arrayGet(2*i, &obj2);
+      if (!obj2.isNum()) {
+       error(errSyntaxError, -1, "Illegal value in function range array");
+       goto err1;
+      }
+      range[i][0] = obj2.getNum();
+      obj2.free();
+      obj1.arrayGet(2*i+1, &obj2);
+      if (!obj2.isNum()) {
+       error(errSyntaxError, -1, "Illegal value in function range array");
+       goto err1;
+      }
+      range[i][1] = obj2.getNum();
+      obj2.free();
+    }
+  }
+  obj1.free();
+
+  return gTrue;
+
+ err1:
+  obj2.free();
+ err2:
+  obj1.free();
+  return gFalse;
+}
+
+//------------------------------------------------------------------------
+// IdentityFunction
+//------------------------------------------------------------------------
+
+IdentityFunction::IdentityFunction() {
+  int i;
+
+  // fill these in with arbitrary values just in case they get used
+  // somewhere
+  m = funcMaxInputs;
+  n = funcMaxOutputs;
+  for (i = 0; i < funcMaxInputs; ++i) {
+    domain[i][0] = 0;
+    domain[i][1] = 1;
+  }
+  hasRange = gFalse;
+}
+
+IdentityFunction::~IdentityFunction() {
+}
+
+void IdentityFunction::transform(double *in, double *out) {
+  int i;
+
+  for (i = 0; i < funcMaxOutputs; ++i) {
+    out[i] = in[i];
+  }
+}
+
+//------------------------------------------------------------------------
+// SampledFunction
+//------------------------------------------------------------------------
+
+SampledFunction::SampledFunction(Object *funcObj, Dict *dict) {
+  Stream *str;
+  int sampleBits;
+  double sampleMul;
+  Object obj1, obj2;
+  Guint buf, bitMask;
+  int bits;
+  Guint s;
+  double in[funcMaxInputs];
+  int i, j, t, bit, idx;
+
+  idxOffset = NULL;
+  samples = NULL;
+  sBuf = NULL;
+  ok = gFalse;
+
+  //----- initialize the generic stuff
+  if (!init(dict)) {
+    goto err1;
+  }
+  if (!hasRange) {
+    error(errSyntaxError, -1, "Type 0 function is missing range");
+    goto err1;
+  }
+  if (m > sampledFuncMaxInputs) {
+    error(errSyntaxError, -1, "Sampled functions with more than {0:d} inputs are unsupported",
+         sampledFuncMaxInputs);
+    goto err1;
+  }
+
+  //----- buffer
+  sBuf = (double *)gmallocn(1 << m, sizeof(double));
+
+  //----- get the stream
+  if (!funcObj->isStream()) {
+    error(errSyntaxError, -1, "Type 0 function isn't a stream");
+    goto err1;
+  }
+  str = funcObj->getStream();
+
+  //----- Size
+  if (!dict->lookup("Size", &obj1)->isArray() ||
+      obj1.arrayGetLength() != m) {
+    error(errSyntaxError, -1, "Function has missing or invalid size array");
+    goto err2;
+  }
+  for (i = 0; i < m; ++i) {
+    obj1.arrayGet(i, &obj2);
+    if (!obj2.isInt()) {
+      error(errSyntaxError, -1, "Illegal value in function size array");
+      goto err3;
+    }
+    sampleSize[i] = obj2.getInt();
+    if (sampleSize[i] <= 0) {
+      error(errSyntaxError, -1, "Illegal non-positive value in function size array");
+      goto err3;
+    }
+    obj2.free();
+  }
+  obj1.free();
+  idxOffset = (int *)gmallocn(1 << m, sizeof(int));
+  for (i = 0; i < (1<<m); ++i) {
+    idx = 0;
+    for (j = m - 1, t = i; j >= 1; --j, t <<= 1) {
+      if (sampleSize[j] == 1) {
+       bit = 0;
+      } else {
+       bit = (t >> (m - 1)) & 1;
+      }
+      idx = (idx + bit) * sampleSize[j-1];
+    }
+    if (sampleSize[0] == 1) {
+      bit = 0;
+    } else {
+      bit = (t >> (m - 1)) & 1;
+    }
+    idxOffset[i] = (idx + bit) * n;
+  }
+
+  //----- BitsPerSample
+  if (!dict->lookup("BitsPerSample", &obj1)->isInt()) {
+    error(errSyntaxError, -1, "Function has missing or invalid BitsPerSample");
+    goto err2;
+  }
+  sampleBits = obj1.getInt();
+  sampleMul = 1.0 / (pow(2.0, (double)sampleBits) - 1);
+  obj1.free();
+
+  //----- Encode
+  if (dict->lookup("Encode", &obj1)->isArray() &&
+      obj1.arrayGetLength() == 2*m) {
+    for (i = 0; i < m; ++i) {
+      obj1.arrayGet(2*i, &obj2);
+      if (!obj2.isNum()) {
+       error(errSyntaxError, -1, "Illegal value in function encode array");
+       goto err3;
+      }
+      encode[i][0] = obj2.getNum();
+      obj2.free();
+      obj1.arrayGet(2*i+1, &obj2);
+      if (!obj2.isNum()) {
+       error(errSyntaxError, -1, "Illegal value in function encode array");
+       goto err3;
+      }
+      encode[i][1] = obj2.getNum();
+      obj2.free();
+    }
+  } else {
+    for (i = 0; i < m; ++i) {
+      encode[i][0] = 0;
+      encode[i][1] = sampleSize[i] - 1;
+    }
+  }
+  obj1.free();
+  for (i = 0; i < m; ++i) {
+    inputMul[i] = (encode[i][1] - encode[i][0]) /
+                  (domain[i][1] - domain[i][0]);
+  }
+
+  //----- Decode
+  if (dict->lookup("Decode", &obj1)->isArray() &&
+      obj1.arrayGetLength() == 2*n) {
+    for (i = 0; i < n; ++i) {
+      obj1.arrayGet(2*i, &obj2);
+      if (!obj2.isNum()) {
+       error(errSyntaxError, -1, "Illegal value in function decode array");
+       goto err3;
+      }
+      decode[i][0] = obj2.getNum();
+      obj2.free();
+      obj1.arrayGet(2*i+1, &obj2);
+      if (!obj2.isNum()) {
+       error(errSyntaxError, -1, "Illegal value in function decode array");
+       goto err3;
+      }
+      decode[i][1] = obj2.getNum();
+      obj2.free();
+    }
+  } else {
+    for (i = 0; i < n; ++i) {
+      decode[i][0] = range[i][0];
+      decode[i][1] = range[i][1];
+    }
+  }
+  obj1.free();
+
+  //----- samples
+  nSamples = n;
+  for (i = 0; i < m; ++i)
+    nSamples *= sampleSize[i];
+  samples = (double *)gmallocn(nSamples, sizeof(double));
+  buf = 0;
+  bits = 0;
+  bitMask = (1 << sampleBits) - 1;
+  str->reset();
+  for (i = 0; i < nSamples; ++i) {
+    if (sampleBits == 8) {
+      s = str->getChar();
+    } else if (sampleBits == 16) {
+      s = str->getChar();
+      s = (s << 8) + str->getChar();
+    } else if (sampleBits == 32) {
+      s = str->getChar();
+      s = (s << 8) + str->getChar();
+      s = (s << 8) + str->getChar();
+      s = (s << 8) + str->getChar();
+    } else {
+      while (bits < sampleBits) {
+       buf = (buf << 8) | (str->getChar() & 0xff);
+       bits += 8;
+      }
+      s = (buf >> (bits - sampleBits)) & bitMask;
+      bits -= sampleBits;
+    }
+    samples[i] = (double)s * sampleMul;
+  }
+  str->close();
+
+  // set up the cache
+  for (i = 0; i < m; ++i) {
+    in[i] = domain[i][0];
+    cacheIn[i] = in[i] - 1;
+  }
+  transform(in, cacheOut);
+
+  ok = gTrue;
+  return;
+
+ err3:
+  obj2.free();
+ err2:
+  obj1.free();
+ err1:
+  return;
+}
+
+SampledFunction::~SampledFunction() {
+  if (idxOffset) {
+    gfree(idxOffset);
+  }
+  if (samples) {
+    gfree(samples);
+  }
+  if (sBuf) {
+    gfree(sBuf);
+  }
+}
+
+SampledFunction::SampledFunction(SampledFunction *func) {
+  memcpy(this, func, sizeof(SampledFunction));
+  idxOffset = (int *)gmallocn(1 << m, sizeof(int));
+  memcpy(idxOffset, func->idxOffset, (1 << m) * (int)sizeof(int));
+  samples = (double *)gmallocn(nSamples, sizeof(double));
+  memcpy(samples, func->samples, nSamples * sizeof(double));
+  sBuf = (double *)gmallocn(1 << m, sizeof(double));
+}
+
+void SampledFunction::transform(double *in, double *out) {
+  double x;
+  int e[funcMaxInputs];
+  double efrac0[funcMaxInputs];
+  double efrac1[funcMaxInputs];
+  int i, j, k, idx0, t;
+
+  // check the cache
+  for (i = 0; i < m; ++i) {
+    if (in[i] != cacheIn[i]) {
+      break;
+    }
+  }
+  if (i == m) {
+    for (i = 0; i < n; ++i) {
+      out[i] = cacheOut[i];
+    }
+    return;
+  }
+
+  // map input values into sample array
+  for (i = 0; i < m; ++i) {
+    x = (in[i] - domain[i][0]) * inputMul[i] + encode[i][0];
+    if (x < 0 || x != x) {  // x!=x is a more portable version of isnan(x)
+      x = 0;
+    } else if (x > sampleSize[i] - 1) {
+      x = sampleSize[i] - 1;
+    }
+    e[i] = (int)x;
+    if (e[i] == sampleSize[i] - 1 && sampleSize[i] > 1) {
+      // this happens if in[i] = domain[i][1]
+      e[i] = sampleSize[i] - 2;
+    }
+    efrac1[i] = x - e[i];
+    efrac0[i] = 1 - efrac1[i];
+  }
+
+  // compute index for the first sample to be used
+  idx0 = 0;
+  for (k = m - 1; k >= 1; --k) {
+    idx0 = (idx0 + e[k]) * sampleSize[k-1];
+  }
+  idx0 = (idx0 + e[0]) * n;
+
+  // for each output, do m-linear interpolation
+  for (i = 0; i < n; ++i) {
+
+    // pull 2^m values out of the sample array
+    for (j = 0; j < (1<<m); ++j) {
+      int idx = idx0 + idxOffset[j] + i;
+      if (likely(idx >= 0 && idx < nSamples)) {
+        sBuf[j] = samples[idx];
+      } else {
+        sBuf[j] = 0; // TODO Investigate if this is what Adobe does
+      }
+    }
+
+    // do m sets of interpolations
+    for (j = 0, t = (1<<m); j < m; ++j, t >>= 1) {
+      for (k = 0; k < t; k += 2) {
+       sBuf[k >> 1] = efrac0[j] * sBuf[k] + efrac1[j] * sBuf[k+1];
+      }
+    }
+
+    // map output value to range
+    out[i] = sBuf[0] * (decode[i][1] - decode[i][0]) + decode[i][0];
+    if (out[i] < range[i][0]) {
+      out[i] = range[i][0];
+    } else if (out[i] > range[i][1]) {
+      out[i] = range[i][1];
+    }
+  }
+
+  // save current result in the cache
+  for (i = 0; i < m; ++i) {
+    cacheIn[i] = in[i];
+  }
+  for (i = 0; i < n; ++i) {
+    cacheOut[i] = out[i];
+  }
+}
+
+//------------------------------------------------------------------------
+// ExponentialFunction
+//------------------------------------------------------------------------
+
+ExponentialFunction::ExponentialFunction(Object *funcObj, Dict *dict) {
+  Object obj1, obj2;
+  int i;
+
+  ok = gFalse;
+
+  //----- initialize the generic stuff
+  if (!init(dict)) {
+    goto err1;
+  }
+  if (m != 1) {
+    error(errSyntaxError, -1, "Exponential function with more than one input");
+    goto err1;
+  }
+
+  //----- C0
+  if (dict->lookup("C0", &obj1)->isArray()) {
+    if (hasRange && obj1.arrayGetLength() != n) {
+      error(errSyntaxError, -1, "Function's C0 array is wrong length");
+      goto err2;
+    }
+    n = obj1.arrayGetLength();
+    for (i = 0; i < n; ++i) {
+      obj1.arrayGet(i, &obj2);
+      if (!obj2.isNum()) {
+       error(errSyntaxError, -1, "Illegal value in function C0 array");
+       goto err3;
+      }
+      c0[i] = obj2.getNum();
+      obj2.free();
+    }
+  } else {
+    if (hasRange && n != 1) {
+      error(errSyntaxError, -1, "Function's C0 array is wrong length");
+      goto err2;
+    }
+    n = 1;
+    c0[0] = 0;
+  }
+  obj1.free();
+
+  //----- C1
+  if (dict->lookup("C1", &obj1)->isArray()) {
+    if (obj1.arrayGetLength() != n) {
+      error(errSyntaxError, -1, "Function's C1 array is wrong length");
+      goto err2;
+    }
+    for (i = 0; i < n; ++i) {
+      obj1.arrayGet(i, &obj2);
+      if (!obj2.isNum()) {
+       error(errSyntaxError, -1, "Illegal value in function C1 array");
+       goto err3;
+      }
+      c1[i] = obj2.getNum();
+      obj2.free();
+    }
+  } else {
+    if (n != 1) {
+      error(errSyntaxError, -1, "Function's C1 array is wrong length");
+      goto err2;
+    }
+    c1[0] = 1;
+  }
+  obj1.free();
+
+  //----- N (exponent)
+  if (!dict->lookup("N", &obj1)->isNum()) {
+    error(errSyntaxError, -1, "Function has missing or invalid N");
+    goto err2;
+  }
+  e = obj1.getNum();
+  obj1.free();
+
+  isLinear = fabs(e-1.) < 1e-10;
+  ok = gTrue;
+  return;
+
+ err3:
+  obj2.free();
+ err2:
+  obj1.free();
+ err1:
+  return;
+}
+
+ExponentialFunction::~ExponentialFunction() {
+}
+
+ExponentialFunction::ExponentialFunction(ExponentialFunction *func) {
+  memcpy(this, func, sizeof(ExponentialFunction));
+}
+
+void ExponentialFunction::transform(double *in, double *out) {
+  double x;
+  int i;
+
+  if (in[0] < domain[0][0]) {
+    x = domain[0][0];
+  } else if (in[0] > domain[0][1]) {
+    x = domain[0][1];
+  } else {
+    x = in[0];
+  }
+  for (i = 0; i < n; ++i) {
+    out[i] = c0[i] + (isLinear ? x : pow(x, e)) * (c1[i] - c0[i]);
+    if (hasRange) {
+      if (out[i] < range[i][0]) {
+       out[i] = range[i][0];
+      } else if (out[i] > range[i][1]) {
+       out[i] = range[i][1];
+      }
+    }
+  }
+  return;
+}
+
+//------------------------------------------------------------------------
+// StitchingFunction
+//------------------------------------------------------------------------
+
+StitchingFunction::StitchingFunction(Object *funcObj, Dict *dict, std::set<int> *usedParents) {
+  Object obj1, obj2;
+  int i;
+
+  ok = gFalse;
+  funcs = NULL;
+  bounds = NULL;
+  encode = NULL;
+  scale = NULL;
+
+  //----- initialize the generic stuff
+  if (!init(dict)) {
+    goto err1;
+  }
+  if (m != 1) {
+    error(errSyntaxError, -1, "Stitching function with more than one input");
+    goto err1;
+  }
+
+  //----- Functions
+  if (!dict->lookup("Functions", &obj1)->isArray()) {
+    error(errSyntaxError, -1, "Missing 'Functions' entry in stitching function");
+    goto err1;
+  }
+  k = obj1.arrayGetLength();
+  funcs = (Function **)gmallocn(k, sizeof(Function *));
+  bounds = (double *)gmallocn(k + 1, sizeof(double));
+  encode = (double *)gmallocn(2 * k, sizeof(double));
+  scale = (double *)gmallocn(k, sizeof(double));
+  for (i = 0; i < k; ++i) {
+    funcs[i] = NULL;
+  }
+  for (i = 0; i < k; ++i) {
+    std::set<int> usedParentsAux = *usedParents;
+    obj1.arrayGetNF(i, &obj2);
+    if (obj2.isRef()) {
+      const Ref ref = obj2.getRef();
+      if (usedParentsAux.find(ref.num) == usedParentsAux.end()) {
+        usedParentsAux.insert(ref.num);
+        obj2.free();
+        obj1.arrayGet(i, &obj2);
+      } else {
+        goto err2;
+      }
+    }
+    if (!(funcs[i] = Function::parse(&obj2, &usedParentsAux))) {
+      goto err2;
+    }
+    if (funcs[i]->getInputSize() != 1 ||
+       (i > 0 && funcs[i]->getOutputSize() != funcs[0]->getOutputSize())) {
+      error(errSyntaxError, -1,
+           "Incompatible subfunctions in stitching function");
+      goto err2;
+    }
+    obj2.free();
+  }
+  obj1.free();
+
+  //----- Bounds
+  if (!dict->lookup("Bounds", &obj1)->isArray() ||
+      obj1.arrayGetLength() != k - 1) {
+    error(errSyntaxError, -1, "Missing or invalid 'Bounds' entry in stitching function");
+    goto err1;
+  }
+  bounds[0] = domain[0][0];
+  for (i = 1; i < k; ++i) {
+    if (!obj1.arrayGet(i - 1, &obj2)->isNum()) {
+      error(errSyntaxError, -1, "Invalid type in 'Bounds' array in stitching function");
+      goto err2;
+    }
+    bounds[i] = obj2.getNum();
+    obj2.free();
+  }
+  bounds[k] = domain[0][1];
+  obj1.free();
+
+  //----- Encode
+  if (!dict->lookup("Encode", &obj1)->isArray() ||
+      obj1.arrayGetLength() != 2 * k) {
+    error(errSyntaxError, -1, "Missing or invalid 'Encode' entry in stitching function");
+    goto err1;
+  }
+  for (i = 0; i < 2 * k; ++i) {
+    if (!obj1.arrayGet(i, &obj2)->isNum()) {
+      error(errSyntaxError, -1, "Invalid type in 'Encode' array in stitching function");
+      goto err2;
+    }
+    encode[i] = obj2.getNum();
+    obj2.free();
+  }
+  obj1.free();
+
+  //----- pre-compute the scale factors
+  for (i = 0; i < k; ++i) {
+    if (bounds[i] == bounds[i+1]) {
+      // avoid a divide-by-zero -- in this situation, function i will
+      // never be used anyway
+      scale[i] = 0;
+    } else {
+      scale[i] = (encode[2*i+1] - encode[2*i]) / (bounds[i+1] - bounds[i]);
+    }
+  }
+
+  n = funcs[0]->getOutputSize();
+  ok = gTrue;
+  return;
+
+ err2:
+  obj2.free();
+ err1:
+  obj1.free();
+}
+
+StitchingFunction::StitchingFunction(StitchingFunction *func) {
+  int i;
+
+  memcpy(this, func, sizeof(StitchingFunction));
+  funcs = (Function **)gmallocn(k, sizeof(Function *));
+  for (i = 0; i < k; ++i) {
+    funcs[i] = func->funcs[i]->copy();
+  }
+  bounds = (double *)gmallocn(k + 1, sizeof(double));
+  memcpy(bounds, func->bounds, (k + 1) * sizeof(double));
+  encode = (double *)gmallocn(2 * k, sizeof(double));
+  memcpy(encode, func->encode, 2 * k * sizeof(double));
+  scale = (double *)gmallocn(k, sizeof(double));
+  memcpy(scale, func->scale, k * sizeof(double));
+  ok = gTrue;
+}
+
+StitchingFunction::~StitchingFunction() {
+  int i;
+
+  if (funcs) {
+    for (i = 0; i < k; ++i) {
+      if (funcs[i]) {
+       delete funcs[i];
+      }
+    }
+  }
+  gfree(funcs);
+  gfree(bounds);
+  gfree(encode);
+  gfree(scale);
+}
+
+void StitchingFunction::transform(double *in, double *out) {
+  double x;
+  int i;
+
+  if (in[0] < domain[0][0]) {
+    x = domain[0][0];
+  } else if (in[0] > domain[0][1]) {
+    x = domain[0][1];
+  } else {
+    x = in[0];
+  }
+  for (i = 0; i < k - 1; ++i) {
+    if (x < bounds[i+1]) {
+      break;
+    }
+  }
+  x = encode[2*i] + (x - bounds[i]) * scale[i];
+  funcs[i]->transform(&x, out);
+}
+
+//------------------------------------------------------------------------
+// PostScriptFunction
+//------------------------------------------------------------------------
+
+enum PSOp {
+  psOpAbs,
+  psOpAdd,
+  psOpAnd,
+  psOpAtan,
+  psOpBitshift,
+  psOpCeiling,
+  psOpCopy,
+  psOpCos,
+  psOpCvi,
+  psOpCvr,
+  psOpDiv,
+  psOpDup,
+  psOpEq,
+  psOpExch,
+  psOpExp,
+  psOpFalse,
+  psOpFloor,
+  psOpGe,
+  psOpGt,
+  psOpIdiv,
+  psOpIndex,
+  psOpLe,
+  psOpLn,
+  psOpLog,
+  psOpLt,
+  psOpMod,
+  psOpMul,
+  psOpNe,
+  psOpNeg,
+  psOpNot,
+  psOpOr,
+  psOpPop,
+  psOpRoll,
+  psOpRound,
+  psOpSin,
+  psOpSqrt,
+  psOpSub,
+  psOpTrue,
+  psOpTruncate,
+  psOpXor,
+  psOpIf,
+  psOpIfelse,
+  psOpReturn
+};
+
+// Note: 'if' and 'ifelse' are parsed separately.
+// The rest are listed here in alphabetical order.
+// The index in this table is equivalent to the entry in PSOp.
+static const char *psOpNames[] = {
+  "abs",
+  "add",
+  "and",
+  "atan",
+  "bitshift",
+  "ceiling",
+  "copy",
+  "cos",
+  "cvi",
+  "cvr",
+  "div",
+  "dup",
+  "eq",
+  "exch",
+  "exp",
+  "false",
+  "floor",
+  "ge",
+  "gt",
+  "idiv",
+  "index",
+  "le",
+  "ln",
+  "log",
+  "lt",
+  "mod",
+  "mul",
+  "ne",
+  "neg",
+  "not",
+  "or",
+  "pop",
+  "roll",
+  "round",
+  "sin",
+  "sqrt",
+  "sub",
+  "true",
+  "truncate",
+  "xor"
+};
+
+#define nPSOps (sizeof(psOpNames) / sizeof(char *))
+
+enum PSObjectType {
+  psBool,
+  psInt,
+  psReal,
+  psOperator,
+  psBlock
+};
+
+// In the code array, 'if'/'ifelse' operators take up three slots
+// plus space for the code in the subclause(s).
+//
+//         +---------------------------------+
+//         | psOperator: psOpIf / psOpIfelse |
+//         +---------------------------------+
+//         | psBlock: ptr=<A>                |
+//         +---------------------------------+
+//         | psBlock: ptr=<B>                |
+//         +---------------------------------+
+//         | if clause                       |
+//         | ...                             |
+//         | psOperator: psOpReturn          |
+//         +---------------------------------+
+//     <A> | else clause                     |
+//         | ...                             |
+//         | psOperator: psOpReturn          |
+//         +---------------------------------+
+//     <B> | ...                             |
+//
+// For 'if', pointer <A> is present in the code stream but unused.
+
+struct PSObject {
+  PSObjectType type;
+  union {
+    GBool booln;               // boolean (stack only)
+    int intg;                  // integer (stack and code)
+    double real;               // real (stack and code)
+    PSOp op;                   // operator (code only)
+    int blk;                   // if/ifelse block pointer (code only)
+  };
+};
+
+#define psStackSize 100
+
+class PSStack {
+public:
+
+  PSStack() {sp = psStackSize; }
+  void clear() { sp = psStackSize; }
+  void pushBool(GBool booln)
+  {
+    if (checkOverflow()) {
+      stack[--sp].type = psBool;
+      stack[sp].booln = booln;
+    }
+  }
+  void pushInt(int intg)
+  {
+    if (checkOverflow()) {
+      stack[--sp].type = psInt;
+      stack[sp].intg = intg;
+    }
+  }
+  void pushReal(double real)
+  {
+    if (checkOverflow()) {
+      stack[--sp].type = psReal;
+      stack[sp].real = real;
+    }
+  }
+  GBool popBool()
+  {
+    if (checkUnderflow() && checkType(psBool, psBool)) {
+      return stack[sp++].booln;
+    }
+    return gFalse;
+  }
+  int popInt()
+  {
+    if (checkUnderflow() && checkType(psInt, psInt)) {
+      return stack[sp++].intg;
+    }
+    return 0;
+  }
+  double popNum()
+  {
+    double ret;
+
+    if (checkUnderflow() && checkType(psInt, psReal)) {
+      ret = (stack[sp].type == psInt) ? (double)stack[sp].intg : stack[sp].real;
+      ++sp;
+      return ret;
+    }
+    return 0;
+  }
+  GBool empty() { return sp == psStackSize; }
+  GBool topIsInt() { return sp < psStackSize && stack[sp].type == psInt; }
+  GBool topTwoAreInts()
+    { return sp < psStackSize - 1 &&
+            stack[sp].type == psInt &&
+             stack[sp+1].type == psInt; }
+  GBool topIsReal() { return sp < psStackSize && stack[sp].type == psReal; }
+  GBool topTwoAreNums()
+    { return sp < psStackSize - 1 &&
+            (stack[sp].type == psInt || stack[sp].type == psReal) &&
+            (stack[sp+1].type == psInt || stack[sp+1].type == psReal); }
+  void copy(int n);
+  void roll(int n, int j);
+  void index(int i)
+  {
+    if (!checkOverflow()) {
+      return;
+    }
+    --sp;
+    if (sp + i + 1 >= psStackSize) {
+      error(errSyntaxError, -1, "Stack underflow in PostScript function");
+      return;
+    }
+    stack[sp] = stack[sp + 1 + i];
+  }
+  void pop()
+  {
+    if (!checkUnderflow()) {
+      return;
+    }
+    ++sp;
+  }
+
+private:
+
+  GBool checkOverflow(int n = 1)
+  {
+    if (sp - n < 0) {
+      error(errSyntaxError, -1, "Stack overflow in PostScript function");
+      return gFalse;
+    }
+    return gTrue;
+  }
+  GBool checkUnderflow()
+  {
+    if (sp == psStackSize) {
+      error(errSyntaxError, -1, "Stack underflow in PostScript function");
+      return gFalse;
+    }
+    return gTrue;
+  }
+  GBool checkType(PSObjectType t1, PSObjectType t2)
+  {
+    if (stack[sp].type != t1 && stack[sp].type != t2) {
+      error(errSyntaxError, -1, "Type mismatch in PostScript function");
+      return gFalse;
+    }
+    return gTrue;
+  }
+  PSObject stack[psStackSize];
+  int sp;
+};
+
+
+void PSStack::copy(int n) {
+  int i;
+
+  if (sp + n > psStackSize) {
+    error(errSyntaxError, -1, "Stack underflow in PostScript function");
+    return;
+  }
+  if (!checkOverflow(n)) {
+    return;
+  }
+  for (i = sp + n - 1; i >= sp; --i) {
+    stack[i - n] = stack[i];
+  }
+  sp -= n;
+}
+
+void PSStack::roll(int n, int j) {
+  PSObject obj;
+  int i, k;
+
+  if (unlikely(n == 0)) {
+    return;
+  }
+  if (j >= 0) {
+    j %= n;
+  } else {
+    j = -j % n;
+    if (j != 0) {
+      j = n - j;
+    }
+  }
+  if (n <= 0 || j == 0 || n > psStackSize || sp + n > psStackSize) {
+    return;
+  }
+  if (j <= n / 2) {
+    for (i = 0; i < j; ++i) {
+      obj = stack[sp];
+      for (k = sp; k < sp + n - 1; ++k) {
+        stack[k] = stack[k+1];
+      }
+      stack[sp + n - 1] = obj;
+    }
+  } else {
+    j = n - j;
+    for (i = 0; i < j; ++i) {
+      obj = stack[sp + n - 1];
+      for (k = sp + n - 1; k > sp; --k) {
+        stack[k] = stack[k-1];
+      }
+      stack[sp] = obj;
+    }
+  }
+}
+
+PostScriptFunction::PostScriptFunction(Object *funcObj, Dict *dict) {
+  Stream *str;
+  int codePtr;
+  GooString *tok;
+  double in[funcMaxInputs];
+  int i;
+
+  code = NULL;
+  codeString = NULL;
+  codeSize = 0;
+  ok = gFalse;
+
+  //----- initialize the generic stuff
+  if (!init(dict)) {
+    goto err1;
+  }
+  if (!hasRange) {
+    error(errSyntaxError, -1, "Type 4 function is missing range");
+    goto err1;
+  }
+
+  //----- get the stream
+  if (!funcObj->isStream()) {
+    error(errSyntaxError, -1, "Type 4 function isn't a stream");
+    goto err1;
+  }
+  str = funcObj->getStream();
+
+  //----- parse the function
+  codeString = new GooString();
+  str->reset();
+  if (!(tok = getToken(str)) || tok->cmp("{")) {
+    error(errSyntaxError, -1, "Expected '{' at start of PostScript function");
+    if (tok) {
+      delete tok;
+    }
+    goto err1;
+  }
+  delete tok;
+  codePtr = 0;
+  if (!parseCode(str, &codePtr)) {
+    goto err2;
+  }
+  str->close();
+
+  //----- set up the cache
+  for (i = 0; i < m; ++i) {
+    in[i] = domain[i][0];
+    cacheIn[i] = in[i] - 1;
+  }
+  transform(in, cacheOut);
+
+  ok = gTrue;
+  
+ err2:
+  str->close();
+ err1:
+  return;
+}
+
+PostScriptFunction::PostScriptFunction(PostScriptFunction *func) {
+  memcpy(this, func, sizeof(PostScriptFunction));
+  code = (PSObject *)gmallocn(codeSize, sizeof(PSObject));
+  memcpy(code, func->code, codeSize * sizeof(PSObject));
+  codeString = func->codeString->copy();
+}
+
+PostScriptFunction::~PostScriptFunction() {
+  gfree(code);
+  delete codeString;
+}
+
+void PostScriptFunction::transform(double *in, double *out) {
+  PSStack stack;
+  int i;
+
+  // check the cache
+  for (i = 0; i < m; ++i) {
+    if (in[i] != cacheIn[i]) {
+      break;
+    }
+  }
+  if (i == m) {
+    for (i = 0; i < n; ++i) {
+      out[i] = cacheOut[i];
+    }
+    return;
+  }
+
+  for (i = 0; i < m; ++i) {
+    //~ may need to check for integers here
+    stack.pushReal(in[i]);
+  }
+  exec(&stack, 0);
+  for (i = n - 1; i >= 0; --i) {
+    out[i] = stack.popNum();
+    if (out[i] < range[i][0]) {
+      out[i] = range[i][0];
+    } else if (out[i] > range[i][1]) {
+      out[i] = range[i][1];
+    }
+  }
+  stack.clear();
+
+  // if (!stack->empty()) {
+  //   error(errSyntaxWarning, -1,
+  //         "Extra values on stack at end of PostScript function");
+  // }
+
+  // save current result in the cache
+  for (i = 0; i < m; ++i) {
+    cacheIn[i] = in[i];
+  }
+  for (i = 0; i < n; ++i) {
+    cacheOut[i] = out[i];
+  }
+}
+
+GBool PostScriptFunction::parseCode(Stream *str, int *codePtr) {
+  GooString *tok;
+  char *p;
+  GBool isReal;
+  int opPtr, elsePtr;
+  int a, b, mid, cmp;
+
+  while (1) {
+    if (!(tok = getToken(str))) {
+      error(errSyntaxError, -1, "Unexpected end of PostScript function stream");
+      return gFalse;
+    }
+    p = tok->getCString();
+    if (isdigit(*p) || *p == '.' || *p == '-') {
+      isReal = gFalse;
+      for (; *p; ++p) {
+       if (*p == '.') {
+         isReal = gTrue;
+         break;
+       }
+      }
+      resizeCode(*codePtr);
+      if (isReal) {
+       code[*codePtr].type = psReal;
+          code[*codePtr].real = gatof(tok->getCString());
+      } else {
+       code[*codePtr].type = psInt;
+       code[*codePtr].intg = atoi(tok->getCString());
+      }
+      ++*codePtr;
+      delete tok;
+    } else if (!tok->cmp("{")) {
+      delete tok;
+      opPtr = *codePtr;
+      *codePtr += 3;
+      resizeCode(opPtr + 2);
+      if (!parseCode(str, codePtr)) {
+       return gFalse;
+      }
+      if (!(tok = getToken(str))) {
+       error(errSyntaxError, -1, "Unexpected end of PostScript function stream");
+       return gFalse;
+      }
+      if (!tok->cmp("{")) {
+       elsePtr = *codePtr;
+       if (!parseCode(str, codePtr)) {
+         return gFalse;
+       }
+       delete tok;
+       if (!(tok = getToken(str))) {
+         error(errSyntaxError, -1, "Unexpected end of PostScript function stream");
+         return gFalse;
+       }
+      } else {
+       elsePtr = -1;
+      }
+      if (!tok->cmp("if")) {
+       if (elsePtr >= 0) {
+         error(errSyntaxError, -1,
+               "Got 'if' operator with two blocks in PostScript function");
+         return gFalse;
+       }
+       code[opPtr].type = psOperator;
+       code[opPtr].op = psOpIf;
+       code[opPtr+2].type = psBlock;
+       code[opPtr+2].blk = *codePtr;
+      } else if (!tok->cmp("ifelse")) {
+       if (elsePtr < 0) {
+         error(errSyntaxError, -1,
+               "Got 'ifelse' operator with one block in PostScript function");
+         return gFalse;
+       }
+       code[opPtr].type = psOperator;
+       code[opPtr].op = psOpIfelse;
+       code[opPtr+1].type = psBlock;
+       code[opPtr+1].blk = elsePtr;
+       code[opPtr+2].type = psBlock;
+       code[opPtr+2].blk = *codePtr;
+      } else {
+       error(errSyntaxError, -1,
+             "Expected if/ifelse operator in PostScript function");
+       delete tok;
+       return gFalse;
+      }
+      delete tok;
+    } else if (!tok->cmp("}")) {
+      delete tok;
+      resizeCode(*codePtr);
+      code[*codePtr].type = psOperator;
+      code[*codePtr].op = psOpReturn;
+      ++*codePtr;
+      break;
+    } else {
+      a = -1;
+      b = nPSOps;
+      cmp = 0; // make gcc happy
+      // invariant: psOpNames[a] < tok < psOpNames[b]
+      while (b - a > 1) {
+       mid = (a + b) / 2;
+       cmp = tok->cmp(psOpNames[mid]);
+       if (cmp > 0) {
+         a = mid;
+       } else if (cmp < 0) {
+         b = mid;
+       } else {
+         a = b = mid;
+       }
+      }
+      if (cmp != 0) {
+       error(errSyntaxError, -1,
+             "Unknown operator '{0:t}' in PostScript function",
+             tok);
+       delete tok;
+       return gFalse;
+      }
+      delete tok;
+      resizeCode(*codePtr);
+      code[*codePtr].type = psOperator;
+      code[*codePtr].op = (PSOp)a;
+      ++*codePtr;
+    }
+  }
+  return gTrue;
+}
+
+GooString *PostScriptFunction::getToken(Stream *str) {
+  GooString *s;
+  int c;
+  GBool comment;
+
+  s = new GooString();
+  comment = gFalse;
+  while (1) {
+    if ((c = str->getChar()) == EOF) {
+      break;
+    }
+    codeString->append(c);
+    if (comment) {
+      if (c == '\x0a' || c == '\x0d') {
+       comment = gFalse;
+      }
+    } else if (c == '%') {
+      comment = gTrue;
+    } else if (!isspace(c)) {
+      break;
+    }
+  }
+  if (c == '{' || c == '}') {
+    s->append((char)c);
+  } else if (isdigit(c) || c == '.' || c == '-') {
+    while (1) {
+      s->append((char)c);
+      c = str->lookChar();
+      if (c == EOF || !(isdigit(c) || c == '.' || c == '-')) {
+       break;
+      }
+      str->getChar();
+      codeString->append(c);
+    }
+  } else {
+    while (1) {
+      s->append((char)c);
+      c = str->lookChar();
+      if (c == EOF || !isalnum(c)) {
+       break;
+      }
+      str->getChar();
+      codeString->append(c);
+    }
+  }
+  return s;
+}
+
+void PostScriptFunction::resizeCode(int newSize) {
+  if (newSize >= codeSize) {
+    codeSize += 64;
+    code = (PSObject *)greallocn(code, codeSize, sizeof(PSObject));
+  }
+}
+
+void PostScriptFunction::exec(PSStack *stack, int codePtr) {
+  int i1, i2;
+  double r1, r2, result;
+  GBool b1, b2;
+
+  while (1) {
+    switch (code[codePtr].type) {
+    case psInt:
+      stack->pushInt(code[codePtr++].intg);
+      break;
+    case psReal:
+      stack->pushReal(code[codePtr++].real);
+      break;
+    case psOperator:
+      switch (code[codePtr++].op) {
+      case psOpAbs:
+       if (stack->topIsInt()) {
+         stack->pushInt(abs(stack->popInt()));
+       } else {
+         stack->pushReal(fabs(stack->popNum()));
+       }
+       break;
+      case psOpAdd:
+       if (stack->topTwoAreInts()) {
+         i2 = stack->popInt();
+         i1 = stack->popInt();
+         stack->pushInt(i1 + i2);
+       } else {
+         r2 = stack->popNum();
+         r1 = stack->popNum();
+         stack->pushReal(r1 + r2);
+       }
+       break;
+      case psOpAnd:
+       if (stack->topTwoAreInts()) {
+         i2 = stack->popInt();
+         i1 = stack->popInt();
+         stack->pushInt(i1 & i2);
+       } else {
+         b2 = stack->popBool();
+         b1 = stack->popBool();
+         stack->pushBool(b1 && b2);
+       }
+       break;
+      case psOpAtan:
+       r2 = stack->popNum();
+       r1 = stack->popNum();
+       result = atan2(r1, r2) * 180.0 / M_PI;
+       if (result < 0) result += 360.0;
+       stack->pushReal(result);
+       break;
+      case psOpBitshift:
+       i2 = stack->popInt();
+       i1 = stack->popInt();
+       if (i2 > 0) {
+         stack->pushInt(i1 << i2);
+       } else if (i2 < 0) {
+         stack->pushInt((int)((Guint)i1 >> -i2));
+       } else {
+         stack->pushInt(i1);
+       }
+       break;
+      case psOpCeiling:
+       if (!stack->topIsInt()) {
+         stack->pushReal(ceil(stack->popNum()));
+       }
+       break;
+      case psOpCopy:
+       stack->copy(stack->popInt());
+       break;
+      case psOpCos:
+       stack->pushReal(cos(stack->popNum() * M_PI / 180.0));
+       break;
+      case psOpCvi:
+       if (!stack->topIsInt()) {
+         stack->pushInt((int)stack->popNum());
+       }
+       break;
+      case psOpCvr:
+       if (!stack->topIsReal()) {
+         stack->pushReal(stack->popNum());
+       }
+       break;
+      case psOpDiv:
+       r2 = stack->popNum();
+       r1 = stack->popNum();
+       stack->pushReal(r1 / r2);
+       break;
+      case psOpDup:
+       stack->copy(1);
+       break;
+      case psOpEq:
+       if (stack->topTwoAreInts()) {
+         i2 = stack->popInt();
+         i1 = stack->popInt();
+         stack->pushBool(i1 == i2);
+       } else if (stack->topTwoAreNums()) {
+         r2 = stack->popNum();
+         r1 = stack->popNum();
+         stack->pushBool(r1 == r2);
+       } else {
+         b2 = stack->popBool();
+         b1 = stack->popBool();
+         stack->pushBool(b1 == b2);
+       }
+       break;
+      case psOpExch:
+       stack->roll(2, 1);
+       break;
+      case psOpExp:
+       r2 = stack->popNum();
+       r1 = stack->popNum();
+       stack->pushReal(pow(r1, r2));
+       break;
+      case psOpFalse:
+       stack->pushBool(gFalse);
+       break;
+      case psOpFloor:
+       if (!stack->topIsInt()) {
+         stack->pushReal(floor(stack->popNum()));
+       }
+       break;
+      case psOpGe:
+       if (stack->topTwoAreInts()) {
+         i2 = stack->popInt();
+         i1 = stack->popInt();
+         stack->pushBool(i1 >= i2);
+       } else {
+         r2 = stack->popNum();
+         r1 = stack->popNum();
+         stack->pushBool(r1 >= r2);
+       }
+       break;
+      case psOpGt:
+       if (stack->topTwoAreInts()) {
+         i2 = stack->popInt();
+         i1 = stack->popInt();
+         stack->pushBool(i1 > i2);
+       } else {
+         r2 = stack->popNum();
+         r1 = stack->popNum();
+         stack->pushBool(r1 > r2);
+       }
+       break;
+      case psOpIdiv:
+       i2 = stack->popInt();
+       i1 = stack->popInt();
+       stack->pushInt(i1 / i2);
+       break;
+      case psOpIndex:
+       stack->index(stack->popInt());
+       break;
+      case psOpLe:
+       if (stack->topTwoAreInts()) {
+         i2 = stack->popInt();
+         i1 = stack->popInt();
+         stack->pushBool(i1 <= i2);
+       } else {
+         r2 = stack->popNum();
+         r1 = stack->popNum();
+         stack->pushBool(r1 <= r2);
+       }
+       break;
+      case psOpLn:
+       stack->pushReal(log(stack->popNum()));
+       break;
+      case psOpLog:
+       stack->pushReal(log10(stack->popNum()));
+       break;
+      case psOpLt:
+       if (stack->topTwoAreInts()) {
+         i2 = stack->popInt();
+         i1 = stack->popInt();
+         stack->pushBool(i1 < i2);
+       } else {
+         r2 = stack->popNum();
+         r1 = stack->popNum();
+         stack->pushBool(r1 < r2);
+       }
+       break;
+      case psOpMod:
+       i2 = stack->popInt();
+       i1 = stack->popInt();
+       stack->pushInt(i1 % i2);
+       break;
+      case psOpMul:
+       if (stack->topTwoAreInts()) {
+         i2 = stack->popInt();
+         i1 = stack->popInt();
+         //~ should check for out-of-range, and push a real instead
+         stack->pushInt(i1 * i2);
+       } else {
+         r2 = stack->popNum();
+         r1 = stack->popNum();
+         stack->pushReal(r1 * r2);
+       }
+       break;
+      case psOpNe:
+       if (stack->topTwoAreInts()) {
+         i2 = stack->popInt();
+         i1 = stack->popInt();
+         stack->pushBool(i1 != i2);
+       } else if (stack->topTwoAreNums()) {
+         r2 = stack->popNum();
+         r1 = stack->popNum();
+         stack->pushBool(r1 != r2);
+       } else {
+         b2 = stack->popBool();
+         b1 = stack->popBool();
+         stack->pushBool(b1 != b2);
+       }
+       break;
+      case psOpNeg:
+       if (stack->topIsInt()) {
+         stack->pushInt(-stack->popInt());
+       } else {
+         stack->pushReal(-stack->popNum());
+       }
+       break;
+      case psOpNot:
+       if (stack->topIsInt()) {
+         stack->pushInt(~stack->popInt());
+       } else {
+         stack->pushBool(!stack->popBool());
+       }
+       break;
+      case psOpOr:
+       if (stack->topTwoAreInts()) {
+         i2 = stack->popInt();
+         i1 = stack->popInt();
+         stack->pushInt(i1 | i2);
+       } else {
+         b2 = stack->popBool();
+         b1 = stack->popBool();
+         stack->pushBool(b1 || b2);
+       }
+       break;
+      case psOpPop:
+       stack->pop();
+       break;
+      case psOpRoll:
+       i2 = stack->popInt();
+       i1 = stack->popInt();
+       stack->roll(i1, i2);
+       break;
+      case psOpRound:
+       if (!stack->topIsInt()) {
+         r1 = stack->popNum();
+         stack->pushReal((r1 >= 0) ? floor(r1 + 0.5) : ceil(r1 - 0.5));
+       }
+       break;
+      case psOpSin:
+       stack->pushReal(sin(stack->popNum() * M_PI / 180.0));
+       break;
+      case psOpSqrt:
+       stack->pushReal(sqrt(stack->popNum()));
+       break;
+      case psOpSub:
+       if (stack->topTwoAreInts()) {
+         i2 = stack->popInt();
+         i1 = stack->popInt();
+         stack->pushInt(i1 - i2);
+       } else {
+         r2 = stack->popNum();
+         r1 = stack->popNum();
+         stack->pushReal(r1 - r2);
+       }
+       break;
+      case psOpTrue:
+       stack->pushBool(gTrue);
+       break;
+      case psOpTruncate:
+       if (!stack->topIsInt()) {
+         r1 = stack->popNum();
+         stack->pushReal((r1 >= 0) ? floor(r1) : ceil(r1));
+       }
+       break;
+      case psOpXor:
+       if (stack->topTwoAreInts()) {
+         i2 = stack->popInt();
+         i1 = stack->popInt();
+         stack->pushInt(i1 ^ i2);
+       } else {
+         b2 = stack->popBool();
+         b1 = stack->popBool();
+         stack->pushBool(b1 ^ b2);
+       }
+       break;
+      case psOpIf:
+       b1 = stack->popBool();
+       if (b1) {
+         exec(stack, codePtr + 2);
+       }
+       codePtr = code[codePtr + 1].blk;
+       break;
+      case psOpIfelse:
+       b1 = stack->popBool();
+       if (b1) {
+         exec(stack, codePtr + 2);
+       } else {
+         exec(stack, code[codePtr].blk);
+       }
+       codePtr = code[codePtr + 1].blk;
+       break;
+      case psOpReturn:
+       return;
+      }
+      break;
+    default:
+      error(errSyntaxError, -1, "Internal: bad object in PostScript function code");
+      break;
+    }
+  }
+}
diff --git a/poppler/Function.h b/poppler/Function.h
new file mode 100644 (file)
index 0000000..a456dfe
--- /dev/null
@@ -0,0 +1,251 @@
+//========================================================================
+//
+// Function.h
+//
+// Copyright 2001-2003 Glyph & Cog, LLC
+//
+//========================================================================
+
+//========================================================================
+//
+// Modified under the Poppler project - http://poppler.freedesktop.org
+//
+// All changes made under the Poppler project to this file are licensed
+// under GPL version 2 or later
+//
+// Copyright (C) 2009, 2010 Albert Astals Cid <aacid@kde.org>
+// Copyright (C) 2010 Christian Feuersänger <cfeuersaenger@googlemail.com>
+// Copyright (C) 2011 Andrea Canciani <ranma42@gmail.com>
+//
+// To see a description of the changes please see the Changelog file that
+// came with your tarball or type make ChangeLog if you are building from git
+//
+//========================================================================
+
+#ifndef FUNCTION_H
+#define FUNCTION_H
+
+#ifdef USE_GCC_PRAGMAS
+#pragma interface
+#endif
+
+#include "goo/gtypes.h"
+#include "Object.h"
+#include <set>
+
+class Dict;
+class Stream;
+struct PSObject;
+class PSStack;
+class PopplerCache;
+
+//------------------------------------------------------------------------
+// Function
+//------------------------------------------------------------------------
+
+#define funcMaxInputs        32
+#define funcMaxOutputs       32
+#define sampledFuncMaxInputs 16
+
+class Function {
+public:
+
+  Function();
+
+  virtual ~Function();
+
+  // Construct a function.  Returns NULL if unsuccessful.
+  static Function *parse(Object *funcObj);
+
+  // Initialize the entries common to all function types.
+  GBool init(Dict *dict);
+
+  virtual Function *copy() = 0;
+
+  // Return the function type:
+  //   -1 : identity
+  //    0 : sampled
+  //    2 : exponential
+  //    3 : stitching
+  //    4 : PostScript
+  virtual int getType() = 0;
+
+  // Return size of input and output tuples.
+  int getInputSize() { return m; }
+  int getOutputSize() { return n; }
+
+  double getDomainMin(int i) { return domain[i][0]; }
+  double getDomainMax(int i) { return domain[i][1]; }
+  double getRangeMin(int i) { return range[i][0]; }
+  double getRangeMax(int i) { return range[i][1]; }
+  GBool getHasRange() { return hasRange; }
+
+  // Transform an input tuple into an output tuple.
+  virtual void transform(double *in, double *out) = 0;
+
+  virtual GBool isOk() = 0;
+
+protected:
+  static Function *parse(Object *funcObj, std::set<int> *usedParents);
+
+  int m, n;                    // size of input and output tuples
+  double                       // min and max values for function domain
+    domain[funcMaxInputs][2];
+  double                       // min and max values for function range
+    range[funcMaxOutputs][2];
+  GBool hasRange;              // set if range is defined
+};
+
+//------------------------------------------------------------------------
+// IdentityFunction
+//------------------------------------------------------------------------
+
+class IdentityFunction: public Function {
+public:
+
+  IdentityFunction();
+  virtual ~IdentityFunction();
+  virtual Function *copy() { return new IdentityFunction(); }
+  virtual int getType() { return -1; }
+  virtual void transform(double *in, double *out);
+  virtual GBool isOk() { return gTrue; }
+
+private:
+};
+
+//------------------------------------------------------------------------
+// SampledFunction
+//------------------------------------------------------------------------
+
+class SampledFunction: public Function {
+public:
+
+  SampledFunction(Object *funcObj, Dict *dict);
+  virtual ~SampledFunction();
+  virtual Function *copy() { return new SampledFunction(this); }
+  virtual int getType() { return 0; }
+  virtual void transform(double *in, double *out);
+  virtual GBool isOk() { return ok; }
+
+  int getSampleSize(int i) { return sampleSize[i]; }
+  double getEncodeMin(int i) { return encode[i][0]; }
+  double getEncodeMax(int i) { return encode[i][1]; }
+  double getDecodeMin(int i) { return decode[i][0]; }
+  double getDecodeMax(int i) { return decode[i][1]; }
+  double *getSamples() { return samples; }
+
+private:
+
+  SampledFunction(SampledFunction *func);
+
+  int                          // number of samples for each domain element
+    sampleSize[funcMaxInputs];
+  double                       // min and max values for domain encoder
+    encode[funcMaxInputs][2];
+  double                       // min and max values for range decoder
+    decode[funcMaxOutputs][2];
+  double                       // input multipliers
+    inputMul[funcMaxInputs];
+  int *idxOffset;
+  double *samples;             // the samples
+  int nSamples;                        // size of the samples array
+  double *sBuf;                        // buffer for the transform function
+  double cacheIn[funcMaxInputs];
+  double cacheOut[funcMaxOutputs];
+  GBool ok;
+};
+
+//------------------------------------------------------------------------
+// ExponentialFunction
+//------------------------------------------------------------------------
+
+class ExponentialFunction: public Function {
+public:
+
+  ExponentialFunction(Object *funcObj, Dict *dict);
+  virtual ~ExponentialFunction();
+  virtual Function *copy() { return new ExponentialFunction(this); }
+  virtual int getType() { return 2; }
+  virtual void transform(double *in, double *out);
+  virtual GBool isOk() { return ok; }
+
+  double *getC0() { return c0; }
+  double *getC1() { return c1; }
+  double getE() { return e; }
+
+private:
+
+  ExponentialFunction(ExponentialFunction *func);
+
+  double c0[funcMaxOutputs];
+  double c1[funcMaxOutputs];
+  double e;
+  bool isLinear;
+  GBool ok;
+};
+
+//------------------------------------------------------------------------
+// StitchingFunction
+//------------------------------------------------------------------------
+
+class StitchingFunction: public Function {
+public:
+
+  StitchingFunction(Object *funcObj, Dict *dict, std::set<int> *usedParents);
+  virtual ~StitchingFunction();
+  virtual Function *copy() { return new StitchingFunction(this); }
+  virtual int getType() { return 3; }
+  virtual void transform(double *in, double *out);
+  virtual GBool isOk() { return ok; }
+
+  int getNumFuncs() { return k; }
+  Function *getFunc(int i) { return funcs[i]; }
+  double *getBounds() { return bounds; }
+  double *getEncode() { return encode; }
+  double *getScale() { return scale; }
+
+private:
+
+  StitchingFunction(StitchingFunction *func);
+
+  int k;
+  Function **funcs;
+  double *bounds;
+  double *encode;
+  double *scale;
+  GBool ok;
+};
+
+//------------------------------------------------------------------------
+// PostScriptFunction
+//------------------------------------------------------------------------
+
+class PostScriptFunction: public Function {
+public:
+
+  PostScriptFunction(Object *funcObj, Dict *dict);
+  virtual ~PostScriptFunction();
+  virtual Function *copy() { return new PostScriptFunction(this); }
+  virtual int getType() { return 4; }
+  virtual void transform(double *in, double *out);
+  virtual GBool isOk() { return ok; }
+
+  GooString *getCodeString() { return codeString; }
+
+private:
+
+  PostScriptFunction(PostScriptFunction *func);
+  GBool parseCode(Stream *str, int *codePtr);
+  GooString *getToken(Stream *str);
+  void resizeCode(int newSize);
+  void exec(PSStack *stack, int codePtr);
+
+  GooString *codeString;
+  PSObject *code;
+  int codeSize;
+  double cacheIn[funcMaxInputs];
+  double cacheOut[funcMaxOutputs];
+  GBool ok;
+};
+
+#endif
diff --git a/poppler/Gfx.cc b/poppler/Gfx.cc
new file mode 100644 (file)
index 0000000..4e663b4
--- /dev/null
@@ -0,0 +1,5372 @@
+//========================================================================
+//
+// Gfx.cc
+//
+// Copyright 1996-2003 Glyph & Cog, LLC
+//
+//========================================================================
+
+//========================================================================
+//
+// Modified under the Poppler project - http://poppler.freedesktop.org
+//
+// All changes made under the Poppler project to this file are licensed
+// under GPL version 2 or later
+//
+// Copyright (C) 2005 Jonathan Blandford <jrb@redhat.com>
+// Copyright (C) 2005-2012 Albert Astals Cid <aacid@kde.org>
+// Copyright (C) 2006 Thorkild Stray <thorkild@ifi.uio.no>
+// Copyright (C) 2006 Kristian Høgsberg <krh@redhat.com>
+// Copyright (C) 2006-2011 Carlos Garcia Campos <carlosgc@gnome.org>
+// Copyright (C) 2006, 2007 Jeff Muizelaar <jeff@infidigm.net>
+// Copyright (C) 2007, 2008 Brad Hards <bradh@kde.org>
+// Copyright (C) 2007, 2011 Adrian Johnson <ajohnson@redneon.com>
+// Copyright (C) 2007, 2008 Iñigo Martínez <inigomartinez@gmail.com>
+// Copyright (C) 2007 Koji Otani <sho@bbr.jp>
+// Copyright (C) 2007 Krzysztof Kowalczyk <kkowalczyk@gmail.com>
+// Copyright (C) 2008 Pino Toscano <pino@kde.org>
+// Copyright (C) 2008 Michael Vrable <mvrable@cs.ucsd.edu>
+// Copyright (C) 2008 Hib Eris <hib@hiberis.nl>
+// Copyright (C) 2009 M Joonas Pihlaja <jpihlaja@cc.helsinki.fi>
+// Copyright (C) 2009-2012 Thomas Freitag <Thomas.Freitag@alfa.de>
+// Copyright (C) 2009 William Bader <williambader@hotmail.com>
+// Copyright (C) 2009, 2010 David Benjamin <davidben@mit.edu>
+// Copyright (C) 2010 Nils Höglund <nils.hoglund@gmail.com>
+// Copyright (C) 2010 Christian Feuersänger <cfeuersaenger@googlemail.com>
+// Copyright (C) 2011 Axel Strübing <axel.struebing@freenet.de>
+// Copyright (C) 2012 Even Rouault <even.rouault@mines-paris.org>
+// Copyright (C) 2012 Fabio D'Urso <fabiodurso@hotmail.it>
+//
+// To see a description of the changes please see the Changelog file that
+// came with your tarball or type make ChangeLog if you are building from git
+//
+//========================================================================
+
+#include <config.h>
+
+#ifdef USE_GCC_PRAGMAS
+#pragma implementation
+#endif
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <stddef.h>
+#include <string.h>
+#include <math.h>
+#include "goo/gmem.h"
+#include "goo/GooTimer.h"
+#include "goo/GooHash.h"
+#include "GlobalParams.h"
+#include "CharTypes.h"
+#include "Object.h"
+#include "PDFDoc.h"
+#include "Array.h"
+#include "Dict.h"
+#include "Stream.h"
+#include "Lexer.h"
+#include "Parser.h"
+#include "GfxFont.h"
+#include "GfxState.h"
+#include "OutputDev.h"
+#include "Page.h"
+#include "Annot.h"
+#include "Error.h"
+#include "Gfx.h"
+#include "ProfileData.h"
+#include "Catalog.h"
+#include "OptionalContent.h"
+
+// the MSVC math.h doesn't define this
+#ifndef M_PI
+#define M_PI 3.14159265358979323846
+#endif
+
+//------------------------------------------------------------------------
+// constants
+//------------------------------------------------------------------------
+
+// Max recursive depth for a function shading fill.
+#define functionMaxDepth 6
+
+// Max delta allowed in any color component for a function shading fill.
+#define functionColorDelta (dblToCol(1 / 256.0))
+
+// Max number of splits along the t axis for an axial shading fill.
+#define axialMaxSplits 256
+
+// Max delta allowed in any color component for an axial shading fill.
+#define axialColorDelta (dblToCol(1 / 256.0))
+
+// Max number of splits along the t axis for a radial shading fill.
+#define radialMaxSplits 256
+
+// Max delta allowed in any color component for a radial shading fill.
+#define radialColorDelta (dblToCol(1 / 256.0))
+
+// Max recursive depth for a Gouraud triangle shading fill.
+//
+// Triangles will be split at most gouraudMaxDepth times (each time into 4
+// smaller ones). That makes pow(4,gouraudMaxDepth) many triangles for
+// every triangle.
+#define gouraudMaxDepth 6
+
+// Max delta allowed in any color component for a Gouraud triangle
+// shading fill.
+#define gouraudColorDelta (dblToCol(3. / 256.0))
+
+// Gouraud triangle: if the three color parameters differ by at more than this percend of 
+// the total color parameter range, the triangle will be refined
+#define gouraudParameterizedColorDelta 5e-3
+
+// Max recursive depth for a patch mesh shading fill.
+#define patchMaxDepth 6
+
+// Max delta allowed in any color component for a patch mesh shading
+// fill.
+#define patchColorDelta (dblToCol((3. / 256.0)))
+
+//------------------------------------------------------------------------
+// Operator table
+//------------------------------------------------------------------------
+
+#ifdef _MSC_VER // this works around a bug in the VC7 compiler
+#  pragma optimize("",off)
+#endif
+
+Operator Gfx::opTab[] = {
+  {"\"",  3, {tchkNum,    tchkNum,    tchkString},
+          &Gfx::opMoveSetShowText},
+  {"'",   1, {tchkString},
+          &Gfx::opMoveShowText},
+  {"B",   0, {tchkNone},
+          &Gfx::opFillStroke},
+  {"B*",  0, {tchkNone},
+          &Gfx::opEOFillStroke},
+  {"BDC", 2, {tchkName,   tchkProps},
+          &Gfx::opBeginMarkedContent},
+  {"BI",  0, {tchkNone},
+          &Gfx::opBeginImage},
+  {"BMC", 1, {tchkName},
+          &Gfx::opBeginMarkedContent},
+  {"BT",  0, {tchkNone},
+          &Gfx::opBeginText},
+  {"BX",  0, {tchkNone},
+          &Gfx::opBeginIgnoreUndef},
+  {"CS",  1, {tchkName},
+          &Gfx::opSetStrokeColorSpace},
+  {"DP",  2, {tchkName,   tchkProps},
+          &Gfx::opMarkPoint},
+  {"Do",  1, {tchkName},
+          &Gfx::opXObject},
+  {"EI",  0, {tchkNone},
+          &Gfx::opEndImage},
+  {"EMC", 0, {tchkNone},
+          &Gfx::opEndMarkedContent},
+  {"ET",  0, {tchkNone},
+          &Gfx::opEndText},
+  {"EX",  0, {tchkNone},
+          &Gfx::opEndIgnoreUndef},
+  {"F",   0, {tchkNone},
+          &Gfx::opFill},
+  {"G",   1, {tchkNum},
+          &Gfx::opSetStrokeGray},
+  {"ID",  0, {tchkNone},
+          &Gfx::opImageData},
+  {"J",   1, {tchkInt},
+          &Gfx::opSetLineCap},
+  {"K",   4, {tchkNum,    tchkNum,    tchkNum,    tchkNum},
+          &Gfx::opSetStrokeCMYKColor},
+  {"M",   1, {tchkNum},
+          &Gfx::opSetMiterLimit},
+  {"MP",  1, {tchkName},
+          &Gfx::opMarkPoint},
+  {"Q",   0, {tchkNone},
+          &Gfx::opRestore},
+  {"RG",  3, {tchkNum,    tchkNum,    tchkNum},
+          &Gfx::opSetStrokeRGBColor},
+  {"S",   0, {tchkNone},
+          &Gfx::opStroke},
+  {"SC",  -4, {tchkNum,   tchkNum,    tchkNum,    tchkNum},
+          &Gfx::opSetStrokeColor},
+  {"SCN", -33, {tchkSCN,   tchkSCN,    tchkSCN,    tchkSCN,
+               tchkSCN,   tchkSCN,    tchkSCN,    tchkSCN,
+               tchkSCN,   tchkSCN,    tchkSCN,    tchkSCN,
+               tchkSCN,   tchkSCN,    tchkSCN,    tchkSCN,
+               tchkSCN,   tchkSCN,    tchkSCN,    tchkSCN,
+               tchkSCN,   tchkSCN,    tchkSCN,    tchkSCN,
+               tchkSCN,   tchkSCN,    tchkSCN,    tchkSCN,
+               tchkSCN,   tchkSCN,    tchkSCN,    tchkSCN,
+               tchkSCN},
+          &Gfx::opSetStrokeColorN},
+  {"T*",  0, {tchkNone},
+          &Gfx::opTextNextLine},
+  {"TD",  2, {tchkNum,    tchkNum},
+          &Gfx::opTextMoveSet},
+  {"TJ",  1, {tchkArray},
+          &Gfx::opShowSpaceText},
+  {"TL",  1, {tchkNum},
+          &Gfx::opSetTextLeading},
+  {"Tc",  1, {tchkNum},
+          &Gfx::opSetCharSpacing},
+  {"Td",  2, {tchkNum,    tchkNum},
+          &Gfx::opTextMove},
+  {"Tf",  2, {tchkName,   tchkNum},
+          &Gfx::opSetFont},
+  {"Tj",  1, {tchkString},
+          &Gfx::opShowText},
+  {"Tm",  6, {tchkNum,    tchkNum,    tchkNum,    tchkNum,
+             tchkNum,    tchkNum},
+          &Gfx::opSetTextMatrix},
+  {"Tr",  1, {tchkInt},
+          &Gfx::opSetTextRender},
+  {"Ts",  1, {tchkNum},
+          &Gfx::opSetTextRise},
+  {"Tw",  1, {tchkNum},
+          &Gfx::opSetWordSpacing},
+  {"Tz",  1, {tchkNum},
+          &Gfx::opSetHorizScaling},
+  {"W",   0, {tchkNone},
+          &Gfx::opClip},
+  {"W*",  0, {tchkNone},
+          &Gfx::opEOClip},
+  {"b",   0, {tchkNone},
+          &Gfx::opCloseFillStroke},
+  {"b*",  0, {tchkNone},
+          &Gfx::opCloseEOFillStroke},
+  {"c",   6, {tchkNum,    tchkNum,    tchkNum,    tchkNum,
+             tchkNum,    tchkNum},
+          &Gfx::opCurveTo},
+  {"cm",  6, {tchkNum,    tchkNum,    tchkNum,    tchkNum,
+             tchkNum,    tchkNum},
+          &Gfx::opConcat},
+  {"cs",  1, {tchkName},
+          &Gfx::opSetFillColorSpace},
+  {"d",   2, {tchkArray,  tchkNum},
+          &Gfx::opSetDash},
+  {"d0",  2, {tchkNum,    tchkNum},
+          &Gfx::opSetCharWidth},
+  {"d1",  6, {tchkNum,    tchkNum,    tchkNum,    tchkNum,
+             tchkNum,    tchkNum},
+          &Gfx::opSetCacheDevice},
+  {"f",   0, {tchkNone},
+          &Gfx::opFill},
+  {"f*",  0, {tchkNone},
+          &Gfx::opEOFill},
+  {"g",   1, {tchkNum},
+          &Gfx::opSetFillGray},
+  {"gs",  1, {tchkName},
+          &Gfx::opSetExtGState},
+  {"h",   0, {tchkNone},
+          &Gfx::opClosePath},
+  {"i",   1, {tchkNum},
+          &Gfx::opSetFlat},
+  {"j",   1, {tchkInt},
+          &Gfx::opSetLineJoin},
+  {"k",   4, {tchkNum,    tchkNum,    tchkNum,    tchkNum},
+          &Gfx::opSetFillCMYKColor},
+  {"l",   2, {tchkNum,    tchkNum},
+          &Gfx::opLineTo},
+  {"m",   2, {tchkNum,    tchkNum},
+          &Gfx::opMoveTo},
+  {"n",   0, {tchkNone},
+          &Gfx::opEndPath},
+  {"q",   0, {tchkNone},
+          &Gfx::opSave},
+  {"re",  4, {tchkNum,    tchkNum,    tchkNum,    tchkNum},
+          &Gfx::opRectangle},
+  {"rg",  3, {tchkNum,    tchkNum,    tchkNum},
+          &Gfx::opSetFillRGBColor},
+  {"ri",  1, {tchkName},
+          &Gfx::opSetRenderingIntent},
+  {"s",   0, {tchkNone},
+          &Gfx::opCloseStroke},
+  {"sc",  -4, {tchkNum,   tchkNum,    tchkNum,    tchkNum},
+          &Gfx::opSetFillColor},
+  {"scn", -33, {tchkSCN,   tchkSCN,    tchkSCN,    tchkSCN,
+               tchkSCN,   tchkSCN,    tchkSCN,    tchkSCN,
+               tchkSCN,   tchkSCN,    tchkSCN,    tchkSCN,
+               tchkSCN,   tchkSCN,    tchkSCN,    tchkSCN,
+               tchkSCN,   tchkSCN,    tchkSCN,    tchkSCN,
+               tchkSCN,   tchkSCN,    tchkSCN,    tchkSCN,
+               tchkSCN,   tchkSCN,    tchkSCN,    tchkSCN,
+               tchkSCN,   tchkSCN,    tchkSCN,    tchkSCN,
+               tchkSCN},
+          &Gfx::opSetFillColorN},
+  {"sh",  1, {tchkName},
+          &Gfx::opShFill},
+  {"v",   4, {tchkNum,    tchkNum,    tchkNum,    tchkNum},
+          &Gfx::opCurveTo1},
+  {"w",   1, {tchkNum},
+          &Gfx::opSetLineWidth},
+  {"y",   4, {tchkNum,    tchkNum,    tchkNum,    tchkNum},
+          &Gfx::opCurveTo2},
+};
+
+#ifdef _MSC_VER // this works around a bug in the VC7 compiler
+#  pragma optimize("",on)
+#endif
+
+#define numOps (sizeof(opTab) / sizeof(Operator))
+
+static inline GBool isSameGfxColor(const GfxColor &colorA, const GfxColor &colorB, Guint nComps, double delta) {
+  for (Guint k = 0; k < nComps; ++k) {
+    if (abs(colorA.c[k] - colorB.c[k]) > delta) {
+      return false;
+    }
+  }
+  return true;
+}
+
+//------------------------------------------------------------------------
+// GfxResources
+//------------------------------------------------------------------------
+
+GfxResources::GfxResources(XRef *xref, Dict *resDict, GfxResources *nextA) :
+    gStateCache(2, xref) {
+  Object obj1, obj2;
+  Ref r;
+
+  if (resDict) {
+
+    // build font dictionary
+    fonts = NULL;
+    resDict->lookupNF("Font", &obj1);
+    if (obj1.isRef()) {
+      obj1.fetch(xref, &obj2);
+      if (obj2.isDict()) {
+       r = obj1.getRef();
+       fonts = new GfxFontDict(xref, &r, obj2.getDict());
+      }
+      obj2.free();
+    } else if (obj1.isDict()) {
+      fonts = new GfxFontDict(xref, NULL, obj1.getDict());
+    }
+    obj1.free();
+
+    // get XObject dictionary
+    resDict->lookup("XObject", &xObjDict);
+
+    // get color space dictionary
+    resDict->lookup("ColorSpace", &colorSpaceDict);
+
+    // get pattern dictionary
+    resDict->lookup("Pattern", &patternDict);
+
+    // get shading dictionary
+    resDict->lookup("Shading", &shadingDict);
+
+    // get graphics state parameter dictionary
+    resDict->lookup("ExtGState", &gStateDict);
+
+    // get properties dictionary
+    resDict->lookup("Properties", &propertiesDict);
+
+  } else {
+    fonts = NULL;
+    xObjDict.initNull();
+    colorSpaceDict.initNull();
+    patternDict.initNull();
+    shadingDict.initNull();
+    gStateDict.initNull();
+    propertiesDict.initNull();
+  }
+
+  next = nextA;
+}
+
+GfxResources::~GfxResources() {
+  if (fonts) {
+    delete fonts;
+  }
+  xObjDict.free();
+  colorSpaceDict.free();
+  patternDict.free();
+  shadingDict.free();
+  gStateDict.free();
+  propertiesDict.free();
+}
+
+GfxFont *GfxResources::lookupFont(char *name) {
+  GfxFont *font;
+  GfxResources *resPtr;
+
+  for (resPtr = this; resPtr; resPtr = resPtr->next) {
+    if (resPtr->fonts) {
+      if ((font = resPtr->fonts->lookup(name)))
+       return font;
+    }
+  }
+  error(errSyntaxError, -1, "Unknown font tag '{0:s}'", name);
+  return NULL;
+}
+
+GBool GfxResources::lookupXObject(char *name, Object *obj) {
+  GfxResources *resPtr;
+
+  for (resPtr = this; resPtr; resPtr = resPtr->next) {
+    if (resPtr->xObjDict.isDict()) {
+      if (!resPtr->xObjDict.dictLookup(name, obj)->isNull())
+       return gTrue;
+      obj->free();
+    }
+  }
+  error(errSyntaxError, -1, "XObject '{0:s}' is unknown", name);
+  return gFalse;
+}
+
+GBool GfxResources::lookupXObjectNF(char *name, Object *obj) {
+  GfxResources *resPtr;
+
+  for (resPtr = this; resPtr; resPtr = resPtr->next) {
+    if (resPtr->xObjDict.isDict()) {
+      if (!resPtr->xObjDict.dictLookupNF(name, obj)->isNull())
+       return gTrue;
+      obj->free();
+    }
+  }
+  error(errSyntaxError, -1, "XObject '{0:s}' is unknown", name);
+  return gFalse;
+}
+
+GBool GfxResources::lookupMarkedContentNF(char *name, Object *obj) {
+  GfxResources *resPtr;
+
+  for (resPtr = this; resPtr; resPtr = resPtr->next) {
+    if (resPtr->propertiesDict.isDict()) {
+      if (!resPtr->propertiesDict.dictLookupNF(name, obj)->isNull())
+       return gTrue;
+      obj->free();
+    }
+  }
+  error(errSyntaxError, -1, "Marked Content '{0:s}' is unknown", name);
+  return gFalse;
+}
+
+void GfxResources::lookupColorSpace(const char *name, Object *obj) {
+  GfxResources *resPtr;
+
+  for (resPtr = this; resPtr; resPtr = resPtr->next) {
+    if (resPtr->colorSpaceDict.isDict()) {
+      if (!resPtr->colorSpaceDict.dictLookup(name, obj)->isNull()) {
+       return;
+      }
+      obj->free();
+    }
+  }
+  obj->initNull();
+}
+
+GfxPattern *GfxResources::lookupPattern(char *name, Gfx *gfx) {
+  GfxResources *resPtr;
+  GfxPattern *pattern;
+  Object obj;
+
+  for (resPtr = this; resPtr; resPtr = resPtr->next) {
+    if (resPtr->patternDict.isDict()) {
+      if (!resPtr->patternDict.dictLookup(name, &obj)->isNull()) {
+       pattern = GfxPattern::parse(&obj, gfx);
+       obj.free();
+       return pattern;
+      }
+      obj.free();
+    }
+  }
+  error(errSyntaxError, -1, "Unknown pattern '{0:s}'", name);
+  return NULL;
+}
+
+GfxShading *GfxResources::lookupShading(char *name, Gfx *gfx) {
+  GfxResources *resPtr;
+  GfxShading *shading;
+  Object obj;
+
+  for (resPtr = this; resPtr; resPtr = resPtr->next) {
+    if (resPtr->shadingDict.isDict()) {
+      if (!resPtr->shadingDict.dictLookup(name, &obj)->isNull()) {
+       shading = GfxShading::parse(&obj, gfx);
+       obj.free();
+       return shading;
+      }
+      obj.free();
+    }
+  }
+  error(errSyntaxError, -1, "ExtGState '{0:s}' is unknown", name);
+  return NULL;
+}
+
+GBool GfxResources::lookupGState(char *name, Object *obj) {
+  if (!lookupGStateNF(name, obj))
+    return gFalse;
+
+  if (!obj->isRef())
+    return gTrue;
+  
+  const Ref ref = obj->getRef();
+  if (!gStateCache.lookup(ref, obj)->isNull())
+    return gTrue;
+  obj->free();
+
+  gStateCache.put(ref)->copy(obj);
+  return gTrue;
+}
+
+GBool GfxResources::lookupGStateNF(char *name, Object *obj) {
+  GfxResources *resPtr;
+
+  for (resPtr = this; resPtr; resPtr = resPtr->next) {
+    if (resPtr->gStateDict.isDict()) {
+      if (!resPtr->gStateDict.dictLookupNF(name, obj)->isNull()) {
+       return gTrue;
+      }
+      obj->free();
+    }
+  }
+  error(errSyntaxError, -1, "ExtGState '{0:s}' is unknown", name);
+  return gFalse;
+}
+
+//------------------------------------------------------------------------
+// Gfx
+//------------------------------------------------------------------------
+
+Gfx::Gfx(PDFDoc *docA, OutputDev *outA, int pageNum, Dict *resDict,
+        double hDPI, double vDPI, PDFRectangle *box,
+        PDFRectangle *cropBox, int rotate,
+        GBool (*abortCheckCbkA)(void *data),
+        void *abortCheckCbkDataA)
+#ifdef USE_CMS
+ : iccColorSpaceCache(5)
+#endif
+{
+  int i;
+
+  doc = docA;
+  xref = doc->getXRef();
+  catalog = doc->getCatalog();
+  subPage = gFalse;
+  printCommands = globalParams->getPrintCommands();
+  profileCommands = globalParams->getProfileCommands();
+  mcStack = NULL;
+  parser = NULL;
+
+  // start the resource stack
+  res = new GfxResources(xref, resDict, NULL);
+
+  // initialize
+  out = outA;
+  state = new GfxState(hDPI, vDPI, box, rotate, out->upsideDown());
+  stackHeight = 1;
+  pushStateGuard();
+  fontChanged = gFalse;
+  clip = clipNone;
+  ignoreUndef = 0;
+  out->startPage(pageNum, state);
+  out->setDefaultCTM(state->getCTM());
+  out->updateAll(state);
+  for (i = 0; i < 6; ++i) {
+    baseMatrix[i] = state->getCTM()[i];
+  }
+  formDepth = 0;
+  textClipBBoxEmpty = gTrue;
+  ocState = gTrue;
+  parser = NULL;
+  abortCheckCbk = abortCheckCbkA;
+  abortCheckCbkData = abortCheckCbkDataA;
+
+  // set crop box
+  if (cropBox) {
+    state->moveTo(cropBox->x1, cropBox->y1);
+    state->lineTo(cropBox->x2, cropBox->y1);
+    state->lineTo(cropBox->x2, cropBox->y2);
+    state->lineTo(cropBox->x1, cropBox->y2);
+    state->closePath();
+    state->clip();
+    out->clip(state);
+    state->clearPath();
+  }
+}
+
+Gfx::Gfx(PDFDoc *docA, OutputDev *outA, Dict *resDict,
+        PDFRectangle *box, PDFRectangle *cropBox,
+        GBool (*abortCheckCbkA)(void *data),
+        void *abortCheckCbkDataA)
+ #ifdef USE_CMS
+ : iccColorSpaceCache(5)
+#endif
+{
+  int i;
+
+  doc = docA;
+  xref = doc->getXRef();
+  catalog = doc->getCatalog();
+  subPage = gTrue;
+  printCommands = globalParams->getPrintCommands();
+  profileCommands = globalParams->getProfileCommands();
+  mcStack = NULL;
+  parser = NULL;
+
+  // start the resource stack
+  res = new GfxResources(xref, resDict, NULL);
+
+  // initialize
+  out = outA;
+  state = new GfxState(72, 72, box, 0, gFalse);
+  stackHeight = 1;
+  pushStateGuard();
+  fontChanged = gFalse;
+  clip = clipNone;
+  ignoreUndef = 0;
+  for (i = 0; i < 6; ++i) {
+    baseMatrix[i] = state->getCTM()[i];
+  }
+  formDepth = 0;
+  textClipBBoxEmpty = gTrue;
+  ocState = gTrue;
+  parser = NULL;
+  abortCheckCbk = abortCheckCbkA;
+  abortCheckCbkData = abortCheckCbkDataA;
+
+  // set crop box
+  if (cropBox) {
+    state->moveTo(cropBox->x1, cropBox->y1);
+    state->lineTo(cropBox->x2, cropBox->y1);
+    state->lineTo(cropBox->x2, cropBox->y2);
+    state->lineTo(cropBox->x1, cropBox->y2);
+    state->closePath();
+    state->clip();
+    out->clip(state);
+    state->clearPath();
+  }
+}
+
+Gfx::~Gfx() {
+  while (stateGuards.size()) {
+    popStateGuard();
+  }
+  if (!subPage) {
+    out->endPage();
+  }
+  // There shouldn't be more saves, but pop them if there were any
+  while (state->hasSaves()) {
+    error(errSyntaxError, -1, "Found state under last state guard. Popping.");
+    restoreState();
+  }
+  delete state;
+  while (res) {
+    popResources();
+  }
+  while (mcStack) {
+    popMarkedContent();
+  }
+}
+
+void Gfx::display(Object *obj, GBool topLevel) {
+  Object obj2;
+  int i;
+
+  if (obj->isArray()) {
+    for (i = 0; i < obj->arrayGetLength(); ++i) {
+      obj->arrayGet(i, &obj2);
+      if (!obj2.isStream()) {
+       error(errSyntaxError, -1, "Weird page contents");
+       obj2.free();
+       return;
+      }
+      obj2.free();
+    }
+  } else if (!obj->isStream()) {
+    error(errSyntaxError, -1, "Weird page contents");
+    return;
+  }
+  parser = new Parser(xref, new Lexer(xref, obj), gFalse);
+  go(topLevel);
+  delete parser;
+  parser = NULL;
+}
+
+void Gfx::go(GBool topLevel) {
+  Object obj;
+  Object args[maxArgs];
+  int numArgs, i;
+  int lastAbortCheck;
+
+  // scan a sequence of objects
+  pushStateGuard();
+  updateLevel = 1; // make sure even empty pages trigger a call to dump()
+  lastAbortCheck = 0;
+  numArgs = 0;
+  parser->getObj(&obj);
+  while (!obj.isEOF()) {
+    commandAborted = gFalse;
+
+    // got a command - execute it
+    if (obj.isCmd()) {
+      if (printCommands) {
+       obj.print(stdout);
+       for (i = 0; i < numArgs; ++i) {
+         printf(" ");
+         args[i].print(stdout);
+       }
+       printf("\n");
+       fflush(stdout);
+      }
+      GooTimer timer;
+
+      // Run the operation
+      execOp(&obj, args, numArgs);
+
+      // Update the profile information
+      if (profileCommands) {
+       GooHash *hash;
+
+       hash = out->getProfileHash ();
+       if (hash) {
+         GooString *cmd_g;
+         ProfileData *data_p;
+
+         cmd_g = new GooString (obj.getCmd());
+         data_p = (ProfileData *)hash->lookup (cmd_g);
+         if (data_p == NULL) {
+           data_p = new ProfileData();
+           hash->add (cmd_g, data_p);
+         }
+         
+         data_p->addElement(timer.getElapsed ());
+       }
+      }
+      obj.free();
+      for (i = 0; i < numArgs; ++i)
+       args[i].free();
+      numArgs = 0;
+
+      // periodically update display
+      if (++updateLevel >= 20000) {
+       out->dump();
+       updateLevel = 0;
+      }
+
+      // did the command throw an exception
+      if (commandAborted) {
+       // don't propogate; recursive drawing comes from Form XObjects which
+       // should probably be drawn in a separate context anyway for caching
+       commandAborted = gFalse;
+       break;
+      }
+
+      // check for an abort
+      if (abortCheckCbk) {
+       if (updateLevel - lastAbortCheck > 10) {
+         if ((*abortCheckCbk)(abortCheckCbkData)) {
+           break;
+         }
+         lastAbortCheck = updateLevel;
+       }
+      }
+
+    // got an argument - save it
+    } else if (numArgs < maxArgs) {
+      args[numArgs++] = obj;
+
+    // too many arguments - something is wrong
+    } else {
+      error(errSyntaxError, getPos(), "Too many args in content stream");
+      if (printCommands) {
+       printf("throwing away arg: ");
+       obj.print(stdout);
+       printf("\n");
+       fflush(stdout);
+      }
+      obj.free();
+    }
+
+    // grab the next object
+    parser->getObj(&obj);
+  }
+  obj.free();
+
+  // args at end with no command
+  if (numArgs > 0) {
+    error(errSyntaxError, getPos(), "Leftover args in content stream");
+    if (printCommands) {
+      printf("%d leftovers:", numArgs);
+      for (i = 0; i < numArgs; ++i) {
+       printf(" ");
+       args[i].print(stdout);
+      }
+      printf("\n");
+      fflush(stdout);
+    }
+    for (i = 0; i < numArgs; ++i)
+      args[i].free();
+  }
+
+  popStateGuard();
+
+  // update display
+  if (topLevel && updateLevel > 0) {
+    out->dump();
+  }
+}
+
+void Gfx::execOp(Object *cmd, Object args[], int numArgs) {
+  Operator *op;
+  char *name;
+  Object *argPtr;
+  int i;
+
+  // find operator
+  name = cmd->getCmd();
+  if (!(op = findOp(name))) {
+    if (ignoreUndef == 0)
+      error(errSyntaxError, getPos(), "Unknown operator '{0:s}'", name);
+    return;
+  }
+
+  // type check args
+  argPtr = args;
+  if (op->numArgs >= 0) {
+    if (numArgs < op->numArgs) {
+      error(errSyntaxError, getPos(), "Too few ({0:d}) args to '{1:s}' operator", numArgs, name);
+      commandAborted = gTrue;
+      return;
+    }
+    if (numArgs > op->numArgs) {
+#if 0
+      error(errSyntaxWarning, getPos(),
+           "Too many ({0:d}) args to '{1:s}' operator", numArgs, name);
+#endif
+      argPtr += numArgs - op->numArgs;
+      numArgs = op->numArgs;
+    }
+  } else {
+    if (numArgs > -op->numArgs) {
+      error(errSyntaxError, getPos(), "Too many ({0:d}) args to '{1:s}' operator",
+           numArgs, name);
+      return;
+    }
+  }
+  for (i = 0; i < numArgs; ++i) {
+    if (!checkArg(&argPtr[i], op->tchk[i])) {
+      error(errSyntaxError, getPos(), "Arg #{0:d} to '{1:s}' operator is wrong type ({2:s})",
+           i, name, argPtr[i].getTypeName());
+      return;
+    }
+  }
+
+  // do it
+  (this->*op->func)(argPtr, numArgs);
+}
+
+Operator *Gfx::findOp(char *name) {
+  int a, b, m, cmp;
+
+  a = -1;
+  b = numOps;
+  cmp = 0; // make gcc happy
+  // invariant: opTab[a] < name < opTab[b]
+  while (b - a > 1) {
+    m = (a + b) / 2;
+    cmp = strcmp(opTab[m].name, name);
+    if (cmp < 0)
+      a = m;
+    else if (cmp > 0)
+      b = m;
+    else
+      a = b = m;
+  }
+  if (cmp != 0)
+    return NULL;
+  return &opTab[a];
+}
+
+GBool Gfx::checkArg(Object *arg, TchkType type) {
+  switch (type) {
+  case tchkBool:   return arg->isBool();
+  case tchkInt:    return arg->isInt();
+  case tchkNum:    return arg->isNum();
+  case tchkString: return arg->isString();
+  case tchkName:   return arg->isName();
+  case tchkArray:  return arg->isArray();
+  case tchkProps:  return arg->isDict() || arg->isName();
+  case tchkSCN:    return arg->isNum() || arg->isName();
+  case tchkNone:   return gFalse;
+  }
+  return gFalse;
+}
+
+int Gfx::getPos() {
+  return parser ? parser->getPos() : -1;
+}
+
+//------------------------------------------------------------------------
+// graphics state operators
+//------------------------------------------------------------------------
+
+void Gfx::opSave(Object args[], int numArgs) {
+  saveState();
+}
+
+void Gfx::opRestore(Object args[], int numArgs) {
+  restoreState();
+}
+
+void Gfx::opConcat(Object args[], int numArgs) {
+  state->concatCTM(args[0].getNum(), args[1].getNum(),
+                  args[2].getNum(), args[3].getNum(),
+                  args[4].getNum(), args[5].getNum());
+  out->updateCTM(state, args[0].getNum(), args[1].getNum(),
+                args[2].getNum(), args[3].getNum(),
+                args[4].getNum(), args[5].getNum());
+  fontChanged = gTrue;
+}
+
+void Gfx::opSetDash(Object args[], int numArgs) {
+  Array *a;
+  int length;
+  Object obj;
+  double *dash;
+  int i;
+
+  a = args[0].getArray();
+  length = a->getLength();
+  if (length == 0) {
+    dash = NULL;
+  } else {
+    dash = (double *)gmallocn(length, sizeof(double));
+    for (i = 0; i < length; ++i) {
+      dash[i] = a->get(i, &obj)->getNum();
+      obj.free();
+    }
+  }
+  state->setLineDash(dash, length, args[1].getNum());
+  out->updateLineDash(state);
+}
+
+void Gfx::opSetFlat(Object args[], int numArgs) {
+  state->setFlatness((int)args[0].getNum());
+  out->updateFlatness(state);
+}
+
+void Gfx::opSetLineJoin(Object args[], int numArgs) {
+  state->setLineJoin(args[0].getInt());
+  out->updateLineJoin(state);
+}
+
+void Gfx::opSetLineCap(Object args[], int numArgs) {
+  state->setLineCap(args[0].getInt());
+  out->updateLineCap(state);
+}
+
+void Gfx::opSetMiterLimit(Object args[], int numArgs) {
+  state->setMiterLimit(args[0].getNum());
+  out->updateMiterLimit(state);
+}
+
+void Gfx::opSetLineWidth(Object args[], int numArgs) {
+  state->setLineWidth(args[0].getNum());
+  out->updateLineWidth(state);
+}
+
+void Gfx::opSetExtGState(Object args[], int numArgs) {
+  Object obj1, obj2, obj3, obj4, obj5;
+  Object args2[2];
+  GfxBlendMode mode;
+  GBool haveFillOP;
+  Function *funcs[4];
+  GfxColor backdropColor;
+  GBool haveBackdropColor;
+  GfxColorSpace *blendingColorSpace;
+  GBool alpha, isolated, knockout;
+  double opac;
+  int i;
+
+  if (!res->lookupGState(args[0].getName(), &obj1)) {
+    return;
+  }
+  if (!obj1.isDict()) {
+    error(errSyntaxError, getPos(), "ExtGState '{0:s}' is wrong type", args[0].getName());
+    obj1.free();
+    return;
+  }
+  if (printCommands) {
+    printf("  gfx state dict: ");
+    obj1.print();
+    printf("\n");
+  }
+
+  // parameters that are also set by individual PDF operators
+  if (obj1.dictLookup("LW", &obj2)->isNum()) {
+    opSetLineWidth(&obj2, 1);
+  }
+  obj2.free();
+  if (obj1.dictLookup("LC", &obj2)->isInt()) {
+    opSetLineCap(&obj2, 1);
+  }
+  obj2.free();
+  if (obj1.dictLookup("LJ", &obj2)->isInt()) {
+    opSetLineJoin(&obj2, 1);
+  }
+  obj2.free();
+  if (obj1.dictLookup("ML", &obj2)->isNum()) {
+    opSetMiterLimit(&obj2, 1);
+  }
+  obj2.free();
+  if (obj1.dictLookup("D", &obj2)->isArray() &&
+      obj2.arrayGetLength() == 2) {
+    obj2.arrayGet(0, &args2[0]);
+    obj2.arrayGet(1, &args2[1]);
+    if (args2[0].isArray() && args2[1].isNum()) {
+      opSetDash(args2, 2);
+    }
+    args2[0].free();
+    args2[1].free();
+  }
+  obj2.free();
+#if 0 //~ need to add a new version of GfxResources::lookupFont() that
+      //~ takes an indirect ref instead of a name
+  if (obj1.dictLookup("Font", &obj2)->isArray() &&
+      obj2.arrayGetLength() == 2) {
+    obj2.arrayGet(0, &args2[0]);
+    obj2.arrayGet(1, &args2[1]);
+    if (args2[0].isDict() && args2[1].isNum()) {
+      opSetFont(args2, 2);
+    }
+    args2[0].free();
+    args2[1].free();
+  }
+  obj2.free();
+#endif
+  if (obj1.dictLookup("FL", &obj2)->isNum()) {
+    opSetFlat(&obj2, 1);
+  }
+  obj2.free();
+
+  // transparency support: blend mode, fill/stroke opacity
+  if (!obj1.dictLookup("BM", &obj2)->isNull()) {
+    if (state->parseBlendMode(&obj2, &mode)) {
+      state->setBlendMode(mode);
+      out->updateBlendMode(state);
+    } else {
+      error(errSyntaxError, getPos(), "Invalid blend mode in ExtGState");
+    }
+  }
+  obj2.free();
+  if (obj1.dictLookup("ca", &obj2)->isNum()) {
+    opac = obj2.getNum();
+    state->setFillOpacity(opac < 0 ? 0 : opac > 1 ? 1 : opac);
+    out->updateFillOpacity(state);
+  }
+  obj2.free();
+  if (obj1.dictLookup("CA", &obj2)->isNum()) {
+    opac = obj2.getNum();
+    state->setStrokeOpacity(opac < 0 ? 0 : opac > 1 ? 1 : opac);
+    out->updateStrokeOpacity(state);
+  }
+  obj2.free();
+
+  // fill/stroke overprint, overprint mode
+  if ((haveFillOP = (obj1.dictLookup("op", &obj2)->isBool()))) {
+    state->setFillOverprint(obj2.getBool());
+    out->updateFillOverprint(state);
+  }
+  obj2.free();
+  if (obj1.dictLookup("OP", &obj2)->isBool()) {
+    state->setStrokeOverprint(obj2.getBool());
+    out->updateStrokeOverprint(state);
+    if (!haveFillOP) {
+      state->setFillOverprint(obj2.getBool());
+      out->updateFillOverprint(state);
+    }
+  }
+  obj2.free();
+  if (obj1.dictLookup("OPM", &obj2)->isInt()) {
+    state->setOverprintMode(obj2.getInt());
+    out->updateOverprintMode(state);
+  }
+  obj2.free();
+
+  // stroke adjust
+  if (obj1.dictLookup("SA", &obj2)->isBool()) {
+    state->setStrokeAdjust(obj2.getBool());
+    out->updateStrokeAdjust(state);
+  }
+  obj2.free();
+
+  // transfer function
+  if (obj1.dictLookup("TR2", &obj2)->isNull()) {
+    obj2.free();
+    obj1.dictLookup("TR", &obj2);
+  }
+  if (obj2.isName("Default") ||
+      obj2.isName("Identity")) {
+    funcs[0] = funcs[1] = funcs[2] = funcs[3] = NULL;
+    state->setTransfer(funcs);
+    out->updateTransfer(state);
+  } else if (obj2.isArray() && obj2.arrayGetLength() == 4) {
+    for (i = 0; i < 4; ++i) {
+      obj2.arrayGet(i, &obj3);
+      funcs[i] = Function::parse(&obj3);
+      obj3.free();
+      if (!funcs[i]) {
+       break;
+      }
+    }
+    if (i == 4) {
+      state->setTransfer(funcs);
+      out->updateTransfer(state);
+    }
+  } else if (obj2.isName() || obj2.isDict() || obj2.isStream()) {
+    if ((funcs[0] = Function::parse(&obj2))) {
+      funcs[1] = funcs[2] = funcs[3] = NULL;
+      state->setTransfer(funcs);
+      out->updateTransfer(state);
+    }
+  } else if (!obj2.isNull()) {
+    error(errSyntaxError, getPos(), "Invalid transfer function in ExtGState");
+  }
+  obj2.free();
+
+  // alpha is shape
+  if (obj1.dictLookup("AIS", &obj2)->isBool()) {
+    state->setAlphaIsShape(obj2.getBool());
+    out->updateAlphaIsShape(state);
+  }
+  obj2.free();
+
+  // text knockout
+  if (obj1.dictLookup("TK", &obj2)->isBool()) {
+    state->setTextKnockout(obj2.getBool());
+    out->updateTextKnockout(state);
+  }
+  obj2.free();
+
+  // soft mask
+  if (!obj1.dictLookup("SMask", &obj2)->isNull()) {
+    if (obj2.isName("None")) {
+      out->clearSoftMask(state);
+    } else if (obj2.isDict()) {
+      if (obj2.dictLookup("S", &obj3)->isName("Alpha")) {
+       alpha = gTrue;
+      } else { // "Luminosity"
+       alpha = gFalse;
+      }
+      obj3.free();
+      funcs[0] = NULL;
+      if (!obj2.dictLookup("TR", &obj3)->isNull()) {
+       if (obj3.isName("Default") ||
+           obj3.isName("Identity")) {
+         funcs[0] = NULL;
+       } else {
+         funcs[0] = Function::parse(&obj3);
+      if (funcs[0] == NULL ||
+          funcs[0]->getInputSize() != 1 ||
+          funcs[0]->getOutputSize() != 1) {
+           error(errSyntaxError, getPos(),
+                 "Invalid transfer function in soft mask in ExtGState");
+           delete funcs[0];
+           funcs[0] = NULL;
+         }
+       }
+      }
+      obj3.free();
+      if ((haveBackdropColor = obj2.dictLookup("BC", &obj3)->isArray())) {
+       for (i = 0; i < gfxColorMaxComps; ++i) {
+         backdropColor.c[i] = 0;
+       }
+       for (i = 0; i < obj3.arrayGetLength() && i < gfxColorMaxComps; ++i) {
+         obj3.arrayGet(i, &obj4);
+         if (obj4.isNum()) {
+           backdropColor.c[i] = dblToCol(obj4.getNum());
+         }
+         obj4.free();
+       }
+      }
+      obj3.free();
+      if (obj2.dictLookup("G", &obj3)->isStream()) {
+       if (obj3.streamGetDict()->lookup("Group", &obj4)->isDict()) {
+         blendingColorSpace = NULL;
+         isolated = knockout = gFalse;
+         if (!obj4.dictLookup("CS", &obj5)->isNull()) {
+           blendingColorSpace = GfxColorSpace::parse(&obj5, this);
+         }
+         obj5.free();
+         if (obj4.dictLookup("I", &obj5)->isBool()) {
+           isolated = obj5.getBool();
+         }
+         obj5.free();
+         if (obj4.dictLookup("K", &obj5)->isBool()) {
+           knockout = obj5.getBool();
+         }
+         obj5.free();
+         if (!haveBackdropColor) {
+           if (blendingColorSpace) {
+             blendingColorSpace->getDefaultColor(&backdropColor);
+           } else {
+             //~ need to get the parent or default color space (?)
+             for (i = 0; i < gfxColorMaxComps; ++i) {
+               backdropColor.c[i] = 0;
+             }
+           }
+         }
+         doSoftMask(&obj3, alpha, blendingColorSpace,
+                    isolated, knockout, funcs[0], &backdropColor);
+         if (funcs[0]) {
+           delete funcs[0];
+         }
+       } else {
+         error(errSyntaxError, getPos(), "Invalid soft mask in ExtGState - missing group");
+       }
+       obj4.free();
+      } else {
+       error(errSyntaxError, getPos(), "Invalid soft mask in ExtGState - missing group");
+      }
+      obj3.free();
+    } else if (!obj2.isNull()) {
+      error(errSyntaxError, getPos(), "Invalid soft mask in ExtGState");
+    }
+  }
+  obj2.free();
+  if (obj1.dictLookup("Font", &obj2)->isArray()) {
+    GfxFont *font;
+    if (obj2.arrayGetLength() == 2) {
+      Object fargs0, fargs1;
+
+      obj2.arrayGetNF(0,&fargs0);
+      obj2.arrayGet(1,&fargs1);
+      if (fargs0.isRef() && fargs1.isNum()) {
+       Object fobj;
+       Ref r;
+
+       fargs0.fetch(xref, &fobj);
+       if (fobj.isDict()) {
+         r = fargs0.getRef();
+         font = GfxFont::makeFont(xref,args[0].getName(),r,fobj.getDict());
+         state->setFont(font,fargs1.getNum());
+         fontChanged = gTrue;
+       }
+       fobj.free();
+      }
+      fargs0.free();
+      fargs1.free();
+    } else {
+      error(errSyntaxError, getPos(), "Number of args mismatch for /Font in ExtGState");
+    }
+  }
+  obj2.free();
+  if (obj1.dictLookup("LW", &obj2)->isNum()) {
+    opSetLineWidth(&obj2,1);
+  }
+  obj2.free();
+  if (obj1.dictLookup("LC", &obj2)->isInt()) {
+    opSetLineCap(&obj2,1);
+  }
+  obj2.free();
+  if (obj1.dictLookup("LJ", &obj2)->isInt()) {
+    opSetLineJoin(&obj2,1);
+  }
+  obj2.free();
+  if (obj1.dictLookup("ML", &obj2)->isNum()) {
+    opSetMiterLimit(&obj2,1);
+  }
+  obj2.free();
+  if (obj1.dictLookup("D", &obj2)->isArray()) {
+    if (obj2.arrayGetLength() == 2) {
+      Object dargs[2];
+
+      obj2.arrayGetNF(0,&dargs[0]);
+      obj2.arrayGet(1,&dargs[1]);
+      if (dargs[0].isArray() && dargs[1].isInt()) {
+       opSetDash(dargs,2);
+      }
+      dargs[0].free();
+      dargs[1].free();
+    } else {
+      error(errSyntaxError, getPos(), "Number of args mismatch for /D in ExtGState");
+    }
+  }
+  obj2.free();
+  if (obj1.dictLookup("RI", &obj2)->isName()) {
+    opSetRenderingIntent(&obj2,1);
+  }
+  obj2.free();
+  if (obj1.dictLookup("FL", &obj2)->isNum()) {
+    opSetFlat(&obj2,1);
+  }
+  obj2.free();
+
+  obj1.free();
+}
+
+void Gfx::doSoftMask(Object *str, GBool alpha,
+                    GfxColorSpace *blendingColorSpace,
+                    GBool isolated, GBool knockout,
+                    Function *transferFunc, GfxColor *backdropColor) {
+  Dict *dict, *resDict;
+  double m[6], bbox[4];
+  Object obj1, obj2;
+  int i;
+
+  // check for excessive recursion
+  if (formDepth > 20) {
+    return;
+  }
+
+  // get stream dict
+  dict = str->streamGetDict();
+
+  // check form type
+  dict->lookup("FormType", &obj1);
+  if (!(obj1.isNull() || (obj1.isInt() && obj1.getInt() == 1))) {
+    error(errSyntaxError, getPos(), "Unknown form type");
+  }
+  obj1.free();
+
+  // get bounding box
+  dict->lookup("BBox", &obj1);
+  if (!obj1.isArray()) {
+    obj1.free();
+    error(errSyntaxError, getPos(), "Bad form bounding box");
+    return;
+  }
+  for (i = 0; i < 4; ++i) {
+    obj1.arrayGet(i, &obj2);
+    if (likely(obj2.isNum())) bbox[i] = obj2.getNum();
+    else {
+      obj2.free();
+      obj1.free();
+      error(errSyntaxError, getPos(), "Bad form bounding box (non number)");
+      return;
+    }
+    obj2.free();
+  }
+  obj1.free();
+
+  // get matrix
+  dict->lookup("Matrix", &obj1);
+  if (obj1.isArray()) {
+    for (i = 0; i < 6; ++i) {
+      obj1.arrayGet(i, &obj2);
+      if (likely(obj2.isNum())) m[i] = obj2.getNum();
+      else m[i] = 0;
+      obj2.free();
+    }
+  } else {
+    m[0] = 1; m[1] = 0;
+    m[2] = 0; m[3] = 1;
+    m[4] = 0; m[5] = 0;
+  }
+  obj1.free();
+
+  // get resources
+  dict->lookup("Resources", &obj1);
+  resDict = obj1.isDict() ? obj1.getDict() : (Dict *)NULL;
+
+  // draw it
+  ++formDepth;
+  drawForm(str, resDict, m, bbox, gTrue, gTrue,
+         blendingColorSpace, isolated, knockout,
+         alpha, transferFunc, backdropColor);
+  --formDepth;
+
+  if (blendingColorSpace) {
+    delete blendingColorSpace;
+  }
+  obj1.free();
+}
+
+void Gfx::opSetRenderingIntent(Object args[], int numArgs) {
+}
+
+//------------------------------------------------------------------------
+// color operators
+//------------------------------------------------------------------------
+
+void Gfx::opSetFillGray(Object args[], int numArgs) {
+  GfxColor color;
+  GfxColorSpace *colorSpace = NULL;
+  Object obj;
+
+  state->setFillPattern(NULL);
+  res->lookupColorSpace("DefaultGray", &obj);
+  if (!obj.isNull()) {
+    colorSpace = GfxColorSpace::parse(&obj, this);
+  }
+  if (colorSpace == NULL) {
+    colorSpace = new GfxDeviceGrayColorSpace();
+  }
+  obj.free();
+  state->setFillColorSpace(colorSpace);
+  out->updateFillColorSpace(state);
+  color.c[0] = dblToCol(args[0].getNum());
+  state->setFillColor(&color);
+  out->updateFillColor(state);
+}
+
+void Gfx::opSetStrokeGray(Object args[], int numArgs) {
+  GfxColor color;
+  GfxColorSpace *colorSpace = NULL;
+  Object obj;
+
+  state->setStrokePattern(NULL);
+  res->lookupColorSpace("DefaultGray", &obj);
+  if (!obj.isNull()) {
+    colorSpace = GfxColorSpace::parse(&obj, this);
+  }
+  if (colorSpace == NULL) {
+    colorSpace = new GfxDeviceGrayColorSpace();
+  }
+  obj.free();
+  state->setStrokeColorSpace(colorSpace);
+  out->updateStrokeColorSpace(state);
+  color.c[0] = dblToCol(args[0].getNum());
+  state->setStrokeColor(&color);
+  out->updateStrokeColor(state);
+}
+
+void Gfx::opSetFillCMYKColor(Object args[], int numArgs) {
+  GfxColor color;
+  GfxColorSpace *colorSpace = NULL;
+  Object obj;
+  int i;
+
+  res->lookupColorSpace("DefaultCMYK", &obj);
+  if (!obj.isNull()) {
+    colorSpace = GfxColorSpace::parse(&obj, this);
+  }
+  if (colorSpace == NULL) {
+    colorSpace = new GfxDeviceCMYKColorSpace();
+  }
+  obj.free();
+  state->setFillPattern(NULL);
+  state->setFillColorSpace(colorSpace);
+  out->updateFillColorSpace(state);
+  for (i = 0; i < 4; ++i) {
+    color.c[i] = dblToCol(args[i].getNum());
+  }
+  state->setFillColor(&color);
+  out->updateFillColor(state);
+}
+
+void Gfx::opSetStrokeCMYKColor(Object args[], int numArgs) {
+  GfxColor color;
+  GfxColorSpace *colorSpace = NULL;
+  Object obj;
+  int i;
+
+  state->setStrokePattern(NULL);
+  res->lookupColorSpace("DefaultCMYK", &obj);
+  if (!obj.isNull()) {
+    colorSpace = GfxColorSpace::parse(&obj, this);
+  }
+  if (colorSpace == NULL) {
+    colorSpace = new GfxDeviceCMYKColorSpace();
+  }
+  obj.free();
+  state->setStrokeColorSpace(colorSpace);
+  out->updateStrokeColorSpace(state);
+  for (i = 0; i < 4; ++i) {
+    color.c[i] = dblToCol(args[i].getNum());
+  }
+  state->setStrokeColor(&color);
+  out->updateStrokeColor(state);
+}
+
+void Gfx::opSetFillRGBColor(Object args[], int numArgs) {
+  Object obj;
+  GfxColorSpace *colorSpace = NULL;
+  GfxColor color;
+  int i;
+
+  state->setFillPattern(NULL);
+  res->lookupColorSpace("DefaultRGB", &obj);
+  if (!obj.isNull()) {
+    colorSpace = GfxColorSpace::parse(&obj, this);
+  }
+  if (colorSpace == NULL) {
+    colorSpace = new GfxDeviceRGBColorSpace();
+  }
+  obj.free();
+  state->setFillColorSpace(colorSpace);
+  out->updateFillColorSpace(state);
+  for (i = 0; i < 3; ++i) {
+    color.c[i] = dblToCol(args[i].getNum());
+  }
+  state->setFillColor(&color);
+  out->updateFillColor(state);
+}
+
+void Gfx::opSetStrokeRGBColor(Object args[], int numArgs) {
+  Object obj;
+  GfxColorSpace *colorSpace = NULL;
+  GfxColor color;
+  int i;
+
+  state->setStrokePattern(NULL);
+  res->lookupColorSpace("DefaultRGB", &obj);
+  if (!obj.isNull()) {
+    colorSpace = GfxColorSpace::parse(&obj, this);
+  }
+  if (colorSpace == NULL) {
+    colorSpace = new GfxDeviceRGBColorSpace();
+  }
+  obj.free();
+  state->setStrokeColorSpace(colorSpace);
+  out->updateStrokeColorSpace(state);
+  for (i = 0; i < 3; ++i) {
+    color.c[i] = dblToCol(args[i].getNum());
+  }
+  state->setStrokeColor(&color);
+  out->updateStrokeColor(state);
+}
+
+void Gfx::opSetFillColorSpace(Object args[], int numArgs) {
+  Object obj;
+  GfxColorSpace *colorSpace;
+  GfxColor color;
+
+  res->lookupColorSpace(args[0].getName(), &obj);
+  if (obj.isNull()) {
+    colorSpace = GfxColorSpace::parse(&args[0], this);
+  } else {
+    colorSpace = GfxColorSpace::parse(&obj, this);
+  }
+  obj.free();
+  if (colorSpace) {
+    state->setFillPattern(NULL);
+    state->setFillColorSpace(colorSpace);
+    out->updateFillColorSpace(state);
+    colorSpace->getDefaultColor(&color);
+    state->setFillColor(&color);
+    out->updateFillColor(state);
+  } else {
+    error(errSyntaxError, getPos(), "Bad color space (fill)");
+  }
+}
+
+void Gfx::opSetStrokeColorSpace(Object args[], int numArgs) {
+  Object obj;
+  GfxColorSpace *colorSpace;
+  GfxColor color;
+
+  state->setStrokePattern(NULL);
+  res->lookupColorSpace(args[0].getName(), &obj);
+  if (obj.isNull()) {
+    colorSpace = GfxColorSpace::parse(&args[0], this);
+  } else {
+    colorSpace = GfxColorSpace::parse(&obj, this);
+  }
+  obj.free();
+  if (colorSpace) {
+    state->setStrokeColorSpace(colorSpace);
+    out->updateStrokeColorSpace(state);
+    colorSpace->getDefaultColor(&color);
+    state->setStrokeColor(&color);
+    out->updateStrokeColor(state);
+  } else {
+    error(errSyntaxError, getPos(), "Bad color space (stroke)");
+  }
+}
+
+void Gfx::opSetFillColor(Object args[], int numArgs) {
+  GfxColor color;
+  int i;
+
+  if (numArgs != state->getFillColorSpace()->getNComps()) {
+    error(errSyntaxError, getPos(), "Incorrect number of arguments in 'sc' command");
+    return;
+  }
+  state->setFillPattern(NULL);
+  for (i = 0; i < numArgs; ++i) {
+    color.c[i] = dblToCol(args[i].getNum());
+  }
+  state->setFillColor(&color);
+  out->updateFillColor(state);
+}
+
+void Gfx::opSetStrokeColor(Object args[], int numArgs) {
+  GfxColor color;
+  int i;
+
+  if (numArgs != state->getStrokeColorSpace()->getNComps()) {
+    error(errSyntaxError, getPos(), "Incorrect number of arguments in 'SC' command");
+    return;
+  }
+  state->setStrokePattern(NULL);
+  for (i = 0; i < numArgs; ++i) {
+    color.c[i] = dblToCol(args[i].getNum());
+  }
+  state->setStrokeColor(&color);
+  out->updateStrokeColor(state);
+}
+
+void Gfx::opSetFillColorN(Object args[], int numArgs) {
+  GfxColor color;
+  GfxPattern *pattern;
+  int i;
+
+  if (state->getFillColorSpace()->getMode() == csPattern) {
+    if (numArgs > 1) {
+      if (!((GfxPatternColorSpace *)state->getFillColorSpace())->getUnder() ||
+         numArgs - 1 != ((GfxPatternColorSpace *)state->getFillColorSpace())
+                            ->getUnder()->getNComps()) {
+       error(errSyntaxError, getPos(), "Incorrect number of arguments in 'scn' command");
+       return;
+      }
+      for (i = 0; i < numArgs - 1 && i < gfxColorMaxComps; ++i) {
+       if (args[i].isNum()) {
+         color.c[i] = dblToCol(args[i].getNum());
+       } else {
+         color.c[i] = 0; // TODO Investigate if this is what Adobe does
+       }
+      }
+      state->setFillColor(&color);
+      out->updateFillColor(state);
+    }
+    if (numArgs > 0) {
+      if (args[numArgs-1].isName() &&
+         (pattern = res->lookupPattern(args[numArgs-1].getName(), this))) {
+        state->setFillPattern(pattern);
+      }
+    }
+
+  } else {
+    if (numArgs != state->getFillColorSpace()->getNComps()) {
+      error(errSyntaxError, getPos(), "Incorrect number of arguments in 'scn' command");
+      return;
+    }
+    state->setFillPattern(NULL);
+    for (i = 0; i < numArgs && i < gfxColorMaxComps; ++i) {
+      if (args[i].isNum()) {
+       color.c[i] = dblToCol(args[i].getNum());
+      } else {
+        color.c[i] = 0; // TODO Investigate if this is what Adobe does
+      }
+    }
+    state->setFillColor(&color);
+    out->updateFillColor(state);
+  }
+}
+
+void Gfx::opSetStrokeColorN(Object args[], int numArgs) {
+  GfxColor color;
+  GfxPattern *pattern;
+  int i;
+
+  if (state->getStrokeColorSpace()->getMode() == csPattern) {
+    if (numArgs > 1) {
+      if (!((GfxPatternColorSpace *)state->getStrokeColorSpace())
+              ->getUnder() ||
+         numArgs - 1 != ((GfxPatternColorSpace *)state->getStrokeColorSpace())
+                            ->getUnder()->getNComps()) {
+       error(errSyntaxError, getPos(), "Incorrect number of arguments in 'SCN' command");
+       return;
+      }
+      for (i = 0; i < numArgs - 1 && i < gfxColorMaxComps; ++i) {
+       if (args[i].isNum()) {
+         color.c[i] = dblToCol(args[i].getNum());
+       } else {
+         color.c[i] = 0; // TODO Investigate if this is what Adobe does
+       }
+      }
+      state->setStrokeColor(&color);
+      out->updateStrokeColor(state);
+    }
+    if (unlikely(numArgs <= 0)) {
+      error(errSyntaxError, getPos(), "Incorrect number of arguments in 'SCN' command");
+      return;
+    }
+    if (args[numArgs-1].isName() &&
+       (pattern = res->lookupPattern(args[numArgs-1].getName(), this))) {
+      state->setStrokePattern(pattern);
+    }
+
+  } else {
+    if (numArgs != state->getStrokeColorSpace()->getNComps()) {
+      error(errSyntaxError, getPos(), "Incorrect number of arguments in 'SCN' command");
+      return;
+    }
+    state->setStrokePattern(NULL);
+    for (i = 0; i < numArgs && i < gfxColorMaxComps; ++i) {
+      if (args[i].isNum()) {
+       color.c[i] = dblToCol(args[i].getNum());
+      } else {
+        color.c[i] = 0; // TODO Investigate if this is what Adobe does
+      }
+    }
+    state->setStrokeColor(&color);
+    out->updateStrokeColor(state);
+  }
+}
+
+//------------------------------------------------------------------------
+// path segment operators
+//------------------------------------------------------------------------
+
+void Gfx::opMoveTo(Object args[], int numArgs) {
+  state->moveTo(args[0].getNum(), args[1].getNum());
+}
+
+void Gfx::opLineTo(Object args[], int numArgs) {
+  if (!state->isCurPt()) {
+    error(errSyntaxError, getPos(), "No current point in lineto");
+    return;
+  }
+  state->lineTo(args[0].getNum(), args[1].getNum());
+}
+
+void Gfx::opCurveTo(Object args[], int numArgs) {
+  double x1, y1, x2, y2, x3, y3;
+
+  if (!state->isCurPt()) {
+    error(errSyntaxError, getPos(), "No current point in curveto");
+    return;
+  }
+  x1 = args[0].getNum();
+  y1 = args[1].getNum();
+  x2 = args[2].getNum();
+  y2 = args[3].getNum();
+  x3 = args[4].getNum();
+  y3 = args[5].getNum();
+  state->curveTo(x1, y1, x2, y2, x3, y3);
+}
+
+void Gfx::opCurveTo1(Object args[], int numArgs) {
+  double x1, y1, x2, y2, x3, y3;
+
+  if (!state->isCurPt()) {
+    error(errSyntaxError, getPos(), "No current point in curveto1");
+    return;
+  }
+  x1 = state->getCurX();
+  y1 = state->getCurY();
+  x2 = args[0].getNum();
+  y2 = args[1].getNum();
+  x3 = args[2].getNum();
+  y3 = args[3].getNum();
+  state->curveTo(x1, y1, x2, y2, x3, y3);
+}
+
+void Gfx::opCurveTo2(Object args[], int numArgs) {
+  double x1, y1, x2, y2, x3, y3;
+
+  if (!state->isCurPt()) {
+    error(errSyntaxError, getPos(), "No current point in curveto2");
+    return;
+  }
+  x1 = args[0].getNum();
+  y1 = args[1].getNum();
+  x2 = args[2].getNum();
+  y2 = args[3].getNum();
+  x3 = x2;
+  y3 = y2;
+  state->curveTo(x1, y1, x2, y2, x3, y3);
+}
+
+void Gfx::opRectangle(Object args[], int numArgs) {
+  double x, y, w, h;
+
+  x = args[0].getNum();
+  y = args[1].getNum();
+  w = args[2].getNum();
+  h = args[3].getNum();
+  state->moveTo(x, y);
+  state->lineTo(x + w, y);
+  state->lineTo(x + w, y + h);
+  state->lineTo(x, y + h);
+  state->closePath();
+}
+
+void Gfx::opClosePath(Object args[], int numArgs) {
+  if (!state->isCurPt()) {
+    error(errSyntaxError, getPos(), "No current point in closepath");
+    return;
+  }
+  state->closePath();
+}
+
+//------------------------------------------------------------------------
+// path painting operators
+//------------------------------------------------------------------------
+
+void Gfx::opEndPath(Object args[], int numArgs) {
+  doEndPath();
+}
+
+void Gfx::opStroke(Object args[], int numArgs) {
+  if (!state->isCurPt()) {
+    //error(errSyntaxError, getPos(), "No path in stroke");
+    return;
+  }
+  if (state->isPath()) {
+    if (ocState) {
+      if (state->getStrokeColorSpace()->getMode() == csPattern) {
+       doPatternStroke();
+      } else {
+       out->stroke(state);
+      }
+    }
+  }
+  doEndPath();
+}
+
+void Gfx::opCloseStroke(Object * /*args[]*/, int /*numArgs*/) {
+  if (!state->isCurPt()) {
+    //error(errSyntaxError, getPos(), "No path in closepath/stroke");
+    return;
+  }
+  if (state->isPath()) {
+    state->closePath();
+    if (ocState) {
+      if (state->getStrokeColorSpace()->getMode() == csPattern) {
+       doPatternStroke();
+      } else {
+       out->stroke(state);
+      }
+    }
+  }
+  doEndPath();
+}
+
+void Gfx::opFill(Object args[], int numArgs) {
+  if (!state->isCurPt()) {
+    //error(errSyntaxError, getPos(), "No path in fill");
+    return;
+  }
+  if (state->isPath()) {
+    if (ocState) {
+      if (state->getFillColorSpace()->getMode() == csPattern) {
+       doPatternFill(gFalse);
+      } else {
+       out->fill(state);
+      }
+    }
+  }
+  doEndPath();
+}
+
+void Gfx::opEOFill(Object args[], int numArgs) {
+  if (!state->isCurPt()) {
+    //error(errSyntaxError, getPos(), "No path in eofill");
+    return;
+  }
+  if (state->isPath()) {
+    if (ocState) {
+      if (state->getFillColorSpace()->getMode() == csPattern) {
+       doPatternFill(gTrue);
+      } else {
+       out->eoFill(state);
+      }
+    }
+  }
+  doEndPath();
+}
+
+void Gfx::opFillStroke(Object args[], int numArgs) {
+  if (!state->isCurPt()) {
+    //error(errSyntaxError, getPos(), "No path in fill/stroke");
+    return;
+  }
+  if (state->isPath()) {
+    if (ocState) {
+      if (state->getFillColorSpace()->getMode() == csPattern) {
+       doPatternFill(gFalse);
+      } else {
+       out->fill(state);
+      }
+      if (state->getStrokeColorSpace()->getMode() == csPattern) {
+       doPatternStroke();
+      } else {
+       out->stroke(state);
+      }
+    }
+  }
+  doEndPath();
+}
+
+void Gfx::opCloseFillStroke(Object args[], int numArgs) {
+  if (!state->isCurPt()) {
+    //error(errSyntaxError, getPos(), "No path in closepath/fill/stroke");
+    return;
+  }
+  if (state->isPath()) {
+    state->closePath();
+    if (ocState) {
+      if (state->getFillColorSpace()->getMode() == csPattern) {
+       doPatternFill(gFalse);
+      } else {
+       out->fill(state);
+      }
+      if (state->getStrokeColorSpace()->getMode() == csPattern) {
+       doPatternStroke();
+      } else {
+       out->stroke(state);
+      }
+    }
+  }
+  doEndPath();
+}
+
+void Gfx::opEOFillStroke(Object args[], int numArgs) {
+  if (!state->isCurPt()) {
+    //error(errSyntaxError, getPos(), "No path in eofill/stroke");
+    return;
+  }
+  if (state->isPath()) {
+    if (ocState) {
+      if (state->getFillColorSpace()->getMode() == csPattern) {
+       doPatternFill(gTrue);
+      } else {
+       out->eoFill(state);
+      }
+      if (state->getStrokeColorSpace()->getMode() == csPattern) {
+       doPatternStroke();
+      } else {
+       out->stroke(state);
+      }
+    }
+  }
+  doEndPath();
+}
+
+void Gfx::opCloseEOFillStroke(Object args[], int numArgs) {
+  if (!state->isCurPt()) {
+    //error(errSyntaxError, getPos(), "No path in closepath/eofill/stroke");
+    return;
+  }
+  if (state->isPath()) {
+    state->closePath();
+    if (ocState) {
+      if (state->getFillColorSpace()->getMode() == csPattern) {
+       doPatternFill(gTrue);
+      } else {
+       out->eoFill(state);
+      }
+      if (state->getStrokeColorSpace()->getMode() == csPattern) {
+       doPatternStroke();
+      } else {
+       out->stroke(state);
+      }
+    }
+  }
+  doEndPath();
+}
+
+void Gfx::doPatternFill(GBool eoFill) {
+  GfxPattern *pattern;
+
+  // this is a bit of a kludge -- patterns can be really slow, so we
+  // skip them if we're only doing text extraction, since they almost
+  // certainly don't contain any text
+  if (!out->needNonText()) {
+    return;
+  }
+
+  if (!(pattern = state->getFillPattern())) {
+    return;
+  }
+  switch (pattern->getType()) {
+  case 1:
+    doTilingPatternFill((GfxTilingPattern *)pattern, gFalse, eoFill, gFalse);
+    break;
+  case 2:
+    doShadingPatternFill((GfxShadingPattern *)pattern, gFalse, eoFill, gFalse);
+    break;
+  default:
+    error(errSyntaxError, getPos(), "Unknown pattern type ({0:d}) in fill",
+         pattern->getType());
+    break;
+  }
+}
+
+void Gfx::doPatternStroke() {
+  GfxPattern *pattern;
+
+  // this is a bit of a kludge -- patterns can be really slow, so we
+  // skip them if we're only doing text extraction, since they almost
+  // certainly don't contain any text
+  if (!out->needNonText()) {
+    return;
+  }
+
+  if (!(pattern = state->getStrokePattern())) {
+    return;
+  }
+  switch (pattern->getType()) {
+  case 1:
+    doTilingPatternFill((GfxTilingPattern *)pattern, gTrue, gFalse, gFalse);
+    break;
+  case 2:
+    doShadingPatternFill((GfxShadingPattern *)pattern, gTrue, gFalse, gFalse);
+    break;
+  default:
+    error(errSyntaxError, getPos(), "Unknown pattern type ({0:d}) in stroke",
+         pattern->getType());
+    break;
+  }
+}
+
+void Gfx::doPatternText() {
+  GfxPattern *pattern;
+
+  // this is a bit of a kludge -- patterns can be really slow, so we
+  // skip them if we're only doing text extraction, since they almost
+  // certainly don't contain any text
+  if (!out->needNonText()) {
+    return;
+  }
+
+  if (!(pattern = state->getFillPattern())) {
+    return;
+  }
+  switch (pattern->getType()) {
+  case 1:
+    doTilingPatternFill((GfxTilingPattern *)pattern, gFalse, gFalse, gTrue);
+    break;
+  case 2:
+    doShadingPatternFill((GfxShadingPattern *)pattern, gFalse, gFalse, gTrue);
+    break;
+  default:
+    error(errSyntaxError, getPos(), "Unknown pattern type ({0:d}) in fill",
+         pattern->getType());
+    break;
+  }
+}
+
+void Gfx::doPatternImageMask(Object *ref, Stream *str, int width, int height,
+                            GBool invert, GBool inlineImg) {
+  saveState();
+
+  out->setSoftMaskFromImageMask(state, ref, str,
+                               width, height, invert, inlineImg, baseMatrix);
+
+  state->clearPath();
+  state->moveTo(0, 0);
+  state->lineTo(1, 0);
+  state->lineTo(1, 1);
+  state->lineTo(0, 1);
+  state->closePath();
+  doPatternText();
+
+  out->unsetSoftMaskFromImageMask(state, baseMatrix);
+  restoreState();
+}
+
+void Gfx::doTilingPatternFill(GfxTilingPattern *tPat,
+                             GBool stroke, GBool eoFill, GBool text) {
+  GfxPatternColorSpace *patCS;
+  GfxColorSpace *cs;
+  GfxColor color;
+  GfxState *savedState;
+  double xMin, yMin, xMax, yMax, x, y, x1, y1;
+  double cxMin, cyMin, cxMax, cyMax;
+  int xi0, yi0, xi1, yi1, xi, yi;
+  double *ctm, *btm, *ptm;
+  double m[6], ictm[6], m1[6], imb[6];
+  double det;
+  double xstep, ystep;
+  int i;
+
+  // get color space
+  patCS = (GfxPatternColorSpace *)(stroke ? state->getStrokeColorSpace()
+                                         : state->getFillColorSpace());
+
+  // construct a (pattern space) -> (current space) transform matrix
+  ctm = state->getCTM();
+  btm = baseMatrix;
+  ptm = tPat->getMatrix();
+  // iCTM = invert CTM
+  det = 1 / (ctm[0] * ctm[3] - ctm[1] * ctm[2]);
+  ictm[0] = ctm[3] * det;
+  ictm[1] = -ctm[1] * det;
+  ictm[2] = -ctm[2] * det;
+  ictm[3] = ctm[0] * det;
+  ictm[4] = (ctm[2] * ctm[5] - ctm[3] * ctm[4]) * det;
+  ictm[5] = (ctm[1] * ctm[4] - ctm[0] * ctm[5]) * det;
+  // m1 = PTM * BTM = PTM * base transform matrix
+  m1[0] = ptm[0] * btm[0] + ptm[1] * btm[2];
+  m1[1] = ptm[0] * btm[1] + ptm[1] * btm[3];
+  m1[2] = ptm[2] * btm[0] + ptm[3] * btm[2];
+  m1[3] = ptm[2] * btm[1] + ptm[3] * btm[3];
+  m1[4] = ptm[4] * btm[0] + ptm[5] * btm[2] + btm[4];
+  m1[5] = ptm[4] * btm[1] + ptm[5] * btm[3] + btm[5];
+  // m = m1 * iCTM = (PTM * BTM) * (iCTM)
+  m[0] = m1[0] * ictm[0] + m1[1] * ictm[2];
+  m[1] = m1[0] * ictm[1] + m1[1] * ictm[3];
+  m[2] = m1[2] * ictm[0] + m1[3] * ictm[2];
+  m[3] = m1[2] * ictm[1] + m1[3] * ictm[3];
+  m[4] = m1[4] * ictm[0] + m1[5] * ictm[2] + ictm[4];
+  m[5] = m1[4] * ictm[1] + m1[5] * ictm[3] + ictm[5];
+
+  // construct a (device space) -> (pattern space) transform matrix
+  det = 1 / (m1[0] * m1[3] - m1[1] * m1[2]);
+  imb[0] = m1[3] * det;
+  imb[1] = -m1[1] * det;
+  imb[2] = -m1[2] * det;
+  imb[3] = m1[0] * det;
+  imb[4] = (m1[2] * m1[5] - m1[3] * m1[4]) * det;
+  imb[5] = (m1[1] * m1[4] - m1[0] * m1[5]) * det;
+
+  // save current graphics state
+  savedState = saveStateStack();
+
+  // set underlying color space (for uncolored tiling patterns); set
+  // various other parameters (stroke color, line width) to match
+  // Adobe's behavior
+  state->setFillPattern(NULL);
+  state->setStrokePattern(NULL);
+  if (tPat->getPaintType() == 2 && (cs = patCS->getUnder())) {
+    state->setFillColorSpace(cs->copy());
+    out->updateFillColorSpace(state);
+    state->setStrokeColorSpace(cs->copy());
+    out->updateStrokeColorSpace(state);
+    if (stroke) {
+       state->setFillColor(state->getStrokeColor());
+    } else {
+       state->setStrokeColor(state->getFillColor());
+    }
+    out->updateFillColor(state);
+    out->updateStrokeColor(state);
+  } else {
+    cs = new GfxDeviceGrayColorSpace();
+    state->setFillColorSpace(cs);
+    cs->getDefaultColor(&color);
+    state->setFillColor(&color);
+    out->updateFillColorSpace(state);
+    state->setStrokeColorSpace(new GfxDeviceGrayColorSpace());
+    state->setStrokeColor(&color);
+    out->updateStrokeColorSpace(state);
+  }
+  if (!stroke) {
+    state->setLineWidth(0);
+    out->updateLineWidth(state);
+  }
+
+  // clip to current path
+  if (stroke) {
+    state->clipToStrokePath();
+    out->clipToStrokePath(state);
+  } else if (!text) {
+    state->clip();
+    if (eoFill) {
+      out->eoClip(state);
+    } else {
+      out->clip(state);
+    }
+  }
+  state->clearPath();
+
+  // get the clip region, check for empty
+  state->getClipBBox(&cxMin, &cyMin, &cxMax, &cyMax);
+  if (cxMin > cxMax || cyMin > cyMax) {
+    goto restore;
+  }
+
+  // transform clip region bbox to pattern space
+  xMin = xMax = cxMin * imb[0] + cyMin * imb[2] + imb[4];
+  yMin = yMax = cxMin * imb[1] + cyMin * imb[3] + imb[5];
+  x1 = cxMin * imb[0] + cyMax * imb[2] + imb[4];
+  y1 = cxMin * imb[1] + cyMax * imb[3] + imb[5];
+  if (x1 < xMin) {
+    xMin = x1;
+  } else if (x1 > xMax) {
+    xMax = x1;
+  }
+  if (y1 < yMin) {
+    yMin = y1;
+  } else if (y1 > yMax) {
+    yMax = y1;
+  }
+  x1 = cxMax * imb[0] + cyMin * imb[2] + imb[4];
+  y1 = cxMax * imb[1] + cyMin * imb[3] + imb[5];
+  if (x1 < xMin) {
+    xMin = x1;
+  } else if (x1 > xMax) {
+    xMax = x1;
+  }
+  if (y1 < yMin) {
+    yMin = y1;
+  } else if (y1 > yMax) {
+    yMax = y1;
+  }
+  x1 = cxMax * imb[0] + cyMax * imb[2] + imb[4];
+  y1 = cxMax * imb[1] + cyMax * imb[3] + imb[5];
+  if (x1 < xMin) {
+    xMin = x1;
+  } else if (x1 > xMax) {
+    xMax = x1;
+  }
+  if (y1 < yMin) {
+    yMin = y1;
+  } else if (y1 > yMax) {
+    yMax = y1;
+  }
+
+  // draw the pattern
+  //~ this should treat negative steps differently -- start at right/top
+  //~ edge instead of left/bottom (?)
+  xstep = fabs(tPat->getXStep());
+  ystep = fabs(tPat->getYStep());
+  xi0 = (int)ceil((xMin - tPat->getBBox()[2]) / xstep);
+  xi1 = (int)floor((xMax - tPat->getBBox()[0]) / xstep) + 1;
+  yi0 = (int)ceil((yMin - tPat->getBBox()[3]) / ystep);
+  yi1 = (int)floor((yMax - tPat->getBBox()[1]) / ystep) + 1;
+  for (i = 0; i < 4; ++i) {
+    m1[i] = m[i];
+  }
+  m1[4] = m[4];
+  m1[5] = m[5];
+  if (out->useTilingPatternFill() &&
+       out->tilingPatternFill(state, this, catalog, tPat->getContentStream(),
+                      tPat->getMatrix(), tPat->getPaintType(), tPat->getTilingType(),
+                      tPat->getResDict(), m1, tPat->getBBox(),
+                      xi0, yi0, xi1, yi1, xstep, ystep)) {
+    goto restore;
+  } else {
+    for (yi = yi0; yi < yi1; ++yi) {
+      for (xi = xi0; xi < xi1; ++xi) {
+        x = xi * xstep;
+        y = yi * ystep;
+        m1[4] = x * m[0] + y * m[2] + m[4];
+        m1[5] = x * m[1] + y * m[3] + m[5];
+        drawForm(tPat->getContentStream(), tPat->getResDict(),
+                 m1, tPat->getBBox());
+      }
+    }
+  }
+
+  // restore graphics state
+ restore:
+  restoreStateStack(savedState);
+}
+
+void Gfx::doShadingPatternFill(GfxShadingPattern *sPat,
+                              GBool stroke, GBool eoFill, GBool text) {
+  GfxShading *shading;
+  GfxState *savedState;
+  double *ctm, *btm, *ptm;
+  double m[6], ictm[6], m1[6];
+  double xMin, yMin, xMax, yMax;
+  double det;
+
+  shading = sPat->getShading();
+
+  // save current graphics state
+  savedState = saveStateStack();
+
+  // clip to current path
+  if (stroke) {
+    state->clipToStrokePath();
+    out->clipToStrokePath(state);
+  } else if (!text) {
+    state->clip();
+    if (eoFill) {
+      out->eoClip(state);
+    } else {
+      out->clip(state);
+    }
+  }
+  state->clearPath();
+
+  // construct a (pattern space) -> (current space) transform matrix
+  ctm = state->getCTM();
+  btm = baseMatrix;
+  ptm = sPat->getMatrix();
+  // iCTM = invert CTM
+  det = 1 / (ctm[0] * ctm[3] - ctm[1] * ctm[2]);
+  ictm[0] = ctm[3] * det;
+  ictm[1] = -ctm[1] * det;
+  ictm[2] = -ctm[2] * det;
+  ictm[3] = ctm[0] * det;
+  ictm[4] = (ctm[2] * ctm[5] - ctm[3] * ctm[4]) * det;
+  ictm[5] = (ctm[1] * ctm[4] - ctm[0] * ctm[5]) * det;
+  // m1 = PTM * BTM = PTM * base transform matrix
+  m1[0] = ptm[0] * btm[0] + ptm[1] * btm[2];
+  m1[1] = ptm[0] * btm[1] + ptm[1] * btm[3];
+  m1[2] = ptm[2] * btm[0] + ptm[3] * btm[2];
+  m1[3] = ptm[2] * btm[1] + ptm[3] * btm[3];
+  m1[4] = ptm[4] * btm[0] + ptm[5] * btm[2] + btm[4];
+  m1[5] = ptm[4] * btm[1] + ptm[5] * btm[3] + btm[5];
+  // m = m1 * iCTM = (PTM * BTM) * (iCTM)
+  m[0] = m1[0] * ictm[0] + m1[1] * ictm[2];
+  m[1] = m1[0] * ictm[1] + m1[1] * ictm[3];
+  m[2] = m1[2] * ictm[0] + m1[3] * ictm[2];
+  m[3] = m1[2] * ictm[1] + m1[3] * ictm[3];
+  m[4] = m1[4] * ictm[0] + m1[5] * ictm[2] + ictm[4];
+  m[5] = m1[4] * ictm[1] + m1[5] * ictm[3] + ictm[5];
+
+  // set the new matrix
+  state->concatCTM(m[0], m[1], m[2], m[3], m[4], m[5]);
+  out->updateCTM(state, m[0], m[1], m[2], m[3], m[4], m[5]);
+
+  // clip to bbox
+  if (shading->getHasBBox()) {
+    shading->getBBox(&xMin, &yMin, &xMax, &yMax);
+    state->moveTo(xMin, yMin);
+    state->lineTo(xMax, yMin);
+    state->lineTo(xMax, yMax);
+    state->lineTo(xMin, yMax);
+    state->closePath();
+    state->clip();
+    out->clip(state);
+    state->clearPath();
+  }
+
+  // set the color space
+  state->setFillColorSpace(shading->getColorSpace()->copy());
+  out->updateFillColorSpace(state);
+
+  // background color fill
+  if (shading->getHasBackground()) {
+    state->setFillColor(shading->getBackground());
+    out->updateFillColor(state);
+    state->getUserClipBBox(&xMin, &yMin, &xMax, &yMax);
+    state->moveTo(xMin, yMin);
+    state->lineTo(xMax, yMin);
+    state->lineTo(xMax, yMax);
+    state->lineTo(xMin, yMax);
+    state->closePath();
+    out->fill(state);
+    state->clearPath();
+  }
+
+#if 1 //~tmp: turn off anti-aliasing temporarily
+  GBool vaa = out->getVectorAntialias();
+  if (vaa) {
+    out->setVectorAntialias(gFalse);
+  }
+#endif
+
+  // do shading type-specific operations
+  switch (shading->getType()) {
+  case 1:
+    doFunctionShFill((GfxFunctionShading *)shading);
+    break;
+  case 2:
+    doAxialShFill((GfxAxialShading *)shading);
+    break;
+  case 3:
+    doRadialShFill((GfxRadialShading *)shading);
+    break;
+  case 4:
+  case 5:
+    doGouraudTriangleShFill((GfxGouraudTriangleShading *)shading);
+    break;
+  case 6:
+  case 7:
+    doPatchMeshShFill((GfxPatchMeshShading *)shading);
+    break;
+  }
+
+#if 1 //~tmp: turn off anti-aliasing temporarily
+  if (vaa) {
+    out->setVectorAntialias(gTrue);
+  }
+#endif
+
+  // restore graphics state
+  restoreStateStack(savedState);
+}
+
+void Gfx::opShFill(Object args[], int numArgs) {
+  GfxShading *shading;
+  GfxState *savedState;
+  double xMin, yMin, xMax, yMax;
+
+  if (!ocState) {
+    return;
+  }
+
+  if (!(shading = res->lookupShading(args[0].getName(), this))) {
+    return;
+  }
+
+  // save current graphics state
+  savedState = saveStateStack();
+
+  // clip to bbox
+  if (shading->getHasBBox()) {
+    shading->getBBox(&xMin, &yMin, &xMax, &yMax);
+    state->moveTo(xMin, yMin);
+    state->lineTo(xMax, yMin);
+    state->lineTo(xMax, yMax);
+    state->lineTo(xMin, yMax);
+    state->closePath();
+    state->clip();
+    out->clip(state);
+    state->clearPath();
+  }
+
+  // set the color space
+  state->setFillColorSpace(shading->getColorSpace()->copy());
+  out->updateFillColorSpace(state);
+
+#if 1 //~tmp: turn off anti-aliasing temporarily
+  GBool vaa = out->getVectorAntialias();
+  if (vaa) {
+    out->setVectorAntialias(gFalse);
+  }
+#endif
+
+  // do shading type-specific operations
+  switch (shading->getType()) {
+  case 1:
+    doFunctionShFill((GfxFunctionShading *)shading);
+    break;
+  case 2:
+    doAxialShFill((GfxAxialShading *)shading);
+    break;
+  case 3:
+    doRadialShFill((GfxRadialShading *)shading);
+    break;
+  case 4:
+  case 5:
+    doGouraudTriangleShFill((GfxGouraudTriangleShading *)shading);
+    break;
+  case 6:
+  case 7:
+    doPatchMeshShFill((GfxPatchMeshShading *)shading);
+    break;
+  }
+
+#if 1 //~tmp: turn off anti-aliasing temporarily
+  if (vaa) {
+    out->setVectorAntialias(gTrue);
+  }
+#endif
+
+  // restore graphics state
+  restoreStateStack(savedState);
+
+  delete shading;
+}
+
+void Gfx::doFunctionShFill(GfxFunctionShading *shading) {
+  double x0, y0, x1, y1;
+  GfxColor colors[4];
+
+  if (out->useShadedFills( shading->getType() ) &&
+      out->functionShadedFill(state, shading)) {
+    return;
+  }
+
+  shading->getDomain(&x0, &y0, &x1, &y1);
+  shading->getColor(x0, y0, &colors[0]);
+  shading->getColor(x0, y1, &colors[1]);
+  shading->getColor(x1, y0, &colors[2]);
+  shading->getColor(x1, y1, &colors[3]);
+  doFunctionShFill1(shading, x0, y0, x1, y1, colors, 0);
+}
+
+void Gfx::doFunctionShFill1(GfxFunctionShading *shading,
+                           double x0, double y0,
+                           double x1, double y1,
+                           GfxColor *colors, int depth) {
+  GfxColor fillColor;
+  GfxColor color0M, color1M, colorM0, colorM1, colorMM;
+  GfxColor colors2[4];
+  double *matrix;
+  double xM, yM;
+  int nComps, i, j;
+
+  nComps = shading->getColorSpace()->getNComps();
+  matrix = shading->getMatrix();
+
+  // compare the four corner colors
+  for (i = 0; i < 4; ++i) {
+    for (j = 0; j < nComps; ++j) {
+      if (abs(colors[i].c[j] - colors[(i+1)&3].c[j]) > functionColorDelta) {
+       break;
+      }
+    }
+    if (j < nComps) {
+      break;
+    }
+  }
+
+  // center of the rectangle
+  xM = 0.5 * (x0 + x1);
+  yM = 0.5 * (y0 + y1);
+
+  // the four corner colors are close (or we hit the recursive limit)
+  // -- fill the rectangle; but require at least one subdivision
+  // (depth==0) to avoid problems when the four outer corners of the
+  // shaded region are the same color
+  if ((i == 4 && depth > 0) || depth == functionMaxDepth) {
+
+    // use the center color
+    shading->getColor(xM, yM, &fillColor);
+    state->setFillColor(&fillColor);
+    out->updateFillColor(state);
+
+    // fill the rectangle
+    state->moveTo(x0 * matrix[0] + y0 * matrix[2] + matrix[4],
+                 x0 * matrix[1] + y0 * matrix[3] + matrix[5]);
+    state->lineTo(x1 * matrix[0] + y0 * matrix[2] + matrix[4],
+                 x1 * matrix[1] + y0 * matrix[3] + matrix[5]);
+    state->lineTo(x1 * matrix[0] + y1 * matrix[2] + matrix[4],
+                 x1 * matrix[1] + y1 * matrix[3] + matrix[5]);
+    state->lineTo(x0 * matrix[0] + y1 * matrix[2] + matrix[4],
+                 x0 * matrix[1] + y1 * matrix[3] + matrix[5]);
+    state->closePath();
+    out->fill(state);
+    state->clearPath();
+
+  // the four corner colors are not close enough -- subdivide the
+  // rectangle
+  } else {
+
+    // colors[0]       colorM0       colors[2]
+    //   (x0,y0)       (xM,y0)       (x1,y0)
+    //         +----------+----------+
+    //         |          |          |
+    //         |    UL    |    UR    |
+    // color0M |       colorMM       | color1M
+    // (x0,yM) +----------+----------+ (x1,yM)
+    //         |       (xM,yM)       |
+    //         |    LL    |    LR    |
+    //         |          |          |
+    //         +----------+----------+
+    // colors[1]       colorM1       colors[3]
+    //   (x0,y1)       (xM,y1)       (x1,y1)
+
+    shading->getColor(x0, yM, &color0M);
+    shading->getColor(x1, yM, &color1M);
+    shading->getColor(xM, y0, &colorM0);
+    shading->getColor(xM, y1, &colorM1);
+    shading->getColor(xM, yM, &colorMM);
+
+    // upper-left sub-rectangle
+    colors2[0] = colors[0];
+    colors2[1] = color0M;
+    colors2[2] = colorM0;
+    colors2[3] = colorMM;
+    doFunctionShFill1(shading, x0, y0, xM, yM, colors2, depth + 1);
+    
+    // lower-left sub-rectangle
+    colors2[0] = color0M;
+    colors2[1] = colors[1];
+    colors2[2] = colorMM;
+    colors2[3] = colorM1;
+    doFunctionShFill1(shading, x0, yM, xM, y1, colors2, depth + 1);
+    
+    // upper-right sub-rectangle
+    colors2[0] = colorM0;
+    colors2[1] = colorMM;
+    colors2[2] = colors[2];
+    colors2[3] = color1M;
+    doFunctionShFill1(shading, xM, y0, x1, yM, colors2, depth + 1);
+
+    // lower-right sub-rectangle
+    colors2[0] = colorMM;
+    colors2[1] = colorM1;
+    colors2[2] = color1M;
+    colors2[3] = colors[3];
+    doFunctionShFill1(shading, xM, yM, x1, y1, colors2, depth + 1);
+  }
+}
+
+static void bubbleSort(double array[])
+{
+  for (int j = 0; j < 3; ++j) {
+    int kk = j;
+    for (int k = j + 1; k < 4; ++k) {
+      if (array[k] < array[kk]) {
+        kk = k;
+      }
+    }
+    double tmp = array[j];
+    array[j] = array[kk];
+    array[kk] = tmp;
+  }
+}
+
+void Gfx::doAxialShFill(GfxAxialShading *shading) {
+  double xMin, yMin, xMax, yMax;
+  double x0, y0, x1, y1;
+  double dx, dy, mul;
+  GBool dxZero, dyZero;
+  double bboxIntersections[4];
+  double tMin, tMax, tx, ty;
+  double s[4], sMin, sMax, tmp;
+  double ux0, uy0, ux1, uy1, vx0, vy0, vx1, vy1;
+  double t0, t1, tt;
+  double ta[axialMaxSplits + 1];
+  int next[axialMaxSplits + 1];
+  GfxColor color0, color1;
+  int nComps;
+  int i, j, k;
+  GBool needExtend = gTrue;
+
+  // get the clip region bbox
+  state->getUserClipBBox(&xMin, &yMin, &xMax, &yMax);
+
+  // compute min and max t values, based on the four corners of the
+  // clip region bbox
+  shading->getCoords(&x0, &y0, &x1, &y1);
+  dx = x1 - x0;
+  dy = y1 - y0;
+  dxZero = fabs(dx) < 0.01;
+  dyZero = fabs(dy) < 0.01;
+  if (dxZero && dyZero) {
+    tMin = tMax = 0;
+  } else {
+    mul = 1 / (dx * dx + dy * dy);
+    bboxIntersections[0] = ((xMin - x0) * dx + (yMin - y0) * dy) * mul;
+    bboxIntersections[1] = ((xMin - x0) * dx + (yMax - y0) * dy) * mul;
+    bboxIntersections[2] = ((xMax - x0) * dx + (yMin - y0) * dy) * mul;
+    bboxIntersections[3] = ((xMax - x0) * dx + (yMax - y0) * dy) * mul;
+    bubbleSort(bboxIntersections);
+    tMin = bboxIntersections[0];
+    tMax = bboxIntersections[3];
+    if (tMin < 0 && !shading->getExtend0()) {
+      tMin = 0;
+    }
+    if (tMax > 1 && !shading->getExtend1()) {
+      tMax = 1;
+    }
+  }
+
+  if (out->useShadedFills( shading->getType() ) &&
+      out->axialShadedFill(state, shading, tMin, tMax)) {
+         return;
+  }
+
+  // get the function domain
+  t0 = shading->getDomain0();
+  t1 = shading->getDomain1();
+
+  // Traverse the t axis and do the shading.
+  //
+  // For each point (tx, ty) on the t axis, consider a line through
+  // that point perpendicular to the t axis:
+  //
+  //     x(s) = tx + s * -dy   -->   s = (x - tx) / -dy
+  //     y(s) = ty + s * dx    -->   s = (y - ty) / dx
+  //
+  // Then look at the intersection of this line with the bounding box
+  // (xMin, yMin, xMax, yMax).  In the general case, there are four
+  // intersection points:
+  //
+  //     s0 = (xMin - tx) / -dy
+  //     s1 = (xMax - tx) / -dy
+  //     s2 = (yMin - ty) / dx
+  //     s3 = (yMax - ty) / dx
+  //
+  // and we want the middle two s values.
+  //
+  // In the case where dx = 0, take s0 and s1; in the case where dy =
+  // 0, take s2 and s3.
+  //
+  // Each filled polygon is bounded by two of these line segments
+  // perpdendicular to the t axis.
+  //
+  // The t axis is bisected into smaller regions until the color
+  // difference across a region is small enough, and then the region
+  // is painted with a single color.
+
+  // set up: require at least one split to avoid problems when the two
+  // ends of the t axis have the same color
+  nComps = shading->getColorSpace()->getNComps();
+  ta[0] = tMin;
+  next[0] = axialMaxSplits / 2;
+  ta[axialMaxSplits / 2] = 0.5 * (tMin + tMax);
+  next[axialMaxSplits / 2] = axialMaxSplits;
+  ta[axialMaxSplits] = tMax;
+
+  // compute the color at t = tMin
+  if (tMin < 0) {
+    tt = t0;
+  } else if (tMin > 1) {
+    tt = t1;
+  } else {
+    tt = t0 + (t1 - t0) * tMin;
+  }
+  shading->getColor(tt, &color0);
+
+  if (out->useFillColorStop()) {
+    // make sure we add stop color when t = tMin
+    state->setFillColor(&color0);
+    out->updateFillColorStop(state, 0);
+  }
+
+  // compute the coordinates of the point on the t axis at t = tMin;
+  // then compute the intersection of the perpendicular line with the
+  // bounding box
+  tx = x0 + tMin * dx;
+  ty = y0 + tMin * dy;
+  if (dxZero && dyZero) {
+    sMin = sMax = 0;
+  } else if (dxZero) {
+    sMin = (xMin - tx) / -dy;
+    sMax = (xMax - tx) / -dy;
+    if (sMin > sMax) { tmp = sMin; sMin = sMax; sMax = tmp; }
+  } else if (dyZero) {
+    sMin = (yMin - ty) / dx;
+    sMax = (yMax - ty) / dx;
+    if (sMin > sMax) { tmp = sMin; sMin = sMax; sMax = tmp; }
+  } else {
+    s[0] = (yMin - ty) / dx;
+    s[1] = (yMax - ty) / dx;
+    s[2] = (xMin - tx) / -dy;
+    s[3] = (xMax - tx) / -dy;
+    bubbleSort(s);
+    sMin = s[1];
+    sMax = s[2];
+  }
+  ux0 = tx - sMin * dy;
+  uy0 = ty + sMin * dx;
+  vx0 = tx - sMax * dy;
+  vy0 = ty + sMax * dx;
+
+  i = 0;
+  bool doneBBox1, doneBBox2;
+  if (dxZero && dyZero) {
+    doneBBox1 = doneBBox2 = true;
+  } else {
+    doneBBox1 = bboxIntersections[1] < tMin;
+    doneBBox2 = bboxIntersections[2] > tMax;
+  }
+
+  // If output device doesn't support the extended mode required
+  // we have to do it here
+  needExtend = !out->axialShadedSupportExtend(state, shading);
+
+  while (i < axialMaxSplits) {
+
+    // bisect until color difference is small enough or we hit the
+    // bisection limit
+    j = next[i];
+    while (j > i + 1) {
+      if (ta[j] < 0) {
+       tt = t0;
+      } else if (ta[j] > 1) {
+       tt = t1;
+      } else {
+       tt = t0 + (t1 - t0) * ta[j];
+      }
+      shading->getColor(tt, &color1);
+      if (isSameGfxColor(color1, color0, nComps, axialColorDelta)) {
+         // in these two if what we guarantee is that if we are skipping lots of 
+         // positions because the colors are the same, we still create a region
+         // with vertexs passing by bboxIntersections[1] and bboxIntersections[2]
+         // otherwise we can have empty regions that should really be painted 
+         // like happened in bug 19896
+         // What we do to ensure that we pass a line through this points
+         // is making sure use the exact bboxIntersections[] value as one of the used ta[] values
+         if (!doneBBox1 && ta[i] < bboxIntersections[1] && ta[j] > bboxIntersections[1]) {
+           int teoricalj = (int) ((bboxIntersections[1] - tMin) * axialMaxSplits / (tMax - tMin));
+           if (teoricalj <= i) teoricalj = i + 1;
+           if (teoricalj < j) {
+             next[i] = teoricalj;
+             next[teoricalj] = j;
+           }
+           else {
+             teoricalj = j;
+           }
+           ta[teoricalj] = bboxIntersections[1];
+           j = teoricalj;
+           doneBBox1 = true;
+         }
+         if (!doneBBox2 && ta[i] < bboxIntersections[2] && ta[j] > bboxIntersections[2]) {
+           int teoricalj = (int) ((bboxIntersections[2] - tMin) * axialMaxSplits / (tMax - tMin));
+           if (teoricalj <= i) teoricalj = i + 1;
+           if (teoricalj < j) {
+             next[i] = teoricalj;
+             next[teoricalj] = j;
+           }
+           else {
+             teoricalj = j;
+           }
+           ta[teoricalj] = bboxIntersections[2];
+           j = teoricalj;
+           doneBBox2 = true;
+         }
+         break;
+      }
+      k = (i + j) / 2;
+      ta[k] = 0.5 * (ta[i] + ta[j]);
+      next[i] = k;
+      next[k] = j;
+      j = k;
+    }
+
+    // use the average of the colors of the two sides of the region
+    for (k = 0; k < nComps; ++k) {
+      color0.c[k] = (color0.c[k] + color1.c[k]) / 2;
+    }
+
+    // compute the coordinates of the point on the t axis; then
+    // compute the intersection of the perpendicular line with the
+    // bounding box
+    tx = x0 + ta[j] * dx;
+    ty = y0 + ta[j] * dy;
+    if (dxZero && dyZero) {
+      sMin = sMax = 0;
+    } else if (dxZero) {
+      sMin = (xMin - tx) / -dy;
+      sMax = (xMax - tx) / -dy;
+      if (sMin > sMax) { tmp = sMin; sMin = sMax; sMax = tmp; }
+    } else if (dyZero) {
+      sMin = (yMin - ty) / dx;
+      sMax = (yMax - ty) / dx;
+      if (sMin > sMax) { tmp = sMin; sMin = sMax; sMax = tmp; }
+    } else {
+      s[0] = (yMin - ty) / dx;
+      s[1] = (yMax - ty) / dx;
+      s[2] = (xMin - tx) / -dy;
+      s[3] = (xMax - tx) / -dy;
+      bubbleSort(s);
+      sMin = s[1];
+      sMax = s[2];
+    }
+    ux1 = tx - sMin * dy;
+    uy1 = ty + sMin * dx;
+    vx1 = tx - sMax * dy;
+    vy1 = ty + sMax * dx;
+
+    // set the color
+    state->setFillColor(&color0);
+    if (out->useFillColorStop())
+      out->updateFillColorStop(state, (ta[j] - tMin)/(tMax - tMin));
+    else
+      out->updateFillColor(state);
+
+    if (needExtend) {
+      // fill the region
+      state->moveTo(ux0, uy0);
+      state->lineTo(vx0, vy0);
+      state->lineTo(vx1, vy1);
+      state->lineTo(ux1, uy1);
+      state->closePath();
+    }
+
+    if (!out->useFillColorStop()) {
+      out->fill(state);
+      state->clearPath();
+    }
+
+    // set up for next region
+    ux0 = ux1;
+    uy0 = uy1;
+    vx0 = vx1;
+    vy0 = vy1;
+    color0 = color1;
+    i = next[i];
+  }
+
+  if (out->useFillColorStop()) {
+    if (!needExtend) {
+      state->moveTo(xMin, yMin);
+      state->lineTo(xMin, yMax);
+      state->lineTo(xMax, yMax);
+      state->lineTo(xMax, yMin);
+      state->closePath();
+    }
+    out->fill(state);
+    state->clearPath();
+  }
+}
+
+static inline void getShadingColorRadialHelper(double t0, double t1, double t, GfxRadialShading *shading, GfxColor *color)
+{
+  if (t0 < t1) {
+    if (t < t0) {
+      shading->getColor(t0, color);
+    } else if (t > t1) {
+      shading->getColor(t1, color);
+    } else {
+      shading->getColor(t, color);
+    }
+  } else {
+    if (t > t0) {
+      shading->getColor(t0, color);
+    } else if (t < t1) {
+      shading->getColor(t1, color);
+    } else {
+      shading->getColor(t, color);
+    }
+  }
+}
+
+void Gfx::doRadialShFill(GfxRadialShading *shading) {
+  double xMin, yMin, xMax, yMax;
+  double x0, y0, r0, x1, y1, r1, t0, t1;
+  int nComps;
+  GfxColor colorA, colorB;
+  double xa, ya, xb, yb, ra, rb;
+  double ta, tb, sa, sb;
+  double sz, xz, yz, sMin, sMax;
+  GBool enclosed;
+  int ia, ib, k, n;
+  double *ctm;
+  double theta, alpha, angle, t;
+  GBool needExtend = gTrue;
+
+  // get the shading info
+  shading->getCoords(&x0, &y0, &r0, &x1, &y1, &r1);
+  t0 = shading->getDomain0();
+  t1 = shading->getDomain1();
+  nComps = shading->getColorSpace()->getNComps();
+
+  // Compute the point at which r(s) = 0; check for the enclosed
+  // circles case; and compute the angles for the tangent lines.
+  if (x0 == x1 && y0 == y1) {
+    enclosed = gTrue;
+    theta = 0; // make gcc happy
+    sz = 0; // make gcc happy
+  } else if (r0 == r1) {
+    enclosed = gFalse;
+    theta = 0;
+    sz = 0; // make gcc happy
+  } else {
+    sz = (r1 > r0) ? -r0 / (r1 - r0) : -r1 / (r0 - r1);
+    xz = x0 + sz * (x1 - x0);
+    yz = y0 + sz * (y1 - y0);
+    enclosed = (xz - x0) * (xz - x0) + (yz - y0) * (yz - y0) <= r0 * r0;
+    theta = asin(r0 / sqrt((x0 - xz) * (x0 - xz) + (y0 - yz) * (y0 - yz)));
+    if (r0 > r1) {
+      theta = -theta;
+    }
+  }
+  if (enclosed) {
+    alpha = 0;
+  } else {
+    alpha = atan2(y1 - y0, x1 - x0);
+  }
+
+  // compute the (possibly extended) s range
+  state->getUserClipBBox(&xMin, &yMin, &xMax, &yMax);
+  if (enclosed) {
+    sMin = 0;
+    sMax = 1;
+  } else {
+    sMin = 1;
+    sMax = 0;
+    // solve for x(s) + r(s) = xMin
+    if ((x1 + r1) - (x0 + r0) != 0) {
+      sa = (xMin - (x0 + r0)) / ((x1 + r1) - (x0 + r0));
+      if (sa < sMin) {
+       sMin = sa;
+      } else if (sa > sMax) {
+       sMax = sa;
+      }
+    }
+    // solve for x(s) - r(s) = xMax
+    if ((x1 - r1) - (x0 - r0) != 0) {
+      sa = (xMax - (x0 - r0)) / ((x1 - r1) - (x0 - r0));
+      if (sa < sMin) {
+       sMin = sa;
+      } else if (sa > sMax) {
+       sMax = sa;
+      }
+    }
+    // solve for y(s) + r(s) = yMin
+    if ((y1 + r1) - (y0 + r0) != 0) {
+      sa = (yMin - (y0 + r0)) / ((y1 + r1) - (y0 + r0));
+      if (sa < sMin) {
+       sMin = sa;
+      } else if (sa > sMax) {
+       sMax = sa;
+      }
+    }
+    // solve for y(s) - r(s) = yMax
+    if ((y1 - r1) - (y0 - r0) != 0) {
+      sa = (yMax - (y0 - r0)) / ((y1 - r1) - (y0 - r0));
+      if (sa < sMin) {
+       sMin = sa;
+      } else if (sa > sMax) {
+       sMax = sa;
+      }
+    }
+    // check against sz
+    if (r0 < r1) {
+      if (sMin < sz) {
+       sMin = sz;
+      }
+    } else if (r0 > r1) {
+      if (sMax > sz) {
+       sMax = sz;
+      }
+    }
+    // check the 'extend' flags
+    if (!shading->getExtend0() && sMin < 0) {
+      sMin = 0;
+    }
+    if (!shading->getExtend1() && sMax > 1) {
+      sMax = 1;
+    }
+  }
+
+  if (out->useShadedFills( shading->getType() ) &&
+      out->radialShadedFill(state, shading, sMin, sMax)) {
+    return;
+  }
+
+  // compute the number of steps into which circles must be divided to
+  // achieve a curve flatness of 0.1 pixel in device space for the
+  // largest circle (note that "device space" is 72 dpi when generating
+  // PostScript, hence the relatively small 0.1 pixel accuracy)
+  ctm = state->getCTM();
+  t = fabs(ctm[0]);
+  if (fabs(ctm[1]) > t) {
+    t = fabs(ctm[1]);
+  }
+  if (fabs(ctm[2]) > t) {
+    t = fabs(ctm[2]);
+  }
+  if (fabs(ctm[3]) > t) {
+    t = fabs(ctm[3]);
+  }
+  if (r0 > r1) {
+    t *= r0;
+  } else {
+    t *= r1;
+  }
+  if (t < 1) {
+    n = 3;
+  } else {
+    n = (int)(M_PI / acos(1 - 0.1 / t));
+    if (n < 3) {
+      n = 3;
+    } else if (n > 200) {
+      n = 200;
+    }
+  }
+
+  // setup for the start circle
+  ia = 0;
+  sa = sMin;
+  ta = t0 + sa * (t1 - t0);
+  xa = x0 + sa * (x1 - x0);
+  ya = y0 + sa * (y1 - y0);
+  ra = r0 + sa * (r1 - r0);
+  getShadingColorRadialHelper(t0, t1, ta, shading, &colorA);
+
+  needExtend = !out->radialShadedSupportExtend(state, shading);
+
+  // fill the circles
+  while (ia < radialMaxSplits) {
+
+    // go as far along the t axis (toward t1) as we can, such that the
+    // color difference is within the tolerance (radialColorDelta) --
+    // this uses bisection (between the current value, t, and t1),
+    // limited to radialMaxSplits points along the t axis; require at
+    // least one split to avoid problems when the innermost and
+    // outermost colors are the same
+    ib = radialMaxSplits;
+    sb = sMax;
+    tb = t0 + sb * (t1 - t0);
+    getShadingColorRadialHelper(t0, t1, tb, shading, &colorB);
+    while (ib - ia > 1) {
+      if (isSameGfxColor(colorB, colorA, nComps, radialColorDelta)) {
+        // The shading is not necessarily lineal so having two points with the
+        // same color does not mean all the areas in between have the same color too
+        int ic = ia + 1;
+        for (; ic <= ib; ic++) {
+          GfxColor colorC;
+          const double sc = sMin + ((double)ic / (double)radialMaxSplits) * (sMax - sMin);
+          const double tc = t0 + sc * (t1 - t0);
+          getShadingColorRadialHelper(t0, t1, tc, shading, &colorC);
+          if (!isSameGfxColor(colorC, colorA, nComps, radialColorDelta)) {
+            break;
+          }
+        }
+        ib = (ic > ia + 1) ? ic - 1 : ia + 1;
+        sb = sMin + ((double)ib / (double)radialMaxSplits) * (sMax - sMin);
+        tb = t0 + sb * (t1 - t0);
+        getShadingColorRadialHelper(t0, t1, tb, shading, &colorB);
+        break;
+      }
+      ib = (ia + ib) / 2;
+      sb = sMin + ((double)ib / (double)radialMaxSplits) * (sMax - sMin);
+      tb = t0 + sb * (t1 - t0);
+      getShadingColorRadialHelper(t0, t1, tb, shading, &colorB);
+    }
+
+    // compute center and radius of the circle
+    xb = x0 + sb * (x1 - x0);
+    yb = y0 + sb * (y1 - y0);
+    rb = r0 + sb * (r1 - r0);
+
+    // use the average of the colors at the two circles
+    for (k = 0; k < nComps; ++k) {
+      colorA.c[k] = (colorA.c[k] + colorB.c[k]) / 2;
+    }
+    state->setFillColor(&colorA);
+    if (out->useFillColorStop())
+      out->updateFillColorStop(state, (sa - sMin)/(sMax - sMin));
+    else
+      out->updateFillColor(state);
+
+    if (needExtend) {
+      if (enclosed) {
+        // construct path for first circle (counterclockwise)
+        state->moveTo(xa + ra, ya);
+        for (k = 1; k < n; ++k) {
+         angle = ((double)k / (double)n) * 2 * M_PI;
+         state->lineTo(xa + ra * cos(angle), ya + ra * sin(angle));
+        }
+        state->closePath();
+
+        // construct and append path for second circle (clockwise)
+        state->moveTo(xb + rb, yb);
+        for (k = 1; k < n; ++k) {
+         angle = -((double)k / (double)n) * 2 * M_PI;
+         state->lineTo(xb + rb * cos(angle), yb + rb * sin(angle));
+        }
+        state->closePath();
+      } else {
+        // construct the first subpath (clockwise)
+        state->moveTo(xa + ra * cos(alpha + theta + 0.5 * M_PI),
+                     ya + ra * sin(alpha + theta + 0.5 * M_PI));
+        for (k = 0; k < n; ++k) {
+         angle = alpha + theta + 0.5 * M_PI
+                 - ((double)k / (double)n) * (2 * theta + M_PI);
+         state->lineTo(xb + rb * cos(angle), yb + rb * sin(angle));
+        }
+       for (k = 0; k < n; ++k) {
+         angle = alpha - theta - 0.5 * M_PI
+                 + ((double)k / (double)n) * (2 * theta - M_PI);
+         state->lineTo(xa + ra * cos(angle), ya + ra * sin(angle));
+       }
+       state->closePath();
+
+        // construct the second subpath (counterclockwise)
+       state->moveTo(xa + ra * cos(alpha + theta + 0.5 * M_PI),
+                     ya + ra * sin(alpha + theta + 0.5 * M_PI));
+       for (k = 0; k < n; ++k) {
+         angle = alpha + theta + 0.5 * M_PI
+                 + ((double)k / (double)n) * (-2 * theta + M_PI);
+         state->lineTo(xb + rb * cos(angle), yb + rb * sin(angle));
+       }
+       for (k = 0; k < n; ++k) {
+         angle = alpha - theta - 0.5 * M_PI
+                 + ((double)k / (double)n) * (2 * theta + M_PI);
+         state->lineTo(xa + ra * cos(angle), ya + ra * sin(angle));
+       }
+       state->closePath();
+      }
+    }
+
+    if (!out->useFillColorStop()) {
+      // fill the path
+      out->fill(state);
+      state->clearPath();
+    }
+
+    // step to the next value of t
+    ia = ib;
+    sa = sb;
+    ta = tb;
+    xa = xb;
+    ya = yb;
+    ra = rb;
+    colorA = colorB;
+  }
+
+  if (out->useFillColorStop()) {
+    // make sure we add stop color when sb = sMax
+    state->setFillColor(&colorA);
+    out->updateFillColorStop(state, (sb - sMin)/(sMax - sMin));
+
+    // fill the path
+    state->moveTo(xMin, yMin);
+    state->lineTo(xMin, yMax);
+    state->lineTo(xMax, yMax);
+    state->lineTo(xMax, yMin);
+    state->closePath();
+
+    out->fill(state);
+    state->clearPath();
+  }
+
+  if (!needExtend)
+    return;
+
+  if (enclosed) {
+    // extend the smaller circle
+    if ((shading->getExtend0() && r0 <= r1) ||
+       (shading->getExtend1() && r1 < r0)) {
+      if (r0 <= r1) {
+       ta = t0;
+       ra = r0;
+       xa = x0;
+       ya = y0;
+      } else {
+       ta = t1;
+       ra = r1;
+       xa = x1;
+       ya = y1;
+      }
+      shading->getColor(ta, &colorA);
+      state->setFillColor(&colorA);
+      out->updateFillColor(state);
+      state->moveTo(xa + ra, ya);
+      for (k = 1; k < n; ++k) {
+       angle = ((double)k / (double)n) * 2 * M_PI;
+       state->lineTo(xa + ra * cos(angle), ya + ra * sin(angle));
+      }
+      state->closePath();
+      out->fill(state);
+      state->clearPath();
+    }
+
+    // extend the larger circle
+    if ((shading->getExtend0() && r0 > r1) ||
+       (shading->getExtend1() && r1 >= r0)) {
+      if (r0 > r1) {
+       ta = t0;
+       ra = r0;
+       xa = x0;
+       ya = y0;
+      } else {
+       ta = t1;
+       ra = r1;
+       xa = x1;
+       ya = y1;
+      }
+      shading->getColor(ta, &colorA);
+      state->setFillColor(&colorA);
+      out->updateFillColor(state);
+      state->moveTo(xMin, yMin);
+      state->lineTo(xMin, yMax);
+      state->lineTo(xMax, yMax);
+      state->lineTo(xMax, yMin);
+      state->closePath();
+      state->moveTo(xa + ra, ya);
+      for (k = 1; k < n; ++k) {
+       angle = ((double)k / (double)n) * 2 * M_PI;
+       state->lineTo(xa + ra * cos(angle), ya + ra * sin(angle));
+      }
+      state->closePath();
+      out->fill(state);
+      state->clearPath();
+    }
+  }
+}
+
+void Gfx::doGouraudTriangleShFill(GfxGouraudTriangleShading *shading) {
+  double x0, y0, x1, y1, x2, y2;
+  int i;
+
+  if (out->useShadedFills( shading->getType())) {
+    if (out->gouraudTriangleShadedFill( state, shading))
+      return;
+  }
+
+  // preallocate a path (speed improvements)
+  state->moveTo(0., 0.);
+  state->lineTo(1., 0.);
+  state->lineTo(0., 1.);
+  state->closePath();
+
+  GfxState::ReusablePathIterator *reusablePath = state->getReusablePath();
+
+  if (shading->isParameterized()) {
+    // work with parameterized values:
+    double color0, color1, color2;
+    // a relative threshold:
+    const double refineColorThreshold = gouraudParameterizedColorDelta *
+                                        (shading->getParameterDomainMax() - shading->getParameterDomainMin());
+    for (i = 0; i < shading->getNTriangles(); ++i) {
+      shading->getTriangle(i, &x0, &y0, &color0,
+                              &x1, &y1, &color1,
+                              &x2, &y2, &color2);
+      gouraudFillTriangle(x0, y0, color0, x1, y1, color1, x2, y2, color2, refineColorThreshold, 0, shading, reusablePath);
+    }
+
+  } else {
+    // this always produces output -- even for parameterized ranges.
+    // But it ignores the parameterized color map (the function). 
+    //
+    // Note that using this code in for parameterized shadings might be
+    // correct in circumstances (namely if the function is linear in the actual
+    // triangle), but in general, it will simply be wrong.
+    GfxColor color0, color1, color2;
+    for (i = 0; i < shading->getNTriangles(); ++i) {
+      shading->getTriangle(i, &x0, &y0, &color0,
+                              &x1, &y1, &color1,
+                              &x2, &y2, &color2);
+      gouraudFillTriangle(x0, y0, &color0, x1, y1, &color1, x2, y2, &color2, shading->getColorSpace()->getNComps(), 0, reusablePath);
+    }
+  }
+
+  delete reusablePath;
+}
+
+void Gfx::gouraudFillTriangle(double x0, double y0, GfxColor *color0,
+                             double x1, double y1, GfxColor *color1,
+                             double x2, double y2, GfxColor *color2,
+                             int nComps, int depth, GfxState::ReusablePathIterator *path) {
+  double x01, y01, x12, y12, x20, y20;
+  GfxColor color01, color12, color20;
+  int i;
+
+  for (i = 0; i < nComps; ++i) {
+    if (abs(color0->c[i] - color1->c[i]) > gouraudColorDelta ||
+       abs(color1->c[i] - color2->c[i]) > gouraudColorDelta) {
+      break;
+    }
+  }
+  if (i == nComps || depth == gouraudMaxDepth) {
+    state->setFillColor(color0);
+    out->updateFillColor(state);
+
+    path->reset();                         assert(!path->isEnd());
+    path->setCoord(x0,y0);  path->next();  assert(!path->isEnd());
+    path->setCoord(x1,y1);  path->next();  assert(!path->isEnd());
+    path->setCoord(x2,y2);  path->next();  assert(!path->isEnd());
+    path->setCoord(x0,y0);  path->next();  assert( path->isEnd());
+    out->fill(state);
+
+  } else {
+    x01 = 0.5 * (x0 + x1);
+    y01 = 0.5 * (y0 + y1);
+    x12 = 0.5 * (x1 + x2);
+    y12 = 0.5 * (y1 + y2);
+    x20 = 0.5 * (x2 + x0);
+    y20 = 0.5 * (y2 + y0);
+    for (i = 0; i < nComps; ++i) {
+      color01.c[i] = (color0->c[i] + color1->c[i]) / 2;
+      color12.c[i] = (color1->c[i] + color2->c[i]) / 2;
+      color20.c[i] = (color2->c[i] + color0->c[i]) / 2;
+    }
+    gouraudFillTriangle(x0, y0, color0, x01, y01, &color01,
+                       x20, y20, &color20, nComps, depth + 1, path);
+    gouraudFillTriangle(x01, y01, &color01, x1, y1, color1,
+                       x12, y12, &color12, nComps, depth + 1, path);
+    gouraudFillTriangle(x01, y01, &color01, x12, y12, &color12,
+                       x20, y20, &color20, nComps, depth + 1, path);
+    gouraudFillTriangle(x20, y20, &color20, x12, y12, &color12,
+                       x2, y2, color2, nComps, depth + 1, path);
+  }
+}
+void Gfx::gouraudFillTriangle(double x0, double y0, double color0,
+                              double x1, double y1, double color1,
+                              double x2, double y2, double color2,
+                              double refineColorThreshold, int depth, GfxGouraudTriangleShading *shading, GfxState::ReusablePathIterator *path) {
+  const double meanColor = (color0 + color1 + color2) / 3;
+
+  const bool isFineEnough = 
+       fabs(color0 - meanColor) < refineColorThreshold &&
+       fabs(color1 - meanColor) < refineColorThreshold &&
+       fabs(color2 - meanColor) < refineColorThreshold;
+
+  if (isFineEnough || depth == gouraudMaxDepth) {
+    GfxColor color;
+
+    shading->getParameterizedColor(meanColor, &color);
+    state->setFillColor(&color);
+    out->updateFillColor(state);
+
+    path->reset();                         assert(!path->isEnd());
+    path->setCoord(x0,y0);  path->next();  assert(!path->isEnd());
+    path->setCoord(x1,y1);  path->next();  assert(!path->isEnd());
+    path->setCoord(x2,y2);  path->next();  assert(!path->isEnd());
+    path->setCoord(x0,y0);  path->next();  assert( path->isEnd());
+    out->fill(state);
+
+  } else {
+    const double x01 = 0.5 * (x0 + x1);
+    const double y01 = 0.5 * (y0 + y1);
+    const double x12 = 0.5 * (x1 + x2);
+    const double y12 = 0.5 * (y1 + y2);
+    const double x20 = 0.5 * (x2 + x0);
+    const double y20 = 0.5 * (y2 + y0);
+    const double color01 = (color0 + color1) / 2.;
+    const double color12 = (color1 + color2) / 2.; 
+    const double color20 = (color2 + color0) / 2.;
+    ++depth;
+    gouraudFillTriangle(x0, y0, color0, 
+                        x01, y01, color01,
+                        x20, y20, color20, 
+                        refineColorThreshold, depth, shading, path);
+    gouraudFillTriangle(x01, y01, color01, 
+                        x1, y1, color1,
+                        x12, y12, color12, 
+                        refineColorThreshold, depth, shading, path);
+    gouraudFillTriangle(x01, y01, color01, 
+                        x12, y12, color12,
+                        x20, y20, color20, 
+                        refineColorThreshold, depth, shading, path);
+    gouraudFillTriangle(x20, y20, color20, 
+                        x12, y12, color12,
+                        x2, y2, color2, 
+                        refineColorThreshold, depth, shading, path);
+  }
+}
+
+void Gfx::doPatchMeshShFill(GfxPatchMeshShading *shading) {
+  int start, i;
+
+  if (out->useShadedFills( shading->getType())) {
+    if (out->patchMeshShadedFill( state, shading))
+      return;
+  }
+
+  if (shading->getNPatches() > 128) {
+    start = 3;
+  } else if (shading->getNPatches() > 64) {
+    start = 2;
+  } else if (shading->getNPatches() > 16) {
+    start = 1;
+  } else {
+    start = 0;
+  }
+  /*
+   * Parameterized shadings take one parameter [t_0,t_e]
+   * and map it into the color space.
+   *
+   * Consequently, all color values are stored as doubles.
+   *
+   * These color values are interpreted as parameters for parameterized
+   * shadings and as colorspace entities otherwise.
+   *
+   * The only difference is that color space entities are stored into
+   * DOUBLE arrays, not into arrays of type GfxColorComp.
+   */
+  const int colorComps = shading->getColorSpace()->getNComps();
+  double refineColorThreshold;
+  if( shading->isParameterized() ) {
+         refineColorThreshold = gouraudParameterizedColorDelta *
+                 (shading->getParameterDomainMax() - shading->getParameterDomainMin());
+
+  } else {
+         refineColorThreshold = patchColorDelta;
+  }
+
+  for (i = 0; i < shading->getNPatches(); ++i) {
+    fillPatch(shading->getPatch(i),
+             colorComps, 
+             shading->isParameterized() ? 1 : colorComps,
+             refineColorThreshold,
+             start,
+             shading);
+  }
+}
+
+
+void Gfx::fillPatch(GfxPatch *patch, int colorComps, int patchColorComps, double refineColorThreshold, int depth, GfxPatchMeshShading *shading) {
+  GfxPatch patch00, patch01, patch10, patch11;
+  double xx[4][8], yy[4][8];
+  double xxm, yym;
+  int i;
+
+  for (i = 0; i < patchColorComps; ++i) {
+    // these comparisons are done in double arithmetics.
+    //
+    // For non-parameterized shadings, they are done in color space
+    // components.
+    if (fabs(patch->color[0][0].c[i] - patch->color[0][1].c[i]) > refineColorThreshold ||
+        fabs(patch->color[0][1].c[i] - patch->color[1][1].c[i]) > refineColorThreshold ||
+        fabs(patch->color[1][1].c[i] - patch->color[1][0].c[i]) > refineColorThreshold ||
+        fabs(patch->color[1][0].c[i] - patch->color[0][0].c[i]) > refineColorThreshold) {
+      break;
+    }
+  }
+  if (i == patchColorComps || depth == patchMaxDepth) {
+    GfxColor flatColor;
+    if( shading->isParameterized() ) {
+      shading->getParameterizedColor( patch->color[0][0].c[0], &flatColor );
+    } else {
+      for( i = 0; i<colorComps; ++i ) {
+        // simply cast to the desired type; that's all what is needed.
+        flatColor.c[i] = GfxColorComp(patch->color[0][0].c[i]);
+      }
+    }
+    state->setFillColor(&flatColor);
+    out->updateFillColor(state);
+    state->moveTo(patch->x[0][0], patch->y[0][0]);
+    state->curveTo(patch->x[0][1], patch->y[0][1],
+                  patch->x[0][2], patch->y[0][2],
+                  patch->x[0][3], patch->y[0][3]);
+    state->curveTo(patch->x[1][3], patch->y[1][3],
+                  patch->x[2][3], patch->y[2][3],
+                  patch->x[3][3], patch->y[3][3]);
+    state->curveTo(patch->x[3][2], patch->y[3][2],
+                  patch->x[3][1], patch->y[3][1],
+                  patch->x[3][0], patch->y[3][0]);
+    state->curveTo(patch->x[2][0], patch->y[2][0],
+                  patch->x[1][0], patch->y[1][0],
+                  patch->x[0][0], patch->y[0][0]);
+    state->closePath();
+    out->fill(state);
+    state->clearPath();
+  } else {
+    for (i = 0; i < 4; ++i) {
+      xx[i][0] = patch->x[i][0];
+      yy[i][0] = patch->y[i][0];
+      xx[i][1] = 0.5 * (patch->x[i][0] + patch->x[i][1]);
+      yy[i][1] = 0.5 * (patch->y[i][0] + patch->y[i][1]);
+      xxm = 0.5 * (patch->x[i][1] + patch->x[i][2]);
+      yym = 0.5 * (patch->y[i][1] + patch->y[i][2]);
+      xx[i][6] = 0.5 * (patch->x[i][2] + patch->x[i][3]);
+      yy[i][6] = 0.5 * (patch->y[i][2] + patch->y[i][3]);
+      xx[i][2] = 0.5 * (xx[i][1] + xxm);
+      yy[i][2] = 0.5 * (yy[i][1] + yym);
+      xx[i][5] = 0.5 * (xxm + xx[i][6]);
+      yy[i][5] = 0.5 * (yym + yy[i][6]);
+      xx[i][3] = xx[i][4] = 0.5 * (xx[i][2] + xx[i][5]);
+      yy[i][3] = yy[i][4] = 0.5 * (yy[i][2] + yy[i][5]);
+      xx[i][7] = patch->x[i][3];
+      yy[i][7] = patch->y[i][3];
+    }
+    for (i = 0; i < 4; ++i) {
+      patch00.x[0][i] = xx[0][i];
+      patch00.y[0][i] = yy[0][i];
+      patch00.x[1][i] = 0.5 * (xx[0][i] + xx[1][i]);
+      patch00.y[1][i] = 0.5 * (yy[0][i] + yy[1][i]);
+      xxm = 0.5 * (xx[1][i] + xx[2][i]);
+      yym = 0.5 * (yy[1][i] + yy[2][i]);
+      patch10.x[2][i] = 0.5 * (xx[2][i] + xx[3][i]);
+      patch10.y[2][i] = 0.5 * (yy[2][i] + yy[3][i]);
+      patch00.x[2][i] = 0.5 * (patch00.x[1][i] + xxm);
+      patch00.y[2][i] = 0.5 * (patch00.y[1][i] + yym);
+      patch10.x[1][i] = 0.5 * (xxm + patch10.x[2][i]);
+      patch10.y[1][i] = 0.5 * (yym + patch10.y[2][i]);
+      patch00.x[3][i] = 0.5 * (patch00.x[2][i] + patch10.x[1][i]);
+      patch00.y[3][i] = 0.5 * (patch00.y[2][i] + patch10.y[1][i]);
+      patch10.x[0][i] = patch00.x[3][i];
+      patch10.y[0][i] = patch00.y[3][i];
+      patch10.x[3][i] = xx[3][i];
+      patch10.y[3][i] = yy[3][i];
+    }
+    for (i = 4; i < 8; ++i) {
+      patch01.x[0][i-4] = xx[0][i];
+      patch01.y[0][i-4] = yy[0][i];
+      patch01.x[1][i-4] = 0.5 * (xx[0][i] + xx[1][i]);
+      patch01.y[1][i-4] = 0.5 * (yy[0][i] + yy[1][i]);
+      xxm = 0.5 * (xx[1][i] + xx[2][i]);
+      yym = 0.5 * (yy[1][i] + yy[2][i]);
+      patch11.x[2][i-4] = 0.5 * (xx[2][i] + xx[3][i]);
+      patch11.y[2][i-4] = 0.5 * (yy[2][i] + yy[3][i]);
+      patch01.x[2][i-4] = 0.5 * (patch01.x[1][i-4] + xxm);
+      patch01.y[2][i-4] = 0.5 * (patch01.y[1][i-4] + yym);
+      patch11.x[1][i-4] = 0.5 * (xxm + patch11.x[2][i-4]);
+      patch11.y[1][i-4] = 0.5 * (yym + patch11.y[2][i-4]);
+      patch01.x[3][i-4] = 0.5 * (patch01.x[2][i-4] + patch11.x[1][i-4]);
+      patch01.y[3][i-4] = 0.5 * (patch01.y[2][i-4] + patch11.y[1][i-4]);
+      patch11.x[0][i-4] = patch01.x[3][i-4];
+      patch11.y[0][i-4] = patch01.y[3][i-4];
+      patch11.x[3][i-4] = xx[3][i];
+      patch11.y[3][i-4] = yy[3][i];
+    }
+    for (i = 0; i < patchColorComps; ++i) {
+      patch00.color[0][0].c[i] = patch->color[0][0].c[i];
+      patch00.color[0][1].c[i] = (patch->color[0][0].c[i] +
+                                 patch->color[0][1].c[i]) / 2;
+      patch01.color[0][0].c[i] = patch00.color[0][1].c[i];
+      patch01.color[0][1].c[i] = patch->color[0][1].c[i];
+      patch01.color[1][1].c[i] = (patch->color[0][1].c[i] +
+                                 patch->color[1][1].c[i]) / 2;
+      patch11.color[0][1].c[i] = patch01.color[1][1].c[i];
+      patch11.color[1][1].c[i] = patch->color[1][1].c[i];
+      patch11.color[1][0].c[i] = (patch->color[1][1].c[i] +
+                                 patch->color[1][0].c[i]) / 2;
+      patch10.color[1][1].c[i] = patch11.color[1][0].c[i];
+      patch10.color[1][0].c[i] = patch->color[1][0].c[i];
+      patch10.color[0][0].c[i] = (patch->color[1][0].c[i] +
+                                 patch->color[0][0].c[i]) / 2;
+      patch00.color[1][0].c[i] = patch10.color[0][0].c[i];
+      patch00.color[1][1].c[i] = (patch00.color[1][0].c[i] +
+                                 patch01.color[1][1].c[i]) / 2;
+      patch01.color[1][0].c[i] = patch00.color[1][1].c[i];
+      patch11.color[0][0].c[i] = patch00.color[1][1].c[i];
+      patch10.color[0][1].c[i] = patch00.color[1][1].c[i];
+    }
+    fillPatch(&patch00, colorComps, patchColorComps, refineColorThreshold, depth + 1, shading);
+    fillPatch(&patch10, colorComps, patchColorComps, refineColorThreshold, depth + 1, shading);
+    fillPatch(&patch01, colorComps, patchColorComps, refineColorThreshold, depth + 1, shading);
+    fillPatch(&patch11, colorComps, patchColorComps, refineColorThreshold, depth + 1, shading);
+  }
+}
+
+void Gfx::doEndPath() {
+  if (state->isCurPt() && clip != clipNone) {
+    state->clip();
+    if (clip == clipNormal) {
+      out->clip(state);
+    } else {
+      out->eoClip(state);
+    }
+  }
+  clip = clipNone;
+  state->clearPath();
+}
+
+//------------------------------------------------------------------------
+// path clipping operators
+//------------------------------------------------------------------------
+
+void Gfx::opClip(Object args[], int numArgs) {
+  clip = clipNormal;
+}
+
+void Gfx::opEOClip(Object args[], int numArgs) {
+  clip = clipEO;
+}
+
+//------------------------------------------------------------------------
+// text object operators
+//------------------------------------------------------------------------
+
+void Gfx::opBeginText(Object args[], int numArgs) {
+  out->beginTextObject(state);
+  state->setTextMat(1, 0, 0, 1, 0, 0);
+  state->textMoveTo(0, 0);
+  out->updateTextMat(state);
+  out->updateTextPos(state);
+  fontChanged = gTrue;
+  textClipBBoxEmpty = gTrue;
+}
+
+void Gfx::opEndText(Object args[], int numArgs) {
+  out->endTextObject(state);
+}
+
+//------------------------------------------------------------------------
+// text state operators
+//------------------------------------------------------------------------
+
+void Gfx::opSetCharSpacing(Object args[], int numArgs) {
+  state->setCharSpace(args[0].getNum());
+  out->updateCharSpace(state);
+}
+
+void Gfx::opSetFont(Object args[], int numArgs) {
+  GfxFont *font;
+
+  if (!(font = res->lookupFont(args[0].getName()))) {
+    // unsetting the font (drawing no text) is better than using the
+    // previous one and drawing random glyphs from it
+    state->setFont(NULL, args[1].getNum());
+    fontChanged = gTrue;
+    return;
+  }
+  if (printCommands) {
+    printf("  font: tag=%s name='%s' %g\n",
+          font->getTag()->getCString(),
+          font->getName() ? font->getName()->getCString() : "???",
+          args[1].getNum());
+    fflush(stdout);
+  }
+
+  font->incRefCnt();
+  state->setFont(font, args[1].getNum());
+  fontChanged = gTrue;
+}
+
+void Gfx::opSetTextLeading(Object args[], int numArgs) {
+  state->setLeading(args[0].getNum());
+}
+
+void Gfx::opSetTextRender(Object args[], int numArgs) {
+  state->setRender(args[0].getInt());
+  out->updateRender(state);
+}
+
+void Gfx::opSetTextRise(Object args[], int numArgs) {
+  state->setRise(args[0].getNum());
+  out->updateRise(state);
+}
+
+void Gfx::opSetWordSpacing(Object args[], int numArgs) {
+  state->setWordSpace(args[0].getNum());
+  out->updateWordSpace(state);
+}
+
+void Gfx::opSetHorizScaling(Object args[], int numArgs) {
+  state->setHorizScaling(args[0].getNum());
+  out->updateHorizScaling(state);
+  fontChanged = gTrue;
+}
+
+//------------------------------------------------------------------------
+// text positioning operators
+//------------------------------------------------------------------------
+
+void Gfx::opTextMove(Object args[], int numArgs) {
+  double tx, ty;
+
+  tx = state->getLineX() + args[0].getNum();
+  ty = state->getLineY() + args[1].getNum();
+  state->textMoveTo(tx, ty);
+  out->updateTextPos(state);
+}
+
+void Gfx::opTextMoveSet(Object args[], int numArgs) {
+  double tx, ty;
+
+  tx = state->getLineX() + args[0].getNum();
+  ty = args[1].getNum();
+  state->setLeading(-ty);
+  ty += state->getLineY();
+  state->textMoveTo(tx, ty);
+  out->updateTextPos(state);
+}
+
+void Gfx::opSetTextMatrix(Object args[], int numArgs) {
+  state->setTextMat(args[0].getNum(), args[1].getNum(),
+                   args[2].getNum(), args[3].getNum(),
+                   args[4].getNum(), args[5].getNum());
+  state->textMoveTo(0, 0);
+  out->updateTextMat(state);
+  out->updateTextPos(state);
+  fontChanged = gTrue;
+}
+
+void Gfx::opTextNextLine(Object args[], int numArgs) {
+  double tx, ty;
+
+  tx = state->getLineX();
+  ty = state->getLineY() - state->getLeading();
+  state->textMoveTo(tx, ty);
+  out->updateTextPos(state);
+}
+
+//------------------------------------------------------------------------
+// text string operators
+//------------------------------------------------------------------------
+
+void Gfx::opShowText(Object args[], int numArgs) {
+  if (!state->getFont()) {
+    error(errSyntaxError, getPos(), "No font in show");
+    return;
+  }
+  if (fontChanged) {
+    out->updateFont(state);
+    fontChanged = gFalse;
+  }
+  out->beginStringOp(state);
+  doShowText(args[0].getString());
+  out->endStringOp(state);
+  if (!ocState) {
+    doIncCharCount(args[0].getString());
+  }
+}
+
+void Gfx::opMoveShowText(Object args[], int numArgs) {
+  double tx, ty;
+
+  if (!state->getFont()) {
+    error(errSyntaxError, getPos(), "No font in move/show");
+    return;
+  }
+  if (fontChanged) {
+    out->updateFont(state);
+    fontChanged = gFalse;
+  }
+  tx = state->getLineX();
+  ty = state->getLineY() - state->getLeading();
+  state->textMoveTo(tx, ty);
+  out->updateTextPos(state);
+  out->beginStringOp(state);
+  doShowText(args[0].getString());
+  out->endStringOp(state);
+  if (!ocState) {
+    doIncCharCount(args[0].getString());
+  }
+}
+
+void Gfx::opMoveSetShowText(Object args[], int numArgs) {
+  double tx, ty;
+
+  if (!state->getFont()) {
+    error(errSyntaxError, getPos(), "No font in move/set/show");
+    return;
+  }
+  if (fontChanged) {
+    out->updateFont(state);
+    fontChanged = gFalse;
+  }
+  state->setWordSpace(args[0].getNum());
+  state->setCharSpace(args[1].getNum());
+  tx = state->getLineX();
+  ty = state->getLineY() - state->getLeading();
+  state->textMoveTo(tx, ty);
+  out->updateWordSpace(state);
+  out->updateCharSpace(state);
+  out->updateTextPos(state);
+  out->beginStringOp(state);
+  doShowText(args[2].getString());
+  out->endStringOp(state);
+  if (ocState) {
+    doIncCharCount(args[2].getString());
+  }
+}
+
+void Gfx::opShowSpaceText(Object args[], int numArgs) {
+  Array *a;
+  Object obj;
+  int wMode;
+  int i;
+
+  if (!state->getFont()) {
+    error(errSyntaxError, getPos(), "No font in show/space");
+    return;
+  }
+  if (fontChanged) {
+    out->updateFont(state);
+    fontChanged = gFalse;
+  }
+  out->beginStringOp(state);
+  wMode = state->getFont()->getWMode();
+  a = args[0].getArray();
+  for (i = 0; i < a->getLength(); ++i) {
+    a->get(i, &obj);
+    if (obj.isNum()) {
+      // this uses the absolute value of the font size to match
+      // Acrobat's behavior
+      if (wMode) {
+        state->textShift(0, -obj.getNum() * 0.001 *
+          state->getFontSize());
+      } else {
+        state->textShift(-obj.getNum() * 0.001 *
+          state->getFontSize() *
+          state->getHorizScaling(), 0);
+      }
+      out->updateTextShift(state, obj.getNum());
+    } else if (obj.isString()) {
+      doShowText(obj.getString());
+    } else {
+      error(errSyntaxError, getPos(),
+        "Element of show/space array must be number or string");
+    }
+    obj.free();
+  }
+  out->endStringOp(state);
+  if (!ocState) {
+    a = args[0].getArray();
+    for (i = 0; i < a->getLength(); ++i) {
+      a->get(i, &obj);
+      if (obj.isString()) {
+       doIncCharCount(obj.getString());
+      }
+      obj.free();
+    }
+  }
+}
+
+void Gfx::doShowText(GooString *s) {
+  GfxFont *font;
+  int wMode;
+  double riseX, riseY;
+  CharCode code;
+  Unicode *u = NULL;
+  double x, y, dx, dy, dx2, dy2, curX, curY, tdx, tdy, ddx, ddy;
+  double originX, originY, tOriginX, tOriginY;
+  double x0, y0, x1, y1;
+  double oldCTM[6], newCTM[6];
+  double *mat;
+  Object charProc;
+  Dict *resDict;
+  Parser *oldParser;
+  GfxState *savedState;
+  char *p;
+  int render;
+  GBool patternFill;
+  int len, n, uLen, nChars, nSpaces, i;
+
+  font = state->getFont();
+  wMode = font->getWMode();
+
+  if (out->useDrawChar()) {
+    out->beginString(state, s);
+  }
+
+  // if we're doing a pattern fill, set up clipping
+  render = state->getRender();
+  if (!(render & 1) &&
+      state->getFillColorSpace()->getMode() == csPattern) {
+    patternFill = gTrue;
+    saveState();
+    // disable fill, enable clipping, leave stroke unchanged
+    if ((render ^ (render >> 1)) & 1) {
+      render = 5;
+    } else {
+      render = 7;
+    }
+    state->setRender(render);
+    out->updateRender(state);
+  } else {
+    patternFill = gFalse;
+  }
+
+  state->textTransformDelta(0, state->getRise(), &riseX, &riseY);
+  x0 = state->getCurX() + riseX;
+  y0 = state->getCurY() + riseY;
+
+  // handle a Type 3 char
+  if (font->getType() == fontType3 && out->interpretType3Chars()) {
+    mat = state->getCTM();
+    for (i = 0; i < 6; ++i) {
+      oldCTM[i] = mat[i];
+    }
+    mat = state->getTextMat();
+    newCTM[0] = mat[0] * oldCTM[0] + mat[1] * oldCTM[2];
+    newCTM[1] = mat[0] * oldCTM[1] + mat[1] * oldCTM[3];
+    newCTM[2] = mat[2] * oldCTM[0] + mat[3] * oldCTM[2];
+    newCTM[3] = mat[2] * oldCTM[1] + mat[3] * oldCTM[3];
+    mat = font->getFontMatrix();
+    newCTM[0] = mat[0] * newCTM[0] + mat[1] * newCTM[2];
+    newCTM[1] = mat[0] * newCTM[1] + mat[1] * newCTM[3];
+    newCTM[2] = mat[2] * newCTM[0] + mat[3] * newCTM[2];
+    newCTM[3] = mat[2] * newCTM[1] + mat[3] * newCTM[3];
+    newCTM[0] *= state->getFontSize();
+    newCTM[1] *= state->getFontSize();
+    newCTM[2] *= state->getFontSize();
+    newCTM[3] *= state->getFontSize();
+    newCTM[0] *= state->getHorizScaling();
+    newCTM[2] *= state->getHorizScaling();
+    curX = state->getCurX();
+    curY = state->getCurY();
+    oldParser = parser;
+    p = s->getCString();
+    len = s->getLength();
+    while (len > 0) {
+      n = font->getNextChar(p, len, &code,
+                           &u, &uLen,
+                           &dx, &dy, &originX, &originY);
+      dx = dx * state->getFontSize() + state->getCharSpace();
+      if (n == 1 && *p == ' ') {
+       dx += state->getWordSpace();
+      }
+      dx *= state->getHorizScaling();
+      dy *= state->getFontSize();
+      state->textTransformDelta(dx, dy, &tdx, &tdy);
+      state->transform(curX + riseX, curY + riseY, &x, &y);
+      savedState = saveStateStack();
+      state->setCTM(newCTM[0], newCTM[1], newCTM[2], newCTM[3], x, y);
+      //~ the CTM concat values here are wrong (but never used)
+      out->updateCTM(state, 1, 0, 0, 1, 0, 0);
+      state->transformDelta(dx, dy, &ddx, &ddy);
+      if (!out->beginType3Char(state, curX + riseX, curY + riseY, ddx, ddy,
+                              code, u, uLen)) {
+       ((Gfx8BitFont *)font)->getCharProc(code, &charProc);
+       if ((resDict = ((Gfx8BitFont *)font)->getResources())) {
+         pushResources(resDict);
+       }
+       if (charProc.isStream()) {
+         display(&charProc, gFalse);
+       } else {
+         error(errSyntaxError, getPos(), "Missing or bad Type3 CharProc entry");
+       }
+       out->endType3Char(state);
+       if (resDict) {
+         popResources();
+       }
+       charProc.free();
+      }
+      restoreStateStack(savedState);
+      // GfxState::restore() does *not* restore the current position,
+      // so we deal with it here using (curX, curY) and (lineX, lineY)
+      curX += tdx;
+      curY += tdy;
+      state->moveTo(curX, curY);
+      p += n;
+      len -= n;
+    }
+    parser = oldParser;
+
+  } else if (out->useDrawChar()) {
+    p = s->getCString();
+    len = s->getLength();
+    while (len > 0) {
+      n = font->getNextChar(p, len, &code,
+                           &u, &uLen,
+                           &dx, &dy, &originX, &originY);
+      if (wMode) {
+       dx *= state->getFontSize();
+       dy = dy * state->getFontSize() + state->getCharSpace();
+       if (n == 1 && *p == ' ') {
+         dy += state->getWordSpace();
+       }
+      } else {
+       dx = dx * state->getFontSize() + state->getCharSpace();
+       if (n == 1 && *p == ' ') {
+         dx += state->getWordSpace();
+       }
+       dx *= state->getHorizScaling();
+       dy *= state->getFontSize();
+      }
+      state->textTransformDelta(dx, dy, &tdx, &tdy);
+      originX *= state->getFontSize();
+      originY *= state->getFontSize();
+      state->textTransformDelta(originX, originY, &tOriginX, &tOriginY);
+      if (ocState)
+        out->drawChar(state, state->getCurX() + riseX, state->getCurY() + riseY,
+                     tdx, tdy, tOriginX, tOriginY, code, n, u, uLen);
+      state->shift(tdx, tdy);
+      p += n;
+      len -= n;
+    }
+  } else {
+    dx = dy = 0;
+    p = s->getCString();
+    len = s->getLength();
+    nChars = nSpaces = 0;
+    while (len > 0) {
+      n = font->getNextChar(p, len, &code,
+                           &u, &uLen,
+                           &dx2, &dy2, &originX, &originY);
+      dx += dx2;
+      dy += dy2;
+      if (n == 1 && *p == ' ') {
+       ++nSpaces;
+      }
+      ++nChars;
+      p += n;
+      len -= n;
+    }
+    if (wMode) {
+      dx *= state->getFontSize();
+      dy = dy * state->getFontSize()
+          + nChars * state->getCharSpace()
+          + nSpaces * state->getWordSpace();
+    } else {
+      dx = dx * state->getFontSize()
+          + nChars * state->getCharSpace()
+          + nSpaces * state->getWordSpace();
+      dx *= state->getHorizScaling();
+      dy *= state->getFontSize();
+    }
+    state->textTransformDelta(dx, dy, &tdx, &tdy);
+    if (ocState)
+      out->drawString(state, s);
+    state->shift(tdx, tdy);
+  }
+
+  if (out->useDrawChar()) {
+    out->endString(state);
+  }
+
+  if (patternFill && ocState) {
+    out->saveTextPos(state);
+    // tell the OutputDev to do the clipping
+    out->endTextObject(state);
+    // set up a clipping bbox so doPatternText will work -- assume
+    // that the text bounding box does not extend past the baseline in
+    // any direction by more than twice the font size
+    x1 = state->getCurX() + riseX;
+    y1 = state->getCurY() + riseY;
+    if (x0 > x1) {
+      x = x0; x0 = x1; x1 = x;
+    }
+    if (y0 > y1) {
+      y = y0; y0 = y1; y1 = y;
+    }
+    state->textTransformDelta(0, state->getFontSize(), &dx, &dy);
+    state->textTransformDelta(state->getFontSize(), 0, &dx2, &dy2);
+    dx = fabs(dx);
+    dx2 = fabs(dx2);
+    if (dx2 > dx) {
+      dx = dx2;
+    }
+    dy = fabs(dy);
+    dy2 = fabs(dy2);
+    if (dy2 > dy) {
+      dy = dy2;
+    }
+    state->clipToRect(x0 - 2 * dx, y0 - 2 * dy, x1 + 2 * dx, y1 + 2 * dy);
+    // set render mode to fill-only
+    state->setRender(0);
+    out->updateRender(state);
+    doPatternText();
+    restoreState();
+    out->restoreTextPos(state);
+  }
+
+  updateLevel += 10 * s->getLength();
+}
+
+// NB: this is only called when ocState is false.
+void Gfx::doIncCharCount(GooString *s) {
+  if (out->needCharCount()) {
+    out->incCharCount(s->getLength());
+  }
+}
+
+//------------------------------------------------------------------------
+// XObject operators
+//------------------------------------------------------------------------
+
+void Gfx::opXObject(Object args[], int numArgs) {
+  char *name;
+  Object obj1, obj2, obj3, refObj;
+#if OPI_SUPPORT
+  Object opiDict;
+#endif
+
+  if (!ocState && !out->needCharCount()) {
+    return;
+  }
+  name = args[0].getName();
+  if (!res->lookupXObject(name, &obj1)) {
+    return;
+  }
+  if (!obj1.isStream()) {
+      error(errSyntaxError, getPos(), "XObject '{0:s}' is wrong type", name);
+    obj1.free();
+    return;
+  }
+
+#if OPI_SUPPORT
+  obj1.streamGetDict()->lookup("OPI", &opiDict);
+  if (opiDict.isDict()) {
+    out->opiBegin(state, opiDict.getDict());
+  }
+#endif
+  obj1.streamGetDict()->lookup("Subtype", &obj2);
+  if (obj2.isName("Image")) {
+    if (out->needNonText()) {
+      res->lookupXObjectNF(name, &refObj);
+      doImage(&refObj, obj1.getStream(), gFalse);
+      refObj.free();
+    }
+  } else if (obj2.isName("Form")) {
+    res->lookupXObjectNF(name, &refObj);
+    if (out->useDrawForm() && refObj.isRef()) {
+      out->drawForm(refObj.getRef());
+    } else {
+      doForm(&obj1);
+    }
+    refObj.free();
+  } else if (obj2.isName("PS")) {
+    obj1.streamGetDict()->lookup("Level1", &obj3);
+    out->psXObject(obj1.getStream(),
+                  obj3.isStream() ? obj3.getStream() : (Stream *)NULL);
+  } else if (obj2.isName()) {
+    error(errSyntaxError, getPos(), "Unknown XObject subtype '{0:s}'", obj2.getName());
+  } else {
+    error(errSyntaxError, getPos(), "XObject subtype is missing or wrong type");
+  }
+  obj2.free();
+#if OPI_SUPPORT
+  if (opiDict.isDict()) {
+    out->opiEnd(state, opiDict.getDict());
+  }
+  opiDict.free();
+#endif
+  obj1.free();
+}
+
+void Gfx::doImage(Object *ref, Stream *str, GBool inlineImg) {
+  Dict *dict, *maskDict;
+  int width, height;
+  int bits, maskBits;
+  GBool interpolate;
+  StreamColorSpaceMode csMode;
+  GBool mask;
+  GBool invert;
+  GfxColorSpace *colorSpace, *maskColorSpace;
+  GfxImageColorMap *colorMap, *maskColorMap;
+  Object maskObj, smaskObj;
+  GBool haveColorKeyMask, haveExplicitMask, haveSoftMask;
+  int maskColors[2*gfxColorMaxComps];
+  int maskWidth, maskHeight;
+  GBool maskInvert;
+  GBool maskInterpolate;
+  Stream *maskStr;
+  Object obj1, obj2;
+  int i, n;
+
+  // get info from the stream
+  bits = 0;
+  csMode = streamCSNone;
+  str->getImageParams(&bits, &csMode);
+
+  // get stream dict
+  dict = str->getDict();
+
+  // check for optional content key
+  if (ref) {
+    dict->lookupNF("OC", &obj1);
+    if (catalog->getOptContentConfig() && !catalog->getOptContentConfig()->optContentIsVisible(&obj1)) {
+      obj1.free();
+      return;
+    }
+    obj1.free();
+  }
+
+  // get size
+  dict->lookup("Width", &obj1);
+  if (obj1.isNull()) {
+    obj1.free();
+    dict->lookup("W", &obj1);
+  }
+  if (obj1.isInt())
+    width = obj1.getInt();
+  else if (obj1.isReal())
+    width = (int)obj1.getReal();
+  else
+    goto err2;
+  obj1.free();
+  dict->lookup("Height", &obj1);
+  if (obj1.isNull()) {
+    obj1.free();
+    dict->lookup("H", &obj1);
+  }
+  if (obj1.isInt())
+    height = obj1.getInt();
+  else if (obj1.isReal())
+    height = (int)obj1.getReal();
+  else
+    goto err2;
+  obj1.free();
+
+  if (width < 1 || height < 1)
+    goto err1;
+
+  // image interpolation
+  dict->lookup("Interpolate", &obj1);
+  if (obj1.isNull()) {
+    obj1.free();
+    dict->lookup("I", &obj1);
+  }
+  if (obj1.isBool())
+    interpolate = obj1.getBool();
+  else
+    interpolate = gFalse;
+  obj1.free();
+  maskInterpolate = gFalse;
+
+  // image or mask?
+  dict->lookup("ImageMask", &obj1);
+  if (obj1.isNull()) {
+    obj1.free();
+    dict->lookup("IM", &obj1);
+  }
+  mask = gFalse;
+  if (obj1.isBool())
+    mask = obj1.getBool();
+  else if (!obj1.isNull())
+    goto err2;
+  obj1.free();
+
+  // bit depth
+  if (bits == 0) {
+    dict->lookup("BitsPerComponent", &obj1);
+    if (obj1.isNull()) {
+      obj1.free();
+      dict->lookup("BPC", &obj1);
+    }
+    if (obj1.isInt()) {
+      bits = obj1.getInt();
+    } else if (mask) {
+      bits = 1;
+    } else {
+      goto err2;
+    }
+    obj1.free();
+  }
+
+  // display a mask
+  if (mask) {
+
+    // check for inverted mask
+    if (bits != 1)
+      goto err1;
+    invert = gFalse;
+    dict->lookup("Decode", &obj1);
+    if (obj1.isNull()) {
+      obj1.free();
+      dict->lookup("D", &obj1);
+    }
+    if (obj1.isArray()) {
+      obj1.arrayGet(0, &obj2);
+      // Table 4.39 says /Decode must be [1 0] or [0 1]. Adobe
+      // accepts [1.0 0.0] as well.
+      if (obj2.isNum() && obj2.getNum() >= 0.9)
+       invert = gTrue;
+      obj2.free();
+    } else if (!obj1.isNull()) {
+      goto err2;
+    }
+    obj1.free();
+
+    // if drawing is disabled, skip over inline image data
+    if (!ocState) {
+      str->reset();
+      n = height * ((width + 7) / 8);
+      for (i = 0; i < n; ++i) {
+       str->getChar();
+      }
+      str->close();
+
+    // draw it
+    } else {
+      if (state->getFillColorSpace()->getMode() == csPattern) {
+       doPatternImageMask(ref, str, width, height, invert, inlineImg);
+      } else {
+       out->drawImageMask(state, ref, str, width, height, invert, interpolate, inlineImg);
+      }
+    }
+  } else {
+
+    // get color space and color map
+    dict->lookup("ColorSpace", &obj1);
+    if (obj1.isNull()) {
+      obj1.free();
+      dict->lookup("CS", &obj1);
+    }
+    if (obj1.isName() && inlineImg) {
+      res->lookupColorSpace(obj1.getName(), &obj2);
+      if (!obj2.isNull()) {
+       obj1.free();
+       obj1 = obj2;
+      } else {
+       obj2.free();
+      }
+    }
+    if (!obj1.isNull()) {
+      colorSpace = GfxColorSpace::parse(&obj1, this);
+    } else if (csMode == streamCSDeviceGray) {
+      Object objCS;
+      res->lookupColorSpace("DefaultGray", &objCS);
+      if (objCS.isNull()) {
+        colorSpace = new GfxDeviceGrayColorSpace();
+      } else {
+        colorSpace = GfxColorSpace::parse(&objCS, this);
+      }
+      objCS.free();
+    } else if (csMode == streamCSDeviceRGB) {
+      Object objCS;
+      res->lookupColorSpace("DefaultRGB", &objCS);
+      if (objCS.isNull()) {
+        colorSpace = new GfxDeviceRGBColorSpace();
+      } else {
+        colorSpace = GfxColorSpace::parse(&objCS, this);
+      }
+      objCS.free();
+    } else if (csMode == streamCSDeviceCMYK) {
+      Object objCS;
+      res->lookupColorSpace("DefaultCMYK", &objCS);
+      if (objCS.isNull()) {
+        colorSpace = new GfxDeviceCMYKColorSpace();
+      } else {
+        colorSpace = GfxColorSpace::parse(&objCS, this);
+      }
+      objCS.free();
+    } else {
+      colorSpace = NULL;
+    }
+    obj1.free();
+    if (!colorSpace) {
+      goto err1;
+    }
+    dict->lookup("Decode", &obj1);
+    if (obj1.isNull()) {
+      obj1.free();
+      dict->lookup("D", &obj1);
+    }
+    if (bits == 0) {
+      delete colorSpace;
+      goto err2;
+    }
+    colorMap = new GfxImageColorMap(bits, &obj1, colorSpace);
+    obj1.free();
+    if (!colorMap->isOk()) {
+      delete colorMap;
+      goto err1;
+    }
+
+    // get the mask
+    haveColorKeyMask = haveExplicitMask = haveSoftMask = gFalse;
+    maskStr = NULL; // make gcc happy
+    maskWidth = maskHeight = 0; // make gcc happy
+    maskInvert = gFalse; // make gcc happy
+    maskColorMap = NULL; // make gcc happy
+    dict->lookup("Mask", &maskObj);
+    dict->lookup("SMask", &smaskObj);
+    if (smaskObj.isStream()) {
+      // soft mask
+      if (inlineImg) {
+       goto err1;
+      }
+      maskStr = smaskObj.getStream();
+      maskDict = smaskObj.streamGetDict();
+      maskDict->lookup("Width", &obj1);
+      if (obj1.isNull()) {
+       obj1.free();
+       maskDict->lookup("W", &obj1);
+      }
+      if (!obj1.isInt()) {
+       goto err2;
+      }
+      maskWidth = obj1.getInt();
+      obj1.free();
+      maskDict->lookup("Height", &obj1);
+      if (obj1.isNull()) {
+       obj1.free();
+       maskDict->lookup("H", &obj1);
+      }
+      if (!obj1.isInt()) {
+       goto err2;
+      }
+      maskHeight = obj1.getInt();
+      obj1.free();
+      maskDict->lookup("Interpolate", &obj1);
+      if (obj1.isNull()) {
+        obj1.free();
+        maskDict->lookup("I", &obj1);
+      }
+      if (obj1.isBool())
+        maskInterpolate = obj1.getBool();
+      else
+        maskInterpolate = gFalse;
+      obj1.free();
+      maskDict->lookup("BitsPerComponent", &obj1);
+      if (obj1.isNull()) {
+       obj1.free();
+       maskDict->lookup("BPC", &obj1);
+      }
+      if (!obj1.isInt()) {
+       goto err2;
+      }
+      maskBits = obj1.getInt();
+      obj1.free();
+      maskDict->lookup("ColorSpace", &obj1);
+      if (obj1.isNull()) {
+       obj1.free();
+       maskDict->lookup("CS", &obj1);
+      }
+      if (obj1.isName()) {
+       res->lookupColorSpace(obj1.getName(), &obj2);
+       if (!obj2.isNull()) {
+         obj1.free();
+         obj1 = obj2;
+       } else {
+         obj2.free();
+       }
+      }
+      maskColorSpace = GfxColorSpace::parse(&obj1, this);
+      obj1.free();
+      if (!maskColorSpace || maskColorSpace->getMode() != csDeviceGray) {
+       goto err1;
+      }
+      maskDict->lookup("Decode", &obj1);
+      if (obj1.isNull()) {
+       obj1.free();
+       maskDict->lookup("D", &obj1);
+      }
+      maskColorMap = new GfxImageColorMap(maskBits, &obj1, maskColorSpace);
+      obj1.free();
+      if (!maskColorMap->isOk()) {
+       delete maskColorMap;
+       goto err1;
+      }
+      //~ handle the Matte entry
+      haveSoftMask = gTrue;
+    } else if (maskObj.isArray()) {
+      // color key mask
+      for (i = 0;
+          i < maskObj.arrayGetLength() && i < 2*gfxColorMaxComps;
+          ++i) {
+       maskObj.arrayGet(i, &obj1);
+       if (obj1.isInt()) {
+         maskColors[i] = obj1.getInt();
+       } else if (obj1.isReal()) {
+         error(errSyntaxError, -1, "Mask entry should be an integer but it's a real, trying to use it");
+         maskColors[i] = (int) obj1.getReal();
+       } else {
+         error(errSyntaxError, -1, "Mask entry should be an integer but it's of type {0:d}", obj1.getType());
+         obj1.free();
+         goto err1;
+       }
+       obj1.free();
+      }
+      haveColorKeyMask = gTrue;
+    } else if (maskObj.isStream()) {
+      // explicit mask
+      if (inlineImg) {
+       goto err1;
+      }
+      maskStr = maskObj.getStream();
+      maskDict = maskObj.streamGetDict();
+      maskDict->lookup("Width", &obj1);
+      if (obj1.isNull()) {
+       obj1.free();
+       maskDict->lookup("W", &obj1);
+      }
+      if (!obj1.isInt()) {
+       goto err2;
+      }
+      maskWidth = obj1.getInt();
+      obj1.free();
+      maskDict->lookup("Height", &obj1);
+      if (obj1.isNull()) {
+       obj1.free();
+       maskDict->lookup("H", &obj1);
+      }
+      if (!obj1.isInt()) {
+       goto err2;
+      }
+      maskHeight = obj1.getInt();
+      obj1.free();
+      maskDict->lookup("Interpolate", &obj1);
+      if (obj1.isNull()) {
+        obj1.free();
+       maskDict->lookup("I", &obj1);
+      }
+      if (obj1.isBool())
+        maskInterpolate = obj1.getBool();
+      else
+        maskInterpolate = gFalse;
+      obj1.free();
+      maskDict->lookup("ImageMask", &obj1);
+      if (obj1.isNull()) {
+       obj1.free();
+       maskDict->lookup("IM", &obj1);
+      }
+      if (!obj1.isBool() || !obj1.getBool()) {
+       goto err2;
+      }
+      obj1.free();
+      maskInvert = gFalse;
+      maskDict->lookup("Decode", &obj1);
+      if (obj1.isNull()) {
+       obj1.free();
+       maskDict->lookup("D", &obj1);
+      }
+      if (obj1.isArray()) {
+       obj1.arrayGet(0, &obj2);
+       // Table 4.39 says /Decode must be [1 0] or [0 1]. Adobe
+       // accepts [1.0 0.0] as well.
+       if (obj2.isNum() && obj2.getNum() >= 0.9) {
+         maskInvert = gTrue;
+       }
+       obj2.free();
+      } else if (!obj1.isNull()) {
+       goto err2;
+      }
+      obj1.free();
+      haveExplicitMask = gTrue;
+    }
+
+    // if drawing is disabled, skip over inline image data
+    if (!ocState) {
+      str->reset();
+      n = height * ((width * colorMap->getNumPixelComps() *
+                    colorMap->getBits() + 7) / 8);
+      for (i = 0; i < n; ++i) {
+       str->getChar();
+      }
+      str->close();
+
+    // draw it
+    } else {
+      if (haveSoftMask) {
+       out->drawSoftMaskedImage(state, ref, str, width, height, colorMap, interpolate,
+                                maskStr, maskWidth, maskHeight, maskColorMap, maskInterpolate);
+       delete maskColorMap;
+      } else if (haveExplicitMask) {
+       out->drawMaskedImage(state, ref, str, width, height, colorMap, interpolate,
+                            maskStr, maskWidth, maskHeight, maskInvert, maskInterpolate);
+      } else {
+       out->drawImage(state, ref, str, width, height, colorMap, interpolate,
+                      haveColorKeyMask ? maskColors : (int *)NULL, inlineImg);
+      }
+    }
+    delete colorMap;
+
+    maskObj.free();
+    smaskObj.free();
+  }
+
+  if ((i = width * height) > 1000) {
+    i = 1000;
+  }
+  updateLevel += i;
+
+  return;
+
+ err2:
+  obj1.free();
+ err1:
+  error(errSyntaxError, getPos(), "Bad image parameters");
+}
+
+GBool Gfx::checkTransparencyGroup(Dict *resDict) {
+  // check the effect of compositing objects as a group:
+  // look for ExtGState entries with ca != 1 or CA != 1 or BM != normal
+  Object extGStates;
+  GBool transpGroup = gFalse;
+  double opac;
+
+  if (resDict == NULL)
+    return gFalse;
+  pushResources(resDict);
+  resDict->lookup("ExtGState", &extGStates);
+  if (extGStates.isDict()) {
+    Dict *dict = extGStates.getDict();
+    for (int i = 0; i < dict->getLength() && !transpGroup; i++) {
+      Object obj1, obj2;
+      GfxBlendMode mode;
+
+      if (res->lookupGState(dict->getKey(i), &obj1)) {
+        if (!obj1.dictLookup("BM", &obj2)->isNull()) {
+          if (state->parseBlendMode(&obj2, &mode)) {
+            if (mode != gfxBlendNormal)
+              transpGroup = gTrue;
+          } else {
+            error(errSyntaxError, getPos(), "Invalid blend mode in ExtGState");
+          }
+        }
+        obj2.free();
+        if (obj1.dictLookup("ca", &obj2)->isNum()) {
+          opac = obj2.getNum();
+          opac = opac < 0 ? 0 : opac > 1 ? 1 : opac;
+          if (opac != 1)
+            transpGroup = gTrue;
+        }
+        obj2.free();
+        if (obj1.dictLookup("CA", &obj2)->isNum()) {
+          opac = obj2.getNum();
+          opac = opac < 0 ? 0 : opac > 1 ? 1 : opac;
+          if (opac != 1)
+            transpGroup = gTrue;
+        }
+        obj2.free();
+        // alpha is shape
+        if (!transpGroup && obj1.dictLookup("AIS", &obj2)->isBool()) {
+          transpGroup = obj2.getBool();
+        }
+        obj2.free();
+        // soft mask
+        if (!transpGroup && !obj1.dictLookup("SMask", &obj2)->isNull()) {
+          if (!obj2.isName("None")) {
+            transpGroup = gTrue;
+          }
+        }
+        obj2.free();
+      }
+      obj1.free();
+    }
+  }
+  extGStates.free();
+  popResources();
+  return transpGroup;
+}
+
+void Gfx::doForm(Object *str) {
+  Dict *dict;
+  GBool transpGroup, isolated, knockout;
+  GfxColorSpace *blendingColorSpace;
+  Object matrixObj, bboxObj;
+  double m[6], bbox[4];
+  Object resObj;
+  Dict *resDict;
+  GBool ocSaved;
+  Object obj1, obj2, obj3;
+  int i;
+
+  // check for excessive recursion
+  if (formDepth > 100) {
+    return;
+  }
+
+  // get stream dict
+  dict = str->streamGetDict();
+
+  // check form type
+  dict->lookup("FormType", &obj1);
+  if (!(obj1.isNull() || (obj1.isInt() && obj1.getInt() == 1))) {
+    error(errSyntaxError, getPos(), "Unknown form type");
+  }
+  obj1.free();
+
+  // check for optional content key
+  ocSaved = ocState;
+  dict->lookupNF("OC", &obj1);
+  if (catalog->getOptContentConfig() && !catalog->getOptContentConfig()->optContentIsVisible(&obj1)) {
+    obj1.free();
+    if (out->needCharCount()) {
+      ocState = gFalse;
+    } else {
+      return;
+    }
+  }
+  obj1.free();
+
+  // get bounding box
+  dict->lookup("BBox", &bboxObj);
+  if (!bboxObj.isArray()) {
+    bboxObj.free();
+    error(errSyntaxError, getPos(), "Bad form bounding box");
+    ocState = ocSaved;
+    return;
+  }
+  for (i = 0; i < 4; ++i) {
+    bboxObj.arrayGet(i, &obj1);
+    if (likely(obj1.isNum())) {
+      bbox[i] = obj1.getNum();
+      obj1.free();
+    } else {
+      obj1.free();
+      error(errSyntaxError, getPos(), "Bad form bounding box value");
+      return;
+    }
+  }
+  bboxObj.free();
+
+  // get matrix
+  dict->lookup("Matrix", &matrixObj);
+  if (matrixObj.isArray()) {
+    for (i = 0; i < 6; ++i) {
+      matrixObj.arrayGet(i, &obj1);
+      if (likely(obj1.isNum())) m[i] = obj1.getNum();
+      else m[i] = 0;
+      obj1.free();
+    }
+  } else {
+    m[0] = 1; m[1] = 0;
+    m[2] = 0; m[3] = 1;
+    m[4] = 0; m[5] = 0;
+  }
+  matrixObj.free();
+
+  // get resources
+  dict->lookup("Resources", &resObj);
+  resDict = resObj.isDict() ? resObj.getDict() : (Dict *)NULL;
+
+  // check for a transparency group
+  transpGroup = isolated = knockout = gFalse;
+  blendingColorSpace = NULL;
+  if (dict->lookup("Group", &obj1)->isDict()) {
+    if (obj1.dictLookup("S", &obj2)->isName("Transparency")) {
+      if (!obj1.dictLookup("CS", &obj3)->isNull()) {
+       blendingColorSpace = GfxColorSpace::parse(&obj3, this);
+      }
+      obj3.free();
+      if (obj1.dictLookup("I", &obj3)->isBool()) {
+       isolated = obj3.getBool();
+      }
+      obj3.free();
+      if (obj1.dictLookup("K", &obj3)->isBool()) {
+       knockout = obj3.getBool();
+      }
+      obj3.free();
+      transpGroup = isolated || out->checkTransparencyGroup(state, knockout) || checkTransparencyGroup(resDict);
+    }
+    obj2.free();
+  }
+  obj1.free();
+
+  // draw it
+  ++formDepth;
+  drawForm(str, resDict, m, bbox,
+         transpGroup, gFalse, blendingColorSpace, isolated, knockout);
+  --formDepth;
+
+  if (blendingColorSpace) {
+    delete blendingColorSpace;
+  }
+  resObj.free();
+
+  ocState = ocSaved;
+}
+
+void Gfx::drawForm(Object *str, Dict *resDict, double *matrix, double *bbox,
+                 GBool transpGroup, GBool softMask,
+                 GfxColorSpace *blendingColorSpace,
+                 GBool isolated, GBool knockout,
+                 GBool alpha, Function *transferFunc,
+                 GfxColor *backdropColor) {
+  Parser *oldParser;
+  GfxState *savedState;
+  double oldBaseMatrix[6];
+  int i;
+
+  // push new resources on stack
+  pushResources(resDict);
+
+  // save current graphics state
+  savedState = saveStateStack();
+
+  // kill any pre-existing path
+  state->clearPath();
+
+  // save current parser
+  oldParser = parser;
+
+  // set form transformation matrix
+  state->concatCTM(matrix[0], matrix[1], matrix[2],
+                  matrix[3], matrix[4], matrix[5]);
+  out->updateCTM(state, matrix[0], matrix[1], matrix[2],
+                matrix[3], matrix[4], matrix[5]);
+
+  // set form bounding box
+  state->moveTo(bbox[0], bbox[1]);
+  state->lineTo(bbox[2], bbox[1]);
+  state->lineTo(bbox[2], bbox[3]);
+  state->lineTo(bbox[0], bbox[3]);
+  state->closePath();
+  state->clip();
+  out->clip(state);
+  state->clearPath();
+
+  if (softMask || transpGroup) {
+    if (state->getBlendMode() != gfxBlendNormal) {
+      state->setBlendMode(gfxBlendNormal);
+      out->updateBlendMode(state);
+    }
+    if (state->getFillOpacity() != 1) {
+      state->setFillOpacity(1);
+      out->updateFillOpacity(state);
+    }
+    if (state->getStrokeOpacity() != 1) {
+      state->setStrokeOpacity(1);
+      out->updateStrokeOpacity(state);
+    }
+    out->clearSoftMask(state);
+    out->beginTransparencyGroup(state, bbox, blendingColorSpace,
+                               isolated, knockout, softMask);
+  }
+
+  // set new base matrix
+  for (i = 0; i < 6; ++i) {
+    oldBaseMatrix[i] = baseMatrix[i];
+    baseMatrix[i] = state->getCTM()[i];
+  }
+
+  GfxState *stateBefore = state;
+
+  // draw the form
+  display(str, gFalse);
+  
+  if (stateBefore != state) {
+    if (state->isParentState(stateBefore)) {
+      error(errSyntaxError, -1, "There's a form with more q than Q, trying to fix");
+      while (stateBefore != state) {
+        restoreState();
+      }
+    } else {
+      error(errSyntaxError, -1, "There's a form with more Q than q");
+    }
+  }
+
+  if (softMask || transpGroup) {
+    out->endTransparencyGroup(state);
+  }
+
+  // restore base matrix
+  for (i = 0; i < 6; ++i) {
+    baseMatrix[i] = oldBaseMatrix[i];
+  }
+
+  // restore parser
+  parser = oldParser;
+
+  // restore graphics state
+  restoreStateStack(savedState);
+
+  // pop resource stack
+  popResources();
+
+  if (softMask) {
+    out->setSoftMask(state, bbox, alpha, transferFunc, backdropColor);
+  } else if (transpGroup) {
+    out->paintTransparencyGroup(state, bbox);
+  }
+
+  return;
+}
+
+//------------------------------------------------------------------------
+// in-line image operators
+//------------------------------------------------------------------------
+
+void Gfx::opBeginImage(Object args[], int numArgs) {
+  Stream *str;
+  int c1, c2;
+
+  // NB: this function is run even if ocState is false -- doImage() is
+  // responsible for skipping over the inline image data
+
+  // build dict/stream
+  str = buildImageStream();
+
+  // display the image
+  if (str) {
+    doImage(NULL, str, gTrue);
+  
+    // skip 'EI' tag
+    c1 = str->getUndecodedStream()->getChar();
+    c2 = str->getUndecodedStream()->getChar();
+    while (!(c1 == 'E' && c2 == 'I') && c2 != EOF) {
+      c1 = c2;
+      c2 = str->getUndecodedStream()->getChar();
+    }
+    delete str;
+  }
+}
+
+Stream *Gfx::buildImageStream() {
+  Object dict;
+  Object obj;
+  char *key;
+  Stream *str;
+
+  // build dictionary
+  dict.initDict(xref);
+  parser->getObj(&obj);
+  while (!obj.isCmd("ID") && !obj.isEOF()) {
+    if (!obj.isName()) {
+      error(errSyntaxError, getPos(), "Inline image dictionary key must be a name object");
+      obj.free();
+    } else {
+      key = copyString(obj.getName());
+      obj.free();
+      parser->getObj(&obj);
+      if (obj.isEOF() || obj.isError()) {
+       gfree(key);
+       break;
+      }
+      dict.dictAdd(key, &obj);
+    }
+    parser->getObj(&obj);
+  }
+  if (obj.isEOF()) {
+    error(errSyntaxError, getPos(), "End of file in inline image");
+    obj.free();
+    dict.free();
+    return NULL;
+  }
+  obj.free();
+
+  // make stream
+  if (parser->getStream()) {
+    str = new EmbedStream(parser->getStream(), &dict, gFalse, 0);
+    str = str->addFilters(&dict);
+  } else {
+    str = NULL;
+    dict.free();
+  }
+
+  return str;
+}
+
+void Gfx::opImageData(Object args[], int numArgs) {
+  error(errInternal, getPos(), "Got 'ID' operator");
+}
+
+void Gfx::opEndImage(Object args[], int numArgs) {
+  error(errInternal, getPos(), "Got 'EI' operator");
+}
+
+//------------------------------------------------------------------------
+// type 3 font operators
+//------------------------------------------------------------------------
+
+void Gfx::opSetCharWidth(Object args[], int numArgs) {
+  out->type3D0(state, args[0].getNum(), args[1].getNum());
+}
+
+void Gfx::opSetCacheDevice(Object args[], int numArgs) {
+  out->type3D1(state, args[0].getNum(), args[1].getNum(),
+              args[2].getNum(), args[3].getNum(),
+              args[4].getNum(), args[5].getNum());
+}
+
+//------------------------------------------------------------------------
+// compatibility operators
+//------------------------------------------------------------------------
+
+void Gfx::opBeginIgnoreUndef(Object args[], int numArgs) {
+  ++ignoreUndef;
+}
+
+void Gfx::opEndIgnoreUndef(Object args[], int numArgs) {
+  if (ignoreUndef > 0)
+    --ignoreUndef;
+}
+
+//------------------------------------------------------------------------
+// marked content operators
+//------------------------------------------------------------------------
+
+enum GfxMarkedContentKind {
+  gfxMCOptionalContent,
+  gfxMCActualText,
+  gfxMCOther
+};
+
+struct MarkedContentStack {
+  GfxMarkedContentKind kind;
+  GBool ocSuppressed;       // are we ignoring content based on OptionalContent?
+  MarkedContentStack *next; // next object on stack
+};
+
+void Gfx::popMarkedContent() {
+  MarkedContentStack *mc = mcStack;
+  mcStack = mc->next;
+  delete mc;
+}
+
+void Gfx::pushMarkedContent() {
+  MarkedContentStack *mc = new MarkedContentStack();
+  mc->ocSuppressed = gFalse;
+  mc->kind = gfxMCOther;
+  mc->next = mcStack;
+  mcStack = mc;
+}
+
+GBool Gfx::contentIsHidden() {
+  MarkedContentStack *mc = mcStack;
+  bool hidden = mc && mc->ocSuppressed;
+  while (!hidden && mc && mc->next) {
+    mc = mc->next;
+    hidden = mc->ocSuppressed;
+  }
+  return hidden;
+}
+
+void Gfx::opBeginMarkedContent(Object args[], int numArgs) {
+  // push a new stack entry
+  pushMarkedContent();
+  
+  OCGs *contentConfig = catalog->getOptContentConfig();
+  char* name0 = args[0].getName();
+  if ( strncmp( name0, "OC", 2) == 0 && contentConfig) {
+    if ( numArgs >= 2 ) {
+      if (!args[1].isName()) {
+       error(errSyntaxError, getPos(), "Unexpected MC Type: {0:d}", args[1].getType());
+      }
+      char* name1 = args[1].getName();
+      Object markedContent;
+      MarkedContentStack *mc = mcStack;
+      mc->kind = gfxMCOptionalContent;
+      if ( res->lookupMarkedContentNF( name1, &markedContent ) ) {
+        bool visible = contentConfig->optContentIsVisible(&markedContent);
+        mc->ocSuppressed = !(visible);
+      } else {
+       error(errSyntaxError, getPos(), "DID NOT find {0:s}", name1);
+      }
+      markedContent.free();
+    } else {
+      error(errSyntaxError, getPos(), "insufficient arguments for Marked Content");
+    }
+  } else if (args[0].isName("Span") && numArgs == 2 && args[1].isDict()) {
+    Object obj;
+    if (args[1].dictLookup("ActualText", &obj)->isString()) {
+      out->beginActualText(state, obj.getString());
+      MarkedContentStack *mc = mcStack;
+      mc->kind = gfxMCActualText;
+    }
+    obj.free();
+  }
+
+  if (printCommands) {
+    printf("  marked content: %s ", args[0].getName());
+    if (numArgs == 2)
+      args[1].print(stdout);
+    printf("\n");
+    fflush(stdout);
+  }
+  ocState = !contentIsHidden();
+  
+  if (numArgs == 2 && args[1].isDict()) {
+    out->beginMarkedContent(args[0].getName(), args[1].getDict());
+  } else if(numArgs == 1) {
+    out->beginMarkedContent(args[0].getName(), NULL);
+  }
+}
+
+void Gfx::opEndMarkedContent(Object args[], int numArgs) {
+  if (!mcStack) {
+    error(errSyntaxWarning, getPos(), "Mismatched EMC operator");
+    return;
+  }
+
+  MarkedContentStack *mc = mcStack;
+  GfxMarkedContentKind mcKind = mc->kind;
+
+  // pop the stack
+  popMarkedContent();
+
+  if (mcKind == gfxMCActualText)
+    out->endActualText(state);
+  ocState = !contentIsHidden();
+  
+  out->endMarkedContent(state);
+}
+
+void Gfx::opMarkPoint(Object args[], int numArgs) {
+  if (printCommands) {
+    printf("  mark point: %s ", args[0].getName());
+    if (numArgs == 2)
+      args[1].print(stdout);
+    printf("\n");
+    fflush(stdout);
+  }
+
+  if(numArgs == 2 && args[1].isDict()) {
+    out->markPoint(args[0].getName(),args[1].getDict());
+  } else {
+    out->markPoint(args[0].getName());
+  }
+
+}
+
+//------------------------------------------------------------------------
+// misc
+//------------------------------------------------------------------------
+
+void Gfx::drawAnnot(Object *str, AnnotBorder *border, AnnotColor *aColor,
+                   double xMin, double yMin, double xMax, double yMax) {
+  Dict *dict, *resDict;
+  Object matrixObj, bboxObj, resObj, obj1;
+  double formXMin, formYMin, formXMax, formYMax;
+  double x, y, sx, sy, tx, ty;
+  double m[6], bbox[4];
+  double r, g, b;
+  GfxColor color;
+  double *dash, *dash2;
+  int dashLength;
+  int i;
+
+  // this function assumes that we are in the default user space,
+  // i.e., baseMatrix = ctm
+
+  // if the bounding box has zero width or height, don't draw anything
+  // at all
+  if (xMin == xMax || yMin == yMax) {
+    return;
+  }
+
+  // draw the appearance stream (if there is one)
+  if (str->isStream()) {
+
+    // get stream dict
+    dict = str->streamGetDict();
+
+    // get the form bounding box
+    dict->lookup("BBox", &bboxObj);
+    if (!bboxObj.isArray()) {
+      bboxObj.free();
+      error(errSyntaxError, getPos(), "Bad form bounding box");
+      return;
+    }
+    for (i = 0; i < 4; ++i) {
+      bboxObj.arrayGet(i, &obj1);
+      if (likely(obj1.isNum())) {
+        bbox[i] = obj1.getNum();
+        obj1.free();
+      } else {
+        obj1.free();
+        error(errSyntaxError, getPos(), "Bad form bounding box value");
+        return;
+      }
+    }
+    bboxObj.free();
+
+    // get the form matrix
+    dict->lookup("Matrix", &matrixObj);
+    if (matrixObj.isArray() && matrixObj.arrayGetLength() >= 6) {
+      for (i = 0; i < 6; ++i) {
+       matrixObj.arrayGet(i, &obj1);
+       m[i] = obj1.getNum();
+       obj1.free();
+      }
+    } else {
+      m[0] = 1; m[1] = 0;
+      m[2] = 0; m[3] = 1;
+      m[4] = 0; m[5] = 0;
+    }
+    matrixObj.free();
+
+    // transform the four corners of the form bbox to default user
+    // space, and construct the transformed bbox
+    x = bbox[0] * m[0] + bbox[1] * m[2] + m[4];
+    y = bbox[0] * m[1] + bbox[1] * m[3] + m[5];
+    formXMin = formXMax = x;
+    formYMin = formYMax = y;
+    x = bbox[0] * m[0] + bbox[3] * m[2] + m[4];
+    y = bbox[0] * m[1] + bbox[3] * m[3] + m[5];
+    if (x < formXMin) {
+      formXMin = x;
+    } else if (x > formXMax) {
+      formXMax = x;
+    }
+    if (y < formYMin) {
+      formYMin = y;
+    } else if (y > formYMax) {
+      formYMax = y;
+    }
+    x = bbox[2] * m[0] + bbox[1] * m[2] + m[4];
+    y = bbox[2] * m[1] + bbox[1] * m[3] + m[5];
+    if (x < formXMin) {
+      formXMin = x;
+    } else if (x > formXMax) {
+      formXMax = x;
+    }
+    if (y < formYMin) {
+      formYMin = y;
+    } else if (y > formYMax) {
+      formYMax = y;
+    }
+    x = bbox[2] * m[0] + bbox[3] * m[2] + m[4];
+    y = bbox[2] * m[1] + bbox[3] * m[3] + m[5];
+    if (x < formXMin) {
+      formXMin = x;
+    } else if (x > formXMax) {
+      formXMax = x;
+    }
+    if (y < formYMin) {
+      formYMin = y;
+    } else if (y > formYMax) {
+      formYMax = y;
+    }
+
+    // construct a mapping matrix, [sx 0  0], which maps the transformed
+    //                             [0  sy 0]
+    //                             [tx ty 1]
+    // bbox to the annotation rectangle
+    if (formXMin == formXMax) {
+      // this shouldn't happen
+      sx = 1;
+    } else {
+      sx = (xMax - xMin) / (formXMax - formXMin);
+    }
+    if (formYMin == formYMax) {
+      // this shouldn't happen
+      sy = 1;
+    } else {
+      sy = (yMax - yMin) / (formYMax - formYMin);
+    }
+    tx = -formXMin * sx + xMin;
+    ty = -formYMin * sy + yMin;
+
+    // the final transform matrix is (form matrix) * (mapping matrix)
+    m[0] *= sx;
+    m[1] *= sy;
+    m[2] *= sx;
+    m[3] *= sy;
+    m[4] = m[4] * sx + tx;
+    m[5] = m[5] * sy + ty;
+
+    // get the resources
+    dict->lookup("Resources", &resObj);
+    resDict = resObj.isDict() ? resObj.getDict() : (Dict *)NULL;
+
+    // draw it
+    drawForm(str, resDict, m, bbox);
+
+    resObj.free();
+  }
+
+  // draw the border
+  if (border && border->getWidth() > 0) {
+    saveState();
+    if (state->getStrokeColorSpace()->getMode() != csDeviceRGB) {
+      state->setStrokePattern(NULL);
+      state->setStrokeColorSpace(new GfxDeviceRGBColorSpace());
+      out->updateStrokeColorSpace(state);
+    }
+    if (aColor && (aColor->getSpace() == AnnotColor::colorRGB)) {
+      const double *values = aColor->getValues();
+      r = values[0];
+      g = values[1];
+      b = values[2];
+    } else {
+      r = g = b = 0;
+    };
+    color.c[0] = dblToCol(r);
+    color.c[1] = dblToCol(g);
+    color.c[2] = dblToCol(b);
+    state->setStrokeColor(&color);
+    out->updateStrokeColor(state);
+    state->setLineWidth(border->getWidth());
+    out->updateLineWidth(state);
+    dashLength = border->getDashLength();
+    dash = border->getDash();
+    if (border->getStyle() == AnnotBorder::borderDashed && dashLength > 0) {
+      dash2 = (double *)gmallocn(dashLength, sizeof(double));
+      memcpy(dash2, dash, dashLength * sizeof(double));
+      state->setLineDash(dash2, dashLength, 0);
+      out->updateLineDash(state);
+    }
+    //~ this doesn't currently handle the beveled and engraved styles
+    state->clearPath();
+    state->moveTo(xMin, yMin);
+    state->lineTo(xMax, yMin);
+    if (border->getStyle() != AnnotBorder::borderUnderlined) {
+      state->lineTo(xMax, yMax);
+      state->lineTo(xMin, yMax);
+      state->closePath();
+    }
+    out->stroke(state);
+    restoreState();
+  }
+}
+
+int Gfx::bottomGuard() {
+    return stateGuards[stateGuards.size()-1];
+}
+
+void Gfx::pushStateGuard() {
+    stateGuards.push_back(stackHeight);
+}
+
+void Gfx::popStateGuard() {
+    while (stackHeight > bottomGuard() && state->hasSaves())
+       restoreState();
+    stateGuards.pop_back();
+}
+
+void Gfx::saveState() {
+  out->saveState(state);
+  state = state->save();
+  stackHeight++;
+}
+
+void Gfx::restoreState() {
+  if (stackHeight <= bottomGuard() || !state->hasSaves()) {
+    error(errSyntaxError, -1, "Restoring state when no valid states to pop");
+    commandAborted = gTrue;
+    return;
+  }
+  state = state->restore();
+  out->restoreState(state);
+  stackHeight--;
+}
+
+// Create a new state stack, and initialize it with a copy of the
+// current state.
+GfxState *Gfx::saveStateStack() {
+  GfxState *oldState;
+
+  out->saveState(state);
+  oldState = state;
+  state = state->copy(gTrue);
+  return oldState;
+}
+
+// Switch back to the previous state stack.
+void Gfx::restoreStateStack(GfxState *oldState) {
+  while (state->hasSaves()) {
+    restoreState();
+  }
+  delete state;
+  state = oldState;
+  out->restoreState(state);
+}
+
+void Gfx::pushResources(Dict *resDict) {
+  res = new GfxResources(xref, resDict, res);
+}
+
+void Gfx::popResources() {
+  GfxResources *resPtr;
+
+  resPtr = res->getNext();
+  delete res;
+  res = resPtr;
+}
+
+#ifdef USE_CMS
+PopplerCache *Gfx::getIccColorSpaceCache()
+{
+  return &iccColorSpaceCache;
+}
+#endif
diff --git a/poppler/Gfx.h b/poppler/Gfx.h
new file mode 100644 (file)
index 0000000..37022e0
--- /dev/null
@@ -0,0 +1,391 @@
+//========================================================================
+//
+// Gfx.h
+//
+// Copyright 1996-2003 Glyph & Cog, LLC
+//
+//========================================================================
+
+//========================================================================
+//
+// Modified under the Poppler project - http://poppler.freedesktop.org
+//
+// All changes made under the Poppler project to this file are licensed
+// under GPL version 2 or later
+//
+// Copyright (C) 2005 Jonathan Blandford <jrb@redhat.com>
+// Copyright (C) 2007 Iñigo Martínez <inigomartinez@gmail.com>
+// Copyright (C) 2008 Brad Hards <bradh@kde.org>
+// Copyright (C) 2008, 2010 Carlos Garcia Campos <carlosgc@gnome.org>
+// Copyright (C) 2009-2011 Albert Astals Cid <aacid@kde.org>
+// Copyright (C) 2009, 2010, 2012 Thomas Freitag <Thomas.Freitag@alfa.de>
+// Copyright (C) 2010 David Benjamin <davidben@mit.edu>
+// Copyright (C) 2010 Christian Feuersänger <cfeuersaenger@googlemail.com>
+//
+// To see a description of the changes please see the Changelog file that
+// came with your tarball or type make ChangeLog if you are building from git
+//
+//========================================================================
+
+#ifndef GFX_H
+#define GFX_H
+
+#ifdef USE_GCC_PRAGMAS
+#pragma interface
+#endif
+
+#include "poppler-config.h"
+#include "goo/gtypes.h"
+#include "goo/GooList.h"
+#include "GfxState.h"
+#include "Object.h"
+#include "PopplerCache.h"
+
+#include <vector>
+
+class GooString;
+class PDFDoc;
+class XRef;
+class Array;
+class Stream;
+class Parser;
+class Dict;
+class Function;
+class OutputDev;
+class GfxFontDict;
+class GfxFont;
+class GfxPattern;
+class GfxTilingPattern;
+class GfxShadingPattern;
+class GfxShading;
+class GfxFunctionShading;
+class GfxAxialShading;
+class GfxRadialShading;
+class GfxGouraudTriangleShading;
+class GfxPatchMeshShading;
+struct GfxPatch;
+class GfxState;
+struct GfxColor;
+class GfxColorSpace;
+class Gfx;
+class PDFRectangle;
+class AnnotBorder;
+class AnnotColor;
+class Catalog;
+struct MarkedContentStack;
+
+//------------------------------------------------------------------------
+
+enum GfxClipType {
+  clipNone,
+  clipNormal,
+  clipEO
+};
+
+enum TchkType {
+  tchkBool,                    // boolean
+  tchkInt,                     // integer
+  tchkNum,                     // number (integer or real)
+  tchkString,                  // string
+  tchkName,                    // name
+  tchkArray,                   // array
+  tchkProps,                   // properties (dictionary or name)
+  tchkSCN,                     // scn/SCN args (number of name)
+  tchkNone                     // used to avoid empty initializer lists
+};
+
+#define maxArgs 33
+
+struct Operator {
+  char name[4];
+  int numArgs;
+  TchkType tchk[maxArgs];
+  void (Gfx::*func)(Object args[], int numArgs);
+};
+
+//------------------------------------------------------------------------
+
+class GfxResources {
+public:
+
+  GfxResources(XRef *xref, Dict *resDict, GfxResources *nextA);
+  ~GfxResources();
+
+  GfxFont *lookupFont(char *name);
+  GBool lookupXObject(char *name, Object *obj);
+  GBool lookupXObjectNF(char *name, Object *obj);
+  GBool lookupMarkedContentNF(char *name, Object *obj);
+  void lookupColorSpace(const char *name, Object *obj);
+  GfxPattern *lookupPattern(char *name, Gfx *gfx);
+  GfxShading *lookupShading(char *name, Gfx *gfx);
+  GBool lookupGState(char *name, Object *obj);
+  GBool lookupGStateNF(char *name, Object *obj);
+
+  GfxResources *getNext() { return next; }
+
+private:
+
+  GfxFontDict *fonts;
+  Object xObjDict;
+  Object colorSpaceDict;
+  Object patternDict;
+  Object shadingDict;
+  Object gStateDict;
+  PopplerObjectCache gStateCache;
+  Object propertiesDict;
+  GfxResources *next;
+};
+
+//------------------------------------------------------------------------
+// Gfx
+//------------------------------------------------------------------------
+
+class Gfx {
+public:
+
+  // Constructor for regular output.
+  Gfx(PDFDoc *docA, OutputDev *outA, int pageNum, Dict *resDict,
+      double hDPI, double vDPI, PDFRectangle *box,
+      PDFRectangle *cropBox, int rotate,
+      GBool (*abortCheckCbkA)(void *data) = NULL,
+      void *abortCheckCbkDataA = NULL);
+
+  // Constructor for a sub-page object.
+  Gfx(PDFDoc *docA, OutputDev *outA, Dict *resDict,
+      PDFRectangle *box, PDFRectangle *cropBox,
+      GBool (*abortCheckCbkA)(void *data) = NULL,
+      void *abortCheckCbkDataA = NULL);
+
+  ~Gfx();
+
+  // Interpret a stream or array of streams.
+  void display(Object *obj, GBool topLevel = gTrue);
+
+  // Display an annotation, given its appearance (a Form XObject),
+  // border style, and bounding box (in default user space).
+  void drawAnnot(Object *str, AnnotBorder *border, AnnotColor *aColor,
+                double xMin, double yMin, double xMax, double yMax);
+
+  // Save graphics state.
+  void saveState();
+
+  // Push a new state guard
+  void pushStateGuard();
+
+  // Restore graphics state.
+  void restoreState();
+
+  // Pop to state guard and pop guard
+  void popStateGuard();
+
+  // Get the current graphics state object.
+  GfxState *getState() { return state; }
+
+  GBool checkTransparencyGroup(Dict *resDict);
+
+  void drawForm(Object *str, Dict *resDict, double *matrix, double *bbox,
+              GBool transpGroup = gFalse, GBool softMask = gFalse,
+              GfxColorSpace *blendingColorSpace = NULL,
+              GBool isolated = gFalse, GBool knockout = gFalse,
+              GBool alpha = gFalse, Function *transferFunc = NULL,
+              GfxColor *backdropColor = NULL);
+
+  void pushResources(Dict *resDict);
+  void popResources();
+#ifdef USE_CMS
+  PopplerCache *getIccColorSpaceCache();
+#endif
+
+private:
+
+  PDFDoc *doc;
+  XRef *xref;                  // the xref table for this PDF file
+  Catalog *catalog;            // the Catalog for this PDF file  
+  OutputDev *out;              // output device
+  GBool subPage;               // is this a sub-page object?
+  GBool printCommands;         // print the drawing commands (for debugging)
+  GBool profileCommands;       // profile the drawing commands (for debugging)
+  GBool commandAborted;         // did the previous command abort the drawing?
+  GfxResources *res;           // resource stack
+  int updateLevel;
+
+  GfxState *state;             // current graphics state
+  int stackHeight;             // the height of the current graphics stack
+  std::vector<int> stateGuards;   // a stack of state limits; to guard against unmatched pops
+  GBool fontChanged;           // set if font or text matrix has changed
+  GfxClipType clip;            // do a clip?
+  int ignoreUndef;             // current BX/EX nesting level
+  double baseMatrix[6];                // default matrix for most recent
+                               //   page/form/pattern
+  int formDepth;
+  double textClipBBox[4];      // text clipping bounding box
+  GBool textClipBBoxEmpty;     // true if textClipBBox has not been
+                               //   initialized yet
+  GBool ocState;               // true if drawing is enabled, false if
+                               //   disabled
+
+  MarkedContentStack *mcStack; // current BMC/EMC stack
+
+  Parser *parser;              // parser for page content stream(s)
+
+#ifdef USE_CMS
+  PopplerCache iccColorSpaceCache;
+#endif
+
+  GBool                                // callback to check for an abort
+    (*abortCheckCbk)(void *data);
+  void *abortCheckCbkData;
+
+  static Operator opTab[];     // table of operators
+
+  void go(GBool topLevel);
+  void execOp(Object *cmd, Object args[], int numArgs);
+  Operator *findOp(char *name);
+  GBool checkArg(Object *arg, TchkType type);
+  int getPos();
+
+  int bottomGuard();
+
+  // graphics state operators
+  void opSave(Object args[], int numArgs);
+  void opRestore(Object args[], int numArgs);
+  void opConcat(Object args[], int numArgs);
+  void opSetDash(Object args[], int numArgs);
+  void opSetFlat(Object args[], int numArgs);
+  void opSetLineJoin(Object args[], int numArgs);
+  void opSetLineCap(Object args[], int numArgs);
+  void opSetMiterLimit(Object args[], int numArgs);
+  void opSetLineWidth(Object args[], int numArgs);
+  void opSetExtGState(Object args[], int numArgs);
+  void doSoftMask(Object *str, GBool alpha,
+                 GfxColorSpace *blendingColorSpace,
+                 GBool isolated, GBool knockout,
+                 Function *transferFunc, GfxColor *backdropColor);
+  void opSetRenderingIntent(Object args[], int numArgs);
+
+  // color operators
+  void opSetFillGray(Object args[], int numArgs);
+  void opSetStrokeGray(Object args[], int numArgs);
+  void opSetFillCMYKColor(Object args[], int numArgs);
+  void opSetStrokeCMYKColor(Object args[], int numArgs);
+  void opSetFillRGBColor(Object args[], int numArgs);
+  void opSetStrokeRGBColor(Object args[], int numArgs);
+  void opSetFillColorSpace(Object args[], int numArgs);
+  void opSetStrokeColorSpace(Object args[], int numArgs);
+  void opSetFillColor(Object args[], int numArgs);
+  void opSetStrokeColor(Object args[], int numArgs);
+  void opSetFillColorN(Object args[], int numArgs);
+  void opSetStrokeColorN(Object args[], int numArgs);
+
+  // path segment operators
+  void opMoveTo(Object args[], int numArgs);
+  void opLineTo(Object args[], int numArgs);
+  void opCurveTo(Object args[], int numArgs);
+  void opCurveTo1(Object args[], int numArgs);
+  void opCurveTo2(Object args[], int numArgs);
+  void opRectangle(Object args[], int numArgs);
+  void opClosePath(Object args[], int numArgs);
+
+  // path painting operators
+  void opEndPath(Object args[], int numArgs);
+  void opStroke(Object args[], int numArgs);
+  void opCloseStroke(Object args[], int numArgs);
+  void opFill(Object args[], int numArgs);
+  void opEOFill(Object args[], int numArgs);
+  void opFillStroke(Object args[], int numArgs);
+  void opCloseFillStroke(Object args[], int numArgs);
+  void opEOFillStroke(Object args[], int numArgs);
+  void opCloseEOFillStroke(Object args[], int numArgs);
+  void doPatternFill(GBool eoFill);
+  void doPatternStroke();
+  void doPatternText();
+  void doPatternImageMask(Object *ref, Stream *str, int width, int height,
+                         GBool invert, GBool inlineImg);
+  void doTilingPatternFill(GfxTilingPattern *tPat,
+                          GBool stroke, GBool eoFill, GBool text);
+  void doShadingPatternFill(GfxShadingPattern *sPat,
+                           GBool stroke, GBool eoFill, GBool text);
+  void opShFill(Object args[], int numArgs);
+  void doFunctionShFill(GfxFunctionShading *shading);
+  void doFunctionShFill1(GfxFunctionShading *shading,
+                        double x0, double y0,
+                        double x1, double y1,
+                        GfxColor *colors, int depth);
+  void doAxialShFill(GfxAxialShading *shading);
+  void doRadialShFill(GfxRadialShading *shading);
+  void doGouraudTriangleShFill(GfxGouraudTriangleShading *shading);
+  void gouraudFillTriangle(double x0, double y0, GfxColor *color0,
+                          double x1, double y1, GfxColor *color1,
+                          double x2, double y2, GfxColor *color2,
+                          int nComps, int depth, GfxState::ReusablePathIterator *path);
+  void gouraudFillTriangle(double x0, double y0, double color0,
+                          double x1, double y1, double color1,
+                          double x2, double y2, double color2,
+                          double refineColorThreshold, int depth, GfxGouraudTriangleShading *shading, GfxState::ReusablePathIterator *path);
+  void doPatchMeshShFill(GfxPatchMeshShading *shading);
+  void fillPatch(GfxPatch *patch, int colorComps, int patchColorComps, double refineColorThreshold, int depth, GfxPatchMeshShading *shading);
+  void doEndPath();
+
+  // path clipping operators
+  void opClip(Object args[], int numArgs);
+  void opEOClip(Object args[], int numArgs);
+
+  // text object operators
+  void opBeginText(Object args[], int numArgs);
+  void opEndText(Object args[], int numArgs);
+
+  // text state operators
+  void opSetCharSpacing(Object args[], int numArgs);
+  void opSetFont(Object args[], int numArgs);
+  void opSetTextLeading(Object args[], int numArgs);
+  void opSetTextRender(Object args[], int numArgs);
+  void opSetTextRise(Object args[], int numArgs);
+  void opSetWordSpacing(Object args[], int numArgs);
+  void opSetHorizScaling(Object args[], int numArgs);
+
+  // text positioning operators
+  void opTextMove(Object args[], int numArgs);
+  void opTextMoveSet(Object args[], int numArgs);
+  void opSetTextMatrix(Object args[], int numArgs);
+  void opTextNextLine(Object args[], int numArgs);
+
+  // text string operators
+  void opShowText(Object args[], int numArgs);
+  void opMoveShowText(Object args[], int numArgs);
+  void opMoveSetShowText(Object args[], int numArgs);
+  void opShowSpaceText(Object args[], int numArgs);
+  void doShowText(GooString *s);
+  void doIncCharCount(GooString *s);
+
+  // XObject operators
+  void opXObject(Object args[], int numArgs);
+  void doImage(Object *ref, Stream *str, GBool inlineImg);
+  void doForm(Object *str);
+
+  // in-line image operators
+  void opBeginImage(Object args[], int numArgs);
+  Stream *buildImageStream();
+  void opImageData(Object args[], int numArgs);
+  void opEndImage(Object args[], int numArgs);
+
+  // type 3 font operators
+  void opSetCharWidth(Object args[], int numArgs);
+  void opSetCacheDevice(Object args[], int numArgs);
+
+  // compatibility operators
+  void opBeginIgnoreUndef(Object args[], int numArgs);
+  void opEndIgnoreUndef(Object args[], int numArgs);
+
+  // marked content operators
+  void opBeginMarkedContent(Object args[], int numArgs);
+  void opEndMarkedContent(Object args[], int numArgs);
+  void opMarkPoint(Object args[], int numArgs);
+  GfxState *saveStateStack();
+  void restoreStateStack(GfxState *oldState);
+  GBool contentIsHidden();
+  void pushMarkedContent();
+  void popMarkedContent();
+};
+
+#endif
diff --git a/poppler/GfxFont.cc b/poppler/GfxFont.cc
new file mode 100644 (file)
index 0000000..ea22af8
--- /dev/null
@@ -0,0 +1,2535 @@
+//========================================================================
+//
+// GfxFont.cc
+//
+// Copyright 1996-2003 Glyph & Cog, LLC
+//
+//========================================================================
+
+//========================================================================
+//
+// Modified under the Poppler project - http://poppler.freedesktop.org
+//
+// All changes made under the Poppler project to this file are licensed
+// under GPL version 2 or later
+//
+// Copyright (C) 2005, 2006, 2008-2010, 2012 Albert Astals Cid <aacid@kde.org>
+// Copyright (C) 2005, 2006 Kristian Høgsberg <krh@redhat.com>
+// Copyright (C) 2006 Takashi Iwai <tiwai@suse.de>
+// Copyright (C) 2007 Julien Rebetez <julienr@svn.gnome.org>
+// Copyright (C) 2007 Jeff Muizelaar <jeff@infidigm.net>
+// Copyright (C) 2007 Koji Otani <sho@bbr.jp>
+// Copyright (C) 2007 Ed Catmur <ed@catmur.co.uk>
+// Copyright (C) 2008 Jonathan Kew <jonathan_kew@sil.org>
+// Copyright (C) 2008 Ed Avis <eda@waniasset.com>
+// Copyright (C) 2008, 2010 Hib Eris <hib@hiberis.nl>
+// Copyright (C) 2009 Peter Kerzum <kerzum@yandex-team.ru>
+// Copyright (C) 2009, 2010 David Benjamin <davidben@mit.edu>
+// Copyright (C) 2011 Axel Strübing <axel.struebing@freenet.de>
+// Copyright (C) 2011, 2012 Adrian Johnson <ajohnson@redneon.com>
+// Copyright (C) 2012 Yi Yang <ahyangyi@gmail.com>
+// Copyright (C) 2012 Suzuki Toshiya <mpsuzuki@hiroshima-u.ac.jp>
+// Copyright (C) 2012 Thomas Freitag <Thomas.Freitag@alfa.de>
+//
+// To see a description of the changes please see the Changelog file that
+// came with your tarball or type make ChangeLog if you are building from git
+//
+//========================================================================
+
+#include <config.h>
+
+#ifdef USE_GCC_PRAGMAS
+#pragma implementation
+#endif
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <ctype.h>
+#include <math.h>
+#include <limits.h>
+#include <algorithm>
+#include "goo/gmem.h"
+#include "Error.h"
+#include "Object.h"
+#include "Dict.h"
+#include "GlobalParams.h"
+#include "CMap.h"
+#include "CharCodeToUnicode.h"
+#include "FontEncodingTables.h"
+#include "BuiltinFontTables.h"
+#include "UnicodeTypeTable.h"
+#include <fofi/FoFiIdentifier.h>
+#include <fofi/FoFiType1.h>
+#include <fofi/FoFiType1C.h>
+#include <fofi/FoFiTrueType.h>
+#include "GfxFont.h"
+
+//------------------------------------------------------------------------
+
+struct Base14FontMapEntry {
+  const char *altName;
+  const char *base14Name;
+};
+
+static const Base14FontMapEntry base14FontMap[] = {
+  { "Arial",                        "Helvetica" },
+  { "Arial,Bold",                   "Helvetica-Bold" },
+  { "Arial,BoldItalic",             "Helvetica-BoldOblique" },
+  { "Arial,Italic",                 "Helvetica-Oblique" },
+  { "Arial-Bold",                   "Helvetica-Bold" },
+  { "Arial-BoldItalic",             "Helvetica-BoldOblique" },
+  { "Arial-BoldItalicMT",           "Helvetica-BoldOblique" },
+  { "Arial-BoldMT",                 "Helvetica-Bold" },
+  { "Arial-Italic",                 "Helvetica-Oblique" },
+  { "Arial-ItalicMT",               "Helvetica-Oblique" },
+  { "ArialMT",                      "Helvetica" },
+  { "Courier",                      "Courier" },
+  { "Courier,Bold",                 "Courier-Bold" },
+  { "Courier,BoldItalic",           "Courier-BoldOblique" },
+  { "Courier,Italic",               "Courier-Oblique" },
+  { "Courier-Bold",                 "Courier-Bold" },
+  { "Courier-BoldOblique",          "Courier-BoldOblique" },
+  { "Courier-Oblique",              "Courier-Oblique" },
+  { "CourierNew",                   "Courier" },
+  { "CourierNew,Bold",              "Courier-Bold" },
+  { "CourierNew,BoldItalic",        "Courier-BoldOblique" },
+  { "CourierNew,Italic",            "Courier-Oblique" },
+  { "CourierNew-Bold",              "Courier-Bold" },
+  { "CourierNew-BoldItalic",        "Courier-BoldOblique" },
+  { "CourierNew-Italic",            "Courier-Oblique" },
+  { "CourierNewPS-BoldItalicMT",    "Courier-BoldOblique" },
+  { "CourierNewPS-BoldMT",          "Courier-Bold" },
+  { "CourierNewPS-ItalicMT",        "Courier-Oblique" },
+  { "CourierNewPSMT",               "Courier" },
+  { "Helvetica",                    "Helvetica" },
+  { "Helvetica,Bold",               "Helvetica-Bold" },
+  { "Helvetica,BoldItalic",         "Helvetica-BoldOblique" },
+  { "Helvetica,Italic",             "Helvetica-Oblique" },
+  { "Helvetica-Bold",               "Helvetica-Bold" },
+  { "Helvetica-BoldItalic",         "Helvetica-BoldOblique" },
+  { "Helvetica-BoldOblique",        "Helvetica-BoldOblique" },
+  { "Helvetica-Italic",             "Helvetica-Oblique" },
+  { "Helvetica-Oblique",            "Helvetica-Oblique" },
+  { "Symbol",                       "Symbol" },
+  { "Symbol,Bold",                  "Symbol" },
+  { "Symbol,BoldItalic",            "Symbol" },
+  { "Symbol,Italic",                "Symbol" },
+  { "Times-Bold",                   "Times-Bold" },
+  { "Times-BoldItalic",             "Times-BoldItalic" },
+  { "Times-Italic",                 "Times-Italic" },
+  { "Times-Roman",                  "Times-Roman" },
+  { "TimesNewRoman",                "Times-Roman" },
+  { "TimesNewRoman,Bold",           "Times-Bold" },
+  { "TimesNewRoman,BoldItalic",     "Times-BoldItalic" },
+  { "TimesNewRoman,Italic",         "Times-Italic" },
+  { "TimesNewRoman-Bold",           "Times-Bold" },
+  { "TimesNewRoman-BoldItalic",     "Times-BoldItalic" },
+  { "TimesNewRoman-Italic",         "Times-Italic" },
+  { "TimesNewRomanPS",              "Times-Roman" },
+  { "TimesNewRomanPS-Bold",         "Times-Bold" },
+  { "TimesNewRomanPS-BoldItalic",   "Times-BoldItalic" },
+  { "TimesNewRomanPS-BoldItalicMT", "Times-BoldItalic" },
+  { "TimesNewRomanPS-BoldMT",       "Times-Bold" },
+  { "TimesNewRomanPS-Italic",       "Times-Italic" },
+  { "TimesNewRomanPS-ItalicMT",     "Times-Italic" },
+  { "TimesNewRomanPSMT",            "Times-Roman" },
+  { "TimesNewRomanPSMT,Bold",       "Times-Bold" },
+  { "TimesNewRomanPSMT,BoldItalic", "Times-BoldItalic" },
+  { "TimesNewRomanPSMT,Italic",     "Times-Italic" },
+  { "ZapfDingbats",                 "ZapfDingbats" }
+};
+
+//------------------------------------------------------------------------
+
+// index: {fixed:0, sans-serif:4, serif:8} + bold*2 + italic
+// NB: must be in same order as psSubstFonts in PSOutputDev.cc
+static const char *base14SubstFonts[14] = {
+  "Courier",
+  "Courier-Oblique",
+  "Courier-Bold",
+  "Courier-BoldOblique",
+  "Helvetica",
+  "Helvetica-Oblique",
+  "Helvetica-Bold",
+  "Helvetica-BoldOblique",
+  "Times-Roman",
+  "Times-Italic",
+  "Times-Bold",
+  "Times-BoldItalic",
+  // the last two are never used for substitution
+  "Symbol",
+  "ZapfDingbats"
+};
+
+//------------------------------------------------------------------------
+
+static int parseCharName(char *charName, Unicode *uBuf, int uLen,
+                        GBool names, GBool ligatures, 
+                        GBool numeric, GBool hex, GBool variants);
+
+//------------------------------------------------------------------------
+
+static int readFromStream(void *data) {
+  return ((Stream *)data)->getChar();
+}
+
+//------------------------------------------------------------------------
+// GfxFontLoc
+//------------------------------------------------------------------------
+
+GfxFontLoc::GfxFontLoc() {
+  path = NULL;
+  fontNum = 0;
+  encoding = NULL;
+  substIdx = -1;
+}
+
+GfxFontLoc::~GfxFontLoc() {
+  if (path) {
+    delete path;
+  }
+  if (encoding) {
+    delete encoding;
+  }
+}
+
+//------------------------------------------------------------------------
+// GfxFont
+//------------------------------------------------------------------------
+
+GfxFont *GfxFont::makeFont(XRef *xref, const char *tagA, Ref idA, Dict *fontDict) {
+  GooString *nameA;
+  Ref embFontIDA;
+  GfxFontType typeA;
+  GfxFont *font;
+  Object obj1;
+
+  // get base font name
+  nameA = NULL;
+  fontDict->lookup("BaseFont", &obj1);
+  if (obj1.isName()) {
+    nameA = new GooString(obj1.getName());
+  }
+  obj1.free();
+
+  // get embedded font ID and font type
+  typeA = getFontType(xref, fontDict, &embFontIDA);
+
+  // create the font object
+  font = NULL;
+  if (typeA < fontCIDType0) {
+    font = new Gfx8BitFont(xref, tagA, idA, nameA, typeA, embFontIDA,
+                          fontDict);
+  } else {
+    font = new GfxCIDFont(xref, tagA, idA, nameA, typeA, embFontIDA,
+                         fontDict);
+  }
+
+  return font;
+}
+
+GfxFont::GfxFont(const char *tagA, Ref idA, GooString *nameA,
+                GfxFontType typeA, Ref embFontIDA) {
+  ok = gFalse;
+  tag = new GooString(tagA);
+  id = idA;
+  name = nameA;
+  type = typeA;
+  embFontID = embFontIDA;
+  embFontName = NULL;
+  family = NULL;
+  stretch = StretchNotDefined;
+  weight = WeightNotDefined;
+  refCnt = 1;
+  encodingName = new GooString("");
+  hasToUnicode = gFalse;
+}
+
+GfxFont::~GfxFont() {
+  delete tag;
+  delete family;
+  if (name) {
+    delete name;
+  }
+  if (embFontName) {
+    delete embFontName;
+  }
+  if (encodingName) {
+    delete encodingName;
+  }
+}
+
+void GfxFont::incRefCnt() {
+  refCnt++;
+}
+
+void GfxFont::decRefCnt() {
+  if (--refCnt == 0)
+    delete this;
+}
+
+// This function extracts three pieces of information:
+// 1. the "expected" font type, i.e., the font type implied by
+//    Font.Subtype, DescendantFont.Subtype, and
+//    FontDescriptor.FontFile3.Subtype
+// 2. the embedded font object ID
+// 3. the actual font type - determined by examining the embedded font
+//    if there is one, otherwise equal to the expected font type
+// If the expected and actual font types don't match, a warning
+// message is printed.  The expected font type is not used for
+// anything else.
+GfxFontType GfxFont::getFontType(XRef *xref, Dict *fontDict, Ref *embID) {
+  GfxFontType t, expectedType;
+  FoFiIdentifierType fft;
+  Dict *fontDict2;
+  Object subtype, fontDesc, obj1, obj2, obj3, obj4;
+  GBool isType0, err;
+
+  t = fontUnknownType;
+  embID->num = embID->gen = -1;
+  err = gFalse;
+
+  fontDict->lookup("Subtype", &subtype);
+  expectedType = fontUnknownType;
+  isType0 = gFalse;
+  if (subtype.isName("Type1") || subtype.isName("MMType1")) {
+    expectedType = fontType1;
+  } else if (subtype.isName("Type1C")) {
+    expectedType = fontType1C;
+  } else if (subtype.isName("Type3")) {
+    expectedType = fontType3;
+  } else if (subtype.isName("TrueType")) {
+    expectedType = fontTrueType;
+  } else if (subtype.isName("Type0")) {
+    isType0 = gTrue;
+  } else {
+    error(errSyntaxWarning, -1, "Unknown font type: '{0:s}'",
+         subtype.isName() ? subtype.getName() : "???");
+  }
+  subtype.free();
+
+  fontDict2 = fontDict;
+  if (fontDict->lookup("DescendantFonts", &obj1)->isArray()) {
+    if (obj1.arrayGetLength() == 0) {
+      error(errSyntaxWarning, -1, "Empty DescendantFonts array in font");
+      obj2.initNull();
+    } else if (obj1.arrayGet(0, &obj2)->isDict()) {
+      if (!isType0) {
+       error(errSyntaxWarning, -1, "Non-CID font with DescendantFonts array");
+      }
+      fontDict2 = obj2.getDict();
+      fontDict2->lookup("Subtype", &subtype);
+      if (subtype.isName("CIDFontType0")) {
+       if (isType0) {
+         expectedType = fontCIDType0;
+       }
+      } else if (subtype.isName("CIDFontType2")) {
+       if (isType0) {
+         expectedType = fontCIDType2;
+       }
+      }
+      subtype.free();
+    }
+  } else {
+    obj2.initNull();
+  }
+
+  if (fontDict2->lookup("FontDescriptor", &fontDesc)->isDict()) {
+    if (fontDesc.dictLookupNF("FontFile", &obj3)->isRef()) {
+      *embID = obj3.getRef();
+      if (expectedType != fontType1) {
+       err = gTrue;
+      }
+    }
+    obj3.free();
+    if (embID->num == -1 &&
+       fontDesc.dictLookupNF("FontFile2", &obj3)->isRef()) {
+      *embID = obj3.getRef();
+      if (isType0) {
+       expectedType = fontCIDType2;
+      } else if (expectedType != fontTrueType) {
+       err = gTrue;
+      }
+    }
+    obj3.free();
+    if (embID->num == -1 &&
+       fontDesc.dictLookupNF("FontFile3", &obj3)->isRef()) {
+      *embID = obj3.getRef();
+      if (obj3.fetch(xref, &obj4)->isStream()) {
+       obj4.streamGetDict()->lookup("Subtype", &subtype);
+       if (subtype.isName("Type1")) {
+         if (expectedType != fontType1) {
+           err = gTrue;
+           expectedType = isType0 ? fontCIDType0 : fontType1;
+         }
+       } else if (subtype.isName("Type1C")) {
+         if (expectedType == fontType1) {
+           expectedType = fontType1C;
+         } else if (expectedType != fontType1C) {
+           err = gTrue;
+           expectedType = isType0 ? fontCIDType0C : fontType1C;
+         }
+       } else if (subtype.isName("TrueType")) {
+         if (expectedType != fontTrueType) {
+           err = gTrue;
+           expectedType = isType0 ? fontCIDType2 : fontTrueType;
+         }
+       } else if (subtype.isName("CIDFontType0C")) {
+         if (expectedType == fontCIDType0) {
+           expectedType = fontCIDType0C;
+         } else {
+           err = gTrue;
+           expectedType = isType0 ? fontCIDType0C : fontType1C;
+         }
+       } else if (subtype.isName("OpenType")) {
+         if (expectedType == fontTrueType) {
+           expectedType = fontTrueTypeOT;
+         } else if (expectedType == fontType1) {
+           expectedType = fontType1COT;
+         } else if (expectedType == fontCIDType0) {
+           expectedType = fontCIDType0COT;
+         } else if (expectedType == fontCIDType2) {
+           expectedType = fontCIDType2OT;
+         } else {
+           err = gTrue;
+         }
+       } else {
+         error(errSyntaxError, -1, "Unknown font type '{0:s}'",
+               subtype.isName() ? subtype.getName() : "???");
+       }
+       subtype.free();
+      }
+      obj4.free();
+    }
+    obj3.free();
+  }
+  fontDesc.free();
+
+  t = fontUnknownType;
+  if (embID->num >= 0) {
+    obj3.initRef(embID->num, embID->gen);
+    obj3.fetch(xref, &obj4);
+    if (obj4.isStream()) {
+      obj4.streamReset();
+      fft = FoFiIdentifier::identifyStream(&readFromStream, obj4.getStream());
+      obj4.streamClose();
+      switch (fft) {
+      case fofiIdType1PFA:
+      case fofiIdType1PFB:
+       t = fontType1;
+       break;
+      case fofiIdCFF8Bit:
+       t = isType0 ? fontCIDType0C : fontType1C;
+       break;
+      case fofiIdCFFCID:
+       t = fontCIDType0C;
+       break;
+      case fofiIdTrueType:
+      case fofiIdTrueTypeCollection:
+       t = isType0 ? fontCIDType2 : fontTrueType;
+       break;
+      case fofiIdOpenTypeCFF8Bit:
+       t = expectedType; // hack: open type always == expected type? s. bug-poppler20605.pdf
+       break;
+      case fofiIdOpenTypeCFFCID:
+       t = fontCIDType0COT;
+       break;
+      default:
+       error(errSyntaxError, -1, "Embedded font file may be invalid");
+       break;
+      }
+    }
+    obj4.free();
+    obj3.free();
+  }
+
+  if (t == fontUnknownType) {
+    t = expectedType;
+  }
+
+  if (t != expectedType) {
+    err = gTrue;
+  }
+
+  if (err) {
+    error(errSyntaxWarning, -1,
+         "Mismatch between font type and embedded font file");
+  }
+
+  obj2.free();
+  obj1.free();
+
+  return t;
+}
+
+void GfxFont::readFontDescriptor(XRef *xref, Dict *fontDict) {
+  Object obj1, obj2, obj3, obj4;
+  double t;
+  int i;
+
+  // assume Times-Roman by default (for substitution purposes)
+  flags = fontSerif;
+
+  missingWidth = 0;
+
+  if (fontDict->lookup("FontDescriptor", &obj1)->isDict()) {
+
+    // get flags
+    if (obj1.dictLookup("Flags", &obj2)->isInt()) {
+      flags = obj2.getInt();
+    }
+    obj2.free();
+
+    // get name
+    obj1.dictLookup("FontName", &obj2);
+    if (obj2.isName()) {
+      embFontName = new GooString(obj2.getName());
+    }
+    obj2.free();
+    if (embFontName == NULL) {
+      // get name with typo
+      obj1.dictLookup("Fontname", &obj2);
+      if (obj2.isName()) {
+        embFontName = new GooString(obj2.getName());
+        error(errSyntaxWarning, -1, "The file uses Fontname instead of FontName please notify the creator that the file is broken");
+      }
+      obj2.free();
+    }
+
+    // get family
+    obj1.dictLookup("FontFamily", &obj2);
+    if (obj2.isString()) family = new GooString(obj2.getString());
+    obj2.free();
+
+    // get stretch
+    obj1.dictLookup("FontStretch", &obj2);
+    if (obj2.isName()) {
+      if (strcmp(obj2.getName(), "UltraCondensed") == 0) stretch = UltraCondensed;
+      else if (strcmp(obj2.getName(), "ExtraCondensed") == 0) stretch = ExtraCondensed;
+      else if (strcmp(obj2.getName(), "Condensed") == 0) stretch = Condensed;
+      else if (strcmp(obj2.getName(), "SemiCondensed") == 0) stretch = SemiCondensed;
+      else if (strcmp(obj2.getName(), "Normal") == 0) stretch = Normal;
+      else if (strcmp(obj2.getName(), "SemiExpanded") == 0) stretch = SemiExpanded;
+      else if (strcmp(obj2.getName(), "Expanded") == 0) stretch = Expanded;
+      else if (strcmp(obj2.getName(), "ExtraExpanded") == 0) stretch = ExtraExpanded;
+      else if (strcmp(obj2.getName(), "UltraExpanded") == 0) stretch = UltraExpanded;
+      else error(errSyntaxWarning, -1, "Invalid Font Stretch");
+    }
+    obj2.free();
+    
+    // get weight
+    obj1.dictLookup("FontWeight", &obj2);
+    if (obj2.isNum()) {
+      if (obj2.getNum() == 100) weight = W100;
+      else if (obj2.getNum() == 200) weight = W200;
+      else if (obj2.getNum() == 300) weight = W300;
+      else if (obj2.getNum() == 400) weight = W400;
+      else if (obj2.getNum() == 500) weight = W500;
+      else if (obj2.getNum() == 600) weight = W600;
+      else if (obj2.getNum() == 700) weight = W700;
+      else if (obj2.getNum() == 800) weight = W800;
+      else if (obj2.getNum() == 900) weight = W900;
+      else error(errSyntaxWarning, -1, "Invalid Font Weight");
+    }
+    obj2.free();
+
+    // look for MissingWidth
+    obj1.dictLookup("MissingWidth", &obj2);
+    if (obj2.isNum()) {
+      missingWidth = obj2.getNum();
+    }
+    obj2.free();
+
+    // get Ascent and Descent
+    obj1.dictLookup("Ascent", &obj2);
+    if (obj2.isNum()) {
+      t = 0.001 * obj2.getNum();
+      // some broken font descriptors specify a negative ascent
+      if (t < 0) {
+       t = -t;
+      }
+      // some broken font descriptors set ascent and descent to 0;
+      // others set it to ridiculous values (e.g., 32768)
+      if (t != 0 && t < 3) {
+       ascent = t;
+      }
+    }
+    obj2.free();
+    obj1.dictLookup("Descent", &obj2);
+    if (obj2.isNum()) {
+      t = 0.001 * obj2.getNum();
+      // some broken font descriptors specify a positive descent
+      if (t > 0) {
+       t = -t;
+      }
+      // some broken font descriptors set ascent and descent to 0
+      if (t != 0 && t > -3) {
+       descent = t;
+      }
+    }
+    obj2.free();
+
+    // font FontBBox
+    if (obj1.dictLookup("FontBBox", &obj2)->isArray()) {
+      for (i = 0; i < 4 && i < obj2.arrayGetLength(); ++i) {
+       if (obj2.arrayGet(i, &obj3)->isNum()) {
+         fontBBox[i] = 0.001 * obj3.getNum();
+       }
+       obj3.free();
+      }
+    }
+    obj2.free();
+
+  }
+  obj1.free();
+}
+
+CharCodeToUnicode *GfxFont::readToUnicodeCMap(Dict *fontDict, int nBits,
+                                             CharCodeToUnicode *ctu) {
+  GooString *buf;
+  Object obj1;
+
+  if (!fontDict->lookup("ToUnicode", &obj1)->isStream()) {
+    obj1.free();
+    return NULL;
+  }
+  buf = new GooString();
+  obj1.getStream()->fillGooString(buf);
+  obj1.streamClose();
+  obj1.free();
+  if (ctu) {
+    ctu->mergeCMap(buf, nBits);
+  } else {
+    ctu = CharCodeToUnicode::parseCMap(buf, nBits);
+  }
+  hasToUnicode = gTrue;
+  delete buf;
+  return ctu;
+}
+
+GfxFontLoc *GfxFont::locateFont(XRef *xref, GBool ps) {
+  GfxFontLoc *fontLoc;
+  SysFontType sysFontType;
+  GooString *path, *base14Name, *substName;
+  PSFontParam16 *psFont16;
+  Object refObj, embFontObj;
+  int substIdx, fontNum;
+  GBool embed;
+
+  if (type == fontType3) {
+    return NULL;
+  }
+
+  //----- embedded font
+  if (embFontID.num >= 0) {
+    embed = gTrue;
+    refObj.initRef(embFontID.num, embFontID.gen);
+    refObj.fetch(xref, &embFontObj);
+    if (!embFontObj.isStream()) {
+      error(errSyntaxError, -1, "Embedded font object is wrong type");
+      embed = gFalse;
+    }
+    embFontObj.free();
+    refObj.free();
+    if (embed) {
+      if (ps) {
+       switch (type) {
+       case fontType1:
+       case fontType1C:
+       case fontType1COT:
+         embed = globalParams->getPSEmbedType1();
+         break;
+       case fontTrueType:
+       case fontTrueTypeOT:
+         embed = globalParams->getPSEmbedTrueType();
+         break;
+       case fontCIDType0C:
+       case fontCIDType0COT:
+         embed = globalParams->getPSEmbedCIDPostScript();
+         break;
+       case fontCIDType2:
+       case fontCIDType2OT:
+         embed = globalParams->getPSEmbedCIDTrueType();
+         break;
+       default:
+         break;
+       }
+      }
+      if (embed) {
+       fontLoc = new GfxFontLoc();
+       fontLoc->locType = gfxFontLocEmbedded;
+       fontLoc->fontType = type;
+       fontLoc->embFontID = embFontID;
+       return fontLoc;
+      }
+    }
+  }
+
+  //----- PS passthrough
+  if (ps && !isCIDFont() && globalParams->getPSFontPassthrough()) {
+    fontLoc = new GfxFontLoc();
+    fontLoc->locType = gfxFontLocResident;
+    fontLoc->fontType = fontType1;
+    fontLoc->path = name->copy();
+    return fontLoc;
+  }
+
+  //----- PS resident Base-14 font
+  if (ps && !isCIDFont() && ((Gfx8BitFont *)this)->base14) {
+    fontLoc = new GfxFontLoc();
+    fontLoc->locType = gfxFontLocResident;
+    fontLoc->fontType = fontType1;
+    fontLoc->path = new GooString(((Gfx8BitFont *)this)->base14->base14Name);
+    return fontLoc;
+  }
+
+  //----- external font file (fontFile, fontDir)
+  if (name && (path = globalParams->findFontFile(name))) {
+    if ((fontLoc = getExternalFont(path, isCIDFont()))) {
+      return fontLoc;
+    }
+  }
+
+  //----- external font file for Base-14 font
+  if (!ps && !isCIDFont() && ((Gfx8BitFont *)this)->base14) {
+    base14Name = new GooString(((Gfx8BitFont *)this)->base14->base14Name);
+    if ((path = globalParams->findBase14FontFile(base14Name, this))) {
+      if ((fontLoc = getExternalFont(path, gFalse))) {
+       delete base14Name;
+       return fontLoc;
+      }
+    }
+    delete base14Name;
+  }
+
+  //----- system font
+  if ((path = globalParams->findSystemFontFile(this, &sysFontType,
+                                              &fontNum))) {
+    if (isCIDFont()) {
+      if (sysFontType == sysFontTTF || sysFontType == sysFontTTC) {
+       fontLoc = new GfxFontLoc();
+       fontLoc->locType = gfxFontLocExternal;
+       fontLoc->fontType = fontCIDType2;
+       fontLoc->path = path;
+       fontLoc->fontNum = fontNum;
+       return fontLoc;
+      }
+    } else {
+      if (sysFontType == sysFontTTF || sysFontType == sysFontTTC) {
+       fontLoc = new GfxFontLoc();
+       fontLoc->locType = gfxFontLocExternal;
+       fontLoc->fontType = fontTrueType;
+       fontLoc->path = path;
+       return fontLoc;
+      } else if (sysFontType == sysFontPFA || sysFontType == sysFontPFB) {
+       fontLoc = new GfxFontLoc();
+       fontLoc->locType = gfxFontLocExternal;
+       fontLoc->fontType = fontType1;
+       fontLoc->path = path;
+       fontLoc->fontNum = fontNum;
+       return fontLoc;
+      }
+    }
+    delete path;
+  }
+
+  if (!isCIDFont()) {
+
+    //----- 8-bit PS resident font
+    if (name && ps) {
+      if ((path = globalParams->getPSResidentFont(name))) {
+       fontLoc = new GfxFontLoc();
+       fontLoc->locType = gfxFontLocResident;
+       fontLoc->fontType = fontType1;
+       fontLoc->path = path;
+       return fontLoc;
+      }
+    }
+
+    //----- 8-bit font substitution
+    if (flags & fontFixedWidth) {
+      substIdx = 0;
+    } else if (flags & fontSerif) {
+      substIdx = 8;
+    } else {
+      substIdx = 4;
+    }
+    if (isBold()) {
+      substIdx += 2;
+    }
+    if (isItalic()) {
+      substIdx += 1;
+    }
+    substName = new GooString(base14SubstFonts[substIdx]);
+    if (ps) {
+      error(errSyntaxWarning, -1, "Substituting font '{0:s}' for '{1:t}'",
+           base14SubstFonts[substIdx], name ? name : new GooString("null"));
+      fontLoc = new GfxFontLoc();
+      fontLoc->locType = gfxFontLocResident;
+      fontLoc->fontType = fontType1;
+      fontLoc->path = substName;
+      fontLoc->substIdx = substIdx;
+      return fontLoc;
+    } else {
+      path = globalParams->findFontFile(substName);
+      delete substName;
+      if (path) {
+       if ((fontLoc = getExternalFont(path, gFalse))) {
+         error(errSyntaxWarning, -1, "Substituting font '{0:s}' for '{1:t}'",
+                 base14SubstFonts[substIdx], (name == NULL) ? new GooString("") : name);
+         name = new GooString(base14SubstFonts[substIdx]);
+         fontLoc->substIdx = substIdx;
+         return fontLoc;
+       }
+      }
+    }
+
+    // failed to find a substitute font
+    return NULL;
+  }
+
+  //----- 16-bit PS resident font
+  if (ps && ((psFont16 = globalParams->getPSResidentFont16(
+                                        name,
+                                        ((GfxCIDFont *)this)->getWMode())))) {
+    fontLoc = new GfxFontLoc();
+    fontLoc->locType = gfxFontLocResident;
+    fontLoc->fontType = fontCIDType0; // this is not used
+    fontLoc->path = psFont16->psFontName->copy();
+    fontLoc->encoding = psFont16->encoding->copy();
+    fontLoc->wMode = psFont16->wMode;
+    return fontLoc;
+  }
+  if (ps && ((psFont16 = globalParams->getPSResidentFontCC(
+                                ((GfxCIDFont *)this)->getCollection(),
+                                ((GfxCIDFont *)this)->getWMode())))) {
+    error(errSyntaxWarning, -1, "Substituting font '{0:t}' for '{1:t}'",
+         psFont16->psFontName, name);
+    fontLoc = new GfxFontLoc();
+    fontLoc->locType = gfxFontLocResident;
+    fontLoc->fontType = fontCIDType0; // this is not used
+    fontLoc->path = psFont16->psFontName->copy();
+    fontLoc->encoding = psFont16->encoding->copy();
+    fontLoc->wMode = psFont16->wMode;
+    return fontLoc;
+  }
+
+  //----- CID font substitution
+  if ((path = globalParams->findCCFontFile(
+                               ((GfxCIDFont *)this)->getCollection()))) {
+    if ((fontLoc = getExternalFont(path, gTrue))) {
+      error(errSyntaxWarning, -1, "Substituting font '{0:t}' for '{1:t}'",
+           fontLoc->path, name);
+      return fontLoc;
+    }
+  }
+
+  // failed to find a substitute font
+  return NULL;
+}
+
+GfxFontLoc *GfxFont::locateBase14Font(GooString *base14Name) {
+  GooString *path;
+
+  path = globalParams->findFontFile(base14Name);
+  if (!path) {
+    return NULL;
+  }
+  return getExternalFont(path, gFalse);
+}
+
+GfxFontLoc *GfxFont::getExternalFont(GooString *path, GBool cid) {
+  FoFiIdentifierType fft;
+  GfxFontType fontType;
+  GfxFontLoc *fontLoc;
+
+  fft = FoFiIdentifier::identifyFile(path->getCString());
+  switch (fft) {
+  case fofiIdType1PFA:
+  case fofiIdType1PFB:
+    fontType = fontType1;
+    break;
+  case fofiIdCFF8Bit:
+    fontType = fontType1C;
+    break;
+  case fofiIdCFFCID:
+    fontType = fontCIDType0C;
+    break;
+  case fofiIdTrueType:
+  case fofiIdTrueTypeCollection:
+    fontType = cid ? fontCIDType2 : fontTrueType;
+    break;
+  case fofiIdOpenTypeCFF8Bit:
+    fontType = fontType1COT;
+    break;
+  case fofiIdOpenTypeCFFCID:
+    fontType = fontCIDType0COT;
+    break;
+  case fofiIdUnknown:
+  case fofiIdError:
+  default:
+    fontType = fontUnknownType;
+    break;
+  }
+  if (fontType == fontUnknownType ||
+      (cid ? (fontType < fontCIDType0)
+           : (fontType >= fontCIDType0))) {
+    delete path;
+    return NULL;
+  }
+  fontLoc = new GfxFontLoc();
+  fontLoc->locType = gfxFontLocExternal;
+  fontLoc->fontType = fontType;
+  fontLoc->path = path;
+  return fontLoc;
+}
+
+char *GfxFont::readEmbFontFile(XRef *xref, int *len) {
+  char *buf;
+  Object obj1, obj2;
+  Stream *str;
+
+  obj1.initRef(embFontID.num, embFontID.gen);
+  obj1.fetch(xref, &obj2);
+  if (!obj2.isStream()) {
+    error(errSyntaxError, -1, "Embedded font file is not a stream");
+    obj2.free();
+    obj1.free();
+    embFontID.num = -1;
+    *len = 0;
+    return NULL;
+  }
+  str = obj2.getStream();
+
+  buf = (char*)str->toUnsignedChars(len);
+  str->close();
+
+  obj2.free();
+  obj1.free();
+
+  return buf;
+}
+
+//------------------------------------------------------------------------
+// Gfx8BitFont
+//------------------------------------------------------------------------
+
+Gfx8BitFont::Gfx8BitFont(XRef *xref, const char *tagA, Ref idA, GooString *nameA,
+                        GfxFontType typeA, Ref embFontIDA, Dict *fontDict):
+  GfxFont(tagA, idA, nameA, typeA, embFontIDA) {
+  GooString *name2;
+  BuiltinFont *builtinFont;
+  const char **baseEnc;
+  GBool baseEncFromFontFile;
+  char *buf;
+  int len;
+  FoFiType1 *ffT1;
+  FoFiType1C *ffT1C;
+  int code;
+  char *charName;
+  GBool missing, hex;
+  Unicode toUnicode[256];
+  CharCodeToUnicode *utu, *ctu2;
+  Unicode uBuf[8];
+  double mul;
+  int firstChar, lastChar;
+  Gushort w;
+  Object obj1, obj2, obj3;
+  int n, i, a, b, m;
+
+  refCnt = 1;
+  ctu = NULL;
+
+  // do font name substitution for various aliases of the Base 14 font
+  // names
+  base14 = NULL;
+  if (name) {
+    name2 = name->copy();
+    i = 0;
+    while (i < name2->getLength()) {
+      if (name2->getChar(i) == ' ') {
+       name2->del(i);
+      } else {
+       ++i;
+      }
+    }
+    a = 0;
+    b = sizeof(base14FontMap) / sizeof(Base14FontMapEntry);
+    // invariant: base14FontMap[a].altName <= name2 < base14FontMap[b].altName
+    while (b - a > 1) {
+      m = (a + b) / 2;
+      if (name2->cmp(base14FontMap[m].altName) >= 0) {
+       a = m;
+      } else {
+       b = m;
+      }
+    }
+    if (!name2->cmp(base14FontMap[a].altName)) {
+      base14 = &base14FontMap[a];
+    }
+    delete name2;
+  }
+
+  // is it a built-in font?
+  builtinFont = NULL;
+  if (base14) {
+    for (i = 0; i < nBuiltinFonts; ++i) {
+      if (!strcmp(base14->base14Name, builtinFonts[i].name)) {
+       builtinFont = &builtinFonts[i];
+       break;
+      }
+    }
+  }
+
+  // default ascent/descent values
+  if (builtinFont) {
+    ascent = 0.001 * builtinFont->ascent;
+    descent = 0.001 * builtinFont->descent;
+    fontBBox[0] = 0.001 * builtinFont->bbox[0];
+    fontBBox[1] = 0.001 * builtinFont->bbox[1];
+    fontBBox[2] = 0.001 * builtinFont->bbox[2];
+    fontBBox[3] = 0.001 * builtinFont->bbox[3];
+  } else {
+    ascent = 0.95;
+    descent = -0.35;
+    fontBBox[0] = fontBBox[1] = fontBBox[2] = fontBBox[3] = 0;
+  }
+
+  // get info from font descriptor
+  readFontDescriptor(xref, fontDict);
+
+  // for non-embedded fonts, don't trust the ascent/descent/bbox
+  // values from the font descriptor
+  if (builtinFont && embFontID.num < 0) {
+    ascent = 0.001 * builtinFont->ascent;
+    descent = 0.001 * builtinFont->descent;
+    fontBBox[0] = 0.001 * builtinFont->bbox[0];
+    fontBBox[1] = 0.001 * builtinFont->bbox[1];
+    fontBBox[2] = 0.001 * builtinFont->bbox[2];
+    fontBBox[3] = 0.001 * builtinFont->bbox[3];
+  }
+
+  // get font matrix
+  fontMat[0] = fontMat[3] = 1;
+  fontMat[1] = fontMat[2] = fontMat[4] = fontMat[5] = 0;
+  if (fontDict->lookup("FontMatrix", &obj1)->isArray()) {
+    for (i = 0; i < 6 && i < obj1.arrayGetLength(); ++i) {
+      if (obj1.arrayGet(i, &obj2)->isNum()) {
+       fontMat[i] = obj2.getNum();
+      }
+      obj2.free();
+    }
+  }
+  obj1.free();
+
+  // get Type 3 bounding box, font definition, and resources
+  if (type == fontType3) {
+    if (fontDict->lookup("FontBBox", &obj1)->isArray()) {
+      for (i = 0; i < 4 && i < obj1.arrayGetLength(); ++i) {
+       if (obj1.arrayGet(i, &obj2)->isNum()) {
+         fontBBox[i] = obj2.getNum();
+       }
+       obj2.free();
+      }
+    }
+    obj1.free();
+    if (!fontDict->lookup("CharProcs", &charProcs)->isDict()) {
+      error(errSyntaxError, -1,
+           "Missing or invalid CharProcs dictionary in Type 3 font");
+      charProcs.free();
+    }
+    if (!fontDict->lookup("Resources", &resources)->isDict()) {
+      resources.free();
+    }
+  }
+
+  //----- build the font encoding -----
+
+  // Encodings start with a base encoding, which can come from
+  // (in order of priority):
+  //   1. FontDict.Encoding or FontDict.Encoding.BaseEncoding
+  //        - MacRoman / MacExpert / WinAnsi / Standard
+  //   2. embedded or external font file
+  //   3. default:
+  //        - builtin --> builtin encoding
+  //        - TrueType --> WinAnsiEncoding
+  //        - others --> StandardEncoding
+  // and then add a list of differences (if any) from
+  // FontDict.Encoding.Differences.
+
+  // check FontDict for base encoding
+  hasEncoding = gFalse;
+  usesMacRomanEnc = gFalse;
+  baseEnc = NULL;
+  baseEncFromFontFile = gFalse;
+  fontDict->lookup("Encoding", &obj1);
+  if (obj1.isDict()) {
+    obj1.dictLookup("BaseEncoding", &obj2);
+    if (obj2.isName("MacRomanEncoding")) {
+      hasEncoding = gTrue;
+      usesMacRomanEnc = gTrue;
+      baseEnc = macRomanEncoding;
+    } else if (obj2.isName("MacExpertEncoding")) {
+      hasEncoding = gTrue;
+      baseEnc = macExpertEncoding;
+    } else if (obj2.isName("WinAnsiEncoding")) {
+      hasEncoding = gTrue;
+      baseEnc = winAnsiEncoding;
+    }
+    obj2.free();
+  } else if (obj1.isName("MacRomanEncoding")) {
+    hasEncoding = gTrue;
+    usesMacRomanEnc = gTrue;
+    baseEnc = macRomanEncoding;
+  } else if (obj1.isName("MacExpertEncoding")) {
+    hasEncoding = gTrue;
+    baseEnc = macExpertEncoding;
+  } else if (obj1.isName("WinAnsiEncoding")) {
+    hasEncoding = gTrue;
+    baseEnc = winAnsiEncoding;
+  }
+
+  // check embedded font file for base encoding
+  // (only for Type 1 fonts - trying to get an encoding out of a
+  // TrueType font is a losing proposition)
+  ffT1 = NULL;
+  ffT1C = NULL;
+  buf = NULL;
+  if (type == fontType1 && embFontID.num >= 0) {
+    if ((buf = readEmbFontFile(xref, &len))) {
+      if ((ffT1 = FoFiType1::make(buf, len))) {
+       if (ffT1->getName()) {
+         if (embFontName) {
+           delete embFontName;
+         }
+         embFontName = new GooString(ffT1->getName());
+       }
+       if (!baseEnc) {
+         baseEnc = (const char **)ffT1->getEncoding();
+         baseEncFromFontFile = gTrue;
+       }
+      }
+      gfree(buf);
+    }
+  } else if (type == fontType1C && embFontID.num >= 0) {
+    if ((buf = readEmbFontFile(xref, &len))) {
+      if ((ffT1C = FoFiType1C::make(buf, len))) {
+       if (ffT1C->getName()) {
+         if (embFontName) {
+           delete embFontName;
+         }
+         embFontName = new GooString(ffT1C->getName());
+       }
+       if (!baseEnc) {
+         baseEnc = (const char **)ffT1C->getEncoding();
+         baseEncFromFontFile = gTrue;
+       }
+      }
+      gfree(buf);
+    }
+  }
+
+  // get default base encoding
+  if (!baseEnc) {
+    if (builtinFont && embFontID.num < 0) {
+      baseEnc = builtinFont->defaultBaseEnc;
+      hasEncoding = gTrue;
+    } else if (type == fontTrueType) {
+      baseEnc = winAnsiEncoding;
+    } else {
+      baseEnc = standardEncoding;
+    }
+  }
+
+  if (baseEncFromFontFile) {
+    encodingName->Set("Builtin");
+  } else if (baseEnc == winAnsiEncoding) {
+    encodingName->Set("WinAnsi");
+  } else if (baseEnc == macRomanEncoding) {
+    encodingName->Set("MacRoman");
+  } else if (baseEnc == macExpertEncoding) {
+    encodingName->Set("MacExpert");
+  } else if (baseEnc == symbolEncoding) {
+    encodingName->Set("Symbol");
+  } else if (baseEnc == zapfDingbatsEncoding) {
+    encodingName->Set("ZapfDingbats");
+  } else {
+    encodingName->Set("Standard");
+  }
+
+  // copy the base encoding
+  for (i = 0; i < 256; ++i) {
+    enc[i] = (char *)baseEnc[i];
+    if ((encFree[i] = baseEncFromFontFile) && enc[i]) {
+      enc[i] = copyString(baseEnc[i]);
+    }
+  }
+
+  // some Type 1C font files have empty encodings, which can break the
+  // T1C->T1 conversion (since the 'seac' operator depends on having
+  // the accents in the encoding), so we fill in any gaps from
+  // StandardEncoding
+  if (type == fontType1C && embFontID.num >= 0 && baseEncFromFontFile) {
+    for (i = 0; i < 256; ++i) {
+      if (!enc[i] && standardEncoding[i]) {
+       enc[i] = (char *)standardEncoding[i];
+       encFree[i] = gFalse;
+      }
+    }
+  }
+
+  // merge differences into encoding
+  if (obj1.isDict()) {
+    obj1.dictLookup("Differences", &obj2);
+    if (obj2.isArray()) {
+      encodingName->Set("Custom");
+      hasEncoding = gTrue;
+      code = 0;
+      for (i = 0; i < obj2.arrayGetLength(); ++i) {
+       obj2.arrayGet(i, &obj3);
+       if (obj3.isInt()) {
+         code = obj3.getInt();
+       } else if (obj3.isName()) {
+         if (code >= 0 && code < 256) {
+           if (encFree[code]) {
+             gfree(enc[code]);
+           }
+           enc[code] = copyString(obj3.getName());
+           encFree[code] = gTrue;
+         }
+         ++code;
+       } else {
+         error(errSyntaxError, -1,
+               "Wrong type in font encoding resource differences ({0:s})",
+               obj3.getTypeName());
+       }
+       obj3.free();
+      }
+    }
+    obj2.free();
+  }
+  obj1.free();
+  if (ffT1) {
+    delete ffT1;
+  }
+  if (ffT1C) {
+    delete ffT1C;
+  }
+
+  //----- build the mapping to Unicode -----
+
+  // pass 1: use the name-to-Unicode mapping table
+  missing = hex = gFalse;
+  for (code = 0; code < 256; ++code) {
+    if ((charName = enc[code])) {
+      if (!(toUnicode[code] = globalParams->mapNameToUnicode(charName)) &&
+         strcmp(charName, ".notdef")) {
+       // if it wasn't in the name-to-Unicode table, check for a
+       // name that looks like 'Axx' or 'xx', where 'A' is any letter
+       // and 'xx' is two hex digits
+       if ((strlen(charName) == 3 &&
+            isalpha(charName[0]) &&
+            isxdigit(charName[1]) && isxdigit(charName[2]) &&
+            ((charName[1] >= 'a' && charName[1] <= 'f') ||
+             (charName[1] >= 'A' && charName[1] <= 'F') ||
+             (charName[2] >= 'a' && charName[2] <= 'f') ||
+             (charName[2] >= 'A' && charName[2] <= 'F'))) ||
+           (strlen(charName) == 2 &&
+            isxdigit(charName[0]) && isxdigit(charName[1]) &&
+            ((charName[0] >= 'a' && charName[0] <= 'f') ||
+             (charName[0] >= 'A' && charName[0] <= 'F') ||
+             (charName[1] >= 'a' && charName[1] <= 'f') ||
+             (charName[1] >= 'A' && charName[1] <= 'F')))) {
+         hex = gTrue;
+       }
+       missing = gTrue;
+      }
+    } else {
+      toUnicode[code] = 0;
+    }
+  }
+
+  // construct the char code -> Unicode mapping object
+  ctu = CharCodeToUnicode::make8BitToUnicode(toUnicode);
+
+  // pass 1a: Expand ligatures in the Alphabetic Presentation Form
+  // block (eg "fi", "ffi") to normal form
+  for (code = 0; code < 256; ++code) {
+    if (unicodeIsAlphabeticPresentationForm(toUnicode[code])) {
+      Unicode *normalized = unicodeNormalizeNFKC(&toUnicode[code], 1, &len, NULL);
+      if (len > 1)
+        ctu->setMapping((CharCode)code, normalized, len);
+      gfree(normalized);
+    }
+  }
+
+  // pass 2: try to fill in the missing chars, looking for ligatures, numeric
+  // references and variants
+  if (missing) {
+    for (code = 0; code < 256; ++code) {
+      if (!toUnicode[code]) {
+       if ((charName = enc[code]) && strcmp(charName, ".notdef")
+           && (n = parseCharName(charName, uBuf, sizeof(uBuf)/sizeof(*uBuf), 
+                                 gFalse, // don't check simple names (pass 1)
+                                 gTrue, // do check ligatures
+                                 globalParams->getMapNumericCharNames(),
+                                 hex,
+                                 gTrue))) { // do check variants
+         ctu->setMapping((CharCode)code, uBuf, n);
+       } else if (globalParams->getMapUnknownCharNames()) {
+         // if the 'mapUnknownCharNames' flag is set, do a simple pass-through
+         // mapping for unknown character names
+         if (charName && charName[0]) {
+           for (n = 0; n < (int)(sizeof(uBuf)/sizeof(*uBuf)); ++n)
+             if (!(uBuf[n] = charName[n]))
+               break;
+           ctu->setMapping((CharCode)code, uBuf, n);
+         } else {
+           uBuf[0] = code;
+           ctu->setMapping((CharCode)code, uBuf, 1);
+         }
+       }
+      }
+    }
+  }
+
+  // merge in a ToUnicode CMap, if there is one -- this overwrites
+  // existing entries in ctu, i.e., the ToUnicode CMap takes
+  // precedence, but the other encoding info is allowed to fill in any
+  // holes
+  readToUnicodeCMap(fontDict, 8, ctu);
+
+  // look for a Unicode-to-Unicode mapping
+  if (name && (utu = globalParams->getUnicodeToUnicode(name))) {
+    Unicode *uAux;
+    for (i = 0; i < 256; ++i) {
+      toUnicode[i] = 0;
+    }
+    ctu2 = CharCodeToUnicode::make8BitToUnicode(toUnicode);
+    for (i = 0; i < 256; ++i) {
+      n = ctu->mapToUnicode((CharCode)i, &uAux);
+      if (n >= 1) {
+       n = utu->mapToUnicode((CharCode)uAux[0], &uAux);
+       if (n >= 1) {
+         ctu2->setMapping((CharCode)i, uAux, n);
+       }
+      }
+    }
+    utu->decRefCnt();
+    delete ctu;
+    ctu = ctu2;
+  }
+
+  //----- get the character widths -----
+
+  // initialize all widths
+  for (code = 0; code < 256; ++code) {
+    widths[code] = missingWidth * 0.001;
+  }
+
+  // use widths from font dict, if present
+  fontDict->lookup("FirstChar", &obj1);
+  firstChar = obj1.isInt() ? obj1.getInt() : 0;
+  obj1.free();
+  if (firstChar < 0 || firstChar > 255) {
+    firstChar = 0;
+  }
+  fontDict->lookup("LastChar", &obj1);
+  lastChar = obj1.isInt() ? obj1.getInt() : 255;
+  obj1.free();
+  if (lastChar < 0 || lastChar > 255) {
+    lastChar = 255;
+  }
+  mul = (type == fontType3) ? fontMat[0] : 0.001;
+  fontDict->lookup("Widths", &obj1);
+  if (obj1.isArray()) {
+    flags |= fontFixedWidth;
+    if (obj1.arrayGetLength() < lastChar - firstChar + 1) {
+      lastChar = firstChar + obj1.arrayGetLength() - 1;
+    }
+    for (code = firstChar; code <= lastChar; ++code) {
+      obj1.arrayGet(code - firstChar, &obj2);
+      if (obj2.isNum()) {
+       widths[code] = obj2.getNum() * mul;
+       if (fabs(widths[code] - widths[firstChar]) > 0.00001) {
+         flags &= ~fontFixedWidth;
+       }
+      }
+      obj2.free();
+    }
+
+  // use widths from built-in font
+  } else if (builtinFont) {
+    // this is a kludge for broken PDF files that encode char 32
+    // as .notdef
+    if (builtinFont->widths->getWidth("space", &w)) {
+      widths[32] = 0.001 * w;
+    }
+    for (code = 0; code < 256; ++code) {
+      if (enc[code] && builtinFont->widths->getWidth(enc[code], &w)) {
+       widths[code] = 0.001 * w;
+      }
+    }
+
+  // couldn't find widths -- use defaults 
+  } else {
+    // this is technically an error -- the Widths entry is required
+    // for all but the Base-14 fonts -- but certain PDF generators
+    // apparently don't include widths for Arial and TimesNewRoman
+    if (isFixedWidth()) {
+      i = 0;
+    } else if (isSerif()) {
+      i = 8;
+    } else {
+      i = 4;
+    }
+    if (isBold()) {
+      i += 2;
+    }
+    if (isItalic()) {
+      i += 1;
+    }
+    builtinFont = builtinFontSubst[i];
+    // this is a kludge for broken PDF files that encode char 32
+    // as .notdef
+    if (builtinFont->widths->getWidth("space", &w)) {
+      widths[32] = 0.001 * w;
+    }
+    for (code = 0; code < 256; ++code) {
+      if (enc[code] && builtinFont->widths->getWidth(enc[code], &w)) {
+       widths[code] = 0.001 * w;
+      }
+    }
+  }
+  obj1.free();
+
+  ok = gTrue;
+}
+
+Gfx8BitFont::~Gfx8BitFont() {
+  int i;
+
+  for (i = 0; i < 256; ++i) {
+    if (encFree[i] && enc[i]) {
+      gfree(enc[i]);
+    }
+  }
+  ctu->decRefCnt();
+  if (charProcs.isDict()) {
+    charProcs.free();
+  }
+  if (resources.isDict()) {
+    resources.free();
+  }
+}
+
+// This function is in part a derived work of the Adobe Glyph Mapping
+// Convention: http://www.adobe.com/devnet/opentype/archives/glyph.html
+// Algorithmic comments are excerpted from that document to aid
+// maintainability.
+static int parseCharName(char *charName, Unicode *uBuf, int uLen,
+                        GBool names, GBool ligatures,
+                        GBool numeric, GBool hex, GBool variants)
+{
+  if (uLen <= 0) {
+    error(errInternal, -1, "Zero-length output buffer (recursion overflow?) in "
+         "parseCharName, component \"{0:s}\"", charName);
+    return 0;
+  }
+  // Step 1: drop all the characters from the glyph name starting with the
+  // first occurrence of a period (U+002E FULL STOP), if any.
+  if (variants) {
+    char *var_part = strchr(charName, '.');
+    if (var_part == charName) {
+      return 0;        // .notdef or similar
+    } else if (var_part != NULL) {
+      // parse names of the form 7.oldstyle, P.swash, s.sc, etc.
+      char *main_part = gstrndup(charName, var_part - charName);
+      GBool namesRecurse = gTrue, variantsRecurse = gFalse;
+      int n = parseCharName(main_part, uBuf, uLen, namesRecurse, ligatures,
+                           numeric, hex, variantsRecurse);
+      gfree(main_part);
+      return n;
+    }
+  }
+  // Step 2: split the remaining string into a sequence of components, using
+  // underscore (U+005F LOW LINE) as the delimiter.
+  if (ligatures && strchr(charName, '_')) {
+    // parse names of the form A_a (e.g. f_i, T_h, l_quotesingle)
+    char *lig_part, *lig_end, *lig_copy;
+    int n = 0, m;
+    lig_part = lig_copy = copyString(charName);
+    do {
+      if ((lig_end = strchr(lig_part, '_')))
+       *lig_end = '\0';
+      if (lig_part[0] != '\0') {
+       GBool namesRecurse = gTrue, ligaturesRecurse = gFalse;
+       if ((m = parseCharName(lig_part, uBuf + n, uLen - n, namesRecurse,
+                              ligaturesRecurse, numeric, hex, variants)))
+         n += m;
+       else
+         error(errSyntaxWarning, -1, "Could not parse ligature component \"{0:s}\" of \"{1:s}\" in "
+               "parseCharName", lig_part, charName);
+      }
+      lig_part = lig_end + 1;
+    } while (lig_end && n < uLen);
+    gfree(lig_copy);
+    return n;
+  }
+  // Step 3: map each component to a character string according to the
+  // procedure below, and concatenate those strings; the result is the
+  // character string to which the glyph name is mapped.
+  // 3.1. if the font is Zapf Dingbats (PostScript FontName ZapfDingbats), and
+  // the component is in the ZapfDingbats list, then map it to the
+  // corresponding character in that list.
+  // 3.2. otherwise, if the component is in the Adobe Glyph List, then map it
+  // to the corresponding character in that list.
+  if (names && (uBuf[0] = globalParams->mapNameToUnicode(charName))) {
+    return 1;
+  }
+  if (numeric) {
+    unsigned int n = strlen(charName);
+    // 3.3. otherwise, if the component is of the form "uni" (U+0075 U+006E
+    // U+0069) followed by a sequence of uppercase hexadecimal digits (0 .. 9,
+    // A .. F, i.e. U+0030 .. U+0039, U+0041 .. U+0046), the length of that
+    // sequence is a multiple of four, and each group of four digits represents
+    // a number in the set {0x0000 .. 0xD7FF, 0xE000 .. 0xFFFF}, then interpret
+    // each such number as a Unicode scalar value and map the component to the
+    // string made of those scalar values. Note that the range and digit length
+    // restrictions mean that the "uni" prefix can be used only with Unicode
+    // values from the Basic Multilingual Plane (BMP).
+    if (n >= 7 && (n % 4) == 3 && !strncmp(charName, "uni", 3)) {
+      int i;
+      unsigned int m;
+      for (i = 0, m = 3; i < uLen && m < n; m += 4) {
+       if (isxdigit(charName[m]) && isxdigit(charName[m + 1]) && 
+           isxdigit(charName[m + 2]) && isxdigit(charName[m + 3])) {
+         unsigned int u;
+         sscanf(charName + m, "%4x", &u);
+         if (u <= 0xD7FF || (0xE000 <= u && u <= 0xFFFF)) {
+           uBuf[i++] = u;
+         }
+       }
+      }
+      return i;
+    }
+    // 3.4. otherwise, if the component is of the form "u" (U+0075) followed by
+    // a sequence of four to six uppercase hexadecimal digits {0 .. 9, A .. F}
+    // (U+0030 .. U+0039, U+0041 .. U+0046), and those digits represent a
+    // number in {0x0000 .. 0xD7FF, 0xE000 .. 0x10FFFF}, then interpret this
+    // number as a Unicode scalar value and map the component to the string
+    // made of this scalar value.
+    if (n >= 5 && n <= 7 && charName[0] == 'u' && isxdigit(charName[1]) &&
+       isxdigit(charName[2]) && isxdigit(charName[3]) && isxdigit(charName[4])
+       && (n <= 5 || isxdigit(charName[5]))
+       && (n <= 6 || isxdigit(charName[6]))) {
+      unsigned int u;
+      sscanf(charName + 1, "%x", &u);
+      if (u <= 0xD7FF || (0xE000 <= u && u <= 0x10FFFF)) {
+       uBuf[0] = u;
+       return 1;
+      }
+    }
+    // Not in Adobe Glyph Mapping convention: look for names of the form 'Axx',
+    // 'xx', 'Ann', 'ABnn', or 'nn', where 'A' and 'B' are any letters, 'xx' is
+    // two hex digits, and 'nn' is 2-4 decimal digits
+    if (hex && n == 3 && isalpha(charName[0]) &&
+       isxdigit(charName[1]) && isxdigit(charName[2])) {
+      sscanf(charName+1, "%x", (unsigned int *)uBuf);
+      return 1;
+    } else if (hex && n == 2 &&
+              isxdigit(charName[0]) && isxdigit(charName[1])) {
+      sscanf(charName, "%x", (unsigned int *)uBuf);
+      return 1;
+    } else if (!hex && n >= 2 && n <= 4 &&
+              isdigit(charName[0]) && isdigit(charName[1])) {
+      uBuf[0] = (Unicode)atoi(charName);
+      return 1;
+    } else if (n >= 3 && n <= 5 &&
+              isdigit(charName[1]) && isdigit(charName[2])) {
+      uBuf[0] = (Unicode)atoi(charName+1);
+      return 1;
+    } else if (n >= 4 && n <= 6 &&
+              isdigit(charName[2]) && isdigit(charName[3])) {
+      uBuf[0] = (Unicode)atoi(charName+2);
+      return 1;
+    }
+  }
+  // 3.5. otherwise, map the component to the empty string
+  return 0;
+}
+
+int Gfx8BitFont::getNextChar(char *s, int len, CharCode *code,
+                            Unicode **u, int *uLen,
+                            double *dx, double *dy, double *ox, double *oy) {
+  CharCode c;
+
+  *code = c = (CharCode)(*s & 0xff);
+  *uLen = ctu->mapToUnicode(c, u);
+  *dx = widths[c];
+  *dy = *ox = *oy = 0;
+  return 1;
+}
+
+CharCodeToUnicode *Gfx8BitFont::getToUnicode() {
+  ctu->incRefCnt();
+  return ctu;
+}
+
+int *Gfx8BitFont::getCodeToGIDMap(FoFiTrueType *ff) {
+  int *map;
+  int cmapPlatform, cmapEncoding;
+  int unicodeCmap, macRomanCmap, msSymbolCmap, cmap;
+  GBool useMacRoman, useUnicode;
+  char *charName;
+  Unicode u;
+  int code, i, n;
+
+  map = (int *)gmallocn(256, sizeof(int));
+  for (i = 0; i < 256; ++i) {
+    map[i] = 0;
+  }
+
+  // To match up with the Adobe-defined behaviour, we choose a cmap
+  // like this:
+  // 1. If the PDF font has an encoding:
+  //    1a. If the PDF font specified MacRomanEncoding and the
+  //        TrueType font has a Macintosh Roman cmap, use it, and
+  //        reverse map the char names through MacRomanEncoding to
+  //        get char codes.
+  //    1b. If the PDF font is not symbolic or the PDF font is not
+  //        embedded, and the TrueType font has a Microsoft Unicode
+  //        cmap or a non-Microsoft Unicode cmap, use it, and use the
+  //        Unicode indexes, not the char codes.
+  //    1c. If the PDF font is symbolic and the TrueType font has a
+  //        Microsoft Symbol cmap, use it, and use char codes
+  //        directly (possibly with an offset of 0xf000).
+  //    1d. If the TrueType font has a Macintosh Roman cmap, use it,
+  //        as in case 1a.
+  // 2. If the PDF font does not have an encoding or the PDF font is
+  //    symbolic:
+  //    2a. If the TrueType font has a Macintosh Roman cmap, use it,
+  //        and use char codes directly (possibly with an offset of
+  //        0xf000).
+  //    2b. If the TrueType font has a Microsoft Symbol cmap, use it,
+  //        and use char codes directly (possible with an offset of
+  //        0xf000).
+  // 3. If none of these rules apply, use the first cmap and hope for
+  //    the best (this shouldn't happen).
+  unicodeCmap = macRomanCmap = msSymbolCmap = -1;
+  for (i = 0; i < ff->getNumCmaps(); ++i) {
+    cmapPlatform = ff->getCmapPlatform(i);
+    cmapEncoding = ff->getCmapEncoding(i);
+    if ((cmapPlatform == 3 && cmapEncoding == 1) ||
+       cmapPlatform == 0) {
+      unicodeCmap = i;
+    } else if (cmapPlatform == 1 && cmapEncoding == 0) {
+      macRomanCmap = i;
+    } else if (cmapPlatform == 3 && cmapEncoding == 0) {
+      msSymbolCmap = i;
+    }
+  }
+  cmap = 0;
+  useMacRoman = gFalse;
+  useUnicode = gFalse;
+  if (hasEncoding || type == fontType1) {
+    if (usesMacRomanEnc && macRomanCmap >= 0) {
+      cmap = macRomanCmap;
+      useMacRoman = gTrue;
+    } else if ((!(flags & fontSymbolic) || embFontID.num < 0) &&
+              unicodeCmap >= 0) {
+      cmap = unicodeCmap;
+      useUnicode = gTrue;
+    } else if ((flags & fontSymbolic) && msSymbolCmap >= 0) {
+      cmap = msSymbolCmap;
+    } else if ((flags & fontSymbolic) && macRomanCmap >= 0) {
+      cmap = macRomanCmap;
+    } else if (macRomanCmap >= 0) {
+      cmap = macRomanCmap;
+      useMacRoman = gTrue;
+    }
+  } else {
+    if (msSymbolCmap >= 0) {
+      cmap = msSymbolCmap;
+    } else if (macRomanCmap >= 0) {
+      cmap = macRomanCmap;
+    }
+  }
+
+  // reverse map the char names through MacRomanEncoding, then map the
+  // char codes through the cmap
+  if (useMacRoman) {
+    for (i = 0; i < 256; ++i) {
+      if ((charName = enc[i])) {
+       if ((code = globalParams->getMacRomanCharCode(charName))) {
+         map[i] = ff->mapCodeToGID(cmap, code);
+       }
+      } else {
+       map[i] = -1;
+      }
+    }
+
+  // map Unicode through the cmap
+  } else if (useUnicode) {
+    Unicode *uAux;
+    for (i = 0; i < 256; ++i) {
+      if (((charName = enc[i]) && (u = globalParams->mapNameToUnicode(charName))))
+       map[i] = ff->mapCodeToGID(cmap, u);
+      else
+      {
+       n = ctu->mapToUnicode((CharCode)i, &uAux);
+       if (n > 0) map[i] = ff->mapCodeToGID(cmap, uAux[0]);
+       else map[i] = -1;
+      }
+    }
+
+  // map the char codes through the cmap, possibly with an offset of
+  // 0xf000
+  } else {
+    for (i = 0; i < 256; ++i) {
+      if (!(map[i] = ff->mapCodeToGID(cmap, i))) {
+       map[i] = ff->mapCodeToGID(cmap, 0xf000 + i);
+      }
+    }
+  }
+
+  // try the TrueType 'post' table to handle any unmapped characters
+  for (i = 0; i < 256; ++i) {
+    if (map[i] <= 0 && (charName = enc[i])) {
+      map[i] = ff->mapNameToGID(charName);
+    }
+  }
+
+  return map;
+}
+
+Dict *Gfx8BitFont::getCharProcs() {
+  return charProcs.isDict() ? charProcs.getDict() : (Dict *)NULL;
+}
+
+Object *Gfx8BitFont::getCharProc(int code, Object *proc) {
+  if (enc[code] && charProcs.isDict()) {
+    charProcs.dictLookup(enc[code], proc);
+  } else {
+    proc->initNull();
+  }
+  return proc;
+}
+
+Dict *Gfx8BitFont::getResources() {
+  return resources.isDict() ? resources.getDict() : (Dict *)NULL;
+}
+
+//------------------------------------------------------------------------
+// GfxCIDFont
+//------------------------------------------------------------------------
+
+struct cmpWidthExcepFunctor {
+  bool operator()(const GfxFontCIDWidthExcep &w1,
+                 const GfxFontCIDWidthExcep &w2) {
+    return w1.first < w2.first;
+  }
+};
+
+struct cmpWidthExcepVFunctor {
+  bool operator()(const GfxFontCIDWidthExcepV &w1,
+                 const GfxFontCIDWidthExcepV &w2) {
+    return w1.first < w2.first;
+  }
+};
+
+GfxCIDFont::GfxCIDFont(XRef *xref, const char *tagA, Ref idA, GooString *nameA,
+                      GfxFontType typeA, Ref embFontIDA, Dict *fontDict):
+  GfxFont(tagA, idA, nameA, typeA, embFontIDA)
+{
+  Dict *desFontDict;
+  Object desFontDictObj;
+  Object obj1, obj2, obj3, obj4, obj5, obj6;
+  CharCodeToUnicode *utu;
+  CharCode c;
+  Unicode *uBuf;
+  int c1, c2;
+  int excepsSize, i, j, k, n;
+
+  refCnt = 1;
+  ascent = 0.95;
+  descent = -0.35;
+  fontBBox[0] = fontBBox[1] = fontBBox[2] = fontBBox[3] = 0;
+  collection = NULL;
+  cMap = NULL;
+  ctu = NULL;
+  ctuUsesCharCode = gTrue;
+  widths.defWidth = 1.0;
+  widths.defHeight = -1.0;
+  widths.defVY = 0.880;
+  widths.exceps = NULL;
+  widths.nExceps = 0;
+  widths.excepsV = NULL;
+  widths.nExcepsV = 0;
+  cidToGID = NULL;
+  cidToGIDLen = 0;
+
+  // get the descendant font
+  if (!fontDict->lookup("DescendantFonts", &obj1)->isArray() ||
+      obj1.arrayGetLength() == 0) {
+    error(errSyntaxError, -1, "Missing or empty DescendantFonts entry in Type 0 font");
+    obj1.free();
+    goto err1;
+  }
+  if (!obj1.arrayGet(0, &desFontDictObj)->isDict()) {
+    error(errSyntaxError, -1, "Bad descendant font in Type 0 font");
+    goto err3;
+  }
+  obj1.free();
+  desFontDict = desFontDictObj.getDict();
+
+  // get info from font descriptor
+  readFontDescriptor(xref, desFontDict);
+
+  //----- encoding info -----
+
+  // char collection
+  if (!desFontDict->lookup("CIDSystemInfo", &obj1)->isDict()) {
+    error(errSyntaxError, -1, "Missing CIDSystemInfo dictionary in Type 0 descendant font");
+    goto err3;
+  }
+  obj1.dictLookup("Registry", &obj2);
+  obj1.dictLookup("Ordering", &obj3);
+  if (!obj2.isString() || !obj3.isString()) {
+    error(errSyntaxError, -1, "Invalid CIDSystemInfo dictionary in Type 0 descendant font");
+    goto err3;
+  }
+  collection = obj2.getString()->copy()->append('-')->append(obj3.getString());
+  obj3.free();
+  obj2.free();
+  obj1.free();
+
+  // look for a ToUnicode CMap
+  if (!(ctu = readToUnicodeCMap(fontDict, 16, NULL))) {
+    ctuUsesCharCode = gFalse;
+
+    // use an identity mapping for the "Adobe-Identity" and
+    // "Adobe-UCS" collections
+    if (!collection->cmp("Adobe-Identity") ||
+       !collection->cmp("Adobe-UCS")) {
+      ctu = CharCodeToUnicode::makeIdentityMapping();
+    } else {
+      // look for a user-supplied .cidToUnicode file
+      if (!(ctu = globalParams->getCIDToUnicode(collection))) {
+       // I'm not completely sure that this is the best thing to do
+       // but it seems to produce better results when the .cidToUnicode
+       // files from the poppler-data package are missing. At least
+       // we know that assuming the Identity mapping is definitely wrong.
+       //   -- jrmuizel
+       static const char * knownCollections [] = {
+         "Adobe-CNS1",
+         "Adobe-GB1",
+         "Adobe-Japan1",
+         "Adobe-Japan2",
+         "Adobe-Korea1",
+       };
+       for (size_t i = 0; i < sizeof(knownCollections)/sizeof(knownCollections[0]); i++) {
+         if (collection->cmp(knownCollections[i]) == 0) {
+           error(errSyntaxError, -1, "Missing language pack for '{0:t}' mapping", collection);
+           goto err2;
+         }
+       }
+       error(errSyntaxError, -1, "Unknown character collection '{0:t}'",
+             collection);
+       // fall-through, assuming the Identity mapping -- this appears
+       // to match Adobe's behavior
+      }
+    }
+  }
+
+  // look for a Unicode-to-Unicode mapping
+  if (name && (utu = globalParams->getUnicodeToUnicode(name))) {
+    if (ctu) {
+      for (c = 0; c < ctu->getLength(); ++c) {
+       n = ctu->mapToUnicode(c, &uBuf);
+       if (n >= 1) {
+         n = utu->mapToUnicode((CharCode)uBuf[0], &uBuf);
+         if (n >= 1) {
+           ctu->setMapping(c, uBuf, n);
+         }
+       }
+      }
+      utu->decRefCnt();
+    } else {
+      ctu = utu;
+    }
+  }
+
+  // encoding (i.e., CMap)
+  if (fontDict->lookup("Encoding", &obj1)->isNull()) {
+    error(errSyntaxError, -1, "Missing Encoding entry in Type 0 font");
+    goto err2;
+  }
+  if (!(cMap = CMap::parse(NULL, collection, &obj1))) {
+    goto err2;
+  }
+  obj1.free();
+  if (cMap->getCMapName()) {
+    encodingName->Set(cMap->getCMapName()->getCString());
+  } else {
+    encodingName->Set("Custom");
+  }
+
+  // CIDToGIDMap (for embedded TrueType fonts)
+  if (type == fontCIDType2 || type == fontCIDType2OT) {
+    desFontDict->lookup("CIDToGIDMap", &obj1);
+    if (obj1.isStream()) {
+      cidToGIDLen = 0;
+      i = 64;
+      cidToGID = (int *)gmallocn(i, sizeof(int));
+      obj1.streamReset();
+      while ((c1 = obj1.streamGetChar()) != EOF &&
+            (c2 = obj1.streamGetChar()) != EOF) {
+       if (cidToGIDLen == i) {
+         i *= 2;
+         cidToGID = (int *)greallocn(cidToGID, i, sizeof(int));
+       }
+       cidToGID[cidToGIDLen++] = (c1 << 8) + c2;
+      }
+    } else if (!obj1.isName("Identity") && !obj1.isNull()) {
+      error(errSyntaxError, -1, "Invalid CIDToGIDMap entry in CID font");
+    }
+    obj1.free();
+  }
+
+  //----- character metrics -----
+
+  // default char width
+  if (desFontDict->lookup("DW", &obj1)->isInt()) {
+    widths.defWidth = obj1.getInt() * 0.001;
+  }
+  obj1.free();
+
+  // char width exceptions
+  if (desFontDict->lookup("W", &obj1)->isArray()) {
+    excepsSize = 0;
+    i = 0;
+    while (i + 1 < obj1.arrayGetLength()) {
+      obj1.arrayGet(i, &obj2);
+      obj1.arrayGet(i + 1, &obj3);
+      if (obj2.isInt() && obj3.isInt() && i + 2 < obj1.arrayGetLength()) {
+       if (obj1.arrayGet(i + 2, &obj4)->isNum()) {
+         if (widths.nExceps == excepsSize) {
+           excepsSize += 16;
+           widths.exceps = (GfxFontCIDWidthExcep *)
+             greallocn(widths.exceps,
+                       excepsSize, sizeof(GfxFontCIDWidthExcep));
+         }
+         widths.exceps[widths.nExceps].first = obj2.getInt();
+         widths.exceps[widths.nExceps].last = obj3.getInt();
+         widths.exceps[widths.nExceps].width = obj4.getNum() * 0.001;
+         ++widths.nExceps;
+       } else {
+         error(errSyntaxError, -1, "Bad widths array in Type 0 font");
+       }
+       obj4.free();
+       i += 3;
+      } else if (obj2.isInt() && obj3.isArray()) {
+       if (widths.nExceps + obj3.arrayGetLength() > excepsSize) {
+         excepsSize = (widths.nExceps + obj3.arrayGetLength() + 15) & ~15;
+         widths.exceps = (GfxFontCIDWidthExcep *)
+           greallocn(widths.exceps,
+                     excepsSize, sizeof(GfxFontCIDWidthExcep));
+       }
+       j = obj2.getInt();
+       for (k = 0; k < obj3.arrayGetLength(); ++k) {
+         if (obj3.arrayGet(k, &obj4)->isNum()) {
+           widths.exceps[widths.nExceps].first = j;
+           widths.exceps[widths.nExceps].last = j;
+           widths.exceps[widths.nExceps].width = obj4.getNum() * 0.001;
+           ++j;
+           ++widths.nExceps;
+         } else {
+           error(errSyntaxError, -1, "Bad widths array in Type 0 font");
+         }
+         obj4.free();
+       }
+       i += 2;
+      } else {
+       error(errSyntaxError, -1, "Bad widths array in Type 0 font");
+       ++i;
+      }
+      obj3.free();
+      obj2.free();
+    }
+    std::sort(widths.exceps, widths.exceps + widths.nExceps,
+             cmpWidthExcepFunctor());
+  }
+  obj1.free();
+
+  // default metrics for vertical font
+  if (desFontDict->lookup("DW2", &obj1)->isArray() &&
+      obj1.arrayGetLength() == 2) {
+    if (obj1.arrayGet(0, &obj2)->isNum()) {
+      widths.defVY = obj2.getNum() * 0.001;
+    }
+    obj2.free();
+    if (obj1.arrayGet(1, &obj2)->isNum()) {
+      widths.defHeight = obj2.getNum() * 0.001;
+    }
+    obj2.free();
+  }
+  obj1.free();
+
+  // char metric exceptions for vertical font
+  if (desFontDict->lookup("W2", &obj1)->isArray()) {
+    excepsSize = 0;
+    i = 0;
+    while (i + 1 < obj1.arrayGetLength()) {
+      obj1.arrayGet(i, &obj2);
+      obj1.arrayGet(i+ 1, &obj3);
+      if (obj2.isInt() && obj3.isInt() && i + 4 < obj1.arrayGetLength()) {
+       if (obj1.arrayGet(i + 2, &obj4)->isNum() &&
+           obj1.arrayGet(i + 3, &obj5)->isNum() &&
+           obj1.arrayGet(i + 4, &obj6)->isNum()) {
+         if (widths.nExcepsV == excepsSize) {
+           excepsSize += 16;
+           widths.excepsV = (GfxFontCIDWidthExcepV *)
+             greallocn(widths.excepsV,
+                       excepsSize, sizeof(GfxFontCIDWidthExcepV));
+         }
+         widths.excepsV[widths.nExcepsV].first = obj2.getInt();
+         widths.excepsV[widths.nExcepsV].last = obj3.getInt();
+         widths.excepsV[widths.nExcepsV].height = obj4.getNum() * 0.001;
+         widths.excepsV[widths.nExcepsV].vx = obj5.getNum() * 0.001;
+         widths.excepsV[widths.nExcepsV].vy = obj6.getNum() * 0.001;
+         ++widths.nExcepsV;
+       } else {
+         error(errSyntaxError, -1, "Bad widths (W2) array in Type 0 font");
+       }
+       obj6.free();
+       obj5.free();
+       obj4.free();
+       i += 5;
+      } else if (obj2.isInt() && obj3.isArray()) {
+       if (widths.nExcepsV + obj3.arrayGetLength() / 3 > excepsSize) {
+         excepsSize =
+           (widths.nExcepsV + obj3.arrayGetLength() / 3 + 15) & ~15;
+         widths.excepsV = (GfxFontCIDWidthExcepV *)
+           greallocn(widths.excepsV,
+                     excepsSize, sizeof(GfxFontCIDWidthExcepV));
+       }
+       j = obj2.getInt();
+       for (k = 0; k < obj3.arrayGetLength(); k += 3) {
+         if (obj3.arrayGet(k, &obj4)->isNum() &&
+             obj3.arrayGet(k+1, &obj5)->isNum() &&
+             obj3.arrayGet(k+2, &obj6)->isNum()) {
+           widths.excepsV[widths.nExcepsV].first = j;
+           widths.excepsV[widths.nExcepsV].last = j;
+           widths.excepsV[widths.nExcepsV].height = obj4.getNum() * 0.001;
+           widths.excepsV[widths.nExcepsV].vx = obj5.getNum() * 0.001;
+           widths.excepsV[widths.nExcepsV].vy = obj6.getNum() * 0.001;
+           ++j;
+           ++widths.nExcepsV;
+         } else {
+           error(errSyntaxError, -1, "Bad widths (W2) array in Type 0 font");
+         }
+         obj6.free();
+         obj5.free();
+         obj4.free();
+       }
+       i += 2;
+      } else {
+       error(errSyntaxError, -1, "Bad widths (W2) array in Type 0 font");
+       ++i;
+      }
+      obj3.free();
+      obj2.free();
+    }
+    std::sort(widths.excepsV, widths.excepsV + widths.nExcepsV,
+             cmpWidthExcepVFunctor());
+  }
+  obj1.free();
+
+  desFontDictObj.free();
+  ok = gTrue;
+  return;
+
+ err3:
+  obj3.free();
+  obj2.free();
+ err2:
+  obj1.free();
+  desFontDictObj.free();
+ err1:;
+}
+
+GfxCIDFont::~GfxCIDFont() {
+  if (collection) {
+    delete collection;
+  }
+  if (cMap) {
+    cMap->decRefCnt();
+  }
+  if (ctu) {
+    ctu->decRefCnt();
+  }
+  gfree(widths.exceps);
+  gfree(widths.excepsV);
+  if (cidToGID) {
+    gfree(cidToGID);
+  }
+}
+
+int GfxCIDFont::getNextChar(char *s, int len, CharCode *code,
+                           Unicode **u, int *uLen,
+                           double *dx, double *dy, double *ox, double *oy) {
+  CID cid;
+  CharCode c;
+  double w, h, vx, vy;
+  int n, a, b, m;
+
+  if (!cMap) {
+    *code = 0;
+    *uLen = 0;
+    *dx = *dy = 0;
+    return 1;
+  }
+
+  *code = (CharCode)(cid = cMap->getCID(s, len, &c, &n));
+  if (ctu) {
+    if (hasToUnicode) {
+      int i = 0, c = 0;
+      while (i < n) {
+       c = (c << 8 ) + (s[i] & 0xff);
+       ++i;
+      }
+      *uLen = ctu->mapToUnicode(c, u);
+    } else {
+      *uLen = ctu->mapToUnicode(cid, u);
+    }
+  } else {
+    *uLen = 0;
+  }
+
+  // horizontal
+  if (cMap->getWMode() == 0) {
+    w = widths.defWidth;
+    h = vx = vy = 0;
+    if (widths.nExceps > 0 && cid >= widths.exceps[0].first) {
+      a = 0;
+      b = widths.nExceps;
+      // invariant: widths.exceps[a].first <= cid < widths.exceps[b].first
+      while (b - a > 1) {
+       m = (a + b) / 2;
+       if (widths.exceps[m].first <= cid) {
+         a = m;
+       } else {
+         b = m;
+       }
+      }
+      if (cid <= widths.exceps[a].last) {
+       w = widths.exceps[a].width;
+      }
+    }
+
+  // vertical
+  } else {
+    w = 0;
+    h = widths.defHeight;
+    vx = widths.defWidth / 2;
+    vy = widths.defVY;
+    if (widths.nExcepsV > 0 && cid >= widths.excepsV[0].first) {
+      a = 0;
+      b = widths.nExcepsV;
+      // invariant: widths.excepsV[a].first <= cid < widths.excepsV[b].first
+      while (b - a > 1) {
+       m = (a + b) / 2;
+       if (widths.excepsV[m].last <= cid) {
+         a = m;
+       } else {
+         b = m;
+       }
+      }
+      if (cid <= widths.excepsV[a].last) {
+       h = widths.excepsV[a].height;
+       vx = widths.excepsV[a].vx;
+       vy = widths.excepsV[a].vy;
+      }
+    }
+  }
+
+  *dx = w;
+  *dy = h;
+  *ox = vx;
+  *oy = vy;
+
+  return n;
+}
+
+int GfxCIDFont::getWMode() {
+  return cMap ? cMap->getWMode() : 0;
+}
+
+CharCodeToUnicode *GfxCIDFont::getToUnicode() {
+  if (ctu) {
+    ctu->incRefCnt();
+  }
+  return ctu;
+}
+
+GooString *GfxCIDFont::getCollection() {
+  return cMap ? cMap->getCollection() : (GooString *)NULL;
+}
+
+int GfxCIDFont::mapCodeToGID(FoFiTrueType *ff, int cmapi,
+  Unicode unicode, GBool wmode) {
+  Gushort gid = ff->mapCodeToGID(cmapi,unicode);
+  if (wmode) {
+    Gushort vgid = ff->mapToVertGID(gid);
+    if (vgid != 0) gid = vgid;
+  }
+  return gid;
+}
+
+int *GfxCIDFont::getCodeToGIDMap(FoFiTrueType *ff, int *mapsizep) {
+#define N_UCS_CANDIDATES 2
+  /* space characters */
+  static const unsigned long spaces[] = { 
+    0x2000,0x2001,0x2002,0x2003,0x2004,0x2005,0x2006,0x2007,
+    0x2008,0x2009,0x200A,0x00A0,0x200B,0x2060,0x3000,0xFEFF,
+    0
+  };
+  static const char *adobe_cns1_cmaps[] = {
+    "UniCNS-UTF32-V",
+    "UniCNS-UCS2-V",
+    "UniCNS-UTF32-H",
+    "UniCNS-UCS2-H",
+    0
+  };
+  static const char *adobe_gb1_cmaps[] = {
+    "UniGB-UTF32-V",
+    "UniGB-UCS2-V",
+    "UniGB-UTF32-H",
+    "UniGB-UCS2-H",
+    0
+  };
+  static const char *adobe_japan1_cmaps[] = {
+    "UniJIS-UTF32-V",
+    "UniJIS-UCS2-V",
+    "UniJIS-UTF32-H",
+    "UniJIS-UCS2-H",
+    0
+  };
+  static const char *adobe_japan2_cmaps[] = {
+    "UniHojo-UTF32-V",
+    "UniHojo-UCS2-V",
+    "UniHojo-UTF32-H",
+    "UniHojo-UCS2-H",
+    0
+  };
+  static const char *adobe_korea1_cmaps[] = {
+    "UniKS-UTF32-V",
+    "UniKS-UCS2-V",
+    "UniKS-UTF32-H",
+    "UniKS-UCS2-H",
+    0
+  };
+  static struct CMapListEntry {
+    const char *collection;
+    const char *scriptTag;
+    const char *languageTag;
+    const char *toUnicodeMap;
+    const char **CMaps;
+  } CMapList[] = {
+    {
+      "Adobe-CNS1",
+      "hani", "CHN ",
+      "Adobe-CNS1-UCS2",
+      adobe_cns1_cmaps,
+    },
+    {
+      "Adobe-GB1",
+      "hani", "CHN ",
+      "Adobe-GB1-UCS2",
+      adobe_gb1_cmaps,
+    },
+    {
+      "Adobe-Japan1",
+      "kana", "JAN ",
+      "Adobe-Japan1-UCS2",
+      adobe_japan1_cmaps,
+    },
+    {
+      "Adobe-Japan2",
+      "kana", "JAN ",
+      "Adobe-Japan2-UCS2",
+      adobe_japan2_cmaps,
+    },
+    {
+      "Adobe-Korea1",
+      "hang", "KOR ",
+      "Adobe-Korea1-UCS2",
+      adobe_korea1_cmaps,
+    },
+    {0, 0, 0, 0}
+  };
+  Unicode *humap = 0;
+  Unicode *vumap = 0;
+  Unicode *tumap = 0;
+  int *codeToGID = 0;
+  unsigned long n;
+  int i;
+  unsigned long code;
+  int wmode;
+  const char **cmapName;
+  CMap *cMap;
+  CMapListEntry *lp;
+  int cmap;
+  int cmapPlatform, cmapEncoding;
+  Ref embID;
+
+  *mapsizep = 0;
+  if (!ctu) return NULL;
+  if (getCollection()->cmp("Adobe-Identity") == 0) return NULL;
+  if (getEmbeddedFontID(&embID)) {
+   /* if this font is embedded font, 
+    * CIDToGIDMap should be embedded in PDF file
+    * and already set. So return it.
+    */
+    *mapsizep = getCIDToGIDLen();
+    return getCIDToGID();
+  }
+
+  /* we use only unicode cmap */
+  cmap = -1;
+  for (i = 0; i < ff->getNumCmaps(); ++i) {
+    cmapPlatform = ff->getCmapPlatform(i);
+    cmapEncoding = ff->getCmapEncoding(i);
+    if (cmapPlatform == 3 && cmapEncoding == 10) {
+       /* UCS-4 */
+       cmap = i;
+       /* use UCS-4 cmap */
+       break;
+    } else if (cmapPlatform == 3 && cmapEncoding == 1) {
+       /* Unicode */
+       cmap = i;
+    } else if (cmapPlatform == 0 && cmap < 0) {
+       cmap = i;
+    }
+  }
+  if (cmap < 0)
+    return NULL;
+
+  wmode = getWMode();
+  for (lp = CMapList;lp->collection != 0;lp++) {
+    if (strcmp(lp->collection,getCollection()->getCString()) == 0) {
+      break;
+    }
+  }
+  n = 65536;
+  tumap = new Unicode[n];
+  humap = new Unicode[n*N_UCS_CANDIDATES];
+  memset(humap,0,sizeof(Unicode)*n*N_UCS_CANDIDATES);
+  if (lp->collection != 0) {
+    CharCodeToUnicode *tctu;
+    GooString tname(lp->toUnicodeMap);
+
+    if ((tctu = CharCodeToUnicode::parseCMapFromFile(&tname,16)) != 0) {
+      CharCode cid;
+      for (cid = 0;cid < n ;cid++) {
+       int len;
+       Unicode *ucodes;
+
+       len = tctu->mapToUnicode(cid,&ucodes);
+       if (len == 1) {
+         tumap[cid] = ucodes[0];
+       } else {
+         /* if not single character, ignore it */
+         tumap[cid] = 0;
+       }
+      }
+      delete tctu;
+    }
+    vumap = new Unicode[n];
+    memset(vumap,0,sizeof(Unicode)*n);
+    for (cmapName = lp->CMaps;*cmapName != 0;cmapName++) {
+      GooString cname(*cmapName);
+
+      if ((cMap = globalParams->getCMap(getCollection(),&cname))
+          != 0) {
+           if (cMap->getWMode()) {
+               cMap->setReverseMap(vumap,n,1);
+           } else {
+               cMap->setReverseMap(humap,n,N_UCS_CANDIDATES);
+           }
+       cMap->decRefCnt();
+      }
+    }
+    ff->setupGSUB(lp->scriptTag, lp->languageTag);
+  } else {
+    error(errSyntaxError, -1, "Unknown character collection {0:t}\n",
+      getCollection());
+    if ((ctu = getToUnicode()) != 0) {
+      CharCode cid;
+      for (cid = 0;cid < n ;cid++) {
+       Unicode *ucode;
+
+       if (ctu->mapToUnicode(cid, &ucode))
+         humap[cid*N_UCS_CANDIDATES] = ucode[0];
+       else
+         humap[cid*N_UCS_CANDIDATES] = 0;
+       for (i = 1;i < N_UCS_CANDIDATES;i++) {
+           humap[cid*N_UCS_CANDIDATES+i] = 0;
+       }
+      }
+      ctu->decRefCnt();
+    }
+  }
+  // map CID -> Unicode -> GID
+  codeToGID = (int *)gmallocn(n, sizeof(int));
+  for (code = 0; code < n; ++code) {
+    Unicode unicode;
+    unsigned long gid;
+
+    unicode = 0;
+    gid = 0;
+    if (humap != 0) {
+      for (i = 0;i < N_UCS_CANDIDATES
+       && gid == 0 && (unicode = humap[code*N_UCS_CANDIDATES+i]) != 0;i++) {
+       gid = mapCodeToGID(ff,cmap,unicode,gFalse);
+      }
+    }
+    if (gid == 0 && vumap != 0) {
+      unicode = vumap[code];
+      if (unicode != 0) {
+       gid = mapCodeToGID(ff,cmap,unicode,gTrue);
+       if (gid == 0 && tumap != 0) {
+         if ((unicode = tumap[code]) != 0) {
+           gid = mapCodeToGID(ff,cmap,unicode,gTrue);
+         }
+       }
+      }
+    }
+    if (gid == 0 && tumap != 0) {
+      if ((unicode = tumap[code]) != 0) {
+       gid = mapCodeToGID(ff,cmap,unicode,gFalse);
+      }
+    }
+    if (gid == 0) {
+      /* special handling space characters */
+      const unsigned long *p;
+
+      if (humap != 0) unicode = humap[code];
+      if (unicode != 0) {
+       /* check if code is space character , so map code to 0x0020 */
+       for (p = spaces;*p != 0;p++) {
+         if (*p == unicode) {
+           unicode = 0x20;
+           gid = mapCodeToGID(ff,cmap,unicode,wmode);
+           break;
+         }
+       }
+      }
+    }
+    codeToGID[code] = gid;
+  }
+  *mapsizep = n;
+  if (humap != 0) delete[] humap;
+  if (tumap != 0) delete[] tumap;
+  if (vumap != 0) delete[] vumap;
+  return codeToGID;
+}
+
+double GfxCIDFont::getWidth (char* s, int len) {
+  int nUsed;
+  double w;
+  int a, b, m;
+  CharCode c;
+
+  CID cid = cMap->getCID(s, len, &c, &nUsed);
+
+  w = widths.defWidth;
+  if (widths.nExceps > 0 && cid >= widths.exceps[0].first) {
+    a = 0;
+    b = widths.nExceps;
+    // invariant: widths.exceps[a].first <= cid < widths.exceps[b].first
+    while (b - a > 1) {
+      m = (a + b) / 2;
+      if (widths.exceps[m].first <= cid) {
+        a = m;
+      } else {
+        b = m;
+      }
+    }
+    if (cid <= widths.exceps[a].last) {
+      w = widths.exceps[a].width;
+    }
+  }
+  return w;
+}
+
+//------------------------------------------------------------------------
+// GfxFontDict
+//------------------------------------------------------------------------
+
+GfxFontDict::GfxFontDict(XRef *xref, Ref *fontDictRef, Dict *fontDict) {
+  int i;
+  Object obj1, obj2;
+  Ref r;
+
+  numFonts = fontDict->getLength();
+  fonts = (GfxFont **)gmallocn(numFonts, sizeof(GfxFont *));
+  for (i = 0; i < numFonts; ++i) {
+    fontDict->getValNF(i, &obj1);
+    obj1.fetch(xref, &obj2);
+    if (obj2.isDict()) {
+      if (obj1.isRef()) {
+       r = obj1.getRef();
+      } else {
+       // no indirect reference for this font, so invent a unique one
+       // (legal generation numbers are five digits, so any 6-digit
+       // number would be safe)
+       r.num = i;
+       if (fontDictRef) {
+         r.gen = 100000 + fontDictRef->num;
+       } else {
+         r.gen = 999999;
+       }
+      }
+      fonts[i] = GfxFont::makeFont(xref, fontDict->getKey(i),
+                                  r, obj2.getDict());
+      if (fonts[i] && !fonts[i]->isOk()) {
+       // XXX: it may be meaningful to distinguish between
+       // NULL and !isOk() so that when we do lookups
+       // we can tell the difference between a missing font
+       // and a font that is just !isOk()
+       fonts[i]->decRefCnt();
+       fonts[i] = NULL;
+      }
+    } else {
+      error(errSyntaxError, -1, "font resource is not a dictionary");
+      fonts[i] = NULL;
+    }
+    obj1.free();
+    obj2.free();
+  }
+}
+
+GfxFontDict::~GfxFontDict() {
+  int i;
+
+  for (i = 0; i < numFonts; ++i) {
+    if (fonts[i]) {
+      fonts[i]->decRefCnt();
+    }
+  }
+  gfree(fonts);
+}
+
+GfxFont *GfxFontDict::lookup(char *tag) {
+  int i;
+
+  for (i = 0; i < numFonts; ++i) {
+    if (fonts[i] && fonts[i]->matches(tag)) {
+      return fonts[i];
+    }
+  }
+  return NULL;
+}
diff --git a/poppler/GfxFont.h b/poppler/GfxFont.h
new file mode 100644 (file)
index 0000000..f980668
--- /dev/null
@@ -0,0 +1,436 @@
+//========================================================================
+//
+// GfxFont.h
+//
+// Copyright 1996-2003 Glyph & Cog, LLC
+//
+//========================================================================
+
+//========================================================================
+//
+// Modified under the Poppler project - http://poppler.freedesktop.org
+//
+// All changes made under the Poppler project to this file are licensed
+// under GPL version 2 or later
+//
+// Copyright (C) 2005, 2008 Albert Astals Cid <aacid@kde.org>
+// Copyright (C) 2006 Takashi Iwai <tiwai@suse.de>
+// Copyright (C) 2006 Kristian Høgsberg <krh@redhat.com>
+// Copyright (C) 2007 Julien Rebetez <julienr@svn.gnome.org>
+// Copyright (C) 2007 Jeff Muizelaar <jeff@infidigm.net>
+// Copyright (C) 2007 Koji Otani <sho@bbr.jp>
+// Copyright (C) 2011 Axel Strübing <axel.struebing@freenet.de>
+// Copyright (C) 2011, 2012 Adrian Johnson <ajohnson@redneon.com>
+//
+// To see a description of the changes please see the Changelog file that
+// came with your tarball or type make ChangeLog if you are building from git
+//
+//========================================================================
+
+#ifndef GFXFONT_H
+#define GFXFONT_H
+
+#ifdef USE_GCC_PRAGMAS
+#pragma interface
+#endif
+
+#include "goo/gtypes.h"
+#include "goo/GooString.h"
+#include "Object.h"
+#include "CharTypes.h"
+
+class Dict;
+class CMap;
+class CharCodeToUnicode;
+class FoFiTrueType;
+struct GfxFontCIDWidths;
+struct Base14FontMapEntry;
+
+//------------------------------------------------------------------------
+// GfxFontType
+//------------------------------------------------------------------------
+
+enum GfxFontType {
+  //----- Gfx8BitFont
+  fontUnknownType,
+  fontType1,
+  fontType1C,
+  fontType1COT,
+  fontType3,
+  fontTrueType,
+  fontTrueTypeOT,
+  //----- GfxCIDFont
+  fontCIDType0,
+  fontCIDType0C,
+  fontCIDType0COT,
+  fontCIDType2,
+  fontCIDType2OT
+};
+
+//------------------------------------------------------------------------
+// GfxFontCIDWidths
+//------------------------------------------------------------------------
+
+struct GfxFontCIDWidthExcep {
+  CID first;                   // this record applies to
+  CID last;                    //   CIDs <first>..<last>
+  double width;                        // char width
+};
+
+struct GfxFontCIDWidthExcepV {
+  CID first;                   // this record applies to
+  CID last;                    //   CIDs <first>..<last>
+  double height;               // char height
+  double vx, vy;               // origin position
+};
+
+struct GfxFontCIDWidths {
+  double defWidth;             // default char width
+  double defHeight;            // default char height
+  double defVY;                        // default origin position
+  GfxFontCIDWidthExcep *exceps;        // exceptions
+  int nExceps;                 // number of valid entries in exceps
+  GfxFontCIDWidthExcepV *      // exceptions for vertical font
+    excepsV;
+  int nExcepsV;                        // number of valid entries in excepsV
+};
+
+//------------------------------------------------------------------------
+// GfxFontLoc
+//------------------------------------------------------------------------
+
+enum GfxFontLocType {
+  gfxFontLocEmbedded,          // font embedded in PDF file
+  gfxFontLocExternal,          // external font file
+  gfxFontLocResident           // font resident in PS printer
+};
+
+class GfxFontLoc {
+public:
+
+  GfxFontLoc();
+  ~GfxFontLoc();
+
+  GfxFontLocType locType;
+  GfxFontType fontType;
+  Ref embFontID;               // embedded stream obj ID
+                               //   (if locType == gfxFontLocEmbedded)
+  GooString *path;             // font file path
+                               //   (if locType == gfxFontLocExternal)
+                               // PS font name
+                               //   (if locType == gfxFontLocResident)
+  int fontNum;                 // for TrueType collections
+                               //   (if locType == gfxFontLocExternal)
+  GooString *encoding;         // PS font encoding, only for 16-bit fonts
+                               //   (if locType == gfxFontLocResident)
+  int wMode;                   // writing mode, only for 16-bit fonts
+                               //   (if locType == gfxFontLocResident)
+  int substIdx;                        // substitute font index
+                               //   (if locType == gfxFontLocExternal,
+                               //   and a Base-14 substitution was made)
+};
+
+//------------------------------------------------------------------------
+// GfxFont
+//------------------------------------------------------------------------
+
+#define fontFixedWidth (1 << 0)
+#define fontSerif      (1 << 1)
+#define fontSymbolic   (1 << 2)
+#define fontItalic     (1 << 6)
+#define fontBold       (1 << 18)
+
+class GfxFont {
+public:
+
+  enum Stretch { 
+       StretchNotDefined, 
+       UltraCondensed, 
+       ExtraCondensed, 
+       Condensed, 
+       SemiCondensed, 
+       Normal, 
+       SemiExpanded, 
+       Expanded, 
+       ExtraExpanded, 
+       UltraExpanded };
+
+  enum Weight { 
+       WeightNotDefined, 
+       W100, 
+       W200, 
+       W300, 
+       W400, // Normal
+       W500, 
+       W600, 
+       W700, // Bold
+       W800, 
+       W900 };
+
+  // Build a GfxFont object.
+  static GfxFont *makeFont(XRef *xref, const char *tagA, Ref idA, Dict *fontDict);
+
+  GfxFont(const char *tagA, Ref idA, GooString *nameA,
+         GfxFontType typeA, Ref embFontIDA);
+
+  GBool isOk() { return ok; }
+
+  void incRefCnt();
+  void decRefCnt();
+
+  // Get font tag.
+  GooString *getTag() { return tag; }
+
+  // Get font dictionary ID.
+  Ref *getID() { return &id; }
+
+  // Does this font match the tag?
+  GBool matches(char *tagA) { return !tag->cmp(tagA); }
+
+  // Get font family name.
+  GooString *getFamily() { return family; }
+  
+  // Get font stretch.
+  Stretch getStretch() { return stretch; }
+  
+  // Get font weight.
+  Weight getWeight() { return weight; }
+
+  // Get the original font name (ignornig any munging that might have
+  // been done to map to a canonical Base-14 font name).
+  GooString *getName() { return name; }
+
+  // Get font type.
+  GfxFontType getType() { return type; }
+  virtual GBool isCIDFont() { return gFalse; }
+
+  // Get embedded font ID, i.e., a ref for the font file stream.
+  // Returns false if there is no embedded font.
+  GBool getEmbeddedFontID(Ref *embID)
+    { *embID = embFontID; return embFontID.num >= 0; }
+
+  // Get the PostScript font name for the embedded font.  Returns
+  // NULL if there is no embedded font.
+  GooString *getEmbeddedFontName() { return embFontName; }
+
+  // Get font descriptor flags.
+  int getFlags() { return flags; }
+  GBool isFixedWidth() { return flags & fontFixedWidth; }
+  GBool isSerif() { return flags & fontSerif; }
+  GBool isSymbolic() { return flags & fontSymbolic; }
+  GBool isItalic() { return flags & fontItalic; }
+  GBool isBold() { return flags & fontBold; }
+
+  // Return the Unicode map.
+  virtual CharCodeToUnicode *getToUnicode() = 0;
+
+  // Return the font matrix.
+  double *getFontMatrix() { return fontMat; }
+
+  // Return the font bounding box.
+  double *getFontBBox() { return fontBBox; }
+
+  // Return the ascent and descent values.
+  double getAscent() { return ascent; }
+  double getDescent() { return descent; }
+
+  // Return the writing mode (0=horizontal, 1=vertical).
+  virtual int getWMode() { return 0; }
+
+  // Locate the font file for this font.  If <ps> is true, includes PS
+  // printer-resident fonts.  Returns NULL on failure.
+  GfxFontLoc *locateFont(XRef *xref, GBool ps);
+
+  // Locate a Base-14 font file for a specified font name.
+  static GfxFontLoc *locateBase14Font(GooString *base14Name);
+
+  // Read an external or embedded font file into a buffer.
+  char *readEmbFontFile(XRef *xref, int *len);
+
+  // Get the next char from a string <s> of <len> bytes, returning the
+  // char <code>, its Unicode mapping <u>, its displacement vector
+  // (<dx>, <dy>), and its origin offset vector (<ox>, <oy>).  <uSize>
+  // is the number of entries available in <u>, and <uLen> is set to
+  // the number actually used.  Returns the number of bytes used by
+  // the char code.
+  virtual int getNextChar(char *s, int len, CharCode *code,
+                         Unicode **u, int *uLen,
+                         double *dx, double *dy, double *ox, double *oy) = 0;
+
+  // Does this font have a toUnicode map?
+  GBool hasToUnicodeCMap() { return hasToUnicode; }
+
+  // Return the name of the encoding
+  GooString *getEncodingName() { return encodingName; }
+
+protected:
+
+  virtual ~GfxFont();
+
+  static GfxFontType getFontType(XRef *xref, Dict *fontDict, Ref *embID);
+  void readFontDescriptor(XRef *xref, Dict *fontDict);
+  CharCodeToUnicode *readToUnicodeCMap(Dict *fontDict, int nBits,
+                                      CharCodeToUnicode *ctu);
+  static GfxFontLoc *getExternalFont(GooString *path, GBool cid);
+
+  GooString *tag;                      // PDF font tag
+  Ref id;                      // reference (used as unique ID)
+  GooString *name;             // font name
+  GooString *family;           // font family
+  Stretch stretch;                     // font stretch
+  Weight weight;                       // font weight
+  GfxFontType type;            // type of font
+  int flags;                   // font descriptor flags
+  GooString *embFontName;              // name of embedded font
+  Ref embFontID;               // ref to embedded font file stream
+  double fontMat[6];           // font matrix (Type 3 only)
+  double fontBBox[4];          // font bounding box (Type 3 only)
+  double missingWidth;         // "default" width
+  double ascent;               // max height above baseline
+  double descent;              // max depth below baseline
+  int refCnt;
+  GBool ok;
+  GBool hasToUnicode;
+  GooString *encodingName;
+};
+
+//------------------------------------------------------------------------
+// Gfx8BitFont
+//------------------------------------------------------------------------
+
+class Gfx8BitFont: public GfxFont {
+public:
+
+  Gfx8BitFont(XRef *xref, const char *tagA, Ref idA, GooString *nameA,
+             GfxFontType typeA, Ref embFontIDA, Dict *fontDict);
+
+  virtual int getNextChar(char *s, int len, CharCode *code,
+                         Unicode **u, int *uLen,
+                         double *dx, double *dy, double *ox, double *oy);
+
+  // Return the encoding.
+  char **getEncoding() { return enc; }
+
+  // Return the Unicode map.
+  CharCodeToUnicode *getToUnicode();
+
+  // Return the character name associated with <code>.
+  char *getCharName(int code) { return enc[code]; }
+
+  // Returns true if the PDF font specified an encoding.
+  GBool getHasEncoding() { return hasEncoding; }
+
+  // Returns true if the PDF font specified MacRomanEncoding.
+  GBool getUsesMacRomanEnc() { return usesMacRomanEnc; }
+
+  // Get width of a character.
+  double getWidth(Guchar c) { return widths[c]; }
+
+  // Return a char code-to-GID mapping for the provided font file.
+  // (This is only useful for TrueType fonts.)
+  int *getCodeToGIDMap(FoFiTrueType *ff);
+
+  // Return the Type 3 CharProc dictionary, or NULL if none.
+  Dict *getCharProcs();
+
+  // Return the Type 3 CharProc for the character associated with <code>.
+  Object *getCharProc(int code, Object *proc);
+
+  // Return the Type 3 Resources dictionary, or NULL if none.
+  Dict *getResources();
+
+private:
+  virtual ~Gfx8BitFont();
+
+  const Base14FontMapEntry *base14;    // for Base-14 fonts only; NULL otherwise
+  char *enc[256];              // char code --> char name
+  char encFree[256];           // boolean for each char name: if set,
+                               //   the string is malloc'ed
+  CharCodeToUnicode *ctu;      // char code --> Unicode
+  GBool hasEncoding;
+  GBool usesMacRomanEnc;
+  double widths[256];          // character widths
+  Object charProcs;            // Type 3 CharProcs dictionary
+  Object resources;            // Type 3 Resources dictionary
+
+  friend class GfxFont;
+};
+
+//------------------------------------------------------------------------
+// GfxCIDFont
+//------------------------------------------------------------------------
+
+class GfxCIDFont: public GfxFont {
+public:
+
+  GfxCIDFont(XRef *xref, const char *tagA, Ref idA, GooString *nameA,
+            GfxFontType typeA, Ref embFontIDA, Dict *fontDict);
+
+  virtual GBool isCIDFont() { return gTrue; }
+
+  virtual int getNextChar(char *s, int len, CharCode *code,
+                         Unicode **u, int *uLen,
+                         double *dx, double *dy, double *ox, double *oy);
+
+  // Return the writing mode (0=horizontal, 1=vertical).
+  virtual int getWMode();
+
+  // Return the Unicode map.
+  CharCodeToUnicode *getToUnicode();
+
+  // Get the collection name (<registry>-<ordering>).
+  GooString *getCollection();
+
+  // Return the CID-to-GID mapping table.  These should only be called
+  // if type is fontCIDType2.
+  int *getCIDToGID() { return cidToGID; }
+  int getCIDToGIDLen() { return cidToGIDLen; }
+
+  int *getCodeToGIDMap(FoFiTrueType *ff, int *length);
+
+  double getWidth(char* s, int len);
+
+private:
+  virtual ~GfxCIDFont();
+
+  int mapCodeToGID(FoFiTrueType *ff, int cmapi,
+    Unicode unicode, GBool wmode);
+
+  GooString *collection;               // collection name
+  CMap *cMap;                  // char code --> CID
+  CharCodeToUnicode *ctu;      // CID --> Unicode
+  GBool ctuUsesCharCode;       // true: ctu maps char code to Unicode;
+                               //   false: ctu maps CID to Unicode
+  GfxFontCIDWidths widths;     // character widths
+  int *cidToGID;               // CID --> GID mapping (for embedded
+                               //   TrueType fonts)
+  int cidToGIDLen;
+};
+
+//------------------------------------------------------------------------
+// GfxFontDict
+//------------------------------------------------------------------------
+
+class GfxFontDict {
+public:
+
+  // Build the font dictionary, given the PDF font dictionary.
+  GfxFontDict(XRef *xref, Ref *fontDictRef, Dict *fontDict);
+
+  // Destructor.
+  ~GfxFontDict();
+
+  // Get the specified font.
+  GfxFont *lookup(char *tag);
+
+  // Iterative access.
+  int getNumFonts() { return numFonts; }
+  GfxFont *getFont(int i) { return fonts[i]; }
+
+private:
+
+  GfxFont **fonts;             // list of fonts
+  int numFonts;                        // number of fonts
+};
+
+#endif
diff --git a/poppler/GfxState.cc b/poppler/GfxState.cc
new file mode 100644 (file)
index 0000000..252e88d
--- /dev/null
@@ -0,0 +1,6129 @@
+//========================================================================
+//
+// GfxState.cc
+//
+// Copyright 1996-2003 Glyph & Cog, LLC
+//
+//========================================================================
+
+//========================================================================
+//
+// Modified under the Poppler project - http://poppler.freedesktop.org
+//
+// All changes made under the Poppler project to this file are licensed
+// under GPL version 2 or later
+//
+// Copyright (C) 2005 Kristian Høgsberg <krh@redhat.com>
+// Copyright (C) 2006, 2007 Jeff Muizelaar <jeff@infidigm.net>
+// Copyright (C) 2006, 2010 Carlos Garcia Campos <carlosgc@gnome.org>
+// Copyright (C) 2006-2012 Albert Astals Cid <aacid@kde.org>
+// Copyright (C) 2009, 2012 Koji Otani <sho@bbr.jp>
+// Copyright (C) 2009, 2011, 2012 Thomas Freitag <Thomas.Freitag@alfa.de>
+// Copyright (C) 2009 Christian Persch <chpe@gnome.org>
+// Copyright (C) 2010 Paweł Wiejacha <pawel.wiejacha@gmail.com>
+// Copyright (C) 2010 Christian Feuersänger <cfeuersaenger@googlemail.com>
+// Copyright (C) 2011 Andrea Canciani <ranma42@gmail.com>
+// Copyright (C) 2012 William Bader <williambader@hotmail.com>
+//
+// To see a description of the changes please see the Changelog file that
+// came with your tarball or type make ChangeLog if you are building from git
+//
+//========================================================================
+
+#include <config.h>
+
+#ifdef USE_GCC_PRAGMAS
+#pragma implementation
+#endif
+
+#include <algorithm>
+#include <stddef.h>
+#include <math.h>
+#include <string.h>
+#include "goo/gmem.h"
+#include "Error.h"
+#include "Object.h"
+#include "Array.h"
+#include "Page.h"
+#include "Gfx.h"
+#include "GfxState.h"
+#include "GfxState_helpers.h"
+#include "GfxFont.h"
+#include "GlobalParams.h"
+#include "PopplerCache.h"
+
+//------------------------------------------------------------------------
+
+// Max depth of nested color spaces.  This is used to catch infinite
+// loops in the color space object structure.
+#define colorSpaceRecursionLimit 8
+
+//------------------------------------------------------------------------
+
+GBool Matrix::invertTo(Matrix *other) const
+{
+  double det;
+
+  det = 1 / determinant();
+  other->m[0] = m[3] * det;
+  other->m[1] = -m[1] * det;
+  other->m[2] = -m[2] * det;
+  other->m[3] = m[0] * det;
+  other->m[4] = (m[2] * m[5] - m[3] * m[4]) * det;
+  other->m[5] = (m[1] * m[4] - m[0] * m[5]) * det;
+
+  return gTrue;
+}
+
+void Matrix::transform(double x, double y, double *tx, double *ty) const
+{
+  double temp_x, temp_y;
+
+  temp_x = m[0] * x + m[2] * y + m[4];
+  temp_y = m[1] * x + m[3] * y + m[5];
+
+  *tx = temp_x;
+  *ty = temp_y;
+}
+
+// Matrix norm, taken from _cairo_matrix_transformed_circle_major_axis
+double Matrix::norm() const
+{
+  double f, g, h, i, j;
+
+  i = m[0]*m[0] + m[1]*m[1];
+  j = m[2]*m[2] + m[3]*m[3];
+
+  f = 0.5 * (i + j);
+  g = 0.5 * (i - j);
+  h = m[0]*m[2] + m[1]*m[3];
+
+  return sqrt (f + hypot (g, h));
+}
+
+//------------------------------------------------------------------------
+
+struct GfxBlendModeInfo {
+  const char *name;
+  GfxBlendMode mode;
+};
+
+static const GfxBlendModeInfo gfxBlendModeNames[] = {
+  { "Normal",     gfxBlendNormal },
+  { "Compatible", gfxBlendNormal },
+  { "Multiply",   gfxBlendMultiply },
+  { "Screen",     gfxBlendScreen },
+  { "Overlay",    gfxBlendOverlay },
+  { "Darken",     gfxBlendDarken },
+  { "Lighten",    gfxBlendLighten },
+  { "ColorDodge", gfxBlendColorDodge },
+  { "ColorBurn",  gfxBlendColorBurn },
+  { "HardLight",  gfxBlendHardLight },
+  { "SoftLight",  gfxBlendSoftLight },
+  { "Difference", gfxBlendDifference },
+  { "Exclusion",  gfxBlendExclusion },
+  { "Hue",        gfxBlendHue },
+  { "Saturation", gfxBlendSaturation },
+  { "Color",      gfxBlendColor },
+  { "Luminosity", gfxBlendLuminosity }
+};
+
+#define nGfxBlendModeNames \
+          ((int)((sizeof(gfxBlendModeNames) / sizeof(GfxBlendModeInfo))))
+        
+//------------------------------------------------------------------------
+// 
+// NB: This must match the GfxColorSpaceMode enum defined in
+// GfxState.h
+static const char *gfxColorSpaceModeNames[] = {
+  "DeviceGray",
+  "CalGray",
+  "DeviceRGB",
+  "CalRGB",
+  "DeviceCMYK",
+  "Lab",
+  "ICCBased",
+  "Indexed",
+  "Separation",
+  "DeviceN",
+  "Pattern"
+};
+
+#define nGfxColorSpaceModes ((sizeof(gfxColorSpaceModeNames) / sizeof(char *)))
+
+#ifdef USE_CMS
+
+#ifdef USE_LCMS1
+#include <lcms.h>
+#define cmsColorSpaceSignature icColorSpaceSignature
+#define cmsSetLogErrorHandler cmsSetErrorHandler
+#define cmsSigXYZData icSigXYZData
+#define cmsSigLuvData icSigLuvData
+#define cmsSigLabData icSigLabData
+#define cmsSigYCbCrData icSigYCbCrData
+#define cmsSigYxyData icSigYxyData
+#define cmsSigRgbData icSigRgbData
+#define cmsSigHsvData icSigHsvData
+#define cmsSigHlsData icSigHlsData
+#define cmsSigCmyData icSigCmyData
+#define cmsSig3colorData icSig3colorData
+#define cmsSigGrayData icSigGrayData
+#define cmsSigCmykData icSigCmykData
+#define cmsSig4colorData icSig4colorData
+#define cmsSig2colorData icSig2colorData
+#define cmsSig5colorData icSig5colorData
+#define cmsSig6colorData icSig6colorData
+#define cmsSig7colorData icSig7colorData
+#define cmsSig8colorData icSig8colorData
+#define cmsSig9colorData icSig9colorData
+#define cmsSig10colorData icSig10colorData
+#define cmsSig11colorData icSig11colorData
+#define cmsSig12colorData icSig12colorData
+#define cmsSig13colorData icSig13colorData
+#define cmsSig14colorData icSig14colorData
+#define cmsSig15colorData icSig15colorData
+#define LCMS_FLAGS 0
+#else
+#include <lcms2.h>
+#define LCMS_FLAGS cmsFLAGS_NOOPTIMIZE
+#endif
+
+#define COLOR_PROFILE_DIR "/ColorProfiles/"
+#define GLOBAL_COLOR_PROFILE_DIR POPPLER_DATADIR COLOR_PROFILE_DIR
+
+void GfxColorTransform::doTransform(void *in, void *out, unsigned int size) {
+  cmsDoTransform(transform, in, out, size);
+}
+
+// transformA should be a cmsHTRANSFORM
+GfxColorTransform::GfxColorTransform(void *transformA) {
+  transform = transformA;
+  refCount = 1;
+}
+
+GfxColorTransform::~GfxColorTransform() {
+  cmsDeleteTransform(transform);
+}
+
+void GfxColorTransform::ref() {
+  refCount++;
+}
+
+unsigned int GfxColorTransform::unref() {
+  return --refCount;
+}
+
+static cmsHPROFILE RGBProfile = NULL;
+static GooString *displayProfileName = NULL; // display profile file Name
+static cmsHPROFILE displayProfile = NULL; // display profile
+static unsigned int displayPixelType = 0;
+static GfxColorTransform *XYZ2DisplayTransform = NULL;
+
+// convert color space signature to cmsColor type 
+static unsigned int getCMSColorSpaceType(cmsColorSpaceSignature cs);
+static unsigned int getCMSNChannels(cmsColorSpaceSignature cs);
+static cmsHPROFILE loadColorProfile(const char *fileName);
+
+void GfxColorSpace::setDisplayProfile(void *displayProfileA) {
+  displayProfile = displayProfileA;
+}
+
+void GfxColorSpace::setDisplayProfileName(GooString *name) {
+  displayProfileName = name->copy();
+}
+
+cmsHPROFILE GfxColorSpace::getRGBProfile() {
+  return RGBProfile;
+}
+
+cmsHPROFILE GfxColorSpace::getDisplayProfile() {
+  return displayProfile;
+}
+
+#endif
+
+//------------------------------------------------------------------------
+// GfxColorSpace
+//------------------------------------------------------------------------
+
+GfxColorSpace::GfxColorSpace() {
+  overprintMask = 0x0f;
+}
+
+GfxColorSpace::~GfxColorSpace() {
+}
+
+GfxColorSpace *GfxColorSpace::parse(Object *csObj, Gfx *gfx, int recursion) {
+  GfxColorSpace *cs;
+  Object obj1;
+
+  if (recursion > colorSpaceRecursionLimit) {
+    error(errSyntaxError, -1, "Loop detected in color space objects");
+    return NULL;
+  }
+
+  cs = NULL;
+  if (csObj->isName()) {
+    if (csObj->isName("DeviceGray") || csObj->isName("G")) {
+      cs = new GfxDeviceGrayColorSpace();
+    } else if (csObj->isName("DeviceRGB") || csObj->isName("RGB")) {
+      cs = new GfxDeviceRGBColorSpace();
+    } else if (csObj->isName("DeviceCMYK") || csObj->isName("CMYK")) {
+      cs = new GfxDeviceCMYKColorSpace();
+    } else if (csObj->isName("Pattern")) {
+      cs = new GfxPatternColorSpace(NULL);
+    } else {
+      error(errSyntaxWarning, -1, "Bad color space '{0:s}'", csObj->getName());
+    }
+  } else if (csObj->isArray() && csObj->arrayGetLength() > 0) {
+    csObj->arrayGet(0, &obj1);
+    if (obj1.isName("DeviceGray") || obj1.isName("G")) {
+      cs = new GfxDeviceGrayColorSpace();
+    } else if (obj1.isName("DeviceRGB") || obj1.isName("RGB")) {
+      cs = new GfxDeviceRGBColorSpace();
+    } else if (obj1.isName("DeviceCMYK") || obj1.isName("CMYK")) {
+      cs = new GfxDeviceCMYKColorSpace();
+    } else if (obj1.isName("CalGray")) {
+      cs = GfxCalGrayColorSpace::parse(csObj->getArray());
+    } else if (obj1.isName("CalRGB")) {
+      cs = GfxCalRGBColorSpace::parse(csObj->getArray());
+    } else if (obj1.isName("Lab")) {
+      cs = GfxLabColorSpace::parse(csObj->getArray());
+    } else if (obj1.isName("ICCBased")) {
+      cs = GfxICCBasedColorSpace::parse(csObj->getArray(), gfx, recursion);
+    } else if (obj1.isName("Indexed") || obj1.isName("I")) {
+      cs = GfxIndexedColorSpace::parse(csObj->getArray(), gfx, recursion);
+    } else if (obj1.isName("Separation")) {
+      cs = GfxSeparationColorSpace::parse(csObj->getArray(), gfx, recursion);
+    } else if (obj1.isName("DeviceN")) {
+      cs = GfxDeviceNColorSpace::parse(csObj->getArray(), gfx, recursion);
+    } else if (obj1.isName("Pattern")) {
+      cs = GfxPatternColorSpace::parse(csObj->getArray(), gfx, recursion);
+    } else {
+      error(errSyntaxWarning, -1, "Bad color space");
+    }
+    obj1.free();
+  } else if (csObj->isDict()) {
+    csObj->dictLookup("ColorSpace", &obj1);
+    if (obj1.isName("DeviceGray")) {
+      cs = new GfxDeviceGrayColorSpace();
+    } else if (obj1.isName("DeviceRGB")) {
+      cs = new GfxDeviceRGBColorSpace();
+    } else if (obj1.isName("DeviceCMYK")) {
+      cs = new GfxDeviceCMYKColorSpace();
+    } else {
+      error(errSyntaxWarning, -1, "Bad color space '{0:s}'", csObj->getName());
+    }
+    obj1.free();
+  } else {
+    error(errSyntaxWarning, -1, "Bad color space - expected name or array or dict");
+  }
+  return cs;
+}
+
+void GfxColorSpace::getDefaultRanges(double *decodeLow, double *decodeRange,
+                                    int maxImgPixel) {
+  int i;
+
+  for (i = 0; i < getNComps(); ++i) {
+    decodeLow[i] = 0;
+    decodeRange[i] = 1;
+  }
+}
+
+int GfxColorSpace::getNumColorSpaceModes() {
+  return nGfxColorSpaceModes;
+}
+
+const char *GfxColorSpace::getColorSpaceModeName(int idx) {
+  return gfxColorSpaceModeNames[idx];
+}
+
+#ifdef USE_CMS
+cmsHPROFILE loadColorProfile(const char *fileName)
+{
+  cmsHPROFILE hp = NULL;
+  FILE *fp;
+
+  if (fileName[0] == '/') {
+    // full path
+    // check if open the file
+    if ((fp = fopen(fileName,"r")) != NULL) {
+      fclose(fp);
+      hp = cmsOpenProfileFromFile(fileName,"r");
+    }
+    return hp;
+  }
+  // try to load from user directory
+  GooString *path = globalParams->getBaseDir();
+  path->append(COLOR_PROFILE_DIR);
+  path->append(fileName);
+  // check if open the file
+  if ((fp = fopen(path->getCString(),"r")) != NULL) {
+    fclose(fp);
+    hp = cmsOpenProfileFromFile(path->getCString(),"r");
+  }
+  delete path;
+  if (hp == NULL) {
+    // load from global directory
+    path = new GooString(GLOBAL_COLOR_PROFILE_DIR);
+    path->append(fileName);
+    // check if open the file
+    if ((fp = fopen(path->getCString(),"r")) != NULL) {
+      fclose(fp);
+      hp = cmsOpenProfileFromFile(path->getCString(),"r");
+    }
+    delete path;
+  }
+  return hp;
+}
+
+#ifdef USE_LCMS1
+static int CMSError(int ecode, const char *msg)
+{
+    error(errSyntaxWarning, -1, "{0:s}", msg);
+    return 1;
+}
+#else
+static void CMSError(cmsContext /*contextId*/, cmsUInt32Number /*ecode*/, const char *text)
+{
+    error(errSyntaxWarning, -1, "{0:s}", text);
+}
+#endif
+
+int GfxColorSpace::setupColorProfiles()
+{
+  static GBool initialized = gFalse;
+  cmsHTRANSFORM transform;
+  unsigned int nChannels;
+
+  // do only once
+  if (initialized) return 0;
+  initialized = gTrue;
+
+  // set error handlor
+  cmsSetLogErrorHandler(CMSError);
+
+  if (displayProfile == NULL) {
+    // load display profile if it was not already loaded.
+    if (displayProfileName == NULL) {
+      displayProfile = loadColorProfile("display.icc");
+    } else if (displayProfileName->getLength() > 0) {
+      displayProfile = loadColorProfile(displayProfileName->getCString());
+    }
+  }
+  // load RGB profile
+  RGBProfile = loadColorProfile("RGB.icc");
+  if (RGBProfile == NULL) {
+    /* use built in sRGB profile */
+    RGBProfile = cmsCreate_sRGBProfile();
+  }
+  // create transforms
+  if (displayProfile != NULL) {
+    displayPixelType = getCMSColorSpaceType(cmsGetColorSpace(displayProfile));
+    nChannels = getCMSNChannels(cmsGetColorSpace(displayProfile));
+    // create transform from XYZ
+    cmsHPROFILE XYZProfile = cmsCreateXYZProfile();
+    if ((transform = cmsCreateTransform(XYZProfile, TYPE_XYZ_DBL,
+          displayProfile, 
+          COLORSPACE_SH(displayPixelType) |
+            CHANNELS_SH(nChannels) | BYTES_SH(1),
+         INTENT_RELATIVE_COLORIMETRIC,LCMS_FLAGS)) == 0) {
+      error(errSyntaxWarning, -1, "Can't create Lab transform");
+    } else {
+      XYZ2DisplayTransform = new GfxColorTransform(transform);
+    }
+    cmsCloseProfile(XYZProfile);
+  }
+  return 0;
+}
+
+unsigned int getCMSColorSpaceType(cmsColorSpaceSignature cs)
+{
+    switch (cs) {
+    case cmsSigXYZData:
+      return PT_XYZ;
+      break;
+    case cmsSigLabData:
+      return PT_Lab;
+      break;
+    case cmsSigLuvData:
+      return PT_YUV;
+      break;
+    case cmsSigYCbCrData:
+      return PT_YCbCr;
+      break;
+    case cmsSigYxyData:
+      return PT_Yxy;
+      break;
+    case cmsSigRgbData:
+      return PT_RGB;
+      break;
+    case cmsSigGrayData:
+      return PT_GRAY;
+      break;
+    case cmsSigHsvData:
+      return PT_HSV;
+      break;
+    case cmsSigHlsData:
+      return PT_HLS;
+      break;
+    case cmsSigCmykData:
+      return PT_CMYK;
+      break;
+    case cmsSigCmyData:
+      return PT_CMY;
+      break;
+    case cmsSig2colorData:
+    case cmsSig3colorData:
+    case cmsSig4colorData:
+    case cmsSig5colorData:
+    case cmsSig6colorData:
+    case cmsSig7colorData:
+    case cmsSig8colorData:
+    case cmsSig9colorData:
+    case cmsSig10colorData:
+    case cmsSig11colorData:
+    case cmsSig12colorData:
+    case cmsSig13colorData:
+    case cmsSig14colorData:
+    case cmsSig15colorData:
+    default:
+      break;
+    }
+    return PT_RGB;
+}
+
+unsigned int getCMSNChannels(cmsColorSpaceSignature cs)
+{
+    switch (cs) {
+    case cmsSigXYZData:
+    case cmsSigLuvData:
+    case cmsSigLabData:
+    case cmsSigYCbCrData:
+    case cmsSigYxyData:
+    case cmsSigRgbData:
+    case cmsSigHsvData:
+    case cmsSigHlsData:
+    case cmsSigCmyData:
+    case cmsSig3colorData:
+      return 3;
+      break;
+    case cmsSigGrayData:
+      return 1;
+      break;
+    case cmsSigCmykData:
+    case cmsSig4colorData:
+      return 4;
+      break;
+    case cmsSig2colorData:
+      return 2;
+      break;
+    case cmsSig5colorData:
+      return 5;
+      break;
+    case cmsSig6colorData:
+      return 6;
+      break;
+    case cmsSig7colorData:
+      return 7;
+      break;
+    case cmsSig8colorData:
+      return 8;
+      break;
+    case cmsSig9colorData:
+      return 9;
+      break;
+    case cmsSig10colorData:
+      return 10;
+      break;
+    case cmsSig11colorData:
+      return 11;
+      break;
+    case cmsSig12colorData:
+      return 12;
+      break;
+    case cmsSig13colorData:
+      return 13;
+      break;
+    case cmsSig14colorData:
+      return 14;
+      break;
+    case cmsSig15colorData:
+      return 15;
+    default:
+      break;
+    }
+    return 3;
+}
+#endif
+
+//------------------------------------------------------------------------
+// GfxDeviceGrayColorSpace
+//------------------------------------------------------------------------
+
+GfxDeviceGrayColorSpace::GfxDeviceGrayColorSpace() {
+}
+
+GfxDeviceGrayColorSpace::~GfxDeviceGrayColorSpace() {
+}
+
+GfxColorSpace *GfxDeviceGrayColorSpace::copy() {
+  return new GfxDeviceGrayColorSpace();
+}
+
+void GfxDeviceGrayColorSpace::getGray(GfxColor *color, GfxGray *gray) {
+  *gray = clip01(color->c[0]);
+}
+
+void GfxDeviceGrayColorSpace::getGrayLine(Guchar *in, Guchar *out, int length) {
+  memcpy (out, in, length);
+}
+
+void GfxDeviceGrayColorSpace::getRGB(GfxColor *color, GfxRGB *rgb) {
+  rgb->r = rgb->g = rgb->b = clip01(color->c[0]);
+}
+
+void GfxDeviceGrayColorSpace::getRGBLine(Guchar *in, unsigned int *out,
+                                        int length) {
+  int i;
+
+  for (i = 0; i < length; i++)
+    out[i] = (in[i] << 16) | (in[i] << 8) | (in[i] << 0);
+}
+
+void GfxDeviceGrayColorSpace::getRGBLine(Guchar *in, Guchar *out, int length) {
+  for (int i = 0; i < length; i++) {
+    *out++ = in[i];
+    *out++ = in[i];
+    *out++ = in[i];
+  }
+}
+
+void GfxDeviceGrayColorSpace::getRGBXLine(Guchar *in, Guchar *out, int length) {
+  for (int i = 0; i < length; i++) {
+    *out++ = in[i];
+    *out++ = in[i];
+    *out++ = in[i];
+    *out++ = 255;
+  }
+}
+
+void GfxDeviceGrayColorSpace::getCMYK(GfxColor *color, GfxCMYK *cmyk) {
+  cmyk->c = cmyk->m = cmyk->y = 0;
+  cmyk->k = clip01(gfxColorComp1 - color->c[0]);
+}
+
+void GfxDeviceGrayColorSpace::getDefaultColor(GfxColor *color) {
+  color->c[0] = 0;
+}
+
+//------------------------------------------------------------------------
+// GfxCalGrayColorSpace
+//------------------------------------------------------------------------
+
+GfxCalGrayColorSpace::GfxCalGrayColorSpace() {
+  whiteX = whiteY = whiteZ = 1;
+  blackX = blackY = blackZ = 0;
+  gamma = 1;
+}
+
+GfxCalGrayColorSpace::~GfxCalGrayColorSpace() {
+}
+
+GfxColorSpace *GfxCalGrayColorSpace::copy() {
+  GfxCalGrayColorSpace *cs;
+
+  cs = new GfxCalGrayColorSpace();
+  cs->whiteX = whiteX;
+  cs->whiteY = whiteY;
+  cs->whiteZ = whiteZ;
+  cs->blackX = blackX;
+  cs->blackY = blackY;
+  cs->blackZ = blackZ;
+  cs->gamma = gamma;
+  return cs;
+}
+
+// This is the inverse of MatrixLMN in Example 4.10 from the PostScript
+// Language Reference, Third Edition.
+static const double xyzrgb[3][3] = {
+  {  3.240449, -1.537136, -0.498531 },
+  { -0.969265,  1.876011,  0.041556 },
+  {  0.055643, -0.204026,  1.057229 }
+};
+
+GfxColorSpace *GfxCalGrayColorSpace::parse(Array *arr) {
+  GfxCalGrayColorSpace *cs;
+  Object obj1, obj2, obj3;
+
+  arr->get(1, &obj1);
+  if (!obj1.isDict()) {
+    error(errSyntaxWarning, -1, "Bad CalGray color space");
+    obj1.free();
+    return NULL;
+  }
+  cs = new GfxCalGrayColorSpace();
+  if (obj1.dictLookup("WhitePoint", &obj2)->isArray() &&
+      obj2.arrayGetLength() == 3) {
+    obj2.arrayGet(0, &obj3);
+    if (likely(obj3.isNum()))
+      cs->whiteX = obj3.getNum();
+    obj3.free();
+    obj2.arrayGet(1, &obj3);
+    if (likely(obj3.isNum()))
+      cs->whiteY = obj3.getNum();
+    obj3.free();
+    obj2.arrayGet(2, &obj3);
+    if (likely(obj3.isNum()))
+      cs->whiteZ = obj3.getNum();
+    obj3.free();
+  }
+  obj2.free();
+  if (obj1.dictLookup("BlackPoint", &obj2)->isArray() &&
+      obj2.arrayGetLength() == 3) {
+    obj2.arrayGet(0, &obj3);
+    if (likely(obj3.isNum()))
+      cs->blackX = obj3.getNum();
+    obj3.free();
+    obj2.arrayGet(1, &obj3);
+    if (likely(obj3.isNum()))
+      cs->blackY = obj3.getNum();
+    obj3.free();
+    obj2.arrayGet(2, &obj3);
+    if (likely(obj3.isNum()))
+      cs->blackZ = obj3.getNum();
+    obj3.free();
+  }
+  obj2.free();
+  if (obj1.dictLookup("Gamma", &obj2)->isNum()) {
+    cs->gamma = obj2.getNum();
+  }
+  obj2.free();
+  obj1.free();
+
+  cs->kr = 1 / (xyzrgb[0][0] * cs->whiteX +
+               xyzrgb[0][1] * cs->whiteY +
+               xyzrgb[0][2] * cs->whiteZ);
+  cs->kg = 1 / (xyzrgb[1][0] * cs->whiteX +
+               xyzrgb[1][1] * cs->whiteY +
+               xyzrgb[1][2] * cs->whiteZ);
+  cs->kb = 1 / (xyzrgb[2][0] * cs->whiteX +
+               xyzrgb[2][1] * cs->whiteY +
+               xyzrgb[2][2] * cs->whiteZ);
+
+  return cs;
+}
+
+// convert CalGray to media XYZ color space
+// (not multiply by the white point)
+void GfxCalGrayColorSpace::getXYZ(GfxColor *color, 
+  double *pX, double *pY, double *pZ) {
+  const double A = colToDbl(color->c[0]);
+  const double xyzColor = pow(A,gamma);
+  *pX = xyzColor;
+  *pY = xyzColor;
+  *pZ = xyzColor;
+}
+
+void GfxCalGrayColorSpace::getGray(GfxColor *color, GfxGray *gray) {
+  GfxRGB rgb;
+
+#ifdef USE_CMS
+  if (XYZ2DisplayTransform != NULL && displayPixelType == PT_GRAY) {
+    Guchar out[gfxColorMaxComps];
+    double in[gfxColorMaxComps];
+    double X, Y, Z;
+    
+    getXYZ(color,&X,&Y,&Z);
+    in[0] = clip01(X);
+    in[1] = clip01(Y);
+    in[2] = clip01(Z);
+    XYZ2DisplayTransform->doTransform(in,out,1);
+    *gray = byteToCol(out[0]);
+    return;
+  }
+#endif
+  getRGB(color, &rgb);
+  *gray = clip01((GfxColorComp)(0.299 * rgb.r +
+                               0.587 * rgb.g +
+                               0.114 * rgb.b + 0.5));
+}
+
+void GfxCalGrayColorSpace::getRGB(GfxColor *color, GfxRGB *rgb) {
+  double X, Y, Z;
+  double r, g, b;
+
+  getXYZ(color,&X,&Y,&Z);
+#ifdef USE_CMS
+  if (XYZ2DisplayTransform != NULL && displayPixelType == PT_RGB) {
+    Guchar out[gfxColorMaxComps];
+    double in[gfxColorMaxComps];
+    
+    in[0] = clip01(X);
+    in[1] = clip01(Y);
+    in[2] = clip01(Z);
+    XYZ2DisplayTransform->doTransform(in,out,1);
+    rgb->r = byteToCol(out[0]);
+    rgb->g = byteToCol(out[1]);
+    rgb->b = byteToCol(out[2]);
+    return;
+  }
+#endif
+  X *= whiteX;
+  Y *= whiteY;
+  Z *= whiteZ;
+  // convert XYZ to RGB, including gamut mapping and gamma correction
+  r = xyzrgb[0][0] * X + xyzrgb[0][1] * Y + xyzrgb[0][2] * Z;
+  g = xyzrgb[1][0] * X + xyzrgb[1][1] * Y + xyzrgb[1][2] * Z;
+  b = xyzrgb[2][0] * X + xyzrgb[2][1] * Y + xyzrgb[2][2] * Z;
+  rgb->r = dblToCol(sqrt(clip01(r * kr)));
+  rgb->g = dblToCol(sqrt(clip01(g * kg)));
+  rgb->b = dblToCol(sqrt(clip01(b * kb)));
+}
+
+void GfxCalGrayColorSpace::getCMYK(GfxColor *color, GfxCMYK *cmyk) {
+  GfxRGB rgb;
+  GfxColorComp c, m, y, k;
+
+#ifdef USE_CMS
+  if (XYZ2DisplayTransform != NULL && displayPixelType == PT_CMYK) {
+    double in[gfxColorMaxComps];
+    Guchar out[gfxColorMaxComps];
+    double X, Y, Z;
+    
+    getXYZ(color,&X,&Y,&Z);
+    in[0] = clip01(X);
+    in[1] = clip01(Y);
+    in[2] = clip01(Z);
+    
+    XYZ2DisplayTransform->doTransform(in,out,1);
+    cmyk->c = byteToCol(out[0]);
+    cmyk->m = byteToCol(out[1]);
+    cmyk->y = byteToCol(out[2]);
+    cmyk->k = byteToCol(out[3]);
+    return;
+  }
+#endif
+  getRGB(color, &rgb);
+  c = clip01(gfxColorComp1 - rgb.r);
+  m = clip01(gfxColorComp1 - rgb.g);
+  y = clip01(gfxColorComp1 - rgb.b);
+  k = c;
+  if (m < k) {
+    k = m;
+  }
+  if (y < k) {
+    k = y;
+  }
+  cmyk->c = c - k;
+  cmyk->m = m - k;
+  cmyk->y = y - k;
+  cmyk->k = k;
+}
+
+void GfxCalGrayColorSpace::getDefaultColor(GfxColor *color) {
+  color->c[0] = 0;
+}
+
+//------------------------------------------------------------------------
+// GfxDeviceRGBColorSpace
+//------------------------------------------------------------------------
+
+GfxDeviceRGBColorSpace::GfxDeviceRGBColorSpace() {
+}
+
+GfxDeviceRGBColorSpace::~GfxDeviceRGBColorSpace() {
+}
+
+GfxColorSpace *GfxDeviceRGBColorSpace::copy() {
+  return new GfxDeviceRGBColorSpace();
+}
+
+void GfxDeviceRGBColorSpace::getGray(GfxColor *color, GfxGray *gray) {
+  *gray = clip01((GfxColorComp)(0.3 * color->c[0] +
+                0.59 * color->c[1] +
+                0.11 * color->c[2] + 0.5));
+}
+
+void GfxDeviceRGBColorSpace::getGrayLine(Guchar *in, Guchar *out, int length) {
+  int i;
+
+  for (i = 0; i < length; i++) {
+    out[i] = 
+      (in[i * 3 + 0] * 19595 + 
+       in[i * 3 + 1] * 38469 + 
+       in[i * 3 + 2] * 7472) / 65536;
+  }
+}
+
+void GfxDeviceRGBColorSpace::getRGB(GfxColor *color, GfxRGB *rgb) {
+  rgb->r = clip01(color->c[0]);
+  rgb->g = clip01(color->c[1]);
+  rgb->b = clip01(color->c[2]);
+}
+
+void GfxDeviceRGBColorSpace::getRGBLine(Guchar *in, unsigned int *out,
+                                       int length) {
+  Guchar *p;
+  int i;
+
+  for (i = 0, p = in; i < length; i++, p += 3)
+    out[i] = (p[0] << 16) | (p[1] << 8) | (p[2] << 0);
+}
+
+void GfxDeviceRGBColorSpace::getRGBLine(Guchar *in, Guchar *out, int length) {
+  for (int i = 0; i < length; i++) {
+    *out++ = *in++;
+    *out++ = *in++;
+    *out++ = *in++;
+  }
+}
+
+void GfxDeviceRGBColorSpace::getRGBXLine(Guchar *in, Guchar *out, int length) {
+  for (int i = 0; i < length; i++) {
+    *out++ = *in++;
+    *out++ = *in++;
+    *out++ = *in++;
+    *out++ = 255;
+  }
+}
+void GfxDeviceRGBColorSpace::getCMYK(GfxColor *color, GfxCMYK *cmyk) {
+  GfxColorComp c, m, y, k;
+
+  c = clip01(gfxColorComp1 - color->c[0]);
+  m = clip01(gfxColorComp1 - color->c[1]);
+  y = clip01(gfxColorComp1 - color->c[2]);
+  k = c;
+  if (m < k) {
+    k = m;
+  }
+  if (y < k) {
+    k = y;
+  }
+  cmyk->c = c - k;
+  cmyk->m = m - k;
+  cmyk->y = y - k;
+  cmyk->k = k;
+}
+
+void GfxDeviceRGBColorSpace::getDefaultColor(GfxColor *color) {
+  color->c[0] = 0;
+  color->c[1] = 0;
+  color->c[2] = 0;
+}
+
+//------------------------------------------------------------------------
+// GfxCalRGBColorSpace
+//------------------------------------------------------------------------
+
+GfxCalRGBColorSpace::GfxCalRGBColorSpace() {
+  whiteX = whiteY = whiteZ = 1;
+  blackX = blackY = blackZ = 0;
+  gammaR = gammaG = gammaB = 1;
+  mat[0] = 1; mat[1] = 0; mat[2] = 0;
+  mat[3] = 0; mat[4] = 1; mat[5] = 0;
+  mat[6] = 0; mat[7] = 0; mat[8] = 1;
+}
+
+GfxCalRGBColorSpace::~GfxCalRGBColorSpace() {
+}
+
+GfxColorSpace *GfxCalRGBColorSpace::copy() {
+  GfxCalRGBColorSpace *cs;
+  int i;
+
+  cs = new GfxCalRGBColorSpace();
+  cs->whiteX = whiteX;
+  cs->whiteY = whiteY;
+  cs->whiteZ = whiteZ;
+  cs->blackX = blackX;
+  cs->blackY = blackY;
+  cs->blackZ = blackZ;
+  cs->gammaR = gammaR;
+  cs->gammaG = gammaG;
+  cs->gammaB = gammaB;
+  for (i = 0; i < 9; ++i) {
+    cs->mat[i] = mat[i];
+  }
+  return cs;
+}
+
+GfxColorSpace *GfxCalRGBColorSpace::parse(Array *arr) {
+  GfxCalRGBColorSpace *cs;
+  Object obj1, obj2, obj3;
+  int i;
+
+  arr->get(1, &obj1);
+  if (!obj1.isDict()) {
+    error(errSyntaxWarning, -1, "Bad CalRGB color space");
+    obj1.free();
+    return NULL;
+  }
+  cs = new GfxCalRGBColorSpace();
+  if (obj1.dictLookup("WhitePoint", &obj2)->isArray() &&
+      obj2.arrayGetLength() == 3) {
+    obj2.arrayGet(0, &obj3);
+    if (likely(obj3.isNum()))
+      cs->whiteX = obj3.getNum();
+    obj3.free();
+    obj2.arrayGet(1, &obj3);
+    if (likely(obj3.isNum()))
+      cs->whiteY = obj3.getNum();
+    obj3.free();
+    obj2.arrayGet(2, &obj3);
+    if (likely(obj3.isNum()))
+      cs->whiteZ = obj3.getNum();
+    obj3.free();
+  }
+  obj2.free();
+  if (obj1.dictLookup("BlackPoint", &obj2)->isArray() &&
+      obj2.arrayGetLength() == 3) {
+    obj2.arrayGet(0, &obj3);
+    if (likely(obj3.isNum()))
+      cs->blackX = obj3.getNum();
+    obj3.free();
+    obj2.arrayGet(1, &obj3);
+    if (likely(obj3.isNum()))
+      cs->blackY = obj3.getNum();
+    obj3.free();
+    obj2.arrayGet(2, &obj3);
+    if (likely(obj3.isNum()))
+      cs->blackZ = obj3.getNum();
+    obj3.free();
+  }
+  obj2.free();
+  if (obj1.dictLookup("Gamma", &obj2)->isArray() &&
+      obj2.arrayGetLength() == 3) {
+    obj2.arrayGet(0, &obj3);
+    if (likely(obj3.isNum()))
+      cs->gammaR = obj3.getNum();
+    obj3.free();
+    obj2.arrayGet(1, &obj3);
+    if (likely(obj3.isNum()))
+      cs->gammaG = obj3.getNum();
+    obj3.free();
+    obj2.arrayGet(2, &obj3);
+    if (likely(obj3.isNum()))
+      cs->gammaB = obj3.getNum();
+    obj3.free();
+  }
+  obj2.free();
+  if (obj1.dictLookup("Matrix", &obj2)->isArray() &&
+      obj2.arrayGetLength() == 9) {
+    for (i = 0; i < 9; ++i) {
+      obj2.arrayGet(i, &obj3);
+      if (likely(obj3.isNum()))
+        cs->mat[i] = obj3.getNum();
+      obj3.free();
+    }
+  }
+  obj2.free();
+  obj1.free();
+
+  cs->kr = 1 / (xyzrgb[0][0] * cs->whiteX +
+               xyzrgb[0][1] * cs->whiteY +
+               xyzrgb[0][2] * cs->whiteZ);
+  cs->kg = 1 / (xyzrgb[1][0] * cs->whiteX +
+               xyzrgb[1][1] * cs->whiteY +
+               xyzrgb[1][2] * cs->whiteZ);
+  cs->kb = 1 / (xyzrgb[2][0] * cs->whiteX +
+               xyzrgb[2][1] * cs->whiteY +
+               xyzrgb[2][2] * cs->whiteZ);
+
+  return cs;
+}
+
+// convert CalRGB to XYZ color space
+void GfxCalRGBColorSpace::getXYZ(GfxColor *color, 
+  double *pX, double *pY, double *pZ) {
+  double A, B, C;
+
+  A = pow(colToDbl(color->c[0]), gammaR);
+  B = pow(colToDbl(color->c[1]), gammaG);
+  C = pow(colToDbl(color->c[2]), gammaB);
+  *pX = mat[0] * A + mat[3] * B + mat[6] * C;
+  *pY = mat[1] * A + mat[4] * B + mat[7] * C;
+  *pZ = mat[2] * A + mat[5] * B + mat[8] * C;
+}
+
+void GfxCalRGBColorSpace::getGray(GfxColor *color, GfxGray *gray) {
+  GfxRGB rgb;
+
+#ifdef USE_CMS
+  if (XYZ2DisplayTransform != NULL && displayPixelType == PT_GRAY) {
+    Guchar out[gfxColorMaxComps];
+    double in[gfxColorMaxComps];
+    double X, Y, Z;
+    
+    getXYZ(color,&X,&Y,&Z);
+    in[0] = clip01(X);
+    in[1] = clip01(Y);
+    in[2] = clip01(Z);
+    XYZ2DisplayTransform->doTransform(in,out,1);
+    *gray = byteToCol(out[0]);
+    return;
+  }
+#endif
+  getRGB(color, &rgb);
+  *gray = clip01((GfxColorComp)(0.299 * rgb.r +
+                               0.587 * rgb.g +
+                               0.114 * rgb.b + 0.5));
+}
+
+void GfxCalRGBColorSpace::getRGB(GfxColor *color, GfxRGB *rgb) {
+  double X, Y, Z;
+  double r, g, b;
+
+  getXYZ(color,&X,&Y,&Z);
+#ifdef USE_CMS
+  if (XYZ2DisplayTransform != NULL && displayPixelType == PT_RGB) {
+    Guchar out[gfxColorMaxComps];
+    double in[gfxColorMaxComps];
+    
+    in[0] = clip01(X/whiteX);
+    in[1] = clip01(Y/whiteY);
+    in[2] = clip01(Z/whiteZ);
+    XYZ2DisplayTransform->doTransform(in,out,1);
+    rgb->r = byteToCol(out[0]);
+    rgb->g = byteToCol(out[1]);
+    rgb->b = byteToCol(out[2]);
+    return;
+  }
+#endif
+  // convert XYZ to RGB, including gamut mapping and gamma correction
+  r = xyzrgb[0][0] * X + xyzrgb[0][1] * Y + xyzrgb[0][2] * Z;
+  g = xyzrgb[1][0] * X + xyzrgb[1][1] * Y + xyzrgb[1][2] * Z;
+  b = xyzrgb[2][0] * X + xyzrgb[2][1] * Y + xyzrgb[2][2] * Z;
+  rgb->r = dblToCol(sqrt(clip01(r)));
+  rgb->g = dblToCol(sqrt(clip01(g)));
+  rgb->b = dblToCol(sqrt(clip01(b)));
+}
+
+void GfxCalRGBColorSpace::getCMYK(GfxColor *color, GfxCMYK *cmyk) {
+  GfxRGB rgb;
+  GfxColorComp c, m, y, k;
+
+#ifdef USE_CMS
+  if (XYZ2DisplayTransform != NULL && displayPixelType == PT_CMYK) {
+    double in[gfxColorMaxComps];
+    Guchar out[gfxColorMaxComps];
+    double X, Y, Z;
+    
+    getXYZ(color,&X,&Y,&Z);
+    in[0] = clip01(X);
+    in[1] = clip01(Y);
+    in[2] = clip01(Z);
+    XYZ2DisplayTransform->doTransform(in,out,1);
+    cmyk->c = byteToCol(out[0]);
+    cmyk->m = byteToCol(out[1]);
+    cmyk->y = byteToCol(out[2]);
+    cmyk->k = byteToCol(out[3]);
+    return;
+  }
+#endif
+  getRGB(color, &rgb);
+  c = clip01(gfxColorComp1 - rgb.r);
+  m = clip01(gfxColorComp1 - rgb.g);
+  y = clip01(gfxColorComp1 - rgb.b);
+  k = c;
+  if (m < k) {
+    k = m;
+  }
+  if (y < k) {
+    k = y;
+  }
+  cmyk->c = c - k;
+  cmyk->m = m - k;
+  cmyk->y = y - k;
+  cmyk->k = k;
+}
+
+void GfxCalRGBColorSpace::getDefaultColor(GfxColor *color) {
+  color->c[0] = 0;
+  color->c[1] = 0;
+  color->c[2] = 0;
+}
+
+//------------------------------------------------------------------------
+// GfxDeviceCMYKColorSpace
+//------------------------------------------------------------------------
+
+GfxDeviceCMYKColorSpace::GfxDeviceCMYKColorSpace() {
+}
+
+GfxDeviceCMYKColorSpace::~GfxDeviceCMYKColorSpace() {
+}
+
+GfxColorSpace *GfxDeviceCMYKColorSpace::copy() {
+  return new GfxDeviceCMYKColorSpace();
+}
+
+void GfxDeviceCMYKColorSpace::getGray(GfxColor *color, GfxGray *gray) {
+  *gray = clip01((GfxColorComp)(gfxColorComp1 - color->c[3]
+                               - 0.3  * color->c[0]
+                               - 0.59 * color->c[1]
+                               - 0.11 * color->c[2] + 0.5));
+}
+
+void GfxDeviceCMYKColorSpace::getRGB(GfxColor *color, GfxRGB *rgb) {
+  double c, m, y, k, c1, m1, y1, k1, r, g, b;
+    
+  c = colToDbl(color->c[0]);
+  m = colToDbl(color->c[1]);
+  y = colToDbl(color->c[2]);
+  k = colToDbl(color->c[3]);
+  c1 = 1 - c;
+  m1 = 1 - m;
+  y1 = 1 - y;
+  k1 = 1 - k;
+  cmykToRGBMatrixMultiplication(c, m, y, k, c1, m1, y1, k1, r, g, b);
+  rgb->r = clip01(dblToCol(r));
+  rgb->g = clip01(dblToCol(g));
+  rgb->b = clip01(dblToCol(b));
+}
+
+static inline void GfxDeviceCMYKColorSpacegetRGBLineHelper(Guchar *&in, double &r, double &g, double &b)
+{
+  double c, m, y, k, c1, m1, y1, k1;
+  
+  c = byteToDbl(*in++);
+  m = byteToDbl(*in++);
+  y = byteToDbl(*in++);
+  k = byteToDbl(*in++);
+  c1 = 1 - c;
+  m1 = 1 - m;
+  y1 = 1 - y;
+  k1 = 1 - k;
+  cmykToRGBMatrixMultiplication(c, m, y, k, c1, m1, y1, k1, r, g, b);
+}
+
+void GfxDeviceCMYKColorSpace::getRGBLine(Guchar *in, unsigned int *out, int length)
+{
+  double r, g, b;
+  for (int i = 0; i < length; i++) {
+    GfxDeviceCMYKColorSpacegetRGBLineHelper(in, r, g, b);
+    *out++ = (dblToByte(clip01(r)) << 16) | (dblToByte(clip01(g)) << 8) | dblToByte(clip01(b));
+  }
+}
+
+void GfxDeviceCMYKColorSpace::getRGBLine(Guchar *in, Guchar *out, int length)
+{
+  double r, g, b;
+  
+  for (int i = 0; i < length; i++) {
+    GfxDeviceCMYKColorSpacegetRGBLineHelper(in, r, g, b);
+    *out++ = dblToByte(clip01(r));
+    *out++ = dblToByte(clip01(g));
+    *out++ = dblToByte(clip01(b));
+  }
+}
+
+void GfxDeviceCMYKColorSpace::getRGBXLine(Guchar *in, Guchar *out, int length)
+{
+  double r, g, b;
+  
+  for (int i = 0; i < length; i++) {
+    GfxDeviceCMYKColorSpacegetRGBLineHelper(in, r, g, b);
+    *out++ = dblToByte(clip01(r));
+    *out++ = dblToByte(clip01(g));
+    *out++ = dblToByte(clip01(b));
+    *out++ = 255;
+  }
+}
+
+void GfxDeviceCMYKColorSpace::getCMYK(GfxColor *color, GfxCMYK *cmyk) {
+  cmyk->c = clip01(color->c[0]);
+  cmyk->m = clip01(color->c[1]);
+  cmyk->y = clip01(color->c[2]);
+  cmyk->k = clip01(color->c[3]);
+}
+
+void GfxDeviceCMYKColorSpace::getDefaultColor(GfxColor *color) {
+  color->c[0] = 0;
+  color->c[1] = 0;
+  color->c[2] = 0;
+  color->c[3] = gfxColorComp1;
+}
+
+//------------------------------------------------------------------------
+// GfxLabColorSpace
+//------------------------------------------------------------------------
+
+GfxLabColorSpace::GfxLabColorSpace() {
+  whiteX = whiteY = whiteZ = 1;
+  blackX = blackY = blackZ = 0;
+  aMin = bMin = -100;
+  aMax = bMax = 100;
+}
+
+GfxLabColorSpace::~GfxLabColorSpace() {
+}
+
+GfxColorSpace *GfxLabColorSpace::copy() {
+  GfxLabColorSpace *cs;
+
+  cs = new GfxLabColorSpace();
+  cs->whiteX = whiteX;
+  cs->whiteY = whiteY;
+  cs->whiteZ = whiteZ;
+  cs->blackX = blackX;
+  cs->blackY = blackY;
+  cs->blackZ = blackZ;
+  cs->aMin = aMin;
+  cs->aMax = aMax;
+  cs->bMin = bMin;
+  cs->bMax = bMax;
+  cs->kr = kr;
+  cs->kg = kg;
+  cs->kb = kb;
+  return cs;
+}
+
+GfxColorSpace *GfxLabColorSpace::parse(Array *arr) {
+  GfxLabColorSpace *cs;
+  Object obj1, obj2, obj3;
+
+  arr->get(1, &obj1);
+  if (!obj1.isDict()) {
+    error(errSyntaxWarning, -1, "Bad Lab color space");
+    obj1.free();
+    return NULL;
+  }
+  cs = new GfxLabColorSpace();
+  if (obj1.dictLookup("WhitePoint", &obj2)->isArray() &&
+      obj2.arrayGetLength() == 3) {
+    obj2.arrayGet(0, &obj3);
+    cs->whiteX = obj3.getNum();
+    obj3.free();
+    obj2.arrayGet(1, &obj3);
+    cs->whiteY = obj3.getNum();
+    obj3.free();
+    obj2.arrayGet(2, &obj3);
+    cs->whiteZ = obj3.getNum();
+    obj3.free();
+  }
+  obj2.free();
+  if (obj1.dictLookup("BlackPoint", &obj2)->isArray() &&
+      obj2.arrayGetLength() == 3) {
+    obj2.arrayGet(0, &obj3);
+    cs->blackX = obj3.getNum();
+    obj3.free();
+    obj2.arrayGet(1, &obj3);
+    cs->blackY = obj3.getNum();
+    obj3.free();
+    obj2.arrayGet(2, &obj3);
+    cs->blackZ = obj3.getNum();
+    obj3.free();
+  }
+  obj2.free();
+  if (obj1.dictLookup("Range", &obj2)->isArray() &&
+      obj2.arrayGetLength() == 4) {
+    obj2.arrayGet(0, &obj3);
+    cs->aMin = obj3.getNum();
+    obj3.free();
+    obj2.arrayGet(1, &obj3);
+    cs->aMax = obj3.getNum();
+    obj3.free();
+    obj2.arrayGet(2, &obj3);
+    cs->bMin = obj3.getNum();
+    obj3.free();
+    obj2.arrayGet(3, &obj3);
+    cs->bMax = obj3.getNum();
+    obj3.free();
+  }
+  obj2.free();
+  obj1.free();
+
+  cs->kr = 1 / (xyzrgb[0][0] * cs->whiteX +
+               xyzrgb[0][1] * cs->whiteY +
+               xyzrgb[0][2] * cs->whiteZ);
+  cs->kg = 1 / (xyzrgb[1][0] * cs->whiteX +
+               xyzrgb[1][1] * cs->whiteY +
+               xyzrgb[1][2] * cs->whiteZ);
+  cs->kb = 1 / (xyzrgb[2][0] * cs->whiteX +
+               xyzrgb[2][1] * cs->whiteY +
+               xyzrgb[2][2] * cs->whiteZ);
+
+  return cs;
+}
+
+void GfxLabColorSpace::getGray(GfxColor *color, GfxGray *gray) {
+  GfxRGB rgb;
+
+#ifdef USE_CMS
+  if (XYZ2DisplayTransform != NULL && displayPixelType == PT_GRAY) {
+    Guchar out[gfxColorMaxComps];
+    double in[gfxColorMaxComps];
+    
+    getXYZ(color, &in[0], &in[1], &in[2]);
+    XYZ2DisplayTransform->doTransform(in,out,1);
+    *gray = byteToCol(out[0]);
+    return;
+  }
+#endif
+  getRGB(color, &rgb);
+  *gray = clip01((GfxColorComp)(0.299 * rgb.r +
+                               0.587 * rgb.g +
+                               0.114 * rgb.b + 0.5));
+}
+
+// convert L*a*b* to media XYZ color space
+// (not multiply by the white point)
+void GfxLabColorSpace::getXYZ(GfxColor *color, 
+  double *pX, double *pY, double *pZ) {
+  double X, Y, Z;
+  double t1, t2;
+
+  t1 = (colToDbl(color->c[0]) + 16) / 116;
+  t2 = t1 + colToDbl(color->c[1]) / 500;
+  if (t2 >= (6.0 / 29.0)) {
+    X = t2 * t2 * t2;
+  } else {
+    X = (108.0 / 841.0) * (t2 - (4.0 / 29.0));
+  }
+  if (t1 >= (6.0 / 29.0)) {
+    Y = t1 * t1 * t1;
+  } else {
+    Y = (108.0 / 841.0) * (t1 - (4.0 / 29.0));
+  }
+  t2 = t1 - colToDbl(color->c[2]) / 200;
+  if (t2 >= (6.0 / 29.0)) {
+    Z = t2 * t2 * t2;
+  } else {
+    Z = (108.0 / 841.0) * (t2 - (4.0 / 29.0));
+  }
+  *pX = X;
+  *pY = Y;
+  *pZ = Z;
+}
+
+void GfxLabColorSpace::getRGB(GfxColor *color, GfxRGB *rgb) {
+  double X, Y, Z;
+  double r, g, b;
+
+  getXYZ(color, &X, &Y, &Z);
+#ifdef USE_CMS
+  if (XYZ2DisplayTransform != NULL && displayPixelType == PT_RGB) {
+    Guchar out[gfxColorMaxComps];
+    double in[gfxColorMaxComps];
+    
+    in[0] = clip01(X);
+    in[1] = clip01(Y);
+    in[2] = clip01(Z);
+    XYZ2DisplayTransform->doTransform(in,out,1);
+    rgb->r = byteToCol(out[0]);
+    rgb->g = byteToCol(out[1]);
+    rgb->b = byteToCol(out[2]);
+    return;
+  }
+#endif
+  X *= whiteX;
+  Y *= whiteY;
+  Z *= whiteZ;
+  // convert XYZ to RGB, including gamut mapping and gamma correction
+  r = xyzrgb[0][0] * X + xyzrgb[0][1] * Y + xyzrgb[0][2] * Z;
+  g = xyzrgb[1][0] * X + xyzrgb[1][1] * Y + xyzrgb[1][2] * Z;
+  b = xyzrgb[2][0] * X + xyzrgb[2][1] * Y + xyzrgb[2][2] * Z;
+  rgb->r = dblToCol(sqrt(clip01(r * kr)));
+  rgb->g = dblToCol(sqrt(clip01(g * kg)));
+  rgb->b = dblToCol(sqrt(clip01(b * kb)));
+}
+
+void GfxLabColorSpace::getCMYK(GfxColor *color, GfxCMYK *cmyk) {
+  GfxRGB rgb;
+  GfxColorComp c, m, y, k;
+
+#ifdef USE_CMS
+  if (XYZ2DisplayTransform != NULL && displayPixelType == PT_CMYK) {
+    double in[gfxColorMaxComps];
+    Guchar out[gfxColorMaxComps];
+    
+    getXYZ(color, &in[0], &in[1], &in[2]);
+    XYZ2DisplayTransform->doTransform(in,out,1);
+    cmyk->c = byteToCol(out[0]);
+    cmyk->m = byteToCol(out[1]);
+    cmyk->y = byteToCol(out[2]);
+    cmyk->k = byteToCol(out[3]);
+    return;
+  }
+#endif
+  getRGB(color, &rgb);
+  c = clip01(gfxColorComp1 - rgb.r);
+  m = clip01(gfxColorComp1 - rgb.g);
+  y = clip01(gfxColorComp1 - rgb.b);
+  k = c;
+  if (m < k) {
+    k = m;
+  }
+  if (y < k) {
+    k = y;
+  }
+  cmyk->c = c - k;
+  cmyk->m = m - k;
+  cmyk->y = y - k;
+  cmyk->k = k;
+}
+
+void GfxLabColorSpace::getDefaultColor(GfxColor *color) {
+  color->c[0] = 0;
+  if (aMin > 0) {
+    color->c[1] = dblToCol(aMin);
+  } else if (aMax < 0) {
+    color->c[1] = dblToCol(aMax);
+  } else {
+    color->c[1] = 0;
+  }
+  if (bMin > 0) {
+    color->c[2] = dblToCol(bMin);
+  } else if (bMax < 0) {
+    color->c[2] = dblToCol(bMax);
+  } else {
+    color->c[2] = 0;
+  }
+}
+
+void GfxLabColorSpace::getDefaultRanges(double *decodeLow, double *decodeRange,
+                                       int maxImgPixel) {
+  decodeLow[0] = 0;
+  decodeRange[0] = 100;
+  decodeLow[1] = aMin;
+  decodeRange[1] = aMax - aMin;
+  decodeLow[2] = bMin;
+  decodeRange[2] = bMax - bMin;
+}
+
+//------------------------------------------------------------------------
+// GfxICCBasedColorSpace
+//------------------------------------------------------------------------
+
+class GfxICCBasedColorSpaceKey : public PopplerCacheKey
+{
+  public:
+    GfxICCBasedColorSpaceKey(int numA, int genA) : num(numA), gen(genA)
+    {
+    }
+    
+    bool operator==(const PopplerCacheKey &key) const
+    {
+      const GfxICCBasedColorSpaceKey *k = static_cast<const GfxICCBasedColorSpaceKey*>(&key);
+      return k->num == num && k->gen == gen;
+    }
+    
+    int num, gen;
+};
+
+class GfxICCBasedColorSpaceItem : public PopplerCacheItem
+{
+  public:
+    GfxICCBasedColorSpaceItem(GfxICCBasedColorSpace *csA)
+    {
+      cs = static_cast<GfxICCBasedColorSpace*>(csA->copy());
+    }
+    
+    ~GfxICCBasedColorSpaceItem()
+    {
+      delete cs;
+    }
+    
+    GfxICCBasedColorSpace *cs;
+};
+
+GfxICCBasedColorSpace::GfxICCBasedColorSpace(int nCompsA, GfxColorSpace *altA,
+                                            Ref *iccProfileStreamA) {
+  nComps = nCompsA;
+  alt = altA;
+  iccProfileStream = *iccProfileStreamA;
+  rangeMin[0] = rangeMin[1] = rangeMin[2] = rangeMin[3] = 0;
+  rangeMax[0] = rangeMax[1] = rangeMax[2] = rangeMax[3] = 1;
+#ifdef USE_CMS
+  transform = NULL;
+  lineTransform = NULL;
+#endif
+}
+
+GfxICCBasedColorSpace::~GfxICCBasedColorSpace() {
+  delete alt;
+#ifdef USE_CMS
+  if (transform != NULL) {
+    if (transform->unref() == 0) delete transform;
+  }
+  if (lineTransform != NULL) {
+    if (lineTransform->unref() == 0) delete lineTransform;
+  }
+#endif
+}
+
+GfxColorSpace *GfxICCBasedColorSpace::copy() {
+  GfxICCBasedColorSpace *cs;
+  int i;
+
+  cs = new GfxICCBasedColorSpace(nComps, alt->copy(), &iccProfileStream);
+  for (i = 0; i < 4; ++i) {
+    cs->rangeMin[i] = rangeMin[i];
+    cs->rangeMax[i] = rangeMax[i];
+  }
+#ifdef USE_CMS
+  cs->transform = transform;
+  if (transform != NULL) transform->ref();
+  cs->lineTransform = lineTransform;
+  if (lineTransform != NULL) lineTransform->ref();
+#endif
+  return cs;
+}
+
+GfxColorSpace *GfxICCBasedColorSpace::parse(Array *arr, Gfx *gfx, int recursion) {
+  GfxICCBasedColorSpace *cs;
+  Ref iccProfileStreamA;
+  int nCompsA;
+  GfxColorSpace *altA;
+  Dict *dict;
+  Object obj1, obj2, obj3;
+  int i;
+
+  if (arr->getLength() < 2) {
+    error(errSyntaxError, -1, "Bad ICCBased color space");
+    return NULL;
+  }
+  arr->getNF(1, &obj1);
+  if (obj1.isRef()) {
+    iccProfileStreamA = obj1.getRef();
+  } else {
+    iccProfileStreamA.num = 0;
+    iccProfileStreamA.gen = 0;
+  }
+  obj1.free();
+#ifdef USE_CMS
+  // check cache
+  if (gfx && iccProfileStreamA.num > 0) {
+    GfxICCBasedColorSpaceKey k(iccProfileStreamA.num, iccProfileStreamA.gen);
+    GfxICCBasedColorSpaceItem *item = static_cast<GfxICCBasedColorSpaceItem *>(gfx->getIccColorSpaceCache()->lookup(k));
+    if (item != NULL)
+    {
+      cs = static_cast<GfxICCBasedColorSpace*>(item->cs->copy());
+      return cs;
+    }
+  }
+#endif
+  arr->get(1, &obj1);
+  if (!obj1.isStream()) {
+    error(errSyntaxWarning, -1, "Bad ICCBased color space (stream)");
+    obj1.free();
+    return NULL;
+  }
+  dict = obj1.streamGetDict();
+  if (!dict->lookup("N", &obj2)->isInt()) {
+    error(errSyntaxWarning, -1, "Bad ICCBased color space (N)");
+    obj2.free();
+    obj1.free();
+    return NULL;
+  }
+  nCompsA = obj2.getInt();
+  obj2.free();
+  if (nCompsA > 4) {
+    error(errSyntaxError, -1,
+         "ICCBased color space with too many ({0:d} > 4) components",
+         nCompsA);
+    nCompsA = 4;
+  }
+  if (dict->lookup("Alternate", &obj2)->isNull() ||
+      !(altA = GfxColorSpace::parse(&obj2, gfx, recursion + 1))) {
+    switch (nCompsA) {
+    case 1:
+      altA = new GfxDeviceGrayColorSpace();
+      break;
+    case 3:
+      altA = new GfxDeviceRGBColorSpace();
+      break;
+    case 4:
+      altA = new GfxDeviceCMYKColorSpace();
+      break;
+    default:
+      error(errSyntaxWarning, -1, "Bad ICCBased color space - invalid N");
+      obj2.free();
+      obj1.free();
+      return NULL;
+    }
+  }
+  obj2.free();
+  cs = new GfxICCBasedColorSpace(nCompsA, altA, &iccProfileStreamA);
+  if (dict->lookup("Range", &obj2)->isArray() &&
+      obj2.arrayGetLength() == 2 * nCompsA) {
+    Object obj4;
+    for (i = 0; i < nCompsA; ++i) {
+      obj2.arrayGet(2*i, &obj3);
+      obj2.arrayGet(2*i+1, &obj4);
+      if (obj3.isNum() && obj4.isNum()) {
+        cs->rangeMin[i] = obj3.getNum();
+        cs->rangeMax[i] = obj4.getNum();
+      }
+      obj3.free();
+      obj4.free();
+    }
+  }
+  obj2.free();
+  obj1.free();
+
+#ifdef USE_CMS
+  arr->get(1, &obj1);
+  dict = obj1.streamGetDict();
+  Guchar *profBuf;
+  Stream *iccStream = obj1.getStream();
+  int length = 0;
+
+  profBuf = iccStream->toUnsignedChars(&length, 65536, 65536);
+  cmsHPROFILE hp = cmsOpenProfileFromMem(profBuf,length);
+  gfree(profBuf);
+  if (hp == 0) {
+    error(errSyntaxWarning, -1, "read ICCBased color space profile error");
+  } else {
+    cmsHPROFILE dhp = displayProfile;
+    if (dhp == NULL) dhp = RGBProfile;
+    unsigned int cst = getCMSColorSpaceType(cmsGetColorSpace(hp));
+    unsigned int dNChannels = getCMSNChannels(cmsGetColorSpace(dhp));
+    unsigned int dcst = getCMSColorSpaceType(cmsGetColorSpace(dhp));
+    cmsHTRANSFORM transform;
+    if ((transform = cmsCreateTransform(hp,
+          COLORSPACE_SH(cst) |CHANNELS_SH(nCompsA) | BYTES_SH(1),
+          dhp,
+          COLORSPACE_SH(dcst) |
+            CHANNELS_SH(dNChannels) | BYTES_SH(1),
+         INTENT_RELATIVE_COLORIMETRIC,LCMS_FLAGS)) == 0) {
+      error(errSyntaxWarning, -1, "Can't create transform");
+      cs->transform = NULL;
+    } else {
+      cs->transform = new GfxColorTransform(transform);
+    }
+    if (dcst == PT_RGB) {
+       // create line transform only when the display is RGB type color space 
+      if ((transform = cmsCreateTransform(hp,
+           CHANNELS_SH(nCompsA) | BYTES_SH(1),dhp,
+           TYPE_RGB_8,INTENT_RELATIVE_COLORIMETRIC,LCMS_FLAGS)) == 0) {
+       error(errSyntaxWarning, -1, "Can't create transform");
+       cs->lineTransform = NULL;
+      } else {
+       cs->lineTransform = new GfxColorTransform(transform);
+      }
+    }
+    cmsCloseProfile(hp);
+  }
+  obj1.free();
+  // put this colorSpace into cache
+  if (gfx && iccProfileStreamA.num > 0) {
+    GfxICCBasedColorSpaceKey *k = new GfxICCBasedColorSpaceKey(iccProfileStreamA.num, iccProfileStreamA.gen);
+    GfxICCBasedColorSpaceItem *item = new GfxICCBasedColorSpaceItem(cs);
+    gfx->getIccColorSpaceCache()->put(k, item);
+  }
+#endif
+  return cs;
+}
+
+void GfxICCBasedColorSpace::getGray(GfxColor *color, GfxGray *gray) {
+#ifdef USE_CMS
+  if (transform != 0 && displayPixelType == PT_GRAY) {
+    Guchar in[gfxColorMaxComps];
+    Guchar out[gfxColorMaxComps];
+    
+    for (int i = 0;i < nComps;i++) {
+       in[i] = colToByte(color->c[i]);
+    }
+    transform->doTransform(in,out,1);
+    *gray = byteToCol(out[0]);
+  } else {
+    GfxRGB rgb;
+    getRGB(color,&rgb);
+    *gray = clip01((GfxColorComp)(0.3 * rgb.r +
+                  0.59 * rgb.g +
+                  0.11 * rgb.b + 0.5));
+  }
+#else
+  alt->getGray(color, gray);
+#endif
+}
+
+void GfxICCBasedColorSpace::getRGB(GfxColor *color, GfxRGB *rgb) {
+#ifdef USE_CMS
+  if (transform != 0
+       && (displayProfile == NULL || displayPixelType == PT_RGB)) {
+    Guchar in[gfxColorMaxComps];
+    Guchar out[gfxColorMaxComps];
+    
+    for (int i = 0;i < nComps;i++) {
+       in[i] = colToByte(color->c[i]);
+    }
+    transform->doTransform(in,out,1);
+    rgb->r = byteToCol(out[0]);
+    rgb->g = byteToCol(out[1]);
+    rgb->b = byteToCol(out[2]);
+  } else {
+    alt->getRGB(color, rgb);
+  }
+#else
+  alt->getRGB(color, rgb);
+#endif
+}
+
+void GfxICCBasedColorSpace::getRGBLine(Guchar *in, unsigned int *out,
+                                      int length) {
+#ifdef USE_CMS
+  if (lineTransform != 0) {
+    Guchar* tmp = (Guchar *)gmallocn(3 * length, sizeof(Guchar));
+    lineTransform->doTransform(in, tmp, length);
+    for (int i = 0; i < length; ++i) {
+        Guchar *current = tmp + (i * 3);
+        out[i] = (current[0] << 16) | (current[1] << 8) | current[2];
+    }
+    gfree(tmp);
+  } else {
+    alt->getRGBLine(in, out, length);
+  }
+#else
+  alt->getRGBLine(in, out, length);
+#endif
+}
+
+void GfxICCBasedColorSpace::getRGBLine(Guchar *in, Guchar *out, int length) {
+#ifdef USE_CMS
+  if (lineTransform != 0) {
+    Guchar* tmp = (Guchar *)gmallocn(3 * length, sizeof(Guchar));
+    lineTransform->doTransform(in, tmp, length);
+    Guchar *current = tmp;
+    for (int i = 0; i < length; ++i) {
+        *out++ = *current++;
+        *out++ = *current++;
+        *out++ = *current++;
+    }
+    gfree(tmp);
+  } else {
+    alt->getRGBLine(in, out, length);
+  }
+#else
+  alt->getRGBLine(in, out, length);
+#endif
+}
+
+void GfxICCBasedColorSpace::getRGBXLine(Guchar *in, Guchar *out, int length) {
+#ifdef USE_CMS
+  if (lineTransform != 0) {
+    Guchar* tmp = (Guchar *)gmallocn(3 * length, sizeof(Guchar));
+    lineTransform->doTransform(in, tmp, length);
+    Guchar *current = tmp;
+    for (int i = 0; i < length; ++i) {
+        *out++ = *current++;
+        *out++ = *current++;
+        *out++ = *current++;
+        *out++ = 255;
+    }
+    gfree(tmp);
+  } else {
+    alt->getRGBXLine(in, out, length);
+  }
+#else
+  alt->getRGBXLine(in, out, length);
+#endif
+}
+
+void GfxICCBasedColorSpace::getCMYK(GfxColor *color, GfxCMYK *cmyk) {
+#ifdef USE_CMS
+  if (transform != NULL && displayPixelType == PT_CMYK) {
+    Guchar in[gfxColorMaxComps];
+    Guchar out[gfxColorMaxComps];
+    
+    for (int i = 0;i < nComps;i++) {
+       in[i] = colToByte(color->c[i]);
+    }
+    transform->doTransform(in,out,1);
+    cmyk->c = byteToCol(out[0]);
+    cmyk->m = byteToCol(out[1]);
+    cmyk->y = byteToCol(out[2]);
+    cmyk->k = byteToCol(out[3]);
+  } else {
+    GfxRGB rgb;
+    GfxColorComp c, m, y, k;
+
+    getRGB(color,&rgb);
+    c = clip01(gfxColorComp1 - rgb.r);
+    m = clip01(gfxColorComp1 - rgb.g);
+    y = clip01(gfxColorComp1 - rgb.b);
+    k = c;
+    if (m < k) {
+      k = m;
+    }
+    if (y < k) {
+      k = y;
+    }
+    cmyk->c = c - k;
+    cmyk->m = m - k;
+    cmyk->y = y - k;
+    cmyk->k = k;
+  }
+#else
+  alt->getCMYK(color, cmyk);
+#endif
+}
+
+GBool GfxICCBasedColorSpace::useGetRGBLine() {
+#ifdef USE_CMS
+  return lineTransform != NULL || alt->useGetRGBLine();
+#else
+  return alt->useGetRGBLine();
+#endif
+}
+
+void GfxICCBasedColorSpace::getDefaultColor(GfxColor *color) {
+  int i;
+
+  for (i = 0; i < nComps; ++i) {
+    if (rangeMin[i] > 0) {
+      color->c[i] = dblToCol(rangeMin[i]);
+    } else if (rangeMax[i] < 0) {
+      color->c[i] = dblToCol(rangeMax[i]);
+    } else {
+      color->c[i] = 0;
+    }
+  }
+}
+
+void GfxICCBasedColorSpace::getDefaultRanges(double *decodeLow,
+                                            double *decodeRange,
+                                            int maxImgPixel) {
+  alt->getDefaultRanges(decodeLow, decodeRange, maxImgPixel);
+
+#if 0
+  // this is nominally correct, but some PDF files don't set the
+  // correct ranges in the ICCBased dict
+  int i;
+
+  for (i = 0; i < nComps; ++i) {
+    decodeLow[i] = rangeMin[i];
+    decodeRange[i] = rangeMax[i] - rangeMin[i];
+  }
+#endif
+}
+
+//------------------------------------------------------------------------
+// GfxIndexedColorSpace
+//------------------------------------------------------------------------
+
+GfxIndexedColorSpace::GfxIndexedColorSpace(GfxColorSpace *baseA,
+                                          int indexHighA) {
+  base = baseA;
+  indexHigh = indexHighA;
+  lookup = (Guchar *)gmallocn((indexHigh + 1) * base->getNComps(),
+                             sizeof(Guchar));
+  overprintMask = base->getOverprintMask();
+}
+
+GfxIndexedColorSpace::~GfxIndexedColorSpace() {
+  delete base;
+  gfree(lookup);
+}
+
+GfxColorSpace *GfxIndexedColorSpace::copy() {
+  GfxIndexedColorSpace *cs;
+
+  cs = new GfxIndexedColorSpace(base->copy(), indexHigh);
+  memcpy(cs->lookup, lookup,
+        (indexHigh + 1) * base->getNComps() * sizeof(Guchar));
+  return cs;
+}
+
+GfxColorSpace *GfxIndexedColorSpace::parse(Array *arr, Gfx *gfx, int recursion) {
+  GfxIndexedColorSpace *cs;
+  GfxColorSpace *baseA;
+  int indexHighA;
+  Object obj1;
+  char *s;
+  int n, i, j;
+
+  if (arr->getLength() != 4) {
+    error(errSyntaxWarning, -1, "Bad Indexed color space");
+    goto err1;
+  }
+  arr->get(1, &obj1);
+  if (!(baseA = GfxColorSpace::parse(&obj1, gfx, recursion + 1))) {
+    error(errSyntaxWarning, -1, "Bad Indexed color space (base color space)");
+    goto err2;
+  }
+  obj1.free();
+  if (!arr->get(2, &obj1)->isInt()) {
+    error(errSyntaxWarning, -1, "Bad Indexed color space (hival)");
+    delete baseA;
+    goto err2;
+  }
+  indexHighA = obj1.getInt();
+  if (indexHighA < 0 || indexHighA > 255) {
+    // the PDF spec requires indexHigh to be in [0,255] -- allowing
+    // values larger than 255 creates a security hole: if nComps *
+    // indexHigh is greater than 2^31, the loop below may overwrite
+    // past the end of the array
+    int previousValue = indexHighA;
+    if (indexHighA < 0) indexHighA = 0;
+    else indexHighA = 255;
+    error(errSyntaxWarning, -1, "Bad Indexed color space (invalid indexHigh value, was {0:d} using {1:d} to try to recover)", previousValue, indexHighA);
+  }
+  obj1.free();
+  cs = new GfxIndexedColorSpace(baseA, indexHighA);
+  arr->get(3, &obj1);
+  n = baseA->getNComps();
+  if (obj1.isStream()) {
+    obj1.streamReset();
+    for (i = 0; i <= indexHighA; ++i) {
+      const int readChars = obj1.streamGetChars(n, &cs->lookup[i*n]);
+      for (j = readChars; j < n; ++j) {
+        error(errSyntaxWarning, -1, "Bad Indexed color space (lookup table stream too short) padding with zeroes");
+        cs->lookup[i*n + j] = 0;
+      }
+    }
+    obj1.streamClose();
+  } else if (obj1.isString()) {
+    if (obj1.getString()->getLength() < (indexHighA + 1) * n) {
+      error(errSyntaxWarning, -1, "Bad Indexed color space (lookup table string too short)");
+      goto err3;
+    }
+    s = obj1.getString()->getCString();
+    for (i = 0; i <= indexHighA; ++i) {
+      for (j = 0; j < n; ++j) {
+       cs->lookup[i*n + j] = (Guchar)*s++;
+      }
+    }
+  } else {
+    error(errSyntaxWarning, -1, "Bad Indexed color space (lookup table)");
+    goto err3;
+  }
+  obj1.free();
+  return cs;
+
+ err3:
+  delete cs;
+ err2:
+  obj1.free();
+ err1:
+  return NULL;
+}
+
+GfxColor *GfxIndexedColorSpace::mapColorToBase(GfxColor *color,
+                                              GfxColor *baseColor) {
+  Guchar *p;
+  double low[gfxColorMaxComps], range[gfxColorMaxComps];
+  int n, i;
+
+  n = base->getNComps();
+  base->getDefaultRanges(low, range, indexHigh);
+  const int idx = (int)(colToDbl(color->c[0]) + 0.5) * n;
+  if (likely(idx + n < (indexHigh + 1) * base->getNComps())) {
+    p = &lookup[idx];
+    for (i = 0; i < n; ++i) {
+      baseColor->c[i] = dblToCol(low[i] + (p[i] / 255.0) * range[i]);
+    }
+  } else {
+    for (i = 0; i < n; ++i) {
+      baseColor->c[i] = 0;
+    }
+  }
+  return baseColor;
+}
+
+void GfxIndexedColorSpace::getGray(GfxColor *color, GfxGray *gray) {
+  GfxColor color2;
+
+  base->getGray(mapColorToBase(color, &color2), gray);
+}
+
+void GfxIndexedColorSpace::getRGB(GfxColor *color, GfxRGB *rgb) {
+  GfxColor color2;
+
+  base->getRGB(mapColorToBase(color, &color2), rgb);
+}
+
+void GfxIndexedColorSpace::getRGBLine(Guchar *in, unsigned int *out, int length) {
+  Guchar *line;
+  int i, j, n;
+
+  n = base->getNComps();
+  line = (Guchar *) gmallocn (length, n);
+  for (i = 0; i < length; i++)
+    for (j = 0; j < n; j++)
+      line[i * n + j] = lookup[in[i] * n + j];
+
+  base->getRGBLine(line, out, length);
+
+  gfree (line);
+}
+
+void GfxIndexedColorSpace::getRGBLine(Guchar *in, Guchar *out, int length)
+{
+  Guchar *line;
+  int i, j, n;
+
+  n = base->getNComps();
+  line = (Guchar *) gmallocn (length, n);
+  for (i = 0; i < length; i++)
+    for (j = 0; j < n; j++)
+      line[i * n + j] = lookup[in[i] * n + j];
+
+  base->getRGBLine(line, out, length);
+
+  gfree (line);
+}
+
+void GfxIndexedColorSpace::getRGBXLine(Guchar *in, Guchar *out, int length)
+{
+  Guchar *line;
+  int i, j, n;
+
+  n = base->getNComps();
+  line = (Guchar *) gmallocn (length, n);
+  for (i = 0; i < length; i++)
+    for (j = 0; j < n; j++)
+      line[i * n + j] = lookup[in[i] * n + j];
+
+  base->getRGBXLine(line, out, length);
+
+  gfree (line);
+}
+
+void GfxIndexedColorSpace::getCMYK(GfxColor *color, GfxCMYK *cmyk) {
+  GfxColor color2;
+
+  base->getCMYK(mapColorToBase(color, &color2), cmyk);
+}
+
+void GfxIndexedColorSpace::getDefaultColor(GfxColor *color) {
+  color->c[0] = 0;
+}
+
+void GfxIndexedColorSpace::getDefaultRanges(double *decodeLow,
+                                           double *decodeRange,
+                                           int maxImgPixel) {
+  decodeLow[0] = 0;
+  decodeRange[0] = maxImgPixel;
+}
+
+//------------------------------------------------------------------------
+// GfxSeparationColorSpace
+//------------------------------------------------------------------------
+
+GfxSeparationColorSpace::GfxSeparationColorSpace(GooString *nameA,
+                                                GfxColorSpace *altA,
+                                                Function *funcA) {
+  name = nameA;
+  alt = altA;
+  func = funcA;
+  nonMarking = !name->cmp("None");
+  if (!name->cmp("Cyan")) {
+    overprintMask = 0x01;
+  } else if (!name->cmp("Magenta")) {
+    overprintMask = 0x02;
+  } else if (!name->cmp("Yellow")) {
+    overprintMask = 0x04;
+  } else if (!name->cmp("Black")) {
+    overprintMask = 0x08;
+  }
+}
+
+GfxSeparationColorSpace::GfxSeparationColorSpace(GooString *nameA,
+                                                GfxColorSpace *altA,
+                                                Function *funcA,
+                                                GBool nonMarkingA,
+                                                Guint overprintMaskA) {
+  name = nameA;
+  alt = altA;
+  func = funcA;
+  nonMarking = nonMarkingA;
+  overprintMask = overprintMaskA;
+}
+
+GfxSeparationColorSpace::~GfxSeparationColorSpace() {
+  delete name;
+  delete alt;
+  delete func;
+}
+
+GfxColorSpace *GfxSeparationColorSpace::copy() {
+  return new GfxSeparationColorSpace(name->copy(), alt->copy(), func->copy(),
+                                    nonMarking, overprintMask);
+}
+
+//~ handle the 'All' and 'None' colorants
+GfxColorSpace *GfxSeparationColorSpace::parse(Array *arr, Gfx *gfx, int recursion) {
+  GfxSeparationColorSpace *cs;
+  GooString *nameA;
+  GfxColorSpace *altA;
+  Function *funcA;
+  Object obj1;
+
+  if (arr->getLength() != 4) {
+    error(errSyntaxWarning, -1, "Bad Separation color space");
+    goto err1;
+  }
+  if (!arr->get(1, &obj1)->isName()) {
+    error(errSyntaxWarning, -1, "Bad Separation color space (name)");
+    goto err2;
+  }
+  nameA = new GooString(obj1.getName());
+  obj1.free();
+  arr->get(2, &obj1);
+  if (!(altA = GfxColorSpace::parse(&obj1, gfx, recursion + 1))) {
+    error(errSyntaxWarning, -1, "Bad Separation color space (alternate color space)");
+    goto err3;
+  }
+  obj1.free();
+  arr->get(3, &obj1);
+  if (!(funcA = Function::parse(&obj1))) {
+    goto err4;
+  }
+  obj1.free();
+  cs = new GfxSeparationColorSpace(nameA, altA, funcA);
+  return cs;
+
+ err4:
+  delete altA;
+ err3:
+  delete nameA;
+ err2:
+  obj1.free();
+ err1:
+  return NULL;
+}
+
+void GfxSeparationColorSpace::getGray(GfxColor *color, GfxGray *gray) {
+  double x;
+  double c[gfxColorMaxComps];
+  GfxColor color2;
+  int i;
+
+  x = colToDbl(color->c[0]);
+  func->transform(&x, c);
+  for (i = 0; i < alt->getNComps(); ++i) {
+    color2.c[i] = dblToCol(c[i]);
+  }
+  alt->getGray(&color2, gray);
+}
+
+void GfxSeparationColorSpace::getRGB(GfxColor *color, GfxRGB *rgb) {
+  double x;
+  double c[gfxColorMaxComps];
+  GfxColor color2;
+  int i;
+
+  x = colToDbl(color->c[0]);
+  func->transform(&x, c);
+  for (i = 0; i < alt->getNComps(); ++i) {
+    color2.c[i] = dblToCol(c[i]);
+  }
+  alt->getRGB(&color2, rgb);
+}
+
+void GfxSeparationColorSpace::getCMYK(GfxColor *color, GfxCMYK *cmyk) {
+  double x;
+  double c[gfxColorMaxComps];
+  GfxColor color2;
+  int i;
+
+  x = colToDbl(color->c[0]);
+  func->transform(&x, c);
+  for (i = 0; i < alt->getNComps(); ++i) {
+    color2.c[i] = dblToCol(c[i]);
+  }
+  alt->getCMYK(&color2, cmyk);
+}
+
+void GfxSeparationColorSpace::getDefaultColor(GfxColor *color) {
+  color->c[0] = gfxColorComp1;
+}
+
+//------------------------------------------------------------------------
+// GfxDeviceNColorSpace
+//------------------------------------------------------------------------
+
+GfxDeviceNColorSpace::GfxDeviceNColorSpace(int nCompsA,
+                                          GooString **namesA,
+                                          GfxColorSpace *altA,
+                                          Function *funcA) {
+  int i;
+
+  nComps = nCompsA;
+  alt = altA;
+  func = funcA;
+  nonMarking = gTrue;
+  overprintMask = 0;
+  for (i = 0; i < nComps; ++i) {
+    names[i] = namesA[i];
+    if (names[i]->cmp("None")) {
+      nonMarking = gFalse;
+    }
+    if (!names[i]->cmp("Cyan")) {
+      overprintMask |= 0x01;
+    } else if (!names[i]->cmp("Magenta")) {
+      overprintMask |= 0x02;
+    } else if (!names[i]->cmp("Yellow")) {
+      overprintMask |= 0x04;
+    } else if (!names[i]->cmp("Black")) {
+      overprintMask |= 0x08;
+    } else {
+      overprintMask = 0x0f;
+    }
+  }
+}
+
+GfxDeviceNColorSpace::GfxDeviceNColorSpace(int nCompsA,
+                                          GooString **namesA,
+                                          GfxColorSpace *altA,
+                                          Function *funcA,
+                                          GBool nonMarkingA,
+                                          Guint overprintMaskA) {
+  int i;
+
+  nComps = nCompsA;
+  alt = altA;
+  func = funcA;
+  nonMarking = nonMarkingA;
+  overprintMask = overprintMaskA;
+  for (i = 0; i < nComps; ++i) {
+    names[i] = namesA[i]->copy();
+  }
+}
+
+GfxDeviceNColorSpace::~GfxDeviceNColorSpace() {
+  int i;
+
+  for (i = 0; i < nComps; ++i) {
+    delete names[i];
+  }
+  delete alt;
+  delete func;
+}
+
+GfxColorSpace *GfxDeviceNColorSpace::copy() {
+  return new GfxDeviceNColorSpace(nComps, names, alt->copy(), func->copy(),
+                                 nonMarking, overprintMask);
+}
+
+//~ handle the 'None' colorant
+GfxColorSpace *GfxDeviceNColorSpace::parse(Array *arr, Gfx *gfx, int recursion) {
+  GfxDeviceNColorSpace *cs;
+  int nCompsA;
+  GooString *namesA[gfxColorMaxComps];
+  GfxColorSpace *altA;
+  Function *funcA;
+  Object obj1, obj2;
+  int i;
+
+  if (arr->getLength() != 4 && arr->getLength() != 5) {
+    error(errSyntaxWarning, -1, "Bad DeviceN color space");
+    goto err1;
+  }
+  if (!arr->get(1, &obj1)->isArray()) {
+    error(errSyntaxWarning, -1, "Bad DeviceN color space (names)");
+    goto err2;
+  }
+  nCompsA = obj1.arrayGetLength();
+  if (nCompsA > gfxColorMaxComps) {
+    error(errSyntaxWarning, -1, "DeviceN color space with too many ({0:d} > {1:d}) components",
+         nCompsA, gfxColorMaxComps);
+    nCompsA = gfxColorMaxComps;
+  }
+  for (i = 0; i < nCompsA; ++i) {
+    if (!obj1.arrayGet(i, &obj2)->isName()) {
+      error(errSyntaxWarning, -1, "Bad DeviceN color space (names)");
+      obj2.free();
+      goto err2;
+    }
+    namesA[i] = new GooString(obj2.getName());
+    obj2.free();
+  }
+  obj1.free();
+  arr->get(2, &obj1);
+  if (!(altA = GfxColorSpace::parse(&obj1, gfx, recursion + 1))) {
+    error(errSyntaxWarning, -1, "Bad DeviceN color space (alternate color space)");
+    goto err3;
+  }
+  obj1.free();
+  arr->get(3, &obj1);
+  if (!(funcA = Function::parse(&obj1))) {
+    goto err4;
+  }
+  obj1.free();
+  cs = new GfxDeviceNColorSpace(nCompsA, namesA, altA, funcA);
+  return cs;
+
+ err4:
+  delete altA;
+ err3:
+  for (i = 0; i < nCompsA; ++i) {
+    delete namesA[i];
+  }
+ err2:
+  obj1.free();
+ err1:
+  return NULL;
+}
+
+void GfxDeviceNColorSpace::getGray(GfxColor *color, GfxGray *gray) {
+  double x[gfxColorMaxComps], c[gfxColorMaxComps];
+  GfxColor color2;
+  int i;
+
+  for (i = 0; i < nComps; ++i) {
+    x[i] = colToDbl(color->c[i]);
+  }
+  func->transform(x, c);
+  for (i = 0; i < alt->getNComps(); ++i) {
+    color2.c[i] = dblToCol(c[i]);
+  }
+  alt->getGray(&color2, gray);
+}
+
+void GfxDeviceNColorSpace::getRGB(GfxColor *color, GfxRGB *rgb) {
+  double x[gfxColorMaxComps], c[gfxColorMaxComps];
+  GfxColor color2;
+  int i;
+
+  for (i = 0; i < nComps; ++i) {
+    x[i] = colToDbl(color->c[i]);
+  }
+  func->transform(x, c);
+  for (i = 0; i < alt->getNComps(); ++i) {
+    color2.c[i] = dblToCol(c[i]);
+  }
+  alt->getRGB(&color2, rgb);
+}
+
+void GfxDeviceNColorSpace::getCMYK(GfxColor *color, GfxCMYK *cmyk) {
+  double x[gfxColorMaxComps], c[gfxColorMaxComps];
+  GfxColor color2;
+  int i;
+
+  for (i = 0; i < nComps; ++i) {
+    x[i] = colToDbl(color->c[i]);
+  }
+  func->transform(x, c);
+  for (i = 0; i < alt->getNComps(); ++i) {
+    color2.c[i] = dblToCol(c[i]);
+  }
+  alt->getCMYK(&color2, cmyk);
+}
+
+void GfxDeviceNColorSpace::getDefaultColor(GfxColor *color) {
+  int i;
+
+  for (i = 0; i < nComps; ++i) {
+    color->c[i] = gfxColorComp1;
+  }
+}
+
+//------------------------------------------------------------------------
+// GfxPatternColorSpace
+//------------------------------------------------------------------------
+
+GfxPatternColorSpace::GfxPatternColorSpace(GfxColorSpace *underA) {
+  under = underA;
+}
+
+GfxPatternColorSpace::~GfxPatternColorSpace() {
+  if (under) {
+    delete under;
+  }
+}
+
+GfxColorSpace *GfxPatternColorSpace::copy() {
+  return new GfxPatternColorSpace(under ? under->copy() :
+                                         (GfxColorSpace *)NULL);
+}
+
+GfxColorSpace *GfxPatternColorSpace::parse(Array *arr, Gfx *gfx, int recursion) {
+  GfxPatternColorSpace *cs;
+  GfxColorSpace *underA;
+  Object obj1;
+
+  if (arr->getLength() != 1 && arr->getLength() != 2) {
+    error(errSyntaxWarning, -1, "Bad Pattern color space");
+    return NULL;
+  }
+  underA = NULL;
+  if (arr->getLength() == 2) {
+    arr->get(1, &obj1);
+    if (!(underA = GfxColorSpace::parse(&obj1, gfx, recursion + 1))) {
+      error(errSyntaxWarning, -1, "Bad Pattern color space (underlying color space)");
+      obj1.free();
+      return NULL;
+    }
+    obj1.free();
+  }
+  cs = new GfxPatternColorSpace(underA);
+  return cs;
+}
+
+void GfxPatternColorSpace::getGray(GfxColor *color, GfxGray *gray) {
+  *gray = 0;
+}
+
+void GfxPatternColorSpace::getRGB(GfxColor *color, GfxRGB *rgb) {
+  rgb->r = rgb->g = rgb->b = 0;
+}
+
+void GfxPatternColorSpace::getCMYK(GfxColor *color, GfxCMYK *cmyk) {
+  cmyk->c = cmyk->m = cmyk->y = 0;
+  cmyk->k = 1;
+}
+
+void GfxPatternColorSpace::getDefaultColor(GfxColor *color) {
+  color->c[0]=0;
+}
+
+//------------------------------------------------------------------------
+// Pattern
+//------------------------------------------------------------------------
+
+GfxPattern::GfxPattern(int typeA) {
+  type = typeA;
+}
+
+GfxPattern::~GfxPattern() {
+}
+
+GfxPattern *GfxPattern::parse(Object *obj, Gfx *gfx) {
+  GfxPattern *pattern;
+  Object obj1;
+
+  if (obj->isDict()) {
+    obj->dictLookup("PatternType", &obj1);
+  } else if (obj->isStream()) {
+    obj->streamGetDict()->lookup("PatternType", &obj1);
+  } else {
+    return NULL;
+  }
+  pattern = NULL;
+  if (obj1.isInt() && obj1.getInt() == 1) {
+    pattern = GfxTilingPattern::parse(obj);
+  } else if (obj1.isInt() && obj1.getInt() == 2) {
+    pattern = GfxShadingPattern::parse(obj, gfx);
+  }
+  obj1.free();
+  return pattern;
+}
+
+//------------------------------------------------------------------------
+// GfxTilingPattern
+//------------------------------------------------------------------------
+
+GfxTilingPattern *GfxTilingPattern::parse(Object *patObj) {
+  GfxTilingPattern *pat;
+  Dict *dict;
+  int paintTypeA, tilingTypeA;
+  double bboxA[4], matrixA[6];
+  double xStepA, yStepA;
+  Object resDictA;
+  Object obj1, obj2;
+  int i;
+
+  if (!patObj->isStream()) {
+    return NULL;
+  }
+  dict = patObj->streamGetDict();
+
+  if (dict->lookup("PaintType", &obj1)->isInt()) {
+    paintTypeA = obj1.getInt();
+  } else {
+    paintTypeA = 1;
+    error(errSyntaxWarning, -1, "Invalid or missing PaintType in pattern");
+  }
+  obj1.free();
+  if (dict->lookup("TilingType", &obj1)->isInt()) {
+    tilingTypeA = obj1.getInt();
+  } else {
+    tilingTypeA = 1;
+    error(errSyntaxWarning, -1, "Invalid or missing TilingType in pattern");
+  }
+  obj1.free();
+  bboxA[0] = bboxA[1] = 0;
+  bboxA[2] = bboxA[3] = 1;
+  if (dict->lookup("BBox", &obj1)->isArray() &&
+      obj1.arrayGetLength() == 4) {
+    for (i = 0; i < 4; ++i) {
+      if (obj1.arrayGet(i, &obj2)->isNum()) {
+       bboxA[i] = obj2.getNum();
+      }
+      obj2.free();
+    }
+  } else {
+    error(errSyntaxWarning, -1, "Invalid or missing BBox in pattern");
+  }
+  obj1.free();
+  if (dict->lookup("XStep", &obj1)->isNum()) {
+    xStepA = obj1.getNum();
+  } else {
+    xStepA = 1;
+    error(errSyntaxWarning, -1, "Invalid or missing XStep in pattern");
+  }
+  obj1.free();
+  if (dict->lookup("YStep", &obj1)->isNum()) {
+    yStepA = obj1.getNum();
+  } else {
+    yStepA = 1;
+    error(errSyntaxWarning, -1, "Invalid or missing YStep in pattern");
+  }
+  obj1.free();
+  if (!dict->lookup("Resources", &resDictA)->isDict()) {
+    resDictA.free();
+    resDictA.initNull();
+    error(errSyntaxWarning, -1, "Invalid or missing Resources in pattern");
+  }
+  matrixA[0] = 1; matrixA[1] = 0;
+  matrixA[2] = 0; matrixA[3] = 1;
+  matrixA[4] = 0; matrixA[5] = 0;
+  if (dict->lookup("Matrix", &obj1)->isArray() &&
+      obj1.arrayGetLength() == 6) {
+    for (i = 0; i < 6; ++i) {
+      if (obj1.arrayGet(i, &obj2)->isNum()) {
+       matrixA[i] = obj2.getNum();
+      }
+      obj2.free();
+    }
+  }
+  obj1.free();
+
+  pat = new GfxTilingPattern(paintTypeA, tilingTypeA, bboxA, xStepA, yStepA,
+                            &resDictA, matrixA, patObj);
+  resDictA.free();
+  return pat;
+}
+
+GfxTilingPattern::GfxTilingPattern(int paintTypeA, int tilingTypeA,
+                                  double *bboxA, double xStepA, double yStepA,
+                                  Object *resDictA, double *matrixA,
+                                  Object *contentStreamA):
+  GfxPattern(1)
+{
+  int i;
+
+  paintType = paintTypeA;
+  tilingType = tilingTypeA;
+  for (i = 0; i < 4; ++i) {
+    bbox[i] = bboxA[i];
+  }
+  xStep = xStepA;
+  yStep = yStepA;
+  resDictA->copy(&resDict);
+  for (i = 0; i < 6; ++i) {
+    matrix[i] = matrixA[i];
+  }
+  contentStreamA->copy(&contentStream);
+}
+
+GfxTilingPattern::~GfxTilingPattern() {
+  resDict.free();
+  contentStream.free();
+}
+
+GfxPattern *GfxTilingPattern::copy() {
+  return new GfxTilingPattern(paintType, tilingType, bbox, xStep, yStep,
+                             &resDict, matrix, &contentStream);
+}
+
+//------------------------------------------------------------------------
+// GfxShadingPattern
+//------------------------------------------------------------------------
+
+GfxShadingPattern *GfxShadingPattern::parse(Object *patObj, Gfx *gfx) {
+  Dict *dict;
+  GfxShading *shadingA;
+  double matrixA[6];
+  Object obj1, obj2;
+  int i;
+
+  if (!patObj->isDict()) {
+    return NULL;
+  }
+  dict = patObj->getDict();
+
+  dict->lookup("Shading", &obj1);
+  shadingA = GfxShading::parse(&obj1, gfx);
+  obj1.free();
+  if (!shadingA) {
+    return NULL;
+  }
+
+  matrixA[0] = 1; matrixA[1] = 0;
+  matrixA[2] = 0; matrixA[3] = 1;
+  matrixA[4] = 0; matrixA[5] = 0;
+  if (dict->lookup("Matrix", &obj1)->isArray() &&
+      obj1.arrayGetLength() == 6) {
+    for (i = 0; i < 6; ++i) {
+      if (obj1.arrayGet(i, &obj2)->isNum()) {
+       matrixA[i] = obj2.getNum();
+      }
+      obj2.free();
+    }
+  }
+  obj1.free();
+
+  return new GfxShadingPattern(shadingA, matrixA);
+}
+
+GfxShadingPattern::GfxShadingPattern(GfxShading *shadingA, double *matrixA):
+  GfxPattern(2)
+{
+  int i;
+
+  shading = shadingA;
+  for (i = 0; i < 6; ++i) {
+    matrix[i] = matrixA[i];
+  }
+}
+
+GfxShadingPattern::~GfxShadingPattern() {
+  delete shading;
+}
+
+GfxPattern *GfxShadingPattern::copy() {
+  return new GfxShadingPattern(shading->copy(), matrix);
+}
+
+//------------------------------------------------------------------------
+// GfxShading
+//------------------------------------------------------------------------
+
+GfxShading::GfxShading(int typeA) {
+  type = typeA;
+  colorSpace = NULL;
+}
+
+GfxShading::GfxShading(GfxShading *shading) {
+  int i;
+
+  type = shading->type;
+  colorSpace = shading->colorSpace->copy();
+  for (i = 0; i < gfxColorMaxComps; ++i) {
+    background.c[i] = shading->background.c[i];
+  }
+  hasBackground = shading->hasBackground;
+  xMin = shading->xMin;
+  yMin = shading->yMin;
+  xMax = shading->xMax;
+  yMax = shading->yMax;
+  hasBBox = shading->hasBBox;
+}
+
+GfxShading::~GfxShading() {
+  if (colorSpace) {
+    delete colorSpace;
+  }
+}
+
+GfxShading *GfxShading::parse(Object *obj, Gfx *gfx) {
+  GfxShading *shading;
+  Dict *dict;
+  int typeA;
+  Object obj1;
+
+  if (obj->isDict()) {
+    dict = obj->getDict();
+  } else if (obj->isStream()) {
+    dict = obj->streamGetDict();
+  } else {
+    return NULL;
+  }
+
+  if (!dict->lookup("ShadingType", &obj1)->isInt()) {
+    error(errSyntaxWarning, -1, "Invalid ShadingType in shading dictionary");
+    obj1.free();
+    return NULL;
+  }
+  typeA = obj1.getInt();
+  obj1.free();
+
+  switch (typeA) {
+  case 1:
+    shading = GfxFunctionShading::parse(dict, gfx);
+    break;
+  case 2:
+    shading = GfxAxialShading::parse(dict, gfx);
+    break;
+  case 3:
+    shading = GfxRadialShading::parse(dict, gfx);
+    break;
+  case 4:
+    if (obj->isStream()) {
+      shading = GfxGouraudTriangleShading::parse(4, dict, obj->getStream(), gfx);
+    } else {
+      error(errSyntaxWarning, -1, "Invalid Type 4 shading object");
+      goto err1;
+    }
+    break;
+  case 5:
+    if (obj->isStream()) {
+      shading = GfxGouraudTriangleShading::parse(5, dict, obj->getStream(), gfx);
+    } else {
+      error(errSyntaxWarning, -1, "Invalid Type 5 shading object");
+      goto err1;
+    }
+    break;
+  case 6:
+    if (obj->isStream()) {
+      shading = GfxPatchMeshShading::parse(6, dict, obj->getStream(), gfx);
+    } else {
+      error(errSyntaxWarning, -1, "Invalid Type 6 shading object");
+      goto err1;
+    }
+    break;
+  case 7:
+    if (obj->isStream()) {
+      shading = GfxPatchMeshShading::parse(7, dict, obj->getStream(), gfx);
+    } else {
+      error(errSyntaxWarning, -1, "Invalid Type 7 shading object");
+      goto err1;
+    }
+    break;
+  default:
+    error(errSyntaxWarning, -1, "Unimplemented shading type {0:d}", typeA);
+    goto err1;
+  }
+
+  return shading;
+
+ err1:
+  return NULL;
+}
+
+GBool GfxShading::init(Dict *dict, Gfx *gfx) {
+  Object obj1, obj2;
+  int i;
+
+  dict->lookup("ColorSpace", &obj1);
+  if (!(colorSpace = GfxColorSpace::parse(&obj1, gfx))) {
+    error(errSyntaxWarning, -1, "Bad color space in shading dictionary");
+    obj1.free();
+    return gFalse;
+  }
+  obj1.free();
+
+  for (i = 0; i < gfxColorMaxComps; ++i) {
+    background.c[i] = 0;
+  }
+  hasBackground = gFalse;
+  if (dict->lookup("Background", &obj1)->isArray()) {
+    if (obj1.arrayGetLength() == colorSpace->getNComps()) {
+      hasBackground = gTrue;
+      for (i = 0; i < colorSpace->getNComps(); ++i) {
+       background.c[i] = dblToCol(obj1.arrayGet(i, &obj2)->getNum());
+       obj2.free();
+      }
+    } else {
+      error(errSyntaxWarning, -1, "Bad Background in shading dictionary");
+    }
+  }
+  obj1.free();
+
+  xMin = yMin = xMax = yMax = 0;
+  hasBBox = gFalse;
+  if (dict->lookup("BBox", &obj1)->isArray()) {
+    if (obj1.arrayGetLength() == 4) {
+      Object obj3, obj4, obj5;
+      obj1.arrayGet(0, &obj2);
+      obj1.arrayGet(1, &obj3);
+      obj1.arrayGet(2, &obj4);
+      obj1.arrayGet(3, &obj5);
+      if (obj2.isNum() && obj3.isNum() && obj4.isNum() && obj5.isNum())
+      {
+        hasBBox = gTrue;
+        xMin = obj2.getNum();
+        yMin = obj3.getNum();
+        xMax = obj4.getNum();
+        yMax = obj5.getNum();
+      } else {
+        error(errSyntaxWarning, -1, "Bad BBox in shading dictionary (Values not numbers)");
+      }
+      obj2.free();
+      obj3.free();
+      obj4.free();
+      obj5.free();
+    } else {
+      error(errSyntaxWarning, -1, "Bad BBox in shading dictionary");
+    }
+  }
+  obj1.free();
+
+  return gTrue;
+}
+
+//------------------------------------------------------------------------
+// GfxFunctionShading
+//------------------------------------------------------------------------
+
+GfxFunctionShading::GfxFunctionShading(double x0A, double y0A,
+                                      double x1A, double y1A,
+                                      double *matrixA,
+                                      Function **funcsA, int nFuncsA):
+  GfxShading(1)
+{
+  int i;
+
+  x0 = x0A;
+  y0 = y0A;
+  x1 = x1A;
+  y1 = y1A;
+  for (i = 0; i < 6; ++i) {
+    matrix[i] = matrixA[i];
+  }
+  nFuncs = nFuncsA;
+  for (i = 0; i < nFuncs; ++i) {
+    funcs[i] = funcsA[i];
+  }
+}
+
+GfxFunctionShading::GfxFunctionShading(GfxFunctionShading *shading):
+  GfxShading(shading)
+{
+  int i;
+
+  x0 = shading->x0;
+  y0 = shading->y0;
+  x1 = shading->x1;
+  y1 = shading->y1;
+  for (i = 0; i < 6; ++i) {
+    matrix[i] = shading->matrix[i];
+  }
+  nFuncs = shading->nFuncs;
+  for (i = 0; i < nFuncs; ++i) {
+    funcs[i] = shading->funcs[i]->copy();
+  }
+}
+
+GfxFunctionShading::~GfxFunctionShading() {
+  int i;
+
+  for (i = 0; i < nFuncs; ++i) {
+    delete funcs[i];
+  }
+}
+
+GfxFunctionShading *GfxFunctionShading::parse(Dict *dict, Gfx *gfx) {
+  GfxFunctionShading *shading;
+  double x0A, y0A, x1A, y1A;
+  double matrixA[6];
+  Function *funcsA[gfxColorMaxComps];
+  int nFuncsA;
+  Object obj1, obj2;
+  int i;
+
+  x0A = y0A = 0;
+  x1A = y1A = 1;
+  if (dict->lookup("Domain", &obj1)->isArray() &&
+      obj1.arrayGetLength() == 4) {
+    x0A = obj1.arrayGet(0, &obj2)->getNum();
+    obj2.free();
+    x1A = obj1.arrayGet(1, &obj2)->getNum();
+    obj2.free();
+    y0A = obj1.arrayGet(2, &obj2)->getNum();
+    obj2.free();
+    y1A = obj1.arrayGet(3, &obj2)->getNum();
+    obj2.free();
+  }
+  obj1.free();
+
+  matrixA[0] = 1; matrixA[1] = 0;
+  matrixA[2] = 0; matrixA[3] = 1;
+  matrixA[4] = 0; matrixA[5] = 0;
+  if (dict->lookup("Matrix", &obj1)->isArray() &&
+      obj1.arrayGetLength() == 6) {
+    matrixA[0] = obj1.arrayGet(0, &obj2)->getNum();
+    obj2.free();
+    matrixA[1] = obj1.arrayGet(1, &obj2)->getNum();
+    obj2.free();
+    matrixA[2] = obj1.arrayGet(2, &obj2)->getNum();
+    obj2.free();
+    matrixA[3] = obj1.arrayGet(3, &obj2)->getNum();
+    obj2.free();
+    matrixA[4] = obj1.arrayGet(4, &obj2)->getNum();
+    obj2.free();
+    matrixA[5] = obj1.arrayGet(5, &obj2)->getNum();
+    obj2.free();
+  }
+  obj1.free();
+
+  dict->lookup("Function", &obj1);
+  if (obj1.isArray()) {
+    nFuncsA = obj1.arrayGetLength();
+    if (nFuncsA > gfxColorMaxComps) {
+      error(errSyntaxWarning, -1, "Invalid Function array in shading dictionary");
+      goto err1;
+    }
+    for (i = 0; i < nFuncsA; ++i) {
+      obj1.arrayGet(i, &obj2);
+      if (!(funcsA[i] = Function::parse(&obj2))) {
+       goto err2;
+      }
+      obj2.free();
+    }
+  } else {
+    nFuncsA = 1;
+    if (!(funcsA[0] = Function::parse(&obj1))) {
+      goto err1;
+    }
+  }
+  obj1.free();
+
+  shading = new GfxFunctionShading(x0A, y0A, x1A, y1A, matrixA,
+                                  funcsA, nFuncsA);
+  if (!shading->init(dict, gfx)) {
+    delete shading;
+    return NULL;
+  }
+  return shading;
+
+ err2:
+  obj2.free();
+ err1:
+  obj1.free();
+  return NULL;
+}
+
+GfxShading *GfxFunctionShading::copy() {
+  return new GfxFunctionShading(this);
+}
+
+void GfxFunctionShading::getColor(double x, double y, GfxColor *color) {
+  double in[2], out[gfxColorMaxComps];
+  int i;
+
+  // NB: there can be one function with n outputs or n functions with
+  // one output each (where n = number of color components)
+  for (i = 0; i < gfxColorMaxComps; ++i) {
+    out[i] = 0;
+  }
+  in[0] = x;
+  in[1] = y;
+  for (i = 0; i < nFuncs; ++i) {
+    funcs[i]->transform(in, &out[i]);
+  }
+  for (i = 0; i < gfxColorMaxComps; ++i) {
+    color->c[i] = dblToCol(out[i]);
+  }
+}
+
+//------------------------------------------------------------------------
+// GfxUnivariateShading
+//------------------------------------------------------------------------
+
+GfxUnivariateShading::GfxUnivariateShading(int typeA,
+                                          double t0A, double t1A,
+                                          Function **funcsA, int nFuncsA,
+                                          GBool extend0A, GBool extend1A):
+  GfxShading(typeA)
+{
+  int i;
+
+  t0 = t0A;
+  t1 = t1A;
+  nFuncs = nFuncsA;
+  for (i = 0; i < nFuncs; ++i) {
+    funcs[i] = funcsA[i];
+  }
+  extend0 = extend0A;
+  extend1 = extend1A;
+
+  cacheSize = 0;
+  lastMatch = 0;
+  cacheBounds = NULL;
+  cacheCoeff = NULL;
+  cacheValues = NULL;
+}
+
+GfxUnivariateShading::GfxUnivariateShading(GfxUnivariateShading *shading):
+  GfxShading(shading)
+{
+  int i;
+
+  t0 = shading->t0;
+  t1 = shading->t1;
+  nFuncs = shading->nFuncs;
+  for (i = 0; i < nFuncs; ++i) {
+    funcs[i] = shading->funcs[i]->copy();
+  }
+  extend0 = shading->extend0;
+  extend1 = shading->extend1;
+
+  cacheSize = 0;
+  lastMatch = 0;
+  cacheBounds = NULL;
+  cacheCoeff = NULL;
+  cacheValues = NULL;
+}
+
+GfxUnivariateShading::~GfxUnivariateShading() {
+  int i;
+
+  for (i = 0; i < nFuncs; ++i) {
+    delete funcs[i];
+  }
+
+  gfree (cacheBounds);
+}
+
+void GfxUnivariateShading::getColor(double t, GfxColor *color) {
+  double out[gfxColorMaxComps];
+  int i, nComps;
+
+  // NB: there can be one function with n outputs or n functions with
+  // one output each (where n = number of color components)
+  nComps = nFuncs * funcs[0]->getOutputSize();
+
+  if (cacheSize > 0) {
+    double x, ix, *l, *u, *upper;
+
+    if (cacheBounds[lastMatch - 1] >= t) {
+      upper = std::lower_bound (cacheBounds, cacheBounds + lastMatch - 1, t);
+      lastMatch = upper - cacheBounds;
+      lastMatch = std::min<int>(std::max<int>(1, lastMatch), cacheSize - 1);
+    } else if (cacheBounds[lastMatch] < t) {
+      upper = std::lower_bound (cacheBounds + lastMatch + 1, cacheBounds + cacheSize, t);
+      lastMatch = upper - cacheBounds;
+      lastMatch = std::min<int>(std::max<int>(1, lastMatch), cacheSize - 1);
+    }
+
+    x = (t - cacheBounds[lastMatch-1]) * cacheCoeff[lastMatch];
+    ix = 1.0 - x;
+    u = cacheValues + lastMatch * nComps;
+    l = u - nComps;
+
+    for (i = 0; i < nComps; ++i) {
+      out[i] = ix * l[i] + x * u[i];
+    }
+  } else {
+    for (i = 0; i < nComps; ++i) {
+      out[i] = 0;
+    }
+    for (i = 0; i < nFuncs; ++i) {
+      funcs[i]->transform(&t, &out[i]);
+    }
+  }
+
+  for (i = 0; i < nComps; ++i) {
+    color->c[i] = dblToCol(out[i]);
+  }
+}
+
+void GfxUnivariateShading::setupCache(const Matrix *ctm,
+                                     double xMin, double yMin,
+                                     double xMax, double yMax) {
+  double sMin, sMax, tMin, tMax, upperBound;
+  int i, j, nComps, maxSize;
+
+  gfree (cacheBounds);
+  cacheBounds = NULL;
+  cacheSize = 0;
+
+  // NB: there can be one function with n outputs or n functions with
+  // one output each (where n = number of color components)
+  nComps = nFuncs * funcs[0]->getOutputSize();
+
+  getParameterRange(&sMin, &sMax, xMin, yMin, xMax, yMax);
+  upperBound = ctm->norm() * getDistance(sMin, sMax);
+  maxSize = ceil(upperBound);
+  maxSize = std::max<int>(maxSize, 2);
+
+  {
+    double x[4], y[4];
+
+    ctm->transform(xMin, yMin, &x[0], &y[0]);
+    ctm->transform(xMax, yMin, &x[1], &y[1]);
+    ctm->transform(xMin, yMax, &x[2], &y[2]);
+    ctm->transform(xMax, yMax, &x[3], &y[3]);
+
+    xMin = xMax = x[0];
+    yMin = yMax = y[0];
+    for (i = 1; i < 4; i++) {
+      xMin = std::min<double>(xMin, x[i]);
+      yMin = std::min<double>(yMin, y[i]);
+      xMax = std::max<double>(xMax, x[i]);
+      yMax = std::max<double>(yMax, y[i]);
+    }
+  }
+
+  if (maxSize > (xMax-xMin) * (yMax-yMin)) {
+    return;
+  }
+
+  if (t0 < t1) {
+    tMin = t0 + sMin * (t1 - t0);
+    tMax = t0 + sMax * (t1 - t0);
+  } else {
+    tMin = t0 + sMax * (t1 - t0);
+    tMax = t0 + sMin * (t1 - t0);
+  }
+
+  cacheBounds = (double *)gmallocn(maxSize, sizeof(double) * (nComps + 2));
+  cacheCoeff = cacheBounds + maxSize;
+  cacheValues = cacheCoeff + maxSize;
+
+  if (cacheSize != 0) {
+    for (j = 0; j < cacheSize; ++j) {
+      cacheCoeff[j] = 1 / (cacheBounds[j+1] - cacheBounds[j]);
+    }
+  } else if (tMax != tMin) {
+    double step = (tMax - tMin) / (maxSize - 1);
+    double coeff = (maxSize - 1) / (tMax - tMin);
+
+    cacheSize = maxSize;
+
+    for (j = 0; j < cacheSize; ++j) {
+      cacheBounds[j] = tMin + j * step;
+      cacheCoeff[j] = coeff;
+
+      for (i = 0; i < nComps; ++i) {
+       cacheValues[j*nComps + i] = 0;
+      }
+      for (i = 0; i < nFuncs; ++i) {
+       funcs[i]->transform(&cacheBounds[j], &cacheValues[j*nComps + i]);
+      }
+    }
+  }
+
+  lastMatch = 1;
+}
+
+
+//------------------------------------------------------------------------
+// GfxAxialShading
+//------------------------------------------------------------------------
+
+GfxAxialShading::GfxAxialShading(double x0A, double y0A,
+                                double x1A, double y1A,
+                                double t0A, double t1A,
+                                Function **funcsA, int nFuncsA,
+                                GBool extend0A, GBool extend1A):
+  GfxUnivariateShading(2, t0A, t1A, funcsA, nFuncsA, extend0A, extend1A)
+{
+  x0 = x0A;
+  y0 = y0A;
+  x1 = x1A;
+  y1 = y1A;
+}
+
+GfxAxialShading::GfxAxialShading(GfxAxialShading *shading):
+  GfxUnivariateShading(shading)
+{
+  x0 = shading->x0;
+  y0 = shading->y0;
+  x1 = shading->x1;
+  y1 = shading->y1;
+}
+
+GfxAxialShading::~GfxAxialShading() {
+}
+
+GfxAxialShading *GfxAxialShading::parse(Dict *dict, Gfx *gfx) {
+  GfxAxialShading *shading;
+  double x0A, y0A, x1A, y1A;
+  double t0A, t1A;
+  Function *funcsA[gfxColorMaxComps];
+  int nFuncsA;
+  GBool extend0A, extend1A;
+  Object obj1, obj2;
+  int i;
+
+  x0A = y0A = x1A = y1A = 0;
+  if (dict->lookup("Coords", &obj1)->isArray() &&
+      obj1.arrayGetLength() == 4) {
+    Object obj3, obj4, obj5;
+    obj1.arrayGet(0, &obj2);
+    obj1.arrayGet(1, &obj3);
+    obj1.arrayGet(2, &obj4);
+    obj1.arrayGet(3, &obj5);
+    if (obj2.isNum() && obj3.isNum() && obj4.isNum() && obj5.isNum()) {
+      x0A = obj2.getNum();
+      y0A = obj3.getNum();
+      x1A = obj4.getNum();
+      y1A = obj5.getNum();
+    }
+    obj2.free();
+    obj3.free();
+    obj4.free();
+    obj5.free();
+  } else {
+    error(errSyntaxWarning, -1, "Missing or invalid Coords in shading dictionary");
+    goto err1;
+  }
+  obj1.free();
+
+  t0A = 0;
+  t1A = 1;
+  if (dict->lookup("Domain", &obj1)->isArray() &&
+      obj1.arrayGetLength() == 2) {
+    Object obj3;
+    obj1.arrayGet(0, &obj2);
+    obj1.arrayGet(1, &obj3);
+    if (obj2.isNum() && obj3.isNum()) {
+      t0A = obj2.getNum();
+      t1A = obj3.getNum();
+    }
+    obj2.free();
+    obj3.free();
+  }
+  obj1.free();
+
+  dict->lookup("Function", &obj1);
+  if (obj1.isArray()) {
+    nFuncsA = obj1.arrayGetLength();
+    if (nFuncsA > gfxColorMaxComps) {
+      error(errSyntaxWarning, -1, "Invalid Function array in shading dictionary");
+      goto err1;
+    }
+    for (i = 0; i < nFuncsA; ++i) {
+      obj1.arrayGet(i, &obj2);
+      if (!(funcsA[i] = Function::parse(&obj2))) {
+       obj1.free();
+       obj2.free();
+       goto err1;
+      }
+      obj2.free();
+    }
+  } else {
+    nFuncsA = 1;
+    if (!(funcsA[0] = Function::parse(&obj1))) {
+      obj1.free();
+      goto err1;
+    }
+  }
+  obj1.free();
+
+  extend0A = extend1A = gFalse;
+  if (dict->lookup("Extend", &obj1)->isArray() &&
+      obj1.arrayGetLength() == 2) {
+    extend0A = obj1.arrayGet(0, &obj2)->getBool();
+    obj2.free();
+    extend1A = obj1.arrayGet(1, &obj2)->getBool();
+    obj2.free();
+  }
+  obj1.free();
+
+  shading = new GfxAxialShading(x0A, y0A, x1A, y1A, t0A, t1A,
+                               funcsA, nFuncsA, extend0A, extend1A);
+  if (!shading->init(dict, gfx)) {
+    delete shading;
+    return NULL;
+  }
+  return shading;
+
+ err1:
+  return NULL;
+}
+
+GfxShading *GfxAxialShading::copy() {
+  return new GfxAxialShading(this);
+}
+
+double GfxAxialShading::getDistance(double sMin, double sMax) {
+  double xMin, yMin, xMax, yMax;
+
+  xMin = x0 + sMin * (x1 - x0);
+  yMin = y0 + sMin * (y1 - y0);
+  xMax = x0 + sMax * (x1 - x0);
+  yMax = y0 + sMax * (y1 - y0);
+
+  return hypot(xMax-xMin, yMax-yMin);
+}
+
+void GfxAxialShading::getParameterRange(double *lower, double *upper,
+                                       double xMin, double yMin,
+                                       double xMax, double yMax) {
+  double pdx, pdy, invsqnorm, tdx, tdy, t, range[2];
+
+  // Linear gradients are orthogonal to the line passing through their
+  // extremes. Because of convexity, the parameter range can be
+  // computed as the convex hull (one the real line) of the parameter
+  // values of the 4 corners of the box.
+  //
+  // The parameter value t for a point (x,y) can be computed as:
+  //
+  //   t = (p2 - p1) . (x,y) / |p2 - p1|^2
+  //
+  // t0  is the t value for the top left corner
+  // tdx is the difference between left and right corners
+  // tdy is the difference between top and bottom corners
+
+  pdx = x1 - x0;
+  pdy = y1 - y0;
+  invsqnorm = 1.0 / (pdx * pdx + pdy * pdy);
+  pdx *= invsqnorm;
+  pdy *= invsqnorm;
+
+  t = (xMin - x0) * pdx + (yMin - y0) * pdy;
+  tdx = (xMax - xMin) * pdx;
+  tdy = (yMax - yMin) * pdy;
+
+  // Because of the linearity of the t value, tdx can simply be added
+  // the t0 to move along the top edge. After this, *lower and *upper
+  // represent the parameter range for the top edge, so extending it
+  // to include the whole box simply requires adding tdy to the
+  // correct extreme.
+
+  range[0] = range[1] = t;
+  if (tdx < 0)
+    range[0] += tdx;
+  else
+    range[1] += tdx;
+
+  if (tdy < 0)
+    range[0] += tdy;
+  else
+    range[1] += tdy;
+
+  *lower = std::max<double>(0., std::min<double>(1., range[0]));
+  *upper = std::max<double>(0., std::min<double>(1., range[1]));
+}                                      
+
+//------------------------------------------------------------------------
+// GfxRadialShading
+//------------------------------------------------------------------------
+
+#ifndef RADIAL_EPSILON
+#define RADIAL_EPSILON (1. / 1024 / 1024)
+#endif
+
+GfxRadialShading::GfxRadialShading(double x0A, double y0A, double r0A,
+                                  double x1A, double y1A, double r1A,
+                                  double t0A, double t1A,
+                                  Function **funcsA, int nFuncsA,
+                                  GBool extend0A, GBool extend1A):
+  GfxUnivariateShading(3, t0A, t1A, funcsA, nFuncsA, extend0A, extend1A)
+{
+  x0 = x0A;
+  y0 = y0A;
+  r0 = r0A;
+  x1 = x1A;
+  y1 = y1A;
+  r1 = r1A;
+}
+
+GfxRadialShading::GfxRadialShading(GfxRadialShading *shading):
+  GfxUnivariateShading(shading)
+{
+  x0 = shading->x0;
+  y0 = shading->y0;
+  r0 = shading->r0;
+  x1 = shading->x1;
+  y1 = shading->y1;
+  r1 = shading->r1;
+}
+
+GfxRadialShading::~GfxRadialShading() {
+}
+
+GfxRadialShading *GfxRadialShading::parse(Dict *dict, Gfx *gfx) {
+  GfxRadialShading *shading;
+  double x0A, y0A, r0A, x1A, y1A, r1A;
+  double t0A, t1A;
+  Function *funcsA[gfxColorMaxComps];
+  int nFuncsA;
+  GBool extend0A, extend1A;
+  Object obj1, obj2;
+  int i;
+
+  x0A = y0A = r0A = x1A = y1A = r1A = 0;
+  if (dict->lookup("Coords", &obj1)->isArray() &&
+      obj1.arrayGetLength() == 6) {
+    x0A = obj1.arrayGet(0, &obj2)->getNum();
+    obj2.free();
+    y0A = obj1.arrayGet(1, &obj2)->getNum();
+    obj2.free();
+    r0A = obj1.arrayGet(2, &obj2)->getNum();
+    obj2.free();
+    x1A = obj1.arrayGet(3, &obj2)->getNum();
+    obj2.free();
+    y1A = obj1.arrayGet(4, &obj2)->getNum();
+    obj2.free();
+    r1A = obj1.arrayGet(5, &obj2)->getNum();
+    obj2.free();
+  } else {
+    error(errSyntaxWarning, -1, "Missing or invalid Coords in shading dictionary");
+    goto err1;
+  }
+  obj1.free();
+
+  t0A = 0;
+  t1A = 1;
+  if (dict->lookup("Domain", &obj1)->isArray() &&
+      obj1.arrayGetLength() == 2) {
+    t0A = obj1.arrayGet(0, &obj2)->getNum();
+    obj2.free();
+    t1A = obj1.arrayGet(1, &obj2)->getNum();
+    obj2.free();
+  }
+  obj1.free();
+
+  dict->lookup("Function", &obj1);
+  if (obj1.isArray()) {
+    nFuncsA = obj1.arrayGetLength();
+    if (nFuncsA > gfxColorMaxComps) {
+      error(errSyntaxWarning, -1, "Invalid Function array in shading dictionary");
+      goto err1;
+    }
+    for (i = 0; i < nFuncsA; ++i) {
+      obj1.arrayGet(i, &obj2);
+      if (!(funcsA[i] = Function::parse(&obj2))) {
+       obj1.free();
+       obj2.free();
+       goto err1;
+      }
+      obj2.free();
+    }
+  } else {
+    nFuncsA = 1;
+    if (!(funcsA[0] = Function::parse(&obj1))) {
+      obj1.free();
+      goto err1;
+    }
+  }
+  obj1.free();
+
+  extend0A = extend1A = gFalse;
+  if (dict->lookup("Extend", &obj1)->isArray() &&
+      obj1.arrayGetLength() == 2) {
+    extend0A = obj1.arrayGet(0, &obj2)->getBool();
+    obj2.free();
+    extend1A = obj1.arrayGet(1, &obj2)->getBool();
+    obj2.free();
+  }
+  obj1.free();
+
+  shading = new GfxRadialShading(x0A, y0A, r0A, x1A, y1A, r1A, t0A, t1A,
+                                funcsA, nFuncsA, extend0A, extend1A);
+  if (!shading->init(dict, gfx)) {
+    delete shading;
+    return NULL;
+  }
+  return shading;
+
+ err1:
+  return NULL;
+}
+
+GfxShading *GfxRadialShading::copy() {
+  return new GfxRadialShading(this);
+}
+
+double GfxRadialShading::getDistance(double sMin, double sMax) {
+  double xMin, yMin, rMin, xMax, yMax, rMax;
+
+  xMin = x0 + sMin * (x1 - x0);
+  yMin = y0 + sMin * (y1 - y0);
+  rMin = r0 + sMin * (r1 - r0);
+
+  xMax = x0 + sMax * (x1 - x0);
+  yMax = y0 + sMax * (y1 - y0);
+  rMax = r0 + sMax * (r1 - r0);
+
+  return hypot(xMax-xMin, yMax-yMin) + fabs(rMax-rMin);
+}
+
+// extend range, adapted from cairo, radialExtendRange
+static GBool
+radialExtendRange (double range[2], double value, GBool valid)
+{
+  if (!valid)
+    range[0] = range[1] = value;
+  else if (value < range[0])
+    range[0] = value;
+  else if (value > range[1])
+    range[1] = value;
+
+  return gTrue;
+}
+
+inline void radialEdge(double num, double den, double delta, double lower, double upper,
+                                          double dr, double mindr, GBool &valid, double *range)
+{ 
+  if (fabs (den) >= RADIAL_EPSILON) {                                  
+    double t_edge, v;                                                                                                                          
+    t_edge = (num) / (den);                                            
+    v = t_edge * (delta);                                              
+    if (t_edge * dr >= mindr && (lower) <= v && v <= (upper))          
+      valid = radialExtendRange (range, t_edge, valid);                        
+  }
+}
+
+inline void radialCorner1(double x, double y, double &b, double dx, double dy, double cr, 
+                                          double dr, double mindr, GBool &valid, double *range)
+{
+    b = (x) * dx + (y) * dy + cr * dr;                         
+    if (fabs (b) >= RADIAL_EPSILON) {                          
+      double t_corner;                                         
+      double x2 = (x) * (x);                                   
+      double y2 = (y) * (y);                                   
+      double cr2 = (cr) * (cr);                                        
+      double c = x2 + y2 - cr2;                                        
+                                                               
+      t_corner = 0.5 * c / b;                                  
+      if (t_corner * dr >= mindr)                              
+       valid = radialExtendRange (range, t_corner, valid);     
+    }
+}
+
+inline void radialCorner2(double x, double y, double a, double &b, double &c, double &d, double dx, double dy, double cr,
+                                          double inva, double dr, double mindr, GBool &valid, double *range)
+{
+    b = (x) * dx + (y) * dy + cr * dr;                         
+    c = (x) * (x) + (y) * (y) - cr * cr;                       
+    d = b * b - a * c;                                         
+    if (d >= 0) {                                              
+      double t_corner;                                         
+                                                               
+      d = sqrt (d);                                            
+      t_corner = (b + d) * inva;                               
+      if (t_corner * dr >= mindr)                              
+       valid = radialExtendRange (range, t_corner, valid);     
+      t_corner = (b - d) * inva;                               
+      if (t_corner * dr >= mindr)                              
+       valid = radialExtendRange (range, t_corner, valid);     
+    }
+}
+void GfxRadialShading::getParameterRange(double *lower, double *upper,
+                                        double xMin, double yMin,
+                                        double xMax, double yMax) {
+  double cx, cy, cr, dx, dy, dr;
+  double a, x_focus, y_focus;
+  double mindr, minx, miny, maxx, maxy;
+  double range[2];
+  GBool valid;
+
+  // A radial pattern is considered degenerate if it can be
+  // represented as a solid or clear pattern.  This corresponds to one
+  // of the two cases:
+  //
+  // 1) The radii are both very small:
+  //      |dr| < FLT_EPSILON && min (r0, r1) < FLT_EPSILON
+  //
+  // 2) The two circles have about the same radius and are very
+  //    close to each other (approximately a cylinder gradient that
+  //    doesn't move with the parameter):
+  //      |dr| < FLT_EPSILON && max (|dx|, |dy|) < 2 * FLT_EPSILON
+
+  if (xMin >= xMax || yMin >=yMax || 
+      (fabs (r0 - r1) < RADIAL_EPSILON &&
+       (std::min<double>(r0, r1) < RADIAL_EPSILON ||
+       std::max<double>(fabs (x0 - x1), fabs (y0 - y1)) < 2 * RADIAL_EPSILON))) {
+    *lower = *upper = 0;
+    return;
+  }
+
+  range[0] = range[1] = 0;
+  valid = gFalse;
+
+  x_focus = y_focus = 0; // silence gcc
+
+  cx = x0;
+  cy = y0;
+  cr = r0;
+  dx = x1 - cx;
+  dy = y1 - cy;
+  dr = r1 - cr;
+
+  // translate by -(cx, cy) to simplify computations
+  xMin -= cx;
+  yMin -= cy;
+  xMax -= cx;
+  yMax -= cy;
+
+  // enlarge boundaries slightly to avoid rounding problems in the
+  // parameter range computation
+  xMin -= RADIAL_EPSILON;
+  yMin -= RADIAL_EPSILON;
+  xMax += RADIAL_EPSILON;
+  yMax += RADIAL_EPSILON;
+
+  // enlarge boundaries even more to avoid rounding problems when
+  // testing if a point belongs to the box
+  minx = xMin - RADIAL_EPSILON;
+  miny = yMin - RADIAL_EPSILON;
+  maxx = xMax + RADIAL_EPSILON;
+  maxy = yMax + RADIAL_EPSILON;
+
+  // we dont' allow negative radiuses, so we will be checking that
+  // t*dr >= mindr to consider t valid
+  mindr = -(cr + RADIAL_EPSILON);
+
+  // After the previous transformations, the start circle is centered
+  // in the origin and has radius cr. A 1-unit change in the t
+  // parameter corresponds to dx,dy,dr changes in the x,y,r of the
+  // circle (center coordinates, radius).
+  //
+  // To compute the minimum range needed to correctly draw the
+  // pattern, we start with an empty range and extend it to include
+  // the circles touching the bounding box or within it.
+    
+  // Focus, the point where the circle has radius == 0.
+  //
+  // r = cr + t * dr = 0
+  // t = -cr / dr
+  //
+  // If the radius is constant (dr == 0) there is no focus (the
+  // gradient represents a cylinder instead of a cone).
+  if (fabs (dr) >= RADIAL_EPSILON) {
+    double t_focus;
+
+    t_focus = -cr / dr;
+    x_focus = t_focus * dx;
+    y_focus = t_focus * dy;
+    if (minx <= x_focus && x_focus <= maxx &&
+       miny <= y_focus && y_focus <= maxy)
+    {
+      valid = radialExtendRange (range, t_focus, valid);
+    }
+  }
+
+  // Circles externally tangent to box edges.
+  //
+  // All circles have center in (dx, dy) * t
+  //
+  // If the circle is tangent to the line defined by the edge of the
+  // box, then at least one of the following holds true:
+  //
+  //   (dx*t) + (cr + dr*t) == x0 (left   edge)
+  //   (dx*t) - (cr + dr*t) == x1 (right  edge)
+  //   (dy*t) + (cr + dr*t) == y0 (top    edge)
+  //   (dy*t) - (cr + dr*t) == y1 (bottom edge)
+  //
+  // The solution is only valid if the tangent point is actually on
+  // the edge, i.e. if its y coordinate is in [y0,y1] for left/right
+  // edges and if its x coordinate is in [x0,x1] for top/bottom edges.
+  //
+  // For the first equation:
+  //
+  //   (dx + dr) * t = x0 - cr
+  //   t = (x0 - cr) / (dx + dr)
+  //   y = dy * t
+  //
+  // in the code this becomes:
+  //
+  //   t_edge = (num) / (den)
+  //   v = (delta) * t_edge
+  //
+  // If the denominator in t is 0, the pattern is tangent to a line
+  // parallel to the edge under examination. The corner-case where the
+  // boundary line is the same as the edge is handled by the focus
+  // point case and/or by the a==0 case.
+  
+  // circles tangent (externally) to left/right/top/bottom edge
+  radialEdge(xMin - cr, dx + dr, dy, miny, maxy, dr, mindr, valid, range);
+  radialEdge(xMax + cr, dx - dr, dy, miny, maxy, dr, mindr, valid, range);
+  radialEdge(yMin - cr, dy + dr, dx, minx, maxx, dr, mindr, valid, range);
+  radialEdge(yMax + cr, dy - dr, dx, minx, maxx, dr, mindr, valid, range);
+
+  // Circles passing through a corner.
+  //
+  // A circle passing through the point (x,y) satisfies:
+  //
+  // (x-t*dx)^2 + (y-t*dy)^2 == (cr + t*dr)^2
+  //
+  // If we set:
+  //   a = dx^2 + dy^2 - dr^2
+  //   b = x*dx + y*dy + cr*dr
+  //   c = x^2 + y^2 - cr^2
+  // we have:
+  //   a*t^2 - 2*b*t + c == 0
+    
+  a = dx * dx + dy * dy - dr * dr;
+  if (fabs (a) < RADIAL_EPSILON * RADIAL_EPSILON) {
+    double b;
+
+    // Ensure that gradients with both a and dr small are
+    // considered degenerate.
+    // The floating point version of the degeneracy test implemented
+    // in _radial_pattern_is_degenerate() is:
+    //
+    //  1) The circles are practically the same size:
+    //     |dr| < RADIAL_EPSILON
+    //  AND
+    //  2a) The circles are both very small:
+    //      min (r0, r1) < RADIAL_EPSILON
+    //   OR
+    //  2b) The circles are very close to each other:
+    //      max (|dx|, |dy|) < 2 * RADIAL_EPSILON
+    //
+    // Assuming that the gradient is not degenerate, we want to
+    // show that |a| < RADIAL_EPSILON^2 implies |dr| >= RADIAL_EPSILON.
+    //
+    // If the gradient is not degenerate yet it has |dr| <
+    // RADIAL_EPSILON, (2b) is false, thus:
+    //
+    //   max (|dx|, |dy|) >= 2*RADIAL_EPSILON
+    // which implies:
+    //   4*RADIAL_EPSILON^2 <= max (|dx|, |dy|)^2 <= dx^2 + dy^2
+    //
+    // From the definition of a, we get:
+    //   a = dx^2 + dy^2 - dr^2 < RADIAL_EPSILON^2
+    //   dx^2 + dy^2 - RADIAL_EPSILON^2 < dr^2
+    //   3*RADIAL_EPSILON^2 < dr^2
+    //
+    // which is inconsistent with the hypotheses, thus |dr| <
+    // RADIAL_EPSILON is false or the gradient is degenerate.
+       
+    assert (fabs (dr) >= RADIAL_EPSILON);
+
+    // If a == 0, all the circles are tangent to a line in the
+    // focus point. If this line is within the box extents, we
+    // should add the circle with infinite radius, but this would
+    // make the range unbounded. We will be limiting the range to
+    // [0,1] anyway, so we simply add the biggest legitimate
+    // circle (it happens for 0 or for 1).
+    if (dr < 0) {
+      valid = radialExtendRange (range, 0, valid);
+    } else {
+      valid = radialExtendRange (range, 1, valid);
+    }
+
+    // Nondegenerate, nonlimit circles passing through the corners.
+    //
+    // a == 0 && a*t^2 - 2*b*t + c == 0
+    //
+    // t = c / (2*b)
+    //
+    // The b == 0 case has just been handled, so we only have to
+    // compute this if b != 0.
+
+       // circles touching each corner
+       radialCorner1(xMin, yMin, b, dx, dy, cr, dr, mindr, valid, range);
+       radialCorner1(xMin, yMax, b, dx, dy, cr, dr, mindr, valid, range);
+       radialCorner1(xMax, yMin, b, dx, dy, cr, dr, mindr, valid, range);
+       radialCorner1(xMax, yMax, b, dx, dy, cr, dr, mindr, valid, range);
+  } else {
+    double inva, b, c, d;
+
+    inva = 1 / a;
+
+    // Nondegenerate, nonlimit circles passing through the corners.
+    //
+    // a != 0 && a*t^2 - 2*b*t + c == 0
+    //
+    // t = (b +- sqrt (b*b - a*c)) / a
+    //
+    // If the argument of sqrt() is negative, then no circle
+    // passes through the corner.
+
+    // circles touching each corner
+       radialCorner2(xMin, yMin, a, b, c, d, dx, dy, cr, inva, dr, mindr, valid, range);
+       radialCorner2(xMin, yMax, a, b, c, d, dx, dy, cr, inva, dr, mindr, valid, range);
+       radialCorner2(xMax, yMin, a, b, c, d, dx, dy, cr, inva, dr, mindr, valid, range);
+       radialCorner2(xMax, yMax, a, b, c, d, dx, dy, cr, inva, dr, mindr, valid, range);
+  }
+
+  *lower = std::max<double>(0., std::min<double>(1., range[0]));
+  *upper = std::max<double>(0., std::min<double>(1., range[1]));
+}
+
+//------------------------------------------------------------------------
+// GfxShadingBitBuf
+//------------------------------------------------------------------------
+
+class GfxShadingBitBuf {
+public:
+
+  GfxShadingBitBuf(Stream *strA);
+  ~GfxShadingBitBuf();
+  GBool getBits(int n, Guint *val);
+  void flushBits();
+
+private:
+
+  Stream *str;
+  int bitBuf;
+  int nBits;
+};
+
+GfxShadingBitBuf::GfxShadingBitBuf(Stream *strA) {
+  str = strA;
+  str->reset();
+  bitBuf = 0;
+  nBits = 0;
+}
+
+GfxShadingBitBuf::~GfxShadingBitBuf() {
+  str->close();
+}
+
+GBool GfxShadingBitBuf::getBits(int n, Guint *val) {
+  int x;
+
+  if (nBits >= n) {
+    x = (bitBuf >> (nBits - n)) & ((1 << n) - 1);
+    nBits -= n;
+  } else {
+    x = 0;
+    if (nBits > 0) {
+      x = bitBuf & ((1 << nBits) - 1);
+      n -= nBits;
+      nBits = 0;
+    }
+    while (n > 0) {
+      if ((bitBuf = str->getChar()) == EOF) {
+       nBits = 0;
+       return gFalse;
+      }
+      if (n >= 8) {
+       x = (x << 8) | bitBuf;
+       n -= 8;
+      } else {
+       x = (x << n) | (bitBuf >> (8 - n));
+       nBits = 8 - n;
+       n = 0;
+      }
+    }
+  }
+  *val = x;
+  return gTrue;
+}
+
+void GfxShadingBitBuf::flushBits() {
+  bitBuf = 0;
+  nBits = 0;
+}
+
+//------------------------------------------------------------------------
+// GfxGouraudTriangleShading
+//------------------------------------------------------------------------
+
+GfxGouraudTriangleShading::GfxGouraudTriangleShading(
+                              int typeA,
+                              GfxGouraudVertex *verticesA, int nVerticesA,
+                              int (*trianglesA)[3], int nTrianglesA,
+                              Function **funcsA, int nFuncsA):
+  GfxShading(typeA)
+{
+  int i;
+
+  vertices = verticesA;
+  nVertices = nVerticesA;
+  triangles = trianglesA;
+  nTriangles = nTrianglesA;
+  nFuncs = nFuncsA;
+  for (i = 0; i < nFuncs; ++i) {
+    funcs[i] = funcsA[i];
+  }
+}
+
+GfxGouraudTriangleShading::GfxGouraudTriangleShading(
+                              GfxGouraudTriangleShading *shading):
+  GfxShading(shading)
+{
+  int i;
+
+  nVertices = shading->nVertices;
+  vertices = (GfxGouraudVertex *)gmallocn(nVertices, sizeof(GfxGouraudVertex));
+  memcpy(vertices, shading->vertices, nVertices * sizeof(GfxGouraudVertex));
+  nTriangles = shading->nTriangles;
+  triangles = (int (*)[3])gmallocn(nTriangles * 3, sizeof(int));
+  memcpy(triangles, shading->triangles, nTriangles * 3 * sizeof(int));
+  nFuncs = shading->nFuncs;
+  for (i = 0; i < nFuncs; ++i) {
+    funcs[i] = shading->funcs[i]->copy();
+  }
+}
+
+GfxGouraudTriangleShading::~GfxGouraudTriangleShading() {
+  int i;
+
+  gfree(vertices);
+  gfree(triangles);
+  for (i = 0; i < nFuncs; ++i) {
+    delete funcs[i];
+  }
+}
+
+GfxGouraudTriangleShading *GfxGouraudTriangleShading::parse(int typeA,
+                                                           Dict *dict,
+                                                           Stream *str,
+                                                           Gfx *gfx) {
+  GfxGouraudTriangleShading *shading;
+  Function *funcsA[gfxColorMaxComps];
+  int nFuncsA;
+  int coordBits, compBits, flagBits, vertsPerRow, nRows;
+  double xMin, xMax, yMin, yMax;
+  double cMin[gfxColorMaxComps], cMax[gfxColorMaxComps];
+  double xMul, yMul;
+  double cMul[gfxColorMaxComps];
+  GfxGouraudVertex *verticesA;
+  int (*trianglesA)[3];
+  int nComps, nVerticesA, nTrianglesA, vertSize, triSize;
+  Guint x, y, flag;
+  Guint c[gfxColorMaxComps];
+  GfxShadingBitBuf *bitBuf;
+  Object obj1, obj2;
+  int i, j, k, state;
+
+  if (dict->lookup("BitsPerCoordinate", &obj1)->isInt()) {
+    coordBits = obj1.getInt();
+  } else {
+    error(errSyntaxWarning, -1, "Missing or invalid BitsPerCoordinate in shading dictionary");
+    goto err2;
+  }
+  obj1.free();
+  if (dict->lookup("BitsPerComponent", &obj1)->isInt()) {
+    compBits = obj1.getInt();
+  } else {
+    error(errSyntaxWarning, -1, "Missing or invalid BitsPerComponent in shading dictionary");
+    goto err2;
+  }
+  obj1.free();
+  flagBits = vertsPerRow = 0; // make gcc happy
+  if (typeA == 4) {
+    if (dict->lookup("BitsPerFlag", &obj1)->isInt()) {
+      flagBits = obj1.getInt();
+    } else {
+      error(errSyntaxWarning, -1, "Missing or invalid BitsPerFlag in shading dictionary");
+      goto err2;
+    }
+    obj1.free();
+  } else {
+    if (dict->lookup("VerticesPerRow", &obj1)->isInt()) {
+      vertsPerRow = obj1.getInt();
+    } else {
+      error(errSyntaxWarning, -1, "Missing or invalid VerticesPerRow in shading dictionary");
+      goto err2;
+    }
+    obj1.free();
+  }
+  if (dict->lookup("Decode", &obj1)->isArray() &&
+      obj1.arrayGetLength() >= 6) {
+    xMin = obj1.arrayGet(0, &obj2)->getNum();
+    obj2.free();
+    xMax = obj1.arrayGet(1, &obj2)->getNum();
+    obj2.free();
+    xMul = (xMax - xMin) / (pow(2.0, coordBits) - 1);
+    yMin = obj1.arrayGet(2, &obj2)->getNum();
+    obj2.free();
+    yMax = obj1.arrayGet(3, &obj2)->getNum();
+    obj2.free();
+    yMul = (yMax - yMin) / (pow(2.0, coordBits) - 1);
+    for (i = 0; 5 + 2*i < obj1.arrayGetLength() && i < gfxColorMaxComps; ++i) {
+      cMin[i] = obj1.arrayGet(4 + 2*i, &obj2)->getNum();
+      obj2.free();
+      cMax[i] = obj1.arrayGet(5 + 2*i, &obj2)->getNum();
+      obj2.free();
+      cMul[i] = (cMax[i] - cMin[i]) / (double)((1 << compBits) - 1);
+    }
+    nComps = i;
+  } else {
+    error(errSyntaxWarning, -1, "Missing or invalid Decode array in shading dictionary");
+    goto err2;
+  }
+  obj1.free();
+
+  if (!dict->lookup("Function", &obj1)->isNull()) {
+    if (obj1.isArray()) {
+      nFuncsA = obj1.arrayGetLength();
+      if (nFuncsA > gfxColorMaxComps) {
+       error(errSyntaxWarning, -1, "Invalid Function array in shading dictionary");
+       goto err1;
+      }
+      for (i = 0; i < nFuncsA; ++i) {
+       obj1.arrayGet(i, &obj2);
+       if (!(funcsA[i] = Function::parse(&obj2))) {
+         obj1.free();
+         obj2.free();
+         goto err1;
+       }
+       obj2.free();
+      }
+    } else {
+      nFuncsA = 1;
+      if (!(funcsA[0] = Function::parse(&obj1))) {
+       obj1.free();
+       goto err1;
+      }
+    }
+  } else {
+    nFuncsA = 0;
+  }
+  obj1.free();
+
+  nVerticesA = nTrianglesA = 0;
+  verticesA = NULL;
+  trianglesA = NULL;
+  vertSize = triSize = 0;
+  state = 0;
+  flag = 0; // make gcc happy
+  bitBuf = new GfxShadingBitBuf(str);
+  while (1) {
+    if (typeA == 4) {
+      if (!bitBuf->getBits(flagBits, &flag)) {
+       break;
+      }
+    }
+    if (!bitBuf->getBits(coordBits, &x) ||
+       !bitBuf->getBits(coordBits, &y)) {
+      break;
+    }
+    for (i = 0; i < nComps; ++i) {
+      if (!bitBuf->getBits(compBits, &c[i])) {
+       break;
+      }
+    }
+    if (i < nComps) {
+      break;
+    }
+    if (nVerticesA == vertSize) {
+      int oldVertSize = vertSize;
+      vertSize = (vertSize == 0) ? 16 : 2 * vertSize;
+      verticesA = (GfxGouraudVertex *)
+                     greallocn(verticesA, vertSize, sizeof(GfxGouraudVertex));
+      memset(verticesA + oldVertSize, 0, (vertSize - oldVertSize) * sizeof(GfxGouraudVertex));
+    }
+    verticesA[nVerticesA].x = xMin + xMul * (double)x;
+    verticesA[nVerticesA].y = yMin + yMul * (double)y;
+    for (i = 0; i < nComps; ++i) {
+      verticesA[nVerticesA].color.c[i] =
+         dblToCol(cMin[i] + cMul[i] * (double)c[i]);
+    }
+    ++nVerticesA;
+    bitBuf->flushBits();
+    if (typeA == 4) {
+      if (state == 0 || state == 1) {
+       ++state;
+      } else if (state == 2 || flag > 0) {
+       if (nTrianglesA == triSize) {
+         triSize = (triSize == 0) ? 16 : 2 * triSize;
+         trianglesA = (int (*)[3])
+                          greallocn(trianglesA, triSize * 3, sizeof(int));
+       }
+       if (state == 2) {
+         trianglesA[nTrianglesA][0] = nVerticesA - 3;
+         trianglesA[nTrianglesA][1] = nVerticesA - 2;
+         trianglesA[nTrianglesA][2] = nVerticesA - 1;
+         ++state;
+       } else if (flag == 1) {
+         trianglesA[nTrianglesA][0] = trianglesA[nTrianglesA - 1][1];
+         trianglesA[nTrianglesA][1] = trianglesA[nTrianglesA - 1][2];
+         trianglesA[nTrianglesA][2] = nVerticesA - 1;
+       } else { // flag == 2
+         trianglesA[nTrianglesA][0] = trianglesA[nTrianglesA - 1][0];
+         trianglesA[nTrianglesA][1] = trianglesA[nTrianglesA - 1][2];
+         trianglesA[nTrianglesA][2] = nVerticesA - 1;
+       }
+       ++nTrianglesA;
+      } else { // state == 3 && flag == 0
+       state = 1;
+      }
+    }
+  }
+  delete bitBuf;
+  if (typeA == 5) {
+    nRows = nVerticesA / vertsPerRow;
+    nTrianglesA = (nRows - 1) * 2 * (vertsPerRow - 1);
+    trianglesA = (int (*)[3])gmallocn(nTrianglesA * 3, sizeof(int));
+    k = 0;
+    for (i = 0; i < nRows - 1; ++i) {
+      for (j = 0; j < vertsPerRow - 1; ++j) {
+       trianglesA[k][0] = i * vertsPerRow + j;
+       trianglesA[k][1] = i * vertsPerRow + j+1;
+       trianglesA[k][2] = (i+1) * vertsPerRow + j;
+       ++k;
+       trianglesA[k][0] = i * vertsPerRow + j+1;
+       trianglesA[k][1] = (i+1) * vertsPerRow + j;
+       trianglesA[k][2] = (i+1) * vertsPerRow + j+1;
+       ++k;
+      }
+    }
+  }
+
+  shading = new GfxGouraudTriangleShading(typeA, verticesA, nVerticesA,
+                                         trianglesA, nTrianglesA,
+                                         funcsA, nFuncsA);
+  if (!shading->init(dict, gfx)) {
+    delete shading;
+    return NULL;
+  }
+  return shading;
+
+ err2:
+  obj1.free();
+ err1:
+  return NULL;
+}
+
+GfxShading *GfxGouraudTriangleShading::copy() {
+  return new GfxGouraudTriangleShading(this);
+}
+
+void GfxGouraudTriangleShading::getTriangle(
+                                   int i,
+                                   double *x0, double *y0, GfxColor *color0,
+                                   double *x1, double *y1, GfxColor *color1,
+                                   double *x2, double *y2, GfxColor *color2) {
+  double in;
+  double out[gfxColorMaxComps];
+  int v, j;
+
+  assert(!isParameterized()); 
+
+  v = triangles[i][0];
+  *x0 = vertices[v].x;
+  *y0 = vertices[v].y;
+  if (nFuncs > 0) {
+    in = colToDbl(vertices[v].color.c[0]);
+    for (j = 0; j < nFuncs; ++j) {
+      funcs[j]->transform(&in, &out[j]);
+    }
+    for (j = 0; j < gfxColorMaxComps; ++j) {
+      color0->c[j] = dblToCol(out[j]);
+    }
+  } else {
+    *color0 = vertices[v].color;
+  }
+  v = triangles[i][1];
+  *x1 = vertices[v].x;
+  *y1 = vertices[v].y;
+  if (nFuncs > 0) {
+    in = colToDbl(vertices[v].color.c[0]);
+    for (j = 0; j < nFuncs; ++j) {
+      funcs[j]->transform(&in, &out[j]);
+    }
+    for (j = 0; j < gfxColorMaxComps; ++j) {
+      color1->c[j] = dblToCol(out[j]);
+    }
+  } else {
+    *color1 = vertices[v].color;
+  }
+  v = triangles[i][2];
+  *x2 = vertices[v].x;
+  *y2 = vertices[v].y;
+  if (nFuncs > 0) {
+    in = colToDbl(vertices[v].color.c[0]);
+    for (j = 0; j < nFuncs; ++j) {
+      funcs[j]->transform(&in, &out[j]);
+    }
+    for (j = 0; j < gfxColorMaxComps; ++j) {
+      color2->c[j] = dblToCol(out[j]);
+    }
+  } else {
+    *color2 = vertices[v].color;
+  }
+}
+
+void GfxGouraudTriangleShading::getParameterizedColor(double t, GfxColor *color) {
+  double out[gfxColorMaxComps];
+
+  for (int j = 0; j < nFuncs; ++j) {
+    funcs[j]->transform(&t, &out[j]);
+  }
+  for (int j = 0; j < gfxColorMaxComps; ++j) {
+    color->c[j] = dblToCol(out[j]);
+  }
+}
+
+void GfxGouraudTriangleShading::getTriangle(int i,
+                                            double *x0, double *y0, double *color0,
+                                            double *x1, double *y1, double *color1,
+                                            double *x2, double *y2, double *color2) {
+  int v;
+
+  assert(isParameterized()); 
+
+  v = triangles[i][0];
+  *x0 = vertices[v].x;
+  *y0 = vertices[v].y;
+  *color0 = colToDbl(vertices[v].color.c[0]);
+  v = triangles[i][1];
+  *x1 = vertices[v].x;
+  *y1 = vertices[v].y;
+  *color1 = colToDbl(vertices[v].color.c[0]);
+  v = triangles[i][2];
+  *x2 = vertices[v].x;
+  *y2 = vertices[v].y;
+  *color2 = colToDbl(vertices[v].color.c[0]);
+}
+
+//------------------------------------------------------------------------
+// GfxPatchMeshShading
+//------------------------------------------------------------------------
+
+GfxPatchMeshShading::GfxPatchMeshShading(int typeA,
+                                        GfxPatch *patchesA, int nPatchesA,
+                                        Function **funcsA, int nFuncsA):
+  GfxShading(typeA)
+{
+  int i;
+
+  patches = patchesA;
+  nPatches = nPatchesA;
+  nFuncs = nFuncsA;
+  for (i = 0; i < nFuncs; ++i) {
+    funcs[i] = funcsA[i];
+  }
+}
+
+GfxPatchMeshShading::GfxPatchMeshShading(GfxPatchMeshShading *shading):
+  GfxShading(shading)
+{
+  int i;
+
+  nPatches = shading->nPatches;
+  patches = (GfxPatch *)gmallocn(nPatches, sizeof(GfxPatch));
+  memcpy(patches, shading->patches, nPatches * sizeof(GfxPatch));
+  nFuncs = shading->nFuncs;
+  for (i = 0; i < nFuncs; ++i) {
+    funcs[i] = shading->funcs[i]->copy();
+  }
+}
+
+GfxPatchMeshShading::~GfxPatchMeshShading() {
+  int i;
+
+  gfree(patches);
+  for (i = 0; i < nFuncs; ++i) {
+    delete funcs[i];
+  }
+}
+
+GfxPatchMeshShading *GfxPatchMeshShading::parse(int typeA, Dict *dict,
+                                               Stream *str, Gfx *gfx) {
+  GfxPatchMeshShading *shading;
+  Function *funcsA[gfxColorMaxComps];
+  int nFuncsA;
+  int coordBits, compBits, flagBits;
+  double xMin, xMax, yMin, yMax;
+  double cMin[gfxColorMaxComps], cMax[gfxColorMaxComps];
+  double xMul, yMul;
+  double cMul[gfxColorMaxComps];
+  GfxPatch *patchesA, *p;
+  int nComps, nPatchesA, patchesSize, nPts, nColors;
+  Guint flag;
+  double x[16], y[16];
+  Guint xi, yi;
+  double c[4][gfxColorMaxComps];
+  Guint ci;
+  GfxShadingBitBuf *bitBuf;
+  Object obj1, obj2;
+  int i, j;
+
+  if (dict->lookup("BitsPerCoordinate", &obj1)->isInt()) {
+    coordBits = obj1.getInt();
+  } else {
+    error(errSyntaxWarning, -1, "Missing or invalid BitsPerCoordinate in shading dictionary");
+    goto err2;
+  }
+  obj1.free();
+  if (dict->lookup("BitsPerComponent", &obj1)->isInt()) {
+    compBits = obj1.getInt();
+  } else {
+    error(errSyntaxWarning, -1, "Missing or invalid BitsPerComponent in shading dictionary");
+    goto err2;
+  }
+  obj1.free();
+  if (dict->lookup("BitsPerFlag", &obj1)->isInt()) {
+    flagBits = obj1.getInt();
+  } else {
+    error(errSyntaxWarning, -1, "Missing or invalid BitsPerFlag in shading dictionary");
+    goto err2;
+  }
+  obj1.free();
+  if (dict->lookup("Decode", &obj1)->isArray() &&
+      obj1.arrayGetLength() >= 6) {
+    xMin = obj1.arrayGet(0, &obj2)->getNum();
+    obj2.free();
+    xMax = obj1.arrayGet(1, &obj2)->getNum();
+    obj2.free();
+    xMul = (xMax - xMin) / (pow(2.0, coordBits) - 1);
+    yMin = obj1.arrayGet(2, &obj2)->getNum();
+    obj2.free();
+    yMax = obj1.arrayGet(3, &obj2)->getNum();
+    obj2.free();
+    yMul = (yMax - yMin) / (pow(2.0, coordBits) - 1);
+    for (i = 0; 5 + 2*i < obj1.arrayGetLength() && i < gfxColorMaxComps; ++i) {
+      cMin[i] = obj1.arrayGet(4 + 2*i, &obj2)->getNum();
+      obj2.free();
+      cMax[i] = obj1.arrayGet(5 + 2*i, &obj2)->getNum();
+      obj2.free();
+      cMul[i] = (cMax[i] - cMin[i]) / (double)((1 << compBits) - 1);
+    }
+    nComps = i;
+  } else {
+    error(errSyntaxWarning, -1, "Missing or invalid Decode array in shading dictionary");
+    goto err2;
+  }
+  obj1.free();
+
+  if (!dict->lookup("Function", &obj1)->isNull()) {
+    if (obj1.isArray()) {
+      nFuncsA = obj1.arrayGetLength();
+      if (nFuncsA > gfxColorMaxComps) {
+       error(errSyntaxWarning, -1, "Invalid Function array in shading dictionary");
+       goto err1;
+      }
+      for (i = 0; i < nFuncsA; ++i) {
+       obj1.arrayGet(i, &obj2);
+       if (!(funcsA[i] = Function::parse(&obj2))) {
+         obj1.free();
+         obj2.free();
+         goto err1;
+       }
+       obj2.free();
+      }
+    } else {
+      nFuncsA = 1;
+      if (!(funcsA[0] = Function::parse(&obj1))) {
+       obj1.free();
+       goto err1;
+      }
+    }
+  } else {
+    nFuncsA = 0;
+  }
+  obj1.free();
+
+  nPatchesA = 0;
+  patchesA = NULL;
+  patchesSize = 0;
+  bitBuf = new GfxShadingBitBuf(str);
+  while (1) {
+    if (!bitBuf->getBits(flagBits, &flag)) {
+      break;
+    }
+    if (typeA == 6) {
+      switch (flag) {
+      case 0: nPts = 12; nColors = 4; break;
+      case 1:
+      case 2:
+      case 3:
+      default: nPts =  8; nColors = 2; break;
+      }
+    } else {
+      switch (flag) {
+      case 0: nPts = 16; nColors = 4; break;
+      case 1:
+      case 2:
+      case 3:
+      default: nPts = 12; nColors = 2; break;
+      }
+    }
+    for (i = 0; i < nPts; ++i) {
+      if (!bitBuf->getBits(coordBits, &xi) ||
+         !bitBuf->getBits(coordBits, &yi)) {
+       break;
+      }
+      x[i] = xMin + xMul * (double)xi;
+      y[i] = yMin + yMul * (double)yi;
+    }
+    if (i < nPts) {
+      break;
+    }
+    for (i = 0; i < nColors; ++i) {
+      for (j = 0; j < nComps; ++j) {
+       if (!bitBuf->getBits(compBits, &ci)) {
+         break;
+       }
+       c[i][j] = cMin[j] + cMul[j] * (double)ci;
+       if( nFuncsA == 0 ) {
+         // ... and colorspace values can also be stored into doubles.
+         // They will be casted later.
+         c[i][j] = dblToCol(c[i][j]);
+       }
+      }
+      if (j < nComps) {
+       break;
+      }
+    }
+    if (i < nColors) {
+      break;
+    }
+    if (nPatchesA == patchesSize) {
+      int oldPatchesSize = patchesSize;
+      patchesSize = (patchesSize == 0) ? 16 : 2 * patchesSize;
+      patchesA = (GfxPatch *)greallocn(patchesA,
+                                      patchesSize, sizeof(GfxPatch));
+      memset(patchesA + oldPatchesSize, 0, (patchesSize - oldPatchesSize) * sizeof(GfxPatch));
+    }
+    p = &patchesA[nPatchesA];
+    if (typeA == 6) {
+      switch (flag) {
+      case 0:
+       p->x[0][0] = x[0];
+       p->y[0][0] = y[0];
+       p->x[0][1] = x[1];
+       p->y[0][1] = y[1];
+       p->x[0][2] = x[2];
+       p->y[0][2] = y[2];
+       p->x[0][3] = x[3];
+       p->y[0][3] = y[3];
+       p->x[1][3] = x[4];
+       p->y[1][3] = y[4];
+       p->x[2][3] = x[5];
+       p->y[2][3] = y[5];
+       p->x[3][3] = x[6];
+       p->y[3][3] = y[6];
+       p->x[3][2] = x[7];
+       p->y[3][2] = y[7];
+       p->x[3][1] = x[8];
+       p->y[3][1] = y[8];
+       p->x[3][0] = x[9];
+       p->y[3][0] = y[9];
+       p->x[2][0] = x[10];
+       p->y[2][0] = y[10];
+       p->x[1][0] = x[11];
+       p->y[1][0] = y[11];
+       for (j = 0; j < nComps; ++j) {
+         p->color[0][0].c[j] = c[0][j];
+         p->color[0][1].c[j] = c[1][j];
+         p->color[1][1].c[j] = c[2][j];
+         p->color[1][0].c[j] = c[3][j];
+       }
+       break;
+      case 1:
+       if (nPatchesA == 0) {
+         goto err1;
+       }
+       p->x[0][0] = patchesA[nPatchesA-1].x[0][3];
+       p->y[0][0] = patchesA[nPatchesA-1].y[0][3];
+       p->x[0][1] = patchesA[nPatchesA-1].x[1][3];
+       p->y[0][1] = patchesA[nPatchesA-1].y[1][3];
+       p->x[0][2] = patchesA[nPatchesA-1].x[2][3];
+       p->y[0][2] = patchesA[nPatchesA-1].y[2][3];
+       p->x[0][3] = patchesA[nPatchesA-1].x[3][3];
+       p->y[0][3] = patchesA[nPatchesA-1].y[3][3];
+       p->x[1][3] = x[0];
+       p->y[1][3] = y[0];
+       p->x[2][3] = x[1];
+       p->y[2][3] = y[1];
+       p->x[3][3] = x[2];
+       p->y[3][3] = y[2];
+       p->x[3][2] = x[3];
+       p->y[3][2] = y[3];
+       p->x[3][1] = x[4];
+       p->y[3][1] = y[4];
+       p->x[3][0] = x[5];
+       p->y[3][0] = y[5];
+       p->x[2][0] = x[6];
+       p->y[2][0] = y[6];
+       p->x[1][0] = x[7];
+       p->y[1][0] = y[7];
+       for (j = 0; j < nComps; ++j) {
+         p->color[0][0].c[j] = patchesA[nPatchesA-1].color[0][1].c[j];
+         p->color[0][1].c[j] = patchesA[nPatchesA-1].color[1][1].c[j];
+         p->color[1][1].c[j] = c[0][j];
+         p->color[1][0].c[j] = c[1][j];
+       }
+       break;
+      case 2:
+       if (nPatchesA == 0) {
+         goto err1;
+       }
+       p->x[0][0] = patchesA[nPatchesA-1].x[3][3];
+       p->y[0][0] = patchesA[nPatchesA-1].y[3][3];
+       p->x[0][1] = patchesA[nPatchesA-1].x[3][2];
+       p->y[0][1] = patchesA[nPatchesA-1].y[3][2];
+       p->x[0][2] = patchesA[nPatchesA-1].x[3][1];
+       p->y[0][2] = patchesA[nPatchesA-1].y[3][1];
+       p->x[0][3] = patchesA[nPatchesA-1].x[3][0];
+       p->y[0][3] = patchesA[nPatchesA-1].y[3][0];
+       p->x[1][3] = x[0];
+       p->y[1][3] = y[0];
+       p->x[2][3] = x[1];
+       p->y[2][3] = y[1];
+       p->x[3][3] = x[2];
+       p->y[3][3] = y[2];
+       p->x[3][2] = x[3];
+       p->y[3][2] = y[3];
+       p->x[3][1] = x[4];
+       p->y[3][1] = y[4];
+       p->x[3][0] = x[5];
+       p->y[3][0] = y[5];
+       p->x[2][0] = x[6];
+       p->y[2][0] = y[6];
+       p->x[1][0] = x[7];
+       p->y[1][0] = y[7];
+       for (j = 0; j < nComps; ++j) {
+         p->color[0][0].c[j] = patchesA[nPatchesA-1].color[1][1].c[j];
+         p->color[0][1].c[j] = patchesA[nPatchesA-1].color[1][0].c[j];
+         p->color[1][1].c[j] = c[0][j];
+         p->color[1][0].c[j] = c[1][j];
+       }
+       break;
+      case 3:
+       if (nPatchesA == 0) {
+         goto err1;
+       }
+       p->x[0][0] = patchesA[nPatchesA-1].x[3][0];
+       p->y[0][0] = patchesA[nPatchesA-1].y[3][0];
+       p->x[0][1] = patchesA[nPatchesA-1].x[2][0];
+       p->y[0][1] = patchesA[nPatchesA-1].y[2][0];
+       p->x[0][2] = patchesA[nPatchesA-1].x[1][0];
+       p->y[0][2] = patchesA[nPatchesA-1].y[1][0];
+       p->x[0][3] = patchesA[nPatchesA-1].x[0][0];
+       p->y[0][3] = patchesA[nPatchesA-1].y[0][0];
+       p->x[1][3] = x[0];
+       p->y[1][3] = y[0];
+       p->x[2][3] = x[1];
+       p->y[2][3] = y[1];
+       p->x[3][3] = x[2];
+       p->y[3][3] = y[2];
+       p->x[3][2] = x[3];
+       p->y[3][2] = y[3];
+       p->x[3][1] = x[4];
+       p->y[3][1] = y[4];
+       p->x[3][0] = x[5];
+       p->y[3][0] = y[5];
+       p->x[2][0] = x[6];
+       p->y[2][0] = y[6];
+       p->x[1][0] = x[7];
+       p->y[1][0] = y[7];
+       for (j = 0; j < nComps; ++j) {
+         p->color[0][1].c[j] = patchesA[nPatchesA-1].color[1][0].c[j];
+         p->color[0][1].c[j] = patchesA[nPatchesA-1].color[0][0].c[j];
+         p->color[1][1].c[j] = c[0][j];
+         p->color[1][0].c[j] = c[1][j];
+       }
+       break;
+  }
+    } else {
+      switch (flag) {
+      case 0:
+       p->x[0][0] = x[0];
+       p->y[0][0] = y[0];
+       p->x[0][1] = x[1];
+       p->y[0][1] = y[1];
+       p->x[0][2] = x[2];
+       p->y[0][2] = y[2];
+       p->x[0][3] = x[3];
+       p->y[0][3] = y[3];
+       p->x[1][3] = x[4];
+       p->y[1][3] = y[4];
+       p->x[2][3] = x[5];
+       p->y[2][3] = y[5];
+       p->x[3][3] = x[6];
+       p->y[3][3] = y[6];
+       p->x[3][2] = x[7];
+       p->y[3][2] = y[7];
+       p->x[3][1] = x[8];
+       p->y[3][1] = y[8];
+       p->x[3][0] = x[9];
+       p->y[3][0] = y[9];
+       p->x[2][0] = x[10];
+       p->y[2][0] = y[10];
+       p->x[1][0] = x[11];
+       p->y[1][0] = y[11];
+       p->x[1][1] = x[12];
+       p->y[1][1] = y[12];
+       p->x[1][2] = x[13];
+       p->y[1][2] = y[13];
+       p->x[2][2] = x[14];
+       p->y[2][2] = y[14];
+       p->x[2][1] = x[15];
+       p->y[2][1] = y[15];
+       for (j = 0; j < nComps; ++j) {
+         p->color[0][0].c[j] = c[0][j];
+         p->color[0][1].c[j] = c[1][j];
+         p->color[1][1].c[j] = c[2][j];
+         p->color[1][0].c[j] = c[3][j];
+       }
+       break;
+      case 1:
+       if (nPatchesA == 0) {
+         goto err1;
+       }
+       p->x[0][0] = patchesA[nPatchesA-1].x[0][3];
+       p->y[0][0] = patchesA[nPatchesA-1].y[0][3];
+       p->x[0][1] = patchesA[nPatchesA-1].x[1][3];
+       p->y[0][1] = patchesA[nPatchesA-1].y[1][3];
+       p->x[0][2] = patchesA[nPatchesA-1].x[2][3];
+       p->y[0][2] = patchesA[nPatchesA-1].y[2][3];
+       p->x[0][3] = patchesA[nPatchesA-1].x[3][3];
+       p->y[0][3] = patchesA[nPatchesA-1].y[3][3];
+       p->x[1][3] = x[0];
+       p->y[1][3] = y[0];
+       p->x[2][3] = x[1];
+       p->y[2][3] = y[1];
+       p->x[3][3] = x[2];
+       p->y[3][3] = y[2];
+       p->x[3][2] = x[3];
+       p->y[3][2] = y[3];
+       p->x[3][1] = x[4];
+       p->y[3][1] = y[4];
+       p->x[3][0] = x[5];
+       p->y[3][0] = y[5];
+       p->x[2][0] = x[6];
+       p->y[2][0] = y[6];
+       p->x[1][0] = x[7];
+       p->y[1][0] = y[7];
+       p->x[1][1] = x[8];
+       p->y[1][1] = y[8];
+       p->x[1][2] = x[9];
+       p->y[1][2] = y[9];
+       p->x[2][2] = x[10];
+       p->y[2][2] = y[10];
+       p->x[2][1] = x[11];
+       p->y[2][1] = y[11];
+       for (j = 0; j < nComps; ++j) {
+         p->color[0][0].c[j] = patchesA[nPatchesA-1].color[0][1].c[j];
+         p->color[0][1].c[j] = patchesA[nPatchesA-1].color[1][1].c[j];
+         p->color[1][1].c[j] = c[0][j];
+         p->color[1][0].c[j] = c[1][j];
+       }
+       break;
+      case 2:
+       if (nPatchesA == 0) {
+         goto err1;
+       }
+       p->x[0][0] = patchesA[nPatchesA-1].x[3][3];
+       p->y[0][0] = patchesA[nPatchesA-1].y[3][3];
+       p->x[0][1] = patchesA[nPatchesA-1].x[3][2];
+       p->y[0][1] = patchesA[nPatchesA-1].y[3][2];
+       p->x[0][2] = patchesA[nPatchesA-1].x[3][1];
+       p->y[0][2] = patchesA[nPatchesA-1].y[3][1];
+       p->x[0][3] = patchesA[nPatchesA-1].x[3][0];
+       p->y[0][3] = patchesA[nPatchesA-1].y[3][0];
+       p->x[1][3] = x[0];
+       p->y[1][3] = y[0];
+       p->x[2][3] = x[1];
+       p->y[2][3] = y[1];
+       p->x[3][3] = x[2];
+       p->y[3][3] = y[2];
+       p->x[3][2] = x[3];
+       p->y[3][2] = y[3];
+       p->x[3][1] = x[4];
+       p->y[3][1] = y[4];
+       p->x[3][0] = x[5];
+       p->y[3][0] = y[5];
+       p->x[2][0] = x[6];
+       p->y[2][0] = y[6];
+       p->x[1][0] = x[7];
+       p->y[1][0] = y[7];
+       p->x[1][1] = x[8];
+       p->y[1][1] = y[8];
+       p->x[1][2] = x[9];
+       p->y[1][2] = y[9];
+       p->x[2][2] = x[10];
+       p->y[2][2] = y[10];
+       p->x[2][1] = x[11];
+       p->y[2][1] = y[11];
+       for (j = 0; j < nComps; ++j) {
+         p->color[0][0].c[j] = patchesA[nPatchesA-1].color[1][1].c[j];
+         p->color[0][1].c[j] = patchesA[nPatchesA-1].color[1][0].c[j];
+         p->color[1][1].c[j] = c[0][j];
+         p->color[1][0].c[j] = c[1][j];
+       }
+       break;
+      case 3:
+       if (nPatchesA == 0) {
+         goto err1;
+       }
+       p->x[0][0] = patchesA[nPatchesA-1].x[3][0];
+       p->y[0][0] = patchesA[nPatchesA-1].y[3][0];
+       p->x[0][1] = patchesA[nPatchesA-1].x[2][0];
+       p->y[0][1] = patchesA[nPatchesA-1].y[2][0];
+       p->x[0][2] = patchesA[nPatchesA-1].x[1][0];
+       p->y[0][2] = patchesA[nPatchesA-1].y[1][0];
+       p->x[0][3] = patchesA[nPatchesA-1].x[0][0];
+       p->y[0][3] = patchesA[nPatchesA-1].y[0][0];
+       p->x[1][3] = x[0];
+       p->y[1][3] = y[0];
+       p->x[2][3] = x[1];
+       p->y[2][3] = y[1];
+       p->x[3][3] = x[2];
+       p->y[3][3] = y[2];
+       p->x[3][2] = x[3];
+       p->y[3][2] = y[3];
+       p->x[3][1] = x[4];
+       p->y[3][1] = y[4];
+       p->x[3][0] = x[5];
+       p->y[3][0] = y[5];
+       p->x[2][0] = x[6];
+       p->y[2][0] = y[6];
+       p->x[1][0] = x[7];
+       p->y[1][0] = y[7];
+       p->x[1][1] = x[8];
+       p->y[1][1] = y[8];
+       p->x[1][2] = x[9];
+       p->y[1][2] = y[9];
+       p->x[2][2] = x[10];
+       p->y[2][2] = y[10];
+       p->x[2][1] = x[11];
+       p->y[2][1] = y[11];
+       for (j = 0; j < nComps; ++j) {
+         p->color[0][0].c[j] = patchesA[nPatchesA-1].color[1][0].c[j];
+         p->color[0][1].c[j] = patchesA[nPatchesA-1].color[0][0].c[j];
+         p->color[1][1].c[j] = c[0][j];
+         p->color[1][0].c[j] = c[1][j];
+       }
+       break;
+      }
+    }
+    ++nPatchesA;
+    bitBuf->flushBits();
+  }
+  delete bitBuf;
+
+  if (typeA == 6) {
+    for (i = 0; i < nPatchesA; ++i) {
+      p = &patchesA[i];
+      p->x[1][1] = (-4 * p->x[0][0]
+                   +6 * (p->x[0][1] + p->x[1][0])
+                   -2 * (p->x[0][3] + p->x[3][0])
+                   +3 * (p->x[3][1] + p->x[1][3])
+                   - p->x[3][3]) / 9;
+      p->y[1][1] = (-4 * p->y[0][0]
+                   +6 * (p->y[0][1] + p->y[1][0])
+                   -2 * (p->y[0][3] + p->y[3][0])
+                   +3 * (p->y[3][1] + p->y[1][3])
+                   - p->y[3][3]) / 9;
+      p->x[1][2] = (-4 * p->x[0][3]
+                   +6 * (p->x[0][2] + p->x[1][3])
+                   -2 * (p->x[0][0] + p->x[3][3])
+                   +3 * (p->x[3][2] + p->x[1][0])
+                   - p->x[3][0]) / 9;
+      p->y[1][2] = (-4 * p->y[0][3]
+                   +6 * (p->y[0][2] + p->y[1][3])
+                   -2 * (p->y[0][0] + p->y[3][3])
+                   +3 * (p->y[3][2] + p->y[1][0])
+                   - p->y[3][0]) / 9;
+      p->x[2][1] = (-4 * p->x[3][0]
+                   +6 * (p->x[3][1] + p->x[2][0])
+                   -2 * (p->x[3][3] + p->x[0][0])
+                   +3 * (p->x[0][1] + p->x[2][3])
+                   - p->x[0][3]) / 9;
+      p->y[2][1] = (-4 * p->y[3][0]
+                   +6 * (p->y[3][1] + p->y[2][0])
+                   -2 * (p->y[3][3] + p->y[0][0])
+                   +3 * (p->y[0][1] + p->y[2][3])
+                   - p->y[0][3]) / 9;
+      p->x[2][2] = (-4 * p->x[3][3]
+                   +6 * (p->x[3][2] + p->x[2][3])
+                   -2 * (p->x[3][0] + p->x[0][3])
+                   +3 * (p->x[0][2] + p->x[2][0])
+                   - p->x[0][0]) / 9;
+      p->y[2][2] = (-4 * p->y[3][3]
+                   +6 * (p->y[3][2] + p->y[2][3])
+                   -2 * (p->y[3][0] + p->y[0][3])
+                   +3 * (p->y[0][2] + p->y[2][0])
+                   - p->y[0][0]) / 9;
+    }
+  }
+
+  shading = new GfxPatchMeshShading(typeA, patchesA, nPatchesA,
+                                   funcsA, nFuncsA);
+  if (!shading->init(dict, gfx)) {
+    delete shading;
+    return NULL;
+  }
+  return shading;
+
+ err2:
+  obj1.free();
+ err1:
+  return NULL;
+}
+
+void GfxPatchMeshShading::getParameterizedColor(double t, GfxColor *color) {
+  double out[gfxColorMaxComps];
+
+  for (int j = 0; j < nFuncs; ++j) {
+    funcs[j]->transform(&t, &out[j]);
+  }
+  for (int j = 0; j < gfxColorMaxComps; ++j) {
+    color->c[j] = dblToCol(out[j]);
+  }
+}
+
+GfxShading *GfxPatchMeshShading::copy() {
+  return new GfxPatchMeshShading(this);
+}
+
+//------------------------------------------------------------------------
+// GfxImageColorMap
+//------------------------------------------------------------------------
+
+GfxImageColorMap::GfxImageColorMap(int bitsA, Object *decode,
+                                  GfxColorSpace *colorSpaceA) {
+  GfxIndexedColorSpace *indexedCS;
+  GfxSeparationColorSpace *sepCS;
+  int maxPixel, indexHigh;
+  Guchar *indexedLookup;
+  Function *sepFunc;
+  Object obj;
+  double x[gfxColorMaxComps];
+  double y[gfxColorMaxComps];
+  int i, j, k;
+  double mapped;
+  GBool useByteLookup;
+
+  ok = gTrue;
+
+  // bits per component and color space
+  bits = bitsA;
+  maxPixel = (1 << bits) - 1;
+  colorSpace = colorSpaceA;
+
+  // this is a hack to support 16 bits images, everywhere
+  // we assume a component fits in 8 bits, with this hack
+  // we treat 16 bit images as 8 bit ones until it's fixed correctly.
+  // The hack has another part on ImageStream::getLine
+  if (maxPixel > 255) maxPixel = 255;
+
+  // initialize
+  for (k = 0; k < gfxColorMaxComps; ++k) {
+    lookup[k] = NULL;
+    lookup2[k] = NULL;
+  }
+  byte_lookup = NULL;
+
+  // get decode map
+  if (decode->isNull()) {
+    nComps = colorSpace->getNComps();
+    colorSpace->getDefaultRanges(decodeLow, decodeRange, maxPixel);
+  } else if (decode->isArray()) {
+    nComps = decode->arrayGetLength() / 2;
+    if (nComps < colorSpace->getNComps()) {
+      goto err1;
+    }
+    if (nComps > colorSpace->getNComps()) {
+      error(errSyntaxWarning, -1, "Too many elements in Decode array");
+      nComps = colorSpace->getNComps();
+    }
+    for (i = 0; i < nComps; ++i) {
+      decode->arrayGet(2*i, &obj);
+      if (!obj.isNum()) {
+       goto err2;
+      }
+      decodeLow[i] = obj.getNum();
+      obj.free();
+      decode->arrayGet(2*i+1, &obj);
+      if (!obj.isNum()) {
+       goto err2;
+      }
+      decodeRange[i] = obj.getNum() - decodeLow[i];
+      obj.free();
+    }
+  } else {
+    goto err1;
+  }
+
+  // Construct a lookup table -- this stores pre-computed decoded
+  // values for each component, i.e., the result of applying the
+  // decode mapping to each possible image pixel component value.
+  for (k = 0; k < nComps; ++k) {
+    lookup[k] = (GfxColorComp *)gmallocn(maxPixel + 1,
+                                        sizeof(GfxColorComp));
+    for (i = 0; i <= maxPixel; ++i) {
+      lookup[k][i] = dblToCol(decodeLow[k] +
+                             (i * decodeRange[k]) / maxPixel);
+    }
+  }
+
+  // Optimization: for Indexed and Separation color spaces (which have
+  // only one component), we pre-compute a second lookup table with
+  // color values
+  colorSpace2 = NULL;
+  nComps2 = 0;
+  useByteLookup = gFalse;
+  switch (colorSpace->getMode()) {
+  case csIndexed:
+    // Note that indexHigh may not be the same as maxPixel --
+    // Distiller will remove unused palette entries, resulting in
+    // indexHigh < maxPixel.
+    indexedCS = (GfxIndexedColorSpace *)colorSpace;
+    colorSpace2 = indexedCS->getBase();
+    indexHigh = indexedCS->getIndexHigh();
+    nComps2 = colorSpace2->getNComps();
+    indexedLookup = indexedCS->getLookup();
+    colorSpace2->getDefaultRanges(x, y, indexHigh);
+    if (colorSpace2->useGetGrayLine() || colorSpace2->useGetRGBLine()) {
+      byte_lookup = (Guchar *)gmallocn ((maxPixel + 1), nComps2);
+      useByteLookup = gTrue;
+    }
+    for (k = 0; k < nComps2; ++k) {
+      lookup2[k] = (GfxColorComp *)gmallocn(maxPixel + 1,
+                                          sizeof(GfxColorComp));
+      for (i = 0; i <= maxPixel; ++i) {
+       j = (int)(decodeLow[0] + (i * decodeRange[0]) / maxPixel + 0.5);
+       if (j < 0) {
+         j = 0;
+       } else if (j > indexHigh) {
+         j = indexHigh;
+       }
+
+       mapped = x[k] + (indexedLookup[j*nComps2 + k] / 255.0) * y[k];
+       lookup2[k][i] = dblToCol(mapped);
+       if (useByteLookup)
+         byte_lookup[i * nComps2 + k] = (Guchar) (mapped * 255);
+      }
+    }
+    break;
+  case csSeparation:
+    sepCS = (GfxSeparationColorSpace *)colorSpace;
+    colorSpace2 = sepCS->getAlt();
+    nComps2 = colorSpace2->getNComps();
+    sepFunc = sepCS->getFunc();
+    if (colorSpace2->useGetGrayLine() || colorSpace2->useGetRGBLine()) {
+      byte_lookup = (Guchar *)gmallocn ((maxPixel + 1), nComps2);
+      useByteLookup = gTrue;
+    }
+    for (k = 0; k < nComps2; ++k) {
+      lookup2[k] = (GfxColorComp *)gmallocn(maxPixel + 1,
+                                          sizeof(GfxColorComp));
+      for (i = 0; i <= maxPixel; ++i) {
+       x[0] = decodeLow[0] + (i * decodeRange[0]) / maxPixel;
+       sepFunc->transform(x, y);
+       lookup2[k][i] = dblToCol(y[k]);
+       if (useByteLookup)
+         byte_lookup[i*nComps2 + k] = (Guchar) (y[k] * 255);
+      }
+    }
+    break;
+  default:
+    if (colorSpace->useGetGrayLine() || colorSpace->useGetRGBLine()) {
+      byte_lookup = (Guchar *)gmallocn ((maxPixel + 1), nComps);
+      useByteLookup = gTrue;
+    }
+    for (k = 0; k < nComps; ++k) {
+      lookup2[k] = (GfxColorComp *)gmallocn(maxPixel + 1,
+                                          sizeof(GfxColorComp));
+      for (i = 0; i <= maxPixel; ++i) {
+       mapped = decodeLow[k] + (i * decodeRange[k]) / maxPixel;
+       lookup2[k][i] = dblToCol(mapped);
+       if (useByteLookup) {
+         int byte;
+
+         byte = (int) (mapped * 255.0 + 0.5);
+         if (byte < 0)
+           byte = 0;
+         else if (byte > 255)
+           byte = 255;
+         byte_lookup[i * nComps + k] = byte;
+       }
+      }
+    }
+  }
+
+  return;
+
+ err2:
+  obj.free();
+ err1:
+  ok = gFalse;
+}
+
+GfxImageColorMap::GfxImageColorMap(GfxImageColorMap *colorMap) {
+  int n, i, k;
+
+  colorSpace = colorMap->colorSpace->copy();
+  bits = colorMap->bits;
+  nComps = colorMap->nComps;
+  nComps2 = colorMap->nComps2;
+  colorSpace2 = NULL;
+  for (k = 0; k < gfxColorMaxComps; ++k) {
+    lookup[k] = NULL;
+  }
+  n = 1 << bits;
+  if (colorSpace->getMode() == csIndexed) {
+    colorSpace2 = ((GfxIndexedColorSpace *)colorSpace)->getBase();
+    for (k = 0; k < nComps2; ++k) {
+      lookup[k] = (GfxColorComp *)gmallocn(n, sizeof(GfxColorComp));
+      memcpy(lookup[k], colorMap->lookup[k], n * sizeof(GfxColorComp));
+    }
+  } else if (colorSpace->getMode() == csSeparation) {
+    colorSpace2 = ((GfxSeparationColorSpace *)colorSpace)->getAlt();
+    for (k = 0; k < nComps2; ++k) {
+      lookup[k] = (GfxColorComp *)gmallocn(n, sizeof(GfxColorComp));
+      memcpy(lookup[k], colorMap->lookup[k], n * sizeof(GfxColorComp));
+    }
+  } else {
+    for (k = 0; k < nComps; ++k) {
+      lookup[k] = (GfxColorComp *)gmallocn(n, sizeof(GfxColorComp));
+      memcpy(lookup[k], colorMap->lookup[k], n * sizeof(GfxColorComp));
+    }
+  }
+  if (colorMap->byte_lookup) {
+    int nc = colorSpace2 ? nComps2 : nComps;
+
+    byte_lookup = (Guchar *)gmallocn (n, nc);
+    memcpy(byte_lookup, colorMap->byte_lookup, n * nc);
+  }
+  for (i = 0; i < nComps; ++i) {
+    decodeLow[i] = colorMap->decodeLow[i];
+    decodeRange[i] = colorMap->decodeRange[i];
+  }
+  ok = gTrue;
+}
+
+GfxImageColorMap::~GfxImageColorMap() {
+  int i;
+
+  delete colorSpace;
+  for (i = 0; i < gfxColorMaxComps; ++i) {
+    gfree(lookup[i]);
+    gfree(lookup2[i]);
+  }
+  gfree(byte_lookup);
+}
+
+void GfxImageColorMap::getGray(Guchar *x, GfxGray *gray) {
+  GfxColor color;
+  int i;
+
+  if (colorSpace2) {
+    for (i = 0; i < nComps2; ++i) {
+      color.c[i] = lookup2[i][x[0]];
+    }
+    colorSpace2->getGray(&color, gray);
+  } else {
+    for (i = 0; i < nComps; ++i) {
+      color.c[i] = lookup2[i][x[i]];
+    }
+    colorSpace->getGray(&color, gray);
+  }
+}
+
+void GfxImageColorMap::getRGB(Guchar *x, GfxRGB *rgb) {
+  GfxColor color;
+  int i;
+
+  if (colorSpace2) {
+    for (i = 0; i < nComps2; ++i) {
+      color.c[i] = lookup2[i][x[0]];
+    }
+    colorSpace2->getRGB(&color, rgb);
+  } else {
+    for (i = 0; i < nComps; ++i) {
+      color.c[i] = lookup2[i][x[i]];
+    }
+    colorSpace->getRGB(&color, rgb);
+  }
+}
+
+void GfxImageColorMap::getGrayLine(Guchar *in, Guchar *out, int length) {
+  int i, j;
+  Guchar *inp, *tmp_line;
+
+  if ((colorSpace2 && !colorSpace2->useGetGrayLine ()) ||
+      (!colorSpace2 && !colorSpace->useGetGrayLine ())) {
+    GfxGray gray;
+
+    inp = in;
+    for (i = 0; i < length; i++) {
+      getGray (inp, &gray);
+      out[i] = colToByte(gray);
+      inp += nComps;
+    }
+    return;
+  }
+
+  switch (colorSpace->getMode()) {
+  case csIndexed:
+  case csSeparation:
+    tmp_line = (Guchar *) gmallocn (length, nComps2);
+    for (i = 0; i < length; i++) {
+      for (j = 0; j < nComps2; j++) {
+       tmp_line[i * nComps2 + j] = byte_lookup[in[i] * nComps2 + j];
+      }
+    }
+    colorSpace2->getGrayLine(tmp_line, out, length);
+    gfree (tmp_line);
+    break;
+
+  default:
+    inp = in;
+    for (j = 0; j < length; j++)
+      for (i = 0; i < nComps; i++) {
+       *inp = byte_lookup[*inp * nComps + i];
+       inp++;
+      }
+    colorSpace->getGrayLine(in, out, length);
+    break;
+  }
+
+}
+
+void GfxImageColorMap::getRGBLine(Guchar *in, unsigned int *out, int length) {
+  int i, j;
+  Guchar *inp, *tmp_line;
+
+  if (!useRGBLine()) {
+    GfxRGB rgb;
+
+    inp = in;
+    for (i = 0; i < length; i++) {
+      getRGB (inp, &rgb);
+      out[i] =
+          ((int) colToByte(rgb.r) << 16) |
+          ((int) colToByte(rgb.g) << 8) |
+         ((int) colToByte(rgb.b) << 0);
+      inp += nComps;
+    }
+    return;
+  }
+
+  switch (colorSpace->getMode()) {
+  case csIndexed:
+  case csSeparation:
+    tmp_line = (Guchar *) gmallocn (length, nComps2);
+    for (i = 0; i < length; i++) {
+      for (j = 0; j < nComps2; j++) {
+       tmp_line[i * nComps2 + j] = byte_lookup[in[i] * nComps2 + j];
+      }
+    }
+    colorSpace2->getRGBLine(tmp_line, out, length);
+    gfree (tmp_line);
+    break;
+
+  default:
+    inp = in;
+    for (j = 0; j < length; j++)
+      for (i = 0; i < nComps; i++) {
+       *inp = byte_lookup[*inp * nComps + i];
+       inp++;
+      }
+    colorSpace->getRGBLine(in, out, length);
+    break;
+  }
+
+}
+
+void GfxImageColorMap::getRGBLine(Guchar *in, Guchar *out, int length) {
+  int i, j;
+  Guchar *inp, *tmp_line;
+
+  if (!useRGBLine()) {
+    GfxRGB rgb;
+
+    inp = in;
+    for (i = 0; i < length; i++) {
+      getRGB (inp, &rgb);
+      *out++ = colToByte(rgb.r);
+      *out++ = colToByte(rgb.g);
+      *out++ = colToByte(rgb.b);
+      inp += nComps;
+    }
+    return;
+  }
+
+  switch (colorSpace->getMode()) {
+  case csIndexed:
+  case csSeparation:
+    tmp_line = (Guchar *) gmallocn (length, nComps2);
+    for (i = 0; i < length; i++) {
+      for (j = 0; j < nComps2; j++) {
+       tmp_line[i * nComps2 + j] = byte_lookup[in[i] * nComps2 + j];
+      }
+    }
+    colorSpace2->getRGBLine(tmp_line, out, length);
+    gfree (tmp_line);
+    break;
+
+  default:
+    inp = in;
+    for (j = 0; j < length; j++)
+      for (i = 0; i < nComps; i++) {
+       *inp = byte_lookup[*inp * nComps + i];
+       inp++;
+      }
+    colorSpace->getRGBLine(in, out, length);
+    break;
+  }
+
+}
+
+void GfxImageColorMap::getRGBXLine(Guchar *in, Guchar *out, int length) {
+  int i, j;
+  Guchar *inp, *tmp_line;
+
+  if (!useRGBLine()) {
+    GfxRGB rgb;
+
+    inp = in;
+    for (i = 0; i < length; i++) {
+      getRGB (inp, &rgb);
+      *out++ = colToByte(rgb.r);
+      *out++ = colToByte(rgb.g);
+      *out++ = colToByte(rgb.b);
+      *out++ = 255;
+      inp += nComps;
+    }
+    return;
+  }
+
+  switch (colorSpace->getMode()) {
+  case csIndexed:
+  case csSeparation:
+    tmp_line = (Guchar *) gmallocn (length, nComps2);
+    for (i = 0; i < length; i++) {
+      for (j = 0; j < nComps2; j++) {
+       tmp_line[i * nComps2 + j] = byte_lookup[in[i] * nComps2 + j];
+      }
+    }
+    colorSpace2->getRGBXLine(tmp_line, out, length);
+    gfree (tmp_line);
+    break;
+
+  default:
+    inp = in;
+    for (j = 0; j < length; j++)
+      for (i = 0; i < nComps; i++) {
+       *inp = byte_lookup[*inp * nComps + i];
+       inp++;
+      }
+    colorSpace->getRGBXLine(in, out, length);
+    break;
+  }
+
+}
+
+void GfxImageColorMap::getCMYK(Guchar *x, GfxCMYK *cmyk) {
+  GfxColor color;
+  int i;
+
+  if (colorSpace2) {
+    for (i = 0; i < nComps2; ++i) {
+      color.c[i] = lookup2[i][x[0]];
+    }
+    colorSpace2->getCMYK(&color, cmyk);
+  } else {
+    for (i = 0; i < nComps; ++i) {
+      color.c[i] = lookup[i][x[i]];
+    }
+    colorSpace->getCMYK(&color, cmyk);
+  }
+}
+
+void GfxImageColorMap::getColor(Guchar *x, GfxColor *color) {
+  int maxPixel, i;
+
+  maxPixel = (1 << bits) - 1;
+  for (i = 0; i < nComps; ++i) {
+    color->c[i] = dblToCol(decodeLow[i] + (x[i] * decodeRange[i]) / maxPixel);
+  }
+}
+
+//------------------------------------------------------------------------
+// GfxSubpath and GfxPath
+//------------------------------------------------------------------------
+
+GfxSubpath::GfxSubpath(double x1, double y1) {
+  size = 16;
+  x = (double *)gmallocn(size, sizeof(double));
+  y = (double *)gmallocn(size, sizeof(double));
+  curve = (GBool *)gmallocn(size, sizeof(GBool));
+  n = 1;
+  x[0] = x1;
+  y[0] = y1;
+  curve[0] = gFalse;
+  closed = gFalse;
+}
+
+GfxSubpath::~GfxSubpath() {
+  gfree(x);
+  gfree(y);
+  gfree(curve);
+}
+
+// Used for copy().
+GfxSubpath::GfxSubpath(GfxSubpath *subpath) {
+  size = subpath->size;
+  n = subpath->n;
+  x = (double *)gmallocn(size, sizeof(double));
+  y = (double *)gmallocn(size, sizeof(double));
+  curve = (GBool *)gmallocn(size, sizeof(GBool));
+  memcpy(x, subpath->x, n * sizeof(double));
+  memcpy(y, subpath->y, n * sizeof(double));
+  memcpy(curve, subpath->curve, n * sizeof(GBool));
+  closed = subpath->closed;
+}
+
+void GfxSubpath::lineTo(double x1, double y1) {
+  if (n >= size) {
+    size *= 2;
+    x = (double *)greallocn(x, size, sizeof(double));
+    y = (double *)greallocn(y, size, sizeof(double));
+    curve = (GBool *)greallocn(curve, size, sizeof(GBool));
+  }
+  x[n] = x1;
+  y[n] = y1;
+  curve[n] = gFalse;
+  ++n;
+}
+
+void GfxSubpath::curveTo(double x1, double y1, double x2, double y2,
+                        double x3, double y3) {
+  if (n+3 > size) {
+    size *= 2;
+    x = (double *)greallocn(x, size, sizeof(double));
+    y = (double *)greallocn(y, size, sizeof(double));
+    curve = (GBool *)greallocn(curve, size, sizeof(GBool));
+  }
+  x[n] = x1;
+  y[n] = y1;
+  x[n+1] = x2;
+  y[n+1] = y2;
+  x[n+2] = x3;
+  y[n+2] = y3;
+  curve[n] = curve[n+1] = gTrue;
+  curve[n+2] = gFalse;
+  n += 3;
+}
+
+void GfxSubpath::close() {
+  if (x[n-1] != x[0] || y[n-1] != y[0]) {
+    lineTo(x[0], y[0]);
+  }
+  closed = gTrue;
+}
+
+void GfxSubpath::offset(double dx, double dy) {
+  int i;
+
+  for (i = 0; i < n; ++i) {
+    x[i] += dx;
+    y[i] += dy;
+  }
+}
+
+GfxPath::GfxPath() {
+  justMoved = gFalse;
+  size = 16;
+  n = 0;
+  firstX = firstY = 0;
+  subpaths = (GfxSubpath **)gmallocn(size, sizeof(GfxSubpath *));
+}
+
+GfxPath::~GfxPath() {
+  int i;
+
+  for (i = 0; i < n; ++i)
+    delete subpaths[i];
+  gfree(subpaths);
+}
+
+// Used for copy().
+GfxPath::GfxPath(GBool justMoved1, double firstX1, double firstY1,
+                GfxSubpath **subpaths1, int n1, int size1) {
+  int i;
+
+  justMoved = justMoved1;
+  firstX = firstX1;
+  firstY = firstY1;
+  size = size1;
+  n = n1;
+  subpaths = (GfxSubpath **)gmallocn(size, sizeof(GfxSubpath *));
+  for (i = 0; i < n; ++i)
+    subpaths[i] = subpaths1[i]->copy();
+}
+
+void GfxPath::moveTo(double x, double y) {
+  justMoved = gTrue;
+  firstX = x;
+  firstY = y;
+}
+
+void GfxPath::lineTo(double x, double y) {
+  if (justMoved || (n > 0 && subpaths[n-1]->isClosed())) {
+    if (n >= size) {
+      size *= 2;
+      subpaths = (GfxSubpath **)
+                  greallocn(subpaths, size, sizeof(GfxSubpath *));
+    }
+    if (justMoved) {
+      subpaths[n] = new GfxSubpath(firstX, firstY);
+    } else {
+      subpaths[n] = new GfxSubpath(subpaths[n-1]->getLastX(),
+                                  subpaths[n-1]->getLastY());
+    }
+    ++n;
+    justMoved = gFalse;
+  }
+  subpaths[n-1]->lineTo(x, y);
+}
+
+void GfxPath::curveTo(double x1, double y1, double x2, double y2,
+            double x3, double y3) {
+  if (justMoved || (n > 0 && subpaths[n-1]->isClosed())) {
+    if (n >= size) {
+      size *= 2;
+      subpaths = (GfxSubpath **) 
+                greallocn(subpaths, size, sizeof(GfxSubpath *));
+    }
+    if (justMoved) {
+      subpaths[n] = new GfxSubpath(firstX, firstY);
+    } else {
+      subpaths[n] = new GfxSubpath(subpaths[n-1]->getLastX(),
+                                  subpaths[n-1]->getLastY());
+    }
+    ++n;
+    justMoved = gFalse;
+  }
+  subpaths[n-1]->curveTo(x1, y1, x2, y2, x3, y3);
+}
+
+void GfxPath::close() {
+  // this is necessary to handle the pathological case of
+  // moveto/closepath/clip, which defines an empty clipping region
+  if (justMoved) {
+    if (n >= size) {
+      size *= 2;
+      subpaths = (GfxSubpath **)
+       greallocn(subpaths, size, sizeof(GfxSubpath *));
+    }
+    subpaths[n] = new GfxSubpath(firstX, firstY);
+    ++n;
+    justMoved = gFalse;
+  }
+  subpaths[n-1]->close();
+}
+
+void GfxPath::append(GfxPath *path) {
+  int i;
+
+  if (n + path->n > size) {
+    size = n + path->n;
+    subpaths = (GfxSubpath **)
+                 greallocn(subpaths, size, sizeof(GfxSubpath *));
+  }
+  for (i = 0; i < path->n; ++i) {
+    subpaths[n++] = path->subpaths[i]->copy();
+  }
+  justMoved = gFalse;
+}
+
+void GfxPath::offset(double dx, double dy) {
+  int i;
+
+  for (i = 0; i < n; ++i) {
+    subpaths[i]->offset(dx, dy);
+  }
+}
+
+//------------------------------------------------------------------------
+// GfxState
+//------------------------------------------------------------------------
+GfxState::ReusablePathIterator::ReusablePathIterator(GfxPath *path)
+ : path(path),
+   subPathOff(0),
+   coordOff(0),
+   numCoords(0),
+   curSubPath(NULL)
+{
+  if( path->getNumSubpaths() ) {
+    curSubPath = path->getSubpath(subPathOff);
+    numCoords = curSubPath->getNumPoints();
+  }
+}
+
+bool GfxState::ReusablePathIterator::isEnd() const {
+   return coordOff >= numCoords;
+}
+
+void GfxState::ReusablePathIterator::next() {
+  ++coordOff;
+  if (coordOff == numCoords) {
+    ++subPathOff;
+    if (subPathOff < path->getNumSubpaths()) {
+      coordOff = 0;
+      curSubPath = path->getSubpath(subPathOff);
+      numCoords = curSubPath->getNumPoints();
+    }
+  }
+}
+
+void GfxState::ReusablePathIterator::setCoord(double x, double y) {
+  curSubPath->setX(coordOff, x);
+  curSubPath->setY(coordOff, y);
+}
+
+void GfxState::ReusablePathIterator::reset() {
+  coordOff = 0;
+  subPathOff = 0;
+  curSubPath = path->getSubpath(0);
+  numCoords = curSubPath->getNumPoints();
+}
+
+GfxState::GfxState(double hDPIA, double vDPIA, PDFRectangle *pageBox,
+                  int rotateA, GBool upsideDown) {
+  double kx, ky;
+
+  hDPI = hDPIA;
+  vDPI = vDPIA;
+  rotate = rotateA;
+  px1 = pageBox->x1;
+  py1 = pageBox->y1;
+  px2 = pageBox->x2;
+  py2 = pageBox->y2;
+  kx = hDPI / 72.0;
+  ky = vDPI / 72.0;
+  if (rotate == 90) {
+    ctm[0] = 0;
+    ctm[1] = upsideDown ? ky : -ky;
+    ctm[2] = kx;
+    ctm[3] = 0;
+    ctm[4] = -kx * py1;
+    ctm[5] = ky * (upsideDown ? -px1 : px2);
+    pageWidth = kx * (py2 - py1);
+    pageHeight = ky * (px2 - px1);
+  } else if (rotate == 180) {
+    ctm[0] = -kx;
+    ctm[1] = 0;
+    ctm[2] = 0;
+    ctm[3] = upsideDown ? ky : -ky;
+    ctm[4] = kx * px2;
+    ctm[5] = ky * (upsideDown ? -py1 : py2);
+    pageWidth = kx * (px2 - px1);
+    pageHeight = ky * (py2 - py1);
+  } else if (rotate == 270) {
+    ctm[0] = 0;
+    ctm[1] = upsideDown ? -ky : ky;
+    ctm[2] = -kx;
+    ctm[3] = 0;
+    ctm[4] = kx * py2;
+    ctm[5] = ky * (upsideDown ? px2 : -px1);
+    pageWidth = kx * (py2 - py1);
+    pageHeight = ky * (px2 - px1);
+  } else {
+    ctm[0] = kx;
+    ctm[1] = 0;
+    ctm[2] = 0;
+    ctm[3] = upsideDown ? -ky : ky;
+    ctm[4] = -kx * px1;
+    ctm[5] = ky * (upsideDown ? py2 : -py1);
+    pageWidth = kx * (px2 - px1);
+    pageHeight = ky * (py2 - py1);
+  }
+
+  fillColorSpace = new GfxDeviceGrayColorSpace();
+  strokeColorSpace = new GfxDeviceGrayColorSpace();
+  fillColor.c[0] = 0;
+  strokeColor.c[0] = 0;
+  fillPattern = NULL;
+  strokePattern = NULL;
+  blendMode = gfxBlendNormal;
+  fillOpacity = 1;
+  strokeOpacity = 1;
+  fillOverprint = gFalse;
+  strokeOverprint = gFalse;
+  overprintMode = 0;
+  transfer[0] = transfer[1] = transfer[2] = transfer[3] = NULL;
+
+  lineWidth = 1;
+  lineDash = NULL;
+  lineDashLength = 0;
+  lineDashStart = 0;
+  flatness = 1;
+  lineJoin = 0;
+  lineCap = 0;
+  miterLimit = 10;
+  strokeAdjust = gFalse;
+  alphaIsShape = gFalse;
+  textKnockout = gFalse;
+
+  font = NULL;
+  fontSize = 0;
+  textMat[0] = 1; textMat[1] = 0;
+  textMat[2] = 0; textMat[3] = 1;
+  textMat[4] = 0; textMat[5] = 0;
+  charSpace = 0;
+  wordSpace = 0;
+  horizScaling = 1;
+  leading = 0;
+  rise = 0;
+  render = 0;
+
+  path = new GfxPath();
+  curX = curY = 0;
+  lineX = lineY = 0;
+
+  clipXMin = 0;
+  clipYMin = 0;
+  clipXMax = pageWidth;
+  clipYMax = pageHeight;
+
+  saved = NULL;
+#ifdef USE_CMS
+  GfxColorSpace::setupColorProfiles();
+#endif
+}
+
+GfxState::~GfxState() {
+  int i;
+
+  if (fillColorSpace) {
+    delete fillColorSpace;
+  }
+  if (strokeColorSpace) {
+    delete strokeColorSpace;
+  }
+  if (fillPattern) {
+    delete fillPattern;
+  }
+  if (strokePattern) {
+    delete strokePattern;
+  }
+  for (i = 0; i < 4; ++i) {
+    if (transfer[i]) {
+      delete transfer[i];
+    }
+  }
+  gfree(lineDash);
+  if (path) {
+    // this gets set to NULL by restore()
+    delete path;
+  }
+  if (font) {
+    font->decRefCnt();
+  }
+}
+
+// Used for copy();
+GfxState::GfxState(GfxState *state, GBool copyPath) {
+  int i;
+
+  memcpy(this, state, sizeof(GfxState));
+  if (fillColorSpace) {
+    fillColorSpace = state->fillColorSpace->copy();
+  }
+  if (strokeColorSpace) {
+    strokeColorSpace = state->strokeColorSpace->copy();
+  }
+  if (fillPattern) {
+    fillPattern = state->fillPattern->copy();
+  }
+  if (strokePattern) {
+    strokePattern = state->strokePattern->copy();
+  }
+  for (i = 0; i < 4; ++i) {
+    if (transfer[i]) {
+      transfer[i] = state->transfer[i]->copy();
+    }
+  }
+  if (lineDashLength > 0) {
+    lineDash = (double *)gmallocn(lineDashLength, sizeof(double));
+    memcpy(lineDash, state->lineDash, lineDashLength * sizeof(double));
+  }
+  if (font)
+    font->incRefCnt();
+
+  if (copyPath) {
+    path = state->path->copy();
+  }
+  saved = NULL;
+}
+
+void GfxState::setPath(GfxPath *pathA) {
+  delete path;
+  path = pathA;
+}
+
+void GfxState::getUserClipBBox(double *xMin, double *yMin,
+                              double *xMax, double *yMax) {
+  double ictm[6];
+  double xMin1, yMin1, xMax1, yMax1, det, tx, ty;
+
+  // invert the CTM
+  det = 1 / (ctm[0] * ctm[3] - ctm[1] * ctm[2]);
+  ictm[0] = ctm[3] * det;
+  ictm[1] = -ctm[1] * det;
+  ictm[2] = -ctm[2] * det;
+  ictm[3] = ctm[0] * det;
+  ictm[4] = (ctm[2] * ctm[5] - ctm[3] * ctm[4]) * det;
+  ictm[5] = (ctm[1] * ctm[4] - ctm[0] * ctm[5]) * det;
+
+  // transform all four corners of the clip bbox; find the min and max
+  // x and y values
+  xMin1 = xMax1 = clipXMin * ictm[0] + clipYMin * ictm[2] + ictm[4];
+  yMin1 = yMax1 = clipXMin * ictm[1] + clipYMin * ictm[3] + ictm[5];
+  tx = clipXMin * ictm[0] + clipYMax * ictm[2] + ictm[4];
+  ty = clipXMin * ictm[1] + clipYMax * ictm[3] + ictm[5];
+  if (tx < xMin1) {
+    xMin1 = tx;
+  } else if (tx > xMax1) {
+    xMax1 = tx;
+  }
+  if (ty < yMin1) {
+    yMin1 = ty;
+  } else if (ty > yMax1) {
+    yMax1 = ty;
+  }
+  tx = clipXMax * ictm[0] + clipYMin * ictm[2] + ictm[4];
+  ty = clipXMax * ictm[1] + clipYMin * ictm[3] + ictm[5];
+  if (tx < xMin1) {
+    xMin1 = tx;
+  } else if (tx > xMax1) {
+    xMax1 = tx;
+  }
+  if (ty < yMin1) {
+    yMin1 = ty;
+  } else if (ty > yMax1) {
+    yMax1 = ty;
+  }
+  tx = clipXMax * ictm[0] + clipYMax * ictm[2] + ictm[4];
+  ty = clipXMax * ictm[1] + clipYMax * ictm[3] + ictm[5];
+  if (tx < xMin1) {
+    xMin1 = tx;
+  } else if (tx > xMax1) {
+    xMax1 = tx;
+  }
+  if (ty < yMin1) {
+    yMin1 = ty;
+  } else if (ty > yMax1) {
+    yMax1 = ty;
+  }
+
+  *xMin = xMin1;
+  *yMin = yMin1;
+  *xMax = xMax1;
+  *yMax = yMax1;
+}
+
+double GfxState::transformWidth(double w) {
+  double x, y;
+
+  x = ctm[0] + ctm[2];
+  y = ctm[1] + ctm[3];
+  return w * sqrt(0.5 * (x * x + y * y));
+}
+
+double GfxState::getTransformedFontSize() {
+  double x1, y1, x2, y2;
+
+  x1 = textMat[2] * fontSize;
+  y1 = textMat[3] * fontSize;
+  x2 = ctm[0] * x1 + ctm[2] * y1;
+  y2 = ctm[1] * x1 + ctm[3] * y1;
+  return sqrt(x2 * x2 + y2 * y2);
+}
+
+void GfxState::getFontTransMat(double *m11, double *m12,
+                              double *m21, double *m22) {
+  *m11 = (textMat[0] * ctm[0] + textMat[1] * ctm[2]) * fontSize;
+  *m12 = (textMat[0] * ctm[1] + textMat[1] * ctm[3]) * fontSize;
+  *m21 = (textMat[2] * ctm[0] + textMat[3] * ctm[2]) * fontSize;
+  *m22 = (textMat[2] * ctm[1] + textMat[3] * ctm[3]) * fontSize;
+}
+
+void GfxState::setCTM(double a, double b, double c,
+                     double d, double e, double f) {
+  ctm[0] = a;
+  ctm[1] = b;
+  ctm[2] = c;
+  ctm[3] = d;
+  ctm[4] = e;
+  ctm[5] = f;
+}
+
+void GfxState::concatCTM(double a, double b, double c,
+                        double d, double e, double f) {
+  double a1 = ctm[0];
+  double b1 = ctm[1];
+  double c1 = ctm[2];
+  double d1 = ctm[3];
+
+  ctm[0] = a * a1 + b * c1;
+  ctm[1] = a * b1 + b * d1;
+  ctm[2] = c * a1 + d * c1;
+  ctm[3] = c * b1 + d * d1;
+  ctm[4] = e * a1 + f * c1 + ctm[4];
+  ctm[5] = e * b1 + f * d1 + ctm[5];
+}
+
+void GfxState::shiftCTM(double tx, double ty) {
+  ctm[4] += tx;
+  ctm[5] += ty;
+  clipXMin += tx;
+  clipYMin += ty;
+  clipXMax += tx;
+  clipYMax += ty;
+}
+
+void GfxState::setFillColorSpace(GfxColorSpace *colorSpace) {
+  if (fillColorSpace) {
+    delete fillColorSpace;
+  }
+  fillColorSpace = colorSpace;
+}
+
+void GfxState::setStrokeColorSpace(GfxColorSpace *colorSpace) {
+  if (strokeColorSpace) {
+    delete strokeColorSpace;
+  }
+  strokeColorSpace = colorSpace;
+}
+
+void GfxState::setFillPattern(GfxPattern *pattern) {
+  if (fillPattern) {
+    delete fillPattern;
+  }
+  fillPattern = pattern;
+}
+
+void GfxState::setStrokePattern(GfxPattern *pattern) {
+  if (strokePattern) {
+    delete strokePattern;
+  }
+  strokePattern = pattern;
+}
+
+void GfxState::setFont(GfxFont *fontA, double fontSizeA) {
+  if (font)
+    font->decRefCnt();
+
+  font = fontA;
+  fontSize = fontSizeA;
+}
+
+void GfxState::setTransfer(Function **funcs) {
+  int i;
+
+  for (i = 0; i < 4; ++i) {
+    if (transfer[i]) {
+      delete transfer[i];
+    }
+    transfer[i] = funcs[i];
+  }
+}
+
+void GfxState::setLineDash(double *dash, int length, double start) {
+  if (lineDash)
+    gfree(lineDash);
+  lineDash = dash;
+  lineDashLength = length;
+  lineDashStart = start;
+}
+
+void GfxState::clearPath() {
+  delete path;
+  path = new GfxPath();
+}
+
+void GfxState::clip() {
+  double xMin, yMin, xMax, yMax, x, y;
+  GfxSubpath *subpath;
+  int i, j;
+
+  xMin = xMax = yMin = yMax = 0; // make gcc happy
+  for (i = 0; i < path->getNumSubpaths(); ++i) {
+    subpath = path->getSubpath(i);
+    for (j = 0; j < subpath->getNumPoints(); ++j) {
+      transform(subpath->getX(j), subpath->getY(j), &x, &y);
+      if (i == 0 && j == 0) {
+       xMin = xMax = x;
+       yMin = yMax = y;
+      } else {
+       if (x < xMin) {
+         xMin = x;
+       } else if (x > xMax) {
+         xMax = x;
+       }
+       if (y < yMin) {
+         yMin = y;
+       } else if (y > yMax) {
+         yMax = y;
+       }
+      }
+    }
+  }
+  if (xMin > clipXMin) {
+    clipXMin = xMin;
+  }
+  if (yMin > clipYMin) {
+    clipYMin = yMin;
+  }
+  if (xMax < clipXMax) {
+    clipXMax = xMax;
+  }
+  if (yMax < clipYMax) {
+    clipYMax = yMax;
+  }
+}
+
+void GfxState::clipToStrokePath() {
+  double xMin, yMin, xMax, yMax, x, y, t0, t1;
+  GfxSubpath *subpath;
+  int i, j;
+
+  xMin = xMax = yMin = yMax = 0; // make gcc happy
+  for (i = 0; i < path->getNumSubpaths(); ++i) {
+    subpath = path->getSubpath(i);
+    for (j = 0; j < subpath->getNumPoints(); ++j) {
+      transform(subpath->getX(j), subpath->getY(j), &x, &y);
+      if (i == 0 && j == 0) {
+       xMin = xMax = x;
+       yMin = yMax = y;
+      } else {
+       if (x < xMin) {
+         xMin = x;
+       } else if (x > xMax) {
+         xMax = x;
+       }
+       if (y < yMin) {
+         yMin = y;
+       } else if (y > yMax) {
+         yMax = y;
+       }
+      }
+    }
+  }
+
+  // allow for the line width
+  //~ miter joins can extend farther than this
+  t0 = fabs(ctm[0]);
+  t1 = fabs(ctm[2]);
+  if (t0 > t1) {
+    xMin -= 0.5 * lineWidth * t0;
+    xMax += 0.5 * lineWidth * t0;
+  } else {
+    xMin -= 0.5 * lineWidth * t1;
+    xMax += 0.5 * lineWidth * t1;
+  }
+  t0 = fabs(ctm[0]);
+  t1 = fabs(ctm[3]);
+  if (t0 > t1) {
+    yMin -= 0.5 * lineWidth * t0;
+    yMax += 0.5 * lineWidth * t0;
+  } else {
+    yMin -= 0.5 * lineWidth * t1;
+    yMax += 0.5 * lineWidth * t1;
+  }
+
+  if (xMin > clipXMin) {
+    clipXMin = xMin;
+  }
+  if (yMin > clipYMin) {
+    clipYMin = yMin;
+  }
+  if (xMax < clipXMax) {
+    clipXMax = xMax;
+  }
+  if (yMax < clipYMax) {
+    clipYMax = yMax;
+  }
+}
+
+void GfxState::clipToRect(double xMin, double yMin, double xMax, double yMax) {
+  double x, y, xMin1, yMin1, xMax1, yMax1;
+
+  transform(xMin, yMin, &x, &y);
+  xMin1 = xMax1 = x;
+  yMin1 = yMax1 = y;
+  transform(xMax, yMin, &x, &y);
+  if (x < xMin1) {
+    xMin1 = x;
+  } else if (x > xMax1) {
+    xMax1 = x;
+  }
+  if (y < yMin1) {
+    yMin1 = y;
+  } else if (y > yMax1) {
+    yMax1 = y;
+  }
+  transform(xMax, yMax, &x, &y);
+  if (x < xMin1) {
+    xMin1 = x;
+  } else if (x > xMax1) {
+    xMax1 = x;
+  }
+  if (y < yMin1) {
+    yMin1 = y;
+  } else if (y > yMax1) {
+    yMax1 = y;
+  }
+  transform(xMin, yMax, &x, &y);
+  if (x < xMin1) {
+    xMin1 = x;
+  } else if (x > xMax1) {
+    xMax1 = x;
+  }
+  if (y < yMin1) {
+    yMin1 = y;
+  } else if (y > yMax1) {
+    yMax1 = y;
+  }
+
+  if (xMin1 > clipXMin) {
+    clipXMin = xMin1;
+  }
+  if (yMin1 > clipYMin) {
+    clipYMin = yMin1;
+  }
+  if (xMax1 < clipXMax) {
+    clipXMax = xMax1;
+  }
+  if (yMax1 < clipYMax) {
+    clipYMax = yMax1;
+  }
+}
+
+void GfxState::textShift(double tx, double ty) {
+  double dx, dy;
+
+  textTransformDelta(tx, ty, &dx, &dy);
+  curX += dx;
+  curY += dy;
+}
+
+void GfxState::shift(double dx, double dy) {
+  curX += dx;
+  curY += dy;
+}
+
+GfxState *GfxState::save() {
+  GfxState *newState;
+
+  newState = copy();
+  newState->saved = this;
+  return newState;
+}
+
+GfxState *GfxState::restore() {
+  GfxState *oldState;
+
+  if (saved) {
+    oldState = saved;
+
+    // these attributes aren't saved/restored by the q/Q operators
+    oldState->path = path;
+    oldState->curX = curX;
+    oldState->curY = curY;
+    oldState->lineX = lineX;
+    oldState->lineY = lineY;
+
+    path = NULL;
+    saved = NULL;
+    delete this;
+
+  } else {
+    oldState = this;
+  }
+
+  return oldState;
+}
+
+GBool GfxState::parseBlendMode(Object *obj, GfxBlendMode *mode) {
+  Object obj2;
+  int i, j;
+
+  if (obj->isName()) {
+    for (i = 0; i < nGfxBlendModeNames; ++i) {
+      if (!strcmp(obj->getName(), gfxBlendModeNames[i].name)) {
+       *mode = gfxBlendModeNames[i].mode;
+       return gTrue;
+      }
+    }
+    return gFalse;
+  } else if (obj->isArray()) {
+    for (i = 0; i < obj->arrayGetLength(); ++i) {
+      obj->arrayGet(i, &obj2);
+      if (!obj2.isName()) {
+       obj2.free();
+       return gFalse;
+      }
+      for (j = 0; j < nGfxBlendModeNames; ++j) {
+       if (!strcmp(obj2.getName(), gfxBlendModeNames[j].name)) {
+         obj2.free();
+         *mode = gfxBlendModeNames[j].mode;
+         return gTrue;
+       }
+      }
+      obj2.free();
+    }
+    *mode = gfxBlendNormal;
+    return gTrue;
+  } else {
+    return gFalse;
+  }
+}
diff --git a/poppler/GfxState.h b/poppler/GfxState.h
new file mode 100644 (file)
index 0000000..856ec3f
--- /dev/null
@@ -0,0 +1,1549 @@
+//========================================================================
+//
+// GfxState.h
+//
+// Copyright 1996-2003 Glyph & Cog, LLC
+//
+//========================================================================
+
+//========================================================================
+//
+// Modified under the Poppler project - http://poppler.freedesktop.org
+//
+// All changes made under the Poppler project to this file are licensed
+// under GPL version 2 or later
+//
+// Copyright (C) 2005 Kristian Høgsberg <krh@redhat.com>
+// Copyright (C) 2006, 2007 Jeff Muizelaar <jeff@infidigm.net>
+// Copyright (C) 2006 Carlos Garcia Campos <carlosgc@gnome.org>
+// Copyright (C) 2009 Koji Otani <sho@bbr.jp>
+// Copyright (C) 2009-2011 Albert Astals Cid <aacid@kde.org>
+// Copyright (C) 2010 Christian Feuersänger <cfeuersaenger@googlemail.com>
+// Copyright (C) 2011 Andrea Canciani <ranma42@gmail.com>
+// Copyright (C) 2011 Thomas Freitag <Thomas.Freitag@alfa.de>
+//
+// To see a description of the changes please see the Changelog file that
+// came with your tarball or type make ChangeLog if you are building from git
+//
+//========================================================================
+
+#ifndef GFXSTATE_H
+#define GFXSTATE_H
+
+#ifdef USE_GCC_PRAGMAS
+#pragma interface
+#endif
+
+#include "poppler-config.h"
+
+#include "goo/gtypes.h"
+#include "Object.h"
+#include "Function.h"
+
+#include <assert.h>
+
+class Array;
+class Gfx;
+class GfxFont;
+class PDFRectangle;
+class GfxShading;
+class PopplerCache;
+
+class Matrix {
+public:
+  double m[6];
+
+  GBool invertTo(Matrix *other) const;
+  void transform(double x, double y, double *tx, double *ty) const;
+  double determinant() const { return m[0] * m[3] - m[1] * m[2]; }
+  double norm() const;
+};
+
+//------------------------------------------------------------------------
+// GfxBlendMode
+//------------------------------------------------------------------------
+enum GfxBlendMode {
+  gfxBlendNormal,
+  gfxBlendMultiply,
+  gfxBlendScreen,
+  gfxBlendOverlay,
+  gfxBlendDarken,
+  gfxBlendLighten,
+  gfxBlendColorDodge,
+  gfxBlendColorBurn,
+  gfxBlendHardLight,
+  gfxBlendSoftLight,
+  gfxBlendDifference,
+  gfxBlendExclusion,
+  gfxBlendHue,
+  gfxBlendSaturation,
+  gfxBlendColor,
+  gfxBlendLuminosity
+};
+
+//------------------------------------------------------------------------
+// GfxColorComp
+//------------------------------------------------------------------------
+
+// 16.16 fixed point color component
+typedef int GfxColorComp;
+
+#define gfxColorComp1 0x10000
+
+static inline GfxColorComp dblToCol(double x) {
+  return (GfxColorComp)(x * gfxColorComp1);
+}
+
+static inline double colToDbl(GfxColorComp x) {
+  return (double)x / (double)gfxColorComp1;
+}
+
+static inline Guchar dblToByte(double x) {
+  return (x * 255.0);
+}
+
+static inline double byteToDbl(Guchar x) {
+  return (double)x / (double)255.0;
+}
+
+static inline GfxColorComp byteToCol(Guchar x) {
+  // (x / 255) << 16  =  (0.0000000100000001... * x) << 16
+  //                  =  ((x << 8) + (x) + (x >> 8) + ...) << 16
+  //                  =  (x << 8) + (x) + (x >> 7)
+  //                                      [for rounding]
+  return (GfxColorComp)((x << 8) + x + (x >> 7));
+}
+
+static inline Guchar colToByte(GfxColorComp x) {
+  // 255 * x + 0.5  =  256 * x - x + 0x8000
+  return (Guchar)(((x << 8) - x + 0x8000) >> 16);
+}
+
+//------------------------------------------------------------------------
+// GfxColor
+//------------------------------------------------------------------------
+
+#define gfxColorMaxComps funcMaxOutputs
+
+struct GfxColor {
+  GfxColorComp c[gfxColorMaxComps];
+};
+
+//------------------------------------------------------------------------
+// GfxGray
+//------------------------------------------------------------------------
+
+typedef GfxColorComp GfxGray;
+
+//------------------------------------------------------------------------
+// GfxRGB
+//------------------------------------------------------------------------
+
+struct GfxRGB {
+  GfxColorComp r, g, b;
+};
+
+//------------------------------------------------------------------------
+// GfxCMYK
+//------------------------------------------------------------------------
+
+struct GfxCMYK {
+  GfxColorComp c, m, y, k;
+};
+
+//------------------------------------------------------------------------
+// GfxColorSpace
+//------------------------------------------------------------------------
+
+// NB: The nGfxColorSpaceModes constant and the gfxColorSpaceModeNames
+// array defined in GfxState.cc must match this enum.
+enum GfxColorSpaceMode {
+  csDeviceGray,
+  csCalGray,
+  csDeviceRGB,
+  csCalRGB,
+  csDeviceCMYK,
+  csLab,
+  csICCBased,
+  csIndexed,
+  csSeparation,
+  csDeviceN,
+  csPattern
+};
+
+// wrapper of cmsHTRANSFORM to copy
+class GfxColorTransform {
+public:
+  void doTransform(void *in, void *out, unsigned int size);
+  // transformA should be a cmsHTRANSFORM
+  GfxColorTransform(void *transformA);
+  ~GfxColorTransform();
+  void ref();
+  unsigned int unref();
+private:
+  GfxColorTransform() {}
+  void *transform;
+  unsigned int refCount;
+};
+
+class GfxColorSpace {
+public:
+
+  GfxColorSpace();
+  virtual ~GfxColorSpace();
+  virtual GfxColorSpace *copy() = 0;
+  virtual GfxColorSpaceMode getMode() = 0;
+
+  // Construct a color space.  Returns NULL if unsuccessful.
+  static GfxColorSpace *parse(Object *csObj, Gfx *gfx, int recursion = 0);
+
+  // Convert to gray, RGB, or CMYK.
+  virtual void getGray(GfxColor *color, GfxGray *gray) = 0;
+  virtual void getRGB(GfxColor *color, GfxRGB *rgb) = 0;
+  virtual void getCMYK(GfxColor *color, GfxCMYK *cmyk) = 0;
+  virtual void getGrayLine(Guchar * /*in*/, Guchar * /*out*/, int /*length*/) { error(errInternal, -1, "GfxColorSpace::getGrayLine this should not happen"); }
+  virtual void getRGBLine(Guchar * /*in*/, unsigned int * /*out*/, int /*length*/) { error(errInternal, -1, "GfxColorSpace::getRGBLine (first variant) this should not happen"); }
+  virtual void getRGBLine(Guchar * /*in*/, Guchar * /*out*/, int /*length*/) {  error(errInternal, -1, "GfxColorSpace::getRGBLine (second variant) this should not happen"); }
+  virtual void getRGBXLine(Guchar * /*in*/, Guchar * /*out*/, int /*length*/) {  error(errInternal, -1, "GfxColorSpace::getRGBXLine this should not happen"); }
+
+  // Does this ColorSpace support getRGBLine?
+  virtual GBool useGetRGBLine() { return gFalse; }
+  // Does this ColorSpace support getGrayLine?
+  virtual GBool useGetGrayLine() { return gFalse; }
+
+  // Return the number of color components.
+  virtual int getNComps() = 0;
+
+  // Get this color space's default color.
+  virtual void getDefaultColor(GfxColor *color) = 0;
+
+  // Return the default ranges for each component, assuming an image
+  // with a max pixel value of <maxImgPixel>.
+  virtual void getDefaultRanges(double *decodeLow, double *decodeRange,
+                               int maxImgPixel);
+
+  // Returns true if painting operations in this color space never
+  // mark the page (e.g., the "None" colorant).
+  virtual GBool isNonMarking() { return gFalse; }
+
+  // Return the color space's overprint mask.
+  Guint getOverprintMask() { return overprintMask; }
+
+  // Return the number of color space modes
+  static int getNumColorSpaceModes();
+
+  // Return the name of the <idx>th color space mode.
+  static const char *getColorSpaceModeName(int idx);
+
+#ifdef USE_CMS
+  static int setupColorProfiles();
+  // displayProfileA should be a cmsHPROFILE 
+  static void setDisplayProfile(void *displayProfileA);
+  static void setDisplayProfileName(GooString *name);
+  // result will be a cmsHPROFILE 
+  static void *getRGBProfile();
+  // result will be a cmsHPROFILE 
+  static void *getDisplayProfile();
+#endif
+protected:
+
+  Guint overprintMask;
+};
+
+//------------------------------------------------------------------------
+// GfxDeviceGrayColorSpace
+//------------------------------------------------------------------------
+
+class GfxDeviceGrayColorSpace: public GfxColorSpace {
+public:
+
+  GfxDeviceGrayColorSpace();
+  virtual ~GfxDeviceGrayColorSpace();
+  virtual GfxColorSpace *copy();
+  virtual GfxColorSpaceMode getMode() { return csDeviceGray; }
+
+  virtual void getGray(GfxColor *color, GfxGray *gray);
+  virtual void getRGB(GfxColor *color, GfxRGB *rgb);
+  virtual void getCMYK(GfxColor *color, GfxCMYK *cmyk);
+  virtual void getGrayLine(Guchar *in, Guchar *out, int length);
+  virtual void getRGBLine(Guchar *in, unsigned int *out, int length);
+  virtual void getRGBLine(Guchar *in, Guchar *out, int length);
+  virtual void getRGBXLine(Guchar *in, Guchar *out, int length);
+
+  virtual GBool useGetRGBLine() { return gTrue; }
+  virtual GBool useGetGrayLine() { return gTrue; }
+
+  virtual int getNComps() { return 1; }
+  virtual void getDefaultColor(GfxColor *color);
+
+private:
+};
+
+//------------------------------------------------------------------------
+// GfxCalGrayColorSpace
+//------------------------------------------------------------------------
+
+class GfxCalGrayColorSpace: public GfxColorSpace {
+public:
+
+  GfxCalGrayColorSpace();
+  virtual ~GfxCalGrayColorSpace();
+  virtual GfxColorSpace *copy();
+  virtual GfxColorSpaceMode getMode() { return csCalGray; }
+
+  // Construct a CalGray color space.  Returns NULL if unsuccessful.
+  static GfxColorSpace *parse(Array *arr);
+
+  virtual void getGray(GfxColor *color, GfxGray *gray);
+  virtual void getRGB(GfxColor *color, GfxRGB *rgb);
+  virtual void getCMYK(GfxColor *color, GfxCMYK *cmyk);
+
+  virtual int getNComps() { return 1; }
+  virtual void getDefaultColor(GfxColor *color);
+
+  // CalGray-specific access.
+  double getWhiteX() { return whiteX; }
+  double getWhiteY() { return whiteY; }
+  double getWhiteZ() { return whiteZ; }
+  double getBlackX() { return blackX; }
+  double getBlackY() { return blackY; }
+  double getBlackZ() { return blackZ; }
+  double getGamma() { return gamma; }
+
+private:
+
+  double whiteX, whiteY, whiteZ;    // white point
+  double blackX, blackY, blackZ;    // black point
+  double gamma;                            // gamma value
+  double kr, kg, kb;               // gamut mapping mulitpliers
+  void getXYZ(GfxColor *color, double *pX, double *pY, double *pZ);
+};
+
+//------------------------------------------------------------------------
+// GfxDeviceRGBColorSpace
+//------------------------------------------------------------------------
+
+class GfxDeviceRGBColorSpace: public GfxColorSpace {
+public:
+
+  GfxDeviceRGBColorSpace();
+  virtual ~GfxDeviceRGBColorSpace();
+  virtual GfxColorSpace *copy();
+  virtual GfxColorSpaceMode getMode() { return csDeviceRGB; }
+
+  virtual void getGray(GfxColor *color, GfxGray *gray);
+  virtual void getRGB(GfxColor *color, GfxRGB *rgb);
+  virtual void getCMYK(GfxColor *color, GfxCMYK *cmyk);
+  virtual void getGrayLine(Guchar *in, Guchar *out, int length);
+  virtual void getRGBLine(Guchar *in, unsigned int *out, int length);
+  virtual void getRGBLine(Guchar *in, Guchar *out, int length);
+  virtual void getRGBXLine(Guchar *in, Guchar *out, int length);
+
+  virtual GBool useGetRGBLine() { return gTrue; }
+  virtual GBool useGetGrayLine() { return gTrue; }
+
+  virtual int getNComps() { return 3; }
+  virtual void getDefaultColor(GfxColor *color);
+
+private:
+};
+
+//------------------------------------------------------------------------
+// GfxCalRGBColorSpace
+//------------------------------------------------------------------------
+
+class GfxCalRGBColorSpace: public GfxColorSpace {
+public:
+
+  GfxCalRGBColorSpace();
+  virtual ~GfxCalRGBColorSpace();
+  virtual GfxColorSpace *copy();
+  virtual GfxColorSpaceMode getMode() { return csCalRGB; }
+
+  // Construct a CalRGB color space.  Returns NULL if unsuccessful.
+  static GfxColorSpace *parse(Array *arr);
+
+  virtual void getGray(GfxColor *color, GfxGray *gray);
+  virtual void getRGB(GfxColor *color, GfxRGB *rgb);
+  virtual void getCMYK(GfxColor *color, GfxCMYK *cmyk);
+
+  virtual int getNComps() { return 3; }
+  virtual void getDefaultColor(GfxColor *color);
+
+  // CalRGB-specific access.
+  double getWhiteX() { return whiteX; }
+  double getWhiteY() { return whiteY; }
+  double getWhiteZ() { return whiteZ; }
+  double getBlackX() { return blackX; }
+  double getBlackY() { return blackY; }
+  double getBlackZ() { return blackZ; }
+  double getGammaR() { return gammaR; }
+  double getGammaG() { return gammaG; }
+  double getGammaB() { return gammaB; }
+  double *getMatrix() { return mat; }
+
+private:
+
+  double whiteX, whiteY, whiteZ;    // white point
+  double blackX, blackY, blackZ;    // black point
+  double gammaR, gammaG, gammaB;    // gamma values
+  double mat[9];                   // ABC -> XYZ transform matrix
+  double kr, kg, kb;               // gamut mapping mulitpliers
+  void getXYZ(GfxColor *color, double *pX, double *pY, double *pZ);
+};
+
+//------------------------------------------------------------------------
+// GfxDeviceCMYKColorSpace
+//------------------------------------------------------------------------
+
+class GfxDeviceCMYKColorSpace: public GfxColorSpace {
+public:
+
+  GfxDeviceCMYKColorSpace();
+  virtual ~GfxDeviceCMYKColorSpace();
+  virtual GfxColorSpace *copy();
+  virtual GfxColorSpaceMode getMode() { return csDeviceCMYK; }
+
+  virtual void getGray(GfxColor *color, GfxGray *gray);
+  virtual void getRGB(GfxColor *color, GfxRGB *rgb);
+  virtual void getCMYK(GfxColor *color, GfxCMYK *cmyk);
+  virtual void getRGBLine(Guchar *in, unsigned int *out, int length);
+  virtual void getRGBLine(Guchar *, Guchar *out, int length);
+  virtual void getRGBXLine(Guchar *in, Guchar *out, int length);
+  virtual GBool useGetRGBLine() { return gTrue; }
+
+  virtual int getNComps() { return 4; }
+  virtual void getDefaultColor(GfxColor *color);
+
+private:
+};
+
+//------------------------------------------------------------------------
+// GfxLabColorSpace
+//------------------------------------------------------------------------
+
+class GfxLabColorSpace: public GfxColorSpace {
+public:
+
+  GfxLabColorSpace();
+  virtual ~GfxLabColorSpace();
+  virtual GfxColorSpace *copy();
+  virtual GfxColorSpaceMode getMode() { return csLab; }
+
+  // Construct a Lab color space.  Returns NULL if unsuccessful.
+  static GfxColorSpace *parse(Array *arr);
+
+  virtual void getGray(GfxColor *color, GfxGray *gray);
+  virtual void getRGB(GfxColor *color, GfxRGB *rgb);
+  virtual void getCMYK(GfxColor *color, GfxCMYK *cmyk);
+
+  virtual int getNComps() { return 3; }
+  virtual void getDefaultColor(GfxColor *color);
+
+  virtual void getDefaultRanges(double *decodeLow, double *decodeRange,
+                               int maxImgPixel);
+
+  // Lab-specific access.
+  double getWhiteX() { return whiteX; }
+  double getWhiteY() { return whiteY; }
+  double getWhiteZ() { return whiteZ; }
+  double getBlackX() { return blackX; }
+  double getBlackY() { return blackY; }
+  double getBlackZ() { return blackZ; }
+  double getAMin() { return aMin; }
+  double getAMax() { return aMax; }
+  double getBMin() { return bMin; }
+  double getBMax() { return bMax; }
+
+private:
+
+  double whiteX, whiteY, whiteZ;    // white point
+  double blackX, blackY, blackZ;    // black point
+  double aMin, aMax, bMin, bMax;    // range for the a and b components
+  double kr, kg, kb;               // gamut mapping mulitpliers
+  void getXYZ(GfxColor *color, double *pX, double *pY, double *pZ);
+};
+
+//------------------------------------------------------------------------
+// GfxICCBasedColorSpace
+//------------------------------------------------------------------------
+
+class GfxICCBasedColorSpace: public GfxColorSpace {
+public:
+
+  GfxICCBasedColorSpace(int nCompsA, GfxColorSpace *altA,
+                       Ref *iccProfileStreamA);
+  virtual ~GfxICCBasedColorSpace();
+  virtual GfxColorSpace *copy();
+  virtual GfxColorSpaceMode getMode() { return csICCBased; }
+
+  // Construct an ICCBased color space.  Returns NULL if unsuccessful.
+  static GfxColorSpace *parse(Array *arr, Gfx *gfx, int recursion);
+
+  virtual void getGray(GfxColor *color, GfxGray *gray);
+  virtual void getRGB(GfxColor *color, GfxRGB *rgb);
+  virtual void getCMYK(GfxColor *color, GfxCMYK *cmyk);
+  virtual void getRGBLine(Guchar *in, unsigned int *out, int length);
+  virtual void getRGBLine(Guchar *in, Guchar *out, int length);
+  virtual void getRGBXLine(Guchar *in, Guchar *out, int length);
+
+  virtual GBool useGetRGBLine();
+
+  virtual int getNComps() { return nComps; }
+  virtual void getDefaultColor(GfxColor *color);
+
+  virtual void getDefaultRanges(double *decodeLow, double *decodeRange,
+                               int maxImgPixel);
+
+  // ICCBased-specific access.
+  GfxColorSpace *getAlt() { return alt; }
+
+private:
+
+  int nComps;                  // number of color components (1, 3, or 4)
+  GfxColorSpace *alt;          // alternate color space
+  double rangeMin[4];          // min values for each component
+  double rangeMax[4];          // max values for each component
+  Ref iccProfileStream;                // the ICC profile
+#ifdef USE_CMS
+  GfxColorTransform *transform;
+  GfxColorTransform *lineTransform; // color transform for line
+#endif
+};
+//------------------------------------------------------------------------
+// GfxIndexedColorSpace
+//------------------------------------------------------------------------
+
+class GfxIndexedColorSpace: public GfxColorSpace {
+public:
+
+  GfxIndexedColorSpace(GfxColorSpace *baseA, int indexHighA);
+  virtual ~GfxIndexedColorSpace();
+  virtual GfxColorSpace *copy();
+  virtual GfxColorSpaceMode getMode() { return csIndexed; }
+
+  // Construct an Indexed color space.  Returns NULL if unsuccessful.
+  static GfxColorSpace *parse(Array *arr, Gfx *gfx, int recursion);
+
+  virtual void getGray(GfxColor *color, GfxGray *gray);
+  virtual void getRGB(GfxColor *color, GfxRGB *rgb);
+  virtual void getCMYK(GfxColor *color, GfxCMYK *cmyk);
+  virtual void getRGBLine(Guchar *in, unsigned int *out, int length);
+  virtual void getRGBLine(Guchar *in, Guchar *out, int length);
+  virtual void getRGBXLine(Guchar *in, Guchar *out, int length);
+
+  virtual GBool useGetRGBLine() { return gTrue; }
+
+  virtual int getNComps() { return 1; }
+  virtual void getDefaultColor(GfxColor *color);
+
+  virtual void getDefaultRanges(double *decodeLow, double *decodeRange,
+                               int maxImgPixel);
+
+  // Indexed-specific access.
+  GfxColorSpace *getBase() { return base; }
+  int getIndexHigh() { return indexHigh; }
+  Guchar *getLookup() { return lookup; }
+  GfxColor *mapColorToBase(GfxColor *color, GfxColor *baseColor);
+
+private:
+
+  GfxColorSpace *base;         // base color space
+  int indexHigh;               // max pixel value
+  Guchar *lookup;              // lookup table
+};
+
+//------------------------------------------------------------------------
+// GfxSeparationColorSpace
+//------------------------------------------------------------------------
+
+class GfxSeparationColorSpace: public GfxColorSpace {
+public:
+
+  GfxSeparationColorSpace(GooString *nameA, GfxColorSpace *altA,
+                         Function *funcA);
+  virtual ~GfxSeparationColorSpace();
+  virtual GfxColorSpace *copy();
+  virtual GfxColorSpaceMode getMode() { return csSeparation; }
+
+  // Construct a Separation color space.  Returns NULL if unsuccessful.
+  static GfxColorSpace *parse(Array *arr, Gfx *gfx, int recursion);
+
+  virtual void getGray(GfxColor *color, GfxGray *gray);
+  virtual void getRGB(GfxColor *color, GfxRGB *rgb);
+  virtual void getCMYK(GfxColor *color, GfxCMYK *cmyk);
+
+  virtual int getNComps() { return 1; }
+  virtual void getDefaultColor(GfxColor *color);
+
+  virtual GBool isNonMarking() { return nonMarking; }
+
+  // Separation-specific access.
+  GooString *getName() { return name; }
+  GfxColorSpace *getAlt() { return alt; }
+  Function *getFunc() { return func; }
+
+private:
+
+  GfxSeparationColorSpace(GooString *nameA, GfxColorSpace *altA,
+                         Function *funcA, GBool nonMarkingA,
+                         Guint overprintMaskA);
+
+  GooString *name;             // colorant name
+  GfxColorSpace *alt;          // alternate color space
+  Function *func;              // tint transform (into alternate color space)
+  GBool nonMarking;
+};
+
+//------------------------------------------------------------------------
+// GfxDeviceNColorSpace
+//------------------------------------------------------------------------
+
+class GfxDeviceNColorSpace: public GfxColorSpace {
+public:
+
+  GfxDeviceNColorSpace(int nCompsA, GooString **namesA,
+                      GfxColorSpace *alt, Function *func);
+  virtual ~GfxDeviceNColorSpace();
+  virtual GfxColorSpace *copy();
+  virtual GfxColorSpaceMode getMode() { return csDeviceN; }
+
+  // Construct a DeviceN color space.  Returns NULL if unsuccessful.
+  static GfxColorSpace *parse(Array *arr, Gfx *gfx, int recursion);
+
+  virtual void getGray(GfxColor *color, GfxGray *gray);
+  virtual void getRGB(GfxColor *color, GfxRGB *rgb);
+  virtual void getCMYK(GfxColor *color, GfxCMYK *cmyk);
+
+  virtual int getNComps() { return nComps; }
+  virtual void getDefaultColor(GfxColor *color);
+
+  virtual GBool isNonMarking() { return nonMarking; }
+
+  // DeviceN-specific access.
+  GooString *getColorantName(int i) { return names[i]; }
+  GfxColorSpace *getAlt() { return alt; }
+  Function *getTintTransformFunc() { return func; }
+
+private:
+
+  GfxDeviceNColorSpace(int nCompsA, GooString **namesA,
+                      GfxColorSpace *alt, Function *func,
+                      GBool nonMarkingA, Guint overprintMaskA);
+
+  int nComps;                  // number of components
+  GooString                    // colorant names
+    *names[gfxColorMaxComps];
+  GfxColorSpace *alt;          // alternate color space
+  Function *func;              // tint transform (into alternate color space)
+  GBool nonMarking;
+};
+
+//------------------------------------------------------------------------
+// GfxPatternColorSpace
+//------------------------------------------------------------------------
+
+class GfxPatternColorSpace: public GfxColorSpace {
+public:
+
+  GfxPatternColorSpace(GfxColorSpace *underA);
+  virtual ~GfxPatternColorSpace();
+  virtual GfxColorSpace *copy();
+  virtual GfxColorSpaceMode getMode() { return csPattern; }
+
+  // Construct a Pattern color space.  Returns NULL if unsuccessful.
+  static GfxColorSpace *parse(Array *arr, Gfx *gfx, int recursion);
+
+  virtual void getGray(GfxColor *color, GfxGray *gray);
+  virtual void getRGB(GfxColor *color, GfxRGB *rgb);
+  virtual void getCMYK(GfxColor *color, GfxCMYK *cmyk);
+
+  virtual int getNComps() { return 0; }
+  virtual void getDefaultColor(GfxColor *color);
+
+  // Pattern-specific access.
+  GfxColorSpace *getUnder() { return under; }
+
+private:
+
+  GfxColorSpace *under;                // underlying color space (for uncolored
+                               //   patterns)
+};
+
+//------------------------------------------------------------------------
+// GfxPattern
+//------------------------------------------------------------------------
+
+class GfxPattern {
+public:
+
+  GfxPattern(int typeA);
+  virtual ~GfxPattern();
+
+  static GfxPattern *parse(Object *obj, Gfx *gfx);
+
+  virtual GfxPattern *copy() = 0;
+
+  int getType() { return type; }
+
+private:
+
+  int type;
+};
+
+//------------------------------------------------------------------------
+// GfxTilingPattern
+//------------------------------------------------------------------------
+
+class GfxTilingPattern: public GfxPattern {
+public:
+
+  static GfxTilingPattern *parse(Object *patObj);
+  virtual ~GfxTilingPattern();
+
+  virtual GfxPattern *copy();
+
+  int getPaintType() { return paintType; }
+  int getTilingType() { return tilingType; }
+  double *getBBox() { return bbox; }
+  double getXStep() { return xStep; }
+  double getYStep() { return yStep; }
+  Dict *getResDict()
+    { return resDict.isDict() ? resDict.getDict() : (Dict *)NULL; }
+  double *getMatrix() { return matrix; }
+  Object *getContentStream() { return &contentStream; }
+
+private:
+
+  GfxTilingPattern(int paintTypeA, int tilingTypeA,
+                  double *bboxA, double xStepA, double yStepA,
+                  Object *resDictA, double *matrixA,
+                  Object *contentStreamA);
+
+  int paintType;
+  int tilingType;
+  double bbox[4];
+  double xStep, yStep;
+  Object resDict;
+  double matrix[6];
+  Object contentStream;
+};
+
+//------------------------------------------------------------------------
+// GfxShadingPattern
+//------------------------------------------------------------------------
+
+class GfxShadingPattern: public GfxPattern {
+public:
+
+  static GfxShadingPattern *parse(Object *patObj, Gfx *gfx);
+  virtual ~GfxShadingPattern();
+
+  virtual GfxPattern *copy();
+
+  GfxShading *getShading() { return shading; }
+  double *getMatrix() { return matrix; }
+
+private:
+
+  GfxShadingPattern(GfxShading *shadingA, double *matrixA);
+
+  GfxShading *shading;
+  double matrix[6];
+};
+
+//------------------------------------------------------------------------
+// GfxShading
+//------------------------------------------------------------------------
+
+class GfxShading {
+public:
+
+  GfxShading(int typeA);
+  GfxShading(GfxShading *shading);
+  virtual ~GfxShading();
+
+  static GfxShading *parse(Object *obj, Gfx *gfx);
+
+  virtual GfxShading *copy() = 0;
+
+  int getType() { return type; }
+  GfxColorSpace *getColorSpace() { return colorSpace; }
+  GfxColor *getBackground() { return &background; }
+  GBool getHasBackground() { return hasBackground; }
+  void getBBox(double *xMinA, double *yMinA, double *xMaxA, double *yMaxA)
+    { *xMinA = xMin; *yMinA = yMin; *xMaxA = xMax; *yMaxA = yMax; }
+  GBool getHasBBox() { return hasBBox; }
+
+protected:
+
+  GBool init(Dict *dict, Gfx *gfx);
+
+  int type;
+  GfxColorSpace *colorSpace;
+  GfxColor background;
+  GBool hasBackground;
+  double xMin, yMin, xMax, yMax;
+  GBool hasBBox;
+};
+
+//------------------------------------------------------------------------
+// GfxUnivariateShading
+//------------------------------------------------------------------------
+
+class GfxUnivariateShading: public GfxShading {
+public:
+
+  GfxUnivariateShading(int typeA,
+                      double t0A, double t1A,
+                      Function **funcsA, int nFuncsA,
+                      GBool extend0A, GBool extend1A);
+  GfxUnivariateShading(GfxUnivariateShading *shading);
+  virtual ~GfxUnivariateShading();
+
+  double getDomain0() { return t0; }
+  double getDomain1() { return t1; }
+  GBool getExtend0() { return extend0; }
+  GBool getExtend1() { return extend1; }
+  int getNFuncs() { return nFuncs; }
+  Function *getFunc(int i) { return funcs[i]; }
+  void getColor(double t, GfxColor *color);
+
+  void setupCache(const Matrix *ctm,
+                 double xMin, double yMin,
+                 double xMax, double yMax);
+
+  virtual void getParameterRange(double *lower, double *upper,
+                                double xMin, double yMin,
+                                double xMax, double yMax) = 0;
+
+  virtual double getDistance(double tMin, double tMax) = 0;
+
+private:
+
+  double t0, t1;
+  Function *funcs[gfxColorMaxComps];
+  int nFuncs;
+  GBool extend0, extend1;
+
+  int cacheSize, lastMatch;
+  double *cacheBounds;
+  double *cacheCoeff;
+  double *cacheValues;
+};
+
+//------------------------------------------------------------------------
+// GfxFunctionShading
+//------------------------------------------------------------------------
+
+class GfxFunctionShading: public GfxShading {
+public:
+
+  GfxFunctionShading(double x0A, double y0A,
+                    double x1A, double y1A,
+                    double *matrixA,
+                    Function **funcsA, int nFuncsA);
+  GfxFunctionShading(GfxFunctionShading *shading);
+  virtual ~GfxFunctionShading();
+
+  static GfxFunctionShading *parse(Dict *dict, Gfx *gfx);
+
+  virtual GfxShading *copy();
+
+  void getDomain(double *x0A, double *y0A, double *x1A, double *y1A)
+    { *x0A = x0; *y0A = y0; *x1A = x1; *y1A = y1; }
+  double *getMatrix() { return matrix; }
+  int getNFuncs() { return nFuncs; }
+  Function *getFunc(int i) { return funcs[i]; }
+  void getColor(double x, double y, GfxColor *color);
+
+private:
+
+  double x0, y0, x1, y1;
+  double matrix[6];
+  Function *funcs[gfxColorMaxComps];
+  int nFuncs;
+};
+
+//------------------------------------------------------------------------
+// GfxAxialShading
+//------------------------------------------------------------------------
+
+class GfxAxialShading: public GfxUnivariateShading {
+public:
+
+  GfxAxialShading(double x0A, double y0A,
+                 double x1A, double y1A,
+                 double t0A, double t1A,
+                 Function **funcsA, int nFuncsA,
+                 GBool extend0A, GBool extend1A);
+  GfxAxialShading(GfxAxialShading *shading);
+  virtual ~GfxAxialShading();
+
+  static GfxAxialShading *parse(Dict *dict, Gfx *gfx);
+
+  virtual GfxShading *copy();
+
+  void getCoords(double *x0A, double *y0A, double *x1A, double *y1A)
+    { *x0A = x0; *y0A = y0; *x1A = x1; *y1A = y1; }
+
+  virtual void getParameterRange(double *lower, double *upper,
+                                double xMin, double yMin,
+                                double xMax, double yMax);
+
+  virtual double getDistance(double tMin, double tMax);
+
+private:
+
+  double x0, y0, x1, y1;
+};
+
+//------------------------------------------------------------------------
+// GfxRadialShading
+//------------------------------------------------------------------------
+
+class GfxRadialShading: public GfxUnivariateShading {
+public:
+
+  GfxRadialShading(double x0A, double y0A, double r0A,
+                  double x1A, double y1A, double r1A,
+                  double t0A, double t1A,
+                  Function **funcsA, int nFuncsA,
+                  GBool extend0A, GBool extend1A);
+  GfxRadialShading(GfxRadialShading *shading);
+  virtual ~GfxRadialShading();
+
+  static GfxRadialShading *parse(Dict *dict, Gfx *gfx);
+
+  virtual GfxShading *copy();
+
+  void getCoords(double *x0A, double *y0A, double *r0A,
+                double *x1A, double *y1A, double *r1A)
+    { *x0A = x0; *y0A = y0; *r0A = r0; *x1A = x1; *y1A = y1; *r1A = r1; }
+
+  virtual void getParameterRange(double *lower, double *upper,
+                                double xMin, double yMin,
+                                double xMax, double yMax);
+
+  virtual double getDistance(double tMin, double tMax);
+
+private:
+
+  double x0, y0, r0, x1, y1, r1;
+};
+
+//------------------------------------------------------------------------
+// GfxGouraudTriangleShading
+//------------------------------------------------------------------------
+
+struct GfxGouraudVertex {
+  double x, y;
+  GfxColor color;
+};
+
+class GfxGouraudTriangleShading: public GfxShading {
+public:
+
+  GfxGouraudTriangleShading(int typeA,
+                           GfxGouraudVertex *verticesA, int nVerticesA,
+                           int (*trianglesA)[3], int nTrianglesA,
+                           Function **funcsA, int nFuncsA);
+  GfxGouraudTriangleShading(GfxGouraudTriangleShading *shading);
+  virtual ~GfxGouraudTriangleShading();
+
+  static GfxGouraudTriangleShading *parse(int typeA, Dict *dict, Stream *str, Gfx *gfx);
+
+  virtual GfxShading *copy();
+
+  int getNTriangles() { return nTriangles; }
+
+  bool isParameterized() const { return nFuncs > 0; }
+
+  /**
+   * @precondition isParameterized() == true
+   */
+  double getParameterDomainMin() const { assert(isParameterized()); return funcs[0]->getDomainMin(0); }
+
+  /**
+   * @precondition isParameterized() == true
+   */
+  double getParameterDomainMax() const { assert(isParameterized()); return funcs[0]->getDomainMax(0); }
+
+  /**
+   * @precondition isParameterized() == false
+   */
+  void getTriangle(int i, double *x0, double *y0, GfxColor *color0,
+                  double *x1, double *y1, GfxColor *color1,
+                  double *x2, double *y2, GfxColor *color2);
+
+  /**
+   * Variant for functions.
+   *
+   * @precondition isParameterized() == true
+   */
+  void getTriangle(int i, double *x0, double *y0, double *color0,
+                  double *x1, double *y1, double *color1,
+                  double *x2, double *y2, double *color2);
+
+  void getParameterizedColor(double t, GfxColor *color);
+
+private:
+
+  GfxGouraudVertex *vertices;
+  int nVertices;
+  int (*triangles)[3];
+  int nTriangles;
+  Function *funcs[gfxColorMaxComps];
+  int nFuncs;
+};
+
+//------------------------------------------------------------------------
+// GfxPatchMeshShading
+//------------------------------------------------------------------------
+
+/**
+ * A tensor product cubic bezier patch consisting of 4x4 points and 4 color
+ * values.
+ *
+ * See the Shading Type 7 specifications. Note that Shading Type 6 is also
+ * represented using GfxPatch.
+ */
+struct GfxPatch {
+  /**
+   * Represents a single color value for the patch.
+   */
+  struct ColorValue {
+    /**
+     * For parameterized patches, only element 0 is valid; it contains
+     * the single parameter.
+     *
+     * For non-parameterized patches, c contains all color components
+     * as decoded from the input stream. In this case, you will need to
+     * use dblToCol() before assigning them to GfxColor.
+     */
+    double c[gfxColorMaxComps];
+  };
+
+  double x[4][4];
+  double y[4][4];
+  ColorValue color[2][2];
+};
+
+class GfxPatchMeshShading: public GfxShading {
+public:
+
+  GfxPatchMeshShading(int typeA, GfxPatch *patchesA, int nPatchesA,
+                     Function **funcsA, int nFuncsA);
+  GfxPatchMeshShading(GfxPatchMeshShading *shading);
+  virtual ~GfxPatchMeshShading();
+
+  static GfxPatchMeshShading *parse(int typeA, Dict *dict, Stream *str, Gfx *gfx);
+
+  virtual GfxShading *copy();
+
+  int getNPatches() { return nPatches; }
+  GfxPatch *getPatch(int i) { return &patches[i]; }
+
+  bool isParameterized() const { return nFuncs > 0; }
+
+  /**
+   * @precondition isParameterized() == true
+   */
+  double getParameterDomainMin() const { assert(isParameterized()); return funcs[0]->getDomainMin(0); }
+
+  /**
+   * @precondition isParameterized() == true
+   */
+  double getParameterDomainMax() const { assert(isParameterized()); return funcs[0]->getDomainMax(0); }
+
+  void getParameterizedColor(double t, GfxColor *color);
+
+private:
+
+  GfxPatch *patches;
+  int nPatches;
+  Function *funcs[gfxColorMaxComps];
+  int nFuncs;
+};
+
+//------------------------------------------------------------------------
+// GfxImageColorMap
+//------------------------------------------------------------------------
+
+class GfxImageColorMap {
+public:
+
+  // Constructor.
+  GfxImageColorMap(int bitsA, Object *decode, GfxColorSpace *colorSpaceA);
+
+  // Destructor.
+  ~GfxImageColorMap();
+
+  // Return a copy of this color map.
+  GfxImageColorMap *copy() { return new GfxImageColorMap(this); }
+
+  // Is color map valid?
+  GBool isOk() { return ok; }
+
+  // Get the color space.
+  GfxColorSpace *getColorSpace() { return colorSpace; }
+
+  // Get stream decoding info.
+  int getNumPixelComps() { return nComps; }
+  int getBits() { return bits; }
+
+  // Get decode table.
+  double getDecodeLow(int i) { return decodeLow[i]; }
+  double getDecodeHigh(int i) { return decodeLow[i] + decodeRange[i]; }
+  
+  bool useRGBLine() { return (colorSpace2 && colorSpace2->useGetRGBLine ()) || (!colorSpace2 && colorSpace->useGetRGBLine ()); }
+
+  // Convert an image pixel to a color.
+  void getGray(Guchar *x, GfxGray *gray);
+  void getRGB(Guchar *x, GfxRGB *rgb);
+  void getRGBLine(Guchar *in, unsigned int *out, int length);
+  void getRGBLine(Guchar *in, Guchar *out, int length);
+  void getRGBXLine(Guchar *in, Guchar *out, int length);
+  void getGrayLine(Guchar *in, Guchar *out, int length);
+  void getCMYK(Guchar *x, GfxCMYK *cmyk);
+  void getColor(Guchar *x, GfxColor *color);
+
+private:
+
+  GfxImageColorMap(GfxImageColorMap *colorMap);
+
+  GfxColorSpace *colorSpace;   // the image color space
+  int bits;                    // bits per component
+  int nComps;                  // number of components in a pixel
+  GfxColorSpace *colorSpace2;  // secondary color space
+  int nComps2;                 // number of components in colorSpace2
+  GfxColorComp *               // lookup table
+    lookup[gfxColorMaxComps];
+  GfxColorComp *               // optimized case lookup table
+    lookup2[gfxColorMaxComps];
+  Guchar *byte_lookup;
+  double                       // minimum values for each component
+    decodeLow[gfxColorMaxComps];
+  double                       // max - min value for each component
+    decodeRange[gfxColorMaxComps];
+  GBool ok;
+};
+
+//------------------------------------------------------------------------
+// GfxSubpath and GfxPath
+//------------------------------------------------------------------------
+
+class GfxSubpath {
+public:
+
+  // Constructor.
+  GfxSubpath(double x1, double y1);
+
+  // Destructor.
+  ~GfxSubpath();
+
+  // Copy.
+  GfxSubpath *copy() { return new GfxSubpath(this); }
+
+  // Get points.
+  int getNumPoints() { return n; }
+  double getX(int i) { return x[i]; }
+  double getY(int i) { return y[i]; }
+  GBool getCurve(int i) { return curve[i]; }
+
+  void setX(int i, double a) { x[i] = a; }
+  void setY(int i, double a) { y[i] = a; }
+
+  // Get last point.
+  double getLastX() { return x[n-1]; }
+  double getLastY() { return y[n-1]; }
+
+  // Add a line segment.
+  void lineTo(double x1, double y1);
+
+  // Add a Bezier curve.
+  void curveTo(double x1, double y1, double x2, double y2,
+              double x3, double y3);
+
+  // Close the subpath.
+  void close();
+  GBool isClosed() { return closed; }
+
+  // Add (<dx>, <dy>) to each point in the subpath.
+  void offset(double dx, double dy);
+
+private:
+
+  double *x, *y;               // points
+  GBool *curve;                        // curve[i] => point i is a control point
+                               //   for a Bezier curve
+  int n;                       // number of points
+  int size;                    // size of x/y arrays
+  GBool closed;                        // set if path is closed
+
+  GfxSubpath(GfxSubpath *subpath);
+};
+
+class GfxPath {
+public:
+
+  // Constructor.
+  GfxPath();
+
+  // Destructor.
+  ~GfxPath();
+
+  // Copy.
+  GfxPath *copy()
+    { return new GfxPath(justMoved, firstX, firstY, subpaths, n, size); }
+
+  // Is there a current point?
+  GBool isCurPt() { return n > 0 || justMoved; }
+
+  // Is the path non-empty, i.e., is there at least one segment?
+  GBool isPath() { return n > 0; }
+
+  // Get subpaths.
+  int getNumSubpaths() { return n; }
+  GfxSubpath *getSubpath(int i) { return subpaths[i]; }
+
+  // Get last point on last subpath.
+  double getLastX() { return subpaths[n-1]->getLastX(); }
+  double getLastY() { return subpaths[n-1]->getLastY(); }
+
+  // Move the current point.
+  void moveTo(double x, double y);
+
+  // Add a segment to the last subpath.
+  void lineTo(double x, double y);
+
+  // Add a Bezier curve to the last subpath
+  void curveTo(double x1, double y1, double x2, double y2,
+              double x3, double y3);
+
+  // Close the last subpath.
+  void close();
+
+  // Append <path> to <this>.
+  void append(GfxPath *path);
+
+  // Add (<dx>, <dy>) to each point in the path.
+  void offset(double dx, double dy);
+
+private:
+
+  GBool justMoved;             // set if a new subpath was just started
+  double firstX, firstY;       // first point in new subpath
+  GfxSubpath **subpaths;       // subpaths
+  int n;                       // number of subpaths
+  int size;                    // size of subpaths array
+
+  GfxPath(GBool justMoved1, double firstX1, double firstY1,
+         GfxSubpath **subpaths1, int n1, int size1);
+};
+
+//------------------------------------------------------------------------
+// GfxState
+//------------------------------------------------------------------------
+
+class GfxState {
+public:
+  /**
+   * When GfxState::getReusablePath() is invoked, the currently active
+   * path is taken per reference and its coordinates can be re-edited.
+   *
+   * A ReusablePathIterator is intented to reduce overhead when the same
+   * path type is used a lot of times, only with different coordinates. It
+   * allows just to update the coordinates (occuring in the same order as
+   * in the original path).
+   */
+  class ReusablePathIterator {
+  public:
+    /**
+     * Creates the ReusablePathIterator. This should only be done from
+     * GfxState::getReusablePath().
+     *
+     * @param path the path as it is used so far. Changing this path,
+     * deleting it or starting a new path from scratch will most likely
+     * invalidate the iterator (and may cause serious problems). Make
+     * sure the path's memory structure is not changed during the
+     * lifetime of the ReusablePathIterator.
+     */
+    ReusablePathIterator( GfxPath* path );
+
+    /**
+     * Returns true if and only if the current iterator position is
+     * beyond the last valid point.
+     *
+     * A call to setCoord() will be undefined.
+     */
+    bool isEnd() const;
+
+    /**
+     * Advances the iterator.
+     */
+    void next();
+
+     /**
+     * Updates the coordinates associated to the current iterator
+     * position.
+     */
+     void setCoord( double x, double y );
+
+    /**
+     * Resets the iterator.
+     */
+    void reset();
+  private:
+    GfxPath *path;
+    int subPathOff;
+
+    int coordOff;
+    int numCoords;
+
+    GfxSubpath *curSubPath;
+  };
+
+  // Construct a default GfxState, for a device with resolution <hDPI>
+  // x <vDPI>, page box <pageBox>, page rotation <rotateA>, and
+  // coordinate system specified by <upsideDown>.
+  GfxState(double hDPIA, double vDPIA, PDFRectangle *pageBox,
+          int rotateA, GBool upsideDown);
+
+  // Destructor.
+  ~GfxState();
+
+  // Copy.
+  GfxState *copy(GBool copyPath = gFalse)
+    { return new GfxState(this, copyPath); }
+
+  // Accessors.
+  double getHDPI() { return hDPI; }
+  double getVDPI() { return vDPI; }
+  double *getCTM() { return ctm; }
+  void getCTM(Matrix *m) { memcpy (m->m, ctm, sizeof m->m); }
+  double getX1() { return px1; }
+  double getY1() { return py1; }
+  double getX2() { return px2; }
+  double getY2() { return py2; }
+  double getPageWidth() { return pageWidth; }
+  double getPageHeight() { return pageHeight; }
+  int getRotate() { return rotate; }
+  GfxColor *getFillColor() { return &fillColor; }
+  GfxColor *getStrokeColor() { return &strokeColor; }
+  void getFillGray(GfxGray *gray)
+    { fillColorSpace->getGray(&fillColor, gray); }
+  void getStrokeGray(GfxGray *gray)
+    { strokeColorSpace->getGray(&strokeColor, gray); }
+  void getFillRGB(GfxRGB *rgb)
+    { fillColorSpace->getRGB(&fillColor, rgb); }
+  void getStrokeRGB(GfxRGB *rgb)
+    { strokeColorSpace->getRGB(&strokeColor, rgb); }
+  void getFillCMYK(GfxCMYK *cmyk)
+    { fillColorSpace->getCMYK(&fillColor, cmyk); }
+  void getStrokeCMYK(GfxCMYK *cmyk)
+    { strokeColorSpace->getCMYK(&strokeColor, cmyk); }
+  GfxColorSpace *getFillColorSpace() { return fillColorSpace; }
+  GfxColorSpace *getStrokeColorSpace() { return strokeColorSpace; }
+  GfxPattern *getFillPattern() { return fillPattern; }
+  GfxPattern *getStrokePattern() { return strokePattern; }
+  GfxBlendMode getBlendMode() { return blendMode; }
+  double getFillOpacity() { return fillOpacity; }
+  double getStrokeOpacity() { return strokeOpacity; }
+  GBool getFillOverprint() { return fillOverprint; }
+  GBool getStrokeOverprint() { return strokeOverprint; }
+  int getOverprintMode() { return overprintMode; }
+  Function **getTransfer() { return transfer; }
+  double getLineWidth() { return lineWidth; }
+  void getLineDash(double **dash, int *length, double *start)
+    { *dash = lineDash; *length = lineDashLength; *start = lineDashStart; }
+  int getFlatness() { return flatness; }
+  int getLineJoin() { return lineJoin; }
+  int getLineCap() { return lineCap; }
+  double getMiterLimit() { return miterLimit; }
+  GBool getStrokeAdjust() { return strokeAdjust; }
+  GBool getAlphaIsShape() { return alphaIsShape; }
+  GBool getTextKnockout() { return textKnockout; }
+  GfxFont *getFont() { return font; }
+  double getFontSize() { return fontSize; }
+  double *getTextMat() { return textMat; }
+  double getCharSpace() { return charSpace; }
+  double getWordSpace() { return wordSpace; }
+  double getHorizScaling() { return horizScaling; }
+  double getLeading() { return leading; }
+  double getRise() { return rise; }
+  int getRender() { return render; }
+  GfxPath *getPath() { return path; }
+  void setPath(GfxPath *pathA);
+  double getCurX() { return curX; }
+  double getCurY() { return curY; }
+  void getClipBBox(double *xMin, double *yMin, double *xMax, double *yMax)
+    { *xMin = clipXMin; *yMin = clipYMin; *xMax = clipXMax; *yMax = clipYMax; }
+  void getUserClipBBox(double *xMin, double *yMin, double *xMax, double *yMax);
+  double getLineX() { return lineX; }
+  double getLineY() { return lineY; }
+
+  // Is there a current point/path?
+  GBool isCurPt() { return path->isCurPt(); }
+  GBool isPath() { return path->isPath(); }
+
+  // Transforms.
+  void transform(double x1, double y1, double *x2, double *y2)
+    { *x2 = ctm[0] * x1 + ctm[2] * y1 + ctm[4];
+      *y2 = ctm[1] * x1 + ctm[3] * y1 + ctm[5]; }
+  void transformDelta(double x1, double y1, double *x2, double *y2)
+    { *x2 = ctm[0] * x1 + ctm[2] * y1;
+      *y2 = ctm[1] * x1 + ctm[3] * y1; }
+  void textTransform(double x1, double y1, double *x2, double *y2)
+    { *x2 = textMat[0] * x1 + textMat[2] * y1 + textMat[4];
+      *y2 = textMat[1] * x1 + textMat[3] * y1 + textMat[5]; }
+  void textTransformDelta(double x1, double y1, double *x2, double *y2)
+    { *x2 = textMat[0] * x1 + textMat[2] * y1;
+      *y2 = textMat[1] * x1 + textMat[3] * y1; }
+  double transformWidth(double w);
+  double getTransformedLineWidth()
+    { return transformWidth(lineWidth); }
+  double getTransformedFontSize();
+  void getFontTransMat(double *m11, double *m12, double *m21, double *m22);
+
+  // Change state parameters.
+  void setCTM(double a, double b, double c,
+             double d, double e, double f);
+  void concatCTM(double a, double b, double c,
+                double d, double e, double f);
+  void shiftCTM(double tx, double ty);
+  void setFillColorSpace(GfxColorSpace *colorSpace);
+  void setStrokeColorSpace(GfxColorSpace *colorSpace);
+  void setFillColor(GfxColor *color) { fillColor = *color; }
+  void setStrokeColor(GfxColor *color) { strokeColor = *color; }
+  void setFillPattern(GfxPattern *pattern);
+  void setStrokePattern(GfxPattern *pattern);
+  void setBlendMode(GfxBlendMode mode) { blendMode = mode; }
+  void setFillOpacity(double opac) { fillOpacity = opac; }
+  void setStrokeOpacity(double opac) { strokeOpacity = opac; }
+  void setFillOverprint(GBool op) { fillOverprint = op; }
+  void setStrokeOverprint(GBool op) { strokeOverprint = op; }
+  void setOverprintMode(int op) { overprintMode = op; }
+  void setTransfer(Function **funcs);
+  void setLineWidth(double width) { lineWidth = width; }
+  void setLineDash(double *dash, int length, double start);
+  void setFlatness(int flatness1) { flatness = flatness1; }
+  void setLineJoin(int lineJoin1) { lineJoin = lineJoin1; }
+  void setLineCap(int lineCap1) { lineCap = lineCap1; }
+  void setMiterLimit(double limit) { miterLimit = limit; }
+  void setStrokeAdjust(GBool sa) { strokeAdjust = sa; }
+  void setAlphaIsShape(GBool ais) { alphaIsShape = ais; }
+  void setTextKnockout(GBool tk) { textKnockout = tk; }
+  void setFont(GfxFont *fontA, double fontSizeA);
+  void setTextMat(double a, double b, double c,
+                 double d, double e, double f)
+    { textMat[0] = a; textMat[1] = b; textMat[2] = c;
+      textMat[3] = d; textMat[4] = e; textMat[5] = f; }
+  void setCharSpace(double space)
+    { charSpace = space; }
+  void setWordSpace(double space)
+    { wordSpace = space; }
+  void setHorizScaling(double scale)
+    { horizScaling = 0.01 * scale; }
+  void setLeading(double leadingA)
+    { leading = leadingA; }
+  void setRise(double riseA)
+    { rise = riseA; }
+  void setRender(int renderA)
+    { render = renderA; }
+
+  // Add to path.
+  void moveTo(double x, double y)
+    { path->moveTo(curX = x, curY = y); }
+  void lineTo(double x, double y)
+    { path->lineTo(curX = x, curY = y); }
+  void curveTo(double x1, double y1, double x2, double y2,
+              double x3, double y3)
+    { path->curveTo(x1, y1, x2, y2, curX = x3, curY = y3); }
+  void closePath()
+    { path->close(); curX = path->getLastX(); curY = path->getLastY(); }
+  void clearPath();
+
+  // Update clip region.
+  void clip();
+  void clipToStrokePath();
+  void clipToRect(double xMin, double yMin, double xMax, double yMax);
+
+  // Text position.
+  void textSetPos(double tx, double ty) { lineX = tx; lineY = ty; }
+  void textMoveTo(double tx, double ty)
+    { lineX = tx; lineY = ty; textTransform(tx, ty, &curX, &curY); }
+  void textShift(double tx, double ty);
+  void shift(double dx, double dy);
+
+  // Push/pop GfxState on/off stack.
+  GfxState *save();
+  GfxState *restore();
+  GBool hasSaves() { return saved != NULL; }
+  GBool isParentState(GfxState *state) { return saved == state || (saved && saved->isParentState(state)); }
+
+  // Misc
+  GBool parseBlendMode(Object *obj, GfxBlendMode *mode);
+
+  ReusablePathIterator *getReusablePath() { return new ReusablePathIterator(path); }
+private:
+
+  double hDPI, vDPI;           // resolution
+  double ctm[6];               // coord transform matrix
+  double px1, py1, px2, py2;   // page corners (user coords)
+  double pageWidth, pageHeight;        // page size (pixels)
+  int rotate;                  // page rotation angle
+
+  GfxColorSpace *fillColorSpace;   // fill color space
+  GfxColorSpace *strokeColorSpace; // stroke color space
+  GfxColor fillColor;          // fill color
+  GfxColor strokeColor;                // stroke color
+  GfxPattern *fillPattern;     // fill pattern
+  GfxPattern *strokePattern;   // stroke pattern
+  GfxBlendMode blendMode;      // transparency blend mode
+  double fillOpacity;          // fill opacity
+  double strokeOpacity;                // stroke opacity
+  GBool fillOverprint;         // fill overprint
+  GBool strokeOverprint;       // stroke overprint
+  int overprintMode;           // overprint mode
+  Function *transfer[4];       // transfer function (entries may be: all
+                               //   NULL = identity; last three NULL =
+                               //   single function; all four non-NULL =
+                               //   R,G,B,gray functions)
+
+  double lineWidth;            // line width
+  double *lineDash;            // line dash
+  int lineDashLength;
+  double lineDashStart;
+  int flatness;                        // curve flatness
+  int lineJoin;                        // line join style
+  int lineCap;                 // line cap style
+  double miterLimit;           // line miter limit
+  GBool strokeAdjust;          // stroke adjustment
+  GBool alphaIsShape;          // alpha is shape
+  GBool textKnockout;          // text knockout
+
+  GfxFont *font;               // font
+  double fontSize;             // font size
+  double textMat[6];           // text matrix
+  double charSpace;            // character spacing
+  double wordSpace;            // word spacing
+  double horizScaling;         // horizontal scaling
+  double leading;              // text leading
+  double rise;                 // text rise
+  int render;                  // text rendering mode
+
+  GfxPath *path;               // array of path elements
+  double curX, curY;           // current point (user coords)
+  double lineX, lineY;         // start of current text line (text coords)
+
+  double clipXMin, clipYMin,   // bounding box for clip region
+         clipXMax, clipYMax;
+
+  GfxState *saved;             // next GfxState on stack
+
+  GfxState(GfxState *state, GBool copyPath);
+};
+
+#endif
diff --git a/poppler/GfxState_helpers.h b/poppler/GfxState_helpers.h
new file mode 100644 (file)
index 0000000..bc0024e
--- /dev/null
@@ -0,0 +1,82 @@
+//========================================================================
+//
+// GfxState.cc
+//
+// Copyright 1996-2003 Glyph & Cog, LLC
+//
+//========================================================================
+
+//========================================================================
+//
+// Modified under the Poppler project - http://poppler.freedesktop.org
+//
+// All changes made under the Poppler project to this file are licensed
+// under GPL version 2 or later
+//
+// Copyright (C) 2009, 2011 Albert Astals Cid <aacid@kde.org>
+//
+// To see a description of the changes please see the Changelog file that
+// came with your tarball or type make ChangeLog if you are building from git
+//
+//========================================================================
+
+#include "GfxState.h"
+
+static inline GfxColorComp clip01(GfxColorComp x) {
+  return (x < 0) ? 0 : (x > gfxColorComp1) ? gfxColorComp1 : x;
+}
+
+static inline double clip01(double x) {
+  return (x < 0) ? 0 : (x > 1) ? 1 : x;
+}
+
+static inline void cmykToRGBMatrixMultiplication(const double &c, const double &m, const double &y, const double &k, const double &c1, const double &m1, const double &y1, const double &k1, double &r, double &g, double &b)
+{
+  double x;
+  // this is a matrix multiplication, unrolled for performance
+  //                        C M Y K
+  x = c1 * m1 * y1 * k1; // 0 0 0 0
+  r = g = b = x;
+  x = c1 * m1 * y1 * k;  // 0 0 0 1
+  r += 0.1373 * x;
+  g += 0.1216 * x;
+  b += 0.1255 * x;
+  x = c1 * m1 * y  * k1; // 0 0 1 0
+  r += x;
+  g += 0.9490 * x;
+  x = c1 * m1 * y  * k;  // 0 0 1 1
+  r += 0.1098 * x;
+  g += 0.1020 * x;
+  x = c1 * m  * y1 * k1; // 0 1 0 0
+  r += 0.9255 * x;
+  b += 0.5490 * x;
+  x = c1 * m  * y1 * k;  // 0 1 0 1
+  r += 0.1412 * x;
+  x = c1 * m  * y  * k1; // 0 1 1 0
+  r += 0.9294 * x;
+  g += 0.1098 * x;
+  b += 0.1412 * x;
+  x = c1 * m  * y  * k;  // 0 1 1 1
+  r += 0.1333 * x;
+  x = c  * m1 * y1 * k1; // 1 0 0 0
+  g += 0.6784 * x;
+  b += 0.9373 * x;
+  x = c  * m1 * y1 * k;  // 1 0 0 1
+  g += 0.0588 * x;
+  b += 0.1412 * x;
+  x = c  * m1 * y  * k1; // 1 0 1 0
+  g += 0.6510 * x;
+  b += 0.3137 * x;
+  x = c  * m1 * y  * k;  // 1 0 1 1
+  g += 0.0745 * x;
+  x = c  * m  * y1 * k1; // 1 1 0 0
+  r += 0.1804 * x;
+  g += 0.1922 * x;
+  b += 0.5725 * x;
+  x = c  * m  * y1 * k;  // 1 1 0 1
+  b += 0.0078 * x;
+  x = c  * m  * y  * k1; // 1 1 1 0
+  r += 0.2118 * x;
+  g += 0.2119 * x;
+  b += 0.2235 * x;
+}
diff --git a/poppler/GlobalParams.cc b/poppler/GlobalParams.cc
new file mode 100644 (file)
index 0000000..76394ca
--- /dev/null
@@ -0,0 +1,2283 @@
+//========================================================================
+//
+// GlobalParams.cc
+//
+// Copyright 2001-2003 Glyph & Cog, LLC
+//
+//========================================================================
+
+//========================================================================
+//
+// Modified under the Poppler project - http://poppler.freedesktop.org
+//
+// All changes made under the Poppler project to this file are licensed
+// under GPL version 2 or later
+//
+// Copyright (C) 2005 Martin Kretzschmar <martink@gnome.org>
+// Copyright (C) 2005, 2006 Kristian Høgsberg <krh@redhat.com>
+// Copyright (C) 2005, 2007-2010, 2012 Albert Astals Cid <aacid@kde.org>
+// Copyright (C) 2005 Jonathan Blandford <jrb@redhat.com>
+// Copyright (C) 2006, 2007 Jeff Muizelaar <jeff@infidigm.net>
+// Copyright (C) 2006 Takashi Iwai <tiwai@suse.de>
+// Copyright (C) 2006 Ed Catmur <ed@catmur.co.uk>
+// Copyright (C) 2007 Krzysztof Kowalczyk <kkowalczyk@gmail.com>
+// Copyright (C) 2007, 2009 Jonathan Kew <jonathan_kew@sil.org>
+// Copyright (C) 2009 Petr Gajdos <pgajdos@novell.com>
+// Copyright (C) 2009, 2011, 2012 William Bader <williambader@hotmail.com>
+// Copyright (C) 2009 Kovid Goyal <kovid@kovidgoyal.net>
+// Copyright (C) 2010 Hib Eris <hib@hiberis.nl>
+// Copyright (C) 2010 Patrick Spendrin <ps_ml@gmx.de>
+// Copyright (C) 2010 Jakub Wilk <ubanus@users.sf.net>
+// Copyright (C) 2011 Pino Toscano <pino@kde.org>
+// Copyright (C) 2011 Koji Otani <sho@bbr.jp>
+// Copyright (C) 2012 Yi Yang <ahyangyi@gmail.com>
+// Copyright (C) 2012 Adrian Johnson <ajohnson@redneon.com>
+// Copyright (C) 2012 Thomas Freitag <Thomas.Freitag@alfa.de>
+// Copyright (C) 2012 Peter Breitenlohner <peb@mppmu.mpg.de>
+//
+// To see a description of the changes please see the Changelog file that
+// came with your tarball or type make ChangeLog if you are building from git
+//
+//========================================================================
+
+#include <config.h>
+
+#ifdef USE_GCC_PRAGMAS
+#pragma implementation
+#endif
+
+#include <string.h>
+#include <stdio.h>
+#include <ctype.h>
+#ifdef ENABLE_PLUGINS
+#  ifndef _WIN32
+#    include <dlfcn.h>
+#  endif
+#endif
+#ifdef _WIN32
+#  include <shlobj.h>
+#  include <mbstring.h>
+#endif
+#include "goo/gmem.h"
+#include "goo/GooString.h"
+#include "goo/GooList.h"
+#include "goo/GooHash.h"
+#include "goo/gfile.h"
+#include "Error.h"
+#include "NameToCharCode.h"
+#include "CharCodeToUnicode.h"
+#include "UnicodeMap.h"
+#include "CMap.h"
+#include "BuiltinFontTables.h"
+#include "FontEncodingTables.h"
+#ifdef ENABLE_PLUGINS
+#  include "XpdfPluginAPI.h"
+#endif
+#include "GlobalParams.h"
+#include "GfxFont.h"
+
+#if WITH_FONTCONFIGURATION_FONTCONFIG
+#include <fontconfig/fontconfig.h>
+#endif
+
+#ifdef _WIN32
+#  define strcasecmp stricmp
+#else
+#  include <strings.h>
+#endif
+
+#if MULTITHREADED
+#  define lockGlobalParams            gLockMutex(&mutex)
+#  define lockUnicodeMapCache         gLockMutex(&unicodeMapCacheMutex)
+#  define lockCMapCache               gLockMutex(&cMapCacheMutex)
+#  define unlockGlobalParams          gUnlockMutex(&mutex)
+#  define unlockUnicodeMapCache       gUnlockMutex(&unicodeMapCacheMutex)
+#  define unlockCMapCache             gUnlockMutex(&cMapCacheMutex)
+#else
+#  define lockGlobalParams
+#  define lockUnicodeMapCache
+#  define lockCMapCache
+#  define unlockGlobalParams
+#  define unlockUnicodeMapCache
+#  define unlockCMapCache
+#endif
+
+#ifndef FC_WEIGHT_BOOK
+#define FC_WEIGHT_BOOK 75
+#endif
+
+#include "NameToUnicodeTable.h"
+#include "UnicodeMapTables.h"
+#include "UTF8.h"
+
+#ifdef ENABLE_PLUGINS
+#  ifdef _WIN32
+extern XpdfPluginVecTable xpdfPluginVecTable;
+#  endif
+#endif
+
+//------------------------------------------------------------------------
+
+#define cidToUnicodeCacheSize     4
+#define unicodeToUnicodeCacheSize 4
+
+//------------------------------------------------------------------------
+
+GlobalParams *globalParams = NULL;
+
+//------------------------------------------------------------------------
+// PSFontParam16
+//------------------------------------------------------------------------
+
+PSFontParam16::PSFontParam16(GooString *nameA, int wModeA,
+                            GooString *psFontNameA, GooString *encodingA) {
+  name = nameA;
+  wMode = wModeA;
+  psFontName = psFontNameA;
+  encoding = encodingA;
+}
+
+PSFontParam16::~PSFontParam16() {
+  delete name;
+  delete psFontName;
+  delete encoding;
+}
+
+#if ENABLE_RELOCATABLE && defined(_WIN32)
+
+/* search for data relative to where we are installed */
+
+static HMODULE hmodule;
+
+extern "C" {
+BOOL WINAPI
+DllMain (HINSTANCE hinstDLL,
+        DWORD     fdwReason,
+        LPVOID    lpvReserved)
+{
+  switch (fdwReason)
+    {
+    case DLL_PROCESS_ATTACH:
+      hmodule = hinstDLL;
+      break;
+    }
+
+  return TRUE;
+}
+}
+
+static char *
+get_poppler_datadir (void)
+{
+  static char retval[MAX_PATH];
+  static int beenhere = 0;
+
+  unsigned char *p;
+
+  if (beenhere)
+    return retval;
+
+  if (!GetModuleFileName (hmodule, (CHAR *) retval, sizeof(retval) - 20))
+    return POPPLER_DATADIR;
+
+  p = _mbsrchr ((unsigned char *) retval, '\\');
+  *p = '\0';
+  p = _mbsrchr ((unsigned char *) retval, '\\');
+  if (p) {
+    if (stricmp ((const char *) (p+1), "bin") == 0)
+      *p = '\0';
+  }
+  strcat (retval, "\\share\\poppler");
+
+  beenhere = 1;
+
+  return retval;
+}
+
+#undef POPPLER_DATADIR
+#define POPPLER_DATADIR get_poppler_datadir ()
+
+#endif
+
+//------------------------------------------------------------------------
+// SysFontInfo
+//------------------------------------------------------------------------
+
+class SysFontInfo {
+public:
+
+  GooString *name;
+  GBool bold;
+  GBool italic;
+  GBool oblique;
+  GBool fixedWidth;
+  GooString *path;
+  SysFontType type;
+  int fontNum;                 // for TrueType collections
+  GooString *substituteName;
+
+  SysFontInfo(GooString *nameA, GBool boldA, GBool italicA, GBool obliqueA, GBool fixedWidthA,
+             GooString *pathA, SysFontType typeA, int fontNumA, GooString *substituteNameA);
+  ~SysFontInfo();
+  GBool match(SysFontInfo *fi);
+  GBool match(GooString *nameA, GBool boldA, GBool italicA, GBool obliqueA, GBool fixedWidthA);
+  GBool match(GooString *nameA, GBool boldA, GBool italicA);
+};
+
+SysFontInfo::SysFontInfo(GooString *nameA, GBool boldA, GBool italicA, GBool obliqueA, GBool fixedWidthA,
+                        GooString *pathA, SysFontType typeA, int fontNumA, GooString *substituteNameA) {
+  name = nameA;
+  bold = boldA;
+  italic = italicA;
+  oblique = obliqueA;
+  fixedWidth = fixedWidthA;
+  path = pathA;
+  type = typeA;
+  fontNum = fontNumA;
+  substituteName = substituteNameA;
+}
+
+SysFontInfo::~SysFontInfo() {
+  delete name;
+  delete path;
+  delete substituteName;
+}
+
+GBool SysFontInfo::match(SysFontInfo *fi) {
+  return !strcasecmp(name->getCString(), fi->name->getCString()) &&
+         bold == fi->bold && italic == fi->italic && oblique == fi->oblique && fixedWidth == fi->fixedWidth;
+}
+
+GBool SysFontInfo::match(GooString *nameA, GBool boldA, GBool italicA, GBool obliqueA, GBool fixedWidthA) {
+  return !strcasecmp(name->getCString(), nameA->getCString()) &&
+         bold == boldA && italic == italicA && oblique == obliqueA && fixedWidth == fixedWidthA;
+}
+
+GBool SysFontInfo::match(GooString *nameA, GBool boldA, GBool italicA) {
+  return !strcasecmp(name->getCString(), nameA->getCString()) &&
+         bold == boldA && italic == italicA;
+}
+
+//------------------------------------------------------------------------
+// SysFontList
+//------------------------------------------------------------------------
+
+class SysFontList {
+public:
+
+  SysFontList();
+  ~SysFontList();
+  SysFontInfo *find(GooString *name, GBool isFixedWidth, GBool exact);
+
+#ifdef WIN32
+  void scanWindowsFonts(GooString *winFontDir);
+#endif
+#ifdef WITH_FONTCONFIGURATION_FONTCONFIG
+  void addFcFont(SysFontInfo *si) {fonts->append(si);}
+#endif
+private:
+
+#ifdef WIN32
+  SysFontInfo *makeWindowsFont(char *name, int fontNum,
+                              char *path);
+#endif
+
+  GooList *fonts;                      // [SysFontInfo]
+};
+
+SysFontList::SysFontList() {
+  fonts = new GooList();
+}
+
+SysFontList::~SysFontList() {
+  deleteGooList(fonts, SysFontInfo);
+}
+
+SysFontInfo *SysFontList::find(GooString *name, GBool fixedWidth, GBool exact) {
+  GooString *name2;
+  GBool bold, italic, oblique;
+  SysFontInfo *fi;
+  char c;
+  int n, i;
+
+  name2 = name->copy();
+
+  // remove space, comma, dash chars
+  i = 0;
+  while (i < name2->getLength()) {
+    c = name2->getChar(i);
+    if (c == ' ' || c == ',' || c == '-') {
+      name2->del(i);
+    } else {
+      ++i;
+    }
+  }
+  n = name2->getLength();
+
+  // remove trailing "MT" (Foo-MT, Foo-BoldMT, etc.)
+  if (n > 2 && !strcmp(name2->getCString() + n - 2, "MT")) {
+    name2->del(n - 2, 2);
+    n -= 2;
+  }
+
+  // look for "Regular"
+  if (n > 7 && !strcmp(name2->getCString() + n - 7, "Regular")) {
+    name2->del(n - 7, 7);
+    n -= 7;
+  }
+
+  // look for "Italic"
+  if (n > 6 && !strcmp(name2->getCString() + n - 6, "Italic")) {
+    name2->del(n - 6, 6);
+    italic = gTrue;
+    n -= 6;
+  } else {
+    italic = gFalse;
+  }
+
+  // look for "Oblique"
+  if (n > 6 && !strcmp(name2->getCString() + n - 7, "Oblique")) {
+    name2->del(n - 7, 7);
+    oblique = gTrue;
+    n -= 6;
+  } else {
+    oblique = gFalse;
+  }
+
+  // look for "Bold"
+  if (n > 4 && !strcmp(name2->getCString() + n - 4, "Bold")) {
+    name2->del(n - 4, 4);
+    bold = gTrue;
+    n -= 4;
+  } else {
+    bold = gFalse;
+  }
+
+  // remove trailing "MT" (FooMT-Bold, etc.)
+  if (n > 2 && !strcmp(name2->getCString() + n - 2, "MT")) {
+    name2->del(n - 2, 2);
+    n -= 2;
+  }
+
+  // remove trailing "PS"
+  if (n > 2 && !strcmp(name2->getCString() + n - 2, "PS")) {
+    name2->del(n - 2, 2);
+    n -= 2;
+  }
+
+  // remove trailing "IdentityH"
+  if (n > 9 && !strcmp(name2->getCString() + n - 9, "IdentityH")) {
+    name2->del(n - 9, 9);
+    n -= 9;
+  }
+
+  // search for the font
+  fi = NULL;
+  for (i = 0; i < fonts->getLength(); ++i) {
+    fi = (SysFontInfo *)fonts->get(i);
+    if (fi->match(name2, bold, italic, oblique, fixedWidth)) {
+      break;
+    }
+    fi = NULL;
+  }
+  if (!fi && !exact && bold) {
+    // try ignoring the bold flag
+    for (i = 0; i < fonts->getLength(); ++i) {
+      fi = (SysFontInfo *)fonts->get(i);
+      if (fi->match(name2, gFalse, italic)) {
+       break;
+      }
+      fi = NULL;
+    }
+  }
+  if (!fi && !exact && (bold || italic)) {
+    // try ignoring the bold and italic flags
+    for (i = 0; i < fonts->getLength(); ++i) {
+      fi = (SysFontInfo *)fonts->get(i);
+      if (fi->match(name2, gFalse, gFalse)) {
+       break;
+      }
+      fi = NULL;
+    }
+  }
+
+  delete name2;
+  return fi;
+}
+
+
+#ifdef ENABLE_PLUGINS
+//------------------------------------------------------------------------
+// Plugin
+//------------------------------------------------------------------------
+
+class Plugin {
+public:
+
+  static Plugin *load(char *type, char *name);
+  ~Plugin();
+
+private:
+
+#ifdef _WIN32
+  Plugin(HMODULE libA);
+  HMODULE lib;
+#else
+  Plugin(void *dlA);
+  void *dl;
+#endif
+};
+
+Plugin *Plugin::load(char *type, char *name) {
+  GooString *path;
+  Plugin *plugin;
+  XpdfPluginVecTable *vt;
+  XpdfBool (*xpdfInitPlugin)(void);
+#ifdef _WIN32
+  HMODULE libA;
+#else
+  void *dlA;
+#endif
+
+  path = globalParams->getBaseDir();
+  appendToPath(path, "plugins");
+  appendToPath(path, type);
+  appendToPath(path, name);
+
+#ifdef _WIN32
+  path->append(".dll");
+  if (!(libA = LoadLibrary(path->getCString()))) {
+    error(errIO, -1, "Failed to load plugin '{0:t}'", path);
+    goto err1;
+  }
+  if (!(vt = (XpdfPluginVecTable *)
+                GetProcAddress(libA, "xpdfPluginVecTable"))) {
+    error(errIO, -1, "Failed to find xpdfPluginVecTable in plugin '{0:t}'",
+         path);
+    goto err2;
+  }
+#else
+  //~ need to deal with other extensions here
+  path->append(".so");
+  if (!(dlA = dlopen(path->getCString(), RTLD_NOW))) {
+    error(errIO, -1, "Failed to load plugin '{0:t}': {1:s}",
+         path, dlerror());
+    goto err1;
+  }
+  if (!(vt = (XpdfPluginVecTable *)dlsym(dlA, "xpdfPluginVecTable"))) {
+    error(errIO, -1, "Failed to find xpdfPluginVecTable in plugin '{0:t}'",
+         path);
+    goto err2;
+  }
+#endif
+
+  if (vt->version != xpdfPluginVecTable.version) {
+    error(errIO, -1, "Plugin '{0:t}' is wrong version", path);
+    goto err2;
+  }
+  memcpy(vt, &xpdfPluginVecTable, sizeof(xpdfPluginVecTable));
+
+#ifdef _WIN32
+  if (!(xpdfInitPlugin = (XpdfBool (*)(void))
+                            GetProcAddress(libA, "xpdfInitPlugin"))) {
+    error(errIO, -1, "Failed to find xpdfInitPlugin in plugin '{0:t}'",
+         path);
+    goto err2;
+  }
+#else
+  if (!(xpdfInitPlugin = (XpdfBool (*)(void))dlsym(dlA, "xpdfInitPlugin"))) {
+    error(errIO, -1, "Failed to find xpdfInitPlugin in plugin '{0:t}'",
+         path);
+    goto err2;
+  }
+#endif
+
+  if (!(*xpdfInitPlugin)()) {
+    error(errIO, -1, "Initialization of plugin '{0:t}' failed", path);
+    goto err2;
+  }
+
+#ifdef _WIN32
+  plugin = new Plugin(libA);
+#else
+  plugin = new Plugin(dlA);
+#endif
+
+  delete path;
+  return plugin;
+
+ err2:
+#ifdef _WIN32
+  FreeLibrary(libA);
+#else
+  dlclose(dlA);
+#endif
+ err1:
+  delete path;
+  return NULL;
+}
+
+#ifdef _WIN32
+Plugin::Plugin(HMODULE libA) {
+  lib = libA;
+}
+#else
+Plugin::Plugin(void *dlA) {
+  dl = dlA;
+}
+#endif
+
+Plugin::~Plugin() {
+  void (*xpdfFreePlugin)(void);
+
+#ifdef _WIN32
+  if ((xpdfFreePlugin = (void (*)(void))
+                            GetProcAddress(lib, "xpdfFreePlugin"))) {
+    (*xpdfFreePlugin)();
+  }
+  FreeLibrary(lib);
+#else
+  if ((xpdfFreePlugin = (void (*)(void))dlsym(dl, "xpdfFreePlugin"))) {
+    (*xpdfFreePlugin)();
+  }
+  dlclose(dl);
+#endif
+}
+
+#endif // ENABLE_PLUGINS
+
+//------------------------------------------------------------------------
+// parsing
+//------------------------------------------------------------------------
+
+GlobalParams::GlobalParams(const char *customPopplerDataDir)
+  : popplerDataDir(customPopplerDataDir)
+{
+  UnicodeMap *map;
+  int i;
+
+#if MULTITHREADED
+  gInitMutex(&mutex);
+  gInitMutex(&unicodeMapCacheMutex);
+  gInitMutex(&cMapCacheMutex);
+#endif
+
+  initBuiltinFontTables();
+
+  // scan the encoding in reverse because we want the lowest-numbered
+  // index for each char name ('space' is encoded twice)
+  macRomanReverseMap = new NameToCharCode();
+  for (i = 255; i >= 0; --i) {
+    if (macRomanEncoding[i]) {
+      macRomanReverseMap->add(macRomanEncoding[i], (CharCode)i);
+    }
+  }
+
+#ifdef _WIN32
+  // baseDir will be set by a call to setBaseDir
+  baseDir = new GooString();
+  substFiles = new GooHash(gTrue);
+#else
+  baseDir = appendToPath(getHomeDir(), ".xpdf");
+#endif
+  nameToUnicode = new NameToCharCode();
+  cidToUnicodes = new GooHash(gTrue);
+  unicodeToUnicodes = new GooHash(gTrue);
+  residentUnicodeMaps = new GooHash();
+  unicodeMaps = new GooHash(gTrue);
+  cMapDirs = new GooHash(gTrue);
+  toUnicodeDirs = new GooList();
+  fontFiles = new GooHash(gTrue);
+  fontDirs = new GooList();
+  ccFontFiles = new GooHash(gTrue);
+  sysFonts = new SysFontList();
+  psExpandSmaller = gFalse;
+  psShrinkLarger = gTrue;
+  psCenter = gTrue;
+  psLevel = psLevel2;
+  psFile = NULL;
+  psResidentFonts = new GooHash(gTrue);
+  psResidentFonts16 = new GooList();
+  psResidentFontsCC = new GooList();
+  psEmbedType1 = gTrue;
+  psEmbedTrueType = gTrue;
+  psEmbedCIDPostScript = gTrue;
+  psEmbedCIDTrueType = gTrue;
+  psFontPassthrough = gFalse;
+  psPreload = gFalse;
+  psOPI = gFalse;
+  psASCIIHex = gFalse;
+  psBinary = gFalse;
+  psUncompressPreloadedImages = gFalse;
+  psRasterResolution = 300;
+  psRasterMono = gFalse;
+  textEncoding = new GooString("UTF-8");
+#if defined(_WIN32)
+  textEOL = eolDOS;
+#elif defined(MACOS)
+  textEOL = eolMac;
+#else
+  textEOL = eolUnix;
+#endif
+  textPageBreaks = gTrue;
+  textKeepTinyChars = gFalse;
+  enableFreeType = gTrue;
+  antialias = gTrue;
+  vectorAntialias = gTrue;
+  antialiasPrinting = gFalse;
+  strokeAdjust = gTrue;
+  screenType = screenUnset;
+  screenSize = -1;
+  screenDotRadius = -1;
+  screenGamma = 1.0;
+  screenBlackThreshold = 0.0;
+  screenWhiteThreshold = 1.0;
+  minLineWidth = 0.0;
+  overprintPreview = gFalse;
+  mapNumericCharNames = gTrue;
+  mapUnknownCharNames = gFalse;
+  printCommands = gFalse;
+  profileCommands = gFalse;
+  errQuiet = gFalse;
+
+  cidToUnicodeCache = new CharCodeToUnicodeCache(cidToUnicodeCacheSize);
+  unicodeToUnicodeCache =
+      new CharCodeToUnicodeCache(unicodeToUnicodeCacheSize);
+  unicodeMapCache = new UnicodeMapCache();
+  cMapCache = new CMapCache();
+
+  baseFontsInitialized = gFalse;
+#ifdef ENABLE_PLUGINS
+  plugins = new GooList();
+  securityHandlers = new GooList();
+#endif
+
+  // set up the initial nameToUnicode table
+  for (i = 0; nameToUnicodeTab[i].name; ++i) {
+    nameToUnicode->add(nameToUnicodeTab[i].name, nameToUnicodeTab[i].u);
+  }
+
+  // set up the residentUnicodeMaps table
+  map = new UnicodeMap("Latin1", gFalse,
+                      latin1UnicodeMapRanges, latin1UnicodeMapLen);
+  residentUnicodeMaps->add(map->getEncodingName(), map);
+  map = new UnicodeMap("ASCII7", gFalse,
+                      ascii7UnicodeMapRanges, ascii7UnicodeMapLen);
+  residentUnicodeMaps->add(map->getEncodingName(), map);
+  map = new UnicodeMap("Symbol", gFalse,
+                      symbolUnicodeMapRanges, symbolUnicodeMapLen);
+  residentUnicodeMaps->add(map->getEncodingName(), map);
+  map = new UnicodeMap("ZapfDingbats", gFalse, zapfDingbatsUnicodeMapRanges,
+                      zapfDingbatsUnicodeMapLen);
+  residentUnicodeMaps->add(map->getEncodingName(), map);
+  map = new UnicodeMap("UTF-8", gTrue, &mapUTF8);
+  residentUnicodeMaps->add(map->getEncodingName(), map);
+  map = new UnicodeMap("UCS-2", gTrue, &mapUCS2);
+  residentUnicodeMaps->add(map->getEncodingName(), map);
+
+  scanEncodingDirs();
+}
+
+void GlobalParams::scanEncodingDirs() {
+  GDir *dir;
+  GDirEntry *entry;
+  const char *dataRoot = popplerDataDir ? popplerDataDir : POPPLER_DATADIR;
+  
+  // allocate buffer large enough to append "/nameToUnicode"
+  size_t bufSize = strlen(dataRoot) + strlen("/nameToUnicode") + 1;
+  char *dataPathBuffer = new char[bufSize];
+  
+  snprintf(dataPathBuffer, bufSize, "%s/nameToUnicode", dataRoot);
+  dir = new GDir(dataPathBuffer, gTrue);
+  while (entry = dir->getNextEntry(), entry != NULL) {
+    if (!entry->isDir()) {
+      parseNameToUnicode(entry->getFullPath());
+    }
+    delete entry;
+  }
+  delete dir;
+
+  snprintf(dataPathBuffer, bufSize, "%s/cidToUnicode", dataRoot);
+  dir = new GDir(dataPathBuffer, gFalse);
+  while (entry = dir->getNextEntry(), entry != NULL) {
+    addCIDToUnicode(entry->getName(), entry->getFullPath());
+    delete entry;
+  }
+  delete dir;
+
+  snprintf(dataPathBuffer, bufSize, "%s/unicodeMap", dataRoot);
+  dir = new GDir(dataPathBuffer, gFalse);
+  while (entry = dir->getNextEntry(), entry != NULL) {
+    addUnicodeMap(entry->getName(), entry->getFullPath());
+    delete entry;
+  }
+  delete dir;
+
+  snprintf(dataPathBuffer, bufSize, "%s/cMap", dataRoot);
+  dir = new GDir(dataPathBuffer, gFalse);
+  while (entry = dir->getNextEntry(), entry != NULL) {
+    addCMapDir(entry->getName(), entry->getFullPath());
+    toUnicodeDirs->append(entry->getFullPath()->copy());
+    delete entry;
+  }
+  delete dir;
+  
+  delete[] dataPathBuffer;
+}
+
+void GlobalParams::parseNameToUnicode(GooString *name) {
+  char *tok1, *tok2;
+  FILE *f;
+  char buf[256];
+  int line;
+  Unicode u;
+  char *tokptr;
+
+  if (!(f = openFile(name->getCString(), "r"))) {
+    error(errIO, -1, "Couldn't open 'nameToUnicode' file '{0:t}'",
+         name);
+    return;
+  }
+  line = 1;
+  while (getLine(buf, sizeof(buf), f)) {
+    tok1 = strtok_r(buf, " \t\r\n", &tokptr);
+    tok2 = strtok_r(NULL, " \t\r\n", &tokptr);
+    if (tok1 && tok2) {
+      sscanf(tok1, "%x", &u);
+      nameToUnicode->add(tok2, u);
+    } else {
+      error(errConfig, -1, "Bad line in 'nameToUnicode' file ({0:t}:{1:d})",
+           name, line);
+    }
+    ++line;
+  }
+  fclose(f);
+}
+
+void GlobalParams::addCIDToUnicode(GooString *collection,
+                                  GooString *fileName) {
+  GooString *old;
+
+  if ((old = (GooString *)cidToUnicodes->remove(collection))) {
+    delete old;
+  }
+  cidToUnicodes->add(collection->copy(), fileName->copy());
+}
+
+void GlobalParams::addUnicodeMap(GooString *encodingName, GooString *fileName)
+{
+  GooString *old;
+
+  if ((old = (GooString *)unicodeMaps->remove(encodingName))) {
+    delete old;
+  }
+  unicodeMaps->add(encodingName->copy(), fileName->copy());
+}
+
+void GlobalParams::addCMapDir(GooString *collection, GooString *dir) {
+  GooList *list;
+
+  if (!(list = (GooList *)cMapDirs->lookup(collection))) {
+    list = new GooList();
+    cMapDirs->add(collection->copy(), list);
+  }
+  list->append(dir->copy());
+}
+
+GBool GlobalParams::parseYesNo2(const char *token, GBool *flag) {
+  if (!strcmp(token, "yes")) {
+    *flag = gTrue;
+  } else if (!strcmp(token, "no")) {
+    *flag = gFalse;
+  } else {
+    return gFalse;
+  }
+  return gTrue;
+}
+
+GlobalParams::~GlobalParams() {
+  freeBuiltinFontTables();
+
+  delete macRomanReverseMap;
+
+  delete baseDir;
+  delete nameToUnicode;
+  deleteGooHash(cidToUnicodes, GooString);
+  deleteGooHash(unicodeToUnicodes, GooString);
+  deleteGooHash(residentUnicodeMaps, UnicodeMap);
+  deleteGooHash(unicodeMaps, GooString);
+  deleteGooList(toUnicodeDirs, GooString);
+  deleteGooHash(fontFiles, GooString);
+  deleteGooList(fontDirs, GooString);
+  deleteGooHash(ccFontFiles, GooString);
+#ifdef _WIN32
+  deleteGooHash(substFiles, GooString);
+#endif
+  delete sysFonts;
+  if (psFile) {
+    delete psFile;
+  }
+  deleteGooHash(psResidentFonts, GooString);
+  deleteGooList(psResidentFonts16, PSFontParam16);
+  deleteGooList(psResidentFontsCC, PSFontParam16);
+  delete textEncoding;
+
+  GooHashIter *iter;
+  GooString *key;
+  cMapDirs->startIter(&iter);
+  void *val;
+  while (cMapDirs->getNext(&iter, &key, &val)) {
+    GooList* list = (GooList*)val;
+    deleteGooList(list, GooString);
+  }
+  delete cMapDirs;
+
+  delete cidToUnicodeCache;
+  delete unicodeToUnicodeCache;
+  delete unicodeMapCache;
+  delete cMapCache;
+
+#ifdef ENABLE_PLUGINS
+  delete securityHandlers;
+  deleteGooList(plugins, Plugin);
+#endif
+
+#if MULTITHREADED
+  gDestroyMutex(&mutex);
+  gDestroyMutex(&unicodeMapCacheMutex);
+  gDestroyMutex(&cMapCacheMutex);
+#endif
+}
+
+//------------------------------------------------------------------------
+
+void GlobalParams::setBaseDir(const char *dir) {
+  delete baseDir;
+  baseDir = new GooString(dir);
+}
+
+//------------------------------------------------------------------------
+// accessors
+//------------------------------------------------------------------------
+
+CharCode GlobalParams::getMacRomanCharCode(char *charName) {
+  // no need to lock - macRomanReverseMap is constant
+  return macRomanReverseMap->lookup(charName);
+}
+
+GooString *GlobalParams::getBaseDir() {
+  GooString *s;
+
+  lockGlobalParams;
+  s = baseDir->copy();
+  unlockGlobalParams;
+  return s;
+}
+
+Unicode GlobalParams::mapNameToUnicode(const char *charName) {
+  // no need to lock - nameToUnicode is constant
+  return nameToUnicode->lookup(charName);
+}
+
+UnicodeMap *GlobalParams::getResidentUnicodeMap(GooString *encodingName) {
+  UnicodeMap *map;
+
+  lockGlobalParams;
+  map = (UnicodeMap *)residentUnicodeMaps->lookup(encodingName);
+  unlockGlobalParams;
+  if (map) {
+    map->incRefCnt();
+  }
+  return map;
+}
+
+FILE *GlobalParams::getUnicodeMapFile(GooString *encodingName) {
+  GooString *fileName;
+  FILE *f;
+
+  lockGlobalParams;
+  if ((fileName = (GooString *)unicodeMaps->lookup(encodingName))) {
+    f = openFile(fileName->getCString(), "r");
+  } else {
+    f = NULL;
+  }
+  unlockGlobalParams;
+  return f;
+}
+
+FILE *GlobalParams::findCMapFile(GooString *collection, GooString *cMapName) {
+  GooList *list;
+  GooString *dir;
+  GooString *fileName;
+  FILE *f;
+  int i;
+
+  lockGlobalParams;
+  if (!(list = (GooList *)cMapDirs->lookup(collection))) {
+    unlockGlobalParams;
+    return NULL;
+  }
+  for (i = 0; i < list->getLength(); ++i) {
+    dir = (GooString *)list->get(i);
+    fileName = appendToPath(dir->copy(), cMapName->getCString());
+    f = openFile(fileName->getCString(), "r");
+    delete fileName;
+    if (f) {
+      unlockGlobalParams;
+      return f;
+    }
+  }
+  unlockGlobalParams;
+  return NULL;
+}
+
+FILE *GlobalParams::findToUnicodeFile(GooString *name) {
+  GooString *dir, *fileName;
+  FILE *f;
+  int i;
+
+  lockGlobalParams;
+  for (i = 0; i < toUnicodeDirs->getLength(); ++i) {
+    dir = (GooString *)toUnicodeDirs->get(i);
+    fileName = appendToPath(dir->copy(), name->getCString());
+    f = openFile(fileName->getCString(), "r");
+    delete fileName;
+    if (f) {
+      unlockGlobalParams;
+      return f;
+    }
+  }
+  unlockGlobalParams;
+  return NULL;
+}
+
+#if WITH_FONTCONFIGURATION_FONTCONFIG
+static GBool findModifier(const char *name, const char *modifier, const char **start)
+{
+  const char *match;
+
+  if (name == NULL)
+    return gFalse;
+
+  match = strstr(name, modifier);
+  if (match) {
+    if (*start == NULL || match < *start)
+      *start = match;
+    return gTrue;
+  }
+  else {
+    return gFalse;
+  }
+}
+
+static const char *getFontLang(GfxFont *font)
+{
+  const char *lang;
+
+  // find the language we want the font to support
+  if (font->isCIDFont())
+  {
+    GooString *collection = ((GfxCIDFont *)font)->getCollection();
+    if (collection)
+    {
+      if (strcmp(collection->getCString(), "Adobe-GB1") == 0)
+        lang = "zh-cn"; // Simplified Chinese
+      else if (strcmp(collection->getCString(), "Adobe-CNS1") == 0)
+        lang = "zh-tw"; // Traditional Chinese
+      else if (strcmp(collection->getCString(), "Adobe-Japan1") == 0)
+        lang = "ja"; // Japanese
+      else if (strcmp(collection->getCString(), "Adobe-Japan2") == 0)
+        lang = "ja"; // Japanese
+      else if (strcmp(collection->getCString(), "Adobe-Korea1") == 0)
+        lang = "ko"; // Korean
+      else if (strcmp(collection->getCString(), "Adobe-UCS") == 0)
+        lang = "xx";
+      else if (strcmp(collection->getCString(), "Adobe-Identity") == 0)
+        lang = "xx";
+      else
+      {
+        error(errUnimplemented, -1, "Unknown CID font collection, please report to poppler bugzilla.");
+        lang = "xx";
+      }
+    }
+    else lang = "xx";
+  }
+  else lang = "xx";
+  return lang;
+}
+
+static FcPattern *buildFcPattern(GfxFont *font, GooString *base14Name)
+{
+  int weight = -1,
+      slant = -1,
+      width = -1,
+      spacing = -1;
+  bool deleteFamily = false;
+  char *family, *name, *modifiers;
+  const char *start;
+  FcPattern *p;
+
+  // this is all heuristics will be overwritten if font had proper info
+  name = (base14Name == NULL) ? font->getName()->getCString() : base14Name->getCString();
+  
+  modifiers = strchr (name, ',');
+  if (modifiers == NULL)
+    modifiers = strchr (name, '-');
+  
+  // remove the - from the names, for some reason, Fontconfig does not
+  // understand "MS-Mincho" but does with "MS Mincho"
+  int len = strlen(name);
+  for (int i = 0; i < len; i++)
+    name[i] = (name[i] == '-' ? ' ' : name[i]);
+
+  start = NULL;
+  findModifier(modifiers, "Regular", &start);
+  findModifier(modifiers, "Roman", &start);
+  
+  if (findModifier(modifiers, "Oblique", &start))
+    slant = FC_SLANT_OBLIQUE;
+  if (findModifier(modifiers, "Italic", &start))
+    slant = FC_SLANT_ITALIC;
+  if (findModifier(modifiers, "Bold", &start))
+    weight = FC_WEIGHT_BOLD;
+  if (findModifier(modifiers, "Light", &start))
+    weight = FC_WEIGHT_LIGHT;
+  if (findModifier(modifiers, "Medium", &start))
+    weight = FC_WEIGHT_MEDIUM;
+  if (findModifier(modifiers, "Condensed", &start))
+    width = FC_WIDTH_CONDENSED;
+  
+  if (start) {
+    // There have been "modifiers" in the name, crop them to obtain
+    // the family name
+    family = new char[len+1];
+    strcpy(family, name);
+    int pos = (modifiers - name);
+    family[pos] = '\0';
+    deleteFamily = true;
+  }
+  else {
+    family = name;
+  }
+  
+  // use font flags
+  if (font->isFixedWidth())
+    spacing = FC_MONO;
+  if (font->isBold())
+    weight = FC_WEIGHT_BOLD;
+  if (font->isItalic())
+    slant = FC_SLANT_ITALIC;
+  
+  // if the FontDescriptor specified a family name use it
+  if (font->getFamily()) {
+    if (deleteFamily) {
+      delete[] family;
+      deleteFamily = false;
+    }
+    family = font->getFamily()->getCString();
+  }
+  
+  // if the FontDescriptor specified a weight use it
+  switch (font -> getWeight())
+  {
+    case GfxFont::W100: weight = FC_WEIGHT_EXTRALIGHT; break; 
+    case GfxFont::W200: weight = FC_WEIGHT_LIGHT; break; 
+    case GfxFont::W300: weight = FC_WEIGHT_BOOK; break; 
+    case GfxFont::W400: weight = FC_WEIGHT_NORMAL; break; 
+    case GfxFont::W500: weight = FC_WEIGHT_MEDIUM; break; 
+    case GfxFont::W600: weight = FC_WEIGHT_DEMIBOLD; break; 
+    case GfxFont::W700: weight = FC_WEIGHT_BOLD; break; 
+    case GfxFont::W800: weight = FC_WEIGHT_EXTRABOLD; break; 
+    case GfxFont::W900: weight = FC_WEIGHT_BLACK; break; 
+    default: break; 
+  }
+  
+  // if the FontDescriptor specified a width use it
+  switch (font -> getStretch())
+  {
+    case GfxFont::UltraCondensed: width = FC_WIDTH_ULTRACONDENSED; break; 
+    case GfxFont::ExtraCondensed: width = FC_WIDTH_EXTRACONDENSED; break; 
+    case GfxFont::Condensed: width = FC_WIDTH_CONDENSED; break; 
+    case GfxFont::SemiCondensed: width = FC_WIDTH_SEMICONDENSED; break; 
+    case GfxFont::Normal: width = FC_WIDTH_NORMAL; break; 
+    case GfxFont::SemiExpanded: width = FC_WIDTH_SEMIEXPANDED; break; 
+    case GfxFont::Expanded: width = FC_WIDTH_EXPANDED; break; 
+    case GfxFont::ExtraExpanded: width = FC_WIDTH_EXTRAEXPANDED; break; 
+    case GfxFont::UltraExpanded: width = FC_WIDTH_ULTRAEXPANDED; break; 
+    default: break; 
+  }
+  
+  const char *lang = getFontLang(font);
+  
+  p = FcPatternBuild(NULL,
+                    FC_FAMILY, FcTypeString, family,
+                    FC_LANG, FcTypeString, lang,
+                    NULL);
+  if (slant != -1) FcPatternAddInteger(p, FC_SLANT, slant);
+  if (weight != -1) FcPatternAddInteger(p, FC_WEIGHT, weight);
+  if (width != -1) FcPatternAddInteger(p, FC_WIDTH, width);
+  if (spacing != -1) FcPatternAddInteger(p, FC_SPACING, spacing);
+
+  if (deleteFamily)
+    delete[] family;
+  return p;
+}
+#endif
+
+GooString *GlobalParams::findFontFile(GooString *fontName) {
+  static const char *exts[] = { ".pfa", ".pfb", ".ttf", ".ttc", ".otf" };
+  GooString *path, *dir;
+#ifdef WIN32
+  GooString *fontNameU;
+#endif
+  const char *ext;
+  FILE *f;
+  int i, j;
+
+  setupBaseFonts(NULL);
+  lockGlobalParams;
+  if ((path = (GooString *)fontFiles->lookup(fontName))) {
+    path = path->copy();
+    unlockGlobalParams;
+    return path;
+  }
+  for (i = 0; i < fontDirs->getLength(); ++i) {
+    dir = (GooString *)fontDirs->get(i);
+    for (j = 0; j < (int)(sizeof(exts) / sizeof(exts[0])); ++j) {
+      ext = exts[j];
+#ifdef WIN32
+      fontNameU = fileNameToUTF8(fontName->getCString());
+      path = appendToPath(dir->copy(), fontNameU->getCString());
+      delete fontNameU;
+#else
+      path = appendToPath(dir->copy(), fontName->getCString());
+#endif
+      path->append(ext);
+      if ((f = openFile(path->getCString(), "rb"))) {
+       fclose(f);
+       unlockGlobalParams;
+       return path;
+      }
+      delete path;
+    }
+  }
+  unlockGlobalParams;
+  return NULL;
+}
+
+/* if you can't or don't want to use Fontconfig, you need to implement
+   this function for your platform. For Windows, it's in GlobalParamsWin.cc
+*/
+#if WITH_FONTCONFIGURATION_FONTCONFIG
+// not needed for fontconfig
+void GlobalParams::setupBaseFonts(char *dir) {
+}
+
+GooString *GlobalParams::findBase14FontFile(GooString *base14Name, GfxFont *font) {
+  SysFontType type;
+  int fontNum;
+  
+  return findSystemFontFile(font, &type, &fontNum, NULL, base14Name);
+}
+
+GooString *GlobalParams::findSystemFontFile(GfxFont *font,
+                                         SysFontType *type,
+                                         int *fontNum, GooString *substituteFontName, GooString *base14Name) {
+  SysFontInfo *fi = NULL;
+  FcPattern *p=0;
+  GooString *path = NULL;
+  GooString *fontName = font->getName();
+  GooString substituteName;
+  if (!fontName) return NULL;
+  lockGlobalParams;
+
+  if ((fi = sysFonts->find(fontName, font->isFixedWidth(), gTrue))) {
+    path = fi->path->copy();
+    *type = fi->type;
+    *fontNum = fi->fontNum;
+    substituteName.Set(fi->substituteName->getCString());
+  } else {
+    FcChar8* s;
+    char * ext;
+    FcResult res;
+    FcFontSet *set;
+    int i;
+    FcLangSet *lb = NULL;
+    p = buildFcPattern(font, base14Name);
+
+    if (!p)
+      goto fin;
+    FcConfigSubstitute(NULL, p, FcMatchPattern);
+    FcDefaultSubstitute(p);
+    set = FcFontSort(NULL, p, FcFalse, NULL, &res);
+    if (!set)
+      goto fin;
+
+    // find the language we want the font to support
+    const char *lang = getFontLang(font);
+    if (strcmp(lang,"xx") != 0) {
+      lb = FcLangSetCreate();
+      FcLangSetAdd(lb,(FcChar8 *)lang);
+    }
+
+    /*
+      scan twice.
+      first: fonts support the language
+      second: all fonts (fall back)
+    */
+    while (fi == NULL)
+    {
+      for (i = 0; i < set->nfont; ++i)
+      {
+       res = FcPatternGetString(set->fonts[i], FC_FILE, 0, &s);
+       if (res != FcResultMatch || !s)
+         continue;
+       if (lb != NULL) {
+         FcLangSet *l;
+         res = FcPatternGetLangSet(set->fonts[i], FC_LANG, 0, &l);
+         if (res != FcResultMatch || !FcLangSetContains(l,lb)) {
+           continue;
+         }
+       }
+       FcChar8* s2;
+        res = FcPatternGetString(set->fonts[i], FC_FULLNAME, 0, &s2);
+        if (res == FcResultMatch && s2) {
+          substituteName.Set((char*)s2);
+        } else {
+          // fontconfig does not extract fullname for some fonts
+          // create the fullname from family and style
+          res = FcPatternGetString(set->fonts[i], FC_FAMILY, 0, &s2);
+          if (res == FcResultMatch && s2) {
+            substituteName.Set((char*)s2);
+            res = FcPatternGetString(set->fonts[i], FC_STYLE, 0, &s2);
+            if (res == FcResultMatch && s2) {
+              GooString *style = new GooString((char*)s2);
+              if (style->cmp("Regular") != 0) {
+                substituteName.append(" ");
+                substituteName.append(style);
+              }
+              delete style;
+            }
+          }
+        }
+       ext = strrchr((char*)s,'.');
+       if (!ext)
+         continue;
+       if (!strncasecmp(ext,".ttf",4) || !strncasecmp(ext, ".ttc", 4) || !strncasecmp(ext, ".otf", 4))
+       {
+         int weight, slant;
+         GBool bold = font->isBold();
+         GBool italic = font->isItalic();
+         GBool oblique = gFalse;
+         FcPatternGetInteger(set->fonts[i], FC_WEIGHT, 0, &weight);
+         FcPatternGetInteger(set->fonts[i], FC_SLANT, 0, &slant);
+         if (weight == FC_WEIGHT_DEMIBOLD || weight == FC_WEIGHT_BOLD 
+             || weight == FC_WEIGHT_EXTRABOLD || weight == FC_WEIGHT_BLACK)
+         {
+           bold = gTrue;
+         }
+         if (slant == FC_SLANT_ITALIC)
+           italic = gTrue;
+         if (slant == FC_SLANT_OBLIQUE)
+           oblique = gTrue;
+         *fontNum = 0;
+         *type = (!strncasecmp(ext,".ttc",4)) ? sysFontTTC : sysFontTTF;
+         FcPatternGetInteger(set->fonts[i], FC_INDEX, 0, fontNum);
+         fi = new SysFontInfo(fontName->copy(), bold, italic, oblique, font->isFixedWidth(),
+                              new GooString((char*)s), *type, *fontNum, substituteName.copy());
+         sysFonts->addFcFont(fi);
+         path = new GooString((char*)s);
+       }
+       else if (!strncasecmp(ext,".pfa",4) || !strncasecmp(ext,".pfb",4)) 
+       {
+         int weight, slant;
+         GBool bold = font->isBold();
+         GBool italic = font->isItalic();
+         GBool oblique = gFalse;
+         FcPatternGetInteger(set->fonts[i], FC_WEIGHT, 0, &weight);
+         FcPatternGetInteger(set->fonts[i], FC_SLANT, 0, &slant);
+         if (weight == FC_WEIGHT_DEMIBOLD || weight == FC_WEIGHT_BOLD 
+             || weight == FC_WEIGHT_EXTRABOLD || weight == FC_WEIGHT_BLACK)
+         {
+               bold = gTrue;
+         }
+         if (slant == FC_SLANT_ITALIC)
+           italic = gTrue;
+         if (slant == FC_SLANT_OBLIQUE)
+           oblique = gTrue;
+         *fontNum = 0;
+         *type = (!strncasecmp(ext,".pfa",4)) ? sysFontPFA : sysFontPFB;
+         FcPatternGetInteger(set->fonts[i], FC_INDEX, 0, fontNum);
+         fi = new SysFontInfo(fontName->copy(), bold, italic, oblique, font->isFixedWidth(),
+                              new GooString((char*)s), *type, *fontNum, substituteName.copy());
+         sysFonts->addFcFont(fi);
+         path = new GooString((char*)s);
+       }
+       else
+         continue;
+       break;
+      }
+      if (lb != NULL) {
+        FcLangSetDestroy(lb);
+        lb = NULL;
+      } else {
+        /* scan all fonts of the list */
+        break;
+      }
+    }
+    FcFontSetDestroy(set);
+  }
+  if (path == NULL && (fi = sysFonts->find(fontName, font->isFixedWidth(), gFalse))) {
+    path = fi->path->copy();
+    *type = fi->type;
+    *fontNum = fi->fontNum;
+  }
+  if (substituteFontName) {
+    substituteFontName->Set(substituteName.getCString());
+  }
+fin:
+  if (p)
+    FcPatternDestroy(p);
+  unlockGlobalParams;
+  return path;
+}
+
+#elif WITH_FONTCONFIGURATION_WIN32
+#include "GlobalParamsWin.cc"
+
+GooString *GlobalParams::findBase14FontFile(GooString *base14Name, GfxFont *font) {
+  return findFontFile(base14Name);
+}
+#else
+GooString *GlobalParams::findBase14FontFile(GooString *base14Name, GfxFont *font) {
+  return findFontFile(base14Name);
+}
+
+static struct {
+  const char *name;
+  const char *t1FileName;
+  const char *ttFileName;
+} displayFontTab[] = {
+  {"Courier",               "n022003l.pfb", "cour.ttf"},
+  {"Courier-Bold",          "n022004l.pfb", "courbd.ttf"},
+  {"Courier-BoldOblique",   "n022024l.pfb", "courbi.ttf"},
+  {"Courier-Oblique",       "n022023l.pfb", "couri.ttf"},
+  {"Helvetica",             "n019003l.pfb", "arial.ttf"},
+  {"Helvetica-Bold",        "n019004l.pfb", "arialbd.ttf"},
+  {"Helvetica-BoldOblique", "n019024l.pfb", "arialbi.ttf"},
+  {"Helvetica-Oblique",     "n019023l.pfb", "ariali.ttf"},
+  {"Symbol",                "s050000l.pfb", NULL},
+  {"Times-Bold",            "n021004l.pfb", "timesbd.ttf"},
+  {"Times-BoldItalic",      "n021024l.pfb", "timesbi.ttf"},
+  {"Times-Italic",          "n021023l.pfb", "timesi.ttf"},
+  {"Times-Roman",           "n021003l.pfb", "times.ttf"},
+  {"ZapfDingbats",          "d050000l.pfb", NULL},
+  {NULL}
+};
+
+static const char *displayFontDirs[] = {
+  "/usr/share/ghostscript/fonts",
+  "/usr/local/share/ghostscript/fonts",
+  "/usr/share/fonts/default/Type1",
+  "/usr/share/fonts/default/ghostscript",
+  "/usr/share/fonts/type1/gsfonts",
+  NULL
+};
+
+void GlobalParams::setupBaseFonts(char *dir) {
+  GooString *fontName;
+  GooString *fileName;
+  FILE *f;
+  int i, j;
+
+  for (i = 0; displayFontTab[i].name; ++i) {
+    if (fontFiles->lookup(displayFontTab[i].name)) {
+      continue;
+    }
+    fontName = new GooString(displayFontTab[i].name);
+    fileName = NULL;
+    if (dir) {
+      fileName = appendToPath(new GooString(dir), displayFontTab[i].t1FileName);
+      if ((f = fopen(fileName->getCString(), "rb"))) {
+             fclose(f);
+      } else {
+             delete fileName;
+             fileName = NULL;
+      }
+    }
+    for (j = 0; !fileName && displayFontDirs[j]; ++j) {
+      fileName = appendToPath(new GooString(displayFontDirs[j]),
+                             displayFontTab[i].t1FileName);
+      if ((f = fopen(fileName->getCString(), "rb"))) {
+             fclose(f);
+      } else {
+             delete fileName;
+             fileName = NULL;
+      }
+    }
+    if (!fileName) {
+      error(errConfig, -1, "No display font for '{0:s}'",
+           displayFontTab[i].name);
+      delete fontName;
+      continue;
+    }
+    addFontFile(fontName, fileName);
+  }
+
+}
+
+GooString *GlobalParams::findSystemFontFile(GfxFont *font,
+                                         SysFontType *type,
+                                         int *fontNum, GooString * /*substituteFontName*/,
+                                         GooString * /*base14Name*/) {
+  SysFontInfo *fi;
+  GooString *path;
+
+  path = NULL;
+  lockGlobalParams;
+  if ((fi = sysFonts->find(font->getName(), font->isFixedWidth(), gFalse))) {
+    path = fi->path->copy();
+    *type = fi->type;
+    *fontNum = fi->fontNum;
+  }
+  unlockGlobalParams; 
+  return path;
+}
+#endif
+
+GooString *GlobalParams::findCCFontFile(GooString *collection) {
+  GooString *path;
+
+  lockGlobalParams;
+  if ((path = (GooString *)ccFontFiles->lookup(collection))) {
+    path = path->copy();
+  }
+  unlockGlobalParams;
+  return path;
+}
+
+
+GBool GlobalParams::getPSExpandSmaller() {
+  GBool f;
+
+  lockGlobalParams;
+  f = psExpandSmaller;
+  unlockGlobalParams;
+  return f;
+}
+
+GBool GlobalParams::getPSShrinkLarger() {
+  GBool f;
+
+  lockGlobalParams;
+  f = psShrinkLarger;
+  unlockGlobalParams;
+  return f;
+}
+
+GBool GlobalParams::getPSCenter() {
+  GBool f;
+
+  lockGlobalParams;
+  f = psCenter;
+  unlockGlobalParams;
+  return f;
+}
+
+PSLevel GlobalParams::getPSLevel() {
+  PSLevel level;
+
+  lockGlobalParams;
+  level = psLevel;
+  unlockGlobalParams;
+  return level;
+}
+
+GooString *GlobalParams::getPSResidentFont(GooString *fontName) {
+  GooString *psName;
+
+  lockGlobalParams;
+  psName = (GooString *)psResidentFonts->lookup(fontName);
+  unlockGlobalParams;
+  return psName;
+}
+
+GooList *GlobalParams::getPSResidentFonts() {
+  GooList *names;
+  GooHashIter *iter;
+  GooString *name;
+  GooString *psName;
+
+  names = new GooList();
+  lockGlobalParams;
+  psResidentFonts->startIter(&iter);
+  while (psResidentFonts->getNext(&iter, &name, (void **)&psName)) {
+    names->append(psName->copy());
+  }
+  unlockGlobalParams;
+  return names;
+}
+
+PSFontParam16 *GlobalParams::getPSResidentFont16(GooString *fontName,
+                                                int wMode) {
+  PSFontParam16 *p;
+  int i;
+
+  lockGlobalParams;
+  p = NULL;
+  for (i = 0; i < psResidentFonts16->getLength(); ++i) {
+    p = (PSFontParam16 *)psResidentFonts16->get(i);
+    if (!(p->name->cmp(fontName)) && p->wMode == wMode) {
+      break;
+    }
+    p = NULL;
+  }
+  unlockGlobalParams;
+  return p;
+}
+
+PSFontParam16 *GlobalParams::getPSResidentFontCC(GooString *collection,
+                                                int wMode) {
+  PSFontParam16 *p;
+  int i;
+
+  lockGlobalParams;
+  p = NULL;
+  for (i = 0; i < psResidentFontsCC->getLength(); ++i) {
+    p = (PSFontParam16 *)psResidentFontsCC->get(i);
+    if (!(p->name->cmp(collection)) && p->wMode == wMode) {
+      break;
+    }
+    p = NULL;
+  }
+  unlockGlobalParams;
+  return p;
+}
+
+GBool GlobalParams::getPSEmbedType1() {
+  GBool e;
+
+  lockGlobalParams;
+  e = psEmbedType1;
+  unlockGlobalParams;
+  return e;
+}
+
+GBool GlobalParams::getPSEmbedTrueType() {
+  GBool e;
+
+  lockGlobalParams;
+  e = psEmbedTrueType;
+  unlockGlobalParams;
+  return e;
+}
+
+GBool GlobalParams::getPSEmbedCIDPostScript() {
+  GBool e;
+
+  lockGlobalParams;
+  e = psEmbedCIDPostScript;
+  unlockGlobalParams;
+  return e;
+}
+
+GBool GlobalParams::getPSEmbedCIDTrueType() {
+  GBool e;
+
+  lockGlobalParams;
+  e = psEmbedCIDTrueType;
+  unlockGlobalParams;
+  return e;
+}
+
+GBool GlobalParams::getPSFontPassthrough() {
+  GBool e;
+
+  lockGlobalParams;
+  e = psFontPassthrough;
+  unlockGlobalParams;
+  return e;
+}
+
+GBool GlobalParams::getPSPreload() {
+  GBool preload;
+
+  lockGlobalParams;
+  preload = psPreload;
+  unlockGlobalParams;
+  return preload;
+}
+
+GBool GlobalParams::getPSOPI() {
+  GBool opi;
+
+  lockGlobalParams;
+  opi = psOPI;
+  unlockGlobalParams;
+  return opi;
+}
+
+GBool GlobalParams::getPSASCIIHex() {
+  GBool ah;
+
+  lockGlobalParams;
+  ah = psASCIIHex;
+  unlockGlobalParams;
+  return ah;
+}
+
+GBool GlobalParams::getPSBinary() {
+  GBool binary;
+
+  lockGlobalParams;
+  binary = psBinary;
+  unlockGlobalParams;
+  return binary;
+}
+
+GBool GlobalParams::getPSUncompressPreloadedImages() {
+  GBool ah;
+
+  lockGlobalParams;
+  ah = psUncompressPreloadedImages;
+  unlockGlobalParams;
+  return ah;
+}
+
+double GlobalParams::getPSRasterResolution() {
+  double res;
+
+  lockGlobalParams;
+  res = psRasterResolution;
+  unlockGlobalParams;
+  return res;
+}
+
+GBool GlobalParams::getPSRasterMono() {
+  GBool mono;
+
+  lockGlobalParams;
+  mono = psRasterMono;
+  unlockGlobalParams;
+  return mono;
+}
+
+GooString *GlobalParams::getTextEncodingName() {
+  GooString *s;
+
+  lockGlobalParams;
+  s = textEncoding->copy();
+  unlockGlobalParams;
+  return s;
+}
+
+EndOfLineKind GlobalParams::getTextEOL() {
+  EndOfLineKind eol;
+
+  lockGlobalParams;
+  eol = textEOL;
+  unlockGlobalParams;
+  return eol;
+}
+
+GBool GlobalParams::getTextPageBreaks() {
+  GBool pageBreaks;
+
+  lockGlobalParams;
+  pageBreaks = textPageBreaks;
+  unlockGlobalParams;
+  return pageBreaks;
+}
+
+GBool GlobalParams::getTextKeepTinyChars() {
+  GBool tiny;
+
+  lockGlobalParams;
+  tiny = textKeepTinyChars;
+  unlockGlobalParams;
+  return tiny;
+}
+
+GBool GlobalParams::getEnableFreeType() {
+  GBool f;
+
+  lockGlobalParams;
+  f = enableFreeType;
+  unlockGlobalParams;
+  return f;
+}
+
+GBool GlobalParams::getAntialias() {
+  GBool f;
+
+  lockGlobalParams;
+  f = antialias;
+  unlockGlobalParams;
+  return f;
+}
+
+GBool GlobalParams::getVectorAntialias() {
+  GBool f;
+
+  lockGlobalParams;
+  f = vectorAntialias;
+  unlockGlobalParams;
+  return f;
+}
+
+GBool GlobalParams::getAntialiasPrinting() {
+  GBool f;
+
+  lockGlobalParams;
+  f = antialiasPrinting;
+  unlockGlobalParams;
+  return f;
+}
+
+GBool GlobalParams::getStrokeAdjust() {
+  GBool f;
+
+  lockGlobalParams;
+  f = strokeAdjust;
+  unlockGlobalParams;
+  return f;
+}
+
+ScreenType GlobalParams::getScreenType() {
+  ScreenType t;
+
+  lockGlobalParams;
+  t = screenType;
+  unlockGlobalParams;
+  return t;
+}
+
+int GlobalParams::getScreenSize() {
+  int size;
+
+  lockGlobalParams;
+  size = screenSize;
+  unlockGlobalParams;
+  return size;
+}
+
+int GlobalParams::getScreenDotRadius() {
+  int r;
+
+  lockGlobalParams;
+  r = screenDotRadius;
+  unlockGlobalParams;
+  return r;
+}
+
+double GlobalParams::getScreenGamma() {
+  double gamma;
+
+  lockGlobalParams;
+  gamma = screenGamma;
+  unlockGlobalParams;
+  return gamma;
+}
+
+double GlobalParams::getScreenBlackThreshold() {
+  double thresh;
+
+  lockGlobalParams;
+  thresh = screenBlackThreshold;
+  unlockGlobalParams;
+  return thresh;
+}
+
+double GlobalParams::getScreenWhiteThreshold() {
+  double thresh;
+
+  lockGlobalParams;
+  thresh = screenWhiteThreshold;
+  unlockGlobalParams;
+  return thresh;
+}
+
+double GlobalParams::getMinLineWidth() {
+  double minLineWidthA;
+
+  lockGlobalParams;
+  minLineWidthA = minLineWidth;
+  unlockGlobalParams;
+  return minLineWidthA;
+}
+
+GBool GlobalParams::getMapNumericCharNames() {
+  GBool map;
+
+  lockGlobalParams;
+  map = mapNumericCharNames;
+  unlockGlobalParams;
+  return map;
+}
+
+GBool GlobalParams::getMapUnknownCharNames() {
+  GBool map;
+
+  lockGlobalParams;
+  map = mapUnknownCharNames;
+  unlockGlobalParams;
+  return map;
+}
+
+GBool GlobalParams::getPrintCommands() {
+  GBool p;
+
+  lockGlobalParams;
+  p = printCommands;
+  unlockGlobalParams;
+  return p;
+}
+
+GBool GlobalParams::getProfileCommands() {
+  GBool p;
+
+  lockGlobalParams;
+  p = profileCommands;
+  unlockGlobalParams;
+  return p;
+}
+
+GBool GlobalParams::getErrQuiet() {
+  // no locking -- this function may get called from inside a locked
+  // section
+  return errQuiet;
+}
+
+CharCodeToUnicode *GlobalParams::getCIDToUnicode(GooString *collection) {
+  GooString *fileName;
+  CharCodeToUnicode *ctu;
+
+  lockGlobalParams;
+  if (!(ctu = cidToUnicodeCache->getCharCodeToUnicode(collection))) {
+    if ((fileName = (GooString *)cidToUnicodes->lookup(collection)) &&
+       (ctu = CharCodeToUnicode::parseCIDToUnicode(fileName, collection))) {
+      cidToUnicodeCache->add(ctu);
+    }
+  }
+  unlockGlobalParams;
+  return ctu;
+}
+
+CharCodeToUnicode *GlobalParams::getUnicodeToUnicode(GooString *fontName) {
+  lockGlobalParams;
+  GooHashIter *iter;
+  unicodeToUnicodes->startIter(&iter);
+  GooString *fileName = NULL;
+  GooString *fontPattern;
+  void *val;
+  while (!fileName && unicodeToUnicodes->getNext(&iter, &fontPattern, &val)) {
+    if (strstr(fontName->getCString(), fontPattern->getCString())) {
+      unicodeToUnicodes->killIter(&iter);
+      fileName = (GooString*)val;
+    }
+  }
+  CharCodeToUnicode *ctu = NULL;
+  if (fileName) {
+    ctu = unicodeToUnicodeCache->getCharCodeToUnicode(fileName);
+    if (!ctu) {
+      ctu = CharCodeToUnicode::parseUnicodeToUnicode(fileName);
+      if (ctu)
+         unicodeToUnicodeCache->add(ctu);
+    }
+  }
+  unlockGlobalParams;
+  return ctu;
+}
+
+UnicodeMap *GlobalParams::getUnicodeMap(GooString *encodingName) {
+  return getUnicodeMap2(encodingName);
+}
+
+UnicodeMap *GlobalParams::getUnicodeMap2(GooString *encodingName) {
+  UnicodeMap *map;
+
+  if (!(map = getResidentUnicodeMap(encodingName))) {
+    lockUnicodeMapCache;
+    map = unicodeMapCache->getUnicodeMap(encodingName);
+    unlockUnicodeMapCache;
+  }
+  return map;
+}
+
+CMap *GlobalParams::getCMap(GooString *collection, GooString *cMapName, Stream *stream) {
+  CMap *cMap;
+
+  lockCMapCache;
+  cMap = cMapCache->getCMap(collection, cMapName, stream);
+  unlockCMapCache;
+  return cMap;
+}
+
+UnicodeMap *GlobalParams::getTextEncoding() {
+  return getUnicodeMap2(textEncoding);
+}
+
+GooList *GlobalParams::getEncodingNames()
+{
+  GooList *result = new GooList;
+  GooHashIter *iter;
+  GooString *key;
+  void *val;
+  residentUnicodeMaps->startIter(&iter);
+  while (residentUnicodeMaps->getNext(&iter, &key, &val)) {
+    result->append(key);
+  }
+  residentUnicodeMaps->killIter(&iter);
+  unicodeMaps->startIter(&iter);
+  while (unicodeMaps->getNext(&iter, &key, &val)) {
+    result->append(key);
+  }
+  unicodeMaps->killIter(&iter);
+  return result;
+}
+
+//------------------------------------------------------------------------
+// functions to set parameters
+//------------------------------------------------------------------------
+
+void GlobalParams::addFontFile(GooString *fontName, GooString *path) {
+  lockGlobalParams;
+  fontFiles->add(fontName, path);
+  unlockGlobalParams;
+}
+
+void GlobalParams::setPSFile(char *file) {
+  lockGlobalParams;
+  if (psFile) {
+    delete psFile;
+  }
+  psFile = new GooString(file);
+  unlockGlobalParams;
+}
+
+void GlobalParams::setPSExpandSmaller(GBool expand) {
+  lockGlobalParams;
+  psExpandSmaller = expand;
+  unlockGlobalParams;
+}
+
+void GlobalParams::setPSShrinkLarger(GBool shrink) {
+  lockGlobalParams;
+  psShrinkLarger = shrink;
+  unlockGlobalParams;
+}
+
+void GlobalParams::setPSCenter(GBool center) {
+  lockGlobalParams;
+  psCenter = center;
+  unlockGlobalParams;
+}
+
+void GlobalParams::setPSLevel(PSLevel level) {
+  lockGlobalParams;
+  psLevel = level;
+  unlockGlobalParams;
+}
+
+void GlobalParams::setPSEmbedType1(GBool embed) {
+  lockGlobalParams;
+  psEmbedType1 = embed;
+  unlockGlobalParams;
+}
+
+void GlobalParams::setPSEmbedTrueType(GBool embed) {
+  lockGlobalParams;
+  psEmbedTrueType = embed;
+  unlockGlobalParams;
+}
+
+void GlobalParams::setPSEmbedCIDPostScript(GBool embed) {
+  lockGlobalParams;
+  psEmbedCIDPostScript = embed;
+  unlockGlobalParams;
+}
+
+void GlobalParams::setPSEmbedCIDTrueType(GBool embed) {
+  lockGlobalParams;
+  psEmbedCIDTrueType = embed;
+  unlockGlobalParams;
+}
+
+void GlobalParams::setPSFontPassthrough(GBool passthrough) {
+  lockGlobalParams;
+  psFontPassthrough = passthrough;
+  unlockGlobalParams;
+}
+
+void GlobalParams::setPSPreload(GBool preload) {
+  lockGlobalParams;
+  psPreload = preload;
+  unlockGlobalParams;
+}
+
+void GlobalParams::setPSOPI(GBool opi) {
+  lockGlobalParams;
+  psOPI = opi;
+  unlockGlobalParams;
+}
+
+void GlobalParams::setPSASCIIHex(GBool hex) {
+  lockGlobalParams;
+  psASCIIHex = hex;
+  unlockGlobalParams;
+}
+
+void GlobalParams::setPSBinary(GBool binary) {
+  lockGlobalParams;
+  psBinary = binary;
+  unlockGlobalParams;
+}
+
+void GlobalParams::setPSUncompressPreloadedImages(GBool uncomp) {
+  lockGlobalParams;
+  psUncompressPreloadedImages = uncomp;
+  unlockGlobalParams;
+}
+
+void GlobalParams::setPSRasterResolution(double res) {
+  lockGlobalParams;
+  psRasterResolution = res;
+  unlockGlobalParams;
+}
+
+void GlobalParams::setPSRasterMono(GBool mono) {
+  lockGlobalParams;
+  psRasterMono = mono;
+  unlockGlobalParams;
+}
+
+void GlobalParams::setTextEncoding(char *encodingName) {
+  lockGlobalParams;
+  delete textEncoding;
+  textEncoding = new GooString(encodingName);
+  unlockGlobalParams;
+}
+
+GBool GlobalParams::setTextEOL(char *s) {
+  lockGlobalParams;
+  if (!strcmp(s, "unix")) {
+    textEOL = eolUnix;
+  } else if (!strcmp(s, "dos")) {
+    textEOL = eolDOS;
+  } else if (!strcmp(s, "mac")) {
+    textEOL = eolMac;
+  } else {
+    unlockGlobalParams;
+    return gFalse;
+  }
+  unlockGlobalParams;
+  return gTrue;
+}
+
+void GlobalParams::setTextPageBreaks(GBool pageBreaks) {
+  lockGlobalParams;
+  textPageBreaks = pageBreaks;
+  unlockGlobalParams;
+}
+
+void GlobalParams::setTextKeepTinyChars(GBool keep) {
+  lockGlobalParams;
+  textKeepTinyChars = keep;
+  unlockGlobalParams;
+}
+
+GBool GlobalParams::setEnableFreeType(char *s) {
+  GBool ok;
+
+  lockGlobalParams;
+  ok = parseYesNo2(s, &enableFreeType);
+  unlockGlobalParams;
+  return ok;
+}
+
+GBool GlobalParams::setDisableFreeTypeHinting(char *s) {
+  GBool ok;
+
+  lockGlobalParams;
+  ok = parseYesNo2(s, &disableFreeTypeHinting);
+  unlockGlobalParams;
+  return ok;
+}
+
+GBool GlobalParams::setAntialias(char *s) {
+  GBool ok;
+
+  lockGlobalParams;
+  ok = parseYesNo2(s, &antialias);
+  unlockGlobalParams;
+  return ok;
+}
+
+GBool GlobalParams::setVectorAntialias(char *s) {
+  GBool ok;
+
+  lockGlobalParams;
+  ok = parseYesNo2(s, &vectorAntialias);
+  unlockGlobalParams;
+  return ok;
+}
+
+void GlobalParams::setAntialiasPrinting(GBool anti) {
+  lockGlobalParams;
+  antialiasPrinting = anti;
+  unlockGlobalParams;
+}
+
+void GlobalParams::setStrokeAdjust(GBool adjust)
+{
+  lockGlobalParams;
+  strokeAdjust = adjust;
+  unlockGlobalParams;
+}
+
+void GlobalParams::setScreenType(ScreenType st)
+{
+  lockGlobalParams;
+  screenType = st;
+  unlockGlobalParams;
+}
+
+void GlobalParams::setScreenSize(int size)
+{
+  lockGlobalParams;
+  screenSize = size;
+  unlockGlobalParams;
+}
+
+void GlobalParams::setScreenDotRadius(int radius)
+{
+  lockGlobalParams;
+  screenDotRadius = radius;
+  unlockGlobalParams;
+}
+
+void GlobalParams::setScreenGamma(double gamma)
+{
+  lockGlobalParams;
+  screenGamma = gamma;
+  unlockGlobalParams;
+}
+
+void GlobalParams::setScreenBlackThreshold(double blackThreshold)
+{
+  lockGlobalParams;
+  screenBlackThreshold = blackThreshold;
+  unlockGlobalParams;
+}
+
+void GlobalParams::setScreenWhiteThreshold(double whiteThreshold)
+{
+  lockGlobalParams;
+  screenWhiteThreshold = whiteThreshold;
+  unlockGlobalParams;
+}
+
+void GlobalParams::setMinLineWidth(double minLineWidthA)
+{
+  lockGlobalParams;
+  minLineWidth = minLineWidthA;
+  unlockGlobalParams;
+}
+
+void GlobalParams::setOverprintPreview(GBool overprintPreviewA) {
+  lockGlobalParams;
+  overprintPreview = overprintPreviewA;
+  unlockGlobalParams;
+}
+
+void GlobalParams::setMapNumericCharNames(GBool map) {
+  lockGlobalParams;
+  mapNumericCharNames = map;
+  unlockGlobalParams;
+}
+
+void GlobalParams::setMapUnknownCharNames(GBool map) {
+  lockGlobalParams;
+  mapUnknownCharNames = map;
+  unlockGlobalParams;
+}
+
+void GlobalParams::setPrintCommands(GBool printCommandsA) {
+  lockGlobalParams;
+  printCommands = printCommandsA;
+  unlockGlobalParams;
+}
+
+void GlobalParams::setProfileCommands(GBool profileCommandsA) {
+  lockGlobalParams;
+  profileCommands = profileCommandsA;
+  unlockGlobalParams;
+}
+
+void GlobalParams::setErrQuiet(GBool errQuietA) {
+  lockGlobalParams;
+  errQuiet = errQuietA;
+  unlockGlobalParams;
+}
+
+void GlobalParams::addSecurityHandler(XpdfSecurityHandler *handler) {
+#ifdef ENABLE_PLUGINS
+  lockGlobalParams;
+  securityHandlers->append(handler);
+  unlockGlobalParams;
+#endif
+}
+
+XpdfSecurityHandler *GlobalParams::getSecurityHandler(char *name) {
+#ifdef ENABLE_PLUGINS
+  XpdfSecurityHandler *hdlr;
+  int i;
+
+  lockGlobalParams;
+  for (i = 0; i < securityHandlers->getLength(); ++i) {
+    hdlr = (XpdfSecurityHandler *)securityHandlers->get(i);
+    if (!strcasecmp(hdlr->name, name)) {
+      unlockGlobalParams;
+      return hdlr;
+    }
+  }
+  unlockGlobalParams;
+
+  if (!loadPlugin("security", name)) {
+    return NULL;
+  }
+
+  lockGlobalParams;
+  for (i = 0; i < securityHandlers->getLength(); ++i) {
+    hdlr = (XpdfSecurityHandler *)securityHandlers->get(i);
+    if (!strcmp(hdlr->name, name)) {
+      unlockGlobalParams;
+      return hdlr;
+    }
+  }
+  unlockGlobalParams;
+#else
+  (void)name;
+#endif
+
+  return NULL;
+}
+
+#ifdef ENABLE_PLUGINS
+//------------------------------------------------------------------------
+// plugins
+//------------------------------------------------------------------------
+
+GBool GlobalParams::loadPlugin(char *type, char *name) {
+  Plugin *plugin;
+
+  if (!(plugin = Plugin::load(type, name))) {
+    return gFalse;
+  }
+  lockGlobalParams;
+  plugins->append(plugin);
+  unlockGlobalParams;
+  return gTrue;
+}
+
+#endif // ENABLE_PLUGINS
diff --git a/poppler/GlobalParams.h b/poppler/GlobalParams.h
new file mode 100644 (file)
index 0000000..375ac2c
--- /dev/null
@@ -0,0 +1,377 @@
+//========================================================================
+//
+// GlobalParams.h
+//
+// Copyright 2001-2003 Glyph & Cog, LLC
+//
+//========================================================================
+
+//========================================================================
+//
+// Modified under the Poppler project - http://poppler.freedesktop.org
+//
+// All changes made under the Poppler project to this file are licensed
+// under GPL version 2 or later
+//
+// Copyright (C) 2005, 2007-2010 Albert Astals Cid <aacid@kde.org>
+// Copyright (C) 2005 Jonathan Blandford <jrb@redhat.com>
+// Copyright (C) 2006 Takashi Iwai <tiwai@suse.de>
+// Copyright (C) 2006 Kristian Høgsberg <krh@redhat.com>
+// Copyright (C) 2007 Krzysztof Kowalczyk <kkowalczyk@gmail.com>
+// Copyright (C) 2009 Jonathan Kew <jonathan_kew@sil.org>
+// Copyright (C) 2009 Petr Gajdos <pgajdos@novell.com>
+// Copyright (C) 2009, 2011, 2012 William Bader <williambader@hotmail.com>
+// Copyright (C) 2010 Hib Eris <hib@hiberis.nl>
+// Copyright (C) 2011 Pino Toscano <pino@kde.org>
+// Copyright (C) 2012 Adrian Johnson <ajohnson@redneon.com>
+// Copyright (C) 2012 Thomas Freitag <Thomas.Freitag@alfa.de>
+//
+// To see a description of the changes please see the Changelog file that
+// came with your tarball or type make ChangeLog if you are building from git
+//
+//========================================================================
+
+#ifndef GLOBALPARAMS_H
+#define GLOBALPARAMS_H
+
+#ifdef USE_GCC_PRAGMAS
+#pragma interface
+#endif
+
+#include <assert.h>
+#include "poppler-config.h"
+#include <stdio.h>
+#include "goo/gtypes.h"
+#include "CharTypes.h"
+
+#if MULTITHREADED
+#include "goo/GooMutex.h"
+#endif
+
+class GooString;
+class GooList;
+class GooHash;
+class NameToCharCode;
+class CharCodeToUnicode;
+class CharCodeToUnicodeCache;
+class UnicodeMap;
+class UnicodeMapCache;
+class CMap;
+class CMapCache;
+struct XpdfSecurityHandler;
+class GlobalParams;
+class GfxFont;
+class Stream;
+class SysFontList;
+
+//------------------------------------------------------------------------
+
+// The global parameters object.
+extern GlobalParams *globalParams;
+
+//------------------------------------------------------------------------
+
+enum SysFontType {
+  sysFontPFA,
+  sysFontPFB,
+  sysFontTTF,
+  sysFontTTC
+};
+
+//------------------------------------------------------------------------
+
+class PSFontParam16 {
+public:
+
+  GooString *name;             // PDF font name for psResidentFont16;
+                               //   char collection name for psResidentFontCC
+  int wMode;                   // writing mode (0=horiz, 1=vert)
+  GooString *psFontName;               // PostScript font name
+  GooString *encoding;         // encoding
+
+  PSFontParam16(GooString *nameA, int wModeA,
+               GooString *psFontNameA, GooString *encodingA);
+  ~PSFontParam16();
+};
+
+//------------------------------------------------------------------------
+
+enum PSLevel {
+  psLevel1,
+  psLevel1Sep,
+  psLevel2,
+  psLevel2Sep,
+  psLevel3,
+  psLevel3Sep
+};
+
+//------------------------------------------------------------------------
+
+enum EndOfLineKind {
+  eolUnix,                     // LF
+  eolDOS,                      // CR+LF
+  eolMac                       // CR
+};
+
+//------------------------------------------------------------------------
+
+enum ScreenType {
+  screenUnset,
+  screenDispersed,
+  screenClustered,
+  screenStochasticClustered
+};
+
+//------------------------------------------------------------------------
+
+class GlobalParams {
+public:
+
+  // Initialize the global parameters by attempting to read a config
+  // file.
+  GlobalParams(const char *customPopplerDataDir = NULL);
+
+  ~GlobalParams();
+
+  void setBaseDir(const char *dir);
+  void setupBaseFonts(char *dir);
+
+  //----- accessors
+
+  CharCode getMacRomanCharCode(char *charName);
+
+  GooString *getBaseDir();
+  Unicode mapNameToUnicode(const char *charName);
+  UnicodeMap *getResidentUnicodeMap(GooString *encodingName);
+  FILE *getUnicodeMapFile(GooString *encodingName);
+  FILE *findCMapFile(GooString *collection, GooString *cMapName);
+  FILE *findToUnicodeFile(GooString *name);
+  GooString *findFontFile(GooString *fontName);
+  GooString *findBase14FontFile(GooString *base14Name, GfxFont *font);
+  GooString *findSystemFontFile(GfxFont *font, SysFontType *type,
+                             int *fontNum, GooString *substituteFontName = NULL, 
+                             GooString *base14Name = NULL);
+  GooString *findCCFontFile(GooString *collection);
+  GBool getPSExpandSmaller();
+  GBool getPSShrinkLarger();
+  GBool getPSCenter();
+  PSLevel getPSLevel();
+  GooString *getPSResidentFont(GooString *fontName);
+  GooList *getPSResidentFonts();
+  PSFontParam16 *getPSResidentFont16(GooString *fontName, int wMode);
+  PSFontParam16 *getPSResidentFontCC(GooString *collection, int wMode);
+  GBool getPSEmbedType1();
+  GBool getPSEmbedTrueType();
+  GBool getPSEmbedCIDPostScript();
+  GBool getPSEmbedCIDTrueType();
+  GBool getPSFontPassthrough();
+  GBool getPSPreload();
+  GBool getPSOPI();
+  GBool getPSASCIIHex();
+  GBool getPSBinary();
+  GBool getPSUncompressPreloadedImages();
+  double getPSRasterResolution();
+  GBool getPSRasterMono();
+  GooString *getTextEncodingName();
+  EndOfLineKind getTextEOL();
+  GBool getTextPageBreaks();
+  GBool getTextKeepTinyChars();
+  GBool getEnableFreeType();
+  GBool getAntialias();
+  GBool getVectorAntialias();
+  GBool getAntialiasPrinting();
+  GBool getStrokeAdjust();
+  ScreenType getScreenType();
+  int getScreenSize();
+  int getScreenDotRadius();
+  double getScreenGamma();
+  double getScreenBlackThreshold();
+  double getScreenWhiteThreshold();
+  double getMinLineWidth();
+  GBool getOverprintPreview() { return overprintPreview; }
+  GBool getMapNumericCharNames();
+  GBool getMapUnknownCharNames();
+  GBool getPrintCommands();
+  GBool getProfileCommands();
+  GBool getErrQuiet();
+  double getSplashResolution();
+
+  CharCodeToUnicode *getCIDToUnicode(GooString *collection);
+  CharCodeToUnicode *getUnicodeToUnicode(GooString *fontName);
+  UnicodeMap *getUnicodeMap(GooString *encodingName);
+  CMap *getCMap(GooString *collection, GooString *cMapName, Stream *stream = NULL);
+  UnicodeMap *getTextEncoding();
+#ifdef ENABLE_PLUGINS
+  GBool loadPlugin(char *type, char *name);
+#endif
+
+  GooList *getEncodingNames();
+
+  //----- functions to set parameters
+  void addFontFile(GooString *fontName, GooString *path);
+  void setPSFile(char *file);
+  void setPSExpandSmaller(GBool expand);
+  void setPSShrinkLarger(GBool shrink);
+  void setPSCenter(GBool center);
+  void setPSLevel(PSLevel level);
+  void setPSEmbedType1(GBool embed);
+  void setPSEmbedTrueType(GBool embed);
+  void setPSEmbedCIDPostScript(GBool embed);
+  void setPSEmbedCIDTrueType(GBool embed);
+  void setPSFontPassthrough(GBool passthrough);
+  void setPSPreload(GBool preload);
+  void setPSOPI(GBool opi);
+  void setPSASCIIHex(GBool hex);
+  void setPSBinary(GBool binary);
+  void setPSUncompressPreloadedImages(GBool uncomp);
+  void setPSRasterResolution(double res);
+  void setPSRasterMono(GBool mono);
+  void setTextEncoding(char *encodingName);
+  GBool setTextEOL(char *s);
+  void setTextPageBreaks(GBool pageBreaks);
+  void setTextKeepTinyChars(GBool keep);
+  GBool setEnableFreeType(char *s);
+  GBool setDisableFreeTypeHinting(char *s);
+  GBool setAntialias(char *s);
+  GBool setVectorAntialias(char *s);
+  void setAntialiasPrinting(GBool print);
+  void setStrokeAdjust(GBool strokeAdjust);
+  void setScreenType(ScreenType st);
+  void setScreenSize(int size);
+  void setScreenDotRadius(int radius);
+  void setScreenGamma(double gamma);
+  void setScreenBlackThreshold(double blackThreshold);
+  void setScreenWhiteThreshold(double whiteThreshold);
+  void setMinLineWidth(double minLineWidth);
+  void setOverprintPreview(GBool overprintPreviewA);
+  void setMapNumericCharNames(GBool map);
+  void setMapUnknownCharNames(GBool map);
+  void setPrintCommands(GBool printCommandsA);
+  void setProfileCommands(GBool profileCommandsA);
+  void setErrQuiet(GBool errQuietA);
+
+  //----- security handlers
+
+  void addSecurityHandler(XpdfSecurityHandler *handler);
+  XpdfSecurityHandler *getSecurityHandler(char *name);
+
+private:
+
+  void parseNameToUnicode(GooString *name);
+  GBool parseYesNo2(const char *token, GBool *flag);
+  UnicodeMap *getUnicodeMap2(GooString *encodingName);
+
+  void scanEncodingDirs();
+  void addCIDToUnicode(GooString *collection, GooString *fileName);
+  void addUnicodeMap(GooString *encodingName, GooString *fileName);
+  void addCMapDir(GooString *collection, GooString *dir);
+
+  //----- static tables
+
+  NameToCharCode *             // mapping from char name to
+    macRomanReverseMap;                //   MacRomanEncoding index
+
+  //----- user-modifiable settings
+
+  GooString *baseDir;          // base directory - for plugins, etc.
+  NameToCharCode *             // mapping from char name to Unicode
+    nameToUnicode;
+  GooHash *cidToUnicodes;              // files for mappings from char collections
+                               //   to Unicode, indexed by collection name
+                               //   [GooString]
+  GooHash *unicodeToUnicodes;  // files for Unicode-to-Unicode mappings,
+                               //   indexed by font name pattern [GooString]
+  GooHash *residentUnicodeMaps;        // mappings from Unicode to char codes,
+                               //   indexed by encoding name [UnicodeMap]
+  GooHash *unicodeMaps;                // files for mappings from Unicode to char
+                               //   codes, indexed by encoding name [GooString]
+  GooHash *cMapDirs;           // list of CMap dirs, indexed by collection
+                               //   name [GooList[GooString]]
+  GooList *toUnicodeDirs;              // list of ToUnicode CMap dirs [GooString]
+  GBool baseFontsInitialized;
+#ifdef _WIN32
+  GooHash *substFiles; // windows font substitutes (for CID fonts)
+#endif
+  GooHash *fontFiles;          // font files: font name mapped to path
+                               //   [GString]
+  GooList *fontDirs;           // list of font dirs [GString]
+  GooHash *ccFontFiles;        // character collection font files:
+                               //   collection name  mapped to path [GString]
+  SysFontList *sysFonts;       // system fonts
+  GooString *psFile;           // PostScript file or command (for xpdf)
+  GBool psExpandSmaller;       // expand smaller pages to fill paper
+  GBool psShrinkLarger;                // shrink larger pages to fit paper
+  GBool psCenter;              // center pages on the paper
+  PSLevel psLevel;             // PostScript level to generate
+  GooHash *psResidentFonts;    // 8-bit fonts resident in printer:
+                               //   PDF font name mapped to PS font name
+                               //   [GString]
+  GooList *psResidentFonts16;  // 16-bit fonts resident in printer:
+                               //   PDF font name mapped to font info
+                               //   [PSFontParam16]
+  GooList *psResidentFontsCC;  // 16-bit character collection fonts
+                               //   resident in printer: collection name
+                               //   mapped to font info [PSFontParam16]
+  GBool psEmbedType1;          // embed Type 1 fonts?
+  GBool psEmbedTrueType;       // embed TrueType fonts?
+  GBool psEmbedCIDPostScript;  // embed CID PostScript fonts?
+  GBool psEmbedCIDTrueType;    // embed CID TrueType fonts?
+  GBool psFontPassthrough;     // pass all fonts through as-is?
+  GBool psPreload;             // preload PostScript images and forms into
+                               //   memory
+  GBool psOPI;                 // generate PostScript OPI comments?
+  GBool psASCIIHex;            // use ASCIIHex instead of ASCII85?
+  GBool psBinary;              // use binary instead of hex
+  GBool psUncompressPreloadedImages;  // uncompress all preloaded images
+  double psRasterResolution;   // PostScript rasterization resolution (dpi)
+  GBool psRasterMono;          // true to do PostScript rasterization
+                               //   in monochrome (gray); false to do it
+                               //   in color (RGB/CMYK)
+  GooString *textEncoding;     // encoding (unicodeMap) to use for text
+                               //   output
+  EndOfLineKind textEOL;       // type of EOL marker to use for text
+                               //   output
+  GBool textPageBreaks;                // insert end-of-page markers?
+  GBool textKeepTinyChars;     // keep all characters in text output
+  GBool enableFreeType;                // FreeType enable flag
+  GBool disableFreeTypeHinting;        // FreeType disable hinting flag
+  GBool antialias;             // anti-aliasing enable flag
+  GBool vectorAntialias;       // vector anti-aliasing enable flag
+  GBool antialiasPrinting;     // allow anti-aliasing when printing
+  GBool strokeAdjust;          // stroke adjustment enable flag
+  ScreenType screenType;       // halftone screen type
+  int screenSize;              // screen matrix size
+  int screenDotRadius;         // screen dot radius
+  double screenGamma;          // screen gamma correction
+  double screenBlackThreshold; // screen black clamping threshold
+  double screenWhiteThreshold; // screen white clamping threshold
+  double minLineWidth;         // minimum line width
+  GBool overprintPreview;      // enable overprint preview
+  GBool mapNumericCharNames;   // map numeric char names (from font subsets)?
+  GBool mapUnknownCharNames;   // map unknown char names?
+  GBool printCommands;         // print the drawing commands
+  GBool profileCommands;       // profile the drawing commands
+  GBool errQuiet;              // suppress error messages?
+  double splashResolution;     // resolution when rasterizing images
+
+  CharCodeToUnicodeCache *cidToUnicodeCache;
+  CharCodeToUnicodeCache *unicodeToUnicodeCache;
+  UnicodeMapCache *unicodeMapCache;
+  CMapCache *cMapCache;
+  
+#ifdef ENABLE_PLUGINS
+  GooList *plugins;            // list of plugins [Plugin]
+  GooList *securityHandlers;   // list of loaded security handlers
+                               //   [XpdfSecurityHandler]
+#endif
+
+#if MULTITHREADED
+  GooMutex mutex;
+  GooMutex unicodeMapCacheMutex;
+  GooMutex cMapCacheMutex;
+#endif
+
+  const char *popplerDataDir;
+};
+
+#endif
diff --git a/poppler/GlobalParamsWin.cc b/poppler/GlobalParamsWin.cc
new file mode 100644 (file)
index 0000000..527f08e
--- /dev/null
@@ -0,0 +1,598 @@
+/* Written by Krzysztof Kowalczyk (http://blog.kowalczyk.info)
+   but mostly based on xpdf code.
+   
+   // Copyright (C) 2010 Hib Eris <hib@hiberis.nl>
+   // Copyright (C) 2012 Thomas Freitag <Thomas.Freitag@alfa.de>
+   // Copyright (C) 2012 Suzuki Toshiya <mpsuzuki@hiroshima-u.ac.jp>
+   // Copyright (C) 2012 Adrian Johnson <ajohnson@redneon.com>
+   // Copyright (C) 2012 Mark Brand <mabrand@mabrand.nl>
+
+TODO: instead of a fixed mapping defined in displayFontTab, it could
+scan the whole fonts directory, parse TTF files and build font
+description for all fonts available in Windows. That's how MuPDF works.
+*/
+
+#ifndef PACKAGE_NAME
+#include <config.h>
+#endif
+
+#ifdef USE_GCC_PRAGMAS
+#pragma implementation
+#endif
+
+#include <windows.h>
+#if !(_WIN32_IE >= 0x0500)
+#error "_WIN32_IE must be defined >= 0x0500 for SHGFP_TYPE_CURRENT from shlobj.h"
+#endif
+#include <shlobj.h>
+#include <string.h>
+#include <stdio.h>
+#include <ctype.h>
+#include <assert.h>
+
+#include "goo/gmem.h"
+#include "goo/GooString.h"
+#include "goo/GooList.h"
+#include "goo/GooHash.h"
+#include "goo/gfile.h"
+#include "Error.h"
+#include "NameToCharCode.h"
+#include "CharCodeToUnicode.h"
+#include "UnicodeMap.h"
+#include "CMap.h"
+#include "BuiltinFontTables.h"
+#include "FontEncodingTables.h"
+#include "GlobalParams.h"
+#include "GfxFont.h"
+#include <sys/stat.h>
+#include "Object.h"
+#include "Stream.h"
+#include "Lexer.h"
+#include "Parser.h"
+
+#if MULTITHREADED
+#  define lockGlobalParams            gLockMutex(&mutex)
+#  define lockUnicodeMapCache         gLockMutex(&unicodeMapCacheMutex)
+#  define lockCMapCache               gLockMutex(&cMapCacheMutex)
+#  define unlockGlobalParams          gUnlockMutex(&mutex)
+#  define unlockUnicodeMapCache       gUnlockMutex(&unicodeMapCacheMutex)
+#  define unlockCMapCache             gUnlockMutex(&cMapCacheMutex)
+#else
+#  define lockGlobalParams
+#  define lockUnicodeMapCache
+#  define lockCMapCache
+#  define unlockGlobalParams
+#  define unlockUnicodeMapCache
+#  define unlockCMapCache
+#endif
+
+#define DEFAULT_SUBSTITUTE_FONT "Helvetica"
+#define DEFAULT_CID_FONT_AC1_MSWIN "MingLiU"   /* Adobe-CNS1 for Taiwan, HongKong */
+#define DEFAULT_CID_FONT_AG1_MSWIN "SimSun"    /* Adobe-GB1 for PRC, Singapore */
+#define DEFAULT_CID_FONT_AJ1_MSWIN "MS-Mincho" /* Adobe-Japan1 */
+#define DEFAULT_CID_FONT_AJ2_MSWIN "MS-Mincho" /* Adobe-Japan2 (legacy) */
+#define DEFAULT_CID_FONT_AK1_MSWIN "Batang"    /* Adobe-Korea1 */
+#define DEFAULT_CID_FONT_MSWIN "ArialUnicode"  /* Unknown */
+
+static struct {
+    const char *name;
+    const char *t1FileName;
+    const char *ttFileName;
+    GBool warnIfMissing;
+} displayFontTab[] = {
+    {"Courier",               "n022003l.pfb", "cour.ttf", gTrue},
+    {"Courier-Bold",          "n022004l.pfb", "courbd.ttf", gTrue},
+    {"Courier-BoldOblique",   "n022024l.pfb", "courbi.ttf", gTrue},
+    {"Courier-Oblique",       "n022023l.pfb", "couri.ttf", gTrue},
+    {"Helvetica",             "n019003l.pfb", "arial.ttf", gTrue},
+    {"Helvetica-Bold",        "n019004l.pfb", "arialbd.ttf", gTrue},
+    {"Helvetica-BoldOblique", "n019024l.pfb", "arialbi.ttf", gTrue},
+    {"Helvetica-Oblique",     "n019023l.pfb", "ariali.ttf", gTrue},
+    // TODO: not sure if "symbol.ttf" is right
+    {"Symbol",                "s050000l.pfb", "symbol.ttf", gTrue},
+    {"Times-Bold",            "n021004l.pfb", "timesbd.ttf", gTrue},
+    {"Times-BoldItalic",      "n021024l.pfb", "timesbi.ttf", gTrue},
+    {"Times-Italic",          "n021023l.pfb", "timesi.ttf", gTrue},
+    {"Times-Roman",           "n021003l.pfb", "times.ttf", gTrue},
+    // TODO: not sure if "wingding.ttf" is right
+    {"ZapfDingbats",          "d050000l.pfb", "wingding.ttf", gTrue},
+
+    // those seem to be frequently accessed by PDF files and I kind of guess
+    // which font file do the refer to
+    {"Palatino", NULL, "pala.ttf", gTrue},
+    {"Palatino-Roman", NULL, "pala.ttf", gTrue},
+    {"Palatino-Bold", NULL, "palab.ttf", gTrue},
+    {"Palatino-Italic", NULL, "palai.ttf", gTrue},
+    {"Palatino,Italic", NULL, "palai.ttf", gTrue},
+    {"Palatino-BoldItalic", NULL, "palabi.ttf", gTrue},
+
+    {"ArialBlack",        NULL, "arialbd.ttf", gTrue},
+
+    {"ArialNarrow", NULL, "arialn.ttf", gTrue},
+    {"ArialNarrow,Bold", NULL, "arialnb.ttf", gTrue},
+    {"ArialNarrow,Italic", NULL, "arialni.ttf", gTrue},
+    {"ArialNarrow,BoldItalic", NULL, "arialnbi.ttf", gTrue},
+    {"ArialNarrow-Bold", NULL, "arialnb.ttf", gTrue},
+    {"ArialNarrow-Italic", NULL, "arialni.ttf", gTrue},
+    {"ArialNarrow-BoldItalic", NULL, "arialnbi.ttf", gTrue},
+
+    {"HelveticaNarrow", NULL, "arialn.ttf", gTrue},
+    {"HelveticaNarrow,Bold", NULL, "arialnb.ttf", gTrue},
+    {"HelveticaNarrow,Italic", NULL, "arialni.ttf", gTrue},
+    {"HelveticaNarrow,BoldItalic", NULL, "arialnbi.ttf", gTrue},
+    {"HelveticaNarrow-Bold", NULL, "arialnb.ttf", gTrue},
+    {"HelveticaNarrow-Italic", NULL, "arialni.ttf", gTrue},
+    {"HelveticaNarrow-BoldItalic", NULL, "arialnbi.ttf", gTrue},
+
+    {"BookAntiqua", NULL, "bkant.ttf", gTrue},
+    {"BookAntiqua,Bold", NULL, "bkant.ttf", gTrue},
+    {"BookAntiqua,Italic", NULL, "bkant.ttf", gTrue},
+    {"BookAntiqua,BoldItalic", NULL, "bkant.ttf", gTrue},
+    {"BookAntiqua-Bold", NULL, "bkant.ttf", gTrue},
+    {"BookAntiqua-Italic", NULL, "bkant.ttf", gTrue},
+    {"BookAntiqua-BoldItalic", NULL, "bkant.ttf", gTrue},
+
+    {"Verdana", NULL, "verdana.ttf", gTrue},
+    {"Verdana,Bold", NULL, "verdanab.ttf", gTrue},
+    {"Verdana,Italic", NULL, "verdanai.ttf", gTrue},
+    {"Verdana,BoldItalic", NULL, "verdanaz.ttf", gTrue},
+    {"Verdana-Bold", NULL, "verdanab.ttf", gTrue},
+    {"Verdana-Italic", NULL, "verdanai.ttf", gTrue},
+    {"Verdana-BoldItalic", NULL, "verdanaz.ttf", gTrue},
+
+    {"Tahoma", NULL, "tahoma.ttf", gTrue},
+    {"Tahoma,Bold", NULL, "tahomabd.ttf", gTrue},
+    {"Tahoma,Italic", NULL, "tahoma.ttf", gTrue},
+    {"Tahoma,BoldItalic", NULL, "tahomabd.ttf", gTrue},
+    {"Tahoma-Bold", NULL, "tahomabd.ttf", gTrue},
+    {"Tahoma-Italic", NULL, "tahoma.ttf", gTrue},
+    {"Tahoma-BoldItalic", NULL, "tahomabd.ttf", gTrue},
+
+    {"CCRIKH+Verdana", NULL, "verdana.ttf", gTrue},
+    {"CCRIKH+Verdana,Bold", NULL, "verdanab.ttf", gTrue},
+    {"CCRIKH+Verdana,Italic", NULL, "verdanai.ttf", gTrue},
+    {"CCRIKH+Verdana,BoldItalic", NULL, "verdanaz.ttf", gTrue},
+    {"CCRIKH+Verdana-Bold", NULL, "verdanab.ttf", gTrue},
+    {"CCRIKH+Verdana-Italic", NULL, "verdanai.ttf", gTrue},
+    {"CCRIKH+Verdana-BoldItalic", NULL, "verdanaz.ttf", gTrue},
+
+    {"Georgia", NULL, "georgia.ttf", gTrue},
+    {"Georgia,Bold", NULL, "georgiab.ttf", gTrue},
+    {"Georgia,Italic", NULL, "georgiai.ttf", gTrue},
+    {"Georgia,BoldItalic", NULL, "georgiaz.ttf", gTrue},
+    {"Georgia-Bold", NULL, "georgiab.ttf", gTrue},
+    {"Georgia-Italic", NULL, "georgiai.ttf", gTrue},
+    {"Georgia-BoldItalic", NULL, "georgiaz.ttf", gTrue},
+
+    // fallback for Adobe CID fonts:
+    {"MingLiU", NULL, "mingliu.ttf", gFalse},
+    {"SimSun", NULL, "simsun.ttf", gFalse},
+    {"MS-Mincho", NULL, "msmincho.ttf", gFalse},
+    {"Batang", NULL, "batang.ttf", gFalse},
+    {"ArialUnicode", NULL, "arialuni.ttf", gTrue},
+    {NULL}
+};
+
+#define FONTS_SUBDIR "\\fonts"
+
+static void GetWindowsFontDir(char *winFontDir, int cbWinFontDirLen)
+{
+    BOOL (__stdcall *SHGetSpecialFolderPathFunc)(HWND  hwndOwner,
+                                                  LPTSTR lpszPath,
+                                                  int    nFolder,
+                                                  BOOL  fCreate);
+    HRESULT (__stdcall *SHGetFolderPathFunc)(HWND  hwndOwner,
+                                              int    nFolder,
+                                              HANDLE hToken,
+                                              DWORD  dwFlags,
+                                              LPTSTR pszPath);
+
+    // SHGetSpecialFolderPath isn't available in older versions of shell32.dll (Win95 and
+    // WinNT4), so do a dynamic load of ANSI versions.
+    winFontDir[0] = '\0';
+
+    HMODULE hLib = LoadLibrary("shell32.dll");
+    if (hLib) {
+        SHGetFolderPathFunc = (HRESULT (__stdcall *)(HWND, int, HANDLE, DWORD, LPTSTR)) 
+                              GetProcAddress(hLib, "SHGetFolderPathA");
+        if (SHGetFolderPathFunc)
+            (*SHGetFolderPathFunc)(NULL, CSIDL_FONTS, NULL, SHGFP_TYPE_CURRENT, winFontDir);
+
+        if (!winFontDir[0]) {
+            // Try an older function
+            SHGetSpecialFolderPathFunc = (BOOL (__stdcall *)(HWND, LPTSTR, int, BOOL))
+                                          GetProcAddress(hLib, "SHGetSpecialFolderPathA");
+            if (SHGetSpecialFolderPathFunc)
+                (*SHGetSpecialFolderPathFunc)(NULL, winFontDir, CSIDL_FONTS, FALSE);
+        }
+        FreeLibrary(hLib);
+    }
+    if (winFontDir[0])
+        return;
+
+    // Try older DLL
+    hLib = LoadLibrary("SHFolder.dll");
+    if (hLib) {
+        SHGetFolderPathFunc = (HRESULT (__stdcall *)(HWND, int, HANDLE, DWORD, LPTSTR))
+                              GetProcAddress(hLib, "SHGetFolderPathA");
+        if (SHGetFolderPathFunc)
+            (*SHGetFolderPathFunc)(NULL, CSIDL_FONTS, NULL, SHGFP_TYPE_CURRENT, winFontDir);
+        FreeLibrary(hLib);
+    }
+    if (winFontDir[0])
+        return;
+
+    // Everything else failed so the standard fonts directory.
+    GetWindowsDirectory(winFontDir, cbWinFontDirLen);                                                       
+    if (winFontDir[0]) {
+        strncat(winFontDir, FONTS_SUBDIR, cbWinFontDirLen);
+        winFontDir[cbWinFontDirLen-1] = 0;
+    }
+}
+
+static bool FileExists(const char *path)
+{
+    FILE * f = fopen(path, "rb");
+    if (f) {
+        fclose(f);
+        return true;
+    }
+    return false;
+}
+
+void SysFontList::scanWindowsFonts(GooString *winFontDir) {
+  OSVERSIONINFO version;
+  char *path;
+  DWORD idx, valNameLen, dataLen, type;
+  HKEY regKey;
+  char valName[1024], data[1024];
+  int n, fontNum;
+  char *p0, *p1;
+  GooString *fontPath;
+
+  version.dwOSVersionInfoSize = sizeof(version);
+  GetVersionEx(&version);
+  if (version.dwPlatformId == VER_PLATFORM_WIN32_NT) {
+    path = "SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Fonts\\";
+  } else {
+    path = "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Fonts\\";
+  }
+  if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, path, 0,
+                  KEY_QUERY_VALUE | KEY_ENUMERATE_SUB_KEYS,
+                  &regKey) == ERROR_SUCCESS) {
+    idx = 0;
+    while (1) {
+      valNameLen = sizeof(valName) - 1;
+      dataLen = sizeof(data) - 1;
+      if (RegEnumValue(regKey, idx, valName, &valNameLen, NULL,
+                      &type, (LPBYTE)data, &dataLen) != ERROR_SUCCESS) {
+       break;
+      }
+      if (type == REG_SZ &&
+         valNameLen > 0 && valNameLen < sizeof(valName) &&
+         dataLen > 0 && dataLen < sizeof(data)) {
+       valName[valNameLen] = '\0';
+       data[dataLen] = '\0';
+       n = strlen(data);
+       if (!strcasecmp(data + n - 4, ".ttf") ||
+           !strcasecmp(data + n - 4, ".ttc") ||
+           !strcasecmp(data + n - 4, ".otf")) {
+         fontPath = new GooString(data);
+         if (!(dataLen >= 3 && data[1] == ':' && data[2] == '\\')) {
+           fontPath->insert(0, '\\');
+           fontPath->insert(0, winFontDir);
+               fontPath->append('\0');
+         }
+         p0 = valName;
+         fontNum = 0;
+         while (*p0) {
+           p1 = strstr(p0, " & ");
+           if (p1) {
+             *p1 = '\0';
+             p1 = p1 + 3;
+           } else {
+             p1 = p0 + strlen(p0);
+           }
+           fonts->append(makeWindowsFont(p0, fontNum,
+                                         fontPath->getCString()));
+           p0 = p1;
+           ++fontNum;
+         }
+         delete fontPath;
+       }
+      }
+      ++idx;
+    }
+    RegCloseKey(regKey);
+  }
+}
+
+SysFontInfo *SysFontList::makeWindowsFont(char *name, int fontNum,
+                                         char *path) {
+  int n;
+  GBool bold, italic, oblique, fixedWidth;
+  GooString *s;
+  char c;
+  int i;
+  SysFontType type;
+  GooString substituteName;
+
+  n = strlen(name);
+  bold = italic = oblique = fixedWidth = gFalse;
+
+  // remove trailing ' (TrueType)'
+  if (n > 11 && !strncmp(name + n - 11, " (TrueType)", 11)) {
+    n -= 11;
+  }
+
+  // remove trailing ' (OpenType)'
+  if (n > 11 && !strncmp(name + n - 11, " (OpenType)", 11)) {
+    n -= 11;
+  }
+
+  // remove trailing ' Italic'
+  if (n > 7 && !strncmp(name + n - 7, " Italic", 7)) {
+    n -= 7;
+    italic = gTrue;
+  }
+
+  // remove trailing ' Oblique'
+  if (n > 7 && !strncmp(name + n - 8, " Oblique", 8)) {
+    n -= 8;
+    oblique = gTrue;
+  }
+
+  // remove trailing ' Bold'
+  if (n > 5 && !strncmp(name + n - 5, " Bold", 5)) {
+    n -= 5;
+    bold = gTrue;
+  }
+
+  // remove trailing ' Regular'
+  if (n > 5 && !strncmp(name + n - 8, " Regular", 8)) {
+    n -= 8;
+  }
+
+  // the familyname cannot indicate whether a font is fixedWidth or not.
+  // some well-known fixedWidth typeface family names or keyword are checked.
+  if ( strstr(name, "Courier") ||
+       strstr(name, "Fixed")   ||
+      (strstr(name, "Mono") && !strstr(name, "Monotype")) ||
+       strstr(name, "Typewriter") )
+    fixedWidth = gTrue;
+  else
+    fixedWidth = gFalse;
+
+
+  //----- normalize the font name
+  s = new GooString(name, n);
+  i = 0;
+  while (i < s->getLength()) {
+    c = s->getChar(i);
+    if (c == ' ' || c == ',' || c == '-') {
+      s->del(i);
+    } else {
+      ++i;
+    }
+  }
+
+  if (!strcasecmp(path + strlen(path) - 4, ".ttc")) {
+    type = sysFontTTC;
+  } else {
+    type = sysFontTTF;
+  }
+
+  return new SysFontInfo(s, bold, italic, oblique, fixedWidth,
+                         new GooString(path), type, fontNum, substituteName.copy());
+}
+
+static GooString* replaceSuffix(GooString *path,
+                                const char* suffixA, const char* suffixB)
+{
+  int suffLenA = strlen(suffixA);
+  int suffLenB = strlen(suffixB);
+  int baseLenA = path->getLength() - suffLenA;
+  int baseLenB = path->getLength() - suffLenB;
+
+  if (!strcasecmp(path->getCString()+baseLenA, suffixA)) {
+    path->del(baseLenA,suffLenA)->append(suffixB);
+  } else if (!strcasecmp(path->getCString()+baseLenB, suffixB)) {
+    path->del(baseLenB,suffLenB)->append(suffixA);
+  }
+
+  return path;
+}
+
+
+void GlobalParams::setupBaseFonts(char * dir)
+{
+    const char *dataRoot = popplerDataDir ? popplerDataDir : POPPLER_DATADIR;
+    GooString *fileName = NULL;
+    struct stat buf;
+    FILE *file;
+    int size = 0;
+
+    if (baseFontsInitialized)
+        return;
+    baseFontsInitialized = true;
+
+    char winFontDir[MAX_PATH];
+    GetWindowsFontDir(winFontDir, sizeof(winFontDir));
+
+    for (int i = 0; displayFontTab[i].name; ++i) {
+        GooString  *fontName = new GooString(displayFontTab[i].name);
+        if (fontFiles->lookup(fontName))
+            continue;
+
+        if (dir) {
+            GooString *fontPath = appendToPath(new GooString(dir), displayFontTab[i].t1FileName);
+            if (FileExists(fontPath->getCString()) ||
+                FileExists(replaceSuffix(fontPath, ".pfb", ".pfa")->getCString())) {
+                addFontFile(fontName, fontPath);
+                continue;
+            }
+            delete fontPath;
+        }
+
+        if (winFontDir[0] && displayFontTab[i].ttFileName) {
+            GooString *fontPath = appendToPath(new GooString(winFontDir), displayFontTab[i].ttFileName);
+            if (FileExists(fontPath->getCString()) ||
+                FileExists(replaceSuffix(fontPath, ".ttc", ".ttf")->getCString())) {
+                addFontFile(fontName, fontPath);
+                continue;
+            }
+            delete fontPath;
+        }
+
+        if (displayFontTab[i].warnIfMissing)
+          error(errSyntaxError, -1, "No display font for '{0:s}'", fontName);
+    }
+    if (winFontDir[0]) {
+      sysFonts->scanWindowsFonts(new GooString(winFontDir));
+    }
+
+    fileName = new GooString(dataRoot);
+    fileName->append("/cidfmap");
+    if (stat(fileName->getCString(), &buf) == 0) {
+      size = buf.st_size;
+    }
+    // try to open file
+#ifdef VMS
+    file = fopen(fileName->getCString(), "rb", "ctx=stm");
+#else
+    file = fopen(fileName->getCString(), "rb");
+#endif
+
+    if (file != NULL) {
+      Parser *parser;
+      Object obj1, obj2;
+
+      obj1.initNull();
+      parser = new Parser(NULL,
+             new Lexer(NULL,
+             new FileStream(file, 0, gFalse, size, &obj1)),
+             gTrue);
+      obj1.free();
+      parser->getObj(&obj1);
+      while (!obj1.isEOF()) {
+       parser->getObj(&obj2);
+       if (obj1.isName()) {
+         // Substitutions
+         if (obj2.isDict()) {
+           Object obj3;
+           obj2.getDict()->lookup("Path", &obj3);
+           if (obj3.isString())
+             addFontFile(new GooString(obj1.getName()), obj3.getString()->copy());
+           obj3.free();
+         // Aliases
+         } else if (obj2.isName()) {
+           substFiles->add(new GooString(obj1.getName()), new GooString(obj2.getName()));
+         }
+       }
+       obj2.free();
+       obj1.free();
+       parser->getObj(&obj1);
+       // skip trailing ';'
+       while (obj1.isCmd(";")) {
+         obj1.free();
+         parser->getObj(&obj1);
+       }
+      }
+      fclose(file);
+      delete parser;
+    }
+}
+
+static const char *findSubstituteName(GfxFont *font, GooHash *fontFiles,
+                                      GooHash *substFiles,
+                                      const char *origName)
+{
+    assert(origName);
+    if (!origName) return NULL;
+    GooString *name2 = new GooString(origName);
+    int n = strlen(origName);
+    // remove trailing "-Identity-H"
+    if (n > 11 && !strcmp(name2->getCString() + n - 11, "-Identity-H")) {
+      name2->del(n - 11, 11);
+      n -= 11;
+    }
+    // remove trailing "-Identity-V"
+    if (n > 11 && !strcmp(name2->getCString() + n - 11, "-Identity-V")) {
+      name2->del(n - 11, 11);
+      n -= 11;
+    }
+    GooString *substName = (GooString *)substFiles->lookup(name2);
+    if (substName != NULL) {
+      delete name2;
+      return substName->getCString();
+    }
+
+    /* TODO: try to at least guess bold/italic/bolditalic from the name */
+    delete name2;
+    if (font->isCIDFont()) {
+      GooString *collection = ((GfxCIDFont *)font)->getCollection();
+
+      const char* name3 = NULL;
+      if ( !collection->cmp("Adobe-CNS1") )
+        name3 = DEFAULT_CID_FONT_AC1_MSWIN;
+      else if ( !collection->cmp("Adobe-GB1") )
+        name3 = DEFAULT_CID_FONT_AG1_MSWIN;
+      else if ( !collection->cmp("Adobe-Japan1") )
+        name3 = DEFAULT_CID_FONT_AJ1_MSWIN;
+      else if ( !collection->cmp("Adobe-Japan2") )
+        name3 = DEFAULT_CID_FONT_AJ2_MSWIN;
+      else if ( !collection->cmp("Adobe-Korea1") )
+        name3 = DEFAULT_CID_FONT_AK1_MSWIN;
+
+      if (name3 && fontFiles->lookup(name3))
+        return name3;
+
+      if (fontFiles->lookup(DEFAULT_CID_FONT_MSWIN))
+        return DEFAULT_CID_FONT_MSWIN;
+    } 
+    return DEFAULT_SUBSTITUTE_FONT;
+}
+
+/* Windows implementation of external font matching code */
+GooString *GlobalParams::findSystemFontFile(GfxFont *font,
+                                         SysFontType *type,
+                                         int *fontNum, GooString *substituteFontName,
+                                          GooString *base14Name) {
+  SysFontInfo *fi;
+  GooString *path = NULL;
+  GooString *fontName = font->getName();
+  if (!fontName) return NULL;
+  lockGlobalParams;
+  setupBaseFonts(NULL);
+
+  // TODO: base14Name should be changed?
+  // In the system using FontConfig, findSystemFontFile() uses
+  // base14Name only for the creation of query pattern.
+
+  if ((fi = sysFonts->find(fontName, gFalse, gFalse))) {
+    path = fi->path->copy();
+    *type = fi->type;
+    *fontNum = fi->fontNum;
+    if (substituteFontName)
+      substituteFontName->Set(fi->substituteName->getCString());
+  } else {
+    GooString *substFontName = new GooString(findSubstituteName(font, fontFiles,
+                                                                substFiles,
+                                                                fontName->getCString()));
+    GooString *path2 = NULL;
+    error(errSyntaxError, -1, "Couldn't find a font for '{0:t}', subst is '{1:t}'", fontName, substFontName);
+    if ((path2 = (GooString *)fontFiles->lookup(substFontName))) {
+      path = new GooString(path2);
+      if (substituteFontName)
+       substituteFontName->Set(path->getCString());
+      if (!strcasecmp(path->getCString() + path->getLength() - 4, ".ttc")) {
+       *type = sysFontTTC;
+      } else {
+       *type = sysFontTTF;
+      }
+      *fontNum = 0;
+    }
+  }
+  unlockGlobalParams;
+  return path;
+}
diff --git a/poppler/Hints.cc b/poppler/Hints.cc
new file mode 100644 (file)
index 0000000..13bcc90
--- /dev/null
@@ -0,0 +1,444 @@
+//========================================================================
+//
+// Hints.cc
+//
+// This file is licensed under the GPLv2 or later
+//
+// Copyright 2010, 2012 Hib Eris <hib@hiberis.nl>
+// Copyright 2010, 2011 Albert Astals Cid <aacid@kde.org>
+// Copyright 2010 Pino Toscano <pino@kde.org>
+//
+//========================================================================
+
+#include <config.h>
+
+#include "Hints.h"
+
+#include "Linearization.h"
+#include "Object.h"
+#include "Stream.h"
+#include "XRef.h"
+#include "Parser.h"
+#include "Lexer.h"
+#include "SecurityHandler.h"
+
+#include <limits.h>
+
+//------------------------------------------------------------------------
+// Hints
+//------------------------------------------------------------------------
+
+Hints::Hints(BaseStream *str, Linearization *linearization, XRef *xref, SecurityHandler *secHdlr)
+{
+  mainXRefEntriesOffset = linearization->getMainXRefEntriesOffset();
+  nPages = linearization->getNumPages();
+  pageFirst = linearization->getPageFirst();
+  pageEndFirst = linearization->getEndFirst();
+  pageObjectFirst = linearization->getObjectNumberFirst();
+  if (pageObjectFirst < 0 || pageObjectFirst >= xref->getNumObjects()) {
+    error(errSyntaxWarning, -1,
+      "Invalid reference for first page object (%d) in linearization table ",
+      pageObjectFirst);
+    pageObjectFirst = 0;
+  }
+  pageOffsetFirst = xref->getEntry(pageObjectFirst)->offset;
+
+  if (nPages >= INT_MAX / (int)sizeof(Guint)) {
+     error(errSyntaxWarning, -1, "Invalid number of pages ({0:d}) for hints table", nPages);
+     nPages = 0;
+  }
+  nObjects = (Guint *) gmallocn_checkoverflow(nPages, sizeof(Guint));
+  pageObjectNum = (int *) gmallocn_checkoverflow(nPages, sizeof(int));
+  xRefOffset = (Guint *) gmallocn_checkoverflow(nPages, sizeof(Guint));
+  pageLength = (Guint *) gmallocn_checkoverflow(nPages, sizeof(Guint));
+  pageOffset = (Guint *) gmallocn_checkoverflow(nPages, sizeof(Guint));
+  numSharedObject = (Guint *) gmallocn_checkoverflow(nPages, sizeof(Guint));
+  sharedObjectId = (Guint **) gmallocn_checkoverflow(nPages, sizeof(Guint*));
+  if (!nObjects || !pageObjectNum || !xRefOffset || !pageLength || !pageOffset ||
+      !numSharedObject || !sharedObjectId) {
+    error(errSyntaxWarning, -1, "Failed to allocate memory for hints tabel");
+    nPages = 0;
+  }
+
+  memset(pageLength, 0, nPages * sizeof(Guint));
+  memset(pageOffset, 0, nPages * sizeof(Guint));
+  memset(numSharedObject, 0, nPages * sizeof(Guint));
+  memset(pageObjectNum, 0, nPages * sizeof(int));
+
+  nSharedGroups = 0;
+  groupLength = NULL;
+  groupOffset = NULL;
+  groupHasSignature = NULL;
+  groupNumObjects = NULL;
+  groupXRefOffset = NULL;
+
+  readTables(str, linearization, xref, secHdlr);
+}
+
+Hints::~Hints()
+{
+  gfree(nObjects);
+  gfree(pageObjectNum);
+  gfree(xRefOffset);
+  gfree(pageLength);
+  gfree(pageOffset);
+  for (int i=0; i< nPages; i++) {
+    if (numSharedObject[i]) {
+       gfree(sharedObjectId[i]);
+    }
+  }
+  gfree(sharedObjectId);
+  gfree(numSharedObject);
+
+  gfree(groupLength);
+  gfree(groupOffset);
+  gfree(groupHasSignature);
+  gfree(groupNumObjects);
+  gfree(groupXRefOffset);
+}
+
+void Hints::readTables(BaseStream *str, Linearization *linearization, XRef *xref, SecurityHandler *secHdlr)
+{
+  hintsOffset = linearization->getHintsOffset();
+  hintsLength = linearization->getHintsLength();
+  hintsOffset2 = linearization->getHintsOffset2();
+  hintsLength2 = linearization->getHintsLength2();
+
+  Parser *parser;
+  Object obj;
+
+  int bufLength = hintsLength + hintsLength2;
+
+  std::vector<char> buf(bufLength);
+  char *p = &buf[0];
+
+  obj.initNull();
+  Stream *s = str->makeSubStream(hintsOffset, gFalse, hintsLength, &obj);
+  s->reset();
+  for (Guint i=0; i < hintsLength; i++) { *p++ = s->getChar(); }
+  delete s;
+
+  if (hintsOffset2 && hintsLength2) {
+    obj.initNull();
+    s = str->makeSubStream(hintsOffset2, gFalse, hintsLength2, &obj);
+    s->reset();
+    for (Guint i=0; i < hintsLength2; i++) { *p++ = s->getChar(); }
+    delete s;
+  }
+
+  obj.initNull();
+  MemStream *memStream = new MemStream (&buf[0], 0, bufLength, &obj);
+
+  obj.initNull();
+  parser = new Parser(xref, new Lexer(xref, memStream), gTrue);
+
+  int num, gen;
+  if (parser->getObj(&obj)->isInt() &&
+     (num = obj.getInt(), obj.free(), parser->getObj(&obj)->isInt()) &&
+     (gen = obj.getInt(), obj.free(), parser->getObj(&obj)->isCmd("obj")) &&
+     (obj.free(), parser->getObj(&obj, gFalse,
+         secHdlr ? secHdlr->getFileKey() : (Guchar *)NULL,
+         secHdlr ? secHdlr->getEncAlgorithm() : cryptRC4,
+         secHdlr ? secHdlr->getFileKeyLength() : 0,
+         num, gen, 0, gTrue)->isStream())) {
+    Stream *hintsStream = obj.getStream();
+    Dict *hintsDict = obj.streamGetDict();
+
+    int sharedStreamOffset = 0;
+    if (hintsDict->lookupInt("S", NULL, &sharedStreamOffset) &&
+        sharedStreamOffset > 0) {
+
+        hintsStream->reset();
+        readPageOffsetTable(hintsStream);
+
+        hintsStream->reset();
+        for (int i=0; i<sharedStreamOffset; i++) hintsStream->getChar();
+        readSharedObjectsTable(hintsStream);
+    } else {
+      error(errSyntaxWarning, -1, "Invalid shared object hint table offset");
+    }
+  } else {
+    error(errSyntaxWarning, -1, "Failed parsing hints table object");
+  }
+  obj.free();
+
+  delete parser;
+}
+
+void Hints::readPageOffsetTable(Stream *str)
+{
+  if (nPages < 1) {
+    error(errSyntaxWarning, -1, "Invalid number of pages reading page offset hints table");
+    return;
+  }
+
+  inputBits = 0; // reset on byte boundary.
+
+  nObjectLeast = readBits(32, str);
+
+  objectOffsetFirst = readBits(32, str);
+  if (objectOffsetFirst >= hintsOffset) objectOffsetFirst += hintsLength;
+
+  nBitsDiffObjects = readBits(16, str);
+
+  pageLengthLeast = readBits(32, str);
+
+  nBitsDiffPageLength = readBits(16, str);
+
+  OffsetStreamLeast = readBits(32, str);
+
+  nBitsOffsetStream = readBits(16, str);
+
+  lengthStreamLeast = readBits(32, str);
+
+  nBitsLengthStream = readBits(16, str);
+
+  nBitsNumShared = readBits(16, str);
+
+  nBitsShared = readBits(16, str);
+
+  nBitsNumerator = readBits(16, str);
+
+  denominator = readBits(16, str);
+
+  for (int i=0; i<nPages; i++) {
+    nObjects[i] = nObjectLeast + readBits(nBitsDiffObjects, str);
+  }
+
+  nObjects[0] = 0;
+  xRefOffset[0] = mainXRefEntriesOffset + 20;
+  for (int i=1; i<nPages; i++) {
+    xRefOffset[i] = xRefOffset[i-1] + 20*nObjects[i-1];
+  }
+
+  pageObjectNum[0] = 1;
+  for (int i=1; i<nPages; i++) {
+    pageObjectNum[i] = pageObjectNum[i-1] + nObjects[i-1];
+  }
+  pageObjectNum[0] = pageObjectFirst;
+
+  inputBits = 0; // reset on byte boundary. Not in specs!
+  for (int i=0; i<nPages; i++) {
+    pageLength[i] = pageLengthLeast + readBits(nBitsDiffPageLength, str);
+  }
+
+  inputBits = 0; // reset on byte boundary. Not in specs!
+  numSharedObject[0] = readBits(nBitsNumShared, str);
+  numSharedObject[0] = 0; // Do not trust the read value to be 0.
+  sharedObjectId[0] = NULL;
+  for (int i=1; i<nPages; i++) {
+    numSharedObject[i] = readBits(nBitsNumShared, str);
+    if (numSharedObject[i] >= INT_MAX / (int)sizeof(Guint)) {
+       error(errSyntaxWarning, -1, "Invalid number of shared objects");
+       numSharedObject[i] = 0;
+       return;
+    }
+    sharedObjectId[i] = (Guint *) gmallocn_checkoverflow(numSharedObject[i], sizeof(Guint));
+    if (numSharedObject[i] && !sharedObjectId[i]) {
+       error(errSyntaxWarning, -1, "Failed to allocate memory for shared object IDs");
+       numSharedObject[i] = 0;
+       return;
+    }
+  }
+
+  inputBits = 0; // reset on byte boundary. Not in specs!
+  for (int i=1; i<nPages; i++) {
+    for (Guint j=0; j < numSharedObject[i]; j++) {
+      sharedObjectId[i][j] = readBits(nBitsShared, str);
+    }
+  }
+
+  pageOffset[0] = pageOffsetFirst;
+  // find pageOffsets.
+  for (int i=1; i<nPages; i++) {
+    pageOffset[i] = pageOffset[i-1] + pageLength[i-1];
+  }
+
+}
+
+void Hints::readSharedObjectsTable(Stream *str)
+{
+  inputBits = 0; // reset on byte boundary.
+
+  Guint firstSharedObjectNumber = readBits(32, str);
+
+  Guint firstSharedObjectOffset = readBits(32, str);
+  firstSharedObjectOffset += hintsLength;
+
+  Guint nSharedGroupsFirst = readBits(32, str);
+
+  Guint nSharedGroups = readBits(32, str);
+
+  Guint nBitsNumObjects = readBits(16, str);
+
+  Guint groupLengthLeast = readBits(32, str);
+
+  Guint nBitsDiffGroupLength = readBits(16, str);
+
+  if ((!nSharedGroups) || (nSharedGroups >= INT_MAX / (int)sizeof(Guint))) {
+     error(errSyntaxWarning, -1, "Invalid number of shared object groups");
+     nSharedGroups = 0;
+     return;
+  }
+  if ((!nSharedGroupsFirst) || (nSharedGroupsFirst > nSharedGroups)) {
+     error(errSyntaxWarning, -1, "Invalid number of first page shared object groups");
+     nSharedGroupsFirst = nSharedGroups;
+  }
+
+  groupLength = (Guint *) gmallocn_checkoverflow(nSharedGroups, sizeof(Guint));
+  groupOffset = (Guint *) gmallocn_checkoverflow(nSharedGroups, sizeof(Guint));
+  groupHasSignature = (Guint *) gmallocn_checkoverflow(nSharedGroups, sizeof(Guint));
+  groupNumObjects = (Guint *) gmallocn_checkoverflow(nSharedGroups, sizeof(Guint));
+  groupXRefOffset = (Guint *) gmallocn_checkoverflow(nSharedGroups, sizeof(Guint));
+  if (!groupLength || !groupOffset || !groupHasSignature ||
+      !groupNumObjects || !groupXRefOffset) {
+     error(errSyntaxWarning, -1, "Failed to allocate memory for shared object groups");
+     nSharedGroups = 0;
+     return;
+  }
+
+  inputBits = 0; // reset on byte boundary. Not in specs!
+  for (Guint i=0; i<nSharedGroups; i++) {
+    groupLength[i] = groupLengthLeast + readBits(nBitsDiffGroupLength, str);
+  }
+
+  groupOffset[0] = objectOffsetFirst;
+  for (Guint i=1; i<nSharedGroupsFirst; i++) {
+    groupOffset[i] = groupOffset[i-1] + groupLength[i-1];
+  }
+  if (nSharedGroups > nSharedGroupsFirst ) {
+    groupOffset[nSharedGroupsFirst] = firstSharedObjectOffset;
+    for (Guint i=nSharedGroupsFirst+1; i<nSharedGroups; i++) {
+      groupOffset[i] = groupOffset[i-1] + groupLength[i-1];
+    }
+  }
+
+  inputBits = 0; // reset on byte boundary. Not in specs!
+  for (Guint i=0; i<nSharedGroups; i++) {
+    groupHasSignature[i] = readBits(1, str);
+  }
+
+  inputBits = 0; // reset on byte boundary. Not in specs!
+  for (Guint i=0; i<nSharedGroups; i++) {
+    if (groupHasSignature[i]) {
+       readBits(128, str);
+    }
+  }
+
+  inputBits = 0; // reset on byte boundary. Not in specs!
+  for (Guint i=0; i<nSharedGroups; i++) {
+    groupNumObjects[i] =
+       nBitsNumObjects ? 1 + readBits(nBitsNumObjects, str) : 1;
+  }
+
+  for (Guint i=0; i<nSharedGroupsFirst; i++) {
+    groupNumObjects[i] = 0;
+    groupXRefOffset[i] = 0;
+  }
+  if (nSharedGroups > nSharedGroupsFirst ) {
+    groupXRefOffset[nSharedGroupsFirst] =
+        mainXRefEntriesOffset + 20*firstSharedObjectNumber;
+    for (Guint i=nSharedGroupsFirst+1; i<nSharedGroups; i++) {
+      groupXRefOffset[i] = groupXRefOffset[i-1] + 20*groupNumObjects[i-1];
+    }
+  }
+}
+
+Guint Hints::getPageOffset(int page)
+{
+  if ((page < 1) || (page > nPages)) return 0;
+
+  if (page-1 > pageFirst)
+    return pageOffset[page-1];
+  else if (page-1 < pageFirst)
+    return pageOffset[page];
+  else
+    return pageOffset[0];
+}
+
+std::vector<ByteRange>* Hints::getPageRanges(int page)
+{
+  if ((page < 1) || (page > nPages)) return NULL;
+
+  int idx;
+  if (page-1 > pageFirst)
+     idx = page-1;
+  else if (page-1 < pageFirst)
+     idx = page;
+  else
+     idx = 0;
+
+  ByteRange pageRange;
+  std::vector<ByteRange> *v = new std::vector<ByteRange>;
+
+  pageRange.offset = pageOffset[idx];
+  pageRange.length = pageLength[idx];
+  v->push_back(pageRange);
+
+  pageRange.offset = xRefOffset[idx];
+  pageRange.length = 20*nObjects[idx];
+  v->push_back(pageRange);
+
+  for (Guint j=0; j<numSharedObject[idx]; j++) {
+     Guint k = sharedObjectId[idx][j];
+
+     pageRange.offset = groupOffset[k];
+     pageRange.length = groupLength[k];
+     v->push_back(pageRange);
+
+     pageRange.offset = groupXRefOffset[k];
+     pageRange.length = 20*groupNumObjects[k];
+     v->push_back(pageRange);
+  }
+
+  return v;
+}
+
+Guint Hints::readBit(Stream *str)
+{
+  Guint bit;
+  int c;
+
+  if (inputBits == 0) {
+    if ((c = str->getChar()) == EOF) {
+      return (Guint) -1;
+    }
+    bitsBuffer = c;
+    inputBits = 8;
+  }
+  bit = (bitsBuffer >> (inputBits - 1)) & 1;
+  --inputBits;
+  return bit;
+}
+
+Guint Hints::readBits(int n, Stream *str)
+{
+  Guint bit, bits;
+
+  if (n < 0) return -1;
+  if (n == 0) return 0;
+
+  if (n == 1)
+    return readBit(str);
+
+  bit = (readBit(str) << (n-1));
+  if (bit == (Guint) -1)
+    return -1;
+
+  bits = readBits(n-1, str);
+  if (bits == (Guint) -1)
+    return -1;
+
+  return bit | bits;
+}
+
+int Hints::getPageObjectNum(int page) {
+  if ((page < 1) || (page > nPages)) return 0;
+
+  if (page-1 > pageFirst)
+    return pageObjectNum[page-1];
+  else if (page-1 < pageFirst)
+    return pageObjectNum[page];
+  else
+    return pageObjectNum[0];
+}
diff --git a/poppler/Hints.h b/poppler/Hints.h
new file mode 100644 (file)
index 0000000..d598e79
--- /dev/null
@@ -0,0 +1,95 @@
+//========================================================================
+//
+// Hints.h
+//
+// This file is licensed under the GPLv2 or later
+//
+// Copyright 2010 Hib Eris <hib@hiberis.nl>
+// Copyright 2010 Albert Astals Cid <aacid@kde.org>
+//
+//========================================================================
+
+#ifndef HINTS_H
+#define HINTS_H
+
+#include <string.h>
+#include "goo/gtypes.h"
+#include <vector>
+#include "PDFDoc.h"
+
+class Stream;
+class BaseStream;
+class Linearization;
+class XRef;
+
+//------------------------------------------------------------------------
+// Hints
+//------------------------------------------------------------------------
+
+class Hints {
+public:
+
+  Hints(BaseStream *str, Linearization *linearization, XRef *xref, SecurityHandler *secHdlr);
+  ~Hints();
+
+  int getPageObjectNum(int page);
+  Guint getPageOffset(int page);
+  std::vector<ByteRange>* getPageRanges(int page);
+
+private:
+
+  void readTables(BaseStream *str, Linearization *linearization, XRef *xref, SecurityHandler *secHdlr);
+  void readPageOffsetTable(Stream *str);
+  void readSharedObjectsTable(Stream *str);
+
+  Guint readBit(Stream *str);
+  Guint readBits(int n, Stream *str);
+
+  Guint hintsOffset;
+  Guint hintsLength;
+  Guint hintsOffset2;
+  Guint hintsLength2;
+  Guint mainXRefEntriesOffset;
+
+  int nPages;
+  int pageFirst;
+  int pageObjectFirst;
+  Guint pageOffsetFirst;
+  Guint pageEndFirst;
+  int objectNumberFirst;
+
+  Guint nObjectLeast;
+  Guint objectOffsetFirst;
+  Guint nBitsDiffObjects;
+  Guint pageLengthLeast;
+  Guint nBitsDiffPageLength;
+  Guint OffsetStreamLeast;
+  Guint nBitsOffsetStream;
+  Guint lengthStreamLeast;
+  Guint nBitsLengthStream;
+  Guint nBitsNumShared;
+  Guint nBitsShared;
+  Guint nBitsNumerator;
+  Guint denominator;
+
+  Guint *nObjects;
+  int *pageObjectNum;
+  Guint *xRefOffset;
+  Guint *pageLength;
+  Guint *pageOffset;
+  Guint *numSharedObject;
+  Guint **sharedObjectId;
+
+  Guint nSharedGroups;
+  Guint *groupLength;
+  Guint *groupOffset;
+  Guint *groupHasSignature;
+  Guint *groupNumObjects;
+  Guint *groupXRefOffset;
+
+  int inputBits;
+  char bitsBuffer;
+
+};
+
+#endif
diff --git a/poppler/JArithmeticDecoder.cc b/poppler/JArithmeticDecoder.cc
new file mode 100644 (file)
index 0000000..d23f7ea
--- /dev/null
@@ -0,0 +1,355 @@
+//========================================================================
+//
+// JArithmeticDecoder.cc
+//
+// Copyright 2002-2004 Glyph & Cog, LLC
+//
+//========================================================================
+
+#include <config.h>
+
+#ifdef USE_GCC_PRAGMAS
+#pragma implementation
+#endif
+
+#include "Object.h"
+#include "Stream.h"
+#include "JArithmeticDecoder.h"
+
+//------------------------------------------------------------------------
+// JArithmeticDecoderStates
+//------------------------------------------------------------------------
+
+JArithmeticDecoderStats::JArithmeticDecoderStats(int contextSizeA) {
+  contextSize = contextSizeA;
+  cxTab = (Guchar *)gmallocn(contextSize, sizeof(Guchar));
+  reset();
+}
+
+JArithmeticDecoderStats::~JArithmeticDecoderStats() {
+  gfree(cxTab);
+}
+
+JArithmeticDecoderStats *JArithmeticDecoderStats::copy() {
+  JArithmeticDecoderStats *stats;
+
+  stats = new JArithmeticDecoderStats(contextSize);
+  memcpy(stats->cxTab, cxTab, contextSize);
+  return stats;
+}
+
+void JArithmeticDecoderStats::reset() {
+  memset(cxTab, 0, contextSize);
+}
+
+void JArithmeticDecoderStats::copyFrom(JArithmeticDecoderStats *stats) {
+  memcpy(cxTab, stats->cxTab, contextSize);
+}
+
+void JArithmeticDecoderStats::setEntry(Guint cx, int i, int mps) {
+  cxTab[cx] = (i << 1) + mps;
+}
+
+//------------------------------------------------------------------------
+// JArithmeticDecoder
+//------------------------------------------------------------------------
+
+Guint JArithmeticDecoder::qeTab[47] = {
+  0x56010000, 0x34010000, 0x18010000, 0x0AC10000,
+  0x05210000, 0x02210000, 0x56010000, 0x54010000,
+  0x48010000, 0x38010000, 0x30010000, 0x24010000,
+  0x1C010000, 0x16010000, 0x56010000, 0x54010000,
+  0x51010000, 0x48010000, 0x38010000, 0x34010000,
+  0x30010000, 0x28010000, 0x24010000, 0x22010000,
+  0x1C010000, 0x18010000, 0x16010000, 0x14010000,
+  0x12010000, 0x11010000, 0x0AC10000, 0x09C10000,
+  0x08A10000, 0x05210000, 0x04410000, 0x02A10000,
+  0x02210000, 0x01410000, 0x01110000, 0x00850000,
+  0x00490000, 0x00250000, 0x00150000, 0x00090000,
+  0x00050000, 0x00010000, 0x56010000
+};
+
+int JArithmeticDecoder::nmpsTab[47] = {
+   1,  2,  3,  4,  5, 38,  7,  8,  9, 10, 11, 12, 13, 29, 15, 16,
+  17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32,
+  33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 45, 46
+};
+
+int JArithmeticDecoder::nlpsTab[47] = {
+   1,  6,  9, 12, 29, 33,  6, 14, 14, 14, 17, 18, 20, 21, 14, 14,
+  15, 16, 17, 18, 19, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29,
+  30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 46
+};
+
+int JArithmeticDecoder::switchTab[47] = {
+  1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
+};
+
+JArithmeticDecoder::JArithmeticDecoder() {
+  str = NULL;
+  dataLen = 0;
+  limitStream = gFalse;
+  nBytesRead = 0;
+}
+
+inline Guint JArithmeticDecoder::readByte() {
+  if (limitStream) {
+    --dataLen;
+    if (dataLen < 0) {
+      return 0xff;
+    }
+  }
+  ++nBytesRead;
+  return (Guint)str->getChar() & 0xff;
+}
+
+JArithmeticDecoder::~JArithmeticDecoder() {
+  cleanup();
+}
+
+void JArithmeticDecoder::start() {
+  buf0 = readByte();
+  buf1 = readByte();
+
+  // INITDEC
+  c = (buf0 ^ 0xff) << 16;
+  byteIn();
+  c <<= 7;
+  ct -= 7;
+  a = 0x80000000;
+}
+
+void JArithmeticDecoder::restart(int dataLenA) {
+  Guint cAdd;
+  GBool prevFF;
+  int k, nBits;
+
+  if (dataLen >= 0) {
+    dataLen = dataLenA;
+  } else if (dataLen == -1) {
+    dataLen = dataLenA;
+    buf1 = readByte();
+  } else {
+    k = (-dataLen - 1) * 8 - ct;
+    dataLen = dataLenA;
+    cAdd = 0;
+    prevFF = gFalse;
+    while (k > 0) {
+      buf0 = readByte();
+      if (prevFF) {
+       cAdd += 0xfe00 - (buf0 << 9);
+       nBits = 7;
+      } else {
+       cAdd += 0xff00 - (buf0 << 8);
+       nBits = 8;
+      }
+      prevFF = buf0 == 0xff;
+      if (k > nBits) {
+       cAdd <<= nBits;
+       k -= nBits;
+      } else {
+       cAdd <<= k;
+       ct = nBits - k;
+       k = 0;
+      }
+    }
+    c += cAdd;
+    buf1 = readByte();
+  }
+}
+
+void JArithmeticDecoder::cleanup() {
+  if (limitStream) {
+    while (dataLen > 0) {
+      buf0 = buf1;
+      buf1 = readByte();
+    }
+  }
+}
+
+int JArithmeticDecoder::decodeBit(Guint context,
+                                 JArithmeticDecoderStats *stats) {
+  int bit;
+  Guint qe;
+  int iCX, mpsCX;
+
+  iCX = stats->cxTab[context] >> 1;
+  mpsCX = stats->cxTab[context] & 1;
+  qe = qeTab[iCX];
+  a -= qe;
+  if (c < a) {
+    if (a & 0x80000000) {
+      bit = mpsCX;
+    } else {
+      // MPS_EXCHANGE
+      if (a < qe) {
+       bit = 1 - mpsCX;
+       if (switchTab[iCX]) {
+         stats->cxTab[context] = (nlpsTab[iCX] << 1) | (1 - mpsCX);
+       } else {
+         stats->cxTab[context] = (nlpsTab[iCX] << 1) | mpsCX;
+       }
+      } else {
+       bit = mpsCX;
+       stats->cxTab[context] = (nmpsTab[iCX] << 1) | mpsCX;
+      }
+      // RENORMD
+      do {
+       if (ct == 0) {
+         byteIn();
+       }
+       a <<= 1;
+       c <<= 1;
+       --ct;
+      } while (!(a & 0x80000000));
+    }
+  } else {
+    c -= a;
+    // LPS_EXCHANGE
+    if (a < qe) {
+      bit = mpsCX;
+      stats->cxTab[context] = (nmpsTab[iCX] << 1) | mpsCX;
+    } else {
+      bit = 1 - mpsCX;
+      if (switchTab[iCX]) {
+       stats->cxTab[context] = (nlpsTab[iCX] << 1) | (1 - mpsCX);
+      } else {
+       stats->cxTab[context] = (nlpsTab[iCX] << 1) | mpsCX;
+      }
+    }
+    a = qe;
+    // RENORMD
+    do {
+      if (ct == 0) {
+       byteIn();
+      }
+      a <<= 1;
+      c <<= 1;
+      --ct;
+    } while (!(a & 0x80000000));
+  }
+  return bit;
+}
+
+int JArithmeticDecoder::decodeByte(Guint context,
+                                  JArithmeticDecoderStats *stats) {
+  int byte;
+  int i;
+
+  byte = 0;
+  for (i = 0; i < 8; ++i) {
+    byte = (byte << 1) | decodeBit(context, stats);
+  }
+  return byte;
+}
+
+GBool JArithmeticDecoder::decodeInt(int *x, JArithmeticDecoderStats *stats) {
+  int s;
+  Guint v;
+  int i;
+
+  prev = 1;
+  s = decodeIntBit(stats);
+  if (decodeIntBit(stats)) {
+    if (decodeIntBit(stats)) {
+      if (decodeIntBit(stats)) {
+       if (decodeIntBit(stats)) {
+         if (decodeIntBit(stats)) {
+           v = 0;
+           for (i = 0; i < 32; ++i) {
+             v = (v << 1) | decodeIntBit(stats);
+           }
+           v += 4436;
+         } else {
+           v = 0;
+           for (i = 0; i < 12; ++i) {
+             v = (v << 1) | decodeIntBit(stats);
+           }
+           v += 340;
+         }
+       } else {
+         v = 0;
+         for (i = 0; i < 8; ++i) {
+           v = (v << 1) | decodeIntBit(stats);
+         }
+         v += 84;
+       }
+      } else {
+       v = 0;
+       for (i = 0; i < 6; ++i) {
+         v = (v << 1) | decodeIntBit(stats);
+       }
+       v += 20;
+      }
+    } else {
+      v = decodeIntBit(stats);
+      v = (v << 1) | decodeIntBit(stats);
+      v = (v << 1) | decodeIntBit(stats);
+      v = (v << 1) | decodeIntBit(stats);
+      v += 4;
+    }
+  } else {
+    v = decodeIntBit(stats);
+    v = (v << 1) | decodeIntBit(stats);
+  }
+
+  if (s) {
+    if (v == 0) {
+      return gFalse;
+    }
+    *x = -(int)v;
+  } else {
+    *x = (int)v;
+  }
+  return gTrue;
+}
+
+int JArithmeticDecoder::decodeIntBit(JArithmeticDecoderStats *stats) {
+  int bit;
+
+  bit = decodeBit(prev, stats);
+  if (prev < 0x100) {
+    prev = (prev << 1) | bit;
+  } else {
+    prev = (((prev << 1) | bit) & 0x1ff) | 0x100;
+  }
+  return bit;
+}
+
+Guint JArithmeticDecoder::decodeIAID(Guint codeLen,
+                                    JArithmeticDecoderStats *stats) {
+  Guint i;
+  int bit;
+
+  prev = 1;
+  for (i = 0; i < codeLen; ++i) {
+    bit = decodeBit(prev, stats);
+    prev = (prev << 1) | bit;
+  }
+  return prev - (1 << codeLen);
+}
+
+void JArithmeticDecoder::byteIn() {
+  if (buf0 == 0xff) {
+    if (buf1 > 0x8f) {
+      if (limitStream) {
+       buf0 = buf1;
+       buf1 = readByte();
+       c = c + 0xff00 - (buf0 << 8);
+      }
+      ct = 8;
+    } else {
+      buf0 = buf1;
+      buf1 = readByte();
+      c = c + 0xfe00 - (buf0 << 9);
+      ct = 7;
+    }
+  } else {
+    buf0 = buf1;
+    buf1 = readByte();
+    c = c + 0xff00 - (buf0 << 8);
+    ct = 8;
+  }
+}
diff --git a/poppler/JArithmeticDecoder.h b/poppler/JArithmeticDecoder.h
new file mode 100644 (file)
index 0000000..3c3e6fe
--- /dev/null
@@ -0,0 +1,111 @@
+//========================================================================
+//
+// JArithmeticDecoder.h
+//
+// Arithmetic decoder used by the JBIG2 and JPEG2000 decoders.
+//
+// Copyright 2002-2004 Glyph & Cog, LLC
+//
+//========================================================================
+
+#ifndef JARITHMETICDECODER_H
+#define JARITHMETICDECODER_H
+
+#ifdef USE_GCC_PRAGMAS
+#pragma interface
+#endif
+
+#include "goo/gtypes.h"
+
+class Stream;
+
+//------------------------------------------------------------------------
+// JArithmeticDecoderStats
+//------------------------------------------------------------------------
+
+class JArithmeticDecoderStats {
+public:
+
+  JArithmeticDecoderStats(int contextSizeA);
+  ~JArithmeticDecoderStats();
+  JArithmeticDecoderStats *copy();
+  void reset();
+  int getContextSize() { return contextSize; }
+  void copyFrom(JArithmeticDecoderStats *stats);
+  void setEntry(Guint cx, int i, int mps);
+
+private:
+
+  Guchar *cxTab;               // cxTab[cx] = (i[cx] << 1) + mps[cx]
+  int contextSize;
+
+  friend class JArithmeticDecoder;
+};
+
+//------------------------------------------------------------------------
+// JArithmeticDecoder
+//------------------------------------------------------------------------
+
+class JArithmeticDecoder {
+public:
+
+  JArithmeticDecoder();
+  ~JArithmeticDecoder();
+
+  void setStream(Stream *strA)
+    { str = strA; dataLen = 0; limitStream = gFalse; }
+  void setStream(Stream *strA, int dataLenA)
+    { str = strA; dataLen = dataLenA; limitStream = gTrue; }
+
+  // Start decoding on a new stream.  This fills the byte buffers and
+  // runs INITDEC.
+  void start();
+
+  // Restart decoding on an interrupted stream.  This refills the
+  // buffers if needed, but does not run INITDEC.  (This is used in
+  // JPEG 2000 streams when codeblock data is split across multiple
+  // packets/layers.)
+  void restart(int dataLenA);
+
+  // Read any leftover data in the stream.
+  void cleanup();
+
+  // Decode one bit.
+  int decodeBit(Guint context, JArithmeticDecoderStats *stats);
+
+  // Decode eight bits.
+  int decodeByte(Guint context, JArithmeticDecoderStats *stats);
+
+  // Returns false for OOB, otherwise sets *<x> and returns true.
+  GBool decodeInt(int *x, JArithmeticDecoderStats *stats);
+
+  Guint decodeIAID(Guint codeLen,
+                  JArithmeticDecoderStats *stats);
+
+  void resetByteCounter() { nBytesRead = 0; }
+  Guint getByteCounter() { return nBytesRead; }
+
+private:
+
+  Guint readByte();
+  int decodeIntBit(JArithmeticDecoderStats *stats);
+  void byteIn();
+
+  static Guint qeTab[47];
+  static int nmpsTab[47];
+  static int nlpsTab[47];
+  static int switchTab[47];
+
+  Guint buf0, buf1;
+  Guint c, a;
+  int ct;
+
+  Guint prev;                  // for the integer decoder
+
+  Stream *str;
+  Guint nBytesRead;
+  int dataLen;
+  GBool limitStream;
+};
+
+#endif
diff --git a/poppler/JBIG2Stream.cc b/poppler/JBIG2Stream.cc
new file mode 100644 (file)
index 0000000..78a205d
--- /dev/null
@@ -0,0 +1,4200 @@
+//========================================================================
+//
+// JBIG2Stream.cc
+//
+// Copyright 2002-2003 Glyph & Cog, LLC
+//
+//========================================================================
+
+//========================================================================
+//
+// Modified under the Poppler project - http://poppler.freedesktop.org
+//
+// All changes made under the Poppler project to this file are licensed
+// under GPL version 2 or later
+//
+// Copyright (C) 2006 Raj Kumar <rkumar@archive.org>
+// Copyright (C) 2006 Paul Walmsley <paul@booyaka.com>
+// Copyright (C) 2006-2010, 2012 Albert Astals Cid <aacid@kde.org>
+// Copyright (C) 2009 David Benjamin <davidben@mit.edu>
+// Copyright (C) 2011 Edward Jiang <ejiang@google.com>
+// Copyright (C) 2012 William Bader <williambader@hotmail.com>
+//
+// To see a description of the changes please see the Changelog file that
+// came with your tarball or type make ChangeLog if you are building from git
+//
+//========================================================================
+
+#include <config.h>
+
+#ifdef USE_GCC_PRAGMAS
+#pragma implementation
+#endif
+
+#include <stdlib.h>
+#include <limits.h>
+#include "goo/GooList.h"
+#include "Error.h"
+#include "JArithmeticDecoder.h"
+#include "JBIG2Stream.h"
+
+//~ share these tables
+#include "Stream-CCITT.h"
+
+//------------------------------------------------------------------------
+
+static const int contextSize[4] = { 16, 13, 10, 10 };
+static const int refContextSize[2] = { 13, 10 };
+
+//------------------------------------------------------------------------
+// JBIG2HuffmanTable
+//------------------------------------------------------------------------
+
+#define jbig2HuffmanLOW 0xfffffffd
+#define jbig2HuffmanOOB 0xfffffffe
+#define jbig2HuffmanEOT 0xffffffff
+
+struct JBIG2HuffmanTable {
+  int val;
+  Guint prefixLen;
+  Guint rangeLen;              // can also be LOW, OOB, or EOT
+  Guint prefix;
+};
+
+static JBIG2HuffmanTable huffTableA[] = {
+  {     0, 1,  4,              0x000 },
+  {    16, 2,  8,              0x002 },
+  {   272, 3, 16,              0x006 },
+  { 65808, 3, 32,              0x007 },
+  {     0, 0, jbig2HuffmanEOT, 0     }
+};
+
+static JBIG2HuffmanTable huffTableB[] = {
+  {     0, 1,  0,              0x000 },
+  {     1, 2,  0,              0x002 },
+  {     2, 3,  0,              0x006 },
+  {     3, 4,  3,              0x00e },
+  {    11, 5,  6,              0x01e },
+  {    75, 6, 32,              0x03e },
+  {     0, 6, jbig2HuffmanOOB, 0x03f },
+  {     0, 0, jbig2HuffmanEOT, 0     }
+};
+
+static JBIG2HuffmanTable huffTableC[] = {
+  {     0, 1,  0,              0x000 },
+  {     1, 2,  0,              0x002 },
+  {     2, 3,  0,              0x006 },
+  {     3, 4,  3,              0x00e },
+  {    11, 5,  6,              0x01e },
+  {     0, 6, jbig2HuffmanOOB, 0x03e },
+  {    75, 7, 32,              0x0fe },
+  {  -256, 8,  8,              0x0fe },
+  {  -257, 8, jbig2HuffmanLOW, 0x0ff },
+  {     0, 0, jbig2HuffmanEOT, 0     }
+};
+
+static JBIG2HuffmanTable huffTableD[] = {
+  {     1, 1,  0,              0x000 },
+  {     2, 2,  0,              0x002 },
+  {     3, 3,  0,              0x006 },
+  {     4, 4,  3,              0x00e },
+  {    12, 5,  6,              0x01e },
+  {    76, 5, 32,              0x01f },
+  {     0, 0, jbig2HuffmanEOT, 0     }
+};
+
+static JBIG2HuffmanTable huffTableE[] = {
+  {     1, 1,  0,              0x000 },
+  {     2, 2,  0,              0x002 },
+  {     3, 3,  0,              0x006 },
+  {     4, 4,  3,              0x00e },
+  {    12, 5,  6,              0x01e },
+  {    76, 6, 32,              0x03e },
+  {  -255, 7,  8,              0x07e },
+  {  -256, 7, jbig2HuffmanLOW, 0x07f },
+  {     0, 0, jbig2HuffmanEOT, 0     }
+};
+
+static JBIG2HuffmanTable huffTableF[] = {
+  {     0, 2,  7,              0x000 },
+  {   128, 3,  7,              0x002 },
+  {   256, 3,  8,              0x003 },
+  { -1024, 4,  9,              0x008 },
+  {  -512, 4,  8,              0x009 },
+  {  -256, 4,  7,              0x00a },
+  {   -32, 4,  5,              0x00b },
+  {   512, 4,  9,              0x00c },
+  {  1024, 4, 10,              0x00d },
+  { -2048, 5, 10,              0x01c },
+  {  -128, 5,  6,              0x01d },
+  {   -64, 5,  5,              0x01e },
+  { -2049, 6, jbig2HuffmanLOW, 0x03e },
+  {  2048, 6, 32,              0x03f },
+  {     0, 0, jbig2HuffmanEOT, 0     }
+};
+
+static JBIG2HuffmanTable huffTableG[] = {
+  {  -512, 3,  8,              0x000 },
+  {   256, 3,  8,              0x001 },
+  {   512, 3,  9,              0x002 },
+  {  1024, 3, 10,              0x003 },
+  { -1024, 4,  9,              0x008 },
+  {  -256, 4,  7,              0x009 },
+  {   -32, 4,  5,              0x00a },
+  {     0, 4,  5,              0x00b },
+  {   128, 4,  7,              0x00c },
+  {  -128, 5,  6,              0x01a },
+  {   -64, 5,  5,              0x01b },
+  {    32, 5,  5,              0x01c },
+  {    64, 5,  6,              0x01d },
+  { -1025, 5, jbig2HuffmanLOW, 0x01e },
+  {  2048, 5, 32,              0x01f },
+  {     0, 0, jbig2HuffmanEOT, 0     }
+};
+
+static JBIG2HuffmanTable huffTableH[] = {
+  {     0, 2,  1,              0x000 },
+  {     0, 2, jbig2HuffmanOOB, 0x001 },
+  {     4, 3,  4,              0x004 },
+  {    -1, 4,  0,              0x00a },
+  {    22, 4,  4,              0x00b },
+  {    38, 4,  5,              0x00c },
+  {     2, 5,  0,              0x01a },
+  {    70, 5,  6,              0x01b },
+  {   134, 5,  7,              0x01c },
+  {     3, 6,  0,              0x03a },
+  {    20, 6,  1,              0x03b },
+  {   262, 6,  7,              0x03c },
+  {   646, 6, 10,              0x03d },
+  {    -2, 7,  0,              0x07c },
+  {   390, 7,  8,              0x07d },
+  {   -15, 8,  3,              0x0fc },
+  {    -5, 8,  1,              0x0fd },
+  {    -7, 9,  1,              0x1fc },
+  {    -3, 9,  0,              0x1fd },
+  {   -16, 9, jbig2HuffmanLOW, 0x1fe },
+  {  1670, 9, 32,              0x1ff },
+  {     0, 0, jbig2HuffmanEOT, 0     }
+};
+
+static JBIG2HuffmanTable huffTableI[] = {
+  {     0, 2, jbig2HuffmanOOB, 0x000 },
+  {    -1, 3,  1,              0x002 },
+  {     1, 3,  1,              0x003 },
+  {     7, 3,  5,              0x004 },
+  {    -3, 4,  1,              0x00a },
+  {    43, 4,  5,              0x00b },
+  {    75, 4,  6,              0x00c },
+  {     3, 5,  1,              0x01a },
+  {   139, 5,  7,              0x01b },
+  {   267, 5,  8,              0x01c },
+  {     5, 6,  1,              0x03a },
+  {    39, 6,  2,              0x03b },
+  {   523, 6,  8,              0x03c },
+  {  1291, 6, 11,              0x03d },
+  {    -5, 7,  1,              0x07c },
+  {   779, 7,  9,              0x07d },
+  {   -31, 8,  4,              0x0fc },
+  {   -11, 8,  2,              0x0fd },
+  {   -15, 9,  2,              0x1fc },
+  {    -7, 9,  1,              0x1fd },
+  {   -32, 9, jbig2HuffmanLOW, 0x1fe },
+  {  3339, 9, 32,              0x1ff },
+  {     0, 0, jbig2HuffmanEOT, 0     }
+};
+
+static JBIG2HuffmanTable huffTableJ[] = {
+  {    -2, 2,  2,              0x000 },
+  {     6, 2,  6,              0x001 },
+  {     0, 2, jbig2HuffmanOOB, 0x002 },
+  {    -3, 5,  0,              0x018 },
+  {     2, 5,  0,              0x019 },
+  {    70, 5,  5,              0x01a },
+  {     3, 6,  0,              0x036 },
+  {   102, 6,  5,              0x037 },
+  {   134, 6,  6,              0x038 },
+  {   198, 6,  7,              0x039 },
+  {   326, 6,  8,              0x03a },
+  {   582, 6,  9,              0x03b },
+  {  1094, 6, 10,              0x03c },
+  {   -21, 7,  4,              0x07a },
+  {    -4, 7,  0,              0x07b },
+  {     4, 7,  0,              0x07c },
+  {  2118, 7, 11,              0x07d },
+  {    -5, 8,  0,              0x0fc },
+  {     5, 8,  0,              0x0fd },
+  {   -22, 8, jbig2HuffmanLOW, 0x0fe },
+  {  4166, 8, 32,              0x0ff },
+  {     0, 0, jbig2HuffmanEOT, 0     }
+};
+
+static JBIG2HuffmanTable huffTableK[] = {
+  {     1, 1,  0,              0x000 },
+  {     2, 2,  1,              0x002 },
+  {     4, 4,  0,              0x00c },
+  {     5, 4,  1,              0x00d },
+  {     7, 5,  1,              0x01c },
+  {     9, 5,  2,              0x01d },
+  {    13, 6,  2,              0x03c },
+  {    17, 7,  2,              0x07a },
+  {    21, 7,  3,              0x07b },
+  {    29, 7,  4,              0x07c },
+  {    45, 7,  5,              0x07d },
+  {    77, 7,  6,              0x07e },
+  {   141, 7, 32,              0x07f },
+  {     0, 0, jbig2HuffmanEOT, 0     }
+};
+
+static JBIG2HuffmanTable huffTableL[] = {
+  {     1, 1,  0,              0x000 },
+  {     2, 2,  0,              0x002 },
+  {     3, 3,  1,              0x006 },
+  {     5, 5,  0,              0x01c },
+  {     6, 5,  1,              0x01d },
+  {     8, 6,  1,              0x03c },
+  {    10, 7,  0,              0x07a },
+  {    11, 7,  1,              0x07b },
+  {    13, 7,  2,              0x07c },
+  {    17, 7,  3,              0x07d },
+  {    25, 7,  4,              0x07e },
+  {    41, 8,  5,              0x0fe },
+  {    73, 8, 32,              0x0ff },
+  {     0, 0, jbig2HuffmanEOT, 0     }
+};
+
+static JBIG2HuffmanTable huffTableM[] = {
+  {     1, 1,  0,              0x000 },
+  {     2, 3,  0,              0x004 },
+  {     7, 3,  3,              0x005 },
+  {     3, 4,  0,              0x00c },
+  {     5, 4,  1,              0x00d },
+  {     4, 5,  0,              0x01c },
+  {    15, 6,  1,              0x03a },
+  {    17, 6,  2,              0x03b },
+  {    21, 6,  3,              0x03c },
+  {    29, 6,  4,              0x03d },
+  {    45, 6,  5,              0x03e },
+  {    77, 7,  6,              0x07e },
+  {   141, 7, 32,              0x07f },
+  {     0, 0, jbig2HuffmanEOT, 0     }
+};
+
+static JBIG2HuffmanTable huffTableN[] = {
+  {     0, 1,  0,              0x000 },
+  {    -2, 3,  0,              0x004 },
+  {    -1, 3,  0,              0x005 },
+  {     1, 3,  0,              0x006 },
+  {     2, 3,  0,              0x007 },
+  {     0, 0, jbig2HuffmanEOT, 0     }
+};
+
+static JBIG2HuffmanTable huffTableO[] = {
+  {     0, 1,  0,              0x000 },
+  {    -1, 3,  0,              0x004 },
+  {     1, 3,  0,              0x005 },
+  {    -2, 4,  0,              0x00c },
+  {     2, 4,  0,              0x00d },
+  {    -4, 5,  1,              0x01c },
+  {     3, 5,  1,              0x01d },
+  {    -8, 6,  2,              0x03c },
+  {     5, 6,  2,              0x03d },
+  {   -24, 7,  4,              0x07c },
+  {     9, 7,  4,              0x07d },
+  {   -25, 7, jbig2HuffmanLOW, 0x07e },
+  {    25, 7, 32,              0x07f },
+  {     0, 0, jbig2HuffmanEOT, 0     }
+};
+
+//------------------------------------------------------------------------
+// JBIG2HuffmanDecoder
+//------------------------------------------------------------------------
+
+class JBIG2HuffmanDecoder {
+public:
+
+  JBIG2HuffmanDecoder();
+  ~JBIG2HuffmanDecoder();
+  void setStream(Stream *strA) { str = strA; }
+
+  void reset();
+
+  // Returns false for OOB, otherwise sets *<x> and returns true.
+  GBool decodeInt(int *x, JBIG2HuffmanTable *table);
+
+  Guint readBits(Guint n);
+  Guint readBit();
+
+  // Sort the table by prefix length and assign prefix values.
+  void buildTable(JBIG2HuffmanTable *table, Guint len);
+
+private:
+
+  Stream *str;
+  Guint buf;
+  Guint bufLen;
+};
+
+JBIG2HuffmanDecoder::JBIG2HuffmanDecoder() {
+  str = NULL;
+  reset();
+}
+
+JBIG2HuffmanDecoder::~JBIG2HuffmanDecoder() {
+}
+
+void JBIG2HuffmanDecoder::reset() {
+  buf = 0;
+  bufLen = 0;
+}
+
+//~ optimize this
+GBool JBIG2HuffmanDecoder::decodeInt(int *x, JBIG2HuffmanTable *table) {
+  Guint i, len, prefix;
+
+  i = 0;
+  len = 0;
+  prefix = 0;
+  while (table[i].rangeLen != jbig2HuffmanEOT) {
+    while (len < table[i].prefixLen) {
+      prefix = (prefix << 1) | readBit();
+      ++len;
+    }
+    if (prefix == table[i].prefix) {
+      if (table[i].rangeLen == jbig2HuffmanOOB) {
+       return gFalse;
+      }
+      if (table[i].rangeLen == jbig2HuffmanLOW) {
+       *x = table[i].val - readBits(32);
+      } else if (table[i].rangeLen > 0) {
+       *x = table[i].val + readBits(table[i].rangeLen);
+      } else {
+       *x = table[i].val;
+      }
+      return gTrue;
+    }
+    ++i;
+  }
+  return gFalse;
+}
+
+Guint JBIG2HuffmanDecoder::readBits(Guint n) {
+  Guint x, mask, nLeft;
+
+  mask = (n == 32) ? 0xffffffff : ((1 << n) - 1);
+  if (bufLen >= n) {
+    x = (buf >> (bufLen - n)) & mask;
+    bufLen -= n;
+  } else {
+    x = buf & ((1 << bufLen) - 1);
+    nLeft = n - bufLen;
+    bufLen = 0;
+    while (nLeft >= 8) {
+      x = (x << 8) | (str->getChar() & 0xff);
+      nLeft -= 8;
+    }
+    if (nLeft > 0) {
+      buf = str->getChar();
+      bufLen = 8 - nLeft;
+      x = (x << nLeft) | ((buf >> bufLen) & ((1 << nLeft) - 1));
+    }
+  }
+  return x;
+}
+
+Guint JBIG2HuffmanDecoder::readBit() {
+  if (bufLen == 0) {
+    buf = str->getChar();
+    bufLen = 8;
+  }
+  --bufLen;
+  return (buf >> bufLen) & 1;
+}
+
+void JBIG2HuffmanDecoder::buildTable(JBIG2HuffmanTable *table, Guint len) {
+  Guint i, j, k, prefix;
+  JBIG2HuffmanTable tab;
+
+  // stable selection sort:
+  // - entries with prefixLen > 0, in ascending prefixLen order
+  // - entry with prefixLen = 0, rangeLen = EOT
+  // - all other entries with prefixLen = 0
+  // (on entry, table[len] has prefixLen = 0, rangeLen = EOT)
+  for (i = 0; i < len; ++i) {
+    for (j = i; j < len && table[j].prefixLen == 0; ++j) ;
+    if (j == len) {
+      break;
+    }
+    for (k = j + 1; k < len; ++k) {
+      if (table[k].prefixLen > 0 &&
+         table[k].prefixLen < table[j].prefixLen) {
+       j = k;
+      }
+    }
+    if (j != i) {
+      tab = table[j];
+      for (k = j; k > i; --k) {
+       table[k] = table[k - 1];
+      }
+      table[i] = tab;
+    }
+  }
+  table[i] = table[len];
+
+  // assign prefixes
+  if (table[0].rangeLen != jbig2HuffmanEOT) {
+    i = 0;
+    prefix = 0;
+    table[i++].prefix = prefix++;
+    for (; table[i].rangeLen != jbig2HuffmanEOT; ++i) {
+      prefix <<= table[i].prefixLen - table[i-1].prefixLen;
+      table[i].prefix = prefix++;
+    }
+  }
+}
+
+//------------------------------------------------------------------------
+// JBIG2MMRDecoder
+//------------------------------------------------------------------------
+
+class JBIG2MMRDecoder {
+public:
+
+  JBIG2MMRDecoder();
+  ~JBIG2MMRDecoder();
+  void setStream(Stream *strA) { str = strA; }
+  void reset();
+  int get2DCode();
+  int getBlackCode();
+  int getWhiteCode();
+  Guint get24Bits();
+  void skipTo(Guint length);
+
+private:
+
+  Stream *str;
+  Guint buf;
+  Guint bufLen;
+  Guint nBytesRead;
+};
+
+JBIG2MMRDecoder::JBIG2MMRDecoder() {
+  str = NULL;
+  reset();
+}
+
+JBIG2MMRDecoder::~JBIG2MMRDecoder() {
+}
+
+void JBIG2MMRDecoder::reset() {
+  buf = 0;
+  bufLen = 0;
+  nBytesRead = 0;
+}
+
+int JBIG2MMRDecoder::get2DCode() {
+  const CCITTCode *p;
+
+  if (bufLen == 0) {
+    buf = str->getChar() & 0xff;
+    bufLen = 8;
+    ++nBytesRead;
+    p = &twoDimTab1[(buf >> 1) & 0x7f];
+  } else if (bufLen == 8) {
+    p = &twoDimTab1[(buf >> 1) & 0x7f];
+  } else {
+    p = &twoDimTab1[(buf << (7 - bufLen)) & 0x7f];
+    if (p->bits < 0 || p->bits > (int)bufLen) {
+      buf = (buf << 8) | (str->getChar() & 0xff);
+      bufLen += 8;
+      ++nBytesRead;
+      p = &twoDimTab1[(buf >> (bufLen - 7)) & 0x7f];
+    }
+  }
+  if (p->bits < 0) {
+    error(errSyntaxError, str->getPos(), "Bad two dim code in JBIG2 MMR stream");
+    return EOF;
+  }
+  bufLen -= p->bits;
+  return p->n;
+}
+
+int JBIG2MMRDecoder::getWhiteCode() {
+  const CCITTCode *p;
+  Guint code;
+
+  if (bufLen == 0) {
+    buf = str->getChar() & 0xff;
+    bufLen = 8;
+    ++nBytesRead;
+  }
+  while (1) {
+    if (bufLen >= 11 && ((buf >> (bufLen - 7)) & 0x7f) == 0) {
+      if (bufLen <= 12) {
+       code = buf << (12 - bufLen);
+      } else {
+       code = buf >> (bufLen - 12);
+      }
+      p = &whiteTab1[code & 0x1f];
+    } else {
+      if (bufLen <= 9) {
+       code = buf << (9 - bufLen);
+      } else {
+       code = buf >> (bufLen - 9);
+      }
+      p = &whiteTab2[code & 0x1ff];
+    }
+    if (p->bits > 0 && p->bits <= (int)bufLen) {
+      bufLen -= p->bits;
+      return p->n;
+    }
+    if (bufLen >= 12) {
+      break;
+    }
+    buf = (buf << 8) | (str->getChar() & 0xff);
+    bufLen += 8;
+    ++nBytesRead;
+  }
+  error(errSyntaxError, str->getPos(), "Bad white code in JBIG2 MMR stream");
+  // eat a bit and return a positive number so that the caller doesn't
+  // go into an infinite loop
+  --bufLen;
+  return 1;
+}
+
+int JBIG2MMRDecoder::getBlackCode() {
+  const CCITTCode *p;
+  Guint code;
+
+  if (bufLen == 0) {
+    buf = str->getChar() & 0xff;
+    bufLen = 8;
+    ++nBytesRead;
+  }
+  while (1) {
+    if (bufLen >= 10 && ((buf >> (bufLen - 6)) & 0x3f) == 0) {
+      if (bufLen <= 13) {
+       code = buf << (13 - bufLen);
+      } else {
+       code = buf >> (bufLen - 13);
+      }
+      p = &blackTab1[code & 0x7f];
+    } else if (bufLen >= 7 && ((buf >> (bufLen - 4)) & 0x0f) == 0 &&
+              ((buf >> (bufLen - 6)) & 0x03) != 0) {
+      if (bufLen <= 12) {
+       code = buf << (12 - bufLen);
+      } else {
+       code = buf >> (bufLen - 12);
+      }
+      p = &blackTab2[(code & 0xff) - 64];
+    } else {
+      if (bufLen <= 6) {
+       code = buf << (6 - bufLen);
+      } else {
+       code = buf >> (bufLen - 6);
+      }
+      p = &blackTab3[code & 0x3f];
+    }
+    if (p->bits > 0 && p->bits <= (int)bufLen) {
+      bufLen -= p->bits;
+      return p->n;
+    }
+    if (bufLen >= 13) {
+      break;
+    }
+    buf = (buf << 8) | (str->getChar() & 0xff);
+    bufLen += 8;
+    ++nBytesRead;
+  }
+  error(errSyntaxError, str->getPos(), "Bad black code in JBIG2 MMR stream");
+  // eat a bit and return a positive number so that the caller doesn't
+  // go into an infinite loop
+  --bufLen;
+  return 1;
+}
+
+Guint JBIG2MMRDecoder::get24Bits() {
+  while (bufLen < 24) {
+    buf = (buf << 8) | (str->getChar() & 0xff);
+    bufLen += 8;
+    ++nBytesRead;
+  }
+  return (buf >> (bufLen - 24)) & 0xffffff;
+}
+
+void JBIG2MMRDecoder::skipTo(Guint length) {
+  while (nBytesRead < length) {
+    str->getChar();
+    ++nBytesRead;
+  }
+}
+
+//------------------------------------------------------------------------
+// JBIG2Segment
+//------------------------------------------------------------------------
+
+enum JBIG2SegmentType {
+  jbig2SegBitmap,
+  jbig2SegSymbolDict,
+  jbig2SegPatternDict,
+  jbig2SegCodeTable
+};
+
+class JBIG2Segment {
+public:
+
+  JBIG2Segment(Guint segNumA) { segNum = segNumA; }
+  virtual ~JBIG2Segment() {}
+  void setSegNum(Guint segNumA) { segNum = segNumA; }
+  Guint getSegNum() { return segNum; }
+  virtual JBIG2SegmentType getType() = 0;
+
+private:
+
+  Guint segNum;
+};
+
+//------------------------------------------------------------------------
+// JBIG2Bitmap
+//------------------------------------------------------------------------
+
+struct JBIG2BitmapPtr {
+  Guchar *p;
+  int shift;
+  int x;
+};
+
+class JBIG2Bitmap: public JBIG2Segment {
+public:
+
+  JBIG2Bitmap(Guint segNumA, int wA, int hA);
+  virtual ~JBIG2Bitmap();
+  virtual JBIG2SegmentType getType() { return jbig2SegBitmap; }
+  JBIG2Bitmap *copy() { return new JBIG2Bitmap(0, this); }
+  JBIG2Bitmap *getSlice(Guint x, Guint y, Guint wA, Guint hA);
+  void expand(int newH, Guint pixel);
+  void clearToZero();
+  void clearToOne();
+  int getWidth() { return w; }
+  int getHeight() { return h; }
+  int getLineSize() { return line; }
+  int getPixel(int x, int y)
+    { return (x < 0 || x >= w || y < 0 || y >= h) ? 0 :
+             (data[y * line + (x >> 3)] >> (7 - (x & 7))) & 1; }
+  void setPixel(int x, int y)
+    { data[y * line + (x >> 3)] |= 1 << (7 - (x & 7)); }
+  void clearPixel(int x, int y)
+    { data[y * line + (x >> 3)] &= 0x7f7f >> (x & 7); }
+  void getPixelPtr(int x, int y, JBIG2BitmapPtr *ptr);
+  int nextPixel(JBIG2BitmapPtr *ptr);
+  void duplicateRow(int yDest, int ySrc);
+  void combine(JBIG2Bitmap *bitmap, int x, int y, Guint combOp);
+  Guchar *getDataPtr() { return data; }
+  int getDataSize() { return h * line; }
+  GBool isOk() { return data != NULL; }
+
+private:
+
+  JBIG2Bitmap(Guint segNumA, JBIG2Bitmap *bitmap);
+
+  int w, h, line;
+  Guchar *data;
+};
+
+JBIG2Bitmap::JBIG2Bitmap(Guint segNumA, int wA, int hA):
+  JBIG2Segment(segNumA)
+{
+  w = wA;
+  h = hA;
+  line = (wA + 7) >> 3;
+
+  if (w <= 0 || h <= 0 || line <= 0 || h >= (INT_MAX - 1) / line) {
+    error(errSyntaxError, -1, "invalid width/height");
+    data = NULL;
+    return;
+  }
+  // need to allocate one extra guard byte for use in combine()
+  data = (Guchar *)gmalloc(h * line + 1);
+  data[h * line] = 0;
+}
+
+JBIG2Bitmap::JBIG2Bitmap(Guint segNumA, JBIG2Bitmap *bitmap):
+  JBIG2Segment(segNumA)
+{
+  if (unlikely(bitmap == NULL)) {
+    error(errSyntaxError, -1, "NULL bitmap in JBIG2Bitmap");
+    w = h = line = 0;
+    data = NULL;
+    return;
+  }
+
+  w = bitmap->w;
+  h = bitmap->h;
+  line = bitmap->line;
+
+  if (w <= 0 || h <= 0 || line <= 0 || h >= (INT_MAX - 1) / line) {
+    error(errSyntaxError, -1, "invalid width/height");
+    data = NULL;
+    return;
+  }
+  // need to allocate one extra guard byte for use in combine()
+  data = (Guchar *)gmalloc(h * line + 1);
+  memcpy(data, bitmap->data, h * line);
+  data[h * line] = 0;
+}
+
+JBIG2Bitmap::~JBIG2Bitmap() {
+  gfree(data);
+}
+
+//~ optimize this
+JBIG2Bitmap *JBIG2Bitmap::getSlice(Guint x, Guint y, Guint wA, Guint hA) {
+  JBIG2Bitmap *slice;
+  Guint xx, yy;
+
+  slice = new JBIG2Bitmap(0, wA, hA);
+  if (slice->isOk()) {
+    slice->clearToZero();
+    for (yy = 0; yy < hA; ++yy) {
+      for (xx = 0; xx < wA; ++xx) {
+        if (getPixel(x + xx, y + yy)) {
+         slice->setPixel(xx, yy);
+        }
+      }
+    }
+  } else {
+    delete slice;
+    slice = NULL;
+  }
+  return slice;
+}
+
+void JBIG2Bitmap::expand(int newH, Guint pixel) {
+  if (newH <= h || line <= 0 || newH >= (INT_MAX - 1) / line) {
+    error(errSyntaxError, -1, "invalid width/height");
+    gfree(data);
+    data = NULL;
+    return;
+  }
+  // need to allocate one extra guard byte for use in combine()
+  data = (Guchar *)grealloc(data, newH * line + 1);
+  if (pixel) {
+    memset(data + h * line, 0xff, (newH - h) * line);
+  } else {
+    memset(data + h * line, 0x00, (newH - h) * line);
+  }
+  h = newH;
+  data[h * line] = 0;
+}
+
+void JBIG2Bitmap::clearToZero() {
+  memset(data, 0, h * line);
+}
+
+void JBIG2Bitmap::clearToOne() {
+  memset(data, 0xff, h * line);
+}
+
+inline void JBIG2Bitmap::getPixelPtr(int x, int y, JBIG2BitmapPtr *ptr) {
+  if (y < 0 || y >= h || x >= w) {
+    ptr->p = NULL;
+    ptr->shift = 0; // make gcc happy
+    ptr->x = 0; // make gcc happy
+  } else if (x < 0) {
+    ptr->p = &data[y * line];
+    ptr->shift = 7;
+    ptr->x = x;
+  } else {
+    ptr->p = &data[y * line + (x >> 3)];
+    ptr->shift = 7 - (x & 7);
+    ptr->x = x;
+  }
+}
+
+inline int JBIG2Bitmap::nextPixel(JBIG2BitmapPtr *ptr) {
+  int pix;
+
+  if (!ptr->p) {
+    pix = 0;
+  } else if (ptr->x < 0) {
+    ++ptr->x;
+    pix = 0;
+  } else {
+    pix = (*ptr->p >> ptr->shift) & 1;
+    if (++ptr->x == w) {
+      ptr->p = NULL;
+    } else if (ptr->shift == 0) {
+      ++ptr->p;
+      ptr->shift = 7;
+    } else {
+      --ptr->shift;
+    }
+  }
+  return pix;
+}
+
+void JBIG2Bitmap::duplicateRow(int yDest, int ySrc) {
+  memcpy(data + yDest * line, data + ySrc * line, line);
+}
+
+void JBIG2Bitmap::combine(JBIG2Bitmap *bitmap, int x, int y,
+                         Guint combOp) {
+  int x0, x1, y0, y1, xx, yy;
+  Guchar *srcPtr, *destPtr;
+  Guint src0, src1, src, dest, s1, s2, m1, m2, m3;
+  GBool oneByte;
+
+  // check for the pathological case where y = -2^31
+  if (y < -0x7fffffff) {
+    return;
+  }
+  if (y < 0) {
+    y0 = -y;
+  } else {
+    y0 = 0;
+  }
+  if (y + bitmap->h > h) {
+    y1 = h - y;
+  } else {
+    y1 = bitmap->h;
+  }
+  if (y0 >= y1) {
+    return;
+  }
+
+  if (x >= 0) {
+    x0 = x & ~7;
+  } else {
+    x0 = 0;
+  }
+  x1 = x + bitmap->w;
+  if (x1 > w) {
+    x1 = w;
+  }
+  if (x0 >= x1) {
+    return;
+  }
+
+  s1 = x & 7;
+  s2 = 8 - s1;
+  m1 = 0xff >> (x1 & 7);
+  m2 = 0xff << (((x1 & 7) == 0) ? 0 : 8 - (x1 & 7));
+  m3 = (0xff >> s1) & m2;
+
+  oneByte = x0 == ((x1 - 1) & ~7);
+
+  for (yy = y0; yy < y1; ++yy) {
+
+    // one byte per line -- need to mask both left and right side
+    if (oneByte) {
+      if (x >= 0) {
+       destPtr = data + (y + yy) * line + (x >> 3);
+       srcPtr = bitmap->data + yy * bitmap->line;
+       dest = *destPtr;
+       src1 = *srcPtr;
+       switch (combOp) {
+       case 0: // or
+         dest |= (src1 >> s1) & m2;
+         break;
+       case 1: // and
+         dest &= ((0xff00 | src1) >> s1) | m1;
+         break;
+       case 2: // xor
+         dest ^= (src1 >> s1) & m2;
+         break;
+       case 3: // xnor
+         dest ^= ((src1 ^ 0xff) >> s1) & m2;
+         break;
+       case 4: // replace
+         dest = (dest & ~m3) | ((src1 >> s1) & m3);
+         break;
+       }
+       *destPtr = dest;
+      } else {
+       destPtr = data + (y + yy) * line;
+       srcPtr = bitmap->data + yy * bitmap->line + (-x >> 3);
+       dest = *destPtr;
+       src1 = *srcPtr;
+       switch (combOp) {
+       case 0: // or
+         dest |= src1 & m2;
+         break;
+       case 1: // and
+         dest &= src1 | m1;
+         break;
+       case 2: // xor
+         dest ^= src1 & m2;
+         break;
+       case 3: // xnor
+         dest ^= (src1 ^ 0xff) & m2;
+         break;
+       case 4: // replace
+         dest = (src1 & m2) | (dest & m1);
+         break;
+       }
+       *destPtr = dest;
+      }
+
+    // multiple bytes per line -- need to mask left side of left-most
+    // byte and right side of right-most byte
+    } else {
+
+      // left-most byte
+      if (x >= 0) {
+       destPtr = data + (y + yy) * line + (x >> 3);
+       srcPtr = bitmap->data + yy * bitmap->line;
+       src1 = *srcPtr++;
+       dest = *destPtr;
+       switch (combOp) {
+       case 0: // or
+         dest |= src1 >> s1;
+         break;
+       case 1: // and
+         dest &= (0xff00 | src1) >> s1;
+         break;
+       case 2: // xor
+         dest ^= src1 >> s1;
+         break;
+       case 3: // xnor
+         dest ^= (src1 ^ 0xff) >> s1;
+         break;
+       case 4: // replace
+         dest = (dest & (0xff << s2)) | (src1 >> s1);
+         break;
+       }
+       *destPtr++ = dest;
+       xx = x0 + 8;
+      } else {
+       destPtr = data + (y + yy) * line;
+       srcPtr = bitmap->data + yy * bitmap->line + (-x >> 3);
+       src1 = *srcPtr++;
+       xx = x0;
+      }
+
+      // middle bytes
+      for (; xx < x1 - 8; xx += 8) {
+       dest = *destPtr;
+       src0 = src1;
+       src1 = *srcPtr++;
+       src = (((src0 << 8) | src1) >> s1) & 0xff;
+       switch (combOp) {
+       case 0: // or
+         dest |= src;
+         break;
+       case 1: // and
+         dest &= src;
+         break;
+       case 2: // xor
+         dest ^= src;
+         break;
+       case 3: // xnor
+         dest ^= src ^ 0xff;
+         break;
+       case 4: // replace
+         dest = src;
+         break;
+       }
+       *destPtr++ = dest;
+      }
+
+      // right-most byte
+      // note: this last byte (src1) may not actually be used, depending
+      // on the values of s1, m1, and m2 - and in fact, it may be off
+      // the edge of the source bitmap, which means we need to allocate
+      // one extra guard byte at the end of each bitmap
+      dest = *destPtr;
+      src0 = src1;
+      src1 = *srcPtr++;
+      src = (((src0 << 8) | src1) >> s1) & 0xff;
+      switch (combOp) {
+      case 0: // or
+       dest |= src & m2;
+       break;
+      case 1: // and
+       dest &= src | m1;
+       break;
+      case 2: // xor
+       dest ^= src & m2;
+       break;
+      case 3: // xnor
+       dest ^= (src ^ 0xff) & m2;
+       break;
+      case 4: // replace
+       dest = (src & m2) | (dest & m1);
+       break;
+      }
+      *destPtr = dest;
+    }
+  }
+}
+
+//------------------------------------------------------------------------
+// JBIG2SymbolDict
+//------------------------------------------------------------------------
+
+class JBIG2SymbolDict: public JBIG2Segment {
+public:
+
+  JBIG2SymbolDict(Guint segNumA, Guint sizeA);
+  virtual ~JBIG2SymbolDict();
+  virtual JBIG2SegmentType getType() { return jbig2SegSymbolDict; }
+  Guint getSize() { return size; }
+  void setBitmap(Guint idx, JBIG2Bitmap *bitmap) { bitmaps[idx] = bitmap; }
+  JBIG2Bitmap *getBitmap(Guint idx) { return bitmaps[idx]; }
+  GBool isOk() { return bitmaps != NULL; }
+  void setGenericRegionStats(JArithmeticDecoderStats *stats)
+    { genericRegionStats = stats; }
+  void setRefinementRegionStats(JArithmeticDecoderStats *stats)
+    { refinementRegionStats = stats; }
+  JArithmeticDecoderStats *getGenericRegionStats()
+    { return genericRegionStats; }
+  JArithmeticDecoderStats *getRefinementRegionStats()
+    { return refinementRegionStats; }
+
+private:
+
+  Guint size;
+  JBIG2Bitmap **bitmaps;
+  JArithmeticDecoderStats *genericRegionStats;
+  JArithmeticDecoderStats *refinementRegionStats;
+};
+
+JBIG2SymbolDict::JBIG2SymbolDict(Guint segNumA, Guint sizeA):
+  JBIG2Segment(segNumA)
+{
+  Guint i;
+
+  size = sizeA;
+  bitmaps = (JBIG2Bitmap **)gmallocn_checkoverflow(size, sizeof(JBIG2Bitmap *));
+  if (!bitmaps) size = 0;
+  for (i = 0; i < size; ++i) {
+    bitmaps[i] = NULL;
+  }
+  genericRegionStats = NULL;
+  refinementRegionStats = NULL;
+}
+
+JBIG2SymbolDict::~JBIG2SymbolDict() {
+  Guint i;
+
+  for (i = 0; i < size; ++i) {
+    delete bitmaps[i];
+  }
+  gfree(bitmaps);
+  if (genericRegionStats) {
+    delete genericRegionStats;
+  }
+  if (refinementRegionStats) {
+    delete refinementRegionStats;
+  }
+}
+
+//------------------------------------------------------------------------
+// JBIG2PatternDict
+//------------------------------------------------------------------------
+
+class JBIG2PatternDict: public JBIG2Segment {
+public:
+
+  JBIG2PatternDict(Guint segNumA, Guint sizeA);
+  virtual ~JBIG2PatternDict();
+  virtual JBIG2SegmentType getType() { return jbig2SegPatternDict; }
+  Guint getSize() { return size; }
+  void setBitmap(Guint idx, JBIG2Bitmap *bitmap) { bitmaps[idx] = bitmap; }
+  JBIG2Bitmap *getBitmap(Guint idx) { return bitmaps[idx]; }
+
+private:
+
+  Guint size;
+  JBIG2Bitmap **bitmaps;
+};
+
+JBIG2PatternDict::JBIG2PatternDict(Guint segNumA, Guint sizeA):
+  JBIG2Segment(segNumA)
+{
+  size = sizeA;
+  bitmaps = (JBIG2Bitmap **)gmallocn(size, sizeof(JBIG2Bitmap *));
+}
+
+JBIG2PatternDict::~JBIG2PatternDict() {
+  Guint i;
+
+  for (i = 0; i < size; ++i) {
+    delete bitmaps[i];
+  }
+  gfree(bitmaps);
+}
+
+//------------------------------------------------------------------------
+// JBIG2CodeTable
+//------------------------------------------------------------------------
+
+class JBIG2CodeTable: public JBIG2Segment {
+public:
+
+  JBIG2CodeTable(Guint segNumA, JBIG2HuffmanTable *tableA);
+  virtual ~JBIG2CodeTable();
+  virtual JBIG2SegmentType getType() { return jbig2SegCodeTable; }
+  JBIG2HuffmanTable *getHuffTable() { return table; }
+
+private:
+
+  JBIG2HuffmanTable *table;
+};
+
+JBIG2CodeTable::JBIG2CodeTable(Guint segNumA, JBIG2HuffmanTable *tableA):
+  JBIG2Segment(segNumA)
+{
+  table = tableA;
+}
+
+JBIG2CodeTable::~JBIG2CodeTable() {
+  gfree(table);
+}
+
+//------------------------------------------------------------------------
+// JBIG2Stream
+//------------------------------------------------------------------------
+
+JBIG2Stream::JBIG2Stream(Stream *strA, Object *globalsStreamA):
+  FilterStream(strA)
+{
+  pageBitmap = NULL;
+
+  arithDecoder = new JArithmeticDecoder();
+  genericRegionStats = new JArithmeticDecoderStats(1 << 1);
+  refinementRegionStats = new JArithmeticDecoderStats(1 << 1);
+  iadhStats = new JArithmeticDecoderStats(1 << 9);
+  iadwStats = new JArithmeticDecoderStats(1 << 9);
+  iaexStats = new JArithmeticDecoderStats(1 << 9);
+  iaaiStats = new JArithmeticDecoderStats(1 << 9);
+  iadtStats = new JArithmeticDecoderStats(1 << 9);
+  iaitStats = new JArithmeticDecoderStats(1 << 9);
+  iafsStats = new JArithmeticDecoderStats(1 << 9);
+  iadsStats = new JArithmeticDecoderStats(1 << 9);
+  iardxStats = new JArithmeticDecoderStats(1 << 9);
+  iardyStats = new JArithmeticDecoderStats(1 << 9);
+  iardwStats = new JArithmeticDecoderStats(1 << 9);
+  iardhStats = new JArithmeticDecoderStats(1 << 9);
+  iariStats = new JArithmeticDecoderStats(1 << 9);
+  iaidStats = new JArithmeticDecoderStats(1 << 1);
+  huffDecoder = new JBIG2HuffmanDecoder();
+  mmrDecoder = new JBIG2MMRDecoder();
+
+  globalsStreamA->copy(&globalsStream);
+  segments = globalSegments = NULL;
+  curStr = NULL;
+  dataPtr = dataEnd = NULL;
+}
+
+JBIG2Stream::~JBIG2Stream() {
+  close();
+  globalsStream.free();
+  delete arithDecoder;
+  delete genericRegionStats;
+  delete refinementRegionStats;
+  delete iadhStats;
+  delete iadwStats;
+  delete iaexStats;
+  delete iaaiStats;
+  delete iadtStats;
+  delete iaitStats;
+  delete iafsStats;
+  delete iadsStats;
+  delete iardxStats;
+  delete iardyStats;
+  delete iardwStats;
+  delete iardhStats;
+  delete iariStats;
+  delete iaidStats;
+  delete huffDecoder;
+  delete mmrDecoder;
+  delete str;
+}
+
+void JBIG2Stream::reset() {
+  // read the globals stream
+  globalSegments = new GooList();
+  if (globalsStream.isStream()) {
+    segments = globalSegments;
+    curStr = globalsStream.getStream();
+    curStr->reset();
+    arithDecoder->setStream(curStr);
+    huffDecoder->setStream(curStr);
+    mmrDecoder->setStream(curStr);
+    readSegments();
+    curStr->close();
+  }
+
+  // read the main stream
+  segments = new GooList();
+  curStr = str;
+  curStr->reset();
+  arithDecoder->setStream(curStr);
+  huffDecoder->setStream(curStr);
+  mmrDecoder->setStream(curStr);
+  readSegments();
+
+  if (pageBitmap) {
+    dataPtr = pageBitmap->getDataPtr();
+    dataEnd = dataPtr + pageBitmap->getDataSize();
+  } else {
+    dataPtr = dataEnd = NULL;
+  }
+}
+
+void JBIG2Stream::close() {
+  if (pageBitmap) {
+    delete pageBitmap;
+    pageBitmap = NULL;
+  }
+  if (segments) {
+    deleteGooList(segments, JBIG2Segment);
+    segments = NULL;
+  }
+  if (globalSegments) {
+    deleteGooList(globalSegments, JBIG2Segment);
+    globalSegments = NULL;
+  }
+  dataPtr = dataEnd = NULL;
+  FilterStream::close();
+}
+
+int JBIG2Stream::getChar() {
+  if (dataPtr && dataPtr < dataEnd) {
+    return (*dataPtr++ ^ 0xff) & 0xff;
+  }
+  return EOF;
+}
+
+int JBIG2Stream::lookChar() {
+  if (dataPtr && dataPtr < dataEnd) {
+    return (*dataPtr ^ 0xff) & 0xff;
+  }
+  return EOF;
+}
+
+int JBIG2Stream::getPos() {
+  if (pageBitmap == NULL) {
+    return 0;
+  }
+  return dataPtr - pageBitmap->getDataPtr();
+}
+
+int JBIG2Stream::getChars(int nChars, Guchar *buffer) {
+  int n, i;
+
+  if (nChars <= 0) {
+    return 0;
+  }
+  if (dataEnd - dataPtr < nChars) {
+    n = (int)(dataEnd - dataPtr);
+  } else {
+    n = nChars;
+  }
+  for (i = 0; i < n; ++i) {
+    buffer[i] = *dataPtr++ ^ 0xff;
+  }
+  return n;
+}
+
+GooString *JBIG2Stream::getPSFilter(int psLevel, const char *indent) {
+  return NULL;
+}
+
+GBool JBIG2Stream::isBinary(GBool last) {
+  return str->isBinary(gTrue);
+}
+
+void JBIG2Stream::readSegments() {
+  Guint segNum, segFlags, segType, page, segLength;
+  Guint refFlags, nRefSegs;
+  Guint *refSegs;
+  int segDataPos;
+  int c1, c2, c3;
+  Guint i;
+
+  while (readULong(&segNum)) {
+
+    // segment header flags
+    if (!readUByte(&segFlags)) {
+      goto eofError1;
+    }
+    segType = segFlags & 0x3f;
+
+    // referred-to segment count and retention flags
+    if (!readUByte(&refFlags)) {
+      goto eofError1;
+    }
+    nRefSegs = refFlags >> 5;
+    if (nRefSegs == 7) {
+      if ((c1 = curStr->getChar()) == EOF ||
+         (c2 = curStr->getChar()) == EOF ||
+         (c3 = curStr->getChar()) == EOF) {
+       goto eofError1;
+      }
+      refFlags = (refFlags << 24) | (c1 << 16) | (c2 << 8) | c3;
+      nRefSegs = refFlags & 0x1fffffff;
+      for (i = 0; i < (nRefSegs + 9) >> 3; ++i) {
+       if ((c1 = curStr->getChar()) == EOF) {
+         goto eofError1;
+       }
+      }
+    }
+
+    // referred-to segment numbers
+    refSegs = (Guint *)gmallocn(nRefSegs, sizeof(Guint));
+    if (segNum <= 256) {
+      for (i = 0; i < nRefSegs; ++i) {
+       if (!readUByte(&refSegs[i])) {
+         goto eofError2;
+       }
+      }
+    } else if (segNum <= 65536) {
+      for (i = 0; i < nRefSegs; ++i) {
+       if (!readUWord(&refSegs[i])) {
+         goto eofError2;
+       }
+      }
+    } else {
+      for (i = 0; i < nRefSegs; ++i) {
+       if (!readULong(&refSegs[i])) {
+         goto eofError2;
+       }
+      }
+    }
+
+    // segment page association
+    if (segFlags & 0x40) {
+      if (!readULong(&page)) {
+       goto eofError2;
+      }
+    } else {
+      if (!readUByte(&page)) {
+       goto eofError2;
+      }
+    }
+
+    // segment data length
+    if (!readULong(&segLength)) {
+      goto eofError2;
+    }
+
+    // keep track of the start of the segment data 
+    segDataPos = curStr->getPos();
+
+    // check for missing page information segment
+    if (!pageBitmap && ((segType >= 4 && segType <= 7) ||
+                       (segType >= 20 && segType <= 43))) {
+      error(errSyntaxError, curStr->getPos(), "First JBIG2 segment associated with a page must be a page information segment");
+      goto syntaxError;
+    }
+
+    // read the segment data
+    switch (segType) {
+    case 0:
+      if (!readSymbolDictSeg(segNum, segLength, refSegs, nRefSegs)) {
+       goto syntaxError;
+      }
+      break;
+    case 4:
+      readTextRegionSeg(segNum, gFalse, gFalse, segLength, refSegs, nRefSegs);
+      break;
+    case 6:
+      readTextRegionSeg(segNum, gTrue, gFalse, segLength, refSegs, nRefSegs);
+      break;
+    case 7:
+      readTextRegionSeg(segNum, gTrue, gTrue, segLength, refSegs, nRefSegs);
+      break;
+    case 16:
+      readPatternDictSeg(segNum, segLength);
+      break;
+    case 20:
+      readHalftoneRegionSeg(segNum, gFalse, gFalse, segLength,
+                           refSegs, nRefSegs);
+      break;
+    case 22:
+      readHalftoneRegionSeg(segNum, gTrue, gFalse, segLength,
+                           refSegs, nRefSegs);
+      break;
+    case 23:
+      readHalftoneRegionSeg(segNum, gTrue, gTrue, segLength,
+                           refSegs, nRefSegs);
+      break;
+    case 36:
+      readGenericRegionSeg(segNum, gFalse, gFalse, segLength);
+      break;
+    case 38:
+      readGenericRegionSeg(segNum, gTrue, gFalse, segLength);
+      break;
+    case 39:
+      readGenericRegionSeg(segNum, gTrue, gTrue, segLength);
+      break;
+    case 40:
+      readGenericRefinementRegionSeg(segNum, gFalse, gFalse, segLength,
+                                    refSegs, nRefSegs);
+      break;
+    case 42:
+      readGenericRefinementRegionSeg(segNum, gTrue, gFalse, segLength,
+                                    refSegs, nRefSegs);
+      break;
+    case 43:
+      readGenericRefinementRegionSeg(segNum, gTrue, gTrue, segLength,
+                                    refSegs, nRefSegs);
+      break;
+    case 48:
+      readPageInfoSeg(segLength);
+      break;
+    case 50:
+      readEndOfStripeSeg(segLength);
+      break;
+    case 52:
+      readProfilesSeg(segLength);
+      break;
+    case 53:
+      readCodeTableSeg(segNum, segLength);
+      break;
+    case 62:
+      readExtensionSeg(segLength);
+      break;
+    default:
+      error(errSyntaxError, curStr->getPos(), "Unknown segment type in JBIG2 stream");
+      for (i = 0; i < segLength; ++i) {
+       if ((c1 = curStr->getChar()) == EOF) {
+         goto eofError2;
+       }
+      }
+      break;
+    }
+
+    // Make sure the segment handler read all of the bytes in the 
+    // segment data, unless this segment is marked as having an
+    // unknown length (section 7.2.7 of the JBIG2 Final Committee Draft)
+
+    if (segLength != 0xffffffff) {
+
+      int segExtraBytes = segDataPos + segLength - curStr->getPos();
+      if (segExtraBytes > 0) {
+
+       // If we didn't read all of the bytes in the segment data,
+       // indicate an error, and throw away the rest of the data.
+       
+       // v.3.1.01.13 of the LuraTech PDF Compressor Server will
+       // sometimes generate an extraneous NULL byte at the end of
+       // arithmetic-coded symbol dictionary segments when numNewSyms
+       // == 0.  Segments like this often occur for blank pages.
+       
+       error(errSyntaxError, curStr->getPos(), "{0:d} extraneous byte{1:s} after segment",
+             segExtraBytes, (segExtraBytes > 1) ? "s" : "");
+       
+       // Burn through the remaining bytes -- inefficient, but
+       // hopefully we're not doing this much
+       
+       int trash;
+       for (int i = segExtraBytes; i > 0; i--) {
+         readByte(&trash);
+       }
+       
+      } else if (segExtraBytes < 0) {
+       
+       // If we read more bytes than we should have, according to the 
+       // segment length field, note an error.
+       
+       error(errSyntaxError, curStr->getPos(), "Previous segment handler read too many bytes");
+       
+      }
+
+    }
+    
+    gfree(refSegs);
+  }
+
+  return;
+
+ syntaxError:
+  gfree(refSegs);
+  return;
+
+ eofError2:
+  gfree(refSegs);
+ eofError1:
+  error(errSyntaxError, curStr->getPos(), "Unexpected EOF in JBIG2 stream");
+}
+
+GBool JBIG2Stream::readSymbolDictSeg(Guint segNum, Guint length,
+                                    Guint *refSegs, Guint nRefSegs) {
+  JBIG2SymbolDict *symbolDict;
+  JBIG2HuffmanTable *huffDHTable, *huffDWTable;
+  JBIG2HuffmanTable *huffBMSizeTable, *huffAggInstTable;
+  JBIG2Segment *seg;
+  GooList *codeTables;
+  JBIG2SymbolDict *inputSymbolDict;
+  Guint flags, sdTemplate, sdrTemplate, huff, refAgg;
+  Guint huffDH, huffDW, huffBMSize, huffAggInst;
+  Guint contextUsed, contextRetained;
+  int sdATX[4], sdATY[4], sdrATX[2], sdrATY[2];
+  Guint numExSyms, numNewSyms, numInputSyms, symCodeLen;
+  JBIG2Bitmap **bitmaps;
+  JBIG2Bitmap *collBitmap, *refBitmap;
+  Guint *symWidths;
+  Guint symHeight, symWidth, totalWidth, x, symID;
+  int dh, dw, refAggNum, refDX, refDY, bmSize;
+  GBool ex;
+  int run, cnt, c;
+  Guint i, j, k;
+  Guchar *p;
+
+  symWidths = NULL;
+
+  // symbol dictionary flags
+  if (!readUWord(&flags)) {
+    goto eofError;
+  }
+  sdTemplate = (flags >> 10) & 3;
+  sdrTemplate = (flags >> 12) & 1;
+  huff = flags & 1;
+  refAgg = (flags >> 1) & 1;
+  huffDH = (flags >> 2) & 3;
+  huffDW = (flags >> 4) & 3;
+  huffBMSize = (flags >> 6) & 1;
+  huffAggInst = (flags >> 7) & 1;
+  contextUsed = (flags >> 8) & 1;
+  contextRetained = (flags >> 9) & 1;
+
+  // symbol dictionary AT flags
+  if (!huff) {
+    if (sdTemplate == 0) {
+      if (!readByte(&sdATX[0]) ||
+         !readByte(&sdATY[0]) ||
+         !readByte(&sdATX[1]) ||
+         !readByte(&sdATY[1]) ||
+         !readByte(&sdATX[2]) ||
+         !readByte(&sdATY[2]) ||
+         !readByte(&sdATX[3]) ||
+         !readByte(&sdATY[3])) {
+       goto eofError;
+      }
+    } else {
+      if (!readByte(&sdATX[0]) ||
+         !readByte(&sdATY[0])) {
+       goto eofError;
+      }
+    }
+  }
+
+  // symbol dictionary refinement AT flags
+  if (refAgg && !sdrTemplate) {
+    if (!readByte(&sdrATX[0]) ||
+       !readByte(&sdrATY[0]) ||
+       !readByte(&sdrATX[1]) ||
+       !readByte(&sdrATY[1])) {
+      goto eofError;
+    }
+  }
+
+  // SDNUMEXSYMS and SDNUMNEWSYMS
+  if (!readULong(&numExSyms) || !readULong(&numNewSyms)) {
+    goto eofError;
+  }
+
+  // get referenced segments: input symbol dictionaries and code tables
+  codeTables = new GooList();
+  numInputSyms = 0;
+  for (i = 0; i < nRefSegs; ++i) {
+    // This is need by bug 12014, returning gFalse makes it not crash
+    // but we end up with a empty page while acroread is able to render
+    // part of it
+    if ((seg = findSegment(refSegs[i]))) {
+      if (seg->getType() == jbig2SegSymbolDict) {
+       j = ((JBIG2SymbolDict *)seg)->getSize();
+       if (numInputSyms > UINT_MAX - j) {
+         error(errSyntaxError, curStr->getPos(), "Too many input symbols in JBIG2 symbol dictionary");
+         delete codeTables;
+         goto eofError;
+       }
+       numInputSyms += j;
+      } else if (seg->getType() == jbig2SegCodeTable) {
+        codeTables->append(seg);
+      }
+    } else {
+      delete codeTables;
+      return gFalse;
+    }
+  }
+  if (numInputSyms > UINT_MAX - numNewSyms) {
+    error(errSyntaxError, curStr->getPos(), "Too many input symbols in JBIG2 symbol dictionary");
+    delete codeTables;
+    goto eofError;
+  }
+
+  // compute symbol code length, per 6.5.8.2.3
+  //  symCodeLen = ceil( log2( numInputSyms + numNewSyms ) )
+  i = numInputSyms + numNewSyms;
+  if (i <= 1) {
+    symCodeLen = huff ? 1 : 0;
+  } else {
+    --i;
+    symCodeLen = 0;
+    // i = floor((numSyms-1) / 2^symCodeLen)
+    while (i > 0) {
+      ++symCodeLen;
+      i >>= 1;
+    }
+  }
+
+  // get the input symbol bitmaps
+  bitmaps = (JBIG2Bitmap **)gmallocn_checkoverflow(numInputSyms + numNewSyms,
+                                    sizeof(JBIG2Bitmap *));
+  if (!bitmaps && (numInputSyms + numNewSyms > 0)) {
+    error(errSyntaxError, curStr->getPos(), "Too many input symbols in JBIG2 symbol dictionary");
+    delete codeTables;
+    goto eofError;
+  }
+  for (i = 0; i < numInputSyms + numNewSyms; ++i) {
+    bitmaps[i] = NULL;
+  }
+  k = 0;
+  inputSymbolDict = NULL;
+  for (i = 0; i < nRefSegs; ++i) {
+    seg = findSegment(refSegs[i]);
+    if (seg != NULL && seg->getType() == jbig2SegSymbolDict) {
+      inputSymbolDict = (JBIG2SymbolDict *)seg;
+      for (j = 0; j < inputSymbolDict->getSize(); ++j) {
+       bitmaps[k++] = inputSymbolDict->getBitmap(j);
+      }
+    }
+  }
+
+  // get the Huffman tables
+  huffDHTable = huffDWTable = NULL; // make gcc happy
+  huffBMSizeTable = huffAggInstTable = NULL; // make gcc happy
+  i = 0;
+  if (huff) {
+    if (huffDH == 0) {
+      huffDHTable = huffTableD;
+    } else if (huffDH == 1) {
+      huffDHTable = huffTableE;
+    } else {
+      if (i >= (Guint)codeTables->getLength()) {
+       goto codeTableError;
+      }
+      huffDHTable = ((JBIG2CodeTable *)codeTables->get(i++))->getHuffTable();
+    }
+    if (huffDW == 0) {
+      huffDWTable = huffTableB;
+    } else if (huffDW == 1) {
+      huffDWTable = huffTableC;
+    } else {
+      if (i >= (Guint)codeTables->getLength()) {
+       goto codeTableError;
+      }
+      huffDWTable = ((JBIG2CodeTable *)codeTables->get(i++))->getHuffTable();
+    }
+    if (huffBMSize == 0) {
+      huffBMSizeTable = huffTableA;
+    } else {
+      if (i >= (Guint)codeTables->getLength()) {
+       goto codeTableError;
+      }
+      huffBMSizeTable =
+         ((JBIG2CodeTable *)codeTables->get(i++))->getHuffTable();
+    }
+    if (huffAggInst == 0) {
+      huffAggInstTable = huffTableA;
+    } else {
+      if (i >= (Guint)codeTables->getLength()) {
+       goto codeTableError;
+      }
+      huffAggInstTable =
+         ((JBIG2CodeTable *)codeTables->get(i++))->getHuffTable();
+    }
+  }
+  delete codeTables;
+
+  // set up the Huffman decoder
+  if (huff) {
+    huffDecoder->reset();
+
+  // set up the arithmetic decoder
+  } else {
+    if (contextUsed && inputSymbolDict) {
+      resetGenericStats(sdTemplate, inputSymbolDict->getGenericRegionStats());
+    } else {
+      resetGenericStats(sdTemplate, NULL);
+    }
+    resetIntStats(symCodeLen);
+    arithDecoder->start();
+  }
+
+  // set up the arithmetic decoder for refinement/aggregation
+  if (refAgg) {
+    if (contextUsed && inputSymbolDict) {
+      resetRefinementStats(sdrTemplate,
+                          inputSymbolDict->getRefinementRegionStats());
+    } else {
+      resetRefinementStats(sdrTemplate, NULL);
+    }
+  }
+
+  // allocate symbol widths storage
+  if (huff && !refAgg) {
+    symWidths = (Guint *)gmallocn(numNewSyms, sizeof(Guint));
+  }
+
+  symHeight = 0;
+  i = 0;
+  while (i < numNewSyms) {
+
+    // read the height class delta height
+    if (huff) {
+      huffDecoder->decodeInt(&dh, huffDHTable);
+    } else {
+      arithDecoder->decodeInt(&dh, iadhStats);
+    }
+    if (dh < 0 && (Guint)-dh >= symHeight) {
+      error(errSyntaxError, curStr->getPos(), "Bad delta-height value in JBIG2 symbol dictionary");
+      goto syntaxError;
+    }
+    symHeight += dh;
+    symWidth = 0;
+    totalWidth = 0;
+    j = i;
+
+    // read the symbols in this height class
+    while (1) {
+
+      // read the delta width
+      if (huff) {
+       if (!huffDecoder->decodeInt(&dw, huffDWTable)) {
+         break;
+       }
+      } else {
+       if (!arithDecoder->decodeInt(&dw, iadwStats)) {
+         break;
+       }
+      }
+      if (dw < 0 && (Guint)-dw >= symWidth) {
+       error(errSyntaxError, curStr->getPos(), "Bad delta-height value in JBIG2 symbol dictionary");
+       goto syntaxError;
+      }
+      symWidth += dw;
+      if (i >= numNewSyms) {
+       error(errSyntaxError, curStr->getPos(), "Too many symbols in JBIG2 symbol dictionary");
+       goto syntaxError;
+      }
+
+      // using a collective bitmap, so don't read a bitmap here
+      if (huff && !refAgg) {
+       symWidths[i] = symWidth;
+       totalWidth += symWidth;
+
+      // refinement/aggregate coding
+      } else if (refAgg) {
+       if (huff) {
+         if (!huffDecoder->decodeInt(&refAggNum, huffAggInstTable)) {
+           break;
+         }
+       } else {
+         if (!arithDecoder->decodeInt(&refAggNum, iaaiStats)) {
+           break;
+         }
+       }
+#if 0 //~ This special case was added about a year before the final draft
+      //~ of the JBIG2 spec was released.  I have encountered some old
+      //~ JBIG2 images that predate it.
+       if (0) {
+#else
+       if (refAggNum == 1) {
+#endif
+         if (huff) {
+           symID = huffDecoder->readBits(symCodeLen);
+           huffDecoder->decodeInt(&refDX, huffTableO);
+           huffDecoder->decodeInt(&refDY, huffTableO);
+           huffDecoder->decodeInt(&bmSize, huffTableA);
+           huffDecoder->reset();
+           arithDecoder->start();
+         } else {
+           symID = arithDecoder->decodeIAID(symCodeLen, iaidStats);
+           arithDecoder->decodeInt(&refDX, iardxStats);
+           arithDecoder->decodeInt(&refDY, iardyStats);
+         }
+         if (symID >= numInputSyms + i) {
+           error(errSyntaxError, curStr->getPos(), "Invalid symbol ID in JBIG2 symbol dictionary");
+           goto syntaxError;
+         }
+         refBitmap = bitmaps[symID];
+         bitmaps[numInputSyms + i] =
+             readGenericRefinementRegion(symWidth, symHeight,
+                                         sdrTemplate, gFalse,
+                                         refBitmap, refDX, refDY,
+                                         sdrATX, sdrATY);
+         //~ do we need to use the bmSize value here (in Huffman mode)?
+       } else {
+         bitmaps[numInputSyms + i] =
+             readTextRegion(huff, gTrue, symWidth, symHeight,
+                            refAggNum, 0, numInputSyms + i, NULL,
+                            symCodeLen, bitmaps, 0, 0, 0, 1, 0,
+                            huffTableF, huffTableH, huffTableK, huffTableO,
+                            huffTableO, huffTableO, huffTableO, huffTableA,
+                            sdrTemplate, sdrATX, sdrATY);
+       }
+
+      // non-ref/agg coding
+      } else {
+       bitmaps[numInputSyms + i] =
+           readGenericBitmap(gFalse, symWidth, symHeight,
+                             sdTemplate, gFalse, gFalse, NULL,
+                             sdATX, sdATY, 0);
+      }
+
+      ++i;
+    }
+
+    // read the collective bitmap
+    if (huff && !refAgg) {
+      huffDecoder->decodeInt(&bmSize, huffBMSizeTable);
+      huffDecoder->reset();
+      if (bmSize == 0) {
+       collBitmap = new JBIG2Bitmap(0, totalWidth, symHeight);
+       bmSize = symHeight * ((totalWidth + 7) >> 3);
+       p = collBitmap->getDataPtr();
+       for (k = 0; k < (Guint)bmSize; ++k) {
+         if ((c = curStr->getChar()) == EOF) {
+           break;
+         }
+         *p++ = (Guchar)c;
+       }
+      } else {
+       collBitmap = readGenericBitmap(gTrue, totalWidth, symHeight,
+                                      0, gFalse, gFalse, NULL, NULL, NULL,
+                                      bmSize);
+      }
+      if (likely(collBitmap != NULL)) {
+       x = 0;
+       for (; j < i; ++j) {
+         bitmaps[numInputSyms + j] =
+             collBitmap->getSlice(x, 0, symWidths[j], symHeight);
+         x += symWidths[j];
+       }
+       delete collBitmap;
+      } else {
+       error(errSyntaxError, curStr->getPos(), "collBitmap was null");
+       goto syntaxError;
+      }
+    }
+  }
+
+  // create the symbol dict object
+  symbolDict = new JBIG2SymbolDict(segNum, numExSyms);
+  if (!symbolDict->isOk()) {
+    delete symbolDict;
+    goto syntaxError;
+  }
+
+  // exported symbol list
+  i = j = 0;
+  ex = gFalse;
+  while (i < numInputSyms + numNewSyms) {
+    if (huff) {
+      huffDecoder->decodeInt(&run, huffTableA);
+    } else {
+      arithDecoder->decodeInt(&run, iaexStats);
+    }
+    if (i + run > numInputSyms + numNewSyms ||
+       (ex && j + run > numExSyms)) {
+      error(errSyntaxError, curStr->getPos(), "Too many exported symbols in JBIG2 symbol dictionary");
+      for ( ; j < numExSyms; ++j) symbolDict->setBitmap(j, NULL);
+      delete symbolDict;
+      goto syntaxError;
+    }
+    if (ex) {
+      for (cnt = 0; cnt < run; ++cnt) {
+       symbolDict->setBitmap(j++, bitmaps[i++]->copy());
+      }
+    } else {
+      i += run;
+    }
+    ex = !ex;
+  }
+  if (j != numExSyms) {
+    error(errSyntaxError, curStr->getPos(), "Too few symbols in JBIG2 symbol dictionary");
+    for ( ; j < numExSyms; ++j) symbolDict->setBitmap(j, NULL);
+    delete symbolDict;
+    goto syntaxError;
+  }
+
+  for (i = 0; i < numNewSyms; ++i) {
+    delete bitmaps[numInputSyms + i];
+  }
+  gfree(bitmaps);
+  if (symWidths) {
+    gfree(symWidths);
+  }
+
+  // save the arithmetic decoder stats
+  if (!huff && contextRetained) {
+    symbolDict->setGenericRegionStats(genericRegionStats->copy());
+    if (refAgg) {
+      symbolDict->setRefinementRegionStats(refinementRegionStats->copy());
+    }
+  }
+
+  // store the new symbol dict
+  segments->append(symbolDict);
+
+  return gTrue;
+
+ codeTableError:
+  error(errSyntaxError, curStr->getPos(), "Missing code table in JBIG2 symbol dictionary");
+  delete codeTables;
+
+ syntaxError:
+  for (i = 0; i < numNewSyms; ++i) {
+    if (bitmaps[numInputSyms + i]) {
+      delete bitmaps[numInputSyms + i];
+    }
+  }
+  gfree(bitmaps);
+  if (symWidths) {
+    gfree(symWidths);
+  }
+  return gFalse;
+
+ eofError:
+  error(errSyntaxError, curStr->getPos(), "Unexpected EOF in JBIG2 stream");
+  return gFalse;
+}
+
+void JBIG2Stream::readTextRegionSeg(Guint segNum, GBool imm,
+                                   GBool lossless, Guint length,
+                                   Guint *refSegs, Guint nRefSegs) {
+  JBIG2Bitmap *bitmap;
+  JBIG2HuffmanTable runLengthTab[36];
+  JBIG2HuffmanTable *symCodeTab;
+  JBIG2HuffmanTable *huffFSTable, *huffDSTable, *huffDTTable;
+  JBIG2HuffmanTable *huffRDWTable, *huffRDHTable;
+  JBIG2HuffmanTable *huffRDXTable, *huffRDYTable, *huffRSizeTable;
+  JBIG2Segment *seg;
+  GooList *codeTables;
+  JBIG2SymbolDict *symbolDict;
+  JBIG2Bitmap **syms;
+  Guint w, h, x, y, segInfoFlags, extCombOp;
+  Guint flags, huff, refine, logStrips, refCorner, transposed;
+  Guint combOp, defPixel, templ;
+  int sOffset;
+  Guint huffFlags, huffFS, huffDS, huffDT;
+  Guint huffRDW, huffRDH, huffRDX, huffRDY, huffRSize;
+  Guint numInstances, numSyms, symCodeLen;
+  int atx[2], aty[2];
+  Guint i, k, kk;
+  int j;
+
+  // region segment info field
+  if (!readULong(&w) || !readULong(&h) ||
+      !readULong(&x) || !readULong(&y) ||
+      !readUByte(&segInfoFlags)) {
+    goto eofError;
+  }
+  extCombOp = segInfoFlags & 7;
+
+  // rest of the text region header
+  if (!readUWord(&flags)) {
+    goto eofError;
+  }
+  huff = flags & 1;
+  refine = (flags >> 1) & 1;
+  logStrips = (flags >> 2) & 3;
+  refCorner = (flags >> 4) & 3;
+  transposed = (flags >> 6) & 1;
+  combOp = (flags >> 7) & 3;
+  defPixel = (flags >> 9) & 1;
+  sOffset = (flags >> 10) & 0x1f;
+  if (sOffset & 0x10) {
+    sOffset |= -1 - 0x0f;
+  }
+  templ = (flags >> 15) & 1;
+  huffFS = huffDS = huffDT = 0; // make gcc happy
+  huffRDW = huffRDH = huffRDX = huffRDY = huffRSize = 0; // make gcc happy
+  if (huff) {
+    if (!readUWord(&huffFlags)) {
+      goto eofError;
+    }
+    huffFS = huffFlags & 3;
+    huffDS = (huffFlags >> 2) & 3;
+    huffDT = (huffFlags >> 4) & 3;
+    huffRDW = (huffFlags >> 6) & 3;
+    huffRDH = (huffFlags >> 8) & 3;
+    huffRDX = (huffFlags >> 10) & 3;
+    huffRDY = (huffFlags >> 12) & 3;
+    huffRSize = (huffFlags >> 14) & 1;
+  }
+  if (refine && templ == 0) {
+    if (!readByte(&atx[0]) || !readByte(&aty[0]) ||
+       !readByte(&atx[1]) || !readByte(&aty[1])) {
+      goto eofError;
+    }
+  }
+  if (!readULong(&numInstances)) {
+    goto eofError;
+  }
+
+  // get symbol dictionaries and tables
+  codeTables = new GooList();
+  numSyms = 0;
+  for (i = 0; i < nRefSegs; ++i) {
+    if ((seg = findSegment(refSegs[i]))) {
+      if (seg->getType() == jbig2SegSymbolDict) {
+       numSyms += ((JBIG2SymbolDict *)seg)->getSize();
+      } else if (seg->getType() == jbig2SegCodeTable) {
+       codeTables->append(seg);
+      }
+    } else {
+      error(errSyntaxError, curStr->getPos(), "Invalid segment reference in JBIG2 text region");
+      delete codeTables;
+      return;
+    }
+  }
+  i = numSyms;
+  if (i <= 1) {
+    symCodeLen = huff ? 1 : 0;
+  } else {
+    --i;
+    symCodeLen = 0;
+    // i = floor((numSyms-1) / 2^symCodeLen)
+    while (i > 0) {
+      ++symCodeLen;
+      i >>= 1;
+    }
+  }
+
+  // get the symbol bitmaps
+  syms = (JBIG2Bitmap **)gmallocn(numSyms, sizeof(JBIG2Bitmap *));
+  kk = 0;
+  for (i = 0; i < nRefSegs; ++i) {
+    if ((seg = findSegment(refSegs[i]))) {
+      if (seg->getType() == jbig2SegSymbolDict) {
+       symbolDict = (JBIG2SymbolDict *)seg;
+       for (k = 0; k < symbolDict->getSize(); ++k) {
+         syms[kk++] = symbolDict->getBitmap(k);
+       }
+      }
+    }
+  }
+
+  // get the Huffman tables
+  huffFSTable = huffDSTable = huffDTTable = NULL; // make gcc happy
+  huffRDWTable = huffRDHTable = NULL; // make gcc happy
+  huffRDXTable = huffRDYTable = huffRSizeTable = NULL; // make gcc happy
+  i = 0;
+  if (huff) {
+    if (huffFS == 0) {
+      huffFSTable = huffTableF;
+    } else if (huffFS == 1) {
+      huffFSTable = huffTableG;
+    } else {
+      if (i >= (Guint)codeTables->getLength()) {
+       goto codeTableError;
+      }
+      huffFSTable = ((JBIG2CodeTable *)codeTables->get(i++))->getHuffTable();
+    }
+    if (huffDS == 0) {
+      huffDSTable = huffTableH;
+    } else if (huffDS == 1) {
+      huffDSTable = huffTableI;
+    } else if (huffDS == 2) {
+      huffDSTable = huffTableJ;
+    } else {
+      if (i >= (Guint)codeTables->getLength()) {
+       goto codeTableError;
+      }
+      huffDSTable = ((JBIG2CodeTable *)codeTables->get(i++))->getHuffTable();
+    }
+    if (huffDT == 0) {
+      huffDTTable = huffTableK;
+    } else if (huffDT == 1) {
+      huffDTTable = huffTableL;
+    } else if (huffDT == 2) {
+      huffDTTable = huffTableM;
+    } else {
+      if (i >= (Guint)codeTables->getLength()) {
+       goto codeTableError;
+      }
+      huffDTTable = ((JBIG2CodeTable *)codeTables->get(i++))->getHuffTable();
+    }
+    if (huffRDW == 0) {
+      huffRDWTable = huffTableN;
+    } else if (huffRDW == 1) {
+      huffRDWTable = huffTableO;
+    } else {
+      if (i >= (Guint)codeTables->getLength()) {
+       goto codeTableError;
+      }
+      huffRDWTable = ((JBIG2CodeTable *)codeTables->get(i++))->getHuffTable();
+    }
+    if (huffRDH == 0) {
+      huffRDHTable = huffTableN;
+    } else if (huffRDH == 1) {
+      huffRDHTable = huffTableO;
+    } else {
+      if (i >= (Guint)codeTables->getLength()) {
+       goto codeTableError;
+      }
+      huffRDHTable = ((JBIG2CodeTable *)codeTables->get(i++))->getHuffTable();
+    }
+    if (huffRDX == 0) {
+      huffRDXTable = huffTableN;
+    } else if (huffRDX == 1) {
+      huffRDXTable = huffTableO;
+    } else {
+      if (i >= (Guint)codeTables->getLength()) {
+       goto codeTableError;
+      }
+      huffRDXTable = ((JBIG2CodeTable *)codeTables->get(i++))->getHuffTable();
+    }
+    if (huffRDY == 0) {
+      huffRDYTable = huffTableN;
+    } else if (huffRDY == 1) {
+      huffRDYTable = huffTableO;
+    } else {
+      if (i >= (Guint)codeTables->getLength()) {
+       goto codeTableError;
+      }
+      huffRDYTable = ((JBIG2CodeTable *)codeTables->get(i++))->getHuffTable();
+    }
+    if (huffRSize == 0) {
+      huffRSizeTable = huffTableA;
+    } else {
+      if (i >= (Guint)codeTables->getLength()) {
+       goto codeTableError;
+      }
+      huffRSizeTable =
+         ((JBIG2CodeTable *)codeTables->get(i++))->getHuffTable();
+    }
+  }
+  delete codeTables;
+
+  // symbol ID Huffman decoding table
+  if (huff) {
+    huffDecoder->reset();
+    for (i = 0; i < 32; ++i) {
+      runLengthTab[i].val = i;
+      runLengthTab[i].prefixLen = huffDecoder->readBits(4);
+      runLengthTab[i].rangeLen = 0;
+    }
+    runLengthTab[32].val = 0x103;
+    runLengthTab[32].prefixLen = huffDecoder->readBits(4);
+    runLengthTab[32].rangeLen = 2;
+    runLengthTab[33].val = 0x203;
+    runLengthTab[33].prefixLen = huffDecoder->readBits(4);
+    runLengthTab[33].rangeLen = 3;
+    runLengthTab[34].val = 0x20b;
+    runLengthTab[34].prefixLen = huffDecoder->readBits(4);
+    runLengthTab[34].rangeLen = 7;
+    runLengthTab[35].prefixLen = 0;
+    runLengthTab[35].rangeLen = jbig2HuffmanEOT;
+    huffDecoder->buildTable(runLengthTab, 35);
+    symCodeTab = (JBIG2HuffmanTable *)gmallocn(numSyms + 1,
+                                              sizeof(JBIG2HuffmanTable));
+    for (i = 0; i < numSyms; ++i) {
+      symCodeTab[i].val = i;
+      symCodeTab[i].rangeLen = 0;
+    }
+    i = 0;
+    while (i < numSyms) {
+      huffDecoder->decodeInt(&j, runLengthTab);
+      if (j > 0x200) {
+       for (j -= 0x200; j && i < numSyms; --j) {
+         symCodeTab[i++].prefixLen = 0;
+       }
+      } else if (j > 0x100) {
+       for (j -= 0x100; j && i < numSyms; --j) {
+         symCodeTab[i].prefixLen = symCodeTab[i-1].prefixLen;
+         ++i;
+       }
+      } else {
+       symCodeTab[i++].prefixLen = j;
+      }
+    }
+    symCodeTab[numSyms].prefixLen = 0;
+    symCodeTab[numSyms].rangeLen = jbig2HuffmanEOT;
+    huffDecoder->buildTable(symCodeTab, numSyms);
+    huffDecoder->reset();
+
+  // set up the arithmetic decoder
+  } else {
+    symCodeTab = NULL;
+    resetIntStats(symCodeLen);
+    arithDecoder->start();
+  }
+  if (refine) {
+    resetRefinementStats(templ, NULL);
+  }
+
+  bitmap = readTextRegion(huff, refine, w, h, numInstances,
+                         logStrips, numSyms, symCodeTab, symCodeLen, syms,
+                         defPixel, combOp, transposed, refCorner, sOffset,
+                         huffFSTable, huffDSTable, huffDTTable,
+                         huffRDWTable, huffRDHTable,
+                         huffRDXTable, huffRDYTable, huffRSizeTable,
+                         templ, atx, aty);
+
+  gfree(syms);
+
+  if (bitmap) {
+    // combine the region bitmap into the page bitmap
+    if (imm) {
+      if (pageH == 0xffffffff && y + h > curPageH) {
+        pageBitmap->expand(y + h, pageDefPixel);
+      }
+      pageBitmap->combine(bitmap, x, y, extCombOp);
+      delete bitmap;
+
+    // store the region bitmap
+    } else {
+      bitmap->setSegNum(segNum);
+      segments->append(bitmap);
+    }
+  }
+
+  // clean up the Huffman decoder
+  if (huff) {
+    gfree(symCodeTab);
+  }
+
+  return;
+
+ codeTableError:
+  error(errSyntaxError, curStr->getPos(), "Missing code table in JBIG2 text region");
+  gfree(codeTables);
+  delete syms;
+  return;
+
+ eofError:
+  error(errSyntaxError, curStr->getPos(), "Unexpected EOF in JBIG2 stream");
+  return;
+}
+
+JBIG2Bitmap *JBIG2Stream::readTextRegion(GBool huff, GBool refine,
+                                        int w, int h,
+                                        Guint numInstances,
+                                        Guint logStrips,
+                                        int numSyms,
+                                        JBIG2HuffmanTable *symCodeTab,
+                                        Guint symCodeLen,
+                                        JBIG2Bitmap **syms,
+                                        Guint defPixel, Guint combOp,
+                                        Guint transposed, Guint refCorner,
+                                        int sOffset,
+                                        JBIG2HuffmanTable *huffFSTable,
+                                        JBIG2HuffmanTable *huffDSTable,
+                                        JBIG2HuffmanTable *huffDTTable,
+                                        JBIG2HuffmanTable *huffRDWTable,
+                                        JBIG2HuffmanTable *huffRDHTable,
+                                        JBIG2HuffmanTable *huffRDXTable,
+                                        JBIG2HuffmanTable *huffRDYTable,
+                                        JBIG2HuffmanTable *huffRSizeTable,
+                                        Guint templ,
+                                        int *atx, int *aty) {
+  JBIG2Bitmap *bitmap;
+  JBIG2Bitmap *symbolBitmap;
+  Guint strips;
+  int t, dt, tt, s, ds, sFirst, j;
+  int rdw, rdh, rdx, rdy, ri, refDX, refDY, bmSize;
+  Guint symID, inst, bw, bh;
+
+  strips = 1 << logStrips;
+
+  // allocate the bitmap
+  bitmap = new JBIG2Bitmap(0, w, h);
+  if (!bitmap->isOk()) {
+    delete bitmap;
+    return NULL;
+  }
+  if (defPixel) {
+    bitmap->clearToOne();
+  } else {
+    bitmap->clearToZero();
+  }
+
+  // decode initial T value
+  if (huff) {
+    huffDecoder->decodeInt(&t, huffDTTable);
+  } else {
+    arithDecoder->decodeInt(&t, iadtStats);
+  }
+  t *= -(int)strips;
+
+  inst = 0;
+  sFirst = 0;
+  while (inst < numInstances) {
+
+    // decode delta-T
+    if (huff) {
+      huffDecoder->decodeInt(&dt, huffDTTable);
+    } else {
+      arithDecoder->decodeInt(&dt, iadtStats);
+    }
+    t += dt * strips;
+
+    // first S value
+    if (huff) {
+      huffDecoder->decodeInt(&ds, huffFSTable);
+    } else {
+      arithDecoder->decodeInt(&ds, iafsStats);
+    }
+    sFirst += ds;
+    s = sFirst;
+
+    // read the instances
+    // (this loop test is here to avoid an infinite loop with damaged
+    // JBIG2 streams where the normal loop exit doesn't get triggered)
+    while (inst < numInstances) {
+
+      // T value
+      if (strips == 1) {
+       dt = 0;
+      } else if (huff) {
+       dt = huffDecoder->readBits(logStrips);
+      } else {
+       arithDecoder->decodeInt(&dt, iaitStats);
+      }
+      tt = t + dt;
+
+      // symbol ID
+      if (huff) {
+       if (symCodeTab) {
+         huffDecoder->decodeInt(&j, symCodeTab);
+         symID = (Guint)j;
+       } else {
+         symID = huffDecoder->readBits(symCodeLen);
+       }
+      } else {
+       symID = arithDecoder->decodeIAID(symCodeLen, iaidStats);
+      }
+
+      if (symID >= (Guint)numSyms) {
+       error(errSyntaxError, curStr->getPos(), "Invalid symbol number in JBIG2 text region");
+      } else {
+
+       // get the symbol bitmap
+       symbolBitmap = NULL;
+       if (refine) {
+         if (huff) {
+           ri = (int)huffDecoder->readBit();
+         } else {
+           arithDecoder->decodeInt(&ri, iariStats);
+         }
+       } else {
+         ri = 0;
+       }
+       if (ri) {
+         GBool decodeSuccess;
+         if (huff) {
+           decodeSuccess = huffDecoder->decodeInt(&rdw, huffRDWTable);
+           decodeSuccess = decodeSuccess && huffDecoder->decodeInt(&rdh, huffRDHTable);
+           decodeSuccess = decodeSuccess && huffDecoder->decodeInt(&rdx, huffRDXTable);
+           decodeSuccess = decodeSuccess && huffDecoder->decodeInt(&rdy, huffRDYTable);
+           decodeSuccess = decodeSuccess && huffDecoder->decodeInt(&bmSize, huffRSizeTable);
+           huffDecoder->reset();
+           arithDecoder->start();
+         } else {
+           decodeSuccess = arithDecoder->decodeInt(&rdw, iardwStats);
+           decodeSuccess = decodeSuccess && arithDecoder->decodeInt(&rdh, iardhStats);
+           decodeSuccess = decodeSuccess && arithDecoder->decodeInt(&rdx, iardxStats);
+           decodeSuccess = decodeSuccess && arithDecoder->decodeInt(&rdy, iardyStats);
+         }
+         
+         if (decodeSuccess && syms[symID])
+         {
+           refDX = ((rdw >= 0) ? rdw : rdw - 1) / 2 + rdx;
+           refDY = ((rdh >= 0) ? rdh : rdh - 1) / 2 + rdy;
+
+           symbolBitmap =
+             readGenericRefinementRegion(rdw + syms[symID]->getWidth(),
+                                         rdh + syms[symID]->getHeight(),
+                                         templ, gFalse, syms[symID],
+                                         refDX, refDY, atx, aty);
+         }
+         //~ do we need to use the bmSize value here (in Huffman mode)?
+       } else {
+         symbolBitmap = syms[symID];
+       }
+
+       if (symbolBitmap) {
+         // combine the symbol bitmap into the region bitmap
+         //~ something is wrong here - refCorner shouldn't degenerate into
+         //~   two cases
+         bw = symbolBitmap->getWidth() - 1;
+         bh = symbolBitmap->getHeight() - 1;
+         if (transposed) {
+           switch (refCorner) {
+           case 0: // bottom left
+             bitmap->combine(symbolBitmap, tt, s, combOp);
+             break;
+           case 1: // top left
+             bitmap->combine(symbolBitmap, tt, s, combOp);
+             break;
+           case 2: // bottom right
+             bitmap->combine(symbolBitmap, tt - bw, s, combOp);
+             break;
+           case 3: // top right
+             bitmap->combine(symbolBitmap, tt - bw, s, combOp);
+             break;
+           }
+           s += bh;
+         } else {
+           switch (refCorner) {
+           case 0: // bottom left
+             bitmap->combine(symbolBitmap, s, tt - bh, combOp);
+             break;
+           case 1: // top left
+             bitmap->combine(symbolBitmap, s, tt, combOp);
+             break;
+           case 2: // bottom right
+             bitmap->combine(symbolBitmap, s, tt - bh, combOp);
+             break;
+           case 3: // top right
+             bitmap->combine(symbolBitmap, s, tt, combOp);
+             break;
+           }
+           s += bw;
+         }
+         if (ri) {
+           delete symbolBitmap;
+         }
+       } else {
+         // NULL symbolBitmap only happens on error
+         delete bitmap;
+         return NULL;
+       }
+      }
+
+      // next instance
+      ++inst;
+
+      // next S value
+      if (huff) {
+       if (!huffDecoder->decodeInt(&ds, huffDSTable)) {
+         break;
+       }
+      } else {
+       if (!arithDecoder->decodeInt(&ds, iadsStats)) {
+         break;
+       }
+      }
+      s += sOffset + ds;
+    }
+  }
+
+  return bitmap;
+}
+
+void JBIG2Stream::readPatternDictSeg(Guint segNum, Guint length) {
+  JBIG2PatternDict *patternDict;
+  JBIG2Bitmap *bitmap;
+  Guint flags, patternW, patternH, grayMax, templ, mmr;
+  int atx[4], aty[4];
+  Guint i, x;
+
+  // halftone dictionary flags, pattern width and height, max gray value
+  if (!readUByte(&flags) ||
+      !readUByte(&patternW) ||
+      !readUByte(&patternH) ||
+      !readULong(&grayMax)) {
+    goto eofError;
+  }
+  templ = (flags >> 1) & 3;
+  mmr = flags & 1;
+
+  // set up the arithmetic decoder
+  if (!mmr) {
+    resetGenericStats(templ, NULL);
+    arithDecoder->start();
+  }
+
+  // read the bitmap
+  atx[0] = -(int)patternW; aty[0] =  0;
+  atx[1] = -3;             aty[1] = -1;
+  atx[2] =  2;             aty[2] = -2;
+  atx[3] = -2;             aty[3] = -2;
+  bitmap = readGenericBitmap(mmr, (grayMax + 1) * patternW, patternH,
+                            templ, gFalse, gFalse, NULL,
+                            atx, aty, length - 7);
+
+  if (!bitmap)
+    return;
+
+  // create the pattern dict object
+  patternDict = new JBIG2PatternDict(segNum, grayMax + 1);
+
+  // split up the bitmap
+  x = 0;
+  for (i = 0; i <= grayMax; ++i) {
+    patternDict->setBitmap(i, bitmap->getSlice(x, 0, patternW, patternH));
+    x += patternW;
+  }
+
+  // free memory
+  delete bitmap;
+
+  // store the new pattern dict
+  segments->append(patternDict);
+
+  return;
+
+ eofError:
+  error(errSyntaxError, curStr->getPos(), "Unexpected EOF in JBIG2 stream");
+}
+
+void JBIG2Stream::readHalftoneRegionSeg(Guint segNum, GBool imm,
+                                       GBool lossless, Guint length,
+                                       Guint *refSegs, Guint nRefSegs) {
+  JBIG2Bitmap *bitmap;
+  JBIG2Segment *seg;
+  JBIG2PatternDict *patternDict;
+  JBIG2Bitmap *skipBitmap;
+  Guint *grayImg;
+  JBIG2Bitmap *grayBitmap;
+  JBIG2Bitmap *patternBitmap;
+  Guint w, h, x, y, segInfoFlags, extCombOp;
+  Guint flags, mmr, templ, enableSkip, combOp;
+  Guint gridW, gridH, stepX, stepY, patW, patH;
+  int atx[4], aty[4];
+  int gridX, gridY, xx, yy, bit, j;
+  Guint bpp, m, n, i;
+
+  // region segment info field
+  if (!readULong(&w) || !readULong(&h) ||
+      !readULong(&x) || !readULong(&y) ||
+      !readUByte(&segInfoFlags)) {
+    goto eofError;
+  }
+  extCombOp = segInfoFlags & 7;
+
+  // rest of the halftone region header
+  if (!readUByte(&flags)) {
+    goto eofError;
+  }
+  mmr = flags & 1;
+  templ = (flags >> 1) & 3;
+  enableSkip = (flags >> 3) & 1;
+  combOp = (flags >> 4) & 7;
+  if (!readULong(&gridW) || !readULong(&gridH) ||
+      !readLong(&gridX) || !readLong(&gridY) ||
+      !readUWord(&stepX) || !readUWord(&stepY)) {
+    goto eofError;
+  }
+  if (w == 0 || h == 0 || w >= INT_MAX / h) {
+    error(errSyntaxError, curStr->getPos(), "Bad bitmap size in JBIG2 halftone segment");
+    return;
+  }
+  if (gridH == 0 || gridW >= INT_MAX / gridH) {
+    error(errSyntaxError, curStr->getPos(), "Bad grid size in JBIG2 halftone segment");
+    return;
+  }
+
+  // get pattern dictionary
+  if (nRefSegs != 1) {
+    error(errSyntaxError, curStr->getPos(), "Bad symbol dictionary reference in JBIG2 halftone segment");
+    return;
+  }
+  seg = findSegment(refSegs[0]);
+  if (seg == NULL || seg->getType() != jbig2SegPatternDict) {
+    error(errSyntaxError, curStr->getPos(), "Bad symbol dictionary reference in JBIG2 halftone segment");
+    return;
+  }
+
+  patternDict = (JBIG2PatternDict *)seg;
+  i = patternDict->getSize();
+  if (i <= 1) {
+    bpp = 0;
+  } else {
+    --i;
+    bpp = 0;
+    // i = floor((size-1) / 2^bpp)
+    while (i > 0) {
+      ++bpp;
+      i >>= 1;
+    }
+  }
+  patW = patternDict->getBitmap(0)->getWidth();
+  patH = patternDict->getBitmap(0)->getHeight();
+
+  // set up the arithmetic decoder
+  if (!mmr) {
+    resetGenericStats(templ, NULL);
+    arithDecoder->start();
+  }
+
+  // allocate the bitmap
+  bitmap = new JBIG2Bitmap(segNum, w, h);
+  if (flags & 0x80) { // HDEFPIXEL
+    bitmap->clearToOne();
+  } else {
+    bitmap->clearToZero();
+  }
+
+  // compute the skip bitmap
+  skipBitmap = NULL;
+  if (enableSkip) {
+    skipBitmap = new JBIG2Bitmap(0, gridW, gridH);
+    skipBitmap->clearToZero();
+    for (m = 0; m < gridH; ++m) {
+      for (n = 0; n < gridW; ++n) {
+       xx = gridX + m * stepY + n * stepX;
+       yy = gridY + m * stepX - n * stepY;
+       if (((xx + (int)patW) >> 8) <= 0 || (xx >> 8) >= (int)w ||
+           ((yy + (int)patH) >> 8) <= 0 || (yy >> 8) >= (int)h) {
+         skipBitmap->setPixel(n, m);
+       }
+      }
+    }
+  }
+
+  // read the gray-scale image
+  grayImg = (Guint *)gmallocn(gridW * gridH, sizeof(Guint));
+  memset(grayImg, 0, gridW * gridH * sizeof(Guint));
+  atx[0] = templ <= 1 ? 3 : 2;  aty[0] = -1;
+  atx[1] = -3;                  aty[1] = -1;
+  atx[2] =  2;                  aty[2] = -2;
+  atx[3] = -2;                  aty[3] = -2;
+  for (j = bpp - 1; j >= 0; --j) {
+    grayBitmap = readGenericBitmap(mmr, gridW, gridH, templ, gFalse,
+                                  enableSkip, skipBitmap, atx, aty, -1);
+    i = 0;
+    for (m = 0; m < gridH; ++m) {
+      for (n = 0; n < gridW; ++n) {
+       bit = grayBitmap->getPixel(n, m) ^ (grayImg[i] & 1);
+       grayImg[i] = (grayImg[i] << 1) | bit;
+       ++i;
+      }
+    }
+    delete grayBitmap;
+  }
+
+  // decode the image
+  i = 0;
+  for (m = 0; m < gridH; ++m) {
+    xx = gridX + m * stepY;
+    yy = gridY + m * stepX;
+    for (n = 0; n < gridW; ++n) {
+      if (!(enableSkip && skipBitmap->getPixel(n, m))) {
+       patternBitmap = patternDict->getBitmap(grayImg[i]);
+       bitmap->combine(patternBitmap, xx >> 8, yy >> 8, combOp);
+      }
+      xx += stepX;
+      yy -= stepY;
+      ++i;
+    }
+  }
+
+  gfree(grayImg);
+  if (skipBitmap) {
+    delete skipBitmap;
+  }
+
+  // combine the region bitmap into the page bitmap
+  if (imm) {
+    if (pageH == 0xffffffff && y + h > curPageH) {
+      pageBitmap->expand(y + h, pageDefPixel);
+    }
+    pageBitmap->combine(bitmap, x, y, extCombOp);
+    delete bitmap;
+
+  // store the region bitmap
+  } else {
+    segments->append(bitmap);
+  }
+
+  return;
+
+ eofError:
+  error(errSyntaxError, curStr->getPos(), "Unexpected EOF in JBIG2 stream");
+}
+
+void JBIG2Stream::readGenericRegionSeg(Guint segNum, GBool imm,
+                                      GBool lossless, Guint length) {
+  JBIG2Bitmap *bitmap;
+  Guint w, h, x, y, segInfoFlags, extCombOp, rowCount;
+  Guint flags, mmr, templ, tpgdOn;
+  int atx[4], aty[4];
+
+  // region segment info field
+  if (!readULong(&w) || !readULong(&h) ||
+      !readULong(&x) || !readULong(&y) ||
+      !readUByte(&segInfoFlags)) {
+    goto eofError;
+  }
+  extCombOp = segInfoFlags & 7;
+
+  // rest of the generic region segment header
+  if (!readUByte(&flags)) {
+    goto eofError;
+  }
+  mmr = flags & 1;
+  templ = (flags >> 1) & 3;
+  tpgdOn = (flags >> 3) & 1;
+
+  // AT flags
+  if (!mmr) {
+    if (templ == 0) {
+      if (!readByte(&atx[0]) ||
+         !readByte(&aty[0]) ||
+         !readByte(&atx[1]) ||
+         !readByte(&aty[1]) ||
+         !readByte(&atx[2]) ||
+         !readByte(&aty[2]) ||
+         !readByte(&atx[3]) ||
+         !readByte(&aty[3])) {
+       goto eofError;
+      }
+    } else {
+      if (!readByte(&atx[0]) ||
+         !readByte(&aty[0])) {
+       goto eofError;
+      }
+    }
+  }
+
+  // set up the arithmetic decoder
+  if (!mmr) {
+    resetGenericStats(templ, NULL);
+    arithDecoder->start();
+  }
+
+  // read the bitmap
+  bitmap = readGenericBitmap(mmr, w, h, templ, tpgdOn, gFalse,
+                            NULL, atx, aty, mmr ? length - 18 : 0);
+  if (!bitmap)
+    return;
+
+  // combine the region bitmap into the page bitmap
+  if (imm) {
+    if (pageH == 0xffffffff && y + h > curPageH) {
+      pageBitmap->expand(y + h, pageDefPixel);
+    }
+    pageBitmap->combine(bitmap, x, y, extCombOp);
+    delete bitmap;
+
+  // store the region bitmap
+  } else {
+    bitmap->setSegNum(segNum);
+    segments->append(bitmap);
+  }
+
+  // immediate generic segments can have an unspecified length, in
+  // which case, a row count is stored at the end of the segment
+  if (imm && length == 0xffffffff) {
+    readULong(&rowCount);
+  }
+
+  return;
+
+ eofError:
+  error(errSyntaxError, curStr->getPos(), "Unexpected EOF in JBIG2 stream");
+}
+
+inline void JBIG2Stream::mmrAddPixels(int a1, int blackPixels,
+                                     int *codingLine, int *a0i, int w) {
+  if (a1 > codingLine[*a0i]) {
+    if (a1 > w) {
+      error(errSyntaxError, curStr->getPos(), "JBIG2 MMR row is wrong length ({0:d})", a1);
+      a1 = w;
+    }
+    if ((*a0i & 1) ^ blackPixels) {
+      ++*a0i;
+    }
+    codingLine[*a0i] = a1;
+  }
+}
+
+inline void JBIG2Stream::mmrAddPixelsNeg(int a1, int blackPixels,
+                                        int *codingLine, int *a0i, int w) {
+  if (a1 > codingLine[*a0i]) {
+    if (a1 > w) {
+      error(errSyntaxError, curStr->getPos(), "JBIG2 MMR row is wrong length ({0:d})", a1);
+      a1 = w;
+    }
+    if ((*a0i & 1) ^ blackPixels) {
+      ++*a0i;
+    }
+    codingLine[*a0i] = a1;
+  } else if (a1 < codingLine[*a0i]) {
+    if (a1 < 0) {
+      error(errSyntaxError, curStr->getPos(), "Invalid JBIG2 MMR code");
+      a1 = 0;
+    }
+    while (*a0i > 0 && a1 <= codingLine[*a0i - 1]) {
+      --*a0i;
+    }
+    codingLine[*a0i] = a1;
+  }
+}
+
+JBIG2Bitmap *JBIG2Stream::readGenericBitmap(GBool mmr, int w, int h,
+                                           int templ, GBool tpgdOn,
+                                           GBool useSkip, JBIG2Bitmap *skip,
+                                           int *atx, int *aty,
+                                           int mmrDataLength) {
+  JBIG2Bitmap *bitmap;
+  GBool ltp;
+  Guint ltpCX, cx, cx0, cx1, cx2;
+  int *refLine, *codingLine;
+  int code1, code2, code3;
+  Guchar *p0, *p1, *p2, *pp;
+  Guchar *atP0, *atP1, *atP2, *atP3;
+  Guint buf0, buf1, buf2;
+  Guint atBuf0, atBuf1, atBuf2, atBuf3;
+  int atShift0, atShift1, atShift2, atShift3;
+  Guchar mask;
+  int x, y, x0, x1, a0i, b1i, blackPixels, pix, i;
+
+  bitmap = new JBIG2Bitmap(0, w, h);
+  if (!bitmap->isOk()) {
+    delete bitmap;
+    return NULL;
+  }
+  bitmap->clearToZero();
+
+  //----- MMR decode
+
+  if (mmr) {
+
+    mmrDecoder->reset();
+    if (w > INT_MAX - 2) {
+      error(errSyntaxError, curStr->getPos(), "Bad width in JBIG2 generic bitmap");
+      // force a call to gmalloc(-1), which will throw an exception
+      w = -3;
+    }
+    // 0 <= codingLine[0] < codingLine[1] < ... < codingLine[n] = w
+    // ---> max codingLine size = w + 1
+    // refLine has one extra guard entry at the end
+    // ---> max refLine size = w + 2
+    codingLine = (int *)gmallocn(w + 1, sizeof(int));
+    refLine = (int *)gmallocn(w + 2, sizeof(int));
+    memset(refLine, 0, (w + 2) * sizeof(int));
+    for (i = 0; i < w + 1; ++i) codingLine[i] = w;
+
+    for (y = 0; y < h; ++y) {
+
+      // copy coding line to ref line
+      for (i = 0; codingLine[i] < w; ++i) {
+       refLine[i] = codingLine[i];
+      }
+      refLine[i++] = w;
+      refLine[i] = w;
+
+      // decode a line
+      codingLine[0] = 0;
+      a0i = 0;
+      b1i = 0;
+      blackPixels = 0;
+      // invariant:
+      // refLine[b1i-1] <= codingLine[a0i] < refLine[b1i] < refLine[b1i+1] <= w
+      // exception at left edge:
+      //   codingLine[a0i = 0] = refLine[b1i = 0] = 0 is possible
+      // exception at right edge:
+      //   refLine[b1i] = refLine[b1i+1] = w is possible
+      while (codingLine[a0i] < w) {
+       code1 = mmrDecoder->get2DCode();
+       switch (code1) {
+       case twoDimPass:
+          if (unlikely(b1i + 1 >= w + 2)) {
+            break;
+          }
+          mmrAddPixels(refLine[b1i + 1], blackPixels, codingLine, &a0i, w);
+          if (refLine[b1i + 1] < w) {
+            b1i += 2;
+          }
+          break;
+       case twoDimHoriz:
+          code1 = code2 = 0;
+          if (blackPixels) {
+            do {
+              code1 += code3 = mmrDecoder->getBlackCode();
+            } while (code3 >= 64);
+            do {
+              code2 += code3 = mmrDecoder->getWhiteCode();
+            } while (code3 >= 64);
+          } else {
+            do {
+              code1 += code3 = mmrDecoder->getWhiteCode();
+            } while (code3 >= 64);
+            do {
+              code2 += code3 = mmrDecoder->getBlackCode();
+            } while (code3 >= 64);
+          }
+          mmrAddPixels(codingLine[a0i] + code1, blackPixels,
+                      codingLine, &a0i, w);
+          if (codingLine[a0i] < w) {
+            mmrAddPixels(codingLine[a0i] + code2, blackPixels ^ 1,
+                        codingLine, &a0i, w);
+          }
+          while (likely(b1i < w + 2) && refLine[b1i] <= codingLine[a0i] && refLine[b1i] < w) {
+            b1i += 2;
+          }
+          break;
+       case twoDimVertR3:
+          if (unlikely(b1i >= w + 2)) {
+            break;
+          }
+          mmrAddPixels(refLine[b1i] + 3, blackPixels, codingLine, &a0i, w);
+          blackPixels ^= 1;
+          if (codingLine[a0i] < w) {
+            ++b1i;
+            while (likely(b1i < w + 2) && refLine[b1i] <= codingLine[a0i] && refLine[b1i] < w) {
+              b1i += 2;
+            }
+          }
+          break;
+       case twoDimVertR2:
+          if (unlikely(b1i >= w + 2)) {
+            break;
+          }
+          mmrAddPixels(refLine[b1i] + 2, blackPixels, codingLine, &a0i, w);
+          blackPixels ^= 1;
+          if (codingLine[a0i] < w) {
+            ++b1i;
+            while (likely(b1i < w + 2) && refLine[b1i] <= codingLine[a0i] && refLine[b1i] < w) {
+              b1i += 2;
+            }
+          }
+          break;
+       case twoDimVertR1:
+          if (unlikely(b1i >= w + 2)) {
+            break;
+          }
+          mmrAddPixels(refLine[b1i] + 1, blackPixels, codingLine, &a0i, w);
+          blackPixels ^= 1;
+          if (codingLine[a0i] < w) {
+            ++b1i;
+            while (likely(b1i < w + 2) && refLine[b1i] <= codingLine[a0i] && refLine[b1i] < w) {
+              b1i += 2;
+            }
+          }
+          break;
+       case twoDimVert0:
+          if (unlikely(b1i >= w + 2)) {
+            break;
+          }
+          mmrAddPixels(refLine[b1i], blackPixels, codingLine, &a0i, w);
+          blackPixels ^= 1;
+          if (codingLine[a0i] < w) {
+            ++b1i;
+            while (likely(b1i < w + 2) && refLine[b1i] <= codingLine[a0i] && refLine[b1i] < w) {
+              b1i += 2;
+            }
+          }
+          break;
+       case twoDimVertL3:
+          if (unlikely(b1i >= w + 2)) {
+            break;
+          }
+          mmrAddPixelsNeg(refLine[b1i] - 3, blackPixels, codingLine, &a0i, w);
+          blackPixels ^= 1;
+          if (codingLine[a0i] < w) {
+            if (b1i > 0) {
+              --b1i;
+            } else {
+              ++b1i;
+            }
+            while (likely(b1i < w + 2) && refLine[b1i] <= codingLine[a0i] && refLine[b1i] < w) {
+              b1i += 2;
+            }
+          }
+          break;
+       case twoDimVertL2:
+          if (unlikely(b1i >= w + 2)) {
+            break;
+          }
+          mmrAddPixelsNeg(refLine[b1i] - 2, blackPixels, codingLine, &a0i, w);
+          blackPixels ^= 1;
+          if (codingLine[a0i] < w) {
+            if (b1i > 0) {
+              --b1i;
+            } else {
+              ++b1i;
+            }
+            while (likely(b1i < w + 2) && refLine[b1i] <= codingLine[a0i] && refLine[b1i] < w) {
+              b1i += 2;
+            }
+          }
+          break;
+       case twoDimVertL1:
+          if (unlikely(b1i >= w + 2)) {
+            break;
+          }
+          mmrAddPixelsNeg(refLine[b1i] - 1, blackPixels, codingLine, &a0i, w);
+          blackPixels ^= 1;
+          if (codingLine[a0i] < w) {
+            if (b1i > 0) {
+              --b1i;
+            } else {
+              ++b1i;
+            }
+            while (likely(b1i < w + 2) && refLine[b1i] <= codingLine[a0i] && refLine[b1i] < w) {
+              b1i += 2;
+            }
+          }
+          break;
+       case EOF:
+          mmrAddPixels(w, 0, codingLine, &a0i, w);
+          break;
+       default:
+         error(errSyntaxError, curStr->getPos(), "Illegal code in JBIG2 MMR bitmap data");
+          mmrAddPixels(w, 0, codingLine, &a0i, w);
+         break;
+       }
+      }
+
+      // convert the run lengths to a bitmap line
+      i = 0;
+      while (1) {
+       for (x = codingLine[i]; x < codingLine[i+1]; ++x) {
+         bitmap->setPixel(x, y);
+       }
+       if (codingLine[i+1] >= w || codingLine[i+2] >= w) {
+         break;
+       }
+       i += 2;
+      }
+    }
+
+    if (mmrDataLength >= 0) {
+      mmrDecoder->skipTo(mmrDataLength);
+    } else {
+      if (mmrDecoder->get24Bits() != 0x001001) {
+       error(errSyntaxError, curStr->getPos(), "Missing EOFB in JBIG2 MMR bitmap data");
+      }
+    }
+
+    gfree(refLine);
+    gfree(codingLine);
+
+  //----- arithmetic decode
+
+  } else {
+    // set up the typical row context
+    ltpCX = 0; // make gcc happy
+    if (tpgdOn) {
+      switch (templ) {
+      case 0:
+       ltpCX = 0x3953; // 001 11001 0101 0011
+       break;
+      case 1:
+       ltpCX = 0x079a; // 0011 11001 101 0
+       break;
+      case 2:
+       ltpCX = 0x0e3; // 001 1100 01 1
+       break;
+      case 3:
+       ltpCX = 0x18a; // 01100 0101 1
+       break;
+      }
+    }
+
+    ltp = 0;
+    cx = cx0 = cx1 = cx2 = 0; // make gcc happy
+    for (y = 0; y < h; ++y) {
+
+      // check for a "typical" (duplicate) row
+      if (tpgdOn) {
+       if (arithDecoder->decodeBit(ltpCX, genericRegionStats)) {
+         ltp = !ltp;
+       }
+       if (ltp) {
+         if (y > 0) {
+           bitmap->duplicateRow(y, y-1);
+         }
+         continue;
+       }
+      }
+
+      switch (templ) {
+      case 0:
+
+       // set up the context
+       p2 = pp = bitmap->getDataPtr() + y * bitmap->getLineSize();
+       buf2 = *p2++ << 8;
+       if (y >= 1) {
+         p1 = bitmap->getDataPtr() + (y - 1) * bitmap->getLineSize();
+         buf1 = *p1++ << 8;
+         if (y >= 2) {
+           p0 = bitmap->getDataPtr() + (y - 2) * bitmap->getLineSize();
+           buf0 = *p0++ << 8;
+         } else {
+           p0 = NULL;
+           buf0 = 0;
+         }
+       } else {
+         p1 = p0 = NULL;
+         buf1 = buf0 = 0;
+       }
+
+       if (atx[0] >= -8 && atx[0] <= 8 &&
+           atx[1] >= -8 && atx[1] <= 8 &&
+           atx[2] >= -8 && atx[2] <= 8 &&
+           atx[3] >= -8 && atx[3] <= 8) {
+         // set up the adaptive context
+         if (y + aty[0] >= 0) {
+           atP0 = bitmap->getDataPtr() + (y + aty[0]) * bitmap->getLineSize();
+           atBuf0 = *atP0++ << 8;
+         } else {
+           atP0 = NULL;
+           atBuf0 = 0;
+         }
+         atShift0 = 15 - atx[0];
+         if (y + aty[1] >= 0) {
+           atP1 = bitmap->getDataPtr() + (y + aty[1]) * bitmap->getLineSize();
+           atBuf1 = *atP1++ << 8;
+         } else {
+           atP1 = NULL;
+           atBuf1 = 0;
+         }
+         atShift1 = 15 - atx[1];
+         if (y + aty[2] >= 0) {
+           atP2 = bitmap->getDataPtr() + (y + aty[2]) * bitmap->getLineSize();
+           atBuf2 = *atP2++ << 8;
+         } else {
+           atP2 = NULL;
+           atBuf2 = 0;
+         }
+         atShift2 = 15 - atx[2];
+         if (y + aty[3] >= 0) {
+           atP3 = bitmap->getDataPtr() + (y + aty[3]) * bitmap->getLineSize();
+           atBuf3 = *atP3++ << 8;
+         } else {
+           atP3 = NULL;
+           atBuf3 = 0;
+         }
+         atShift3 = 15 - atx[3];
+
+         // decode the row
+         for (x0 = 0, x = 0; x0 < w; x0 += 8, ++pp) {
+           if (x0 + 8 < w) {
+             if (p0) {
+               buf0 |= *p0++;
+             }
+             if (p1) {
+               buf1 |= *p1++;
+             }
+             buf2 |= *p2++;
+             if (atP0) {
+               atBuf0 |= *atP0++;
+             }
+             if (atP1) {
+               atBuf1 |= *atP1++;
+             }
+             if (atP2) {
+               atBuf2 |= *atP2++;
+             }
+             if (atP3) {
+               atBuf3 |= *atP3++;
+             }
+           }
+           for (x1 = 0, mask = 0x80; x1 < 8 && x < w; ++x1, ++x, mask >>= 1) {
+
+             // build the context
+             cx0 = (buf0 >> 14) & 0x07;
+             cx1 = (buf1 >> 13) & 0x1f;
+             cx2 = (buf2 >> 16) & 0x0f;
+             cx = (cx0 << 13) | (cx1 << 8) | (cx2 << 4) |
+                  (((atBuf0 >> atShift0) & 1) << 3) |
+                  (((atBuf1 >> atShift1) & 1) << 2) |
+                  (((atBuf2 >> atShift2) & 1) << 1) |
+                  ((atBuf3 >> atShift3) & 1);
+
+             // check for a skipped pixel
+             if (!(useSkip && skip->getPixel(x, y))) {
+
+               // decode the pixel
+               if ((pix = arithDecoder->decodeBit(cx, genericRegionStats))) {
+                 *pp |= mask;
+                 buf2 |= 0x8000;
+                 if (aty[0] == 0) {
+                   atBuf0 |= 0x8000;
+                 }
+                 if (aty[1] == 0) {
+                   atBuf1 |= 0x8000;
+                 }
+                 if (aty[2] == 0) {
+                   atBuf2 |= 0x8000;
+                 }
+                 if (aty[3] == 0) {
+                   atBuf3 |= 0x8000;
+                 }
+               }
+             }
+
+             // update the context
+             buf0 <<= 1;
+             buf1 <<= 1;
+             buf2 <<= 1;
+             atBuf0 <<= 1;
+             atBuf1 <<= 1;
+             atBuf2 <<= 1;
+             atBuf3 <<= 1;
+           }
+         }
+
+       } else {
+         // decode the row
+         for (x0 = 0, x = 0; x0 < w; x0 += 8, ++pp) {
+           if (x0 + 8 < w) {
+             if (p0) {
+               buf0 |= *p0++;
+             }
+             if (p1) {
+               buf1 |= *p1++;
+             }
+             buf2 |= *p2++;
+           }
+           for (x1 = 0, mask = 0x80; x1 < 8 && x < w; ++x1, ++x, mask >>= 1) {
+
+             // build the context
+             cx0 = (buf0 >> 14) & 0x07;
+             cx1 = (buf1 >> 13) & 0x1f;
+             cx2 = (buf2 >> 16) & 0x0f;
+             cx = (cx0 << 13) | (cx1 << 8) | (cx2 << 4) |
+                  (bitmap->getPixel(x + atx[0], y + aty[0]) << 3) |
+                  (bitmap->getPixel(x + atx[1], y + aty[1]) << 2) |
+                  (bitmap->getPixel(x + atx[2], y + aty[2]) << 1) |
+                  bitmap->getPixel(x + atx[3], y + aty[3]);
+
+             // check for a skipped pixel
+             if (!(useSkip && skip->getPixel(x, y))) {
+
+               // decode the pixel
+               if ((pix = arithDecoder->decodeBit(cx, genericRegionStats))) {
+                 *pp |= mask;
+                 buf2 |= 0x8000;
+               }
+             }
+
+             // update the context
+             buf0 <<= 1;
+             buf1 <<= 1;
+             buf2 <<= 1;
+           }
+         }
+       }
+       break;
+
+      case 1:
+
+       // set up the context
+       p2 = pp = bitmap->getDataPtr() + y * bitmap->getLineSize();
+       buf2 = *p2++ << 8;
+       if (y >= 1) {
+         p1 = bitmap->getDataPtr() + (y - 1) * bitmap->getLineSize();
+         buf1 = *p1++ << 8;
+         if (y >= 2) {
+           p0 = bitmap->getDataPtr() + (y - 2) * bitmap->getLineSize();
+           buf0 = *p0++ << 8;
+         } else {
+           p0 = NULL;
+           buf0 = 0;
+         }
+       } else {
+         p1 = p0 = NULL;
+         buf1 = buf0 = 0;
+       }
+
+       if (atx[0] >= -8 && atx[0] <= 8) {
+         // set up the adaptive context
+         if (y + aty[0] >= 0) {
+           atP0 = bitmap->getDataPtr() + (y + aty[0]) * bitmap->getLineSize();
+           atBuf0 = *atP0++ << 8;
+         } else {
+           atP0 = NULL;
+           atBuf0 = 0;
+         }
+         atShift0 = 15 - atx[0];
+
+         // decode the row
+         for (x0 = 0, x = 0; x0 < w; x0 += 8, ++pp) {
+           if (x0 + 8 < w) {
+             if (p0) {
+               buf0 |= *p0++;
+             }
+             if (p1) {
+               buf1 |= *p1++;
+             }
+             buf2 |= *p2++;
+             if (atP0) {
+               atBuf0 |= *atP0++;
+             }
+           }
+           for (x1 = 0, mask = 0x80; x1 < 8 && x < w; ++x1, ++x, mask >>= 1) {
+
+             // build the context
+             cx0 = (buf0 >> 13) & 0x0f;
+             cx1 = (buf1 >> 13) & 0x1f;
+             cx2 = (buf2 >> 16) & 0x07;
+             cx = (cx0 << 9) | (cx1 << 4) | (cx2 << 1) |
+                  ((atBuf0 >> atShift0) & 1);
+
+             // check for a skipped pixel
+             if (!(useSkip && skip->getPixel(x, y))) {
+
+               // decode the pixel
+               if ((pix = arithDecoder->decodeBit(cx, genericRegionStats))) {
+                 *pp |= mask;
+                 buf2 |= 0x8000;
+                 if (aty[0] == 0) {
+                   atBuf0 |= 0x8000;
+                 }
+               }
+             }
+
+             // update the context
+             buf0 <<= 1;
+             buf1 <<= 1;
+             buf2 <<= 1;
+             atBuf0 <<= 1;
+           }
+         }
+
+       } else {
+         // decode the row
+         for (x0 = 0, x = 0; x0 < w; x0 += 8, ++pp) {
+           if (x0 + 8 < w) {
+             if (p0) {
+               buf0 |= *p0++;
+             }
+             if (p1) {
+               buf1 |= *p1++;
+             }
+             buf2 |= *p2++;
+           }
+           for (x1 = 0, mask = 0x80; x1 < 8 && x < w; ++x1, ++x, mask >>= 1) {
+
+             // build the context
+             cx0 = (buf0 >> 13) & 0x0f;
+             cx1 = (buf1 >> 13) & 0x1f;
+             cx2 = (buf2 >> 16) & 0x07;
+             cx = (cx0 << 9) | (cx1 << 4) | (cx2 << 1) |
+                  bitmap->getPixel(x + atx[0], y + aty[0]);
+
+             // check for a skipped pixel
+             if (!(useSkip && skip->getPixel(x, y))) {
+
+               // decode the pixel
+               if ((pix = arithDecoder->decodeBit(cx, genericRegionStats))) {
+                 *pp |= mask;
+                 buf2 |= 0x8000;
+               }
+             }
+
+             // update the context
+             buf0 <<= 1;
+             buf1 <<= 1;
+             buf2 <<= 1;
+           }
+         }
+       }
+       break;
+
+      case 2:
+
+       // set up the context
+       p2 = pp = bitmap->getDataPtr() + y * bitmap->getLineSize();
+       buf2 = *p2++ << 8;
+       if (y >= 1) {
+         p1 = bitmap->getDataPtr() + (y - 1) * bitmap->getLineSize();
+         buf1 = *p1++ << 8;
+         if (y >= 2) {
+           p0 = bitmap->getDataPtr() + (y - 2) * bitmap->getLineSize();
+           buf0 = *p0++ << 8;
+         } else {
+           p0 = NULL;
+           buf0 = 0;
+         }
+       } else {
+         p1 = p0 = NULL;
+         buf1 = buf0 = 0;
+       }
+
+       if (atx[0] >= -8 && atx[0] <= 8) {
+         // set up the adaptive context
+         if (y + aty[0] >= 0) {
+           atP0 = bitmap->getDataPtr() + (y + aty[0]) * bitmap->getLineSize();
+           atBuf0 = *atP0++ << 8;
+         } else {
+           atP0 = NULL;
+           atBuf0 = 0;
+         }
+         atShift0 = 15 - atx[0];
+
+         // decode the row
+         for (x0 = 0, x = 0; x0 < w; x0 += 8, ++pp) {
+           if (x0 + 8 < w) {
+             if (p0) {
+               buf0 |= *p0++;
+             }
+             if (p1) {
+               buf1 |= *p1++;
+             }
+             buf2 |= *p2++;
+             if (atP0) {
+               atBuf0 |= *atP0++;
+             }
+           }
+           for (x1 = 0, mask = 0x80; x1 < 8 && x < w; ++x1, ++x, mask >>= 1) {
+
+             // build the context
+             cx0 = (buf0 >> 14) & 0x07;
+             cx1 = (buf1 >> 14) & 0x0f;
+             cx2 = (buf2 >> 16) & 0x03;
+             cx = (cx0 << 7) | (cx1 << 3) | (cx2 << 1) |
+                  ((atBuf0 >> atShift0) & 1);
+
+             // check for a skipped pixel
+             if (!(useSkip && skip->getPixel(x, y))) {
+
+               // decode the pixel
+               if ((pix = arithDecoder->decodeBit(cx, genericRegionStats))) {
+                 *pp |= mask;
+                 buf2 |= 0x8000;
+                 if (aty[0] == 0) {
+                   atBuf0 |= 0x8000;
+                 }
+               }
+             }
+
+             // update the context
+             buf0 <<= 1;
+             buf1 <<= 1;
+             buf2 <<= 1;
+             atBuf0 <<= 1;
+           }
+         }
+
+       } else {
+         // decode the row
+         for (x0 = 0, x = 0; x0 < w; x0 += 8, ++pp) {
+           if (x0 + 8 < w) {
+             if (p0) {
+               buf0 |= *p0++;
+             }
+             if (p1) {
+               buf1 |= *p1++;
+             }
+             buf2 |= *p2++;
+           }
+           for (x1 = 0, mask = 0x80; x1 < 8 && x < w; ++x1, ++x, mask >>= 1) {
+
+             // build the context
+             cx0 = (buf0 >> 14) & 0x07;
+             cx1 = (buf1 >> 14) & 0x0f;
+             cx2 = (buf2 >> 16) & 0x03;
+             cx = (cx0 << 7) | (cx1 << 3) | (cx2 << 1) |
+                  bitmap->getPixel(x + atx[0], y + aty[0]);
+
+             // check for a skipped pixel
+             if (!(useSkip && skip->getPixel(x, y))) {
+
+               // decode the pixel
+               if ((pix = arithDecoder->decodeBit(cx, genericRegionStats))) {
+                 *pp |= mask;
+                 buf2 |= 0x8000;
+               }
+             }
+
+             // update the context
+             buf0 <<= 1;
+             buf1 <<= 1;
+             buf2 <<= 1;
+           }
+         }
+       }
+       break;
+
+      case 3:
+
+       // set up the context
+       p2 = pp = bitmap->getDataPtr() + y * bitmap->getLineSize();
+       buf2 = *p2++ << 8;
+       if (y >= 1) {
+         p1 = bitmap->getDataPtr() + (y - 1) * bitmap->getLineSize();
+         buf1 = *p1++ << 8;
+       } else {
+         p1 = NULL;
+         buf1 = 0;
+       }
+
+       if (atx[0] >= -8 && atx[0] <= 8) {
+         // set up the adaptive context
+         if (y + aty[0] >= 0) {
+           atP0 = bitmap->getDataPtr() + (y + aty[0]) * bitmap->getLineSize();
+           atBuf0 = *atP0++ << 8;
+         } else {
+           atP0 = NULL;
+           atBuf0 = 0;
+         }
+         atShift0 = 15 - atx[0];
+
+         // decode the row
+         for (x0 = 0, x = 0; x0 < w; x0 += 8, ++pp) {
+           if (x0 + 8 < w) {
+             if (p1) {
+               buf1 |= *p1++;
+             }
+             buf2 |= *p2++;
+             if (atP0) {
+               atBuf0 |= *atP0++;
+             }
+           }
+           for (x1 = 0, mask = 0x80; x1 < 8 && x < w; ++x1, ++x, mask >>= 1) {
+
+             // build the context
+             cx1 = (buf1 >> 14) & 0x1f;
+             cx2 = (buf2 >> 16) & 0x0f;
+             cx = (cx1 << 5) | (cx2 << 1) |
+                  ((atBuf0 >> atShift0) & 1);
+
+             // check for a skipped pixel
+             if (!(useSkip && skip->getPixel(x, y))) {
+
+               // decode the pixel
+               if ((pix = arithDecoder->decodeBit(cx, genericRegionStats))) {
+                 *pp |= mask;
+                 buf2 |= 0x8000;
+                 if (aty[0] == 0) {
+                   atBuf0 |= 0x8000;
+                 }
+               }
+             }
+
+             // update the context
+             buf1 <<= 1;
+             buf2 <<= 1;
+             atBuf0 <<= 1;
+           }
+         }
+
+       } else {
+         // decode the row
+         for (x0 = 0, x = 0; x0 < w; x0 += 8, ++pp) {
+           if (x0 + 8 < w) {
+             if (p1) {
+               buf1 |= *p1++;
+             }
+             buf2 |= *p2++;
+           }
+           for (x1 = 0, mask = 0x80; x1 < 8 && x < w; ++x1, ++x, mask >>= 1) {
+
+             // build the context
+             cx1 = (buf1 >> 14) & 0x1f;
+             cx2 = (buf2 >> 16) & 0x0f;
+             cx = (cx1 << 5) | (cx2 << 1) |
+                  bitmap->getPixel(x + atx[0], y + aty[0]);
+
+             // check for a skipped pixel
+             if (!(useSkip && skip->getPixel(x, y))) {
+
+               // decode the pixel
+               if ((pix = arithDecoder->decodeBit(cx, genericRegionStats))) {
+                 *pp |= mask;
+                 buf2 |= 0x8000;
+               }
+             }
+
+             // update the context
+             buf1 <<= 1;
+             buf2 <<= 1;
+           }
+         }
+       }
+       break;
+      }
+    }
+  }
+
+  return bitmap;
+}
+
+void JBIG2Stream::readGenericRefinementRegionSeg(Guint segNum, GBool imm,
+                                                GBool lossless, Guint length,
+                                                Guint *refSegs,
+                                                Guint nRefSegs) {
+  JBIG2Bitmap *bitmap, *refBitmap;
+  Guint w, h, x, y, segInfoFlags, extCombOp;
+  Guint flags, templ, tpgrOn;
+  int atx[2], aty[2];
+  JBIG2Segment *seg;
+
+  // region segment info field
+  if (!readULong(&w) || !readULong(&h) ||
+      !readULong(&x) || !readULong(&y) ||
+      !readUByte(&segInfoFlags)) {
+    goto eofError;
+  }
+  extCombOp = segInfoFlags & 7;
+
+  // rest of the generic refinement region segment header
+  if (!readUByte(&flags)) {
+    goto eofError;
+  }
+  templ = flags & 1;
+  tpgrOn = (flags >> 1) & 1;
+
+  // AT flags
+  if (!templ) {
+    if (!readByte(&atx[0]) || !readByte(&aty[0]) ||
+       !readByte(&atx[1]) || !readByte(&aty[1])) {
+      goto eofError;
+    }
+  }
+
+  // resize the page bitmap if needed
+  if (nRefSegs == 0 || imm) {
+    if (pageH == 0xffffffff && y + h > curPageH) {
+      pageBitmap->expand(y + h, pageDefPixel);
+    }
+  }
+
+  // get referenced bitmap
+  if (nRefSegs > 1) {
+    error(errSyntaxError, curStr->getPos(), "Bad reference in JBIG2 generic refinement segment");
+    return;
+  }
+  if (nRefSegs == 1) {
+    seg = findSegment(refSegs[0]);
+    if (seg == NULL || seg->getType() != jbig2SegBitmap) {
+      error(errSyntaxError, curStr->getPos(), "Bad bitmap reference in JBIG2 generic refinement segment");
+      return;
+    }
+    refBitmap = (JBIG2Bitmap *)seg;
+  } else {
+    refBitmap = pageBitmap->getSlice(x, y, w, h);
+  }
+
+  // set up the arithmetic decoder
+  resetRefinementStats(templ, NULL);
+  arithDecoder->start();
+
+  // read
+  bitmap = readGenericRefinementRegion(w, h, templ, tpgrOn,
+                                      refBitmap, 0, 0, atx, aty);
+
+  // combine the region bitmap into the page bitmap
+  if (imm) {
+    pageBitmap->combine(bitmap, x, y, extCombOp);
+    delete bitmap;
+
+  // store the region bitmap
+  } else {
+    if (bitmap) {
+      bitmap->setSegNum(segNum);
+      segments->append(bitmap);
+    } else {
+      error(errSyntaxError, curStr->getPos(), "readGenericRefinementRegionSeg with null bitmap");
+    }
+  }
+
+  // delete the referenced bitmap
+  if (nRefSegs == 1) {
+    discardSegment(refSegs[0]);
+  } else {
+    delete refBitmap;
+  }
+
+  return;
+
+ eofError:
+  error(errSyntaxError, curStr->getPos(), "Unexpected EOF in JBIG2 stream");
+}
+
+JBIG2Bitmap *JBIG2Stream::readGenericRefinementRegion(int w, int h,
+                                                     int templ, GBool tpgrOn,
+                                                     JBIG2Bitmap *refBitmap,
+                                                     int refDX, int refDY,
+                                                     int *atx, int *aty) {
+  JBIG2Bitmap *bitmap;
+  GBool ltp;
+  Guint ltpCX, cx, cx0, cx2, cx3, cx4, tpgrCX0, tpgrCX1, tpgrCX2;
+  JBIG2BitmapPtr cxPtr0 = {0};
+  JBIG2BitmapPtr cxPtr1 = {0};
+  JBIG2BitmapPtr cxPtr2 = {0};
+  JBIG2BitmapPtr cxPtr3 = {0};
+  JBIG2BitmapPtr cxPtr4 = {0};
+  JBIG2BitmapPtr cxPtr5 = {0};
+  JBIG2BitmapPtr cxPtr6 = {0};
+  JBIG2BitmapPtr tpgrCXPtr0 = {0};
+  JBIG2BitmapPtr tpgrCXPtr1 = {0};
+  JBIG2BitmapPtr tpgrCXPtr2 = {0};
+  int x, y, pix;
+
+  bitmap = new JBIG2Bitmap(0, w, h);
+  if (!bitmap->isOk())
+  {
+    delete bitmap;
+    return NULL;
+  }
+  bitmap->clearToZero();
+
+  // set up the typical row context
+  if (templ) {
+    ltpCX = 0x008;
+  } else {
+    ltpCX = 0x0010;
+  }
+
+  ltp = 0;
+  for (y = 0; y < h; ++y) {
+
+    if (templ) {
+
+      // set up the context
+      bitmap->getPixelPtr(0, y-1, &cxPtr0);
+      cx0 = bitmap->nextPixel(&cxPtr0);
+      bitmap->getPixelPtr(-1, y, &cxPtr1);
+      refBitmap->getPixelPtr(-refDX, y-1-refDY, &cxPtr2);
+      refBitmap->getPixelPtr(-1-refDX, y-refDY, &cxPtr3);
+      cx3 = refBitmap->nextPixel(&cxPtr3);
+      cx3 = (cx3 << 1) | refBitmap->nextPixel(&cxPtr3);
+      refBitmap->getPixelPtr(-refDX, y+1-refDY, &cxPtr4);
+      cx4 = refBitmap->nextPixel(&cxPtr4);
+
+      // set up the typical prediction context
+      tpgrCX0 = tpgrCX1 = tpgrCX2 = 0; // make gcc happy
+      if (tpgrOn) {
+       refBitmap->getPixelPtr(-1-refDX, y-1-refDY, &tpgrCXPtr0);
+       tpgrCX0 = refBitmap->nextPixel(&tpgrCXPtr0);
+       tpgrCX0 = (tpgrCX0 << 1) | refBitmap->nextPixel(&tpgrCXPtr0);
+       tpgrCX0 = (tpgrCX0 << 1) | refBitmap->nextPixel(&tpgrCXPtr0);
+       refBitmap->getPixelPtr(-1-refDX, y-refDY, &tpgrCXPtr1);
+       tpgrCX1 = refBitmap->nextPixel(&tpgrCXPtr1);
+       tpgrCX1 = (tpgrCX1 << 1) | refBitmap->nextPixel(&tpgrCXPtr1);
+       tpgrCX1 = (tpgrCX1 << 1) | refBitmap->nextPixel(&tpgrCXPtr1);
+       refBitmap->getPixelPtr(-1-refDX, y+1-refDY, &tpgrCXPtr2);
+       tpgrCX2 = refBitmap->nextPixel(&tpgrCXPtr2);
+       tpgrCX2 = (tpgrCX2 << 1) | refBitmap->nextPixel(&tpgrCXPtr2);
+       tpgrCX2 = (tpgrCX2 << 1) | refBitmap->nextPixel(&tpgrCXPtr2);
+      } else {
+       tpgrCXPtr0.p = tpgrCXPtr1.p = tpgrCXPtr2.p = NULL; // make gcc happy
+       tpgrCXPtr0.shift = tpgrCXPtr1.shift = tpgrCXPtr2.shift = 0;
+       tpgrCXPtr0.x = tpgrCXPtr1.x = tpgrCXPtr2.x = 0;
+      }
+
+      for (x = 0; x < w; ++x) {
+
+       // update the context
+       cx0 = ((cx0 << 1) | bitmap->nextPixel(&cxPtr0)) & 7;
+       cx3 = ((cx3 << 1) | refBitmap->nextPixel(&cxPtr3)) & 7;
+       cx4 = ((cx4 << 1) | refBitmap->nextPixel(&cxPtr4)) & 3;
+
+       if (tpgrOn) {
+         // update the typical predictor context
+         tpgrCX0 = ((tpgrCX0 << 1) | refBitmap->nextPixel(&tpgrCXPtr0)) & 7;
+         tpgrCX1 = ((tpgrCX1 << 1) | refBitmap->nextPixel(&tpgrCXPtr1)) & 7;
+         tpgrCX2 = ((tpgrCX2 << 1) | refBitmap->nextPixel(&tpgrCXPtr2)) & 7;
+
+         // check for a "typical" pixel
+         if (arithDecoder->decodeBit(ltpCX, refinementRegionStats)) {
+           ltp = !ltp;
+         }
+         if (tpgrCX0 == 0 && tpgrCX1 == 0 && tpgrCX2 == 0) {
+           bitmap->clearPixel(x, y);
+           continue;
+         } else if (tpgrCX0 == 7 && tpgrCX1 == 7 && tpgrCX2 == 7) {
+           bitmap->setPixel(x, y);
+           continue;
+         }
+       }
+
+       // build the context
+       cx = (cx0 << 7) | (bitmap->nextPixel(&cxPtr1) << 6) |
+            (refBitmap->nextPixel(&cxPtr2) << 5) |
+            (cx3 << 2) | cx4;
+
+       // decode the pixel
+       if ((pix = arithDecoder->decodeBit(cx, refinementRegionStats))) {
+         bitmap->setPixel(x, y);
+       }
+      }
+
+    } else {
+
+      // set up the context
+      bitmap->getPixelPtr(0, y-1, &cxPtr0);
+      cx0 = bitmap->nextPixel(&cxPtr0);
+      bitmap->getPixelPtr(-1, y, &cxPtr1);
+      refBitmap->getPixelPtr(-refDX, y-1-refDY, &cxPtr2);
+      cx2 = refBitmap->nextPixel(&cxPtr2);
+      refBitmap->getPixelPtr(-1-refDX, y-refDY, &cxPtr3);
+      cx3 = refBitmap->nextPixel(&cxPtr3);
+      cx3 = (cx3 << 1) | refBitmap->nextPixel(&cxPtr3);
+      refBitmap->getPixelPtr(-1-refDX, y+1-refDY, &cxPtr4);
+      cx4 = refBitmap->nextPixel(&cxPtr4);
+      cx4 = (cx4 << 1) | refBitmap->nextPixel(&cxPtr4);
+      bitmap->getPixelPtr(atx[0], y+aty[0], &cxPtr5);
+      refBitmap->getPixelPtr(atx[1]-refDX, y+aty[1]-refDY, &cxPtr6);
+
+      // set up the typical prediction context
+      tpgrCX0 = tpgrCX1 = tpgrCX2 = 0; // make gcc happy
+      if (tpgrOn) {
+       refBitmap->getPixelPtr(-1-refDX, y-1-refDY, &tpgrCXPtr0);
+       tpgrCX0 = refBitmap->nextPixel(&tpgrCXPtr0);
+       tpgrCX0 = (tpgrCX0 << 1) | refBitmap->nextPixel(&tpgrCXPtr0);
+       tpgrCX0 = (tpgrCX0 << 1) | refBitmap->nextPixel(&tpgrCXPtr0);
+       refBitmap->getPixelPtr(-1-refDX, y-refDY, &tpgrCXPtr1);
+       tpgrCX1 = refBitmap->nextPixel(&tpgrCXPtr1);
+       tpgrCX1 = (tpgrCX1 << 1) | refBitmap->nextPixel(&tpgrCXPtr1);
+       tpgrCX1 = (tpgrCX1 << 1) | refBitmap->nextPixel(&tpgrCXPtr1);
+       refBitmap->getPixelPtr(-1-refDX, y+1-refDY, &tpgrCXPtr2);
+       tpgrCX2 = refBitmap->nextPixel(&tpgrCXPtr2);
+       tpgrCX2 = (tpgrCX2 << 1) | refBitmap->nextPixel(&tpgrCXPtr2);
+       tpgrCX2 = (tpgrCX2 << 1) | refBitmap->nextPixel(&tpgrCXPtr2);
+      } else {
+       tpgrCXPtr0.p = tpgrCXPtr1.p = tpgrCXPtr2.p = NULL; // make gcc happy
+       tpgrCXPtr0.shift = tpgrCXPtr1.shift = tpgrCXPtr2.shift = 0;
+       tpgrCXPtr0.x = tpgrCXPtr1.x = tpgrCXPtr2.x = 0;
+      }
+
+      for (x = 0; x < w; ++x) {
+
+       // update the context
+       cx0 = ((cx0 << 1) | bitmap->nextPixel(&cxPtr0)) & 3;
+       cx2 = ((cx2 << 1) | refBitmap->nextPixel(&cxPtr2)) & 3;
+       cx3 = ((cx3 << 1) | refBitmap->nextPixel(&cxPtr3)) & 7;
+       cx4 = ((cx4 << 1) | refBitmap->nextPixel(&cxPtr4)) & 7;
+
+       if (tpgrOn) {
+         // update the typical predictor context
+         tpgrCX0 = ((tpgrCX0 << 1) | refBitmap->nextPixel(&tpgrCXPtr0)) & 7;
+         tpgrCX1 = ((tpgrCX1 << 1) | refBitmap->nextPixel(&tpgrCXPtr1)) & 7;
+         tpgrCX2 = ((tpgrCX2 << 1) | refBitmap->nextPixel(&tpgrCXPtr2)) & 7;
+
+         // check for a "typical" pixel
+         if (arithDecoder->decodeBit(ltpCX, refinementRegionStats)) {
+           ltp = !ltp;
+         }
+         if (tpgrCX0 == 0 && tpgrCX1 == 0 && tpgrCX2 == 0) {
+           bitmap->clearPixel(x, y);
+           continue;
+         } else if (tpgrCX0 == 7 && tpgrCX1 == 7 && tpgrCX2 == 7) {
+           bitmap->setPixel(x, y);
+           continue;
+         }
+       }
+
+       // build the context
+       cx = (cx0 << 11) | (bitmap->nextPixel(&cxPtr1) << 10) |
+            (cx2 << 8) | (cx3 << 5) | (cx4 << 2) |
+            (bitmap->nextPixel(&cxPtr5) << 1) |
+            refBitmap->nextPixel(&cxPtr6);
+
+       // decode the pixel
+       if ((pix = arithDecoder->decodeBit(cx, refinementRegionStats))) {
+         bitmap->setPixel(x, y);
+       }
+      }
+    }
+  }
+
+  return bitmap;
+}
+
+void JBIG2Stream::readPageInfoSeg(Guint length) {
+  Guint xRes, yRes, flags, striping;
+
+  if (!readULong(&pageW) || !readULong(&pageH) ||
+      !readULong(&xRes) || !readULong(&yRes) ||
+      !readUByte(&flags) || !readUWord(&striping)) {
+    goto eofError;
+  }
+  pageDefPixel = (flags >> 2) & 1;
+  defCombOp = (flags >> 3) & 3;
+
+  // allocate the page bitmap
+  if (pageH == 0xffffffff) {
+    curPageH = striping & 0x7fff;
+  } else {
+    curPageH = pageH;
+  }
+  pageBitmap = new JBIG2Bitmap(0, pageW, curPageH);
+
+  if (!pageBitmap->isOk()) {
+    delete pageBitmap;
+    pageBitmap = NULL;
+    return;
+  }
+  
+  // default pixel value
+  if (pageDefPixel) {
+    pageBitmap->clearToOne();
+  } else {
+    pageBitmap->clearToZero();
+  }
+
+  return;
+
+ eofError:
+  error(errSyntaxError, curStr->getPos(), "Unexpected EOF in JBIG2 stream");
+}
+
+void JBIG2Stream::readEndOfStripeSeg(Guint length) {
+  Guint i;
+
+  // skip the segment
+  for (i = 0; i < length; ++i) {
+    if (curStr->getChar() == EOF) {
+      break;
+    }
+  }
+}
+
+void JBIG2Stream::readProfilesSeg(Guint length) {
+  Guint i;
+
+  // skip the segment
+  for (i = 0; i < length; ++i) {
+    if (curStr->getChar() == EOF) {
+      break;
+    }
+  }
+}
+
+void JBIG2Stream::readCodeTableSeg(Guint segNum, Guint length) {
+  JBIG2HuffmanTable *huffTab;
+  Guint flags, oob, prefixBits, rangeBits;
+  int lowVal, highVal, val;
+  Guint huffTabSize, i;
+
+  if (!readUByte(&flags) || !readLong(&lowVal) || !readLong(&highVal)) {
+    goto eofError;
+  }
+  oob = flags & 1;
+  prefixBits = ((flags >> 1) & 7) + 1;
+  rangeBits = ((flags >> 4) & 7) + 1;
+
+  huffDecoder->reset();
+  huffTabSize = 8;
+  huffTab = (JBIG2HuffmanTable *)
+                gmallocn(huffTabSize, sizeof(JBIG2HuffmanTable));
+  i = 0;
+  val = lowVal;
+  while (val < highVal) {
+    if (i == huffTabSize) {
+      huffTabSize *= 2;
+      huffTab = (JBIG2HuffmanTable *)
+                   greallocn(huffTab, huffTabSize, sizeof(JBIG2HuffmanTable));
+    }
+    huffTab[i].val = val;
+    huffTab[i].prefixLen = huffDecoder->readBits(prefixBits);
+    huffTab[i].rangeLen = huffDecoder->readBits(rangeBits);
+    val += 1 << huffTab[i].rangeLen;
+    ++i;
+  }
+  if (i + oob + 3 > huffTabSize) {
+    huffTabSize = i + oob + 3;
+    huffTab = (JBIG2HuffmanTable *)
+                  greallocn(huffTab, huffTabSize, sizeof(JBIG2HuffmanTable));
+  }
+  huffTab[i].val = lowVal - 1;
+  huffTab[i].prefixLen = huffDecoder->readBits(prefixBits);
+  huffTab[i].rangeLen = jbig2HuffmanLOW;
+  ++i;
+  huffTab[i].val = highVal;
+  huffTab[i].prefixLen = huffDecoder->readBits(prefixBits);
+  huffTab[i].rangeLen = 32;
+  ++i;
+  if (oob) {
+    huffTab[i].val = 0;
+    huffTab[i].prefixLen = huffDecoder->readBits(prefixBits);
+    huffTab[i].rangeLen = jbig2HuffmanOOB;
+    ++i;
+  }
+  huffTab[i].val = 0;
+  huffTab[i].prefixLen = 0;
+  huffTab[i].rangeLen = jbig2HuffmanEOT;
+  huffDecoder->buildTable(huffTab, i);
+
+  // create and store the new table segment
+  segments->append(new JBIG2CodeTable(segNum, huffTab));
+
+  return;
+
+ eofError:
+  error(errSyntaxError, curStr->getPos(), "Unexpected EOF in JBIG2 stream");
+}
+
+void JBIG2Stream::readExtensionSeg(Guint length) {
+  Guint i;
+
+  // skip the segment
+  for (i = 0; i < length; ++i) {
+    if (curStr->getChar() == EOF) {
+      break;
+    }
+  }
+}
+
+JBIG2Segment *JBIG2Stream::findSegment(Guint segNum) {
+  JBIG2Segment *seg;
+  int i;
+
+  for (i = 0; i < globalSegments->getLength(); ++i) {
+    seg = (JBIG2Segment *)globalSegments->get(i);
+    if (seg->getSegNum() == segNum) {
+      return seg;
+    }
+  }
+  for (i = 0; i < segments->getLength(); ++i) {
+    seg = (JBIG2Segment *)segments->get(i);
+    if (seg->getSegNum() == segNum) {
+      return seg;
+    }
+  }
+  return NULL;
+}
+
+void JBIG2Stream::discardSegment(Guint segNum) {
+  JBIG2Segment *seg;
+  int i;
+
+  for (i = 0; i < globalSegments->getLength(); ++i) {
+    seg = (JBIG2Segment *)globalSegments->get(i);
+    if (seg->getSegNum() == segNum) {
+      globalSegments->del(i);
+      return;
+    }
+  }
+  for (i = 0; i < segments->getLength(); ++i) {
+    seg = (JBIG2Segment *)segments->get(i);
+    if (seg->getSegNum() == segNum) {
+      segments->del(i);
+      return;
+    }
+  }
+}
+
+void JBIG2Stream::resetGenericStats(Guint templ,
+                                   JArithmeticDecoderStats *prevStats) {
+  int size;
+
+  size = contextSize[templ];
+  if (prevStats && prevStats->getContextSize() == size) {
+    if (genericRegionStats->getContextSize() == size) {
+      genericRegionStats->copyFrom(prevStats);
+    } else {
+      delete genericRegionStats;
+      genericRegionStats = prevStats->copy();
+    }
+  } else {
+    if (genericRegionStats->getContextSize() == size) {
+      genericRegionStats->reset();
+    } else {
+      delete genericRegionStats;
+      genericRegionStats = new JArithmeticDecoderStats(1 << size);
+    }
+  }
+}
+
+void JBIG2Stream::resetRefinementStats(Guint templ,
+                                      JArithmeticDecoderStats *prevStats) {
+  int size;
+
+  size = refContextSize[templ];
+  if (prevStats && prevStats->getContextSize() == size) {
+    if (refinementRegionStats->getContextSize() == size) {
+      refinementRegionStats->copyFrom(prevStats);
+    } else {
+      delete refinementRegionStats;
+      refinementRegionStats = prevStats->copy();
+    }
+  } else {
+    if (refinementRegionStats->getContextSize() == size) {
+      refinementRegionStats->reset();
+    } else {
+      delete refinementRegionStats;
+      refinementRegionStats = new JArithmeticDecoderStats(1 << size);
+    }
+  }
+}
+
+void JBIG2Stream::resetIntStats(int symCodeLen) {
+  iadhStats->reset();
+  iadwStats->reset();
+  iaexStats->reset();
+  iaaiStats->reset();
+  iadtStats->reset();
+  iaitStats->reset();
+  iafsStats->reset();
+  iadsStats->reset();
+  iardxStats->reset();
+  iardyStats->reset();
+  iardwStats->reset();
+  iardhStats->reset();
+  iariStats->reset();
+  if (iaidStats->getContextSize() == 1 << (symCodeLen + 1)) {
+    iaidStats->reset();
+  } else {
+    delete iaidStats;
+    iaidStats = new JArithmeticDecoderStats(1 << (symCodeLen + 1));
+  }
+}
+
+GBool JBIG2Stream::readUByte(Guint *x) {
+  int c0;
+
+  if ((c0 = curStr->getChar()) == EOF) {
+    return gFalse;
+  }
+  *x = (Guint)c0;
+  return gTrue;
+}
+
+GBool JBIG2Stream::readByte(int *x) {
+ int c0;
+
+  if ((c0 = curStr->getChar()) == EOF) {
+    return gFalse;
+  }
+  *x = c0;
+  if (c0 & 0x80) {
+    *x |= -1 - 0xff;
+  }
+  return gTrue;
+}
+
+GBool JBIG2Stream::readUWord(Guint *x) {
+  int c0, c1;
+
+  if ((c0 = curStr->getChar()) == EOF ||
+      (c1 = curStr->getChar()) == EOF) {
+    return gFalse;
+  }
+  *x = (Guint)((c0 << 8) | c1);
+  return gTrue;
+}
+
+GBool JBIG2Stream::readULong(Guint *x) {
+  int c0, c1, c2, c3;
+
+  if ((c0 = curStr->getChar()) == EOF ||
+      (c1 = curStr->getChar()) == EOF ||
+      (c2 = curStr->getChar()) == EOF ||
+      (c3 = curStr->getChar()) == EOF) {
+    return gFalse;
+  }
+  *x = (Guint)((c0 << 24) | (c1 << 16) | (c2 << 8) | c3);
+  return gTrue;
+}
+
+GBool JBIG2Stream::readLong(int *x) {
+  int c0, c1, c2, c3;
+
+  if ((c0 = curStr->getChar()) == EOF ||
+      (c1 = curStr->getChar()) == EOF ||
+      (c2 = curStr->getChar()) == EOF ||
+      (c3 = curStr->getChar()) == EOF) {
+    return gFalse;
+  }
+  *x = ((c0 << 24) | (c1 << 16) | (c2 << 8) | c3);
+  if (c0 & 0x80) {
+    *x |= -1 - (int)0xffffffff;
+  }
+  return gTrue;
+}
diff --git a/poppler/JBIG2Stream.h b/poppler/JBIG2Stream.h
new file mode 100644 (file)
index 0000000..c518aa5
--- /dev/null
@@ -0,0 +1,164 @@
+//========================================================================
+//
+// JBIG2Stream.h
+//
+// Copyright 2002-2003 Glyph & Cog, LLC
+//
+//========================================================================
+
+//========================================================================
+//
+// Modified under the Poppler project - http://poppler.freedesktop.org
+//
+// All changes made under the Poppler project to this file are licensed
+// under GPL version 2 or later
+//
+// Copyright (C) 2009 David Benjamin <davidben@mit.edu>
+//
+// To see a description of the changes please see the Changelog file that
+// came with your tarball or type make ChangeLog if you are building from git
+//
+//========================================================================
+
+#ifndef JBIG2STREAM_H
+#define JBIG2STREAM_H
+
+#ifdef USE_GCC_PRAGMAS
+#pragma interface
+#endif
+
+#include "goo/gtypes.h"
+#include "Object.h"
+#include "Stream.h"
+
+class GooList;
+class JBIG2Segment;
+class JBIG2Bitmap;
+class JArithmeticDecoder;
+class JArithmeticDecoderStats;
+class JBIG2HuffmanDecoder;
+struct JBIG2HuffmanTable;
+class JBIG2MMRDecoder;
+
+//------------------------------------------------------------------------
+
+class JBIG2Stream: public FilterStream {
+public:
+
+  JBIG2Stream(Stream *strA, Object *globalsStreamA);
+  virtual ~JBIG2Stream();
+  virtual StreamKind getKind() { return strJBIG2; }
+  virtual void reset();
+  virtual void close();
+  virtual int getPos();
+  virtual int getChar();
+  virtual int lookChar();
+  virtual GooString *getPSFilter(int psLevel, const char *indent);
+  virtual GBool isBinary(GBool last = gTrue);
+
+private:
+  virtual GBool hasGetChars() { return true; }
+  virtual int getChars(int nChars, Guchar *buffer);
+
+  void readSegments();
+  GBool readSymbolDictSeg(Guint segNum, Guint length,
+                         Guint *refSegs, Guint nRefSegs);
+  void readTextRegionSeg(Guint segNum, GBool imm,
+                        GBool lossless, Guint length,
+                        Guint *refSegs, Guint nRefSegs);
+  JBIG2Bitmap *readTextRegion(GBool huff, GBool refine,
+                             int w, int h,
+                             Guint numInstances,
+                             Guint logStrips,
+                             int numSyms,
+                             JBIG2HuffmanTable *symCodeTab,
+                             Guint symCodeLen,
+                             JBIG2Bitmap **syms,
+                             Guint defPixel, Guint combOp,
+                             Guint transposed, Guint refCorner,
+                             int sOffset,
+                             JBIG2HuffmanTable *huffFSTable,
+                             JBIG2HuffmanTable *huffDSTable,
+                             JBIG2HuffmanTable *huffDTTable,
+                             JBIG2HuffmanTable *huffRDWTable,
+                             JBIG2HuffmanTable *huffRDHTable,
+                             JBIG2HuffmanTable *huffRDXTable,
+                             JBIG2HuffmanTable *huffRDYTable,
+                             JBIG2HuffmanTable *huffRSizeTable,
+                             Guint templ,
+                             int *atx, int *aty);
+  void readPatternDictSeg(Guint segNum, Guint length);
+  void readHalftoneRegionSeg(Guint segNum, GBool imm,
+                            GBool lossless, Guint length,
+                            Guint *refSegs, Guint nRefSegs);
+  void readGenericRegionSeg(Guint segNum, GBool imm,
+                           GBool lossless, Guint length);
+  void mmrAddPixels(int a1, int blackPixels,
+                   int *codingLine, int *a0i, int w);
+  void mmrAddPixelsNeg(int a1, int blackPixels,
+                      int *codingLine, int *a0i, int w);
+  JBIG2Bitmap *readGenericBitmap(GBool mmr, int w, int h,
+                                int templ, GBool tpgdOn,
+                                GBool useSkip, JBIG2Bitmap *skip,
+                                int *atx, int *aty,
+                                int mmrDataLength);
+  void readGenericRefinementRegionSeg(Guint segNum, GBool imm,
+                                     GBool lossless, Guint length,
+                                     Guint *refSegs,
+                                     Guint nRefSegs);
+  JBIG2Bitmap *readGenericRefinementRegion(int w, int h,
+                                          int templ, GBool tpgrOn,
+                                          JBIG2Bitmap *refBitmap,
+                                          int refDX, int refDY,
+                                          int *atx, int *aty);
+  void readPageInfoSeg(Guint length);
+  void readEndOfStripeSeg(Guint length);
+  void readProfilesSeg(Guint length);
+  void readCodeTableSeg(Guint segNum, Guint length);
+  void readExtensionSeg(Guint length);
+  JBIG2Segment *findSegment(Guint segNum);
+  void discardSegment(Guint segNum);
+  void resetGenericStats(Guint templ,
+                        JArithmeticDecoderStats *prevStats);
+  void resetRefinementStats(Guint templ,
+                           JArithmeticDecoderStats *prevStats);
+  void resetIntStats(int symCodeLen);
+  GBool readUByte(Guint *x);
+  GBool readByte(int *x);
+  GBool readUWord(Guint *x);
+  GBool readULong(Guint *x);
+  GBool readLong(int *x);
+
+  Object globalsStream;
+  Guint pageW, pageH, curPageH;
+  Guint pageDefPixel;
+  JBIG2Bitmap *pageBitmap;
+  Guint defCombOp;
+  GooList *segments;           // [JBIG2Segment]
+  GooList *globalSegments;     // [JBIG2Segment]
+  Stream *curStr;
+  Guchar *dataPtr;
+  Guchar *dataEnd;
+
+  JArithmeticDecoder *arithDecoder;
+  JArithmeticDecoderStats *genericRegionStats;
+  JArithmeticDecoderStats *refinementRegionStats;
+  JArithmeticDecoderStats *iadhStats;
+  JArithmeticDecoderStats *iadwStats;
+  JArithmeticDecoderStats *iaexStats;
+  JArithmeticDecoderStats *iaaiStats;
+  JArithmeticDecoderStats *iadtStats;
+  JArithmeticDecoderStats *iaitStats;
+  JArithmeticDecoderStats *iafsStats;
+  JArithmeticDecoderStats *iadsStats;
+  JArithmeticDecoderStats *iardxStats;
+  JArithmeticDecoderStats *iardyStats;
+  JArithmeticDecoderStats *iardwStats;
+  JArithmeticDecoderStats *iardhStats;
+  JArithmeticDecoderStats *iariStats;
+  JArithmeticDecoderStats *iaidStats;
+  JBIG2HuffmanDecoder *huffDecoder;
+  JBIG2MMRDecoder *mmrDecoder;
+};
+
+#endif
diff --git a/poppler/JPEG2000Stream.cc b/poppler/JPEG2000Stream.cc
new file mode 100644 (file)
index 0000000..e2fd808
--- /dev/null
@@ -0,0 +1,196 @@
+//========================================================================
+//
+// JPEG2000Stream.cc
+//
+// A JPX stream decoder using OpenJPEG
+//
+// Copyright 2008-2010, 2012 Albert Astals Cid <aacid@kde.org>
+// Copyright 2011 Daniel Glöckner <daniel-gl@gmx.net>
+//
+// Licensed under GPLv2 or later
+//
+//========================================================================
+
+#include "JPEG2000Stream.h"
+
+#include "config.h"
+
+JPXStream::JPXStream(Stream *strA) : FilterStream(strA)
+{
+  inited = gFalse;
+  image = NULL;
+  dinfo = NULL;
+  npixels = 0;
+  ncomps = 0;
+}
+
+JPXStream::~JPXStream() {
+  delete str;
+  close();
+}
+
+void JPXStream::reset() {
+  counter = 0;
+  ccounter = 0;
+}
+
+void JPXStream::close() {
+  if (image != NULL) {
+    opj_image_destroy(image);
+    image = NULL;
+    npixels = 0;
+  }
+  if (dinfo != NULL) {
+    opj_destroy_decompress(dinfo);
+    dinfo = NULL;
+  }
+}
+
+int JPXStream::getPos() {
+  return counter * ncomps + ccounter;
+}
+
+int JPXStream::getChars(int nChars, Guchar *buffer) {
+  for (int i = 0; i < nChars; ++i) {
+    const int c = doGetChar();
+    if (likely(c != EOF)) buffer[i] = c;
+    else return i;
+  }
+  return nChars;
+}
+
+int JPXStream::getChar() {
+  return doGetChar();
+}
+
+#define BUFFER_INITIAL_SIZE 4096
+
+void JPXStream::init()
+{
+  Object oLen;
+  if (getDict()) getDict()->lookup("Length", &oLen);
+
+  int bufSize = BUFFER_INITIAL_SIZE;
+  if (oLen.isInt()) bufSize = oLen.getInt();
+  oLen.free();
+
+  
+  int length = 0;
+  unsigned char *buf = str->toUnsignedChars(&length, bufSize);
+  init2(buf, length, CODEC_JP2);
+  free(buf);
+
+  if (image) {
+    npixels = image->comps[0].w * image->comps[0].h;
+    ncomps = image->numcomps;
+    for (int component = 0; component < ncomps; component++) {
+      if (image->comps[component].data == NULL) {
+        close();
+        break;
+      }
+      unsigned char *cdata = (unsigned char *)image->comps[component].data;
+      int adjust = 0;
+      if (image->comps[component].prec > 8)
+       adjust = image->comps[component].prec - 8;
+      int sgndcorr = 0;
+      if (image->comps[component].sgnd)
+       sgndcorr = 1 << (image->comps[0].prec - 1);
+      for (int i = 0; i < npixels; i++) {
+       int r = image->comps[component].data[i];
+       r += sgndcorr;
+       if (adjust) {
+         r = (r >> adjust)+((r >> (adjust-1))%2);
+         if (unlikely(r > 255))
+           r = 255;
+        }
+       *(cdata++) = r;
+      }
+    }
+  } else
+    npixels = 0;
+
+  counter = 0;
+  ccounter = 0;
+  inited = gTrue;
+}
+
+static void libopenjpeg_error_callback(const char *msg, void * /*client_data*/) {
+  error(errSyntaxError, -1, "{0:s}", msg);
+}
+
+static void libopenjpeg_warning_callback(const char *msg, void * /*client_data*/) {
+  error(errSyntaxWarning, -1, "{0:s}", msg);
+}
+
+void JPXStream::init2(unsigned char *buf, int bufLen, OPJ_CODEC_FORMAT format)
+{
+  opj_cio_t *cio = NULL;
+
+  /* Use default decompression parameters */
+  opj_dparameters_t parameters;
+  opj_set_default_decoder_parameters(&parameters);
+#ifdef WITH_OPENJPEG_IGNORE_PCLR_CMAP_CDEF_FLAG
+  parameters.flags = OPJ_DPARAMETERS_IGNORE_PCLR_CMAP_CDEF_FLAG;
+#endif
+
+  /* Configure the event manager to receive errors and warnings */
+  opj_event_mgr_t event_mgr;
+  memset(&event_mgr, 0, sizeof(opj_event_mgr_t));
+  event_mgr.error_handler = libopenjpeg_error_callback;
+  event_mgr.warning_handler = libopenjpeg_warning_callback;
+
+  /* Get the decoder handle of the format */
+  dinfo = opj_create_decompress(format);
+  if (dinfo == NULL) goto error;
+
+  /* Catch events using our callbacks */
+  opj_set_event_mgr((opj_common_ptr)dinfo, &event_mgr, NULL);
+
+  /* Setup the decoder decoding parameters */
+  opj_setup_decoder(dinfo, &parameters);
+
+  /* Open a byte stream */
+  cio = opj_cio_open((opj_common_ptr)dinfo, buf, bufLen);
+  if (cio == NULL) goto error;
+
+  /* Decode the stream and fill the image structure */
+  image = opj_decode(dinfo, cio);
+
+  /* Close the byte stream */
+  opj_cio_close(cio);
+
+  if (image == NULL) goto error;
+  else return;
+
+error:
+  if (format == CODEC_JP2) {
+    error(errSyntaxWarning, -1, "Did no succeed opening JPX Stream as JP2, trying as J2K.");
+    init2(buf, bufLen, CODEC_J2K);
+  } else if (format == CODEC_J2K) {
+    error(errSyntaxWarning, -1, "Did no succeed opening JPX Stream as J2K, trying as JPT.");
+    init2(buf, bufLen, CODEC_JPT);
+  } else {
+    error(errSyntaxError, -1, "Did no succeed opening JPX Stream.");
+  }
+}
+
+int JPXStream::lookChar() {
+  return doLookChar();
+}
+
+GooString *JPXStream::getPSFilter(int psLevel, const char *indent) {
+  return NULL;
+}
+
+GBool JPXStream::isBinary(GBool last) {
+  return str->isBinary(gTrue);
+}
+
+void JPXStream::getImageParams(int *bitsPerComponent, StreamColorSpaceMode *csMode) {
+  if (inited == gFalse) init();
+
+  *bitsPerComponent = 8;
+  if (image && image->numcomps == 3) *csMode = streamCSDeviceRGB;
+  else *csMode = streamCSDeviceGray;
+}
+
diff --git a/poppler/JPEG2000Stream.h b/poppler/JPEG2000Stream.h
new file mode 100644 (file)
index 0000000..5aed32d
--- /dev/null
@@ -0,0 +1,72 @@
+//========================================================================
+//
+// JPEG2000Stream.h
+//
+// A JPX stream decoder using OpenJPEG
+//
+// Copyright 2008, 2010 Albert Astals Cid <aacid@kde.org>
+// Copyright 2011 Daniel Glöckner <daniel-gl@gmx.net>
+//
+// Licensed under GPLv2 or later
+//
+//========================================================================
+
+
+#ifndef JPEG2000STREAM_H
+#define JPEG2000STREAM_H
+
+#include <openjpeg.h>
+
+#include "goo/gtypes.h"
+#include "Object.h"
+#include "Stream.h"
+
+class JPXStream: public FilterStream {
+public:
+
+  JPXStream(Stream *strA);
+  virtual ~JPXStream();
+  virtual StreamKind getKind() { return strJPX; }
+  virtual void reset();
+  virtual void close();
+  virtual int getPos();
+  virtual int getChar();
+  virtual int lookChar();
+  virtual GooString *getPSFilter(int psLevel, const char *indent);
+  virtual GBool isBinary(GBool last = gTrue);
+  virtual void getImageParams(int *bitsPerComponent, StreamColorSpaceMode *csMode);
+
+private:
+  void init();
+  void init2(unsigned char *buf, int bufLen, OPJ_CODEC_FORMAT format);
+
+  virtual GBool hasGetChars() { return true; }
+  virtual int getChars(int nChars, Guchar *buffer);
+
+  inline int doGetChar() {
+    int result = doLookChar();
+    if (++ccounter == ncomps) {
+      ccounter = 0;
+      ++counter;
+    }
+    return result;
+  }
+
+  inline int doLookChar() {
+    if (unlikely(inited == gFalse)) init();
+
+    if (unlikely(counter >= npixels)) return EOF;
+
+    return ((unsigned char *)image->comps[ccounter].data)[counter];
+  }
+
+  opj_image_t *image;
+  opj_dinfo_t *dinfo;
+  int counter;
+  int ccounter;
+  int npixels;
+  int ncomps;
+  GBool inited;
+};
+
+#endif
diff --git a/poppler/JPXStream.cc b/poppler/JPXStream.cc
new file mode 100644 (file)
index 0000000..2cf616d
--- /dev/null
@@ -0,0 +1,3404 @@
+//========================================================================
+//
+// JPXStream.cc
+//
+// Copyright 2002-2003 Glyph & Cog, LLC
+//
+//========================================================================
+
+//========================================================================
+//
+// Modified under the Poppler project - http://poppler.freedesktop.org
+//
+// All changes made under the Poppler project to this file are licensed
+// under GPL version 2 or later
+//
+// Copyright (C) 2008, 2012 Albert Astals Cid <aacid@kde.org>
+//
+// To see a description of the changes please see the Changelog file that
+// came with your tarball or type make ChangeLog if you are building from git
+//
+//========================================================================
+
+#include <config.h>
+
+#ifdef USE_GCC_PRAGMAS
+#pragma implementation
+#endif
+
+#include <limits.h>
+#include "gmem.h"
+#include "Error.h"
+#include "JArithmeticDecoder.h"
+#include "JPXStream.h"
+
+//~ to do:
+//  - precincts
+//  - ROI
+//  - progression order changes
+//  - packed packet headers
+//  - support for palettes, channel maps, etc.
+//  - make sure all needed JP2/JPX subboxes are parsed (readBoxes)
+//  - can we assume that QCC segments must come after the QCD segment?
+//  - handle tilePartToEOC in readTilePartData
+//  - progression orders 2, 3, and 4
+//  - in coefficient decoding (readCodeBlockData):
+//    - selective arithmetic coding bypass
+//      (this also affects reading the cb->dataLen array)
+//    - coeffs longer than 31 bits (should just ignore the extra bits?)
+//  - handle boxes larger than 2^32 bytes
+//  - the fixed-point arithmetic won't handle 16-bit pixels
+
+//------------------------------------------------------------------------
+
+// number of contexts for the arithmetic decoder
+#define jpxNContexts        19
+
+#define jpxContextSigProp    0 // 0 - 8: significance prop and cleanup
+#define jpxContextSign       9 // 9 - 13: sign
+#define jpxContextMagRef    14 // 14 -16: magnitude refinement
+#define jpxContextRunLength 17 // cleanup: run length
+#define jpxContextUniform   18 // cleanup: first signif coeff
+
+//------------------------------------------------------------------------
+
+#define jpxPassSigProp       0
+#define jpxPassMagRef        1
+#define jpxPassCleanup       2
+
+//------------------------------------------------------------------------
+
+// arithmetic decoder context for the significance propagation and
+// cleanup passes:
+//     [horiz][vert][diag][subband]
+// where subband = 0 for HL
+//               = 1 for LH and LL
+//               = 2 for HH
+static const Guint sigPropContext[3][3][5][3] = {
+  {{{ 0, 0, 0 },   // horiz=0, vert=0, diag=0
+    { 1, 1, 3 },   // horiz=0, vert=0, diag=1
+    { 2, 2, 6 },   // horiz=0, vert=0, diag=2
+    { 2, 2, 8 },   // horiz=0, vert=0, diag=3
+    { 2, 2, 8 }},  // horiz=0, vert=0, diag=4
+   {{ 5, 3, 1 },   // horiz=0, vert=1, diag=0
+    { 6, 3, 4 },   // horiz=0, vert=1, diag=1
+    { 6, 3, 7 },   // horiz=0, vert=1, diag=2
+    { 6, 3, 8 },   // horiz=0, vert=1, diag=3
+    { 6, 3, 8 }},  // horiz=0, vert=1, diag=4
+   {{ 8, 4, 2 },   // horiz=0, vert=2, diag=0
+    { 8, 4, 5 },   // horiz=0, vert=2, diag=1
+    { 8, 4, 7 },   // horiz=0, vert=2, diag=2
+    { 8, 4, 8 },   // horiz=0, vert=2, diag=3
+    { 8, 4, 8 }}}, // horiz=0, vert=2, diag=4
+  {{{ 3, 5, 1 },   // horiz=1, vert=0, diag=0
+    { 3, 6, 4 },   // horiz=1, vert=0, diag=1
+    { 3, 6, 7 },   // horiz=1, vert=0, diag=2
+    { 3, 6, 8 },   // horiz=1, vert=0, diag=3
+    { 3, 6, 8 }},  // horiz=1, vert=0, diag=4
+   {{ 7, 7, 2 },   // horiz=1, vert=1, diag=0
+    { 7, 7, 5 },   // horiz=1, vert=1, diag=1
+    { 7, 7, 7 },   // horiz=1, vert=1, diag=2
+    { 7, 7, 8 },   // horiz=1, vert=1, diag=3
+    { 7, 7, 8 }},  // horiz=1, vert=1, diag=4
+   {{ 8, 7, 2 },   // horiz=1, vert=2, diag=0
+    { 8, 7, 5 },   // horiz=1, vert=2, diag=1
+    { 8, 7, 7 },   // horiz=1, vert=2, diag=2
+    { 8, 7, 8 },   // horiz=1, vert=2, diag=3
+    { 8, 7, 8 }}}, // horiz=1, vert=2, diag=4
+  {{{ 4, 8, 2 },   // horiz=2, vert=0, diag=0
+    { 4, 8, 5 },   // horiz=2, vert=0, diag=1
+    { 4, 8, 7 },   // horiz=2, vert=0, diag=2
+    { 4, 8, 8 },   // horiz=2, vert=0, diag=3
+    { 4, 8, 8 }},  // horiz=2, vert=0, diag=4
+   {{ 7, 8, 2 },   // horiz=2, vert=1, diag=0
+    { 7, 8, 5 },   // horiz=2, vert=1, diag=1
+    { 7, 8, 7 },   // horiz=2, vert=1, diag=2
+    { 7, 8, 8 },   // horiz=2, vert=1, diag=3
+    { 7, 8, 8 }},  // horiz=2, vert=1, diag=4
+   {{ 8, 8, 2 },   // horiz=2, vert=2, diag=0
+    { 8, 8, 5 },   // horiz=2, vert=2, diag=1
+    { 8, 8, 7 },   // horiz=2, vert=2, diag=2
+    { 8, 8, 8 },   // horiz=2, vert=2, diag=3
+    { 8, 8, 8 }}}  // horiz=2, vert=2, diag=4
+};
+
+// arithmetic decoder context and xor bit for the sign bit in the
+// significance propagation pass:
+//     [horiz][vert][k]
+// where horiz/vert are offset by 2 (i.e., range is -2 .. 2)
+// and k = 0 for the context
+//       = 1 for the xor bit
+static const Guint signContext[5][5][2] = {
+  {{ 13, 1 },  // horiz=-2, vert=-2
+   { 13, 1 },  // horiz=-2, vert=-1
+   { 12, 1 },  // horiz=-2, vert= 0
+   { 11, 1 },  // horiz=-2, vert=+1
+   { 11, 1 }}, // horiz=-2, vert=+2
+  {{ 13, 1 },  // horiz=-1, vert=-2
+   { 13, 1 },  // horiz=-1, vert=-1
+   { 12, 1 },  // horiz=-1, vert= 0
+   { 11, 1 },  // horiz=-1, vert=+1
+   { 11, 1 }}, // horiz=-1, vert=+2
+  {{ 10, 1 },  // horiz= 0, vert=-2
+   { 10, 1 },  // horiz= 0, vert=-1
+   {  9, 0 },  // horiz= 0, vert= 0
+   { 10, 0 },  // horiz= 0, vert=+1
+   { 10, 0 }}, // horiz= 0, vert=+2
+  {{ 11, 0 },  // horiz=+1, vert=-2
+   { 11, 0 },  // horiz=+1, vert=-1
+   { 12, 0 },  // horiz=+1, vert= 0
+   { 13, 0 },  // horiz=+1, vert=+1
+   { 13, 0 }}, // horiz=+1, vert=+2
+  {{ 11, 0 },  // horiz=+2, vert=-2
+   { 11, 0 },  // horiz=+2, vert=-1
+   { 12, 0 },  // horiz=+2, vert= 0
+   { 13, 0 },  // horiz=+2, vert=+1
+   { 13, 0 }}, // horiz=+2, vert=+2
+};
+
+//------------------------------------------------------------------------
+
+// constants used in the IDWT
+#define idwtAlpha  -1.586134342059924
+#define idwtBeta   -0.052980118572961
+#define idwtGamma   0.882911075530934
+#define idwtDelta   0.443506852043971
+#define idwtKappa   1.230174104914001
+#define idwtIKappa  (1.0 / idwtKappa)
+
+// number of bits to the right of the decimal point for the fixed
+// point arithmetic used in the IDWT
+#define fracBits 16
+
+//------------------------------------------------------------------------
+
+// floor(x / y)
+#define jpxFloorDiv(x, y) ((x) / (y))
+
+// floor(x / 2^y)
+#define jpxFloorDivPow2(x, y) ((x) >> (y))
+
+// ceil(x / y)
+#define jpxCeilDiv(x, y) (((x) + (y) - 1) / (y))
+
+// ceil(x / 2^y)
+#define jpxCeilDivPow2(x, y) (((x) + (1 << (y)) - 1) >> (y))
+
+//------------------------------------------------------------------------
+
+#if 1 //----- disable coverage tracking
+
+#define cover(idx)
+
+#else //----- enable coverage tracking
+
+class JPXCover {
+public:
+
+  JPXCover(int sizeA);
+  ~JPXCover();
+  void incr(int idx);
+
+private:
+
+  int size, used;
+  int *data;
+};
+
+JPXCover::JPXCover(int sizeA) {
+  size = sizeA;
+  used = -1;
+  data = (int *)gmallocn(size, sizeof(int));
+  memset(data, 0, size * sizeof(int));
+}
+
+JPXCover::~JPXCover() {
+  int i;
+
+  printf("JPX coverage:\n");
+  for (i = 0; i <= used; ++i) {
+    printf("  %4d: %8d\n", i, data[i]);
+  }
+  gfree(data);
+}
+
+void JPXCover::incr(int idx) {
+  if (idx < size) {
+    ++data[idx];
+    if (idx > used) {
+      used = idx;
+    }
+  }
+}
+
+JPXCover jpxCover(150);
+
+#define cover(idx) jpxCover.incr(idx)
+
+#endif //----- coverage tracking
+
+//------------------------------------------------------------------------
+
+JPXStream::JPXStream(Stream *strA):
+  FilterStream(strA)
+{
+  bufStr = new BufStream(str, 2);
+
+  nComps = 0;
+  bpc = NULL;
+  width = height = 0;
+  haveCS = gFalse;
+  havePalette = gFalse;
+  haveCompMap = gFalse;
+  haveChannelDefn = gFalse;
+
+  img.tiles = NULL;
+  bitBuf = 0;
+  bitBufLen = 0;
+  bitBufSkip = gFalse;
+  byteCount = 0;
+}
+
+JPXStream::~JPXStream() {
+  close();
+  delete bufStr;
+}
+
+void JPXStream::reset() {
+  bufStr->reset();
+  if (readBoxes()) {
+    curY = img.yOffset;
+  } else {
+    // readBoxes reported an error, so we go immediately to EOF
+    curY = img.ySize;
+  }
+  curX = img.xOffset;
+  curComp = 0;
+  readBufLen = 0;
+}
+
+void JPXStream::close() {
+  JPXTile *tile;
+  JPXTileComp *tileComp;
+  JPXResLevel *resLevel;
+  JPXPrecinct *precinct;
+  JPXSubband *subband;
+  JPXCodeBlock *cb;
+  Guint comp, i, k, r, pre, sb;
+
+  gfree(bpc);
+  bpc = NULL;
+  if (havePalette) {
+    gfree(palette.bpc);
+    gfree(palette.c);
+    havePalette = gFalse;
+  }
+  if (haveCompMap) {
+    gfree(compMap.comp);
+    gfree(compMap.type);
+    gfree(compMap.pComp);
+    haveCompMap = gFalse;
+  }
+  if (haveChannelDefn) {
+    gfree(channelDefn.idx);
+    gfree(channelDefn.type);
+    gfree(channelDefn.assoc);
+    haveChannelDefn = gFalse;
+  }
+
+  if (img.tiles) {
+    for (i = 0; i < img.nXTiles * img.nYTiles; ++i) {
+      tile = &img.tiles[i];
+      if (tile->tileComps) {
+       for (comp = 0; comp < img.nComps; ++comp) {
+         tileComp = &tile->tileComps[comp];
+         gfree(tileComp->quantSteps);
+         gfree(tileComp->data);
+         gfree(tileComp->buf);
+         if (tileComp->resLevels) {
+           for (r = 0; r <= tileComp->nDecompLevels; ++r) {
+             resLevel = &tileComp->resLevels[r];
+             if (resLevel->precincts) {
+               for (pre = 0; pre < 1; ++pre) {
+                 precinct = &resLevel->precincts[pre];
+                 if (precinct->subbands) {
+                   for (sb = 0; sb < (Guint)(r == 0 ? 1 : 3); ++sb) {
+                     subband = &precinct->subbands[sb];
+                     gfree(subband->inclusion);
+                     gfree(subband->zeroBitPlane);
+                     if (subband->cbs) {
+                       for (k = 0; k < subband->nXCBs * subband->nYCBs; ++k) {
+                         cb = &subband->cbs[k];
+                         gfree(cb->dataLen);
+                         gfree(cb->touched);
+                         if (cb->arithDecoder) {
+                           delete cb->arithDecoder;
+                         }
+                         if (cb->stats) {
+                           delete cb->stats;
+                         }
+                       }
+                       gfree(subband->cbs);
+                     }
+                   }
+                   gfree(precinct->subbands);
+                 }
+               }
+               gfree(img.tiles[i].tileComps[comp].resLevels[r].precincts);
+             }
+           }
+           gfree(img.tiles[i].tileComps[comp].resLevels);
+         }
+       }
+       gfree(img.tiles[i].tileComps);
+      }
+    }
+    gfree(img.tiles);
+    img.tiles = NULL;
+  }
+  bufStr->close();
+}
+
+int JPXStream::getChar() {
+  int c;
+
+  if (readBufLen < 8) {
+    fillReadBuf();
+  }
+  if (readBufLen == 8) {
+    c = readBuf & 0xff;
+    readBufLen = 0;
+  } else if (readBufLen > 8) {
+    c = (readBuf >> (readBufLen - 8)) & 0xff;
+    readBufLen -= 8;
+  } else if (readBufLen == 0) {
+    c = EOF;
+  } else {
+    c = (readBuf << (8 - readBufLen)) & 0xff;
+    readBufLen = 0;
+  }
+  return c;
+}
+
+int JPXStream::lookChar() {
+  int c;
+
+  if (readBufLen < 8) {
+    fillReadBuf();
+  }
+  if (readBufLen == 8) {
+    c = readBuf & 0xff;
+  } else if (readBufLen > 8) {
+    c = (readBuf >> (readBufLen - 8)) & 0xff;
+  } else if (readBufLen == 0) {
+    c = EOF;
+  } else {
+    c = (readBuf << (8 - readBufLen)) & 0xff;
+  }
+  return c;
+}
+
+void JPXStream::fillReadBuf() {
+  JPXTileComp *tileComp;
+  Guint tileIdx, tx, ty;
+  int pix, pixBits;
+
+  do {
+    if (curY >= img.ySize) {
+      return;
+    }
+    tileIdx = ((curY - img.yTileOffset) / img.yTileSize) * img.nXTiles
+              + (curX - img.xTileOffset) / img.xTileSize;
+#if 1 //~ ignore the palette, assume the PDF ColorSpace object is valid
+    tileComp = &img.tiles[tileIdx].tileComps[curComp];
+#else
+    tileComp = &img.tiles[tileIdx].tileComps[havePalette ? 0 : curComp];
+#endif
+    tx = jpxCeilDiv((curX - img.xTileOffset) % img.xTileSize, tileComp->hSep);
+    ty = jpxCeilDiv((curY - img.yTileOffset) % img.yTileSize, tileComp->vSep);
+    if (unlikely(ty >= (tileComp->y1 - tileComp->y0))) {
+      error(errSyntaxError, getPos(), "Unexpected ty in fillReadBuf in JPX stream");
+      return;
+    }
+    pix = (int)tileComp->data[ty * (tileComp->x1 - tileComp->x0) + tx];
+    pixBits = tileComp->prec;
+#if 1 //~ ignore the palette, assume the PDF ColorSpace object is valid
+    if (++curComp == img.nComps) {
+#else
+    if (havePalette) {
+      if (pix >= 0 && pix < palette.nEntries) {
+       pix = palette.c[pix * palette.nComps + curComp];
+      } else {
+       pix = 0;
+      }
+      pixBits = palette.bpc[curComp];
+    }
+    if (++curComp == (Guint)(havePalette ? palette.nComps : img.nComps)) {
+#endif
+      curComp = 0;
+      if (++curX == img.xSize) {
+       curX = img.xOffset;
+       ++curY;
+       if (pixBits < 8) {
+         pix <<= 8 - pixBits;
+         pixBits = 8;
+       }
+      }
+    }
+    if (pixBits == 8) {
+      readBuf = (readBuf << 8) | (pix & 0xff);
+    } else {
+      readBuf = (readBuf << pixBits) | (pix & ((1 << pixBits) - 1));
+    }
+    readBufLen += pixBits;
+  } while (readBufLen < 8);
+}
+
+GooString *JPXStream::getPSFilter(int psLevel, const char *indent) {
+  return NULL;
+}
+
+GBool JPXStream::isBinary(GBool last) {
+  return str->isBinary(gTrue);
+}
+
+void JPXStream::getImageParams(int *bitsPerComponent,
+                              StreamColorSpaceMode *csMode) {
+  Guint boxType, boxLen, dataLen, csEnum;
+  Guint bpc1, dummy, i;
+  int csMeth, csPrec, csPrec1, dummy2;
+  StreamColorSpaceMode csMode1;
+  GBool haveBPC, haveCSMode;
+
+  csPrec = 0; // make gcc happy
+  haveBPC = haveCSMode = gFalse;
+  bufStr->reset();
+  if (bufStr->lookChar() == 0xff) {
+    getImageParams2(bitsPerComponent, csMode);
+  } else {
+    while (readBoxHdr(&boxType, &boxLen, &dataLen)) {
+      if (boxType == 0x6a703268) { // JP2 header
+       cover(0);
+       // skip the superbox
+      } else if (boxType == 0x69686472) { // image header
+       cover(1);
+       if (readULong(&dummy) &&
+           readULong(&dummy) &&
+           readUWord(&dummy) &&
+           readUByte(&bpc1) &&
+           readUByte(&dummy) &&
+           readUByte(&dummy) &&
+           readUByte(&dummy)) {
+         *bitsPerComponent = bpc1 + 1;
+         haveBPC = gTrue;
+       }
+      } else if (boxType == 0x636F6C72) { // color specification
+       cover(2);
+       if (readByte(&csMeth) &&
+           readByte(&csPrec1) &&
+           readByte(&dummy2)) {
+         if (csMeth == 1) {
+           if (readULong(&csEnum)) {
+             csMode1 = streamCSNone;
+             if (csEnum == jpxCSBiLevel ||
+                 csEnum == jpxCSGrayscale) {
+               csMode1 = streamCSDeviceGray;
+             } else if (csEnum == jpxCSCMYK) {
+               csMode1 = streamCSDeviceCMYK;
+             } else if (csEnum == jpxCSsRGB ||
+                        csEnum == jpxCSCISesRGB ||
+                        csEnum == jpxCSROMMRGB) {
+               csMode1 = streamCSDeviceRGB;
+             }
+             if (csMode1 != streamCSNone &&
+                 (!haveCSMode || csPrec1 > csPrec)) {
+               *csMode = csMode1;
+               csPrec = csPrec1;
+               haveCSMode = gTrue;
+             }
+             for (i = 0; i < dataLen - 7; ++i) {
+               bufStr->getChar();
+             }
+           }
+         } else {
+           for (i = 0; i < dataLen - 3; ++i) {
+             bufStr->getChar();
+           }
+         }
+       }
+      } else if (boxType == 0x6A703263) { // codestream
+       cover(3);
+       if (!(haveBPC && haveCSMode)) {
+         getImageParams2(bitsPerComponent, csMode);
+       }
+       break;
+      } else {
+       cover(4);
+       for (i = 0; i < dataLen; ++i) {
+         bufStr->getChar();
+       }
+      }
+    }
+  }
+  bufStr->close();
+}
+
+// Get image parameters from the codestream.
+void JPXStream::getImageParams2(int *bitsPerComponent,
+                               StreamColorSpaceMode *csMode) {
+  int segType;
+  Guint segLen, nComps1, bpc1, dummy, i;
+
+  while (readMarkerHdr(&segType, &segLen)) {
+    if (segType == 0x51) { // SIZ - image and tile size
+      cover(5);
+      if (readUWord(&dummy) &&
+         readULong(&dummy) &&
+         readULong(&dummy) &&
+         readULong(&dummy) &&
+         readULong(&dummy) &&
+         readULong(&dummy) &&
+         readULong(&dummy) &&
+         readULong(&dummy) &&
+         readULong(&dummy) &&
+         readUWord(&nComps1) &&
+         readUByte(&bpc1)) {
+       *bitsPerComponent = (bpc1 & 0x7f) + 1;
+       // if there's no color space info, take a guess
+       if (nComps1 == 1) {
+         *csMode = streamCSDeviceGray;
+       } else if (nComps1 == 3) {
+         *csMode = streamCSDeviceRGB;
+       } else if (nComps1 == 4) {
+         *csMode = streamCSDeviceCMYK;
+       }
+      }
+      break;
+    } else {
+      cover(6);
+      if (segLen > 2) {
+       for (i = 0; i < segLen - 2; ++i) {
+         bufStr->getChar();
+       }
+      }
+    }
+  }
+}
+
+GBool JPXStream::readBoxes() {
+  Guint boxType, boxLen, dataLen;
+  Guint bpc1, compression, unknownColorspace, ipr;
+  Guint i, j;
+
+  haveImgHdr = gFalse;
+
+  // check for a naked JPEG 2000 codestream (without the JP2/JPX
+  // wrapper) -- this appears to be a violation of the PDF spec, but
+  // Acrobat allows it
+  if (bufStr->lookChar() == 0xff) {
+    cover(7);
+    error(errSyntaxWarning, getPos(),
+         "Naked JPEG 2000 codestream, missing JP2/JPX wrapper");
+    if (!readCodestream(0)) {
+      return gFalse;
+    }
+    nComps = img.nComps;
+    bpc = (Guint *)gmallocn(nComps, sizeof(Guint));
+    for (i = 0; i < nComps; ++i) {
+      bpc[i] = img.tiles[0].tileComps[i].prec;
+    }
+    width = img.xSize - img.xOffset;
+    height = img.ySize - img.yOffset;
+    return gTrue;
+  }
+
+  while (readBoxHdr(&boxType, &boxLen, &dataLen)) {
+    switch (boxType) {
+    case 0x6a703268:           // JP2 header
+      // this is a grouping box ('superbox') which has no real
+      // contents and doesn't appear to be used consistently, i.e.,
+      // some things which should be subboxes of the JP2 header box
+      // show up outside of it - so we simply ignore the JP2 header
+      // box
+      cover(8);
+      break;
+    case 0x69686472:           // image header
+      cover(9);
+      if (!readULong(&height) ||
+         !readULong(&width) ||
+         !readUWord(&nComps) ||
+         !readUByte(&bpc1) ||
+         !readUByte(&compression) ||
+         !readUByte(&unknownColorspace) ||
+         !readUByte(&ipr)) {
+       error(errSyntaxError, getPos(), "Unexpected EOF in JPX stream");
+       return gFalse;
+      }
+      if (compression != 7) {
+       error(errSyntaxError, getPos(),
+             "Unknown compression type in JPX stream");
+       return gFalse;
+      }
+      bpc = (Guint *)gmallocn(nComps, sizeof(Guint));
+      for (i = 0; i < nComps; ++i) {
+       bpc[i] = bpc1;
+      }
+      haveImgHdr = gTrue;
+      break;
+    case 0x62706363:           // bits per component
+      cover(10);
+      if (!haveImgHdr) {
+       error(errSyntaxError, getPos(),
+             "Found bits per component box before image header box in JPX stream");
+       return gFalse;
+      }
+      if (dataLen != nComps) {
+       error(errSyntaxError, getPos(),
+             "Invalid bits per component box in JPX stream");
+       return gFalse;
+      }
+      for (i = 0; i < nComps; ++i) {
+       if (!readUByte(&bpc[i])) {
+         error(errSyntaxError, getPos(), "Unexpected EOF in JPX stream");
+         return gFalse;
+       }
+      }
+      break;
+    case 0x636F6C72:           // color specification
+      cover(11);
+      if (!readColorSpecBox(dataLen)) {
+       return gFalse;
+      }
+      break;
+    case 0x70636c72:           // palette
+      cover(12);
+      if (!readUWord(&palette.nEntries) ||
+         !readUByte(&palette.nComps)) {
+       error(errSyntaxError, getPos(), "Unexpected EOF in JPX stream");
+       return gFalse;
+      }
+      palette.bpc = (Guint *)gmallocn(palette.nComps, sizeof(Guint));
+      palette.c =
+          (int *)gmallocn(palette.nEntries * palette.nComps, sizeof(int));
+      for (i = 0; i < palette.nComps; ++i) {
+       if (!readUByte(&palette.bpc[i])) {
+         error(errSyntaxError, getPos(), "Unexpected EOF in JPX stream");
+         return gFalse;
+       }
+       ++palette.bpc[i];
+      }
+      for (i = 0; i < palette.nEntries; ++i) {
+       for (j = 0; j < palette.nComps; ++j) {
+         if (!readNBytes(((palette.bpc[j] & 0x7f) + 7) >> 3,
+                         (palette.bpc[j] & 0x80) ? gTrue : gFalse,
+                         &palette.c[i * palette.nComps + j])) {
+           error(errSyntaxError, getPos(), "Unexpected EOF in JPX stream");
+           return gFalse;
+         }
+       }
+      }
+      havePalette = gTrue;
+      break;
+    case 0x636d6170:           // component mapping
+      cover(13);
+      compMap.nChannels = dataLen / 4;
+      compMap.comp = (Guint *)gmallocn(compMap.nChannels, sizeof(Guint));
+      compMap.type = (Guint *)gmallocn(compMap.nChannels, sizeof(Guint));
+      compMap.pComp = (Guint *)gmallocn(compMap.nChannels, sizeof(Guint));
+      for (i = 0; i < compMap.nChannels; ++i) {
+       if (!readUWord(&compMap.comp[i]) ||
+           !readUByte(&compMap.type[i]) ||
+           !readUByte(&compMap.pComp[i])) {
+         error(errSyntaxError, getPos(), "Unexpected EOF in JPX stream");
+         return gFalse;
+       }
+      }
+      haveCompMap = gTrue;
+      break;
+    case 0x63646566:           // channel definition
+      cover(14);
+      if (!readUWord(&channelDefn.nChannels)) {
+       error(errSyntaxError, getPos(), "Unexpected EOF in JPX stream");
+       return gFalse;
+      }
+      channelDefn.idx =
+         (Guint *)gmallocn(channelDefn.nChannels, sizeof(Guint));
+      channelDefn.type =
+         (Guint *)gmallocn(channelDefn.nChannels, sizeof(Guint));
+      channelDefn.assoc =
+         (Guint *)gmallocn(channelDefn.nChannels, sizeof(Guint));
+      for (i = 0; i < channelDefn.nChannels; ++i) {
+       if (!readUWord(&channelDefn.idx[i]) ||
+           !readUWord(&channelDefn.type[i]) ||
+           !readUWord(&channelDefn.assoc[i])) {
+         error(errSyntaxError, getPos(), "Unexpected EOF in JPX stream");
+         return gFalse;
+       }
+      }
+      haveChannelDefn = gTrue;
+      break;
+    case 0x6A703263:           // contiguous codestream
+      cover(15);
+      if (!bpc) {
+       error(errSyntaxError, getPos(),
+             "JPX stream is missing the image header box");
+      }
+      if (!haveCS) {
+       error(errSyntaxError, getPos(),
+             "JPX stream has no supported color spec");
+      }
+      if (!readCodestream(dataLen)) {
+       return gFalse;
+      }
+      break;
+    default:
+      cover(16);
+      for (i = 0; i < dataLen; ++i) {
+       if (bufStr->getChar() == EOF) {
+         error(errSyntaxError, getPos(), "Unexpected EOF in JPX stream");
+         return gFalse;
+       }
+      }
+      break;
+    }
+  }
+  return gTrue;
+}
+
+GBool JPXStream::readColorSpecBox(Guint dataLen) {
+  JPXColorSpec newCS;
+  Guint csApprox, csEnum;
+  Guint i;
+  GBool ok;
+
+  ok = gFalse;
+  if (!readUByte(&newCS.meth) ||
+      !readByte(&newCS.prec) ||
+      !readUByte(&csApprox)) {
+    goto err;
+  }
+  switch (newCS.meth) {
+  case 1:                      // enumerated colorspace
+    cover(17);
+    if (!readULong(&csEnum)) {
+      goto err;
+    }
+    newCS.enumerated.type = (JPXColorSpaceType)csEnum;
+    switch (newCS.enumerated.type) {
+    case jpxCSBiLevel:
+      ok = gTrue;
+      break;
+    case jpxCSYCbCr1:
+      ok = gTrue;
+      break;
+    case jpxCSYCbCr2:
+      ok = gTrue;
+      break;
+    case jpxCSYCBCr3:
+      ok = gTrue;
+      break;
+    case jpxCSPhotoYCC:
+      ok = gTrue;
+      break;
+    case jpxCSCMY:
+      ok = gTrue;
+      break;
+    case jpxCSCMYK:
+      ok = gTrue;
+      break;
+    case jpxCSYCCK:
+      ok = gTrue;
+      break;
+    case jpxCSCIELab:
+      if (dataLen == 7 + 7*4) {
+       if (!readULong(&newCS.enumerated.cieLab.rl) ||
+           !readULong(&newCS.enumerated.cieLab.ol) ||
+           !readULong(&newCS.enumerated.cieLab.ra) ||
+           !readULong(&newCS.enumerated.cieLab.oa) ||
+           !readULong(&newCS.enumerated.cieLab.rb) ||
+           !readULong(&newCS.enumerated.cieLab.ob) ||
+           !readULong(&newCS.enumerated.cieLab.il)) {
+         goto err;
+       }
+      } else if (dataLen == 7) {
+       //~ this assumes the 8-bit case
+       cover(92);
+       newCS.enumerated.cieLab.rl = 100;
+       newCS.enumerated.cieLab.ol = 0;
+       newCS.enumerated.cieLab.ra = 255;
+       newCS.enumerated.cieLab.oa = 128;
+       newCS.enumerated.cieLab.rb = 255;
+       newCS.enumerated.cieLab.ob = 96;
+       newCS.enumerated.cieLab.il = 0x00443530;
+      } else {
+       goto err;
+      }
+      ok = gTrue;
+      break;
+    case jpxCSsRGB:
+      ok = gTrue;
+      break;
+    case jpxCSGrayscale:
+      ok = gTrue;
+      break;
+    case jpxCSBiLevel2:
+      ok = gTrue;
+      break;
+    case jpxCSCIEJab:
+      // not allowed in PDF
+      goto err;
+    case jpxCSCISesRGB:
+      ok = gTrue;
+      break;
+    case jpxCSROMMRGB:
+      ok = gTrue;
+      break;
+    case jpxCSsRGBYCbCr:
+      ok = gTrue;
+      break;
+    case jpxCSYPbPr1125:
+      ok = gTrue;
+      break;
+    case jpxCSYPbPr1250:
+      ok = gTrue;
+      break;
+    default:
+      goto err;
+    }
+    break;
+  case 2:                      // restricted ICC profile
+  case 3:                      // any ICC profile (JPX)
+  case 4:                      // vendor color (JPX)
+    cover(18);
+    for (i = 0; i < dataLen - 3; ++i) {
+      if (bufStr->getChar() == EOF) {
+       goto err;
+      }
+    }
+    break;
+  }
+
+  if (ok && (!haveCS || newCS.prec > cs.prec)) {
+    cs = newCS;
+    haveCS = gTrue;
+  }
+
+  return gTrue;
+
+ err:
+  error(errSyntaxError, getPos(), "Error in JPX color spec");
+  return gFalse;
+}
+
+GBool JPXStream::readCodestream(Guint len) {
+  JPXTile *tile;
+  JPXTileComp *tileComp;
+  int segType;
+  GBool haveSIZ, haveCOD, haveQCD, haveSOT;
+  Guint precinctSize, style;
+  Guint segLen, capabilities, comp, i, j, r;
+
+  //----- main header
+  haveSIZ = haveCOD = haveQCD = haveSOT = gFalse;
+  do {
+    if (!readMarkerHdr(&segType, &segLen)) {
+      error(errSyntaxError, getPos(), "Error in JPX codestream");
+      return gFalse;
+    }
+    switch (segType) {
+    case 0x4f:                 // SOC - start of codestream
+      // marker only
+      cover(19);
+      break;
+    case 0x51:                 // SIZ - image and tile size
+      cover(20);
+      if (haveSIZ) {
+       error(errSyntaxError, getPos(),
+             "Duplicate SIZ marker segment in JPX stream");
+       return gFalse;
+      }
+      if (!readUWord(&capabilities) ||
+         !readULong(&img.xSize) ||
+         !readULong(&img.ySize) ||
+         !readULong(&img.xOffset) ||
+         !readULong(&img.yOffset) ||
+         !readULong(&img.xTileSize) ||
+         !readULong(&img.yTileSize) ||
+         !readULong(&img.xTileOffset) ||
+         !readULong(&img.yTileOffset) ||
+         !readUWord(&img.nComps)) {
+       error(errSyntaxError, getPos(), "Error in JPX SIZ marker segment");
+       return gFalse;
+      }
+      if (haveImgHdr && img.nComps != nComps) {
+       error(errSyntaxError, getPos(),
+             "Different number of components in JPX SIZ marker segment");
+       return gFalse;
+      }
+      if (img.xSize == 0 || img.ySize == 0 ||
+         img.xOffset >= img.xSize || img.yOffset >= img.ySize ||
+         img.xTileSize == 0 || img.yTileSize == 0 ||
+         img.xTileOffset > img.xOffset ||
+         img.yTileOffset > img.yOffset ||
+         img.xTileSize + img.xTileOffset <= img.xOffset ||
+         img.yTileSize + img.yTileOffset <= img.yOffset) {
+       error(errSyntaxError, getPos(), "Error in JPX SIZ marker segment");
+       return gFalse;
+      }
+      img.nXTiles = (img.xSize - img.xTileOffset + img.xTileSize - 1)
+                   / img.xTileSize;
+      img.nYTiles = (img.ySize - img.yTileOffset + img.yTileSize - 1)
+                   / img.yTileSize;
+      // check for overflow before allocating memory
+      if (img.nXTiles <= 0 || img.nYTiles <= 0 ||
+         img.nXTiles >= INT_MAX / img.nYTiles) {
+       error(errSyntaxError, getPos(),
+             "Bad tile count in JPX SIZ marker segment");
+       return gFalse;
+      }
+      img.tiles = (JPXTile *)gmallocn(img.nXTiles * img.nYTiles,
+                                     sizeof(JPXTile));
+      for (i = 0; i < img.nXTiles * img.nYTiles; ++i) {
+       img.tiles[i].init = gFalse;
+       img.tiles[i].tileComps = (JPXTileComp *)gmallocn(img.nComps,
+                                                        sizeof(JPXTileComp));
+       for (comp = 0; comp < img.nComps; ++comp) {
+         img.tiles[i].tileComps[comp].quantSteps = NULL;
+         img.tiles[i].tileComps[comp].data = NULL;
+         img.tiles[i].tileComps[comp].buf = NULL;
+         img.tiles[i].tileComps[comp].resLevels = NULL;
+       }
+      }
+      for (comp = 0; comp < img.nComps; ++comp) {
+       if (!readUByte(&img.tiles[0].tileComps[comp].prec) ||
+           !readUByte(&img.tiles[0].tileComps[comp].hSep) ||
+           !readUByte(&img.tiles[0].tileComps[comp].vSep)) {
+         error(errSyntaxError, getPos(), "Error in JPX SIZ marker segment");
+         return gFalse;
+       }
+       if (img.tiles[0].tileComps[comp].hSep == 0 ||
+           img.tiles[0].tileComps[comp].vSep == 0) {
+         error(errSyntaxError, getPos(), "Error in JPX SIZ marker segment");
+         return gFalse;
+       }
+       img.tiles[0].tileComps[comp].sgned =
+           (img.tiles[0].tileComps[comp].prec & 0x80) ? gTrue : gFalse;
+       img.tiles[0].tileComps[comp].prec =
+           (img.tiles[0].tileComps[comp].prec & 0x7f) + 1;
+       for (i = 1; i < img.nXTiles * img.nYTiles; ++i) {
+         img.tiles[i].tileComps[comp] = img.tiles[0].tileComps[comp];
+       }
+      }
+      haveSIZ = gTrue;
+      break;
+    case 0x52:                 // COD - coding style default
+      cover(21);
+      if (!haveSIZ) {
+       error(errSyntaxError, getPos(),
+             "JPX COD marker segment before SIZ segment");
+       return gFalse;
+      }
+      if (!readUByte(&img.tiles[0].tileComps[0].style) ||
+         !readUByte(&img.tiles[0].progOrder) ||
+         !readUWord(&img.tiles[0].nLayers) ||
+         !readUByte(&img.tiles[0].multiComp) ||
+         !readUByte(&img.tiles[0].tileComps[0].nDecompLevels) ||
+         !readUByte(&img.tiles[0].tileComps[0].codeBlockW) ||
+         !readUByte(&img.tiles[0].tileComps[0].codeBlockH) ||
+         !readUByte(&img.tiles[0].tileComps[0].codeBlockStyle) ||
+         !readUByte(&img.tiles[0].tileComps[0].transform)) {
+       error(errSyntaxError, getPos(), "Error in JPX COD marker segment");
+       return gFalse;
+      }
+      if (img.tiles[0].tileComps[0].nDecompLevels > 32 ||
+         img.tiles[0].tileComps[0].codeBlockW > 8 ||
+         img.tiles[0].tileComps[0].codeBlockH > 8) {
+       error(errSyntaxError, getPos(), "Error in JPX COD marker segment");
+       return gFalse;
+      }
+      img.tiles[0].tileComps[0].codeBlockW += 2;
+      img.tiles[0].tileComps[0].codeBlockH += 2;
+      for (i = 0; i < img.nXTiles * img.nYTiles; ++i) {
+       if (i != 0) {
+         img.tiles[i].progOrder = img.tiles[0].progOrder;
+         img.tiles[i].nLayers = img.tiles[0].nLayers;
+         img.tiles[i].multiComp = img.tiles[0].multiComp;
+       }
+       for (comp = 0; comp < img.nComps; ++comp) {
+         if (!(i == 0 && comp == 0)) {
+           img.tiles[i].tileComps[comp].style =
+               img.tiles[0].tileComps[0].style;
+           img.tiles[i].tileComps[comp].nDecompLevels =
+               img.tiles[0].tileComps[0].nDecompLevels;
+           img.tiles[i].tileComps[comp].codeBlockW =
+               img.tiles[0].tileComps[0].codeBlockW;
+           img.tiles[i].tileComps[comp].codeBlockH =
+               img.tiles[0].tileComps[0].codeBlockH;
+           img.tiles[i].tileComps[comp].codeBlockStyle =
+               img.tiles[0].tileComps[0].codeBlockStyle;
+           img.tiles[i].tileComps[comp].transform =
+               img.tiles[0].tileComps[0].transform;
+         }
+         img.tiles[i].tileComps[comp].resLevels =
+             (JPXResLevel *)gmallocn(
+                    (img.tiles[i].tileComps[comp].nDecompLevels + 1),
+                    sizeof(JPXResLevel));
+         for (r = 0; r <= img.tiles[i].tileComps[comp].nDecompLevels; ++r) {
+           img.tiles[i].tileComps[comp].resLevels[r].precincts = NULL;
+         }
+       }
+      }
+      for (r = 0; r <= img.tiles[0].tileComps[0].nDecompLevels; ++r) {
+       if (img.tiles[0].tileComps[0].style & 0x01) {
+         cover(91);
+         if (!readUByte(&precinctSize)) {
+           error(errSyntaxError, getPos(), "Error in JPX COD marker segment");
+           return gFalse;
+         }
+         img.tiles[0].tileComps[0].resLevels[r].precinctWidth =
+             precinctSize & 0x0f;
+         img.tiles[0].tileComps[0].resLevels[r].precinctHeight =
+             (precinctSize >> 4) & 0x0f;
+       } else {
+         img.tiles[0].tileComps[0].resLevels[r].precinctWidth = 15;
+         img.tiles[0].tileComps[0].resLevels[r].precinctHeight = 15;
+       }
+      }
+      for (i = 0; i < img.nXTiles * img.nYTiles; ++i) {
+       for (comp = 0; comp < img.nComps; ++comp) {
+         if (!(i == 0 && comp == 0)) {
+           for (r = 0; r <= img.tiles[i].tileComps[comp].nDecompLevels; ++r) {
+             img.tiles[i].tileComps[comp].resLevels[r].precinctWidth =
+                 img.tiles[0].tileComps[0].resLevels[r].precinctWidth;
+             img.tiles[i].tileComps[comp].resLevels[r].precinctHeight =
+                 img.tiles[0].tileComps[0].resLevels[r].precinctHeight;
+           }
+         }
+       }
+      }
+      haveCOD = gTrue;
+      break;
+    case 0x53:                 // COC - coding style component
+      cover(22);
+      if (!haveCOD) {
+       error(errSyntaxError, getPos(),
+             "JPX COC marker segment before COD segment");
+       return gFalse;
+      }
+      if ((img.nComps > 256 && !readUWord(&comp)) ||
+         (img.nComps <= 256 && !readUByte(&comp)) ||
+         comp >= img.nComps ||
+         !readUByte(&style) ||
+         !readUByte(&img.tiles[0].tileComps[comp].nDecompLevels) ||
+         !readUByte(&img.tiles[0].tileComps[comp].codeBlockW) ||
+         !readUByte(&img.tiles[0].tileComps[comp].codeBlockH) ||
+         !readUByte(&img.tiles[0].tileComps[comp].codeBlockStyle) ||
+         !readUByte(&img.tiles[0].tileComps[comp].transform)) {
+       error(errSyntaxError, getPos(), "Error in JPX COC marker segment");
+       return gFalse;
+      }
+      if (img.tiles[0].tileComps[comp].nDecompLevels > 32 ||
+         img.tiles[0].tileComps[comp].codeBlockW > 8 ||
+         img.tiles[0].tileComps[comp].codeBlockH > 8) {
+       error(errSyntaxError, getPos(), "Error in JPX COC marker segment");
+       return gFalse;
+      }
+      img.tiles[0].tileComps[comp].style =
+         (img.tiles[0].tileComps[comp].style & ~1) | (style & 1);
+      img.tiles[0].tileComps[comp].codeBlockW += 2;
+      img.tiles[0].tileComps[comp].codeBlockH += 2;
+      for (i = 0; i < img.nXTiles * img.nYTiles; ++i) {
+       if (i != 0) {
+         img.tiles[i].tileComps[comp].style =
+             img.tiles[0].tileComps[comp].style;
+         img.tiles[i].tileComps[comp].nDecompLevels =
+             img.tiles[0].tileComps[comp].nDecompLevels;
+         img.tiles[i].tileComps[comp].codeBlockW =
+             img.tiles[0].tileComps[comp].codeBlockW;
+         img.tiles[i].tileComps[comp].codeBlockH =
+             img.tiles[0].tileComps[comp].codeBlockH;
+         img.tiles[i].tileComps[comp].codeBlockStyle =
+             img.tiles[0].tileComps[comp].codeBlockStyle;
+         img.tiles[i].tileComps[comp].transform =
+             img.tiles[0].tileComps[comp].transform;
+       }
+       img.tiles[i].tileComps[comp].resLevels =
+           (JPXResLevel *)greallocn(
+                    img.tiles[i].tileComps[comp].resLevels,
+                    (img.tiles[i].tileComps[comp].nDecompLevels + 1),
+                    sizeof(JPXResLevel));
+       for (r = 0; r <= img.tiles[i].tileComps[comp].nDecompLevels; ++r) {
+         img.tiles[i].tileComps[comp].resLevels[r].precincts = NULL;
+       }
+      }
+      for (r = 0; r <= img.tiles[0].tileComps[comp].nDecompLevels; ++r) {
+       if (img.tiles[0].tileComps[comp].style & 0x01) {
+         if (!readUByte(&precinctSize)) {
+           error(errSyntaxError, getPos(), "Error in JPX COD marker segment");
+           return gFalse;
+         }
+         img.tiles[0].tileComps[comp].resLevels[r].precinctWidth =
+             precinctSize & 0x0f;
+         img.tiles[0].tileComps[comp].resLevels[r].precinctHeight =
+             (precinctSize >> 4) & 0x0f;
+       } else {
+         img.tiles[0].tileComps[comp].resLevels[r].precinctWidth = 15;
+         img.tiles[0].tileComps[comp].resLevels[r].precinctHeight = 15;
+       }
+      }
+      for (i = 1; i < img.nXTiles * img.nYTiles; ++i) {
+       for (r = 0; r <= img.tiles[i].tileComps[comp].nDecompLevels; ++r) {
+         img.tiles[i].tileComps[comp].resLevels[r].precinctWidth =
+             img.tiles[0].tileComps[comp].resLevels[r].precinctWidth;
+         img.tiles[i].tileComps[comp].resLevels[r].precinctHeight =
+             img.tiles[0].tileComps[comp].resLevels[r].precinctHeight;
+       }
+      }
+      break;
+    case 0x5c:                 // QCD - quantization default
+      cover(23);
+      if (!haveSIZ) {
+       error(errSyntaxError, getPos(),
+             "JPX QCD marker segment before SIZ segment");
+       return gFalse;
+      }
+      if (!readUByte(&img.tiles[0].tileComps[0].quantStyle)) {
+       error(errSyntaxError, getPos(), "Error in JPX QCD marker segment");
+       return gFalse;
+      }
+      if ((img.tiles[0].tileComps[0].quantStyle & 0x1f) == 0x00) {
+       if (segLen <= 3) {
+         error(errSyntaxError, getPos(), "Error in JPX QCD marker segment");
+         return gFalse;
+       }
+       img.tiles[0].tileComps[0].nQuantSteps = segLen - 3;
+       img.tiles[0].tileComps[0].quantSteps =
+           (Guint *)greallocn(img.tiles[0].tileComps[0].quantSteps,
+                              img.tiles[0].tileComps[0].nQuantSteps,
+                              sizeof(Guint));
+       for (i = 0; i < img.tiles[0].tileComps[0].nQuantSteps; ++i) {
+         if (!readUByte(&img.tiles[0].tileComps[0].quantSteps[i])) {
+           error(errSyntaxError, getPos(), "Error in JPX QCD marker segment");
+           return gFalse;
+         }
+       }
+      } else if ((img.tiles[0].tileComps[0].quantStyle & 0x1f) == 0x01) {
+       img.tiles[0].tileComps[0].nQuantSteps = 1;
+       img.tiles[0].tileComps[0].quantSteps =
+           (Guint *)greallocn(img.tiles[0].tileComps[0].quantSteps,
+                              img.tiles[0].tileComps[0].nQuantSteps,
+                              sizeof(Guint));
+       if (!readUWord(&img.tiles[0].tileComps[0].quantSteps[0])) {
+         error(errSyntaxError, getPos(), "Error in JPX QCD marker segment");
+         return gFalse;
+       }
+      } else if ((img.tiles[0].tileComps[0].quantStyle & 0x1f) == 0x02) {
+       if (segLen < 5) {
+         error(errSyntaxError, getPos(), "Error in JPX QCD marker segment");
+         return gFalse;
+       }
+       img.tiles[0].tileComps[0].nQuantSteps = (segLen - 3) / 2;
+       img.tiles[0].tileComps[0].quantSteps =
+           (Guint *)greallocn(img.tiles[0].tileComps[0].quantSteps,
+                              img.tiles[0].tileComps[0].nQuantSteps,
+                              sizeof(Guint));
+       for (i = 0; i < img.tiles[0].tileComps[0].nQuantSteps; ++i) {
+         if (!readUWord(&img.tiles[0].tileComps[0].quantSteps[i])) {
+           error(errSyntaxError, getPos(), "Error in JPX QCD marker segment");
+           return gFalse;
+         }
+       }
+      } else {
+       error(errSyntaxError, getPos(), "Error in JPX QCD marker segment");
+       return gFalse;
+      }
+      for (i = 0; i < img.nXTiles * img.nYTiles; ++i) {
+       for (comp = 0; comp < img.nComps; ++comp) {
+         if (!(i == 0 && comp == 0)) {
+           img.tiles[i].tileComps[comp].quantStyle =
+               img.tiles[0].tileComps[0].quantStyle;
+           img.tiles[i].tileComps[comp].nQuantSteps =
+               img.tiles[0].tileComps[0].nQuantSteps;
+           img.tiles[i].tileComps[comp].quantSteps = 
+               (Guint *)greallocn(img.tiles[i].tileComps[comp].quantSteps,
+                                  img.tiles[0].tileComps[0].nQuantSteps,
+                                  sizeof(Guint));
+           for (j = 0; j < img.tiles[0].tileComps[0].nQuantSteps; ++j) {
+             img.tiles[i].tileComps[comp].quantSteps[j] =
+                 img.tiles[0].tileComps[0].quantSteps[j];
+           }
+         }
+       }
+      }
+      haveQCD = gTrue;
+      break;
+    case 0x5d:                 // QCC - quantization component
+      cover(24);
+      if (!haveQCD) {
+       error(errSyntaxError, getPos(),
+             "JPX QCC marker segment before QCD segment");
+       return gFalse;
+      }
+      if ((img.nComps > 256 && !readUWord(&comp)) ||
+         (img.nComps <= 256 && !readUByte(&comp)) ||
+         comp >= img.nComps ||
+         !readUByte(&img.tiles[0].tileComps[comp].quantStyle)) {
+       error(errSyntaxError, getPos(), "Error in JPX QCC marker segment");
+       return gFalse;
+      }
+      if ((img.tiles[0].tileComps[comp].quantStyle & 0x1f) == 0x00) {
+       if (segLen <= (img.nComps > 256 ? 5U : 4U)) {
+         error(errSyntaxError, getPos(), "Error in JPX QCC marker segment");
+         return gFalse;
+       }
+       img.tiles[0].tileComps[comp].nQuantSteps =
+           segLen - (img.nComps > 256 ? 5 : 4);
+       img.tiles[0].tileComps[comp].quantSteps =
+           (Guint *)greallocn(img.tiles[0].tileComps[comp].quantSteps,
+                              img.tiles[0].tileComps[comp].nQuantSteps,
+                              sizeof(Guint));
+       for (i = 0; i < img.tiles[0].tileComps[comp].nQuantSteps; ++i) {
+         if (!readUByte(&img.tiles[0].tileComps[comp].quantSteps[i])) {
+           error(errSyntaxError, getPos(), "Error in JPX QCC marker segment");
+           return gFalse;
+         }
+       }
+      } else if ((img.tiles[0].tileComps[comp].quantStyle & 0x1f) == 0x01) {
+       img.tiles[0].tileComps[comp].nQuantSteps = 1;
+       img.tiles[0].tileComps[comp].quantSteps =
+           (Guint *)greallocn(img.tiles[0].tileComps[comp].quantSteps,
+                              img.tiles[0].tileComps[comp].nQuantSteps,
+                              sizeof(Guint));
+       if (!readUWord(&img.tiles[0].tileComps[comp].quantSteps[0])) {
+         error(errSyntaxError, getPos(), "Error in JPX QCC marker segment");
+         return gFalse;
+       }
+      } else if ((img.tiles[0].tileComps[comp].quantStyle & 0x1f) == 0x02) {
+       if (segLen < (img.nComps > 256 ? 5U : 4U) + 2) {
+         error(errSyntaxError, getPos(), "Error in JPX QCC marker segment");
+         return gFalse;
+       }
+       img.tiles[0].tileComps[comp].nQuantSteps =
+           (segLen - (img.nComps > 256 ? 5 : 4)) / 2;
+       img.tiles[0].tileComps[comp].quantSteps =
+           (Guint *)greallocn(img.tiles[0].tileComps[comp].quantSteps,
+                              img.tiles[0].tileComps[comp].nQuantSteps,
+                              sizeof(Guint));
+       for (i = 0; i < img.tiles[0].tileComps[comp].nQuantSteps; ++i) {
+         if (!readUWord(&img.tiles[0].tileComps[comp].quantSteps[i])) {
+           error(errSyntaxError, getPos(), "Error in JPX QCD marker segment");
+           return gFalse;
+         }
+       }
+      } else {
+       error(errSyntaxError, getPos(), "Error in JPX QCC marker segment");
+       return gFalse;
+      }
+      for (i = 1; i < img.nXTiles * img.nYTiles; ++i) {
+       img.tiles[i].tileComps[comp].quantStyle =
+           img.tiles[0].tileComps[comp].quantStyle;
+       img.tiles[i].tileComps[comp].nQuantSteps =
+           img.tiles[0].tileComps[comp].nQuantSteps;
+       img.tiles[i].tileComps[comp].quantSteps = 
+           (Guint *)greallocn(img.tiles[i].tileComps[comp].quantSteps,
+                              img.tiles[0].tileComps[comp].nQuantSteps,
+                              sizeof(Guint));
+       for (j = 0; j < img.tiles[0].tileComps[comp].nQuantSteps; ++j) {
+         img.tiles[i].tileComps[comp].quantSteps[j] =
+             img.tiles[0].tileComps[comp].quantSteps[j];
+       }
+      }
+      break;
+    case 0x5e:                 // RGN - region of interest
+      cover(25);
+#if 1 //~ ROI is unimplemented
+      error(errUnimplemented, -1, "got a JPX RGN segment");
+      for (i = 0; i < segLen - 2; ++i) {
+       if (bufStr->getChar() == EOF) {
+         error(errSyntaxError, getPos(), "Error in JPX RGN marker segment");
+         return gFalse;
+       }
+      }
+#else
+      if ((img.nComps > 256 && !readUWord(&comp)) ||
+         (img.nComps <= 256 && !readUByte(&comp)) ||
+         comp >= img.nComps ||
+         !readUByte(&compInfo[comp].defROI.style) ||
+         !readUByte(&compInfo[comp].defROI.shift)) {
+       error(errSyntaxError, getPos(), "Error in JPX RGN marker segment");
+       return gFalse;
+      }
+#endif
+      break;
+    case 0x5f:                 // POC - progression order change
+      cover(26);
+#if 1 //~ progression order changes are unimplemented
+      error(errUnimplemented, -1, "got a JPX POC segment");
+      for (i = 0; i < segLen - 2; ++i) {
+       if (bufStr->getChar() == EOF) {
+         error(errSyntaxError, getPos(), "Error in JPX POC marker segment");
+         return gFalse;
+       }
+      }
+#else
+      nProgs = (segLen - 2) / (img.nComps > 256 ? 9 : 7);
+      progs = (JPXProgOrder *)gmallocn(nProgs, sizeof(JPXProgOrder));
+      for (i = 0; i < nProgs; ++i) {
+       if (!readUByte(&progs[i].startRes) ||
+           !(img.nComps > 256 && readUWord(&progs[i].startComp)) ||
+           !(img.nComps <= 256 && readUByte(&progs[i].startComp)) ||
+           !readUWord(&progs[i].endLayer) ||
+           !readUByte(&progs[i].endRes) ||
+           !(img.nComps > 256 && readUWord(&progs[i].endComp)) ||
+           !(img.nComps <= 256 && readUByte(&progs[i].endComp)) ||
+           !readUByte(&progs[i].progOrder)) {
+         error(errSyntaxError, getPos(), "Error in JPX POC marker segment");
+         return gFalse;
+       }
+      }
+#endif
+      break;
+    case 0x60:                 // PPM - packed packet headers, main header
+      cover(27);
+#if 1 //~ packed packet headers are unimplemented
+      error(errUnimplemented, -1, "Got a JPX PPM segment");
+      for (i = 0; i < segLen - 2; ++i) {
+       if (bufStr->getChar() == EOF) {
+         error(errSyntaxError, getPos(), "Error in JPX PPM marker segment");
+         return gFalse;
+       }
+      }
+#endif
+      break;
+    case 0x55:                 // TLM - tile-part lengths
+      // skipped
+      cover(28);
+      for (i = 0; i < segLen - 2; ++i) {
+       if (bufStr->getChar() == EOF) {
+         error(errSyntaxError, getPos(), "Error in JPX TLM marker segment");
+         return gFalse;
+       }
+      }
+      break;
+    case 0x57:                 // PLM - packet length, main header
+      // skipped
+      cover(29);
+      for (i = 0; i < segLen - 2; ++i) {
+       if (bufStr->getChar() == EOF) {
+         error(errSyntaxError, getPos(), "Error in JPX PLM marker segment");
+         return gFalse;
+       }
+      }
+      break;
+    case 0x63:                 // CRG - component registration
+      // skipped
+      cover(30);
+      for (i = 0; i < segLen - 2; ++i) {
+       if (bufStr->getChar() == EOF) {
+         error(errSyntaxError, getPos(), "Error in JPX CRG marker segment");
+         return gFalse;
+       }
+      }
+      break;
+    case 0x64:                 // COM - comment
+      // skipped
+      cover(31);
+      for (i = 0; i < segLen - 2; ++i) {
+       if (bufStr->getChar() == EOF) {
+         error(errSyntaxError, getPos(), "Error in JPX COM marker segment");
+         return gFalse;
+       }
+      }
+      break;
+    case 0x90:                 // SOT - start of tile
+      cover(32);
+      haveSOT = gTrue;
+      break;
+    default:
+      cover(33);
+      error(errSyntaxError, getPos(),
+           "Unknown marker segment {0:02x} in JPX stream", segType);
+      for (i = 0; i < segLen - 2; ++i) {
+       if (bufStr->getChar() == EOF) {
+         break;
+       }
+      }
+      break;
+    }
+  } while (!haveSOT);
+
+  if (!haveSIZ) {
+    error(errSyntaxError, getPos(),
+         "Missing SIZ marker segment in JPX stream");
+    return gFalse;
+  }
+  if (!haveCOD) {
+    error(errSyntaxError, getPos(),
+         "Missing COD marker segment in JPX stream");
+    return gFalse;
+  }
+  if (!haveQCD) {
+    error(errSyntaxError, getPos(),
+         "Missing QCD marker segment in JPX stream");
+    return gFalse;
+  }
+
+  //----- read the tile-parts
+  while (1) {
+    if (!readTilePart()) {
+      return gFalse;
+    }
+    if (!readMarkerHdr(&segType, &segLen)) {
+      error(errSyntaxError, getPos(), "Error in JPX codestream");
+      return gFalse;
+    }
+    if (segType != 0x90) {     // SOT - start of tile
+      break;
+    }
+  }
+
+  if (segType != 0xd9) {       // EOC - end of codestream
+    error(errSyntaxError, getPos(), "Missing EOC marker in JPX codestream");
+    return gFalse;
+  }
+
+  //----- finish decoding the image
+  for (i = 0; i < img.nXTiles * img.nYTiles; ++i) {
+    tile = &img.tiles[i];
+    if (!tile->init) {
+      error(errSyntaxError, getPos(), "Uninitialized tile in JPX codestream");
+      return gFalse;
+    }
+    for (comp = 0; comp < img.nComps; ++comp) {
+      tileComp = &tile->tileComps[comp];
+      inverseTransform(tileComp);
+    }
+    if (!inverseMultiCompAndDC(tile)) {
+      return gFalse;
+    }
+  }
+
+  //~ can free memory below tileComps here, and also tileComp.buf
+
+  return gTrue;
+}
+
+GBool JPXStream::readTilePart() {
+  JPXTile *tile;
+  JPXTileComp *tileComp;
+  JPXResLevel *resLevel;
+  JPXPrecinct *precinct;
+  JPXSubband *subband;
+  JPXCodeBlock *cb;
+  int *sbCoeffs;
+  GBool haveSOD;
+  Guint tileIdx, tilePartLen, tilePartIdx, nTileParts;
+  GBool tilePartToEOC;
+  Guint precinctSize, style;
+  Guint n, nSBs, nx, ny, sbx0, sby0, comp, segLen;
+  Guint i, j, k, cbX, cbY, r, pre, sb, cbi, cbj;
+  int segType, level;
+
+  // process the SOT marker segment
+  if (!readUWord(&tileIdx) ||
+      !readULong(&tilePartLen) ||
+      !readUByte(&tilePartIdx) ||
+      !readUByte(&nTileParts)) {
+    error(errSyntaxError, getPos(), "Error in JPX SOT marker segment");
+    return gFalse;
+  }
+
+  if ((tilePartIdx > 0 && !img.tiles[tileIdx].init) ||
+      tileIdx >= img.nXTiles * img.nYTiles) {
+    error(errSyntaxError, getPos(), "Weird tile index in JPX stream");
+    return gFalse;
+  }
+
+  tilePartToEOC = tilePartLen == 0;
+  tilePartLen -= 12; // subtract size of SOT segment
+
+  haveSOD = gFalse;
+  do {
+    if (!readMarkerHdr(&segType, &segLen)) {
+      error(errSyntaxError, getPos(), "Error in JPX tile-part codestream");
+      return gFalse;
+    }
+    tilePartLen -= 2 + segLen;
+    switch (segType) {
+    case 0x52:                 // COD - coding style default
+      cover(34);
+      if (!readUByte(&img.tiles[tileIdx].tileComps[0].style) ||
+         !readUByte(&img.tiles[tileIdx].progOrder) ||
+         !readUWord(&img.tiles[tileIdx].nLayers) ||
+         !readUByte(&img.tiles[tileIdx].multiComp) ||
+         !readUByte(&img.tiles[tileIdx].tileComps[0].nDecompLevels) ||
+         !readUByte(&img.tiles[tileIdx].tileComps[0].codeBlockW) ||
+         !readUByte(&img.tiles[tileIdx].tileComps[0].codeBlockH) ||
+         !readUByte(&img.tiles[tileIdx].tileComps[0].codeBlockStyle) ||
+         !readUByte(&img.tiles[tileIdx].tileComps[0].transform)) {
+       error(errSyntaxError, getPos(), "Error in JPX COD marker segment");
+       return gFalse;
+      }
+      if (img.tiles[tileIdx].tileComps[0].nDecompLevels > 32 ||
+         img.tiles[tileIdx].tileComps[0].codeBlockW > 8 ||
+         img.tiles[tileIdx].tileComps[0].codeBlockH > 8) {
+       error(errSyntaxError, getPos(), "Error in JPX COD marker segment");
+       return gFalse;
+      }
+      img.tiles[tileIdx].tileComps[0].codeBlockW += 2;
+      img.tiles[tileIdx].tileComps[0].codeBlockH += 2;
+      for (comp = 0; comp < img.nComps; ++comp) {
+       if (comp != 0) {
+         img.tiles[tileIdx].tileComps[comp].style =
+             img.tiles[tileIdx].tileComps[0].style;
+         img.tiles[tileIdx].tileComps[comp].nDecompLevels =
+             img.tiles[tileIdx].tileComps[0].nDecompLevels;
+         img.tiles[tileIdx].tileComps[comp].codeBlockW =
+             img.tiles[tileIdx].tileComps[0].codeBlockW;
+         img.tiles[tileIdx].tileComps[comp].codeBlockH =
+             img.tiles[tileIdx].tileComps[0].codeBlockH;
+         img.tiles[tileIdx].tileComps[comp].codeBlockStyle =
+             img.tiles[tileIdx].tileComps[0].codeBlockStyle;
+         img.tiles[tileIdx].tileComps[comp].transform =
+             img.tiles[tileIdx].tileComps[0].transform;
+       }
+       img.tiles[tileIdx].tileComps[comp].resLevels =
+           (JPXResLevel *)greallocn(
+                    img.tiles[tileIdx].tileComps[comp].resLevels,
+                    (img.tiles[tileIdx].tileComps[comp].nDecompLevels + 1),
+                    sizeof(JPXResLevel));
+       for (r = 0;
+            r <= img.tiles[tileIdx].tileComps[comp].nDecompLevels;
+            ++r) {
+         img.tiles[tileIdx].tileComps[comp].resLevels[r].precincts = NULL;
+       }
+      }
+      for (r = 0; r <= img.tiles[tileIdx].tileComps[0].nDecompLevels; ++r) {
+       if (img.tiles[tileIdx].tileComps[0].style & 0x01) {
+         if (!readUByte(&precinctSize)) {
+           error(errSyntaxError, getPos(), "Error in JPX COD marker segment");
+           return gFalse;
+         }
+         img.tiles[tileIdx].tileComps[0].resLevels[r].precinctWidth =
+             precinctSize & 0x0f;
+         img.tiles[tileIdx].tileComps[0].resLevels[r].precinctHeight =
+             (precinctSize >> 4) & 0x0f;
+       } else {
+         img.tiles[tileIdx].tileComps[0].resLevels[r].precinctWidth = 15;
+         img.tiles[tileIdx].tileComps[0].resLevels[r].precinctHeight = 15;
+       }
+      }
+      for (comp = 1; comp < img.nComps; ++comp) {
+       for (r = 0;
+            r <= img.tiles[tileIdx].tileComps[comp].nDecompLevels;
+            ++r) {
+         img.tiles[tileIdx].tileComps[comp].resLevels[r].precinctWidth =
+             img.tiles[tileIdx].tileComps[0].resLevels[r].precinctWidth;
+         img.tiles[tileIdx].tileComps[comp].resLevels[r].precinctHeight =
+             img.tiles[tileIdx].tileComps[0].resLevels[r].precinctHeight;
+       }
+      }
+      break;
+    case 0x53:                 // COC - coding style component
+      cover(35);
+      if ((img.nComps > 256 && !readUWord(&comp)) ||
+         (img.nComps <= 256 && !readUByte(&comp)) ||
+         comp >= img.nComps ||
+         !readUByte(&style) ||
+         !readUByte(&img.tiles[tileIdx].tileComps[comp].nDecompLevels) ||
+         !readUByte(&img.tiles[tileIdx].tileComps[comp].codeBlockW) ||
+         !readUByte(&img.tiles[tileIdx].tileComps[comp].codeBlockH) ||
+         !readUByte(&img.tiles[tileIdx].tileComps[comp].codeBlockStyle) ||
+         !readUByte(&img.tiles[tileIdx].tileComps[comp].transform)) {
+       error(errSyntaxError, getPos(), "Error in JPX COC marker segment");
+       return gFalse;
+      }
+      if (img.tiles[tileIdx].tileComps[comp].nDecompLevels > 32 ||
+         img.tiles[tileIdx].tileComps[comp].codeBlockW > 8 ||
+         img.tiles[tileIdx].tileComps[comp].codeBlockH > 8) {
+       error(errSyntaxError, getPos(), "Error in JPX COD marker segment");
+       return gFalse;
+      }
+      img.tiles[tileIdx].tileComps[comp].style =
+         (img.tiles[tileIdx].tileComps[comp].style & ~1) | (style & 1);
+      img.tiles[tileIdx].tileComps[comp].codeBlockW += 2;
+      img.tiles[tileIdx].tileComps[comp].codeBlockH += 2;
+      img.tiles[tileIdx].tileComps[comp].resLevels =
+         (JPXResLevel *)greallocn(
+                    img.tiles[tileIdx].tileComps[comp].resLevels,
+                    (img.tiles[tileIdx].tileComps[comp].nDecompLevels + 1),
+                    sizeof(JPXResLevel));
+      for (r = 0; r <= img.tiles[tileIdx].tileComps[comp].nDecompLevels; ++r) {
+       img.tiles[tileIdx].tileComps[comp].resLevels[r].precincts = NULL;
+      }
+      for (r = 0; r <= img.tiles[tileIdx].tileComps[comp].nDecompLevels; ++r) {
+       if (img.tiles[tileIdx].tileComps[comp].style & 0x01) {
+         if (!readUByte(&precinctSize)) {
+           error(errSyntaxError, getPos(), "Error in JPX COD marker segment");
+           return gFalse;
+         }
+         img.tiles[tileIdx].tileComps[comp].resLevels[r].precinctWidth =
+             precinctSize & 0x0f;
+         img.tiles[tileIdx].tileComps[comp].resLevels[r].precinctHeight =
+             (precinctSize >> 4) & 0x0f;
+       } else {
+         img.tiles[tileIdx].tileComps[comp].resLevels[r].precinctWidth = 15;
+         img.tiles[tileIdx].tileComps[comp].resLevels[r].precinctHeight = 15;
+       }
+      }
+      break;
+    case 0x5c:                 // QCD - quantization default
+      cover(36);
+      if (!readUByte(&img.tiles[tileIdx].tileComps[0].quantStyle)) {
+       error(errSyntaxError, getPos(), "Error in JPX QCD marker segment");
+       return gFalse;
+      }
+      if ((img.tiles[tileIdx].tileComps[0].quantStyle & 0x1f) == 0x00) {
+       if (segLen <= 3) {
+         error(errSyntaxError, getPos(), "Error in JPX QCD marker segment");
+         return gFalse;
+       }
+       img.tiles[tileIdx].tileComps[0].nQuantSteps = segLen - 3;
+       img.tiles[tileIdx].tileComps[0].quantSteps =
+           (Guint *)greallocn(img.tiles[tileIdx].tileComps[0].quantSteps,
+                              img.tiles[tileIdx].tileComps[0].nQuantSteps,
+                              sizeof(Guint));
+       for (i = 0; i < img.tiles[tileIdx].tileComps[0].nQuantSteps; ++i) {
+         if (!readUByte(&img.tiles[tileIdx].tileComps[0].quantSteps[i])) {
+           error(errSyntaxError, getPos(), "Error in JPX QCD marker segment");
+           return gFalse;
+         }
+       }
+      } else if ((img.tiles[tileIdx].tileComps[0].quantStyle & 0x1f) == 0x01) {
+       img.tiles[tileIdx].tileComps[0].nQuantSteps = 1;
+       img.tiles[tileIdx].tileComps[0].quantSteps =
+           (Guint *)greallocn(img.tiles[tileIdx].tileComps[0].quantSteps,
+                              img.tiles[tileIdx].tileComps[0].nQuantSteps,
+                              sizeof(Guint));
+       if (!readUWord(&img.tiles[tileIdx].tileComps[0].quantSteps[0])) {
+         error(errSyntaxError, getPos(), "Error in JPX QCD marker segment");
+         return gFalse;
+       }
+      } else if ((img.tiles[tileIdx].tileComps[0].quantStyle & 0x1f) == 0x02) {
+       if (segLen < 5) {
+         error(errSyntaxError, getPos(), "Error in JPX QCD marker segment");
+         return gFalse;
+       }
+       img.tiles[tileIdx].tileComps[0].nQuantSteps = (segLen - 3) / 2;
+       img.tiles[tileIdx].tileComps[0].quantSteps =
+           (Guint *)greallocn(img.tiles[tileIdx].tileComps[0].quantSteps,
+                              img.tiles[tileIdx].tileComps[0].nQuantSteps,
+                              sizeof(Guint));
+       for (i = 0; i < img.tiles[tileIdx].tileComps[0].nQuantSteps; ++i) {
+         if (!readUWord(&img.tiles[tileIdx].tileComps[0].quantSteps[i])) {
+           error(errSyntaxError, getPos(), "Error in JPX QCD marker segment");
+           return gFalse;
+         }
+       }
+      } else {
+       error(errSyntaxError, getPos(), "Error in JPX QCD marker segment");
+       return gFalse;
+      }
+      for (comp = 1; comp < img.nComps; ++comp) {
+       img.tiles[tileIdx].tileComps[comp].quantStyle =
+           img.tiles[tileIdx].tileComps[0].quantStyle;
+       img.tiles[tileIdx].tileComps[comp].nQuantSteps =
+           img.tiles[tileIdx].tileComps[0].nQuantSteps;
+       img.tiles[tileIdx].tileComps[comp].quantSteps = 
+           (Guint *)greallocn(img.tiles[tileIdx].tileComps[comp].quantSteps,
+                              img.tiles[tileIdx].tileComps[0].nQuantSteps,
+                              sizeof(Guint));
+       for (j = 0; j < img.tiles[tileIdx].tileComps[0].nQuantSteps; ++j) {
+         img.tiles[tileIdx].tileComps[comp].quantSteps[j] =
+             img.tiles[tileIdx].tileComps[0].quantSteps[j];
+       }
+      }
+      break;
+    case 0x5d:                 // QCC - quantization component
+      cover(37);
+      if ((img.nComps > 256 && !readUWord(&comp)) ||
+         (img.nComps <= 256 && !readUByte(&comp)) ||
+         comp >= img.nComps ||
+         !readUByte(&img.tiles[tileIdx].tileComps[comp].quantStyle)) {
+       error(errSyntaxError, getPos(), "Error in JPX QCC marker segment");
+       return gFalse;
+      }
+      if ((img.tiles[tileIdx].tileComps[comp].quantStyle & 0x1f) == 0x00) {
+       if (segLen <= (img.nComps > 256 ? 5U : 4U)) {
+         error(errSyntaxError, getPos(), "Error in JPX QCC marker segment");
+         return gFalse;
+       }
+       img.tiles[tileIdx].tileComps[comp].nQuantSteps =
+           segLen - (img.nComps > 256 ? 5 : 4);
+       img.tiles[tileIdx].tileComps[comp].quantSteps =
+           (Guint *)greallocn(img.tiles[tileIdx].tileComps[comp].quantSteps,
+                              img.tiles[tileIdx].tileComps[comp].nQuantSteps,
+                              sizeof(Guint));
+       for (i = 0; i < img.tiles[tileIdx].tileComps[comp].nQuantSteps; ++i) {
+         if (!readUByte(&img.tiles[tileIdx].tileComps[comp].quantSteps[i])) {
+           error(errSyntaxError, getPos(), "Error in JPX QCC marker segment");
+           return gFalse;
+         }
+       }
+      } else if ((img.tiles[tileIdx].tileComps[comp].quantStyle & 0x1f)
+                == 0x01) {
+       img.tiles[tileIdx].tileComps[comp].nQuantSteps = 1;
+       img.tiles[tileIdx].tileComps[comp].quantSteps =
+           (Guint *)greallocn(img.tiles[tileIdx].tileComps[comp].quantSteps,
+                              img.tiles[tileIdx].tileComps[comp].nQuantSteps,
+                              sizeof(Guint));
+       if (!readUWord(&img.tiles[tileIdx].tileComps[comp].quantSteps[0])) {
+         error(errSyntaxError, getPos(), "Error in JPX QCC marker segment");
+         return gFalse;
+       }
+      } else if ((img.tiles[tileIdx].tileComps[comp].quantStyle & 0x1f)
+                == 0x02) {
+       if (segLen < (img.nComps > 256 ? 5U : 4U) + 2) {
+         error(errSyntaxError, getPos(), "Error in JPX QCC marker segment");
+         return gFalse;
+       }
+       img.tiles[tileIdx].tileComps[comp].nQuantSteps =
+           (segLen - (img.nComps > 256 ? 5 : 4)) / 2;
+       img.tiles[tileIdx].tileComps[comp].quantSteps =
+           (Guint *)greallocn(img.tiles[tileIdx].tileComps[comp].quantSteps,
+                              img.tiles[tileIdx].tileComps[comp].nQuantSteps,
+                              sizeof(Guint));
+       for (i = 0; i < img.tiles[tileIdx].tileComps[comp].nQuantSteps; ++i) {
+         if (!readUWord(&img.tiles[tileIdx].tileComps[comp].quantSteps[i])) {
+           error(errSyntaxError, getPos(), "Error in JPX QCD marker segment");
+           return gFalse;
+         }
+       }
+      } else {
+       error(errSyntaxError, getPos(), "Error in JPX QCC marker segment");
+       return gFalse;
+      }
+      break;
+    case 0x5e:                 // RGN - region of interest
+      cover(38);
+#if 1 //~ ROI is unimplemented
+      error(errUnimplemented, -1, "Got a JPX RGN segment");
+      for (i = 0; i < segLen - 2; ++i) {
+       if (bufStr->getChar() == EOF) {
+         error(errSyntaxError, getPos(), "Error in JPX RGN marker segment");
+         return gFalse;
+       }
+      }
+#else
+      if ((img.nComps > 256 && !readUWord(&comp)) ||
+         (img.nComps <= 256 && !readUByte(&comp)) ||
+         comp >= img.nComps ||
+         !readUByte(&compInfo[comp].roi.style) ||
+         !readUByte(&compInfo[comp].roi.shift)) {
+       error(errSyntaxError, getPos(), "Error in JPX RGN marker segment");
+       return gFalse;
+      }
+#endif
+      break;
+    case 0x5f:                 // POC - progression order change
+      cover(39);
+#if 1 //~ progression order changes are unimplemented
+      error(errUnimplemented, -1, "Got a JPX POC segment");
+      for (i = 0; i < segLen - 2; ++i) {
+       if (bufStr->getChar() == EOF) {
+         error(errSyntaxError, getPos(), "Error in JPX POC marker segment");
+         return gFalse;
+       }
+      }
+#else
+      nTileProgs = (segLen - 2) / (img.nComps > 256 ? 9 : 7);
+      tileProgs = (JPXProgOrder *)gmallocn(nTileProgs, sizeof(JPXProgOrder));
+      for (i = 0; i < nTileProgs; ++i) {
+       if (!readUByte(&tileProgs[i].startRes) ||
+           !(img.nComps > 256 && readUWord(&tileProgs[i].startComp)) ||
+           !(img.nComps <= 256 && readUByte(&tileProgs[i].startComp)) ||
+           !readUWord(&tileProgs[i].endLayer) ||
+           !readUByte(&tileProgs[i].endRes) ||
+           !(img.nComps > 256 && readUWord(&tileProgs[i].endComp)) ||
+           !(img.nComps <= 256 && readUByte(&tileProgs[i].endComp)) ||
+           !readUByte(&tileProgs[i].progOrder)) {
+         error(errSyntaxError, getPos(), "Error in JPX POC marker segment");
+         return gFalse;
+       }
+      }
+#endif
+      break;
+    case 0x61:                 // PPT - packed packet headers, tile-part hdr
+      cover(40);
+#if 1 //~ packed packet headers are unimplemented
+      error(errUnimplemented, -1, "Got a JPX PPT segment");
+      for (i = 0; i < segLen - 2; ++i) {
+       if (bufStr->getChar() == EOF) {
+         error(errSyntaxError, getPos(), "Error in JPX PPT marker segment");
+         return gFalse;
+       }
+      }
+#endif
+    case 0x58:                 // PLT - packet length, tile-part header
+      // skipped
+      cover(41);
+      for (i = 0; i < segLen - 2; ++i) {
+       if (bufStr->getChar() == EOF) {
+         error(errSyntaxError, getPos(), "Error in JPX PLT marker segment");
+         return gFalse;
+       }
+      }
+      break;
+    case 0x64:                 // COM - comment
+      // skipped
+      cover(42);
+      for (i = 0; i < segLen - 2; ++i) {
+       if (bufStr->getChar() == EOF) {
+         error(errSyntaxError, getPos(), "Error in JPX COM marker segment");
+         return gFalse;
+       }
+      }
+      break;
+    case 0x93:                 // SOD - start of data
+      cover(43);
+      haveSOD = gTrue;
+      break;
+    default:
+      cover(44);
+      error(errSyntaxError, getPos(),
+           "Unknown marker segment {0:02x} in JPX tile-part stream",
+           segType);
+      for (i = 0; i < segLen - 2; ++i) {
+       if (bufStr->getChar() == EOF) {
+         break;
+       }
+      }
+      break;
+    }
+  } while (!haveSOD);
+
+  //----- initialize the tile, precincts, and code-blocks
+  if (tilePartIdx == 0) {
+    tile = &img.tiles[tileIdx];
+    tile->init = gTrue;
+    i = tileIdx / img.nXTiles;
+    j = tileIdx % img.nXTiles;
+    if ((tile->x0 = img.xTileOffset + j * img.xTileSize) < img.xOffset) {
+      tile->x0 = img.xOffset;
+    }
+    if ((tile->y0 = img.yTileOffset + i * img.yTileSize) < img.yOffset) {
+      tile->y0 = img.yOffset;
+    }
+    if ((tile->x1 = img.xTileOffset + (j + 1) * img.xTileSize) > img.xSize) {
+      tile->x1 = img.xSize;
+    }
+    if ((tile->y1 = img.yTileOffset + (i + 1) * img.yTileSize) > img.ySize) {
+      tile->y1 = img.ySize;
+    }
+    tile->comp = 0;
+    tile->res = 0;
+    tile->precinct = 0;
+    tile->layer = 0;
+    tile->maxNDecompLevels = 0;
+    for (comp = 0; comp < img.nComps; ++comp) {
+      tileComp = &tile->tileComps[comp];
+      if (tileComp->nDecompLevels > tile->maxNDecompLevels) {
+       tile->maxNDecompLevels = tileComp->nDecompLevels;
+      }
+      tileComp->x0 = jpxCeilDiv(tile->x0, tileComp->hSep);
+      tileComp->y0 = jpxCeilDiv(tile->y0, tileComp->vSep);
+      tileComp->x1 = jpxCeilDiv(tile->x1, tileComp->hSep);
+      tileComp->y1 = jpxCeilDiv(tile->y1, tileComp->vSep);
+      tileComp->w = tileComp->x1 - tileComp->x0;
+      tileComp->cbW = 1 << tileComp->codeBlockW;
+      tileComp->cbH = 1 << tileComp->codeBlockH;
+      tileComp->data = (int *)gmallocn((tileComp->x1 - tileComp->x0) *
+                                      (tileComp->y1 - tileComp->y0),
+                                      sizeof(int));
+      if (tileComp->x1 - tileComp->x0 > tileComp->y1 - tileComp->y0) {
+       n = tileComp->x1 - tileComp->x0;
+      } else {
+       n = tileComp->y1 - tileComp->y0;
+      }
+      tileComp->buf = (int *)gmallocn(n + 8, sizeof(int));
+      for (r = 0; r <= tileComp->nDecompLevels; ++r) {
+       resLevel = &tileComp->resLevels[r];
+       k = r == 0 ? tileComp->nDecompLevels
+                  : tileComp->nDecompLevels - r + 1;
+       resLevel->x0 = jpxCeilDivPow2(tileComp->x0, k);
+       resLevel->y0 = jpxCeilDivPow2(tileComp->y0, k);
+       resLevel->x1 = jpxCeilDivPow2(tileComp->x1, k);
+       resLevel->y1 = jpxCeilDivPow2(tileComp->y1, k);
+       if (r == 0) {
+         resLevel->bx0[0] = resLevel->x0;
+         resLevel->by0[0] = resLevel->y0;
+         resLevel->bx1[0] = resLevel->x1;
+         resLevel->by1[0] = resLevel->y1;
+       } else {
+         resLevel->bx0[0] = jpxCeilDivPow2(tileComp->x0 - (1 << (k-1)), k);
+         resLevel->by0[0] = resLevel->y0;
+         resLevel->bx1[0] = jpxCeilDivPow2(tileComp->x1 - (1 << (k-1)), k);
+         resLevel->by1[0] = resLevel->y1;
+         resLevel->bx0[1] = resLevel->x0;
+         resLevel->by0[1] = jpxCeilDivPow2(tileComp->y0 - (1 << (k-1)), k);
+         resLevel->bx1[1] = resLevel->x1;
+         resLevel->by1[1] = jpxCeilDivPow2(tileComp->y1 - (1 << (k-1)), k);
+         resLevel->bx0[2] = jpxCeilDivPow2(tileComp->x0 - (1 << (k-1)), k);
+         resLevel->by0[2] = jpxCeilDivPow2(tileComp->y0 - (1 << (k-1)), k);
+         resLevel->bx1[2] = jpxCeilDivPow2(tileComp->x1 - (1 << (k-1)), k);
+         resLevel->by1[2] = jpxCeilDivPow2(tileComp->y1 - (1 << (k-1)), k);
+       }
+       resLevel->precincts = (JPXPrecinct *)gmallocn(1, sizeof(JPXPrecinct));
+       for (pre = 0; pre < 1; ++pre) {
+         precinct = &resLevel->precincts[pre];
+         precinct->x0 = resLevel->x0;
+         precinct->y0 = resLevel->y0;
+         precinct->x1 = resLevel->x1;
+         precinct->y1 = resLevel->y1;
+         nSBs = r == 0 ? 1 : 3;
+         precinct->subbands =
+             (JPXSubband *)gmallocn(nSBs, sizeof(JPXSubband));
+         for (sb = 0; sb < nSBs; ++sb) {
+           subband = &precinct->subbands[sb];
+           subband->x0 = resLevel->bx0[sb];
+           subband->y0 = resLevel->by0[sb];
+           subband->x1 = resLevel->bx1[sb];
+           subband->y1 = resLevel->by1[sb];
+           subband->nXCBs = jpxCeilDivPow2(subband->x1,
+                                           tileComp->codeBlockW)
+                            - jpxFloorDivPow2(subband->x0,
+                                              tileComp->codeBlockW);
+           subband->nYCBs = jpxCeilDivPow2(subband->y1,
+                                           tileComp->codeBlockH)
+                            - jpxFloorDivPow2(subband->y0,
+                                              tileComp->codeBlockH);
+           n = subband->nXCBs > subband->nYCBs ? subband->nXCBs
+                                               : subband->nYCBs;
+           for (subband->maxTTLevel = 0, --n;
+                n;
+                ++subband->maxTTLevel, n >>= 1) ;
+           n = 0;
+           for (level = subband->maxTTLevel; level >= 0; --level) {
+             nx = jpxCeilDivPow2(subband->nXCBs, level);
+             ny = jpxCeilDivPow2(subband->nYCBs, level);
+             n += nx * ny;
+           }
+           subband->inclusion =
+               (JPXTagTreeNode *)gmallocn(n, sizeof(JPXTagTreeNode));
+           subband->zeroBitPlane =
+               (JPXTagTreeNode *)gmallocn(n, sizeof(JPXTagTreeNode));
+           for (k = 0; k < n; ++k) {
+             subband->inclusion[k].finished = gFalse;
+             subband->inclusion[k].val = 0;
+             subband->zeroBitPlane[k].finished = gFalse;
+             subband->zeroBitPlane[k].val = 0;
+           }
+           subband->cbs = (JPXCodeBlock *)gmallocn(subband->nXCBs *
+                                                     subband->nYCBs,
+                                                   sizeof(JPXCodeBlock));
+           sbx0 = jpxFloorDivPow2(subband->x0, tileComp->codeBlockW);
+           sby0 = jpxFloorDivPow2(subband->y0, tileComp->codeBlockH);
+           if (r == 0) { // (NL)LL
+             sbCoeffs = tileComp->data;
+           } else if (sb == 0) { // (NL-r+1)HL
+             sbCoeffs = tileComp->data
+                        + resLevel->bx1[1] - resLevel->bx0[1];
+           } else if (sb == 1) { // (NL-r+1)LH
+             sbCoeffs = tileComp->data
+                        + (resLevel->by1[0] - resLevel->by0[0]) * tileComp->w;
+           } else { // (NL-r+1)HH
+             sbCoeffs = tileComp->data
+                        + (resLevel->by1[0] - resLevel->by0[0]) * tileComp->w
+                        + resLevel->bx1[1] - resLevel->bx0[1];
+           }
+           cb = subband->cbs;
+           for (cbY = 0; cbY < subband->nYCBs; ++cbY) {
+             for (cbX = 0; cbX < subband->nXCBs; ++cbX) {
+               cb->x0 = (sbx0 + cbX) << tileComp->codeBlockW;
+               cb->x1 = cb->x0 + tileComp->cbW;
+               if (subband->x0 > cb->x0) {
+                 cb->x0 = subband->x0;
+               }
+               if (subband->x1 < cb->x1) {
+                 cb->x1 = subband->x1;
+               }
+               cb->y0 = (sby0 + cbY) << tileComp->codeBlockH;
+               cb->y1 = cb->y0 + tileComp->cbH;
+               if (subband->y0 > cb->y0) {
+                 cb->y0 = subband->y0;
+               }
+               if (subband->y1 < cb->y1) {
+                 cb->y1 = subband->y1;
+               }
+               cb->seen = gFalse;
+               cb->lBlock = 3;
+               cb->nextPass = jpxPassCleanup;
+               cb->nZeroBitPlanes = 0;
+               cb->dataLenSize = 1;
+               cb->dataLen = (Guint *)gmalloc(sizeof(Guint));
+               cb->coeffs = sbCoeffs
+                            + (cb->y0 - subband->y0) * tileComp->w
+                            + (cb->x0 - subband->x0);
+               cb->touched = (char *)gmalloc(1 << (tileComp->codeBlockW
+                                                   + tileComp->codeBlockH));
+               cb->len = 0;
+               for (cbj = 0; cbj < cb->y1 - cb->y0; ++cbj) {
+                 for (cbi = 0; cbi < cb->x1 - cb->x0; ++cbi) {
+                   cb->coeffs[cbj * tileComp->w + cbi] = 0;
+                 }
+               }
+               memset(cb->touched, 0,
+                      (1 << (tileComp->codeBlockW + tileComp->codeBlockH)));
+               cb->arithDecoder = NULL;
+               cb->stats = NULL;
+               ++cb;
+             }
+           }
+         }
+       }
+      }
+    }
+  }
+
+  return readTilePartData(tileIdx, tilePartLen, tilePartToEOC);
+}
+
+GBool JPXStream::readTilePartData(Guint tileIdx,
+                                 Guint tilePartLen, GBool tilePartToEOC) {
+  JPXTile *tile;
+  JPXTileComp *tileComp;
+  JPXResLevel *resLevel;
+  JPXPrecinct *precinct;
+  JPXSubband *subband;
+  JPXCodeBlock *cb;
+  Guint ttVal;
+  Guint bits, cbX, cbY, nx, ny, i, j, n, sb;
+  int level;
+
+  tile = &img.tiles[tileIdx];
+
+  // read all packets from this tile-part
+  while (1) {
+    if (tilePartToEOC) {
+      //~ peek for an EOC marker
+      cover(93);
+    } else if (tilePartLen == 0) {
+      break;
+    }
+
+    tileComp = &tile->tileComps[tile->comp];
+    resLevel = &tileComp->resLevels[tile->res];
+    precinct = &resLevel->precincts[tile->precinct];
+
+    //----- packet header
+
+    // setup
+    startBitBuf(tilePartLen);
+    if (tileComp->style & 0x02) {
+      skipSOP();
+    }
+
+    // zero-length flag
+    if (!readBits(1, &bits)) {
+      goto err;
+    }
+    if (!bits) {
+      // packet is empty -- clear all code-block inclusion flags
+      cover(45);
+      for (sb = 0; sb < (Guint)(tile->res == 0 ? 1 : 3); ++sb) {
+       subband = &precinct->subbands[sb];
+       for (cbY = 0; cbY < subband->nYCBs; ++cbY) {
+         for (cbX = 0; cbX < subband->nXCBs; ++cbX) {
+           cb = &subband->cbs[cbY * subband->nXCBs + cbX];
+           cb->included = gFalse;
+         }
+       }
+      }
+    } else {
+
+      for (sb = 0; sb < (Guint)(tile->res == 0 ? 1 : 3); ++sb) {
+       subband = &precinct->subbands[sb];
+       for (cbY = 0; cbY < subband->nYCBs; ++cbY) {
+         for (cbX = 0; cbX < subband->nXCBs; ++cbX) {
+           cb = &subband->cbs[cbY * subband->nXCBs + cbX];
+
+           // skip code-blocks with no coefficients
+           if (cb->x0 >= cb->x1 || cb->y0 >= cb->y1) {
+             cover(46);
+             cb->included = gFalse;
+             continue;
+           }
+
+           // code-block inclusion
+           if (cb->seen) {
+             cover(47);
+             if (!readBits(1, &cb->included)) {
+               goto err;
+             }
+           } else {
+             cover(48);
+             ttVal = 0;
+             i = 0;
+             for (level = subband->maxTTLevel; level >= 0; --level) {
+               nx = jpxCeilDivPow2(subband->nXCBs, level);
+               ny = jpxCeilDivPow2(subband->nYCBs, level);
+               j = i + (cbY >> level) * nx + (cbX >> level);
+               if (!subband->inclusion[j].finished &&
+                   !subband->inclusion[j].val) {
+                 subband->inclusion[j].val = ttVal;
+               } else {
+                 ttVal = subband->inclusion[j].val;
+               }
+               while (!subband->inclusion[j].finished &&
+                      ttVal <= tile->layer) {
+                 if (!readBits(1, &bits)) {
+                   goto err;
+                 }
+                 if (bits == 1) {
+                   subband->inclusion[j].finished = gTrue;
+                 } else {
+                   ++ttVal;
+                 }
+               }
+               subband->inclusion[j].val = ttVal;
+               if (ttVal > tile->layer) {
+                 break;
+               }
+               i += nx * ny;
+             }
+             cb->included = level < 0;
+           }
+
+           if (cb->included) {
+             cover(49);
+
+             // zero bit-plane count
+             if (!cb->seen) {
+               cover(50);
+               ttVal = 0;
+               i = 0;
+               for (level = subband->maxTTLevel; level >= 0; --level) {
+                 nx = jpxCeilDivPow2(subband->nXCBs, level);
+                 ny = jpxCeilDivPow2(subband->nYCBs, level);
+                 j = i + (cbY >> level) * nx + (cbX >> level);
+                 if (!subband->zeroBitPlane[j].finished &&
+                     !subband->zeroBitPlane[j].val) {
+                   subband->zeroBitPlane[j].val = ttVal;
+                 } else {
+                   ttVal = subband->zeroBitPlane[j].val;
+                 }
+                 while (!subband->zeroBitPlane[j].finished) {
+                   if (!readBits(1, &bits)) {
+                     goto err;
+                   }
+                   if (bits == 1) {
+                     subband->zeroBitPlane[j].finished = gTrue;
+                   } else {
+                     ++ttVal;
+                   }
+                 }
+                 subband->zeroBitPlane[j].val = ttVal;
+                 i += nx * ny;
+               }
+               cb->nZeroBitPlanes = ttVal;
+             }
+
+             // number of coding passes
+             if (!readBits(1, &bits)) {
+               goto err;
+             }
+             if (bits == 0) {
+               cover(51);
+               cb->nCodingPasses = 1;
+             } else {
+               if (!readBits(1, &bits)) {
+                 goto err;
+               }
+               if (bits == 0) {
+                 cover(52);
+                 cb->nCodingPasses = 2;
+               } else {
+                 cover(53);
+                 if (!readBits(2, &bits)) {
+                   goto err;
+                 }
+                 if (bits < 3) {
+                   cover(54);
+                   cb->nCodingPasses = 3 + bits;
+                 } else {
+                   cover(55);
+                   if (!readBits(5, &bits)) {
+                     goto err;
+                   }
+                   if (bits < 31) {
+                     cover(56);
+                     cb->nCodingPasses = 6 + bits;
+                   } else {
+                     cover(57);
+                     if (!readBits(7, &bits)) {
+                       goto err;
+                     }
+                     cb->nCodingPasses = 37 + bits;
+                   }
+                 }
+               }
+             }
+
+             // update Lblock
+             while (1) {
+               if (!readBits(1, &bits)) {
+                 goto err;
+               }
+               if (!bits) {
+                 break;
+               }
+               ++cb->lBlock;
+             }
+
+             // one codeword segment for each of the coding passes
+             if (tileComp->codeBlockStyle & 0x04) {
+               if (cb->nCodingPasses > cb->dataLenSize) {
+                 cb->dataLenSize = cb->nCodingPasses;
+                 cb->dataLen = (Guint *)greallocn(cb->dataLen,
+                                                  cb->dataLenSize,
+                                                  sizeof(Guint));
+               }
+
+               // read the lengths
+               for (i = 0; i < cb->nCodingPasses; ++i) {
+                 if (!readBits(cb->lBlock, &cb->dataLen[i])) {
+                   goto err;
+                 }
+               }
+
+             // one codeword segment for all of the coding passes
+             } else {
+
+               // read the length
+               for (n = cb->lBlock, i = cb->nCodingPasses >> 1;
+                    i;
+                    ++n, i >>= 1) ;
+               if (!readBits(n, &cb->dataLen[0])) {
+                 goto err;
+               }
+             }
+           }
+         }
+       }
+      }
+    }
+    if (tileComp->style & 0x04) {
+      skipEPH();
+    }
+    tilePartLen = finishBitBuf();
+
+    //----- packet data
+
+    for (sb = 0; sb < (Guint)(tile->res == 0 ? 1 : 3); ++sb) {
+      subband = &precinct->subbands[sb];
+      for (cbY = 0; cbY < subband->nYCBs; ++cbY) {
+       for (cbX = 0; cbX < subband->nXCBs; ++cbX) {
+         cb = &subband->cbs[cbY * subband->nXCBs + cbX];
+         if (cb->included) {
+           if (!readCodeBlockData(tileComp, resLevel, precinct, subband,
+                                  tile->res, sb, cb)) {
+             return gFalse;
+           }
+           if (tileComp->codeBlockStyle & 0x04) {
+             for (i = 0; i < cb->nCodingPasses; ++i) {
+               tilePartLen -= cb->dataLen[i];
+             }
+           } else {
+             tilePartLen -= cb->dataLen[0];
+           }
+           cb->seen = gTrue;
+         }
+       }
+      }
+    }
+
+    //----- next packet
+
+    switch (tile->progOrder) {
+    case 0: // layer, resolution level, component, precinct
+      cover(58);
+      if (++tile->comp == img.nComps) {
+       tile->comp = 0;
+       if (++tile->res == tile->maxNDecompLevels + 1) {
+         tile->res = 0;
+         if (++tile->layer == tile->nLayers) {
+           tile->layer = 0;
+         }
+       }
+      }
+      break;
+    case 1: // resolution level, layer, component, precinct
+      cover(59);
+      if (++tile->comp == img.nComps) {
+       tile->comp = 0;
+       if (++tile->layer == tile->nLayers) {
+         tile->layer = 0;
+         if (++tile->res == tile->maxNDecompLevels + 1) {
+           tile->res = 0;
+         }
+       }
+      }
+      break;
+    case 2: // resolution level, precinct, component, layer
+      //~ this isn't correct -- see B.12.1.3
+      cover(60);
+      if (++tile->layer == tile->nLayers) {
+       tile->layer = 0;
+       if (++tile->comp == img.nComps) {
+         tile->comp = 0;
+         if (++tile->res == tile->maxNDecompLevels + 1) {
+           tile->res = 0;
+         }
+       }
+      }
+      break;
+    case 3: // precinct, component, resolution level, layer
+      //~ this isn't correct -- see B.12.1.4
+      cover(61);
+      if (++tile->layer == tile->nLayers) {
+       tile->layer = 0;
+       if (++tile->res == tile->maxNDecompLevels + 1) {
+         tile->res = 0;
+         if (++tile->comp == img.nComps) {
+           tile->comp = 0;
+         }
+       }
+      }
+      break;
+    case 4: // component, precinct, resolution level, layer
+      //~ this isn't correct -- see B.12.1.5
+      cover(62);
+      if (++tile->layer == tile->nLayers) {
+       tile->layer = 0;
+       if (++tile->res == tile->maxNDecompLevels + 1) {
+         tile->res = 0;
+         if (++tile->comp == img.nComps) {
+           tile->comp = 0;
+         }
+       }
+      }
+      break;
+    }
+  }
+
+  return gTrue;
+
+ err:
+  error(errSyntaxError, getPos(), "Error in JPX stream");
+  return gFalse;
+}
+
+GBool JPXStream::readCodeBlockData(JPXTileComp *tileComp,
+                                  JPXResLevel *resLevel,
+                                  JPXPrecinct *precinct,
+                                  JPXSubband *subband,
+                                  Guint res, Guint sb,
+                                  JPXCodeBlock *cb) {
+  int *coeff0, *coeff1, *coeff;
+  char *touched0, *touched1, *touched;
+  Guint horiz, vert, diag, all, cx, xorBit;
+  int horizSign, vertSign, bit;
+  int segSym;
+  Guint i, x, y0, y1;
+
+  if (cb->arithDecoder) {
+    cover(63);
+    cb->arithDecoder->restart(cb->dataLen[0]);
+  } else {
+    cover(64);
+    cb->arithDecoder = new JArithmeticDecoder();
+    cb->arithDecoder->setStream(bufStr, cb->dataLen[0]);
+    cb->arithDecoder->start();
+    cb->stats = new JArithmeticDecoderStats(jpxNContexts);
+    cb->stats->setEntry(jpxContextSigProp, 4, 0);
+    cb->stats->setEntry(jpxContextRunLength, 3, 0);
+    cb->stats->setEntry(jpxContextUniform, 46, 0);
+  }
+
+  for (i = 0; i < cb->nCodingPasses; ++i) {
+    if ((tileComp->codeBlockStyle & 0x04) && i > 0) {
+      cb->arithDecoder->setStream(bufStr, cb->dataLen[i]);
+      cb->arithDecoder->start();
+    }
+
+    switch (cb->nextPass) {
+
+    //----- significance propagation pass
+    case jpxPassSigProp:
+      cover(65);
+      for (y0 = cb->y0, coeff0 = cb->coeffs, touched0 = cb->touched;
+          y0 < cb->y1;
+          y0 += 4, coeff0 += 4 * tileComp->w,
+            touched0 += 4 << tileComp->codeBlockW) {
+       for (x = cb->x0, coeff1 = coeff0, touched1 = touched0;
+            x < cb->x1;
+            ++x, ++coeff1, ++touched1) {
+         for (y1 = 0, coeff = coeff1, touched = touched1;
+              y1 < 4 && y0+y1 < cb->y1;
+              ++y1, coeff += tileComp->w, touched += tileComp->cbW) {
+           if (!*coeff) {
+             horiz = vert = diag = 0;
+             horizSign = vertSign = 2;
+             if (x > cb->x0) {
+               if (coeff[-1]) {
+                 ++horiz;
+                 horizSign += coeff[-1] < 0 ? -1 : 1;
+               }
+               if (y0+y1 > cb->y0) {
+                 diag += coeff[-(int)tileComp->w - 1] ? 1 : 0;
+               }
+               if (y0+y1 < cb->y1 - 1 &&
+                   (!(tileComp->codeBlockStyle & 0x08) || y1 < 3)) {
+                 diag += coeff[tileComp->w - 1] ? 1 : 0;
+               }
+             }
+             if (x < cb->x1 - 1) {
+               if (coeff[1]) {
+                 ++horiz;
+                 horizSign += coeff[1] < 0 ? -1 : 1;
+               }
+               if (y0+y1 > cb->y0) {
+                 diag += coeff[-(int)tileComp->w + 1] ? 1 : 0;
+               }
+               if (y0+y1 < cb->y1 - 1 &&
+                   (!(tileComp->codeBlockStyle & 0x08) || y1 < 3)) {
+                 diag += coeff[tileComp->w + 1] ? 1 : 0;
+               }
+             }
+             if (y0+y1 > cb->y0) {
+               if (coeff[-(int)tileComp->w]) {
+                 ++vert;
+                 vertSign += coeff[-(int)tileComp->w] < 0 ? -1 : 1;
+               }
+             }
+             if (y0+y1 < cb->y1 - 1 &&
+                 (!(tileComp->codeBlockStyle & 0x08) || y1 < 3)) {
+               if (coeff[tileComp->w]) {
+                 ++vert;
+                 vertSign += coeff[tileComp->w] < 0 ? -1 : 1;
+               }
+             }
+             cx = sigPropContext[horiz][vert][diag][res == 0 ? 1 : sb];
+             if (cx != 0) {
+               if (cb->arithDecoder->decodeBit(cx, cb->stats)) {
+                 cx = signContext[horizSign][vertSign][0];
+                 xorBit = signContext[horizSign][vertSign][1];
+                 if (cb->arithDecoder->decodeBit(cx, cb->stats) ^ xorBit) {
+                   *coeff = -1;
+                 } else {
+                   *coeff = 1;
+                 }
+               }
+               *touched = 1;
+             }
+           }
+         }
+       }
+      }
+      ++cb->nextPass;
+      break;
+
+    //----- magnitude refinement pass
+    case jpxPassMagRef:
+      cover(66);
+      for (y0 = cb->y0, coeff0 = cb->coeffs, touched0 = cb->touched;
+          y0 < cb->y1;
+          y0 += 4, coeff0 += 4 * tileComp->w,
+            touched0 += 4 << tileComp->codeBlockW) {
+       for (x = cb->x0, coeff1 = coeff0, touched1 = touched0;
+            x < cb->x1;
+            ++x, ++coeff1, ++touched1) {
+         for (y1 = 0, coeff = coeff1, touched = touched1;
+              y1 < 4 && y0+y1 < cb->y1;
+              ++y1, coeff += tileComp->w, touched += tileComp->cbW) {
+           if (*coeff && !*touched) {
+             if (*coeff == 1 || *coeff == -1) {
+               all = 0;
+               if (x > cb->x0) {
+                 all += coeff[-1] ? 1 : 0;
+                 if (y0+y1 > cb->y0) {
+                   all += coeff[-(int)tileComp->w - 1] ? 1 : 0;
+                 }
+                 if (y0+y1 < cb->y1 - 1 &&
+                     (!(tileComp->codeBlockStyle & 0x08) || y1 < 3)) {
+                   all += coeff[tileComp->w - 1] ? 1 : 0;
+                 }
+               }
+               if (x < cb->x1 - 1) {
+                 all += coeff[1] ? 1 : 0;
+                 if (y0+y1 > cb->y0) {
+                   all += coeff[-(int)tileComp->w + 1] ? 1 : 0;
+                 }
+                 if (y0+y1 < cb->y1 - 1 &&
+                     (!(tileComp->codeBlockStyle & 0x08) || y1 < 3)) {
+                   all += coeff[tileComp->w + 1] ? 1 : 0;
+                 }
+               }
+               if (y0+y1 > cb->y0) {
+                 all += coeff[-(int)tileComp->w] ? 1 : 0;
+               }
+               if (y0+y1 < cb->y1 - 1 &&
+                   (!(tileComp->codeBlockStyle & 0x08) || y1 < 3)) {
+                 all += coeff[tileComp->w] ? 1 : 0;
+               }
+               cx = all ? 15 : 14;
+             } else {
+               cx = 16;
+             }
+             bit = cb->arithDecoder->decodeBit(cx, cb->stats);
+             if (*coeff < 0) {
+               *coeff = (*coeff << 1) - bit;
+             } else {
+               *coeff = (*coeff << 1) + bit;
+             }
+             *touched = 1;
+           }
+         }
+       }
+      }
+      ++cb->nextPass;
+      break;
+
+    //----- cleanup pass
+    case jpxPassCleanup:
+      cover(67);
+      for (y0 = cb->y0, coeff0 = cb->coeffs, touched0 = cb->touched;
+          y0 < cb->y1;
+          y0 += 4, coeff0 += 4 * tileComp->w,
+            touched0 += 4 << tileComp->codeBlockW) {
+       for (x = cb->x0, coeff1 = coeff0, touched1 = touched0;
+            x < cb->x1;
+            ++x, ++coeff1, ++touched1) {
+         y1 = 0;
+         if (y0 + 3 < cb->y1 &&
+             !(*touched1) &&
+             !(touched1[tileComp->cbW]) &&
+             !(touched1[2 * tileComp->cbW]) &&
+             !(touched1[3 * tileComp->cbW]) &&
+             (x == cb->x0 || y0 == cb->y0 ||
+              !coeff1[-(int)tileComp->w - 1]) &&
+             (y0 == cb->y0 ||
+              !coeff1[-(int)tileComp->w]) &&
+             (x == cb->x1 - 1 || y0 == cb->y0 ||
+              !coeff1[-(int)tileComp->w + 1]) &&
+             (x == cb->x0 ||
+              (!coeff1[-1] &&
+               !coeff1[tileComp->w - 1] &&
+               !coeff1[2 * tileComp->w - 1] && 
+               !coeff1[3 * tileComp->w - 1])) &&
+             (x == cb->x1 - 1 ||
+              (!coeff1[1] &&
+               !coeff1[tileComp->w + 1] &&
+               !coeff1[2 * tileComp->w + 1] &&
+               !coeff1[3 * tileComp->w + 1])) &&
+             ((tileComp->codeBlockStyle & 0x08) ||
+              ((x == cb->x0 || y0+4 == cb->y1 ||
+                !coeff1[4 * tileComp->w - 1]) &&
+               (y0+4 == cb->y1 ||
+                !coeff1[4 * tileComp->w]) &&
+               (x == cb->x1 - 1 || y0+4 == cb->y1 ||
+                !coeff1[4 * tileComp->w + 1])))) {
+           if (cb->arithDecoder->decodeBit(jpxContextRunLength, cb->stats)) {
+             y1 = cb->arithDecoder->decodeBit(jpxContextUniform, cb->stats);
+             y1 = (y1 << 1) |
+                  cb->arithDecoder->decodeBit(jpxContextUniform, cb->stats);
+             coeff = &coeff1[y1 * tileComp->w];
+             cx = signContext[2][2][0];
+             xorBit = signContext[2][2][1];
+             if (cb->arithDecoder->decodeBit(cx, cb->stats) ^ xorBit) {
+               *coeff = -1;
+             } else {
+               *coeff = 1;
+             }
+             ++y1;
+           } else {
+             y1 = 4;
+           }
+         }
+         for (coeff = &coeff1[y1 * tileComp->w],
+                touched = &touched1[y1 << tileComp->codeBlockW];
+              y1 < 4 && y0 + y1 < cb->y1;
+              ++y1, coeff += tileComp->w, touched += tileComp->cbW) {
+           if (!*touched) {
+             horiz = vert = diag = 0;
+             horizSign = vertSign = 2;
+             if (x > cb->x0) {
+               if (coeff[-1]) {
+                 ++horiz;
+                 horizSign += coeff[-1] < 0 ? -1 : 1;
+               }
+               if (y0+y1 > cb->y0) {
+                 diag += coeff[-(int)tileComp->w - 1] ? 1 : 0;
+               }
+               if (y0+y1 < cb->y1 - 1 &&
+                   (!(tileComp->codeBlockStyle & 0x08) || y1 < 3)) {
+                 diag += coeff[tileComp->w - 1] ? 1 : 0;
+               }
+             }
+             if (x < cb->x1 - 1) {
+               if (coeff[1]) {
+                 ++horiz;
+                 horizSign += coeff[1] < 0 ? -1 : 1;
+               }
+               if (y0+y1 > cb->y0) {
+                 diag += coeff[-(int)tileComp->w + 1] ? 1 : 0;
+               }
+               if (y0+y1 < cb->y1 - 1 &&
+                   (!(tileComp->codeBlockStyle & 0x08) || y1 < 3)) {
+                 diag += coeff[tileComp->w + 1] ? 1 : 0;
+               }
+             }
+             if (y0+y1 > cb->y0) {
+               if (coeff[-(int)tileComp->w]) {
+                 ++vert;
+                 vertSign += coeff[-(int)tileComp->w] < 0 ? -1 : 1;
+               }
+             }
+             if (y0+y1 < cb->y1 - 1 &&
+                 (!(tileComp->codeBlockStyle & 0x08) || y1 < 3)) {
+               if (coeff[tileComp->w]) {
+                 ++vert;
+                 vertSign += coeff[tileComp->w] < 0 ? -1 : 1;
+               }
+             }
+             cx = sigPropContext[horiz][vert][diag][res == 0 ? 1 : sb];
+             if (cb->arithDecoder->decodeBit(cx, cb->stats)) {
+               cx = signContext[horizSign][vertSign][0];
+               xorBit = signContext[horizSign][vertSign][1];
+               if (cb->arithDecoder->decodeBit(cx, cb->stats) ^ xorBit) {
+                 *coeff = -1;
+               } else {
+                 *coeff = 1;
+               }
+             }
+           } else {
+             *touched = 0;
+           }
+         }
+       }
+      }
+      ++cb->len;
+      // look for a segmentation symbol
+      if (tileComp->codeBlockStyle & 0x20) {
+       segSym = cb->arithDecoder->decodeBit(jpxContextUniform,
+                                            cb->stats) << 3;
+       segSym |= cb->arithDecoder->decodeBit(jpxContextUniform,
+                                             cb->stats) << 2;
+       segSym |= cb->arithDecoder->decodeBit(jpxContextUniform,
+                                             cb->stats) << 1;
+       segSym |= cb->arithDecoder->decodeBit(jpxContextUniform,
+                                             cb->stats);
+       if (segSym != 0x0a) {
+         // in theory this should be a fatal error, but it seems to
+         // be problematic
+         error(errSyntaxWarning, getPos(),
+               "Missing or invalid segmentation symbol in JPX stream");
+       }
+      }
+      cb->nextPass = jpxPassSigProp;
+      break;
+    }
+
+    if (tileComp->codeBlockStyle & 0x02) {
+      cb->stats->reset();
+      cb->stats->setEntry(jpxContextSigProp, 4, 0);
+      cb->stats->setEntry(jpxContextRunLength, 3, 0);
+      cb->stats->setEntry(jpxContextUniform, 46, 0);
+    }
+
+    if (tileComp->codeBlockStyle & 0x04) {
+      cb->arithDecoder->cleanup();
+    }
+  }
+
+  cb->arithDecoder->cleanup();
+  return gTrue;
+}
+
+// Inverse quantization, and wavelet transform (IDWT).  This also does
+// the initial shift to convert to fixed point format.
+void JPXStream::inverseTransform(JPXTileComp *tileComp) {
+  JPXResLevel *resLevel;
+  JPXPrecinct *precinct;
+  JPXSubband *subband;
+  JPXCodeBlock *cb;
+  int *coeff0, *coeff;
+  char *touched0, *touched;
+  Guint qStyle, guard, eps, shift;
+  int shift2;
+  double mu;
+  int val;
+  Guint r, cbX, cbY, x, y;
+
+  cover(68);
+
+  //----- (NL)LL subband (resolution level 0)
+
+  resLevel = &tileComp->resLevels[0];
+  precinct = &resLevel->precincts[0];
+  subband = &precinct->subbands[0];
+
+  // i-quant parameters
+  qStyle = tileComp->quantStyle & 0x1f;
+  guard = (tileComp->quantStyle >> 5) & 7;
+  if (qStyle == 0) {
+    cover(69);
+    eps = (tileComp->quantSteps[0] >> 3) & 0x1f;
+    shift = guard + eps - 1;
+    mu = 0; // make gcc happy
+  } else {
+    cover(70);
+    shift = guard - 1 + tileComp->prec;
+    mu = (double)(0x800 + (tileComp->quantSteps[0] & 0x7ff)) / 2048.0;
+  }
+  if (tileComp->transform == 0) {
+    cover(71);
+    shift += fracBits;
+  }
+
+  // do fixed point adjustment and dequantization on (NL)LL
+  cb = subband->cbs;
+  for (cbY = 0; cbY < subband->nYCBs; ++cbY) {
+    for (cbX = 0; cbX < subband->nXCBs; ++cbX) {
+      for (y = cb->y0, coeff0 = cb->coeffs, touched0 = cb->touched;
+          y < cb->y1;
+          ++y, coeff0 += tileComp->w, touched0 += tileComp->cbW) {
+       for (x = cb->x0, coeff = coeff0, touched = touched0;
+            x < cb->x1;
+            ++x, ++coeff, ++touched) {
+         val = *coeff;
+         if (val != 0) {
+           shift2 = shift - (cb->nZeroBitPlanes + cb->len + *touched);
+           if (shift2 > 0) {
+             cover(94);
+             if (val < 0) {
+               val = (val << shift2) - (1 << (shift2 - 1));
+             } else {
+               val = (val << shift2) + (1 << (shift2 - 1));
+             }
+           } else {
+             cover(95);
+             val >>= -shift2;
+           }
+           if (qStyle == 0) {
+             cover(96);
+             if (tileComp->transform == 0) {
+               cover(97);
+               val &= -1 << fracBits;
+             }
+           } else {
+             cover(98);
+             val = (int)((double)val * mu);
+           }
+         }
+         *coeff = val;
+       }
+      }
+      ++cb;
+    }
+  }
+
+  //----- IDWT for each level
+
+  for (r = 1; r <= tileComp->nDecompLevels; ++r) {
+    resLevel = &tileComp->resLevels[r];
+
+    // (n)LL is already in the upper-left corner of the
+    // tile-component data array -- interleave with (n)HL/LH/HH
+    // and inverse transform to get (n-1)LL, which will be stored
+    // in the upper-left corner of the tile-component data array
+    inverseTransformLevel(tileComp, r, resLevel);
+  }
+}
+
+// Do one level of the inverse transform:
+// - take (n)LL, (n)HL, (n)LH, and (n)HH from the upper-left corner
+//   of the tile-component data array
+// - leave the resulting (n-1)LL in the same place
+void JPXStream::inverseTransformLevel(JPXTileComp *tileComp,
+                                     Guint r, JPXResLevel *resLevel) {
+  JPXPrecinct *precinct;
+  JPXSubband *subband;
+  JPXCodeBlock *cb;
+  int *coeff0, *coeff;
+  char *touched0, *touched;
+  Guint qStyle, guard, eps, shift, t;
+  int shift2;
+  double mu;
+  int val;
+  int *dataPtr, *bufPtr;
+  Guint nx1, nx2, ny1, ny2, offset;
+  Guint x, y, sb, cbX, cbY;
+
+  //----- fixed-point adjustment and dequantization
+
+  qStyle = tileComp->quantStyle & 0x1f;
+  guard = (tileComp->quantStyle >> 5) & 7;
+  precinct = &resLevel->precincts[0];
+  for (sb = 0; sb < 3; ++sb) {
+
+    // i-quant parameters
+    if (qStyle == 0) {
+      cover(100);
+      eps = (tileComp->quantSteps[3*r - 2 + sb] >> 3) & 0x1f;
+      shift = guard + eps - 1;
+      mu = 0; // make gcc happy
+    } else {
+      cover(101);
+      shift = guard + tileComp->prec;
+      if (sb == 2) {
+       cover(102);
+       ++shift;
+      }
+      const Guint stepIndex = qStyle == 1 ? 0 : (3*r - 2 + sb);
+      if (unlikely(stepIndex >= tileComp->nQuantSteps)) {
+       error(errSyntaxError, getPos(),
+             "Wrong index for quantSteps in inverseTransformLevel in JPX stream");
+       break;
+      }
+      t = tileComp->quantSteps[stepIndex];
+      mu = (double)(0x800 + (t & 0x7ff)) / 2048.0;
+    }
+    if (tileComp->transform == 0) {
+      cover(103);
+      shift += fracBits;
+    }
+
+    // fixed point adjustment and dequantization
+    subband = &precinct->subbands[sb];
+    cb = subband->cbs;
+    for (cbY = 0; cbY < subband->nYCBs; ++cbY) {
+      for (cbX = 0; cbX < subband->nXCBs; ++cbX) {
+       for (y = cb->y0, coeff0 = cb->coeffs, touched0 = cb->touched;
+            y < cb->y1;
+            ++y, coeff0 += tileComp->w, touched0 += tileComp->cbW) {
+         for (x = cb->x0, coeff = coeff0, touched = touched0;
+              x < cb->x1;
+              ++x, ++coeff, ++touched) {
+           val = *coeff;
+           if (val != 0) {
+             shift2 = shift - (cb->nZeroBitPlanes + cb->len + *touched);
+             if (shift2 > 0) {
+               cover(74);
+               if (val < 0) {
+                 val = (val << shift2) - (1 << (shift2 - 1));
+               } else {
+                 val = (val << shift2) + (1 << (shift2 - 1));
+               }
+             } else {
+               cover(75);
+               val >>= -shift2;
+             }
+             if (qStyle == 0) {
+               cover(76);
+               if (tileComp->transform == 0) {
+                 val &= -1 << fracBits;
+               }
+             } else {
+               cover(77);
+               val = (int)((double)val * mu);
+             }
+           }
+           *coeff = val;
+         }
+       }
+       ++cb;
+      }
+    }
+  }
+
+  //----- inverse transform
+
+  // compute the subband bounds:
+  //    0   nx1  nx2
+  //    |    |    |
+  //    v    v    v
+  //   +----+----+
+  //   | LL | HL | <- 0
+  //   +----+----+
+  //   | LH | HH | <- ny1
+  //   +----+----+
+  //               <- ny2
+  nx1 = precinct->subbands[1].x1 - precinct->subbands[1].x0;
+  nx2 = nx1 + precinct->subbands[0].x1 - precinct->subbands[0].x0;
+  ny1 = precinct->subbands[0].y1 - precinct->subbands[0].y0;
+  ny2 = ny1 + precinct->subbands[1].y1 - precinct->subbands[1].y0;
+
+  // horizontal (row) transforms
+  if (r == tileComp->nDecompLevels) {
+    offset = 3 + (tileComp->x0 & 1);
+  } else {
+    offset = 3 + (tileComp->resLevels[r+1].x0 & 1);
+  }
+  for (y = 0, dataPtr = tileComp->data; y < ny2; ++y, dataPtr += tileComp->w) {
+    if (precinct->subbands[0].x0 == precinct->subbands[1].x0) {
+      // fetch LL/LH
+      for (x = 0, bufPtr = tileComp->buf + offset;
+          x < nx1;
+          ++x, bufPtr += 2) {
+       *bufPtr = dataPtr[x];
+      }
+      // fetch HL/HH
+      for (x = nx1, bufPtr = tileComp->buf + offset + 1;
+          x < nx2;
+          ++x, bufPtr += 2) {
+       *bufPtr = dataPtr[x];
+      }
+    } else {
+      // fetch LL/LH
+      for (x = 0, bufPtr = tileComp->buf + offset + 1;
+          x < nx1;
+          ++x, bufPtr += 2) {
+       *bufPtr = dataPtr[x];
+      }
+      // fetch HL/HH
+      for (x = nx1, bufPtr = tileComp->buf + offset;
+          x < nx2;
+          ++x, bufPtr += 2) {
+       *bufPtr = dataPtr[x];
+      }
+    }
+    inverseTransform1D(tileComp, tileComp->buf, offset, nx2);
+    for (x = 0, bufPtr = tileComp->buf + offset; x < nx2; ++x, ++bufPtr) {
+      dataPtr[x] = *bufPtr;
+    }
+  }
+
+  // vertical (column) transforms
+  if (r == tileComp->nDecompLevels) {
+    offset = 3 + (tileComp->y0 & 1);
+  } else {
+    offset = 3 + (tileComp->resLevels[r+1].y0 & 1);
+  }
+  for (x = 0, dataPtr = tileComp->data; x < nx2; ++x, ++dataPtr) {
+    if (precinct->subbands[1].y0 == precinct->subbands[0].y0) {
+      // fetch LL/HL
+      for (y = 0, bufPtr = tileComp->buf + offset;
+          y < ny1;
+          ++y, bufPtr += 2) {
+       *bufPtr = dataPtr[y * tileComp->w];
+      }
+      // fetch LH/HH
+      for (y = ny1, bufPtr = tileComp->buf + offset + 1;
+          y < ny2;
+          ++y, bufPtr += 2) {
+       *bufPtr = dataPtr[y * tileComp->w];
+      }
+    } else {
+      // fetch LL/HL
+      for (y = 0, bufPtr = tileComp->buf + offset + 1;
+          y < ny1;
+          ++y, bufPtr += 2) {
+       *bufPtr = dataPtr[y * tileComp->w];
+      }
+      // fetch LH/HH
+      for (y = ny1, bufPtr = tileComp->buf + offset;
+          y < ny2;
+          ++y, bufPtr += 2) {
+       *bufPtr = dataPtr[y * tileComp->w];
+      }
+    }
+    inverseTransform1D(tileComp, tileComp->buf, offset, ny2);
+    for (y = 0, bufPtr = tileComp->buf + offset; y < ny2; ++y, ++bufPtr) {
+      dataPtr[y * tileComp->w] = *bufPtr;
+    }
+  }
+}
+
+void JPXStream::inverseTransform1D(JPXTileComp *tileComp, int *data,
+                                  Guint offset, Guint n) {
+  Guint end, i;
+
+  //----- special case for length = 1
+  if (n == 1) {
+    cover(79);
+    if (offset == 4) {
+      cover(104);
+      *data >>= 1;
+    }
+
+  } else {
+    cover(80);
+
+    end = offset + n;
+
+    //----- extend right
+    data[end] = data[end - 2];
+    if (n == 2) {
+      cover(81);
+      data[end+1] = data[offset + 1];
+      data[end+2] = data[offset];
+      data[end+3] = data[offset + 1];
+    } else {
+      cover(82);
+      data[end+1] = data[end - 3];
+      if (n == 3) {
+       cover(105);
+       data[end+2] = data[offset + 1];
+       data[end+3] = data[offset + 2];
+      } else {
+       cover(106);
+       data[end+2] = data[end - 4];
+       if (n == 4) {
+         cover(107);
+         data[end+3] = data[offset + 1];
+       } else {
+         cover(108);
+         data[end+3] = data[end - 5];
+       }
+      }
+    }
+
+    //----- extend left
+    data[offset - 1] = data[offset + 1];
+    data[offset - 2] = data[offset + 2];
+    data[offset - 3] = data[offset + 3];
+    if (offset == 4) {
+      cover(83);
+      data[0] = data[offset + 4];
+    }
+
+    //----- 9-7 irreversible filter
+
+    if (tileComp->transform == 0) {
+      cover(84);
+      // step 1 (even)
+      for (i = 1; i <= end + 2; i += 2) {
+       data[i] = (int)(idwtKappa * data[i]);
+      }
+      // step 2 (odd)
+      for (i = 0; i <= end + 3; i += 2) {
+       data[i] = (int)(idwtIKappa * data[i]);
+      }
+      // step 3 (even)
+      for (i = 1; i <= end + 2; i += 2) {
+       data[i] = (int)(data[i] - idwtDelta * (data[i-1] + data[i+1]));
+      }
+      // step 4 (odd)
+      for (i = 2; i <= end + 1; i += 2) {
+       data[i] = (int)(data[i] - idwtGamma * (data[i-1] + data[i+1]));
+      }
+      // step 5 (even)
+      for (i = 3; i <= end; i += 2) {
+       data[i] = (int)(data[i] - idwtBeta * (data[i-1] + data[i+1]));
+      }
+      // step 6 (odd)
+      for (i = 4; i <= end - 1; i += 2) {
+       data[i] = (int)(data[i] - idwtAlpha * (data[i-1] + data[i+1]));
+      }
+
+    //----- 5-3 reversible filter
+
+    } else {
+      cover(85);
+      // step 1 (even)
+      for (i = 3; i <= end; i += 2) {
+       data[i] -= (data[i-1] + data[i+1] + 2) >> 2;
+      }
+      // step 2 (odd)
+      for (i = 4; i < end; i += 2) {
+       data[i] += (data[i-1] + data[i+1]) >> 1;
+      }
+    }
+  }
+}
+
+// Inverse multi-component transform and DC level shift.  This also
+// converts fixed point samples back to integers.
+GBool JPXStream::inverseMultiCompAndDC(JPXTile *tile) {
+  JPXTileComp *tileComp;
+  int coeff, d0, d1, d2, t, minVal, maxVal, zeroVal;
+  int *dataPtr;
+  Guint j, comp, x, y;
+
+  //----- inverse multi-component transform
+
+  if (tile->multiComp == 1) {
+    cover(86);
+    if (img.nComps < 3 ||
+       tile->tileComps[0].hSep != tile->tileComps[1].hSep ||
+       tile->tileComps[0].vSep != tile->tileComps[1].vSep ||
+       tile->tileComps[1].hSep != tile->tileComps[2].hSep ||
+       tile->tileComps[1].vSep != tile->tileComps[2].vSep) {
+      return gFalse;
+    }
+
+    // inverse irreversible multiple component transform
+    if (tile->tileComps[0].transform == 0) {
+      cover(87);
+      j = 0;
+      for (y = 0; y < tile->tileComps[0].y1 - tile->tileComps[0].y0; ++y) {
+       for (x = 0; x < tile->tileComps[0].x1 - tile->tileComps[0].x0; ++x) {
+         d0 = tile->tileComps[0].data[j];
+         d1 = tile->tileComps[1].data[j];
+         d2 = tile->tileComps[2].data[j];
+         tile->tileComps[0].data[j] = (int)(d0 + 1.402 * d2 + 0.5);
+         tile->tileComps[1].data[j] =
+             (int)(d0 - 0.34413 * d1 - 0.71414 * d2 + 0.5);
+         tile->tileComps[2].data[j] = (int)(d0 + 1.772 * d1 + 0.5);
+         ++j;
+       }
+      }
+
+    // inverse reversible multiple component transform
+    } else {
+      cover(88);
+      j = 0;
+      for (y = 0; y < tile->tileComps[0].y1 - tile->tileComps[0].y0; ++y) {
+       for (x = 0; x < tile->tileComps[0].x1 - tile->tileComps[0].x0; ++x) {
+         d0 = tile->tileComps[0].data[j];
+         d1 = tile->tileComps[1].data[j];
+         d2 = tile->tileComps[2].data[j];
+         tile->tileComps[1].data[j] = t = d0 - ((d2 + d1) >> 2);
+         tile->tileComps[0].data[j] = d2 + t;
+         tile->tileComps[2].data[j] = d1 + t;
+         ++j;
+       }
+      }
+    }
+  }
+
+  //----- DC level shift
+  for (comp = 0; comp < img.nComps; ++comp) {
+    tileComp = &tile->tileComps[comp];
+
+    // signed: clip
+    if (tileComp->sgned) {
+      cover(89);
+      minVal = -(1 << (tileComp->prec - 1));
+      maxVal = (1 << (tileComp->prec - 1)) - 1;
+      dataPtr = tileComp->data;
+      for (y = 0; y < tileComp->y1 - tileComp->y0; ++y) {
+       for (x = 0; x < tileComp->x1 - tileComp->x0; ++x) {
+         coeff = *dataPtr;
+         if (tileComp->transform == 0) {
+           cover(109);
+           coeff >>= fracBits;
+         }
+         if (coeff < minVal) {
+           cover(110);
+           coeff = minVal;
+         } else if (coeff > maxVal) {
+           cover(111);
+           coeff = maxVal;
+         }
+         *dataPtr++ = coeff;
+       }
+      }
+
+    // unsigned: inverse DC level shift and clip
+    } else {
+      cover(90);
+      maxVal = (1 << tileComp->prec) - 1;
+      zeroVal = 1 << (tileComp->prec - 1);
+      dataPtr = tileComp->data;
+      for (y = 0; y < tileComp->y1 - tileComp->y0; ++y) {
+       for (x = 0; x < tileComp->x1 - tileComp->x0; ++x) {
+         coeff = *dataPtr;
+         if (tileComp->transform == 0) {
+           cover(112);
+           coeff >>= fracBits;
+         }
+         coeff += zeroVal;
+         if (coeff < 0) {
+           cover(113);
+           coeff = 0;
+         } else if (coeff > maxVal) {
+           cover(114);
+           coeff = maxVal;
+         }
+         *dataPtr++ = coeff;
+       }
+      }
+    }
+  }
+
+  return gTrue;
+}
+
+GBool JPXStream::readBoxHdr(Guint *boxType, Guint *boxLen, Guint *dataLen) {
+  Guint len, lenH;
+
+  if (!readULong(&len) ||
+      !readULong(boxType)) {
+    return gFalse;
+  }
+  if (len == 1) {
+    if (!readULong(&lenH) || !readULong(&len)) {
+      return gFalse;
+    }
+    if (lenH) {
+      error(errSyntaxError, getPos(),
+           "JPX stream contains a box larger than 2^32 bytes");
+      return gFalse;
+    }
+    *boxLen = len;
+    *dataLen = len - 16;
+  } else if (len == 0) {
+    *boxLen = 0;
+    *dataLen = 0;
+  } else {
+    *boxLen = len;
+    *dataLen = len - 8;
+  }
+  return gTrue;
+}
+
+int JPXStream::readMarkerHdr(int *segType, Guint *segLen) {
+  int c;
+
+  do {
+    do {
+      if ((c = bufStr->getChar()) == EOF) {
+       return gFalse;
+      }
+    } while (c != 0xff);
+    do {
+      if ((c = bufStr->getChar()) == EOF) {
+       return gFalse;
+      }
+    } while (c == 0xff);
+  } while (c == 0x00);
+  *segType = c;
+  if ((c >= 0x30 && c <= 0x3f) ||
+      c == 0x4f || c == 0x92 || c == 0x93 || c == 0xd9) {
+    *segLen = 0;
+    return gTrue;
+  }
+  return readUWord(segLen);
+}
+
+GBool JPXStream::readUByte(Guint *x) {
+  int c0;
+
+  if ((c0 = bufStr->getChar()) == EOF) {
+    return gFalse;
+  }
+  *x = (Guint)c0;
+  return gTrue;
+}
+
+GBool JPXStream::readByte(int *x) {
+ int c0;
+
+  if ((c0 = bufStr->getChar()) == EOF) {
+    return gFalse;
+  }
+  *x = c0;
+  if (c0 & 0x80) {
+    *x |= -1 - 0xff;
+  }
+  return gTrue;
+}
+
+GBool JPXStream::readUWord(Guint *x) {
+  int c0, c1;
+
+  if ((c0 = bufStr->getChar()) == EOF ||
+      (c1 = bufStr->getChar()) == EOF) {
+    return gFalse;
+  }
+  *x = (Guint)((c0 << 8) | c1);
+  return gTrue;
+}
+
+GBool JPXStream::readULong(Guint *x) {
+  int c0, c1, c2, c3;
+
+  if ((c0 = bufStr->getChar()) == EOF ||
+      (c1 = bufStr->getChar()) == EOF ||
+      (c2 = bufStr->getChar()) == EOF ||
+      (c3 = bufStr->getChar()) == EOF) {
+    return gFalse;
+  }
+  *x = (Guint)((c0 << 24) | (c1 << 16) | (c2 << 8) | c3);
+  return gTrue;
+}
+
+GBool JPXStream::readNBytes(int nBytes, GBool signd, int *x) {
+  int y, c, i;
+
+  y = 0;
+  for (i = 0; i < nBytes; ++i) {
+    if ((c = bufStr->getChar()) == EOF) {
+      return gFalse;
+    }
+    y = (y << 8) + c;
+  }
+  if (signd) {
+    if (y & (1 << (8 * nBytes - 1))) {
+      y |= -1 << (8 * nBytes);
+    }
+  }
+  *x = y;
+  return gTrue;
+}
+
+void JPXStream::startBitBuf(Guint byteCountA) {
+  bitBufLen = 0;
+  bitBufSkip = gFalse;
+  byteCount = byteCountA;
+}
+
+GBool JPXStream::readBits(int nBits, Guint *x) {
+  int c;
+
+  while (bitBufLen < nBits) {
+    if (byteCount == 0 || (c = bufStr->getChar()) == EOF) {
+      return gFalse;
+    }
+    --byteCount;
+    if (bitBufSkip) {
+      bitBuf = (bitBuf << 7) | (c & 0x7f);
+      bitBufLen += 7;
+    } else {
+      bitBuf = (bitBuf << 8) | (c & 0xff);
+      bitBufLen += 8;
+    }
+    bitBufSkip = c == 0xff;
+  }
+  *x = (bitBuf >> (bitBufLen - nBits)) & ((1 << nBits) - 1);
+  bitBufLen -= nBits;
+  return gTrue;
+}
+
+void JPXStream::skipSOP() {
+  int i;
+
+  // SOP occurs at the start of the packet header, so we don't need to
+  // worry about bit-stuff prior to it
+  if (byteCount >= 6 &&
+      bufStr->lookChar(0) == 0xff &&
+      bufStr->lookChar(1) == 0x91) {
+    for (i = 0; i < 6; ++i) {
+      bufStr->getChar();
+    }
+    byteCount -= 6;
+    bitBufLen = 0;
+    bitBufSkip = gFalse;
+  }
+}
+
+void JPXStream::skipEPH() {
+  int i, k;
+
+  k = bitBufSkip ? 1 : 0;
+  if (byteCount >= (Guint)(k + 2) &&
+      bufStr->lookChar(k) == 0xff &&
+      bufStr->lookChar(k + 1) == 0x92) {
+    for (i = 0; i < k + 2; ++i) {
+      bufStr->getChar();
+    }
+    byteCount -= k + 2;
+    bitBufLen = 0;
+    bitBufSkip = gFalse;
+  }
+}
+
+Guint JPXStream::finishBitBuf() {
+  if (bitBufSkip) {
+    bufStr->getChar();
+    --byteCount;
+  }
+  return byteCount;
+}
diff --git a/poppler/JPXStream.h b/poppler/JPXStream.h
new file mode 100644 (file)
index 0000000..3085543
--- /dev/null
@@ -0,0 +1,338 @@
+//========================================================================
+//
+// JPXStream.h
+//
+// Copyright 2002-2003 Glyph & Cog, LLC
+//
+//========================================================================
+
+#ifndef JPXSTREAM_H
+#define JPXSTREAM_H
+
+#ifdef USE_GCC_PRAGMAS
+#pragma interface
+#endif
+
+#include "goo/gtypes.h"
+#include "Object.h"
+#include "Stream.h"
+
+class JArithmeticDecoder;
+class JArithmeticDecoderStats;
+
+//------------------------------------------------------------------------
+
+enum JPXColorSpaceType {
+  jpxCSBiLevel = 0,
+  jpxCSYCbCr1 = 1,
+  jpxCSYCbCr2 = 3,
+  jpxCSYCBCr3 = 4,
+  jpxCSPhotoYCC = 9,
+  jpxCSCMY = 11,
+  jpxCSCMYK = 12,
+  jpxCSYCCK = 13,
+  jpxCSCIELab = 14,
+  jpxCSsRGB = 16,
+  jpxCSGrayscale = 17,
+  jpxCSBiLevel2 = 18,
+  jpxCSCIEJab = 19,
+  jpxCSCISesRGB = 20,
+  jpxCSROMMRGB = 21,
+  jpxCSsRGBYCbCr = 22,
+  jpxCSYPbPr1125 = 23,
+  jpxCSYPbPr1250 = 24
+};
+
+struct JPXColorSpecCIELab {
+  Guint rl, ol, ra, oa, rb, ob, il;
+};
+
+struct JPXColorSpecEnumerated {
+  JPXColorSpaceType type;      // color space type
+  union {
+    JPXColorSpecCIELab cieLab;
+  };
+};
+
+struct JPXColorSpec {
+  Guint meth;                  // method
+  int prec;                    // precedence
+  union {
+    JPXColorSpecEnumerated enumerated;
+  };
+};
+
+//------------------------------------------------------------------------
+
+struct JPXPalette {
+  Guint nEntries;              // number of entries in the palette
+  Guint nComps;                        // number of components in each entry
+  Guint *bpc;                  // bits per component, for each component
+  int *c;                      // color data:
+                               //   c[i*nComps+j] = entry i, component j
+};
+
+//------------------------------------------------------------------------
+
+struct JPXCompMap {
+  Guint nChannels;             // number of channels
+  Guint *comp;                 // codestream components mapped to each channel
+  Guint *type;                 // 0 for direct use, 1 for palette mapping
+  Guint *pComp;                        // palette components to use
+};
+
+//------------------------------------------------------------------------
+
+struct JPXChannelDefn {
+  Guint nChannels;             // number of channels
+  Guint *idx;                  // channel indexes
+  Guint *type;                 // channel types
+  Guint *assoc;                        // channel associations
+};
+
+//------------------------------------------------------------------------
+
+struct JPXTagTreeNode {
+  GBool finished;              // true if this node is finished
+  Guint val;                   // current value
+};
+
+//------------------------------------------------------------------------
+
+struct JPXCodeBlock {
+  //----- size
+  Guint x0, y0, x1, y1;                // bounds
+
+  //----- persistent state
+  GBool seen;                  // true if this code-block has already
+                               //   been seen
+  Guint lBlock;                        // base number of bits used for pkt data length
+  Guint nextPass;              // next coding pass
+
+  //---- info from first packet
+  Guint nZeroBitPlanes;                // number of zero bit planes
+
+  //----- info for the current packet
+  Guint included;              // code-block inclusion in this packet:
+                               //   0=not included, 1=included
+  Guint nCodingPasses;         // number of coding passes in this pkt
+  Guint *dataLen;              // data lengths (one per codeword segment)
+  Guint dataLenSize;           // size of the dataLen array
+
+  //----- coefficient data
+  int *coeffs;
+  char *touched;               // coefficient 'touched' flags
+  Gushort len;                 // coefficient length
+  JArithmeticDecoder           // arithmetic decoder
+    *arithDecoder;
+  JArithmeticDecoderStats      // arithmetic decoder stats
+    *stats;
+};
+
+//------------------------------------------------------------------------
+
+struct JPXSubband {
+  //----- computed
+  Guint x0, y0, x1, y1;                // bounds
+  Guint nXCBs, nYCBs;          // number of code-blocks in the x and y
+                               //   directions
+
+  //----- tag trees
+  Guint maxTTLevel;            // max tag tree level
+  JPXTagTreeNode *inclusion;   // inclusion tag tree for each subband
+  JPXTagTreeNode *zeroBitPlane;        // zero-bit plane tag tree for each
+                               //   subband
+
+  //----- children
+  JPXCodeBlock *cbs;           // the code-blocks (len = nXCBs * nYCBs)
+};
+
+//------------------------------------------------------------------------
+
+struct JPXPrecinct {
+  //----- computed
+  Guint x0, y0, x1, y1;                // bounds of the precinct
+
+  //----- children
+  JPXSubband *subbands;                // the subbands
+};
+
+//------------------------------------------------------------------------
+
+struct JPXResLevel {
+  //----- from the COD and COC segments (main and tile)
+  Guint precinctWidth;         // log2(precinct width)
+  Guint precinctHeight;                // log2(precinct height)
+
+  //----- computed
+  Guint x0, y0, x1, y1;                // bounds of the tile-comp (for this res level)
+  Guint bx0[3], by0[3],                // subband bounds
+        bx1[3], by1[3];
+
+  //---- children
+  JPXPrecinct *precincts;      // the precincts
+};
+
+//------------------------------------------------------------------------
+
+struct JPXTileComp {
+  //----- from the SIZ segment
+  GBool sgned;                 // 1 for signed, 0 for unsigned
+  Guint prec;                  // precision, in bits
+  Guint hSep;                  // horizontal separation of samples
+  Guint vSep;                  // vertical separation of samples
+
+  //----- from the COD and COC segments (main and tile)
+  Guint style;                 // coding style parameter (Scod / Scoc)
+  Guint nDecompLevels;         // number of decomposition levels
+  Guint codeBlockW;            // log2(code-block width)
+  Guint codeBlockH;            // log2(code-block height)
+  Guint codeBlockStyle;                // code-block style
+  Guint transform;             // wavelet transformation
+
+  //----- from the QCD and QCC segments (main and tile)
+  Guint quantStyle;            // quantization style
+  Guint *quantSteps;           // quantization step size for each subband
+  Guint nQuantSteps;           // number of entries in quantSteps
+
+  //----- computed
+  Guint x0, y0, x1, y1;                // bounds of the tile-comp, in ref coords
+  Guint w;                     // x1 - x0
+  Guint cbW;                   // code-block width
+  Guint cbH;                   // code-block height
+
+  //----- image data
+  int *data;                   // the decoded image data
+  int *buf;                    // intermediate buffer for the inverse
+                               //   transform
+
+  //----- children
+  JPXResLevel *resLevels;      // the resolution levels
+                               //   (len = nDecompLevels + 1)
+};
+
+//------------------------------------------------------------------------
+
+struct JPXTile {
+  GBool init;
+
+  //----- from the COD segments (main and tile)
+  Guint progOrder;             // progression order
+  Guint nLayers;               // number of layers
+  Guint multiComp;             // multiple component transformation
+
+  //----- computed
+  Guint x0, y0, x1, y1;                // bounds of the tile, in ref coords
+  Guint maxNDecompLevels;      // max number of decomposition levels used
+                               //   in any component in this tile
+
+  //----- progression order loop counters
+  Guint comp;                  //   component
+  Guint res;                   //   resolution level
+  Guint precinct;              //   precinct
+  Guint layer;                 //   layer
+
+  //----- children
+  JPXTileComp *tileComps;      // the tile-components (len = JPXImage.nComps)
+};
+
+//------------------------------------------------------------------------
+
+struct JPXImage {
+  //----- from the SIZ segment
+  Guint xSize, ySize;          // size of reference grid
+  Guint xOffset, yOffset;      // image offset
+  Guint xTileSize, yTileSize;  // size of tiles
+  Guint xTileOffset,           // offset of first tile
+        yTileOffset;
+  Guint nComps;                        // number of components
+
+  //----- computed
+  Guint nXTiles;               // number of tiles in x direction
+  Guint nYTiles;               // number of tiles in y direction
+
+  //----- children
+  JPXTile *tiles;              // the tiles (len = nXTiles * nYTiles)
+};
+
+//------------------------------------------------------------------------
+
+class JPXStream: public FilterStream {
+public:
+
+  JPXStream(Stream *strA);
+  virtual ~JPXStream();
+  virtual StreamKind getKind() { return strJPX; }
+  virtual void reset();
+  virtual void close();
+  virtual int getChar();
+  virtual int lookChar();
+  virtual GooString *getPSFilter(int psLevel, const char *indent);
+  virtual GBool isBinary(GBool last = gTrue);
+  virtual void getImageParams(int *bitsPerComponent,
+                             StreamColorSpaceMode *csMode);
+
+private:
+
+  void fillReadBuf();
+  void getImageParams2(int *bitsPerComponent, StreamColorSpaceMode *csMode);
+  GBool readBoxes();
+  GBool readColorSpecBox(Guint dataLen);
+  GBool readCodestream(Guint len);
+  GBool readTilePart();
+  GBool readTilePartData(Guint tileIdx,
+                        Guint tilePartLen, GBool tilePartToEOC);
+  GBool readCodeBlockData(JPXTileComp *tileComp,
+                         JPXResLevel *resLevel,
+                         JPXPrecinct *precinct,
+                         JPXSubband *subband,
+                         Guint res, Guint sb,
+                         JPXCodeBlock *cb);
+  void inverseTransform(JPXTileComp *tileComp);
+  void inverseTransformLevel(JPXTileComp *tileComp,
+                            Guint r, JPXResLevel *resLevel);
+  void inverseTransform1D(JPXTileComp *tileComp, int *data,
+                         Guint offset, Guint n);
+  GBool inverseMultiCompAndDC(JPXTile *tile);
+  GBool readBoxHdr(Guint *boxType, Guint *boxLen, Guint *dataLen);
+  int readMarkerHdr(int *segType, Guint *segLen);
+  GBool readUByte(Guint *x);
+  GBool readByte(int *x);
+  GBool readUWord(Guint *x);
+  GBool readULong(Guint *x);
+  GBool readNBytes(int nBytes, GBool signd, int *x);
+  void startBitBuf(Guint byteCountA);
+  GBool readBits(int nBits, Guint *x);
+  void skipSOP();
+  void skipEPH();
+  Guint finishBitBuf();
+
+  BufStream *bufStr;           // buffered stream (for lookahead)
+
+  Guint nComps;                        // number of components
+  Guint *bpc;                  // bits per component, for each component
+  Guint width, height;         // image size
+  GBool haveImgHdr;            // set if a JP2/JPX image header has been
+                               //   found
+  JPXColorSpec cs;             // color specification
+  GBool haveCS;                        // set if a color spec has been found
+  JPXPalette palette;          // the palette
+  GBool havePalette;           // set if a palette has been found
+  JPXCompMap compMap;          // the component mapping
+  GBool haveCompMap;           // set if a component mapping has been found
+  JPXChannelDefn channelDefn;  // channel definition
+  GBool haveChannelDefn;       // set if a channel defn has been found
+
+  JPXImage img;                        // JPEG2000 decoder data
+  Guint bitBuf;                        // buffer for bit reads
+  int bitBufLen;               // number of bits in bitBuf
+  GBool bitBufSkip;            // true if next bit should be skipped
+                               //   (for bit stuffing)
+  Guint byteCount;             // number of available bytes left
+
+  Guint curX, curY, curComp;   // current position for lookChar/getChar
+  Guint readBuf;               // read buffer
+  Guint readBufLen;            // number of valid bits in readBuf
+};
+
+#endif
diff --git a/poppler/Lexer.cc b/poppler/Lexer.cc
new file mode 100644 (file)
index 0000000..d12e2e8
--- /dev/null
@@ -0,0 +1,598 @@
+//========================================================================
+//
+// Lexer.cc
+//
+// Copyright 1996-2003 Glyph & Cog, LLC
+//
+//========================================================================
+
+//========================================================================
+//
+// Modified under the Poppler project - http://poppler.freedesktop.org
+//
+// All changes made under the Poppler project to this file are licensed
+// under GPL version 2 or later
+//
+// Copyright (C) 2006-2010 Albert Astals Cid <aacid@kde.org>
+// Copyright (C) 2006 Krzysztof Kowalczyk <kkowalczyk@gmail.com>
+// Copyright (C) 2010 Carlos Garcia Campos <carlosgc@gnome.org>
+// Copyright (C) 2012 Adrian Johnson <ajohnson@redneon.com>
+//
+// To see a description of the changes please see the Changelog file that
+// came with your tarball or type make ChangeLog if you are building from git
+//
+//========================================================================
+
+#include <config.h>
+
+#ifdef USE_GCC_PRAGMAS
+#pragma implementation
+#endif
+
+#include <stdlib.h>
+#include <stddef.h>
+#include <string.h>
+#include <limits.h>
+#include <ctype.h>
+#include "Lexer.h"
+#include "Error.h"
+#include "XRef.h"
+
+//------------------------------------------------------------------------
+
+// A '1' in this array means the character is white space.  A '1' or
+// '2' means the character ends a name or command.
+static const char specialChars[256] = {
+  1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0,   // 0x
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,   // 1x
+  1, 0, 0, 0, 0, 2, 0, 0, 2, 2, 0, 0, 0, 0, 0, 2,   // 2x
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 2, 0,   // 3x
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,   // 4x
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 2, 0, 0,   // 5x
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,   // 6x
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 2, 0, 0,   // 7x
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,   // 8x
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,   // 9x
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,   // ax
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,   // bx
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,   // cx
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,   // dx
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,   // ex
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0    // fx
+};
+
+static const int IntegerSafeLimit = (INT_MAX - 9) / 10;
+
+//------------------------------------------------------------------------
+// Lexer
+//------------------------------------------------------------------------
+
+Lexer::Lexer(XRef *xrefA, Stream *str) {
+  Object obj;
+
+  lookCharLastValueCached = LOOK_VALUE_NOT_CACHED;
+  xref = xrefA;
+
+  curStr.initStream(str);
+  streams = new Array(xref);
+  streams->add(curStr.copy(&obj));
+  strPtr = 0;
+  freeArray = gTrue;
+  curStr.streamReset();
+}
+
+Lexer::Lexer(XRef *xrefA, Object *obj) {
+  Object obj2;
+
+  lookCharLastValueCached = LOOK_VALUE_NOT_CACHED;
+  xref = xrefA;
+
+  if (obj->isStream()) {
+    streams = new Array(xref);
+    freeArray = gTrue;
+    streams->add(obj->copy(&obj2));
+  } else {
+    streams = obj->getArray();
+    freeArray = gFalse;
+  }
+  strPtr = 0;
+  if (streams->getLength() > 0) {
+    streams->get(strPtr, &curStr);
+    curStr.streamReset();
+  }
+}
+
+Lexer::~Lexer() {
+  if (!curStr.isNone()) {
+    curStr.streamClose();
+    curStr.free();
+  }
+  if (freeArray) {
+    delete streams;
+  }
+}
+
+int Lexer::getChar(GBool comesFromLook) {
+  int c;
+
+  if (LOOK_VALUE_NOT_CACHED != lookCharLastValueCached) {
+    c = lookCharLastValueCached;
+    lookCharLastValueCached = LOOK_VALUE_NOT_CACHED;
+    return c;
+  }
+
+  c = EOF;
+  while (!curStr.isNone() && (c = curStr.streamGetChar()) == EOF) {
+    if (comesFromLook == gTrue) {
+      return EOF;
+    } else {
+      curStr.streamClose();
+      curStr.free();
+      ++strPtr;
+      if (strPtr < streams->getLength()) {
+        streams->get(strPtr, &curStr);
+        curStr.streamReset();
+      }
+    }
+  }
+  return c;
+}
+
+int Lexer::lookChar() {
+  
+  if (LOOK_VALUE_NOT_CACHED != lookCharLastValueCached) {
+    return lookCharLastValueCached;
+  }
+  lookCharLastValueCached = getChar(gTrue);
+  if (lookCharLastValueCached == EOF) {
+    lookCharLastValueCached = LOOK_VALUE_NOT_CACHED;
+    return EOF;
+  } else {
+    return lookCharLastValueCached;
+  }
+}
+
+Object *Lexer::getObj(Object *obj, int objNum) {
+  char *p;
+  int c, c2;
+  GBool comment, neg, done, overflownInteger, overflownUnsignedInteger;
+  int numParen;
+  int xi;
+  unsigned int xui = 0;
+  double xf = 0, scale;
+  GooString *s;
+  int n, m;
+
+  // skip whitespace and comments
+  comment = gFalse;
+  while (1) {
+    if ((c = getChar()) == EOF) {
+      return obj->initEOF();
+    }
+    if (comment) {
+      if (c == '\r' || c == '\n')
+       comment = gFalse;
+    } else if (c == '%') {
+      comment = gTrue;
+    } else if (specialChars[c] != 1) {
+      break;
+    }
+  }
+
+  // start reading token
+  switch (c) {
+
+  // number
+  case '0': case '1': case '2': case '3': case '4':
+  case '5': case '6': case '7': case '8': case '9':
+  case '+': case '-': case '.':
+    overflownInteger = gFalse;
+    overflownUnsignedInteger = gFalse;
+    neg = gFalse;
+    xi = 0;
+    if (c == '-') {
+      neg = gTrue;
+    } else if (c == '.') {
+      goto doReal;
+    } else if (c != '+') {
+      xi = c - '0';
+    }
+    while (1) {
+      c = lookChar();
+      if (isdigit(c)) {
+       getChar();
+       if (unlikely(overflownInteger)) {
+         if (overflownUnsignedInteger) {
+           xf = xf * 10.0 + (c - '0');
+         } else {
+           overflownUnsignedInteger = gTrue;
+           xf = xui * 10.0 + (c - '0');
+         }
+       } else {
+         if (unlikely(xi > IntegerSafeLimit) &&
+             (xi > (INT_MAX - (c - '0')) / 10.0)) {
+           overflownInteger = gTrue;
+           if (xi > (UINT_MAX - (c - '0')) / 10.0) {
+             overflownUnsignedInteger = gTrue;
+             xf = xi * 10.0 + (c - '0');
+           } else {
+             xui = xi * 10.0 + (c - '0');
+           }
+         } else {
+           xi = xi * 10 + (c - '0');
+         }
+       }
+      } else if (c == '.') {
+       getChar();
+       goto doReal;
+      } else {
+       break;
+      }
+    }
+    if (neg) {
+      xi = -xi;
+      xf = -xf;
+    }
+    if (unlikely(overflownInteger)) {
+      if (overflownUnsignedInteger) {
+        obj->initReal(xf);
+      } else {
+        obj->initUint(xui);
+      }
+    } else {
+      obj->initInt(xi);
+    }
+    break;
+  doReal:
+    if (likely(!overflownInteger)) {
+      xf = xi;
+    } else if (!overflownUnsignedInteger) {
+      xf = xui;
+    }
+    scale = 0.1;
+    while (1) {
+      c = lookChar();
+      if (c == '-') {
+       // ignore minus signs in the middle of numbers to match
+       // Adobe's behavior
+       error(errSyntaxWarning, getPos(), "Badly formatted number");
+       getChar();
+       continue;
+      }
+      if (!isdigit(c)) {
+       break;
+      }
+      getChar();
+      xf = xf + scale * (c - '0');
+      scale *= 0.1;
+    }
+    if (neg) {
+      xf = -xf;
+    }
+    obj->initReal(xf);
+    break;
+
+  // string
+  case '(':
+    p = tokBuf;
+    n = 0;
+    numParen = 1;
+    done = gFalse;
+    s = NULL;
+    do {
+      c2 = EOF;
+      switch (c = getChar()) {
+
+      case EOF:
+#if 0
+      // This breaks some PDF files, e.g., ones from Photoshop.
+      case '\r':
+      case '\n':
+#endif
+       error(errSyntaxError, getPos(), "Unterminated string");
+       done = gTrue;
+       break;
+
+      case '(':
+       ++numParen;
+       c2 = c;
+       break;
+
+      case ')':
+       if (--numParen == 0) {
+         done = gTrue;
+       } else {
+         c2 = c;
+       }
+       break;
+
+      case '\\':
+       switch (c = getChar()) {
+       case 'n':
+         c2 = '\n';
+         break;
+       case 'r':
+         c2 = '\r';
+         break;
+       case 't':
+         c2 = '\t';
+         break;
+       case 'b':
+         c2 = '\b';
+         break;
+       case 'f':
+         c2 = '\f';
+         break;
+       case '\\':
+       case '(':
+       case ')':
+         c2 = c;
+         break;
+       case '0': case '1': case '2': case '3':
+       case '4': case '5': case '6': case '7':
+         c2 = c - '0';
+         c = lookChar();
+         if (c >= '0' && c <= '7') {
+           getChar();
+           c2 = (c2 << 3) + (c - '0');
+           c = lookChar();
+           if (c >= '0' && c <= '7') {
+             getChar();
+             c2 = (c2 << 3) + (c - '0');
+           }
+         }
+         break;
+       case '\r':
+         c = lookChar();
+         if (c == '\n') {
+           getChar();
+         }
+         break;
+       case '\n':
+         break;
+       case EOF:
+         error(errSyntaxError, getPos(), "Unterminated string");
+         done = gTrue;
+         break;
+       default:
+         c2 = c;
+         break;
+       }
+       break;
+
+      default:
+       c2 = c;
+       break;
+      }
+
+      if (c2 != EOF) {
+       if (n == tokBufSize) {
+         if (!s)
+           s = new GooString(tokBuf, tokBufSize);
+         else
+           s->append(tokBuf, tokBufSize);
+         p = tokBuf;
+         n = 0;
+         
+         // we are growing see if the document is not malformed and we are growing too much
+         if (objNum > 0 && xref != NULL)
+         {
+           int newObjNum = xref->getNumEntry(curStr.streamGetPos());
+           if (newObjNum != objNum)
+           {
+             error(errSyntaxError, getPos(), "Unterminated string");
+             done = gTrue;
+             delete s;
+             n = -2;
+           }
+         }
+       }
+       *p++ = (char)c2;
+       ++n;
+      }
+    } while (!done);
+    if (n >= 0) {
+      if (!s)
+        s = new GooString(tokBuf, n);
+      else
+        s->append(tokBuf, n);
+      obj->initString(s);
+    } else {
+      obj->initEOF();
+    }
+    break;
+
+  // name
+  case '/':
+    p = tokBuf;
+    n = 0;
+    s = NULL;
+    while ((c = lookChar()) != EOF && !specialChars[c]) {
+      getChar();
+      if (c == '#') {
+       c2 = lookChar();
+       if (c2 >= '0' && c2 <= '9') {
+         c = c2 - '0';
+       } else if (c2 >= 'A' && c2 <= 'F') {
+         c = c2 - 'A' + 10;
+       } else if (c2 >= 'a' && c2 <= 'f') {
+         c = c2 - 'a' + 10;
+       } else {
+         goto notEscChar;
+       }
+       getChar();
+       c <<= 4;
+       c2 = getChar();
+       if (c2 >= '0' && c2 <= '9') {
+         c += c2 - '0';
+       } else if (c2 >= 'A' && c2 <= 'F') {
+         c += c2 - 'A' + 10;
+       } else if (c2 >= 'a' && c2 <= 'f') {
+         c += c2 - 'a' + 10;
+       } else {
+         error(errSyntaxError, getPos(), "Illegal digit in hex char in name");
+       }
+      }
+     notEscChar:
+      // the PDF spec claims that names are limited to 127 chars, but
+      // Distiller 8 will produce longer names, and Acrobat 8 will
+      // accept longer names
+      ++n;
+      if (n < tokBufSize) {
+       *p++ = c;
+      } else if (n == tokBufSize) {
+       error(errSyntaxError, getPos(), "Warning: name token is longer than what the specification says it can be");
+       *p = c;
+       s = new GooString(tokBuf, n);
+      } else {
+       s->append((char)c);
+      }
+    }
+    if (n < tokBufSize) {
+      *p = '\0';
+      obj->initName(tokBuf);
+    } else {
+      obj->initName(s->getCString());
+      delete s;
+    }
+    break;
+
+  // array punctuation
+  case '[':
+  case ']':
+    tokBuf[0] = c;
+    tokBuf[1] = '\0';
+    obj->initCmd(tokBuf);
+    break;
+
+  // hex string or dict punctuation
+  case '<':
+    c = lookChar();
+
+    // dict punctuation
+    if (c == '<') {
+      getChar();
+      tokBuf[0] = tokBuf[1] = '<';
+      tokBuf[2] = '\0';
+      obj->initCmd(tokBuf);
+
+    // hex string
+    } else {
+      p = tokBuf;
+      m = n = 0;
+      c2 = 0;
+      s = NULL;
+      while (1) {
+       c = getChar();
+       if (c == '>') {
+         break;
+       } else if (c == EOF) {
+         error(errSyntaxError, getPos(), "Unterminated hex string");
+         break;
+       } else if (specialChars[c] != 1) {
+         c2 = c2 << 4;
+         if (c >= '0' && c <= '9')
+           c2 += c - '0';
+         else if (c >= 'A' && c <= 'F')
+           c2 += c - 'A' + 10;
+         else if (c >= 'a' && c <= 'f')
+           c2 += c - 'a' + 10;
+         else
+           error(errSyntaxError, getPos(), "Illegal character <{0:02x}> in hex string", c);
+         if (++m == 2) {
+           if (n == tokBufSize) {
+             if (!s)
+               s = new GooString(tokBuf, tokBufSize);
+             else
+               s->append(tokBuf, tokBufSize);
+             p = tokBuf;
+             n = 0;
+           }
+           *p++ = (char)c2;
+           ++n;
+           c2 = 0;
+           m = 0;
+         }
+       }
+      }
+      if (!s)
+       s = new GooString(tokBuf, n);
+      else
+       s->append(tokBuf, n);
+      if (m == 1)
+       s->append((char)(c2 << 4));
+      obj->initString(s);
+    }
+    break;
+
+  // dict punctuation
+  case '>':
+    c = lookChar();
+    if (c == '>') {
+      getChar();
+      tokBuf[0] = tokBuf[1] = '>';
+      tokBuf[2] = '\0';
+      obj->initCmd(tokBuf);
+    } else {
+      error(errSyntaxError, getPos(), "Illegal character '>'");
+      obj->initError();
+    }
+    break;
+
+  // error
+  case ')':
+  case '{':
+  case '}':
+    error(errSyntaxError, getPos(), "Illegal character '{0:c}'", c);
+    obj->initError();
+    break;
+
+  // command
+  default:
+    p = tokBuf;
+    *p++ = c;
+    n = 1;
+    while ((c = lookChar()) != EOF && !specialChars[c]) {
+      getChar();
+      if (++n == tokBufSize) {
+       error(errSyntaxError, getPos(), "Command token too long");
+       break;
+      }
+      *p++ = c;
+    }
+    *p = '\0';
+    if (tokBuf[0] == 't' && !strcmp(tokBuf, "true")) {
+      obj->initBool(gTrue);
+    } else if (tokBuf[0] == 'f' && !strcmp(tokBuf, "false")) {
+      obj->initBool(gFalse);
+    } else if (tokBuf[0] == 'n' && !strcmp(tokBuf, "null")) {
+      obj->initNull();
+    } else {
+      obj->initCmd(tokBuf);
+    }
+    break;
+  }
+
+  return obj;
+}
+
+void Lexer::skipToNextLine() {
+  int c;
+
+  while (1) {
+    c = getChar();
+    if (c == EOF || c == '\n') {
+      return;
+    }
+    if (c == '\r') {
+      if ((c = lookChar()) == '\n') {
+       getChar();
+      }
+      return;
+    }
+  }
+}
+
+GBool Lexer::isSpace(int c) {
+  return c >= 0 && c <= 0xff && specialChars[c] == 1;
+}
diff --git a/poppler/Lexer.h b/poppler/Lexer.h
new file mode 100644 (file)
index 0000000..284479d
--- /dev/null
@@ -0,0 +1,105 @@
+//========================================================================
+//
+// Lexer.h
+//
+// Copyright 1996-2003 Glyph & Cog, LLC
+//
+//========================================================================
+
+//========================================================================
+//
+// Modified under the Poppler project - http://poppler.freedesktop.org
+//
+// All changes made under the Poppler project to this file are licensed
+// under GPL version 2 or later
+//
+// Copyright (C) 2006, 2007, 2010 Albert Astals Cid <aacid@kde.org>
+// Copyright (C) 2006 Krzysztof Kowalczyk <kkowalczyk@gmail.com>
+//
+// To see a description of the changes please see the Changelog file that
+// came with your tarball or type make ChangeLog if you are building from git
+//
+//========================================================================
+
+#ifndef LEXER_H
+#define LEXER_H
+
+#ifdef USE_GCC_PRAGMAS
+#pragma interface
+#endif
+
+#include "Object.h"
+#include "Stream.h"
+
+class XRef;
+
+#define tokBufSize 128         // size of token buffer
+
+//------------------------------------------------------------------------
+// Lexer
+//------------------------------------------------------------------------
+
+class Lexer {
+public:
+
+  // Construct a lexer for a single stream.  Deletes the stream when
+  // lexer is deleted.
+  Lexer(XRef *xrefA, Stream *str);
+
+  // Construct a lexer for a stream or array of streams (assumes obj
+  // is either a stream or array of streams).
+  Lexer(XRef *xrefA, Object *obj);
+
+  // Destructor.
+  ~Lexer();
+
+  // Get the next object from the input stream.
+  Object *getObj(Object *obj, int objNum = -1);
+
+  // Skip to the beginning of the next line in the input stream.
+  void skipToNextLine();
+
+  // Skip over one character.
+  void skipChar() { getChar(); }
+
+  // Get stream.
+  Stream *getStream()
+    { return curStr.isStream() ? curStr.getStream() : (Stream *)NULL; }
+
+  // Get current position in file.  This is only used for error
+  // messages, so it returns an int instead of a Guint.
+  int getPos()
+    { return curStr.isStream() ? (int)curStr.streamGetPos() : -1; }
+
+  // Set position in file.
+  void setPos(Guint pos, int dir = 0)
+    { if (curStr.isStream()) curStr.streamSetPos(pos, dir); }
+
+  // Returns true if <c> is a whitespace character.
+  static GBool isSpace(int c);
+
+
+  // often (e.g. ~30% on PDF Refernce 1.6 pdf file from Adobe site) getChar
+  // is called right after lookChar. In order to avoid expensive re-doing
+  // getChar() of underlying stream, we cache the last value found by
+  // lookChar() in lookCharLastValueCached. A special value 
+  // LOOK_VALUE_NOT_CACHED that should never be part of stream indicates
+  // that no value was cached
+  static const int LOOK_VALUE_NOT_CACHED = -3;
+  int lookCharLastValueCached;
+
+private:
+
+  int getChar(GBool comesFromLook = gFalse);
+  int lookChar();
+
+  Array *streams;              // array of input streams
+  int strPtr;                  // index of current stream
+  Object curStr;               // current stream
+  GBool freeArray;             // should lexer free the streams array?
+  char tokBuf[tokBufSize];     // temporary token buffer
+
+  XRef *xref;
+};
+
+#endif
diff --git a/poppler/Linearization.cc b/poppler/Linearization.cc
new file mode 100644 (file)
index 0000000..33331d1
--- /dev/null
@@ -0,0 +1,222 @@
+//========================================================================
+//
+// Linearization.cc
+//
+// This file is licensed under the GPLv2 or later
+//
+// Copyright 2010, 2012 Hib Eris <hib@hiberis.nl>
+//
+//========================================================================
+
+#include "Linearization.h"
+#include "Parser.h"
+#include "Lexer.h"
+
+//------------------------------------------------------------------------
+// Linearization
+//------------------------------------------------------------------------
+
+Linearization::Linearization (BaseStream *str)
+{
+  Parser *parser;
+  Object obj1, obj2, obj3, obj5;
+
+  linDict.initNull();
+
+  str->reset();
+  obj1.initNull();
+  parser = new Parser(NULL,
+      new Lexer(NULL, str->makeSubStream(str->getStart(), gFalse, 0, &obj1)),
+      gFalse);
+  parser->getObj(&obj1);
+  parser->getObj(&obj2);
+  parser->getObj(&obj3);
+  parser->getObj(&linDict);
+  if (obj1.isInt() && obj2.isInt() && obj3.isCmd("obj") && linDict.isDict()) {
+    linDict.dictLookup("Linearized", &obj5);
+    if (!(obj5.isNum() && obj5.getNum() > 0)) {
+       linDict.free();
+       linDict.initNull();
+    }
+    obj5.free();
+  }
+  obj3.free();
+  obj2.free();
+  obj1.free();
+  delete parser;
+}
+
+Linearization:: ~Linearization()
+{
+  linDict.free();
+}
+
+Guint Linearization::getLength()
+{
+  if (!linDict.isDict()) return 0;
+
+  int length;
+  if (linDict.getDict()->lookupInt("L", NULL, &length) &&
+      length > 0) {
+    return length;
+  } else {
+    error(errSyntaxWarning, -1, "Length in linearization table is invalid");
+    return 0;
+  }
+}
+
+Guint Linearization::getHintsOffset()
+{
+  int hintsOffset;
+
+  Object obj1, obj2;
+  if (linDict.isDict() &&
+      linDict.dictLookup("H", &obj1)->isArray() &&
+      obj1.arrayGetLength()>=2 &&
+      obj1.arrayGet(0, &obj2)->isInt() &&
+      obj2.getInt() > 0) {
+    hintsOffset = obj2.getInt();
+  } else {
+    error(errSyntaxWarning, -1, "Hints table offset in linearization table is invalid");
+    hintsOffset = 0;
+  }
+  obj2.free();
+  obj1.free();
+
+  return hintsOffset;
+}
+
+Guint Linearization::getHintsLength()
+{
+  int hintsLength;
+
+  Object obj1, obj2;
+  if (linDict.isDict() &&
+      linDict.dictLookup("H", &obj1)->isArray() &&
+      obj1.arrayGetLength()>=2 &&
+      obj1.arrayGet(1, &obj2)->isInt() &&
+      obj2.getInt() > 0) {
+    hintsLength = obj2.getInt();
+  } else {
+    error(errSyntaxWarning, -1, "Hints table length in linearization table is invalid");
+    hintsLength = 0;
+  }
+  obj2.free();
+  obj1.free();
+
+  return hintsLength;
+}
+
+Guint Linearization::getHintsOffset2()
+{
+  int hintsOffset2 = 0; // default to 0
+
+  Object obj1, obj2;
+  if (linDict.isDict() &&
+      linDict.dictLookup("H", &obj1)->isArray() &&
+      obj1.arrayGetLength()>=4) {
+    if (obj1.arrayGet(2, &obj2)->isInt() &&
+        obj2.getInt() > 0) {
+      hintsOffset2 = obj2.getInt();
+    } else {
+      error(errSyntaxWarning, -1, "Second hints table offset in linearization table is invalid");
+      hintsOffset2 = 0;
+    }
+  }
+  obj2.free();
+  obj1.free();
+
+  return hintsOffset2;
+}
+
+Guint Linearization::getHintsLength2()
+{
+  int hintsLength2 = 0; // default to 0
+
+  Object obj1, obj2;
+  if (linDict.isDict() &&
+      linDict.dictLookup("H", &obj1)->isArray() &&
+      obj1.arrayGetLength()>=4) {
+    if (obj1.arrayGet(3, &obj2)->isInt() &&
+        obj2.getInt() > 0) {
+      hintsLength2 = obj2.getInt();
+    } else {
+      error(errSyntaxWarning, -1, "Second hints table length in linearization table is invalid");
+      hintsLength2 = 0;
+    }
+  }
+  obj2.free();
+  obj1.free();
+
+  return hintsLength2;
+}
+
+int Linearization::getObjectNumberFirst()
+{
+  int objectNumberFirst = 0;
+  if (linDict.isDict() &&
+      linDict.getDict()->lookupInt("O", NULL, &objectNumberFirst) &&
+      objectNumberFirst > 0) {
+    return objectNumberFirst;
+  } else {
+    error(errSyntaxWarning, -1, "Object number of first page in linearization table is invalid");
+    return 0;
+  }
+}
+
+Guint Linearization::getEndFirst()
+{
+  int pageEndFirst = 0;
+  if (linDict.isDict() &&
+      linDict.getDict()->lookupInt("E", NULL, &pageEndFirst) &&
+      pageEndFirst > 0) {
+    return pageEndFirst;
+  } else {
+    error(errSyntaxWarning, -1, "First page end offset in linearization table is invalid");
+    return 0;
+  }
+}
+
+int Linearization::getNumPages()
+{
+  int numPages = 0;
+  if (linDict.isDict() &&
+      linDict.getDict()->lookupInt("N", NULL, &numPages) &&
+      numPages > 0) {
+    return numPages;
+  } else {
+    error(errSyntaxWarning, -1, "Page count in linearization table is invalid");
+    return 0;
+  }
+}
+
+Guint Linearization::getMainXRefEntriesOffset()
+{
+  int mainXRefEntriesOffset = 0;
+  if (linDict.isDict() &&
+      linDict.getDict()->lookupInt("T", NULL, &mainXRefEntriesOffset) &&
+      mainXRefEntriesOffset > 0) {
+    return mainXRefEntriesOffset;
+  } else {
+    error(errSyntaxWarning, -1, "Main Xref offset in linearization table is invalid");
+    return 0;
+  }
+}
+
+int Linearization::getPageFirst()
+{
+  int pageFirst = 0; // Optional, defaults to 0.
+
+  if (linDict.isDict()) {
+    linDict.getDict()->lookupInt("P", NULL, &pageFirst);
+  }
+
+  if ((pageFirst < 0) || (pageFirst > getNumPages())) {
+    error(errSyntaxWarning, -1, "First page in linearization table is invalid");
+    return 0;
+  }
+
+  return pageFirst;
+}
+
+
diff --git a/poppler/Linearization.h b/poppler/Linearization.h
new file mode 100644 (file)
index 0000000..6728a75
--- /dev/null
@@ -0,0 +1,45 @@
+//========================================================================
+//
+// Linearization.h
+//
+// This file is licensed under the GPLv2 or later
+//
+// Copyright 2010 Hib Eris <hib@hiberis.nl>
+//
+//========================================================================
+
+#ifndef LINEARIZATION_H
+#define LINEARIZATION_H
+
+#include "goo/gtypes.h"
+#include "Object.h"
+class BaseStream;
+
+//------------------------------------------------------------------------
+// Linearization
+//------------------------------------------------------------------------
+
+class Linearization {
+public:
+
+  Linearization(BaseStream *str);
+  ~Linearization();
+
+  Guint getLength();
+  Guint getHintsOffset();
+  Guint getHintsLength();
+  Guint getHintsOffset2();
+  Guint getHintsLength2();
+  int getObjectNumberFirst();
+  Guint getEndFirst();
+  int getNumPages();
+  Guint getMainXRefEntriesOffset();
+  int getPageFirst();
+
+private:
+
+  Object linDict;
+
+};
+
+#endif
diff --git a/poppler/Link.cc b/poppler/Link.cc
new file mode 100644 (file)
index 0000000..b90b1c1
--- /dev/null
@@ -0,0 +1,929 @@
+//========================================================================
+//
+// Link.cc
+//
+// Copyright 1996-2003 Glyph & Cog, LLC
+//
+//========================================================================
+
+//========================================================================
+//
+// Modified under the Poppler project - http://poppler.freedesktop.org
+//
+// All changes made under the Poppler project to this file are licensed
+// under GPL version 2 or later
+//
+// Copyright (C) 2006, 2008 Pino Toscano <pino@kde.org>
+// Copyright (C) 2007, 2010, 2011 Carlos Garcia Campos <carlosgc@gnome.org>
+// Copyright (C) 2008 Hugo Mercier <hmercier31@gmail.com>
+// Copyright (C) 2008-2010, 2012 Albert Astals Cid <aacid@kde.org>
+// Copyright (C) 2009 Kovid Goyal <kovid@kovidgoyal.net>
+// Copyright (C) 2009 Ilya Gorenbein <igorenbein@finjan.com>
+//
+// To see a description of the changes please see the Changelog file that
+// came with your tarball or type make ChangeLog if you are building from git
+//
+//========================================================================
+
+#include <config.h>
+
+#ifdef USE_GCC_PRAGMAS
+#pragma implementation
+#endif
+
+#include <stddef.h>
+#include <string.h>
+#include "goo/gmem.h"
+#include "goo/GooString.h"
+#include "goo/GooList.h"
+#include "Error.h"
+#include "Object.h"
+#include "Array.h"
+#include "Dict.h"
+#include "Link.h"
+#include "Sound.h"
+#include "FileSpec.h"
+#include "Rendition.h"
+#include "Annot.h"
+
+//------------------------------------------------------------------------
+// LinkAction
+//------------------------------------------------------------------------
+
+LinkAction *LinkAction::parseDest(Object *obj) {
+  LinkAction *action;
+
+  action = new LinkGoTo(obj);
+  if (!action->isOk()) {
+    delete action;
+    return NULL;
+  }
+  return action;
+}
+
+LinkAction *LinkAction::parseAction(Object *obj, GooString *baseURI) {
+  LinkAction *action;
+  Object obj2, obj3, obj4;
+
+  if (!obj->isDict()) {
+      error(errSyntaxWarning, -1, "parseAction: Bad annotation action for URI '{0:s}'",
+            baseURI ? baseURI->getCString() : "NULL");
+      return NULL;
+  }
+
+  obj->dictLookup("S", &obj2);
+
+  // GoTo action
+  if (obj2.isName("GoTo")) {
+    obj->dictLookup("D", &obj3);
+    action = new LinkGoTo(&obj3);
+    obj3.free();
+
+  // GoToR action
+  } else if (obj2.isName("GoToR")) {
+    obj->dictLookup("F", &obj3);
+    obj->dictLookup("D", &obj4);
+    action = new LinkGoToR(&obj3, &obj4);
+    obj3.free();
+    obj4.free();
+
+  // Launch action
+  } else if (obj2.isName("Launch")) {
+    action = new LinkLaunch(obj);
+
+  // URI action
+  } else if (obj2.isName("URI")) {
+    obj->dictLookup("URI", &obj3);
+    action = new LinkURI(&obj3, baseURI);
+    obj3.free();
+
+  // Named action
+  } else if (obj2.isName("Named")) {
+    obj->dictLookup("N", &obj3);
+    action = new LinkNamed(&obj3);
+    obj3.free();
+
+  // Movie action
+  } else if (obj2.isName("Movie")) {
+    action = new LinkMovie(obj);
+
+  // Rendition action
+  } else if (obj2.isName("Rendition")) {
+    action = new LinkRendition(obj);
+
+  // Sound action
+  } else if (obj2.isName("Sound")) {
+    action = new LinkSound(obj);
+
+  // JavaScript action
+  } else if (obj2.isName("JavaScript")) {
+    obj->dictLookup("JS", &obj3);
+    action = new LinkJavaScript(&obj3);
+    obj3.free();
+
+  // Set-OCG-State action
+  } else if (obj2.isName("SetOCGState")) {
+    action = new LinkOCGState(obj);
+
+  // unknown action
+  } else if (obj2.isName()) {
+    action = new LinkUnknown(obj2.getName());
+
+  // action is missing or wrong type
+  } else {
+    error(errSyntaxWarning, -1, "parseAction: Unknown annotation action object: URI = '{0:s}'",
+          baseURI ? baseURI->getCString() : "NULL");
+    action = NULL;
+  }
+
+  obj2.free();
+
+  if (action && !action->isOk()) {
+    delete action;
+    return NULL;
+  }
+  return action;
+}
+
+//------------------------------------------------------------------------
+// LinkDest
+//------------------------------------------------------------------------
+
+LinkDest::LinkDest(Array *a) {
+  Object obj1, obj2;
+
+  // initialize fields
+  left = bottom = right = top = zoom = 0;
+  changeLeft = changeTop = changeZoom = gFalse;
+  ok = gFalse;
+
+  // get page
+  if (a->getLength() < 2) {
+    error(errSyntaxWarning, -1, "Annotation destination array is too short");
+    return;
+  }
+  a->getNF(0, &obj1);
+  if (obj1.isInt()) {
+    pageNum = obj1.getInt() + 1;
+    pageIsRef = gFalse;
+  } else if (obj1.isRef()) {
+    pageRef.num = obj1.getRefNum();
+    pageRef.gen = obj1.getRefGen();
+    pageIsRef = gTrue;
+  } else {
+    error(errSyntaxWarning, -1, "Bad annotation destination");
+    goto err2;
+  }
+  obj1.free();
+
+  // get destination type
+  a->get(1, &obj1);
+
+  // XYZ link
+  if (obj1.isName("XYZ")) {
+    kind = destXYZ;
+    if (a->getLength() < 3) {
+      changeLeft = gFalse;
+    } else {
+      a->get(2, &obj2);
+      if (obj2.isNull()) {
+       changeLeft = gFalse;
+      } else if (obj2.isNum()) {
+       changeLeft = gTrue;
+       left = obj2.getNum();
+      } else {
+       error(errSyntaxWarning, -1, "Bad annotation destination position");
+       goto err1;
+      }
+      obj2.free();
+    }
+    if (a->getLength() < 4) {
+      changeTop = gFalse;
+    } else {
+      a->get(3, &obj2);
+      if (obj2.isNull()) {
+       changeTop = gFalse;
+      } else if (obj2.isNum()) {
+       changeTop = gTrue;
+       top = obj2.getNum();
+      } else {
+       error(errSyntaxWarning, -1, "Bad annotation destination position");
+       goto err1;
+      }
+      obj2.free();
+    }
+    if (a->getLength() < 5) {
+      changeZoom = gFalse;
+    } else {
+      a->get(4, &obj2);
+      if (obj2.isNull()) {
+       changeZoom = gFalse;
+      } else if (obj2.isNum()) {
+       changeZoom = gTrue;
+       zoom = obj2.getNum();
+      } else {
+       error(errSyntaxWarning, -1, "Bad annotation destination position");
+       goto err1;
+      }
+      obj2.free();
+    }
+
+  // Fit link
+  } else if (obj1.isName("Fit")) {
+    if (a->getLength() < 2) {
+      error(errSyntaxWarning, -1, "Annotation destination array is too short");
+      goto err2;
+    }
+    kind = destFit;
+
+  // FitH link
+  } else if (obj1.isName("FitH")) {
+    if (a->getLength() < 3) {
+      error(errSyntaxWarning, -1, "Annotation destination array is too short");
+      goto err2;
+    }
+    kind = destFitH;
+    a->get(2, &obj2);
+    if (obj2.isNull()) {
+      changeTop = gFalse;
+    } else if (obj2.isNum()) {
+      changeTop = gTrue;
+      top = obj2.getNum();
+    } else {
+      error(errSyntaxWarning, -1, "Bad annotation destination position");
+      kind = destFit;
+    }
+    obj2.free();
+
+  // FitV link
+  } else if (obj1.isName("FitV")) {
+    if (a->getLength() < 3) {
+      error(errSyntaxWarning, -1, "Annotation destination array is too short");
+      goto err2;
+    }
+    kind = destFitV;
+    a->get(2, &obj2);
+    if (obj2.isNull()) {
+      changeLeft = gFalse;
+    } else if (obj2.isNum()) {
+      changeLeft = gTrue;
+      left = obj2.getNum();
+    } else {
+      error(errSyntaxWarning, -1, "Bad annotation destination position");
+      kind = destFit;
+    }
+    obj2.free();
+
+  // FitR link
+  } else if (obj1.isName("FitR")) {
+    if (a->getLength() < 6) {
+      error(errSyntaxWarning, -1, "Annotation destination array is too short");
+      goto err2;
+    }
+    kind = destFitR;
+    if (a->get(2, &obj2)->isNum()) {
+      left = obj2.getNum();
+    } else {
+      error(errSyntaxWarning, -1, "Bad annotation destination position");
+      kind = destFit;
+    }
+    obj2.free();
+    if (a->get(3, &obj2)->isNum()) {
+      bottom = obj2.getNum();
+    } else {
+      error(errSyntaxWarning, -1, "Bad annotation destination position");
+      kind = destFit;
+    }
+    obj2.free();
+    if (a->get(4, &obj2)->isNum()) {
+      right = obj2.getNum();
+    } else {
+      error(errSyntaxWarning, -1, "Bad annotation destination position");
+      kind = destFit;
+    }
+    obj2.free();
+    if (a->get(5, &obj2)->isNum()) {
+      top = obj2.getNum();
+    } else {
+      error(errSyntaxWarning, -1, "Bad annotation destination position");
+      kind = destFit;
+    }
+    obj2.free();
+
+  // FitB link
+  } else if (obj1.isName("FitB")) {
+    if (a->getLength() < 2) {
+      error(errSyntaxWarning, -1, "Annotation destination array is too short");
+      goto err2;
+    }
+    kind = destFitB;
+
+  // FitBH link
+  } else if (obj1.isName("FitBH")) {
+    if (a->getLength() < 3) {
+      error(errSyntaxWarning, -1, "Annotation destination array is too short");
+      goto err2;
+    }
+    kind = destFitBH;
+    a->get(2, &obj2);
+    if (obj2.isNull()) {
+      changeTop = gFalse;
+    } else if (obj2.isNum()) {
+      changeTop = gTrue;
+      top = obj2.getNum();
+    } else {
+      error(errSyntaxWarning, -1, "Bad annotation destination position");
+      kind = destFit;
+    }
+    obj2.free();
+
+  // FitBV link
+  } else if (obj1.isName("FitBV")) {
+    if (a->getLength() < 3) {
+      error(errSyntaxWarning, -1, "Annotation destination array is too short");
+      goto err2;
+    }
+    kind = destFitBV;
+    a->get(2, &obj2);
+    if (obj2.isNull()) {
+      changeLeft = gFalse;
+    } else if (obj2.isNum()) {
+      changeLeft = gTrue;
+      left = obj2.getNum();
+    } else {
+      error(errSyntaxWarning, -1, "Bad annotation destination position");
+      kind = destFit;
+    }
+    obj2.free();
+
+  // unknown link kind
+  } else {
+    error(errSyntaxWarning, -1, "Unknown annotation destination type");
+    goto err2;
+  }
+
+  obj1.free();
+  ok = gTrue;
+  return;
+
+ err1:
+  obj2.free();
+ err2:
+  obj1.free();
+}
+
+LinkDest::LinkDest(LinkDest *dest) {
+  kind = dest->kind;
+  pageIsRef = dest->pageIsRef;
+  if (pageIsRef)
+    pageRef = dest->pageRef;
+  else
+    pageNum = dest->pageNum;
+  left = dest->left;
+  bottom = dest->bottom;
+  right = dest->right;
+  top = dest->top;
+  zoom = dest->zoom;
+  changeLeft = dest->changeLeft;
+  changeTop = dest->changeTop;
+  changeZoom = dest->changeZoom;
+  ok = gTrue;
+}
+
+//------------------------------------------------------------------------
+// LinkGoTo
+//------------------------------------------------------------------------
+
+LinkGoTo::LinkGoTo(Object *destObj) {
+  dest = NULL;
+  namedDest = NULL;
+
+  // named destination
+  if (destObj->isName()) {
+    namedDest = new GooString(destObj->getName());
+  } else if (destObj->isString()) {
+    namedDest = destObj->getString()->copy();
+
+  // destination dictionary
+  } else if (destObj->isArray()) {
+    dest = new LinkDest(destObj->getArray());
+    if (!dest->isOk()) {
+      delete dest;
+      dest = NULL;
+    }
+
+  // error
+  } else {
+    error(errSyntaxWarning, -1, "Illegal annotation destination");
+  }
+}
+
+LinkGoTo::~LinkGoTo() {
+  if (dest)
+    delete dest;
+  if (namedDest)
+    delete namedDest;
+}
+
+//------------------------------------------------------------------------
+// LinkGoToR
+//------------------------------------------------------------------------
+
+LinkGoToR::LinkGoToR(Object *fileSpecObj, Object *destObj) {
+  fileName = NULL;
+  dest = NULL;
+  namedDest = NULL;
+
+  // get file name
+  Object obj1;
+  if (getFileSpecNameForPlatform (fileSpecObj, &obj1)) {
+    fileName = obj1.getString()->copy();
+    obj1.free();
+  }
+
+  // named destination
+  if (destObj->isName()) {
+    namedDest = new GooString(destObj->getName());
+  } else if (destObj->isString()) {
+    namedDest = destObj->getString()->copy();
+
+  // destination dictionary
+  } else if (destObj->isArray()) {
+    dest = new LinkDest(destObj->getArray());
+    if (!dest->isOk()) {
+      delete dest;
+      dest = NULL;
+    }
+
+  // error
+  } else {
+    error(errSyntaxWarning, -1, "Illegal annotation destination");
+  }
+}
+
+LinkGoToR::~LinkGoToR() {
+  if (fileName)
+    delete fileName;
+  if (dest)
+    delete dest;
+  if (namedDest)
+    delete namedDest;
+}
+
+
+//------------------------------------------------------------------------
+// LinkLaunch
+//------------------------------------------------------------------------
+
+LinkLaunch::LinkLaunch(Object *actionObj) {
+  Object obj1, obj2, obj3;
+
+  fileName = NULL;
+  params = NULL;
+
+  if (actionObj->isDict()) {
+    if (!actionObj->dictLookup("F", &obj1)->isNull()) {
+      if (getFileSpecNameForPlatform (&obj1, &obj3)) {
+       fileName = obj3.getString()->copy();
+       obj3.free();
+      }
+    } else {
+      obj1.free();
+#ifdef _WIN32
+      if (actionObj->dictLookup("Win", &obj1)->isDict()) {
+       obj1.dictLookup("F", &obj2);
+       if (getFileSpecNameForPlatform (&obj2, &obj3)) {
+         fileName = obj3.getString()->copy();
+         obj3.free();
+       }
+       obj2.free();
+       if (obj1.dictLookup("P", &obj2)->isString()) {
+         params = obj2.getString()->copy();
+       }
+       obj2.free();
+      } else {
+       error(errSyntaxWarning, -1, "Bad launch-type link action");
+      }
+#else
+      //~ This hasn't been defined by Adobe yet, so assume it looks
+      //~ just like the Win dictionary until they say otherwise.
+      if (actionObj->dictLookup("Unix", &obj1)->isDict()) {
+       obj1.dictLookup("F", &obj2);
+       if (getFileSpecNameForPlatform (&obj2, &obj3)) {
+         fileName = obj3.getString()->copy();
+         obj3.free();
+       }
+       obj2.free();
+       if (obj1.dictLookup("P", &obj2)->isString()) {
+         params = obj2.getString()->copy();
+       }
+       obj2.free();
+      } else {
+       error(errSyntaxWarning, -1, "Bad launch-type link action");
+      }
+#endif
+    }
+    obj1.free();
+  }
+}
+
+LinkLaunch::~LinkLaunch() {
+  if (fileName)
+    delete fileName;
+  if (params)
+    delete params;
+}
+
+//------------------------------------------------------------------------
+// LinkURI
+//------------------------------------------------------------------------
+
+LinkURI::LinkURI(Object *uriObj, GooString *baseURI) {
+  GooString *uri2;
+  int n;
+  char c;
+
+  uri = NULL;
+  if (uriObj->isString()) {
+    uri2 = uriObj->getString();
+    n = (int)strcspn(uri2->getCString(), "/:");
+    if (n < uri2->getLength() && uri2->getChar(n) == ':') {
+      // "http:..." etc.
+      uri = uri2->copy();
+    } else if (!uri2->cmpN("www.", 4)) {
+      // "www.[...]" without the leading "http://"
+      uri = new GooString("http://");
+      uri->append(uri2);
+    } else {
+      // relative URI
+      if (baseURI) {
+       uri = baseURI->copy();
+       c = uri->getChar(uri->getLength() - 1);
+       if (c != '/' && c != '?') {
+         uri->append('/');
+       }
+       if (uri2->getChar(0) == '/') {
+         uri->append(uri2->getCString() + 1, uri2->getLength() - 1);
+       } else {
+         uri->append(uri2);
+       }
+      } else {
+       uri = uri2->copy();
+      }
+    }
+  } else {
+    error(errSyntaxWarning, -1, "Illegal URI-type link");
+  }
+}
+
+LinkURI::~LinkURI() {
+  if (uri)
+    delete uri;
+}
+
+//------------------------------------------------------------------------
+// LinkNamed
+//------------------------------------------------------------------------
+
+LinkNamed::LinkNamed(Object *nameObj) {
+  name = NULL;
+  if (nameObj->isName()) {
+    name = new GooString(nameObj->getName());
+  }
+}
+
+LinkNamed::~LinkNamed() {
+  if (name) {
+    delete name;
+  }
+}
+
+//------------------------------------------------------------------------
+// LinkMovie
+//------------------------------------------------------------------------
+
+LinkMovie::LinkMovie(Object *obj) {
+  annotRef.num = -1;
+  annotTitle = NULL;
+
+  Object tmp;
+  if (obj->dictLookupNF("Annotation", &tmp)->isRef()) {
+    annotRef = tmp.getRef();
+  }
+  tmp.free();
+
+  if (obj->dictLookup("T", &tmp)->isString()) {
+    annotTitle = tmp.getString()->copy();
+  }
+  tmp.free();
+
+  if ((annotTitle == NULL) && (annotRef.num == -1)) {
+    error(errSyntaxError, -1,
+         "Movie action is missing both the Annot and T keys");
+  }
+
+  if (obj->dictLookup("Operation", &tmp)->isName()) {
+    char *name = tmp.getName();
+    
+    if (!strcmp(name, "Play")) {
+      operation = operationTypePlay;
+    }
+    else if (!strcmp(name, "Stop")) {
+      operation = operationTypeStop;
+    }
+    else if (!strcmp(name, "Pause")) {
+      operation = operationTypePause;
+    }
+    else if (!strcmp(name, "Resume")) {
+      operation = operationTypeResume;
+    }
+  }
+  tmp.free();
+}
+
+LinkMovie::~LinkMovie() {
+  if (annotTitle) {
+    delete annotTitle;
+  }
+}
+
+//------------------------------------------------------------------------
+// LinkSound
+//------------------------------------------------------------------------
+
+LinkSound::LinkSound(Object *soundObj) {
+  volume = 1.0;
+  sync = gFalse;
+  repeat = gFalse;
+  mix = gFalse;
+  sound = NULL;
+  if (soundObj->isDict())
+  {
+    Object tmp;
+    // volume
+    soundObj->dictLookup("Volume", &tmp);
+    if (tmp.isNum()) {
+      volume = tmp.getNum();
+    }
+    tmp.free();
+    // sync
+    soundObj->dictLookup("Synchronous", &tmp);
+    if (tmp.isBool()) {
+      sync = tmp.getBool();
+    }
+    tmp.free();
+    // repeat
+    soundObj->dictLookup("Repeat", &tmp);
+    if (tmp.isBool()) {
+      repeat = tmp.getBool();
+    }
+    tmp.free();
+    // mix
+    soundObj->dictLookup("Mix", &tmp);
+    if (tmp.isBool()) {
+      mix = tmp.getBool();
+    }
+    tmp.free();
+    // 'Sound' object
+    soundObj->dictLookup("Sound", &tmp);
+    sound = Sound::parseSound(&tmp);
+    tmp.free();
+  }
+}
+
+LinkSound::~LinkSound() {
+  delete sound;
+}
+
+//------------------------------------------------------------------------
+// LinkRendition
+//------------------------------------------------------------------------
+
+LinkRendition::LinkRendition(Object *obj) {
+  operation = -1;
+  media = NULL;
+  js = NULL;
+
+  if (obj->isDict()) {
+    Object tmp;
+
+    if (!obj->dictLookup("JS", &tmp)->isNull()) {
+      if (tmp.isString()) {
+        js = new GooString(tmp.getString());
+      } else if (tmp.isStream()) {
+        Stream *stream = tmp.getStream();
+       js = new GooString();
+       stream->fillGooString(js);
+      } else {
+        error(errSyntaxWarning, -1, "Invalid Rendition Action: JS not string or stream");
+      }
+    }
+    tmp.free();
+
+    if (obj->dictLookup("OP", &tmp)->isInt()) {
+      operation = tmp.getInt();
+      if (!js && (operation < 0 || operation > 4)) {
+        error(errSyntaxWarning, -1, "Invalid Rendition Action: unrecognized operation valued: {0:d}", operation);
+      } else {
+        Object obj1;
+
+        // retrieve rendition object
+        if (obj->dictLookup("R", &renditionObj)->isDict()) {
+          media = new MediaRendition(&renditionObj);
+       } else if (operation == 0 || operation == 4) {
+          error(errSyntaxWarning, -1, "Invalid Rendition Action: no R field with op = {0:d}", operation);
+         renditionObj.free();
+       }
+
+       if (!obj->dictLookupNF("AN", &screenRef)->isRef() && operation >= 0 && operation <= 4) {
+         error(errSyntaxWarning, -1, "Invalid Rendition Action: no AN field with op = {0:d}", operation);
+         screenRef.free();
+       }
+      }
+    } else if (!js) {
+      error(errSyntaxWarning, -1, "Invalid Rendition action: no OP or JS field defined");
+    }
+    tmp.free();
+  }
+}
+
+LinkRendition::~LinkRendition() {
+  renditionObj.free();
+  screenRef.free();
+
+  if (js)
+    delete js;
+  if (media)
+    delete media;
+}
+
+
+//------------------------------------------------------------------------
+// LinkJavaScript
+//------------------------------------------------------------------------
+
+LinkJavaScript::LinkJavaScript(Object *jsObj) {
+  js = NULL;
+
+  if (jsObj->isString()) {
+    js = new GooString(jsObj->getString());
+  }
+  else if (jsObj->isStream()) {
+    Stream *stream = jsObj->getStream();
+    js = new GooString();
+    stream->fillGooString(js);
+  }
+}
+
+LinkJavaScript::~LinkJavaScript() {
+  if (js) {
+    delete js;
+  }
+}
+
+//------------------------------------------------------------------------
+// LinkOCGState
+//------------------------------------------------------------------------
+LinkOCGState::LinkOCGState(Object *obj) {
+  Object obj1;
+
+  stateList = new GooList();
+  preserveRB = gTrue;
+
+  if (obj->dictLookup("State", &obj1)->isArray()) {
+    StateList *stList = NULL;
+
+    for (int i = 0; i < obj1.arrayGetLength(); ++i) {
+      Object obj2;
+
+      obj1.arrayGetNF(i, &obj2);
+      if (obj2.isName()) {
+        if (stList)
+         stateList->append(stList);
+
+       char *name = obj2.getName();
+       stList = new StateList();
+       stList->list = new GooList();
+       if (!strcmp (name, "ON")) {
+         stList->st = On;
+       } else if (!strcmp (name, "OFF")) {
+         stList->st = Off;
+       } else if (!strcmp (name, "Toggle")) {
+         stList->st = Toggle;
+       } else {
+         error(errSyntaxWarning, -1, "Invalid name '{0:s}' in OCG Action state array", name);
+         delete stList;
+         stList = NULL;
+       }
+      } else if (obj2.isRef()) {
+        if (stList) {
+         Ref ocgRef = obj2.getRef();
+         Ref *item = new Ref();
+         item->num = ocgRef.num;
+         item->gen = ocgRef.gen;
+         stList->list->append(item);
+       } else {
+         error(errSyntaxWarning, -1, "Invalid OCG Action State array, expected name instead of ref");
+       }
+      } else {
+        error(errSyntaxWarning, -1, "Invalid item in OCG Action State array");
+      }
+      obj2.free();
+    }
+    // Add the last group
+    if (stList)
+      stateList->append(stList);
+  } else {
+    error(errSyntaxWarning, -1, "Invalid OCGState action");
+    delete stateList;
+    stateList = NULL;
+  }
+  obj1.free();
+
+  if (obj->dictLookup("PreserveRB", &obj1)->isBool()) {
+    preserveRB = obj1.getBool();
+  }
+  obj1.free();
+}
+
+LinkOCGState::~LinkOCGState() {
+  if (stateList)
+    deleteGooList(stateList, StateList);
+}
+
+LinkOCGState::StateList::~StateList() {
+  if (list)
+    deleteGooList(list, Ref);
+}
+
+//------------------------------------------------------------------------
+// LinkUnknown
+//------------------------------------------------------------------------
+
+LinkUnknown::LinkUnknown(char *actionA) {
+  action = new GooString(actionA);
+}
+
+LinkUnknown::~LinkUnknown() {
+  delete action;
+}
+
+//------------------------------------------------------------------------
+// Links
+//------------------------------------------------------------------------
+
+Links::Links(Annots *annots) {
+  int size;
+  int i;
+
+  links = NULL;
+  size = 0;
+  numLinks = 0;
+
+  if (!annots)
+    return;
+
+  for (i = 0; i < annots->getNumAnnots(); ++i) {
+    Annot *annot = annots->getAnnot(i);
+
+    if (annot->getType() != Annot::typeLink)
+      continue;
+
+    if (numLinks >= size) {
+      size += 16;
+      links = (AnnotLink **)greallocn(links, size, sizeof(AnnotLink *));
+    }
+    annot->incRefCnt();
+    links[numLinks++] = static_cast<AnnotLink *>(annot);
+  }
+}
+
+Links::~Links() {
+  int i;
+
+  for (i = 0; i < numLinks; ++i)
+    links[i]->decRefCnt();
+
+  gfree(links);
+}
+
+LinkAction *Links::find(double x, double y) const {
+  int i;
+
+  for (i = numLinks - 1; i >= 0; --i) {
+    if (links[i]->inRect(x, y)) {
+      return links[i]->getAction();
+    }
+  }
+  return NULL;
+}
+
+GBool Links::onLink(double x, double y) const {
+  int i;
+
+  for (i = 0; i < numLinks; ++i) {
+    if (links[i]->inRect(x, y))
+      return gTrue;
+  }
+  return gFalse;
+}
diff --git a/poppler/Link.h b/poppler/Link.h
new file mode 100644 (file)
index 0000000..8e2df24
--- /dev/null
@@ -0,0 +1,490 @@
+//========================================================================
+//
+// Link.h
+//
+// Copyright 1996-2003 Glyph & Cog, LLC
+//
+//========================================================================
+
+//========================================================================
+//
+// Modified under the Poppler project - http://poppler.freedesktop.org
+//
+// All changes made under the Poppler project to this file are licensed
+// under GPL version 2 or later
+//
+// Copyright (C) 2006, 2008 Pino Toscano <pino@kde.org>
+// Copyright (C) 2008 Hugo Mercier <hmercier31@gmail.com>
+// Copyright (C) 2010, 2011 Carlos Garcia Campos <carlosgc@gnome.org>
+//
+// To see a description of the changes please see the Changelog file that
+// came with your tarball or type make ChangeLog if you are building from git
+//
+//========================================================================
+
+#ifndef LINK_H
+#define LINK_H
+
+#ifdef USE_GCC_PRAGMAS
+#pragma interface
+#endif
+
+#include "Object.h"
+
+class GooString;
+class GooList;
+class Array;
+class Dict;
+class Sound;
+class MediaRendition;
+class AnnotLink;
+class Annots;
+
+//------------------------------------------------------------------------
+// LinkAction
+//------------------------------------------------------------------------
+
+enum LinkActionKind {
+  actionGoTo,                  // go to destination
+  actionGoToR,                 // go to destination in new file
+  actionLaunch,                        // launch app (or open document)
+  actionURI,                   // URI
+  actionNamed,                 // named action
+  actionMovie,                 // movie action
+  actionRendition,
+  actionSound,                 // sound action
+  actionJavaScript,            // JavaScript action
+  actionOCGState,               // Set-OCG-State action
+  actionUnknown                        // anything else
+};
+
+class LinkAction {
+public:
+
+  // Destructor.
+  virtual ~LinkAction() {}
+
+  // Was the LinkAction created successfully?
+  virtual GBool isOk() = 0;
+
+  // Check link action type.
+  virtual LinkActionKind getKind() = 0;
+
+  // Parse a destination (old-style action) name, string, or array.
+  static LinkAction *parseDest(Object *obj);
+
+  // Parse an action dictionary.
+  static LinkAction *parseAction(Object *obj, GooString *baseURI = NULL);
+};
+
+//------------------------------------------------------------------------
+// LinkDest
+//------------------------------------------------------------------------
+
+enum LinkDestKind {
+  destXYZ,
+  destFit,
+  destFitH,
+  destFitV,
+  destFitR,
+  destFitB,
+  destFitBH,
+  destFitBV
+};
+
+class LinkDest {
+public:
+
+  // Build a LinkDest from the array.
+  LinkDest(Array *a);
+
+  // Copy a LinkDest.
+  LinkDest *copy() { return new LinkDest(this); }
+
+  // Was the LinkDest created successfully?
+  GBool isOk() { return ok; }
+
+  // Accessors.
+  LinkDestKind getKind() { return kind; }
+  GBool isPageRef() { return pageIsRef; }
+  int getPageNum() { return pageNum; }
+  Ref getPageRef() { return pageRef; }
+  double getLeft() { return left; }
+  double getBottom() { return bottom; }
+  double getRight() { return right; }
+  double getTop() { return top; }
+  double getZoom() { return zoom; }
+  GBool getChangeLeft() { return changeLeft; }
+  GBool getChangeTop() { return changeTop; }
+  GBool getChangeZoom() { return changeZoom; }
+
+private:
+
+  LinkDestKind kind;           // destination type
+  GBool pageIsRef;             // is the page a reference or number?
+  union {
+    Ref pageRef;               // reference to page
+    int pageNum;               // one-relative page number
+  };
+  double left, bottom;         // position
+  double right, top;
+  double zoom;                 // zoom factor
+  GBool changeLeft, changeTop; // which position components to change:
+  GBool changeZoom;            //   destXYZ uses all three;
+                               //   destFitH/BH use changeTop;
+                               //   destFitV/BV use changeLeft
+  GBool ok;                    // set if created successfully
+
+  LinkDest(LinkDest *dest);
+};
+
+//------------------------------------------------------------------------
+// LinkGoTo
+//------------------------------------------------------------------------
+
+class LinkGoTo: public LinkAction {
+public:
+
+  // Build a LinkGoTo from a destination (dictionary, name, or string).
+  LinkGoTo(Object *destObj);
+
+  // Destructor.
+  virtual ~LinkGoTo();
+
+  // Was the LinkGoTo created successfully?
+  virtual GBool isOk() { return dest || namedDest; }
+
+  // Accessors.
+  virtual LinkActionKind getKind() { return actionGoTo; }
+  LinkDest *getDest() { return dest; }
+  GooString *getNamedDest() { return namedDest; }
+
+private:
+
+  LinkDest *dest;              // regular destination (NULL for remote
+                               //   link with bad destination)
+  GooString *namedDest;        // named destination (only one of dest and
+                               //   and namedDest may be non-NULL)
+};
+
+//------------------------------------------------------------------------
+// LinkGoToR
+//------------------------------------------------------------------------
+
+class LinkGoToR: public LinkAction {
+public:
+
+  // Build a LinkGoToR from a file spec (dictionary) and destination
+  // (dictionary, name, or string).
+  LinkGoToR(Object *fileSpecObj, Object *destObj);
+
+  // Destructor.
+  virtual ~LinkGoToR();
+
+  // Was the LinkGoToR created successfully?
+  virtual GBool isOk() { return fileName && (dest || namedDest); }
+
+  // Accessors.
+  virtual LinkActionKind getKind() { return actionGoToR; }
+  GooString *getFileName() { return fileName; }
+  LinkDest *getDest() { return dest; }
+  GooString *getNamedDest() { return namedDest; }
+
+private:
+
+  GooString *fileName;         // file name
+  LinkDest *dest;              // regular destination (NULL for remote
+                               //   link with bad destination)
+  GooString *namedDest;        // named destination (only one of dest and
+                               //   and namedDest may be non-NULL)
+};
+
+//------------------------------------------------------------------------
+// LinkLaunch
+//------------------------------------------------------------------------
+
+class LinkLaunch: public LinkAction {
+public:
+
+  // Build a LinkLaunch from an action dictionary.
+  LinkLaunch(Object *actionObj);
+
+  // Destructor.
+  virtual ~LinkLaunch();
+
+  // Was the LinkLaunch created successfully?
+  virtual GBool isOk() { return fileName != NULL; }
+
+  // Accessors.
+  virtual LinkActionKind getKind() { return actionLaunch; }
+  GooString *getFileName() { return fileName; }
+  GooString *getParams() { return params; }
+
+private:
+
+  GooString *fileName;         // file name
+  GooString *params;           // parameters
+};
+
+//------------------------------------------------------------------------
+// LinkURI
+//------------------------------------------------------------------------
+
+class LinkURI: public LinkAction {
+public:
+
+  // Build a LinkURI given the URI (string) and base URI.
+  LinkURI(Object *uriObj, GooString *baseURI);
+
+  // Destructor.
+  virtual ~LinkURI();
+
+  // Was the LinkURI created successfully?
+  virtual GBool isOk() { return uri != NULL; }
+
+  // Accessors.
+  virtual LinkActionKind getKind() { return actionURI; }
+  GooString *getURI() { return uri; }
+
+private:
+
+  GooString *uri;                      // the URI
+};
+
+//------------------------------------------------------------------------
+// LinkNamed
+//------------------------------------------------------------------------
+
+class LinkNamed: public LinkAction {
+public:
+
+  // Build a LinkNamed given the action name.
+  LinkNamed(Object *nameObj);
+
+  virtual ~LinkNamed();
+
+  virtual GBool isOk() { return name != NULL; }
+
+  virtual LinkActionKind getKind() { return actionNamed; }
+  GooString *getName() { return name; }
+
+private:
+
+  GooString *name;
+};
+
+
+//------------------------------------------------------------------------
+// LinkMovie
+//------------------------------------------------------------------------
+
+class LinkMovie: public LinkAction {
+public:
+
+  enum OperationType {
+    operationTypePlay,
+    operationTypePause,
+    operationTypeResume,
+    operationTypeStop
+  };
+
+  LinkMovie(Object *obj);
+  virtual ~LinkMovie();
+
+  virtual GBool isOk() { return annotRef.num >= 0 || annotTitle != NULL; }
+  virtual LinkActionKind getKind() { return actionMovie; }
+
+  // a movie action stores either an indirect reference to a movie annotation
+  // or the movie annotation title
+
+  GBool hasAnnotRef() { return annotRef.num >= 0; }
+  GBool hasAnnotTitle() { return annotTitle != NULL; }
+  Ref *getAnnotRef() { return &annotRef; }
+  GooString *getAnnotTitle() { return annotTitle; }
+
+  OperationType getOperation() { return operation; }
+
+private:
+
+  Ref annotRef;            // Annotation
+  GooString *annotTitle;   // T
+
+  OperationType operation; // Operation
+};
+
+
+//------------------------------------------------------------------------
+// LinkRendition
+//------------------------------------------------------------------------
+
+class LinkRendition: public LinkAction {
+public:
+
+  LinkRendition(Object *Obj);
+
+  virtual ~LinkRendition();
+
+  virtual GBool isOk() { return true; }
+
+  virtual LinkActionKind getKind() { return actionRendition; }
+
+  GBool hasRenditionObject() { return renditionObj.isDict(); }
+  Object* getRenditionObject() { return &renditionObj; }
+
+  GBool hasScreenAnnot() { return screenRef.isRef(); }
+  Ref getScreenAnnot() { return screenRef.getRef(); }
+
+  int getOperation() { return operation; }
+
+  MediaRendition* getMedia() { return media; }
+
+  GooString *getScript() { return js; }
+
+private:
+
+  Object screenRef;
+  Object renditionObj;
+  int operation;
+
+  MediaRendition* media;
+
+  GooString *js;
+};
+
+//------------------------------------------------------------------------
+// LinkSound
+//------------------------------------------------------------------------
+
+class LinkSound: public LinkAction {
+public:
+
+  LinkSound(Object *soundObj);
+
+  virtual ~LinkSound();
+
+  virtual GBool isOk() { return sound != NULL; }
+
+  virtual LinkActionKind getKind() { return actionSound; }
+
+  double getVolume() { return volume; }
+  GBool getSynchronous() { return sync; }
+  GBool getRepeat() { return repeat; }
+  GBool getMix() { return mix; }
+  Sound *getSound() { return sound; }
+
+private:
+
+  double volume;
+  GBool sync;
+  GBool repeat;
+  GBool mix;
+  Sound *sound;
+};
+
+//------------------------------------------------------------------------
+// LinkJavaScript
+//------------------------------------------------------------------------
+
+class LinkJavaScript: public LinkAction {
+public:
+
+  // Build a LinkJavaScript given the action name.
+  LinkJavaScript(Object *jsObj);
+
+  virtual ~LinkJavaScript();
+
+  virtual GBool isOk() { return js != NULL; }
+
+  virtual LinkActionKind getKind() { return actionJavaScript; }
+  GooString *getScript() { return js; }
+
+private:
+
+  GooString *js;
+};
+
+//------------------------------------------------------------------------
+// LinkOCGState
+//------------------------------------------------------------------------
+class LinkOCGState: public LinkAction {
+public:
+  LinkOCGState(Object *obj);
+
+  virtual ~LinkOCGState();
+
+  virtual GBool isOk() { return stateList != NULL; }
+
+  virtual LinkActionKind getKind() { return actionOCGState; }
+
+  enum State { On, Off, Toggle};
+  struct StateList {
+    StateList() { list = NULL; }
+    ~StateList();
+    State st;
+    GooList *list;
+  };
+
+  GooList *getStateList() { return stateList; }
+  GBool getPreserveRB() { return preserveRB; }
+
+private:
+  GooList *stateList;
+  GBool preserveRB;
+};
+
+//------------------------------------------------------------------------
+// LinkUnknown
+//------------------------------------------------------------------------
+
+class LinkUnknown: public LinkAction {
+public:
+
+  // Build a LinkUnknown with the specified action type.
+  LinkUnknown(char *actionA);
+
+  // Destructor.
+  virtual ~LinkUnknown();
+
+  // Was the LinkUnknown create successfully?
+  virtual GBool isOk() { return action != NULL; }
+
+  // Accessors.
+  virtual LinkActionKind getKind() { return actionUnknown; }
+  GooString *getAction() { return action; }
+
+private:
+
+  GooString *action;           // action subtype
+};
+
+//------------------------------------------------------------------------
+// Links
+//------------------------------------------------------------------------
+
+class Links {
+public:
+
+  // Extract links from array of annotations.
+  Links(Annots *annots);
+
+  // Destructor.
+  ~Links();
+
+  // Iterate through list of links.
+  int getNumLinks() const { return numLinks; }
+  AnnotLink *getLink(int i) const { return links[i]; }
+
+  // If point <x>,<y> is in a link, return the associated action;
+  // else return NULL.
+  LinkAction *find(double x, double y) const;
+
+  // Return true if <x>,<y> is in a link.
+  GBool onLink(double x, double y) const;
+
+private:
+
+  AnnotLink **links;
+  int numLinks;
+};
+
+#endif
diff --git a/poppler/LocalPDFDocBuilder.cc b/poppler/LocalPDFDocBuilder.cc
new file mode 100644 (file)
index 0000000..6f6f1fc
--- /dev/null
@@ -0,0 +1,46 @@
+//========================================================================
+//
+// LocalPDFDocBuilder.cc
+//
+// This file is licensed under the GPLv2 or later
+//
+// Copyright 2010 Hib Eris <hib@hiberis.nl>
+// Copyright 2010 Albert Astals Cid <aacid@kde.org>
+//
+//========================================================================
+
+#include <config.h>
+
+#include "LocalPDFDocBuilder.h"
+
+//------------------------------------------------------------------------
+// LocalPDFDocBuilder
+//------------------------------------------------------------------------
+
+PDFDoc *
+LocalPDFDocBuilder::buildPDFDoc(
+    const GooString &uri, GooString *ownerPassword, GooString
+    *userPassword, void *guiDataA)
+{
+  if (uri.cmpN("file://", 7) == 0) {
+     GooString *fileName = uri.copy();
+     fileName->del(0, 7);
+     return new PDFDoc(fileName, ownerPassword, userPassword, guiDataA);
+  } else {
+     GooString *fileName = uri.copy();
+     return new PDFDoc(fileName, ownerPassword, userPassword, guiDataA);
+  }
+}
+
+GBool LocalPDFDocBuilder::supports(const GooString &uri)
+{
+  if (uri.cmpN("file://", 7) == 0) {
+    return gTrue;
+  } else if (!strstr(uri.getCString(), "://")) {
+    return gTrue;
+  } else {
+    return gFalse;
+  }
+}
+
+
diff --git a/poppler/LocalPDFDocBuilder.h b/poppler/LocalPDFDocBuilder.h
new file mode 100644 (file)
index 0000000..c2b1d90
--- /dev/null
@@ -0,0 +1,33 @@
+//========================================================================
+//
+// LocalPDFDocBuilder.h
+//
+// This file is licensed under the GPLv2 or later
+//
+// Copyright 2010 Hib Eris <hib@hiberis.nl>
+// Copyright 2010 Albert Astals Cid <aacid@kde.org>
+//
+//========================================================================
+
+#ifndef LOCALPDFDOCBUILDER_H
+#define LOCALPDFDOCBUILDER_H
+
+#include "PDFDocBuilder.h"
+
+//------------------------------------------------------------------------
+// LocalPDFDocBuilder
+//
+// The LocalPDFDocBuilder implements a PDFDocBuilder for local files.
+//------------------------------------------------------------------------
+
+class LocalPDFDocBuilder : public PDFDocBuilder {
+
+public:
+
+  PDFDoc *buildPDFDoc(const GooString &uri, GooString *ownerPassword = NULL,
+    GooString *userPassword = NULL, void *guiDataA = NULL);
+  GBool supports(const GooString &uri);
+
+};
+
+#endif /* LOCALPDFDOCBUILDER_H */
diff --git a/poppler/Makefile.am b/poppler/Makefile.am
new file mode 100644 (file)
index 0000000..8920f8e
--- /dev/null
@@ -0,0 +1,331 @@
+if BUILD_SPLASH_OUTPUT
+
+splash_sources =                               \
+       SplashOutputDev.cc
+
+splash_headers =                               \
+       SplashOutputDev.h
+
+splash_includes =                              \
+       $(SPLASH_CFLAGS)
+
+splash_libs =                                  \
+       $(SPLASH_LIBS)                          \
+       $(top_builddir)/splash/libsplash.la
+
+endif
+
+if BUILD_POPPLER_QT4
+
+poppler_arthur = libpoppler-arthur.la
+
+libpoppler_arthur_la_SOURCES =                 \
+       ArthurOutputDev.h                       \
+       ArthurOutputDev.cc
+
+arthur_includes =                              \
+       $(POPPLER_QT4_CFLAGS)
+
+arthur_libs =                                  \
+       $(POPPLER_QT4_LIBS)
+
+endif
+
+
+
+if BUILD_CAIRO_OUTPUT
+
+poppler_cairo = libpoppler-cairo.la
+
+cairo_includes =                               \
+       $(CAIRO_CFLAGS)
+
+cairo_libs =                                   \
+       $(CAIRO_LIBS)
+
+libpoppler_cairo_la_SOURCES =                  \
+       CairoFontEngine.cc                      \
+       CairoFontEngine.h                       \
+       CairoOutputDev.cc                       \
+       CairoOutputDev.h                        \
+       CairoRescaleBox.cc                      \
+       CairoRescaleBox.h
+
+endif
+
+if BUILD_LIBJPEG
+
+libjpeg_sources =                              \
+       DCTStream.h                             \
+       DCTStream.cc
+
+libjpeg_libs =                                 \
+       $(LIBJPEG_LIBS)
+libjpeg_includes =                             \
+       $(LIBJPEG_CFLAGS)
+
+endif
+
+if BUILD_LIBPNG
+
+libpng_libs =                                  \
+       $(LIBPNG_LIBS)
+libpng_includes =                              \
+       $(LIBPNG_CFLAGS)
+
+endif
+
+if BUILD_LIBTIFF
+
+libtiff_libs =                                 \
+       $(LIBTIFF_LIBS)
+libtiff_includes =                             \
+       $(LIBTIFF_CFLAGS)
+
+endif
+
+if BUILD_LIBOPENJPEG
+
+libjpeg2000_sources =                          \
+       JPEG2000Stream.h                        \
+       JPEG2000Stream.cc
+
+libjpeg2000_libs =                             \
+       $(LIBOPENJPEG_LIBS)
+libjpeg2000_includes =                         \
+       $(LIBOPENJPEG_CFLAGS)
+
+else
+
+libjpeg2000_sources =                          \
+       JPXStream.h                     \
+       JPXStream.cc
+
+endif
+
+
+if BUILD_ZLIB
+
+zlib_sources =                                 \
+       FlateStream.h                           \
+       FlateStream.cc
+
+zlib_libs =                                    \
+       $(ZLIB_LIBS)
+
+endif
+
+if BUILD_LIBCURL
+
+libcurl_libs =                                 \
+       $(LIBCURL_LIBS)
+
+libcurl_includes =                             \
+       $(LIBCURL_CFLAGS)
+
+curl_headers =                                 \
+       CurlCachedFile.h                        \
+       CurlPDFDocBuilder.h
+
+curl_sources =                                 \
+       CurlCachedFile.cc                       \
+       CurlPDFDocBuilder.cc
+
+endif
+
+if USE_CMS
+cms_includes = $(LCMS_CFLAGS)
+cms_libs = $(LCMS_LIBS)
+endif
+
+INCLUDES =                                     \
+       -I$(top_srcdir)                         \
+       -I$(top_srcdir)/goo                     \
+       $(cms_includes)                         \
+       $(splash_includes)                      \
+       $(cairo_includes)                       \
+       $(arthur_includes)                      \
+       $(libjpeg_includes)                     \
+       $(libtiff_includes)                     \
+       $(libjpeg2000_includes)                 \
+       $(libpng_includes)                      \
+       $(libcurl_includes)                     \
+       $(FREETYPE_CFLAGS)                      \
+       $(FONTCONFIG_CFLAGS)
+
+lib_LTLIBRARIES = libpoppler.la
+
+noinst_LTLIBRARIES = $(poppler_cairo)          \
+       $(poppler_arthur)
+
+CFLAGS+=$(PTHREAD_CFLAGS)
+CXXFLAGS+=$(PTHREAD_CFLAGS)
+
+libpoppler_la_LIBADD =                         \
+       $(top_builddir)/goo/libgoo.la           \
+       $(top_builddir)/fofi/libfofi.la         \
+       $(cms_libs)                             \
+       $(splash_libs)                          \
+       $(libtiff_libs)                         \
+       $(libjpeg_libs)                         \
+       $(libpng_libs)                          \
+       $(zlib_libs)                            \
+       $(libcurl_libs)                         \
+       $(libjpeg2000_libs)                     \
+       $(FREETYPE_LIBS)                        \
+       $(FONTCONFIG_LIBS)                      \
+       $(PTHREAD_LIBS)                         \
+       $(win32_libs)
+
+libpoppler_la_LDFLAGS = -version-info 25:0:0 @create_shared_lib@ @auto_import_flags@
+
+if ENABLE_XPDF_HEADERS
+
+poppler_includedir = $(includedir)/poppler
+poppler_include_HEADERS =      \
+       $(splash_headers)       \
+       $(curl_headers)         \
+       Annot.h                 \
+       Array.h                 \
+       BuiltinFont.h           \
+       BuiltinFontTables.h     \
+       CachedFile.h            \
+       Catalog.h               \
+       CharCodeToUnicode.h     \
+       CMap.h                  \
+       DateInfo.h              \
+       Decrypt.h               \
+       Dict.h                  \
+       Error.h                 \
+       FileSpec.h              \
+       FontEncodingTables.h    \
+       FontInfo.h              \
+       Form.h                  \
+       Function.h              \
+       Gfx.h                   \
+       GfxFont.h               \
+       GfxState.h              \
+       GfxState_helpers.h      \
+       GlobalParams.h          \
+       Hints.h                 \
+       JArithmeticDecoder.h    \
+       JBIG2Stream.h           \
+       Lexer.h                 \
+       Linearization.h         \
+       Link.h                  \
+       LocalPDFDocBuilder.h    \
+       Movie.h                 \
+       NameToCharCode.h        \
+       Object.h                \
+       OptionalContent.h       \
+       Outline.h               \
+       OutputDev.h             \
+       Page.h                  \
+       PageTransition.h        \
+       Parser.h                \
+       PDFDoc.h                \
+       PDFDocBuilder.h         \
+       PDFDocEncoding.h        \
+       PDFDocFactory.h         \
+       PopplerCache.h          \
+       ProfileData.h           \
+       PreScanOutputDev.h      \
+       PSTokenizer.h           \
+       Rendition.h             \
+       StdinCachedFile.h       \
+       StdinPDFDocBuilder.h    \
+       Stream-CCITT.h          \
+       Stream.h                \
+       UnicodeMap.h            \
+       UnicodeMapTables.h      \
+       UnicodeTypeTable.h      \
+       UnicodeCClassTables.h   \
+       UnicodeCompTables.h     \
+       UnicodeDecompTables.h   \
+       ViewerPreferences.h     \
+       XRef.h                  \
+       CharTypes.h             \
+       CompactFontTables.h     \
+       ErrorCodes.h            \
+       NameToUnicodeTable.h    \
+       PSOutputDev.h           \
+       TextOutputDev.h         \
+       SecurityHandler.h       \
+       UTF8.h                  \
+       XpdfPluginAPI.h         \
+       Sound.h
+nodist_poppler_include_HEADERS = poppler-config.h
+
+endif
+
+libpoppler_la_SOURCES =                \
+       $(splash_sources)       \
+       $(cairo_sources)        \
+       $(arthur_sources)       \
+       $(libjpeg_sources)      \
+       $(zlib_sources)         \
+       $(libjpeg2000_sources)  \
+       $(curl_sources)         \
+       Annot.cc                \
+       Array.cc                \
+       BuiltinFont.cc          \
+       BuiltinFontTables.cc    \
+       CachedFile.cc           \
+       Catalog.cc              \
+       CharCodeToUnicode.cc    \
+       CMap.cc                 \
+       DateInfo.cc             \
+       Decrypt.cc              \
+       Dict.cc                 \
+       Error.cc                \
+       FileSpec.cc             \
+       FontEncodingTables.cc   \
+       Form.cc                 \
+       FontInfo.cc             \
+       Function.cc             \
+       Gfx.cc                  \
+       GfxFont.cc              \
+       GfxState.cc             \
+       GlobalParams.cc         \
+       Hints.cc                \
+       JArithmeticDecoder.cc   \
+       JBIG2Stream.cc          \
+       Lexer.cc                \
+       Linearization.cc        \
+       Link.cc                 \
+       LocalPDFDocBuilder.cc   \
+       Movie.cc                \
+       NameToCharCode.cc       \
+       Object.cc               \
+       OptionalContent.cc      \
+       Outline.cc              \
+       OutputDev.cc            \
+       Page.cc                 \
+       PageTransition.cc       \
+       Parser.cc               \
+       PDFDoc.cc               \
+       PDFDocEncoding.cc       \
+       PDFDocFactory.cc        \
+       PopplerCache.cc         \
+       ProfileData.cc          \
+       PreScanOutputDev.cc \
+       PSTokenizer.cc          \
+       Rendition.cc            \
+       StdinCachedFile.cc      \
+       StdinPDFDocBuilder.cc   \
+       Stream.cc               \
+       strtok_r.cpp            \
+       UnicodeMap.cc           \
+       UnicodeTypeTable.cc     \
+       ViewerPreferences.cc    \
+       XRef.cc                 \
+       PSOutputDev.cc          \
+       TextOutputDev.cc        \
+       PageLabelInfo.h         \
+       PageLabelInfo.cc        \
+       SecurityHandler.cc      \
+       Sound.cc                \
+       XpdfPluginAPI.cc
+
+EXTRA_DIST = gen-unicode-tables.py     \
+             GlobalParamsWin.cc
diff --git a/poppler/Makefile.in b/poppler/Makefile.in
new file mode 100644 (file)
index 0000000..a10eb7b
--- /dev/null
@@ -0,0 +1,1224 @@
+# Makefile.in generated by automake 1.11.5 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software
+# Foundation, Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+@SET_MAKE@
+
+
+VPATH = @srcdir@
+am__make_dryrun = \
+  { \
+    am__dry=no; \
+    case $$MAKEFLAGS in \
+      *\\[\ \  ]*) \
+        echo 'am--echo: ; @echo "AM"  OK' | $(MAKE) -f - 2>/dev/null \
+          | grep '^AM OK$$' >/dev/null || am__dry=yes;; \
+      *) \
+        for am__flg in $$MAKEFLAGS; do \
+          case $$am__flg in \
+            *=*|--*) ;; \
+            *n*) am__dry=yes; break;; \
+          esac; \
+        done;; \
+    esac; \
+    test $$am__dry = yes; \
+  }
+pkgdatadir = $(datadir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkglibexecdir = $(libexecdir)/@PACKAGE@
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+subdir = poppler
+DIST_COMMON = $(am__poppler_include_HEADERS_DIST) \
+       $(srcdir)/Makefile.am $(srcdir)/Makefile.in \
+       $(srcdir)/poppler-config.h.in
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/m4/acx_pthread.m4 \
+       $(top_srcdir)/m4/define-dir.m4 $(top_srcdir)/m4/gtk-doc.m4 \
+       $(top_srcdir)/m4/iconv.m4 $(top_srcdir)/m4/introspection.m4 \
+       $(top_srcdir)/m4/libjpeg.m4 $(top_srcdir)/m4/libtool.m4 \
+       $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \
+       $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \
+       $(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+       $(ACLOCAL_M4)
+mkinstalldirs = $(install_sh) -d
+CONFIG_HEADER = $(top_builddir)/config.h poppler-config.h
+CONFIG_CLEAN_FILES =
+CONFIG_CLEAN_VPATH_FILES =
+am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
+am__vpath_adj = case $$p in \
+    $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
+    *) f=$$p;; \
+  esac;
+am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`;
+am__install_max = 40
+am__nobase_strip_setup = \
+  srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'`
+am__nobase_strip = \
+  for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||"
+am__nobase_list = $(am__nobase_strip_setup); \
+  for p in $$list; do echo "$$p $$p"; done | \
+  sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \
+  $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \
+    if (++n[$$2] == $(am__install_max)) \
+      { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \
+    END { for (dir in files) print dir, files[dir] }'
+am__base_list = \
+  sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
+  sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
+am__uninstall_files_from_dir = { \
+  test -z "$$files" \
+    || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \
+    || { echo " ( cd '$$dir' && rm -f" $$files ")"; \
+         $(am__cd) "$$dir" && rm -f $$files; }; \
+  }
+am__installdirs = "$(DESTDIR)$(libdir)" \
+       "$(DESTDIR)$(poppler_includedir)" \
+       "$(DESTDIR)$(poppler_includedir)"
+LTLIBRARIES = $(lib_LTLIBRARIES) $(noinst_LTLIBRARIES)
+libpoppler_arthur_la_LIBADD =
+am__libpoppler_arthur_la_SOURCES_DIST = ArthurOutputDev.h \
+       ArthurOutputDev.cc
+@BUILD_POPPLER_QT4_TRUE@am_libpoppler_arthur_la_OBJECTS =  \
+@BUILD_POPPLER_QT4_TRUE@       ArthurOutputDev.lo
+libpoppler_arthur_la_OBJECTS = $(am_libpoppler_arthur_la_OBJECTS)
+AM_V_lt = $(am__v_lt_@AM_V@)
+am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@)
+am__v_lt_0 = --silent
+@BUILD_POPPLER_QT4_TRUE@am_libpoppler_arthur_la_rpath =
+libpoppler_cairo_la_LIBADD =
+am__libpoppler_cairo_la_SOURCES_DIST = CairoFontEngine.cc \
+       CairoFontEngine.h CairoOutputDev.cc CairoOutputDev.h \
+       CairoRescaleBox.cc CairoRescaleBox.h
+@BUILD_CAIRO_OUTPUT_TRUE@am_libpoppler_cairo_la_OBJECTS =  \
+@BUILD_CAIRO_OUTPUT_TRUE@      CairoFontEngine.lo CairoOutputDev.lo \
+@BUILD_CAIRO_OUTPUT_TRUE@      CairoRescaleBox.lo
+libpoppler_cairo_la_OBJECTS = $(am_libpoppler_cairo_la_OBJECTS)
+@BUILD_CAIRO_OUTPUT_TRUE@am_libpoppler_cairo_la_rpath =
+am__DEPENDENCIES_1 =
+@USE_CMS_TRUE@am__DEPENDENCIES_2 = $(am__DEPENDENCIES_1)
+@BUILD_SPLASH_OUTPUT_TRUE@am__DEPENDENCIES_3 =  \
+@BUILD_SPLASH_OUTPUT_TRUE@     $(top_builddir)/splash/libsplash.la
+@BUILD_LIBTIFF_TRUE@am__DEPENDENCIES_4 = $(am__DEPENDENCIES_1)
+@BUILD_LIBJPEG_TRUE@am__DEPENDENCIES_5 = $(am__DEPENDENCIES_1)
+@BUILD_LIBPNG_TRUE@am__DEPENDENCIES_6 = $(am__DEPENDENCIES_1)
+@BUILD_ZLIB_TRUE@am__DEPENDENCIES_7 = $(am__DEPENDENCIES_1)
+@BUILD_LIBCURL_TRUE@am__DEPENDENCIES_8 = $(am__DEPENDENCIES_1)
+@BUILD_LIBOPENJPEG_TRUE@am__DEPENDENCIES_9 = $(am__DEPENDENCIES_1)
+libpoppler_la_DEPENDENCIES = $(top_builddir)/goo/libgoo.la \
+       $(top_builddir)/fofi/libfofi.la $(am__DEPENDENCIES_2) \
+       $(am__DEPENDENCIES_3) $(am__DEPENDENCIES_4) \
+       $(am__DEPENDENCIES_5) $(am__DEPENDENCIES_6) \
+       $(am__DEPENDENCIES_7) $(am__DEPENDENCIES_8) \
+       $(am__DEPENDENCIES_9) $(am__DEPENDENCIES_1) \
+       $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
+       $(am__DEPENDENCIES_1)
+am__libpoppler_la_SOURCES_DIST = SplashOutputDev.cc DCTStream.h \
+       DCTStream.cc FlateStream.h FlateStream.cc JPXStream.h \
+       JPXStream.cc JPEG2000Stream.h JPEG2000Stream.cc \
+       CurlCachedFile.cc CurlPDFDocBuilder.cc Annot.cc Array.cc \
+       BuiltinFont.cc BuiltinFontTables.cc CachedFile.cc Catalog.cc \
+       CharCodeToUnicode.cc CMap.cc DateInfo.cc Decrypt.cc Dict.cc \
+       Error.cc FileSpec.cc FontEncodingTables.cc Form.cc FontInfo.cc \
+       Function.cc Gfx.cc GfxFont.cc GfxState.cc GlobalParams.cc \
+       Hints.cc JArithmeticDecoder.cc JBIG2Stream.cc Lexer.cc \
+       Linearization.cc Link.cc LocalPDFDocBuilder.cc Movie.cc \
+       NameToCharCode.cc Object.cc OptionalContent.cc Outline.cc \
+       OutputDev.cc Page.cc PageTransition.cc Parser.cc PDFDoc.cc \
+       PDFDocEncoding.cc PDFDocFactory.cc PopplerCache.cc \
+       ProfileData.cc PreScanOutputDev.cc PSTokenizer.cc Rendition.cc \
+       StdinCachedFile.cc StdinPDFDocBuilder.cc Stream.cc \
+       strtok_r.cpp UnicodeMap.cc UnicodeTypeTable.cc \
+       ViewerPreferences.cc XRef.cc PSOutputDev.cc TextOutputDev.cc \
+       PageLabelInfo.h PageLabelInfo.cc SecurityHandler.cc Sound.cc \
+       XpdfPluginAPI.cc
+@BUILD_SPLASH_OUTPUT_TRUE@am__objects_1 = SplashOutputDev.lo
+@BUILD_LIBJPEG_TRUE@am__objects_2 = DCTStream.lo
+@BUILD_ZLIB_TRUE@am__objects_3 = FlateStream.lo
+@BUILD_LIBOPENJPEG_FALSE@am__objects_4 = JPXStream.lo
+@BUILD_LIBOPENJPEG_TRUE@am__objects_4 = JPEG2000Stream.lo
+@BUILD_LIBCURL_TRUE@am__objects_5 = CurlCachedFile.lo \
+@BUILD_LIBCURL_TRUE@   CurlPDFDocBuilder.lo
+am_libpoppler_la_OBJECTS = $(am__objects_1) $(am__objects_2) \
+       $(am__objects_3) $(am__objects_4) $(am__objects_5) Annot.lo \
+       Array.lo BuiltinFont.lo BuiltinFontTables.lo CachedFile.lo \
+       Catalog.lo CharCodeToUnicode.lo CMap.lo DateInfo.lo Decrypt.lo \
+       Dict.lo Error.lo FileSpec.lo FontEncodingTables.lo Form.lo \
+       FontInfo.lo Function.lo Gfx.lo GfxFont.lo GfxState.lo \
+       GlobalParams.lo Hints.lo JArithmeticDecoder.lo JBIG2Stream.lo \
+       Lexer.lo Linearization.lo Link.lo LocalPDFDocBuilder.lo \
+       Movie.lo NameToCharCode.lo Object.lo OptionalContent.lo \
+       Outline.lo OutputDev.lo Page.lo PageTransition.lo Parser.lo \
+       PDFDoc.lo PDFDocEncoding.lo PDFDocFactory.lo PopplerCache.lo \
+       ProfileData.lo PreScanOutputDev.lo PSTokenizer.lo Rendition.lo \
+       StdinCachedFile.lo StdinPDFDocBuilder.lo Stream.lo strtok_r.lo \
+       UnicodeMap.lo UnicodeTypeTable.lo ViewerPreferences.lo XRef.lo \
+       PSOutputDev.lo TextOutputDev.lo PageLabelInfo.lo \
+       SecurityHandler.lo Sound.lo XpdfPluginAPI.lo
+libpoppler_la_OBJECTS = $(am_libpoppler_la_OBJECTS)
+libpoppler_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX \
+       $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CXXLD) \
+       $(AM_CXXFLAGS) $(CXXFLAGS) $(libpoppler_la_LDFLAGS) $(LDFLAGS) \
+       -o $@
+DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)
+depcomp = $(SHELL) $(top_srcdir)/depcomp
+am__depfiles_maybe = depfiles
+am__mv = mv -f
+CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
+       $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)
+LTCXXCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \
+       $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) \
+       $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
+       $(AM_CXXFLAGS) $(CXXFLAGS)
+AM_V_CXX = $(am__v_CXX_@AM_V@)
+am__v_CXX_ = $(am__v_CXX_@AM_DEFAULT_V@)
+am__v_CXX_0 = @echo "  CXX   " $@;
+AM_V_at = $(am__v_at_@AM_V@)
+am__v_at_ = $(am__v_at_@AM_DEFAULT_V@)
+am__v_at_0 = @
+CXXLD = $(CXX)
+CXXLINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \
+       $(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \
+       $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
+AM_V_CXXLD = $(am__v_CXXLD_@AM_V@)
+am__v_CXXLD_ = $(am__v_CXXLD_@AM_DEFAULT_V@)
+am__v_CXXLD_0 = @echo "  CXXLD " $@;
+COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
+       $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
+LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
+       $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \
+       $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
+       $(AM_CFLAGS) $(CFLAGS)
+AM_V_CC = $(am__v_CC_@AM_V@)
+am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@)
+am__v_CC_0 = @echo "  CC    " $@;
+CCLD = $(CC)
+LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
+       $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
+       $(AM_LDFLAGS) $(LDFLAGS) -o $@
+AM_V_CCLD = $(am__v_CCLD_@AM_V@)
+am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@)
+am__v_CCLD_0 = @echo "  CCLD  " $@;
+AM_V_GEN = $(am__v_GEN_@AM_V@)
+am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@)
+am__v_GEN_0 = @echo "  GEN   " $@;
+SOURCES = $(libpoppler_arthur_la_SOURCES) \
+       $(libpoppler_cairo_la_SOURCES) $(libpoppler_la_SOURCES)
+DIST_SOURCES = $(am__libpoppler_arthur_la_SOURCES_DIST) \
+       $(am__libpoppler_cairo_la_SOURCES_DIST) \
+       $(am__libpoppler_la_SOURCES_DIST)
+am__can_run_installinfo = \
+  case $$AM_UPDATE_INFO_DIR in \
+    n|no|NO) false;; \
+    *) (install-info --version) >/dev/null 2>&1;; \
+  esac
+am__poppler_include_HEADERS_DIST = SplashOutputDev.h CurlCachedFile.h \
+       CurlPDFDocBuilder.h Annot.h Array.h BuiltinFont.h \
+       BuiltinFontTables.h CachedFile.h Catalog.h CharCodeToUnicode.h \
+       CMap.h DateInfo.h Decrypt.h Dict.h Error.h FileSpec.h \
+       FontEncodingTables.h FontInfo.h Form.h Function.h Gfx.h \
+       GfxFont.h GfxState.h GfxState_helpers.h GlobalParams.h Hints.h \
+       JArithmeticDecoder.h JBIG2Stream.h Lexer.h Linearization.h \
+       Link.h LocalPDFDocBuilder.h Movie.h NameToCharCode.h Object.h \
+       OptionalContent.h Outline.h OutputDev.h Page.h \
+       PageTransition.h Parser.h PDFDoc.h PDFDocBuilder.h \
+       PDFDocEncoding.h PDFDocFactory.h PopplerCache.h ProfileData.h \
+       PreScanOutputDev.h PSTokenizer.h Rendition.h StdinCachedFile.h \
+       StdinPDFDocBuilder.h Stream-CCITT.h Stream.h UnicodeMap.h \
+       UnicodeMapTables.h UnicodeTypeTable.h UnicodeCClassTables.h \
+       UnicodeCompTables.h UnicodeDecompTables.h ViewerPreferences.h \
+       XRef.h CharTypes.h CompactFontTables.h ErrorCodes.h \
+       NameToUnicodeTable.h PSOutputDev.h TextOutputDev.h \
+       SecurityHandler.h UTF8.h XpdfPluginAPI.h Sound.h
+HEADERS = $(nodist_poppler_include_HEADERS) $(poppler_include_HEADERS)
+ETAGS = etags
+CTAGS = ctags
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AR = @AR@
+AS = @AS@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CAIRO_CFLAGS = @CAIRO_CFLAGS@
+CAIRO_FEATURE = @CAIRO_FEATURE@
+CAIRO_LIBS = @CAIRO_LIBS@
+CAIRO_REQ = @CAIRO_REQ@
+CAIRO_VERSION = @CAIRO_VERSION@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@ $(PTHREAD_CFLAGS)
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CXX = @CXX@
+CXXCPP = @CXXCPP@
+CXXDEPMODE = @CXXDEPMODE@
+CXXFLAGS = @CXXFLAGS@ $(PTHREAD_CFLAGS)
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DLLTOOL = @DLLTOOL@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+FGREP = @FGREP@
+FONTCONFIG_CFLAGS = @FONTCONFIG_CFLAGS@
+FONTCONFIG_LIBS = @FONTCONFIG_LIBS@
+FREETYPE_CFLAGS = @FREETYPE_CFLAGS@
+FREETYPE_CONFIG = @FREETYPE_CONFIG@
+FREETYPE_LIBS = @FREETYPE_LIBS@
+GLIB_MKENUMS = @GLIB_MKENUMS@
+GLIB_REQ = @GLIB_REQ@
+GLIB_REQUIRED = @GLIB_REQUIRED@
+GREP = @GREP@
+GTKDOC_CHECK = @GTKDOC_CHECK@
+GTKDOC_DEPS_CFLAGS = @GTKDOC_DEPS_CFLAGS@
+GTKDOC_DEPS_LIBS = @GTKDOC_DEPS_LIBS@
+GTKDOC_MKPDF = @GTKDOC_MKPDF@
+GTKDOC_REBASE = @GTKDOC_REBASE@
+GTK_TEST_CFLAGS = @GTK_TEST_CFLAGS@
+GTK_TEST_LIBS = @GTK_TEST_LIBS@
+HTML_DIR = @HTML_DIR@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+INTROSPECTION_CFLAGS = @INTROSPECTION_CFLAGS@
+INTROSPECTION_COMPILER = @INTROSPECTION_COMPILER@
+INTROSPECTION_GENERATE = @INTROSPECTION_GENERATE@
+INTROSPECTION_GIRDIR = @INTROSPECTION_GIRDIR@
+INTROSPECTION_LIBS = @INTROSPECTION_LIBS@
+INTROSPECTION_MAKEFILE = @INTROSPECTION_MAKEFILE@
+INTROSPECTION_SCANNER = @INTROSPECTION_SCANNER@
+INTROSPECTION_TYPELIBDIR = @INTROSPECTION_TYPELIBDIR@
+LCMS_CFLAGS = @LCMS_CFLAGS@
+LCMS_LIBS = @LCMS_LIBS@
+LD = @LD@
+LDFLAGS = @LDFLAGS@
+LIBCURL_CFLAGS = @LIBCURL_CFLAGS@
+LIBCURL_LIBS = @LIBCURL_LIBS@
+LIBICONV = @LIBICONV@
+LIBJPEG_CFLAGS = @LIBJPEG_CFLAGS@
+LIBJPEG_LIBS = @LIBJPEG_LIBS@
+LIBOBJS = @LIBOBJS@
+LIBOPENJPEG_CFLAGS = @LIBOPENJPEG_CFLAGS@
+LIBOPENJPEG_LIBS = @LIBOPENJPEG_LIBS@
+LIBPNG_CFLAGS = @LIBPNG_CFLAGS@
+LIBPNG_LIBS = @LIBPNG_LIBS@
+LIBS = @LIBS@
+LIBTIFF_CFLAGS = @LIBTIFF_CFLAGS@
+LIBTIFF_CFLAGSS = @LIBTIFF_CFLAGSS@
+LIBTIFF_LIBS = @LIBTIFF_LIBS@
+LIBTOOL = @LIBTOOL@
+LIPO = @LIPO@
+LN_S = @LN_S@
+LTLIBICONV = @LTLIBICONV@
+LTLIBOBJS = @LTLIBOBJS@
+MAKEINFO = @MAKEINFO@
+MANIFEST_TOOL = @MANIFEST_TOOL@
+MKDIR_P = @MKDIR_P@
+MOCQT4 = @MOCQT4@
+NM = @NM@
+NMEDIT = @NMEDIT@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+OTOOL = @OTOOL@
+OTOOL64 = @OTOOL64@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_URL = @PACKAGE_URL@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PC_REQUIRES = @PC_REQUIRES@
+PC_REQUIRES_PRIVATE = @PC_REQUIRES_PRIVATE@
+PDFTOCAIRO_CFLAGS = @PDFTOCAIRO_CFLAGS@
+PDFTOCAIRO_LIBS = @PDFTOCAIRO_LIBS@
+PKG_CONFIG = @PKG_CONFIG@
+PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@
+PKG_CONFIG_PATH = @PKG_CONFIG_PATH@
+POPPLER_DATADIR = @POPPLER_DATADIR@
+POPPLER_GLIB_CFLAGS = @POPPLER_GLIB_CFLAGS@
+POPPLER_GLIB_DISABLE_DEPRECATED = @POPPLER_GLIB_DISABLE_DEPRECATED@
+POPPLER_GLIB_DISABLE_SINGLE_INCLUDES = @POPPLER_GLIB_DISABLE_SINGLE_INCLUDES@
+POPPLER_GLIB_LIBS = @POPPLER_GLIB_LIBS@
+POPPLER_MAJOR_VERSION = @POPPLER_MAJOR_VERSION@
+POPPLER_MICRO_VERSION = @POPPLER_MICRO_VERSION@
+POPPLER_MINOR_VERSION = @POPPLER_MINOR_VERSION@
+POPPLER_QT4_CFLAGS = @POPPLER_QT4_CFLAGS@
+POPPLER_QT4_CXXFLAGS = @POPPLER_QT4_CXXFLAGS@
+POPPLER_QT4_LIBS = @POPPLER_QT4_LIBS@
+POPPLER_QT4_TEST_CFLAGS = @POPPLER_QT4_TEST_CFLAGS@
+POPPLER_QT4_TEST_LIBS = @POPPLER_QT4_TEST_LIBS@
+POPPLER_VERSION = @POPPLER_VERSION@
+PTHREAD_CC = @PTHREAD_CC@
+PTHREAD_CFLAGS = @PTHREAD_CFLAGS@
+PTHREAD_LIBS = @PTHREAD_LIBS@
+RANLIB = @RANLIB@
+SED = @SED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+TESTDATADIR = @TESTDATADIR@
+VERSION = @VERSION@
+XMKMF = @XMKMF@
+X_CFLAGS = @X_CFLAGS@
+X_EXTRA_LIBS = @X_EXTRA_LIBS@
+X_LIBS = @X_LIBS@
+X_PRE_LIBS = @X_PRE_LIBS@
+ZLIB_LIBS = @ZLIB_LIBS@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
+ac_ct_AR = @ac_ct_AR@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_CXX = @ac_ct_CXX@
+ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
+acx_pthread_config = @acx_pthread_config@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+auto_import_flags = @auto_import_flags@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+builddir = @builddir@
+create_shared_lib = @create_shared_lib@
+datadir = @datadir@
+datarootdir = @datarootdir@
+docdir = @docdir@
+dvidir = @dvidir@
+exec_prefix = @exec_prefix@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+htmldir = @htmldir@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localedir = @localedir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+srcdir = @srcdir@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+top_build_prefix = @top_build_prefix@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+win32_libs = @win32_libs@
+@BUILD_SPLASH_OUTPUT_TRUE@splash_sources = \
+@BUILD_SPLASH_OUTPUT_TRUE@     SplashOutputDev.cc
+
+@BUILD_SPLASH_OUTPUT_TRUE@splash_headers = \
+@BUILD_SPLASH_OUTPUT_TRUE@     SplashOutputDev.h
+
+@BUILD_SPLASH_OUTPUT_TRUE@splash_includes = \
+@BUILD_SPLASH_OUTPUT_TRUE@     $(SPLASH_CFLAGS)
+
+@BUILD_SPLASH_OUTPUT_TRUE@splash_libs = \
+@BUILD_SPLASH_OUTPUT_TRUE@     $(SPLASH_LIBS)                          \
+@BUILD_SPLASH_OUTPUT_TRUE@     $(top_builddir)/splash/libsplash.la
+
+@BUILD_POPPLER_QT4_TRUE@poppler_arthur = libpoppler-arthur.la
+@BUILD_POPPLER_QT4_TRUE@libpoppler_arthur_la_SOURCES = \
+@BUILD_POPPLER_QT4_TRUE@       ArthurOutputDev.h                       \
+@BUILD_POPPLER_QT4_TRUE@       ArthurOutputDev.cc
+
+@BUILD_POPPLER_QT4_TRUE@arthur_includes = \
+@BUILD_POPPLER_QT4_TRUE@       $(POPPLER_QT4_CFLAGS)
+
+@BUILD_POPPLER_QT4_TRUE@arthur_libs = \
+@BUILD_POPPLER_QT4_TRUE@       $(POPPLER_QT4_LIBS)
+
+@BUILD_CAIRO_OUTPUT_TRUE@poppler_cairo = libpoppler-cairo.la
+@BUILD_CAIRO_OUTPUT_TRUE@cairo_includes = \
+@BUILD_CAIRO_OUTPUT_TRUE@      $(CAIRO_CFLAGS)
+
+@BUILD_CAIRO_OUTPUT_TRUE@cairo_libs = \
+@BUILD_CAIRO_OUTPUT_TRUE@      $(CAIRO_LIBS)
+
+@BUILD_CAIRO_OUTPUT_TRUE@libpoppler_cairo_la_SOURCES = \
+@BUILD_CAIRO_OUTPUT_TRUE@      CairoFontEngine.cc                      \
+@BUILD_CAIRO_OUTPUT_TRUE@      CairoFontEngine.h                       \
+@BUILD_CAIRO_OUTPUT_TRUE@      CairoOutputDev.cc                       \
+@BUILD_CAIRO_OUTPUT_TRUE@      CairoOutputDev.h                        \
+@BUILD_CAIRO_OUTPUT_TRUE@      CairoRescaleBox.cc                      \
+@BUILD_CAIRO_OUTPUT_TRUE@      CairoRescaleBox.h
+
+@BUILD_LIBJPEG_TRUE@libjpeg_sources = \
+@BUILD_LIBJPEG_TRUE@   DCTStream.h                             \
+@BUILD_LIBJPEG_TRUE@   DCTStream.cc
+
+@BUILD_LIBJPEG_TRUE@libjpeg_libs = \
+@BUILD_LIBJPEG_TRUE@   $(LIBJPEG_LIBS)
+
+@BUILD_LIBJPEG_TRUE@libjpeg_includes = \
+@BUILD_LIBJPEG_TRUE@   $(LIBJPEG_CFLAGS)
+
+@BUILD_LIBPNG_TRUE@libpng_libs = \
+@BUILD_LIBPNG_TRUE@    $(LIBPNG_LIBS)
+
+@BUILD_LIBPNG_TRUE@libpng_includes = \
+@BUILD_LIBPNG_TRUE@    $(LIBPNG_CFLAGS)
+
+@BUILD_LIBTIFF_TRUE@libtiff_libs = \
+@BUILD_LIBTIFF_TRUE@   $(LIBTIFF_LIBS)
+
+@BUILD_LIBTIFF_TRUE@libtiff_includes = \
+@BUILD_LIBTIFF_TRUE@   $(LIBTIFF_CFLAGS)
+
+@BUILD_LIBOPENJPEG_FALSE@libjpeg2000_sources = \
+@BUILD_LIBOPENJPEG_FALSE@      JPXStream.h                     \
+@BUILD_LIBOPENJPEG_FALSE@      JPXStream.cc
+
+@BUILD_LIBOPENJPEG_TRUE@libjpeg2000_sources = \
+@BUILD_LIBOPENJPEG_TRUE@       JPEG2000Stream.h                        \
+@BUILD_LIBOPENJPEG_TRUE@       JPEG2000Stream.cc
+
+@BUILD_LIBOPENJPEG_TRUE@libjpeg2000_libs = \
+@BUILD_LIBOPENJPEG_TRUE@       $(LIBOPENJPEG_LIBS)
+
+@BUILD_LIBOPENJPEG_TRUE@libjpeg2000_includes = \
+@BUILD_LIBOPENJPEG_TRUE@       $(LIBOPENJPEG_CFLAGS)
+
+@BUILD_ZLIB_TRUE@zlib_sources = \
+@BUILD_ZLIB_TRUE@      FlateStream.h                           \
+@BUILD_ZLIB_TRUE@      FlateStream.cc
+
+@BUILD_ZLIB_TRUE@zlib_libs = \
+@BUILD_ZLIB_TRUE@      $(ZLIB_LIBS)
+
+@BUILD_LIBCURL_TRUE@libcurl_libs = \
+@BUILD_LIBCURL_TRUE@   $(LIBCURL_LIBS)
+
+@BUILD_LIBCURL_TRUE@libcurl_includes = \
+@BUILD_LIBCURL_TRUE@   $(LIBCURL_CFLAGS)
+
+@BUILD_LIBCURL_TRUE@curl_headers = \
+@BUILD_LIBCURL_TRUE@   CurlCachedFile.h                        \
+@BUILD_LIBCURL_TRUE@   CurlPDFDocBuilder.h
+
+@BUILD_LIBCURL_TRUE@curl_sources = \
+@BUILD_LIBCURL_TRUE@   CurlCachedFile.cc                       \
+@BUILD_LIBCURL_TRUE@   CurlPDFDocBuilder.cc
+
+@USE_CMS_TRUE@cms_includes = $(LCMS_CFLAGS)
+@USE_CMS_TRUE@cms_libs = $(LCMS_LIBS)
+INCLUDES = \
+       -I$(top_srcdir)                         \
+       -I$(top_srcdir)/goo                     \
+       $(cms_includes)                         \
+       $(splash_includes)                      \
+       $(cairo_includes)                       \
+       $(arthur_includes)                      \
+       $(libjpeg_includes)                     \
+       $(libtiff_includes)                     \
+       $(libjpeg2000_includes)                 \
+       $(libpng_includes)                      \
+       $(libcurl_includes)                     \
+       $(FREETYPE_CFLAGS)                      \
+       $(FONTCONFIG_CFLAGS)
+
+lib_LTLIBRARIES = libpoppler.la
+noinst_LTLIBRARIES = $(poppler_cairo)          \
+       $(poppler_arthur)
+
+libpoppler_la_LIBADD = \
+       $(top_builddir)/goo/libgoo.la           \
+       $(top_builddir)/fofi/libfofi.la         \
+       $(cms_libs)                             \
+       $(splash_libs)                          \
+       $(libtiff_libs)                         \
+       $(libjpeg_libs)                         \
+       $(libpng_libs)                          \
+       $(zlib_libs)                            \
+       $(libcurl_libs)                         \
+       $(libjpeg2000_libs)                     \
+       $(FREETYPE_LIBS)                        \
+       $(FONTCONFIG_LIBS)                      \
+       $(PTHREAD_LIBS)                         \
+       $(win32_libs)
+
+libpoppler_la_LDFLAGS = -version-info 25:0:0 @create_shared_lib@ @auto_import_flags@
+@ENABLE_XPDF_HEADERS_TRUE@poppler_includedir = $(includedir)/poppler
+@ENABLE_XPDF_HEADERS_TRUE@poppler_include_HEADERS = \
+@ENABLE_XPDF_HEADERS_TRUE@     $(splash_headers)       \
+@ENABLE_XPDF_HEADERS_TRUE@     $(curl_headers)         \
+@ENABLE_XPDF_HEADERS_TRUE@     Annot.h                 \
+@ENABLE_XPDF_HEADERS_TRUE@     Array.h                 \
+@ENABLE_XPDF_HEADERS_TRUE@     BuiltinFont.h           \
+@ENABLE_XPDF_HEADERS_TRUE@     BuiltinFontTables.h     \
+@ENABLE_XPDF_HEADERS_TRUE@     CachedFile.h            \
+@ENABLE_XPDF_HEADERS_TRUE@     Catalog.h               \
+@ENABLE_XPDF_HEADERS_TRUE@     CharCodeToUnicode.h     \
+@ENABLE_XPDF_HEADERS_TRUE@     CMap.h                  \
+@ENABLE_XPDF_HEADERS_TRUE@     DateInfo.h              \
+@ENABLE_XPDF_HEADERS_TRUE@     Decrypt.h               \
+@ENABLE_XPDF_HEADERS_TRUE@     Dict.h                  \
+@ENABLE_XPDF_HEADERS_TRUE@     Error.h                 \
+@ENABLE_XPDF_HEADERS_TRUE@     FileSpec.h              \
+@ENABLE_XPDF_HEADERS_TRUE@     FontEncodingTables.h    \
+@ENABLE_XPDF_HEADERS_TRUE@     FontInfo.h              \
+@ENABLE_XPDF_HEADERS_TRUE@     Form.h                  \
+@ENABLE_XPDF_HEADERS_TRUE@     Function.h              \
+@ENABLE_XPDF_HEADERS_TRUE@     Gfx.h                   \
+@ENABLE_XPDF_HEADERS_TRUE@     GfxFont.h               \
+@ENABLE_XPDF_HEADERS_TRUE@     GfxState.h              \
+@ENABLE_XPDF_HEADERS_TRUE@     GfxState_helpers.h      \
+@ENABLE_XPDF_HEADERS_TRUE@     GlobalParams.h          \
+@ENABLE_XPDF_HEADERS_TRUE@     Hints.h                 \
+@ENABLE_XPDF_HEADERS_TRUE@     JArithmeticDecoder.h    \
+@ENABLE_XPDF_HEADERS_TRUE@     JBIG2Stream.h           \
+@ENABLE_XPDF_HEADERS_TRUE@     Lexer.h                 \
+@ENABLE_XPDF_HEADERS_TRUE@     Linearization.h         \
+@ENABLE_XPDF_HEADERS_TRUE@     Link.h                  \
+@ENABLE_XPDF_HEADERS_TRUE@     LocalPDFDocBuilder.h    \
+@ENABLE_XPDF_HEADERS_TRUE@     Movie.h                 \
+@ENABLE_XPDF_HEADERS_TRUE@     NameToCharCode.h        \
+@ENABLE_XPDF_HEADERS_TRUE@     Object.h                \
+@ENABLE_XPDF_HEADERS_TRUE@     OptionalContent.h       \
+@ENABLE_XPDF_HEADERS_TRUE@     Outline.h               \
+@ENABLE_XPDF_HEADERS_TRUE@     OutputDev.h             \
+@ENABLE_XPDF_HEADERS_TRUE@     Page.h                  \
+@ENABLE_XPDF_HEADERS_TRUE@     PageTransition.h        \
+@ENABLE_XPDF_HEADERS_TRUE@     Parser.h                \
+@ENABLE_XPDF_HEADERS_TRUE@     PDFDoc.h                \
+@ENABLE_XPDF_HEADERS_TRUE@     PDFDocBuilder.h         \
+@ENABLE_XPDF_HEADERS_TRUE@     PDFDocEncoding.h        \
+@ENABLE_XPDF_HEADERS_TRUE@     PDFDocFactory.h         \
+@ENABLE_XPDF_HEADERS_TRUE@     PopplerCache.h          \
+@ENABLE_XPDF_HEADERS_TRUE@     ProfileData.h           \
+@ENABLE_XPDF_HEADERS_TRUE@     PreScanOutputDev.h      \
+@ENABLE_XPDF_HEADERS_TRUE@     PSTokenizer.h           \
+@ENABLE_XPDF_HEADERS_TRUE@     Rendition.h             \
+@ENABLE_XPDF_HEADERS_TRUE@     StdinCachedFile.h       \
+@ENABLE_XPDF_HEADERS_TRUE@     StdinPDFDocBuilder.h    \
+@ENABLE_XPDF_HEADERS_TRUE@     Stream-CCITT.h          \
+@ENABLE_XPDF_HEADERS_TRUE@     Stream.h                \
+@ENABLE_XPDF_HEADERS_TRUE@     UnicodeMap.h            \
+@ENABLE_XPDF_HEADERS_TRUE@     UnicodeMapTables.h      \
+@ENABLE_XPDF_HEADERS_TRUE@     UnicodeTypeTable.h      \
+@ENABLE_XPDF_HEADERS_TRUE@     UnicodeCClassTables.h   \
+@ENABLE_XPDF_HEADERS_TRUE@     UnicodeCompTables.h     \
+@ENABLE_XPDF_HEADERS_TRUE@     UnicodeDecompTables.h   \
+@ENABLE_XPDF_HEADERS_TRUE@     ViewerPreferences.h     \
+@ENABLE_XPDF_HEADERS_TRUE@     XRef.h                  \
+@ENABLE_XPDF_HEADERS_TRUE@     CharTypes.h             \
+@ENABLE_XPDF_HEADERS_TRUE@     CompactFontTables.h     \
+@ENABLE_XPDF_HEADERS_TRUE@     ErrorCodes.h            \
+@ENABLE_XPDF_HEADERS_TRUE@     NameToUnicodeTable.h    \
+@ENABLE_XPDF_HEADERS_TRUE@     PSOutputDev.h           \
+@ENABLE_XPDF_HEADERS_TRUE@     TextOutputDev.h         \
+@ENABLE_XPDF_HEADERS_TRUE@     SecurityHandler.h       \
+@ENABLE_XPDF_HEADERS_TRUE@     UTF8.h                  \
+@ENABLE_XPDF_HEADERS_TRUE@     XpdfPluginAPI.h         \
+@ENABLE_XPDF_HEADERS_TRUE@     Sound.h
+
+@ENABLE_XPDF_HEADERS_TRUE@nodist_poppler_include_HEADERS = poppler-config.h
+libpoppler_la_SOURCES = \
+       $(splash_sources)       \
+       $(cairo_sources)        \
+       $(arthur_sources)       \
+       $(libjpeg_sources)      \
+       $(zlib_sources)         \
+       $(libjpeg2000_sources)  \
+       $(curl_sources)         \
+       Annot.cc                \
+       Array.cc                \
+       BuiltinFont.cc          \
+       BuiltinFontTables.cc    \
+       CachedFile.cc           \
+       Catalog.cc              \
+       CharCodeToUnicode.cc    \
+       CMap.cc                 \
+       DateInfo.cc             \
+       Decrypt.cc              \
+       Dict.cc                 \
+       Error.cc                \
+       FileSpec.cc             \
+       FontEncodingTables.cc   \
+       Form.cc                 \
+       FontInfo.cc             \
+       Function.cc             \
+       Gfx.cc                  \
+       GfxFont.cc              \
+       GfxState.cc             \
+       GlobalParams.cc         \
+       Hints.cc                \
+       JArithmeticDecoder.cc   \
+       JBIG2Stream.cc          \
+       Lexer.cc                \
+       Linearization.cc        \
+       Link.cc                 \
+       LocalPDFDocBuilder.cc   \
+       Movie.cc                \
+       NameToCharCode.cc       \
+       Object.cc               \
+       OptionalContent.cc      \
+       Outline.cc              \
+       OutputDev.cc            \
+       Page.cc                 \
+       PageTransition.cc       \
+       Parser.cc               \
+       PDFDoc.cc               \
+       PDFDocEncoding.cc       \
+       PDFDocFactory.cc        \
+       PopplerCache.cc         \
+       ProfileData.cc          \
+       PreScanOutputDev.cc \
+       PSTokenizer.cc          \
+       Rendition.cc            \
+       StdinCachedFile.cc      \
+       StdinPDFDocBuilder.cc   \
+       Stream.cc               \
+       strtok_r.cpp            \
+       UnicodeMap.cc           \
+       UnicodeTypeTable.cc     \
+       ViewerPreferences.cc    \
+       XRef.cc                 \
+       PSOutputDev.cc          \
+       TextOutputDev.cc        \
+       PageLabelInfo.h         \
+       PageLabelInfo.cc        \
+       SecurityHandler.cc      \
+       Sound.cc                \
+       XpdfPluginAPI.cc
+
+EXTRA_DIST = gen-unicode-tables.py     \
+             GlobalParamsWin.cc
+
+all: poppler-config.h
+       $(MAKE) $(AM_MAKEFLAGS) all-am
+
+.SUFFIXES:
+.SUFFIXES: .cc .cpp .lo .o .obj
+$(srcdir)/Makefile.in:  $(srcdir)/Makefile.am  $(am__configure_deps)
+       @for dep in $?; do \
+         case '$(am__configure_deps)' in \
+           *$$dep*) \
+             ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
+               && { if test -f $@; then exit 0; else break; fi; }; \
+             exit 1;; \
+         esac; \
+       done; \
+       echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign poppler/Makefile'; \
+       $(am__cd) $(top_srcdir) && \
+         $(AUTOMAKE) --foreign poppler/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+       @case '$?' in \
+         *config.status*) \
+           cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+         *) \
+           echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+           cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+       esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+       cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure:  $(am__configure_deps)
+       cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4):  $(am__aclocal_m4_deps)
+       cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(am__aclocal_m4_deps):
+
+poppler-config.h: stamp-h2
+       @if test ! -f $@; then rm -f stamp-h2; else :; fi
+       @if test ! -f $@; then $(MAKE) $(AM_MAKEFLAGS) stamp-h2; else :; fi
+
+stamp-h2: $(srcdir)/poppler-config.h.in $(top_builddir)/config.status
+       @rm -f stamp-h2
+       cd $(top_builddir) && $(SHELL) ./config.status poppler/poppler-config.h
+$(srcdir)/poppler-config.h.in:  $(am__configure_deps) 
+       ($(am__cd) $(top_srcdir) && $(AUTOHEADER))
+       rm -f stamp-h2
+       touch $@
+
+distclean-hdr:
+       -rm -f poppler-config.h stamp-h2
+install-libLTLIBRARIES: $(lib_LTLIBRARIES)
+       @$(NORMAL_INSTALL)
+       @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \
+       list2=; for p in $$list; do \
+         if test -f $$p; then \
+           list2="$$list2 $$p"; \
+         else :; fi; \
+       done; \
+       test -z "$$list2" || { \
+         echo " $(MKDIR_P) '$(DESTDIR)$(libdir)'"; \
+         $(MKDIR_P) "$(DESTDIR)$(libdir)" || exit 1; \
+         echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(libdir)'"; \
+         $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(libdir)"; \
+       }
+
+uninstall-libLTLIBRARIES:
+       @$(NORMAL_UNINSTALL)
+       @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \
+       for p in $$list; do \
+         $(am__strip_dir) \
+         echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(libdir)/$$f'"; \
+         $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(libdir)/$$f"; \
+       done
+
+clean-libLTLIBRARIES:
+       -test -z "$(lib_LTLIBRARIES)" || rm -f $(lib_LTLIBRARIES)
+       @list='$(lib_LTLIBRARIES)'; for p in $$list; do \
+         dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \
+         test "$$dir" != "$$p" || dir=.; \
+         echo "rm -f \"$${dir}/so_locations\""; \
+         rm -f "$${dir}/so_locations"; \
+       done
+
+clean-noinstLTLIBRARIES:
+       -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES)
+       @list='$(noinst_LTLIBRARIES)'; for p in $$list; do \
+         dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \
+         test "$$dir" != "$$p" || dir=.; \
+         echo "rm -f \"$${dir}/so_locations\""; \
+         rm -f "$${dir}/so_locations"; \
+       done
+libpoppler-arthur.la: $(libpoppler_arthur_la_OBJECTS) $(libpoppler_arthur_la_DEPENDENCIES) $(EXTRA_libpoppler_arthur_la_DEPENDENCIES) 
+       $(AM_V_CXXLD)$(CXXLINK) $(am_libpoppler_arthur_la_rpath) $(libpoppler_arthur_la_OBJECTS) $(libpoppler_arthur_la_LIBADD) $(LIBS)
+libpoppler-cairo.la: $(libpoppler_cairo_la_OBJECTS) $(libpoppler_cairo_la_DEPENDENCIES) $(EXTRA_libpoppler_cairo_la_DEPENDENCIES) 
+       $(AM_V_CXXLD)$(CXXLINK) $(am_libpoppler_cairo_la_rpath) $(libpoppler_cairo_la_OBJECTS) $(libpoppler_cairo_la_LIBADD) $(LIBS)
+libpoppler.la: $(libpoppler_la_OBJECTS) $(libpoppler_la_DEPENDENCIES) $(EXTRA_libpoppler_la_DEPENDENCIES) 
+       $(AM_V_CXXLD)$(libpoppler_la_LINK) -rpath $(libdir) $(libpoppler_la_OBJECTS) $(libpoppler_la_LIBADD) $(LIBS)
+
+mostlyclean-compile:
+       -rm -f *.$(OBJEXT)
+
+distclean-compile:
+       -rm -f *.tab.c
+
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Annot.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Array.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ArthurOutputDev.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/BuiltinFont.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/BuiltinFontTables.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/CMap.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/CachedFile.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/CairoFontEngine.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/CairoOutputDev.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/CairoRescaleBox.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Catalog.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/CharCodeToUnicode.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/CurlCachedFile.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/CurlPDFDocBuilder.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/DCTStream.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/DateInfo.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Decrypt.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Dict.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Error.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FileSpec.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FlateStream.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FontEncodingTables.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FontInfo.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Form.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Function.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Gfx.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/GfxFont.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/GfxState.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/GlobalParams.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Hints.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/JArithmeticDecoder.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/JBIG2Stream.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/JPEG2000Stream.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/JPXStream.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Lexer.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Linearization.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Link.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/LocalPDFDocBuilder.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Movie.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/NameToCharCode.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Object.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/OptionalContent.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Outline.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/OutputDev.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/PDFDoc.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/PDFDocEncoding.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/PDFDocFactory.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/PSOutputDev.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/PSTokenizer.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Page.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/PageLabelInfo.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/PageTransition.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Parser.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/PopplerCache.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/PreScanOutputDev.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ProfileData.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Rendition.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/SecurityHandler.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Sound.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/SplashOutputDev.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/StdinCachedFile.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/StdinPDFDocBuilder.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Stream.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/TextOutputDev.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/UnicodeMap.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/UnicodeTypeTable.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ViewerPreferences.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/XRef.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/XpdfPluginAPI.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/strtok_r.Plo@am__quote@
+
+.cc.o:
+@am__fastdepCXX_TRUE@  $(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
+@am__fastdepCXX_TRUE@  $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ $<
+
+.cc.obj:
+@am__fastdepCXX_TRUE@  $(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'`
+@am__fastdepCXX_TRUE@  $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
+
+.cc.lo:
+@am__fastdepCXX_TRUE@  $(AM_V_CXX)$(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
+@am__fastdepCXX_TRUE@  $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     $(AM_V_CXX)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LTCXXCOMPILE) -c -o $@ $<
+
+.cpp.o:
+@am__fastdepCXX_TRUE@  $(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
+@am__fastdepCXX_TRUE@  $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ $<
+
+.cpp.obj:
+@am__fastdepCXX_TRUE@  $(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'`
+@am__fastdepCXX_TRUE@  $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
+
+.cpp.lo:
+@am__fastdepCXX_TRUE@  $(AM_V_CXX)$(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
+@am__fastdepCXX_TRUE@  $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     $(AM_V_CXX)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LTCXXCOMPILE) -c -o $@ $<
+
+mostlyclean-libtool:
+       -rm -f *.lo
+
+clean-libtool:
+       -rm -rf .libs _libs
+install-nodist_poppler_includeHEADERS: $(nodist_poppler_include_HEADERS)
+       @$(NORMAL_INSTALL)
+       @list='$(nodist_poppler_include_HEADERS)'; test -n "$(poppler_includedir)" || list=; \
+       if test -n "$$list"; then \
+         echo " $(MKDIR_P) '$(DESTDIR)$(poppler_includedir)'"; \
+         $(MKDIR_P) "$(DESTDIR)$(poppler_includedir)" || exit 1; \
+       fi; \
+       for p in $$list; do \
+         if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+         echo "$$d$$p"; \
+       done | $(am__base_list) | \
+       while read files; do \
+         echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(poppler_includedir)'"; \
+         $(INSTALL_HEADER) $$files "$(DESTDIR)$(poppler_includedir)" || exit $$?; \
+       done
+
+uninstall-nodist_poppler_includeHEADERS:
+       @$(NORMAL_UNINSTALL)
+       @list='$(nodist_poppler_include_HEADERS)'; test -n "$(poppler_includedir)" || list=; \
+       files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
+       dir='$(DESTDIR)$(poppler_includedir)'; $(am__uninstall_files_from_dir)
+install-poppler_includeHEADERS: $(poppler_include_HEADERS)
+       @$(NORMAL_INSTALL)
+       @list='$(poppler_include_HEADERS)'; test -n "$(poppler_includedir)" || list=; \
+       if test -n "$$list"; then \
+         echo " $(MKDIR_P) '$(DESTDIR)$(poppler_includedir)'"; \
+         $(MKDIR_P) "$(DESTDIR)$(poppler_includedir)" || exit 1; \
+       fi; \
+       for p in $$list; do \
+         if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+         echo "$$d$$p"; \
+       done | $(am__base_list) | \
+       while read files; do \
+         echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(poppler_includedir)'"; \
+         $(INSTALL_HEADER) $$files "$(DESTDIR)$(poppler_includedir)" || exit $$?; \
+       done
+
+uninstall-poppler_includeHEADERS:
+       @$(NORMAL_UNINSTALL)
+       @list='$(poppler_include_HEADERS)'; test -n "$(poppler_includedir)" || list=; \
+       files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
+       dir='$(DESTDIR)$(poppler_includedir)'; $(am__uninstall_files_from_dir)
+
+ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
+       list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+       unique=`for i in $$list; do \
+           if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+         done | \
+         $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
+             END { if (nonempty) { for (i in files) print i; }; }'`; \
+       mkid -fID $$unique
+tags: TAGS
+
+TAGS:  $(HEADERS) $(SOURCES) poppler-config.h.in $(TAGS_DEPENDENCIES) \
+               $(TAGS_FILES) $(LISP)
+       set x; \
+       here=`pwd`; \
+       list='$(SOURCES) $(HEADERS) poppler-config.h.in $(LISP) $(TAGS_FILES)'; \
+       unique=`for i in $$list; do \
+           if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+         done | \
+         $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
+             END { if (nonempty) { for (i in files) print i; }; }'`; \
+       shift; \
+       if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
+         test -n "$$unique" || unique=$$empty_fix; \
+         if test $$# -gt 0; then \
+           $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+             "$$@" $$unique; \
+         else \
+           $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+             $$unique; \
+         fi; \
+       fi
+ctags: CTAGS
+CTAGS:  $(HEADERS) $(SOURCES) poppler-config.h.in $(TAGS_DEPENDENCIES) \
+               $(TAGS_FILES) $(LISP)
+       list='$(SOURCES) $(HEADERS) poppler-config.h.in $(LISP) $(TAGS_FILES)'; \
+       unique=`for i in $$list; do \
+           if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+         done | \
+         $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
+             END { if (nonempty) { for (i in files) print i; }; }'`; \
+       test -z "$(CTAGS_ARGS)$$unique" \
+         || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+            $$unique
+
+GTAGS:
+       here=`$(am__cd) $(top_builddir) && pwd` \
+         && $(am__cd) $(top_srcdir) \
+         && gtags -i $(GTAGS_ARGS) "$$here"
+
+distclean-tags:
+       -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+
+distdir: $(DISTFILES)
+       @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+       topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+       list='$(DISTFILES)'; \
+         dist_files=`for file in $$list; do echo $$file; done | \
+         sed -e "s|^$$srcdirstrip/||;t" \
+             -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+       case $$dist_files in \
+         */*) $(MKDIR_P) `echo "$$dist_files" | \
+                          sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+                          sort -u` ;; \
+       esac; \
+       for file in $$dist_files; do \
+         if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+         if test -d $$d/$$file; then \
+           dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+           if test -d "$(distdir)/$$file"; then \
+             find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+           fi; \
+           if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+             cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
+             find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+           fi; \
+           cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
+         else \
+           test -f "$(distdir)/$$file" \
+           || cp -p $$d/$$file "$(distdir)/$$file" \
+           || exit 1; \
+         fi; \
+       done
+check-am: all-am
+check: check-am
+all-am: Makefile $(LTLIBRARIES) $(HEADERS) poppler-config.h
+installdirs:
+       for dir in "$(DESTDIR)$(libdir)" "$(DESTDIR)$(poppler_includedir)" "$(DESTDIR)$(poppler_includedir)"; do \
+         test -z "$$dir" || $(MKDIR_P) "$$dir"; \
+       done
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+       @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+       if test -z '$(STRIP)'; then \
+         $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+           install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+             install; \
+       else \
+         $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+           install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+           "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
+       fi
+mostlyclean-generic:
+
+clean-generic:
+
+distclean-generic:
+       -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+       -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
+
+maintainer-clean-generic:
+       @echo "This command is intended for maintainers to use"
+       @echo "it deletes files that may require special tools to rebuild."
+clean: clean-am
+
+clean-am: clean-generic clean-libLTLIBRARIES clean-libtool \
+       clean-noinstLTLIBRARIES mostlyclean-am
+
+distclean: distclean-am
+       -rm -rf ./$(DEPDIR)
+       -rm -f Makefile
+distclean-am: clean-am distclean-compile distclean-generic \
+       distclean-hdr distclean-tags
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+html-am:
+
+info: info-am
+
+info-am:
+
+install-data-am: install-nodist_poppler_includeHEADERS \
+       install-poppler_includeHEADERS
+
+install-dvi: install-dvi-am
+
+install-dvi-am:
+
+install-exec-am: install-libLTLIBRARIES
+
+install-html: install-html-am
+
+install-html-am:
+
+install-info: install-info-am
+
+install-info-am:
+
+install-man:
+
+install-pdf: install-pdf-am
+
+install-pdf-am:
+
+install-ps: install-ps-am
+
+install-ps-am:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+       -rm -rf ./$(DEPDIR)
+       -rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-compile mostlyclean-generic \
+       mostlyclean-libtool
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am: uninstall-libLTLIBRARIES \
+       uninstall-nodist_poppler_includeHEADERS \
+       uninstall-poppler_includeHEADERS
+
+.MAKE: all install-am install-strip
+
+.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \
+       clean-libLTLIBRARIES clean-libtool clean-noinstLTLIBRARIES \
+       ctags distclean distclean-compile distclean-generic \
+       distclean-hdr distclean-libtool distclean-tags distdir dvi \
+       dvi-am html html-am info info-am install install-am \
+       install-data install-data-am install-dvi install-dvi-am \
+       install-exec install-exec-am install-html install-html-am \
+       install-info install-info-am install-libLTLIBRARIES \
+       install-man install-nodist_poppler_includeHEADERS install-pdf \
+       install-pdf-am install-poppler_includeHEADERS install-ps \
+       install-ps-am install-strip installcheck installcheck-am \
+       installdirs maintainer-clean maintainer-clean-generic \
+       mostlyclean mostlyclean-compile mostlyclean-generic \
+       mostlyclean-libtool pdf pdf-am ps ps-am tags uninstall \
+       uninstall-am uninstall-libLTLIBRARIES \
+       uninstall-nodist_poppler_includeHEADERS \
+       uninstall-poppler_includeHEADERS
+
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/poppler/Movie.cc b/poppler/Movie.cc
new file mode 100644 (file)
index 0000000..f68b6ad
--- /dev/null
@@ -0,0 +1,285 @@
+//*********************************************************************************
+//                               Movie.cc
+//---------------------------------------------------------------------------------
+// 
+//---------------------------------------------------------------------------------
+// Hugo Mercier <hmercier31[at]gmail.com> (c) 2008
+// Pino Toscano <pino@kde.org> (c) 2008
+// Carlos Garcia Campos <carlosgc@gnome.org> (c) 2010
+// Albert Astals Cid <aacid@kde.org> (c) 2010
+//
+// This program is free software; you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation; either version 2 of the License, or
+// (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with this program; if not, write to the Free Software
+// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+//*********************************************************************************
+
+#include <math.h>
+#include "Movie.h"
+#include "FileSpec.h"
+
+MovieActivationParameters::MovieActivationParameters() {
+  // default values
+  floatingWindow = gFalse;
+  xPosition = 0.5;
+  yPosition = 0.5;
+  rate = 1.0;
+  volume = 100;
+  showControls = gFalse;
+  synchronousPlay = gFalse;
+  repeatMode = repeatModeOnce;
+  start.units = 0;
+  duration.units = 0;
+  znum = 1;
+  zdenum = 1;
+}
+
+MovieActivationParameters::~MovieActivationParameters() {
+}
+
+void MovieActivationParameters::parseMovieActivation(Object* aDict) {
+  Object obj1;
+
+  if (!aDict->dictLookup("Start", &obj1)->isNull()) {
+    if (obj1.isInt()) {
+      // If it is representable as an integer (subject to the implementation limit for
+      // integers, as described in Appendix C), it should be specified as such.
+
+      start.units = obj1.getInt();
+    } else if (obj1.isString()) {
+      // If it is not representable as an integer, it should be specified as an 8-byte
+      // string representing a 64-bit twos-complement integer, most significant
+      // byte first.
+
+      // UNSUPPORTED
+    } else if (obj1.isArray()) {
+      Array* a = obj1.getArray();
+
+      Object tmp;
+      a->get(0, &tmp);
+      if (tmp.isInt()) {
+        start.units = tmp.getInt();
+      }
+      if (tmp.isString()) {
+        // UNSUPPORTED
+      }
+      tmp.free();
+
+      a->get(1, &tmp);
+      if (tmp.isInt()) {
+        start.units_per_second = tmp.getInt();
+      }
+      tmp.free();
+    }
+  }
+  obj1.free();
+
+  if (!aDict->dictLookup("Duration", &obj1)->isNull()) {
+    if (obj1.isInt()) {
+      duration.units = obj1.getInt();
+    } else if (obj1.isString()) {
+      // UNSUPPORTED
+    } else if (obj1.isArray()) {
+      Array* a = obj1.getArray();
+
+      Object tmp;
+      a->get(0, &tmp);
+      if (tmp.isInt()) {
+        duration.units = tmp.getInt();
+      }
+      if (tmp.isString()) {
+        // UNSUPPORTED
+      }
+      tmp.free();
+
+      a->get(1, &tmp);
+      if (tmp.isInt()) {
+        duration.units_per_second = tmp.getInt();
+      }
+      tmp.free();
+    }
+  }
+  obj1.free();
+
+  if (aDict->dictLookup("Rate", &obj1)->isNum()) {
+    rate = obj1.getNum();
+  }
+  obj1.free();
+
+  if (aDict->dictLookup("Volume", &obj1)->isNum()) {
+    // convert volume to [0 100]
+    volume = int((obj1.getNum() + 1.0) * 50);
+  }
+  obj1.free();
+
+  if (aDict->dictLookup("ShowControls", &obj1)->isBool()) {
+    showControls = obj1.getBool();
+  }
+  obj1.free();
+
+  if (aDict->dictLookup("Synchronous", &obj1)->isBool()) {
+    synchronousPlay = obj1.getBool();
+  }
+  obj1.free();
+
+  if (aDict->dictLookup("Mode", &obj1)->isName()) {
+    char* name = obj1.getName();
+    if (!strcmp(name, "Once")) {
+      repeatMode = repeatModeOnce;
+    } else if (!strcmp(name, "Open")) {
+      repeatMode = repeatModeOpen;
+    } else if (!strcmp(name, "Repeat")) {
+      repeatMode = repeatModeRepeat;
+    } else if (!strcmp(name,"Palindrome")) {
+      repeatMode = repeatModePalindrome;
+    }
+  }
+  obj1.free();
+
+  if (aDict->dictLookup("FWScale", &obj1)->isArray()) {
+    // the presence of that entry implies that the movie is to be played
+    // in a floating window
+    floatingWindow = gTrue;
+
+    Array* scale = obj1.getArray();
+    if (scale->getLength() >= 2) {
+      Object tmp;
+      if (scale->get(0, &tmp)->isInt()) {
+        znum = tmp.getInt();
+      }
+      tmp.free();
+      if (scale->get(1, &tmp)->isInt()) {
+        zdenum = tmp.getInt();
+      }
+      tmp.free();
+    }
+  }
+  obj1.free();
+
+  if (aDict->dictLookup("FWPosition", &obj1)->isArray()) {
+    Array* pos = obj1.getArray();
+    if (pos->getLength() >= 2) {
+      Object tmp;
+      if (pos->get(0, &tmp)->isNum()) {
+        xPosition = tmp.getNum();
+      }
+      tmp.free();
+      if (pos->get(1, &tmp)->isNum()) {
+        yPosition = tmp.getNum();
+      }
+      tmp.free();
+    }
+  }
+  obj1.free();
+}
+
+void Movie::parseMovie (Object *movieDict) {
+  fileName = NULL;
+  rotationAngle = 0;
+  width = -1;
+  height = -1;
+  showPoster = gFalse;
+
+  Object obj1, obj2;
+  if (getFileSpecNameForPlatform(movieDict->dictLookup("F", &obj1), &obj2)) {
+    fileName = obj2.getString()->copy();
+    obj2.free();
+  } else {
+    error (errSyntaxError, -1, "Invalid Movie");
+    ok = gFalse;
+    obj1.free();
+    return;
+  }
+  obj1.free();
+
+  if (movieDict->dictLookup("Aspect", &obj1)->isArray()) {
+    Array* aspect = obj1.getArray();
+    if (aspect->getLength() >= 2) {
+      Object tmp;
+      if( aspect->get(0, &tmp)->isNum() ) {
+        width = (int)floor( aspect->get(0, &tmp)->getNum() + 0.5 );
+      }
+      tmp.free();
+      if( aspect->get(1, &tmp)->isNum() ) {
+        height = (int)floor( aspect->get(1, &tmp)->getNum() + 0.5 );
+      }
+      tmp.free();
+    }
+  }
+  obj1.free();
+
+  if (movieDict->dictLookup("Rotate", &obj1)->isInt()) {
+    // round up to 90°
+    rotationAngle = (((obj1.getInt() + 360) % 360) % 90) * 90;
+  }
+  obj1.free();
+
+  //
+  // movie poster
+  //
+  if (!movieDict->dictLookupNF("Poster", &poster)->isNull()) {
+    if (poster.isRef() || poster.isStream()) {
+      showPoster = gTrue;
+    } else if (poster.isBool()) {
+      showPoster = poster.getBool();
+      poster.free();
+    } else {
+      poster.free();
+    }
+  }
+}
+
+Movie::~Movie() {
+  if (fileName)
+    delete fileName;
+  poster.free();
+}
+
+Movie::Movie(Object *movieDict) {
+  ok = gTrue;
+
+  if (movieDict->isDict())
+    parseMovie(movieDict);
+  else
+    ok = gFalse;
+}
+
+Movie::Movie(Object *movieDict, Object *aDict) {
+  ok = gTrue;
+
+  if (movieDict->isDict()) {
+    parseMovie(movieDict);
+    if (aDict->isDict())
+      MA.parseMovieActivation(aDict);
+  } else {
+    ok = gFalse;
+  }
+}
+
+void Movie::getFloatingWindowSize(int *widthA, int *heightA)
+{
+  *widthA = int(width * double(MA.znum) / MA.zdenum);
+  *heightA = int(height * double(MA.znum) / MA.zdenum);
+}
+
+Movie* Movie::copy() {
+
+  // call default copy constructor
+  Movie* new_movie = new Movie(*this);
+
+  if (fileName)
+    new_movie->fileName = fileName->copy();
+
+  poster.copy(&new_movie->poster);
+
+  return new_movie;
+}
diff --git a/poppler/Movie.h b/poppler/Movie.h
new file mode 100644 (file)
index 0000000..1a16265
--- /dev/null
@@ -0,0 +1,110 @@
+//*********************************************************************************
+//                               Movie.h
+//---------------------------------------------------------------------------------
+// 
+//---------------------------------------------------------------------------------
+// Hugo Mercier <hmercier31[at]gmail.com> (c) 2008
+// Carlos Garcia Campos <carlosgc@gnome.org> (c) 2010
+//
+// This program is free software; you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation; either version 2 of the License, or
+// (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with this program; if not, write to the Free Software
+// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+//*********************************************************************************
+
+#ifndef _MOVIE_H_
+#define _MOVIE_H_
+
+#include "Object.h"
+
+struct MovieActivationParameters {
+
+  MovieActivationParameters();
+  ~MovieActivationParameters();
+
+  // parse from a "Movie Activation" dictionary
+  void parseMovieActivation(Object* actObj);
+
+  enum MovieRepeatMode {
+    repeatModeOnce,
+    repeatModeOpen,
+    repeatModeRepeat,
+    repeatModePalindrome
+  };
+
+  struct MovieTime {
+    MovieTime() { units_per_second = 0; }
+    Gulong units;
+    int units_per_second; // 0 : defined by movie
+  };
+
+  MovieTime start;                         // 0
+  MovieTime duration;                      // 0
+
+  double rate;                             // 1.0
+
+  int volume;                              // 100
+
+  GBool showControls;                      // false
+
+  GBool synchronousPlay;                   // false
+  MovieRepeatMode repeatMode;              // repeatModeOnce
+
+  // floating window position
+  GBool floatingWindow;
+  double xPosition;                        // 0.5
+  double yPosition;                        // 0.5
+  int znum;                                // 1
+  int zdenum;                              // 1
+};
+
+class Movie {
+ public:
+  Movie(Object *objMovie, Object *objAct);
+  Movie(Object *objMovie);
+  ~Movie();
+
+  GBool isOk() { return ok; }
+  MovieActivationParameters* getActivationParameters() { return &MA; }
+
+  GooString* getFileName() { return fileName; }
+
+  Gushort getRotationAngle() { return rotationAngle; }
+  void getAspect (int *widthA, int *heightA) { *widthA = width; *heightA = height; }
+
+  Object *getPoster(Object *obj) { return poster.copy(obj); }
+  GBool getShowPoster() { return showPoster; }
+
+  GBool getUseFloatingWindow() { return MA.floatingWindow; }
+  void  getFloatingWindowSize(int *width, int *height);
+
+  Movie* copy();
+
+ private:
+  void parseMovie (Object *movieDict);
+
+  GBool ok;
+
+  Gushort rotationAngle;                   // 0
+  int width;                               // Aspect
+  int height;                              // Aspect
+
+  Object poster;
+  GBool showPoster;
+
+  GooString* fileName;
+
+  MovieActivationParameters MA;
+};
+
+#endif
+
diff --git a/poppler/NameToCharCode.cc b/poppler/NameToCharCode.cc
new file mode 100644 (file)
index 0000000..5448dc4
--- /dev/null
@@ -0,0 +1,116 @@
+//========================================================================
+//
+// NameToCharCode.cc
+//
+// Copyright 2001-2003 Glyph & Cog, LLC
+//
+//========================================================================
+
+#include <config.h>
+
+#ifdef USE_GCC_PRAGMAS
+#pragma implementation
+#endif
+
+#include <string.h>
+#include "goo/gmem.h"
+#include "NameToCharCode.h"
+
+//------------------------------------------------------------------------
+
+struct NameToCharCodeEntry {
+  char *name;
+  CharCode c;
+};
+
+//------------------------------------------------------------------------
+
+NameToCharCode::NameToCharCode() {
+  int i;
+
+  size = 31;
+  len = 0;
+  tab = (NameToCharCodeEntry *)gmallocn(size, sizeof(NameToCharCodeEntry));
+  for (i = 0; i < size; ++i) {
+    tab[i].name = NULL;
+  }
+}
+
+NameToCharCode::~NameToCharCode() {
+  int i;
+
+  for (i = 0; i < size; ++i) {
+    if (tab[i].name) {
+      gfree(tab[i].name);
+    }
+  }
+  gfree(tab);
+}
+
+void NameToCharCode::add(const char *name, CharCode c) {
+  NameToCharCodeEntry *oldTab;
+  int h, i, oldSize;
+
+  // expand the table if necessary
+  if (len >= size / 2) {
+    oldSize = size;
+    oldTab = tab;
+    size = 2*size + 1;
+    tab = (NameToCharCodeEntry *)gmallocn(size, sizeof(NameToCharCodeEntry));
+    for (h = 0; h < size; ++h) {
+      tab[h].name = NULL;
+    }
+    for (i = 0; i < oldSize; ++i) {
+      if (oldTab[i].name) {
+       h = hash(oldTab[i].name);
+       while (tab[h].name) {
+         if (++h == size) {
+           h = 0;
+         }
+       }
+       tab[h] = oldTab[i];
+      }
+    }
+    gfree(oldTab);
+  }
+
+  // add the new name
+  h = hash(name);
+  while (tab[h].name && strcmp(tab[h].name, name)) {
+    if (++h == size) {
+      h = 0;
+    }
+  }
+  if (!tab[h].name) {
+    tab[h].name = copyString(name);
+  }
+  tab[h].c = c;
+
+  ++len;
+}
+
+CharCode NameToCharCode::lookup(const char *name) {
+  int h;
+
+  h = hash(name);
+  while (tab[h].name) {
+    if (!strcmp(tab[h].name, name)) {
+      return tab[h].c;
+    }
+    if (++h == size) {
+      h = 0;
+    }
+  }
+  return 0;
+}
+
+int NameToCharCode::hash(const char *name) {
+  const char *p;
+  unsigned int h;
+
+  h = 0;
+  for (p = name; *p; ++p) {
+    h = 17 * h + (int)(*p & 0xff);
+  }
+  return (int)(h % size);
+}
diff --git a/poppler/NameToCharCode.h b/poppler/NameToCharCode.h
new file mode 100644 (file)
index 0000000..5b1092b
--- /dev/null
@@ -0,0 +1,40 @@
+//========================================================================
+//
+// NameToCharCode.h
+//
+// Copyright 2001-2003 Glyph & Cog, LLC
+//
+//========================================================================
+
+#ifndef NAMETOCHARCODE_H
+#define NAMETOCHARCODE_H
+
+#ifdef USE_GCC_PRAGMAS
+#pragma interface
+#endif
+
+#include "CharTypes.h"
+
+struct NameToCharCodeEntry;
+
+//------------------------------------------------------------------------
+
+class NameToCharCode {
+public:
+
+  NameToCharCode();
+  ~NameToCharCode();
+
+  void add(const char *name, CharCode c);
+  CharCode lookup(const char *name);
+
+private:
+
+  int hash(const char *name);
+
+  NameToCharCodeEntry *tab;
+  int size;
+  int len;
+};
+
+#endif
diff --git a/poppler/NameToUnicodeTable.h b/poppler/NameToUnicodeTable.h
new file mode 100644 (file)
index 0000000..74645ab
--- /dev/null
@@ -0,0 +1,4475 @@
+//========================================================================
+//
+// NameToUnicodeTable.h
+//
+// Copyright 2001-2003 Glyph & Cog, LLC
+//
+//========================================================================
+
+//========================================================================
+//
+// Modified under the Poppler project - http://poppler.freedesktop.org
+//
+// All changes made under the Poppler project to this file are licensed
+// under GPL version 2 or later
+//
+// Copyright (C) 2011, 2012 Albert Astals Cid <aacid@kde.org>
+//
+// To see a description of the changes please see the Changelog file that
+// came with your tarball or type make ChangeLog if you are building from git
+//
+//========================================================================
+
+#include "CharTypes.h"
+
+#include <stddef.h>
+
+static struct {
+  Unicode u;
+  const char *name;
+} nameToUnicodeTab[] = {
+  {0x0021, "!"},
+  {0x0023, "#"},
+  {0x0024, "$"},
+  {0x0025, "%"},
+  {0x0026, "&"},
+  {0x0027, "'"},
+  {0x0028, "("},
+  {0x0029, ")"},
+  {0x002a, "*"},
+  {0x002b, "+"},
+  {0x002c, ","},
+  {0x002d, "-"},
+  {0x002e, "."},
+  {0x002f, "/"},
+  {0x0030, "0"},
+  {0x0031, "1"},
+  {0x0032, "2"},
+  {0x0033, "3"},
+  {0x0034, "4"},
+  {0x0035, "5"},
+  {0x0036, "6"},
+  {0x0037, "7"},
+  {0x0038, "8"},
+  {0x0039, "9"},
+  {0x003a, ":"},
+  {0x003b, ";"},
+  {0x003c, "<"},
+  {0x003d, "="},
+  {0x003e, ">"},
+  {0x003f, "?"},
+  {0x0040, "@"},
+  {0x0041, "A"},
+  {0x00c6, "AE"},
+  {0x01fc, "AEacute"},
+  {0x01e2, "AEmacron"},
+  {0xf7e6, "AEsmall"},
+  {0x00c1, "Aacute"},
+  {0xf7e1, "Aacutesmall"},
+  {0x0102, "Abreve"},
+  {0x1eae, "Abreveacute"},
+  {0x04d0, "Abrevecyrillic"},
+  {0x1eb6, "Abrevedotbelow"},
+  {0x1eb0, "Abrevegrave"},
+  {0x1eb2, "Abrevehookabove"},
+  {0x1eb4, "Abrevetilde"},
+  {0x01cd, "Acaron"},
+  {0x24b6, "Acircle"},
+  {0x00c2, "Acircumflex"},
+  {0x1ea4, "Acircumflexacute"},
+  {0x1eac, "Acircumflexdotbelow"},
+  {0x1ea6, "Acircumflexgrave"},
+  {0x1ea8, "Acircumflexhookabove"},
+  {0xf7e2, "Acircumflexsmall"},
+  {0x1eaa, "Acircumflextilde"},
+  {0xf6c9, "Acute"},
+  {0xf7b4, "Acutesmall"},
+  {0x0410, "Acyrillic"},
+  {0x0200, "Adblgrave"},
+  {0x00c4, "Adieresis"},
+  {0x04d2, "Adieresiscyrillic"},
+  {0x01de, "Adieresismacron"},
+  {0xf7e4, "Adieresissmall"},
+  {0x1ea0, "Adotbelow"},
+  {0x01e0, "Adotmacron"},
+  {0x00c0, "Agrave"},
+  {0xf7e0, "Agravesmall"},
+  {0x1ea2, "Ahookabove"},
+  {0x04d4, "Aiecyrillic"},
+  {0x0202, "Ainvertedbreve"},
+  {0x0391, "Alpha"},
+  {0x0386, "Alphatonos"},
+  {0x0100, "Amacron"},
+  {0xff21, "Amonospace"},
+  {0x0104, "Aogonek"},
+  {0x00c5, "Aring"},
+  {0x01fa, "Aringacute"},
+  {0x1e00, "Aringbelow"},
+  {0xf7e5, "Aringsmall"},
+  {0xf761, "Asmall"},
+  {0x00c3, "Atilde"},
+  {0xf7e3, "Atildesmall"},
+  {0x0531, "Aybarmenian"},
+  {0x0042, "B"},
+  {0x24b7, "Bcircle"},
+  {0x1e02, "Bdotaccent"},
+  {0x1e04, "Bdotbelow"},
+  {0x0411, "Becyrillic"},
+  {0x0532, "Benarmenian"},
+  {0x0392, "Beta"},
+  {0x0181, "Bhook"},
+  {0x1e06, "Blinebelow"},
+  {0xff22, "Bmonospace"},
+  {0xf6f4, "Brevesmall"},
+  {0xf762, "Bsmall"},
+  {0x0182, "Btopbar"},
+  {0x0043, "C"},
+  {0x053e, "Caarmenian"},
+  {0x0106, "Cacute"},
+  {0xf6ca, "Caron"},
+  {0xf6f5, "Caronsmall"},
+  {0x010c, "Ccaron"},
+  {0x00c7, "Ccedilla"},
+  {0x1e08, "Ccedillaacute"},
+  {0xf7e7, "Ccedillasmall"},
+  {0x24b8, "Ccircle"},
+  {0x0108, "Ccircumflex"},
+  {0x010a, "Cdot"},
+  {0x010a, "Cdotaccent"},
+  {0xf7b8, "Cedillasmall"},
+  {0x0549, "Chaarmenian"},
+  {0x04bc, "Cheabkhasiancyrillic"},
+  {0x0427, "Checyrillic"},
+  {0x04be, "Chedescenderabkhasiancyrillic"},
+  {0x04b6, "Chedescendercyrillic"},
+  {0x04f4, "Chedieresiscyrillic"},
+  {0x0543, "Cheharmenian"},
+  {0x04cb, "Chekhakassiancyrillic"},
+  {0x04b8, "Cheverticalstrokecyrillic"},
+  {0x03a7, "Chi"},
+  {0x0187, "Chook"},
+  {0xf6f6, "Circumflexsmall"},
+  {0xff23, "Cmonospace"},
+  {0x0551, "Coarmenian"},
+  {0xf763, "Csmall"},
+  {0x0044, "D"},
+  {0x01f1, "DZ"},
+  {0x01c4, "DZcaron"},
+  {0x0534, "Daarmenian"},
+  {0x0189, "Dafrican"},
+  {0x010e, "Dcaron"},
+  {0x1e10, "Dcedilla"},
+  {0x24b9, "Dcircle"},
+  {0x1e12, "Dcircumflexbelow"},
+  {0x0110, "Dcroat"},
+  {0x1e0a, "Ddotaccent"},
+  {0x1e0c, "Ddotbelow"},
+  {0x0414, "Decyrillic"},
+  {0x03ee, "Deicoptic"},
+  {0x2206, "Delta"},
+  {0x0394, "Deltagreek"},
+  {0x018a, "Dhook"},
+  {0xf6cb, "Dieresis"},
+  {0xf6cc, "DieresisAcute"},
+  {0xf6cd, "DieresisGrave"},
+  {0xf7a8, "Dieresissmall"},
+  {0x03dc, "Digammagreek"},
+  {0x0402, "Djecyrillic"},
+  {0x1e0e, "Dlinebelow"},
+  {0xff24, "Dmonospace"},
+  {0xf6f7, "Dotaccentsmall"},
+  {0x0110, "Dslash"},
+  {0xf764, "Dsmall"},
+  {0x018b, "Dtopbar"},
+  {0x01f2, "Dz"},
+  {0x01c5, "Dzcaron"},
+  {0x04e0, "Dzeabkhasiancyrillic"},
+  {0x0405, "Dzecyrillic"},
+  {0x040f, "Dzhecyrillic"},
+  {0x0045, "E"},
+  {0x00c9, "Eacute"},
+  {0xf7e9, "Eacutesmall"},
+  {0x0114, "Ebreve"},
+  {0x011a, "Ecaron"},
+  {0x1e1c, "Ecedillabreve"},
+  {0x0535, "Echarmenian"},
+  {0x24ba, "Ecircle"},
+  {0x00ca, "Ecircumflex"},
+  {0x1ebe, "Ecircumflexacute"},
+  {0x1e18, "Ecircumflexbelow"},
+  {0x1ec6, "Ecircumflexdotbelow"},
+  {0x1ec0, "Ecircumflexgrave"},
+  {0x1ec2, "Ecircumflexhookabove"},
+  {0xf7ea, "Ecircumflexsmall"},
+  {0x1ec4, "Ecircumflextilde"},
+  {0x0404, "Ecyrillic"},
+  {0x0204, "Edblgrave"},
+  {0x00cb, "Edieresis"},
+  {0xf7eb, "Edieresissmall"},
+  {0x0116, "Edot"},
+  {0x0116, "Edotaccent"},
+  {0x1eb8, "Edotbelow"},
+  {0x0424, "Efcyrillic"},
+  {0x00c8, "Egrave"},
+  {0xf7e8, "Egravesmall"},
+  {0x0537, "Eharmenian"},
+  {0x1eba, "Ehookabove"},
+  {0x2167, "Eightroman"},
+  {0x0206, "Einvertedbreve"},
+  {0x0464, "Eiotifiedcyrillic"},
+  {0x041b, "Elcyrillic"},
+  {0x216a, "Elevenroman"},
+  {0x0112, "Emacron"},
+  {0x1e16, "Emacronacute"},
+  {0x1e14, "Emacrongrave"},
+  {0x041c, "Emcyrillic"},
+  {0xff25, "Emonospace"},
+  {0x041d, "Encyrillic"},
+  {0x04a2, "Endescendercyrillic"},
+  {0x014a, "Eng"},
+  {0x04a4, "Enghecyrillic"},
+  {0x04c7, "Enhookcyrillic"},
+  {0x0118, "Eogonek"},
+  {0x0190, "Eopen"},
+  {0x0395, "Epsilon"},
+  {0x0388, "Epsilontonos"},
+  {0x0420, "Ercyrillic"},
+  {0x018e, "Ereversed"},
+  {0x042d, "Ereversedcyrillic"},
+  {0x0421, "Escyrillic"},
+  {0x04aa, "Esdescendercyrillic"},
+  {0x01a9, "Esh"},
+  {0xf765, "Esmall"},
+  {0x0397, "Eta"},
+  {0x0538, "Etarmenian"},
+  {0x0389, "Etatonos"},
+  {0x00d0, "Eth"},
+  {0xf7f0, "Ethsmall"},
+  {0x1ebc, "Etilde"},
+  {0x1e1a, "Etildebelow"},
+  {0x20ac, "Euro"},
+  {0x01b7, "Ezh"},
+  {0x01ee, "Ezhcaron"},
+  {0x01b8, "Ezhreversed"},
+  {0x0046, "F"},
+  {0x24bb, "Fcircle"},
+  {0x1e1e, "Fdotaccent"},
+  {0x0556, "Feharmenian"},
+  {0x03e4, "Feicoptic"},
+  {0x0191, "Fhook"},
+  {0x0472, "Fitacyrillic"},
+  {0x2164, "Fiveroman"},
+  {0xff26, "Fmonospace"},
+  {0x2163, "Fourroman"},
+  {0xf766, "Fsmall"},
+  {0x0047, "G"},
+  {0x3387, "GBsquare"},
+  {0x01f4, "Gacute"},
+  {0x0393, "Gamma"},
+  {0x0194, "Gammaafrican"},
+  {0x03ea, "Gangiacoptic"},
+  {0x011e, "Gbreve"},
+  {0x01e6, "Gcaron"},
+  {0x0122, "Gcedilla"},
+  {0x24bc, "Gcircle"},
+  {0x011c, "Gcircumflex"},
+  {0x0122, "Gcommaaccent"},
+  {0x0120, "Gdot"},
+  {0x0120, "Gdotaccent"},
+  {0x0413, "Gecyrillic"},
+  {0x0542, "Ghadarmenian"},
+  {0x0494, "Ghemiddlehookcyrillic"},
+  {0x0492, "Ghestrokecyrillic"},
+  {0x0490, "Gheupturncyrillic"},
+  {0x0193, "Ghook"},
+  {0x0533, "Gimarmenian"},
+  {0x0403, "Gjecyrillic"},
+  {0x1e20, "Gmacron"},
+  {0xff27, "Gmonospace"},
+  {0xf6ce, "Grave"},
+  {0xf760, "Gravesmall"},
+  {0xf767, "Gsmall"},
+  {0x029b, "Gsmallhook"},
+  {0x01e4, "Gstroke"},
+  {0x0048, "H"},
+  {0x25cf, "H18533"},
+  {0x25aa, "H18543"},
+  {0x25ab, "H18551"},
+  {0x25a1, "H22073"},
+  {0x33cb, "HPsquare"},
+  {0x04a8, "Haabkhasiancyrillic"},
+  {0x04b2, "Hadescendercyrillic"},
+  {0x042a, "Hardsigncyrillic"},
+  {0x0126, "Hbar"},
+  {0x1e2a, "Hbrevebelow"},
+  {0x1e28, "Hcedilla"},
+  {0x24bd, "Hcircle"},
+  {0x0124, "Hcircumflex"},
+  {0x1e26, "Hdieresis"},
+  {0x1e22, "Hdotaccent"},
+  {0x1e24, "Hdotbelow"},
+  {0xff28, "Hmonospace"},
+  {0x0540, "Hoarmenian"},
+  {0x03e8, "Horicoptic"},
+  {0xf768, "Hsmall"},
+  {0xf6cf, "Hungarumlaut"},
+  {0xf6f8, "Hungarumlautsmall"},
+  {0x3390, "Hzsquare"},
+  {0x0049, "I"},
+  {0x042f, "IAcyrillic"},
+  {0x0132, "IJ"},
+  {0x042e, "IUcyrillic"},
+  {0x00cd, "Iacute"},
+  {0xf7ed, "Iacutesmall"},
+  {0x012c, "Ibreve"},
+  {0x01cf, "Icaron"},
+  {0x24be, "Icircle"},
+  {0x00ce, "Icircumflex"},
+  {0xf7ee, "Icircumflexsmall"},
+  {0x0406, "Icyrillic"},
+  {0x0208, "Idblgrave"},
+  {0x00cf, "Idieresis"},
+  {0x1e2e, "Idieresisacute"},
+  {0x04e4, "Idieresiscyrillic"},
+  {0xf7ef, "Idieresissmall"},
+  {0x0130, "Idot"},
+  {0x0130, "Idotaccent"},
+  {0x1eca, "Idotbelow"},
+  {0x04d6, "Iebrevecyrillic"},
+  {0x0415, "Iecyrillic"},
+  {0x2111, "Ifraktur"},
+  {0x00cc, "Igrave"},
+  {0xf7ec, "Igravesmall"},
+  {0x1ec8, "Ihookabove"},
+  {0x0418, "Iicyrillic"},
+  {0x020a, "Iinvertedbreve"},
+  {0x0419, "Iishortcyrillic"},
+  {0x012a, "Imacron"},
+  {0x04e2, "Imacroncyrillic"},
+  {0xff29, "Imonospace"},
+  {0x053b, "Iniarmenian"},
+  {0x0401, "Iocyrillic"},
+  {0x012e, "Iogonek"},
+  {0x0399, "Iota"},
+  {0x0196, "Iotaafrican"},
+  {0x03aa, "Iotadieresis"},
+  {0x038a, "Iotatonos"},
+  {0xf769, "Ismall"},
+  {0x0197, "Istroke"},
+  {0x0128, "Itilde"},
+  {0x1e2c, "Itildebelow"},
+  {0x0474, "Izhitsacyrillic"},
+  {0x0476, "Izhitsadblgravecyrillic"},
+  {0x004a, "J"},
+  {0x0541, "Jaarmenian"},
+  {0x24bf, "Jcircle"},
+  {0x0134, "Jcircumflex"},
+  {0x0408, "Jecyrillic"},
+  {0x054b, "Jheharmenian"},
+  {0xff2a, "Jmonospace"},
+  {0xf76a, "Jsmall"},
+  {0x004b, "K"},
+  {0x3385, "KBsquare"},
+  {0x33cd, "KKsquare"},
+  {0x04a0, "Kabashkircyrillic"},
+  {0x1e30, "Kacute"},
+  {0x041a, "Kacyrillic"},
+  {0x049a, "Kadescendercyrillic"},
+  {0x04c3, "Kahookcyrillic"},
+  {0x039a, "Kappa"},
+  {0x049e, "Kastrokecyrillic"},
+  {0x049c, "Kaverticalstrokecyrillic"},
+  {0x01e8, "Kcaron"},
+  {0x0136, "Kcedilla"},
+  {0x24c0, "Kcircle"},
+  {0x0136, "Kcommaaccent"},
+  {0x1e32, "Kdotbelow"},
+  {0x0554, "Keharmenian"},
+  {0x053f, "Kenarmenian"},
+  {0x0425, "Khacyrillic"},
+  {0x03e6, "Kheicoptic"},
+  {0x0198, "Khook"},
+  {0x040c, "Kjecyrillic"},
+  {0x1e34, "Klinebelow"},
+  {0xff2b, "Kmonospace"},
+  {0x0480, "Koppacyrillic"},
+  {0x03de, "Koppagreek"},
+  {0x046e, "Ksicyrillic"},
+  {0xf76b, "Ksmall"},
+  {0x004c, "L"},
+  {0x01c7, "LJ"},
+  {0xf6bf, "LL"},
+  {0x0139, "Lacute"},
+  {0x039b, "Lambda"},
+  {0x013d, "Lcaron"},
+  {0x013b, "Lcedilla"},
+  {0x24c1, "Lcircle"},
+  {0x1e3c, "Lcircumflexbelow"},
+  {0x013b, "Lcommaaccent"},
+  {0x013f, "Ldot"},
+  {0x013f, "Ldotaccent"},
+  {0x1e36, "Ldotbelow"},
+  {0x1e38, "Ldotbelowmacron"},
+  {0x053c, "Liwnarmenian"},
+  {0x01c8, "Lj"},
+  {0x0409, "Ljecyrillic"},
+  {0x1e3a, "Llinebelow"},
+  {0xff2c, "Lmonospace"},
+  {0x0141, "Lslash"},
+  {0xf6f9, "Lslashsmall"},
+  {0xf76c, "Lsmall"},
+  {0x004d, "M"},
+  {0x3386, "MBsquare"},
+  {0xf6d0, "Macron"},
+  {0xf7af, "Macronsmall"},
+  {0x1e3e, "Macute"},
+  {0x24c2, "Mcircle"},
+  {0x1e40, "Mdotaccent"},
+  {0x1e42, "Mdotbelow"},
+  {0x0544, "Menarmenian"},
+  {0xff2d, "Mmonospace"},
+  {0xf76d, "Msmall"},
+  {0x019c, "Mturned"},
+  {0x039c, "Mu"},
+  {0x004e, "N"},
+  {0x01ca, "NJ"},
+  {0x0143, "Nacute"},
+  {0x0147, "Ncaron"},
+  {0x0145, "Ncedilla"},
+  {0x24c3, "Ncircle"},
+  {0x1e4a, "Ncircumflexbelow"},
+  {0x0145, "Ncommaaccent"},
+  {0x1e44, "Ndotaccent"},
+  {0x1e46, "Ndotbelow"},
+  {0x019d, "Nhookleft"},
+  {0x2168, "Nineroman"},
+  {0x01cb, "Nj"},
+  {0x040a, "Njecyrillic"},
+  {0x1e48, "Nlinebelow"},
+  {0xff2e, "Nmonospace"},
+  {0x0546, "Nowarmenian"},
+  {0xf76e, "Nsmall"},
+  {0x00d1, "Ntilde"},
+  {0xf7f1, "Ntildesmall"},
+  {0x039d, "Nu"},
+  {0x004f, "O"},
+  {0x0152, "OE"},
+  {0xf6fa, "OEsmall"},
+  {0x00d3, "Oacute"},
+  {0xf7f3, "Oacutesmall"},
+  {0x04e8, "Obarredcyrillic"},
+  {0x04ea, "Obarreddieresiscyrillic"},
+  {0x014e, "Obreve"},
+  {0x01d1, "Ocaron"},
+  {0x019f, "Ocenteredtilde"},
+  {0x24c4, "Ocircle"},
+  {0x00d4, "Ocircumflex"},
+  {0x1ed0, "Ocircumflexacute"},
+  {0x1ed8, "Ocircumflexdotbelow"},
+  {0x1ed2, "Ocircumflexgrave"},
+  {0x1ed4, "Ocircumflexhookabove"},
+  {0xf7f4, "Ocircumflexsmall"},
+  {0x1ed6, "Ocircumflextilde"},
+  {0x041e, "Ocyrillic"},
+  {0x0150, "Odblacute"},
+  {0x020c, "Odblgrave"},
+  {0x00d6, "Odieresis"},
+  {0x04e6, "Odieresiscyrillic"},
+  {0xf7f6, "Odieresissmall"},
+  {0x1ecc, "Odotbelow"},
+  {0xf6fb, "Ogoneksmall"},
+  {0x00d2, "Ograve"},
+  {0xf7f2, "Ogravesmall"},
+  {0x0555, "Oharmenian"},
+  {0x2126, "Ohm"},
+  {0x1ece, "Ohookabove"},
+  {0x01a0, "Ohorn"},
+  {0x1eda, "Ohornacute"},
+  {0x1ee2, "Ohorndotbelow"},
+  {0x1edc, "Ohorngrave"},
+  {0x1ede, "Ohornhookabove"},
+  {0x1ee0, "Ohorntilde"},
+  {0x0150, "Ohungarumlaut"},
+  {0x01a2, "Oi"},
+  {0x020e, "Oinvertedbreve"},
+  {0x014c, "Omacron"},
+  {0x1e52, "Omacronacute"},
+  {0x1e50, "Omacrongrave"},
+  {0x2126, "Omega"},
+  {0x0460, "Omegacyrillic"},
+  {0x03a9, "Omegagreek"},
+  {0x047a, "Omegaroundcyrillic"},
+  {0x047c, "Omegatitlocyrillic"},
+  {0x038f, "Omegatonos"},
+  {0x039f, "Omicron"},
+  {0x038c, "Omicrontonos"},
+  {0xff2f, "Omonospace"},
+  {0x2160, "Oneroman"},
+  {0x01ea, "Oogonek"},
+  {0x01ec, "Oogonekmacron"},
+  {0x0186, "Oopen"},
+  {0x00d8, "Oslash"},
+  {0x01fe, "Oslashacute"},
+  {0xf7f8, "Oslashsmall"},
+  {0xf76f, "Osmall"},
+  {0x01fe, "Ostrokeacute"},
+  {0x047e, "Otcyrillic"},
+  {0x00d5, "Otilde"},
+  {0x1e4c, "Otildeacute"},
+  {0x1e4e, "Otildedieresis"},
+  {0xf7f5, "Otildesmall"},
+  {0x0050, "P"},
+  {0x1e54, "Pacute"},
+  {0x24c5, "Pcircle"},
+  {0x1e56, "Pdotaccent"},
+  {0x041f, "Pecyrillic"},
+  {0x054a, "Peharmenian"},
+  {0x04a6, "Pemiddlehookcyrillic"},
+  {0x03a6, "Phi"},
+  {0x01a4, "Phook"},
+  {0x03a0, "Pi"},
+  {0x0553, "Piwrarmenian"},
+  {0xff30, "Pmonospace"},
+  {0x03a8, "Psi"},
+  {0x0470, "Psicyrillic"},
+  {0xf770, "Psmall"},
+  {0x0051, "Q"},
+  {0x24c6, "Qcircle"},
+  {0xff31, "Qmonospace"},
+  {0xf771, "Qsmall"},
+  {0x0052, "R"},
+  {0x054c, "Raarmenian"},
+  {0x0154, "Racute"},
+  {0x0158, "Rcaron"},
+  {0x0156, "Rcedilla"},
+  {0x24c7, "Rcircle"},
+  {0x0156, "Rcommaaccent"},
+  {0x0210, "Rdblgrave"},
+  {0x1e58, "Rdotaccent"},
+  {0x1e5a, "Rdotbelow"},
+  {0x1e5c, "Rdotbelowmacron"},
+  {0x0550, "Reharmenian"},
+  {0x211c, "Rfraktur"},
+  {0x03a1, "Rho"},
+  {0xf6fc, "Ringsmall"},
+  {0x0212, "Rinvertedbreve"},
+  {0x1e5e, "Rlinebelow"},
+  {0xff32, "Rmonospace"},
+  {0xf772, "Rsmall"},
+  {0x0281, "Rsmallinverted"},
+  {0x02b6, "Rsmallinvertedsuperior"},
+  {0x0053, "S"},
+  {0x250c, "SF010000"},
+  {0x2514, "SF020000"},
+  {0x2510, "SF030000"},
+  {0x2518, "SF040000"},
+  {0x253c, "SF050000"},
+  {0x252c, "SF060000"},
+  {0x2534, "SF070000"},
+  {0x251c, "SF080000"},
+  {0x2524, "SF090000"},
+  {0x2500, "SF100000"},
+  {0x2502, "SF110000"},
+  {0x2561, "SF190000"},
+  {0x2562, "SF200000"},
+  {0x2556, "SF210000"},
+  {0x2555, "SF220000"},
+  {0x2563, "SF230000"},
+  {0x2551, "SF240000"},
+  {0x2557, "SF250000"},
+  {0x255d, "SF260000"},
+  {0x255c, "SF270000"},
+  {0x255b, "SF280000"},
+  {0x255e, "SF360000"},
+  {0x255f, "SF370000"},
+  {0x255a, "SF380000"},
+  {0x2554, "SF390000"},
+  {0x2569, "SF400000"},
+  {0x2566, "SF410000"},
+  {0x2560, "SF420000"},
+  {0x2550, "SF430000"},
+  {0x256c, "SF440000"},
+  {0x2567, "SF450000"},
+  {0x2568, "SF460000"},
+  {0x2564, "SF470000"},
+  {0x2565, "SF480000"},
+  {0x2559, "SF490000"},
+  {0x2558, "SF500000"},
+  {0x2552, "SF510000"},
+  {0x2553, "SF520000"},
+  {0x256b, "SF530000"},
+  {0x256a, "SF540000"},
+  {0x015a, "Sacute"},
+  {0x1e64, "Sacutedotaccent"},
+  {0x03e0, "Sampigreek"},
+  {0x0160, "Scaron"},
+  {0x1e66, "Scarondotaccent"},
+  {0xf6fd, "Scaronsmall"},
+  {0x015e, "Scedilla"},
+  {0x018f, "Schwa"},
+  {0x04d8, "Schwacyrillic"},
+  {0x04da, "Schwadieresiscyrillic"},
+  {0x24c8, "Scircle"},
+  {0x015c, "Scircumflex"},
+  {0x0218, "Scommaaccent"},
+  {0x1e60, "Sdotaccent"},
+  {0x1e62, "Sdotbelow"},
+  {0x1e68, "Sdotbelowdotaccent"},
+  {0x054d, "Seharmenian"},
+  {0x2166, "Sevenroman"},
+  {0x0547, "Shaarmenian"},
+  {0x0428, "Shacyrillic"},
+  {0x0429, "Shchacyrillic"},
+  {0x03e2, "Sheicoptic"},
+  {0x04ba, "Shhacyrillic"},
+  {0x03ec, "Shimacoptic"},
+  {0x03a3, "Sigma"},
+  {0x2165, "Sixroman"},
+  {0xff33, "Smonospace"},
+  {0x042c, "Softsigncyrillic"},
+  {0xf773, "Ssmall"},
+  {0x03da, "Stigmagreek"},
+  {0x0054, "T"},
+  {0x03a4, "Tau"},
+  {0x0166, "Tbar"},
+  {0x0164, "Tcaron"},
+  {0x0162, "Tcedilla"},
+  {0x24c9, "Tcircle"},
+  {0x1e70, "Tcircumflexbelow"},
+  {0x0162, "Tcommaaccent"},
+  {0x1e6a, "Tdotaccent"},
+  {0x1e6c, "Tdotbelow"},
+  {0x0422, "Tecyrillic"},
+  {0x04ac, "Tedescendercyrillic"},
+  {0x2169, "Tenroman"},
+  {0x04b4, "Tetsecyrillic"},
+  {0x0398, "Theta"},
+  {0x01ac, "Thook"},
+  {0x00de, "Thorn"},
+  {0xf7fe, "Thornsmall"},
+  {0x2162, "Threeroman"},
+  {0xf6fe, "Tildesmall"},
+  {0x054f, "Tiwnarmenian"},
+  {0x1e6e, "Tlinebelow"},
+  {0xff34, "Tmonospace"},
+  {0x0539, "Toarmenian"},
+  {0x01bc, "Tonefive"},
+  {0x0184, "Tonesix"},
+  {0x01a7, "Tonetwo"},
+  {0x01ae, "Tretroflexhook"},
+  {0x0426, "Tsecyrillic"},
+  {0x040b, "Tshecyrillic"},
+  {0xf774, "Tsmall"},
+  {0x216b, "Twelveroman"},
+  {0x2161, "Tworoman"},
+  {0x0055, "U"},
+  {0x00da, "Uacute"},
+  {0xf7fa, "Uacutesmall"},
+  {0x016c, "Ubreve"},
+  {0x01d3, "Ucaron"},
+  {0x24ca, "Ucircle"},
+  {0x00db, "Ucircumflex"},
+  {0x1e76, "Ucircumflexbelow"},
+  {0xf7fb, "Ucircumflexsmall"},
+  {0x0423, "Ucyrillic"},
+  {0x0170, "Udblacute"},
+  {0x0214, "Udblgrave"},
+  {0x00dc, "Udieresis"},
+  {0x01d7, "Udieresisacute"},
+  {0x1e72, "Udieresisbelow"},
+  {0x01d9, "Udieresiscaron"},
+  {0x04f0, "Udieresiscyrillic"},
+  {0x01db, "Udieresisgrave"},
+  {0x01d5, "Udieresismacron"},
+  {0xf7fc, "Udieresissmall"},
+  {0x1ee4, "Udotbelow"},
+  {0x00d9, "Ugrave"},
+  {0xf7f9, "Ugravesmall"},
+  {0x1ee6, "Uhookabove"},
+  {0x01af, "Uhorn"},
+  {0x1ee8, "Uhornacute"},
+  {0x1ef0, "Uhorndotbelow"},
+  {0x1eea, "Uhorngrave"},
+  {0x1eec, "Uhornhookabove"},
+  {0x1eee, "Uhorntilde"},
+  {0x0170, "Uhungarumlaut"},
+  {0x04f2, "Uhungarumlautcyrillic"},
+  {0x0216, "Uinvertedbreve"},
+  {0x0478, "Ukcyrillic"},
+  {0x016a, "Umacron"},
+  {0x04ee, "Umacroncyrillic"},
+  {0x1e7a, "Umacrondieresis"},
+  {0xff35, "Umonospace"},
+  {0x0172, "Uogonek"},
+  {0x03a5, "Upsilon"},
+  {0x03d2, "Upsilon1"},
+  {0x03d3, "Upsilonacutehooksymbolgreek"},
+  {0x01b1, "Upsilonafrican"},
+  {0x03ab, "Upsilondieresis"},
+  {0x03d4, "Upsilondieresishooksymbolgreek"},
+  {0x03d2, "Upsilonhooksymbol"},
+  {0x038e, "Upsilontonos"},
+  {0x016e, "Uring"},
+  {0x040e, "Ushortcyrillic"},
+  {0xf775, "Usmall"},
+  {0x04ae, "Ustraightcyrillic"},
+  {0x04b0, "Ustraightstrokecyrillic"},
+  {0x0168, "Utilde"},
+  {0x1e78, "Utildeacute"},
+  {0x1e74, "Utildebelow"},
+  {0x0056, "V"},
+  {0x24cb, "Vcircle"},
+  {0x1e7e, "Vdotbelow"},
+  {0x0412, "Vecyrillic"},
+  {0x054e, "Vewarmenian"},
+  {0x01b2, "Vhook"},
+  {0xff36, "Vmonospace"},
+  {0x0548, "Voarmenian"},
+  {0xf776, "Vsmall"},
+  {0x1e7c, "Vtilde"},
+  {0x0057, "W"},
+  {0x1e82, "Wacute"},
+  {0x24cc, "Wcircle"},
+  {0x0174, "Wcircumflex"},
+  {0x1e84, "Wdieresis"},
+  {0x1e86, "Wdotaccent"},
+  {0x1e88, "Wdotbelow"},
+  {0x1e80, "Wgrave"},
+  {0xff37, "Wmonospace"},
+  {0xf777, "Wsmall"},
+  {0x0058, "X"},
+  {0x24cd, "Xcircle"},
+  {0x1e8c, "Xdieresis"},
+  {0x1e8a, "Xdotaccent"},
+  {0x053d, "Xeharmenian"},
+  {0x039e, "Xi"},
+  {0xff38, "Xmonospace"},
+  {0xf778, "Xsmall"},
+  {0x0059, "Y"},
+  {0x00dd, "Yacute"},
+  {0xf7fd, "Yacutesmall"},
+  {0x0462, "Yatcyrillic"},
+  {0x24ce, "Ycircle"},
+  {0x0176, "Ycircumflex"},
+  {0x0178, "Ydieresis"},
+  {0xf7ff, "Ydieresissmall"},
+  {0x1e8e, "Ydotaccent"},
+  {0x1ef4, "Ydotbelow"},
+  {0x042b, "Yericyrillic"},
+  {0x04f8, "Yerudieresiscyrillic"},
+  {0x1ef2, "Ygrave"},
+  {0x01b3, "Yhook"},
+  {0x1ef6, "Yhookabove"},
+  {0x0545, "Yiarmenian"},
+  {0x0407, "Yicyrillic"},
+  {0x0552, "Yiwnarmenian"},
+  {0xff39, "Ymonospace"},
+  {0xf779, "Ysmall"},
+  {0x1ef8, "Ytilde"},
+  {0x046a, "Yusbigcyrillic"},
+  {0x046c, "Yusbigiotifiedcyrillic"},
+  {0x0466, "Yuslittlecyrillic"},
+  {0x0468, "Yuslittleiotifiedcyrillic"},
+  {0x005a, "Z"},
+  {0x0536, "Zaarmenian"},
+  {0x0179, "Zacute"},
+  {0x017d, "Zcaron"},
+  {0xf6ff, "Zcaronsmall"},
+  {0x24cf, "Zcircle"},
+  {0x1e90, "Zcircumflex"},
+  {0x017b, "Zdot"},
+  {0x017b, "Zdotaccent"},
+  {0x1e92, "Zdotbelow"},
+  {0x0417, "Zecyrillic"},
+  {0x0498, "Zedescendercyrillic"},
+  {0x04de, "Zedieresiscyrillic"},
+  {0x0396, "Zeta"},
+  {0x053a, "Zhearmenian"},
+  {0x04c1, "Zhebrevecyrillic"},
+  {0x0416, "Zhecyrillic"},
+  {0x0496, "Zhedescendercyrillic"},
+  {0x04dc, "Zhedieresiscyrillic"},
+  {0x1e94, "Zlinebelow"},
+  {0xff3a, "Zmonospace"},
+  {0xf77a, "Zsmall"},
+  {0x01b5, "Zstroke"},
+  {0x0022, "\""},
+  {0x005c, "\\"},
+  {0x005d, "]"},
+  {0x005e, "^"},
+  {0x005f, "_"},
+  {0x0060, "`"},
+  {0x0061, "a"},
+  {0x275e, "a100"},
+  {0x2761, "a101"},
+  {0x2762, "a102"},
+  {0x2763, "a103"},
+  {0x2764, "a104"},
+  {0x2710, "a105"},
+  {0x2765, "a106"},
+  {0x2766, "a107"},
+  {0x2767, "a108"},
+  {0x2660, "a109"},
+  {0x2721, "a10"},
+  {0x2665, "a110"},
+  {0x2666, "a111"},
+  {0x2663, "a112"},
+  {0x2709, "a117"},
+  {0x2708, "a118"},
+  {0x2707, "a119"},
+  {0x261b, "a11"},
+  {0x2460, "a120"},
+  {0x2461, "a121"},
+  {0x2462, "a122"},
+  {0x2463, "a123"},
+  {0x2464, "a124"},
+  {0x2465, "a125"},
+  {0x2466, "a126"},
+  {0x2467, "a127"},
+  {0x2468, "a128"},
+  {0x2469, "a129"},
+  {0x261e, "a12"},
+  {0x2776, "a130"},
+  {0x2777, "a131"},
+  {0x2778, "a132"},
+  {0x2779, "a133"},
+  {0x277a, "a134"},
+  {0x277b, "a135"},
+  {0x277c, "a136"},
+  {0x277d, "a137"},
+  {0x277e, "a138"},
+  {0x277f, "a139"},
+  {0x270c, "a13"},
+  {0x2780, "a140"},
+  {0x2781, "a141"},
+  {0x2782, "a142"},
+  {0x2783, "a143"},
+  {0x2784, "a144"},
+  {0x2785, "a145"},
+  {0x2786, "a146"},
+  {0x2787, "a147"},
+  {0x2788, "a148"},
+  {0x2789, "a149"},
+  {0x270d, "a14"},
+  {0x278a, "a150"},
+  {0x278b, "a151"},
+  {0x278c, "a152"},
+  {0x278d, "a153"},
+  {0x278e, "a154"},
+  {0x278f, "a155"},
+  {0x2790, "a156"},
+  {0x2791, "a157"},
+  {0x2792, "a158"},
+  {0x2793, "a159"},
+  {0x270e, "a15"},
+  {0x2794, "a160"},
+  {0x2192, "a161"},
+  {0x27a3, "a162"},
+  {0x2194, "a163"},
+  {0x2195, "a164"},
+  {0x2799, "a165"},
+  {0x279b, "a166"},
+  {0x279c, "a167"},
+  {0x279d, "a168"},
+  {0x279e, "a169"},
+  {0x270f, "a16"},
+  {0x279f, "a170"},
+  {0x27a0, "a171"},
+  {0x27a1, "a172"},
+  {0x27a2, "a173"},
+  {0x27a4, "a174"},
+  {0x27a5, "a175"},
+  {0x27a6, "a176"},
+  {0x27a7, "a177"},
+  {0x27a8, "a178"},
+  {0x27a9, "a179"},
+  {0x2711, "a17"},
+  {0x27ab, "a180"},
+  {0x27ad, "a181"},
+  {0x27af, "a182"},
+  {0x27b2, "a183"},
+  {0x27b3, "a184"},
+  {0x27b5, "a185"},
+  {0x27b8, "a186"},
+  {0x27ba, "a187"},
+  {0x27bb, "a188"},
+  {0x27bc, "a189"},
+  {0x2712, "a18"},
+  {0x27bd, "a190"},
+  {0x27be, "a191"},
+  {0x279a, "a192"},
+  {0x27aa, "a193"},
+  {0x27b6, "a194"},
+  {0x27b9, "a195"},
+  {0x2798, "a196"},
+  {0x27b4, "a197"},
+  {0x27b7, "a198"},
+  {0x27ac, "a199"},
+  {0x2713, "a19"},
+  {0x2701, "a1"},
+  {0x27ae, "a200"},
+  {0x27b1, "a201"},
+  {0x2703, "a202"},
+  {0x2750, "a203"},
+  {0x2752, "a204"},
+  {0x276e, "a205"},
+  {0x2770, "a206"},
+  {0x2714, "a20"},
+  {0x2715, "a21"},
+  {0x2716, "a22"},
+  {0x2717, "a23"},
+  {0x2718, "a24"},
+  {0x2719, "a25"},
+  {0x271a, "a26"},
+  {0x271b, "a27"},
+  {0x271c, "a28"},
+  {0x2722, "a29"},
+  {0x2702, "a2"},
+  {0x2723, "a30"},
+  {0x2724, "a31"},
+  {0x2725, "a32"},
+  {0x2726, "a33"},
+  {0x2727, "a34"},
+  {0x2605, "a35"},
+  {0x2729, "a36"},
+  {0x272a, "a37"},
+  {0x272b, "a38"},
+  {0x272c, "a39"},
+  {0x2704, "a3"},
+  {0x272d, "a40"},
+  {0x272e, "a41"},
+  {0x272f, "a42"},
+  {0x2730, "a43"},
+  {0x2731, "a44"},
+  {0x2732, "a45"},
+  {0x2733, "a46"},
+  {0x2734, "a47"},
+  {0x2735, "a48"},
+  {0x2736, "a49"},
+  {0x260e, "a4"},
+  {0x2737, "a50"},
+  {0x2738, "a51"},
+  {0x2739, "a52"},
+  {0x273a, "a53"},
+  {0x273b, "a54"},
+  {0x273c, "a55"},
+  {0x273d, "a56"},
+  {0x273e, "a57"},
+  {0x273f, "a58"},
+  {0x2740, "a59"},
+  {0x2706, "a5"},
+  {0x2741, "a60"},
+  {0x2742, "a61"},
+  {0x2743, "a62"},
+  {0x2744, "a63"},
+  {0x2745, "a64"},
+  {0x2746, "a65"},
+  {0x2747, "a66"},
+  {0x2748, "a67"},
+  {0x2749, "a68"},
+  {0x274a, "a69"},
+  {0x271d, "a6"},
+  {0x274b, "a70"},
+  {0x25cf, "a71"},
+  {0x274d, "a72"},
+  {0x25a0, "a73"},
+  {0x274f, "a74"},
+  {0x2751, "a75"},
+  {0x25b2, "a76"},
+  {0x25bc, "a77"},
+  {0x25c6, "a78"},
+  {0x2756, "a79"},
+  {0x271e, "a7"},
+  {0x25d7, "a81"},
+  {0x2758, "a82"},
+  {0x2759, "a83"},
+  {0x275a, "a84"},
+  {0x276f, "a85"},
+  {0x2771, "a86"},
+  {0x2772, "a87"},
+  {0x2773, "a88"},
+  {0x2768, "a89"},
+  {0x271f, "a8"},
+  {0x2769, "a90"},
+  {0x276c, "a91"},
+  {0x276d, "a92"},
+  {0x276a, "a93"},
+  {0x276b, "a94"},
+  {0x2774, "a95"},
+  {0x2775, "a96"},
+  {0x275b, "a97"},
+  {0x275c, "a98"},
+  {0x275d, "a99"},
+  {0x2720, "a9"},
+  {0x0986, "aabengali"},
+  {0x00e1, "aacute"},
+  {0x0906, "aadeva"},
+  {0x0a86, "aagujarati"},
+  {0x0a06, "aagurmukhi"},
+  {0x0a3e, "aamatragurmukhi"},
+  {0x3303, "aarusquare"},
+  {0x09be, "aavowelsignbengali"},
+  {0x093e, "aavowelsigndeva"},
+  {0x0abe, "aavowelsigngujarati"},
+  {0x055f, "abbreviationmarkarmenian"},
+  {0x0970, "abbreviationsigndeva"},
+  {0x0985, "abengali"},
+  {0x311a, "abopomofo"},
+  {0x0103, "abreve"},
+  {0x1eaf, "abreveacute"},
+  {0x04d1, "abrevecyrillic"},
+  {0x1eb7, "abrevedotbelow"},
+  {0x1eb1, "abrevegrave"},
+  {0x1eb3, "abrevehookabove"},
+  {0x1eb5, "abrevetilde"},
+  {0x01ce, "acaron"},
+  {0x24d0, "acircle"},
+  {0x00e2, "acircumflex"},
+  {0x1ea5, "acircumflexacute"},
+  {0x1ead, "acircumflexdotbelow"},
+  {0x1ea7, "acircumflexgrave"},
+  {0x1ea9, "acircumflexhookabove"},
+  {0x1eab, "acircumflextilde"},
+  {0x00b4, "acute"},
+  {0x0317, "acutebelowcmb"},
+  {0x0301, "acutecmb"},
+  {0x0301, "acutecomb"},
+  {0x0954, "acutedeva"},
+  {0x02cf, "acutelowmod"},
+  {0x0341, "acutetonecmb"},
+  {0x0430, "acyrillic"},
+  {0x0201, "adblgrave"},
+  {0x0a71, "addakgurmukhi"},
+  {0x0905, "adeva"},
+  {0x00e4, "adieresis"},
+  {0x04d3, "adieresiscyrillic"},
+  {0x01df, "adieresismacron"},
+  {0x1ea1, "adotbelow"},
+  {0x01e1, "adotmacron"},
+  {0x00e6, "ae"},
+  {0x01fd, "aeacute"},
+  {0x3150, "aekorean"},
+  {0x01e3, "aemacron"},
+  {0x2015, "afii00208"},
+  {0x20a4, "afii08941"},
+  {0x0410, "afii10017"},
+  {0x0411, "afii10018"},
+  {0x0412, "afii10019"},
+  {0x0413, "afii10020"},
+  {0x0414, "afii10021"},
+  {0x0415, "afii10022"},
+  {0x0401, "afii10023"},
+  {0x0416, "afii10024"},
+  {0x0417, "afii10025"},
+  {0x0418, "afii10026"},
+  {0x0419, "afii10027"},
+  {0x041a, "afii10028"},
+  {0x041b, "afii10029"},
+  {0x041c, "afii10030"},
+  {0x041d, "afii10031"},
+  {0x041e, "afii10032"},
+  {0x041f, "afii10033"},
+  {0x0420, "afii10034"},
+  {0x0421, "afii10035"},
+  {0x0422, "afii10036"},
+  {0x0423, "afii10037"},
+  {0x0424, "afii10038"},
+  {0x0425, "afii10039"},
+  {0x0426, "afii10040"},
+  {0x0427, "afii10041"},
+  {0x0428, "afii10042"},
+  {0x0429, "afii10043"},
+  {0x042a, "afii10044"},
+  {0x042b, "afii10045"},
+  {0x042c, "afii10046"},
+  {0x042d, "afii10047"},
+  {0x042e, "afii10048"},
+  {0x042f, "afii10049"},
+  {0x0490, "afii10050"},
+  {0x0402, "afii10051"},
+  {0x0403, "afii10052"},
+  {0x0404, "afii10053"},
+  {0x0405, "afii10054"},
+  {0x0406, "afii10055"},
+  {0x0407, "afii10056"},
+  {0x0408, "afii10057"},
+  {0x0409, "afii10058"},
+  {0x040a, "afii10059"},
+  {0x040b, "afii10060"},
+  {0x040c, "afii10061"},
+  {0x040e, "afii10062"},
+  {0xf6c4, "afii10063"},
+  {0xf6c5, "afii10064"},
+  {0x0430, "afii10065"},
+  {0x0431, "afii10066"},
+  {0x0432, "afii10067"},
+  {0x0433, "afii10068"},
+  {0x0434, "afii10069"},
+  {0x0435, "afii10070"},
+  {0x0451, "afii10071"},
+  {0x0436, "afii10072"},
+  {0x0437, "afii10073"},
+  {0x0438, "afii10074"},
+  {0x0439, "afii10075"},
+  {0x043a, "afii10076"},
+  {0x043b, "afii10077"},
+  {0x043c, "afii10078"},
+  {0x043d, "afii10079"},
+  {0x043e, "afii10080"},
+  {0x043f, "afii10081"},
+  {0x0440, "afii10082"},
+  {0x0441, "afii10083"},
+  {0x0442, "afii10084"},
+  {0x0443, "afii10085"},
+  {0x0444, "afii10086"},
+  {0x0445, "afii10087"},
+  {0x0446, "afii10088"},
+  {0x0447, "afii10089"},
+  {0x0448, "afii10090"},
+  {0x0449, "afii10091"},
+  {0x044a, "afii10092"},
+  {0x044b, "afii10093"},
+  {0x044c, "afii10094"},
+  {0x044d, "afii10095"},
+  {0x044e, "afii10096"},
+  {0x044f, "afii10097"},
+  {0x0491, "afii10098"},
+  {0x0452, "afii10099"},
+  {0x0453, "afii10100"},
+  {0x0454, "afii10101"},
+  {0x0455, "afii10102"},
+  {0x0456, "afii10103"},
+  {0x0457, "afii10104"},
+  {0x0458, "afii10105"},
+  {0x0459, "afii10106"},
+  {0x045a, "afii10107"},
+  {0x045b, "afii10108"},
+  {0x045c, "afii10109"},
+  {0x045e, "afii10110"},
+  {0x040f, "afii10145"},
+  {0x0462, "afii10146"},
+  {0x0472, "afii10147"},
+  {0x0474, "afii10148"},
+  {0xf6c6, "afii10192"},
+  {0x045f, "afii10193"},
+  {0x0463, "afii10194"},
+  {0x0473, "afii10195"},
+  {0x0475, "afii10196"},
+  {0xf6c7, "afii10831"},
+  {0xf6c8, "afii10832"},
+  {0x04d9, "afii10846"},
+  {0x200e, "afii299"},
+  {0x200f, "afii300"},
+  {0x200d, "afii301"},
+  {0x066a, "afii57381"},
+  {0x060c, "afii57388"},
+  {0x0660, "afii57392"},
+  {0x0661, "afii57393"},
+  {0x0662, "afii57394"},
+  {0x0663, "afii57395"},
+  {0x0664, "afii57396"},
+  {0x0665, "afii57397"},
+  {0x0666, "afii57398"},
+  {0x0667, "afii57399"},
+  {0x0668, "afii57400"},
+  {0x0669, "afii57401"},
+  {0x061b, "afii57403"},
+  {0x061f, "afii57407"},
+  {0x0621, "afii57409"},
+  {0x0622, "afii57410"},
+  {0x0623, "afii57411"},
+  {0x0624, "afii57412"},
+  {0x0625, "afii57413"},
+  {0x0626, "afii57414"},
+  {0x0627, "afii57415"},
+  {0x0628, "afii57416"},
+  {0x0629, "afii57417"},
+  {0x062a, "afii57418"},
+  {0x062b, "afii57419"},
+  {0x062c, "afii57420"},
+  {0x062d, "afii57421"},
+  {0x062e, "afii57422"},
+  {0x062f, "afii57423"},
+  {0x0630, "afii57424"},
+  {0x0631, "afii57425"},
+  {0x0632, "afii57426"},
+  {0x0633, "afii57427"},
+  {0x0634, "afii57428"},
+  {0x0635, "afii57429"},
+  {0x0636, "afii57430"},
+  {0x0637, "afii57431"},
+  {0x0638, "afii57432"},
+  {0x0639, "afii57433"},
+  {0x063a, "afii57434"},
+  {0x0640, "afii57440"},
+  {0x0641, "afii57441"},
+  {0x0642, "afii57442"},
+  {0x0643, "afii57443"},
+  {0x0644, "afii57444"},
+  {0x0645, "afii57445"},
+  {0x0646, "afii57446"},
+  {0x0648, "afii57448"},
+  {0x0649, "afii57449"},
+  {0x064a, "afii57450"},
+  {0x064b, "afii57451"},
+  {0x064c, "afii57452"},
+  {0x064d, "afii57453"},
+  {0x064e, "afii57454"},
+  {0x064f, "afii57455"},
+  {0x0650, "afii57456"},
+  {0x0651, "afii57457"},
+  {0x0652, "afii57458"},
+  {0x0647, "afii57470"},
+  {0x06a4, "afii57505"},
+  {0x067e, "afii57506"},
+  {0x0686, "afii57507"},
+  {0x0698, "afii57508"},
+  {0x06af, "afii57509"},
+  {0x0679, "afii57511"},
+  {0x0688, "afii57512"},
+  {0x0691, "afii57513"},
+  {0x06ba, "afii57514"},
+  {0x06d2, "afii57519"},
+  {0x06d5, "afii57534"},
+  {0x20aa, "afii57636"},
+  {0x05be, "afii57645"},
+  {0x05c3, "afii57658"},
+  {0x05d0, "afii57664"},
+  {0x05d1, "afii57665"},
+  {0x05d2, "afii57666"},
+  {0x05d3, "afii57667"},
+  {0x05d4, "afii57668"},
+  {0x05d5, "afii57669"},
+  {0x05d6, "afii57670"},
+  {0x05d7, "afii57671"},
+  {0x05d8, "afii57672"},
+  {0x05d9, "afii57673"},
+  {0x05da, "afii57674"},
+  {0x05db, "afii57675"},
+  {0x05dc, "afii57676"},
+  {0x05dd, "afii57677"},
+  {0x05de, "afii57678"},
+  {0x05df, "afii57679"},
+  {0x05e0, "afii57680"},
+  {0x05e1, "afii57681"},
+  {0x05e2, "afii57682"},
+  {0x05e3, "afii57683"},
+  {0x05e4, "afii57684"},
+  {0x05e5, "afii57685"},
+  {0x05e6, "afii57686"},
+  {0x05e7, "afii57687"},
+  {0x05e8, "afii57688"},
+  {0x05e9, "afii57689"},
+  {0x05ea, "afii57690"},
+  {0xfb2a, "afii57694"},
+  {0xfb2b, "afii57695"},
+  {0xfb4b, "afii57700"},
+  {0xfb1f, "afii57705"},
+  {0x05f0, "afii57716"},
+  {0x05f1, "afii57717"},
+  {0x05f2, "afii57718"},
+  {0xfb35, "afii57723"},
+  {0x05b4, "afii57793"},
+  {0x05b5, "afii57794"},
+  {0x05b6, "afii57795"},
+  {0x05bb, "afii57796"},
+  {0x05b8, "afii57797"},
+  {0x05b7, "afii57798"},
+  {0x05b0, "afii57799"},
+  {0x05b2, "afii57800"},
+  {0x05b1, "afii57801"},
+  {0x05b3, "afii57802"},
+  {0x05c2, "afii57803"},
+  {0x05c1, "afii57804"},
+  {0x05b9, "afii57806"},
+  {0x05bc, "afii57807"},
+  {0x05bd, "afii57839"},
+  {0x05bf, "afii57841"},
+  {0x05c0, "afii57842"},
+  {0x02bc, "afii57929"},
+  {0x2105, "afii61248"},
+  {0x2113, "afii61289"},
+  {0x2116, "afii61352"},
+  {0x202c, "afii61573"},
+  {0x202d, "afii61574"},
+  {0x202e, "afii61575"},
+  {0x200c, "afii61664"},
+  {0x066d, "afii63167"},
+  {0x02bd, "afii64937"},
+  {0x00e0, "agrave"},
+  {0x0a85, "agujarati"},
+  {0x0a05, "agurmukhi"},
+  {0x3042, "ahiragana"},
+  {0x1ea3, "ahookabove"},
+  {0x0990, "aibengali"},
+  {0x311e, "aibopomofo"},
+  {0x0910, "aideva"},
+  {0x04d5, "aiecyrillic"},
+  {0x0a90, "aigujarati"},
+  {0x0a10, "aigurmukhi"},
+  {0x0a48, "aimatragurmukhi"},
+  {0x0639, "ainarabic"},
+  {0xfeca, "ainfinalarabic"},
+  {0xfecb, "aininitialarabic"},
+  {0xfecc, "ainmedialarabic"},
+  {0x0203, "ainvertedbreve"},
+  {0x09c8, "aivowelsignbengali"},
+  {0x0948, "aivowelsigndeva"},
+  {0x0ac8, "aivowelsigngujarati"},
+  {0x30a2, "akatakana"},
+  {0xff71, "akatakanahalfwidth"},
+  {0x314f, "akorean"},
+  {0x05d0, "alef"},
+  {0x0627, "alefarabic"},
+  {0xfb30, "alefdageshhebrew"},
+  {0xfe8e, "aleffinalarabic"},
+  {0x0623, "alefhamzaabovearabic"},
+  {0xfe84, "alefhamzaabovefinalarabic"},
+  {0x0625, "alefhamzabelowarabic"},
+  {0xfe88, "alefhamzabelowfinalarabic"},
+  {0x05d0, "alefhebrew"},
+  {0xfb4f, "aleflamedhebrew"},
+  {0x0622, "alefmaddaabovearabic"},
+  {0xfe82, "alefmaddaabovefinalarabic"},
+  {0x0649, "alefmaksuraarabic"},
+  {0xfef0, "alefmaksurafinalarabic"},
+  {0xfef3, "alefmaksurainitialarabic"},
+  {0xfef4, "alefmaksuramedialarabic"},
+  {0xfb2e, "alefpatahhebrew"},
+  {0xfb2f, "alefqamatshebrew"},
+  {0x2135, "aleph"},
+  {0x224c, "allequal"},
+  {0x03b1, "alpha"},
+  {0x03ac, "alphatonos"},
+  {0x0101, "amacron"},
+  {0xff41, "amonospace"},
+  {0x0026, "ampersand"},
+  {0xff06, "ampersandmonospace"},
+  {0xf726, "ampersandsmall"},
+  {0x33c2, "amsquare"},
+  {0x3122, "anbopomofo"},
+  {0x3124, "angbopomofo"},
+  {0x0e5a, "angkhankhuthai"},
+  {0x2220, "angle"},
+  {0x3008, "anglebracketleft"},
+  {0xfe3f, "anglebracketleftvertical"},
+  {0x3009, "anglebracketright"},
+  {0xfe40, "anglebracketrightvertical"},
+  {0x2329, "angleleft"},
+  {0x232a, "angleright"},
+  {0x212b, "angstrom"},
+  {0x0387, "anoteleia"},
+  {0x0952, "anudattadeva"},
+  {0x0982, "anusvarabengali"},
+  {0x0902, "anusvaradeva"},
+  {0x0a82, "anusvaragujarati"},
+  {0x0105, "aogonek"},
+  {0x3300, "apaatosquare"},
+  {0x249c, "aparen"},
+  {0x055a, "apostrophearmenian"},
+  {0x02bc, "apostrophemod"},
+  {0xf8ff, "apple"},
+  {0x2250, "approaches"},
+  {0x2248, "approxequal"},
+  {0x2252, "approxequalorimage"},
+  {0x2245, "approximatelyequal"},
+  {0x318e, "araeaekorean"},
+  {0x318d, "araeakorean"},
+  {0x2312, "arc"},
+  {0x1e9a, "arighthalfring"},
+  {0x00e5, "aring"},
+  {0x01fb, "aringacute"},
+  {0x1e01, "aringbelow"},
+  {0x2194, "arrowboth"},
+  {0x21e3, "arrowdashdown"},
+  {0x21e0, "arrowdashleft"},
+  {0x21e2, "arrowdashright"},
+  {0x21e1, "arrowdashup"},
+  {0x21d4, "arrowdblboth"},
+  {0x21d3, "arrowdbldown"},
+  {0x21d0, "arrowdblleft"},
+  {0x21d2, "arrowdblright"},
+  {0x21d1, "arrowdblup"},
+  {0x2193, "arrowdown"},
+  {0x2199, "arrowdownleft"},
+  {0x2198, "arrowdownright"},
+  {0x21e9, "arrowdownwhite"},
+  {0x02c5, "arrowheaddownmod"},
+  {0x02c2, "arrowheadleftmod"},
+  {0x02c3, "arrowheadrightmod"},
+  {0x02c4, "arrowheadupmod"},
+  {0xf8e7, "arrowhorizex"},
+  {0x2190, "arrowleft"},
+  {0x21d0, "arrowleftdbl"},
+  {0x21cd, "arrowleftdblstroke"},
+  {0x21c6, "arrowleftoverright"},
+  {0x21e6, "arrowleftwhite"},
+  {0x2192, "arrowright"},
+  {0x21cf, "arrowrightdblstroke"},
+  {0x279e, "arrowrightheavy"},
+  {0x21c4, "arrowrightoverleft"},
+  {0x21e8, "arrowrightwhite"},
+  {0x21e4, "arrowtableft"},
+  {0x21e5, "arrowtabright"},
+  {0x2191, "arrowup"},
+  {0x2195, "arrowupdn"},
+  {0x21a8, "arrowupdnbse"},
+  {0x21a8, "arrowupdownbase"},
+  {0x2196, "arrowupleft"},
+  {0x21c5, "arrowupleftofdown"},
+  {0x2197, "arrowupright"},
+  {0x21e7, "arrowupwhite"},
+  {0xf8e6, "arrowvertex"},
+  {0x005e, "asciicircum"},
+  {0xff3e, "asciicircummonospace"},
+  {0x007e, "asciitilde"},
+  {0xff5e, "asciitildemonospace"},
+  {0x0251, "ascript"},
+  {0x0252, "ascriptturned"},
+  {0x3041, "asmallhiragana"},
+  {0x30a1, "asmallkatakana"},
+  {0xff67, "asmallkatakanahalfwidth"},
+  {0x002a, "asterisk"},
+  {0x066d, "asteriskaltonearabic"},
+  {0x066d, "asteriskarabic"},
+  {0x2217, "asteriskmath"},
+  {0xff0a, "asteriskmonospace"},
+  {0xfe61, "asterisksmall"},
+  {0x2042, "asterism"},
+  {0xf6e9, "asuperior"},
+  {0x2243, "asymptoticallyequal"},
+  {0x0040, "at"},
+  {0x00e3, "atilde"},
+  {0xff20, "atmonospace"},
+  {0xfe6b, "atsmall"},
+  {0x0250, "aturned"},
+  {0x0994, "aubengali"},
+  {0x3120, "aubopomofo"},
+  {0x0914, "audeva"},
+  {0x0a94, "augujarati"},
+  {0x0a14, "augurmukhi"},
+  {0x09d7, "aulengthmarkbengali"},
+  {0x0a4c, "aumatragurmukhi"},
+  {0x09cc, "auvowelsignbengali"},
+  {0x094c, "auvowelsigndeva"},
+  {0x0acc, "auvowelsigngujarati"},
+  {0x093d, "avagrahadeva"},
+  {0x0561, "aybarmenian"},
+  {0x05e2, "ayin"},
+  {0xfb20, "ayinaltonehebrew"},
+  {0x05e2, "ayinhebrew"},
+  {0x0062, "b"},
+  {0x09ac, "babengali"},
+  {0x005c, "backslash"},
+  {0xff3c, "backslashmonospace"},
+  {0x092c, "badeva"},
+  {0x0aac, "bagujarati"},
+  {0x0a2c, "bagurmukhi"},
+  {0x3070, "bahiragana"},
+  {0x0e3f, "bahtthai"},
+  {0x30d0, "bakatakana"},
+  {0x007c, "bar"},
+  {0xff5c, "barmonospace"},
+  {0x3105, "bbopomofo"},
+  {0x24d1, "bcircle"},
+  {0x1e03, "bdotaccent"},
+  {0x1e05, "bdotbelow"},
+  {0x266c, "beamedsixteenthnotes"},
+  {0x2235, "because"},
+  {0x0431, "becyrillic"},
+  {0x0628, "beharabic"},
+  {0xfe90, "behfinalarabic"},
+  {0xfe91, "behinitialarabic"},
+  {0x3079, "behiragana"},
+  {0xfe92, "behmedialarabic"},
+  {0xfc9f, "behmeeminitialarabic"},
+  {0xfc08, "behmeemisolatedarabic"},
+  {0xfc6d, "behnoonfinalarabic"},
+  {0x30d9, "bekatakana"},
+  {0x0562, "benarmenian"},
+  {0x05d1, "bet"},
+  {0x03b2, "beta"},
+  {0x03d0, "betasymbolgreek"},
+  {0xfb31, "betdagesh"},
+  {0xfb31, "betdageshhebrew"},
+  {0x05d1, "bethebrew"},
+  {0xfb4c, "betrafehebrew"},
+  {0x09ad, "bhabengali"},
+  {0x092d, "bhadeva"},
+  {0x0aad, "bhagujarati"},
+  {0x0a2d, "bhagurmukhi"},
+  {0x0253, "bhook"},
+  {0x3073, "bihiragana"},
+  {0x30d3, "bikatakana"},
+  {0x0298, "bilabialclick"},
+  {0x0a02, "bindigurmukhi"},
+  {0x3331, "birusquare"},
+  {0x25cf, "blackcircle"},
+  {0x25c6, "blackdiamond"},
+  {0x25bc, "blackdownpointingtriangle"},
+  {0x25c4, "blackleftpointingpointer"},
+  {0x25c0, "blackleftpointingtriangle"},
+  {0x3010, "blacklenticularbracketleft"},
+  {0xfe3b, "blacklenticularbracketleftvertical"},
+  {0x3011, "blacklenticularbracketright"},
+  {0xfe3c, "blacklenticularbracketrightvertical"},
+  {0x25e3, "blacklowerlefttriangle"},
+  {0x25e2, "blacklowerrighttriangle"},
+  {0x25ac, "blackrectangle"},
+  {0x25ba, "blackrightpointingpointer"},
+  {0x25b6, "blackrightpointingtriangle"},
+  {0x25aa, "blacksmallsquare"},
+  {0x263b, "blacksmilingface"},
+  {0x25a0, "blacksquare"},
+  {0x2605, "blackstar"},
+  {0x25e4, "blackupperlefttriangle"},
+  {0x25e5, "blackupperrighttriangle"},
+  {0x25b4, "blackuppointingsmalltriangle"},
+  {0x25b2, "blackuppointingtriangle"},
+  {0x2423, "blank"},
+  {0x1e07, "blinebelow"},
+  {0x2588, "block"},
+  {0xff42, "bmonospace"},
+  {0x0e1a, "bobaimaithai"},
+  {0x307c, "bohiragana"},
+  {0x30dc, "bokatakana"},
+  {0x249d, "bparen"},
+  {0x33c3, "bqsquare"},
+  {0xf8f4, "braceex"},
+  {0x007b, "braceleft"},
+  {0xf8f3, "braceleftbt"},
+  {0xf8f2, "braceleftmid"},
+  {0xff5b, "braceleftmonospace"},
+  {0xfe5b, "braceleftsmall"},
+  {0xf8f1, "bracelefttp"},
+  {0xfe37, "braceleftvertical"},
+  {0x007d, "braceright"},
+  {0xf8fe, "bracerightbt"},
+  {0xf8fd, "bracerightmid"},
+  {0xff5d, "bracerightmonospace"},
+  {0xfe5c, "bracerightsmall"},
+  {0xf8fc, "bracerighttp"},
+  {0xfe38, "bracerightvertical"},
+  {0x005b, "bracketleft"},
+  {0xf8f0, "bracketleftbt"},
+  {0xf8ef, "bracketleftex"},
+  {0xff3b, "bracketleftmonospace"},
+  {0xf8ee, "bracketlefttp"},
+  {0x005d, "bracketright"},
+  {0xf8fb, "bracketrightbt"},
+  {0xf8fa, "bracketrightex"},
+  {0xff3d, "bracketrightmonospace"},
+  {0xf8f9, "bracketrighttp"},
+  {0x02d8, "breve"},
+  {0x032e, "brevebelowcmb"},
+  {0x0306, "brevecmb"},
+  {0x032f, "breveinvertedbelowcmb"},
+  {0x0311, "breveinvertedcmb"},
+  {0x0361, "breveinverteddoublecmb"},
+  {0x032a, "bridgebelowcmb"},
+  {0x033a, "bridgeinvertedbelowcmb"},
+  {0x00a6, "brokenbar"},
+  {0x0180, "bstroke"},
+  {0xf6ea, "bsuperior"},
+  {0x0183, "btopbar"},
+  {0x3076, "buhiragana"},
+  {0x30d6, "bukatakana"},
+  {0x2022, "bullet"},
+  {0x25d8, "bulletinverse"},
+  {0x2219, "bulletoperator"},
+  {0x25ce, "bullseye"},
+  {0x0063, "c"},
+  {0x056e, "caarmenian"},
+  {0x099a, "cabengali"},
+  {0x0107, "cacute"},
+  {0x091a, "cadeva"},
+  {0x0a9a, "cagujarati"},
+  {0x0a1a, "cagurmukhi"},
+  {0x3388, "calsquare"},
+  {0x0981, "candrabindubengali"},
+  {0x0310, "candrabinducmb"},
+  {0x0901, "candrabindudeva"},
+  {0x0a81, "candrabindugujarati"},
+  {0x21ea, "capslock"},
+  {0x2105, "careof"},
+  {0x02c7, "caron"},
+  {0x032c, "caronbelowcmb"},
+  {0x030c, "caroncmb"},
+  {0x21b5, "carriagereturn"},
+  {0x3118, "cbopomofo"},
+  {0x010d, "ccaron"},
+  {0x00e7, "ccedilla"},
+  {0x1e09, "ccedillaacute"},
+  {0x24d2, "ccircle"},
+  {0x0109, "ccircumflex"},
+  {0x0255, "ccurl"},
+  {0x010b, "cdot"},
+  {0x010b, "cdotaccent"},
+  {0x33c5, "cdsquare"},
+  {0x00b8, "cedilla"},
+  {0x0327, "cedillacmb"},
+  {0x00a2, "cent"},
+  {0x2103, "centigrade"},
+  {0xf6df, "centinferior"},
+  {0xffe0, "centmonospace"},
+  {0xf7a2, "centoldstyle"},
+  {0xf6e0, "centsuperior"},
+  {0x0579, "chaarmenian"},
+  {0x099b, "chabengali"},
+  {0x091b, "chadeva"},
+  {0x0a9b, "chagujarati"},
+  {0x0a1b, "chagurmukhi"},
+  {0x3114, "chbopomofo"},
+  {0x04bd, "cheabkhasiancyrillic"},
+  {0x2713, "checkmark"},
+  {0x0447, "checyrillic"},
+  {0x04bf, "chedescenderabkhasiancyrillic"},
+  {0x04b7, "chedescendercyrillic"},
+  {0x04f5, "chedieresiscyrillic"},
+  {0x0573, "cheharmenian"},
+  {0x04cc, "chekhakassiancyrillic"},
+  {0x04b9, "cheverticalstrokecyrillic"},
+  {0x03c7, "chi"},
+  {0x3277, "chieuchacirclekorean"},
+  {0x3217, "chieuchaparenkorean"},
+  {0x3269, "chieuchcirclekorean"},
+  {0x314a, "chieuchkorean"},
+  {0x3209, "chieuchparenkorean"},
+  {0x0e0a, "chochangthai"},
+  {0x0e08, "chochanthai"},
+  {0x0e09, "chochingthai"},
+  {0x0e0c, "chochoethai"},
+  {0x0188, "chook"},
+  {0x3276, "cieucacirclekorean"},
+  {0x3216, "cieucaparenkorean"},
+  {0x3268, "cieuccirclekorean"},
+  {0x3148, "cieuckorean"},
+  {0x3208, "cieucparenkorean"},
+  {0x321c, "cieucuparenkorean"},
+  {0x25cb, "circle"},
+  {0x2297, "circlemultiply"},
+  {0x2299, "circleot"},
+  {0x2295, "circleplus"},
+  {0x3036, "circlepostalmark"},
+  {0x25d0, "circlewithlefthalfblack"},
+  {0x25d1, "circlewithrighthalfblack"},
+  {0x02c6, "circumflex"},
+  {0x032d, "circumflexbelowcmb"},
+  {0x0302, "circumflexcmb"},
+  {0x2327, "clear"},
+  {0x01c2, "clickalveolar"},
+  {0x01c0, "clickdental"},
+  {0x01c1, "clicklateral"},
+  {0x01c3, "clickretroflex"},
+  {0x2663, "club"},
+  {0x2663, "clubsuitblack"},
+  {0x2667, "clubsuitwhite"},
+  {0x33a4, "cmcubedsquare"},
+  {0xff43, "cmonospace"},
+  {0x33a0, "cmsquaredsquare"},
+  {0x0581, "coarmenian"},
+  {0x003a, "colon"},
+  {0x20a1, "colonmonetary"},
+  {0xff1a, "colonmonospace"},
+  {0x20a1, "colonsign"},
+  {0xfe55, "colonsmall"},
+  {0x02d1, "colontriangularhalfmod"},
+  {0x02d0, "colontriangularmod"},
+  {0x002c, "comma"},
+  {0x0313, "commaabovecmb"},
+  {0x0315, "commaaboverightcmb"},
+  {0xf6c3, "commaaccent"},
+  {0x060c, "commaarabic"},
+  {0x055d, "commaarmenian"},
+  {0xf6e1, "commainferior"},
+  {0xff0c, "commamonospace"},
+  {0x0314, "commareversedabovecmb"},
+  {0x02bd, "commareversedmod"},
+  {0xfe50, "commasmall"},
+  {0xf6e2, "commasuperior"},
+  {0x0312, "commaturnedabovecmb"},
+  {0x02bb, "commaturnedmod"},
+  {0x263c, "compass"},
+  {0x2245, "congruent"},
+  {0x222e, "contourintegral"},
+  {0x2303, "control"},
+  {0x0006, "controlACK"},
+  {0x0007, "controlBEL"},
+  {0x0008, "controlBS"},
+  {0x0018, "controlCAN"},
+  {0x000d, "controlCR"},
+  {0x0011, "controlDC1"},
+  {0x0012, "controlDC2"},
+  {0x0013, "controlDC3"},
+  {0x0014, "controlDC4"},
+  {0x007f, "controlDEL"},
+  {0x0010, "controlDLE"},
+  {0x0019, "controlEM"},
+  {0x0005, "controlENQ"},
+  {0x0004, "controlEOT"},
+  {0x001b, "controlESC"},
+  {0x0017, "controlETB"},
+  {0x0003, "controlETX"},
+  {0x000c, "controlFF"},
+  {0x001c, "controlFS"},
+  {0x001d, "controlGS"},
+  {0x0009, "controlHT"},
+  {0x000a, "controlLF"},
+  {0x0015, "controlNAK"},
+  {0x001e, "controlRS"},
+  {0x000f, "controlSI"},
+  {0x000e, "controlSO"},
+  {0x0002, "controlSOT"},
+  {0x0001, "controlSTX"},
+  {0x001a, "controlSUB"},
+  {0x0016, "controlSYN"},
+  {0x001f, "controlUS"},
+  {0x000b, "controlVT"},
+  {0x00a9, "copyright"},
+  {0xf8e9, "copyrightsans"},
+  {0xf6d9, "copyrightserif"},
+  {0x300c, "cornerbracketleft"},
+  {0xff62, "cornerbracketlefthalfwidth"},
+  {0xfe41, "cornerbracketleftvertical"},
+  {0x300d, "cornerbracketright"},
+  {0xff63, "cornerbracketrighthalfwidth"},
+  {0xfe42, "cornerbracketrightvertical"},
+  {0x337f, "corporationsquare"},
+  {0x33c7, "cosquare"},
+  {0x33c6, "coverkgsquare"},
+  {0x249e, "cparen"},
+  {0x20a2, "cruzeiro"},
+  {0x0297, "cstretched"},
+  {0x22cf, "curlyand"},
+  {0x22ce, "curlyor"},
+  {0x00a4, "currency"},
+  {0xf6d1, "cyrBreve"},
+  {0xf6d2, "cyrFlex"},
+  {0xf6d4, "cyrbreve"},
+  {0xf6d5, "cyrflex"},
+  {0x0064, "d"},
+  {0x0564, "daarmenian"},
+  {0x09a6, "dabengali"},
+  {0x0636, "dadarabic"},
+  {0x0926, "dadeva"},
+  {0xfebe, "dadfinalarabic"},
+  {0xfebf, "dadinitialarabic"},
+  {0xfec0, "dadmedialarabic"},
+  {0x05bc, "dagesh"},
+  {0x05bc, "dageshhebrew"},
+  {0x2020, "dagger"},
+  {0x2021, "daggerdbl"},
+  {0x0aa6, "dagujarati"},
+  {0x0a26, "dagurmukhi"},
+  {0x3060, "dahiragana"},
+  {0x30c0, "dakatakana"},
+  {0x062f, "dalarabic"},
+  {0x05d3, "dalet"},
+  {0xfb33, "daletdagesh"},
+  {0xfb33, "daletdageshhebrew"},
+  {0x05d3, "dalethebrew"},
+  {0xfeaa, "dalfinalarabic"},
+  {0x064f, "dammaarabic"},
+  {0x064f, "dammalowarabic"},
+  {0x064c, "dammatanaltonearabic"},
+  {0x064c, "dammatanarabic"},
+  {0x0964, "danda"},
+  {0x05a7, "dargahebrew"},
+  {0x05a7, "dargalefthebrew"},
+  {0x0485, "dasiapneumatacyrilliccmb"},
+  {0xf6d3, "dblGrave"},
+  {0x300a, "dblanglebracketleft"},
+  {0xfe3d, "dblanglebracketleftvertical"},
+  {0x300b, "dblanglebracketright"},
+  {0xfe3e, "dblanglebracketrightvertical"},
+  {0x032b, "dblarchinvertedbelowcmb"},
+  {0x21d4, "dblarrowleft"},
+  {0x21d2, "dblarrowright"},
+  {0x0965, "dbldanda"},
+  {0xf6d6, "dblgrave"},
+  {0x030f, "dblgravecmb"},
+  {0x222c, "dblintegral"},
+  {0x2017, "dbllowline"},
+  {0x0333, "dbllowlinecmb"},
+  {0x033f, "dbloverlinecmb"},
+  {0x02ba, "dblprimemod"},
+  {0x2016, "dblverticalbar"},
+  {0x030e, "dblverticallineabovecmb"},
+  {0x3109, "dbopomofo"},
+  {0x33c8, "dbsquare"},
+  {0x010f, "dcaron"},
+  {0x1e11, "dcedilla"},
+  {0x24d3, "dcircle"},
+  {0x1e13, "dcircumflexbelow"},
+  {0x0111, "dcroat"},
+  {0x09a1, "ddabengali"},
+  {0x0921, "ddadeva"},
+  {0x0aa1, "ddagujarati"},
+  {0x0a21, "ddagurmukhi"},
+  {0x0688, "ddalarabic"},
+  {0xfb89, "ddalfinalarabic"},
+  {0x095c, "dddhadeva"},
+  {0x09a2, "ddhabengali"},
+  {0x0922, "ddhadeva"},
+  {0x0aa2, "ddhagujarati"},
+  {0x0a22, "ddhagurmukhi"},
+  {0x1e0b, "ddotaccent"},
+  {0x1e0d, "ddotbelow"},
+  {0x066b, "decimalseparatorarabic"},
+  {0x066b, "decimalseparatorpersian"},
+  {0x0434, "decyrillic"},
+  {0x00b0, "degree"},
+  {0x05ad, "dehihebrew"},
+  {0x3067, "dehiragana"},
+  {0x03ef, "deicoptic"},
+  {0x30c7, "dekatakana"},
+  {0x232b, "deleteleft"},
+  {0x2326, "deleteright"},
+  {0x03b4, "delta"},
+  {0x018d, "deltaturned"},
+  {0x09f8, "denominatorminusonenumeratorbengali"},
+  {0x02a4, "dezh"},
+  {0x09a7, "dhabengali"},
+  {0x0927, "dhadeva"},
+  {0x0aa7, "dhagujarati"},
+  {0x0a27, "dhagurmukhi"},
+  {0x0257, "dhook"},
+  {0x0385, "dialytikatonos"},
+  {0x0344, "dialytikatonoscmb"},
+  {0x2666, "diamond"},
+  {0x2662, "diamondsuitwhite"},
+  {0x00a8, "dieresis"},
+  {0xf6d7, "dieresisacute"},
+  {0x0324, "dieresisbelowcmb"},
+  {0x0308, "dieresiscmb"},
+  {0xf6d8, "dieresisgrave"},
+  {0x0385, "dieresistonos"},
+  {0x3062, "dihiragana"},
+  {0x30c2, "dikatakana"},
+  {0x3003, "dittomark"},
+  {0x00f7, "divide"},
+  {0x2223, "divides"},
+  {0x2215, "divisionslash"},
+  {0x0452, "djecyrillic"},
+  {0x2593, "dkshade"},
+  {0x1e0f, "dlinebelow"},
+  {0x3397, "dlsquare"},
+  {0x0111, "dmacron"},
+  {0xff44, "dmonospace"},
+  {0x2584, "dnblock"},
+  {0x0e0e, "dochadathai"},
+  {0x0e14, "dodekthai"},
+  {0x3069, "dohiragana"},
+  {0x30c9, "dokatakana"},
+  {0x0024, "dollar"},
+  {0xf6e3, "dollarinferior"},
+  {0xff04, "dollarmonospace"},
+  {0xf724, "dollaroldstyle"},
+  {0xfe69, "dollarsmall"},
+  {0xf6e4, "dollarsuperior"},
+  {0x20ab, "dong"},
+  {0x3326, "dorusquare"},
+  {0x02d9, "dotaccent"},
+  {0x0307, "dotaccentcmb"},
+  {0x0323, "dotbelowcmb"},
+  {0x0323, "dotbelowcomb"},
+  {0x30fb, "dotkatakana"},
+  {0x0131, "dotlessi"},
+  {0xf6be, "dotlessj"},
+  {0x0284, "dotlessjstrokehook"},
+  {0x22c5, "dotmath"},
+  {0x25cc, "dottedcircle"},
+  {0xfb1f, "doubleyodpatah"},
+  {0xfb1f, "doubleyodpatahhebrew"},
+  {0x031e, "downtackbelowcmb"},
+  {0x02d5, "downtackmod"},
+  {0x249f, "dparen"},
+  {0xf6eb, "dsuperior"},
+  {0x0256, "dtail"},
+  {0x018c, "dtopbar"},
+  {0x3065, "duhiragana"},
+  {0x30c5, "dukatakana"},
+  {0x01f3, "dz"},
+  {0x02a3, "dzaltone"},
+  {0x01c6, "dzcaron"},
+  {0x02a5, "dzcurl"},
+  {0x04e1, "dzeabkhasiancyrillic"},
+  {0x0455, "dzecyrillic"},
+  {0x045f, "dzhecyrillic"},
+  {0x0065, "e"},
+  {0x00e9, "eacute"},
+  {0x2641, "earth"},
+  {0x098f, "ebengali"},
+  {0x311c, "ebopomofo"},
+  {0x0115, "ebreve"},
+  {0x090d, "ecandradeva"},
+  {0x0a8d, "ecandragujarati"},
+  {0x0945, "ecandravowelsigndeva"},
+  {0x0ac5, "ecandravowelsigngujarati"},
+  {0x011b, "ecaron"},
+  {0x1e1d, "ecedillabreve"},
+  {0x0565, "echarmenian"},
+  {0x0587, "echyiwnarmenian"},
+  {0x24d4, "ecircle"},
+  {0x00ea, "ecircumflex"},
+  {0x1ebf, "ecircumflexacute"},
+  {0x1e19, "ecircumflexbelow"},
+  {0x1ec7, "ecircumflexdotbelow"},
+  {0x1ec1, "ecircumflexgrave"},
+  {0x1ec3, "ecircumflexhookabove"},
+  {0x1ec5, "ecircumflextilde"},
+  {0x0454, "ecyrillic"},
+  {0x0205, "edblgrave"},
+  {0x090f, "edeva"},
+  {0x00eb, "edieresis"},
+  {0x0117, "edot"},
+  {0x0117, "edotaccent"},
+  {0x1eb9, "edotbelow"},
+  {0x0a0f, "eegurmukhi"},
+  {0x0a47, "eematragurmukhi"},
+  {0x0444, "efcyrillic"},
+  {0x00e8, "egrave"},
+  {0x0a8f, "egujarati"},
+  {0x0567, "eharmenian"},
+  {0x311d, "ehbopomofo"},
+  {0x3048, "ehiragana"},
+  {0x1ebb, "ehookabove"},
+  {0x311f, "eibopomofo"},
+  {0x0038, "eight"},
+  {0x0668, "eightarabic"},
+  {0x09ee, "eightbengali"},
+  {0x2467, "eightcircle"},
+  {0x2791, "eightcircleinversesansserif"},
+  {0x096e, "eightdeva"},
+  {0x2471, "eighteencircle"},
+  {0x2485, "eighteenparen"},
+  {0x2499, "eighteenperiod"},
+  {0x0aee, "eightgujarati"},
+  {0x0a6e, "eightgurmukhi"},
+  {0x0668, "eighthackarabic"},
+  {0x3028, "eighthangzhou"},
+  {0x266b, "eighthnotebeamed"},
+  {0x3227, "eightideographicparen"},
+  {0x2088, "eightinferior"},
+  {0xff18, "eightmonospace"},
+  {0xf738, "eightoldstyle"},
+  {0x247b, "eightparen"},
+  {0x248f, "eightperiod"},
+  {0x06f8, "eightpersian"},
+  {0x2177, "eightroman"},
+  {0x2078, "eightsuperior"},
+  {0x0e58, "eightthai"},
+  {0x0207, "einvertedbreve"},
+  {0x0465, "eiotifiedcyrillic"},
+  {0x30a8, "ekatakana"},
+  {0xff74, "ekatakanahalfwidth"},
+  {0x0a74, "ekonkargurmukhi"},
+  {0x3154, "ekorean"},
+  {0x043b, "elcyrillic"},
+  {0x2208, "element"},
+  {0x246a, "elevencircle"},
+  {0x247e, "elevenparen"},
+  {0x2492, "elevenperiod"},
+  {0x217a, "elevenroman"},
+  {0x2026, "ellipsis"},
+  {0x22ee, "ellipsisvertical"},
+  {0x0113, "emacron"},
+  {0x1e17, "emacronacute"},
+  {0x1e15, "emacrongrave"},
+  {0x043c, "emcyrillic"},
+  {0x2014, "emdash"},
+  {0xfe31, "emdashvertical"},
+  {0xff45, "emonospace"},
+  {0x055b, "emphasismarkarmenian"},
+  {0x2205, "emptyset"},
+  {0x3123, "enbopomofo"},
+  {0x043d, "encyrillic"},
+  {0x2013, "endash"},
+  {0xfe32, "endashvertical"},
+  {0x04a3, "endescendercyrillic"},
+  {0x014b, "eng"},
+  {0x3125, "engbopomofo"},
+  {0x04a5, "enghecyrillic"},
+  {0x04c8, "enhookcyrillic"},
+  {0x2002, "enspace"},
+  {0x0119, "eogonek"},
+  {0x3153, "eokorean"},
+  {0x025b, "eopen"},
+  {0x029a, "eopenclosed"},
+  {0x025c, "eopenreversed"},
+  {0x025e, "eopenreversedclosed"},
+  {0x025d, "eopenreversedhook"},
+  {0x24a0, "eparen"},
+  {0x03b5, "epsilon"},
+  {0x03ad, "epsilontonos"},
+  {0x003d, "equal"},
+  {0xff1d, "equalmonospace"},
+  {0xfe66, "equalsmall"},
+  {0x207c, "equalsuperior"},
+  {0x2261, "equivalence"},
+  {0x3126, "erbopomofo"},
+  {0x0440, "ercyrillic"},
+  {0x0258, "ereversed"},
+  {0x044d, "ereversedcyrillic"},
+  {0x0441, "escyrillic"},
+  {0x04ab, "esdescendercyrillic"},
+  {0x0283, "esh"},
+  {0x0286, "eshcurl"},
+  {0x090e, "eshortdeva"},
+  {0x0946, "eshortvowelsigndeva"},
+  {0x01aa, "eshreversedloop"},
+  {0x0285, "eshsquatreversed"},
+  {0x3047, "esmallhiragana"},
+  {0x30a7, "esmallkatakana"},
+  {0xff6a, "esmallkatakanahalfwidth"},
+  {0x212e, "estimated"},
+  {0xf6ec, "esuperior"},
+  {0x03b7, "eta"},
+  {0x0568, "etarmenian"},
+  {0x03ae, "etatonos"},
+  {0x00f0, "eth"},
+  {0x1ebd, "etilde"},
+  {0x1e1b, "etildebelow"},
+  {0x0591, "etnahtafoukhhebrew"},
+  {0x0591, "etnahtafoukhlefthebrew"},
+  {0x0591, "etnahtahebrew"},
+  {0x0591, "etnahtalefthebrew"},
+  {0x01dd, "eturned"},
+  {0x3161, "eukorean"},
+  {0x20ac, "euro"},
+  {0x09c7, "evowelsignbengali"},
+  {0x0947, "evowelsigndeva"},
+  {0x0ac7, "evowelsigngujarati"},
+  {0x0021, "exclam"},
+  {0x055c, "exclamarmenian"},
+  {0x203c, "exclamdbl"},
+  {0x00a1, "exclamdown"},
+  {0xf7a1, "exclamdownsmall"},
+  {0x0021, "exclamleft"},
+  {0xff01, "exclammonospace"},
+  {0xf721, "exclamsmall"},
+  {0x2203, "existential"},
+  {0x0292, "ezh"},
+  {0x01ef, "ezhcaron"},
+  {0x0293, "ezhcurl"},
+  {0x01b9, "ezhreversed"},
+  {0x01ba, "ezhtail"},
+  {0x0066, "f"},
+  {0x095e, "fadeva"},
+  {0x0a5e, "fagurmukhi"},
+  {0x2109, "fahrenheit"},
+  {0x064e, "fathaarabic"},
+  {0x064e, "fathalowarabic"},
+  {0x064b, "fathatanarabic"},
+  {0x3108, "fbopomofo"},
+  {0x24d5, "fcircle"},
+  {0x1e1f, "fdotaccent"},
+  {0x0641, "feharabic"},
+  {0x0586, "feharmenian"},
+  {0xfed2, "fehfinalarabic"},
+  {0xfed3, "fehinitialarabic"},
+  {0xfed4, "fehmedialarabic"},
+  {0x03e5, "feicoptic"},
+  {0x2640, "female"},
+  {0xfb00, "ff"},
+  {0xfb03, "ffi"},
+  {0xfb04, "ffl"},
+  {0xfb01, "fi"},
+  {0x246e, "fifteencircle"},
+  {0x2482, "fifteenparen"},
+  {0x2496, "fifteenperiod"},
+  {0x2012, "figuredash"},
+  {0x25a0, "filledbox"},
+  {0x25ac, "filledrect"},
+  {0x05da, "finalkaf"},
+  {0xfb3a, "finalkafdagesh"},
+  {0xfb3a, "finalkafdageshhebrew"},
+  {0x05da, "finalkafhebrew"},
+  {0x05dd, "finalmem"},
+  {0x05dd, "finalmemhebrew"},
+  {0x05df, "finalnun"},
+  {0x05df, "finalnunhebrew"},
+  {0x05e3, "finalpe"},
+  {0x05e3, "finalpehebrew"},
+  {0x05e5, "finaltsadi"},
+  {0x05e5, "finaltsadihebrew"},
+  {0x02c9, "firsttonechinese"},
+  {0x25c9, "fisheye"},
+  {0x0473, "fitacyrillic"},
+  {0x0035, "five"},
+  {0x0665, "fivearabic"},
+  {0x09eb, "fivebengali"},
+  {0x2464, "fivecircle"},
+  {0x278e, "fivecircleinversesansserif"},
+  {0x096b, "fivedeva"},
+  {0x215d, "fiveeighths"},
+  {0x0aeb, "fivegujarati"},
+  {0x0a6b, "fivegurmukhi"},
+  {0x0665, "fivehackarabic"},
+  {0x3025, "fivehangzhou"},
+  {0x3224, "fiveideographicparen"},
+  {0x2085, "fiveinferior"},
+  {0xff15, "fivemonospace"},
+  {0xf735, "fiveoldstyle"},
+  {0x2478, "fiveparen"},
+  {0x248c, "fiveperiod"},
+  {0x06f5, "fivepersian"},
+  {0x2174, "fiveroman"},
+  {0x2075, "fivesuperior"},
+  {0x0e55, "fivethai"},
+  {0xfb02, "fl"},
+  {0x0192, "florin"},
+  {0xff46, "fmonospace"},
+  {0x3399, "fmsquare"},
+  {0x0e1f, "fofanthai"},
+  {0x0e1d, "fofathai"},
+  {0x0e4f, "fongmanthai"},
+  {0x2200, "forall"},
+  {0x0034, "four"},
+  {0x0664, "fourarabic"},
+  {0x09ea, "fourbengali"},
+  {0x2463, "fourcircle"},
+  {0x278d, "fourcircleinversesansserif"},
+  {0x096a, "fourdeva"},
+  {0x0aea, "fourgujarati"},
+  {0x0a6a, "fourgurmukhi"},
+  {0x0664, "fourhackarabic"},
+  {0x3024, "fourhangzhou"},
+  {0x3223, "fourideographicparen"},
+  {0x2084, "fourinferior"},
+  {0xff14, "fourmonospace"},
+  {0x09f7, "fournumeratorbengali"},
+  {0xf734, "fouroldstyle"},
+  {0x2477, "fourparen"},
+  {0x248b, "fourperiod"},
+  {0x06f4, "fourpersian"},
+  {0x2173, "fourroman"},
+  {0x2074, "foursuperior"},
+  {0x246d, "fourteencircle"},
+  {0x2481, "fourteenparen"},
+  {0x2495, "fourteenperiod"},
+  {0x0e54, "fourthai"},
+  {0x02cb, "fourthtonechinese"},
+  {0x24a1, "fparen"},
+  {0x2044, "fraction"},
+  {0x20a3, "franc"},
+  {0x0067, "g"},
+  {0x0997, "gabengali"},
+  {0x01f5, "gacute"},
+  {0x0917, "gadeva"},
+  {0x06af, "gafarabic"},
+  {0xfb93, "gaffinalarabic"},
+  {0xfb94, "gafinitialarabic"},
+  {0xfb95, "gafmedialarabic"},
+  {0x0a97, "gagujarati"},
+  {0x0a17, "gagurmukhi"},
+  {0x304c, "gahiragana"},
+  {0x30ac, "gakatakana"},
+  {0x03b3, "gamma"},
+  {0x0263, "gammalatinsmall"},
+  {0x02e0, "gammasuperior"},
+  {0x03eb, "gangiacoptic"},
+  {0x310d, "gbopomofo"},
+  {0x011f, "gbreve"},
+  {0x01e7, "gcaron"},
+  {0x0123, "gcedilla"},
+  {0x24d6, "gcircle"},
+  {0x011d, "gcircumflex"},
+  {0x0123, "gcommaaccent"},
+  {0x0121, "gdot"},
+  {0x0121, "gdotaccent"},
+  {0x0433, "gecyrillic"},
+  {0x3052, "gehiragana"},
+  {0x30b2, "gekatakana"},
+  {0x2251, "geometricallyequal"},
+  {0x059c, "gereshaccenthebrew"},
+  {0x05f3, "gereshhebrew"},
+  {0x059d, "gereshmuqdamhebrew"},
+  {0x00df, "germandbls"},
+  {0x059e, "gershayimaccenthebrew"},
+  {0x05f4, "gershayimhebrew"},
+  {0x3013, "getamark"},
+  {0x0998, "ghabengali"},
+  {0x0572, "ghadarmenian"},
+  {0x0918, "ghadeva"},
+  {0x0a98, "ghagujarati"},
+  {0x0a18, "ghagurmukhi"},
+  {0x063a, "ghainarabic"},
+  {0xfece, "ghainfinalarabic"},
+  {0xfecf, "ghaininitialarabic"},
+  {0xfed0, "ghainmedialarabic"},
+  {0x0495, "ghemiddlehookcyrillic"},
+  {0x0493, "ghestrokecyrillic"},
+  {0x0491, "gheupturncyrillic"},
+  {0x095a, "ghhadeva"},
+  {0x0a5a, "ghhagurmukhi"},
+  {0x0260, "ghook"},
+  {0x3393, "ghzsquare"},
+  {0x304e, "gihiragana"},
+  {0x30ae, "gikatakana"},
+  {0x0563, "gimarmenian"},
+  {0x05d2, "gimel"},
+  {0xfb32, "gimeldagesh"},
+  {0xfb32, "gimeldageshhebrew"},
+  {0x05d2, "gimelhebrew"},
+  {0x0453, "gjecyrillic"},
+  {0x01be, "glottalinvertedstroke"},
+  {0x0294, "glottalstop"},
+  {0x0296, "glottalstopinverted"},
+  {0x02c0, "glottalstopmod"},
+  {0x0295, "glottalstopreversed"},
+  {0x02c1, "glottalstopreversedmod"},
+  {0x02e4, "glottalstopreversedsuperior"},
+  {0x02a1, "glottalstopstroke"},
+  {0x02a2, "glottalstopstrokereversed"},
+  {0x1e21, "gmacron"},
+  {0xff47, "gmonospace"},
+  {0x3054, "gohiragana"},
+  {0x30b4, "gokatakana"},
+  {0x24a2, "gparen"},
+  {0x33ac, "gpasquare"},
+  {0x2207, "gradient"},
+  {0x0060, "grave"},
+  {0x0316, "gravebelowcmb"},
+  {0x0300, "gravecmb"},
+  {0x0300, "gravecomb"},
+  {0x0953, "gravedeva"},
+  {0x02ce, "gravelowmod"},
+  {0xff40, "gravemonospace"},
+  {0x0340, "gravetonecmb"},
+  {0x003e, "greater"},
+  {0x2265, "greaterequal"},
+  {0x22db, "greaterequalorless"},
+  {0xff1e, "greatermonospace"},
+  {0x2273, "greaterorequivalent"},
+  {0x2277, "greaterorless"},
+  {0x2267, "greateroverequal"},
+  {0xfe65, "greatersmall"},
+  {0x0261, "gscript"},
+  {0x01e5, "gstroke"},
+  {0x3050, "guhiragana"},
+  {0x00ab, "guillemotleft"},
+  {0x00bb, "guillemotright"},
+  {0x2039, "guilsinglleft"},
+  {0x203a, "guilsinglright"},
+  {0x30b0, "gukatakana"},
+  {0x3318, "guramusquare"},
+  {0x33c9, "gysquare"},
+  {0x0068, "h"},
+  {0x04a9, "haabkhasiancyrillic"},
+  {0x06c1, "haaltonearabic"},
+  {0x09b9, "habengali"},
+  {0x04b3, "hadescendercyrillic"},
+  {0x0939, "hadeva"},
+  {0x0ab9, "hagujarati"},
+  {0x0a39, "hagurmukhi"},
+  {0x062d, "haharabic"},
+  {0xfea2, "hahfinalarabic"},
+  {0xfea3, "hahinitialarabic"},
+  {0x306f, "hahiragana"},
+  {0xfea4, "hahmedialarabic"},
+  {0x332a, "haitusquare"},
+  {0x30cf, "hakatakana"},
+  {0xff8a, "hakatakanahalfwidth"},
+  {0x0a4d, "halantgurmukhi"},
+  {0x0621, "hamzaarabic"},
+  {0x0621, "hamzalowarabic"},
+  {0x3164, "hangulfiller"},
+  {0x044a, "hardsigncyrillic"},
+  {0x21bc, "harpoonleftbarbup"},
+  {0x21c0, "harpoonrightbarbup"},
+  {0x33ca, "hasquare"},
+  {0x05b2, "hatafpatah"},
+  {0x05b2, "hatafpatah16"},
+  {0x05b2, "hatafpatah23"},
+  {0x05b2, "hatafpatah2f"},
+  {0x05b2, "hatafpatahhebrew"},
+  {0x05b2, "hatafpatahnarrowhebrew"},
+  {0x05b2, "hatafpatahquarterhebrew"},
+  {0x05b2, "hatafpatahwidehebrew"},
+  {0x05b3, "hatafqamats"},
+  {0x05b3, "hatafqamats1b"},
+  {0x05b3, "hatafqamats28"},
+  {0x05b3, "hatafqamats34"},
+  {0x05b3, "hatafqamatshebrew"},
+  {0x05b3, "hatafqamatsnarrowhebrew"},
+  {0x05b3, "hatafqamatsquarterhebrew"},
+  {0x05b3, "hatafqamatswidehebrew"},
+  {0x05b1, "hatafsegol"},
+  {0x05b1, "hatafsegol17"},
+  {0x05b1, "hatafsegol24"},
+  {0x05b1, "hatafsegol30"},
+  {0x05b1, "hatafsegolhebrew"},
+  {0x05b1, "hatafsegolnarrowhebrew"},
+  {0x05b1, "hatafsegolquarterhebrew"},
+  {0x05b1, "hatafsegolwidehebrew"},
+  {0x0127, "hbar"},
+  {0x310f, "hbopomofo"},
+  {0x1e2b, "hbrevebelow"},
+  {0x1e29, "hcedilla"},
+  {0x24d7, "hcircle"},
+  {0x0125, "hcircumflex"},
+  {0x1e27, "hdieresis"},
+  {0x1e23, "hdotaccent"},
+  {0x1e25, "hdotbelow"},
+  {0x05d4, "he"},
+  {0x2665, "heart"},
+  {0x2665, "heartsuitblack"},
+  {0x2661, "heartsuitwhite"},
+  {0xfb34, "hedagesh"},
+  {0xfb34, "hedageshhebrew"},
+  {0x06c1, "hehaltonearabic"},
+  {0x0647, "heharabic"},
+  {0x05d4, "hehebrew"},
+  {0xfba7, "hehfinalaltonearabic"},
+  {0xfeea, "hehfinalalttwoarabic"},
+  {0xfeea, "hehfinalarabic"},
+  {0xfba5, "hehhamzaabovefinalarabic"},
+  {0xfba4, "hehhamzaaboveisolatedarabic"},
+  {0xfba8, "hehinitialaltonearabic"},
+  {0xfeeb, "hehinitialarabic"},
+  {0x3078, "hehiragana"},
+  {0xfba9, "hehmedialaltonearabic"},
+  {0xfeec, "hehmedialarabic"},
+  {0x337b, "heiseierasquare"},
+  {0x30d8, "hekatakana"},
+  {0xff8d, "hekatakanahalfwidth"},
+  {0x3336, "hekutaarusquare"},
+  {0x0267, "henghook"},
+  {0x3339, "herutusquare"},
+  {0x05d7, "het"},
+  {0x05d7, "hethebrew"},
+  {0x0266, "hhook"},
+  {0x02b1, "hhooksuperior"},
+  {0x327b, "hieuhacirclekorean"},
+  {0x321b, "hieuhaparenkorean"},
+  {0x326d, "hieuhcirclekorean"},
+  {0x314e, "hieuhkorean"},
+  {0x320d, "hieuhparenkorean"},
+  {0x3072, "hihiragana"},
+  {0x30d2, "hikatakana"},
+  {0xff8b, "hikatakanahalfwidth"},
+  {0x05b4, "hiriq"},
+  {0x05b4, "hiriq14"},
+  {0x05b4, "hiriq21"},
+  {0x05b4, "hiriq2d"},
+  {0x05b4, "hiriqhebrew"},
+  {0x05b4, "hiriqnarrowhebrew"},
+  {0x05b4, "hiriqquarterhebrew"},
+  {0x05b4, "hiriqwidehebrew"},
+  {0x1e96, "hlinebelow"},
+  {0xff48, "hmonospace"},
+  {0x0570, "hoarmenian"},
+  {0x0e2b, "hohipthai"},
+  {0x307b, "hohiragana"},
+  {0x30db, "hokatakana"},
+  {0xff8e, "hokatakanahalfwidth"},
+  {0x05b9, "holam"},
+  {0x05b9, "holam19"},
+  {0x05b9, "holam26"},
+  {0x05b9, "holam32"},
+  {0x05b9, "holamhebrew"},
+  {0x05b9, "holamnarrowhebrew"},
+  {0x05b9, "holamquarterhebrew"},
+  {0x05b9, "holamwidehebrew"},
+  {0x0e2e, "honokhukthai"},
+  {0x0309, "hookabovecomb"},
+  {0x0309, "hookcmb"},
+  {0x0321, "hookpalatalizedbelowcmb"},
+  {0x0322, "hookretroflexbelowcmb"},
+  {0x3342, "hoonsquare"},
+  {0x03e9, "horicoptic"},
+  {0x2015, "horizontalbar"},
+  {0x031b, "horncmb"},
+  {0x2668, "hotsprings"},
+  {0x2302, "house"},
+  {0x24a3, "hparen"},
+  {0x02b0, "hsuperior"},
+  {0x0265, "hturned"},
+  {0x3075, "huhiragana"},
+  {0x3333, "huiitosquare"},
+  {0x30d5, "hukatakana"},
+  {0xff8c, "hukatakanahalfwidth"},
+  {0x02dd, "hungarumlaut"},
+  {0x030b, "hungarumlautcmb"},
+  {0x0195, "hv"},
+  {0x002d, "hyphen"},
+  {0xf6e5, "hypheninferior"},
+  {0xff0d, "hyphenmonospace"},
+  {0xfe63, "hyphensmall"},
+  {0xf6e6, "hyphensuperior"},
+  {0x2010, "hyphentwo"},
+  {0x0069, "i"},
+  {0x00ed, "iacute"},
+  {0x044f, "iacyrillic"},
+  {0x0987, "ibengali"},
+  {0x3127, "ibopomofo"},
+  {0x012d, "ibreve"},
+  {0x01d0, "icaron"},
+  {0x24d8, "icircle"},
+  {0x00ee, "icircumflex"},
+  {0x0456, "icyrillic"},
+  {0x0209, "idblgrave"},
+  {0x328f, "ideographearthcircle"},
+  {0x328b, "ideographfirecircle"},
+  {0x323f, "ideographicallianceparen"},
+  {0x323a, "ideographiccallparen"},
+  {0x32a5, "ideographiccentrecircle"},
+  {0x3006, "ideographicclose"},
+  {0x3001, "ideographiccomma"},
+  {0xff64, "ideographiccommaleft"},
+  {0x3237, "ideographiccongratulationparen"},
+  {0x32a3, "ideographiccorrectcircle"},
+  {0x322f, "ideographicearthparen"},
+  {0x323d, "ideographicenterpriseparen"},
+  {0x329d, "ideographicexcellentcircle"},
+  {0x3240, "ideographicfestivalparen"},
+  {0x3296, "ideographicfinancialcircle"},
+  {0x3236, "ideographicfinancialparen"},
+  {0x322b, "ideographicfireparen"},
+  {0x3232, "ideographichaveparen"},
+  {0x32a4, "ideographichighcircle"},
+  {0x3005, "ideographiciterationmark"},
+  {0x3298, "ideographiclaborcircle"},
+  {0x3238, "ideographiclaborparen"},
+  {0x32a7, "ideographicleftcircle"},
+  {0x32a6, "ideographiclowcircle"},
+  {0x32a9, "ideographicmedicinecircle"},
+  {0x322e, "ideographicmetalparen"},
+  {0x322a, "ideographicmoonparen"},
+  {0x3234, "ideographicnameparen"},
+  {0x3002, "ideographicperiod"},
+  {0x329e, "ideographicprintcircle"},
+  {0x3243, "ideographicreachparen"},
+  {0x3239, "ideographicrepresentparen"},
+  {0x323e, "ideographicresourceparen"},
+  {0x32a8, "ideographicrightcircle"},
+  {0x3299, "ideographicsecretcircle"},
+  {0x3242, "ideographicselfparen"},
+  {0x3233, "ideographicsocietyparen"},
+  {0x3000, "ideographicspace"},
+  {0x3235, "ideographicspecialparen"},
+  {0x3231, "ideographicstockparen"},
+  {0x323b, "ideographicstudyparen"},
+  {0x3230, "ideographicsunparen"},
+  {0x323c, "ideographicsuperviseparen"},
+  {0x322c, "ideographicwaterparen"},
+  {0x322d, "ideographicwoodparen"},
+  {0x3007, "ideographiczero"},
+  {0x328e, "ideographmetalcircle"},
+  {0x328a, "ideographmooncircle"},
+  {0x3294, "ideographnamecircle"},
+  {0x3290, "ideographsuncircle"},
+  {0x328c, "ideographwatercircle"},
+  {0x328d, "ideographwoodcircle"},
+  {0x0907, "ideva"},
+  {0x00ef, "idieresis"},
+  {0x1e2f, "idieresisacute"},
+  {0x04e5, "idieresiscyrillic"},
+  {0x1ecb, "idotbelow"},
+  {0x04d7, "iebrevecyrillic"},
+  {0x0435, "iecyrillic"},
+  {0x3275, "ieungacirclekorean"},
+  {0x3215, "ieungaparenkorean"},
+  {0x3267, "ieungcirclekorean"},
+  {0x3147, "ieungkorean"},
+  {0x3207, "ieungparenkorean"},
+  {0x00ec, "igrave"},
+  {0x0a87, "igujarati"},
+  {0x0a07, "igurmukhi"},
+  {0x3044, "ihiragana"},
+  {0x1ec9, "ihookabove"},
+  {0x0988, "iibengali"},
+  {0x0438, "iicyrillic"},
+  {0x0908, "iideva"},
+  {0x0a88, "iigujarati"},
+  {0x0a08, "iigurmukhi"},
+  {0x0a40, "iimatragurmukhi"},
+  {0x020b, "iinvertedbreve"},
+  {0x0439, "iishortcyrillic"},
+  {0x09c0, "iivowelsignbengali"},
+  {0x0940, "iivowelsigndeva"},
+  {0x0ac0, "iivowelsigngujarati"},
+  {0x0133, "ij"},
+  {0x30a4, "ikatakana"},
+  {0xff72, "ikatakanahalfwidth"},
+  {0x3163, "ikorean"},
+  {0x02dc, "ilde"},
+  {0x05ac, "iluyhebrew"},
+  {0x012b, "imacron"},
+  {0x04e3, "imacroncyrillic"},
+  {0x2253, "imageorapproximatelyequal"},
+  {0x0a3f, "imatragurmukhi"},
+  {0xff49, "imonospace"},
+  {0x2206, "increment"},
+  {0x221e, "infinity"},
+  {0x056b, "iniarmenian"},
+  {0x222b, "integral"},
+  {0x2321, "integralbottom"},
+  {0x2321, "integralbt"},
+  {0xf8f5, "integralex"},
+  {0x2320, "integraltop"},
+  {0x2320, "integraltp"},
+  {0x2229, "intersection"},
+  {0x3305, "intisquare"},
+  {0x25d8, "invbullet"},
+  {0x25d9, "invcircle"},
+  {0x263b, "invsmileface"},
+  {0x0451, "iocyrillic"},
+  {0x012f, "iogonek"},
+  {0x03b9, "iota"},
+  {0x03ca, "iotadieresis"},
+  {0x0390, "iotadieresistonos"},
+  {0x0269, "iotalatin"},
+  {0x03af, "iotatonos"},
+  {0x24a4, "iparen"},
+  {0x0a72, "irigurmukhi"},
+  {0x3043, "ismallhiragana"},
+  {0x30a3, "ismallkatakana"},
+  {0xff68, "ismallkatakanahalfwidth"},
+  {0x09fa, "issharbengali"},
+  {0x0268, "istroke"},
+  {0xf6ed, "isuperior"},
+  {0x309d, "iterationhiragana"},
+  {0x30fd, "iterationkatakana"},
+  {0x0129, "itilde"},
+  {0x1e2d, "itildebelow"},
+  {0x3129, "iubopomofo"},
+  {0x044e, "iucyrillic"},
+  {0x09bf, "ivowelsignbengali"},
+  {0x093f, "ivowelsigndeva"},
+  {0x0abf, "ivowelsigngujarati"},
+  {0x0475, "izhitsacyrillic"},
+  {0x0477, "izhitsadblgravecyrillic"},
+  {0x006a, "j"},
+  {0x0571, "jaarmenian"},
+  {0x099c, "jabengali"},
+  {0x091c, "jadeva"},
+  {0x0a9c, "jagujarati"},
+  {0x0a1c, "jagurmukhi"},
+  {0x3110, "jbopomofo"},
+  {0x01f0, "jcaron"},
+  {0x24d9, "jcircle"},
+  {0x0135, "jcircumflex"},
+  {0x029d, "jcrossedtail"},
+  {0x025f, "jdotlessstroke"},
+  {0x0458, "jecyrillic"},
+  {0x062c, "jeemarabic"},
+  {0xfe9e, "jeemfinalarabic"},
+  {0xfe9f, "jeeminitialarabic"},
+  {0xfea0, "jeemmedialarabic"},
+  {0x0698, "jeharabic"},
+  {0xfb8b, "jehfinalarabic"},
+  {0x099d, "jhabengali"},
+  {0x091d, "jhadeva"},
+  {0x0a9d, "jhagujarati"},
+  {0x0a1d, "jhagurmukhi"},
+  {0x057b, "jheharmenian"},
+  {0x3004, "jis"},
+  {0xff4a, "jmonospace"},
+  {0x24a5, "jparen"},
+  {0x02b2, "jsuperior"},
+  {0x006b, "k"},
+  {0x04a1, "kabashkircyrillic"},
+  {0x0995, "kabengali"},
+  {0x1e31, "kacute"},
+  {0x043a, "kacyrillic"},
+  {0x049b, "kadescendercyrillic"},
+  {0x0915, "kadeva"},
+  {0x05db, "kaf"},
+  {0x0643, "kafarabic"},
+  {0xfb3b, "kafdagesh"},
+  {0xfb3b, "kafdageshhebrew"},
+  {0xfeda, "kaffinalarabic"},
+  {0x05db, "kafhebrew"},
+  {0xfedb, "kafinitialarabic"},
+  {0xfedc, "kafmedialarabic"},
+  {0xfb4d, "kafrafehebrew"},
+  {0x0a95, "kagujarati"},
+  {0x0a15, "kagurmukhi"},
+  {0x304b, "kahiragana"},
+  {0x04c4, "kahookcyrillic"},
+  {0x30ab, "kakatakana"},
+  {0xff76, "kakatakanahalfwidth"},
+  {0x03ba, "kappa"},
+  {0x03f0, "kappasymbolgreek"},
+  {0x3171, "kapyeounmieumkorean"},
+  {0x3184, "kapyeounphieuphkorean"},
+  {0x3178, "kapyeounpieupkorean"},
+  {0x3179, "kapyeounssangpieupkorean"},
+  {0x330d, "karoriisquare"},
+  {0x0640, "kashidaautoarabic"},
+  {0x0640, "kashidaautonosidebearingarabic"},
+  {0x30f5, "kasmallkatakana"},
+  {0x3384, "kasquare"},
+  {0x0650, "kasraarabic"},
+  {0x064d, "kasratanarabic"},
+  {0x049f, "kastrokecyrillic"},
+  {0xff70, "katahiraprolongmarkhalfwidth"},
+  {0x049d, "kaverticalstrokecyrillic"},
+  {0x310e, "kbopomofo"},
+  {0x3389, "kcalsquare"},
+  {0x01e9, "kcaron"},
+  {0x0137, "kcedilla"},
+  {0x24da, "kcircle"},
+  {0x0137, "kcommaaccent"},
+  {0x1e33, "kdotbelow"},
+  {0x0584, "keharmenian"},
+  {0x3051, "kehiragana"},
+  {0x30b1, "kekatakana"},
+  {0xff79, "kekatakanahalfwidth"},
+  {0x056f, "kenarmenian"},
+  {0x30f6, "kesmallkatakana"},
+  {0x0138, "kgreenlandic"},
+  {0x0996, "khabengali"},
+  {0x0445, "khacyrillic"},
+  {0x0916, "khadeva"},
+  {0x0a96, "khagujarati"},
+  {0x0a16, "khagurmukhi"},
+  {0x062e, "khaharabic"},
+  {0xfea6, "khahfinalarabic"},
+  {0xfea7, "khahinitialarabic"},
+  {0xfea8, "khahmedialarabic"},
+  {0x03e7, "kheicoptic"},
+  {0x0959, "khhadeva"},
+  {0x0a59, "khhagurmukhi"},
+  {0x3278, "khieukhacirclekorean"},
+  {0x3218, "khieukhaparenkorean"},
+  {0x326a, "khieukhcirclekorean"},
+  {0x314b, "khieukhkorean"},
+  {0x320a, "khieukhparenkorean"},
+  {0x0e02, "khokhaithai"},
+  {0x0e05, "khokhonthai"},
+  {0x0e03, "khokhuatthai"},
+  {0x0e04, "khokhwaithai"},
+  {0x0e5b, "khomutthai"},
+  {0x0199, "khook"},
+  {0x0e06, "khorakhangthai"},
+  {0x3391, "khzsquare"},
+  {0x304d, "kihiragana"},
+  {0x30ad, "kikatakana"},
+  {0xff77, "kikatakanahalfwidth"},
+  {0x3315, "kiroguramusquare"},
+  {0x3316, "kiromeetorusquare"},
+  {0x3314, "kirosquare"},
+  {0x326e, "kiyeokacirclekorean"},
+  {0x320e, "kiyeokaparenkorean"},
+  {0x3260, "kiyeokcirclekorean"},
+  {0x3131, "kiyeokkorean"},
+  {0x3200, "kiyeokparenkorean"},
+  {0x3133, "kiyeoksioskorean"},
+  {0x045c, "kjecyrillic"},
+  {0x1e35, "klinebelow"},
+  {0x3398, "klsquare"},
+  {0x33a6, "kmcubedsquare"},
+  {0xff4b, "kmonospace"},
+  {0x33a2, "kmsquaredsquare"},
+  {0x3053, "kohiragana"},
+  {0x33c0, "kohmsquare"},
+  {0x0e01, "kokaithai"},
+  {0x30b3, "kokatakana"},
+  {0xff7a, "kokatakanahalfwidth"},
+  {0x331e, "kooposquare"},
+  {0x0481, "koppacyrillic"},
+  {0x327f, "koreanstandardsymbol"},
+  {0x0343, "koroniscmb"},
+  {0x24a6, "kparen"},
+  {0x33aa, "kpasquare"},
+  {0x046f, "ksicyrillic"},
+  {0x33cf, "ktsquare"},
+  {0x029e, "kturned"},
+  {0x304f, "kuhiragana"},
+  {0x30af, "kukatakana"},
+  {0xff78, "kukatakanahalfwidth"},
+  {0x33b8, "kvsquare"},
+  {0x33be, "kwsquare"},
+  {0x006c, "l"},
+  {0x09b2, "labengali"},
+  {0x013a, "lacute"},
+  {0x0932, "ladeva"},
+  {0x0ab2, "lagujarati"},
+  {0x0a32, "lagurmukhi"},
+  {0x0e45, "lakkhangyaothai"},
+  {0xfefc, "lamaleffinalarabic"},
+  {0xfef8, "lamalefhamzaabovefinalarabic"},
+  {0xfef7, "lamalefhamzaaboveisolatedarabic"},
+  {0xfefa, "lamalefhamzabelowfinalarabic"},
+  {0xfef9, "lamalefhamzabelowisolatedarabic"},
+  {0xfefb, "lamalefisolatedarabic"},
+  {0xfef6, "lamalefmaddaabovefinalarabic"},
+  {0xfef5, "lamalefmaddaaboveisolatedarabic"},
+  {0x0644, "lamarabic"},
+  {0x03bb, "lambda"},
+  {0x019b, "lambdastroke"},
+  {0x05dc, "lamed"},
+  {0xfb3c, "lameddagesh"},
+  {0xfb3c, "lameddageshhebrew"},
+  {0x05dc, "lamedhebrew"},
+  {0xfede, "lamfinalarabic"},
+  {0xfcca, "lamhahinitialarabic"},
+  {0xfedf, "laminitialarabic"},
+  {0xfcc9, "lamjeeminitialarabic"},
+  {0xfccb, "lamkhahinitialarabic"},
+  {0xfdf2, "lamlamhehisolatedarabic"},
+  {0xfee0, "lammedialarabic"},
+  {0xfd88, "lammeemhahinitialarabic"},
+  {0xfccc, "lammeeminitialarabic"},
+  {0x25ef, "largecircle"},
+  {0x019a, "lbar"},
+  {0x026c, "lbelt"},
+  {0x310c, "lbopomofo"},
+  {0x013e, "lcaron"},
+  {0x013c, "lcedilla"},
+  {0x24db, "lcircle"},
+  {0x1e3d, "lcircumflexbelow"},
+  {0x013c, "lcommaaccent"},
+  {0x0140, "ldot"},
+  {0x0140, "ldotaccent"},
+  {0x1e37, "ldotbelow"},
+  {0x1e39, "ldotbelowmacron"},
+  {0x031a, "leftangleabovecmb"},
+  {0x0318, "lefttackbelowcmb"},
+  {0x003c, "less"},
+  {0x2264, "lessequal"},
+  {0x22da, "lessequalorgreater"},
+  {0xff1c, "lessmonospace"},
+  {0x2272, "lessorequivalent"},
+  {0x2276, "lessorgreater"},
+  {0x2266, "lessoverequal"},
+  {0xfe64, "lesssmall"},
+  {0x026e, "lezh"},
+  {0x258c, "lfblock"},
+  {0x026d, "lhookretroflex"},
+  {0x20a4, "lira"},
+  {0x056c, "liwnarmenian"},
+  {0x01c9, "lj"},
+  {0x0459, "ljecyrillic"},
+  {0xf6c0, "ll"},
+  {0x0933, "lladeva"},
+  {0x0ab3, "llagujarati"},
+  {0x1e3b, "llinebelow"},
+  {0x0934, "llladeva"},
+  {0x09e1, "llvocalicbengali"},
+  {0x0961, "llvocalicdeva"},
+  {0x09e3, "llvocalicvowelsignbengali"},
+  {0x0963, "llvocalicvowelsigndeva"},
+  {0x026b, "lmiddletilde"},
+  {0xff4c, "lmonospace"},
+  {0x33d0, "lmsquare"},
+  {0x0e2c, "lochulathai"},
+  {0x2227, "logicaland"},
+  {0x00ac, "logicalnot"},
+  {0x2310, "logicalnotreversed"},
+  {0x2228, "logicalor"},
+  {0x0e25, "lolingthai"},
+  {0x017f, "longs"},
+  {0xfe4e, "lowlinecenterline"},
+  {0x0332, "lowlinecmb"},
+  {0xfe4d, "lowlinedashed"},
+  {0x25ca, "lozenge"},
+  {0x24a7, "lparen"},
+  {0x0142, "lslash"},
+  {0x2113, "lsquare"},
+  {0xf6ee, "lsuperior"},
+  {0x2591, "ltshade"},
+  {0x0e26, "luthai"},
+  {0x098c, "lvocalicbengali"},
+  {0x090c, "lvocalicdeva"},
+  {0x09e2, "lvocalicvowelsignbengali"},
+  {0x0962, "lvocalicvowelsigndeva"},
+  {0x33d3, "lxsquare"},
+  {0x006d, "m"},
+  {0x09ae, "mabengali"},
+  {0x00af, "macron"},
+  {0x0331, "macronbelowcmb"},
+  {0x0304, "macroncmb"},
+  {0x02cd, "macronlowmod"},
+  {0xffe3, "macronmonospace"},
+  {0x1e3f, "macute"},
+  {0x092e, "madeva"},
+  {0x0aae, "magujarati"},
+  {0x0a2e, "magurmukhi"},
+  {0x05a4, "mahapakhhebrew"},
+  {0x05a4, "mahapakhlefthebrew"},
+  {0x307e, "mahiragana"},
+  {0xf895, "maichattawalowleftthai"},
+  {0xf894, "maichattawalowrightthai"},
+  {0x0e4b, "maichattawathai"},
+  {0xf893, "maichattawaupperleftthai"},
+  {0xf88c, "maieklowleftthai"},
+  {0xf88b, "maieklowrightthai"},
+  {0x0e48, "maiekthai"},
+  {0xf88a, "maiekupperleftthai"},
+  {0xf884, "maihanakatleftthai"},
+  {0x0e31, "maihanakatthai"},
+  {0xf889, "maitaikhuleftthai"},
+  {0x0e47, "maitaikhuthai"},
+  {0xf88f, "maitholowleftthai"},
+  {0xf88e, "maitholowrightthai"},
+  {0x0e49, "maithothai"},
+  {0xf88d, "maithoupperleftthai"},
+  {0xf892, "maitrilowleftthai"},
+  {0xf891, "maitrilowrightthai"},
+  {0x0e4a, "maitrithai"},
+  {0xf890, "maitriupperleftthai"},
+  {0x0e46, "maiyamokthai"},
+  {0x30de, "makatakana"},
+  {0xff8f, "makatakanahalfwidth"},
+  {0x2642, "male"},
+  {0x3347, "mansyonsquare"},
+  {0x05be, "maqafhebrew"},
+  {0x2642, "mars"},
+  {0x05af, "masoracirclehebrew"},
+  {0x3383, "masquare"},
+  {0x3107, "mbopomofo"},
+  {0x33d4, "mbsquare"},
+  {0x24dc, "mcircle"},
+  {0x33a5, "mcubedsquare"},
+  {0x1e41, "mdotaccent"},
+  {0x1e43, "mdotbelow"},
+  {0x0645, "meemarabic"},
+  {0xfee2, "meemfinalarabic"},
+  {0xfee3, "meeminitialarabic"},
+  {0xfee4, "meemmedialarabic"},
+  {0xfcd1, "meemmeeminitialarabic"},
+  {0xfc48, "meemmeemisolatedarabic"},
+  {0x334d, "meetorusquare"},
+  {0x3081, "mehiragana"},
+  {0x337e, "meizierasquare"},
+  {0x30e1, "mekatakana"},
+  {0xff92, "mekatakanahalfwidth"},
+  {0x05de, "mem"},
+  {0xfb3e, "memdagesh"},
+  {0xfb3e, "memdageshhebrew"},
+  {0x05de, "memhebrew"},
+  {0x0574, "menarmenian"},
+  {0x05a5, "merkhahebrew"},
+  {0x05a6, "merkhakefulahebrew"},
+  {0x05a6, "merkhakefulalefthebrew"},
+  {0x05a5, "merkhalefthebrew"},
+  {0x0271, "mhook"},
+  {0x3392, "mhzsquare"},
+  {0xff65, "middledotkatakanahalfwidth"},
+  {0x00b7, "middot"},
+  {0x3272, "mieumacirclekorean"},
+  {0x3212, "mieumaparenkorean"},
+  {0x3264, "mieumcirclekorean"},
+  {0x3141, "mieumkorean"},
+  {0x3170, "mieumpansioskorean"},
+  {0x3204, "mieumparenkorean"},
+  {0x316e, "mieumpieupkorean"},
+  {0x316f, "mieumsioskorean"},
+  {0x307f, "mihiragana"},
+  {0x30df, "mikatakana"},
+  {0xff90, "mikatakanahalfwidth"},
+  {0x2212, "minus"},
+  {0x0320, "minusbelowcmb"},
+  {0x2296, "minuscircle"},
+  {0x02d7, "minusmod"},
+  {0x2213, "minusplus"},
+  {0x2032, "minute"},
+  {0x334a, "miribaarusquare"},
+  {0x3349, "mirisquare"},
+  {0x0270, "mlonglegturned"},
+  {0x3396, "mlsquare"},
+  {0x33a3, "mmcubedsquare"},
+  {0xff4d, "mmonospace"},
+  {0x339f, "mmsquaredsquare"},
+  {0x3082, "mohiragana"},
+  {0x33c1, "mohmsquare"},
+  {0x30e2, "mokatakana"},
+  {0xff93, "mokatakanahalfwidth"},
+  {0x33d6, "molsquare"},
+  {0x0e21, "momathai"},
+  {0x33a7, "moverssquare"},
+  {0x33a8, "moverssquaredsquare"},
+  {0x24a8, "mparen"},
+  {0x33ab, "mpasquare"},
+  {0x33b3, "mssquare"},
+  {0xf6ef, "msuperior"},
+  {0x026f, "mturned"},
+  {0x00b5, "mu"},
+  {0x00b5, "mu1"},
+  {0x3382, "muasquare"},
+  {0x226b, "muchgreater"},
+  {0x226a, "muchless"},
+  {0x338c, "mufsquare"},
+  {0x03bc, "mugreek"},
+  {0x338d, "mugsquare"},
+  {0x3080, "muhiragana"},
+  {0x30e0, "mukatakana"},
+  {0xff91, "mukatakanahalfwidth"},
+  {0x3395, "mulsquare"},
+  {0x00d7, "multiply"},
+  {0x339b, "mumsquare"},
+  {0x05a3, "munahhebrew"},
+  {0x05a3, "munahlefthebrew"},
+  {0x266a, "musicalnote"},
+  {0x266b, "musicalnotedbl"},
+  {0x266d, "musicflatsign"},
+  {0x266f, "musicsharpsign"},
+  {0x33b2, "mussquare"},
+  {0x33b6, "muvsquare"},
+  {0x33bc, "muwsquare"},
+  {0x33b9, "mvmegasquare"},
+  {0x33b7, "mvsquare"},
+  {0x33bf, "mwmegasquare"},
+  {0x33bd, "mwsquare"},
+  {0x006e, "n"},
+  {0x09a8, "nabengali"},
+  {0x2207, "nabla"},
+  {0x0144, "nacute"},
+  {0x0928, "nadeva"},
+  {0x0aa8, "nagujarati"},
+  {0x0a28, "nagurmukhi"},
+  {0x306a, "nahiragana"},
+  {0x30ca, "nakatakana"},
+  {0xff85, "nakatakanahalfwidth"},
+  {0x0149, "napostrophe"},
+  {0x3381, "nasquare"},
+  {0x310b, "nbopomofo"},
+  {0x00a0, "nbspace"},
+  {0x0148, "ncaron"},
+  {0x0146, "ncedilla"},
+  {0x24dd, "ncircle"},
+  {0x1e4b, "ncircumflexbelow"},
+  {0x0146, "ncommaaccent"},
+  {0x1e45, "ndotaccent"},
+  {0x1e47, "ndotbelow"},
+  {0x306d, "nehiragana"},
+  {0x30cd, "nekatakana"},
+  {0xff88, "nekatakanahalfwidth"},
+  {0x20aa, "newsheqelsign"},
+  {0x338b, "nfsquare"},
+  {0x0999, "ngabengali"},
+  {0x0919, "ngadeva"},
+  {0x0a99, "ngagujarati"},
+  {0x0a19, "ngagurmukhi"},
+  {0x0e07, "ngonguthai"},
+  {0x3093, "nhiragana"},
+  {0x0272, "nhookleft"},
+  {0x0273, "nhookretroflex"},
+  {0x326f, "nieunacirclekorean"},
+  {0x320f, "nieunaparenkorean"},
+  {0x3135, "nieuncieuckorean"},
+  {0x3261, "nieuncirclekorean"},
+  {0x3136, "nieunhieuhkorean"},
+  {0x3134, "nieunkorean"},
+  {0x3168, "nieunpansioskorean"},
+  {0x3201, "nieunparenkorean"},
+  {0x3167, "nieunsioskorean"},
+  {0x3166, "nieuntikeutkorean"},
+  {0x306b, "nihiragana"},
+  {0x30cb, "nikatakana"},
+  {0xff86, "nikatakanahalfwidth"},
+  {0xf899, "nikhahitleftthai"},
+  {0x0e4d, "nikhahitthai"},
+  {0x0039, "nine"},
+  {0x0669, "ninearabic"},
+  {0x09ef, "ninebengali"},
+  {0x2468, "ninecircle"},
+  {0x2792, "ninecircleinversesansserif"},
+  {0x096f, "ninedeva"},
+  {0x0aef, "ninegujarati"},
+  {0x0a6f, "ninegurmukhi"},
+  {0x0669, "ninehackarabic"},
+  {0x3029, "ninehangzhou"},
+  {0x3228, "nineideographicparen"},
+  {0x2089, "nineinferior"},
+  {0xff19, "ninemonospace"},
+  {0xf739, "nineoldstyle"},
+  {0x247c, "nineparen"},
+  {0x2490, "nineperiod"},
+  {0x06f9, "ninepersian"},
+  {0x2178, "nineroman"},
+  {0x2079, "ninesuperior"},
+  {0x2472, "nineteencircle"},
+  {0x2486, "nineteenparen"},
+  {0x249a, "nineteenperiod"},
+  {0x0e59, "ninethai"},
+  {0x01cc, "nj"},
+  {0x045a, "njecyrillic"},
+  {0x30f3, "nkatakana"},
+  {0xff9d, "nkatakanahalfwidth"},
+  {0x019e, "nlegrightlong"},
+  {0x1e49, "nlinebelow"},
+  {0xff4e, "nmonospace"},
+  {0x339a, "nmsquare"},
+  {0x09a3, "nnabengali"},
+  {0x0923, "nnadeva"},
+  {0x0aa3, "nnagujarati"},
+  {0x0a23, "nnagurmukhi"},
+  {0x0929, "nnnadeva"},
+  {0x306e, "nohiragana"},
+  {0x30ce, "nokatakana"},
+  {0xff89, "nokatakanahalfwidth"},
+  {0x00a0, "nonbreakingspace"},
+  {0x0e13, "nonenthai"},
+  {0x0e19, "nonuthai"},
+  {0x0646, "noonarabic"},
+  {0xfee6, "noonfinalarabic"},
+  {0x06ba, "noonghunnaarabic"},
+  {0xfb9f, "noonghunnafinalarabic"},
+  {0xfee7, "nooninitialarabic"},
+  {0xfcd2, "noonjeeminitialarabic"},
+  {0xfc4b, "noonjeemisolatedarabic"},
+  {0xfee8, "noonmedialarabic"},
+  {0xfcd5, "noonmeeminitialarabic"},
+  {0xfc4e, "noonmeemisolatedarabic"},
+  {0xfc8d, "noonnoonfinalarabic"},
+  {0x220c, "notcontains"},
+  {0x2209, "notelement"},
+  {0x2209, "notelementof"},
+  {0x2260, "notequal"},
+  {0x226f, "notgreater"},
+  {0x2271, "notgreaternorequal"},
+  {0x2279, "notgreaternorless"},
+  {0x2262, "notidentical"},
+  {0x226e, "notless"},
+  {0x2270, "notlessnorequal"},
+  {0x2226, "notparallel"},
+  {0x2280, "notprecedes"},
+  {0x2284, "notsubset"},
+  {0x2281, "notsucceeds"},
+  {0x2285, "notsuperset"},
+  {0x0576, "nowarmenian"},
+  {0x24a9, "nparen"},
+  {0x33b1, "nssquare"},
+  {0x207f, "nsuperior"},
+  {0x00f1, "ntilde"},
+  {0x03bd, "nu"},
+  {0x306c, "nuhiragana"},
+  {0x30cc, "nukatakana"},
+  {0xff87, "nukatakanahalfwidth"},
+  {0x09bc, "nuktabengali"},
+  {0x093c, "nuktadeva"},
+  {0x0abc, "nuktagujarati"},
+  {0x0a3c, "nuktagurmukhi"},
+  {0x0023, "numbersign"},
+  {0xff03, "numbersignmonospace"},
+  {0xfe5f, "numbersignsmall"},
+  {0x0374, "numeralsigngreek"},
+  {0x0375, "numeralsignlowergreek"},
+  {0x2116, "numero"},
+  {0x05e0, "nun"},
+  {0xfb40, "nundagesh"},
+  {0xfb40, "nundageshhebrew"},
+  {0x05e0, "nunhebrew"},
+  {0x33b5, "nvsquare"},
+  {0x33bb, "nwsquare"},
+  {0x099e, "nyabengali"},
+  {0x091e, "nyadeva"},
+  {0x0a9e, "nyagujarati"},
+  {0x0a1e, "nyagurmukhi"},
+  {0x006f, "o"},
+  {0x00f3, "oacute"},
+  {0x0e2d, "oangthai"},
+  {0x0275, "obarred"},
+  {0x04e9, "obarredcyrillic"},
+  {0x04eb, "obarreddieresiscyrillic"},
+  {0x0993, "obengali"},
+  {0x311b, "obopomofo"},
+  {0x014f, "obreve"},
+  {0x0911, "ocandradeva"},
+  {0x0a91, "ocandragujarati"},
+  {0x0949, "ocandravowelsigndeva"},
+  {0x0ac9, "ocandravowelsigngujarati"},
+  {0x01d2, "ocaron"},
+  {0x24de, "ocircle"},
+  {0x00f4, "ocircumflex"},
+  {0x1ed1, "ocircumflexacute"},
+  {0x1ed9, "ocircumflexdotbelow"},
+  {0x1ed3, "ocircumflexgrave"},
+  {0x1ed5, "ocircumflexhookabove"},
+  {0x1ed7, "ocircumflextilde"},
+  {0x043e, "ocyrillic"},
+  {0x0151, "odblacute"},
+  {0x020d, "odblgrave"},
+  {0x0913, "odeva"},
+  {0x00f6, "odieresis"},
+  {0x04e7, "odieresiscyrillic"},
+  {0x1ecd, "odotbelow"},
+  {0x0153, "oe"},
+  {0x315a, "oekorean"},
+  {0x02db, "ogonek"},
+  {0x0328, "ogonekcmb"},
+  {0x00f2, "ograve"},
+  {0x0a93, "ogujarati"},
+  {0x0585, "oharmenian"},
+  {0x304a, "ohiragana"},
+  {0x1ecf, "ohookabove"},
+  {0x01a1, "ohorn"},
+  {0x1edb, "ohornacute"},
+  {0x1ee3, "ohorndotbelow"},
+  {0x1edd, "ohorngrave"},
+  {0x1edf, "ohornhookabove"},
+  {0x1ee1, "ohorntilde"},
+  {0x0151, "ohungarumlaut"},
+  {0x01a3, "oi"},
+  {0x020f, "oinvertedbreve"},
+  {0x30aa, "okatakana"},
+  {0xff75, "okatakanahalfwidth"},
+  {0x3157, "okorean"},
+  {0x05ab, "olehebrew"},
+  {0x014d, "omacron"},
+  {0x1e53, "omacronacute"},
+  {0x1e51, "omacrongrave"},
+  {0x0950, "omdeva"},
+  {0x03c9, "omega"},
+  {0x03d6, "omega1"},
+  {0x0461, "omegacyrillic"},
+  {0x0277, "omegalatinclosed"},
+  {0x047b, "omegaroundcyrillic"},
+  {0x047d, "omegatitlocyrillic"},
+  {0x03ce, "omegatonos"},
+  {0x0ad0, "omgujarati"},
+  {0x03bf, "omicron"},
+  {0x03cc, "omicrontonos"},
+  {0xff4f, "omonospace"},
+  {0x0031, "one"},
+  {0x0661, "onearabic"},
+  {0x09e7, "onebengali"},
+  {0x2460, "onecircle"},
+  {0x278a, "onecircleinversesansserif"},
+  {0x0967, "onedeva"},
+  {0x2024, "onedotenleader"},
+  {0x215b, "oneeighth"},
+  {0xf6dc, "onefitted"},
+  {0x0ae7, "onegujarati"},
+  {0x0a67, "onegurmukhi"},
+  {0x0661, "onehackarabic"},
+  {0x00bd, "onehalf"},
+  {0x3021, "onehangzhou"},
+  {0x3220, "oneideographicparen"},
+  {0x2081, "oneinferior"},
+  {0xff11, "onemonospace"},
+  {0x09f4, "onenumeratorbengali"},
+  {0xf731, "oneoldstyle"},
+  {0x2474, "oneparen"},
+  {0x2488, "oneperiod"},
+  {0x06f1, "onepersian"},
+  {0x00bc, "onequarter"},
+  {0x2170, "oneroman"},
+  {0x00b9, "onesuperior"},
+  {0x0e51, "onethai"},
+  {0x2153, "onethird"},
+  {0x01eb, "oogonek"},
+  {0x01ed, "oogonekmacron"},
+  {0x0a13, "oogurmukhi"},
+  {0x0a4b, "oomatragurmukhi"},
+  {0x0254, "oopen"},
+  {0x24aa, "oparen"},
+  {0x25e6, "openbullet"},
+  {0x2325, "option"},
+  {0x00aa, "ordfeminine"},
+  {0x00ba, "ordmasculine"},
+  {0x221f, "orthogonal"},
+  {0x0912, "oshortdeva"},
+  {0x094a, "oshortvowelsigndeva"},
+  {0x00f8, "oslash"},
+  {0x01ff, "oslashacute"},
+  {0x3049, "osmallhiragana"},
+  {0x30a9, "osmallkatakana"},
+  {0xff6b, "osmallkatakanahalfwidth"},
+  {0x01ff, "ostrokeacute"},
+  {0xf6f0, "osuperior"},
+  {0x047f, "otcyrillic"},
+  {0x00f5, "otilde"},
+  {0x1e4d, "otildeacute"},
+  {0x1e4f, "otildedieresis"},
+  {0x3121, "oubopomofo"},
+  {0x203e, "overline"},
+  {0xfe4a, "overlinecenterline"},
+  {0x0305, "overlinecmb"},
+  {0xfe49, "overlinedashed"},
+  {0xfe4c, "overlinedblwavy"},
+  {0xfe4b, "overlinewavy"},
+  {0x00af, "overscore"},
+  {0x09cb, "ovowelsignbengali"},
+  {0x094b, "ovowelsigndeva"},
+  {0x0acb, "ovowelsigngujarati"},
+  {0x0070, "p"},
+  {0x3380, "paampssquare"},
+  {0x332b, "paasentosquare"},
+  {0x09aa, "pabengali"},
+  {0x1e55, "pacute"},
+  {0x092a, "padeva"},
+  {0x21df, "pagedown"},
+  {0x21de, "pageup"},
+  {0x0aaa, "pagujarati"},
+  {0x0a2a, "pagurmukhi"},
+  {0x3071, "pahiragana"},
+  {0x0e2f, "paiyannoithai"},
+  {0x30d1, "pakatakana"},
+  {0x0484, "palatalizationcyrilliccmb"},
+  {0x04c0, "palochkacyrillic"},
+  {0x317f, "pansioskorean"},
+  {0x00b6, "paragraph"},
+  {0x2225, "parallel"},
+  {0x0028, "parenleft"},
+  {0xfd3e, "parenleftaltonearabic"},
+  {0xf8ed, "parenleftbt"},
+  {0xf8ec, "parenleftex"},
+  {0x208d, "parenleftinferior"},
+  {0xff08, "parenleftmonospace"},
+  {0xfe59, "parenleftsmall"},
+  {0x207d, "parenleftsuperior"},
+  {0xf8eb, "parenlefttp"},
+  {0xfe35, "parenleftvertical"},
+  {0x0029, "parenright"},
+  {0xfd3f, "parenrightaltonearabic"},
+  {0xf8f8, "parenrightbt"},
+  {0xf8f7, "parenrightex"},
+  {0x208e, "parenrightinferior"},
+  {0xff09, "parenrightmonospace"},
+  {0xfe5a, "parenrightsmall"},
+  {0x207e, "parenrightsuperior"},
+  {0xf8f6, "parenrighttp"},
+  {0xfe36, "parenrightvertical"},
+  {0x2202, "partialdiff"},
+  {0x05c0, "paseqhebrew"},
+  {0x0599, "pashtahebrew"},
+  {0x33a9, "pasquare"},
+  {0x05b7, "patah"},
+  {0x05b7, "patah11"},
+  {0x05b7, "patah1d"},
+  {0x05b7, "patah2a"},
+  {0x05b7, "patahhebrew"},
+  {0x05b7, "patahnarrowhebrew"},
+  {0x05b7, "patahquarterhebrew"},
+  {0x05b7, "patahwidehebrew"},
+  {0x05a1, "pazerhebrew"},
+  {0x3106, "pbopomofo"},
+  {0x24df, "pcircle"},
+  {0x1e57, "pdotaccent"},
+  {0x05e4, "pe"},
+  {0x043f, "pecyrillic"},
+  {0xfb44, "pedagesh"},
+  {0xfb44, "pedageshhebrew"},
+  {0x333b, "peezisquare"},
+  {0xfb43, "pefinaldageshhebrew"},
+  {0x067e, "peharabic"},
+  {0x057a, "peharmenian"},
+  {0x05e4, "pehebrew"},
+  {0xfb57, "pehfinalarabic"},
+  {0xfb58, "pehinitialarabic"},
+  {0x307a, "pehiragana"},
+  {0xfb59, "pehmedialarabic"},
+  {0x30da, "pekatakana"},
+  {0x04a7, "pemiddlehookcyrillic"},
+  {0xfb4e, "perafehebrew"},
+  {0x0025, "percent"},
+  {0x066a, "percentarabic"},
+  {0xff05, "percentmonospace"},
+  {0xfe6a, "percentsmall"},
+  {0x002e, "period"},
+  {0x0589, "periodarmenian"},
+  {0x00b7, "periodcentered"},
+  {0xff61, "periodhalfwidth"},
+  {0xf6e7, "periodinferior"},
+  {0xff0e, "periodmonospace"},
+  {0xfe52, "periodsmall"},
+  {0xf6e8, "periodsuperior"},
+  {0x0342, "perispomenigreekcmb"},
+  {0x22a5, "perpendicular"},
+  {0x2030, "perthousand"},
+  {0x20a7, "peseta"},
+  {0x338a, "pfsquare"},
+  {0x09ab, "phabengali"},
+  {0x092b, "phadeva"},
+  {0x0aab, "phagujarati"},
+  {0x0a2b, "phagurmukhi"},
+  {0x03c6, "phi"},
+  {0x03d5, "phi1"},
+  {0x327a, "phieuphacirclekorean"},
+  {0x321a, "phieuphaparenkorean"},
+  {0x326c, "phieuphcirclekorean"},
+  {0x314d, "phieuphkorean"},
+  {0x320c, "phieuphparenkorean"},
+  {0x0278, "philatin"},
+  {0x0e3a, "phinthuthai"},
+  {0x03d5, "phisymbolgreek"},
+  {0x01a5, "phook"},
+  {0x0e1e, "phophanthai"},
+  {0x0e1c, "phophungthai"},
+  {0x0e20, "phosamphaothai"},
+  {0x03c0, "pi"},
+  {0x3273, "pieupacirclekorean"},
+  {0x3213, "pieupaparenkorean"},
+  {0x3176, "pieupcieuckorean"},
+  {0x3265, "pieupcirclekorean"},
+  {0x3172, "pieupkiyeokkorean"},
+  {0x3142, "pieupkorean"},
+  {0x3205, "pieupparenkorean"},
+  {0x3174, "pieupsioskiyeokkorean"},
+  {0x3144, "pieupsioskorean"},
+  {0x3175, "pieupsiostikeutkorean"},
+  {0x3177, "pieupthieuthkorean"},
+  {0x3173, "pieuptikeutkorean"},
+  {0x3074, "pihiragana"},
+  {0x30d4, "pikatakana"},
+  {0x03d6, "pisymbolgreek"},
+  {0x0583, "piwrarmenian"},
+  {0x002b, "plus"},
+  {0x031f, "plusbelowcmb"},
+  {0x2295, "pluscircle"},
+  {0x00b1, "plusminus"},
+  {0x02d6, "plusmod"},
+  {0xff0b, "plusmonospace"},
+  {0xfe62, "plussmall"},
+  {0x207a, "plussuperior"},
+  {0xff50, "pmonospace"},
+  {0x33d8, "pmsquare"},
+  {0x307d, "pohiragana"},
+  {0x261f, "pointingindexdownwhite"},
+  {0x261c, "pointingindexleftwhite"},
+  {0x261e, "pointingindexrightwhite"},
+  {0x261d, "pointingindexupwhite"},
+  {0x30dd, "pokatakana"},
+  {0x0e1b, "poplathai"},
+  {0x3012, "postalmark"},
+  {0x3020, "postalmarkface"},
+  {0x24ab, "pparen"},
+  {0x227a, "precedes"},
+  {0x211e, "prescription"},
+  {0x02b9, "primemod"},
+  {0x2035, "primereversed"},
+  {0x220f, "product"},
+  {0x2305, "projective"},
+  {0x30fc, "prolongedkana"},
+  {0x2318, "propellor"},
+  {0x2282, "propersubset"},
+  {0x2283, "propersuperset"},
+  {0x2237, "proportion"},
+  {0x221d, "proportional"},
+  {0x03c8, "psi"},
+  {0x0471, "psicyrillic"},
+  {0x0486, "psilipneumatacyrilliccmb"},
+  {0x33b0, "pssquare"},
+  {0x3077, "puhiragana"},
+  {0x30d7, "pukatakana"},
+  {0x33b4, "pvsquare"},
+  {0x33ba, "pwsquare"},
+  {0x0071, "q"},
+  {0x0958, "qadeva"},
+  {0x05a8, "qadmahebrew"},
+  {0x0642, "qafarabic"},
+  {0xfed6, "qaffinalarabic"},
+  {0xfed7, "qafinitialarabic"},
+  {0xfed8, "qafmedialarabic"},
+  {0x05b8, "qamats"},
+  {0x05b8, "qamats10"},
+  {0x05b8, "qamats1a"},
+  {0x05b8, "qamats1c"},
+  {0x05b8, "qamats27"},
+  {0x05b8, "qamats29"},
+  {0x05b8, "qamats33"},
+  {0x05b8, "qamatsde"},
+  {0x05b8, "qamatshebrew"},
+  {0x05b8, "qamatsnarrowhebrew"},
+  {0x05b8, "qamatsqatanhebrew"},
+  {0x05b8, "qamatsqatannarrowhebrew"},
+  {0x05b8, "qamatsqatanquarterhebrew"},
+  {0x05b8, "qamatsqatanwidehebrew"},
+  {0x05b8, "qamatsquarterhebrew"},
+  {0x05b8, "qamatswidehebrew"},
+  {0x059f, "qarneyparahebrew"},
+  {0x3111, "qbopomofo"},
+  {0x24e0, "qcircle"},
+  {0x02a0, "qhook"},
+  {0xff51, "qmonospace"},
+  {0x05e7, "qof"},
+  {0xfb47, "qofdagesh"},
+  {0xfb47, "qofdageshhebrew"},
+  {0x05e7, "qofhebrew"},
+  {0x24ac, "qparen"},
+  {0x2669, "quarternote"},
+  {0x05bb, "qubuts"},
+  {0x05bb, "qubuts18"},
+  {0x05bb, "qubuts25"},
+  {0x05bb, "qubuts31"},
+  {0x05bb, "qubutshebrew"},
+  {0x05bb, "qubutsnarrowhebrew"},
+  {0x05bb, "qubutsquarterhebrew"},
+  {0x05bb, "qubutswidehebrew"},
+  {0x003f, "question"},
+  {0x061f, "questionarabic"},
+  {0x055e, "questionarmenian"},
+  {0x00bf, "questiondown"},
+  {0xf7bf, "questiondownsmall"},
+  {0x037e, "questiongreek"},
+  {0xff1f, "questionmonospace"},
+  {0xf73f, "questionsmall"},
+  {0x0022, "quotedbl"},
+  {0x201e, "quotedblbase"},
+  {0x201c, "quotedblleft"},
+  {0xff02, "quotedblmonospace"},
+  {0x301e, "quotedblprime"},
+  {0x301d, "quotedblprimereversed"},
+  {0x201d, "quotedblright"},
+  {0x2018, "quoteleft"},
+  {0x201b, "quoteleftreversed"},
+  {0x201b, "quotereversed"},
+  {0x2019, "quoteright"},
+  {0x0149, "quoterightn"},
+  {0x201a, "quotesinglbase"},
+  {0x0027, "quotesingle"},
+  {0xff07, "quotesinglemonospace"},
+  {0x0072, "r"},
+  {0x057c, "raarmenian"},
+  {0x09b0, "rabengali"},
+  {0x0155, "racute"},
+  {0x0930, "radeva"},
+  {0x221a, "radical"},
+  {0xf8e5, "radicalex"},
+  {0x33ae, "radoverssquare"},
+  {0x33af, "radoverssquaredsquare"},
+  {0x33ad, "radsquare"},
+  {0x05bf, "rafe"},
+  {0x05bf, "rafehebrew"},
+  {0x0ab0, "ragujarati"},
+  {0x0a30, "ragurmukhi"},
+  {0x3089, "rahiragana"},
+  {0x30e9, "rakatakana"},
+  {0xff97, "rakatakanahalfwidth"},
+  {0x09f1, "ralowerdiagonalbengali"},
+  {0x09f0, "ramiddlediagonalbengali"},
+  {0x0264, "ramshorn"},
+  {0x2236, "ratio"},
+  {0x3116, "rbopomofo"},
+  {0x0159, "rcaron"},
+  {0x0157, "rcedilla"},
+  {0x24e1, "rcircle"},
+  {0x0157, "rcommaaccent"},
+  {0x0211, "rdblgrave"},
+  {0x1e59, "rdotaccent"},
+  {0x1e5b, "rdotbelow"},
+  {0x1e5d, "rdotbelowmacron"},
+  {0x203b, "referencemark"},
+  {0x2286, "reflexsubset"},
+  {0x2287, "reflexsuperset"},
+  {0x00ae, "registered"},
+  {0xf8e8, "registersans"},
+  {0xf6da, "registerserif"},
+  {0x0631, "reharabic"},
+  {0x0580, "reharmenian"},
+  {0xfeae, "rehfinalarabic"},
+  {0x308c, "rehiragana"},
+  {0x30ec, "rekatakana"},
+  {0xff9a, "rekatakanahalfwidth"},
+  {0x05e8, "resh"},
+  {0xfb48, "reshdageshhebrew"},
+  {0x05e8, "reshhebrew"},
+  {0x223d, "reversedtilde"},
+  {0x0597, "reviahebrew"},
+  {0x0597, "reviamugrashhebrew"},
+  {0x2310, "revlogicalnot"},
+  {0x027e, "rfishhook"},
+  {0x027f, "rfishhookreversed"},
+  {0x09dd, "rhabengali"},
+  {0x095d, "rhadeva"},
+  {0x03c1, "rho"},
+  {0x027d, "rhook"},
+  {0x027b, "rhookturned"},
+  {0x02b5, "rhookturnedsuperior"},
+  {0x03f1, "rhosymbolgreek"},
+  {0x02de, "rhotichookmod"},
+  {0x3271, "rieulacirclekorean"},
+  {0x3211, "rieulaparenkorean"},
+  {0x3263, "rieulcirclekorean"},
+  {0x3140, "rieulhieuhkorean"},
+  {0x313a, "rieulkiyeokkorean"},
+  {0x3169, "rieulkiyeoksioskorean"},
+  {0x3139, "rieulkorean"},
+  {0x313b, "rieulmieumkorean"},
+  {0x316c, "rieulpansioskorean"},
+  {0x3203, "rieulparenkorean"},
+  {0x313f, "rieulphieuphkorean"},
+  {0x313c, "rieulpieupkorean"},
+  {0x316b, "rieulpieupsioskorean"},
+  {0x313d, "rieulsioskorean"},
+  {0x313e, "rieulthieuthkorean"},
+  {0x316a, "rieultikeutkorean"},
+  {0x316d, "rieulyeorinhieuhkorean"},
+  {0x221f, "rightangle"},
+  {0x0319, "righttackbelowcmb"},
+  {0x22bf, "righttriangle"},
+  {0x308a, "rihiragana"},
+  {0x30ea, "rikatakana"},
+  {0xff98, "rikatakanahalfwidth"},
+  {0x02da, "ring"},
+  {0x0325, "ringbelowcmb"},
+  {0x030a, "ringcmb"},
+  {0x02bf, "ringhalfleft"},
+  {0x0559, "ringhalfleftarmenian"},
+  {0x031c, "ringhalfleftbelowcmb"},
+  {0x02d3, "ringhalfleftcentered"},
+  {0x02be, "ringhalfright"},
+  {0x0339, "ringhalfrightbelowcmb"},
+  {0x02d2, "ringhalfrightcentered"},
+  {0x0213, "rinvertedbreve"},
+  {0x3351, "rittorusquare"},
+  {0x1e5f, "rlinebelow"},
+  {0x027c, "rlongleg"},
+  {0x027a, "rlonglegturned"},
+  {0xff52, "rmonospace"},
+  {0x308d, "rohiragana"},
+  {0x30ed, "rokatakana"},
+  {0xff9b, "rokatakanahalfwidth"},
+  {0x0e23, "roruathai"},
+  {0x24ad, "rparen"},
+  {0x09dc, "rrabengali"},
+  {0x0931, "rradeva"},
+  {0x0a5c, "rragurmukhi"},
+  {0x0691, "rreharabic"},
+  {0xfb8d, "rrehfinalarabic"},
+  {0x09e0, "rrvocalicbengali"},
+  {0x0960, "rrvocalicdeva"},
+  {0x0ae0, "rrvocalicgujarati"},
+  {0x09c4, "rrvocalicvowelsignbengali"},
+  {0x0944, "rrvocalicvowelsigndeva"},
+  {0x0ac4, "rrvocalicvowelsigngujarati"},
+  {0xf6f1, "rsuperior"},
+  {0x2590, "rtblock"},
+  {0x0279, "rturned"},
+  {0x02b4, "rturnedsuperior"},
+  {0x308b, "ruhiragana"},
+  {0x30eb, "rukatakana"},
+  {0xff99, "rukatakanahalfwidth"},
+  {0x09f2, "rupeemarkbengali"},
+  {0x09f3, "rupeesignbengali"},
+  {0xf6dd, "rupiah"},
+  {0x0e24, "ruthai"},
+  {0x098b, "rvocalicbengali"},
+  {0x090b, "rvocalicdeva"},
+  {0x0a8b, "rvocalicgujarati"},
+  {0x09c3, "rvocalicvowelsignbengali"},
+  {0x0943, "rvocalicvowelsigndeva"},
+  {0x0ac3, "rvocalicvowelsigngujarati"},
+  {0x0073, "s"},
+  {0x09b8, "sabengali"},
+  {0x015b, "sacute"},
+  {0x1e65, "sacutedotaccent"},
+  {0x0635, "sadarabic"},
+  {0x0938, "sadeva"},
+  {0xfeba, "sadfinalarabic"},
+  {0xfebb, "sadinitialarabic"},
+  {0xfebc, "sadmedialarabic"},
+  {0x0ab8, "sagujarati"},
+  {0x0a38, "sagurmukhi"},
+  {0x3055, "sahiragana"},
+  {0x30b5, "sakatakana"},
+  {0xff7b, "sakatakanahalfwidth"},
+  {0xfdfa, "sallallahoualayhewasallamarabic"},
+  {0x05e1, "samekh"},
+  {0xfb41, "samekhdagesh"},
+  {0xfb41, "samekhdageshhebrew"},
+  {0x05e1, "samekhhebrew"},
+  {0x0e32, "saraaathai"},
+  {0x0e41, "saraaethai"},
+  {0x0e44, "saraaimaimalaithai"},
+  {0x0e43, "saraaimaimuanthai"},
+  {0x0e33, "saraamthai"},
+  {0x0e30, "saraathai"},
+  {0x0e40, "saraethai"},
+  {0xf886, "saraiileftthai"},
+  {0x0e35, "saraiithai"},
+  {0xf885, "saraileftthai"},
+  {0x0e34, "saraithai"},
+  {0x0e42, "saraothai"},
+  {0xf888, "saraueeleftthai"},
+  {0x0e37, "saraueethai"},
+  {0xf887, "saraueleftthai"},
+  {0x0e36, "sarauethai"},
+  {0x0e38, "sarauthai"},
+  {0x0e39, "sarauuthai"},
+  {0x3119, "sbopomofo"},
+  {0x0161, "scaron"},
+  {0x1e67, "scarondotaccent"},
+  {0x015f, "scedilla"},
+  {0x0259, "schwa"},
+  {0x04d9, "schwacyrillic"},
+  {0x04db, "schwadieresiscyrillic"},
+  {0x025a, "schwahook"},
+  {0x24e2, "scircle"},
+  {0x015d, "scircumflex"},
+  {0x0219, "scommaaccent"},
+  {0x1e61, "sdotaccent"},
+  {0x1e63, "sdotbelow"},
+  {0x1e69, "sdotbelowdotaccent"},
+  {0x033c, "seagullbelowcmb"},
+  {0x2033, "second"},
+  {0x02ca, "secondtonechinese"},
+  {0x00a7, "section"},
+  {0x0633, "seenarabic"},
+  {0xfeb2, "seenfinalarabic"},
+  {0xfeb3, "seeninitialarabic"},
+  {0xfeb4, "seenmedialarabic"},
+  {0x05b6, "segol"},
+  {0x05b6, "segol13"},
+  {0x05b6, "segol1f"},
+  {0x05b6, "segol2c"},
+  {0x05b6, "segolhebrew"},
+  {0x05b6, "segolnarrowhebrew"},
+  {0x05b6, "segolquarterhebrew"},
+  {0x0592, "segoltahebrew"},
+  {0x05b6, "segolwidehebrew"},
+  {0x057d, "seharmenian"},
+  {0x305b, "sehiragana"},
+  {0x30bb, "sekatakana"},
+  {0xff7e, "sekatakanahalfwidth"},
+  {0x003b, "semicolon"},
+  {0x061b, "semicolonarabic"},
+  {0xff1b, "semicolonmonospace"},
+  {0xfe54, "semicolonsmall"},
+  {0x309c, "semivoicedmarkkana"},
+  {0xff9f, "semivoicedmarkkanahalfwidth"},
+  {0x3322, "sentisquare"},
+  {0x3323, "sentosquare"},
+  {0x0037, "seven"},
+  {0x0667, "sevenarabic"},
+  {0x09ed, "sevenbengali"},
+  {0x2466, "sevencircle"},
+  {0x2790, "sevencircleinversesansserif"},
+  {0x096d, "sevendeva"},
+  {0x215e, "seveneighths"},
+  {0x0aed, "sevengujarati"},
+  {0x0a6d, "sevengurmukhi"},
+  {0x0667, "sevenhackarabic"},
+  {0x3027, "sevenhangzhou"},
+  {0x3226, "sevenideographicparen"},
+  {0x2087, "seveninferior"},
+  {0xff17, "sevenmonospace"},
+  {0xf737, "sevenoldstyle"},
+  {0x247a, "sevenparen"},
+  {0x248e, "sevenperiod"},
+  {0x06f7, "sevenpersian"},
+  {0x2176, "sevenroman"},
+  {0x2077, "sevensuperior"},
+  {0x2470, "seventeencircle"},
+  {0x2484, "seventeenparen"},
+  {0x2498, "seventeenperiod"},
+  {0x0e57, "seventhai"},
+  {0x00ad, "sfthyphen"},
+  {0x0577, "shaarmenian"},
+  {0x09b6, "shabengali"},
+  {0x0448, "shacyrillic"},
+  {0x0651, "shaddaarabic"},
+  {0xfc61, "shaddadammaarabic"},
+  {0xfc5e, "shaddadammatanarabic"},
+  {0xfc60, "shaddafathaarabic"},
+  {0xfc62, "shaddakasraarabic"},
+  {0xfc5f, "shaddakasratanarabic"},
+  {0x2592, "shade"},
+  {0x2593, "shadedark"},
+  {0x2591, "shadelight"},
+  {0x2592, "shademedium"},
+  {0x0936, "shadeva"},
+  {0x0ab6, "shagujarati"},
+  {0x0a36, "shagurmukhi"},
+  {0x0593, "shalshelethebrew"},
+  {0x3115, "shbopomofo"},
+  {0x0449, "shchacyrillic"},
+  {0x0634, "sheenarabic"},
+  {0xfeb6, "sheenfinalarabic"},
+  {0xfeb7, "sheeninitialarabic"},
+  {0xfeb8, "sheenmedialarabic"},
+  {0x03e3, "sheicoptic"},
+  {0x20aa, "sheqel"},
+  {0x20aa, "sheqelhebrew"},
+  {0x05b0, "sheva"},
+  {0x05b0, "sheva115"},
+  {0x05b0, "sheva15"},
+  {0x05b0, "sheva22"},
+  {0x05b0, "sheva2e"},
+  {0x05b0, "shevahebrew"},
+  {0x05b0, "shevanarrowhebrew"},
+  {0x05b0, "shevaquarterhebrew"},
+  {0x05b0, "shevawidehebrew"},
+  {0x04bb, "shhacyrillic"},
+  {0x03ed, "shimacoptic"},
+  {0x05e9, "shin"},
+  {0xfb49, "shindagesh"},
+  {0xfb49, "shindageshhebrew"},
+  {0xfb2c, "shindageshshindot"},
+  {0xfb2c, "shindageshshindothebrew"},
+  {0xfb2d, "shindageshsindot"},
+  {0xfb2d, "shindageshsindothebrew"},
+  {0x05c1, "shindothebrew"},
+  {0x05e9, "shinhebrew"},
+  {0xfb2a, "shinshindot"},
+  {0xfb2a, "shinshindothebrew"},
+  {0xfb2b, "shinsindot"},
+  {0xfb2b, "shinsindothebrew"},
+  {0x0282, "shook"},
+  {0x03c3, "sigma"},
+  {0x03c2, "sigma1"},
+  {0x03c2, "sigmafinal"},
+  {0x03f2, "sigmalunatesymbolgreek"},
+  {0x3057, "sihiragana"},
+  {0x30b7, "sikatakana"},
+  {0xff7c, "sikatakanahalfwidth"},
+  {0x05bd, "siluqhebrew"},
+  {0x05bd, "siluqlefthebrew"},
+  {0x223c, "similar"},
+  {0x05c2, "sindothebrew"},
+  {0x3274, "siosacirclekorean"},
+  {0x3214, "siosaparenkorean"},
+  {0x317e, "sioscieuckorean"},
+  {0x3266, "sioscirclekorean"},
+  {0x317a, "sioskiyeokkorean"},
+  {0x3145, "sioskorean"},
+  {0x317b, "siosnieunkorean"},
+  {0x3206, "siosparenkorean"},
+  {0x317d, "siospieupkorean"},
+  {0x317c, "siostikeutkorean"},
+  {0x0036, "six"},
+  {0x0666, "sixarabic"},
+  {0x09ec, "sixbengali"},
+  {0x2465, "sixcircle"},
+  {0x278f, "sixcircleinversesansserif"},
+  {0x096c, "sixdeva"},
+  {0x0aec, "sixgujarati"},
+  {0x0a6c, "sixgurmukhi"},
+  {0x0666, "sixhackarabic"},
+  {0x3026, "sixhangzhou"},
+  {0x3225, "sixideographicparen"},
+  {0x2086, "sixinferior"},
+  {0xff16, "sixmonospace"},
+  {0xf736, "sixoldstyle"},
+  {0x2479, "sixparen"},
+  {0x248d, "sixperiod"},
+  {0x06f6, "sixpersian"},
+  {0x2175, "sixroman"},
+  {0x2076, "sixsuperior"},
+  {0x246f, "sixteencircle"},
+  {0x09f9, "sixteencurrencydenominatorbengali"},
+  {0x2483, "sixteenparen"},
+  {0x2497, "sixteenperiod"},
+  {0x0e56, "sixthai"},
+  {0x002f, "slash"},
+  {0xff0f, "slashmonospace"},
+  {0x017f, "slong"},
+  {0x1e9b, "slongdotaccent"},
+  {0x263a, "smileface"},
+  {0xff53, "smonospace"},
+  {0x05c3, "sofpasuqhebrew"},
+  {0x00ad, "softhyphen"},
+  {0x044c, "softsigncyrillic"},
+  {0x305d, "sohiragana"},
+  {0x30bd, "sokatakana"},
+  {0xff7f, "sokatakanahalfwidth"},
+  {0x0338, "soliduslongoverlaycmb"},
+  {0x0337, "solidusshortoverlaycmb"},
+  {0x0e29, "sorusithai"},
+  {0x0e28, "sosalathai"},
+  {0x0e0b, "sosothai"},
+  {0x0e2a, "sosuathai"},
+  {0x0020, "space"},
+  {0x0020, "spacehackarabic"},
+  {0x2660, "spade"},
+  {0x2660, "spadesuitblack"},
+  {0x2664, "spadesuitwhite"},
+  {0x24ae, "sparen"},
+  {0x033b, "squarebelowcmb"},
+  {0x33c4, "squarecc"},
+  {0x339d, "squarecm"},
+  {0x25a9, "squarediagonalcrosshatchfill"},
+  {0x25a4, "squarehorizontalfill"},
+  {0x338f, "squarekg"},
+  {0x339e, "squarekm"},
+  {0x33ce, "squarekmcapital"},
+  {0x33d1, "squareln"},
+  {0x33d2, "squarelog"},
+  {0x338e, "squaremg"},
+  {0x33d5, "squaremil"},
+  {0x339c, "squaremm"},
+  {0x33a1, "squaremsquared"},
+  {0x25a6, "squareorthogonalcrosshatchfill"},
+  {0x25a7, "squareupperlefttolowerrightfill"},
+  {0x25a8, "squareupperrighttolowerleftfill"},
+  {0x25a5, "squareverticalfill"},
+  {0x25a3, "squarewhitewithsmallblack"},
+  {0x33db, "srsquare"},
+  {0x09b7, "ssabengali"},
+  {0x0937, "ssadeva"},
+  {0x0ab7, "ssagujarati"},
+  {0x3149, "ssangcieuckorean"},
+  {0x3185, "ssanghieuhkorean"},
+  {0x3180, "ssangieungkorean"},
+  {0x3132, "ssangkiyeokkorean"},
+  {0x3165, "ssangnieunkorean"},
+  {0x3143, "ssangpieupkorean"},
+  {0x3146, "ssangsioskorean"},
+  {0x3138, "ssangtikeutkorean"},
+  {0xf6f2, "ssuperior"},
+  {0x00a3, "sterling"},
+  {0xffe1, "sterlingmonospace"},
+  {0x0336, "strokelongoverlaycmb"},
+  {0x0335, "strokeshortoverlaycmb"},
+  {0x2282, "subset"},
+  {0x228a, "subsetnotequal"},
+  {0x2286, "subsetorequal"},
+  {0x227b, "succeeds"},
+  {0x220b, "suchthat"},
+  {0x3059, "suhiragana"},
+  {0x30b9, "sukatakana"},
+  {0xff7d, "sukatakanahalfwidth"},
+  {0x0652, "sukunarabic"},
+  {0x2211, "summation"},
+  {0x263c, "sun"},
+  {0x2283, "superset"},
+  {0x228b, "supersetnotequal"},
+  {0x2287, "supersetorequal"},
+  {0x33dc, "svsquare"},
+  {0x337c, "syouwaerasquare"},
+  {0x0074, "t"},
+  {0x09a4, "tabengali"},
+  {0x22a4, "tackdown"},
+  {0x22a3, "tackleft"},
+  {0x0924, "tadeva"},
+  {0x0aa4, "tagujarati"},
+  {0x0a24, "tagurmukhi"},
+  {0x0637, "taharabic"},
+  {0xfec2, "tahfinalarabic"},
+  {0xfec3, "tahinitialarabic"},
+  {0x305f, "tahiragana"},
+  {0xfec4, "tahmedialarabic"},
+  {0x337d, "taisyouerasquare"},
+  {0x30bf, "takatakana"},
+  {0xff80, "takatakanahalfwidth"},
+  {0x0640, "tatweelarabic"},
+  {0x03c4, "tau"},
+  {0x05ea, "tav"},
+  {0xfb4a, "tavdages"},
+  {0xfb4a, "tavdagesh"},
+  {0xfb4a, "tavdageshhebrew"},
+  {0x05ea, "tavhebrew"},
+  {0x0167, "tbar"},
+  {0x310a, "tbopomofo"},
+  {0x0165, "tcaron"},
+  {0x02a8, "tccurl"},
+  {0x0163, "tcedilla"},
+  {0x0686, "tcheharabic"},
+  {0xfb7b, "tchehfinalarabic"},
+  {0xfb7c, "tchehinitialarabic"},
+  {0xfb7d, "tchehmedialarabic"},
+  {0x24e3, "tcircle"},
+  {0x1e71, "tcircumflexbelow"},
+  {0x0163, "tcommaaccent"},
+  {0x1e97, "tdieresis"},
+  {0x1e6b, "tdotaccent"},
+  {0x1e6d, "tdotbelow"},
+  {0x0442, "tecyrillic"},
+  {0x04ad, "tedescendercyrillic"},
+  {0x062a, "teharabic"},
+  {0xfe96, "tehfinalarabic"},
+  {0xfca2, "tehhahinitialarabic"},
+  {0xfc0c, "tehhahisolatedarabic"},
+  {0xfe97, "tehinitialarabic"},
+  {0x3066, "tehiragana"},
+  {0xfca1, "tehjeeminitialarabic"},
+  {0xfc0b, "tehjeemisolatedarabic"},
+  {0x0629, "tehmarbutaarabic"},
+  {0xfe94, "tehmarbutafinalarabic"},
+  {0xfe98, "tehmedialarabic"},
+  {0xfca4, "tehmeeminitialarabic"},
+  {0xfc0e, "tehmeemisolatedarabic"},
+  {0xfc73, "tehnoonfinalarabic"},
+  {0x30c6, "tekatakana"},
+  {0xff83, "tekatakanahalfwidth"},
+  {0x2121, "telephone"},
+  {0x260e, "telephoneblack"},
+  {0x05a0, "telishagedolahebrew"},
+  {0x05a9, "telishaqetanahebrew"},
+  {0x2469, "tencircle"},
+  {0x3229, "tenideographicparen"},
+  {0x247d, "tenparen"},
+  {0x2491, "tenperiod"},
+  {0x2179, "tenroman"},
+  {0x02a7, "tesh"},
+  {0x05d8, "tet"},
+  {0xfb38, "tetdagesh"},
+  {0xfb38, "tetdageshhebrew"},
+  {0x05d8, "tethebrew"},
+  {0x04b5, "tetsecyrillic"},
+  {0x059b, "tevirhebrew"},
+  {0x059b, "tevirlefthebrew"},
+  {0x09a5, "thabengali"},
+  {0x0925, "thadeva"},
+  {0x0aa5, "thagujarati"},
+  {0x0a25, "thagurmukhi"},
+  {0x0630, "thalarabic"},
+  {0xfeac, "thalfinalarabic"},
+  {0xf898, "thanthakhatlowleftthai"},
+  {0xf897, "thanthakhatlowrightthai"},
+  {0x0e4c, "thanthakhatthai"},
+  {0xf896, "thanthakhatupperleftthai"},
+  {0x062b, "theharabic"},
+  {0xfe9a, "thehfinalarabic"},
+  {0xfe9b, "thehinitialarabic"},
+  {0xfe9c, "thehmedialarabic"},
+  {0x2203, "thereexists"},
+  {0x2234, "therefore"},
+  {0x03b8, "theta"},
+  {0x03d1, "theta1"},
+  {0x03d1, "thetasymbolgreek"},
+  {0x3279, "thieuthacirclekorean"},
+  {0x3219, "thieuthaparenkorean"},
+  {0x326b, "thieuthcirclekorean"},
+  {0x314c, "thieuthkorean"},
+  {0x320b, "thieuthparenkorean"},
+  {0x246c, "thirteencircle"},
+  {0x2480, "thirteenparen"},
+  {0x2494, "thirteenperiod"},
+  {0x0e11, "thonangmonthothai"},
+  {0x01ad, "thook"},
+  {0x0e12, "thophuthaothai"},
+  {0x00fe, "thorn"},
+  {0x0e17, "thothahanthai"},
+  {0x0e10, "thothanthai"},
+  {0x0e18, "thothongthai"},
+  {0x0e16, "thothungthai"},
+  {0x0482, "thousandcyrillic"},
+  {0x066c, "thousandsseparatorarabic"},
+  {0x066c, "thousandsseparatorpersian"},
+  {0x0033, "three"},
+  {0x0663, "threearabic"},
+  {0x09e9, "threebengali"},
+  {0x2462, "threecircle"},
+  {0x278c, "threecircleinversesansserif"},
+  {0x0969, "threedeva"},
+  {0x215c, "threeeighths"},
+  {0x0ae9, "threegujarati"},
+  {0x0a69, "threegurmukhi"},
+  {0x0663, "threehackarabic"},
+  {0x3023, "threehangzhou"},
+  {0x3222, "threeideographicparen"},
+  {0x2083, "threeinferior"},
+  {0xff13, "threemonospace"},
+  {0x09f6, "threenumeratorbengali"},
+  {0xf733, "threeoldstyle"},
+  {0x2476, "threeparen"},
+  {0x248a, "threeperiod"},
+  {0x06f3, "threepersian"},
+  {0x00be, "threequarters"},
+  {0xf6de, "threequartersemdash"},
+  {0x2172, "threeroman"},
+  {0x00b3, "threesuperior"},
+  {0x0e53, "threethai"},
+  {0x3394, "thzsquare"},
+  {0x3061, "tihiragana"},
+  {0x30c1, "tikatakana"},
+  {0xff81, "tikatakanahalfwidth"},
+  {0x3270, "tikeutacirclekorean"},
+  {0x3210, "tikeutaparenkorean"},
+  {0x3262, "tikeutcirclekorean"},
+  {0x3137, "tikeutkorean"},
+  {0x3202, "tikeutparenkorean"},
+  {0x02dc, "tilde"},
+  {0x0330, "tildebelowcmb"},
+  {0x0303, "tildecmb"},
+  {0x0303, "tildecomb"},
+  {0x0360, "tildedoublecmb"},
+  {0x223c, "tildeoperator"},
+  {0x0334, "tildeoverlaycmb"},
+  {0x033e, "tildeverticalcmb"},
+  {0x2297, "timescircle"},
+  {0x0596, "tipehahebrew"},
+  {0x0596, "tipehalefthebrew"},
+  {0x0a70, "tippigurmukhi"},
+  {0x0483, "titlocyrilliccmb"},
+  {0x057f, "tiwnarmenian"},
+  {0x1e6f, "tlinebelow"},
+  {0xff54, "tmonospace"},
+  {0x0569, "toarmenian"},
+  {0x3068, "tohiragana"},
+  {0x30c8, "tokatakana"},
+  {0xff84, "tokatakanahalfwidth"},
+  {0x02e5, "tonebarextrahighmod"},
+  {0x02e9, "tonebarextralowmod"},
+  {0x02e6, "tonebarhighmod"},
+  {0x02e8, "tonebarlowmod"},
+  {0x02e7, "tonebarmidmod"},
+  {0x01bd, "tonefive"},
+  {0x0185, "tonesix"},
+  {0x01a8, "tonetwo"},
+  {0x0384, "tonos"},
+  {0x3327, "tonsquare"},
+  {0x0e0f, "topatakthai"},
+  {0x3014, "tortoiseshellbracketleft"},
+  {0xfe5d, "tortoiseshellbracketleftsmall"},
+  {0xfe39, "tortoiseshellbracketleftvertical"},
+  {0x3015, "tortoiseshellbracketright"},
+  {0xfe5e, "tortoiseshellbracketrightsmall"},
+  {0xfe3a, "tortoiseshellbracketrightvertical"},
+  {0x0e15, "totaothai"},
+  {0x01ab, "tpalatalhook"},
+  {0x24af, "tparen"},
+  {0x2122, "trademark"},
+  {0xf8ea, "trademarksans"},
+  {0xf6db, "trademarkserif"},
+  {0x0288, "tretroflexhook"},
+  {0x25bc, "triagdn"},
+  {0x25c4, "triaglf"},
+  {0x25ba, "triagrt"},
+  {0x25b2, "triagup"},
+  {0x02a6, "ts"},
+  {0x05e6, "tsadi"},
+  {0xfb46, "tsadidagesh"},
+  {0xfb46, "tsadidageshhebrew"},
+  {0x05e6, "tsadihebrew"},
+  {0x0446, "tsecyrillic"},
+  {0x05b5, "tsere"},
+  {0x05b5, "tsere12"},
+  {0x05b5, "tsere1e"},
+  {0x05b5, "tsere2b"},
+  {0x05b5, "tserehebrew"},
+  {0x05b5, "tserenarrowhebrew"},
+  {0x05b5, "tserequarterhebrew"},
+  {0x05b5, "tserewidehebrew"},
+  {0x045b, "tshecyrillic"},
+  {0xf6f3, "tsuperior"},
+  {0x099f, "ttabengali"},
+  {0x091f, "ttadeva"},
+  {0x0a9f, "ttagujarati"},
+  {0x0a1f, "ttagurmukhi"},
+  {0x0679, "tteharabic"},
+  {0xfb67, "ttehfinalarabic"},
+  {0xfb68, "ttehinitialarabic"},
+  {0xfb69, "ttehmedialarabic"},
+  {0x09a0, "tthabengali"},
+  {0x0920, "tthadeva"},
+  {0x0aa0, "tthagujarati"},
+  {0x0a20, "tthagurmukhi"},
+  {0x0287, "tturned"},
+  {0x3064, "tuhiragana"},
+  {0x30c4, "tukatakana"},
+  {0xff82, "tukatakanahalfwidth"},
+  {0x3063, "tusmallhiragana"},
+  {0x30c3, "tusmallkatakana"},
+  {0xff6f, "tusmallkatakanahalfwidth"},
+  {0x246b, "twelvecircle"},
+  {0x247f, "twelveparen"},
+  {0x2493, "twelveperiod"},
+  {0x217b, "twelveroman"},
+  {0x2473, "twentycircle"},
+  {0x5344, "twentyhangzhou"},
+  {0x2487, "twentyparen"},
+  {0x249b, "twentyperiod"},
+  {0x0032, "two"},
+  {0x0662, "twoarabic"},
+  {0x09e8, "twobengali"},
+  {0x2461, "twocircle"},
+  {0x278b, "twocircleinversesansserif"},
+  {0x0968, "twodeva"},
+  {0x2025, "twodotenleader"},
+  {0x2025, "twodotleader"},
+  {0xfe30, "twodotleadervertical"},
+  {0x0ae8, "twogujarati"},
+  {0x0a68, "twogurmukhi"},
+  {0x0662, "twohackarabic"},
+  {0x3022, "twohangzhou"},
+  {0x3221, "twoideographicparen"},
+  {0x2082, "twoinferior"},
+  {0xff12, "twomonospace"},
+  {0x09f5, "twonumeratorbengali"},
+  {0xf732, "twooldstyle"},
+  {0x2475, "twoparen"},
+  {0x2489, "twoperiod"},
+  {0x06f2, "twopersian"},
+  {0x2171, "tworoman"},
+  {0x01bb, "twostroke"},
+  {0x00b2, "twosuperior"},
+  {0x0e52, "twothai"},
+  {0x2154, "twothirds"},
+  {0x0075, "u"},
+  {0x00fa, "uacute"},
+  {0x0289, "ubar"},
+  {0x0989, "ubengali"},
+  {0x3128, "ubopomofo"},
+  {0x016d, "ubreve"},
+  {0x01d4, "ucaron"},
+  {0x24e4, "ucircle"},
+  {0x00fb, "ucircumflex"},
+  {0x1e77, "ucircumflexbelow"},
+  {0x0443, "ucyrillic"},
+  {0x0951, "udattadeva"},
+  {0x0171, "udblacute"},
+  {0x0215, "udblgrave"},
+  {0x0909, "udeva"},
+  {0x00fc, "udieresis"},
+  {0x01d8, "udieresisacute"},
+  {0x1e73, "udieresisbelow"},
+  {0x01da, "udieresiscaron"},
+  {0x04f1, "udieresiscyrillic"},
+  {0x01dc, "udieresisgrave"},
+  {0x01d6, "udieresismacron"},
+  {0x1ee5, "udotbelow"},
+  {0x00f9, "ugrave"},
+  {0x0a89, "ugujarati"},
+  {0x0a09, "ugurmukhi"},
+  {0x3046, "uhiragana"},
+  {0x1ee7, "uhookabove"},
+  {0x01b0, "uhorn"},
+  {0x1ee9, "uhornacute"},
+  {0x1ef1, "uhorndotbelow"},
+  {0x1eeb, "uhorngrave"},
+  {0x1eed, "uhornhookabove"},
+  {0x1eef, "uhorntilde"},
+  {0x0171, "uhungarumlaut"},
+  {0x04f3, "uhungarumlautcyrillic"},
+  {0x0217, "uinvertedbreve"},
+  {0x30a6, "ukatakana"},
+  {0xff73, "ukatakanahalfwidth"},
+  {0x0479, "ukcyrillic"},
+  {0x315c, "ukorean"},
+  {0x016b, "umacron"},
+  {0x04ef, "umacroncyrillic"},
+  {0x1e7b, "umacrondieresis"},
+  {0x0a41, "umatragurmukhi"},
+  {0xff55, "umonospace"},
+  {0x005f, "underscore"},
+  {0x2017, "underscoredbl"},
+  {0xff3f, "underscoremonospace"},
+  {0xfe33, "underscorevertical"},
+  {0xfe4f, "underscorewavy"},
+  {0x222a, "union"},
+  {0x2200, "universal"},
+  {0x0173, "uogonek"},
+  {0x24b0, "uparen"},
+  {0x2580, "upblock"},
+  {0x05c4, "upperdothebrew"},
+  {0x03c5, "upsilon"},
+  {0x03cb, "upsilondieresis"},
+  {0x03b0, "upsilondieresistonos"},
+  {0x028a, "upsilonlatin"},
+  {0x03cd, "upsilontonos"},
+  {0x031d, "uptackbelowcmb"},
+  {0x02d4, "uptackmod"},
+  {0x0a73, "uragurmukhi"},
+  {0x016f, "uring"},
+  {0x045e, "ushortcyrillic"},
+  {0x3045, "usmallhiragana"},
+  {0x30a5, "usmallkatakana"},
+  {0xff69, "usmallkatakanahalfwidth"},
+  {0x04af, "ustraightcyrillic"},
+  {0x04b1, "ustraightstrokecyrillic"},
+  {0x0169, "utilde"},
+  {0x1e79, "utildeacute"},
+  {0x1e75, "utildebelow"},
+  {0x098a, "uubengali"},
+  {0x090a, "uudeva"},
+  {0x0a8a, "uugujarati"},
+  {0x0a0a, "uugurmukhi"},
+  {0x0a42, "uumatragurmukhi"},
+  {0x09c2, "uuvowelsignbengali"},
+  {0x0942, "uuvowelsigndeva"},
+  {0x0ac2, "uuvowelsigngujarati"},
+  {0x09c1, "uvowelsignbengali"},
+  {0x0941, "uvowelsigndeva"},
+  {0x0ac1, "uvowelsigngujarati"},
+  {0x0076, "v"},
+  {0x0935, "vadeva"},
+  {0x0ab5, "vagujarati"},
+  {0x0a35, "vagurmukhi"},
+  {0x30f7, "vakatakana"},
+  {0x05d5, "vav"},
+  {0xfb35, "vavdagesh"},
+  {0xfb35, "vavdagesh65"},
+  {0xfb35, "vavdageshhebrew"},
+  {0x05d5, "vavhebrew"},
+  {0xfb4b, "vavholam"},
+  {0xfb4b, "vavholamhebrew"},
+  {0x05f0, "vavvavhebrew"},
+  {0x05f1, "vavyodhebrew"},
+  {0x24e5, "vcircle"},
+  {0x1e7f, "vdotbelow"},
+  {0x0432, "vecyrillic"},
+  {0x06a4, "veharabic"},
+  {0xfb6b, "vehfinalarabic"},
+  {0xfb6c, "vehinitialarabic"},
+  {0xfb6d, "vehmedialarabic"},
+  {0x30f9, "vekatakana"},
+  {0x2640, "venus"},
+  {0x007c, "verticalbar"},
+  {0x030d, "verticallineabovecmb"},
+  {0x0329, "verticallinebelowcmb"},
+  {0x02cc, "verticallinelowmod"},
+  {0x02c8, "verticallinemod"},
+  {0x057e, "vewarmenian"},
+  {0x028b, "vhook"},
+  {0x30f8, "vikatakana"},
+  {0x09cd, "viramabengali"},
+  {0x094d, "viramadeva"},
+  {0x0acd, "viramagujarati"},
+  {0x0983, "visargabengali"},
+  {0x0903, "visargadeva"},
+  {0x0a83, "visargagujarati"},
+  {0xff56, "vmonospace"},
+  {0x0578, "voarmenian"},
+  {0x309e, "voicediterationhiragana"},
+  {0x30fe, "voicediterationkatakana"},
+  {0x309b, "voicedmarkkana"},
+  {0xff9e, "voicedmarkkanahalfwidth"},
+  {0x30fa, "vokatakana"},
+  {0x24b1, "vparen"},
+  {0x1e7d, "vtilde"},
+  {0x028c, "vturned"},
+  {0x3094, "vuhiragana"},
+  {0x30f4, "vukatakana"},
+  {0x0077, "w"},
+  {0x1e83, "wacute"},
+  {0x3159, "waekorean"},
+  {0x308f, "wahiragana"},
+  {0x30ef, "wakatakana"},
+  {0xff9c, "wakatakanahalfwidth"},
+  {0x3158, "wakorean"},
+  {0x308e, "wasmallhiragana"},
+  {0x30ee, "wasmallkatakana"},
+  {0x3357, "wattosquare"},
+  {0x301c, "wavedash"},
+  {0xfe34, "wavyunderscorevertical"},
+  {0x0648, "wawarabic"},
+  {0xfeee, "wawfinalarabic"},
+  {0x0624, "wawhamzaabovearabic"},
+  {0xfe86, "wawhamzaabovefinalarabic"},
+  {0x33dd, "wbsquare"},
+  {0x24e6, "wcircle"},
+  {0x0175, "wcircumflex"},
+  {0x1e85, "wdieresis"},
+  {0x1e87, "wdotaccent"},
+  {0x1e89, "wdotbelow"},
+  {0x3091, "wehiragana"},
+  {0x2118, "weierstrass"},
+  {0x30f1, "wekatakana"},
+  {0x315e, "wekorean"},
+  {0x315d, "weokorean"},
+  {0x1e81, "wgrave"},
+  {0x25e6, "whitebullet"},
+  {0x25cb, "whitecircle"},
+  {0x25d9, "whitecircleinverse"},
+  {0x300e, "whitecornerbracketleft"},
+  {0xfe43, "whitecornerbracketleftvertical"},
+  {0x300f, "whitecornerbracketright"},
+  {0xfe44, "whitecornerbracketrightvertical"},
+  {0x25c7, "whitediamond"},
+  {0x25c8, "whitediamondcontainingblacksmalldiamond"},
+  {0x25bf, "whitedownpointingsmalltriangle"},
+  {0x25bd, "whitedownpointingtriangle"},
+  {0x25c3, "whiteleftpointingsmalltriangle"},
+  {0x25c1, "whiteleftpointingtriangle"},
+  {0x3016, "whitelenticularbracketleft"},
+  {0x3017, "whitelenticularbracketright"},
+  {0x25b9, "whiterightpointingsmalltriangle"},
+  {0x25b7, "whiterightpointingtriangle"},
+  {0x25ab, "whitesmallsquare"},
+  {0x263a, "whitesmilingface"},
+  {0x25a1, "whitesquare"},
+  {0x2606, "whitestar"},
+  {0x260f, "whitetelephone"},
+  {0x3018, "whitetortoiseshellbracketleft"},
+  {0x3019, "whitetortoiseshellbracketright"},
+  {0x25b5, "whiteuppointingsmalltriangle"},
+  {0x25b3, "whiteuppointingtriangle"},
+  {0x3090, "wihiragana"},
+  {0x30f0, "wikatakana"},
+  {0x315f, "wikorean"},
+  {0xff57, "wmonospace"},
+  {0x3092, "wohiragana"},
+  {0x30f2, "wokatakana"},
+  {0xff66, "wokatakanahalfwidth"},
+  {0x20a9, "won"},
+  {0xffe6, "wonmonospace"},
+  {0x0e27, "wowaenthai"},
+  {0x24b2, "wparen"},
+  {0x1e98, "wring"},
+  {0x02b7, "wsuperior"},
+  {0x028d, "wturned"},
+  {0x01bf, "wynn"},
+  {0x0078, "x"},
+  {0x033d, "xabovecmb"},
+  {0x3112, "xbopomofo"},
+  {0x24e7, "xcircle"},
+  {0x1e8d, "xdieresis"},
+  {0x1e8b, "xdotaccent"},
+  {0x056d, "xeharmenian"},
+  {0x03be, "xi"},
+  {0xff58, "xmonospace"},
+  {0x24b3, "xparen"},
+  {0x02e3, "xsuperior"},
+  {0x0079, "y"},
+  {0x334e, "yaadosquare"},
+  {0x09af, "yabengali"},
+  {0x00fd, "yacute"},
+  {0x092f, "yadeva"},
+  {0x3152, "yaekorean"},
+  {0x0aaf, "yagujarati"},
+  {0x0a2f, "yagurmukhi"},
+  {0x3084, "yahiragana"},
+  {0x30e4, "yakatakana"},
+  {0xff94, "yakatakanahalfwidth"},
+  {0x3151, "yakorean"},
+  {0x0e4e, "yamakkanthai"},
+  {0x3083, "yasmallhiragana"},
+  {0x30e3, "yasmallkatakana"},
+  {0xff6c, "yasmallkatakanahalfwidth"},
+  {0x0463, "yatcyrillic"},
+  {0x24e8, "ycircle"},
+  {0x0177, "ycircumflex"},
+  {0x00ff, "ydieresis"},
+  {0x1e8f, "ydotaccent"},
+  {0x1ef5, "ydotbelow"},
+  {0x064a, "yeharabic"},
+  {0x06d2, "yehbarreearabic"},
+  {0xfbaf, "yehbarreefinalarabic"},
+  {0xfef2, "yehfinalarabic"},
+  {0x0626, "yehhamzaabovearabic"},
+  {0xfe8a, "yehhamzaabovefinalarabic"},
+  {0xfe8b, "yehhamzaaboveinitialarabic"},
+  {0xfe8c, "yehhamzaabovemedialarabic"},
+  {0xfef3, "yehinitialarabic"},
+  {0xfef4, "yehmedialarabic"},
+  {0xfcdd, "yehmeeminitialarabic"},
+  {0xfc58, "yehmeemisolatedarabic"},
+  {0xfc94, "yehnoonfinalarabic"},
+  {0x06d1, "yehthreedotsbelowarabic"},
+  {0x3156, "yekorean"},
+  {0x00a5, "yen"},
+  {0xffe5, "yenmonospace"},
+  {0x3155, "yeokorean"},
+  {0x3186, "yeorinhieuhkorean"},
+  {0x05aa, "yerahbenyomohebrew"},
+  {0x05aa, "yerahbenyomolefthebrew"},
+  {0x044b, "yericyrillic"},
+  {0x04f9, "yerudieresiscyrillic"},
+  {0x3181, "yesieungkorean"},
+  {0x3183, "yesieungpansioskorean"},
+  {0x3182, "yesieungsioskorean"},
+  {0x059a, "yetivhebrew"},
+  {0x1ef3, "ygrave"},
+  {0x01b4, "yhook"},
+  {0x1ef7, "yhookabove"},
+  {0x0575, "yiarmenian"},
+  {0x0457, "yicyrillic"},
+  {0x3162, "yikorean"},
+  {0x262f, "yinyang"},
+  {0x0582, "yiwnarmenian"},
+  {0xff59, "ymonospace"},
+  {0x05d9, "yod"},
+  {0xfb39, "yoddagesh"},
+  {0xfb39, "yoddageshhebrew"},
+  {0x05d9, "yodhebrew"},
+  {0x05f2, "yodyodhebrew"},
+  {0xfb1f, "yodyodpatahhebrew"},
+  {0x3088, "yohiragana"},
+  {0x3189, "yoikorean"},
+  {0x30e8, "yokatakana"},
+  {0xff96, "yokatakanahalfwidth"},
+  {0x315b, "yokorean"},
+  {0x3087, "yosmallhiragana"},
+  {0x30e7, "yosmallkatakana"},
+  {0xff6e, "yosmallkatakanahalfwidth"},
+  {0x03f3, "yotgreek"},
+  {0x3188, "yoyaekorean"},
+  {0x3187, "yoyakorean"},
+  {0x0e22, "yoyakthai"},
+  {0x0e0d, "yoyingthai"},
+  {0x24b4, "yparen"},
+  {0x037a, "ypogegrammeni"},
+  {0x0345, "ypogegrammenigreekcmb"},
+  {0x01a6, "yr"},
+  {0x1e99, "yring"},
+  {0x02b8, "ysuperior"},
+  {0x1ef9, "ytilde"},
+  {0x028e, "yturned"},
+  {0x3086, "yuhiragana"},
+  {0x318c, "yuikorean"},
+  {0x30e6, "yukatakana"},
+  {0xff95, "yukatakanahalfwidth"},
+  {0x3160, "yukorean"},
+  {0x046b, "yusbigcyrillic"},
+  {0x046d, "yusbigiotifiedcyrillic"},
+  {0x0467, "yuslittlecyrillic"},
+  {0x0469, "yuslittleiotifiedcyrillic"},
+  {0x3085, "yusmallhiragana"},
+  {0x30e5, "yusmallkatakana"},
+  {0xff6d, "yusmallkatakanahalfwidth"},
+  {0x318b, "yuyekorean"},
+  {0x318a, "yuyeokorean"},
+  {0x09df, "yyabengali"},
+  {0x095f, "yyadeva"},
+  {0x007a, "z"},
+  {0x0566, "zaarmenian"},
+  {0x017a, "zacute"},
+  {0x095b, "zadeva"},
+  {0x0a5b, "zagurmukhi"},
+  {0x0638, "zaharabic"},
+  {0xfec6, "zahfinalarabic"},
+  {0xfec7, "zahinitialarabic"},
+  {0x3056, "zahiragana"},
+  {0xfec8, "zahmedialarabic"},
+  {0x0632, "zainarabic"},
+  {0xfeb0, "zainfinalarabic"},
+  {0x30b6, "zakatakana"},
+  {0x0595, "zaqefgadolhebrew"},
+  {0x0594, "zaqefqatanhebrew"},
+  {0x0598, "zarqahebrew"},
+  {0x05d6, "zayin"},
+  {0xfb36, "zayindagesh"},
+  {0xfb36, "zayindageshhebrew"},
+  {0x05d6, "zayinhebrew"},
+  {0x3117, "zbopomofo"},
+  {0x017e, "zcaron"},
+  {0x24e9, "zcircle"},
+  {0x1e91, "zcircumflex"},
+  {0x0291, "zcurl"},
+  {0x017c, "zdot"},
+  {0x017c, "zdotaccent"},
+  {0x1e93, "zdotbelow"},
+  {0x0437, "zecyrillic"},
+  {0x0499, "zedescendercyrillic"},
+  {0x04df, "zedieresiscyrillic"},
+  {0x305c, "zehiragana"},
+  {0x30bc, "zekatakana"},
+  {0x0030, "zero"},
+  {0x0660, "zeroarabic"},
+  {0x09e6, "zerobengali"},
+  {0x0966, "zerodeva"},
+  {0x0ae6, "zerogujarati"},
+  {0x0a66, "zerogurmukhi"},
+  {0x0660, "zerohackarabic"},
+  {0x2080, "zeroinferior"},
+  {0xff10, "zeromonospace"},
+  {0xf730, "zerooldstyle"},
+  {0x06f0, "zeropersian"},
+  {0x2070, "zerosuperior"},
+  {0x0e50, "zerothai"},
+  {0xfeff, "zerowidthjoiner"},
+  {0x200c, "zerowidthnonjoiner"},
+  {0x200b, "zerowidthspace"},
+  {0x03b6, "zeta"},
+  {0x3113, "zhbopomofo"},
+  {0x056a, "zhearmenian"},
+  {0x04c2, "zhebrevecyrillic"},
+  {0x0436, "zhecyrillic"},
+  {0x0497, "zhedescendercyrillic"},
+  {0x04dd, "zhedieresiscyrillic"},
+  {0x3058, "zihiragana"},
+  {0x30b8, "zikatakana"},
+  {0x05ae, "zinorhebrew"},
+  {0x1e95, "zlinebelow"},
+  {0xff5a, "zmonospace"},
+  {0x305e, "zohiragana"},
+  {0x30be, "zokatakana"},
+  {0x24b5, "zparen"},
+  {0x0290, "zretroflexhook"},
+  {0x01b6, "zstroke"},
+  {0x305a, "zuhiragana"},
+  {0x30ba, "zukatakana"},
+  {0x007b, "{"},
+  {0x007c, "|"},
+  {0x007d, "}"},
+  {0x007e, "~"},
+  { 0, NULL }
+};
diff --git a/poppler/Object.cc b/poppler/Object.cc
new file mode 100644 (file)
index 0000000..1963b7f
--- /dev/null
@@ -0,0 +1,251 @@
+//========================================================================
+//
+// Object.cc
+//
+// Copyright 1996-2003 Glyph & Cog, LLC
+//
+//========================================================================
+
+//========================================================================
+//
+// Modified under the Poppler project - http://poppler.freedesktop.org
+//
+// All changes made under the Poppler project to this file are licensed
+// under GPL version 2 or later
+//
+// Copyright (C) 2008, 2010, 2012 Albert Astals Cid <aacid@kde.org>
+//
+// To see a description of the changes please see the Changelog file that
+// came with your tarball or type make ChangeLog if you are building from git
+//
+//========================================================================
+
+#include <config.h>
+
+#ifdef USE_GCC_PRAGMAS
+#pragma implementation
+#endif
+
+#include <stddef.h>
+#include "Object.h"
+#include "Array.h"
+#include "Dict.h"
+#include "Error.h"
+#include "Stream.h"
+#include "XRef.h"
+
+//------------------------------------------------------------------------
+// Object
+//------------------------------------------------------------------------
+
+static const char *objTypeNames[numObjTypes] = {
+  "boolean",
+  "integer",
+  "real",
+  "string",
+  "name",
+  "null",
+  "array",
+  "dictionary",
+  "stream",
+  "ref",
+  "cmd",
+  "error",
+  "eof",
+  "none",
+  "unsigned integer"
+};
+
+#ifdef DEBUG_MEM
+int Object::numAlloc[numObjTypes] =
+  {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
+#endif
+
+Object *Object::initArray(XRef *xref) {
+  initObj(objArray);
+  array = new Array(xref);
+  return this;
+}
+
+Object *Object::initDict(XRef *xref) {
+  initObj(objDict);
+  dict = new Dict(xref);
+  return this;
+}
+
+Object *Object::initDict(Dict *dictA) {
+  initObj(objDict);
+  dict = dictA;
+  dict->incRef();
+  return this;
+}
+
+Object *Object::initStream(Stream *streamA) {
+  initObj(objStream);
+  stream = streamA;
+  return this;
+}
+
+Object *Object::copy(Object *obj) {
+  *obj = *this;
+  switch (type) {
+  case objString:
+    obj->string = string->copy();
+    break;
+  case objName:
+    obj->name = copyString(name);
+    break;
+  case objArray:
+    array->incRef();
+    break;
+  case objDict:
+    dict->incRef();
+    break;
+  case objStream:
+    stream->incRef();
+    break;
+  case objCmd:
+    obj->cmd = copyString(cmd);
+    break;
+  default:
+    break;
+  }
+#ifdef DEBUG_MEM
+  ++numAlloc[type];
+#endif
+  return obj;
+}
+
+Object *Object::fetch(XRef *xref, Object *obj, int recursion) {
+  return (type == objRef && xref) ?
+         xref->fetch(ref.num, ref.gen, obj, recursion) : copy(obj);
+}
+
+void Object::free() {
+  switch (type) {
+  case objString:
+    delete string;
+    break;
+  case objName:
+    gfree(name);
+    break;
+  case objArray:
+    if (!array->decRef()) {
+      delete array;
+    }
+    break;
+  case objDict:
+    if (!dict->decRef()) {
+      delete dict;
+    }
+    break;
+  case objStream:
+    if (!stream->decRef()) {
+      delete stream;
+    }
+    break;
+  case objCmd:
+    gfree(cmd);
+    break;
+  default:
+    break;
+  }
+#ifdef DEBUG_MEM
+  --numAlloc[type];
+#endif
+  type = objNone;
+}
+
+const char *Object::getTypeName() {
+  return objTypeNames[type];
+}
+
+void Object::print(FILE *f) {
+  Object obj;
+  int i;
+
+  switch (type) {
+  case objBool:
+    fprintf(f, "%s", booln ? "true" : "false");
+    break;
+  case objInt:
+    fprintf(f, "%d", intg);
+    break;
+  case objReal:
+    fprintf(f, "%g", real);
+    break;
+  case objString:
+    fprintf(f, "(");
+    fwrite(string->getCString(), 1, string->getLength(), f);
+    fprintf(f, ")");
+    break;
+  case objName:
+    fprintf(f, "/%s", name);
+    break;
+  case objNull:
+    fprintf(f, "null");
+    break;
+  case objArray:
+    fprintf(f, "[");
+    for (i = 0; i < arrayGetLength(); ++i) {
+      if (i > 0)
+       fprintf(f, " ");
+      arrayGetNF(i, &obj);
+      obj.print(f);
+      obj.free();
+    }
+    fprintf(f, "]");
+    break;
+  case objDict:
+    fprintf(f, "<<");
+    for (i = 0; i < dictGetLength(); ++i) {
+      fprintf(f, " /%s ", dictGetKey(i));
+      dictGetValNF(i, &obj);
+      obj.print(f);
+      obj.free();
+    }
+    fprintf(f, " >>");
+    break;
+  case objStream:
+    fprintf(f, "<stream>");
+    break;
+  case objRef:
+    fprintf(f, "%d %d R", ref.num, ref.gen);
+    break;
+  case objCmd:
+    fprintf(f, "%s", cmd);
+    break;
+  case objError:
+    fprintf(f, "<error>");
+    break;
+  case objEOF:
+    fprintf(f, "<EOF>");
+    break;
+  case objNone:
+    fprintf(f, "<none>");
+    break;
+  case objUint:
+    fprintf(f, "%u", uintg);
+    break;
+  }
+}
+
+void Object::memCheck(FILE *f) {
+#ifdef DEBUG_MEM
+  int i;
+  int t;
+
+  t = 0;
+  for (i = 0; i < numObjTypes; ++i)
+    t += numAlloc[i];
+  if (t > 0) {
+    fprintf(f, "Allocated objects:\n");
+    for (i = 0; i < numObjTypes; ++i) {
+      if (numAlloc[i] > 0)
+       fprintf(f, "  %-20s: %6d\n", objTypeNames[i], numAlloc[i]);
+    }
+  }
+#else
+  (void)f;
+#endif
+}
diff --git a/poppler/Object.h b/poppler/Object.h
new file mode 100644 (file)
index 0000000..c885d73
--- /dev/null
@@ -0,0 +1,362 @@
+//========================================================================
+//
+// Object.h
+//
+// Copyright 1996-2003 Glyph & Cog, LLC
+//
+//========================================================================
+
+//========================================================================
+//
+// Modified under the Poppler project - http://poppler.freedesktop.org
+//
+// All changes made under the Poppler project to this file are licensed
+// under GPL version 2 or later
+//
+// Copyright (C) 2007 Julien Rebetez <julienr@svn.gnome.org>
+// Copyright (C) 2008 Kees Cook <kees@outflux.net>
+// Copyright (C) 2008, 2010 Albert Astals Cid <aacid@kde.org>
+// Copyright (C) 2009 Jakub Wilk <ubanus@users.sf.net>
+// Copyright (C) 2012 Fabio D'Urso <fabiodurso@hotmail.it>
+//
+// To see a description of the changes please see the Changelog file that
+// came with your tarball or type make ChangeLog if you are building from git
+//
+//========================================================================
+
+#ifndef OBJECT_H
+#define OBJECT_H
+
+#ifdef USE_GCC_PRAGMAS
+#pragma interface
+#endif
+
+#include <set>
+#include <stdio.h>
+#include <string.h>
+#include "goo/gtypes.h"
+#include "goo/gmem.h"
+#include "goo/GooString.h"
+#include "goo/GooLikely.h"
+#include "Error.h"
+
+#define OBJECT_TYPE_CHECK(wanted_type) \
+    if (unlikely(type != wanted_type)) { \
+        error(errInternal, 0, (char *) "Call to Object where the object was type {0:d}, " \
+                 "not the expected type {1:d}", type, wanted_type); \
+        abort(); \
+    }
+
+#define OBJECT_2TYPES_CHECK(wanted_type1, wanted_type2) \
+    if (unlikely(type != wanted_type1) && unlikely(type != wanted_type2)) { \
+        error(errInternal, 0, (char *) "Call to Object where the object was type {0:d}, " \
+                 "not the expected type {1:d} or {2:d}", type, wanted_type1, wanted_type2); \
+        abort(); \
+    }
+
+class XRef;
+class Array;
+class Dict;
+class Stream;
+
+//------------------------------------------------------------------------
+// Ref
+//------------------------------------------------------------------------
+
+struct Ref {
+  int num;                     // object number
+  int gen;                     // generation number
+};
+
+//------------------------------------------------------------------------
+// object types
+//------------------------------------------------------------------------
+
+enum ObjType {
+  // simple objects
+  objBool,                     // boolean
+  objInt,                      // integer
+  objReal,                     // real
+  objString,                   // string
+  objName,                     // name
+  objNull,                     // null
+
+  // complex objects
+  objArray,                    // array
+  objDict,                     // dictionary
+  objStream,                   // stream
+  objRef,                      // indirect reference
+
+  // special objects
+  objCmd,                      // command name
+  objError,                    // error return from Lexer
+  objEOF,                      // end of file return from Lexer
+  objNone,                     // uninitialized object
+
+  // poppler-only objects
+  objUint                      // overflown integer that still fits in a unsigned integer
+};
+
+#define numObjTypes 15         // total number of object types
+
+//------------------------------------------------------------------------
+// Object
+//------------------------------------------------------------------------
+
+#ifdef DEBUG_MEM
+#define initObj(t) zeroUnion(); ++numAlloc[type = t]
+#else
+#define initObj(t) zeroUnion(); type = t
+#endif
+
+class Object {
+public:
+  // clear the anonymous union as best we can -- clear at least a pointer
+  void zeroUnion() { this->name = NULL; }
+
+  // Default constructor.
+  Object():
+    type(objNone) { zeroUnion(); }
+
+  // Initialize an object.
+  Object *initBool(GBool boolnA)
+    { initObj(objBool); booln = boolnA; return this; }
+  Object *initInt(int intgA)
+    { initObj(objInt); intg = intgA; return this; }
+  Object *initReal(double realA)
+    { initObj(objReal); real = realA; return this; }
+  Object *initString(GooString *stringA)
+    { initObj(objString); string = stringA; return this; }
+  Object *initName(const char *nameA)
+    { initObj(objName); name = copyString(nameA); return this; }
+  Object *initNull()
+    { initObj(objNull); return this; }
+  Object *initArray(XRef *xref);
+  Object *initDict(XRef *xref);
+  Object *initDict(Dict *dictA);
+  Object *initStream(Stream *streamA);
+  Object *initRef(int numA, int genA)
+    { initObj(objRef); ref.num = numA; ref.gen = genA; return this; }
+  Object *initCmd(char *cmdA)
+    { initObj(objCmd); cmd = copyString(cmdA); return this; }
+  Object *initError()
+    { initObj(objError); return this; }
+  Object *initEOF()
+    { initObj(objEOF); return this; }
+  Object *initUint(unsigned int uintgA)
+    { initObj(objUint); uintg = uintgA; return this; }
+
+  // Copy an object.
+  Object *copy(Object *obj);
+  Object *shallowCopy(Object *obj) {
+    *obj = *this;
+    return obj;
+  }
+
+  // If object is a Ref, fetch and return the referenced object.
+  // Otherwise, return a copy of the object.
+  Object *fetch(XRef *xref, Object *obj, int recursion = 0);
+
+  // Free object contents.
+  void free();
+
+  // Type checking.
+  ObjType getType() { return type; }
+  GBool isBool() { return type == objBool; }
+  GBool isInt() { return type == objInt; }
+  GBool isReal() { return type == objReal; }
+  GBool isNum() { return type == objInt || type == objReal; }
+  GBool isString() { return type == objString; }
+  GBool isName() { return type == objName; }
+  GBool isNull() { return type == objNull; }
+  GBool isArray() { return type == objArray; }
+  GBool isDict() { return type == objDict; }
+  GBool isStream() { return type == objStream; }
+  GBool isRef() { return type == objRef; }
+  GBool isCmd() { return type == objCmd; }
+  GBool isError() { return type == objError; }
+  GBool isEOF() { return type == objEOF; }
+  GBool isNone() { return type == objNone; }
+  GBool isUint() { return type == objUint; }
+
+  // Special type checking.
+  GBool isName(const char *nameA)
+    { return type == objName && !strcmp(name, nameA); }
+  GBool isDict(const char *dictType);
+  GBool isStream(char *dictType);
+  GBool isCmd(const char *cmdA)
+    { return type == objCmd && !strcmp(cmd, cmdA); }
+
+  // Accessors.
+  GBool getBool() { OBJECT_TYPE_CHECK(objBool); return booln; }
+  int getInt() { OBJECT_TYPE_CHECK(objInt); return intg; }
+  double getReal() { OBJECT_TYPE_CHECK(objReal); return real; }
+  double getNum() { OBJECT_2TYPES_CHECK(objInt, objReal); return type == objInt ? (double)intg : real; }
+  GooString *getString() { OBJECT_TYPE_CHECK(objString); return string; }
+  char *getName() { OBJECT_TYPE_CHECK(objName); return name; }
+  Array *getArray() { OBJECT_TYPE_CHECK(objArray); return array; }
+  Dict *getDict() { OBJECT_TYPE_CHECK(objDict); return dict; }
+  Stream *getStream() { OBJECT_TYPE_CHECK(objStream); return stream; }
+  Ref getRef() { OBJECT_TYPE_CHECK(objRef); return ref; }
+  int getRefNum() { OBJECT_TYPE_CHECK(objRef); return ref.num; }
+  int getRefGen() { OBJECT_TYPE_CHECK(objRef); return ref.gen; }
+  char *getCmd() { OBJECT_TYPE_CHECK(objCmd); return cmd; }
+  unsigned int getUint() { OBJECT_TYPE_CHECK(objUint); return uintg; }
+
+  // Array accessors.
+  int arrayGetLength();
+  void arrayAdd(Object *elem);
+  void arrayRemove(int i);
+  Object *arrayGet(int i, Object *obj);
+  Object *arrayGetNF(int i, Object *obj);
+
+  // Dict accessors.
+  int dictGetLength();
+  void dictAdd(char *key, Object *val);
+  void dictSet(const char *key, Object *val);
+  GBool dictIs(const char *dictType);
+  Object *dictLookup(const char *key, Object *obj, int recursion = 0);
+  Object *dictLookupNF(const char *key, Object *obj);
+  char *dictGetKey(int i);
+  Object *dictGetVal(int i, Object *obj);
+  Object *dictGetValNF(int i, Object *obj);
+
+  // Stream accessors.
+  GBool streamIs(char *dictType);
+  void streamReset();
+  void streamClose();
+  int streamGetChar();
+  int streamGetChars(int nChars, Guchar *buffer);
+  int streamLookChar();
+  char *streamGetLine(char *buf, int size);
+  Guint streamGetPos();
+  void streamSetPos(Guint pos, int dir = 0);
+  Dict *streamGetDict();
+
+  // Output.
+  const char *getTypeName();
+  void print(FILE *f = stdout);
+
+  // Memory testing.
+  static void memCheck(FILE *f);
+
+private:
+
+  ObjType type;                        // object type
+  union {                      // value for each type:
+    GBool booln;               //   boolean
+    int intg;                  //   integer
+    unsigned int uintg;                //   unsigned integer
+    double real;               //   real
+    GooString *string;         //   string
+    char *name;                        //   name
+    Array *array;              //   array
+    Dict *dict;                        //   dictionary
+    Stream *stream;            //   stream
+    Ref ref;                   //   indirect reference
+    char *cmd;                 //   command
+  };
+
+#ifdef DEBUG_MEM
+  static int                   // number of each type of object
+    numAlloc[numObjTypes];     //   currently allocated
+#endif
+};
+
+//------------------------------------------------------------------------
+// Array accessors.
+//------------------------------------------------------------------------
+
+#include "Array.h"
+
+inline int Object::arrayGetLength()
+  { OBJECT_TYPE_CHECK(objArray); return array->getLength(); }
+
+inline void Object::arrayAdd(Object *elem)
+  { OBJECT_TYPE_CHECK(objArray); array->add(elem); }
+
+inline void Object::arrayRemove(int i)
+  { OBJECT_TYPE_CHECK(objArray); array->remove(i); }
+
+inline Object *Object::arrayGet(int i, Object *obj)
+  { OBJECT_TYPE_CHECK(objArray); return array->get(i, obj); }
+
+inline Object *Object::arrayGetNF(int i, Object *obj)
+  { OBJECT_TYPE_CHECK(objArray); return array->getNF(i, obj); }
+
+//------------------------------------------------------------------------
+// Dict accessors.
+//------------------------------------------------------------------------
+
+#include "Dict.h"
+
+inline int Object::dictGetLength()
+  { OBJECT_TYPE_CHECK(objDict); return dict->getLength(); }
+
+inline void Object::dictAdd(char *key, Object *val)
+  { OBJECT_TYPE_CHECK(objDict); dict->add(key, val); }
+
+inline void Object::dictSet(const char *key, Object *val)
+       { OBJECT_TYPE_CHECK(objDict); dict->set(key, val); }
+
+inline GBool Object::dictIs(const char *dictType)
+  { OBJECT_TYPE_CHECK(objDict); return dict->is(dictType); }
+
+inline GBool Object::isDict(const char *dictType)
+  { return type == objDict && dictIs(dictType); }
+
+inline Object *Object::dictLookup(const char *key, Object *obj, int recursion)
+  { OBJECT_TYPE_CHECK(objDict); return dict->lookup(key, obj, recursion); }
+
+inline Object *Object::dictLookupNF(const char *key, Object *obj)
+  { OBJECT_TYPE_CHECK(objDict); return dict->lookupNF(key, obj); }
+
+inline char *Object::dictGetKey(int i)
+  { OBJECT_TYPE_CHECK(objDict); return dict->getKey(i); }
+
+inline Object *Object::dictGetVal(int i, Object *obj)
+  { OBJECT_TYPE_CHECK(objDict); return dict->getVal(i, obj); }
+
+inline Object *Object::dictGetValNF(int i, Object *obj)
+  { OBJECT_TYPE_CHECK(objDict); return dict->getValNF(i, obj); }
+
+//------------------------------------------------------------------------
+// Stream accessors.
+//------------------------------------------------------------------------
+
+#include "Stream.h"
+
+inline GBool Object::streamIs(char *dictType)
+  { OBJECT_TYPE_CHECK(objStream); return stream->getDict()->is(dictType); }
+
+inline GBool Object::isStream(char *dictType)
+  { return type == objStream && streamIs(dictType); }
+
+inline void Object::streamReset()
+  { OBJECT_TYPE_CHECK(objStream); stream->reset(); }
+
+inline void Object::streamClose()
+  { OBJECT_TYPE_CHECK(objStream); stream->close(); }
+
+inline int Object::streamGetChar()
+  { OBJECT_TYPE_CHECK(objStream); return stream->getChar(); }
+
+inline int Object::streamGetChars(int nChars, Guchar *buffer)
+  { OBJECT_TYPE_CHECK(objStream); return stream->doGetChars(nChars, buffer); }
+
+inline int Object::streamLookChar()
+  { OBJECT_TYPE_CHECK(objStream); return stream->lookChar(); }
+
+inline char *Object::streamGetLine(char *buf, int size)
+  { OBJECT_TYPE_CHECK(objStream); return stream->getLine(buf, size); }
+
+inline Guint Object::streamGetPos()
+  { OBJECT_TYPE_CHECK(objStream); return stream->getPos(); }
+
+inline void Object::streamSetPos(Guint pos, int dir)
+  { OBJECT_TYPE_CHECK(objStream); stream->setPos(pos, dir); }
+
+inline Dict *Object::streamGetDict()
+  { OBJECT_TYPE_CHECK(objStream); return stream->getDict(); }
+
+#endif
diff --git a/poppler/OptionalContent.cc b/poppler/OptionalContent.cc
new file mode 100644 (file)
index 0000000..e0d49bc
--- /dev/null
@@ -0,0 +1,553 @@
+//========================================================================
+//
+// OptionalContent.cc
+//
+// Copyright 2007 Brad Hards <bradh@kde.org>
+// Copyright 2008 Pino Toscano <pino@kde.org>
+// Copyright 2008, 2010 Carlos Garcia Campos <carlosgc@gnome.org>
+// Copyright 2008, 2010, 2011 Albert Astals Cid <aacid@kde.org>
+// Copyright 2008 Mark Kaplan <mkaplan@finjan.com>
+//
+// Released under the GPL (version 2, or later, at your option)
+//
+//========================================================================
+
+#include <config.h>
+
+#ifdef USE_GCC_PRAGMAS
+#pragma implementation
+#endif
+
+#include "goo/gmem.h"
+#include "goo/GooString.h"
+#include "goo/GooList.h"
+#include "Error.h"
+// #include "PDFDocEncoding.h"
+#include "OptionalContent.h"
+
+// Max depth of nested visibility expressions.  This is used to catch
+// infinite loops in the visibility expression object structure.
+#define visibilityExprRecursionLimit 50
+
+// Max depth of nested display nodes.  This is used to catch infinite
+// loops in the "Order" object structure.
+#define displayNodeRecursionLimit 50
+
+//------------------------------------------------------------------------
+
+OCGs::OCGs(Object *ocgObject, XRef *xref) :
+  m_xref(xref)
+{
+  // we need to parse the dictionary here, and build optionalContentGroups
+  ok = gTrue;
+  optionalContentGroups = new GooList();
+  display = NULL;
+
+  Object ocgList;
+  ocgObject->dictLookup("OCGs", &ocgList);
+  if (!ocgList.isArray()) {
+    error(errSyntaxError, -1, "Expected the optional content group list, but wasn't able to find it, or it isn't an Array");
+    ocgList.free();
+    ok = gFalse;
+    return;
+  }
+
+  // we now enumerate over the ocgList, and build up the optionalContentGroups list.
+  for(int i = 0; i < ocgList.arrayGetLength(); ++i) {
+    Object ocg;
+    ocgList.arrayGet(i, &ocg);
+    if (!ocg.isDict()) {
+      ocg.free();
+      break;
+    }
+    OptionalContentGroup *thisOptionalContentGroup = new OptionalContentGroup(ocg.getDict());
+    ocg.free();
+    ocgList.arrayGetNF(i, &ocg);
+    // TODO: we should create a lookup map from Ref to the OptionalContentGroup
+    thisOptionalContentGroup->setRef( ocg.getRef() );
+    ocg.free();
+    // the default is ON - we change state later, depending on BaseState, ON and OFF
+    thisOptionalContentGroup->setState(OptionalContentGroup::On);
+    optionalContentGroups->append(thisOptionalContentGroup);
+  }
+
+  Object defaultOcgConfig;
+  ocgObject->dictLookup("D", &defaultOcgConfig);
+  if (!defaultOcgConfig.isDict()) {
+    error(errSyntaxError, -1, "Expected the default config, but wasn't able to find it, or it isn't a Dictionary");
+    defaultOcgConfig.free();
+    ocgList.free();
+    ok = gFalse;
+    return;
+  }
+
+  Object baseState;
+  defaultOcgConfig.dictLookup("BaseState", &baseState);
+  if (baseState.isName("OFF")) {
+    for (int i = 0; i < optionalContentGroups->getLength(); ++i) {
+      OptionalContentGroup *group;
+
+      group = (OptionalContentGroup *)optionalContentGroups->get(i);
+      group->setState(OptionalContentGroup::Off);
+    }
+  }
+  baseState.free();
+
+  Object on;
+  defaultOcgConfig.dictLookup("ON", &on);
+  if (on.isArray()) {
+    // ON is an optional element
+    for (int i = 0; i < on.arrayGetLength(); ++i) {
+      Object reference;
+      on.arrayGetNF(i, &reference);
+      if (!reference.isRef()) {
+       // there can be null entries
+       reference.free();
+       break;
+      }
+      OptionalContentGroup *group = findOcgByRef( reference.getRef() );
+      reference.free();
+      if (!group) {
+       error(errSyntaxWarning, -1, "Couldn't find group for reference");
+       break;
+      }
+      group->setState(OptionalContentGroup::On);
+    }
+  }
+  on.free();
+
+  Object off;
+  defaultOcgConfig.dictLookup("OFF", &off);
+  if (off.isArray()) {
+    // OFF is an optional element
+    for (int i = 0; i < off.arrayGetLength(); ++i) {
+      Object reference;
+      off.arrayGetNF(i, &reference);
+      if (!reference.isRef()) {
+       // there can be null entries
+       reference.free();
+       break;
+      }
+      OptionalContentGroup *group = findOcgByRef( reference.getRef() );
+      reference.free();
+      if (!group) {
+       error(errSyntaxWarning, -1, "Couldn't find group for reference to set OFF");
+       break;
+      }
+      group->setState(OptionalContentGroup::Off);
+    }
+  }
+  off.free();
+
+  defaultOcgConfig.dictLookup("Order", &order);
+  defaultOcgConfig.dictLookup("RBGroups", &rbgroups);
+
+  ocgList.free();
+  defaultOcgConfig.free();
+}
+
+OCGs::~OCGs()
+{
+  deleteGooList(optionalContentGroups, OptionalContentGroup);
+  order.free();
+  if (display)
+    delete display;
+  rbgroups.free();
+}
+
+
+bool OCGs::hasOCGs()
+{
+  return ( optionalContentGroups->getLength() > 0 );
+}
+
+OptionalContentGroup* OCGs::findOcgByRef( const Ref &ref)
+{
+  //TODO: make this more efficient
+  OptionalContentGroup *ocg = NULL;
+  for (int i=0; i < optionalContentGroups->getLength(); ++i) {
+    ocg = (OptionalContentGroup*)optionalContentGroups->get(i);
+    if ( (ocg->getRef().num == ref.num) && (ocg->getRef().gen == ref.gen) ) {
+      return ocg;
+    }
+  }
+
+  // not found
+  return NULL;
+}
+
+OCDisplayNode *OCGs::getDisplayRoot()
+{
+  if (display)
+    return display;
+
+  if (order.isArray())
+    display = OCDisplayNode::parse(&order, this, m_xref);
+
+  return display;
+}
+
+bool OCGs::optContentIsVisible( Object *dictRef )
+{
+  Object dictObj;
+  Dict *dict;
+  Object dictType;
+  Object ocg;
+  Object policy;
+  Object ve;
+  bool result = true;
+
+  if (dictRef->isNull())
+    return result;
+
+  if (dictRef->isRef()) {
+    OptionalContentGroup *oc = findOcgByRef(dictRef->getRef());
+    if (oc)
+      return oc->getState() == OptionalContentGroup::On;
+  }
+
+  dictRef->fetch( m_xref, &dictObj );
+  if ( ! dictObj.isDict() ) {
+    error(errSyntaxWarning, -1, "Unexpected oc reference target: {0:d}", dictObj.getType() );
+    dictObj.free();
+    return result;
+  }
+  dict = dictObj.getDict();
+  // printf("checking if optContent is visible\n");
+  dict->lookup("Type", &dictType);
+  if (dictType.isName("OCMD")) {
+    if (dict->lookup("VE", &ve)->isArray()) {
+      result = evalOCVisibilityExpr(&ve, 0);
+    } else {
+      dict->lookupNF("OCGs", &ocg);
+      if (ocg.isArray()) {
+        dict->lookup("P", &policy);
+        if (policy.isName("AllOn")) {
+          result = allOn( ocg.getArray() );
+        } else if (policy.isName("AllOff")) {
+          result = allOff( ocg.getArray() );
+        } else if (policy.isName("AnyOff")) {
+          result = anyOff( ocg.getArray() );
+        } else if ( (!policy.isName()) || (policy.isName("AnyOn") ) ) {
+          // this is the default
+          result = anyOn( ocg.getArray() );
+        }
+        policy.free();
+      } else if (ocg.isRef()) {
+        OptionalContentGroup *oc = findOcgByRef( ocg.getRef() );
+        if ( oc && oc->getState() == OptionalContentGroup::Off ) {
+          result = false;
+        } else {
+          result = true ;
+        }
+      }
+      ocg.free();
+    }
+    ve.free();
+  } else if ( dictType.isName("OCG") ) {
+    OptionalContentGroup* oc = findOcgByRef( dictRef->getRef() );
+    if ( oc && oc->getState() == OptionalContentGroup::Off ) {
+      result=false;
+    }
+  }
+  dictType.free();
+  dictObj.free();
+  // printf("visibility: %s\n", result? "on" : "off");
+  return result;
+}
+
+GBool OCGs::evalOCVisibilityExpr(Object *expr, int recursion) {
+  OptionalContentGroup *ocg;
+  Object expr2, op, obj;
+  GBool ret;
+  int i;
+
+  if (recursion > visibilityExprRecursionLimit) {
+    error(errSyntaxError, -1,
+         "Loop detected in optional content visibility expression");
+    return gTrue;
+  }
+  if (expr->isRef()) {
+    if ((ocg = findOcgByRef(expr->getRef()))) {
+      return ocg->getState() == OptionalContentGroup::On;
+    }
+  }
+  expr->fetch(m_xref, &expr2);
+  if (!expr2.isArray() || expr2.arrayGetLength() < 1) {
+    error(errSyntaxError, -1,
+         "Invalid optional content visibility expression");
+    expr2.free();
+    return gTrue;
+  }
+  expr2.arrayGet(0, &op);
+  if (op.isName("Not")) {
+    if (expr2.arrayGetLength() == 2) {
+      expr2.arrayGetNF(1, &obj);
+      ret = !evalOCVisibilityExpr(&obj, recursion + 1);
+      obj.free();
+    } else {
+      error(errSyntaxError, -1,
+           "Invalid optional content visibility expression");
+      ret = gTrue;
+    }
+  } else if (op.isName("And")) {
+    ret = gTrue;
+    for (i = 1; i < expr2.arrayGetLength() && ret; ++i) {
+      expr2.arrayGetNF(i, &obj);
+      ret = evalOCVisibilityExpr(&obj, recursion + 1);
+      obj.free();
+    }
+  } else if (op.isName("Or")) {
+    ret = gFalse;
+    for (i = 1; i < expr2.arrayGetLength() && !ret; ++i) {
+      expr2.arrayGetNF(i, &obj);
+      ret = evalOCVisibilityExpr(&obj, recursion + 1);
+      obj.free();
+    }
+  } else {
+    error(errSyntaxError, -1,
+         "Invalid optional content visibility expression");
+    ret = gTrue;
+  }
+  op.free();
+  expr2.free();
+  return ret;
+}
+
+bool OCGs::allOn( Array *ocgArray )
+{
+  for (int i = 0; i < ocgArray->getLength(); ++i) {
+    Object ocgItem;
+    ocgArray->getNF(i, &ocgItem);
+    if (ocgItem.isRef()) {
+      OptionalContentGroup* oc = findOcgByRef( ocgItem.getRef() );      
+      if ( oc && oc->getState() == OptionalContentGroup::Off ) {
+       return false;
+      }
+    }
+  }
+  return true;
+}
+
+bool OCGs::allOff( Array *ocgArray )
+{
+  for (int i = 0; i < ocgArray->getLength(); ++i) {
+    Object ocgItem;
+    ocgArray->getNF(i, &ocgItem);
+    if (ocgItem.isRef()) {
+      OptionalContentGroup* oc = findOcgByRef( ocgItem.getRef() );      
+      if ( oc && oc->getState() == OptionalContentGroup::On ) {
+       return false;
+      }
+    }
+  }
+  return true;
+}
+
+bool OCGs::anyOn( Array *ocgArray )
+{
+  for (int i = 0; i < ocgArray->getLength(); ++i) {
+    Object ocgItem;
+    ocgArray->getNF(i, &ocgItem);
+    if (ocgItem.isRef()) {
+      OptionalContentGroup* oc = findOcgByRef( ocgItem.getRef() );      
+      if ( oc && oc->getState() == OptionalContentGroup::On ) {
+       return true;
+      }
+    }
+  }
+  return false;
+}
+
+bool OCGs::anyOff( Array *ocgArray )
+{
+  for (int i = 0; i < ocgArray->getLength(); ++i) {
+    Object ocgItem;
+    ocgArray->getNF(i, &ocgItem);
+    if (ocgItem.isRef()) {
+      OptionalContentGroup* oc = findOcgByRef( ocgItem.getRef() );      
+      if ( oc && oc->getState() == OptionalContentGroup::Off ) {
+       return true;
+      }
+    }
+  }
+  return false;
+}
+
+//------------------------------------------------------------------------
+
+OptionalContentGroup::OptionalContentGroup(Dict *ocgDict) : m_name(NULL)
+{
+  Object obj1, obj2, obj3;
+  Object ocgName;
+  ocgDict->lookup("Name", &ocgName);
+  if (!ocgName.isString()) {
+    error(errSyntaxWarning, -1, "Expected the name of the OCG, but wasn't able to find it, or it isn't a String");
+  } else {
+    m_name = new GooString( ocgName.getString() );
+  }
+  ocgName.free();
+
+  viewState = printState = ocUsageUnset;
+  if (ocgDict->lookup("Usage", &obj1)->isDict()) {
+    if (obj1.dictLookup("View", &obj2)->isDict()) {
+      if (obj2.dictLookup("ViewState", &obj3)->isName()) {
+       if (obj3.isName("ON")) {
+         viewState = ocUsageOn;
+       } else {
+         viewState = ocUsageOff;
+       }
+      }
+      obj3.free();
+    }
+    obj2.free();
+    if (obj1.dictLookup("Print", &obj2)->isDict()) {
+      if (obj2.dictLookup("PrintState", &obj3)->isName()) {
+       if (obj3.isName("ON")) {
+         printState = ocUsageOn;
+       } else {
+         printState = ocUsageOff;
+       }
+      }
+      obj3.free();
+    }
+    obj2.free();
+  }
+  obj1.free();
+}
+
+OptionalContentGroup::OptionalContentGroup(GooString *label)
+{
+  m_name = label;
+  m_state = On;
+}
+
+GooString* OptionalContentGroup::getName() const
+{
+  return m_name;
+}
+
+void OptionalContentGroup::setRef(const Ref ref)
+{
+  m_ref = ref;
+}
+
+Ref OptionalContentGroup::getRef() const
+{
+  return m_ref;
+}
+
+OptionalContentGroup::~OptionalContentGroup()
+{
+  delete m_name;
+}
+
+//------------------------------------------------------------------------
+
+OCDisplayNode *OCDisplayNode::parse(Object *obj, OCGs *oc,
+                                   XRef *xref, int recursion) {
+  Object obj2, obj3;
+  OptionalContentGroup *ocgA;
+  OCDisplayNode *node, *child;
+  int i;
+
+  if (recursion > displayNodeRecursionLimit) {
+    error(errSyntaxError, -1, "Loop detected in optional content order");
+    return NULL;
+  }
+  if (obj->isRef()) {
+    if ((ocgA = oc->findOcgByRef(obj->getRef()))) {
+      return new OCDisplayNode(ocgA);
+    }
+  }
+  obj->fetch(xref, &obj2);
+  if (!obj2.isArray()) {
+    obj2.free();
+    return NULL;
+  }
+  i = 0;
+  if (obj2.arrayGetLength() >= 1) {
+    if (obj2.arrayGet(0, &obj3)->isString()) {
+      node = new OCDisplayNode(obj3.getString());
+      i = 1;
+    } else {
+      node = new OCDisplayNode();
+    }
+    obj3.free();
+  } else {
+    node = new OCDisplayNode();
+  }
+  for (; i < obj2.arrayGetLength(); ++i) {
+    obj2.arrayGetNF(i, &obj3);
+    if ((child = OCDisplayNode::parse(&obj3, oc, xref, recursion + 1))) {
+      if (!child->ocg && !child->name && node->getNumChildren() > 0) {
+       node->getChild(node->getNumChildren() - 1)->addChildren(child->takeChildren());
+       delete child;
+      } else {
+       node->addChild(child);
+      }
+    }
+    obj3.free();
+  }
+  obj2.free();
+  return node;
+}
+
+OCDisplayNode::OCDisplayNode() {
+  name = NULL;
+  ocg = NULL;
+  children = NULL;
+}
+
+OCDisplayNode::OCDisplayNode(GooString *nameA) {
+  name = new GooString(nameA);
+  ocg = NULL;
+  children = NULL;
+}
+
+OCDisplayNode::OCDisplayNode(OptionalContentGroup *ocgA) {
+  name = (ocgA->getName()) ? ocgA->getName()->copy() : NULL;
+  ocg = ocgA;
+  children = NULL;
+}
+
+void OCDisplayNode::addChild(OCDisplayNode *child) {
+  if (!children) {
+    children = new GooList();
+  }
+  children->append(child);
+}
+
+void OCDisplayNode::addChildren(GooList *childrenA) {
+  if (!children) {
+    children = new GooList();
+  }
+  children->append(childrenA);
+  delete childrenA;
+}
+
+GooList *OCDisplayNode::takeChildren() {
+  GooList *childrenA;
+
+  childrenA = children;
+  children = NULL;
+  return childrenA;
+}
+
+OCDisplayNode::~OCDisplayNode() {
+  gfree(name);
+  if (children) {
+    deleteGooList(children, OCDisplayNode);
+  }
+}
+
+int OCDisplayNode::getNumChildren() {
+  if (!children) {
+    return 0;
+  }
+  return children->getLength();
+}
+
+OCDisplayNode *OCDisplayNode::getChild(int idx) {
+  return (OCDisplayNode *)children->get(idx);
+}
diff --git a/poppler/OptionalContent.h b/poppler/OptionalContent.h
new file mode 100644 (file)
index 0000000..02c9a47
--- /dev/null
@@ -0,0 +1,140 @@
+//========================================================================
+//
+// OptionalContent.h
+//
+// Copyright 2007 Brad Hards <bradh@kde.org>
+// Copyright 2008 Carlos Garcia Campos <carlosgc@gnome.org>
+//
+// Released under the GPL (version 2, or later, at your option)
+//
+//========================================================================
+
+#ifndef OPTIONALCONTENT_H
+#define OPTIONALCONTENT_H
+
+#ifdef USE_GCC_PRAGMAS
+#pragma interface
+#endif
+
+#include "Object.h"
+#include "CharTypes.h"
+
+class GooString;
+class GooList;
+class XRef;
+
+class OptionalContentGroup;
+class OCDisplayNode;
+
+//------------------------------------------------------------------------
+
+class OCGs {
+public:
+
+  OCGs(Object *ocgObject, XRef *xref);
+  ~OCGs();
+
+  // Is OCGS valid?
+  GBool isOk() { return ok; }
+  
+  bool hasOCGs();
+  GooList *getOCGs() const { return optionalContentGroups; }
+
+  OptionalContentGroup* findOcgByRef( const Ref &ref);
+
+  // Get the root node of the optional content group display tree
+  // (which does not necessarily include all of the OCGs).
+  OCDisplayNode *getDisplayRoot();
+
+  Array* getOrderArray() 
+    { return (order.isArray() && order.arrayGetLength() > 0) ? order.getArray() : NULL; }
+  Array* getRBGroupsArray() 
+    { return (rbgroups.isArray() && rbgroups.arrayGetLength()) ? rbgroups.getArray() : NULL; }
+
+  bool optContentIsVisible( Object *dictRef );
+
+private:
+  GBool ok;
+
+  GBool evalOCVisibilityExpr(Object *expr, int recursion);
+  bool allOn( Array *ocgArray );
+  bool allOff( Array *ocgArray );
+  bool anyOn( Array *ocgArray );
+  bool anyOff( Array *ocgArray );
+
+  GooList *optionalContentGroups;
+
+  Object order;
+  Object rbgroups;
+  XRef *m_xref;
+  OCDisplayNode *display; // root node of display tree
+};
+
+//------------------------------------------------------------------------
+
+class OptionalContentGroup {
+public:
+  enum State { On, Off };
+
+  // Values from the optional content usage dictionary.
+  enum UsageState {
+    ocUsageOn,
+    ocUsageOff,
+    ocUsageUnset
+  };
+
+  OptionalContentGroup(Dict *dict);
+
+  OptionalContentGroup(GooString *label);
+
+  ~OptionalContentGroup();
+
+  GooString* getName() const;
+
+  Ref getRef() const;
+  void setRef(const Ref ref);
+
+  State getState() { return m_state; };
+  void setState(State state) { m_state = state; };
+
+  UsageState getViewState() { return viewState; }
+  UsageState getPrintState() { return printState; }
+
+private:
+  XRef *xref;
+  GooString *m_name;
+  Ref m_ref;
+  State m_state;
+  UsageState viewState;         // suggested state when viewing
+  UsageState printState; // suggested state when printing
+};
+
+//------------------------------------------------------------------------
+
+class OCDisplayNode {
+public:
+
+  static OCDisplayNode *parse(Object *obj, OCGs *oc, XRef *xref, int recursion = 0);
+  OCDisplayNode();
+  ~OCDisplayNode();
+
+  GooString *getName() { return name; }
+  OptionalContentGroup *getOCG() { return ocg; }
+  int getNumChildren();
+  OCDisplayNode *getChild(int idx);
+
+private:
+
+  OCDisplayNode(GooString *nameA);
+  OCDisplayNode(OptionalContentGroup *ocgA);
+  void addChild(OCDisplayNode *child);
+  void addChildren(GooList *childrenA);
+  GooList *takeChildren();
+
+  GooString *name;             // display name (may be NULL)
+  OptionalContentGroup *ocg;   // NULL for display labels
+  GooList *children;           // NULL if there are no children
+                               //   [OCDisplayNode]
+};
+
+#endif
diff --git a/poppler/Outline.cc b/poppler/Outline.cc
new file mode 100644 (file)
index 0000000..bd4e6d0
--- /dev/null
@@ -0,0 +1,188 @@
+//========================================================================
+//
+// Outline.cc
+//
+// Copyright 2002-2003 Glyph & Cog, LLC
+//
+//========================================================================
+
+//========================================================================
+//
+// Modified under the Poppler project - http://poppler.freedesktop.org
+//
+// All changes made under the Poppler project to this file are licensed
+// under GPL version 2 or later
+//
+// Copyright (C) 2005 Marco Pesenti Gritti <mpg@redhat.com>
+// Copyright (C) 2008 Albert Astals Cid <aacid@kde.org>
+// Copyright (C) 2009 Nick Jones <nick.jones@network-box.com>
+//
+// To see a description of the changes please see the Changelog file that
+// came with your tarball or type make ChangeLog if you are building from git
+//
+//========================================================================
+
+#include <config.h>
+
+#ifdef USE_GCC_PRAGMAS
+#pragma implementation
+#endif
+
+#include "goo/gmem.h"
+#include "goo/GooString.h"
+#include "goo/GooList.h"
+#include "XRef.h"
+#include "Link.h"
+#include "PDFDocEncoding.h"
+#include "Outline.h"
+
+//------------------------------------------------------------------------
+
+Outline::Outline(Object *outlineObj, XRef *xref) {
+  Object first, last;
+
+  items = NULL;
+  if (!outlineObj->isDict()) {
+    return;
+  }
+  items = OutlineItem::readItemList(outlineObj->dictLookupNF("First", &first),
+                                   outlineObj->dictLookupNF("Last", &last),
+                                   xref);
+  first.free();
+  last.free();
+}
+
+Outline::~Outline() {
+  if (items) {
+    deleteGooList(items, OutlineItem);
+  }
+}
+
+//------------------------------------------------------------------------
+
+OutlineItem::OutlineItem(Dict *dict, XRef *xrefA) {
+  Object obj1;
+  GooString *s;
+  int i;
+
+  xref = xrefA;
+  title = NULL;
+  action = NULL;
+  kids = NULL;
+
+  if (dict->lookup("Title", &obj1)->isString()) {
+    s = obj1.getString();
+    if ((s->getChar(0) & 0xff) == 0xfe &&
+       (s->getChar(1) & 0xff) == 0xff) {
+      titleLen = (s->getLength() - 2) / 2;
+      title = (Unicode *)gmallocn(titleLen, sizeof(Unicode));
+      for (i = 0; i < titleLen; ++i) {
+       title[i] = ((s->getChar(2 + 2*i) & 0xff) << 8) |
+                  (s->getChar(3 + 2*i) & 0xff);
+      }
+    } else {
+      titleLen = s->getLength();
+      title = (Unicode *)gmallocn(titleLen, sizeof(Unicode));
+      for (i = 0; i < titleLen; ++i) {
+       title[i] = pdfDocEncoding[s->getChar(i) & 0xff];
+      }
+    }
+  } else {
+    titleLen = 0;
+  }
+  obj1.free();
+
+  if (!dict->lookup("Dest", &obj1)->isNull()) {
+    action = LinkAction::parseDest(&obj1);
+  } else {
+      obj1.free();
+    if (!dict->lookup("A", &obj1)->isNull()) {
+        action = LinkAction::parseAction(&obj1);
+  }
+  }
+  obj1.free();
+
+  dict->lookupNF("First", &firstRef);
+  dict->lookupNF("Last", &lastRef);
+  dict->lookupNF("Next", &nextRef);
+
+  startsOpen = gFalse;
+  if (dict->lookup("Count", &obj1)->isInt()) {
+    if (obj1.getInt() > 0) {
+      startsOpen = gTrue;
+    }
+  }
+  obj1.free();
+}
+
+OutlineItem::~OutlineItem() {
+  close();
+  if (title) {
+    gfree(title);
+  }
+  if (action) {
+    delete action;
+  }
+  firstRef.free();
+  lastRef.free();
+  nextRef.free();
+}
+
+GooList *OutlineItem::readItemList(Object *firstItemRef, Object *lastItemRef,
+                                XRef *xrefA) {
+  GooList *items;
+  char* alreadyRead;
+  OutlineItem *item;
+  Object obj;
+  Object *p;
+
+  if (!lastItemRef->isRef())
+    return NULL;
+
+  items = new GooList();
+
+  alreadyRead = (char *)gmalloc(xrefA->getNumObjects());
+  memset(alreadyRead, 0, xrefA->getNumObjects());
+
+  p = firstItemRef;
+  while (p->isRef() && 
+        (p->getRefNum() >= 0) && 
+         (p->getRefNum() < xrefA->getNumObjects()) && 
+         !alreadyRead[p->getRefNum()]) {
+    if (!p->fetch(xrefA, &obj)->isDict()) {
+      obj.free();
+      break;
+    }
+    alreadyRead[p->getRefNum()] = 1;
+    item = new OutlineItem(obj.getDict(), xrefA);
+    obj.free();
+    items->append(item);
+    if (p->getRef().num == lastItemRef->getRef().num &&
+       p->getRef().gen == lastItemRef->getRef().gen) {
+      break;
+    }
+    p = &item->nextRef;
+  }
+
+  gfree(alreadyRead);
+
+  if (!items->getLength()) {
+    delete items;
+    items = NULL;
+  }
+
+  return items;
+}
+
+void OutlineItem::open() {
+  if (!kids) {
+    kids = readItemList(&firstRef, &lastRef, xref);
+  }
+}
+
+void OutlineItem::close() {
+  if (kids) {
+    deleteGooList(kids, OutlineItem);
+    kids = NULL;
+  }
+}
diff --git a/poppler/Outline.h b/poppler/Outline.h
new file mode 100644 (file)
index 0000000..90190e6
--- /dev/null
@@ -0,0 +1,89 @@
+//========================================================================
+//
+// Outline.h
+//
+// Copyright 2002-2003 Glyph & Cog, LLC
+//
+//========================================================================
+
+//========================================================================
+//
+// Modified under the Poppler project - http://poppler.freedesktop.org
+//
+// All changes made under the Poppler project to this file are licensed
+// under GPL version 2 or later
+//
+// Copyright (C) 2005 Marco Pesenti Gritti <mpg@redhat.com>
+//
+// To see a description of the changes please see the Changelog file that
+// came with your tarball or type make ChangeLog if you are building from git
+//
+//========================================================================
+
+#ifndef OUTLINE_H
+#define OUTLINE_H
+
+#ifdef USE_GCC_PRAGMAS
+#pragma interface
+#endif
+
+#include "Object.h"
+#include "CharTypes.h"
+
+class GooString;
+class GooList;
+class XRef;
+class LinkAction;
+
+//------------------------------------------------------------------------
+
+class Outline {
+public:
+
+  Outline(Object *outlineObj, XRef *xref);
+  ~Outline();
+
+  GooList *getItems() { return items; }
+
+private:
+
+  GooList *items;              // NULL if document has no outline,
+                               // otherwise, a list of OutlineItem
+};
+
+//------------------------------------------------------------------------
+
+class OutlineItem {
+public:
+
+  OutlineItem(Dict *dict, XRef *xrefA);
+  ~OutlineItem();
+
+  static GooList *readItemList(Object *firstItemRef, Object *lastItemRef,
+                            XRef *xrefA);
+
+  void open();
+  void close();
+
+  Unicode *getTitle() { return title; }
+  int getTitleLength() { return titleLen; }
+  LinkAction *getAction() { return action; }
+  GBool isOpen() { return startsOpen; }
+  GBool hasKids() { return firstRef.isRef(); }
+  GooList *getKids() { return kids; }
+
+private:
+
+  XRef *xref;
+  Unicode *title;
+  int titleLen;
+  LinkAction *action;
+  Object firstRef;
+  Object lastRef;
+  Object nextRef;
+  GBool startsOpen;
+  GooList *kids;       // NULL if this item is closed or has no kids,
+                       // otherwise a list of OutlineItem
+};
+
+#endif
diff --git a/poppler/OutputDev.cc b/poppler/OutputDev.cc
new file mode 100644 (file)
index 0000000..54580d0
--- /dev/null
@@ -0,0 +1,195 @@
+//========================================================================
+//
+// OutputDev.cc
+//
+// Copyright 1996-2003 Glyph & Cog, LLC
+//
+//========================================================================
+
+//========================================================================
+//
+// Modified under the Poppler project - http://poppler.freedesktop.org
+//
+// All changes made under the Poppler project to this file are licensed
+// under GPL version 2 or later
+//
+// Copyright (C) 2005 Jonathan Blandford <jrb@redhat.com>
+// Copyright (C) 2006 Thorkild Stray <thorkild@ifi.uio.no>
+// Copyright (C) 2007 Adrian Johnson <ajohnson@redneon.com>
+// Copyright (C) 2009 Carlos Garcia Campos <carlosgc@gnome.org>
+// Copyright (C) 2009, 2012 Albert Astals Cid <aacid@kde.org>
+// Copyright (C) 2012 Thomas Freitag <Thomas.Freitag@alfa.de>
+//
+// To see a description of the changes please see the Changelog file that
+// came with your tarball or type make ChangeLog if you are building from git
+//
+//========================================================================
+
+#include <config.h>
+
+#ifdef USE_GCC_PRAGMAS
+#pragma implementation
+#endif
+
+#include <stddef.h>
+#include "Object.h"
+#include "Stream.h"
+#include "GfxState.h"
+#include "OutputDev.h"
+#include "goo/GooHash.h"
+
+//------------------------------------------------------------------------
+// OutputDev
+//------------------------------------------------------------------------
+
+void OutputDev::setDefaultCTM(double *ctm) {
+  int i;
+  double det;
+
+  for (i = 0; i < 6; ++i) {
+    defCTM[i] = ctm[i];
+  }
+  det = 1 / (defCTM[0] * defCTM[3] - defCTM[1] * defCTM[2]);
+  defICTM[0] = defCTM[3] * det;
+  defICTM[1] = -defCTM[1] * det;
+  defICTM[2] = -defCTM[2] * det;
+  defICTM[3] = defCTM[0] * det;
+  defICTM[4] = (defCTM[2] * defCTM[5] - defCTM[3] * defCTM[4]) * det;
+  defICTM[5] = (defCTM[1] * defCTM[4] - defCTM[0] * defCTM[5]) * det;
+}
+
+void OutputDev::cvtDevToUser(double dx, double dy, double *ux, double *uy) {
+  *ux = defICTM[0] * dx + defICTM[2] * dy + defICTM[4];
+  *uy = defICTM[1] * dx + defICTM[3] * dy + defICTM[5];
+}
+
+void OutputDev::cvtUserToDev(double ux, double uy, int *dx, int *dy) {
+  *dx = (int)(defCTM[0] * ux + defCTM[2] * uy + defCTM[4] + 0.5);
+  *dy = (int)(defCTM[1] * ux + defCTM[3] * uy + defCTM[5] + 0.5);
+}
+
+void OutputDev::updateAll(GfxState *state) {
+  updateLineDash(state);
+  updateFlatness(state);
+  updateLineJoin(state);
+  updateLineCap(state);
+  updateMiterLimit(state);
+  updateLineWidth(state);
+  updateStrokeAdjust(state);
+  updateFillColorSpace(state);
+  updateFillColor(state);
+  updateStrokeColorSpace(state);
+  updateStrokeColor(state);
+  updateBlendMode(state);
+  updateFillOpacity(state);
+  updateStrokeOpacity(state);
+  updateFillOverprint(state);
+  updateStrokeOverprint(state);
+  updateTransfer(state);
+  updateFont(state);
+}
+
+GBool OutputDev::beginType3Char(GfxState *state, double x, double y,
+                               double dx, double dy,
+                               CharCode code, Unicode *u, int uLen) {
+  return gFalse;
+}
+
+void OutputDev::drawImageMask(GfxState *state, Object *ref, Stream *str,
+                             int width, int height, GBool invert,
+                             GBool interpolate, GBool inlineImg) {
+  int i, j;
+
+  if (inlineImg) {
+    str->reset();
+    j = height * ((width + 7) / 8);
+    for (i = 0; i < j; ++i)
+      str->getChar();
+    str->close();
+  }
+}
+
+void OutputDev::setSoftMaskFromImageMask(GfxState *state,
+                                        Object *ref, Stream *str,
+                                        int width, int height, GBool invert,
+                                        GBool inlineImg, double *baseMatrix) {
+  drawImageMask(state, ref, str, width, height, invert, gFalse, inlineImg);
+}
+
+void OutputDev::unsetSoftMaskFromImageMask(GfxState *state, double *baseMatrix) {
+  return;
+}
+
+void OutputDev::drawImage(GfxState *state, Object *ref, Stream *str,
+                         int width, int height, GfxImageColorMap *colorMap,
+                         GBool interpolate, int *maskColors, GBool inlineImg) {
+  int i, j;
+
+  if (inlineImg) {
+    str->reset();
+    j = height * ((width * colorMap->getNumPixelComps() *
+                  colorMap->getBits() + 7) / 8);
+    for (i = 0; i < j; ++i)
+      str->getChar();
+    str->close();
+  }
+}
+
+void OutputDev::drawMaskedImage(GfxState *state, Object *ref, Stream *str,
+                               int width, int height,
+                               GfxImageColorMap *colorMap,
+                               GBool interpolate,
+                               Stream *maskStr,
+                               int maskWidth, int maskHeight,
+                               GBool maskInvert,
+                               GBool maskInterpolate) {
+  drawImage(state, ref, str, width, height, colorMap, interpolate, NULL, gFalse);
+}
+
+void OutputDev::drawSoftMaskedImage(GfxState *state, Object *ref, Stream *str,
+                                   int width, int height,
+                                   GfxImageColorMap *colorMap,
+                                   GBool interpolate,
+                                   Stream *maskStr,
+                                   int maskWidth, int maskHeight,
+                                   GfxImageColorMap *maskColorMap,
+                                   GBool maskInterpolate) {
+  drawImage(state, ref, str, width, height, colorMap, interpolate, NULL, gFalse);
+}
+
+void OutputDev::endMarkedContent(GfxState *state) {
+}
+
+void OutputDev::beginMarkedContent(char *name, Dict *properties) {
+}
+
+void OutputDev::markPoint(char *name) {
+}
+
+void OutputDev::markPoint(char *name, Dict *properties) {
+}
+
+
+#if OPI_SUPPORT
+void OutputDev::opiBegin(GfxState *state, Dict *opiDict) {
+}
+
+void OutputDev::opiEnd(GfxState *state, Dict *opiDict) {
+}
+#endif
+
+void OutputDev::startProfile() {
+  if (profileHash)
+    delete profileHash;
+
+  profileHash = new GooHash (true);
+}
+
+GooHash *OutputDev::endProfile() {
+  GooHash *profile = profileHash;
+
+  profileHash = NULL;
+
+  return profile;
+}
+
diff --git a/poppler/OutputDev.h b/poppler/OutputDev.h
new file mode 100644 (file)
index 0000000..15af90a
--- /dev/null
@@ -0,0 +1,331 @@
+//========================================================================
+//
+// OutputDev.h
+//
+// Copyright 1996-2003 Glyph & Cog, LLC
+//
+//========================================================================
+
+//========================================================================
+//
+// Modified under the Poppler project - http://poppler.freedesktop.org
+//
+// All changes made under the Poppler project to this file are licensed
+// under GPL version 2 or later
+//
+// Copyright (C) 2005 Jonathan Blandford <jrb@redhat.com>
+// Copyright (C) 2006 Thorkild Stray <thorkild@ifi.uio.no>
+// Copyright (C) 2007 Jeff Muizelaar <jeff@infidigm.net>
+// Copyright (C) 2007, 2011 Adrian Johnson <ajohnson@redneon.com>
+// Copyright (C) 2009-2012 Thomas Freitag <Thomas.Freitag@alfa.de>
+// Copyright (C) 2009, 2011 Carlos Garcia Campos <carlosgc@gnome.org>
+// Copyright (C) 2009, 2012 Albert Astals Cid <aacid@kde.org>
+// Copyright (C) 2010 Christian Feuersänger <cfeuersaenger@googlemail.com>
+// Copyright (C) 2012 Fabio D'Urso <fabiodurso@hotmail.it>
+//
+// To see a description of the changes please see the Changelog file that
+// came with your tarball or type make ChangeLog if you are building from git
+//
+//========================================================================
+
+#ifndef OUTPUTDEV_H
+#define OUTPUTDEV_H
+
+#ifdef USE_GCC_PRAGMAS
+#pragma interface
+#endif
+
+#include "poppler-config.h"
+#include "goo/gtypes.h"
+#include "CharTypes.h"
+#include "Object.h"
+
+class Annot;
+class Dict;
+class GooHash;
+class GooString;
+class GfxState;
+class Gfx;
+struct GfxColor;
+class GfxColorSpace;
+class GfxImageColorMap;
+class GfxFunctionShading;
+class GfxAxialShading;
+class GfxGouraudTriangleShading;
+class GfxPatchMeshShading;
+class GfxRadialShading;
+class GfxGouraudTriangleShading;
+class GfxPatchMeshShading;
+class Stream;
+class Links;
+class AnnotLink;
+class Catalog;
+class Page;
+class Function;
+
+//------------------------------------------------------------------------
+// OutputDev
+//------------------------------------------------------------------------
+
+class OutputDev {
+public:
+
+  // Constructor.
+  OutputDev() { profileHash = NULL; }
+
+  // Destructor.
+  virtual ~OutputDev() {}
+
+  //----- get info about output device
+
+  // Does this device use upside-down coordinates?
+  // (Upside-down means (0,0) is the top left corner of the page.)
+  virtual GBool upsideDown() = 0;
+
+  // Does this device use drawChar() or drawString()?
+  virtual GBool useDrawChar() = 0;
+
+  // Does this device use tilingPatternFill()?  If this returns false,
+  // tiling pattern fills will be reduced to a series of other drawing
+  // operations.
+  virtual GBool useTilingPatternFill() { return gFalse; }
+
+  // Does this device support specific shading types?
+  // see gouraudTriangleShadedFill() and patchMeshShadedFill()
+  virtual GBool useShadedFills(int type) { return gFalse; }
+
+  // Does this device use FillColorStop()?
+  virtual GBool useFillColorStop() { return gFalse; }
+
+  // Does this device use drawForm()?  If this returns false,
+  // form-type XObjects will be interpreted (i.e., unrolled).
+  virtual GBool useDrawForm() { return gFalse; }
+
+  // Does this device use beginType3Char/endType3Char?  Otherwise,
+  // text in Type 3 fonts will be drawn with drawChar/drawString.
+  virtual GBool interpretType3Chars() = 0;
+
+  // Does this device need non-text content?
+  virtual GBool needNonText() { return gTrue; }
+
+  // Does this device require incCharCount to be called for text on
+  // non-shown layers?
+  virtual GBool needCharCount() { return gFalse; }
+
+  //----- initialization and control
+
+  // Set default transform matrix.
+  virtual void setDefaultCTM(double *ctm);
+
+  // Check to see if a page slice should be displayed.  If this
+  // returns false, the page display is aborted.  Typically, an
+  // OutputDev will use some alternate means to display the page
+  // before returning false.
+  virtual GBool checkPageSlice(Page *page, double hDPI, double vDPI,
+                              int rotate, GBool useMediaBox, GBool crop,
+                              int sliceX, int sliceY, int sliceW, int sliceH,
+                              GBool printing,
+                              GBool (* abortCheckCbk)(void *data) = NULL,
+                              void * abortCheckCbkData = NULL,
+                              GBool (*annotDisplayDecideCbk)(Annot *annot, void *user_data) = NULL,
+                              void *annotDisplayDecideCbkData = NULL)
+    { return gTrue; }
+
+  // Start a page.
+  virtual void startPage(int pageNum, GfxState *state) {}
+
+  // End a page.
+  virtual void endPage() {}
+
+  // Dump page contents to display.
+  virtual void dump() {}
+
+  //----- coordinate conversion
+
+  // Convert between device and user coordinates.
+  virtual void cvtDevToUser(double dx, double dy, double *ux, double *uy);
+  virtual void cvtUserToDev(double ux, double uy, int *dx, int *dy);
+
+  double *getDefCTM() { return defCTM; }
+  double *getDefICTM() { return defICTM; }
+
+  //----- save/restore graphics state
+  virtual void saveState(GfxState * /*state*/) {}
+  virtual void restoreState(GfxState * /*state*/) {}
+
+  //----- update graphics state
+  virtual void updateAll(GfxState *state);
+  virtual void updateCTM(GfxState * /*state*/, double /*m11*/, double /*m12*/,
+                        double /*m21*/, double /*m22*/, double /*m31*/, double /*m32*/) {}
+  virtual void updateLineDash(GfxState * /*state*/) {}
+  virtual void updateFlatness(GfxState * /*state*/) {}
+  virtual void updateLineJoin(GfxState * /*state*/) {}
+  virtual void updateLineCap(GfxState * /*state*/) {}
+  virtual void updateMiterLimit(GfxState * /*state*/) {}
+  virtual void updateLineWidth(GfxState * /*state*/) {}
+  virtual void updateStrokeAdjust(GfxState * /*state*/) {}
+  virtual void updateAlphaIsShape(GfxState * /*state*/) {}
+  virtual void updateTextKnockout(GfxState * /*state*/) {}
+  virtual void updateFillColorSpace(GfxState * /*state*/) {}
+  virtual void updateStrokeColorSpace(GfxState * /*state*/) {}
+  virtual void updateFillColor(GfxState * /*state*/) {}
+  virtual void updateStrokeColor(GfxState * /*state*/) {}
+  virtual void updateBlendMode(GfxState * /*state*/) {}
+  virtual void updateFillOpacity(GfxState * /*state*/) {}
+  virtual void updateStrokeOpacity(GfxState * /*state*/) {}
+  virtual void updateFillOverprint(GfxState * /*state*/) {}
+  virtual void updateStrokeOverprint(GfxState * /*state*/) {}
+  virtual void updateOverprintMode(GfxState * /*state*/) {}
+  virtual void updateTransfer(GfxState * /*state*/) {}
+  virtual void updateFillColorStop(GfxState * /*state*/, double /*offset*/) {}
+
+  //----- update text state
+  virtual void updateFont(GfxState * /*state*/) {}
+  virtual void updateTextMat(GfxState * /*state*/) {}
+  virtual void updateCharSpace(GfxState * /*state*/) {}
+  virtual void updateRender(GfxState * /*state*/) {}
+  virtual void updateRise(GfxState * /*state*/) {}
+  virtual void updateWordSpace(GfxState * /*state*/) {}
+  virtual void updateHorizScaling(GfxState * /*state*/) {}
+  virtual void updateTextPos(GfxState * /*state*/) {}
+  virtual void updateTextShift(GfxState * /*state*/, double /*shift*/) {}
+  virtual void saveTextPos(GfxState * /*state*/) {}
+  virtual void restoreTextPos(GfxState * /*state*/) {}
+
+  //----- path painting
+  virtual void stroke(GfxState * /*state*/) {}
+  virtual void fill(GfxState * /*state*/) {}
+  virtual void eoFill(GfxState * /*state*/) {}
+  virtual GBool tilingPatternFill(GfxState * /*state*/, Gfx * /*gfx*/, Catalog * /*cat*/, Object * /*str*/,
+                                 double * /*pmat*/, int /*paintType*/, int /*tilingType*/, Dict * /*resDict*/,
+                                 double * /*mat*/, double * /*bbox*/,
+                                 int /*x0*/, int /*y0*/, int /*x1*/, int /*y1*/,
+                                 double /*xStep*/, double /*yStep*/)
+    { return gFalse; }
+  virtual GBool functionShadedFill(GfxState * /*state*/,
+                                  GfxFunctionShading * /*shading*/)
+    { return gFalse; }
+  virtual GBool axialShadedFill(GfxState * /*state*/, GfxAxialShading * /*shading*/, double /*tMin*/, double /*tMax*/)
+    { return gFalse; }
+  virtual GBool axialShadedSupportExtend(GfxState * /*state*/, GfxAxialShading * /*shading*/)
+    { return gFalse; }
+  virtual GBool radialShadedFill(GfxState * /*state*/, GfxRadialShading * /*shading*/, double /*sMin*/, double /*sMax*/)
+    { return gFalse; }
+  virtual GBool radialShadedSupportExtend(GfxState * /*state*/, GfxRadialShading * /*shading*/)
+    { return gFalse; }
+  virtual GBool gouraudTriangleShadedFill(GfxState *state, GfxGouraudTriangleShading *shading)
+    { return gFalse; }
+  virtual GBool patchMeshShadedFill(GfxState *state, GfxPatchMeshShading *shading)
+    { return gFalse; }
+
+  //----- path clipping
+  virtual void clip(GfxState * /*state*/) {}
+  virtual void eoClip(GfxState * /*state*/) {}
+  virtual void clipToStrokePath(GfxState * /*state*/) {}
+
+  //----- text drawing
+  virtual void beginStringOp(GfxState * /*state*/) {}
+  virtual void endStringOp(GfxState * /*state*/) {}
+  virtual void beginString(GfxState * /*state*/, GooString * /*s*/) {}
+  virtual void endString(GfxState * /*state*/) {}
+  virtual void drawChar(GfxState * /*state*/, double /*x*/, double /*y*/,
+                       double /*dx*/, double /*dy*/,
+                       double /*originX*/, double /*originY*/,
+                       CharCode /*code*/, int /*nBytes*/, Unicode * /*u*/, int /*uLen*/) {}
+  virtual void drawString(GfxState * /*state*/, GooString * /*s*/) {}
+  virtual GBool beginType3Char(GfxState * /*state*/, double /*x*/, double /*y*/,
+                              double /*dx*/, double /*dy*/,
+                              CharCode /*code*/, Unicode * /*u*/, int /*uLen*/);
+  virtual void endType3Char(GfxState * /*state*/) {}
+  virtual void beginTextObject(GfxState * /*state*/) {}
+  virtual GBool deviceHasTextClip(GfxState * /*state*/) { return gFalse; }
+  virtual void endTextObject(GfxState * /*state*/) {}
+  virtual void incCharCount(int /*nChars*/) {}
+  virtual void beginActualText(GfxState * /*state*/, GooString * /*text*/ ) {}
+  virtual void endActualText(GfxState * /*state*/) {}
+
+  //----- image drawing
+  virtual void drawImageMask(GfxState *state, Object *ref, Stream *str,
+                            int width, int height, GBool invert, GBool interpolate,
+                            GBool inlineImg);
+  virtual void setSoftMaskFromImageMask(GfxState *state,
+                                       Object *ref, Stream *str,
+                                       int width, int height, GBool invert,
+                                       GBool inlineImg, double *baseMatrix);
+  virtual void unsetSoftMaskFromImageMask(GfxState *state, double *baseMatrix);
+  virtual void drawImage(GfxState *state, Object *ref, Stream *str,
+                        int width, int height, GfxImageColorMap *colorMap,
+                        GBool interpolate, int *maskColors, GBool inlineImg);
+  virtual void drawMaskedImage(GfxState *state, Object *ref, Stream *str,
+                              int width, int height,
+                              GfxImageColorMap *colorMap, GBool interpolate,
+                              Stream *maskStr, int maskWidth, int maskHeight,
+                              GBool maskInvert, GBool maskInterpolate);
+  virtual void drawSoftMaskedImage(GfxState *state, Object *ref, Stream *str,
+                                  int width, int height,
+                                  GfxImageColorMap *colorMap,
+                                  GBool interpolate,
+                                  Stream *maskStr,
+                                  int maskWidth, int maskHeight,
+                                  GfxImageColorMap *maskColorMap,
+                                  GBool maskInterpolate);
+
+  //----- grouping operators
+
+  virtual void endMarkedContent(GfxState *state);
+  virtual void beginMarkedContent(char *name, Dict *properties);
+  virtual void markPoint(char *name);
+  virtual void markPoint(char *name, Dict *properties);
+
+
+
+#if OPI_SUPPORT
+  //----- OPI functions
+  virtual void opiBegin(GfxState *state, Dict *opiDict);
+  virtual void opiEnd(GfxState *state, Dict *opiDict);
+#endif
+
+  //----- Type 3 font operators
+  virtual void type3D0(GfxState * /*state*/, double /*wx*/, double /*wy*/) {}
+  virtual void type3D1(GfxState * /*state*/, double /*wx*/, double /*wy*/,
+                      double /*llx*/, double /*lly*/, double /*urx*/, double /*ury*/) {}
+
+  //----- form XObjects
+  virtual void drawForm(Ref /*id*/) {}
+
+  //----- PostScript XObjects
+  virtual void psXObject(Stream * /*psStream*/, Stream * /*level1Stream*/) {}
+
+  //----- Profiling
+  virtual void startProfile();
+  virtual GooHash *getProfileHash() {return profileHash; }
+  virtual GooHash *endProfile();
+
+  //----- transparency groups and soft masks
+  virtual GBool checkTransparencyGroup(GfxState * /*state*/, GBool /*knockout*/) { return gTrue; }
+  virtual void beginTransparencyGroup(GfxState * /*state*/, double * /*bbox*/,
+                                     GfxColorSpace * /*blendingColorSpace*/,
+                                     GBool /*isolated*/, GBool /*knockout*/,
+                                     GBool /*forSoftMask*/) {}
+  virtual void endTransparencyGroup(GfxState * /*state*/) {}
+  virtual void paintTransparencyGroup(GfxState * /*state*/, double * /*bbox*/) {}
+  virtual void setSoftMask(GfxState * /*state*/, double * /*bbox*/, GBool /*alpha*/,
+                          Function * /*transferFunc*/, GfxColor * /*backdropColor*/) {}
+  virtual void clearSoftMask(GfxState * /*state*/) {}
+
+  //----- links
+  virtual void processLink(AnnotLink * /*link*/) {}
+
+#if 1 //~tmp: turn off anti-aliasing temporarily
+  virtual GBool getVectorAntialias() { return gFalse; }
+  virtual void setVectorAntialias(GBool /*vaa*/) {}
+#endif
+
+private:
+
+  double defCTM[6];            // default coordinate transform matrix
+  double defICTM[6];           // inverse of default CTM
+  GooHash *profileHash;
+};
+
+#endif
diff --git a/poppler/PDFDoc.cc b/poppler/PDFDoc.cc
new file mode 100644 (file)
index 0000000..ce01ca3
--- /dev/null
@@ -0,0 +1,1644 @@
+//========================================================================
+//
+// PDFDoc.cc
+//
+// Copyright 1996-2003 Glyph & Cog, LLC
+//
+//========================================================================
+
+//========================================================================
+//
+// Modified under the Poppler project - http://poppler.freedesktop.org
+//
+// All changes made under the Poppler project to this file are licensed
+// under GPL version 2 or later
+//
+// Copyright (C) 2005, 2006, 2008 Brad Hards <bradh@frogmouth.net>
+// Copyright (C) 2005, 2007-2009, 2011, 2012 Albert Astals Cid <aacid@kde.org>
+// Copyright (C) 2008 Julien Rebetez <julienr@svn.gnome.org>
+// Copyright (C) 2008, 2010 Pino Toscano <pino@kde.org>
+// Copyright (C) 2008, 2010, 2011 Carlos Garcia Campos <carlosgc@gnome.org>
+// Copyright (C) 2009 Eric Toombs <ewtoombs@uwaterloo.ca>
+// Copyright (C) 2009 Kovid Goyal <kovid@kovidgoyal.net>
+// Copyright (C) 2009, 2011 Axel Struebing <axel.struebing@freenet.de>
+// Copyright (C) 2010, 2011 Hib Eris <hib@hiberis.nl>
+// Copyright (C) 2010 Jakub Wilk <ubanus@users.sf.net>
+// Copyright (C) 2010 Ilya Gorenbein <igorenbein@finjan.com>
+// Copyright (C) 2010 Srinivas Adicherla <srinivas.adicherla@geodesic.com>
+// Copyright (C) 2010 Philip Lorenz <lorenzph+freedesktop@gmail.com>
+// Copyright (C) 2011, 2012 Thomas Freitag <Thomas.Freitag@alfa.de>
+// Copyright (C) 2012 Fabio D'Urso <fabiodurso@hotmail.it>
+//
+// To see a description of the changes please see the Changelog file that
+// came with your tarball or type make ChangeLog if you are building from git
+//
+//========================================================================
+
+#include <config.h>
+
+#ifdef USE_GCC_PRAGMAS
+#pragma implementation
+#endif
+
+#include <ctype.h>
+#include <locale.h>
+#include <stdio.h>
+#include <errno.h>
+#include <stdlib.h>
+#include <stddef.h>
+#include <string.h>
+#include <time.h>
+#ifdef _WIN32
+#  include <windows.h>
+#endif
+#include <sys/stat.h>
+#include "goo/gstrtod.h"
+#include "goo/GooString.h"
+#include "poppler-config.h"
+#include "GlobalParams.h"
+#include "Page.h"
+#include "Catalog.h"
+#include "Stream.h"
+#include "XRef.h"
+#include "Linearization.h"
+#include "Link.h"
+#include "OutputDev.h"
+#include "Error.h"
+#include "ErrorCodes.h"
+#include "Lexer.h"
+#include "Parser.h"
+#include "SecurityHandler.h"
+#include "Decrypt.h"
+#ifndef DISABLE_OUTLINE
+#include "Outline.h"
+#endif
+#include "PDFDoc.h"
+#include "Hints.h"
+
+//------------------------------------------------------------------------
+
+#define headerSearchSize 1024  // read this many bytes at beginning of
+                               //   file to look for '%PDF'
+#define pdfIdLength 32   // PDF Document IDs (PermanentId, UpdateId) length
+
+#define linearizationSearchSize 1024   // read this many bytes at beginning of
+                                       // file to look for linearization
+                                       // dictionary
+
+#define xrefSearchSize 1024    // read this many bytes at end of file
+                               //   to look for 'startxref'
+
+//------------------------------------------------------------------------
+// PDFDoc
+//------------------------------------------------------------------------
+
+void PDFDoc::init()
+{
+  ok = gFalse;
+  errCode = errNone;
+  fileName = NULL;
+  file = NULL;
+  str = NULL;
+  xref = NULL;
+  linearization = NULL;
+  catalog = NULL;
+  hints = NULL;
+#ifndef DISABLE_OUTLINE
+  outline = NULL;
+#endif
+  startXRefPos = ~(Guint)0;
+  secHdlr = NULL;
+  pageCache = NULL;
+}
+
+PDFDoc::PDFDoc()
+{
+  init();
+}
+
+PDFDoc::PDFDoc(GooString *fileNameA, GooString *ownerPassword,
+              GooString *userPassword, void *guiDataA) {
+  Object obj;
+  int size = 0;
+#ifdef _WIN32
+  int n, i;
+#endif
+
+  init();
+
+  fileName = fileNameA;
+  guiData = guiDataA;
+#ifdef _WIN32
+  n = fileName->getLength();
+  fileNameU = (wchar_t *)gmallocn(n + 1, sizeof(wchar_t));
+  for (i = 0; i < n; ++i) {
+    fileNameU[i] = (wchar_t)(fileName->getChar(i) & 0xff);
+  }
+  fileNameU[n] = L'\0';
+#endif
+
+  struct stat buf;
+  if (stat(fileName->getCString(), &buf) == 0) {
+     size = buf.st_size;
+  }
+
+  // try to open file
+#ifdef VMS
+  file = fopen(fileName->getCString(), "rb", "ctx=stm");
+#else
+  file = fopen(fileName->getCString(), "rb");
+#endif
+  if (file == NULL) {
+    // fopen() has failed.
+    // Keep a copy of the errno returned by fopen so that it can be 
+    // referred to later.
+    fopenErrno = errno;
+    error(errIO, -1, "Couldn't open file '{0:t}': {0:s}.", fileName, strerror(errno));
+    errCode = errOpenFile;
+    return;
+  }
+
+  // create stream
+  obj.initNull();
+  str = new FileStream(file, 0, gFalse, size, &obj);
+
+  ok = setup(ownerPassword, userPassword);
+}
+
+#ifdef _WIN32
+PDFDoc::PDFDoc(wchar_t *fileNameA, int fileNameLen, GooString *ownerPassword,
+              GooString *userPassword, void *guiDataA) {
+  OSVERSIONINFO version;
+  Object obj;
+  int i;
+
+  init();
+
+  guiData = guiDataA;
+
+  // save both Unicode and 8-bit copies of the file name
+  fileName = new GooString();
+  fileNameU = (wchar_t *)gmallocn(fileNameLen + 1, sizeof(wchar_t));
+  for (i = 0; i < fileNameLen; ++i) {
+    fileName->append((char)fileNameA[i]);
+    fileNameU[i] = fileNameA[i];
+  }
+  fileNameU[fileNameLen] = L'\0';
+
+
+  // try to open file
+  // NB: _wfopen is only available in NT
+  struct _stat buf;
+  int size;
+  version.dwOSVersionInfoSize = sizeof(version);
+  GetVersionEx(&version);
+  if (version.dwPlatformId == VER_PLATFORM_WIN32_NT) {
+    if (_wstat(fileNameU, &buf) == 0) {
+      size = buf.st_size;
+    }
+    file = _wfopen(fileNameU, L"rb");
+  } else {
+    if (_stat(fileName->getCString(), &buf) == 0) {
+      size = buf.st_size;
+    }
+    file = fopen(fileName->getCString(), "rb");
+  }
+  if (!file) {
+    error(errIO, -1, "Couldn't open file '{0:t}'", fileName);
+    errCode = errOpenFile;
+    return;
+  }
+
+  // create stream
+  obj.initNull();
+  str = new FileStream(file, 0, gFalse, size, &obj);
+
+  ok = setup(ownerPassword, userPassword);
+}
+#endif
+
+PDFDoc::PDFDoc(BaseStream *strA, GooString *ownerPassword,
+              GooString *userPassword, void *guiDataA) {
+#ifdef _WIN32
+  int n, i;
+#endif
+
+  init();
+  guiData = guiDataA;
+  if (strA->getFileName()) {
+    fileName = strA->getFileName()->copy();
+#ifdef _WIN32
+    n = fileName->getLength();
+    fileNameU = (wchar_t *)gmallocn(n + 1, sizeof(wchar_t));
+    for (i = 0; i < n; ++i) {
+      fileNameU[i] = (wchar_t)(fileName->getChar(i) & 0xff);
+    }
+    fileNameU[n] = L'\0';
+#endif
+  } else {
+    fileName = NULL;
+#ifdef _WIN32
+    fileNameU = NULL;
+#endif
+  }
+  str = strA;
+  ok = setup(ownerPassword, userPassword);
+}
+
+GBool PDFDoc::setup(GooString *ownerPassword, GooString *userPassword) {
+  str->setPos(0, -1);
+  if (str->getPos() < 0)
+  {
+    error(errSyntaxError, -1, "Document base stream is not seekable");
+    return gFalse;
+  }
+
+  str->reset();
+
+  // check footer
+  // Adobe does not seem to enforce %%EOF, so we do the same
+//  if (!checkFooter()) return gFalse;
+  
+  // check header
+  checkHeader();
+
+  GBool wasReconstructed = false;
+
+  // read xref table
+  xref = new XRef(str, getStartXRef(), getMainXRefEntriesOffset(), &wasReconstructed);
+  if (!xref->isOk()) {
+    error(errSyntaxError, -1, "Couldn't read xref table");
+    errCode = xref->getErrorCode();
+    return gFalse;
+  }
+
+  // check for encryption
+  if (!checkEncryption(ownerPassword, userPassword)) {
+    errCode = errEncrypted;
+    return gFalse;
+  }
+
+  // read catalog
+  catalog = new Catalog(this);
+  if (catalog && !catalog->isOk()) {
+    if (!wasReconstructed)
+    {
+      // try one more time to contruct the Catalog, maybe the problem is damaged XRef 
+      delete catalog;
+      delete xref;
+      xref = new XRef(str, 0, 0, NULL, true);
+      catalog = new Catalog(this);
+    }
+
+    if (catalog && !catalog->isOk()) {
+      error(errSyntaxError, -1, "Couldn't read page catalog");
+      errCode = errBadCatalog;
+      return gFalse;
+    }
+  }
+
+  // done
+  return gTrue;
+}
+
+PDFDoc::~PDFDoc() {
+  if (pageCache) {
+    for (int i = 0; i < getNumPages(); i++) {
+      if (pageCache[i]) {
+        delete pageCache[i];
+      }
+    }
+    gfree(pageCache);
+  }
+  delete secHdlr;
+#ifndef DISABLE_OUTLINE
+  if (outline) {
+    delete outline;
+  }
+#endif
+  if (catalog) {
+    delete catalog;
+  }
+  if (xref) {
+    delete xref;
+  }
+  if (hints) {
+    delete hints;
+  }
+  if (linearization) {
+    delete linearization;
+  }
+  if (str) {
+    delete str;
+  }
+  if (file) {
+    fclose(file);
+  }
+  if (fileName) {
+    delete fileName;
+  }
+#ifdef _WIN32
+  if (fileNameU) {
+    gfree(fileNameU);
+  }
+#endif
+}
+
+
+// Check for a %%EOF at the end of this stream
+GBool PDFDoc::checkFooter() {
+  // we look in the last 1024 chars because Adobe does the same
+  char *eof = new char[1025];
+  int pos = str->getPos();
+  str->setPos(1024, -1);
+  int i, ch;
+  for (i = 0; i < 1024; i++)
+  {
+    ch = str->getChar();
+    if (ch == EOF)
+      break;
+    eof[i] = ch;
+  }
+  eof[i] = '\0';
+
+  bool found = false;
+  for (i = i - 5; i >= 0; i--) {
+    if (strncmp (&eof[i], "%%EOF", 5) == 0) {
+      found = true;
+      break;
+    }
+  }
+  if (!found)
+  {
+    error(errSyntaxError, -1, "Document has not the mandatory ending %%EOF");
+    errCode = errDamaged;
+    delete[] eof;
+    return gFalse;
+  }
+  delete[] eof;
+  str->setPos(pos);
+  return gTrue;
+}
+  
+// Check for a PDF header on this stream.  Skip past some garbage
+// if necessary.
+void PDFDoc::checkHeader() {
+  char hdrBuf[headerSearchSize+1];
+  char *p;
+  char *tokptr;
+  int i;
+
+  pdfMajorVersion = 0;
+  pdfMinorVersion = 0;
+  for (i = 0; i < headerSearchSize; ++i) {
+    hdrBuf[i] = str->getChar();
+  }
+  hdrBuf[headerSearchSize] = '\0';
+  for (i = 0; i < headerSearchSize - 5; ++i) {
+    if (!strncmp(&hdrBuf[i], "%PDF-", 5)) {
+      break;
+    }
+  }
+  if (i >= headerSearchSize - 5) {
+    error(errSyntaxWarning, -1, "May not be a PDF file (continuing anyway)");
+    return;
+  }
+  str->moveStart(i);
+  if (!(p = strtok_r(&hdrBuf[i+5], " \t\n\r", &tokptr))) {
+    error(errSyntaxWarning, -1, "May not be a PDF file (continuing anyway)");
+    return;
+  }
+  sscanf(p, "%d.%d", &pdfMajorVersion, &pdfMinorVersion);
+  // We don't do the version check. Don't add it back in.
+}
+
+GBool PDFDoc::checkEncryption(GooString *ownerPassword, GooString *userPassword) {
+  Object encrypt;
+  GBool encrypted;
+  GBool ret;
+
+  xref->getTrailerDict()->dictLookup("Encrypt", &encrypt);
+  if ((encrypted = encrypt.isDict())) {
+    if ((secHdlr = SecurityHandler::make(this, &encrypt))) {
+      if (secHdlr->isUnencrypted()) {
+       // no encryption
+       ret = gTrue;
+      } else if (secHdlr->checkEncryption(ownerPassword, userPassword)) {
+       // authorization succeeded
+               xref->setEncryption(secHdlr->getPermissionFlags(),
+                           secHdlr->getOwnerPasswordOk(),
+                           secHdlr->getFileKey(),
+                           secHdlr->getFileKeyLength(),
+                           secHdlr->getEncVersion(),
+                           secHdlr->getEncRevision(),
+                           secHdlr->getEncAlgorithm());
+       ret = gTrue;
+      } else {
+       // authorization failed
+       ret = gFalse;
+      }
+    } else {
+      // couldn't find the matching security handler
+      ret = gFalse;
+    }
+  } else {
+    // document is not encrypted
+    ret = gTrue;
+  }
+  encrypt.free();
+  return ret;
+}
+
+void PDFDoc::displayPage(OutputDev *out, int page,
+                        double hDPI, double vDPI, int rotate,
+                        GBool useMediaBox, GBool crop, GBool printing,
+                        GBool (*abortCheckCbk)(void *data),
+                        void *abortCheckCbkData,
+                         GBool (*annotDisplayDecideCbk)(Annot *annot, void *user_data),
+                         void *annotDisplayDecideCbkData) {
+  if (globalParams->getPrintCommands()) {
+    printf("***** page %d *****\n", page);
+  }
+
+  if (getPage(page))
+    getPage(page)->display(out, hDPI, vDPI,
+                                   rotate, useMediaBox, crop, printing,
+                                   abortCheckCbk, abortCheckCbkData,
+                                   annotDisplayDecideCbk, annotDisplayDecideCbkData);
+
+}
+
+void PDFDoc::displayPages(OutputDev *out, int firstPage, int lastPage,
+                         double hDPI, double vDPI, int rotate,
+                         GBool useMediaBox, GBool crop, GBool printing,
+                         GBool (*abortCheckCbk)(void *data),
+                         void *abortCheckCbkData,
+                          GBool (*annotDisplayDecideCbk)(Annot *annot, void *user_data),
+                          void *annotDisplayDecideCbkData) {
+  int page;
+
+  for (page = firstPage; page <= lastPage; ++page) {
+    displayPage(out, page, hDPI, vDPI, rotate, useMediaBox, crop, printing,
+               abortCheckCbk, abortCheckCbkData,
+                annotDisplayDecideCbk, annotDisplayDecideCbkData);
+  }
+}
+
+void PDFDoc::displayPageSlice(OutputDev *out, int page,
+                             double hDPI, double vDPI, int rotate,
+                             GBool useMediaBox, GBool crop, GBool printing,
+                             int sliceX, int sliceY, int sliceW, int sliceH,
+                             GBool (*abortCheckCbk)(void *data),
+                             void *abortCheckCbkData,
+                              GBool (*annotDisplayDecideCbk)(Annot *annot, void *user_data),
+                              void *annotDisplayDecideCbkData) {
+  if (getPage(page))
+    getPage(page)->displaySlice(out, hDPI, vDPI,
+                                        rotate, useMediaBox, crop,
+                                        sliceX, sliceY, sliceW, sliceH,
+                                        printing,
+                                        abortCheckCbk, abortCheckCbkData,
+                                        annotDisplayDecideCbk, annotDisplayDecideCbkData);
+}
+
+Links *PDFDoc::getLinks(int page) {
+  Page *p = getPage(page);
+  if (!p) {
+    return new Links (NULL);
+  }
+  return p->getLinks();
+}
+
+void PDFDoc::processLinks(OutputDev *out, int page) {
+  if (getPage(page))
+    getPage(page)->processLinks(out);
+}
+
+Linearization *PDFDoc::getLinearization()
+{
+  if (!linearization) {
+    linearization = new Linearization(str);
+  }
+  return linearization;
+}
+
+GBool PDFDoc::isLinearized() {
+  if ((str->getLength()) &&
+      (getLinearization()->getLength() == str->getLength()))
+    return gTrue;
+  else
+    return gFalse;
+}
+
+static GBool
+get_id (GooString *encodedidstring, GooString *id) {
+  const char *encodedid = encodedidstring->getCString();
+  char pdfid[pdfIdLength + 1];
+  int n;
+
+  if (encodedidstring->getLength() != pdfIdLength / 2)
+    return gFalse;
+
+  n = sprintf(pdfid, "%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x",
+             encodedid[0] & 0xff, encodedid[1] & 0xff, encodedid[2] & 0xff, encodedid[3] & 0xff,
+             encodedid[4] & 0xff, encodedid[5] & 0xff, encodedid[6] & 0xff, encodedid[7] & 0xff,
+             encodedid[8] & 0xff, encodedid[9] & 0xff, encodedid[10] & 0xff, encodedid[11] & 0xff,
+             encodedid[12] & 0xff, encodedid[13] & 0xff, encodedid[14] & 0xff, encodedid[15] & 0xff);
+  if (n != pdfIdLength)
+    return gFalse;
+
+  id->Set(pdfid, pdfIdLength);
+  return gTrue;
+}
+
+GBool PDFDoc::getID(GooString *permanent_id, GooString *update_id) {
+  Object obj;
+  xref->getTrailerDict()->dictLookup ("ID", &obj);
+
+  if (obj.isArray() && obj.arrayGetLength() == 2) {
+    Object obj2;
+
+    if (permanent_id) {
+      if (obj.arrayGet(0, &obj2)->isString()) {
+        if (!get_id (obj2.getString(), permanent_id)) {
+         obj2.free();
+         return gFalse;
+       }
+      } else {
+        error(errSyntaxError, -1, "Invalid permanent ID");
+       obj2.free();
+       return gFalse;
+      }
+      obj2.free();
+    }
+
+    if (update_id) {
+      if (obj.arrayGet(1, &obj2)->isString()) {
+        if (!get_id (obj2.getString(), update_id)) {
+         obj2.free();
+         return gFalse;
+       }
+      } else {
+        error(errSyntaxError, -1, "Invalid update ID");
+       obj2.free();
+       return gFalse;
+      }
+      obj2.free();
+    }
+
+    obj.free();
+
+    return gTrue;
+  }
+  obj.free();
+
+  return gFalse;
+}
+
+Hints *PDFDoc::getHints()
+{
+  if (!hints && isLinearized()) {
+    hints = new Hints(str, getLinearization(), getXRef(), secHdlr);
+  }
+
+  return hints;
+}
+
+int PDFDoc::savePageAs(GooString *name, int pageNo) 
+{
+  FILE *f;
+  OutStream *outStr;
+  XRef *yRef, *countRef;
+  int rootNum = getXRef()->getNumObjects() + 1;
+
+  if (pageNo < 1 || pageNo > getNumPages()) {
+    error(errInternal, -1, "Illegal pageNo: {0:d}({1:d})", pageNo, getNumPages() );
+    return errOpenFile;
+  }
+  PDFRectangle *cropBox = NULL;
+  if (getCatalog()->getPage(pageNo)->isCropped()) {
+    cropBox = getCatalog()->getPage(pageNo)->getCropBox();
+  }
+  replacePageDict(pageNo, 
+    getCatalog()->getPage(pageNo)->getRotate(),
+    getCatalog()->getPage(pageNo)->getMediaBox(),
+    cropBox, NULL);
+  Ref *refPage = getCatalog()->getPageRef(pageNo);
+  Object page;
+  getXRef()->fetch(refPage->num, refPage->gen, &page);
+
+  if (!(f = fopen(name->getCString(), "wb"))) {
+    error(errIO, -1, "Couldn't open file '{0:t}'", name);
+    return errOpenFile;
+  }
+  outStr = new FileOutStream(f,0);
+
+  yRef = new XRef(getXRef()->getTrailerDict());
+  countRef = new XRef();
+  yRef->add(0, 65535, 0, gFalse);
+  writeHeader(outStr, getPDFMajorVersion(), getPDFMinorVersion());
+
+  // get and mark info dict
+  Object infoObj;
+  getXRef()->getDocInfo(&infoObj);
+  if (infoObj.isDict()) {
+    Dict *infoDict = infoObj.getDict();
+    markPageObjects(infoDict, yRef, countRef, 0);
+    Object *trailerObj = getXRef()->getTrailerDict();
+    if (trailerObj->isDict()) {
+      Dict *trailerDict = trailerObj->getDict();
+      Object ref;
+      trailerDict->lookupNF("Info", &ref);
+      if (ref.isRef()) {
+        yRef->add(ref.getRef().num, ref.getRef().gen, 0, gTrue);
+        if (getXRef()->getEntry(ref.getRef().num)->type == xrefEntryCompressed) {
+          yRef->getEntry(ref.getRef().num)->type = xrefEntryCompressed;
+        }
+      }
+      ref.free();
+    }
+  }
+  infoObj.free();
+  
+  // get and mark output intents etc.
+  Object catObj, pagesObj, resourcesObj;
+  getXRef()->getCatalog(&catObj);
+  Dict *catDict = catObj.getDict();
+  catDict->lookup("Pages", &pagesObj);
+  Dict *pagesDict = pagesObj.getDict();
+  pagesDict->lookup("Resources", &resourcesObj);
+  if (resourcesObj.isDict())
+    markPageObjects(resourcesObj.getDict(), yRef, countRef, 0);
+  markPageObjects(catDict, yRef, countRef, 0);
+
+  Dict *pageDict = page.getDict();
+  markPageObjects(pageDict, yRef, countRef, 0);
+  Guint objectsCount = writePageObjects(outStr, yRef, 0);
+
+  yRef->add(rootNum,0,outStr->getPos(),gTrue);
+  outStr->printf("%d 0 obj\n", rootNum);
+  outStr->printf("<< /Type /Catalog /Pages %d 0 R", rootNum + 1); 
+  for (int j = 0; j < catDict->getLength(); j++) {
+    const char *key = catDict->getKey(j);
+    if (strcmp(key, "Type") != 0 &&
+      strcmp(key, "Catalog") != 0 &&
+      strcmp(key, "Pages") != 0) 
+    {
+      if (j > 0) outStr->printf(" ");
+      Object value; catDict->getValNF(j, &value);
+      outStr->printf("/%s ", key);
+      writeObject(&value, NULL, outStr, getXRef(), 0);
+      value.free();
+    }
+  }
+  catObj.free();
+  pagesObj.free();
+  outStr->printf(">>\nendobj\n");
+  objectsCount++;
+
+  yRef->add(rootNum + 1,0,outStr->getPos(),gTrue);
+  outStr->printf("%d 0 obj\n", rootNum + 1);
+  outStr->printf("<< /Type /Pages /Kids [ %d 0 R ] /Count 1 ", rootNum + 2);
+  if (resourcesObj.isDict()) {
+    outStr->printf("/Resources ");
+    writeObject(&resourcesObj, NULL, outStr, getXRef(), 0);
+    resourcesObj.free();
+  }
+  outStr->printf(">>\n");
+  outStr->printf("endobj\n");
+  objectsCount++;
+
+  yRef->add(rootNum + 2,0,outStr->getPos(),gTrue);
+  outStr->printf("%d 0 obj\n", rootNum + 2);
+  outStr->printf("<< ");
+  for (int n = 0; n < pageDict->getLength(); n++) {
+    if (n > 0) outStr->printf(" ");
+    const char *key = pageDict->getKey(n);
+    Object value; pageDict->getValNF(n, &value);
+    if (strcmp(key, "Parent") == 0) {
+      outStr->printf("/Parent %d 0 R", rootNum + 1);
+    } else {
+      outStr->printf("/%s ", key);
+      writeObject(&value, NULL, outStr, getXRef(), 0); 
+    }
+    value.free();
+  }
+  outStr->printf(" >>\nendobj\n");
+  objectsCount++;
+  page.free();
+
+  Guint uxrefOffset = outStr->getPos();
+  Ref ref;
+  ref.num = rootNum;
+  ref.gen = 0;
+  Dict *trailerDict = createTrailerDict(objectsCount, gFalse, 0, &ref, getXRef(),
+                                        name->getCString(), uxrefOffset);
+  writeXRefTableTrailer(trailerDict, yRef, gFalse /* do not write unnecessary entries */,
+                        uxrefOffset, outStr, getXRef());
+  delete trailerDict;
+
+  outStr->close();
+  fclose(f);
+  delete yRef;
+  delete countRef;
+
+  return errNone;
+}
+
+int PDFDoc::saveAs(GooString *name, PDFWriteMode mode) {
+  FILE *f;
+  OutStream *outStr;
+  int res;
+
+  if (!(f = fopen(name->getCString(), "wb"))) {
+    error(errIO, -1, "Couldn't open file '{0:t}'", name);
+    return errOpenFile;
+  }
+  outStr = new FileOutStream(f,0);
+  res = saveAs(outStr, mode);
+  delete outStr;
+  fclose(f);
+  return res;
+}
+
+int PDFDoc::saveAs(OutStream *outStr, PDFWriteMode mode) {
+
+  // find if we have updated objects
+  GBool updated = gFalse;
+  for(int i=0; i<xref->getNumObjects(); i++) {
+    if (xref->getEntry(i)->updated) {
+      updated = gTrue;
+      break;
+    }
+  }
+
+  // we don't support rewriting files with Encrypt at the moment
+  Object obj;
+  xref->getTrailerDict()->getDict()->lookupNF("Encrypt", &obj);
+  if (!obj.isNull())
+  {
+    obj.free();
+    if (!updated && mode == writeStandard) {
+      // simply copy the original file
+      saveWithoutChangesAs (outStr);
+    } else {
+      return errEncrypted;
+    }
+  }
+  else
+  {
+    obj.free();
+
+    if (mode == writeForceRewrite) {
+      saveCompleteRewrite(outStr);
+    } else if (mode == writeForceIncremental) {
+      saveIncrementalUpdate(outStr); 
+    } else { // let poppler decide
+      if(updated) { 
+        saveIncrementalUpdate(outStr);
+      } else {
+        // simply copy the original file
+        saveWithoutChangesAs (outStr);
+      }
+    }
+  }
+
+  return errNone;
+}
+
+int PDFDoc::saveWithoutChangesAs(GooString *name) {
+  FILE *f;
+  OutStream *outStr;
+  int res;
+
+  if (!(f = fopen(name->getCString(), "wb"))) {
+    error(errIO, -1, "Couldn't open file '{0:t}'", name);
+    return errOpenFile;
+  }
+  
+  outStr = new FileOutStream(f,0);
+  res = saveWithoutChangesAs(outStr);
+  delete outStr;
+
+  fclose(f);
+
+  return res;
+}
+
+int PDFDoc::saveWithoutChangesAs(OutStream *outStr) {
+  int c;
+  
+  str->reset();
+  while ((c = str->getChar()) != EOF) {
+    outStr->put(c);
+  }
+  str->close();
+
+  return errNone;
+}
+
+void PDFDoc::saveIncrementalUpdate (OutStream* outStr)
+{
+  XRef *uxref;
+  int c;
+  //copy the original file
+  str->reset();
+  while ((c = str->getChar()) != EOF) {
+    outStr->put(c);
+  }
+  str->close();
+
+  uxref = new XRef();
+  uxref->add(0, 65535, 0, gFalse);
+  for(int i=0; i<xref->getNumObjects(); i++) {
+    if ((xref->getEntry(i)->type == xrefEntryFree) && 
+        (xref->getEntry(i)->gen == 0)) //we skip the irrelevant free objects
+      continue;
+
+    if (xref->getEntry(i)->updated) { //we have an updated object
+      Ref ref;
+      ref.num = i;
+      ref.gen = xref->getEntry(i)->type == xrefEntryCompressed ? 0 : xref->getEntry(i)->gen;
+      if (xref->getEntry(i)->type != xrefEntryFree) {
+        Object obj1;
+        xref->fetch(ref.num, ref.gen, &obj1);
+        Guint offset = writeObject(&obj1, &ref, outStr);
+        uxref->add(ref.num, ref.gen, offset, gTrue);
+        obj1.free();
+      } else {
+        uxref->add(ref.num, ref.gen, 0, gFalse);
+      }
+    }
+  }
+  if (uxref->getNumObjects() == 0) { //we have nothing to update
+    delete uxref;
+    return;
+  }
+
+  Guint uxrefOffset = outStr->getPos();
+  int numobjects = xref->getNumObjects();
+  const char *fileNameA = fileName ? fileName->getCString() : NULL;
+  Ref rootRef, uxrefStreamRef;
+  rootRef.num = getXRef()->getRootNum();
+  rootRef.gen = getXRef()->getRootGen();
+
+  // Output a xref stream if there is a xref stream already
+  GBool xRefStream = xref->isXRefStream();
+
+  if (xRefStream) {
+    // Append an entry for the xref stream itself
+    uxrefStreamRef.num = numobjects++;
+    uxrefStreamRef.gen = 0;
+    uxref->add(uxrefStreamRef.num, uxrefStreamRef.gen, uxrefOffset, gTrue);
+  }
+
+  Dict *trailerDict = createTrailerDict(numobjects, gTrue, getStartXRef(), &rootRef, getXRef(), fileNameA, uxrefOffset);
+  if (xRefStream) {
+    writeXRefStreamTrailer(trailerDict, uxref, &uxrefStreamRef, uxrefOffset, outStr, getXRef());
+  } else {
+    writeXRefTableTrailer(trailerDict, uxref, gFalse, uxrefOffset, outStr, getXRef());
+  }
+
+  delete trailerDict;
+  delete uxref;
+}
+
+void PDFDoc::saveCompleteRewrite (OutStream* outStr)
+{
+  outStr->printf("%%PDF-%d.%d\r\n",pdfMajorVersion,pdfMinorVersion);
+  XRef *uxref = new XRef();
+  uxref->add(0, 65535, 0, gFalse);
+  for(int i=0; i<xref->getNumObjects(); i++) {
+    Object obj1;
+    Ref ref;
+    XRefEntryType type = xref->getEntry(i)->type;
+    if (type == xrefEntryFree) {
+      ref.num = i;
+      ref.gen = xref->getEntry(i)->gen;
+      /* the XRef class adds a lot of irrelevant free entries, we only want the significant one
+          and we don't want the one with num=0 because it has already been added (gen = 65535)*/
+      if (ref.gen > 0 && ref.num > 0)
+        uxref->add(ref.num, ref.gen, 0, gFalse);
+    } else if (type == xrefEntryUncompressed){ 
+      ref.num = i;
+      ref.gen = xref->getEntry(i)->gen;
+      xref->fetch(ref.num, ref.gen, &obj1);
+      Guint offset = writeObject(&obj1, &ref, outStr);
+      uxref->add(ref.num, ref.gen, offset, gTrue);
+      obj1.free();
+    } else if (type == xrefEntryCompressed) {
+      ref.num = i;
+      ref.gen = 0; //compressed entries have gen == 0
+      xref->fetch(ref.num, ref.gen, &obj1);
+      Guint offset = writeObject(&obj1, &ref, outStr);
+      uxref->add(ref.num, ref.gen, offset, gTrue);
+      obj1.free();
+    }
+  }
+  Guint uxrefOffset = outStr->getPos();
+  writeXRefTableTrailer(uxrefOffset, uxref, gTrue /* write all entries */,
+                        uxref->getNumObjects(), outStr, gFalse /* complete rewrite */);
+  delete uxref;
+}
+
+void PDFDoc::writeDictionnary (Dict* dict, OutStream* outStr, XRef *xRef, Guint numOffset)
+{
+  Object obj1;
+  outStr->printf("<<");
+  for (int i=0; i<dict->getLength(); i++) {
+    GooString keyName(dict->getKey(i));
+    GooString *keyNameToPrint = keyName.sanitizedName(gFalse /* non ps mode */);
+    outStr->printf("/%s ", keyNameToPrint->getCString());
+    delete keyNameToPrint;
+    writeObject(dict->getValNF(i, &obj1), NULL, outStr, xRef, numOffset);
+    obj1.free();
+  }
+  outStr->printf(">> ");
+}
+
+void PDFDoc::writeStream (Stream* str, OutStream* outStr)
+{
+  outStr->printf("stream\r\n");
+  str->reset();
+  for (int c=str->getChar(); c!= EOF; c=str->getChar()) {
+    outStr->printf("%c", c);  
+  }
+  outStr->printf("\r\nendstream\r\n");
+}
+
+void PDFDoc::writeRawStream (Stream* str, OutStream* outStr)
+{
+  Object obj1;
+  str->getDict()->lookup("Length", &obj1);
+  if (!obj1.isInt()) {
+    error (errSyntaxError, -1, "PDFDoc::writeRawStream, no Length in stream dict");
+    return;
+  }
+
+  const int length = obj1.getInt();
+  obj1.free();
+
+  outStr->printf("stream\r\n");
+  str->unfilteredReset();
+  for (int i=0; i<length; i++) {
+    int c = str->getUnfilteredChar();
+    outStr->printf("%c", c);  
+  }
+  str->reset();
+  outStr->printf("\r\nendstream\r\n");
+}
+
+void PDFDoc::writeString (GooString* s, OutStream* outStr)
+{
+  if (s->hasUnicodeMarker()) {
+    //unicode string don't necessary end with \0
+    const char* c = s->getCString();
+    outStr->printf("(");
+    for(int i=0; i<s->getLength(); i++) {
+      char unescaped = *(c+i)&0x000000ff;
+      //escape if needed
+      if (unescaped == '(' || unescaped == ')' || unescaped == '\\')
+        outStr->printf("%c", '\\');
+      outStr->printf("%c", unescaped);
+    }
+    outStr->printf(") ");
+  } else {
+    const char* c = s->getCString();
+    outStr->printf("(");
+    for(int i=0; i<s->getLength(); i++) {
+      char unescaped = *(c+i)&0x000000ff;
+      //escape if needed
+      if (unescaped == '\r')
+        outStr->printf("\\r");
+      else if (unescaped == '\n')
+        outStr->printf("\\n");
+      else {
+        if (unescaped == '(' || unescaped == ')' || unescaped == '\\') {
+          outStr->printf("%c", '\\');
+        }
+        outStr->printf("%c", unescaped);
+      }
+    }
+    outStr->printf(") ");
+  }
+}
+
+Guint PDFDoc::writeObject (Object* obj, Ref* ref, OutStream* outStr, XRef *xRef, Guint numOffset)
+{
+  Array *array;
+  Object obj1;
+  Guint offset = outStr->getPos();
+  int tmp;
+
+  if(ref) 
+    outStr->printf("%i %i obj ", ref->num, ref->gen);
+
+  switch (obj->getType()) {
+    case objBool:
+      outStr->printf("%s ", obj->getBool()?"true":"false");
+      break;
+    case objInt:
+      outStr->printf("%i ", obj->getInt());
+      break;
+    case objReal:
+    {
+      GooString s;
+      s.appendf("{0:.10g}", obj->getReal());
+      outStr->printf("%s ", s.getCString());
+      break;
+    }
+    case objString:
+      writeString(obj->getString(), outStr);
+      break;
+    case objName:
+    {
+      GooString name(obj->getName());
+      GooString *nameToPrint = name.sanitizedName(gFalse /* non ps mode */);
+      outStr->printf("/%s ", nameToPrint->getCString());
+      delete nameToPrint;
+      break;
+    }
+    case objNull:
+      outStr->printf( "null ");
+      break;
+    case objArray:
+      array = obj->getArray();
+      outStr->printf("[");
+      for (int i=0; i<array->getLength(); i++) {
+        writeObject(array->getNF(i, &obj1), NULL,outStr, xRef, numOffset);
+        obj1.free();
+      }
+      outStr->printf("] ");
+      break;
+    case objDict:
+      writeDictionnary (obj->getDict(),outStr, xRef, numOffset);
+      break;
+    case objStream: 
+      {
+        //We can't modify stream with the current implementation (no write functions in Stream API)
+        // => the only type of streams which that have been modified are internal streams (=strWeird)
+        Stream *stream = obj->getStream();
+        if (stream->getKind() == strWeird) {
+          //we write the stream unencoded => TODO: write stream encoder
+          stream->reset();
+          //recalculate stream length
+          tmp = 0;
+          for (int c=stream->getChar(); c!=EOF; c=stream->getChar()) {
+            tmp++;
+          }
+          obj1.initInt(tmp);
+          stream->getDict()->set("Length", &obj1);
+
+          //Remove Stream encoding
+          stream->getDict()->remove("Filter");
+          stream->getDict()->remove("DecodeParms");
+
+          writeDictionnary (stream->getDict(),outStr, xRef, numOffset);
+          writeStream (stream,outStr);
+          obj1.free();
+        } else {
+          //raw stream copy
+          FilterStream *fs = dynamic_cast<FilterStream*>(stream);
+          if (fs) {
+            BaseStream *bs = fs->getBaseStream();
+            if (bs) {
+              Guint streamEnd;
+                if (xRef->getStreamEnd(bs->getStart(), &streamEnd)) {
+                  Object val;
+                  val.initInt(streamEnd - bs->getStart());
+                  stream->getDict()->set("Length", &val);
+                }
+              }
+          }
+          writeDictionnary (stream->getDict(), outStr, xRef, numOffset);
+          writeRawStream (stream, outStr);
+        }
+        break;
+      }
+    case objRef:
+      outStr->printf("%i %i R ", obj->getRef().num + numOffset, obj->getRef().gen);
+      break;
+    case objCmd:
+      outStr->printf("%s\n", obj->getCmd());
+      break;
+    case objError:
+      outStr->printf("error\r\n");
+      break;
+    case objEOF:
+      outStr->printf("eof\r\n");
+      break;
+    case objNone:
+      outStr->printf("none\r\n");
+      break;
+    default:
+      error(errUnimplemented, -1,"Unhandled objType : {0:d}, please report a bug with a testcase\r\n", obj->getType());
+      break;
+  }
+  if (ref)
+    outStr->printf("endobj\r\n");
+  return offset;
+}
+
+Dict *PDFDoc::createTrailerDict(int uxrefSize, GBool incrUpdate, Guint startxRef,
+                                Ref *root, XRef *xRef, const char *fileName, Guint fileSize)
+{
+  Dict *trailerDict = new Dict(xRef);
+  Object obj1;
+  obj1.initInt(uxrefSize);
+  trailerDict->set("Size", &obj1);
+  obj1.free();
+
+  //build a new ID, as recommended in the reference, uses:
+  // - current time
+  // - file name
+  // - file size
+  // - values of entry in information dictionnary
+  GooString message;
+  char buffer[256];
+  sprintf(buffer, "%i", (int)time(NULL));
+  message.append(buffer);
+
+  if (fileName)
+    message.append(fileName);
+
+  sprintf(buffer, "%i", fileSize);
+  message.append(buffer);
+
+  //info dict -- only use text string
+  if (!xRef->getTrailerDict()->isNone() && xRef->getDocInfo(&obj1)->isDict()) {
+    for(int i=0; i<obj1.getDict()->getLength(); i++) {
+      Object obj2;
+      obj1.getDict()->getVal(i, &obj2);  
+      if (obj2.isString()) {
+        message.append(obj2.getString());
+      }
+      obj2.free();
+    }
+  }
+  obj1.free();
+
+  //calculate md5 digest
+  Guchar digest[16];
+  md5((Guchar*)message.getCString(), message.getLength(), digest);
+  obj1.initString(new GooString((const char*)digest, 16));
+
+  //create ID array
+  Object obj2,obj3,obj5;
+  obj2.initArray(xRef);
+
+  if (incrUpdate) {
+    Object obj4;
+    //only update the second part of the array
+    xRef->getTrailerDict()->getDict()->lookup("ID", &obj4);
+    if (!obj4.isArray()) {
+      error(errSyntaxWarning, -1, "PDFDoc::createTrailerDict original file's ID entry isn't an array. Trying to continue");
+    } else {
+      //Get the first part of the ID
+      obj4.arrayGet(0,&obj3); 
+
+      obj2.arrayAdd(&obj3); 
+      obj2.arrayAdd(&obj1);
+      trailerDict->set("ID", &obj2);
+    }
+    obj4.free();
+  } else {
+    //new file => same values for the two identifiers
+    obj2.arrayAdd(&obj1);
+    obj1.initString(new GooString((const char*)digest, 16));
+    obj2.arrayAdd(&obj1);
+    trailerDict->set("ID", &obj2);
+  }
+
+  obj1.initRef(root->num, root->gen);
+  trailerDict->set("Root", &obj1);
+
+  if (incrUpdate) { 
+    obj1.initInt(startxRef);
+    trailerDict->set("Prev", &obj1);
+  }
+  
+  if (!xRef->getTrailerDict()->isNone()) {
+    xRef->getDocInfoNF(&obj5);
+    if (!obj5.isNull()) {
+      trailerDict->set("Info", &obj5);
+    }
+  }
+
+  return trailerDict;
+}
+
+void PDFDoc::writeXRefTableTrailer(Dict *trailerDict, XRef *uxref, GBool writeAllEntries, Guint uxrefOffset, OutStream* outStr, XRef *xRef)
+{
+  uxref->writeTableToFile( outStr, writeAllEntries );
+  outStr->printf( "trailer\r\n");
+  writeDictionnary(trailerDict, outStr, xRef, 0);
+  outStr->printf( "\r\nstartxref\r\n");
+  outStr->printf( "%i\r\n", uxrefOffset);
+  outStr->printf( "%%%%EOF\r\n");
+}
+
+void PDFDoc::writeXRefStreamTrailer (Dict *trailerDict, XRef *uxref, Ref *uxrefStreamRef, Guint uxrefOffset, OutStream* outStr, XRef *xRef)
+{
+  GooString stmData;
+
+  // Fill stmData and some trailerDict fields
+  uxref->writeStreamToBuffer(&stmData, trailerDict, xRef);
+
+  // Create XRef stream object and write it
+  Object obj1;
+  MemStream *mStream = new MemStream( stmData.getCString(), 0,
+                                      stmData.getLength(), obj1.initDict(trailerDict) );
+  writeObject(obj1.initStream(mStream), uxrefStreamRef, outStr, xRef, 0);
+  obj1.free();
+
+  outStr->printf( "startxref\r\n");
+  outStr->printf( "%i\r\n", uxrefOffset);
+  outStr->printf( "%%%%EOF\r\n");
+}
+
+void PDFDoc::writeXRefTableTrailer(Guint uxrefOffset, XRef *uxref, GBool writeAllEntries,
+                                   int uxrefSize, OutStream* outStr, GBool incrUpdate)
+{
+  const char *fileNameA = fileName ? fileName->getCString() : NULL;
+  // file size (doesn't include the trailer)
+  unsigned int fileSize = 0;
+  int c;
+  str->reset();
+  while ((c = str->getChar()) != EOF) {
+    fileSize++;
+  }
+  str->close();
+  Ref ref;
+  ref.num = getXRef()->getRootNum();
+  ref.gen = getXRef()->getRootGen();
+  Dict * trailerDict = createTrailerDict(uxrefSize, incrUpdate, getStartXRef(), &ref,
+                                         getXRef(), fileNameA, fileSize);
+  writeXRefTableTrailer(trailerDict, uxref, writeAllEntries, uxrefOffset, outStr, getXRef());
+  delete trailerDict;
+}
+
+void PDFDoc::writeHeader(OutStream *outStr, int major, int minor)
+{
+   outStr->printf("%%PDF-%d.%d\n", major, minor);
+   outStr->printf("%%\xE2\xE3\xCF\xD3\n");
+}
+
+void PDFDoc::markDictionnary (Dict* dict, XRef * xRef, XRef *countRef, Guint numOffset)
+{
+  Object obj1;
+  for (int i=0; i<dict->getLength(); i++) {
+    markObject(dict->getValNF(i, &obj1), xRef, countRef, numOffset);
+    obj1.free();
+  }
+}
+
+void PDFDoc::markObject (Object* obj, XRef *xRef, XRef *countRef, Guint numOffset)
+{
+  Array *array;
+  Object obj1;
+
+  switch (obj->getType()) {
+    case objArray:
+      array = obj->getArray();
+      for (int i=0; i<array->getLength(); i++) {
+        markObject(array->getNF(i, &obj1), xRef, countRef, numOffset);
+        obj1.free();
+      }
+      break;
+    case objDict:
+      markDictionnary (obj->getDict(), xRef, countRef, numOffset);
+      break;
+    case objStream: 
+      {
+        Stream *stream = obj->getStream();
+        markDictionnary (stream->getDict(), xRef, countRef, numOffset);
+      }
+      break;
+    case objRef:
+      {
+        if (obj->getRef().num + (int) numOffset >= xRef->getNumObjects() || xRef->getEntry(obj->getRef().num + numOffset)->type == xrefEntryFree) {
+          if (getXRef()->getEntry(obj->getRef().num)->type == xrefEntryFree) {
+            return;  // already marked as free => should be replaced
+          }
+          xRef->add(obj->getRef().num + numOffset, obj->getRef().gen, 0, gTrue);
+          if (getXRef()->getEntry(obj->getRef().num)->type == xrefEntryCompressed) {
+            xRef->getEntry(obj->getRef().num + numOffset)->type = xrefEntryCompressed;
+          }
+        }
+        if (obj->getRef().num + (int) numOffset >= countRef->getNumObjects() || 
+            countRef->getEntry(obj->getRef().num + numOffset)->type == xrefEntryFree)
+        {
+          countRef->add(obj->getRef().num + numOffset, 1, 0, gTrue);
+        } else {
+          XRefEntry *entry = countRef->getEntry(obj->getRef().num + numOffset);
+          entry->gen++;
+          if (entry->gen > 9)
+            break;
+        } 
+        Object obj1;
+        getXRef()->fetch(obj->getRef().num, obj->getRef().gen, &obj1);
+        markObject(&obj1, xRef, countRef, numOffset);
+        obj1.free();
+      }
+      break;
+    default:
+      break;
+  }
+}
+
+void PDFDoc::replacePageDict(int pageNo, int rotate,
+                             PDFRectangle *mediaBox, 
+                             PDFRectangle *cropBox, Object *pageCTM)
+{
+  Ref *refPage = getCatalog()->getPageRef(pageNo);
+  Object page;
+  getXRef()->fetch(refPage->num, refPage->gen, &page);
+  Dict *pageDict = page.getDict();
+  pageDict->remove("MediaBox");
+  pageDict->remove("CropBox");
+  pageDict->remove("ArtBox");
+  pageDict->remove("BleedBox");
+  pageDict->remove("TrimBox");
+  pageDict->remove("Rotate");
+  Object *mediaBoxObj = new Object();
+  mediaBoxObj->initArray(getXRef());
+  Object *murx = new Object();
+  murx->initReal(mediaBox->x1);
+  Object *mury = new Object();
+  mury->initReal(mediaBox->y1);
+  Object *mllx = new Object();
+  mllx->initReal(mediaBox->x2);
+  Object *mlly = new Object();
+  mlly->initReal(mediaBox->y2);
+  mediaBoxObj->arrayAdd(murx);
+  mediaBoxObj->arrayAdd(mury);
+  mediaBoxObj->arrayAdd(mllx);
+  mediaBoxObj->arrayAdd(mlly);
+  pageDict->add(copyString("MediaBox"), mediaBoxObj);
+  if (cropBox != NULL) {
+    Object *cropBoxObj = new Object();
+    cropBoxObj->initArray(getXRef());
+    Object *curx = new Object();
+    curx->initReal(cropBox->x1);
+    Object *cury = new Object();
+    cury->initReal(cropBox->y1);
+    Object *cllx = new Object();
+    cllx->initReal(cropBox->x2);
+    Object *clly = new Object();
+    clly->initReal(cropBox->y2);
+    cropBoxObj->arrayAdd(curx);
+    cropBoxObj->arrayAdd(cury);
+    cropBoxObj->arrayAdd(cllx);
+    cropBoxObj->arrayAdd(clly);
+    pageDict->add(copyString("CropBox"), cropBoxObj);
+    pageDict->add(copyString("TrimBox"), cropBoxObj);
+  } else {
+    pageDict->add(copyString("TrimBox"), mediaBoxObj);
+  }
+  Object *rotateObj = new Object();
+  rotateObj->initInt(rotate);
+  pageDict->add(copyString("Rotate"), rotateObj);
+  if (pageCTM != NULL) {
+    Object *contents = new Object();
+    Ref cmRef = getXRef()->addIndirectObject(pageCTM);
+    Object *ref = new Object();
+    ref->initRef(cmRef.num, cmRef.gen);
+    pageDict->lookupNF("Contents", contents);
+    Object *newContents = new Object();
+    newContents->initArray(getXRef());
+    if (contents->getType() == objRef) {
+      newContents->arrayAdd(ref);
+      newContents->arrayAdd(contents);
+    } else {
+      newContents->arrayAdd(ref);
+      for (int i = 0; i < contents->arrayGetLength(); i++) {
+        Object *contentEle = new Object();
+        contents->arrayGetNF(i, contentEle);
+        newContents->arrayAdd(contentEle);
+      }
+    }
+    pageDict->remove("Contents");
+    pageDict->add(copyString("Contents"), newContents);
+  }
+  getXRef()->setModifiedObject(&page, *refPage);
+  page.free();
+}
+
+void PDFDoc::markPageObjects(Dict *pageDict, XRef *xRef, XRef *countRef, Guint numOffset) 
+{
+  pageDict->remove("Names");
+  pageDict->remove("OpenAction");
+  pageDict->remove("Outlines");
+  pageDict->remove("StructTreeRoot");
+
+  for (int n = 0; n < pageDict->getLength(); n++) {
+    const char *key = pageDict->getKey(n);
+    Object value; pageDict->getValNF(n, &value);
+    if (strcmp(key, "Parent") != 0 &&
+             strcmp(key, "Pages") != 0) {
+      markObject(&value, xRef, countRef, numOffset);
+    }
+    value.free();
+  }
+}
+
+Guint PDFDoc::writePageObjects(OutStream *outStr, XRef *xRef, Guint numOffset) 
+{
+  Guint objectsCount = 0; //count the number of objects in the XRef(s)
+
+  for (int n = numOffset; n < xRef->getNumObjects(); n++) {
+    if (xRef->getEntry(n)->type != xrefEntryFree) {
+      Object obj;
+      Ref ref;
+      ref.num = n;
+      ref.gen = xRef->getEntry(n)->gen;
+      objectsCount++;
+      getXRef()->fetch(ref.num - numOffset, ref.gen, &obj);
+      Guint offset = writeObject(&obj, &ref, outStr, xRef, numOffset);
+      xRef->add(ref.num, ref.gen, offset, gTrue);
+      obj.free();
+    }
+  }
+  return objectsCount;
+}
+
+#ifndef DISABLE_OUTLINE
+Outline *PDFDoc::getOutline()
+{
+  if (!outline) {
+    // read outline
+    outline = new Outline(catalog->getOutline(), xref);
+  }
+
+  return outline;
+}
+#endif
+
+PDFDoc *PDFDoc::ErrorPDFDoc(int errorCode, GooString *fileNameA)
+{
+  PDFDoc *doc = new PDFDoc();
+  doc->errCode = errorCode;
+  doc->fileName = fileNameA;
+
+  return doc;
+}
+
+Guint PDFDoc::strToUnsigned(char *s) {
+  Guint x, d;
+  char *p;
+
+  x = 0;
+  for (p = s; *p && isdigit(*p & 0xff); ++p) {
+    d = *p - '0';
+    if (x > (UINT_MAX - d) / 10) {
+      break;
+    }
+    x = 10 * x + d;
+  }
+  return x;
+}
+
+// Read the 'startxref' position.
+Guint PDFDoc::getStartXRef()
+{
+  if (startXRefPos == ~(Guint)0) {
+
+    if (isLinearized()) {
+      char buf[linearizationSearchSize+1];
+      int c, n, i;
+
+      str->setPos(0);
+      for (n = 0; n < linearizationSearchSize; ++n) {
+        if ((c = str->getChar()) == EOF) {
+          break;
+        }
+        buf[n] = c;
+      }
+      buf[n] = '\0';
+
+      // find end of first obj (linearization dictionary)
+      startXRefPos = 0;
+      for (i = 0; i < n; i++) {
+        if (!strncmp("endobj", &buf[i], 6)) {
+         i += 6;
+         //skip whitespace 
+         while (buf[i] && Lexer::isSpace(buf[i])) ++i;
+         startXRefPos = i;
+         break;
+        }
+      }
+    } else {
+      char buf[xrefSearchSize+1];
+      char *p;
+      int c, n, i;
+
+      // read last xrefSearchSize bytes
+      str->setPos(xrefSearchSize, -1);
+      for (n = 0; n < xrefSearchSize; ++n) {
+        if ((c = str->getChar()) == EOF) {
+          break;
+        }
+        buf[n] = c;
+      }
+      buf[n] = '\0';
+
+      // find startxref
+      for (i = n - 9; i >= 0; --i) {
+        if (!strncmp(&buf[i], "startxref", 9)) {
+          break;
+        }
+      }
+      if (i < 0) {
+        startXRefPos = 0;
+      } else {
+        for (p = &buf[i+9]; isspace(*p); ++p) ;
+        startXRefPos =  strToUnsigned(p);
+      }
+    }
+
+  }
+
+  return startXRefPos;
+}
+
+Guint PDFDoc::getMainXRefEntriesOffset()
+{
+  Guint mainXRefEntriesOffset = 0;
+
+  if (isLinearized()) {
+    mainXRefEntriesOffset = getLinearization()->getMainXRefEntriesOffset();
+  }
+
+  return mainXRefEntriesOffset;
+}
+
+int PDFDoc::getNumPages()
+{
+  if (isLinearized()) {
+    int n;
+    if ((n = getLinearization()->getNumPages())) {
+      return n;
+    }
+  }
+
+  return catalog->getNumPages();
+}
+
+Page *PDFDoc::parsePage(int page)
+{
+  Page *p = NULL;
+  Object obj;
+  Ref pageRef;
+  Dict *pageDict;
+
+  pageRef.num = getHints()->getPageObjectNum(page);
+  if (!pageRef.num) {
+    error(errSyntaxWarning, -1, "Failed to get object num from hint tables for page {0:d}", page);
+    return NULL;
+  }
+
+  // check for bogus ref - this can happen in corrupted PDF files
+  if (pageRef.num < 0 || pageRef.num >= xref->getNumObjects()) {
+    error(errSyntaxWarning, -1, "Invalid object num ({0:d}) for page {1:d}", pageRef.num, page);
+    return NULL;
+  }
+
+  pageRef.gen = xref->getEntry(pageRef.num)->gen;
+  xref->fetch(pageRef.num, pageRef.gen, &obj);
+  if (!obj.isDict("Page")) {
+    obj.free();
+    error(errSyntaxWarning, -1, "Object ({0:d} {1:d}) is not a pageDict", pageRef.num, pageRef.gen);
+    return NULL;
+  }
+  pageDict = obj.getDict();
+
+  p = new Page(this, page, pageDict, pageRef,
+               new PageAttrs(NULL, pageDict), catalog->getForm());
+  obj.free();
+
+  return p;
+}
+
+Page *PDFDoc::getPage(int page)
+{
+  if ((page < 1) || page > getNumPages()) return NULL;
+
+  if (isLinearized()) {
+    if (!pageCache) {
+      pageCache = (Page **) gmallocn(getNumPages(), sizeof(Page *));
+      for (int i = 0; i < getNumPages(); i++) {
+        pageCache[i] = NULL;
+      }
+    }
+    if (!pageCache[page-1]) {
+      pageCache[page-1] = parsePage(page);
+    }
+    if (pageCache[page-1]) {
+       return pageCache[page-1];
+    } else {
+       error(errSyntaxWarning, -1, "Failed parsing page {0:d} using hint tables", page);
+    }
+  }
+
+  return catalog->getPage(page);
+}
diff --git a/poppler/PDFDoc.h b/poppler/PDFDoc.h
new file mode 100644 (file)
index 0000000..468f698
--- /dev/null
@@ -0,0 +1,322 @@
+//========================================================================
+//
+// PDFDoc.h
+//
+// Copyright 1996-2003 Glyph & Cog, LLC
+//
+//========================================================================
+
+//========================================================================
+//
+// Modified under the Poppler project - http://poppler.freedesktop.org
+//
+// All changes made under the Poppler project to this file are licensed
+// under GPL version 2 or later
+//
+// Copyright (C) 2005, 2006, 2008 Brad Hards <bradh@frogmouth.net>
+// Copyright (C) 2005, 2009 Albert Astals Cid <aacid@kde.org>
+// Copyright (C) 2008 Julien Rebetez <julienr@svn.gnome.org>
+// Copyright (C) 2008 Pino Toscano <pino@kde.org>
+// Copyright (C) 2008 Carlos Garcia Campos <carlosgc@gnome.org>
+// Copyright (C) 2009 Eric Toombs <ewtoombs@uwaterloo.ca>
+// Copyright (C) 2009 Kovid Goyal <kovid@kovidgoyal.net>
+// Copyright (C) 2010 Hib Eris <hib@hiberis.nl>
+// Copyright (C) 2010 Srinivas Adicherla <srinivas.adicherla@geodesic.com>
+// Copyright (C) 2011 Thomas Freitag <Thomas.Freitag@alfa.de>
+// Copyright (C) 2012 Fabio D'Urso <fabiodurso@hotmail.it>
+//
+// To see a description of the changes please see the Changelog file that
+// came with your tarball or type make ChangeLog if you are building from git
+//
+//========================================================================
+
+#ifndef PDFDOC_H
+#define PDFDOC_H
+
+#ifdef USE_GCC_PRAGMAS
+#pragma interface
+#endif
+
+#include <stdio.h>
+#include "XRef.h"
+#include "Catalog.h"
+#include "Page.h"
+#include "Annot.h"
+#include "OptionalContent.h"
+
+class GooString;
+class BaseStream;
+class OutputDev;
+class Links;
+class LinkAction;
+class LinkDest;
+class Outline;
+class Linearization;
+class SecurityHandler;
+class Hints;
+
+enum PDFWriteMode {
+  writeStandard,
+  writeForceRewrite,
+  writeForceIncremental
+};
+
+//------------------------------------------------------------------------
+// PDFDoc
+//------------------------------------------------------------------------
+
+class PDFDoc {
+public:
+
+  PDFDoc(GooString *fileNameA, GooString *ownerPassword = NULL,
+        GooString *userPassword = NULL, void *guiDataA = NULL);
+
+#ifdef _WIN32
+  PDFDoc(wchar_t *fileNameA, int fileNameLen, GooString *ownerPassword = NULL,
+        GooString *userPassword = NULL, void *guiDataA = NULL);
+#endif
+
+  PDFDoc(BaseStream *strA, GooString *ownerPassword = NULL,
+        GooString *userPassword = NULL, void *guiDataA = NULL);
+  ~PDFDoc();
+
+  static PDFDoc *ErrorPDFDoc(int errorCode, GooString *fileNameA = NULL);
+
+  // Was PDF document successfully opened?
+  GBool isOk() { return ok; }
+
+  // Get the error code (if isOk() returns false).
+  int getErrorCode() { return errCode; }
+
+  // Get the error code returned by fopen() (if getErrorCode() == 
+  // errOpenFile).
+  int getFopenErrno() { return fopenErrno; }
+
+  // Get file name.
+  GooString *getFileName() { return fileName; }
+#ifdef _WIN32
+  wchar_t *getFileNameU() { return fileNameU; }
+#endif
+
+  // Get the linearization table.
+  Linearization *getLinearization();
+
+  // Get the xref table.
+  XRef *getXRef() { return xref; }
+
+  // Get catalog.
+  Catalog *getCatalog() { return catalog; }
+
+  // Get optional content configuration
+  OCGs *getOptContentConfig() { return catalog->getOptContentConfig(); }
+
+  // Get base stream.
+  BaseStream *getBaseStream() { return str; }
+
+  // Get page parameters.
+  double getPageMediaWidth(int page)
+    { return getPage(page) ? getPage(page)->getMediaWidth() : 0.0 ; }
+  double getPageMediaHeight(int page)
+    { return getPage(page) ? getPage(page)->getMediaHeight() : 0.0 ; }
+  double getPageCropWidth(int page)
+    { return getPage(page) ? getPage(page)->getCropWidth() : 0.0 ; }
+  double getPageCropHeight(int page)
+    { return getPage(page) ? getPage(page)->getCropHeight() : 0.0 ; }
+  int getPageRotate(int page)
+    { return getPage(page) ? getPage(page)->getRotate() : 0 ; }
+
+  // Get number of pages.
+  int getNumPages();
+
+  // Return the contents of the metadata stream, or NULL if there is
+  // no metadata.
+  GooString *readMetadata() { return catalog->readMetadata(); }
+
+  // Return the structure tree root object.
+  Object *getStructTreeRoot() { return catalog->getStructTreeRoot(); }
+
+  // Get page.
+  Page *getPage(int page);
+
+  // Display a page.
+  void displayPage(OutputDev *out, int page,
+                  double hDPI, double vDPI, int rotate,
+                  GBool useMediaBox, GBool crop, GBool printing,
+                  GBool (*abortCheckCbk)(void *data) = NULL,
+                  void *abortCheckCbkData = NULL,
+                   GBool (*annotDisplayDecideCbk)(Annot *annot, void *user_data) = NULL,
+                   void *annotDisplayDecideCbkData = NULL);
+
+  // Display a range of pages.
+  void displayPages(OutputDev *out, int firstPage, int lastPage,
+                   double hDPI, double vDPI, int rotate,
+                   GBool useMediaBox, GBool crop, GBool printing,
+                   GBool (*abortCheckCbk)(void *data) = NULL,
+                   void *abortCheckCbkData = NULL,
+                    GBool (*annotDisplayDecideCbk)(Annot *annot, void *user_data) = NULL,
+                    void *annotDisplayDecideCbkData = NULL);
+
+  // Display part of a page.
+  void displayPageSlice(OutputDev *out, int page,
+                       double hDPI, double vDPI, int rotate, 
+                       GBool useMediaBox, GBool crop, GBool printing,
+                       int sliceX, int sliceY, int sliceW, int sliceH,
+                       GBool (*abortCheckCbk)(void *data) = NULL,
+                       void *abortCheckCbkData = NULL,
+                        GBool (*annotDisplayDecideCbk)(Annot *annot, void *user_data) = NULL,
+                        void *annotDisplayDecideCbkData = NULL);
+
+  // Find a page, given its object ID.  Returns page number, or 0 if
+  // not found.
+  int findPage(int num, int gen) { return catalog->findPage(num, gen); }
+
+  // Returns the links for the current page, transferring ownership to
+  // the caller.
+  Links *getLinks(int page);
+
+  // Find a named destination.  Returns the link destination, or
+  // NULL if <name> is not a destination.
+  LinkDest *findDest(GooString *name)
+    { return catalog->findDest(name); }
+
+  // Process the links for a page.
+  void processLinks(OutputDev *out, int page);
+
+
+#ifndef DISABLE_OUTLINE
+  // Return the outline object.
+  Outline *getOutline();
+#endif
+
+  // Is the file encrypted?
+  GBool isEncrypted() { return xref->isEncrypted(); }
+
+  // Check various permissions.
+  GBool okToPrint(GBool ignoreOwnerPW = gFalse)
+    { return xref->okToPrint(ignoreOwnerPW); }
+  GBool okToPrintHighRes(GBool ignoreOwnerPW = gFalse)
+    { return xref->okToPrintHighRes(ignoreOwnerPW); }
+  GBool okToChange(GBool ignoreOwnerPW = gFalse)
+    { return xref->okToChange(ignoreOwnerPW); }
+  GBool okToCopy(GBool ignoreOwnerPW = gFalse)
+    { return xref->okToCopy(ignoreOwnerPW); }
+  GBool okToAddNotes(GBool ignoreOwnerPW = gFalse)
+    { return xref->okToAddNotes(ignoreOwnerPW); }
+  GBool okToFillForm(GBool ignoreOwnerPW = gFalse)
+    { return xref->okToFillForm(ignoreOwnerPW); }
+  GBool okToAccessibility(GBool ignoreOwnerPW = gFalse)
+    { return xref->okToAccessibility(ignoreOwnerPW); }
+  GBool okToAssemble(GBool ignoreOwnerPW = gFalse)
+    { return xref->okToAssemble(ignoreOwnerPW); }
+
+
+  // Is this document linearized?
+  GBool isLinearized();
+
+  // Return the document's Info dictionary (if any).
+  Object *getDocInfo(Object *obj) { return xref->getDocInfo(obj); }
+  Object *getDocInfoNF(Object *obj) { return xref->getDocInfoNF(obj); }
+
+  // Return the PDF version specified by the file.
+  int getPDFMajorVersion() { return pdfMajorVersion; }
+  int getPDFMinorVersion() { return pdfMinorVersion; }
+
+  //Return the PDF ID in the trailer dictionary (if any).
+  GBool getID(GooString *permanent_id, GooString *update_id);
+
+  // Save one page with another name.
+  int savePageAs(GooString *name, int pageNo);
+  // Save this file with another name.
+  int saveAs(GooString *name, PDFWriteMode mode=writeStandard);
+  // Save this file in the given output stream.
+  int saveAs(OutStream *outStr, PDFWriteMode mode=writeStandard);
+  // Save this file with another name without saving changes
+  int saveWithoutChangesAs(GooString *name);
+  // Save this file in the given output stream without saving changes
+  int saveWithoutChangesAs(OutStream *outStr);
+
+  // Return a pointer to the GUI (XPDFCore or WinPDFCore object).
+  void *getGUIData() { return guiData; }
+
+  // rewrite pageDict with MediaBox, CropBox and new page CTM
+  void replacePageDict(int pageNo, int rotate, PDFRectangle *mediaBox, PDFRectangle *cropBox, Object *pageCTM);
+  void markPageObjects(Dict *pageDict, XRef *xRef, XRef *countRef, Guint numOffset);
+  // write all objects used by pageDict to outStr
+  Guint writePageObjects(OutStream *outStr, XRef *xRef, Guint numOffset);
+  static Guint writeObject (Object *obj, Ref *ref, OutStream* outStr, XRef *xref, Guint numOffset);
+  static void writeHeader(OutStream *outStr, int major, int minor);
+
+  // Ownership goes to the caller
+  static Dict *createTrailerDict (int uxrefSize, GBool incrUpdate, Guint startxRef,
+                                  Ref *root, XRef *xRef, const char *fileName, Guint fileSize);
+  static void writeXRefTableTrailer (Dict *trailerDict, XRef *uxref, GBool writeAllEntries,
+                                     Guint uxrefOffset, OutStream* outStr, XRef *xRef);
+  static void writeXRefStreamTrailer (Dict *trailerDict, XRef *uxref, Ref *uxrefStreamRef,
+                                      Guint uxrefOffset, OutStream* outStr, XRef *xRef);
+
+private:
+  // insert referenced objects in XRef
+  void markDictionnary (Dict* dict, XRef *xRef, XRef *countRef, Guint numOffset);
+  void markObject (Object *obj, XRef *xRef, XRef *countRef, Guint numOffset);
+  static void writeDictionnary (Dict* dict, OutStream* outStr, XRef *xRef, Guint numOffset);
+
+  // Add object to current file stream and return the offset of the beginning of the object
+  Guint writeObject (Object *obj, Ref *ref, OutStream* outStr)
+  { return writeObject(obj, ref, outStr, getXRef(), 0); }
+  void writeDictionnary (Dict* dict, OutStream* outStr)
+  { writeDictionnary(dict, outStr, getXRef(), 0); }
+  static void writeStream (Stream* str, OutStream* outStr);
+  static void writeRawStream (Stream* str, OutStream* outStr);
+  void writeXRefTableTrailer (Guint uxrefOffset, XRef *uxref, GBool writeAllEntries,
+                              int uxrefSize, OutStream* outStr, GBool incrUpdate);
+  static void writeString (GooString* s, OutStream* outStr);
+  void saveIncrementalUpdate (OutStream* outStr);
+  void saveCompleteRewrite (OutStream* outStr);
+
+  Page *parsePage(int page);
+
+  // Get hints.
+  Hints *getHints();
+
+  PDFDoc();
+  void init();
+  GBool setup(GooString *ownerPassword, GooString *userPassword);
+  GBool checkFooter();
+  void checkHeader();
+  GBool checkEncryption(GooString *ownerPassword, GooString *userPassword);
+  // Get the offset of the start xref table.
+  Guint getStartXRef();
+  // Get the offset of the entries in the main XRef table of a
+  // linearized document (0 for non linearized documents).
+  Guint getMainXRefEntriesOffset();
+  Guint strToUnsigned(char *s);
+
+  GooString *fileName;
+#ifdef _WIN32
+  wchar_t *fileNameU;
+#endif
+  FILE *file;
+  BaseStream *str;
+  void *guiData;
+  int pdfMajorVersion;
+  int pdfMinorVersion;
+  Linearization *linearization;
+  XRef *xref;
+  SecurityHandler *secHdlr;
+  Catalog *catalog;
+  Hints *hints;
+#ifndef DISABLE_OUTLINE
+  Outline *outline;
+#endif
+  Page **pageCache;
+
+  GBool ok;
+  int errCode;
+  //If there is an error opening the PDF file with fopen() in the constructor, 
+  //then the POSIX errno will be here.
+  int fopenErrno;
+
+  Guint startXRefPos;          // offset of last xref table
+};
+
+#endif
diff --git a/poppler/PDFDocBuilder.h b/poppler/PDFDocBuilder.h
new file mode 100644 (file)
index 0000000..d6eccf5
--- /dev/null
@@ -0,0 +1,42 @@
+//========================================================================
+//
+// PDFDocBuilder.h
+//
+// This file is licensed under the GPLv2 or later
+//
+// Copyright 2010 Hib Eris <hib@hiberis.nl>
+// Copyright 2010 Albert Astals Cid <aacid@kde.org>
+//
+//========================================================================
+
+#ifndef PDFDOCBUILDER_H
+#define PDFDOCBUILDER_H
+
+#include "PDFDoc.h"
+class GooString;
+
+//------------------------------------------------------------------------
+// PDFDocBuilder
+//
+// PDFDocBuilder is an abstract class that specifies the interface for
+// constructing PDFDocs.
+//------------------------------------------------------------------------
+
+class PDFDocBuilder {
+
+public:
+
+  virtual ~PDFDocBuilder() {};
+
+  // Builds a new PDFDoc. Returns a PDFDoc. You should check this PDFDoc
+  // with PDFDoc::isOk() for failures.
+  // The caller is responsible for deleting ownerPassword, userPassWord and guiData.
+  virtual PDFDoc *buildPDFDoc(const GooString &uri, GooString *ownerPassword = NULL,
+      GooString *userPassword = NULL, void *guiDataA = NULL) = 0;
+
+  // Returns gTrue if the builder supports building a PDFDoc from the URI.
+  virtual GBool supports(const GooString &uri) = 0;
+
+};
+
+#endif /* PDFDOCBUILDER_H */
diff --git a/poppler/PDFDocEncoding.cc b/poppler/PDFDocEncoding.cc
new file mode 100644 (file)
index 0000000..7940834
--- /dev/null
@@ -0,0 +1,69 @@
+//========================================================================
+//
+// PDFDocEncoding.cc
+//
+// Copyright 2002-2003 Glyph & Cog, LLC
+//
+//========================================================================
+
+//========================================================================
+//
+// Modified under the Poppler project - http://poppler.freedesktop.org
+//
+// All changes made under the Poppler project to this file are licensed
+// under GPL version 2 or later
+//
+// Copyright (C) 2008 Michael Vrable <mvrable@cs.ucsd.edu>
+//
+// To see a description of the changes please see the Changelog file that
+// came with your tarball or type make ChangeLog if you are building from git
+//
+//========================================================================
+
+#include "PDFDocEncoding.h"
+
+// Mapping of PDFDocEncoding (used to represent text values such as document
+// metadata or annotation text) to Unicode codepoints.  Not all 8-bit values in
+// PDFDocEncoding are defined; undefined bytes are mapped to U+FFFD (Unicode
+// replacement character).
+//
+// PDFDocEncoding is only directly defined for printable characters, but some
+// control characters such as carriage return will still be used.  We define
+// mappings of the standard whitespace control characters (tabs, newlines) to
+// the corresponding Unicode values.  Other control characters are left
+// undefined.
+
+Unicode pdfDocEncoding[256] = {
+  0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, // 00
+  0x0008, 0x0009, 0x000a, 0x000b, 0x000c, 0x000d, 0x000e, 0x000f,
+  0x0010, 0x0011, 0x0012, 0x0013, 0x0014, 0x0015, 0x0016, 0x0017, // 10
+  0x02d8, 0x02c7, 0x02c6, 0x02d9, 0x02dd, 0x02db, 0x02da, 0x02dc,
+  0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027, // 20
+  0x0028, 0x0029, 0x002a, 0x002b, 0x002c, 0x002d, 0x002e, 0x002f,
+  0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, // 30
+  0x0038, 0x0039, 0x003a, 0x003b, 0x003c, 0x003d, 0x003e, 0x003f,
+  0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, // 40
+  0x0048, 0x0049, 0x004a, 0x004b, 0x004c, 0x004d, 0x004e, 0x004f,
+  0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, // 50
+  0x0058, 0x0059, 0x005a, 0x005b, 0x005c, 0x005d, 0x005e, 0x005f,
+  0x0060, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067, // 60
+  0x0068, 0x0069, 0x006a, 0x006b, 0x006c, 0x006d, 0x006e, 0x006f,
+  0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077, // 70
+  0x0078, 0x0079, 0x007a, 0x007b, 0x007c, 0x007d, 0x007e, 0xfffd,
+  0x2022, 0x2020, 0x2021, 0x2026, 0x2014, 0x2013, 0x0192, 0x2044, // 80
+  0x2039, 0x203a, 0x2212, 0x2030, 0x201e, 0x201c, 0x201d, 0x2018,
+  0x2019, 0x201a, 0x2122, 0xfb01, 0xfb02, 0x0141, 0x0152, 0x0160, // 90
+  0x0178, 0x017d, 0x0131, 0x0142, 0x0153, 0x0161, 0x017e, 0xfffd,
+  0x20ac, 0x00a1, 0x00a2, 0x00a3, 0x00a4, 0x00a5, 0x00a6, 0x00a7, // a0
+  0x00a8, 0x00a9, 0x00aa, 0x00ab, 0x00ac, 0xfffd, 0x00ae, 0x00af,
+  0x00b0, 0x00b1, 0x00b2, 0x00b3, 0x00b4, 0x00b5, 0x00b6, 0x00b7, // b0
+  0x00b8, 0x00b9, 0x00ba, 0x00bb, 0x00bc, 0x00bd, 0x00be, 0x00bf,
+  0x00c0, 0x00c1, 0x00c2, 0x00c3, 0x00c4, 0x00c5, 0x00c6, 0x00c7, // c0
+  0x00c8, 0x00c9, 0x00ca, 0x00cb, 0x00cc, 0x00cd, 0x00ce, 0x00cf,
+  0x00d0, 0x00d1, 0x00d2, 0x00d3, 0x00d4, 0x00d5, 0x00d6, 0x00d7, // d0
+  0x00d8, 0x00d9, 0x00da, 0x00db, 0x00dc, 0x00dd, 0x00de, 0x00df,
+  0x00e0, 0x00e1, 0x00e2, 0x00e3, 0x00e4, 0x00e5, 0x00e6, 0x00e7, // e0
+  0x00e8, 0x00e9, 0x00ea, 0x00eb, 0x00ec, 0x00ed, 0x00ee, 0x00ef,
+  0x00f0, 0x00f1, 0x00f2, 0x00f3, 0x00f4, 0x00f5, 0x00f6, 0x00f7, // f0
+  0x00f8, 0x00f9, 0x00fa, 0x00fb, 0x00fc, 0x00fd, 0x00fe, 0x00ff
+};
diff --git a/poppler/PDFDocEncoding.h b/poppler/PDFDocEncoding.h
new file mode 100644 (file)
index 0000000..4f0840b
--- /dev/null
@@ -0,0 +1,34 @@
+//========================================================================
+//
+// PDFDocEncoding.h
+//
+// Copyright 2002-2003 Glyph & Cog, LLC
+//
+//========================================================================
+
+//========================================================================
+//
+// Modified under the Poppler project - http://poppler.freedesktop.org
+//
+// All changes made under the Poppler project to this file are licensed
+// under GPL version 2 or later
+//
+// Copyright (C) 2007 Adrian Johnson <ajohnson@redneon.com>
+//
+// To see a description of the changes please see the Changelog file that
+// came with your tarball or type make ChangeLog if you are building from git
+//
+//========================================================================
+
+#ifndef PDFDOCENCODING_H
+#define PDFDOCENCODING_H
+
+#include "CharTypes.h"
+
+class GooString;
+
+extern Unicode pdfDocEncoding[256];
+
+char* pdfDocEncodingToUTF16 (GooString* orig, int* length);
+
+#endif
diff --git a/poppler/PDFDocFactory.cc b/poppler/PDFDocFactory.cc
new file mode 100644 (file)
index 0000000..1ec4647
--- /dev/null
@@ -0,0 +1,72 @@
+//========================================================================
+//
+// PDFDocFactory.cc
+//
+// This file is licensed under the GPLv2 or later
+//
+// Copyright 2010 Hib Eris <hib@hiberis.nl>
+// Copyright 2010 Albert Astals Cid <aacid@kde.org>
+//
+//========================================================================
+
+#include <config.h>
+
+#include "PDFDocFactory.h"
+
+#include "goo/GooList.h"
+#include "goo/GooString.h"
+#include "PDFDoc.h"
+#include "LocalPDFDocBuilder.h"
+#include "StdinPDFDocBuilder.h"
+#if ENABLE_LIBCURL
+#include "CurlPDFDocBuilder.h"
+#endif
+#include "ErrorCodes.h"
+
+//------------------------------------------------------------------------
+// PDFDocFactory
+//------------------------------------------------------------------------
+
+PDFDocFactory::PDFDocFactory(GooList *pdfDocBuilders)
+{
+  if (pdfDocBuilders) {
+    builders = pdfDocBuilders;
+  } else {
+    builders = new GooList();
+  }
+#if ENABLE_LIBCURL
+  builders->insert(0, new CurlPDFDocBuilder());
+#endif
+  builders->insert(0, new StdinPDFDocBuilder());
+  builders->insert(0, new LocalPDFDocBuilder());
+}
+
+PDFDocFactory::~PDFDocFactory()
+{
+  if (builders) {
+    deleteGooList(builders, PDFDocBuilder);
+  }
+}
+
+PDFDoc *
+PDFDocFactory::createPDFDoc(const GooString &uri, GooString *ownerPassword,
+                                    GooString *userPassword, void *guiDataA)
+{
+  for (int i = builders->getLength() - 1; i >= 0 ; i--) {
+    PDFDocBuilder *builder = (PDFDocBuilder *) builders->get(i);
+    if (builder->supports(uri)) {
+      return builder->buildPDFDoc(uri, ownerPassword, userPassword, guiDataA);
+    }
+  }
+
+  error(errInternal, -1, "Cannot handle URI '{0:t}'.", &uri);
+  GooString *fileName = uri.copy();
+  return PDFDoc::ErrorPDFDoc(errOpenFile, fileName);
+}
+
+void PDFDocFactory::registerPDFDocBuilder(PDFDocBuilder *pdfDocBuilder)
+{
+  builders->append(pdfDocBuilder);
+}
+
+
diff --git a/poppler/PDFDocFactory.h b/poppler/PDFDocFactory.h
new file mode 100644 (file)
index 0000000..dbceaa5
--- /dev/null
@@ -0,0 +1,55 @@
+//========================================================================
+//
+// PDFDocFactory.h
+//
+// This file is licensed under the GPLv2 or later
+//
+// Copyright 2010 Hib Eris <hib@hiberis.nl>
+// Copyright 2010 Albert Astals Cid <aacid@kde.org>
+//
+//========================================================================
+
+#ifndef PDFDOCFACTORY_H
+#define PDFDOCFACTORY_H
+
+#include "PDFDoc.h"
+
+class GooList;
+class GooString;
+class PDFDocBuilder;
+
+//------------------------------------------------------------------------
+// PDFDocFactory
+//
+// PDFDocFactory allows the construction of PDFDocs from different URIs.
+//
+// By default, it supports local files, 'file://' and 'fd:0' (stdin). When
+// compiled with libcurl, it also supports 'http://' and 'https://'.
+//
+// You can extend the supported URIs by giving a list of PDFDocBuilders to
+// the constructor, or by registering a new PDFDocBuilder afterwards.
+//------------------------------------------------------------------------
+
+class PDFDocFactory {
+
+public:
+
+  PDFDocFactory(GooList *pdfDocBuilders = NULL);
+  ~PDFDocFactory();
+
+  // Create a PDFDoc. Returns a PDFDoc. You should check this PDFDoc
+  // with PDFDoc::isOk() for failures.
+  // The caller is responsible for deleting ownerPassword, userPassWord and guiData.
+  PDFDoc *createPDFDoc(const GooString &uri, GooString *ownerPassword = NULL,
+      GooString *userPassword = NULL, void *guiDataA = NULL);
+
+  // Extend supported URIs with the ones from the PDFDocBuilder.
+  void registerPDFDocBuilder(PDFDocBuilder *pdfDocBuilder);
+
+private:
+
+  GooList *builders;
+
+};
+
+#endif /* PDFDOCFACTORY_H */
diff --git a/poppler/PSOutputDev.cc b/poppler/PSOutputDev.cc
new file mode 100644 (file)
index 0000000..f414897
--- /dev/null
@@ -0,0 +1,7391 @@
+//========================================================================
+//
+// PSOutputDev.cc
+//
+// Copyright 1996-2003 Glyph & Cog, LLC
+//
+//========================================================================
+
+//========================================================================
+//
+// Modified under the Poppler project - http://poppler.freedesktop.org
+//
+// All changes made under the Poppler project to this file are licensed
+// under GPL version 2 or later
+//
+// Copyright (C) 2005 Martin Kretzschmar <martink@gnome.org>
+// Copyright (C) 2005, 2006 Kristian Høgsberg <krh@redhat.com>
+// Copyright (C) 2006-2009, 2011 Albert Astals Cid <aacid@kde.org>
+// Copyright (C) 2006 Jeff Muizelaar <jeff@infidigm.net>
+// Copyright (C) 2007, 2008 Brad Hards <bradh@kde.org>
+// Copyright (C) 2008, 2009 Koji Otani <sho@bbr.jp>
+// Copyright (C) 2008, 2010 Hib Eris <hib@hiberis.nl>
+// Copyright (C) 2009-2012 Thomas Freitag <Thomas.Freitag@alfa.de>
+// Copyright (C) 2009 Till Kamppeter <till.kamppeter@gmail.com>
+// Copyright (C) 2009 Carlos Garcia Campos <carlosgc@gnome.org>
+// Copyright (C) 2009, 2011, 2012 William Bader <williambader@hotmail.com>
+// Copyright (C) 2009 Kovid Goyal <kovid@kovidgoyal.net>
+// Copyright (C) 2009-2011 Adrian Johnson <ajohnson@redneon.com>
+// Copyright (C) 2012 Fabio D'Urso <fabiodurso@hotmail.it>
+//
+// To see a description of the changes please see the Changelog file that
+// came with your tarball or type make ChangeLog if you are building from git
+//
+//========================================================================
+
+#include <config.h>
+
+#ifdef USE_GCC_PRAGMAS
+#pragma implementation
+#endif
+
+#include <stdio.h>
+#include <stddef.h>
+#include <stdarg.h>
+#include <signal.h>
+#include <math.h>
+#include <limits.h>
+#include "goo/GooString.h"
+#include "goo/GooList.h"
+#include "goo/GooHash.h"
+#include "poppler-config.h"
+#include "GlobalParams.h"
+#include "Object.h"
+#include "Error.h"
+#include "Function.h"
+#include "Gfx.h"
+#include "GfxState.h"
+#include "GfxFont.h"
+#include "UnicodeMap.h"
+#include <fofi/FoFiType1C.h>
+#include <fofi/FoFiTrueType.h>
+#include "Catalog.h"
+#include "Page.h"
+#include "Stream.h"
+#include "Annot.h"
+#include "XRef.h"
+#include "PreScanOutputDev.h"
+#include "FileSpec.h"
+#include "CharCodeToUnicode.h"
+#if HAVE_SPLASH
+#  include "splash/Splash.h"
+#  include "splash/SplashBitmap.h"
+#  include "SplashOutputDev.h"
+#endif
+#include "PSOutputDev.h"
+#include "PDFDoc.h"
+
+#ifdef MACOS
+// needed for setting type/creator of MacOS files
+#include "ICSupport.h"
+#endif
+
+// the MSVC math.h doesn't define this
+#ifndef M_PI
+#define M_PI 3.14159265358979323846
+#endif
+
+//------------------------------------------------------------------------
+
+// Max size of a slice when rasterizing pages, in pixels.
+#define rasterizationSliceSize 20000000
+
+//------------------------------------------------------------------------
+// PostScript prolog and setup
+//------------------------------------------------------------------------
+
+// The '~' escapes mark prolog code that is emitted only in certain
+// levels:
+//
+//   ~[123][sn]
+//      ^   ^----- s=psLevel*Sep, n=psLevel*
+//      +----- 1=psLevel1*, 2=psLevel2*, 3=psLevel3*
+
+static const char *prolog[] = {
+  "/xpdf 75 dict def xpdf begin",
+  "% PDF special state",
+  "/pdfDictSize 15 def",
+  "~1sn",
+  "/pdfStates 64 array def",
+  "  0 1 63 {",
+  "    pdfStates exch pdfDictSize dict",
+  "    dup /pdfStateIdx 3 index put",
+  "    put",
+  "  } for",
+  "~123sn",
+  "/pdfSetup {",
+  "  /setpagedevice where {",
+  "    pop 2 dict begin",
+  "      /Policies 1 dict dup begin /PageSize 6 def end def",
+  "      { /Duplex true def } if",
+  "    currentdict end setpagedevice",
+  "  } {",
+  "    pop",
+  "  } ifelse",
+  "} def",
+  "/pdfSetupPaper {",
+  "  2 array astore",
+  "  /setpagedevice where {",
+  "    pop 2 dict begin",
+  "      /PageSize exch def",
+  "      /ImagingBBox null def",
+  "    currentdict end setpagedevice",
+  "  } {",
+  "    pop",
+  "  } ifelse",
+  "} def",
+  "~1sn",
+  "/pdfOpNames [",
+  "  /pdfFill /pdfStroke /pdfLastFill /pdfLastStroke",
+  "  /pdfTextMat /pdfFontSize /pdfCharSpacing /pdfTextRender /pdfPatternCS",
+  "  /pdfTextRise /pdfWordSpacing /pdfHorizScaling /pdfTextClipPath",
+  "] def",
+  "~123sn",
+  "/pdfStartPage {",
+  "~1sn",
+  "  pdfStates 0 get begin",
+  "~23sn",
+  "  pdfDictSize dict begin",
+  "~23n",
+  "  /pdfFillCS [] def",
+  "  /pdfFillXform {} def",
+  "  /pdfStrokeCS [] def",
+  "  /pdfStrokeXform {} def",
+  "~1n",
+  "  /pdfFill 0 def",
+  "  /pdfStroke 0 def",
+  "~1s",
+  "  /pdfFill [0 0 0 1] def",
+  "  /pdfStroke [0 0 0 1] def",
+  "~23sn",
+  "  /pdfFill [0] def",
+  "  /pdfStroke [0] def",
+  "  /pdfFillOP false def",
+  "  /pdfStrokeOP false def",
+  "~3sn",
+  "  /pdfOPM false def",
+  "~123sn",
+  "  /pdfLastFill false def",
+  "  /pdfLastStroke false def",
+  "  /pdfTextMat [1 0 0 1 0 0] def",
+  "  /pdfFontSize 0 def",
+  "  /pdfCharSpacing 0 def",
+  "  /pdfTextRender 0 def",
+  "  /pdfPatternCS false def", 
+  "  /pdfTextRise 0 def",
+  "  /pdfWordSpacing 0 def",
+  "  /pdfHorizScaling 1 def",
+  "  /pdfTextClipPath [] def",
+  "} def",
+  "/pdfEndPage { end } def",
+  "~23s",
+  "% separation convention operators",
+  "/findcmykcustomcolor where {",
+  "  pop",
+  "}{",
+  "  /findcmykcustomcolor { 5 array astore } def",
+  "} ifelse",
+  "/setcustomcolor where {",
+  "  pop",
+  "}{",
+  "  /setcustomcolor {",
+  "    exch",
+  "    [ exch /Separation exch dup 4 get exch /DeviceCMYK exch",
+  "      0 4 getinterval cvx",
+  "      [ exch /dup load exch { mul exch dup } /forall load",
+  "        /pop load dup ] cvx",
+  "    ] setcolorspace setcolor",
+  "  } def",
+  "} ifelse",
+  "/customcolorimage where {",
+  "  pop",
+  "}{",
+  "  /customcolorimage {",
+  "    gsave",
+  "    [ exch /Separation exch dup 4 get exch /DeviceCMYK exch",
+  "      0 4 getinterval",
+  "      [ exch /dup load exch { mul exch dup } /forall load",
+  "        /pop load dup ] cvx",
+  "    ] setcolorspace",
+  "    10 dict begin",
+  "      /ImageType 1 def",
+  "      /DataSource exch def",
+  "      /ImageMatrix exch def",
+  "      /BitsPerComponent exch def",
+  "      /Height exch def",
+  "      /Width exch def",
+  "      /Decode [1 0] def",
+  "    currentdict end",
+  "    image",
+  "    grestore",
+  "  } def",
+  "} ifelse",
+  "~123sn",
+  "% PDF color state",
+  "~1n",
+  "/g { dup /pdfFill exch def setgray",
+  "     /pdfLastFill true def /pdfLastStroke false def } def",
+  "/G { dup /pdfStroke exch def setgray",
+  "     /pdfLastStroke true def /pdfLastFill false def } def",
+  "/fCol {",
+  "  pdfLastFill not {",
+  "    pdfFill setgray",
+  "    /pdfLastFill true def /pdfLastStroke false def",
+  "  } if",
+  "} def",
+  "/sCol {",
+  "  pdfLastStroke not {",
+  "    pdfStroke setgray",
+  "    /pdfLastStroke true def /pdfLastFill false def",
+  "  } if",
+  "} def",
+  "~1s",
+  "/k { 4 copy 4 array astore /pdfFill exch def setcmykcolor",
+  "     /pdfLastFill true def /pdfLastStroke false def } def",
+  "/K { 4 copy 4 array astore /pdfStroke exch def setcmykcolor",
+  "     /pdfLastStroke true def /pdfLastFill false def } def",
+  "/fCol {",
+  "  pdfLastFill not {",
+  "    pdfFill aload pop setcmykcolor",
+  "    /pdfLastFill true def /pdfLastStroke false def",
+  "  } if",
+  "} def",
+  "/sCol {",
+  "  pdfLastStroke not {",
+  "    pdfStroke aload pop setcmykcolor",
+  "    /pdfLastStroke true def /pdfLastFill false def",
+  "  } if",
+  "} def",
+  "~3n",
+  "/opm { dup /pdfOPM exch def",
+  "      /setoverprintmode where{pop setoverprintmode}{pop}ifelse  } def",
+  "~23n",
+  "/cs { /pdfFillXform exch def dup /pdfFillCS exch def",
+  "      setcolorspace } def",
+  "/CS { /pdfStrokeXform exch def dup /pdfStrokeCS exch def",
+  "      setcolorspace } def",
+  "/sc { pdfLastFill not { pdfFillCS setcolorspace } if",
+  "      dup /pdfFill exch def aload pop pdfFillXform setcolor",
+  "     /pdfLastFill true def /pdfLastStroke false def } def",
+  "/SC { pdfLastStroke not { pdfStrokeCS setcolorspace } if",
+  "      dup /pdfStroke exch def aload pop pdfStrokeXform setcolor",
+  "     /pdfLastStroke true def /pdfLastFill false def } def",
+  "/op { /pdfFillOP exch def",
+  "      pdfLastFill { pdfFillOP setoverprint } if } def",
+  "/OP { /pdfStrokeOP exch def",
+  "      pdfLastStroke { pdfStrokeOP setoverprint } if } def",
+  "/fCol {",
+  "  pdfLastFill not {",
+  "    pdfFillCS setcolorspace",
+  "    pdfFill aload pop pdfFillXform setcolor",
+  "    pdfFillOP setoverprint",
+  "    /pdfLastFill true def /pdfLastStroke false def",
+  "  } if",
+  "} def",
+  "/sCol {",
+  "  pdfLastStroke not {",
+  "    pdfStrokeCS setcolorspace",
+  "    pdfStroke aload pop pdfStrokeXform setcolor",
+  "    pdfStrokeOP setoverprint",
+  "    /pdfLastStroke true def /pdfLastFill false def",
+  "  } if",
+  "} def",
+  "~3s",
+  "/opm { dup /pdfOPM exch def",
+  "      /setoverprintmode where{pop setoverprintmode}{pop}ifelse } def",
+  "~23s",
+  "/k { 4 copy 4 array astore /pdfFill exch def setcmykcolor",
+  "     /pdfLastFill true def /pdfLastStroke false def } def",
+  "/K { 4 copy 4 array astore /pdfStroke exch def setcmykcolor",
+  "     /pdfLastStroke true def /pdfLastFill false def } def",
+  "/ck { 6 copy 6 array astore /pdfFill exch def",
+  "      findcmykcustomcolor exch setcustomcolor",
+  "      /pdfLastFill true def /pdfLastStroke false def } def",
+  "/CK { 6 copy 6 array astore /pdfStroke exch def",
+  "      findcmykcustomcolor exch setcustomcolor",
+  "      /pdfLastStroke true def /pdfLastFill false def } def",
+  "/op { /pdfFillOP exch def",
+  "      pdfLastFill { pdfFillOP setoverprint } if } def",
+  "/OP { /pdfStrokeOP exch def",
+  "      pdfLastStroke { pdfStrokeOP setoverprint } if } def",
+  "/fCol {",
+  "  pdfLastFill not {",
+  "    pdfFill aload length 4 eq {",
+  "      setcmykcolor",
+  "    }{",
+  "      findcmykcustomcolor exch setcustomcolor",
+  "    } ifelse",
+  "    pdfFillOP setoverprint",
+  "    /pdfLastFill true def /pdfLastStroke false def",
+  "  } if",
+  "} def",
+  "/sCol {",
+  "  pdfLastStroke not {",
+  "    pdfStroke aload length 4 eq {",
+  "      setcmykcolor",
+  "    }{",
+  "      findcmykcustomcolor exch setcustomcolor",
+  "    } ifelse",
+  "    pdfStrokeOP setoverprint",
+  "    /pdfLastStroke true def /pdfLastFill false def",
+  "  } if",
+  "} def",
+  "~123sn",
+  "% build a font",
+  "/pdfMakeFont {",
+  "  4 3 roll findfont",
+  "  4 2 roll matrix scale makefont",
+  "  dup length dict begin",
+  "    { 1 index /FID ne { def } { pop pop } ifelse } forall",
+  "    /Encoding exch def",
+  "    currentdict",
+  "  end",
+  "  definefont pop",
+  "} def",
+  "/pdfMakeFont16 {",
+  "  exch findfont",
+  "  dup length dict begin",
+  "    { 1 index /FID ne { def } { pop pop } ifelse } forall",
+  "    /WMode exch def",
+  "    currentdict",
+  "  end",
+  "  definefont pop",
+  "} def",
+  "~3sn",
+  "/pdfMakeFont16L3 {",
+  "  1 index /CIDFont resourcestatus {",
+  "    pop pop 1 index /CIDFont findresource /CIDFontType known",
+  "  } {",
+  "    false",
+  "  } ifelse",
+  "  {",
+  "    0 eq { /Identity-H } { /Identity-V } ifelse",
+  "    exch 1 array astore composefont pop",
+  "  } {",
+  "    pdfMakeFont16",
+  "  } ifelse",
+  "} def",
+  "~123sn",
+  "% graphics state operators",
+  "~1sn",
+  "/q {",
+  "  gsave",
+  "  pdfOpNames length 1 sub -1 0 { pdfOpNames exch get load } for",
+  "  pdfStates pdfStateIdx 1 add get begin",
+  "  pdfOpNames { exch def } forall",
+  "} def",
+  "/Q { end grestore } def",
+  "~23sn",
+  "/q { gsave pdfDictSize dict begin } def",
+  "/Q {",
+  "  end grestore",
+  "  /pdfLastFill where {",
+  "    pop",
+  "    pdfLastFill {",
+  "      pdfFillOP setoverprint",
+  "    } {",
+  "      pdfStrokeOP setoverprint",
+  "    } ifelse",
+  "  } if",
+  "~3sn",
+  "  /pdfOPM where {",
+  "    pop",
+  "    pdfOPM /setoverprintmode where{pop setoverprintmode}{pop}ifelse ",
+  "  } if",
+  "~23sn",
+  "} def",
+  "~123sn",
+  "/cm { concat } def",
+  "/d { setdash } def",
+  "/i { setflat } def",
+  "/j { setlinejoin } def",
+  "/J { setlinecap } def",
+  "/M { setmiterlimit } def",
+  "/w { setlinewidth } def",
+  "% path segment operators",
+  "/m { moveto } def",
+  "/l { lineto } def",
+  "/c { curveto } def",
+  "/re { 4 2 roll moveto 1 index 0 rlineto 0 exch rlineto",
+  "      neg 0 rlineto closepath } def",
+  "/h { closepath } def",
+  "% path painting operators",
+  "/S { sCol stroke } def",
+  "/Sf { fCol stroke } def",
+  "/f { fCol fill } def",
+  "/f* { fCol eofill } def",
+  "% clipping operators",
+  "/W { clip newpath } def",
+  "/W* { eoclip newpath } def",
+  "/Ws { strokepath clip newpath } def",
+  "% text state operators",
+  "/Tc { /pdfCharSpacing exch def } def",
+  "/Tf { dup /pdfFontSize exch def",
+  "      dup pdfHorizScaling mul exch matrix scale",
+  "      pdfTextMat matrix concatmatrix dup 4 0 put dup 5 0 put",
+  "      exch findfont exch makefont setfont } def",
+  "/Tr { /pdfTextRender exch def } def",
+  "/Tp { /pdfPatternCS exch def } def", 
+  "/Ts { /pdfTextRise exch def } def",
+  "/Tw { /pdfWordSpacing exch def } def",
+  "/Tz { /pdfHorizScaling exch def } def",
+  "% text positioning operators",
+  "/Td { pdfTextMat transform moveto } def",
+  "/Tm { /pdfTextMat exch def } def",
+  "% text string operators",
+  "/xyshow where {",
+  "  pop",
+  "  /xyshow2 {",
+  "    dup length array",
+  "    0 2 2 index length 1 sub {",
+  "      2 index 1 index 2 copy get 3 1 roll 1 add get",
+  "      pdfTextMat dtransform",
+  "      4 2 roll 2 copy 6 5 roll put 1 add 3 1 roll dup 4 2 roll put",
+  "    } for",
+  "    exch pop",
+  "    xyshow",
+  "  } def",
+  "}{",
+  "  /xyshow2 {",
+  "    currentfont /FontType get 0 eq {",
+  "      0 2 3 index length 1 sub {",
+  "        currentpoint 4 index 3 index 2 getinterval show moveto",
+  "        2 copy get 2 index 3 2 roll 1 add get",
+  "        pdfTextMat dtransform rmoveto",
+  "      } for",
+  "    } {",
+  "      0 1 3 index length 1 sub {",
+  "        currentpoint 4 index 3 index 1 getinterval show moveto",
+  "        2 copy 2 mul get 2 index 3 2 roll 2 mul 1 add get",
+  "        pdfTextMat dtransform rmoveto",
+  "      } for",
+  "    } ifelse",
+  "    pop pop",
+  "  } def",
+  "} ifelse",
+  "/cshow where {",
+  "  pop",
+  "  /xycp {", // xycharpath
+  "    0 3 2 roll",
+  "    {",
+  "      pop pop currentpoint 3 2 roll",
+  "      1 string dup 0 4 3 roll put false charpath moveto",
+  "      2 copy get 2 index 2 index 1 add get",
+  "      pdfTextMat dtransform rmoveto",
+  "      2 add",
+  "    } exch cshow",
+  "    pop pop",
+  "  } def",
+  "}{",
+  "  /xycp {", // xycharpath
+  "    currentfont /FontType get 0 eq {",
+  "      0 2 3 index length 1 sub {",
+  "        currentpoint 4 index 3 index 2 getinterval false charpath moveto",
+  "        2 copy get 2 index 3 2 roll 1 add get",
+  "        pdfTextMat dtransform rmoveto",
+  "      } for",
+  "    } {",
+  "      0 1 3 index length 1 sub {",
+  "        currentpoint 4 index 3 index 1 getinterval false charpath moveto",
+  "        2 copy 2 mul get 2 index 3 2 roll 2 mul 1 add get",
+  "        pdfTextMat dtransform rmoveto",
+  "      } for",
+  "    } ifelse",
+  "    pop pop",
+  "  } def",
+  "} ifelse",
+  "/Tj {",
+  "  fCol",  // because stringwidth has to draw Type 3 chars
+  "  0 pdfTextRise pdfTextMat dtransform rmoveto",
+  "  currentpoint 4 2 roll",
+  "  pdfTextRender 1 and 0 eq {",
+  "    2 copy xyshow2",
+  "  } if",
+  "  pdfTextRender 3 and dup 1 eq exch 2 eq or {",
+  "    3 index 3 index moveto",
+  "    2 copy",
+  "    currentfont /FontType get 3 eq { fCol } { sCol } ifelse",
+  "    xycp currentpoint stroke moveto",
+  "  } if",
+  "  pdfTextRender 4 and 0 ne {",
+  "    4 2 roll moveto xycp",
+  "    /pdfTextClipPath [ pdfTextClipPath aload pop",
+  "      {/moveto cvx}",
+  "      {/lineto cvx}",
+  "      {/curveto cvx}",
+  "      {/closepath cvx}",
+  "    pathforall ] def",
+  "    currentpoint newpath moveto",
+  "  } {",
+  "    pop pop pop pop",
+  "  } ifelse",
+  "  0 pdfTextRise neg pdfTextMat dtransform rmoveto",
+  "} def",
+  "/TJm { 0.001 mul pdfFontSize mul pdfHorizScaling mul neg 0",
+  "       pdfTextMat dtransform rmoveto } def",
+  "/TJmV { 0.001 mul pdfFontSize mul neg 0 exch",
+  "        pdfTextMat dtransform rmoveto } def",
+  "/Tclip { pdfTextClipPath cvx exec clip newpath",
+  "         /pdfTextClipPath [] def } def",
+  "/Tclip* { pdfTextClipPath cvx exec eoclip newpath",
+  "         /pdfTextClipPath [] def } def",
+  "~1ns",
+  "% Level 1 image operators",
+  "/pdfIm1 {",
+  "  /pdfImBuf1 4 index string def",
+  "  { currentfile pdfImBuf1 readhexstring pop } image",
+  "} def",
+  "/pdfIm1Bin {",
+  "  /pdfImBuf1 4 index string def",
+  "  { currentfile pdfImBuf1 readstring pop } image",
+  "} def",
+  "~1s",
+  "/pdfIm1Sep {",
+  "  /pdfImBuf1 4 index string def",
+  "  /pdfImBuf2 4 index string def",
+  "  /pdfImBuf3 4 index string def",
+  "  /pdfImBuf4 4 index string def",
+  "  { currentfile pdfImBuf1 readhexstring pop }",
+  "  { currentfile pdfImBuf2 readhexstring pop }",
+  "  { currentfile pdfImBuf3 readhexstring pop }",
+  "  { currentfile pdfImBuf4 readhexstring pop }",
+  "  true 4 colorimage",
+  "} def",
+  "/pdfIm1SepBin {",
+  "  /pdfImBuf1 4 index string def",
+  "  /pdfImBuf2 4 index string def",
+  "  /pdfImBuf3 4 index string def",
+  "  /pdfImBuf4 4 index string def",
+  "  { currentfile pdfImBuf1 readstring pop }",
+  "  { currentfile pdfImBuf2 readstring pop }",
+  "  { currentfile pdfImBuf3 readstring pop }",
+  "  { currentfile pdfImBuf4 readstring pop }",
+  "  true 4 colorimage",
+  "} def",
+  "~1ns",
+  "/pdfImM1 {",
+  "  fCol /pdfImBuf1 4 index 7 add 8 idiv string def",
+  "  { currentfile pdfImBuf1 readhexstring pop } imagemask",
+  "} def",
+  "/pdfImM1Bin {",
+  "  fCol /pdfImBuf1 4 index 7 add 8 idiv string def",
+  "  { currentfile pdfImBuf1 readstring pop } imagemask",
+  "} def",
+  "/pdfImStr {",
+  "  2 copy exch length lt {",
+  "    2 copy get exch 1 add exch",
+  "  } {",
+  "    ()",
+  "  } ifelse",
+  "} def",
+  "/pdfImM1a {",
+  "  { pdfImStr } imagemask",
+  "  pop pop",
+  "} def",
+  "~23sn",
+  "% Level 2/3 image operators",
+  "/pdfImBuf 100 string def",
+  "/pdfImStr {",
+  "  2 copy exch length lt {",
+  "    2 copy get exch 1 add exch",
+  "  } {",
+  "    ()",
+  "  } ifelse",
+  "} def",
+  "/skipEOD {",
+  "  { currentfile pdfImBuf readline",
+  "    not { pop exit } if",
+  "    (%-EOD-) eq { exit } if } loop",
+  "} def",
+  "/pdfIm { image skipEOD } def",
+  "~3sn",
+  "/pdfMask {",
+  "  /ReusableStreamDecode filter",
+  "  skipEOD",
+  "  /maskStream exch def",
+  "} def",
+  "/pdfMaskEnd { maskStream closefile } def",
+  "/pdfMaskInit {",
+  "  /maskArray exch def",
+  "  /maskIdx 0 def",
+  "} def",
+  "/pdfMaskSrc {",
+  "  maskIdx maskArray length lt {",
+  "    maskArray maskIdx get",
+  "    /maskIdx maskIdx 1 add def",
+  "  } {",
+  "    ()",
+  "  } ifelse",
+  "} def",
+  "~23s",
+  "/pdfImSep {",
+  "  findcmykcustomcolor exch",
+  "  dup /Width get /pdfImBuf1 exch string def",
+  "  dup /Decode get aload pop 1 index sub /pdfImDecodeRange exch def",
+  "  /pdfImDecodeLow exch def",
+  "  begin Width Height BitsPerComponent ImageMatrix DataSource end",
+  "  /pdfImData exch def",
+  "  { pdfImData pdfImBuf1 readstring pop",
+  "    0 1 2 index length 1 sub {",
+  "      1 index exch 2 copy get",
+  "      pdfImDecodeRange mul 255 div pdfImDecodeLow add round cvi",
+  "      255 exch sub put",
+  "    } for }",
+  "  6 5 roll customcolorimage",
+  "  skipEOD",
+  "} def",
+  "~23sn",
+  "/pdfImM { fCol imagemask skipEOD } def",
+  "~123sn",
+  "/pr { 2 index 2 index 3 2 roll putinterval 4 add } def",
+  "/pdfImClip {",
+  "  gsave",
+  "  0 2 4 index length 1 sub {",
+  "    dup 4 index exch 2 copy",
+  "    get 5 index div put",
+  "    1 add 3 index exch 2 copy",
+  "    get 3 index div put",
+  "  } for",
+  "  pop pop rectclip",
+  "} def",
+  "/pdfImClipEnd { grestore } def",
+  "~23sn",
+  "% shading operators",
+  "/colordelta {",
+  "  false 0 1 3 index length 1 sub {",
+  "    dup 4 index exch get 3 index 3 2 roll get sub abs 0.004 gt {",
+  "      pop true",
+  "    } if",
+  "  } for",
+  "  exch pop exch pop",
+  "} def",
+  "/funcCol { func n array astore } def",
+  "/funcSH {",
+  "  dup 0 eq {",
+  "    true",
+  "  } {",
+  "    dup 6 eq {",
+  "      false",
+  "    } {",
+  "      4 index 4 index funcCol dup",
+  "      6 index 4 index funcCol dup",
+  "      3 1 roll colordelta 3 1 roll",
+  "      5 index 5 index funcCol dup",
+  "      3 1 roll colordelta 3 1 roll",
+  "      6 index 8 index funcCol dup",
+  "      3 1 roll colordelta 3 1 roll",
+  "      colordelta or or or",
+  "    } ifelse",
+  "  } ifelse",
+  "  {",
+  "    1 add",
+  "    4 index 3 index add 0.5 mul exch 4 index 3 index add 0.5 mul exch",
+  "    6 index 6 index 4 index 4 index 4 index funcSH",
+  "    2 index 6 index 6 index 4 index 4 index funcSH",
+  "    6 index 2 index 4 index 6 index 4 index funcSH",
+  "    5 3 roll 3 2 roll funcSH pop pop",
+  "  } {",
+  "    pop 3 index 2 index add 0.5 mul 3 index  2 index add 0.5 mul",
+  "~23n",
+  "    funcCol sc",
+  "~23s",
+  "    funcCol aload pop k",
+  "~23sn",
+  "    dup 4 index exch mat transform m",
+  "    3 index 3 index mat transform l",
+  "    1 index 3 index mat transform l",
+  "    mat transform l pop pop h f*",
+  "  } ifelse",
+  "} def",
+  "/axialCol {",
+  "  dup 0 lt {",
+  "    pop t0",
+  "  } {",
+  "    dup 1 gt {",
+  "      pop t1",
+  "    } {",
+  "      dt mul t0 add",
+  "    } ifelse",
+  "  } ifelse",
+  "  func n array astore",
+  "} def",
+  "/axialSH {",
+  "  dup 0 eq {",
+  "    true",
+  "  } {",
+  "    dup 8 eq {",
+  "      false",
+  "    } {",
+  "      2 index axialCol 2 index axialCol colordelta",
+  "    } ifelse",
+  "  } ifelse",
+  "  {",
+  "    1 add 3 1 roll 2 copy add 0.5 mul",
+  "    dup 4 3 roll exch 4 index axialSH",
+  "    exch 3 2 roll axialSH",
+  "  } {",
+  "    pop 2 copy add 0.5 mul",
+  "~23n",
+  "    axialCol sc",
+  "~23s",
+  "    axialCol aload pop k",
+  "~23sn",
+  "    exch dup dx mul x0 add exch dy mul y0 add",
+  "    3 2 roll dup dx mul x0 add exch dy mul y0 add",
+  "    dx abs dy abs ge {",
+  "      2 copy yMin sub dy mul dx div add yMin m",
+  "      yMax sub dy mul dx div add yMax l",
+  "      2 copy yMax sub dy mul dx div add yMax l",
+  "      yMin sub dy mul dx div add yMin l",
+  "      h f*",
+  "    } {",
+  "      exch 2 copy xMin sub dx mul dy div add xMin exch m",
+  "      xMax sub dx mul dy div add xMax exch l",
+  "      exch 2 copy xMax sub dx mul dy div add xMax exch l",
+  "      xMin sub dx mul dy div add xMin exch l",
+  "      h f*",
+  "    } ifelse",
+  "  } ifelse",
+  "} def",
+  "/radialCol {",
+  "  dup t0 lt {",
+  "    pop t0",
+  "  } {",
+  "    dup t1 gt {",
+  "      pop t1",
+  "    } if",
+  "  } ifelse",
+  "  func n array astore",
+  "} def",
+  "/radialSH {",
+  "  dup 0 eq {",
+  "    true",
+  "  } {",
+  "    dup 8 eq {",
+  "      false",
+  "    } {",
+  "      2 index dt mul t0 add radialCol",
+  "      2 index dt mul t0 add radialCol colordelta",
+  "    } ifelse",
+  "  } ifelse",
+  "  {",
+  "    1 add 3 1 roll 2 copy add 0.5 mul",
+  "    dup 4 3 roll exch 4 index radialSH",
+  "    exch 3 2 roll radialSH",
+  "  } {",
+  "    pop 2 copy add 0.5 mul dt mul t0 add",
+  "~23n",
+  "    radialCol sc",
+  "~23s",
+  "    radialCol aload pop k",
+  "~23sn",
+  "    encl {",
+  "      exch dup dx mul x0 add exch dup dy mul y0 add exch dr mul r0 add",
+  "      0 360 arc h",
+  "      dup dx mul x0 add exch dup dy mul y0 add exch dr mul r0 add",
+  "      360 0 arcn h f",
+  "    } {",
+  "      2 copy",
+  "      dup dx mul x0 add exch dup dy mul y0 add exch dr mul r0 add",
+  "      a1 a2 arcn",
+  "      dup dx mul x0 add exch dup dy mul y0 add exch dr mul r0 add",
+  "      a2 a1 arcn h",
+  "      dup dx mul x0 add exch dup dy mul y0 add exch dr mul r0 add",
+  "      a1 a2 arc",
+  "      dup dx mul x0 add exch dup dy mul y0 add exch dr mul r0 add",
+  "      a2 a1 arc h f",
+  "    } ifelse",
+  "  } ifelse",
+  "} def",
+  "~123sn",
+  "end",
+  NULL
+};
+
+static const char *cmapProlog[] = {
+  "/CIDInit /ProcSet findresource begin",
+  "10 dict begin",
+  "  begincmap",
+  "  /CMapType 1 def",
+  "  /CMapName /Identity-H def",
+  "  /CIDSystemInfo 3 dict dup begin",
+  "    /Registry (Adobe) def",
+  "    /Ordering (Identity) def",
+  "    /Supplement 0 def",
+  "  end def",
+  "  1 begincodespacerange",
+  "    <0000> <ffff>",
+  "  endcodespacerange",
+  "  0 usefont",
+  "  1 begincidrange",
+  "    <0000> <ffff> 0",
+  "  endcidrange",
+  "  endcmap",
+  "  currentdict CMapName exch /CMap defineresource pop",
+  "end",
+  "10 dict begin",
+  "  begincmap",
+  "  /CMapType 1 def",
+  "  /CMapName /Identity-V def",
+  "  /CIDSystemInfo 3 dict dup begin",
+  "    /Registry (Adobe) def",
+  "    /Ordering (Identity) def",
+  "    /Supplement 0 def",
+  "  end def",
+  "  /WMode 1 def",
+  "  1 begincodespacerange",
+  "    <0000> <ffff>",
+  "  endcodespacerange",
+  "  0 usefont",
+  "  1 begincidrange",
+  "    <0000> <ffff> 0",
+  "  endcidrange",
+  "  endcmap",
+  "  currentdict CMapName exch /CMap defineresource pop",
+  "end",
+  "end",
+  NULL
+};
+
+//------------------------------------------------------------------------
+// Fonts
+//------------------------------------------------------------------------
+
+struct PSSubstFont {
+  const char *psName;                  // PostScript name
+  double mWidth;               // width of 'm' character
+};
+
+// NB: must be in same order as base14SubstFonts in GfxFont.cc
+static PSSubstFont psBase14SubstFonts[14] = {
+  {"Courier",               0.600},
+  {"Courier-Oblique",       0.600},
+  {"Courier-Bold",          0.600},
+  {"Courier-BoldOblique",   0.600},
+  {"Helvetica",             0.833},
+  {"Helvetica-Oblique",     0.833},
+  {"Helvetica-Bold",        0.889},
+  {"Helvetica-BoldOblique", 0.889},
+  {"Times-Roman",           0.788},
+  {"Times-Italic",          0.722},
+  {"Times-Bold",            0.833},
+  {"Times-BoldItalic",      0.778},
+  // the last two are never used for substitution
+  {"Symbol",                0},
+  {"ZapfDingbats",          0}
+};
+
+// Mapping from Type 1/1C font file to PS font name.
+struct PST1FontName {
+  Ref fontFileID;
+  GooString *psName;           // PostScript font name used for this
+                               //   embedded font file
+};
+
+// Info for 8-bit fonts
+struct PSFont8Info {
+  Ref fontID;
+  int *codeToGID;              // code-to-GID mapping for TrueType fonts
+};
+
+// Encoding info for substitute 16-bit font
+struct PSFont16Enc {
+  Ref fontID;
+  GooString *enc;
+};
+
+//------------------------------------------------------------------------
+// process colors
+//------------------------------------------------------------------------
+
+#define psProcessCyan     1
+#define psProcessMagenta  2
+#define psProcessYellow   4
+#define psProcessBlack    8
+#define psProcessCMYK    15
+
+//------------------------------------------------------------------------
+// PSOutCustomColor
+//------------------------------------------------------------------------
+
+class PSOutCustomColor {
+public:
+
+  PSOutCustomColor(double cA, double mA,
+                  double yA, double kA, GooString *nameA);
+  ~PSOutCustomColor();
+
+  double c, m, y, k;
+  GooString *name;
+  PSOutCustomColor *next;
+};
+
+PSOutCustomColor::PSOutCustomColor(double cA, double mA,
+                                  double yA, double kA, GooString *nameA) {
+  c = cA;
+  m = mA;
+  y = yA;
+  k = kA;
+  name = nameA;
+  next = NULL;
+}
+
+PSOutCustomColor::~PSOutCustomColor() {
+  delete name;
+}
+
+//------------------------------------------------------------------------
+
+struct PSOutImgClipRect {
+  int x0, x1, y0, y1;
+};
+
+//------------------------------------------------------------------------
+
+struct PSOutPaperSize {
+  PSOutPaperSize(int wA, int hA) { w = wA; h = hA; }
+  int w, h;
+};
+
+//------------------------------------------------------------------------
+// DeviceNRecoder
+//------------------------------------------------------------------------
+
+class DeviceNRecoder: public FilterStream {
+public:
+
+  DeviceNRecoder(Stream *strA, int widthA, int heightA,
+                GfxImageColorMap *colorMapA);
+  virtual ~DeviceNRecoder();
+  virtual StreamKind getKind() { return strWeird; }
+  virtual void reset();
+  virtual int getChar()
+    { return (bufIdx >= bufSize && !fillBuf()) ? EOF : buf[bufIdx++]; }
+  virtual int lookChar()
+    { return (bufIdx >= bufSize && !fillBuf()) ? EOF : buf[bufIdx]; }
+  virtual GooString *getPSFilter(int psLevel, const char *indent) { return NULL; }
+  virtual GBool isBinary(GBool last = gTrue) { return gTrue; }
+  virtual GBool isEncoder() { return gTrue; }
+
+private:
+
+  GBool fillBuf();
+
+  int width, height;
+  GfxImageColorMap *colorMap;
+  Function *func;
+  ImageStream *imgStr;
+  int buf[gfxColorMaxComps];
+  int pixelIdx;
+  int bufIdx;
+  int bufSize;
+};
+
+DeviceNRecoder::DeviceNRecoder(Stream *strA, int widthA, int heightA,
+                              GfxImageColorMap *colorMapA):
+    FilterStream(strA) {
+  width = widthA;
+  height = heightA;
+  colorMap = colorMapA;
+  imgStr = NULL;
+  pixelIdx = 0;
+  bufIdx = gfxColorMaxComps;
+  bufSize = ((GfxDeviceNColorSpace *)colorMap->getColorSpace())->
+              getAlt()->getNComps();
+  func = ((GfxDeviceNColorSpace *)colorMap->getColorSpace())->
+           getTintTransformFunc();
+}
+
+DeviceNRecoder::~DeviceNRecoder() {
+  if (imgStr) {
+    delete imgStr;
+  }
+  if (str->isEncoder()) {
+    delete str;
+  }
+}
+
+void DeviceNRecoder::reset() {
+  imgStr = new ImageStream(str, width, colorMap->getNumPixelComps(),
+                          colorMap->getBits());
+  imgStr->reset();
+}
+
+GBool DeviceNRecoder::fillBuf() {
+  Guchar pixBuf[gfxColorMaxComps];
+  GfxColor color;
+  double x[gfxColorMaxComps], y[gfxColorMaxComps];
+  int i;
+
+  if (pixelIdx >= width * height) {
+    return gFalse;
+  }
+  imgStr->getPixel(pixBuf);
+  colorMap->getColor(pixBuf, &color);
+  for (i = 0;
+       i < ((GfxDeviceNColorSpace *)colorMap->getColorSpace())->getNComps();
+       ++i) {
+    x[i] = colToDbl(color.c[i]);
+  }
+  func->transform(x, y);
+  for (i = 0; i < bufSize; ++i) {
+    buf[i] = (int)(y[i] * 255 + 0.5);
+  }
+  bufIdx = 0;
+  ++pixelIdx;
+  return gTrue;
+}
+
+//------------------------------------------------------------------------
+// PSOutputDev
+//------------------------------------------------------------------------
+
+extern "C" {
+typedef void (*SignalFunc)(int);
+}
+
+static void outputToFile(void *stream, const char *data, int len) {
+  fwrite(data, 1, len, (FILE *)stream);
+}
+
+PSOutputDev::PSOutputDev(const char *fileName, PDFDoc *doc,
+                        char *psTitle,
+                        int firstPage, int lastPage, PSOutMode modeA,
+                        int paperWidthA, int paperHeightA, GBool duplexA,
+                        int imgLLXA, int imgLLYA, int imgURXA, int imgURYA,
+                        GBool forceRasterizeA,
+                        GBool manualCtrlA,
+                        PSOutCustomCodeCbk customCodeCbkA,
+                        void *customCodeCbkDataA) {
+  FILE *f;
+  PSFileType fileTypeA;
+
+  underlayCbk = NULL;
+  underlayCbkData = NULL;
+  overlayCbk = NULL;
+  overlayCbkData = NULL;
+  customCodeCbk = customCodeCbkA;
+  customCodeCbkData = customCodeCbkDataA;
+
+  fontIDs = NULL;
+  fontNames = new GooHash(gTrue);
+  t1FontNames = NULL;
+  font8Info = NULL;
+  font16Enc = NULL;
+  imgIDs = NULL;
+  formIDs = NULL;
+  xobjStack = NULL;
+  paperSizes = NULL;
+  embFontList = NULL;
+  customColors = NULL;
+  haveTextClip = gFalse;
+  t3String = NULL;
+  forceRasterize = forceRasterizeA;
+
+  // open file or pipe
+  if (!strcmp(fileName, "-")) {
+    fileTypeA = psStdout;
+    f = stdout;
+  } else if (fileName[0] == '|') {
+    fileTypeA = psPipe;
+#ifdef HAVE_POPEN
+#ifndef _WIN32
+    signal(SIGPIPE, (SignalFunc)SIG_IGN);
+#endif
+    if (!(f = popen(fileName + 1, "w"))) {
+      error(errIO, -1, "Couldn't run print command '{0:s}'", fileName);
+      ok = gFalse;
+      return;
+    }
+#else
+    error(errIO, -1, "Print commands are not supported ('{0:s}')", fileName);
+    ok = gFalse;
+    return;
+#endif
+  } else {
+    fileTypeA = psFile;
+    if (!(f = fopen(fileName, "w"))) {
+      error(errIO, -1, "Couldn't open PostScript file '{0:s}'", fileName);
+      ok = gFalse;
+      return;
+    }
+  }
+
+  init(outputToFile, f, fileTypeA, psTitle,
+       doc, firstPage, lastPage, modeA,
+       imgLLXA, imgLLYA, imgURXA, imgURYA, manualCtrlA,
+       paperWidthA, paperHeightA, duplexA);
+}
+
+PSOutputDev::PSOutputDev(PSOutputFunc outputFuncA, void *outputStreamA,
+                        char *psTitle,
+                        PDFDoc *doc,
+                        int firstPage, int lastPage, PSOutMode modeA,
+                        int paperWidthA, int paperHeightA, GBool duplexA,
+                        int imgLLXA, int imgLLYA, int imgURXA, int imgURYA,
+                        GBool forceRasterizeA,
+                        GBool manualCtrlA,
+                        PSOutCustomCodeCbk customCodeCbkA,
+                        void *customCodeCbkDataA) {
+  underlayCbk = NULL;
+  underlayCbkData = NULL;
+  overlayCbk = NULL;
+  overlayCbkData = NULL;
+  customCodeCbk = customCodeCbkA;
+  customCodeCbkData = customCodeCbkDataA;
+
+  fontIDs = NULL;
+  fontNames = new GooHash(gTrue);
+  t1FontNames = NULL;
+  font8Info = NULL;
+  font16Enc = NULL;
+  imgIDs = NULL;
+  formIDs = NULL;
+  xobjStack = NULL;
+  paperSizes = NULL;
+  embFontList = NULL;
+  customColors = NULL;
+  haveTextClip = gFalse;
+  t3String = NULL;
+  forceRasterize = forceRasterizeA;
+
+  init(outputFuncA, outputStreamA, psGeneric, psTitle,
+       doc, firstPage, lastPage, modeA,
+       imgLLXA, imgLLYA, imgURXA, imgURYA, manualCtrlA,
+       paperWidthA, paperHeightA, duplexA);
+}
+
+void PSOutputDev::init(PSOutputFunc outputFuncA, void *outputStreamA,
+                      PSFileType fileTypeA, char *pstitle, PDFDoc *docA,
+                      int firstPage, int lastPage, PSOutMode modeA,
+                      int imgLLXA, int imgLLYA, int imgURXA, int imgURYA,
+                      GBool manualCtrlA, int paperWidthA, int paperHeightA,
+                      GBool duplexA) {
+  Catalog *catalog;
+  PDFRectangle *box;
+  PSOutPaperSize *size;
+  GooList *names;
+  int pg, w, h, i;
+
+  // initialize
+  displayText = gTrue;
+  ok = gTrue;
+  outputFunc = outputFuncA;
+  outputStream = outputStreamA;
+  fileType = fileTypeA;
+  doc = docA;
+  xref = doc->getXRef();
+  catalog = doc->getCatalog();
+  level = globalParams->getPSLevel();
+  mode = modeA;
+  paperWidth = paperWidthA;
+  paperHeight = paperHeightA;
+  imgLLX = imgLLXA;
+  imgLLY = imgLLYA;
+  imgURX = imgURXA;
+  imgURY = imgURYA;
+  if (paperWidth < 0 || paperHeight < 0) {
+    Page *page;
+    paperMatch = gTrue;
+    paperSizes = new GooList();
+    paperWidth = paperHeight = 1; // in case the document has zero pages
+    for (pg = (firstPage >= 1) ? firstPage : 1;
+        pg <= lastPage && pg <= catalog->getNumPages();
+        ++pg) {
+      page = catalog->getPage(pg);
+      if (page == NULL) {
+        paperMatch = gFalse;
+        break;
+      }
+      w = (int)ceil(page->getMediaWidth());
+      h = (int)ceil(page->getMediaHeight());
+      for (i = 0; i < paperSizes->getLength(); ++i) {
+       size = (PSOutPaperSize *)paperSizes->get(i);
+       if (size->w == w && size->h == h) {
+         break;
+       }
+      }
+      if (i == paperSizes->getLength()) {
+       paperSizes->append(new PSOutPaperSize(w, h));
+      }
+      if (w > paperWidth) {
+       paperWidth = w;
+      }
+      if (h > paperHeight) {
+       paperHeight = h;
+      }
+    }
+    // NB: img{LLX,LLY,URX,URY} will be set by startPage()
+  } else {
+    paperMatch = gFalse;
+  }
+  preload = globalParams->getPSPreload();
+  if (imgLLX == 0 && imgURX == 0 && imgLLY == 0 && imgURY == 0) {
+    imgLLX = imgLLY = 0;
+    imgURX = paperWidth;
+    imgURY = paperHeight;
+  }
+  if (imgLLX == 0 && imgURX == 0 && imgLLY == 0 && imgURY == 0) {
+    imgLLX = imgLLY = 0;
+    imgURX = paperWidth;
+    imgURY = paperHeight;
+  }
+  manualCtrl = manualCtrlA;
+  if (mode == psModeForm) {
+    lastPage = firstPage;
+  }
+  processColors = 0;
+  inType3Char = gFalse;
+  inUncoloredPattern = gFalse;
+
+#if OPI_SUPPORT
+  // initialize OPI nesting levels
+  opi13Nest = 0;
+  opi20Nest = 0;
+#endif
+
+  tx0 = ty0 = -1;
+  xScale0 = yScale0 = 0;
+  rotate0 = -1;
+  clipLLX0 = clipLLY0 = 0;
+  clipURX0 = clipURY0 = -1;
+
+  // initialize fontIDs, fontFileIDs, and fontFileNames lists
+  fontIDSize = 64;
+  fontIDLen = 0;
+  fontIDs = (Ref *)gmallocn(fontIDSize, sizeof(Ref));
+  for (i = 0; i < 14; ++i) {
+    fontNames->add(new GooString(psBase14SubstFonts[i].psName), 1);
+  }
+  names = globalParams->getPSResidentFonts();
+  for (i = 0; i < names->getLength(); ++i) {
+    fontNames->add((GooString *)names->get(i), 1);
+  }
+  delete names;
+  t1FontNameSize = 64;
+  t1FontNameLen = 0;
+  t1FontNames = (PST1FontName *)gmallocn(t1FontNameSize, sizeof(PST1FontName));
+  font8InfoLen = 0;
+  font8InfoSize = 0;
+  font16EncLen = 0;
+  font16EncSize = 0;
+  imgIDLen = 0;
+  imgIDSize = 0;
+  formIDLen = 0;
+  formIDSize = 0;
+
+  xobjStack = new GooList();
+  numSaves = 0;
+  numTilingPatterns = 0;
+  nextFunc = 0;
+
+  // initialize embedded font resource comment list
+  embFontList = new GooString();
+
+  if (!manualCtrl) {
+    Page *page;
+    // this check is needed in case the document has zero pages
+    if ((page = doc->getPage(firstPage))) {
+      writeHeader(firstPage, lastPage,
+                 page->getMediaBox(),
+                 page->getCropBox(),
+                 page->getRotate(),
+                 pstitle);
+    } else {
+      error(errSyntaxError, -1, "Invalid page {0:d}", firstPage);
+      box = new PDFRectangle(0, 0, 1, 1);
+      writeHeader(firstPage, lastPage, box, box, 0, pstitle);
+      delete box;
+    }
+    if (mode != psModeForm) {
+      writePS("%%BeginProlog\n");
+    }
+    writeXpdfProcset();
+    if (mode != psModeForm) {
+      writePS("%%EndProlog\n");
+      writePS("%%BeginSetup\n");
+    }
+    writeDocSetup(doc, catalog, firstPage, lastPage, duplexA);
+    if (mode != psModeForm) {
+      writePS("%%EndSetup\n");
+    }
+  }
+
+  // initialize sequential page number
+  seqPage = 1;
+}
+
+PSOutputDev::~PSOutputDev() {
+  PSOutCustomColor *cc;
+  int i;
+
+  if (ok) {
+    if (!manualCtrl) {
+      writePS("%%Trailer\n");
+      writeTrailer();
+      if (mode != psModeForm) {
+       writePS("%%EOF\n");
+      }
+    }
+    if (fileType == psFile) {
+#ifdef MACOS
+      ICS_MapRefNumAndAssign((short)((FILE *)outputStream)->handle);
+#endif
+      fclose((FILE *)outputStream);
+    }
+#ifdef HAVE_POPEN
+    else if (fileType == psPipe) {
+      pclose((FILE *)outputStream);
+#ifndef _WIN32
+      signal(SIGPIPE, (SignalFunc)SIG_DFL);
+#endif
+    }
+#endif
+  }
+  if (paperSizes) {
+    deleteGooList(paperSizes, PSOutPaperSize);
+  }
+  if (embFontList) {
+    delete embFontList;
+  }
+  if (fontIDs) {
+    gfree(fontIDs);
+  }
+  delete fontNames;
+  if (t1FontNames) {
+    for (i = 0; i < t1FontNameLen; ++i) {
+      delete t1FontNames[i].psName;
+    }
+    gfree(t1FontNames);
+  }
+  if (font8Info) {
+    for (i = 0; i < font8InfoLen; ++i) {
+      gfree(font8Info[i].codeToGID);
+    }
+    gfree(font8Info);
+  }
+  if (font16Enc) {
+    for (i = 0; i < font16EncLen; ++i) {
+      if (font16Enc[i].enc) {
+       delete font16Enc[i].enc;
+      }
+    }
+    gfree(font16Enc);
+  }
+  gfree(imgIDs);
+  gfree(formIDs);
+  if (xobjStack) {
+    delete xobjStack;
+  }
+  while (customColors) {
+    cc = customColors;
+    customColors = cc->next;
+    delete cc;
+  }
+}
+
+void PSOutputDev::writeHeader(int firstPage, int lastPage,
+                             PDFRectangle *mediaBox, PDFRectangle *cropBox,
+                             int pageRotate, char *psTitle) {
+  Object info, obj1;
+  PSOutPaperSize *size;
+  double x1, y1, x2, y2;
+  int i;
+
+  switch (mode) {
+  case psModePSOrigPageSizes:
+  case psModePS:
+    writePS("%!PS-Adobe-3.0\n");
+    break;
+  case psModeEPS:
+    writePS("%!PS-Adobe-3.0 EPSF-3.0\n");
+    break;
+  case psModeForm:
+    writePS("%!PS-Adobe-3.0 Resource-Form\n");
+    break;
+  }
+  writePSFmt("%Produced by poppler pdftops version: {0:s} (http://poppler.freedesktop.org)\n", PACKAGE_VERSION);
+  xref->getDocInfo(&info);
+  if (info.isDict() && info.dictLookup("Creator", &obj1)->isString()) {
+    writePS("%%Creator: ");
+    writePSTextLine(obj1.getString());
+  }
+  obj1.free();
+  info.free();
+  if(psTitle) {
+    writePSFmt("%%Title: {0:s}\n", psTitle);
+  }
+  writePSFmt("%%LanguageLevel: {0:d}\n",
+            (level == psLevel1 || level == psLevel1Sep) ? 1 :
+            (level == psLevel2 || level == psLevel2Sep) ? 2 : 3);
+  if (level == psLevel1Sep || level == psLevel2Sep || level == psLevel3Sep) {
+    writePS("%%DocumentProcessColors: (atend)\n");
+    writePS("%%DocumentCustomColors: (atend)\n");
+  }
+  writePS("%%DocumentSuppliedResources: (atend)\n");
+  if ((level == psLevel1 || level == psLevel1Sep) && globalParams->getPSBinary()) {
+    writePS("%%DocumentData: Binary\n");
+  }
+
+  switch (mode) {
+  case psModePSOrigPageSizes:
+    prevWidth = 0;
+    prevHeight = 0;
+  case psModePS:
+    if (paperMatch) {      
+      for (i = 0; i < paperSizes->getLength(); ++i) {
+       size = (PSOutPaperSize *)paperSizes->get(i);
+       writePSFmt("%%{0:s} {1:d}x{2:d} {1:d} {2:d} 0 () ()\n",
+                  i==0 ? "DocumentMedia:" : "+", size->w, size->h);
+      }
+    } else {
+      writePSFmt("%%DocumentMedia: plain {0:d} {1:d} 0 () ()\n",
+                paperWidth, paperHeight);
+    }
+    writePSFmt("%%BoundingBox: 0 0 {0:d} {1:d}\n", paperWidth, paperHeight);
+    writePSFmt("%%Pages: {0:d}\n", lastPage - firstPage + 1);
+    writePS("%%EndComments\n");
+    if (!paperMatch) {
+      writePS("%%BeginDefaults\n");
+      writePS("%%PageMedia: plain\n");
+      writePS("%%EndDefaults\n");
+    }
+    break;
+  case psModeEPS:
+    epsX1 = cropBox->x1;
+    epsY1 = cropBox->y1;
+    epsX2 = cropBox->x2;
+    epsY2 = cropBox->y2;
+    if (pageRotate == 0 || pageRotate == 180) {
+      x1 = epsX1;
+      y1 = epsY1;
+      x2 = epsX2;
+      y2 = epsY2;
+    } else { // pageRotate == 90 || pageRotate == 270
+      x1 = 0;
+      y1 = 0;
+      x2 = epsY2 - epsY1;
+      y2 = epsX2 - epsX1;
+    }
+    writePSFmt("%%BoundingBox: {0:d} {1:d} {2:d} {3:d}\n",
+              (int)floor(x1), (int)floor(y1), (int)ceil(x2), (int)ceil(y2));
+    if (floor(x1) != ceil(x1) || floor(y1) != ceil(y1) ||
+       floor(x2) != ceil(x2) || floor(y2) != ceil(y2)) {
+      writePSFmt("%%HiResBoundingBox: {0:.6g} {1:.6g} {2:.6g} {3:.6g}\n",
+                x1, y1, x2, y2);
+    }
+    writePS("%%DocumentSuppliedResources: (atend)\n");
+    writePS("%%EndComments\n");
+    break;
+  case psModeForm:
+    writePS("%%EndComments\n");
+    writePS("32 dict dup begin\n");
+    writePSFmt("/BBox [{0:d} {1:d} {2:d} {3:d}] def\n",
+              (int)floor(mediaBox->x1), (int)floor(mediaBox->y1),
+              (int)ceil(mediaBox->x2), (int)ceil(mediaBox->y2));
+    writePS("/FormType 1 def\n");
+    writePS("/Matrix [1 0 0 1 0 0] def\n");
+    break;
+  }
+}
+
+void PSOutputDev::writeXpdfProcset() {
+  GBool lev1, lev2, lev3, sep, nonSep;
+  const char **p;
+  const char *q;
+
+  writePSFmt("%%BeginResource: procset xpdf {0:s} 0\n", "3.00");
+  writePSFmt("%%Copyright: {0:s}\n", xpdfCopyright);
+  lev1 = lev2 = lev3 = sep = nonSep = gTrue;
+  for (p = prolog; *p; ++p) {
+    if ((*p)[0] == '~') {
+      lev1 = lev2 = lev3 = sep = nonSep = gFalse;
+      for (q = *p + 1; *q; ++q) {
+       switch (*q) {
+       case '1': lev1 = gTrue; break;
+       case '2': lev2 = gTrue; break;
+       case '3': lev3 = gTrue; break;
+       case 's': sep = gTrue; break;
+       case 'n': nonSep = gTrue; break;
+       }
+      }
+    } else if ((level == psLevel1 && lev1 && nonSep) ||
+              (level == psLevel1Sep && lev1 && sep) ||
+              (level == psLevel2 && lev2 && nonSep) ||
+              (level == psLevel2Sep && lev2 && sep) ||
+              (level == psLevel3 && lev3 && nonSep) ||
+              (level == psLevel3Sep && lev3 && sep)) {
+      writePSFmt("{0:s}\n", *p);
+    }
+  }
+  writePS("%%EndResource\n");
+
+  if (level >= psLevel3) {
+    for (p = cmapProlog; *p; ++p) {
+      writePSFmt("{0:s}\n", *p);
+    }
+  }
+}
+
+void PSOutputDev::writeDocSetup(PDFDoc *doc, Catalog *catalog,
+                               int firstPage, int lastPage,
+                                GBool duplexA) {
+  Page *page;
+  Dict *resDict;
+  Annots *annots;
+  Object *acroForm;
+  Object obj1, obj2, obj3;
+  GooString *s;
+  int pg, i;
+
+  if (mode == psModeForm) {
+    // swap the form and xpdf dicts
+    writePS("xpdf end begin dup begin\n");
+  } else {
+    writePS("xpdf begin\n");
+  }
+  for (pg = firstPage; pg <= lastPage; ++pg) {
+    page = doc->getPage(pg);
+    if (!page) {
+      error(errSyntaxError, -1, "Failed writing resources for page {0:d}", pg);
+      continue;
+    }
+    if ((resDict = page->getResourceDict())) {
+      setupResources(resDict);
+    }
+    annots = page->getAnnots();
+    for (i = 0; i < annots->getNumAnnots(); ++i) {
+      if (annots->getAnnot(i)->getAppearanceResDict(&obj1)->isDict()) {
+        setupResources(obj1.getDict());
+      }
+      obj1.free();
+    }
+  }
+  if ((acroForm = catalog->getAcroForm()) && acroForm->isDict()) {
+    if (acroForm->dictLookup("DR", &obj1)->isDict()) {
+      setupResources(obj1.getDict());
+    }
+    obj1.free();
+    if (acroForm->dictLookup("Fields", &obj1)->isArray()) {
+      for (i = 0; i < obj1.arrayGetLength(); ++i) {
+       if (obj1.arrayGet(i, &obj2)->isDict()) {
+         if (obj2.dictLookup("DR", &obj3)->isDict()) {
+           setupResources(obj3.getDict());
+         }
+         obj3.free();
+       }
+       obj2.free();
+      }
+    }
+    obj1.free();
+  }
+  if (mode != psModeForm) {
+    if (mode != psModeEPS && !manualCtrl) {
+      writePSFmt("{0:s} pdfSetup\n",
+                duplexA ? "true" : "false");
+      if (!paperMatch) {
+       writePSFmt("{0:d} {1:d} pdfSetupPaper\n", paperWidth, paperHeight);
+      }
+    }
+#if OPI_SUPPORT
+    if (globalParams->getPSOPI()) {
+      writePS("/opiMatrix matrix currentmatrix def\n");
+    }
+#endif
+  }
+  if (customCodeCbk) {
+    if ((s = (*customCodeCbk)(this, psOutCustomDocSetup, 0,
+                             customCodeCbkData))) {
+      writePS(s->getCString());
+      delete s;
+    }
+  }
+}
+
+void PSOutputDev::writePageTrailer() {
+  if (mode != psModeForm) {
+    writePS("pdfEndPage\n");
+  }
+}
+
+void PSOutputDev::writeTrailer() {
+  PSOutCustomColor *cc;
+
+  if (mode == psModeForm) {
+    writePS("/Foo exch /Form defineresource pop\n");
+  } else {
+    writePS("end\n");
+    writePS("%%DocumentSuppliedResources:\n");
+    writePS(embFontList->getCString());
+    if (level == psLevel1Sep || level == psLevel2Sep ||
+       level == psLevel3Sep) {
+      writePS("%%DocumentProcessColors:");
+      if (processColors & psProcessCyan) {
+       writePS(" Cyan");
+      }
+      if (processColors & psProcessMagenta) {
+       writePS(" Magenta");
+      }
+      if (processColors & psProcessYellow) {
+       writePS(" Yellow");
+      }
+      if (processColors & psProcessBlack) {
+       writePS(" Black");
+      }
+      writePS("\n");
+      writePS("%%DocumentCustomColors:");
+      for (cc = customColors; cc; cc = cc->next) {
+       writePS(" ");
+       writePSString(cc->name);
+      }
+      writePS("\n");
+      writePS("%%CMYKCustomColor:\n");
+      for (cc = customColors; cc; cc = cc->next) {
+       writePSFmt("%%+ {0:.4g} {1:.4g} {2:.4g} {3:.4g} ",
+                  cc->c, cc->m, cc->y, cc->k);
+       writePSString(cc->name);
+       writePS("\n");
+      }
+    }
+  }
+}
+
+void PSOutputDev::setupResources(Dict *resDict) {
+  Object xObjDict, xObjRef, xObj, patDict, patRef, pat, resObj;
+  Ref ref0, ref1;
+  GBool skip;
+  int i, j;
+
+  setupFonts(resDict);
+  setupImages(resDict);
+  setupForms(resDict);
+
+  //----- recursively scan XObjects
+  resDict->lookup("XObject", &xObjDict);
+  if (xObjDict.isDict()) {
+    for (i = 0; i < xObjDict.dictGetLength(); ++i) {
+
+      // avoid infinite recursion on XObjects
+      skip = gFalse;
+      if ((xObjDict.dictGetValNF(i, &xObjRef)->isRef())) {
+       ref0 = xObjRef.getRef();
+       for (j = 0; j < xobjStack->getLength(); ++j) {
+         ref1 = *(Ref *)xobjStack->get(j);
+         if (ref1.num == ref0.num && ref1.gen == ref0.gen) {
+           skip = gTrue;
+           break;
+         }
+       }
+       if (!skip) {
+         xobjStack->append(&ref0);
+       }
+      }
+      if (!skip) {
+
+       // process the XObject's resource dictionary
+       xObjDict.dictGetVal(i, &xObj);
+       if (xObj.isStream()) {
+         xObj.streamGetDict()->lookup("Resources", &resObj);
+         if (resObj.isDict()) {
+           setupResources(resObj.getDict());
+         }
+         resObj.free();
+       }
+       xObj.free();
+      }
+
+      if (xObjRef.isRef() && !skip) {
+       xobjStack->del(xobjStack->getLength() - 1);
+      }
+      xObjRef.free();
+    }
+  }
+  xObjDict.free();
+
+  //----- recursively scan Patterns
+  resDict->lookup("Pattern", &patDict);
+  if (patDict.isDict()) {
+    inType3Char = gTrue;
+    for (i = 0; i < patDict.dictGetLength(); ++i) {
+
+      // avoid infinite recursion on Patterns
+      skip = gFalse;
+      if ((patDict.dictGetValNF(i, &patRef)->isRef())) {
+       ref0 = patRef.getRef();
+       for (j = 0; j < xobjStack->getLength(); ++j) {
+         ref1 = *(Ref *)xobjStack->get(j);
+         if (ref1.num == ref0.num && ref1.gen == ref0.gen) {
+           skip = gTrue;
+           break;
+         }
+       }
+       if (!skip) {
+         xobjStack->append(&ref0);
+       }
+      }
+      if (!skip) {
+
+       // process the Pattern's resource dictionary
+       patDict.dictGetVal(i, &pat);
+       if (pat.isStream()) {
+         pat.streamGetDict()->lookup("Resources", &resObj);
+         if (resObj.isDict()) {
+           setupResources(resObj.getDict());
+         }
+         resObj.free();
+       }
+       pat.free();
+      }
+
+      if (patRef.isRef() && !skip) {
+       xobjStack->del(xobjStack->getLength() - 1);
+      }
+      patRef.free();
+    }
+    inType3Char = gFalse;
+  }
+  patDict.free();
+}
+
+void PSOutputDev::setupFonts(Dict *resDict) {
+  Object obj1, obj2;
+  Ref r;
+  GfxFontDict *gfxFontDict;
+  GfxFont *font;
+  int i;
+
+  gfxFontDict = NULL;
+  resDict->lookupNF("Font", &obj1);
+  if (obj1.isRef()) {
+    obj1.fetch(xref, &obj2);
+    if (obj2.isDict()) {
+      r = obj1.getRef();
+      gfxFontDict = new GfxFontDict(xref, &r, obj2.getDict());
+    }
+    obj2.free();
+  } else if (obj1.isDict()) {
+    gfxFontDict = new GfxFontDict(xref, NULL, obj1.getDict());
+  }
+  if (gfxFontDict) {
+    for (i = 0; i < gfxFontDict->getNumFonts(); ++i) {
+      if ((font = gfxFontDict->getFont(i))) {
+       setupFont(font, resDict);
+      }
+    }
+    delete gfxFontDict;
+  }
+  obj1.free();
+}
+
+void PSOutputDev::setupFont(GfxFont *font, Dict *parentResDict) {
+  GfxFontLoc *fontLoc;
+  GooString *psName;
+  char buf[16];
+  GBool subst;
+  UnicodeMap *uMap;
+  const char *charName;
+  double xs, ys;
+  int code;
+  double w1, w2;
+  int i, j;
+
+  // check if font is already set up
+  for (i = 0; i < fontIDLen; ++i) {
+    if (fontIDs[i].num == font->getID()->num &&
+       fontIDs[i].gen == font->getID()->gen) {
+      return;
+    }
+  }
+
+  // add entry to fontIDs list
+  if (fontIDLen >= fontIDSize) {
+    fontIDSize += 64;
+    fontIDs = (Ref *)greallocn(fontIDs, fontIDSize, sizeof(Ref));
+  }
+  fontIDs[fontIDLen++] = *font->getID();
+
+  psName = NULL;
+  xs = ys = 1;
+  subst = gFalse;
+
+  if (font->getType() == fontType3) {
+    psName = GooString::format("T3_{0:d}_{1:d}",
+                            font->getID()->num, font->getID()->gen);
+    setupType3Font(font, psName, parentResDict);
+  } else {
+    fontLoc = font->locateFont(xref, gTrue);
+    if (fontLoc != NULL) {
+      switch (fontLoc->locType) {
+      case gfxFontLocEmbedded:
+       switch (fontLoc->fontType) {
+       case fontType1:
+         // this assumes that the PS font name matches the PDF font name
+         psName = font->getEmbeddedFontName()->copy();
+         setupEmbeddedType1Font(&fontLoc->embFontID, psName);
+         break;
+       case fontType1C:
+         psName = makePSFontName(font, &fontLoc->embFontID);
+         setupEmbeddedType1CFont(font, &fontLoc->embFontID, psName);
+         break;
+       case fontType1COT:
+         psName = makePSFontName(font, &fontLoc->embFontID);
+         setupEmbeddedOpenTypeT1CFont(font, &fontLoc->embFontID, psName);
+         break;
+       case fontTrueType:
+       case fontTrueTypeOT:
+         psName = makePSFontName(font, font->getID());
+         setupEmbeddedTrueTypeFont(font, &fontLoc->embFontID, psName);
+         break;
+       case fontCIDType0C:
+         psName = makePSFontName(font, &fontLoc->embFontID);
+         setupEmbeddedCIDType0Font(font, &fontLoc->embFontID, psName);
+         break;
+       case fontCIDType2:
+       case fontCIDType2OT:
+         psName = makePSFontName(font, font->getID());
+         //~ should check to see if font actually uses vertical mode
+         setupEmbeddedCIDTrueTypeFont(font, &fontLoc->embFontID, psName, gTrue);
+         break;
+       case fontCIDType0COT:
+         psName = makePSFontName(font, &fontLoc->embFontID);
+         setupEmbeddedOpenTypeCFFFont(font, &fontLoc->embFontID, psName);
+         break;
+       default:
+         break;
+       }
+       break;
+      case gfxFontLocExternal:
+       //~ add cases for external 16-bit fonts
+       switch (fontLoc->fontType) {
+       case fontType1:
+         if (font->getName()) {
+           // this assumes that the PS font name matches the PDF font name
+           psName = font->getName()->copy();
+         } else {
+           //~ this won't work -- the PS font name won't match
+           psName = makePSFontName(font, font->getID());
+         }
+         setupExternalType1Font(fontLoc->path, psName);
+         break;
+       case fontTrueType:
+       case fontTrueTypeOT:
+         psName = makePSFontName(font, font->getID());
+         setupExternalTrueTypeFont(font, fontLoc->path, psName);
+         break;
+       case fontCIDType2:
+       case fontCIDType2OT:
+         psName = makePSFontName(font, font->getID());
+         //~ should check to see if font actually uses vertical mode
+         setupExternalCIDTrueTypeFont(font, fontLoc->path, psName, gTrue);
+         break;
+       default:
+         break;
+       }
+       break;
+      case gfxFontLocResident:
+       psName = fontLoc->path->copy();
+       break;
+      }
+    }
+
+    if (!psName) {
+      if (font->isCIDFont()) {
+       error(errSyntaxError, -1,
+             "Couldn't find a font to substitute for '{0:s}' ('{1:s}' character collection)",
+             font->getName() ? font->getName()->getCString()
+                             : "(unnamed)",
+             ((GfxCIDFont *)font)->getCollection()
+                 ? ((GfxCIDFont *)font)->getCollection()->getCString()
+                 : "(unknown)");
+       if (font16EncLen >= font16EncSize) {
+         font16EncSize += 16;
+         font16Enc = (PSFont16Enc *)greallocn(font16Enc,
+                                              font16EncSize,
+                                              sizeof(PSFont16Enc));
+       }
+       font16Enc[font16EncLen].fontID = *font->getID();
+       font16Enc[font16EncLen].enc = NULL;
+       ++font16EncLen;
+      } else {
+       error(errSyntaxError, -1,
+             "Couldn't find a font to substitute for '{0:s}'",
+             font->getName() ? font->getName()->getCString()
+                             : "(unnamed)");
+      }
+      delete fontLoc;
+      return;
+    }
+
+    // scale substituted 8-bit fonts
+    if (fontLoc->locType == gfxFontLocResident &&
+       fontLoc->substIdx >= 0) {
+      subst = gTrue;
+      for (code = 0; code < 256; ++code) {
+       if ((charName = ((Gfx8BitFont *)font)->getCharName(code)) &&
+           charName[0] == 'm' && charName[1] == '\0') {
+         break;
+       }
+      }
+      if (code < 256) {
+       w1 = ((Gfx8BitFont *)font)->getWidth(code);
+      } else {
+       w1 = 0;
+      }
+      w2 = psBase14SubstFonts[fontLoc->substIdx].mWidth;
+      xs = w1 / w2;
+      if (xs < 0.1) {
+       xs = 1;
+      }
+    }
+
+    // handle encodings for substituted CID fonts
+    if (fontLoc->locType == gfxFontLocResident &&
+       fontLoc->fontType >= fontCIDType0) {
+      subst = gTrue;
+      if (font16EncLen >= font16EncSize) {
+       font16EncSize += 16;
+       font16Enc = (PSFont16Enc *)greallocn(font16Enc,
+                                            font16EncSize,
+                                            sizeof(PSFont16Enc));
+      }
+      font16Enc[font16EncLen].fontID = *font->getID();
+      if ((uMap = globalParams->getUnicodeMap(fontLoc->encoding))) {
+       font16Enc[font16EncLen].enc = fontLoc->encoding->copy();
+       uMap->decRefCnt();
+      } else {
+       error(errSyntaxError, -1,
+             "Couldn't find Unicode map for 16-bit font encoding '{0:t}'",
+             fontLoc->encoding);
+       font16Enc[font16EncLen].enc = NULL;
+      }
+      ++font16EncLen;
+    }
+
+    delete fontLoc;
+  }
+
+  // generate PostScript code to set up the font
+  if (font->isCIDFont()) {
+    if (level == psLevel3 || level == psLevel3Sep) {
+      writePSFmt("/F{0:d}_{1:d} /{2:t} {3:d} pdfMakeFont16L3\n",
+                font->getID()->num, font->getID()->gen, psName,
+                font->getWMode());
+    } else {
+      writePSFmt("/F{0:d}_{1:d} /{2:t} {3:d} pdfMakeFont16\n",
+                font->getID()->num, font->getID()->gen, psName,
+                font->getWMode());
+    }
+  } else {
+    writePSFmt("/F{0:d}_{1:d} /{2:t} {3:.6g} {4:.6g}\n",
+              font->getID()->num, font->getID()->gen, psName, xs, ys);
+    for (i = 0; i < 256; i += 8) {
+      writePS((char *)((i == 0) ? "[ " : "  "));
+      for (j = 0; j < 8; ++j) {
+       if (font->getType() == fontTrueType &&
+           !subst &&
+           !((Gfx8BitFont *)font)->getHasEncoding()) {
+         sprintf(buf, "c%02x", i+j);
+         charName = buf;
+       } else {
+         charName = ((Gfx8BitFont *)font)->getCharName(i+j);
+       }
+       writePS("/");
+       writePSName(charName ? charName : (char *)".notdef");
+       // the empty name is legal in PDF and PostScript, but PostScript
+       // uses a double-slash (//...) for "immediately evaluated names",
+       // so we need to add a space character here
+       if (charName && !charName[0]) {
+         writePS(" ");
+       }
+      }
+      writePS((i == 256-8) ? (char *)"]\n" : (char *)"\n");
+    }
+    writePS("pdfMakeFont\n");
+  }
+
+  delete psName;
+}
+
+void PSOutputDev::setupEmbeddedType1Font(Ref *id, GooString *psName) {
+  static const char hexChar[17] = "0123456789abcdef";
+  Object refObj, strObj, obj1, obj2, obj3;
+  Dict *dict;
+  int length1, length2, length3;
+  int c;
+  int start[4];
+  GBool binMode;
+  GBool writePadding = gTrue;
+  int i;
+
+  // check if font is already embedded
+  if (fontNames->lookupInt(psName)) {
+    return;
+  }
+  fontNames->add(psName->copy(), 1);
+
+  // get the font stream and info
+  refObj.initRef(id->num, id->gen);
+  refObj.fetch(xref, &strObj);
+  refObj.free();
+  if (!strObj.isStream()) {
+    error(errSyntaxError, -1, "Embedded font file object is not a stream");
+    goto err1;
+  }
+  if (!(dict = strObj.streamGetDict())) {
+    error(errSyntaxError, -1,
+         "Embedded font stream is missing its dictionary");
+    goto err1;
+  }
+  dict->lookup("Length1", &obj1);
+  dict->lookup("Length2", &obj2);
+  dict->lookup("Length3", &obj3);
+  if (!obj1.isInt() || !obj2.isInt() || !obj3.isInt()) {
+    error(errSyntaxError, -1,
+         "Missing length fields in embedded font stream dictionary");
+    obj1.free();
+    obj2.free();
+    obj3.free();
+    goto err1;
+  }
+  length1 = obj1.getInt();
+  length2 = obj2.getInt();
+  length3 = obj3.getInt();
+  obj1.free();
+  obj2.free();
+  obj3.free();
+
+  // beginning comment
+  writePSFmt("%%BeginResource: font {0:t}\n", psName);
+  embFontList->append("%%+ font ");
+  embFontList->append(psName->getCString());
+  embFontList->append("\n");
+
+  // copy ASCII portion of font
+  strObj.streamReset();
+  for (i = 0; i < length1 && (c = strObj.streamGetChar()) != EOF; ++i) {
+    writePSChar(c);
+  }
+
+  // figure out if encrypted portion is binary or ASCII
+  binMode = gFalse;
+  for (i = 0; i < 4; ++i) {
+    start[i] = strObj.streamGetChar();
+    if (start[i] == EOF) {
+      error(errSyntaxError, -1,
+           "Unexpected end of file in embedded font stream");
+      goto err1;
+    }
+    if (!((start[i] >= '0' && start[i] <= '9') ||
+         (start[i] >= 'A' && start[i] <= 'F') ||
+         (start[i] >= 'a' && start[i] <= 'f')))
+      binMode = gTrue;
+  }
+
+  if (length2 == 0)
+  {
+    // length2 == 0 is an error
+    // trying to solve it by just piping all
+    // the stream data
+    error(errSyntaxWarning, -1, "Font has length2 as 0, trying to overcome the problem reading the stream until the end");
+    length2 = INT_MAX;
+    writePadding = gFalse;
+  }
+
+
+  // convert binary data to ASCII
+  if (binMode) {
+    for (i = 0; i < 4; ++i) {
+      writePSChar(hexChar[(start[i] >> 4) & 0x0f]);
+      writePSChar(hexChar[start[i] & 0x0f]);
+    }
+#if 0 // this causes trouble for various PostScript printers
+    // if Length2 is incorrect (too small), font data gets chopped, so
+    // we take a few extra characters from the trailer just in case
+    length2 += length3 >= 8 ? 8 : length3;
+#endif
+    while (i < length2) {
+      if ((c = strObj.streamGetChar()) == EOF) {
+       break;
+      }
+      writePSChar(hexChar[(c >> 4) & 0x0f]);
+      writePSChar(hexChar[c & 0x0f]);
+      if (++i % 32 == 0) {
+       writePSChar('\n');
+      }
+    }
+    if (i % 32 > 0) {
+      writePSChar('\n');
+    }
+
+  // already in ASCII format -- just copy it
+  } else {
+    for (i = 0; i < 4; ++i) {
+      writePSChar(start[i]);
+    }
+    for (i = 4; i < length2; ++i) {
+      if ((c = strObj.streamGetChar()) == EOF) {
+       break;
+      }
+      writePSChar(c);
+    }
+  }
+
+  if (writePadding)
+  {
+    if (length3 > 0) {
+      // write fixed-content portion
+      while ((c = strObj.streamGetChar()) != EOF) {
+       writePSChar(c);
+      }
+    } else {
+      // write padding and "cleartomark"
+      for (i = 0; i < 8; ++i) {
+       writePS("00000000000000000000000000000000"
+               "00000000000000000000000000000000\n");
+      }
+      writePS("cleartomark\n");
+    }
+  }
+
+  // ending comment
+  writePS("%%EndResource\n");
+
+ err1:
+  strObj.streamClose();
+  strObj.free();
+}
+
+//~ This doesn't handle .pfb files or binary eexec data (which only
+//~ happens in pfb files?).
+void PSOutputDev::setupExternalType1Font(GooString *fileName, GooString *psName) {
+  FILE *fontFile;
+  int c;
+
+  if (fontNames->lookupInt(psName)) {
+    return;
+  }
+  fontNames->add(psName->copy(), 1);
+
+  // beginning comment
+  writePSFmt("%%BeginResource: font {0:t}\n", psName);
+  embFontList->append("%%+ font ");
+  embFontList->append(psName->getCString());
+  embFontList->append("\n");
+
+  // copy the font file
+  if (!(fontFile = fopen(fileName->getCString(), "rb"))) {
+    error(errIO, -1, "Couldn't open external font file");
+    return;
+  }
+  while ((c = fgetc(fontFile)) != EOF) {
+    writePSChar(c);
+  }
+  fclose(fontFile);
+
+  // ending comment
+  writePS("%%EndResource\n");
+}
+
+void PSOutputDev::setupEmbeddedType1CFont(GfxFont *font, Ref *id,
+                                         GooString *psName) {
+  char *fontBuf;
+  int fontLen;
+  FoFiType1C *ffT1C;
+  int i;
+
+  // check if font is already embedded
+  for (i = 0; i < t1FontNameLen; ++i) {
+    if (t1FontNames[i].fontFileID.num == id->num &&
+       t1FontNames[i].fontFileID.gen == id->gen) {
+      psName->clear();
+      psName->insert(0, t1FontNames[i].psName);
+      return;
+    }
+  }
+  if (t1FontNameLen == t1FontNameSize) {
+    t1FontNameSize *= 2;
+    t1FontNames = (PST1FontName *)greallocn(t1FontNames, t1FontNameSize,
+                                           sizeof(PST1FontName));
+  }
+  t1FontNames[t1FontNameLen].fontFileID = *id;
+  t1FontNames[t1FontNameLen].psName = psName->copy();
+  ++t1FontNameLen;
+
+  // beginning comment
+  writePSFmt("%%BeginResource: font {0:t}\n", psName);
+  embFontList->append("%%+ font ");
+  embFontList->append(psName->getCString());
+  embFontList->append("\n");
+
+  // convert it to a Type 1 font
+  if ((fontBuf = font->readEmbFontFile(xref, &fontLen))) {
+    if ((ffT1C = FoFiType1C::make(fontBuf, fontLen))) {
+      ffT1C->convertToType1(psName->getCString(), NULL, gTrue,
+                           outputFunc, outputStream);
+      delete ffT1C;
+    }
+    gfree(fontBuf);
+  }
+
+  // ending comment
+  writePS("%%EndResource\n");
+}
+
+void PSOutputDev::setupEmbeddedOpenTypeT1CFont(GfxFont *font, Ref *id,
+                                              GooString *psName) {
+  char *fontBuf;
+  int fontLen;
+  FoFiTrueType *ffTT;
+  int i;
+
+  // check if font is already embedded
+  for (i = 0; i < t1FontNameLen; ++i) {
+    if (t1FontNames[i].fontFileID.num == id->num &&
+       t1FontNames[i].fontFileID.gen == id->gen) {
+      psName->clear();
+      psName->insert(0, t1FontNames[i].psName);
+      return;
+    }
+  }
+  if (t1FontNameLen == t1FontNameSize) {
+    t1FontNameSize *= 2;
+    t1FontNames = (PST1FontName *)greallocn(t1FontNames, t1FontNameSize,
+                                           sizeof(PST1FontName));
+  }
+  t1FontNames[t1FontNameLen].fontFileID = *id;
+  t1FontNames[t1FontNameLen].psName = psName->copy();
+  ++t1FontNameLen;
+
+  // beginning comment
+  writePSFmt("%%BeginResource: font {0:t}\n", psName);
+  embFontList->append("%%+ font ");
+  embFontList->append(psName->getCString());
+  embFontList->append("\n");
+
+  // convert it to a Type 1 font
+  if ((fontBuf = font->readEmbFontFile(xref, &fontLen))) {
+    if ((ffTT = FoFiTrueType::make(fontBuf, fontLen))) {
+      if (ffTT->isOpenTypeCFF()) {
+       ffTT->convertToType1(psName->getCString(), NULL, gTrue,
+                            outputFunc, outputStream);
+      }
+      delete ffTT;
+    }
+    gfree(fontBuf);
+  }
+
+  // ending comment
+  writePS("%%EndResource\n");
+}
+
+void PSOutputDev::setupEmbeddedTrueTypeFont(GfxFont *font, Ref *id,
+                                           GooString *psName) {
+  char *fontBuf;
+  int fontLen;
+  FoFiTrueType *ffTT;
+  int *codeToGID;
+
+  // beginning comment
+  writePSFmt("%%BeginResource: font {0:t}\n", psName);
+  embFontList->append("%%+ font ");
+  embFontList->append(psName->getCString());
+  embFontList->append("\n");
+
+  // convert it to a Type 42 font
+  if ((fontBuf = font->readEmbFontFile(xref, &fontLen))) {
+    if ((ffTT = FoFiTrueType::make(fontBuf, fontLen))) {
+      codeToGID = ((Gfx8BitFont *)font)->getCodeToGIDMap(ffTT);
+      ffTT->convertToType42(psName->getCString(),
+                           ((Gfx8BitFont *)font)->getHasEncoding()
+                             ? ((Gfx8BitFont *)font)->getEncoding()
+                             : (char **)NULL,
+                           codeToGID, outputFunc, outputStream);
+      if (codeToGID) {
+       if (font8InfoLen >= font8InfoSize) {
+         font8InfoSize += 16;
+         font8Info = (PSFont8Info *)greallocn(font8Info,
+                                              font8InfoSize,
+                                              sizeof(PSFont8Info));
+       }
+       font8Info[font8InfoLen].fontID = *font->getID();
+       font8Info[font8InfoLen].codeToGID = codeToGID;
+       ++font8InfoLen;
+      }
+      delete ffTT;
+    }
+    gfree(fontBuf);
+  }
+
+  // ending comment
+  writePS("%%EndResource\n");
+}
+
+void PSOutputDev::setupExternalTrueTypeFont(GfxFont *font, GooString *fileName,
+                                           GooString *psName) {
+  FoFiTrueType *ffTT;
+  int *codeToGID;
+
+  // beginning comment
+  writePSFmt("%%BeginResource: font {0:t}\n", psName);
+  embFontList->append("%%+ font ");
+  embFontList->append(psName->getCString());
+  embFontList->append("\n");
+
+  // convert it to a Type 42 font
+  if ((ffTT = FoFiTrueType::load(fileName->getCString()))) {
+    codeToGID = ((Gfx8BitFont *)font)->getCodeToGIDMap(ffTT);
+    ffTT->convertToType42(psName->getCString(),
+                         ((Gfx8BitFont *)font)->getHasEncoding()
+                           ? ((Gfx8BitFont *)font)->getEncoding()
+                           : (char **)NULL,
+                         codeToGID, outputFunc, outputStream);
+    if (codeToGID) {
+      if (font8InfoLen >= font8InfoSize) {
+       font8InfoSize += 16;
+       font8Info = (PSFont8Info *)greallocn(font8Info,
+                                            font8InfoSize,
+                                            sizeof(PSFont8Info));
+      }
+      font8Info[font8InfoLen].fontID = *font->getID();
+      font8Info[font8InfoLen].codeToGID = codeToGID;
+      ++font8InfoLen;
+    }
+    delete ffTT;
+  }
+
+  // ending comment
+  writePS("%%EndResource\n");
+}
+
+void PSOutputDev::setupExternalCIDTrueTypeFont(GfxFont *font,
+                                              GooString *fileName,
+                                              GooString *psName,
+                                              GBool needVerticalMetrics) {
+  FoFiTrueType *ffTT;
+  int *codeToGID;
+  int codeToGIDLen;
+
+  // beginning comment
+  writePSFmt("%%BeginResource: font {0:t}\n", psName);
+  embFontList->append("%%+ font ");
+  embFontList->append(psName->getCString());
+  embFontList->append("\n");
+
+  // convert it to a Type 0 font
+  //~ this should use fontNum to load the correct font
+  if ((ffTT = FoFiTrueType::load(fileName->getCString()))) {
+
+    // check for embedding permission
+    if (ffTT->getEmbeddingRights() >= 1) {
+      codeToGID = NULL;
+      codeToGIDLen = 0;
+      if (((GfxCIDFont *)font)->getCIDToGID()) {
+       codeToGIDLen = ((GfxCIDFont *)font)->getCIDToGIDLen();
+       if (codeToGIDLen) {
+               codeToGID = (int *)gmallocn(codeToGIDLen, sizeof(int));
+               memcpy(codeToGID, ((GfxCIDFont *)font)->getCIDToGID(),
+                       codeToGIDLen * sizeof(int));
+       }
+      } else {
+       codeToGID = ((GfxCIDFont *)font)->getCodeToGIDMap(ffTT, &codeToGIDLen);
+      }
+      if (ffTT->isOpenTypeCFF()) {
+       ffTT->convertToCIDType0(psName->getCString(),
+               codeToGID, codeToGIDLen,
+               outputFunc, outputStream);
+      } else if (globalParams->getPSLevel() >= psLevel3) {
+       // Level 3: use a CID font
+       ffTT->convertToCIDType2(psName->getCString(),
+               codeToGID, codeToGIDLen,
+               needVerticalMetrics,
+               outputFunc, outputStream);
+      } else {
+       // otherwise: use a non-CID composite font
+       ffTT->convertToType0(psName->getCString(),
+               codeToGID, codeToGIDLen,
+               needVerticalMetrics,
+               outputFunc, outputStream);
+      }
+      gfree(codeToGID);
+    } else {
+      error(errSyntaxError, -1,
+           "TrueType font '%s' does not allow embedding",
+           font->getName() ? font->getName()->getCString() : "(unnamed)");
+           
+    }
+    delete ffTT;
+  }
+
+  // ending comment
+  writePS("%%EndResource\n");
+}
+
+void PSOutputDev::setupEmbeddedCIDType0Font(GfxFont *font, Ref *id,
+                                           GooString *psName) {
+  char *fontBuf;
+  int fontLen;
+  FoFiType1C *ffT1C;
+  int i;
+
+  // check if font is already embedded
+  for (i = 0; i < t1FontNameLen; ++i) {
+    if (t1FontNames[i].fontFileID.num == id->num &&
+       t1FontNames[i].fontFileID.gen == id->gen) {
+      psName->clear();
+      psName->insert(0, t1FontNames[i].psName);
+      return;
+    }
+  }
+  if (t1FontNameLen == t1FontNameSize) {
+    t1FontNameSize *= 2;
+    t1FontNames = (PST1FontName *)greallocn(t1FontNames, t1FontNameSize,
+                                           sizeof(PST1FontName));
+  }
+  t1FontNames[t1FontNameLen].fontFileID = *id;
+  t1FontNames[t1FontNameLen].psName = psName->copy();
+  ++t1FontNameLen;
+
+  // beginning comment
+  writePSFmt("%%BeginResource: font {0:t}\n", psName);
+  embFontList->append("%%+ font ");
+  embFontList->append(psName->getCString());
+  embFontList->append("\n");
+
+  // convert it to a Type 0 font
+  if ((fontBuf = font->readEmbFontFile(xref, &fontLen))) {
+    if ((ffT1C = FoFiType1C::make(fontBuf, fontLen))) {
+      if (globalParams->getPSLevel() >= psLevel3) {
+       // Level 3: use a CID font
+       ffT1C->convertToCIDType0(psName->getCString(), NULL, 0,
+                                outputFunc, outputStream);
+      } else {
+       // otherwise: use a non-CID composite font
+       ffT1C->convertToType0(psName->getCString(), NULL, 0,
+                             outputFunc, outputStream);
+      }
+      delete ffT1C;
+    }
+    gfree(fontBuf);
+  }
+
+  // ending comment
+  writePS("%%EndResource\n");
+}
+
+void PSOutputDev::setupEmbeddedCIDTrueTypeFont(GfxFont *font, Ref *id,
+                                              GooString *psName,
+                                              GBool needVerticalMetrics) {
+  char *fontBuf;
+  int fontLen;
+  FoFiTrueType *ffTT;
+
+  // beginning comment
+  writePSFmt("%%BeginResource: font {0:t}\n", psName);
+  embFontList->append("%%+ font ");
+  embFontList->append(psName->getCString());
+  embFontList->append("\n");
+
+  // convert it to a Type 0 font
+  if ((fontBuf = font->readEmbFontFile(xref, &fontLen))) {
+    if ((ffTT = FoFiTrueType::make(fontBuf, fontLen))) {
+      if (globalParams->getPSLevel() >= psLevel3) {
+       // Level 3: use a CID font
+       ffTT->convertToCIDType2(psName->getCString(),
+                               ((GfxCIDFont *)font)->getCIDToGID(),
+                               ((GfxCIDFont *)font)->getCIDToGIDLen(),
+                               needVerticalMetrics,
+                               outputFunc, outputStream);
+      } else {
+       // otherwise: use a non-CID composite font
+       ffTT->convertToType0(psName->getCString(),
+                            ((GfxCIDFont *)font)->getCIDToGID(),
+                            ((GfxCIDFont *)font)->getCIDToGIDLen(),
+                            needVerticalMetrics,
+                            outputFunc, outputStream);
+      }
+      delete ffTT;
+    }
+    gfree(fontBuf);
+  }
+
+  // ending comment
+  writePS("%%EndResource\n");
+}
+
+void PSOutputDev::setupEmbeddedOpenTypeCFFFont(GfxFont *font, Ref *id,
+                                              GooString *psName) {
+  char *fontBuf;
+  int fontLen;
+  FoFiTrueType *ffTT;
+  int i;
+
+  // check if font is already embedded
+  for (i = 0; i < t1FontNameLen; ++i) {
+    if (t1FontNames[i].fontFileID.num == id->num &&
+       t1FontNames[i].fontFileID.gen == id->gen) {
+      psName->clear();
+      psName->insert(0, t1FontNames[i].psName);
+      return;
+    }
+  }
+  if (t1FontNameLen == t1FontNameSize) {
+    t1FontNameSize *= 2;
+    t1FontNames = (PST1FontName *)greallocn(t1FontNames, t1FontNameSize,
+                                           sizeof(PST1FontName));
+  }
+  t1FontNames[t1FontNameLen].fontFileID = *id;
+  t1FontNames[t1FontNameLen].psName = psName->copy();
+  ++t1FontNameLen;
+
+  // beginning comment
+  writePSFmt("%%BeginResource: font {0:t}\n", psName);
+  embFontList->append("%%+ font ");
+  embFontList->append(psName->getCString());
+  embFontList->append("\n");
+
+  // convert it to a Type 0 font
+  if ((fontBuf = font->readEmbFontFile(xref, &fontLen))) {
+    if ((ffTT = FoFiTrueType::make(fontBuf, fontLen))) {
+      if (ffTT->isOpenTypeCFF()) {
+       if (globalParams->getPSLevel() >= psLevel3) {
+         // Level 3: use a CID font
+         ffTT->convertToCIDType0(psName->getCString(),
+                                 ((GfxCIDFont *)font)->getCIDToGID(),
+                                 ((GfxCIDFont *)font)->getCIDToGIDLen(),
+                                 outputFunc, outputStream);
+       } else {
+         // otherwise: use a non-CID composite font
+         ffTT->convertToType0(psName->getCString(),
+                              ((GfxCIDFont *)font)->getCIDToGID(),
+                              ((GfxCIDFont *)font)->getCIDToGIDLen(),
+                              outputFunc, outputStream);
+       }
+      }
+      delete ffTT;
+    }
+    gfree(fontBuf);
+  }
+
+  // ending comment
+  writePS("%%EndResource\n");
+}
+
+void PSOutputDev::setupType3Font(GfxFont *font, GooString *psName,
+                                Dict *parentResDict) {
+  Dict *resDict;
+  Dict *charProcs;
+  Object charProc;
+  Gfx *gfx;
+  PDFRectangle box;
+  double *m;
+  GooString *buf;
+  int i;
+
+  // set up resources used by font
+  if ((resDict = ((Gfx8BitFont *)font)->getResources())) {
+    inType3Char = gTrue;
+    setupResources(resDict);
+    inType3Char = gFalse;
+  } else {
+    resDict = parentResDict;
+  }
+
+  // beginning comment
+  writePSFmt("%%BeginResource: font {0:t}\n", psName);
+  embFontList->append("%%+ font ");
+  embFontList->append(psName->getCString());
+  embFontList->append("\n");
+
+  // font dictionary
+  writePS("8 dict begin\n");
+  writePS("/FontType 3 def\n");
+  m = font->getFontMatrix();
+  writePSFmt("/FontMatrix [{0:.6g} {1:.6g} {2:.6g} {3:.6g} {4:.6g} {5:.6g}] def\n",
+            m[0], m[1], m[2], m[3], m[4], m[5]);
+  m = font->getFontBBox();
+  writePSFmt("/FontBBox [{0:.6g} {1:.6g} {2:.6g} {3:.6g}] def\n",
+            m[0], m[1], m[2], m[3]);
+  writePS("/Encoding 256 array def\n");
+  writePS("  0 1 255 { Encoding exch /.notdef put } for\n");
+  writePS("/BuildGlyph {\n");
+  writePS("  exch /CharProcs get exch\n");
+  writePS("  2 copy known not { pop /.notdef } if\n");
+  writePS("  get exec\n");
+  writePS("} bind def\n");
+  writePS("/BuildChar {\n");
+  writePS("  1 index /Encoding get exch get\n");
+  writePS("  1 index /BuildGlyph get exec\n");
+  writePS("} bind def\n");
+  if ((charProcs = ((Gfx8BitFont *)font)->getCharProcs())) {
+    writePSFmt("/CharProcs {0:d} dict def\n", charProcs->getLength());
+    writePS("CharProcs begin\n");
+    box.x1 = m[0];
+    box.y1 = m[1];
+    box.x2 = m[2];
+    box.y2 = m[3];
+    gfx = new Gfx(doc, this, resDict, &box, NULL);
+    inType3Char = gTrue;
+    for (i = 0; i < charProcs->getLength(); ++i) {
+      t3FillColorOnly = gFalse;
+      t3Cacheable = gFalse;
+      t3NeedsRestore = gFalse;
+      writePS("/");
+      writePSName(charProcs->getKey(i));
+      writePS(" {\n");
+      gfx->display(charProcs->getVal(i, &charProc));
+      charProc.free();
+      if (t3String) {
+       if (t3Cacheable) {
+         buf = GooString::format("{0:.6g} {1:.6g} {2:.6g} {3:.6g} {4:.6g} {5:.6g} setcachedevice\n",
+                               t3WX, t3WY, t3LLX, t3LLY, t3URX, t3URY);
+       } else {
+         buf = GooString::format("{0:.6g} {1:.6g} setcharwidth\n", t3WX, t3WY);
+       }
+       (*outputFunc)(outputStream, buf->getCString(), buf->getLength());
+       delete buf;
+       (*outputFunc)(outputStream, t3String->getCString(),
+                     t3String->getLength());
+       delete t3String;
+       t3String = NULL;
+      }
+      if (t3NeedsRestore) {
+       (*outputFunc)(outputStream, "Q\n", 2);
+      }
+      writePS("} def\n");
+    }
+    inType3Char = gFalse;
+    delete gfx;
+    writePS("end\n");
+  }
+  writePS("currentdict end\n");
+  writePSFmt("/{0:t} exch definefont pop\n", psName);
+
+  // ending comment
+  writePS("%%EndResource\n");
+}
+
+// Make a unique PS font name, based on the names given in the PDF
+// font object, and an object ID (font file object for 
+GooString *PSOutputDev::makePSFontName(GfxFont *font, Ref *id) {
+  GooString *psName, *s;
+
+  if ((s = font->getEmbeddedFontName())) {
+    psName = filterPSName(s);
+    if (!fontNames->lookupInt(psName)) {
+      fontNames->add(psName->copy(), 1);
+      return psName;
+    }
+    delete psName;
+  }
+  if ((s = font->getName())) {
+    psName = filterPSName(s);
+    if (!fontNames->lookupInt(psName)) {
+      fontNames->add(psName->copy(), 1);
+      return psName;
+    }
+    delete psName;
+  }
+  psName = GooString::format("FF{0:d}_{1:d}", id->num, id->gen);
+  if ((s = font->getEmbeddedFontName())) {
+    s = filterPSName(s);
+    psName->append('_')->append(s);
+    delete s;
+  } else if ((s = font->getName())) {
+    s = filterPSName(s);
+    psName->append('_')->append(s);
+    delete s;
+  }
+  fontNames->add(psName->copy(), 1);
+  return psName;
+}
+
+void PSOutputDev::setupImages(Dict *resDict) {
+  Object xObjDict, xObj, xObjRef, subtypeObj, maskObj, maskRef;
+  Ref imgID;
+  int i, j;
+
+  if (!(mode == psModeForm || inType3Char || preload)) {
+    return;
+  }
+
+  //----- recursively scan XObjects
+  resDict->lookup("XObject", &xObjDict);
+  if (xObjDict.isDict()) {
+    for (i = 0; i < xObjDict.dictGetLength(); ++i) {
+      xObjDict.dictGetValNF(i, &xObjRef);
+      xObjDict.dictGetVal(i, &xObj);
+      if (xObj.isStream()) {
+       xObj.streamGetDict()->lookup("Subtype", &subtypeObj);
+       if (subtypeObj.isName("Image")) {
+         if (xObjRef.isRef()) {
+           imgID = xObjRef.getRef();
+           for (j = 0; j < imgIDLen; ++j) {
+             if (imgIDs[j].num == imgID.num && imgIDs[j].gen == imgID.gen) {
+               break;
+             }
+           }
+           if (j == imgIDLen) {
+             if (imgIDLen >= imgIDSize) {
+               if (imgIDSize == 0) {
+                 imgIDSize = 64;
+               } else {
+                 imgIDSize *= 2;
+               }
+               imgIDs = (Ref *)greallocn(imgIDs, imgIDSize, sizeof(Ref));
+             }
+             imgIDs[imgIDLen++] = imgID;
+             setupImage(imgID, xObj.getStream(), gFalse);
+             if (level >= psLevel3 &&
+                 xObj.streamGetDict()->lookup("Mask", &maskObj)->isStream()) {
+               setupImage(imgID, maskObj.getStream(), gTrue);
+             }
+             maskObj.free();
+           }
+         } else {
+           error(errSyntaxError, -1,
+                 "Image in resource dict is not an indirect reference");
+         }
+       }
+       subtypeObj.free();
+      }
+      xObj.free();
+      xObjRef.free();
+    }
+  }
+  xObjDict.free();
+}
+
+void PSOutputDev::setupImage(Ref id, Stream *str, GBool mask) {
+  GBool useRLE, useCompressed, useASCIIHex;
+  GooString *s;
+  int c;
+  int size, line, col, i;
+  int outerSize, outer;
+
+  // filters
+  //~ this does not correctly handle the DeviceN color space
+  //~   -- need to use DeviceNRecoder
+  if (level < psLevel2) {
+    useRLE = gFalse;
+    useCompressed = gFalse;
+    useASCIIHex = gTrue;
+  } else {
+    if (globalParams->getPSUncompressPreloadedImages()) {
+      useRLE = gFalse;
+      useCompressed = gFalse;
+    } else {
+      s = str->getPSFilter(level < psLevel3 ? 2 : 3, "");
+      if (s) {
+       useRLE = gFalse;
+       useCompressed = gTrue;
+       delete s;
+      } else {
+       useRLE = gTrue;
+       useCompressed = gFalse;
+      }
+    }
+    useASCIIHex = globalParams->getPSASCIIHex();
+  }
+  if (useCompressed) {
+    str = str->getUndecodedStream();
+  }
+  if (useRLE) {
+    str = new RunLengthEncoder(str);
+  }
+  if (useASCIIHex) {
+    str = new ASCIIHexEncoder(str);
+  } else {
+    str = new ASCII85Encoder(str);
+  }
+
+  // compute image data size
+  str->reset();
+  col = size = 0;
+  do {
+    do {
+      c = str->getChar();
+    } while (c == '\n' || c == '\r');
+    if (c == (useASCIIHex ? '>' : '~') || c == EOF) {
+      break;
+    }
+    if (c == 'z') {
+      ++col;
+    } else {
+      ++col;
+      for (i = 1; i <= (useASCIIHex ? 1 : 4); ++i) {
+       do {
+         c = str->getChar();
+       } while (c == '\n' || c == '\r');
+       if (c == (useASCIIHex ? '>' : '~') || c == EOF) {
+         break;
+       }
+       ++col;
+      }
+      if (c == (useASCIIHex ? '>' : '~') || c == EOF) {
+       break;
+      }
+    }
+    if (col > 225) {
+      ++size;
+      col = 0;
+    }
+  } while (c != (useASCIIHex ? '>' : '~') && c != EOF);
+  // add one entry for the final line of data; add another entry
+  // because the RunLengthDecode filter may read past the end
+  ++size;
+  if (useRLE) {
+    ++size;
+  }
+  outerSize = size/65535 + 1;
+
+  writePSFmt("{0:d} array dup /{1:s}Data_{2:d}_{3:d} exch def\n",
+            outerSize, mask ? "Mask" : "Im", id.num, id.gen);
+  str->close();
+
+  // write the data into the array
+  str->reset();
+  for (outer = 0;outer < outerSize;outer++) {
+    int innerSize = size > 65535 ? 65535 : size;
+
+    // put the inner array into the outer array
+    writePSFmt("{0:d} array 1 index {1:d} 2 index put\n",
+              innerSize, outer);
+    line = col = 0;
+    writePS((char *)(useASCIIHex ? "dup 0 <" : "dup 0 <~"));
+    for (;;) {
+      do {
+       c = str->getChar();
+      } while (c == '\n' || c == '\r');
+      if (c == (useASCIIHex ? '>' : '~') || c == EOF) {
+       break;
+      }
+      if (c == 'z') {
+       writePSChar(c);
+       ++col;
+      } else {
+       writePSChar(c);
+       ++col;
+       for (i = 1; i <= (useASCIIHex ? 1 : 4); ++i) {
+         do {
+           c = str->getChar();
+         } while (c == '\n' || c == '\r');
+         if (c == (useASCIIHex ? '>' : '~') || c == EOF) {
+           break;
+         }
+         writePSChar(c);
+         ++col;
+       }
+      }
+      if (c == (useASCIIHex ? '>' : '~') || c == EOF) {
+       break;
+      }
+      // each line is: "dup nnnnn <~...data...~> put<eol>"
+      // so max data length = 255 - 20 = 235
+      // chunks are 1 or 4 bytes each, so we have to stop at 232
+      // but make it 225 just to be safe
+      if (col > 225) {
+       writePS((char *)(useASCIIHex ? "> put\n" : "~> put\n"));
+       ++line;
+       if (line >= innerSize) break;
+       writePSFmt((char *)(useASCIIHex ? "dup {0:d} <" : "dup {0:d} <~"), line);
+       col = 0;
+      }
+    }
+    if (c == (useASCIIHex ? '>' : '~') || c == EOF) {
+      writePS((char *)(useASCIIHex ? "> put\n" : "~> put\n"));
+      if (useRLE) {
+       ++line;
+       writePSFmt("{0:d} <> put\n", line);
+      } else {
+       writePS("pop\n");
+      }
+      break;
+    }
+    writePS("pop\n");
+    size -= innerSize;
+  }
+  writePS("pop\n");
+  str->close();
+
+  delete str;
+}
+
+void PSOutputDev::setupForms(Dict *resDict) {
+  Object xObjDict, xObj, xObjRef, subtypeObj;
+  int i;
+
+  if (!preload) {
+    return;
+  }
+
+  resDict->lookup("XObject", &xObjDict);
+  if (xObjDict.isDict()) {
+    for (i = 0; i < xObjDict.dictGetLength(); ++i) {
+      xObjDict.dictGetValNF(i, &xObjRef);
+      xObjDict.dictGetVal(i, &xObj);
+      if (xObj.isStream()) {
+       xObj.streamGetDict()->lookup("Subtype", &subtypeObj);
+       if (subtypeObj.isName("Form")) {
+         if (xObjRef.isRef()) {
+           setupForm(xObjRef.getRef(), &xObj);
+         } else {
+           error(errSyntaxError, -1,
+                 "Form in resource dict is not an indirect reference");
+         }
+       }
+       subtypeObj.free();
+      }
+      xObj.free();
+      xObjRef.free();
+    }
+  }
+  xObjDict.free();
+}
+
+void PSOutputDev::setupForm(Ref id, Object *strObj) {
+  Dict *dict, *resDict;
+  Object matrixObj, bboxObj, resObj, obj1;
+  double m[6], bbox[4];
+  PDFRectangle box;
+  Gfx *gfx;
+  int i;
+
+  // check if form is already defined
+  for (i = 0; i < formIDLen; ++i) {
+    if (formIDs[i].num == id.num && formIDs[i].gen == id.gen) {
+      return;
+    }
+  }
+
+  // add entry to formIDs list
+  if (formIDLen >= formIDSize) {
+    if (formIDSize == 0) {
+      formIDSize = 64;
+    } else {
+      formIDSize *= 2;
+    }
+    formIDs = (Ref *)greallocn(formIDs, formIDSize, sizeof(Ref));
+  }
+  formIDs[formIDLen++] = id;
+
+  dict = strObj->streamGetDict();
+
+  // get bounding box
+  dict->lookup("BBox", &bboxObj);
+  if (!bboxObj.isArray()) {
+    bboxObj.free();
+    error(errSyntaxError, -1, "Bad form bounding box");
+    return;
+  }
+  for (i = 0; i < 4; ++i) {
+    bboxObj.arrayGet(i, &obj1);
+    bbox[i] = obj1.getNum();
+    obj1.free();
+  }
+  bboxObj.free();
+
+  // get matrix
+  dict->lookup("Matrix", &matrixObj);
+  if (matrixObj.isArray()) {
+    for (i = 0; i < 6; ++i) {
+      matrixObj.arrayGet(i, &obj1);
+      m[i] = obj1.getNum();
+      obj1.free();
+    }
+  } else {
+    m[0] = 1; m[1] = 0;
+    m[2] = 0; m[3] = 1;
+    m[4] = 0; m[5] = 0;
+  }
+  matrixObj.free();
+
+  // get resources
+  dict->lookup("Resources", &resObj);
+  resDict = resObj.isDict() ? resObj.getDict() : (Dict *)NULL;
+
+  writePSFmt("/f_{0:d}_{1:d} {{\n", id.num, id.gen);
+  writePS("q\n");
+  writePSFmt("[{0:.6gs} {1:.6gs} {2:.6gs} {3:.6gs} {4:.6gs} {5:.6gs}] cm\n",
+            m[0], m[1], m[2], m[3], m[4], m[5]);
+
+  box.x1 = bbox[0];
+  box.y1 = bbox[1];
+  box.x2 = bbox[2];
+  box.y2 = bbox[3];
+  gfx = new Gfx(doc, this, resDict, &box, &box);
+  gfx->display(strObj);
+  delete gfx;
+
+  writePS("Q\n");
+  writePS("} def\n");
+
+  resObj.free();
+}
+
+GBool PSOutputDev::checkPageSlice(Page *page, double /*hDPI*/, double /*vDPI*/,
+                                 int rotateA, GBool useMediaBox, GBool crop,
+                                 int sliceX, int sliceY,
+                                 int sliceW, int sliceH,
+                                 GBool printing,
+                                 GBool (*abortCheckCbk)(void *data),
+                                 void *abortCheckCbkData,
+                                 GBool (*annotDisplayDecideCbk)(Annot *annot, void *user_data),
+                                 void *annotDisplayDecideCbkData) {
+  PreScanOutputDev *scan;
+  GBool rasterize;
+#if HAVE_SPLASH
+  GBool mono;
+  double dpi;
+  SplashOutputDev *splashOut;
+  SplashColor paperColor;
+  PDFRectangle box;
+  GfxState *state;
+  SplashBitmap *bitmap;
+  Stream *str0, *str;
+  Object obj;
+  Guchar *p;
+  Guchar col[4];
+  double hDPI2, vDPI2;
+  double m0, m1, m2, m3, m4, m5;
+  int nStripes, stripeH, stripeY;
+  int c, w, h, x, y, comp, i;
+  int numComps, initialNumComps;
+#endif
+  char hexBuf[32*2 + 2];       // 32 values X 2 chars/value + line ending + null
+  Guchar digit;
+  GBool useBinary;
+  GBool isGray;
+
+  if (forceRasterize) {
+    rasterize = gTrue;
+  } else {
+    scan = new PreScanOutputDev(doc);
+    page->displaySlice(scan, 72, 72, rotateA, useMediaBox, crop,
+                      sliceX, sliceY, sliceW, sliceH,
+                      printing, abortCheckCbk, abortCheckCbkData,
+                      annotDisplayDecideCbk, annotDisplayDecideCbkData);
+    rasterize = scan->usesTransparency() || scan->usesPatternImageMask();
+    delete scan;
+  }
+  if (!rasterize) {
+    return gTrue;
+  }
+
+#if HAVE_SPLASH
+  // get the rasterization parameters
+  dpi = globalParams->getPSRasterResolution();
+  mono = globalParams->getPSRasterMono();
+
+  // start the PS page
+  page->makeBox(dpi, dpi, rotateA, useMediaBox, gFalse,
+               sliceX, sliceY, sliceW, sliceH, &box, &crop);
+  rotateA += page->getRotate();
+  if (rotateA >= 360) {
+    rotateA -= 360;
+  } else if (rotateA < 0) {
+    rotateA += 360;
+  }
+  state = new GfxState(dpi, dpi, &box, rotateA, gFalse);
+  startPage(page->getNum(), state);
+  delete state;
+
+  // set up the SplashOutputDev
+  if (mono || level == psLevel1) {
+    numComps = 1;
+    paperColor[0] = 0xff;
+    splashOut = new SplashOutputDev(splashModeMono8, 1, gFalse,
+                                   paperColor, gFalse,
+                                   globalParams->getAntialiasPrinting());
+#if SPLASH_CMYK
+  } else if (level == psLevel1Sep || level == psLevel2Sep ||
+            level == psLevel3Sep || globalParams->getOverprintPreview()) {
+    numComps = 4;
+    paperColor[0] = paperColor[1] = paperColor[2] = paperColor[3] = 0;
+    splashOut = new SplashOutputDev(splashModeCMYK8, 1, gFalse,
+                                   paperColor, gFalse,
+                                   globalParams->getAntialiasPrinting());
+#endif
+  } else {
+    numComps = 3;
+    paperColor[0] = paperColor[1] = paperColor[2] = 0xff;
+    splashOut = new SplashOutputDev(splashModeRGB8, 1, gFalse,
+                                   paperColor, gFalse,
+                                   globalParams->getAntialiasPrinting());
+  }
+  splashOut->startDoc(doc);
+
+  // break the page into stripes
+  hDPI2 = xScale * dpi;
+  vDPI2 = yScale * dpi;
+  if (sliceW < 0 || sliceH < 0) {
+    if (useMediaBox) {
+      box = *page->getMediaBox();
+    } else {
+      box = *page->getCropBox();
+    }
+    sliceX = sliceY = 0;
+    sliceW = (int)((box.x2 - box.x1) * hDPI2 / 72.0);
+    sliceH = (int)((box.y2 - box.y1) * vDPI2 / 72.0);
+  }
+  nStripes = (int)ceil((double)(sliceW * sliceH) /
+                      (double)rasterizationSliceSize);
+  stripeH = (sliceH + nStripes - 1) / nStripes;
+
+  // render the stripes
+  initialNumComps = numComps;
+  for (stripeY = sliceY; stripeY < sliceH; stripeY += stripeH) {
+
+    // rasterize a stripe
+    page->makeBox(hDPI2, vDPI2, 0, useMediaBox, gFalse,
+                 sliceX, stripeY, sliceW, stripeH, &box, &crop);
+    m0 = box.x2 - box.x1;
+    m1 = 0;
+    m2 = 0;
+    m3 = box.y2 - box.y1;
+    m4 = box.x1;
+    m5 = box.y1;
+    page->displaySlice(splashOut, hDPI2, vDPI2,
+                      (360 - page->getRotate()) % 360, useMediaBox, crop,
+                      sliceX, stripeY, sliceW, stripeH,
+                      printing, abortCheckCbk, abortCheckCbkData,
+                      annotDisplayDecideCbk, annotDisplayDecideCbkData);
+
+    // draw the rasterized image
+    bitmap = splashOut->getBitmap();
+    numComps = initialNumComps;
+    w = bitmap->getWidth();
+    h = bitmap->getHeight();
+    writePS("gsave\n");
+    writePSFmt("[{0:.6g} {1:.6g} {2:.6g} {3:.6g} {4:.6g} {5:.6g}] concat\n",
+              m0, m1, m2, m3, m4, m5);
+    switch (level) {
+    case psLevel1:
+      useBinary = globalParams->getPSBinary();
+      writePSFmt("{0:d} {1:d} 8 [{2:d} 0 0 {3:d} 0 {4:d}] pdfIm1{5:s}\n",
+                w, h, w, -h, h,
+                useBinary ? "Bin" : "");
+      p = bitmap->getDataPtr() + (h - 1) * bitmap->getRowSize();
+      i = 0;
+      if (useBinary) {
+       for (y = 0; y < h; ++y) {
+         for (x = 0; x < w; ++x) {
+           hexBuf[i++] = *p++;
+           if (i >= 64) {
+             writePSBuf(hexBuf, i);
+             i = 0;
+           }
+         }
+       }
+      } else {
+       for (y = 0; y < h; ++y) {
+         for (x = 0; x < w; ++x) {
+           digit = *p / 16;
+           hexBuf[i++] = digit + ((digit >= 10)? 'a' - 10: '0');
+           digit = *p++ % 16;
+           hexBuf[i++] = digit + ((digit >= 10)? 'a' - 10: '0');
+           if (i >= 64) {
+             hexBuf[i++] = '\n';
+             writePSBuf(hexBuf, i);
+             i = 0;
+           }
+         }
+       }
+      }
+      if (i != 0) {
+        if (!useBinary) {
+         hexBuf[i++] = '\n';
+        }
+        writePSBuf(hexBuf, i);
+      }
+      break;
+    case psLevel1Sep:
+      useBinary = globalParams->getPSBinary();
+      p = bitmap->getDataPtr();
+      // Check for an all gray image
+      isGray = gTrue;
+      for (y = 0; y < h; ++y) {
+       for (x = 0; x < w; ++x) {
+         if (p[4*x] != p[4*x + 1] || p[4*x] != p[4*x + 2]) {
+           isGray = gFalse;
+           y = h;
+           break;
+         }
+       }
+       p += bitmap->getRowSize();
+      }
+      writePSFmt("{0:d} {1:d} 8 [{2:d} 0 0 {3:d} 0 {4:d}] pdfIm1{5:s}{6:s}\n",
+                w, h, w, -h, h,
+                isGray ? "" : "Sep",
+                useBinary ? "Bin" : "");
+      p = bitmap->getDataPtr() + (h - 1) * bitmap->getRowSize();
+      i = 0;
+      col[0] = col[1] = col[2] = col[3] = 0;
+      if (isGray) {
+        int g;
+        if ((psProcessBlack & processColors) == 0) {
+         // Check if the image uses black
+         for (y = 0; y < h; ++y) {
+           for (x = 0; x < w; ++x) {
+             if (p[4*x] > 0 || p[4*x + 3] > 0) {
+               col[3] = 1;
+               y = h;
+               break;
+             }
+           }
+            p -= bitmap->getRowSize();
+         }
+          p = bitmap->getDataPtr() + (h - 1) * bitmap->getRowSize();
+        }
+        for (y = 0; y < h; ++y) {
+         if (useBinary) {
+           // Binary gray image
+           for (x = 0; x < w; ++x) {
+             g = p[4*x] + p[4*x + 3];
+             g = 255 - g;
+             if (g < 0) g = 0;
+             hexBuf[i++] = (Guchar) g;
+             if (i >= 64) {
+               writePSBuf(hexBuf, i);
+               i = 0;
+             }
+           }
+         } else {
+           // Hex gray image
+           for (x = 0; x < w; ++x) {
+             g = p[4*x] + p[4*x + 3];
+             g = 255 - g;
+             if (g < 0) g = 0;
+             digit = g / 16;
+             hexBuf[i++] = digit + ((digit >= 10)? 'a' - 10: '0');
+             digit = g % 16;
+             hexBuf[i++] = digit + ((digit >= 10)? 'a' - 10: '0');
+             if (i >= 64) {
+               hexBuf[i++] = '\n';
+               writePSBuf(hexBuf, i);
+               i = 0;
+             }
+           }
+          }
+          p -= bitmap->getRowSize();
+        }
+      } else if (((psProcessCyan | psProcessMagenta | psProcessYellow | psProcessBlack) & ~processColors) != 0) {
+       // Color image, need to check color flags for each dot
+        for (y = 0; y < h; ++y) {
+          for (comp = 0; comp < 4; ++comp) {
+           if (useBinary) {
+             // Binary color image
+             for (x = 0; x < w; ++x) {
+               col[comp] |= p[4*x + comp];
+               hexBuf[i++] = p[4*x + comp];
+               if (i >= 64) {
+                 writePSBuf(hexBuf, i);
+                 i = 0;
+               }
+             }
+           } else {
+             // Gray color image
+             for (x = 0; x < w; ++x) {
+               col[comp] |= p[4*x + comp];
+               digit = p[4*x + comp] / 16;
+               hexBuf[i++] = digit + ((digit >= 10)? 'a' - 10: '0');
+               digit = p[4*x + comp] % 16;
+               hexBuf[i++] = digit + ((digit >= 10)? 'a' - 10: '0');
+               if (i >= 64) {
+                 hexBuf[i++] = '\n';
+                 writePSBuf(hexBuf, i);
+                 i = 0;
+               }
+             }
+           }
+          }
+          p -= bitmap->getRowSize();
+        }
+      } else {
+       // Color image, do not need to check color flags
+        for (y = 0; y < h; ++y) {
+          for (comp = 0; comp < 4; ++comp) {
+           if (useBinary) {
+             // Binary color image
+             for (x = 0; x < w; ++x) {
+               hexBuf[i++] = p[4*x + comp];
+               if (i >= 64) {
+                 writePSBuf(hexBuf, i);
+                 i = 0;
+               }
+             }
+           } else {
+             // Hex color image
+             for (x = 0; x < w; ++x) {
+               digit = p[4*x + comp] / 16;
+               hexBuf[i++] = digit + ((digit >= 10)? 'a' - 10: '0');
+               digit = p[4*x + comp] % 16;
+               hexBuf[i++] = digit + ((digit >= 10)? 'a' - 10: '0');
+               if (i >= 64) {
+                 hexBuf[i++] = '\n';
+                 writePSBuf(hexBuf, i);
+                 i = 0;
+               }
+             }
+           }
+          }
+          p -= bitmap->getRowSize();
+        }
+      }
+      if (i != 0) {
+        if (!useBinary) {
+          hexBuf[i++] = '\n';
+        }
+        writePSBuf(hexBuf, i);
+      }
+      if (col[0]) {
+       processColors |= psProcessCyan;
+      }
+      if (col[1]) {
+       processColors |= psProcessMagenta;
+      }
+      if (col[2]) {
+       processColors |= psProcessYellow;
+      }
+      if (col[3]) {
+       processColors |= psProcessBlack;
+      }
+      break;
+    case psLevel2:
+    case psLevel2Sep:
+    case psLevel3:
+    case psLevel3Sep:
+      obj.initNull();
+      p = bitmap->getDataPtr() + (h - 1) * bitmap->getRowSize();
+      str0 = new MemStream((char *)p, 0, w * h * numComps, &obj);
+      // Check for a color image that uses only gray
+      if (numComps == 4) {
+        int compCyan;
+        isGray = gTrue;
+        while ((compCyan = str0->getChar()) != EOF) {
+         if (str0->getChar() != compCyan ||
+             str0->getChar() != compCyan) {
+           isGray = gFalse;
+           break;
+         }
+         str0->getChar();
+       }
+      } else if (numComps == 3) {
+       int compRed;
+       isGray = gTrue;
+       while ((compRed = str0->getChar()) != EOF) {
+         if (str0->getChar() != compRed ||
+             str0->getChar() != compRed) {
+           isGray = gFalse;
+           break;
+         }
+       }
+      } else {
+        isGray = gFalse;
+      }
+      str0->reset();
+      if (isGray && numComps == 4) {
+       str = new RunLengthEncoder(new CMYKGrayEncoder(str0));
+       numComps = 1;
+      } else if (isGray && numComps == 3) {
+       str = new RunLengthEncoder(new RGBGrayEncoder(str0));
+       numComps = 1;
+      } else {
+       str = new RunLengthEncoder(str0);
+      }
+      if (numComps == 1) {
+       writePS("/DeviceGray setcolorspace\n");
+      } else if (numComps == 3) {
+       writePS("/DeviceRGB setcolorspace\n");
+      } else {
+       writePS("/DeviceCMYK setcolorspace\n");
+      }
+      writePS("<<\n  /ImageType 1\n");
+      writePSFmt("  /Width {0:d}\n", bitmap->getWidth());
+      writePSFmt("  /Height {0:d}\n", bitmap->getHeight());
+      writePSFmt("  /ImageMatrix [{0:d} 0 0 {1:d} 0 {2:d}]\n", w, -h, h);
+      writePS("  /BitsPerComponent 8\n");
+      if (numComps == 1) {
+       writePS("  /Decode [1 0]\n");
+      } else if (numComps == 3) {
+       writePS("  /Decode [0 1 0 1 0 1]\n");
+      } else {
+       writePS("  /Decode [0 1 0 1 0 1 0 1]\n");
+      }
+      writePS("  /DataSource currentfile\n");
+      useBinary = globalParams->getPSBinary();
+      if (useBinary) {
+       /* nothing to do */;
+      } else if (globalParams->getPSASCIIHex()) {
+       writePS("    /ASCIIHexDecode filter\n");
+      } else {
+       writePS("    /ASCII85Decode filter\n");
+      }
+      writePS("    /RunLengthDecode filter\n");
+      writePS(">>\n");
+      if (useBinary) {
+       /* nothing to do */;
+      } else if (globalParams->getPSASCIIHex()) {
+       str = new ASCIIHexEncoder(str);
+      } else {
+       str = new ASCII85Encoder(str);
+      }
+      str->reset();
+      if (useBinary) {
+       // Count the bytes to write a document comment
+       int len = 0;
+       while (str->getChar() != EOF) {
+         len++;
+       }
+       str->reset();
+       writePSFmt("%%BeginData: {0:d} Binary Bytes\n", len+6+1);
+      }
+      writePS("image\n");
+      while ((c = str->getChar()) != EOF) {
+       writePSChar(c);
+      }
+      str->close();
+      delete str;
+      delete str0;
+      writePSChar('\n');
+      if (useBinary) {
+       writePS("%%EndData\n");
+      }
+      processColors |= (numComps == 1) ? psProcessBlack : psProcessCMYK;
+      break;
+    }
+    writePS("grestore\n");
+  }
+
+  delete splashOut;
+
+  // finish the PS page
+  endPage();
+
+  return gFalse;
+
+#else // HAVE_SPLASH
+
+  error(errSyntaxWarning, -1,
+       "PDF page uses transparency and PSOutputDev was built without"
+       " the Splash rasterizer - output may not be correct");
+  return gTrue;
+#endif // HAVE_SPLASH
+}
+
+void PSOutputDev::startPage(int pageNum, GfxState *state) {
+  Page *page;
+  int x1, y1, x2, y2, width, height, t;
+  int imgWidth, imgHeight, imgWidth2, imgHeight2;
+  GBool landscape;
+  GooString *s;
+
+
+  if (mode == psModePS || mode == psModePSOrigPageSizes) {
+    GooString pageLabel;
+    const GBool gotLabel = doc->getCatalog()->indexToLabel(pageNum -1, &pageLabel);
+    if (gotLabel) {
+      // See bug13338 for why we try to avoid parentheses...
+      GBool needParens;
+      GooString *filteredString = filterPSLabel(&pageLabel, &needParens);
+      if (needParens) {
+       writePSFmt("%%Page: ({0:t}) {1:d}\n", filteredString, seqPage);
+      } else {
+       writePSFmt("%%Page: {0:t} {1:d}\n", filteredString, seqPage);
+      }
+      delete filteredString;
+    } else {
+      writePSFmt("%%Page: {0:d} {1:d}\n", pageNum, seqPage);
+    }
+    if (paperMatch) {
+      page = doc->getCatalog()->getPage(pageNum);
+      imgLLX = imgLLY = 0;
+      imgURX = (int)ceil(page->getMediaWidth());
+      imgURY = (int)ceil(page->getMediaHeight());
+      if (state->getRotate() == 90 || state->getRotate() == 270) {
+       t = imgURX;
+       imgURX = imgURY;
+       imgURY = t;
+      }
+      writePSFmt("%%PageMedia: {0:d}x{1:d}\n", imgURX, imgURY);
+      writePSFmt("%%PageBoundingBox: 0 0 {0:d} {1:d}\n", imgURX, imgURY);
+    }
+    if (mode != psModePSOrigPageSizes)
+      writePS("%%BeginPageSetup\n");
+  }
+
+  // underlays
+  if (underlayCbk) {
+    (*underlayCbk)(this, underlayCbkData);
+  }
+  if (overlayCbk) {
+    saveState(NULL);
+  }
+
+  xScale = yScale = 1;
+  switch (mode) {
+
+  case psModePSOrigPageSizes:
+    x1 = (int)floor(state->getX1());
+    y1 = (int)floor(state->getY1());
+    x2 = (int)ceil(state->getX2());
+    y2 = (int)ceil(state->getY2());
+    width = x2 - x1;
+    height = y2 - y1;
+    if (width > height) {
+      landscape = gTrue;
+    } else {
+      landscape = gFalse;
+    }
+    writePSFmt("%%PageBoundingBox: {0:d} {1:d} {2:d} {3:d}\n", x1, y1, x2 - x1, y2 - y1);
+    writePS("%%BeginPageSetup\n");
+    writePSFmt("%%PageOrientation: {0:s}\n",
+              landscape ? "Landscape" : "Portrait");
+    if ((width != prevWidth) || (height != prevHeight)) {
+      // Set page size only when it actually changes, as otherwise Duplex
+      // printing does not work
+      writePSFmt("<</PageSize [{0:d} {1:d}]>> setpagedevice\n", width, height);
+      prevWidth = width;
+      prevHeight = height;
+    }
+    writePS("pdfStartPage\n");
+    writePSFmt("{0:d} {1:d} {2:d} {3:d} re W\n", x1, y1, x2 - x1, y2 - y1);
+    writePS("%%EndPageSetup\n");
+    ++seqPage;
+    break;
+
+  case psModePS:
+    // rotate, translate, and scale page
+    imgWidth = imgURX - imgLLX;
+    imgHeight = imgURY - imgLLY;
+    x1 = (int)floor(state->getX1());
+    y1 = (int)floor(state->getY1());
+    x2 = (int)ceil(state->getX2());
+    y2 = (int)ceil(state->getY2());
+    width = x2 - x1;
+    height = y2 - y1;
+    tx = ty = 0;
+    // rotation and portrait/landscape mode
+    if (paperMatch) {
+      rotate = (360 - state->getRotate()) % 360;
+      landscape = gFalse;
+    } else if (rotate0 >= 0) {
+      rotate = (360 - rotate0) % 360;
+      landscape = gFalse;
+    } else {
+      rotate = (360 - state->getRotate()) % 360;
+      if (rotate == 0 || rotate == 180) {
+       if ((width < height && imgWidth > imgHeight && height > imgHeight) ||
+           (width > height && imgWidth < imgHeight && width > imgWidth)) {
+         rotate += 90;
+         landscape = gTrue;
+       } else {
+         landscape = gFalse;
+       }
+      } else { // rotate == 90 || rotate == 270
+       if ((height < width && imgWidth > imgHeight && width > imgHeight) ||
+           (height > width && imgWidth < imgHeight && height > imgWidth)) {
+         rotate = 270 - rotate;
+         landscape = gTrue;
+       } else {
+         landscape = gFalse;
+       }
+      }
+    }
+    writePSFmt("%%PageOrientation: {0:s}\n",
+              landscape ? "Landscape" : "Portrait");
+    if (paperMatch) {
+      writePSFmt("{0:d} {1:d} pdfSetupPaper\n", imgURX, imgURY);
+    }
+    writePS("pdfStartPage\n");
+    if (rotate == 0) {
+      imgWidth2 = imgWidth;
+      imgHeight2 = imgHeight;
+    } else if (rotate == 90) {
+      writePS("90 rotate\n");
+      ty = -imgWidth;
+      imgWidth2 = imgHeight;
+      imgHeight2 = imgWidth;
+    } else if (rotate == 180) {
+      writePS("180 rotate\n");
+      imgWidth2 = imgWidth;
+      imgHeight2 = imgHeight;
+      tx = -imgWidth;
+      ty = -imgHeight;
+    } else { // rotate == 270
+      writePS("270 rotate\n");
+      tx = -imgHeight;
+      imgWidth2 = imgHeight;
+      imgHeight2 = imgWidth;
+    }
+    // shrink or expand
+    if (xScale0 > 0 && yScale0 > 0) {
+      xScale = xScale0;
+      yScale = yScale0;
+    } else if ((globalParams->getPSShrinkLarger() &&
+        (width > imgWidth2 || height > imgHeight2)) ||
+       (globalParams->getPSExpandSmaller() &&
+        (width < imgWidth2 && height < imgHeight2))) {
+      xScale = (double)imgWidth2 / (double)width;
+      yScale = (double)imgHeight2 / (double)height;
+      if (yScale < xScale) {
+       xScale = yScale;
+      } else {
+       yScale = xScale;
+      }
+    }
+    // deal with odd bounding boxes or clipping
+    if (clipLLX0 < clipURX0 && clipLLY0 < clipURY0) {
+      tx -= xScale * clipLLX0;
+      ty -= yScale * clipLLY0;
+    } else {
+      tx -= xScale * x1;
+      ty -= yScale * y1;
+    }
+    // center
+    if (tx0 >= 0 && ty0 >= 0) {
+      tx += (rotate == 0 || rotate == 180) ? tx0 : ty0;
+      ty += (rotate == 0 || rotate == 180) ? ty0 : -tx0;
+    } else if (globalParams->getPSCenter()) {
+      if (clipLLX0 < clipURX0 && clipLLY0 < clipURY0) {
+       tx += (imgWidth2 - xScale * (clipURX0 - clipLLX0)) / 2;
+       ty += (imgHeight2 - yScale * (clipURY0 - clipLLY0)) / 2;
+      } else {
+       tx += (imgWidth2 - xScale * width) / 2;
+       ty += (imgHeight2 - yScale * height) / 2;
+      }
+    }
+    tx += (rotate == 0 || rotate == 180) ? imgLLX : imgLLY;
+    ty += (rotate == 0 || rotate == 180) ? imgLLY : -imgLLX;
+    if (tx != 0 || ty != 0) {
+      writePSFmt("{0:.6g} {1:.6g} translate\n", tx, ty);
+    }
+    if (xScale != 1 || yScale != 1) {
+      writePSFmt("{0:.6f} {1:.6f} scale\n", xScale, yScale);
+    }
+    if (clipLLX0 < clipURX0 && clipLLY0 < clipURY0) {
+      writePSFmt("{0:.6g} {1:.6g} {2:.6g} {3:.6g} re W\n",
+                clipLLX0, clipLLY0, clipURX0 - clipLLX0, clipURY0 - clipLLY0);
+    } else {
+      writePSFmt("{0:d} {1:d} {2:d} {3:d} re W\n", x1, y1, x2 - x1, y2 - y1);
+    }
+
+    ++seqPage;
+    break;
+
+  case psModeEPS:
+    writePS("pdfStartPage\n");
+    tx = ty = 0;
+    rotate = (360 - state->getRotate()) % 360;
+    if (rotate == 0) {
+    } else if (rotate == 90) {
+      writePS("90 rotate\n");
+      tx = -epsX1;
+      ty = -epsY2;
+    } else if (rotate == 180) {
+      writePS("180 rotate\n");
+      tx = -(epsX1 + epsX2);
+      ty = -(epsY1 + epsY2);
+    } else { // rotate == 270
+      writePS("270 rotate\n");
+      tx = -epsX2;
+      ty = -epsY1;
+    }
+    if (tx != 0 || ty != 0) {
+      writePSFmt("{0:.6g} {1:.6g} translate\n", tx, ty);
+    }
+    break;
+
+  case psModeForm:
+    writePS("/PaintProc {\n");
+    writePS("begin xpdf begin\n");
+    writePS("pdfStartPage\n");
+    tx = ty = 0;
+    rotate = 0;
+    break;
+  }
+
+  if (customCodeCbk) {
+    if ((s = (*customCodeCbk)(this, psOutCustomPageSetup, pageNum,
+                             customCodeCbkData))) {
+      writePS(s->getCString());
+      delete s;
+    }
+  }
+
+  if (mode == psModePS) {
+    writePS("%%EndPageSetup\n");
+  }
+}
+
+void PSOutputDev::endPage() {
+  if (overlayCbk) {
+    restoreState(NULL);
+    (*overlayCbk)(this, overlayCbkData);
+  }
+
+
+  if (mode == psModeForm) {
+    writePS("pdfEndPage\n");
+    writePS("end end\n");
+    writePS("} def\n");
+    writePS("end end\n");
+  } else {
+    if (!manualCtrl) {
+      writePS("showpage\n");
+    }
+      writePS("%%PageTrailer\n");
+      writePageTrailer();
+    }
+}
+
+void PSOutputDev::saveState(GfxState *state) {
+  writePS("q\n");
+  ++numSaves;
+}
+
+void PSOutputDev::restoreState(GfxState *state) {
+  writePS("Q\n");
+  --numSaves;
+}
+
+void PSOutputDev::updateCTM(GfxState *state, double m11, double m12,
+                           double m21, double m22, double m31, double m32) {
+  writePSFmt("[{0:.6gs} {1:.6gs} {2:.6gs} {3:.6gs} {4:.6gs} {5:.6gs}] cm\n",
+            m11, m12, m21, m22, m31, m32);
+}
+
+void PSOutputDev::updateLineDash(GfxState *state) {
+  double *dash;
+  double start;
+  int length, i;
+
+  state->getLineDash(&dash, &length, &start);
+  writePS("[");
+  for (i = 0; i < length; ++i) {
+    writePSFmt("{0:.6g}{1:w}",
+              dash[i] < 0 ? 0 : dash[i],
+              (i == length-1) ? 0 : 1);
+  }
+  writePSFmt("] {0:.6g} d\n", start);
+}
+
+void PSOutputDev::updateFlatness(GfxState *state) {
+  writePSFmt("{0:d} i\n", state->getFlatness());
+}
+
+void PSOutputDev::updateLineJoin(GfxState *state) {
+  writePSFmt("{0:d} j\n", state->getLineJoin());
+}
+
+void PSOutputDev::updateLineCap(GfxState *state) {
+  writePSFmt("{0:d} J\n", state->getLineCap());
+}
+
+void PSOutputDev::updateMiterLimit(GfxState *state) {
+  writePSFmt("{0:.6g} M\n", state->getMiterLimit());
+}
+
+void PSOutputDev::updateLineWidth(GfxState *state) {
+  writePSFmt("{0:.6g} w\n", state->getLineWidth());
+}
+
+void PSOutputDev::updateFillColorSpace(GfxState *state) {
+  if (inUncoloredPattern) {
+    return;
+  }
+  switch (level) {
+  case psLevel1:
+  case psLevel1Sep:
+    break;
+  case psLevel2:
+  case psLevel3:
+    if (state->getFillColorSpace()->getMode() != csPattern) {
+      dumpColorSpaceL2(state->getFillColorSpace(), gTrue, gFalse, gFalse);
+      writePS(" cs\n");
+    }
+    break;
+  case psLevel2Sep:
+  case psLevel3Sep:
+    break;
+  }
+}
+
+void PSOutputDev::updateStrokeColorSpace(GfxState *state) {
+  if (inUncoloredPattern) {
+    return;
+  }
+  switch (level) {
+  case psLevel1:
+  case psLevel1Sep:
+    break;
+  case psLevel2:
+  case psLevel3:
+    if (state->getStrokeColorSpace()->getMode() != csPattern) {
+      dumpColorSpaceL2(state->getStrokeColorSpace(), gTrue, gFalse, gFalse);
+      writePS(" CS\n");
+    }
+    break;
+  case psLevel2Sep:
+  case psLevel3Sep:
+    break;
+  }
+}
+
+void PSOutputDev::updateFillColor(GfxState *state) {
+  GfxColor color;
+  GfxColor *colorPtr;
+  GfxGray gray;
+  GfxCMYK cmyk;
+  GfxSeparationColorSpace *sepCS;
+  double c, m, y, k;
+  int i;
+
+  if (inUncoloredPattern) {
+    return;
+  }
+  switch (level) {
+  case psLevel1:
+    state->getFillGray(&gray);
+    writePSFmt("{0:.4g} g\n", colToDbl(gray));
+    break;
+  case psLevel1Sep:
+    state->getFillCMYK(&cmyk);
+    c = colToDbl(cmyk.c);
+    m = colToDbl(cmyk.m);
+    y = colToDbl(cmyk.y);
+    k = colToDbl(cmyk.k);
+    writePSFmt("{0:.4g} {1:.4g} {2:.4g} {3:.4g} k\n", c, m, y, k);
+    addProcessColor(c, m, y, k);
+    break;
+  case psLevel2:
+  case psLevel3:
+    if (state->getFillColorSpace()->getMode() != csPattern) {
+      colorPtr = state->getFillColor();
+      writePS("[");
+      for (i = 0; i < state->getFillColorSpace()->getNComps(); ++i) {
+       if (i > 0) {
+         writePS(" ");
+      }
+       writePSFmt("{0:.4g}", colToDbl(colorPtr->c[i]));
+      }
+      writePS("] sc\n");
+    }
+    break;
+  case psLevel2Sep:
+  case psLevel3Sep:
+    if (state->getFillColorSpace()->getMode() == csSeparation) {
+      sepCS = (GfxSeparationColorSpace *)state->getFillColorSpace();
+      color.c[0] = gfxColorComp1;
+      sepCS->getCMYK(&color, &cmyk);
+      writePSFmt("{0:.4g} {1:.4g} {2:.4g} {3:.4g} {4:.4g} ({5:t}) ck\n",
+                colToDbl(state->getFillColor()->c[0]),
+                colToDbl(cmyk.c), colToDbl(cmyk.m),
+                colToDbl(cmyk.y), colToDbl(cmyk.k),
+                sepCS->getName());
+      addCustomColor(sepCS);
+    } else {
+      state->getFillCMYK(&cmyk);
+      c = colToDbl(cmyk.c);
+      m = colToDbl(cmyk.m);
+      y = colToDbl(cmyk.y);
+      k = colToDbl(cmyk.k);
+      writePSFmt("{0:.4g} {1:.4g} {2:.4g} {3:.4g} k\n", c, m, y, k);
+      addProcessColor(c, m, y, k);
+    }
+    break;
+  }
+  t3Cacheable = gFalse;
+}
+
+void PSOutputDev::updateStrokeColor(GfxState *state) {
+  GfxColor color;
+  GfxColor *colorPtr;
+  GfxGray gray;
+  GfxCMYK cmyk;
+  GfxSeparationColorSpace *sepCS;
+  double c, m, y, k;
+  int i;
+
+  if (inUncoloredPattern) {
+    return;
+  }
+  switch (level) {
+  case psLevel1:
+    state->getStrokeGray(&gray);
+    writePSFmt("{0:.4g} G\n", colToDbl(gray));
+    break;
+  case psLevel1Sep:
+    state->getStrokeCMYK(&cmyk);
+    c = colToDbl(cmyk.c);
+    m = colToDbl(cmyk.m);
+    y = colToDbl(cmyk.y);
+    k = colToDbl(cmyk.k);
+    writePSFmt("{0:.4g} {1:.4g} {2:.4g} {3:.4g} K\n", c, m, y, k);
+    addProcessColor(c, m, y, k);
+    break;
+  case psLevel2:
+  case psLevel3:
+    if (state->getStrokeColorSpace()->getMode() != csPattern) {
+      colorPtr = state->getStrokeColor();
+      writePS("[");
+      for (i = 0; i < state->getStrokeColorSpace()->getNComps(); ++i) {
+       if (i > 0) {
+         writePS(" ");
+       }
+       writePSFmt("{0:.4g}", colToDbl(colorPtr->c[i]));
+      }
+      writePS("] SC\n");
+    }
+    break;
+  case psLevel2Sep:
+  case psLevel3Sep:
+    if (state->getStrokeColorSpace()->getMode() == csSeparation) {
+      sepCS = (GfxSeparationColorSpace *)state->getStrokeColorSpace();
+      color.c[0] = gfxColorComp1;
+      sepCS->getCMYK(&color, &cmyk);
+      writePSFmt("{0:.4g} {1:.4g} {2:.4g} {3:.4g} {4:.4g} ({5:t}) CK\n",
+                colToDbl(state->getStrokeColor()->c[0]),
+                colToDbl(cmyk.c), colToDbl(cmyk.m),
+                colToDbl(cmyk.y), colToDbl(cmyk.k),
+                sepCS->getName());
+      addCustomColor(sepCS);
+    } else {
+      state->getStrokeCMYK(&cmyk);
+      c = colToDbl(cmyk.c);
+      m = colToDbl(cmyk.m);
+      y = colToDbl(cmyk.y);
+      k = colToDbl(cmyk.k);
+      writePSFmt("{0:.4g} {1:.4g} {2:.4g} {3:.4g} K\n", c, m, y, k);
+      addProcessColor(c, m, y, k);
+    }
+    break;
+  }
+  t3Cacheable = gFalse;
+}
+
+void PSOutputDev::addProcessColor(double c, double m, double y, double k) {
+  if (c > 0) {
+    processColors |= psProcessCyan;
+  }
+  if (m > 0) {
+    processColors |= psProcessMagenta;
+  }
+  if (y > 0) {
+    processColors |= psProcessYellow;
+  }
+  if (k > 0) {
+    processColors |= psProcessBlack;
+  }
+}
+
+void PSOutputDev::addCustomColor(GfxSeparationColorSpace *sepCS) {
+  PSOutCustomColor *cc;
+  GfxColor color;
+  GfxCMYK cmyk;
+
+  if (!sepCS->getName()->cmp("Black")) {
+    processColors |= psProcessBlack;
+    return;
+  }
+  if (!sepCS->getName()->cmp("Cyan")) {
+    processColors |= psProcessCyan;
+    return;
+  }
+  if (!sepCS->getName()->cmp("Yellow")) {
+    processColors |= psProcessYellow;
+    return;
+  }
+  if (!sepCS->getName()->cmp("Magenta")) {
+    processColors |= psProcessMagenta;
+    return;
+  }
+  if (!sepCS->getName()->cmp("All")) 
+    return;
+  if (!sepCS->getName()->cmp("None")) 
+    return;
+  for (cc = customColors; cc; cc = cc->next) {
+    if (!cc->name->cmp(sepCS->getName())) {
+      return;
+    }
+  }
+  color.c[0] = gfxColorComp1;
+  sepCS->getCMYK(&color, &cmyk);
+  cc = new PSOutCustomColor(colToDbl(cmyk.c), colToDbl(cmyk.m),
+                           colToDbl(cmyk.y), colToDbl(cmyk.k),
+                           sepCS->getName()->copy());
+  cc->next = customColors;
+  customColors = cc;
+}
+
+void PSOutputDev::updateFillOverprint(GfxState *state) {
+  if (level >= psLevel2) {
+    writePSFmt("{0:s} op\n", state->getFillOverprint() ? "true" : "false");
+  }
+}
+
+void PSOutputDev::updateStrokeOverprint(GfxState *state) {
+  if (level >= psLevel2) {
+    writePSFmt("{0:s} OP\n", state->getStrokeOverprint() ? "true" : "false");
+  }
+}
+
+void PSOutputDev::updateOverprintMode(GfxState *state) {
+  if (level >= psLevel3) {
+    writePSFmt("{0:s} opm\n", state->getOverprintMode() ? "true" : "false");
+  }
+}
+
+void PSOutputDev::updateTransfer(GfxState *state) {
+  Function **funcs;
+  int i;
+
+  funcs = state->getTransfer();
+  if (funcs[0] && funcs[1] && funcs[2] && funcs[3]) {
+    if (level >= psLevel2) {
+      for (i = 0; i < 4; ++i) {
+       cvtFunction(funcs[i]);
+      }
+      writePS("setcolortransfer\n");
+    } else {
+      cvtFunction(funcs[3]);
+      writePS("settransfer\n");
+    }
+  } else if (funcs[0]) {
+    cvtFunction(funcs[0]);
+    writePS("settransfer\n");
+  } else {
+    writePS("{} settransfer\n");
+  }
+}
+
+void PSOutputDev::updateFont(GfxState *state) {
+  if (state->getFont()) {
+    writePSFmt("/F{0:d}_{1:d} {2:.6g} Tf\n",
+              state->getFont()->getID()->num, state->getFont()->getID()->gen,
+              fabs(state->getFontSize()) < 0.0001 ? 0.0001
+                                                   : state->getFontSize());
+  }
+}
+
+void PSOutputDev::updateTextMat(GfxState *state) {
+  double *mat;
+
+  mat = state->getTextMat();
+  if (fabs(mat[0] * mat[3] - mat[1] * mat[2]) < 0.00001) {
+    // avoid a singular (or close-to-singular) matrix
+    writePSFmt("[0.00001 0 0 0.00001 {0:.6g} {1:.6g}] Tm\n", mat[4], mat[5]);
+  } else {
+    writePSFmt("[{0:.6g} {1:.6g} {2:.6g} {3:.6g} {4:.6g} {5:.6g}] Tm\n",
+              mat[0], mat[1], mat[2], mat[3], mat[4], mat[5]);
+  }
+}
+
+void PSOutputDev::updateCharSpace(GfxState *state) {
+  writePSFmt("{0:.6g} Tc\n", state->getCharSpace());
+}
+
+void PSOutputDev::updateRender(GfxState *state) {
+  int rm;
+
+  rm = state->getRender();
+  writePSFmt("{0:d} Tr\n", rm);
+  rm &= 3;
+  if (rm != 0 && rm != 3) {
+    t3Cacheable = gFalse;
+  }
+}
+
+void PSOutputDev::updateRise(GfxState *state) {
+  writePSFmt("{0:.6g} Ts\n", state->getRise());
+}
+
+void PSOutputDev::updateWordSpace(GfxState *state) {
+  writePSFmt("{0:.6g} Tw\n", state->getWordSpace());
+}
+
+void PSOutputDev::updateHorizScaling(GfxState *state) {
+  double h;
+
+  h = state->getHorizScaling();
+  if (fabs(h) < 0.01) {
+    h = 0.01;
+  }
+  writePSFmt("{0:.6g} Tz\n", h);
+}
+
+void PSOutputDev::updateTextPos(GfxState *state) {
+  writePSFmt("{0:.6g} {1:.6g} Td\n", state->getLineX(), state->getLineY());
+}
+
+void PSOutputDev::updateTextShift(GfxState *state, double shift) {
+  if (state->getFont()->getWMode()) {
+    writePSFmt("{0:.6g} TJmV\n", shift);
+  } else {
+    writePSFmt("{0:.6g} TJm\n", shift);
+  }
+}
+
+void PSOutputDev::saveTextPos(GfxState *state) {
+  writePS("currentpoint\n");
+}
+
+void PSOutputDev::restoreTextPos(GfxState *state) {
+  writePS("m\n");
+}
+
+void PSOutputDev::stroke(GfxState *state) {
+  doPath(state->getPath());
+  if (inType3Char && t3FillColorOnly) {
+    // if we're construct a cacheable Type 3 glyph, we need to do
+    // everything in the fill color
+    writePS("Sf\n");
+  } else {
+    writePS("S\n");
+  }
+}
+
+void PSOutputDev::fill(GfxState *state) {
+  doPath(state->getPath());
+  writePS("f\n");
+}
+
+void PSOutputDev::eoFill(GfxState *state) {
+  doPath(state->getPath());
+  writePS("f*\n");
+}
+
+GBool PSOutputDev::tilingPatternFillL1(GfxState *state, Catalog *cat, Object *str,
+                                      double *pmat, int paintType, int tilingType, Dict *resDict,
+                                      double *mat, double *bbox,
+                                      int x0, int y0, int x1, int y1,
+                                      double xStep, double yStep) {
+  PDFRectangle box;
+  Gfx *gfx;
+
+  // define a Type 3 font
+  writePS("8 dict begin\n");
+  writePS("/FontType 3 def\n");
+  writePS("/FontMatrix [1 0 0 1 0 0] def\n");
+  writePSFmt("/FontBBox [{0:.6g} {1:.6g} {2:.6g} {3:.6g}] def\n",
+            bbox[0], bbox[1], bbox[2], bbox[3]);
+  writePS("/Encoding 256 array def\n");
+  writePS("  0 1 255 { Encoding exch /.notdef put } for\n");
+  writePS("  Encoding 120 /x put\n");
+  writePS("/BuildGlyph {\n");
+  writePS("  exch /CharProcs get exch\n");
+  writePS("  2 copy known not { pop /.notdef } if\n");
+  writePS("  get exec\n");
+  writePS("} bind def\n");
+  writePS("/BuildChar {\n");
+  writePS("  1 index /Encoding get exch get\n");
+  writePS("  1 index /BuildGlyph get exec\n");
+  writePS("} bind def\n");
+  writePS("/CharProcs 1 dict def\n");
+  writePS("CharProcs begin\n");
+  box.x1 = bbox[0];
+  box.y1 = bbox[1];
+  box.x2 = bbox[2];
+  box.y2 = bbox[3];
+  gfx = new Gfx(doc, this, resDict, &box, NULL);
+  writePS("/x {\n");
+  if (paintType == 2) {
+    writePSFmt("{0:.6g} 0 {1:.6g} {2:.6g} {3:.6g} {4:.6g} setcachedevice\n",
+              xStep, bbox[0], bbox[1], bbox[2], bbox[3]);
+    t3FillColorOnly = gTrue;
+  } else
+  {
+    if (x1 - 1 <= x0) {
+      writePS("1 0 setcharwidth\n");
+    } else {
+      writePSFmt("{0:.6g} 0 setcharwidth\n", xStep);
+    }
+    t3FillColorOnly = gFalse;
+  }
+  inType3Char = gTrue;
+  if (paintType == 2) {
+    inUncoloredPattern = gTrue;
+    // ensure any PS procedures that contain sCol or fCol do not change the color
+    writePS("/pdfLastFill true def\n");
+    writePS("/pdfLastStroke true def\n");
+  }
+  ++numTilingPatterns;
+  gfx->display(str);
+  --numTilingPatterns;
+  if (paintType == 2) {
+    inUncoloredPattern = gFalse;
+    // ensure the next PS procedures that uses sCol or fCol will update the color
+    writePS("/pdfLastFill false def\n");
+    writePS("/pdfLastStroke false def\n");
+  }
+  inType3Char = gFalse;
+  writePS("} def\n");
+  delete gfx;
+  writePS("end\n");
+  writePS("currentdict end\n");
+  writePSFmt("/xpdfTile{0:d} exch definefont pop\n", numTilingPatterns);
+
+  // draw the tiles
+  writePSFmt("/xpdfTile{0:d} findfont setfont\n", numTilingPatterns);
+  writePS("fCol\n");
+  writePSFmt("gsave [{0:.6g} {1:.6g} {2:.6g} {3:.6g} {4:.6g} {5:.6g}] concat\n",
+            mat[0], mat[1], mat[2], mat[3], mat[4], mat[5]);
+  writePSFmt("{0:d} 1 {1:d} {{ {2:.6g} exch {3:.6g} mul m {4:d} 1 {5:d} {{ pop (x) show }} for }} for\n",
+            y0, y1 - 1, x0 * xStep, yStep, x0, x1 - 1);
+  writePS("grestore\n");
+
+  return gTrue;
+}
+
+GBool PSOutputDev::tilingPatternFillL2(GfxState *state, Catalog *cat, Object *str,
+                                      double *pmat, int paintType, int tilingType, Dict *resDict,
+                                      double *mat, double *bbox,
+                                      int x0, int y0, int x1, int y1,
+                                      double xStep, double yStep) {
+  PDFRectangle box;
+  Gfx *gfx;
+
+  if (paintType == 2) {
+    // setpattern with PaintType 2 needs the paint color
+    writePS("currentcolor\n");
+  }
+  writePS("<<\n  /PatternType 1\n");
+  writePSFmt("  /PaintType {0:d}\n", paintType);
+  writePSFmt("  /TilingType {0:d}\n", tilingType);
+  writePSFmt("  /BBox [{0:.6g} {1:.6g} {2:.6g} {3:.6g}]\n", bbox[0], bbox[1], bbox[2], bbox[3]);
+  writePSFmt("  /XStep {0:.6g}\n", xStep);
+  writePSFmt("  /YStep {0:.6g}\n", yStep);
+  writePS("  /PaintProc { \n");
+  box.x1 = bbox[0];
+  box.y1 = bbox[1];
+  box.x2 = bbox[2];
+  box.y2 = bbox[3];
+  gfx = new Gfx(doc, this, resDict, &box, NULL);
+  inType3Char = gTrue;
+  if (paintType == 2) {
+    inUncoloredPattern = gTrue;
+    // ensure any PS procedures that contain sCol or fCol do not change the color
+    writePS("/pdfLastFill true def\n");
+    writePS("/pdfLastStroke true def\n");
+  }
+  gfx->display(str);
+  if (paintType == 2) {
+    inUncoloredPattern = gFalse;
+    // ensure the next PS procedures that uses sCol or fCol will update the color
+    writePS("/pdfLastFill false def\n");
+    writePS("/pdfLastStroke false def\n");
+  }
+  inType3Char = gFalse;
+  delete gfx;
+  writePS("  }\n");
+  writePS(">>\n");
+  writePSFmt("[{0:.6g} {1:.6g} {2:.6g} {3:.6g} {4:.6g} {5:.6g}]\n", mat[0], mat[1], mat[2], mat[3], mat[4], mat[5]);
+  writePS("makepattern setpattern\n");
+  writePS("clippath fill\n"); // Gfx sets up a clip before calling out->tilingPatternFill()
+
+  return gTrue;
+}
+
+GBool PSOutputDev::tilingPatternFill(GfxState *state, Gfx *gfx, Catalog *cat, Object *str,
+                                    double *pmat, int paintType, int tilingType, Dict *resDict,
+                                    double *mat, double *bbox,
+                                    int x0, int y0, int x1, int y1,
+                                    double xStep, double yStep) {
+  if (x1 - x0 == 1 && y1 - y0 == 1) {
+    // Don't need to use patterns if only one instance of the pattern is used
+    PDFRectangle box;
+    Gfx *gfx;
+    double x, y, tx, ty;
+
+    x = x0 * xStep;
+    y = y0 * yStep;
+    tx = x * mat[0] + y * mat[2] + mat[4];
+    ty = x * mat[1] + y * mat[3] + mat[5];
+    box.x1 = bbox[0];
+    box.y1 = bbox[1];
+    box.x2 = bbox[2];
+    box.y2 = bbox[3];
+    gfx = new Gfx(doc, this, resDict, &box, NULL);
+    writePSFmt("[{0:.6g} {1:.6g} {2:.6g} {3:.6g} {4:.6g} {5:.6g}] cm\n", mat[0], mat[1], mat[2], mat[3], tx, ty);
+    inType3Char = gTrue;
+    gfx->display(str);
+    inType3Char = gFalse;
+    delete gfx;
+    return gTrue;
+  }
+
+  if (level == psLevel1 || level == psLevel1Sep) {
+    return tilingPatternFillL1(state, cat, str, pmat, paintType, tilingType, resDict,
+                              mat, bbox, x0, y0, x1, y1, xStep, yStep);
+  } else {
+    return tilingPatternFillL2(state, cat, str, pmat, paintType, tilingType, resDict,
+                              mat, bbox, x0, y0, x1, y1, xStep, yStep);
+  }
+}
+
+GBool PSOutputDev::functionShadedFill(GfxState *state,
+                                    GfxFunctionShading *shading) {
+  double x0, y0, x1, y1;
+  double *mat;
+  int i;
+
+  if (level == psLevel2Sep || level == psLevel3Sep) {
+    if (shading->getColorSpace()->getMode() != csDeviceCMYK) {
+      return gFalse;
+    }
+    processColors |= psProcessCMYK;
+  }
+
+  shading->getDomain(&x0, &y0, &x1, &y1);
+  mat = shading->getMatrix();
+  writePSFmt("/mat [{0:.6g} {1:.6g} {2:.6g} {3:.6g} {4:.6g} {5:.6g}] def\n",
+            mat[0], mat[1], mat[2], mat[3], mat[4], mat[5]);
+  writePSFmt("/n {0:d} def\n", shading->getColorSpace()->getNComps());
+  if (shading->getNFuncs() == 1) {
+    writePS("/func ");
+    cvtFunction(shading->getFunc(0));
+    writePS("def\n");
+  } else {
+    writePS("/func {\n");
+    for (i = 0; i < shading->getNFuncs(); ++i) {
+      if (i < shading->getNFuncs() - 1) {
+       writePS("2 copy\n");
+      }
+      cvtFunction(shading->getFunc(i));
+      writePS("exec\n");
+      if (i < shading->getNFuncs() - 1) {
+       writePS("3 1 roll\n");
+      }
+    }
+    writePS("} def\n");
+  }
+  writePSFmt("{0:.6g} {1:.6g} {2:.6g} {3:.6g} 0 funcSH\n", x0, y0, x1, y1);
+
+  return gTrue;
+}
+
+GBool PSOutputDev::axialShadedFill(GfxState *state, GfxAxialShading *shading, double /*tMin*/, double /*tMax*/) {
+  double xMin, yMin, xMax, yMax;
+  double x0, y0, x1, y1, dx, dy, mul;
+  double tMin, tMax, t, t0, t1;
+  int i;
+
+  if (level == psLevel2Sep || level == psLevel3Sep) {
+    if (shading->getColorSpace()->getMode() != csDeviceCMYK) {
+      return gFalse;
+    }
+    processColors |= psProcessCMYK;
+  }
+
+  // get the clip region bbox
+  state->getUserClipBBox(&xMin, &yMin, &xMax, &yMax);
+
+  // compute min and max t values, based on the four corners of the
+  // clip region bbox
+  shading->getCoords(&x0, &y0, &x1, &y1);
+  dx = x1 - x0;
+  dy = y1 - y0;
+  if (fabs(dx) < 0.01 && fabs(dy) < 0.01) {
+    return gTrue;
+  } else {
+    mul = 1 / (dx * dx + dy * dy);
+    tMin = tMax = ((xMin - x0) * dx + (yMin - y0) * dy) * mul;
+    t = ((xMin - x0) * dx + (yMax - y0) * dy) * mul;
+    if (t < tMin) {
+      tMin = t;
+    } else if (t > tMax) {
+      tMax = t;
+    }
+    t = ((xMax - x0) * dx + (yMin - y0) * dy) * mul;
+    if (t < tMin) {
+      tMin = t;
+    } else if (t > tMax) {
+      tMax = t;
+    }
+    t = ((xMax - x0) * dx + (yMax - y0) * dy) * mul;
+    if (t < tMin) {
+      tMin = t;
+    } else if (t > tMax) {
+      tMax = t;
+    }
+    if (tMin < 0 && !shading->getExtend0()) {
+      tMin = 0;
+    }
+    if (tMax > 1 && !shading->getExtend1()) {
+      tMax = 1;
+    }
+  }
+
+  // get the function domain
+  t0 = shading->getDomain0();
+  t1 = shading->getDomain1();
+
+  // generate the PS code
+  writePSFmt("/t0 {0:.6g} def\n", t0);
+  writePSFmt("/t1 {0:.6g} def\n", t1);
+  writePSFmt("/dt {0:.6g} def\n", t1 - t0);
+  writePSFmt("/x0 {0:.6g} def\n", x0);
+  writePSFmt("/y0 {0:.6g} def\n", y0);
+  writePSFmt("/dx {0:.6g} def\n", x1 - x0);
+  writePSFmt("/x1 {0:.6g} def\n", x1);
+  writePSFmt("/y1 {0:.6g} def\n", y1);
+  writePSFmt("/dy {0:.6g} def\n", y1 - y0);
+  writePSFmt("/xMin {0:.6g} def\n", xMin);
+  writePSFmt("/yMin {0:.6g} def\n", yMin);
+  writePSFmt("/xMax {0:.6g} def\n", xMax);
+  writePSFmt("/yMax {0:.6g} def\n", yMax);
+  writePSFmt("/n {0:d} def\n", shading->getColorSpace()->getNComps());
+  if (shading->getNFuncs() == 1) {
+    writePS("/func ");
+    cvtFunction(shading->getFunc(0));
+    writePS("def\n");
+  } else {
+    writePS("/func {\n");
+    for (i = 0; i < shading->getNFuncs(); ++i) {
+      if (i < shading->getNFuncs() - 1) {
+       writePS("dup\n");
+      }
+      cvtFunction(shading->getFunc(i));
+      writePS("exec\n");
+      if (i < shading->getNFuncs() - 1) {
+       writePS("exch\n");
+      }
+    }
+    writePS("} def\n");
+  }
+  writePSFmt("{0:.6g} {1:.6g} 0 axialSH\n", tMin, tMax);
+
+  return gTrue;
+}
+
+GBool PSOutputDev::radialShadedFill(GfxState *state, GfxRadialShading *shading, double /*sMin*/, double /*sMax*/) {
+  double xMin, yMin, xMax, yMax;
+  double x0, y0, r0, x1, y1, r1, t0, t1;
+  double xa, ya, ra;
+  double sMin, sMax, h, ta;
+  double sLeft, sRight, sTop, sBottom, sZero, sDiag;
+  GBool haveSLeft, haveSRight, haveSTop, haveSBottom, haveSZero;
+  GBool haveSMin, haveSMax;
+  double theta, alpha, a1, a2;
+  GBool enclosed;
+  int i;
+
+  if (level == psLevel2Sep || level == psLevel3Sep) {
+    if (shading->getColorSpace()->getMode() != csDeviceCMYK) {
+      return gFalse;
+    }
+    processColors |= psProcessCMYK;
+  }
+
+  // get the shading info
+  shading->getCoords(&x0, &y0, &r0, &x1, &y1, &r1);
+  t0 = shading->getDomain0();
+  t1 = shading->getDomain1();
+
+  // Compute the point at which r(s) = 0; check for the enclosed
+  // circles case; and compute the angles for the tangent lines.
+  // Compute the point at which r(s) = 0; check for the enclosed
+  // circles case; and compute the angles for the tangent lines.
+  h = sqrt((x1 - x0) * (x1 - x0) + (y1 - y0) * (y1 - y0));
+  if (h == 0) {
+    enclosed = gTrue;
+    theta = 0; // make gcc happy
+  } else if (r1 - r0 == 0) {
+    enclosed = gFalse;
+    theta = 0;
+  } else if (fabs(r1 - r0) >= h) {
+    enclosed = gTrue;
+    theta = 0; // make gcc happy
+  } else {
+    enclosed = gFalse;
+    theta = asin((r1 - r0) / h);
+  }
+  if (enclosed) {
+    a1 = 0;
+    a2 = 360;
+  } else {
+    alpha = atan2(y1 - y0, x1 - x0);
+    a1 = (180 / M_PI) * (alpha + theta) + 90;
+    a2 = (180 / M_PI) * (alpha - theta) - 90;
+    while (a2 < a1) {
+      a2 += 360;
+    }
+  }
+
+  // compute the (possibly extended) s range
+  state->getUserClipBBox(&xMin, &yMin, &xMax, &yMax);
+  if (enclosed) {
+    sMin = 0;
+    sMax = 1;
+  } else {
+    // solve x(sLeft) + r(sLeft) = xMin
+    if ((haveSLeft = fabs((x1 + r1) - (x0 + r0)) > 0.000001)) {
+      sLeft = (xMin - (x0 + r0)) / ((x1 + r1) - (x0 + r0));
+    } else {
+      sLeft = 0; // make gcc happy
+    }
+    // solve x(sRight) - r(sRight) = xMax
+    if ((haveSRight = fabs((x1 - r1) - (x0 - r0)) > 0.000001)) {
+      sRight = (xMax - (x0 - r0)) / ((x1 - r1) - (x0 - r0));
+    } else {
+      sRight = 0; // make gcc happy
+    }
+    // solve y(sBottom) + r(sBottom) = yMin
+    if ((haveSBottom = fabs((y1 + r1) - (y0 + r0)) > 0.000001)) {
+      sBottom = (yMin - (y0 + r0)) / ((y1 + r1) - (y0 + r0));
+    } else {
+      sBottom = 0; // make gcc happy
+    }
+    // solve y(sTop) - r(sTop) = yMax
+    if ((haveSTop = fabs((y1 - r1) - (y0 - r0)) > 0.000001)) {
+      sTop = (yMax - (y0 - r0)) / ((y1 - r1) - (y0 - r0));
+    } else {
+      sTop = 0; // make gcc happy
+    }
+    // solve r(sZero) = 0
+    if ((haveSZero = fabs(r1 - r0) > 0.000001)) {
+      sZero = -r0 / (r1 - r0);
+    } else {
+      sZero = 0; // make gcc happy
+    }
+    // solve r(sDiag) = sqrt((xMax-xMin)^2 + (yMax-yMin)^2)
+    if (haveSZero) {
+      sDiag = (sqrt((xMax - xMin) * (xMax - xMin) +
+                   (yMax - yMin) * (yMax - yMin)) - r0) / (r1 - r0);
+    } else {
+      sDiag = 0; // make gcc happy
+    }
+    // compute sMin
+    if (shading->getExtend0()) {
+      sMin = 0;
+      haveSMin = gFalse;
+      if (x0 < x1 && haveSLeft && sLeft < 0) {
+       sMin = sLeft;
+       haveSMin = gTrue;
+      } else if (x0 > x1 && haveSRight && sRight < 0) {
+       sMin = sRight;
+       haveSMin = gTrue;
+      }
+      if (y0 < y1 && haveSBottom && sBottom < 0) {
+       if (!haveSMin || sBottom > sMin) {
+         sMin = sBottom;
+         haveSMin = gTrue;
+       }
+      } else if (y0 > y1 && haveSTop && sTop < 0) {
+       if (!haveSMin || sTop > sMin) {
+         sMin = sTop;
+         haveSMin = gTrue;
+       }
+      }
+      if (haveSZero && sZero < 0) {
+       if (!haveSMin || sZero > sMin) {
+         sMin = sZero;
+       }
+      }
+    } else {
+      sMin = 0;
+    }
+    // compute sMax
+    if (shading->getExtend1()) {
+      sMax = 1;
+      haveSMax = gFalse;
+      if (x1 < x0 && haveSLeft && sLeft > 1) {
+       sMax = sLeft;
+       haveSMax = gTrue;
+      } else if (x1 > x0 && haveSRight && sRight > 1) {
+       sMax = sRight;
+       haveSMax = gTrue;
+      }
+      if (y1 < y0 && haveSBottom && sBottom > 1) {
+       if (!haveSMax || sBottom < sMax) {
+         sMax = sBottom;
+         haveSMax = gTrue;
+       }
+      } else if (y1 > y0 && haveSTop && sTop > 1) {
+       if (!haveSMax || sTop < sMax) {
+         sMax = sTop;
+         haveSMax = gTrue;
+       }
+      }
+      if (haveSZero && sDiag > 1) {
+       if (!haveSMax || sDiag < sMax) {
+         sMax = sDiag;
+       }
+      }
+    } else {
+      sMax = 1;
+    }
+  }
+
+  // generate the PS code
+  writePSFmt("/x0 {0:.6g} def\n", x0);
+  writePSFmt("/x1 {0:.6g} def\n", x1);
+  writePSFmt("/dx {0:.6g} def\n", x1 - x0);
+  writePSFmt("/y0 {0:.6g} def\n", y0);
+  writePSFmt("/y1 {0:.6g} def\n", y1);
+  writePSFmt("/dy {0:.6g} def\n", y1 - y0);
+  writePSFmt("/r0 {0:.6g} def\n", r0);
+  writePSFmt("/r1 {0:.6g} def\n", r1);
+  writePSFmt("/dr {0:.6g} def\n", r1 - r0);
+  writePSFmt("/t0 {0:.6g} def\n", t0);
+  writePSFmt("/t1 {0:.6g} def\n", t1);
+  writePSFmt("/dt {0:.6g} def\n", t1 - t0);
+  writePSFmt("/n {0:d} def\n", shading->getColorSpace()->getNComps());
+  writePSFmt("/encl {0:s} def\n", enclosed ? "true" : "false");
+  writePSFmt("/a1 {0:.6g} def\n", a1);
+  writePSFmt("/a2 {0:.6g} def\n", a2);
+  if (shading->getNFuncs() == 1) {
+    writePS("/func ");
+    cvtFunction(shading->getFunc(0));
+    writePS("def\n");
+  } else {
+    writePS("/func {\n");
+    for (i = 0; i < shading->getNFuncs(); ++i) {
+      if (i < shading->getNFuncs() - 1) {
+       writePS("dup\n");
+      }
+      cvtFunction(shading->getFunc(i));
+      writePS("exec\n");
+      if (i < shading->getNFuncs() - 1) {
+       writePS("exch\n");
+      }
+    }
+    writePS("} def\n");
+  }
+  writePSFmt("{0:.6g} {1:.6g} 0 radialSH\n", sMin, sMax);
+
+  // extend the 'enclosed' case
+  if (enclosed) {
+    // extend the smaller circle
+    if ((shading->getExtend0() && r0 <= r1) ||
+       (shading->getExtend1() && r1 < r0)) {
+      if (r0 <= r1) {
+       ta = t0;
+       ra = r0;
+       xa = x0;
+       ya = y0;
+      } else {
+       ta = t1;
+       ra = r1;
+       xa = x1;
+       ya = y1;
+      }
+      if (level == psLevel2Sep || level == psLevel3Sep) {
+       writePSFmt("{0:.6g} radialCol aload pop k\n", ta);
+      } else {
+       writePSFmt("{0:.6g} radialCol sc\n", ta);
+      }
+      writePSFmt("{0:.6g} {1:.6g} {2:.6g} 0 360 arc h f*\n", xa, ya, ra);
+    }
+
+    // extend the larger circle
+    if ((shading->getExtend0() && r0 > r1) ||
+       (shading->getExtend1() && r1 >= r0)) {
+      if (r0 > r1) {
+       ta = t0;
+       ra = r0;
+       xa = x0;
+       ya = y0;
+      } else {
+       ta = t1;
+       ra = r1;
+       xa = x1;
+       ya = y1;
+      }
+      if (level == psLevel2Sep || level == psLevel3Sep) {
+       writePSFmt("{0:.6g} radialCol aload pop k\n", ta);
+      } else {
+       writePSFmt("{0:.6g} radialCol sc\n", ta);
+      }
+      writePSFmt("{0:.6g} {1:.6g} {2:.6g} 0 360 arc h\n", xa, ya, ra);
+      writePSFmt("{0:.6g} {1:.6g} m {2:.6g} {3:.6g} l {4:.6g} {5:.6g} l {6:.6g} {7:.6g} l h f*\n",
+                xMin, yMin, xMin, yMax, xMax, yMax, xMax, yMin);
+    }
+  }
+
+  return gTrue;
+}
+
+void PSOutputDev::clip(GfxState *state) {
+  doPath(state->getPath());
+  writePS("W\n");
+}
+
+void PSOutputDev::eoClip(GfxState *state) {
+  doPath(state->getPath());
+  writePS("W*\n");
+}
+
+void PSOutputDev::clipToStrokePath(GfxState *state) {
+  doPath(state->getPath());
+  writePS("Ws\n");
+}
+
+void PSOutputDev::doPath(GfxPath *path) {
+  GfxSubpath *subpath;
+  double x0, y0, x1, y1, x2, y2, x3, y3, x4, y4;
+  int n, m, i, j;
+
+  n = path->getNumSubpaths();
+
+  if (n == 1 && path->getSubpath(0)->getNumPoints() == 5) {
+    subpath = path->getSubpath(0);
+    x0 = subpath->getX(0);
+    y0 = subpath->getY(0);
+    x4 = subpath->getX(4);
+    y4 = subpath->getY(4);
+    if (x4 == x0 && y4 == y0) {
+      x1 = subpath->getX(1);
+      y1 = subpath->getY(1);
+      x2 = subpath->getX(2);
+      y2 = subpath->getY(2);
+      x3 = subpath->getX(3);
+      y3 = subpath->getY(3);
+      if (x0 == x1 && x2 == x3 && y0 == y3 && y1 == y2) {
+       writePSFmt("{0:.6g} {1:.6g} {2:.6g} {3:.6g} re\n",
+                  x0 < x2 ? x0 : x2, y0 < y1 ? y0 : y1,
+                  fabs(x2 - x0), fabs(y1 - y0));
+       return;
+      } else if (x0 == x3 && x1 == x2 && y0 == y1 && y2 == y3) {
+       writePSFmt("{0:.6g} {1:.6g} {2:.6g} {3:.6g} re\n",
+                  x0 < x1 ? x0 : x1, y0 < y2 ? y0 : y2,
+                  fabs(x1 - x0), fabs(y2 - y0));
+       return;
+      }
+    }
+  }
+
+  for (i = 0; i < n; ++i) {
+    subpath = path->getSubpath(i);
+    m = subpath->getNumPoints();
+    writePSFmt("{0:.6g} {1:.6g} m\n", subpath->getX(0), subpath->getY(0));
+    j = 1;
+    while (j < m) {
+      if (subpath->getCurve(j)) {
+       writePSFmt("{0:.6g} {1:.6g} {2:.6g} {3:.6g} {4:.6g} {5:.6g} c\n",
+                  subpath->getX(j), subpath->getY(j),
+                  subpath->getX(j+1), subpath->getY(j+1),
+                  subpath->getX(j+2), subpath->getY(j+2));
+       j += 3;
+      } else {
+       writePSFmt("{0:.6g} {1:.6g} l\n", subpath->getX(j), subpath->getY(j));
+       ++j;
+      }
+    }
+    if (subpath->isClosed()) {
+      writePS("h\n");
+    }
+  }
+}
+
+void PSOutputDev::drawString(GfxState *state, GooString *s) {
+  GfxFont *font;
+  int wMode;
+  int *codeToGID;
+  GooString *s2;
+  double dx, dy, originX, originY;
+  char *p;
+  UnicodeMap *uMap;
+  CharCode code;
+  Unicode *u;
+  char buf[8];
+  double *dxdy;
+  int dxdySize, len, nChars, uLen, n, m, i, j;
+
+  // for pdftohtml, output PS without text
+  if( displayText == gFalse )
+    return;
+
+  // check for invisible text -- this is used by Acrobat Capture
+  if (state->getRender() == 3) {
+    return;
+  }
+
+  // ignore empty strings
+  if (s->getLength() == 0) {
+    return;
+  }
+
+  // get the font
+  if (!(font = state->getFont())) {
+    return;
+  }
+  wMode = font->getWMode();
+
+  // check for a subtitute 16-bit font
+  uMap = NULL;
+  codeToGID = NULL;
+  if (font->isCIDFont()) {
+    for (i = 0; i < font16EncLen; ++i) {
+      if (font->getID()->num == font16Enc[i].fontID.num &&
+         font->getID()->gen == font16Enc[i].fontID.gen) {
+       if (!font16Enc[i].enc) {
+         // font substitution failed, so don't output any text
+         return;
+       }
+       uMap = globalParams->getUnicodeMap(font16Enc[i].enc);
+       break;
+      }
+    }
+
+  // check for a code-to-GID map
+  } else {
+    for (i = 0; i < font8InfoLen; ++i) {
+      if (font->getID()->num == font8Info[i].fontID.num &&
+         font->getID()->gen == font8Info[i].fontID.gen) {
+       codeToGID = font8Info[i].codeToGID;
+       break;
+      }
+    }
+  }
+
+  // compute the positioning (dx, dy) for each char in the string
+  nChars = 0;
+  p = s->getCString();
+  len = s->getLength();
+  s2 = new GooString();
+  dxdySize = font->isCIDFont() ? 8 : s->getLength();
+  dxdy = (double *)gmallocn(2 * dxdySize, sizeof(double));
+  while (len > 0) {
+    n = font->getNextChar(p, len, &code,
+                         &u, &uLen,
+                         &dx, &dy, &originX, &originY);
+    dx *= state->getFontSize();
+    dy *= state->getFontSize();
+    if (wMode) {
+      dy += state->getCharSpace();
+      if (n == 1 && *p == ' ') {
+       dy += state->getWordSpace();
+      }
+    } else {
+      dx += state->getCharSpace();
+      if (n == 1 && *p == ' ') {
+       dx += state->getWordSpace();
+      }
+    }
+    dx *= state->getHorizScaling();
+    if (font->isCIDFont()) {
+      if (uMap) {
+       if (nChars + uLen > dxdySize) {
+         do {
+           dxdySize *= 2;
+         } while (nChars + uLen > dxdySize);
+         dxdy = (double *)greallocn(dxdy, 2 * dxdySize, sizeof(double));
+       }
+       for (i = 0; i < uLen; ++i) {
+         m = uMap->mapUnicode(u[i], buf, (int)sizeof(buf));
+         for (j = 0; j < m; ++j) {
+           s2->append(buf[j]);
+         }
+         //~ this really needs to get the number of chars in the target
+         //~ encoding - which may be more than the number of Unicode
+         //~ chars
+         dxdy[2 * nChars] = dx;
+         dxdy[2 * nChars + 1] = dy;
+         ++nChars;
+       }
+      } else {
+       if (nChars + 1 > dxdySize) {
+         dxdySize *= 2;
+         dxdy = (double *)greallocn(dxdy, 2 * dxdySize, sizeof(double));
+       }
+       s2->append((char)((code >> 8) & 0xff));
+       s2->append((char)(code & 0xff));
+       dxdy[2 * nChars] = dx;
+       dxdy[2 * nChars + 1] = dy;
+       ++nChars;
+      }
+    } else {
+      if (!codeToGID || codeToGID[code] >= 0) {
+       s2->append((char)code);
+       dxdy[2 * nChars] = dx;
+       dxdy[2 * nChars + 1] = dy;
+       ++nChars;
+      }
+    }
+    p += n;
+    len -= n;
+  }
+  if (uMap) {
+    uMap->decRefCnt();
+  }
+
+  if (nChars > 0) {
+    writePSString(s2);
+    writePS("\n[");
+    for (i = 0; i < 2 * nChars; ++i) {
+      if (i > 0) {
+       writePS("\n");
+      }
+      writePSFmt("{0:.6g}", dxdy[i]);
+    }
+    writePS("] Tj\n");
+  }
+  gfree(dxdy);
+  delete s2;
+
+  if (state->getRender() & 4) {
+    haveTextClip = gTrue;
+  }
+}
+
+void PSOutputDev::beginTextObject(GfxState *state) {
+}
+
+void PSOutputDev::endTextObject(GfxState *state) {
+  if (haveTextClip) {
+    writePS("Tclip\n");
+    haveTextClip = gFalse;
+  }
+}
+
+void PSOutputDev::drawImageMask(GfxState *state, Object *ref, Stream *str,
+                               int width, int height, GBool invert,
+                               GBool interpolate, GBool inlineImg) {
+  int len;
+
+  len = height * ((width + 7) / 8);
+  switch (level) {
+    case psLevel1:
+    case psLevel1Sep:
+      doImageL1(ref, NULL, invert, inlineImg, str, width, height, len,
+                NULL, NULL, 0, 0, gFalse);
+    break;
+    case psLevel2:
+    case psLevel2Sep:
+      doImageL2(ref, NULL, invert, inlineImg, str, width, height, len,
+                NULL, NULL, 0, 0, gFalse);
+    break;
+    case psLevel3:
+    case psLevel3Sep:
+      doImageL3(ref, NULL, invert, inlineImg, str, width, height, len,
+                NULL, NULL, 0, 0, gFalse);
+    break;
+  }
+}
+
+void PSOutputDev::setSoftMaskFromImageMask(GfxState *state, Object *ref, Stream *str,
+                               int width, int height, GBool invert,
+                               GBool inlineImg, double *baseMatrix) {
+  if (level != psLevel1 && level != psLevel1Sep) {
+    maskToClippingPath(str, width, height, invert);
+  }
+}
+
+void PSOutputDev::unsetSoftMaskFromImageMask(GfxState * state, double *baseMatrix) {
+  if (level != psLevel1 && level != psLevel1Sep) {
+    writePS("pdfImClipEnd\n");
+  }
+}
+
+void PSOutputDev::drawImage(GfxState *state, Object *ref, Stream *str,
+                           int width, int height, GfxImageColorMap *colorMap,
+                           GBool interpolate, int *maskColors, GBool inlineImg) {
+  int len;
+
+  len = height * ((width * colorMap->getNumPixelComps() *
+                  colorMap->getBits() + 7) / 8);
+  switch (level) {
+  case psLevel1:
+    doImageL1(ref, colorMap, gFalse, inlineImg, str,
+            width, height, len, maskColors, NULL, 0, 0, gFalse);
+    break;
+  case psLevel1Sep:
+    //~ handle indexed, separation, ... color spaces
+    doImageL1Sep(ref, colorMap, gFalse, inlineImg, str,
+            width, height, len, maskColors, NULL, 0, 0, gFalse);
+    break;
+  case psLevel2:
+  case psLevel2Sep:
+    doImageL2(ref, colorMap, gFalse, inlineImg, str,
+             width, height, len, maskColors, NULL, 0, 0, gFalse);
+    break;
+  case psLevel3:
+  case psLevel3Sep:
+    doImageL3(ref, colorMap, gFalse, inlineImg, str,
+             width, height, len, maskColors, NULL, 0, 0, gFalse);
+    break;
+  }
+  t3Cacheable = gFalse;
+}
+
+void PSOutputDev::drawMaskedImage(GfxState *state, Object *ref, Stream *str,
+                                 int width, int height,
+                                 GfxImageColorMap *colorMap,
+                                 GBool interpolate,
+                                 Stream *maskStr,
+                                 int maskWidth, int maskHeight,
+                                 GBool maskInvert, GBool maskInterpolate) {
+  int len;
+
+  len = height * ((width * colorMap->getNumPixelComps() *
+                  colorMap->getBits() + 7) / 8);
+  switch (level) {
+  case psLevel1:
+    doImageL1(ref, colorMap, gFalse, gFalse, str, width, height, len,
+             NULL, maskStr, maskWidth, maskHeight, maskInvert);    
+    break;
+  case psLevel1Sep:
+    //~ handle indexed, separation, ... color spaces
+    doImageL1Sep(ref, colorMap, gFalse, gFalse, str, width, height, len,
+             NULL, maskStr, maskWidth, maskHeight, maskInvert);    
+    break;
+  case psLevel2:
+  case psLevel2Sep:
+    doImageL2(ref, colorMap, gFalse, gFalse, str, width, height, len,
+             NULL, maskStr, maskWidth, maskHeight, maskInvert);
+    break;
+  case psLevel3:
+  case psLevel3Sep:
+    doImageL3(ref, colorMap, gFalse, gFalse, str, width, height, len,
+             NULL, maskStr, maskWidth, maskHeight, maskInvert);
+    break;
+  }
+  t3Cacheable = gFalse;
+}
+
+void PSOutputDev::doImageL1(Object *ref, GfxImageColorMap *colorMap,
+                           GBool invert, GBool inlineImg,
+                           Stream *str, int width, int height, int len,
+                           int *maskColors, Stream *maskStr,
+                           int maskWidth, int maskHeight, GBool maskInvert) {
+  ImageStream *imgStr;
+  Guchar pixBuf[gfxColorMaxComps];
+  GfxGray gray;
+  int col, x, y, c, i;
+  char hexBuf[32*2 + 2];       // 32 values X 2 chars/value + line ending + null
+  Guchar digit, grayValue;
+  const GBool useBinary = globalParams->getPSBinary();
+
+  // explicit masking
+  if (maskStr && !(maskColors && colorMap)) {
+    maskToClippingPath(maskStr, maskWidth, maskHeight, maskInvert);
+  }
+
+  if ((inType3Char || preload) && !colorMap) {
+    if (inlineImg) {
+      // create an array
+      str = new FixedLengthEncoder(str, len);
+      str = new ASCIIHexEncoder(str);
+      str->reset();
+      col = 0;
+      writePS("[<");
+      do {
+       do {
+         c = str->getChar();
+       } while (c == '\n' || c == '\r');
+       if (c == '>' || c == EOF) {
+         break;
+       }
+       writePSChar(c);
+       ++col;
+       // each line is: "<...data...><eol>"
+       // so max data length = 255 - 4 = 251
+       // but make it 240 just to be safe
+       // chunks are 2 bytes each, so we need to stop on an even col number
+       if (col == 240) {
+         writePS(">\n<");
+         col = 0;
+       }
+      } while (c != '>' && c != EOF);
+      writePS(">]\n");
+      writePS("0\n");
+      str->close();
+      delete str;
+    } else {
+      // make sure the image is setup, it sometimes is not like on bug #17645
+      setupImage(ref->getRef(), str, gFalse);
+      // set up to use the array already created by setupImages()
+      writePSFmt("ImData_{0:d}_{1:d} 0 0\n", ref->getRefNum(), ref->getRefGen());
+    }
+  }
+
+  // image/imagemask command
+  if ((inType3Char || preload) && !colorMap) {
+    writePSFmt("{0:d} {1:d} {2:s} [{3:d} 0 0 {4:d} 0 {5:d}] pdfImM1a\n",
+              width, height, invert ? "true" : "false",
+              width, -height, height);
+  } else if (colorMap) {
+    writePSFmt("{0:d} {1:d} 8 [{2:d} 0 0 {3:d} 0 {4:d}] pdfIm1{5:s}\n",
+              width, height,
+              width, -height, height,
+              useBinary ? "Bin" : "");
+  } else {
+    writePSFmt("{0:d} {1:d} {2:s} [{3:d} 0 0 {4:d} 0 {5:d}] pdfImM1{6:s}\n",
+              width, height, invert ? "true" : "false",
+              width, -height, height,
+              useBinary ? "Bin" : "");
+  }
+
+  // image data
+  if (!((inType3Char || preload) && !colorMap)) {
+
+    if (colorMap) {
+
+      // set up to process the data stream
+      imgStr = new ImageStream(str, width, colorMap->getNumPixelComps(),
+                              colorMap->getBits());
+      imgStr->reset();
+
+      // process the data stream
+      i = 0;
+      for (y = 0; y < height; ++y) {
+
+       // write the line
+       for (x = 0; x < width; ++x) {
+         imgStr->getPixel(pixBuf);
+         colorMap->getGray(pixBuf, &gray);
+         grayValue = colToByte(gray);
+         if (useBinary) {
+           hexBuf[i++] = grayValue;
+         } else {
+           digit = grayValue / 16;
+           hexBuf[i++] = digit + ((digit >= 10)? 'a' - 10: '0');
+           digit = grayValue % 16;
+           hexBuf[i++] = digit + ((digit >= 10)? 'a' - 10: '0');
+         }
+         if (i >= 64) {
+           if (!useBinary) {
+             hexBuf[i++] = '\n';
+           }
+           writePSBuf(hexBuf, i);
+           i = 0;
+         }
+       }
+      }
+      if (i != 0) {
+       if (!useBinary) {
+         hexBuf[i++] = '\n';
+       }
+       writePSBuf(hexBuf, i);
+      }
+      str->close();
+      delete imgStr;
+
+    // imagemask
+    } else {
+      str->reset();
+      i = 0;
+      for (y = 0; y < height; ++y) {
+       for (x = 0; x < width; x += 8) {
+         grayValue = str->getChar();
+         if (useBinary) {
+           hexBuf[i++] = grayValue;
+         } else {
+           digit = grayValue / 16;
+           hexBuf[i++] = digit + ((digit >= 10)? 'a' - 10: '0');
+           digit = grayValue % 16;
+           hexBuf[i++] = digit + ((digit >= 10)? 'a' - 10: '0');
+         }
+         if (i >= 64) {
+           if (!useBinary) {
+             hexBuf[i++] = '\n';
+           }
+           writePSBuf(hexBuf, i);
+           i = 0;
+         }
+       }
+      }
+      if (i != 0) {
+       if (!useBinary) {
+         hexBuf[i++] = '\n';
+       }
+       writePSBuf(hexBuf, i);
+      }
+      str->close();
+    }
+  }
+
+  if (maskStr && !(maskColors && colorMap)) {
+    writePS("pdfImClipEnd\n");
+  }
+}
+
+void PSOutputDev::doImageL1Sep(Object *ref, GfxImageColorMap *colorMap,
+                              GBool invert, GBool inlineImg,
+                              Stream *str, int width, int height, int len,
+                              int *maskColors, Stream *maskStr,
+                              int maskWidth, int maskHeight, GBool maskInvert) {
+  ImageStream *imgStr;
+  Guchar *lineBuf;
+  Guchar pixBuf[gfxColorMaxComps];
+  GfxCMYK cmyk;
+  int x, y, i, comp;
+  GBool checkProcessColor;
+  char hexBuf[32*2 + 2];       // 32 values X 2 chars/value + line ending + null
+  Guchar digit;
+  const GBool useBinary = globalParams->getPSBinary();
+
+  // explicit masking
+  if (maskStr && !(maskColors && colorMap)) {
+    maskToClippingPath(maskStr, maskWidth, maskHeight, maskInvert);
+  }
+
+  // width, height, matrix, bits per component
+  writePSFmt("{0:d} {1:d} 8 [{2:d} 0 0 {3:d} 0 {4:d}] pdfIm1Sep{5:s}\n",
+            width, height,
+            width, -height, height,
+            useBinary ? "Bin" : "");
+
+  // allocate a line buffer
+  lineBuf = (Guchar *)gmallocn(width, 4);
+
+  // set up to process the data stream
+  imgStr = new ImageStream(str, width, colorMap->getNumPixelComps(),
+                          colorMap->getBits());
+  imgStr->reset();
+
+  // process the data stream
+  checkProcessColor = gTrue;
+  i = 0;
+  for (y = 0; y < height; ++y) {
+
+    // read the line
+    if (checkProcessColor) {
+      checkProcessColor = (((psProcessCyan | psProcessMagenta | psProcessYellow | psProcessBlack) & ~processColors) != 0);
+    }
+    if (checkProcessColor) {
+      for (x = 0; x < width; ++x) {
+        imgStr->getPixel(pixBuf);
+        colorMap->getCMYK(pixBuf, &cmyk);
+        lineBuf[4*x+0] = colToByte(cmyk.c);
+        lineBuf[4*x+1] = colToByte(cmyk.m);
+        lineBuf[4*x+2] = colToByte(cmyk.y);
+        lineBuf[4*x+3] = colToByte(cmyk.k);
+        addProcessColor(colToDbl(cmyk.c), colToDbl(cmyk.m),
+                       colToDbl(cmyk.y), colToDbl(cmyk.k));
+      }
+    } else {
+      for (x = 0; x < width; ++x) {
+        imgStr->getPixel(pixBuf);
+        colorMap->getCMYK(pixBuf, &cmyk);
+        lineBuf[4*x+0] = colToByte(cmyk.c);
+        lineBuf[4*x+1] = colToByte(cmyk.m);
+        lineBuf[4*x+2] = colToByte(cmyk.y);
+        lineBuf[4*x+3] = colToByte(cmyk.k);
+      }
+    }
+
+    // write one line of each color component
+    if (useBinary) {
+      for (comp = 0; comp < 4; ++comp) {
+        for (x = 0; x < width; ++x) {
+         hexBuf[i++] = lineBuf[4*x + comp];
+         if (i >= 64) {
+           writePSBuf(hexBuf, i);
+           i = 0;
+         }
+       }
+      }
+    } else {
+      for (comp = 0; comp < 4; ++comp) {
+        for (x = 0; x < width; ++x) {
+         digit = lineBuf[4*x + comp] / 16;
+         hexBuf[i++] = digit + ((digit >= 10)? 'a'-10: '0');
+         digit = lineBuf[4*x + comp] % 16;
+         hexBuf[i++] = digit + ((digit >= 10)? 'a'-10: '0');
+         if (i >= 64) {
+           hexBuf[i++] = '\n';
+           writePSBuf(hexBuf, i);
+           i = 0;
+         }
+       }
+      }
+    }
+  }
+
+  if (i != 0) {
+    if (!useBinary) {
+      hexBuf[i++] = '\n';
+    }
+    writePSBuf(hexBuf, i);
+  }
+
+  str->close();
+  delete imgStr;
+  gfree(lineBuf);
+
+  if (maskStr && !(maskColors && colorMap)) {
+    writePS("pdfImClipEnd\n");
+  }
+}
+
+void PSOutputDev::maskToClippingPath(Stream *maskStr, int maskWidth, int maskHeight, GBool maskInvert) {
+  ImageStream *imgStr;
+  Guchar *line;
+  PSOutImgClipRect *rects0, *rects1, *rectsTmp, *rectsOut;
+  int rects0Len, rects1Len, rectsSize, rectsOutLen, rectsOutSize;
+  GBool emitRect, addRect, extendRect;
+  int i, x0, x1, y, maskXor;
+
+  imgStr = new ImageStream(maskStr, maskWidth, 1, 1);
+  imgStr->reset();
+  rects0Len = rects1Len = rectsOutLen = 0;
+  rectsSize = rectsOutSize = 64;
+  rects0 = (PSOutImgClipRect *)gmallocn(rectsSize, sizeof(PSOutImgClipRect));
+  rects1 = (PSOutImgClipRect *)gmallocn(rectsSize, sizeof(PSOutImgClipRect));
+  rectsOut = (PSOutImgClipRect *)gmallocn(rectsOutSize, sizeof(PSOutImgClipRect));
+  maskXor = maskInvert ? 1 : 0;
+  for (y = 0; y < maskHeight; ++y) {
+    if (!(line = imgStr->getLine())) {
+      break;
+    }
+    i = 0;
+    rects1Len = 0;
+    for (x0 = 0; x0 < maskWidth && (line[x0] ^ maskXor); ++x0) ;
+    for (x1 = x0; x1 < maskWidth && !(line[x1] ^ maskXor); ++x1) ;
+    while (x0 < maskWidth || i < rects0Len) {
+      emitRect = addRect = extendRect = gFalse;
+      if (x0 >= maskWidth) {
+        emitRect = gTrue;
+      } else if (i >= rects0Len) {
+        addRect = gTrue;
+      } else if (rects0[i].x0 < x0) {
+        emitRect = gTrue;
+      } else if (x0 < rects0[i].x0) {
+        addRect = gTrue;
+      } else if (rects0[i].x1 == x1) {
+        extendRect = gTrue;
+      } else {
+        emitRect = addRect = gTrue;
+      }
+      if (emitRect) {
+        if (rectsOutLen == rectsOutSize) {
+          rectsOutSize *= 2;
+          rectsOut = (PSOutImgClipRect *)greallocn(rectsOut, rectsOutSize, sizeof(PSOutImgClipRect));
+        }
+        rectsOut[rectsOutLen].x0 = rects0[i].x0;
+        rectsOut[rectsOutLen].x1 = rects0[i].x1;
+        rectsOut[rectsOutLen].y0 = maskHeight - y - 1;
+        rectsOut[rectsOutLen].y1 = maskHeight - rects0[i].y0 - 1;
+        ++rectsOutLen;
+        ++i;
+      }
+      if (addRect || extendRect) {
+        if (rects1Len == rectsSize) {
+          rectsSize *= 2;
+          rects0 = (PSOutImgClipRect *)greallocn(rects0, rectsSize, sizeof(PSOutImgClipRect));
+          rects1 = (PSOutImgClipRect *)greallocn(rects1, rectsSize, sizeof(PSOutImgClipRect));
+        }
+        rects1[rects1Len].x0 = x0;
+        rects1[rects1Len].x1 = x1;
+        if (addRect) {
+          rects1[rects1Len].y0 = y;
+        }
+        if (extendRect) {
+          rects1[rects1Len].y0 = rects0[i].y0;
+          ++i;
+        }
+        ++rects1Len;
+        for (x0 = x1; x0 < maskWidth && (line[x0] ^ maskXor); ++x0) ;
+        for (x1 = x0; x1 < maskWidth && !(line[x1] ^ maskXor); ++x1) ;
+      }
+    }
+    rectsTmp = rects0;
+    rects0 = rects1;
+    rects1 = rectsTmp;
+    i = rects0Len;
+    rects0Len = rects1Len;
+    rects1Len = i;
+  }
+  for (i = 0; i < rects0Len; ++i) {
+    if (rectsOutLen == rectsOutSize) {
+      rectsOutSize *= 2;
+      rectsOut = (PSOutImgClipRect *)greallocn(rectsOut, rectsOutSize, sizeof(PSOutImgClipRect));
+    }
+    rectsOut[rectsOutLen].x0 = rects0[i].x0;
+    rectsOut[rectsOutLen].x1 = rects0[i].x1;
+    rectsOut[rectsOutLen].y0 = maskHeight - y - 1;
+    rectsOut[rectsOutLen].y1 = maskHeight - rects0[i].y0 - 1;
+    ++rectsOutLen;
+  }
+  if (rectsOutLen < 65536/4) {
+    writePSFmt("{0:d} array 0\n", rectsOutLen * 4);
+    for (i = 0; i < rectsOutLen; ++i) {
+      writePSFmt("[{0:d} {1:d} {2:d} {3:d}] pr\n",
+                rectsOut[i].x0, rectsOut[i].y0,
+                rectsOut[i].x1 - rectsOut[i].x0,
+                rectsOut[i].y1 - rectsOut[i].y0);
+    }
+    writePSFmt("pop {0:d} {1:d} pdfImClip\n", maskWidth, maskHeight);
+  } else {
+    //  would be over the limit of array size.
+    //  make each rectangle path and clip.
+    writePS("gsave newpath\n");
+    for (i = 0; i < rectsOutLen; ++i) {
+      writePSFmt("{0:.6g} {1:.6g} {2:.6g} {3:.6g} re\n",
+                ((double)rectsOut[i].x0)/maskWidth,
+                ((double)rectsOut[i].y0)/maskHeight,
+                ((double)(rectsOut[i].x1 - rectsOut[i].x0))/maskWidth,
+                ((double)(rectsOut[i].y1 - rectsOut[i].y0))/maskHeight);
+    }
+    writePS("clip\n");
+  }
+  gfree(rectsOut);
+  gfree(rects0);
+  gfree(rects1);
+  delete imgStr;
+  maskStr->close();
+}
+
+void PSOutputDev::doImageL2(Object *ref, GfxImageColorMap *colorMap,
+                           GBool invert, GBool inlineImg,
+                           Stream *str, int width, int height, int len,
+                           int *maskColors, Stream *maskStr,
+                           int maskWidth, int maskHeight, GBool maskInvert) {
+  Stream *str2;
+  ImageStream *imgStr;
+  Guchar *line;
+  PSOutImgClipRect *rects0, *rects1, *rectsTmp, *rectsOut;
+  int rects0Len, rects1Len, rectsSize, rectsOutLen, rectsOutSize;
+  GBool emitRect, addRect, extendRect;
+  GooString *s;
+  int n, numComps;
+  GBool useRLE, useASCII, useASCIIHex, useCompressed;
+  GfxSeparationColorSpace *sepCS;
+  GfxColor color;
+  GfxCMYK cmyk;
+  int c;
+  int col, i, j, x0, x1, y;
+  char dataBuf[4096];
+  
+  rectsOutLen = 0;
+
+  // color key masking
+  if (maskColors && colorMap && !inlineImg) {
+    // can't read the stream twice for inline images -- but masking
+    // isn't allowed with inline images anyway
+    numComps = colorMap->getNumPixelComps();
+    imgStr = new ImageStream(str, width, numComps, colorMap->getBits());
+    imgStr->reset();
+    rects0Len = rects1Len = 0;
+    rectsSize = rectsOutSize = 64;
+    rects0 = (PSOutImgClipRect *)gmallocn(rectsSize, sizeof(PSOutImgClipRect));
+    rects1 = (PSOutImgClipRect *)gmallocn(rectsSize, sizeof(PSOutImgClipRect));
+    rectsOut = (PSOutImgClipRect *)gmallocn(rectsOutSize,
+                                           sizeof(PSOutImgClipRect));
+    for (y = 0; y < height; ++y) {
+      if (!(line = imgStr->getLine())) {
+       break;
+      }
+      i = 0;
+      rects1Len = 0;
+      for (x0 = 0; x0 < width; ++x0) {
+       for (j = 0; j < numComps; ++j) {
+         if (line[x0*numComps+j] < maskColors[2*j] ||
+             line[x0*numComps+j] > maskColors[2*j+1]) {
+           break;
+         }
+       }
+       if (j < numComps) {
+         break;
+       }
+      }
+      for (x1 = x0; x1 < width; ++x1) {
+       for (j = 0; j < numComps; ++j) {
+         if (line[x1*numComps+j] < maskColors[2*j] ||
+             line[x1*numComps+j] > maskColors[2*j+1]) {
+           break;
+         }
+       }
+       if (j == numComps) {
+         break;
+       }
+      }
+      while (x0 < width || i < rects0Len) {
+       emitRect = addRect = extendRect = gFalse;
+       if (x0 >= width) {
+         emitRect = gTrue;
+       } else if (i >= rects0Len) {
+         addRect = gTrue;
+       } else if (rects0[i].x0 < x0) {
+         emitRect = gTrue;
+       } else if (x0 < rects0[i].x0) {
+         addRect = gTrue;
+       } else if (rects0[i].x1 == x1) {
+         extendRect = gTrue;
+       } else {
+         emitRect = addRect = gTrue;
+       }
+       if (emitRect) {
+         if (rectsOutLen == rectsOutSize) {
+           rectsOutSize *= 2;
+           rectsOut = (PSOutImgClipRect *)greallocn(rectsOut, rectsOutSize,
+                                                    sizeof(PSOutImgClipRect));
+         }
+         rectsOut[rectsOutLen].x0 = rects0[i].x0;
+         rectsOut[rectsOutLen].x1 = rects0[i].x1;
+         rectsOut[rectsOutLen].y0 = height - y - 1;
+         rectsOut[rectsOutLen].y1 = height - rects0[i].y0 - 1;
+         ++rectsOutLen;
+         ++i;
+       }
+       if (addRect || extendRect) {
+         if (rects1Len == rectsSize) {
+           rectsSize *= 2;
+           rects0 = (PSOutImgClipRect *)greallocn(rects0, rectsSize,
+                                                  sizeof(PSOutImgClipRect));
+           rects1 = (PSOutImgClipRect *)greallocn(rects1, rectsSize,
+                                                  sizeof(PSOutImgClipRect));
+         }
+         rects1[rects1Len].x0 = x0;
+         rects1[rects1Len].x1 = x1;
+         if (addRect) {
+           rects1[rects1Len].y0 = y;
+         }
+         if (extendRect) {
+           rects1[rects1Len].y0 = rects0[i].y0;
+           ++i;
+         }
+         ++rects1Len;
+         for (x0 = x1; x0 < width; ++x0) {
+           for (j = 0; j < numComps; ++j) {
+             if (line[x0*numComps+j] < maskColors[2*j] ||
+                 line[x0*numComps+j] > maskColors[2*j+1]) {
+               break;
+             }
+           }
+           if (j < numComps) {
+             break;
+           }
+         }
+         for (x1 = x0; x1 < width; ++x1) {
+           for (j = 0; j < numComps; ++j) {
+             if (line[x1*numComps+j] < maskColors[2*j] ||
+                 line[x1*numComps+j] > maskColors[2*j+1]) {
+               break;
+             }
+           }
+           if (j == numComps) {
+             break;
+           }
+         }
+       }
+      }
+      rectsTmp = rects0;
+      rects0 = rects1;
+      rects1 = rectsTmp;
+      i = rects0Len;
+      rects0Len = rects1Len;
+      rects1Len = i;
+    }
+    for (i = 0; i < rects0Len; ++i) {
+      if (rectsOutLen == rectsOutSize) {
+       rectsOutSize *= 2;
+       rectsOut = (PSOutImgClipRect *)greallocn(rectsOut, rectsOutSize,
+                                                sizeof(PSOutImgClipRect));
+      }
+      rectsOut[rectsOutLen].x0 = rects0[i].x0;
+      rectsOut[rectsOutLen].x1 = rects0[i].x1;
+      rectsOut[rectsOutLen].y0 = height - y - 1;
+      rectsOut[rectsOutLen].y1 = height - rects0[i].y0 - 1;
+      ++rectsOutLen;
+    }
+    if (rectsOutLen < 65536/4) {
+      writePSFmt("{0:d} array 0\n", rectsOutLen * 4);
+      for (i = 0; i < rectsOutLen; ++i) {
+       writePSFmt("[{0:d} {1:d} {2:d} {3:d}] pr\n",
+                  rectsOut[i].x0, rectsOut[i].y0,
+                  rectsOut[i].x1 - rectsOut[i].x0,
+                  rectsOut[i].y1 - rectsOut[i].y0);
+      }
+      writePSFmt("pop {0:d} {1:d} pdfImClip\n", width, height);
+    } else {
+      //  would be over the limit of array size.
+      //  make each rectangle path and clip.
+      writePS("gsave newpath\n");
+      for (i = 0; i < rectsOutLen; ++i) {
+       writePSFmt("{0:.6g} {1:.6g} {2:.6g} {3:.6g} re\n",
+                  ((double)rectsOut[i].x0)/width,
+                  ((double)rectsOut[i].y0)/height,
+                  ((double)(rectsOut[i].x1 - rectsOut[i].x0))/width,
+                  ((double)(rectsOut[i].y1 - rectsOut[i].y0))/height);
+      }
+      writePS("clip\n");
+    }
+    gfree(rectsOut);
+    gfree(rects0);
+    gfree(rects1);
+    delete imgStr;
+    str->close();
+
+  // explicit masking
+  } else if (maskStr) {
+    maskToClippingPath(maskStr, maskWidth, maskHeight, maskInvert);
+  }
+
+  // color space
+  if (colorMap) {
+    dumpColorSpaceL2(colorMap->getColorSpace(), gFalse, gTrue, gFalse);
+    writePS(" setcolorspace\n");
+  }
+
+  useASCIIHex = globalParams->getPSASCIIHex();
+
+  // set up the image data
+  if (mode == psModeForm || inType3Char || preload) {
+    if (inlineImg) {
+      // create an array
+      str2 = new FixedLengthEncoder(str, len);
+      str2 = new RunLengthEncoder(str2);
+      if (useASCIIHex) {
+       str2 = new ASCIIHexEncoder(str2);
+      } else {
+       str2 = new ASCII85Encoder(str2);
+      }
+      str2->reset();
+      col = 0;
+      writePS((char *)(useASCIIHex ? "[<" : "[<~"));
+      do {
+       do {
+         c = str2->getChar();
+       } while (c == '\n' || c == '\r');
+       if (c == (useASCIIHex ? '>' : '~') || c == EOF) {
+         break;
+       }
+       if (c == 'z') {
+         writePSChar(c);
+         ++col;
+       } else {
+         writePSChar(c);
+         ++col;
+         for (i = 1; i <= (useASCIIHex ? 1 : 4); ++i) {
+           do {
+             c = str2->getChar();
+           } while (c == '\n' || c == '\r');
+           if (c == (useASCIIHex ? '>' : '~') || c == EOF) {
+             break;
+           }
+           writePSChar(c);
+           ++col;
+         }
+       }
+       // each line is: "<~...data...~><eol>"
+       // so max data length = 255 - 6 = 249
+       // chunks are 1 or 5 bytes each, so we have to stop at 245
+       // but make it 240 just to be safe
+       if (col > 240) {
+         writePS((char *)(useASCIIHex ? ">\n<" : "~>\n<~"));
+         col = 0;
+       }
+      } while (c != (useASCIIHex ? '>' : '~') && c != EOF);
+      writePS((char *)(useASCIIHex ? ">\n" : "~>\n"));
+      // add an extra entry because the RunLengthDecode filter may
+      // read past the end
+      writePS("<>]\n");
+      writePS("0\n");
+      str2->close();
+      delete str2;
+    } else {
+      // make sure the image is setup, it sometimes is not like on bug #17645
+      setupImage(ref->getRef(), str, gFalse);
+      // set up to use the array already created by setupImages()
+      writePSFmt("ImData_{0:d}_{1:d} 0 0\n",ref->getRefNum(), ref->getRefGen());
+    }
+  }
+
+  // image dictionary
+  writePS("<<\n  /ImageType 1\n");
+
+  // width, height, matrix, bits per component
+  writePSFmt("  /Width {0:d}\n", width);
+  writePSFmt("  /Height {0:d}\n", height);
+  writePSFmt("  /ImageMatrix [{0:d} 0 0 {1:d} 0 {2:d}]\n",
+            width, -height, height);
+  if (colorMap && colorMap->getColorSpace()->getMode() == csDeviceN) {
+    writePS("  /BitsPerComponent 8\n");
+  } else {
+    writePSFmt("  /BitsPerComponent {0:d}\n",
+              colorMap ? colorMap->getBits() : 1);
+  }
+
+  // decode 
+  if (colorMap) {
+    writePS("  /Decode [");
+    if ((level == psLevel2Sep || level == psLevel3Sep) &&
+       colorMap->getColorSpace()->getMode() == csSeparation) {
+      // this matches up with the code in the pdfImSep operator
+      n = (1 << colorMap->getBits()) - 1;
+      writePSFmt("{0:.4g} {1:.4g}", colorMap->getDecodeLow(0) * n,
+                colorMap->getDecodeHigh(0) * n);
+    } else if (colorMap->getColorSpace()->getMode() == csDeviceN) {
+      numComps = ((GfxDeviceNColorSpace *)colorMap->getColorSpace())->
+                  getAlt()->getNComps();
+      for (i = 0; i < numComps; ++i) {
+       if (i > 0) {
+         writePS(" ");
+       }
+       writePS("0 1");
+      }
+    } else {
+      numComps = colorMap->getNumPixelComps();
+      for (i = 0; i < numComps; ++i) {
+       if (i > 0) {
+         writePS(" ");
+       }
+       writePSFmt("{0:.4g} {1:.4g}",
+                  colorMap->getDecodeLow(i), colorMap->getDecodeHigh(i));
+      }
+    }
+    writePS("]\n");
+  } else {
+    writePSFmt("  /Decode [{0:d} {1:d}]\n", invert ? 1 : 0, invert ? 0 : 1);
+  }
+
+  // data source
+  if (mode == psModeForm || inType3Char || preload) {
+    if (inlineImg) {
+      writePS("  /DataSource { pdfImStr }\n");
+    } else {
+      writePS("  /DataSource { dup 65535 ge { pop 1 add 0 } if 2 index 2"
+       " index get 1 index get exch 1 add exch }\n");
+    }
+  } else {
+    writePS("  /DataSource currentfile\n");
+  }
+
+  // filters
+  if ((mode == psModeForm || inType3Char || preload) &&
+      globalParams->getPSUncompressPreloadedImages()) {
+    s = NULL;
+    useRLE = gFalse;
+    useCompressed = gFalse;
+    useASCII = gFalse;
+  } else {
+    s = str->getPSFilter(level < psLevel2 ? 1 : level < psLevel3 ? 2 : 3,
+                        "    ");
+    if ((colorMap && colorMap->getColorSpace()->getMode() == csDeviceN) ||
+       inlineImg || !s) {
+      useRLE = gTrue;
+      useASCII = !(mode == psModeForm || inType3Char || preload);
+      useCompressed = gFalse;
+    } else {
+      useRLE = gFalse;
+      useASCII = str->isBinary() &&
+                !(mode == psModeForm || inType3Char || preload);
+      useCompressed = gTrue;
+    }
+  }
+  if (useASCII) {
+    writePSFmt("    /ASCII{0:s}Decode filter\n",
+              useASCIIHex ? "Hex" : "85");
+  }
+  if (useRLE) {
+    writePS("    /RunLengthDecode filter\n");
+  }
+  if (useCompressed) {
+    writePS(s->getCString());
+  }
+  if (s) {
+    delete s;
+  }
+
+  if (mode == psModeForm || inType3Char || preload) {
+
+    // end of image dictionary
+    writePSFmt(">>\n{0:s}\n", colorMap ? "image" : "imagemask");
+
+    // get rid of the array and index
+    if (!inlineImg) writePS("pop ");
+    writePS("pop pop\n");
+
+  } else {
+
+    // cut off inline image streams at appropriate length
+    if (inlineImg) {
+      str = new FixedLengthEncoder(str, len);
+    } else if (useCompressed) {
+      str = str->getUndecodedStream();
+    }
+
+    // recode DeviceN data
+    if (colorMap && colorMap->getColorSpace()->getMode() == csDeviceN) {
+      str = new DeviceNRecoder(str, width, height, colorMap);
+    }
+
+    // add RunLengthEncode and ASCIIHex/85 encode filters
+    if (useRLE) {
+      str = new RunLengthEncoder(str);
+    }
+    if (useASCII) {
+      if (useASCIIHex) {
+       str = new ASCIIHexEncoder(str);
+      } else {
+       str = new ASCII85Encoder(str);
+      }
+    }
+
+    // end of image dictionary
+    writePS(">>\n");
+#if OPI_SUPPORT
+    if (opi13Nest) {
+      if (inlineImg) {
+       // this can't happen -- OPI dictionaries are in XObjects
+       error(errSyntaxError, -1, "OPI in inline image");
+       n = 0;
+      } else {
+       // need to read the stream to count characters -- the length
+       // is data-dependent (because of ASCII and RLE filters)
+       str->reset();
+       n = 0;
+       while ((c = str->getChar()) != EOF) {
+         ++n;
+       }
+       str->close();
+      }
+      // +6/7 for "pdfIm\n" / "pdfImM\n"
+      // +8 for newline + trailer
+      n += colorMap ? 14 : 15;
+      writePSFmt("%%BeginData: {0:d} Hex Bytes\n", n);
+    }
+#endif
+    if ((level == psLevel2Sep || level == psLevel3Sep) && colorMap &&
+       colorMap->getColorSpace()->getMode() == csSeparation && colorMap->getBits() == 8) {
+      color.c[0] = gfxColorComp1;
+      sepCS = (GfxSeparationColorSpace *)colorMap->getColorSpace();
+      sepCS->getCMYK(&color, &cmyk);
+      writePSFmt("{0:.4g} {1:.4g} {2:.4g} {3:.4g} ({4:t}) pdfImSep\n",
+                colToDbl(cmyk.c), colToDbl(cmyk.m),
+                colToDbl(cmyk.y), colToDbl(cmyk.k),
+                sepCS->getName());
+    } else {
+      writePSFmt("{0:s}\n", colorMap ? "pdfIm" : "pdfImM");
+    }
+
+    // copy the stream data
+    str->reset();
+    i = 0;
+    while ((c = str->getChar()) != EOF) {
+      dataBuf[i++] = c;
+      if (i >= (int)sizeof(dataBuf)) {
+       writePSBuf(dataBuf, i);
+       i = 0;
+      }
+    }
+    if (i > 0) {
+      writePSBuf(dataBuf, i);
+    }
+    str->close();
+
+    // add newline and trailer to the end
+    writePSChar('\n');
+    writePS("%-EOD-\n");
+#if OPI_SUPPORT
+    if (opi13Nest) {
+      writePS("%%EndData\n");
+    }
+#endif
+
+    // delete encoders
+    if (useRLE || useASCII || inlineImg) {
+      delete str;
+    }
+  }
+
+  if ((maskColors && colorMap && !inlineImg) || maskStr) {
+    if (rectsOutLen < 65536/4) {
+       writePS("pdfImClipEnd\n");
+    } else {
+       writePS("grestore\n");
+    }
+  }
+}
+
+//~ this doesn't currently support OPI
+void PSOutputDev::doImageL3(Object *ref, GfxImageColorMap *colorMap,
+                           GBool invert, GBool inlineImg,
+                           Stream *str, int width, int height, int len,
+                           int *maskColors, Stream *maskStr,
+                           int maskWidth, int maskHeight, GBool maskInvert) {
+  Stream *str2;
+  GooString *s;
+  int n, numComps;
+  GBool useRLE, useASCII, useASCIIHex, useCompressed;
+  GBool maskUseRLE, maskUseASCII, maskUseCompressed;
+  GooString *maskFilters;
+  GfxSeparationColorSpace *sepCS;
+  GfxColor color;
+  GfxCMYK cmyk;
+  int c;
+  int col, i;
+
+  useASCIIHex = globalParams->getPSASCIIHex();
+  useRLE = useASCII = useCompressed = gFalse; // make gcc happy
+  maskUseRLE = maskUseASCII = maskUseCompressed = gFalse; // make gcc happy
+  maskFilters = NULL; // make gcc happy
+
+  // explicit masking
+  if (maskStr) {
+
+    // mask data source
+    if ((mode == psModeForm || inType3Char || preload) &&
+      globalParams->getPSUncompressPreloadedImages()) {
+      s = NULL;
+      maskUseRLE = gFalse;
+      maskUseCompressed = gFalse;
+      maskUseASCII = gFalse;
+    } else {
+      s = maskStr->getPSFilter(3, "  ");
+      if (!s) {
+       maskUseRLE = gTrue;
+       maskUseASCII = !(mode == psModeForm || inType3Char || preload);
+       maskUseCompressed = gFalse;
+      } else {
+       maskUseRLE = gFalse;
+       maskUseASCII = maskStr->isBinary() &&
+                      !(mode == psModeForm || inType3Char || preload);
+       maskUseCompressed = gTrue;
+      }
+    }
+    maskFilters = new GooString();
+    if (maskUseASCII) {
+      maskFilters->appendf("  /ASCII{0:s}Decode filter\n",
+                          useASCIIHex ? "Hex" : "85");
+    }
+    if (maskUseRLE) {
+      maskFilters->append("  /RunLengthDecode filter\n");
+    }
+    if (maskUseCompressed) {
+      maskFilters->append(s);
+    }
+    if (s) {
+      delete s;
+    }
+    if (mode == psModeForm || inType3Char || preload) {
+      writePSFmt("MaskData_{0:d}_{1:d} pdfMaskInit\n",
+                ref->getRefNum(), ref->getRefGen());
+    } else {
+      writePS("currentfile\n");
+      writePS(maskFilters->getCString());
+      writePS("pdfMask\n");
+
+      // add RunLengthEncode and ASCIIHex/85 encode filters
+      if (maskUseCompressed) {
+       maskStr = maskStr->getUndecodedStream();
+      }
+      if (maskUseRLE) {
+       maskStr = new RunLengthEncoder(maskStr);
+      }
+      if (maskUseASCII) {
+       if (useASCIIHex) {
+         maskStr = new ASCIIHexEncoder(maskStr);
+       } else {
+         maskStr = new ASCII85Encoder(maskStr);
+       }
+      }
+
+      // copy the stream data
+      maskStr->reset();
+      while ((c = maskStr->getChar()) != EOF) {
+       writePSChar(c);
+      }
+      maskStr->close();
+      writePSChar('\n');
+      writePS("%-EOD-\n");
+      
+      // delete encoders
+      if (maskUseRLE || maskUseASCII) {
+       delete maskStr;
+      }
+    }
+  }
+
+  // color space
+  if (colorMap) {
+    dumpColorSpaceL2(colorMap->getColorSpace(), gFalse, gTrue, gFalse);
+    writePS(" setcolorspace\n");
+  }
+
+  // set up the image data
+  if (mode == psModeForm || inType3Char || preload) {
+    if (inlineImg) {
+      // create an array
+      str2 = new FixedLengthEncoder(str, len);
+      str2 = new RunLengthEncoder(str2);
+      if (useASCIIHex) {
+       str2 = new ASCIIHexEncoder(str2);
+      } else {
+       str2 = new ASCII85Encoder(str2);
+      }
+      str2->reset();
+      col = 0;
+      writePS((char *)(useASCIIHex ? "[<" : "[<~"));
+      do {
+       do {
+         c = str2->getChar();
+       } while (c == '\n' || c == '\r');
+       if (c == (useASCIIHex ? '>' : '~') || c == EOF) {
+         break;
+       }
+       if (c == 'z') {
+         writePSChar(c);
+         ++col;
+       } else {
+         writePSChar(c);
+         ++col;
+         for (i = 1; i <= (useASCIIHex ? 1 : 4); ++i) {
+           do {
+             c = str2->getChar();
+           } while (c == '\n' || c == '\r');
+           if (c == (useASCIIHex ? '>' : '~') || c == EOF) {
+             break;
+           }
+           writePSChar(c);
+           ++col;
+         }
+       }
+       // each line is: "<~...data...~><eol>"
+       // so max data length = 255 - 6 = 249
+       // chunks are 1 or 5 bytes each, so we have to stop at 245
+       // but make it 240 just to be safe
+       if (col > 240) {
+         writePS((char *)(useASCIIHex ? ">\n<" : "~>\n<~"));
+         col = 0;
+       }
+      } while (c != (useASCIIHex ? '>' : '~') && c != EOF);
+      writePS((char *)(useASCIIHex ? ">\n" : "~>\n"));
+      // add an extra entry because the RunLengthDecode filter may
+      // read past the end
+      writePS("<>]\n");
+      writePS("0\n");
+      str2->close();
+      delete str2;
+    } else {
+      // make sure the image is setup, it sometimes is not like on bug #17645
+      setupImage(ref->getRef(), str, gFalse);
+      // set up to use the array already created by setupImages()
+      writePSFmt("ImData_{0:d}_{1:d} 0 0\n", ref->getRefNum(), ref->getRefGen());
+    }
+  }
+
+  // explicit masking
+  if (maskStr) {
+    writePS("<<\n  /ImageType 3\n");
+    writePS("  /InterleaveType 3\n");
+    writePS("  /DataDict\n");
+  }
+
+  // image (data) dictionary
+  writePSFmt("<<\n  /ImageType {0:d}\n", (maskColors && colorMap) ? 4 : 1);
+
+  // color key masking
+  if (maskColors && colorMap) {
+    writePS("  /MaskColor [\n");
+    numComps = colorMap->getNumPixelComps();
+    for (i = 0; i < 2 * numComps; i += 2) {
+      writePSFmt("    {0:d} {1:d}\n", maskColors[i], maskColors[i+1]);
+    }
+    writePS("  ]\n");
+  }
+
+  // width, height, matrix, bits per component
+  writePSFmt("  /Width {0:d}\n", width);
+  writePSFmt("  /Height {0:d}\n", height);
+  writePSFmt("  /ImageMatrix [{0:d} 0 0 {1:d} 0 {2:d}]\n",
+            width, -height, height);
+  if (colorMap && colorMap->getColorSpace()->getMode() == csDeviceN) {
+    writePS("  /BitsPerComponent 8\n");
+  } else {
+    writePSFmt("  /BitsPerComponent {0:d}\n",
+              colorMap ? colorMap->getBits() : 1);
+  }
+
+  // decode 
+  if (colorMap) {
+    writePS("  /Decode [");
+    if ((level == psLevel2Sep || level == psLevel3Sep) &&
+       colorMap->getColorSpace()->getMode() == csSeparation) {
+      // this matches up with the code in the pdfImSep operator
+      n = (1 << colorMap->getBits()) - 1;
+      writePSFmt("{0:.4g} {1:.4g}", colorMap->getDecodeLow(0) * n,
+                colorMap->getDecodeHigh(0) * n);
+    } else {
+      numComps = colorMap->getNumPixelComps();
+      for (i = 0; i < numComps; ++i) {
+       if (i > 0) {
+         writePS(" ");
+       }
+       writePSFmt("{0:.4g} {1:.4g}", colorMap->getDecodeLow(i),
+                  colorMap->getDecodeHigh(i));
+      }
+    }
+    writePS("]\n");
+  } else {
+    writePSFmt("  /Decode [{0:d} {1:d}]\n", invert ? 1 : 0, invert ? 0 : 1);
+  }
+
+  // data source
+  if (mode == psModeForm || inType3Char || preload) {
+    if (inlineImg) {
+  writePS("  /DataSource { pdfImStr }\n");
+    } else {
+       writePS("  /DataSource { dup 65535 ge { pop 1 add 0 } if 2 index 2"
+         " index get 1 index get exch 1 add exch }\n");
+    }
+  } else {
+    writePS("  /DataSource currentfile\n");
+  }
+
+  // filters
+  if ((mode == psModeForm || inType3Char || preload) &&
+      globalParams->getPSUncompressPreloadedImages()) {
+    s = NULL;
+    useRLE = gFalse;
+    useCompressed = gFalse;
+    useASCII = gFalse;
+  } else {
+    s = str->getPSFilter(level < psLevel2 ? 1 : level < psLevel3 ? 2 : 3,
+                        "    ");
+    if ((colorMap && colorMap->getColorSpace()->getMode() == csDeviceN) ||
+       inlineImg || !s) {
+      useRLE = gTrue;
+      useASCII = !(mode == psModeForm || inType3Char || preload);
+      useCompressed = gFalse;
+    } else {
+      useRLE = gFalse;
+      useASCII = str->isBinary() &&
+                 !(mode == psModeForm || inType3Char || preload);
+      useCompressed = gTrue;
+    }
+  }
+  if (useASCII) {
+    writePSFmt("    /ASCII{0:s}Decode filter\n",
+              useASCIIHex ? "Hex" : "85");
+  }
+  if (useRLE) {
+    writePS("    /RunLengthDecode filter\n");
+  }
+  if (useCompressed) {
+    writePS(s->getCString());
+  }
+  if (s) {
+    delete s;
+  }
+
+  // end of image (data) dictionary
+  writePS(">>\n");
+
+  // explicit masking
+  if (maskStr) {
+    writePS("  /MaskDict\n");
+    writePS("<<\n");
+    writePS("  /ImageType 1\n");
+    writePSFmt("  /Width {0:d}\n", maskWidth);
+    writePSFmt("  /Height {0:d}\n", maskHeight);
+    writePSFmt("  /ImageMatrix [{0:d} 0 0 {1:d} 0 {2:d}]\n",
+              maskWidth, -maskHeight, maskHeight);
+    writePS("  /BitsPerComponent 1\n");
+    writePSFmt("  /Decode [{0:d} {1:d}]\n",
+              maskInvert ? 1 : 0, maskInvert ? 0 : 1);
+
+    // mask data source
+    if (mode == psModeForm || inType3Char || preload) {
+      writePS("  /DataSource {pdfMaskSrc}\n");
+      writePS(maskFilters->getCString());
+    } else {
+      writePS("  /DataSource maskStream\n");
+    }
+    delete maskFilters;
+
+    writePS(">>\n");
+    writePS(">>\n");
+  }
+
+  if (mode == psModeForm || inType3Char || preload) {
+
+    // image command
+    writePSFmt("{0:s}\n", colorMap ? "image" : "imagemask");
+
+  } else {
+
+    if ((level == psLevel2Sep || level == psLevel3Sep) && colorMap &&
+       colorMap->getColorSpace()->getMode() == csSeparation && colorMap->getBits() == 8) {
+      color.c[0] = gfxColorComp1;
+      sepCS = (GfxSeparationColorSpace *)colorMap->getColorSpace();
+      sepCS->getCMYK(&color, &cmyk);
+      writePSFmt("{0:.4g} {1:.4g} {2:.4g} {3:.4g} ({4:t}) pdfImSep\n",
+                colToDbl(cmyk.c), colToDbl(cmyk.m),
+                colToDbl(cmyk.y), colToDbl(cmyk.k),
+                sepCS->getName());
+    } else {
+      writePSFmt("{0:s}\n", colorMap ? "pdfIm" : "pdfImM");
+    }
+
+  }
+
+  // get rid of the array and index
+  if (mode == psModeForm || inType3Char || preload) {
+    if (!inlineImg) writePS("pop ");
+    writePS("pop pop\n");
+
+  // image data
+  } else {
+
+    // cut off inline image streams at appropriate length
+    if (inlineImg) {
+      str = new FixedLengthEncoder(str, len);
+    } else if (useCompressed) {
+      str = str->getUndecodedStream();
+    }
+
+    // add RunLengthEncode and ASCIIHex/85 encode filters
+    if (useRLE) {
+      str = new RunLengthEncoder(str);
+    }
+    if (useASCII) {
+      if (useASCIIHex) {
+       str = new ASCIIHexEncoder(str);
+      } else {
+       str = new ASCII85Encoder(str);
+      }
+    }
+
+    // copy the stream data
+    str->reset();
+    while ((c = str->getChar()) != EOF) {
+      writePSChar(c);
+    }
+    str->close();
+
+    // add newline and trailer to the end
+    writePSChar('\n');
+    writePS("%-EOD-\n");
+
+    // delete encoders
+    if (useRLE || useASCII || inlineImg) {
+      delete str;
+    }
+  }
+
+  // close the mask stream
+  if (maskStr) {
+    if (!(mode == psModeForm || inType3Char || preload)) {
+      writePS("pdfMaskEnd\n");
+    }
+  }
+}
+
+void PSOutputDev::dumpColorSpaceL2(GfxColorSpace *colorSpace,
+                                  GBool genXform, GBool updateColors,
+                                  GBool map01) {
+  GfxCalGrayColorSpace *calGrayCS;
+  GfxCalRGBColorSpace *calRGBCS;
+  GfxLabColorSpace *labCS;
+  GfxIndexedColorSpace *indexedCS;
+  GfxSeparationColorSpace *separationCS;
+  GfxDeviceNColorSpace *deviceNCS;
+  GfxColorSpace *baseCS;
+  Guchar *lookup, *p;
+  double x[gfxColorMaxComps], y[gfxColorMaxComps];
+  double low[gfxColorMaxComps], range[gfxColorMaxComps];
+  GfxColor color;
+  GfxCMYK cmyk;
+  Function *func;
+  int n, numComps, numAltComps;
+  int byte;
+  int i, j, k;
+
+  switch (colorSpace->getMode()) {
+
+  case csDeviceGray:
+    writePS("/DeviceGray");
+    if (genXform) {
+      writePS(" {}");
+    }
+    if (updateColors) {
+      processColors |= psProcessBlack;
+    }
+    break;
+
+  case csCalGray:
+    calGrayCS = (GfxCalGrayColorSpace *)colorSpace;
+    writePS("[/CIEBasedA <<\n");
+    writePSFmt(" /DecodeA {{{0:.4g} exp}} bind\n", calGrayCS->getGamma());
+    writePSFmt(" /MatrixA [{0:.4g} {1:.4g} {2:.4g}]\n",
+              calGrayCS->getWhiteX(), calGrayCS->getWhiteY(),
+              calGrayCS->getWhiteZ());
+    writePSFmt(" /WhitePoint [{0:.4g} {1:.4g} {2:.4g}]\n",
+              calGrayCS->getWhiteX(), calGrayCS->getWhiteY(),
+              calGrayCS->getWhiteZ());
+    writePSFmt(" /BlackPoint [{0:.4g} {1:.4g} {2:.4g}]\n",
+              calGrayCS->getBlackX(), calGrayCS->getBlackY(),
+              calGrayCS->getBlackZ());
+    writePS(">>]");
+    if (genXform) {
+      writePS(" {}");
+    }
+    if (updateColors) {
+      processColors |= psProcessBlack;
+    }
+    break;
+
+  case csDeviceRGB:
+    writePS("/DeviceRGB");
+    if (genXform) {
+      writePS(" {}");
+    }
+    if (updateColors) {
+      processColors |= psProcessCMYK;
+    }
+    break;
+
+  case csCalRGB:
+    calRGBCS = (GfxCalRGBColorSpace *)colorSpace;
+    writePS("[/CIEBasedABC <<\n");
+    writePSFmt(" /DecodeABC [{{{0:.4g} exp}} bind {{{1:.4g} exp}} bind {{{2:.4g} exp}} bind]\n",
+              calRGBCS->getGammaR(), calRGBCS->getGammaG(),
+              calRGBCS->getGammaB());
+    writePSFmt(" /MatrixABC [{0:.4g} {1:.4g} {2:.4g} {3:.4g} {4:.4g} {5:.4g} {6:.4g} {7:.4g} {8:.4g}]\n",
+              calRGBCS->getMatrix()[0], calRGBCS->getMatrix()[1],
+              calRGBCS->getMatrix()[2], calRGBCS->getMatrix()[3],
+              calRGBCS->getMatrix()[4], calRGBCS->getMatrix()[5],
+              calRGBCS->getMatrix()[6], calRGBCS->getMatrix()[7],
+              calRGBCS->getMatrix()[8]);
+    writePSFmt(" /WhitePoint [{0:.4g} {1:.4g} {2:.4g}]\n",
+              calRGBCS->getWhiteX(), calRGBCS->getWhiteY(),
+              calRGBCS->getWhiteZ());
+    writePSFmt(" /BlackPoint [{0:.4g} {1:.4g} {2:.4g}]\n",
+              calRGBCS->getBlackX(), calRGBCS->getBlackY(),
+              calRGBCS->getBlackZ());
+    writePS(">>]");
+    if (genXform) {
+      writePS(" {}");
+    }
+    if (updateColors) {
+      processColors |= psProcessCMYK;
+    }
+    break;
+
+  case csDeviceCMYK:
+    writePS("/DeviceCMYK");
+    if (genXform) {
+      writePS(" {}");
+    }
+    if (updateColors) {
+      processColors |= psProcessCMYK;
+    }
+    break;
+
+  case csLab:
+    labCS = (GfxLabColorSpace *)colorSpace;
+    writePS("[/CIEBasedABC <<\n");
+    if (map01) {
+      writePS(" /RangeABC [0 1 0 1 0 1]\n");
+      writePSFmt(" /DecodeABC [{{100 mul 16 add 116 div}} bind {{{0:.4g} mul {1:.4g} add}} bind {{{2:.4g} mul {3:.4g} add}} bind]\n",
+                (labCS->getAMax() - labCS->getAMin()) / 500.0,
+                labCS->getAMin() / 500.0,
+                (labCS->getBMax() - labCS->getBMin()) / 200.0,
+                labCS->getBMin() / 200.0);
+    } else {
+      writePSFmt(" /RangeABC [0 100 {0:.4g} {1:.4g} {2:.4g} {3:.4g}]\n",
+                labCS->getAMin(), labCS->getAMax(),
+                labCS->getBMin(), labCS->getBMax());
+      writePS(" /DecodeABC [{16 add 116 div} bind {500 div} bind {200 div} bind]\n");
+    }
+    writePS(" /MatrixABC [1 1 1 1 0 0 0 0 -1]\n");
+    writePS(" /DecodeLMN\n");
+    writePS("   [{dup 6 29 div ge {dup dup mul mul}\n");
+    writePSFmt("     {{4 29 div sub 108 841 div mul }} ifelse {0:.4g} mul}} bind\n",
+              labCS->getWhiteX());
+    writePS("    {dup 6 29 div ge {dup dup mul mul}\n");
+    writePSFmt("     {{4 29 div sub 108 841 div mul }} ifelse {0:.4g} mul}} bind\n",
+              labCS->getWhiteY());
+    writePS("    {dup 6 29 div ge {dup dup mul mul}\n");
+    writePSFmt("     {{4 29 div sub 108 841 div mul }} ifelse {0:.4g} mul}} bind]\n",
+              labCS->getWhiteZ());
+    writePSFmt(" /WhitePoint [{0:.4g} {1:.4g} {2:.4g}]\n",
+              labCS->getWhiteX(), labCS->getWhiteY(), labCS->getWhiteZ());
+    writePSFmt(" /BlackPoint [{0:.4g} {1:.4g} {2:.4g}]\n",
+              labCS->getBlackX(), labCS->getBlackY(), labCS->getBlackZ());
+    writePS(">>]");
+    if (genXform) {
+      writePS(" {}");
+    }
+    if (updateColors) {
+      processColors |= psProcessCMYK;
+    }
+    break;
+
+  case csICCBased:
+    // there is no transform function to the alternate color space, so
+    // we can use it directly
+    dumpColorSpaceL2(((GfxICCBasedColorSpace *)colorSpace)->getAlt(),
+                    genXform, updateColors, gFalse);
+    break;
+
+  case csIndexed:
+    indexedCS = (GfxIndexedColorSpace *)colorSpace;
+    baseCS = indexedCS->getBase();
+    writePS("[/Indexed ");
+    dumpColorSpaceL2(baseCS, gFalse, gFalse, gTrue);
+    n = indexedCS->getIndexHigh();
+    numComps = baseCS->getNComps();
+    lookup = indexedCS->getLookup();
+    writePSFmt(" {0:d} <\n", n);
+    if (baseCS->getMode() == csDeviceN && level != psLevel3 && level != psLevel3Sep) {
+      func = ((GfxDeviceNColorSpace *)baseCS)->getTintTransformFunc();
+      baseCS->getDefaultRanges(low, range, indexedCS->getIndexHigh());
+      if (((GfxDeviceNColorSpace *)baseCS)->getAlt()->getMode() == csLab) {
+       labCS = (GfxLabColorSpace *)((GfxDeviceNColorSpace *)baseCS)->getAlt();
+      } else {
+       labCS = NULL;
+      }
+      numAltComps = ((GfxDeviceNColorSpace *)baseCS)->getAlt()->getNComps();
+      p = lookup;
+      for (i = 0; i <= n; i += 8) {
+       writePS("  ");
+       for (j = i; j < i+8 && j <= n; ++j) {
+         for (k = 0; k < numComps; ++k) {
+           x[k] = low[k] + (*p++ / 255.0) * range[k];
+         }
+         func->transform(x, y);
+         if (labCS) {
+           y[0] /= 100.0;
+           y[1] = (y[1] - labCS->getAMin()) /
+                  (labCS->getAMax() - labCS->getAMin());
+           y[2] = (y[2] - labCS->getBMin()) /
+                  (labCS->getBMax() - labCS->getBMin());
+         }
+         for (k = 0; k < numAltComps; ++k) {
+           byte = (int)(y[k] * 255 + 0.5);
+           if (byte < 0) {
+             byte = 0;
+           } else if (byte > 255) {
+             byte = 255;
+           }
+           writePSFmt("{0:02x}", byte);
+         }
+         if (updateColors) {
+           color.c[0] = dblToCol(j);
+           indexedCS->getCMYK(&color, &cmyk);
+           addProcessColor(colToDbl(cmyk.c), colToDbl(cmyk.m),
+                           colToDbl(cmyk.y), colToDbl(cmyk.k));
+         }
+       }
+       writePS("\n");
+      }
+    } else {
+      for (i = 0; i <= n; i += 8) {
+       writePS("  ");
+       for (j = i; j < i+8 && j <= n; ++j) {
+         for (k = 0; k < numComps; ++k) {
+           writePSFmt("{0:02x}", lookup[j * numComps + k]);
+         }
+         if (updateColors) {
+           color.c[0] = dblToCol(j);
+           indexedCS->getCMYK(&color, &cmyk);
+           addProcessColor(colToDbl(cmyk.c), colToDbl(cmyk.m),
+                           colToDbl(cmyk.y), colToDbl(cmyk.k));
+         }
+       }
+       writePS("\n");
+      }
+    }
+    writePS(">]");
+    if (genXform) {
+      writePS(" {}");
+    }
+    break;
+
+  case csSeparation:
+    separationCS = (GfxSeparationColorSpace *)colorSpace;
+    writePS("[/Separation ");
+    writePSString(separationCS->getName());
+    writePS(" ");
+    dumpColorSpaceL2(separationCS->getAlt(), gFalse, gFalse, gFalse);
+    writePS("\n");
+    cvtFunction(separationCS->getFunc());
+    writePS("]");
+    if (genXform) {
+      writePS(" {}");
+    }
+    if (updateColors) {
+      addCustomColor(separationCS);
+    }
+    break;
+
+  case csDeviceN:
+    deviceNCS = (GfxDeviceNColorSpace *)colorSpace;
+    if (level == psLevel3 || level == psLevel3Sep) {      
+      writePS("[/DeviceN\n");
+      writePS("  [ ");
+      for (i = 0; i < deviceNCS->getNComps(); i++) {
+        writePSString(deviceNCS->getColorantName(i));
+        writePS(" ");
+      }
+      writePS("]\n");
+      dumpColorSpaceL2(deviceNCS->getAlt(), gFalse, updateColors, gFalse);
+      writePS("\n");
+      cvtFunction(deviceNCS->getTintTransformFunc(), map01 && deviceNCS->getAlt()->getMode() == csLab);
+      writePS("]\n");
+      if (genXform) {
+        writePS(" {}");
+      }
+    } else {
+      // DeviceN color spaces are a Level 3 PostScript feature.
+      dumpColorSpaceL2(deviceNCS->getAlt(), gFalse, updateColors, map01);
+      if (genXform) {
+        writePS(" ");
+        cvtFunction(deviceNCS->getTintTransformFunc());
+      }
+    }
+    break;
+
+  case csPattern:
+    //~ unimplemented
+    break;
+  }
+}
+
+#if OPI_SUPPORT
+void PSOutputDev::opiBegin(GfxState *state, Dict *opiDict) {
+  Object dict;
+
+  if (globalParams->getPSOPI()) {
+    opiDict->lookup("2.0", &dict);
+    if (dict.isDict()) {
+      opiBegin20(state, dict.getDict());
+      dict.free();
+    } else {
+      dict.free();
+      opiDict->lookup("1.3", &dict);
+      if (dict.isDict()) {
+       opiBegin13(state, dict.getDict());
+      }
+      dict.free();
+    }
+  }
+}
+
+void PSOutputDev::opiBegin20(GfxState *state, Dict *dict) {
+  Object obj1, obj2, obj3, obj4;
+  double width, height, left, right, top, bottom;
+  int w, h;
+  int i;
+
+  writePS("%%BeginOPI: 2.0\n");
+  writePS("%%Distilled\n");
+
+  dict->lookup("F", &obj1);
+  if (getFileSpecName(&obj1, &obj2)) {
+    writePSFmt("%%ImageFileName: {0:t}\n", obj2.getString());
+    obj2.free();
+  }
+  obj1.free();
+
+  dict->lookup("MainImage", &obj1);
+  if (obj1.isString()) {
+    writePSFmt("%%MainImage: {0:t}\n", obj1.getString());
+  }
+  obj1.free();
+
+  //~ ignoring 'Tags' entry
+  //~ need to use writePSString() and deal with >255-char lines
+
+  dict->lookup("Size", &obj1);
+  if (obj1.isArray() && obj1.arrayGetLength() == 2) {
+    obj1.arrayGet(0, &obj2);
+    width = obj2.getNum();
+    obj2.free();
+    obj1.arrayGet(1, &obj2);
+    height = obj2.getNum();
+    obj2.free();
+    writePSFmt("%%ImageDimensions: {0:.6g} {1:.6g}\n", width, height);
+  }
+  obj1.free();
+
+  dict->lookup("CropRect", &obj1);
+  if (obj1.isArray() && obj1.arrayGetLength() == 4) {
+    obj1.arrayGet(0, &obj2);
+    left = obj2.getNum();
+    obj2.free();
+    obj1.arrayGet(1, &obj2);
+    top = obj2.getNum();
+    obj2.free();
+    obj1.arrayGet(2, &obj2);
+    right = obj2.getNum();
+    obj2.free();
+    obj1.arrayGet(3, &obj2);
+    bottom = obj2.getNum();
+    obj2.free();
+    writePSFmt("%%ImageCropRect: {0:.6g} {1:.6g} {2:.6g} {3:.6g}\n",
+              left, top, right, bottom);
+  }
+  obj1.free();
+
+  dict->lookup("Overprint", &obj1);
+  if (obj1.isBool()) {
+    writePSFmt("%%ImageOverprint: {0:s}\n", obj1.getBool() ? "true" : "false");
+  }
+  obj1.free();
+
+  dict->lookup("Inks", &obj1);
+  if (obj1.isName()) {
+    writePSFmt("%%ImageInks: {0:s}\n", obj1.getName());
+  } else if (obj1.isArray() && obj1.arrayGetLength() >= 1) {
+    obj1.arrayGet(0, &obj2);
+    if (obj2.isName()) {
+      writePSFmt("%%ImageInks: {0:s} {1:d}",
+                obj2.getName(), (obj1.arrayGetLength() - 1) / 2);
+      for (i = 1; i+1 < obj1.arrayGetLength(); i += 2) {
+       obj1.arrayGet(i, &obj3);
+       obj1.arrayGet(i+1, &obj4);
+       if (obj3.isString() && obj4.isNum()) {
+         writePS(" ");
+         writePSString(obj3.getString());
+         writePSFmt(" {0:.6g}", obj4.getNum());
+       }
+       obj3.free();
+       obj4.free();
+      }
+      writePS("\n");
+    }
+    obj2.free();
+  }
+  obj1.free();
+
+  writePS("gsave\n");
+
+  writePS("%%BeginIncludedImage\n");
+
+  dict->lookup("IncludedImageDimensions", &obj1);
+  if (obj1.isArray() && obj1.arrayGetLength() == 2) {
+    obj1.arrayGet(0, &obj2);
+    w = obj2.getInt();
+    obj2.free();
+    obj1.arrayGet(1, &obj2);
+    h = obj2.getInt();
+    obj2.free();
+    writePSFmt("%%IncludedImageDimensions: {0:d} {1:d}\n", w, h);
+  }
+  obj1.free();
+
+  dict->lookup("IncludedImageQuality", &obj1);
+  if (obj1.isNum()) {
+    writePSFmt("%%IncludedImageQuality: {0:.6g}\n", obj1.getNum());
+  }
+  obj1.free();
+
+  ++opi20Nest;
+}
+
+void PSOutputDev::opiBegin13(GfxState *state, Dict *dict) {
+  Object obj1, obj2;
+  int left, right, top, bottom, samples, bits, width, height;
+  double c, m, y, k;
+  double llx, lly, ulx, uly, urx, ury, lrx, lry;
+  double tllx, tlly, tulx, tuly, turx, tury, tlrx, tlry;
+  double horiz, vert;
+  int i, j;
+
+  writePS("save\n");
+  writePS("/opiMatrix2 matrix currentmatrix def\n");
+  writePS("opiMatrix setmatrix\n");
+
+  dict->lookup("F", &obj1);
+  if (getFileSpecName(&obj1, &obj2)) {
+    writePSFmt("%ALDImageFileName: {0:t}\n", obj2.getString());
+    obj2.free();
+  }
+  obj1.free();
+
+  dict->lookup("CropRect", &obj1);
+  if (obj1.isArray() && obj1.arrayGetLength() == 4) {
+    obj1.arrayGet(0, &obj2);
+    left = obj2.getInt();
+    obj2.free();
+    obj1.arrayGet(1, &obj2);
+    top = obj2.getInt();
+    obj2.free();
+    obj1.arrayGet(2, &obj2);
+    right = obj2.getInt();
+    obj2.free();
+    obj1.arrayGet(3, &obj2);
+    bottom = obj2.getInt();
+    obj2.free();
+    writePSFmt("%ALDImageCropRect: {0:d} {1:d} {2:d} {3:d}\n",
+              left, top, right, bottom);
+  }
+  obj1.free();
+
+  dict->lookup("Color", &obj1);
+  if (obj1.isArray() && obj1.arrayGetLength() == 5) {
+    obj1.arrayGet(0, &obj2);
+    c = obj2.getNum();
+    obj2.free();
+    obj1.arrayGet(1, &obj2);
+    m = obj2.getNum();
+    obj2.free();
+    obj1.arrayGet(2, &obj2);
+    y = obj2.getNum();
+    obj2.free();
+    obj1.arrayGet(3, &obj2);
+    k = obj2.getNum();
+    obj2.free();
+    obj1.arrayGet(4, &obj2);
+    if (obj2.isString()) {
+      writePSFmt("%ALDImageColor: {0:.4g} {1:.4g} {2:.4g} {3:.4g} ",
+                c, m, y, k);
+      writePSString(obj2.getString());
+      writePS("\n");
+    }
+    obj2.free();
+  }
+  obj1.free();
+
+  dict->lookup("ColorType", &obj1);
+  if (obj1.isName()) {
+    writePSFmt("%ALDImageColorType: {0:s}\n", obj1.getName());
+  }
+  obj1.free();
+
+  //~ ignores 'Comments' entry
+  //~ need to handle multiple lines
+
+  dict->lookup("CropFixed", &obj1);
+  if (obj1.isArray()) {
+    obj1.arrayGet(0, &obj2);
+    ulx = obj2.getNum();
+    obj2.free();
+    obj1.arrayGet(1, &obj2);
+    uly = obj2.getNum();
+    obj2.free();
+    obj1.arrayGet(2, &obj2);
+    lrx = obj2.getNum();
+    obj2.free();
+    obj1.arrayGet(3, &obj2);
+    lry = obj2.getNum();
+    obj2.free();
+    writePSFmt("%ALDImageCropFixed: {0:.6g} {1:.6g} {2:.6g} {3:.6g}\n",
+              ulx, uly, lrx, lry);
+  }
+  obj1.free();
+
+  dict->lookup("GrayMap", &obj1);
+  if (obj1.isArray()) {
+    writePS("%ALDImageGrayMap:");
+    for (i = 0; i < obj1.arrayGetLength(); i += 16) {
+      if (i > 0) {
+       writePS("\n%%+");
+      }
+      for (j = 0; j < 16 && i+j < obj1.arrayGetLength(); ++j) {
+       obj1.arrayGet(i+j, &obj2);
+       writePSFmt(" {0:d}", obj2.getInt());
+       obj2.free();
+      }
+    }
+    writePS("\n");
+  }
+  obj1.free();
+
+  dict->lookup("ID", &obj1);
+  if (obj1.isString()) {
+    writePSFmt("%ALDImageID: {0:t}\n", obj1.getString());
+  }
+  obj1.free();
+
+  dict->lookup("ImageType", &obj1);
+  if (obj1.isArray() && obj1.arrayGetLength() == 2) {
+    obj1.arrayGet(0, &obj2);
+    samples = obj2.getInt();
+    obj2.free();
+    obj1.arrayGet(1, &obj2);
+    bits = obj2.getInt();
+    obj2.free();
+    writePSFmt("%ALDImageType: {0:d} {1:d}\n", samples, bits);
+  }
+  obj1.free();
+
+  dict->lookup("Overprint", &obj1);
+  if (obj1.isBool()) {
+    writePSFmt("%ALDImageOverprint: {0:s}\n",
+              obj1.getBool() ? "true" : "false");
+  }
+  obj1.free();
+
+  dict->lookup("Position", &obj1);
+  if (obj1.isArray() && obj1.arrayGetLength() == 8) {
+    obj1.arrayGet(0, &obj2);
+    llx = obj2.getNum();
+    obj2.free();
+    obj1.arrayGet(1, &obj2);
+    lly = obj2.getNum();
+    obj2.free();
+    obj1.arrayGet(2, &obj2);
+    ulx = obj2.getNum();
+    obj2.free();
+    obj1.arrayGet(3, &obj2);
+    uly = obj2.getNum();
+    obj2.free();
+    obj1.arrayGet(4, &obj2);
+    urx = obj2.getNum();
+    obj2.free();
+    obj1.arrayGet(5, &obj2);
+    ury = obj2.getNum();
+    obj2.free();
+    obj1.arrayGet(6, &obj2);
+    lrx = obj2.getNum();
+    obj2.free();
+    obj1.arrayGet(7, &obj2);
+    lry = obj2.getNum();
+    obj2.free();
+    opiTransform(state, llx, lly, &tllx, &tlly);
+    opiTransform(state, ulx, uly, &tulx, &tuly);
+    opiTransform(state, urx, ury, &turx, &tury);
+    opiTransform(state, lrx, lry, &tlrx, &tlry);
+    writePSFmt("%ALDImagePosition: {0:.6g} {1:.6g} {2:.6g} {3:.6g} {4:.6g} {5:.6g} {6:.6g} {7:.6g}\n",
+              tllx, tlly, tulx, tuly, turx, tury, tlrx, tlry);
+    obj2.free();
+  }
+  obj1.free();
+
+  dict->lookup("Resolution", &obj1);
+  if (obj1.isArray() && obj1.arrayGetLength() == 2) {
+    obj1.arrayGet(0, &obj2);
+    horiz = obj2.getNum();
+    obj2.free();
+    obj1.arrayGet(1, &obj2);
+    vert = obj2.getNum();
+    obj2.free();
+    writePSFmt("%ALDImageResoution: {0:.6g} {1:.6g}\n", horiz, vert);
+    obj2.free();
+  }
+  obj1.free();
+
+  dict->lookup("Size", &obj1);
+  if (obj1.isArray() && obj1.arrayGetLength() == 2) {
+    obj1.arrayGet(0, &obj2);
+    width = obj2.getInt();
+    obj2.free();
+    obj1.arrayGet(1, &obj2);
+    height = obj2.getInt();
+    obj2.free();
+    writePSFmt("%ALDImageDimensions: {0:d} {1:d}\n", width, height);
+  }
+  obj1.free();
+
+  //~ ignoring 'Tags' entry
+  //~ need to use writePSString() and deal with >255-char lines
+
+  dict->lookup("Tint", &obj1);
+  if (obj1.isNum()) {
+    writePSFmt("%ALDImageTint: {0:.6g}\n", obj1.getNum());
+  }
+  obj1.free();
+
+  dict->lookup("Transparency", &obj1);
+  if (obj1.isBool()) {
+    writePSFmt("%ALDImageTransparency: {0:s}\n",
+              obj1.getBool() ? "true" : "false");
+  }
+  obj1.free();
+
+  writePS("%%BeginObject: image\n");
+  writePS("opiMatrix2 setmatrix\n");
+  ++opi13Nest;
+}
+
+// Convert PDF user space coordinates to PostScript default user space
+// coordinates.  This has to account for both the PDF CTM and the
+// PSOutputDev page-fitting transform.
+void PSOutputDev::opiTransform(GfxState *state, double x0, double y0,
+                              double *x1, double *y1) {
+  double t;
+
+  state->transform(x0, y0, x1, y1);
+  *x1 += tx;
+  *y1 += ty;
+  if (rotate == 90) {
+    t = *x1;
+    *x1 = -*y1;
+    *y1 = t;
+  } else if (rotate == 180) {
+    *x1 = -*x1;
+    *y1 = -*y1;
+  } else if (rotate == 270) {
+    t = *x1;
+    *x1 = *y1;
+    *y1 = -t;
+  }
+  *x1 *= xScale;
+  *y1 *= yScale;
+}
+
+void PSOutputDev::opiEnd(GfxState *state, Dict *opiDict) {
+  Object dict;
+
+  if (globalParams->getPSOPI()) {
+    opiDict->lookup("2.0", &dict);
+    if (dict.isDict()) {
+      writePS("%%EndIncludedImage\n");
+      writePS("%%EndOPI\n");
+      writePS("grestore\n");
+      --opi20Nest;
+      dict.free();
+    } else {
+      dict.free();
+      opiDict->lookup("1.3", &dict);
+      if (dict.isDict()) {
+       writePS("%%EndObject\n");
+       writePS("restore\n");
+       --opi13Nest;
+      }
+      dict.free();
+    }
+  }
+}
+#endif // OPI_SUPPORT
+
+void PSOutputDev::type3D0(GfxState *state, double wx, double wy) {
+  writePSFmt("{0:.6g} {1:.6g} setcharwidth\n", wx, wy);
+  writePS("q\n");
+  t3NeedsRestore = gTrue;
+}
+
+void PSOutputDev::type3D1(GfxState *state, double wx, double wy,
+                         double llx, double lly, double urx, double ury) {
+  t3WX = wx;
+  t3WY = wy;
+  t3LLX = llx;
+  t3LLY = lly;
+  t3URX = urx;
+  t3URY = ury;
+  t3String = new GooString();
+  writePS("q\n");
+  t3FillColorOnly = gTrue;
+  t3Cacheable = gTrue;
+  t3NeedsRestore = gTrue;
+}
+
+void PSOutputDev::drawForm(Ref id) {
+  writePSFmt("f_{0:d}_{1:d}\n", id.num, id.gen);
+}
+
+void PSOutputDev::psXObject(Stream *psStream, Stream *level1Stream) {
+  Stream *str;
+  int c;
+
+  if ((level == psLevel1 || level == psLevel1Sep) && level1Stream) {
+    str = level1Stream;
+  } else {
+    str = psStream;
+  }
+  str->reset();
+  while ((c = str->getChar()) != EOF) {
+    writePSChar(c);
+  }
+  str->close();
+}
+
+//~ can nextFunc be reset to 0 -- maybe at the start of each page?
+//~   or maybe at the start of each color space / pattern?
+void PSOutputDev::cvtFunction(Function *func, GBool invertPSFunction) {
+  SampledFunction *func0;
+  ExponentialFunction *func2;
+  StitchingFunction *func3;
+  PostScriptFunction *func4;
+  int thisFunc, m, n, nSamples, i, j, k;
+
+  switch (func->getType()) {
+
+  case -1:                     // identity
+    writePS("{}\n");
+    break;
+
+  case 0:                      // sampled
+    func0 = (SampledFunction *)func;
+    thisFunc = nextFunc++;
+    m = func0->getInputSize();
+    n = func0->getOutputSize();
+    nSamples = n;
+    for (i = 0; i < m; ++i) {
+      nSamples *= func0->getSampleSize(i);
+    }
+    writePSFmt("/xpdfSamples{0:d} [\n", thisFunc);
+    for (i = 0; i < nSamples; ++i) {
+      writePSFmt("{0:.6g}\n", func0->getSamples()[i]);
+    }
+    writePS("] def\n");
+    writePSFmt("{{ {0:d} array {1:d} array {2:d} 2 roll\n", 2*m, m, m+2);
+    // [e01] [efrac] x0 x1 ... xm-1
+    for (i = m-1; i >= 0; --i) {
+      // [e01] [efrac] x0 x1 ... xi
+      writePSFmt("{0:.6g} sub {1:.6g} mul {2:.6g} add\n",
+             func0->getDomainMin(i),
+             (func0->getEncodeMax(i) - func0->getEncodeMin(i)) /
+               (func0->getDomainMax(i) - func0->getDomainMin(i)),
+             func0->getEncodeMin(i));
+      // [e01] [efrac] x0 x1 ... xi-1 xi'
+      writePSFmt("dup 0 lt {{ pop 0 }} {{ dup {0:d} gt {{ pop {1:d} }} if }} ifelse\n",
+                func0->getSampleSize(i) - 1, func0->getSampleSize(i) - 1);
+      // [e01] [efrac] x0 x1 ... xi-1 xi'
+      writePS("dup floor cvi exch dup ceiling cvi exch 2 index sub\n");
+      // [e01] [efrac] x0 x1 ... xi-1 floor(xi') ceiling(xi') xi'-floor(xi')
+      writePSFmt("{0:d} index {1:d} 3 2 roll put\n", i+3, i);
+      // [e01] [efrac] x0 x1 ... xi-1 floor(xi') ceiling(xi')
+      writePSFmt("{0:d} index {1:d} 3 2 roll put\n", i+3, 2*i+1);
+      // [e01] [efrac] x0 x1 ... xi-1 floor(xi')
+      writePSFmt("{0:d} index {1:d} 3 2 roll put\n", i+2, 2*i);
+      // [e01] [efrac] x0 x1 ... xi-1
+    }
+    // [e01] [efrac]
+    for (i = 0; i < n; ++i) {
+      // [e01] [efrac] y(0) ... y(i-1)
+      for (j = 0; j < (1<<m); ++j) {
+       // [e01] [efrac] y(0) ... y(i-1) s(0) s(1) ... s(j-1)
+       writePSFmt("xpdfSamples{0:d}\n", thisFunc);
+       k = m - 1;
+       writePSFmt("{0:d} index {1:d} get\n", i+j+2, 2 * k + ((j >> k) & 1));
+       for (k = m - 2; k >= 0; --k) {
+         writePSFmt("{0:d} mul {1:d} index {2:d} get add\n",
+                    func0->getSampleSize(k),
+                    i + j + 3,
+                    2 * k + ((j >> k) & 1));
+       }
+       if (n > 1) {
+         writePSFmt("{0:d} mul {1:d} add ", n, i);
+       }
+       writePS("get\n");
+      }
+      // [e01] [efrac] y(0) ... y(i-1) s(0) s(1) ... s(2^m-1)
+      for (j = 0; j < m; ++j) {
+       // [e01] [efrac] y(0) ... y(i-1) s(0) s(1) ... s(2^(m-j)-1)
+       for (k = 0; k < (1 << (m - j)); k += 2) {
+         // [e01] [efrac] y(0) ... y(i-1) <k/2 s' values> <2^(m-j)-k s values>
+         writePSFmt("{0:d} index {1:d} get dup\n",
+                    i + k/2 + (1 << (m-j)) - k, j);
+         writePS("3 2 roll mul exch 1 exch sub 3 2 roll mul add\n");
+         writePSFmt("{0:d} 1 roll\n", k/2 + (1 << (m-j)) - k - 1);
+       }
+       // [e01] [efrac] s'(0) s'(1) ... s(2^(m-j-1)-1)
+      }
+      // [e01] [efrac] y(0) ... y(i-1) s
+      writePSFmt("{0:.6g} mul {1:.6g} add\n",
+                func0->getDecodeMax(i) - func0->getDecodeMin(i),
+                func0->getDecodeMin(i));
+      writePSFmt("dup {0:.6g} lt {{ pop {1:.6g} }} {{ dup {2:.6g} gt {{ pop {3:.6g} }} if }} ifelse\n",
+                func0->getRangeMin(i), func0->getRangeMin(i),
+                func0->getRangeMax(i), func0->getRangeMax(i));
+      // [e01] [efrac] y(0) ... y(i-1) y(i)
+    }
+    // [e01] [efrac] y(0) ... y(n-1)
+    writePSFmt("{0:d} {1:d} roll pop pop \n", n+2, n);
+    if (invertPSFunction) {
+      for (i = 0; i < n; ++i) {
+        writePSFmt("{0:d} -1 roll ", n);
+        writePSFmt("{0:.6g} sub {1:.6g} div ", func0->getRangeMin(i), func0->getRangeMax(i) - func0->getRangeMin(i));
+      }
+    }
+    writePS("}\n");
+    break;
+
+  case 2:                      // exponential
+    func2 = (ExponentialFunction *)func;
+    n = func2->getOutputSize();
+    writePSFmt("{{ dup {0:.6g} lt {{ pop {1:.6g} }} {{ dup {2:.6g} gt {{ pop {3:.6g} }} if }} ifelse\n",
+              func2->getDomainMin(0), func2->getDomainMin(0),
+              func2->getDomainMax(0), func2->getDomainMax(0));
+    // x
+    for (i = 0; i < n; ++i) {
+      // x y(0) .. y(i-1)
+      writePSFmt("{0:d} index {1:.6g} exp {2:.6g} mul {3:.6g} add\n",
+                i, func2->getE(), func2->getC1()[i] - func2->getC0()[i],
+                func2->getC0()[i]);
+      if (func2->getHasRange()) {
+       writePSFmt("dup {0:.6g} lt {{ pop {1:.6g} }} {{ dup {2:.6g} gt {{ pop {3:.6g} }} if }} ifelse\n",
+                  func2->getRangeMin(i), func2->getRangeMin(i),
+                  func2->getRangeMax(i), func2->getRangeMax(i));
+      }
+    }
+    // x y(0) .. y(n-1)
+    writePSFmt("{0:d} {1:d} roll pop \n", n+1, n);
+    if (invertPSFunction && func2->getHasRange()) {
+      for (i = 0; i < n; ++i) {
+        writePSFmt("{0:d} -1 roll ", n);
+        writePSFmt("{0:.6g} sub {1:.6g} div ", func2->getRangeMin(i), func2->getRangeMax(i) - func2->getRangeMin(i));
+      }
+    }
+    writePS("}\n");
+    break;
+
+  case 3:                      // stitching
+    func3 = (StitchingFunction *)func;
+    thisFunc = nextFunc++;
+    for (i = 0; i < func3->getNumFuncs(); ++i) {
+      cvtFunction(func3->getFunc(i));
+      writePSFmt("/xpdfFunc{0:d}_{1:d} exch def\n", thisFunc, i);
+    }
+    writePSFmt("{{ dup {0:.6g} lt {{ pop {1:.6g} }} {{ dup {2:.6g} gt {{ pop {3:.6g} }} if }} ifelse\n",
+              func3->getDomainMin(0), func3->getDomainMin(0),
+              func3->getDomainMax(0), func3->getDomainMax(0));
+    for (i = 0; i < func3->getNumFuncs() - 1; ++i) {
+      writePSFmt("dup {0:.6g} lt {{ {1:.6g} sub {2:.6g} mul {3:.6g} add xpdfFunc{4:d}_{5:d} }} {{\n",
+                func3->getBounds()[i+1],
+                func3->getBounds()[i],
+                func3->getScale()[i],
+                func3->getEncode()[2*i],
+                thisFunc, i);
+    }
+    writePSFmt("{0:.6g} sub {1:.6g} mul {2:.6g} add xpdfFunc{3:d}_{4:d}\n",
+              func3->getBounds()[i],
+              func3->getScale()[i],
+              func3->getEncode()[2*i],
+              thisFunc, i);
+    for (i = 0; i < func3->getNumFuncs() - 1; ++i) {
+      writePS("} ifelse\n");
+    }
+    if (invertPSFunction && func3->getHasRange()) {
+      n = func3->getOutputSize();
+      for (i = 0; i < n; ++i) {
+        writePSFmt("{0:d} -1 roll ", n);
+        writePSFmt("{0:.6g} sub {1:.6g} div ", func3->getRangeMin(i), func3->getRangeMax(i) - func3->getRangeMin(i));
+      }
+    }
+    writePS("}\n");
+    break;
+
+  case 4:                      // PostScript
+    func4 = (PostScriptFunction *)func;
+    if (invertPSFunction) {
+      GooString *codeString = new GooString(func4->getCodeString());
+      for (i = codeString->getLength() -1; i > 0; i--) {
+        if (codeString->getChar(i) == '}') {
+          codeString->del(i);
+          break;
+        }
+      }
+      writePS(codeString->getCString());
+      writePS("\n");
+      delete codeString;
+      n = func4->getOutputSize();
+      for (i = 0; i < n; ++i) {
+        writePSFmt("{0:d} -1 roll ", n);
+        writePSFmt("{0:.6g} sub {1:.6g} div ", func4->getRangeMin(i), func4->getRangeMax(i) - func4->getRangeMin(i));
+      }
+      writePS("}\n");
+    } else {
+      writePS(func4->getCodeString()->getCString());
+      writePS("\n");
+    }
+    break;
+  }
+}
+
+void PSOutputDev::writePSChar(char c) {
+  if (t3String) {
+    t3String->append(c);
+  } else {
+    (*outputFunc)(outputStream, &c, 1);
+  }
+}
+
+void PSOutputDev::writePS(const char *s) {
+  if (t3String) {
+    t3String->append(s);
+  } else {
+    (*outputFunc)(outputStream, s, strlen(s));
+  }
+}
+
+void PSOutputDev::writePSBuf(const char *s, int len) {
+  if (t3String) {
+    for (int i = 0; i < len; i++) {
+      t3String->append(s[i]);
+    }
+  } else {
+    (*outputFunc)(outputStream, s, len);
+  }
+}
+
+void PSOutputDev::writePSFmt(const char *fmt, ...) {
+  va_list args;
+  GooString *buf;
+
+  va_start(args, fmt);
+  if (t3String) {
+    t3String->appendfv((char *)fmt, args);
+  } else {
+    buf = GooString::formatv((char *)fmt, args);
+    (*outputFunc)(outputStream, buf->getCString(), buf->getLength());
+    delete buf;
+  }
+  va_end(args);
+}
+
+void PSOutputDev::writePSString(GooString *s) {
+  Guchar *p;
+  int n, line;
+  char buf[8];
+
+  writePSChar('(');
+  line = 1;
+  for (p = (Guchar *)s->getCString(), n = s->getLength(); n; ++p, --n) {
+    if (line >= 64) {
+      writePSChar('\\');
+      writePSChar('\n');
+      line = 0;
+    }
+    if (*p == '(' || *p == ')' || *p == '\\') {
+      writePSChar('\\');
+      writePSChar((char)*p);
+      line += 2;
+    } else if (*p < 0x20 || *p >= 0x80) {
+      sprintf(buf, "\\%03o", *p);
+      writePS(buf);
+      line += 4;
+    } else {
+      writePSChar((char)*p);
+      ++line;
+    }
+  }
+  writePSChar(')');
+}
+
+void PSOutputDev::writePSName(const char *s) {
+  const char *p;
+  char c;
+
+  p = s;
+  while ((c = *p++)) {
+    if (c <= (char)0x20 || c >= (char)0x7f ||
+       c == '(' || c == ')' || c == '<' || c == '>' ||
+       c == '[' || c == ']' || c == '{' || c == '}' ||
+       c == '/' || c == '%' || c == '\\') {
+      writePSFmt("#{0:02x}", c & 0xff);
+    } else {
+      writePSChar(c);
+    }
+  }
+}
+
+GooString *PSOutputDev::filterPSName(GooString *name) {
+  GooString *name2;
+  char buf[8];
+  int i;
+  char c;
+
+  name2 = new GooString();
+
+  // ghostscript chokes on names that begin with out-of-limits
+  // numbers, e.g., 1e4foo is handled correctly (as a name), but
+  // 1e999foo generates a limitcheck error
+  c = name->getChar(0);
+  if (c >= '0' && c <= '9') {
+    name2->append('f');
+  }
+
+  for (i = 0; i < name->getLength(); ++i) {
+    c = name->getChar(i);
+    if (c <= (char)0x20 || c >= (char)0x7f ||
+       c == '(' || c == ')' || c == '<' || c == '>' ||
+       c == '[' || c == ']' || c == '{' || c == '}' ||
+       c == '/' || c == '%') {
+      sprintf(buf, "#%02x", c & 0xff);
+      name2->append(buf);
+    } else {
+      name2->append(c);
+    }
+  }
+  return name2;
+}
+
+// Convert GooString to GooString, with appropriate escaping
+// of things that can't appear in a label
+// This is heavily based on the writePSTextLine() method
+GooString* PSOutputDev::filterPSLabel(GooString *label, GBool *needParens) {
+  int i, step;
+  GBool isNumeric;
+
+  // - DSC comments must be printable ASCII; control chars and
+  //   backslashes have to be escaped (we do cheap UCS2-to-ASCII
+  //   conversion by simply ignoring the high byte)
+  // - parentheses are escaped. this isn't strictly necessary for matched
+  //   parentheses, but shouldn't be a problem
+  // - lines are limited to 255 chars (we limit to 200 here to allow
+  //   for the keyword, which was emitted by the caller)
+
+  GooString *label2 = new GooString();
+  int labelLength = label->getLength();
+
+  if (labelLength == 0) {
+    isNumeric = false;
+  } else {
+    // this gets changed later if we find a non-numeric character
+    isNumeric = true;
+  }
+
+  if ( (labelLength >= 2) &&
+       ( (label->getChar(0) & 0xff) == 0xfe) &&
+       ( (label->getChar(1) & 0xff) == 0xff) ) {
+    // UCS2 mode
+    i = 3;
+    step = 2;
+    if ( (label->getChar(labelLength-1) == 0) ) {
+      // prune the trailing null (0x000 for UCS2)
+      labelLength -= 2;
+    }
+  } else {
+    i = 0;
+    step = 1;
+  }
+  for (int j = 0; i < labelLength && j < 200; i += step) {
+    char c = label->getChar(i);
+    if ( (c < '0') || (c > '9') ) {
+      isNumeric = false;
+    }
+    if (c == '\\') {
+      label2->append("\\\\");
+      j += 2;
+    } else if (c == ')') {
+      label2->append("\\)");
+    } else if (c == '(') {
+      label2->append("\\(");
+    } else if (c < 0x20 || c > 0x7e) {
+      label2->append(GooString::format("\\{0:03o}", c));
+      j += 4;
+    } else {
+      label2->append(c);
+      ++j;
+    }
+  }
+  if (needParens) {
+    *needParens = !(isNumeric);
+  }
+  return label2;
+}
+
+// Write a DSC-compliant <textline>.
+void PSOutputDev::writePSTextLine(GooString *s) {
+  int i, j, step;
+  int c;
+
+  // - DSC comments must be printable ASCII; control chars and
+  //   backslashes have to be escaped (we do cheap Unicode-to-ASCII
+  //   conversion by simply ignoring the high byte)
+  // - lines are limited to 255 chars (we limit to 200 here to allow
+  //   for the keyword, which was emitted by the caller)
+  // - lines that start with a left paren are treated as <text>
+  //   instead of <textline>, so we escape a leading paren
+  if (s->getLength() >= 2 &&
+      (s->getChar(0) & 0xff) == 0xfe &&
+      (s->getChar(1) & 0xff) == 0xff) {
+    i = 3;
+    step = 2;
+  } else {
+    i = 0;
+    step = 1;
+  }
+  for (j = 0; i < s->getLength() && j < 200; i += step) {
+    c = s->getChar(i) & 0xff;
+    if (c == '\\') {
+      writePS("\\\\");
+      j += 2;
+    } else if (c < 0x20 || c > 0x7e || (j == 0 && c == '(')) {
+      writePSFmt("\\{0:03o}", c);
+      j += 4;
+    } else {
+      writePSChar(c);
+      ++j;
+    }
+  }
+  writePS("\n");
+}
diff --git a/poppler/PSOutputDev.h b/poppler/PSOutputDev.h
new file mode 100644 (file)
index 0000000..809f058
--- /dev/null
@@ -0,0 +1,495 @@
+//========================================================================
+//
+// PSOutputDev.h
+//
+// Copyright 1996-2003 Glyph & Cog, LLC
+//
+//========================================================================
+
+//========================================================================
+//
+// Modified under the Poppler project - http://poppler.freedesktop.org
+//
+// All changes made under the Poppler project to this file are licensed
+// under GPL version 2 or later
+//
+// Copyright (C) 2005 Martin Kretzschmar <martink@gnome.org>
+// Copyright (C) 2005 Kristian Høgsberg <krh@redhat.com>
+// Copyright (C) 2006-2008 Albert Astals Cid <aacid@kde.org>
+// Copyright (C) 2007 Brad Hards <bradh@kde.org>
+// Copyright (C) 2009-2012 Thomas Freitag <Thomas.Freitag@alfa.de>
+// Copyright (C) 2009 Till Kamppeter <till.kamppeter@gmail.com>
+// Copyright (C) 2009 Carlos Garcia Campos <carlosgc@gnome.org>
+// Copyright (C) 2009, 2011 William Bader <williambader@hotmail.com>
+// Copyright (C) 2010 Hib Eris <hib@hiberis.nl>
+// Copyright (C) 2011 Adrian Johnson <ajohnson@redneon.com>
+// Copyright (C) 2012 Fabio D'Urso <fabiodurso@hotmail.it>
+//
+// To see a description of the changes please see the Changelog file that
+// came with your tarball or type make ChangeLog if you are building from git
+//
+//========================================================================
+
+#ifndef PSOUTPUTDEV_H
+#define PSOUTPUTDEV_H
+
+#ifdef USE_GCC_PRAGMAS
+#pragma interface
+#endif
+
+#include "poppler-config.h"
+#include <stddef.h>
+#include "Object.h"
+#include "GfxState.h"
+#include "GlobalParams.h"
+#include "OutputDev.h"
+
+class GHooash;
+class PDFDoc;
+class XRef;
+class Function;
+class GfxPath;
+class GfxFont;
+class GfxColorSpace;
+class GfxSeparationColorSpace;
+class PDFRectangle;
+struct PST1FontName;
+struct PSFont8Info;
+struct PSFont16Enc;
+class PSOutCustomColor;
+class PSOutputDev;
+
+//------------------------------------------------------------------------
+// PSOutputDev
+//------------------------------------------------------------------------
+
+enum PSOutMode {
+  psModePS,
+  psModeEPS,
+  psModeForm,
+  psModePSOrigPageSizes
+};
+
+enum PSFileType {
+  psFile,                      // write to file
+  psPipe,                      // write to pipe
+  psStdout,                    // write to stdout
+  psGeneric                    // write to a generic stream
+};
+
+enum PSOutCustomCodeLocation {
+  psOutCustomDocSetup,
+  psOutCustomPageSetup
+};
+
+typedef void (*PSOutputFunc)(void *stream, const char *data, int len);
+
+typedef GooString *(*PSOutCustomCodeCbk)(PSOutputDev *psOut,
+                                      PSOutCustomCodeLocation loc, int n, 
+                                      void *data);
+
+class PSOutputDev: public OutputDev {
+public:
+
+  // Open a PostScript output file, and write the prolog.
+  PSOutputDev(const char *fileName, PDFDoc *docA,
+             char *psTitle,
+             int firstPage, int lastPage, PSOutMode modeA,
+             int paperWidthA = -1, int paperHeightA = -1,
+             GBool duplexA = gTrue,
+             int imgLLXA = 0, int imgLLYA = 0,
+             int imgURXA = 0, int imgURYA = 0,
+             GBool forceRasterizeA = gFalse,
+             GBool manualCtrlA = gFalse,
+             PSOutCustomCodeCbk customCodeCbkA = NULL,
+             void *customCodeCbkDataA = NULL);
+
+  // Open a PSOutputDev that will write to a generic stream.
+  PSOutputDev(PSOutputFunc outputFuncA, void *outputStreamA,
+             char *psTitle,
+             PDFDoc *docA,
+             int firstPage, int lastPage, PSOutMode modeA,
+             int paperWidthA = -1, int paperHeightA = -1,
+             GBool duplexA = gTrue,
+             int imgLLXA = 0, int imgLLYA = 0,
+             int imgURXA = 0, int imgURYA = 0,
+             GBool forceRasterizeA = gFalse,
+             GBool manualCtrlA = gFalse,
+             PSOutCustomCodeCbk customCodeCbkA = NULL,
+             void *customCodeCbkDataA = NULL);
+
+  // Destructor -- writes the trailer and closes the file.
+  virtual ~PSOutputDev();
+
+  // Check if file was successfully created.
+  virtual GBool isOk() { return ok; }
+
+  //---- get info about output device
+
+  // Does this device use upside-down coordinates?
+  // (Upside-down means (0,0) is the top left corner of the page.)
+  virtual GBool upsideDown() { return gFalse; }
+
+  // Does this device use drawChar() or drawString()?
+  virtual GBool useDrawChar() { return gFalse; }
+
+  // Does this device use tilingPatternFill()?  If this returns false,
+  // tiling pattern fills will be reduced to a series of other drawing
+  // operations.
+  virtual GBool useTilingPatternFill() { return gTrue; }
+
+  // Does this device use functionShadedFill(), axialShadedFill(), and
+  // radialShadedFill()?  If this returns false, these shaded fills
+  // will be reduced to a series of other drawing operations.
+  virtual GBool useShadedFills(int type)
+    { return type < 4 && level >= psLevel2; }
+
+  // Does this device use drawForm()?  If this returns false,
+  // form-type XObjects will be interpreted (i.e., unrolled).
+  virtual GBool useDrawForm() { return preload; }
+
+  // Does this device use beginType3Char/endType3Char?  Otherwise,
+  // text in Type 3 fonts will be drawn with drawChar/drawString.
+  virtual GBool interpretType3Chars() { return gFalse; }
+
+  //----- header/trailer (used only if manualCtrl is true)
+
+  // Write the document-level header.
+  void writeHeader(int firstPage, int lastPage,
+                  PDFRectangle *mediaBox, PDFRectangle *cropBox,
+                  int pageRotate, char *pstitle);
+
+  // Write the Xpdf procset.
+  void writeXpdfProcset();
+
+  // Write the trailer for the current page.
+  void writePageTrailer();
+
+  // Write the document trailer.
+  void writeTrailer();
+
+  //----- initialization and control
+
+  // Check to see if a page slice should be displayed.  If this
+  // returns false, the page display is aborted.  Typically, an
+  // OutputDev will use some alternate means to display the page
+  // before returning false.
+  virtual GBool checkPageSlice(Page *page, double hDPI, double vDPI,
+                              int rotate, GBool useMediaBox, GBool crop,
+                              int sliceX, int sliceY, int sliceW, int sliceH,
+                              GBool printing,
+                              GBool (*abortCheckCbk)(void *data) = NULL,
+                              void *abortCheckCbkData = NULL,
+                              GBool (*annotDisplayDecideCbk)(Annot *annot, void *user_data) = NULL,
+                              void *annotDisplayDecideCbkData = NULL);
+
+  // Start a page.
+  virtual void startPage(int pageNum, GfxState *state);
+
+  // End a page.
+  virtual void endPage();
+
+  //----- save/restore graphics state
+  virtual void saveState(GfxState *state);
+  virtual void restoreState(GfxState *state);
+
+  //----- update graphics state
+  virtual void updateCTM(GfxState *state, double m11, double m12,
+                        double m21, double m22, double m31, double m32);
+  virtual void updateLineDash(GfxState *state);
+  virtual void updateFlatness(GfxState *state);
+  virtual void updateLineJoin(GfxState *state);
+  virtual void updateLineCap(GfxState *state);
+  virtual void updateMiterLimit(GfxState *state);
+  virtual void updateLineWidth(GfxState *state);
+  virtual void updateFillColorSpace(GfxState *state);
+  virtual void updateStrokeColorSpace(GfxState *state);
+  virtual void updateFillColor(GfxState *state);
+  virtual void updateStrokeColor(GfxState *state);
+  virtual void updateFillOverprint(GfxState *state);
+  virtual void updateStrokeOverprint(GfxState *state);
+  virtual void updateOverprintMode(GfxState *state);
+  virtual void updateTransfer(GfxState *state);
+
+  //----- update text state
+  virtual void updateFont(GfxState *state);
+  virtual void updateTextMat(GfxState *state);
+  virtual void updateCharSpace(GfxState *state);
+  virtual void updateRender(GfxState *state);
+  virtual void updateRise(GfxState *state);
+  virtual void updateWordSpace(GfxState *state);
+  virtual void updateHorizScaling(GfxState *state);
+  virtual void updateTextPos(GfxState *state);
+  virtual void updateTextShift(GfxState *state, double shift);
+  virtual void saveTextPos(GfxState *state);
+  virtual void restoreTextPos(GfxState *state);
+
+  //----- path painting
+  virtual void stroke(GfxState *state);
+  virtual void fill(GfxState *state);
+  virtual void eoFill(GfxState *state);
+  virtual GBool tilingPatternFill(GfxState *state, Gfx *gfx, Catalog *cat, Object *str,
+                                 double *pmat, int paintType, int tilingType, Dict *resDict,
+                                 double *mat, double *bbox,
+                                 int x0, int y0, int x1, int y1,
+                                 double xStep, double yStep);
+  virtual GBool functionShadedFill(GfxState *state,
+                                  GfxFunctionShading *shading);
+  virtual GBool axialShadedFill(GfxState *state, GfxAxialShading *shading, double /*tMin*/, double /*tMax*/);
+  virtual GBool radialShadedFill(GfxState *state, GfxRadialShading *shading, double /*sMin*/, double /*sMax*/);
+
+  //----- path clipping
+  virtual void clip(GfxState *state);
+  virtual void eoClip(GfxState *state);
+  virtual void clipToStrokePath(GfxState *state);
+
+  //----- text drawing
+  virtual void drawString(GfxState *state, GooString *s);
+  virtual void beginTextObject(GfxState *state);
+  virtual GBool deviceHasTextClip(GfxState *state) { return haveTextClip; }
+  virtual void endTextObject(GfxState *state);
+
+  //----- image drawing
+  virtual void drawImageMask(GfxState *state, Object *ref, Stream *str,
+                            int width, int height, GBool invert,
+                            GBool interpolate, GBool inlineImg);
+  virtual void setSoftMaskFromImageMask(GfxState *state,
+                                       Object *ref, Stream *str,
+                                       int width, int height, GBool invert,
+                                       GBool inlineImg, double *baseMatrix);
+  virtual void unsetSoftMaskFromImageMask(GfxState *state, double *baseMatrix);
+  virtual void drawImage(GfxState *state, Object *ref, Stream *str,
+                        int width, int height, GfxImageColorMap *colorMap,
+                        GBool interpolate, int *maskColors, GBool inlineImg);
+  virtual void drawMaskedImage(GfxState *state, Object *ref, Stream *str,
+                              int width, int height,
+                              GfxImageColorMap *colorMap,
+                              GBool interpolate,
+                              Stream *maskStr, int maskWidth, int maskHeight,
+                              GBool maskInvert, GBool maskInterpolate);
+
+#if OPI_SUPPORT
+  //----- OPI functions
+  virtual void opiBegin(GfxState *state, Dict *opiDict);
+  virtual void opiEnd(GfxState *state, Dict *opiDict);
+#endif
+
+  //----- Type 3 font operators
+  virtual void type3D0(GfxState *state, double wx, double wy);
+  virtual void type3D1(GfxState *state, double wx, double wy,
+                      double llx, double lly, double urx, double ury);
+
+  //----- form XObjects
+  virtual void drawForm(Ref ref);
+
+  //----- PostScript XObjects
+  virtual void psXObject(Stream *psStream, Stream *level1Stream);
+
+  //----- miscellaneous
+  void setOffset(double x, double y)
+    { tx0 = x; ty0 = y; }
+  void setScale(double x, double y)
+    { xScale0 = x; yScale0 = y; }
+  void setRotate(int rotateA)
+    { rotate0 = rotateA; }
+  void setClip(double llx, double lly, double urx, double ury)
+    { clipLLX0 = llx; clipLLY0 = lly; clipURX0 = urx; clipURY0 = ury; }
+  void setUnderlayCbk(void (*cbk)(PSOutputDev *psOut, void *data),
+                     void *data)
+    { underlayCbk = cbk; underlayCbkData = data; }
+  void setOverlayCbk(void (*cbk)(PSOutputDev *psOut, void *data),
+                    void *data)
+    { overlayCbk = cbk; overlayCbkData = data; }
+  void setDisplayText(GBool display) { displayText = display; }
+
+private:
+
+  void init(PSOutputFunc outputFuncA, void *outputStreamA,
+           PSFileType fileTypeA, char *pstitle, PDFDoc *doc,
+           int firstPage, int lastPage, PSOutMode modeA,
+           int imgLLXA, int imgLLYA, int imgURXA, int imgURYA,
+           GBool manualCtrlA, int paperWidthA, int paperHeightA,
+            GBool duplexA);
+  void setupResources(Dict *resDict);
+  void setupFonts(Dict *resDict);
+  void setupFont(GfxFont *font, Dict *parentResDict);
+  void setupEmbeddedType1Font(Ref *id, GooString *psName);
+  void setupExternalType1Font(GooString *fileName, GooString *psName);
+  void setupEmbeddedType1CFont(GfxFont *font, Ref *id, GooString *psName);
+  void setupEmbeddedOpenTypeT1CFont(GfxFont *font, Ref *id, GooString *psName);
+  void setupEmbeddedTrueTypeFont(GfxFont *font, Ref *id, GooString *psName);
+  void setupExternalTrueTypeFont(GfxFont *font, GooString *fileName,
+                                GooString *psName);
+  void setupEmbeddedCIDType0Font(GfxFont *font, Ref *id, GooString *psName);
+  void setupEmbeddedCIDTrueTypeFont(GfxFont *font, Ref *id, GooString *psName,
+                                   GBool needVerticalMetrics);
+  void setupExternalCIDTrueTypeFont(GfxFont *font,
+                                   GooString *fileName,
+                                   GooString *psName,
+                                   GBool needVerticalMetrics);
+  void setupEmbeddedOpenTypeCFFFont(GfxFont *font, Ref *id, GooString *psName);
+  void setupType3Font(GfxFont *font, GooString *psName, Dict *parentResDict);
+  GooString *makePSFontName(GfxFont *font, Ref *id);
+  void setupImages(Dict *resDict);
+  void setupImage(Ref id, Stream *str, GBool mask);
+  void setupForms(Dict *resDict);
+  void setupForm(Ref id, Object *strObj);
+  void addProcessColor(double c, double m, double y, double k);
+  void addCustomColor(GfxSeparationColorSpace *sepCS);
+  void doPath(GfxPath *path);
+  void maskToClippingPath(Stream *maskStr, int maskWidth, int maskHeight, GBool maskInvert);
+  void doImageL1(Object *ref, GfxImageColorMap *colorMap,
+                GBool invert, GBool inlineImg,
+                Stream *str, int width, int height, int len,
+                int *maskColors, Stream *maskStr,
+                int maskWidth, int maskHeight, GBool maskInvert);
+  void doImageL1Sep(Object *ref, GfxImageColorMap *colorMap,
+                   GBool invert, GBool inlineImg,
+                   Stream *str, int width, int height, int len,
+                   int *maskColors, Stream *maskStr,
+                   int maskWidth, int maskHeight, GBool maskInvert);
+  void doImageL2(Object *ref, GfxImageColorMap *colorMap,
+                GBool invert, GBool inlineImg,
+                Stream *str, int width, int height, int len,
+                int *maskColors, Stream *maskStr,
+                int maskWidth, int maskHeight, GBool maskInvert);
+  void doImageL3(Object *ref, GfxImageColorMap *colorMap,
+                GBool invert, GBool inlineImg,
+                Stream *str, int width, int height, int len,
+                int *maskColors, Stream *maskStr,
+                int maskWidth, int maskHeight, GBool maskInvert);
+  void dumpColorSpaceL2(GfxColorSpace *colorSpace,
+                       GBool genXform, GBool updateColors,
+                       GBool map01);
+  GBool tilingPatternFillL1(GfxState *state, Catalog *cat, Object *str,
+                           double *pmat, int paintType, int tilingType, Dict *resDict,
+                           double *mat, double *bbox,
+                           int x0, int y0, int x1, int y1,
+                           double xStep, double yStep);
+  GBool tilingPatternFillL2(GfxState *state, Catalog *cat, Object *str,
+                           double *pmat, int paintType, int tilingType, Dict *resDict,
+                           double *mat, double *bbox,
+                           int x0, int y0, int x1, int y1,
+                           double xStep, double yStep);
+
+#if OPI_SUPPORT
+  void opiBegin20(GfxState *state, Dict *dict);
+  void opiBegin13(GfxState *state, Dict *dict);
+  void opiTransform(GfxState *state, double x0, double y0,
+                   double *x1, double *y1);
+#endif
+  void cvtFunction(Function *func, GBool invertPSFunction = gFalse);
+  GooString *filterPSName(GooString *name);
+
+  // Write the document-level setup.
+  void writeDocSetup(PDFDoc *doc, Catalog *catalog, int firstPage, int lastPage, GBool duplexA);
+
+  void writePSChar(char c);
+  void writePS(const char *s);
+  void writePSBuf(const char *s, int len);
+  void writePSFmt(const char *fmt, ...);
+  void writePSString(GooString *s);
+  void writePSName(const char *s);
+  GooString *filterPSLabel(GooString *label, GBool *needParens=0);
+  void writePSTextLine(GooString *s);
+
+  PSLevel level;               // PostScript level (1, 2, separation)
+  PSOutMode mode;              // PostScript mode (PS, EPS, form)
+  int paperWidth;              // width of paper, in pts
+  int paperHeight;             // height of paper, in pts
+  GBool paperMatch;            // true if paper size is set to match each page
+  int prevWidth;               // width of previous page
+                                // (only psModePSOrigPageSizes output mode)
+  int prevHeight;              // height of previous page
+                                // (only psModePSOrigPageSizes output mode)
+  int imgLLX, imgLLY,          // imageable area, in pts
+      imgURX, imgURY;
+  GBool preload;               // load all images into memory, and
+                               //   predefine forms
+
+  PSOutputFunc outputFunc;
+  void *outputStream;
+  PSFileType fileType;         // file / pipe / stdout
+  GBool manualCtrl;
+  int seqPage;                 // current sequential page number
+  void (*underlayCbk)(PSOutputDev *psOut, void *data);
+  void *underlayCbkData;
+  void (*overlayCbk)(PSOutputDev *psOut, void *data);
+  void *overlayCbkData;
+  GooString *(*customCodeCbk)(PSOutputDev *psOut,
+                           PSOutCustomCodeLocation loc, int n, 
+                           void *data);
+  void *customCodeCbkData;
+
+  PDFDoc *doc;
+  XRef *xref;                  // the xref table for this PDF file
+
+  Ref *fontIDs;                        // list of object IDs of all used fonts
+  int fontIDLen;               // number of entries in fontIDs array
+  int fontIDSize;              // size of fontIDs array
+  GooHash *fontNames;          // all used font names
+  PST1FontName *t1FontNames;   // font names for Type 1/1C fonts
+  int t1FontNameLen;           // number of entries in t1FontNames array
+  int t1FontNameSize;          // size of t1FontNames array
+  PSFont8Info *font8Info;      // info for 8-bit fonts
+  int font8InfoLen;            // number of entries in font8Info array
+  int font8InfoSize;           // size of font8Info array
+  PSFont16Enc *font16Enc;      // encodings for substitute 16-bit fonts
+  int font16EncLen;            // number of entries in font16Enc array
+  int font16EncSize;           // size of font16Enc array
+  Ref *imgIDs;                 // list of image IDs for in-memory images
+  int imgIDLen;                        // number of entries in imgIDs array
+  int imgIDSize;               // size of imgIDs array
+  Ref *formIDs;                        // list of IDs for predefined forms
+  int formIDLen;               // number of entries in formIDs array
+  int formIDSize;              // size of formIDs array
+  GooList *xobjStack;          // stack of XObject dicts currently being
+                               //   processed
+  int numSaves;                        // current number of gsaves
+  int numTilingPatterns;       // current number of nested tiling patterns
+  int nextFunc;                        // next unique number to use for a function
+
+  GooList *paperSizes;         // list of used paper sizes, if paperMatch
+                               //   is true [PSOutPaperSize]
+  double tx0, ty0;             // global translation
+  double xScale0, yScale0;     // global scaling
+  int rotate0;                 // rotation angle (0, 90, 180, 270)
+  double clipLLX0, clipLLY0,
+         clipURX0, clipURY0;
+  double tx, ty;               // global translation for current page
+  double xScale, yScale;       // global scaling for current page
+  int rotate;                  // rotation angle for current page
+  double epsX1, epsY1,         // EPS bounding box (unrotated)
+         epsX2, epsY2;
+
+  GooString *embFontList;              // resource comments for embedded fonts
+
+  int processColors;           // used process colors
+  PSOutCustomColor             // used custom colors
+    *customColors;
+
+  GBool haveTextClip;          // set if text has been drawn with a
+                               //   clipping render mode
+
+  GBool inType3Char;           // inside a Type 3 CharProc
+  GBool inUncoloredPattern;     // inside a uncolored pattern (PaintType = 2)
+  GooString *t3String;         // Type 3 content string
+  double t3WX, t3WY,           // Type 3 character parameters
+         t3LLX, t3LLY, t3URX, t3URY;
+  GBool t3FillColorOnly;       // operators should only use the fill color
+  GBool t3Cacheable;           // cleared if char is not cacheable
+  GBool t3NeedsRestore;                // set if a 'q' operator was issued
+  GBool forceRasterize;                // forces the page to be rasterized into a image before printing
+  GBool displayText;           // displayText
+
+#if OPI_SUPPORT
+  int opi13Nest;               // nesting level of OPI 1.3 objects
+  int opi20Nest;               // nesting level of OPI 2.0 objects
+#endif
+
+  GBool ok;                    // set up ok?
+
+  friend class WinPDFPrinter;
+};
+
+#endif
diff --git a/poppler/PSTokenizer.cc b/poppler/PSTokenizer.cc
new file mode 100644 (file)
index 0000000..05127f0
--- /dev/null
@@ -0,0 +1,159 @@
+//========================================================================
+//
+// PSTokenizer.cc
+//
+// Copyright 2002-2003 Glyph & Cog, LLC
+//
+//========================================================================
+
+//========================================================================
+//
+// Modified under the Poppler project - http://poppler.freedesktop.org
+//
+// All changes made under the Poppler project to this file are licensed
+// under GPL version 2 or later
+//
+// Copyright (C) 2006 Scott Turner <scotty1024@mac.com>
+// Copyright (C) 2008 Albert Astals Cid <aacid@kde.org>
+//
+// To see a description of the changes please see the Changelog file that
+// came with your tarball or type make ChangeLog if you are building from git
+//
+//========================================================================
+
+#include <config.h>
+
+#ifdef USE_GCC_PRAGMAS
+#pragma implementation
+#endif
+
+#include <stdio.h>
+#include <stdlib.h>
+#include "PSTokenizer.h"
+
+//------------------------------------------------------------------------
+
+// A '1' in this array means the character is white space.  A '1' or
+// '2' means the character ends a name or command.
+static const char specialChars[256] = {
+  1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0,   // 0x
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,   // 1x
+  1, 0, 0, 0, 0, 2, 0, 0, 2, 2, 0, 0, 0, 0, 0, 2,   // 2x
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 2, 0,   // 3x
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,   // 4x
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 2, 0, 0,   // 5x
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,   // 6x
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 2, 0, 0,   // 7x
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,   // 8x
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,   // 9x
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,   // ax
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,   // bx
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,   // cx
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,   // dx
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,   // ex
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0    // fx
+};
+
+//------------------------------------------------------------------------
+
+PSTokenizer::PSTokenizer(int (*getCharFuncA)(void *), void *dataA) {
+  getCharFunc = getCharFuncA;
+  data = dataA;
+  charBuf = -1;
+}
+
+PSTokenizer::~PSTokenizer() {
+}
+
+GBool PSTokenizer::getToken(char *buf, int size, int *length) {
+  GBool comment, backslash;
+  int c;
+  int i;
+
+  // skip leading whitespace and comments
+  comment = gFalse;
+  while (1) {
+    if ((c = getChar()) == EOF) {
+      buf[0] = '\0';
+      *length = 0;
+      return gFalse;
+    }
+    if (comment) {
+      if (c == '\x0a' || c == '\x0d') {
+       comment = gFalse;
+      }
+    } else if (c == '%') {
+      comment = gTrue;
+    } else if (specialChars[c] != 1) {
+      break;
+    }
+  }
+
+  // Reserve room for terminating '\0'
+  size--;
+
+  // read a token
+  i = 0;
+  buf[i++] = c;
+  if (c == '(') {
+    backslash = gFalse;
+    while ((c = lookChar()) != EOF) {
+      consumeChar();
+      if (i < size) {
+       buf[i++] = c;
+      }
+      if (c == '\\') {
+       backslash = gTrue;
+      } else if (!backslash && c == ')') {
+       break;
+      } else {
+       backslash = gFalse;
+      }
+    }
+  } else if (c == '<') {
+    while ((c = lookChar()) != EOF) {
+      consumeChar();
+      if (i < size && specialChars[c] != 1) {
+       buf[i++] = c;
+      }
+      if (c == '>') {
+       break;
+      }
+    }
+  } else if (c != '[' && c != ']') {
+    while ((c = lookChar()) != EOF && !specialChars[c]) {
+      consumeChar();
+      if (i < size) {
+       buf[i++] = c;
+      }
+    }
+  }
+  // Zero terminate token string
+  buf[i] = '\0';
+  // Return length of token
+  *length = i;
+
+  return gTrue;
+}
+
+int PSTokenizer::lookChar() {
+  if (charBuf < 0) {
+    charBuf = (*getCharFunc)(data);
+  }
+  return charBuf;
+}
+
+void PSTokenizer::consumeChar() {
+  charBuf = -1;
+}
+
+int PSTokenizer::getChar() {
+  int c = charBuf;
+
+  if (c < 0) {
+    c = (*getCharFunc)(data);
+  } else {
+    charBuf = -1;
+  }
+  return c;
+}
diff --git a/poppler/PSTokenizer.h b/poppler/PSTokenizer.h
new file mode 100644 (file)
index 0000000..fc2f053
--- /dev/null
@@ -0,0 +1,54 @@
+//========================================================================
+//
+// PSTokenizer.h
+//
+// Copyright 2002-2003 Glyph & Cog, LLC
+//
+//========================================================================
+
+//========================================================================
+//
+// Modified under the Poppler project - http://poppler.freedesktop.org
+//
+// All changes made under the Poppler project to this file are licensed
+// under GPL version 2 or later
+//
+// Copyright (C) 2006 Scott Turner <scotty1024@mac.com>
+//
+// To see a description of the changes please see the Changelog file that
+// came with your tarball or type make ChangeLog if you are building from git
+//
+//========================================================================
+
+#ifndef PSTOKENIZER_H
+#define PSTOKENIZER_H
+
+#ifdef USE_GCC_PRAGMAS
+#pragma interface
+#endif
+
+#include "goo/gtypes.h"
+
+//------------------------------------------------------------------------
+
+class PSTokenizer {
+public:
+
+  PSTokenizer(int (*getCharFuncA)(void *), void *dataA);
+  ~PSTokenizer();
+
+  // Get the next PostScript token.  Returns false at end-of-stream.
+  GBool getToken(char *buf, int size, int *length);
+
+private:
+
+  int lookChar();
+  void consumeChar();
+  int getChar();
+
+  int (*getCharFunc)(void *);
+  void *data;
+  int charBuf;
+};
+
+#endif
diff --git a/poppler/Page.cc b/poppler/Page.cc
new file mode 100644 (file)
index 0000000..eccc198
--- /dev/null
@@ -0,0 +1,755 @@
+//========================================================================
+//
+// Page.cc
+//
+// Copyright 1996-2007 Glyph & Cog, LLC
+//
+//========================================================================
+
+//========================================================================
+//
+// Modified under the Poppler project - http://poppler.freedesktop.org
+//
+// All changes made under the Poppler project to this file are licensed
+// under GPL version 2 or later
+//
+// Copyright (C) 2005 Kristian Høgsberg <krh@redhat.com>
+// Copyright (C) 2005 Jeff Muizelaar <jeff@infidigm.net>
+// Copyright (C) 2005-2012 Albert Astals Cid <aacid@kde.org>
+// Copyright (C) 2006-2008 Pino Toscano <pino@kde.org>
+// Copyright (C) 2006 Nickolay V. Shmyrev <nshmyrev@yandex.ru>
+// Copyright (C) 2006 Scott Turner <scotty1024@mac.com>
+// Copyright (C) 2006-2011 Carlos Garcia Campos <carlosgc@gnome.org>
+// Copyright (C) 2007 Julien Rebetez <julienr@svn.gnome.org>
+// Copyright (C) 2008 Iñigo Martínez <inigomartinez@gmail.com>
+// Copyright (C) 2008 Brad Hards <bradh@kde.org>
+// Copyright (C) 2008 Ilya Gorenbein <igorenbein@finjan.com>
+// Copyright (C) 2012 Fabio D'Urso <fabiodurso@hotmail.it>
+//
+// To see a description of the changes please see the Changelog file that
+// came with your tarball or type make ChangeLog if you are building from git
+//
+//========================================================================
+
+#include <config.h>
+
+#ifdef USE_GCC_PRAGMAS
+#pragma implementation
+#endif
+
+#include <stddef.h>
+#include <limits.h>
+#include "GlobalParams.h"
+#include "Object.h"
+#include "Array.h"
+#include "Dict.h"
+#include "PDFDoc.h"
+#include "XRef.h"
+#include "Link.h"
+#include "OutputDev.h"
+#include "Gfx.h"
+#include "GfxState.h"
+#include "Annot.h"
+#include "TextOutputDev.h"
+#include "Form.h"
+#include "Error.h"
+#include "Page.h"
+#include "Catalog.h"
+#include "Form.h"
+
+//------------------------------------------------------------------------
+// PDFRectangle
+//------------------------------------------------------------------------
+
+void PDFRectangle::clipTo(PDFRectangle *rect) {
+  if (x1 < rect->x1) {
+    x1 = rect->x1;
+  } else if (x1 > rect->x2) {
+    x1 = rect->x2;
+  }
+  if (x2 < rect->x1) {
+    x2 = rect->x1;
+  } else if (x2 > rect->x2) {
+    x2 = rect->x2;
+  }
+  if (y1 < rect->y1) {
+    y1 = rect->y1;
+  } else if (y1 > rect->y2) {
+    y1 = rect->y2;
+  }
+  if (y2 < rect->y1) {
+    y2 = rect->y1;
+  } else if (y2 > rect->y2) {
+    y2 = rect->y2;
+  }
+}
+
+//------------------------------------------------------------------------
+// PageAttrs
+//------------------------------------------------------------------------
+
+PageAttrs::PageAttrs(PageAttrs *attrs, Dict *dict) {
+  Object obj1;
+  PDFRectangle mBox;
+  const GBool isPage = dict->is("Page");
+
+  // get old/default values
+  if (attrs) {
+    mediaBox = attrs->mediaBox;
+    cropBox = attrs->cropBox;
+    haveCropBox = attrs->haveCropBox;
+    rotate = attrs->rotate;
+    attrs->resources.copy(&resources);
+  } else {
+    // set default MediaBox to 8.5" x 11" -- this shouldn't be necessary
+    // but some (non-compliant) PDF files don't specify a MediaBox
+    mediaBox.x1 = 0;
+    mediaBox.y1 = 0;
+    mediaBox.x2 = 612;
+    mediaBox.y2 = 792;
+    cropBox.x1 = cropBox.y1 = cropBox.x2 = cropBox.y2 = 0;
+    haveCropBox = gFalse;
+    rotate = 0;
+    resources.initNull();
+  }
+
+  // media box
+  if (readBox(dict, "MediaBox", &mBox)) {
+    mediaBox = mBox;
+  }
+
+  // crop box
+  if (readBox(dict, "CropBox", &cropBox)) {
+    haveCropBox = gTrue;
+  }
+  if (!haveCropBox) {
+    cropBox = mediaBox;
+  }
+
+  if (isPage) {
+    // cropBox can not be bigger than mediaBox
+    if (cropBox.x2 - cropBox.x1 > mediaBox.x2 - mediaBox.x1)
+    {
+      cropBox.x1 = mediaBox.x1;
+      cropBox.x2 = mediaBox.x2;
+    }
+    if (cropBox.y2 - cropBox.y1 > mediaBox.y2 - mediaBox.y1)
+    {
+      cropBox.y1 = mediaBox.y1;
+      cropBox.y2 = mediaBox.y2;
+    }
+  }
+
+  // other boxes
+  bleedBox = cropBox;
+  readBox(dict, "BleedBox", &bleedBox);
+  trimBox = cropBox;
+  readBox(dict, "TrimBox", &trimBox);
+  artBox = cropBox;
+  readBox(dict, "ArtBox", &artBox);
+
+  // rotate
+  dict->lookup("Rotate", &obj1);
+  if (obj1.isInt()) {
+    rotate = obj1.getInt();
+  }
+  obj1.free();
+  while (rotate < 0) {
+    rotate += 360;
+  }
+  while (rotate >= 360) {
+    rotate -= 360;
+  }
+
+  // misc attributes
+  dict->lookup("LastModified", &lastModified);
+  dict->lookup("BoxColorInfo", &boxColorInfo);
+  dict->lookup("Group", &group);
+  dict->lookup("Metadata", &metadata);
+  dict->lookup("PieceInfo", &pieceInfo);
+  dict->lookup("SeparationInfo", &separationInfo);
+
+  // resource dictionary
+  dict->lookup("Resources", &obj1);
+  if (obj1.isDict()) {
+    resources.free();
+    obj1.copy(&resources);
+  }
+  obj1.free();
+}
+
+PageAttrs::~PageAttrs() {
+  lastModified.free();
+  boxColorInfo.free();
+  group.free();
+  metadata.free();
+  pieceInfo.free();
+  separationInfo.free();
+  resources.free();
+}
+
+void PageAttrs::clipBoxes() {
+  cropBox.clipTo(&mediaBox);
+  bleedBox.clipTo(&mediaBox);
+  trimBox.clipTo(&mediaBox);
+  artBox.clipTo(&mediaBox);
+}
+
+GBool PageAttrs::readBox(Dict *dict, const char *key, PDFRectangle *box) {
+  PDFRectangle tmp;
+  double t;
+  Object obj1, obj2;
+  GBool ok;
+
+  dict->lookup(key, &obj1);
+  if (obj1.isArray() && obj1.arrayGetLength() == 4) {
+    ok = gTrue;
+    obj1.arrayGet(0, &obj2);
+    if (obj2.isNum()) {
+      tmp.x1 = obj2.getNum();
+    } else {
+      ok = gFalse;
+    }
+    obj2.free();
+    obj1.arrayGet(1, &obj2);
+    if (obj2.isNum()) {
+      tmp.y1 = obj2.getNum();
+    } else {
+      ok = gFalse;
+    }
+    obj2.free();
+    obj1.arrayGet(2, &obj2);
+    if (obj2.isNum()) {
+      tmp.x2 = obj2.getNum();
+    } else {
+      ok = gFalse;
+    }
+    obj2.free();
+    obj1.arrayGet(3, &obj2);
+    if (obj2.isNum()) {
+      tmp.y2 = obj2.getNum();
+    } else {
+      ok = gFalse;
+    }
+    obj2.free();
+    if (tmp.x1 == 0 && tmp.x2 == 0 && tmp.y1 == 0 && tmp.y2 == 0)
+      ok = gFalse;
+    if (ok) {
+      if (tmp.x1 > tmp.x2) {
+       t = tmp.x1; tmp.x1 = tmp.x2; tmp.x2 = t;
+      }
+      if (tmp.y1 > tmp.y2) {
+       t = tmp.y1; tmp.y1 = tmp.y2; tmp.y2 = t;
+      }
+      *box = tmp;
+    }
+  } else {
+    ok = gFalse;
+  }
+  obj1.free();
+  return ok;
+}
+
+//------------------------------------------------------------------------
+// Page
+//------------------------------------------------------------------------
+
+Page::Page(PDFDoc *docA, int numA, Dict *pageDict, Ref pageRefA, PageAttrs *attrsA, Form *form) {
+  Object tmp;
+       
+  ok = gTrue;
+  doc = docA;
+  xref = doc->getXRef();
+  num = numA;
+  duration = -1;
+  annots = NULL;
+
+  pageObj.initDict(pageDict);
+  pageRef = pageRefA;
+
+  // get attributes
+  attrs = attrsA;
+  attrs->clipBoxes();
+
+  // transtion
+  pageDict->lookupNF("Trans", &trans);
+  if (!(trans.isRef() || trans.isDict() || trans.isNull())) {
+    error(errSyntaxError, -1, "Page transition object (page {0:d}) is wrong type ({1:s})",
+         num, trans.getTypeName());
+    trans.free();
+  }
+
+  // duration
+  pageDict->lookupNF("Dur", &tmp);
+  if (!(tmp.isNum() || tmp.isNull())) {
+    error(errSyntaxError, -1, "Page duration object (page {0:d}) is wrong type ({1:s})",
+         num, tmp.getTypeName());
+  } else if (tmp.isNum()) {
+    duration = tmp.getNum();
+  }
+  tmp.free();
+
+  // annotations
+  pageDict->lookupNF("Annots", &annotsObj);
+  if (!(annotsObj.isRef() || annotsObj.isArray() || annotsObj.isNull())) {
+    error(errSyntaxError, -1, "Page annotations object (page {0:d}) is wrong type ({1:s})",
+         num, annotsObj.getTypeName());
+    annotsObj.free();
+    goto err2;
+  }
+
+  // contents
+  pageDict->lookupNF("Contents", &contents);
+  if (!(contents.isRef() || contents.isArray() ||
+       contents.isNull())) {
+    error(errSyntaxError, -1, "Page contents object (page {0:d}) is wrong type ({1:s})",
+         num, contents.getTypeName());
+    contents.free();
+    goto err1;
+  }
+
+  // thumb
+  pageDict->lookupNF("Thumb", &thumb);
+  if (!(thumb.isStream() || thumb.isNull() || thumb.isRef())) {
+      error(errSyntaxError, -1, "Page thumb object (page {0:d}) is wrong type ({1:s})",
+            num, thumb.getTypeName());
+      thumb.initNull(); 
+  }
+
+  // actions
+  pageDict->lookupNF("AA", &actions);
+  if (!(actions.isDict() || actions.isNull())) {
+      error(errSyntaxError, -1, "Page additional action object (page {0:d}) is wrong type ({1:s})",
+            num, actions.getTypeName());
+      actions.initNull();
+  }
+  
+  return;
+
+  trans.initNull();
+ err2:
+  annotsObj.initNull();
+ err1:
+  contents.initNull();
+  ok = gFalse;
+}
+
+Page::~Page() {
+  delete attrs;
+  delete annots;
+  pageObj.free();
+  annotsObj.free();
+  contents.free();
+  trans.free();
+  thumb.free();
+  actions.free();
+}
+
+Annots *Page::getAnnots() {
+  if (!annots) {
+    Object obj;
+    annots = new Annots(doc, getAnnots(&obj));
+    obj.free();
+  }
+
+  return annots;
+}
+
+void Page::addAnnot(Annot *annot) {
+  Object obj1;
+  Object tmp;
+  Ref annotRef = annot->getRef ();
+
+  // Make sure we have annots before adding the new one
+  // even if it's an empty list so that we can safely
+  // call annots->appendAnnot(annot)
+  getAnnots();
+
+  if (annotsObj.isNull()) {
+    Ref annotsRef;
+    // page doesn't have annots array,
+    // we have to create it
+
+    obj1.initArray(xref);
+    obj1.arrayAdd(tmp.initRef (annotRef.num, annotRef.gen));
+    tmp.free();
+
+    annotsRef = xref->addIndirectObject (&obj1);
+    annotsObj.initRef(annotsRef.num, annotsRef.gen);
+    pageObj.dictSet ("Annots", &annotsObj);
+    xref->setModifiedObject (&pageObj, pageRef);
+  } else {
+    getAnnots(&obj1);
+    if (obj1.isArray()) {
+      obj1.arrayAdd (tmp.initRef (annotRef.num, annotRef.gen));
+      if (annotsObj.isRef())
+        xref->setModifiedObject (&obj1, annotsObj.getRef());
+      else
+        xref->setModifiedObject (&pageObj, pageRef);
+    }
+    obj1.free();
+  }
+
+  annots->appendAnnot(annot);
+
+  annot->setPage(&pageRef, num);
+}
+
+void Page::removeAnnot(Annot *annot) {
+  Ref annotRef = annot->getRef();
+  Object annArray;
+
+  getAnnots(&annArray);
+  if (annArray.isArray()) {
+    int idx = -1;
+    // Get annotation position
+    for (int i = 0; idx == -1 && i < annArray.arrayGetLength(); ++i) {
+      Object tmp;
+      Ref currAnnot = annArray.arrayGetNF(i, &tmp)->getRef();
+      tmp.free();
+      if (currAnnot.num == annotRef.num && currAnnot.gen == annotRef.gen) {
+        idx = i;
+      }
+    }
+
+    if (idx == -1) {
+      error(errInternal, -1, "Annotation doesn't belong to this page");
+      annArray.free();
+      return;
+    }
+    annots->removeAnnot(annot); // Gracefully fails on popup windows
+    annArray.arrayRemove(idx);
+    xref->removeIndirectObject(annotRef);
+
+    if (annotsObj.isRef()) {
+      xref->setModifiedObject (&annArray, annotsObj.getRef());
+    } else {
+      xref->setModifiedObject (&pageObj, pageRef);
+    }
+  }
+  annArray.free();
+}
+
+Links *Page::getLinks() {
+  return new Links(getAnnots());
+}
+
+FormPageWidgets *Page::getFormWidgets() {
+  return new FormPageWidgets(getAnnots(), num, doc->getCatalog()->getForm());
+}
+
+void Page::display(OutputDev *out, double hDPI, double vDPI,
+                  int rotate, GBool useMediaBox, GBool crop,
+                  GBool printing,
+                  GBool (*abortCheckCbk)(void *data),
+                  void *abortCheckCbkData,
+                   GBool (*annotDisplayDecideCbk)(Annot *annot, void *user_data),
+                   void *annotDisplayDecideCbkData) {
+  displaySlice(out, hDPI, vDPI, rotate, useMediaBox, crop, -1, -1, -1, -1, printing,
+              abortCheckCbk, abortCheckCbkData,
+               annotDisplayDecideCbk, annotDisplayDecideCbkData);
+}
+
+Gfx *Page::createGfx(OutputDev *out, double hDPI, double vDPI,
+                    int rotate, GBool useMediaBox, GBool crop,
+                    int sliceX, int sliceY, int sliceW, int sliceH,
+                    GBool printing,
+                    GBool (*abortCheckCbk)(void *data),
+                    void *abortCheckCbkData) {
+  PDFRectangle *mediaBox, *cropBox;
+  PDFRectangle box;
+  Gfx *gfx;
+
+  rotate += getRotate();
+  if (rotate >= 360) {
+    rotate -= 360;
+  } else if (rotate < 0) {
+    rotate += 360;
+  }
+
+  makeBox(hDPI, vDPI, rotate, useMediaBox, out->upsideDown(),
+         sliceX, sliceY, sliceW, sliceH, &box, &crop);
+  cropBox = getCropBox();
+  mediaBox = getMediaBox();
+
+  if (globalParams->getPrintCommands()) {
+    printf("***** MediaBox = ll:%g,%g ur:%g,%g\n",
+           mediaBox->x1, mediaBox->y1, mediaBox->x2, mediaBox->y2);
+      printf("***** CropBox = ll:%g,%g ur:%g,%g\n",
+            cropBox->x1, cropBox->y1, cropBox->x2, cropBox->y2);
+    printf("***** Rotate = %d\n", attrs->getRotate());
+  }
+
+  gfx = new Gfx(doc, out, num, attrs->getResourceDict(),
+               hDPI, vDPI, &box, crop ? cropBox : (PDFRectangle *)NULL,
+               rotate, abortCheckCbk, abortCheckCbkData);
+
+  return gfx;
+}
+
+void Page::displaySlice(OutputDev *out, double hDPI, double vDPI,
+                       int rotate, GBool useMediaBox, GBool crop,
+                       int sliceX, int sliceY, int sliceW, int sliceH,
+                       GBool printing,
+                       GBool (*abortCheckCbk)(void *data),
+                       void *abortCheckCbkData,
+                        GBool (*annotDisplayDecideCbk)(Annot *annot, void *user_data),
+                        void *annotDisplayDecideCbkData) {
+  Gfx *gfx;
+  Object obj;
+  Annots *annotList;
+  int i;
+  
+  if (!out->checkPageSlice(this, hDPI, vDPI, rotate, useMediaBox, crop,
+                          sliceX, sliceY, sliceW, sliceH,
+                          printing,
+                          abortCheckCbk, abortCheckCbkData,
+                          annotDisplayDecideCbk, annotDisplayDecideCbkData)) {
+    return;
+  }
+
+  gfx = createGfx(out, hDPI, vDPI, rotate, useMediaBox, crop,
+                 sliceX, sliceY, sliceW, sliceH,
+                 printing,
+                 abortCheckCbk, abortCheckCbkData);
+
+  contents.fetch(xref, &obj);
+  if (!obj.isNull()) {
+    gfx->saveState();
+    gfx->display(&obj);
+    gfx->restoreState();
+  } else {
+    // empty pages need to call dump to do any setup required by the
+    // OutputDev
+    out->dump();
+  }
+  obj.free();
+
+  // draw annotations
+  annotList = getAnnots();
+
+  if (annotList->getNumAnnots() > 0) {
+    if (globalParams->getPrintCommands()) {
+      printf("***** Annotations\n");
+    }
+    for (i = 0; i < annotList->getNumAnnots(); ++i) {
+        Annot *annot = annotList->getAnnot(i);
+        if ((annotDisplayDecideCbk &&
+             (*annotDisplayDecideCbk)(annot, annotDisplayDecideCbkData)) || 
+            !annotDisplayDecideCbk) {
+             annotList->getAnnot(i)->draw(gfx, printing);
+       }
+    }
+    out->dump();
+  }
+
+  delete gfx;
+}
+
+void Page::display(Gfx *gfx) {
+  Object obj;
+
+  contents.fetch(xref, &obj);
+  if (!obj.isNull()) {
+    gfx->saveState();
+    gfx->display(&obj);
+    gfx->restoreState();
+  }
+  obj.free();
+}
+
+GBool Page::loadThumb(unsigned char **data_out,
+                     int *width_out, int *height_out,
+                     int *rowstride_out)
+{
+  unsigned int pixbufdatasize;
+  int width, height, bits;
+  Object obj1, fetched_thumb;
+  Dict *dict;
+  GfxColorSpace *colorSpace;
+  GBool success = gFalse;
+  Stream *str;
+  GfxImageColorMap *colorMap;
+
+  /* Get stream dict */
+  thumb.fetch(xref, &fetched_thumb);
+  if (!fetched_thumb.isStream()) {
+    fetched_thumb.free();
+    return gFalse;
+  }
+
+  dict = fetched_thumb.streamGetDict();
+  str = fetched_thumb.getStream(); 
+               
+  if (!dict->lookupInt("Width", "W", &width))
+    goto fail1;
+  if (!dict->lookupInt("Height", "H", &height))
+    goto fail1;
+  if (!dict->lookupInt("BitsPerComponent", "BPC", &bits))
+    goto fail1;
+               
+  /* Check for invalid dimensions and integer overflow. */
+  if (width <= 0 || height <= 0)
+    goto fail1;
+  if (width > INT_MAX / 3 / height)
+    goto fail1;
+  pixbufdatasize = width * height * 3;
+
+  /* Get color space */
+  dict->lookup ("ColorSpace", &obj1);
+  if (obj1.isNull ()) {
+    obj1.free ();
+    dict->lookup ("CS", &obj1);
+  }
+  colorSpace = GfxColorSpace::parse(&obj1, NULL);
+  obj1.free();
+  if (!colorSpace) {
+    fprintf (stderr, "Error: Cannot parse color space\n");
+    goto fail1;
+  }
+
+  dict->lookup("Decode", &obj1);
+  if (obj1.isNull()) {
+    obj1.free();
+    dict->lookup("D", &obj1);
+  }
+  colorMap = new GfxImageColorMap(bits, &obj1, colorSpace);
+  obj1.free();
+  if (!colorMap->isOk()) {
+    fprintf (stderr, "Error: invalid colormap\n");
+    delete colorMap;
+    goto fail1;
+  }
+
+  if (data_out) {
+    unsigned char *pixbufdata = (unsigned char *) gmalloc(pixbufdatasize);
+    unsigned char *p = pixbufdata;
+    ImageStream *imgstr = new ImageStream(str, width,
+                          colorMap->getNumPixelComps(),
+                          colorMap->getBits());
+    imgstr->reset();
+    for (int row = 0; row < height; ++row) {
+      for (int col = 0; col < width; ++col) {
+        Guchar pix[gfxColorMaxComps];
+        GfxRGB rgb;
+
+        imgstr->getPixel(pix);
+        colorMap->getRGB(pix, &rgb);
+
+        *p++ = colToByte(rgb.r);
+        *p++ = colToByte(rgb.g);
+        *p++ = colToByte(rgb.b);
+      }
+    }
+    *data_out = pixbufdata;
+    imgstr->close();
+    delete imgstr;
+  }
+
+  success = gTrue;
+
+  if (width_out)
+    *width_out = width;
+  if (height_out)
+    *height_out = height;
+  if (rowstride_out)
+    *rowstride_out = width * 3;
+
+  delete colorMap;
+ fail1:
+  fetched_thumb.free();
+
+  return success;
+}
+
+void Page::makeBox(double hDPI, double vDPI, int rotate,
+                  GBool useMediaBox, GBool upsideDown,
+                  double sliceX, double sliceY, double sliceW, double sliceH,
+                  PDFRectangle *box, GBool *crop) {
+  PDFRectangle *mediaBox, *cropBox, *baseBox;
+  double kx, ky;
+
+  mediaBox = getMediaBox();
+  cropBox = getCropBox();
+  if (sliceW >= 0 && sliceH >= 0) {
+    baseBox = useMediaBox ? mediaBox : cropBox;
+    kx = 72.0 / hDPI;
+    ky = 72.0 / vDPI;
+    if (rotate == 90) {
+      if (upsideDown) {
+       box->x1 = baseBox->x1 + ky * sliceY;
+       box->x2 = baseBox->x1 + ky * (sliceY + sliceH);
+      } else {
+       box->x1 = baseBox->x2 - ky * (sliceY + sliceH);
+       box->x2 = baseBox->x2 - ky * sliceY;
+      }
+      box->y1 = baseBox->y1 + kx * sliceX;
+      box->y2 = baseBox->y1 + kx * (sliceX + sliceW);
+    } else if (rotate == 180) {
+      box->x1 = baseBox->x2 - kx * (sliceX + sliceW);
+      box->x2 = baseBox->x2 - kx * sliceX;
+      if (upsideDown) {
+       box->y1 = baseBox->y1 + ky * sliceY;
+       box->y2 = baseBox->y1 + ky * (sliceY + sliceH);
+      } else {
+       box->y1 = baseBox->y2 - ky * (sliceY + sliceH);
+       box->y2 = baseBox->y2 - ky * sliceY;
+      }
+    } else if (rotate == 270) {
+      if (upsideDown) {
+       box->x1 = baseBox->x2 - ky * (sliceY + sliceH);
+       box->x2 = baseBox->x2 - ky * sliceY;
+      } else {
+       box->x1 = baseBox->x1 + ky * sliceY;
+       box->x2 = baseBox->x1 + ky * (sliceY + sliceH);
+      }
+      box->y1 = baseBox->y2 - kx * (sliceX + sliceW);
+      box->y2 = baseBox->y2 - kx * sliceX;
+    } else {
+      box->x1 = baseBox->x1 + kx * sliceX;
+      box->x2 = baseBox->x1 + kx * (sliceX + sliceW);
+      if (upsideDown) {
+       box->y1 = baseBox->y2 - ky * (sliceY + sliceH);
+       box->y2 = baseBox->y2 - ky * sliceY;
+      } else {
+       box->y1 = baseBox->y1 + ky * sliceY;
+       box->y2 = baseBox->y1 + ky * (sliceY + sliceH);
+      }
+    }
+  } else if (useMediaBox) {
+    *box = *mediaBox;
+  } else {
+    *box = *cropBox;
+    *crop = gFalse;
+  }
+}
+
+void Page::processLinks(OutputDev *out) {
+  Links *links;
+  int i;
+
+  links = getLinks();
+  for (i = 0; i < links->getNumLinks(); ++i) {
+    out->processLink(links->getLink(i));
+  }
+  delete links;
+}
+
+void Page::getDefaultCTM(double *ctm, double hDPI, double vDPI,
+                        int rotate, GBool useMediaBox, GBool upsideDown) {
+  GfxState *state;
+  int i;
+  rotate += getRotate();
+  if (rotate >= 360) {
+    rotate -= 360;
+  } else if (rotate < 0) {
+    rotate += 360;
+  }
+  state = new GfxState(hDPI, vDPI,
+                      useMediaBox ? getMediaBox() : getCropBox(),
+                      rotate, upsideDown);
+  for (i = 0; i < 6; ++i) {
+    ctm[i] = state->getCTM()[i];
+  }
+ delete state;
+}
diff --git a/poppler/Page.h b/poppler/Page.h
new file mode 100644 (file)
index 0000000..e2e666c
--- /dev/null
@@ -0,0 +1,263 @@
+//========================================================================
+//
+// Page.h
+//
+// Copyright 1996-2003 Glyph & Cog, LLC
+//
+//========================================================================
+
+//========================================================================
+//
+// Modified under the Poppler project - http://poppler.freedesktop.org
+//
+// All changes made under the Poppler project to this file are licensed
+// under GPL version 2 or later
+//
+// Copyright (C) 2005 Kristian Høgsberg <krh@redhat.com>
+// Copyright (C) 2005 Jeff Muizelaar <jeff@infidigm.net>
+// Copyright (C) 2006 Pino Toscano <pino@kde.org>
+// Copyright (C) 2006, 2011 Carlos Garcia Campos <carlosgc@gnome.org>
+// Copyright (C) 2007 Julien Rebetez <julienr@svn.gnome.org>
+// Copyright (C) 2008 Iñigo Martínez <inigomartinez@gmail.com>
+// Copyright (C) 2012 Fabio D'Urso <fabiodurso@hotmail.it>
+// Copyright (C) 2012 Albert Astals Cid <aacid@kde.org>
+//
+// To see a description of the changes please see the Changelog file that
+// came with your tarball or type make ChangeLog if you are building from git
+//
+//========================================================================
+
+#ifndef PAGE_H
+#define PAGE_H
+
+#ifdef USE_GCC_PRAGMAS
+#pragma interface
+#endif
+
+#include "Object.h"
+
+class Dict;
+class PDFDoc;
+class XRef;
+class OutputDev;
+class Links;
+class Annots;
+class Annot;
+class Gfx;
+class FormPageWidgets;
+class Form;
+
+//------------------------------------------------------------------------
+
+class PDFRectangle {
+public:
+  double x1, y1, x2, y2;
+
+  PDFRectangle() { x1 = y1 = x2 = y2 = 0; }
+  PDFRectangle(double x1A, double y1A, double x2A, double y2A)
+    { x1 = x1A; y1 = y1A; x2 = x2A; y2 = y2A; }
+  GBool isValid() { return x1 != 0 || y1 != 0 || x2 != 0 || y2 != 0; }
+  GBool contains(double x, double y) { return x1 <= x && x <= x2 && y1 <= y && y <= y2; }
+  void clipTo(PDFRectangle *rect);
+};
+
+//------------------------------------------------------------------------
+// PageAttrs
+//------------------------------------------------------------------------
+
+class PageAttrs {
+public:
+
+  // Construct a new PageAttrs object by merging a dictionary
+  // (of type Pages or Page) into another PageAttrs object.  If
+  // <attrs> is NULL, uses defaults.
+  PageAttrs(PageAttrs *attrs, Dict *dict);
+
+  // Destructor.
+  ~PageAttrs();
+
+  // Accessors.
+  PDFRectangle *getMediaBox() { return &mediaBox; }
+  PDFRectangle *getCropBox() { return &cropBox; }
+  GBool isCropped() { return haveCropBox; }
+  PDFRectangle *getBleedBox() { return &bleedBox; }
+  PDFRectangle *getTrimBox() { return &trimBox; }
+  PDFRectangle *getArtBox() { return &artBox; }
+  int getRotate() { return rotate; }
+  GooString *getLastModified()
+    { return lastModified.isString()
+       ? lastModified.getString() : (GooString *)NULL; }
+  Dict *getBoxColorInfo()
+    { return boxColorInfo.isDict() ? boxColorInfo.getDict() : (Dict *)NULL; }
+  Dict *getGroup()
+    { return group.isDict() ? group.getDict() : (Dict *)NULL; }
+  Stream *getMetadata()
+    { return metadata.isStream() ? metadata.getStream() : (Stream *)NULL; }
+  Dict *getPieceInfo()
+    { return pieceInfo.isDict() ? pieceInfo.getDict() : (Dict *)NULL; }
+  Dict *getSeparationInfo()
+    { return separationInfo.isDict()
+       ? separationInfo.getDict() : (Dict *)NULL; }
+  Dict *getResourceDict()
+    { return resources.isDict() ? resources.getDict() : (Dict *)NULL; }
+
+  // Clip all other boxes to the MediaBox.
+  void clipBoxes();
+
+private:
+
+  GBool readBox(Dict *dict, const char *key, PDFRectangle *box);
+
+  PDFRectangle mediaBox;
+  PDFRectangle cropBox;
+  GBool haveCropBox;
+  PDFRectangle bleedBox;
+  PDFRectangle trimBox;
+  PDFRectangle artBox;
+  int rotate;
+  Object lastModified;
+  Object boxColorInfo;
+  Object group;
+  Object metadata;
+  Object pieceInfo;
+  Object separationInfo;
+  Object resources;
+};
+
+//------------------------------------------------------------------------
+// Page
+//------------------------------------------------------------------------
+
+class Page {
+public:
+
+  // Constructor.
+  Page(PDFDoc *docA, int numA, Dict *pageDict, Ref pageRefA, PageAttrs *attrsA, Form *form);
+
+  // Destructor.
+  ~Page();
+
+  // Is page valid?
+  GBool isOk() { return ok; }
+
+  // Get page parameters.
+  int getNum() { return num; }
+  PDFRectangle *getMediaBox() { return attrs->getMediaBox(); }
+  PDFRectangle *getCropBox() { return attrs->getCropBox(); }
+  GBool isCropped() { return attrs->isCropped(); }
+  double getMediaWidth() 
+    { return attrs->getMediaBox()->x2 - attrs->getMediaBox()->x1; }
+  double getMediaHeight()
+    { return attrs->getMediaBox()->y2 - attrs->getMediaBox()->y1; }
+  double getCropWidth() 
+    { return attrs->getCropBox()->x2 - attrs->getCropBox()->x1; }
+  double getCropHeight()
+    { return attrs->getCropBox()->y2 - attrs->getCropBox()->y1; }
+  PDFRectangle *getBleedBox() { return attrs->getBleedBox(); }
+  PDFRectangle *getTrimBox() { return attrs->getTrimBox(); }
+  PDFRectangle *getArtBox() { return attrs->getArtBox(); }
+  int getRotate() { return attrs->getRotate(); }
+  GooString *getLastModified() { return attrs->getLastModified(); }
+  Dict *getBoxColorInfo() { return attrs->getBoxColorInfo(); }
+  Dict *getGroup() { return attrs->getGroup(); }
+  Stream *getMetadata() { return attrs->getMetadata(); }
+  Dict *getPieceInfo() { return attrs->getPieceInfo(); }
+  Dict *getSeparationInfo() { return attrs->getSeparationInfo(); }
+  PDFDoc *getDoc() { return doc; }
+
+  // Get resource dictionary.
+  Dict *getResourceDict() { return attrs->getResourceDict(); }
+
+  // Get annotations array.
+  Object *getAnnots(Object *obj) { return annotsObj.fetch(xref, obj); }
+  // Add a new annotation to the page
+  void addAnnot(Annot *annot);
+  // Remove an existing annotation from the page
+  // Note: Caller is responsible for deleting popup and appearance streams too
+  void removeAnnot(Annot *annot);
+
+  // Return a list of links.
+  Links *getLinks();
+
+  // Return a list of annots. It will be valid until the page is destroyed
+  Annots *getAnnots();
+
+  // Get contents.
+  Object *getContents(Object *obj) { return contents.fetch(xref, obj); }
+
+  // Get thumb.
+  Object *getThumb(Object *obj) { return thumb.fetch(xref, obj); }
+  GBool loadThumb(unsigned char **data, int *width, int *height, int *rowstride);
+
+  // Get transition.
+  Object *getTrans(Object *obj) { return trans.fetch(xref, obj); }
+
+  // Get form.
+  FormPageWidgets *getFormWidgets();
+
+  // Get duration, the maximum length of time, in seconds,
+  // that the page is displayed before the presentation automatically
+  // advances to the next page
+  double getDuration() { return duration; }
+
+  // Get actions
+  Object *getActions(Object *obj) { return actions.fetch(xref, obj); }
+
+  Gfx *createGfx(OutputDev *out, double hDPI, double vDPI,
+                int rotate, GBool useMediaBox, GBool crop,
+                int sliceX, int sliceY, int sliceW, int sliceH,
+                GBool printing,
+                GBool (*abortCheckCbk)(void *data),
+                void *abortCheckCbkData);
+
+  // Display a page.
+  void display(OutputDev *out, double hDPI, double vDPI,
+              int rotate, GBool useMediaBox, GBool crop,
+              GBool printing,
+              GBool (*abortCheckCbk)(void *data) = NULL,
+              void *abortCheckCbkData = NULL,
+               GBool (*annotDisplayDecideCbk)(Annot *annot, void *user_data) = NULL,
+               void *annotDisplayDecideCbkData = NULL);
+
+  // Display part of a page.
+  void displaySlice(OutputDev *out, double hDPI, double vDPI,
+                   int rotate, GBool useMediaBox, GBool crop,
+                   int sliceX, int sliceY, int sliceW, int sliceH,
+                   GBool printing,
+                   GBool (*abortCheckCbk)(void *data) = NULL,
+                   void *abortCheckCbkData = NULL,
+                    GBool (*annotDisplayDecideCbk)(Annot *annot, void *user_data) = NULL,
+                    void *annotDisplayDecideCbkData = NULL);
+
+  void display(Gfx *gfx);
+
+  void makeBox(double hDPI, double vDPI, int rotate,
+              GBool useMediaBox, GBool upsideDown,
+              double sliceX, double sliceY, double sliceW, double sliceH,
+              PDFRectangle *box, GBool *crop);
+
+  void processLinks(OutputDev *out);
+
+  // Get the page's default CTM.
+  void getDefaultCTM(double *ctm, double hDPI, double vDPI,
+                    int rotate, GBool useMediaBox, GBool upsideDown);
+
+private:
+
+  PDFDoc *doc;
+  XRef *xref;                  // the xref table for this PDF file
+  Object pageObj;               // page dictionary
+  Ref pageRef;                  // page reference
+  int num;                     // page number
+  PageAttrs *attrs;            // page attributes
+  Annots *annots;               // annotations
+  Object annotsObj;            // annotations array
+  Object contents;             // page contents
+  Object thumb;                        // page thumbnail
+  Object trans;                        // page transition
+  Object actions;              // page addiction actions
+  double duration;              // page duration
+  GBool ok;                    // true if page is valid
+};
+
+#endif
diff --git a/poppler/PageLabelInfo.cc b/poppler/PageLabelInfo.cc
new file mode 100644 (file)
index 0000000..a099d11
--- /dev/null
@@ -0,0 +1,388 @@
+//========================================================================
+//
+// This file is under the GPLv2 or later license
+//
+// Copyright (C) 2005-2006 Kristian Høgsberg <krh@redhat.com>
+// Copyright (C) 2005, 2009 Albert Astals Cid <aacid@kde.org>
+// Copyright (C) 2011 Simon Kellner <kellner@kit.edu>
+// Copyright (C) 2012 Fabio D'Urso <fabiodurso@hotmail.it>
+//
+// To see a description of the changes please see the Changelog file that
+// came with your tarball or type make ChangeLog if you are building from git
+//
+//========================================================================
+
+#include <config.h>
+#include <limits.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <assert.h>
+
+#include "PageLabelInfo.h"
+
+/* http://mathworld.wolfram.com/RomanNumerals.html */
+
+static int fromRoman(const char *buffer) {
+  int digit_value, prev_digit_value, value;
+  int i;
+
+  prev_digit_value = INT_MAX;
+  value = 0;
+  for (i = 0; buffer[i] != '\0'; i++) {
+    switch (buffer[i]) {
+    case 'm':
+    case 'M':
+      digit_value = 1000;
+      break;
+    case 'd':
+    case 'D':
+      digit_value = 500;
+      break;
+    case 'c':
+    case 'C':
+      digit_value = 100;
+      break;
+    case 'l':
+    case 'L':
+      digit_value = 50;
+      break;
+    case 'x':
+    case 'X':
+      digit_value = 10;
+      break;
+    case 'v':
+    case 'V':
+      digit_value = 5;
+      break;
+    case 'i':
+    case 'I':
+      digit_value = 1;
+      break;
+    default:
+      return -1;
+    }
+
+    if (digit_value <= prev_digit_value)
+      value += digit_value;
+    else
+      value += digit_value - prev_digit_value * 2;
+    prev_digit_value = digit_value;
+  }
+
+  return value;
+}
+
+static void toRoman(int number, GooString *str, GBool uppercase) {
+  static const char uppercaseNumerals[] = "IVXLCDM";
+  static const char lowercaseNumerals[] = "ivxlcdm";
+  int divisor;
+  int i, j, k;
+  const char *wh;
+
+  if (uppercase)
+    wh = uppercaseNumerals;
+  else
+    wh = lowercaseNumerals;
+
+  divisor = 1000;
+  for (k = 3; k >= 0; k--) {
+    i = number / divisor;
+    number = number % divisor;
+
+    switch (i) {
+    case 0:
+      break;
+    case 5:
+      str->append(wh[2 * k + 1]);
+      break;
+    case 9:
+      str->append(wh[2 * k + 0]);
+      str->append(wh[ 2 * k + 2]);
+      break;
+    case 4:
+      str->append(wh[2 * k + 0]);
+      str->append(wh[2 * k + 1]);
+      break;
+    default:
+      if (i > 5) {
+       str->append(wh[2 * k + 1]);
+       i -= 5;
+      }
+      for (j = 0; j < i; j++) {
+       str->append(wh[2 * k + 0]);
+      }
+    }
+       
+    divisor = divisor / 10;
+  }
+}
+
+static int fromLatin(const char *buffer)
+{
+  int count;
+  const char *p;
+
+  for (p = buffer; *p; p++) {
+    if (*p != buffer[0])
+      return -1;
+  }
+
+  count = p - buffer;
+  if (buffer[0] >= 'a' && buffer[0] <= 'z')
+    return 26 * (count - 1) + buffer[0] - 'a' + 1;
+  if (buffer[0] >= 'A' && buffer[0] <= 'Z')
+    return 26 * (count - 1) + buffer[0] - 'A' + 1;
+
+  return -1;
+}
+
+#ifdef TEST
+static void toLatin(int number, GooString *str, GBool uppercase) {
+  char base, letter;
+  int i, count;
+
+  if (uppercase)
+    base = 'A';
+  else
+    base = 'a';
+
+  count = (number - 1) / 26 + 1;
+  letter = base + (number - 1) % 26;
+
+  for (i = 0; i < count; i++)
+    str->append(letter);
+}
+#endif
+
+PageLabelInfo::Interval::Interval(Object *dict, int baseA) {
+  Object obj;
+
+  style = None;
+  if (dict->dictLookup("S", &obj)->isName()) {
+    if (obj.isName("D")) {
+      style = Arabic;
+    } else if (obj.isName("R")) {
+      style = UppercaseRoman;
+    } else if (obj.isName("r")) {
+      style = LowercaseRoman;
+    } else if (obj.isName("A")) {
+      style = UppercaseLatin;
+    } else if (obj.isName("a")) {
+      style = LowercaseLatin;
+    }
+  }
+  obj.free();
+
+  if (dict->dictLookup("P", &obj)->isString())
+    prefix = obj.getString()->copy();
+  else
+    prefix = new GooString("");
+  obj.free();
+
+  if (dict->dictLookup("St", &obj)->isInt())
+    first = obj.getInt();
+  else
+    first = 1;
+  obj.free();
+
+  base = baseA;
+}
+
+PageLabelInfo::Interval::~Interval() {
+  delete prefix;
+}
+
+PageLabelInfo::PageLabelInfo(Object *tree, int numPages) {
+  int i;
+  Interval *interval, *next;
+
+  parse(tree);
+
+  for (i = 0; i < intervals.getLength(); i++) {
+    interval = (Interval *) intervals.get(i);
+
+    if (i + 1 < intervals.getLength()) {
+      next = (Interval *) intervals.get(i + 1);
+      interval->length = next->base - interval->base;
+    } else {
+      interval->length = numPages - interval->base;
+    }
+    if (interval->length < 0) interval->length = 0;
+  }
+}
+
+PageLabelInfo::~PageLabelInfo() {
+  int i;
+  for (i = 0; i < intervals.getLength(); ++i) {
+    delete (Interval*)intervals.get(i);
+  }
+}
+
+void PageLabelInfo::parse(Object *tree) {
+  Object nums, obj;
+  Object kids, kid, limits, low, high;
+  int i, base;
+  Interval *interval;
+
+  // leaf node
+  if (tree->dictLookup("Nums", &nums)->isArray()) {
+    for (i = 0; i < nums.arrayGetLength(); i += 2) {
+      if (!nums.arrayGet(i, &obj)->isInt()) {
+       obj.free();
+       continue;
+      }
+      base = obj.getInt();
+      obj.free();
+      if (!nums.arrayGet(i + 1, &obj)->isDict()) {
+       obj.free();
+       continue;
+      }
+
+      interval = new Interval(&obj, base);
+      obj.free();
+      intervals.append(interval);
+    }
+  }
+  nums.free();
+
+  if (tree->dictLookup("Kids", &kids)->isArray()) {
+    for (i = 0; i < kids.arrayGetLength(); ++i) {
+      if (kids.arrayGet(i, &kid)->isDict())
+       parse(&kid);
+      kid.free();
+    }
+  }
+  kids.free();
+}
+
+GBool PageLabelInfo::labelToIndex(GooString *label, int *index)
+{
+  Interval *interval;
+  char *str = label->getCString(), *end;
+  int prefixLength;
+  int i, number;
+
+  for (i = 0; i < intervals.getLength(); i++) {
+    interval = (Interval *) intervals.get(i);
+    const int base = interval->base;
+    prefixLength = interval->prefix->getLength();
+    if (label->cmpN(interval->prefix, prefixLength) != 0)
+      continue;
+
+    switch (interval->style) {
+    case Interval::Arabic:
+      number = strtol(str + prefixLength, &end, 10);
+      if (*end == '\0' && number - interval->first < interval->length) {
+       *index = base + number - interval->first;
+       return gTrue;
+      }
+      break;
+    case Interval::LowercaseRoman:
+    case Interval::UppercaseRoman:
+      number = fromRoman(str + prefixLength);
+      if (number >= 0 && number - interval->first < interval->length) {
+       *index = base + number - interval->first;
+       return gTrue;
+      }
+      break;
+    case Interval::UppercaseLatin:
+    case Interval::LowercaseLatin:
+      number = fromLatin(str + prefixLength);
+      if (number >= 0 && number - interval->first < interval->length) {
+       *index = base + number - interval->first;
+       return gTrue;
+      }
+      break;
+    case Interval::None:
+      break;
+    }
+  }
+
+  return gFalse;
+}
+
+GBool PageLabelInfo::indexToLabel(int index, GooString *label)
+{
+  char buffer[32];
+  int i, base, number;
+  Interval *interval;
+  GooString number_string;
+
+  base = 0;
+  interval = NULL;
+  for (i = 0; i < intervals.getLength(); i++) {
+    interval = (Interval *) intervals.get(i);
+    if (base <= index && index < base + interval->length)
+      break;
+    base += interval->length;
+  }
+
+  if (i == intervals.getLength())
+    return gFalse;
+
+  number = index - base + interval->first;
+  switch (interval->style) {
+  case Interval::Arabic:
+    snprintf (buffer, sizeof(buffer), "%d", number);
+    number_string.append(buffer);
+    break;
+  case Interval::LowercaseRoman:
+    toRoman(number, &number_string, gFalse);
+    break;
+  case Interval::UppercaseRoman:
+    toRoman(number, &number_string, gTrue);
+    break;
+  case Interval::UppercaseLatin:
+  case Interval::LowercaseLatin:
+    number = 0;
+    break;
+  case Interval::None:
+    break;
+  }
+
+  label->clear();
+  label->append(interval->prefix);
+  if (label->hasUnicodeMarker()) {
+      int i, len;
+      char ucs2_char[2];
+
+      /* Convert the ascii number string to ucs2 and append. */
+      len = number_string.getLength ();
+      ucs2_char[0] = 0;
+      for (i = 0; i < len; ++i) {
+         ucs2_char[1] = number_string.getChar(i);
+         label->append(ucs2_char, 2);
+      }
+  } else {
+      label->append(&number_string);
+  }
+
+  return gTrue;
+}
+
+#ifdef TEST
+int main(int argc, char *argv[])
+{
+  {
+    GooString str;
+    toRoman(177, &str, gFalse);
+    assert (str.cmp("clxxvii") == 0);
+  }
+
+  {
+    GooString roman("clxxvii");
+    assert (fromRoman(roman.getCString()) == 177);
+  }
+
+  {
+    GooString str;
+    toLatin(54, &str, gFalse);
+    assert (str.cmp("bbb") == 0);
+  }
+
+  {
+    GooString latin("ddd");
+    assert (fromLatin(latin.getCString()) == 56);
+  }
+}
+#endif
diff --git a/poppler/PageLabelInfo.h b/poppler/PageLabelInfo.h
new file mode 100644 (file)
index 0000000..960e710
--- /dev/null
@@ -0,0 +1,51 @@
+//========================================================================
+//
+// This file is under the GPLv2 or later license
+//
+// Copyright (C) 2005-2006 Kristian Høgsberg <krh@redhat.com>
+// Copyright (C) 2005 Albert Astals Cid <aacid@kde.org>
+//
+// To see a description of the changes please see the Changelog file that
+// came with your tarball or type make ChangeLog if you are building from git
+//
+//========================================================================
+
+#include <limits.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <ctype.h>
+#include <assert.h>
+
+#include "goo/gtypes.h"
+#include "goo/GooList.h"
+#include "goo/GooString.h"
+#include "Object.h"
+
+class PageLabelInfo {
+public:
+  PageLabelInfo(Object *tree, int numPages);
+  ~PageLabelInfo();
+  GBool labelToIndex(GooString *label, int *index);
+  GBool indexToLabel(int index, GooString *label);
+
+private:
+  void parse(Object *tree);
+
+private:
+  struct Interval {
+    Interval(Object *dict, int baseA);
+    ~Interval();
+    GooString *prefix;
+    enum NumberStyle {
+      None,
+      Arabic,
+      LowercaseRoman,
+      UppercaseRoman,
+      UppercaseLatin,
+      LowercaseLatin
+    } style;
+    int first, base, length;
+  };
+
+  GooList intervals;
+};
diff --git a/poppler/PageTransition.cc b/poppler/PageTransition.cc
new file mode 100644 (file)
index 0000000..3fbd0de
--- /dev/null
@@ -0,0 +1,137 @@
+/* PageTransition.cc
+ * Copyright (C) 2005, Net Integration Technologies, Inc.
+ * Copyright (C) 2010, Albert Astals Cid <aacid@kde.org>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#ifdef USE_GCC_PRAGMAS
+#pragma implementation
+#endif
+
+#include "PageTransition.h"
+
+//------------------------------------------------------------------------
+// PageTransition
+//------------------------------------------------------------------------
+
+PageTransition::PageTransition (Object *trans) {
+  Object obj;
+  Dict *dict;
+
+  type = transitionReplace;
+  duration = 1;
+  alignment = transitionHorizontal;
+  direction = transitionInward;
+  angle = 0;
+  scale = 1.0;
+  rectangular = gFalse;
+  ok = gTrue;
+
+  if (!trans || !trans->isDict ()) {
+    ok = gFalse;
+    return;
+  }
+
+  dict = trans->getDict();
+
+  // get type
+  if (dict->lookup("S", &obj)->isName()) {
+    const char *s = obj.getName();
+    
+    if (strcmp("R", s) == 0)
+      type = transitionReplace;
+    else if (strcmp("Split", s) == 0)
+      type = transitionSplit;
+    else if (strcmp("Blinds", s) == 0)
+      type = transitionBlinds;
+    else if (strcmp("Box", s) == 0)
+      type = transitionBox;
+    else if (strcmp("Wipe", s) == 0)
+      type = transitionWipe;
+    else if (strcmp("Dissolve", s) == 0)
+      type = transitionDissolve;
+    else if (strcmp("Glitter", s) == 0)
+      type = transitionGlitter;
+    else if (strcmp("Fly", s) == 0)
+      type = transitionFly;
+    else if (strcmp("Push", s) == 0)
+      type = transitionPush;
+    else if (strcmp("Cover", s) == 0)
+      type = transitionCover;
+    else if (strcmp("Uncover", s) == 0)
+      type = transitionUncover;
+    else if (strcmp("Fade", s) == 0)
+      type = transitionFade;
+  }
+  obj.free();
+
+  // get duration
+  if (dict->lookup("D", &obj)->isInt()) {
+    duration = obj.getInt();
+  }
+  obj.free();
+
+  // get alignment
+  if (dict->lookup("Dm", &obj)->isName()) {
+    const char *dm = obj.getName();
+    
+    if (strcmp("H", dm) == 0)
+      alignment = transitionHorizontal;
+    else if (strcmp("V", dm) == 0)
+      alignment = transitionVertical;
+  }
+  obj.free();
+
+  // get direction
+  if (dict->lookup("M", &obj)->isName()) {
+    const char *m = obj.getName();
+    
+    if (strcmp("I", m) == 0)
+      direction = transitionInward;
+    else if (strcmp("O", m) == 0)
+      direction = transitionOutward;
+  }
+  obj.free();
+
+  // get angle
+  if (dict->lookup("Di", &obj)->isInt()) {
+    angle = obj.getInt();
+  }
+  obj.free();
+
+  if (dict->lookup("Di", &obj)->isName()) {
+    if (strcmp("None", obj.getName()) == 0)
+      angle = 0;
+  }
+  obj.free();
+
+  // get sacle
+  if (dict->lookup("SS", &obj)->isReal()) {
+    scale = obj.getReal();
+  }
+  obj.free();
+
+  // get rectangular
+  if (dict->lookup("B", &obj)->isBool()) {
+    rectangular = obj.getBool();
+  }
+  obj.free();
+}
+
+PageTransition::~PageTransition()
+{
+}
+
diff --git a/poppler/PageTransition.h b/poppler/PageTransition.h
new file mode 100644 (file)
index 0000000..e892c6c
--- /dev/null
@@ -0,0 +1,104 @@
+/* PageTransition.cc
+ * Copyright (C) 2005, Net Integration Technologies, Inc.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#ifndef PAGE_TRANSITION_H
+#define PAGE_TRANSITION_H
+
+#ifdef USE_GCC_PRAGMAS
+#pragma interface
+#endif
+
+#include "Object.h"
+
+//------------------------------------------------------------------------
+// PageTransition
+//------------------------------------------------------------------------
+
+// if changed remember to keep in sync with frontend enums
+enum PageTransitionType {
+  transitionReplace = 0,
+  transitionSplit,
+  transitionBlinds,
+  transitionBox,
+  transitionWipe,
+  transitionDissolve,
+  transitionGlitter,
+  transitionFly,
+  transitionPush,
+  transitionCover,
+  transitionUncover,
+  transitionFade
+};
+
+// if changed remember to keep in sync with frontend enums
+enum PageTransitionAlignment {
+  transitionHorizontal = 0,
+  transitionVertical
+};
+
+// if changed remember to keep in sync with frontend enums
+enum PageTransitionDirection {
+  transitionInward = 0,
+  transitionOutward
+};
+
+class PageTransition {
+public:
+  // Construct a Page Transition.
+  PageTransition (Object *trans);
+
+  // Destructor.
+  ~PageTransition ();
+
+  // Was the Page Transition created successfully?
+  GBool isOk() { return ok; }
+
+  // Get type
+  PageTransitionType getType() { return type; }
+
+  // Get duration
+  int getDuration() { return duration;}
+
+  // Get alignment
+  PageTransitionAlignment getAlignment() { return alignment; }
+
+  // Get direction
+  PageTransitionDirection getDirection() { return direction; }
+
+  // Get angle
+  int getAngle() { return angle; }
+
+  // Get scale
+  double getScale() { return scale; }
+
+  // Is rectangular?
+  GBool isRectangular() { return rectangular; }
+
+private:
+  
+  PageTransitionType type;           // transition style
+  int duration;                      // duration of the effect in seconds
+  PageTransitionAlignment alignment; // dimension of the effect
+  PageTransitionDirection direction; // direction of motion
+  int angle;                         // direction in degrees
+  double scale;                      // scale
+  GBool rectangular;                 // is the area to be flown in rectangular?
+  GBool ok;                          // set if created successfully
+};
+
+#endif /* PAGE_TRANSITION_H */
diff --git a/poppler/Parser.cc b/poppler/Parser.cc
new file mode 100644 (file)
index 0000000..5b80293
--- /dev/null
@@ -0,0 +1,298 @@
+//========================================================================
+//
+// Parser.cc
+//
+// Copyright 1996-2003 Glyph & Cog, LLC
+//
+//========================================================================
+
+//========================================================================
+//
+// Modified under the Poppler project - http://poppler.freedesktop.org
+//
+// All changes made under the Poppler project to this file are licensed
+// under GPL version 2 or later
+//
+// Copyright (C) 2006, 2009, 201, 2010 Albert Astals Cid <aacid@kde.org>
+// Copyright (C) 2006 Krzysztof Kowalczyk <kkowalczyk@gmail.com>
+// Copyright (C) 2009 Ilya Gorenbein <igorenbein@finjan.com>
+// Copyright (C) 2012 Hib Eris <hib@hiberis.nl>
+//
+// To see a description of the changes please see the Changelog file that
+// came with your tarball or type make ChangeLog if you are building from git
+//
+//========================================================================
+
+#include <config.h>
+
+#ifdef USE_GCC_PRAGMAS
+#pragma implementation
+#endif
+
+#include <stddef.h>
+#include "Object.h"
+#include "Array.h"
+#include "Dict.h"
+#include "Decrypt.h"
+#include "Parser.h"
+#include "XRef.h"
+#include "Error.h"
+
+// Max number of nested objects.  This is used to catch infinite loops
+// in the object structure. And also technically valid files with
+// lots of nested arrays that made us consume all the stack
+#define recursionLimit 500
+
+Parser::Parser(XRef *xrefA, Lexer *lexerA, GBool allowStreamsA) {
+  xref = xrefA;
+  lexer = lexerA;
+  inlineImg = 0;
+  allowStreams = allowStreamsA;
+  lexer->getObj(&buf1);
+  lexer->getObj(&buf2);
+}
+
+Parser::~Parser() {
+  buf1.free();
+  buf2.free();
+  delete lexer;
+}
+
+Object *Parser::getObj(Object *obj, int recursion)
+{
+  return getObj(obj, gFalse, NULL, cryptRC4, 0, 0, 0, recursion);
+}
+
+Object *Parser::getObj(Object *obj, GBool simpleOnly,
+           Guchar *fileKey,
+                      CryptAlgorithm encAlgorithm, int keyLength,
+                      int objNum, int objGen, int recursion,
+                      GBool strict) {
+  char *key;
+  Stream *str;
+  Object obj2;
+  int num;
+  DecryptStream *decrypt;
+  GooString *s, *s2;
+  int c;
+
+  // refill buffer after inline image data
+  if (inlineImg == 2) {
+    buf1.free();
+    buf2.free();
+    lexer->getObj(&buf1);
+    lexer->getObj(&buf2);
+    inlineImg = 0;
+  }
+
+  // array
+  if (!simpleOnly && likely(recursion < recursionLimit) && buf1.isCmd("[")) {
+    shift();
+    obj->initArray(xref);
+    while (!buf1.isCmd("]") && !buf1.isEOF())
+      obj->arrayAdd(getObj(&obj2, gFalse, fileKey, encAlgorithm, keyLength,
+                          objNum, objGen, recursion + 1));
+    if (buf1.isEOF()) {
+      error(errSyntaxError, getPos(), "End of file inside array");
+      if (strict) goto err;
+    }
+    shift();
+
+  // dictionary or stream
+  } else if (!simpleOnly && likely(recursion < recursionLimit) && buf1.isCmd("<<")) {
+    shift(objNum);
+    obj->initDict(xref);
+    while (!buf1.isCmd(">>") && !buf1.isEOF()) {
+      if (!buf1.isName()) {
+       error(errSyntaxError, getPos(), "Dictionary key must be a name object");
+       if (strict) goto err;
+       shift();
+      } else {
+       // buf1 might go away in shift(), so construct the key
+       key = copyString(buf1.getName());
+       shift();
+       if (buf1.isEOF() || buf1.isError()) {
+         gfree(key);
+         if (strict && buf1.isError()) goto err;
+         break;
+       }
+       obj->dictAdd(key, getObj(&obj2, gFalse, fileKey, encAlgorithm, keyLength, objNum, objGen, recursion + 1));
+      }
+    }
+    if (buf1.isEOF()) {
+      error(errSyntaxError, getPos(), "End of file inside dictionary");
+      if (strict) goto err;
+    }
+    // stream objects are not allowed inside content streams or
+    // object streams
+    if (allowStreams && buf2.isCmd("stream")) {
+      if ((str = makeStream(obj, fileKey, encAlgorithm, keyLength,
+                           objNum, objGen, recursion + 1,
+                           strict))) {
+       obj->initStream(str);
+      } else {
+       obj->free();
+       obj->initError();
+      }
+    } else {
+      shift();
+    }
+
+  // indirect reference or integer
+  } else if (buf1.isInt()) {
+    num = buf1.getInt();
+    shift();
+    if (buf1.isInt() && buf2.isCmd("R")) {
+      obj->initRef(num, buf1.getInt());
+      shift();
+      shift();
+    } else {
+      obj->initInt(num);
+    }
+
+  // string
+  } else if (buf1.isString() && fileKey) {
+    s = buf1.getString();
+    s2 = new GooString();
+    obj2.initNull();
+    decrypt = new DecryptStream(new MemStream(s->getCString(), 0,
+                                             s->getLength(), &obj2),
+                               fileKey, encAlgorithm, keyLength,
+                               objNum, objGen);
+    decrypt->reset();
+    while ((c = decrypt->getChar()) != EOF) {
+      s2->append((char)c);
+    }
+    delete decrypt;
+    obj->initString(s2);
+    shift();
+
+  // simple object
+  } else {
+    // avoid re-allocating memory for complex objects like strings by
+    // shallow copy of <buf1> to <obj> and nulling <buf1> so that
+    // subsequent buf1.free() won't free this memory
+    buf1.shallowCopy(obj);
+    buf1.initNull();
+    shift();
+  }
+
+  return obj;
+
+err:
+  obj->free();
+  obj->initError();
+  return obj;
+
+}
+
+Stream *Parser::makeStream(Object *dict, Guchar *fileKey,
+                          CryptAlgorithm encAlgorithm, int keyLength,
+                          int objNum, int objGen, int recursion,
+                           GBool strict) {
+  Object obj;
+  BaseStream *baseStr;
+  Stream *str;
+  Guint pos, endPos, length;
+
+  // get stream start position
+  lexer->skipToNextLine();
+  if (!(str = lexer->getStream())) {
+    return NULL;
+  }
+  pos = str->getPos();
+
+  // get length
+  dict->dictLookup("Length", &obj, recursion);
+  if (obj.isInt()) {
+    length = (Guint)obj.getInt();
+    obj.free();
+  } else {
+    error(errSyntaxError, getPos(), "Bad 'Length' attribute in stream");
+    obj.free();
+    if (strict) return NULL;
+    length = 0;
+  }
+
+  // check for length in damaged file
+  if (xref && xref->getStreamEnd(pos, &endPos)) {
+    length = endPos - pos;
+  }
+
+  // in badly damaged PDF files, we can run off the end of the input
+  // stream immediately after the "stream" token
+  if (!lexer->getStream()) {
+    return NULL;
+  }
+  baseStr = lexer->getStream()->getBaseStream();
+
+  // skip over stream data
+  if (Lexer::LOOK_VALUE_NOT_CACHED != lexer->lookCharLastValueCached) {
+      // take into account the fact that we've cached one value
+      pos = pos - 1;
+      lexer->lookCharLastValueCached = Lexer::LOOK_VALUE_NOT_CACHED;
+  }
+  lexer->setPos(pos + length);
+
+  // refill token buffers and check for 'endstream'
+  shift();  // kill '>>'
+  shift();  // kill 'stream'
+  if (buf1.isCmd("endstream")) {
+    shift();
+  } else {
+    error(errSyntaxError, getPos(), "Missing 'endstream' or incorrect stream length");
+    if (strict) return NULL;
+    if (xref) {
+      // shift until we find the proper endstream or we change to another object or reach eof
+      while (!buf1.isCmd("endstream") && xref->getNumEntry(lexer->getPos()) == objNum && !buf1.isEOF()) {
+        shift();
+      }
+      length = lexer->getPos() - pos;
+      if (buf1.isCmd("endstream")) {
+        obj.initInt(length);
+        dict->dictSet("Length", &obj);
+        obj.free();
+      }
+    } else {
+      // When building the xref we can't use it so use this
+      // kludge for broken PDF files: just add 5k to the length, and
+      // hope its enough
+      length += 5000;
+    }
+  }
+
+  // make base stream
+  str = baseStr->makeSubStream(pos, gTrue, length, dict);
+
+  // handle decryption
+  if (fileKey) {
+    str = new DecryptStream(str, fileKey, encAlgorithm, keyLength,
+                           objNum, objGen);
+  }
+
+  // get filters
+  str = str->addFilters(dict);
+
+  return str;
+}
+
+void Parser::shift(int objNum) {
+  if (inlineImg > 0) {
+    if (inlineImg < 2) {
+      ++inlineImg;
+    } else {
+      // in a damaged content stream, if 'ID' shows up in the middle
+      // of a dictionary, we need to reset
+      inlineImg = 0;
+    }
+  } else if (buf2.isCmd("ID")) {
+    lexer->skipChar();         // skip char after 'ID' command
+    inlineImg = 1;
+  }
+  buf1.free();
+  buf2.shallowCopy(&buf1);
+  if (inlineImg > 0)           // don't buffer inline image data
+    buf2.initNull();
+  else
+    lexer->getObj(&buf2, objNum);
+}
diff --git a/poppler/Parser.h b/poppler/Parser.h
new file mode 100644 (file)
index 0000000..5ab4099
--- /dev/null
@@ -0,0 +1,79 @@
+//========================================================================
+//
+// Parser.h
+//
+// Copyright 1996-2003 Glyph & Cog, LLC
+//
+//========================================================================
+
+//========================================================================
+//
+// Modified under the Poppler project - http://poppler.freedesktop.org
+//
+// All changes made under the Poppler project to this file are licensed
+// under GPL version 2 or later
+//
+// Copyright (C) 2006, 2010 Albert Astals Cid <aacid@kde.org>
+// Copyright (C) 2012 Hib Eris <hib@hiberis.nl>
+//
+// To see a description of the changes please see the Changelog file that
+// came with your tarball or type make ChangeLog if you are building from git
+//
+//========================================================================
+
+#ifndef PARSER_H
+#define PARSER_H
+
+#ifdef USE_GCC_PRAGMAS
+#pragma interface
+#endif
+
+#include "Lexer.h"
+
+//------------------------------------------------------------------------
+// Parser
+//------------------------------------------------------------------------
+
+class Parser {
+public:
+
+  // Constructor.
+  Parser(XRef *xrefA, Lexer *lexerA, GBool allowStreamsA);
+
+  // Destructor.
+  ~Parser();
+
+  // Get the next object from the input stream.  If <simpleOnly> is
+  // true, do not parse compound objects (arrays, dictionaries, or
+  // streams).
+  Object *getObj(Object *obj, GBool simpleOnly = gFalse, 
+     Guchar *fileKey = NULL,
+                CryptAlgorithm encAlgorithm = cryptRC4, int keyLength = 0,
+                int objNum = 0, int objGen = 0, int recursion = 0,
+                GBool strict = gFalse);
+  
+  Object *getObj(Object *obj, int recursion);
+
+  // Get stream.
+  Stream *getStream() { return lexer->getStream(); }
+
+  // Get current position in file.
+  int getPos() { return lexer->getPos(); }
+
+private:
+
+  XRef *xref;                  // the xref table for this PDF file
+  Lexer *lexer;                        // input stream
+  GBool allowStreams;          // parse stream objects?
+  Object buf1, buf2;           // next two tokens
+  int inlineImg;               // set when inline image data is encountered
+
+  Stream *makeStream(Object *dict, Guchar *fileKey,
+                    CryptAlgorithm encAlgorithm, int keyLength,
+                    int objNum, int objGen, int recursion,
+                    GBool strict);
+  void shift(int objNum = -1);
+};
+
+#endif
+
diff --git a/poppler/PopplerCache.cc b/poppler/PopplerCache.cc
new file mode 100644 (file)
index 0000000..6018a77
--- /dev/null
@@ -0,0 +1,163 @@
+//========================================================================
+//
+// PopplerCache.h
+//
+// This file is licensed under the GPLv2 or later
+//
+// Copyright (C) 2009 Koji Otani <sho@bbr.jp>
+// Copyright (C) 2009, 2010 Albert Astals Cid <aacid@kde.org>
+// Copyright (C) 2010 Carlos Garcia Campos <carlosgc@gnome.org>
+//
+//========================================================================
+
+#include "PopplerCache.h"
+
+#include "XRef.h"
+
+PopplerCacheKey::~PopplerCacheKey()
+{
+}
+
+PopplerCacheItem::~PopplerCacheItem()
+{
+}
+
+PopplerCache::PopplerCache(int cacheSizeA)
+{
+  cacheSize = cacheSizeA;
+  keys = new PopplerCacheKey*[cacheSize];
+  items = new PopplerCacheItem*[cacheSize];
+  lastValidCacheIndex = -1;
+}
+
+PopplerCache::~PopplerCache()
+{
+  for (int i = 0; i <= lastValidCacheIndex; ++i) {
+    delete keys[i];
+    delete items[i];
+  }
+  delete[] keys;
+  delete[] items;
+}
+
+PopplerCacheItem *PopplerCache::lookup(const PopplerCacheKey &key)
+{
+  if (lastValidCacheIndex < 0)
+    return 0;
+
+  if (*keys[0] == key) {
+    return items[0];
+  }
+  for (int i = 1; i <= lastValidCacheIndex; i++) {
+    if (*keys[i] == key) {
+      PopplerCacheKey *keyHit = keys[i];
+      PopplerCacheItem *itemHit = items[i];
+
+      for (int j = i; j > 0; j--) {
+        keys[j] = keys[j - 1];
+        items[j] = items[j - 1];
+      }
+      
+      keys[0] = keyHit;
+      items[0] = itemHit;
+      return itemHit;
+    }
+  }
+  return 0;
+}
+
+void PopplerCache::put(PopplerCacheKey *key, PopplerCacheItem *item)
+{
+  int movingStartIndex = lastValidCacheIndex + 1;
+  if (lastValidCacheIndex == cacheSize - 1) {
+    delete keys[lastValidCacheIndex];
+    delete items[lastValidCacheIndex];
+    movingStartIndex = cacheSize - 1;
+  } else {
+    lastValidCacheIndex++;
+  }
+  for (int i = movingStartIndex; i > 0; i--) {
+    keys[i] = keys[i - 1];
+    items[i] = items[i - 1];
+  }
+  keys[0] = key;
+  items[0] = item;
+}
+
+int PopplerCache::size()
+{
+  return cacheSize;
+}
+
+int PopplerCache::numberOfItems()
+{
+  return lastValidCacheIndex + 1;
+}
+    
+PopplerCacheItem *PopplerCache::item(int index)
+{
+  return items[index];
+}
+    
+PopplerCacheKey *PopplerCache::key(int index)
+{
+  return keys[index];
+}
+
+class ObjectKey : public PopplerCacheKey {
+  public:
+    ObjectKey(int numA, int genA) : num(numA), gen(genA)
+    {
+    }
+
+    bool operator==(const PopplerCacheKey &key) const
+    {
+      const ObjectKey *k = static_cast<const ObjectKey*>(&key);
+      return k->num == num && k->gen == gen;
+    }
+
+    int num, gen;
+};
+
+class ObjectItem : public PopplerCacheItem {
+  public:
+    ObjectItem(Object *obj)
+    {
+      obj->copy(&item);
+    }
+
+    ~ObjectItem()
+    {
+      item.free();
+    }
+
+    Object item;
+};
+
+PopplerObjectCache::PopplerObjectCache(int cacheSize, XRef *xrefA) {
+  cache = new PopplerCache (cacheSize);
+  xref = xrefA;
+}
+
+PopplerObjectCache::~PopplerObjectCache() {
+  delete cache;
+}
+
+Object *PopplerObjectCache::put(const Ref &ref) {
+  Object obj;
+  xref->fetch(ref.num, ref.gen, &obj);
+
+  ObjectKey *key = new ObjectKey(ref.num, ref.gen);
+  ObjectItem *item = new ObjectItem(&obj);
+  cache->put(key, item);
+  obj.free();
+
+  return &item->item;
+}
+
+Object *PopplerObjectCache::lookup(const Ref &ref, Object *obj) {
+  ObjectKey key(ref.num, ref.gen);
+  ObjectItem *item = static_cast<ObjectItem *>(cache->lookup(key));
+
+  return item ? item->item.copy(obj) : obj->initNull();
+}
diff --git a/poppler/PopplerCache.h b/poppler/PopplerCache.h
new file mode 100644 (file)
index 0000000..74010a2
--- /dev/null
@@ -0,0 +1,78 @@
+//========================================================================
+//
+// PopplerCache.h
+//
+// This file is licensed under the GPLv2 or later
+//
+// Copyright (C) 2009 Koji Otani <sho@bbr.jp>
+// Copyright (C) 2009, 2010 Albert Astals Cid <aacid@kde.org>
+// Copyright (C) 2010 Carlos Garcia Campos <carlosgc@gnome.org>
+//
+//========================================================================
+
+#ifndef POPPLER_CACHE_H
+#define POPPLER_CACHE_H
+
+#include "Object.h"
+
+class PopplerCacheItem
+{
+  public:
+   virtual ~PopplerCacheItem();
+};
+
+class PopplerCacheKey
+{
+  public:
+    virtual ~PopplerCacheKey();
+    virtual bool operator==(const PopplerCacheKey &key) const = 0;
+};
+
+class PopplerCache
+{
+  public:
+    PopplerCache(int cacheSizeA);
+    ~PopplerCache();
+    
+    /* The item returned is owned by the cache */
+    PopplerCacheItem *lookup(const PopplerCacheKey &key);
+    
+    /* The key and item pointers ownership is taken by the cache */
+    void put(PopplerCacheKey *key, PopplerCacheItem *item);
+    
+    /* The max size of the cache */
+    int size();
+    
+    /* The number of items in the cache */
+    int numberOfItems();
+    
+    /* The n-th item in the cache */
+    PopplerCacheItem *item(int index);
+    
+    /* The n-th key in the cache */
+    PopplerCacheKey *key(int index);
+  
+  private:
+    PopplerCache(const PopplerCache &cache); // not allowed
+  
+    PopplerCacheKey **keys;
+    PopplerCacheItem **items;
+    int lastValidCacheIndex;
+    int cacheSize;
+};
+
+class PopplerObjectCache
+{
+  public:
+    PopplerObjectCache (int cacheSizeA, XRef *xrefA);
+    ~PopplerObjectCache();
+
+    Object *put(const Ref &ref);
+    Object *lookup(const Ref &ref, Object *obj);
+
+  private:
+    XRef *xref;
+    PopplerCache *cache;
+};
+
+#endif
diff --git a/poppler/PreScanOutputDev.cc b/poppler/PreScanOutputDev.cc
new file mode 100644 (file)
index 0000000..3a86d52
--- /dev/null
@@ -0,0 +1,357 @@
+//========================================================================
+//
+// PreScanOutputDev.cc
+//
+// Copyright 2005 Glyph & Cog, LLC
+//
+//========================================================================
+
+//========================================================================
+//
+// Modified under the Poppler project - http://poppler.freedesktop.org
+//
+// All changes made under the Poppler project to this file are licensed
+// under GPL version 2 or later
+//
+// Copyright (C) 2009 Carlos Garcia Campos <carlosgc@gnome.org>
+// Copyright (C) 2010, 2011 Albert Astals Cid <aacid@kde.org>
+// Copyright (C) 2011 William Bader <williambader@hotmail.com>
+// Copyright (C) 2011 Thomas Freitag <Thomas.Freitag@alfa.de>
+// Copyright (C) 2011 Adrian Johnson <ajohnson@redneon.com>
+//
+// To see a description of the changes please see the Changelog file that
+// came with your tarball or type make ChangeLog if you are building from git
+//
+//========================================================================
+
+#include <config.h>
+
+#ifdef USE_GCC_PRAGMAS
+#pragma implementation
+#endif
+
+#include <math.h>
+#include "GlobalParams.h"
+#include "Gfx.h"
+#include "GfxFont.h"
+#include "Link.h"
+#include "Catalog.h"
+#include "Page.h"
+#include "PreScanOutputDev.h"
+
+//------------------------------------------------------------------------
+// PreScanOutputDev
+//------------------------------------------------------------------------
+
+PreScanOutputDev::PreScanOutputDev(PDFDoc *docA) {
+  level = globalParams->getPSLevel();
+  doc = docA;
+  clearStats();
+}
+
+PreScanOutputDev::~PreScanOutputDev() {
+}
+
+void PreScanOutputDev::startPage(int /*pageNum*/, GfxState * /*state*/) {
+}
+
+void PreScanOutputDev::endPage() {
+}
+
+void PreScanOutputDev::stroke(GfxState *state) {
+  double *dash;
+  int dashLen;
+  double dashStart;
+
+  check(state->getStrokeColorSpace(), state->getStrokeColor(),
+       state->getStrokeOpacity(), state->getBlendMode());
+  state->getLineDash(&dash, &dashLen, &dashStart);
+  if (dashLen != 0) {
+    gdi = gFalse;
+  }
+}
+
+void PreScanOutputDev::fill(GfxState *state) {
+  check(state->getFillColorSpace(), state->getFillColor(),
+       state->getFillOpacity(), state->getBlendMode());
+}
+
+void PreScanOutputDev::eoFill(GfxState *state) {
+  check(state->getFillColorSpace(), state->getFillColor(),
+       state->getFillOpacity(), state->getBlendMode());
+}
+
+GBool PreScanOutputDev::tilingPatternFill(GfxState *state, Gfx *gfx, Catalog *catalog, Object *str,
+                                         double *pmat, int paintType, int /*tilingType*/, Dict *resDict,
+                                       double *mat, double *bbox,
+                                       int x0, int y0, int x1, int y1,
+                                       double xStep, double yStep) {
+  if (paintType == 1) {
+    gfx->drawForm(str, resDict, mat, bbox);
+  } else {
+    check(state->getFillColorSpace(), state->getFillColor(),
+         state->getFillOpacity(), state->getBlendMode());
+  }
+  return gTrue;
+}
+
+GBool PreScanOutputDev::functionShadedFill(GfxState *state,
+                                          GfxFunctionShading *shading) {
+  if (shading->getColorSpace()->getMode() != csDeviceGray &&
+      shading->getColorSpace()->getMode() != csCalGray) {
+    gray = gFalse;
+  }
+  mono = gFalse;
+  if (state->getFillOpacity() != 1 ||
+      state->getBlendMode() != gfxBlendNormal) {
+    transparency = gTrue;
+  }
+  return gTrue;
+}
+
+GBool PreScanOutputDev::axialShadedFill(GfxState *state, GfxAxialShading *shading, double /*tMin*/, double /*tMax*/) {
+  if (shading->getColorSpace()->getMode() != csDeviceGray &&
+      shading->getColorSpace()->getMode() != csCalGray) {
+    gray = gFalse;
+  }
+  mono = gFalse;
+  if (state->getFillOpacity() != 1 ||
+      state->getBlendMode() != gfxBlendNormal) {
+    transparency = gTrue;
+  }
+  return gTrue;
+}
+
+GBool PreScanOutputDev::radialShadedFill(GfxState *state, GfxRadialShading *shading, double /*sMin*/, double /*sMax*/) {
+  if (shading->getColorSpace()->getMode() != csDeviceGray &&
+      shading->getColorSpace()->getMode() != csCalGray) {
+    gray = gFalse;
+  }
+  mono = gFalse;
+  if (state->getFillOpacity() != 1 ||
+      state->getBlendMode() != gfxBlendNormal) {
+    transparency = gTrue;
+  }
+  return gTrue;
+}
+
+void PreScanOutputDev::clip(GfxState * /*state*/) {
+  //~ check for a rectangle "near" the edge of the page;
+  //~   else set gdi to false
+}
+
+void PreScanOutputDev::eoClip(GfxState * /*state*/) {
+  //~ see clip()
+}
+
+void PreScanOutputDev::beginStringOp(GfxState *state) {
+  int render;
+  GfxFont *font;
+  double m11, m12, m21, m22;
+  GBool simpleTTF;
+
+  render = state->getRender();
+  if (!(render & 1)) {
+    check(state->getFillColorSpace(), state->getFillColor(),
+         state->getFillOpacity(), state->getBlendMode());
+  }
+  if ((render & 3) == 1 || (render & 3) == 2) {
+    check(state->getStrokeColorSpace(), state->getStrokeColor(),
+         state->getStrokeOpacity(), state->getBlendMode());
+  }
+
+  font = state->getFont();
+  state->getFontTransMat(&m11, &m12, &m21, &m22);
+  //~ this should check for external fonts that are non-TrueType
+  simpleTTF = fabs(m11 + m22) < 0.01 &&
+              m11 > 0 &&
+              fabs(m12) < 0.01 &&
+              fabs(m21) < 0.01 &&
+              fabs(state->getHorizScaling() - 1) < 0.001 &&
+              (font->getType() == fontTrueType ||
+              font->getType() == fontTrueTypeOT);
+  if (simpleTTF) {
+    //~ need to create a FoFiTrueType object, and check for a Unicode cmap
+  }
+  if (state->getRender() != 0 || !simpleTTF) {
+    gdi = gFalse;
+  }
+}
+
+void PreScanOutputDev::endStringOp(GfxState * /*state*/) {
+}
+
+GBool PreScanOutputDev::beginType3Char(GfxState * /*state*/, double /*x*/, double /*y*/,
+                                      double /*dx*/, double /*dy*/,
+                                      CharCode /*code*/, Unicode * /*u*/, int /*uLen*/) {
+  // return false so all Type 3 chars get rendered (no caching)
+  return gFalse;
+}
+
+void PreScanOutputDev::endType3Char(GfxState * /*state*/) {
+}
+
+void PreScanOutputDev::drawImageMask(GfxState *state, Object * /*ref*/, Stream *str,
+                                    int width, int height, GBool /*invert*/,
+                                    GBool /*interpolate*/, GBool inlineImg) {
+  int i, j;
+
+  check(state->getFillColorSpace(), state->getFillColor(),
+       state->getFillOpacity(), state->getBlendMode());
+  gdi = gFalse;
+  if ((level == psLevel1 || level == psLevel1Sep) &&
+      state->getFillColorSpace()->getMode() == csPattern) {
+    patternImgMask = gTrue;
+  }
+
+  if (inlineImg) {
+    str->reset();
+    j = height * ((width + 7) / 8);
+    for (i = 0; i < j; ++i)
+      str->getChar();
+    str->close();
+  }
+}
+
+void PreScanOutputDev::drawImage(GfxState *state, Object * /*ref*/, Stream *str,
+                                int width, int height,
+                                GfxImageColorMap *colorMap,
+                                GBool /*interpolate*/, int * /*maskColors*/, GBool inlineImg) {
+  GfxColorSpace *colorSpace;
+  int i, j;
+
+  colorSpace = colorMap->getColorSpace();
+  if (colorSpace->getMode() == csIndexed) {
+    colorSpace = ((GfxIndexedColorSpace *)colorSpace)->getBase();
+  }
+  if (colorSpace->getMode() == csDeviceGray ||
+      colorSpace->getMode() == csCalGray) {
+    if (colorMap->getBits() > 1) {
+      mono = gFalse;
+    }
+  } else {
+    gray = gFalse;
+    mono = gFalse;
+  }
+  if (state->getFillOpacity() != 1 ||
+      state->getBlendMode() != gfxBlendNormal) {
+    transparency = gTrue;
+  }
+  gdi = gFalse;
+
+  if (inlineImg) {
+    str->reset();
+    j = height * ((width * colorMap->getNumPixelComps() *
+                  colorMap->getBits() + 7) / 8);
+    for (i = 0; i < j; ++i)
+      str->getChar();
+    str->close();
+  }
+}
+
+void PreScanOutputDev::drawMaskedImage(GfxState *state, Object * /*ref*/,
+                                      Stream * /*str*/,
+                                      int /*width*/, int /*height*/,
+                                      GfxImageColorMap *colorMap,
+                                      GBool /*interpolate*/,
+                                      Stream * /*maskStr*/,
+                                      int /*maskWidth*/, int /*maskHeight*/,
+                                      GBool /*maskInvert*/, GBool /*maskInterpolate*/) {
+  GfxColorSpace *colorSpace;
+
+  colorSpace = colorMap->getColorSpace();
+  if (colorSpace->getMode() == csIndexed) {
+    colorSpace = ((GfxIndexedColorSpace *)colorSpace)->getBase();
+  }
+  if (colorSpace->getMode() == csDeviceGray ||
+      colorSpace->getMode() == csCalGray) {
+    if (colorMap->getBits() > 1) {
+      mono = gFalse;
+    }
+  } else {
+    gray = gFalse;
+    mono = gFalse;
+  }
+  if (state->getFillOpacity() != 1 ||
+      state->getBlendMode() != gfxBlendNormal) {
+    transparency = gTrue;
+  }
+  gdi = gFalse;
+}
+
+void PreScanOutputDev::drawSoftMaskedImage(GfxState * /*state*/, Object * /*ref*/,
+                                          Stream * /*str*/,
+                                          int /*width*/, int /*height*/,
+                                          GfxImageColorMap *colorMap,
+                                          GBool /*interpolate*/,
+                                          Stream * /*maskStr*/,
+                                          int /*maskWidth*/, int /*maskHeight*/,
+                                          GfxImageColorMap * /*maskColorMap*/,
+                                          GBool /*maskInterpolate*/) {
+  GfxColorSpace *colorSpace;
+
+  colorSpace = colorMap->getColorSpace();
+  if (colorSpace->getMode() == csIndexed) {
+    colorSpace = ((GfxIndexedColorSpace *)colorSpace)->getBase();
+  }
+  if (colorSpace->getMode() != csDeviceGray &&
+      colorSpace->getMode() != csCalGray) {
+    gray = gFalse;
+  }
+  mono = gFalse;
+  transparency = gTrue;
+  gdi = gFalse;
+}
+
+void PreScanOutputDev::beginTransparencyGroup(
+                          GfxState * /*state*/, double * /*bbox*/,
+                          GfxColorSpace * /*blendingColorSpace*/,
+                          GBool /*isolated*/, GBool /*knockout*/,
+                          GBool /*forSoftMask*/) {
+  gdi = gFalse;
+}
+
+void PreScanOutputDev::paintTransparencyGroup(GfxState *state, double * /*bbox*/)
+{
+  check(state->getFillColorSpace(), state->getFillColor(),
+        state->getFillOpacity(), state->getBlendMode());
+}
+
+void PreScanOutputDev::setSoftMask(GfxState * /*state*/, double * /*bbox*/, GBool /*alpha*/,
+                          Function * /*transferFunc*/, GfxColor * /*backdropColor*/)
+{
+  transparency = gTrue;
+}
+
+void PreScanOutputDev::check(GfxColorSpace *colorSpace, GfxColor *color,
+                            double opacity, GfxBlendMode blendMode) {
+  GfxRGB rgb;
+
+  if (colorSpace->getMode() == csPattern) {
+    mono = gFalse;
+    gray = gFalse;
+    gdi = gFalse;
+  } else {
+    colorSpace->getRGB(color, &rgb);
+    if (rgb.r != rgb.g || rgb.g != rgb.b || rgb.b != rgb.r) {
+      mono = gFalse;
+      gray = gFalse;
+    } else if (!((rgb.r == 0 && rgb.g == 0 && rgb.b == 0) ||
+                (rgb.r == gfxColorComp1 &&
+                 rgb.g == gfxColorComp1 &&
+                 rgb.b == gfxColorComp1))) {
+      mono = gFalse;
+    }
+  }
+  if (opacity != 1 || blendMode != gfxBlendNormal) {
+    transparency = gTrue;
+  }
+}
+
+void PreScanOutputDev::clearStats() {
+  mono = gTrue;
+  gray = gTrue;
+  transparency = gFalse;
+  gdi = gTrue;
+  patternImgMask = gFalse;
+}
diff --git a/poppler/PreScanOutputDev.h b/poppler/PreScanOutputDev.h
new file mode 100644 (file)
index 0000000..5260a3b
--- /dev/null
@@ -0,0 +1,181 @@
+//========================================================================
+//
+// PreScanOutputDev.h
+//
+// Copyright 2005 Glyph & Cog, LLC
+//
+//========================================================================
+
+//========================================================================
+//
+// Modified under the Poppler project - http://poppler.freedesktop.org
+//
+// All changes made under the Poppler project to this file are licensed
+// under GPL version 2 or later
+//
+// Copyright (C) 2009 Carlos Garcia Campos <carlosgc@gnome.org>
+// Copyright (C) 2010 Albert Astals Cid <aacid@kde.org>
+// Copyright (C) 2011 William Bader <williambader@hotmail.com>
+// Copyright (C) 2011 Thomas Freitag <Thomas.Freitag@alfa.de>
+// Copyright (C) 2011 Adrian Johnson <ajohnson@redneon.com>
+//
+// To see a description of the changes please see the Changelog file that
+// came with your tarball or type make ChangeLog if you are building from git
+//
+//========================================================================
+
+#ifndef PRESCANOUTPUTDEV_H
+#define PRESCANOUTPUTDEV_H
+
+#ifdef USE_GCC_PRAGMAS
+#pragma interface
+#endif
+
+#include "goo/gtypes.h"
+#include "Object.h"
+#include "GfxState.h"
+#include "GlobalParams.h"
+#include "OutputDev.h"
+
+//------------------------------------------------------------------------
+// PreScanOutputDev
+//------------------------------------------------------------------------
+
+class PreScanOutputDev: public OutputDev {
+public:
+
+  // Constructor.
+  PreScanOutputDev(PDFDoc *docA);
+
+  // Destructor.
+  virtual ~PreScanOutputDev();
+
+  //----- get info about output device
+
+  // Does this device use upside-down coordinates?
+  // (Upside-down means (0,0) is the top left corner of the page.)
+  virtual GBool upsideDown() { return gTrue; }
+
+  // Does this device use drawChar() or drawString()?
+  virtual GBool useDrawChar() { return gTrue; }
+
+  // Does this device use tilingPatternFill()?  If this returns false,
+  // tiling pattern fills will be reduced to a series of other drawing
+  // operations.
+  virtual GBool useTilingPatternFill() { return gTrue; }
+
+  // Does this device use functionShadedFill(), axialShadedFill(), and
+  // radialShadedFill()?  If this returns false, these shaded fills
+  // will be reduced to a series of other drawing operations.
+  virtual GBool useShadedFills(int type) { return gTrue; }
+
+  // Does this device use beginType3Char/endType3Char?  Otherwise,
+  // text in Type 3 fonts will be drawn with drawChar/drawString.
+  virtual GBool interpretType3Chars() { return gTrue; }
+
+  //----- initialization and control
+
+  // Start a page.
+  virtual void startPage(int pageNum, GfxState *state);
+
+  // End a page.
+  virtual void endPage();
+
+  //----- path painting
+  virtual void stroke(GfxState *state);
+  virtual void fill(GfxState *state);
+  virtual void eoFill(GfxState *state);
+  virtual GBool tilingPatternFill(GfxState *state, Gfx *gfx, Catalog *cat, Object *str,
+                                 double *pmat, int paintType, int tilingType, Dict *resDict,
+                                 double *mat, double *bbox,
+                                 int x0, int y0, int x1, int y1,
+                                 double xStep, double yStep);
+  virtual GBool functionShadedFill(GfxState *state,
+                                  GfxFunctionShading *shading);
+  virtual GBool axialShadedFill(GfxState *state, GfxAxialShading *shading, double tMin, double tMax);
+  virtual GBool radialShadedFill(GfxState *state, GfxRadialShading *shading, double tMin, double tMax);
+
+  //----- path clipping
+  virtual void clip(GfxState *state);
+  virtual void eoClip(GfxState *state);
+
+  //----- text drawing
+  virtual void beginStringOp(GfxState *state);
+  virtual void endStringOp(GfxState *state);
+  virtual GBool beginType3Char(GfxState *state, double x, double y,
+                              double dx, double dy,
+                              CharCode code, Unicode *u, int uLen);
+  virtual void endType3Char(GfxState *state);
+
+  //----- image drawing
+  virtual void drawImageMask(GfxState *state, Object *ref, Stream *str,
+                            int width, int height, GBool invert,
+                            GBool interpolate, GBool inlineImg);
+  virtual void drawImage(GfxState *state, Object *ref, Stream *str,
+                        int width, int height, GfxImageColorMap *colorMap,
+                        GBool interpolate, int *maskColors, GBool inlineImg);
+  virtual void drawMaskedImage(GfxState *state, Object *ref, Stream *str,
+                              int width, int height,
+                              GfxImageColorMap *colorMap,
+                              GBool interpolate,
+                              Stream *maskStr, int maskWidth, int maskHeight,
+                              GBool maskInvert, GBool maskInterpolate);
+  virtual void drawSoftMaskedImage(GfxState *state, Object *ref, Stream *str,
+                                  int width, int height,
+                                  GfxImageColorMap *colorMap,
+                                  GBool interpolate,
+                                  Stream *maskStr,
+                                  int maskWidth, int maskHeight,
+                                  GfxImageColorMap *maskColorMap,
+                                  GBool maskInterpolate);
+
+  //----- transparency groups and soft masks
+  virtual void beginTransparencyGroup(GfxState *state, double *bbox,
+                                     GfxColorSpace *blendingColorSpace,
+                                     GBool isolated, GBool knockout,
+                                     GBool forSoftMask);
+       virtual void paintTransparencyGroup(GfxState *state, double *bbox);
+       virtual void setSoftMask(GfxState *state, double *bbox, GBool alpha,
+                          Function *transferFunc, GfxColor *backdropColor);
+
+  //----- special access
+
+  // Returns true if the operations performed since the last call to
+  // clearStats() are all monochrome (black or white).
+  GBool isMonochrome() { return mono; }
+
+  // Returns true if the operations performed since the last call to
+  // clearStats() are all gray.
+  GBool isGray() { return gray; }
+
+  // Returns true if the operations performed since the last call to
+  // clearStats() included any transparency.
+  GBool usesTransparency() { return transparency; }
+
+  // Returns true if the operations performed since the last call to
+  // clearStats() are all rasterizable by GDI calls in GDIOutputDev.
+  GBool isAllGDI() { return gdi; }
+
+  // Returns true if the operations performed since the last call to
+  // clearStats() included any image mask fills with a pattern color
+  // space. (only level1!)
+  GBool usesPatternImageMask() { return patternImgMask; }
+
+  // Clear the stats used by the above functions.
+  void clearStats();
+
+private:
+
+  void check(GfxColorSpace *colorSpace, GfxColor *color,
+            double opacity, GfxBlendMode blendMode);
+
+  PDFDoc *doc;
+  GBool mono;
+  GBool gray;
+  GBool transparency;
+  GBool gdi;
+  PSLevel level;               // PostScript level (1, 2, separation)
+  GBool patternImgMask;                
+};
+
+#endif
diff --git a/poppler/ProfileData.cc b/poppler/ProfileData.cc
new file mode 100644 (file)
index 0000000..a0c4474
--- /dev/null
@@ -0,0 +1,44 @@
+//========================================================================
+//
+// ProfileData.cc
+//
+// Copyright 2005 Jonathan Blandford <jrb@gnome.org>
+//
+//========================================================================
+
+#include <config.h>
+
+#ifdef USE_GCC_PRAGMAS
+#pragma implementation
+#endif
+
+#include <stdlib.h>
+#include <stddef.h>
+#include "ProfileData.h"
+
+//------------------------------------------------------------------------
+// ProfileData
+//------------------------------------------------------------------------
+
+ProfileData::ProfileData() {
+       count = 0;
+       total = 0.0;
+       min = 0.0;
+       max = 0.0;
+}
+
+void
+ProfileData::addElement (double elapsed) {
+       if (count == 0) {
+               min = elapsed;
+               max = elapsed;
+       } else {
+               if (elapsed < min)
+                       min = elapsed;
+               if (elapsed > max)
+                       max = elapsed;
+       }
+       total += elapsed;
+       count ++;
+}
+
diff --git a/poppler/ProfileData.h b/poppler/ProfileData.h
new file mode 100644 (file)
index 0000000..418ee01
--- /dev/null
@@ -0,0 +1,41 @@
+//========================================================================
+//
+// ProfileData.h
+//
+// Copyright 2005 Jonathan Blandford <jrb@gnome.org>
+//
+//========================================================================
+
+#ifndef PROFILE_DATA_H
+#define PROFILE_DATA_H
+
+#ifdef USE_GCC_PRAGMAS
+#pragma interface
+#endif
+
+//------------------------------------------------------------------------
+// ProfileData
+//------------------------------------------------------------------------
+
+class ProfileData {
+public:
+
+  // Constructor.
+  ProfileData ();
+
+  // Destructor.
+  ~ProfileData() {}
+
+  void addElement (double elapsed);
+  int getCount () { return count; }
+  double getTotal () { return total; }
+  double getMin () { return max; }
+  double getMax () { return max; }
+private:
+  int count;                   // size of <elems> array
+  double total;                        // number of elements in array
+  double min;                  // reference count
+  double max;                  // reference count
+};
+
+#endif
diff --git a/poppler/Rendition.cc b/poppler/Rendition.cc
new file mode 100644 (file)
index 0000000..c040bf2
--- /dev/null
@@ -0,0 +1,401 @@
+//*********************************************************************************
+//                               Rendition.cc
+//---------------------------------------------------------------------------------
+// 
+//---------------------------------------------------------------------------------
+// Hugo Mercier <hmercier31[at]gmail.com> (c) 2008
+// Pino Toscano <pino@kde.org> (c) 2008
+// Carlos Garcia Campos <carlosgc@gnome.org> (c) 2010
+// Tobias Koenig <tobias.koenig@kdab.com> (c) 2012
+//
+// This program is free software; you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation; either version 2 of the License, or
+// (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with this program; if not, write to the Free Software
+// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+//*********************************************************************************
+
+#include <math.h>
+#include "Rendition.h"
+#include "FileSpec.h"
+
+MediaWindowParameters::MediaWindowParameters() {
+  // default values
+  type = windowEmbedded;
+  width = -1;
+  height = -1;
+  relativeTo = windowRelativeToDocument;
+  XPosition = 0.5;
+  YPosition = 0.5;
+  hasTitleBar = gTrue;
+  hasCloseButton = gTrue;
+  isResizeable = gTrue;
+}
+
+MediaWindowParameters::~MediaWindowParameters() {
+}
+
+void MediaWindowParameters::parseFWParams(Object* obj) {
+  Object tmp;
+
+  if (obj->dictLookup("D", &tmp)->isArray()) {
+    Array * dim = tmp.getArray();
+    
+    if (dim->getLength() >= 2) {
+      Object dd;
+      if (dim->get(0, &dd)->isInt()) {
+       width = dd.getInt();
+      }
+      dd.free();
+      if (dim->get(1, &dd)->isInt()) {
+       height = dd.getInt();
+      }
+      dd.free();
+    }
+  }
+  tmp.free();
+
+  if (obj->dictLookup("RT", &tmp)->isInt()) {
+    int t = tmp.getInt();
+    switch(t) {
+    case 0: relativeTo = windowRelativeToDocument; break;
+    case 1: relativeTo = windowRelativeToApplication; break;
+    case 2: relativeTo = windowRelativeToDesktop; break;
+    }
+  }
+  tmp.free();
+
+  if (obj->dictLookup("P",&tmp)->isInt()) {
+    int t = tmp.getInt();
+
+    switch(t) {
+    case 0: // Upper left
+      XPosition = 0.0;
+      YPosition = 0.0;
+      break;
+    case 1: // Upper Center
+      XPosition = 0.5;
+      YPosition = 0.0;
+      break;
+    case 2: // Upper Right
+      XPosition = 1.0;
+      YPosition = 0.0;
+      break;
+    case 3: // Center Left
+      XPosition = 0.0;
+      YPosition = 0.5;
+      break;
+    case 4: // Center
+      XPosition = 0.5;
+      YPosition = 0.5;
+      break;
+    case 5: // Center Right
+      XPosition = 1.0;
+      YPosition = 0.5;
+      break;
+    case 6: // Lower Left
+      XPosition = 0.0;
+      YPosition = 1.0;
+      break;
+    case 7: // Lower Center
+      XPosition = 0.5;
+      YPosition = 1.0;
+      break;
+    case 8: // Lower Right
+      XPosition = 1.0;
+      YPosition = 1.0;
+      break;
+    }
+  }
+  tmp.free();
+
+  if (obj->dictLookup("T", &tmp)->isBool()) {
+    hasTitleBar = tmp.getBool();
+  }
+  tmp.free();
+  if (obj->dictLookup("UC", &tmp)->isBool()) {
+    hasCloseButton = tmp.getBool();
+  }
+  tmp.free();
+  if (obj->dictLookup("R", &tmp)->isInt()) {
+    isResizeable = (tmp.getInt() != 0);
+  }
+  tmp.free();
+
+}
+
+MediaParameters::MediaParameters() {
+  // instanciate to default values
+
+  volume = 100;
+  fittingPolicy = fittingUndefined;
+  autoPlay = gTrue;
+  repeatCount = 1.0;
+  opacity = 1.0;
+  showControls = gFalse;
+  duration = 0;
+}
+
+MediaParameters::~MediaParameters() {
+}
+
+void MediaParameters::parseMediaPlayParameters(Object* obj) {
+  
+  Object tmp;
+
+  if (obj->dictLookup("V", &tmp)->isInt()) {
+    volume = tmp.getInt();
+  }
+  tmp.free();
+
+  if (obj->dictLookup("C", &tmp)->isBool()) {
+    showControls = tmp.getBool();
+  }
+  tmp.free();
+
+  if (obj->dictLookup("F", &tmp)->isInt()) {
+    int t = tmp.getInt();
+    
+    switch(t) {
+    case 0: fittingPolicy = fittingMeet; break;
+    case 1: fittingPolicy = fittingSlice; break;
+    case 2: fittingPolicy = fittingFill; break;
+    case 3: fittingPolicy = fittingScroll; break;
+    case 4: fittingPolicy = fittingHidden; break;
+    case 5: fittingPolicy = fittingUndefined; break;
+    }
+  }
+  tmp.free();
+
+  // duration parsing
+  // duration's default value is set to 0, which means : intrinsinc media duration
+  if (obj->dictLookup("D", &tmp)->isDict()) {
+    Object oname, ddict, tmp2;
+    if (tmp.dictLookup("S", &oname)->isName()) {
+      char* name = oname.getName();
+      if (!strcmp(name, "F"))
+       duration = -1; // infinity
+      else if (!strcmp(name, "T")) {
+       if (tmp.dictLookup("T", &ddict)->isDict()) {
+         if (ddict.dictLookup("V", &tmp2)->isNum()) {
+           duration = Gulong(tmp2.getNum());
+         }
+         tmp2.free();
+       }
+       ddict.free();
+      }
+    }
+    oname.free();
+  }
+  tmp.free();
+
+
+  if (obj->dictLookup("A", &tmp)->isBool()) {
+    autoPlay = tmp.getBool();
+  }
+  tmp.free();
+
+  if (obj->dictLookup("RC", &tmp)->isNum()) {
+    repeatCount = tmp.getNum();
+  }
+  tmp.free();
+
+}
+
+void MediaParameters::parseMediaScreenParameters(Object* obj) {
+  Object tmp;
+
+  if (obj->dictLookup("W", &tmp)->isInt()) {
+    int t = tmp.getInt();
+    
+    switch(t) {
+    case 0: windowParams.type = MediaWindowParameters::windowFloating; break;
+    case 1: windowParams.type = MediaWindowParameters::windowFullscreen; break;
+    case 2: windowParams.type = MediaWindowParameters::windowHidden; break;
+    case 3: windowParams.type = MediaWindowParameters::windowEmbedded; break;
+    }
+  }
+  tmp.free();
+
+  // background color
+  if (obj->dictLookup("B", &tmp)->isArray()) {
+    Array* color = tmp.getArray();
+
+    Object component;
+    
+    color->get(0, &component);
+    bgColor.r = component.getNum();
+    component.free();
+
+    color->get(1, &component);
+    bgColor.g = component.getNum();
+    component.free();
+
+    color->get(2, &component);
+    bgColor.b = component.getNum();
+    component.free();
+  }
+  tmp.free();
+
+
+  // opacity
+  if (obj->dictLookup("O", &tmp)->isNum()) {
+    opacity = tmp.getNum();
+  }
+  tmp.free();
+
+  if (windowParams.type == MediaWindowParameters::windowFloating) {
+    Object winDict;
+    if (obj->dictLookup("F",&winDict)->isDict()) {
+      windowParams.parseFWParams(&winDict);
+    }
+    winDict.free();
+  }
+}
+
+MediaRendition::~MediaRendition() {
+  if (fileName)
+    delete fileName;
+  if (contentType)
+    delete contentType;
+
+  if (embeddedStream && (!embeddedStream->decRef())) {
+    delete embeddedStream;
+  }
+}
+
+MediaRendition::MediaRendition(Object* obj) {
+  Object tmp, tmp2;
+  GBool hasClip = gFalse;
+
+  ok = gTrue;
+  fileName = NULL;
+  contentType = NULL;
+  isEmbedded = gFalse;
+  embeddedStream = NULL;
+
+  //
+  // Parse media clip data
+  //
+  if (obj->dictLookup("C", &tmp2)->isDict()) { // media clip
+    hasClip = gTrue;
+    if (tmp2.dictLookup("S", &tmp)->isName()) {
+      if (!strcmp(tmp.getName(), "MCD")) { // media clip data
+        Object obj1, obj2;
+       if (tmp2.dictLookup("D", &obj1)->isDict()) {
+         if (obj1.dictLookup("F", &obj2)->isString()) {
+           fileName = obj2.getString()->copy();
+         }
+         obj2.free();
+         if (obj1.dictLookup("EF", &obj2)->isDict()) {
+           Object embedded;
+           if (obj2.dictLookup("F", &embedded)->isStream()) {
+             isEmbedded = gTrue;
+             embeddedStream = embedded.getStream();
+             // "copy" stream
+             embeddedStream->incRef();
+           }
+           embedded.free();
+         }
+         obj2.free();
+
+         // TODO: D might be a form XObject too
+       } else {
+         error (errSyntaxError, -1, "Invalid Media Clip Data");
+         ok = gFalse;
+       }
+       obj1.free();
+
+       // FIXME: ignore CT if D is a form XObject
+       if (tmp2.dictLookup("CT", &obj1)->isString()) {
+         contentType = obj1.getString()->copy();
+       }
+       obj1.free();
+      } else if (!strcmp(tmp.getName(), "MCS")) { // media clip data
+        // TODO
+      }
+    } else {
+      error (errSyntaxError, -1, "Invalid Media Clip");
+      ok = gFalse;
+    }
+    tmp.free();
+  }
+  tmp2.free();
+
+  if (!ok)
+    return;
+
+  //
+  // parse Media Play Parameters
+  if (obj->dictLookup("P", &tmp2)->isDict()) { // media play parameters
+    Object params;
+    if (tmp2.dictLookup("MH", &params)->isDict()) {
+      MH.parseMediaPlayParameters(&params);
+    }
+    params.free();
+    if (tmp2.dictLookup("BE", &params)->isDict()) {
+      BE.parseMediaPlayParameters(&params);
+    }
+    params.free();
+  } else if (!hasClip) {
+    error (errSyntaxError, -1, "Invalid Media Rendition");
+    ok = gFalse;
+  }
+  tmp2.free();
+
+  //
+  // parse Media Screen Parameters
+  if (obj->dictLookup("SP", &tmp2)->isDict()) { // media screen parameters
+    Object params;
+    if (tmp2.dictLookup("MH", &params)->isDict()) {
+      MH.parseMediaScreenParameters(&params);
+    }
+    params.free();
+    if (tmp2.dictLookup("BE", &params)->isDict()) {
+      BE.parseMediaScreenParameters(&params);
+    }
+    params.free();
+  }
+  tmp2.free();
+}
+
+void MediaRendition::outputToFile(FILE* fp) {
+  if (!isEmbedded)
+    return;
+
+  embeddedStream->reset();
+
+  while (1) {
+    int c = embeddedStream->getChar();
+    if (c == EOF)
+      break;
+    
+    fwrite(&c, 1, 1, fp);
+  }
+  
+}
+
+MediaRendition *MediaRendition::copy() {
+  // call default copy constructor
+  MediaRendition* new_media = new MediaRendition(*this);
+
+  if (contentType)
+    new_media->contentType = contentType->copy();
+  if (fileName)
+    new_media->fileName = fileName->copy();
+
+  if (new_media->embeddedStream)
+    new_media->embeddedStream->incRef();
+
+  return new_media;
+}
+
+// TODO: SelectorRendition
diff --git a/poppler/Rendition.h b/poppler/Rendition.h
new file mode 100644 (file)
index 0000000..75bfeff
--- /dev/null
@@ -0,0 +1,157 @@
+//*********************************************************************************
+//                               Rendition.h
+//---------------------------------------------------------------------------------
+// 
+//---------------------------------------------------------------------------------
+// Hugo Mercier <hmercier31[at]gmail.com> (c) 2008
+// Carlos Garcia Campos <carlosgc@gnome.org> (c) 2010
+//
+// This program is free software; you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation; either version 2 of the License, or
+// (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with this program; if not, write to the Free Software
+// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+//*********************************************************************************
+
+#ifndef _RENDITION_H_
+#define _RENDITION_H_
+
+#include "Object.h"
+
+struct MediaWindowParameters {
+
+  MediaWindowParameters();
+  ~MediaWindowParameters();
+
+  // parse from a floating window parameters dictionary
+  void parseFWParams(Object* obj);
+
+  enum MediaWindowType {
+    windowFloating = 0,
+    windowFullscreen,
+    windowHidden,
+    windowEmbedded
+  };
+
+  enum MediaWindowRelativeTo {
+    windowRelativeToDocument = 0,
+    windowRelativeToApplication,
+    windowRelativeToDesktop
+  };
+
+
+                                         // DEFAULT VALUE
+
+  MediaWindowType type;                  // movieWindowEmbedded
+  
+
+  int width;                             // -1
+  int height;                            // -1
+  
+  // floating window position
+  MediaWindowRelativeTo relativeTo;      // windowRelativeToDocument (or to desktop)
+  double XPosition;                      // 0.5
+  double YPosition;                      // 0.5
+
+  GBool hasTitleBar;                      // true
+  GBool hasCloseButton;                   // true
+  GBool isResizeable;                     // true
+};
+
+
+struct MediaParameters {
+
+  MediaParameters();
+  ~MediaParameters();
+
+  // parse from a "Media Play Parameters" dictionary
+  void parseMediaPlayParameters(Object* playObj);
+  // parse from a "Media Screen Parameters" dictionary
+  void parseMediaScreenParameters(Object* screenObj);
+
+  enum MediaFittingPolicy {
+    fittingMeet = 0,
+    fittingSlice,
+    fittingFill,
+    fittingScroll,
+    fittingHidden,
+    fittingUndefined
+  };
+
+  struct Color {
+    double r, g, b;
+  };
+
+  int duration;                      // 0
+
+  int volume;                              // 100
+
+  // defined in media play parameters, p 770
+  // correspond to 'fit' SMIL's attribute
+  MediaFittingPolicy fittingPolicy;        // fittingUndefined
+
+  GBool autoPlay;                          // true
+
+  // repeat count, can be real values, 0 means forever
+  double repeatCount;                      // 1.0
+
+  // background color                      // black = (0.0 0.0 0.0)
+  Color bgColor;
+  
+  // opacity in [0.0 1.0]
+  double opacity;                          // 1.0
+  
+
+  GBool showControls;                      // false
+
+  MediaWindowParameters windowParams;
+};
+
+class MediaRendition {
+ public:
+  MediaRendition(Object *obj);
+  ~MediaRendition();
+
+  GBool isOk () { return ok; }
+
+  MediaParameters* getMHParameters() { return &MH; }
+  MediaParameters* getBEParameters() { return &BE; }
+
+  GooString* getContentType() { return contentType; }
+  GooString* getFileName() { return fileName; }
+
+  GBool getIsEmbedded() { return isEmbedded; }
+  Stream* getEmbbededStream() { return embeddedStream; }
+  // write embedded stream to file
+  void outputToFile(FILE*);
+
+  MediaRendition* copy();
+
+ private:
+  GBool ok;
+
+  // "Must Honor" parameters
+  MediaParameters MH;
+  // "Best Effort" parameters
+  MediaParameters BE;
+
+  GBool isEmbedded;
+
+  GooString* contentType;
+
+  // if it's embedded
+  Stream* embeddedStream;
+
+  // if it's not embedded
+  GooString* fileName;
+};
+
+#endif /* _RENDITION_H_ */
diff --git a/poppler/SecurityHandler.cc b/poppler/SecurityHandler.cc
new file mode 100644 (file)
index 0000000..a48449a
--- /dev/null
@@ -0,0 +1,455 @@
+//========================================================================
+//
+// SecurityHandler.cc
+//
+// Copyright 2004 Glyph & Cog, LLC
+//
+//========================================================================
+
+//========================================================================
+//
+// Modified under the Poppler project - http://poppler.freedesktop.org
+//
+// All changes made under the Poppler project to this file are licensed
+// under GPL version 2 or later
+//
+// Copyright (C) 2010, 2012 Albert Astals Cid <aacid@kde.org>
+//
+// To see a description of the changes please see the Changelog file that
+// came with your tarball or type make ChangeLog if you are building from git
+//
+//========================================================================
+
+#include <config.h>
+
+#ifdef USE_GCC_PRAGMAS
+#pragma implementation
+#endif
+
+#include "GooString.h"
+#include "PDFDoc.h"
+#include "Decrypt.h"
+#include "Error.h"
+#include "GlobalParams.h"
+#ifdef ENABLE_PLUGINS
+#  include "XpdfPluginAPI.h"
+#endif
+#include "SecurityHandler.h"
+
+#include <limits.h>
+
+//------------------------------------------------------------------------
+// SecurityHandler
+//------------------------------------------------------------------------
+
+SecurityHandler *SecurityHandler::make(PDFDoc *docA, Object *encryptDictA) {
+  Object filterObj;
+  SecurityHandler *secHdlr;
+#ifdef ENABLE_PLUGINS
+  XpdfSecurityHandler *xsh;
+#endif
+
+  encryptDictA->dictLookup("Filter", &filterObj);
+  if (filterObj.isName("Standard")) {
+    secHdlr = new StandardSecurityHandler(docA, encryptDictA);
+  } else if (filterObj.isName()) {
+#ifdef ENABLE_PLUGINS
+    if ((xsh = globalParams->getSecurityHandler(filterObj.getName()))) {
+      secHdlr = new ExternalSecurityHandler(docA, encryptDictA, xsh);
+    } else {
+#endif
+      error(errSyntaxError, -1, "Couldn't find the '{0:s}' security handler",
+           filterObj.getName());
+      secHdlr = NULL;
+#ifdef ENABLE_PLUGINS
+    }
+#endif
+  } else {
+    error(errSyntaxError, -1,
+         "Missing or invalid 'Filter' entry in encryption dictionary");
+    secHdlr = NULL;
+  }
+  filterObj.free();
+  return secHdlr;
+}
+
+SecurityHandler::SecurityHandler(PDFDoc *docA) {
+  doc = docA;
+}
+
+SecurityHandler::~SecurityHandler() {
+}
+
+GBool SecurityHandler::checkEncryption(GooString *ownerPassword,
+                                      GooString *userPassword) {
+  void *authData;
+  GBool ok;
+  int i;
+
+  if (ownerPassword || userPassword) {
+    authData = makeAuthData(ownerPassword, userPassword);
+  } else {
+    authData = NULL;
+  }
+  ok = authorize(authData);
+  if (authData) {
+    freeAuthData(authData);
+  }
+  for (i = 0; !ok && i < 3; ++i) {
+    if (!(authData = getAuthData())) {
+      break;
+    }
+    ok = authorize(authData);
+    if (authData) {
+      freeAuthData(authData);
+    }
+  }
+  if (!ok) {
+    if (!ownerPassword && !userPassword) {
+      GooString dummy;
+      return checkEncryption(&dummy, &dummy);
+    } else {
+      error(errCommandLine, -1, "Incorrect password");
+    }
+  }
+  return ok;
+}
+
+//------------------------------------------------------------------------
+// StandardSecurityHandler
+//------------------------------------------------------------------------
+
+class StandardAuthData {
+public:
+
+  StandardAuthData(GooString *ownerPasswordA, GooString *userPasswordA) {
+    ownerPassword = ownerPasswordA;
+    userPassword = userPasswordA;
+  }
+
+  ~StandardAuthData() {
+    if (ownerPassword) {
+      delete ownerPassword;
+    }
+    if (userPassword) {
+      delete userPassword;
+    }
+  }
+
+  GooString *ownerPassword;
+  GooString *userPassword;
+};
+
+StandardSecurityHandler::StandardSecurityHandler(PDFDoc *docA,
+                                                Object *encryptDictA):
+  SecurityHandler(docA)
+{
+  Object versionObj, revisionObj, lengthObj;
+  Object ownerKeyObj, userKeyObj, ownerEncObj, userEncObj;
+  Object permObj, fileIDObj, fileIDObj1;
+  Object cryptFiltersObj, streamFilterObj, stringFilterObj;
+  Object cryptFilterObj, cfmObj, cfLengthObj;
+  Object encryptMetadataObj;
+
+  ok = gFalse;
+  fileID = NULL;
+  ownerKey = NULL;
+  userKey = NULL;
+  ownerEnc = NULL;
+  userEnc = NULL;
+  fileKeyLength = 0;
+
+  encryptDictA->dictLookup("V", &versionObj);
+  encryptDictA->dictLookup("R", &revisionObj);
+  encryptDictA->dictLookup("Length", &lengthObj);
+  encryptDictA->dictLookup("O", &ownerKeyObj);
+  encryptDictA->dictLookup("U", &userKeyObj);
+  encryptDictA->dictLookup("OE", &ownerEncObj);
+  encryptDictA->dictLookup("UE", &userEncObj);
+  encryptDictA->dictLookup("P", &permObj);
+  if (permObj.isUint()) {
+      unsigned int permUint = permObj.getUint();
+      int perms = permUint - UINT_MAX - 1;
+      permObj.free();
+      permObj.initInt(perms);
+  }
+  doc->getXRef()->getTrailerDict()->dictLookup("ID", &fileIDObj);
+  if (versionObj.isInt() &&
+      revisionObj.isInt() &&
+      permObj.isInt() &&
+      ownerKeyObj.isString() &&
+      userKeyObj.isString()) {
+    encVersion = versionObj.getInt();
+    encRevision = revisionObj.getInt();
+    if ((encRevision <= 4 &&
+        ownerKeyObj.getString()->getLength() == 32 &&
+        userKeyObj.getString()->getLength() == 32) ||
+       (encRevision == 5 &&
+        // the spec says 48 bytes, but Acrobat pads them out longer
+        ownerKeyObj.getString()->getLength() >= 48 &&
+        userKeyObj.getString()->getLength() >= 48 &&
+        ownerEncObj.isString() &&
+        ownerEncObj.getString()->getLength() == 32 &&
+        userEncObj.isString() &&
+        userEncObj.getString()->getLength() == 32)) {
+      encAlgorithm = cryptRC4;
+      // revision 2 forces a 40-bit key - some buggy PDF generators
+      // set the Length value incorrectly
+      if (encRevision == 2 || !lengthObj.isInt()) {
+       fileKeyLength = 5;
+      } else {
+       fileKeyLength = lengthObj.getInt() / 8;
+      }
+      encryptMetadata = gTrue;
+      //~ this currently only handles a subset of crypt filter functionality
+      //~ (in particular, it ignores the EFF entry in encryptDictA, and
+      //~ doesn't handle the case where StmF, StrF, and EFF are not all the
+      //~ same)
+      if ((encVersion == 4 || encVersion == 5) &&
+         (encRevision == 4 || encRevision == 5)) {
+       encryptDictA->dictLookup("CF", &cryptFiltersObj);
+       encryptDictA->dictLookup("StmF", &streamFilterObj);
+       encryptDictA->dictLookup("StrF", &stringFilterObj);
+       if (cryptFiltersObj.isDict() &&
+           streamFilterObj.isName() &&
+           stringFilterObj.isName() &&
+           !strcmp(streamFilterObj.getName(), stringFilterObj.getName())) {
+         if (!strcmp(streamFilterObj.getName(), "Identity")) {
+           // no encryption on streams or strings
+           encVersion = encRevision = -1;
+         } else {
+           if (cryptFiltersObj.dictLookup(streamFilterObj.getName(),
+                                          &cryptFilterObj)->isDict()) {
+             cryptFilterObj.dictLookup("CFM", &cfmObj);
+             if (cfmObj.isName("V2")) {
+               encVersion = 2;
+               encRevision = 3;
+               if (cryptFilterObj.dictLookup("Length",
+                                             &cfLengthObj)->isInt()) {
+                 //~ according to the spec, this should be cfLengthObj / 8
+                 fileKeyLength = cfLengthObj.getInt();
+               }
+               cfLengthObj.free();
+             } else if (cfmObj.isName("AESV2")) {
+               encVersion = 2;
+               encRevision = 3;
+               encAlgorithm = cryptAES;
+               if (cryptFilterObj.dictLookup("Length",
+                                             &cfLengthObj)->isInt()) {
+                 //~ according to the spec, this should be cfLengthObj / 8
+                 fileKeyLength = cfLengthObj.getInt();
+               }
+               cfLengthObj.free();
+             } else if (cfmObj.isName("AESV3")) {
+               encVersion = 5;
+               encRevision = 5;
+               encAlgorithm = cryptAES256;
+               if (cryptFilterObj.dictLookup("Length",
+                                             &cfLengthObj)->isInt()) {
+                 //~ according to the spec, this should be cfLengthObj / 8
+                 fileKeyLength = cfLengthObj.getInt();
+               }
+               cfLengthObj.free();
+             }
+             cfmObj.free();
+           }
+           cryptFilterObj.free();
+         }
+       }
+       stringFilterObj.free();
+       streamFilterObj.free();
+       cryptFiltersObj.free();
+       if (encryptDictA->dictLookup("EncryptMetadata",
+                                    &encryptMetadataObj)->isBool()) {
+         encryptMetadata = encryptMetadataObj.getBool();
+       }
+       encryptMetadataObj.free();
+      }
+      permFlags = permObj.getInt();
+      ownerKey = ownerKeyObj.getString()->copy();
+      userKey = userKeyObj.getString()->copy();
+      if (encVersion >= 1 && encVersion <= 2 &&
+         encRevision >= 2 && encRevision <= 3) {
+       if (fileIDObj.isArray()) {
+         if (fileIDObj.arrayGet(0, &fileIDObj1)->isString()) {
+           fileID = fileIDObj1.getString()->copy();
+         } else {
+           fileID = new GooString();
+         }
+         fileIDObj1.free();
+       } else {
+         fileID = new GooString();
+       }
+       if (fileKeyLength > 16 || fileKeyLength < 0) {
+         fileKeyLength = 16;
+       }
+       ok = gTrue;
+      } else if (encVersion == 5 && encRevision == 5) {
+       fileID = new GooString(); // unused for V=R=5
+       ownerEnc = ownerEncObj.getString()->copy();
+       userEnc = userEncObj.getString()->copy();
+       if (fileKeyLength > 32 || fileKeyLength < 0) {
+         fileKeyLength = 32;
+       }
+       ok = gTrue;
+      } else if (!(encVersion == -1 && encRevision == -1)) {
+       error(errUnimplemented, -1,
+             "Unsupported version/revision (%d/%d) of Standard security handler",
+             encVersion, encRevision);
+      }
+    } else {
+      error(errSyntaxError, -1, "Invalid encryption key length");
+    }
+  } else {
+    error(errSyntaxError, -1, "Weird encryption info");
+  }
+  fileIDObj.free();
+  permObj.free();
+  userEncObj.free();
+  ownerEncObj.free();
+  userKeyObj.free();
+  ownerKeyObj.free();
+  lengthObj.free();
+  revisionObj.free();
+  versionObj.free();
+}
+
+StandardSecurityHandler::~StandardSecurityHandler() {
+  if (fileID) {
+    delete fileID;
+  }
+  if (ownerKey) {
+    delete ownerKey;
+  }
+  if (userKey) {
+    delete userKey;
+  }
+  if (ownerEnc) {
+    delete ownerEnc;
+  }
+  if (userEnc) {
+    delete userEnc;
+  }
+}
+
+GBool StandardSecurityHandler::isUnencrypted() {
+  return encVersion == -1 && encRevision == -1;
+}
+
+void *StandardSecurityHandler::makeAuthData(GooString *ownerPassword,
+                                           GooString *userPassword) {
+  return new StandardAuthData(ownerPassword ? ownerPassword->copy()
+                                           : (GooString *)NULL,
+                             userPassword ? userPassword->copy()
+                                          : (GooString *)NULL);
+}
+
+void *StandardSecurityHandler::getAuthData() {
+  return NULL;
+}
+
+void StandardSecurityHandler::freeAuthData(void *authData) {
+  delete (StandardAuthData *)authData;
+}
+
+GBool StandardSecurityHandler::authorize(void *authData) {
+  GooString *ownerPassword, *userPassword;
+
+  if (!ok) {
+    return gFalse;
+  }
+  if (authData) {
+    ownerPassword = ((StandardAuthData *)authData)->ownerPassword;
+    userPassword = ((StandardAuthData *)authData)->userPassword;
+  } else {
+    ownerPassword = NULL;
+    userPassword = NULL;
+  }
+  if (!Decrypt::makeFileKey(encVersion, encRevision, fileKeyLength,
+                           ownerKey, userKey, ownerEnc, userEnc,
+                           permFlags, fileID,
+                           ownerPassword, userPassword, fileKey,
+                           encryptMetadata, &ownerPasswordOk)) {
+    return gFalse;
+  }
+  return gTrue;
+}
+
+#ifdef ENABLE_PLUGINS
+
+//------------------------------------------------------------------------
+// ExternalSecurityHandler
+//------------------------------------------------------------------------
+
+ExternalSecurityHandler::ExternalSecurityHandler(PDFDoc *docA,
+                                                Object *encryptDictA,
+                                                XpdfSecurityHandler *xshA):
+  SecurityHandler(docA)
+{
+  encryptDictA->copy(&encryptDict);
+  xsh = xshA;
+  encAlgorithm = cryptRC4; //~ this should be obtained via getKey
+  ok = gFalse;
+
+  if (!(*xsh->newDoc)(xsh->handlerData, (XpdfDoc)docA,
+                     (XpdfObject)encryptDictA, &docData)) {
+    return;
+  }
+
+  ok = gTrue;
+}
+
+ExternalSecurityHandler::~ExternalSecurityHandler() {
+  (*xsh->freeDoc)(xsh->handlerData, docData);
+  encryptDict.free();
+}
+
+void *ExternalSecurityHandler::makeAuthData(GooString *ownerPassword,
+                                           GooString *userPassword) {
+  char *opw, *upw;
+  void *authData;
+
+  opw = ownerPassword ? ownerPassword->getCString() : (char *)NULL;
+  upw = userPassword ? userPassword->getCString() : (char *)NULL;
+  if (!(*xsh->makeAuthData)(xsh->handlerData, docData, opw, upw, &authData)) {
+    return NULL;
+  }
+  return authData;
+}
+
+void *ExternalSecurityHandler::getAuthData() {
+  void *authData;
+
+  if (!(*xsh->getAuthData)(xsh->handlerData, docData, &authData)) {
+    return NULL;
+  }
+  return authData;
+}
+
+void ExternalSecurityHandler::freeAuthData(void *authData) {
+  (*xsh->freeAuthData)(xsh->handlerData, docData, authData);
+}
+
+GBool ExternalSecurityHandler::authorize(void *authData) {
+  char *key;
+  int length;
+
+  if (!ok) {
+    return gFalse;
+  }
+  permFlags = (*xsh->authorize)(xsh->handlerData, docData, authData);
+  if (!(permFlags & xpdfPermissionOpen)) {
+    return gFalse;
+  }
+  if (!(*xsh->getKey)(xsh->handlerData, docData, &key, &length, &encVersion, &encRevision)) {
+    return gFalse;
+  }
+  if ((fileKeyLength = length) > 16) {
+    fileKeyLength = 16;
+  }
+  memcpy(fileKey, key, fileKeyLength);
+  (*xsh->freeKey)(xsh->handlerData, docData, key, length);
+  return gTrue;
+}
+
+#endif // ENABLE_PLUGINS
diff --git a/poppler/SecurityHandler.h b/poppler/SecurityHandler.h
new file mode 100644 (file)
index 0000000..c2991c8
--- /dev/null
@@ -0,0 +1,183 @@
+//========================================================================
+//
+// SecurityHandler.h
+//
+// Copyright 2004 Glyph & Cog, LLC
+//
+//========================================================================
+
+//========================================================================
+//
+// Modified under the Poppler project - http://poppler.freedesktop.org
+//
+// All changes made under the Poppler project to this file are licensed
+// under GPL version 2 or later
+//
+// Copyright (C) 2012 Albert Astals Cid <aacid@kde.org>
+//
+// To see a description of the changes please see the Changelog file that
+// came with your tarball or type make ChangeLog if you are building from git
+//
+//========================================================================
+
+#ifndef SECURITYHANDLER_H
+#define SECURITYHANDLER_H
+
+#include "poppler-config.h"
+
+#ifdef USE_GCC_PRAGMAS
+#pragma interface
+#endif
+
+#include "goo/gtypes.h"
+#include "Object.h"
+
+class GooString;
+class PDFDoc;
+struct XpdfSecurityHandler;
+
+//------------------------------------------------------------------------
+// SecurityHandler
+//------------------------------------------------------------------------
+
+class SecurityHandler {
+public:
+
+  static SecurityHandler *make(PDFDoc *docA, Object *encryptDictA);
+
+  SecurityHandler(PDFDoc *docA);
+  virtual ~SecurityHandler();
+
+  // Returns true if the file is actually unencrypted.
+  virtual GBool isUnencrypted() { return gFalse; }
+
+  // Check the document's encryption.  If the document is encrypted,
+  // this will first try <ownerPassword> and <userPassword> (in
+  // "batch" mode), and if those fail, it will attempt to request a
+  // password from the user.  This is the high-level function that
+  // calls the lower level functions for the specific security handler
+  // (requesting a password three times, etc.).  Returns true if the
+  // document can be opened (if it's unencrypted, or if a correct
+  // password is obtained); false otherwise (encrypted and no correct
+  // password).
+  GBool checkEncryption(GooString *ownerPassword,
+                       GooString *userPassword);
+
+  // Create authorization data for the specified owner and user
+  // passwords.  If the security handler doesn't support "batch" mode,
+  // this function should return NULL.
+  virtual void *makeAuthData(GooString *ownerPassword,
+                            GooString *userPassword) = 0;
+
+  // Construct authorization data, typically by prompting the user for
+  // a password.  Returns an authorization data object, or NULL to
+  // cancel.
+  virtual void *getAuthData() = 0;
+
+  // Free the authorization data returned by makeAuthData or
+  // getAuthData.
+  virtual void freeAuthData(void *authData) = 0;
+
+  // Attempt to authorize the document, using the supplied
+  // authorization data (which may be NULL).  Returns true if
+  // successful (i.e., if at least the right to open the document was
+  // granted).
+  virtual GBool authorize(void *authData) = 0;
+
+  // Return the various authorization parameters.  These are only
+  // valid after authorize has returned true.
+  virtual int getPermissionFlags() = 0;
+  virtual GBool getOwnerPasswordOk() = 0;
+  virtual Guchar *getFileKey() = 0;
+  virtual int getFileKeyLength() = 0;
+  virtual int getEncVersion() = 0;
+  virtual int getEncRevision() = 0;
+  virtual CryptAlgorithm getEncAlgorithm() = 0;
+
+protected:
+
+  PDFDoc *doc;
+};
+
+//------------------------------------------------------------------------
+// StandardSecurityHandler
+//------------------------------------------------------------------------
+
+class StandardSecurityHandler: public SecurityHandler {
+public:
+
+  StandardSecurityHandler(PDFDoc *docA, Object *encryptDictA);
+  virtual ~StandardSecurityHandler();
+
+  virtual GBool isUnencrypted();
+  virtual void *makeAuthData(GooString *ownerPassword,
+                            GooString *userPassword);
+  virtual void *getAuthData();
+  virtual void freeAuthData(void *authData);
+  virtual GBool authorize(void *authData);
+  virtual int getPermissionFlags() { return permFlags; }
+  virtual GBool getOwnerPasswordOk() { return ownerPasswordOk; }
+  virtual Guchar *getFileKey() { return fileKey; }
+  virtual int getFileKeyLength() { return fileKeyLength; }
+  virtual int getEncVersion() { return encVersion; }
+  virtual int getEncRevision() { return encRevision; }
+  virtual CryptAlgorithm getEncAlgorithm() { return encAlgorithm; }
+
+private:
+
+  int permFlags;
+  GBool ownerPasswordOk;
+  Guchar fileKey[32];
+  int fileKeyLength;
+  int encVersion;
+  int encRevision;
+  GBool encryptMetadata;
+  CryptAlgorithm encAlgorithm;
+
+  GooString *ownerKey, *userKey;
+  GooString *ownerEnc, *userEnc;
+  GooString *fileID;
+  GBool ok;
+};
+
+#ifdef ENABLE_PLUGINS
+//------------------------------------------------------------------------
+// ExternalSecurityHandler
+//------------------------------------------------------------------------
+
+class ExternalSecurityHandler: public SecurityHandler {
+public:
+
+  ExternalSecurityHandler(PDFDoc *docA, Object *encryptDictA,
+                         XpdfSecurityHandler *xshA);
+  virtual ~ExternalSecurityHandler();
+
+  virtual void *makeAuthData(GooString *ownerPassword,
+                            GooString *userPassword);
+  virtual void *getAuthData();
+  virtual void freeAuthData(void *authData);
+  virtual GBool authorize(void *authData);
+  virtual int getPermissionFlags() { return permFlags; }
+  virtual GBool getOwnerPasswordOk() { return gFalse; }
+  virtual Guchar *getFileKey() { return fileKey; }
+  virtual int getFileKeyLength() { return fileKeyLength; }
+  virtual int getEncVersion() { return encVersion; }
+  virtual int getEncRevision() { return encRevision; }
+  virtual CryptAlgorithm getEncAlgorithm() { return encAlgorithm; }
+
+private:
+
+  Object encryptDict;
+  XpdfSecurityHandler *xsh;
+  void *docData;
+  int permFlags;
+  Guchar fileKey[16];
+  int fileKeyLength;
+  int encVersion;
+  int encRevision;
+  CryptAlgorithm encAlgorithm;
+  GBool ok;
+};
+#endif // ENABLE_PLUGINS
+
+#endif
diff --git a/poppler/Sound.cc b/poppler/Sound.cc
new file mode 100644 (file)
index 0000000..6129fdc
--- /dev/null
@@ -0,0 +1,145 @@
+/* Sound.cc - an object that holds the sound structure
+ * Copyright (C) 2006-2007, Pino Toscano <pino@kde.org>
+ * Copyright (C) 2009, Albert Astals Cid <aacid@kde.org>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include "GooString.h"
+#include "Object.h"
+#include "Sound.h"
+#include "Stream.h"
+#include "FileSpec.h"
+
+Sound *Sound::parseSound(Object *obj)
+{
+  // let's try to see if this Object is a Sound, according to the PDF specs
+  // (section 9.2)
+  Stream *str = NULL;
+  // the Object must be a Stream
+  if (obj->isStream()) {
+    str = obj->getStream();
+  } else {
+    return NULL;
+  }
+  // the Stream must have a Dict
+  Dict *dict = str->getDict();
+  if (dict == NULL)
+    return NULL;
+  Object tmp;
+  // the Dict must have the 'R' key of type num
+  dict->lookup("R", &tmp);
+  if (tmp.isNum()) {
+    return new Sound(obj);
+  } else {
+    return NULL;
+  }
+}
+
+Sound::Sound(Object *obj, bool readAttrs)
+{
+  streamObj = new Object();
+  streamObj->initNull();
+  obj->copy(streamObj);
+
+  fileName = NULL;
+  samplingRate = 0.0;
+  channels = 1;
+  bitsPerSample = 8;
+  encoding = soundRaw;
+
+  if (readAttrs)
+  {
+    Object tmp;
+    Dict *dict = streamObj->getStream()->getDict();
+    dict->lookup("F", &tmp);
+    if (!tmp.isNull()) {
+      Object obj1;
+      // valid 'F' key -> external file
+      kind = soundExternal;
+      if (getFileSpecNameForPlatform (&tmp, &obj1)) {
+        fileName = obj1.getString()->copy();
+        obj1.free();
+      }
+    } else {
+      // no file specification, then the sound data have to be
+      // extracted from the stream
+      kind = soundEmbedded;
+    }
+    tmp.free();
+    // sampling rate
+    dict->lookup("R", &tmp);
+    if (tmp.isNum()) {
+      samplingRate = tmp.getNum();
+    }
+    tmp.free();
+    // sound channels
+    dict->lookup("C", &tmp);
+    if (tmp.isInt()) {
+      channels = tmp.getInt();
+    }
+    tmp.free();
+    // bits per sample
+    dict->lookup("B", &tmp);
+    if (tmp.isInt()) {
+      bitsPerSample = tmp.getInt();
+    }
+    tmp.free();
+    // encoding format
+    dict->lookup("E", &tmp);
+    if (tmp.isName())
+    {
+      const char *enc = tmp.getName();
+      if (strcmp("Raw", enc) == 0) {
+        encoding = soundRaw;
+      } else if (strcmp("Signed", enc) == 0) {
+        encoding = soundSigned;
+      } else if (strcmp("muLaw", enc) == 0) {
+        encoding = soundMuLaw;
+      } else if (strcmp("ALaw", enc) == 0) {
+        encoding = soundALaw;
+      }
+    }
+    tmp.free();
+  }
+}
+
+Sound::~Sound()
+{
+  delete fileName;
+  streamObj->free();
+  delete streamObj;
+}
+
+Stream *Sound::getStream()
+{
+  return streamObj->getStream();
+}
+
+Sound *Sound::copy()
+{
+  Sound *newsound = new Sound(streamObj, false);
+
+  newsound->kind = kind;
+  if (fileName) {
+    newsound->fileName = fileName->copy();
+  }
+  newsound->samplingRate = samplingRate;
+  newsound->channels = channels;
+  newsound->bitsPerSample = bitsPerSample;
+  newsound->encoding = encoding;
+
+  return newsound;
+}
diff --git a/poppler/Sound.h b/poppler/Sound.h
new file mode 100644 (file)
index 0000000..acb0f8d
--- /dev/null
@@ -0,0 +1,74 @@
+/* Sound.h - an object that holds the sound structure
+ * Copyright (C) 2006-2007, Pino Toscano <pino@kde.org>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#ifndef Sound_H
+#define Sound_H
+
+class GooString;
+class Object;
+class Stream;
+
+//------------------------------------------------------------------------
+
+enum SoundKind {
+  soundEmbedded,               // embedded sound
+  soundExternal                        // external sound
+};
+
+enum SoundEncoding {
+  soundRaw,                    // raw encoding
+  soundSigned,                 // twos-complement values
+  soundMuLaw,                  // mu-law-encoded samples
+  soundALaw                    // A-law-encoded samples
+};
+
+class Sound
+{
+public:
+  // Try to parse the Object s
+  static Sound *parseSound(Object *s);
+
+  // Destructor
+  ~Sound();
+
+  Object *getObject() { return streamObj; }
+  Stream *getStream();
+
+  SoundKind getSoundKind() { return kind; }
+  GooString *getFileName() { return fileName; }
+  double getSamplingRate() { return samplingRate; }
+  int getChannels() { return channels; }
+  int getBitsPerSample() { return bitsPerSample; }
+  SoundEncoding getEncoding() { return encoding; }
+
+  Sound *copy();
+
+private:
+  // Create a sound. The Object obj is ensured to be a Stream with a Dict
+  Sound(Object *obj, bool readAttrs = true);
+
+  Object *streamObj;
+  SoundKind kind;
+  GooString *fileName;
+  double samplingRate;
+  int channels;
+  int bitsPerSample;
+  SoundEncoding encoding;
+};
+
+#endif
diff --git a/poppler/SplashOutputDev.cc b/poppler/SplashOutputDev.cc
new file mode 100644 (file)
index 0000000..9e07060
--- /dev/null
@@ -0,0 +1,4206 @@
+//========================================================================
+//
+// SplashOutputDev.cc
+//
+// Copyright 2003 Glyph & Cog, LLC
+//
+//========================================================================
+
+//========================================================================
+//
+// Modified under the Poppler project - http://poppler.freedesktop.org
+//
+// All changes made under the Poppler project to this file are licensed
+// under GPL version 2 or later
+//
+// Copyright (C) 2005 Takashi Iwai <tiwai@suse.de>
+// Copyright (C) 2006 Stefan Schweizer <genstef@gentoo.org>
+// Copyright (C) 2006-2012 Albert Astals Cid <aacid@kde.org>
+// Copyright (C) 2006 Krzysztof Kowalczyk <kkowalczyk@gmail.com>
+// Copyright (C) 2006 Scott Turner <scotty1024@mac.com>
+// Copyright (C) 2007 Koji Otani <sho@bbr.jp>
+// Copyright (C) 2009 Petr Gajdos <pgajdos@novell.com>
+// Copyright (C) 2009-2012 Thomas Freitag <Thomas.Freitag@alfa.de>
+// Copyright (C) 2009 Carlos Garcia Campos <carlosgc@gnome.org>
+// Copyright (C) 2009 William Bader <williambader@hotmail.com>
+// Copyright (C) 2010 Patrick Spendrin <ps_ml@gmx.de>
+// Copyright (C) 2010 Brian Cameron <brian.cameron@oracle.com>
+// Copyright (C) 2010 Paweł Wiejacha <pawel.wiejacha@gmail.com>
+// Copyright (C) 2010 Christian Feuersänger <cfeuersaenger@googlemail.com>
+// Copyright (C) 2011 Andreas Hartmetz <ahartmetz@gmail.com>
+// Copyright (C) 2011 Andrea Canciani <ranma42@gmail.com>
+// Copyright (C) 2011 Adrian Johnson <ajohnson@redneon.com>
+//
+// To see a description of the changes please see the Changelog file that
+// came with your tarball or type make ChangeLog if you are building from git
+//
+//========================================================================
+
+#include <config.h>
+
+#ifdef USE_GCC_PRAGMAS
+#pragma implementation
+#endif
+
+#include <string.h>
+#include <math.h>
+#include "goo/gfile.h"
+#include "GlobalParams.h"
+#include "Error.h"
+#include "Object.h"
+#include "Gfx.h"
+#include "GfxFont.h"
+#include "Page.h"
+#include "PDFDoc.h"
+#include "Link.h"
+#include "FontEncodingTables.h"
+#include "fofi/FoFiTrueType.h"
+#include "splash/SplashBitmap.h"
+#include "splash/SplashGlyphBitmap.h"
+#include "splash/SplashPattern.h"
+#include "splash/SplashScreen.h"
+#include "splash/SplashPath.h"
+#include "splash/SplashState.h"
+#include "splash/SplashErrorCodes.h"
+#include "splash/SplashFontEngine.h"
+#include "splash/SplashFont.h"
+#include "splash/SplashFontFile.h"
+#include "splash/SplashFontFileID.h"
+#include "splash/Splash.h"
+#include "SplashOutputDev.h"
+
+#ifdef VMS
+#if (__VMS_VER < 70000000)
+extern "C" int unlink(char *filename);
+#endif
+#endif
+
+#ifdef _MSC_VER
+#include <float.h>
+#define isfinite(x) _finite(x)
+#endif
+
+#ifdef __sun
+#include <ieeefp.h>
+#define isfinite(x) finite(x)
+#endif
+
+static inline void convertGfxColor(SplashColorPtr dest,
+                                   SplashColorMode colorMode,
+                                   GfxColorSpace *colorSpace,
+                                   GfxColor *src) {
+  SplashColor color;
+  GfxGray gray;
+  GfxRGB rgb;
+#if SPLASH_CMYK
+  GfxCMYK cmyk;
+#endif
+
+  // make gcc happy
+  color[0] = color[1] = color[2] = 0;
+#if SPLASH_CMYK
+  color[3] = 0;
+#endif
+  switch (colorMode) {
+    case splashModeMono1:
+    case splashModeMono8:
+      colorSpace->getGray(src, &gray);
+      color[0] = colToByte(gray);
+    break;
+    case splashModeXBGR8:
+      color[3] = 255;
+    case splashModeBGR8:
+    case splashModeRGB8:
+      colorSpace->getRGB(src, &rgb);
+      color[0] = colToByte(rgb.r);
+      color[1] = colToByte(rgb.g);
+      color[2] = colToByte(rgb.b);
+    break;
+#if SPLASH_CMYK
+    case splashModeCMYK8:
+      colorSpace->getCMYK(src, &cmyk);
+      color[0] = colToByte(cmyk.c);
+      color[1] = colToByte(cmyk.m);
+      color[2] = colToByte(cmyk.y);
+      color[3] = colToByte(cmyk.k);
+    break;
+#endif
+  }
+  splashColorCopy(dest, color);
+}
+
+//------------------------------------------------------------------------
+// SplashGouraudPattern
+//------------------------------------------------------------------------
+SplashGouraudPattern::SplashGouraudPattern(GBool bDirectColorTranslationA,
+                                           GfxState *stateA, GfxGouraudTriangleShading *shadingA, SplashColorMode modeA) {
+  SplashColor defaultColor;
+  GfxColor srcColor;
+  state = stateA;
+  shading = shadingA;
+  mode = modeA;
+  bDirectColorTranslation = bDirectColorTranslationA;
+  shadingA->getColorSpace()->getDefaultColor(&srcColor);
+  convertGfxColor(defaultColor, mode, shadingA->getColorSpace(), &srcColor);
+}
+
+SplashGouraudPattern::~SplashGouraudPattern() {
+}
+
+void SplashGouraudPattern::getParameterizedColor(double colorinterp, SplashColorMode mode, SplashColorPtr dest) {
+  GfxColor src;
+  GfxColorSpace* srcColorSpace = shading->getColorSpace();
+  int colorComps = 3;
+#if SPLASH_CMYK
+  if (mode == splashModeCMYK8)
+    colorComps=4;
+#endif
+
+  shading->getParameterizedColor(colorinterp, &src);
+
+  if (bDirectColorTranslation) {
+    for (int m = 0; m < colorComps; ++m)
+      dest[m] = colToByte(src.c[m]);
+  } else {
+    convertGfxColor(dest, mode, srcColorSpace, &src);
+  }
+}
+
+//------------------------------------------------------------------------
+// SplashUnivariatePattern
+//------------------------------------------------------------------------
+
+SplashUnivariatePattern::SplashUnivariatePattern(SplashColorMode colorModeA, GfxState *stateA, GfxUnivariateShading *shadingA) {
+  Matrix ctm;
+  double xMin, yMin, xMax, yMax;
+
+  shading = shadingA;
+  state = stateA;
+  colorMode = colorModeA;
+
+  state->getCTM(&ctm);
+  ctm.invertTo(&ictm);
+
+  // get the function domain
+  t0 = shading->getDomain0();
+  t1 = shading->getDomain1();
+  dt = t1 - t0;
+
+  stateA->getUserClipBBox(&xMin, &yMin, &xMax, &yMax);
+  shadingA->setupCache(&ctm, xMin, yMin, xMax, yMax);
+}
+
+SplashUnivariatePattern::~SplashUnivariatePattern() {
+}
+
+GBool SplashUnivariatePattern::getColor(int x, int y, SplashColorPtr c) {
+  GfxColor gfxColor;
+  double xc, yc, t;
+
+  ictm.transform(x, y, &xc, &yc);
+  if (! getParameter (xc, yc, &t))
+      return gFalse;
+
+  shading->getColor(t, &gfxColor);
+  convertGfxColor(c, colorMode, shading->getColorSpace(), &gfxColor);
+  return gTrue;
+}
+
+GBool SplashUnivariatePattern::testPosition(int x, int y) {
+  double xc, yc, t;
+
+  ictm.transform(x, y, &xc, &yc);
+  if (! getParameter (xc, yc, &t))
+      return gFalse;
+  return (t0 < t1) ? (t > t0 && t < t1) : (t > t1 && t < t0);
+}
+
+
+//------------------------------------------------------------------------
+// SplashRadialPattern
+//------------------------------------------------------------------------
+#define RADIAL_EPSILON (1. / 1024 / 1024)
+
+SplashRadialPattern::SplashRadialPattern(SplashColorMode colorModeA, GfxState *stateA, GfxRadialShading *shadingA):
+  SplashUnivariatePattern(colorModeA, stateA, shadingA)
+{
+  SplashColor defaultColor;
+  GfxColor srcColor;
+
+  shadingA->getCoords(&x0, &y0, &r0, &dx, &dy, &dr);
+  dx -= x0;
+  dy -= y0;
+  dr -= r0;
+  a = dx*dx + dy*dy - dr*dr;
+  if (fabs(a) > RADIAL_EPSILON)
+    inva = 1.0 / a;
+  shadingA->getColorSpace()->getDefaultColor(&srcColor);
+  convertGfxColor(defaultColor, colorModeA, shadingA->getColorSpace(), &srcColor);
+}
+
+SplashRadialPattern::~SplashRadialPattern() {
+}
+
+GBool SplashRadialPattern::getParameter(double xs, double ys, double *t) {
+  double b, c, s0, s1;
+
+  // We want to solve this system of equations:
+  //
+  // 1. (x - xc(s))^2 + (y -yc(s))^2 = rc(s)^2
+  // 2. xc(s) = x0 + s * (x1 - xo)
+  // 3. yc(s) = y0 + s * (y1 - yo)
+  // 4. rc(s) = r0 + s * (r1 - ro)
+  //
+  // To simplify the system a little, we translate
+  // our coordinates to have the origin in (x0,y0)
+
+  xs -= x0;
+  ys -= y0;
+
+  // Then we have to solve the equation:
+  //   A*s^2 - 2*B*s + C = 0
+  // where
+  //   A = dx^2  + dy^2  - dr^2
+  //   B = xs*dx + ys*dy + r0*dr
+  //   C = xs^2  + ys^2  - r0^2
+
+  b = xs*dx + ys*dy + r0*dr;
+  c = xs*xs + ys*ys - r0*r0;
+
+  if (fabs(a) <= RADIAL_EPSILON) {
+    // A is 0, thus the equation simplifies to:
+    //   -2*B*s + C = 0
+    // If B is 0, we can either have no solution or an indeterminate
+    // equation, thus we behave as if we had an invalid solution
+    if (fabs(b) <= RADIAL_EPSILON)
+      return gFalse;
+
+    s0 = s1 = 0.5 * c / b;
+  } else {
+    double d;
+
+    d = b*b - a*c;
+    if (d < 0)
+      return gFalse;
+
+    d = sqrt (d);
+    s0 = b + d;
+    s1 = b - d;
+
+    // If A < 0, one of the two solutions will have negative radius,
+    // thus it will be ignored. Otherwise we know that s1 <= s0
+    // (because d >=0 implies b - d <= b + d), so if both are valid it
+    // will be the true solution.
+    s0 *= inva;
+    s1 *= inva;
+  }
+
+  if (r0 + s0 * dr >= 0) {
+    if (0 <= s0 && s0 <= 1) {
+      *t = t0 + dt * s0;
+      return gTrue;
+    } else if (s0 < 0 && shading->getExtend0()) {
+      *t = t0;
+      return gTrue;
+    } else if (s0 > 1 && shading->getExtend1()) {
+      *t = t1;
+      return gTrue;
+    }
+  }
+
+  if (r0 + s1 * dr >= 0) {
+    if (0 <= s1 && s1 <= 1) {
+      *t = t0 + dt * s1;
+      return gTrue;
+    } else if (s1 < 0 && shading->getExtend0()) {
+      *t = t0;
+      return gTrue;
+    } else if (s1 > 1 && shading->getExtend1()) {
+      *t = t1;
+      return gTrue;
+    }
+  }
+
+  return gFalse;
+}
+
+#undef RADIAL_EPSILON
+
+//------------------------------------------------------------------------
+// SplashAxialPattern
+//------------------------------------------------------------------------
+
+SplashAxialPattern::SplashAxialPattern(SplashColorMode colorModeA, GfxState *stateA, GfxAxialShading *shadingA):
+    SplashUnivariatePattern(colorModeA, stateA, shadingA)
+{
+  SplashColor defaultColor;
+  GfxColor srcColor;
+
+  shadingA->getCoords(&x0, &y0, &x1, &y1);
+  dx = x1 - x0;
+  dy = y1 - y0;
+  mul = 1 / (dx * dx + dy * dy);
+  shadingA->getColorSpace()->getDefaultColor(&srcColor);
+  convertGfxColor(defaultColor, colorModeA, shadingA->getColorSpace(), &srcColor);
+}
+
+SplashAxialPattern::~SplashAxialPattern() {
+}
+
+GBool SplashAxialPattern::getParameter(double xc, double yc, double *t) {
+  double s;
+
+  xc -= x0;
+  yc -= y0;
+
+  s = (xc * dx + yc * dy) * mul;
+  if (0 <= s && s <= 1) {
+    *t = t0 + dt * s;
+  } else if (s < 0 && shading->getExtend0()) {
+    *t = t0;
+  } else if (s > 1 && shading->getExtend1()) {
+    *t = t1;
+  } else {
+    return gFalse;
+  }
+
+  return gTrue;
+}
+
+//------------------------------------------------------------------------
+// Type 3 font cache size parameters
+#define type3FontCacheAssoc   8
+#define type3FontCacheMaxSets 8
+#define type3FontCacheSize    (128*1024)
+
+//------------------------------------------------------------------------
+// Divide a 16-bit value (in [0, 255*255]) by 255, returning an 8-bit result.
+static inline Guchar div255(int x) {
+  return (Guchar)((x + (x >> 8) + 0x80) >> 8);
+}
+
+#if SPLASH_CMYK
+
+#include "GfxState_helpers.h"
+
+//-------------------------------------------------------------------------
+// helper for Blend functions (convert CMYK to RGB, do blend, convert back)
+//-------------------------------------------------------------------------
+
+// based in GfxState.cc
+
+static void cmykToRGB(SplashColorPtr cmyk, SplashColor rgb) {
+  double c, m, y, k, c1, m1, y1, k1, r, g, b;
+
+  c = colToDbl(byteToCol(cmyk[0]));
+  m = colToDbl(byteToCol(cmyk[1]));
+  y = colToDbl(byteToCol(cmyk[2]));
+  k = colToDbl(byteToCol(cmyk[3]));
+  c1 = 1 - c;
+  m1 = 1 - m;
+  y1 = 1 - y;
+  k1 = 1 - k;
+  cmykToRGBMatrixMultiplication(c, m, y, k, c1, m1, y1, k1, r, g, b);
+  rgb[0] = colToByte(clip01(dblToCol(r)));
+  rgb[1] = colToByte(clip01(dblToCol(g)));
+  rgb[2] = colToByte(clip01(dblToCol(b)));
+}
+
+static void rgbToCMYK(SplashColor rgb, SplashColorPtr cmyk) {
+  GfxColorComp c, m, y, k;
+
+  c = clip01(gfxColorComp1 - byteToCol(rgb[0]));
+  m = clip01(gfxColorComp1 - byteToCol(rgb[1]));
+  y = clip01(gfxColorComp1 - byteToCol(rgb[2]));
+  k = c;
+  if (m < k) {
+    k = m;
+  }
+  if (y < k) {
+    k = y;
+  }
+  cmyk[0] = colToByte(c - k);
+  cmyk[1] = colToByte(m - k);
+  cmyk[2] = colToByte(y - k);
+  cmyk[3] = colToByte(k);
+}
+
+#endif
+
+//------------------------------------------------------------------------
+// Blend functions
+//------------------------------------------------------------------------
+
+static void splashOutBlendMultiply(SplashColorPtr src, SplashColorPtr dest,
+                                  SplashColorPtr blend, SplashColorMode cm) {
+  int i;
+
+#if SPLASH_CMYK
+  if (cm == splashModeCMYK8) {
+    SplashColor rgbSrc;
+    SplashColor rgbDest;
+    SplashColor rgbBlend;
+    cmykToRGB(src, rgbSrc);
+    cmykToRGB(dest, rgbDest);
+    for (i = 0; i < 3; ++i) {
+      rgbBlend[i] = (rgbDest[i] * rgbSrc[i]) / 255;
+    }
+    rgbToCMYK(rgbBlend, blend);
+  } else
+#endif
+  {
+    for (i = 0; i < splashColorModeNComps[cm]; ++i) {
+      blend[i] = (dest[i] * src[i]) / 255;
+    }
+  }
+}
+
+static void splashOutBlendScreen(SplashColorPtr src, SplashColorPtr dest,
+                                SplashColorPtr blend, SplashColorMode cm) {
+  int i;
+
+#if SPLASH_CMYK
+  if (cm == splashModeCMYK8) {
+    SplashColor rgbSrc;
+    SplashColor rgbDest;
+    SplashColor rgbBlend;
+    cmykToRGB(src, rgbSrc);
+    cmykToRGB(dest, rgbDest);
+    for (i = 0; i < 3; ++i) {
+      rgbBlend[i] = rgbDest[i] + rgbSrc[i] - (rgbDest[i] * rgbSrc[i]) / 255;
+    }
+    rgbToCMYK(rgbBlend, blend);
+  } else
+#endif
+  {
+    for (i = 0; i < splashColorModeNComps[cm]; ++i) {
+      blend[i] = dest[i] + src[i] - (dest[i] * src[i]) / 255;
+    }
+  }
+}
+
+static void splashOutBlendOverlay(SplashColorPtr src, SplashColorPtr dest,
+                                 SplashColorPtr blend, SplashColorMode cm) {
+  int i;
+
+#if SPLASH_CMYK
+  if (cm == splashModeCMYK8) {
+    SplashColor rgbSrc;
+    SplashColor rgbDest;
+    SplashColor rgbBlend;
+    cmykToRGB(src, rgbSrc);
+    cmykToRGB(dest, rgbDest);
+    for (i = 0; i < 3; ++i) {
+      rgbBlend[i] = rgbDest[i] < 0x80
+                      ? (rgbSrc[i] * 2 * rgbDest[i]) / 255
+                      : 255 - 2 * ((255 - rgbSrc[i]) * (255 - rgbDest[i])) / 255;
+    }
+    rgbToCMYK(rgbBlend, blend);
+  } else
+#endif
+  {
+    for (i = 0; i < splashColorModeNComps[cm]; ++i) {
+      blend[i] = dest[i] < 0x80
+                   ? (src[i] * 2 * dest[i]) / 255
+                   : 255 - 2 * ((255 - src[i]) * (255 - dest[i])) / 255;
+    }
+  }
+}
+
+static void splashOutBlendDarken(SplashColorPtr src, SplashColorPtr dest,
+                                SplashColorPtr blend, SplashColorMode cm) {
+  int i;
+
+#if SPLASH_CMYK
+  if (cm == splashModeCMYK8) {
+    SplashColor rgbSrc;
+    SplashColor rgbDest;
+    SplashColor rgbBlend;
+    cmykToRGB(src, rgbSrc);
+    cmykToRGB(dest, rgbDest);
+    for (i = 0; i < 3; ++i) {
+      rgbBlend[i] = rgbDest[i] < rgbSrc[i] ? rgbDest[i] : rgbSrc[i];
+    }
+    rgbToCMYK(rgbBlend, blend);
+  } else
+#endif
+  {
+    for (i = 0; i < splashColorModeNComps[cm]; ++i) {
+      blend[i] = dest[i] < src[i] ? dest[i] : src[i];
+    }
+  }
+}
+
+static void splashOutBlendLighten(SplashColorPtr src, SplashColorPtr dest,
+                                 SplashColorPtr blend, SplashColorMode cm) {
+  int i;
+
+#if SPLASH_CMYK
+  if (cm == splashModeCMYK8) {
+    SplashColor rgbSrc;
+    SplashColor rgbDest;
+    SplashColor rgbBlend;
+    cmykToRGB(src, rgbSrc);
+    cmykToRGB(dest, rgbDest);
+    for (i = 0; i < 3; ++i) {
+      rgbBlend[i] = rgbDest[i] > rgbSrc[i] ? rgbDest[i] : rgbSrc[i];
+    }
+    rgbToCMYK(rgbBlend, blend);
+  } else
+#endif
+  {
+    for (i = 0; i < splashColorModeNComps[cm]; ++i) {
+      blend[i] = dest[i] > src[i] ? dest[i] : src[i];
+    }
+  }
+}
+
+static void splashOutBlendColorDodge(SplashColorPtr src, SplashColorPtr dest,
+                                    SplashColorPtr blend,
+                                    SplashColorMode cm) {
+  int i, x;
+
+#if SPLASH_CMYK
+  if (cm == splashModeCMYK8) {
+    SplashColor rgbSrc;
+    SplashColor rgbDest;
+    SplashColor rgbBlend;
+    cmykToRGB(src, rgbSrc);
+    cmykToRGB(dest, rgbDest);
+    for (i = 0; i < 3; ++i) {
+      if (rgbSrc[i] == 255) {
+        rgbBlend[i] = 255;
+      } else {
+        x = (rgbDest[i] * 255) / (255 - rgbSrc[i]);
+        rgbBlend[i] = x <= 255 ? x : 255;
+      }
+    }
+    rgbToCMYK(rgbBlend, blend);
+  } else
+#endif
+  {
+    for (i = 0; i < splashColorModeNComps[cm]; ++i) {
+      if (src[i] == 255) {
+        blend[i] = 255;
+      } else {
+        x = (dest[i] * 255) / (255 - src[i]);
+        blend[i] = x <= 255 ? x : 255;
+      }
+    }
+  }
+}
+
+static void splashOutBlendColorBurn(SplashColorPtr src, SplashColorPtr dest,
+                                   SplashColorPtr blend, SplashColorMode cm) {
+  int i, x;
+
+#if SPLASH_CMYK
+  if (cm == splashModeCMYK8) {
+    SplashColor rgbSrc;
+    SplashColor rgbDest;
+    SplashColor rgbBlend;
+    cmykToRGB(src, rgbSrc);
+    cmykToRGB(dest, rgbDest);
+    for (i = 0; i < 3; ++i) {
+      if (rgbSrc[i] == 0) {
+        rgbBlend[i] = 0;
+      } else {
+        x = ((255 - rgbDest[i]) * 255) / rgbSrc[i];
+        rgbBlend[i] = x <= 255 ? 255 - x : 0;
+      }
+    }
+    rgbToCMYK(rgbBlend, blend);
+  } else
+#endif
+  {
+    for (i = 0; i < splashColorModeNComps[cm]; ++i) {
+      if (src[i] == 0) {
+        blend[i] = 0;
+      } else {
+        x = ((255 - dest[i]) * 255) / src[i];
+        blend[i] = x <= 255 ? 255 - x : 0;
+      }
+    }
+  }
+}
+
+static void splashOutBlendHardLight(SplashColorPtr src, SplashColorPtr dest,
+                                   SplashColorPtr blend, SplashColorMode cm) {
+  int i;
+
+#if SPLASH_CMYK
+  if (cm == splashModeCMYK8) {
+    SplashColor rgbSrc;
+    SplashColor rgbDest;
+    SplashColor rgbBlend;
+    cmykToRGB(src, rgbSrc);
+    cmykToRGB(dest, rgbDest);
+    for (i = 0; i < 3; ++i) {
+      rgbBlend[i] = rgbSrc[i] < 0x80
+                      ? (rgbDest[i] * 2 * rgbSrc[i]) / 255
+                      : 255 - 2 * ((255 - rgbDest[i]) * (255 - rgbSrc[i])) / 255;
+    }
+    rgbToCMYK(rgbBlend, blend);
+  } else
+#endif
+  {
+    for (i = 0; i < splashColorModeNComps[cm]; ++i) {
+      blend[i] = src[i] < 0x80
+                   ? (dest[i] * 2 * src[i]) / 255
+                   : 255 - 2 * ((255 - dest[i]) * (255 - src[i])) / 255;
+    }
+  }
+}
+
+static void splashOutBlendSoftLight(SplashColorPtr src, SplashColorPtr dest,
+                                   SplashColorPtr blend, SplashColorMode cm) {
+  int i, x;
+
+#if SPLASH_CMYK
+  if (cm == splashModeCMYK8) {
+    SplashColor rgbSrc;
+    SplashColor rgbDest;
+    SplashColor rgbBlend;
+    cmykToRGB(src, rgbSrc);
+    cmykToRGB(dest, rgbDest);
+    for (i = 0; i < 3; ++i) {
+      if (rgbSrc[i] < 0x80) {
+        rgbBlend[i] = rgbDest[i] - (255 - 2 * rgbSrc[i]) * rgbDest[i] * (255 - rgbDest[i]) / (255 * 255);
+      } else {
+        if (rgbDest[i] < 0x40) {
+          x = (((((16 * rgbDest[i] - 12 * 255) * rgbDest[i]) / 255) + 4 * 255) * rgbDest[i]) / 255;
+        } else {
+          x = (int)sqrt(255.0 * rgbDest[i]);
+        }
+        rgbBlend[i] = rgbDest[i] + (2 * rgbSrc[i] - 255) * (x - rgbDest[i]) / 255;
+      }
+    }
+    rgbToCMYK(rgbBlend, blend);
+  } else
+#endif
+  {
+    for (i = 0; i < splashColorModeNComps[cm]; ++i) {
+      if (src[i] < 0x80) {
+        blend[i] = dest[i] - (255 - 2 * src[i]) * dest[i] * (255 - dest[i]) / (255 * 255);
+      } else {
+        if (dest[i] < 0x40) {
+          x = (((((16 * dest[i] - 12 * 255) * dest[i]) / 255) + 4 * 255) * dest[i]) / 255;
+        } else {
+          x = (int)sqrt(255.0 * dest[i]);
+        }
+        blend[i] = dest[i] + (2 * src[i] - 255) * (x - dest[i]) / 255;
+      }
+    }
+  }
+}
+
+static void splashOutBlendDifference(SplashColorPtr src, SplashColorPtr dest,
+                                    SplashColorPtr blend,
+                                    SplashColorMode cm) {
+  int i;
+
+#if SPLASH_CMYK
+  if (cm == splashModeCMYK8) {
+    SplashColor rgbSrc;
+    SplashColor rgbDest;
+    SplashColor rgbBlend;
+    cmykToRGB(src, rgbSrc);
+    cmykToRGB(dest, rgbDest);
+    for (i = 0; i < 3; ++i) {
+      rgbBlend[i] = rgbDest[i] < rgbSrc[i] ? rgbSrc[i] - rgbDest[i] : rgbDest[i] - rgbSrc[i];
+    }
+    rgbToCMYK(rgbBlend, blend);
+  } else
+#endif
+  {
+    for (i = 0; i < splashColorModeNComps[cm]; ++i) {
+      blend[i] = dest[i] < src[i] ? src[i] - dest[i] : dest[i] - src[i];
+    }
+  }
+}
+
+static void splashOutBlendExclusion(SplashColorPtr src, SplashColorPtr dest,
+                                   SplashColorPtr blend, SplashColorMode cm) {
+  int i;
+
+#if SPLASH_CMYK
+  if (cm == splashModeCMYK8) {
+    SplashColor rgbSrc;
+    SplashColor rgbDest;
+    SplashColor rgbBlend;
+    cmykToRGB(src, rgbSrc);
+    cmykToRGB(dest, rgbDest);
+    for (i = 0; i < 3; ++i) {
+      rgbBlend[i] = rgbDest[i] + rgbSrc[i] - (2 * rgbDest[i] * rgbSrc[i]) / 255;
+    }
+    rgbToCMYK(rgbBlend, blend);
+  } else
+#endif
+  {
+    for (i = 0; i < splashColorModeNComps[cm]; ++i) {
+      blend[i] = dest[i] + src[i] - (2 * dest[i] * src[i]) / 255;
+    }
+  }
+}
+
+static int getLum(int r, int g, int b) {
+  return (int)(0.3 * r + 0.59 * g + 0.11 * b);
+}
+
+static int getSat(int r, int g, int b) {
+  int rgbMin, rgbMax;
+
+  rgbMin = rgbMax = r;
+  if (g < rgbMin) {
+    rgbMin = g;
+  } else if (g > rgbMax) {
+    rgbMax = g;
+  }
+  if (b < rgbMin) {
+    rgbMin = b;
+  } else if (b > rgbMax) {
+    rgbMax = b;
+  }
+  return rgbMax - rgbMin;
+}
+
+static void clipColor(int rIn, int gIn, int bIn,
+                     Guchar *rOut, Guchar *gOut, Guchar *bOut) {
+  int lum, rgbMin, rgbMax;
+
+  lum = getLum(rIn, gIn, bIn);
+  rgbMin = rgbMax = rIn;
+  if (gIn < rgbMin) {
+    rgbMin = gIn;
+  } else if (gIn > rgbMax) {
+    rgbMax = gIn;
+  }
+  if (bIn < rgbMin) {
+    rgbMin = bIn;
+  } else if (bIn > rgbMax) {
+    rgbMax = bIn;
+  }
+  if (rgbMin < 0) {
+    *rOut = (Guchar)(lum + ((rIn - lum) * lum) / (lum - rgbMin));
+    *gOut = (Guchar)(lum + ((gIn - lum) * lum) / (lum - rgbMin));
+    *bOut = (Guchar)(lum + ((bIn - lum) * lum) / (lum - rgbMin));
+  } else if (rgbMax > 255) {
+    *rOut = (Guchar)(lum + ((rIn - lum) * (255 - lum)) / (rgbMax - lum));
+    *gOut = (Guchar)(lum + ((gIn - lum) * (255 - lum)) / (rgbMax - lum));
+    *bOut = (Guchar)(lum + ((bIn - lum) * (255 - lum)) / (rgbMax - lum));
+  } else {
+    *rOut = rIn;
+    *gOut = gIn;
+    *bOut = bIn;
+  }
+}
+
+static void setLum(Guchar rIn, Guchar gIn, Guchar bIn, int lum,
+                  Guchar *rOut, Guchar *gOut, Guchar *bOut) {
+  int d;
+
+  d = lum - getLum(rIn, gIn, bIn);
+  clipColor(rIn + d, gIn + d, bIn + d, rOut, gOut, bOut);
+}
+
+static void setSat(Guchar rIn, Guchar gIn, Guchar bIn, int sat,
+                  Guchar *rOut, Guchar *gOut, Guchar *bOut) {
+  int rgbMin, rgbMid, rgbMax;
+  Guchar *minOut, *midOut, *maxOut;
+
+  if (rIn < gIn) {
+    rgbMin = rIn;  minOut = rOut;
+    rgbMid = gIn;  midOut = gOut;
+  } else {
+    rgbMin = gIn;  minOut = gOut;
+    rgbMid = rIn;  midOut = rOut;
+  }
+  if (bIn > rgbMid) {
+    rgbMax = bIn;  maxOut = bOut;
+  } else if (bIn > rgbMin) {
+    rgbMax = rgbMid;  maxOut = midOut;
+    rgbMid = bIn;     midOut = bOut;
+  } else {
+    rgbMax = rgbMid;  maxOut = midOut;
+    rgbMid = rgbMin;  midOut = minOut;
+    rgbMin = bIn;     minOut = bOut;
+  }
+  if (rgbMax > rgbMin) {
+    *midOut = (Guchar)((rgbMid - rgbMin) * sat) / (rgbMax - rgbMin);
+    *maxOut = (Guchar)sat;
+  } else {
+    *midOut = *maxOut = 0;
+  }
+  *minOut = 0;
+}
+
+static void splashOutBlendHue(SplashColorPtr src, SplashColorPtr dest,
+                             SplashColorPtr blend, SplashColorMode cm) {
+  Guchar r0, g0, b0;
+#ifdef SPLASH_CMYK
+  Guchar r1, g1, b1;
+  int i;
+  SplashColor src2, dest2;
+#endif
+
+  switch (cm) {
+  case splashModeMono1:
+  case splashModeMono8:
+    blend[0] = dest[0];
+    break;
+  case splashModeXBGR8:
+    src[3] = 255;
+  case splashModeRGB8:
+  case splashModeBGR8:
+    setSat(src[0], src[1], src[2], getSat(dest[0], dest[1], dest[2]),
+          &r0, &g0, &b0);
+    setLum(r0, g0, b0, getLum(dest[0], dest[1], dest[2]),
+          &blend[0], &blend[1], &blend[2]);
+    break;
+#if SPLASH_CMYK
+  case splashModeCMYK8:
+    for (i = 0; i < 4; i++) {
+      // convert to additive
+      src2[i] = 0xff - src[i];
+      dest2[i] = 0xff - dest[i];
+    }
+    // NB: inputs have already been converted to additive mode
+    setSat(src2[0], src2[1], src2[2], getSat(dest2[0], dest2[1], dest2[2]),
+          &r0, &g0, &b0);
+    setLum(r0, g0, b0, getLum(dest2[0], dest2[1], dest2[2]),
+          &r1, &g1, &b1);
+    blend[0] = r1;
+    blend[1] = g1;
+    blend[2] = b1;
+    blend[3] = dest2[3];
+    for (i = 0; i < 4; i++) {
+      // convert back to subtractive
+      blend[i] = 0xff - blend[i];
+    }
+    break;
+#endif
+  }
+}
+
+static void splashOutBlendSaturation(SplashColorPtr src, SplashColorPtr dest,
+                                    SplashColorPtr blend,
+                                    SplashColorMode cm) {
+  Guchar r0, g0, b0;
+#ifdef SPLASH_CMYK
+  Guchar r1, g1, b1;
+  int i;
+  SplashColor src2, dest2;
+#endif
+
+  switch (cm) {
+  case splashModeMono1:
+  case splashModeMono8:
+    blend[0] = dest[0];
+    break;
+  case splashModeXBGR8:
+    src[3] = 255;
+  case splashModeRGB8:
+  case splashModeBGR8:
+    setSat(dest[0], dest[1], dest[2], getSat(src[0], src[1], src[2]),
+          &r0, &g0, &b0);
+    setLum(r0, g0, b0, getLum(dest[0], dest[1], dest[2]),
+          &blend[0], &blend[1], &blend[2]);
+    break;
+#if SPLASH_CMYK
+  case splashModeCMYK8:
+    for (i = 0; i < 4; i++) {
+      // convert to additive
+      src2[i] = 0xff - src[i];
+      dest2[i] = 0xff - dest[i];
+    }
+    setSat(dest2[0], dest2[1], dest2[2], getSat(src2[0], src2[1], src2[2]),
+          &r0, &g0, &b0);
+    setLum(r0, g0, b0, getLum(dest2[0], dest2[1], dest2[2]),
+          &r1, &g1, &b1);
+    blend[0] = r1;
+    blend[1] = g1;
+    blend[2] = b1;
+    blend[3] = dest2[3];
+    for (i = 0; i < 4; i++) {
+      // convert back to subtractive
+      blend[i] = 0xff - blend[i];
+    }
+    break;
+#endif
+  }
+}
+
+static void splashOutBlendColor(SplashColorPtr src, SplashColorPtr dest,
+                               SplashColorPtr blend, SplashColorMode cm) {
+#if SPLASH_CMYK
+  Guchar r, g, b;
+  int i;
+  SplashColor src2, dest2;
+#endif
+
+  switch (cm) {
+  case splashModeMono1:
+  case splashModeMono8:
+    blend[0] = dest[0];
+    break;
+  case splashModeXBGR8:
+    src[3] = 255;
+  case splashModeRGB8:
+  case splashModeBGR8:
+    setLum(src[0], src[1], src[2], getLum(dest[0], dest[1], dest[2]),
+          &blend[0], &blend[1], &blend[2]);
+    break;
+#if SPLASH_CMYK
+  case splashModeCMYK8:
+    for (i = 0; i < 4; i++) {
+      // convert to additive
+      src2[i] = 0xff - src[i];
+      dest2[i] = 0xff - dest[i];
+    }
+    setLum(src2[0], src2[1], src2[2], getLum(dest2[0], dest2[1], dest2[2]),
+          &r, &g, &b);
+    blend[0] = r;
+    blend[1] = g;
+    blend[2] = b;
+    blend[3] = dest2[3];
+    for (i = 0; i < 4; i++) {
+      // convert back to subtractive
+      blend[i] = 0xff - blend[i];
+    }
+    break;
+#endif
+  }
+}
+
+static void splashOutBlendLuminosity(SplashColorPtr src, SplashColorPtr dest,
+                                    SplashColorPtr blend,
+                                    SplashColorMode cm) {
+#if SPLASH_CMYK
+  Guchar r, g, b;
+  int i;
+  SplashColor src2, dest2;
+#endif
+
+  switch (cm) {
+  case splashModeMono1:
+  case splashModeMono8:
+    blend[0] = dest[0];
+    break;
+  case splashModeXBGR8:
+    src[3] = 255;
+  case splashModeRGB8:
+  case splashModeBGR8:
+    setLum(dest[0], dest[1], dest[2], getLum(src[0], src[1], src[2]),
+          &blend[0], &blend[1], &blend[2]);
+    break;
+#if SPLASH_CMYK
+  case splashModeCMYK8:
+    for (i = 0; i < 4; i++) {
+      // convert to additive
+      src2[i] = 0xff - src[i];
+      dest2[i] = 0xff - dest[i];
+    }
+    setLum(dest2[0], dest2[1], dest2[2], getLum(src2[0], src2[1], src2[2]),
+          &r, &g, &b);
+    blend[0] = r;
+    blend[1] = g;
+    blend[2] = b;
+    blend[3] = src2[3];
+    for (i = 0; i < 4; i++) {
+      // convert back to subtractive
+      blend[i] = 0xff - blend[i];
+    }
+    break;
+#endif
+  }
+}
+
+// NB: This must match the GfxBlendMode enum defined in GfxState.h.
+static const SplashBlendFunc splashOutBlendFuncs[] = {
+  NULL,
+  &splashOutBlendMultiply,
+  &splashOutBlendScreen,
+  &splashOutBlendOverlay,
+  &splashOutBlendDarken,
+  &splashOutBlendLighten,
+  &splashOutBlendColorDodge,
+  &splashOutBlendColorBurn,
+  &splashOutBlendHardLight,
+  &splashOutBlendSoftLight,
+  &splashOutBlendDifference,
+  &splashOutBlendExclusion,
+  &splashOutBlendHue,
+  &splashOutBlendSaturation,
+  &splashOutBlendColor,
+  &splashOutBlendLuminosity
+};
+
+//------------------------------------------------------------------------
+// SplashOutFontFileID
+//------------------------------------------------------------------------
+
+class SplashOutFontFileID: public SplashFontFileID {
+public:
+
+  SplashOutFontFileID(Ref *rA) { r = *rA; }
+
+  ~SplashOutFontFileID() {}
+
+  GBool matches(SplashFontFileID *id) {
+    return ((SplashOutFontFileID *)id)->r.num == r.num &&
+           ((SplashOutFontFileID *)id)->r.gen == r.gen;
+  }
+
+private:
+
+  Ref r;
+};
+
+//------------------------------------------------------------------------
+// T3FontCache
+//------------------------------------------------------------------------
+
+struct T3FontCacheTag {
+  Gushort code;
+  Gushort mru;                 // valid bit (0x8000) and MRU index
+};
+
+class T3FontCache {
+public:
+
+  T3FontCache(Ref *fontID, double m11A, double m12A,
+             double m21A, double m22A,
+             int glyphXA, int glyphYA, int glyphWA, int glyphHA,
+             GBool aa, GBool validBBoxA);
+  ~T3FontCache();
+  GBool matches(Ref *idA, double m11A, double m12A,
+               double m21A, double m22A)
+    { return fontID.num == idA->num && fontID.gen == idA->gen &&
+            m11 == m11A && m12 == m12A && m21 == m21A && m22 == m22A; }
+
+  Ref fontID;                  // PDF font ID
+  double m11, m12, m21, m22;   // transform matrix
+  int glyphX, glyphY;          // pixel offset of glyph bitmaps
+  int glyphW, glyphH;          // size of glyph bitmaps, in pixels
+  GBool validBBox;             // false if the bbox was [0 0 0 0]
+  int glyphSize;               // size of glyph bitmaps, in bytes
+  int cacheSets;               // number of sets in cache
+  int cacheAssoc;              // cache associativity (glyphs per set)
+  Guchar *cacheData;           // glyph pixmap cache
+  T3FontCacheTag *cacheTags;   // cache tags, i.e., char codes
+};
+
+T3FontCache::T3FontCache(Ref *fontIDA, double m11A, double m12A,
+                        double m21A, double m22A,
+                        int glyphXA, int glyphYA, int glyphWA, int glyphHA,
+                        GBool validBBoxA, GBool aa) {
+  int i;
+
+  fontID = *fontIDA;
+  m11 = m11A;
+  m12 = m12A;
+  m21 = m21A;
+  m22 = m22A;
+  glyphX = glyphXA;
+  glyphY = glyphYA;
+  glyphW = glyphWA;
+  glyphH = glyphHA;
+  validBBox = validBBoxA;
+  // sanity check for excessively large glyphs (which most likely
+  // indicate an incorrect BBox)
+  i = glyphW * glyphH;
+  if (i > 100000 || glyphW > INT_MAX / glyphH || glyphW <= 0 || glyphH <= 0) {
+    glyphW = glyphH = 100;
+    validBBox = gFalse;
+  }
+  if (aa) {
+    glyphSize = glyphW * glyphH;
+  } else {
+    glyphSize = ((glyphW + 7) >> 3) * glyphH;
+  }
+  cacheAssoc = type3FontCacheAssoc;
+  for (cacheSets = type3FontCacheMaxSets;
+       cacheSets > 1 &&
+        cacheSets * cacheAssoc * glyphSize > type3FontCacheSize;
+       cacheSets >>= 1) ;
+  if (glyphSize < 10485760 / cacheAssoc / cacheSets) {
+    cacheData = (Guchar *)gmallocn_checkoverflow(cacheSets * cacheAssoc, glyphSize);
+  } else {
+    error(errSyntaxWarning, -1, "Not creating cacheData for T3FontCache, it asked for too much memory.\n"
+              "       This could teoretically result in wrong rendering,\n"
+              "       but most probably the document is bogus.\n"
+              "       Please report a bug if you think the rendering may be wrong because of this.");
+    cacheData = NULL;
+  }
+  if (cacheData != NULL)
+  {
+    cacheTags = (T3FontCacheTag *)gmallocn(cacheSets * cacheAssoc,
+                                        sizeof(T3FontCacheTag));
+    for (i = 0; i < cacheSets * cacheAssoc; ++i) {
+      cacheTags[i].mru = i & (cacheAssoc - 1);
+    }
+  }
+  else
+  {
+    cacheTags = NULL;
+  }
+}
+
+T3FontCache::~T3FontCache() {
+  gfree(cacheData);
+  gfree(cacheTags);
+}
+
+struct T3GlyphStack {
+  Gushort code;                        // character code
+
+  //----- cache info
+  T3FontCache *cache;          // font cache for the current font
+  T3FontCacheTag *cacheTag;    // pointer to cache tag for the glyph
+  Guchar *cacheData;           // pointer to cache data for the glyph
+
+  //----- saved state
+  SplashBitmap *origBitmap;
+  Splash *origSplash;
+  double origCTM4, origCTM5;
+
+  T3GlyphStack *next;          // next object on stack
+};
+
+//------------------------------------------------------------------------
+// SplashTransparencyGroup
+//------------------------------------------------------------------------
+
+struct SplashTransparencyGroup {
+  int tx, ty;                  // translation coordinates
+  SplashBitmap *tBitmap;       // bitmap for transparency group
+  GfxColorSpace *blendingColorSpace;
+  GBool isolated;
+
+  //----- for knockout
+  SplashBitmap *shape;
+  GBool knockout;
+  SplashCoord knockoutOpacity;
+
+  //----- saved state
+  SplashBitmap *origBitmap;
+  Splash *origSplash;
+
+  SplashTransparencyGroup *next;
+};
+
+//------------------------------------------------------------------------
+// SplashOutputDev
+//------------------------------------------------------------------------
+
+SplashOutputDev::SplashOutputDev(SplashColorMode colorModeA,
+                                int bitmapRowPadA,
+                                GBool reverseVideoA,
+                                SplashColorPtr paperColorA,
+                                GBool bitmapTopDownA,
+                                GBool allowAntialiasA) {
+  colorMode = colorModeA;
+  bitmapRowPad = bitmapRowPadA;
+  bitmapTopDown = bitmapTopDownA;
+  bitmapUpsideDown = gFalse;
+  allowAntialias = allowAntialiasA;
+  vectorAntialias = allowAntialias &&
+                     globalParams->getVectorAntialias() &&
+                     colorMode != splashModeMono1;
+  enableFreeTypeHinting = gFalse;
+  enableSlightHinting = gFalse;
+  setupScreenParams(72.0, 72.0);
+  reverseVideo = reverseVideoA;
+  if (paperColorA != NULL) {
+    splashColorCopy(paperColor, paperColorA);
+  } else {
+    splashClearColor(paperColor);
+  }
+  skipHorizText = gFalse;
+  skipRotatedText = gFalse;
+  keepAlphaChannel = paperColorA == NULL;
+
+  doc = NULL;
+
+  bitmap = new SplashBitmap(1, 1, bitmapRowPad, colorMode,
+                           colorMode != splashModeMono1, bitmapTopDown);
+  splash = new Splash(bitmap, vectorAntialias, &screenParams);
+  splash->setMinLineWidth(globalParams->getMinLineWidth());
+  splash->clear(paperColor, 0);
+
+  fontEngine = NULL;
+
+  nT3Fonts = 0;
+  t3GlyphStack = NULL;
+
+  font = NULL;
+  needFontUpdate = gFalse;
+  textClipPath = NULL;
+  transpGroupStack = NULL;
+  nestCount = 0;
+}
+
+void SplashOutputDev::setupScreenParams(double hDPI, double vDPI) {
+  screenParams.size = globalParams->getScreenSize();
+  screenParams.dotRadius = globalParams->getScreenDotRadius();
+  screenParams.gamma = (SplashCoord)globalParams->getScreenGamma();
+  screenParams.blackThreshold =
+      (SplashCoord)globalParams->getScreenBlackThreshold();
+  screenParams.whiteThreshold =
+      (SplashCoord)globalParams->getScreenWhiteThreshold();
+  switch (globalParams->getScreenType()) {
+  case screenDispersed:
+    screenParams.type = splashScreenDispersed;
+    if (screenParams.size < 0) {
+      screenParams.size = 4;
+    }
+    break;
+  case screenClustered:
+    screenParams.type = splashScreenClustered;
+    if (screenParams.size < 0) {
+      screenParams.size = 10;
+    }
+    break;
+  case screenStochasticClustered:
+    screenParams.type = splashScreenStochasticClustered;
+    if (screenParams.size < 0) {
+      screenParams.size = 64;
+    }
+    if (screenParams.dotRadius < 0) {
+      screenParams.dotRadius = 2;
+    }
+    break;
+  case screenUnset:
+  default:
+    // use clustered dithering for resolution >= 300 dpi
+    // (compare to 299.9 to avoid floating point issues)
+    if (hDPI > 299.9 && vDPI > 299.9) {
+      screenParams.type = splashScreenStochasticClustered;
+      if (screenParams.size < 0) {
+       screenParams.size = 64;
+      }
+      if (screenParams.dotRadius < 0) {
+       screenParams.dotRadius = 2;
+      }
+    } else {
+      screenParams.type = splashScreenDispersed;
+      if (screenParams.size < 0) {
+       screenParams.size = 4;
+      }
+    }
+  }
+}
+
+SplashOutputDev::~SplashOutputDev() {
+  int i;
+
+  for (i = 0; i < nT3Fonts; ++i) {
+    delete t3FontCache[i];
+  }
+  if (fontEngine) {
+    delete fontEngine;
+  }
+  if (splash) {
+    delete splash;
+  }
+  if (bitmap) {
+    delete bitmap;
+  }
+}
+
+void SplashOutputDev::startDoc(PDFDoc *docA) {
+  int i;
+
+  doc = docA;
+  if (fontEngine) {
+    delete fontEngine;
+  }
+  fontEngine = new SplashFontEngine(
+#if HAVE_T1LIB_H
+                                   globalParams->getEnableT1lib(),
+#endif
+#if HAVE_FREETYPE_FREETYPE_H || HAVE_FREETYPE_H
+                                   globalParams->getEnableFreeType(),
+                                   enableFreeTypeHinting,
+                                   enableSlightHinting,
+#endif
+                                   allowAntialias &&
+                                     globalParams->getAntialias() &&
+                                     colorMode != splashModeMono1);
+  for (i = 0; i < nT3Fonts; ++i) {
+    delete t3FontCache[i];
+  }
+  nT3Fonts = 0;
+}
+
+void SplashOutputDev::startPage(int pageNum, GfxState *state) {
+  int w, h;
+  double *ctm;
+  SplashCoord mat[6];
+  SplashColor color;
+
+  if (state) {
+    setupScreenParams(state->getHDPI(), state->getVDPI());
+    w = (int)(state->getPageWidth() + 0.5);
+    if (w <= 0) {
+      w = 1;
+    }
+    h = (int)(state->getPageHeight() + 0.5);
+    if (h <= 0) {
+      h = 1;
+    }
+  } else {
+    w = h = 1;
+  }
+  if (splash) {
+    delete splash;
+    splash = NULL;
+  }
+  if (!bitmap || w != bitmap->getWidth() || h != bitmap->getHeight()) {
+    if (bitmap) {
+      delete bitmap;
+      bitmap = NULL;
+    }
+    bitmap = new SplashBitmap(w, h, bitmapRowPad, colorMode,
+                             colorMode != splashModeMono1, bitmapTopDown);
+  }
+  splash = new Splash(bitmap, vectorAntialias, &screenParams);
+  splash->setMinLineWidth(globalParams->getMinLineWidth());
+  if (state) {
+    ctm = state->getCTM();
+    mat[0] = (SplashCoord)ctm[0];
+    mat[1] = (SplashCoord)ctm[1];
+    mat[2] = (SplashCoord)ctm[2];
+    mat[3] = (SplashCoord)ctm[3];
+    mat[4] = (SplashCoord)ctm[4];
+    mat[5] = (SplashCoord)ctm[5];
+    splash->setMatrix(mat);
+  }
+  switch (colorMode) {
+  case splashModeMono1:
+  case splashModeMono8:
+    color[0] = 0;
+    break;
+  case splashModeXBGR8:
+    color[3] = 255;
+  case splashModeRGB8:
+  case splashModeBGR8:
+    color[0] = color[1] = color[2] = 0;
+    break;
+#if SPLASH_CMYK
+  case splashModeCMYK8:
+    color[0] = color[1] = color[2] = color[3] = 0;
+    break;
+#endif
+  }
+  splash->setStrokePattern(new SplashSolidColor(color));
+  splash->setFillPattern(new SplashSolidColor(color));
+  splash->setLineCap(splashLineCapButt);
+  splash->setLineJoin(splashLineJoinMiter);
+  splash->setLineDash(NULL, 0, 0);
+  splash->setMiterLimit(10);
+  splash->setFlatness(1);
+  // the SA parameter supposedly defaults to false, but Acrobat
+  // apparently hardwires it to true
+  splash->setStrokeAdjust(globalParams->getStrokeAdjust());
+  splash->clear(paperColor, 0);
+}
+
+void SplashOutputDev::endPage() {
+  if (colorMode != splashModeMono1 && !keepAlphaChannel) {
+    splash->compositeBackground(paperColor);
+  }
+}
+
+void SplashOutputDev::saveState(GfxState *state) {
+  splash->saveState();
+}
+
+void SplashOutputDev::restoreState(GfxState *state) {
+  splash->restoreState();
+  needFontUpdate = gTrue;
+}
+
+void SplashOutputDev::updateAll(GfxState *state) {
+  updateLineDash(state);
+  updateLineJoin(state);
+  updateLineCap(state);
+  updateLineWidth(state);
+  updateFlatness(state);
+  updateMiterLimit(state);
+  updateStrokeAdjust(state);
+  updateFillColor(state);
+  updateStrokeColor(state);
+  needFontUpdate = gTrue;
+}
+
+void SplashOutputDev::updateCTM(GfxState *state, double m11, double m12,
+                               double m21, double m22,
+                               double m31, double m32) {
+  double *ctm;
+  SplashCoord mat[6];
+
+  ctm = state->getCTM();
+  mat[0] = (SplashCoord)ctm[0];
+  mat[1] = (SplashCoord)ctm[1];
+  mat[2] = (SplashCoord)ctm[2];
+  mat[3] = (SplashCoord)ctm[3];
+  mat[4] = (SplashCoord)ctm[4];
+  mat[5] = (SplashCoord)ctm[5];
+  splash->setMatrix(mat);
+}
+
+void SplashOutputDev::updateLineDash(GfxState *state) {
+  double *dashPattern;
+  int dashLength;
+  double dashStart;
+  SplashCoord dash[20];
+  int i;
+
+  state->getLineDash(&dashPattern, &dashLength, &dashStart);
+  if (dashLength > 20) {
+    dashLength = 20;
+  }
+  for (i = 0; i < dashLength; ++i) {
+    dash[i] = (SplashCoord)dashPattern[i];
+    if (dash[i] < 0) {
+      dash[i] = 0;
+    }
+  }
+  splash->setLineDash(dash, dashLength, (SplashCoord)dashStart);
+}
+
+void SplashOutputDev::updateFlatness(GfxState *state) {
+#if 0 // Acrobat ignores the flatness setting, and always renders curves
+      // with a fairly small flatness value
+   splash->setFlatness(state->getFlatness());
+#endif
+}
+
+void SplashOutputDev::updateLineJoin(GfxState *state) {
+  splash->setLineJoin(state->getLineJoin());
+}
+
+void SplashOutputDev::updateLineCap(GfxState *state) {
+  splash->setLineCap(state->getLineCap());
+}
+
+void SplashOutputDev::updateMiterLimit(GfxState *state) {
+  splash->setMiterLimit(state->getMiterLimit());
+}
+
+void SplashOutputDev::updateLineWidth(GfxState *state) {
+  splash->setLineWidth(state->getLineWidth());
+}
+
+void SplashOutputDev::updateStrokeAdjust(GfxState * /*state*/) {
+#if 0 // the SA parameter supposedly defaults to false, but Acrobat
+      // apparently hardwires it to true
+  splash->setStrokeAdjust(state->getStrokeAdjust());
+#endif
+}
+
+void SplashOutputDev::updateFillColor(GfxState *state) {
+  GfxGray gray;
+  GfxRGB rgb;
+#if SPLASH_CMYK
+  GfxCMYK cmyk;
+#endif
+
+  switch (colorMode) {
+  case splashModeMono1:
+  case splashModeMono8:
+    state->getFillGray(&gray);
+    splash->setFillPattern(getColor(gray));
+    break;
+  case splashModeXBGR8:
+  case splashModeRGB8:
+  case splashModeBGR8:
+    state->getFillRGB(&rgb);
+    splash->setFillPattern(getColor(&rgb));
+    break;
+#if SPLASH_CMYK
+  case splashModeCMYK8:
+    state->getFillCMYK(&cmyk);
+    splash->setFillPattern(getColor(&cmyk));
+    break;
+#endif
+  }
+}
+
+void SplashOutputDev::updateStrokeColor(GfxState *state) {
+  GfxGray gray;
+  GfxRGB rgb;
+#if SPLASH_CMYK
+  GfxCMYK cmyk;
+#endif
+
+  switch (colorMode) {
+  case splashModeMono1:
+  case splashModeMono8:
+    state->getStrokeGray(&gray);
+    splash->setStrokePattern(getColor(gray));
+    break;
+  case splashModeXBGR8:
+  case splashModeRGB8:
+  case splashModeBGR8:
+    state->getStrokeRGB(&rgb);
+    splash->setStrokePattern(getColor(&rgb));
+    break;
+#if SPLASH_CMYK
+  case splashModeCMYK8:
+    state->getStrokeCMYK(&cmyk);
+    splash->setStrokePattern(getColor(&cmyk));
+    break;
+#endif
+  }
+}
+
+SplashPattern *SplashOutputDev::getColor(GfxGray gray) {
+  SplashColor color;
+
+  if (reverseVideo) {
+    gray = gfxColorComp1 - gray;
+  }
+  color[0] = colToByte(gray);
+  return new SplashSolidColor(color);
+}
+
+SplashPattern *SplashOutputDev::getColor(GfxRGB *rgb) {
+  GfxColorComp r, g, b;
+  SplashColor color;
+
+  if (reverseVideo) {
+    r = gfxColorComp1 - rgb->r;
+    g = gfxColorComp1 - rgb->g;
+    b = gfxColorComp1 - rgb->b;
+  } else {
+    r = rgb->r;
+    g = rgb->g;
+    b = rgb->b;
+  }
+  color[0] = colToByte(r);
+  color[1] = colToByte(g);
+  color[2] = colToByte(b);
+  if (colorMode == splashModeXBGR8) color[3] = 255;
+  return new SplashSolidColor(color);
+}
+
+#if SPLASH_CMYK
+SplashPattern *SplashOutputDev::getColor(GfxCMYK *cmyk) {
+  SplashColor color;
+
+  color[0] = colToByte(cmyk->c);
+  color[1] = colToByte(cmyk->m);
+  color[2] = colToByte(cmyk->y);
+  color[3] = colToByte(cmyk->k);
+  return new SplashSolidColor(color);
+}
+#endif
+
+void SplashOutputDev::setOverprintMask(GfxColorSpace *colorSpace,
+                                      GBool overprintFlag,
+                                      int overprintMode,
+                                      GfxColor *singleColor,
+                                      GBool grayIndexed) {
+#if SPLASH_CMYK
+  Guint mask;
+  GfxCMYK cmyk;
+  GBool additive = gFalse;
+  int i;
+
+  if (colorSpace->getMode() == csIndexed) {
+    setOverprintMask(((GfxIndexedColorSpace *)colorSpace)->getBase(),
+                    overprintFlag,
+                    overprintMode,
+                    singleColor,
+                    grayIndexed);
+               return;
+       }
+  if (overprintFlag && globalParams->getOverprintPreview()) {
+    mask = colorSpace->getOverprintMask();
+    if (singleColor && overprintMode &&
+       colorSpace->getMode() == csDeviceCMYK) {
+      colorSpace->getCMYK(singleColor, &cmyk);
+      if (cmyk.c == 0) {
+       mask &= ~1;
+      }
+      if (cmyk.m == 0) {
+       mask &= ~2;
+      }
+      if (cmyk.y == 0) {
+       mask &= ~4;
+      }
+      if (cmyk.k == 0) {
+       mask &= ~8;
+      }
+    }
+    if (grayIndexed) {
+      mask &= ~7;
+    } else if (colorSpace->getMode() == csSeparation) {
+      GfxSeparationColorSpace *deviceSep = (GfxSeparationColorSpace *)colorSpace;
+      additive = deviceSep->getName()->cmp("All") != 0 && mask == 0x0f && !deviceSep->isNonMarking();
+    } else if (colorSpace->getMode() == csDeviceN) {
+      GfxDeviceNColorSpace *deviceNCS = (GfxDeviceNColorSpace *)colorSpace;
+      additive = mask == 0x0f && !deviceNCS->isNonMarking();
+      for (i = 0; i < deviceNCS->getNComps() && additive; i++) {
+        if (deviceNCS->getColorantName(i)->cmp("Cyan") == 0) {
+          additive = gFalse;
+        } else if (deviceNCS->getColorantName(i)->cmp("Magenta") == 0) {
+          additive = gFalse;
+        } else if (deviceNCS->getColorantName(i)->cmp("Yellow") == 0) {
+          additive = gFalse;
+        } else if (deviceNCS->getColorantName(i)->cmp("Black") == 0) {
+          additive = gFalse;
+        }
+      }
+    }
+  } else {
+    mask = 0xffffffff;
+  }
+  splash->setOverprintMask(mask, additive);
+#endif
+}
+
+void SplashOutputDev::updateBlendMode(GfxState *state) {
+  splash->setBlendFunc(splashOutBlendFuncs[state->getBlendMode()]);
+}
+
+void SplashOutputDev::updateFillOpacity(GfxState *state) {
+  splash->setFillAlpha((SplashCoord)state->getFillOpacity());
+  if (transpGroupStack != NULL && (SplashCoord)state->getFillOpacity() < transpGroupStack->knockoutOpacity) {
+    transpGroupStack->knockoutOpacity = (SplashCoord)state->getFillOpacity();
+  }
+}
+
+void SplashOutputDev::updateStrokeOpacity(GfxState *state) {
+  splash->setStrokeAlpha((SplashCoord)state->getStrokeOpacity());
+  if (transpGroupStack != NULL && (SplashCoord)state->getStrokeOpacity() < transpGroupStack->knockoutOpacity) {
+    transpGroupStack->knockoutOpacity = (SplashCoord)state->getStrokeOpacity();
+  }
+}
+
+void SplashOutputDev::updateFillOverprint(GfxState *state) {
+  splash->setFillOverprint(state->getFillOverprint());
+}
+
+void SplashOutputDev::updateStrokeOverprint(GfxState *state) {
+  splash->setStrokeOverprint(state->getStrokeOverprint());
+}
+
+void SplashOutputDev::updateOverprintMode(GfxState *state) {
+  splash->setOverprintMode(state->getOverprintMode());
+}
+
+void SplashOutputDev::updateTransfer(GfxState *state) {
+  Function **transfer;
+  Guchar red[256], green[256], blue[256], gray[256];
+  double x, y;
+  int i;
+
+  transfer = state->getTransfer();
+  if (transfer[0] &&
+      transfer[0]->getInputSize() == 1 &&
+      transfer[0]->getOutputSize() == 1) {
+    if (transfer[1] &&
+       transfer[1]->getInputSize() == 1 &&
+       transfer[1]->getOutputSize() == 1 &&
+       transfer[2] &&
+       transfer[2]->getInputSize() == 1 &&
+       transfer[2]->getOutputSize() == 1 &&
+       transfer[3] &&
+       transfer[3]->getInputSize() == 1 &&
+       transfer[3]->getOutputSize() == 1) {
+      for (i = 0; i < 256; ++i) {
+       x = i / 255.0;
+       transfer[0]->transform(&x, &y);
+       red[i] = (Guchar)(y * 255.0 + 0.5);
+       transfer[1]->transform(&x, &y);
+       green[i] = (Guchar)(y * 255.0 + 0.5);
+       transfer[2]->transform(&x, &y);
+       blue[i] = (Guchar)(y * 255.0 + 0.5);
+       transfer[3]->transform(&x, &y);
+       gray[i] = (Guchar)(y * 255.0 + 0.5);
+      }
+    } else {
+      for (i = 0; i < 256; ++i) {
+       x = i / 255.0;
+       transfer[0]->transform(&x, &y);
+       red[i] = green[i] = blue[i] = gray[i] = (Guchar)(y * 255.0 + 0.5);
+      }
+    }
+  } else {
+    for (i = 0; i < 256; ++i) {
+      red[i] = green[i] = blue[i] = gray[i] = (Guchar)i;
+    }
+  }
+  splash->setTransfer(red, green, blue, gray);
+}
+
+void SplashOutputDev::updateFont(GfxState * /*state*/) {
+  needFontUpdate = gTrue;
+}
+
+void SplashOutputDev::doUpdateFont(GfxState *state) {
+  GfxFont *gfxFont;
+  GfxFontLoc *fontLoc;
+  GfxFontType fontType;
+  SplashOutFontFileID *id;
+  SplashFontFile *fontFile;
+  SplashFontSrc *fontsrc = NULL;
+  FoFiTrueType *ff;
+  Object refObj, strObj;
+  GooString *fileName;
+  char *tmpBuf;
+  int tmpBufLen;
+  int *codeToGID;
+  double *textMat;
+  double m11, m12, m21, m22, fontSize;
+  int faceIndex = 0;
+  SplashCoord mat[4];
+  int n, i;
+  GBool recreateFont = gFalse;
+  GBool doAdjustFontMatrix = gFalse;
+
+  needFontUpdate = gFalse;
+  font = NULL;
+  fileName = NULL;
+  tmpBuf = NULL;
+  fontLoc = NULL;
+
+  if (!(gfxFont = state->getFont())) {
+    goto err1;
+  }
+  fontType = gfxFont->getType();
+  if (fontType == fontType3) {
+    goto err1;
+  }
+
+  // sanity-check the font size - skip anything larger than 10 inches
+  // (this avoids problems allocating memory for the font cache)
+  if (state->getTransformedFontSize()
+        > 10 * (state->getHDPI() + state->getVDPI())) {
+    goto err1;
+  }
+
+  // check the font file cache
+  id = new SplashOutFontFileID(gfxFont->getID());
+  if ((fontFile = fontEngine->getFontFile(id))) {
+    delete id;
+
+  } else {
+
+    if (!(fontLoc = gfxFont->locateFont(doc->getXRef(), gFalse))) {
+      error(errSyntaxError, -1, "Couldn't find a font for '{0:s}'",
+           gfxFont->getName() ? gfxFont->getName()->getCString()
+                              : "(unnamed)");
+      goto err2;
+    }
+
+    // embedded font
+    if (fontLoc->locType == gfxFontLocEmbedded) {
+      // if there is an embedded font, read it to memory
+      tmpBuf = gfxFont->readEmbFontFile(doc->getXRef(), &tmpBufLen);
+      if (! tmpBuf)
+       goto err2;
+
+    // external font
+    } else { // gfxFontLocExternal
+      fileName = fontLoc->path;
+      fontType = fontLoc->fontType;
+      doAdjustFontMatrix = gTrue;
+    }
+
+    fontsrc = new SplashFontSrc;
+    if (fileName)
+      fontsrc->setFile(fileName, gFalse);
+    else
+      fontsrc->setBuf(tmpBuf, tmpBufLen, gTrue);
+
+    // load the font file
+    switch (fontType) {
+    case fontType1:
+      if (!(fontFile = fontEngine->loadType1Font(
+                          id,
+                          fontsrc,
+                          (const char **)((Gfx8BitFont *)gfxFont)->getEncoding()))) {
+       error(errSyntaxError, -1, "Couldn't create a font for '{0:s}'",
+             gfxFont->getName() ? gfxFont->getName()->getCString()
+                                : "(unnamed)");
+       goto err2;
+      }
+      break;
+    case fontType1C:
+      if (!(fontFile = fontEngine->loadType1CFont(
+                          id,
+                          fontsrc,
+                          (const char **)((Gfx8BitFont *)gfxFont)->getEncoding()))) {
+       error(errSyntaxError, -1, "Couldn't create a font for '{0:s}'",
+             gfxFont->getName() ? gfxFont->getName()->getCString()
+                                : "(unnamed)");
+       goto err2;
+      }
+      break;
+    case fontType1COT:
+      if (!(fontFile = fontEngine->loadOpenTypeT1CFont(
+                          id,
+                          fontsrc,
+                          (const char **)((Gfx8BitFont *)gfxFont)->getEncoding()))) {
+       error(errSyntaxError, -1, "Couldn't create a font for '{0:s}'",
+             gfxFont->getName() ? gfxFont->getName()->getCString()
+                                : "(unnamed)");
+       goto err2;
+      }
+      break;
+    case fontTrueType:
+    case fontTrueTypeOT:
+       if (fileName)
+        ff = FoFiTrueType::load(fileName->getCString());
+       else
+       ff = FoFiTrueType::make(tmpBuf, tmpBufLen);
+      if (ff) {
+       codeToGID = ((Gfx8BitFont *)gfxFont)->getCodeToGIDMap(ff);
+       n = 256;
+       delete ff;
+       // if we're substituting for a non-TrueType font, we need to mark
+       // all notdef codes as "do not draw" (rather than drawing TrueType
+       // notdef glyphs)
+       if (gfxFont->getType() != fontTrueType &&
+           gfxFont->getType() != fontTrueTypeOT) {
+         for (i = 0; i < 256; ++i) {
+           if (codeToGID[i] == 0) {
+             codeToGID[i] = -1;
+           }
+         }
+       }
+      } else {
+       codeToGID = NULL;
+       n = 0;
+      }
+      if (!(fontFile = fontEngine->loadTrueTypeFont(
+                          id,
+                          fontsrc,
+                          codeToGID, n))) {
+       error(errSyntaxError, -1, "Couldn't create a font for '{0:s}'",
+             gfxFont->getName() ? gfxFont->getName()->getCString()
+                                : "(unnamed)");
+       goto err2;
+      }
+      break;
+    case fontCIDType0:
+    case fontCIDType0C:
+      if (!(fontFile = fontEngine->loadCIDFont(
+                          id,
+                          fontsrc))) {
+       error(errSyntaxError, -1, "Couldn't create a font for '{0:s}'",
+             gfxFont->getName() ? gfxFont->getName()->getCString()
+                                : "(unnamed)");
+       goto err2;
+      }
+      break;
+    case fontCIDType0COT:
+      if (((GfxCIDFont *)gfxFont)->getCIDToGID()) {
+       n = ((GfxCIDFont *)gfxFont)->getCIDToGIDLen();
+       codeToGID = (int *)gmallocn(n, sizeof(int));
+       memcpy(codeToGID, ((GfxCIDFont *)gfxFont)->getCIDToGID(),
+              n * sizeof(int));
+      } else {
+       codeToGID = NULL;
+       n = 0;
+      }
+      if (!(fontFile = fontEngine->loadOpenTypeCFFFont(
+                          id,
+                          fontsrc,
+                           codeToGID, n))) {
+       error(errSyntaxError, -1, "Couldn't create a font for '{0:s}'",
+             gfxFont->getName() ? gfxFont->getName()->getCString()
+                                : "(unnamed)");
+       goto err2;
+      }
+      break;
+    case fontCIDType2:
+    case fontCIDType2OT:
+      codeToGID = NULL;
+      n = 0;
+      if (((GfxCIDFont *)gfxFont)->getCIDToGID()) {
+       n = ((GfxCIDFont *)gfxFont)->getCIDToGIDLen();
+       if (n) {
+         codeToGID = (int *)gmallocn(n, sizeof(int));
+         memcpy(codeToGID, ((GfxCIDFont *)gfxFont)->getCIDToGID(),
+                 n * sizeof(int));
+       }
+      } else {
+       if (fileName)
+         ff = FoFiTrueType::load(fileName->getCString());
+       else
+         ff = FoFiTrueType::make(tmpBuf, tmpBufLen);
+       if (! ff)
+       {
+       error(errSyntaxError, -1, "Couldn't create a font for '{0:s}'",
+             gfxFont->getName() ? gfxFont->getName()->getCString()
+                                : "(unnamed)");
+         goto err2;
+       }
+       codeToGID = ((GfxCIDFont *)gfxFont)->getCodeToGIDMap(ff, &n);
+       delete ff;
+      }
+      if (!(fontFile = fontEngine->loadTrueTypeFont(
+                          id,
+                          fontsrc,
+                          codeToGID, n, faceIndex))) {
+       error(errSyntaxError, -1, "Couldn't create a font for '{0:s}'",
+             gfxFont->getName() ? gfxFont->getName()->getCString()
+                                : "(unnamed)");
+       goto err2;
+      }
+      break;
+    default:
+      // this shouldn't happen
+      goto err2;
+    }
+    fontFile->doAdjustMatrix = doAdjustFontMatrix;
+  }
+
+  // get the font matrix
+  textMat = state->getTextMat();
+  fontSize = state->getFontSize();
+  m11 = textMat[0] * fontSize * state->getHorizScaling();
+  m12 = textMat[1] * fontSize * state->getHorizScaling();
+  m21 = textMat[2] * fontSize;
+  m22 = textMat[3] * fontSize;
+
+  // create the scaled font
+  mat[0] = m11;  mat[1] = m12;
+  mat[2] = m21;  mat[3] = m22;
+  font = fontEngine->getFont(fontFile, mat, splash->getMatrix());
+
+  // for substituted fonts: adjust the font matrix -- compare the
+  // width of 'm' in the original font and the substituted font
+  if (fontFile->doAdjustMatrix && !gfxFont->isCIDFont()) {
+    double w1, w2;
+    CharCode code;
+    char *name;
+    for (code = 0; code < 256; ++code) {
+      if ((name = ((Gfx8BitFont *)gfxFont)->getCharName(code)) &&
+          name[0] == 'm' && name[1] == '\0') {
+        break;
+      }
+    }
+    if (code < 256) {
+      w1 = ((Gfx8BitFont *)gfxFont)->getWidth(code);
+      w2 = font->getGlyphAdvance(code);
+      if (!gfxFont->isSymbolic() && w2 > 0) {
+        // if real font is substantially narrower than substituted
+        // font, reduce the font size accordingly
+        if (w1 > 0.01 && w1 < 0.9 * w2) {
+          w1 /= w2;
+          m11 *= w1;
+          m21 *= w1;
+          recreateFont = gTrue;
+        }
+      }
+    }
+  }
+
+  if (recreateFont)
+  {
+    mat[0] = m11;  mat[1] = m12;
+    mat[2] = m21;  mat[3] = m22;
+    font = fontEngine->getFont(fontFile, mat, splash->getMatrix());
+  }
+
+  delete fontLoc;
+  if (fontsrc && !fontsrc->isFile)
+      fontsrc->unref();
+  return;
+
+ err2:
+  delete id;
+  delete fontLoc;
+ err1:
+  if (fontsrc && !fontsrc->isFile)
+      fontsrc->unref();
+  return;
+}
+
+void SplashOutputDev::stroke(GfxState *state) {
+  SplashPath *path;
+
+  if (state->getStrokeColorSpace()->isNonMarking()) {
+    return;
+  }
+  setOverprintMask(state->getStrokeColorSpace(), state->getStrokeOverprint(),
+                  state->getOverprintMode(), state->getStrokeColor());
+  path = convertPath(state, state->getPath(), gFalse);
+  splash->stroke(path);
+  delete path;
+}
+
+void SplashOutputDev::fill(GfxState *state) {
+  SplashPath *path;
+
+  if (state->getFillColorSpace()->isNonMarking()) {
+    return;
+  }
+  setOverprintMask(state->getFillColorSpace(), state->getFillOverprint(),
+                  state->getOverprintMode(), state->getFillColor());
+  path = convertPath(state, state->getPath(), gTrue);
+  splash->fill(path, gFalse);
+  delete path;
+}
+
+void SplashOutputDev::eoFill(GfxState *state) {
+  SplashPath *path;
+
+  if (state->getFillColorSpace()->isNonMarking()) {
+    return;
+  }
+  setOverprintMask(state->getFillColorSpace(), state->getFillOverprint(),
+                  state->getOverprintMode(), state->getFillColor());
+  path = convertPath(state, state->getPath(), gTrue);
+  splash->fill(path, gTrue);
+  delete path;
+}
+
+void SplashOutputDev::clip(GfxState *state) {
+  SplashPath *path;
+
+  path = convertPath(state, state->getPath(), gTrue);
+  splash->clipToPath(path, gFalse);
+  delete path;
+}
+
+void SplashOutputDev::eoClip(GfxState *state) {
+  SplashPath *path;
+
+  path = convertPath(state, state->getPath(), gTrue);
+  splash->clipToPath(path, gTrue);
+  delete path;
+}
+
+void SplashOutputDev::clipToStrokePath(GfxState *state) {
+  SplashPath *path, *path2;
+
+  path = convertPath(state, state->getPath(), gFalse);
+  path2 = splash->makeStrokePath(path, state->getLineWidth());
+  delete path;
+  splash->clipToPath(path2, gFalse);
+  delete path2;
+}
+
+SplashPath *SplashOutputDev::convertPath(GfxState *state, GfxPath *path,
+                                        GBool dropEmptySubpaths) {
+  SplashPath *sPath;
+  GfxSubpath *subpath;
+  int n, i, j;
+
+  n = dropEmptySubpaths ? 1 : 0;
+  sPath = new SplashPath();
+  for (i = 0; i < path->getNumSubpaths(); ++i) {
+    subpath = path->getSubpath(i);
+    if (subpath->getNumPoints() > n) {
+      sPath->moveTo((SplashCoord)subpath->getX(0),
+                   (SplashCoord)subpath->getY(0));
+      j = 1;
+      while (j < subpath->getNumPoints()) {
+       if (subpath->getCurve(j)) {
+         sPath->curveTo((SplashCoord)subpath->getX(j),
+                        (SplashCoord)subpath->getY(j),
+                        (SplashCoord)subpath->getX(j+1),
+                        (SplashCoord)subpath->getY(j+1),
+                        (SplashCoord)subpath->getX(j+2),
+                        (SplashCoord)subpath->getY(j+2));
+         j += 3;
+       } else {
+         sPath->lineTo((SplashCoord)subpath->getX(j),
+                       (SplashCoord)subpath->getY(j));
+         ++j;
+       }
+      }
+      if (subpath->isClosed()) {
+       sPath->close();
+      }
+    }
+  }
+  return sPath;
+}
+
+void SplashOutputDev::drawChar(GfxState *state, double x, double y,
+                              double dx, double dy,
+                              double originX, double originY,
+                              CharCode code, int nBytes,
+                              Unicode *u, int uLen) {
+  SplashPath *path;
+  int render;
+  GBool doFill, doStroke, doClip, strokeAdjust;
+  double m[4];
+  GBool horiz;
+
+  if (skipHorizText || skipRotatedText) {
+    state->getFontTransMat(&m[0], &m[1], &m[2], &m[3]);
+    horiz = m[0] > 0 && fabs(m[1]) < 0.001 &&
+            fabs(m[2]) < 0.001 && m[3] < 0;
+    if ((skipHorizText && horiz) || (skipRotatedText && !horiz)) {
+      return;
+    }
+  }
+
+  // check for invisible text -- this is used by Acrobat Capture
+  render = state->getRender();
+  if (render == 3) {
+    return;
+  }
+
+  if (needFontUpdate) {
+    doUpdateFont(state);
+  }
+  if (!font) {
+    return;
+  }
+
+  x -= originX;
+  y -= originY;
+
+  doFill = !(render & 1) && !state->getFillColorSpace()->isNonMarking();
+  doStroke = ((render & 3) == 1 || (render & 3) == 2) &&
+             !state->getStrokeColorSpace()->isNonMarking();
+  doClip = render & 4;
+
+  path = NULL;
+  if (doStroke || doClip) {
+    if ((path = font->getGlyphPath(code))) {
+      path->offset((SplashCoord)x, (SplashCoord)y);
+    }
+  }
+
+  // don't use stroke adjustment when stroking text -- the results
+  // tend to be ugly (because characters with horizontal upper or
+  // lower edges get misaligned relative to the other characters)
+  strokeAdjust = gFalse; // make gcc happy
+  if (doStroke) {
+    strokeAdjust = splash->getStrokeAdjust();
+    splash->setStrokeAdjust(gFalse);
+  }
+
+  // fill and stroke
+  if (doFill && doStroke) {
+    if (path) {
+      setOverprintMask(state->getFillColorSpace(), state->getFillOverprint(),
+                      state->getOverprintMode(), state->getFillColor());
+      splash->fill(path, gFalse);
+      setOverprintMask(state->getStrokeColorSpace(),
+                      state->getStrokeOverprint(),
+                      state->getOverprintMode(),
+                      state->getStrokeColor());
+      splash->stroke(path);
+    }
+
+  // fill
+  } else if (doFill) {
+    setOverprintMask(state->getFillColorSpace(), state->getFillOverprint(),
+                    state->getOverprintMode(), state->getFillColor());
+    splash->fillChar((SplashCoord)x, (SplashCoord)y, code, font);
+
+  // stroke
+  } else if (doStroke) {
+    if (path) {
+      setOverprintMask(state->getStrokeColorSpace(),
+                      state->getStrokeOverprint(),
+                      state->getOverprintMode(),
+                      state->getStrokeColor());
+      splash->stroke(path);
+    }
+  }
+
+  // clip
+  if (doClip) {
+    if (path) {
+      if (textClipPath) {
+       textClipPath->append(path);
+      } else {
+       textClipPath = path;
+       path = NULL;
+      }
+    }
+  }
+
+  if (doStroke) {
+    splash->setStrokeAdjust(strokeAdjust);
+  }
+
+  if (path) {
+    delete path;
+  }
+}
+
+GBool SplashOutputDev::beginType3Char(GfxState *state, double x, double y,
+                                     double dx, double dy,
+                                     CharCode code, Unicode *u, int uLen) {
+  GfxFont *gfxFont;
+  Ref *fontID;
+  double *ctm, *bbox;
+  T3FontCache *t3Font;
+  T3GlyphStack *t3gs;
+  GBool validBBox;
+  double m[4];
+  GBool horiz;
+  double x1, y1, xMin, yMin, xMax, yMax, xt, yt;
+  int i, j;
+
+  if (skipHorizText || skipRotatedText) {
+    state->getFontTransMat(&m[0], &m[1], &m[2], &m[3]);
+    horiz = m[0] > 0 && fabs(m[1]) < 0.001 &&
+            fabs(m[2]) < 0.001 && m[3] < 0;
+    if ((skipHorizText && horiz) || (skipRotatedText && !horiz)) {
+      return gTrue;
+    }
+  }
+
+  if (!(gfxFont = state->getFont())) {
+    return gFalse;
+  }
+  fontID = gfxFont->getID();
+  ctm = state->getCTM();
+  state->transform(0, 0, &xt, &yt);
+
+  // is it the first (MRU) font in the cache?
+  if (!(nT3Fonts > 0 &&
+       t3FontCache[0]->matches(fontID, ctm[0], ctm[1], ctm[2], ctm[3]))) {
+
+    // is the font elsewhere in the cache?
+    for (i = 1; i < nT3Fonts; ++i) {
+      if (t3FontCache[i]->matches(fontID, ctm[0], ctm[1], ctm[2], ctm[3])) {
+       t3Font = t3FontCache[i];
+       for (j = i; j > 0; --j) {
+         t3FontCache[j] = t3FontCache[j - 1];
+       }
+       t3FontCache[0] = t3Font;
+       break;
+      }
+    }
+    if (i >= nT3Fonts) {
+
+      // create new entry in the font cache
+      if (nT3Fonts == splashOutT3FontCacheSize) {
+       delete t3FontCache[nT3Fonts - 1];
+       --nT3Fonts;
+      }
+      for (j = nT3Fonts; j > 0; --j) {
+       t3FontCache[j] = t3FontCache[j - 1];
+      }
+      ++nT3Fonts;
+      bbox = gfxFont->getFontBBox();
+      if (bbox[0] == 0 && bbox[1] == 0 && bbox[2] == 0 && bbox[3] == 0) {
+       // unspecified bounding box -- just take a guess
+       xMin = xt - 5;
+       xMax = xMin + 30;
+       yMax = yt + 15;
+       yMin = yMax - 45;
+       validBBox = gFalse;
+      } else {
+       state->transform(bbox[0], bbox[1], &x1, &y1);
+       xMin = xMax = x1;
+       yMin = yMax = y1;
+       state->transform(bbox[0], bbox[3], &x1, &y1);
+       if (x1 < xMin) {
+         xMin = x1;
+       } else if (x1 > xMax) {
+         xMax = x1;
+       }
+       if (y1 < yMin) {
+         yMin = y1;
+       } else if (y1 > yMax) {
+         yMax = y1;
+       }
+       state->transform(bbox[2], bbox[1], &x1, &y1);
+       if (x1 < xMin) {
+         xMin = x1;
+       } else if (x1 > xMax) {
+         xMax = x1;
+       }
+       if (y1 < yMin) {
+         yMin = y1;
+       } else if (y1 > yMax) {
+         yMax = y1;
+       }
+       state->transform(bbox[2], bbox[3], &x1, &y1);
+       if (x1 < xMin) {
+         xMin = x1;
+       } else if (x1 > xMax) {
+         xMax = x1;
+       }
+       if (y1 < yMin) {
+         yMin = y1;
+       } else if (y1 > yMax) {
+         yMax = y1;
+       }
+       validBBox = gTrue;
+      }
+      t3FontCache[0] = new T3FontCache(fontID, ctm[0], ctm[1], ctm[2], ctm[3],
+                                      (int)floor(xMin - xt) - 2,
+                                      (int)floor(yMin - yt) - 2,
+                                      (int)ceil(xMax) - (int)floor(xMin) + 4,
+                                      (int)ceil(yMax) - (int)floor(yMin) + 4,
+                                      validBBox,
+                                      colorMode != splashModeMono1);
+    }
+  }
+  t3Font = t3FontCache[0];
+
+  // is the glyph in the cache?
+  i = (code & (t3Font->cacheSets - 1)) * t3Font->cacheAssoc;
+  for (j = 0; j < t3Font->cacheAssoc; ++j) {
+    if (t3Font->cacheTags != NULL) {
+      if ((t3Font->cacheTags[i+j].mru & 0x8000) &&
+       t3Font->cacheTags[i+j].code == code) {
+        drawType3Glyph(state, t3Font, &t3Font->cacheTags[i+j],
+                    t3Font->cacheData + (i+j) * t3Font->glyphSize);
+        return gTrue;
+      }
+    }
+  }
+
+  // push a new Type 3 glyph record
+  t3gs = new T3GlyphStack();
+  t3gs->next = t3GlyphStack;
+  t3GlyphStack = t3gs;
+  t3GlyphStack->code = code;
+  t3GlyphStack->cache = t3Font;
+  t3GlyphStack->cacheTag = NULL;
+  t3GlyphStack->cacheData = NULL;
+
+  haveT3Dx = gFalse;
+
+  return gFalse;
+}
+
+void SplashOutputDev::endType3Char(GfxState *state) {
+  T3GlyphStack *t3gs;
+  double *ctm;
+
+  if (t3GlyphStack->cacheTag) {
+    --nestCount;
+    memcpy(t3GlyphStack->cacheData, bitmap->getDataPtr(),
+          t3GlyphStack->cache->glyphSize);
+    delete bitmap;
+    delete splash;
+    bitmap = t3GlyphStack->origBitmap;
+    splash = t3GlyphStack->origSplash;
+    ctm = state->getCTM();
+    state->setCTM(ctm[0], ctm[1], ctm[2], ctm[3],
+                 t3GlyphStack->origCTM4, t3GlyphStack->origCTM5);
+    updateCTM(state, 0, 0, 0, 0, 0, 0);
+    drawType3Glyph(state, t3GlyphStack->cache,
+                  t3GlyphStack->cacheTag, t3GlyphStack->cacheData);
+  }
+  t3gs = t3GlyphStack;
+  t3GlyphStack = t3gs->next;
+  delete t3gs;
+}
+
+void SplashOutputDev::type3D0(GfxState *state, double wx, double wy) {
+  haveT3Dx = gTrue;
+}
+
+void SplashOutputDev::type3D1(GfxState *state, double wx, double wy,
+                             double llx, double lly, double urx, double ury) {
+  double *ctm;
+  T3FontCache *t3Font;
+  SplashColor color;
+  double xt, yt, xMin, xMax, yMin, yMax, x1, y1;
+  int i, j;
+
+  // ignore multiple d0/d1 operators
+  if (haveT3Dx) {
+    return;
+  }
+  haveT3Dx = gTrue;
+
+  if (unlikely(t3GlyphStack == NULL)) {
+    error(errSyntaxWarning, -1, "t3GlyphStack was null in SplashOutputDev::type3D1");
+    return;
+  }
+
+  if (unlikely(t3GlyphStack->origBitmap != NULL)) {
+    error(errSyntaxWarning, -1, "t3GlyphStack origBitmap was not null in SplashOutputDev::type3D1");
+    return;
+  }
+
+  if (unlikely(t3GlyphStack->origSplash != NULL)) {
+    error(errSyntaxWarning, -1, "t3GlyphStack origSplash was not null in SplashOutputDev::type3D1");
+    return;
+  }
+
+  t3Font = t3GlyphStack->cache;
+
+  // check for a valid bbox
+  state->transform(0, 0, &xt, &yt);
+  state->transform(llx, lly, &x1, &y1);
+  xMin = xMax = x1;
+  yMin = yMax = y1;
+  state->transform(llx, ury, &x1, &y1);
+  if (x1 < xMin) {
+    xMin = x1;
+  } else if (x1 > xMax) {
+    xMax = x1;
+  }
+  if (y1 < yMin) {
+    yMin = y1;
+  } else if (y1 > yMax) {
+    yMax = y1;
+  }
+  state->transform(urx, lly, &x1, &y1);
+  if (x1 < xMin) {
+    xMin = x1;
+  } else if (x1 > xMax) {
+    xMax = x1;
+  }
+  if (y1 < yMin) {
+    yMin = y1;
+  } else if (y1 > yMax) {
+    yMax = y1;
+  }
+  state->transform(urx, ury, &x1, &y1);
+  if (x1 < xMin) {
+    xMin = x1;
+  } else if (x1 > xMax) {
+    xMax = x1;
+  }
+  if (y1 < yMin) {
+    yMin = y1;
+  } else if (y1 > yMax) {
+    yMax = y1;
+  }
+  if (xMin - xt < t3Font->glyphX ||
+      yMin - yt < t3Font->glyphY ||
+      xMax - xt > t3Font->glyphX + t3Font->glyphW ||
+      yMax - yt > t3Font->glyphY + t3Font->glyphH) {
+    if (t3Font->validBBox) {
+      error(errSyntaxWarning, -1, "Bad bounding box in Type 3 glyph");
+    }
+    return;
+  }
+
+  if (t3Font->cacheTags == NULL)
+    return;
+
+  // allocate a cache entry
+  i = (t3GlyphStack->code & (t3Font->cacheSets - 1)) * t3Font->cacheAssoc;
+  for (j = 0; j < t3Font->cacheAssoc; ++j) {
+    if ((t3Font->cacheTags[i+j].mru & 0x7fff) == t3Font->cacheAssoc - 1) {
+      t3Font->cacheTags[i+j].mru = 0x8000;
+      t3Font->cacheTags[i+j].code = t3GlyphStack->code;
+      t3GlyphStack->cacheTag = &t3Font->cacheTags[i+j];
+      t3GlyphStack->cacheData = t3Font->cacheData + (i+j) * t3Font->glyphSize;
+    } else {
+      ++t3Font->cacheTags[i+j].mru;
+    }
+  }
+
+  // save state
+  t3GlyphStack->origBitmap = bitmap;
+  t3GlyphStack->origSplash = splash;
+  ctm = state->getCTM();
+  t3GlyphStack->origCTM4 = ctm[4];
+  t3GlyphStack->origCTM5 = ctm[5];
+
+  // create the temporary bitmap
+  if (colorMode == splashModeMono1) {
+    bitmap = new SplashBitmap(t3Font->glyphW, t3Font->glyphH, 1,
+                             splashModeMono1, gFalse);
+    splash = new Splash(bitmap, gFalse,
+                       t3GlyphStack->origSplash->getScreen());
+    color[0] = 0;
+    splash->clear(color);
+    color[0] = 0xff;
+  } else {
+    bitmap = new SplashBitmap(t3Font->glyphW, t3Font->glyphH, 1,
+                             splashModeMono8, gFalse);
+    splash = new Splash(bitmap, vectorAntialias,
+                       t3GlyphStack->origSplash->getScreen());
+    color[0] = 0x00;
+    splash->clear(color);
+    color[0] = 0xff;
+  }
+  splash->setMinLineWidth(globalParams->getMinLineWidth());
+  splash->setFillPattern(new SplashSolidColor(color));
+  splash->setStrokePattern(new SplashSolidColor(color));
+  //~ this should copy other state from t3GlyphStack->origSplash?
+  state->setCTM(ctm[0], ctm[1], ctm[2], ctm[3],
+               -t3Font->glyphX, -t3Font->glyphY);
+  updateCTM(state, 0, 0, 0, 0, 0, 0);
+  ++nestCount;
+}
+
+void SplashOutputDev::drawType3Glyph(GfxState *state, T3FontCache *t3Font,
+                                    T3FontCacheTag * /*tag*/, Guchar *data) {
+  SplashGlyphBitmap glyph;
+
+  setOverprintMask(state->getFillColorSpace(), state->getFillOverprint(),
+                  state->getOverprintMode(), state->getFillColor());
+  glyph.x = -t3Font->glyphX;
+  glyph.y = -t3Font->glyphY;
+  glyph.w = t3Font->glyphW;
+  glyph.h = t3Font->glyphH;
+  glyph.aa = colorMode != splashModeMono1;
+  glyph.data = data;
+  glyph.freeData = gFalse;
+  splash->fillGlyph(0, 0, &glyph);
+}
+
+void SplashOutputDev::beginTextObject(GfxState *state) {
+}
+
+void SplashOutputDev::endTextObject(GfxState *state) {
+  if (textClipPath) {
+    splash->clipToPath(textClipPath, gFalse);
+    delete textClipPath;
+    textClipPath = NULL;
+  }
+}
+
+struct SplashOutImageMaskData {
+  ImageStream *imgStr;
+  GBool invert;
+  int width, height, y;
+};
+
+GBool SplashOutputDev::imageMaskSrc(void *data, SplashColorPtr line) {
+  SplashOutImageMaskData *imgMaskData = (SplashOutImageMaskData *)data;
+  Guchar *p;
+  SplashColorPtr q;
+  int x;
+
+  if (imgMaskData->y == imgMaskData->height) {
+    return gFalse;
+  }
+  if (!(p = imgMaskData->imgStr->getLine())) {
+    return gFalse;
+  }
+  for (x = 0, q = line; x < imgMaskData->width; ++x) {
+    *q++ = *p++ ^ imgMaskData->invert;
+  }
+  ++imgMaskData->y;
+  return gTrue;
+}
+
+void SplashOutputDev::drawImageMask(GfxState *state, Object *ref, Stream *str,
+                                   int width, int height, GBool invert,
+                                   GBool interpolate, GBool inlineImg) {
+  double *ctm;
+  SplashCoord mat[6];
+  SplashOutImageMaskData imgMaskData;
+
+  if (state->getFillColorSpace()->isNonMarking()) {
+    return;
+  }
+  setOverprintMask(state->getFillColorSpace(), state->getFillOverprint(),
+                  state->getOverprintMode(), state->getFillColor());
+
+  ctm = state->getCTM();
+  for (int i = 0; i < 6; ++i) {
+    if (!isfinite(ctm[i])) return;
+  }
+  mat[0] = ctm[0];
+  mat[1] = ctm[1];
+  mat[2] = -ctm[2];
+  mat[3] = -ctm[3];
+  mat[4] = ctm[2] + ctm[4];
+  mat[5] = ctm[3] + ctm[5];
+
+  imgMaskData.imgStr = new ImageStream(str, width, 1, 1);
+  imgMaskData.imgStr->reset();
+  imgMaskData.invert = invert ? 0 : 1;
+  imgMaskData.width = width;
+  imgMaskData.height = height;
+  imgMaskData.y = 0;
+
+  splash->fillImageMask(&imageMaskSrc, &imgMaskData, width, height, mat, t3GlyphStack != NULL);
+  if (inlineImg) {
+    if (inlineImg) {
+      while (imgMaskData.y < height) {
+        imgMaskData.imgStr->getLine();
+        ++imgMaskData.y;
+      }
+    }
+  }
+
+  delete imgMaskData.imgStr;
+  str->close();
+}
+
+void SplashOutputDev::setSoftMaskFromImageMask(GfxState *state,
+                                              Object *ref, Stream *str,
+                                              int width, int height,
+                                              GBool invert,
+                                              GBool inlineImg, double *baseMatrix) {
+  double *ctm;
+  SplashCoord mat[6];
+  SplashOutImageMaskData imgMaskData;
+  Splash *maskSplash;
+  SplashColor maskColor;
+  double bbox[4] = {0, 0, 1, 1}; // default;
+
+  if (state->getFillColorSpace()->isNonMarking()) {
+    return;
+  }
+
+  ctm = state->getCTM();
+  for (int i = 0; i < 6; ++i) {
+    if (!isfinite(ctm[i])) return;
+  }
+  
+  beginTransparencyGroup(state, bbox, NULL, gFalse, gFalse, gFalse);
+  baseMatrix[4] -= transpGroupStack->tx;
+  baseMatrix[5] -= transpGroupStack->ty;
+
+  ctm = state->getCTM();
+  mat[0] = ctm[0];
+  mat[1] = ctm[1];
+  mat[2] = -ctm[2];
+  mat[3] = -ctm[3];
+  mat[4] = ctm[2] + ctm[4];
+  mat[5] = ctm[3] + ctm[5];
+  imgMaskData.imgStr = new ImageStream(str, width, 1, 1);
+  imgMaskData.imgStr->reset();
+  imgMaskData.invert = invert ? 0 : 1;
+  imgMaskData.width = width;
+  imgMaskData.height = height;
+  imgMaskData.y = 0;
+
+  maskBitmap = new SplashBitmap(bitmap->getWidth(), bitmap->getHeight(), 1, splashModeMono8, gFalse);
+  maskSplash = new Splash(maskBitmap, vectorAntialias);
+  maskColor[0] = 0;
+  maskSplash->clear(maskColor);
+  maskColor[0] = 0xff;
+  maskSplash->setFillPattern(new SplashSolidColor(maskColor));
+  maskSplash->fillImageMask(&imageMaskSrc, &imgMaskData,  width, height, mat, t3GlyphStack != NULL);
+  delete maskSplash;
+  delete imgMaskData.imgStr;
+  str->close();
+}
+
+void SplashOutputDev::unsetSoftMaskFromImageMask(GfxState *state, double *baseMatrix) {
+  double bbox[4] = {0,0,1,1}; // dummy
+
+  /* transfer mask to alpha channel! */
+  // memcpy(maskBitmap->getAlphaPtr(), maskBitmap->getDataPtr(), bitmap->getRowSize() * bitmap->getHeight());
+  // memset(maskBitmap->getDataPtr(), 0, bitmap->getRowSize() * bitmap->getHeight());
+  Guchar *dest = bitmap->getAlphaPtr();
+  Guchar *src = maskBitmap->getDataPtr();
+  for (int c= 0; c < maskBitmap->getRowSize() * maskBitmap->getHeight(); c++) {
+    dest[c] = src[c];
+  }
+  delete maskBitmap;
+  maskBitmap = NULL;
+  endTransparencyGroup(state);
+  baseMatrix[4] += transpGroupStack->tx;
+  baseMatrix[5] += transpGroupStack->ty;
+  paintTransparencyGroup(state, bbox);
+}
+
+struct SplashOutImageData {
+  ImageStream *imgStr;
+  GfxImageColorMap *colorMap;
+  SplashColorPtr lookup;
+  int *maskColors;
+  SplashColorMode colorMode;
+  int width, height, y;
+};
+
+GBool SplashOutputDev::imageSrc(void *data, SplashColorPtr colorLine,
+                               Guchar * /*alphaLine*/) {
+  SplashOutImageData *imgData = (SplashOutImageData *)data;
+  Guchar *p;
+  SplashColorPtr q, col;
+  GfxRGB rgb;
+  GfxGray gray;
+#if SPLASH_CMYK
+  GfxCMYK cmyk;
+#endif
+  int nComps, x;
+
+  if (imgData->y == imgData->height) {
+    return gFalse;
+  }
+  if (!(p = imgData->imgStr->getLine())) {
+    return gFalse;
+  }
+
+  nComps = imgData->colorMap->getNumPixelComps();
+
+  if (imgData->lookup) {
+    switch (imgData->colorMode) {
+    case splashModeMono1:
+    case splashModeMono8:
+      for (x = 0, q = colorLine; x < imgData->width; ++x, ++p) {
+       *q++ = imgData->lookup[*p];
+      }
+      break;
+    case splashModeRGB8:
+    case splashModeBGR8:
+      for (x = 0, q = colorLine; x < imgData->width; ++x, ++p) {
+       col = &imgData->lookup[3 * *p];
+       *q++ = col[0];
+       *q++ = col[1];
+       *q++ = col[2];
+      }
+      break;
+  case splashModeXBGR8:
+      for (x = 0, q = colorLine; x < imgData->width; ++x, ++p) {
+       col = &imgData->lookup[4 * *p];
+       *q++ = col[0];
+       *q++ = col[1];
+       *q++ = col[2];
+       *q++ = col[3];
+      }
+      break;
+#if SPLASH_CMYK
+    case splashModeCMYK8:
+      for (x = 0, q = colorLine; x < imgData->width; ++x, ++p) {
+       col = &imgData->lookup[4 * *p];
+       *q++ = col[0];
+       *q++ = col[1];
+       *q++ = col[2];
+       *q++ = col[3];
+      }
+      break;
+#endif
+    }
+  } else {
+    switch (imgData->colorMode) {
+    case splashModeMono1:
+    case splashModeMono8:
+      for (x = 0, q = colorLine; x < imgData->width; ++x, p += nComps) {
+       imgData->colorMap->getGray(p, &gray);
+       *q++ = colToByte(gray);
+      }
+      break;
+    case splashModeRGB8:
+    case splashModeBGR8:
+      for (x = 0, q = colorLine; x < imgData->width; ++x, p += nComps) {
+       imgData->colorMap->getRGB(p, &rgb);
+       *q++ = colToByte(rgb.r);
+       *q++ = colToByte(rgb.g);
+       *q++ = colToByte(rgb.b);
+      }
+      break;
+    case splashModeXBGR8:
+      for (x = 0, q = colorLine; x < imgData->width; ++x, p += nComps) {
+       imgData->colorMap->getRGB(p, &rgb);
+       *q++ = colToByte(rgb.r);
+       *q++ = colToByte(rgb.g);
+       *q++ = colToByte(rgb.b);
+       *q++ = 255;
+      }
+      break;
+#if SPLASH_CMYK
+    case splashModeCMYK8:
+      for (x = 0, q = colorLine; x < imgData->width; ++x, p += nComps) {
+       imgData->colorMap->getCMYK(p, &cmyk);
+       *q++ = colToByte(cmyk.c);
+       *q++ = colToByte(cmyk.m);
+       *q++ = colToByte(cmyk.y);
+       *q++ = colToByte(cmyk.k);
+      }
+      break;
+#endif
+    }
+  }
+
+  ++imgData->y;
+  return gTrue;
+}
+
+GBool SplashOutputDev::alphaImageSrc(void *data, SplashColorPtr colorLine,
+                                    Guchar *alphaLine) {
+  SplashOutImageData *imgData = (SplashOutImageData *)data;
+  Guchar *p, *aq;
+  SplashColorPtr q, col;
+  GfxRGB rgb;
+  GfxGray gray;
+#if SPLASH_CMYK
+  GfxCMYK cmyk;
+#endif
+  Guchar alpha;
+  int nComps, x, i;
+
+  if (imgData->y == imgData->height) {
+    return gFalse;
+  }
+  if (!(p = imgData->imgStr->getLine())) {
+    return gFalse;
+  }
+
+  nComps = imgData->colorMap->getNumPixelComps();
+
+  for (x = 0, q = colorLine, aq = alphaLine;
+       x < imgData->width;
+       ++x, p += nComps) {
+    alpha = 0;
+    for (i = 0; i < nComps; ++i) {
+      if (p[i] < imgData->maskColors[2*i] ||
+         p[i] > imgData->maskColors[2*i+1]) {
+       alpha = 0xff;
+       break;
+      }
+    }
+    if (imgData->lookup) {
+      switch (imgData->colorMode) {
+      case splashModeMono1:
+      case splashModeMono8:
+       *q++ = imgData->lookup[*p];
+       break;
+      case splashModeRGB8:
+      case splashModeBGR8:
+       col = &imgData->lookup[3 * *p];
+       *q++ = col[0];
+       *q++ = col[1];
+       *q++ = col[2];
+       break;
+      case splashModeXBGR8:
+       col = &imgData->lookup[4 * *p];
+       *q++ = col[0];
+       *q++ = col[1];
+       *q++ = col[2];
+       *q++ = 255;
+       break;
+#if SPLASH_CMYK
+      case splashModeCMYK8:
+       col = &imgData->lookup[4 * *p];
+       *q++ = col[0];
+       *q++ = col[1];
+       *q++ = col[2];
+       *q++ = col[3];
+       break;
+#endif
+      }
+      *aq++ = alpha;
+    } else {
+      switch (imgData->colorMode) {
+      case splashModeMono1:
+      case splashModeMono8:
+       imgData->colorMap->getGray(p, &gray);
+       *q++ = colToByte(gray);
+       break;
+      case splashModeXBGR8:
+      case splashModeRGB8:
+      case splashModeBGR8:
+       imgData->colorMap->getRGB(p, &rgb);
+       *q++ = colToByte(rgb.r);
+       *q++ = colToByte(rgb.g);
+       *q++ = colToByte(rgb.b);
+       if (imgData->colorMode == splashModeXBGR8) *q++ = 255;
+       break;
+#if SPLASH_CMYK
+      case splashModeCMYK8:
+       imgData->colorMap->getCMYK(p, &cmyk);
+       *q++ = colToByte(cmyk.c);
+       *q++ = colToByte(cmyk.m);
+       *q++ = colToByte(cmyk.y);
+       *q++ = colToByte(cmyk.k);
+       break;
+#endif
+      }
+      *aq++ = alpha;
+    }
+  }
+
+  ++imgData->y;
+  return gTrue;
+}
+
+struct TilingSplashOutBitmap {
+  SplashBitmap *bitmap;
+  SplashPattern *pattern;
+  SplashColorMode colorMode;
+  int paintType;
+  int repeatX;
+  int repeatY;
+  int y;
+};
+
+GBool SplashOutputDev::tilingBitmapSrc(void *data, SplashColorPtr colorLine,
+                                       Guchar *alphaLine) {
+  TilingSplashOutBitmap *imgData = (TilingSplashOutBitmap *)data;
+
+  if (imgData->y == imgData->bitmap->getHeight()) {
+    imgData->repeatY--;
+    if (imgData->repeatY == 0)
+      return gFalse;
+    imgData->y = 0;
+  }
+
+  if (imgData->paintType == 1) {
+    const SplashColorMode cMode = imgData->bitmap->getMode();
+    SplashColorPtr q = colorLine;
+    // For splashModeBGR8 and splashModeXBGR8 we need to use getPixel
+    // for the others we can use raw access
+    if (cMode == splashModeBGR8 || cMode == splashModeXBGR8) {
+      for (int m = 0; m < imgData->repeatX; m++) {
+        for (int x = 0; x < imgData->bitmap->getWidth(); x++) {
+          imgData->bitmap->getPixel(x, imgData->y, q);
+          q += splashColorModeNComps[cMode];
+        }
+      }
+    } else {
+      const int n = imgData->bitmap->getRowSize();
+      SplashColorPtr p;
+      for (int m = 0; m < imgData->repeatX; m++) {
+        p = imgData->bitmap->getDataPtr() + imgData->y * imgData->bitmap->getRowSize();
+        for (int x = 0; x < n; ++x) {
+          *q++ = *p++;
+        }
+      }
+    }
+    if (alphaLine != NULL) {
+      SplashColorPtr aq = alphaLine;
+      SplashColorPtr p;
+      const int n = imgData->bitmap->getWidth() - 1;
+      for (int m = 0; m < imgData->repeatX; m++) {
+        p = imgData->bitmap->getAlphaPtr() + imgData->y * imgData->bitmap->getWidth();
+        for (int x = 0; x < n; ++x) {
+          *aq++ = *p++;
+        }
+        // This is a hack, because of how Splash antialias works if we overwrite the
+        // last alpha pixel of the tile most/all of the files look much better
+        *aq++ = (n == 0) ? *p : *(p - 1);
+      }
+    }
+  } else {
+    SplashColor col, pat;
+    SplashColorPtr dest = colorLine;
+    for (int m = 0; m < imgData->repeatX; m++) {
+      for (int x = 0; x < imgData->bitmap->getWidth(); x++) {
+        imgData->bitmap->getPixel(x, imgData->y, col);
+        imgData->pattern->getColor(x, imgData->y, pat);
+        for (int i = 0; i < splashColorModeNComps[imgData->colorMode]; ++i) {
+#if SPLASH_CMYK
+          if (imgData->colorMode == splashModeCMYK8)
+            dest[i] = div255(pat[i] * (255 - col[0]));
+          else
+#endif
+            dest[i] = 255 - div255((255 - pat[i]) * (255 - col[0]));
+        }
+        dest += splashColorModeNComps[imgData->colorMode];
+      }
+    }
+    if (alphaLine != NULL) {
+      const int y = (imgData->y == imgData->bitmap->getHeight() - 1 && imgData->y > 50) ? imgData->y - 1 : imgData->y;
+      SplashColorPtr aq = alphaLine;
+      SplashColorPtr p;
+      const int n = imgData->bitmap->getWidth();
+      for (int m = 0; m < imgData->repeatX; m++) {
+        p = imgData->bitmap->getAlphaPtr() + y * imgData->bitmap->getWidth();
+        for (int x = 0; x < n; ++x) {
+          *aq++ = *p++;
+        }
+      }
+    }
+  }
+  ++imgData->y;
+  return gTrue;
+}
+
+void SplashOutputDev::drawImage(GfxState *state, Object *ref, Stream *str,
+                               int width, int height,
+                               GfxImageColorMap *colorMap,
+                               GBool interpolate,
+                               int *maskColors, GBool inlineImg) {
+  double *ctm;
+  SplashCoord mat[6];
+  SplashOutImageData imgData;
+  SplashColorMode srcMode;
+  SplashImageSource src;
+  GfxGray gray;
+  GfxRGB rgb;
+#if SPLASH_CMYK
+  GfxCMYK cmyk;
+  GBool grayIndexed = gFalse;
+#endif
+  Guchar pix;
+  int n, i;
+
+  ctm = state->getCTM();
+  for (i = 0; i < 6; ++i) {
+    if (!isfinite(ctm[i])) return;
+  }
+  mat[0] = ctm[0];
+  mat[1] = ctm[1];
+  mat[2] = -ctm[2];
+  mat[3] = -ctm[3];
+  mat[4] = ctm[2] + ctm[4];
+  mat[5] = ctm[3] + ctm[5];
+
+  imgData.imgStr = new ImageStream(str, width,
+                                  colorMap->getNumPixelComps(),
+                                  colorMap->getBits());
+  imgData.imgStr->reset();
+  imgData.colorMap = colorMap;
+  imgData.maskColors = maskColors;
+  imgData.colorMode = colorMode;
+  imgData.width = width;
+  imgData.height = height;
+  imgData.y = 0;
+
+  // special case for one-channel (monochrome/gray/separation) images:
+  // build a lookup table here
+  imgData.lookup = NULL;
+  if (colorMap->getNumPixelComps() == 1) {
+    n = 1 << colorMap->getBits();
+    switch (colorMode) {
+    case splashModeMono1:
+    case splashModeMono8:
+      imgData.lookup = (SplashColorPtr)gmalloc(n);
+      for (i = 0; i < n; ++i) {
+       pix = (Guchar)i;
+       colorMap->getGray(&pix, &gray);
+       imgData.lookup[i] = colToByte(gray);
+      }
+      break;
+    case splashModeRGB8:
+    case splashModeBGR8:
+      imgData.lookup = (SplashColorPtr)gmallocn(n, 3);
+      for (i = 0; i < n; ++i) {
+       pix = (Guchar)i;
+       colorMap->getRGB(&pix, &rgb);
+       imgData.lookup[3*i] = colToByte(rgb.r);
+       imgData.lookup[3*i+1] = colToByte(rgb.g);
+       imgData.lookup[3*i+2] = colToByte(rgb.b);
+      }
+      break;
+    case splashModeXBGR8:
+      imgData.lookup = (SplashColorPtr)gmallocn(n, 4);
+      for (i = 0; i < n; ++i) {
+       pix = (Guchar)i;
+       colorMap->getRGB(&pix, &rgb);
+       imgData.lookup[4*i] = colToByte(rgb.r);
+       imgData.lookup[4*i+1] = colToByte(rgb.g);
+       imgData.lookup[4*i+2] = colToByte(rgb.b);
+       imgData.lookup[4*i+3] = 255;
+      }
+      break;
+#if SPLASH_CMYK
+    case splashModeCMYK8:
+      grayIndexed = colorMap->getColorSpace()->getMode() != csDeviceGray;
+      imgData.lookup = (SplashColorPtr)gmallocn(n, 4);
+      for (i = 0; i < n; ++i) {
+       pix = (Guchar)i;
+       colorMap->getCMYK(&pix, &cmyk);
+       if (cmyk.c != 0 || cmyk.m != 0 || cmyk.y != 0) {
+         grayIndexed = gFalse;
+       }
+       imgData.lookup[4*i] = colToByte(cmyk.c);
+       imgData.lookup[4*i+1] = colToByte(cmyk.m);
+       imgData.lookup[4*i+2] = colToByte(cmyk.y);
+       imgData.lookup[4*i+3] = colToByte(cmyk.k);
+      }
+      break;
+#endif
+    }
+  }
+
+#if SPLASH_CMYK
+  setOverprintMask(colorMap->getColorSpace(), state->getFillOverprint(),
+                  state->getOverprintMode(), NULL, grayIndexed);
+#else             
+  setOverprintMask(colorMap->getColorSpace(), state->getFillOverprint(),
+                  state->getOverprintMode(), NULL);
+#endif            
+
+  if (colorMode == splashModeMono1) {
+    srcMode = splashModeMono8;
+  } else {
+    srcMode = colorMode;
+  }
+  src = maskColors ? &alphaImageSrc : &imageSrc;
+  splash->drawImage(src, &imgData, srcMode, maskColors ? gTrue : gFalse,
+                   width, height, mat);
+  if (inlineImg) {
+    while (imgData.y < height) {
+      imgData.imgStr->getLine();
+      ++imgData.y;
+    }
+  }
+
+  gfree(imgData.lookup);
+  delete imgData.imgStr;
+  str->close();
+}
+
+struct SplashOutMaskedImageData {
+  ImageStream *imgStr;
+  GfxImageColorMap *colorMap;
+  SplashBitmap *mask;
+  SplashColorPtr lookup;
+  SplashColorMode colorMode;
+  int width, height, y;
+};
+
+GBool SplashOutputDev::maskedImageSrc(void *data, SplashColorPtr colorLine,
+                                     Guchar *alphaLine) {
+  SplashOutMaskedImageData *imgData = (SplashOutMaskedImageData *)data;
+  Guchar *p, *aq;
+  SplashColorPtr q, col;
+  GfxRGB rgb;
+  GfxGray gray;
+#if SPLASH_CMYK
+  GfxCMYK cmyk;
+#endif
+  Guchar alpha;
+  Guchar *maskPtr;
+  int maskBit;
+  int nComps, x;
+
+  if (imgData->y == imgData->height) {
+    return gFalse;
+  }
+  if (!(p = imgData->imgStr->getLine())) {
+    return gFalse;
+  }
+
+  nComps = imgData->colorMap->getNumPixelComps();
+
+  maskPtr = imgData->mask->getDataPtr() +
+              imgData->y * imgData->mask->getRowSize();
+  maskBit = 0x80;
+  for (x = 0, q = colorLine, aq = alphaLine;
+       x < imgData->width;
+       ++x, p += nComps) {
+    alpha = (*maskPtr & maskBit) ? 0xff : 0x00;
+    if (!(maskBit >>= 1)) {
+      ++maskPtr;
+      maskBit = 0x80;
+    }
+    if (imgData->lookup) {
+      switch (imgData->colorMode) {
+      case splashModeMono1:
+      case splashModeMono8:
+       *q++ = imgData->lookup[*p];
+       break;
+      case splashModeRGB8:
+      case splashModeBGR8:
+       col = &imgData->lookup[3 * *p];
+       *q++ = col[0];
+       *q++ = col[1];
+       *q++ = col[2];
+       break;
+      case splashModeXBGR8:
+       col = &imgData->lookup[4 * *p];
+       *q++ = col[0];
+       *q++ = col[1];
+       *q++ = col[2];
+       *q++ = 255;
+       break;
+#if SPLASH_CMYK
+      case splashModeCMYK8:
+       col = &imgData->lookup[4 * *p];
+       *q++ = col[0];
+       *q++ = col[1];
+       *q++ = col[2];
+       *q++ = col[3];
+       break;
+#endif
+      }
+      *aq++ = alpha;
+    } else {
+      switch (imgData->colorMode) {
+      case splashModeMono1:
+      case splashModeMono8:
+       imgData->colorMap->getGray(p, &gray);
+       *q++ = colToByte(gray);
+       break;
+      case splashModeXBGR8:
+      case splashModeRGB8:
+      case splashModeBGR8:
+       imgData->colorMap->getRGB(p, &rgb);
+       *q++ = colToByte(rgb.r);
+       *q++ = colToByte(rgb.g);
+       *q++ = colToByte(rgb.b);
+       if (imgData->colorMode == splashModeXBGR8) *q++ = 255;
+       break;
+#if SPLASH_CMYK
+      case splashModeCMYK8:
+       imgData->colorMap->getCMYK(p, &cmyk);
+       *q++ = colToByte(cmyk.c);
+       *q++ = colToByte(cmyk.m);
+       *q++ = colToByte(cmyk.y);
+       *q++ = colToByte(cmyk.k);
+       break;
+#endif
+      }
+      *aq++ = alpha;
+    }
+  }
+
+  ++imgData->y;
+  return gTrue;
+}
+
+void SplashOutputDev::drawMaskedImage(GfxState *state, Object *ref,
+                                     Stream *str, int width, int height,
+                                     GfxImageColorMap *colorMap,
+                                     GBool interpolate,
+                                     Stream *maskStr, int maskWidth,
+                                     int maskHeight, GBool maskInvert,
+                                     GBool maskInterpolate) {
+  GfxImageColorMap *maskColorMap;
+  Object maskDecode, decodeLow, decodeHigh;
+  double *ctm;
+  SplashCoord mat[6];
+  SplashOutMaskedImageData imgData;
+  SplashOutImageMaskData imgMaskData;
+  SplashColorMode srcMode;
+  SplashBitmap *maskBitmap;
+  Splash *maskSplash;
+  SplashColor maskColor;
+  GfxGray gray;
+  GfxRGB rgb;
+#if SPLASH_CMYK
+  GfxCMYK cmyk;
+#endif
+  Guchar pix;
+  int n, i;
+
+  setOverprintMask(colorMap->getColorSpace(), state->getFillOverprint(),
+                  state->getOverprintMode(), NULL);
+
+  // If the mask is higher resolution than the image, use
+  // drawSoftMaskedImage() instead.
+  if (maskWidth > width || maskHeight > height) {
+    decodeLow.initInt(maskInvert ? 0 : 1);
+    decodeHigh.initInt(maskInvert ? 1 : 0);
+    maskDecode.initArray(doc->getXRef());
+    maskDecode.arrayAdd(&decodeLow);
+    maskDecode.arrayAdd(&decodeHigh);
+    maskColorMap = new GfxImageColorMap(1, &maskDecode,
+                                       new GfxDeviceGrayColorSpace());
+    maskDecode.free();
+    drawSoftMaskedImage(state, ref, str, width, height, colorMap, interpolate,
+                       maskStr, maskWidth, maskHeight, maskColorMap, maskInterpolate);
+    delete maskColorMap;
+
+  } else {
+    //----- scale the mask image to the same size as the source image
+
+    mat[0] = (SplashCoord)width;
+    mat[1] = 0;
+    mat[2] = 0;
+    mat[3] = (SplashCoord)height;
+    mat[4] = 0;
+    mat[5] = 0;
+    imgMaskData.imgStr = new ImageStream(maskStr, maskWidth, 1, 1);
+    imgMaskData.imgStr->reset();
+    imgMaskData.invert = maskInvert ? 0 : 1;
+    imgMaskData.width = maskWidth;
+    imgMaskData.height = maskHeight;
+    imgMaskData.y = 0;
+    maskBitmap = new SplashBitmap(width, height, 1, splashModeMono1, gFalse);
+    maskSplash = new Splash(maskBitmap, gFalse);
+    maskColor[0] = 0;
+    maskSplash->clear(maskColor);
+    maskColor[0] = 0xff;
+    maskSplash->setFillPattern(new SplashSolidColor(maskColor));
+    maskSplash->fillImageMask(&imageMaskSrc, &imgMaskData,
+                             maskWidth, maskHeight, mat, gFalse);
+    delete imgMaskData.imgStr;
+    maskStr->close();
+    delete maskSplash;
+
+    //----- draw the source image
+
+    ctm = state->getCTM();
+    for (i = 0; i < 6; ++i) {
+      if (!isfinite(ctm[i])) {
+        delete maskBitmap;
+        return;
+      }
+    }
+    mat[0] = ctm[0];
+    mat[1] = ctm[1];
+    mat[2] = -ctm[2];
+    mat[3] = -ctm[3];
+    mat[4] = ctm[2] + ctm[4];
+    mat[5] = ctm[3] + ctm[5];
+
+    imgData.imgStr = new ImageStream(str, width,
+                                    colorMap->getNumPixelComps(),
+                                    colorMap->getBits());
+    imgData.imgStr->reset();
+    imgData.colorMap = colorMap;
+    imgData.mask = maskBitmap;
+    imgData.colorMode = colorMode;
+    imgData.width = width;
+    imgData.height = height;
+    imgData.y = 0;
+
+    // special case for one-channel (monochrome/gray/separation) images:
+    // build a lookup table here
+    imgData.lookup = NULL;
+    if (colorMap->getNumPixelComps() == 1) {
+      n = 1 << colorMap->getBits();
+      switch (colorMode) {
+      case splashModeMono1:
+      case splashModeMono8:
+       imgData.lookup = (SplashColorPtr)gmalloc(n);
+       for (i = 0; i < n; ++i) {
+         pix = (Guchar)i;
+         colorMap->getGray(&pix, &gray);
+         imgData.lookup[i] = colToByte(gray);
+       }
+       break;
+      case splashModeRGB8:
+      case splashModeBGR8:
+       imgData.lookup = (SplashColorPtr)gmallocn(n, 3);
+       for (i = 0; i < n; ++i) {
+         pix = (Guchar)i;
+         colorMap->getRGB(&pix, &rgb);
+         imgData.lookup[3*i] = colToByte(rgb.r);
+         imgData.lookup[3*i+1] = colToByte(rgb.g);
+         imgData.lookup[3*i+2] = colToByte(rgb.b);
+       }
+       break;
+      case splashModeXBGR8:
+       imgData.lookup = (SplashColorPtr)gmallocn(n, 4);
+       for (i = 0; i < n; ++i) {
+         pix = (Guchar)i;
+         colorMap->getRGB(&pix, &rgb);
+         imgData.lookup[4*i] = colToByte(rgb.r);
+         imgData.lookup[4*i+1] = colToByte(rgb.g);
+         imgData.lookup[4*i+2] = colToByte(rgb.b);
+         imgData.lookup[4*i+3] = 255;
+       }
+       break;
+#if SPLASH_CMYK
+      case splashModeCMYK8:
+       imgData.lookup = (SplashColorPtr)gmallocn(n, 4);
+       for (i = 0; i < n; ++i) {
+         pix = (Guchar)i;
+         colorMap->getCMYK(&pix, &cmyk);
+         imgData.lookup[4*i] = colToByte(cmyk.c);
+         imgData.lookup[4*i+1] = colToByte(cmyk.m);
+         imgData.lookup[4*i+2] = colToByte(cmyk.y);
+         imgData.lookup[4*i+3] = colToByte(cmyk.k);
+       }
+       break;
+#endif
+      }
+    }
+
+    if (colorMode == splashModeMono1) {
+      srcMode = splashModeMono8;
+    } else {
+      srcMode = colorMode;
+    }
+    splash->drawImage(&maskedImageSrc, &imgData, srcMode, gTrue,
+                     width, height, mat);
+    delete maskBitmap;
+    gfree(imgData.lookup);
+    delete imgData.imgStr;
+    str->close();
+  }
+}
+
+void SplashOutputDev::drawSoftMaskedImage(GfxState *state, Object *ref,
+                                         Stream *str, int width, int height,
+                                         GfxImageColorMap *colorMap,
+                                         GBool interpolate,
+                                         Stream *maskStr,
+                                         int maskWidth, int maskHeight,
+                                         GfxImageColorMap *maskColorMap,
+                                         GBool maskInterpolate) {
+  double *ctm;
+  SplashCoord mat[6];
+  SplashOutImageData imgData;
+  SplashOutImageData imgMaskData;
+  SplashColorMode srcMode;
+  SplashBitmap *maskBitmap;
+  Splash *maskSplash;
+  SplashColor maskColor;
+  GfxGray gray;
+  GfxRGB rgb;
+#if SPLASH_CMYK
+  GfxCMYK cmyk;
+#endif
+  Guchar pix;
+  int n, i;
+
+  setOverprintMask(colorMap->getColorSpace(), state->getFillOverprint(),
+                  state->getOverprintMode(), NULL);
+
+  ctm = state->getCTM();
+  for (i = 0; i < 6; ++i) {
+    if (!isfinite(ctm[i])) return;
+  }
+  mat[0] = ctm[0];
+  mat[1] = ctm[1];
+  mat[2] = -ctm[2];
+  mat[3] = -ctm[3];
+  mat[4] = ctm[2] + ctm[4];
+  mat[5] = ctm[3] + ctm[5];
+
+  //----- set up the soft mask
+
+  imgMaskData.imgStr = new ImageStream(maskStr, maskWidth,
+                                      maskColorMap->getNumPixelComps(),
+                                      maskColorMap->getBits());
+  imgMaskData.imgStr->reset();
+  imgMaskData.colorMap = maskColorMap;
+  imgMaskData.maskColors = NULL;
+  imgMaskData.colorMode = splashModeMono8;
+  imgMaskData.width = maskWidth;
+  imgMaskData.height = maskHeight;
+  imgMaskData.y = 0;
+  n = 1 << maskColorMap->getBits();
+  imgMaskData.lookup = (SplashColorPtr)gmalloc(n);
+  for (i = 0; i < n; ++i) {
+    pix = (Guchar)i;
+    maskColorMap->getGray(&pix, &gray);
+    imgMaskData.lookup[i] = colToByte(gray);
+  }
+  maskBitmap = new SplashBitmap(bitmap->getWidth(), bitmap->getHeight(),
+                               1, splashModeMono8, gFalse);
+  maskSplash = new Splash(maskBitmap, vectorAntialias);
+  maskColor[0] = 0;
+  maskSplash->clear(maskColor);
+  maskSplash->drawImage(&imageSrc, &imgMaskData, splashModeMono8, gFalse,
+                       maskWidth, maskHeight, mat);
+  delete imgMaskData.imgStr;
+  maskStr->close();
+  gfree(imgMaskData.lookup);
+  delete maskSplash;
+  splash->setSoftMask(maskBitmap);
+
+  //----- draw the source image
+
+  imgData.imgStr = new ImageStream(str, width,
+                                  colorMap->getNumPixelComps(),
+                                  colorMap->getBits());
+  imgData.imgStr->reset();
+  imgData.colorMap = colorMap;
+  imgData.maskColors = NULL;
+  imgData.colorMode = colorMode;
+  imgData.width = width;
+  imgData.height = height;
+  imgData.y = 0;
+
+  // special case for one-channel (monochrome/gray/separation) images:
+  // build a lookup table here
+  imgData.lookup = NULL;
+  if (colorMap->getNumPixelComps() == 1) {
+    n = 1 << colorMap->getBits();
+    switch (colorMode) {
+    case splashModeMono1:
+    case splashModeMono8:
+      imgData.lookup = (SplashColorPtr)gmalloc(n);
+      for (i = 0; i < n; ++i) {
+       pix = (Guchar)i;
+       colorMap->getGray(&pix, &gray);
+       imgData.lookup[i] = colToByte(gray);
+      }
+      break;
+    case splashModeRGB8:
+    case splashModeBGR8:
+      imgData.lookup = (SplashColorPtr)gmallocn(n, 3);
+      for (i = 0; i < n; ++i) {
+       pix = (Guchar)i;
+       colorMap->getRGB(&pix, &rgb);
+       imgData.lookup[3*i] = colToByte(rgb.r);
+       imgData.lookup[3*i+1] = colToByte(rgb.g);
+       imgData.lookup[3*i+2] = colToByte(rgb.b);
+      }
+      break;
+    case splashModeXBGR8:
+      imgData.lookup = (SplashColorPtr)gmallocn(n, 4);
+      for (i = 0; i < n; ++i) {
+       pix = (Guchar)i;
+       colorMap->getRGB(&pix, &rgb);
+       imgData.lookup[4*i] = colToByte(rgb.r);
+       imgData.lookup[4*i+1] = colToByte(rgb.g);
+       imgData.lookup[4*i+2] = colToByte(rgb.b);
+       imgData.lookup[4*i+3] = 255;
+      }
+      break;
+#if SPLASH_CMYK
+    case splashModeCMYK8:
+      imgData.lookup = (SplashColorPtr)gmallocn(n, 4);
+      for (i = 0; i < n; ++i) {
+       pix = (Guchar)i;
+       colorMap->getCMYK(&pix, &cmyk);
+       imgData.lookup[4*i] = colToByte(cmyk.c);
+       imgData.lookup[4*i+1] = colToByte(cmyk.m);
+       imgData.lookup[4*i+2] = colToByte(cmyk.y);
+       imgData.lookup[4*i+3] = colToByte(cmyk.k);
+      }
+      break;
+#endif
+    }
+  }
+
+  if (colorMode == splashModeMono1) {
+    srcMode = splashModeMono8;
+  } else {
+    srcMode = colorMode;
+  }
+  splash->drawImage(&imageSrc, &imgData, srcMode, gFalse, width, height, mat);
+  splash->setSoftMask(NULL);
+  gfree(imgData.lookup);
+  delete imgData.imgStr;
+  str->close();
+}
+
+GBool SplashOutputDev::checkTransparencyGroup(GfxState *state, GBool knockout) {
+  if (state->getFillOpacity() != 1 || 
+    state->getStrokeOpacity() != 1 ||
+    state->getAlphaIsShape() ||
+    state->getBlendMode() != gfxBlendNormal ||
+    splash->getSoftMask() != NULL ||
+    knockout) 
+    return gTrue;
+  return transpGroupStack != NULL && transpGroupStack->shape != NULL;
+}
+
+void SplashOutputDev::beginTransparencyGroup(GfxState *state, double *bbox,
+                                            GfxColorSpace *blendingColorSpace,
+                                            GBool isolated, GBool knockout,
+                                            GBool forSoftMask) {
+  SplashTransparencyGroup *transpGroup;
+  SplashColor color;
+  double xMin, yMin, xMax, yMax, x, y;
+  int tx, ty, w, h, i;
+
+  // transform the bbox
+  state->transform(bbox[0], bbox[1], &x, &y);
+  xMin = xMax = x;
+  yMin = yMax = y;
+  state->transform(bbox[0], bbox[3], &x, &y);
+  if (x < xMin) {
+    xMin = x;
+  } else if (x > xMax) {
+    xMax = x;
+  }
+  if (y < yMin) {
+    yMin = y;
+  } else if (y > yMax) {
+    yMax = y;
+  }
+  state->transform(bbox[2], bbox[1], &x, &y);
+  if (x < xMin) {
+    xMin = x;
+  } else if (x > xMax) {
+    xMax = x;
+  }
+  if (y < yMin) {
+    yMin = y;
+  } else if (y > yMax) {
+    yMax = y;
+  }
+  state->transform(bbox[2], bbox[3], &x, &y);
+  if (x < xMin) {
+    xMin = x;
+  } else if (x > xMax) {
+    xMax = x;
+  }
+  if (y < yMin) {
+    yMin = y;
+  } else if (y > yMax) {
+    yMax = y;
+  }
+  tx = (int)floor(xMin);
+  if (tx < 0) {
+    tx = 0;
+  } else if (tx >= bitmap->getWidth()) {
+    tx = bitmap->getWidth() - 1;
+  }
+  ty = (int)floor(yMin);
+  if (ty < 0) {
+    ty = 0;
+  } else if (ty >= bitmap->getHeight()) {
+    ty = bitmap->getHeight() - 1;
+  }
+  w = (int)ceil(xMax) - tx + 1;
+  if (tx + w > bitmap->getWidth()) {
+    w = bitmap->getWidth() - tx;
+  }
+  if (w < 1) {
+    w = 1;
+  }
+  h = (int)ceil(yMax) - ty + 1;
+  if (ty + h > bitmap->getHeight()) {
+    h = bitmap->getHeight() - ty;
+  }
+  if (h < 1) {
+    h = 1;
+  }
+
+  // push a new stack entry
+  transpGroup = new SplashTransparencyGroup();
+  transpGroup->tx = tx;
+  transpGroup->ty = ty;
+  transpGroup->blendingColorSpace = blendingColorSpace;
+  transpGroup->isolated = isolated;
+  transpGroup->shape = (knockout) ? SplashBitmap::copy(bitmap) : NULL;
+  transpGroup->knockout = gFalse; 
+  transpGroup->knockoutOpacity = 1.0;
+  transpGroup->next = transpGroupStack;
+  transpGroupStack = transpGroup;
+
+  // save state
+  transpGroup->origBitmap = bitmap;
+  transpGroup->origSplash = splash;
+
+  //~ this handles the blendingColorSpace arg for soft masks, but
+  //~   not yet for transparency groups
+
+  // switch to the blending color space
+  if (forSoftMask && isolated && blendingColorSpace) {
+    if (blendingColorSpace->getMode() == csDeviceGray ||
+       blendingColorSpace->getMode() == csCalGray ||
+       (blendingColorSpace->getMode() == csICCBased &&
+        blendingColorSpace->getNComps() == 1)) {
+      colorMode = splashModeMono8;
+    } else if (blendingColorSpace->getMode() == csDeviceRGB ||
+              blendingColorSpace->getMode() == csCalRGB ||
+              (blendingColorSpace->getMode() == csICCBased &&
+               blendingColorSpace->getNComps() == 3)) {
+      //~ does this need to use BGR8?
+      colorMode = splashModeRGB8;
+#if SPLASH_CMYK
+    } else if (blendingColorSpace->getMode() == csDeviceCMYK ||
+              (blendingColorSpace->getMode() == csICCBased &&
+               blendingColorSpace->getNComps() == 4)) {
+      colorMode = splashModeCMYK8;
+#endif
+    }
+  }
+
+  // create the temporary bitmap
+  bitmap = new SplashBitmap(w, h, bitmapRowPad, colorMode, gTrue,
+                           bitmapTopDown);
+  splash = new Splash(bitmap, vectorAntialias,
+                     transpGroup->origSplash->getScreen());
+  splash->setMinLineWidth(globalParams->getMinLineWidth());
+  //~ Acrobat apparently copies at least the fill and stroke colors, and
+  //~ maybe other state(?) -- but not the clipping path (and not sure
+  //~ what else)
+  //~ [this is likely the same situation as in type3D1()]
+  splash->setFillPattern(transpGroup->origSplash->getFillPattern()->copy());
+  splash->setStrokePattern(
+                        transpGroup->origSplash->getStrokePattern()->copy());
+  if (isolated) {
+    for (i = 0; i < splashMaxColorComps; ++i) {
+      color[i] = 0;
+    }
+    if (colorMode == splashModeXBGR8) color[3] = 255;
+    splash->clear(color, 0);
+  } else {
+    SplashBitmap *shape = (knockout) ? transpGroup->shape :
+                                       (transpGroup->next != NULL && transpGroup->next->shape != NULL) ? transpGroup->next->shape : transpGroup->origBitmap;
+    splash->blitTransparent(transpGroup->origBitmap, tx, ty, 0, 0, w, h);
+    splash->setInNonIsolatedGroup(shape, tx, ty);
+  }
+  transpGroup->tBitmap = bitmap;
+  state->shiftCTM(-tx, -ty);
+  updateCTM(state, 0, 0, 0, 0, 0, 0);
+  ++nestCount;
+}
+
+void SplashOutputDev::endTransparencyGroup(GfxState *state) {
+  // restore state
+  --nestCount;
+  delete splash;
+  bitmap = transpGroupStack->origBitmap;
+  colorMode = bitmap->getMode();
+  splash = transpGroupStack->origSplash;
+  state->shiftCTM(transpGroupStack->tx, transpGroupStack->ty);
+  updateCTM(state, 0, 0, 0, 0, 0, 0);
+}
+
+void SplashOutputDev::paintTransparencyGroup(GfxState *state, double *bbox) {
+  SplashBitmap *tBitmap;
+  SplashTransparencyGroup *transpGroup;
+  GBool isolated;
+  int tx, ty;
+
+  tx = transpGroupStack->tx;
+  ty = transpGroupStack->ty;
+  tBitmap = transpGroupStack->tBitmap;
+  isolated = transpGroupStack->isolated;
+
+  // paint the transparency group onto the parent bitmap
+  // - the clip path was set in the parent's state)
+  if (tx < bitmap->getWidth() && ty < bitmap->getHeight()) {
+    SplashCoord knockoutOpacity = (transpGroupStack->next != NULL) ? transpGroupStack->next->knockoutOpacity
+                                                                   : transpGroupStack->knockoutOpacity;
+    splash->setOverprintMask(0xffffffff, gFalse);
+    splash->composite(tBitmap, 0, 0, tx, ty,
+             tBitmap->getWidth(), tBitmap->getHeight(),
+             gFalse, !isolated, transpGroupStack->next != NULL && transpGroupStack->next->knockout, knockoutOpacity);
+    if (transpGroupStack->next != NULL && transpGroupStack->next->shape != NULL) {
+      transpGroupStack->next->knockout = gTrue;
+    }
+  }
+
+  // pop the stack
+  transpGroup = transpGroupStack;
+  transpGroupStack = transpGroup->next;
+  if (transpGroupStack != NULL && transpGroup->knockoutOpacity < transpGroupStack->knockoutOpacity) {
+    transpGroupStack->knockoutOpacity = transpGroup->knockoutOpacity;
+  }
+  delete transpGroup->shape;
+  delete transpGroup;
+
+  delete tBitmap;
+}
+
+void SplashOutputDev::setSoftMask(GfxState *state, double *bbox,
+                                 GBool alpha, Function *transferFunc,
+                                 GfxColor *backdropColor) {
+  SplashBitmap *softMask, *tBitmap;
+  Splash *tSplash;
+  SplashTransparencyGroup *transpGroup;
+  SplashColor color;
+  SplashColorPtr p;
+  GfxGray gray;
+  GfxRGB rgb;
+#if SPLASH_CMYK
+  GfxCMYK cmyk;
+#endif
+  double lum, lum2;
+  int tx, ty, x, y;
+
+  tx = transpGroupStack->tx;
+  ty = transpGroupStack->ty;
+  tBitmap = transpGroupStack->tBitmap;
+
+  // composite with backdrop color
+  if (!alpha && tBitmap->getMode() != splashModeMono1) {
+    //~ need to correctly handle the case where no blending color
+    //~ space is given
+    if (transpGroupStack->blendingColorSpace) {
+      tSplash = new Splash(tBitmap, vectorAntialias,
+                          transpGroupStack->origSplash->getScreen());
+      switch (tBitmap->getMode()) {
+      case splashModeMono1:
+       // transparency is not supported in mono1 mode
+       break;
+      case splashModeMono8:
+       transpGroupStack->blendingColorSpace->getGray(backdropColor, &gray);
+       color[0] = colToByte(gray);
+       tSplash->compositeBackground(color);
+       break;
+      case splashModeXBGR8:
+       color[3] = 255;
+      case splashModeRGB8:
+      case splashModeBGR8:
+       transpGroupStack->blendingColorSpace->getRGB(backdropColor, &rgb);
+       color[0] = colToByte(rgb.r);
+       color[1] = colToByte(rgb.g);
+       color[2] = colToByte(rgb.b);
+       tSplash->compositeBackground(color);
+       break;
+#if SPLASH_CMYK
+      case splashModeCMYK8:
+       transpGroupStack->blendingColorSpace->getCMYK(backdropColor, &cmyk);
+       color[0] = colToByte(cmyk.c);
+       color[1] = colToByte(cmyk.m);
+       color[2] = colToByte(cmyk.y);
+       color[3] = colToByte(cmyk.k);
+       tSplash->compositeBackground(color);
+       break;
+#endif
+      }
+      delete tSplash;
+    }
+  }
+
+  softMask = new SplashBitmap(bitmap->getWidth(), bitmap->getHeight(),
+                             1, splashModeMono8, gFalse);
+  unsigned char fill = 0;
+  if (transpGroupStack->blendingColorSpace) {
+       transpGroupStack->blendingColorSpace->getGray(backdropColor, &gray);
+       fill = colToByte(gray);
+  }
+  memset(softMask->getDataPtr(), fill,
+        softMask->getRowSize() * softMask->getHeight());
+  p = softMask->getDataPtr() + ty * softMask->getRowSize() + tx;
+  int xMax = tBitmap->getWidth();
+  int yMax = tBitmap->getHeight();
+  if (xMax + tx > bitmap->getWidth()) xMax = bitmap->getWidth() - tx;
+  if (yMax + ty > bitmap->getHeight()) yMax = bitmap->getHeight() - ty;
+  for (y = 0; y < yMax; ++y) {
+    for (x = 0; x < xMax; ++x) {
+      if (alpha) {
+       p[x] = tBitmap->getAlpha(x, y);
+      } else {
+         tBitmap->getPixel(x, y, color);
+         // convert to luminosity
+         switch (tBitmap->getMode()) {
+         case splashModeMono1:
+         case splashModeMono8:
+           lum = color[0] / 255.0;
+           break;
+         case splashModeXBGR8:
+         case splashModeRGB8:
+         case splashModeBGR8:
+           lum = (0.3 / 255.0) * color[0] +
+                 (0.59 / 255.0) * color[1] +
+                 (0.11 / 255.0) * color[2];
+           break;
+#if SPLASH_CMYK
+         case splashModeCMYK8:
+           lum = (1 - color[3] / 255.0)
+                 - (0.3 / 255.0) * color[0]
+                 - (0.59 / 255.0) * color[1]
+                 - (0.11 / 255.0) * color[2];
+           if (lum < 0) {
+             lum = 0;
+           }
+           break;
+#endif
+       }
+       if (transferFunc) {
+         transferFunc->transform(&lum, &lum2);
+       } else {
+         lum2 = lum;
+       }
+       p[x] = (int)(lum2 * 255.0 + 0.5);
+      }
+    }
+       p += softMask->getRowSize();
+  }
+  splash->setSoftMask(softMask);
+
+  // pop the stack
+  transpGroup = transpGroupStack;
+  transpGroupStack = transpGroup->next;
+  delete transpGroup;
+
+  delete tBitmap;
+}
+
+void SplashOutputDev::clearSoftMask(GfxState *state) {
+  splash->setSoftMask(NULL);
+}
+
+void SplashOutputDev::setPaperColor(SplashColorPtr paperColorA) {
+  splashColorCopy(paperColor, paperColorA);
+}
+
+int SplashOutputDev::getBitmapWidth() {
+  return bitmap->getWidth();
+}
+
+int SplashOutputDev::getBitmapHeight() {
+  return bitmap->getHeight();
+}
+
+SplashBitmap *SplashOutputDev::takeBitmap() {
+  SplashBitmap *ret;
+
+  ret = bitmap;
+  bitmap = new SplashBitmap(1, 1, bitmapRowPad, colorMode,
+                           colorMode != splashModeMono1, bitmapTopDown);
+  return ret;
+}
+
+void SplashOutputDev::getModRegion(int *xMin, int *yMin,
+                                  int *xMax, int *yMax) {
+  splash->getModRegion(xMin, yMin, xMax, yMax);
+}
+
+void SplashOutputDev::clearModRegion() {
+  splash->clearModRegion();
+}
+
+#if 1 //~tmp: turn off anti-aliasing temporarily
+GBool SplashOutputDev::getVectorAntialias() {
+  return splash->getVectorAntialias();
+}
+
+void SplashOutputDev::setVectorAntialias(GBool vaa) {
+  vectorAntialias = vaa;
+  splash->setVectorAntialias(vaa);
+}
+#endif
+
+void SplashOutputDev::setFreeTypeHinting(GBool enable, GBool enableSlightHintingA)
+{
+  enableFreeTypeHinting = enable;
+  enableSlightHinting = enableSlightHintingA;
+}
+
+GBool SplashOutputDev::tilingPatternFill(GfxState *state, Gfx *gfx1, Catalog *catalog, Object *str,
+                                       double *ptm, int paintType, int /*tilingType*/, Dict *resDict,
+                                       double *mat, double *bbox,
+                                       int x0, int y0, int x1, int y1,
+                                       double xStep, double yStep)
+{
+  PDFRectangle box;
+  Gfx *gfx;
+  Splash *formerSplash = splash;
+  SplashBitmap *formerBitmap = bitmap;
+  double width, height;
+  int surface_width, surface_height, result_width, result_height, i;
+  int repeatX, repeatY;
+  SplashCoord matc[6];
+  Matrix m1;
+  double *ctm, savedCTM[6];
+  double kx, ky, sx, sy;
+
+  width = bbox[2] - bbox[0];
+  height = bbox[3] - bbox[1];
+
+  if (xStep != width || yStep != height)
+    return gFalse;
+
+  // calculate offsets
+  ctm = state->getCTM();
+  for (i = 0; i < 6; ++i) {
+    savedCTM[i] = ctm[i];
+  }
+  state->concatCTM(mat[0], mat[1], mat[2], mat[3], mat[4], mat[5]);
+  state->concatCTM(1, 0, 0, 1, bbox[0], bbox[1]);
+  ctm = state->getCTM();
+  for (i = 0; i < 6; ++i) {
+    if (!isfinite(ctm[i]))
+      return gFalse;
+  }
+  matc[4] = x0 * xStep * ctm[0] + y0 * yStep * ctm[2] + ctm[4];
+  matc[5] = x0 * xStep * ctm[1] + y0 * yStep * ctm[3] + ctm[5];
+  if (splashAbs(ctm[1]) > splashAbs(ctm[0])) {
+    kx = -ctm[1];
+    ky = ctm[2] - (ctm[0] * ctm[3]) / ctm[1];
+  } else {
+    kx = ctm[0];
+    ky = ctm[3] - (ctm[1] * ctm[2]) / ctm[0];
+  }
+  result_width = (int) ceil(fabs(kx * width * (x1 - x0)));
+  result_height = (int) ceil(fabs(ky * height * (y1 - y0)));
+  kx = state->getHDPI() / 72.0;
+  ky = state->getVDPI() / 72.0;
+  m1.m[0] = (ptm[0] == 0) ? fabs(ptm[2]) * kx : fabs(ptm[0]) * kx;
+  m1.m[1] = 0;
+  m1.m[2] = 0;
+  m1.m[3] = (ptm[3] == 0) ? fabs(ptm[1]) * ky : fabs(ptm[3]) * ky;
+  m1.m[4] = 0;
+  m1.m[5] = 0;
+  m1.transform(width, height, &kx, &ky);
+  surface_width = (int) ceil (fabs(kx));
+  surface_height = (int) ceil (fabs(ky));
+
+  sx = (double) result_width / (surface_width * (x1 - x0));
+  sy = (double) result_height / (surface_height * (y1 - y0));
+  m1.m[0] *= sx;
+  m1.m[3] *= sy;
+  m1.transform(width, height, &kx, &ky);
+
+  if(fabs(kx) < 1 && fabs(ky) < 1) {
+    kx = std::min<double>(kx, ky);
+    ky = 2 / kx;
+    m1.m[0] *= ky;
+    m1.m[3] *= ky;
+    m1.transform(width, height, &kx, &ky);
+    surface_width = (int) ceil (fabs(kx));
+    surface_height = (int) ceil (fabs(ky));
+    repeatX = x1 - x0;
+    repeatY = y1 - y0;
+  } else {
+    while(fabs(kx) > 16384 || fabs(ky) > 16384) {
+      // limit pattern bitmap size
+      m1.m[0] /= 2;
+      m1.m[3] /= 2;
+      m1.transform(width, height, &kx, &ky);
+    }
+    surface_width = (int) ceil (fabs(kx));
+    surface_height = (int) ceil (fabs(ky));
+    // adjust repeat values to completely fill region
+    repeatX = result_width / surface_width;
+    repeatY = result_height / surface_height;
+    if (surface_width * repeatX < result_width)
+      repeatX++;
+    if (surface_height * repeatY < result_height)
+      repeatY++;
+    if (x1 - x0 > repeatX)
+      repeatX = x1 - x0;
+    if (y1 - y0 > repeatY)
+      repeatY = y1 - y0;
+  }
+  // restore CTM and calculate rotate and scale with rounded matric
+  state->setCTM(savedCTM[0], savedCTM[1], savedCTM[2], savedCTM[3], savedCTM[4], savedCTM[5]);
+  state->concatCTM(mat[0], mat[1], mat[2], mat[3], mat[4], mat[5]);
+  state->concatCTM(width * repeatX, 0, 0, height * repeatY, bbox[0], bbox[1]);
+  ctm = state->getCTM();
+  matc[0] = ctm[0];
+  matc[1] = ctm[1];
+  matc[2] = ctm[2];
+  matc[3] = ctm[3];
+
+  if (surface_width == 0 || surface_height == 0)
+    return gFalse;
+  m1.transform(bbox[0], bbox[1], &kx, &ky);
+  m1.m[4] = -kx;
+  m1.m[5] = -ky;
+
+  bitmap = new SplashBitmap(surface_width, surface_height, colorMode != splashModeMono1,
+                            (paintType == 1) ? colorMode : splashModeMono8, gTrue);
+  memset(bitmap->getAlphaPtr(), 0, bitmap->getWidth() * bitmap->getHeight());
+  if (paintType == 2) {
+#if SPLASH_CMYK
+    memset(bitmap->getDataPtr(), (colorMode == splashModeCMYK8) ? 0x00 : 0xFF, bitmap->getRowSize() * bitmap->getHeight());
+#else
+    memset(bitmap->getDataPtr(), 0xFF, bitmap->getRowSize() * bitmap->getHeight());
+#endif
+  }
+  splash = new Splash(bitmap, gTrue);
+  splash->setMinLineWidth(globalParams->getMinLineWidth());
+
+  box.x1 = bbox[0]; box.y1 = bbox[1];
+  box.x2 = bbox[2]; box.y2 = bbox[3];
+  gfx = new Gfx(doc, this, resDict, &box, NULL);
+  // set pattern transformation matrix
+  gfx->getState()->setCTM(m1.m[0], m1.m[1], m1.m[2], m1.m[3], m1.m[4], m1.m[5]);
+  updateCTM(gfx->getState(), m1.m[0], m1.m[1], m1.m[2], m1.m[3], m1.m[4], m1.m[5]);
+  gfx->display(str);
+  splash = formerSplash;
+  TilingSplashOutBitmap imgData;
+  imgData.bitmap = bitmap;
+  imgData.paintType = paintType;
+  imgData.pattern = splash->getFillPattern();
+  imgData.colorMode = colorMode;
+  imgData.y = 0;
+  imgData.repeatX = repeatX;
+  imgData.repeatY = repeatY;
+  SplashBitmap *tBitmap = bitmap;
+  bitmap = formerBitmap;
+  result_width = tBitmap->getWidth() * imgData.repeatX;
+  result_height = tBitmap->getHeight() * imgData.repeatY;
+
+  if (splashAbs(matc[1]) > splashAbs(matc[0])) {
+    kx = -matc[1];
+    ky = matc[2] - (matc[0] * matc[3]) / matc[1];
+  } else {
+    kx = matc[0];
+    ky = matc[3] - (matc[1] * matc[2]) / matc[0];
+  }
+  kx = result_width / (fabs(kx) + 1);
+  ky = result_height / (fabs(ky) + 1);
+  state->concatCTM(kx, 0, 0, ky, 0, 0);
+  ctm = state->getCTM();
+  matc[0] = ctm[0];
+  matc[1] = ctm[1];
+  matc[2] = ctm[2];
+  matc[3] = ctm[3];
+  splash->drawImage(&tilingBitmapSrc, &imgData, colorMode, gTrue, result_width, result_height, matc, gTrue);
+  delete tBitmap;
+  delete gfx;
+  return gTrue;
+}
+
+GBool SplashOutputDev::gouraudTriangleShadedFill(GfxState *state, GfxGouraudTriangleShading *shading)
+{
+  GfxColorSpaceMode shadingMode = shading->getColorSpace()->getMode();
+  GBool bDirectColorTranslation = gFalse; // triggers an optimization.
+  switch (colorMode) {
+    case splashModeRGB8:
+      bDirectColorTranslation = (shadingMode == csDeviceRGB);
+    break;
+#if SPLASH_CMYK
+    case splashModeCMYK8:
+      bDirectColorTranslation = (shadingMode == csDeviceCMYK);
+    break;
+#endif
+    default:
+    break;
+  }
+  SplashGouraudColor *splashShading = new SplashGouraudPattern(bDirectColorTranslation, state, shading, colorMode);
+  // restore vector antialias because we support it here
+  if (shading->isParameterized()) {
+    GBool vaa = getVectorAntialias();
+    GBool retVal = gFalse;
+    setVectorAntialias(gTrue);
+    retVal = splash->gouraudTriangleShadedFill(splashShading);
+    setVectorAntialias(vaa);
+    return retVal;
+  }
+  return gFalse;
+}
+
+GBool SplashOutputDev::univariateShadedFill(GfxState *state, SplashUnivariatePattern *pattern, double tMin, double tMax) {
+  double xMin, yMin, xMax, yMax;
+  SplashPath *path;
+  GBool vaa = getVectorAntialias();
+  // restore vector antialias because we support it here
+  setVectorAntialias(gTrue);
+
+  GBool retVal = gFalse;
+  // get the clip region bbox
+  if (pattern->getShading()->getHasBBox()) {
+    pattern->getShading()->getBBox(&xMin, &yMin, &xMax, &yMax);
+  } else {
+    state->getClipBBox(&xMin, &yMin, &xMax, &yMax);
+
+    xMin = floor (xMin);
+    yMin = floor (yMin);
+    xMax = ceil (xMax);
+    yMax = ceil (yMax);
+
+    {
+      Matrix ctm, ictm;
+      double x[4], y[4];
+      int i;
+
+      state->getCTM(&ctm);
+      ctm.invertTo(&ictm);
+
+      ictm.transform(xMin, yMin, &x[0], &y[0]);
+      ictm.transform(xMax, yMin, &x[1], &y[1]);
+      ictm.transform(xMin, yMax, &x[2], &y[2]);
+      ictm.transform(xMax, yMax, &x[3], &y[3]);
+
+      xMin = xMax = x[0];
+      yMin = yMax = y[0];
+      for (i = 1; i < 4; i++) {
+        xMin = std::min<double>(xMin, x[i]);
+        yMin = std::min<double>(yMin, y[i]);
+        xMax = std::max<double>(xMax, x[i]);
+        yMax = std::max<double>(yMax, y[i]);
+      }
+    }
+  }
+
+  // fill the region
+  state->moveTo(xMin, yMin);
+  state->lineTo(xMax, yMin);
+  state->lineTo(xMax, yMax);
+  state->lineTo(xMin, yMax);
+  state->closePath();
+  path = convertPath(state, state->getPath(), gTrue);
+
+  setOverprintMask(pattern->getShading()->getColorSpace(), state->getFillOverprint(),
+                  state->getOverprintMode(), state->getFillColor());
+  retVal = (splash->shadedFill(path, pattern->getShading()->getHasBBox(), pattern) == splashOk);
+  state->clearPath();
+  setVectorAntialias(vaa);
+  delete path;
+
+  return retVal;
+}
+
+GBool SplashOutputDev::axialShadedFill(GfxState *state, GfxAxialShading *shading, double tMin, double tMax) {
+  SplashAxialPattern *pattern = new SplashAxialPattern(colorMode, state, shading);
+  GBool retVal = univariateShadedFill(state, pattern, tMin, tMax);
+
+  delete pattern;
+
+  return retVal;
+}
+
+GBool SplashOutputDev::radialShadedFill(GfxState *state, GfxRadialShading *shading, double tMin, double tMax) {
+  SplashRadialPattern *pattern = new SplashRadialPattern(colorMode, state, shading);
+  GBool retVal = univariateShadedFill(state, pattern, tMin, tMax);
+
+  delete pattern;
+
+  return retVal;
+}
diff --git a/poppler/SplashOutputDev.h b/poppler/SplashOutputDev.h
new file mode 100644 (file)
index 0000000..f1c87ec
--- /dev/null
@@ -0,0 +1,420 @@
+//========================================================================
+//
+// SplashOutputDev.h
+//
+// Copyright 2003 Glyph & Cog, LLC
+//
+//========================================================================
+
+//========================================================================
+//
+// Modified under the Poppler project - http://poppler.freedesktop.org
+//
+// All changes made under the Poppler project to this file are licensed
+// under GPL version 2 or later
+//
+// Copyright (C) 2005 Takashi Iwai <tiwai@suse.de>
+// Copyright (C) 2009-2012 Thomas Freitag <Thomas.Freitag@alfa.de>
+// Copyright (C) 2009 Carlos Garcia Campos <carlosgc@gnome.org>
+// Copyright (C) 2010 Christian Feuersänger <cfeuersaenger@googlemail.com>
+// Copyright (C) 2011 Andreas Hartmetz <ahartmetz@gmail.com>
+// Copyright (C) 2011 Andrea Canciani <ranma42@gmail.com>
+// Copyright (C) 2011 Adrian Johnson <ajohnson@redneon.com>
+// Copyright (C) 2012 Albert Astals Cid <aacid@kde.org>
+//
+// To see a description of the changes please see the Changelog file that
+// came with your tarball or type make ChangeLog if you are building from git
+//
+//========================================================================
+
+#ifndef SPLASHOUTPUTDEV_H
+#define SPLASHOUTPUTDEV_H
+
+#ifdef USE_GCC_PRAGMAS
+#pragma interface
+#endif
+
+#include "goo/gtypes.h"
+#include "splash/SplashTypes.h"
+#include "splash/SplashPattern.h"
+#include "poppler-config.h"
+#include "OutputDev.h"
+#include "GfxState.h"
+
+class PDFDoc;
+class Gfx8BitFont;
+class SplashBitmap;
+class Splash;
+class SplashPath;
+class SplashFontEngine;
+class SplashFont;
+class T3FontCache;
+struct T3FontCacheTag;
+struct T3GlyphStack;
+struct SplashTransparencyGroup;
+
+//------------------------------------------------------------------------
+// Splash dynamic pattern
+//------------------------------------------------------------------------
+
+class SplashUnivariatePattern: public SplashPattern {
+public:
+
+  SplashUnivariatePattern(SplashColorMode colorMode, GfxState *state, GfxUnivariateShading *shading);
+
+  virtual ~SplashUnivariatePattern();
+
+  virtual GBool getColor(int x, int y, SplashColorPtr c);
+
+  virtual GBool testPosition(int x, int y);
+
+  virtual GBool isStatic() { return gFalse; }
+
+  virtual GBool getParameter(double xs, double ys, double *t) = 0;
+
+  virtual GfxUnivariateShading *getShading() { return shading; }
+
+protected:
+  Matrix ictm;
+  double t0, t1, dt;
+  GfxUnivariateShading *shading;
+  GfxState *state;
+  SplashColorMode colorMode;
+};
+
+class SplashAxialPattern: public SplashUnivariatePattern {
+public:
+
+  SplashAxialPattern(SplashColorMode colorMode, GfxState *state, GfxAxialShading *shading);
+
+  virtual SplashPattern *copy() { return new SplashAxialPattern(colorMode, state, (GfxAxialShading *) shading); }
+
+  virtual ~SplashAxialPattern();
+
+  virtual GBool getParameter(double xs, double ys, double *t);
+
+private:
+  double x0, y0, x1, y1;
+  double dx, dy, mul;
+};
+
+// see GfxState.h, GfxGouraudTriangleShading
+class SplashGouraudPattern: public SplashGouraudColor {
+public:
+
+  SplashGouraudPattern(GBool bDirectColorTranslation, GfxState *state, GfxGouraudTriangleShading *shading, SplashColorMode mode);
+
+  virtual SplashPattern *copy() { return new SplashGouraudPattern(bDirectColorTranslation, state, shading, mode); }
+
+  virtual ~SplashGouraudPattern();
+
+  virtual GBool getColor(int x, int y, SplashColorPtr c) { return gFalse; }
+
+  virtual GBool testPosition(int x, int y) { return gFalse; }
+
+  virtual GBool isStatic() { return gFalse; }
+
+  virtual GBool isParameterized() { return shading->isParameterized(); }
+  virtual int getNTriangles() { return shading->getNTriangles(); }
+  virtual  void getTriangle(int i, double *x0, double *y0, double *color0,
+                            double *x1, double *y1, double *color1,
+                            double *x2, double *y2, double *color2)
+  { return shading->getTriangle(i, x0, y0, color0, x1, y1, color1, x2, y2, color2); }
+
+  virtual void getParameterizedColor(double t, SplashColorMode mode, SplashColorPtr c);
+
+private:
+  GfxGouraudTriangleShading *shading;
+  GfxState *state;
+  GBool bDirectColorTranslation;
+  SplashColorMode mode;
+};
+
+// see GfxState.h, GfxRadialShading
+class SplashRadialPattern: public SplashUnivariatePattern {
+public:
+
+  SplashRadialPattern(SplashColorMode colorMode, GfxState *state, GfxRadialShading *shading);
+
+  virtual SplashPattern *copy() { return new SplashRadialPattern(colorMode, state, (GfxRadialShading *) shading); }
+
+  virtual ~SplashRadialPattern();
+
+  virtual GBool getParameter(double xs, double ys, double *t);
+
+private:
+  double x0, y0, r0, dx, dy, dr;
+  double a, inva;
+};
+
+//------------------------------------------------------------------------
+
+// number of Type 3 fonts to cache
+#define splashOutT3FontCacheSize 8
+
+//------------------------------------------------------------------------
+// SplashOutputDev
+//------------------------------------------------------------------------
+
+class SplashOutputDev: public OutputDev {
+public:
+
+  // Constructor.
+  SplashOutputDev(SplashColorMode colorModeA, int bitmapRowPadA,
+                 GBool reverseVideoA, SplashColorPtr paperColorA,
+                 GBool bitmapTopDownA = gTrue,
+                 GBool allowAntialiasA = gTrue);
+
+  // Destructor.
+  virtual ~SplashOutputDev();
+
+  //----- get info about output device
+
+  // Does this device use tilingPatternFill()?  If this returns false,
+  // tiling pattern fills will be reduced to a series of other drawing
+  // operations.
+  virtual GBool useTilingPatternFill() { return gTrue; }
+
+  // Does this device use functionShadedFill(), axialShadedFill(), and
+  // radialShadedFill()?  If this returns false, these shaded fills
+  // will be reduced to a series of other drawing operations.
+  virtual GBool useShadedFills(int type)
+  { return (type >= 2 && type <= 5) ? gTrue : gFalse; }
+
+  // Does this device use upside-down coordinates?
+  // (Upside-down means (0,0) is the top left corner of the page.)
+  virtual GBool upsideDown() { return bitmapTopDown ^ bitmapUpsideDown; }
+
+  // Does this device use drawChar() or drawString()?
+  virtual GBool useDrawChar() { return gTrue; }
+
+  // Does this device use beginType3Char/endType3Char?  Otherwise,
+  // text in Type 3 fonts will be drawn with drawChar/drawString.
+  virtual GBool interpretType3Chars() { return gTrue; }
+
+  //----- initialization and control
+
+  // Start a page.
+  virtual void startPage(int pageNum, GfxState *state);
+
+  // End a page.
+  virtual void endPage();
+
+  //----- save/restore graphics state
+  virtual void saveState(GfxState *state);
+  virtual void restoreState(GfxState *state);
+
+  //----- update graphics state
+  virtual void updateAll(GfxState *state);
+  virtual void updateCTM(GfxState *state, double m11, double m12,
+                        double m21, double m22, double m31, double m32);
+  virtual void updateLineDash(GfxState *state);
+  virtual void updateFlatness(GfxState *state);
+  virtual void updateLineJoin(GfxState *state);
+  virtual void updateLineCap(GfxState *state);
+  virtual void updateMiterLimit(GfxState *state);
+  virtual void updateLineWidth(GfxState *state);
+  virtual void updateStrokeAdjust(GfxState *state);
+  virtual void updateFillColor(GfxState *state);
+  virtual void updateStrokeColor(GfxState *state);
+  virtual void updateBlendMode(GfxState *state);
+  virtual void updateFillOpacity(GfxState *state);
+  virtual void updateStrokeOpacity(GfxState *state);
+  virtual void updateFillOverprint(GfxState *state);
+  virtual void updateStrokeOverprint(GfxState *state);
+  virtual void updateOverprintMode(GfxState *state);
+  virtual void updateTransfer(GfxState *state);
+
+  //----- update text state
+  virtual void updateFont(GfxState *state);
+
+  //----- path painting
+  virtual void stroke(GfxState *state);
+  virtual void fill(GfxState *state);
+  virtual void eoFill(GfxState *state);
+  virtual GBool tilingPatternFill(GfxState *state, Gfx *gfx, Catalog *catalog, Object *str,
+                                 double *pmat, int paintType, int tilingType, Dict *resDict,
+                                 double *mat, double *bbox,
+                                 int x0, int y0, int x1, int y1,
+                                 double xStep, double yStep);
+  virtual GBool axialShadedFill(GfxState *state, GfxAxialShading *shading, double tMin, double tMax);
+  virtual GBool radialShadedFill(GfxState *state, GfxRadialShading *shading, double tMin, double tMax);
+  virtual GBool gouraudTriangleShadedFill(GfxState *state, GfxGouraudTriangleShading *shading);
+
+  //----- path clipping
+  virtual void clip(GfxState *state);
+  virtual void eoClip(GfxState *state);
+  virtual void clipToStrokePath(GfxState *state);
+
+  //----- text drawing
+  virtual void drawChar(GfxState *state, double x, double y,
+                       double dx, double dy,
+                       double originX, double originY,
+                       CharCode code, int nBytes, Unicode *u, int uLen);
+  virtual GBool beginType3Char(GfxState *state, double x, double y,
+                              double dx, double dy,
+                              CharCode code, Unicode *u, int uLen);
+  virtual void endType3Char(GfxState *state);
+  virtual void beginTextObject(GfxState *state);
+  virtual GBool deviceHasTextClip(GfxState *state) { return textClipPath; }
+  virtual void endTextObject(GfxState *state);
+
+  //----- image drawing
+  virtual void drawImageMask(GfxState *state, Object *ref, Stream *str,
+                            int width, int height, GBool invert,
+                            GBool interpolate, GBool inlineImg);
+  virtual void setSoftMaskFromImageMask(GfxState *state,
+                                       Object *ref, Stream *str,
+                                       int width, int height, GBool invert,
+                                       GBool inlineImg, double *baseMatrix);
+  virtual void unsetSoftMaskFromImageMask(GfxState *state, double *baseMatrix);
+  virtual void drawImage(GfxState *state, Object *ref, Stream *str,
+                        int width, int height, GfxImageColorMap *colorMap,
+                        GBool interpolate, int *maskColors, GBool inlineImg);
+  virtual void drawMaskedImage(GfxState *state, Object *ref, Stream *str,
+                              int width, int height,
+                              GfxImageColorMap *colorMap,
+                              GBool interpolate,
+                              Stream *maskStr, int maskWidth, int maskHeight,
+                              GBool maskInvert, GBool maskInterpolate);
+  virtual void drawSoftMaskedImage(GfxState *state, Object *ref, Stream *str,
+                                  int width, int height,
+                                  GfxImageColorMap *colorMap,
+                                  GBool interpolate,
+                                  Stream *maskStr,
+                                  int maskWidth, int maskHeight,
+                                  GfxImageColorMap *maskColorMap,
+                                  GBool maskInterpolate);
+
+  //----- Type 3 font operators
+  virtual void type3D0(GfxState *state, double wx, double wy);
+  virtual void type3D1(GfxState *state, double wx, double wy,
+                      double llx, double lly, double urx, double ury);
+
+  //----- transparency groups and soft masks
+  virtual GBool checkTransparencyGroup(GfxState *state, GBool knockout);
+  virtual void beginTransparencyGroup(GfxState *state, double *bbox,
+                                     GfxColorSpace *blendingColorSpace,
+                                     GBool isolated, GBool knockout,
+                                     GBool forSoftMask);
+  virtual void endTransparencyGroup(GfxState *state);
+  virtual void paintTransparencyGroup(GfxState *state, double *bbox);
+  virtual void setSoftMask(GfxState *state, double *bbox, GBool alpha,
+                          Function *transferFunc, GfxColor *backdropColor);
+  virtual void clearSoftMask(GfxState *state);
+
+  //----- special access
+
+  // Called to indicate that a new PDF document has been loaded.
+  void startDoc(PDFDoc *docA);
+  void setPaperColor(SplashColorPtr paperColorA);
+
+  GBool isReverseVideo() { return reverseVideo; }
+  void setReverseVideo(GBool reverseVideoA) { reverseVideo = reverseVideoA; }
+
+  // Get the bitmap and its size.
+  SplashBitmap *getBitmap() { return bitmap; }
+  int getBitmapWidth();
+  int getBitmapHeight();
+
+  // Returns the last rasterized bitmap, transferring ownership to the
+  // caller.
+  SplashBitmap *takeBitmap();
+
+  // Set this flag to true to generate an upside-down bitmap (useful
+  // for Windows BMP files).
+  void setBitmapUpsideDown(GBool f) { bitmapUpsideDown = f; }
+
+  // Get the Splash object.
+  Splash *getSplash() { return splash; }
+
+  // Get the modified region.
+  void getModRegion(int *xMin, int *yMin, int *xMax, int *yMax);
+
+  // Clear the modified region.
+  void clearModRegion();
+
+  SplashFont *getCurrentFont() { return font; }
+
+  // If <skipTextA> is true, don't draw horizontal text.
+  // If <skipRotatedTextA> is true, don't draw rotated (non-horizontal) text.
+  void setSkipText(GBool skipHorizTextA, GBool skipRotatedTextA)
+    { skipHorizText = skipHorizTextA; skipRotatedText = skipRotatedTextA; }
+
+  int getNestCount() { return nestCount; }
+
+#if 1 //~tmp: turn off anti-aliasing temporarily
+  virtual GBool getVectorAntialias();
+  virtual void setVectorAntialias(GBool vaa);
+#endif
+
+  void setFreeTypeHinting(GBool enable, GBool enableSlightHinting);
+
+protected:
+  void doUpdateFont(GfxState *state);
+
+private:
+  GBool univariateShadedFill(GfxState *state, SplashUnivariatePattern *pattern, double tMin, double tMax);
+
+  void setupScreenParams(double hDPI, double vDPI);
+  SplashPattern *getColor(GfxGray gray);
+  SplashPattern *getColor(GfxRGB *rgb);
+#if SPLASH_CMYK
+  SplashPattern *getColor(GfxCMYK *cmyk);
+#endif
+  void setOverprintMask(GfxColorSpace *colorSpace, GBool overprintFlag,
+                       int overprintMode, GfxColor *singleColor, GBool grayIndexed = gFalse);
+  SplashPath *convertPath(GfxState *state, GfxPath *path,
+                         GBool dropEmptySubpaths);
+  void drawType3Glyph(GfxState *state, T3FontCache *t3Font,
+                     T3FontCacheTag *tag, Guchar *data);
+  static GBool imageMaskSrc(void *data, SplashColorPtr line);
+  static GBool imageSrc(void *data, SplashColorPtr colorLine,
+                       Guchar *alphaLine);
+  static GBool alphaImageSrc(void *data, SplashColorPtr line,
+                            Guchar *alphaLine);
+  static GBool maskedImageSrc(void *data, SplashColorPtr line,
+                             Guchar *alphaLine);
+  static GBool tilingBitmapSrc(void *data, SplashColorPtr line,
+                            Guchar *alphaLine);
+
+  GBool keepAlphaChannel;      // don't fill with paper color, keep alpha channel
+
+  SplashColorMode colorMode;
+  int bitmapRowPad;
+  GBool bitmapTopDown;
+  GBool bitmapUpsideDown;
+  GBool allowAntialias;
+  GBool vectorAntialias;
+  GBool enableFreeTypeHinting;
+  GBool enableSlightHinting;
+  GBool reverseVideo;          // reverse video mode
+  SplashColor paperColor;      // paper color
+  SplashScreenParams screenParams;
+  GBool skipHorizText;
+  GBool skipRotatedText;
+
+  PDFDoc *doc;                 // the current document
+
+  SplashBitmap *bitmap;
+  Splash *splash;
+  SplashFontEngine *fontEngine;
+
+  T3FontCache *                        // Type 3 font cache
+    t3FontCache[splashOutT3FontCacheSize];
+  int nT3Fonts;                        // number of valid entries in t3FontCache
+  T3GlyphStack *t3GlyphStack;  // Type 3 glyph context stack
+  GBool haveT3Dx;              // set after seeing a d0/d1 operator
+
+  SplashFont *font;            // current font
+  GBool needFontUpdate;                // set when the font needs to be updated
+  SplashPath *textClipPath;    // clipping path built with text object
+
+  SplashTransparencyGroup *    // transparency group stack
+    transpGroupStack;
+  SplashBitmap *maskBitmap; // for image masks in pattern colorspace
+  int nestCount;
+};
+
+#endif
diff --git a/poppler/StdinCachedFile.cc b/poppler/StdinCachedFile.cc
new file mode 100644 (file)
index 0000000..db96637
--- /dev/null
@@ -0,0 +1,47 @@
+//========================================================================
+//
+// StdinCachedFile.cc
+//
+// This file is licensed under the GPLv2 or later
+//
+// Copyright 2010 Hib Eris <hib@hiberis.nl>
+// Copyright 2010 Albert Astals Cid <aacid@kde.org>
+// Copyright 2010 Jonathan Liu <net147@gmail.com>
+//
+//========================================================================
+
+#include <config.h>
+
+#include "StdinCachedFile.h"
+
+#ifdef _WIN32
+#include <fcntl.h> // for O_BINARY
+#include <io.h>    // for setmode
+#endif
+#include <stdio.h>
+
+size_t StdinCacheLoader::init(GooString *dummy, CachedFile *cachedFile)
+{
+  size_t read, size = 0;
+  char buf[CachedFileChunkSize];
+
+#ifdef _WIN32
+  setmode(fileno(stdin), O_BINARY);
+#endif
+
+  CachedFileWriter writer = CachedFileWriter (cachedFile, NULL);
+  do {
+    read = fread(buf, 1, CachedFileChunkSize, stdin);
+    (writer.write) (buf, CachedFileChunkSize);
+    size += read;
+  }
+  while (read == CachedFileChunkSize);
+
+  return size;
+}
+
+int StdinCacheLoader::load(const std::vector<ByteRange> &ranges, CachedFileWriter *writer)
+{
+  return 0;
+}
+
diff --git a/poppler/StdinCachedFile.h b/poppler/StdinCachedFile.h
new file mode 100644 (file)
index 0000000..5be6fa8
--- /dev/null
@@ -0,0 +1,27 @@
+//========================================================================
+//
+// StdinCachedFile.h
+//
+// This file is licensed under the GPLv2 or later
+//
+// Copyright 2010 Hib Eris <hib@hiberis.nl>
+// Copyright 2010 Albert Astals Cid <aacid@kde.org>
+//
+//========================================================================
+
+#ifndef STDINCACHELOADER_H
+#define STDINCACHELOADER_H
+
+#include "CachedFile.h"
+
+class StdinCacheLoader : public CachedFileLoader {
+
+public:
+
+  size_t init(GooString *dummy, CachedFile* cachedFile);
+  int load(const std::vector<ByteRange> &ranges, CachedFileWriter *writer);
+
+};
+
+#endif
+
diff --git a/poppler/StdinPDFDocBuilder.cc b/poppler/StdinPDFDocBuilder.cc
new file mode 100644 (file)
index 0000000..571ee46
--- /dev/null
@@ -0,0 +1,43 @@
+//========================================================================
+//
+// StdinPDFDocBuilder.cc
+//
+// This file is licensed under the GPLv2 or later
+//
+// Copyright 2010 Hib Eris <hib@hiberis.nl>
+// Copyright 2010 Albert Astals Cid <aacid@kde.org>
+//
+//========================================================================
+
+#include <config.h>
+
+#include "StdinPDFDocBuilder.h"
+#include "CachedFile.h"
+#include "StdinCachedFile.h"
+
+//------------------------------------------------------------------------
+// StdinPDFDocBuilder
+//------------------------------------------------------------------------
+
+PDFDoc *
+StdinPDFDocBuilder::buildPDFDoc(const GooString &uri, GooString *ownerPassword,
+                                    GooString *userPassword, void *guiDataA)
+{
+  Object obj;
+
+  obj.initNull();
+  CachedFile *cachedFile = new CachedFile(new StdinCacheLoader(), NULL);
+  return new PDFDoc(new CachedFileStream(cachedFile, 0, gFalse,
+                                         cachedFile->getLength(), &obj),
+                    ownerPassword, userPassword);
+}
+
+GBool StdinPDFDocBuilder::supports(const GooString &uri)
+{
+  if (uri.cmpN("fd://0", 6) == 0) {
+    return gTrue;
+  } else {
+    return gFalse;
+  }
+}
+
diff --git a/poppler/StdinPDFDocBuilder.h b/poppler/StdinPDFDocBuilder.h
new file mode 100644 (file)
index 0000000..e9b2f47
--- /dev/null
@@ -0,0 +1,33 @@
+//========================================================================
+//
+// StdinPDFDocBuilder.h
+//
+// This file is licensed under the GPLv2 or later
+//
+// Copyright 2010 Hib Eris <hib@hiberis.nl>
+// Copyright 2010 Albert Astals Cid <aacid@kde.org>
+//
+//========================================================================
+
+#ifndef STDINPDFDOCBUILDER_H
+#define STDINPDFDOCBUILDER_H
+
+#include "PDFDocBuilder.h"
+
+//------------------------------------------------------------------------
+// StdinPDFDocBuilder
+//
+// The StdinPDFDocBuilder implements a PDFDocBuilder that read from stdin.
+//------------------------------------------------------------------------
+
+class StdinPDFDocBuilder : public PDFDocBuilder {
+
+public:
+
+  PDFDoc *buildPDFDoc(const GooString &uri, GooString *ownerPassword = NULL,
+    GooString *userPassword = NULL, void *guiDataA = NULL);
+  GBool supports(const GooString &uri);
+
+};
+
+#endif /* STDINPDFDOCBUILDER_H */
diff --git a/poppler/Stream-CCITT.h b/poppler/Stream-CCITT.h
new file mode 100644 (file)
index 0000000..7207729
--- /dev/null
@@ -0,0 +1,478 @@
+//========================================================================
+//
+// Stream-CCITT.h
+//
+// Tables for CCITT Fax decoding.
+//
+// Copyright 1996-2003 Glyph & Cog, LLC
+//
+//========================================================================
+
+//========================================================================
+//
+// Modified under the Poppler project - http://poppler.freedesktop.org
+//
+// All changes made under the Poppler project to this file are licensed
+// under GPL version 2 or later
+//
+// Copyright (C) 2008 Albert Astals Cid <aacid@kde.org>
+//
+// To see a description of the changes please see the Changelog file that
+// came with your tarball or type make ChangeLog if you are building from git
+//
+//========================================================================
+
+#ifndef STREAM_CCITT_H
+#define STREAM_CCITT_H
+
+struct CCITTCode {
+  short bits;
+  short n;
+};
+
+#define ccittEOL -2
+
+//------------------------------------------------------------------------
+// 2D codes
+//------------------------------------------------------------------------
+
+#define twoDimPass   0
+#define twoDimHoriz  1
+#define twoDimVert0  2
+#define twoDimVertR1 3
+#define twoDimVertL1 4
+#define twoDimVertR2 5
+#define twoDimVertL2 6
+#define twoDimVertR3 7
+#define twoDimVertL3 8
+
+// 1-7 bit codes
+static const CCITTCode twoDimTab1[128] = {
+  {-1, -1}, {-1, -1},                  // 000000x
+  {7, twoDimVertL3},                   // 0000010
+  {7, twoDimVertR3},                   // 0000011
+  {6, twoDimVertL2}, {6, twoDimVertL2},        // 000010x
+  {6, twoDimVertR2}, {6, twoDimVertR2},        // 000011x
+  {4, twoDimPass}, {4, twoDimPass},     // 0001xxx
+    {4, twoDimPass}, {4, twoDimPass},
+    {4, twoDimPass}, {4, twoDimPass},
+    {4, twoDimPass}, {4, twoDimPass},
+  {3, twoDimHoriz}, {3, twoDimHoriz},  // 001xxxx
+    {3, twoDimHoriz}, {3, twoDimHoriz},
+    {3, twoDimHoriz}, {3, twoDimHoriz},
+    {3, twoDimHoriz}, {3, twoDimHoriz},
+    {3, twoDimHoriz}, {3, twoDimHoriz},
+    {3, twoDimHoriz}, {3, twoDimHoriz},
+    {3, twoDimHoriz}, {3, twoDimHoriz},
+    {3, twoDimHoriz}, {3, twoDimHoriz},
+  {3, twoDimVertL1}, {3, twoDimVertL1},        // 010xxxx
+    {3, twoDimVertL1}, {3, twoDimVertL1},
+    {3, twoDimVertL1}, {3, twoDimVertL1},
+    {3, twoDimVertL1}, {3, twoDimVertL1},
+    {3, twoDimVertL1}, {3, twoDimVertL1},
+    {3, twoDimVertL1}, {3, twoDimVertL1},
+    {3, twoDimVertL1}, {3, twoDimVertL1},
+    {3, twoDimVertL1}, {3, twoDimVertL1},
+  {3, twoDimVertR1}, {3, twoDimVertR1},        // 011xxxx
+    {3, twoDimVertR1}, {3, twoDimVertR1},
+    {3, twoDimVertR1}, {3, twoDimVertR1},
+    {3, twoDimVertR1}, {3, twoDimVertR1},
+    {3, twoDimVertR1}, {3, twoDimVertR1},
+    {3, twoDimVertR1}, {3, twoDimVertR1},
+    {3, twoDimVertR1}, {3, twoDimVertR1},
+    {3, twoDimVertR1}, {3, twoDimVertR1},
+  {1, twoDimVert0}, {1, twoDimVert0},  // 1xxxxxx
+    {1, twoDimVert0}, {1, twoDimVert0},
+    {1, twoDimVert0}, {1, twoDimVert0},
+    {1, twoDimVert0}, {1, twoDimVert0},
+    {1, twoDimVert0}, {1, twoDimVert0},
+    {1, twoDimVert0}, {1, twoDimVert0},
+    {1, twoDimVert0}, {1, twoDimVert0},
+    {1, twoDimVert0}, {1, twoDimVert0},
+    {1, twoDimVert0}, {1, twoDimVert0},
+    {1, twoDimVert0}, {1, twoDimVert0},
+    {1, twoDimVert0}, {1, twoDimVert0},
+    {1, twoDimVert0}, {1, twoDimVert0},
+    {1, twoDimVert0}, {1, twoDimVert0},
+    {1, twoDimVert0}, {1, twoDimVert0},
+    {1, twoDimVert0}, {1, twoDimVert0},
+    {1, twoDimVert0}, {1, twoDimVert0},
+    {1, twoDimVert0}, {1, twoDimVert0},
+    {1, twoDimVert0}, {1, twoDimVert0},
+    {1, twoDimVert0}, {1, twoDimVert0},
+    {1, twoDimVert0}, {1, twoDimVert0},
+    {1, twoDimVert0}, {1, twoDimVert0},
+    {1, twoDimVert0}, {1, twoDimVert0},
+    {1, twoDimVert0}, {1, twoDimVert0},
+    {1, twoDimVert0}, {1, twoDimVert0},
+    {1, twoDimVert0}, {1, twoDimVert0},
+    {1, twoDimVert0}, {1, twoDimVert0},
+    {1, twoDimVert0}, {1, twoDimVert0},
+    {1, twoDimVert0}, {1, twoDimVert0},
+    {1, twoDimVert0}, {1, twoDimVert0},
+    {1, twoDimVert0}, {1, twoDimVert0},
+    {1, twoDimVert0}, {1, twoDimVert0},
+    {1, twoDimVert0}, {1, twoDimVert0}
+};
+
+//------------------------------------------------------------------------
+// white run lengths
+//------------------------------------------------------------------------
+
+// 11-12 bit codes (upper 7 bits are 0)
+static const CCITTCode whiteTab1[32] = {
+  {-1, -1},                                    // 00000
+  {12, ccittEOL},                              // 00001
+  {-1, -1}, {-1, -1},                          // 0001x
+  {-1, -1}, {-1, -1}, {-1, -1}, {-1, -1},      // 001xx
+  {-1, -1}, {-1, -1}, {-1, -1}, {-1, -1},      // 010xx
+  {-1, -1}, {-1, -1}, {-1, -1}, {-1, -1},      // 011xx
+  {11, 1792}, {11, 1792},                      // 1000x
+  {12, 1984},                                  // 10010
+  {12, 2048},                                  // 10011
+  {12, 2112},                                  // 10100
+  {12, 2176},                                  // 10101
+  {12, 2240},                                  // 10110
+  {12, 2304},                                  // 10111
+  {11, 1856}, {11, 1856},                      // 1100x
+  {11, 1920}, {11, 1920},                      // 1101x
+  {12, 2368},                                  // 11100
+  {12, 2432},                                  // 11101
+  {12, 2496},                                  // 11110
+  {12, 2560}                                   // 11111
+};
+
+// 1-9 bit codes
+static const CCITTCode whiteTab2[512] = {
+  {-1, -1}, {-1, -1}, {-1, -1}, {-1, -1},      // 0000000xx
+  {8, 29}, {8, 29},                            // 00000010x
+  {8, 30}, {8, 30},                            // 00000011x
+  {8, 45}, {8, 45},                            // 00000100x
+  {8, 46}, {8, 46},                            // 00000101x
+  {7, 22}, {7, 22}, {7, 22}, {7, 22},          // 0000011xx
+  {7, 23}, {7, 23}, {7, 23}, {7, 23},          // 0000100xx
+  {8, 47}, {8, 47},                            // 00001010x
+  {8, 48}, {8, 48},                            // 00001011x
+  {6, 13}, {6, 13}, {6, 13}, {6, 13},          // 000011xxx
+    {6, 13}, {6, 13}, {6, 13}, {6, 13},
+  {7, 20}, {7, 20}, {7, 20}, {7, 20},          // 0001000xx
+  {8, 33}, {8, 33},                            // 00010010x
+  {8, 34}, {8, 34},                            // 00010011x
+  {8, 35}, {8, 35},                            // 00010100x
+  {8, 36}, {8, 36},                            // 00010101x
+  {8, 37}, {8, 37},                            // 00010110x
+  {8, 38}, {8, 38},                            // 00010111x
+  {7, 19}, {7, 19}, {7, 19}, {7, 19},          // 0001100xx
+  {8, 31}, {8, 31},                            // 00011010x
+  {8, 32}, {8, 32},                            // 00011011x
+  {6, 1}, {6, 1}, {6, 1}, {6, 1},              // 000111xxx
+    {6, 1}, {6, 1}, {6, 1}, {6, 1},
+  {6, 12}, {6, 12}, {6, 12}, {6, 12},          // 001000xxx
+    {6, 12}, {6, 12}, {6, 12}, {6, 12},
+  {8, 53}, {8, 53},                            // 00100100x
+  {8, 54}, {8, 54},                            // 00100101x
+  {7, 26}, {7, 26}, {7, 26}, {7, 26},          // 0010011xx
+  {8, 39}, {8, 39},                            // 00101000x
+  {8, 40}, {8, 40},                            // 00101001x
+  {8, 41}, {8, 41},                            // 00101010x
+  {8, 42}, {8, 42},                            // 00101011x
+  {8, 43}, {8, 43},                            // 00101100x
+  {8, 44}, {8, 44},                            // 00101101x
+  {7, 21}, {7, 21}, {7, 21}, {7, 21},          // 0010111xx
+  {7, 28}, {7, 28}, {7, 28}, {7, 28},          // 0011000xx
+  {8, 61}, {8, 61},                            // 00110010x
+  {8, 62}, {8, 62},                            // 00110011x
+  {8, 63}, {8, 63},                            // 00110100x
+  {8, 0}, {8, 0},                              // 00110101x
+  {8, 320}, {8, 320},                          // 00110110x
+  {8, 384}, {8, 384},                          // 00110111x
+  {5, 10}, {5, 10}, {5, 10}, {5, 10},          // 00111xxxx
+    {5, 10}, {5, 10}, {5, 10}, {5, 10},
+    {5, 10}, {5, 10}, {5, 10}, {5, 10},
+    {5, 10}, {5, 10}, {5, 10}, {5, 10},
+  {5, 11}, {5, 11}, {5, 11}, {5, 11},          // 01000xxxx
+    {5, 11}, {5, 11}, {5, 11}, {5, 11},
+    {5, 11}, {5, 11}, {5, 11}, {5, 11},
+    {5, 11}, {5, 11}, {5, 11}, {5, 11},
+  {7, 27}, {7, 27}, {7, 27}, {7, 27},          // 0100100xx
+  {8, 59}, {8, 59},                            // 01001010x
+  {8, 60}, {8, 60},                            // 01001011x
+  {9, 1472},                                   // 010011000
+  {9, 1536},                                   // 010011001
+  {9, 1600},                                   // 010011010
+  {9, 1728},                                   // 010011011
+  {7, 18}, {7, 18}, {7, 18}, {7, 18},          // 0100111xx
+  {7, 24}, {7, 24}, {7, 24}, {7, 24},          // 0101000xx
+  {8, 49}, {8, 49},                            // 01010010x
+  {8, 50}, {8, 50},                            // 01010011x
+  {8, 51}, {8, 51},                            // 01010100x
+  {8, 52}, {8, 52},                            // 01010101x
+  {7, 25}, {7, 25}, {7, 25}, {7, 25},          // 0101011xx
+  {8, 55}, {8, 55},                            // 01011000x
+  {8, 56}, {8, 56},                            // 01011001x
+  {8, 57}, {8, 57},                            // 01011010x
+  {8, 58}, {8, 58},                            // 01011011x
+  {6, 192}, {6, 192}, {6, 192}, {6, 192},      // 010111xxx
+    {6, 192}, {6, 192}, {6, 192}, {6, 192},
+  {6, 1664}, {6, 1664}, {6, 1664}, {6, 1664},  // 011000xxx
+    {6, 1664}, {6, 1664}, {6, 1664}, {6, 1664},
+  {8, 448}, {8, 448},                          // 01100100x
+  {8, 512}, {8, 512},                          // 01100101x
+  {9, 704},                                    // 011001100
+  {9, 768},                                    // 011001101
+  {8, 640}, {8, 640},                          // 01100111x
+  {8, 576}, {8, 576},                          // 01101000x
+  {9, 832},                                    // 011010010
+  {9, 896},                                    // 011010011
+  {9, 960},                                    // 011010100
+  {9, 1024},                                   // 011010101
+  {9, 1088},                                   // 011010110
+  {9, 1152},                                   // 011010111
+  {9, 1216},                                   // 011011000
+  {9, 1280},                                   // 011011001
+  {9, 1344},                                   // 011011010
+  {9, 1408},                                   // 011011011
+  {7, 256}, {7, 256}, {7, 256}, {7, 256},      // 0110111xx
+  {4, 2}, {4, 2}, {4, 2}, {4, 2},              // 0111xxxxx
+    {4, 2}, {4, 2}, {4, 2}, {4, 2},
+    {4, 2}, {4, 2}, {4, 2}, {4, 2},
+    {4, 2}, {4, 2}, {4, 2}, {4, 2},
+    {4, 2}, {4, 2}, {4, 2}, {4, 2},
+    {4, 2}, {4, 2}, {4, 2}, {4, 2},
+    {4, 2}, {4, 2}, {4, 2}, {4, 2},
+    {4, 2}, {4, 2}, {4, 2}, {4, 2},
+  {4, 3}, {4, 3}, {4, 3}, {4, 3},              // 1000xxxxx
+    {4, 3}, {4, 3}, {4, 3}, {4, 3},
+    {4, 3}, {4, 3}, {4, 3}, {4, 3},
+    {4, 3}, {4, 3}, {4, 3}, {4, 3},
+    {4, 3}, {4, 3}, {4, 3}, {4, 3},
+    {4, 3}, {4, 3}, {4, 3}, {4, 3},
+    {4, 3}, {4, 3}, {4, 3}, {4, 3},
+    {4, 3}, {4, 3}, {4, 3}, {4, 3},
+  {5, 128}, {5, 128}, {5, 128}, {5, 128},      // 10010xxxx
+    {5, 128}, {5, 128}, {5, 128}, {5, 128},
+    {5, 128}, {5, 128}, {5, 128}, {5, 128},
+    {5, 128}, {5, 128}, {5, 128}, {5, 128},
+  {5, 8}, {5, 8}, {5, 8}, {5, 8},              // 10011xxxx
+    {5, 8}, {5, 8}, {5, 8}, {5, 8},
+    {5, 8}, {5, 8}, {5, 8}, {5, 8},
+    {5, 8}, {5, 8}, {5, 8}, {5, 8},
+  {5, 9}, {5, 9}, {5, 9}, {5, 9},              // 10100xxxx
+    {5, 9}, {5, 9}, {5, 9}, {5, 9},
+    {5, 9}, {5, 9}, {5, 9}, {5, 9},
+    {5, 9}, {5, 9}, {5, 9}, {5, 9},
+  {6, 16}, {6, 16}, {6, 16}, {6, 16},          // 101010xxx
+    {6, 16}, {6, 16}, {6, 16}, {6, 16},
+  {6, 17}, {6, 17}, {6, 17}, {6, 17},          // 101011xxx
+    {6, 17}, {6, 17}, {6, 17}, {6, 17},
+  {4, 4}, {4, 4}, {4, 4}, {4, 4},              // 1011xxxxx
+    {4, 4}, {4, 4}, {4, 4}, {4, 4},
+    {4, 4}, {4, 4}, {4, 4}, {4, 4},
+    {4, 4}, {4, 4}, {4, 4}, {4, 4},
+    {4, 4}, {4, 4}, {4, 4}, {4, 4},
+    {4, 4}, {4, 4}, {4, 4}, {4, 4},
+    {4, 4}, {4, 4}, {4, 4}, {4, 4},
+    {4, 4}, {4, 4}, {4, 4}, {4, 4},
+  {4, 5}, {4, 5}, {4, 5}, {4, 5},              // 1100xxxxx
+    {4, 5}, {4, 5}, {4, 5}, {4, 5},
+    {4, 5}, {4, 5}, {4, 5}, {4, 5},
+    {4, 5}, {4, 5}, {4, 5}, {4, 5},
+    {4, 5}, {4, 5}, {4, 5}, {4, 5},
+    {4, 5}, {4, 5}, {4, 5}, {4, 5},
+    {4, 5}, {4, 5}, {4, 5}, {4, 5},
+    {4, 5}, {4, 5}, {4, 5}, {4, 5},
+  {6, 14}, {6, 14}, {6, 14}, {6, 14},          // 110100xxx
+    {6, 14}, {6, 14}, {6, 14}, {6, 14},
+  {6, 15}, {6, 15}, {6, 15}, {6, 15},          // 110101xxx
+    {6, 15}, {6, 15}, {6, 15}, {6, 15},
+  {5, 64}, {5, 64}, {5, 64}, {5, 64},          // 11011xxxx
+    {5, 64}, {5, 64}, {5, 64}, {5, 64},
+    {5, 64}, {5, 64}, {5, 64}, {5, 64},
+    {5, 64}, {5, 64}, {5, 64}, {5, 64},
+  {4, 6}, {4, 6}, {4, 6}, {4, 6},              // 1110xxxxx
+    {4, 6}, {4, 6}, {4, 6}, {4, 6},
+    {4, 6}, {4, 6}, {4, 6}, {4, 6},
+    {4, 6}, {4, 6}, {4, 6}, {4, 6},
+    {4, 6}, {4, 6}, {4, 6}, {4, 6},
+    {4, 6}, {4, 6}, {4, 6}, {4, 6},
+    {4, 6}, {4, 6}, {4, 6}, {4, 6},
+    {4, 6}, {4, 6}, {4, 6}, {4, 6},
+  {4, 7}, {4, 7}, {4, 7}, {4, 7},              // 1111xxxxx
+    {4, 7}, {4, 7}, {4, 7}, {4, 7},
+    {4, 7}, {4, 7}, {4, 7}, {4, 7},
+    {4, 7}, {4, 7}, {4, 7}, {4, 7},
+    {4, 7}, {4, 7}, {4, 7}, {4, 7},
+    {4, 7}, {4, 7}, {4, 7}, {4, 7},
+    {4, 7}, {4, 7}, {4, 7}, {4, 7},
+    {4, 7}, {4, 7}, {4, 7}, {4, 7}
+};
+
+//------------------------------------------------------------------------
+// black run lengths
+//------------------------------------------------------------------------
+
+// 10-13 bit codes (upper 6 bits are 0)
+static const CCITTCode blackTab1[128] = {
+  {-1, -1}, {-1, -1},                                  // 000000000000x
+  {12, ccittEOL}, {12, ccittEOL},                      // 000000000001x
+  {-1, -1}, {-1, -1}, {-1, -1}, {-1, -1},              // 00000000001xx
+  {-1, -1}, {-1, -1}, {-1, -1}, {-1, -1},              // 00000000010xx
+  {-1, -1}, {-1, -1}, {-1, -1}, {-1, -1},              // 00000000011xx
+  {-1, -1}, {-1, -1}, {-1, -1}, {-1, -1},              // 00000000100xx
+  {-1, -1}, {-1, -1}, {-1, -1}, {-1, -1},              // 00000000101xx
+  {-1, -1}, {-1, -1}, {-1, -1}, {-1, -1},              // 00000000110xx
+  {-1, -1}, {-1, -1}, {-1, -1}, {-1, -1},              // 00000000111xx
+  {11, 1792}, {11, 1792}, {11, 1792}, {11, 1792},      // 00000001000xx
+  {12, 1984}, {12, 1984},                              // 000000010010x
+  {12, 2048}, {12, 2048},                              // 000000010011x
+  {12, 2112}, {12, 2112},                              // 000000010100x
+  {12, 2176}, {12, 2176},                              // 000000010101x
+  {12, 2240}, {12, 2240},                              // 000000010110x
+  {12, 2304}, {12, 2304},                              // 000000010111x
+  {11, 1856}, {11, 1856}, {11, 1856}, {11, 1856},      // 00000001100xx
+  {11, 1920}, {11, 1920}, {11, 1920}, {11, 1920},      // 00000001101xx
+  {12, 2368}, {12, 2368},                              // 000000011100x
+  {12, 2432}, {12, 2432},                              // 000000011101x
+  {12, 2496}, {12, 2496},                              // 000000011110x
+  {12, 2560}, {12, 2560},                              // 000000011111x
+  {10, 18}, {10, 18}, {10, 18}, {10, 18},              // 0000001000xxx
+    {10, 18}, {10, 18}, {10, 18}, {10, 18},
+  {12, 52}, {12, 52},                                  // 000000100100x
+  {13, 640},                                           // 0000001001010
+  {13, 704},                                           // 0000001001011
+  {13, 768},                                           // 0000001001100
+  {13, 832},                                           // 0000001001101
+  {12, 55}, {12, 55},                                  // 000000100111x
+  {12, 56}, {12, 56},                                  // 000000101000x
+  {13, 1280},                                          // 0000001010010
+  {13, 1344},                                          // 0000001010011
+  {13, 1408},                                          // 0000001010100
+  {13, 1472},                                          // 0000001010101
+  {12, 59}, {12, 59},                                  // 000000101011x
+  {12, 60}, {12, 60},                                  // 000000101100x
+  {13, 1536},                                          // 0000001011010
+  {13, 1600},                                          // 0000001011011
+  {11, 24}, {11, 24}, {11, 24}, {11, 24},              // 00000010111xx
+  {11, 25}, {11, 25}, {11, 25}, {11, 25},              // 00000011000xx
+  {13, 1664},                                          // 0000001100100
+  {13, 1728},                                          // 0000001100101
+  {12, 320}, {12, 320},                                        // 000000110011x
+  {12, 384}, {12, 384},                                        // 000000110100x
+  {12, 448}, {12, 448},                                        // 000000110101x
+  {13, 512},                                           // 0000001101100
+  {13, 576},                                           // 0000001101101
+  {12, 53}, {12, 53},                                  // 000000110111x
+  {12, 54}, {12, 54},                                  // 000000111000x
+  {13, 896},                                           // 0000001110010
+  {13, 960},                                           // 0000001110011
+  {13, 1024},                                          // 0000001110100
+  {13, 1088},                                          // 0000001110101
+  {13, 1152},                                          // 0000001110110
+  {13, 1216},                                          // 0000001110111
+  {10, 64}, {10, 64}, {10, 64}, {10, 64},              // 0000001111xxx
+    {10, 64}, {10, 64}, {10, 64}, {10, 64}
+};
+
+// 7-12 bit codes (upper 4 bits are 0)
+static const CCITTCode blackTab2[192] = {
+  {8, 13}, {8, 13}, {8, 13}, {8, 13},                  // 00000100xxxx
+    {8, 13}, {8, 13}, {8, 13}, {8, 13},
+    {8, 13}, {8, 13}, {8, 13}, {8, 13},
+    {8, 13}, {8, 13}, {8, 13}, {8, 13},
+  {11, 23}, {11, 23},                                  // 00000101000x
+  {12, 50},                                            // 000001010010
+  {12, 51},                                            // 000001010011
+  {12, 44},                                            // 000001010100
+  {12, 45},                                            // 000001010101
+  {12, 46},                                            // 000001010110
+  {12, 47},                                            // 000001010111
+  {12, 57},                                            // 000001011000
+  {12, 58},                                            // 000001011001
+  {12, 61},                                            // 000001011010
+  {12, 256},                                           // 000001011011
+  {10, 16}, {10, 16}, {10, 16}, {10, 16},              // 0000010111xx
+  {10, 17}, {10, 17}, {10, 17}, {10, 17},              // 0000011000xx
+  {12, 48},                                            // 000001100100
+  {12, 49},                                            // 000001100101
+  {12, 62},                                            // 000001100110
+  {12, 63},                                            // 000001100111
+  {12, 30},                                            // 000001101000
+  {12, 31},                                            // 000001101001
+  {12, 32},                                            // 000001101010
+  {12, 33},                                            // 000001101011
+  {12, 40},                                            // 000001101100
+  {12, 41},                                            // 000001101101
+  {11, 22}, {11, 22},                                  // 00000110111x
+  {8, 14}, {8, 14}, {8, 14}, {8, 14},                  // 00000111xxxx
+    {8, 14}, {8, 14}, {8, 14}, {8, 14},
+    {8, 14}, {8, 14}, {8, 14}, {8, 14},
+    {8, 14}, {8, 14}, {8, 14}, {8, 14},
+  {7, 10}, {7, 10}, {7, 10}, {7, 10},                  // 0000100xxxxx
+    {7, 10}, {7, 10}, {7, 10}, {7, 10},
+    {7, 10}, {7, 10}, {7, 10}, {7, 10},
+    {7, 10}, {7, 10}, {7, 10}, {7, 10},
+    {7, 10}, {7, 10}, {7, 10}, {7, 10},
+    {7, 10}, {7, 10}, {7, 10}, {7, 10},
+    {7, 10}, {7, 10}, {7, 10}, {7, 10},
+    {7, 10}, {7, 10}, {7, 10}, {7, 10},
+  {7, 11}, {7, 11}, {7, 11}, {7, 11},                  // 0000101xxxxx
+    {7, 11}, {7, 11}, {7, 11}, {7, 11},
+    {7, 11}, {7, 11}, {7, 11}, {7, 11},
+    {7, 11}, {7, 11}, {7, 11}, {7, 11},
+    {7, 11}, {7, 11}, {7, 11}, {7, 11},
+    {7, 11}, {7, 11}, {7, 11}, {7, 11},
+    {7, 11}, {7, 11}, {7, 11}, {7, 11},
+    {7, 11}, {7, 11}, {7, 11}, {7, 11},
+  {9, 15}, {9, 15}, {9, 15}, {9, 15},                  // 000011000xxx
+    {9, 15}, {9, 15}, {9, 15}, {9, 15},
+  {12, 128},                                           // 000011001000
+  {12, 192},                                           // 000011001001
+  {12, 26},                                            // 000011001010
+  {12, 27},                                            // 000011001011
+  {12, 28},                                            // 000011001100
+  {12, 29},                                            // 000011001101
+  {11, 19}, {11, 19},                                  // 00001100111x
+  {11, 20}, {11, 20},                                  // 00001101000x
+  {12, 34},                                            // 000011010010
+  {12, 35},                                            // 000011010011
+  {12, 36},                                            // 000011010100
+  {12, 37},                                            // 000011010101
+  {12, 38},                                            // 000011010110
+  {12, 39},                                            // 000011010111
+  {11, 21}, {11, 21},                                  // 00001101100x
+  {12, 42},                                            // 000011011010
+  {12, 43},                                            // 000011011011
+  {10, 0}, {10, 0}, {10, 0}, {10, 0},                  // 0000110111xx
+  {7, 12}, {7, 12}, {7, 12}, {7, 12},                  // 0000111xxxxx
+    {7, 12}, {7, 12}, {7, 12}, {7, 12},
+    {7, 12}, {7, 12}, {7, 12}, {7, 12},
+    {7, 12}, {7, 12}, {7, 12}, {7, 12},
+    {7, 12}, {7, 12}, {7, 12}, {7, 12},
+    {7, 12}, {7, 12}, {7, 12}, {7, 12},
+    {7, 12}, {7, 12}, {7, 12}, {7, 12},
+    {7, 12}, {7, 12}, {7, 12}, {7, 12}
+};
+
+// 2-6 bit codes
+static const CCITTCode blackTab3[64] = {
+  {-1, -1}, {-1, -1}, {-1, -1}, {-1, -1},              // 0000xx
+  {6, 9},                                              // 000100
+  {6, 8},                                              // 000101
+  {5, 7}, {5, 7},                                      // 00011x
+  {4, 6}, {4, 6}, {4, 6}, {4, 6},                      // 0010xx
+  {4, 5}, {4, 5}, {4, 5}, {4, 5},                      // 0011xx
+  {3, 1}, {3, 1}, {3, 1}, {3, 1},                      // 010xxx
+    {3, 1}, {3, 1}, {3, 1}, {3, 1},
+  {3, 4}, {3, 4}, {3, 4}, {3, 4},                      // 011xxx
+    {3, 4}, {3, 4}, {3, 4}, {3, 4},
+  {2, 3}, {2, 3}, {2, 3}, {2, 3},                      // 10xxxx
+    {2, 3}, {2, 3}, {2, 3}, {2, 3},
+    {2, 3}, {2, 3}, {2, 3}, {2, 3},
+    {2, 3}, {2, 3}, {2, 3}, {2, 3},
+  {2, 2}, {2, 2}, {2, 2}, {2, 2},                      // 11xxxx
+    {2, 2}, {2, 2}, {2, 2}, {2, 2},
+    {2, 2}, {2, 2}, {2, 2}, {2, 2},
+    {2, 2}, {2, 2}, {2, 2}, {2, 2}
+};
+
+#endif
diff --git a/poppler/Stream.cc b/poppler/Stream.cc
new file mode 100644 (file)
index 0000000..4ce6c00
--- /dev/null
@@ -0,0 +1,5251 @@
+//========================================================================
+//
+// Stream.cc
+//
+// Copyright 1996-2003 Glyph & Cog, LLC
+//
+//========================================================================
+
+//========================================================================
+//
+// Modified under the Poppler project - http://poppler.freedesktop.org
+//
+// All changes made under the Poppler project to this file are licensed
+// under GPL version 2 or later
+//
+// Copyright (C) 2005 Jeff Muizelaar <jeff@infidigm.net>
+// Copyright (C) 2006-2010, 2012 Albert Astals Cid <aacid@kde.org>
+// Copyright (C) 2007 Krzysztof Kowalczyk <kkowalczyk@gmail.com>
+// Copyright (C) 2008 Julien Rebetez <julien@fhtagn.net>
+// Copyright (C) 2009 Carlos Garcia Campos <carlosgc@gnome.org>
+// Copyright (C) 2009 Glenn Ganz <glenn.ganz@uptime.ch>
+// Copyright (C) 2009 Stefan Thomas <thomas@eload24.com>
+// Copyright (C) 2010 Hib Eris <hib@hiberis.nl>
+// Copyright (C) 2010 Tomas Hoger <thoger@redhat.com>
+// Copyright (C) 2011, 2012 William Bader <williambader@hotmail.com>
+// Copyright (C) 2012 Thomas Freitag <Thomas.Freitag@alfa.de>
+// Copyright (C) 2012 Oliver Sander <sander@mi.fu-berlin.de>
+//
+// To see a description of the changes please see the Changelog file that
+// came with your tarball or type make ChangeLog if you are building from git
+//
+//========================================================================
+
+#include <config.h>
+
+#ifdef USE_GCC_PRAGMAS
+#pragma implementation
+#endif
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <stddef.h>
+#include <limits.h>
+#ifdef HAVE_UNISTD_H
+#include <unistd.h>
+#endif
+#include <string.h>
+#include <ctype.h>
+#include "goo/gmem.h"
+#include "goo/gfile.h"
+#include "poppler-config.h"
+#include "Error.h"
+#include "Object.h"
+#include "Lexer.h"
+#include "GfxState.h"
+#include "Stream.h"
+#include "JBIG2Stream.h"
+#include "Stream-CCITT.h"
+#include "CachedFile.h"
+
+#ifdef ENABLE_LIBJPEG
+#include "DCTStream.h"
+#endif
+
+#ifdef ENABLE_ZLIB
+#include "FlateStream.h"
+#endif
+
+#ifdef ENABLE_LIBOPENJPEG
+#include "JPEG2000Stream.h"
+#else
+#include "JPXStream.h"
+#endif
+
+#ifdef __DJGPP__
+static GBool setDJSYSFLAGS = gFalse;
+#endif
+
+#ifdef VMS
+#ifdef __GNUC__
+#define SEEK_SET 0
+#define SEEK_CUR 1
+#define SEEK_END 2
+#endif
+#endif
+
+//------------------------------------------------------------------------
+// Stream (base class)
+//------------------------------------------------------------------------
+
+Stream::Stream() {
+  ref = 1;
+}
+
+Stream::~Stream() {
+}
+
+void Stream::close() {
+}
+
+int Stream::getRawChar() {
+  error(errInternal, -1, "Internal: called getRawChar() on non-predictor stream");
+  return EOF;
+}
+
+int Stream::getChars(int nChars, Guchar *buffer) {
+  error(errInternal, -1, "Internal: called getChars() on non-predictor stream");
+  return 0;
+}
+
+void Stream::getRawChars(int nChars, int *buffer) {
+  error(errInternal, -1, "Internal: called getRawChars() on non-predictor stream");
+}
+
+char *Stream::getLine(char *buf, int size) {
+  int i;
+  int c;
+
+  if (lookChar() == EOF || size < 0)
+    return NULL;
+  for (i = 0; i < size - 1; ++i) {
+    c = getChar();
+    if (c == EOF || c == '\n')
+      break;
+    if (c == '\r') {
+      if ((c = lookChar()) == '\n')
+       getChar();
+      break;
+    }
+    buf[i] = c;
+  }
+  buf[i] = '\0';
+  return buf;
+}
+
+GooString *Stream::getPSFilter(int psLevel, const char *indent) {
+  return new GooString();
+}
+
+Stream *Stream::addFilters(Object *dict) {
+  Object obj, obj2;
+  Object params, params2;
+  Stream *str;
+  int i;
+
+  str = this;
+  dict->dictLookup("Filter", &obj);
+  if (obj.isNull()) {
+    obj.free();
+    dict->dictLookup("F", &obj);
+  }
+  dict->dictLookup("DecodeParms", &params);
+  if (params.isNull()) {
+    params.free();
+    dict->dictLookup("DP", &params);
+  }
+  if (obj.isName()) {
+    str = makeFilter(obj.getName(), str, &params);
+  } else if (obj.isArray()) {
+    for (i = 0; i < obj.arrayGetLength(); ++i) {
+      obj.arrayGet(i, &obj2);
+      if (params.isArray())
+       params.arrayGet(i, &params2);
+      else
+       params2.initNull();
+      if (obj2.isName()) {
+       str = makeFilter(obj2.getName(), str, &params2);
+      } else {
+       error(errSyntaxError, getPos(), "Bad filter name");
+       str = new EOFStream(str);
+      }
+      obj2.free();
+      params2.free();
+    }
+  } else if (!obj.isNull()) {
+    error(errSyntaxError, getPos(), "Bad 'Filter' attribute in stream");
+  }
+  obj.free();
+  params.free();
+
+  return str;
+}
+
+Stream *Stream::makeFilter(char *name, Stream *str, Object *params) {
+  int pred;                    // parameters
+  int colors;
+  int bits;
+  int early;
+  int encoding;
+  GBool endOfLine, byteAlign, endOfBlock, black;
+  int columns, rows;
+  int colorXform;
+  Object globals, obj;
+
+  if (!strcmp(name, "ASCIIHexDecode") || !strcmp(name, "AHx")) {
+    str = new ASCIIHexStream(str);
+  } else if (!strcmp(name, "ASCII85Decode") || !strcmp(name, "A85")) {
+    str = new ASCII85Stream(str);
+  } else if (!strcmp(name, "LZWDecode") || !strcmp(name, "LZW")) {
+    pred = 1;
+    columns = 1;
+    colors = 1;
+    bits = 8;
+    early = 1;
+    if (params->isDict()) {
+      params->dictLookup("Predictor", &obj);
+      if (obj.isInt())
+       pred = obj.getInt();
+      obj.free();
+      params->dictLookup("Columns", &obj);
+      if (obj.isInt())
+       columns = obj.getInt();
+      obj.free();
+      params->dictLookup("Colors", &obj);
+      if (obj.isInt())
+       colors = obj.getInt();
+      obj.free();
+      params->dictLookup("BitsPerComponent", &obj);
+      if (obj.isInt())
+       bits = obj.getInt();
+      obj.free();
+      params->dictLookup("EarlyChange", &obj);
+      if (obj.isInt())
+       early = obj.getInt();
+      obj.free();
+    }
+    str = new LZWStream(str, pred, columns, colors, bits, early);
+  } else if (!strcmp(name, "RunLengthDecode") || !strcmp(name, "RL")) {
+    str = new RunLengthStream(str);
+  } else if (!strcmp(name, "CCITTFaxDecode") || !strcmp(name, "CCF")) {
+    encoding = 0;
+    endOfLine = gFalse;
+    byteAlign = gFalse;
+    columns = 1728;
+    rows = 0;
+    endOfBlock = gTrue;
+    black = gFalse;
+    if (params->isDict()) {
+      params->dictLookup("K", &obj);
+      if (obj.isInt()) {
+       encoding = obj.getInt();
+      }
+      obj.free();
+      params->dictLookup("EndOfLine", &obj);
+      if (obj.isBool()) {
+       endOfLine = obj.getBool();
+      }
+      obj.free();
+      params->dictLookup("EncodedByteAlign", &obj);
+      if (obj.isBool()) {
+       byteAlign = obj.getBool();
+      }
+      obj.free();
+      params->dictLookup("Columns", &obj);
+      if (obj.isInt()) {
+       columns = obj.getInt();
+      }
+      obj.free();
+      params->dictLookup("Rows", &obj);
+      if (obj.isInt()) {
+       rows = obj.getInt();
+      }
+      obj.free();
+      params->dictLookup("EndOfBlock", &obj);
+      if (obj.isBool()) {
+       endOfBlock = obj.getBool();
+      }
+      obj.free();
+      params->dictLookup("BlackIs1", &obj);
+      if (obj.isBool()) {
+       black = obj.getBool();
+      }
+      obj.free();
+    }
+    str = new CCITTFaxStream(str, encoding, endOfLine, byteAlign,
+                            columns, rows, endOfBlock, black);
+  } else if (!strcmp(name, "DCTDecode") || !strcmp(name, "DCT")) {
+    colorXform = -1;
+    if (params->isDict()) {
+      if (params->dictLookup("ColorTransform", &obj)->isInt()) {
+       colorXform = obj.getInt();
+      }
+      obj.free();
+    }
+    str = new DCTStream(str, colorXform);
+  } else if (!strcmp(name, "FlateDecode") || !strcmp(name, "Fl")) {
+    pred = 1;
+    columns = 1;
+    colors = 1;
+    bits = 8;
+    if (params->isDict()) {
+      params->dictLookup("Predictor", &obj);
+      if (obj.isInt())
+       pred = obj.getInt();
+      obj.free();
+      params->dictLookup("Columns", &obj);
+      if (obj.isInt())
+       columns = obj.getInt();
+      obj.free();
+      params->dictLookup("Colors", &obj);
+      if (obj.isInt())
+       colors = obj.getInt();
+      obj.free();
+      params->dictLookup("BitsPerComponent", &obj);
+      if (obj.isInt())
+       bits = obj.getInt();
+      obj.free();
+    }
+    str = new FlateStream(str, pred, columns, colors, bits);
+  } else if (!strcmp(name, "JBIG2Decode")) {
+    if (params->isDict()) {
+      params->dictLookup("JBIG2Globals", &globals);
+    }
+    str = new JBIG2Stream(str, &globals);
+    globals.free();
+  } else if (!strcmp(name, "JPXDecode")) {
+    str = new JPXStream(str);
+  } else {
+    error(errSyntaxError, getPos(), "Unknown filter '{0:s}'", name);
+    str = new EOFStream(str);
+  }
+  return str;
+}
+
+//------------------------------------------------------------------------
+// OutStream
+//------------------------------------------------------------------------
+OutStream::OutStream ()
+{
+  ref = 1;
+}
+
+OutStream::~OutStream ()
+{
+}
+
+//------------------------------------------------------------------------
+// FileOutStream
+//------------------------------------------------------------------------
+FileOutStream::FileOutStream (FILE* fa, Guint startA)
+{
+  f = fa;
+  start = startA;
+}
+
+FileOutStream::~FileOutStream ()
+{
+  close ();
+}
+
+void FileOutStream::close ()
+{
+
+}
+
+int FileOutStream::getPos ()
+{
+  return ftell(f);
+}
+
+void FileOutStream::put (char c)
+{
+  fputc(c,f);
+}
+
+void FileOutStream::printf(const char *format, ...)
+{
+  va_list argptr;
+  va_start (argptr, format);
+  vfprintf(f, format, argptr);
+  va_end (argptr);
+}
+
+
+//------------------------------------------------------------------------
+// BaseStream
+//------------------------------------------------------------------------
+
+BaseStream::BaseStream(Object *dictA, Guint lengthA) {
+  dict = *dictA;
+  length = lengthA;
+}
+
+BaseStream::~BaseStream() {
+  dict.free();
+}
+
+//------------------------------------------------------------------------
+// FilterStream
+//------------------------------------------------------------------------
+
+FilterStream::FilterStream(Stream *strA) {
+  str = strA;
+}
+
+FilterStream::~FilterStream() {
+}
+
+void FilterStream::close() {
+  str->close();
+}
+
+void FilterStream::setPos(Guint pos, int dir) {
+  error(errInternal, -1, "Internal: called setPos() on FilterStream");
+}
+
+//------------------------------------------------------------------------
+// ImageStream
+//------------------------------------------------------------------------
+
+ImageStream::ImageStream(Stream *strA, int widthA, int nCompsA, int nBitsA) {
+  int imgLineSize;
+
+  str = strA;
+  width = widthA;
+  nComps = nCompsA;
+  nBits = nBitsA;
+
+  nVals = width * nComps;
+  inputLineSize = (nVals * nBits + 7) >> 3;
+  if (nVals > INT_MAX / nBits - 7) {
+    // force a call to gmallocn(-1,...), which will throw an exception
+    inputLineSize = -1;
+  }
+  inputLine = (Guchar *)gmallocn(inputLineSize, sizeof(char));
+  if (nBits == 8) {
+    imgLine = (Guchar *)inputLine;
+  } else {
+    if (nBits == 1) {
+      imgLineSize = (nVals + 7) & ~7;
+    } else {
+      imgLineSize = nVals;
+    }
+    if (width > INT_MAX / nComps) {
+      // force a call to gmallocn(-1,...), which will throw an exception
+      imgLineSize = -1;
+    }
+    imgLine = (Guchar *)gmallocn(imgLineSize, sizeof(Guchar));
+  }
+  imgIdx = nVals;
+}
+
+ImageStream::~ImageStream() {
+  if (imgLine != (Guchar *)inputLine) {
+    gfree(imgLine);
+  }
+  gfree(inputLine);
+}
+
+void ImageStream::reset() {
+  str->reset();
+}
+
+void ImageStream::close() {
+  str->close();
+}
+
+GBool ImageStream::getPixel(Guchar *pix) {
+  int i;
+
+  if (imgIdx >= nVals) {
+    if (!getLine()) {
+      return gFalse;
+    }
+    imgIdx = 0;
+  }
+  for (i = 0; i < nComps; ++i) {
+    pix[i] = imgLine[imgIdx++];
+  }
+  return gTrue;
+}
+
+Guchar *ImageStream::getLine() {
+  Gulong buf, bitMask;
+  int bits;
+  int c;
+  int i;
+  Guchar *p;
+  int readChars = str->doGetChars(inputLineSize, inputLine);
+  for ( ; readChars < inputLineSize; readChars++) inputLine[readChars] = EOF;
+  if (nBits == 1) {
+    p = inputLine;
+    for (i = 0; i < nVals; i += 8) {
+      c = *p++;
+      imgLine[i+0] = (Guchar)((c >> 7) & 1);
+      imgLine[i+1] = (Guchar)((c >> 6) & 1);
+      imgLine[i+2] = (Guchar)((c >> 5) & 1);
+      imgLine[i+3] = (Guchar)((c >> 4) & 1);
+      imgLine[i+4] = (Guchar)((c >> 3) & 1);
+      imgLine[i+5] = (Guchar)((c >> 2) & 1);
+      imgLine[i+6] = (Guchar)((c >> 1) & 1);
+      imgLine[i+7] = (Guchar)(c & 1);
+    }
+  } else if (nBits == 8) {
+    // special case: imgLine == inputLine
+  } else if (nBits == 16) {
+    // this is a hack to support 16 bits images, everywhere
+    // we assume a component fits in 8 bits, with this hack
+    // we treat 16 bit images as 8 bit ones until it's fixed correctly.
+    // The hack has another part on GfxImageColorMap::GfxImageColorMap
+    p = inputLine;
+    for (i = 0; i < nVals; ++i) {
+      imgLine[i] = *p++;
+      p++;
+    }
+  } else {
+    bitMask = (1 << nBits) - 1;
+    buf = 0;
+    bits = 0;
+    p = inputLine;
+    for (i = 0; i < nVals; ++i) {
+      if (bits < nBits) {
+       buf = (buf << 8) | (*p++ & 0xff);
+       bits += 8;
+      }
+      imgLine[i] = (Guchar)((buf >> (bits - nBits)) & bitMask);
+      bits -= nBits;
+    }
+  }
+  return imgLine;
+}
+
+void ImageStream::skipLine() {
+  str->doGetChars(inputLineSize, inputLine);
+}
+
+//------------------------------------------------------------------------
+// StreamPredictor
+//------------------------------------------------------------------------
+
+StreamPredictor::StreamPredictor(Stream *strA, int predictorA,
+                                int widthA, int nCompsA, int nBitsA) {
+  str = strA;
+  predictor = predictorA;
+  width = widthA;
+  nComps = nCompsA;
+  nBits = nBitsA;
+  predLine = NULL;
+  ok = gFalse;
+
+  nVals = width * nComps;
+  pixBytes = (nComps * nBits + 7) >> 3;
+  rowBytes = ((nVals * nBits + 7) >> 3) + pixBytes;
+  if (width <= 0 || nComps <= 0 || nBits <= 0 ||
+      nComps > gfxColorMaxComps ||
+      nBits > 16 ||
+      width >= INT_MAX / nComps ||      // check for overflow in nVals
+      nVals >= (INT_MAX - 7) / nBits) { // check for overflow in rowBytes
+    return;
+  }
+  predLine = (Guchar *)gmalloc(rowBytes);
+  memset(predLine, 0, rowBytes);
+  predIdx = rowBytes;
+
+  ok = gTrue;
+}
+
+StreamPredictor::~StreamPredictor() {
+  gfree(predLine);
+}
+
+int StreamPredictor::lookChar() {
+  if (predIdx >= rowBytes) {
+    if (!getNextLine()) {
+      return EOF;
+    }
+  }
+  return predLine[predIdx];
+}
+
+int StreamPredictor::getChar() {
+  if (predIdx >= rowBytes) {
+    if (!getNextLine()) {
+      return EOF;
+    }
+  }
+  return predLine[predIdx++];
+}
+
+int StreamPredictor::getChars(int nChars, Guchar *buffer) {
+  int n, m;
+
+  n = 0;
+  while (n < nChars) {
+    if (predIdx >= rowBytes) {
+      if (!getNextLine()) {
+       break;
+      }
+    }
+    m = rowBytes - predIdx;
+    if (m > nChars - n) {
+      m = nChars - n;
+    }
+    memcpy(buffer + n, predLine + predIdx, m);
+    predIdx += m;
+    n += m;
+  }
+  return n;
+}
+
+GBool StreamPredictor::getNextLine() {
+  int curPred;
+  Guchar upLeftBuf[gfxColorMaxComps * 2 + 1];
+  int left, up, upLeft, p, pa, pb, pc;
+  int c;
+  Gulong inBuf, outBuf, bitMask;
+  int inBits, outBits;
+  int i, j, k, kk;
+
+  // get PNG optimum predictor number
+  if (predictor >= 10) {
+    if ((curPred = str->getRawChar()) == EOF) {
+      return gFalse;
+    }
+    curPred += 10;
+  } else {
+    curPred = predictor;
+  }
+
+  // read the raw line, apply PNG (byte) predictor
+  int *rawCharLine = new int[rowBytes - pixBytes];
+  str->getRawChars(rowBytes - pixBytes, rawCharLine);
+  memset(upLeftBuf, 0, pixBytes + 1);
+  for (i = pixBytes; i < rowBytes; ++i) {
+    for (j = pixBytes; j > 0; --j) {
+      upLeftBuf[j] = upLeftBuf[j-1];
+    }
+    upLeftBuf[0] = predLine[i];
+    if ((c = rawCharLine[i - pixBytes]) == EOF) {
+      if (i > pixBytes) {
+       // this ought to return false, but some (broken) PDF files
+       // contain truncated image data, and Adobe apparently reads the
+       // last partial line
+       break;
+      }
+      delete[] rawCharLine;
+      return gFalse;
+    }
+    switch (curPred) {
+    case 11:                   // PNG sub
+      predLine[i] = predLine[i - pixBytes] + (Guchar)c;
+      break;
+    case 12:                   // PNG up
+      predLine[i] = predLine[i] + (Guchar)c;
+      break;
+    case 13:                   // PNG average
+      predLine[i] = ((predLine[i - pixBytes] + predLine[i]) >> 1) +
+                   (Guchar)c;
+      break;
+    case 14:                   // PNG Paeth
+      left = predLine[i - pixBytes];
+      up = predLine[i];
+      upLeft = upLeftBuf[pixBytes];
+      p = left + up - upLeft;
+      if ((pa = p - left) < 0)
+       pa = -pa;
+      if ((pb = p - up) < 0)
+       pb = -pb;
+      if ((pc = p - upLeft) < 0)
+       pc = -pc;
+      if (pa <= pb && pa <= pc)
+       predLine[i] = left + (Guchar)c;
+      else if (pb <= pc)
+       predLine[i] = up + (Guchar)c;
+      else
+       predLine[i] = upLeft + (Guchar)c;
+      break;
+    case 10:                   // PNG none
+    default:                   // no predictor or TIFF predictor
+      predLine[i] = (Guchar)c;
+      break;
+    }
+  }
+  delete[] rawCharLine;
+
+  // apply TIFF (component) predictor
+  if (predictor == 2) {
+    if (nBits == 1) {
+      inBuf = predLine[pixBytes - 1];
+      for (i = pixBytes; i < rowBytes; i += 8) {
+       // 1-bit add is just xor
+       inBuf = (inBuf << 8) | predLine[i];
+       predLine[i] ^= inBuf >> nComps;
+      }
+    } else if (nBits == 8) {
+      for (i = pixBytes; i < rowBytes; ++i) {
+       predLine[i] += predLine[i - nComps];
+      }
+    } else {
+      memset(upLeftBuf, 0, nComps + 1);
+      bitMask = (1 << nBits) - 1;
+      inBuf = outBuf = 0;
+      inBits = outBits = 0;
+      j = k = pixBytes;
+      for (i = 0; i < width; ++i) {
+       for (kk = 0; kk < nComps; ++kk) {
+         if (inBits < nBits) {
+           inBuf = (inBuf << 8) | (predLine[j++] & 0xff);
+           inBits += 8;
+         }
+         upLeftBuf[kk] = (Guchar)((upLeftBuf[kk] +
+                                   (inBuf >> (inBits - nBits))) & bitMask);
+         inBits -= nBits;
+         outBuf = (outBuf << nBits) | upLeftBuf[kk];
+         outBits += nBits;
+         if (outBits >= 8) {
+           predLine[k++] = (Guchar)(outBuf >> (outBits - 8));
+           outBits -= 8;
+         }
+       }
+      }
+      if (outBits > 0) {
+       predLine[k++] = (Guchar)((outBuf << (8 - outBits)) +
+                                (inBuf & ((1 << (8 - outBits)) - 1)));
+      }
+    }
+  }
+
+  // reset to start of line
+  predIdx = pixBytes;
+
+  return gTrue;
+}
+
+//------------------------------------------------------------------------
+// FileStream
+//------------------------------------------------------------------------
+
+FileStream::FileStream(FILE *fA, Guint startA, GBool limitedA,
+                      Guint lengthA, Object *dictA):
+    BaseStream(dictA, lengthA) {
+  f = fA;
+  start = startA;
+  limited = limitedA;
+  length = lengthA;
+  bufPtr = bufEnd = buf;
+  bufPos = start;
+  savePos = 0;
+  saved = gFalse;
+}
+
+FileStream::~FileStream() {
+  close();
+}
+
+Stream *FileStream::makeSubStream(Guint startA, GBool limitedA,
+                                 Guint lengthA, Object *dictA) {
+  return new FileStream(f, startA, limitedA, lengthA, dictA);
+}
+
+void FileStream::reset() {
+#if HAVE_FSEEKO
+  savePos = (Guint)ftello(f);
+  fseeko(f, start, SEEK_SET);
+#elif HAVE_FSEEK64
+  savePos = (Guint)ftell64(f);
+  fseek64(f, start, SEEK_SET);
+#else
+  savePos = (Guint)ftell(f);
+  fseek(f, start, SEEK_SET);
+#endif
+  saved = gTrue;
+  bufPtr = bufEnd = buf;
+  bufPos = start;
+}
+
+void FileStream::close() {
+  if (saved) {
+#if HAVE_FSEEKO
+    fseeko(f, savePos, SEEK_SET);
+#elif HAVE_FSEEK64
+    fseek64(f, savePos, SEEK_SET);
+#else
+    fseek(f, savePos, SEEK_SET);
+#endif
+    saved = gFalse;
+  }
+}
+
+GBool FileStream::fillBuf() {
+  int n;
+
+  bufPos += bufEnd - buf;
+  bufPtr = bufEnd = buf;
+  if (limited && bufPos >= start + length) {
+    return gFalse;
+  }
+  if (limited && bufPos + fileStreamBufSize > start + length) {
+    n = start + length - bufPos;
+  } else {
+    n = fileStreamBufSize;
+  }
+  n = fread(buf, 1, n, f);
+  bufEnd = buf + n;
+  if (bufPtr >= bufEnd) {
+    return gFalse;
+  }
+  return gTrue;
+}
+
+void FileStream::setPos(Guint pos, int dir) {
+  Guint size;
+
+  if (dir >= 0) {
+#if HAVE_FSEEKO
+    fseeko(f, pos, SEEK_SET);
+#elif HAVE_FSEEK64
+    fseek64(f, pos, SEEK_SET);
+#else
+    fseek(f, pos, SEEK_SET);
+#endif
+    bufPos = pos;
+  } else {
+#if HAVE_FSEEKO
+    fseeko(f, 0, SEEK_END);
+    size = (Guint)ftello(f);
+#elif HAVE_FSEEK64
+    fseek64(f, 0, SEEK_END);
+    size = (Guint)ftell64(f);
+#else
+    fseek(f, 0, SEEK_END);
+    size = (Guint)ftell(f);
+#endif
+    if (pos > size)
+      pos = (Guint)size;
+#if HAVE_FSEEKO
+    fseeko(f, -(int)pos, SEEK_END);
+    bufPos = (Guint)ftello(f);
+#elif HAVE_FSEEK64
+    fseek64(f, -(int)pos, SEEK_END);
+    bufPos = (Guint)ftell64(f);
+#else
+    fseek(f, -(int)pos, SEEK_END);
+    bufPos = (Guint)ftell(f);
+#endif
+  }
+  bufPtr = bufEnd = buf;
+}
+
+void FileStream::moveStart(int delta) {
+  start += delta;
+  bufPtr = bufEnd = buf;
+  bufPos = start;
+}
+
+//------------------------------------------------------------------------
+// CachedFileStream
+//------------------------------------------------------------------------
+
+CachedFileStream::CachedFileStream(CachedFile *ccA, Guint startA,
+        GBool limitedA, Guint lengthA, Object *dictA)
+  : BaseStream(dictA, lengthA)
+{
+  cc = ccA;
+  start = startA;
+  limited = limitedA;
+  length = lengthA;
+  bufPtr = bufEnd = buf;
+  bufPos = start;
+  savePos = 0;
+  saved = gFalse;
+}
+
+CachedFileStream::~CachedFileStream()
+{
+  close();
+  cc->decRefCnt();
+}
+
+Stream *CachedFileStream::makeSubStream(Guint startA, GBool limitedA,
+        Guint lengthA, Object *dictA)
+{
+  cc->incRefCnt();
+  return new CachedFileStream(cc, startA, limitedA, lengthA, dictA);
+}
+
+void CachedFileStream::reset()
+{
+  savePos = (Guint)cc->tell();
+  cc->seek(start, SEEK_SET);
+
+  saved = gTrue;
+  bufPtr = bufEnd = buf;
+  bufPos = start;
+}
+
+void CachedFileStream::close()
+{
+  if (saved) {
+    cc->seek(savePos, SEEK_SET);
+    saved = gFalse;
+  }
+}
+
+GBool CachedFileStream::fillBuf()
+{
+  int n;
+
+  bufPos += bufEnd - buf;
+  bufPtr = bufEnd = buf;
+  if (limited && bufPos >= start + length) {
+    return gFalse;
+  }
+  if (limited && bufPos + cachedStreamBufSize > start + length) {
+    n = start + length - bufPos;
+  } else {
+    n = cachedStreamBufSize - (bufPos % cachedStreamBufSize);
+  }
+  cc->read(buf, 1, n);
+  bufEnd = buf + n;
+  if (bufPtr >= bufEnd) {
+    return gFalse;
+  }
+  return gTrue;
+}
+
+void CachedFileStream::setPos(Guint pos, int dir)
+{
+  Guint size;
+
+  if (dir >= 0) {
+    cc->seek(pos, SEEK_SET);
+    bufPos = pos;
+  } else {
+    cc->seek(0, SEEK_END);
+    size = (Guint)cc->tell();
+
+    if (pos > size)
+      pos = (Guint)size;
+
+    cc->seek(-(int)pos, SEEK_END);
+    bufPos = (Guint)cc->tell();
+  }
+
+  bufPtr = bufEnd = buf;
+}
+
+void CachedFileStream::moveStart(int delta)
+{
+  start += delta;
+  bufPtr = bufEnd = buf;
+  bufPos = start;
+}
+
+//------------------------------------------------------------------------
+// MemStream
+//------------------------------------------------------------------------
+
+MemStream::MemStream(char *bufA, Guint startA, Guint lengthA, Object *dictA):
+    BaseStream(dictA, lengthA) {
+  buf = bufA;
+  start = startA;
+  length = lengthA;
+  bufEnd = buf + start + length;
+  bufPtr = buf + start;
+  needFree = gFalse;
+}
+
+MemStream::~MemStream() {
+  if (needFree) {
+    gfree(buf);
+  }
+}
+
+Stream *MemStream::makeSubStream(Guint startA, GBool limited,
+                                Guint lengthA, Object *dictA) {
+  MemStream *subStr;
+  Guint newLength;
+
+  if (!limited || startA + lengthA > start + length) {
+    newLength = start + length - startA;
+  } else {
+    newLength = lengthA;
+  }
+  subStr = new MemStream(buf, startA, newLength, dictA);
+  return subStr;
+}
+
+void MemStream::reset() {
+  bufPtr = buf + start;
+}
+
+void MemStream::close() {
+}
+
+int MemStream::getChars(int nChars, Guchar *buffer) {
+  int n;
+
+  if (nChars <= 0) {
+    return 0;
+  }
+  if (bufEnd - bufPtr < nChars) {
+    n = (int)(bufEnd - bufPtr);
+  } else {
+    n = nChars;
+  }
+  memcpy(buffer, bufPtr, n);
+  bufPtr += n;
+  return n;
+}
+
+void MemStream::setPos(Guint pos, int dir) {
+  Guint i;
+
+  if (dir >= 0) {
+    i = pos;
+  } else {
+    i = start + length - pos;
+  }
+  if (i < start) {
+    i = start;
+  } else if (i > start + length) {
+    i = start + length;
+  }
+  bufPtr = buf + i;
+}
+
+void MemStream::moveStart(int delta) {
+  start += delta;
+  length -= delta;
+  bufPtr = buf + start;
+}
+
+//------------------------------------------------------------------------
+// EmbedStream
+//------------------------------------------------------------------------
+
+EmbedStream::EmbedStream(Stream *strA, Object *dictA,
+                        GBool limitedA, Guint lengthA):
+    BaseStream(dictA, lengthA) {
+  str = strA;
+  limited = limitedA;
+  length = lengthA;
+}
+
+EmbedStream::~EmbedStream() {
+}
+
+Stream *EmbedStream::makeSubStream(Guint start, GBool limitedA,
+                                  Guint lengthA, Object *dictA) {
+  error(errInternal, -1, "Called makeSubStream() on EmbedStream");
+  return NULL;
+}
+
+int EmbedStream::getChar() {
+  if (limited && !length) {
+    return EOF;
+  }
+  --length;
+  return str->getChar();
+}
+
+int EmbedStream::lookChar() {
+  if (limited && !length) {
+    return EOF;
+  }
+  return str->lookChar();
+}
+
+int EmbedStream::getChars(int nChars, Guchar *buffer) {
+  if (nChars <= 0) {
+    return 0;
+  }
+  if (limited && length < (Guint)nChars) {
+    nChars = (int)length;
+  }
+  return str->doGetChars(nChars, buffer);
+}
+
+void EmbedStream::setPos(Guint pos, int dir) {
+  error(errInternal, -1, "Internal: called setPos() on EmbedStream");
+}
+
+Guint EmbedStream::getStart() {
+  error(errInternal, -1, "Internal: called getStart() on EmbedStream");
+  return 0;
+}
+
+void EmbedStream::moveStart(int delta) {
+  error(errInternal, -1, "Internal: called moveStart() on EmbedStream");
+}
+
+//------------------------------------------------------------------------
+// ASCIIHexStream
+//------------------------------------------------------------------------
+
+ASCIIHexStream::ASCIIHexStream(Stream *strA):
+    FilterStream(strA) {
+  buf = EOF;
+  eof = gFalse;
+}
+
+ASCIIHexStream::~ASCIIHexStream() {
+  delete str;
+}
+
+void ASCIIHexStream::reset() {
+  str->reset();
+  buf = EOF;
+  eof = gFalse;
+}
+
+int ASCIIHexStream::lookChar() {
+  int c1, c2, x;
+
+  if (buf != EOF)
+    return buf;
+  if (eof) {
+    buf = EOF;
+    return EOF;
+  }
+  do {
+    c1 = str->getChar();
+  } while (isspace(c1));
+  if (c1 == '>') {
+    eof = gTrue;
+    buf = EOF;
+    return buf;
+  }
+  do {
+    c2 = str->getChar();
+  } while (isspace(c2));
+  if (c2 == '>') {
+    eof = gTrue;
+    c2 = '0';
+  }
+  if (c1 >= '0' && c1 <= '9') {
+    x = (c1 - '0') << 4;
+  } else if (c1 >= 'A' && c1 <= 'F') {
+    x = (c1 - 'A' + 10) << 4;
+  } else if (c1 >= 'a' && c1 <= 'f') {
+    x = (c1 - 'a' + 10) << 4;
+  } else if (c1 == EOF) {
+    eof = gTrue;
+    x = 0;
+  } else {
+    error(errSyntaxError, getPos(),
+         "Illegal character <{0:02x}> in ASCIIHex stream", c1);
+    x = 0;
+  }
+  if (c2 >= '0' && c2 <= '9') {
+    x += c2 - '0';
+  } else if (c2 >= 'A' && c2 <= 'F') {
+    x += c2 - 'A' + 10;
+  } else if (c2 >= 'a' && c2 <= 'f') {
+    x += c2 - 'a' + 10;
+  } else if (c2 == EOF) {
+    eof = gTrue;
+    x = 0;
+  } else {
+    error(errSyntaxError, getPos(),
+         "Illegal character <{0:02x}> in ASCIIHex stream", c2);
+  }
+  buf = x & 0xff;
+  return buf;
+}
+
+GooString *ASCIIHexStream::getPSFilter(int psLevel, const char *indent) {
+  GooString *s;
+
+  if (psLevel < 2) {
+    return NULL;
+  }
+  if (!(s = str->getPSFilter(psLevel, indent))) {
+    return NULL;
+  }
+  s->append(indent)->append("/ASCIIHexDecode filter\n");
+  return s;
+}
+
+GBool ASCIIHexStream::isBinary(GBool last) {
+  return str->isBinary(gFalse);
+}
+
+//------------------------------------------------------------------------
+// ASCII85Stream
+//------------------------------------------------------------------------
+
+ASCII85Stream::ASCII85Stream(Stream *strA):
+    FilterStream(strA) {
+  index = n = 0;
+  eof = gFalse;
+}
+
+ASCII85Stream::~ASCII85Stream() {
+  delete str;
+}
+
+void ASCII85Stream::reset() {
+  str->reset();
+  index = n = 0;
+  eof = gFalse;
+}
+
+int ASCII85Stream::lookChar() {
+  int k;
+  Gulong t;
+
+  if (index >= n) {
+    if (eof)
+      return EOF;
+    index = 0;
+    do {
+      c[0] = str->getChar();
+    } while (Lexer::isSpace(c[0]));
+    if (c[0] == '~' || c[0] == EOF) {
+      eof = gTrue;
+      n = 0;
+      return EOF;
+    } else if (c[0] == 'z') {
+      b[0] = b[1] = b[2] = b[3] = 0;
+      n = 4;
+    } else {
+      for (k = 1; k < 5; ++k) {
+       do {
+         c[k] = str->getChar();
+       } while (Lexer::isSpace(c[k]));
+       if (c[k] == '~' || c[k] == EOF)
+         break;
+      }
+      n = k - 1;
+      if (k < 5 && (c[k] == '~' || c[k] == EOF)) {
+       for (++k; k < 5; ++k)
+         c[k] = 0x21 + 84;
+       eof = gTrue;
+      }
+      t = 0;
+      for (k = 0; k < 5; ++k)
+       t = t * 85 + (c[k] - 0x21);
+      for (k = 3; k >= 0; --k) {
+       b[k] = (int)(t & 0xff);
+       t >>= 8;
+      }
+    }
+  }
+  return b[index];
+}
+
+GooString *ASCII85Stream::getPSFilter(int psLevel, const char *indent) {
+  GooString *s;
+
+  if (psLevel < 2) {
+    return NULL;
+  }
+  if (!(s = str->getPSFilter(psLevel, indent))) {
+    return NULL;
+  }
+  s->append(indent)->append("/ASCII85Decode filter\n");
+  return s;
+}
+
+GBool ASCII85Stream::isBinary(GBool last) {
+  return str->isBinary(gFalse);
+}
+
+//------------------------------------------------------------------------
+// LZWStream
+//------------------------------------------------------------------------
+
+LZWStream::LZWStream(Stream *strA, int predictor, int columns, int colors,
+                    int bits, int earlyA):
+    FilterStream(strA) {
+  if (predictor != 1) {
+    pred = new StreamPredictor(this, predictor, columns, colors, bits);
+    if (!pred->isOk()) {
+      delete pred;
+      pred = NULL;
+    }
+  } else {
+    pred = NULL;
+  }
+  early = earlyA;
+  eof = gFalse;
+  inputBits = 0;
+  clearTable();
+}
+
+LZWStream::~LZWStream() {
+  if (pred) {
+    delete pred;
+  }
+  delete str;
+}
+
+int LZWStream::getChar() {
+  if (pred) {
+    return pred->getChar();
+  }
+  if (eof) {
+    return EOF;
+  }
+  if (seqIndex >= seqLength) {
+    if (!processNextCode()) {
+      return EOF;
+    }
+  }
+  return seqBuf[seqIndex++];
+}
+
+int LZWStream::lookChar() {
+  if (pred) {
+    return pred->lookChar();
+  }
+  if (eof) {
+    return EOF;
+  }
+  if (seqIndex >= seqLength) {
+    if (!processNextCode()) {
+      return EOF;
+    }
+  }
+  return seqBuf[seqIndex];
+}
+
+void LZWStream::getRawChars(int nChars, int *buffer) {
+  for (int i = 0; i < nChars; ++i)
+    buffer[i] = doGetRawChar();
+}
+
+int LZWStream::getRawChar() {
+  return doGetRawChar();
+}
+
+int LZWStream::getChars(int nChars, Guchar *buffer) {
+  int n, m;
+
+  if (pred) {
+    return pred->getChars(nChars, buffer);
+  }
+  if (eof) {
+    return 0;
+  }
+  n = 0;
+  while (n < nChars) {
+    if (seqIndex >= seqLength) {
+      if (!processNextCode()) {
+       break;
+      }
+    }
+    m = seqLength - seqIndex;
+    if (m > nChars - n) {
+      m = nChars - n;
+    }
+    memcpy(buffer + n, seqBuf + seqIndex, m);
+    seqIndex += m;
+    n += m;
+  }
+  return n;
+}
+
+void LZWStream::reset() {
+  str->reset();
+  eof = gFalse;
+  inputBits = 0;
+  clearTable();
+}
+
+GBool LZWStream::processNextCode() {
+  int code;
+  int nextLength;
+  int i, j;
+
+  // check for EOF
+  if (eof) {
+    return gFalse;
+  }
+
+  // check for eod and clear-table codes
+ start:
+  code = getCode();
+  if (code == EOF || code == 257) {
+    eof = gTrue;
+    return gFalse;
+  }
+  if (code == 256) {
+    clearTable();
+    goto start;
+  }
+  if (nextCode >= 4097) {
+    error(errSyntaxError, getPos(),
+         "Bad LZW stream - expected clear-table code");
+    clearTable();
+  }
+
+  // process the next code
+  nextLength = seqLength + 1;
+  if (code < 256) {
+    seqBuf[0] = code;
+    seqLength = 1;
+  } else if (code < nextCode) {
+    seqLength = table[code].length;
+    for (i = seqLength - 1, j = code; i > 0; --i) {
+      seqBuf[i] = table[j].tail;
+      j = table[j].head;
+    }
+    seqBuf[0] = j;
+  } else if (code == nextCode) {
+    seqBuf[seqLength] = newChar;
+    ++seqLength;
+  } else {
+    error(errSyntaxError, getPos(), "Bad LZW stream - unexpected code");
+    eof = gTrue;
+    return gFalse;
+  }
+  newChar = seqBuf[0];
+  if (first) {
+    first = gFalse;
+  } else {
+    table[nextCode].length = nextLength;
+    table[nextCode].head = prevCode;
+    table[nextCode].tail = newChar;
+    ++nextCode;
+    if (nextCode + early == 512)
+      nextBits = 10;
+    else if (nextCode + early == 1024)
+      nextBits = 11;
+    else if (nextCode + early == 2048)
+      nextBits = 12;
+  }
+  prevCode = code;
+
+  // reset buffer
+  seqIndex = 0;
+
+  return gTrue;
+}
+
+void LZWStream::clearTable() {
+  nextCode = 258;
+  nextBits = 9;
+  seqIndex = seqLength = 0;
+  first = gTrue;
+}
+
+int LZWStream::getCode() {
+  int c;
+  int code;
+
+  while (inputBits < nextBits) {
+    if ((c = str->getChar()) == EOF)
+      return EOF;
+    inputBuf = (inputBuf << 8) | (c & 0xff);
+    inputBits += 8;
+  }
+  code = (inputBuf >> (inputBits - nextBits)) & ((1 << nextBits) - 1);
+  inputBits -= nextBits;
+  return code;
+}
+
+GooString *LZWStream::getPSFilter(int psLevel, const char *indent) {
+  GooString *s;
+
+  if (psLevel < 2 || pred) {
+    return NULL;
+  }
+  if (!(s = str->getPSFilter(psLevel, indent))) {
+    return NULL;
+  }
+  s->append(indent)->append("<< ");
+  if (!early) {
+    s->append("/EarlyChange 0 ");
+  }
+  s->append(">> /LZWDecode filter\n");
+  return s;
+}
+
+GBool LZWStream::isBinary(GBool last) {
+  return str->isBinary(gTrue);
+}
+
+//------------------------------------------------------------------------
+// RunLengthStream
+//------------------------------------------------------------------------
+
+RunLengthStream::RunLengthStream(Stream *strA):
+    FilterStream(strA) {
+  bufPtr = bufEnd = buf;
+  eof = gFalse;
+}
+
+RunLengthStream::~RunLengthStream() {
+  delete str;
+}
+
+void RunLengthStream::reset() {
+  str->reset();
+  bufPtr = bufEnd = buf;
+  eof = gFalse;
+}
+
+int RunLengthStream::getChars(int nChars, Guchar *buffer) {
+  int n, m;
+
+  n = 0;
+  while (n < nChars) {
+    if (bufPtr >= bufEnd) {
+      if (!fillBuf()) {
+       break;
+      }
+    }
+    m = (int)(bufEnd - bufPtr);
+    if (m > nChars - n) {
+      m = nChars - n;
+    }
+    memcpy(buffer + n, bufPtr, m);
+    bufPtr += m;
+    n += m;
+  }
+  return n;
+}
+
+GooString *RunLengthStream::getPSFilter(int psLevel, const char *indent) {
+  GooString *s;
+
+  if (psLevel < 2) {
+    return NULL;
+  }
+  if (!(s = str->getPSFilter(psLevel, indent))) {
+    return NULL;
+  }
+  s->append(indent)->append("/RunLengthDecode filter\n");
+  return s;
+}
+
+GBool RunLengthStream::isBinary(GBool last) {
+  return str->isBinary(gTrue);
+}
+
+GBool RunLengthStream::fillBuf() {
+  int c;
+  int n, i;
+
+  if (eof)
+    return gFalse;
+  c = str->getChar();
+  if (c == 0x80 || c == EOF) {
+    eof = gTrue;
+    return gFalse;
+  }
+  if (c < 0x80) {
+    n = c + 1;
+    for (i = 0; i < n; ++i)
+      buf[i] = (char)str->getChar();
+  } else {
+    n = 0x101 - c;
+    c = str->getChar();
+    for (i = 0; i < n; ++i)
+      buf[i] = (char)c;
+  }
+  bufPtr = buf;
+  bufEnd = buf + n;
+  return gTrue;
+}
+
+//------------------------------------------------------------------------
+// CCITTFaxStream
+//------------------------------------------------------------------------
+
+CCITTFaxStream::CCITTFaxStream(Stream *strA, int encodingA, GBool endOfLineA,
+                              GBool byteAlignA, int columnsA, int rowsA,
+                              GBool endOfBlockA, GBool blackA):
+    FilterStream(strA) {
+  encoding = encodingA;
+  endOfLine = endOfLineA;
+  byteAlign = byteAlignA;
+  columns = columnsA;
+  if (columns < 1) {
+    columns = 1;
+  } else if (columns > INT_MAX - 2) {
+    columns = INT_MAX - 2;
+  }
+  rows = rowsA;
+  endOfBlock = endOfBlockA;
+  black = blackA;
+  // 0 <= codingLine[0] < codingLine[1] < ... < codingLine[n] = columns
+  // ---> max codingLine size = columns + 1
+  // refLine has one extra guard entry at the end
+  // ---> max refLine size = columns + 2
+  codingLine = (int *)gmallocn_checkoverflow(columns + 1, sizeof(int));
+  refLine = (int *)gmallocn_checkoverflow(columns + 2, sizeof(int));
+
+  if (codingLine != NULL && refLine != NULL) {
+    eof = gFalse;
+    codingLine[0] = columns;
+  } else {
+    eof = gTrue;
+  }
+  row = 0;
+  nextLine2D = encoding < 0;
+  inputBits = 0;
+  a0i = 0;
+  outputBits = 0;
+
+  buf = EOF;
+}
+
+CCITTFaxStream::~CCITTFaxStream() {
+  delete str;
+  gfree(refLine);
+  gfree(codingLine);
+}
+
+void CCITTFaxStream::ccittReset(GBool unfiltered) {
+  if (unfiltered)
+    str->unfilteredReset();
+  else
+    str->reset();
+
+  row = 0;
+  nextLine2D = encoding < 0;
+  inputBits = 0;
+  a0i = 0;
+  outputBits = 0;
+  buf = EOF;
+}
+
+void CCITTFaxStream::unfilteredReset() {
+  ccittReset(gTrue);
+}
+
+void CCITTFaxStream::reset() {
+  int code1;
+
+  ccittReset(gFalse);
+
+  if (codingLine != NULL && refLine != NULL) {
+    eof = gFalse;
+    codingLine[0] = columns;
+  } else {
+    eof = gTrue;
+  }
+
+  // skip any initial zero bits and end-of-line marker, and get the 2D
+  // encoding tag
+  while ((code1 = lookBits(12)) == 0) {
+    eatBits(1);
+  }
+  if (code1 == 0x001) {
+    eatBits(12);
+    endOfLine = gTrue;
+  }
+  if (encoding > 0) {
+    nextLine2D = !lookBits(1);
+    eatBits(1);
+  }
+}
+
+inline void CCITTFaxStream::addPixels(int a1, int blackPixels) {
+  if (a1 > codingLine[a0i]) {
+    if (a1 > columns) {
+      error(errSyntaxError, getPos(),
+           "CCITTFax row is wrong length ({0:d})", a1);
+      err = gTrue;
+      a1 = columns;
+    }
+    if ((a0i & 1) ^ blackPixels) {
+      ++a0i;
+    }
+    codingLine[a0i] = a1;
+  }
+}
+
+inline void CCITTFaxStream::addPixelsNeg(int a1, int blackPixels) {
+  if (a1 > codingLine[a0i]) {
+    if (a1 > columns) {
+      error(errSyntaxError, getPos(),
+           "CCITTFax row is wrong length ({0:d})", a1);
+      err = gTrue;
+      a1 = columns;
+    }
+    if ((a0i & 1) ^ blackPixels) {
+      ++a0i;
+    }
+    codingLine[a0i] = a1;
+  } else if (a1 < codingLine[a0i]) {
+    if (a1 < 0) {
+      error(errSyntaxError, getPos(), "Invalid CCITTFax code");
+      err = gTrue;
+      a1 = 0;
+    }
+    while (a0i > 0 && a1 <= codingLine[a0i - 1]) {
+      --a0i;
+    }
+    codingLine[a0i] = a1;
+  }
+}
+
+int CCITTFaxStream::lookChar() {
+  int code1, code2, code3;
+  int b1i, blackPixels, i, bits;
+  GBool gotEOL;
+
+  if (buf != EOF) {
+    return buf;
+  }
+
+  // read the next row
+  if (outputBits == 0) {
+
+    // if at eof just return EOF
+    if (eof) {
+      return EOF;
+    }
+
+    err = gFalse;
+
+    // 2-D encoding
+    if (nextLine2D) {
+      for (i = 0; codingLine[i] < columns; ++i) {
+       refLine[i] = codingLine[i];
+      }
+      refLine[i++] = columns;
+      refLine[i] = columns;
+      codingLine[0] = 0;
+      a0i = 0;
+      b1i = 0;
+      blackPixels = 0;
+      // invariant:
+      // refLine[b1i-1] <= codingLine[a0i] < refLine[b1i] < refLine[b1i+1]
+      //                                                             <= columns
+      // exception at left edge:
+      //   codingLine[a0i = 0] = refLine[b1i = 0] = 0 is possible
+      // exception at right edge:
+      //   refLine[b1i] = refLine[b1i+1] = columns is possible
+      while (codingLine[a0i] < columns) {
+       code1 = getTwoDimCode();
+       switch (code1) {
+       case twoDimPass:
+         if (likely(b1i + 1 < columns + 2)) {
+           addPixels(refLine[b1i + 1], blackPixels);
+           if (refLine[b1i + 1] < columns) {
+             b1i += 2;
+           }
+         }
+         break;
+       case twoDimHoriz:
+         code1 = code2 = 0;
+         if (blackPixels) {
+           do {
+             code1 += code3 = getBlackCode();
+           } while (code3 >= 64);
+           do {
+             code2 += code3 = getWhiteCode();
+           } while (code3 >= 64);
+         } else {
+           do {
+             code1 += code3 = getWhiteCode();
+           } while (code3 >= 64);
+           do {
+             code2 += code3 = getBlackCode();
+           } while (code3 >= 64);
+         }
+         addPixels(codingLine[a0i] + code1, blackPixels);
+         if (codingLine[a0i] < columns) {
+           addPixels(codingLine[a0i] + code2, blackPixels ^ 1);
+         }
+         while (refLine[b1i] <= codingLine[a0i] && refLine[b1i] < columns) {
+           b1i += 2;
+         }
+         break;
+       case twoDimVertR3:
+         addPixels(refLine[b1i] + 3, blackPixels);
+         blackPixels ^= 1;
+         if (codingLine[a0i] < columns) {
+           ++b1i;
+           while (refLine[b1i] <= codingLine[a0i] && refLine[b1i] < columns) {
+             b1i += 2;
+           }
+         }
+         break;
+       case twoDimVertR2:
+         addPixels(refLine[b1i] + 2, blackPixels);
+         blackPixels ^= 1;
+         if (codingLine[a0i] < columns) {
+           ++b1i;
+           while (refLine[b1i] <= codingLine[a0i] && refLine[b1i] < columns) {
+             b1i += 2;
+           }
+         }
+         break;
+       case twoDimVertR1:
+         addPixels(refLine[b1i] + 1, blackPixels);
+         blackPixels ^= 1;
+         if (codingLine[a0i] < columns) {
+           ++b1i;
+           while (refLine[b1i] <= codingLine[a0i] && refLine[b1i] < columns) {
+             b1i += 2;
+           }
+         }
+         break;
+       case twoDimVert0:
+         addPixels(refLine[b1i], blackPixels);
+         blackPixels ^= 1;
+         if (codingLine[a0i] < columns) {
+           ++b1i;
+           while (refLine[b1i] <= codingLine[a0i] && refLine[b1i] < columns) {
+             b1i += 2;
+           }
+         }
+         break;
+       case twoDimVertL3:
+         addPixelsNeg(refLine[b1i] - 3, blackPixels);
+         blackPixels ^= 1;
+         if (codingLine[a0i] < columns) {
+           if (b1i > 0) {
+             --b1i;
+           } else {
+             ++b1i;
+           }
+           while (refLine[b1i] <= codingLine[a0i] && refLine[b1i] < columns) {
+             b1i += 2;
+           }
+         }
+         break;
+       case twoDimVertL2:
+         addPixelsNeg(refLine[b1i] - 2, blackPixels);
+         blackPixels ^= 1;
+         if (codingLine[a0i] < columns) {
+           if (b1i > 0) {
+             --b1i;
+           } else {
+             ++b1i;
+           }
+           while (refLine[b1i] <= codingLine[a0i] && refLine[b1i] < columns) {
+             b1i += 2;
+           }
+         }
+         break;
+       case twoDimVertL1:
+         addPixelsNeg(refLine[b1i] - 1, blackPixels);
+         blackPixels ^= 1;
+         if (codingLine[a0i] < columns) {
+           if (b1i > 0) {
+             --b1i;
+           } else {
+             ++b1i;
+           }
+           while (refLine[b1i] <= codingLine[a0i] && refLine[b1i] < columns) {
+             b1i += 2;
+           }
+         }
+         break;
+       case EOF:
+         addPixels(columns, 0);
+         eof = gTrue;
+         break;
+       default:
+         error(errSyntaxError, getPos(),
+               "Bad 2D code {0:04x} in CCITTFax stream", code1);
+         addPixels(columns, 0);
+         err = gTrue;
+         break;
+       }
+      }
+
+    // 1-D encoding
+    } else {
+      codingLine[0] = 0;
+      a0i = 0;
+      blackPixels = 0;
+      while (codingLine[a0i] < columns) {
+       code1 = 0;
+       if (blackPixels) {
+         do {
+           code1 += code3 = getBlackCode();
+         } while (code3 >= 64);
+       } else {
+         do {
+           code1 += code3 = getWhiteCode();
+         } while (code3 >= 64);
+       }
+       addPixels(codingLine[a0i] + code1, blackPixels);
+       blackPixels ^= 1;
+      }
+    }
+
+    // check for end-of-line marker, skipping over any extra zero bits
+    // (if EncodedByteAlign is true and EndOfLine is false, there can
+    // be "false" EOL markers -- i.e., if the last n unused bits in
+    // row i are set to zero, and the first 11-n bits in row i+1
+    // happen to be zero -- so we don't look for EOL markers in this
+    // case)
+    gotEOL = gFalse;
+    if (!endOfBlock && row == rows - 1) {
+      eof = gTrue;
+    } else if (endOfLine || !byteAlign) {
+      code1 = lookBits(12);
+      if (endOfLine) {
+       while (code1 != EOF && code1 != 0x001) {
+         eatBits(1);
+         code1 = lookBits(12);
+       }
+      } else {
+       while (code1 == 0) {
+         eatBits(1);
+         code1 = lookBits(12);
+       }
+      }
+      if (code1 == 0x001) {
+       eatBits(12);
+       gotEOL = gTrue;
+      }
+    }
+
+    // byte-align the row
+    // (Adobe apparently doesn't do byte alignment after EOL markers
+    // -- I've seen CCITT image data streams in two different formats,
+    // both with the byteAlign flag set:
+    //   1. xx:x0:01:yy:yy
+    //   2. xx:00:1y:yy:yy
+    // where xx is the previous line, yy is the next line, and colons
+    // separate bytes.)
+    if (byteAlign && !gotEOL) {
+      inputBits &= ~7;
+    }
+
+    // check for end of stream
+    if (lookBits(1) == EOF) {
+      eof = gTrue;
+    }
+
+    // get 2D encoding tag
+    if (!eof && encoding > 0) {
+      nextLine2D = !lookBits(1);
+      eatBits(1);
+    }
+
+    // check for end-of-block marker
+    if (endOfBlock && !endOfLine && byteAlign) {
+      // in this case, we didn't check for an EOL code above, so we
+      // need to check here
+      code1 = lookBits(24);
+      if (code1 == 0x001001) {
+       eatBits(12);
+       gotEOL = gTrue;
+      }
+    }
+    if (endOfBlock && gotEOL) {
+      code1 = lookBits(12);
+      if (code1 == 0x001) {
+       eatBits(12);
+       if (encoding > 0) {
+         lookBits(1);
+         eatBits(1);
+       }
+       if (encoding >= 0) {
+         for (i = 0; i < 4; ++i) {
+           code1 = lookBits(12);
+           if (code1 != 0x001) {
+             error(errSyntaxError, getPos(),
+                   "Bad RTC code in CCITTFax stream");
+           }
+           eatBits(12);
+           if (encoding > 0) {
+             lookBits(1);
+             eatBits(1);
+           }
+         }
+       }
+       eof = gTrue;
+      }
+
+    // look for an end-of-line marker after an error -- we only do
+    // this if we know the stream contains end-of-line markers because
+    // the "just plow on" technique tends to work better otherwise
+    } else if (err && endOfLine) {
+      while (1) {
+       code1 = lookBits(13);
+       if (code1 == EOF) {
+         eof = gTrue;
+         return EOF;
+       }
+       if ((code1 >> 1) == 0x001) {
+         break;
+       }
+       eatBits(1);
+      }
+      eatBits(12); 
+      if (encoding > 0) {
+       eatBits(1);
+       nextLine2D = !(code1 & 1);
+      }
+    }
+
+    // set up for output
+    if (codingLine[0] > 0) {
+      outputBits = codingLine[a0i = 0];
+    } else {
+      outputBits = codingLine[a0i = 1];
+    }
+
+    ++row;
+  }
+
+  // get a byte
+  if (outputBits >= 8) {
+    buf = (a0i & 1) ? 0x00 : 0xff;
+    outputBits -= 8;
+    if (outputBits == 0 && codingLine[a0i] < columns) {
+      ++a0i;
+      outputBits = codingLine[a0i] - codingLine[a0i - 1];
+    }
+  } else {
+    bits = 8;
+    buf = 0;
+    do {
+      if (outputBits > bits) {
+       buf <<= bits;
+       if (!(a0i & 1)) {
+         buf |= 0xff >> (8 - bits);
+       }
+       outputBits -= bits;
+       bits = 0;
+      } else {
+       buf <<= outputBits;
+       if (!(a0i & 1)) {
+         buf |= 0xff >> (8 - outputBits);
+       }
+       bits -= outputBits;
+       outputBits = 0;
+       if (codingLine[a0i] < columns) {
+         ++a0i;
+         outputBits = codingLine[a0i] - codingLine[a0i - 1];
+       } else if (bits > 0) {
+         buf <<= bits;
+         bits = 0;
+       }
+      }
+    } while (bits);
+  }
+  if (black) {
+    buf ^= 0xff;
+  }
+  return buf;
+}
+
+short CCITTFaxStream::getTwoDimCode() {
+  int code;
+  const CCITTCode *p;
+  int n;
+
+  code = 0; // make gcc happy
+  if (endOfBlock) {
+    if ((code = lookBits(7)) != EOF) {
+      p = &twoDimTab1[code];
+      if (p->bits > 0) {
+       eatBits(p->bits);
+       return p->n;
+      }
+    }
+  } else {
+    for (n = 1; n <= 7; ++n) {
+      if ((code = lookBits(n)) == EOF) {
+       break;
+      }
+      if (n < 7) {
+       code <<= 7 - n;
+      }
+      p = &twoDimTab1[code];
+      if (p->bits == n) {
+       eatBits(n);
+       return p->n;
+      }
+    }
+  }
+  error(errSyntaxError, getPos(),
+       "Bad two dim code ({0:04x}) in CCITTFax stream", code);
+  return EOF;
+}
+
+short CCITTFaxStream::getWhiteCode() {
+  short code;
+  const CCITTCode *p;
+  int n;
+
+  code = 0; // make gcc happy
+  if (endOfBlock) {
+    code = lookBits(12);
+    if (code == EOF) {
+      return 1;
+    }
+    if ((code >> 5) == 0) {
+      p = &whiteTab1[code];
+    } else {
+      p = &whiteTab2[code >> 3];
+    }
+    if (p->bits > 0) {
+      eatBits(p->bits);
+      return p->n;
+    }
+  } else {
+    for (n = 1; n <= 9; ++n) {
+      code = lookBits(n);
+      if (code == EOF) {
+       return 1;
+      }
+      if (n < 9) {
+       code <<= 9 - n;
+      }
+      p = &whiteTab2[code];
+      if (p->bits == n) {
+       eatBits(n);
+       return p->n;
+      }
+    }
+    for (n = 11; n <= 12; ++n) {
+      code = lookBits(n);
+      if (code == EOF) {
+       return 1;
+      }
+      if (n < 12) {
+       code <<= 12 - n;
+      }
+      p = &whiteTab1[code];
+      if (p->bits == n) {
+       eatBits(n);
+       return p->n;
+      }
+    }
+  }
+  error(errSyntaxError, getPos(),
+       "Bad white code ({0:04x}) in CCITTFax stream", code);
+  // eat a bit and return a positive number so that the caller doesn't
+  // go into an infinite loop
+  eatBits(1);
+  return 1;
+}
+
+short CCITTFaxStream::getBlackCode() {
+  short code;
+  const CCITTCode *p;
+  int n;
+
+  code = 0; // make gcc happy
+  if (endOfBlock) {
+    code = lookBits(13);
+    if (code == EOF) {
+      return 1;
+    }
+    if ((code >> 7) == 0) {
+      p = &blackTab1[code];
+    } else if ((code >> 9) == 0 && (code >> 7) != 0) {
+      p = &blackTab2[(code >> 1) - 64];
+    } else {
+      p = &blackTab3[code >> 7];
+    }
+    if (p->bits > 0) {
+      eatBits(p->bits);
+      return p->n;
+    }
+  } else {
+    for (n = 2; n <= 6; ++n) {
+      code = lookBits(n);
+      if (code == EOF) {
+       return 1;
+      }
+      if (n < 6) {
+       code <<= 6 - n;
+      }
+      p = &blackTab3[code];
+      if (p->bits == n) {
+       eatBits(n);
+       return p->n;
+      }
+    }
+    for (n = 7; n <= 12; ++n) {
+      code = lookBits(n);
+      if (code == EOF) {
+       return 1;
+      }
+      if (n < 12) {
+       code <<= 12 - n;
+      }
+      if (code >= 64) {
+       p = &blackTab2[code - 64];
+       if (p->bits == n) {
+         eatBits(n);
+         return p->n;
+       }
+      }
+    }
+    for (n = 10; n <= 13; ++n) {
+      code = lookBits(n);
+      if (code == EOF) {
+       return 1;
+      }
+      if (n < 13) {
+       code <<= 13 - n;
+      }
+      p = &blackTab1[code];
+      if (p->bits == n) {
+       eatBits(n);
+       return p->n;
+      }
+    }
+  }
+  error(errSyntaxError, getPos(),
+       "Bad black code ({0:04x}) in CCITTFax stream", code);
+  // eat a bit and return a positive number so that the caller doesn't
+  // go into an infinite loop
+  eatBits(1);
+  return 1;
+}
+
+short CCITTFaxStream::lookBits(int n) {
+  int c;
+
+  while (inputBits < n) {
+    if ((c = str->getChar()) == EOF) {
+      if (inputBits == 0) {
+       return EOF;
+      }
+      // near the end of the stream, the caller may ask for more bits
+      // than are available, but there may still be a valid code in
+      // however many bits are available -- we need to return correct
+      // data in this case
+      return (inputBuf << (n - inputBits)) & (0xffffffff >> (32 - n));
+    }
+    inputBuf = (inputBuf << 8) + c;
+    inputBits += 8;
+  }
+  return (inputBuf >> (inputBits - n)) & (0xffffffff >> (32 - n));
+}
+
+GooString *CCITTFaxStream::getPSFilter(int psLevel, const char *indent) {
+  GooString *s;
+  char s1[50];
+
+  if (psLevel < 2) {
+    return NULL;
+  }
+  if (!(s = str->getPSFilter(psLevel, indent))) {
+    return NULL;
+  }
+  s->append(indent)->append("<< ");
+  if (encoding != 0) {
+    sprintf(s1, "/K %d ", encoding);
+    s->append(s1);
+  }
+  if (endOfLine) {
+    s->append("/EndOfLine true ");
+  }
+  if (byteAlign) {
+    s->append("/EncodedByteAlign true ");
+  }
+  sprintf(s1, "/Columns %d ", columns);
+  s->append(s1);
+  if (rows != 0) {
+    sprintf(s1, "/Rows %d ", rows);
+    s->append(s1);
+  }
+  if (!endOfBlock) {
+    s->append("/EndOfBlock false ");
+  }
+  if (black) {
+    s->append("/BlackIs1 true ");
+  }
+  s->append(">> /CCITTFaxDecode filter\n");
+  return s;
+}
+
+GBool CCITTFaxStream::isBinary(GBool last) {
+  return str->isBinary(gTrue);
+}
+
+#ifndef ENABLE_LIBJPEG
+
+//------------------------------------------------------------------------
+// DCTStream
+//------------------------------------------------------------------------
+
+// IDCT constants (20.12 fixed point format)
+#define dctCos1    4017                // cos(pi/16)
+#define dctSin1     799                // sin(pi/16)
+#define dctCos3    3406                // cos(3*pi/16)
+#define dctSin3    2276                // sin(3*pi/16)
+#define dctCos6    1567                // cos(6*pi/16)
+#define dctSin6    3784                // sin(6*pi/16)
+#define dctSqrt2   5793                // sqrt(2)
+#define dctSqrt1d2 2896                // sqrt(2) / 2
+
+// color conversion parameters (16.16 fixed point format)
+#define dctCrToR   91881       //  1.4020
+#define dctCbToG  -22553       // -0.3441363
+#define dctCrToG  -46802       // -0.71413636
+#define dctCbToB  116130       //  1.772
+
+// clip [-256,511] --> [0,255]
+#define dctClipOffset 256
+static Guchar dctClip[768];
+static int dctClipInit = 0;
+
+// zig zag decode map
+static const int dctZigZag[64] = {
+   0,
+   1,  8,
+  16,  9,  2,
+   3, 10, 17, 24,
+  32, 25, 18, 11, 4,
+   5, 12, 19, 26, 33, 40,
+  48, 41, 34, 27, 20, 13,  6,
+   7, 14, 21, 28, 35, 42, 49, 56,
+  57, 50, 43, 36, 29, 22, 15,
+  23, 30, 37, 44, 51, 58,
+  59, 52, 45, 38, 31,
+  39, 46, 53, 60,
+  61, 54, 47,
+  55, 62,
+  63
+};
+
+DCTStream::DCTStream(Stream *strA, int colorXformA):
+    FilterStream(strA) {
+  int i, j;
+
+  colorXform = colorXformA;
+  progressive = interleaved = gFalse;
+  width = height = 0;
+  mcuWidth = mcuHeight = 0;
+  numComps = 0;
+  comp = 0;
+  x = y = dy = 0;
+  for (i = 0; i < 4; ++i) {
+    for (j = 0; j < 32; ++j) {
+      rowBuf[i][j] = NULL;
+    }
+    frameBuf[i] = NULL;
+  }
+
+  if (!dctClipInit) {
+    for (i = -256; i < 0; ++i)
+      dctClip[dctClipOffset + i] = 0;
+    for (i = 0; i < 256; ++i)
+      dctClip[dctClipOffset + i] = i;
+    for (i = 256; i < 512; ++i)
+      dctClip[dctClipOffset + i] = 255;
+    dctClipInit = 1;
+  }
+}
+
+DCTStream::~DCTStream() {
+  close();
+  delete str;
+}
+
+void DCTStream::dctReset(GBool unfiltered) {
+  if (unfiltered)
+    str->unfilteredReset();
+  else
+    str->reset();
+
+  progressive = interleaved = gFalse;
+  width = height = 0;
+  numComps = 0;
+  numQuantTables = 0;
+  numDCHuffTables = 0;
+  numACHuffTables = 0;
+  gotJFIFMarker = gFalse;
+  gotAdobeMarker = gFalse;
+  restartInterval = 0;
+}
+
+void DCTStream::unfilteredReset() {
+  dctReset(gTrue);
+}
+
+void DCTStream::reset() {
+  int i, j;
+
+  dctReset(gFalse);
+
+  if (!readHeader()) {
+    y = height;
+    return;
+  }
+
+  // compute MCU size
+  if (numComps == 1) {
+    compInfo[0].hSample = compInfo[0].vSample = 1;
+  }
+  mcuWidth = compInfo[0].hSample;
+  mcuHeight = compInfo[0].vSample;
+  for (i = 1; i < numComps; ++i) {
+    if (compInfo[i].hSample > mcuWidth) {
+      mcuWidth = compInfo[i].hSample;
+    }
+    if (compInfo[i].vSample > mcuHeight) {
+      mcuHeight = compInfo[i].vSample;
+    }
+  }
+  mcuWidth *= 8;
+  mcuHeight *= 8;
+
+  // figure out color transform
+  if (colorXform == -1) {
+    if (numComps == 3) {
+      if (gotJFIFMarker) {
+       colorXform = 1;
+      } else if (compInfo[0].id == 82 && compInfo[1].id == 71 &&
+                compInfo[2].id == 66) { // ASCII "RGB"
+       colorXform = 0;
+      } else {
+       colorXform = 1;
+      }
+    } else {
+      colorXform = 0;
+    }
+  }
+
+  if (progressive || !interleaved) {
+
+    // allocate a buffer for the whole image
+    bufWidth = ((width + mcuWidth - 1) / mcuWidth) * mcuWidth;
+    bufHeight = ((height + mcuHeight - 1) / mcuHeight) * mcuHeight;
+    if (bufWidth <= 0 || bufHeight <= 0 ||
+       bufWidth > INT_MAX / bufWidth / (int)sizeof(int)) {
+      error(errSyntaxError, getPos(), "Invalid image size in DCT stream");
+      y = height;
+      return;
+    }
+    for (i = 0; i < numComps; ++i) {
+      frameBuf[i] = (int *)gmallocn(bufWidth * bufHeight, sizeof(int));
+      memset(frameBuf[i], 0, bufWidth * bufHeight * sizeof(int));
+    }
+
+    // read the image data
+    do {
+      restartMarker = 0xd0;
+      restart();
+      readScan();
+    } while (readHeader());
+
+    // decode
+    decodeImage();
+
+    // initialize counters
+    comp = 0;
+    x = 0;
+    y = 0;
+
+  } else {
+
+    // allocate a buffer for one row of MCUs
+    bufWidth = ((width + mcuWidth - 1) / mcuWidth) * mcuWidth;
+    for (i = 0; i < numComps; ++i) {
+      for (j = 0; j < mcuHeight; ++j) {
+       rowBuf[i][j] = (Guchar *)gmallocn(bufWidth, sizeof(Guchar));
+      }
+    }
+
+    // initialize counters
+    comp = 0;
+    x = 0;
+    y = 0;
+    dy = mcuHeight;
+
+    restartMarker = 0xd0;
+    restart();
+  }
+}
+
+void DCTStream::close() {
+  int i, j;
+
+  for (i = 0; i < 4; ++i) {
+    for (j = 0; j < 32; ++j) {
+      gfree(rowBuf[i][j]);
+      rowBuf[i][j] = NULL;
+    }
+    gfree(frameBuf[i]);
+    frameBuf[i] = NULL;
+  }
+  FilterStream::close();
+}
+
+int DCTStream::getChar() {
+  int c;
+
+  if (y >= height) {
+    return EOF;
+  }
+  if (progressive || !interleaved) {
+    c = frameBuf[comp][y * bufWidth + x];
+    if (++comp == numComps) {
+      comp = 0;
+      if (++x == width) {
+       x = 0;
+       ++y;
+      }
+    }
+  } else {
+    if (dy >= mcuHeight) {
+      if (!readMCURow()) {
+       y = height;
+       return EOF;
+      }
+      comp = 0;
+      x = 0;
+      dy = 0;
+    }
+    c = rowBuf[comp][dy][x];
+    if (++comp == numComps) {
+      comp = 0;
+      if (++x == width) {
+       x = 0;
+       ++y;
+       ++dy;
+       if (y == height) {
+         readTrailer();
+       }
+      }
+    }
+  }
+  return c;
+}
+
+int DCTStream::lookChar() {
+  if (y >= height) {
+    return EOF;
+  }
+  if (progressive || !interleaved) {
+    return frameBuf[comp][y * bufWidth + x];
+  } else {
+    if (dy >= mcuHeight) {
+      if (!readMCURow()) {
+       y = height;
+       return EOF;
+      }
+      comp = 0;
+      x = 0;
+      dy = 0;
+    }
+    return rowBuf[comp][dy][x];
+  }
+}
+
+void DCTStream::restart() {
+  int i;
+
+  inputBits = 0;
+  restartCtr = restartInterval;
+  for (i = 0; i < numComps; ++i) {
+    compInfo[i].prevDC = 0;
+  }
+  eobRun = 0;
+}
+
+// Read one row of MCUs from a sequential JPEG stream.
+GBool DCTStream::readMCURow() {
+  int data1[64];
+  Guchar data2[64];
+  Guchar *p1, *p2;
+  int pY, pCb, pCr, pR, pG, pB;
+  int h, v, horiz, vert, hSub, vSub;
+  int x1, x2, y2, x3, y3, x4, y4, x5, y5, cc, i;
+  int c;
+
+  for (x1 = 0; x1 < width; x1 += mcuWidth) {
+
+    // deal with restart marker
+    if (restartInterval > 0 && restartCtr == 0) {
+      c = readMarker();
+      if (c != restartMarker) {
+       error(errSyntaxError, getPos(),
+             "Bad DCT data: incorrect restart marker");
+       return gFalse;
+      }
+      if (++restartMarker == 0xd8)
+       restartMarker = 0xd0;
+      restart();
+    }
+
+    // read one MCU
+    for (cc = 0; cc < numComps; ++cc) {
+      h = compInfo[cc].hSample;
+      v = compInfo[cc].vSample;
+      horiz = mcuWidth / h;
+      vert = mcuHeight / v;
+      hSub = horiz / 8;
+      vSub = vert / 8;
+      for (y2 = 0; y2 < mcuHeight; y2 += vert) {
+       for (x2 = 0; x2 < mcuWidth; x2 += horiz) {
+         if (unlikely(scanInfo.dcHuffTable[cc] >= 4) || unlikely(scanInfo.acHuffTable[cc] >= 4)) {
+           return gFalse;
+         }
+         if (!readDataUnit(&dcHuffTables[scanInfo.dcHuffTable[cc]],
+                           &acHuffTables[scanInfo.acHuffTable[cc]],
+                           &compInfo[cc].prevDC,
+                           data1)) {
+           return gFalse;
+         }
+         transformDataUnit(quantTables[compInfo[cc].quantTable],
+                           data1, data2);
+         if (hSub == 1 && vSub == 1) {
+           for (y3 = 0, i = 0; y3 < 8; ++y3, i += 8) {
+             p1 = &rowBuf[cc][y2+y3][x1+x2];
+             p1[0] = data2[i];
+             p1[1] = data2[i+1];
+             p1[2] = data2[i+2];
+             p1[3] = data2[i+3];
+             p1[4] = data2[i+4];
+             p1[5] = data2[i+5];
+             p1[6] = data2[i+6];
+             p1[7] = data2[i+7];
+           }
+         } else if (hSub == 2 && vSub == 2) {
+           for (y3 = 0, i = 0; y3 < 16; y3 += 2, i += 8) {
+             p1 = &rowBuf[cc][y2+y3][x1+x2];
+             p2 = &rowBuf[cc][y2+y3+1][x1+x2];
+             p1[0] = p1[1] = p2[0] = p2[1] = data2[i];
+             p1[2] = p1[3] = p2[2] = p2[3] = data2[i+1];
+             p1[4] = p1[5] = p2[4] = p2[5] = data2[i+2];
+             p1[6] = p1[7] = p2[6] = p2[7] = data2[i+3];
+             p1[8] = p1[9] = p2[8] = p2[9] = data2[i+4];
+             p1[10] = p1[11] = p2[10] = p2[11] = data2[i+5];
+             p1[12] = p1[13] = p2[12] = p2[13] = data2[i+6];
+             p1[14] = p1[15] = p2[14] = p2[15] = data2[i+7];
+           }
+         } else {
+           i = 0;
+           for (y3 = 0, y4 = 0; y3 < 8; ++y3, y4 += vSub) {
+             for (x3 = 0, x4 = 0; x3 < 8; ++x3, x4 += hSub) {
+               for (y5 = 0; y5 < vSub; ++y5)
+                 for (x5 = 0; x5 < hSub; ++x5)
+                   rowBuf[cc][y2+y4+y5][x1+x2+x4+x5] = data2[i];
+               ++i;
+             }
+           }
+         }
+       }
+      }
+    }
+    --restartCtr;
+
+    // color space conversion
+    if (colorXform) {
+      // convert YCbCr to RGB
+      if (numComps == 3) {
+       for (y2 = 0; y2 < mcuHeight; ++y2) {
+         for (x2 = 0; x2 < mcuWidth; ++x2) {
+           pY = rowBuf[0][y2][x1+x2];
+           pCb = rowBuf[1][y2][x1+x2] - 128;
+           pCr = rowBuf[2][y2][x1+x2] - 128;
+           pR = ((pY << 16) + dctCrToR * pCr + 32768) >> 16;
+           rowBuf[0][y2][x1+x2] = dctClip[dctClipOffset + pR];
+           pG = ((pY << 16) + dctCbToG * pCb + dctCrToG * pCr + 32768) >> 16;
+           rowBuf[1][y2][x1+x2] = dctClip[dctClipOffset + pG];
+           pB = ((pY << 16) + dctCbToB * pCb + 32768) >> 16;
+           rowBuf[2][y2][x1+x2] = dctClip[dctClipOffset + pB];
+         }
+       }
+      // convert YCbCrK to CMYK (K is passed through unchanged)
+      } else if (numComps == 4) {
+       for (y2 = 0; y2 < mcuHeight; ++y2) {
+         for (x2 = 0; x2 < mcuWidth; ++x2) {
+           pY = rowBuf[0][y2][x1+x2];
+           pCb = rowBuf[1][y2][x1+x2] - 128;
+           pCr = rowBuf[2][y2][x1+x2] - 128;
+           pR = ((pY << 16) + dctCrToR * pCr + 32768) >> 16;
+           rowBuf[0][y2][x1+x2] = 255 - dctClip[dctClipOffset + pR];
+           pG = ((pY << 16) + dctCbToG * pCb + dctCrToG * pCr + 32768) >> 16;
+           rowBuf[1][y2][x1+x2] = 255 - dctClip[dctClipOffset + pG];
+           pB = ((pY << 16) + dctCbToB * pCb + 32768) >> 16;
+           rowBuf[2][y2][x1+x2] = 255 - dctClip[dctClipOffset + pB];
+         }
+       }
+      }
+    }
+  }
+  return gTrue;
+}
+
+// Read one scan from a progressive or non-interleaved JPEG stream.
+void DCTStream::readScan() {
+  int data[64];
+  int x1, y1, dx1, dy1, x2, y2, y3, cc, i;
+  int h, v, horiz, vert, vSub;
+  int *p1;
+  int c;
+
+  if (scanInfo.numComps == 1) {
+    for (cc = 0; cc < numComps; ++cc) {
+      if (scanInfo.comp[cc]) {
+       break;
+      }
+    }
+    dx1 = mcuWidth / compInfo[cc].hSample;
+    dy1 = mcuHeight / compInfo[cc].vSample;
+  } else {
+    dx1 = mcuWidth;
+    dy1 = mcuHeight;
+  }
+
+  for (y1 = 0; y1 < height; y1 += dy1) {
+    for (x1 = 0; x1 < width; x1 += dx1) {
+
+      // deal with restart marker
+      if (restartInterval > 0 && restartCtr == 0) {
+       c = readMarker();
+       if (c != restartMarker) {
+         error(errSyntaxError, getPos(),
+               "Bad DCT data: incorrect restart marker");
+         return;
+       }
+       if (++restartMarker == 0xd8) {
+         restartMarker = 0xd0;
+       }
+       restart();
+      }
+
+      // read one MCU
+      for (cc = 0; cc < numComps; ++cc) {
+       if (!scanInfo.comp[cc]) {
+         continue;
+       }
+
+       h = compInfo[cc].hSample;
+       v = compInfo[cc].vSample;
+       horiz = mcuWidth / h;
+       vert = mcuHeight / v;
+       vSub = vert / 8;
+       for (y2 = 0; y2 < dy1; y2 += vert) {
+         for (x2 = 0; x2 < dx1; x2 += horiz) {
+
+           // pull out the current values
+           p1 = &frameBuf[cc][(y1+y2) * bufWidth + (x1+x2)];
+           for (y3 = 0, i = 0; y3 < 8; ++y3, i += 8) {
+             data[i] = p1[0];
+             data[i+1] = p1[1];
+             data[i+2] = p1[2];
+             data[i+3] = p1[3];
+             data[i+4] = p1[4];
+             data[i+5] = p1[5];
+             data[i+6] = p1[6];
+             data[i+7] = p1[7];
+             p1 += bufWidth * vSub;
+           }
+
+           // read one data unit
+           if (progressive) {
+             if (!readProgressiveDataUnit(
+                      &dcHuffTables[scanInfo.dcHuffTable[cc]],
+                      &acHuffTables[scanInfo.acHuffTable[cc]],
+                      &compInfo[cc].prevDC,
+                      data)) {
+               return;
+             }
+           } else {
+             if (!readDataUnit(&dcHuffTables[scanInfo.dcHuffTable[cc]],
+                               &acHuffTables[scanInfo.acHuffTable[cc]],
+                               &compInfo[cc].prevDC,
+                               data)) {
+               return;
+             }
+           }
+
+           // add the data unit into frameBuf
+           p1 = &frameBuf[cc][(y1+y2) * bufWidth + (x1+x2)];
+           for (y3 = 0, i = 0; y3 < 8; ++y3, i += 8) {
+             p1[0] = data[i];
+             p1[1] = data[i+1];
+             p1[2] = data[i+2];
+             p1[3] = data[i+3];
+             p1[4] = data[i+4];
+             p1[5] = data[i+5];
+             p1[6] = data[i+6];
+             p1[7] = data[i+7];
+             p1 += bufWidth * vSub;
+           }
+         }
+       }
+      }
+      --restartCtr;
+    }
+  }
+}
+
+// Read one data unit from a sequential JPEG stream.
+GBool DCTStream::readDataUnit(DCTHuffTable *dcHuffTable,
+                             DCTHuffTable *acHuffTable,
+                             int *prevDC, int data[64]) {
+  int run, size, amp;
+  int c;
+  int i, j;
+
+  if ((size = readHuffSym(dcHuffTable)) == 9999) {
+    return gFalse;
+  }
+  if (size > 0) {
+    if ((amp = readAmp(size)) == 9999) {
+      return gFalse;
+    }
+  } else {
+    amp = 0;
+  }
+  data[0] = *prevDC += amp;
+  for (i = 1; i < 64; ++i) {
+    data[i] = 0;
+  }
+  i = 1;
+  while (i < 64) {
+    run = 0;
+    while ((c = readHuffSym(acHuffTable)) == 0xf0 && run < 0x30) {
+      run += 0x10;
+    }
+    if (c == 9999) {
+      return gFalse;
+    }
+    if (c == 0x00) {
+      break;
+    } else {
+      run += (c >> 4) & 0x0f;
+      size = c & 0x0f;
+      amp = readAmp(size);
+      if (amp == 9999) {
+       return gFalse;
+      }
+      i += run;
+      if (i < 64) {
+       j = dctZigZag[i++];
+       data[j] = amp;
+      }
+    }
+  }
+  return gTrue;
+}
+
+// Read one data unit from a sequential JPEG stream.
+GBool DCTStream::readProgressiveDataUnit(DCTHuffTable *dcHuffTable,
+                                        DCTHuffTable *acHuffTable,
+                                        int *prevDC, int data[64]) {
+  int run, size, amp, bit, c;
+  int i, j, k;
+
+  // get the DC coefficient
+  i = scanInfo.firstCoeff;
+  if (i == 0) {
+    if (scanInfo.ah == 0) {
+      if ((size = readHuffSym(dcHuffTable)) == 9999) {
+       return gFalse;
+      }
+      if (size > 0) {
+       if ((amp = readAmp(size)) == 9999) {
+         return gFalse;
+       }
+      } else {
+       amp = 0;
+      }
+      data[0] += (*prevDC += amp) << scanInfo.al;
+    } else {
+      if ((bit = readBit()) == 9999) {
+       return gFalse;
+      }
+      data[0] += bit << scanInfo.al;
+    }
+    ++i;
+  }
+  if (scanInfo.lastCoeff == 0) {
+    return gTrue;
+  }
+
+  // check for an EOB run
+  if (eobRun > 0) {
+    while (i <= scanInfo.lastCoeff) {
+      j = dctZigZag[i++];
+      if (data[j] != 0) {
+       if ((bit = readBit()) == EOF) {
+         return gFalse;
+       }
+       if (bit) {
+         data[j] += 1 << scanInfo.al;
+       }
+      }
+    }
+    --eobRun;
+    return gTrue;
+  }
+
+  // read the AC coefficients
+  while (i <= scanInfo.lastCoeff) {
+    if ((c = readHuffSym(acHuffTable)) == 9999) {
+      return gFalse;
+    }
+
+    // ZRL
+    if (c == 0xf0) {
+      k = 0;
+      while (k < 16 && i <= scanInfo.lastCoeff) {
+       j = dctZigZag[i++];
+       if (data[j] == 0) {
+         ++k;
+       } else {
+         if ((bit = readBit()) == EOF) {
+           return gFalse;
+         }
+         if (bit) {
+           data[j] += 1 << scanInfo.al;
+         }
+       }
+      }
+
+    // EOB run
+    } else if ((c & 0x0f) == 0x00) {
+      j = c >> 4;
+      eobRun = 0;
+      for (k = 0; k < j; ++k) {
+       if ((bit = readBit()) == EOF) {
+         return gFalse;
+       }
+       eobRun = (eobRun << 1) | bit;
+      }
+      eobRun += 1 << j;
+      while (i <= scanInfo.lastCoeff) {
+       j = dctZigZag[i++];
+       if (data[j] != 0) {
+         if ((bit = readBit()) == EOF) {
+           return gFalse;
+         }
+         if (bit) {
+           data[j] += 1 << scanInfo.al;
+         }
+       }
+      }
+      --eobRun;
+      break;
+
+    // zero run and one AC coefficient
+    } else {
+      run = (c >> 4) & 0x0f;
+      size = c & 0x0f;
+      if ((amp = readAmp(size)) == 9999) {
+       return gFalse;
+      }
+      j = 0; // make gcc happy
+      for (k = 0; k <= run && i <= scanInfo.lastCoeff; ++k) {
+       j = dctZigZag[i++];
+       while (data[j] != 0 && i <= scanInfo.lastCoeff) {
+         if ((bit = readBit()) == EOF) {
+           return gFalse;
+         }
+         if (bit) {
+           data[j] += 1 << scanInfo.al;
+         }
+         j = dctZigZag[i++];
+       }
+      }
+      data[j] = amp << scanInfo.al;
+    }
+  }
+
+  return gTrue;
+}
+
+// Decode a progressive JPEG image.
+void DCTStream::decodeImage() {
+  int dataIn[64];
+  Guchar dataOut[64];
+  Gushort *quantTable;
+  int pY, pCb, pCr, pR, pG, pB;
+  int x1, y1, x2, y2, x3, y3, x4, y4, x5, y5, cc, i;
+  int h, v, horiz, vert, hSub, vSub;
+  int *p0, *p1, *p2;
+
+  for (y1 = 0; y1 < bufHeight; y1 += mcuHeight) {
+    for (x1 = 0; x1 < bufWidth; x1 += mcuWidth) {
+      for (cc = 0; cc < numComps; ++cc) {
+       quantTable = quantTables[compInfo[cc].quantTable];
+       h = compInfo[cc].hSample;
+       v = compInfo[cc].vSample;
+       horiz = mcuWidth / h;
+       vert = mcuHeight / v;
+       hSub = horiz / 8;
+       vSub = vert / 8;
+       for (y2 = 0; y2 < mcuHeight; y2 += vert) {
+         for (x2 = 0; x2 < mcuWidth; x2 += horiz) {
+
+           // pull out the coded data unit
+           p1 = &frameBuf[cc][(y1+y2) * bufWidth + (x1+x2)];
+           for (y3 = 0, i = 0; y3 < 8; ++y3, i += 8) {
+             dataIn[i]   = p1[0];
+             dataIn[i+1] = p1[1];
+             dataIn[i+2] = p1[2];
+             dataIn[i+3] = p1[3];
+             dataIn[i+4] = p1[4];
+             dataIn[i+5] = p1[5];
+             dataIn[i+6] = p1[6];
+             dataIn[i+7] = p1[7];
+             p1 += bufWidth * vSub;
+           }
+
+           // transform
+           transformDataUnit(quantTable, dataIn, dataOut);
+
+           // store back into frameBuf, doing replication for
+           // subsampled components
+           p1 = &frameBuf[cc][(y1+y2) * bufWidth + (x1+x2)];
+           if (hSub == 1 && vSub == 1) {
+             for (y3 = 0, i = 0; y3 < 8; ++y3, i += 8) {
+               p1[0] = dataOut[i] & 0xff;
+               p1[1] = dataOut[i+1] & 0xff;
+               p1[2] = dataOut[i+2] & 0xff;
+               p1[3] = dataOut[i+3] & 0xff;
+               p1[4] = dataOut[i+4] & 0xff;
+               p1[5] = dataOut[i+5] & 0xff;
+               p1[6] = dataOut[i+6] & 0xff;
+               p1[7] = dataOut[i+7] & 0xff;
+               p1 += bufWidth;
+             }
+           } else if (hSub == 2 && vSub == 2) {
+             p2 = p1 + bufWidth;
+             for (y3 = 0, i = 0; y3 < 16; y3 += 2, i += 8) {
+               p1[0] = p1[1] = p2[0] = p2[1] = dataOut[i] & 0xff;
+               p1[2] = p1[3] = p2[2] = p2[3] = dataOut[i+1] & 0xff;
+               p1[4] = p1[5] = p2[4] = p2[5] = dataOut[i+2] & 0xff;
+               p1[6] = p1[7] = p2[6] = p2[7] = dataOut[i+3] & 0xff;
+               p1[8] = p1[9] = p2[8] = p2[9] = dataOut[i+4] & 0xff;
+               p1[10] = p1[11] = p2[10] = p2[11] = dataOut[i+5] & 0xff;
+               p1[12] = p1[13] = p2[12] = p2[13] = dataOut[i+6] & 0xff;
+               p1[14] = p1[15] = p2[14] = p2[15] = dataOut[i+7] & 0xff;
+               p1 += bufWidth * 2;
+               p2 += bufWidth * 2;
+             }
+           } else {
+             i = 0;
+             for (y3 = 0, y4 = 0; y3 < 8; ++y3, y4 += vSub) {
+               for (x3 = 0, x4 = 0; x3 < 8; ++x3, x4 += hSub) {
+                 p2 = p1 + x4;
+                 for (y5 = 0; y5 < vSub; ++y5) {
+                   for (x5 = 0; x5 < hSub; ++x5) {
+                     p2[x5] = dataOut[i] & 0xff;
+                   }
+                   p2 += bufWidth;
+                 }
+                 ++i;
+               }
+               p1 += bufWidth * vSub;
+             }
+           }
+         }
+       }
+      }
+
+      // color space conversion
+      if (colorXform) {
+       // convert YCbCr to RGB
+       if (numComps == 3) {
+         for (y2 = 0; y2 < mcuHeight; ++y2) {
+           p0 = &frameBuf[0][(y1+y2) * bufWidth + x1];
+           p1 = &frameBuf[1][(y1+y2) * bufWidth + x1];
+           p2 = &frameBuf[2][(y1+y2) * bufWidth + x1];
+           for (x2 = 0; x2 < mcuWidth; ++x2) {
+             pY = *p0;
+             pCb = *p1 - 128;
+             pCr = *p2 - 128;
+             pR = ((pY << 16) + dctCrToR * pCr + 32768) >> 16;
+             *p0++ = dctClip[dctClipOffset + pR];
+             pG = ((pY << 16) + dctCbToG * pCb + dctCrToG * pCr +
+                   32768) >> 16;
+             *p1++ = dctClip[dctClipOffset + pG];
+             pB = ((pY << 16) + dctCbToB * pCb + 32768) >> 16;
+             *p2++ = dctClip[dctClipOffset + pB];
+           }
+         }
+       // convert YCbCrK to CMYK (K is passed through unchanged)
+       } else if (numComps == 4) {
+         for (y2 = 0; y2 < mcuHeight; ++y2) {
+           p0 = &frameBuf[0][(y1+y2) * bufWidth + x1];
+           p1 = &frameBuf[1][(y1+y2) * bufWidth + x1];
+           p2 = &frameBuf[2][(y1+y2) * bufWidth + x1];
+           for (x2 = 0; x2 < mcuWidth; ++x2) {
+             pY = *p0;
+             pCb = *p1 - 128;
+             pCr = *p2 - 128;
+             pR = ((pY << 16) + dctCrToR * pCr + 32768) >> 16;
+             *p0++ = 255 - dctClip[dctClipOffset + pR];
+             pG = ((pY << 16) + dctCbToG * pCb + dctCrToG * pCr +
+                   32768) >> 16;
+             *p1++ = 255 - dctClip[dctClipOffset + pG];
+             pB = ((pY << 16) + dctCbToB * pCb + 32768) >> 16;
+             *p2++ = 255 - dctClip[dctClipOffset + pB];
+           }
+         }
+       }
+      }
+    }
+  }
+}
+
+// Transform one data unit -- this performs the dequantization and
+// IDCT steps.  This IDCT algorithm is taken from:
+//   Christoph Loeffler, Adriaan Ligtenberg, George S. Moschytz,
+//   "Practical Fast 1-D DCT Algorithms with 11 Multiplications",
+//   IEEE Intl. Conf. on Acoustics, Speech & Signal Processing, 1989,
+//   988-991.
+// The stage numbers mentioned in the comments refer to Figure 1 in this
+// paper.
+void DCTStream::transformDataUnit(Gushort *quantTable,
+                                 int dataIn[64], Guchar dataOut[64]) {
+  int v0, v1, v2, v3, v4, v5, v6, v7, t;
+  int *p;
+  int i;
+
+  // dequant
+  for (i = 0; i < 64; ++i) {
+    dataIn[i] *= quantTable[i];
+  }
+
+  // inverse DCT on rows
+  for (i = 0; i < 64; i += 8) {
+    p = dataIn + i;
+
+    // check for all-zero AC coefficients
+    if (p[1] == 0 && p[2] == 0 && p[3] == 0 &&
+       p[4] == 0 && p[5] == 0 && p[6] == 0 && p[7] == 0) {
+      t = (dctSqrt2 * p[0] + 512) >> 10;
+      p[0] = t;
+      p[1] = t;
+      p[2] = t;
+      p[3] = t;
+      p[4] = t;
+      p[5] = t;
+      p[6] = t;
+      p[7] = t;
+      continue;
+    }
+
+    // stage 4
+    v0 = (dctSqrt2 * p[0] + 128) >> 8;
+    v1 = (dctSqrt2 * p[4] + 128) >> 8;
+    v2 = p[2];
+    v3 = p[6];
+    v4 = (dctSqrt1d2 * (p[1] - p[7]) + 128) >> 8;
+    v7 = (dctSqrt1d2 * (p[1] + p[7]) + 128) >> 8;
+    v5 = p[3] << 4;
+    v6 = p[5] << 4;
+
+    // stage 3
+    t = (v0 - v1+ 1) >> 1;
+    v0 = (v0 + v1 + 1) >> 1;
+    v1 = t;
+    t = (v2 * dctSin6 + v3 * dctCos6 + 128) >> 8;
+    v2 = (v2 * dctCos6 - v3 * dctSin6 + 128) >> 8;
+    v3 = t;
+    t = (v4 - v6 + 1) >> 1;
+    v4 = (v4 + v6 + 1) >> 1;
+    v6 = t;
+    t = (v7 + v5 + 1) >> 1;
+    v5 = (v7 - v5 + 1) >> 1;
+    v7 = t;
+
+    // stage 2
+    t = (v0 - v3 + 1) >> 1;
+    v0 = (v0 + v3 + 1) >> 1;
+    v3 = t;
+    t = (v1 - v2 + 1) >> 1;
+    v1 = (v1 + v2 + 1) >> 1;
+    v2 = t;
+    t = (v4 * dctSin3 + v7 * dctCos3 + 2048) >> 12;
+    v4 = (v4 * dctCos3 - v7 * dctSin3 + 2048) >> 12;
+    v7 = t;
+    t = (v5 * dctSin1 + v6 * dctCos1 + 2048) >> 12;
+    v5 = (v5 * dctCos1 - v6 * dctSin1 + 2048) >> 12;
+    v6 = t;
+
+    // stage 1
+    p[0] = v0 + v7;
+    p[7] = v0 - v7;
+    p[1] = v1 + v6;
+    p[6] = v1 - v6;
+    p[2] = v2 + v5;
+    p[5] = v2 - v5;
+    p[3] = v3 + v4;
+    p[4] = v3 - v4;
+  }
+
+  // inverse DCT on columns
+  for (i = 0; i < 8; ++i) {
+    p = dataIn + i;
+
+    // check for all-zero AC coefficients
+    if (p[1*8] == 0 && p[2*8] == 0 && p[3*8] == 0 &&
+       p[4*8] == 0 && p[5*8] == 0 && p[6*8] == 0 && p[7*8] == 0) {
+      t = (dctSqrt2 * dataIn[i+0] + 8192) >> 14;
+      p[0*8] = t;
+      p[1*8] = t;
+      p[2*8] = t;
+      p[3*8] = t;
+      p[4*8] = t;
+      p[5*8] = t;
+      p[6*8] = t;
+      p[7*8] = t;
+      continue;
+    }
+
+    // stage 4
+    v0 = (dctSqrt2 * p[0*8] + 2048) >> 12;
+    v1 = (dctSqrt2 * p[4*8] + 2048) >> 12;
+    v2 = p[2*8];
+    v3 = p[6*8];
+    v4 = (dctSqrt1d2 * (p[1*8] - p[7*8]) + 2048) >> 12;
+    v7 = (dctSqrt1d2 * (p[1*8] + p[7*8]) + 2048) >> 12;
+    v5 = p[3*8];
+    v6 = p[5*8];
+
+    // stage 3
+    t = (v0 - v1 + 1) >> 1;
+    v0 = (v0 + v1 + 1) >> 1;
+    v1 = t;
+    t = (v2 * dctSin6 + v3 * dctCos6 + 2048) >> 12;
+    v2 = (v2 * dctCos6 - v3 * dctSin6 + 2048) >> 12;
+    v3 = t;
+    t = (v4 - v6 + 1) >> 1;
+    v4 = (v4 + v6 + 1) >> 1;
+    v6 = t;
+    t = (v7 + v5 + 1) >> 1;
+    v5 = (v7 - v5 + 1) >> 1;
+    v7 = t;
+
+    // stage 2
+    t = (v0 - v3 + 1) >> 1;
+    v0 = (v0 + v3 + 1) >> 1;
+    v3 = t;
+    t = (v1 - v2 + 1) >> 1;
+    v1 = (v1 + v2 + 1) >> 1;
+    v2 = t;
+    t = (v4 * dctSin3 + v7 * dctCos3 + 2048) >> 12;
+    v4 = (v4 * dctCos3 - v7 * dctSin3 + 2048) >> 12;
+    v7 = t;
+    t = (v5 * dctSin1 + v6 * dctCos1 + 2048) >> 12;
+    v5 = (v5 * dctCos1 - v6 * dctSin1 + 2048) >> 12;
+    v6 = t;
+
+    // stage 1
+    p[0*8] = v0 + v7;
+    p[7*8] = v0 - v7;
+    p[1*8] = v1 + v6;
+    p[6*8] = v1 - v6;
+    p[2*8] = v2 + v5;
+    p[5*8] = v2 - v5;
+    p[3*8] = v3 + v4;
+    p[4*8] = v3 - v4;
+  }
+
+  // convert to 8-bit integers
+  for (i = 0; i < 64; ++i) {
+    dataOut[i] = dctClip[dctClipOffset + 128 + ((dataIn[i] + 8) >> 4)];
+  }
+}
+
+int DCTStream::readHuffSym(DCTHuffTable *table) {
+  Gushort code;
+  int bit;
+  int codeBits;
+
+  code = 0;
+  codeBits = 0;
+  do {
+    // add a bit to the code
+    if ((bit = readBit()) == EOF) {
+      return 9999;
+    }
+    code = (code << 1) + bit;
+    ++codeBits;
+
+    // look up code
+    if (code < table->firstCode[codeBits]) {
+      break;
+    }
+    if (code - table->firstCode[codeBits] < table->numCodes[codeBits]) {
+      code -= table->firstCode[codeBits];
+      return table->sym[table->firstSym[codeBits] + code];
+    }
+  } while (codeBits < 16);
+
+  error(errSyntaxError, getPos(), "Bad Huffman code in DCT stream");
+  return 9999;
+}
+
+int DCTStream::readAmp(int size) {
+  int amp, bit;
+  int bits;
+
+  amp = 0;
+  for (bits = 0; bits < size; ++bits) {
+    if ((bit = readBit()) == EOF)
+      return 9999;
+    amp = (amp << 1) + bit;
+  }
+  if (amp < (1 << (size - 1)))
+    amp -= (1 << size) - 1;
+  return amp;
+}
+
+int DCTStream::readBit() {
+  int bit;
+  int c, c2;
+
+  if (inputBits == 0) {
+    if ((c = str->getChar()) == EOF)
+      return EOF;
+    if (c == 0xff) {
+      do {
+       c2 = str->getChar();
+      } while (c2 == 0xff);
+      if (c2 != 0x00) {
+       error(errSyntaxError, getPos(), "Bad DCT data: missing 00 after ff");
+       return EOF;
+      }
+    }
+    inputBuf = c;
+    inputBits = 8;
+  }
+  bit = (inputBuf >> (inputBits - 1)) & 1;
+  --inputBits;
+  return bit;
+}
+
+GBool DCTStream::readHeader() {
+  GBool doScan;
+  int n;
+  int c = 0;
+  int i;
+
+  // read headers
+  doScan = gFalse;
+  while (!doScan) {
+    c = readMarker();
+    switch (c) {
+    case 0xc0:                 // SOF0 (sequential)
+    case 0xc1:                 // SOF1 (extended sequential)
+      if (!readBaselineSOF()) {
+       return gFalse;
+      }
+      break;
+    case 0xc2:                 // SOF2 (progressive)
+      if (!readProgressiveSOF()) {
+       return gFalse;
+      }
+      break;
+    case 0xc4:                 // DHT
+      if (!readHuffmanTables()) {
+       return gFalse;
+      }
+      break;
+    case 0xd8:                 // SOI
+      break;
+    case 0xd9:                 // EOI
+      return gFalse;
+    case 0xda:                 // SOS
+      if (!readScanInfo()) {
+       return gFalse;
+      }
+      doScan = gTrue;
+      break;
+    case 0xdb:                 // DQT
+      if (!readQuantTables()) {
+       return gFalse;
+      }
+      break;
+    case 0xdd:                 // DRI
+      if (!readRestartInterval()) {
+       return gFalse;
+      }
+      break;
+    case 0xe0:                 // APP0
+      if (!readJFIFMarker()) {
+       return gFalse;
+      }
+      break;
+    case 0xee:                 // APP14
+      if (!readAdobeMarker()) {
+       return gFalse;
+      }
+      break;
+    case EOF:
+      error(errSyntaxError, getPos(), "Bad DCT header");
+      return gFalse;
+    default:
+      // skip APPn / COM / etc.
+      if (c >= 0xe0) {
+       n = read16() - 2;
+       for (i = 0; i < n; ++i) {
+         str->getChar();
+       }
+      } else {
+       error(errSyntaxError, getPos(), "Unknown DCT marker <{0:02x}>", c);
+       return gFalse;
+      }
+      break;
+    }
+  }
+
+  return gTrue;
+}
+
+GBool DCTStream::readBaselineSOF() {
+  int length;
+  int prec;
+  int i;
+  int c;
+
+  length = read16();
+  prec = str->getChar();
+  height = read16();
+  width = read16();
+  numComps = str->getChar();
+  if (numComps <= 0 || numComps > 4) {
+    error(errSyntaxError, getPos(), "Bad number of components in DCT stream");
+    numComps = 0;
+    return gFalse;
+  }
+  if (prec != 8) {
+    error(errSyntaxError, getPos(), "Bad DCT precision {0:d}", prec);
+    return gFalse;
+  }
+  for (i = 0; i < numComps; ++i) {
+    compInfo[i].id = str->getChar();
+    c = str->getChar();
+    compInfo[i].hSample = (c >> 4) & 0x0f;
+    compInfo[i].vSample = c & 0x0f;
+    compInfo[i].quantTable = str->getChar();
+    if (compInfo[i].hSample < 1 || compInfo[i].hSample > 4 ||
+       compInfo[i].vSample < 1 || compInfo[i].vSample > 4) {
+      error(errSyntaxError, getPos(), "Bad DCT sampling factor");
+      return gFalse;
+    }
+    if (compInfo[i].quantTable < 0 || compInfo[i].quantTable > 3) {
+      error(errSyntaxError, getPos(), "Bad DCT quant table selector");
+      return gFalse;
+    }
+  }
+  progressive = gFalse;
+  return gTrue;
+}
+
+GBool DCTStream::readProgressiveSOF() {
+  int length;
+  int prec;
+  int i;
+  int c;
+
+  length = read16();
+  prec = str->getChar();
+  height = read16();
+  width = read16();
+  numComps = str->getChar();
+  if (prec != 8) {
+    error(errSyntaxError, getPos(), "Bad DCT precision {0:d}", prec);
+    return gFalse;
+  }
+  for (i = 0; i < numComps; ++i) {
+    compInfo[i].id = str->getChar();
+    c = str->getChar();
+    compInfo[i].hSample = (c >> 4) & 0x0f;
+    compInfo[i].vSample = c & 0x0f;
+    compInfo[i].quantTable = str->getChar();
+    if (compInfo[i].hSample < 1 || compInfo[i].hSample > 4 ||
+       compInfo[i].vSample < 1 || compInfo[i].vSample > 4) {
+      error(errSyntaxError, getPos(), "Bad DCT sampling factor");
+      return gFalse;
+    }
+    if (compInfo[i].quantTable < 0 || compInfo[i].quantTable > 3) {
+      error(errSyntaxError, getPos(), "Bad DCT quant table selector");
+      return gFalse;
+    }
+  }
+  progressive = gTrue;
+  return gTrue;
+}
+
+GBool DCTStream::readScanInfo() {
+  int length;
+  int id, c;
+  int i, j;
+
+  length = read16() - 2;
+  scanInfo.numComps = str->getChar();
+  if (scanInfo.numComps <= 0 || scanInfo.numComps > 4) {
+    error(errSyntaxError, getPos(), "Bad number of components in DCT stream");
+    scanInfo.numComps = 0;
+    return gFalse;
+  }
+  --length;
+  if (length != 2 * scanInfo.numComps + 3) {
+    error(errSyntaxError, getPos(), "Bad DCT scan info block");
+    return gFalse;
+  }
+  interleaved = scanInfo.numComps == numComps;
+  for (j = 0; j < numComps; ++j) {
+    scanInfo.comp[j] = gFalse;
+    scanInfo.dcHuffTable[j] = 0;
+    scanInfo.acHuffTable[j] = 0;
+  }
+  for (i = 0; i < scanInfo.numComps; ++i) {
+    id = str->getChar();
+    // some (broken) DCT streams reuse ID numbers, but at least they
+    // keep the components in order, so we check compInfo[i] first to
+    // work around the problem
+    if (id == compInfo[i].id) {
+      j = i;
+    } else {
+      for (j = 0; j < numComps; ++j) {
+       if (id == compInfo[j].id) {
+         break;
+       }
+      }
+      if (j == numComps) {
+       error(errSyntaxError, getPos(),
+             "Bad DCT component ID in scan info block");
+       return gFalse;
+      }
+    }
+    scanInfo.comp[j] = gTrue;
+    c = str->getChar();
+    scanInfo.dcHuffTable[j] = (c >> 4) & 0x0f;
+    scanInfo.acHuffTable[j] = c & 0x0f;
+  }
+  scanInfo.firstCoeff = str->getChar();
+  scanInfo.lastCoeff = str->getChar();
+  if (scanInfo.firstCoeff < 0 || scanInfo.lastCoeff > 63 ||
+      scanInfo.firstCoeff > scanInfo.lastCoeff) {
+    error(errSyntaxError, getPos(),
+         "Bad DCT coefficient numbers in scan info block");
+    return gFalse;
+  }
+  c = str->getChar();
+  scanInfo.ah = (c >> 4) & 0x0f;
+  scanInfo.al = c & 0x0f;
+  return gTrue;
+}
+
+GBool DCTStream::readQuantTables() {
+  int length, prec, i, index;
+
+  length = read16() - 2;
+  while (length > 0) {
+    index = str->getChar();
+    prec = (index >> 4) & 0x0f;
+    index &= 0x0f;
+    if (prec > 1 || index >= 4) {
+      error(errSyntaxError, getPos(), "Bad DCT quantization table");
+      return gFalse;
+    }
+    if (index == numQuantTables) {
+      numQuantTables = index + 1;
+    }
+    for (i = 0; i < 64; ++i) {
+      if (prec) {
+       quantTables[index][dctZigZag[i]] = read16();
+      } else {
+       quantTables[index][dctZigZag[i]] = str->getChar();
+      }
+    }
+    if (prec) {
+      length -= 129;
+    } else {
+      length -= 65;
+    }
+  }
+  return gTrue;
+}
+
+GBool DCTStream::readHuffmanTables() {
+  DCTHuffTable *tbl;
+  int length;
+  int index;
+  Gushort code;
+  Guchar sym;
+  int i;
+  int c;
+
+  length = read16() - 2;
+  while (length > 0) {
+    index = str->getChar();
+    --length;
+    if ((index & 0x0f) >= 4) {
+      error(errSyntaxError, getPos(), "Bad DCT Huffman table");
+      return gFalse;
+    }
+    if (index & 0x10) {
+      index &= 0x0f;
+      if (index >= numACHuffTables)
+       numACHuffTables = index+1;
+      tbl = &acHuffTables[index];
+    } else {
+      index &= 0x0f;
+      if (index >= numDCHuffTables)
+       numDCHuffTables = index+1;
+      tbl = &dcHuffTables[index];
+    }
+    sym = 0;
+    code = 0;
+    for (i = 1; i <= 16; ++i) {
+      c = str->getChar();
+      tbl->firstSym[i] = sym;
+      tbl->firstCode[i] = code;
+      tbl->numCodes[i] = c;
+      sym += c;
+      code = (code + c) << 1;
+    }
+    length -= 16;
+    for (i = 0; i < sym; ++i)
+      tbl->sym[i] = str->getChar();
+    length -= sym;
+  }
+  return gTrue;
+}
+
+GBool DCTStream::readRestartInterval() {
+  int length;
+
+  length = read16();
+  if (length != 4) {
+    error(errSyntaxError, getPos(), "Bad DCT restart interval");
+    return gFalse;
+  }
+  restartInterval = read16();
+  return gTrue;
+}
+
+GBool DCTStream::readJFIFMarker() {
+  int length, i;
+  char buf[5];
+  int c;
+
+  length = read16();
+  length -= 2;
+  if (length >= 5) {
+    for (i = 0; i < 5; ++i) {
+      if ((c = str->getChar()) == EOF) {
+       error(errSyntaxError, getPos(), "Bad DCT APP0 marker");
+       return gFalse;
+      }
+      buf[i] = c;
+    }
+    length -= 5;
+    if (!memcmp(buf, "JFIF\0", 5)) {
+      gotJFIFMarker = gTrue;
+    }
+  }
+  while (length > 0) {
+    if (str->getChar() == EOF) {
+      error(errSyntaxError, getPos(), "Bad DCT APP0 marker");
+      return gFalse;
+    }
+    --length;
+  }
+  return gTrue;
+}
+
+GBool DCTStream::readAdobeMarker() {
+  int length, i;
+  char buf[12];
+  int c;
+
+  length = read16();
+  if (length < 14) {
+    goto err;
+  }
+  for (i = 0; i < 12; ++i) {
+    if ((c = str->getChar()) == EOF) {
+      goto err;
+    }
+    buf[i] = c;
+  }
+  if (strncmp(buf, "Adobe", 5)) {
+    goto err;
+  }
+  colorXform = buf[11];
+  gotAdobeMarker = gTrue;
+  for (i = 14; i < length; ++i) {
+    if (str->getChar() == EOF) {
+      goto err;
+    }
+  }
+  return gTrue;
+
+ err:
+  error(errSyntaxError, getPos(), "Bad DCT Adobe APP14 marker");
+  return gFalse;
+}
+
+GBool DCTStream::readTrailer() {
+  int c;
+
+  c = readMarker();
+  if (c != 0xd9) {             // EOI
+    error(errSyntaxError, getPos(), "Bad DCT trailer");
+    return gFalse;
+  }
+  return gTrue;
+}
+
+int DCTStream::readMarker() {
+  int c;
+
+  do {
+    do {
+      c = str->getChar();
+    } while (c != 0xff && c != EOF);
+    while (c == 0xff) {
+      c = str->getChar();
+    }
+  } while (c == 0x00);
+  return c;
+}
+
+int DCTStream::read16() {
+  int c1, c2;
+
+  if ((c1 = str->getChar()) == EOF)
+    return EOF;
+  if ((c2 = str->getChar()) == EOF)
+    return EOF;
+  return (c1 << 8) + c2;
+}
+
+GooString *DCTStream::getPSFilter(int psLevel, const char *indent) {
+  GooString *s;
+
+  if (psLevel < 2) {
+    return NULL;
+  }
+  if (!(s = str->getPSFilter(psLevel, indent))) {
+    return NULL;
+  }
+  s->append(indent)->append("<< >> /DCTDecode filter\n");
+  return s;
+}
+
+GBool DCTStream::isBinary(GBool last) {
+  return str->isBinary(gTrue);
+}
+
+#endif
+
+#ifndef ENABLE_ZLIB
+//------------------------------------------------------------------------
+// FlateStream
+//------------------------------------------------------------------------
+
+int FlateStream::codeLenCodeMap[flateMaxCodeLenCodes] = {
+  16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15
+};
+
+FlateDecode FlateStream::lengthDecode[flateMaxLitCodes-257] = {
+  {0,   3},
+  {0,   4},
+  {0,   5},
+  {0,   6},
+  {0,   7},
+  {0,   8},
+  {0,   9},
+  {0,  10},
+  {1,  11},
+  {1,  13},
+  {1,  15},
+  {1,  17},
+  {2,  19},
+  {2,  23},
+  {2,  27},
+  {2,  31},
+  {3,  35},
+  {3,  43},
+  {3,  51},
+  {3,  59},
+  {4,  67},
+  {4,  83},
+  {4,  99},
+  {4, 115},
+  {5, 131},
+  {5, 163},
+  {5, 195},
+  {5, 227},
+  {0, 258},
+  {0, 258},
+  {0, 258}
+};
+
+FlateDecode FlateStream::distDecode[flateMaxDistCodes] = {
+  { 0,     1},
+  { 0,     2},
+  { 0,     3},
+  { 0,     4},
+  { 1,     5},
+  { 1,     7},
+  { 2,     9},
+  { 2,    13},
+  { 3,    17},
+  { 3,    25},
+  { 4,    33},
+  { 4,    49},
+  { 5,    65},
+  { 5,    97},
+  { 6,   129},
+  { 6,   193},
+  { 7,   257},
+  { 7,   385},
+  { 8,   513},
+  { 8,   769},
+  { 9,  1025},
+  { 9,  1537},
+  {10,  2049},
+  {10,  3073},
+  {11,  4097},
+  {11,  6145},
+  {12,  8193},
+  {12, 12289},
+  {13, 16385},
+  {13, 24577}
+};
+
+static FlateCode flateFixedLitCodeTabCodes[512] = {
+  {7, 0x0100},
+  {8, 0x0050},
+  {8, 0x0010},
+  {8, 0x0118},
+  {7, 0x0110},
+  {8, 0x0070},
+  {8, 0x0030},
+  {9, 0x00c0},
+  {7, 0x0108},
+  {8, 0x0060},
+  {8, 0x0020},
+  {9, 0x00a0},
+  {8, 0x0000},
+  {8, 0x0080},
+  {8, 0x0040},
+  {9, 0x00e0},
+  {7, 0x0104},
+  {8, 0x0058},
+  {8, 0x0018},
+  {9, 0x0090},
+  {7, 0x0114},
+  {8, 0x0078},
+  {8, 0x0038},
+  {9, 0x00d0},
+  {7, 0x010c},
+  {8, 0x0068},
+  {8, 0x0028},
+  {9, 0x00b0},
+  {8, 0x0008},
+  {8, 0x0088},
+  {8, 0x0048},
+  {9, 0x00f0},
+  {7, 0x0102},
+  {8, 0x0054},
+  {8, 0x0014},
+  {8, 0x011c},
+  {7, 0x0112},
+  {8, 0x0074},
+  {8, 0x0034},
+  {9, 0x00c8},
+  {7, 0x010a},
+  {8, 0x0064},
+  {8, 0x0024},
+  {9, 0x00a8},
+  {8, 0x0004},
+  {8, 0x0084},
+  {8, 0x0044},
+  {9, 0x00e8},
+  {7, 0x0106},
+  {8, 0x005c},
+  {8, 0x001c},
+  {9, 0x0098},
+  {7, 0x0116},
+  {8, 0x007c},
+  {8, 0x003c},
+  {9, 0x00d8},
+  {7, 0x010e},
+  {8, 0x006c},
+  {8, 0x002c},
+  {9, 0x00b8},
+  {8, 0x000c},
+  {8, 0x008c},
+  {8, 0x004c},
+  {9, 0x00f8},
+  {7, 0x0101},
+  {8, 0x0052},
+  {8, 0x0012},
+  {8, 0x011a},
+  {7, 0x0111},
+  {8, 0x0072},
+  {8, 0x0032},
+  {9, 0x00c4},
+  {7, 0x0109},
+  {8, 0x0062},
+  {8, 0x0022},
+  {9, 0x00a4},
+  {8, 0x0002},
+  {8, 0x0082},
+  {8, 0x0042},
+  {9, 0x00e4},
+  {7, 0x0105},
+  {8, 0x005a},
+  {8, 0x001a},
+  {9, 0x0094},
+  {7, 0x0115},
+  {8, 0x007a},
+  {8, 0x003a},
+  {9, 0x00d4},
+  {7, 0x010d},
+  {8, 0x006a},
+  {8, 0x002a},
+  {9, 0x00b4},
+  {8, 0x000a},
+  {8, 0x008a},
+  {8, 0x004a},
+  {9, 0x00f4},
+  {7, 0x0103},
+  {8, 0x0056},
+  {8, 0x0016},
+  {8, 0x011e},
+  {7, 0x0113},
+  {8, 0x0076},
+  {8, 0x0036},
+  {9, 0x00cc},
+  {7, 0x010b},
+  {8, 0x0066},
+  {8, 0x0026},
+  {9, 0x00ac},
+  {8, 0x0006},
+  {8, 0x0086},
+  {8, 0x0046},
+  {9, 0x00ec},
+  {7, 0x0107},
+  {8, 0x005e},
+  {8, 0x001e},
+  {9, 0x009c},
+  {7, 0x0117},
+  {8, 0x007e},
+  {8, 0x003e},
+  {9, 0x00dc},
+  {7, 0x010f},
+  {8, 0x006e},
+  {8, 0x002e},
+  {9, 0x00bc},
+  {8, 0x000e},
+  {8, 0x008e},
+  {8, 0x004e},
+  {9, 0x00fc},
+  {7, 0x0100},
+  {8, 0x0051},
+  {8, 0x0011},
+  {8, 0x0119},
+  {7, 0x0110},
+  {8, 0x0071},
+  {8, 0x0031},
+  {9, 0x00c2},
+  {7, 0x0108},
+  {8, 0x0061},
+  {8, 0x0021},
+  {9, 0x00a2},
+  {8, 0x0001},
+  {8, 0x0081},
+  {8, 0x0041},
+  {9, 0x00e2},
+  {7, 0x0104},
+  {8, 0x0059},
+  {8, 0x0019},
+  {9, 0x0092},
+  {7, 0x0114},
+  {8, 0x0079},
+  {8, 0x0039},
+  {9, 0x00d2},
+  {7, 0x010c},
+  {8, 0x0069},
+  {8, 0x0029},
+  {9, 0x00b2},
+  {8, 0x0009},
+  {8, 0x0089},
+  {8, 0x0049},
+  {9, 0x00f2},
+  {7, 0x0102},
+  {8, 0x0055},
+  {8, 0x0015},
+  {8, 0x011d},
+  {7, 0x0112},
+  {8, 0x0075},
+  {8, 0x0035},
+  {9, 0x00ca},
+  {7, 0x010a},
+  {8, 0x0065},
+  {8, 0x0025},
+  {9, 0x00aa},
+  {8, 0x0005},
+  {8, 0x0085},
+  {8, 0x0045},
+  {9, 0x00ea},
+  {7, 0x0106},
+  {8, 0x005d},
+  {8, 0x001d},
+  {9, 0x009a},
+  {7, 0x0116},
+  {8, 0x007d},
+  {8, 0x003d},
+  {9, 0x00da},
+  {7, 0x010e},
+  {8, 0x006d},
+  {8, 0x002d},
+  {9, 0x00ba},
+  {8, 0x000d},
+  {8, 0x008d},
+  {8, 0x004d},
+  {9, 0x00fa},
+  {7, 0x0101},
+  {8, 0x0053},
+  {8, 0x0013},
+  {8, 0x011b},
+  {7, 0x0111},
+  {8, 0x0073},
+  {8, 0x0033},
+  {9, 0x00c6},
+  {7, 0x0109},
+  {8, 0x0063},
+  {8, 0x0023},
+  {9, 0x00a6},
+  {8, 0x0003},
+  {8, 0x0083},
+  {8, 0x0043},
+  {9, 0x00e6},
+  {7, 0x0105},
+  {8, 0x005b},
+  {8, 0x001b},
+  {9, 0x0096},
+  {7, 0x0115},
+  {8, 0x007b},
+  {8, 0x003b},
+  {9, 0x00d6},
+  {7, 0x010d},
+  {8, 0x006b},
+  {8, 0x002b},
+  {9, 0x00b6},
+  {8, 0x000b},
+  {8, 0x008b},
+  {8, 0x004b},
+  {9, 0x00f6},
+  {7, 0x0103},
+  {8, 0x0057},
+  {8, 0x0017},
+  {8, 0x011f},
+  {7, 0x0113},
+  {8, 0x0077},
+  {8, 0x0037},
+  {9, 0x00ce},
+  {7, 0x010b},
+  {8, 0x0067},
+  {8, 0x0027},
+  {9, 0x00ae},
+  {8, 0x0007},
+  {8, 0x0087},
+  {8, 0x0047},
+  {9, 0x00ee},
+  {7, 0x0107},
+  {8, 0x005f},
+  {8, 0x001f},
+  {9, 0x009e},
+  {7, 0x0117},
+  {8, 0x007f},
+  {8, 0x003f},
+  {9, 0x00de},
+  {7, 0x010f},
+  {8, 0x006f},
+  {8, 0x002f},
+  {9, 0x00be},
+  {8, 0x000f},
+  {8, 0x008f},
+  {8, 0x004f},
+  {9, 0x00fe},
+  {7, 0x0100},
+  {8, 0x0050},
+  {8, 0x0010},
+  {8, 0x0118},
+  {7, 0x0110},
+  {8, 0x0070},
+  {8, 0x0030},
+  {9, 0x00c1},
+  {7, 0x0108},
+  {8, 0x0060},
+  {8, 0x0020},
+  {9, 0x00a1},
+  {8, 0x0000},
+  {8, 0x0080},
+  {8, 0x0040},
+  {9, 0x00e1},
+  {7, 0x0104},
+  {8, 0x0058},
+  {8, 0x0018},
+  {9, 0x0091},
+  {7, 0x0114},
+  {8, 0x0078},
+  {8, 0x0038},
+  {9, 0x00d1},
+  {7, 0x010c},
+  {8, 0x0068},
+  {8, 0x0028},
+  {9, 0x00b1},
+  {8, 0x0008},
+  {8, 0x0088},
+  {8, 0x0048},
+  {9, 0x00f1},
+  {7, 0x0102},
+  {8, 0x0054},
+  {8, 0x0014},
+  {8, 0x011c},
+  {7, 0x0112},
+  {8, 0x0074},
+  {8, 0x0034},
+  {9, 0x00c9},
+  {7, 0x010a},
+  {8, 0x0064},
+  {8, 0x0024},
+  {9, 0x00a9},
+  {8, 0x0004},
+  {8, 0x0084},
+  {8, 0x0044},
+  {9, 0x00e9},
+  {7, 0x0106},
+  {8, 0x005c},
+  {8, 0x001c},
+  {9, 0x0099},
+  {7, 0x0116},
+  {8, 0x007c},
+  {8, 0x003c},
+  {9, 0x00d9},
+  {7, 0x010e},
+  {8, 0x006c},
+  {8, 0x002c},
+  {9, 0x00b9},
+  {8, 0x000c},
+  {8, 0x008c},
+  {8, 0x004c},
+  {9, 0x00f9},
+  {7, 0x0101},
+  {8, 0x0052},
+  {8, 0x0012},
+  {8, 0x011a},
+  {7, 0x0111},
+  {8, 0x0072},
+  {8, 0x0032},
+  {9, 0x00c5},
+  {7, 0x0109},
+  {8, 0x0062},
+  {8, 0x0022},
+  {9, 0x00a5},
+  {8, 0x0002},
+  {8, 0x0082},
+  {8, 0x0042},
+  {9, 0x00e5},
+  {7, 0x0105},
+  {8, 0x005a},
+  {8, 0x001a},
+  {9, 0x0095},
+  {7, 0x0115},
+  {8, 0x007a},
+  {8, 0x003a},
+  {9, 0x00d5},
+  {7, 0x010d},
+  {8, 0x006a},
+  {8, 0x002a},
+  {9, 0x00b5},
+  {8, 0x000a},
+  {8, 0x008a},
+  {8, 0x004a},
+  {9, 0x00f5},
+  {7, 0x0103},
+  {8, 0x0056},
+  {8, 0x0016},
+  {8, 0x011e},
+  {7, 0x0113},
+  {8, 0x0076},
+  {8, 0x0036},
+  {9, 0x00cd},
+  {7, 0x010b},
+  {8, 0x0066},
+  {8, 0x0026},
+  {9, 0x00ad},
+  {8, 0x0006},
+  {8, 0x0086},
+  {8, 0x0046},
+  {9, 0x00ed},
+  {7, 0x0107},
+  {8, 0x005e},
+  {8, 0x001e},
+  {9, 0x009d},
+  {7, 0x0117},
+  {8, 0x007e},
+  {8, 0x003e},
+  {9, 0x00dd},
+  {7, 0x010f},
+  {8, 0x006e},
+  {8, 0x002e},
+  {9, 0x00bd},
+  {8, 0x000e},
+  {8, 0x008e},
+  {8, 0x004e},
+  {9, 0x00fd},
+  {7, 0x0100},
+  {8, 0x0051},
+  {8, 0x0011},
+  {8, 0x0119},
+  {7, 0x0110},
+  {8, 0x0071},
+  {8, 0x0031},
+  {9, 0x00c3},
+  {7, 0x0108},
+  {8, 0x0061},
+  {8, 0x0021},
+  {9, 0x00a3},
+  {8, 0x0001},
+  {8, 0x0081},
+  {8, 0x0041},
+  {9, 0x00e3},
+  {7, 0x0104},
+  {8, 0x0059},
+  {8, 0x0019},
+  {9, 0x0093},
+  {7, 0x0114},
+  {8, 0x0079},
+  {8, 0x0039},
+  {9, 0x00d3},
+  {7, 0x010c},
+  {8, 0x0069},
+  {8, 0x0029},
+  {9, 0x00b3},
+  {8, 0x0009},
+  {8, 0x0089},
+  {8, 0x0049},
+  {9, 0x00f3},
+  {7, 0x0102},
+  {8, 0x0055},
+  {8, 0x0015},
+  {8, 0x011d},
+  {7, 0x0112},
+  {8, 0x0075},
+  {8, 0x0035},
+  {9, 0x00cb},
+  {7, 0x010a},
+  {8, 0x0065},
+  {8, 0x0025},
+  {9, 0x00ab},
+  {8, 0x0005},
+  {8, 0x0085},
+  {8, 0x0045},
+  {9, 0x00eb},
+  {7, 0x0106},
+  {8, 0x005d},
+  {8, 0x001d},
+  {9, 0x009b},
+  {7, 0x0116},
+  {8, 0x007d},
+  {8, 0x003d},
+  {9, 0x00db},
+  {7, 0x010e},
+  {8, 0x006d},
+  {8, 0x002d},
+  {9, 0x00bb},
+  {8, 0x000d},
+  {8, 0x008d},
+  {8, 0x004d},
+  {9, 0x00fb},
+  {7, 0x0101},
+  {8, 0x0053},
+  {8, 0x0013},
+  {8, 0x011b},
+  {7, 0x0111},
+  {8, 0x0073},
+  {8, 0x0033},
+  {9, 0x00c7},
+  {7, 0x0109},
+  {8, 0x0063},
+  {8, 0x0023},
+  {9, 0x00a7},
+  {8, 0x0003},
+  {8, 0x0083},
+  {8, 0x0043},
+  {9, 0x00e7},
+  {7, 0x0105},
+  {8, 0x005b},
+  {8, 0x001b},
+  {9, 0x0097},
+  {7, 0x0115},
+  {8, 0x007b},
+  {8, 0x003b},
+  {9, 0x00d7},
+  {7, 0x010d},
+  {8, 0x006b},
+  {8, 0x002b},
+  {9, 0x00b7},
+  {8, 0x000b},
+  {8, 0x008b},
+  {8, 0x004b},
+  {9, 0x00f7},
+  {7, 0x0103},
+  {8, 0x0057},
+  {8, 0x0017},
+  {8, 0x011f},
+  {7, 0x0113},
+  {8, 0x0077},
+  {8, 0x0037},
+  {9, 0x00cf},
+  {7, 0x010b},
+  {8, 0x0067},
+  {8, 0x0027},
+  {9, 0x00af},
+  {8, 0x0007},
+  {8, 0x0087},
+  {8, 0x0047},
+  {9, 0x00ef},
+  {7, 0x0107},
+  {8, 0x005f},
+  {8, 0x001f},
+  {9, 0x009f},
+  {7, 0x0117},
+  {8, 0x007f},
+  {8, 0x003f},
+  {9, 0x00df},
+  {7, 0x010f},
+  {8, 0x006f},
+  {8, 0x002f},
+  {9, 0x00bf},
+  {8, 0x000f},
+  {8, 0x008f},
+  {8, 0x004f},
+  {9, 0x00ff}
+};
+
+FlateHuffmanTab FlateStream::fixedLitCodeTab = {
+  flateFixedLitCodeTabCodes, 9
+};
+
+static FlateCode flateFixedDistCodeTabCodes[32] = {
+  {5, 0x0000},
+  {5, 0x0010},
+  {5, 0x0008},
+  {5, 0x0018},
+  {5, 0x0004},
+  {5, 0x0014},
+  {5, 0x000c},
+  {5, 0x001c},
+  {5, 0x0002},
+  {5, 0x0012},
+  {5, 0x000a},
+  {5, 0x001a},
+  {5, 0x0006},
+  {5, 0x0016},
+  {5, 0x000e},
+  {0, 0x0000},
+  {5, 0x0001},
+  {5, 0x0011},
+  {5, 0x0009},
+  {5, 0x0019},
+  {5, 0x0005},
+  {5, 0x0015},
+  {5, 0x000d},
+  {5, 0x001d},
+  {5, 0x0003},
+  {5, 0x0013},
+  {5, 0x000b},
+  {5, 0x001b},
+  {5, 0x0007},
+  {5, 0x0017},
+  {5, 0x000f},
+  {0, 0x0000}
+};
+
+FlateHuffmanTab FlateStream::fixedDistCodeTab = {
+  flateFixedDistCodeTabCodes, 5
+};
+
+FlateStream::FlateStream(Stream *strA, int predictor, int columns,
+                        int colors, int bits):
+    FilterStream(strA) {
+  if (predictor != 1) {
+    pred = new StreamPredictor(this, predictor, columns, colors, bits);
+    if (!pred->isOk()) {
+      delete pred;
+      pred = NULL;
+    }
+  } else {
+    pred = NULL;
+  }
+  litCodeTab.codes = NULL;
+  distCodeTab.codes = NULL;
+  memset(buf, 0, flateWindow);
+}
+
+FlateStream::~FlateStream() {
+  if (litCodeTab.codes != fixedLitCodeTab.codes) {
+    gfree(litCodeTab.codes);
+  }
+  if (distCodeTab.codes != fixedDistCodeTab.codes) {
+    gfree(distCodeTab.codes);
+  }
+  if (pred) {
+    delete pred;
+  }
+  delete str;
+}
+
+void FlateStream::unfilteredReset() {
+  index = 0;
+  remain = 0;
+  codeBuf = 0;
+  codeSize = 0;
+  compressedBlock = gFalse;
+  endOfBlock = gTrue;
+  eof = gTrue;
+
+  str->reset();
+}
+
+void FlateStream::reset() {
+  int cmf, flg;
+
+  unfilteredReset();
+
+  // read header
+  //~ need to look at window size?
+  endOfBlock = eof = gTrue;
+  cmf = str->getChar();
+  flg = str->getChar();
+  if (cmf == EOF || flg == EOF)
+    return;
+  if ((cmf & 0x0f) != 0x08) {
+    error(errSyntaxError, getPos(), "Unknown compression method in flate stream");
+    return;
+  }
+  if ((((cmf << 8) + flg) % 31) != 0) {
+    error(errSyntaxError, getPos(), "Bad FCHECK in flate stream");
+    return;
+  }
+  if (flg & 0x20) {
+    error(errSyntaxError, getPos(), "FDICT bit set in flate stream");
+    return;
+  }
+
+  eof = gFalse;
+}
+
+int FlateStream::getChar() {
+  if (pred) {
+    return pred->getChar();
+  }
+  return doGetRawChar();
+}
+
+int FlateStream::getChars(int nChars, Guchar *buffer) {
+  if (pred) {
+    return pred->getChars(nChars, buffer);
+  } else {
+    for (int i = 0; i < nChars; ++i) {
+      const int c = doGetRawChar();
+      if (likely(c != EOF)) buffer[i] = c;
+      else return i;
+    }
+    return nChars;
+  }
+}
+
+int FlateStream::lookChar() {
+  int c;
+
+  if (pred) {
+    return pred->lookChar();
+  }
+  while (remain == 0) {
+    if (endOfBlock && eof)
+      return EOF;
+    readSome();
+  }
+  c = buf[index];
+  return c;
+}
+
+void FlateStream::getRawChars(int nChars, int *buffer) {
+  for (int i = 0; i < nChars; ++i)
+    buffer[i] = doGetRawChar();
+}
+
+int FlateStream::getRawChar() {
+  return doGetRawChar();
+}
+
+GooString *FlateStream::getPSFilter(int psLevel, const char *indent) {
+  GooString *s;
+
+  if (psLevel < 3 || pred) {
+    return NULL;
+  }
+  if (!(s = str->getPSFilter(psLevel, indent))) {
+    return NULL;
+  }
+  s->append(indent)->append("<< >> /FlateDecode filter\n");
+  return s;
+}
+
+GBool FlateStream::isBinary(GBool last) {
+  return str->isBinary(gTrue);
+}
+
+void FlateStream::readSome() {
+  int code1, code2;
+  int len, dist;
+  int i, j, k;
+  int c;
+
+  if (endOfBlock) {
+    if (!startBlock())
+      return;
+  }
+
+  if (compressedBlock) {
+    if ((code1 = getHuffmanCodeWord(&litCodeTab)) == EOF)
+      goto err;
+    if (code1 < 256) {
+      buf[index] = code1;
+      remain = 1;
+    } else if (code1 == 256) {
+      endOfBlock = gTrue;
+      remain = 0;
+    } else {
+      code1 -= 257;
+      code2 = lengthDecode[code1].bits;
+      if (code2 > 0 && (code2 = getCodeWord(code2)) == EOF)
+       goto err;
+      len = lengthDecode[code1].first + code2;
+      if ((code1 = getHuffmanCodeWord(&distCodeTab)) == EOF)
+       goto err;
+      code2 = distDecode[code1].bits;
+      if (code2 > 0 && (code2 = getCodeWord(code2)) == EOF)
+       goto err;
+      dist = distDecode[code1].first + code2;
+      i = index;
+      j = (index - dist) & flateMask;
+      for (k = 0; k < len; ++k) {
+       buf[i] = buf[j];
+       i = (i + 1) & flateMask;
+       j = (j + 1) & flateMask;
+      }
+      remain = len;
+    }
+
+  } else {
+    len = (blockLen < flateWindow) ? blockLen : flateWindow;
+    for (i = 0, j = index; i < len; ++i, j = (j + 1) & flateMask) {
+      if ((c = str->getChar()) == EOF) {
+       endOfBlock = eof = gTrue;
+       break;
+      }
+      buf[j] = c & 0xff;
+    }
+    remain = i;
+    blockLen -= len;
+    if (blockLen == 0)
+      endOfBlock = gTrue;
+  }
+
+  return;
+
+err:
+  error(errSyntaxError, getPos(), "Unexpected end of file in flate stream");
+  endOfBlock = eof = gTrue;
+  remain = 0;
+}
+
+GBool FlateStream::startBlock() {
+  int blockHdr;
+  int c;
+  int check;
+
+  // free the code tables from the previous block
+  if (litCodeTab.codes != fixedLitCodeTab.codes) {
+    gfree(litCodeTab.codes);
+  }
+  litCodeTab.codes = NULL;
+  if (distCodeTab.codes != fixedDistCodeTab.codes) {
+    gfree(distCodeTab.codes);
+  }
+  distCodeTab.codes = NULL;
+
+  // read block header
+  blockHdr = getCodeWord(3);
+  if (blockHdr & 1)
+    eof = gTrue;
+  blockHdr >>= 1;
+
+  // uncompressed block
+  if (blockHdr == 0) {
+    compressedBlock = gFalse;
+    if ((c = str->getChar()) == EOF)
+      goto err;
+    blockLen = c & 0xff;
+    if ((c = str->getChar()) == EOF)
+      goto err;
+    blockLen |= (c & 0xff) << 8;
+    if ((c = str->getChar()) == EOF)
+      goto err;
+    check = c & 0xff;
+    if ((c = str->getChar()) == EOF)
+      goto err;
+    check |= (c & 0xff) << 8;
+    if (check != (~blockLen & 0xffff))
+      error(errSyntaxError, getPos(), "Bad uncompressed block length in flate stream");
+    codeBuf = 0;
+    codeSize = 0;
+
+  // compressed block with fixed codes
+  } else if (blockHdr == 1) {
+    compressedBlock = gTrue;
+    loadFixedCodes();
+
+  // compressed block with dynamic codes
+  } else if (blockHdr == 2) {
+    compressedBlock = gTrue;
+    if (!readDynamicCodes()) {
+      goto err;
+    }
+
+  // unknown block type
+  } else {
+    goto err;
+  }
+
+  endOfBlock = gFalse;
+  return gTrue;
+
+err:
+  error(errSyntaxError, getPos(), "Bad block header in flate stream");
+  endOfBlock = eof = gTrue;
+  return gFalse;
+}
+
+void FlateStream::loadFixedCodes() {
+  litCodeTab.codes = fixedLitCodeTab.codes;
+  litCodeTab.maxLen = fixedLitCodeTab.maxLen;
+  distCodeTab.codes = fixedDistCodeTab.codes;
+  distCodeTab.maxLen = fixedDistCodeTab.maxLen;
+}
+
+GBool FlateStream::readDynamicCodes() {
+  int numCodeLenCodes;
+  int numLitCodes;
+  int numDistCodes;
+  int codeLenCodeLengths[flateMaxCodeLenCodes];
+  FlateHuffmanTab codeLenCodeTab;
+  int len, repeat, code;
+  int i;
+
+  codeLenCodeTab.codes = NULL;
+
+  // read lengths
+  if ((numLitCodes = getCodeWord(5)) == EOF) {
+    goto err;
+  }
+  numLitCodes += 257;
+  if ((numDistCodes = getCodeWord(5)) == EOF) {
+    goto err;
+  }
+  numDistCodes += 1;
+  if ((numCodeLenCodes = getCodeWord(4)) == EOF) {
+    goto err;
+  }
+  numCodeLenCodes += 4;
+  if (numLitCodes > flateMaxLitCodes ||
+      numDistCodes > flateMaxDistCodes ||
+      numCodeLenCodes > flateMaxCodeLenCodes) {
+    goto err;
+  }
+
+  // build the code length code table
+  for (i = 0; i < flateMaxCodeLenCodes; ++i) {
+    codeLenCodeLengths[i] = 0;
+  }
+  for (i = 0; i < numCodeLenCodes; ++i) {
+    if ((codeLenCodeLengths[codeLenCodeMap[i]] = getCodeWord(3)) == -1) {
+      goto err;
+    }
+  }
+  compHuffmanCodes(codeLenCodeLengths, flateMaxCodeLenCodes, &codeLenCodeTab);
+
+  // build the literal and distance code tables
+  len = 0;
+  repeat = 0;
+  i = 0;
+  while (i < numLitCodes + numDistCodes) {
+    if ((code = getHuffmanCodeWord(&codeLenCodeTab)) == EOF) {
+      goto err;
+    }
+    if (code == 16) {
+      if ((repeat = getCodeWord(2)) == EOF) {
+       goto err;
+      }
+      repeat += 3;
+      if (i + repeat > numLitCodes + numDistCodes) {
+       goto err;
+      }
+      for (; repeat > 0; --repeat) {
+       codeLengths[i++] = len;
+      }
+    } else if (code == 17) {
+      if ((repeat = getCodeWord(3)) == EOF) {
+       goto err;
+      }
+      repeat += 3;
+      if (i + repeat > numLitCodes + numDistCodes) {
+       goto err;
+      }
+      len = 0;
+      for (; repeat > 0; --repeat) {
+       codeLengths[i++] = 0;
+      }
+    } else if (code == 18) {
+      if ((repeat = getCodeWord(7)) == EOF) {
+       goto err;
+      }
+      repeat += 11;
+      if (i + repeat > numLitCodes + numDistCodes) {
+       goto err;
+      }
+      len = 0;
+      for (; repeat > 0; --repeat) {
+       codeLengths[i++] = 0;
+      }
+    } else {
+      codeLengths[i++] = len = code;
+    }
+  }
+  compHuffmanCodes(codeLengths, numLitCodes, &litCodeTab);
+  compHuffmanCodes(codeLengths + numLitCodes, numDistCodes, &distCodeTab);
+
+  gfree(codeLenCodeTab.codes);
+  return gTrue;
+
+err:
+  error(errSyntaxError, getPos(), "Bad dynamic code table in flate stream");
+  gfree(codeLenCodeTab.codes);
+  return gFalse;
+}
+
+// Convert an array <lengths> of <n> lengths, in value order, into a
+// Huffman code lookup table.
+void FlateStream::compHuffmanCodes(int *lengths, int n, FlateHuffmanTab *tab) {
+  int tabSize, len, code, code2, skip, val, i, t;
+
+  // find max code length
+  tab->maxLen = 0;
+  for (val = 0; val < n; ++val) {
+    if (lengths[val] > tab->maxLen) {
+      tab->maxLen = lengths[val];
+    }
+  }
+
+  // allocate the table
+  tabSize = 1 << tab->maxLen;
+  tab->codes = (FlateCode *)gmallocn(tabSize, sizeof(FlateCode));
+
+  // clear the table
+  for (i = 0; i < tabSize; ++i) {
+    tab->codes[i].len = 0;
+    tab->codes[i].val = 0;
+  }
+
+  // build the table
+  for (len = 1, code = 0, skip = 2;
+       len <= tab->maxLen;
+       ++len, code <<= 1, skip <<= 1) {
+    for (val = 0; val < n; ++val) {
+      if (lengths[val] == len) {
+
+       // bit-reverse the code
+       code2 = 0;
+       t = code;
+       for (i = 0; i < len; ++i) {
+         code2 = (code2 << 1) | (t & 1);
+         t >>= 1;
+       }
+
+       // fill in the table entries
+       for (i = code2; i < tabSize; i += skip) {
+         tab->codes[i].len = (Gushort)len;
+         tab->codes[i].val = (Gushort)val;
+       }
+
+       ++code;
+      }
+    }
+  }
+}
+
+int FlateStream::getHuffmanCodeWord(FlateHuffmanTab *tab) {
+  FlateCode *code;
+  int c;
+
+  while (codeSize < tab->maxLen) {
+    if ((c = str->getChar()) == EOF) {
+      break;
+    }
+    codeBuf |= (c & 0xff) << codeSize;
+    codeSize += 8;
+  }
+  code = &tab->codes[codeBuf & ((1 << tab->maxLen) - 1)];
+  if (codeSize == 0 || codeSize < code->len || code->len == 0) {
+    return EOF;
+  }
+  codeBuf >>= code->len;
+  codeSize -= code->len;
+  return (int)code->val;
+}
+
+int FlateStream::getCodeWord(int bits) {
+  int c;
+
+  while (codeSize < bits) {
+    if ((c = str->getChar()) == EOF)
+      return EOF;
+    codeBuf |= (c & 0xff) << codeSize;
+    codeSize += 8;
+  }
+  c = codeBuf & ((1 << bits) - 1);
+  codeBuf >>= bits;
+  codeSize -= bits;
+  return c;
+}
+#endif
+
+//------------------------------------------------------------------------
+// EOFStream
+//------------------------------------------------------------------------
+
+EOFStream::EOFStream(Stream *strA):
+    FilterStream(strA) {
+}
+
+EOFStream::~EOFStream() {
+  delete str;
+}
+
+//------------------------------------------------------------------------
+// BufStream
+//------------------------------------------------------------------------
+
+BufStream::BufStream(Stream *strA, int bufSizeA): FilterStream(strA) {
+  bufSize = bufSizeA;
+  buf = (int *)gmallocn(bufSize, sizeof(int));
+}
+
+BufStream::~BufStream() {
+  gfree(buf);
+  delete str;
+}
+
+void BufStream::reset() {
+  int i;
+
+  str->reset();
+  for (i = 0; i < bufSize; ++i) {
+    buf[i] = str->getChar();
+  }
+}
+
+int BufStream::getChar() {
+  int c, i;
+
+  c = buf[0];
+  for (i = 1; i < bufSize; ++i) {
+    buf[i-1] = buf[i];
+  }
+  buf[bufSize - 1] = str->getChar();
+  return c;
+}
+
+int BufStream::lookChar() {
+  return buf[0];
+}
+
+int BufStream::lookChar(int idx) {
+  return buf[idx];
+}
+
+GBool BufStream::isBinary(GBool last) {
+  return str->isBinary(gTrue);
+}
+
+//------------------------------------------------------------------------
+// FixedLengthEncoder
+//------------------------------------------------------------------------
+
+FixedLengthEncoder::FixedLengthEncoder(Stream *strA, int lengthA):
+    FilterStream(strA) {
+  length = lengthA;
+  count = 0;
+}
+
+FixedLengthEncoder::~FixedLengthEncoder() {
+  if (str->isEncoder())
+    delete str;
+}
+
+void FixedLengthEncoder::reset() {
+  str->reset();
+  count = 0;
+}
+
+int FixedLengthEncoder::getChar() {
+  if (length >= 0 && count >= length)
+    return EOF;
+  ++count;
+  return str->getChar();
+}
+
+int FixedLengthEncoder::lookChar() {
+  if (length >= 0 && count >= length)
+    return EOF;
+  return str->getChar();
+}
+
+GBool FixedLengthEncoder::isBinary(GBool last) {
+  return str->isBinary(gTrue);
+}
+
+//------------------------------------------------------------------------
+// ASCIIHexEncoder
+//------------------------------------------------------------------------
+
+ASCIIHexEncoder::ASCIIHexEncoder(Stream *strA):
+    FilterStream(strA) {
+  bufPtr = bufEnd = buf;
+  lineLen = 0;
+  eof = gFalse;
+}
+
+ASCIIHexEncoder::~ASCIIHexEncoder() {
+  if (str->isEncoder()) {
+    delete str;
+  }
+}
+
+void ASCIIHexEncoder::reset() {
+  str->reset();
+  bufPtr = bufEnd = buf;
+  lineLen = 0;
+  eof = gFalse;
+}
+
+GBool ASCIIHexEncoder::fillBuf() {
+  static const char *hex = "0123456789abcdef";
+  int c;
+
+  if (eof) {
+    return gFalse;
+  }
+  bufPtr = bufEnd = buf;
+  if ((c = str->getChar()) == EOF) {
+    *bufEnd++ = '>';
+    eof = gTrue;
+  } else {
+    if (lineLen >= 64) {
+      *bufEnd++ = '\n';
+      lineLen = 0;
+    }
+    *bufEnd++ = hex[(c >> 4) & 0x0f];
+    *bufEnd++ = hex[c & 0x0f];
+    lineLen += 2;
+  }
+  return gTrue;
+}
+
+//------------------------------------------------------------------------
+// ASCII85Encoder
+//------------------------------------------------------------------------
+
+ASCII85Encoder::ASCII85Encoder(Stream *strA):
+    FilterStream(strA) {
+  bufPtr = bufEnd = buf;
+  lineLen = 0;
+  eof = gFalse;
+}
+
+ASCII85Encoder::~ASCII85Encoder() {
+  if (str->isEncoder())
+    delete str;
+}
+
+void ASCII85Encoder::reset() {
+  str->reset();
+  bufPtr = bufEnd = buf;
+  lineLen = 0;
+  eof = gFalse;
+}
+
+GBool ASCII85Encoder::fillBuf() {
+  Guint t;
+  char buf1[5];
+  int c0, c1, c2, c3;
+  int n, i;
+
+  if (eof) {
+    return gFalse;
+  }
+  c0 = str->getChar();
+  c1 = str->getChar();
+  c2 = str->getChar();
+  c3 = str->getChar();
+  bufPtr = bufEnd = buf;
+  if (c3 == EOF) {
+    if (c0 == EOF) {
+      n = 0;
+      t = 0;
+    } else {
+      if (c1 == EOF) {
+       n = 1;
+       t = c0 << 24;
+      } else if (c2 == EOF) {
+       n = 2;
+       t = (c0 << 24) | (c1 << 16);
+      } else {
+       n = 3;
+       t = (c0 << 24) | (c1 << 16) | (c2 << 8);
+      }
+      for (i = 4; i >= 0; --i) {
+       buf1[i] = (char)(t % 85 + 0x21);
+       t /= 85;
+      }
+      for (i = 0; i <= n; ++i) {
+       *bufEnd++ = buf1[i];
+       if (++lineLen == 65) {
+         *bufEnd++ = '\n';
+         lineLen = 0;
+       }
+      }
+    }
+    *bufEnd++ = '~';
+    *bufEnd++ = '>';
+    eof = gTrue;
+  } else {
+    t = (c0 << 24) | (c1 << 16) | (c2 << 8) | c3;
+    if (t == 0) {
+      *bufEnd++ = 'z';
+      if (++lineLen == 65) {
+       *bufEnd++ = '\n';
+       lineLen = 0;
+      }
+    } else {
+      for (i = 4; i >= 0; --i) {
+       buf1[i] = (char)(t % 85 + 0x21);
+       t /= 85;
+      }
+      for (i = 0; i <= 4; ++i) {
+       *bufEnd++ = buf1[i];
+       if (++lineLen == 65) {
+         *bufEnd++ = '\n';
+         lineLen = 0;
+       }
+      }
+    }
+  }
+  return gTrue;
+}
+
+//------------------------------------------------------------------------
+// RunLengthEncoder
+//------------------------------------------------------------------------
+
+RunLengthEncoder::RunLengthEncoder(Stream *strA):
+    FilterStream(strA) {
+  bufPtr = bufEnd = nextEnd = buf;
+  eof = gFalse;
+}
+
+RunLengthEncoder::~RunLengthEncoder() {
+  if (str->isEncoder())
+    delete str;
+}
+
+void RunLengthEncoder::reset() {
+  str->reset();
+  bufPtr = bufEnd = nextEnd = buf;
+  eof = gFalse;
+}
+
+//
+// When fillBuf finishes, buf[] looks like this:
+//   +-----+--------------+-----------------+--
+//   + tag | ... data ... | next 0, 1, or 2 |
+//   +-----+--------------+-----------------+--
+//    ^                    ^                 ^
+//    bufPtr               bufEnd            nextEnd
+//
+GBool RunLengthEncoder::fillBuf() {
+  int c, c1, c2;
+  int n;
+
+  // already hit EOF?
+  if (eof)
+    return gFalse;
+
+  // grab two bytes
+  if (nextEnd < bufEnd + 1) {
+    if ((c1 = str->getChar()) == EOF) {
+      eof = gTrue;
+      return gFalse;
+    }
+  } else {
+    c1 = bufEnd[0] & 0xff;
+  }
+  if (nextEnd < bufEnd + 2) {
+    if ((c2 = str->getChar()) == EOF) {
+      eof = gTrue;
+      buf[0] = 0;
+      buf[1] = c1;
+      bufPtr = buf;
+      bufEnd = &buf[2];
+      return gTrue;
+    }
+  } else {
+    c2 = bufEnd[1] & 0xff;
+  }
+
+  // check for repeat
+  c = 0; // make gcc happy
+  if (c1 == c2) {
+    n = 2;
+    while (n < 128 && (c = str->getChar()) == c1)
+      ++n;
+    buf[0] = (char)(257 - n);
+    buf[1] = c1;
+    bufEnd = &buf[2];
+    if (c == EOF) {
+      eof = gTrue;
+    } else if (n < 128) {
+      buf[2] = c;
+      nextEnd = &buf[3];
+    } else {
+      nextEnd = bufEnd;
+    }
+
+  // get up to 128 chars
+  } else {
+    buf[1] = c1;
+    buf[2] = c2;
+    n = 2;
+    while (n < 128) {
+      if ((c = str->getChar()) == EOF) {
+       eof = gTrue;
+       break;
+      }
+      ++n;
+      buf[n] = c;
+      if (buf[n] == buf[n-1])
+       break;
+    }
+    if (buf[n] == buf[n-1]) {
+      buf[0] = (char)(n-2-1);
+      bufEnd = &buf[n-1];
+      nextEnd = &buf[n+1];
+    } else {
+      buf[0] = (char)(n-1);
+      bufEnd = nextEnd = &buf[n+1];
+    }
+  }
+  bufPtr = buf;
+  return gTrue;
+}
+
+//------------------------------------------------------------------------
+// CMYKGrayEncoder
+//------------------------------------------------------------------------
+
+CMYKGrayEncoder::CMYKGrayEncoder(Stream *strA):
+    FilterStream(strA) {
+  bufPtr = bufEnd = buf;
+  eof = gFalse;
+}
+
+CMYKGrayEncoder::~CMYKGrayEncoder() {
+  if (str->isEncoder())
+    delete str;
+}
+
+void CMYKGrayEncoder::reset() {
+  str->reset();
+  bufPtr = bufEnd = buf;
+  eof = gFalse;
+}
+
+GBool CMYKGrayEncoder::fillBuf() {
+  int c0, c1, c2, c3;
+  int i;
+
+  if (eof) {
+    return gFalse;
+  }
+  c0 = str->getChar();
+  c1 = str->getChar();
+  c2 = str->getChar();
+  c3 = str->getChar();
+  if (c3 == EOF) {
+    eof = gTrue;
+    return gFalse;
+  }
+  i = (3 * c0 + 6 * c1 + c2) / 10 + c3;
+  if (i > 255) i = 255;
+  bufPtr = bufEnd = buf;
+  *bufEnd++ = (char) i;
+  return gTrue;
+}
+
+//------------------------------------------------------------------------
+// RGBGrayEncoder
+//------------------------------------------------------------------------
+
+RGBGrayEncoder::RGBGrayEncoder(Stream *strA):
+    FilterStream(strA) {
+  bufPtr = bufEnd = buf;
+  eof = gFalse;
+}
+
+RGBGrayEncoder::~RGBGrayEncoder() {
+  if (str->isEncoder())
+    delete str;
+}
+
+void RGBGrayEncoder::reset() {
+  str->reset();
+  bufPtr = bufEnd = buf;
+  eof = gFalse;
+}
+
+GBool RGBGrayEncoder::fillBuf() {
+  int c0, c1, c2;
+  int i;
+
+  if (eof) {
+    return gFalse;
+  }
+  c0 = str->getChar();
+  c1 = str->getChar();
+  c2 = str->getChar();
+  if (c2 == EOF) {
+    eof = gTrue;
+    return gFalse;
+  }
+  i = 255 - (3 * c0 + 6 * c1 + c2) / 10;
+  if (i < 0) i = 0;
+  bufPtr = bufEnd = buf;
+  *bufEnd++ = (char) i;
+  return gTrue;
+}
+
diff --git a/poppler/Stream.h b/poppler/Stream.h
new file mode 100644 (file)
index 0000000..a270fdf
--- /dev/null
@@ -0,0 +1,1239 @@
+//========================================================================
+//
+// Stream.h
+//
+// Copyright 1996-2003 Glyph & Cog, LLC
+//
+//========================================================================
+
+//========================================================================
+//
+// Modified under the Poppler project - http://poppler.freedesktop.org
+//
+// All changes made under the Poppler project to this file are licensed
+// under GPL version 2 or later
+//
+// Copyright (C) 2005 Jeff Muizelaar <jeff@infidigm.net>
+// Copyright (C) 2008 Julien Rebetez <julien@fhtagn.net>
+// Copyright (C) 2008, 2010, 2011 Albert Astals Cid <aacid@kde.org>
+// Copyright (C) 2009 Carlos Garcia Campos <carlosgc@gnome.org>
+// Copyright (C) 2009 Stefan Thomas <thomas@eload24.com>
+// Copyright (C) 2010 Hib Eris <hib@hiberis.nl>
+// Copyright (C) 2011, 2012 William Bader <williambader@hotmail.com>
+// Copyright (C) 2012 Thomas Freitag <Thomas.Freitag@alfa.de>
+//
+// To see a description of the changes please see the Changelog file that
+// came with your tarball or type make ChangeLog if you are building from git
+//
+//========================================================================
+
+#ifndef STREAM_H
+#define STREAM_H
+
+#ifdef USE_GCC_PRAGMAS
+#pragma interface
+#endif
+
+#include "poppler-config.h"
+#include <stdio.h>
+#include "goo/gtypes.h"
+#include "Object.h"
+
+class BaseStream;
+class CachedFile;
+
+//------------------------------------------------------------------------
+
+enum StreamKind {
+  strFile,
+  strCachedFile,
+  strASCIIHex,
+  strASCII85,
+  strLZW,
+  strRunLength,
+  strCCITTFax,
+  strDCT,
+  strFlate,
+  strJBIG2,
+  strJPX,
+  strWeird                     // internal-use stream types
+};
+
+enum StreamColorSpaceMode {
+  streamCSNone,
+  streamCSDeviceGray,
+  streamCSDeviceRGB,
+  streamCSDeviceCMYK
+};
+
+//------------------------------------------------------------------------
+
+// This is in Stream.h instead of Decrypt.h to avoid really annoying
+// include file dependency loops.
+enum CryptAlgorithm {
+  cryptRC4,
+  cryptAES,
+  cryptAES256
+};
+
+//------------------------------------------------------------------------
+
+typedef struct _ByteRange {
+  Guint offset;
+  Guint length;
+} ByteRange;
+
+//------------------------------------------------------------------------
+// Stream (base class)
+//------------------------------------------------------------------------
+
+class Stream {
+public:
+
+  // Constructor.
+  Stream();
+
+  // Destructor.
+  virtual ~Stream();
+
+  // Reference counting.
+  int incRef() { return ++ref; }
+  int decRef() { return --ref; }
+
+  // Get kind of stream.
+  virtual StreamKind getKind() = 0;
+
+  // Reset stream to beginning.
+  virtual void reset() = 0;
+
+  // Close down the stream.
+  virtual void close();
+
+  inline int doGetChars(int nChars, Guchar *buffer)
+  {
+    if (hasGetChars()) {
+      return getChars(nChars, buffer);
+    } else {
+      for (int i = 0; i < nChars; ++i) {
+        const int c = getChar();
+        if (likely(c != EOF)) buffer[i] = c;
+        else return i;
+      }
+      return nChars;
+    }
+  }
+
+  inline void fillGooString(GooString *s)
+  {
+    Guchar readBuf[4096];
+    int readChars;
+    reset();
+    while ((readChars = doGetChars(4096, readBuf)) != 0) {
+      s->append((const char *)readBuf, readChars);
+    }
+  }
+  
+  inline Guchar *toUnsignedChars(int *length, int initialSize = 4096, int sizeIncrement = 4096)
+  {
+    int readChars;
+    Guchar *buf = (Guchar *)gmalloc(initialSize);
+    int size = initialSize;
+    *length = 0;
+    int charsToRead = initialSize;
+    bool continueReading = true;
+    reset();
+    while (continueReading && (readChars = doGetChars(charsToRead, &buf[*length])) != 0) {
+      *length += readChars;
+      if (readChars == charsToRead) {
+        if (lookChar() != EOF) {
+          size += sizeIncrement;
+          charsToRead = sizeIncrement;
+          buf = (Guchar *)grealloc(buf, size);
+        } else {
+          continueReading = false;
+        }
+      } else {
+        continueReading = false;
+      }
+    }
+    return buf;
+  }
+
+  // Get next char from stream.
+  virtual int getChar() = 0;
+
+  // Peek at next char in stream.
+  virtual int lookChar() = 0;
+
+  // Get next char from stream without using the predictor.
+  // This is only used by StreamPredictor.
+  virtual int getRawChar();
+  virtual void getRawChars(int nChars, int *buffer);
+
+  // Get next char directly from stream source, without filtering it
+  virtual int getUnfilteredChar () = 0;
+
+  // Resets the stream without reading anything (even not the headers)
+  // WARNING: Reading the stream with something else than getUnfilteredChar 
+  // may lead to unexcepted behaviour until you call reset ()
+  virtual void unfilteredReset () = 0;
+
+  // Get next line from stream.
+  virtual char *getLine(char *buf, int size);
+
+  // Get current position in file.
+  virtual int getPos() = 0;
+
+  // Go to a position in the stream.  If <dir> is negative, the
+  // position is from the end of the file; otherwise the position is
+  // from the start of the file.
+  virtual void setPos(Guint pos, int dir = 0) = 0;
+
+  // Get PostScript command for the filter(s).
+  virtual GooString *getPSFilter(int psLevel, const char *indent);
+
+  // Does this stream type potentially contain non-printable chars?
+  virtual GBool isBinary(GBool last = gTrue) = 0;
+
+  // Get the BaseStream of this stream.
+  virtual BaseStream *getBaseStream() = 0;
+
+  // Get the stream after the last decoder (this may be a BaseStream
+  // or a DecryptStream).
+  virtual Stream *getUndecodedStream() = 0;
+
+  // Get the dictionary associated with this stream.
+  virtual Dict *getDict() = 0;
+
+  // Is this an encoding filter?
+  virtual GBool isEncoder() { return gFalse; }
+
+  // Get image parameters which are defined by the stream contents.
+  virtual void getImageParams(int * /*bitsPerComponent*/,
+                             StreamColorSpaceMode * /*csMode*/) {}
+
+  // Return the next stream in the "stack".
+  virtual Stream *getNextStream() { return NULL; }
+
+  // Add filters to this stream according to the parameters in <dict>.
+  // Returns the new stream.
+  Stream *addFilters(Object *dict);
+
+private:
+  virtual GBool hasGetChars() { return false; }
+  virtual int getChars(int nChars, Guchar *buffer);
+
+  Stream *makeFilter(char *name, Stream *str, Object *params);
+
+  int ref;                     // reference count
+};
+
+
+ //------------------------------------------------------------------------
+// OutStream
+//
+// This is the base class for all streams that output to a file
+//------------------------------------------------------------------------
+class OutStream {
+public:
+  // Constructor.
+  OutStream ();
+
+  // Desctructor.
+  virtual ~OutStream ();
+
+  // Reference counting.
+  int incRef() { return ++ref; }
+  int decRef() { return --ref; }
+
+  // Close the stream
+  virtual void close() = 0;
+
+  // Return position in stream
+  virtual int getPos() = 0;
+
+  // Put a char in the stream
+  virtual void put (char c) = 0;
+
+  //FIXME
+  // Printf-like function                         2,3 because the first arg is class instance ?
+  virtual void printf (const char *format, ...) = 0 ; //__attribute__((format(printf, 2,3))) = 0;
+
+private:
+  int ref; // reference count
+    
+};
+
+//------------------------------------------------------------------------
+// FileOutStream
+//------------------------------------------------------------------------
+class FileOutStream : public OutStream {
+public:
+  FileOutStream (FILE* fa, Guint startA);
+
+  virtual ~FileOutStream ();
+
+  virtual void close();
+
+  virtual int getPos();
+
+  virtual void put (char c);
+
+  virtual void printf (const char *format, ...);
+private:
+  FILE *f;
+  Guint start;
+
+};
+
+
+//------------------------------------------------------------------------
+// BaseStream
+//
+// This is the base class for all streams that read directly from a file.
+//------------------------------------------------------------------------
+
+class BaseStream: public Stream {
+public:
+
+  BaseStream(Object *dictA, Guint lengthA);
+  virtual ~BaseStream();
+  virtual Stream *makeSubStream(Guint start, GBool limited,
+                               Guint length, Object *dict) = 0;
+  virtual void setPos(Guint pos, int dir = 0) = 0;
+  virtual GBool isBinary(GBool last = gTrue) { return last; }
+  virtual BaseStream *getBaseStream() { return this; }
+  virtual Stream *getUndecodedStream() { return this; }
+  virtual Dict *getDict() { return dict.getDict(); }
+  virtual GooString *getFileName() { return NULL; }
+  virtual Guint getLength() { return length; }
+
+  // Get/set position of first byte of stream within the file.
+  virtual Guint getStart() = 0;
+  virtual void moveStart(int delta) = 0;
+
+protected:
+
+  Guint length;
+
+private:
+
+  Object dict;
+};
+
+//------------------------------------------------------------------------
+// FilterStream
+//
+// This is the base class for all streams that filter another stream.
+//------------------------------------------------------------------------
+
+class FilterStream: public Stream {
+public:
+
+  FilterStream(Stream *strA);
+  virtual ~FilterStream();
+  virtual void close();
+  virtual int getPos() { return str->getPos(); }
+  virtual void setPos(Guint pos, int dir = 0);
+  virtual BaseStream *getBaseStream() { return str->getBaseStream(); }
+  virtual Stream *getUndecodedStream() { return str->getUndecodedStream(); }
+  virtual Dict *getDict() { return str->getDict(); }
+  virtual Stream *getNextStream() { return str; }
+
+  virtual int getUnfilteredChar () { return str->getUnfilteredChar(); }
+  virtual void unfilteredReset () { str->unfilteredReset(); }
+
+protected:
+
+  Stream *str;
+};
+
+//------------------------------------------------------------------------
+// ImageStream
+//------------------------------------------------------------------------
+
+class ImageStream {
+public:
+
+  // Create an image stream object for an image with the specified
+  // parameters.  Note that these are the actual image parameters,
+  // which may be different from the predictor parameters.
+  ImageStream(Stream *strA, int widthA, int nCompsA, int nBitsA);
+
+  ~ImageStream();
+
+  // Reset the stream.
+  void reset();
+
+  // Close the stream previously reset
+  void close();
+
+  // Gets the next pixel from the stream.  <pix> should be able to hold
+  // at least nComps elements.  Returns false at end of file.
+  GBool getPixel(Guchar *pix);
+
+  // Returns a pointer to the next line of pixels.  Returns NULL at
+  // end of file.
+  Guchar *getLine();
+
+  // Skip an entire line from the image.
+  void skipLine();
+
+private:
+
+  Stream *str;                 // base stream
+  int width;                   // pixels per line
+  int nComps;                  // components per pixel
+  int nBits;                   // bits per component
+  int nVals;                   // components per line
+  int inputLineSize;           // input line buffer size
+  Guchar *inputLine;           // input line buffer
+  Guchar *imgLine;             // line buffer
+  int imgIdx;                  // current index in imgLine
+};
+
+//------------------------------------------------------------------------
+// StreamPredictor
+//------------------------------------------------------------------------
+
+class StreamPredictor {
+public:
+
+  // Create a predictor object.  Note that the parameters are for the
+  // predictor, and may not match the actual image parameters.
+  StreamPredictor(Stream *strA, int predictorA,
+                 int widthA, int nCompsA, int nBitsA);
+
+  ~StreamPredictor();
+
+  GBool isOk() { return ok; }
+
+  int lookChar();
+  int getChar();
+  int getChars(int nChars, Guchar *buffer);
+
+private:
+
+  GBool getNextLine();
+
+  Stream *str;                 // base stream
+  int predictor;               // predictor
+  int width;                   // pixels per line
+  int nComps;                  // components per pixel
+  int nBits;                   // bits per component
+  int nVals;                   // components per line
+  int pixBytes;                        // bytes per pixel
+  int rowBytes;                        // bytes per line
+  Guchar *predLine;            // line buffer
+  int predIdx;                 // current index in predLine
+  GBool ok;
+};
+
+//------------------------------------------------------------------------
+// FileStream
+//------------------------------------------------------------------------
+
+#define fileStreamBufSize 256
+
+class FileStream: public BaseStream {
+public:
+
+  FileStream(FILE *fA, Guint startA, GBool limitedA,
+            Guint lengthA, Object *dictA);
+  virtual ~FileStream();
+  virtual Stream *makeSubStream(Guint startA, GBool limitedA,
+                               Guint lengthA, Object *dictA);
+  virtual StreamKind getKind() { return strFile; }
+  virtual void reset();
+  virtual void close();
+  virtual int getChar()
+    { return (bufPtr >= bufEnd && !fillBuf()) ? EOF : (*bufPtr++ & 0xff); }
+  virtual int lookChar()
+    { return (bufPtr >= bufEnd && !fillBuf()) ? EOF : (*bufPtr & 0xff); }
+  virtual int getPos() { return bufPos + (bufPtr - buf); }
+  virtual void setPos(Guint pos, int dir = 0);
+  virtual Guint getStart() { return start; }
+  virtual void moveStart(int delta);
+
+  virtual int getUnfilteredChar () { return getChar(); }
+  virtual void unfilteredReset () { reset(); }
+
+private:
+
+  GBool fillBuf();
+  
+  virtual GBool hasGetChars() { return true; }
+  virtual int getChars(int nChars, Guchar *buffer)
+    {
+      int n, m;
+
+      n = 0;
+      while (n < nChars) {
+        if (bufPtr >= bufEnd) {
+          if (!fillBuf()) {
+            break;
+          }
+        }
+        m = (int)(bufEnd - bufPtr);
+        if (m > nChars - n) {
+          m = nChars - n;
+        }
+        memcpy(buffer + n, bufPtr, m);
+        bufPtr += m;
+        n += m;
+      }
+      return n;
+    }
+
+  FILE *f;
+  Guint start;
+  GBool limited;
+  char buf[fileStreamBufSize];
+  char *bufPtr;
+  char *bufEnd;
+  Guint bufPos;
+  int savePos;
+  GBool saved;
+};
+
+//------------------------------------------------------------------------
+// CachedFileStream
+//------------------------------------------------------------------------
+
+#define cachedStreamBufSize 1024
+
+class CachedFileStream: public BaseStream {
+public:
+
+  CachedFileStream(CachedFile *ccA, Guint startA, GBool limitedA,
+            Guint lengthA, Object *dictA);
+  virtual ~CachedFileStream();
+  virtual Stream *makeSubStream(Guint startA, GBool limitedA,
+                               Guint lengthA, Object *dictA);
+  virtual StreamKind getKind() { return strCachedFile; }
+  virtual void reset();
+  virtual void close();
+  virtual int getChar()
+    { return (bufPtr >= bufEnd && !fillBuf()) ? EOF : (*bufPtr++ & 0xff); }
+  virtual int lookChar()
+    { return (bufPtr >= bufEnd && !fillBuf()) ? EOF : (*bufPtr & 0xff); }
+  virtual int getPos() { return bufPos + (bufPtr - buf); }
+  virtual void setPos(Guint pos, int dir = 0);
+  virtual Guint getStart() { return start; }
+  virtual void moveStart(int delta);
+
+  virtual int getUnfilteredChar () { return getChar(); }
+  virtual void unfilteredReset () { reset(); }
+
+private:
+
+  GBool fillBuf();
+
+  CachedFile *cc;
+  Guint start;
+  GBool limited;
+  char buf[cachedStreamBufSize];
+  char *bufPtr;
+  char *bufEnd;
+  Guint bufPos;
+  int savePos;
+  GBool saved;
+};
+
+
+//------------------------------------------------------------------------
+// MemStream
+//------------------------------------------------------------------------
+
+class MemStream: public BaseStream {
+public:
+
+  MemStream(char *bufA, Guint startA, Guint lengthA, Object *dictA);
+  virtual ~MemStream();
+  virtual Stream *makeSubStream(Guint start, GBool limited,
+                               Guint lengthA, Object *dictA);
+  virtual StreamKind getKind() { return strWeird; }
+  virtual void reset();
+  virtual void close();
+  virtual int getChar()
+    { return (bufPtr < bufEnd) ? (*bufPtr++ & 0xff) : EOF; }
+  virtual int lookChar()
+    { return (bufPtr < bufEnd) ? (*bufPtr & 0xff) : EOF; }
+  virtual int getPos() { return (int)(bufPtr - buf); }
+  virtual void setPos(Guint pos, int dir = 0);
+  virtual Guint getStart() { return start; }
+  virtual void moveStart(int delta);
+
+  //if needFree = true, the stream will delete buf when it is destroyed
+  //otherwise it will not touch it. Default value is false
+  virtual void setNeedFree (GBool val) { needFree = val; }
+
+  virtual int getUnfilteredChar () { return getChar(); }
+  virtual void unfilteredReset () { reset (); } 
+
+private:
+
+  virtual GBool hasGetChars() { return true; }
+  virtual int getChars(int nChars, Guchar *buffer);
+
+  char *buf;
+  Guint start;
+  char *bufEnd;
+  char *bufPtr;
+  GBool needFree;
+};
+
+//------------------------------------------------------------------------
+// EmbedStream
+//
+// This is a special stream type used for embedded streams (inline
+// images).  It reads directly from the base stream -- after the
+// EmbedStream is deleted, reads from the base stream will proceed where
+// the BaseStream left off.  Note that this is very different behavior
+// that creating a new FileStream (using makeSubStream).
+//------------------------------------------------------------------------
+
+class EmbedStream: public BaseStream {
+public:
+
+  EmbedStream(Stream *strA, Object *dictA, GBool limitedA, Guint lengthA);
+  virtual ~EmbedStream();
+  virtual Stream *makeSubStream(Guint start, GBool limitedA,
+                               Guint lengthA, Object *dictA);
+  virtual StreamKind getKind() { return str->getKind(); }
+  virtual void reset() {}
+  virtual int getChar();
+  virtual int lookChar();
+  virtual int getPos() { return str->getPos(); }
+  virtual void setPos(Guint pos, int dir = 0);
+  virtual Guint getStart();
+  virtual void moveStart(int delta);
+
+  virtual int getUnfilteredChar () { return str->getUnfilteredChar(); }
+  virtual void unfilteredReset () { str->unfilteredReset(); }
+
+
+private:
+
+  virtual GBool hasGetChars() { return true; }
+  virtual int getChars(int nChars, Guchar *buffer);
+
+  Stream *str;
+  GBool limited;
+};
+
+//------------------------------------------------------------------------
+// ASCIIHexStream
+//------------------------------------------------------------------------
+
+class ASCIIHexStream: public FilterStream {
+public:
+
+  ASCIIHexStream(Stream *strA);
+  virtual ~ASCIIHexStream();
+  virtual StreamKind getKind() { return strASCIIHex; }
+  virtual void reset();
+  virtual int getChar()
+    { int c = lookChar(); buf = EOF; return c; }
+  virtual int lookChar();
+  virtual GooString *getPSFilter(int psLevel, const char *indent);
+  virtual GBool isBinary(GBool last = gTrue);
+
+private:
+
+  int buf;
+  GBool eof;
+};
+
+//------------------------------------------------------------------------
+// ASCII85Stream
+//------------------------------------------------------------------------
+
+class ASCII85Stream: public FilterStream {
+public:
+
+  ASCII85Stream(Stream *strA);
+  virtual ~ASCII85Stream();
+  virtual StreamKind getKind() { return strASCII85; }
+  virtual void reset();
+  virtual int getChar()
+    { int ch = lookChar(); ++index; return ch; }
+  virtual int lookChar();
+  virtual GooString *getPSFilter(int psLevel, const char *indent);
+  virtual GBool isBinary(GBool last = gTrue);
+
+private:
+
+  int c[5];
+  int b[4];
+  int index, n;
+  GBool eof;
+};
+
+//------------------------------------------------------------------------
+// LZWStream
+//------------------------------------------------------------------------
+
+class LZWStream: public FilterStream {
+public:
+
+  LZWStream(Stream *strA, int predictor, int columns, int colors,
+           int bits, int earlyA);
+  virtual ~LZWStream();
+  virtual StreamKind getKind() { return strLZW; }
+  virtual void reset();
+  virtual int getChar();
+  virtual int lookChar();
+  virtual int getRawChar();
+  virtual void getRawChars(int nChars, int *buffer);
+  virtual GooString *getPSFilter(int psLevel, const char *indent);
+  virtual GBool isBinary(GBool last = gTrue);
+
+private:
+
+  virtual GBool hasGetChars() { return true; }
+  virtual int getChars(int nChars, Guchar *buffer);
+
+  inline int doGetRawChar() {
+    if (eof) {
+      return EOF;
+    }
+    if (seqIndex >= seqLength) {
+      if (!processNextCode()) {
+        return EOF;
+      }
+    }
+    return seqBuf[seqIndex++];
+  }
+
+  StreamPredictor *pred;       // predictor
+  int early;                   // early parameter
+  GBool eof;                   // true if at eof
+  int inputBuf;                        // input buffer
+  int inputBits;               // number of bits in input buffer
+  struct {                     // decoding table
+    int length;
+    int head;
+    Guchar tail;
+  } table[4097];
+  int nextCode;                        // next code to be used
+  int nextBits;                        // number of bits in next code word
+  int prevCode;                        // previous code used in stream
+  int newChar;                 // next char to be added to table
+  Guchar seqBuf[4097];         // buffer for current sequence
+  int seqLength;               // length of current sequence
+  int seqIndex;                        // index into current sequence
+  GBool first;                 // first code after a table clear
+
+  GBool processNextCode();
+  void clearTable();
+  int getCode();
+};
+
+//------------------------------------------------------------------------
+// RunLengthStream
+//------------------------------------------------------------------------
+
+class RunLengthStream: public FilterStream {
+public:
+
+  RunLengthStream(Stream *strA);
+  virtual ~RunLengthStream();
+  virtual StreamKind getKind() { return strRunLength; }
+  virtual void reset();
+  virtual int getChar()
+    { return (bufPtr >= bufEnd && !fillBuf()) ? EOF : (*bufPtr++ & 0xff); }
+  virtual int lookChar()
+    { return (bufPtr >= bufEnd && !fillBuf()) ? EOF : (*bufPtr & 0xff); }
+  virtual GooString *getPSFilter(int psLevel, const char *indent);
+  virtual GBool isBinary(GBool last = gTrue);
+
+private:
+
+  virtual GBool hasGetChars() { return true; }
+  virtual int getChars(int nChars, Guchar *buffer);
+
+  char buf[128];               // buffer
+  char *bufPtr;                        // next char to read
+  char *bufEnd;                        // end of buffer
+  GBool eof;
+
+  GBool fillBuf();
+};
+
+//------------------------------------------------------------------------
+// CCITTFaxStream
+//------------------------------------------------------------------------
+
+struct CCITTCodeTable;
+
+class CCITTFaxStream: public FilterStream {
+public:
+
+  CCITTFaxStream(Stream *strA, int encodingA, GBool endOfLineA,
+                GBool byteAlignA, int columnsA, int rowsA,
+                GBool endOfBlockA, GBool blackA);
+  virtual ~CCITTFaxStream();
+  virtual StreamKind getKind() { return strCCITTFax; }
+  virtual void reset();
+  virtual int getChar()
+    { int c = lookChar(); buf = EOF; return c; }
+  virtual int lookChar();
+  virtual GooString *getPSFilter(int psLevel, const char *indent);
+  virtual GBool isBinary(GBool last = gTrue);
+
+  virtual void unfilteredReset ();
+
+private:
+
+  void ccittReset(GBool unfiltered);
+  int encoding;                        // 'K' parameter
+  GBool endOfLine;             // 'EndOfLine' parameter
+  GBool byteAlign;             // 'EncodedByteAlign' parameter
+  int columns;                 // 'Columns' parameter
+  int rows;                    // 'Rows' parameter
+  GBool endOfBlock;            // 'EndOfBlock' parameter
+  GBool black;                 // 'BlackIs1' parameter
+  GBool eof;                   // true if at eof
+  GBool nextLine2D;            // true if next line uses 2D encoding
+  int row;                     // current row
+  Guint inputBuf;              // input buffer
+  int inputBits;               // number of bits in input buffer
+  int *codingLine;             // coding line changing elements
+  int *refLine;                        // reference line changing elements
+  int a0i;                     // index into codingLine
+  GBool err;                   // error on current line
+  int outputBits;              // remaining ouput bits
+  int buf;                     // character buffer
+
+  void addPixels(int a1, int blackPixels);
+  void addPixelsNeg(int a1, int blackPixels);
+  short getTwoDimCode();
+  short getWhiteCode();
+  short getBlackCode();
+  short lookBits(int n);
+  void eatBits(int n) { if ((inputBits -= n) < 0) inputBits = 0; }
+};
+
+#ifndef ENABLE_LIBJPEG
+//------------------------------------------------------------------------
+// DCTStream
+//------------------------------------------------------------------------
+
+// DCT component info
+struct DCTCompInfo {
+  int id;                      // component ID
+  int hSample, vSample;                // horiz/vert sampling resolutions
+  int quantTable;              // quantization table number
+  int prevDC;                  // DC coefficient accumulator
+};
+
+struct DCTScanInfo {
+  GBool comp[4];               // comp[i] is set if component i is
+                               //   included in this scan
+  int numComps;                        // number of components in the scan
+  int dcHuffTable[4];          // DC Huffman table numbers
+  int acHuffTable[4];          // AC Huffman table numbers
+  int firstCoeff, lastCoeff;   // first and last DCT coefficient
+  int ah, al;                  // successive approximation parameters
+};
+
+// DCT Huffman decoding table
+struct DCTHuffTable {
+  Guchar firstSym[17];         // first symbol for this bit length
+  Gushort firstCode[17];       // first code for this bit length
+  Gushort numCodes[17];                // number of codes of this bit length
+  Guchar sym[256];             // symbols
+};
+
+class DCTStream: public FilterStream {
+public:
+
+  DCTStream(Stream *strA, int colorXformA);
+  virtual ~DCTStream();
+  virtual StreamKind getKind() { return strDCT; }
+  virtual void reset();
+  virtual void close();
+  virtual int getChar();
+  virtual int lookChar();
+  virtual GooString *getPSFilter(int psLevel, const char *indent);
+  virtual GBool isBinary(GBool last = gTrue);
+
+  virtual void unfilteredReset();
+
+private:
+
+  void dctReset(GBool unfiltered);  
+  GBool progressive;           // set if in progressive mode
+  GBool interleaved;           // set if in interleaved mode
+  int width, height;           // image size
+  int mcuWidth, mcuHeight;     // size of min coding unit, in data units
+  int bufWidth, bufHeight;     // frameBuf size
+  DCTCompInfo compInfo[4];     // info for each component
+  DCTScanInfo scanInfo;                // info for the current scan
+  int numComps;                        // number of components in image
+  int colorXform;              // color transform: -1 = unspecified
+                               //                   0 = none
+                               //                   1 = YUV/YUVK -> RGB/CMYK
+  GBool gotJFIFMarker;         // set if APP0 JFIF marker was present
+  GBool gotAdobeMarker;                // set if APP14 Adobe marker was present
+  int restartInterval;         // restart interval, in MCUs
+  Gushort quantTables[4][64];  // quantization tables
+  int numQuantTables;          // number of quantization tables
+  DCTHuffTable dcHuffTables[4];        // DC Huffman tables
+  DCTHuffTable acHuffTables[4];        // AC Huffman tables
+  int numDCHuffTables;         // number of DC Huffman tables
+  int numACHuffTables;         // number of AC Huffman tables
+  Guchar *rowBuf[4][32];       // buffer for one MCU (non-progressive mode)
+  int *frameBuf[4];            // buffer for frame (progressive mode)
+  int comp, x, y, dy;          // current position within image/MCU
+  int restartCtr;              // MCUs left until restart
+  int restartMarker;           // next restart marker
+  int eobRun;                  // number of EOBs left in the current run
+  int inputBuf;                        // input buffer for variable length codes
+  int inputBits;               // number of valid bits in input buffer
+
+  void restart();
+  GBool readMCURow();
+  void readScan();
+  GBool readDataUnit(DCTHuffTable *dcHuffTable,
+                    DCTHuffTable *acHuffTable,
+                    int *prevDC, int data[64]);
+  GBool readProgressiveDataUnit(DCTHuffTable *dcHuffTable,
+                               DCTHuffTable *acHuffTable,
+                               int *prevDC, int data[64]);
+  void decodeImage();
+  void transformDataUnit(Gushort *quantTable,
+                        int dataIn[64], Guchar dataOut[64]);
+  int readHuffSym(DCTHuffTable *table);
+  int readAmp(int size);
+  int readBit();
+  GBool readHeader();
+  GBool readBaselineSOF();
+  GBool readProgressiveSOF();
+  GBool readScanInfo();
+  GBool readQuantTables();
+  GBool readHuffmanTables();
+  GBool readRestartInterval();
+  GBool readJFIFMarker();
+  GBool readAdobeMarker();
+  GBool readTrailer();
+  int readMarker();
+  int read16();
+};
+
+#endif
+
+#ifndef ENABLE_ZLIB
+//------------------------------------------------------------------------
+// FlateStream
+//------------------------------------------------------------------------
+
+#define flateWindow          32768    // buffer size
+#define flateMask            (flateWindow-1)
+#define flateMaxHuffman         15    // max Huffman code length
+#define flateMaxCodeLenCodes    19    // max # code length codes
+#define flateMaxLitCodes       288    // max # literal codes
+#define flateMaxDistCodes       30    // max # distance codes
+
+// Huffman code table entry
+struct FlateCode {
+  Gushort len;                 // code length, in bits
+  Gushort val;                 // value represented by this code
+};
+
+struct FlateHuffmanTab {
+  FlateCode *codes;
+  int maxLen;
+};
+
+// Decoding info for length and distance code words
+struct FlateDecode {
+  int bits;                    // # extra bits
+  int first;                   // first length/distance
+};
+
+class FlateStream: public FilterStream {
+public:
+
+  FlateStream(Stream *strA, int predictor, int columns,
+             int colors, int bits);
+  virtual ~FlateStream();
+  virtual StreamKind getKind() { return strFlate; }
+  virtual void reset();
+  virtual int getChar();
+  virtual int lookChar();
+  virtual int getRawChar();
+  virtual void getRawChars(int nChars, int *buffer);
+  virtual GooString *getPSFilter(int psLevel, const char *indent);
+  virtual GBool isBinary(GBool last = gTrue);
+  virtual void unfilteredReset ();
+
+private:
+  inline int doGetRawChar() {
+    int c;
+
+    while (remain == 0) {
+      if (endOfBlock && eof)
+        return EOF;
+      readSome();
+    }
+    c = buf[index];
+    index = (index + 1) & flateMask;
+    --remain;
+    return c;
+  }
+
+  virtual GBool hasGetChars() { return true; }
+  virtual int getChars(int nChars, Guchar *buffer);
+
+  StreamPredictor *pred;       // predictor
+  Guchar buf[flateWindow];     // output data buffer
+  int index;                   // current index into output buffer
+  int remain;                  // number valid bytes in output buffer
+  int codeBuf;                 // input buffer
+  int codeSize;                        // number of bits in input buffer
+  int                          // literal and distance code lengths
+    codeLengths[flateMaxLitCodes + flateMaxDistCodes];
+  FlateHuffmanTab litCodeTab;  // literal code table
+  FlateHuffmanTab distCodeTab; // distance code table
+  GBool compressedBlock;       // set if reading a compressed block
+  int blockLen;                        // remaining length of uncompressed block
+  GBool endOfBlock;            // set when end of block is reached
+  GBool eof;                   // set when end of stream is reached
+
+  static int                   // code length code reordering
+    codeLenCodeMap[flateMaxCodeLenCodes];
+  static FlateDecode           // length decoding info
+    lengthDecode[flateMaxLitCodes-257];
+  static FlateDecode           // distance decoding info
+    distDecode[flateMaxDistCodes];
+  static FlateHuffmanTab       // fixed literal code table
+    fixedLitCodeTab;
+  static FlateHuffmanTab       // fixed distance code table
+    fixedDistCodeTab;
+
+  void readSome();
+  GBool startBlock();
+  void loadFixedCodes();
+  GBool readDynamicCodes();
+  void compHuffmanCodes(int *lengths, int n, FlateHuffmanTab *tab);
+  int getHuffmanCodeWord(FlateHuffmanTab *tab);
+  int getCodeWord(int bits);
+};
+#endif
+
+//------------------------------------------------------------------------
+// EOFStream
+//------------------------------------------------------------------------
+
+class EOFStream: public FilterStream {
+public:
+
+  EOFStream(Stream *strA);
+  virtual ~EOFStream();
+  virtual StreamKind getKind() { return strWeird; }
+  virtual void reset() {}
+  virtual int getChar() { return EOF; }
+  virtual int lookChar() { return EOF; }
+  virtual GooString *getPSFilter(int /*psLevel*/, const char * /*indent*/)  { return NULL; }
+  virtual GBool isBinary(GBool /*last = gTrue*/) { return gFalse; }
+};
+
+//------------------------------------------------------------------------
+// BufStream
+//------------------------------------------------------------------------
+
+class BufStream: public FilterStream {
+public:
+
+  BufStream(Stream *strA, int bufSizeA);
+  virtual ~BufStream();
+  virtual StreamKind getKind() { return strWeird; }
+  virtual void reset();
+  virtual int getChar();
+  virtual int lookChar();
+  virtual GooString *getPSFilter(int psLevel, const char *indent)
+    { return NULL; }
+  virtual GBool isBinary(GBool last = gTrue);
+
+  int lookChar(int idx);
+
+private:
+
+  int *buf;
+  int bufSize;
+};
+
+//------------------------------------------------------------------------
+// FixedLengthEncoder
+//------------------------------------------------------------------------
+
+class FixedLengthEncoder: public FilterStream {
+public:
+
+  FixedLengthEncoder(Stream *strA, int lengthA);
+  ~FixedLengthEncoder();
+  virtual StreamKind getKind() { return strWeird; }
+  virtual void reset();
+  virtual int getChar();
+  virtual int lookChar();
+  virtual GooString *getPSFilter(int /*psLevel*/, const char * /*indent*/) { return NULL; }
+  virtual GBool isBinary(GBool /*last = gTrue*/);
+  virtual GBool isEncoder() { return gTrue; }
+
+private:
+
+  int length;
+  int count;
+};
+
+//------------------------------------------------------------------------
+// ASCIIHexEncoder
+//------------------------------------------------------------------------
+
+class ASCIIHexEncoder: public FilterStream {
+public:
+
+  ASCIIHexEncoder(Stream *strA);
+  virtual ~ASCIIHexEncoder();
+  virtual StreamKind getKind() { return strWeird; }
+  virtual void reset();
+  virtual int getChar()
+    { return (bufPtr >= bufEnd && !fillBuf()) ? EOF : (*bufPtr++ & 0xff); }
+  virtual int lookChar()
+    { return (bufPtr >= bufEnd && !fillBuf()) ? EOF : (*bufPtr & 0xff); }
+  virtual GooString *getPSFilter(int /*psLevel*/, const char * /*indent*/) { return NULL; }
+  virtual GBool isBinary(GBool /*last = gTrue*/) { return gFalse; }
+  virtual GBool isEncoder() { return gTrue; }
+
+private:
+
+  char buf[4];
+  char *bufPtr;
+  char *bufEnd;
+  int lineLen;
+  GBool eof;
+
+  GBool fillBuf();
+};
+
+//------------------------------------------------------------------------
+// ASCII85Encoder
+//------------------------------------------------------------------------
+
+class ASCII85Encoder: public FilterStream {
+public:
+
+  ASCII85Encoder(Stream *strA);
+  virtual ~ASCII85Encoder();
+  virtual StreamKind getKind() { return strWeird; }
+  virtual void reset();
+  virtual int getChar()
+    { return (bufPtr >= bufEnd && !fillBuf()) ? EOF : (*bufPtr++ & 0xff); }
+  virtual int lookChar()
+    { return (bufPtr >= bufEnd && !fillBuf()) ? EOF : (*bufPtr & 0xff); }
+  virtual GooString *getPSFilter(int /*psLevel*/, const char * /*indent*/) { return NULL; }
+  virtual GBool isBinary(GBool /*last = gTrue*/) { return gFalse; }
+  virtual GBool isEncoder() { return gTrue; }
+
+private:
+
+  char buf[8];
+  char *bufPtr;
+  char *bufEnd;
+  int lineLen;
+  GBool eof;
+
+  GBool fillBuf();
+};
+
+//------------------------------------------------------------------------
+// RunLengthEncoder
+//------------------------------------------------------------------------
+
+class RunLengthEncoder: public FilterStream {
+public:
+
+  RunLengthEncoder(Stream *strA);
+  virtual ~RunLengthEncoder();
+  virtual StreamKind getKind() { return strWeird; }
+  virtual void reset();
+  virtual int getChar()
+    { return (bufPtr >= bufEnd && !fillBuf()) ? EOF : (*bufPtr++ & 0xff); }
+  virtual int lookChar()
+    { return (bufPtr >= bufEnd && !fillBuf()) ? EOF : (*bufPtr & 0xff); }
+  virtual GooString *getPSFilter(int /*psLevel*/, const char * /*indent*/) { return NULL; }
+  virtual GBool isBinary(GBool /*last = gTrue*/) { return gTrue; }
+  virtual GBool isEncoder() { return gTrue; }
+
+private:
+
+  char buf[131];
+  char *bufPtr;
+  char *bufEnd;
+  char *nextEnd;
+  GBool eof;
+
+  GBool fillBuf();
+};
+
+//------------------------------------------------------------------------
+// CMYKGrayEncoder
+//------------------------------------------------------------------------
+
+class CMYKGrayEncoder: public FilterStream {
+public:
+
+  CMYKGrayEncoder(Stream *strA);
+  virtual ~CMYKGrayEncoder();
+  virtual StreamKind getKind() { return strWeird; }
+  virtual void reset();
+  virtual int getChar()
+    { return (bufPtr >= bufEnd && !fillBuf()) ? EOF : (*bufPtr++ & 0xff); }
+  virtual int lookChar()
+    { return (bufPtr >= bufEnd && !fillBuf()) ? EOF : (*bufPtr & 0xff); }
+  virtual GooString *getPSFilter(int /*psLevel*/, const char * /*indent*/) { return NULL; }
+  virtual GBool isBinary(GBool /*last = gTrue*/) { return gFalse; }
+  virtual GBool isEncoder() { return gTrue; }
+
+private:
+
+  char buf[2];
+  char *bufPtr;
+  char *bufEnd;
+  GBool eof;
+
+  GBool fillBuf();
+};
+
+//------------------------------------------------------------------------
+// RGBGrayEncoder
+//------------------------------------------------------------------------
+
+class RGBGrayEncoder: public FilterStream {
+public:
+
+  RGBGrayEncoder(Stream *strA);
+  virtual ~RGBGrayEncoder();
+  virtual StreamKind getKind() { return strWeird; }
+  virtual void reset();
+  virtual int getChar()
+    { return (bufPtr >= bufEnd && !fillBuf()) ? EOF : (*bufPtr++ & 0xff); }
+  virtual int lookChar()
+    { return (bufPtr >= bufEnd && !fillBuf()) ? EOF : (*bufPtr & 0xff); }
+  virtual GooString *getPSFilter(int /*psLevel*/, const char * /*indent*/) { return NULL; }
+  virtual GBool isBinary(GBool /*last = gTrue*/) { return gFalse; }
+  virtual GBool isEncoder() { return gTrue; }
+
+private:
+
+  char buf[2];
+  char *bufPtr;
+  char *bufEnd;
+  GBool eof;
+
+  GBool fillBuf();
+};
+
+#endif
diff --git a/poppler/TextOutputDev.cc b/poppler/TextOutputDev.cc
new file mode 100644 (file)
index 0000000..e8d993b
--- /dev/null
@@ -0,0 +1,5612 @@
+//========================================================================
+//
+// TextOutputDev.cc
+//
+// Copyright 1997-2003 Glyph & Cog, LLC
+//
+//========================================================================
+
+//========================================================================
+//
+// Modified under the Poppler project - http://poppler.freedesktop.org
+//
+// All changes made under the Poppler project to this file are licensed
+// under GPL version 2 or later
+//
+// Copyright (C) 2005-2007 Kristian Høgsberg <krh@redhat.com>
+// Copyright (C) 2005 Nickolay V. Shmyrev <nshmyrev@yandex.ru>
+// Copyright (C) 2006-2008, 2011 Carlos Garcia Campos <carlosgc@gnome.org>
+// Copyright (C) 2006, 2007 Ed Catmur <ed@catmur.co.uk>
+// Copyright (C) 2006 Jeff Muizelaar <jeff@infidigm.net>
+// Copyright (C) 2007, 2008 Adrian Johnson <ajohnson@redneon.com>
+// Copyright (C) 2008 Koji Otani <sho@bbr.jp>
+// Copyright (C) 2008, 2010, 2011 Albert Astals Cid <aacid@kde.org>
+// Copyright (C) 2008 Pino Toscano <pino@kde.org>
+// Copyright (C) 2008, 2010 Hib Eris <hib@hiberis.nl>
+// Copyright (C) 2009 Ross Moore <ross@maths.mq.edu.au>
+// Copyright (C) 2009 Kovid Goyal <kovid@kovidgoyal.net>
+// Copyright (C) 2010 Brian Ewins <brian.ewins@gmail.com>
+// Copyright (C) 2010 Suzuki Toshiya <mpsuzuki@hiroshima-u.ac.jp>
+// Copyright (C) 2011 Sam Liao <phyomh@gmail.com>
+// Copyright (C) 2012 Horst Prote <prote@fmi.uni-stuttgart.de>
+//
+// To see a description of the changes please see the Changelog file that
+// came with your tarball or type make ChangeLog if you are building from git
+//
+//========================================================================
+
+#include <config.h>
+
+#ifdef USE_GCC_PRAGMAS
+#pragma implementation
+#endif
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <stddef.h>
+#include <math.h>
+#include <float.h>
+#include <ctype.h>
+#ifdef _WIN32
+#include <fcntl.h> // for O_BINARY
+#include <io.h>    // for setmode
+#endif
+#include "goo/gmem.h"
+#include "goo/GooString.h"
+#include "goo/GooList.h"
+#include "poppler-config.h"
+#include "Error.h"
+#include "GlobalParams.h"
+#include "UnicodeMap.h"
+#include "UnicodeTypeTable.h"
+#include "Link.h"
+#include "TextOutputDev.h"
+#include "Page.h"
+#include "Annot.h"
+#include "PDFDocEncoding.h"
+
+#ifdef MACOS
+// needed for setting type/creator of MacOS files
+#include "ICSupport.h"
+#endif
+
+//------------------------------------------------------------------------
+// parameters
+//------------------------------------------------------------------------
+
+// Each bucket in a text pool includes baselines within a range of
+// this many points.
+#define textPoolStep 4
+
+// Inter-character space width which will cause addChar to start a new
+// word.
+#define minWordBreakSpace 0.1
+
+// Negative inter-character space width, i.e., overlap, which will
+// cause addChar to start a new word.
+#define minDupBreakOverlap 0.2
+
+// Max distance between baselines of two lines within a block, as a
+// fraction of the font size.
+#define maxLineSpacingDelta 1.5
+
+// Max difference in primary font sizes on two lines in the same
+// block.  Delta1 is used when examining new lines above and below the
+// current block; delta2 is used when examining text that overlaps the
+// current block; delta3 is used when examining text to the left and
+// right of the current block.
+#define maxBlockFontSizeDelta1 0.05
+#define maxBlockFontSizeDelta2 0.6
+#define maxBlockFontSizeDelta3 0.2
+
+// Max difference in font sizes inside a word.
+#define maxWordFontSizeDelta 0.05
+
+// Maximum distance between baselines of two words on the same line,
+// e.g., distance between subscript or superscript and the primary
+// baseline, as a fraction of the font size.
+#define maxIntraLineDelta 0.5
+
+// Minimum inter-word spacing, as a fraction of the font size.  (Only
+// used for raw ordering.)
+#define minWordSpacing 0.15
+
+// Maximum inter-word spacing, as a fraction of the font size.
+#define maxWordSpacing 1.5
+
+// Maximum horizontal spacing which will allow a word to be pulled
+// into a block.
+#define minColSpacing1 0.3
+
+// Minimum spacing between columns, as a fraction of the font size.
+#define minColSpacing2 1.0
+
+// Maximum vertical spacing between blocks within a flow, as a
+// multiple of the font size.
+#define maxBlockSpacing 2.5
+
+// Minimum spacing between characters within a word, as a fraction of
+// the font size.
+#define minCharSpacing -0.2
+
+// Maximum spacing between characters within a word, as a fraction of
+// the font size, when there is no obvious extra-wide character
+// spacing.
+#define maxCharSpacing 0.03
+
+// When extra-wide character spacing is detected, the inter-character
+// space threshold is set to the minimum inter-character space
+// multiplied by this constant.
+#define maxWideCharSpacingMul 1.3
+
+// Upper limit on spacing between characters in a word.
+#define maxWideCharSpacing 0.4
+
+// Max difference in primary,secondary coordinates (as a fraction of
+// the font size) allowed for duplicated text (fake boldface, drop
+// shadows) which is to be discarded.
+#define dupMaxPriDelta 0.1
+#define dupMaxSecDelta 0.2
+
+// Max width of underlines (in points).
+#define maxUnderlineWidth 3
+
+// Min distance between baseline and underline (in points).
+//~ this should be font-size-dependent
+#define minUnderlineGap -2
+
+// Max distance between baseline and underline (in points).
+//~ this should be font-size-dependent
+#define maxUnderlineGap 4
+
+// Max horizontal distance between edge of word and start of underline
+// (in points).
+//~ this should be font-size-dependent
+#define underlineSlack 1
+
+// Max distance between edge of text and edge of link border
+#define hyperlinkSlack 2
+
+//------------------------------------------------------------------------
+// TextUnderline
+//------------------------------------------------------------------------
+
+class TextUnderline {
+public:
+
+  TextUnderline(double x0A, double y0A, double x1A, double y1A)
+    { x0 = x0A; y0 = y0A; x1 = x1A; y1 = y1A; horiz = y0 == y1; }
+  ~TextUnderline() {}
+
+  double x0, y0, x1, y1;
+  GBool horiz;
+};
+
+//------------------------------------------------------------------------
+// TextLink
+//------------------------------------------------------------------------
+
+class TextLink {
+public:
+
+  TextLink(int xMinA, int yMinA, int xMaxA, int yMaxA, AnnotLink *linkA)
+    { xMin = xMinA; yMin = yMinA; xMax = xMaxA; yMax = yMaxA; link = linkA; }
+  ~TextLink() {}
+
+  int xMin, yMin, xMax, yMax;
+  AnnotLink *link;
+};
+
+//------------------------------------------------------------------------
+// TextFontInfo
+//------------------------------------------------------------------------
+
+TextFontInfo::TextFontInfo(GfxState *state) {
+  gfxFont = state->getFont();
+  if (gfxFont)
+    gfxFont->incRefCnt();
+#if TEXTOUT_WORD_LIST
+  fontName = (gfxFont && gfxFont->getName()) ? gfxFont->getName()->copy()
+                                             : (GooString *)NULL;
+  flags = gfxFont ? gfxFont->getFlags() : 0;
+#endif
+}
+
+TextFontInfo::~TextFontInfo() {
+  if (gfxFont)
+    gfxFont->decRefCnt();
+#if TEXTOUT_WORD_LIST
+  if (fontName) {
+    delete fontName;
+  }
+#endif
+}
+
+GBool TextFontInfo::matches(GfxState *state) {
+  return state->getFont() == gfxFont;
+}
+
+GBool TextFontInfo::matches(TextFontInfo *fontInfo) {
+  return gfxFont == fontInfo->gfxFont;
+}
+
+//------------------------------------------------------------------------
+// TextWord
+//------------------------------------------------------------------------
+
+TextWord::TextWord(GfxState *state, int rotA, double x0, double y0,
+                  TextFontInfo *fontA, double fontSizeA) {
+  GfxFont *gfxFont;
+  double x, y, ascent, descent;
+  int wMode;
+  
+  rot = rotA;
+  font = fontA;
+  fontSize = fontSizeA;
+  state->transform(x0, y0, &x, &y);
+  if ((gfxFont = font->gfxFont)) {
+    ascent = gfxFont->getAscent() * fontSize;
+    descent = gfxFont->getDescent() * fontSize;
+    wMode = gfxFont->getWMode();
+  } else {
+    // this means that the PDF file draws text without a current font,
+    // which should never happen
+    ascent = 0.95 * fontSize;
+    descent = -0.35 * fontSize;
+    wMode = 0;
+  }
+  if (wMode) { // vertical writing mode
+    // NB: the rotation value has been incremented by 1 (in
+    // TextPage::beginWord()) for vertical writing mode
+    switch (rot) {
+    case 0:
+      yMin = y - fontSize;
+      yMax = y;
+      base = y;
+      break;
+    case 1:
+      xMin = x;
+      xMax = x + fontSize;
+      base = x;
+      break;
+    case 2:
+      yMin = y;
+      yMax = y + fontSize;
+      base = y;
+      break;
+    case 3:
+      xMin = x - fontSize;
+      xMax = x;
+      base = x;
+      break;
+    }
+  } else { // horizontal writing mode
+    switch (rot) {
+    case 0:
+      yMin = y - ascent;
+      yMax = y - descent;
+      if (yMin == yMax) {
+       // this is a sanity check for a case that shouldn't happen -- but
+       // if it does happen, we want to avoid dividing by zero later
+       yMin = y;
+       yMax = y + 1;
+      }
+      base = y;
+      break;
+    case 1:
+      xMin = x + descent;
+      xMax = x + ascent;
+      if (xMin == xMax) {
+       // this is a sanity check for a case that shouldn't happen -- but
+       // if it does happen, we want to avoid dividing by zero later
+       xMin = x;
+       xMax = x + 1;
+      }
+      base = x;
+      break;
+    case 2:
+      yMin = y + descent;
+      yMax = y + ascent;
+      if (yMin == yMax) {
+       // this is a sanity check for a case that shouldn't happen -- but
+       // if it does happen, we want to avoid dividing by zero later
+       yMin = y;
+       yMax = y + 1;
+      }
+      base = y;
+      break;
+    case 3:
+      xMin = x - ascent;
+      xMax = x - descent;
+      if (xMin == xMax) {
+       // this is a sanity check for a case that shouldn't happen -- but
+       // if it does happen, we want to avoid dividing by zero later
+       xMin = x;
+       xMax = x + 1;
+      }
+      base = x;
+      break;
+    }
+  }
+  text = NULL;
+  charcode = NULL;
+  edge = NULL;
+  charPos = NULL;
+  len = size = 0;
+  spaceAfter = gFalse;
+  next = NULL;
+
+#if TEXTOUT_WORD_LIST
+  GfxRGB rgb;
+
+  if ((state->getRender() & 3) == 1) {
+    state->getStrokeRGB(&rgb);
+  } else {
+    state->getFillRGB(&rgb);
+  }
+  colorR = colToDbl(rgb.r);
+  colorG = colToDbl(rgb.g);
+  colorB = colToDbl(rgb.b);
+#endif
+
+  underlined = gFalse;
+  link = NULL;
+}
+
+TextWord::~TextWord() {
+  gfree(text);
+  gfree(charcode);
+  gfree(edge);
+  gfree(charPos);
+}
+
+void TextWord::addChar(GfxState *state, double x, double y,
+                      double dx, double dy, int charPosA, int charLen,
+                      CharCode c, Unicode u) {
+  int wMode;
+
+  if (len == size) {
+    size += 16;
+    text = (Unicode *)greallocn(text, size, sizeof(Unicode));
+    charcode = (Unicode *)greallocn(charcode, size, sizeof(CharCode));
+    edge = (double *)greallocn(edge, (size + 1), sizeof(double));
+    charPos = (int *)greallocn(charPos, size + 1, sizeof(int));
+  }
+  text[len] = u;
+  charcode[len] = c;
+  charPos[len] = charPosA;
+  charPos[len + 1] = charPosA + charLen;
+  wMode = font->gfxFont ? font->gfxFont->getWMode() : 0;
+  if (wMode) { // vertical writing mode
+    // NB: the rotation value has been incremented by 1 (in
+    // TextPage::beginWord()) for vertical writing mode
+    switch (rot) {
+    case 0:
+      if (len == 0) {
+       xMin = x - fontSize;
+      }
+      edge[len] = x - fontSize;
+      xMax = edge[len+1] = x;
+      break;
+    case 1:
+      if (len == 0) {
+       yMin = y - fontSize;
+      }
+      edge[len] = y - fontSize;
+      yMax = edge[len+1] = y;
+      break;
+    case 2:
+      if (len == 0) {
+       xMax = x + fontSize;
+      }
+      edge[len] = x + fontSize;
+      xMin = edge[len+1] = x;
+      break;
+    case 3:
+      if (len == 0) {
+       yMax = y + fontSize;
+      }
+      edge[len] = y + fontSize;
+      yMin = edge[len+1] = y;
+      break;
+    }
+  } else { // horizontal writing mode
+    switch (rot) {
+    case 0:
+      if (len == 0) {
+       xMin = x;
+      }
+      edge[len] = x;
+      xMax = edge[len+1] = x + dx;
+      break;
+    case 1:
+      if (len == 0) {
+       yMin = y;
+      }
+      edge[len] = y;
+      yMax = edge[len+1] = y + dy;
+      break;
+    case 2:
+      if (len == 0) {
+       xMax = x;
+      }
+      edge[len] = x;
+      xMin = edge[len+1] = x + dx;
+      break;
+    case 3:
+      if (len == 0) {
+       yMax = y;
+      }
+      edge[len] = y;
+      yMin = edge[len+1] = y + dy;
+      break;
+   }
+  }
+  ++len;
+}
+
+void TextWord::merge(TextWord *word) {
+  int i;
+
+  if (word->xMin < xMin) {
+    xMin = word->xMin;
+  }
+  if (word->yMin < yMin) {
+    yMin = word->yMin;
+  }
+  if (word->xMax > xMax) {
+    xMax = word->xMax;
+  }
+  if (word->yMax > yMax) {
+    yMax = word->yMax;
+  }
+  if (len + word->len > size) {
+    size = len + word->len;
+    text = (Unicode *)greallocn(text, size, sizeof(Unicode));
+    charcode = (CharCode *)greallocn(charcode, (size + 1), sizeof(CharCode));
+    edge = (double *)greallocn(edge, (size + 1), sizeof(double));
+    charPos = (int *)greallocn(charPos, size + 1, sizeof(int));
+  }
+  for (i = 0; i < word->len; ++i) {
+    text[len + i] = word->text[i];
+    charcode[len + i] = word->charcode[i];
+    edge[len + i] = word->edge[i];
+    charPos[len + i] = word->charPos[i];
+  }
+  edge[len + word->len] = word->edge[word->len];
+  charPos[len + word->len] = word->charPos[word->len];
+  len += word->len;
+}
+
+inline int TextWord::primaryCmp(TextWord *word) {
+  double cmp;
+
+  cmp = 0; // make gcc happy
+  switch (rot) {
+  case 0:
+    cmp = xMin - word->xMin;
+    break;
+  case 1:
+    cmp = yMin - word->yMin;
+    break;
+  case 2:
+    cmp = word->xMax - xMax;
+    break;
+  case 3:
+    cmp = word->yMax - yMax;
+    break;
+  }
+  return cmp < 0 ? -1 : cmp > 0 ? 1 : 0;
+}
+
+double TextWord::primaryDelta(TextWord *word) {
+  double delta;
+
+  delta = 0; // make gcc happy
+  switch (rot) {
+  case 0:
+    delta = word->xMin - xMax;
+    break;
+  case 1:
+    delta = word->yMin - yMax;
+    break;
+  case 2:
+    delta = xMin - word->xMax;
+    break;
+  case 3:
+    delta = yMin - word->yMax;
+    break;
+  }
+  return delta;
+}
+
+int TextWord::cmpYX(const void *p1, const void *p2) {
+  TextWord *word1 = *(TextWord **)p1;
+  TextWord *word2 = *(TextWord **)p2;
+  double cmp;
+
+  cmp = word1->yMin - word2->yMin;
+  if (cmp == 0) {
+    cmp = word1->xMin - word2->xMin;
+  }
+  return cmp < 0 ? -1 : cmp > 0 ? 1 : 0;
+}
+
+#if TEXTOUT_WORD_LIST
+
+GooString *TextWord::getText() {
+  GooString *s;
+  UnicodeMap *uMap;
+  char buf[8];
+  int n, i;
+
+  s = new GooString();
+  if (!(uMap = globalParams->getTextEncoding())) {
+    return s;
+  }
+  for (i = 0; i < len; ++i) {
+    n = uMap->mapUnicode(text[i], buf, sizeof(buf));
+    s->append(buf, n);
+  }
+  uMap->decRefCnt();
+  return s;
+}
+
+void TextWord::getCharBBox(int charIdx, double *xMinA, double *yMinA,
+                          double *xMaxA, double *yMaxA) {
+  if (charIdx < 0 || charIdx >= len) {
+    return;
+  }
+  switch (rot) {
+  case 0:
+    *xMinA = edge[charIdx];
+    *xMaxA = edge[charIdx + 1];
+    *yMinA = yMin;
+    *yMaxA = yMax;
+    break;
+  case 1:
+    *xMinA = xMin;
+    *xMaxA = xMax;
+    *yMinA = edge[charIdx];
+    *yMaxA = edge[charIdx + 1];
+    break;
+  case 2:
+    *xMinA = edge[charIdx + 1];
+    *xMaxA = edge[charIdx];
+    *yMinA = yMin;
+    *yMaxA = yMax;
+    break;
+  case 3:
+    *xMinA = xMin;
+    *xMaxA = xMax;
+    *yMinA = edge[charIdx + 1];
+    *yMaxA = edge[charIdx];
+    break;
+  }
+}
+
+#endif // TEXTOUT_WORD_LIST
+
+//------------------------------------------------------------------------
+// TextPool
+//------------------------------------------------------------------------
+
+TextPool::TextPool() {
+  minBaseIdx = 0;
+  maxBaseIdx = -1;
+  pool = NULL;
+  cursor = NULL;
+  cursorBaseIdx = -1;
+}
+
+TextPool::~TextPool() {
+  int baseIdx;
+  TextWord *word, *word2;
+
+  for (baseIdx = minBaseIdx; baseIdx <= maxBaseIdx; ++baseIdx) {
+    for (word = pool[baseIdx - minBaseIdx]; word; word = word2) {
+      word2 = word->next;
+      delete word;
+    }
+  }
+  gfree(pool);
+}
+
+int TextPool::getBaseIdx(double base) {
+  int baseIdx;
+
+  baseIdx = (int)(base / textPoolStep);
+  if (baseIdx < minBaseIdx) {
+    return minBaseIdx;
+  }
+  if (baseIdx > maxBaseIdx) {
+    return maxBaseIdx;
+  }
+  return baseIdx;
+}
+
+void TextPool::addWord(TextWord *word) {
+  TextWord **newPool;
+  int wordBaseIdx, newMinBaseIdx, newMaxBaseIdx, baseIdx;
+  TextWord *w0, *w1;
+
+  // expand the array if needed
+  wordBaseIdx = (int)(word->base / textPoolStep);
+  if (minBaseIdx > maxBaseIdx) {
+    minBaseIdx = wordBaseIdx - 128;
+    maxBaseIdx = wordBaseIdx + 128;
+    pool = (TextWord **)gmallocn(maxBaseIdx - minBaseIdx + 1,
+                                sizeof(TextWord *));
+    for (baseIdx = minBaseIdx; baseIdx <= maxBaseIdx; ++baseIdx) {
+      pool[baseIdx - minBaseIdx] = NULL;
+    }
+  } else if (wordBaseIdx < minBaseIdx) {
+    newMinBaseIdx = wordBaseIdx - 128;
+    newPool = (TextWord **)gmallocn(maxBaseIdx - newMinBaseIdx + 1,
+                                   sizeof(TextWord *));
+    for (baseIdx = newMinBaseIdx; baseIdx < minBaseIdx; ++baseIdx) {
+      newPool[baseIdx - newMinBaseIdx] = NULL;
+    }
+    memcpy(&newPool[minBaseIdx - newMinBaseIdx], pool,
+          (maxBaseIdx - minBaseIdx + 1) * sizeof(TextWord *));
+    gfree(pool);
+    pool = newPool;
+    minBaseIdx = newMinBaseIdx;
+  } else if (wordBaseIdx > maxBaseIdx) {
+    newMaxBaseIdx = wordBaseIdx + 128;
+    pool = (TextWord **)greallocn(pool, newMaxBaseIdx - minBaseIdx + 1,
+                                 sizeof(TextWord *));
+    for (baseIdx = maxBaseIdx + 1; baseIdx <= newMaxBaseIdx; ++baseIdx) {
+      pool[baseIdx - minBaseIdx] = NULL;
+    }
+    maxBaseIdx = newMaxBaseIdx;
+  }
+
+  // insert the new word
+  if (cursor && wordBaseIdx == cursorBaseIdx &&
+      word->primaryCmp(cursor) >= 0) {
+    w0 = cursor;
+    w1 = cursor->next;
+  } else {
+    w0 = NULL;
+    w1 = pool[wordBaseIdx - minBaseIdx];
+  }
+  for (; w1 && word->primaryCmp(w1) > 0; w0 = w1, w1 = w1->next) ;
+  word->next = w1;
+  if (w0) {
+    w0->next = word;
+  } else {
+    pool[wordBaseIdx - minBaseIdx] = word;
+  }
+  cursor = word;
+  cursorBaseIdx = wordBaseIdx;
+}
+
+//------------------------------------------------------------------------
+// TextLine
+//------------------------------------------------------------------------
+
+TextLine::TextLine(TextBlock *blkA, int rotA, double baseA) {
+  blk = blkA;
+  rot = rotA;
+  base = baseA;
+  words = lastWord = NULL;
+  text = NULL;
+  edge = NULL;
+  col = NULL;
+  len = 0;
+  convertedLen = 0;
+  hyphenated = gFalse;
+  next = NULL;
+  xMin = yMin = 0;
+  xMax = yMax = -1;
+  normalized = NULL;
+  normalized_len = 0;
+  normalized_idx = NULL;
+}
+
+TextLine::~TextLine() {
+  TextWord *word;
+
+  while (words) {
+    word = words;
+    words = words->next;
+    delete word;
+  }
+  gfree(text);
+  gfree(edge);
+  gfree(col);
+  if (normalized) {
+    gfree(normalized);
+    gfree(normalized_idx);
+  }
+}
+
+void TextLine::addWord(TextWord *word) {
+  if (lastWord) {
+    lastWord->next = word;
+  } else {
+    words = word;
+  }
+  lastWord = word;
+
+  if (xMin > xMax) {
+    xMin = word->xMin;
+    xMax = word->xMax;
+    yMin = word->yMin;
+    yMax = word->yMax;
+  } else {
+    if (word->xMin < xMin) {
+      xMin = word->xMin;
+    }
+    if (word->xMax > xMax) {
+      xMax = word->xMax;
+    }
+    if (word->yMin < yMin) {
+      yMin = word->yMin;
+    }
+    if (word->yMax > yMax) {
+      yMax = word->yMax;
+    }
+  }
+}
+
+double TextLine::primaryDelta(TextLine *line) {
+  double delta;
+
+  delta = 0; // make gcc happy
+  switch (rot) {
+  case 0:
+    delta = line->xMin - xMax;
+    break;
+  case 1:
+    delta = line->yMin - yMax;
+    break;
+  case 2:
+    delta = xMin - line->xMax;
+    break;
+  case 3:
+    delta = yMin - line->yMax;
+    break;
+  }
+  return delta;
+}
+
+int TextLine::primaryCmp(TextLine *line) {
+  double cmp;
+
+  cmp = 0; // make gcc happy
+  switch (rot) {
+  case 0:
+    cmp = xMin - line->xMin;
+    break;
+  case 1:
+    cmp = yMin - line->yMin;
+    break;
+  case 2:
+    cmp = line->xMax - xMax;
+    break;
+  case 3:
+    cmp = line->yMax - yMax;
+    break;
+  }
+  return cmp < 0 ? -1 : cmp > 0 ? 1 : 0;
+}
+
+int TextLine::secondaryCmp(TextLine *line) {
+  double cmp;
+
+  cmp = (rot == 0 || rot == 3) ? base - line->base : line->base - base;
+  return cmp < 0 ? -1 : cmp > 0 ? 1 : 0;
+}
+
+int TextLine::cmpYX(TextLine *line) {
+  int cmp;
+
+  if ((cmp = secondaryCmp(line))) {
+    return cmp;
+  }
+  return primaryCmp(line);
+}
+
+int TextLine::cmpXY(const void *p1, const void *p2) {
+  TextLine *line1 = *(TextLine **)p1;
+  TextLine *line2 = *(TextLine **)p2;
+  int cmp;
+
+  if ((cmp = line1->primaryCmp(line2))) {
+    return cmp;
+  }
+  return line1->secondaryCmp(line2);
+}
+
+void TextLine::coalesce(UnicodeMap *uMap) {
+  TextWord *word0, *word1;
+  double space, delta, minSpace;
+  GBool isUnicode;
+  char buf[8];
+  int i, j;
+
+  if (words->next) {
+
+    // compute the inter-word space threshold
+    if (words->len > 1 || words->next->len > 1) {
+      minSpace = 0;
+    } else {
+      minSpace = words->primaryDelta(words->next);
+      for (word0 = words->next, word1 = word0->next;
+          word1 && minSpace > 0;
+          word0 = word1, word1 = word0->next) {
+       if (word1->len > 1) {
+         minSpace = 0;
+       }
+       delta = word0->primaryDelta(word1);
+       if (delta < minSpace) {
+         minSpace = delta;
+       }
+      }
+    }
+    if (minSpace <= 0) {
+      space = maxCharSpacing * words->fontSize;
+    } else {
+      space = maxWideCharSpacingMul * minSpace;
+      if (space > maxWideCharSpacing * words->fontSize) {
+       space = maxWideCharSpacing * words->fontSize;
+      }
+    }
+
+    // merge words
+    word0 = words;
+    word1 = words->next;
+    while (word1) {
+      if (word0->primaryDelta(word1) >= space) {
+       word0->spaceAfter = gTrue;
+       word0 = word1;
+       word1 = word1->next;
+      } else if (word0->font == word1->font &&
+                word0->underlined == word1->underlined &&
+                fabs(word0->fontSize - word1->fontSize) <
+                  maxWordFontSizeDelta * words->fontSize &&
+                word1->charPos[0] == word0->charPos[word0->len]) {
+       word0->merge(word1);
+       word0->next = word1->next;
+       delete word1;
+       word1 = word0->next;
+      } else {
+       word0 = word1;
+       word1 = word1->next;
+      }
+    }
+  }
+
+  // build the line text
+  isUnicode = uMap ? uMap->isUnicode() : gFalse;
+  len = 0;
+  for (word1 = words; word1; word1 = word1->next) {
+    len += word1->len;
+    if (word1->spaceAfter) {
+      ++len;
+    }
+  }
+  text = (Unicode *)gmallocn(len, sizeof(Unicode));
+  edge = (double *)gmallocn(len + 1, sizeof(double));
+  i = 0;
+  for (word1 = words; word1; word1 = word1->next) {
+    for (j = 0; j < word1->len; ++j) {
+      text[i] = word1->text[j];
+      edge[i] = word1->edge[j];
+      ++i;
+    }
+    edge[i] = word1->edge[word1->len];
+    if (word1->spaceAfter) {
+      text[i] = (Unicode)0x0020;
+      ++i;
+    }
+  }
+
+  // compute convertedLen and set up the col array
+  col = (int *)gmallocn(len + 1, sizeof(int));
+  convertedLen = 0;
+  for (i = 0; i < len; ++i) {
+    col[i] = convertedLen;
+    if (isUnicode) {
+      ++convertedLen;
+    } else if (uMap) {
+      convertedLen += uMap->mapUnicode(text[i], buf, sizeof(buf));
+    }
+  }
+  col[len] = convertedLen;
+
+  // check for hyphen at end of line
+  //~ need to check for other chars used as hyphens
+  hyphenated = text[len - 1] == (Unicode)'-';
+}
+
+//------------------------------------------------------------------------
+// TextLineFrag
+//------------------------------------------------------------------------
+
+class TextLineFrag {
+public:
+
+  TextLine *line;              // the line object
+  int start, len;              // offset and length of this fragment
+                               //   (in Unicode chars)
+  double xMin, xMax;           // bounding box coordinates
+  double yMin, yMax;
+  double base;                 // baseline virtual coordinate
+  int col;                     // first column
+
+  void init(TextLine *lineA, int startA, int lenA);
+  void computeCoords(GBool oneRot);
+
+  static int cmpYXPrimaryRot(const void *p1, const void *p2);
+  static int cmpYXLineRot(const void *p1, const void *p2);
+  static int cmpXYLineRot(const void *p1, const void *p2);
+  static int cmpXYColumnPrimaryRot(const void *p1, const void *p2);
+  static int cmpXYColumnLineRot(const void *p1, const void *p2);
+};
+
+void TextLineFrag::init(TextLine *lineA, int startA, int lenA) {
+  line = lineA;
+  start = startA;
+  len = lenA;
+  col = line->col[start];
+}
+
+void TextLineFrag::computeCoords(GBool oneRot) {
+  TextBlock *blk;
+  double d0, d1, d2, d3, d4;
+
+  if (oneRot) {
+
+    switch (line->rot) {
+    case 0:
+      xMin = line->edge[start];
+      xMax = line->edge[start + len];
+      yMin = line->yMin;
+      yMax = line->yMax;
+      break;
+    case 1:
+      xMin = line->xMin;
+      xMax = line->xMax;
+      yMin = line->edge[start];
+      yMax = line->edge[start + len];
+      break;
+    case 2:
+      xMin = line->edge[start + len];
+      xMax = line->edge[start];
+      yMin = line->yMin;
+      yMax = line->yMax;
+      break;
+    case 3:
+      xMin = line->xMin;
+      xMax = line->xMax;
+      yMin = line->edge[start + len];
+      yMax = line->edge[start];
+      break;
+    }
+    base = line->base;
+
+  } else {
+
+    if (line->rot == 0 && line->blk->page->primaryRot == 0) {
+
+      xMin = line->edge[start];
+      xMax = line->edge[start + len];
+      yMin = line->yMin;
+      yMax = line->yMax;
+      base = line->base;
+
+    } else {
+
+      blk = line->blk;
+      d0 = line->edge[start];
+      d1 = line->edge[start + len];
+      d2 = d3 = d4 = 0; // make gcc happy
+
+      switch (line->rot) {
+      case 0:
+       d2 = line->yMin;
+       d3 = line->yMax;
+       d4 = line->base;
+       d0 = (d0 - blk->xMin) / (blk->xMax - blk->xMin);
+       d1 = (d1 - blk->xMin) / (blk->xMax - blk->xMin);
+       d2 = (d2 - blk->yMin) / (blk->yMax - blk->yMin);
+       d3 = (d3 - blk->yMin) / (blk->yMax - blk->yMin);
+       d4 = (d4 - blk->yMin) / (blk->yMax - blk->yMin);
+       break;
+      case 1:
+       d2 = line->xMax;
+       d3 = line->xMin;
+       d4 = line->base;
+       d0 = (d0 - blk->yMin) / (blk->yMax - blk->yMin);
+       d1 = (d1 - blk->yMin) / (blk->yMax - blk->yMin);
+       d2 = (blk->xMax - d2) / (blk->xMax - blk->xMin);
+       d3 = (blk->xMax - d3) / (blk->xMax - blk->xMin);
+       d4 = (blk->xMax - d4) / (blk->xMax - blk->xMin);
+       break;
+      case 2:
+       d2 = line->yMax;
+       d3 = line->yMin;
+       d4 = line->base;
+       d0 = (blk->xMax - d0) / (blk->xMax - blk->xMin);
+       d1 = (blk->xMax - d1) / (blk->xMax - blk->xMin);
+       d2 = (blk->yMax - d2) / (blk->yMax - blk->yMin);
+       d3 = (blk->yMax - d3) / (blk->yMax - blk->yMin);
+       d4 = (blk->yMax - d4) / (blk->yMax - blk->yMin);
+       break;
+      case 3:
+       d2 = line->xMin;
+       d3 = line->xMax;
+       d4 = line->base;
+       d0 = (blk->yMax - d0) / (blk->yMax - blk->yMin);
+       d1 = (blk->yMax - d1) / (blk->yMax - blk->yMin);
+       d2 = (d2 - blk->xMin) / (blk->xMax - blk->xMin);
+       d3 = (d3 - blk->xMin) / (blk->xMax - blk->xMin);
+       d4 = (d4 - blk->xMin) / (blk->xMax - blk->xMin);
+       break;
+      }
+
+      switch (line->blk->page->primaryRot) {
+      case 0:
+       xMin = blk->xMin + d0 * (blk->xMax - blk->xMin);
+       xMax = blk->xMin + d1 * (blk->xMax - blk->xMin);
+       yMin = blk->yMin + d2 * (blk->yMax - blk->yMin);
+       yMax = blk->yMin + d3 * (blk->yMax - blk->yMin);
+       base = blk->yMin + d4 * (blk->yMax - blk->yMin);
+       break;
+      case 1:
+       xMin = blk->xMax - d3 * (blk->xMax - blk->xMin);
+       xMax = blk->xMax - d2 * (blk->xMax - blk->xMin);
+       yMin = blk->yMin + d0 * (blk->yMax - blk->yMin);
+       yMax = blk->yMin + d1 * (blk->yMax - blk->yMin);
+       base = blk->xMax - d4 * (blk->xMax - blk->xMin);
+       break;
+      case 2:
+       xMin = blk->xMax - d1 * (blk->xMax - blk->xMin);
+       xMax = blk->xMax - d0 * (blk->xMax - blk->xMin);
+       yMin = blk->yMax - d3 * (blk->yMax - blk->yMin);
+       yMax = blk->yMax - d2 * (blk->yMax - blk->yMin);
+       base = blk->yMax - d4 * (blk->yMax - blk->yMin);
+       break;
+      case 3:
+       xMin = blk->xMin + d2 * (blk->xMax - blk->xMin);
+       xMax = blk->xMin + d3 * (blk->xMax - blk->xMin);
+       yMin = blk->yMax - d1 * (blk->yMax - blk->yMin);
+       yMax = blk->yMax - d0 * (blk->yMax - blk->yMin);
+       base = blk->xMin + d4 * (blk->xMax - blk->xMin);
+       break;
+      }
+
+    }
+  }
+}
+
+int TextLineFrag::cmpYXPrimaryRot(const void *p1, const void *p2) {
+  TextLineFrag *frag1 = (TextLineFrag *)p1;
+  TextLineFrag *frag2 = (TextLineFrag *)p2;
+  double cmp;
+
+  cmp = 0; // make gcc happy
+  switch (frag1->line->blk->page->primaryRot) {
+  case 0:
+    if (fabs(cmp = frag1->yMin - frag2->yMin) < 0.01) {
+      cmp = frag1->xMin - frag2->xMin;
+    }
+    break;
+  case 1:
+    if (fabs(cmp = frag2->xMax - frag1->xMax) < 0.01) {
+      cmp = frag1->yMin - frag2->yMin;
+    }
+    break;
+  case 2:
+    if (fabs(cmp = frag2->yMin - frag1->yMin) < 0.01) {
+      cmp = frag2->xMax - frag1->xMax;
+    }
+    break;
+  case 3:
+    if (fabs(cmp = frag1->xMax - frag2->xMax) < 0.01) {
+      cmp = frag2->yMax - frag1->yMax;
+    }
+    break;
+  }
+  return cmp < 0 ? -1 : cmp > 0 ? 1 : 0;
+}
+
+int TextLineFrag::cmpYXLineRot(const void *p1, const void *p2) {
+  TextLineFrag *frag1 = (TextLineFrag *)p1;
+  TextLineFrag *frag2 = (TextLineFrag *)p2;
+  double cmp;
+
+  cmp = 0; // make gcc happy
+  switch (frag1->line->rot) {
+  case 0:
+    if ((cmp = frag1->yMin - frag2->yMin) == 0) {
+      cmp = frag1->xMin - frag2->xMin;
+    }
+    break;
+  case 1:
+    if ((cmp = frag2->xMax - frag1->xMax) == 0) {
+      cmp = frag1->yMin - frag2->yMin;
+    }
+    break;
+  case 2:
+    if ((cmp = frag2->yMin - frag1->yMin) == 0) {
+      cmp = frag2->xMax - frag1->xMax;
+    }
+    break;
+  case 3:
+    if ((cmp = frag1->xMax - frag2->xMax) == 0) {
+      cmp = frag2->yMax - frag1->yMax;
+    }
+    break;
+  }
+  return cmp < 0 ? -1 : cmp > 0 ? 1 : 0;
+}
+
+int TextLineFrag::cmpXYLineRot(const void *p1, const void *p2) {
+  TextLineFrag *frag1 = (TextLineFrag *)p1;
+  TextLineFrag *frag2 = (TextLineFrag *)p2;
+  double cmp;
+
+  cmp = 0; // make gcc happy
+  switch (frag1->line->rot) {
+  case 0:
+    if ((cmp = frag1->xMin - frag2->xMin) == 0) {
+      cmp = frag1->yMin - frag2->yMin;
+    }
+    break;
+  case 1:
+    if ((cmp = frag1->yMin - frag2->yMin) == 0) {
+      cmp = frag2->xMax - frag1->xMax;
+    }
+    break;
+  case 2:
+    if ((cmp = frag2->xMax - frag1->xMax) == 0) {
+      cmp = frag2->yMin - frag1->yMin;
+    }
+    break;
+  case 3:
+    if ((cmp = frag2->yMax - frag1->yMax) == 0) {
+      cmp = frag1->xMax - frag2->xMax;
+    }
+    break;
+  }
+  return cmp < 0 ? -1 : cmp > 0 ? 1 : 0;
+}
+
+int TextLineFrag::cmpXYColumnPrimaryRot(const void *p1, const void *p2) {
+  TextLineFrag *frag1 = (TextLineFrag *)p1;
+  TextLineFrag *frag2 = (TextLineFrag *)p2;
+  double cmp;
+
+  // if columns overlap, compare y values
+  if (frag1->col < frag2->col + (frag2->line->col[frag2->start + frag2->len] -
+                                frag2->line->col[frag2->start]) &&
+      frag2->col < frag1->col + (frag1->line->col[frag1->start + frag1->len] -
+                                frag1->line->col[frag1->start])) {
+    cmp = 0; // make gcc happy
+    switch (frag1->line->blk->page->primaryRot) {
+    case 0: cmp = frag1->yMin - frag2->yMin; break;
+    case 1: cmp = frag2->xMax - frag1->xMax; break;
+    case 2: cmp = frag2->yMin - frag1->yMin; break;
+    case 3: cmp = frag1->xMax - frag2->xMax; break;
+    }
+    return cmp < 0 ? -1 : cmp > 0 ? 1 : 0;
+  }
+
+  // otherwise, compare starting column
+  return frag1->col - frag2->col;
+}
+
+int TextLineFrag::cmpXYColumnLineRot(const void *p1, const void *p2) {
+  TextLineFrag *frag1 = (TextLineFrag *)p1;
+  TextLineFrag *frag2 = (TextLineFrag *)p2;
+  double cmp;
+
+  // if columns overlap, compare y values
+  if (frag1->col < frag2->col + (frag2->line->col[frag2->start + frag2->len] -
+                                frag2->line->col[frag2->start]) &&
+      frag2->col < frag1->col + (frag1->line->col[frag1->start + frag1->len] -
+                                frag1->line->col[frag1->start])) {
+    cmp = 0; // make gcc happy
+    switch (frag1->line->rot) {
+    case 0: cmp = frag1->yMin - frag2->yMin; break;
+    case 1: cmp = frag2->xMax - frag1->xMax; break;
+    case 2: cmp = frag2->yMin - frag1->yMin; break;
+    case 3: cmp = frag1->xMax - frag2->xMax; break;
+    }
+    return cmp < 0 ? -1 : cmp > 0 ? 1 : 0;
+  }
+
+  // otherwise, compare starting column
+  return frag1->col - frag2->col;
+}
+
+//------------------------------------------------------------------------
+// TextBlock
+//------------------------------------------------------------------------
+
+TextBlock::TextBlock(TextPage *pageA, int rotA) {
+  page = pageA;
+  rot = rotA;
+  xMin = yMin = 0;
+  xMax = yMax = -1;
+  priMin = 0;
+  priMax = page->pageWidth;
+  pool = new TextPool();
+  lines = NULL;
+  curLine = NULL;
+  next = NULL;
+  stackNext = NULL;
+  tableId = -1;
+  tableEnd = gFalse;
+}
+
+TextBlock::~TextBlock() {
+  TextLine *line;
+
+  delete pool;
+  while (lines) {
+    line = lines;
+    lines = lines->next;
+    delete line;
+  }
+}
+
+void TextBlock::addWord(TextWord *word) {
+  pool->addWord(word);
+  if (xMin > xMax) {
+    xMin = word->xMin;
+    xMax = word->xMax;
+    yMin = word->yMin;
+    yMax = word->yMax;
+  } else {
+    if (word->xMin < xMin) {
+      xMin = word->xMin;
+    }
+    if (word->xMax > xMax) {
+      xMax = word->xMax;
+    }
+    if (word->yMin < yMin) {
+      yMin = word->yMin;
+    }
+    if (word->yMax > yMax) {
+      yMax = word->yMax;
+    }
+  }
+}
+
+void TextBlock::coalesce(UnicodeMap *uMap, double fixedPitch) {
+  TextWord *word0, *word1, *word2, *bestWord0, *bestWord1, *lastWord;
+  TextLine *line, *line0, *line1;
+  int poolMinBaseIdx, startBaseIdx, minBaseIdx, maxBaseIdx;
+  int baseIdx, bestWordBaseIdx, idx0, idx1;
+  double minBase, maxBase;
+  double fontSize, wordSpacing, delta, priDelta, secDelta;
+  TextLine **lineArray;
+  GBool found, overlap;
+  int col1, col2;
+  int i, j, k;
+
+  // discard duplicated text (fake boldface, drop shadows)
+  for (idx0 = pool->minBaseIdx; idx0 <= pool->maxBaseIdx; ++idx0) {
+    word0 = pool->getPool(idx0);
+    while (word0) {
+      priDelta = dupMaxPriDelta * word0->fontSize;
+      secDelta = dupMaxSecDelta * word0->fontSize;
+      maxBaseIdx = pool->getBaseIdx(word0->base + secDelta);
+      found = gFalse;
+      word1 = word2 = NULL; // make gcc happy
+      for (idx1 = idx0; idx1 <= maxBaseIdx; ++idx1) {
+       if (idx1 == idx0) {
+         word1 = word0;
+         word2 = word0->next;
+       } else {
+         word1 = NULL;
+         word2 = pool->getPool(idx1);
+       }
+       for (; word2; word1 = word2, word2 = word2->next) {
+         if (word2->len == word0->len &&
+             !memcmp(word2->text, word0->text,
+                     word0->len * sizeof(Unicode))) {
+           switch (rot) {
+           case 0:
+           case 2:
+             found = fabs(word0->xMin - word2->xMin) < priDelta &&
+                     fabs(word0->xMax - word2->xMax) < priDelta &&
+                     fabs(word0->yMin - word2->yMin) < secDelta &&
+                     fabs(word0->yMax - word2->yMax) < secDelta;
+             break;
+           case 1:
+           case 3:
+             found = fabs(word0->xMin - word2->xMin) < secDelta &&
+                     fabs(word0->xMax - word2->xMax) < secDelta &&
+                     fabs(word0->yMin - word2->yMin) < priDelta &&
+                     fabs(word0->yMax - word2->yMax) < priDelta;
+             break;
+           }
+         }
+         if (found) {
+           break;
+         }
+       }
+       if (found) {
+         break;
+       }
+      }
+      if (found) {
+       if (word1) {
+         word1->next = word2->next;
+       } else {
+         pool->setPool(idx1, word2->next);
+       }
+       delete word2;
+      } else {
+       word0 = word0->next;
+      }
+    }
+  }
+
+  // build the lines
+  curLine = NULL;
+  poolMinBaseIdx = pool->minBaseIdx;
+  charCount = 0;
+  nLines = 0;
+  while (1) {
+
+    // find the first non-empty line in the pool
+    for (;
+        poolMinBaseIdx <= pool->maxBaseIdx && !pool->getPool(poolMinBaseIdx);
+        ++poolMinBaseIdx) ;
+    if (poolMinBaseIdx > pool->maxBaseIdx) {
+      break;
+    }
+
+    // look for the left-most word in the first four lines of the
+    // pool -- this avoids starting with a superscript word
+    startBaseIdx = poolMinBaseIdx;
+    for (baseIdx = poolMinBaseIdx + 1;
+        baseIdx < poolMinBaseIdx + 4 && baseIdx <= pool->maxBaseIdx;
+        ++baseIdx) {
+      if (!pool->getPool(baseIdx)) {
+       continue;
+      }
+      if (pool->getPool(baseIdx)->primaryCmp(pool->getPool(startBaseIdx))
+         < 0) {
+       startBaseIdx = baseIdx;
+      }
+    }
+
+    // create a new line
+    word0 = pool->getPool(startBaseIdx);
+    pool->setPool(startBaseIdx, word0->next);
+    word0->next = NULL;
+    line = new TextLine(this, word0->rot, word0->base);
+    line->addWord(word0);
+    lastWord = word0;
+
+    // compute the search range
+    fontSize = word0->fontSize;
+    minBase = word0->base - maxIntraLineDelta * fontSize;
+    maxBase = word0->base + maxIntraLineDelta * fontSize;
+    minBaseIdx = pool->getBaseIdx(minBase);
+    maxBaseIdx = pool->getBaseIdx(maxBase);
+    wordSpacing = fixedPitch ? fixedPitch : maxWordSpacing * fontSize;
+
+    // find the rest of the words in this line
+    while (1) {
+
+      // find the left-most word whose baseline is in the range for
+      // this line
+      bestWordBaseIdx = 0;
+      bestWord0 = bestWord1 = NULL;
+      overlap = gFalse;
+      for (baseIdx = minBaseIdx;
+          !overlap && baseIdx <= maxBaseIdx;
+          ++baseIdx) {
+       for (word0 = NULL, word1 = pool->getPool(baseIdx);
+            word1;
+            word0 = word1, word1 = word1->next) {
+         if (word1->base >= minBase &&
+             word1->base <= maxBase) {
+           delta = lastWord->primaryDelta(word1);
+           if (delta < minCharSpacing * fontSize) {
+             overlap = gTrue;
+             break;
+           } else {
+             if (delta < wordSpacing &&
+                 (!bestWord1 || word1->primaryCmp(bestWord1) < 0)) {
+               bestWordBaseIdx = baseIdx;
+               bestWord0 = word0;
+               bestWord1 = word1;
+             }
+             break;
+           }
+         }
+       }
+      }
+      if (overlap || !bestWord1) {
+       break;
+      }
+
+      // remove it from the pool, and add it to the line
+      if (bestWord0) {
+       bestWord0->next = bestWord1->next;
+      } else {
+       pool->setPool(bestWordBaseIdx, bestWord1->next);
+      }
+      bestWord1->next = NULL;
+      line->addWord(bestWord1);
+      lastWord = bestWord1;
+    }
+
+    // add the line
+    if (curLine && line->cmpYX(curLine) > 0) {
+      line0 = curLine;
+      line1 = curLine->next;
+    } else {
+      line0 = NULL;
+      line1 = lines;
+    }
+    for (;
+        line1 && line->cmpYX(line1) > 0;
+        line0 = line1, line1 = line1->next) ;
+    if (line0) {
+      line0->next = line;
+    } else {
+      lines = line;
+    }
+    line->next = line1;
+    curLine = line;
+    line->coalesce(uMap);
+    charCount += line->len;
+    ++nLines;
+  }
+
+  // sort lines into xy order for column assignment
+  lineArray = (TextLine **)gmallocn(nLines, sizeof(TextLine *));
+  for (line = lines, i = 0; line; line = line->next, ++i) {
+    lineArray[i] = line;
+  }
+  qsort(lineArray, nLines, sizeof(TextLine *), &TextLine::cmpXY);
+
+  // column assignment
+  nColumns = 0;
+  if (fixedPitch) {
+    for (i = 0; i < nLines; ++i) {
+      line0 = lineArray[i];
+      col1 = 0; // make gcc happy
+      switch (rot) {
+      case 0:
+       col1 = (int)((line0->xMin - xMin) / fixedPitch + 0.5);
+       break;
+      case 1:
+       col1 = (int)((line0->yMin - yMin) / fixedPitch + 0.5);
+       break;
+      case 2:
+       col1 = (int)((xMax - line0->xMax) / fixedPitch + 0.5);
+       break;
+      case 3:
+       col1 = (int)((yMax - line0->yMax) / fixedPitch + 0.5);
+       break;
+      }
+      for (k = 0; k <= line0->len; ++k) {
+       line0->col[k] += col1;
+      }
+      if (line0->col[line0->len] > nColumns) {
+       nColumns = line0->col[line0->len];
+      }
+    }
+  } else {
+    for (i = 0; i < nLines; ++i) {
+      line0 = lineArray[i];
+      col1 = 0;
+      for (j = 0; j < i; ++j) {
+       line1 = lineArray[j];
+       if (line1->primaryDelta(line0) >= 0) {
+         col2 = line1->col[line1->len] + 1;
+       } else {
+         k = 0; // make gcc happy
+         switch (rot) {
+         case 0:
+           for (k = 0;
+                k < line1->len &&
+                  line0->xMin >= 0.5 * (line1->edge[k] + line1->edge[k+1]);
+                ++k) ;
+           break;
+         case 1:
+           for (k = 0;
+                k < line1->len &&
+                  line0->yMin >= 0.5 * (line1->edge[k] + line1->edge[k+1]);
+                ++k) ;
+           break;
+         case 2:
+           for (k = 0;
+                k < line1->len &&
+                  line0->xMax <= 0.5 * (line1->edge[k] + line1->edge[k+1]);
+                ++k) ;
+           break;
+         case 3:
+           for (k = 0;
+                k < line1->len &&
+                  line0->yMax <= 0.5 * (line1->edge[k] + line1->edge[k+1]);
+                ++k) ;
+           break;
+         }
+         col2 = line1->col[k];
+       }
+       if (col2 > col1) {
+         col1 = col2;
+       }
+      }
+      for (k = 0; k <= line0->len; ++k) {
+       line0->col[k] += col1;
+      }
+      if (line0->col[line0->len] > nColumns) {
+       nColumns = line0->col[line0->len];
+      }
+    }
+  }
+  gfree(lineArray);
+}
+
+void TextBlock::updatePriMinMax(TextBlock *blk) {
+  double newPriMin, newPriMax;
+  GBool gotPriMin, gotPriMax;
+
+  gotPriMin = gotPriMax = gFalse;
+  newPriMin = newPriMax = 0; // make gcc happy
+  switch (page->primaryRot) {
+  case 0:
+  case 2:
+    if (blk->yMin < yMax && blk->yMax > yMin) {
+      if (blk->xMin < xMin) {
+       newPriMin = blk->xMax;
+       gotPriMin = gTrue;
+      }
+      if (blk->xMax > xMax) {
+       newPriMax = blk->xMin;
+       gotPriMax = gTrue;
+      }
+    }
+    break;
+  case 1:
+  case 3:
+    if (blk->xMin < xMax && blk->xMax > xMin) {
+      if (blk->yMin < yMin) {
+       newPriMin = blk->yMax;
+       gotPriMin = gTrue;
+      }
+      if (blk->yMax > yMax) {
+       newPriMax = blk->yMin;
+       gotPriMax = gTrue;
+      }
+    }
+    break;
+  }
+  if (gotPriMin) {
+    if (newPriMin > xMin) {
+      newPriMin = xMin;
+    }
+    if (newPriMin > priMin) {
+      priMin = newPriMin;
+    }
+  }
+  if (gotPriMax) {
+    if (newPriMax < xMax) {
+      newPriMax = xMax;
+    }
+    if (newPriMax < priMax) {
+      priMax = newPriMax;
+    }
+  }
+}
+
+int TextBlock::cmpXYPrimaryRot(const void *p1, const void *p2) {
+  TextBlock *blk1 = *(TextBlock **)p1;
+  TextBlock *blk2 = *(TextBlock **)p2;
+  double cmp;
+
+  cmp = 0; // make gcc happy
+  switch (blk1->page->primaryRot) {
+  case 0:
+    if ((cmp = blk1->xMin - blk2->xMin) == 0) {
+      cmp = blk1->yMin - blk2->yMin;
+    }
+    break;
+  case 1:
+    if ((cmp = blk1->yMin - blk2->yMin) == 0) {
+      cmp = blk2->xMax - blk1->xMax;
+    }
+    break;
+  case 2:
+    if ((cmp = blk2->xMax - blk1->xMax) == 0) {
+      cmp = blk2->yMin - blk1->yMin;
+    }
+    break;
+  case 3:
+    if ((cmp = blk2->yMax - blk1->yMax) == 0) {
+      cmp = blk1->xMax - blk2->xMax;
+    }
+    break;
+  }
+  return cmp < 0 ? -1 : cmp > 0 ? 1 : 0;
+}
+
+int TextBlock::cmpYXPrimaryRot(const void *p1, const void *p2) {
+  TextBlock *blk1 = *(TextBlock **)p1;
+  TextBlock *blk2 = *(TextBlock **)p2;
+  double cmp;
+
+  cmp = 0; // make gcc happy
+  switch (blk1->page->primaryRot) {
+  case 0:
+    if ((cmp = blk1->yMin - blk2->yMin) == 0) {
+      cmp = blk1->xMin - blk2->xMin;
+    }
+    break;
+  case 1:
+    if ((cmp = blk2->xMax - blk1->xMax) == 0) {
+      cmp = blk1->yMin - blk2->yMin;
+    }
+    break;
+  case 2:
+    if ((cmp = blk2->yMin - blk1->yMin) == 0) {
+      cmp = blk2->xMax - blk1->xMax;
+    }
+    break;
+  case 3:
+    if ((cmp = blk1->xMax - blk2->xMax) == 0) {
+      cmp = blk2->yMax - blk1->yMax;
+    }
+    break;
+  }
+  return cmp < 0 ? -1 : cmp > 0 ? 1 : 0;
+}
+
+int TextBlock::primaryCmp(TextBlock *blk) {
+  double cmp;
+
+  cmp = 0; // make gcc happy
+  switch (rot) {
+  case 0:
+    cmp = xMin - blk->xMin;
+    break;
+  case 1:
+    cmp = yMin - blk->yMin;
+    break;
+  case 2:
+    cmp = blk->xMax - xMax;
+    break;
+  case 3:
+    cmp = blk->yMax - yMax;
+    break;
+  }
+  return cmp < 0 ? -1 : cmp > 0 ? 1 : 0;
+}
+
+double TextBlock::secondaryDelta(TextBlock *blk) {
+  double delta;
+
+  delta = 0; // make gcc happy
+  switch (rot) {
+  case 0:
+    delta = blk->yMin - yMax;
+    break;
+  case 1:
+    delta = xMin - blk->xMax;
+    break;
+  case 2:
+    delta = yMin - blk->yMax;
+    break;
+  case 3:
+    delta = blk->xMin - xMax;
+    break;
+  }
+  return delta;
+}
+
+GBool TextBlock::isBelow(TextBlock *blk) {
+  GBool below;
+
+  below = gFalse; // make gcc happy
+  switch (page->primaryRot) {
+  case 0:
+    below = xMin >= blk->priMin && xMax <= blk->priMax &&
+            yMin > blk->yMin;
+    break;
+  case 1:
+    below = yMin >= blk->priMin && yMax <= blk->priMax &&
+            xMax < blk->xMax;
+    break;
+  case 2:
+    below = xMin >= blk->priMin && xMax <= blk->priMax &&
+            yMax < blk->yMax;
+    break;
+  case 3:
+    below = yMin >= blk->priMin && yMax <= blk->priMax &&
+            xMin > blk->xMin;
+    break;
+  }
+
+  return below;
+}
+
+GBool TextBlock::isBeforeByRule1(TextBlock *blk1) {
+  GBool before = gFalse;
+  GBool overlap = gFalse;
+
+  switch (this->page->primaryRot) {
+  case 0:
+  case 2:
+    overlap = ((this->ExMin <= blk1->ExMin) &&
+              (blk1->ExMin <= this->ExMax)) ||
+      ((blk1->ExMin <= this->ExMin) &&
+       (this->ExMin <= blk1->ExMax));
+    break;
+  case 1:
+  case 3:
+    overlap = ((this->EyMin <= blk1->EyMin) &&
+              (blk1->EyMin <= this->EyMax)) ||
+      ((blk1->EyMin <= this->EyMin) &&
+       (this->EyMin <= blk1->EyMax));
+    break;
+  }
+  switch (this->page->primaryRot) {
+  case 0:
+    before = overlap && this->EyMin < blk1->EyMin;
+    break;
+  case 1:
+    before = overlap && this->ExMax > blk1->ExMax;
+    break;
+  case 2:
+    before = overlap && this->EyMax > blk1->EyMax;
+    break;
+  case 3:
+    before = overlap && this->ExMin < blk1->ExMin;
+    break;
+  }
+  return before;
+}
+
+GBool TextBlock::isBeforeByRule2(TextBlock *blk1) {
+  double cmp = 0;
+  int rotLR = rot;
+
+  if (!page->primaryLR) {
+    rotLR = (rotLR + 2) % 4;
+  }
+
+  switch (rotLR) {
+  case 0:
+    cmp = ExMax - blk1->ExMin;
+    break;
+  case 1:
+    cmp = EyMin - blk1->EyMax;
+    break;
+  case 2:
+    cmp = blk1->ExMax - ExMin;
+    break;
+  case 3:
+    cmp = blk1->EyMin - EyMax;
+    break;
+  }
+  return cmp <= 0;
+}
+
+// Sort into reading order by performing a topological sort using the rules
+// given in "High Performance Document Layout Analysis", T.M. Breuel, 2003.
+// See http://pubs.iupr.org/#2003-breuel-sdiut
+// Topological sort is done by depth first search, see
+// http://en.wikipedia.org/wiki/Topological_sorting
+int TextBlock::visitDepthFirst(TextBlock *blkList, int pos1,
+                              TextBlock **sorted, int sortPos,
+                              GBool* visited) {
+  int pos2;
+  TextBlock *blk1, *blk2, *blk3;
+  GBool before;
+
+  if (visited[pos1]) {
+    return sortPos;
+  }
+
+  blk1 = this;
+
+#if 0 // for debugging
+  printf("visited: %d %.2f..%.2f %.2f..%.2f\n",
+        sortPos, blk1->ExMin, blk1->ExMax, blk1->EyMin, blk1->EyMax);
+#endif
+  visited[pos1] = gTrue;
+  pos2 = -1;
+  for (blk2 = blkList; blk2; blk2 = blk2->next) {
+    pos2++;
+    if (visited[pos2]) {
+      // skip visited nodes
+      continue;
+    }
+    before = gFalse;
+
+    // is blk2 before blk1? (for table entries)
+    if (blk1->tableId >= 0 && blk1->tableId == blk2->tableId) {
+      if (page->primaryLR) {
+        if (blk2->xMax <= blk1->xMin &&
+            blk2->yMin <= blk1->yMax &&
+            blk2->yMax >= blk1->yMin)
+          before = gTrue;
+      } else {
+        if (blk2->xMin >= blk1->xMax &&
+            blk2->yMin <= blk1->yMax &&
+            blk2->yMax >= blk1->yMin)
+          before = gTrue;
+      }
+
+      if (blk2->yMax <= blk1->yMin)
+        before = gTrue;
+    } else {
+      if (blk2->isBeforeByRule1(blk1)) {
+        // Rule (1) blk1 and blk2 overlap, and blk2 is above blk1.
+        before = gTrue;
+#if 0   // for debugging
+        printf("rule1: %.2f..%.2f %.2f..%.2f %.2f..%.2f %.2f..%.2f\n",
+              blk2->ExMin, blk2->ExMax, blk2->EyMin, blk2->EyMax,
+              blk1->ExMin, blk1->ExMax, blk1->EyMin, blk1->EyMax);
+#endif
+      } else if (blk2->isBeforeByRule2(blk1)) {
+        // Rule (2) blk2 left of blk1, and no intervening blk3
+        //          such that blk1 is before blk3 by rule 1,
+        //          and blk3 is before blk2 by rule 1.
+        before = gTrue;
+        for (blk3 = blkList; blk3; blk3 = blk3->next) {
+         if (blk3 == blk2 || blk3 == blk1) {
+           continue;
+         }
+         if (blk1->isBeforeByRule1(blk3) &&
+             blk3->isBeforeByRule1(blk2)) {
+           before = gFalse;
+           break;
+         }
+        }
+#if 0 // for debugging
+        if (before) {
+         printf("rule2: %.2f..%.2f %.2f..%.2f %.2f..%.2f %.2f..%.2f\n",
+                blk1->ExMin, blk1->ExMax, blk1->EyMin, blk1->EyMax,
+                blk2->ExMin, blk2->ExMax, blk2->EyMin, blk2->EyMax);
+        }
+#endif
+      }
+    }
+    if (before) {
+      // blk2 is before blk1, so it needs to be visited
+      // before we can add blk1 to the sorted list.
+      sortPos = blk2->visitDepthFirst(blkList, pos2, sorted, sortPos, visited);
+    }
+  }
+#if 0 // for debugging
+  printf("sorted: %d %.2f..%.2f %.2f..%.2f\n",
+        sortPos, blk1->ExMin, blk1->ExMax, blk1->EyMin, blk1->EyMax);
+#endif
+  sorted[sortPos++] = blk1;
+  return sortPos;
+}
+
+//------------------------------------------------------------------------
+// TextFlow
+//------------------------------------------------------------------------
+
+TextFlow::TextFlow(TextPage *pageA, TextBlock *blk) {
+  page = pageA;
+  xMin = blk->xMin;
+  xMax = blk->xMax;
+  yMin = blk->yMin;
+  yMax = blk->yMax;
+  priMin = blk->priMin;
+  priMax = blk->priMax;
+  blocks = lastBlk = blk;
+  next = NULL;
+}
+
+TextFlow::~TextFlow() {
+  TextBlock *blk;
+
+  while (blocks) {
+    blk = blocks;
+    blocks = blocks->next;
+    delete blk;
+  }
+}
+
+void TextFlow::addBlock(TextBlock *blk) {
+  if (lastBlk) {
+    lastBlk->next = blk;
+  } else {
+    blocks = blk;
+  }
+  lastBlk = blk;
+  if (blk->xMin < xMin) {
+    xMin = blk->xMin;
+  }
+  if (blk->xMax > xMax) {
+    xMax = blk->xMax;
+  }
+  if (blk->yMin < yMin) {
+    yMin = blk->yMin;
+  }
+  if (blk->yMax > yMax) {
+    yMax = blk->yMax;
+  }
+}
+
+GBool TextFlow::blockFits(TextBlock *blk, TextBlock *prevBlk) {
+  GBool fits;
+
+  // lower blocks must use smaller fonts
+  if (blk->lines->words->fontSize > lastBlk->lines->words->fontSize) {
+    return gFalse;
+  }
+
+  fits = gFalse; // make gcc happy
+  switch (page->primaryRot) {
+  case 0:
+    fits = blk->xMin >= priMin && blk->xMax <= priMax;
+    break;
+  case 1:
+    fits = blk->yMin >= priMin && blk->yMax <= priMax;
+    break;
+  case 2:
+    fits = blk->xMin >= priMin && blk->xMax <= priMax;
+    break;
+  case 3:
+    fits = blk->yMin >= priMin && blk->yMax <= priMax;
+    break;
+  }
+  return fits;
+}
+
+#if TEXTOUT_WORD_LIST
+
+//------------------------------------------------------------------------
+// TextWordList
+//------------------------------------------------------------------------
+
+TextWordList::TextWordList(TextPage *text, GBool physLayout) {
+  TextFlow *flow;
+  TextBlock *blk;
+  TextLine *line;
+  TextWord *word;
+  TextWord **wordArray;
+  int nWords, i;
+
+  words = new GooList();
+
+  if (text->rawOrder) {
+    for (word = text->rawWords; word; word = word->next) {
+      words->append(word);
+    }
+
+  } else if (physLayout) {
+    // this is inefficient, but it's also the least useful of these
+    // three cases
+    nWords = 0;
+    for (flow = text->flows; flow; flow = flow->next) {
+      for (blk = flow->blocks; blk; blk = blk->next) {
+       for (line = blk->lines; line; line = line->next) {
+         for (word = line->words; word; word = word->next) {
+           ++nWords;
+         }
+       }
+      }
+    }
+    wordArray = (TextWord **)gmallocn(nWords, sizeof(TextWord *));
+    i = 0;
+    for (flow = text->flows; flow; flow = flow->next) {
+      for (blk = flow->blocks; blk; blk = blk->next) {
+       for (line = blk->lines; line; line = line->next) {
+         for (word = line->words; word; word = word->next) {
+           wordArray[i++] = word;
+         }
+       }
+      }
+    }
+    qsort(wordArray, nWords, sizeof(TextWord *), &TextWord::cmpYX);
+    for (i = 0; i < nWords; ++i) {
+      words->append(wordArray[i]);
+    }
+    gfree(wordArray);
+
+  } else {
+    for (flow = text->flows; flow; flow = flow->next) {
+      for (blk = flow->blocks; blk; blk = blk->next) {
+       for (line = blk->lines; line; line = line->next) {
+         for (word = line->words; word; word = word->next) {
+           words->append(word);
+         }
+       }
+      }
+    }
+  }
+}
+
+TextWordList::~TextWordList() {
+  delete words;
+}
+
+int TextWordList::getLength() {
+  return words->getLength();
+}
+
+TextWord *TextWordList::get(int idx) {
+  if (idx < 0 || idx >= words->getLength()) {
+    return NULL;
+  }
+  return (TextWord *)words->get(idx);
+}
+
+#endif // TEXTOUT_WORD_LIST
+
+//------------------------------------------------------------------------
+// TextPage
+//------------------------------------------------------------------------
+
+TextPage::TextPage(GBool rawOrderA) {
+  int rot;
+
+  refCnt = 1;
+  rawOrder = rawOrderA;
+  curWord = NULL;
+  charPos = 0;
+  curFont = NULL;
+  curFontSize = 0;
+  nest = 0;
+  nTinyChars = 0;
+  lastCharOverlap = gFalse;
+  if (!rawOrder) {
+    for (rot = 0; rot < 4; ++rot) {
+      pools[rot] = new TextPool();
+    }
+  }
+  flows = NULL;
+  blocks = NULL;
+  rawWords = NULL;
+  rawLastWord = NULL;
+  fonts = new GooList();
+  lastFindXMin = lastFindYMin = 0;
+  haveLastFind = gFalse;
+  underlines = new GooList();
+  links = new GooList();
+}
+
+TextPage::~TextPage() {
+  int rot;
+
+  clear();
+  if (!rawOrder) {
+    for (rot = 0; rot < 4; ++rot) {
+      delete pools[rot];
+    }
+  }
+  delete fonts;
+  deleteGooList(underlines, TextUnderline);
+  deleteGooList(links, TextLink);
+}
+
+void TextPage::incRefCnt() {
+  refCnt++;
+}
+
+void TextPage::decRefCnt() {
+  if (--refCnt == 0)
+    delete this;
+}
+
+void TextPage::startPage(GfxState *state) {
+  clear();
+  if (state) {
+    pageWidth = state->getPageWidth();
+    pageHeight = state->getPageHeight();
+  } else {
+    pageWidth = pageHeight = 0;
+  }
+}
+
+void TextPage::endPage() {
+  if (curWord) {
+    endWord();
+  }
+}
+
+void TextPage::clear() {
+  int rot;
+  TextFlow *flow;
+  TextWord *word;
+
+  if (curWord) {
+    delete curWord;
+    curWord = NULL;
+  }
+  if (rawOrder) {
+    while (rawWords) {
+      word = rawWords;
+      rawWords = rawWords->next;
+      delete word;
+    }
+  } else {
+    for (rot = 0; rot < 4; ++rot) {
+      delete pools[rot];
+    }
+    while (flows) {
+      flow = flows;
+      flows = flows->next;
+      delete flow;
+    }
+    gfree(blocks);
+  }
+  deleteGooList(fonts, TextFontInfo);
+  deleteGooList(underlines, TextUnderline);
+  deleteGooList(links, TextLink);
+
+  curWord = NULL;
+  charPos = 0;
+  curFont = NULL;
+  curFontSize = 0;
+  nest = 0;
+  nTinyChars = 0;
+  if (!rawOrder) {
+    for (rot = 0; rot < 4; ++rot) {
+      pools[rot] = new TextPool();
+    }
+  }
+  flows = NULL;
+  blocks = NULL;
+  rawWords = NULL;
+  rawLastWord = NULL;
+  fonts = new GooList();
+  underlines = new GooList();
+  links = new GooList();
+}
+
+void TextPage::updateFont(GfxState *state) {
+  GfxFont *gfxFont;
+  double *fm;
+  char *name;
+  int code, mCode, letterCode, anyCode;
+  double w;
+  int i;
+
+  // get the font info object
+  curFont = NULL;
+  for (i = 0; i < fonts->getLength(); ++i) {
+    curFont = (TextFontInfo *)fonts->get(i);
+    if (curFont->matches(state)) {
+      break;
+    }
+    curFont = NULL;
+  }
+  if (!curFont) {
+    curFont = new TextFontInfo(state);
+    fonts->append(curFont);
+  }
+
+  // adjust the font size
+  gfxFont = state->getFont();
+  curFontSize = state->getTransformedFontSize();
+  if (gfxFont && gfxFont->getType() == fontType3) {
+    // This is a hack which makes it possible to deal with some Type 3
+    // fonts.  The problem is that it's impossible to know what the
+    // base coordinate system used in the font is without actually
+    // rendering the font.  This code tries to guess by looking at the
+    // width of the character 'm' (which breaks if the font is a
+    // subset that doesn't contain 'm').
+    mCode = letterCode = anyCode = -1;
+    for (code = 0; code < 256; ++code) {
+      name = ((Gfx8BitFont *)gfxFont)->getCharName(code);
+      if (name && name[0] == 'm' && name[1] == '\0') {
+       mCode = code;
+      }
+      if (letterCode < 0 && name && name[1] == '\0' &&
+         ((name[0] >= 'A' && name[0] <= 'Z') ||
+          (name[0] >= 'a' && name[0] <= 'z'))) {
+       letterCode = code;
+      }
+      if (anyCode < 0 && name &&
+         ((Gfx8BitFont *)gfxFont)->getWidth(code) > 0) {
+       anyCode = code;
+      }
+    }
+    if (mCode >= 0 &&
+       (w = ((Gfx8BitFont *)gfxFont)->getWidth(mCode)) > 0) {
+      // 0.6 is a generic average 'm' width -- yes, this is a hack
+      curFontSize *= w / 0.6;
+    } else if (letterCode >= 0 &&
+              (w = ((Gfx8BitFont *)gfxFont)->getWidth(letterCode)) > 0) {
+      // even more of a hack: 0.5 is a generic letter width
+      curFontSize *= w / 0.5;
+    } else if (anyCode >= 0 &&
+              (w = ((Gfx8BitFont *)gfxFont)->getWidth(anyCode)) > 0) {
+      // better than nothing: 0.5 is a generic character width
+      curFontSize *= w / 0.5;
+    }
+    fm = gfxFont->getFontMatrix();
+    if (fm[0] != 0) {
+      curFontSize *= fabs(fm[3] / fm[0]);
+    }
+  }
+}
+
+void TextPage::beginWord(GfxState *state, double x0, double y0) {
+  GfxFont *gfxFont;
+  double *fontm;
+  double m[4], m2[4];
+  int rot;
+
+  // This check is needed because Type 3 characters can contain
+  // text-drawing operations (when TextPage is being used via
+  // {X,Win}SplashOutputDev rather than TextOutputDev).
+  if (curWord) {
+    ++nest;
+    return;
+  }
+
+  // compute the rotation
+  state->getFontTransMat(&m[0], &m[1], &m[2], &m[3]);
+  gfxFont = state->getFont();
+  if (gfxFont && gfxFont->getType() == fontType3) {
+    fontm = state->getFont()->getFontMatrix();
+    m2[0] = fontm[0] * m[0] + fontm[1] * m[2];
+    m2[1] = fontm[0] * m[1] + fontm[1] * m[3];
+    m2[2] = fontm[2] * m[0] + fontm[3] * m[2];
+    m2[3] = fontm[2] * m[1] + fontm[3] * m[3];
+    m[0] = m2[0];
+    m[1] = m2[1];
+    m[2] = m2[2];
+    m[3] = m2[3];
+  }
+  if (fabs(m[0] * m[3]) > fabs(m[1] * m[2])) {
+    rot = (m[0] > 0 || m[3] < 0) ? 0 : 2;
+  } else {
+    rot = (m[2] > 0) ? 1 : 3;
+  }
+
+  // for vertical writing mode, the lines are effectively rotated 90
+  // degrees
+  if (state->getFont()->getWMode()) {
+    rot = (rot + 1) & 3;
+  }
+
+  curWord = new TextWord(state, rot, x0, y0, curFont, curFontSize);
+}
+
+void TextPage::addChar(GfxState *state, double x, double y,
+                      double dx, double dy,
+                      CharCode c, int nBytes, Unicode *u, int uLen) {
+  double x1, y1, w1, h1, dx2, dy2, base, sp, delta;
+  GBool overlap;
+  int i;
+
+  // subtract char and word spacing from the dx,dy values
+  sp = state->getCharSpace();
+  if (c == (CharCode)0x20) {
+    sp += state->getWordSpace();
+  }
+  state->textTransformDelta(sp * state->getHorizScaling(), 0, &dx2, &dy2);
+  dx -= dx2;
+  dy -= dy2;
+  state->transformDelta(dx, dy, &w1, &h1);
+
+  // throw away chars that aren't inside the page bounds
+  // (and also do a sanity check on the character size)
+  state->transform(x, y, &x1, &y1);
+  if (x1 + w1 < 0 || x1 > pageWidth ||
+      y1 + h1 < 0 || y1 > pageHeight ||
+      w1 > pageWidth || h1 > pageHeight) {
+    charPos += nBytes;
+    return;
+  }
+
+  // check the tiny chars limit
+  if (!globalParams->getTextKeepTinyChars() &&
+      fabs(w1) < 3 && fabs(h1) < 3) {
+    if (++nTinyChars > 50000) {
+      charPos += nBytes;
+      return;
+    }
+  }
+
+  // break words at space character
+  if (uLen == 1 && u[0] == (Unicode)0x20) {
+    charPos += nBytes;
+    endWord();
+    return;
+  }
+
+  // start a new word if:
+  // (1) this character doesn't fall in the right place relative to
+  //     the end of the previous word (this places upper and lower
+  //     constraints on the position deltas along both the primary
+  //     and secondary axes), or
+  // (2) this character overlaps the previous one (duplicated text), or
+  // (3) the previous character was an overlap (we want each duplicated
+  //     character to be in a word by itself at this stage),
+  // (4) the font size has changed
+  if (curWord && curWord->len > 0) {
+    base = sp = delta = 0; // make gcc happy
+    switch (curWord->rot) {
+    case 0:
+      base = y1;
+      sp = x1 - curWord->xMax;
+      delta = x1 - curWord->edge[curWord->len - 1];
+      break;
+    case 1:
+      base = x1;
+      sp = y1 - curWord->yMax;
+      delta = y1 - curWord->edge[curWord->len - 1];
+      break;
+    case 2:
+      base = y1;
+      sp = curWord->xMin - x1;
+      delta = curWord->edge[curWord->len - 1] - x1;
+      break;
+    case 3:
+      base = x1;
+      sp = curWord->yMin - y1;
+      delta = curWord->edge[curWord->len - 1] - y1;
+      break;
+    }
+    overlap = fabs(delta) < dupMaxPriDelta * curWord->fontSize &&
+              fabs(base - curWord->base) < dupMaxSecDelta * curWord->fontSize;
+    if (overlap || lastCharOverlap ||
+       sp < -minDupBreakOverlap * curWord->fontSize ||
+       sp > minWordBreakSpace * curWord->fontSize ||
+       fabs(base - curWord->base) > 0.5 ||
+       curFontSize != curWord->fontSize) {
+      endWord();
+    }
+    lastCharOverlap = overlap;
+  } else {
+    lastCharOverlap = gFalse;
+  }
+
+  if (uLen != 0) {
+    // start a new word if needed
+    if (!curWord) {
+      beginWord(state, x, y);
+    }
+
+    // page rotation and/or transform matrices can cause text to be
+    // drawn in reverse order -- in this case, swap the begin/end
+    // coordinates and break text into individual chars
+    if ((curWord->rot == 0 && w1 < 0) ||
+        (curWord->rot == 1 && h1 < 0) ||
+        (curWord->rot == 2 && w1 > 0) ||
+        (curWord->rot == 3 && h1 > 0)) {
+      endWord();
+      beginWord(state, x + dx, y + dy);
+      x1 += w1;
+      y1 += h1;
+      w1 = -w1;
+      h1 = -h1;
+    }
+
+    // add the characters to the current word
+    w1 /= uLen;
+    h1 /= uLen;
+    for (i = 0; i < uLen; ++i) {
+      if (u[i] >= 0xd800 && u[i] < 0xdc00) { /* surrogate pair */
+       if (i + 1 < uLen && u[i+1] >= 0xdc00 && u[i+1] < 0xe000) {
+         /* next code is a low surrogate */
+         Unicode uu = (((u[i] & 0x3ff) << 10) | (u[i+1] & 0x3ff)) + 0x10000;
+         i++;
+         curWord->addChar(state, x1 + i*w1, y1 + i*h1, w1, h1, charPos, nBytes, c, uu);
+       } else {
+           /* missing low surrogate
+            replace it with REPLACEMENT CHARACTER (U+FFFD) */
+         curWord->addChar(state, x1 + i*w1, y1 + i*h1, w1, h1, charPos, nBytes, c, 0xfffd);
+       }
+      } else if (u[i] >= 0xdc00 && u[i] < 0xe000) {
+         /* invalid low surrogate
+          replace it with REPLACEMENT CHARACTER (U+FFFD) */
+       curWord->addChar(state, x1 + i*w1, y1 + i*h1, w1, h1, charPos, nBytes, c, 0xfffd);
+      } else {
+       curWord->addChar(state, x1 + i*w1, y1 + i*h1, w1, h1, charPos, nBytes, c, u[i]);
+      }
+    }
+  }
+  charPos += nBytes;
+}
+
+void TextPage::incCharCount(int nChars) {
+  charPos += nChars;
+}
+
+void TextPage::endWord() {
+  // This check is needed because Type 3 characters can contain
+  // text-drawing operations (when TextPage is being used via
+  // {X,Win}SplashOutputDev rather than TextOutputDev).
+  if (nest > 0) {
+    --nest;
+    return;
+  }
+
+  if (curWord) {
+    addWord(curWord);
+    curWord = NULL;
+  }
+}
+
+void TextPage::addWord(TextWord *word) {
+  // throw away zero-length words -- they don't have valid xMin/xMax
+  // values, and they're useless anyway
+  if (word->len == 0) {
+    delete word;
+    return;
+  }
+
+  if (rawOrder) {
+    if (rawLastWord) {
+      rawLastWord->next = word;
+    } else {
+      rawWords = word;
+    }
+    rawLastWord = word;
+  } else {
+    pools[word->rot]->addWord(word);
+  }
+}
+
+void TextPage::addUnderline(double x0, double y0, double x1, double y1) {
+  underlines->append(new TextUnderline(x0, y0, x1, y1));
+}
+
+void TextPage::addLink(int xMin, int yMin, int xMax, int yMax, AnnotLink *link) {
+  links->append(new TextLink(xMin, yMin, xMax, yMax, link));
+}
+
+void TextPage::coalesce(GBool physLayout, double fixedPitch, GBool doHTML) {
+  UnicodeMap *uMap;
+  TextPool *pool;
+  TextWord *word0, *word1, *word2;
+  TextLine *line;
+  TextBlock *blkList, *blk, *lastBlk, *blk0, *blk1, *blk2;
+  TextFlow *flow, *lastFlow;
+  TextUnderline *underline;
+  TextLink *link;
+  int rot, poolMinBaseIdx, baseIdx, startBaseIdx, endBaseIdx;
+  double minBase, maxBase, newMinBase, newMaxBase;
+  double fontSize, colSpace1, colSpace2, lineSpace, intraLineSpace, blkSpace;
+  GBool found;
+  int count[4];
+  int lrCount;
+  int col1, col2;
+  int i, j, n;
+
+  if (rawOrder) {
+    primaryRot = 0;
+    primaryLR = gTrue;
+    return;
+  }
+
+  uMap = globalParams->getTextEncoding();
+  blkList = NULL;
+  lastBlk = NULL;
+  nBlocks = 0;
+  primaryRot = 0;
+
+#if 0 // for debugging
+  printf("*** initial words ***\n");
+  for (rot = 0; rot < 4; ++rot) {
+    pool = pools[rot];
+    for (baseIdx = pool->minBaseIdx; baseIdx <= pool->maxBaseIdx; ++baseIdx) {
+      for (word0 = pool->getPool(baseIdx); word0; word0 = word0->next) {
+       printf("    word: x=%.2f..%.2f y=%.2f..%.2f base=%.2f fontSize=%.2f rot=%d link=%p '",
+              word0->xMin, word0->xMax, word0->yMin, word0->yMax,
+              word0->base, word0->fontSize, rot*90, word0->link);
+       for (i = 0; i < word0->len; ++i) {
+         fputc(word0->text[i] & 0xff, stdout);
+       }
+       printf("'\n");
+      }
+    }
+  }
+  printf("\n");
+#endif
+
+#if 0 //~ for debugging
+  for (i = 0; i < underlines->getLength(); ++i) {
+    underline = (TextUnderline *)underlines->get(i);
+    printf("underline: x=%g..%g y=%g..%g horiz=%d\n",
+          underline->x0, underline->x1, underline->y0, underline->y1,
+          underline->horiz);
+  }
+#endif
+
+  if (doHTML) {
+
+    //----- handle underlining
+    for (i = 0; i < underlines->getLength(); ++i) {
+      underline = (TextUnderline *)underlines->get(i);
+      if (underline->horiz) {
+       // rot = 0
+       if (pools[0]->minBaseIdx <= pools[0]->maxBaseIdx) {
+         startBaseIdx = pools[0]->getBaseIdx(underline->y0 + minUnderlineGap);
+         endBaseIdx = pools[0]->getBaseIdx(underline->y0 + maxUnderlineGap);
+         for (j = startBaseIdx; j <= endBaseIdx; ++j) {
+           for (word0 = pools[0]->getPool(j); word0; word0 = word0->next) {
+             //~ need to check the y value against the word baseline
+             if (underline->x0 < word0->xMin + underlineSlack &&
+                 word0->xMax - underlineSlack < underline->x1) {
+               word0->underlined = gTrue;
+             }
+           }
+         }
+       }
+
+       // rot = 2
+       if (pools[2]->minBaseIdx <= pools[2]->maxBaseIdx) {
+         startBaseIdx = pools[2]->getBaseIdx(underline->y0 - maxUnderlineGap);
+         endBaseIdx = pools[2]->getBaseIdx(underline->y0 - minUnderlineGap);
+         for (j = startBaseIdx; j <= endBaseIdx; ++j) {
+           for (word0 = pools[2]->getPool(j); word0; word0 = word0->next) {
+             if (underline->x0 < word0->xMin + underlineSlack &&
+                 word0->xMax - underlineSlack < underline->x1) {
+               word0->underlined = gTrue;
+             }
+           }
+         }
+       }
+      } else {
+       // rot = 1
+       if (pools[1]->minBaseIdx <= pools[1]->maxBaseIdx) {
+         startBaseIdx = pools[1]->getBaseIdx(underline->x0 - maxUnderlineGap);
+         endBaseIdx = pools[1]->getBaseIdx(underline->x0 - minUnderlineGap);
+         for (j = startBaseIdx; j <= endBaseIdx; ++j) {
+           for (word0 = pools[1]->getPool(j); word0; word0 = word0->next) {
+             if (underline->y0 < word0->yMin + underlineSlack &&
+                 word0->yMax - underlineSlack < underline->y1) {
+               word0->underlined = gTrue;
+             }
+           }
+         }
+       }
+
+       // rot = 3
+       if (pools[3]->minBaseIdx <= pools[3]->maxBaseIdx) {
+         startBaseIdx = pools[3]->getBaseIdx(underline->x0 + minUnderlineGap);
+         endBaseIdx = pools[3]->getBaseIdx(underline->x0 + maxUnderlineGap);
+         for (j = startBaseIdx; j <= endBaseIdx; ++j) {
+           for (word0 = pools[3]->getPool(j); word0; word0 = word0->next) {
+             if (underline->y0 < word0->yMin + underlineSlack &&
+                 word0->yMax - underlineSlack < underline->y1) {
+               word0->underlined = gTrue;
+             }
+           }
+         }
+       }
+      }
+    }
+
+    //----- handle links
+    for (i = 0; i < links->getLength(); ++i) {
+      link = (TextLink *)links->get(i);
+
+      // rot = 0
+      if (pools[0]->minBaseIdx <= pools[0]->maxBaseIdx) {
+       startBaseIdx = pools[0]->getBaseIdx(link->yMin);
+       endBaseIdx = pools[0]->getBaseIdx(link->yMax);
+       for (j = startBaseIdx; j <= endBaseIdx; ++j) {
+         for (word0 = pools[0]->getPool(j); word0; word0 = word0->next) {
+           if (link->xMin < word0->xMin + hyperlinkSlack &&
+               word0->xMax - hyperlinkSlack < link->xMax &&
+               link->yMin < word0->yMin + hyperlinkSlack &&
+               word0->yMax - hyperlinkSlack < link->yMax) {
+             word0->link = link->link;
+           }
+         }
+       }
+      }
+
+      // rot = 2
+      if (pools[2]->minBaseIdx <= pools[2]->maxBaseIdx) {
+       startBaseIdx = pools[2]->getBaseIdx(link->yMin);
+       endBaseIdx = pools[2]->getBaseIdx(link->yMax);
+       for (j = startBaseIdx; j <= endBaseIdx; ++j) {
+         for (word0 = pools[2]->getPool(j); word0; word0 = word0->next) {
+           if (link->xMin < word0->xMin + hyperlinkSlack &&
+               word0->xMax - hyperlinkSlack < link->xMax &&
+               link->yMin < word0->yMin + hyperlinkSlack &&
+               word0->yMax - hyperlinkSlack < link->yMax) {
+             word0->link = link->link;
+           }
+         }
+       }
+      }
+
+      // rot = 1
+      if (pools[1]->minBaseIdx <= pools[1]->maxBaseIdx) {
+       startBaseIdx = pools[1]->getBaseIdx(link->xMin);
+       endBaseIdx = pools[1]->getBaseIdx(link->xMax);
+       for (j = startBaseIdx; j <= endBaseIdx; ++j) {
+         for (word0 = pools[1]->getPool(j); word0; word0 = word0->next) {
+           if (link->yMin < word0->yMin + hyperlinkSlack &&
+               word0->yMax - hyperlinkSlack < link->yMax &&
+               link->xMin < word0->xMin + hyperlinkSlack &&
+               word0->xMax - hyperlinkSlack < link->xMax) {
+             word0->link = link->link;
+           }
+         }
+       }
+      }
+
+      // rot = 3
+      if (pools[3]->minBaseIdx <= pools[3]->maxBaseIdx) {
+       startBaseIdx = pools[3]->getBaseIdx(link->xMin);
+       endBaseIdx = pools[3]->getBaseIdx(link->xMax);
+       for (j = startBaseIdx; j <= endBaseIdx; ++j) {
+         for (word0 = pools[3]->getPool(j); word0; word0 = word0->next) {
+           if (link->yMin < word0->yMin + hyperlinkSlack &&
+               word0->yMax - hyperlinkSlack < link->yMax &&
+               link->xMin < word0->xMin + hyperlinkSlack &&
+               word0->xMax - hyperlinkSlack < link->xMax) {
+             word0->link = link->link;
+           }
+         }
+       }
+      }
+    }
+  }
+
+  //----- assemble the blocks
+
+  //~ add an outer loop for writing mode (vertical text)
+
+  // build blocks for each rotation value
+  for (rot = 0; rot < 4; ++rot) {
+    pool = pools[rot];
+    poolMinBaseIdx = pool->minBaseIdx;
+    count[rot] = 0;
+
+    // add blocks until no more words are left
+    while (1) {
+
+      // find the first non-empty line in the pool
+      for (;
+          poolMinBaseIdx <= pool->maxBaseIdx &&
+            !pool->getPool(poolMinBaseIdx);
+          ++poolMinBaseIdx) ;
+      if (poolMinBaseIdx > pool->maxBaseIdx) {
+       break;
+      }
+
+      // look for the left-most word in the first four lines of the
+      // pool -- this avoids starting with a superscript word
+      startBaseIdx = poolMinBaseIdx;
+      for (baseIdx = poolMinBaseIdx + 1;
+          baseIdx < poolMinBaseIdx + 4 && baseIdx <= pool->maxBaseIdx;
+          ++baseIdx) {
+       if (!pool->getPool(baseIdx)) {
+         continue;
+       }
+       if (pool->getPool(baseIdx)->primaryCmp(pool->getPool(startBaseIdx))
+           < 0) {
+         startBaseIdx = baseIdx;
+       }
+      }
+
+      // create a new block
+      word0 = pool->getPool(startBaseIdx);
+      pool->setPool(startBaseIdx, word0->next);
+      word0->next = NULL;
+      blk = new TextBlock(this, rot);
+      blk->addWord(word0);
+
+      fontSize = word0->fontSize;
+      minBase = maxBase = word0->base;
+      colSpace1 = minColSpacing1 * fontSize;
+      colSpace2 = minColSpacing2 * fontSize;
+      lineSpace = maxLineSpacingDelta * fontSize;
+      intraLineSpace = maxIntraLineDelta * fontSize;
+
+      // add words to the block
+      do {
+       found = gFalse;
+
+       // look for words on the line above the current top edge of
+       // the block
+       newMinBase = minBase;
+       for (baseIdx = pool->getBaseIdx(minBase);
+            baseIdx >= pool->getBaseIdx(minBase - lineSpace);
+            --baseIdx) {
+         word0 = NULL;
+         word1 = pool->getPool(baseIdx);
+         while (word1) {
+           if (word1->base < minBase &&
+               word1->base >= minBase - lineSpace &&
+               ((rot == 0 || rot == 2)
+                ? (word1->xMin < blk->xMax && word1->xMax > blk->xMin)
+                : (word1->yMin < blk->yMax && word1->yMax > blk->yMin)) &&
+               fabs(word1->fontSize - fontSize) <
+                 maxBlockFontSizeDelta1 * fontSize) {
+             word2 = word1;
+             if (word0) {
+               word0->next = word1->next;
+             } else {
+               pool->setPool(baseIdx, word1->next);
+             }
+             word1 = word1->next;
+             word2->next = NULL;
+             blk->addWord(word2);
+             found = gTrue;
+             newMinBase = word2->base;
+           } else {
+             word0 = word1;
+             word1 = word1->next;
+           }
+         }
+       }
+       minBase = newMinBase;
+
+       // look for words on the line below the current bottom edge of
+       // the block
+       newMaxBase = maxBase;
+       for (baseIdx = pool->getBaseIdx(maxBase);
+            baseIdx <= pool->getBaseIdx(maxBase + lineSpace);
+            ++baseIdx) {
+         word0 = NULL;
+         word1 = pool->getPool(baseIdx);
+         while (word1) {
+           if (word1->base > maxBase &&
+               word1->base <= maxBase + lineSpace &&
+               ((rot == 0 || rot == 2)
+                ? (word1->xMin < blk->xMax && word1->xMax > blk->xMin)
+                : (word1->yMin < blk->yMax && word1->yMax > blk->yMin)) &&
+               fabs(word1->fontSize - fontSize) <
+                 maxBlockFontSizeDelta1 * fontSize) {
+             word2 = word1;
+             if (word0) {
+               word0->next = word1->next;
+             } else {
+               pool->setPool(baseIdx, word1->next);
+             }
+             word1 = word1->next;
+             word2->next = NULL;
+             blk->addWord(word2);
+             found = gTrue;
+             newMaxBase = word2->base;
+           } else {
+             word0 = word1;
+             word1 = word1->next;
+           }
+         }
+       }
+       maxBase = newMaxBase;
+
+       // look for words that are on lines already in the block, and
+       // that overlap the block horizontally
+       for (baseIdx = pool->getBaseIdx(minBase - intraLineSpace);
+            baseIdx <= pool->getBaseIdx(maxBase + intraLineSpace);
+            ++baseIdx) {
+         word0 = NULL;
+         word1 = pool->getPool(baseIdx);
+         while (word1) {
+           if (word1->base >= minBase - intraLineSpace &&
+               word1->base <= maxBase + intraLineSpace &&
+               ((rot == 0 || rot == 2)
+                ? (word1->xMin < blk->xMax + colSpace1 &&
+                   word1->xMax > blk->xMin - colSpace1)
+                : (word1->yMin < blk->yMax + colSpace1 &&
+                   word1->yMax > blk->yMin - colSpace1)) &&
+               fabs(word1->fontSize - fontSize) <
+                 maxBlockFontSizeDelta2 * fontSize) {
+             word2 = word1;
+             if (word0) {
+               word0->next = word1->next;
+             } else {
+               pool->setPool(baseIdx, word1->next);
+             }
+             word1 = word1->next;
+             word2->next = NULL;
+             blk->addWord(word2);
+             found = gTrue;
+           } else {
+             word0 = word1;
+             word1 = word1->next;
+           }
+         }
+       }
+
+       // only check for outlying words (the next two chunks of code)
+       // if we didn't find anything else
+       if (found) {
+         continue;
+       }
+
+       // scan down the left side of the block, looking for words
+       // that are near (but not overlapping) the block; if there are
+       // three or fewer, add them to the block
+       n = 0;
+       for (baseIdx = pool->getBaseIdx(minBase - intraLineSpace);
+            baseIdx <= pool->getBaseIdx(maxBase + intraLineSpace);
+            ++baseIdx) {
+         word1 = pool->getPool(baseIdx);
+         while (word1) {
+           if (word1->base >= minBase - intraLineSpace &&
+               word1->base <= maxBase + intraLineSpace &&
+               ((rot == 0 || rot == 2)
+                ? (word1->xMax <= blk->xMin &&
+                   word1->xMax > blk->xMin - colSpace2)
+                : (word1->yMax <= blk->yMin &&
+                   word1->yMax > blk->yMin - colSpace2)) &&
+               fabs(word1->fontSize - fontSize) <
+                 maxBlockFontSizeDelta3 * fontSize) {
+             ++n;
+             break;
+           }
+           word1 = word1->next;
+         }
+       }
+       if (n > 0 && n <= 3) {
+         for (baseIdx = pool->getBaseIdx(minBase - intraLineSpace);
+              baseIdx <= pool->getBaseIdx(maxBase + intraLineSpace);
+              ++baseIdx) {
+           word0 = NULL;
+           word1 = pool->getPool(baseIdx);
+           while (word1) {
+             if (word1->base >= minBase - intraLineSpace &&
+                 word1->base <= maxBase + intraLineSpace &&
+                 ((rot == 0 || rot == 2)
+                  ? (word1->xMax <= blk->xMin &&
+                     word1->xMax > blk->xMin - colSpace2)
+                  : (word1->yMax <= blk->yMin &&
+                     word1->yMax > blk->yMin - colSpace2)) &&
+                 fabs(word1->fontSize - fontSize) <
+                   maxBlockFontSizeDelta3 * fontSize) {
+               word2 = word1;
+               if (word0) {
+                 word0->next = word1->next;
+               } else {
+                 pool->setPool(baseIdx, word1->next);
+               }
+               word1 = word1->next;
+               word2->next = NULL;
+               blk->addWord(word2);
+               if (word2->base < minBase) {
+                 minBase = word2->base;
+               } else if (word2->base > maxBase) {
+                 maxBase = word2->base;
+               }
+               found = gTrue;
+               break;
+             } else {
+               word0 = word1;
+               word1 = word1->next;
+             }
+           }
+         }
+       }
+
+       // scan down the right side of the block, looking for words
+       // that are near (but not overlapping) the block; if there are
+       // three or fewer, add them to the block
+       n = 0;
+       for (baseIdx = pool->getBaseIdx(minBase - intraLineSpace);
+            baseIdx <= pool->getBaseIdx(maxBase + intraLineSpace);
+            ++baseIdx) {
+         word1 = pool->getPool(baseIdx);
+         while (word1) {
+           if (word1->base >= minBase - intraLineSpace &&
+               word1->base <= maxBase + intraLineSpace &&
+               ((rot == 0 || rot == 2)
+                ? (word1->xMin >= blk->xMax &&
+                   word1->xMin < blk->xMax + colSpace2)
+                : (word1->yMin >= blk->yMax &&
+                   word1->yMin < blk->yMax + colSpace2)) &&
+               fabs(word1->fontSize - fontSize) <
+                 maxBlockFontSizeDelta3 * fontSize) {
+             ++n;
+             break;
+           }
+           word1 = word1->next;
+         }
+       }
+       if (n > 0 && n <= 3) {
+         for (baseIdx = pool->getBaseIdx(minBase - intraLineSpace);
+              baseIdx <= pool->getBaseIdx(maxBase + intraLineSpace);
+              ++baseIdx) {
+           word0 = NULL;
+           word1 = pool->getPool(baseIdx);
+           while (word1) {
+             if (word1->base >= minBase - intraLineSpace &&
+                 word1->base <= maxBase + intraLineSpace &&
+                 ((rot == 0 || rot == 2)
+                  ? (word1->xMin >= blk->xMax &&
+                     word1->xMin < blk->xMax + colSpace2)
+                  : (word1->yMin >= blk->yMax &&
+                     word1->yMin < blk->yMax + colSpace2)) &&
+                 fabs(word1->fontSize - fontSize) <
+                   maxBlockFontSizeDelta3 * fontSize) {
+               word2 = word1;
+               if (word0) {
+                 word0->next = word1->next;
+               } else {
+                 pool->setPool(baseIdx, word1->next);
+               }
+               word1 = word1->next;
+               word2->next = NULL;
+               blk->addWord(word2);
+               if (word2->base < minBase) {
+                 minBase = word2->base;
+               } else if (word2->base > maxBase) {
+                 maxBase = word2->base;
+               }
+               found = gTrue;
+               break;
+             } else {
+               word0 = word1;
+               word1 = word1->next;
+             }
+           }
+         }
+       }
+
+      } while (found);
+
+      //~ need to compute the primary writing mode (horiz/vert) in
+      //~ addition to primary rotation
+
+      // coalesce the block, and add it to the list
+      blk->coalesce(uMap, fixedPitch);
+      if (lastBlk) {
+       lastBlk->next = blk;
+      } else {
+       blkList = blk;
+      }
+      lastBlk = blk;
+      count[rot] += blk->charCount;
+      ++nBlocks;
+    }
+
+    if (count[rot] > count[primaryRot]) {
+      primaryRot = rot;
+    }
+  }
+
+#if 0 // for debugging
+  printf("*** rotation ***\n");
+  for (rot = 0; rot < 4; ++rot) {
+    printf("  %d: %6d\n", rot, count[rot]);
+  }
+  printf("  primary rot = %d\n", primaryRot);
+  printf("\n");
+#endif
+
+#if 0 // for debugging
+  printf("*** blocks ***\n");
+  for (blk = blkList; blk; blk = blk->next) {
+    printf("block: rot=%d x=%.2f..%.2f y=%.2f..%.2f\n",
+          blk->rot, blk->xMin, blk->xMax, blk->yMin, blk->yMax);
+    for (line = blk->lines; line; line = line->next) {
+      printf("  line: x=%.2f..%.2f y=%.2f..%.2f base=%.2f\n",
+            line->xMin, line->xMax, line->yMin, line->yMax, line->base);
+      for (word0 = line->words; word0; word0 = word0->next) {
+       printf("    word: x=%.2f..%.2f y=%.2f..%.2f base=%.2f fontSize=%.2f space=%d: '",
+              word0->xMin, word0->xMax, word0->yMin, word0->yMax,
+              word0->base, word0->fontSize, word0->spaceAfter);
+       for (i = 0; i < word0->len; ++i) {
+         fputc(word0->text[i] & 0xff, stdout);
+       }
+       printf("'\n");
+      }
+    }
+  }
+  printf("\n");
+#endif
+
+  // determine the primary direction
+  lrCount = 0;
+  for (blk = blkList; blk; blk = blk->next) {
+    for (line = blk->lines; line; line = line->next) {
+      for (word0 = line->words; word0; word0 = word0->next) {
+       for (i = 0; i < word0->len; ++i) {
+         if (unicodeTypeL(word0->text[i])) {
+           ++lrCount;
+         } else if (unicodeTypeR(word0->text[i])) {
+           --lrCount;
+         }
+       }
+      }
+    }
+  }
+  primaryLR = lrCount >= 0;
+
+#if 0 // for debugging
+  printf("*** direction ***\n");
+  printf("lrCount = %d\n", lrCount);
+  printf("primaryLR = %d\n", primaryLR);
+#endif
+
+  //----- column assignment
+
+  // sort blocks into xy order for column assignment
+  if (blocks)
+    gfree (blocks);
+  if (physLayout && fixedPitch) {
+
+    blocks = (TextBlock **)gmallocn(nBlocks, sizeof(TextBlock *));
+    for (blk = blkList, i = 0; blk; blk = blk->next, ++i) {
+      blocks[i] = blk;
+      col1 = 0; // make gcc happy
+      switch (primaryRot) {
+      case 0:
+       col1 = (int)(blk->xMin / fixedPitch + 0.5);
+       break;
+      case 1:
+       col1 = (int)(blk->yMin / fixedPitch + 0.5);
+       break;
+      case 2:
+       col1 = (int)((pageWidth - blk->xMax) / fixedPitch + 0.5);
+       break;
+      case 3:
+       col1 = (int)((pageHeight - blk->yMax) / fixedPitch + 0.5);
+       break;
+      }
+      blk->col = col1;
+      for (line = blk->lines; line; line = line->next) {
+       for (j = 0; j <= line->len; ++j) {
+         line->col[j] += col1;
+       }
+      }
+    }
+
+  } else {
+
+    // sort blocks into xy order for column assignment
+    blocks = (TextBlock **)gmallocn(nBlocks, sizeof(TextBlock *));
+    for (blk = blkList, i = 0; blk; blk = blk->next, ++i) {
+      blocks[i] = blk;
+    }
+    qsort(blocks, nBlocks, sizeof(TextBlock *), &TextBlock::cmpXYPrimaryRot);
+
+    // column assignment
+    for (i = 0; i < nBlocks; ++i) {
+      blk0 = blocks[i];
+      col1 = 0;
+      for (j = 0; j < i; ++j) {
+       blk1 = blocks[j];
+       col2 = 0; // make gcc happy
+       switch (primaryRot) {
+       case 0:
+         if (blk0->xMin > blk1->xMax) {
+           col2 = blk1->col + blk1->nColumns + 3;
+         } else if (blk1->xMax == blk1->xMin) {
+           col2 = blk1->col;
+         } else {
+           col2 = blk1->col + (int)(((blk0->xMin - blk1->xMin) /
+                                     (blk1->xMax - blk1->xMin)) *
+                                    blk1->nColumns);
+         }
+         break;
+       case 1:
+         if (blk0->yMin > blk1->yMax) {
+           col2 = blk1->col + blk1->nColumns + 3;
+         } else if (blk1->yMax == blk1->yMin) {
+           col2 = blk1->col;
+         } else {
+           col2 = blk1->col + (int)(((blk0->yMin - blk1->yMin) /
+                                     (blk1->yMax - blk1->yMin)) *
+                                    blk1->nColumns);
+         }
+         break;
+       case 2:
+         if (blk0->xMax < blk1->xMin) {
+           col2 = blk1->col + blk1->nColumns + 3;
+         } else if (blk1->xMin == blk1->xMax) {
+           col2 = blk1->col;
+         } else {
+           col2 = blk1->col + (int)(((blk0->xMax - blk1->xMax) /
+                                     (blk1->xMin - blk1->xMax)) *
+                                    blk1->nColumns);
+         }
+         break;
+       case 3:
+         if (blk0->yMax < blk1->yMin) {
+           col2 = blk1->col + blk1->nColumns + 3;
+         } else if (blk1->yMin == blk1->yMax) {
+           col2 = blk1->col;
+         } else {
+           col2 = blk1->col + (int)(((blk0->yMax - blk1->yMax) /
+                                     (blk1->yMin - blk1->yMax)) *
+                                    blk1->nColumns);
+         }
+         break;
+       }
+       if (col2 > col1) {
+         col1 = col2;
+       }
+      }
+      blk0->col = col1;
+      for (line = blk0->lines; line; line = line->next) {
+       for (j = 0; j <= line->len; ++j) {
+         line->col[j] += col1;
+       }
+      }
+    }
+
+  }
+
+#if 0 // for debugging
+  printf("*** blocks, after column assignment ***\n");
+  for (blk = blkList; blk; blk = blk->next) {
+    printf("block: rot=%d x=%.2f..%.2f y=%.2f..%.2f col=%d nCols=%d\n",
+          blk->rot, blk->xMin, blk->xMax, blk->yMin, blk->yMax, blk->col,
+          blk->nColumns);
+    for (line = blk->lines; line; line = line->next) {
+      printf("  line: col[0]=%d\n", line->col[0]);
+      for (word0 = line->words; word0; word0 = word0->next) {
+       printf("    word: x=%.2f..%.2f y=%.2f..%.2f base=%.2f fontSize=%.2f space=%d: '",
+              word0->xMin, word0->xMax, word0->yMin, word0->yMax,
+              word0->base, word0->fontSize, word0->spaceAfter);
+       for (i = 0; i < word0->len; ++i) {
+         fputc(word0->text[i] & 0xff, stdout);
+       }
+       printf("'\n");
+      }
+    }
+  }
+  printf("\n");
+#endif
+
+  //----- reading order sort
+
+  // compute space on left and right sides of each block
+  for (i = 0; i < nBlocks; ++i) {
+    blk0 = blocks[i];
+    for (j = 0; j < nBlocks; ++j) {
+      blk1 = blocks[j];
+      if (blk1 != blk0) {
+       blk0->updatePriMinMax(blk1);
+      }
+    }
+  }
+
+#if 0 // for debugging
+  printf("PAGE\n");
+#endif
+
+  int sortPos = 0;
+  GBool *visited = (GBool *)gmallocn(nBlocks, sizeof(GBool));
+  for (i = 0; i < nBlocks; i++) {
+    visited[i] = gFalse;
+  }
+
+  double bxMin0, byMin0, bxMin1, byMin1;
+  int numTables = 0;
+  int tableId = -1;
+  int correspondenceX, correspondenceY;
+  double xCentre1, yCentre1, xCentre2, yCentre2;
+  double xCentre3, yCentre3, xCentre4, yCentre4;
+  double deltaX, deltaY;
+  TextBlock *fblk2 = NULL, *fblk3 = NULL, *fblk4 = NULL;
+
+  for (blk1 = blkList; blk1; blk1 = blk1->next) {
+    blk1->ExMin = blk1->xMin;
+    blk1->ExMax = blk1->xMax;
+    blk1->EyMin = blk1->yMin;
+    blk1->EyMax = blk1->yMax;
+
+    bxMin0 = DBL_MAX;
+    byMin0 = DBL_MAX;
+    bxMin1 = DBL_MAX;
+    byMin1 = DBL_MAX;
+
+    fblk2 = NULL;
+    fblk3 = NULL;
+    fblk4 = NULL;
+
+    /*  find fblk2, fblk3 and fblk4 so that
+     *  fblk2 is on the right of blk1 and overlap with blk1 in y axis
+     *  fblk3 is under blk1 and overlap with blk1 in x axis
+     *  fblk4 is under blk1 and on the right of blk1
+     *  and they are closest to blk1
+     */
+    for (blk2 = blkList; blk2; blk2 = blk2->next) {
+      if (blk2 != blk1) {
+        if (blk2->yMin <= blk1->yMax &&
+            blk2->yMax >= blk1->yMin &&
+            blk2->xMin > blk1->xMax &&
+            blk2->xMin < bxMin0) {
+          bxMin0 = blk2->xMin;
+          fblk2 = blk2;
+        } else if (blk2->xMin <= blk1->xMax &&
+                   blk2->xMax >= blk1->xMin &&
+                   blk2->yMin > blk1->yMax &&
+                   blk2->yMin < byMin0) {
+          byMin0 = blk2->yMin;
+          fblk3 = blk2;
+        } else if (blk2->xMin > blk1->xMax &&
+                   blk2->xMin < bxMin1 &&
+                   blk2->yMin > blk1->yMax &&
+                   blk2->yMin < byMin1) {
+          bxMin1 = blk2->xMin;
+          byMin1 = blk2->yMin;
+          fblk4 = blk2;
+        }
+      }
+    }
+
+    /*  fblk4 can not overlap with fblk3 in x and with fblk2 in y
+     *  fblk2 can not overlap with fblk3 in x and y
+     *  fblk4 has to overlap with fblk3 in y and with fblk2 in x
+     */
+    if (fblk2 != NULL &&
+        fblk3 != NULL &&
+        fblk4 != NULL) {
+      if (((fblk3->xMin <= fblk4->xMax && fblk3->xMax >= fblk4->xMin) ||
+           (fblk2->yMin <= fblk4->yMax && fblk2->yMax >= fblk4->yMin) ||
+           (fblk2->xMin <= fblk3->xMax && fblk2->xMax >= fblk3->xMin) ||
+           (fblk2->yMin <= fblk3->yMax && fblk2->yMax >= fblk3->yMin)) ||
+          !(fblk4->xMin <= fblk2->xMax && fblk4->xMax >= fblk2->xMin &&
+            fblk4->yMin <= fblk3->yMax && fblk4->yMax >= fblk3->yMin)) {
+        fblk2 = NULL;
+        fblk3 = NULL;
+        fblk4 = NULL;
+      }
+    }
+
+    // if we found any then look whether they form a table
+    if (fblk2 != NULL &&
+        fblk3 != NULL &&
+        fblk4 != NULL) {
+      tableId = -1;
+      correspondenceX = 0;
+      correspondenceY = 0;
+      deltaX = 0.0;
+      deltaY = 0.0;
+
+      if (blk1->lines && blk1->lines->words)
+        deltaX = blk1->lines->words->getFontSize();
+      if (fblk2->lines && fblk2->lines->words)
+        deltaX = deltaX < fblk2->lines->words->getFontSize() ?
+                   deltaX : fblk2->lines->words->getFontSize();
+      if (fblk3->lines && fblk3->lines->words)
+        deltaX = deltaX < fblk3->lines->words->getFontSize() ?
+                   deltaX : fblk3->lines->words->getFontSize();
+      if (fblk4->lines && fblk4->lines->words)
+        deltaX = deltaX < fblk4->lines->words->getFontSize() ?
+                   deltaX : fblk4->lines->words->getFontSize();
+
+      deltaY = deltaX;
+
+      deltaX *= minColSpacing1;
+      deltaY *= maxIntraLineDelta;
+
+      xCentre1 = (blk1->xMax + blk1->xMin) / 2.0;
+      yCentre1 = (blk1->yMax + blk1->yMin) / 2.0;
+      xCentre2 = (fblk2->xMax + fblk2->xMin) / 2.0;
+      yCentre2 = (fblk2->yMax + fblk2->yMin) / 2.0;
+      xCentre3 = (fblk3->xMax + fblk3->xMin) / 2.0;
+      yCentre3 = (fblk3->yMax + fblk3->yMin) / 2.0;
+      xCentre4 = (fblk4->xMax + fblk4->xMin) / 2.0;
+      yCentre4 = (fblk4->yMax + fblk4->yMin) / 2.0;
+
+      // are blocks centrally aligned in x ?
+      if (fabs (xCentre1 - xCentre3) <= deltaX &&
+          fabs (xCentre2 - xCentre4) <= deltaX)
+        correspondenceX++;
+
+      // are blocks centrally aligned in y ?
+      if (fabs (yCentre1 - yCentre2) <= deltaY &&
+          fabs (yCentre3 - yCentre4) <= deltaY)
+        correspondenceY++;
+
+      // are blocks aligned to the left ?
+      if (fabs (blk1->xMin - fblk3->xMin) <= deltaX &&
+          fabs (fblk2->xMin - fblk4->xMin) <= deltaX)
+        correspondenceX++;
+
+      // are blocks aligned to the right ?
+      if (fabs (blk1->xMax - fblk3->xMax) <= deltaX &&
+          fabs (fblk2->xMax - fblk4->xMax) <= deltaX)
+        correspondenceX++;
+
+      // are blocks aligned to the top ?
+      if (fabs (blk1->yMin - fblk2->yMin) <= deltaY &&
+          fabs (fblk3->yMin - fblk4->yMin) <= deltaY)
+        correspondenceY++;
+
+      // are blocks aligned to the bottom ?
+      if (fabs (blk1->yMax - fblk2->yMax) <= deltaY &&
+          fabs (fblk3->yMax - fblk4->yMax) <= deltaY)
+        correspondenceY++;
+
+      // are blocks aligned in x and y ?
+      if (correspondenceX > 0 &&
+          correspondenceY > 0) {
+
+        // find maximal tableId
+        tableId = tableId < fblk4->tableId ? fblk4->tableId : tableId;
+        tableId = tableId < fblk3->tableId ? fblk3->tableId : tableId;
+        tableId = tableId < fblk2->tableId ? fblk2->tableId : tableId;
+        tableId = tableId < blk1->tableId ? blk1->tableId : tableId;
+
+        // if the tableId is -1, then we found new table
+        if (tableId < 0) {
+          tableId = numTables;
+          numTables++;
+        }
+
+        blk1->tableId = tableId;
+        fblk2->tableId = tableId;
+        fblk3->tableId = tableId;
+        fblk4->tableId = tableId;
+      }
+    }
+  }
+
+  /*  set extended bounding boxes of all table entries
+   *  so that they contain whole table
+   *  (we need to process whole table size when comparing it
+   *   with regular text blocks)
+   */
+  PDFRectangle *envelopes = new PDFRectangle [numTables];
+  TextBlock **ending_blocks = new TextBlock* [numTables];
+
+  for (i = 0; i < numTables; i++) {
+    envelopes[i].x1 = DBL_MAX;
+    envelopes[i].x2 = DBL_MIN;
+    envelopes[i].y1 = DBL_MAX;
+    envelopes[i].y2 = DBL_MIN;
+  }
+
+  for (blk1 = blkList; blk1; blk1 = blk1->next) {
+    if (blk1->tableId >= 0) {
+      if (blk1->ExMin < envelopes[blk1->tableId].x1) {
+        envelopes[blk1->tableId].x1 = blk1->ExMin;
+        if (!blk1->page->primaryLR)
+          ending_blocks[blk1->tableId] = blk1;
+      }
+
+      if (blk1->ExMax > envelopes[blk1->tableId].x2) {
+        envelopes[blk1->tableId].x2 = blk1->ExMax;
+        if (blk1->page->primaryLR)
+          ending_blocks[blk1->tableId] = blk1;
+      }
+
+      envelopes[blk1->tableId].y1 = blk1->EyMin < envelopes[blk1->tableId].y1 ?
+                                      blk1->EyMin : envelopes[blk1->tableId].y1;
+      envelopes[blk1->tableId].y2 = blk1->EyMax > envelopes[blk1->tableId].y2 ?
+                                      blk1->EyMax : envelopes[blk1->tableId].y2;
+    }
+  }
+
+  for (blk1 = blkList; blk1; blk1 = blk1->next) {
+    if (blk1->tableId >= 0 &&
+        blk1->xMin <= ending_blocks[blk1->tableId]->xMax &&
+        blk1->xMax >= ending_blocks[blk1->tableId]->xMin) {
+      blk1->tableEnd = gTrue;
+    }
+  }
+
+  for (blk1 = blkList; blk1; blk1 = blk1->next) {
+    if (blk1->tableId >= 0) {
+      blk1->ExMin = envelopes[blk1->tableId].x1;
+      blk1->ExMax = envelopes[blk1->tableId].x2;
+      blk1->EyMin = envelopes[blk1->tableId].y1;
+      blk1->EyMax = envelopes[blk1->tableId].y2;
+    }
+  }
+  delete[] envelopes;
+  delete[] ending_blocks;
+
+
+  /*  set extended bounding boxes of all other blocks
+   *  so that they extend in x without hitting neighbours
+   */
+  for (blk1 = blkList; blk1; blk1 = blk1->next) {
+    if (!blk1->tableId >= 0) {
+      double xMax = DBL_MAX;
+      double xMin = DBL_MIN;
+
+      for (blk2 = blkList; blk2; blk2 = blk2->next) {
+        if (blk2 == blk1)
+           continue;
+
+        if (blk1->yMin <= blk2->yMax && blk1->yMax >= blk2->yMin) {
+          if (blk2->xMin < xMax && blk2->xMin > blk1->xMax)
+            xMax = blk2->xMin;
+
+          if (blk2->xMax > xMin && blk2->xMax < blk1->xMin)
+            xMin = blk2->xMax;
+        }
+      }
+
+      for (blk2 = blkList; blk2; blk2 = blk2->next) {
+        if (blk2 == blk1)
+           continue;
+
+        if (blk2->xMax > blk1->ExMax &&
+            blk2->xMax <= xMax &&
+            blk2->yMin >= blk1->yMax) {
+          blk1->ExMax = blk2->xMax;
+        }
+
+        if (blk2->xMin < blk1->ExMin &&
+            blk2->xMin >= xMin &&
+            blk2->yMin >= blk1->yMax)
+          blk1->ExMin = blk2->xMin;
+      }
+    }
+  }
+
+  i = -1;
+  for (blk1 = blkList; blk1; blk1 = blk1->next) {
+    i++;
+    sortPos = blk1->visitDepthFirst(blkList, i, blocks, sortPos, visited);
+  }
+  if (visited) {
+    gfree(visited);
+  }
+
+#if 0 // for debugging
+  printf("*** blocks, after ro sort ***\n");
+  for (i = 0; i < nBlocks; ++i) {
+    blk = blocks[i];
+    printf("block: rot=%d x=%.2f..%.2f y=%.2f..%.2f space=%.2f..%.2f\n",
+          blk->rot, blk->xMin, blk->xMax, blk->yMin, blk->yMax,
+          blk->priMin, blk->priMax);
+    for (line = blk->lines; line; line = line->next) {
+      printf("  line:\n");
+      for (word0 = line->words; word0; word0 = word0->next) {
+       printf("    word: x=%.2f..%.2f y=%.2f..%.2f base=%.2f fontSize=%.2f space=%d: '",
+              word0->xMin, word0->xMax, word0->yMin, word0->yMax,
+              word0->base, word0->fontSize, word0->spaceAfter);
+       for (j = 0; j < word0->len; ++j) {
+         fputc(word0->text[j] & 0xff, stdout);
+       }
+       printf("'\n");
+      }
+    }
+  }
+  printf("\n");
+  fflush(stdout);
+#endif
+
+  // build the flows
+  //~ this needs to be adjusted for writing mode (vertical text)
+  //~ this also needs to account for right-to-left column ordering
+  flow = NULL;
+  while (flows) {
+    flow = flows;
+    flows = flows->next;
+    delete flow;
+  }
+  flows = lastFlow = NULL;
+  // assume blocks are already in reading order,
+  // and construct flows accordingly.
+  for (i = 0; i < nBlocks; i++) {
+    blk = blocks[i];
+    blk->next = NULL;
+    if (flow) {
+      blk1 = blocks[i - 1];
+      blkSpace = maxBlockSpacing * blk1->lines->words->fontSize;
+      if (blk1->secondaryDelta(blk) <= blkSpace &&
+         blk->isBelow(blk1) &&
+         flow->blockFits(blk, blk1)) {
+       flow->addBlock(blk);
+       continue;
+      }
+    }
+    flow = new TextFlow(this, blk);
+    if (lastFlow) {
+      lastFlow->next = flow;
+    } else {
+      flows = flow;
+    }
+    lastFlow = flow;
+  }
+
+#if 0 // for debugging
+  printf("*** flows ***\n");
+  for (flow = flows; flow; flow = flow->next) {
+    printf("flow: x=%.2f..%.2f y=%.2f..%.2f pri:%.2f..%.2f\n",
+          flow->xMin, flow->xMax, flow->yMin, flow->yMax,
+          flow->priMin, flow->priMax);
+    for (blk = flow->blocks; blk; blk = blk->next) {
+      printf("  block: rot=%d x=%.2f..%.2f y=%.2f..%.2f pri=%.2f..%.2f\n",
+            blk->rot, blk->ExMin, blk->ExMax, blk->EyMin, blk->EyMax,
+            blk->priMin, blk->priMax);
+      for (line = blk->lines; line; line = line->next) {
+       printf("    line:\n");
+       for (word0 = line->words; word0; word0 = word0->next) {
+         printf("      word: x=%.2f..%.2f y=%.2f..%.2f base=%.2f fontSize=%.2f space=%d: '",
+                word0->xMin, word0->xMax, word0->yMin, word0->yMax,
+                word0->base, word0->fontSize, word0->spaceAfter);
+         for (i = 0; i < word0->len; ++i) {
+           fputc(word0->text[i] & 0xff, stdout);
+         }
+         printf("'\n");
+       }
+      }
+    }
+  }
+  printf("\n");
+#endif
+
+  if (uMap) {
+    uMap->decRefCnt();
+  }
+}
+
+GBool TextPage::findText(Unicode *s, int len,
+                        GBool startAtTop, GBool stopAtBottom,
+                        GBool startAtLast, GBool stopAtLast,
+                        GBool caseSensitive, GBool backward,
+                        GBool wholeWord,
+                        double *xMin, double *yMin,
+                        double *xMax, double *yMax) {
+  TextBlock *blk;
+  TextLine *line;
+  Unicode *s2, *txt;
+  Unicode *p;
+  int txtSize, m, i, j, k;
+  double xStart, yStart, xStop, yStop;
+  double xMin0, yMin0, xMax0, yMax0;
+  double xMin1, yMin1, xMax1, yMax1;
+  GBool found;
+
+  //~ needs to handle right-to-left text
+
+  if (rawOrder) {
+    return gFalse;
+  }
+
+  // convert the search string to uppercase
+  if (!caseSensitive) {
+    s2 = unicodeNormalizeNFKC(s, len, &len, NULL);
+    for (i = 0; i < len; ++i) {
+      s2[i] = unicodeToUpper(s2[i]);
+    }
+  } else {
+    s2 = unicodeNormalizeNFKC(s, len, &len, NULL);
+  }
+
+  txt = NULL;
+  txtSize = 0;
+
+  xStart = yStart = xStop = yStop = 0;
+  if (startAtLast && haveLastFind) {
+    xStart = lastFindXMin;
+    yStart = lastFindYMin;
+  } else if (!startAtTop) {
+    xStart = *xMin;
+    yStart = *yMin;
+  }
+  if (stopAtLast && haveLastFind) {
+    xStop = lastFindXMin;
+    yStop = lastFindYMin;
+  } else if (!stopAtBottom) {
+    xStop = *xMax;
+    yStop = *yMax;
+  }
+
+  found = gFalse;
+  xMin0 = xMax0 = yMin0 = yMax0 = 0; // make gcc happy
+  xMin1 = xMax1 = yMin1 = yMax1 = 0; // make gcc happy
+
+  for (i = backward ? nBlocks - 1 : 0;
+       backward ? i >= 0 : i < nBlocks;
+       i += backward ? -1 : 1) {
+    blk = blocks[i];
+
+    // check: is the block above the top limit?
+    // (this only works if the page's primary rotation is zero --
+    // otherwise the blocks won't be sorted in the useful order)
+    if (!startAtTop && primaryRot == 0 &&
+       (backward ? blk->yMin > yStart : blk->yMax < yStart)) {
+      continue;
+    }
+
+    // check: is the block below the bottom limit?
+    // (this only works if the page's primary rotation is zero --
+    // otherwise the blocks won't be sorted in the useful order)
+    if (!stopAtBottom && primaryRot == 0 &&
+       (backward ? blk->yMax < yStop : blk->yMin > yStop)) {
+      break;
+    }
+
+    for (line = blk->lines; line; line = line->next) {
+
+      // check: is the line above the top limit?
+      // (this only works if the page's primary rotation is zero --
+      // otherwise the lines won't be sorted in the useful order)
+      if (!startAtTop && primaryRot == 0 &&
+         (backward ? line->yMin > yStart : line->yMin < yStart)) {
+       continue;
+      }
+
+      // check: is the line below the bottom limit?
+      // (this only works if the page's primary rotation is zero --
+      // otherwise the lines won't be sorted in the useful order)
+      if (!stopAtBottom && primaryRot == 0 &&
+         (backward ? line->yMin < yStop : line->yMin > yStop)) {
+       continue;
+      }
+
+      if (!line->normalized)
+       line->normalized = unicodeNormalizeNFKC(line->text, line->len, 
+                                               &line->normalized_len, 
+                                               &line->normalized_idx);
+      // convert the line to uppercase
+      m = line->normalized_len;
+      if (!caseSensitive) {
+       if (m > txtSize) {
+         txt = (Unicode *)greallocn(txt, m, sizeof(Unicode));
+         txtSize = m;
+       }
+       for (k = 0; k < m; ++k) {
+         txt[k] = unicodeToUpper(line->normalized[k]);
+         }
+      } else {
+       txt = line->normalized;
+      }
+
+      // search each position in this line
+      j = backward ? m - len : 0;
+      p = txt + j;
+      while (backward ? j >= 0 : j <= m - len) {
+
+       // compare the strings
+       for (k = 0; k < len; ++k) {
+         if (p[k] != s2[k]) {
+           break;
+         }
+       }
+
+       // found it
+       if (k == len) {
+         // where s2 matches a subsequence of a compatibility equivalence
+         // decomposition, highlight the entire glyph, since we don't know
+         // the internal layout of subglyph components
+         int normStart = line->normalized_idx[j];
+         int normAfterEnd = line->normalized_idx[j + len - 1] + 1;
+         switch (line->rot) {
+         case 0:
+           xMin1 = line->edge[normStart];
+           xMax1 = line->edge[normAfterEnd];
+           yMin1 = line->yMin;
+           yMax1 = line->yMax;
+           break;
+         case 1:
+           xMin1 = line->xMin;
+           xMax1 = line->xMax;
+           yMin1 = line->edge[normStart];
+           yMax1 = line->edge[normAfterEnd];
+           break;
+         case 2:
+           xMin1 = line->edge[normAfterEnd];
+           xMax1 = line->edge[normStart];
+           yMin1 = line->yMin;
+           yMax1 = line->yMax;
+           break;
+         case 3:
+           xMin1 = line->xMin;
+           xMax1 = line->xMax;
+           yMin1 = line->edge[normAfterEnd];
+           yMax1 = line->edge[normStart];
+           break;
+         }
+         if (backward) {
+           if ((startAtTop ||
+                yMin1 < yStart || (yMin1 == yStart && xMin1 < xStart)) &&
+               (stopAtBottom ||
+                yMin1 > yStop || (yMin1 == yStop && xMin1 > xStop))) {
+             if (!found ||
+                 yMin1 > yMin0 || (yMin1 == yMin0 && xMin1 > xMin0)) {
+               xMin0 = xMin1;
+               xMax0 = xMax1;
+               yMin0 = yMin1;
+               yMax0 = yMax1;
+               found = gTrue;
+             }
+           }
+         } else {
+           if ((startAtTop ||
+                yMin1 > yStart || (yMin1 == yStart && xMin1 > xStart)) &&
+               (stopAtBottom ||
+                yMin1 < yStop || (yMin1 == yStop && xMin1 < xStop))) {
+             if (!found ||
+                 yMin1 < yMin0 || (yMin1 == yMin0 && xMin1 < xMin0)) {
+               xMin0 = xMin1;
+               xMax0 = xMax1;
+               yMin0 = yMin1;
+               yMax0 = yMax1;
+               found = gTrue;
+             }
+           }
+         }
+       }
+       if (backward) {
+         --j;
+         --p;
+       } else {
+         ++j;
+         ++p;
+       }
+      }
+    }
+    }
+
+  gfree(s2);
+  if (!caseSensitive) {
+    gfree(txt);
+  }
+
+  if (found) {
+    *xMin = xMin0;
+    *xMax = xMax0;
+    *yMin = yMin0;
+    *yMax = yMax0;
+    lastFindXMin = xMin0;
+    lastFindYMin = yMin0;
+    haveLastFind = gTrue;
+    return gTrue;
+  }
+
+  return gFalse;
+}
+
+GooString *TextPage::getText(double xMin, double yMin,
+                          double xMax, double yMax) {
+  GooString *s;
+  UnicodeMap *uMap;
+  TextBlock *blk;
+  TextLine *line;
+  TextLineFrag *frags;
+  int nFrags, fragsSize;
+  TextLineFrag *frag;
+  char space[8], eol[16];
+  int spaceLen, eolLen;
+  int lastRot;
+  double x, y, delta;
+  int col, idx0, idx1, i, j;
+  GBool multiLine, oneRot;
+
+  s = new GooString();
+
+  // get the output encoding
+  if (!(uMap = globalParams->getTextEncoding())) {
+    return s;
+  }
+
+  if (rawOrder) {
+    TextWord*  word;
+    char mbc[16];
+    int  mbc_len;
+
+    for (word = rawWords; word && word <= rawLastWord; word = word->next) {
+      for (j = 0; j < word->getLength(); ++j) {
+        double gXMin, gXMax, gYMin, gYMax;
+        word->getCharBBox(j, &gXMin, &gYMin, &gXMax, &gYMax);
+        if (xMin <= gXMin && gXMax <= xMax && yMin <= gYMin && gYMax <= yMax)
+        {
+          mbc_len = uMap->mapUnicode( *(word->getChar(j)), mbc, sizeof(mbc) );
+          s->append(mbc, mbc_len);
+        }
+      }
+    }
+    return s;
+  }
+
+  spaceLen = uMap->mapUnicode(0x20, space, sizeof(space));
+  eolLen = 0; // make gcc happy
+  switch (globalParams->getTextEOL()) {
+  case eolUnix:
+    eolLen = uMap->mapUnicode(0x0a, eol, sizeof(eol));
+    break;
+  case eolDOS:
+    eolLen = uMap->mapUnicode(0x0d, eol, sizeof(eol));
+    eolLen += uMap->mapUnicode(0x0a, eol + eolLen, sizeof(eol) - eolLen);
+    break;
+  case eolMac:
+    eolLen = uMap->mapUnicode(0x0d, eol, sizeof(eol));
+    break;
+  }
+
+  //~ writing mode (horiz/vert)
+
+  // collect the line fragments that are in the rectangle
+  fragsSize = 256;
+  frags = (TextLineFrag *)gmallocn(fragsSize, sizeof(TextLineFrag));
+  nFrags = 0;
+  lastRot = -1;
+  oneRot = gTrue;
+  for (i = 0; i < nBlocks; ++i) {
+    blk = blocks[i];
+    if (xMin < blk->xMax && blk->xMin < xMax &&
+       yMin < blk->yMax && blk->yMin < yMax) {
+      for (line = blk->lines; line; line = line->next) {
+       if (xMin < line->xMax && line->xMin < xMax &&
+           yMin < line->yMax && line->yMin < yMax) {
+         idx0 = idx1 = -1;
+         switch (line->rot) {
+         case 0:
+           y = 0.5 * (line->yMin + line->yMax);
+           if (yMin < y && y < yMax) {
+             j = 0;
+             while (j < line->len) {
+               if (0.5 * (line->edge[j] + line->edge[j+1]) > xMin) {
+                 idx0 = j;
+                 break;
+               }
+               ++j;
+             }
+             j = line->len - 1;
+             while (j >= 0) {
+               if (0.5 * (line->edge[j] + line->edge[j+1]) < xMax) {
+                 idx1 = j;
+                 break;
+               }
+               --j;
+             }
+           }
+           break;
+         case 1:
+           x = 0.5 * (line->xMin + line->xMax);
+           if (xMin < x && x < xMax) {
+             j = 0;
+             while (j < line->len) {
+               if (0.5 * (line->edge[j] + line->edge[j+1]) > yMin) {
+                 idx0 = j;
+                 break;
+               }
+               ++j;
+             }
+             j = line->len - 1;
+             while (j >= 0) {
+               if (0.5 * (line->edge[j] + line->edge[j+1]) < yMax) {
+                 idx1 = j;
+                 break;
+               }
+               --j;
+             }
+           }
+           break;
+         case 2:
+           y = 0.5 * (line->yMin + line->yMax);
+           if (yMin < y && y < yMax) {
+             j = 0;
+             while (j < line->len) {
+               if (0.5 * (line->edge[j] + line->edge[j+1]) < xMax) {
+                 idx0 = j;
+                 break;
+               }
+               ++j;
+             }
+             j = line->len - 1;
+             while (j >= 0) {
+               if (0.5 * (line->edge[j] + line->edge[j+1]) > xMin) {
+                 idx1 = j;
+                 break;
+               }
+               --j;
+             }
+           }
+           break;
+         case 3:
+           x = 0.5 * (line->xMin + line->xMax);
+           if (xMin < x && x < xMax) {
+             j = 0;
+             while (j < line->len) {
+               if (0.5 * (line->edge[j] + line->edge[j+1]) < yMax) {
+                 idx0 = j;
+                 break;
+               }
+               ++j;
+             }
+             j = line->len - 1;
+             while (j >= 0) {
+               if (0.5 * (line->edge[j] + line->edge[j+1]) > yMin) {
+                 idx1 = j;
+                 break;
+               }
+               --j;
+             }
+           }
+           break;
+         }
+         if (idx0 >= 0 && idx1 >= 0) {
+           if (nFrags == fragsSize) {
+             fragsSize *= 2;
+             frags = (TextLineFrag *)
+                         greallocn(frags, fragsSize, sizeof(TextLineFrag));
+           }
+           frags[nFrags].init(line, idx0, idx1 - idx0 + 1);
+           ++nFrags;
+           if (lastRot >= 0 && line->rot != lastRot) {
+             oneRot = gFalse;
+           }
+           lastRot = line->rot;
+         }
+       }
+      }
+    }
+  }
+
+  // sort the fragments and generate the string
+  if (nFrags > 0) {
+
+    for (i = 0; i < nFrags; ++i) {
+      frags[i].computeCoords(oneRot);
+    }
+    assignColumns(frags, nFrags, oneRot);
+
+    // if all lines in the region have the same rotation, use it;
+    // otherwise, use the page's primary rotation
+    if (oneRot) {
+      qsort(frags, nFrags, sizeof(TextLineFrag),
+           &TextLineFrag::cmpYXLineRot);
+    } else {
+      qsort(frags, nFrags, sizeof(TextLineFrag),
+           &TextLineFrag::cmpYXPrimaryRot);
+    }
+    i = 0;
+    while (i < nFrags) {
+      delta = maxIntraLineDelta * frags[i].line->words->fontSize;
+      for (j = i+1;
+          j < nFrags && fabs(frags[j].base - frags[i].base) < delta;
+          ++j) ;
+      qsort(frags + i, j - i, sizeof(TextLineFrag),
+           oneRot ? &TextLineFrag::cmpXYColumnLineRot
+                  : &TextLineFrag::cmpXYColumnPrimaryRot);
+      i = j;
+    }
+
+    col = 0;
+    multiLine = gFalse;
+    for (i = 0; i < nFrags; ++i) {
+      frag = &frags[i];
+
+      // insert a return
+      if (frag->col < col ||
+         (i > 0 && fabs(frag->base - frags[i-1].base) >
+                     maxIntraLineDelta * frags[i-1].line->words->fontSize)) {
+       s->append(eol, eolLen);
+       col = 0;
+       multiLine = gTrue;
+      }
+
+      // column alignment
+      for (; col < frag->col; ++col) {
+       s->append(space, spaceLen);
+      }
+
+      // get the fragment text
+      col += dumpFragment(frag->line->text + frag->start, frag->len, uMap, s);
+    }
+
+    if (multiLine) {
+      s->append(eol, eolLen);
+    }
+  }
+
+  gfree(frags);
+  uMap->decRefCnt();
+
+  return s;
+}
+
+class TextSelectionVisitor {
+public:
+  TextSelectionVisitor (TextPage *page);
+  virtual ~TextSelectionVisitor () { }
+  virtual void visitBlock (TextBlock *block,
+                          TextLine *begin,
+                          TextLine *end,
+                          PDFRectangle *selection) = 0;
+  virtual void visitLine (TextLine *line, 
+                         TextWord *begin,
+                         TextWord *end,
+                         int edge_begin,
+                         int edge_end,
+                         PDFRectangle *selection) = 0;
+  virtual void visitWord (TextWord *word, int begin, int end,
+                         PDFRectangle *selection) = 0;
+
+protected:
+  TextPage *page;
+};
+
+TextSelectionVisitor::TextSelectionVisitor (TextPage *page)
+  : page(page)
+{
+}
+
+
+class TextSelectionDumper : public TextSelectionVisitor {
+public:
+  TextSelectionDumper(TextPage *page);
+  virtual ~TextSelectionDumper();
+
+  virtual void visitBlock (TextBlock *block, 
+                          TextLine *begin,
+                          TextLine *end,
+                          PDFRectangle *selection) { };
+  virtual void visitLine (TextLine *line,
+                         TextWord *begin,
+                         TextWord *end,
+                         int edge_begin,
+                         int edge_end,
+                         PDFRectangle *selection);
+  virtual void visitWord (TextWord *word, int begin, int end,
+                         PDFRectangle *selection) { };
+
+  GooString *getText(void);
+
+private:
+  TextLineFrag *frags;
+  int nFrags, fragsSize;
+};
+
+TextSelectionDumper::TextSelectionDumper(TextPage *page)
+    : TextSelectionVisitor(page)
+{
+  fragsSize = 256;
+  frags = (TextLineFrag *)gmallocn(fragsSize, sizeof(TextLineFrag));
+  nFrags = 0;
+}
+
+TextSelectionDumper::~TextSelectionDumper()
+{
+  gfree(frags);
+}
+
+void TextSelectionDumper::visitLine (TextLine *line,
+                                    TextWord *begin,
+                                    TextWord *end,
+                                    int edge_begin,
+                                    int edge_end,
+                                    PDFRectangle *selection)
+{
+  if (nFrags == fragsSize) {
+    fragsSize *= 2;
+    frags = (TextLineFrag *) grealloc(frags, fragsSize * sizeof(TextLineFrag));
+  }
+
+  frags[nFrags].init(line, edge_begin, edge_end - edge_begin);
+  ++nFrags;
+
+}
+
+GooString *TextSelectionDumper::getText (void)
+{
+  GooString *s;
+  TextLineFrag *frag;
+  int i, j;
+  UnicodeMap *uMap;
+  char space[8], eol[16];
+  int spaceLen, eolLen;
+  GooList *strings = NULL;
+  int actual_table = -1;
+  int actual_line = -1;
+  int last_length = 0;
+  TextBlock *actual_block = NULL;
+
+  s = new GooString();
+
+  uMap = globalParams->getTextEncoding();
+
+  if (uMap == NULL)
+      return s;
+
+  spaceLen = uMap->mapUnicode(0x20, space, sizeof(space));
+  eolLen = uMap->mapUnicode(0x0a, eol, sizeof(eol));
+
+  if (nFrags > 0) {
+    for (i = 0; i < nFrags; ++i) {
+      frag = &frags[i];
+
+      if (actual_table >= 0 && frag->line->blk->tableId < 0) {
+        for (j = 0; j < strings->getLength (); j++) {
+          s->append ((GooString*) strings->get (j));
+          s->append (eol, eolLen);
+          delete ((GooString*) strings->get (j));
+        }
+        delete strings;
+        strings = NULL;
+        actual_table = -1;
+        actual_line = -1;
+        actual_block = NULL;
+      }
+
+      // a table
+      if (frag->line->blk->tableId >= 0) {
+        if (actual_table == -1) {
+          strings = new GooList();
+          actual_table = frag->line->blk->tableId;
+          actual_block = frag->line->blk;
+          actual_line = -1;
+        }
+
+        // the same block
+        if (actual_block == frag->line->blk) {
+          actual_line++;
+          if (actual_line >= strings->getLength ()) {
+            GooString *t = new GooString ();
+            // add some spaces to have this block correctly aligned
+            if (actual_line > 0)
+              for (j = 0; j < ((GooString*) (strings->get (actual_line - 1)))->getLength() - last_length - 1; j++)
+                t->append (space, spaceLen);
+            strings->append (t);
+          }
+        }
+        // another block
+        else {
+          // previous block ended its row
+          if (actual_block->tableEnd) {
+            for (j = 0; j < strings->getLength (); j++) {
+              s->append ((GooString*) strings->get (j));
+              s->append (eol, eolLen);
+              delete ((GooString*) strings->get (j));
+            }
+            delete strings;
+
+            strings = new GooList();
+            GooString *t = new GooString ();
+            strings->append (t);
+          }
+          actual_block = frag->line->blk;
+          actual_line = 0;
+        }
+
+        page->dumpFragment(frag->line->text + frag->start, frag->len, uMap, ((GooString*) strings->get (actual_line)));
+        last_length = frag->len;
+
+        if (!frag->line->blk->tableEnd) {
+          ((GooString*) strings->get (actual_line))->append (space, spaceLen);
+        }
+      }
+      // not a table
+      else {
+        page->dumpFragment (frag->line->text + frag->start, frag->len, uMap, s);
+        if (i < nFrags - 1) {
+          s->append (eol, eolLen);
+        }
+      }
+    }
+
+    if (strings != NULL) {
+      for (j = 0; j < strings->getLength (); j++) {
+        s->append((GooString*) strings->get (j));
+        s->append(eol, eolLen);
+        delete ((GooString*) strings->get (j));
+      }
+      delete strings;
+      strings = NULL;
+      actual_table = -1;
+      actual_line = -1;
+      actual_block = NULL;
+    }
+  }
+
+  uMap->decRefCnt();
+
+  return s;
+}
+
+class TextSelectionSizer : public TextSelectionVisitor {
+public:
+  TextSelectionSizer(TextPage *page, double scale);
+  ~TextSelectionSizer() { }
+
+  virtual void visitBlock (TextBlock *block,
+                          TextLine *begin,
+                          TextLine *end,
+                          PDFRectangle *selection) { };
+  virtual void visitLine (TextLine *line, 
+                         TextWord *begin,
+                         TextWord *end,
+                         int edge_begin,
+                         int edge_end,
+                         PDFRectangle *selection);
+  virtual void visitWord (TextWord *word, int begin, int end,
+                         PDFRectangle *selection) { };
+
+  GooList *getRegion () { return list; }
+
+private:
+  GooList *list;
+  double scale;
+};
+
+TextSelectionSizer::TextSelectionSizer(TextPage *page, double scale)
+  : TextSelectionVisitor(page),
+    scale(scale)
+{
+  list = new GooList();
+}
+
+void TextSelectionSizer::visitLine (TextLine *line, 
+                                   TextWord *begin,
+                                   TextWord *end,
+                                   int edge_begin,
+                                   int edge_end,
+                                   PDFRectangle *selection)
+{
+  PDFRectangle *rect;
+  double x1, y1, x2, y2, margin;
+
+  margin = (line->yMax - line->yMin) / 8;
+  x1 = line->edge[edge_begin];
+  y1 = line->yMin - margin;
+  x2 = line->edge[edge_end];
+  y2 = line->yMax + margin;
+
+  rect = new PDFRectangle (floor (x1 * scale), 
+                          floor (y1 * scale),
+                          ceil (x2 * scale),
+                          ceil (y2 * scale));
+  list->append (rect);
+}
+
+
+class TextSelectionPainter : public TextSelectionVisitor {
+public:
+  TextSelectionPainter(TextPage *page,
+                      double scale,
+                      int rotation,
+                      OutputDev *out,
+                      GfxColor *box_color,
+                      GfxColor *glyph_color);
+  ~TextSelectionPainter();
+
+  virtual void visitBlock (TextBlock *block,
+                          TextLine *begin,
+                          TextLine *end,
+                          PDFRectangle *selection) { };
+  virtual void visitLine (TextLine *line, 
+                         TextWord *begin,
+                         TextWord *end,
+                         int edge_begin,
+                         int edge_end,
+                         PDFRectangle *selection);
+  virtual void visitWord (TextWord *word, int begin, int end,
+                         PDFRectangle *selection);
+
+private:
+  OutputDev *out;
+  GfxColor *box_color, *glyph_color;
+  GfxState *state;
+};
+
+TextSelectionPainter::TextSelectionPainter(TextPage *page,
+                                          double scale,
+                                          int rotation,
+                                          OutputDev *out,
+                                          GfxColor *box_color,
+                                          GfxColor *glyph_color)
+  : TextSelectionVisitor(page),
+    out(out),
+    box_color(box_color),
+    glyph_color(glyph_color)
+{
+  PDFRectangle box(0, 0, page->pageWidth, page->pageHeight);
+
+  state = new GfxState(72 * scale, 72 * scale, &box, rotation, gFalse);
+
+  out->startPage (0, state);
+  out->setDefaultCTM (state->getCTM());
+
+  state->setTextMat(1, 0, 0, -1, 0, 0);
+  state->setFillColorSpace(new GfxDeviceRGBColorSpace());
+
+}
+
+TextSelectionPainter::~TextSelectionPainter()
+{
+  out->endPage ();
+
+  delete state;
+}
+
+void TextSelectionPainter::visitLine (TextLine *line,
+                                     TextWord *begin,
+                                     TextWord *end,
+                                     int edge_begin,
+                                     int edge_end,
+                                     PDFRectangle *selection)
+{
+  double x1, y1, x2, y2, margin;
+  Matrix ctm, ictm;
+
+  state->setFillColor(box_color);
+  out->updateFillColor(state);
+
+  margin = (line->yMax - line->yMin) / 8;
+  x1 = floor (line->edge[edge_begin]);
+  y1 = floor (line->yMin - margin);
+  x2 = ceil (line->edge[edge_end]);
+  y2 = ceil (line->yMax + margin);
+
+  state->getCTM (&ctm);
+  ctm.transform(line->edge[edge_begin], line->yMin - margin, &x1, &y1);
+  ctm.transform(line->edge[edge_end], line->yMax + margin, &x2, &y2);
+
+  x1 = floor (x1);
+  y1 = floor (y1);
+  x2 = ceil (x2);
+  y2 = ceil (y2);
+
+  ctm.invertTo (&ictm);
+  ictm.transform(x1, y1, &x1, &y1);
+  ictm.transform(x2, y2, &x2, &y2);
+
+  state->moveTo(x1, y1);
+  state->lineTo(x2, y1);
+  state->lineTo(x2, y2);
+  state->lineTo(x1, y2);
+  state->closePath();
+
+  out->fill(state);
+  state->clearPath();
+}
+
+void TextSelectionPainter::visitWord (TextWord *word, int begin, int end,
+                                     PDFRectangle *selection)
+{
+  GooString *string;
+  int i;
+
+  state->setFillColor(glyph_color);
+  out->updateFillColor(state);
+  word->font->gfxFont->incRefCnt();
+  state->setFont(word->font->gfxFont, word->fontSize);
+  out->updateFont(state);
+
+  /* The only purpose of this string is to let the output device query
+   * it's length.  Might want to change this interface later. */
+
+  string = new GooString ((char *) word->charcode, end - begin);
+
+  out->beginString(state, string);
+
+  for (i = begin; i < end; i++)
+    out->drawChar(state, word->edge[i], word->base, 0, 0, 0, 0,
+                 word->charcode[i], 1, NULL, 0);
+  
+  out->endString(state);
+
+  delete string;
+}
+
+void TextWord::visitSelection(TextSelectionVisitor *visitor,
+                             PDFRectangle *selection,
+                             SelectionStyle style)
+{
+  int i, begin, end;
+  double mid;
+
+  begin = len;
+  end = 0;
+  for (i = 0; i < len; i++) {
+    mid = (edge[i] + edge[i + 1]) / 2;
+    if (selection->x1 < mid || selection->x2 < mid)
+      if (i < begin)
+       begin = i;
+    if (mid < selection->x1 || mid < selection->x2)
+      end = i + 1;
+  }
+
+  /* Skip empty selection. */
+  if (end <= begin)
+    return;
+
+  visitor->visitWord (this, begin, end, selection);
+}
+
+void TextLine::visitSelection(TextSelectionVisitor *visitor,
+                             PDFRectangle *selection,
+                             SelectionStyle style) {
+  TextWord *p, *begin, *end, *current;
+  int i, edge_begin, edge_end;
+  PDFRectangle child_selection;
+
+  begin = NULL;
+  end = NULL;
+  current = NULL;
+  for (p = words; p != NULL; p = p->next) {
+    if (blk->page->primaryLR) {
+      if ((selection->x1 < p->xMax) ||
+         (selection->x2 < p->xMax))
+        if (begin == NULL) 
+         begin = p;
+
+      if (((selection->x1 > p->xMin) ||
+          (selection->x2 > p->xMin)) && (begin != NULL)) {
+        end = p->next;
+        current = p;
+      }
+    } else {
+      if ((selection->x1 > p->xMin) ||
+         (selection->x2 > p->xMin))
+        if (begin == NULL) 
+         begin = p;
+
+      if (((selection->x1 < p->xMax) ||
+          (selection->x2 < p->xMax)) && (begin != NULL)) {
+        end = p->next;
+        current = p;
+      }
+    }
+  }
+
+  if (!current)
+    current = begin;
+  
+  child_selection = *selection;
+  if (style == selectionStyleWord) {
+    child_selection.x1 = begin ? begin->xMin : xMin;
+    if (end && end->xMax != -1) {
+      child_selection.x2 = current->xMax;
+    } else {
+      child_selection.x2 = xMax;
+    }
+  }
+
+  edge_begin = len;
+  edge_end = 0;
+  for (i = 0; i < len; i++) {
+    double mid = (edge[i] + edge[i + 1]) /  2;
+    if (child_selection.x1 < mid || child_selection.x2 < mid)
+      if (i < edge_begin)
+       edge_begin = i;
+    if (mid < child_selection.x2 || mid < child_selection.x1)
+      edge_end = i + 1;
+  }
+
+  /* Skip empty selection. */
+  if (edge_end <= edge_begin)
+    return;
+
+  visitor->visitLine (this, begin, end, edge_begin, edge_end,
+                     &child_selection);
+
+  for (p = begin; p != end; p = p->next)
+    p->visitSelection (visitor, &child_selection, style);
+}
+
+void TextBlock::visitSelection(TextSelectionVisitor *visitor,
+                              PDFRectangle *selection,
+                              SelectionStyle style) {
+  PDFRectangle child_selection;
+  double x[2], y[2], d, best_d[2];
+  TextLine *p, *best_line[2];
+  int i, count = 0, best_count[2], start, stop;
+  GBool all[2];
+
+  x[0] = selection->x1;
+  y[0] = selection->y1;
+  x[1] = selection->x2;
+  y[1] = selection->y2;
+
+  for (i = 0; i < 2; i++) {
+    // the first/last lines are often not nearest
+    // the corners, so we have to force them to be
+    // selected when the selection runs outside this
+    // block.
+    if (page->primaryLR) {
+      all[i] = x[i] >= this->xMax && y[i] >= this->yMax;
+      if (x[i] <= this->xMin && y[i] <= this->yMin) {
+       best_line[i] = this->lines;
+       best_count[i] = 1;
+      } else {
+       best_line[i] = NULL;
+       best_count[i] = 0;
+      }
+    } else {
+      all[i] = x[i] <= this->xMin && y[i] >= this->yMax;
+      if (x[i] >= this->xMax && y[i] <= this->yMin) {
+       best_line[i] = this->lines;
+       best_count[i] = 1;
+      } else {
+       best_line[i] = NULL;
+       best_count[i] = 0;
+      }
+    }
+    best_d[i] = 0;
+  }
+
+  // find the nearest line to the selection points
+  // using the manhattan distance.
+  for (p = this->lines; p; p = p->next) {
+    count++;
+    for (i = 0; i < 2; i++) {
+      d = fmax(p->xMin - x[i], 0.0) +
+       fmax(x[i] - p->xMax, 0.0) +
+       fmax(p->yMin - y[i], 0.0) +
+       fmax(y[i] - p->yMax, 0.0);
+      if (!best_line[i] || all[i] ||
+         d < best_d[i]) {
+       best_line[i] = p;
+       best_count[i] = count;
+       best_d[i] = d;
+      }
+    }
+  }
+  // assert: best is always set.
+  if (!best_line[0] || !best_line[1]) {
+    return;
+  }
+
+  // Now decide which point was first.
+  if (best_count[0] < best_count[1] ||
+      (best_count[0] == best_count[1] &&
+       y[0] < y[1])) {
+    start = 0;
+    stop = 1;
+  } else {
+    start = 1;
+    stop = 0;
+  }
+
+  visitor->visitBlock(this, best_line[start], best_line[stop], selection);
+
+  for (p = best_line[start]; p; p = p->next) {
+    if (page->primaryLR) {
+      child_selection.x1 = p->xMin;
+      child_selection.x2 = p->xMax;
+    } else {
+      child_selection.x1 = p->xMax;
+      child_selection.x2 = p->xMin;
+    }
+    child_selection.y1 = p->yMin;
+    child_selection.y2 = p->yMax;
+    if (style == selectionStyleLine) {
+      if (p == best_line[start]) {
+       child_selection.x1 = 0;
+       child_selection.y1 = 0;
+      }
+      if (p == best_line[stop]) {
+       child_selection.x2 = page->pageWidth;
+       child_selection.y2 = page->pageHeight;
+      }
+    } else {
+      if (p == best_line[start]) {
+       child_selection.x1 = fmax(p->xMin, fmin(p->xMax, x[start]));
+       child_selection.y1 = fmax(p->yMin, fmin(p->yMax, y[start]));
+      }
+      if (p == best_line[stop]) {
+       child_selection.x2 = fmax(p->xMin, fmin(p->xMax, x[stop]));
+       child_selection.y2 = fmax(p->yMin, fmin(p->yMax, y[stop]));
+      }
+    }
+    p->visitSelection(visitor, &child_selection, style);
+    if (p == best_line[stop]) {
+      return;
+    }
+  }
+}
+
+void TextPage::visitSelection(TextSelectionVisitor *visitor,
+                             PDFRectangle *selection,
+                             SelectionStyle style)
+{
+  PDFRectangle child_selection;
+  double x[2], y[2], d, best_d[2];
+  double xMin, yMin, xMax, yMax;
+  TextFlow *flow, *best_flow[2];
+  TextBlock *blk, *best_block[2];
+  int i, count = 0, best_count[2], start, stop;
+
+  if (!flows)
+    return;
+
+  x[0] = selection->x1;
+  y[0] = selection->y1;
+  x[1] = selection->x2;
+  y[1] = selection->y2;
+
+  xMin = pageWidth;
+  yMin = pageHeight;
+  xMax = 0.0;
+  yMax = 0.0;
+
+  for (i = 0; i < 2; i++) {
+    best_block[i] = NULL;
+    best_flow[i] = NULL;
+    best_count[i] = 0;
+    best_d[i] = 0;
+  }
+
+  // find the nearest blocks to the selection points
+  // using the manhattan distance.
+  for (flow = flows; flow; flow = flow->next) {
+    for (blk = flow->blocks; blk; blk = blk->next) {
+      count++;
+      // the first/last blocks in reading order are
+      // often not the closest to the page corners;
+      // track the corners, force those blocks to
+      // be selected if the selection runs across
+      // multiple pages.
+      xMin = fmin(xMin, blk->xMin);
+      yMin = fmin(yMin, blk->yMin);
+      xMax = fmax(xMax, blk->xMax);
+      yMax = fmax(yMax, blk->yMax);
+      for (i = 0; i < 2; i++) {
+       d = fmax(blk->xMin - x[i], 0.0) +
+         fmax(x[i] - blk->xMax, 0.0) +
+         fmax(blk->yMin - y[i], 0.0) +
+         fmax(y[i] - blk->yMax, 0.0);
+       if (!best_block[i] ||
+           d < best_d[i] ||
+           (!blk->next && !flow->next &&
+            x[i] > xMax && y[i] > yMax)) {
+         best_block[i] = blk;
+         best_flow[i] = flow;
+         best_count[i] = count;
+         best_d[i] = d;
+       }
+      }
+    }
+  }
+  for (i = 0; i < 2; i++) {
+    if (primaryLR) {
+      if (x[i] < xMin && y[i] < yMin) {
+       best_block[i] = flows->blocks;
+       best_flow[i] = flows;
+       best_count[i] = 1;
+      }
+    } else {
+      if (x[i] > xMax && y[i] < yMin) {
+       best_block[i] = flows->blocks;
+       best_flow[i] = flows;
+       best_count[i] = 1;
+      }
+    }
+  }
+  // assert: best is always set.
+  if (!best_block[0] || !best_block[1]) {
+    return;
+  }
+
+  // Now decide which point was first.
+  if (best_count[0] < best_count[1] ||
+      (best_count[0] == best_count[1] && y[0] < y[1])) {
+    start = 0;
+    stop = 1;
+  } else {
+    start = 1;
+    stop = 0;
+  }
+
+  for (flow = best_flow[start]; flow; flow = flow->next) {
+    if (flow == best_flow[start]) {
+      blk = best_block[start];
+    } else {
+      blk = flow->blocks;
+    }
+    for (; blk; blk = blk->next) {
+      if (primaryLR) {
+       child_selection.x1 = blk->xMin;
+       child_selection.x2 = blk->xMax;
+      } else {
+       child_selection.x1 = blk->xMax;
+       child_selection.x2 = blk->xMin;
+      }
+      child_selection.y1 = blk->yMin;
+      child_selection.y2 = blk->yMax;
+      if (blk == best_block[start]) {
+       child_selection.x1 = fmax(blk->xMin, fmin(blk->xMax, x[start]));
+       child_selection.y1 = fmax(blk->yMin, fmin(blk->yMax, y[start]));
+      }
+      if (blk == best_block[stop]) {
+       child_selection.x2 = fmax(blk->xMin, fmin(blk->xMax, x[stop]));
+       child_selection.y2 = fmax(blk->yMin, fmin(blk->yMax, y[stop]));
+       blk->visitSelection(visitor, &child_selection, style);
+       return;
+      }
+      blk->visitSelection(visitor, &child_selection, style);
+    }
+  }
+}
+
+void TextPage::drawSelection(OutputDev *out,
+                            double scale,
+                            int rotation,
+                            PDFRectangle *selection,
+                            SelectionStyle style,
+                            GfxColor *glyph_color, GfxColor *box_color)
+{
+  TextSelectionPainter painter(this, scale, rotation, 
+                              out, box_color, glyph_color);
+
+  visitSelection(&painter, selection, style);
+}
+
+GooList *TextPage::getSelectionRegion(PDFRectangle *selection,
+                                     SelectionStyle style,
+                                     double scale) {
+  TextSelectionSizer sizer(this, scale);
+
+  visitSelection(&sizer, selection, style);
+
+  return sizer.getRegion();
+}
+
+GooString *TextPage::getSelectionText(PDFRectangle *selection,
+                                     SelectionStyle style)
+{
+  TextSelectionDumper dumper(this);
+
+  visitSelection(&dumper, selection, style);
+
+  return dumper.getText();
+}
+
+GBool TextPage::findCharRange(int pos, int length,
+                             double *xMin, double *yMin,
+                             double *xMax, double *yMax) {
+  TextBlock *blk;
+  TextLine *line;
+  TextWord *word;
+  double xMin0, xMax0, yMin0, yMax0;
+  double xMin1, xMax1, yMin1, yMax1;
+  GBool first;
+  int i, j0, j1;
+
+  if (rawOrder) {
+    return gFalse;
+  }
+
+  //~ this doesn't correctly handle ranges split across multiple lines
+  //~ (the highlighted region is the bounding box of all the parts of
+  //~ the range)
+  first = gTrue;
+  xMin0 = xMax0 = yMin0 = yMax0 = 0; // make gcc happy
+  xMin1 = xMax1 = yMin1 = yMax1 = 0; // make gcc happy
+  for (i = 0; i < nBlocks; ++i) {
+    blk = blocks[i];
+    for (line = blk->lines; line; line = line->next) {
+      for (word = line->words; word; word = word->next) {
+       if (pos < word->charPos[word->len] &&
+           pos + length > word->charPos[0]) {
+         for (j0 = 0;
+              j0 < word->len && pos >= word->charPos[j0 + 1];
+              ++j0) ;
+         for (j1 = word->len - 1;
+              j1 > j0 && pos + length <= word->charPos[j1];
+              --j1) ;
+         switch (line->rot) {
+         case 0:
+           xMin1 = word->edge[j0];
+           xMax1 = word->edge[j1 + 1];
+           yMin1 = word->yMin;
+           yMax1 = word->yMax;
+           break;
+         case 1:
+           xMin1 = word->xMin;
+           xMax1 = word->xMax;
+           yMin1 = word->edge[j0];
+           yMax1 = word->edge[j1 + 1];
+           break;
+         case 2:
+           xMin1 = word->edge[j1 + 1];
+           xMax1 = word->edge[j0];
+           yMin1 = word->yMin;
+           yMax1 = word->yMax;
+           break;
+         case 3:
+           xMin1 = word->xMin;
+           xMax1 = word->xMax;
+           yMin1 = word->edge[j1 + 1];
+           yMax1 = word->edge[j0];
+           break;
+         }
+         if (first || xMin1 < xMin0) {
+           xMin0 = xMin1;
+         }
+         if (first || xMax1 > xMax0) {
+           xMax0 = xMax1;
+         }
+         if (first || yMin1 < yMin0) {
+           yMin0 = yMin1;
+         }
+         if (first || yMax1 > yMax0) {
+           yMax0 = yMax1;
+         }
+         first = gFalse;
+       }
+      }
+    }
+  }
+  if (!first) {
+    *xMin = xMin0;
+    *xMax = xMax0;
+    *yMin = yMin0;
+    *yMax = yMax0;
+    return gTrue;
+  }
+  return gFalse;
+}
+
+void TextPage::dump(void *outputStream, TextOutputFunc outputFunc,
+                   GBool physLayout) {
+  UnicodeMap *uMap;
+  TextFlow *flow;
+  TextBlock *blk;
+  TextLine *line;
+  TextLineFrag *frags;
+  TextWord *word;
+  int nFrags, fragsSize;
+  TextLineFrag *frag;
+  char space[8], eol[16], eop[8];
+  int spaceLen, eolLen, eopLen;
+  GBool pageBreaks;
+  GooString *s;
+  double delta;
+  int col, i, j, d, n;
+
+  // get the output encoding
+  if (!(uMap = globalParams->getTextEncoding())) {
+    return;
+  }
+  spaceLen = uMap->mapUnicode(0x20, space, sizeof(space));
+  eolLen = 0; // make gcc happy
+  switch (globalParams->getTextEOL()) {
+  case eolUnix:
+    eolLen = uMap->mapUnicode(0x0a, eol, sizeof(eol));
+    break;
+  case eolDOS:
+    eolLen = uMap->mapUnicode(0x0d, eol, sizeof(eol));
+    eolLen += uMap->mapUnicode(0x0a, eol + eolLen, sizeof(eol) - eolLen);
+    break;
+  case eolMac:
+    eolLen = uMap->mapUnicode(0x0d, eol, sizeof(eol));
+    break;
+  }
+  eopLen = uMap->mapUnicode(0x0c, eop, sizeof(eop));
+  pageBreaks = globalParams->getTextPageBreaks();
+
+  //~ writing mode (horiz/vert)
+
+  // output the page in raw (content stream) order
+  if (rawOrder) {
+
+    for (word = rawWords; word; word = word->next) {
+      s = new GooString();
+      dumpFragment(word->text, word->len, uMap, s);
+      (*outputFunc)(outputStream, s->getCString(), s->getLength());
+      delete s;
+      if (word->next &&
+         fabs(word->next->base - word->base) <
+           maxIntraLineDelta * word->fontSize &&
+         word->next->xMin >
+           word->xMax - minDupBreakOverlap * word->fontSize) {
+       if (word->next->xMin > word->xMax + minWordSpacing * word->fontSize) {
+         (*outputFunc)(outputStream, space, spaceLen);
+       }
+      } else {
+       (*outputFunc)(outputStream, eol, eolLen);
+      }
+    }
+
+  // output the page, maintaining the original physical layout
+  } else if (physLayout) {
+
+    // collect the line fragments for the page and sort them
+    fragsSize = 256;
+    frags = (TextLineFrag *)gmallocn(fragsSize, sizeof(TextLineFrag));
+    nFrags = 0;
+    for (i = 0; i < nBlocks; ++i) {
+      blk = blocks[i];
+      for (line = blk->lines; line; line = line->next) {
+       if (nFrags == fragsSize) {
+         fragsSize *= 2;
+         frags = (TextLineFrag *)greallocn(frags,
+                                           fragsSize, sizeof(TextLineFrag));
+       }
+       frags[nFrags].init(line, 0, line->len);
+       frags[nFrags].computeCoords(gTrue);
+       ++nFrags;
+      }
+    }
+    qsort(frags, nFrags, sizeof(TextLineFrag), &TextLineFrag::cmpYXPrimaryRot);
+    i = 0;
+    while (i < nFrags) {
+      delta = maxIntraLineDelta * frags[i].line->words->fontSize;
+      for (j = i+1;
+          j < nFrags && fabs(frags[j].base - frags[i].base) < delta;
+          ++j) ;
+      qsort(frags + i, j - i, sizeof(TextLineFrag),
+           &TextLineFrag::cmpXYColumnPrimaryRot);
+      i = j;
+    }
+
+#if 0 // for debugging
+    printf("*** line fragments ***\n");
+    for (i = 0; i < nFrags; ++i) {
+      frag = &frags[i];
+      printf("frag: x=%.2f..%.2f y=%.2f..%.2f base=%.2f '",
+            frag->xMin, frag->xMax, frag->yMin, frag->yMax, frag->base);
+      for (n = 0; n < frag->len; ++n) {
+       fputc(frag->line->text[frag->start + n] & 0xff, stdout);
+      }
+      printf("'\n");
+    }
+    printf("\n");
+#endif
+
+    // generate output
+    col = 0;
+    for (i = 0; i < nFrags; ++i) {
+      frag = &frags[i];
+
+      // column alignment
+      for (; col < frag->col; ++col) {
+       (*outputFunc)(outputStream, space, spaceLen);
+      }
+
+      // print the line
+      s = new GooString();
+      col += dumpFragment(frag->line->text + frag->start, frag->len, uMap, s);
+      (*outputFunc)(outputStream, s->getCString(), s->getLength());
+      delete s;
+
+      // print one or more returns if necessary
+      if (i == nFrags - 1 ||
+         frags[i+1].col < col ||
+         fabs(frags[i+1].base - frag->base) >
+           maxIntraLineDelta * frag->line->words->fontSize) {
+       if (i < nFrags - 1) {
+         d = (int)((frags[i+1].base - frag->base) /
+                   frag->line->words->fontSize);
+         if (d < 1) {
+           d = 1;
+         } else if (d > 5) {
+           d = 5;
+         }
+       } else {
+         d = 1;
+       }
+       for (; d > 0; --d) {
+         (*outputFunc)(outputStream, eol, eolLen);
+       }
+       col = 0;
+      }
+    }
+
+    gfree(frags);
+
+  // output the page, "undoing" the layout
+  } else {
+    for (flow = flows; flow; flow = flow->next) {
+      for (blk = flow->blocks; blk; blk = blk->next) {
+       for (line = blk->lines; line; line = line->next) {
+         n = line->len;
+         if (line->hyphenated && (line->next || blk->next)) {
+           --n;
+         }
+         s = new GooString();
+         dumpFragment(line->text, n, uMap, s);
+         (*outputFunc)(outputStream, s->getCString(), s->getLength());
+         delete s;
+         // output a newline when a hyphen is not suppressed
+         if (n == line->len) {
+           (*outputFunc)(outputStream, eol, eolLen);
+         }
+       }
+      }
+      (*outputFunc)(outputStream, eol, eolLen);
+    }
+  }
+
+  // end of page
+  if (pageBreaks) {
+    (*outputFunc)(outputStream, eop, eopLen);
+  }
+
+  uMap->decRefCnt();
+}
+
+void TextPage::assignColumns(TextLineFrag *frags, int nFrags, GBool oneRot) {
+  TextLineFrag *frag0, *frag1;
+  int rot, col1, col2, i, j, k;
+
+  // all text in the region has the same rotation -- recompute the
+  // column numbers based only on the text in the region
+  if (oneRot) {
+    qsort(frags, nFrags, sizeof(TextLineFrag), &TextLineFrag::cmpXYLineRot);
+    rot = frags[0].line->rot;
+    for (i = 0; i < nFrags; ++i) {
+      frag0 = &frags[i];
+      col1 = 0;
+      for (j = 0; j < i; ++j) {
+       frag1 = &frags[j];
+       col2 = 0; // make gcc happy
+       switch (rot) {
+       case 0:
+         if (frag0->xMin >= frag1->xMax) {
+           col2 = frag1->col + (frag1->line->col[frag1->start + frag1->len] -
+                                frag1->line->col[frag1->start]) + 1;
+         } else {
+           for (k = frag1->start;
+                k < frag1->start + frag1->len &&
+                  frag0->xMin >= 0.5 * (frag1->line->edge[k] +
+                                        frag1->line->edge[k+1]);
+                ++k) ;
+           col2 = frag1->col +
+                  frag1->line->col[k] - frag1->line->col[frag1->start];
+         }
+         break;
+       case 1:
+         if (frag0->yMin >= frag1->yMax) {
+           col2 = frag1->col + (frag1->line->col[frag1->start + frag1->len] -
+                                frag1->line->col[frag1->start]) + 1;
+         } else {
+           for (k = frag1->start;
+                k < frag1->start + frag1->len &&
+                  frag0->yMin >= 0.5 * (frag1->line->edge[k] +
+                                        frag1->line->edge[k+1]);
+                ++k) ;
+           col2 = frag1->col +
+                  frag1->line->col[k] - frag1->line->col[frag1->start];
+         }
+         break;
+       case 2:
+         if (frag0->xMax <= frag1->xMin) {
+           col2 = frag1->col + (frag1->line->col[frag1->start + frag1->len] -
+                                frag1->line->col[frag1->start]) + 1;
+         } else {
+           for (k = frag1->start;
+                k < frag1->start + frag1->len &&
+                  frag0->xMax <= 0.5 * (frag1->line->edge[k] +
+                                        frag1->line->edge[k+1]);
+                ++k) ;
+           col2 = frag1->col +
+                  frag1->line->col[k] - frag1->line->col[frag1->start];
+         }
+         break;
+       case 3:
+         if (frag0->yMax <= frag1->yMin) {
+           col2 = frag1->col + (frag1->line->col[frag1->start + frag1->len] -
+                                frag1->line->col[frag1->start]) + 1;
+         } else {
+           for (k = frag1->start;
+                k < frag1->start + frag1->len &&
+                  frag0->yMax <= 0.5 * (frag1->line->edge[k] +
+                                        frag1->line->edge[k+1]);
+                ++k) ;
+           col2 = frag1->col +
+                  frag1->line->col[k] - frag1->line->col[frag1->start];
+         }
+         break;
+       }
+       if (col2 > col1) {
+         col1 = col2;
+       }
+      }
+      frag0->col = col1;
+    }
+
+  // the region includes text at different rotations -- use the
+  // globally assigned column numbers, offset by the minimum column
+  // number (i.e., shift everything over to column 0)
+  } else {
+    col1 = frags[0].col;
+    for (i = 1; i < nFrags; ++i) {
+      if (frags[i].col < col1) {
+       col1 = frags[i].col;
+      }
+    }
+    for (i = 0; i < nFrags; ++i) {
+      frags[i].col -= col1;
+    }
+  }
+}
+
+int TextPage::dumpFragment(Unicode *text, int len, UnicodeMap *uMap,
+                          GooString *s) {
+  char lre[8], rle[8], popdf[8], buf[8];
+  int lreLen, rleLen, popdfLen, n;
+  int nCols, i, j, k;
+
+  nCols = 0;
+
+  if (uMap->isUnicode()) {
+
+    lreLen = uMap->mapUnicode(0x202a, lre, sizeof(lre));
+    rleLen = uMap->mapUnicode(0x202b, rle, sizeof(rle));
+    popdfLen = uMap->mapUnicode(0x202c, popdf, sizeof(popdf));
+
+    if (primaryLR) {
+
+      i = 0;
+      while (i < len) {
+       // output a left-to-right section
+       for (j = i; j < len && !unicodeTypeR(text[j]); ++j) ;
+       for (k = i; k < j; ++k) {
+         n = uMap->mapUnicode(text[k], buf, sizeof(buf));
+         s->append(buf, n);
+         ++nCols;
+       }
+       i = j;
+       // output a right-to-left section
+       for (j = i;
+            j < len && !(unicodeTypeL(text[j]) || unicodeTypeNum(text[j]));
+            ++j) ;
+       if (j > i) {
+         s->append(rle, rleLen);
+         for (k = j - 1; k >= i; --k) {
+           n = uMap->mapUnicode(text[k], buf, sizeof(buf));
+           s->append(buf, n);
+           ++nCols;
+         }
+         s->append(popdf, popdfLen);
+         i = j;
+       }
+      }
+
+    } else {
+
+      // Note: This code treats numeric characters (European and
+      // Arabic/Indic) as left-to-right, which isn't strictly correct
+      // (incurs extra LRE/POPDF pairs), but does produce correct
+      // visual formatting.
+      s->append(rle, rleLen);
+      i = len - 1;
+      while (i >= 0) {
+       // output a right-to-left section
+       for (j = i;
+            j >= 0 && !(unicodeTypeL(text[j]) || unicodeTypeNum(text[j]));
+            --j) ;
+       for (k = i; k > j; --k) {
+         n = uMap->mapUnicode(text[k], buf, sizeof(buf));
+         s->append(buf, n);
+         ++nCols;
+       }
+       i = j;
+       // output a left-to-right section
+       for (j = i; j >= 0 && !unicodeTypeR(text[j]); --j) ;
+       if (j < i) {
+         s->append(lre, lreLen);
+         for (k = j + 1; k <= i; ++k) {
+           n = uMap->mapUnicode(text[k], buf, sizeof(buf));
+           s->append(buf, n);
+           ++nCols;
+         }
+         s->append(popdf, popdfLen);
+         i = j;
+       }
+      }
+      s->append(popdf, popdfLen);
+
+    }
+
+  } else {
+    for (i = 0; i < len; ++i) {
+      n = uMap->mapUnicode(text[i], buf, sizeof(buf));
+      s->append(buf, n);
+      nCols += n;
+    }
+  }
+
+  return nCols;
+}
+
+#if TEXTOUT_WORD_LIST
+TextWordList *TextPage::makeWordList(GBool physLayout) {
+  return new TextWordList(this, physLayout);
+}
+#endif
+
+//------------------------------------------------------------------------
+// ActualText
+//------------------------------------------------------------------------
+ActualText::ActualText(TextPage *out) {
+  out->incRefCnt();
+  text = out;
+  actualText = NULL;
+  actualTextNBytes = 0;
+}
+
+ActualText::~ActualText() {
+  if (actualText)
+    delete actualText;
+  text->decRefCnt();
+}
+
+void ActualText::addChar(GfxState *state, double x, double y,
+                        double dx, double dy,
+                        CharCode c, int nBytes, Unicode *u, int uLen) {
+  if (!actualText) {
+    text->addChar(state, x, y, dx, dy, c, nBytes, u, uLen);
+    return;
+  }
+
+  // Inside ActualText span.
+  if (!actualTextNBytes) {
+    actualTextX0 = x;
+    actualTextY0 = y;
+  }
+  actualTextX1 = x + dx;
+  actualTextY1 = y + dy;
+  actualTextNBytes += nBytes;
+}
+
+void ActualText::begin(GfxState *state, GooString *text) {
+  if (actualText)
+    delete actualText;
+  actualText = new GooString(text);
+  actualTextNBytes = 0;
+}
+
+void ActualText::end(GfxState *state) {
+  // ActualText span closed. Output the span text and the
+  // extents of all the glyphs inside the span
+
+  if (actualTextNBytes) {
+    char *uniString = NULL;
+    Unicode *uni;
+    int length, i;
+
+    if (!actualText->hasUnicodeMarker()) {
+      if (actualText->getLength() > 0) {
+        //non-unicode string -- assume pdfDocEncoding and
+        //try to convert to UTF16BE
+        uniString = pdfDocEncodingToUTF16(actualText, &length);
+      } else {
+        length = 0;
+      }
+    } else {
+      uniString = actualText->getCString();
+      length = actualText->getLength();
+    }
+
+    if (length < 3)
+      length = 0;
+    else
+      length = length/2 - 1;
+    uni = new Unicode[length];
+    for (i = 0 ; i < length; i++)
+      uni[i] = ((uniString[2 + i*2] & 0xff)<<8)|(uniString[3 + i*2] & 0xff);
+
+    // now that we have the position info for all of the text inside
+    // the marked content span, we feed the "ActualText" back through
+    // text->addChar()
+    text->addChar(state, actualTextX0, actualTextY0,
+                  actualTextX1 - actualTextX0, actualTextY1 - actualTextY0,
+                  0, actualTextNBytes, uni, length);
+
+    delete [] uni;
+    if (!actualText->hasUnicodeMarker())
+      delete [] uniString;
+  }
+
+  delete actualText;
+  actualText = NULL;
+  actualTextNBytes = 0;
+}
+
+//------------------------------------------------------------------------
+// TextOutputDev
+//------------------------------------------------------------------------
+
+static void TextOutputDev_outputToFile(void *stream, const char *text, int len) {
+  fwrite(text, 1, len, (FILE *)stream);
+}
+
+TextOutputDev::TextOutputDev(char *fileName, GBool physLayoutA,
+                            double fixedPitchA, GBool rawOrderA,
+                            GBool append) {
+  text = NULL;
+  physLayout = physLayoutA;
+  fixedPitch = physLayout ? fixedPitchA : 0;
+  rawOrder = rawOrderA;
+  doHTML = gFalse;
+  ok = gTrue;
+
+  // open file
+  needClose = gFalse;
+  if (fileName) {
+    if (!strcmp(fileName, "-")) {
+      outputStream = stdout;
+#ifdef _WIN32
+      // keep DOS from munging the end-of-line characters
+      setmode(fileno(stdout), O_BINARY);
+#endif
+    } else if ((outputStream = fopen(fileName, append ? "ab" : "wb"))) {
+      needClose = gTrue;
+    } else {
+      error(errIO, -1, "Couldn't open text file '{0:s}'", fileName);
+      ok = gFalse;
+      actualText = NULL;
+      return;
+    }
+    outputFunc = &TextOutputDev_outputToFile;
+  } else {
+    outputStream = NULL;
+  }
+
+  // set up text object
+  text = new TextPage(rawOrderA);
+  actualText = new ActualText(text);
+}
+
+TextOutputDev::TextOutputDev(TextOutputFunc func, void *stream,
+                            GBool physLayoutA, double fixedPitchA,
+                            GBool rawOrderA) {
+  outputFunc = func;
+  outputStream = stream;
+  needClose = gFalse;
+  physLayout = physLayoutA;
+  fixedPitch = physLayout ? fixedPitchA : 0;
+  rawOrder = rawOrderA;
+  doHTML = gFalse;
+  text = new TextPage(rawOrderA);
+  actualText = new ActualText(text);
+  ok = gTrue;
+}
+
+TextOutputDev::~TextOutputDev() {
+  if (needClose) {
+#ifdef MACOS
+    ICS_MapRefNumAndAssign((short)((FILE *)outputStream)->handle);
+#endif
+    fclose((FILE *)outputStream);
+  }
+  if (text) {
+    text->decRefCnt();
+  }
+  delete actualText;
+}
+
+void TextOutputDev::startPage(int pageNum, GfxState *state) {
+  text->startPage(state);
+}
+
+void TextOutputDev::endPage() {
+  text->endPage();
+  text->coalesce(physLayout, fixedPitch, doHTML);
+  if (outputStream) {
+    text->dump(outputStream, outputFunc, physLayout);
+  }
+}
+
+void TextOutputDev::restoreState(GfxState *state) {
+  text->updateFont(state);
+}
+
+void TextOutputDev::updateFont(GfxState *state) {
+  text->updateFont(state);
+}
+
+void TextOutputDev::beginString(GfxState *state, GooString *s) {
+}
+
+void TextOutputDev::endString(GfxState *state) {
+}
+
+void TextOutputDev::drawChar(GfxState *state, double x, double y,
+                            double dx, double dy,
+                            double originX, double originY,
+                            CharCode c, int nBytes, Unicode *u, int uLen) {
+  actualText->addChar(state, x, y, dx, dy, c, nBytes, u, uLen);
+}
+
+void TextOutputDev::incCharCount(int nChars) {
+  text->incCharCount(nChars);
+}
+
+void TextOutputDev::beginActualText(GfxState *state, GooString *text)
+{
+  actualText->begin(state, text);
+}
+
+void TextOutputDev::endActualText(GfxState *state)
+{
+  actualText->end(state);
+}
+
+void TextOutputDev::stroke(GfxState *state) {
+  GfxPath *path;
+  GfxSubpath *subpath;
+  double x[2], y[2];
+
+  if (!doHTML) {
+    return;
+  }
+  path = state->getPath();
+  if (path->getNumSubpaths() != 1) {
+    return;
+  }
+  subpath = path->getSubpath(0);
+  if (subpath->getNumPoints() != 2) {
+    return;
+  }
+  state->transform(subpath->getX(0), subpath->getY(0), &x[0], &y[0]);
+  state->transform(subpath->getX(1), subpath->getY(1), &x[1], &y[1]);
+
+  // look for a vertical or horizontal line
+  if (x[0] == x[1] || y[0] == y[1]) {
+    text->addUnderline(x[0], y[0], x[1], y[1]);
+  }
+}
+
+void TextOutputDev::fill(GfxState *state) {
+  GfxPath *path;
+  GfxSubpath *subpath;
+  double x[5], y[5];
+  double rx0, ry0, rx1, ry1, t;
+  int i;
+
+  if (!doHTML) {
+    return;
+  }
+  path = state->getPath();
+  if (path->getNumSubpaths() != 1) {
+    return;
+  }
+  subpath = path->getSubpath(0);
+  if (subpath->getNumPoints() != 5) {
+    return;
+  }
+  for (i = 0; i < 5; ++i) {
+    if (subpath->getCurve(i)) {
+      return;
+    }
+    state->transform(subpath->getX(i), subpath->getY(i), &x[i], &y[i]);
+  }
+
+  // look for a rectangle
+  if (x[0] == x[1] && y[1] == y[2] && x[2] == x[3] && y[3] == y[4] &&
+      x[0] == x[4] && y[0] == y[4]) {
+    rx0 = x[0];
+    ry0 = y[0];
+    rx1 = x[2];
+    ry1 = y[1];
+  } else if (y[0] == y[1] && x[1] == x[2] && y[2] == y[3] && x[3] == x[4] &&
+            x[0] == x[4] && y[0] == y[4]) {
+    rx0 = x[0];
+    ry0 = y[0];
+    rx1 = x[1];
+    ry1 = y[2];
+  } else {
+    return;
+  }
+  if (rx1 < rx0) {
+    t = rx0;
+    rx0 = rx1;
+    rx1 = t;
+  }
+  if (ry1 < ry0) {
+    t = ry0;
+    ry0 = ry1;
+    ry1 = t;
+  }
+
+  // skinny horizontal rectangle
+  if (ry1 - ry0 < rx1 - rx0) {
+    if (ry1 - ry0 < maxUnderlineWidth) {
+      ry0 = 0.5 * (ry0 + ry1);
+      text->addUnderline(rx0, ry0, rx1, ry0);
+    }
+
+  // skinny vertical rectangle
+  } else {
+    if (rx1 - rx0 < maxUnderlineWidth) {
+      rx0 = 0.5 * (rx0 + rx1);
+      text->addUnderline(rx0, ry0, rx0, ry1);
+    }
+  }
+}
+
+void TextOutputDev::eoFill(GfxState *state) {
+  if (!doHTML) {
+    return;
+  }
+  fill(state);
+}
+
+void TextOutputDev::processLink(AnnotLink *link) {
+  double x1, y1, x2, y2;
+  int xMin, yMin, xMax, yMax, x, y;
+
+  if (!doHTML) {
+    return;
+  }
+  link->getRect(&x1, &y1, &x2, &y2);
+  cvtUserToDev(x1, y1, &x, &y);
+  xMin = xMax = x;
+  yMin = yMax = y;
+  cvtUserToDev(x1, y2, &x, &y);
+  if (x < xMin) {
+    xMin = x;
+  } else if (x > xMax) {
+    xMax = x;
+  }
+  if (y < yMin) {
+    yMin = y;
+  } else if (y > yMax) {
+    yMax = y;
+  }
+  cvtUserToDev(x2, y1, &x, &y);
+  if (x < xMin) {
+    xMin = x;
+  } else if (x > xMax) {
+    xMax = x;
+  }
+  if (y < yMin) {
+    yMin = y;
+  } else if (y > yMax) {
+    yMax = y;
+  }
+  cvtUserToDev(x2, y2, &x, &y);
+  if (x < xMin) {
+    xMin = x;
+  } else if (x > xMax) {
+    xMax = x;
+  }
+  if (y < yMin) {
+    yMin = y;
+  } else if (y > yMax) {
+    yMax = y;
+  }
+  text->addLink(xMin, yMin, xMax, yMax, link);
+}
+
+GBool TextOutputDev::findText(Unicode *s, int len,
+                             GBool startAtTop, GBool stopAtBottom,
+                             GBool startAtLast, GBool stopAtLast,
+                             GBool caseSensitive, GBool backward,
+                             GBool wholeWord,
+                             double *xMin, double *yMin,
+                             double *xMax, double *yMax) {
+  return text->findText(s, len, startAtTop, stopAtBottom,
+                       startAtLast, stopAtLast,
+                       caseSensitive, backward, wholeWord,
+                       xMin, yMin, xMax, yMax);
+}
+
+GooString *TextOutputDev::getText(double xMin, double yMin,
+                               double xMax, double yMax) {
+  return text->getText(xMin, yMin, xMax, yMax);
+}
+
+void TextOutputDev::drawSelection(OutputDev *out,
+                                 double scale,
+                                 int rotation,
+                                 PDFRectangle *selection,
+                                 SelectionStyle style,
+                                 GfxColor *glyph_color, GfxColor *box_color) {
+  text->drawSelection(out, scale, rotation, selection, style, glyph_color, box_color);
+}
+
+GooList *TextOutputDev::getSelectionRegion(PDFRectangle *selection,
+                                          SelectionStyle style,
+                                          double scale) {
+  return text->getSelectionRegion(selection, style, scale);
+}
+
+GooString *TextOutputDev::getSelectionText(PDFRectangle *selection,
+                                          SelectionStyle style)
+{
+  return text->getSelectionText(selection, style);
+}
+
+GBool TextOutputDev::findCharRange(int pos, int length,
+                                  double *xMin, double *yMin,
+                                  double *xMax, double *yMax) {
+  return text->findCharRange(pos, length, xMin, yMin, xMax, yMax);
+}
+
+#if TEXTOUT_WORD_LIST
+TextWordList *TextOutputDev::makeWordList() {
+  return text->makeWordList(physLayout);
+}
+#endif
+
+TextPage *TextOutputDev::takeText() {
+  TextPage *ret;
+
+  ret = text;
+  text = new TextPage(rawOrder);
+  return ret;
+}
diff --git a/poppler/TextOutputDev.h b/poppler/TextOutputDev.h
new file mode 100644 (file)
index 0000000..e31876b
--- /dev/null
@@ -0,0 +1,824 @@
+//========================================================================
+//
+// TextOutputDev.h
+//
+// Copyright 1997-2003 Glyph & Cog, LLC
+//
+//========================================================================
+
+//========================================================================
+//
+// Modified under the Poppler project - http://poppler.freedesktop.org
+//
+// All changes made under the Poppler project to this file are licensed
+// under GPL version 2 or later
+//
+// Copyright (C) 2005-2007 Kristian Høgsberg <krh@redhat.com>
+// Copyright (C) 2006 Ed Catmur <ed@catmur.co.uk>
+// Copyright (C) 2007, 2008, 2011 Carlos Garcia Campos <carlosgc@gnome.org>
+// Copyright (C) 2007 Adrian Johnson <ajohnson@redneon.com>
+// Copyright (C) 2008, 2010 Albert Astals Cid <aacid@kde.org>
+// Copyright (C) 2010 Brian Ewins <brian.ewins@gmail.com>
+//
+// To see a description of the changes please see the Changelog file that
+// came with your tarball or type make ChangeLog if you are building from git
+//
+//========================================================================
+
+#ifndef TEXTOUTPUTDEV_H
+#define TEXTOUTPUTDEV_H
+
+#ifdef USE_GCC_PRAGMAS
+#pragma interface
+#endif
+
+#include "poppler-config.h"
+#include <stdio.h>
+#include "goo/gtypes.h"
+#include "GfxFont.h"
+#include "GfxState.h"
+#include "OutputDev.h"
+
+class GooString;
+class GooList;
+class Gfx;
+class GfxFont;
+class GfxState;
+class UnicodeMap;
+class AnnotLink;
+
+class TextWord;
+class TextPool;
+class TextLine;
+class TextLineFrag;
+class TextBlock;
+class TextFlow;
+class TextWordList;
+class TextPage;
+class TextSelectionVisitor;
+
+//------------------------------------------------------------------------
+
+typedef void (*TextOutputFunc)(void *stream, const char *text, int len);
+
+enum SelectionStyle {
+  selectionStyleGlyph,
+  selectionStyleWord,
+  selectionStyleLine
+};
+
+//------------------------------------------------------------------------
+// TextFontInfo
+//------------------------------------------------------------------------
+
+class TextFontInfo {
+public:
+
+  TextFontInfo(GfxState *state);
+  ~TextFontInfo();
+
+  GBool matches(GfxState *state);
+  GBool matches(TextFontInfo *fontInfo);
+
+#if TEXTOUT_WORD_LIST
+  // Get the font name (which may be NULL).
+  GooString *getFontName() { return fontName; }
+
+  // Get font descriptor flags.
+  GBool isFixedWidth() { return flags & fontFixedWidth; }
+  GBool isSerif() { return flags & fontSerif; }
+  GBool isSymbolic() { return flags & fontSymbolic; }
+  GBool isItalic() { return flags & fontItalic; }
+  GBool isBold() { return flags & fontBold; }
+#endif
+
+private:
+
+  GfxFont *gfxFont;
+#if TEXTOUT_WORD_LIST
+  GooString *fontName;
+  int flags;
+#endif
+
+  friend class TextWord;
+  friend class TextPage;
+  friend class TextSelectionPainter;
+};
+
+//------------------------------------------------------------------------
+// TextWord
+//------------------------------------------------------------------------
+
+class TextWord {
+public:
+
+  // Constructor.
+  TextWord(GfxState *state, int rotA, double x0, double y0,
+          TextFontInfo *fontA, double fontSize);
+
+  // Destructor.
+  ~TextWord();
+
+  // Add a character to the word.
+  void addChar(GfxState *state, double x, double y,
+              double dx, double dy, int charPosA, int charLen,
+              CharCode c, Unicode u);
+
+  // Merge <word> onto the end of <this>.
+  void merge(TextWord *word);
+
+  // Compares <this> to <word>, returning -1 (<), 0 (=), or +1 (>),
+  // based on a primary-axis comparison, e.g., x ordering if rot=0.
+  int primaryCmp(TextWord *word);
+
+  // Return the distance along the primary axis between <this> and
+  // <word>.
+  double primaryDelta(TextWord *word);
+
+  static int cmpYX(const void *p1, const void *p2);
+
+  void visitSelection(TextSelectionVisitor *visitor,
+                     PDFRectangle *selection,
+                     SelectionStyle style);
+
+  // Get the TextFontInfo object associated with this word.
+  TextFontInfo *getFontInfo() { return font; }
+
+  // Get the next TextWord on the linked list.
+  TextWord *getNext() { return next; }
+
+#if TEXTOUT_WORD_LIST
+  int getLength() { return len; }
+  const Unicode *getChar(int idx) { return &text[idx]; }
+  GooString *getText();
+  GooString *getFontName() { return font->fontName; }
+  void getColor(double *r, double *g, double *b)
+    { *r = colorR; *g = colorG; *b = colorB; }
+  void getBBox(double *xMinA, double *yMinA, double *xMaxA, double *yMaxA)
+    { *xMinA = xMin; *yMinA = yMin; *xMaxA = xMax; *yMaxA = yMax; }
+  void getCharBBox(int charIdx, double *xMinA, double *yMinA,
+                  double *xMaxA, double *yMaxA);
+  double getFontSize() { return fontSize; }
+  int getRotation() { return rot; }
+  int getCharPos() { return charPos[0]; }
+  int getCharLen() { return charPos[len] - charPos[0]; }
+  GBool getSpaceAfter() { return spaceAfter; }
+#endif
+  GBool isUnderlined() { return underlined; }
+  AnnotLink *getLink() { return link; }
+  double getEdge(int i) { return edge[i]; }
+  double getBaseline () { return base; }
+  GBool hasSpaceAfter  () { return spaceAfter; }
+  TextWord* nextWord () { return next; };
+private:
+
+  int rot;                     // rotation, multiple of 90 degrees
+                               //   (0, 1, 2, or 3)
+  double xMin, xMax;           // bounding box x coordinates
+  double yMin, yMax;           // bounding box y coordinates
+  double base;                 // baseline x or y coordinate
+  Unicode *text;               // the text
+  CharCode *charcode;          // glyph indices
+  double *edge;                        // "near" edge x or y coord of each char
+                               //   (plus one extra entry for the last char)
+  int *charPos;                        // character position (within content stream)
+                               //   of each char (plus one extra entry for
+                               //   the last char)
+  int len;                     // length of text/edge/charPos arrays
+  int size;                    // size of text/edge/charPos arrays
+  TextFontInfo *font;          // font information
+  double fontSize;             // font size
+  GBool spaceAfter;            // set if there is a space between this
+                               //   word and the next word on the line
+  TextWord *next;              // next word in line
+
+#if TEXTOUT_WORD_LIST
+  double colorR,               // word color
+         colorG,
+         colorB;
+#endif
+
+  GBool underlined;
+  AnnotLink *link;
+
+  friend class TextPool;
+  friend class TextLine;
+  friend class TextBlock;
+  friend class TextFlow;
+  friend class TextWordList;
+  friend class TextPage;
+
+  friend class TextSelectionPainter;
+  friend class TextSelectionDumper;
+};
+
+//------------------------------------------------------------------------
+// TextPool
+//------------------------------------------------------------------------
+
+class TextPool {
+public:
+
+  TextPool();
+  ~TextPool();
+
+  TextWord *getPool(int baseIdx) { return pool[baseIdx - minBaseIdx]; }
+  void setPool(int baseIdx, TextWord *p) { pool[baseIdx - minBaseIdx] = p; }
+
+  int getBaseIdx(double base);
+
+  void addWord(TextWord *word);
+
+private:
+
+  int minBaseIdx;              // min baseline bucket index
+  int maxBaseIdx;              // max baseline bucket index
+  TextWord **pool;             // array of linked lists, one for each
+                               //   baseline value (multiple of 4 pts)
+  TextWord *cursor;            // pointer to last-accessed word
+  int cursorBaseIdx;           // baseline bucket index of last-accessed word
+
+  friend class TextBlock;
+  friend class TextPage;
+};
+
+struct TextFlowData;
+
+//------------------------------------------------------------------------
+// TextLine
+//------------------------------------------------------------------------
+
+class TextLine {
+public:
+
+  TextLine(TextBlock *blkA, int rotA, double baseA);
+  ~TextLine();
+
+  void addWord(TextWord *word);
+
+  // Return the distance along the primary axis between <this> and
+  // <line>.
+  double primaryDelta(TextLine *line);
+
+  // Compares <this> to <line>, returning -1 (<), 0 (=), or +1 (>),
+  // based on a primary-axis comparison, e.g., x ordering if rot=0.
+  int primaryCmp(TextLine *line);
+
+  // Compares <this> to <line>, returning -1 (<), 0 (=), or +1 (>),
+  // based on a secondary-axis comparison of the baselines, e.g., y
+  // ordering if rot=0.
+  int secondaryCmp(TextLine *line);
+
+  int cmpYX(TextLine *line);
+
+  static int cmpXY(const void *p1, const void *p2);
+
+  void coalesce(UnicodeMap *uMap);
+
+  void visitSelection(TextSelectionVisitor *visitor,
+                     PDFRectangle *selection,
+                     SelectionStyle style);
+
+  // Get the head of the linked list of TextWords.
+  TextWord *getWords() { return words; }
+
+  // Get the next TextLine on the linked list.
+  TextLine *getNext() { return next; }
+
+  // Returns true if the last char of the line is a hyphen.
+  GBool isHyphenated() { return hyphenated; }
+
+private:
+
+  TextBlock *blk;              // parent block
+  int rot;                     // text rotation
+  double xMin, xMax;           // bounding box x coordinates
+  double yMin, yMax;           // bounding box y coordinates
+  double base;                 // baseline x or y coordinate
+  TextWord *words;             // words in this line
+  TextWord *lastWord;          // last word in this line
+  Unicode *text;               // Unicode text of the line, including
+                               //   spaces between words
+  double *edge;                        // "near" edge x or y coord of each char
+                               //   (plus one extra entry for the last char)
+  int *col;                    // starting column number of each Unicode char
+  int len;                     // number of Unicode chars
+  int convertedLen;            // total number of converted characters
+  GBool hyphenated;            // set if last char is a hyphen
+  TextLine *next;              // next line in block
+  Unicode *normalized;         // normalized form of Unicode text
+  int normalized_len;          // number of normalized Unicode chars
+  int *normalized_idx;         // indices of normalized chars into Unicode text
+
+  friend class TextLineFrag;
+  friend class TextBlock;
+  friend class TextFlow;
+  friend class TextWordList;
+  friend class TextPage;
+
+  friend class TextSelectionPainter;
+  friend class TextSelectionSizer;
+  friend class TextSelectionDumper;
+};
+
+//------------------------------------------------------------------------
+// TextBlock
+//------------------------------------------------------------------------
+
+class TextBlock {
+public:
+
+  TextBlock(TextPage *pageA, int rotA);
+  ~TextBlock();
+
+  void addWord(TextWord *word);
+
+  void coalesce(UnicodeMap *uMap, double fixedPitch);
+
+  // Update this block's priMin and priMax values, looking at <blk>.
+  void updatePriMinMax(TextBlock *blk);
+
+  static int cmpXYPrimaryRot(const void *p1, const void *p2);
+
+  static int cmpYXPrimaryRot(const void *p1, const void *p2);
+
+  int primaryCmp(TextBlock *blk);
+
+  double secondaryDelta(TextBlock *blk);
+
+  // Returns true if <this> is below <blk>, relative to the page's
+  // primary rotation.
+  GBool isBelow(TextBlock *blk);
+
+  void visitSelection(TextSelectionVisitor *visitor,
+                     PDFRectangle *selection,
+                     SelectionStyle style);
+
+  // Get the head of the linked list of TextLines.
+  TextLine *getLines() { return lines; }
+
+  // Get the next TextBlock on the linked list.
+  TextBlock *getNext() { return next; }
+
+  void getBBox(double *xMinA, double *yMinA, double *xMaxA, double *yMaxA)
+    { *xMinA = xMin; *yMinA = yMin; *xMaxA = xMax; *yMaxA = yMax; }
+
+  int getLineCount() { return nLines; }
+
+private:
+
+  GBool isBeforeByRule1(TextBlock *blk1);
+  GBool isBeforeByRepeatedRule1(TextBlock *blkList, TextBlock *blk1);
+  GBool isBeforeByRule2(TextBlock *blk1);
+
+  int visitDepthFirst(TextBlock *blkList, int pos1,
+                     TextBlock **sorted, int sortPos,
+                     GBool* visited);
+
+  TextPage *page;              // the parent page
+  int rot;                     // text rotation
+  double xMin, xMax;           // bounding box x coordinates
+  double yMin, yMax;           // bounding box y coordinates
+  double priMin, priMax;       // whitespace bounding box along primary axis
+  double ExMin, ExMax;         // extended bounding box x coordinates
+  double EyMin, EyMax;         // extended bounding box y coordinates
+  int tableId;                 // id of table to which this block belongs
+  GBool tableEnd;              // is this block at end of line of actual table
+
+  TextPool *pool;              // pool of words (used only until lines
+                               //   are built)
+  TextLine *lines;             // linked list of lines
+  TextLine *curLine;           // most recently added line
+  int nLines;                  // number of lines
+  int charCount;               // number of characters in the block
+  int col;                     // starting column
+  int nColumns;                        // number of columns in the block
+
+  TextBlock *next;
+  TextBlock *stackNext;
+
+  friend class TextLine;
+  friend class TextLineFrag;
+  friend class TextFlow;
+  friend class TextWordList;
+  friend class TextPage;
+  friend class TextSelectionPainter;
+  friend class TextSelectionDumper;
+};
+
+//------------------------------------------------------------------------
+// TextFlow
+//------------------------------------------------------------------------
+
+class TextFlow {
+public:
+
+  TextFlow(TextPage *pageA, TextBlock *blk);
+  ~TextFlow();
+
+  // Add a block to the end of this flow.
+  void addBlock(TextBlock *blk);
+
+  // Returns true if <blk> fits below <prevBlk> in the flow, i.e., (1)
+  // it uses a font no larger than the last block added to the flow,
+  // and (2) it fits within the flow's [priMin, priMax] along the
+  // primary axis.
+  GBool blockFits(TextBlock *blk, TextBlock *prevBlk);
+
+  // Get the head of the linked list of TextBlocks.
+  TextBlock *getBlocks() { return blocks; }
+
+  // Get the next TextFlow on the linked list.
+  TextFlow *getNext() { return next; }
+
+private:
+
+  TextPage *page;              // the parent page
+  double xMin, xMax;           // bounding box x coordinates
+  double yMin, yMax;           // bounding box y coordinates
+  double priMin, priMax;       // whitespace bounding box along primary axis
+  TextBlock *blocks;           // blocks in flow
+  TextBlock *lastBlk;          // last block in this flow
+  TextFlow *next;
+
+  friend class TextWordList;
+  friend class TextPage;
+};
+
+#if TEXTOUT_WORD_LIST
+
+//------------------------------------------------------------------------
+// TextWordList
+//------------------------------------------------------------------------
+
+class TextWordList {
+public:
+
+  // Build a flat word list, in content stream order (if
+  // text->rawOrder is true), physical layout order (if <physLayout>
+  // is true and text->rawOrder is false), or reading order (if both
+  // flags are false).
+  TextWordList(TextPage *text, GBool physLayout);
+
+  ~TextWordList();
+
+  // Return the number of words on the list.
+  int getLength();
+
+  // Return the <idx>th word from the list.
+  TextWord *get(int idx);
+
+private:
+
+  GooList *words;                      // [TextWord]
+};
+
+#endif // TEXTOUT_WORD_LIST
+
+//------------------------------------------------------------------------
+// TextPage
+//------------------------------------------------------------------------
+
+class TextPage {
+public:
+
+  // Constructor.
+  TextPage(GBool rawOrderA);
+
+  void incRefCnt();
+  void decRefCnt();
+
+  // Start a new page.
+  void startPage(GfxState *state);
+
+  // End the current page.
+  void endPage();
+
+  // Update the current font.
+  void updateFont(GfxState *state);
+
+  // Begin a new word.
+  void beginWord(GfxState *state, double x0, double y0);
+
+  // Add a character to the current word.
+  void addChar(GfxState *state, double x, double y,
+              double dx, double dy,
+              CharCode c, int nBytes, Unicode *u, int uLen);
+
+  // Add <nChars> invisible characters.
+  void incCharCount(int nChars);
+
+  // End the current word, sorting it into the list of words.
+  void endWord();
+
+  // Add a word, sorting it into the list of words.
+  void addWord(TextWord *word);
+
+  // Add a (potential) underline.
+  void addUnderline(double x0, double y0, double x1, double y1);
+
+  // Add a hyperlink.
+  void addLink(int xMin, int yMin, int xMax, int yMax, AnnotLink *link);
+
+  // Coalesce strings that look like parts of the same line.
+  void coalesce(GBool physLayout, double fixedPitch, GBool doHTML);
+
+  // Find a string.  If <startAtTop> is true, starts looking at the
+  // top of the page; else if <startAtLast> is true, starts looking
+  // immediately after the last find result; else starts looking at
+  // <xMin>,<yMin>.  If <stopAtBottom> is true, stops looking at the
+  // bottom of the page; else if <stopAtLast> is true, stops looking
+  // just before the last find result; else stops looking at
+  // <xMax>,<yMax>.
+  GBool findText(Unicode *s, int len,
+                GBool startAtTop, GBool stopAtBottom,
+                GBool startAtLast, GBool stopAtLast,
+                GBool caseSensitive, GBool backward,
+                GBool wholeWord,
+                double *xMin, double *yMin,
+                double *xMax, double *yMax);
+
+  // Get the text which is inside the specified rectangle.
+  GooString *getText(double xMin, double yMin,
+                    double xMax, double yMax);
+
+  void visitSelection(TextSelectionVisitor *visitor,
+                     PDFRectangle *selection,
+                     SelectionStyle style);
+
+  void drawSelection(OutputDev *out,
+                    double scale,
+                    int rotation,
+                    PDFRectangle *selection,
+                    SelectionStyle style,
+                    GfxColor *glyph_color, GfxColor *box_color);
+
+  GooList *getSelectionRegion(PDFRectangle *selection,
+                             SelectionStyle style,
+                             double scale);
+
+  GooString *getSelectionText(PDFRectangle *selection,
+                             SelectionStyle style);
+
+  // Find a string by character position and length.  If found, sets
+  // the text bounding rectangle and returns true; otherwise returns
+  // false.
+  GBool findCharRange(int pos, int length,
+                     double *xMin, double *yMin,
+                     double *xMax, double *yMax);
+
+  // Dump contents of page to a file.
+  void dump(void *outputStream, TextOutputFunc outputFunc,
+           GBool physLayout);
+
+  // Get the head of the linked list of TextFlows.
+  TextFlow *getFlows() { return flows; }
+
+#if TEXTOUT_WORD_LIST
+  // Build a flat word list, in content stream order (if
+  // this->rawOrder is true), physical layout order (if <physLayout>
+  // is true and this->rawOrder is false), or reading order (if both
+  // flags are false).
+  TextWordList *makeWordList(GBool physLayout);
+#endif
+
+private:
+  
+  // Destructor.
+  ~TextPage();
+  
+  void clear();
+  void assignColumns(TextLineFrag *frags, int nFrags, GBool rot);
+  int dumpFragment(Unicode *text, int len, UnicodeMap *uMap, GooString *s);
+
+  GBool rawOrder;              // keep text in content stream order
+
+  double pageWidth, pageHeight;        // width and height of current page
+  TextWord *curWord;           // currently active string
+  int charPos;                 // next character position (within content
+                               //   stream)
+  TextFontInfo *curFont;       // current font
+  double curFontSize;          // current font size
+  int nest;                    // current nesting level (for Type 3 fonts)
+  int nTinyChars;              // number of "tiny" chars seen so far
+  GBool lastCharOverlap;       // set if the last added char overlapped the
+                               //   previous char
+
+  TextPool *pools[4];          // a "pool" of TextWords for each rotation
+  TextFlow *flows;             // linked list of flows
+  TextBlock **blocks;          // array of blocks, in yx order
+  int nBlocks;                 // number of blocks
+  int primaryRot;              // primary rotation
+  GBool primaryLR;             // primary direction (true means L-to-R,
+                               //   false means R-to-L)
+  TextWord *rawWords;          // list of words, in raw order (only if
+                               //   rawOrder is set)
+  TextWord *rawLastWord;       // last word on rawWords list
+
+  GooList *fonts;                      // all font info objects used on this
+                               //   page [TextFontInfo]
+
+  double lastFindXMin,         // coordinates of the last "find" result
+         lastFindYMin;
+  GBool haveLastFind;
+
+  GooList *underlines;         // [TextUnderline]
+  GooList *links;              // [TextLink]
+
+  int refCnt;
+
+  friend class TextLine;
+  friend class TextLineFrag;
+  friend class TextBlock;
+  friend class TextFlow;
+  friend class TextWordList;
+  friend class TextSelectionPainter;
+  friend class TextSelectionDumper;
+};
+
+//------------------------------------------------------------------------
+// ActualText
+//------------------------------------------------------------------------
+
+class ActualText {
+public:
+  // Create an ActualText
+  ActualText(TextPage *out);
+  ~ActualText();
+
+  void addChar(GfxState *state, double x, double y,
+              double dx, double dy,
+              CharCode c, int nBytes, Unicode *u, int uLen);
+  void begin(GfxState *state, GooString *text);
+  void end(GfxState *state);
+
+private:
+  TextPage *text;
+
+  GooString *actualText;        // replacement text for the span
+  double actualTextX0;
+  double actualTextY0;
+  double actualTextX1;
+  double actualTextY1;
+  int actualTextNBytes;
+};
+  
+
+//------------------------------------------------------------------------
+// TextOutputDev
+//------------------------------------------------------------------------
+
+class TextOutputDev: public OutputDev {
+public:
+
+  // Open a text output file.  If <fileName> is NULL, no file is
+  // written (this is useful, e.g., for searching text).  If
+  // <physLayoutA> is true, the original physical layout of the text
+  // is maintained.  If <rawOrder> is true, the text is kept in
+  // content stream order.
+  TextOutputDev(char *fileName, GBool physLayoutA,
+               double fixedPitchA, GBool rawOrderA,
+               GBool append);
+
+  // Create a TextOutputDev which will write to a generic stream.  If
+  // <physLayoutA> is true, the original physical layout of the text
+  // is maintained.  If <rawOrder> is true, the text is kept in
+  // content stream order.
+  TextOutputDev(TextOutputFunc func, void *stream,
+               GBool physLayoutA, double fixedPitchA,
+               GBool rawOrderA);
+
+  // Destructor.
+  virtual ~TextOutputDev();
+
+  // Check if file was successfully created.
+  virtual GBool isOk() { return ok; }
+
+  //---- get info about output device
+
+  // Does this device use upside-down coordinates?
+  // (Upside-down means (0,0) is the top left corner of the page.)
+  virtual GBool upsideDown() { return gTrue; }
+
+  // Does this device use drawChar() or drawString()?
+  virtual GBool useDrawChar() { return gTrue; }
+
+  // Does this device use beginType3Char/endType3Char?  Otherwise,
+  // text in Type 3 fonts will be drawn with drawChar/drawString.
+  virtual GBool interpretType3Chars() { return gFalse; }
+
+  // Does this device need non-text content?
+  virtual GBool needNonText() { return gFalse; }
+
+  // Does this device require incCharCount to be called for text on
+  // non-shown layers?
+  virtual GBool needCharCount() { return gTrue; }
+
+  //----- initialization and control
+
+  // Start a page.
+  virtual void startPage(int pageNum, GfxState *state);
+
+  // End a page.
+  virtual void endPage();
+
+  //----- save/restore graphics state
+  virtual void restoreState(GfxState *state);
+
+  //----- update text state
+  virtual void updateFont(GfxState *state);
+
+  //----- text drawing
+  virtual void beginString(GfxState *state, GooString *s);
+  virtual void endString(GfxState *state);
+  virtual void drawChar(GfxState *state, double x, double y,
+                       double dx, double dy,
+                       double originX, double originY,
+                       CharCode c, int nBytes, Unicode *u, int uLen);
+  virtual void incCharCount(int nChars);
+  virtual void beginActualText(GfxState *state, GooString *text);
+  virtual void endActualText(GfxState *state);
+
+  //----- path painting
+  virtual void stroke(GfxState *state);
+  virtual void fill(GfxState *state);
+  virtual void eoFill(GfxState *state);
+
+  //----- link borders
+  virtual void processLink(AnnotLink *link);
+
+  //----- special access
+
+  // Find a string.  If <startAtTop> is true, starts looking at the
+  // top of the page; else if <startAtLast> is true, starts looking
+  // immediately after the last find result; else starts looking at
+  // <xMin>,<yMin>.  If <stopAtBottom> is true, stops looking at the
+  // bottom of the page; else if <stopAtLast> is true, stops looking
+  // just before the last find result; else stops looking at
+  // <xMax>,<yMax>.
+  GBool findText(Unicode *s, int len,
+                GBool startAtTop, GBool stopAtBottom,
+                GBool startAtLast, GBool stopAtLast,
+                GBool caseSensitive, GBool backward,
+                GBool wholeWord,
+                double *xMin, double *yMin,
+                double *xMax, double *yMax);
+
+  // Get the text which is inside the specified rectangle.
+  GooString *getText(double xMin, double yMin,
+                  double xMax, double yMax);
+
+  // Find a string by character position and length.  If found, sets
+  // the text bounding rectangle and returns true; otherwise returns
+  // false.
+  GBool findCharRange(int pos, int length,
+                     double *xMin, double *yMin,
+                     double *xMax, double *yMax);
+
+  void drawSelection(OutputDev *out, double scale, int rotation,
+                    PDFRectangle *selection,
+                    SelectionStyle style,
+                    GfxColor *glyph_color, GfxColor *box_color);
+
+  GooList *getSelectionRegion(PDFRectangle *selection,
+                             SelectionStyle style,
+                             double scale);
+
+  GooString *getSelectionText(PDFRectangle *selection,
+                             SelectionStyle style);
+
+#if TEXTOUT_WORD_LIST
+  // Build a flat word list, in content stream order (if
+  // this->rawOrder is true), physical layout order (if
+  // this->physLayout is true and this->rawOrder is false), or reading
+  // order (if both flags are false).
+  TextWordList *makeWordList();
+#endif
+
+  // Returns the TextPage object for the last rasterized page,
+  // transferring ownership to the caller.
+  TextPage *takeText();
+
+  // Turn extra processing for HTML conversion on or off.
+  void enableHTMLExtras(GBool doHTMLA) { doHTML = doHTMLA; }
+
+private:
+
+  TextOutputFunc outputFunc;   // output function
+  void *outputStream;          // output stream
+  GBool needClose;             // need to close the output file?
+                               //   (only if outputStream is a FILE*)
+  TextPage *text;              // text for the current page
+  GBool physLayout;            // maintain original physical layout when
+                               //   dumping text
+  double fixedPitch;           // if physLayout is true and this is non-zero,
+                               //   assume fixed-pitch characters with this
+                               //   width
+  GBool rawOrder;              // keep text in content stream order
+  GBool doHTML;                        // extra processing for HTML conversion
+  GBool ok;                    // set up ok?
+
+  ActualText *actualText;
+};
+
+#endif
diff --git a/poppler/UTF8.h b/poppler/UTF8.h
new file mode 100644 (file)
index 0000000..34a07d4
--- /dev/null
@@ -0,0 +1,84 @@
+//========================================================================
+//
+// UTF8.h
+//
+// Copyright 2001-2003 Glyph & Cog, LLC
+//
+//========================================================================
+
+//========================================================================
+//
+// Modified under the Poppler project - http://poppler.freedesktop.org
+//
+// All changes made under the Poppler project to this file are licensed
+// under GPL version 2 or later
+//
+// Copyright (C) 2008 Koji Otani <sho@bbr.jp>
+//
+// To see a description of the changes please see the Changelog file that
+// came with your tarball or type make ChangeLog if you are building from git
+//
+//========================================================================
+
+static int mapUTF8(Unicode u, char *buf, int bufSize) {
+  if        (u <= 0x0000007f) {
+    if (bufSize < 1) {
+      return 0;
+    }
+    buf[0] = (char)u;
+    return 1;
+  } else if (u <= 0x000007ff) {
+    if (bufSize < 2) {
+      return 0;
+    }
+    buf[0] = (char)(0xc0 + (u >> 6));
+    buf[1] = (char)(0x80 + (u & 0x3f));
+    return 2;
+  } else if (u <= 0x0000ffff) {
+    if (bufSize < 3) {
+      return 0;
+    }
+    buf[0] = (char)(0xe0 + (u >> 12));
+    buf[1] = (char)(0x80 + ((u >> 6) & 0x3f));
+    buf[2] = (char)(0x80 + (u & 0x3f));
+    return 3;
+  } else if (u <= 0x0010ffff) {
+    if (bufSize < 4) {
+      return 0;
+    }
+    buf[0] = (char)(0xf0 + (u >> 18));
+    buf[1] = (char)(0x80 + ((u >> 12) & 0x3f));
+    buf[2] = (char)(0x80 + ((u >> 6) & 0x3f));
+    buf[3] = (char)(0x80 + (u & 0x3f));
+    return 4;
+  } else {
+    return 0;
+  }
+}
+
+static int mapUCS2(Unicode u, char *buf, int bufSize) {
+  if (u <= 0xffff) {
+    if (bufSize < 2) {
+      return 0;
+    }
+    buf[0] = (char)((u >> 8) & 0xff);
+    buf[1] = (char)(u & 0xff);
+    return 2;
+  } else if (u < 0x110000) {
+    Unicode uu;
+
+    /* using surrogate pair */
+    if (bufSize < 4) {
+      return 0;
+    }
+    uu = ((u - 0x10000) >> 10) + 0xd800;
+    buf[0] = (char)((uu >> 8) & 0xff);
+    buf[1] = (char)(uu & 0xff);
+    uu = (u & 0x3ff)+0xdc00;
+    buf[2] = (char)((uu >> 8) & 0xff);
+    buf[3] = (char)(uu & 0xff);
+    return 4;
+  } else {
+    return 0;
+  }
+}
diff --git a/poppler/UnicodeCClassTables.h b/poppler/UnicodeCClassTables.h
new file mode 100644 (file)
index 0000000..62f9ecc
--- /dev/null
@@ -0,0 +1,1827 @@
+// Copied from gunidecomp.h in GLib:
+//     s/[G]_UNICODE_MAX_TABLE_INDEX/UNICODE_MAX_TABLE_INDEX/g
+//     s/[g]uchar/Unicode/g
+//     s/[g]int16/short/g
+// Can be regenerated from gen-unicode-tables.pl, also in GLib, with relevant 
+// Unicode data tables from ftp.unicode.org.
+
+static const Unicode cclass_data[][256] = {
+  { /* page 3, index 0 */
+    230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 
+    230, 230, 230, 230, 230, 230, 230, 232, 220, 220, 220, 220, 232, 216, 
+    220, 220, 220, 220, 220, 202, 202, 220, 220, 220, 220, 202, 202, 220, 
+    220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 1, 1, 1, 1, 1, 220, 
+    220, 220, 220, 230, 230, 230, 230, 230, 230, 230, 230, 240, 230, 220, 
+    220, 220, 230, 230, 230, 220, 220, 0, 230, 230, 230, 220, 220, 220, 220, 
+    230, 0, 0, 0, 0, 0, 234, 234, 233, 234, 234, 233, 230, 230, 230, 230, 
+    230, 230, 230, 230, 230, 230, 230, 230, 230, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
+  },
+  { /* page 4, index 1 */
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 230, 230, 230, 230, 0, 0, 0, 0, 0, 0, 0, 
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
+  },
+  { /* page 5, index 2 */
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
+    0, 220, 230, 230, 230, 230, 220, 230, 230, 230, 222, 220, 230, 230, 230, 
+    230, 230, 230, 0, 220, 220, 220, 220, 220, 230, 230, 220, 230, 230, 222, 
+    228, 230, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 0, 20, 21, 22, 0, 23, 
+    0, 24, 25, 0, 230, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
+  },
+  { /* page 6, index 3 */
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 230, 230, 230, 230, 230, 
+    230, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
+    0, 0, 0, 0, 0, 0, 27, 28, 29, 30, 31, 32, 33, 34, 230, 230, 220, 220, 
+    230, 230, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
+    0, 0, 35, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
+    0, 0, 0, 0, 0, 0, 0, 0, 230, 230, 230, 230, 230, 230, 230, 0, 0, 230, 
+    230, 230, 230, 220, 230, 0, 0, 230, 230, 0, 220, 230, 230, 220, 0, 0, 0, 
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
+  },
+  { /* page 7, index 4 */
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 36, 0, 0, 0, 0, 0, 0, 
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
+    230, 220, 230, 230, 220, 230, 230, 220, 220, 220, 230, 220, 220, 230, 
+    220, 230, 230, 230, 220, 230, 220, 230, 220, 230, 220, 230, 230, 0, 0, 0, 
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0
+  },
+  { /* page 9, index 5 */
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
+    0, 0, 0, 0, 0, 9, 0, 0, 0, 230, 220, 230, 230, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
+  },
+  { /* page 10, index 6 */
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
+    0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
+  },
+  { /* page 11, index 7 */
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
+    0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
+  },
+  { /* page 12, index 8 */
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
+    0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 84, 91, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
+  },
+  { /* page 13, index 9 */
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
+    0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
+  },
+  { /* page 14, index 10 */
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
+    0, 0, 0, 0, 0, 0, 0, 0, 103, 103, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
+    0, 107, 107, 107, 107, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 118, 118, 0, 0, 
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 122, 122, 122, 122, 0, 0, 0, 0, 0, 0, 
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
+  },
+  { /* page 15, index 11 */
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
+    220, 220, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
+    0, 0, 0, 0, 0, 0, 220, 0, 220, 0, 216, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 129, 130, 0, 
+    132, 0, 0, 0, 0, 0, 130, 130, 130, 130, 0, 0, 130, 0, 230, 230, 9, 0, 
+    230, 230, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 220, 0, 0, 0, 0, 0, 0, 
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
+    0, 0, 0
+  },
+  { /* page 16, index 12 */
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
+    0, 0, 0, 0, 0, 0, 0, 7, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
+  },
+  { /* page 23, index 13 */
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
+    0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 
+    0, 0, 0, 0, 0, 230, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
+  },
+  { /* page 24, index 14 */
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
+    0, 228, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
+  },
+  { /* page 25, index 15 */
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 222, 230, 220, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
+  },
+  { /* page 32, index 16 */
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 230, 230, 1, 1, 230, 230, 
+    230, 230, 1, 1, 1, 230, 230, 0, 0, 0, 0, 230, 0, 0, 0, 1, 1, 230, 220, 
+    230, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
+  },
+  { /* page 48, index 17 */
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 218, 228, 232, 222, 
+    224, 224, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
+  },
+  { /* page 251, index 18 */
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
+    0, 0, 0, 0, 0, 0, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
+  },
+  { /* page 254, index 19 */
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
+    0, 0, 0, 0, 0, 0, 0, 0, 230, 230, 230, 230, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
+  },
+  { /* page 465, index 20 */
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
+    0, 0, 0, 0, 0, 216, 216, 1, 1, 1, 0, 0, 0, 226, 216, 216, 216, 216, 216, 
+    0, 0, 0, 0, 0, 0, 0, 0, 220, 220, 220, 220, 220, 220, 220, 220, 0, 0, 
+    230, 230, 230, 230, 230, 220, 220, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 230, 230, 230, 230, 0, 
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
+    0, 0, 0, 0, 0, 0, 0, 0, 0
+  }
+};
+
+static const short combining_class_table_part1[763] = {
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 /* page 3 */,
+  1 /* page 4 */,
+  2 /* page 5 */,
+  3 /* page 6 */,
+  4 /* page 7 */,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  5 /* page 9 */,
+  6 /* page 10 */,
+  7 /* page 11 */,
+  8 /* page 12 */,
+  9 /* page 13 */,
+  10 /* page 14 */,
+  11 /* page 15 */,
+  12 /* page 16 */,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  13 /* page 23 */,
+  14 /* page 24 */,
+  15 /* page 25 */,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  16 /* page 32 */,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  17 /* page 48 */,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  18 /* page 251 */,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  19 /* page 254 */,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  20 /* page 465 */,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX
+};
+
+static const short combining_class_table_part2[768] = {
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX
+};
diff --git a/poppler/UnicodeCompTables.h b/poppler/UnicodeCompTables.h
new file mode 100644 (file)
index 0000000..68e2f86
--- /dev/null
@@ -0,0 +1,665 @@
+// Copied from gunicomp.h in GLib:
+//     s/[G]_UNICODE_MAX_TABLE_INDEX/UNICODE_MAX_TABLE_INDEX/g
+//     s/[g]uint16/unsigned short/g
+//     s/[g]int16/short/g
+// Can be regenerated from gen-unicode-tables.pl, also in GLib, with relevant 
+// Unicode data tables from ftp.unicode.org.
+
+#define COMPOSE_FIRST_START 1
+#define COMPOSE_FIRST_SINGLE_START 147
+#define COMPOSE_SECOND_START 357
+#define COMPOSE_SECOND_SINGLE_START 388
+
+#define COMPOSE_TABLE_LAST 48
+
+static const unsigned short compose_data[][256] = {
+  { /* page 0, index 0 */
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 147, 148, 149, 0, 0, 1, 2, 3, 4, 5, 
+    150, 6, 7, 8, 151, 9, 10, 11, 12, 13, 14, 0, 15, 16, 17, 18, 19, 20, 21, 
+    22, 23, 0, 0, 0, 0, 0, 0, 24, 25, 26, 27, 28, 152, 29, 30, 31, 32, 33, 
+    34, 35, 36, 37, 38, 0, 39, 40, 41, 42, 43, 44, 45, 46, 47, 0, 0, 0, 0, 0, 
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 0, 0, 0, 0, 0, 0, 0, 
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 49, 0, 153, 154, 
+    50, 155, 0, 0, 51, 0, 0, 0, 0, 156, 0, 0, 0, 0, 52, 53, 157, 0, 158, 0, 
+    0, 0, 54, 0, 0, 0, 0, 0, 55, 0, 159, 160, 56, 161, 0, 0, 57, 0, 0, 0, 0, 
+    162, 0, 0, 0, 0, 58, 59, 163, 0, 164, 0, 0, 0, 60, 0, 0, 0
+  },
+  { /* page 1, index 1 */
+    0, 0, 61, 62, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 64, 0, 0, 0, 
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
+    0, 0, 0, 0, 0, 65, 66, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 165, 166, 0, 
+    0, 0, 0, 167, 168, 0, 0, 0, 0, 0, 0, 169, 170, 171, 172, 0, 0, 0, 0, 0, 
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 173, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 67, 
+    68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 69, 70, 0, 0, 0, 0, 0, 0, 174, 
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
+    0, 0, 175, 176, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
+    0
+  },
+  { /* page 2, index 2 */
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 177, 178, 179, 180, 0, 0, 0, 0, 
+    181, 182, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
+    0, 0, 0, 0, 0, 183, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
+  },
+  { /* page 3, index 3 */
+    357, 358, 359, 360, 361, 0, 362, 363, 364, 365, 366, 367, 368, 0, 0, 369, 
+    0, 370, 0, 371, 372, 0, 0, 0, 0, 0, 0, 373, 0, 0, 0, 0, 0, 0, 0, 374, 
+    375, 376, 377, 378, 379, 0, 0, 0, 0, 380, 381, 0, 382, 383, 0, 0, 0, 0, 
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 384, 0, 0, 385, 0, 0, 0, 0, 0, 0, 0, 
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 71, 0, 0, 0, 
+    72, 0, 73, 0, 74, 0, 0, 0, 0, 0, 75, 0, 184, 0, 0, 0, 76, 0, 0, 0, 77, 0, 
+    0, 185, 0, 186, 0, 0, 78, 0, 0, 0, 79, 0, 80, 0, 81, 0, 0, 0, 0, 0, 82, 
+    0, 83, 0, 0, 0, 84, 0, 0, 0, 85, 86, 87, 0, 0, 187, 0, 0, 0, 88, 0, 0, 0, 
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
+  },
+  { /* page 4, index 4 */
+    0, 0, 0, 0, 0, 0, 188, 0, 0, 0, 0, 0, 0, 0, 0, 0, 89, 0, 0, 189, 0, 90, 
+    91, 190, 92, 0, 191, 0, 0, 0, 192, 0, 0, 0, 0, 93, 0, 0, 0, 193, 0, 0, 0, 
+    194, 0, 195, 0, 0, 94, 0, 0, 196, 0, 95, 96, 197, 97, 0, 198, 0, 0, 0, 
+    199, 0, 0, 0, 0, 98, 0, 0, 0, 200, 0, 0, 0, 201, 0, 202, 0, 0, 0, 0, 0, 
+    0, 0, 0, 203, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 204, 205, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 206, 207, 0, 0, 0, 0, 0, 0, 0, 
+    0, 0, 0, 0, 0, 0, 0, 208, 209, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
+    0, 0, 0, 0, 0, 0, 0, 0
+  },
+  { /* page 6, index 5 */
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 99, 0, 0, 0, 0, 0, 0, 0, 0, 
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
+    210, 0, 211, 0, 0, 0, 0, 0, 0, 0, 0, 388, 389, 390, 0, 0, 0, 0, 0, 0, 0, 
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
+    0, 0, 0, 0, 212, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 213, 0, 
+    0, 214, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
+  },
+  { /* page 9, index 6 */
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 215, 0, 0, 0, 0, 0, 0, 0, 
+    216, 0, 0, 217, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 391, 
+    0, 0, 0, 0, 0, 0, 0, 0, 100, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
+    392, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
+  },
+  { /* page 11, index 7 */
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 393, 0, 0, 0, 0, 0, 0, 0, 0, 
+    101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 394, 395, 0, 0, 0, 0, 0, 
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
+    0, 0, 0, 0, 0, 218, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
+    0, 396, 0, 0, 0, 0, 0, 0, 0, 102, 219, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
+    0, 0, 0, 0, 397, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
+  },
+  { /* page 12, index 8 */
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 220, 0, 
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 221, 
+    0, 0, 398, 0, 0, 0, 103, 0, 0, 0, 222, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 399, 
+    400, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
+  },
+  { /* page 13, index 9 */
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 401, 0, 0, 0, 0, 0, 0, 0, 104, 
+    223, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 402, 0, 0, 0, 0, 0, 0, 
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 403, 0, 0, 0, 0, 404, 0, 0, 0, 0, 0, 
+    0, 0, 0, 0, 105, 0, 0, 224, 0, 0, 405, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
+  },
+  { /* page 16, index 10 */
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 225, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
+  },
+  { /* page 30, index 11 */
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
+    0, 0, 0, 0, 0, 0, 226, 227, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 228, 229, 0, 0, 
+    0, 0, 0, 0, 230, 231, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 106, 107, 0, 0, 
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 232, 233, 0, 
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 234, 235, 0, 0, 0, 0, 
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
+  },
+  { /* page 31, index 12 */
+    108, 109, 236, 237, 238, 239, 240, 241, 110, 111, 242, 243, 244, 245, 
+    246, 247, 112, 113, 0, 0, 0, 0, 0, 0, 114, 115, 0, 0, 0, 0, 0, 0, 116, 
+    117, 248, 249, 250, 251, 252, 253, 118, 119, 254, 255, 256, 257, 258, 
+    259, 120, 121, 0, 0, 0, 0, 0, 0, 122, 123, 0, 0, 0, 0, 0, 0, 124, 125, 0, 
+    0, 0, 0, 0, 0, 126, 127, 0, 0, 0, 0, 0, 0, 128, 129, 0, 0, 0, 0, 0, 0, 0, 
+    130, 0, 0, 0, 0, 0, 0, 131, 132, 260, 261, 262, 263, 264, 265, 133, 134, 
+    266, 267, 268, 269, 270, 271, 272, 0, 0, 0, 273, 0, 0, 0, 0, 0, 0, 0, 
+    274, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 275, 0, 0, 0, 0, 0, 0, 0, 0, 135, 0, 0, 0, 
+    0, 0, 0, 276, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
+    0, 0, 0, 277, 0, 0, 0, 0, 0, 0, 0, 136, 0
+  },
+  { /* page 33, index 13 */
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
+    278, 0, 279, 0, 280, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 281, 0, 282, 0, 
+    283, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
+  },
+  { /* page 34, index 14 */
+    0, 0, 0, 284, 0, 0, 0, 0, 285, 0, 0, 286, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 287, 0, 288, 0, 0, 0, 0, 0, 0, 0, 
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 289, 0, 0, 0, 0, 0, 0, 290, 
+    0, 291, 0, 0, 292, 0, 0, 0, 0, 293, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
+    0, 0, 0, 0, 0, 0, 0, 294, 0, 0, 295, 296, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
+    0, 0, 297, 298, 0, 0, 299, 300, 0, 0, 301, 302, 303, 304, 0, 0, 0, 0, 
+    305, 306, 0, 0, 307, 308, 0, 0, 0, 0, 0, 0, 0, 0, 0, 309, 310, 0, 0, 0, 
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 311, 0, 0, 0, 0, 0, 312, 313, 0, 314, 
+    0, 0, 0, 0, 0, 0, 315, 316, 317, 318, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
+  },
+  { /* page 48, index 15 */
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 319, 0, 
+    0, 0, 0, 320, 0, 321, 0, 322, 0, 323, 0, 324, 0, 325, 0, 326, 0, 327, 0, 
+    328, 0, 329, 0, 330, 0, 331, 0, 0, 332, 0, 333, 0, 334, 0, 0, 0, 0, 0, 0, 
+    137, 0, 0, 138, 0, 0, 139, 0, 0, 140, 0, 0, 141, 0, 0, 0, 0, 0, 0, 0, 0, 
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 386, 387, 
+    0, 0, 335, 0, 0, 0, 0, 0, 0, 0, 0, 336, 0, 0, 0, 0, 337, 0, 338, 0, 339, 
+    0, 340, 0, 341, 0, 342, 0, 343, 0, 344, 0, 345, 0, 346, 0, 347, 0, 348, 
+    0, 0, 349, 0, 350, 0, 351, 0, 0, 0, 0, 0, 0, 142, 0, 0, 143, 0, 0, 144, 
+    0, 0, 145, 0, 0, 146, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
+    0, 0, 352, 353, 354, 355, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 356, 0, 0
+  }
+};
+
+static const short compose_table[COMPOSE_TABLE_LAST + 1] = {
+  0 /* page 0 */,
+  1 /* page 1 */,
+  2 /* page 2 */,
+  3 /* page 3 */,
+  4 /* page 4 */,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  5 /* page 6 */,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  6 /* page 9 */,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  7 /* page 11 */,
+  8 /* page 12 */,
+  9 /* page 13 */,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  10 /* page 16 */,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  11 /* page 30 */,
+  12 /* page 31 */,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  13 /* page 33 */,
+  14 /* page 34 */,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  0 + UNICODE_MAX_TABLE_INDEX,
+  15 /* page 48 */
+};
+
+static const unsigned short compose_first_single[][2] = {
+ { 0x0338, 0x226e },
+ { 0x0338, 0x2260 },
+ { 0x0338, 0x226f },
+ { 0x0307, 0x1e1e },
+ { 0x0302, 0x0134 },
+ { 0x0307, 0x1e1f },
+ { 0x0304, 0x01de },
+ { 0x0301, 0x01fa },
+ { 0x0301, 0x1e08 },
+ { 0x0301, 0x1e2e },
+ { 0x0304, 0x022a },
+ { 0x0301, 0x01fe },
+ { 0x0304, 0x01df },
+ { 0x0301, 0x01fb },
+ { 0x0301, 0x1e09 },
+ { 0x0301, 0x1e2f },
+ { 0x0304, 0x022b },
+ { 0x0301, 0x01ff },
+ { 0x0307, 0x1e64 },
+ { 0x0307, 0x1e65 },
+ { 0x0307, 0x1e66 },
+ { 0x0307, 0x1e67 },
+ { 0x0301, 0x1e78 },
+ { 0x0301, 0x1e79 },
+ { 0x0308, 0x1e7a },
+ { 0x0308, 0x1e7b },
+ { 0x0307, 0x1e9b },
+ { 0x030c, 0x01ee },
+ { 0x0304, 0x01ec },
+ { 0x0304, 0x01ed },
+ { 0x0304, 0x01e0 },
+ { 0x0304, 0x01e1 },
+ { 0x0306, 0x1e1c },
+ { 0x0306, 0x1e1d },
+ { 0x0304, 0x0230 },
+ { 0x0304, 0x0231 },
+ { 0x030c, 0x01ef },
+ { 0x0314, 0x1fec },
+ { 0x0345, 0x1fb4 },
+ { 0x0345, 0x1fc4 },
+ { 0x0345, 0x1ff4 },
+ { 0x0308, 0x0407 },
+ { 0x0301, 0x0403 },
+ { 0x0308, 0x04de },
+ { 0x0301, 0x040c },
+ { 0x0308, 0x04e6 },
+ { 0x0308, 0x04f4 },
+ { 0x0308, 0x04f8 },
+ { 0x0308, 0x04ec },
+ { 0x0301, 0x0453 },
+ { 0x0308, 0x04df },
+ { 0x0301, 0x045c },
+ { 0x0308, 0x04e7 },
+ { 0x0308, 0x04f5 },
+ { 0x0308, 0x04f9 },
+ { 0x0308, 0x04ed },
+ { 0x0308, 0x0457 },
+ { 0x030f, 0x0476 },
+ { 0x030f, 0x0477 },
+ { 0x0308, 0x04da },
+ { 0x0308, 0x04db },
+ { 0x0308, 0x04ea },
+ { 0x0308, 0x04eb },
+ { 0x0654, 0x0624 },
+ { 0x0654, 0x0626 },
+ { 0x0654, 0x06c2 },
+ { 0x0654, 0x06d3 },
+ { 0x0654, 0x06c0 },
+ { 0x093c, 0x0929 },
+ { 0x093c, 0x0931 },
+ { 0x093c, 0x0934 },
+ { 0x0bd7, 0x0b94 },
+ { 0x0bbe, 0x0bcb },
+ { 0x0c56, 0x0c48 },
+ { 0x0cd5, 0x0cc0 },
+ { 0x0cd5, 0x0ccb },
+ { 0x0d3e, 0x0d4b },
+ { 0x0dca, 0x0ddd },
+ { 0x102e, 0x1026 },
+ { 0x0304, 0x1e38 },
+ { 0x0304, 0x1e39 },
+ { 0x0304, 0x1e5c },
+ { 0x0304, 0x1e5d },
+ { 0x0307, 0x1e68 },
+ { 0x0307, 0x1e69 },
+ { 0x0302, 0x1ec6 },
+ { 0x0302, 0x1ec7 },
+ { 0x0302, 0x1ed8 },
+ { 0x0302, 0x1ed9 },
+ { 0x0345, 0x1f82 },
+ { 0x0345, 0x1f83 },
+ { 0x0345, 0x1f84 },
+ { 0x0345, 0x1f85 },
+ { 0x0345, 0x1f86 },
+ { 0x0345, 0x1f87 },
+ { 0x0345, 0x1f8a },
+ { 0x0345, 0x1f8b },
+ { 0x0345, 0x1f8c },
+ { 0x0345, 0x1f8d },
+ { 0x0345, 0x1f8e },
+ { 0x0345, 0x1f8f },
+ { 0x0345, 0x1f92 },
+ { 0x0345, 0x1f93 },
+ { 0x0345, 0x1f94 },
+ { 0x0345, 0x1f95 },
+ { 0x0345, 0x1f96 },
+ { 0x0345, 0x1f97 },
+ { 0x0345, 0x1f9a },
+ { 0x0345, 0x1f9b },
+ { 0x0345, 0x1f9c },
+ { 0x0345, 0x1f9d },
+ { 0x0345, 0x1f9e },
+ { 0x0345, 0x1f9f },
+ { 0x0345, 0x1fa2 },
+ { 0x0345, 0x1fa3 },
+ { 0x0345, 0x1fa4 },
+ { 0x0345, 0x1fa5 },
+ { 0x0345, 0x1fa6 },
+ { 0x0345, 0x1fa7 },
+ { 0x0345, 0x1faa },
+ { 0x0345, 0x1fab },
+ { 0x0345, 0x1fac },
+ { 0x0345, 0x1fad },
+ { 0x0345, 0x1fae },
+ { 0x0345, 0x1faf },
+ { 0x0345, 0x1fb2 },
+ { 0x0345, 0x1fc2 },
+ { 0x0345, 0x1ff2 },
+ { 0x0345, 0x1fb7 },
+ { 0x0345, 0x1fc7 },
+ { 0x0345, 0x1ff7 },
+ { 0x0338, 0x219a },
+ { 0x0338, 0x219b },
+ { 0x0338, 0x21ae },
+ { 0x0338, 0x21cd },
+ { 0x0338, 0x21cf },
+ { 0x0338, 0x21ce },
+ { 0x0338, 0x2204 },
+ { 0x0338, 0x2209 },
+ { 0x0338, 0x220c },
+ { 0x0338, 0x2224 },
+ { 0x0338, 0x2226 },
+ { 0x0338, 0x2241 },
+ { 0x0338, 0x2244 },
+ { 0x0338, 0x2247 },
+ { 0x0338, 0x2249 },
+ { 0x0338, 0x226d },
+ { 0x0338, 0x2262 },
+ { 0x0338, 0x2270 },
+ { 0x0338, 0x2271 },
+ { 0x0338, 0x2274 },
+ { 0x0338, 0x2275 },
+ { 0x0338, 0x2278 },
+ { 0x0338, 0x2279 },
+ { 0x0338, 0x2280 },
+ { 0x0338, 0x2281 },
+ { 0x0338, 0x22e0 },
+ { 0x0338, 0x22e1 },
+ { 0x0338, 0x2284 },
+ { 0x0338, 0x2285 },
+ { 0x0338, 0x2288 },
+ { 0x0338, 0x2289 },
+ { 0x0338, 0x22e2 },
+ { 0x0338, 0x22e3 },
+ { 0x0338, 0x22ac },
+ { 0x0338, 0x22ad },
+ { 0x0338, 0x22ae },
+ { 0x0338, 0x22af },
+ { 0x0338, 0x22ea },
+ { 0x0338, 0x22eb },
+ { 0x0338, 0x22ec },
+ { 0x0338, 0x22ed },
+ { 0x3099, 0x3094 },
+ { 0x3099, 0x304c },
+ { 0x3099, 0x304e },
+ { 0x3099, 0x3050 },
+ { 0x3099, 0x3052 },
+ { 0x3099, 0x3054 },
+ { 0x3099, 0x3056 },
+ { 0x3099, 0x3058 },
+ { 0x3099, 0x305a },
+ { 0x3099, 0x305c },
+ { 0x3099, 0x305e },
+ { 0x3099, 0x3060 },
+ { 0x3099, 0x3062 },
+ { 0x3099, 0x3065 },
+ { 0x3099, 0x3067 },
+ { 0x3099, 0x3069 },
+ { 0x3099, 0x309e },
+ { 0x3099, 0x30f4 },
+ { 0x3099, 0x30ac },
+ { 0x3099, 0x30ae },
+ { 0x3099, 0x30b0 },
+ { 0x3099, 0x30b2 },
+ { 0x3099, 0x30b4 },
+ { 0x3099, 0x30b6 },
+ { 0x3099, 0x30b8 },
+ { 0x3099, 0x30ba },
+ { 0x3099, 0x30bc },
+ { 0x3099, 0x30be },
+ { 0x3099, 0x30c0 },
+ { 0x3099, 0x30c2 },
+ { 0x3099, 0x30c5 },
+ { 0x3099, 0x30c7 },
+ { 0x3099, 0x30c9 },
+ { 0x3099, 0x30f7 },
+ { 0x3099, 0x30f8 },
+ { 0x3099, 0x30f9 },
+ { 0x3099, 0x30fa },
+ { 0x3099, 0x30fe }
+};
+static const unsigned short compose_second_single[][2] = {
+ { 0x0627, 0x0622 },
+ { 0x0627, 0x0623 },
+ { 0x0627, 0x0625 },
+ { 0x09c7, 0x09cb },
+ { 0x09c7, 0x09cc },
+ { 0x0b47, 0x0b4b },
+ { 0x0b47, 0x0b48 },
+ { 0x0b47, 0x0b4c },
+ { 0x0bc6, 0x0bca },
+ { 0x0bc6, 0x0bcc },
+ { 0x0cc6, 0x0cca },
+ { 0x0cc6, 0x0cc7 },
+ { 0x0cc6, 0x0cc8 },
+ { 0x0d46, 0x0d4a },
+ { 0x0d46, 0x0d4c },
+ { 0x0dd9, 0x0dda },
+ { 0x0dd9, 0x0ddc },
+ { 0x0dd9, 0x0dde }
+};
+static const unsigned short compose_array[146][31] = {
+ { 0x00c0, 0x00c1, 0x00c2, 0x00c3, 0x0100, 0x0102, 0x0226, 0x00c4, 0x1ea2, 0x00c5,      0, 0x01cd, 0x0200, 0x0202,      0,      0,      0, 0x1ea0,      0, 0x1e00,      0,      0, 0x0104,      0,      0,      0,      0,      0,      0,      0,      0 },
+ {      0,      0,      0,      0,      0,      0, 0x1e02,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0, 0x1e04,      0,      0,      0,      0,      0,      0,      0,      0, 0x1e06,      0,      0,      0,      0 },
+ {      0, 0x0106, 0x0108,      0,      0,      0, 0x010a,      0,      0,      0,      0, 0x010c,      0,      0,      0,      0,      0,      0,      0,      0,      0, 0x00c7,      0,      0,      0,      0,      0,      0,      0,      0,      0 },
+ {      0,      0,      0,      0,      0,      0, 0x1e0a,      0,      0,      0,      0, 0x010e,      0,      0,      0,      0,      0, 0x1e0c,      0,      0,      0, 0x1e10,      0, 0x1e12,      0,      0, 0x1e0e,      0,      0,      0,      0 },
+ { 0x00c8, 0x00c9, 0x00ca, 0x1ebc, 0x0112, 0x0114, 0x0116, 0x00cb, 0x1eba,      0,      0, 0x011a, 0x0204, 0x0206,      0,      0,      0, 0x1eb8,      0,      0,      0, 0x0228, 0x0118, 0x1e18,      0, 0x1e1a,      0,      0,      0,      0,      0 },
+ {      0, 0x01f4, 0x011c,      0, 0x1e20, 0x011e, 0x0120,      0,      0,      0,      0, 0x01e6,      0,      0,      0,      0,      0,      0,      0,      0,      0, 0x0122,      0,      0,      0,      0,      0,      0,      0,      0,      0 },
+ {      0,      0, 0x0124,      0,      0,      0, 0x1e22, 0x1e26,      0,      0,      0, 0x021e,      0,      0,      0,      0,      0, 0x1e24,      0,      0,      0, 0x1e28,      0,      0, 0x1e2a,      0,      0,      0,      0,      0,      0 },
+ { 0x00cc, 0x00cd, 0x00ce, 0x0128, 0x012a, 0x012c, 0x0130, 0x00cf, 0x1ec8,      0,      0, 0x01cf, 0x0208, 0x020a,      0,      0,      0, 0x1eca,      0,      0,      0,      0, 0x012e,      0,      0, 0x1e2c,      0,      0,      0,      0,      0 },
+ {      0, 0x1e30,      0,      0,      0,      0,      0,      0,      0,      0,      0, 0x01e8,      0,      0,      0,      0,      0, 0x1e32,      0,      0,      0, 0x0136,      0,      0,      0,      0, 0x1e34,      0,      0,      0,      0 },
+ {      0, 0x0139,      0,      0,      0,      0,      0,      0,      0,      0,      0, 0x013d,      0,      0,      0,      0,      0, 0x1e36,      0,      0,      0, 0x013b,      0, 0x1e3c,      0,      0, 0x1e3a,      0,      0,      0,      0 },
+ {      0, 0x1e3e,      0,      0,      0,      0, 0x1e40,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0, 0x1e42,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0 },
+ { 0x01f8, 0x0143,      0, 0x00d1,      0,      0, 0x1e44,      0,      0,      0,      0, 0x0147,      0,      0,      0,      0,      0, 0x1e46,      0,      0,      0, 0x0145,      0, 0x1e4a,      0,      0, 0x1e48,      0,      0,      0,      0 },
+ { 0x00d2, 0x00d3, 0x00d4, 0x00d5, 0x014c, 0x014e, 0x022e, 0x00d6, 0x1ece,      0, 0x0150, 0x01d1, 0x020c, 0x020e,      0,      0, 0x01a0, 0x1ecc,      0,      0,      0,      0, 0x01ea,      0,      0,      0,      0,      0,      0,      0,      0 },
+ {      0, 0x1e54,      0,      0,      0,      0, 0x1e56,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0 },
+ {      0, 0x0154,      0,      0,      0,      0, 0x1e58,      0,      0,      0,      0, 0x0158, 0x0210, 0x0212,      0,      0,      0, 0x1e5a,      0,      0,      0, 0x0156,      0,      0,      0,      0, 0x1e5e,      0,      0,      0,      0 },
+ {      0, 0x015a, 0x015c,      0,      0,      0, 0x1e60,      0,      0,      0,      0, 0x0160,      0,      0,      0,      0,      0, 0x1e62,      0,      0, 0x0218, 0x015e,      0,      0,      0,      0,      0,      0,      0,      0,      0 },
+ {      0,      0,      0,      0,      0,      0, 0x1e6a,      0,      0,      0,      0, 0x0164,      0,      0,      0,      0,      0, 0x1e6c,      0,      0, 0x021a, 0x0162,      0, 0x1e70,      0,      0, 0x1e6e,      0,      0,      0,      0 },
+ { 0x00d9, 0x00da, 0x00db, 0x0168, 0x016a, 0x016c,      0, 0x00dc, 0x1ee6, 0x016e, 0x0170, 0x01d3, 0x0214, 0x0216,      0,      0, 0x01af, 0x1ee4, 0x1e72,      0,      0,      0, 0x0172, 0x1e76,      0, 0x1e74,      0,      0,      0,      0,      0 },
+ {      0,      0,      0, 0x1e7c,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0, 0x1e7e,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0 },
+ { 0x1e80, 0x1e82, 0x0174,      0,      0,      0, 0x1e86, 0x1e84,      0,      0,      0,      0,      0,      0,      0,      0,      0, 0x1e88,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0 },
+ {      0,      0,      0,      0,      0,      0, 0x1e8a, 0x1e8c,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0 },
+ { 0x1ef2, 0x00dd, 0x0176, 0x1ef8, 0x0232,      0, 0x1e8e, 0x0178, 0x1ef6,      0,      0,      0,      0,      0,      0,      0,      0, 0x1ef4,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0 },
+ {      0, 0x0179, 0x1e90,      0,      0,      0, 0x017b,      0,      0,      0,      0, 0x017d,      0,      0,      0,      0,      0, 0x1e92,      0,      0,      0,      0,      0,      0,      0,      0, 0x1e94,      0,      0,      0,      0 },
+ { 0x00e0, 0x00e1, 0x00e2, 0x00e3, 0x0101, 0x0103, 0x0227, 0x00e4, 0x1ea3, 0x00e5,      0, 0x01ce, 0x0201, 0x0203,      0,      0,      0, 0x1ea1,      0, 0x1e01,      0,      0, 0x0105,      0,      0,      0,      0,      0,      0,      0,      0 },
+ {      0,      0,      0,      0,      0,      0, 0x1e03,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0, 0x1e05,      0,      0,      0,      0,      0,      0,      0,      0, 0x1e07,      0,      0,      0,      0 },
+ {      0, 0x0107, 0x0109,      0,      0,      0, 0x010b,      0,      0,      0,      0, 0x010d,      0,      0,      0,      0,      0,      0,      0,      0,      0, 0x00e7,      0,      0,      0,      0,      0,      0,      0,      0,      0 },
+ {      0,      0,      0,      0,      0,      0, 0x1e0b,      0,      0,      0,      0, 0x010f,      0,      0,      0,      0,      0, 0x1e0d,      0,      0,      0, 0x1e11,      0, 0x1e13,      0,      0, 0x1e0f,      0,      0,      0,      0 },
+ { 0x00e8, 0x00e9, 0x00ea, 0x1ebd, 0x0113, 0x0115, 0x0117, 0x00eb, 0x1ebb,      0,      0, 0x011b, 0x0205, 0x0207,      0,      0,      0, 0x1eb9,      0,      0,      0, 0x0229, 0x0119, 0x1e19,      0, 0x1e1b,      0,      0,      0,      0,      0 },
+ {      0, 0x01f5, 0x011d,      0, 0x1e21, 0x011f, 0x0121,      0,      0,      0,      0, 0x01e7,      0,      0,      0,      0,      0,      0,      0,      0,      0, 0x0123,      0,      0,      0,      0,      0,      0,      0,      0,      0 },
+ {      0,      0, 0x0125,      0,      0,      0, 0x1e23, 0x1e27,      0,      0,      0, 0x021f,      0,      0,      0,      0,      0, 0x1e25,      0,      0,      0, 0x1e29,      0,      0, 0x1e2b,      0, 0x1e96,      0,      0,      0,      0 },
+ { 0x00ec, 0x00ed, 0x00ee, 0x0129, 0x012b, 0x012d,      0, 0x00ef, 0x1ec9,      0,      0, 0x01d0, 0x0209, 0x020b,      0,      0,      0, 0x1ecb,      0,      0,      0,      0, 0x012f,      0,      0, 0x1e2d,      0,      0,      0,      0,      0 },
+ {      0,      0, 0x0135,      0,      0,      0,      0,      0,      0,      0,      0, 0x01f0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0 },
+ {      0, 0x1e31,      0,      0,      0,      0,      0,      0,      0,      0,      0, 0x01e9,      0,      0,      0,      0,      0, 0x1e33,      0,      0,      0, 0x0137,      0,      0,      0,      0, 0x1e35,      0,      0,      0,      0 },
+ {      0, 0x013a,      0,      0,      0,      0,      0,      0,      0,      0,      0, 0x013e,      0,      0,      0,      0,      0, 0x1e37,      0,      0,      0, 0x013c,      0, 0x1e3d,      0,      0, 0x1e3b,      0,      0,      0,      0 },
+ {      0, 0x1e3f,      0,      0,      0,      0, 0x1e41,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0, 0x1e43,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0 },
+ { 0x01f9, 0x0144,      0, 0x00f1,      0,      0, 0x1e45,      0,      0,      0,      0, 0x0148,      0,      0,      0,      0,      0, 0x1e47,      0,      0,      0, 0x0146,      0, 0x1e4b,      0,      0, 0x1e49,      0,      0,      0,      0 },
+ { 0x00f2, 0x00f3, 0x00f4, 0x00f5, 0x014d, 0x014f, 0x022f, 0x00f6, 0x1ecf,      0, 0x0151, 0x01d2, 0x020d, 0x020f,      0,      0, 0x01a1, 0x1ecd,      0,      0,      0,      0, 0x01eb,      0,      0,      0,      0,      0,      0,      0,      0 },
+ {      0, 0x1e55,      0,      0,      0,      0, 0x1e57,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0 },
+ {      0, 0x0155,      0,      0,      0,      0, 0x1e59,      0,      0,      0,      0, 0x0159, 0x0211, 0x0213,      0,      0,      0, 0x1e5b,      0,      0,      0, 0x0157,      0,      0,      0,      0, 0x1e5f,      0,      0,      0,      0 },
+ {      0, 0x015b, 0x015d,      0,      0,      0, 0x1e61,      0,      0,      0,      0, 0x0161,      0,      0,      0,      0,      0, 0x1e63,      0,      0, 0x0219, 0x015f,      0,      0,      0,      0,      0,      0,      0,      0,      0 },
+ {      0,      0,      0,      0,      0,      0, 0x1e6b, 0x1e97,      0,      0,      0, 0x0165,      0,      0,      0,      0,      0, 0x1e6d,      0,      0, 0x021b, 0x0163,      0, 0x1e71,      0,      0, 0x1e6f,      0,      0,      0,      0 },
+ { 0x00f9, 0x00fa, 0x00fb, 0x0169, 0x016b, 0x016d,      0, 0x00fc, 0x1ee7, 0x016f, 0x0171, 0x01d4, 0x0215, 0x0217,      0,      0, 0x01b0, 0x1ee5, 0x1e73,      0,      0,      0, 0x0173, 0x1e77,      0, 0x1e75,      0,      0,      0,      0,      0 },
+ {      0,      0,      0, 0x1e7d,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0, 0x1e7f,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0 },
+ { 0x1e81, 0x1e83, 0x0175,      0,      0,      0, 0x1e87, 0x1e85,      0, 0x1e98,      0,      0,      0,      0,      0,      0,      0, 0x1e89,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0 },
+ {      0,      0,      0,      0,      0,      0, 0x1e8b, 0x1e8d,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0 },
+ { 0x1ef3, 0x00fd, 0x0177, 0x1ef9, 0x0233,      0, 0x1e8f, 0x00ff, 0x1ef7, 0x1e99,      0,      0,      0,      0,      0,      0,      0, 0x1ef5,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0 },
+ {      0, 0x017a, 0x1e91,      0,      0,      0, 0x017c,      0,      0,      0,      0, 0x017e,      0,      0,      0,      0,      0, 0x1e93,      0,      0,      0,      0,      0,      0,      0,      0, 0x1e95,      0,      0,      0,      0 },
+ { 0x1fed, 0x0385,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0, 0x1fc1,      0,      0,      0 },
+ { 0x1ea6, 0x1ea4,      0, 0x1eaa,      0,      0,      0,      0, 0x1ea8,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0 },
+ {      0, 0x01fc,      0,      0, 0x01e2,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0 },
+ { 0x1ec0, 0x1ebe,      0, 0x1ec4,      0,      0,      0,      0, 0x1ec2,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0 },
+ { 0x1ed2, 0x1ed0,      0, 0x1ed6,      0,      0,      0,      0, 0x1ed4,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0 },
+ {      0, 0x1e4c,      0,      0, 0x022c,      0,      0, 0x1e4e,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0 },
+ { 0x01db, 0x01d7,      0,      0, 0x01d5,      0,      0,      0,      0,      0,      0, 0x01d9,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0 },
+ { 0x1ea7, 0x1ea5,      0, 0x1eab,      0,      0,      0,      0, 0x1ea9,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0 },
+ {      0, 0x01fd,      0,      0, 0x01e3,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0 },
+ { 0x1ec1, 0x1ebf,      0, 0x1ec5,      0,      0,      0,      0, 0x1ec3,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0 },
+ { 0x1ed3, 0x1ed1,      0, 0x1ed7,      0,      0,      0,      0, 0x1ed5,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0 },
+ {      0, 0x1e4d,      0,      0, 0x022d,      0,      0, 0x1e4f,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0 },
+ { 0x01dc, 0x01d8,      0,      0, 0x01d6,      0,      0,      0,      0,      0,      0, 0x01da,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0 },
+ { 0x1eb0, 0x1eae,      0, 0x1eb4,      0,      0,      0,      0, 0x1eb2,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0 },
+ { 0x1eb1, 0x1eaf,      0, 0x1eb5,      0,      0,      0,      0, 0x1eb3,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0 },
+ { 0x1e14, 0x1e16,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0 },
+ { 0x1e15, 0x1e17,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0 },
+ { 0x1e50, 0x1e52,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0 },
+ { 0x1e51, 0x1e53,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0 },
+ { 0x1edc, 0x1eda,      0, 0x1ee0,      0,      0,      0,      0, 0x1ede,      0,      0,      0,      0,      0,      0,      0,      0, 0x1ee2,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0 },
+ { 0x1edd, 0x1edb,      0, 0x1ee1,      0,      0,      0,      0, 0x1edf,      0,      0,      0,      0,      0,      0,      0,      0, 0x1ee3,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0 },
+ { 0x1eea, 0x1ee8,      0, 0x1eee,      0,      0,      0,      0, 0x1eec,      0,      0,      0,      0,      0,      0,      0,      0, 0x1ef0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0 },
+ { 0x1eeb, 0x1ee9,      0, 0x1eef,      0,      0,      0,      0, 0x1eed,      0,      0,      0,      0,      0,      0,      0,      0, 0x1ef1,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0 },
+ { 0x1fba, 0x0386,      0,      0, 0x1fb9, 0x1fb8,      0,      0,      0,      0,      0,      0,      0,      0, 0x1f08, 0x1f09,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0, 0x1fbc,      0,      0 },
+ { 0x1fc8, 0x0388,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0, 0x1f18, 0x1f19,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0 },
+ { 0x1fca, 0x0389,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0, 0x1f28, 0x1f29,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0, 0x1fcc,      0,      0 },
+ { 0x1fda, 0x038a,      0,      0, 0x1fd9, 0x1fd8,      0, 0x03aa,      0,      0,      0,      0,      0,      0, 0x1f38, 0x1f39,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0 },
+ { 0x1ff8, 0x038c,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0, 0x1f48, 0x1f49,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0 },
+ { 0x1fea, 0x038e,      0,      0, 0x1fe9, 0x1fe8,      0, 0x03ab,      0,      0,      0,      0,      0,      0,      0, 0x1f59,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0 },
+ { 0x1ffa, 0x038f,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0, 0x1f68, 0x1f69,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0, 0x1ffc,      0,      0 },
+ { 0x1f70, 0x03ac,      0,      0, 0x1fb1, 0x1fb0,      0,      0,      0,      0,      0,      0,      0,      0, 0x1f00, 0x1f01,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0, 0x1fb6, 0x1fb3,      0,      0 },
+ { 0x1f72, 0x03ad,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0, 0x1f10, 0x1f11,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0 },
+ { 0x1f74, 0x03ae,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0, 0x1f20, 0x1f21,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0, 0x1fc6, 0x1fc3,      0,      0 },
+ { 0x1f76, 0x03af,      0,      0, 0x1fd1, 0x1fd0,      0, 0x03ca,      0,      0,      0,      0,      0,      0, 0x1f30, 0x1f31,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0, 0x1fd6,      0,      0,      0 },
+ { 0x1f78, 0x03cc,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0, 0x1f40, 0x1f41,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0 },
+ {      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0, 0x1fe4, 0x1fe5,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0 },
+ { 0x1f7a, 0x03cd,      0,      0, 0x1fe1, 0x1fe0,      0, 0x03cb,      0,      0,      0,      0,      0,      0, 0x1f50, 0x1f51,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0, 0x1fe6,      0,      0,      0 },
+ { 0x1f7c, 0x03ce,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0, 0x1f60, 0x1f61,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0, 0x1ff6, 0x1ff3,      0,      0 },
+ { 0x1fd2, 0x0390,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0, 0x1fd7,      0,      0,      0 },
+ { 0x1fe2, 0x03b0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0, 0x1fe7,      0,      0,      0 },
+ {      0, 0x03d3,      0,      0,      0,      0,      0, 0x03d4,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0 },
+ {      0,      0,      0,      0,      0, 0x04d0,      0, 0x04d2,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0 },
+ { 0x0400,      0,      0,      0,      0, 0x04d6,      0, 0x0401,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0 },
+ {      0,      0,      0,      0,      0, 0x04c1,      0, 0x04dc,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0 },
+ { 0x040d,      0,      0,      0, 0x04e2, 0x0419,      0, 0x04e4,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0 },
+ {      0,      0,      0,      0, 0x04ee, 0x040e,      0, 0x04f0,      0,      0, 0x04f2,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0 },
+ {      0,      0,      0,      0,      0, 0x04d1,      0, 0x04d3,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0 },
+ { 0x0450,      0,      0,      0,      0, 0x04d7,      0, 0x0451,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0 },
+ {      0,      0,      0,      0,      0, 0x04c2,      0, 0x04dd,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0 },
+ { 0x045d,      0,      0,      0, 0x04e3, 0x0439,      0, 0x04e5,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0 },
+ {      0,      0,      0,      0, 0x04ef, 0x045e,      0, 0x04f1,      0,      0, 0x04f3,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0 },
+ {      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0 },
+ {      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0 },
+ {      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0 },
+ {      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0 },
+ {      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0 },
+ {      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0 },
+ {      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0 },
+ {      0,      0, 0x1eac,      0,      0, 0x1eb6,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0 },
+ {      0,      0, 0x1ead,      0,      0, 0x1eb7,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0 },
+ { 0x1f02, 0x1f04,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0, 0x1f06, 0x1f80,      0,      0 },
+ { 0x1f03, 0x1f05,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0, 0x1f07, 0x1f81,      0,      0 },
+ { 0x1f0a, 0x1f0c,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0, 0x1f0e, 0x1f88,      0,      0 },
+ { 0x1f0b, 0x1f0d,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0, 0x1f0f, 0x1f89,      0,      0 },
+ { 0x1f12, 0x1f14,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0 },
+ { 0x1f13, 0x1f15,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0 },
+ { 0x1f1a, 0x1f1c,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0 },
+ { 0x1f1b, 0x1f1d,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0 },
+ { 0x1f22, 0x1f24,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0, 0x1f26, 0x1f90,      0,      0 },
+ { 0x1f23, 0x1f25,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0, 0x1f27, 0x1f91,      0,      0 },
+ { 0x1f2a, 0x1f2c,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0, 0x1f2e, 0x1f98,      0,      0 },
+ { 0x1f2b, 0x1f2d,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0, 0x1f2f, 0x1f99,      0,      0 },
+ { 0x1f32, 0x1f34,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0, 0x1f36,      0,      0,      0 },
+ { 0x1f33, 0x1f35,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0, 0x1f37,      0,      0,      0 },
+ { 0x1f3a, 0x1f3c,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0, 0x1f3e,      0,      0,      0 },
+ { 0x1f3b, 0x1f3d,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0, 0x1f3f,      0,      0,      0 },
+ { 0x1f42, 0x1f44,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0 },
+ { 0x1f43, 0x1f45,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0 },
+ { 0x1f4a, 0x1f4c,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0 },
+ { 0x1f4b, 0x1f4d,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0 },
+ { 0x1f52, 0x1f54,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0, 0x1f56,      0,      0,      0 },
+ { 0x1f53, 0x1f55,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0, 0x1f57,      0,      0,      0 },
+ { 0x1f5b, 0x1f5d,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0, 0x1f5f,      0,      0,      0 },
+ { 0x1f62, 0x1f64,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0, 0x1f66, 0x1fa0,      0,      0 },
+ { 0x1f63, 0x1f65,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0, 0x1f67, 0x1fa1,      0,      0 },
+ { 0x1f6a, 0x1f6c,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0, 0x1f6e, 0x1fa8,      0,      0 },
+ { 0x1f6b, 0x1f6d,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0, 0x1f6f, 0x1fa9,      0,      0 },
+ { 0x1fcd, 0x1fce,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0, 0x1fcf,      0,      0,      0 },
+ { 0x1fdd, 0x1fde,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0, 0x1fdf,      0,      0,      0 },
+ {      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0, 0x3070, 0x3071 },
+ {      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0, 0x3073, 0x3074 },
+ {      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0, 0x3076, 0x3077 },
+ {      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0, 0x3079, 0x307a },
+ {      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0, 0x307c, 0x307d },
+ {      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0, 0x30d0, 0x30d1 },
+ {      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0, 0x30d3, 0x30d4 },
+ {      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0, 0x30d6, 0x30d7 },
+ {      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0, 0x30d9, 0x30da },
+ {      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0, 0x30dc, 0x30dd }
+};
diff --git a/poppler/UnicodeDecompTables.h b/poppler/UnicodeDecompTables.h
new file mode 100644 (file)
index 0000000..4bc34b1
--- /dev/null
@@ -0,0 +1,8526 @@
+// Generated by gen-unicode-tables.py
+
+typedef struct {
+  Unicode character;
+  int length;
+  int offset;
+} decomposition;
+
+#define DECOMP_TABLE_LENGTH 5143
+
+static const decomposition decomp_table[] = {
+  { 0xa0, 1, 0 }, 
+  { 0xa8, 2, 1 }, 
+  { 0xaa, 1, 3 }, 
+  { 0xaf, 2, 4 }, 
+  { 0xb2, 1, 6 }, 
+  { 0xb3, 1, 7 }, 
+  { 0xb4, 2, 8 }, 
+  { 0xb5, 1, 10 }, 
+  { 0xb8, 2, 11 }, 
+  { 0xb9, 1, 13 }, 
+  { 0xba, 1, 14 }, 
+  { 0xbc, 3, 15 }, 
+  { 0xbd, 3, 18 }, 
+  { 0xbe, 3, 21 }, 
+  { 0xc0, 2, 24 }, 
+  { 0xc1, 2, 26 }, 
+  { 0xc2, 2, 28 }, 
+  { 0xc3, 2, 30 }, 
+  { 0xc4, 2, 32 }, 
+  { 0xc5, 2, 34 }, 
+  { 0xc7, 2, 36 }, 
+  { 0xc8, 2, 38 }, 
+  { 0xc9, 2, 40 }, 
+  { 0xca, 2, 42 }, 
+  { 0xcb, 2, 44 }, 
+  { 0xcc, 2, 46 }, 
+  { 0xcd, 2, 48 }, 
+  { 0xce, 2, 50 }, 
+  { 0xcf, 2, 52 }, 
+  { 0xd1, 2, 54 }, 
+  { 0xd2, 2, 56 }, 
+  { 0xd3, 2, 58 }, 
+  { 0xd4, 2, 60 }, 
+  { 0xd5, 2, 62 }, 
+  { 0xd6, 2, 64 }, 
+  { 0xd9, 2, 66 }, 
+  { 0xda, 2, 68 }, 
+  { 0xdb, 2, 70 }, 
+  { 0xdc, 2, 72 }, 
+  { 0xdd, 2, 74 }, 
+  { 0xe0, 2, 76 }, 
+  { 0xe1, 2, 78 }, 
+  { 0xe2, 2, 80 }, 
+  { 0xe3, 2, 82 }, 
+  { 0xe4, 2, 84 }, 
+  { 0xe5, 2, 86 }, 
+  { 0xe7, 2, 88 }, 
+  { 0xe8, 2, 90 }, 
+  { 0xe9, 2, 92 }, 
+  { 0xea, 2, 94 }, 
+  { 0xeb, 2, 96 }, 
+  { 0xec, 2, 98 }, 
+  { 0xed, 2, 100 }, 
+  { 0xee, 2, 102 }, 
+  { 0xef, 2, 104 }, 
+  { 0xf1, 2, 106 }, 
+  { 0xf2, 2, 108 }, 
+  { 0xf3, 2, 110 }, 
+  { 0xf4, 2, 112 }, 
+  { 0xf5, 2, 114 }, 
+  { 0xf6, 2, 116 }, 
+  { 0xf9, 2, 118 }, 
+  { 0xfa, 2, 120 }, 
+  { 0xfb, 2, 122 }, 
+  { 0xfc, 2, 124 }, 
+  { 0xfd, 2, 126 }, 
+  { 0xff, 2, 128 }, 
+  { 0x100, 2, 130 }, 
+  { 0x101, 2, 132 }, 
+  { 0x102, 2, 134 }, 
+  { 0x103, 2, 136 }, 
+  { 0x104, 2, 138 }, 
+  { 0x105, 2, 140 }, 
+  { 0x106, 2, 142 }, 
+  { 0x107, 2, 144 }, 
+  { 0x108, 2, 146 }, 
+  { 0x109, 2, 148 }, 
+  { 0x10a, 2, 150 }, 
+  { 0x10b, 2, 152 }, 
+  { 0x10c, 2, 154 }, 
+  { 0x10d, 2, 156 }, 
+  { 0x10e, 2, 158 }, 
+  { 0x10f, 2, 160 }, 
+  { 0x112, 2, 162 }, 
+  { 0x113, 2, 164 }, 
+  { 0x114, 2, 166 }, 
+  { 0x115, 2, 168 }, 
+  { 0x116, 2, 170 }, 
+  { 0x117, 2, 172 }, 
+  { 0x118, 2, 174 }, 
+  { 0x119, 2, 176 }, 
+  { 0x11a, 2, 178 }, 
+  { 0x11b, 2, 180 }, 
+  { 0x11c, 2, 182 }, 
+  { 0x11d, 2, 184 }, 
+  { 0x11e, 2, 186 }, 
+  { 0x11f, 2, 188 }, 
+  { 0x120, 2, 190 }, 
+  { 0x121, 2, 192 }, 
+  { 0x122, 2, 194 }, 
+  { 0x123, 2, 196 }, 
+  { 0x124, 2, 198 }, 
+  { 0x125, 2, 200 }, 
+  { 0x128, 2, 202 }, 
+  { 0x129, 2, 204 }, 
+  { 0x12a, 2, 206 }, 
+  { 0x12b, 2, 208 }, 
+  { 0x12c, 2, 210 }, 
+  { 0x12d, 2, 212 }, 
+  { 0x12e, 2, 214 }, 
+  { 0x12f, 2, 216 }, 
+  { 0x130, 2, 218 }, 
+  { 0x132, 2, 220 }, 
+  { 0x133, 2, 222 }, 
+  { 0x134, 2, 224 }, 
+  { 0x135, 2, 226 }, 
+  { 0x136, 2, 228 }, 
+  { 0x137, 2, 230 }, 
+  { 0x139, 2, 232 }, 
+  { 0x13a, 2, 234 }, 
+  { 0x13b, 2, 236 }, 
+  { 0x13c, 2, 238 }, 
+  { 0x13d, 2, 240 }, 
+  { 0x13e, 2, 242 }, 
+  { 0x13f, 2, 244 }, 
+  { 0x140, 2, 246 }, 
+  { 0x143, 2, 248 }, 
+  { 0x144, 2, 250 }, 
+  { 0x145, 2, 252 }, 
+  { 0x146, 2, 254 }, 
+  { 0x147, 2, 256 }, 
+  { 0x148, 2, 258 }, 
+  { 0x149, 2, 260 }, 
+  { 0x14c, 2, 262 }, 
+  { 0x14d, 2, 264 }, 
+  { 0x14e, 2, 266 }, 
+  { 0x14f, 2, 268 }, 
+  { 0x150, 2, 270 }, 
+  { 0x151, 2, 272 }, 
+  { 0x154, 2, 274 }, 
+  { 0x155, 2, 276 }, 
+  { 0x156, 2, 278 }, 
+  { 0x157, 2, 280 }, 
+  { 0x158, 2, 282 }, 
+  { 0x159, 2, 284 }, 
+  { 0x15a, 2, 286 }, 
+  { 0x15b, 2, 288 }, 
+  { 0x15c, 2, 290 }, 
+  { 0x15d, 2, 292 }, 
+  { 0x15e, 2, 294 }, 
+  { 0x15f, 2, 296 }, 
+  { 0x160, 2, 298 }, 
+  { 0x161, 2, 300 }, 
+  { 0x162, 2, 302 }, 
+  { 0x163, 2, 304 }, 
+  { 0x164, 2, 306 }, 
+  { 0x165, 2, 308 }, 
+  { 0x168, 2, 310 }, 
+  { 0x169, 2, 312 }, 
+  { 0x16a, 2, 314 }, 
+  { 0x16b, 2, 316 }, 
+  { 0x16c, 2, 318 }, 
+  { 0x16d, 2, 320 }, 
+  { 0x16e, 2, 322 }, 
+  { 0x16f, 2, 324 }, 
+  { 0x170, 2, 326 }, 
+  { 0x171, 2, 328 }, 
+  { 0x172, 2, 330 }, 
+  { 0x173, 2, 332 }, 
+  { 0x174, 2, 334 }, 
+  { 0x175, 2, 336 }, 
+  { 0x176, 2, 338 }, 
+  { 0x177, 2, 340 }, 
+  { 0x178, 2, 342 }, 
+  { 0x179, 2, 344 }, 
+  { 0x17a, 2, 346 }, 
+  { 0x17b, 2, 348 }, 
+  { 0x17c, 2, 350 }, 
+  { 0x17d, 2, 352 }, 
+  { 0x17e, 2, 354 }, 
+  { 0x17f, 1, 356 }, 
+  { 0x1a0, 2, 357 }, 
+  { 0x1a1, 2, 359 }, 
+  { 0x1af, 2, 361 }, 
+  { 0x1b0, 2, 363 }, 
+  { 0x1c4, 3, 365 }, 
+  { 0x1c5, 3, 368 }, 
+  { 0x1c6, 3, 371 }, 
+  { 0x1c7, 2, 374 }, 
+  { 0x1c8, 2, 376 }, 
+  { 0x1c9, 2, 378 }, 
+  { 0x1ca, 2, 380 }, 
+  { 0x1cb, 2, 382 }, 
+  { 0x1cc, 2, 384 }, 
+  { 0x1cd, 2, 386 }, 
+  { 0x1ce, 2, 388 }, 
+  { 0x1cf, 2, 390 }, 
+  { 0x1d0, 2, 392 }, 
+  { 0x1d1, 2, 394 }, 
+  { 0x1d2, 2, 396 }, 
+  { 0x1d3, 2, 398 }, 
+  { 0x1d4, 2, 400 }, 
+  { 0x1d5, 3, 402 }, 
+  { 0x1d6, 3, 405 }, 
+  { 0x1d7, 3, 408 }, 
+  { 0x1d8, 3, 411 }, 
+  { 0x1d9, 3, 414 }, 
+  { 0x1da, 3, 417 }, 
+  { 0x1db, 3, 420 }, 
+  { 0x1dc, 3, 423 }, 
+  { 0x1de, 3, 426 }, 
+  { 0x1df, 3, 429 }, 
+  { 0x1e0, 3, 432 }, 
+  { 0x1e1, 3, 435 }, 
+  { 0x1e2, 2, 438 }, 
+  { 0x1e3, 2, 440 }, 
+  { 0x1e6, 2, 442 }, 
+  { 0x1e7, 2, 444 }, 
+  { 0x1e8, 2, 446 }, 
+  { 0x1e9, 2, 448 }, 
+  { 0x1ea, 2, 450 }, 
+  { 0x1eb, 2, 452 }, 
+  { 0x1ec, 3, 454 }, 
+  { 0x1ed, 3, 457 }, 
+  { 0x1ee, 2, 460 }, 
+  { 0x1ef, 2, 462 }, 
+  { 0x1f0, 2, 464 }, 
+  { 0x1f1, 2, 466 }, 
+  { 0x1f2, 2, 468 }, 
+  { 0x1f3, 2, 470 }, 
+  { 0x1f4, 2, 472 }, 
+  { 0x1f5, 2, 474 }, 
+  { 0x1f8, 2, 476 }, 
+  { 0x1f9, 2, 478 }, 
+  { 0x1fa, 3, 480 }, 
+  { 0x1fb, 3, 483 }, 
+  { 0x1fc, 2, 486 }, 
+  { 0x1fd, 2, 488 }, 
+  { 0x1fe, 2, 490 }, 
+  { 0x1ff, 2, 492 }, 
+  { 0x200, 2, 494 }, 
+  { 0x201, 2, 496 }, 
+  { 0x202, 2, 498 }, 
+  { 0x203, 2, 500 }, 
+  { 0x204, 2, 502 }, 
+  { 0x205, 2, 504 }, 
+  { 0x206, 2, 506 }, 
+  { 0x207, 2, 508 }, 
+  { 0x208, 2, 510 }, 
+  { 0x209, 2, 512 }, 
+  { 0x20a, 2, 514 }, 
+  { 0x20b, 2, 516 }, 
+  { 0x20c, 2, 518 }, 
+  { 0x20d, 2, 520 }, 
+  { 0x20e, 2, 522 }, 
+  { 0x20f, 2, 524 }, 
+  { 0x210, 2, 526 }, 
+  { 0x211, 2, 528 }, 
+  { 0x212, 2, 530 }, 
+  { 0x213, 2, 532 }, 
+  { 0x214, 2, 534 }, 
+  { 0x215, 2, 536 }, 
+  { 0x216, 2, 538 }, 
+  { 0x217, 2, 540 }, 
+  { 0x218, 2, 542 }, 
+  { 0x219, 2, 544 }, 
+  { 0x21a, 2, 546 }, 
+  { 0x21b, 2, 548 }, 
+  { 0x21e, 2, 550 }, 
+  { 0x21f, 2, 552 }, 
+  { 0x226, 2, 554 }, 
+  { 0x227, 2, 556 }, 
+  { 0x228, 2, 558 }, 
+  { 0x229, 2, 560 }, 
+  { 0x22a, 3, 562 }, 
+  { 0x22b, 3, 565 }, 
+  { 0x22c, 3, 568 }, 
+  { 0x22d, 3, 571 }, 
+  { 0x22e, 2, 574 }, 
+  { 0x22f, 2, 576 }, 
+  { 0x230, 3, 578 }, 
+  { 0x231, 3, 581 }, 
+  { 0x232, 2, 584 }, 
+  { 0x233, 2, 586 }, 
+  { 0x2b0, 1, 588 }, 
+  { 0x2b1, 1, 589 }, 
+  { 0x2b2, 1, 590 }, 
+  { 0x2b3, 1, 591 }, 
+  { 0x2b4, 1, 592 }, 
+  { 0x2b5, 1, 593 }, 
+  { 0x2b6, 1, 594 }, 
+  { 0x2b7, 1, 595 }, 
+  { 0x2b8, 1, 596 }, 
+  { 0x2d8, 2, 597 }, 
+  { 0x2d9, 2, 599 }, 
+  { 0x2da, 2, 601 }, 
+  { 0x2db, 2, 603 }, 
+  { 0x2dc, 2, 605 }, 
+  { 0x2dd, 2, 607 }, 
+  { 0x2e0, 1, 609 }, 
+  { 0x2e1, 1, 610 }, 
+  { 0x2e2, 1, 356 }, 
+  { 0x2e3, 1, 611 }, 
+  { 0x2e4, 1, 612 }, 
+  { 0x340, 1, 613 }, 
+  { 0x341, 1, 614 }, 
+  { 0x343, 1, 615 }, 
+  { 0x344, 2, 616 }, 
+  { 0x374, 1, 618 }, 
+  { 0x37a, 2, 619 }, 
+  { 0x37e, 1, 621 }, 
+  { 0x384, 2, 8 }, 
+  { 0x385, 3, 622 }, 
+  { 0x386, 2, 625 }, 
+  { 0x387, 1, 627 }, 
+  { 0x388, 2, 628 }, 
+  { 0x389, 2, 630 }, 
+  { 0x38a, 2, 632 }, 
+  { 0x38c, 2, 634 }, 
+  { 0x38e, 2, 636 }, 
+  { 0x38f, 2, 638 }, 
+  { 0x390, 3, 640 }, 
+  { 0x3aa, 2, 643 }, 
+  { 0x3ab, 2, 645 }, 
+  { 0x3ac, 2, 647 }, 
+  { 0x3ad, 2, 649 }, 
+  { 0x3ae, 2, 651 }, 
+  { 0x3af, 2, 653 }, 
+  { 0x3b0, 3, 655 }, 
+  { 0x3ca, 2, 658 }, 
+  { 0x3cb, 2, 660 }, 
+  { 0x3cc, 2, 662 }, 
+  { 0x3cd, 2, 664 }, 
+  { 0x3ce, 2, 666 }, 
+  { 0x3d0, 1, 668 }, 
+  { 0x3d1, 1, 669 }, 
+  { 0x3d2, 1, 670 }, 
+  { 0x3d3, 2, 636 }, 
+  { 0x3d4, 2, 645 }, 
+  { 0x3d5, 1, 671 }, 
+  { 0x3d6, 1, 672 }, 
+  { 0x3f0, 1, 673 }, 
+  { 0x3f1, 1, 674 }, 
+  { 0x3f2, 1, 675 }, 
+  { 0x3f4, 1, 676 }, 
+  { 0x3f5, 1, 677 }, 
+  { 0x400, 2, 678 }, 
+  { 0x401, 2, 680 }, 
+  { 0x403, 2, 682 }, 
+  { 0x407, 2, 684 }, 
+  { 0x40c, 2, 686 }, 
+  { 0x40d, 2, 688 }, 
+  { 0x40e, 2, 690 }, 
+  { 0x419, 2, 692 }, 
+  { 0x439, 2, 694 }, 
+  { 0x450, 2, 696 }, 
+  { 0x451, 2, 698 }, 
+  { 0x453, 2, 700 }, 
+  { 0x457, 2, 702 }, 
+  { 0x45c, 2, 704 }, 
+  { 0x45d, 2, 706 }, 
+  { 0x45e, 2, 708 }, 
+  { 0x476, 2, 710 }, 
+  { 0x477, 2, 712 }, 
+  { 0x4c1, 2, 714 }, 
+  { 0x4c2, 2, 716 }, 
+  { 0x4d0, 2, 718 }, 
+  { 0x4d1, 2, 720 }, 
+  { 0x4d2, 2, 722 }, 
+  { 0x4d3, 2, 724 }, 
+  { 0x4d6, 2, 726 }, 
+  { 0x4d7, 2, 728 }, 
+  { 0x4da, 2, 730 }, 
+  { 0x4db, 2, 732 }, 
+  { 0x4dc, 2, 734 }, 
+  { 0x4dd, 2, 736 }, 
+  { 0x4de, 2, 738 }, 
+  { 0x4df, 2, 740 }, 
+  { 0x4e2, 2, 742 }, 
+  { 0x4e3, 2, 744 }, 
+  { 0x4e4, 2, 746 }, 
+  { 0x4e5, 2, 748 }, 
+  { 0x4e6, 2, 750 }, 
+  { 0x4e7, 2, 752 }, 
+  { 0x4ea, 2, 754 }, 
+  { 0x4eb, 2, 756 }, 
+  { 0x4ec, 2, 758 }, 
+  { 0x4ed, 2, 760 }, 
+  { 0x4ee, 2, 762 }, 
+  { 0x4ef, 2, 764 }, 
+  { 0x4f0, 2, 766 }, 
+  { 0x4f1, 2, 768 }, 
+  { 0x4f2, 2, 770 }, 
+  { 0x4f3, 2, 772 }, 
+  { 0x4f4, 2, 774 }, 
+  { 0x4f5, 2, 776 }, 
+  { 0x4f8, 2, 778 }, 
+  { 0x4f9, 2, 780 }, 
+  { 0x587, 2, 782 }, 
+  { 0x622, 2, 784 }, 
+  { 0x623, 2, 786 }, 
+  { 0x624, 2, 788 }, 
+  { 0x625, 2, 790 }, 
+  { 0x626, 2, 792 }, 
+  { 0x675, 2, 794 }, 
+  { 0x676, 2, 796 }, 
+  { 0x677, 2, 798 }, 
+  { 0x678, 2, 800 }, 
+  { 0x6c0, 2, 802 }, 
+  { 0x6c2, 2, 804 }, 
+  { 0x6d3, 2, 806 }, 
+  { 0x929, 2, 808 }, 
+  { 0x931, 2, 810 }, 
+  { 0x934, 2, 812 }, 
+  { 0x958, 2, 814 }, 
+  { 0x959, 2, 816 }, 
+  { 0x95a, 2, 818 }, 
+  { 0x95b, 2, 820 }, 
+  { 0x95c, 2, 822 }, 
+  { 0x95d, 2, 824 }, 
+  { 0x95e, 2, 826 }, 
+  { 0x95f, 2, 828 }, 
+  { 0x9cb, 2, 830 }, 
+  { 0x9cc, 2, 832 }, 
+  { 0x9dc, 2, 834 }, 
+  { 0x9dd, 2, 836 }, 
+  { 0x9df, 2, 838 }, 
+  { 0xa33, 2, 840 }, 
+  { 0xa36, 2, 842 }, 
+  { 0xa59, 2, 844 }, 
+  { 0xa5a, 2, 846 }, 
+  { 0xa5b, 2, 848 }, 
+  { 0xa5e, 2, 850 }, 
+  { 0xb48, 2, 852 }, 
+  { 0xb4b, 2, 854 }, 
+  { 0xb4c, 2, 856 }, 
+  { 0xb5c, 2, 858 }, 
+  { 0xb5d, 2, 860 }, 
+  { 0xb94, 2, 862 }, 
+  { 0xbca, 2, 864 }, 
+  { 0xbcb, 2, 866 }, 
+  { 0xbcc, 2, 868 }, 
+  { 0xc48, 2, 870 }, 
+  { 0xcc0, 2, 872 }, 
+  { 0xcc7, 2, 874 }, 
+  { 0xcc8, 2, 876 }, 
+  { 0xcca, 2, 878 }, 
+  { 0xccb, 3, 880 }, 
+  { 0xd4a, 2, 883 }, 
+  { 0xd4b, 2, 885 }, 
+  { 0xd4c, 2, 887 }, 
+  { 0xdda, 2, 889 }, 
+  { 0xddc, 2, 891 }, 
+  { 0xddd, 3, 893 }, 
+  { 0xdde, 2, 896 }, 
+  { 0xe33, 2, 898 }, 
+  { 0xeb3, 2, 900 }, 
+  { 0xedc, 2, 902 }, 
+  { 0xedd, 2, 904 }, 
+  { 0xf0c, 1, 906 }, 
+  { 0xf43, 2, 907 }, 
+  { 0xf4d, 2, 909 }, 
+  { 0xf52, 2, 911 }, 
+  { 0xf57, 2, 913 }, 
+  { 0xf5c, 2, 915 }, 
+  { 0xf69, 2, 917 }, 
+  { 0xf73, 2, 919 }, 
+  { 0xf75, 2, 921 }, 
+  { 0xf76, 2, 923 }, 
+  { 0xf77, 3, 925 }, 
+  { 0xf78, 2, 928 }, 
+  { 0xf79, 3, 930 }, 
+  { 0xf81, 2, 933 }, 
+  { 0xf93, 2, 935 }, 
+  { 0xf9d, 2, 937 }, 
+  { 0xfa2, 2, 939 }, 
+  { 0xfa7, 2, 941 }, 
+  { 0xfac, 2, 943 }, 
+  { 0xfb9, 2, 945 }, 
+  { 0x1026, 2, 947 }, 
+  { 0x1e00, 2, 949 }, 
+  { 0x1e01, 2, 951 }, 
+  { 0x1e02, 2, 953 }, 
+  { 0x1e03, 2, 955 }, 
+  { 0x1e04, 2, 957 }, 
+  { 0x1e05, 2, 959 }, 
+  { 0x1e06, 2, 961 }, 
+  { 0x1e07, 2, 963 }, 
+  { 0x1e08, 3, 965 }, 
+  { 0x1e09, 3, 968 }, 
+  { 0x1e0a, 2, 971 }, 
+  { 0x1e0b, 2, 973 }, 
+  { 0x1e0c, 2, 975 }, 
+  { 0x1e0d, 2, 977 }, 
+  { 0x1e0e, 2, 979 }, 
+  { 0x1e0f, 2, 981 }, 
+  { 0x1e10, 2, 983 }, 
+  { 0x1e11, 2, 985 }, 
+  { 0x1e12, 2, 987 }, 
+  { 0x1e13, 2, 989 }, 
+  { 0x1e14, 3, 991 }, 
+  { 0x1e15, 3, 994 }, 
+  { 0x1e16, 3, 997 }, 
+  { 0x1e17, 3, 1000 }, 
+  { 0x1e18, 2, 1003 }, 
+  { 0x1e19, 2, 1005 }, 
+  { 0x1e1a, 2, 1007 }, 
+  { 0x1e1b, 2, 1009 }, 
+  { 0x1e1c, 3, 1011 }, 
+  { 0x1e1d, 3, 1014 }, 
+  { 0x1e1e, 2, 1017 }, 
+  { 0x1e1f, 2, 1019 }, 
+  { 0x1e20, 2, 1021 }, 
+  { 0x1e21, 2, 1023 }, 
+  { 0x1e22, 2, 1025 }, 
+  { 0x1e23, 2, 1027 }, 
+  { 0x1e24, 2, 1029 }, 
+  { 0x1e25, 2, 1031 }, 
+  { 0x1e26, 2, 1033 }, 
+  { 0x1e27, 2, 1035 }, 
+  { 0x1e28, 2, 1037 }, 
+  { 0x1e29, 2, 1039 }, 
+  { 0x1e2a, 2, 1041 }, 
+  { 0x1e2b, 2, 1043 }, 
+  { 0x1e2c, 2, 1045 }, 
+  { 0x1e2d, 2, 1047 }, 
+  { 0x1e2e, 3, 1049 }, 
+  { 0x1e2f, 3, 1052 }, 
+  { 0x1e30, 2, 1055 }, 
+  { 0x1e31, 2, 1057 }, 
+  { 0x1e32, 2, 1059 }, 
+  { 0x1e33, 2, 1061 }, 
+  { 0x1e34, 2, 1063 }, 
+  { 0x1e35, 2, 1065 }, 
+  { 0x1e36, 2, 1067 }, 
+  { 0x1e37, 2, 1069 }, 
+  { 0x1e38, 3, 1071 }, 
+  { 0x1e39, 3, 1074 }, 
+  { 0x1e3a, 2, 1077 }, 
+  { 0x1e3b, 2, 1079 }, 
+  { 0x1e3c, 2, 1081 }, 
+  { 0x1e3d, 2, 1083 }, 
+  { 0x1e3e, 2, 1085 }, 
+  { 0x1e3f, 2, 1087 }, 
+  { 0x1e40, 2, 1089 }, 
+  { 0x1e41, 2, 1091 }, 
+  { 0x1e42, 2, 1093 }, 
+  { 0x1e43, 2, 1095 }, 
+  { 0x1e44, 2, 1097 }, 
+  { 0x1e45, 2, 1099 }, 
+  { 0x1e46, 2, 1101 }, 
+  { 0x1e47, 2, 1103 }, 
+  { 0x1e48, 2, 1105 }, 
+  { 0x1e49, 2, 1107 }, 
+  { 0x1e4a, 2, 1109 }, 
+  { 0x1e4b, 2, 1111 }, 
+  { 0x1e4c, 3, 1113 }, 
+  { 0x1e4d, 3, 1116 }, 
+  { 0x1e4e, 3, 1119 }, 
+  { 0x1e4f, 3, 1122 }, 
+  { 0x1e50, 3, 1125 }, 
+  { 0x1e51, 3, 1128 }, 
+  { 0x1e52, 3, 1131 }, 
+  { 0x1e53, 3, 1134 }, 
+  { 0x1e54, 2, 1137 }, 
+  { 0x1e55, 2, 1139 }, 
+  { 0x1e56, 2, 1141 }, 
+  { 0x1e57, 2, 1143 }, 
+  { 0x1e58, 2, 1145 }, 
+  { 0x1e59, 2, 1147 }, 
+  { 0x1e5a, 2, 1149 }, 
+  { 0x1e5b, 2, 1151 }, 
+  { 0x1e5c, 3, 1153 }, 
+  { 0x1e5d, 3, 1156 }, 
+  { 0x1e5e, 2, 1159 }, 
+  { 0x1e5f, 2, 1161 }, 
+  { 0x1e60, 2, 1163 }, 
+  { 0x1e61, 2, 1165 }, 
+  { 0x1e62, 2, 1167 }, 
+  { 0x1e63, 2, 1169 }, 
+  { 0x1e64, 3, 1171 }, 
+  { 0x1e65, 3, 1174 }, 
+  { 0x1e66, 3, 1177 }, 
+  { 0x1e67, 3, 1180 }, 
+  { 0x1e68, 3, 1183 }, 
+  { 0x1e69, 3, 1186 }, 
+  { 0x1e6a, 2, 1189 }, 
+  { 0x1e6b, 2, 1191 }, 
+  { 0x1e6c, 2, 1193 }, 
+  { 0x1e6d, 2, 1195 }, 
+  { 0x1e6e, 2, 1197 }, 
+  { 0x1e6f, 2, 1199 }, 
+  { 0x1e70, 2, 1201 }, 
+  { 0x1e71, 2, 1203 }, 
+  { 0x1e72, 2, 1205 }, 
+  { 0x1e73, 2, 1207 }, 
+  { 0x1e74, 2, 1209 }, 
+  { 0x1e75, 2, 1211 }, 
+  { 0x1e76, 2, 1213 }, 
+  { 0x1e77, 2, 1215 }, 
+  { 0x1e78, 3, 1217 }, 
+  { 0x1e79, 3, 1220 }, 
+  { 0x1e7a, 3, 1223 }, 
+  { 0x1e7b, 3, 1226 }, 
+  { 0x1e7c, 2, 1229 }, 
+  { 0x1e7d, 2, 1231 }, 
+  { 0x1e7e, 2, 1233 }, 
+  { 0x1e7f, 2, 1235 }, 
+  { 0x1e80, 2, 1237 }, 
+  { 0x1e81, 2, 1239 }, 
+  { 0x1e82, 2, 1241 }, 
+  { 0x1e83, 2, 1243 }, 
+  { 0x1e84, 2, 1245 }, 
+  { 0x1e85, 2, 1247 }, 
+  { 0x1e86, 2, 1249 }, 
+  { 0x1e87, 2, 1251 }, 
+  { 0x1e88, 2, 1253 }, 
+  { 0x1e89, 2, 1255 }, 
+  { 0x1e8a, 2, 1257 }, 
+  { 0x1e8b, 2, 1259 }, 
+  { 0x1e8c, 2, 1261 }, 
+  { 0x1e8d, 2, 1263 }, 
+  { 0x1e8e, 2, 1265 }, 
+  { 0x1e8f, 2, 1267 }, 
+  { 0x1e90, 2, 1269 }, 
+  { 0x1e91, 2, 1271 }, 
+  { 0x1e92, 2, 1273 }, 
+  { 0x1e93, 2, 1275 }, 
+  { 0x1e94, 2, 1277 }, 
+  { 0x1e95, 2, 1279 }, 
+  { 0x1e96, 2, 1281 }, 
+  { 0x1e97, 2, 1283 }, 
+  { 0x1e98, 2, 1285 }, 
+  { 0x1e99, 2, 1287 }, 
+  { 0x1e9a, 2, 1289 }, 
+  { 0x1e9b, 2, 1165 }, 
+  { 0x1ea0, 2, 1291 }, 
+  { 0x1ea1, 2, 1293 }, 
+  { 0x1ea2, 2, 1295 }, 
+  { 0x1ea3, 2, 1297 }, 
+  { 0x1ea4, 3, 1299 }, 
+  { 0x1ea5, 3, 1302 }, 
+  { 0x1ea6, 3, 1305 }, 
+  { 0x1ea7, 3, 1308 }, 
+  { 0x1ea8, 3, 1311 }, 
+  { 0x1ea9, 3, 1314 }, 
+  { 0x1eaa, 3, 1317 }, 
+  { 0x1eab, 3, 1320 }, 
+  { 0x1eac, 3, 1323 }, 
+  { 0x1ead, 3, 1326 }, 
+  { 0x1eae, 3, 1329 }, 
+  { 0x1eaf, 3, 1332 }, 
+  { 0x1eb0, 3, 1335 }, 
+  { 0x1eb1, 3, 1338 }, 
+  { 0x1eb2, 3, 1341 }, 
+  { 0x1eb3, 3, 1344 }, 
+  { 0x1eb4, 3, 1347 }, 
+  { 0x1eb5, 3, 1350 }, 
+  { 0x1eb6, 3, 1353 }, 
+  { 0x1eb7, 3, 1356 }, 
+  { 0x1eb8, 2, 1359 }, 
+  { 0x1eb9, 2, 1361 }, 
+  { 0x1eba, 2, 1363 }, 
+  { 0x1ebb, 2, 1365 }, 
+  { 0x1ebc, 2, 1367 }, 
+  { 0x1ebd, 2, 1369 }, 
+  { 0x1ebe, 3, 1371 }, 
+  { 0x1ebf, 3, 1374 }, 
+  { 0x1ec0, 3, 1377 }, 
+  { 0x1ec1, 3, 1380 }, 
+  { 0x1ec2, 3, 1383 }, 
+  { 0x1ec3, 3, 1386 }, 
+  { 0x1ec4, 3, 1389 }, 
+  { 0x1ec5, 3, 1392 }, 
+  { 0x1ec6, 3, 1395 }, 
+  { 0x1ec7, 3, 1398 }, 
+  { 0x1ec8, 2, 1401 }, 
+  { 0x1ec9, 2, 1403 }, 
+  { 0x1eca, 2, 1405 }, 
+  { 0x1ecb, 2, 1407 }, 
+  { 0x1ecc, 2, 1409 }, 
+  { 0x1ecd, 2, 1411 }, 
+  { 0x1ece, 2, 1413 }, 
+  { 0x1ecf, 2, 1415 }, 
+  { 0x1ed0, 3, 1417 }, 
+  { 0x1ed1, 3, 1420 }, 
+  { 0x1ed2, 3, 1423 }, 
+  { 0x1ed3, 3, 1426 }, 
+  { 0x1ed4, 3, 1429 }, 
+  { 0x1ed5, 3, 1432 }, 
+  { 0x1ed6, 3, 1435 }, 
+  { 0x1ed7, 3, 1438 }, 
+  { 0x1ed8, 3, 1441 }, 
+  { 0x1ed9, 3, 1444 }, 
+  { 0x1eda, 3, 1447 }, 
+  { 0x1edb, 3, 1450 }, 
+  { 0x1edc, 3, 1453 }, 
+  { 0x1edd, 3, 1456 }, 
+  { 0x1ede, 3, 1459 }, 
+  { 0x1edf, 3, 1462 }, 
+  { 0x1ee0, 3, 1465 }, 
+  { 0x1ee1, 3, 1468 }, 
+  { 0x1ee2, 3, 1471 }, 
+  { 0x1ee3, 3, 1474 }, 
+  { 0x1ee4, 2, 1477 }, 
+  { 0x1ee5, 2, 1479 }, 
+  { 0x1ee6, 2, 1481 }, 
+  { 0x1ee7, 2, 1483 }, 
+  { 0x1ee8, 3, 1485 }, 
+  { 0x1ee9, 3, 1488 }, 
+  { 0x1eea, 3, 1491 }, 
+  { 0x1eeb, 3, 1494 }, 
+  { 0x1eec, 3, 1497 }, 
+  { 0x1eed, 3, 1500 }, 
+  { 0x1eee, 3, 1503 }, 
+  { 0x1eef, 3, 1506 }, 
+  { 0x1ef0, 3, 1509 }, 
+  { 0x1ef1, 3, 1512 }, 
+  { 0x1ef2, 2, 1515 }, 
+  { 0x1ef3, 2, 1517 }, 
+  { 0x1ef4, 2, 1519 }, 
+  { 0x1ef5, 2, 1521 }, 
+  { 0x1ef6, 2, 1523 }, 
+  { 0x1ef7, 2, 1525 }, 
+  { 0x1ef8, 2, 1527 }, 
+  { 0x1ef9, 2, 1529 }, 
+  { 0x1f00, 2, 1531 }, 
+  { 0x1f01, 2, 1533 }, 
+  { 0x1f02, 3, 1535 }, 
+  { 0x1f03, 3, 1538 }, 
+  { 0x1f04, 3, 1541 }, 
+  { 0x1f05, 3, 1544 }, 
+  { 0x1f06, 3, 1547 }, 
+  { 0x1f07, 3, 1550 }, 
+  { 0x1f08, 2, 1553 }, 
+  { 0x1f09, 2, 1555 }, 
+  { 0x1f0a, 3, 1557 }, 
+  { 0x1f0b, 3, 1560 }, 
+  { 0x1f0c, 3, 1563 }, 
+  { 0x1f0d, 3, 1566 }, 
+  { 0x1f0e, 3, 1569 }, 
+  { 0x1f0f, 3, 1572 }, 
+  { 0x1f10, 2, 1575 }, 
+  { 0x1f11, 2, 1577 }, 
+  { 0x1f12, 3, 1579 }, 
+  { 0x1f13, 3, 1582 }, 
+  { 0x1f14, 3, 1585 }, 
+  { 0x1f15, 3, 1588 }, 
+  { 0x1f18, 2, 1591 }, 
+  { 0x1f19, 2, 1593 }, 
+  { 0x1f1a, 3, 1595 }, 
+  { 0x1f1b, 3, 1598 }, 
+  { 0x1f1c, 3, 1601 }, 
+  { 0x1f1d, 3, 1604 }, 
+  { 0x1f20, 2, 1607 }, 
+  { 0x1f21, 2, 1609 }, 
+  { 0x1f22, 3, 1611 }, 
+  { 0x1f23, 3, 1614 }, 
+  { 0x1f24, 3, 1617 }, 
+  { 0x1f25, 3, 1620 }, 
+  { 0x1f26, 3, 1623 }, 
+  { 0x1f27, 3, 1626 }, 
+  { 0x1f28, 2, 1629 }, 
+  { 0x1f29, 2, 1631 }, 
+  { 0x1f2a, 3, 1633 }, 
+  { 0x1f2b, 3, 1636 }, 
+  { 0x1f2c, 3, 1639 }, 
+  { 0x1f2d, 3, 1642 }, 
+  { 0x1f2e, 3, 1645 }, 
+  { 0x1f2f, 3, 1648 }, 
+  { 0x1f30, 2, 1651 }, 
+  { 0x1f31, 2, 1653 }, 
+  { 0x1f32, 3, 1655 }, 
+  { 0x1f33, 3, 1658 }, 
+  { 0x1f34, 3, 1661 }, 
+  { 0x1f35, 3, 1664 }, 
+  { 0x1f36, 3, 1667 }, 
+  { 0x1f37, 3, 1670 }, 
+  { 0x1f38, 2, 1673 }, 
+  { 0x1f39, 2, 1675 }, 
+  { 0x1f3a, 3, 1677 }, 
+  { 0x1f3b, 3, 1680 }, 
+  { 0x1f3c, 3, 1683 }, 
+  { 0x1f3d, 3, 1686 }, 
+  { 0x1f3e, 3, 1689 }, 
+  { 0x1f3f, 3, 1692 }, 
+  { 0x1f40, 2, 1695 }, 
+  { 0x1f41, 2, 1697 }, 
+  { 0x1f42, 3, 1699 }, 
+  { 0x1f43, 3, 1702 }, 
+  { 0x1f44, 3, 1705 }, 
+  { 0x1f45, 3, 1708 }, 
+  { 0x1f48, 2, 1711 }, 
+  { 0x1f49, 2, 1713 }, 
+  { 0x1f4a, 3, 1715 }, 
+  { 0x1f4b, 3, 1718 }, 
+  { 0x1f4c, 3, 1721 }, 
+  { 0x1f4d, 3, 1724 }, 
+  { 0x1f50, 2, 1727 }, 
+  { 0x1f51, 2, 1729 }, 
+  { 0x1f52, 3, 1731 }, 
+  { 0x1f53, 3, 1734 }, 
+  { 0x1f54, 3, 1737 }, 
+  { 0x1f55, 3, 1740 }, 
+  { 0x1f56, 3, 1743 }, 
+  { 0x1f57, 3, 1746 }, 
+  { 0x1f59, 2, 1749 }, 
+  { 0x1f5b, 3, 1751 }, 
+  { 0x1f5d, 3, 1754 }, 
+  { 0x1f5f, 3, 1757 }, 
+  { 0x1f60, 2, 1760 }, 
+  { 0x1f61, 2, 1762 }, 
+  { 0x1f62, 3, 1764 }, 
+  { 0x1f63, 3, 1767 }, 
+  { 0x1f64, 3, 1770 }, 
+  { 0x1f65, 3, 1773 }, 
+  { 0x1f66, 3, 1776 }, 
+  { 0x1f67, 3, 1779 }, 
+  { 0x1f68, 2, 1782 }, 
+  { 0x1f69, 2, 1784 }, 
+  { 0x1f6a, 3, 1786 }, 
+  { 0x1f6b, 3, 1789 }, 
+  { 0x1f6c, 3, 1792 }, 
+  { 0x1f6d, 3, 1795 }, 
+  { 0x1f6e, 3, 1798 }, 
+  { 0x1f6f, 3, 1801 }, 
+  { 0x1f70, 2, 1804 }, 
+  { 0x1f71, 2, 647 }, 
+  { 0x1f72, 2, 1806 }, 
+  { 0x1f73, 2, 649 }, 
+  { 0x1f74, 2, 1808 }, 
+  { 0x1f75, 2, 651 }, 
+  { 0x1f76, 2, 1810 }, 
+  { 0x1f77, 2, 653 }, 
+  { 0x1f78, 2, 1812 }, 
+  { 0x1f79, 2, 662 }, 
+  { 0x1f7a, 2, 1814 }, 
+  { 0x1f7b, 2, 664 }, 
+  { 0x1f7c, 2, 1816 }, 
+  { 0x1f7d, 2, 666 }, 
+  { 0x1f80, 3, 1818 }, 
+  { 0x1f81, 3, 1821 }, 
+  { 0x1f82, 4, 1824 }, 
+  { 0x1f83, 4, 1828 }, 
+  { 0x1f84, 4, 1832 }, 
+  { 0x1f85, 4, 1836 }, 
+  { 0x1f86, 4, 1840 }, 
+  { 0x1f87, 4, 1844 }, 
+  { 0x1f88, 3, 1848 }, 
+  { 0x1f89, 3, 1851 }, 
+  { 0x1f8a, 4, 1854 }, 
+  { 0x1f8b, 4, 1858 }, 
+  { 0x1f8c, 4, 1862 }, 
+  { 0x1f8d, 4, 1866 }, 
+  { 0x1f8e, 4, 1870 }, 
+  { 0x1f8f, 4, 1874 }, 
+  { 0x1f90, 3, 1878 }, 
+  { 0x1f91, 3, 1881 }, 
+  { 0x1f92, 4, 1884 }, 
+  { 0x1f93, 4, 1888 }, 
+  { 0x1f94, 4, 1892 }, 
+  { 0x1f95, 4, 1896 }, 
+  { 0x1f96, 4, 1900 }, 
+  { 0x1f97, 4, 1904 }, 
+  { 0x1f98, 3, 1908 }, 
+  { 0x1f99, 3, 1911 }, 
+  { 0x1f9a, 4, 1914 }, 
+  { 0x1f9b, 4, 1918 }, 
+  { 0x1f9c, 4, 1922 }, 
+  { 0x1f9d, 4, 1926 }, 
+  { 0x1f9e, 4, 1930 }, 
+  { 0x1f9f, 4, 1934 }, 
+  { 0x1fa0, 3, 1938 }, 
+  { 0x1fa1, 3, 1941 }, 
+  { 0x1fa2, 4, 1944 }, 
+  { 0x1fa3, 4, 1948 }, 
+  { 0x1fa4, 4, 1952 }, 
+  { 0x1fa5, 4, 1956 }, 
+  { 0x1fa6, 4, 1960 }, 
+  { 0x1fa7, 4, 1964 }, 
+  { 0x1fa8, 3, 1968 }, 
+  { 0x1fa9, 3, 1971 }, 
+  { 0x1faa, 4, 1974 }, 
+  { 0x1fab, 4, 1978 }, 
+  { 0x1fac, 4, 1982 }, 
+  { 0x1fad, 4, 1986 }, 
+  { 0x1fae, 4, 1990 }, 
+  { 0x1faf, 4, 1994 }, 
+  { 0x1fb0, 2, 1998 }, 
+  { 0x1fb1, 2, 2000 }, 
+  { 0x1fb2, 3, 2002 }, 
+  { 0x1fb3, 2, 2005 }, 
+  { 0x1fb4, 3, 2007 }, 
+  { 0x1fb6, 2, 2010 }, 
+  { 0x1fb7, 3, 2012 }, 
+  { 0x1fb8, 2, 2015 }, 
+  { 0x1fb9, 2, 2017 }, 
+  { 0x1fba, 2, 2019 }, 
+  { 0x1fbb, 2, 625 }, 
+  { 0x1fbc, 2, 2021 }, 
+  { 0x1fbd, 2, 2023 }, 
+  { 0x1fbe, 1, 2025 }, 
+  { 0x1fbf, 2, 2023 }, 
+  { 0x1fc0, 2, 2026 }, 
+  { 0x1fc1, 3, 2028 }, 
+  { 0x1fc2, 3, 2031 }, 
+  { 0x1fc3, 2, 2034 }, 
+  { 0x1fc4, 3, 2036 }, 
+  { 0x1fc6, 2, 2039 }, 
+  { 0x1fc7, 3, 2041 }, 
+  { 0x1fc8, 2, 2044 }, 
+  { 0x1fc9, 2, 628 }, 
+  { 0x1fca, 2, 2046 }, 
+  { 0x1fcb, 2, 630 }, 
+  { 0x1fcc, 2, 2048 }, 
+  { 0x1fcd, 3, 2050 }, 
+  { 0x1fce, 3, 2053 }, 
+  { 0x1fcf, 3, 2056 }, 
+  { 0x1fd0, 2, 2059 }, 
+  { 0x1fd1, 2, 2061 }, 
+  { 0x1fd2, 3, 2063 }, 
+  { 0x1fd3, 3, 640 }, 
+  { 0x1fd6, 2, 2066 }, 
+  { 0x1fd7, 3, 2068 }, 
+  { 0x1fd8, 2, 2071 }, 
+  { 0x1fd9, 2, 2073 }, 
+  { 0x1fda, 2, 2075 }, 
+  { 0x1fdb, 2, 632 }, 
+  { 0x1fdd, 3, 2077 }, 
+  { 0x1fde, 3, 2080 }, 
+  { 0x1fdf, 3, 2083 }, 
+  { 0x1fe0, 2, 2086 }, 
+  { 0x1fe1, 2, 2088 }, 
+  { 0x1fe2, 3, 2090 }, 
+  { 0x1fe3, 3, 655 }, 
+  { 0x1fe4, 2, 2093 }, 
+  { 0x1fe5, 2, 2095 }, 
+  { 0x1fe6, 2, 2097 }, 
+  { 0x1fe7, 3, 2099 }, 
+  { 0x1fe8, 2, 2102 }, 
+  { 0x1fe9, 2, 2104 }, 
+  { 0x1fea, 2, 2106 }, 
+  { 0x1feb, 2, 636 }, 
+  { 0x1fec, 2, 2108 }, 
+  { 0x1fed, 3, 2110 }, 
+  { 0x1fee, 3, 622 }, 
+  { 0x1fef, 1, 2113 }, 
+  { 0x1ff2, 3, 2114 }, 
+  { 0x1ff3, 2, 2117 }, 
+  { 0x1ff4, 3, 2119 }, 
+  { 0x1ff6, 2, 2122 }, 
+  { 0x1ff7, 3, 2124 }, 
+  { 0x1ff8, 2, 2127 }, 
+  { 0x1ff9, 2, 634 }, 
+  { 0x1ffa, 2, 2129 }, 
+  { 0x1ffb, 2, 638 }, 
+  { 0x1ffc, 2, 2131 }, 
+  { 0x1ffd, 2, 8 }, 
+  { 0x1ffe, 2, 2133 }, 
+  { 0x2000, 1, 0 }, 
+  { 0x2001, 1, 0 }, 
+  { 0x2002, 1, 0 }, 
+  { 0x2003, 1, 0 }, 
+  { 0x2004, 1, 0 }, 
+  { 0x2005, 1, 0 }, 
+  { 0x2006, 1, 0 }, 
+  { 0x2007, 1, 0 }, 
+  { 0x2008, 1, 0 }, 
+  { 0x2009, 1, 0 }, 
+  { 0x200a, 1, 0 }, 
+  { 0x2011, 1, 2135 }, 
+  { 0x2017, 2, 2136 }, 
+  { 0x2024, 1, 2138 }, 
+  { 0x2025, 2, 2139 }, 
+  { 0x2026, 3, 2141 }, 
+  { 0x202f, 1, 0 }, 
+  { 0x2033, 2, 2144 }, 
+  { 0x2034, 3, 2146 }, 
+  { 0x2036, 2, 2149 }, 
+  { 0x2037, 3, 2151 }, 
+  { 0x203c, 2, 2154 }, 
+  { 0x203e, 2, 2156 }, 
+  { 0x2047, 2, 2158 }, 
+  { 0x2048, 2, 2160 }, 
+  { 0x2049, 2, 2162 }, 
+  { 0x2057, 4, 2164 }, 
+  { 0x205f, 1, 0 }, 
+  { 0x2070, 1, 2168 }, 
+  { 0x2071, 1, 2169 }, 
+  { 0x2074, 1, 2170 }, 
+  { 0x2075, 1, 2171 }, 
+  { 0x2076, 1, 2172 }, 
+  { 0x2077, 1, 2173 }, 
+  { 0x2078, 1, 2174 }, 
+  { 0x2079, 1, 2175 }, 
+  { 0x207a, 1, 2176 }, 
+  { 0x207b, 1, 2177 }, 
+  { 0x207c, 1, 2178 }, 
+  { 0x207d, 1, 2179 }, 
+  { 0x207e, 1, 2180 }, 
+  { 0x207f, 1, 2181 }, 
+  { 0x2080, 1, 2168 }, 
+  { 0x2081, 1, 13 }, 
+  { 0x2082, 1, 6 }, 
+  { 0x2083, 1, 7 }, 
+  { 0x2084, 1, 2170 }, 
+  { 0x2085, 1, 2171 }, 
+  { 0x2086, 1, 2172 }, 
+  { 0x2087, 1, 2173 }, 
+  { 0x2088, 1, 2174 }, 
+  { 0x2089, 1, 2175 }, 
+  { 0x208a, 1, 2176 }, 
+  { 0x208b, 1, 2177 }, 
+  { 0x208c, 1, 2178 }, 
+  { 0x208d, 1, 2179 }, 
+  { 0x208e, 1, 2180 }, 
+  { 0x20a8, 2, 2182 }, 
+  { 0x2100, 3, 2184 }, 
+  { 0x2101, 3, 2187 }, 
+  { 0x2102, 1, 2190 }, 
+  { 0x2103, 2, 2191 }, 
+  { 0x2105, 3, 2193 }, 
+  { 0x2106, 3, 2196 }, 
+  { 0x2107, 1, 2199 }, 
+  { 0x2109, 2, 2200 }, 
+  { 0x210a, 1, 2202 }, 
+  { 0x210b, 1, 2203 }, 
+  { 0x210c, 1, 2203 }, 
+  { 0x210d, 1, 2203 }, 
+  { 0x210e, 1, 588 }, 
+  { 0x210f, 1, 2204 }, 
+  { 0x2110, 1, 2205 }, 
+  { 0x2111, 1, 2205 }, 
+  { 0x2112, 1, 2206 }, 
+  { 0x2113, 1, 610 }, 
+  { 0x2115, 1, 2207 }, 
+  { 0x2116, 2, 2208 }, 
+  { 0x2119, 1, 2210 }, 
+  { 0x211a, 1, 2211 }, 
+  { 0x211b, 1, 2212 }, 
+  { 0x211c, 1, 2212 }, 
+  { 0x211d, 1, 2212 }, 
+  { 0x2120, 2, 2213 }, 
+  { 0x2121, 3, 2215 }, 
+  { 0x2122, 2, 2218 }, 
+  { 0x2124, 1, 2220 }, 
+  { 0x2126, 1, 2221 }, 
+  { 0x2128, 1, 2220 }, 
+  { 0x212a, 1, 2222 }, 
+  { 0x212b, 2, 34 }, 
+  { 0x212c, 1, 2223 }, 
+  { 0x212d, 1, 2190 }, 
+  { 0x212f, 1, 2224 }, 
+  { 0x2130, 1, 2225 }, 
+  { 0x2131, 1, 2226 }, 
+  { 0x2133, 1, 2227 }, 
+  { 0x2134, 1, 14 }, 
+  { 0x2135, 1, 2228 }, 
+  { 0x2136, 1, 2229 }, 
+  { 0x2137, 1, 2230 }, 
+  { 0x2138, 1, 2231 }, 
+  { 0x2139, 1, 2169 }, 
+  { 0x213d, 1, 2232 }, 
+  { 0x213e, 1, 2233 }, 
+  { 0x213f, 1, 2234 }, 
+  { 0x2140, 1, 2235 }, 
+  { 0x2145, 1, 2236 }, 
+  { 0x2146, 1, 2237 }, 
+  { 0x2147, 1, 2224 }, 
+  { 0x2148, 1, 2169 }, 
+  { 0x2149, 1, 590 }, 
+  { 0x2153, 3, 2238 }, 
+  { 0x2154, 3, 2241 }, 
+  { 0x2155, 3, 2244 }, 
+  { 0x2156, 3, 2247 }, 
+  { 0x2157, 3, 2250 }, 
+  { 0x2158, 3, 2253 }, 
+  { 0x2159, 3, 2256 }, 
+  { 0x215a, 3, 2259 }, 
+  { 0x215b, 3, 2262 }, 
+  { 0x215c, 3, 2265 }, 
+  { 0x215d, 3, 2268 }, 
+  { 0x215e, 3, 2271 }, 
+  { 0x215f, 2, 2274 }, 
+  { 0x2160, 1, 2205 }, 
+  { 0x2161, 2, 2276 }, 
+  { 0x2162, 3, 2278 }, 
+  { 0x2163, 2, 2281 }, 
+  { 0x2164, 1, 2283 }, 
+  { 0x2165, 2, 2284 }, 
+  { 0x2166, 3, 2286 }, 
+  { 0x2167, 4, 2289 }, 
+  { 0x2168, 2, 2293 }, 
+  { 0x2169, 1, 2295 }, 
+  { 0x216a, 2, 2296 }, 
+  { 0x216b, 3, 2298 }, 
+  { 0x216c, 1, 2206 }, 
+  { 0x216d, 1, 2190 }, 
+  { 0x216e, 1, 2236 }, 
+  { 0x216f, 1, 2227 }, 
+  { 0x2170, 1, 2169 }, 
+  { 0x2171, 2, 2301 }, 
+  { 0x2172, 3, 2303 }, 
+  { 0x2173, 2, 2306 }, 
+  { 0x2174, 1, 2308 }, 
+  { 0x2175, 2, 2309 }, 
+  { 0x2176, 3, 2311 }, 
+  { 0x2177, 4, 2314 }, 
+  { 0x2178, 2, 2318 }, 
+  { 0x2179, 1, 611 }, 
+  { 0x217a, 2, 2320 }, 
+  { 0x217b, 3, 2322 }, 
+  { 0x217c, 1, 610 }, 
+  { 0x217d, 1, 2325 }, 
+  { 0x217e, 1, 2237 }, 
+  { 0x217f, 1, 2326 }, 
+  { 0x219a, 2, 2327 }, 
+  { 0x219b, 2, 2329 }, 
+  { 0x21ae, 2, 2331 }, 
+  { 0x21cd, 2, 2333 }, 
+  { 0x21ce, 2, 2335 }, 
+  { 0x21cf, 2, 2337 }, 
+  { 0x2204, 2, 2339 }, 
+  { 0x2209, 2, 2341 }, 
+  { 0x220c, 2, 2343 }, 
+  { 0x2224, 2, 2345 }, 
+  { 0x2226, 2, 2347 }, 
+  { 0x222c, 2, 2349 }, 
+  { 0x222d, 3, 2351 }, 
+  { 0x222f, 2, 2354 }, 
+  { 0x2230, 3, 2356 }, 
+  { 0x2241, 2, 2359 }, 
+  { 0x2244, 2, 2361 }, 
+  { 0x2247, 2, 2363 }, 
+  { 0x2249, 2, 2365 }, 
+  { 0x2260, 2, 2367 }, 
+  { 0x2262, 2, 2369 }, 
+  { 0x226d, 2, 2371 }, 
+  { 0x226e, 2, 2373 }, 
+  { 0x226f, 2, 2375 }, 
+  { 0x2270, 2, 2377 }, 
+  { 0x2271, 2, 2379 }, 
+  { 0x2274, 2, 2381 }, 
+  { 0x2275, 2, 2383 }, 
+  { 0x2278, 2, 2385 }, 
+  { 0x2279, 2, 2387 }, 
+  { 0x2280, 2, 2389 }, 
+  { 0x2281, 2, 2391 }, 
+  { 0x2284, 2, 2393 }, 
+  { 0x2285, 2, 2395 }, 
+  { 0x2288, 2, 2397 }, 
+  { 0x2289, 2, 2399 }, 
+  { 0x22ac, 2, 2401 }, 
+  { 0x22ad, 2, 2403 }, 
+  { 0x22ae, 2, 2405 }, 
+  { 0x22af, 2, 2407 }, 
+  { 0x22e0, 2, 2409 }, 
+  { 0x22e1, 2, 2411 }, 
+  { 0x22e2, 2, 2413 }, 
+  { 0x22e3, 2, 2415 }, 
+  { 0x22ea, 2, 2417 }, 
+  { 0x22eb, 2, 2419 }, 
+  { 0x22ec, 2, 2421 }, 
+  { 0x22ed, 2, 2423 }, 
+  { 0x2329, 1, 2425 }, 
+  { 0x232a, 1, 2426 }, 
+  { 0x2460, 1, 13 }, 
+  { 0x2461, 1, 6 }, 
+  { 0x2462, 1, 7 }, 
+  { 0x2463, 1, 2170 }, 
+  { 0x2464, 1, 2171 }, 
+  { 0x2465, 1, 2172 }, 
+  { 0x2466, 1, 2173 }, 
+  { 0x2467, 1, 2174 }, 
+  { 0x2468, 1, 2175 }, 
+  { 0x2469, 2, 2427 }, 
+  { 0x246a, 2, 2429 }, 
+  { 0x246b, 2, 2431 }, 
+  { 0x246c, 2, 2433 }, 
+  { 0x246d, 2, 2435 }, 
+  { 0x246e, 2, 2437 }, 
+  { 0x246f, 2, 2439 }, 
+  { 0x2470, 2, 2441 }, 
+  { 0x2471, 2, 2443 }, 
+  { 0x2472, 2, 2445 }, 
+  { 0x2473, 2, 2447 }, 
+  { 0x2474, 3, 2449 }, 
+  { 0x2475, 3, 2452 }, 
+  { 0x2476, 3, 2455 }, 
+  { 0x2477, 3, 2458 }, 
+  { 0x2478, 3, 2461 }, 
+  { 0x2479, 3, 2464 }, 
+  { 0x247a, 3, 2467 }, 
+  { 0x247b, 3, 2470 }, 
+  { 0x247c, 3, 2473 }, 
+  { 0x247d, 4, 2476 }, 
+  { 0x247e, 4, 2480 }, 
+  { 0x247f, 4, 2484 }, 
+  { 0x2480, 4, 2488 }, 
+  { 0x2481, 4, 2492 }, 
+  { 0x2482, 4, 2496 }, 
+  { 0x2483, 4, 2500 }, 
+  { 0x2484, 4, 2504 }, 
+  { 0x2485, 4, 2508 }, 
+  { 0x2486, 4, 2512 }, 
+  { 0x2487, 4, 2516 }, 
+  { 0x2488, 2, 2520 }, 
+  { 0x2489, 2, 2522 }, 
+  { 0x248a, 2, 2524 }, 
+  { 0x248b, 2, 2526 }, 
+  { 0x248c, 2, 2528 }, 
+  { 0x248d, 2, 2530 }, 
+  { 0x248e, 2, 2532 }, 
+  { 0x248f, 2, 2534 }, 
+  { 0x2490, 2, 2536 }, 
+  { 0x2491, 3, 2538 }, 
+  { 0x2492, 3, 2541 }, 
+  { 0x2493, 3, 2544 }, 
+  { 0x2494, 3, 2547 }, 
+  { 0x2495, 3, 2550 }, 
+  { 0x2496, 3, 2553 }, 
+  { 0x2497, 3, 2556 }, 
+  { 0x2498, 3, 2559 }, 
+  { 0x2499, 3, 2562 }, 
+  { 0x249a, 3, 2565 }, 
+  { 0x249b, 3, 2568 }, 
+  { 0x249c, 3, 2571 }, 
+  { 0x249d, 3, 2574 }, 
+  { 0x249e, 3, 2577 }, 
+  { 0x249f, 3, 2580 }, 
+  { 0x24a0, 3, 2583 }, 
+  { 0x24a1, 3, 2586 }, 
+  { 0x24a2, 3, 2589 }, 
+  { 0x24a3, 3, 2592 }, 
+  { 0x24a4, 3, 2595 }, 
+  { 0x24a5, 3, 2598 }, 
+  { 0x24a6, 3, 2601 }, 
+  { 0x24a7, 3, 2604 }, 
+  { 0x24a8, 3, 2607 }, 
+  { 0x24a9, 3, 2610 }, 
+  { 0x24aa, 3, 2613 }, 
+  { 0x24ab, 3, 2616 }, 
+  { 0x24ac, 3, 2619 }, 
+  { 0x24ad, 3, 2622 }, 
+  { 0x24ae, 3, 2625 }, 
+  { 0x24af, 3, 2628 }, 
+  { 0x24b0, 3, 2631 }, 
+  { 0x24b1, 3, 2634 }, 
+  { 0x24b2, 3, 2637 }, 
+  { 0x24b3, 3, 2640 }, 
+  { 0x24b4, 3, 2643 }, 
+  { 0x24b5, 3, 2646 }, 
+  { 0x24b6, 1, 2649 }, 
+  { 0x24b7, 1, 2223 }, 
+  { 0x24b8, 1, 2190 }, 
+  { 0x24b9, 1, 2236 }, 
+  { 0x24ba, 1, 2225 }, 
+  { 0x24bb, 1, 2226 }, 
+  { 0x24bc, 1, 2650 }, 
+  { 0x24bd, 1, 2203 }, 
+  { 0x24be, 1, 2205 }, 
+  { 0x24bf, 1, 2651 }, 
+  { 0x24c0, 1, 2222 }, 
+  { 0x24c1, 1, 2206 }, 
+  { 0x24c2, 1, 2227 }, 
+  { 0x24c3, 1, 2207 }, 
+  { 0x24c4, 1, 2652 }, 
+  { 0x24c5, 1, 2210 }, 
+  { 0x24c6, 1, 2211 }, 
+  { 0x24c7, 1, 2212 }, 
+  { 0x24c8, 1, 2653 }, 
+  { 0x24c9, 1, 2654 }, 
+  { 0x24ca, 1, 2655 }, 
+  { 0x24cb, 1, 2283 }, 
+  { 0x24cc, 1, 2656 }, 
+  { 0x24cd, 1, 2295 }, 
+  { 0x24ce, 1, 2657 }, 
+  { 0x24cf, 1, 2220 }, 
+  { 0x24d0, 1, 3 }, 
+  { 0x24d1, 1, 2658 }, 
+  { 0x24d2, 1, 2325 }, 
+  { 0x24d3, 1, 2237 }, 
+  { 0x24d4, 1, 2224 }, 
+  { 0x24d5, 1, 2659 }, 
+  { 0x24d6, 1, 2202 }, 
+  { 0x24d7, 1, 588 }, 
+  { 0x24d8, 1, 2169 }, 
+  { 0x24d9, 1, 590 }, 
+  { 0x24da, 1, 2660 }, 
+  { 0x24db, 1, 610 }, 
+  { 0x24dc, 1, 2326 }, 
+  { 0x24dd, 1, 2181 }, 
+  { 0x24de, 1, 14 }, 
+  { 0x24df, 1, 2661 }, 
+  { 0x24e0, 1, 2662 }, 
+  { 0x24e1, 1, 591 }, 
+  { 0x24e2, 1, 356 }, 
+  { 0x24e3, 1, 2663 }, 
+  { 0x24e4, 1, 2664 }, 
+  { 0x24e5, 1, 2308 }, 
+  { 0x24e6, 1, 595 }, 
+  { 0x24e7, 1, 611 }, 
+  { 0x24e8, 1, 596 }, 
+  { 0x24e9, 1, 2665 }, 
+  { 0x24ea, 1, 2168 }, 
+  { 0x2a0c, 4, 2666 }, 
+  { 0x2a74, 3, 2670 }, 
+  { 0x2a75, 2, 2673 }, 
+  { 0x2a76, 3, 2675 }, 
+  { 0x2adc, 2, 2678 }, 
+  { 0x2e9f, 1, 2680 }, 
+  { 0x2ef3, 1, 2681 }, 
+  { 0x2f00, 1, 2682 }, 
+  { 0x2f01, 1, 2683 }, 
+  { 0x2f02, 1, 2684 }, 
+  { 0x2f03, 1, 2685 }, 
+  { 0x2f04, 1, 2686 }, 
+  { 0x2f05, 1, 2687 }, 
+  { 0x2f06, 1, 2688 }, 
+  { 0x2f07, 1, 2689 }, 
+  { 0x2f08, 1, 2690 }, 
+  { 0x2f09, 1, 2691 }, 
+  { 0x2f0a, 1, 2692 }, 
+  { 0x2f0b, 1, 2693 }, 
+  { 0x2f0c, 1, 2694 }, 
+  { 0x2f0d, 1, 2695 }, 
+  { 0x2f0e, 1, 2696 }, 
+  { 0x2f0f, 1, 2697 }, 
+  { 0x2f10, 1, 2698 }, 
+  { 0x2f11, 1, 2699 }, 
+  { 0x2f12, 1, 2700 }, 
+  { 0x2f13, 1, 2701 }, 
+  { 0x2f14, 1, 2702 }, 
+  { 0x2f15, 1, 2703 }, 
+  { 0x2f16, 1, 2704 }, 
+  { 0x2f17, 1, 2705 }, 
+  { 0x2f18, 1, 2706 }, 
+  { 0x2f19, 1, 2707 }, 
+  { 0x2f1a, 1, 2708 }, 
+  { 0x2f1b, 1, 2709 }, 
+  { 0x2f1c, 1, 2710 }, 
+  { 0x2f1d, 1, 2711 }, 
+  { 0x2f1e, 1, 2712 }, 
+  { 0x2f1f, 1, 2713 }, 
+  { 0x2f20, 1, 2714 }, 
+  { 0x2f21, 1, 2715 }, 
+  { 0x2f22, 1, 2716 }, 
+  { 0x2f23, 1, 2717 }, 
+  { 0x2f24, 1, 2718 }, 
+  { 0x2f25, 1, 2719 }, 
+  { 0x2f26, 1, 2720 }, 
+  { 0x2f27, 1, 2721 }, 
+  { 0x2f28, 1, 2722 }, 
+  { 0x2f29, 1, 2723 }, 
+  { 0x2f2a, 1, 2724 }, 
+  { 0x2f2b, 1, 2725 }, 
+  { 0x2f2c, 1, 2726 }, 
+  { 0x2f2d, 1, 2727 }, 
+  { 0x2f2e, 1, 2728 }, 
+  { 0x2f2f, 1, 2729 }, 
+  { 0x2f30, 1, 2730 }, 
+  { 0x2f31, 1, 2731 }, 
+  { 0x2f32, 1, 2732 }, 
+  { 0x2f33, 1, 2733 }, 
+  { 0x2f34, 1, 2734 }, 
+  { 0x2f35, 1, 2735 }, 
+  { 0x2f36, 1, 2736 }, 
+  { 0x2f37, 1, 2737 }, 
+  { 0x2f38, 1, 2738 }, 
+  { 0x2f39, 1, 2739 }, 
+  { 0x2f3a, 1, 2740 }, 
+  { 0x2f3b, 1, 2741 }, 
+  { 0x2f3c, 1, 2742 }, 
+  { 0x2f3d, 1, 2743 }, 
+  { 0x2f3e, 1, 2744 }, 
+  { 0x2f3f, 1, 2745 }, 
+  { 0x2f40, 1, 2746 }, 
+  { 0x2f41, 1, 2747 }, 
+  { 0x2f42, 1, 2748 }, 
+  { 0x2f43, 1, 2749 }, 
+  { 0x2f44, 1, 2750 }, 
+  { 0x2f45, 1, 2751 }, 
+  { 0x2f46, 1, 2752 }, 
+  { 0x2f47, 1, 2753 }, 
+  { 0x2f48, 1, 2754 }, 
+  { 0x2f49, 1, 2755 }, 
+  { 0x2f4a, 1, 2756 }, 
+  { 0x2f4b, 1, 2757 }, 
+  { 0x2f4c, 1, 2758 }, 
+  { 0x2f4d, 1, 2759 }, 
+  { 0x2f4e, 1, 2760 }, 
+  { 0x2f4f, 1, 2761 }, 
+  { 0x2f50, 1, 2762 }, 
+  { 0x2f51, 1, 2763 }, 
+  { 0x2f52, 1, 2764 }, 
+  { 0x2f53, 1, 2765 }, 
+  { 0x2f54, 1, 2766 }, 
+  { 0x2f55, 1, 2767 }, 
+  { 0x2f56, 1, 2768 }, 
+  { 0x2f57, 1, 2769 }, 
+  { 0x2f58, 1, 2770 }, 
+  { 0x2f59, 1, 2771 }, 
+  { 0x2f5a, 1, 2772 }, 
+  { 0x2f5b, 1, 2773 }, 
+  { 0x2f5c, 1, 2774 }, 
+  { 0x2f5d, 1, 2775 }, 
+  { 0x2f5e, 1, 2776 }, 
+  { 0x2f5f, 1, 2777 }, 
+  { 0x2f60, 1, 2778 }, 
+  { 0x2f61, 1, 2779 }, 
+  { 0x2f62, 1, 2780 }, 
+  { 0x2f63, 1, 2781 }, 
+  { 0x2f64, 1, 2782 }, 
+  { 0x2f65, 1, 2783 }, 
+  { 0x2f66, 1, 2784 }, 
+  { 0x2f67, 1, 2785 }, 
+  { 0x2f68, 1, 2786 }, 
+  { 0x2f69, 1, 2787 }, 
+  { 0x2f6a, 1, 2788 }, 
+  { 0x2f6b, 1, 2789 }, 
+  { 0x2f6c, 1, 2790 }, 
+  { 0x2f6d, 1, 2791 }, 
+  { 0x2f6e, 1, 2792 }, 
+  { 0x2f6f, 1, 2793 }, 
+  { 0x2f70, 1, 2794 }, 
+  { 0x2f71, 1, 2795 }, 
+  { 0x2f72, 1, 2796 }, 
+  { 0x2f73, 1, 2797 }, 
+  { 0x2f74, 1, 2798 }, 
+  { 0x2f75, 1, 2799 }, 
+  { 0x2f76, 1, 2800 }, 
+  { 0x2f77, 1, 2801 }, 
+  { 0x2f78, 1, 2802 }, 
+  { 0x2f79, 1, 2803 }, 
+  { 0x2f7a, 1, 2804 }, 
+  { 0x2f7b, 1, 2805 }, 
+  { 0x2f7c, 1, 2806 }, 
+  { 0x2f7d, 1, 2807 }, 
+  { 0x2f7e, 1, 2808 }, 
+  { 0x2f7f, 1, 2809 }, 
+  { 0x2f80, 1, 2810 }, 
+  { 0x2f81, 1, 2811 }, 
+  { 0x2f82, 1, 2812 }, 
+  { 0x2f83, 1, 2813 }, 
+  { 0x2f84, 1, 2814 }, 
+  { 0x2f85, 1, 2815 }, 
+  { 0x2f86, 1, 2816 }, 
+  { 0x2f87, 1, 2817 }, 
+  { 0x2f88, 1, 2818 }, 
+  { 0x2f89, 1, 2819 }, 
+  { 0x2f8a, 1, 2820 }, 
+  { 0x2f8b, 1, 2821 }, 
+  { 0x2f8c, 1, 2822 }, 
+  { 0x2f8d, 1, 2823 }, 
+  { 0x2f8e, 1, 2824 }, 
+  { 0x2f8f, 1, 2825 }, 
+  { 0x2f90, 1, 2826 }, 
+  { 0x2f91, 1, 2827 }, 
+  { 0x2f92, 1, 2828 }, 
+  { 0x2f93, 1, 2829 }, 
+  { 0x2f94, 1, 2830 }, 
+  { 0x2f95, 1, 2831 }, 
+  { 0x2f96, 1, 2832 }, 
+  { 0x2f97, 1, 2833 }, 
+  { 0x2f98, 1, 2834 }, 
+  { 0x2f99, 1, 2835 }, 
+  { 0x2f9a, 1, 2836 }, 
+  { 0x2f9b, 1, 2837 }, 
+  { 0x2f9c, 1, 2838 }, 
+  { 0x2f9d, 1, 2839 }, 
+  { 0x2f9e, 1, 2840 }, 
+  { 0x2f9f, 1, 2841 }, 
+  { 0x2fa0, 1, 2842 }, 
+  { 0x2fa1, 1, 2843 }, 
+  { 0x2fa2, 1, 2844 }, 
+  { 0x2fa3, 1, 2845 }, 
+  { 0x2fa4, 1, 2846 }, 
+  { 0x2fa5, 1, 2847 }, 
+  { 0x2fa6, 1, 2848 }, 
+  { 0x2fa7, 1, 2849 }, 
+  { 0x2fa8, 1, 2850 }, 
+  { 0x2fa9, 1, 2851 }, 
+  { 0x2faa, 1, 2852 }, 
+  { 0x2fab, 1, 2853 }, 
+  { 0x2fac, 1, 2854 }, 
+  { 0x2fad, 1, 2855 }, 
+  { 0x2fae, 1, 2856 }, 
+  { 0x2faf, 1, 2857 }, 
+  { 0x2fb0, 1, 2858 }, 
+  { 0x2fb1, 1, 2859 }, 
+  { 0x2fb2, 1, 2860 }, 
+  { 0x2fb3, 1, 2861 }, 
+  { 0x2fb4, 1, 2862 }, 
+  { 0x2fb5, 1, 2863 }, 
+  { 0x2fb6, 1, 2864 }, 
+  { 0x2fb7, 1, 2865 }, 
+  { 0x2fb8, 1, 2866 }, 
+  { 0x2fb9, 1, 2867 }, 
+  { 0x2fba, 1, 2868 }, 
+  { 0x2fbb, 1, 2869 }, 
+  { 0x2fbc, 1, 2870 }, 
+  { 0x2fbd, 1, 2871 }, 
+  { 0x2fbe, 1, 2872 }, 
+  { 0x2fbf, 1, 2873 }, 
+  { 0x2fc0, 1, 2874 }, 
+  { 0x2fc1, 1, 2875 }, 
+  { 0x2fc2, 1, 2876 }, 
+  { 0x2fc3, 1, 2877 }, 
+  { 0x2fc4, 1, 2878 }, 
+  { 0x2fc5, 1, 2879 }, 
+  { 0x2fc6, 1, 2880 }, 
+  { 0x2fc7, 1, 2881 }, 
+  { 0x2fc8, 1, 2882 }, 
+  { 0x2fc9, 1, 2883 }, 
+  { 0x2fca, 1, 2884 }, 
+  { 0x2fcb, 1, 2885 }, 
+  { 0x2fcc, 1, 2886 }, 
+  { 0x2fcd, 1, 2887 }, 
+  { 0x2fce, 1, 2888 }, 
+  { 0x2fcf, 1, 2889 }, 
+  { 0x2fd0, 1, 2890 }, 
+  { 0x2fd1, 1, 2891 }, 
+  { 0x2fd2, 1, 2892 }, 
+  { 0x2fd3, 1, 2893 }, 
+  { 0x2fd4, 1, 2894 }, 
+  { 0x2fd5, 1, 2895 }, 
+  { 0x3000, 1, 0 }, 
+  { 0x3036, 1, 2896 }, 
+  { 0x3038, 1, 2705 }, 
+  { 0x3039, 1, 2897 }, 
+  { 0x303a, 1, 2898 }, 
+  { 0x304c, 2, 2899 }, 
+  { 0x304e, 2, 2901 }, 
+  { 0x3050, 2, 2903 }, 
+  { 0x3052, 2, 2905 }, 
+  { 0x3054, 2, 2907 }, 
+  { 0x3056, 2, 2909 }, 
+  { 0x3058, 2, 2911 }, 
+  { 0x305a, 2, 2913 }, 
+  { 0x305c, 2, 2915 }, 
+  { 0x305e, 2, 2917 }, 
+  { 0x3060, 2, 2919 }, 
+  { 0x3062, 2, 2921 }, 
+  { 0x3065, 2, 2923 }, 
+  { 0x3067, 2, 2925 }, 
+  { 0x3069, 2, 2927 }, 
+  { 0x3070, 2, 2929 }, 
+  { 0x3071, 2, 2931 }, 
+  { 0x3073, 2, 2933 }, 
+  { 0x3074, 2, 2935 }, 
+  { 0x3076, 2, 2937 }, 
+  { 0x3077, 2, 2939 }, 
+  { 0x3079, 2, 2941 }, 
+  { 0x307a, 2, 2943 }, 
+  { 0x307c, 2, 2945 }, 
+  { 0x307d, 2, 2947 }, 
+  { 0x3094, 2, 2949 }, 
+  { 0x309b, 2, 2951 }, 
+  { 0x309c, 2, 2953 }, 
+  { 0x309e, 2, 2955 }, 
+  { 0x309f, 2, 2957 }, 
+  { 0x30ac, 2, 2959 }, 
+  { 0x30ae, 2, 2961 }, 
+  { 0x30b0, 2, 2963 }, 
+  { 0x30b2, 2, 2965 }, 
+  { 0x30b4, 2, 2967 }, 
+  { 0x30b6, 2, 2969 }, 
+  { 0x30b8, 2, 2971 }, 
+  { 0x30ba, 2, 2973 }, 
+  { 0x30bc, 2, 2975 }, 
+  { 0x30be, 2, 2977 }, 
+  { 0x30c0, 2, 2979 }, 
+  { 0x30c2, 2, 2981 }, 
+  { 0x30c5, 2, 2983 }, 
+  { 0x30c7, 2, 2985 }, 
+  { 0x30c9, 2, 2987 }, 
+  { 0x30d0, 2, 2989 }, 
+  { 0x30d1, 2, 2991 }, 
+  { 0x30d3, 2, 2993 }, 
+  { 0x30d4, 2, 2995 }, 
+  { 0x30d6, 2, 2997 }, 
+  { 0x30d7, 2, 2999 }, 
+  { 0x30d9, 2, 3001 }, 
+  { 0x30da, 2, 3003 }, 
+  { 0x30dc, 2, 3005 }, 
+  { 0x30dd, 2, 3007 }, 
+  { 0x30f4, 2, 3009 }, 
+  { 0x30f7, 2, 3011 }, 
+  { 0x30f8, 2, 3013 }, 
+  { 0x30f9, 2, 3015 }, 
+  { 0x30fa, 2, 3017 }, 
+  { 0x30fe, 2, 3019 }, 
+  { 0x30ff, 2, 3021 }, 
+  { 0x3131, 1, 3023 }, 
+  { 0x3132, 1, 3024 }, 
+  { 0x3133, 1, 3025 }, 
+  { 0x3134, 1, 3026 }, 
+  { 0x3135, 1, 3027 }, 
+  { 0x3136, 1, 3028 }, 
+  { 0x3137, 1, 3029 }, 
+  { 0x3138, 1, 3030 }, 
+  { 0x3139, 1, 3031 }, 
+  { 0x313a, 1, 3032 }, 
+  { 0x313b, 1, 3033 }, 
+  { 0x313c, 1, 3034 }, 
+  { 0x313d, 1, 3035 }, 
+  { 0x313e, 1, 3036 }, 
+  { 0x313f, 1, 3037 }, 
+  { 0x3140, 1, 3038 }, 
+  { 0x3141, 1, 3039 }, 
+  { 0x3142, 1, 3040 }, 
+  { 0x3143, 1, 3041 }, 
+  { 0x3144, 1, 3042 }, 
+  { 0x3145, 1, 3043 }, 
+  { 0x3146, 1, 3044 }, 
+  { 0x3147, 1, 3045 }, 
+  { 0x3148, 1, 3046 }, 
+  { 0x3149, 1, 3047 }, 
+  { 0x314a, 1, 3048 }, 
+  { 0x314b, 1, 3049 }, 
+  { 0x314c, 1, 3050 }, 
+  { 0x314d, 1, 3051 }, 
+  { 0x314e, 1, 3052 }, 
+  { 0x314f, 1, 3053 }, 
+  { 0x3150, 1, 3054 }, 
+  { 0x3151, 1, 3055 }, 
+  { 0x3152, 1, 3056 }, 
+  { 0x3153, 1, 3057 }, 
+  { 0x3154, 1, 3058 }, 
+  { 0x3155, 1, 3059 }, 
+  { 0x3156, 1, 3060 }, 
+  { 0x3157, 1, 3061 }, 
+  { 0x3158, 1, 3062 }, 
+  { 0x3159, 1, 3063 }, 
+  { 0x315a, 1, 3064 }, 
+  { 0x315b, 1, 3065 }, 
+  { 0x315c, 1, 3066 }, 
+  { 0x315d, 1, 3067 }, 
+  { 0x315e, 1, 3068 }, 
+  { 0x315f, 1, 3069 }, 
+  { 0x3160, 1, 3070 }, 
+  { 0x3161, 1, 3071 }, 
+  { 0x3162, 1, 3072 }, 
+  { 0x3163, 1, 3073 }, 
+  { 0x3164, 1, 3074 }, 
+  { 0x3165, 1, 3075 }, 
+  { 0x3166, 1, 3076 }, 
+  { 0x3167, 1, 3077 }, 
+  { 0x3168, 1, 3078 }, 
+  { 0x3169, 1, 3079 }, 
+  { 0x316a, 1, 3080 }, 
+  { 0x316b, 1, 3081 }, 
+  { 0x316c, 1, 3082 }, 
+  { 0x316d, 1, 3083 }, 
+  { 0x316e, 1, 3084 }, 
+  { 0x316f, 1, 3085 }, 
+  { 0x3170, 1, 3086 }, 
+  { 0x3171, 1, 3087 }, 
+  { 0x3172, 1, 3088 }, 
+  { 0x3173, 1, 3089 }, 
+  { 0x3174, 1, 3090 }, 
+  { 0x3175, 1, 3091 }, 
+  { 0x3176, 1, 3092 }, 
+  { 0x3177, 1, 3093 }, 
+  { 0x3178, 1, 3094 }, 
+  { 0x3179, 1, 3095 }, 
+  { 0x317a, 1, 3096 }, 
+  { 0x317b, 1, 3097 }, 
+  { 0x317c, 1, 3098 }, 
+  { 0x317d, 1, 3099 }, 
+  { 0x317e, 1, 3100 }, 
+  { 0x317f, 1, 3101 }, 
+  { 0x3180, 1, 3102 }, 
+  { 0x3181, 1, 3103 }, 
+  { 0x3182, 1, 3104 }, 
+  { 0x3183, 1, 3105 }, 
+  { 0x3184, 1, 3106 }, 
+  { 0x3185, 1, 3107 }, 
+  { 0x3186, 1, 3108 }, 
+  { 0x3187, 1, 3109 }, 
+  { 0x3188, 1, 3110 }, 
+  { 0x3189, 1, 3111 }, 
+  { 0x318a, 1, 3112 }, 
+  { 0x318b, 1, 3113 }, 
+  { 0x318c, 1, 3114 }, 
+  { 0x318d, 1, 3115 }, 
+  { 0x318e, 1, 3116 }, 
+  { 0x3192, 1, 2682 }, 
+  { 0x3193, 1, 2688 }, 
+  { 0x3194, 1, 3117 }, 
+  { 0x3195, 1, 3118 }, 
+  { 0x3196, 1, 3119 }, 
+  { 0x3197, 1, 3120 }, 
+  { 0x3198, 1, 3121 }, 
+  { 0x3199, 1, 3122 }, 
+  { 0x319a, 1, 2686 }, 
+  { 0x319b, 1, 3123 }, 
+  { 0x319c, 1, 3124 }, 
+  { 0x319d, 1, 3125 }, 
+  { 0x319e, 1, 3126 }, 
+  { 0x319f, 1, 2690 }, 
+  { 0x3200, 3, 3127 }, 
+  { 0x3201, 3, 3130 }, 
+  { 0x3202, 3, 3133 }, 
+  { 0x3203, 3, 3136 }, 
+  { 0x3204, 3, 3139 }, 
+  { 0x3205, 3, 3142 }, 
+  { 0x3206, 3, 3145 }, 
+  { 0x3207, 3, 3148 }, 
+  { 0x3208, 3, 3151 }, 
+  { 0x3209, 3, 3154 }, 
+  { 0x320a, 3, 3157 }, 
+  { 0x320b, 3, 3160 }, 
+  { 0x320c, 3, 3163 }, 
+  { 0x320d, 3, 3166 }, 
+  { 0x320e, 4, 3169 }, 
+  { 0x320f, 4, 3173 }, 
+  { 0x3210, 4, 3177 }, 
+  { 0x3211, 4, 3181 }, 
+  { 0x3212, 4, 3185 }, 
+  { 0x3213, 4, 3189 }, 
+  { 0x3214, 4, 3193 }, 
+  { 0x3215, 4, 3197 }, 
+  { 0x3216, 4, 3201 }, 
+  { 0x3217, 4, 3205 }, 
+  { 0x3218, 4, 3209 }, 
+  { 0x3219, 4, 3213 }, 
+  { 0x321a, 4, 3217 }, 
+  { 0x321b, 4, 3221 }, 
+  { 0x321c, 4, 3225 }, 
+  { 0x3220, 3, 3229 }, 
+  { 0x3221, 3, 3232 }, 
+  { 0x3222, 3, 3235 }, 
+  { 0x3223, 3, 3238 }, 
+  { 0x3224, 3, 3241 }, 
+  { 0x3225, 3, 3244 }, 
+  { 0x3226, 3, 3247 }, 
+  { 0x3227, 3, 3250 }, 
+  { 0x3228, 3, 3253 }, 
+  { 0x3229, 3, 3256 }, 
+  { 0x322a, 3, 3259 }, 
+  { 0x322b, 3, 3262 }, 
+  { 0x322c, 3, 3265 }, 
+  { 0x322d, 3, 3268 }, 
+  { 0x322e, 3, 3271 }, 
+  { 0x322f, 3, 3274 }, 
+  { 0x3230, 3, 3277 }, 
+  { 0x3231, 3, 3280 }, 
+  { 0x3232, 3, 3283 }, 
+  { 0x3233, 3, 3286 }, 
+  { 0x3234, 3, 3289 }, 
+  { 0x3235, 3, 3292 }, 
+  { 0x3236, 3, 3295 }, 
+  { 0x3237, 3, 3298 }, 
+  { 0x3238, 3, 3301 }, 
+  { 0x3239, 3, 3304 }, 
+  { 0x323a, 3, 3307 }, 
+  { 0x323b, 3, 3310 }, 
+  { 0x323c, 3, 3313 }, 
+  { 0x323d, 3, 3316 }, 
+  { 0x323e, 3, 3319 }, 
+  { 0x323f, 3, 3322 }, 
+  { 0x3240, 3, 3325 }, 
+  { 0x3241, 3, 3328 }, 
+  { 0x3242, 3, 3331 }, 
+  { 0x3243, 3, 3334 }, 
+  { 0x3251, 2, 3337 }, 
+  { 0x3252, 2, 3339 }, 
+  { 0x3253, 2, 3341 }, 
+  { 0x3254, 2, 3343 }, 
+  { 0x3255, 2, 3345 }, 
+  { 0x3256, 2, 3347 }, 
+  { 0x3257, 2, 3349 }, 
+  { 0x3258, 2, 3351 }, 
+  { 0x3259, 2, 3353 }, 
+  { 0x325a, 2, 3355 }, 
+  { 0x325b, 2, 3357 }, 
+  { 0x325c, 2, 3359 }, 
+  { 0x325d, 2, 3361 }, 
+  { 0x325e, 2, 3363 }, 
+  { 0x325f, 2, 3365 }, 
+  { 0x3260, 1, 3023 }, 
+  { 0x3261, 1, 3026 }, 
+  { 0x3262, 1, 3029 }, 
+  { 0x3263, 1, 3031 }, 
+  { 0x3264, 1, 3039 }, 
+  { 0x3265, 1, 3040 }, 
+  { 0x3266, 1, 3043 }, 
+  { 0x3267, 1, 3045 }, 
+  { 0x3268, 1, 3046 }, 
+  { 0x3269, 1, 3048 }, 
+  { 0x326a, 1, 3049 }, 
+  { 0x326b, 1, 3050 }, 
+  { 0x326c, 1, 3051 }, 
+  { 0x326d, 1, 3052 }, 
+  { 0x326e, 2, 3367 }, 
+  { 0x326f, 2, 3369 }, 
+  { 0x3270, 2, 3371 }, 
+  { 0x3271, 2, 3373 }, 
+  { 0x3272, 2, 3375 }, 
+  { 0x3273, 2, 3377 }, 
+  { 0x3274, 2, 3379 }, 
+  { 0x3275, 2, 3381 }, 
+  { 0x3276, 2, 3383 }, 
+  { 0x3277, 2, 3385 }, 
+  { 0x3278, 2, 3387 }, 
+  { 0x3279, 2, 3389 }, 
+  { 0x327a, 2, 3391 }, 
+  { 0x327b, 2, 3393 }, 
+  { 0x3280, 1, 2682 }, 
+  { 0x3281, 1, 2688 }, 
+  { 0x3282, 1, 3117 }, 
+  { 0x3283, 1, 3118 }, 
+  { 0x3284, 1, 3395 }, 
+  { 0x3285, 1, 3396 }, 
+  { 0x3286, 1, 3397 }, 
+  { 0x3287, 1, 2693 }, 
+  { 0x3288, 1, 3398 }, 
+  { 0x3289, 1, 2705 }, 
+  { 0x328a, 1, 2755 }, 
+  { 0x328b, 1, 2767 }, 
+  { 0x328c, 1, 2766 }, 
+  { 0x328d, 1, 2756 }, 
+  { 0x328e, 1, 2848 }, 
+  { 0x328f, 1, 2713 }, 
+  { 0x3290, 1, 2753 }, 
+  { 0x3291, 1, 3399 }, 
+  { 0x3292, 1, 3400 }, 
+  { 0x3293, 1, 3401 }, 
+  { 0x3294, 1, 3402 }, 
+  { 0x3295, 1, 3403 }, 
+  { 0x3296, 1, 3404 }, 
+  { 0x3297, 1, 3405 }, 
+  { 0x3298, 1, 3406 }, 
+  { 0x3299, 1, 3407 }, 
+  { 0x329a, 1, 3408 }, 
+  { 0x329b, 1, 2719 }, 
+  { 0x329c, 1, 3409 }, 
+  { 0x329d, 1, 3410 }, 
+  { 0x329e, 1, 3411 }, 
+  { 0x329f, 1, 3412 }, 
+  { 0x32a0, 1, 3413 }, 
+  { 0x32a1, 1, 3414 }, 
+  { 0x32a2, 1, 3415 }, 
+  { 0x32a3, 1, 3416 }, 
+  { 0x32a4, 1, 3119 }, 
+  { 0x32a5, 1, 3120 }, 
+  { 0x32a6, 1, 3121 }, 
+  { 0x32a7, 1, 3417 }, 
+  { 0x32a8, 1, 3418 }, 
+  { 0x32a9, 1, 3419 }, 
+  { 0x32aa, 1, 3420 }, 
+  { 0x32ab, 1, 3421 }, 
+  { 0x32ac, 1, 3422 }, 
+  { 0x32ad, 1, 3423 }, 
+  { 0x32ae, 1, 3424 }, 
+  { 0x32af, 1, 3425 }, 
+  { 0x32b0, 1, 3426 }, 
+  { 0x32b1, 2, 3427 }, 
+  { 0x32b2, 2, 3429 }, 
+  { 0x32b3, 2, 3431 }, 
+  { 0x32b4, 2, 3433 }, 
+  { 0x32b5, 2, 3435 }, 
+  { 0x32b6, 2, 3437 }, 
+  { 0x32b7, 2, 3439 }, 
+  { 0x32b8, 2, 3441 }, 
+  { 0x32b9, 2, 3443 }, 
+  { 0x32ba, 2, 3445 }, 
+  { 0x32bb, 2, 3447 }, 
+  { 0x32bc, 2, 3449 }, 
+  { 0x32bd, 2, 3451 }, 
+  { 0x32be, 2, 3453 }, 
+  { 0x32bf, 2, 3455 }, 
+  { 0x32c0, 2, 3457 }, 
+  { 0x32c1, 2, 3459 }, 
+  { 0x32c2, 2, 3461 }, 
+  { 0x32c3, 2, 3463 }, 
+  { 0x32c4, 2, 3465 }, 
+  { 0x32c5, 2, 3467 }, 
+  { 0x32c6, 2, 3469 }, 
+  { 0x32c7, 2, 3471 }, 
+  { 0x32c8, 2, 3473 }, 
+  { 0x32c9, 3, 3475 }, 
+  { 0x32ca, 3, 3478 }, 
+  { 0x32cb, 3, 3481 }, 
+  { 0x32d0, 1, 3484 }, 
+  { 0x32d1, 1, 3485 }, 
+  { 0x32d2, 1, 3486 }, 
+  { 0x32d3, 1, 3487 }, 
+  { 0x32d4, 1, 3488 }, 
+  { 0x32d5, 1, 3489 }, 
+  { 0x32d6, 1, 3490 }, 
+  { 0x32d7, 1, 3491 }, 
+  { 0x32d8, 1, 3492 }, 
+  { 0x32d9, 1, 3493 }, 
+  { 0x32da, 1, 3494 }, 
+  { 0x32db, 1, 3495 }, 
+  { 0x32dc, 1, 3496 }, 
+  { 0x32dd, 1, 3497 }, 
+  { 0x32de, 1, 3498 }, 
+  { 0x32df, 1, 3499 }, 
+  { 0x32e0, 1, 3500 }, 
+  { 0x32e1, 1, 3501 }, 
+  { 0x32e2, 1, 3502 }, 
+  { 0x32e3, 1, 3503 }, 
+  { 0x32e4, 1, 3504 }, 
+  { 0x32e5, 1, 3505 }, 
+  { 0x32e6, 1, 3506 }, 
+  { 0x32e7, 1, 3507 }, 
+  { 0x32e8, 1, 3508 }, 
+  { 0x32e9, 1, 3509 }, 
+  { 0x32ea, 1, 3510 }, 
+  { 0x32eb, 1, 3511 }, 
+  { 0x32ec, 1, 3512 }, 
+  { 0x32ed, 1, 3513 }, 
+  { 0x32ee, 1, 3514 }, 
+  { 0x32ef, 1, 3515 }, 
+  { 0x32f0, 1, 3516 }, 
+  { 0x32f1, 1, 3517 }, 
+  { 0x32f2, 1, 3518 }, 
+  { 0x32f3, 1, 3519 }, 
+  { 0x32f4, 1, 3520 }, 
+  { 0x32f5, 1, 3521 }, 
+  { 0x32f6, 1, 3522 }, 
+  { 0x32f7, 1, 3523 }, 
+  { 0x32f8, 1, 3524 }, 
+  { 0x32f9, 1, 3525 }, 
+  { 0x32fa, 1, 3526 }, 
+  { 0x32fb, 1, 3527 }, 
+  { 0x32fc, 1, 3528 }, 
+  { 0x32fd, 1, 3529 }, 
+  { 0x32fe, 1, 3530 }, 
+  { 0x3300, 5, 3531 }, 
+  { 0x3301, 4, 3536 }, 
+  { 0x3302, 5, 3540 }, 
+  { 0x3303, 3, 3545 }, 
+  { 0x3304, 5, 3548 }, 
+  { 0x3305, 3, 3553 }, 
+  { 0x3306, 3, 3556 }, 
+  { 0x3307, 6, 3559 }, 
+  { 0x3308, 4, 3565 }, 
+  { 0x3309, 3, 3569 }, 
+  { 0x330a, 3, 3572 }, 
+  { 0x330b, 3, 3575 }, 
+  { 0x330c, 4, 3578 }, 
+  { 0x330d, 4, 3582 }, 
+  { 0x330e, 4, 3586 }, 
+  { 0x330f, 4, 3590 }, 
+  { 0x3310, 4, 3594 }, 
+  { 0x3311, 4, 3598 }, 
+  { 0x3312, 4, 3602 }, 
+  { 0x3313, 6, 3606 }, 
+  { 0x3314, 2, 3612 }, 
+  { 0x3315, 6, 3614 }, 
+  { 0x3316, 6, 3620 }, 
+  { 0x3317, 5, 3626 }, 
+  { 0x3318, 4, 3631 }, 
+  { 0x3319, 6, 3635 }, 
+  { 0x331a, 6, 3641 }, 
+  { 0x331b, 4, 3647 }, 
+  { 0x331c, 3, 3651 }, 
+  { 0x331d, 3, 3654 }, 
+  { 0x331e, 4, 3657 }, 
+  { 0x331f, 4, 3661 }, 
+  { 0x3320, 5, 3665 }, 
+  { 0x3321, 5, 3670 }, 
+  { 0x3322, 3, 3675 }, 
+  { 0x3323, 3, 3678 }, 
+  { 0x3324, 4, 3681 }, 
+  { 0x3325, 3, 3685 }, 
+  { 0x3326, 3, 3688 }, 
+  { 0x3327, 2, 3691 }, 
+  { 0x3328, 2, 3693 }, 
+  { 0x3329, 3, 3695 }, 
+  { 0x332a, 3, 3698 }, 
+  { 0x332b, 6, 3701 }, 
+  { 0x332c, 4, 3707 }, 
+  { 0x332d, 5, 3711 }, 
+  { 0x332e, 6, 3716 }, 
+  { 0x332f, 4, 3722 }, 
+  { 0x3330, 3, 3726 }, 
+  { 0x3331, 3, 3729 }, 
+  { 0x3332, 6, 3732 }, 
+  { 0x3333, 4, 3738 }, 
+  { 0x3334, 6, 3742 }, 
+  { 0x3335, 3, 3748 }, 
+  { 0x3336, 5, 3751 }, 
+  { 0x3337, 3, 3756 }, 
+  { 0x3338, 4, 3759 }, 
+  { 0x3339, 3, 3763 }, 
+  { 0x333a, 4, 3766 }, 
+  { 0x333b, 5, 3770 }, 
+  { 0x333c, 4, 3775 }, 
+  { 0x333d, 5, 3779 }, 
+  { 0x333e, 4, 3784 }, 
+  { 0x333f, 2, 3788 }, 
+  { 0x3340, 5, 3790 }, 
+  { 0x3341, 3, 3795 }, 
+  { 0x3342, 3, 3798 }, 
+  { 0x3343, 4, 3801 }, 
+  { 0x3344, 3, 3805 }, 
+  { 0x3345, 3, 3808 }, 
+  { 0x3346, 3, 3811 }, 
+  { 0x3347, 5, 3814 }, 
+  { 0x3348, 4, 3819 }, 
+  { 0x3349, 2, 3823 }, 
+  { 0x334a, 6, 3825 }, 
+  { 0x334b, 3, 3831 }, 
+  { 0x334c, 5, 3834 }, 
+  { 0x334d, 4, 3839 }, 
+  { 0x334e, 4, 3843 }, 
+  { 0x334f, 3, 3847 }, 
+  { 0x3350, 3, 3850 }, 
+  { 0x3351, 4, 3853 }, 
+  { 0x3352, 2, 3857 }, 
+  { 0x3353, 4, 3859 }, 
+  { 0x3354, 5, 3863 }, 
+  { 0x3355, 2, 3868 }, 
+  { 0x3356, 6, 3870 }, 
+  { 0x3357, 3, 3876 }, 
+  { 0x3358, 2, 3879 }, 
+  { 0x3359, 2, 3881 }, 
+  { 0x335a, 2, 3883 }, 
+  { 0x335b, 2, 3885 }, 
+  { 0x335c, 2, 3887 }, 
+  { 0x335d, 2, 3889 }, 
+  { 0x335e, 2, 3891 }, 
+  { 0x335f, 2, 3893 }, 
+  { 0x3360, 2, 3895 }, 
+  { 0x3361, 2, 3897 }, 
+  { 0x3362, 3, 3899 }, 
+  { 0x3363, 3, 3902 }, 
+  { 0x3364, 3, 3905 }, 
+  { 0x3365, 3, 3908 }, 
+  { 0x3366, 3, 3911 }, 
+  { 0x3367, 3, 3914 }, 
+  { 0x3368, 3, 3917 }, 
+  { 0x3369, 3, 3920 }, 
+  { 0x336a, 3, 3923 }, 
+  { 0x336b, 3, 3926 }, 
+  { 0x336c, 3, 3929 }, 
+  { 0x336d, 3, 3932 }, 
+  { 0x336e, 3, 3935 }, 
+  { 0x336f, 3, 3938 }, 
+  { 0x3370, 3, 3941 }, 
+  { 0x3371, 3, 3944 }, 
+  { 0x3372, 2, 3947 }, 
+  { 0x3373, 2, 3949 }, 
+  { 0x3374, 3, 3951 }, 
+  { 0x3375, 2, 3954 }, 
+  { 0x3376, 2, 3956 }, 
+  { 0x337b, 2, 3958 }, 
+  { 0x337c, 2, 3960 }, 
+  { 0x337d, 2, 3962 }, 
+  { 0x337e, 2, 3964 }, 
+  { 0x337f, 4, 3966 }, 
+  { 0x3380, 2, 3970 }, 
+  { 0x3381, 2, 3972 }, 
+  { 0x3382, 2, 3974 }, 
+  { 0x3383, 2, 3976 }, 
+  { 0x3384, 2, 3978 }, 
+  { 0x3385, 2, 3980 }, 
+  { 0x3386, 2, 3982 }, 
+  { 0x3387, 2, 3984 }, 
+  { 0x3388, 3, 3986 }, 
+  { 0x3389, 4, 3989 }, 
+  { 0x338a, 2, 3993 }, 
+  { 0x338b, 2, 3995 }, 
+  { 0x338c, 2, 3997 }, 
+  { 0x338d, 2, 3999 }, 
+  { 0x338e, 2, 4001 }, 
+  { 0x338f, 2, 4003 }, 
+  { 0x3390, 2, 4005 }, 
+  { 0x3391, 3, 4007 }, 
+  { 0x3392, 3, 4010 }, 
+  { 0x3393, 3, 4013 }, 
+  { 0x3394, 3, 4016 }, 
+  { 0x3395, 2, 4019 }, 
+  { 0x3396, 2, 4021 }, 
+  { 0x3397, 2, 4023 }, 
+  { 0x3398, 2, 4025 }, 
+  { 0x3399, 2, 4027 }, 
+  { 0x339a, 2, 4029 }, 
+  { 0x339b, 2, 4031 }, 
+  { 0x339c, 2, 4033 }, 
+  { 0x339d, 2, 4035 }, 
+  { 0x339e, 2, 4037 }, 
+  { 0x339f, 3, 4039 }, 
+  { 0x33a0, 3, 4042 }, 
+  { 0x33a1, 2, 4045 }, 
+  { 0x33a2, 3, 4047 }, 
+  { 0x33a3, 3, 4050 }, 
+  { 0x33a4, 3, 4053 }, 
+  { 0x33a5, 2, 4056 }, 
+  { 0x33a6, 3, 4058 }, 
+  { 0x33a7, 3, 4061 }, 
+  { 0x33a8, 4, 4064 }, 
+  { 0x33a9, 2, 4068 }, 
+  { 0x33aa, 3, 4070 }, 
+  { 0x33ab, 3, 4073 }, 
+  { 0x33ac, 3, 4076 }, 
+  { 0x33ad, 3, 4079 }, 
+  { 0x33ae, 5, 4082 }, 
+  { 0x33af, 6, 4087 }, 
+  { 0x33b0, 2, 4093 }, 
+  { 0x33b1, 2, 4095 }, 
+  { 0x33b2, 2, 4097 }, 
+  { 0x33b3, 2, 4099 }, 
+  { 0x33b4, 2, 4101 }, 
+  { 0x33b5, 2, 4103 }, 
+  { 0x33b6, 2, 4105 }, 
+  { 0x33b7, 2, 4107 }, 
+  { 0x33b8, 2, 4109 }, 
+  { 0x33b9, 2, 4111 }, 
+  { 0x33ba, 2, 4113 }, 
+  { 0x33bb, 2, 4115 }, 
+  { 0x33bc, 2, 4117 }, 
+  { 0x33bd, 2, 4119 }, 
+  { 0x33be, 2, 4121 }, 
+  { 0x33bf, 2, 4123 }, 
+  { 0x33c0, 2, 4125 }, 
+  { 0x33c1, 2, 4127 }, 
+  { 0x33c2, 4, 4129 }, 
+  { 0x33c3, 2, 4133 }, 
+  { 0x33c4, 2, 4135 }, 
+  { 0x33c5, 2, 4137 }, 
+  { 0x33c6, 4, 4139 }, 
+  { 0x33c7, 3, 4143 }, 
+  { 0x33c8, 2, 4146 }, 
+  { 0x33c9, 2, 4148 }, 
+  { 0x33ca, 2, 4150 }, 
+  { 0x33cb, 2, 4152 }, 
+  { 0x33cc, 2, 4154 }, 
+  { 0x33cd, 2, 4156 }, 
+  { 0x33ce, 2, 4158 }, 
+  { 0x33cf, 2, 4160 }, 
+  { 0x33d0, 2, 4162 }, 
+  { 0x33d1, 2, 4164 }, 
+  { 0x33d2, 3, 4166 }, 
+  { 0x33d3, 2, 4169 }, 
+  { 0x33d4, 2, 4171 }, 
+  { 0x33d5, 3, 4173 }, 
+  { 0x33d6, 3, 4176 }, 
+  { 0x33d7, 2, 4179 }, 
+  { 0x33d8, 4, 4181 }, 
+  { 0x33d9, 3, 4185 }, 
+  { 0x33da, 2, 4188 }, 
+  { 0x33db, 2, 4190 }, 
+  { 0x33dc, 2, 4192 }, 
+  { 0x33dd, 2, 4194 }, 
+  { 0x33e0, 2, 4196 }, 
+  { 0x33e1, 2, 4198 }, 
+  { 0x33e2, 2, 4200 }, 
+  { 0x33e3, 2, 4202 }, 
+  { 0x33e4, 2, 4204 }, 
+  { 0x33e5, 2, 4206 }, 
+  { 0x33e6, 2, 4208 }, 
+  { 0x33e7, 2, 4210 }, 
+  { 0x33e8, 2, 4212 }, 
+  { 0x33e9, 3, 4214 }, 
+  { 0x33ea, 3, 4217 }, 
+  { 0x33eb, 3, 4220 }, 
+  { 0x33ec, 3, 4223 }, 
+  { 0x33ed, 3, 4226 }, 
+  { 0x33ee, 3, 4229 }, 
+  { 0x33ef, 3, 4232 }, 
+  { 0x33f0, 3, 4235 }, 
+  { 0x33f1, 3, 4238 }, 
+  { 0x33f2, 3, 4241 }, 
+  { 0x33f3, 3, 4244 }, 
+  { 0x33f4, 3, 4247 }, 
+  { 0x33f5, 3, 4250 }, 
+  { 0x33f6, 3, 4253 }, 
+  { 0x33f7, 3, 4256 }, 
+  { 0x33f8, 3, 4259 }, 
+  { 0x33f9, 3, 4262 }, 
+  { 0x33fa, 3, 4265 }, 
+  { 0x33fb, 3, 4268 }, 
+  { 0x33fc, 3, 4271 }, 
+  { 0x33fd, 3, 4274 }, 
+  { 0x33fe, 3, 4277 }, 
+  { 0xf900, 1, 4280 }, 
+  { 0xf901, 1, 4281 }, 
+  { 0xf902, 1, 2840 }, 
+  { 0xf903, 1, 4282 }, 
+  { 0xf904, 1, 4283 }, 
+  { 0xf905, 1, 4284 }, 
+  { 0xf906, 1, 4285 }, 
+  { 0xf907, 1, 2894 }, 
+  { 0xf908, 1, 2894 }, 
+  { 0xf909, 1, 4286 }, 
+  { 0xf90a, 1, 2848 }, 
+  { 0xf90b, 1, 4287 }, 
+  { 0xf90c, 1, 4288 }, 
+  { 0xf90d, 1, 4289 }, 
+  { 0xf90e, 1, 4290 }, 
+  { 0xf90f, 1, 4291 }, 
+  { 0xf910, 1, 4292 }, 
+  { 0xf911, 1, 4293 }, 
+  { 0xf912, 1, 4294 }, 
+  { 0xf913, 1, 4295 }, 
+  { 0xf914, 1, 4296 }, 
+  { 0xf915, 1, 4297 }, 
+  { 0xf916, 1, 4298 }, 
+  { 0xf917, 1, 4299 }, 
+  { 0xf918, 1, 4300 }, 
+  { 0xf919, 1, 4301 }, 
+  { 0xf91a, 1, 4302 }, 
+  { 0xf91b, 1, 4303 }, 
+  { 0xf91c, 1, 4304 }, 
+  { 0xf91d, 1, 4305 }, 
+  { 0xf91e, 1, 4306 }, 
+  { 0xf91f, 1, 4307 }, 
+  { 0xf920, 1, 4308 }, 
+  { 0xf921, 1, 4309 }, 
+  { 0xf922, 1, 4310 }, 
+  { 0xf923, 1, 4311 }, 
+  { 0xf924, 1, 4312 }, 
+  { 0xf925, 1, 4313 }, 
+  { 0xf926, 1, 4314 }, 
+  { 0xf927, 1, 4315 }, 
+  { 0xf928, 1, 4316 }, 
+  { 0xf929, 1, 4317 }, 
+  { 0xf92a, 1, 4318 }, 
+  { 0xf92b, 1, 4319 }, 
+  { 0xf92c, 1, 4320 }, 
+  { 0xf92d, 1, 4321 }, 
+  { 0xf92e, 1, 4322 }, 
+  { 0xf92f, 1, 4323 }, 
+  { 0xf930, 1, 4324 }, 
+  { 0xf931, 1, 4325 }, 
+  { 0xf932, 1, 4326 }, 
+  { 0xf933, 1, 4327 }, 
+  { 0xf934, 1, 2806 }, 
+  { 0xf935, 1, 4328 }, 
+  { 0xf936, 1, 4329 }, 
+  { 0xf937, 1, 4330 }, 
+  { 0xf938, 1, 4331 }, 
+  { 0xf939, 1, 4332 }, 
+  { 0xf93a, 1, 4333 }, 
+  { 0xf93b, 1, 4334 }, 
+  { 0xf93c, 1, 4335 }, 
+  { 0xf93d, 1, 4336 }, 
+  { 0xf93e, 1, 4337 }, 
+  { 0xf93f, 1, 4338 }, 
+  { 0xf940, 1, 2879 }, 
+  { 0xf941, 1, 4339 }, 
+  { 0xf942, 1, 4340 }, 
+  { 0xf943, 1, 4341 }, 
+  { 0xf944, 1, 4342 }, 
+  { 0xf945, 1, 4343 }, 
+  { 0xf946, 1, 4344 }, 
+  { 0xf947, 1, 4345 }, 
+  { 0xf948, 1, 4346 }, 
+  { 0xf949, 1, 4347 }, 
+  { 0xf94a, 1, 4348 }, 
+  { 0xf94b, 1, 4349 }, 
+  { 0xf94c, 1, 4350 }, 
+  { 0xf94d, 1, 4351 }, 
+  { 0xf94e, 1, 4352 }, 
+  { 0xf94f, 1, 4353 }, 
+  { 0xf950, 1, 4354 }, 
+  { 0xf951, 1, 4355 }, 
+  { 0xf952, 1, 4356 }, 
+  { 0xf953, 1, 4357 }, 
+  { 0xf954, 1, 4358 }, 
+  { 0xf955, 1, 4359 }, 
+  { 0xf956, 1, 4360 }, 
+  { 0xf957, 1, 4361 }, 
+  { 0xf958, 1, 4362 }, 
+  { 0xf959, 1, 4363 }, 
+  { 0xf95a, 1, 4364 }, 
+  { 0xf95b, 1, 4365 }, 
+  { 0xf95c, 1, 4296 }, 
+  { 0xf95d, 1, 4366 }, 
+  { 0xf95e, 1, 4367 }, 
+  { 0xf95f, 1, 4368 }, 
+  { 0xf960, 1, 4369 }, 
+  { 0xf961, 1, 4370 }, 
+  { 0xf962, 1, 4371 }, 
+  { 0xf963, 1, 4372 }, 
+  { 0xf964, 1, 4373 }, 
+  { 0xf965, 1, 4374 }, 
+  { 0xf966, 1, 4375 }, 
+  { 0xf967, 1, 4376 }, 
+  { 0xf968, 1, 4377 }, 
+  { 0xf969, 1, 4378 }, 
+  { 0xf96a, 1, 4379 }, 
+  { 0xf96b, 1, 4380 }, 
+  { 0xf96c, 1, 4381 }, 
+  { 0xf96d, 1, 4382 }, 
+  { 0xf96e, 1, 4383 }, 
+  { 0xf96f, 1, 4384 }, 
+  { 0xf970, 1, 4385 }, 
+  { 0xf971, 1, 2842 }, 
+  { 0xf972, 1, 4386 }, 
+  { 0xf973, 1, 4387 }, 
+  { 0xf974, 1, 4388 }, 
+  { 0xf975, 1, 4389 }, 
+  { 0xf976, 1, 4390 }, 
+  { 0xf977, 1, 4391 }, 
+  { 0xf978, 1, 4392 }, 
+  { 0xf979, 1, 4393 }, 
+  { 0xf97a, 1, 4394 }, 
+  { 0xf97b, 1, 4395 }, 
+  { 0xf97c, 1, 4396 }, 
+  { 0xf97d, 1, 4397 }, 
+  { 0xf97e, 1, 4398 }, 
+  { 0xf97f, 1, 4399 }, 
+  { 0xf980, 1, 4400 }, 
+  { 0xf981, 1, 2719 }, 
+  { 0xf982, 1, 4401 }, 
+  { 0xf983, 1, 4402 }, 
+  { 0xf984, 1, 4403 }, 
+  { 0xf985, 1, 4404 }, 
+  { 0xf986, 1, 4405 }, 
+  { 0xf987, 1, 4406 }, 
+  { 0xf988, 1, 4407 }, 
+  { 0xf989, 1, 4408 }, 
+  { 0xf98a, 1, 2700 }, 
+  { 0xf98b, 1, 4409 }, 
+  { 0xf98c, 1, 4410 }, 
+  { 0xf98d, 1, 4411 }, 
+  { 0xf98e, 1, 4412 }, 
+  { 0xf98f, 1, 4413 }, 
+  { 0xf990, 1, 4414 }, 
+  { 0xf991, 1, 4415 }, 
+  { 0xf992, 1, 4416 }, 
+  { 0xf993, 1, 4417 }, 
+  { 0xf994, 1, 4418 }, 
+  { 0xf995, 1, 4419 }, 
+  { 0xf996, 1, 4420 }, 
+  { 0xf997, 1, 4421 }, 
+  { 0xf998, 1, 4422 }, 
+  { 0xf999, 1, 4423 }, 
+  { 0xf99a, 1, 4424 }, 
+  { 0xf99b, 1, 4425 }, 
+  { 0xf99c, 1, 4426 }, 
+  { 0xf99d, 1, 4427 }, 
+  { 0xf99e, 1, 4428 }, 
+  { 0xf99f, 1, 4429 }, 
+  { 0xf9a0, 1, 4430 }, 
+  { 0xf9a1, 1, 4384 }, 
+  { 0xf9a2, 1, 4431 }, 
+  { 0xf9a3, 1, 4432 }, 
+  { 0xf9a4, 1, 4433 }, 
+  { 0xf9a5, 1, 4434 }, 
+  { 0xf9a6, 1, 4435 }, 
+  { 0xf9a7, 1, 4436 }, 
+  { 0xf9a8, 1, 4437 }, 
+  { 0xf9a9, 1, 4438 }, 
+  { 0xf9aa, 1, 4368 }, 
+  { 0xf9ab, 1, 4439 }, 
+  { 0xf9ac, 1, 4440 }, 
+  { 0xf9ad, 1, 4441 }, 
+  { 0xf9ae, 1, 4442 }, 
+  { 0xf9af, 1, 4443 }, 
+  { 0xf9b0, 1, 4444 }, 
+  { 0xf9b1, 1, 4445 }, 
+  { 0xf9b2, 1, 4446 }, 
+  { 0xf9b3, 1, 4447 }, 
+  { 0xf9b4, 1, 4448 }, 
+  { 0xf9b5, 1, 4449 }, 
+  { 0xf9b6, 1, 4450 }, 
+  { 0xf9b7, 1, 4451 }, 
+  { 0xf9b8, 1, 4452 }, 
+  { 0xf9b9, 1, 4453 }, 
+  { 0xf9ba, 1, 4454 }, 
+  { 0xf9bb, 1, 4455 }, 
+  { 0xf9bc, 1, 4456 }, 
+  { 0xf9bd, 1, 4457 }, 
+  { 0xf9be, 1, 4458 }, 
+  { 0xf9bf, 1, 4296 }, 
+  { 0xf9c0, 1, 4459 }, 
+  { 0xf9c1, 1, 4460 }, 
+  { 0xf9c2, 1, 4461 }, 
+  { 0xf9c3, 1, 4462 }, 
+  { 0xf9c4, 1, 2893 }, 
+  { 0xf9c5, 1, 4463 }, 
+  { 0xf9c6, 1, 4464 }, 
+  { 0xf9c7, 1, 4465 }, 
+  { 0xf9c8, 1, 4466 }, 
+  { 0xf9c9, 1, 4467 }, 
+  { 0xf9ca, 1, 4468 }, 
+  { 0xf9cb, 1, 4469 }, 
+  { 0xf9cc, 1, 4470 }, 
+  { 0xf9cd, 1, 4471 }, 
+  { 0xf9ce, 1, 4472 }, 
+  { 0xf9cf, 1, 4473 }, 
+  { 0xf9d0, 1, 4474 }, 
+  { 0xf9d1, 1, 3396 }, 
+  { 0xf9d2, 1, 4475 }, 
+  { 0xf9d3, 1, 4476 }, 
+  { 0xf9d4, 1, 4477 }, 
+  { 0xf9d5, 1, 4478 }, 
+  { 0xf9d6, 1, 4479 }, 
+  { 0xf9d7, 1, 4480 }, 
+  { 0xf9d8, 1, 4481 }, 
+  { 0xf9d9, 1, 4482 }, 
+  { 0xf9da, 1, 4483 }, 
+  { 0xf9db, 1, 4370 }, 
+  { 0xf9dc, 1, 4484 }, 
+  { 0xf9dd, 1, 4485 }, 
+  { 0xf9de, 1, 4486 }, 
+  { 0xf9df, 1, 4487 }, 
+  { 0xf9e0, 1, 4488 }, 
+  { 0xf9e1, 1, 4489 }, 
+  { 0xf9e2, 1, 4490 }, 
+  { 0xf9e3, 1, 4491 }, 
+  { 0xf9e4, 1, 4492 }, 
+  { 0xf9e5, 1, 4493 }, 
+  { 0xf9e6, 1, 4494 }, 
+  { 0xf9e7, 1, 4495 }, 
+  { 0xf9e8, 1, 4496 }, 
+  { 0xf9e9, 1, 2847 }, 
+  { 0xf9ea, 1, 4497 }, 
+  { 0xf9eb, 1, 4498 }, 
+  { 0xf9ec, 1, 4499 }, 
+  { 0xf9ed, 1, 4500 }, 
+  { 0xf9ee, 1, 4501 }, 
+  { 0xf9ef, 1, 4502 }, 
+  { 0xf9f0, 1, 4503 }, 
+  { 0xf9f1, 1, 4504 }, 
+  { 0xf9f2, 1, 4505 }, 
+  { 0xf9f3, 1, 4506 }, 
+  { 0xf9f4, 1, 4507 }, 
+  { 0xf9f5, 1, 4508 }, 
+  { 0xf9f6, 1, 4509 }, 
+  { 0xf9f7, 1, 2798 }, 
+  { 0xf9f8, 1, 4510 }, 
+  { 0xf9f9, 1, 4511 }, 
+  { 0xf9fa, 1, 4512 }, 
+  { 0xf9fb, 1, 4513 }, 
+  { 0xf9fc, 1, 4514 }, 
+  { 0xf9fd, 1, 4515 }, 
+  { 0xf9fe, 1, 4516 }, 
+  { 0xf9ff, 1, 4517 }, 
+  { 0xfa00, 1, 4518 }, 
+  { 0xfa01, 1, 4519 }, 
+  { 0xfa02, 1, 4520 }, 
+  { 0xfa03, 1, 4521 }, 
+  { 0xfa04, 1, 4522 }, 
+  { 0xfa05, 1, 4523 }, 
+  { 0xfa06, 1, 4524 }, 
+  { 0xfa07, 1, 4525 }, 
+  { 0xfa08, 1, 2825 }, 
+  { 0xfa09, 1, 4526 }, 
+  { 0xfa0a, 1, 2828 }, 
+  { 0xfa0b, 1, 4527 }, 
+  { 0xfa0c, 1, 4528 }, 
+  { 0xfa0d, 1, 4529 }, 
+  { 0xfa10, 1, 4530 }, 
+  { 0xfa12, 1, 4531 }, 
+  { 0xfa15, 1, 4532 }, 
+  { 0xfa16, 1, 4533 }, 
+  { 0xfa17, 1, 4534 }, 
+  { 0xfa18, 1, 4535 }, 
+  { 0xfa19, 1, 4536 }, 
+  { 0xfa1a, 1, 4537 }, 
+  { 0xfa1b, 1, 4538 }, 
+  { 0xfa1c, 1, 4539 }, 
+  { 0xfa1d, 1, 4540 }, 
+  { 0xfa1e, 1, 2805 }, 
+  { 0xfa20, 1, 4541 }, 
+  { 0xfa22, 1, 4542 }, 
+  { 0xfa25, 1, 4543 }, 
+  { 0xfa26, 1, 4544 }, 
+  { 0xfa2a, 1, 4545 }, 
+  { 0xfa2b, 1, 4546 }, 
+  { 0xfa2c, 1, 4547 }, 
+  { 0xfa2d, 1, 4548 }, 
+  { 0xfa30, 1, 4549 }, 
+  { 0xfa31, 1, 4550 }, 
+  { 0xfa32, 1, 4551 }, 
+  { 0xfa33, 1, 4552 }, 
+  { 0xfa34, 1, 4553 }, 
+  { 0xfa35, 1, 4554 }, 
+  { 0xfa36, 1, 4555 }, 
+  { 0xfa37, 1, 4556 }, 
+  { 0xfa38, 1, 4557 }, 
+  { 0xfa39, 1, 4558 }, 
+  { 0xfa3a, 1, 4559 }, 
+  { 0xfa3b, 1, 4560 }, 
+  { 0xfa3c, 1, 2726 }, 
+  { 0xfa3d, 1, 4561 }, 
+  { 0xfa3e, 1, 4562 }, 
+  { 0xfa3f, 1, 4563 }, 
+  { 0xfa40, 1, 4564 }, 
+  { 0xfa41, 1, 4565 }, 
+  { 0xfa42, 1, 4566 }, 
+  { 0xfa43, 1, 4567 }, 
+  { 0xfa44, 1, 4568 }, 
+  { 0xfa45, 1, 4569 }, 
+  { 0xfa46, 1, 4570 }, 
+  { 0xfa47, 1, 4571 }, 
+  { 0xfa48, 1, 4572 }, 
+  { 0xfa49, 1, 4573 }, 
+  { 0xfa4a, 1, 4574 }, 
+  { 0xfa4b, 1, 4575 }, 
+  { 0xfa4c, 1, 3401 }, 
+  { 0xfa4d, 1, 4576 }, 
+  { 0xfa4e, 1, 4577 }, 
+  { 0xfa4f, 1, 4578 }, 
+  { 0xfa50, 1, 4579 }, 
+  { 0xfa51, 1, 3405 }, 
+  { 0xfa52, 1, 4580 }, 
+  { 0xfa53, 1, 4581 }, 
+  { 0xfa54, 1, 4582 }, 
+  { 0xfa55, 1, 4583 }, 
+  { 0xfa56, 1, 4584 }, 
+  { 0xfa57, 1, 4420 }, 
+  { 0xfa58, 1, 4585 }, 
+  { 0xfa59, 1, 4586 }, 
+  { 0xfa5a, 1, 4587 }, 
+  { 0xfa5b, 1, 4588 }, 
+  { 0xfa5c, 1, 4589 }, 
+  { 0xfa5d, 1, 4590 }, 
+  { 0xfa5e, 1, 4590 }, 
+  { 0xfa5f, 1, 4591 }, 
+  { 0xfa60, 1, 4592 }, 
+  { 0xfa61, 1, 4593 }, 
+  { 0xfa62, 1, 4594 }, 
+  { 0xfa63, 1, 4595 }, 
+  { 0xfa64, 1, 4596 }, 
+  { 0xfa65, 1, 4597 }, 
+  { 0xfa66, 1, 4598 }, 
+  { 0xfa67, 1, 4543 }, 
+  { 0xfa68, 1, 4599 }, 
+  { 0xfa69, 1, 4600 }, 
+  { 0xfa6a, 1, 4601 }, 
+  { 0xfb00, 2, 4602 }, 
+  { 0xfb01, 2, 4604 }, 
+  { 0xfb02, 2, 4606 }, 
+  { 0xfb03, 3, 4608 }, 
+  { 0xfb04, 3, 4611 }, 
+  { 0xfb05, 2, 4614 }, 
+  { 0xfb06, 2, 4614 }, 
+  { 0xfb13, 2, 4616 }, 
+  { 0xfb14, 2, 4618 }, 
+  { 0xfb15, 2, 4620 }, 
+  { 0xfb16, 2, 4622 }, 
+  { 0xfb17, 2, 4624 }, 
+  { 0xfb1d, 2, 4626 }, 
+  { 0xfb1f, 2, 4628 }, 
+  { 0xfb20, 1, 4630 }, 
+  { 0xfb21, 1, 2228 }, 
+  { 0xfb22, 1, 2231 }, 
+  { 0xfb23, 1, 4631 }, 
+  { 0xfb24, 1, 4632 }, 
+  { 0xfb25, 1, 4633 }, 
+  { 0xfb26, 1, 4634 }, 
+  { 0xfb27, 1, 4635 }, 
+  { 0xfb28, 1, 4636 }, 
+  { 0xfb29, 1, 2176 }, 
+  { 0xfb2a, 2, 4637 }, 
+  { 0xfb2b, 2, 4639 }, 
+  { 0xfb2c, 3, 4641 }, 
+  { 0xfb2d, 3, 4644 }, 
+  { 0xfb2e, 2, 4647 }, 
+  { 0xfb2f, 2, 4649 }, 
+  { 0xfb30, 2, 4651 }, 
+  { 0xfb31, 2, 4653 }, 
+  { 0xfb32, 2, 4655 }, 
+  { 0xfb33, 2, 4657 }, 
+  { 0xfb34, 2, 4659 }, 
+  { 0xfb35, 2, 4661 }, 
+  { 0xfb36, 2, 4663 }, 
+  { 0xfb38, 2, 4665 }, 
+  { 0xfb39, 2, 4667 }, 
+  { 0xfb3a, 2, 4669 }, 
+  { 0xfb3b, 2, 4671 }, 
+  { 0xfb3c, 2, 4673 }, 
+  { 0xfb3e, 2, 4675 }, 
+  { 0xfb40, 2, 4677 }, 
+  { 0xfb41, 2, 4679 }, 
+  { 0xfb43, 2, 4681 }, 
+  { 0xfb44, 2, 4683 }, 
+  { 0xfb46, 2, 4685 }, 
+  { 0xfb47, 2, 4687 }, 
+  { 0xfb48, 2, 4689 }, 
+  { 0xfb49, 2, 4691 }, 
+  { 0xfb4a, 2, 4693 }, 
+  { 0xfb4b, 2, 4695 }, 
+  { 0xfb4c, 2, 4697 }, 
+  { 0xfb4d, 2, 4699 }, 
+  { 0xfb4e, 2, 4701 }, 
+  { 0xfb4f, 2, 4703 }, 
+  { 0xfb50, 1, 4705 }, 
+  { 0xfb51, 1, 4705 }, 
+  { 0xfb52, 1, 4706 }, 
+  { 0xfb53, 1, 4706 }, 
+  { 0xfb54, 1, 4706 }, 
+  { 0xfb55, 1, 4706 }, 
+  { 0xfb56, 1, 4707 }, 
+  { 0xfb57, 1, 4707 }, 
+  { 0xfb58, 1, 4707 }, 
+  { 0xfb59, 1, 4707 }, 
+  { 0xfb5a, 1, 4708 }, 
+  { 0xfb5b, 1, 4708 }, 
+  { 0xfb5c, 1, 4708 }, 
+  { 0xfb5d, 1, 4708 }, 
+  { 0xfb5e, 1, 4709 }, 
+  { 0xfb5f, 1, 4709 }, 
+  { 0xfb60, 1, 4709 }, 
+  { 0xfb61, 1, 4709 }, 
+  { 0xfb62, 1, 4710 }, 
+  { 0xfb63, 1, 4710 }, 
+  { 0xfb64, 1, 4710 }, 
+  { 0xfb65, 1, 4710 }, 
+  { 0xfb66, 1, 4711 }, 
+  { 0xfb67, 1, 4711 }, 
+  { 0xfb68, 1, 4711 }, 
+  { 0xfb69, 1, 4711 }, 
+  { 0xfb6a, 1, 4712 }, 
+  { 0xfb6b, 1, 4712 }, 
+  { 0xfb6c, 1, 4712 }, 
+  { 0xfb6d, 1, 4712 }, 
+  { 0xfb6e, 1, 4713 }, 
+  { 0xfb6f, 1, 4713 }, 
+  { 0xfb70, 1, 4713 }, 
+  { 0xfb71, 1, 4713 }, 
+  { 0xfb72, 1, 4714 }, 
+  { 0xfb73, 1, 4714 }, 
+  { 0xfb74, 1, 4714 }, 
+  { 0xfb75, 1, 4714 }, 
+  { 0xfb76, 1, 4715 }, 
+  { 0xfb77, 1, 4715 }, 
+  { 0xfb78, 1, 4715 }, 
+  { 0xfb79, 1, 4715 }, 
+  { 0xfb7a, 1, 4716 }, 
+  { 0xfb7b, 1, 4716 }, 
+  { 0xfb7c, 1, 4716 }, 
+  { 0xfb7d, 1, 4716 }, 
+  { 0xfb7e, 1, 4717 }, 
+  { 0xfb7f, 1, 4717 }, 
+  { 0xfb80, 1, 4717 }, 
+  { 0xfb81, 1, 4717 }, 
+  { 0xfb82, 1, 4718 }, 
+  { 0xfb83, 1, 4718 }, 
+  { 0xfb84, 1, 4719 }, 
+  { 0xfb85, 1, 4719 }, 
+  { 0xfb86, 1, 4720 }, 
+  { 0xfb87, 1, 4720 }, 
+  { 0xfb88, 1, 4721 }, 
+  { 0xfb89, 1, 4721 }, 
+  { 0xfb8a, 1, 4722 }, 
+  { 0xfb8b, 1, 4722 }, 
+  { 0xfb8c, 1, 4723 }, 
+  { 0xfb8d, 1, 4723 }, 
+  { 0xfb8e, 1, 4724 }, 
+  { 0xfb8f, 1, 4724 }, 
+  { 0xfb90, 1, 4724 }, 
+  { 0xfb91, 1, 4724 }, 
+  { 0xfb92, 1, 4725 }, 
+  { 0xfb93, 1, 4725 }, 
+  { 0xfb94, 1, 4725 }, 
+  { 0xfb95, 1, 4725 }, 
+  { 0xfb96, 1, 4726 }, 
+  { 0xfb97, 1, 4726 }, 
+  { 0xfb98, 1, 4726 }, 
+  { 0xfb99, 1, 4726 }, 
+  { 0xfb9a, 1, 4727 }, 
+  { 0xfb9b, 1, 4727 }, 
+  { 0xfb9c, 1, 4727 }, 
+  { 0xfb9d, 1, 4727 }, 
+  { 0xfb9e, 1, 4728 }, 
+  { 0xfb9f, 1, 4728 }, 
+  { 0xfba0, 1, 4729 }, 
+  { 0xfba1, 1, 4729 }, 
+  { 0xfba2, 1, 4729 }, 
+  { 0xfba3, 1, 4729 }, 
+  { 0xfba4, 2, 802 }, 
+  { 0xfba5, 2, 802 }, 
+  { 0xfba6, 1, 4730 }, 
+  { 0xfba7, 1, 4730 }, 
+  { 0xfba8, 1, 4730 }, 
+  { 0xfba9, 1, 4730 }, 
+  { 0xfbaa, 1, 4731 }, 
+  { 0xfbab, 1, 4731 }, 
+  { 0xfbac, 1, 4731 }, 
+  { 0xfbad, 1, 4731 }, 
+  { 0xfbae, 1, 4732 }, 
+  { 0xfbaf, 1, 4732 }, 
+  { 0xfbb0, 2, 806 }, 
+  { 0xfbb1, 2, 806 }, 
+  { 0xfbd3, 1, 4733 }, 
+  { 0xfbd4, 1, 4733 }, 
+  { 0xfbd5, 1, 4733 }, 
+  { 0xfbd6, 1, 4733 }, 
+  { 0xfbd7, 1, 4734 }, 
+  { 0xfbd8, 1, 4734 }, 
+  { 0xfbd9, 1, 4735 }, 
+  { 0xfbda, 1, 4735 }, 
+  { 0xfbdb, 1, 4736 }, 
+  { 0xfbdc, 1, 4736 }, 
+  { 0xfbdd, 2, 798 }, 
+  { 0xfbde, 1, 4737 }, 
+  { 0xfbdf, 1, 4737 }, 
+  { 0xfbe0, 1, 4738 }, 
+  { 0xfbe1, 1, 4738 }, 
+  { 0xfbe2, 1, 4739 }, 
+  { 0xfbe3, 1, 4739 }, 
+  { 0xfbe4, 1, 4740 }, 
+  { 0xfbe5, 1, 4740 }, 
+  { 0xfbe6, 1, 4740 }, 
+  { 0xfbe7, 1, 4740 }, 
+  { 0xfbe8, 1, 4741 }, 
+  { 0xfbe9, 1, 4741 }, 
+  { 0xfbea, 3, 4742 }, 
+  { 0xfbeb, 3, 4742 }, 
+  { 0xfbec, 3, 4745 }, 
+  { 0xfbed, 3, 4745 }, 
+  { 0xfbee, 3, 4748 }, 
+  { 0xfbef, 3, 4748 }, 
+  { 0xfbf0, 3, 4751 }, 
+  { 0xfbf1, 3, 4751 }, 
+  { 0xfbf2, 3, 4754 }, 
+  { 0xfbf3, 3, 4754 }, 
+  { 0xfbf4, 3, 4757 }, 
+  { 0xfbf5, 3, 4757 }, 
+  { 0xfbf6, 3, 4760 }, 
+  { 0xfbf7, 3, 4760 }, 
+  { 0xfbf8, 3, 4760 }, 
+  { 0xfbf9, 3, 4763 }, 
+  { 0xfbfa, 3, 4763 }, 
+  { 0xfbfb, 3, 4763 }, 
+  { 0xfbfc, 1, 4766 }, 
+  { 0xfbfd, 1, 4766 }, 
+  { 0xfbfe, 1, 4766 }, 
+  { 0xfbff, 1, 4766 }, 
+  { 0xfc00, 3, 4767 }, 
+  { 0xfc01, 3, 4770 }, 
+  { 0xfc02, 3, 4773 }, 
+  { 0xfc03, 3, 4763 }, 
+  { 0xfc04, 3, 4776 }, 
+  { 0xfc05, 2, 4779 }, 
+  { 0xfc06, 2, 4781 }, 
+  { 0xfc07, 2, 4783 }, 
+  { 0xfc08, 2, 4785 }, 
+  { 0xfc09, 2, 4787 }, 
+  { 0xfc0a, 2, 4789 }, 
+  { 0xfc0b, 2, 4791 }, 
+  { 0xfc0c, 2, 4793 }, 
+  { 0xfc0d, 2, 4795 }, 
+  { 0xfc0e, 2, 4797 }, 
+  { 0xfc0f, 2, 4799 }, 
+  { 0xfc10, 2, 4801 }, 
+  { 0xfc11, 2, 4803 }, 
+  { 0xfc12, 2, 4805 }, 
+  { 0xfc13, 2, 4807 }, 
+  { 0xfc14, 2, 4809 }, 
+  { 0xfc15, 2, 4811 }, 
+  { 0xfc16, 2, 4813 }, 
+  { 0xfc17, 2, 4815 }, 
+  { 0xfc18, 2, 4817 }, 
+  { 0xfc19, 2, 4819 }, 
+  { 0xfc1a, 2, 4821 }, 
+  { 0xfc1b, 2, 4823 }, 
+  { 0xfc1c, 2, 4825 }, 
+  { 0xfc1d, 2, 4827 }, 
+  { 0xfc1e, 2, 4829 }, 
+  { 0xfc1f, 2, 4831 }, 
+  { 0xfc20, 2, 4833 }, 
+  { 0xfc21, 2, 4835 }, 
+  { 0xfc22, 2, 4837 }, 
+  { 0xfc23, 2, 4839 }, 
+  { 0xfc24, 2, 4841 }, 
+  { 0xfc25, 2, 4843 }, 
+  { 0xfc26, 2, 4845 }, 
+  { 0xfc27, 2, 4847 }, 
+  { 0xfc28, 2, 4849 }, 
+  { 0xfc29, 2, 4851 }, 
+  { 0xfc2a, 2, 4853 }, 
+  { 0xfc2b, 2, 4855 }, 
+  { 0xfc2c, 2, 4857 }, 
+  { 0xfc2d, 2, 4859 }, 
+  { 0xfc2e, 2, 4861 }, 
+  { 0xfc2f, 2, 4863 }, 
+  { 0xfc30, 2, 4865 }, 
+  { 0xfc31, 2, 4867 }, 
+  { 0xfc32, 2, 4869 }, 
+  { 0xfc33, 2, 4871 }, 
+  { 0xfc34, 2, 4873 }, 
+  { 0xfc35, 2, 4875 }, 
+  { 0xfc36, 2, 4877 }, 
+  { 0xfc37, 2, 4879 }, 
+  { 0xfc38, 2, 4881 }, 
+  { 0xfc39, 2, 4883 }, 
+  { 0xfc3a, 2, 4885 }, 
+  { 0xfc3b, 2, 4887 }, 
+  { 0xfc3c, 2, 4889 }, 
+  { 0xfc3d, 2, 4891 }, 
+  { 0xfc3e, 2, 4893 }, 
+  { 0xfc3f, 2, 4895 }, 
+  { 0xfc40, 2, 4897 }, 
+  { 0xfc41, 2, 4899 }, 
+  { 0xfc42, 2, 4901 }, 
+  { 0xfc43, 2, 4903 }, 
+  { 0xfc44, 2, 4905 }, 
+  { 0xfc45, 2, 4907 }, 
+  { 0xfc46, 2, 4909 }, 
+  { 0xfc47, 2, 4911 }, 
+  { 0xfc48, 2, 4913 }, 
+  { 0xfc49, 2, 4915 }, 
+  { 0xfc4a, 2, 4917 }, 
+  { 0xfc4b, 2, 4919 }, 
+  { 0xfc4c, 2, 4921 }, 
+  { 0xfc4d, 2, 4923 }, 
+  { 0xfc4e, 2, 4925 }, 
+  { 0xfc4f, 2, 4927 }, 
+  { 0xfc50, 2, 4929 }, 
+  { 0xfc51, 2, 4931 }, 
+  { 0xfc52, 2, 4933 }, 
+  { 0xfc53, 2, 4935 }, 
+  { 0xfc54, 2, 4937 }, 
+  { 0xfc55, 2, 4939 }, 
+  { 0xfc56, 2, 4941 }, 
+  { 0xfc57, 2, 4943 }, 
+  { 0xfc58, 2, 4945 }, 
+  { 0xfc59, 2, 4947 }, 
+  { 0xfc5a, 2, 4949 }, 
+  { 0xfc5b, 2, 4951 }, 
+  { 0xfc5c, 2, 4953 }, 
+  { 0xfc5d, 2, 4955 }, 
+  { 0xfc5e, 3, 4957 }, 
+  { 0xfc5f, 3, 4960 }, 
+  { 0xfc60, 3, 4963 }, 
+  { 0xfc61, 3, 4966 }, 
+  { 0xfc62, 3, 4969 }, 
+  { 0xfc63, 3, 4972 }, 
+  { 0xfc64, 3, 4975 }, 
+  { 0xfc65, 3, 4978 }, 
+  { 0xfc66, 3, 4773 }, 
+  { 0xfc67, 3, 4981 }, 
+  { 0xfc68, 3, 4763 }, 
+  { 0xfc69, 3, 4776 }, 
+  { 0xfc6a, 2, 4984 }, 
+  { 0xfc6b, 2, 4986 }, 
+  { 0xfc6c, 2, 4785 }, 
+  { 0xfc6d, 2, 4988 }, 
+  { 0xfc6e, 2, 4787 }, 
+  { 0xfc6f, 2, 4789 }, 
+  { 0xfc70, 2, 4990 }, 
+  { 0xfc71, 2, 4992 }, 
+  { 0xfc72, 2, 4797 }, 
+  { 0xfc73, 2, 4994 }, 
+  { 0xfc74, 2, 4799 }, 
+  { 0xfc75, 2, 4801 }, 
+  { 0xfc76, 2, 4996 }, 
+  { 0xfc77, 2, 4998 }, 
+  { 0xfc78, 2, 4805 }, 
+  { 0xfc79, 2, 5000 }, 
+  { 0xfc7a, 2, 4807 }, 
+  { 0xfc7b, 2, 4809 }, 
+  { 0xfc7c, 2, 4867 }, 
+  { 0xfc7d, 2, 4869 }, 
+  { 0xfc7e, 2, 4875 }, 
+  { 0xfc7f, 2, 4877 }, 
+  { 0xfc80, 2, 4879 }, 
+  { 0xfc81, 2, 4887 }, 
+  { 0xfc82, 2, 4889 }, 
+  { 0xfc83, 2, 4891 }, 
+  { 0xfc84, 2, 4893 }, 
+  { 0xfc85, 2, 4901 }, 
+  { 0xfc86, 2, 4903 }, 
+  { 0xfc87, 2, 4905 }, 
+  { 0xfc88, 2, 5002 }, 
+  { 0xfc89, 2, 4913 }, 
+  { 0xfc8a, 2, 5004 }, 
+  { 0xfc8b, 2, 5006 }, 
+  { 0xfc8c, 2, 4925 }, 
+  { 0xfc8d, 2, 5008 }, 
+  { 0xfc8e, 2, 4927 }, 
+  { 0xfc8f, 2, 4929 }, 
+  { 0xfc90, 2, 4955 }, 
+  { 0xfc91, 2, 5010 }, 
+  { 0xfc92, 2, 5012 }, 
+  { 0xfc93, 2, 4945 }, 
+  { 0xfc94, 2, 5014 }, 
+  { 0xfc95, 2, 4947 }, 
+  { 0xfc96, 2, 4949 }, 
+  { 0xfc97, 3, 4767 }, 
+  { 0xfc98, 3, 4770 }, 
+  { 0xfc99, 3, 5016 }, 
+  { 0xfc9a, 3, 4773 }, 
+  { 0xfc9b, 3, 5019 }, 
+  { 0xfc9c, 2, 4779 }, 
+  { 0xfc9d, 2, 4781 }, 
+  { 0xfc9e, 2, 4783 }, 
+  { 0xfc9f, 2, 4785 }, 
+  { 0xfca0, 2, 5022 }, 
+  { 0xfca1, 2, 4791 }, 
+  { 0xfca2, 2, 4793 }, 
+  { 0xfca3, 2, 4795 }, 
+  { 0xfca4, 2, 4797 }, 
+  { 0xfca5, 2, 5024 }, 
+  { 0xfca6, 2, 4805 }, 
+  { 0xfca7, 2, 4811 }, 
+  { 0xfca8, 2, 4813 }, 
+  { 0xfca9, 2, 4815 }, 
+  { 0xfcaa, 2, 4817 }, 
+  { 0xfcab, 2, 4819 }, 
+  { 0xfcac, 2, 4823 }, 
+  { 0xfcad, 2, 4825 }, 
+  { 0xfcae, 2, 4827 }, 
+  { 0xfcaf, 2, 4829 }, 
+  { 0xfcb0, 2, 4831 }, 
+  { 0xfcb1, 2, 4833 }, 
+  { 0xfcb2, 2, 5026 }, 
+  { 0xfcb3, 2, 4835 }, 
+  { 0xfcb4, 2, 4837 }, 
+  { 0xfcb5, 2, 4839 }, 
+  { 0xfcb6, 2, 4841 }, 
+  { 0xfcb7, 2, 4843 }, 
+  { 0xfcb8, 2, 4845 }, 
+  { 0xfcb9, 2, 4849 }, 
+  { 0xfcba, 2, 4851 }, 
+  { 0xfcbb, 2, 4853 }, 
+  { 0xfcbc, 2, 4855 }, 
+  { 0xfcbd, 2, 4857 }, 
+  { 0xfcbe, 2, 4859 }, 
+  { 0xfcbf, 2, 4861 }, 
+  { 0xfcc0, 2, 4863 }, 
+  { 0xfcc1, 2, 4865 }, 
+  { 0xfcc2, 2, 4871 }, 
+  { 0xfcc3, 2, 4873 }, 
+  { 0xfcc4, 2, 4881 }, 
+  { 0xfcc5, 2, 4883 }, 
+  { 0xfcc6, 2, 4885 }, 
+  { 0xfcc7, 2, 4887 }, 
+  { 0xfcc8, 2, 4889 }, 
+  { 0xfcc9, 2, 4895 }, 
+  { 0xfcca, 2, 4897 }, 
+  { 0xfccb, 2, 4899 }, 
+  { 0xfccc, 2, 4901 }, 
+  { 0xfccd, 2, 5028 }, 
+  { 0xfcce, 2, 4907 }, 
+  { 0xfccf, 2, 4909 }, 
+  { 0xfcd0, 2, 4911 }, 
+  { 0xfcd1, 2, 4913 }, 
+  { 0xfcd2, 2, 4919 }, 
+  { 0xfcd3, 2, 4921 }, 
+  { 0xfcd4, 2, 4923 }, 
+  { 0xfcd5, 2, 4925 }, 
+  { 0xfcd6, 2, 5030 }, 
+  { 0xfcd7, 2, 4931 }, 
+  { 0xfcd8, 2, 4933 }, 
+  { 0xfcd9, 2, 5032 }, 
+  { 0xfcda, 2, 4939 }, 
+  { 0xfcdb, 2, 4941 }, 
+  { 0xfcdc, 2, 4943 }, 
+  { 0xfcdd, 2, 4945 }, 
+  { 0xfcde, 2, 5034 }, 
+  { 0xfcdf, 3, 4773 }, 
+  { 0xfce0, 3, 5019 }, 
+  { 0xfce1, 2, 4785 }, 
+  { 0xfce2, 2, 5022 }, 
+  { 0xfce3, 2, 4797 }, 
+  { 0xfce4, 2, 5024 }, 
+  { 0xfce5, 2, 4805 }, 
+  { 0xfce6, 2, 5036 }, 
+  { 0xfce7, 2, 4831 }, 
+  { 0xfce8, 2, 5038 }, 
+  { 0xfce9, 2, 5040 }, 
+  { 0xfcea, 2, 5042 }, 
+  { 0xfceb, 2, 4887 }, 
+  { 0xfcec, 2, 4889 }, 
+  { 0xfced, 2, 4901 }, 
+  { 0xfcee, 2, 4925 }, 
+  { 0xfcef, 2, 5030 }, 
+  { 0xfcf0, 2, 4945 }, 
+  { 0xfcf1, 2, 5034 }, 
+  { 0xfcf2, 3, 5044 }, 
+  { 0xfcf3, 3, 5047 }, 
+  { 0xfcf4, 3, 5050 }, 
+  { 0xfcf5, 2, 5053 }, 
+  { 0xfcf6, 2, 5055 }, 
+  { 0xfcf7, 2, 5057 }, 
+  { 0xfcf8, 2, 5059 }, 
+  { 0xfcf9, 2, 5061 }, 
+  { 0xfcfa, 2, 5063 }, 
+  { 0xfcfb, 2, 5065 }, 
+  { 0xfcfc, 2, 5067 }, 
+  { 0xfcfd, 2, 5069 }, 
+  { 0xfcfe, 2, 5071 }, 
+  { 0xfcff, 2, 5073 }, 
+  { 0xfd00, 2, 5075 }, 
+  { 0xfd01, 2, 5077 }, 
+  { 0xfd02, 2, 5079 }, 
+  { 0xfd03, 2, 5081 }, 
+  { 0xfd04, 2, 5083 }, 
+  { 0xfd05, 2, 5085 }, 
+  { 0xfd06, 2, 5087 }, 
+  { 0xfd07, 2, 5089 }, 
+  { 0xfd08, 2, 5091 }, 
+  { 0xfd09, 2, 5093 }, 
+  { 0xfd0a, 2, 5095 }, 
+  { 0xfd0b, 2, 5097 }, 
+  { 0xfd0c, 2, 5040 }, 
+  { 0xfd0d, 2, 5099 }, 
+  { 0xfd0e, 2, 5101 }, 
+  { 0xfd0f, 2, 5103 }, 
+  { 0xfd10, 2, 5105 }, 
+  { 0xfd11, 2, 5053 }, 
+  { 0xfd12, 2, 5055 }, 
+  { 0xfd13, 2, 5057 }, 
+  { 0xfd14, 2, 5059 }, 
+  { 0xfd15, 2, 5061 }, 
+  { 0xfd16, 2, 5063 }, 
+  { 0xfd17, 2, 5065 }, 
+  { 0xfd18, 2, 5067 }, 
+  { 0xfd19, 2, 5069 }, 
+  { 0xfd1a, 2, 5071 }, 
+  { 0xfd1b, 2, 5073 }, 
+  { 0xfd1c, 2, 5075 }, 
+  { 0xfd1d, 2, 5077 }, 
+  { 0xfd1e, 2, 5079 }, 
+  { 0xfd1f, 2, 5081 }, 
+  { 0xfd20, 2, 5083 }, 
+  { 0xfd21, 2, 5085 }, 
+  { 0xfd22, 2, 5087 }, 
+  { 0xfd23, 2, 5089 }, 
+  { 0xfd24, 2, 5091 }, 
+  { 0xfd25, 2, 5093 }, 
+  { 0xfd26, 2, 5095 }, 
+  { 0xfd27, 2, 5097 }, 
+  { 0xfd28, 2, 5040 }, 
+  { 0xfd29, 2, 5099 }, 
+  { 0xfd2a, 2, 5101 }, 
+  { 0xfd2b, 2, 5103 }, 
+  { 0xfd2c, 2, 5105 }, 
+  { 0xfd2d, 2, 5093 }, 
+  { 0xfd2e, 2, 5095 }, 
+  { 0xfd2f, 2, 5097 }, 
+  { 0xfd30, 2, 5040 }, 
+  { 0xfd31, 2, 5038 }, 
+  { 0xfd32, 2, 5042 }, 
+  { 0xfd33, 2, 4847 }, 
+  { 0xfd34, 2, 4825 }, 
+  { 0xfd35, 2, 4827 }, 
+  { 0xfd36, 2, 4829 }, 
+  { 0xfd37, 2, 5093 }, 
+  { 0xfd38, 2, 5095 }, 
+  { 0xfd39, 2, 5097 }, 
+  { 0xfd3a, 2, 4847 }, 
+  { 0xfd3b, 2, 4849 }, 
+  { 0xfd3c, 2, 5107 }, 
+  { 0xfd3d, 2, 5107 }, 
+  { 0xfd50, 3, 5109 }, 
+  { 0xfd51, 3, 5112 }, 
+  { 0xfd52, 3, 5112 }, 
+  { 0xfd53, 3, 5115 }, 
+  { 0xfd54, 3, 5118 }, 
+  { 0xfd55, 3, 5121 }, 
+  { 0xfd56, 3, 5124 }, 
+  { 0xfd57, 3, 5127 }, 
+  { 0xfd58, 3, 5130 }, 
+  { 0xfd59, 3, 5130 }, 
+  { 0xfd5a, 3, 5133 }, 
+  { 0xfd5b, 3, 5136 }, 
+  { 0xfd5c, 3, 5139 }, 
+  { 0xfd5d, 3, 5142 }, 
+  { 0xfd5e, 3, 5145 }, 
+  { 0xfd5f, 3, 5148 }, 
+  { 0xfd60, 3, 5148 }, 
+  { 0xfd61, 3, 5151 }, 
+  { 0xfd62, 3, 5154 }, 
+  { 0xfd63, 3, 5154 }, 
+  { 0xfd64, 3, 5157 }, 
+  { 0xfd65, 3, 5157 }, 
+  { 0xfd66, 3, 5160 }, 
+  { 0xfd67, 3, 5163 }, 
+  { 0xfd68, 3, 5163 }, 
+  { 0xfd69, 3, 5166 }, 
+  { 0xfd6a, 3, 5169 }, 
+  { 0xfd6b, 3, 5169 }, 
+  { 0xfd6c, 3, 5172 }, 
+  { 0xfd6d, 3, 5172 }, 
+  { 0xfd6e, 3, 5175 }, 
+  { 0xfd6f, 3, 5178 }, 
+  { 0xfd70, 3, 5178 }, 
+  { 0xfd71, 3, 5181 }, 
+  { 0xfd72, 3, 5181 }, 
+  { 0xfd73, 3, 5184 }, 
+  { 0xfd74, 3, 5187 }, 
+  { 0xfd75, 3, 5190 }, 
+  { 0xfd76, 3, 5193 }, 
+  { 0xfd77, 3, 5193 }, 
+  { 0xfd78, 3, 5196 }, 
+  { 0xfd79, 3, 5199 }, 
+  { 0xfd7a, 3, 5202 }, 
+  { 0xfd7b, 3, 5205 }, 
+  { 0xfd7c, 3, 5208 }, 
+  { 0xfd7d, 3, 5208 }, 
+  { 0xfd7e, 3, 5211 }, 
+  { 0xfd7f, 3, 5214 }, 
+  { 0xfd80, 3, 5217 }, 
+  { 0xfd81, 3, 5220 }, 
+  { 0xfd82, 3, 5223 }, 
+  { 0xfd83, 3, 5226 }, 
+  { 0xfd84, 3, 5226 }, 
+  { 0xfd85, 3, 5229 }, 
+  { 0xfd86, 3, 5229 }, 
+  { 0xfd87, 3, 5232 }, 
+  { 0xfd88, 3, 5232 }, 
+  { 0xfd89, 3, 5235 }, 
+  { 0xfd8a, 3, 5238 }, 
+  { 0xfd8b, 3, 5241 }, 
+  { 0xfd8c, 3, 5244 }, 
+  { 0xfd8d, 3, 5247 }, 
+  { 0xfd8e, 3, 5250 }, 
+  { 0xfd8f, 3, 5253 }, 
+  { 0xfd92, 3, 5256 }, 
+  { 0xfd93, 3, 5259 }, 
+  { 0xfd94, 3, 5262 }, 
+  { 0xfd95, 3, 5265 }, 
+  { 0xfd96, 3, 5268 }, 
+  { 0xfd97, 3, 5271 }, 
+  { 0xfd98, 3, 5271 }, 
+  { 0xfd99, 3, 5274 }, 
+  { 0xfd9a, 3, 5277 }, 
+  { 0xfd9b, 3, 5280 }, 
+  { 0xfd9c, 3, 5283 }, 
+  { 0xfd9d, 3, 5283 }, 
+  { 0xfd9e, 3, 5286 }, 
+  { 0xfd9f, 3, 5289 }, 
+  { 0xfda0, 3, 5292 }, 
+  { 0xfda1, 3, 5295 }, 
+  { 0xfda2, 3, 5298 }, 
+  { 0xfda3, 3, 5301 }, 
+  { 0xfda4, 3, 5304 }, 
+  { 0xfda5, 3, 5307 }, 
+  { 0xfda6, 3, 5310 }, 
+  { 0xfda7, 3, 5313 }, 
+  { 0xfda8, 3, 5316 }, 
+  { 0xfda9, 3, 5319 }, 
+  { 0xfdaa, 3, 5322 }, 
+  { 0xfdab, 3, 5325 }, 
+  { 0xfdac, 3, 5328 }, 
+  { 0xfdad, 3, 5331 }, 
+  { 0xfdae, 3, 5334 }, 
+  { 0xfdaf, 3, 5337 }, 
+  { 0xfdb0, 3, 5340 }, 
+  { 0xfdb1, 3, 5343 }, 
+  { 0xfdb2, 3, 5346 }, 
+  { 0xfdb3, 3, 5349 }, 
+  { 0xfdb4, 3, 5211 }, 
+  { 0xfdb5, 3, 5217 }, 
+  { 0xfdb6, 3, 5352 }, 
+  { 0xfdb7, 3, 5355 }, 
+  { 0xfdb8, 3, 5358 }, 
+  { 0xfdb9, 3, 5361 }, 
+  { 0xfdba, 3, 5364 }, 
+  { 0xfdbb, 3, 5367 }, 
+  { 0xfdbc, 3, 5364 }, 
+  { 0xfdbd, 3, 5358 }, 
+  { 0xfdbe, 3, 5370 }, 
+  { 0xfdbf, 3, 5373 }, 
+  { 0xfdc0, 3, 5376 }, 
+  { 0xfdc1, 3, 5379 }, 
+  { 0xfdc2, 3, 5382 }, 
+  { 0xfdc3, 3, 5367 }, 
+  { 0xfdc4, 3, 5190 }, 
+  { 0xfdc5, 3, 5160 }, 
+  { 0xfdc6, 3, 5385 }, 
+  { 0xfdc7, 3, 5388 }, 
+  { 0xfdf0, 3, 5391 }, 
+  { 0xfdf1, 3, 5394 }, 
+  { 0xfdf2, 4, 5397 }, 
+  { 0xfdf3, 4, 5401 }, 
+  { 0xfdf4, 4, 5405 }, 
+  { 0xfdf5, 4, 5409 }, 
+  { 0xfdf6, 4, 5413 }, 
+  { 0xfdf7, 4, 5417 }, 
+  { 0xfdf8, 4, 5421 }, 
+  { 0xfdf9, 3, 5425 }, 
+  { 0xfdfa, 18, 5428 }, 
+  { 0xfdfb, 8, 5446 }, 
+  { 0xfdfc, 4, 5454 }, 
+  { 0xfe30, 2, 2139 }, 
+  { 0xfe31, 1, 5458 }, 
+  { 0xfe32, 1, 5459 }, 
+  { 0xfe33, 1, 5460 }, 
+  { 0xfe34, 1, 5460 }, 
+  { 0xfe35, 1, 2179 }, 
+  { 0xfe36, 1, 2180 }, 
+  { 0xfe37, 1, 5461 }, 
+  { 0xfe38, 1, 5462 }, 
+  { 0xfe39, 1, 5463 }, 
+  { 0xfe3a, 1, 5464 }, 
+  { 0xfe3b, 1, 5465 }, 
+  { 0xfe3c, 1, 5466 }, 
+  { 0xfe3d, 1, 5467 }, 
+  { 0xfe3e, 1, 5468 }, 
+  { 0xfe3f, 1, 2425 }, 
+  { 0xfe40, 1, 2426 }, 
+  { 0xfe41, 1, 5469 }, 
+  { 0xfe42, 1, 5470 }, 
+  { 0xfe43, 1, 5471 }, 
+  { 0xfe44, 1, 5472 }, 
+  { 0xfe49, 2, 2156 }, 
+  { 0xfe4a, 2, 2156 }, 
+  { 0xfe4b, 2, 2156 }, 
+  { 0xfe4c, 2, 2156 }, 
+  { 0xfe4d, 1, 5460 }, 
+  { 0xfe4e, 1, 5460 }, 
+  { 0xfe4f, 1, 5460 }, 
+  { 0xfe50, 1, 5473 }, 
+  { 0xfe51, 1, 5474 }, 
+  { 0xfe52, 1, 2138 }, 
+  { 0xfe54, 1, 621 }, 
+  { 0xfe55, 1, 5475 }, 
+  { 0xfe56, 1, 5476 }, 
+  { 0xfe57, 1, 5477 }, 
+  { 0xfe58, 1, 5458 }, 
+  { 0xfe59, 1, 2179 }, 
+  { 0xfe5a, 1, 2180 }, 
+  { 0xfe5b, 1, 5461 }, 
+  { 0xfe5c, 1, 5462 }, 
+  { 0xfe5d, 1, 5463 }, 
+  { 0xfe5e, 1, 5464 }, 
+  { 0xfe5f, 1, 5478 }, 
+  { 0xfe60, 1, 5479 }, 
+  { 0xfe61, 1, 5480 }, 
+  { 0xfe62, 1, 2176 }, 
+  { 0xfe63, 1, 5481 }, 
+  { 0xfe64, 1, 5482 }, 
+  { 0xfe65, 1, 5483 }, 
+  { 0xfe66, 1, 2178 }, 
+  { 0xfe68, 1, 5484 }, 
+  { 0xfe69, 1, 5485 }, 
+  { 0xfe6a, 1, 5486 }, 
+  { 0xfe6b, 1, 5487 }, 
+  { 0xfe70, 2, 5488 }, 
+  { 0xfe71, 2, 5490 }, 
+  { 0xfe72, 2, 5492 }, 
+  { 0xfe74, 2, 5494 }, 
+  { 0xfe76, 2, 5496 }, 
+  { 0xfe77, 2, 5498 }, 
+  { 0xfe78, 2, 5500 }, 
+  { 0xfe79, 2, 5502 }, 
+  { 0xfe7a, 2, 5504 }, 
+  { 0xfe7b, 2, 5506 }, 
+  { 0xfe7c, 2, 5508 }, 
+  { 0xfe7d, 2, 5510 }, 
+  { 0xfe7e, 2, 5512 }, 
+  { 0xfe7f, 2, 5514 }, 
+  { 0xfe80, 1, 5516 }, 
+  { 0xfe81, 2, 784 }, 
+  { 0xfe82, 2, 784 }, 
+  { 0xfe83, 2, 786 }, 
+  { 0xfe84, 2, 786 }, 
+  { 0xfe85, 2, 788 }, 
+  { 0xfe86, 2, 788 }, 
+  { 0xfe87, 2, 790 }, 
+  { 0xfe88, 2, 790 }, 
+  { 0xfe89, 2, 792 }, 
+  { 0xfe8a, 2, 792 }, 
+  { 0xfe8b, 2, 792 }, 
+  { 0xfe8c, 2, 792 }, 
+  { 0xfe8d, 1, 5517 }, 
+  { 0xfe8e, 1, 5517 }, 
+  { 0xfe8f, 1, 5518 }, 
+  { 0xfe90, 1, 5518 }, 
+  { 0xfe91, 1, 5518 }, 
+  { 0xfe92, 1, 5518 }, 
+  { 0xfe93, 1, 5519 }, 
+  { 0xfe94, 1, 5519 }, 
+  { 0xfe95, 1, 5520 }, 
+  { 0xfe96, 1, 5520 }, 
+  { 0xfe97, 1, 5520 }, 
+  { 0xfe98, 1, 5520 }, 
+  { 0xfe99, 1, 5521 }, 
+  { 0xfe9a, 1, 5521 }, 
+  { 0xfe9b, 1, 5521 }, 
+  { 0xfe9c, 1, 5521 }, 
+  { 0xfe9d, 1, 5522 }, 
+  { 0xfe9e, 1, 5522 }, 
+  { 0xfe9f, 1, 5522 }, 
+  { 0xfea0, 1, 5522 }, 
+  { 0xfea1, 1, 5523 }, 
+  { 0xfea2, 1, 5523 }, 
+  { 0xfea3, 1, 5523 }, 
+  { 0xfea4, 1, 5523 }, 
+  { 0xfea5, 1, 5524 }, 
+  { 0xfea6, 1, 5524 }, 
+  { 0xfea7, 1, 5524 }, 
+  { 0xfea8, 1, 5524 }, 
+  { 0xfea9, 1, 5525 }, 
+  { 0xfeaa, 1, 5525 }, 
+  { 0xfeab, 1, 5526 }, 
+  { 0xfeac, 1, 5526 }, 
+  { 0xfead, 1, 5527 }, 
+  { 0xfeae, 1, 5527 }, 
+  { 0xfeaf, 1, 5528 }, 
+  { 0xfeb0, 1, 5528 }, 
+  { 0xfeb1, 1, 5529 }, 
+  { 0xfeb2, 1, 5529 }, 
+  { 0xfeb3, 1, 5529 }, 
+  { 0xfeb4, 1, 5529 }, 
+  { 0xfeb5, 1, 5530 }, 
+  { 0xfeb6, 1, 5530 }, 
+  { 0xfeb7, 1, 5530 }, 
+  { 0xfeb8, 1, 5530 }, 
+  { 0xfeb9, 1, 5531 }, 
+  { 0xfeba, 1, 5531 }, 
+  { 0xfebb, 1, 5531 }, 
+  { 0xfebc, 1, 5531 }, 
+  { 0xfebd, 1, 5532 }, 
+  { 0xfebe, 1, 5532 }, 
+  { 0xfebf, 1, 5532 }, 
+  { 0xfec0, 1, 5532 }, 
+  { 0xfec1, 1, 5533 }, 
+  { 0xfec2, 1, 5533 }, 
+  { 0xfec3, 1, 5533 }, 
+  { 0xfec4, 1, 5533 }, 
+  { 0xfec5, 1, 5534 }, 
+  { 0xfec6, 1, 5534 }, 
+  { 0xfec7, 1, 5534 }, 
+  { 0xfec8, 1, 5534 }, 
+  { 0xfec9, 1, 5535 }, 
+  { 0xfeca, 1, 5535 }, 
+  { 0xfecb, 1, 5535 }, 
+  { 0xfecc, 1, 5535 }, 
+  { 0xfecd, 1, 5536 }, 
+  { 0xfece, 1, 5536 }, 
+  { 0xfecf, 1, 5536 }, 
+  { 0xfed0, 1, 5536 }, 
+  { 0xfed1, 1, 5537 }, 
+  { 0xfed2, 1, 5537 }, 
+  { 0xfed3, 1, 5537 }, 
+  { 0xfed4, 1, 5537 }, 
+  { 0xfed5, 1, 5538 }, 
+  { 0xfed6, 1, 5538 }, 
+  { 0xfed7, 1, 5538 }, 
+  { 0xfed8, 1, 5538 }, 
+  { 0xfed9, 1, 5539 }, 
+  { 0xfeda, 1, 5539 }, 
+  { 0xfedb, 1, 5539 }, 
+  { 0xfedc, 1, 5539 }, 
+  { 0xfedd, 1, 5540 }, 
+  { 0xfede, 1, 5540 }, 
+  { 0xfedf, 1, 5540 }, 
+  { 0xfee0, 1, 5540 }, 
+  { 0xfee1, 1, 5541 }, 
+  { 0xfee2, 1, 5541 }, 
+  { 0xfee3, 1, 5541 }, 
+  { 0xfee4, 1, 5541 }, 
+  { 0xfee5, 1, 5542 }, 
+  { 0xfee6, 1, 5542 }, 
+  { 0xfee7, 1, 5542 }, 
+  { 0xfee8, 1, 5542 }, 
+  { 0xfee9, 1, 5543 }, 
+  { 0xfeea, 1, 5543 }, 
+  { 0xfeeb, 1, 5543 }, 
+  { 0xfeec, 1, 5543 }, 
+  { 0xfeed, 1, 5544 }, 
+  { 0xfeee, 1, 5544 }, 
+  { 0xfeef, 1, 4741 }, 
+  { 0xfef0, 1, 4741 }, 
+  { 0xfef1, 1, 5545 }, 
+  { 0xfef2, 1, 5545 }, 
+  { 0xfef3, 1, 5545 }, 
+  { 0xfef4, 1, 5545 }, 
+  { 0xfef5, 3, 5546 }, 
+  { 0xfef6, 3, 5546 }, 
+  { 0xfef7, 3, 5549 }, 
+  { 0xfef8, 3, 5549 }, 
+  { 0xfef9, 3, 5552 }, 
+  { 0xfefa, 3, 5552 }, 
+  { 0xfefb, 2, 5555 }, 
+  { 0xfefc, 2, 5555 }, 
+  { 0xff01, 1, 5477 }, 
+  { 0xff02, 1, 5557 }, 
+  { 0xff03, 1, 5478 }, 
+  { 0xff04, 1, 5485 }, 
+  { 0xff05, 1, 5486 }, 
+  { 0xff06, 1, 5479 }, 
+  { 0xff07, 1, 5558 }, 
+  { 0xff08, 1, 2179 }, 
+  { 0xff09, 1, 2180 }, 
+  { 0xff0a, 1, 5480 }, 
+  { 0xff0b, 1, 2176 }, 
+  { 0xff0c, 1, 5473 }, 
+  { 0xff0d, 1, 5481 }, 
+  { 0xff0e, 1, 2138 }, 
+  { 0xff0f, 1, 5559 }, 
+  { 0xff10, 1, 2168 }, 
+  { 0xff11, 1, 13 }, 
+  { 0xff12, 1, 6 }, 
+  { 0xff13, 1, 7 }, 
+  { 0xff14, 1, 2170 }, 
+  { 0xff15, 1, 2171 }, 
+  { 0xff16, 1, 2172 }, 
+  { 0xff17, 1, 2173 }, 
+  { 0xff18, 1, 2174 }, 
+  { 0xff19, 1, 2175 }, 
+  { 0xff1a, 1, 5475 }, 
+  { 0xff1b, 1, 621 }, 
+  { 0xff1c, 1, 5482 }, 
+  { 0xff1d, 1, 2178 }, 
+  { 0xff1e, 1, 5483 }, 
+  { 0xff1f, 1, 5476 }, 
+  { 0xff20, 1, 5487 }, 
+  { 0xff21, 1, 2649 }, 
+  { 0xff22, 1, 2223 }, 
+  { 0xff23, 1, 2190 }, 
+  { 0xff24, 1, 2236 }, 
+  { 0xff25, 1, 2225 }, 
+  { 0xff26, 1, 2226 }, 
+  { 0xff27, 1, 2650 }, 
+  { 0xff28, 1, 2203 }, 
+  { 0xff29, 1, 2205 }, 
+  { 0xff2a, 1, 2651 }, 
+  { 0xff2b, 1, 2222 }, 
+  { 0xff2c, 1, 2206 }, 
+  { 0xff2d, 1, 2227 }, 
+  { 0xff2e, 1, 2207 }, 
+  { 0xff2f, 1, 2652 }, 
+  { 0xff30, 1, 2210 }, 
+  { 0xff31, 1, 2211 }, 
+  { 0xff32, 1, 2212 }, 
+  { 0xff33, 1, 2653 }, 
+  { 0xff34, 1, 2654 }, 
+  { 0xff35, 1, 2655 }, 
+  { 0xff36, 1, 2283 }, 
+  { 0xff37, 1, 2656 }, 
+  { 0xff38, 1, 2295 }, 
+  { 0xff39, 1, 2657 }, 
+  { 0xff3a, 1, 2220 }, 
+  { 0xff3b, 1, 5560 }, 
+  { 0xff3c, 1, 5484 }, 
+  { 0xff3d, 1, 5561 }, 
+  { 0xff3e, 1, 5562 }, 
+  { 0xff3f, 1, 5460 }, 
+  { 0xff40, 1, 2113 }, 
+  { 0xff41, 1, 3 }, 
+  { 0xff42, 1, 2658 }, 
+  { 0xff43, 1, 2325 }, 
+  { 0xff44, 1, 2237 }, 
+  { 0xff45, 1, 2224 }, 
+  { 0xff46, 1, 2659 }, 
+  { 0xff47, 1, 2202 }, 
+  { 0xff48, 1, 588 }, 
+  { 0xff49, 1, 2169 }, 
+  { 0xff4a, 1, 590 }, 
+  { 0xff4b, 1, 2660 }, 
+  { 0xff4c, 1, 610 }, 
+  { 0xff4d, 1, 2326 }, 
+  { 0xff4e, 1, 2181 }, 
+  { 0xff4f, 1, 14 }, 
+  { 0xff50, 1, 2661 }, 
+  { 0xff51, 1, 2662 }, 
+  { 0xff52, 1, 591 }, 
+  { 0xff53, 1, 356 }, 
+  { 0xff54, 1, 2663 }, 
+  { 0xff55, 1, 2664 }, 
+  { 0xff56, 1, 2308 }, 
+  { 0xff57, 1, 595 }, 
+  { 0xff58, 1, 611 }, 
+  { 0xff59, 1, 596 }, 
+  { 0xff5a, 1, 2665 }, 
+  { 0xff5b, 1, 5461 }, 
+  { 0xff5c, 1, 5563 }, 
+  { 0xff5d, 1, 5462 }, 
+  { 0xff5e, 1, 5564 }, 
+  { 0xff5f, 1, 5565 }, 
+  { 0xff60, 1, 5566 }, 
+  { 0xff61, 1, 5567 }, 
+  { 0xff62, 1, 5469 }, 
+  { 0xff63, 1, 5470 }, 
+  { 0xff64, 1, 5474 }, 
+  { 0xff65, 1, 5568 }, 
+  { 0xff66, 1, 3530 }, 
+  { 0xff67, 1, 5569 }, 
+  { 0xff68, 1, 5570 }, 
+  { 0xff69, 1, 5571 }, 
+  { 0xff6a, 1, 5572 }, 
+  { 0xff6b, 1, 5573 }, 
+  { 0xff6c, 1, 5574 }, 
+  { 0xff6d, 1, 5575 }, 
+  { 0xff6e, 1, 5576 }, 
+  { 0xff6f, 1, 5577 }, 
+  { 0xff70, 1, 5578 }, 
+  { 0xff71, 1, 3484 }, 
+  { 0xff72, 1, 3485 }, 
+  { 0xff73, 1, 3486 }, 
+  { 0xff74, 1, 3487 }, 
+  { 0xff75, 1, 3488 }, 
+  { 0xff76, 1, 3489 }, 
+  { 0xff77, 1, 3490 }, 
+  { 0xff78, 1, 3491 }, 
+  { 0xff79, 1, 3492 }, 
+  { 0xff7a, 1, 3493 }, 
+  { 0xff7b, 1, 3494 }, 
+  { 0xff7c, 1, 3495 }, 
+  { 0xff7d, 1, 3496 }, 
+  { 0xff7e, 1, 3497 }, 
+  { 0xff7f, 1, 3498 }, 
+  { 0xff80, 1, 3499 }, 
+  { 0xff81, 1, 3500 }, 
+  { 0xff82, 1, 3501 }, 
+  { 0xff83, 1, 3502 }, 
+  { 0xff84, 1, 3503 }, 
+  { 0xff85, 1, 3504 }, 
+  { 0xff86, 1, 3505 }, 
+  { 0xff87, 1, 3506 }, 
+  { 0xff88, 1, 3507 }, 
+  { 0xff89, 1, 3508 }, 
+  { 0xff8a, 1, 3509 }, 
+  { 0xff8b, 1, 3510 }, 
+  { 0xff8c, 1, 3511 }, 
+  { 0xff8d, 1, 3512 }, 
+  { 0xff8e, 1, 3513 }, 
+  { 0xff8f, 1, 3514 }, 
+  { 0xff90, 1, 3515 }, 
+  { 0xff91, 1, 3516 }, 
+  { 0xff92, 1, 3517 }, 
+  { 0xff93, 1, 3518 }, 
+  { 0xff94, 1, 3519 }, 
+  { 0xff95, 1, 3520 }, 
+  { 0xff96, 1, 3521 }, 
+  { 0xff97, 1, 3522 }, 
+  { 0xff98, 1, 3523 }, 
+  { 0xff99, 1, 3524 }, 
+  { 0xff9a, 1, 3525 }, 
+  { 0xff9b, 1, 3526 }, 
+  { 0xff9c, 1, 3527 }, 
+  { 0xff9d, 1, 5579 }, 
+  { 0xff9e, 1, 5580 }, 
+  { 0xff9f, 1, 5581 }, 
+  { 0xffa0, 1, 3074 }, 
+  { 0xffa1, 1, 3023 }, 
+  { 0xffa2, 1, 3024 }, 
+  { 0xffa3, 1, 3025 }, 
+  { 0xffa4, 1, 3026 }, 
+  { 0xffa5, 1, 3027 }, 
+  { 0xffa6, 1, 3028 }, 
+  { 0xffa7, 1, 3029 }, 
+  { 0xffa8, 1, 3030 }, 
+  { 0xffa9, 1, 3031 }, 
+  { 0xffaa, 1, 3032 }, 
+  { 0xffab, 1, 3033 }, 
+  { 0xffac, 1, 3034 }, 
+  { 0xffad, 1, 3035 }, 
+  { 0xffae, 1, 3036 }, 
+  { 0xffaf, 1, 3037 }, 
+  { 0xffb0, 1, 3038 }, 
+  { 0xffb1, 1, 3039 }, 
+  { 0xffb2, 1, 3040 }, 
+  { 0xffb3, 1, 3041 }, 
+  { 0xffb4, 1, 3042 }, 
+  { 0xffb5, 1, 3043 }, 
+  { 0xffb6, 1, 3044 }, 
+  { 0xffb7, 1, 3045 }, 
+  { 0xffb8, 1, 3046 }, 
+  { 0xffb9, 1, 3047 }, 
+  { 0xffba, 1, 3048 }, 
+  { 0xffbb, 1, 3049 }, 
+  { 0xffbc, 1, 3050 }, 
+  { 0xffbd, 1, 3051 }, 
+  { 0xffbe, 1, 3052 }, 
+  { 0xffc2, 1, 3053 }, 
+  { 0xffc3, 1, 3054 }, 
+  { 0xffc4, 1, 3055 }, 
+  { 0xffc5, 1, 3056 }, 
+  { 0xffc6, 1, 3057 }, 
+  { 0xffc7, 1, 3058 }, 
+  { 0xffca, 1, 3059 }, 
+  { 0xffcb, 1, 3060 }, 
+  { 0xffcc, 1, 3061 }, 
+  { 0xffcd, 1, 3062 }, 
+  { 0xffce, 1, 3063 }, 
+  { 0xffcf, 1, 3064 }, 
+  { 0xffd2, 1, 3065 }, 
+  { 0xffd3, 1, 3066 }, 
+  { 0xffd4, 1, 3067 }, 
+  { 0xffd5, 1, 3068 }, 
+  { 0xffd6, 1, 3069 }, 
+  { 0xffd7, 1, 3070 }, 
+  { 0xffda, 1, 3071 }, 
+  { 0xffdb, 1, 3072 }, 
+  { 0xffdc, 1, 3073 }, 
+  { 0xffe0, 1, 5582 }, 
+  { 0xffe1, 1, 5583 }, 
+  { 0xffe2, 1, 5584 }, 
+  { 0xffe3, 2, 4 }, 
+  { 0xffe4, 1, 5585 }, 
+  { 0xffe5, 1, 5586 }, 
+  { 0xffe6, 1, 5587 }, 
+  { 0xffe8, 1, 5588 }, 
+  { 0xffe9, 1, 5589 }, 
+  { 0xffea, 1, 5590 }, 
+  { 0xffeb, 1, 5591 }, 
+  { 0xffec, 1, 5592 }, 
+  { 0xffed, 1, 5593 }, 
+  { 0xffee, 1, 5594 }, 
+  { 0x1d15e, 2, 5595 }, 
+  { 0x1d15f, 2, 5597 }, 
+  { 0x1d160, 3, 5599 }, 
+  { 0x1d161, 3, 5602 }, 
+  { 0x1d162, 3, 5605 }, 
+  { 0x1d163, 3, 5608 }, 
+  { 0x1d164, 3, 5611 }, 
+  { 0x1d1bb, 2, 5614 }, 
+  { 0x1d1bc, 2, 5616 }, 
+  { 0x1d1bd, 3, 5618 }, 
+  { 0x1d1be, 3, 5621 }, 
+  { 0x1d1bf, 3, 5624 }, 
+  { 0x1d1c0, 3, 5627 }, 
+  { 0x1d400, 1, 2649 }, 
+  { 0x1d401, 1, 2223 }, 
+  { 0x1d402, 1, 2190 }, 
+  { 0x1d403, 1, 2236 }, 
+  { 0x1d404, 1, 2225 }, 
+  { 0x1d405, 1, 2226 }, 
+  { 0x1d406, 1, 2650 }, 
+  { 0x1d407, 1, 2203 }, 
+  { 0x1d408, 1, 2205 }, 
+  { 0x1d409, 1, 2651 }, 
+  { 0x1d40a, 1, 2222 }, 
+  { 0x1d40b, 1, 2206 }, 
+  { 0x1d40c, 1, 2227 }, 
+  { 0x1d40d, 1, 2207 }, 
+  { 0x1d40e, 1, 2652 }, 
+  { 0x1d40f, 1, 2210 }, 
+  { 0x1d410, 1, 2211 }, 
+  { 0x1d411, 1, 2212 }, 
+  { 0x1d412, 1, 2653 }, 
+  { 0x1d413, 1, 2654 }, 
+  { 0x1d414, 1, 2655 }, 
+  { 0x1d415, 1, 2283 }, 
+  { 0x1d416, 1, 2656 }, 
+  { 0x1d417, 1, 2295 }, 
+  { 0x1d418, 1, 2657 }, 
+  { 0x1d419, 1, 2220 }, 
+  { 0x1d41a, 1, 3 }, 
+  { 0x1d41b, 1, 2658 }, 
+  { 0x1d41c, 1, 2325 }, 
+  { 0x1d41d, 1, 2237 }, 
+  { 0x1d41e, 1, 2224 }, 
+  { 0x1d41f, 1, 2659 }, 
+  { 0x1d420, 1, 2202 }, 
+  { 0x1d421, 1, 588 }, 
+  { 0x1d422, 1, 2169 }, 
+  { 0x1d423, 1, 590 }, 
+  { 0x1d424, 1, 2660 }, 
+  { 0x1d425, 1, 610 }, 
+  { 0x1d426, 1, 2326 }, 
+  { 0x1d427, 1, 2181 }, 
+  { 0x1d428, 1, 14 }, 
+  { 0x1d429, 1, 2661 }, 
+  { 0x1d42a, 1, 2662 }, 
+  { 0x1d42b, 1, 591 }, 
+  { 0x1d42c, 1, 356 }, 
+  { 0x1d42d, 1, 2663 }, 
+  { 0x1d42e, 1, 2664 }, 
+  { 0x1d42f, 1, 2308 }, 
+  { 0x1d430, 1, 595 }, 
+  { 0x1d431, 1, 611 }, 
+  { 0x1d432, 1, 596 }, 
+  { 0x1d433, 1, 2665 }, 
+  { 0x1d434, 1, 2649 }, 
+  { 0x1d435, 1, 2223 }, 
+  { 0x1d436, 1, 2190 }, 
+  { 0x1d437, 1, 2236 }, 
+  { 0x1d438, 1, 2225 }, 
+  { 0x1d439, 1, 2226 }, 
+  { 0x1d43a, 1, 2650 }, 
+  { 0x1d43b, 1, 2203 }, 
+  { 0x1d43c, 1, 2205 }, 
+  { 0x1d43d, 1, 2651 }, 
+  { 0x1d43e, 1, 2222 }, 
+  { 0x1d43f, 1, 2206 }, 
+  { 0x1d440, 1, 2227 }, 
+  { 0x1d441, 1, 2207 }, 
+  { 0x1d442, 1, 2652 }, 
+  { 0x1d443, 1, 2210 }, 
+  { 0x1d444, 1, 2211 }, 
+  { 0x1d445, 1, 2212 }, 
+  { 0x1d446, 1, 2653 }, 
+  { 0x1d447, 1, 2654 }, 
+  { 0x1d448, 1, 2655 }, 
+  { 0x1d449, 1, 2283 }, 
+  { 0x1d44a, 1, 2656 }, 
+  { 0x1d44b, 1, 2295 }, 
+  { 0x1d44c, 1, 2657 }, 
+  { 0x1d44d, 1, 2220 }, 
+  { 0x1d44e, 1, 3 }, 
+  { 0x1d44f, 1, 2658 }, 
+  { 0x1d450, 1, 2325 }, 
+  { 0x1d451, 1, 2237 }, 
+  { 0x1d452, 1, 2224 }, 
+  { 0x1d453, 1, 2659 }, 
+  { 0x1d454, 1, 2202 }, 
+  { 0x1d456, 1, 2169 }, 
+  { 0x1d457, 1, 590 }, 
+  { 0x1d458, 1, 2660 }, 
+  { 0x1d459, 1, 610 }, 
+  { 0x1d45a, 1, 2326 }, 
+  { 0x1d45b, 1, 2181 }, 
+  { 0x1d45c, 1, 14 }, 
+  { 0x1d45d, 1, 2661 }, 
+  { 0x1d45e, 1, 2662 }, 
+  { 0x1d45f, 1, 591 }, 
+  { 0x1d460, 1, 356 }, 
+  { 0x1d461, 1, 2663 }, 
+  { 0x1d462, 1, 2664 }, 
+  { 0x1d463, 1, 2308 }, 
+  { 0x1d464, 1, 595 }, 
+  { 0x1d465, 1, 611 }, 
+  { 0x1d466, 1, 596 }, 
+  { 0x1d467, 1, 2665 }, 
+  { 0x1d468, 1, 2649 }, 
+  { 0x1d469, 1, 2223 }, 
+  { 0x1d46a, 1, 2190 }, 
+  { 0x1d46b, 1, 2236 }, 
+  { 0x1d46c, 1, 2225 }, 
+  { 0x1d46d, 1, 2226 }, 
+  { 0x1d46e, 1, 2650 }, 
+  { 0x1d46f, 1, 2203 }, 
+  { 0x1d470, 1, 2205 }, 
+  { 0x1d471, 1, 2651 }, 
+  { 0x1d472, 1, 2222 }, 
+  { 0x1d473, 1, 2206 }, 
+  { 0x1d474, 1, 2227 }, 
+  { 0x1d475, 1, 2207 }, 
+  { 0x1d476, 1, 2652 }, 
+  { 0x1d477, 1, 2210 }, 
+  { 0x1d478, 1, 2211 }, 
+  { 0x1d479, 1, 2212 }, 
+  { 0x1d47a, 1, 2653 }, 
+  { 0x1d47b, 1, 2654 }, 
+  { 0x1d47c, 1, 2655 }, 
+  { 0x1d47d, 1, 2283 }, 
+  { 0x1d47e, 1, 2656 }, 
+  { 0x1d47f, 1, 2295 }, 
+  { 0x1d480, 1, 2657 }, 
+  { 0x1d481, 1, 2220 }, 
+  { 0x1d482, 1, 3 }, 
+  { 0x1d483, 1, 2658 }, 
+  { 0x1d484, 1, 2325 }, 
+  { 0x1d485, 1, 2237 }, 
+  { 0x1d486, 1, 2224 }, 
+  { 0x1d487, 1, 2659 }, 
+  { 0x1d488, 1, 2202 }, 
+  { 0x1d489, 1, 588 }, 
+  { 0x1d48a, 1, 2169 }, 
+  { 0x1d48b, 1, 590 }, 
+  { 0x1d48c, 1, 2660 }, 
+  { 0x1d48d, 1, 610 }, 
+  { 0x1d48e, 1, 2326 }, 
+  { 0x1d48f, 1, 2181 }, 
+  { 0x1d490, 1, 14 }, 
+  { 0x1d491, 1, 2661 }, 
+  { 0x1d492, 1, 2662 }, 
+  { 0x1d493, 1, 591 }, 
+  { 0x1d494, 1, 356 }, 
+  { 0x1d495, 1, 2663 }, 
+  { 0x1d496, 1, 2664 }, 
+  { 0x1d497, 1, 2308 }, 
+  { 0x1d498, 1, 595 }, 
+  { 0x1d499, 1, 611 }, 
+  { 0x1d49a, 1, 596 }, 
+  { 0x1d49b, 1, 2665 }, 
+  { 0x1d49c, 1, 2649 }, 
+  { 0x1d49e, 1, 2190 }, 
+  { 0x1d49f, 1, 2236 }, 
+  { 0x1d4a2, 1, 2650 }, 
+  { 0x1d4a5, 1, 2651 }, 
+  { 0x1d4a6, 1, 2222 }, 
+  { 0x1d4a9, 1, 2207 }, 
+  { 0x1d4aa, 1, 2652 }, 
+  { 0x1d4ab, 1, 2210 }, 
+  { 0x1d4ac, 1, 2211 }, 
+  { 0x1d4ae, 1, 2653 }, 
+  { 0x1d4af, 1, 2654 }, 
+  { 0x1d4b0, 1, 2655 }, 
+  { 0x1d4b1, 1, 2283 }, 
+  { 0x1d4b2, 1, 2656 }, 
+  { 0x1d4b3, 1, 2295 }, 
+  { 0x1d4b4, 1, 2657 }, 
+  { 0x1d4b5, 1, 2220 }, 
+  { 0x1d4b6, 1, 3 }, 
+  { 0x1d4b7, 1, 2658 }, 
+  { 0x1d4b8, 1, 2325 }, 
+  { 0x1d4b9, 1, 2237 }, 
+  { 0x1d4bb, 1, 2659 }, 
+  { 0x1d4bd, 1, 588 }, 
+  { 0x1d4be, 1, 2169 }, 
+  { 0x1d4bf, 1, 590 }, 
+  { 0x1d4c0, 1, 2660 }, 
+  { 0x1d4c2, 1, 2326 }, 
+  { 0x1d4c3, 1, 2181 }, 
+  { 0x1d4c5, 1, 2661 }, 
+  { 0x1d4c6, 1, 2662 }, 
+  { 0x1d4c7, 1, 591 }, 
+  { 0x1d4c8, 1, 356 }, 
+  { 0x1d4c9, 1, 2663 }, 
+  { 0x1d4ca, 1, 2664 }, 
+  { 0x1d4cb, 1, 2308 }, 
+  { 0x1d4cc, 1, 595 }, 
+  { 0x1d4cd, 1, 611 }, 
+  { 0x1d4ce, 1, 596 }, 
+  { 0x1d4cf, 1, 2665 }, 
+  { 0x1d4d0, 1, 2649 }, 
+  { 0x1d4d1, 1, 2223 }, 
+  { 0x1d4d2, 1, 2190 }, 
+  { 0x1d4d3, 1, 2236 }, 
+  { 0x1d4d4, 1, 2225 }, 
+  { 0x1d4d5, 1, 2226 }, 
+  { 0x1d4d6, 1, 2650 }, 
+  { 0x1d4d7, 1, 2203 }, 
+  { 0x1d4d8, 1, 2205 }, 
+  { 0x1d4d9, 1, 2651 }, 
+  { 0x1d4da, 1, 2222 }, 
+  { 0x1d4db, 1, 2206 }, 
+  { 0x1d4dc, 1, 2227 }, 
+  { 0x1d4dd, 1, 2207 }, 
+  { 0x1d4de, 1, 2652 }, 
+  { 0x1d4df, 1, 2210 }, 
+  { 0x1d4e0, 1, 2211 }, 
+  { 0x1d4e1, 1, 2212 }, 
+  { 0x1d4e2, 1, 2653 }, 
+  { 0x1d4e3, 1, 2654 }, 
+  { 0x1d4e4, 1, 2655 }, 
+  { 0x1d4e5, 1, 2283 }, 
+  { 0x1d4e6, 1, 2656 }, 
+  { 0x1d4e7, 1, 2295 }, 
+  { 0x1d4e8, 1, 2657 }, 
+  { 0x1d4e9, 1, 2220 }, 
+  { 0x1d4ea, 1, 3 }, 
+  { 0x1d4eb, 1, 2658 }, 
+  { 0x1d4ec, 1, 2325 }, 
+  { 0x1d4ed, 1, 2237 }, 
+  { 0x1d4ee, 1, 2224 }, 
+  { 0x1d4ef, 1, 2659 }, 
+  { 0x1d4f0, 1, 2202 }, 
+  { 0x1d4f1, 1, 588 }, 
+  { 0x1d4f2, 1, 2169 }, 
+  { 0x1d4f3, 1, 590 }, 
+  { 0x1d4f4, 1, 2660 }, 
+  { 0x1d4f5, 1, 610 }, 
+  { 0x1d4f6, 1, 2326 }, 
+  { 0x1d4f7, 1, 2181 }, 
+  { 0x1d4f8, 1, 14 }, 
+  { 0x1d4f9, 1, 2661 }, 
+  { 0x1d4fa, 1, 2662 }, 
+  { 0x1d4fb, 1, 591 }, 
+  { 0x1d4fc, 1, 356 }, 
+  { 0x1d4fd, 1, 2663 }, 
+  { 0x1d4fe, 1, 2664 }, 
+  { 0x1d4ff, 1, 2308 }, 
+  { 0x1d500, 1, 595 }, 
+  { 0x1d501, 1, 611 }, 
+  { 0x1d502, 1, 596 }, 
+  { 0x1d503, 1, 2665 }, 
+  { 0x1d504, 1, 2649 }, 
+  { 0x1d505, 1, 2223 }, 
+  { 0x1d507, 1, 2236 }, 
+  { 0x1d508, 1, 2225 }, 
+  { 0x1d509, 1, 2226 }, 
+  { 0x1d50a, 1, 2650 }, 
+  { 0x1d50d, 1, 2651 }, 
+  { 0x1d50e, 1, 2222 }, 
+  { 0x1d50f, 1, 2206 }, 
+  { 0x1d510, 1, 2227 }, 
+  { 0x1d511, 1, 2207 }, 
+  { 0x1d512, 1, 2652 }, 
+  { 0x1d513, 1, 2210 }, 
+  { 0x1d514, 1, 2211 }, 
+  { 0x1d516, 1, 2653 }, 
+  { 0x1d517, 1, 2654 }, 
+  { 0x1d518, 1, 2655 }, 
+  { 0x1d519, 1, 2283 }, 
+  { 0x1d51a, 1, 2656 }, 
+  { 0x1d51b, 1, 2295 }, 
+  { 0x1d51c, 1, 2657 }, 
+  { 0x1d51e, 1, 3 }, 
+  { 0x1d51f, 1, 2658 }, 
+  { 0x1d520, 1, 2325 }, 
+  { 0x1d521, 1, 2237 }, 
+  { 0x1d522, 1, 2224 }, 
+  { 0x1d523, 1, 2659 }, 
+  { 0x1d524, 1, 2202 }, 
+  { 0x1d525, 1, 588 }, 
+  { 0x1d526, 1, 2169 }, 
+  { 0x1d527, 1, 590 }, 
+  { 0x1d528, 1, 2660 }, 
+  { 0x1d529, 1, 610 }, 
+  { 0x1d52a, 1, 2326 }, 
+  { 0x1d52b, 1, 2181 }, 
+  { 0x1d52c, 1, 14 }, 
+  { 0x1d52d, 1, 2661 }, 
+  { 0x1d52e, 1, 2662 }, 
+  { 0x1d52f, 1, 591 }, 
+  { 0x1d530, 1, 356 }, 
+  { 0x1d531, 1, 2663 }, 
+  { 0x1d532, 1, 2664 }, 
+  { 0x1d533, 1, 2308 }, 
+  { 0x1d534, 1, 595 }, 
+  { 0x1d535, 1, 611 }, 
+  { 0x1d536, 1, 596 }, 
+  { 0x1d537, 1, 2665 }, 
+  { 0x1d538, 1, 2649 }, 
+  { 0x1d539, 1, 2223 }, 
+  { 0x1d53b, 1, 2236 }, 
+  { 0x1d53c, 1, 2225 }, 
+  { 0x1d53d, 1, 2226 }, 
+  { 0x1d53e, 1, 2650 }, 
+  { 0x1d540, 1, 2205 }, 
+  { 0x1d541, 1, 2651 }, 
+  { 0x1d542, 1, 2222 }, 
+  { 0x1d543, 1, 2206 }, 
+  { 0x1d544, 1, 2227 }, 
+  { 0x1d546, 1, 2652 }, 
+  { 0x1d54a, 1, 2653 }, 
+  { 0x1d54b, 1, 2654 }, 
+  { 0x1d54c, 1, 2655 }, 
+  { 0x1d54d, 1, 2283 }, 
+  { 0x1d54e, 1, 2656 }, 
+  { 0x1d54f, 1, 2295 }, 
+  { 0x1d550, 1, 2657 }, 
+  { 0x1d552, 1, 3 }, 
+  { 0x1d553, 1, 2658 }, 
+  { 0x1d554, 1, 2325 }, 
+  { 0x1d555, 1, 2237 }, 
+  { 0x1d556, 1, 2224 }, 
+  { 0x1d557, 1, 2659 }, 
+  { 0x1d558, 1, 2202 }, 
+  { 0x1d559, 1, 588 }, 
+  { 0x1d55a, 1, 2169 }, 
+  { 0x1d55b, 1, 590 }, 
+  { 0x1d55c, 1, 2660 }, 
+  { 0x1d55d, 1, 610 }, 
+  { 0x1d55e, 1, 2326 }, 
+  { 0x1d55f, 1, 2181 }, 
+  { 0x1d560, 1, 14 }, 
+  { 0x1d561, 1, 2661 }, 
+  { 0x1d562, 1, 2662 }, 
+  { 0x1d563, 1, 591 }, 
+  { 0x1d564, 1, 356 }, 
+  { 0x1d565, 1, 2663 }, 
+  { 0x1d566, 1, 2664 }, 
+  { 0x1d567, 1, 2308 }, 
+  { 0x1d568, 1, 595 }, 
+  { 0x1d569, 1, 611 }, 
+  { 0x1d56a, 1, 596 }, 
+  { 0x1d56b, 1, 2665 }, 
+  { 0x1d56c, 1, 2649 }, 
+  { 0x1d56d, 1, 2223 }, 
+  { 0x1d56e, 1, 2190 }, 
+  { 0x1d56f, 1, 2236 }, 
+  { 0x1d570, 1, 2225 }, 
+  { 0x1d571, 1, 2226 }, 
+  { 0x1d572, 1, 2650 }, 
+  { 0x1d573, 1, 2203 }, 
+  { 0x1d574, 1, 2205 }, 
+  { 0x1d575, 1, 2651 }, 
+  { 0x1d576, 1, 2222 }, 
+  { 0x1d577, 1, 2206 }, 
+  { 0x1d578, 1, 2227 }, 
+  { 0x1d579, 1, 2207 }, 
+  { 0x1d57a, 1, 2652 }, 
+  { 0x1d57b, 1, 2210 }, 
+  { 0x1d57c, 1, 2211 }, 
+  { 0x1d57d, 1, 2212 }, 
+  { 0x1d57e, 1, 2653 }, 
+  { 0x1d57f, 1, 2654 }, 
+  { 0x1d580, 1, 2655 }, 
+  { 0x1d581, 1, 2283 }, 
+  { 0x1d582, 1, 2656 }, 
+  { 0x1d583, 1, 2295 }, 
+  { 0x1d584, 1, 2657 }, 
+  { 0x1d585, 1, 2220 }, 
+  { 0x1d586, 1, 3 }, 
+  { 0x1d587, 1, 2658 }, 
+  { 0x1d588, 1, 2325 }, 
+  { 0x1d589, 1, 2237 }, 
+  { 0x1d58a, 1, 2224 }, 
+  { 0x1d58b, 1, 2659 }, 
+  { 0x1d58c, 1, 2202 }, 
+  { 0x1d58d, 1, 588 }, 
+  { 0x1d58e, 1, 2169 }, 
+  { 0x1d58f, 1, 590 }, 
+  { 0x1d590, 1, 2660 }, 
+  { 0x1d591, 1, 610 }, 
+  { 0x1d592, 1, 2326 }, 
+  { 0x1d593, 1, 2181 }, 
+  { 0x1d594, 1, 14 }, 
+  { 0x1d595, 1, 2661 }, 
+  { 0x1d596, 1, 2662 }, 
+  { 0x1d597, 1, 591 }, 
+  { 0x1d598, 1, 356 }, 
+  { 0x1d599, 1, 2663 }, 
+  { 0x1d59a, 1, 2664 }, 
+  { 0x1d59b, 1, 2308 }, 
+  { 0x1d59c, 1, 595 }, 
+  { 0x1d59d, 1, 611 }, 
+  { 0x1d59e, 1, 596 }, 
+  { 0x1d59f, 1, 2665 }, 
+  { 0x1d5a0, 1, 2649 }, 
+  { 0x1d5a1, 1, 2223 }, 
+  { 0x1d5a2, 1, 2190 }, 
+  { 0x1d5a3, 1, 2236 }, 
+  { 0x1d5a4, 1, 2225 }, 
+  { 0x1d5a5, 1, 2226 }, 
+  { 0x1d5a6, 1, 2650 }, 
+  { 0x1d5a7, 1, 2203 }, 
+  { 0x1d5a8, 1, 2205 }, 
+  { 0x1d5a9, 1, 2651 }, 
+  { 0x1d5aa, 1, 2222 }, 
+  { 0x1d5ab, 1, 2206 }, 
+  { 0x1d5ac, 1, 2227 }, 
+  { 0x1d5ad, 1, 2207 }, 
+  { 0x1d5ae, 1, 2652 }, 
+  { 0x1d5af, 1, 2210 }, 
+  { 0x1d5b0, 1, 2211 }, 
+  { 0x1d5b1, 1, 2212 }, 
+  { 0x1d5b2, 1, 2653 }, 
+  { 0x1d5b3, 1, 2654 }, 
+  { 0x1d5b4, 1, 2655 }, 
+  { 0x1d5b5, 1, 2283 }, 
+  { 0x1d5b6, 1, 2656 }, 
+  { 0x1d5b7, 1, 2295 }, 
+  { 0x1d5b8, 1, 2657 }, 
+  { 0x1d5b9, 1, 2220 }, 
+  { 0x1d5ba, 1, 3 }, 
+  { 0x1d5bb, 1, 2658 }, 
+  { 0x1d5bc, 1, 2325 }, 
+  { 0x1d5bd, 1, 2237 }, 
+  { 0x1d5be, 1, 2224 }, 
+  { 0x1d5bf, 1, 2659 }, 
+  { 0x1d5c0, 1, 2202 }, 
+  { 0x1d5c1, 1, 588 }, 
+  { 0x1d5c2, 1, 2169 }, 
+  { 0x1d5c3, 1, 590 }, 
+  { 0x1d5c4, 1, 2660 }, 
+  { 0x1d5c5, 1, 610 }, 
+  { 0x1d5c6, 1, 2326 }, 
+  { 0x1d5c7, 1, 2181 }, 
+  { 0x1d5c8, 1, 14 }, 
+  { 0x1d5c9, 1, 2661 }, 
+  { 0x1d5ca, 1, 2662 }, 
+  { 0x1d5cb, 1, 591 }, 
+  { 0x1d5cc, 1, 356 }, 
+  { 0x1d5cd, 1, 2663 }, 
+  { 0x1d5ce, 1, 2664 }, 
+  { 0x1d5cf, 1, 2308 }, 
+  { 0x1d5d0, 1, 595 }, 
+  { 0x1d5d1, 1, 611 }, 
+  { 0x1d5d2, 1, 596 }, 
+  { 0x1d5d3, 1, 2665 }, 
+  { 0x1d5d4, 1, 2649 }, 
+  { 0x1d5d5, 1, 2223 }, 
+  { 0x1d5d6, 1, 2190 }, 
+  { 0x1d5d7, 1, 2236 }, 
+  { 0x1d5d8, 1, 2225 }, 
+  { 0x1d5d9, 1, 2226 }, 
+  { 0x1d5da, 1, 2650 }, 
+  { 0x1d5db, 1, 2203 }, 
+  { 0x1d5dc, 1, 2205 }, 
+  { 0x1d5dd, 1, 2651 }, 
+  { 0x1d5de, 1, 2222 }, 
+  { 0x1d5df, 1, 2206 }, 
+  { 0x1d5e0, 1, 2227 }, 
+  { 0x1d5e1, 1, 2207 }, 
+  { 0x1d5e2, 1, 2652 }, 
+  { 0x1d5e3, 1, 2210 }, 
+  { 0x1d5e4, 1, 2211 }, 
+  { 0x1d5e5, 1, 2212 }, 
+  { 0x1d5e6, 1, 2653 }, 
+  { 0x1d5e7, 1, 2654 }, 
+  { 0x1d5e8, 1, 2655 }, 
+  { 0x1d5e9, 1, 2283 }, 
+  { 0x1d5ea, 1, 2656 }, 
+  { 0x1d5eb, 1, 2295 }, 
+  { 0x1d5ec, 1, 2657 }, 
+  { 0x1d5ed, 1, 2220 }, 
+  { 0x1d5ee, 1, 3 }, 
+  { 0x1d5ef, 1, 2658 }, 
+  { 0x1d5f0, 1, 2325 }, 
+  { 0x1d5f1, 1, 2237 }, 
+  { 0x1d5f2, 1, 2224 }, 
+  { 0x1d5f3, 1, 2659 }, 
+  { 0x1d5f4, 1, 2202 }, 
+  { 0x1d5f5, 1, 588 }, 
+  { 0x1d5f6, 1, 2169 }, 
+  { 0x1d5f7, 1, 590 }, 
+  { 0x1d5f8, 1, 2660 }, 
+  { 0x1d5f9, 1, 610 }, 
+  { 0x1d5fa, 1, 2326 }, 
+  { 0x1d5fb, 1, 2181 }, 
+  { 0x1d5fc, 1, 14 }, 
+  { 0x1d5fd, 1, 2661 }, 
+  { 0x1d5fe, 1, 2662 }, 
+  { 0x1d5ff, 1, 591 }, 
+  { 0x1d600, 1, 356 }, 
+  { 0x1d601, 1, 2663 }, 
+  { 0x1d602, 1, 2664 }, 
+  { 0x1d603, 1, 2308 }, 
+  { 0x1d604, 1, 595 }, 
+  { 0x1d605, 1, 611 }, 
+  { 0x1d606, 1, 596 }, 
+  { 0x1d607, 1, 2665 }, 
+  { 0x1d608, 1, 2649 }, 
+  { 0x1d609, 1, 2223 }, 
+  { 0x1d60a, 1, 2190 }, 
+  { 0x1d60b, 1, 2236 }, 
+  { 0x1d60c, 1, 2225 }, 
+  { 0x1d60d, 1, 2226 }, 
+  { 0x1d60e, 1, 2650 }, 
+  { 0x1d60f, 1, 2203 }, 
+  { 0x1d610, 1, 2205 }, 
+  { 0x1d611, 1, 2651 }, 
+  { 0x1d612, 1, 2222 }, 
+  { 0x1d613, 1, 2206 }, 
+  { 0x1d614, 1, 2227 }, 
+  { 0x1d615, 1, 2207 }, 
+  { 0x1d616, 1, 2652 }, 
+  { 0x1d617, 1, 2210 }, 
+  { 0x1d618, 1, 2211 }, 
+  { 0x1d619, 1, 2212 }, 
+  { 0x1d61a, 1, 2653 }, 
+  { 0x1d61b, 1, 2654 }, 
+  { 0x1d61c, 1, 2655 }, 
+  { 0x1d61d, 1, 2283 }, 
+  { 0x1d61e, 1, 2656 }, 
+  { 0x1d61f, 1, 2295 }, 
+  { 0x1d620, 1, 2657 }, 
+  { 0x1d621, 1, 2220 }, 
+  { 0x1d622, 1, 3 }, 
+  { 0x1d623, 1, 2658 }, 
+  { 0x1d624, 1, 2325 }, 
+  { 0x1d625, 1, 2237 }, 
+  { 0x1d626, 1, 2224 }, 
+  { 0x1d627, 1, 2659 }, 
+  { 0x1d628, 1, 2202 }, 
+  { 0x1d629, 1, 588 }, 
+  { 0x1d62a, 1, 2169 }, 
+  { 0x1d62b, 1, 590 }, 
+  { 0x1d62c, 1, 2660 }, 
+  { 0x1d62d, 1, 610 }, 
+  { 0x1d62e, 1, 2326 }, 
+  { 0x1d62f, 1, 2181 }, 
+  { 0x1d630, 1, 14 }, 
+  { 0x1d631, 1, 2661 }, 
+  { 0x1d632, 1, 2662 }, 
+  { 0x1d633, 1, 591 }, 
+  { 0x1d634, 1, 356 }, 
+  { 0x1d635, 1, 2663 }, 
+  { 0x1d636, 1, 2664 }, 
+  { 0x1d637, 1, 2308 }, 
+  { 0x1d638, 1, 595 }, 
+  { 0x1d639, 1, 611 }, 
+  { 0x1d63a, 1, 596 }, 
+  { 0x1d63b, 1, 2665 }, 
+  { 0x1d63c, 1, 2649 }, 
+  { 0x1d63d, 1, 2223 }, 
+  { 0x1d63e, 1, 2190 }, 
+  { 0x1d63f, 1, 2236 }, 
+  { 0x1d640, 1, 2225 }, 
+  { 0x1d641, 1, 2226 }, 
+  { 0x1d642, 1, 2650 }, 
+  { 0x1d643, 1, 2203 }, 
+  { 0x1d644, 1, 2205 }, 
+  { 0x1d645, 1, 2651 }, 
+  { 0x1d646, 1, 2222 }, 
+  { 0x1d647, 1, 2206 }, 
+  { 0x1d648, 1, 2227 }, 
+  { 0x1d649, 1, 2207 }, 
+  { 0x1d64a, 1, 2652 }, 
+  { 0x1d64b, 1, 2210 }, 
+  { 0x1d64c, 1, 2211 }, 
+  { 0x1d64d, 1, 2212 }, 
+  { 0x1d64e, 1, 2653 }, 
+  { 0x1d64f, 1, 2654 }, 
+  { 0x1d650, 1, 2655 }, 
+  { 0x1d651, 1, 2283 }, 
+  { 0x1d652, 1, 2656 }, 
+  { 0x1d653, 1, 2295 }, 
+  { 0x1d654, 1, 2657 }, 
+  { 0x1d655, 1, 2220 }, 
+  { 0x1d656, 1, 3 }, 
+  { 0x1d657, 1, 2658 }, 
+  { 0x1d658, 1, 2325 }, 
+  { 0x1d659, 1, 2237 }, 
+  { 0x1d65a, 1, 2224 }, 
+  { 0x1d65b, 1, 2659 }, 
+  { 0x1d65c, 1, 2202 }, 
+  { 0x1d65d, 1, 588 }, 
+  { 0x1d65e, 1, 2169 }, 
+  { 0x1d65f, 1, 590 }, 
+  { 0x1d660, 1, 2660 }, 
+  { 0x1d661, 1, 610 }, 
+  { 0x1d662, 1, 2326 }, 
+  { 0x1d663, 1, 2181 }, 
+  { 0x1d664, 1, 14 }, 
+  { 0x1d665, 1, 2661 }, 
+  { 0x1d666, 1, 2662 }, 
+  { 0x1d667, 1, 591 }, 
+  { 0x1d668, 1, 356 }, 
+  { 0x1d669, 1, 2663 }, 
+  { 0x1d66a, 1, 2664 }, 
+  { 0x1d66b, 1, 2308 }, 
+  { 0x1d66c, 1, 595 }, 
+  { 0x1d66d, 1, 611 }, 
+  { 0x1d66e, 1, 596 }, 
+  { 0x1d66f, 1, 2665 }, 
+  { 0x1d670, 1, 2649 }, 
+  { 0x1d671, 1, 2223 }, 
+  { 0x1d672, 1, 2190 }, 
+  { 0x1d673, 1, 2236 }, 
+  { 0x1d674, 1, 2225 }, 
+  { 0x1d675, 1, 2226 }, 
+  { 0x1d676, 1, 2650 }, 
+  { 0x1d677, 1, 2203 }, 
+  { 0x1d678, 1, 2205 }, 
+  { 0x1d679, 1, 2651 }, 
+  { 0x1d67a, 1, 2222 }, 
+  { 0x1d67b, 1, 2206 }, 
+  { 0x1d67c, 1, 2227 }, 
+  { 0x1d67d, 1, 2207 }, 
+  { 0x1d67e, 1, 2652 }, 
+  { 0x1d67f, 1, 2210 }, 
+  { 0x1d680, 1, 2211 }, 
+  { 0x1d681, 1, 2212 }, 
+  { 0x1d682, 1, 2653 }, 
+  { 0x1d683, 1, 2654 }, 
+  { 0x1d684, 1, 2655 }, 
+  { 0x1d685, 1, 2283 }, 
+  { 0x1d686, 1, 2656 }, 
+  { 0x1d687, 1, 2295 }, 
+  { 0x1d688, 1, 2657 }, 
+  { 0x1d689, 1, 2220 }, 
+  { 0x1d68a, 1, 3 }, 
+  { 0x1d68b, 1, 2658 }, 
+  { 0x1d68c, 1, 2325 }, 
+  { 0x1d68d, 1, 2237 }, 
+  { 0x1d68e, 1, 2224 }, 
+  { 0x1d68f, 1, 2659 }, 
+  { 0x1d690, 1, 2202 }, 
+  { 0x1d691, 1, 588 }, 
+  { 0x1d692, 1, 2169 }, 
+  { 0x1d693, 1, 590 }, 
+  { 0x1d694, 1, 2660 }, 
+  { 0x1d695, 1, 610 }, 
+  { 0x1d696, 1, 2326 }, 
+  { 0x1d697, 1, 2181 }, 
+  { 0x1d698, 1, 14 }, 
+  { 0x1d699, 1, 2661 }, 
+  { 0x1d69a, 1, 2662 }, 
+  { 0x1d69b, 1, 591 }, 
+  { 0x1d69c, 1, 356 }, 
+  { 0x1d69d, 1, 2663 }, 
+  { 0x1d69e, 1, 2664 }, 
+  { 0x1d69f, 1, 2308 }, 
+  { 0x1d6a0, 1, 595 }, 
+  { 0x1d6a1, 1, 611 }, 
+  { 0x1d6a2, 1, 596 }, 
+  { 0x1d6a3, 1, 2665 }, 
+  { 0x1d6a8, 1, 5630 }, 
+  { 0x1d6a9, 1, 5631 }, 
+  { 0x1d6aa, 1, 2233 }, 
+  { 0x1d6ab, 1, 5632 }, 
+  { 0x1d6ac, 1, 5633 }, 
+  { 0x1d6ad, 1, 5634 }, 
+  { 0x1d6ae, 1, 5635 }, 
+  { 0x1d6af, 1, 676 }, 
+  { 0x1d6b0, 1, 5636 }, 
+  { 0x1d6b1, 1, 5637 }, 
+  { 0x1d6b2, 1, 5638 }, 
+  { 0x1d6b3, 1, 5639 }, 
+  { 0x1d6b4, 1, 5640 }, 
+  { 0x1d6b5, 1, 5641 }, 
+  { 0x1d6b6, 1, 5642 }, 
+  { 0x1d6b7, 1, 2234 }, 
+  { 0x1d6b8, 1, 5643 }, 
+  { 0x1d6b9, 1, 676 }, 
+  { 0x1d6ba, 1, 5644 }, 
+  { 0x1d6bb, 1, 5645 }, 
+  { 0x1d6bc, 1, 670 }, 
+  { 0x1d6bd, 1, 5646 }, 
+  { 0x1d6be, 1, 5647 }, 
+  { 0x1d6bf, 1, 5648 }, 
+  { 0x1d6c0, 1, 2221 }, 
+  { 0x1d6c1, 1, 5649 }, 
+  { 0x1d6c2, 1, 5650 }, 
+  { 0x1d6c3, 1, 668 }, 
+  { 0x1d6c4, 1, 2232 }, 
+  { 0x1d6c5, 1, 5651 }, 
+  { 0x1d6c6, 1, 677 }, 
+  { 0x1d6c7, 1, 5652 }, 
+  { 0x1d6c8, 1, 5653 }, 
+  { 0x1d6c9, 1, 669 }, 
+  { 0x1d6ca, 1, 2025 }, 
+  { 0x1d6cb, 1, 673 }, 
+  { 0x1d6cc, 1, 5654 }, 
+  { 0x1d6cd, 1, 10 }, 
+  { 0x1d6ce, 1, 5655 }, 
+  { 0x1d6cf, 1, 5656 }, 
+  { 0x1d6d0, 1, 5657 }, 
+  { 0x1d6d1, 1, 672 }, 
+  { 0x1d6d2, 1, 674 }, 
+  { 0x1d6d3, 1, 675 }, 
+  { 0x1d6d4, 1, 5658 }, 
+  { 0x1d6d5, 1, 5659 }, 
+  { 0x1d6d6, 1, 5660 }, 
+  { 0x1d6d7, 1, 671 }, 
+  { 0x1d6d8, 1, 5661 }, 
+  { 0x1d6d9, 1, 5662 }, 
+  { 0x1d6da, 1, 5663 }, 
+  { 0x1d6db, 1, 5664 }, 
+  { 0x1d6dc, 1, 677 }, 
+  { 0x1d6dd, 1, 669 }, 
+  { 0x1d6de, 1, 673 }, 
+  { 0x1d6df, 1, 671 }, 
+  { 0x1d6e0, 1, 674 }, 
+  { 0x1d6e1, 1, 672 }, 
+  { 0x1d6e2, 1, 5630 }, 
+  { 0x1d6e3, 1, 5631 }, 
+  { 0x1d6e4, 1, 2233 }, 
+  { 0x1d6e5, 1, 5632 }, 
+  { 0x1d6e6, 1, 5633 }, 
+  { 0x1d6e7, 1, 5634 }, 
+  { 0x1d6e8, 1, 5635 }, 
+  { 0x1d6e9, 1, 676 }, 
+  { 0x1d6ea, 1, 5636 }, 
+  { 0x1d6eb, 1, 5637 }, 
+  { 0x1d6ec, 1, 5638 }, 
+  { 0x1d6ed, 1, 5639 }, 
+  { 0x1d6ee, 1, 5640 }, 
+  { 0x1d6ef, 1, 5641 }, 
+  { 0x1d6f0, 1, 5642 }, 
+  { 0x1d6f1, 1, 2234 }, 
+  { 0x1d6f2, 1, 5643 }, 
+  { 0x1d6f3, 1, 676 }, 
+  { 0x1d6f4, 1, 5644 }, 
+  { 0x1d6f5, 1, 5645 }, 
+  { 0x1d6f6, 1, 670 }, 
+  { 0x1d6f7, 1, 5646 }, 
+  { 0x1d6f8, 1, 5647 }, 
+  { 0x1d6f9, 1, 5648 }, 
+  { 0x1d6fa, 1, 2221 }, 
+  { 0x1d6fb, 1, 5649 }, 
+  { 0x1d6fc, 1, 5650 }, 
+  { 0x1d6fd, 1, 668 }, 
+  { 0x1d6fe, 1, 2232 }, 
+  { 0x1d6ff, 1, 5651 }, 
+  { 0x1d700, 1, 677 }, 
+  { 0x1d701, 1, 5652 }, 
+  { 0x1d702, 1, 5653 }, 
+  { 0x1d703, 1, 669 }, 
+  { 0x1d704, 1, 2025 }, 
+  { 0x1d705, 1, 673 }, 
+  { 0x1d706, 1, 5654 }, 
+  { 0x1d707, 1, 10 }, 
+  { 0x1d708, 1, 5655 }, 
+  { 0x1d709, 1, 5656 }, 
+  { 0x1d70a, 1, 5657 }, 
+  { 0x1d70b, 1, 672 }, 
+  { 0x1d70c, 1, 674 }, 
+  { 0x1d70d, 1, 675 }, 
+  { 0x1d70e, 1, 5658 }, 
+  { 0x1d70f, 1, 5659 }, 
+  { 0x1d710, 1, 5660 }, 
+  { 0x1d711, 1, 671 }, 
+  { 0x1d712, 1, 5661 }, 
+  { 0x1d713, 1, 5662 }, 
+  { 0x1d714, 1, 5663 }, 
+  { 0x1d715, 1, 5664 }, 
+  { 0x1d716, 1, 677 }, 
+  { 0x1d717, 1, 669 }, 
+  { 0x1d718, 1, 673 }, 
+  { 0x1d719, 1, 671 }, 
+  { 0x1d71a, 1, 674 }, 
+  { 0x1d71b, 1, 672 }, 
+  { 0x1d71c, 1, 5630 }, 
+  { 0x1d71d, 1, 5631 }, 
+  { 0x1d71e, 1, 2233 }, 
+  { 0x1d71f, 1, 5632 }, 
+  { 0x1d720, 1, 5633 }, 
+  { 0x1d721, 1, 5634 }, 
+  { 0x1d722, 1, 5635 }, 
+  { 0x1d723, 1, 676 }, 
+  { 0x1d724, 1, 5636 }, 
+  { 0x1d725, 1, 5637 }, 
+  { 0x1d726, 1, 5638 }, 
+  { 0x1d727, 1, 5639 }, 
+  { 0x1d728, 1, 5640 }, 
+  { 0x1d729, 1, 5641 }, 
+  { 0x1d72a, 1, 5642 }, 
+  { 0x1d72b, 1, 2234 }, 
+  { 0x1d72c, 1, 5643 }, 
+  { 0x1d72d, 1, 676 }, 
+  { 0x1d72e, 1, 5644 }, 
+  { 0x1d72f, 1, 5645 }, 
+  { 0x1d730, 1, 670 }, 
+  { 0x1d731, 1, 5646 }, 
+  { 0x1d732, 1, 5647 }, 
+  { 0x1d733, 1, 5648 }, 
+  { 0x1d734, 1, 2221 }, 
+  { 0x1d735, 1, 5649 }, 
+  { 0x1d736, 1, 5650 }, 
+  { 0x1d737, 1, 668 }, 
+  { 0x1d738, 1, 2232 }, 
+  { 0x1d739, 1, 5651 }, 
+  { 0x1d73a, 1, 677 }, 
+  { 0x1d73b, 1, 5652 }, 
+  { 0x1d73c, 1, 5653 }, 
+  { 0x1d73d, 1, 669 }, 
+  { 0x1d73e, 1, 2025 }, 
+  { 0x1d73f, 1, 673 }, 
+  { 0x1d740, 1, 5654 }, 
+  { 0x1d741, 1, 10 }, 
+  { 0x1d742, 1, 5655 }, 
+  { 0x1d743, 1, 5656 }, 
+  { 0x1d744, 1, 5657 }, 
+  { 0x1d745, 1, 672 }, 
+  { 0x1d746, 1, 674 }, 
+  { 0x1d747, 1, 675 }, 
+  { 0x1d748, 1, 5658 }, 
+  { 0x1d749, 1, 5659 }, 
+  { 0x1d74a, 1, 5660 }, 
+  { 0x1d74b, 1, 671 }, 
+  { 0x1d74c, 1, 5661 }, 
+  { 0x1d74d, 1, 5662 }, 
+  { 0x1d74e, 1, 5663 }, 
+  { 0x1d74f, 1, 5664 }, 
+  { 0x1d750, 1, 677 }, 
+  { 0x1d751, 1, 669 }, 
+  { 0x1d752, 1, 673 }, 
+  { 0x1d753, 1, 671 }, 
+  { 0x1d754, 1, 674 }, 
+  { 0x1d755, 1, 672 }, 
+  { 0x1d756, 1, 5630 }, 
+  { 0x1d757, 1, 5631 }, 
+  { 0x1d758, 1, 2233 }, 
+  { 0x1d759, 1, 5632 }, 
+  { 0x1d75a, 1, 5633 }, 
+  { 0x1d75b, 1, 5634 }, 
+  { 0x1d75c, 1, 5635 }, 
+  { 0x1d75d, 1, 676 }, 
+  { 0x1d75e, 1, 5636 }, 
+  { 0x1d75f, 1, 5637 }, 
+  { 0x1d760, 1, 5638 }, 
+  { 0x1d761, 1, 5639 }, 
+  { 0x1d762, 1, 5640 }, 
+  { 0x1d763, 1, 5641 }, 
+  { 0x1d764, 1, 5642 }, 
+  { 0x1d765, 1, 2234 }, 
+  { 0x1d766, 1, 5643 }, 
+  { 0x1d767, 1, 676 }, 
+  { 0x1d768, 1, 5644 }, 
+  { 0x1d769, 1, 5645 }, 
+  { 0x1d76a, 1, 670 }, 
+  { 0x1d76b, 1, 5646 }, 
+  { 0x1d76c, 1, 5647 }, 
+  { 0x1d76d, 1, 5648 }, 
+  { 0x1d76e, 1, 2221 }, 
+  { 0x1d76f, 1, 5649 }, 
+  { 0x1d770, 1, 5650 }, 
+  { 0x1d771, 1, 668 }, 
+  { 0x1d772, 1, 2232 }, 
+  { 0x1d773, 1, 5651 }, 
+  { 0x1d774, 1, 677 }, 
+  { 0x1d775, 1, 5652 }, 
+  { 0x1d776, 1, 5653 }, 
+  { 0x1d777, 1, 669 }, 
+  { 0x1d778, 1, 2025 }, 
+  { 0x1d779, 1, 673 }, 
+  { 0x1d77a, 1, 5654 }, 
+  { 0x1d77b, 1, 10 }, 
+  { 0x1d77c, 1, 5655 }, 
+  { 0x1d77d, 1, 5656 }, 
+  { 0x1d77e, 1, 5657 }, 
+  { 0x1d77f, 1, 672 }, 
+  { 0x1d780, 1, 674 }, 
+  { 0x1d781, 1, 675 }, 
+  { 0x1d782, 1, 5658 }, 
+  { 0x1d783, 1, 5659 }, 
+  { 0x1d784, 1, 5660 }, 
+  { 0x1d785, 1, 671 }, 
+  { 0x1d786, 1, 5661 }, 
+  { 0x1d787, 1, 5662 }, 
+  { 0x1d788, 1, 5663 }, 
+  { 0x1d789, 1, 5664 }, 
+  { 0x1d78a, 1, 677 }, 
+  { 0x1d78b, 1, 669 }, 
+  { 0x1d78c, 1, 673 }, 
+  { 0x1d78d, 1, 671 }, 
+  { 0x1d78e, 1, 674 }, 
+  { 0x1d78f, 1, 672 }, 
+  { 0x1d790, 1, 5630 }, 
+  { 0x1d791, 1, 5631 }, 
+  { 0x1d792, 1, 2233 }, 
+  { 0x1d793, 1, 5632 }, 
+  { 0x1d794, 1, 5633 }, 
+  { 0x1d795, 1, 5634 }, 
+  { 0x1d796, 1, 5635 }, 
+  { 0x1d797, 1, 676 }, 
+  { 0x1d798, 1, 5636 }, 
+  { 0x1d799, 1, 5637 }, 
+  { 0x1d79a, 1, 5638 }, 
+  { 0x1d79b, 1, 5639 }, 
+  { 0x1d79c, 1, 5640 }, 
+  { 0x1d79d, 1, 5641 }, 
+  { 0x1d79e, 1, 5642 }, 
+  { 0x1d79f, 1, 2234 }, 
+  { 0x1d7a0, 1, 5643 }, 
+  { 0x1d7a1, 1, 676 }, 
+  { 0x1d7a2, 1, 5644 }, 
+  { 0x1d7a3, 1, 5645 }, 
+  { 0x1d7a4, 1, 670 }, 
+  { 0x1d7a5, 1, 5646 }, 
+  { 0x1d7a6, 1, 5647 }, 
+  { 0x1d7a7, 1, 5648 }, 
+  { 0x1d7a8, 1, 2221 }, 
+  { 0x1d7a9, 1, 5649 }, 
+  { 0x1d7aa, 1, 5650 }, 
+  { 0x1d7ab, 1, 668 }, 
+  { 0x1d7ac, 1, 2232 }, 
+  { 0x1d7ad, 1, 5651 }, 
+  { 0x1d7ae, 1, 677 }, 
+  { 0x1d7af, 1, 5652 }, 
+  { 0x1d7b0, 1, 5653 }, 
+  { 0x1d7b1, 1, 669 }, 
+  { 0x1d7b2, 1, 2025 }, 
+  { 0x1d7b3, 1, 673 }, 
+  { 0x1d7b4, 1, 5654 }, 
+  { 0x1d7b5, 1, 10 }, 
+  { 0x1d7b6, 1, 5655 }, 
+  { 0x1d7b7, 1, 5656 }, 
+  { 0x1d7b8, 1, 5657 }, 
+  { 0x1d7b9, 1, 672 }, 
+  { 0x1d7ba, 1, 674 }, 
+  { 0x1d7bb, 1, 675 }, 
+  { 0x1d7bc, 1, 5658 }, 
+  { 0x1d7bd, 1, 5659 }, 
+  { 0x1d7be, 1, 5660 }, 
+  { 0x1d7bf, 1, 671 }, 
+  { 0x1d7c0, 1, 5661 }, 
+  { 0x1d7c1, 1, 5662 }, 
+  { 0x1d7c2, 1, 5663 }, 
+  { 0x1d7c3, 1, 5664 }, 
+  { 0x1d7c4, 1, 677 }, 
+  { 0x1d7c5, 1, 669 }, 
+  { 0x1d7c6, 1, 673 }, 
+  { 0x1d7c7, 1, 671 }, 
+  { 0x1d7c8, 1, 674 }, 
+  { 0x1d7c9, 1, 672 }, 
+  { 0x1d7ce, 1, 2168 }, 
+  { 0x1d7cf, 1, 13 }, 
+  { 0x1d7d0, 1, 6 }, 
+  { 0x1d7d1, 1, 7 }, 
+  { 0x1d7d2, 1, 2170 }, 
+  { 0x1d7d3, 1, 2171 }, 
+  { 0x1d7d4, 1, 2172 }, 
+  { 0x1d7d5, 1, 2173 }, 
+  { 0x1d7d6, 1, 2174 }, 
+  { 0x1d7d7, 1, 2175 }, 
+  { 0x1d7d8, 1, 2168 }, 
+  { 0x1d7d9, 1, 13 }, 
+  { 0x1d7da, 1, 6 }, 
+  { 0x1d7db, 1, 7 }, 
+  { 0x1d7dc, 1, 2170 }, 
+  { 0x1d7dd, 1, 2171 }, 
+  { 0x1d7de, 1, 2172 }, 
+  { 0x1d7df, 1, 2173 }, 
+  { 0x1d7e0, 1, 2174 }, 
+  { 0x1d7e1, 1, 2175 }, 
+  { 0x1d7e2, 1, 2168 }, 
+  { 0x1d7e3, 1, 13 }, 
+  { 0x1d7e4, 1, 6 }, 
+  { 0x1d7e5, 1, 7 }, 
+  { 0x1d7e6, 1, 2170 }, 
+  { 0x1d7e7, 1, 2171 }, 
+  { 0x1d7e8, 1, 2172 }, 
+  { 0x1d7e9, 1, 2173 }, 
+  { 0x1d7ea, 1, 2174 }, 
+  { 0x1d7eb, 1, 2175 }, 
+  { 0x1d7ec, 1, 2168 }, 
+  { 0x1d7ed, 1, 13 }, 
+  { 0x1d7ee, 1, 6 }, 
+  { 0x1d7ef, 1, 7 }, 
+  { 0x1d7f0, 1, 2170 }, 
+  { 0x1d7f1, 1, 2171 }, 
+  { 0x1d7f2, 1, 2172 }, 
+  { 0x1d7f3, 1, 2173 }, 
+  { 0x1d7f4, 1, 2174 }, 
+  { 0x1d7f5, 1, 2175 }, 
+  { 0x1d7f6, 1, 2168 }, 
+  { 0x1d7f7, 1, 13 }, 
+  { 0x1d7f8, 1, 6 }, 
+  { 0x1d7f9, 1, 7 }, 
+  { 0x1d7fa, 1, 2170 }, 
+  { 0x1d7fb, 1, 2171 }, 
+  { 0x1d7fc, 1, 2172 }, 
+  { 0x1d7fd, 1, 2173 }, 
+  { 0x1d7fe, 1, 2174 }, 
+  { 0x1d7ff, 1, 2175 }, 
+  { 0x2f800, 1, 5665 }, 
+  { 0x2f801, 1, 5666 }, 
+  { 0x2f802, 1, 5667 }, 
+  { 0x2f803, 1, 5668 }, 
+  { 0x2f804, 1, 5669 }, 
+  { 0x2f805, 1, 4549 }, 
+  { 0x2f806, 1, 5670 }, 
+  { 0x2f807, 1, 5671 }, 
+  { 0x2f808, 1, 5672 }, 
+  { 0x2f809, 1, 5673 }, 
+  { 0x2f80a, 1, 4550 }, 
+  { 0x2f80b, 1, 5674 }, 
+  { 0x2f80c, 1, 5675 }, 
+  { 0x2f80d, 1, 5676 }, 
+  { 0x2f80e, 1, 4551 }, 
+  { 0x2f80f, 1, 5677 }, 
+  { 0x2f810, 1, 5678 }, 
+  { 0x2f811, 1, 5679 }, 
+  { 0x2f812, 1, 5680 }, 
+  { 0x2f813, 1, 5681 }, 
+  { 0x2f814, 1, 5682 }, 
+  { 0x2f815, 1, 5683 }, 
+  { 0x2f816, 1, 5684 }, 
+  { 0x2f817, 1, 5685 }, 
+  { 0x2f818, 1, 5686 }, 
+  { 0x2f819, 1, 5687 }, 
+  { 0x2f81a, 1, 5688 }, 
+  { 0x2f81b, 1, 5689 }, 
+  { 0x2f81c, 1, 5690 }, 
+  { 0x2f81d, 1, 2698 }, 
+  { 0x2f81e, 1, 5691 }, 
+  { 0x2f81f, 1, 5692 }, 
+  { 0x2f820, 1, 5693 }, 
+  { 0x2f821, 1, 5694 }, 
+  { 0x2f822, 1, 5695 }, 
+  { 0x2f823, 1, 5696 }, 
+  { 0x2f824, 1, 5697 }, 
+  { 0x2f825, 1, 5698 }, 
+  { 0x2f826, 1, 4552 }, 
+  { 0x2f827, 1, 4553 }, 
+  { 0x2f828, 1, 5699 }, 
+  { 0x2f829, 1, 5700 }, 
+  { 0x2f82a, 1, 5701 }, 
+  { 0x2f82b, 1, 4372 }, 
+  { 0x2f82c, 1, 5702 }, 
+  { 0x2f82d, 1, 4554 }, 
+  { 0x2f82e, 1, 5703 }, 
+  { 0x2f82f, 1, 5704 }, 
+  { 0x2f830, 1, 5705 }, 
+  { 0x2f831, 1, 5706 }, 
+  { 0x2f832, 1, 5706 }, 
+  { 0x2f833, 1, 5706 }, 
+  { 0x2f834, 1, 5707 }, 
+  { 0x2f835, 1, 5708 }, 
+  { 0x2f836, 1, 5709 }, 
+  { 0x2f837, 1, 5710 }, 
+  { 0x2f838, 1, 5711 }, 
+  { 0x2f839, 1, 5712 }, 
+  { 0x2f83a, 1, 5713 }, 
+  { 0x2f83b, 1, 5714 }, 
+  { 0x2f83c, 1, 5715 }, 
+  { 0x2f83d, 1, 5716 }, 
+  { 0x2f83e, 1, 5717 }, 
+  { 0x2f83f, 1, 5718 }, 
+  { 0x2f840, 1, 5719 }, 
+  { 0x2f841, 1, 5720 }, 
+  { 0x2f842, 1, 5721 }, 
+  { 0x2f843, 1, 5722 }, 
+  { 0x2f844, 1, 5723 }, 
+  { 0x2f845, 1, 5724 }, 
+  { 0x2f846, 1, 5724 }, 
+  { 0x2f847, 1, 5725 }, 
+  { 0x2f848, 1, 5726 }, 
+  { 0x2f849, 1, 5727 }, 
+  { 0x2f84a, 1, 5728 }, 
+  { 0x2f84b, 1, 5729 }, 
+  { 0x2f84c, 1, 4556 }, 
+  { 0x2f84d, 1, 5730 }, 
+  { 0x2f84e, 1, 5731 }, 
+  { 0x2f84f, 1, 5732 }, 
+  { 0x2f850, 1, 4518 }, 
+  { 0x2f851, 1, 5733 }, 
+  { 0x2f852, 1, 5734 }, 
+  { 0x2f853, 1, 5735 }, 
+  { 0x2f854, 1, 5736 }, 
+  { 0x2f855, 1, 5737 }, 
+  { 0x2f856, 1, 5738 }, 
+  { 0x2f857, 1, 5739 }, 
+  { 0x2f858, 1, 5740 }, 
+  { 0x2f859, 1, 5741 }, 
+  { 0x2f85a, 1, 5742 }, 
+  { 0x2f85b, 1, 5743 }, 
+  { 0x2f85c, 1, 5744 }, 
+  { 0x2f85d, 1, 5745 }, 
+  { 0x2f85e, 1, 5746 }, 
+  { 0x2f85f, 1, 5747 }, 
+  { 0x2f860, 1, 5748 }, 
+  { 0x2f861, 1, 5749 }, 
+  { 0x2f862, 1, 5750 }, 
+  { 0x2f863, 1, 5751 }, 
+  { 0x2f864, 1, 5752 }, 
+  { 0x2f865, 1, 5753 }, 
+  { 0x2f866, 1, 5754 }, 
+  { 0x2f867, 1, 5755 }, 
+  { 0x2f868, 1, 5756 }, 
+  { 0x2f869, 1, 5757 }, 
+  { 0x2f86a, 1, 5758 }, 
+  { 0x2f86b, 1, 5758 }, 
+  { 0x2f86c, 1, 5759 }, 
+  { 0x2f86d, 1, 5760 }, 
+  { 0x2f86e, 1, 5761 }, 
+  { 0x2f86f, 1, 4368 }, 
+  { 0x2f870, 1, 5762 }, 
+  { 0x2f871, 1, 5763 }, 
+  { 0x2f872, 1, 5764 }, 
+  { 0x2f873, 1, 5765 }, 
+  { 0x2f874, 1, 5766 }, 
+  { 0x2f875, 1, 2724 }, 
+  { 0x2f876, 1, 5767 }, 
+  { 0x2f877, 1, 5768 }, 
+  { 0x2f878, 1, 2726 }, 
+  { 0x2f879, 1, 5769 }, 
+  { 0x2f87a, 1, 5770 }, 
+  { 0x2f87b, 1, 5771 }, 
+  { 0x2f87c, 1, 5772 }, 
+  { 0x2f87d, 1, 5773 }, 
+  { 0x2f87e, 1, 5774 }, 
+  { 0x2f87f, 1, 5775 }, 
+  { 0x2f880, 1, 5776 }, 
+  { 0x2f881, 1, 5777 }, 
+  { 0x2f882, 1, 5778 }, 
+  { 0x2f883, 1, 5779 }, 
+  { 0x2f884, 1, 5780 }, 
+  { 0x2f885, 1, 5781 }, 
+  { 0x2f886, 1, 5782 }, 
+  { 0x2f887, 1, 5783 }, 
+  { 0x2f888, 1, 5784 }, 
+  { 0x2f889, 1, 5785 }, 
+  { 0x2f88a, 1, 5786 }, 
+  { 0x2f88b, 1, 5787 }, 
+  { 0x2f88c, 1, 5788 }, 
+  { 0x2f88d, 1, 5789 }, 
+  { 0x2f88e, 1, 4316 }, 
+  { 0x2f88f, 1, 5790 }, 
+  { 0x2f890, 1, 2736 }, 
+  { 0x2f891, 1, 5791 }, 
+  { 0x2f892, 1, 5791 }, 
+  { 0x2f893, 1, 5792 }, 
+  { 0x2f894, 1, 5793 }, 
+  { 0x2f895, 1, 5793 }, 
+  { 0x2f896, 1, 5794 }, 
+  { 0x2f897, 1, 5795 }, 
+  { 0x2f898, 1, 5796 }, 
+  { 0x2f899, 1, 5797 }, 
+  { 0x2f89a, 1, 5798 }, 
+  { 0x2f89b, 1, 5799 }, 
+  { 0x2f89c, 1, 5800 }, 
+  { 0x2f89d, 1, 5801 }, 
+  { 0x2f89e, 1, 5802 }, 
+  { 0x2f89f, 1, 5803 }, 
+  { 0x2f8a0, 1, 5804 }, 
+  { 0x2f8a1, 1, 5805 }, 
+  { 0x2f8a2, 1, 5806 }, 
+  { 0x2f8a3, 1, 4561 }, 
+  { 0x2f8a4, 1, 5807 }, 
+  { 0x2f8a5, 1, 5808 }, 
+  { 0x2f8a6, 1, 5809 }, 
+  { 0x2f8a7, 1, 5810 }, 
+  { 0x2f8a8, 1, 5811 }, 
+  { 0x2f8a9, 1, 5810 }, 
+  { 0x2f8aa, 1, 5812 }, 
+  { 0x2f8ab, 1, 4563 }, 
+  { 0x2f8ac, 1, 5813 }, 
+  { 0x2f8ad, 1, 5814 }, 
+  { 0x2f8ae, 1, 5815 }, 
+  { 0x2f8af, 1, 5816 }, 
+  { 0x2f8b0, 1, 4564 }, 
+  { 0x2f8b1, 1, 4289 }, 
+  { 0x2f8b2, 1, 5817 }, 
+  { 0x2f8b3, 1, 5818 }, 
+  { 0x2f8b4, 1, 5819 }, 
+  { 0x2f8b5, 1, 5820 }, 
+  { 0x2f8b6, 1, 5821 }, 
+  { 0x2f8b7, 1, 5822 }, 
+  { 0x2f8b8, 1, 5823 }, 
+  { 0x2f8b9, 1, 5824 }, 
+  { 0x2f8ba, 1, 5825 }, 
+  { 0x2f8bb, 1, 5826 }, 
+  { 0x2f8bc, 1, 5827 }, 
+  { 0x2f8bd, 1, 5828 }, 
+  { 0x2f8be, 1, 5829 }, 
+  { 0x2f8bf, 1, 5830 }, 
+  { 0x2f8c0, 1, 5831 }, 
+  { 0x2f8c1, 1, 5832 }, 
+  { 0x2f8c2, 1, 5833 }, 
+  { 0x2f8c3, 1, 5834 }, 
+  { 0x2f8c4, 1, 5835 }, 
+  { 0x2f8c5, 1, 5836 }, 
+  { 0x2f8c6, 1, 5837 }, 
+  { 0x2f8c7, 1, 5838 }, 
+  { 0x2f8c8, 1, 4565 }, 
+  { 0x2f8c9, 1, 5839 }, 
+  { 0x2f8ca, 1, 5840 }, 
+  { 0x2f8cb, 1, 5841 }, 
+  { 0x2f8cc, 1, 5842 }, 
+  { 0x2f8cd, 1, 5843 }, 
+  { 0x2f8ce, 1, 5844 }, 
+  { 0x2f8cf, 1, 4567 }, 
+  { 0x2f8d0, 1, 5845 }, 
+  { 0x2f8d1, 1, 5846 }, 
+  { 0x2f8d2, 1, 5847 }, 
+  { 0x2f8d3, 1, 5848 }, 
+  { 0x2f8d4, 1, 5849 }, 
+  { 0x2f8d5, 1, 5850 }, 
+  { 0x2f8d6, 1, 5851 }, 
+  { 0x2f8d7, 1, 5852 }, 
+  { 0x2f8d8, 1, 4317 }, 
+  { 0x2f8d9, 1, 5853 }, 
+  { 0x2f8da, 1, 5854 }, 
+  { 0x2f8db, 1, 5855 }, 
+  { 0x2f8dc, 1, 5856 }, 
+  { 0x2f8dd, 1, 5857 }, 
+  { 0x2f8de, 1, 5858 }, 
+  { 0x2f8df, 1, 5859 }, 
+  { 0x2f8e0, 1, 5860 }, 
+  { 0x2f8e1, 1, 5861 }, 
+  { 0x2f8e2, 1, 4568 }, 
+  { 0x2f8e3, 1, 5862 }, 
+  { 0x2f8e4, 1, 5863 }, 
+  { 0x2f8e5, 1, 5864 }, 
+  { 0x2f8e6, 1, 5865 }, 
+  { 0x2f8e7, 1, 5866 }, 
+  { 0x2f8e8, 1, 5867 }, 
+  { 0x2f8e9, 1, 5868 }, 
+  { 0x2f8ea, 1, 5869 }, 
+  { 0x2f8eb, 1, 5870 }, 
+  { 0x2f8ec, 1, 5871 }, 
+  { 0x2f8ed, 1, 5872 }, 
+  { 0x2f8ee, 1, 5873 }, 
+  { 0x2f8ef, 1, 5874 }, 
+  { 0x2f8f0, 1, 5875 }, 
+  { 0x2f8f1, 1, 5876 }, 
+  { 0x2f8f2, 1, 5877 }, 
+  { 0x2f8f3, 1, 5878 }, 
+  { 0x2f8f4, 1, 5879 }, 
+  { 0x2f8f5, 1, 4385 }, 
+  { 0x2f8f6, 1, 5880 }, 
+  { 0x2f8f7, 1, 5881 }, 
+  { 0x2f8f8, 1, 5882 }, 
+  { 0x2f8f9, 1, 5883 }, 
+  { 0x2f8fa, 1, 5884 }, 
+  { 0x2f8fb, 1, 5885 }, 
+  { 0x2f8fc, 1, 5886 }, 
+  { 0x2f8fd, 1, 5887 }, 
+  { 0x2f8fe, 1, 5888 }, 
+  { 0x2f8ff, 1, 5889 }, 
+  { 0x2f900, 1, 5890 }, 
+  { 0x2f901, 1, 4569 }, 
+  { 0x2f902, 1, 4468 }, 
+  { 0x2f903, 1, 5891 }, 
+  { 0x2f904, 1, 5892 }, 
+  { 0x2f905, 1, 5893 }, 
+  { 0x2f906, 1, 5894 }, 
+  { 0x2f907, 1, 5895 }, 
+  { 0x2f908, 1, 5896 }, 
+  { 0x2f909, 1, 5897 }, 
+  { 0x2f90a, 1, 5898 }, 
+  { 0x2f90b, 1, 5899 }, 
+  { 0x2f90c, 1, 5900 }, 
+  { 0x2f90d, 1, 5901 }, 
+  { 0x2f90e, 1, 5902 }, 
+  { 0x2f90f, 1, 5903 }, 
+  { 0x2f910, 1, 5904 }, 
+  { 0x2f911, 1, 5905 }, 
+  { 0x2f912, 1, 5906 }, 
+  { 0x2f913, 1, 5907 }, 
+  { 0x2f914, 1, 5908 }, 
+  { 0x2f915, 1, 5909 }, 
+  { 0x2f916, 1, 5910 }, 
+  { 0x2f917, 1, 5911 }, 
+  { 0x2f918, 1, 5912 }, 
+  { 0x2f919, 1, 5913 }, 
+  { 0x2f91a, 1, 5914 }, 
+  { 0x2f91b, 1, 5915 }, 
+  { 0x2f91c, 1, 5916 }, 
+  { 0x2f91d, 1, 5917 }, 
+  { 0x2f91e, 1, 5918 }, 
+  { 0x2f91f, 1, 5919 }, 
+  { 0x2f920, 1, 5920 }, 
+  { 0x2f921, 1, 5921 }, 
+  { 0x2f922, 1, 5922 }, 
+  { 0x2f923, 1, 5923 }, 
+  { 0x2f924, 1, 5924 }, 
+  { 0x2f925, 1, 5925 }, 
+  { 0x2f926, 1, 5926 }, 
+  { 0x2f927, 1, 5927 }, 
+  { 0x2f928, 1, 5928 }, 
+  { 0x2f929, 1, 5929 }, 
+  { 0x2f92a, 1, 5930 }, 
+  { 0x2f92b, 1, 5931 }, 
+  { 0x2f92c, 1, 5932 }, 
+  { 0x2f92d, 1, 5932 }, 
+  { 0x2f92e, 1, 5933 }, 
+  { 0x2f92f, 1, 5934 }, 
+  { 0x2f930, 1, 5935 }, 
+  { 0x2f931, 1, 5936 }, 
+  { 0x2f932, 1, 5937 }, 
+  { 0x2f933, 1, 5938 }, 
+  { 0x2f934, 1, 5939 }, 
+  { 0x2f935, 1, 5940 }, 
+  { 0x2f936, 1, 5941 }, 
+  { 0x2f937, 1, 5942 }, 
+  { 0x2f938, 1, 4371 }, 
+  { 0x2f939, 1, 5943 }, 
+  { 0x2f93a, 1, 5944 }, 
+  { 0x2f93b, 1, 5945 }, 
+  { 0x2f93c, 1, 5946 }, 
+  { 0x2f93d, 1, 5947 }, 
+  { 0x2f93e, 1, 5948 }, 
+  { 0x2f93f, 1, 5949 }, 
+  { 0x2f940, 1, 5950 }, 
+  { 0x2f941, 1, 5951 }, 
+  { 0x2f942, 1, 5952 }, 
+  { 0x2f943, 1, 5953 }, 
+  { 0x2f944, 1, 5954 }, 
+  { 0x2f945, 1, 5955 }, 
+  { 0x2f946, 1, 5956 }, 
+  { 0x2f947, 1, 5956 }, 
+  { 0x2f948, 1, 5957 }, 
+  { 0x2f949, 1, 5958 }, 
+  { 0x2f94a, 1, 5959 }, 
+  { 0x2f94b, 1, 5960 }, 
+  { 0x2f94c, 1, 5961 }, 
+  { 0x2f94d, 1, 5962 }, 
+  { 0x2f94e, 1, 5963 }, 
+  { 0x2f94f, 1, 4334 }, 
+  { 0x2f950, 1, 5964 }, 
+  { 0x2f951, 1, 5965 }, 
+  { 0x2f952, 1, 5966 }, 
+  { 0x2f953, 1, 4579 }, 
+  { 0x2f954, 1, 5967 }, 
+  { 0x2f955, 1, 5968 }, 
+  { 0x2f956, 1, 4538 }, 
+  { 0x2f957, 1, 5969 }, 
+  { 0x2f958, 1, 5970 }, 
+  { 0x2f959, 1, 4582 }, 
+  { 0x2f95a, 1, 5971 }, 
+  { 0x2f95b, 1, 5972 }, 
+  { 0x2f95c, 1, 5973 }, 
+  { 0x2f95d, 1, 5974 }, 
+  { 0x2f95e, 1, 5974 }, 
+  { 0x2f95f, 1, 5975 }, 
+  { 0x2f960, 1, 5976 }, 
+  { 0x2f961, 1, 5977 }, 
+  { 0x2f962, 1, 5978 }, 
+  { 0x2f963, 1, 5979 }, 
+  { 0x2f964, 1, 5980 }, 
+  { 0x2f965, 1, 5981 }, 
+  { 0x2f966, 1, 5982 }, 
+  { 0x2f967, 1, 5983 }, 
+  { 0x2f968, 1, 5984 }, 
+  { 0x2f969, 1, 5985 }, 
+  { 0x2f96a, 1, 5986 }, 
+  { 0x2f96b, 1, 5987 }, 
+  { 0x2f96c, 1, 5988 }, 
+  { 0x2f96d, 1, 5989 }, 
+  { 0x2f96e, 1, 5990 }, 
+  { 0x2f96f, 1, 5991 }, 
+  { 0x2f970, 1, 5992 }, 
+  { 0x2f971, 1, 5993 }, 
+  { 0x2f972, 1, 5994 }, 
+  { 0x2f973, 1, 5995 }, 
+  { 0x2f974, 1, 5996 }, 
+  { 0x2f975, 1, 5997 }, 
+  { 0x2f976, 1, 5998 }, 
+  { 0x2f977, 1, 5999 }, 
+  { 0x2f978, 1, 6000 }, 
+  { 0x2f979, 1, 6001 }, 
+  { 0x2f97a, 1, 4588 }, 
+  { 0x2f97b, 1, 6002 }, 
+  { 0x2f97c, 1, 6003 }, 
+  { 0x2f97d, 1, 6004 }, 
+  { 0x2f97e, 1, 6005 }, 
+  { 0x2f97f, 1, 6006 }, 
+  { 0x2f980, 1, 6007 }, 
+  { 0x2f981, 1, 6008 }, 
+  { 0x2f982, 1, 6009 }, 
+  { 0x2f983, 1, 6010 }, 
+  { 0x2f984, 1, 6011 }, 
+  { 0x2f985, 1, 6012 }, 
+  { 0x2f986, 1, 6013 }, 
+  { 0x2f987, 1, 6014 }, 
+  { 0x2f988, 1, 6015 }, 
+  { 0x2f989, 1, 6016 }, 
+  { 0x2f98a, 1, 6017 }, 
+  { 0x2f98b, 1, 5792 }, 
+  { 0x2f98c, 1, 6018 }, 
+  { 0x2f98d, 1, 6019 }, 
+  { 0x2f98e, 1, 6020 }, 
+  { 0x2f98f, 1, 6021 }, 
+  { 0x2f990, 1, 6022 }, 
+  { 0x2f991, 1, 6023 }, 
+  { 0x2f992, 1, 6024 }, 
+  { 0x2f993, 1, 6025 }, 
+  { 0x2f994, 1, 6026 }, 
+  { 0x2f995, 1, 6027 }, 
+  { 0x2f996, 1, 6028 }, 
+  { 0x2f997, 1, 6029 }, 
+  { 0x2f998, 1, 4388 }, 
+  { 0x2f999, 1, 6030 }, 
+  { 0x2f99a, 1, 6031 }, 
+  { 0x2f99b, 1, 6032 }, 
+  { 0x2f99c, 1, 6033 }, 
+  { 0x2f99d, 1, 6034 }, 
+  { 0x2f99e, 1, 6035 }, 
+  { 0x2f99f, 1, 4591 }, 
+  { 0x2f9a0, 1, 6036 }, 
+  { 0x2f9a1, 1, 6037 }, 
+  { 0x2f9a2, 1, 6038 }, 
+  { 0x2f9a3, 1, 6039 }, 
+  { 0x2f9a4, 1, 6040 }, 
+  { 0x2f9a5, 1, 6041 }, 
+  { 0x2f9a6, 1, 6042 }, 
+  { 0x2f9a7, 1, 6043 }, 
+  { 0x2f9a8, 1, 6044 }, 
+  { 0x2f9a9, 1, 6045 }, 
+  { 0x2f9aa, 1, 6046 }, 
+  { 0x2f9ab, 1, 6047 }, 
+  { 0x2f9ac, 1, 6048 }, 
+  { 0x2f9ad, 1, 6049 }, 
+  { 0x2f9ae, 1, 6050 }, 
+  { 0x2f9af, 1, 6051 }, 
+  { 0x2f9b0, 1, 6052 }, 
+  { 0x2f9b1, 1, 6053 }, 
+  { 0x2f9b2, 1, 6054 }, 
+  { 0x2f9b3, 1, 6055 }, 
+  { 0x2f9b4, 1, 4329 }, 
+  { 0x2f9b5, 1, 6056 }, 
+  { 0x2f9b6, 1, 6057 }, 
+  { 0x2f9b7, 1, 6058 }, 
+  { 0x2f9b8, 1, 6059 }, 
+  { 0x2f9b9, 1, 6060 }, 
+  { 0x2f9ba, 1, 6061 }, 
+  { 0x2f9bb, 1, 6062 }, 
+  { 0x2f9bc, 1, 6063 }, 
+  { 0x2f9bd, 1, 6064 }, 
+  { 0x2f9be, 1, 6065 }, 
+  { 0x2f9bf, 1, 6066 }, 
+  { 0x2f9c0, 1, 6067 }, 
+  { 0x2f9c1, 1, 6068 }, 
+  { 0x2f9c2, 1, 6069 }, 
+  { 0x2f9c3, 1, 6070 }, 
+  { 0x2f9c4, 1, 2826 }, 
+  { 0x2f9c5, 1, 6071 }, 
+  { 0x2f9c6, 1, 6072 }, 
+  { 0x2f9c7, 1, 6073 }, 
+  { 0x2f9c8, 1, 6074 }, 
+  { 0x2f9c9, 1, 6075 }, 
+  { 0x2f9ca, 1, 6076 }, 
+  { 0x2f9cb, 1, 6077 }, 
+  { 0x2f9cc, 1, 6078 }, 
+  { 0x2f9cd, 1, 6079 }, 
+  { 0x2f9ce, 1, 6080 }, 
+  { 0x2f9cf, 1, 6081 }, 
+  { 0x2f9d0, 1, 6082 }, 
+  { 0x2f9d1, 1, 6083 }, 
+  { 0x2f9d2, 1, 2833 }, 
+  { 0x2f9d3, 1, 6084 }, 
+  { 0x2f9d4, 1, 6085 }, 
+  { 0x2f9d5, 1, 6086 }, 
+  { 0x2f9d6, 1, 6087 }, 
+  { 0x2f9d7, 1, 6088 }, 
+  { 0x2f9d8, 1, 6089 }, 
+  { 0x2f9d9, 1, 6090 }, 
+  { 0x2f9da, 1, 6091 }, 
+  { 0x2f9db, 1, 6092 }, 
+  { 0x2f9dc, 1, 6093 }, 
+  { 0x2f9dd, 1, 6094 }, 
+  { 0x2f9de, 1, 6095 }, 
+  { 0x2f9df, 1, 6096 }, 
+  { 0x2f9e0, 1, 6097 }, 
+  { 0x2f9e1, 1, 6098 }, 
+  { 0x2f9e2, 1, 6099 }, 
+  { 0x2f9e3, 1, 6100 }, 
+  { 0x2f9e4, 1, 6101 }, 
+  { 0x2f9e5, 1, 6102 }, 
+  { 0x2f9e6, 1, 6103 }, 
+  { 0x2f9e7, 1, 6104 }, 
+  { 0x2f9e8, 1, 6105 }, 
+  { 0x2f9e9, 1, 6106 }, 
+  { 0x2f9ea, 1, 6107 }, 
+  { 0x2f9eb, 1, 6108 }, 
+  { 0x2f9ec, 1, 6109 }, 
+  { 0x2f9ed, 1, 6110 }, 
+  { 0x2f9ee, 1, 6111 }, 
+  { 0x2f9ef, 1, 6112 }, 
+  { 0x2f9f0, 1, 6113 }, 
+  { 0x2f9f1, 1, 6114 }, 
+  { 0x2f9f2, 1, 6115 }, 
+  { 0x2f9f3, 1, 6116 }, 
+  { 0x2f9f4, 1, 6117 }, 
+  { 0x2f9f5, 1, 6118 }, 
+  { 0x2f9f6, 1, 6119 }, 
+  { 0x2f9f7, 1, 6120 }, 
+  { 0x2f9f8, 1, 6121 }, 
+  { 0x2f9f9, 1, 6122 }, 
+  { 0x2f9fa, 1, 6123 }, 
+  { 0x2f9fb, 1, 6124 }, 
+  { 0x2f9fc, 1, 6125 }, 
+  { 0x2f9fd, 1, 6126 }, 
+  { 0x2f9fe, 1, 6127 }, 
+  { 0x2f9ff, 1, 6127 }, 
+  { 0x2fa00, 1, 6128 }, 
+  { 0x2fa01, 1, 6129 }, 
+  { 0x2fa02, 1, 6130 }, 
+  { 0x2fa03, 1, 6131 }, 
+  { 0x2fa04, 1, 6132 }, 
+  { 0x2fa05, 1, 6133 }, 
+  { 0x2fa06, 1, 6134 }, 
+  { 0x2fa07, 1, 6135 }, 
+  { 0x2fa08, 1, 6136 }, 
+  { 0x2fa09, 1, 6137 }, 
+  { 0x2fa0a, 1, 6138 }, 
+  { 0x2fa0b, 1, 6139 }, 
+  { 0x2fa0c, 1, 6140 }, 
+  { 0x2fa0d, 1, 6141 }, 
+  { 0x2fa0e, 1, 6142 }, 
+  { 0x2fa0f, 1, 6143 }, 
+  { 0x2fa10, 1, 6144 }, 
+  { 0x2fa11, 1, 6145 }, 
+  { 0x2fa12, 1, 6146 }, 
+  { 0x2fa13, 1, 6147 }, 
+  { 0x2fa14, 1, 6148 }, 
+  { 0x2fa15, 1, 2881 }, 
+  { 0x2fa16, 1, 6149 }, 
+  { 0x2fa17, 1, 2885 }, 
+  { 0x2fa18, 1, 6150 }, 
+  { 0x2fa19, 1, 6151 }, 
+  { 0x2fa1a, 1, 6152 }, 
+  { 0x2fa1b, 1, 6153 }, 
+  { 0x2fa1c, 1, 2890 }, 
+  { 0x2fa1d, 1, 6154 }
+};
+
+static const Unicode decomp_expansion[] = {
+  0x20 /* offset 0 */ , 
+  0x20, 0x308 /* offset 1 */ , 
+  0x61 /* offset 3 */ , 
+  0x20, 0x304 /* offset 4 */ , 
+  0x32 /* offset 6 */ , 
+  0x33 /* offset 7 */ , 
+  0x20, 0x301 /* offset 8 */ , 
+  0x3bc /* offset 10 */ , 
+  0x20, 0x327 /* offset 11 */ , 
+  0x31 /* offset 13 */ , 
+  0x6f /* offset 14 */ , 
+  0x31, 0x2044, 0x34 /* offset 15 */ , 
+  0x31, 0x2044, 0x32 /* offset 18 */ , 
+  0x33, 0x2044, 0x34 /* offset 21 */ , 
+  0x41, 0x300 /* offset 24 */ , 
+  0x41, 0x301 /* offset 26 */ , 
+  0x41, 0x302 /* offset 28 */ , 
+  0x41, 0x303 /* offset 30 */ , 
+  0x41, 0x308 /* offset 32 */ , 
+  0x41, 0x30a /* offset 34 */ , 
+  0x43, 0x327 /* offset 36 */ , 
+  0x45, 0x300 /* offset 38 */ , 
+  0x45, 0x301 /* offset 40 */ , 
+  0x45, 0x302 /* offset 42 */ , 
+  0x45, 0x308 /* offset 44 */ , 
+  0x49, 0x300 /* offset 46 */ , 
+  0x49, 0x301 /* offset 48 */ , 
+  0x49, 0x302 /* offset 50 */ , 
+  0x49, 0x308 /* offset 52 */ , 
+  0x4e, 0x303 /* offset 54 */ , 
+  0x4f, 0x300 /* offset 56 */ , 
+  0x4f, 0x301 /* offset 58 */ , 
+  0x4f, 0x302 /* offset 60 */ , 
+  0x4f, 0x303 /* offset 62 */ , 
+  0x4f, 0x308 /* offset 64 */ , 
+  0x55, 0x300 /* offset 66 */ , 
+  0x55, 0x301 /* offset 68 */ , 
+  0x55, 0x302 /* offset 70 */ , 
+  0x55, 0x308 /* offset 72 */ , 
+  0x59, 0x301 /* offset 74 */ , 
+  0x61, 0x300 /* offset 76 */ , 
+  0x61, 0x301 /* offset 78 */ , 
+  0x61, 0x302 /* offset 80 */ , 
+  0x61, 0x303 /* offset 82 */ , 
+  0x61, 0x308 /* offset 84 */ , 
+  0x61, 0x30a /* offset 86 */ , 
+  0x63, 0x327 /* offset 88 */ , 
+  0x65, 0x300 /* offset 90 */ , 
+  0x65, 0x301 /* offset 92 */ , 
+  0x65, 0x302 /* offset 94 */ , 
+  0x65, 0x308 /* offset 96 */ , 
+  0x69, 0x300 /* offset 98 */ , 
+  0x69, 0x301 /* offset 100 */ , 
+  0x69, 0x302 /* offset 102 */ , 
+  0x69, 0x308 /* offset 104 */ , 
+  0x6e, 0x303 /* offset 106 */ , 
+  0x6f, 0x300 /* offset 108 */ , 
+  0x6f, 0x301 /* offset 110 */ , 
+  0x6f, 0x302 /* offset 112 */ , 
+  0x6f, 0x303 /* offset 114 */ , 
+  0x6f, 0x308 /* offset 116 */ , 
+  0x75, 0x300 /* offset 118 */ , 
+  0x75, 0x301 /* offset 120 */ , 
+  0x75, 0x302 /* offset 122 */ , 
+  0x75, 0x308 /* offset 124 */ , 
+  0x79, 0x301 /* offset 126 */ , 
+  0x79, 0x308 /* offset 128 */ , 
+  0x41, 0x304 /* offset 130 */ , 
+  0x61, 0x304 /* offset 132 */ , 
+  0x41, 0x306 /* offset 134 */ , 
+  0x61, 0x306 /* offset 136 */ , 
+  0x41, 0x328 /* offset 138 */ , 
+  0x61, 0x328 /* offset 140 */ , 
+  0x43, 0x301 /* offset 142 */ , 
+  0x63, 0x301 /* offset 144 */ , 
+  0x43, 0x302 /* offset 146 */ , 
+  0x63, 0x302 /* offset 148 */ , 
+  0x43, 0x307 /* offset 150 */ , 
+  0x63, 0x307 /* offset 152 */ , 
+  0x43, 0x30c /* offset 154 */ , 
+  0x63, 0x30c /* offset 156 */ , 
+  0x44, 0x30c /* offset 158 */ , 
+  0x64, 0x30c /* offset 160 */ , 
+  0x45, 0x304 /* offset 162 */ , 
+  0x65, 0x304 /* offset 164 */ , 
+  0x45, 0x306 /* offset 166 */ , 
+  0x65, 0x306 /* offset 168 */ , 
+  0x45, 0x307 /* offset 170 */ , 
+  0x65, 0x307 /* offset 172 */ , 
+  0x45, 0x328 /* offset 174 */ , 
+  0x65, 0x328 /* offset 176 */ , 
+  0x45, 0x30c /* offset 178 */ , 
+  0x65, 0x30c /* offset 180 */ , 
+  0x47, 0x302 /* offset 182 */ , 
+  0x67, 0x302 /* offset 184 */ , 
+  0x47, 0x306 /* offset 186 */ , 
+  0x67, 0x306 /* offset 188 */ , 
+  0x47, 0x307 /* offset 190 */ , 
+  0x67, 0x307 /* offset 192 */ , 
+  0x47, 0x327 /* offset 194 */ , 
+  0x67, 0x327 /* offset 196 */ , 
+  0x48, 0x302 /* offset 198 */ , 
+  0x68, 0x302 /* offset 200 */ , 
+  0x49, 0x303 /* offset 202 */ , 
+  0x69, 0x303 /* offset 204 */ , 
+  0x49, 0x304 /* offset 206 */ , 
+  0x69, 0x304 /* offset 208 */ , 
+  0x49, 0x306 /* offset 210 */ , 
+  0x69, 0x306 /* offset 212 */ , 
+  0x49, 0x328 /* offset 214 */ , 
+  0x69, 0x328 /* offset 216 */ , 
+  0x49, 0x307 /* offset 218 */ , 
+  0x49, 0x4a /* offset 220 */ , 
+  0x69, 0x6a /* offset 222 */ , 
+  0x4a, 0x302 /* offset 224 */ , 
+  0x6a, 0x302 /* offset 226 */ , 
+  0x4b, 0x327 /* offset 228 */ , 
+  0x6b, 0x327 /* offset 230 */ , 
+  0x4c, 0x301 /* offset 232 */ , 
+  0x6c, 0x301 /* offset 234 */ , 
+  0x4c, 0x327 /* offset 236 */ , 
+  0x6c, 0x327 /* offset 238 */ , 
+  0x4c, 0x30c /* offset 240 */ , 
+  0x6c, 0x30c /* offset 242 */ , 
+  0x4c, 0xb7 /* offset 244 */ , 
+  0x6c, 0xb7 /* offset 246 */ , 
+  0x4e, 0x301 /* offset 248 */ , 
+  0x6e, 0x301 /* offset 250 */ , 
+  0x4e, 0x327 /* offset 252 */ , 
+  0x6e, 0x327 /* offset 254 */ , 
+  0x4e, 0x30c /* offset 256 */ , 
+  0x6e, 0x30c /* offset 258 */ , 
+  0x2bc, 0x6e /* offset 260 */ , 
+  0x4f, 0x304 /* offset 262 */ , 
+  0x6f, 0x304 /* offset 264 */ , 
+  0x4f, 0x306 /* offset 266 */ , 
+  0x6f, 0x306 /* offset 268 */ , 
+  0x4f, 0x30b /* offset 270 */ , 
+  0x6f, 0x30b /* offset 272 */ , 
+  0x52, 0x301 /* offset 274 */ , 
+  0x72, 0x301 /* offset 276 */ , 
+  0x52, 0x327 /* offset 278 */ , 
+  0x72, 0x327 /* offset 280 */ , 
+  0x52, 0x30c /* offset 282 */ , 
+  0x72, 0x30c /* offset 284 */ , 
+  0x53, 0x301 /* offset 286 */ , 
+  0x73, 0x301 /* offset 288 */ , 
+  0x53, 0x302 /* offset 290 */ , 
+  0x73, 0x302 /* offset 292 */ , 
+  0x53, 0x327 /* offset 294 */ , 
+  0x73, 0x327 /* offset 296 */ , 
+  0x53, 0x30c /* offset 298 */ , 
+  0x73, 0x30c /* offset 300 */ , 
+  0x54, 0x327 /* offset 302 */ , 
+  0x74, 0x327 /* offset 304 */ , 
+  0x54, 0x30c /* offset 306 */ , 
+  0x74, 0x30c /* offset 308 */ , 
+  0x55, 0x303 /* offset 310 */ , 
+  0x75, 0x303 /* offset 312 */ , 
+  0x55, 0x304 /* offset 314 */ , 
+  0x75, 0x304 /* offset 316 */ , 
+  0x55, 0x306 /* offset 318 */ , 
+  0x75, 0x306 /* offset 320 */ , 
+  0x55, 0x30a /* offset 322 */ , 
+  0x75, 0x30a /* offset 324 */ , 
+  0x55, 0x30b /* offset 326 */ , 
+  0x75, 0x30b /* offset 328 */ , 
+  0x55, 0x328 /* offset 330 */ , 
+  0x75, 0x328 /* offset 332 */ , 
+  0x57, 0x302 /* offset 334 */ , 
+  0x77, 0x302 /* offset 336 */ , 
+  0x59, 0x302 /* offset 338 */ , 
+  0x79, 0x302 /* offset 340 */ , 
+  0x59, 0x308 /* offset 342 */ , 
+  0x5a, 0x301 /* offset 344 */ , 
+  0x7a, 0x301 /* offset 346 */ , 
+  0x5a, 0x307 /* offset 348 */ , 
+  0x7a, 0x307 /* offset 350 */ , 
+  0x5a, 0x30c /* offset 352 */ , 
+  0x7a, 0x30c /* offset 354 */ , 
+  0x73 /* offset 356 */ , 
+  0x4f, 0x31b /* offset 357 */ , 
+  0x6f, 0x31b /* offset 359 */ , 
+  0x55, 0x31b /* offset 361 */ , 
+  0x75, 0x31b /* offset 363 */ , 
+  0x44, 0x5a, 0x30c /* offset 365 */ , 
+  0x44, 0x7a, 0x30c /* offset 368 */ , 
+  0x64, 0x7a, 0x30c /* offset 371 */ , 
+  0x4c, 0x4a /* offset 374 */ , 
+  0x4c, 0x6a /* offset 376 */ , 
+  0x6c, 0x6a /* offset 378 */ , 
+  0x4e, 0x4a /* offset 380 */ , 
+  0x4e, 0x6a /* offset 382 */ , 
+  0x6e, 0x6a /* offset 384 */ , 
+  0x41, 0x30c /* offset 386 */ , 
+  0x61, 0x30c /* offset 388 */ , 
+  0x49, 0x30c /* offset 390 */ , 
+  0x69, 0x30c /* offset 392 */ , 
+  0x4f, 0x30c /* offset 394 */ , 
+  0x6f, 0x30c /* offset 396 */ , 
+  0x55, 0x30c /* offset 398 */ , 
+  0x75, 0x30c /* offset 400 */ , 
+  0x55, 0x308, 0x304 /* offset 402 */ , 
+  0x75, 0x308, 0x304 /* offset 405 */ , 
+  0x55, 0x308, 0x301 /* offset 408 */ , 
+  0x75, 0x308, 0x301 /* offset 411 */ , 
+  0x55, 0x308, 0x30c /* offset 414 */ , 
+  0x75, 0x308, 0x30c /* offset 417 */ , 
+  0x55, 0x308, 0x300 /* offset 420 */ , 
+  0x75, 0x308, 0x300 /* offset 423 */ , 
+  0x41, 0x308, 0x304 /* offset 426 */ , 
+  0x61, 0x308, 0x304 /* offset 429 */ , 
+  0x41, 0x307, 0x304 /* offset 432 */ , 
+  0x61, 0x307, 0x304 /* offset 435 */ , 
+  0xc6, 0x304 /* offset 438 */ , 
+  0xe6, 0x304 /* offset 440 */ , 
+  0x47, 0x30c /* offset 442 */ , 
+  0x67, 0x30c /* offset 444 */ , 
+  0x4b, 0x30c /* offset 446 */ , 
+  0x6b, 0x30c /* offset 448 */ , 
+  0x4f, 0x328 /* offset 450 */ , 
+  0x6f, 0x328 /* offset 452 */ , 
+  0x4f, 0x328, 0x304 /* offset 454 */ , 
+  0x6f, 0x328, 0x304 /* offset 457 */ , 
+  0x1b7, 0x30c /* offset 460 */ , 
+  0x292, 0x30c /* offset 462 */ , 
+  0x6a, 0x30c /* offset 464 */ , 
+  0x44, 0x5a /* offset 466 */ , 
+  0x44, 0x7a /* offset 468 */ , 
+  0x64, 0x7a /* offset 470 */ , 
+  0x47, 0x301 /* offset 472 */ , 
+  0x67, 0x301 /* offset 474 */ , 
+  0x4e, 0x300 /* offset 476 */ , 
+  0x6e, 0x300 /* offset 478 */ , 
+  0x41, 0x30a, 0x301 /* offset 480 */ , 
+  0x61, 0x30a, 0x301 /* offset 483 */ , 
+  0xc6, 0x301 /* offset 486 */ , 
+  0xe6, 0x301 /* offset 488 */ , 
+  0xd8, 0x301 /* offset 490 */ , 
+  0xf8, 0x301 /* offset 492 */ , 
+  0x41, 0x30f /* offset 494 */ , 
+  0x61, 0x30f /* offset 496 */ , 
+  0x41, 0x311 /* offset 498 */ , 
+  0x61, 0x311 /* offset 500 */ , 
+  0x45, 0x30f /* offset 502 */ , 
+  0x65, 0x30f /* offset 504 */ , 
+  0x45, 0x311 /* offset 506 */ , 
+  0x65, 0x311 /* offset 508 */ , 
+  0x49, 0x30f /* offset 510 */ , 
+  0x69, 0x30f /* offset 512 */ , 
+  0x49, 0x311 /* offset 514 */ , 
+  0x69, 0x311 /* offset 516 */ , 
+  0x4f, 0x30f /* offset 518 */ , 
+  0x6f, 0x30f /* offset 520 */ , 
+  0x4f, 0x311 /* offset 522 */ , 
+  0x6f, 0x311 /* offset 524 */ , 
+  0x52, 0x30f /* offset 526 */ , 
+  0x72, 0x30f /* offset 528 */ , 
+  0x52, 0x311 /* offset 530 */ , 
+  0x72, 0x311 /* offset 532 */ , 
+  0x55, 0x30f /* offset 534 */ , 
+  0x75, 0x30f /* offset 536 */ , 
+  0x55, 0x311 /* offset 538 */ , 
+  0x75, 0x311 /* offset 540 */ , 
+  0x53, 0x326 /* offset 542 */ , 
+  0x73, 0x326 /* offset 544 */ , 
+  0x54, 0x326 /* offset 546 */ , 
+  0x74, 0x326 /* offset 548 */ , 
+  0x48, 0x30c /* offset 550 */ , 
+  0x68, 0x30c /* offset 552 */ , 
+  0x41, 0x307 /* offset 554 */ , 
+  0x61, 0x307 /* offset 556 */ , 
+  0x45, 0x327 /* offset 558 */ , 
+  0x65, 0x327 /* offset 560 */ , 
+  0x4f, 0x308, 0x304 /* offset 562 */ , 
+  0x6f, 0x308, 0x304 /* offset 565 */ , 
+  0x4f, 0x303, 0x304 /* offset 568 */ , 
+  0x6f, 0x303, 0x304 /* offset 571 */ , 
+  0x4f, 0x307 /* offset 574 */ , 
+  0x6f, 0x307 /* offset 576 */ , 
+  0x4f, 0x307, 0x304 /* offset 578 */ , 
+  0x6f, 0x307, 0x304 /* offset 581 */ , 
+  0x59, 0x304 /* offset 584 */ , 
+  0x79, 0x304 /* offset 586 */ , 
+  0x68 /* offset 588 */ , 
+  0x266 /* offset 589 */ , 
+  0x6a /* offset 590 */ , 
+  0x72 /* offset 591 */ , 
+  0x279 /* offset 592 */ , 
+  0x27b /* offset 593 */ , 
+  0x281 /* offset 594 */ , 
+  0x77 /* offset 595 */ , 
+  0x79 /* offset 596 */ , 
+  0x20, 0x306 /* offset 597 */ , 
+  0x20, 0x307 /* offset 599 */ , 
+  0x20, 0x30a /* offset 601 */ , 
+  0x20, 0x328 /* offset 603 */ , 
+  0x20, 0x303 /* offset 605 */ , 
+  0x20, 0x30b /* offset 607 */ , 
+  0x263 /* offset 609 */ , 
+  0x6c /* offset 610 */ , 
+  0x78 /* offset 611 */ , 
+  0x295 /* offset 612 */ , 
+  0x300 /* offset 613 */ , 
+  0x301 /* offset 614 */ , 
+  0x313 /* offset 615 */ , 
+  0x308, 0x301 /* offset 616 */ , 
+  0x2b9 /* offset 618 */ , 
+  0x20, 0x345 /* offset 619 */ , 
+  0x3b /* offset 621 */ , 
+  0x20, 0x308, 0x301 /* offset 622 */ , 
+  0x391, 0x301 /* offset 625 */ , 
+  0xb7 /* offset 627 */ , 
+  0x395, 0x301 /* offset 628 */ , 
+  0x397, 0x301 /* offset 630 */ , 
+  0x399, 0x301 /* offset 632 */ , 
+  0x39f, 0x301 /* offset 634 */ , 
+  0x3a5, 0x301 /* offset 636 */ , 
+  0x3a9, 0x301 /* offset 638 */ , 
+  0x3b9, 0x308, 0x301 /* offset 640 */ , 
+  0x399, 0x308 /* offset 643 */ , 
+  0x3a5, 0x308 /* offset 645 */ , 
+  0x3b1, 0x301 /* offset 647 */ , 
+  0x3b5, 0x301 /* offset 649 */ , 
+  0x3b7, 0x301 /* offset 651 */ , 
+  0x3b9, 0x301 /* offset 653 */ , 
+  0x3c5, 0x308, 0x301 /* offset 655 */ , 
+  0x3b9, 0x308 /* offset 658 */ , 
+  0x3c5, 0x308 /* offset 660 */ , 
+  0x3bf, 0x301 /* offset 662 */ , 
+  0x3c5, 0x301 /* offset 664 */ , 
+  0x3c9, 0x301 /* offset 666 */ , 
+  0x3b2 /* offset 668 */ , 
+  0x3b8 /* offset 669 */ , 
+  0x3a5 /* offset 670 */ , 
+  0x3c6 /* offset 671 */ , 
+  0x3c0 /* offset 672 */ , 
+  0x3ba /* offset 673 */ , 
+  0x3c1 /* offset 674 */ , 
+  0x3c2 /* offset 675 */ , 
+  0x398 /* offset 676 */ , 
+  0x3b5 /* offset 677 */ , 
+  0x415, 0x300 /* offset 678 */ , 
+  0x415, 0x308 /* offset 680 */ , 
+  0x413, 0x301 /* offset 682 */ , 
+  0x406, 0x308 /* offset 684 */ , 
+  0x41a, 0x301 /* offset 686 */ , 
+  0x418, 0x300 /* offset 688 */ , 
+  0x423, 0x306 /* offset 690 */ , 
+  0x418, 0x306 /* offset 692 */ , 
+  0x438, 0x306 /* offset 694 */ , 
+  0x435, 0x300 /* offset 696 */ , 
+  0x435, 0x308 /* offset 698 */ , 
+  0x433, 0x301 /* offset 700 */ , 
+  0x456, 0x308 /* offset 702 */ , 
+  0x43a, 0x301 /* offset 704 */ , 
+  0x438, 0x300 /* offset 706 */ , 
+  0x443, 0x306 /* offset 708 */ , 
+  0x474, 0x30f /* offset 710 */ , 
+  0x475, 0x30f /* offset 712 */ , 
+  0x416, 0x306 /* offset 714 */ , 
+  0x436, 0x306 /* offset 716 */ , 
+  0x410, 0x306 /* offset 718 */ , 
+  0x430, 0x306 /* offset 720 */ , 
+  0x410, 0x308 /* offset 722 */ , 
+  0x430, 0x308 /* offset 724 */ , 
+  0x415, 0x306 /* offset 726 */ , 
+  0x435, 0x306 /* offset 728 */ , 
+  0x4d8, 0x308 /* offset 730 */ , 
+  0x4d9, 0x308 /* offset 732 */ , 
+  0x416, 0x308 /* offset 734 */ , 
+  0x436, 0x308 /* offset 736 */ , 
+  0x417, 0x308 /* offset 738 */ , 
+  0x437, 0x308 /* offset 740 */ , 
+  0x418, 0x304 /* offset 742 */ , 
+  0x438, 0x304 /* offset 744 */ , 
+  0x418, 0x308 /* offset 746 */ , 
+  0x438, 0x308 /* offset 748 */ , 
+  0x41e, 0x308 /* offset 750 */ , 
+  0x43e, 0x308 /* offset 752 */ , 
+  0x4e8, 0x308 /* offset 754 */ , 
+  0x4e9, 0x308 /* offset 756 */ , 
+  0x42d, 0x308 /* offset 758 */ , 
+  0x44d, 0x308 /* offset 760 */ , 
+  0x423, 0x304 /* offset 762 */ , 
+  0x443, 0x304 /* offset 764 */ , 
+  0x423, 0x308 /* offset 766 */ , 
+  0x443, 0x308 /* offset 768 */ , 
+  0x423, 0x30b /* offset 770 */ , 
+  0x443, 0x30b /* offset 772 */ , 
+  0x427, 0x308 /* offset 774 */ , 
+  0x447, 0x308 /* offset 776 */ , 
+  0x42b, 0x308 /* offset 778 */ , 
+  0x44b, 0x308 /* offset 780 */ , 
+  0x565, 0x582 /* offset 782 */ , 
+  0x627, 0x653 /* offset 784 */ , 
+  0x627, 0x654 /* offset 786 */ , 
+  0x648, 0x654 /* offset 788 */ , 
+  0x627, 0x655 /* offset 790 */ , 
+  0x64a, 0x654 /* offset 792 */ , 
+  0x627, 0x674 /* offset 794 */ , 
+  0x648, 0x674 /* offset 796 */ , 
+  0x6c7, 0x674 /* offset 798 */ , 
+  0x64a, 0x674 /* offset 800 */ , 
+  0x6d5, 0x654 /* offset 802 */ , 
+  0x6c1, 0x654 /* offset 804 */ , 
+  0x6d2, 0x654 /* offset 806 */ , 
+  0x928, 0x93c /* offset 808 */ , 
+  0x930, 0x93c /* offset 810 */ , 
+  0x933, 0x93c /* offset 812 */ , 
+  0x915, 0x93c /* offset 814 */ , 
+  0x916, 0x93c /* offset 816 */ , 
+  0x917, 0x93c /* offset 818 */ , 
+  0x91c, 0x93c /* offset 820 */ , 
+  0x921, 0x93c /* offset 822 */ , 
+  0x922, 0x93c /* offset 824 */ , 
+  0x92b, 0x93c /* offset 826 */ , 
+  0x92f, 0x93c /* offset 828 */ , 
+  0x9c7, 0x9be /* offset 830 */ , 
+  0x9c7, 0x9d7 /* offset 832 */ , 
+  0x9a1, 0x9bc /* offset 834 */ , 
+  0x9a2, 0x9bc /* offset 836 */ , 
+  0x9af, 0x9bc /* offset 838 */ , 
+  0xa32, 0xa3c /* offset 840 */ , 
+  0xa38, 0xa3c /* offset 842 */ , 
+  0xa16, 0xa3c /* offset 844 */ , 
+  0xa17, 0xa3c /* offset 846 */ , 
+  0xa1c, 0xa3c /* offset 848 */ , 
+  0xa2b, 0xa3c /* offset 850 */ , 
+  0xb47, 0xb56 /* offset 852 */ , 
+  0xb47, 0xb3e /* offset 854 */ , 
+  0xb47, 0xb57 /* offset 856 */ , 
+  0xb21, 0xb3c /* offset 858 */ , 
+  0xb22, 0xb3c /* offset 860 */ , 
+  0xb92, 0xbd7 /* offset 862 */ , 
+  0xbc6, 0xbbe /* offset 864 */ , 
+  0xbc7, 0xbbe /* offset 866 */ , 
+  0xbc6, 0xbd7 /* offset 868 */ , 
+  0xc46, 0xc56 /* offset 870 */ , 
+  0xcbf, 0xcd5 /* offset 872 */ , 
+  0xcc6, 0xcd5 /* offset 874 */ , 
+  0xcc6, 0xcd6 /* offset 876 */ , 
+  0xcc6, 0xcc2 /* offset 878 */ , 
+  0xcc6, 0xcc2, 0xcd5 /* offset 880 */ , 
+  0xd46, 0xd3e /* offset 883 */ , 
+  0xd47, 0xd3e /* offset 885 */ , 
+  0xd46, 0xd57 /* offset 887 */ , 
+  0xdd9, 0xdca /* offset 889 */ , 
+  0xdd9, 0xdcf /* offset 891 */ , 
+  0xdd9, 0xdcf, 0xdca /* offset 893 */ , 
+  0xdd9, 0xddf /* offset 896 */ , 
+  0xe4d, 0xe32 /* offset 898 */ , 
+  0xecd, 0xeb2 /* offset 900 */ , 
+  0xeab, 0xe99 /* offset 902 */ , 
+  0xeab, 0xea1 /* offset 904 */ , 
+  0xf0b /* offset 906 */ , 
+  0xf42, 0xfb7 /* offset 907 */ , 
+  0xf4c, 0xfb7 /* offset 909 */ , 
+  0xf51, 0xfb7 /* offset 911 */ , 
+  0xf56, 0xfb7 /* offset 913 */ , 
+  0xf5b, 0xfb7 /* offset 915 */ , 
+  0xf40, 0xfb5 /* offset 917 */ , 
+  0xf71, 0xf72 /* offset 919 */ , 
+  0xf71, 0xf74 /* offset 921 */ , 
+  0xfb2, 0xf80 /* offset 923 */ , 
+  0xfb2, 0xf71, 0xf80 /* offset 925 */ , 
+  0xfb3, 0xf80 /* offset 928 */ , 
+  0xfb3, 0xf71, 0xf80 /* offset 930 */ , 
+  0xf71, 0xf80 /* offset 933 */ , 
+  0xf92, 0xfb7 /* offset 935 */ , 
+  0xf9c, 0xfb7 /* offset 937 */ , 
+  0xfa1, 0xfb7 /* offset 939 */ , 
+  0xfa6, 0xfb7 /* offset 941 */ , 
+  0xfab, 0xfb7 /* offset 943 */ , 
+  0xf90, 0xfb5 /* offset 945 */ , 
+  0x1025, 0x102e /* offset 947 */ , 
+  0x41, 0x325 /* offset 949 */ , 
+  0x61, 0x325 /* offset 951 */ , 
+  0x42, 0x307 /* offset 953 */ , 
+  0x62, 0x307 /* offset 955 */ , 
+  0x42, 0x323 /* offset 957 */ , 
+  0x62, 0x323 /* offset 959 */ , 
+  0x42, 0x331 /* offset 961 */ , 
+  0x62, 0x331 /* offset 963 */ , 
+  0x43, 0x327, 0x301 /* offset 965 */ , 
+  0x63, 0x327, 0x301 /* offset 968 */ , 
+  0x44, 0x307 /* offset 971 */ , 
+  0x64, 0x307 /* offset 973 */ , 
+  0x44, 0x323 /* offset 975 */ , 
+  0x64, 0x323 /* offset 977 */ , 
+  0x44, 0x331 /* offset 979 */ , 
+  0x64, 0x331 /* offset 981 */ , 
+  0x44, 0x327 /* offset 983 */ , 
+  0x64, 0x327 /* offset 985 */ , 
+  0x44, 0x32d /* offset 987 */ , 
+  0x64, 0x32d /* offset 989 */ , 
+  0x45, 0x304, 0x300 /* offset 991 */ , 
+  0x65, 0x304, 0x300 /* offset 994 */ , 
+  0x45, 0x304, 0x301 /* offset 997 */ , 
+  0x65, 0x304, 0x301 /* offset 1000 */ , 
+  0x45, 0x32d /* offset 1003 */ , 
+  0x65, 0x32d /* offset 1005 */ , 
+  0x45, 0x330 /* offset 1007 */ , 
+  0x65, 0x330 /* offset 1009 */ , 
+  0x45, 0x327, 0x306 /* offset 1011 */ , 
+  0x65, 0x327, 0x306 /* offset 1014 */ , 
+  0x46, 0x307 /* offset 1017 */ , 
+  0x66, 0x307 /* offset 1019 */ , 
+  0x47, 0x304 /* offset 1021 */ , 
+  0x67, 0x304 /* offset 1023 */ , 
+  0x48, 0x307 /* offset 1025 */ , 
+  0x68, 0x307 /* offset 1027 */ , 
+  0x48, 0x323 /* offset 1029 */ , 
+  0x68, 0x323 /* offset 1031 */ , 
+  0x48, 0x308 /* offset 1033 */ , 
+  0x68, 0x308 /* offset 1035 */ , 
+  0x48, 0x327 /* offset 1037 */ , 
+  0x68, 0x327 /* offset 1039 */ , 
+  0x48, 0x32e /* offset 1041 */ , 
+  0x68, 0x32e /* offset 1043 */ , 
+  0x49, 0x330 /* offset 1045 */ , 
+  0x69, 0x330 /* offset 1047 */ , 
+  0x49, 0x308, 0x301 /* offset 1049 */ , 
+  0x69, 0x308, 0x301 /* offset 1052 */ , 
+  0x4b, 0x301 /* offset 1055 */ , 
+  0x6b, 0x301 /* offset 1057 */ , 
+  0x4b, 0x323 /* offset 1059 */ , 
+  0x6b, 0x323 /* offset 1061 */ , 
+  0x4b, 0x331 /* offset 1063 */ , 
+  0x6b, 0x331 /* offset 1065 */ , 
+  0x4c, 0x323 /* offset 1067 */ , 
+  0x6c, 0x323 /* offset 1069 */ , 
+  0x4c, 0x323, 0x304 /* offset 1071 */ , 
+  0x6c, 0x323, 0x304 /* offset 1074 */ , 
+  0x4c, 0x331 /* offset 1077 */ , 
+  0x6c, 0x331 /* offset 1079 */ , 
+  0x4c, 0x32d /* offset 1081 */ , 
+  0x6c, 0x32d /* offset 1083 */ , 
+  0x4d, 0x301 /* offset 1085 */ , 
+  0x6d, 0x301 /* offset 1087 */ , 
+  0x4d, 0x307 /* offset 1089 */ , 
+  0x6d, 0x307 /* offset 1091 */ , 
+  0x4d, 0x323 /* offset 1093 */ , 
+  0x6d, 0x323 /* offset 1095 */ , 
+  0x4e, 0x307 /* offset 1097 */ , 
+  0x6e, 0x307 /* offset 1099 */ , 
+  0x4e, 0x323 /* offset 1101 */ , 
+  0x6e, 0x323 /* offset 1103 */ , 
+  0x4e, 0x331 /* offset 1105 */ , 
+  0x6e, 0x331 /* offset 1107 */ , 
+  0x4e, 0x32d /* offset 1109 */ , 
+  0x6e, 0x32d /* offset 1111 */ , 
+  0x4f, 0x303, 0x301 /* offset 1113 */ , 
+  0x6f, 0x303, 0x301 /* offset 1116 */ , 
+  0x4f, 0x303, 0x308 /* offset 1119 */ , 
+  0x6f, 0x303, 0x308 /* offset 1122 */ , 
+  0x4f, 0x304, 0x300 /* offset 1125 */ , 
+  0x6f, 0x304, 0x300 /* offset 1128 */ , 
+  0x4f, 0x304, 0x301 /* offset 1131 */ , 
+  0x6f, 0x304, 0x301 /* offset 1134 */ , 
+  0x50, 0x301 /* offset 1137 */ , 
+  0x70, 0x301 /* offset 1139 */ , 
+  0x50, 0x307 /* offset 1141 */ , 
+  0x70, 0x307 /* offset 1143 */ , 
+  0x52, 0x307 /* offset 1145 */ , 
+  0x72, 0x307 /* offset 1147 */ , 
+  0x52, 0x323 /* offset 1149 */ , 
+  0x72, 0x323 /* offset 1151 */ , 
+  0x52, 0x323, 0x304 /* offset 1153 */ , 
+  0x72, 0x323, 0x304 /* offset 1156 */ , 
+  0x52, 0x331 /* offset 1159 */ , 
+  0x72, 0x331 /* offset 1161 */ , 
+  0x53, 0x307 /* offset 1163 */ , 
+  0x73, 0x307 /* offset 1165 */ , 
+  0x53, 0x323 /* offset 1167 */ , 
+  0x73, 0x323 /* offset 1169 */ , 
+  0x53, 0x301, 0x307 /* offset 1171 */ , 
+  0x73, 0x301, 0x307 /* offset 1174 */ , 
+  0x53, 0x30c, 0x307 /* offset 1177 */ , 
+  0x73, 0x30c, 0x307 /* offset 1180 */ , 
+  0x53, 0x323, 0x307 /* offset 1183 */ , 
+  0x73, 0x323, 0x307 /* offset 1186 */ , 
+  0x54, 0x307 /* offset 1189 */ , 
+  0x74, 0x307 /* offset 1191 */ , 
+  0x54, 0x323 /* offset 1193 */ , 
+  0x74, 0x323 /* offset 1195 */ , 
+  0x54, 0x331 /* offset 1197 */ , 
+  0x74, 0x331 /* offset 1199 */ , 
+  0x54, 0x32d /* offset 1201 */ , 
+  0x74, 0x32d /* offset 1203 */ , 
+  0x55, 0x324 /* offset 1205 */ , 
+  0x75, 0x324 /* offset 1207 */ , 
+  0x55, 0x330 /* offset 1209 */ , 
+  0x75, 0x330 /* offset 1211 */ , 
+  0x55, 0x32d /* offset 1213 */ , 
+  0x75, 0x32d /* offset 1215 */ , 
+  0x55, 0x303, 0x301 /* offset 1217 */ , 
+  0x75, 0x303, 0x301 /* offset 1220 */ , 
+  0x55, 0x304, 0x308 /* offset 1223 */ , 
+  0x75, 0x304, 0x308 /* offset 1226 */ , 
+  0x56, 0x303 /* offset 1229 */ , 
+  0x76, 0x303 /* offset 1231 */ , 
+  0x56, 0x323 /* offset 1233 */ , 
+  0x76, 0x323 /* offset 1235 */ , 
+  0x57, 0x300 /* offset 1237 */ , 
+  0x77, 0x300 /* offset 1239 */ , 
+  0x57, 0x301 /* offset 1241 */ , 
+  0x77, 0x301 /* offset 1243 */ , 
+  0x57, 0x308 /* offset 1245 */ , 
+  0x77, 0x308 /* offset 1247 */ , 
+  0x57, 0x307 /* offset 1249 */ , 
+  0x77, 0x307 /* offset 1251 */ , 
+  0x57, 0x323 /* offset 1253 */ , 
+  0x77, 0x323 /* offset 1255 */ , 
+  0x58, 0x307 /* offset 1257 */ , 
+  0x78, 0x307 /* offset 1259 */ , 
+  0x58, 0x308 /* offset 1261 */ , 
+  0x78, 0x308 /* offset 1263 */ , 
+  0x59, 0x307 /* offset 1265 */ , 
+  0x79, 0x307 /* offset 1267 */ , 
+  0x5a, 0x302 /* offset 1269 */ , 
+  0x7a, 0x302 /* offset 1271 */ , 
+  0x5a, 0x323 /* offset 1273 */ , 
+  0x7a, 0x323 /* offset 1275 */ , 
+  0x5a, 0x331 /* offset 1277 */ , 
+  0x7a, 0x331 /* offset 1279 */ , 
+  0x68, 0x331 /* offset 1281 */ , 
+  0x74, 0x308 /* offset 1283 */ , 
+  0x77, 0x30a /* offset 1285 */ , 
+  0x79, 0x30a /* offset 1287 */ , 
+  0x61, 0x2be /* offset 1289 */ , 
+  0x41, 0x323 /* offset 1291 */ , 
+  0x61, 0x323 /* offset 1293 */ , 
+  0x41, 0x309 /* offset 1295 */ , 
+  0x61, 0x309 /* offset 1297 */ , 
+  0x41, 0x302, 0x301 /* offset 1299 */ , 
+  0x61, 0x302, 0x301 /* offset 1302 */ , 
+  0x41, 0x302, 0x300 /* offset 1305 */ , 
+  0x61, 0x302, 0x300 /* offset 1308 */ , 
+  0x41, 0x302, 0x309 /* offset 1311 */ , 
+  0x61, 0x302, 0x309 /* offset 1314 */ , 
+  0x41, 0x302, 0x303 /* offset 1317 */ , 
+  0x61, 0x302, 0x303 /* offset 1320 */ , 
+  0x41, 0x323, 0x302 /* offset 1323 */ , 
+  0x61, 0x323, 0x302 /* offset 1326 */ , 
+  0x41, 0x306, 0x301 /* offset 1329 */ , 
+  0x61, 0x306, 0x301 /* offset 1332 */ , 
+  0x41, 0x306, 0x300 /* offset 1335 */ , 
+  0x61, 0x306, 0x300 /* offset 1338 */ , 
+  0x41, 0x306, 0x309 /* offset 1341 */ , 
+  0x61, 0x306, 0x309 /* offset 1344 */ , 
+  0x41, 0x306, 0x303 /* offset 1347 */ , 
+  0x61, 0x306, 0x303 /* offset 1350 */ , 
+  0x41, 0x323, 0x306 /* offset 1353 */ , 
+  0x61, 0x323, 0x306 /* offset 1356 */ , 
+  0x45, 0x323 /* offset 1359 */ , 
+  0x65, 0x323 /* offset 1361 */ , 
+  0x45, 0x309 /* offset 1363 */ , 
+  0x65, 0x309 /* offset 1365 */ , 
+  0x45, 0x303 /* offset 1367 */ , 
+  0x65, 0x303 /* offset 1369 */ , 
+  0x45, 0x302, 0x301 /* offset 1371 */ , 
+  0x65, 0x302, 0x301 /* offset 1374 */ , 
+  0x45, 0x302, 0x300 /* offset 1377 */ , 
+  0x65, 0x302, 0x300 /* offset 1380 */ , 
+  0x45, 0x302, 0x309 /* offset 1383 */ , 
+  0x65, 0x302, 0x309 /* offset 1386 */ , 
+  0x45, 0x302, 0x303 /* offset 1389 */ , 
+  0x65, 0x302, 0x303 /* offset 1392 */ , 
+  0x45, 0x323, 0x302 /* offset 1395 */ , 
+  0x65, 0x323, 0x302 /* offset 1398 */ , 
+  0x49, 0x309 /* offset 1401 */ , 
+  0x69, 0x309 /* offset 1403 */ , 
+  0x49, 0x323 /* offset 1405 */ , 
+  0x69, 0x323 /* offset 1407 */ , 
+  0x4f, 0x323 /* offset 1409 */ , 
+  0x6f, 0x323 /* offset 1411 */ , 
+  0x4f, 0x309 /* offset 1413 */ , 
+  0x6f, 0x309 /* offset 1415 */ , 
+  0x4f, 0x302, 0x301 /* offset 1417 */ , 
+  0x6f, 0x302, 0x301 /* offset 1420 */ , 
+  0x4f, 0x302, 0x300 /* offset 1423 */ , 
+  0x6f, 0x302, 0x300 /* offset 1426 */ , 
+  0x4f, 0x302, 0x309 /* offset 1429 */ , 
+  0x6f, 0x302, 0x309 /* offset 1432 */ , 
+  0x4f, 0x302, 0x303 /* offset 1435 */ , 
+  0x6f, 0x302, 0x303 /* offset 1438 */ , 
+  0x4f, 0x323, 0x302 /* offset 1441 */ , 
+  0x6f, 0x323, 0x302 /* offset 1444 */ , 
+  0x4f, 0x31b, 0x301 /* offset 1447 */ , 
+  0x6f, 0x31b, 0x301 /* offset 1450 */ , 
+  0x4f, 0x31b, 0x300 /* offset 1453 */ , 
+  0x6f, 0x31b, 0x300 /* offset 1456 */ , 
+  0x4f, 0x31b, 0x309 /* offset 1459 */ , 
+  0x6f, 0x31b, 0x309 /* offset 1462 */ , 
+  0x4f, 0x31b, 0x303 /* offset 1465 */ , 
+  0x6f, 0x31b, 0x303 /* offset 1468 */ , 
+  0x4f, 0x31b, 0x323 /* offset 1471 */ , 
+  0x6f, 0x31b, 0x323 /* offset 1474 */ , 
+  0x55, 0x323 /* offset 1477 */ , 
+  0x75, 0x323 /* offset 1479 */ , 
+  0x55, 0x309 /* offset 1481 */ , 
+  0x75, 0x309 /* offset 1483 */ , 
+  0x55, 0x31b, 0x301 /* offset 1485 */ , 
+  0x75, 0x31b, 0x301 /* offset 1488 */ , 
+  0x55, 0x31b, 0x300 /* offset 1491 */ , 
+  0x75, 0x31b, 0x300 /* offset 1494 */ , 
+  0x55, 0x31b, 0x309 /* offset 1497 */ , 
+  0x75, 0x31b, 0x309 /* offset 1500 */ , 
+  0x55, 0x31b, 0x303 /* offset 1503 */ , 
+  0x75, 0x31b, 0x303 /* offset 1506 */ , 
+  0x55, 0x31b, 0x323 /* offset 1509 */ , 
+  0x75, 0x31b, 0x323 /* offset 1512 */ , 
+  0x59, 0x300 /* offset 1515 */ , 
+  0x79, 0x300 /* offset 1517 */ , 
+  0x59, 0x323 /* offset 1519 */ , 
+  0x79, 0x323 /* offset 1521 */ , 
+  0x59, 0x309 /* offset 1523 */ , 
+  0x79, 0x309 /* offset 1525 */ , 
+  0x59, 0x303 /* offset 1527 */ , 
+  0x79, 0x303 /* offset 1529 */ , 
+  0x3b1, 0x313 /* offset 1531 */ , 
+  0x3b1, 0x314 /* offset 1533 */ , 
+  0x3b1, 0x313, 0x300 /* offset 1535 */ , 
+  0x3b1, 0x314, 0x300 /* offset 1538 */ , 
+  0x3b1, 0x313, 0x301 /* offset 1541 */ , 
+  0x3b1, 0x314, 0x301 /* offset 1544 */ , 
+  0x3b1, 0x313, 0x342 /* offset 1547 */ , 
+  0x3b1, 0x314, 0x342 /* offset 1550 */ , 
+  0x391, 0x313 /* offset 1553 */ , 
+  0x391, 0x314 /* offset 1555 */ , 
+  0x391, 0x313, 0x300 /* offset 1557 */ , 
+  0x391, 0x314, 0x300 /* offset 1560 */ , 
+  0x391, 0x313, 0x301 /* offset 1563 */ , 
+  0x391, 0x314, 0x301 /* offset 1566 */ , 
+  0x391, 0x313, 0x342 /* offset 1569 */ , 
+  0x391, 0x314, 0x342 /* offset 1572 */ , 
+  0x3b5, 0x313 /* offset 1575 */ , 
+  0x3b5, 0x314 /* offset 1577 */ , 
+  0x3b5, 0x313, 0x300 /* offset 1579 */ , 
+  0x3b5, 0x314, 0x300 /* offset 1582 */ , 
+  0x3b5, 0x313, 0x301 /* offset 1585 */ , 
+  0x3b5, 0x314, 0x301 /* offset 1588 */ , 
+  0x395, 0x313 /* offset 1591 */ , 
+  0x395, 0x314 /* offset 1593 */ , 
+  0x395, 0x313, 0x300 /* offset 1595 */ , 
+  0x395, 0x314, 0x300 /* offset 1598 */ , 
+  0x395, 0x313, 0x301 /* offset 1601 */ , 
+  0x395, 0x314, 0x301 /* offset 1604 */ , 
+  0x3b7, 0x313 /* offset 1607 */ , 
+  0x3b7, 0x314 /* offset 1609 */ , 
+  0x3b7, 0x313, 0x300 /* offset 1611 */ , 
+  0x3b7, 0x314, 0x300 /* offset 1614 */ , 
+  0x3b7, 0x313, 0x301 /* offset 1617 */ , 
+  0x3b7, 0x314, 0x301 /* offset 1620 */ , 
+  0x3b7, 0x313, 0x342 /* offset 1623 */ , 
+  0x3b7, 0x314, 0x342 /* offset 1626 */ , 
+  0x397, 0x313 /* offset 1629 */ , 
+  0x397, 0x314 /* offset 1631 */ , 
+  0x397, 0x313, 0x300 /* offset 1633 */ , 
+  0x397, 0x314, 0x300 /* offset 1636 */ , 
+  0x397, 0x313, 0x301 /* offset 1639 */ , 
+  0x397, 0x314, 0x301 /* offset 1642 */ , 
+  0x397, 0x313, 0x342 /* offset 1645 */ , 
+  0x397, 0x314, 0x342 /* offset 1648 */ , 
+  0x3b9, 0x313 /* offset 1651 */ , 
+  0x3b9, 0x314 /* offset 1653 */ , 
+  0x3b9, 0x313, 0x300 /* offset 1655 */ , 
+  0x3b9, 0x314, 0x300 /* offset 1658 */ , 
+  0x3b9, 0x313, 0x301 /* offset 1661 */ , 
+  0x3b9, 0x314, 0x301 /* offset 1664 */ , 
+  0x3b9, 0x313, 0x342 /* offset 1667 */ , 
+  0x3b9, 0x314, 0x342 /* offset 1670 */ , 
+  0x399, 0x313 /* offset 1673 */ , 
+  0x399, 0x314 /* offset 1675 */ , 
+  0x399, 0x313, 0x300 /* offset 1677 */ , 
+  0x399, 0x314, 0x300 /* offset 1680 */ , 
+  0x399, 0x313, 0x301 /* offset 1683 */ , 
+  0x399, 0x314, 0x301 /* offset 1686 */ , 
+  0x399, 0x313, 0x342 /* offset 1689 */ , 
+  0x399, 0x314, 0x342 /* offset 1692 */ , 
+  0x3bf, 0x313 /* offset 1695 */ , 
+  0x3bf, 0x314 /* offset 1697 */ , 
+  0x3bf, 0x313, 0x300 /* offset 1699 */ , 
+  0x3bf, 0x314, 0x300 /* offset 1702 */ , 
+  0x3bf, 0x313, 0x301 /* offset 1705 */ , 
+  0x3bf, 0x314, 0x301 /* offset 1708 */ , 
+  0x39f, 0x313 /* offset 1711 */ , 
+  0x39f, 0x314 /* offset 1713 */ , 
+  0x39f, 0x313, 0x300 /* offset 1715 */ , 
+  0x39f, 0x314, 0x300 /* offset 1718 */ , 
+  0x39f, 0x313, 0x301 /* offset 1721 */ , 
+  0x39f, 0x314, 0x301 /* offset 1724 */ , 
+  0x3c5, 0x313 /* offset 1727 */ , 
+  0x3c5, 0x314 /* offset 1729 */ , 
+  0x3c5, 0x313, 0x300 /* offset 1731 */ , 
+  0x3c5, 0x314, 0x300 /* offset 1734 */ , 
+  0x3c5, 0x313, 0x301 /* offset 1737 */ , 
+  0x3c5, 0x314, 0x301 /* offset 1740 */ , 
+  0x3c5, 0x313, 0x342 /* offset 1743 */ , 
+  0x3c5, 0x314, 0x342 /* offset 1746 */ , 
+  0x3a5, 0x314 /* offset 1749 */ , 
+  0x3a5, 0x314, 0x300 /* offset 1751 */ , 
+  0x3a5, 0x314, 0x301 /* offset 1754 */ , 
+  0x3a5, 0x314, 0x342 /* offset 1757 */ , 
+  0x3c9, 0x313 /* offset 1760 */ , 
+  0x3c9, 0x314 /* offset 1762 */ , 
+  0x3c9, 0x313, 0x300 /* offset 1764 */ , 
+  0x3c9, 0x314, 0x300 /* offset 1767 */ , 
+  0x3c9, 0x313, 0x301 /* offset 1770 */ , 
+  0x3c9, 0x314, 0x301 /* offset 1773 */ , 
+  0x3c9, 0x313, 0x342 /* offset 1776 */ , 
+  0x3c9, 0x314, 0x342 /* offset 1779 */ , 
+  0x3a9, 0x313 /* offset 1782 */ , 
+  0x3a9, 0x314 /* offset 1784 */ , 
+  0x3a9, 0x313, 0x300 /* offset 1786 */ , 
+  0x3a9, 0x314, 0x300 /* offset 1789 */ , 
+  0x3a9, 0x313, 0x301 /* offset 1792 */ , 
+  0x3a9, 0x314, 0x301 /* offset 1795 */ , 
+  0x3a9, 0x313, 0x342 /* offset 1798 */ , 
+  0x3a9, 0x314, 0x342 /* offset 1801 */ , 
+  0x3b1, 0x300 /* offset 1804 */ , 
+  0x3b5, 0x300 /* offset 1806 */ , 
+  0x3b7, 0x300 /* offset 1808 */ , 
+  0x3b9, 0x300 /* offset 1810 */ , 
+  0x3bf, 0x300 /* offset 1812 */ , 
+  0x3c5, 0x300 /* offset 1814 */ , 
+  0x3c9, 0x300 /* offset 1816 */ , 
+  0x3b1, 0x313, 0x345 /* offset 1818 */ , 
+  0x3b1, 0x314, 0x345 /* offset 1821 */ , 
+  0x3b1, 0x313, 0x300, 0x345 /* offset 1824 */ , 
+  0x3b1, 0x314, 0x300, 0x345 /* offset 1828 */ , 
+  0x3b1, 0x313, 0x301, 0x345 /* offset 1832 */ , 
+  0x3b1, 0x314, 0x301, 0x345 /* offset 1836 */ , 
+  0x3b1, 0x313, 0x342, 0x345 /* offset 1840 */ , 
+  0x3b1, 0x314, 0x342, 0x345 /* offset 1844 */ , 
+  0x391, 0x313, 0x345 /* offset 1848 */ , 
+  0x391, 0x314, 0x345 /* offset 1851 */ , 
+  0x391, 0x313, 0x300, 0x345 /* offset 1854 */ , 
+  0x391, 0x314, 0x300, 0x345 /* offset 1858 */ , 
+  0x391, 0x313, 0x301, 0x345 /* offset 1862 */ , 
+  0x391, 0x314, 0x301, 0x345 /* offset 1866 */ , 
+  0x391, 0x313, 0x342, 0x345 /* offset 1870 */ , 
+  0x391, 0x314, 0x342, 0x345 /* offset 1874 */ , 
+  0x3b7, 0x313, 0x345 /* offset 1878 */ , 
+  0x3b7, 0x314, 0x345 /* offset 1881 */ , 
+  0x3b7, 0x313, 0x300, 0x345 /* offset 1884 */ , 
+  0x3b7, 0x314, 0x300, 0x345 /* offset 1888 */ , 
+  0x3b7, 0x313, 0x301, 0x345 /* offset 1892 */ , 
+  0x3b7, 0x314, 0x301, 0x345 /* offset 1896 */ , 
+  0x3b7, 0x313, 0x342, 0x345 /* offset 1900 */ , 
+  0x3b7, 0x314, 0x342, 0x345 /* offset 1904 */ , 
+  0x397, 0x313, 0x345 /* offset 1908 */ , 
+  0x397, 0x314, 0x345 /* offset 1911 */ , 
+  0x397, 0x313, 0x300, 0x345 /* offset 1914 */ , 
+  0x397, 0x314, 0x300, 0x345 /* offset 1918 */ , 
+  0x397, 0x313, 0x301, 0x345 /* offset 1922 */ , 
+  0x397, 0x314, 0x301, 0x345 /* offset 1926 */ , 
+  0x397, 0x313, 0x342, 0x345 /* offset 1930 */ , 
+  0x397, 0x314, 0x342, 0x345 /* offset 1934 */ , 
+  0x3c9, 0x313, 0x345 /* offset 1938 */ , 
+  0x3c9, 0x314, 0x345 /* offset 1941 */ , 
+  0x3c9, 0x313, 0x300, 0x345 /* offset 1944 */ , 
+  0x3c9, 0x314, 0x300, 0x345 /* offset 1948 */ , 
+  0x3c9, 0x313, 0x301, 0x345 /* offset 1952 */ , 
+  0x3c9, 0x314, 0x301, 0x345 /* offset 1956 */ , 
+  0x3c9, 0x313, 0x342, 0x345 /* offset 1960 */ , 
+  0x3c9, 0x314, 0x342, 0x345 /* offset 1964 */ , 
+  0x3a9, 0x313, 0x345 /* offset 1968 */ , 
+  0x3a9, 0x314, 0x345 /* offset 1971 */ , 
+  0x3a9, 0x313, 0x300, 0x345 /* offset 1974 */ , 
+  0x3a9, 0x314, 0x300, 0x345 /* offset 1978 */ , 
+  0x3a9, 0x313, 0x301, 0x345 /* offset 1982 */ , 
+  0x3a9, 0x314, 0x301, 0x345 /* offset 1986 */ , 
+  0x3a9, 0x313, 0x342, 0x345 /* offset 1990 */ , 
+  0x3a9, 0x314, 0x342, 0x345 /* offset 1994 */ , 
+  0x3b1, 0x306 /* offset 1998 */ , 
+  0x3b1, 0x304 /* offset 2000 */ , 
+  0x3b1, 0x300, 0x345 /* offset 2002 */ , 
+  0x3b1, 0x345 /* offset 2005 */ , 
+  0x3b1, 0x301, 0x345 /* offset 2007 */ , 
+  0x3b1, 0x342 /* offset 2010 */ , 
+  0x3b1, 0x342, 0x345 /* offset 2012 */ , 
+  0x391, 0x306 /* offset 2015 */ , 
+  0x391, 0x304 /* offset 2017 */ , 
+  0x391, 0x300 /* offset 2019 */ , 
+  0x391, 0x345 /* offset 2021 */ , 
+  0x20, 0x313 /* offset 2023 */ , 
+  0x3b9 /* offset 2025 */ , 
+  0x20, 0x342 /* offset 2026 */ , 
+  0x20, 0x308, 0x342 /* offset 2028 */ , 
+  0x3b7, 0x300, 0x345 /* offset 2031 */ , 
+  0x3b7, 0x345 /* offset 2034 */ , 
+  0x3b7, 0x301, 0x345 /* offset 2036 */ , 
+  0x3b7, 0x342 /* offset 2039 */ , 
+  0x3b7, 0x342, 0x345 /* offset 2041 */ , 
+  0x395, 0x300 /* offset 2044 */ , 
+  0x397, 0x300 /* offset 2046 */ , 
+  0x397, 0x345 /* offset 2048 */ , 
+  0x20, 0x313, 0x300 /* offset 2050 */ , 
+  0x20, 0x313, 0x301 /* offset 2053 */ , 
+  0x20, 0x313, 0x342 /* offset 2056 */ , 
+  0x3b9, 0x306 /* offset 2059 */ , 
+  0x3b9, 0x304 /* offset 2061 */ , 
+  0x3b9, 0x308, 0x300 /* offset 2063 */ , 
+  0x3b9, 0x342 /* offset 2066 */ , 
+  0x3b9, 0x308, 0x342 /* offset 2068 */ , 
+  0x399, 0x306 /* offset 2071 */ , 
+  0x399, 0x304 /* offset 2073 */ , 
+  0x399, 0x300 /* offset 2075 */ , 
+  0x20, 0x314, 0x300 /* offset 2077 */ , 
+  0x20, 0x314, 0x301 /* offset 2080 */ , 
+  0x20, 0x314, 0x342 /* offset 2083 */ , 
+  0x3c5, 0x306 /* offset 2086 */ , 
+  0x3c5, 0x304 /* offset 2088 */ , 
+  0x3c5, 0x308, 0x300 /* offset 2090 */ , 
+  0x3c1, 0x313 /* offset 2093 */ , 
+  0x3c1, 0x314 /* offset 2095 */ , 
+  0x3c5, 0x342 /* offset 2097 */ , 
+  0x3c5, 0x308, 0x342 /* offset 2099 */ , 
+  0x3a5, 0x306 /* offset 2102 */ , 
+  0x3a5, 0x304 /* offset 2104 */ , 
+  0x3a5, 0x300 /* offset 2106 */ , 
+  0x3a1, 0x314 /* offset 2108 */ , 
+  0x20, 0x308, 0x300 /* offset 2110 */ , 
+  0x60 /* offset 2113 */ , 
+  0x3c9, 0x300, 0x345 /* offset 2114 */ , 
+  0x3c9, 0x345 /* offset 2117 */ , 
+  0x3c9, 0x301, 0x345 /* offset 2119 */ , 
+  0x3c9, 0x342 /* offset 2122 */ , 
+  0x3c9, 0x342, 0x345 /* offset 2124 */ , 
+  0x39f, 0x300 /* offset 2127 */ , 
+  0x3a9, 0x300 /* offset 2129 */ , 
+  0x3a9, 0x345 /* offset 2131 */ , 
+  0x20, 0x314 /* offset 2133 */ , 
+  0x2010 /* offset 2135 */ , 
+  0x20, 0x333 /* offset 2136 */ , 
+  0x2e /* offset 2138 */ , 
+  0x2e, 0x2e /* offset 2139 */ , 
+  0x2e, 0x2e, 0x2e /* offset 2141 */ , 
+  0x2032, 0x2032 /* offset 2144 */ , 
+  0x2032, 0x2032, 0x2032 /* offset 2146 */ , 
+  0x2035, 0x2035 /* offset 2149 */ , 
+  0x2035, 0x2035, 0x2035 /* offset 2151 */ , 
+  0x21, 0x21 /* offset 2154 */ , 
+  0x20, 0x305 /* offset 2156 */ , 
+  0x3f, 0x3f /* offset 2158 */ , 
+  0x3f, 0x21 /* offset 2160 */ , 
+  0x21, 0x3f /* offset 2162 */ , 
+  0x2032, 0x2032, 0x2032, 0x2032 /* offset 2164 */ , 
+  0x30 /* offset 2168 */ , 
+  0x69 /* offset 2169 */ , 
+  0x34 /* offset 2170 */ , 
+  0x35 /* offset 2171 */ , 
+  0x36 /* offset 2172 */ , 
+  0x37 /* offset 2173 */ , 
+  0x38 /* offset 2174 */ , 
+  0x39 /* offset 2175 */ , 
+  0x2b /* offset 2176 */ , 
+  0x2212 /* offset 2177 */ , 
+  0x3d /* offset 2178 */ , 
+  0x28 /* offset 2179 */ , 
+  0x29 /* offset 2180 */ , 
+  0x6e /* offset 2181 */ , 
+  0x52, 0x73 /* offset 2182 */ , 
+  0x61, 0x2f, 0x63 /* offset 2184 */ , 
+  0x61, 0x2f, 0x73 /* offset 2187 */ , 
+  0x43 /* offset 2190 */ , 
+  0xb0, 0x43 /* offset 2191 */ , 
+  0x63, 0x2f, 0x6f /* offset 2193 */ , 
+  0x63, 0x2f, 0x75 /* offset 2196 */ , 
+  0x190 /* offset 2199 */ , 
+  0xb0, 0x46 /* offset 2200 */ , 
+  0x67 /* offset 2202 */ , 
+  0x48 /* offset 2203 */ , 
+  0x127 /* offset 2204 */ , 
+  0x49 /* offset 2205 */ , 
+  0x4c /* offset 2206 */ , 
+  0x4e /* offset 2207 */ , 
+  0x4e, 0x6f /* offset 2208 */ , 
+  0x50 /* offset 2210 */ , 
+  0x51 /* offset 2211 */ , 
+  0x52 /* offset 2212 */ , 
+  0x53, 0x4d /* offset 2213 */ , 
+  0x54, 0x45, 0x4c /* offset 2215 */ , 
+  0x54, 0x4d /* offset 2218 */ , 
+  0x5a /* offset 2220 */ , 
+  0x3a9 /* offset 2221 */ , 
+  0x4b /* offset 2222 */ , 
+  0x42 /* offset 2223 */ , 
+  0x65 /* offset 2224 */ , 
+  0x45 /* offset 2225 */ , 
+  0x46 /* offset 2226 */ , 
+  0x4d /* offset 2227 */ , 
+  0x5d0 /* offset 2228 */ , 
+  0x5d1 /* offset 2229 */ , 
+  0x5d2 /* offset 2230 */ , 
+  0x5d3 /* offset 2231 */ , 
+  0x3b3 /* offset 2232 */ , 
+  0x393 /* offset 2233 */ , 
+  0x3a0 /* offset 2234 */ , 
+  0x2211 /* offset 2235 */ , 
+  0x44 /* offset 2236 */ , 
+  0x64 /* offset 2237 */ , 
+  0x31, 0x2044, 0x33 /* offset 2238 */ , 
+  0x32, 0x2044, 0x33 /* offset 2241 */ , 
+  0x31, 0x2044, 0x35 /* offset 2244 */ , 
+  0x32, 0x2044, 0x35 /* offset 2247 */ , 
+  0x33, 0x2044, 0x35 /* offset 2250 */ , 
+  0x34, 0x2044, 0x35 /* offset 2253 */ , 
+  0x31, 0x2044, 0x36 /* offset 2256 */ , 
+  0x35, 0x2044, 0x36 /* offset 2259 */ , 
+  0x31, 0x2044, 0x38 /* offset 2262 */ , 
+  0x33, 0x2044, 0x38 /* offset 2265 */ , 
+  0x35, 0x2044, 0x38 /* offset 2268 */ , 
+  0x37, 0x2044, 0x38 /* offset 2271 */ , 
+  0x31, 0x2044 /* offset 2274 */ , 
+  0x49, 0x49 /* offset 2276 */ , 
+  0x49, 0x49, 0x49 /* offset 2278 */ , 
+  0x49, 0x56 /* offset 2281 */ , 
+  0x56 /* offset 2283 */ , 
+  0x56, 0x49 /* offset 2284 */ , 
+  0x56, 0x49, 0x49 /* offset 2286 */ , 
+  0x56, 0x49, 0x49, 0x49 /* offset 2289 */ , 
+  0x49, 0x58 /* offset 2293 */ , 
+  0x58 /* offset 2295 */ , 
+  0x58, 0x49 /* offset 2296 */ , 
+  0x58, 0x49, 0x49 /* offset 2298 */ , 
+  0x69, 0x69 /* offset 2301 */ , 
+  0x69, 0x69, 0x69 /* offset 2303 */ , 
+  0x69, 0x76 /* offset 2306 */ , 
+  0x76 /* offset 2308 */ , 
+  0x76, 0x69 /* offset 2309 */ , 
+  0x76, 0x69, 0x69 /* offset 2311 */ , 
+  0x76, 0x69, 0x69, 0x69 /* offset 2314 */ , 
+  0x69, 0x78 /* offset 2318 */ , 
+  0x78, 0x69 /* offset 2320 */ , 
+  0x78, 0x69, 0x69 /* offset 2322 */ , 
+  0x63 /* offset 2325 */ , 
+  0x6d /* offset 2326 */ , 
+  0x2190, 0x338 /* offset 2327 */ , 
+  0x2192, 0x338 /* offset 2329 */ , 
+  0x2194, 0x338 /* offset 2331 */ , 
+  0x21d0, 0x338 /* offset 2333 */ , 
+  0x21d4, 0x338 /* offset 2335 */ , 
+  0x21d2, 0x338 /* offset 2337 */ , 
+  0x2203, 0x338 /* offset 2339 */ , 
+  0x2208, 0x338 /* offset 2341 */ , 
+  0x220b, 0x338 /* offset 2343 */ , 
+  0x2223, 0x338 /* offset 2345 */ , 
+  0x2225, 0x338 /* offset 2347 */ , 
+  0x222b, 0x222b /* offset 2349 */ , 
+  0x222b, 0x222b, 0x222b /* offset 2351 */ , 
+  0x222e, 0x222e /* offset 2354 */ , 
+  0x222e, 0x222e, 0x222e /* offset 2356 */ , 
+  0x223c, 0x338 /* offset 2359 */ , 
+  0x2243, 0x338 /* offset 2361 */ , 
+  0x2245, 0x338 /* offset 2363 */ , 
+  0x2248, 0x338 /* offset 2365 */ , 
+  0x3d, 0x338 /* offset 2367 */ , 
+  0x2261, 0x338 /* offset 2369 */ , 
+  0x224d, 0x338 /* offset 2371 */ , 
+  0x3c, 0x338 /* offset 2373 */ , 
+  0x3e, 0x338 /* offset 2375 */ , 
+  0x2264, 0x338 /* offset 2377 */ , 
+  0x2265, 0x338 /* offset 2379 */ , 
+  0x2272, 0x338 /* offset 2381 */ , 
+  0x2273, 0x338 /* offset 2383 */ , 
+  0x2276, 0x338 /* offset 2385 */ , 
+  0x2277, 0x338 /* offset 2387 */ , 
+  0x227a, 0x338 /* offset 2389 */ , 
+  0x227b, 0x338 /* offset 2391 */ , 
+  0x2282, 0x338 /* offset 2393 */ , 
+  0x2283, 0x338 /* offset 2395 */ , 
+  0x2286, 0x338 /* offset 2397 */ , 
+  0x2287, 0x338 /* offset 2399 */ , 
+  0x22a2, 0x338 /* offset 2401 */ , 
+  0x22a8, 0x338 /* offset 2403 */ , 
+  0x22a9, 0x338 /* offset 2405 */ , 
+  0x22ab, 0x338 /* offset 2407 */ , 
+  0x227c, 0x338 /* offset 2409 */ , 
+  0x227d, 0x338 /* offset 2411 */ , 
+  0x2291, 0x338 /* offset 2413 */ , 
+  0x2292, 0x338 /* offset 2415 */ , 
+  0x22b2, 0x338 /* offset 2417 */ , 
+  0x22b3, 0x338 /* offset 2419 */ , 
+  0x22b4, 0x338 /* offset 2421 */ , 
+  0x22b5, 0x338 /* offset 2423 */ , 
+  0x3008 /* offset 2425 */ , 
+  0x3009 /* offset 2426 */ , 
+  0x31, 0x30 /* offset 2427 */ , 
+  0x31, 0x31 /* offset 2429 */ , 
+  0x31, 0x32 /* offset 2431 */ , 
+  0x31, 0x33 /* offset 2433 */ , 
+  0x31, 0x34 /* offset 2435 */ , 
+  0x31, 0x35 /* offset 2437 */ , 
+  0x31, 0x36 /* offset 2439 */ , 
+  0x31, 0x37 /* offset 2441 */ , 
+  0x31, 0x38 /* offset 2443 */ , 
+  0x31, 0x39 /* offset 2445 */ , 
+  0x32, 0x30 /* offset 2447 */ , 
+  0x28, 0x31, 0x29 /* offset 2449 */ , 
+  0x28, 0x32, 0x29 /* offset 2452 */ , 
+  0x28, 0x33, 0x29 /* offset 2455 */ , 
+  0x28, 0x34, 0x29 /* offset 2458 */ , 
+  0x28, 0x35, 0x29 /* offset 2461 */ , 
+  0x28, 0x36, 0x29 /* offset 2464 */ , 
+  0x28, 0x37, 0x29 /* offset 2467 */ , 
+  0x28, 0x38, 0x29 /* offset 2470 */ , 
+  0x28, 0x39, 0x29 /* offset 2473 */ , 
+  0x28, 0x31, 0x30, 0x29 /* offset 2476 */ , 
+  0x28, 0x31, 0x31, 0x29 /* offset 2480 */ , 
+  0x28, 0x31, 0x32, 0x29 /* offset 2484 */ , 
+  0x28, 0x31, 0x33, 0x29 /* offset 2488 */ , 
+  0x28, 0x31, 0x34, 0x29 /* offset 2492 */ , 
+  0x28, 0x31, 0x35, 0x29 /* offset 2496 */ , 
+  0x28, 0x31, 0x36, 0x29 /* offset 2500 */ , 
+  0x28, 0x31, 0x37, 0x29 /* offset 2504 */ , 
+  0x28, 0x31, 0x38, 0x29 /* offset 2508 */ , 
+  0x28, 0x31, 0x39, 0x29 /* offset 2512 */ , 
+  0x28, 0x32, 0x30, 0x29 /* offset 2516 */ , 
+  0x31, 0x2e /* offset 2520 */ , 
+  0x32, 0x2e /* offset 2522 */ , 
+  0x33, 0x2e /* offset 2524 */ , 
+  0x34, 0x2e /* offset 2526 */ , 
+  0x35, 0x2e /* offset 2528 */ , 
+  0x36, 0x2e /* offset 2530 */ , 
+  0x37, 0x2e /* offset 2532 */ , 
+  0x38, 0x2e /* offset 2534 */ , 
+  0x39, 0x2e /* offset 2536 */ , 
+  0x31, 0x30, 0x2e /* offset 2538 */ , 
+  0x31, 0x31, 0x2e /* offset 2541 */ , 
+  0x31, 0x32, 0x2e /* offset 2544 */ , 
+  0x31, 0x33, 0x2e /* offset 2547 */ , 
+  0x31, 0x34, 0x2e /* offset 2550 */ , 
+  0x31, 0x35, 0x2e /* offset 2553 */ , 
+  0x31, 0x36, 0x2e /* offset 2556 */ , 
+  0x31, 0x37, 0x2e /* offset 2559 */ , 
+  0x31, 0x38, 0x2e /* offset 2562 */ , 
+  0x31, 0x39, 0x2e /* offset 2565 */ , 
+  0x32, 0x30, 0x2e /* offset 2568 */ , 
+  0x28, 0x61, 0x29 /* offset 2571 */ , 
+  0x28, 0x62, 0x29 /* offset 2574 */ , 
+  0x28, 0x63, 0x29 /* offset 2577 */ , 
+  0x28, 0x64, 0x29 /* offset 2580 */ , 
+  0x28, 0x65, 0x29 /* offset 2583 */ , 
+  0x28, 0x66, 0x29 /* offset 2586 */ , 
+  0x28, 0x67, 0x29 /* offset 2589 */ , 
+  0x28, 0x68, 0x29 /* offset 2592 */ , 
+  0x28, 0x69, 0x29 /* offset 2595 */ , 
+  0x28, 0x6a, 0x29 /* offset 2598 */ , 
+  0x28, 0x6b, 0x29 /* offset 2601 */ , 
+  0x28, 0x6c, 0x29 /* offset 2604 */ , 
+  0x28, 0x6d, 0x29 /* offset 2607 */ , 
+  0x28, 0x6e, 0x29 /* offset 2610 */ , 
+  0x28, 0x6f, 0x29 /* offset 2613 */ , 
+  0x28, 0x70, 0x29 /* offset 2616 */ , 
+  0x28, 0x71, 0x29 /* offset 2619 */ , 
+  0x28, 0x72, 0x29 /* offset 2622 */ , 
+  0x28, 0x73, 0x29 /* offset 2625 */ , 
+  0x28, 0x74, 0x29 /* offset 2628 */ , 
+  0x28, 0x75, 0x29 /* offset 2631 */ , 
+  0x28, 0x76, 0x29 /* offset 2634 */ , 
+  0x28, 0x77, 0x29 /* offset 2637 */ , 
+  0x28, 0x78, 0x29 /* offset 2640 */ , 
+  0x28, 0x79, 0x29 /* offset 2643 */ , 
+  0x28, 0x7a, 0x29 /* offset 2646 */ , 
+  0x41 /* offset 2649 */ , 
+  0x47 /* offset 2650 */ , 
+  0x4a /* offset 2651 */ , 
+  0x4f /* offset 2652 */ , 
+  0x53 /* offset 2653 */ , 
+  0x54 /* offset 2654 */ , 
+  0x55 /* offset 2655 */ , 
+  0x57 /* offset 2656 */ , 
+  0x59 /* offset 2657 */ , 
+  0x62 /* offset 2658 */ , 
+  0x66 /* offset 2659 */ , 
+  0x6b /* offset 2660 */ , 
+  0x70 /* offset 2661 */ , 
+  0x71 /* offset 2662 */ , 
+  0x74 /* offset 2663 */ , 
+  0x75 /* offset 2664 */ , 
+  0x7a /* offset 2665 */ , 
+  0x222b, 0x222b, 0x222b, 0x222b /* offset 2666 */ , 
+  0x3a, 0x3a, 0x3d /* offset 2670 */ , 
+  0x3d, 0x3d /* offset 2673 */ , 
+  0x3d, 0x3d, 0x3d /* offset 2675 */ , 
+  0x2add, 0x338 /* offset 2678 */ , 
+  0x6bcd /* offset 2680 */ , 
+  0x9f9f /* offset 2681 */ , 
+  0x4e00 /* offset 2682 */ , 
+  0x4e28 /* offset 2683 */ , 
+  0x4e36 /* offset 2684 */ , 
+  0x4e3f /* offset 2685 */ , 
+  0x4e59 /* offset 2686 */ , 
+  0x4e85 /* offset 2687 */ , 
+  0x4e8c /* offset 2688 */ , 
+  0x4ea0 /* offset 2689 */ , 
+  0x4eba /* offset 2690 */ , 
+  0x513f /* offset 2691 */ , 
+  0x5165 /* offset 2692 */ , 
+  0x516b /* offset 2693 */ , 
+  0x5182 /* offset 2694 */ , 
+  0x5196 /* offset 2695 */ , 
+  0x51ab /* offset 2696 */ , 
+  0x51e0 /* offset 2697 */ , 
+  0x51f5 /* offset 2698 */ , 
+  0x5200 /* offset 2699 */ , 
+  0x529b /* offset 2700 */ , 
+  0x52f9 /* offset 2701 */ , 
+  0x5315 /* offset 2702 */ , 
+  0x531a /* offset 2703 */ , 
+  0x5338 /* offset 2704 */ , 
+  0x5341 /* offset 2705 */ , 
+  0x535c /* offset 2706 */ , 
+  0x5369 /* offset 2707 */ , 
+  0x5382 /* offset 2708 */ , 
+  0x53b6 /* offset 2709 */ , 
+  0x53c8 /* offset 2710 */ , 
+  0x53e3 /* offset 2711 */ , 
+  0x56d7 /* offset 2712 */ , 
+  0x571f /* offset 2713 */ , 
+  0x58eb /* offset 2714 */ , 
+  0x5902 /* offset 2715 */ , 
+  0x590a /* offset 2716 */ , 
+  0x5915 /* offset 2717 */ , 
+  0x5927 /* offset 2718 */ , 
+  0x5973 /* offset 2719 */ , 
+  0x5b50 /* offset 2720 */ , 
+  0x5b80 /* offset 2721 */ , 
+  0x5bf8 /* offset 2722 */ , 
+  0x5c0f /* offset 2723 */ , 
+  0x5c22 /* offset 2724 */ , 
+  0x5c38 /* offset 2725 */ , 
+  0x5c6e /* offset 2726 */ , 
+  0x5c71 /* offset 2727 */ , 
+  0x5ddb /* offset 2728 */ , 
+  0x5de5 /* offset 2729 */ , 
+  0x5df1 /* offset 2730 */ , 
+  0x5dfe /* offset 2731 */ , 
+  0x5e72 /* offset 2732 */ , 
+  0x5e7a /* offset 2733 */ , 
+  0x5e7f /* offset 2734 */ , 
+  0x5ef4 /* offset 2735 */ , 
+  0x5efe /* offset 2736 */ , 
+  0x5f0b /* offset 2737 */ , 
+  0x5f13 /* offset 2738 */ , 
+  0x5f50 /* offset 2739 */ , 
+  0x5f61 /* offset 2740 */ , 
+  0x5f73 /* offset 2741 */ , 
+  0x5fc3 /* offset 2742 */ , 
+  0x6208 /* offset 2743 */ , 
+  0x6236 /* offset 2744 */ , 
+  0x624b /* offset 2745 */ , 
+  0x652f /* offset 2746 */ , 
+  0x6534 /* offset 2747 */ , 
+  0x6587 /* offset 2748 */ , 
+  0x6597 /* offset 2749 */ , 
+  0x65a4 /* offset 2750 */ , 
+  0x65b9 /* offset 2751 */ , 
+  0x65e0 /* offset 2752 */ , 
+  0x65e5 /* offset 2753 */ , 
+  0x66f0 /* offset 2754 */ , 
+  0x6708 /* offset 2755 */ , 
+  0x6728 /* offset 2756 */ , 
+  0x6b20 /* offset 2757 */ , 
+  0x6b62 /* offset 2758 */ , 
+  0x6b79 /* offset 2759 */ , 
+  0x6bb3 /* offset 2760 */ , 
+  0x6bcb /* offset 2761 */ , 
+  0x6bd4 /* offset 2762 */ , 
+  0x6bdb /* offset 2763 */ , 
+  0x6c0f /* offset 2764 */ , 
+  0x6c14 /* offset 2765 */ , 
+  0x6c34 /* offset 2766 */ , 
+  0x706b /* offset 2767 */ , 
+  0x722a /* offset 2768 */ , 
+  0x7236 /* offset 2769 */ , 
+  0x723b /* offset 2770 */ , 
+  0x723f /* offset 2771 */ , 
+  0x7247 /* offset 2772 */ , 
+  0x7259 /* offset 2773 */ , 
+  0x725b /* offset 2774 */ , 
+  0x72ac /* offset 2775 */ , 
+  0x7384 /* offset 2776 */ , 
+  0x7389 /* offset 2777 */ , 
+  0x74dc /* offset 2778 */ , 
+  0x74e6 /* offset 2779 */ , 
+  0x7518 /* offset 2780 */ , 
+  0x751f /* offset 2781 */ , 
+  0x7528 /* offset 2782 */ , 
+  0x7530 /* offset 2783 */ , 
+  0x758b /* offset 2784 */ , 
+  0x7592 /* offset 2785 */ , 
+  0x7676 /* offset 2786 */ , 
+  0x767d /* offset 2787 */ , 
+  0x76ae /* offset 2788 */ , 
+  0x76bf /* offset 2789 */ , 
+  0x76ee /* offset 2790 */ , 
+  0x77db /* offset 2791 */ , 
+  0x77e2 /* offset 2792 */ , 
+  0x77f3 /* offset 2793 */ , 
+  0x793a /* offset 2794 */ , 
+  0x79b8 /* offset 2795 */ , 
+  0x79be /* offset 2796 */ , 
+  0x7a74 /* offset 2797 */ , 
+  0x7acb /* offset 2798 */ , 
+  0x7af9 /* offset 2799 */ , 
+  0x7c73 /* offset 2800 */ , 
+  0x7cf8 /* offset 2801 */ , 
+  0x7f36 /* offset 2802 */ , 
+  0x7f51 /* offset 2803 */ , 
+  0x7f8a /* offset 2804 */ , 
+  0x7fbd /* offset 2805 */ , 
+  0x8001 /* offset 2806 */ , 
+  0x800c /* offset 2807 */ , 
+  0x8012 /* offset 2808 */ , 
+  0x8033 /* offset 2809 */ , 
+  0x807f /* offset 2810 */ , 
+  0x8089 /* offset 2811 */ , 
+  0x81e3 /* offset 2812 */ , 
+  0x81ea /* offset 2813 */ , 
+  0x81f3 /* offset 2814 */ , 
+  0x81fc /* offset 2815 */ , 
+  0x820c /* offset 2816 */ , 
+  0x821b /* offset 2817 */ , 
+  0x821f /* offset 2818 */ , 
+  0x826e /* offset 2819 */ , 
+  0x8272 /* offset 2820 */ , 
+  0x8278 /* offset 2821 */ , 
+  0x864d /* offset 2822 */ , 
+  0x866b /* offset 2823 */ , 
+  0x8840 /* offset 2824 */ , 
+  0x884c /* offset 2825 */ , 
+  0x8863 /* offset 2826 */ , 
+  0x897e /* offset 2827 */ , 
+  0x898b /* offset 2828 */ , 
+  0x89d2 /* offset 2829 */ , 
+  0x8a00 /* offset 2830 */ , 
+  0x8c37 /* offset 2831 */ , 
+  0x8c46 /* offset 2832 */ , 
+  0x8c55 /* offset 2833 */ , 
+  0x8c78 /* offset 2834 */ , 
+  0x8c9d /* offset 2835 */ , 
+  0x8d64 /* offset 2836 */ , 
+  0x8d70 /* offset 2837 */ , 
+  0x8db3 /* offset 2838 */ , 
+  0x8eab /* offset 2839 */ , 
+  0x8eca /* offset 2840 */ , 
+  0x8f9b /* offset 2841 */ , 
+  0x8fb0 /* offset 2842 */ , 
+  0x8fb5 /* offset 2843 */ , 
+  0x9091 /* offset 2844 */ , 
+  0x9149 /* offset 2845 */ , 
+  0x91c6 /* offset 2846 */ , 
+  0x91cc /* offset 2847 */ , 
+  0x91d1 /* offset 2848 */ , 
+  0x9577 /* offset 2849 */ , 
+  0x9580 /* offset 2850 */ , 
+  0x961c /* offset 2851 */ , 
+  0x96b6 /* offset 2852 */ , 
+  0x96b9 /* offset 2853 */ , 
+  0x96e8 /* offset 2854 */ , 
+  0x9751 /* offset 2855 */ , 
+  0x975e /* offset 2856 */ , 
+  0x9762 /* offset 2857 */ , 
+  0x9769 /* offset 2858 */ , 
+  0x97cb /* offset 2859 */ , 
+  0x97ed /* offset 2860 */ , 
+  0x97f3 /* offset 2861 */ , 
+  0x9801 /* offset 2862 */ , 
+  0x98a8 /* offset 2863 */ , 
+  0x98db /* offset 2864 */ , 
+  0x98df /* offset 2865 */ , 
+  0x9996 /* offset 2866 */ , 
+  0x9999 /* offset 2867 */ , 
+  0x99ac /* offset 2868 */ , 
+  0x9aa8 /* offset 2869 */ , 
+  0x9ad8 /* offset 2870 */ , 
+  0x9adf /* offset 2871 */ , 
+  0x9b25 /* offset 2872 */ , 
+  0x9b2f /* offset 2873 */ , 
+  0x9b32 /* offset 2874 */ , 
+  0x9b3c /* offset 2875 */ , 
+  0x9b5a /* offset 2876 */ , 
+  0x9ce5 /* offset 2877 */ , 
+  0x9e75 /* offset 2878 */ , 
+  0x9e7f /* offset 2879 */ , 
+  0x9ea5 /* offset 2880 */ , 
+  0x9ebb /* offset 2881 */ , 
+  0x9ec3 /* offset 2882 */ , 
+  0x9ecd /* offset 2883 */ , 
+  0x9ed1 /* offset 2884 */ , 
+  0x9ef9 /* offset 2885 */ , 
+  0x9efd /* offset 2886 */ , 
+  0x9f0e /* offset 2887 */ , 
+  0x9f13 /* offset 2888 */ , 
+  0x9f20 /* offset 2889 */ , 
+  0x9f3b /* offset 2890 */ , 
+  0x9f4a /* offset 2891 */ , 
+  0x9f52 /* offset 2892 */ , 
+  0x9f8d /* offset 2893 */ , 
+  0x9f9c /* offset 2894 */ , 
+  0x9fa0 /* offset 2895 */ , 
+  0x3012 /* offset 2896 */ , 
+  0x5344 /* offset 2897 */ , 
+  0x5345 /* offset 2898 */ , 
+  0x304b, 0x3099 /* offset 2899 */ , 
+  0x304d, 0x3099 /* offset 2901 */ , 
+  0x304f, 0x3099 /* offset 2903 */ , 
+  0x3051, 0x3099 /* offset 2905 */ , 
+  0x3053, 0x3099 /* offset 2907 */ , 
+  0x3055, 0x3099 /* offset 2909 */ , 
+  0x3057, 0x3099 /* offset 2911 */ , 
+  0x3059, 0x3099 /* offset 2913 */ , 
+  0x305b, 0x3099 /* offset 2915 */ , 
+  0x305d, 0x3099 /* offset 2917 */ , 
+  0x305f, 0x3099 /* offset 2919 */ , 
+  0x3061, 0x3099 /* offset 2921 */ , 
+  0x3064, 0x3099 /* offset 2923 */ , 
+  0x3066, 0x3099 /* offset 2925 */ , 
+  0x3068, 0x3099 /* offset 2927 */ , 
+  0x306f, 0x3099 /* offset 2929 */ , 
+  0x306f, 0x309a /* offset 2931 */ , 
+  0x3072, 0x3099 /* offset 2933 */ , 
+  0x3072, 0x309a /* offset 2935 */ , 
+  0x3075, 0x3099 /* offset 2937 */ , 
+  0x3075, 0x309a /* offset 2939 */ , 
+  0x3078, 0x3099 /* offset 2941 */ , 
+  0x3078, 0x309a /* offset 2943 */ , 
+  0x307b, 0x3099 /* offset 2945 */ , 
+  0x307b, 0x309a /* offset 2947 */ , 
+  0x3046, 0x3099 /* offset 2949 */ , 
+  0x20, 0x3099 /* offset 2951 */ , 
+  0x20, 0x309a /* offset 2953 */ , 
+  0x309d, 0x3099 /* offset 2955 */ , 
+  0x3088, 0x308a /* offset 2957 */ , 
+  0x30ab, 0x3099 /* offset 2959 */ , 
+  0x30ad, 0x3099 /* offset 2961 */ , 
+  0x30af, 0x3099 /* offset 2963 */ , 
+  0x30b1, 0x3099 /* offset 2965 */ , 
+  0x30b3, 0x3099 /* offset 2967 */ , 
+  0x30b5, 0x3099 /* offset 2969 */ , 
+  0x30b7, 0x3099 /* offset 2971 */ , 
+  0x30b9, 0x3099 /* offset 2973 */ , 
+  0x30bb, 0x3099 /* offset 2975 */ , 
+  0x30bd, 0x3099 /* offset 2977 */ , 
+  0x30bf, 0x3099 /* offset 2979 */ , 
+  0x30c1, 0x3099 /* offset 2981 */ , 
+  0x30c4, 0x3099 /* offset 2983 */ , 
+  0x30c6, 0x3099 /* offset 2985 */ , 
+  0x30c8, 0x3099 /* offset 2987 */ , 
+  0x30cf, 0x3099 /* offset 2989 */ , 
+  0x30cf, 0x309a /* offset 2991 */ , 
+  0x30d2, 0x3099 /* offset 2993 */ , 
+  0x30d2, 0x309a /* offset 2995 */ , 
+  0x30d5, 0x3099 /* offset 2997 */ , 
+  0x30d5, 0x309a /* offset 2999 */ , 
+  0x30d8, 0x3099 /* offset 3001 */ , 
+  0x30d8, 0x309a /* offset 3003 */ , 
+  0x30db, 0x3099 /* offset 3005 */ , 
+  0x30db, 0x309a /* offset 3007 */ , 
+  0x30a6, 0x3099 /* offset 3009 */ , 
+  0x30ef, 0x3099 /* offset 3011 */ , 
+  0x30f0, 0x3099 /* offset 3013 */ , 
+  0x30f1, 0x3099 /* offset 3015 */ , 
+  0x30f2, 0x3099 /* offset 3017 */ , 
+  0x30fd, 0x3099 /* offset 3019 */ , 
+  0x30b3, 0x30c8 /* offset 3021 */ , 
+  0x1100 /* offset 3023 */ , 
+  0x1101 /* offset 3024 */ , 
+  0x11aa /* offset 3025 */ , 
+  0x1102 /* offset 3026 */ , 
+  0x11ac /* offset 3027 */ , 
+  0x11ad /* offset 3028 */ , 
+  0x1103 /* offset 3029 */ , 
+  0x1104 /* offset 3030 */ , 
+  0x1105 /* offset 3031 */ , 
+  0x11b0 /* offset 3032 */ , 
+  0x11b1 /* offset 3033 */ , 
+  0x11b2 /* offset 3034 */ , 
+  0x11b3 /* offset 3035 */ , 
+  0x11b4 /* offset 3036 */ , 
+  0x11b5 /* offset 3037 */ , 
+  0x111a /* offset 3038 */ , 
+  0x1106 /* offset 3039 */ , 
+  0x1107 /* offset 3040 */ , 
+  0x1108 /* offset 3041 */ , 
+  0x1121 /* offset 3042 */ , 
+  0x1109 /* offset 3043 */ , 
+  0x110a /* offset 3044 */ , 
+  0x110b /* offset 3045 */ , 
+  0x110c /* offset 3046 */ , 
+  0x110d /* offset 3047 */ , 
+  0x110e /* offset 3048 */ , 
+  0x110f /* offset 3049 */ , 
+  0x1110 /* offset 3050 */ , 
+  0x1111 /* offset 3051 */ , 
+  0x1112 /* offset 3052 */ , 
+  0x1161 /* offset 3053 */ , 
+  0x1162 /* offset 3054 */ , 
+  0x1163 /* offset 3055 */ , 
+  0x1164 /* offset 3056 */ , 
+  0x1165 /* offset 3057 */ , 
+  0x1166 /* offset 3058 */ , 
+  0x1167 /* offset 3059 */ , 
+  0x1168 /* offset 3060 */ , 
+  0x1169 /* offset 3061 */ , 
+  0x116a /* offset 3062 */ , 
+  0x116b /* offset 3063 */ , 
+  0x116c /* offset 3064 */ , 
+  0x116d /* offset 3065 */ , 
+  0x116e /* offset 3066 */ , 
+  0x116f /* offset 3067 */ , 
+  0x1170 /* offset 3068 */ , 
+  0x1171 /* offset 3069 */ , 
+  0x1172 /* offset 3070 */ , 
+  0x1173 /* offset 3071 */ , 
+  0x1174 /* offset 3072 */ , 
+  0x1175 /* offset 3073 */ , 
+  0x1160 /* offset 3074 */ , 
+  0x1114 /* offset 3075 */ , 
+  0x1115 /* offset 3076 */ , 
+  0x11c7 /* offset 3077 */ , 
+  0x11c8 /* offset 3078 */ , 
+  0x11cc /* offset 3079 */ , 
+  0x11ce /* offset 3080 */ , 
+  0x11d3 /* offset 3081 */ , 
+  0x11d7 /* offset 3082 */ , 
+  0x11d9 /* offset 3083 */ , 
+  0x111c /* offset 3084 */ , 
+  0x11dd /* offset 3085 */ , 
+  0x11df /* offset 3086 */ , 
+  0x111d /* offset 3087 */ , 
+  0x111e /* offset 3088 */ , 
+  0x1120 /* offset 3089 */ , 
+  0x1122 /* offset 3090 */ , 
+  0x1123 /* offset 3091 */ , 
+  0x1127 /* offset 3092 */ , 
+  0x1129 /* offset 3093 */ , 
+  0x112b /* offset 3094 */ , 
+  0x112c /* offset 3095 */ , 
+  0x112d /* offset 3096 */ , 
+  0x112e /* offset 3097 */ , 
+  0x112f /* offset 3098 */ , 
+  0x1132 /* offset 3099 */ , 
+  0x1136 /* offset 3100 */ , 
+  0x1140 /* offset 3101 */ , 
+  0x1147 /* offset 3102 */ , 
+  0x114c /* offset 3103 */ , 
+  0x11f1 /* offset 3104 */ , 
+  0x11f2 /* offset 3105 */ , 
+  0x1157 /* offset 3106 */ , 
+  0x1158 /* offset 3107 */ , 
+  0x1159 /* offset 3108 */ , 
+  0x1184 /* offset 3109 */ , 
+  0x1185 /* offset 3110 */ , 
+  0x1188 /* offset 3111 */ , 
+  0x1191 /* offset 3112 */ , 
+  0x1192 /* offset 3113 */ , 
+  0x1194 /* offset 3114 */ , 
+  0x119e /* offset 3115 */ , 
+  0x11a1 /* offset 3116 */ , 
+  0x4e09 /* offset 3117 */ , 
+  0x56db /* offset 3118 */ , 
+  0x4e0a /* offset 3119 */ , 
+  0x4e2d /* offset 3120 */ , 
+  0x4e0b /* offset 3121 */ , 
+  0x7532 /* offset 3122 */ , 
+  0x4e19 /* offset 3123 */ , 
+  0x4e01 /* offset 3124 */ , 
+  0x5929 /* offset 3125 */ , 
+  0x5730 /* offset 3126 */ , 
+  0x28, 0x1100, 0x29 /* offset 3127 */ , 
+  0x28, 0x1102, 0x29 /* offset 3130 */ , 
+  0x28, 0x1103, 0x29 /* offset 3133 */ , 
+  0x28, 0x1105, 0x29 /* offset 3136 */ , 
+  0x28, 0x1106, 0x29 /* offset 3139 */ , 
+  0x28, 0x1107, 0x29 /* offset 3142 */ , 
+  0x28, 0x1109, 0x29 /* offset 3145 */ , 
+  0x28, 0x110b, 0x29 /* offset 3148 */ , 
+  0x28, 0x110c, 0x29 /* offset 3151 */ , 
+  0x28, 0x110e, 0x29 /* offset 3154 */ , 
+  0x28, 0x110f, 0x29 /* offset 3157 */ , 
+  0x28, 0x1110, 0x29 /* offset 3160 */ , 
+  0x28, 0x1111, 0x29 /* offset 3163 */ , 
+  0x28, 0x1112, 0x29 /* offset 3166 */ , 
+  0x28, 0x1100, 0x1161, 0x29 /* offset 3169 */ , 
+  0x28, 0x1102, 0x1161, 0x29 /* offset 3173 */ , 
+  0x28, 0x1103, 0x1161, 0x29 /* offset 3177 */ , 
+  0x28, 0x1105, 0x1161, 0x29 /* offset 3181 */ , 
+  0x28, 0x1106, 0x1161, 0x29 /* offset 3185 */ , 
+  0x28, 0x1107, 0x1161, 0x29 /* offset 3189 */ , 
+  0x28, 0x1109, 0x1161, 0x29 /* offset 3193 */ , 
+  0x28, 0x110b, 0x1161, 0x29 /* offset 3197 */ , 
+  0x28, 0x110c, 0x1161, 0x29 /* offset 3201 */ , 
+  0x28, 0x110e, 0x1161, 0x29 /* offset 3205 */ , 
+  0x28, 0x110f, 0x1161, 0x29 /* offset 3209 */ , 
+  0x28, 0x1110, 0x1161, 0x29 /* offset 3213 */ , 
+  0x28, 0x1111, 0x1161, 0x29 /* offset 3217 */ , 
+  0x28, 0x1112, 0x1161, 0x29 /* offset 3221 */ , 
+  0x28, 0x110c, 0x116e, 0x29 /* offset 3225 */ , 
+  0x28, 0x4e00, 0x29 /* offset 3229 */ , 
+  0x28, 0x4e8c, 0x29 /* offset 3232 */ , 
+  0x28, 0x4e09, 0x29 /* offset 3235 */ , 
+  0x28, 0x56db, 0x29 /* offset 3238 */ , 
+  0x28, 0x4e94, 0x29 /* offset 3241 */ , 
+  0x28, 0x516d, 0x29 /* offset 3244 */ , 
+  0x28, 0x4e03, 0x29 /* offset 3247 */ , 
+  0x28, 0x516b, 0x29 /* offset 3250 */ , 
+  0x28, 0x4e5d, 0x29 /* offset 3253 */ , 
+  0x28, 0x5341, 0x29 /* offset 3256 */ , 
+  0x28, 0x6708, 0x29 /* offset 3259 */ , 
+  0x28, 0x706b, 0x29 /* offset 3262 */ , 
+  0x28, 0x6c34, 0x29 /* offset 3265 */ , 
+  0x28, 0x6728, 0x29 /* offset 3268 */ , 
+  0x28, 0x91d1, 0x29 /* offset 3271 */ , 
+  0x28, 0x571f, 0x29 /* offset 3274 */ , 
+  0x28, 0x65e5, 0x29 /* offset 3277 */ , 
+  0x28, 0x682a, 0x29 /* offset 3280 */ , 
+  0x28, 0x6709, 0x29 /* offset 3283 */ , 
+  0x28, 0x793e, 0x29 /* offset 3286 */ , 
+  0x28, 0x540d, 0x29 /* offset 3289 */ , 
+  0x28, 0x7279, 0x29 /* offset 3292 */ , 
+  0x28, 0x8ca1, 0x29 /* offset 3295 */ , 
+  0x28, 0x795d, 0x29 /* offset 3298 */ , 
+  0x28, 0x52b4, 0x29 /* offset 3301 */ , 
+  0x28, 0x4ee3, 0x29 /* offset 3304 */ , 
+  0x28, 0x547c, 0x29 /* offset 3307 */ , 
+  0x28, 0x5b66, 0x29 /* offset 3310 */ , 
+  0x28, 0x76e3, 0x29 /* offset 3313 */ , 
+  0x28, 0x4f01, 0x29 /* offset 3316 */ , 
+  0x28, 0x8cc7, 0x29 /* offset 3319 */ , 
+  0x28, 0x5354, 0x29 /* offset 3322 */ , 
+  0x28, 0x796d, 0x29 /* offset 3325 */ , 
+  0x28, 0x4f11, 0x29 /* offset 3328 */ , 
+  0x28, 0x81ea, 0x29 /* offset 3331 */ , 
+  0x28, 0x81f3, 0x29 /* offset 3334 */ , 
+  0x32, 0x31 /* offset 3337 */ , 
+  0x32, 0x32 /* offset 3339 */ , 
+  0x32, 0x33 /* offset 3341 */ , 
+  0x32, 0x34 /* offset 3343 */ , 
+  0x32, 0x35 /* offset 3345 */ , 
+  0x32, 0x36 /* offset 3347 */ , 
+  0x32, 0x37 /* offset 3349 */ , 
+  0x32, 0x38 /* offset 3351 */ , 
+  0x32, 0x39 /* offset 3353 */ , 
+  0x33, 0x30 /* offset 3355 */ , 
+  0x33, 0x31 /* offset 3357 */ , 
+  0x33, 0x32 /* offset 3359 */ , 
+  0x33, 0x33 /* offset 3361 */ , 
+  0x33, 0x34 /* offset 3363 */ , 
+  0x33, 0x35 /* offset 3365 */ , 
+  0x1100, 0x1161 /* offset 3367 */ , 
+  0x1102, 0x1161 /* offset 3369 */ , 
+  0x1103, 0x1161 /* offset 3371 */ , 
+  0x1105, 0x1161 /* offset 3373 */ , 
+  0x1106, 0x1161 /* offset 3375 */ , 
+  0x1107, 0x1161 /* offset 3377 */ , 
+  0x1109, 0x1161 /* offset 3379 */ , 
+  0x110b, 0x1161 /* offset 3381 */ , 
+  0x110c, 0x1161 /* offset 3383 */ , 
+  0x110e, 0x1161 /* offset 3385 */ , 
+  0x110f, 0x1161 /* offset 3387 */ , 
+  0x1110, 0x1161 /* offset 3389 */ , 
+  0x1111, 0x1161 /* offset 3391 */ , 
+  0x1112, 0x1161 /* offset 3393 */ , 
+  0x4e94 /* offset 3395 */ , 
+  0x516d /* offset 3396 */ , 
+  0x4e03 /* offset 3397 */ , 
+  0x4e5d /* offset 3398 */ , 
+  0x682a /* offset 3399 */ , 
+  0x6709 /* offset 3400 */ , 
+  0x793e /* offset 3401 */ , 
+  0x540d /* offset 3402 */ , 
+  0x7279 /* offset 3403 */ , 
+  0x8ca1 /* offset 3404 */ , 
+  0x795d /* offset 3405 */ , 
+  0x52b4 /* offset 3406 */ , 
+  0x79d8 /* offset 3407 */ , 
+  0x7537 /* offset 3408 */ , 
+  0x9069 /* offset 3409 */ , 
+  0x512a /* offset 3410 */ , 
+  0x5370 /* offset 3411 */ , 
+  0x6ce8 /* offset 3412 */ , 
+  0x9805 /* offset 3413 */ , 
+  0x4f11 /* offset 3414 */ , 
+  0x5199 /* offset 3415 */ , 
+  0x6b63 /* offset 3416 */ , 
+  0x5de6 /* offset 3417 */ , 
+  0x53f3 /* offset 3418 */ , 
+  0x533b /* offset 3419 */ , 
+  0x5b97 /* offset 3420 */ , 
+  0x5b66 /* offset 3421 */ , 
+  0x76e3 /* offset 3422 */ , 
+  0x4f01 /* offset 3423 */ , 
+  0x8cc7 /* offset 3424 */ , 
+  0x5354 /* offset 3425 */ , 
+  0x591c /* offset 3426 */ , 
+  0x33, 0x36 /* offset 3427 */ , 
+  0x33, 0x37 /* offset 3429 */ , 
+  0x33, 0x38 /* offset 3431 */ , 
+  0x33, 0x39 /* offset 3433 */ , 
+  0x34, 0x30 /* offset 3435 */ , 
+  0x34, 0x31 /* offset 3437 */ , 
+  0x34, 0x32 /* offset 3439 */ , 
+  0x34, 0x33 /* offset 3441 */ , 
+  0x34, 0x34 /* offset 3443 */ , 
+  0x34, 0x35 /* offset 3445 */ , 
+  0x34, 0x36 /* offset 3447 */ , 
+  0x34, 0x37 /* offset 3449 */ , 
+  0x34, 0x38 /* offset 3451 */ , 
+  0x34, 0x39 /* offset 3453 */ , 
+  0x35, 0x30 /* offset 3455 */ , 
+  0x31, 0x6708 /* offset 3457 */ , 
+  0x32, 0x6708 /* offset 3459 */ , 
+  0x33, 0x6708 /* offset 3461 */ , 
+  0x34, 0x6708 /* offset 3463 */ , 
+  0x35, 0x6708 /* offset 3465 */ , 
+  0x36, 0x6708 /* offset 3467 */ , 
+  0x37, 0x6708 /* offset 3469 */ , 
+  0x38, 0x6708 /* offset 3471 */ , 
+  0x39, 0x6708 /* offset 3473 */ , 
+  0x31, 0x30, 0x6708 /* offset 3475 */ , 
+  0x31, 0x31, 0x6708 /* offset 3478 */ , 
+  0x31, 0x32, 0x6708 /* offset 3481 */ , 
+  0x30a2 /* offset 3484 */ , 
+  0x30a4 /* offset 3485 */ , 
+  0x30a6 /* offset 3486 */ , 
+  0x30a8 /* offset 3487 */ , 
+  0x30aa /* offset 3488 */ , 
+  0x30ab /* offset 3489 */ , 
+  0x30ad /* offset 3490 */ , 
+  0x30af /* offset 3491 */ , 
+  0x30b1 /* offset 3492 */ , 
+  0x30b3 /* offset 3493 */ , 
+  0x30b5 /* offset 3494 */ , 
+  0x30b7 /* offset 3495 */ , 
+  0x30b9 /* offset 3496 */ , 
+  0x30bb /* offset 3497 */ , 
+  0x30bd /* offset 3498 */ , 
+  0x30bf /* offset 3499 */ , 
+  0x30c1 /* offset 3500 */ , 
+  0x30c4 /* offset 3501 */ , 
+  0x30c6 /* offset 3502 */ , 
+  0x30c8 /* offset 3503 */ , 
+  0x30ca /* offset 3504 */ , 
+  0x30cb /* offset 3505 */ , 
+  0x30cc /* offset 3506 */ , 
+  0x30cd /* offset 3507 */ , 
+  0x30ce /* offset 3508 */ , 
+  0x30cf /* offset 3509 */ , 
+  0x30d2 /* offset 3510 */ , 
+  0x30d5 /* offset 3511 */ , 
+  0x30d8 /* offset 3512 */ , 
+  0x30db /* offset 3513 */ , 
+  0x30de /* offset 3514 */ , 
+  0x30df /* offset 3515 */ , 
+  0x30e0 /* offset 3516 */ , 
+  0x30e1 /* offset 3517 */ , 
+  0x30e2 /* offset 3518 */ , 
+  0x30e4 /* offset 3519 */ , 
+  0x30e6 /* offset 3520 */ , 
+  0x30e8 /* offset 3521 */ , 
+  0x30e9 /* offset 3522 */ , 
+  0x30ea /* offset 3523 */ , 
+  0x30eb /* offset 3524 */ , 
+  0x30ec /* offset 3525 */ , 
+  0x30ed /* offset 3526 */ , 
+  0x30ef /* offset 3527 */ , 
+  0x30f0 /* offset 3528 */ , 
+  0x30f1 /* offset 3529 */ , 
+  0x30f2 /* offset 3530 */ , 
+  0x30a2, 0x30cf, 0x309a, 0x30fc, 0x30c8 /* offset 3531 */ , 
+  0x30a2, 0x30eb, 0x30d5, 0x30a1 /* offset 3536 */ , 
+  0x30a2, 0x30f3, 0x30d8, 0x309a, 0x30a2 /* offset 3540 */ , 
+  0x30a2, 0x30fc, 0x30eb /* offset 3545 */ , 
+  0x30a4, 0x30cb, 0x30f3, 0x30af, 0x3099 /* offset 3548 */ , 
+  0x30a4, 0x30f3, 0x30c1 /* offset 3553 */ , 
+  0x30a6, 0x30a9, 0x30f3 /* offset 3556 */ , 
+  0x30a8, 0x30b9, 0x30af, 0x30fc, 0x30c8, 0x3099 /* offset 3559 */ , 
+  0x30a8, 0x30fc, 0x30ab, 0x30fc /* offset 3565 */ , 
+  0x30aa, 0x30f3, 0x30b9 /* offset 3569 */ , 
+  0x30aa, 0x30fc, 0x30e0 /* offset 3572 */ , 
+  0x30ab, 0x30a4, 0x30ea /* offset 3575 */ , 
+  0x30ab, 0x30e9, 0x30c3, 0x30c8 /* offset 3578 */ , 
+  0x30ab, 0x30ed, 0x30ea, 0x30fc /* offset 3582 */ , 
+  0x30ab, 0x3099, 0x30ed, 0x30f3 /* offset 3586 */ , 
+  0x30ab, 0x3099, 0x30f3, 0x30de /* offset 3590 */ , 
+  0x30ad, 0x3099, 0x30ab, 0x3099 /* offset 3594 */ , 
+  0x30ad, 0x3099, 0x30cb, 0x30fc /* offset 3598 */ , 
+  0x30ad, 0x30e5, 0x30ea, 0x30fc /* offset 3602 */ , 
+  0x30ad, 0x3099, 0x30eb, 0x30bf, 0x3099, 0x30fc /* offset 3606 */ , 
+  0x30ad, 0x30ed /* offset 3612 */ , 
+  0x30ad, 0x30ed, 0x30af, 0x3099, 0x30e9, 0x30e0 /* offset 3614 */ , 
+  0x30ad, 0x30ed, 0x30e1, 0x30fc, 0x30c8, 0x30eb /* offset 3620 */ , 
+  0x30ad, 0x30ed, 0x30ef, 0x30c3, 0x30c8 /* offset 3626 */ , 
+  0x30af, 0x3099, 0x30e9, 0x30e0 /* offset 3631 */ , 
+  0x30af, 0x3099, 0x30e9, 0x30e0, 0x30c8, 0x30f3 /* offset 3635 */ , 
+  0x30af, 0x30eb, 0x30bb, 0x3099, 0x30a4, 0x30ed /* offset 3641 */ , 
+  0x30af, 0x30ed, 0x30fc, 0x30cd /* offset 3647 */ , 
+  0x30b1, 0x30fc, 0x30b9 /* offset 3651 */ , 
+  0x30b3, 0x30eb, 0x30ca /* offset 3654 */ , 
+  0x30b3, 0x30fc, 0x30db, 0x309a /* offset 3657 */ , 
+  0x30b5, 0x30a4, 0x30af, 0x30eb /* offset 3661 */ , 
+  0x30b5, 0x30f3, 0x30c1, 0x30fc, 0x30e0 /* offset 3665 */ , 
+  0x30b7, 0x30ea, 0x30f3, 0x30af, 0x3099 /* offset 3670 */ , 
+  0x30bb, 0x30f3, 0x30c1 /* offset 3675 */ , 
+  0x30bb, 0x30f3, 0x30c8 /* offset 3678 */ , 
+  0x30bf, 0x3099, 0x30fc, 0x30b9 /* offset 3681 */ , 
+  0x30c6, 0x3099, 0x30b7 /* offset 3685 */ , 
+  0x30c8, 0x3099, 0x30eb /* offset 3688 */ , 
+  0x30c8, 0x30f3 /* offset 3691 */ , 
+  0x30ca, 0x30ce /* offset 3693 */ , 
+  0x30ce, 0x30c3, 0x30c8 /* offset 3695 */ , 
+  0x30cf, 0x30a4, 0x30c4 /* offset 3698 */ , 
+  0x30cf, 0x309a, 0x30fc, 0x30bb, 0x30f3, 0x30c8 /* offset 3701 */ , 
+  0x30cf, 0x309a, 0x30fc, 0x30c4 /* offset 3707 */ , 
+  0x30cf, 0x3099, 0x30fc, 0x30ec, 0x30eb /* offset 3711 */ , 
+  0x30d2, 0x309a, 0x30a2, 0x30b9, 0x30c8, 0x30eb /* offset 3716 */ , 
+  0x30d2, 0x309a, 0x30af, 0x30eb /* offset 3722 */ , 
+  0x30d2, 0x309a, 0x30b3 /* offset 3726 */ , 
+  0x30d2, 0x3099, 0x30eb /* offset 3729 */ , 
+  0x30d5, 0x30a1, 0x30e9, 0x30c3, 0x30c8, 0x3099 /* offset 3732 */ , 
+  0x30d5, 0x30a3, 0x30fc, 0x30c8 /* offset 3738 */ , 
+  0x30d5, 0x3099, 0x30c3, 0x30b7, 0x30a7, 0x30eb /* offset 3742 */ , 
+  0x30d5, 0x30e9, 0x30f3 /* offset 3748 */ , 
+  0x30d8, 0x30af, 0x30bf, 0x30fc, 0x30eb /* offset 3751 */ , 
+  0x30d8, 0x309a, 0x30bd /* offset 3756 */ , 
+  0x30d8, 0x309a, 0x30cb, 0x30d2 /* offset 3759 */ , 
+  0x30d8, 0x30eb, 0x30c4 /* offset 3763 */ , 
+  0x30d8, 0x309a, 0x30f3, 0x30b9 /* offset 3766 */ , 
+  0x30d8, 0x309a, 0x30fc, 0x30b7, 0x3099 /* offset 3770 */ , 
+  0x30d8, 0x3099, 0x30fc, 0x30bf /* offset 3775 */ , 
+  0x30db, 0x309a, 0x30a4, 0x30f3, 0x30c8 /* offset 3779 */ , 
+  0x30db, 0x3099, 0x30eb, 0x30c8 /* offset 3784 */ , 
+  0x30db, 0x30f3 /* offset 3788 */ , 
+  0x30db, 0x309a, 0x30f3, 0x30c8, 0x3099 /* offset 3790 */ , 
+  0x30db, 0x30fc, 0x30eb /* offset 3795 */ , 
+  0x30db, 0x30fc, 0x30f3 /* offset 3798 */ , 
+  0x30de, 0x30a4, 0x30af, 0x30ed /* offset 3801 */ , 
+  0x30de, 0x30a4, 0x30eb /* offset 3805 */ , 
+  0x30de, 0x30c3, 0x30cf /* offset 3808 */ , 
+  0x30de, 0x30eb, 0x30af /* offset 3811 */ , 
+  0x30de, 0x30f3, 0x30b7, 0x30e7, 0x30f3 /* offset 3814 */ , 
+  0x30df, 0x30af, 0x30ed, 0x30f3 /* offset 3819 */ , 
+  0x30df, 0x30ea /* offset 3823 */ , 
+  0x30df, 0x30ea, 0x30cf, 0x3099, 0x30fc, 0x30eb /* offset 3825 */ , 
+  0x30e1, 0x30ab, 0x3099 /* offset 3831 */ , 
+  0x30e1, 0x30ab, 0x3099, 0x30c8, 0x30f3 /* offset 3834 */ , 
+  0x30e1, 0x30fc, 0x30c8, 0x30eb /* offset 3839 */ , 
+  0x30e4, 0x30fc, 0x30c8, 0x3099 /* offset 3843 */ , 
+  0x30e4, 0x30fc, 0x30eb /* offset 3847 */ , 
+  0x30e6, 0x30a2, 0x30f3 /* offset 3850 */ , 
+  0x30ea, 0x30c3, 0x30c8, 0x30eb /* offset 3853 */ , 
+  0x30ea, 0x30e9 /* offset 3857 */ , 
+  0x30eb, 0x30d2, 0x309a, 0x30fc /* offset 3859 */ , 
+  0x30eb, 0x30fc, 0x30d5, 0x3099, 0x30eb /* offset 3863 */ , 
+  0x30ec, 0x30e0 /* offset 3868 */ , 
+  0x30ec, 0x30f3, 0x30c8, 0x30b1, 0x3099, 0x30f3 /* offset 3870 */ , 
+  0x30ef, 0x30c3, 0x30c8 /* offset 3876 */ , 
+  0x30, 0x70b9 /* offset 3879 */ , 
+  0x31, 0x70b9 /* offset 3881 */ , 
+  0x32, 0x70b9 /* offset 3883 */ , 
+  0x33, 0x70b9 /* offset 3885 */ , 
+  0x34, 0x70b9 /* offset 3887 */ , 
+  0x35, 0x70b9 /* offset 3889 */ , 
+  0x36, 0x70b9 /* offset 3891 */ , 
+  0x37, 0x70b9 /* offset 3893 */ , 
+  0x38, 0x70b9 /* offset 3895 */ , 
+  0x39, 0x70b9 /* offset 3897 */ , 
+  0x31, 0x30, 0x70b9 /* offset 3899 */ , 
+  0x31, 0x31, 0x70b9 /* offset 3902 */ , 
+  0x31, 0x32, 0x70b9 /* offset 3905 */ , 
+  0x31, 0x33, 0x70b9 /* offset 3908 */ , 
+  0x31, 0x34, 0x70b9 /* offset 3911 */ , 
+  0x31, 0x35, 0x70b9 /* offset 3914 */ , 
+  0x31, 0x36, 0x70b9 /* offset 3917 */ , 
+  0x31, 0x37, 0x70b9 /* offset 3920 */ , 
+  0x31, 0x38, 0x70b9 /* offset 3923 */ , 
+  0x31, 0x39, 0x70b9 /* offset 3926 */ , 
+  0x32, 0x30, 0x70b9 /* offset 3929 */ , 
+  0x32, 0x31, 0x70b9 /* offset 3932 */ , 
+  0x32, 0x32, 0x70b9 /* offset 3935 */ , 
+  0x32, 0x33, 0x70b9 /* offset 3938 */ , 
+  0x32, 0x34, 0x70b9 /* offset 3941 */ , 
+  0x68, 0x50, 0x61 /* offset 3944 */ , 
+  0x64, 0x61 /* offset 3947 */ , 
+  0x41, 0x55 /* offset 3949 */ , 
+  0x62, 0x61, 0x72 /* offset 3951 */ , 
+  0x6f, 0x56 /* offset 3954 */ , 
+  0x70, 0x63 /* offset 3956 */ , 
+  0x5e73, 0x6210 /* offset 3958 */ , 
+  0x662d, 0x548c /* offset 3960 */ , 
+  0x5927, 0x6b63 /* offset 3962 */ , 
+  0x660e, 0x6cbb /* offset 3964 */ , 
+  0x682a, 0x5f0f, 0x4f1a, 0x793e /* offset 3966 */ , 
+  0x70, 0x41 /* offset 3970 */ , 
+  0x6e, 0x41 /* offset 3972 */ , 
+  0x3bc, 0x41 /* offset 3974 */ , 
+  0x6d, 0x41 /* offset 3976 */ , 
+  0x6b, 0x41 /* offset 3978 */ , 
+  0x4b, 0x42 /* offset 3980 */ , 
+  0x4d, 0x42 /* offset 3982 */ , 
+  0x47, 0x42 /* offset 3984 */ , 
+  0x63, 0x61, 0x6c /* offset 3986 */ , 
+  0x6b, 0x63, 0x61, 0x6c /* offset 3989 */ , 
+  0x70, 0x46 /* offset 3993 */ , 
+  0x6e, 0x46 /* offset 3995 */ , 
+  0x3bc, 0x46 /* offset 3997 */ , 
+  0x3bc, 0x67 /* offset 3999 */ , 
+  0x6d, 0x67 /* offset 4001 */ , 
+  0x6b, 0x67 /* offset 4003 */ , 
+  0x48, 0x7a /* offset 4005 */ , 
+  0x6b, 0x48, 0x7a /* offset 4007 */ , 
+  0x4d, 0x48, 0x7a /* offset 4010 */ , 
+  0x47, 0x48, 0x7a /* offset 4013 */ , 
+  0x54, 0x48, 0x7a /* offset 4016 */ , 
+  0x3bc, 0x6c /* offset 4019 */ , 
+  0x6d, 0x6c /* offset 4021 */ , 
+  0x64, 0x6c /* offset 4023 */ , 
+  0x6b, 0x6c /* offset 4025 */ , 
+  0x66, 0x6d /* offset 4027 */ , 
+  0x6e, 0x6d /* offset 4029 */ , 
+  0x3bc, 0x6d /* offset 4031 */ , 
+  0x6d, 0x6d /* offset 4033 */ , 
+  0x63, 0x6d /* offset 4035 */ , 
+  0x6b, 0x6d /* offset 4037 */ , 
+  0x6d, 0x6d, 0x32 /* offset 4039 */ , 
+  0x63, 0x6d, 0x32 /* offset 4042 */ , 
+  0x6d, 0x32 /* offset 4045 */ , 
+  0x6b, 0x6d, 0x32 /* offset 4047 */ , 
+  0x6d, 0x6d, 0x33 /* offset 4050 */ , 
+  0x63, 0x6d, 0x33 /* offset 4053 */ , 
+  0x6d, 0x33 /* offset 4056 */ , 
+  0x6b, 0x6d, 0x33 /* offset 4058 */ , 
+  0x6d, 0x2215, 0x73 /* offset 4061 */ , 
+  0x6d, 0x2215, 0x73, 0x32 /* offset 4064 */ , 
+  0x50, 0x61 /* offset 4068 */ , 
+  0x6b, 0x50, 0x61 /* offset 4070 */ , 
+  0x4d, 0x50, 0x61 /* offset 4073 */ , 
+  0x47, 0x50, 0x61 /* offset 4076 */ , 
+  0x72, 0x61, 0x64 /* offset 4079 */ , 
+  0x72, 0x61, 0x64, 0x2215, 0x73 /* offset 4082 */ , 
+  0x72, 0x61, 0x64, 0x2215, 0x73, 0x32 /* offset 4087 */ , 
+  0x70, 0x73 /* offset 4093 */ , 
+  0x6e, 0x73 /* offset 4095 */ , 
+  0x3bc, 0x73 /* offset 4097 */ , 
+  0x6d, 0x73 /* offset 4099 */ , 
+  0x70, 0x56 /* offset 4101 */ , 
+  0x6e, 0x56 /* offset 4103 */ , 
+  0x3bc, 0x56 /* offset 4105 */ , 
+  0x6d, 0x56 /* offset 4107 */ , 
+  0x6b, 0x56 /* offset 4109 */ , 
+  0x4d, 0x56 /* offset 4111 */ , 
+  0x70, 0x57 /* offset 4113 */ , 
+  0x6e, 0x57 /* offset 4115 */ , 
+  0x3bc, 0x57 /* offset 4117 */ , 
+  0x6d, 0x57 /* offset 4119 */ , 
+  0x6b, 0x57 /* offset 4121 */ , 
+  0x4d, 0x57 /* offset 4123 */ , 
+  0x6b, 0x3a9 /* offset 4125 */ , 
+  0x4d, 0x3a9 /* offset 4127 */ , 
+  0x61, 0x2e, 0x6d, 0x2e /* offset 4129 */ , 
+  0x42, 0x71 /* offset 4133 */ , 
+  0x63, 0x63 /* offset 4135 */ , 
+  0x63, 0x64 /* offset 4137 */ , 
+  0x43, 0x2215, 0x6b, 0x67 /* offset 4139 */ , 
+  0x43, 0x6f, 0x2e /* offset 4143 */ , 
+  0x64, 0x42 /* offset 4146 */ , 
+  0x47, 0x79 /* offset 4148 */ , 
+  0x68, 0x61 /* offset 4150 */ , 
+  0x48, 0x50 /* offset 4152 */ , 
+  0x69, 0x6e /* offset 4154 */ , 
+  0x4b, 0x4b /* offset 4156 */ , 
+  0x4b, 0x4d /* offset 4158 */ , 
+  0x6b, 0x74 /* offset 4160 */ , 
+  0x6c, 0x6d /* offset 4162 */ , 
+  0x6c, 0x6e /* offset 4164 */ , 
+  0x6c, 0x6f, 0x67 /* offset 4166 */ , 
+  0x6c, 0x78 /* offset 4169 */ , 
+  0x6d, 0x62 /* offset 4171 */ , 
+  0x6d, 0x69, 0x6c /* offset 4173 */ , 
+  0x6d, 0x6f, 0x6c /* offset 4176 */ , 
+  0x50, 0x48 /* offset 4179 */ , 
+  0x70, 0x2e, 0x6d, 0x2e /* offset 4181 */ , 
+  0x50, 0x50, 0x4d /* offset 4185 */ , 
+  0x50, 0x52 /* offset 4188 */ , 
+  0x73, 0x72 /* offset 4190 */ , 
+  0x53, 0x76 /* offset 4192 */ , 
+  0x57, 0x62 /* offset 4194 */ , 
+  0x31, 0x65e5 /* offset 4196 */ , 
+  0x32, 0x65e5 /* offset 4198 */ , 
+  0x33, 0x65e5 /* offset 4200 */ , 
+  0x34, 0x65e5 /* offset 4202 */ , 
+  0x35, 0x65e5 /* offset 4204 */ , 
+  0x36, 0x65e5 /* offset 4206 */ , 
+  0x37, 0x65e5 /* offset 4208 */ , 
+  0x38, 0x65e5 /* offset 4210 */ , 
+  0x39, 0x65e5 /* offset 4212 */ , 
+  0x31, 0x30, 0x65e5 /* offset 4214 */ , 
+  0x31, 0x31, 0x65e5 /* offset 4217 */ , 
+  0x31, 0x32, 0x65e5 /* offset 4220 */ , 
+  0x31, 0x33, 0x65e5 /* offset 4223 */ , 
+  0x31, 0x34, 0x65e5 /* offset 4226 */ , 
+  0x31, 0x35, 0x65e5 /* offset 4229 */ , 
+  0x31, 0x36, 0x65e5 /* offset 4232 */ , 
+  0x31, 0x37, 0x65e5 /* offset 4235 */ , 
+  0x31, 0x38, 0x65e5 /* offset 4238 */ , 
+  0x31, 0x39, 0x65e5 /* offset 4241 */ , 
+  0x32, 0x30, 0x65e5 /* offset 4244 */ , 
+  0x32, 0x31, 0x65e5 /* offset 4247 */ , 
+  0x32, 0x32, 0x65e5 /* offset 4250 */ , 
+  0x32, 0x33, 0x65e5 /* offset 4253 */ , 
+  0x32, 0x34, 0x65e5 /* offset 4256 */ , 
+  0x32, 0x35, 0x65e5 /* offset 4259 */ , 
+  0x32, 0x36, 0x65e5 /* offset 4262 */ , 
+  0x32, 0x37, 0x65e5 /* offset 4265 */ , 
+  0x32, 0x38, 0x65e5 /* offset 4268 */ , 
+  0x32, 0x39, 0x65e5 /* offset 4271 */ , 
+  0x33, 0x30, 0x65e5 /* offset 4274 */ , 
+  0x33, 0x31, 0x65e5 /* offset 4277 */ , 
+  0x8c48 /* offset 4280 */ , 
+  0x66f4 /* offset 4281 */ , 
+  0x8cc8 /* offset 4282 */ , 
+  0x6ed1 /* offset 4283 */ , 
+  0x4e32 /* offset 4284 */ , 
+  0x53e5 /* offset 4285 */ , 
+  0x5951 /* offset 4286 */ , 
+  0x5587 /* offset 4287 */ , 
+  0x5948 /* offset 4288 */ , 
+  0x61f6 /* offset 4289 */ , 
+  0x7669 /* offset 4290 */ , 
+  0x7f85 /* offset 4291 */ , 
+  0x863f /* offset 4292 */ , 
+  0x87ba /* offset 4293 */ , 
+  0x88f8 /* offset 4294 */ , 
+  0x908f /* offset 4295 */ , 
+  0x6a02 /* offset 4296 */ , 
+  0x6d1b /* offset 4297 */ , 
+  0x70d9 /* offset 4298 */ , 
+  0x73de /* offset 4299 */ , 
+  0x843d /* offset 4300 */ , 
+  0x916a /* offset 4301 */ , 
+  0x99f1 /* offset 4302 */ , 
+  0x4e82 /* offset 4303 */ , 
+  0x5375 /* offset 4304 */ , 
+  0x6b04 /* offset 4305 */ , 
+  0x721b /* offset 4306 */ , 
+  0x862d /* offset 4307 */ , 
+  0x9e1e /* offset 4308 */ , 
+  0x5d50 /* offset 4309 */ , 
+  0x6feb /* offset 4310 */ , 
+  0x85cd /* offset 4311 */ , 
+  0x8964 /* offset 4312 */ , 
+  0x62c9 /* offset 4313 */ , 
+  0x81d8 /* offset 4314 */ , 
+  0x881f /* offset 4315 */ , 
+  0x5eca /* offset 4316 */ , 
+  0x6717 /* offset 4317 */ , 
+  0x6d6a /* offset 4318 */ , 
+  0x72fc /* offset 4319 */ , 
+  0x90ce /* offset 4320 */ , 
+  0x4f86 /* offset 4321 */ , 
+  0x51b7 /* offset 4322 */ , 
+  0x52de /* offset 4323 */ , 
+  0x64c4 /* offset 4324 */ , 
+  0x6ad3 /* offset 4325 */ , 
+  0x7210 /* offset 4326 */ , 
+  0x76e7 /* offset 4327 */ , 
+  0x8606 /* offset 4328 */ , 
+  0x865c /* offset 4329 */ , 
+  0x8def /* offset 4330 */ , 
+  0x9732 /* offset 4331 */ , 
+  0x9b6f /* offset 4332 */ , 
+  0x9dfa /* offset 4333 */ , 
+  0x788c /* offset 4334 */ , 
+  0x797f /* offset 4335 */ , 
+  0x7da0 /* offset 4336 */ , 
+  0x83c9 /* offset 4337 */ , 
+  0x9304 /* offset 4338 */ , 
+  0x8ad6 /* offset 4339 */ , 
+  0x58df /* offset 4340 */ , 
+  0x5f04 /* offset 4341 */ , 
+  0x7c60 /* offset 4342 */ , 
+  0x807e /* offset 4343 */ , 
+  0x7262 /* offset 4344 */ , 
+  0x78ca /* offset 4345 */ , 
+  0x8cc2 /* offset 4346 */ , 
+  0x96f7 /* offset 4347 */ , 
+  0x58d8 /* offset 4348 */ , 
+  0x5c62 /* offset 4349 */ , 
+  0x6a13 /* offset 4350 */ , 
+  0x6dda /* offset 4351 */ , 
+  0x6f0f /* offset 4352 */ , 
+  0x7d2f /* offset 4353 */ , 
+  0x7e37 /* offset 4354 */ , 
+  0x964b /* offset 4355 */ , 
+  0x52d2 /* offset 4356 */ , 
+  0x808b /* offset 4357 */ , 
+  0x51dc /* offset 4358 */ , 
+  0x51cc /* offset 4359 */ , 
+  0x7a1c /* offset 4360 */ , 
+  0x7dbe /* offset 4361 */ , 
+  0x83f1 /* offset 4362 */ , 
+  0x9675 /* offset 4363 */ , 
+  0x8b80 /* offset 4364 */ , 
+  0x62cf /* offset 4365 */ , 
+  0x8afe /* offset 4366 */ , 
+  0x4e39 /* offset 4367 */ , 
+  0x5be7 /* offset 4368 */ , 
+  0x6012 /* offset 4369 */ , 
+  0x7387 /* offset 4370 */ , 
+  0x7570 /* offset 4371 */ , 
+  0x5317 /* offset 4372 */ , 
+  0x78fb /* offset 4373 */ , 
+  0x4fbf /* offset 4374 */ , 
+  0x5fa9 /* offset 4375 */ , 
+  0x4e0d /* offset 4376 */ , 
+  0x6ccc /* offset 4377 */ , 
+  0x6578 /* offset 4378 */ , 
+  0x7d22 /* offset 4379 */ , 
+  0x53c3 /* offset 4380 */ , 
+  0x585e /* offset 4381 */ , 
+  0x7701 /* offset 4382 */ , 
+  0x8449 /* offset 4383 */ , 
+  0x8aaa /* offset 4384 */ , 
+  0x6bba /* offset 4385 */ , 
+  0x6c88 /* offset 4386 */ , 
+  0x62fe /* offset 4387 */ , 
+  0x82e5 /* offset 4388 */ , 
+  0x63a0 /* offset 4389 */ , 
+  0x7565 /* offset 4390 */ , 
+  0x4eae /* offset 4391 */ , 
+  0x5169 /* offset 4392 */ , 
+  0x51c9 /* offset 4393 */ , 
+  0x6881 /* offset 4394 */ , 
+  0x7ce7 /* offset 4395 */ , 
+  0x826f /* offset 4396 */ , 
+  0x8ad2 /* offset 4397 */ , 
+  0x91cf /* offset 4398 */ , 
+  0x52f5 /* offset 4399 */ , 
+  0x5442 /* offset 4400 */ , 
+  0x5eec /* offset 4401 */ , 
+  0x65c5 /* offset 4402 */ , 
+  0x6ffe /* offset 4403 */ , 
+  0x792a /* offset 4404 */ , 
+  0x95ad /* offset 4405 */ , 
+  0x9a6a /* offset 4406 */ , 
+  0x9e97 /* offset 4407 */ , 
+  0x9ece /* offset 4408 */ , 
+  0x66c6 /* offset 4409 */ , 
+  0x6b77 /* offset 4410 */ , 
+  0x8f62 /* offset 4411 */ , 
+  0x5e74 /* offset 4412 */ , 
+  0x6190 /* offset 4413 */ , 
+  0x6200 /* offset 4414 */ , 
+  0x649a /* offset 4415 */ , 
+  0x6f23 /* offset 4416 */ , 
+  0x7149 /* offset 4417 */ , 
+  0x7489 /* offset 4418 */ , 
+  0x79ca /* offset 4419 */ , 
+  0x7df4 /* offset 4420 */ , 
+  0x806f /* offset 4421 */ , 
+  0x8f26 /* offset 4422 */ , 
+  0x84ee /* offset 4423 */ , 
+  0x9023 /* offset 4424 */ , 
+  0x934a /* offset 4425 */ , 
+  0x5217 /* offset 4426 */ , 
+  0x52a3 /* offset 4427 */ , 
+  0x54bd /* offset 4428 */ , 
+  0x70c8 /* offset 4429 */ , 
+  0x88c2 /* offset 4430 */ , 
+  0x5ec9 /* offset 4431 */ , 
+  0x5ff5 /* offset 4432 */ , 
+  0x637b /* offset 4433 */ , 
+  0x6bae /* offset 4434 */ , 
+  0x7c3e /* offset 4435 */ , 
+  0x7375 /* offset 4436 */ , 
+  0x4ee4 /* offset 4437 */ , 
+  0x56f9 /* offset 4438 */ , 
+  0x5dba /* offset 4439 */ , 
+  0x601c /* offset 4440 */ , 
+  0x73b2 /* offset 4441 */ , 
+  0x7469 /* offset 4442 */ , 
+  0x7f9a /* offset 4443 */ , 
+  0x8046 /* offset 4444 */ , 
+  0x9234 /* offset 4445 */ , 
+  0x96f6 /* offset 4446 */ , 
+  0x9748 /* offset 4447 */ , 
+  0x9818 /* offset 4448 */ , 
+  0x4f8b /* offset 4449 */ , 
+  0x79ae /* offset 4450 */ , 
+  0x91b4 /* offset 4451 */ , 
+  0x96b8 /* offset 4452 */ , 
+  0x60e1 /* offset 4453 */ , 
+  0x4e86 /* offset 4454 */ , 
+  0x50da /* offset 4455 */ , 
+  0x5bee /* offset 4456 */ , 
+  0x5c3f /* offset 4457 */ , 
+  0x6599 /* offset 4458 */ , 
+  0x71ce /* offset 4459 */ , 
+  0x7642 /* offset 4460 */ , 
+  0x84fc /* offset 4461 */ , 
+  0x907c /* offset 4462 */ , 
+  0x6688 /* offset 4463 */ , 
+  0x962e /* offset 4464 */ , 
+  0x5289 /* offset 4465 */ , 
+  0x677b /* offset 4466 */ , 
+  0x67f3 /* offset 4467 */ , 
+  0x6d41 /* offset 4468 */ , 
+  0x6e9c /* offset 4469 */ , 
+  0x7409 /* offset 4470 */ , 
+  0x7559 /* offset 4471 */ , 
+  0x786b /* offset 4472 */ , 
+  0x7d10 /* offset 4473 */ , 
+  0x985e /* offset 4474 */ , 
+  0x622e /* offset 4475 */ , 
+  0x9678 /* offset 4476 */ , 
+  0x502b /* offset 4477 */ , 
+  0x5d19 /* offset 4478 */ , 
+  0x6dea /* offset 4479 */ , 
+  0x8f2a /* offset 4480 */ , 
+  0x5f8b /* offset 4481 */ , 
+  0x6144 /* offset 4482 */ , 
+  0x6817 /* offset 4483 */ , 
+  0x9686 /* offset 4484 */ , 
+  0x5229 /* offset 4485 */ , 
+  0x540f /* offset 4486 */ , 
+  0x5c65 /* offset 4487 */ , 
+  0x6613 /* offset 4488 */ , 
+  0x674e /* offset 4489 */ , 
+  0x68a8 /* offset 4490 */ , 
+  0x6ce5 /* offset 4491 */ , 
+  0x7406 /* offset 4492 */ , 
+  0x75e2 /* offset 4493 */ , 
+  0x7f79 /* offset 4494 */ , 
+  0x88cf /* offset 4495 */ , 
+  0x88e1 /* offset 4496 */ , 
+  0x96e2 /* offset 4497 */ , 
+  0x533f /* offset 4498 */ , 
+  0x6eba /* offset 4499 */ , 
+  0x541d /* offset 4500 */ , 
+  0x71d0 /* offset 4501 */ , 
+  0x7498 /* offset 4502 */ , 
+  0x85fa /* offset 4503 */ , 
+  0x96a3 /* offset 4504 */ , 
+  0x9c57 /* offset 4505 */ , 
+  0x9e9f /* offset 4506 */ , 
+  0x6797 /* offset 4507 */ , 
+  0x6dcb /* offset 4508 */ , 
+  0x81e8 /* offset 4509 */ , 
+  0x7b20 /* offset 4510 */ , 
+  0x7c92 /* offset 4511 */ , 
+  0x72c0 /* offset 4512 */ , 
+  0x7099 /* offset 4513 */ , 
+  0x8b58 /* offset 4514 */ , 
+  0x4ec0 /* offset 4515 */ , 
+  0x8336 /* offset 4516 */ , 
+  0x523a /* offset 4517 */ , 
+  0x5207 /* offset 4518 */ , 
+  0x5ea6 /* offset 4519 */ , 
+  0x62d3 /* offset 4520 */ , 
+  0x7cd6 /* offset 4521 */ , 
+  0x5b85 /* offset 4522 */ , 
+  0x6d1e /* offset 4523 */ , 
+  0x66b4 /* offset 4524 */ , 
+  0x8f3b /* offset 4525 */ , 
+  0x964d /* offset 4526 */ , 
+  0x5ed3 /* offset 4527 */ , 
+  0x5140 /* offset 4528 */ , 
+  0x55c0 /* offset 4529 */ , 
+  0x585a /* offset 4530 */ , 
+  0x6674 /* offset 4531 */ , 
+  0x51de /* offset 4532 */ , 
+  0x732a /* offset 4533 */ , 
+  0x76ca /* offset 4534 */ , 
+  0x793c /* offset 4535 */ , 
+  0x795e /* offset 4536 */ , 
+  0x7965 /* offset 4537 */ , 
+  0x798f /* offset 4538 */ , 
+  0x9756 /* offset 4539 */ , 
+  0x7cbe /* offset 4540 */ , 
+  0x8612 /* offset 4541 */ , 
+  0x8af8 /* offset 4542 */ , 
+  0x9038 /* offset 4543 */ , 
+  0x90fd /* offset 4544 */ , 
+  0x98ef /* offset 4545 */ , 
+  0x98fc /* offset 4546 */ , 
+  0x9928 /* offset 4547 */ , 
+  0x9db4 /* offset 4548 */ , 
+  0x4fae /* offset 4549 */ , 
+  0x50e7 /* offset 4550 */ , 
+  0x514d /* offset 4551 */ , 
+  0x52c9 /* offset 4552 */ , 
+  0x52e4 /* offset 4553 */ , 
+  0x5351 /* offset 4554 */ , 
+  0x559d /* offset 4555 */ , 
+  0x5606 /* offset 4556 */ , 
+  0x5668 /* offset 4557 */ , 
+  0x5840 /* offset 4558 */ , 
+  0x58a8 /* offset 4559 */ , 
+  0x5c64 /* offset 4560 */ , 
+  0x6094 /* offset 4561 */ , 
+  0x6168 /* offset 4562 */ , 
+  0x618e /* offset 4563 */ , 
+  0x61f2 /* offset 4564 */ , 
+  0x654f /* offset 4565 */ , 
+  0x65e2 /* offset 4566 */ , 
+  0x6691 /* offset 4567 */ , 
+  0x6885 /* offset 4568 */ , 
+  0x6d77 /* offset 4569 */ , 
+  0x6e1a /* offset 4570 */ , 
+  0x6f22 /* offset 4571 */ , 
+  0x716e /* offset 4572 */ , 
+  0x722b /* offset 4573 */ , 
+  0x7422 /* offset 4574 */ , 
+  0x7891 /* offset 4575 */ , 
+  0x7949 /* offset 4576 */ , 
+  0x7948 /* offset 4577 */ , 
+  0x7950 /* offset 4578 */ , 
+  0x7956 /* offset 4579 */ , 
+  0x798d /* offset 4580 */ , 
+  0x798e /* offset 4581 */ , 
+  0x7a40 /* offset 4582 */ , 
+  0x7a81 /* offset 4583 */ , 
+  0x7bc0 /* offset 4584 */ , 
+  0x7e09 /* offset 4585 */ , 
+  0x7e41 /* offset 4586 */ , 
+  0x7f72 /* offset 4587 */ , 
+  0x8005 /* offset 4588 */ , 
+  0x81ed /* offset 4589 */ , 
+  0x8279 /* offset 4590 */ , 
+  0x8457 /* offset 4591 */ , 
+  0x8910 /* offset 4592 */ , 
+  0x8996 /* offset 4593 */ , 
+  0x8b01 /* offset 4594 */ , 
+  0x8b39 /* offset 4595 */ , 
+  0x8cd3 /* offset 4596 */ , 
+  0x8d08 /* offset 4597 */ , 
+  0x8fb6 /* offset 4598 */ , 
+  0x96e3 /* offset 4599 */ , 
+  0x97ff /* offset 4600 */ , 
+  0x983b /* offset 4601 */ , 
+  0x66, 0x66 /* offset 4602 */ , 
+  0x66, 0x69 /* offset 4604 */ , 
+  0x66, 0x6c /* offset 4606 */ , 
+  0x66, 0x66, 0x69 /* offset 4608 */ , 
+  0x66, 0x66, 0x6c /* offset 4611 */ , 
+  0x73, 0x74 /* offset 4614 */ , 
+  0x574, 0x576 /* offset 4616 */ , 
+  0x574, 0x565 /* offset 4618 */ , 
+  0x574, 0x56b /* offset 4620 */ , 
+  0x57e, 0x576 /* offset 4622 */ , 
+  0x574, 0x56d /* offset 4624 */ , 
+  0x5d9, 0x5b4 /* offset 4626 */ , 
+  0x5f2, 0x5b7 /* offset 4628 */ , 
+  0x5e2 /* offset 4630 */ , 
+  0x5d4 /* offset 4631 */ , 
+  0x5db /* offset 4632 */ , 
+  0x5dc /* offset 4633 */ , 
+  0x5dd /* offset 4634 */ , 
+  0x5e8 /* offset 4635 */ , 
+  0x5ea /* offset 4636 */ , 
+  0x5e9, 0x5c1 /* offset 4637 */ , 
+  0x5e9, 0x5c2 /* offset 4639 */ , 
+  0x5e9, 0x5bc, 0x5c1 /* offset 4641 */ , 
+  0x5e9, 0x5bc, 0x5c2 /* offset 4644 */ , 
+  0x5d0, 0x5b7 /* offset 4647 */ , 
+  0x5d0, 0x5b8 /* offset 4649 */ , 
+  0x5d0, 0x5bc /* offset 4651 */ , 
+  0x5d1, 0x5bc /* offset 4653 */ , 
+  0x5d2, 0x5bc /* offset 4655 */ , 
+  0x5d3, 0x5bc /* offset 4657 */ , 
+  0x5d4, 0x5bc /* offset 4659 */ , 
+  0x5d5, 0x5bc /* offset 4661 */ , 
+  0x5d6, 0x5bc /* offset 4663 */ , 
+  0x5d8, 0x5bc /* offset 4665 */ , 
+  0x5d9, 0x5bc /* offset 4667 */ , 
+  0x5da, 0x5bc /* offset 4669 */ , 
+  0x5db, 0x5bc /* offset 4671 */ , 
+  0x5dc, 0x5bc /* offset 4673 */ , 
+  0x5de, 0x5bc /* offset 4675 */ , 
+  0x5e0, 0x5bc /* offset 4677 */ , 
+  0x5e1, 0x5bc /* offset 4679 */ , 
+  0x5e3, 0x5bc /* offset 4681 */ , 
+  0x5e4, 0x5bc /* offset 4683 */ , 
+  0x5e6, 0x5bc /* offset 4685 */ , 
+  0x5e7, 0x5bc /* offset 4687 */ , 
+  0x5e8, 0x5bc /* offset 4689 */ , 
+  0x5e9, 0x5bc /* offset 4691 */ , 
+  0x5ea, 0x5bc /* offset 4693 */ , 
+  0x5d5, 0x5b9 /* offset 4695 */ , 
+  0x5d1, 0x5bf /* offset 4697 */ , 
+  0x5db, 0x5bf /* offset 4699 */ , 
+  0x5e4, 0x5bf /* offset 4701 */ , 
+  0x5d0, 0x5dc /* offset 4703 */ , 
+  0x671 /* offset 4705 */ , 
+  0x67b /* offset 4706 */ , 
+  0x67e /* offset 4707 */ , 
+  0x680 /* offset 4708 */ , 
+  0x67a /* offset 4709 */ , 
+  0x67f /* offset 4710 */ , 
+  0x679 /* offset 4711 */ , 
+  0x6a4 /* offset 4712 */ , 
+  0x6a6 /* offset 4713 */ , 
+  0x684 /* offset 4714 */ , 
+  0x683 /* offset 4715 */ , 
+  0x686 /* offset 4716 */ , 
+  0x687 /* offset 4717 */ , 
+  0x68d /* offset 4718 */ , 
+  0x68c /* offset 4719 */ , 
+  0x68e /* offset 4720 */ , 
+  0x688 /* offset 4721 */ , 
+  0x698 /* offset 4722 */ , 
+  0x691 /* offset 4723 */ , 
+  0x6a9 /* offset 4724 */ , 
+  0x6af /* offset 4725 */ , 
+  0x6b3 /* offset 4726 */ , 
+  0x6b1 /* offset 4727 */ , 
+  0x6ba /* offset 4728 */ , 
+  0x6bb /* offset 4729 */ , 
+  0x6c1 /* offset 4730 */ , 
+  0x6be /* offset 4731 */ , 
+  0x6d2 /* offset 4732 */ , 
+  0x6ad /* offset 4733 */ , 
+  0x6c7 /* offset 4734 */ , 
+  0x6c6 /* offset 4735 */ , 
+  0x6c8 /* offset 4736 */ , 
+  0x6cb /* offset 4737 */ , 
+  0x6c5 /* offset 4738 */ , 
+  0x6c9 /* offset 4739 */ , 
+  0x6d0 /* offset 4740 */ , 
+  0x649 /* offset 4741 */ , 
+  0x64a, 0x654, 0x627 /* offset 4742 */ , 
+  0x64a, 0x654, 0x6d5 /* offset 4745 */ , 
+  0x64a, 0x654, 0x648 /* offset 4748 */ , 
+  0x64a, 0x654, 0x6c7 /* offset 4751 */ , 
+  0x64a, 0x654, 0x6c6 /* offset 4754 */ , 
+  0x64a, 0x654, 0x6c8 /* offset 4757 */ , 
+  0x64a, 0x654, 0x6d0 /* offset 4760 */ , 
+  0x64a, 0x654, 0x649 /* offset 4763 */ , 
+  0x6cc /* offset 4766 */ , 
+  0x64a, 0x654, 0x62c /* offset 4767 */ , 
+  0x64a, 0x654, 0x62d /* offset 4770 */ , 
+  0x64a, 0x654, 0x645 /* offset 4773 */ , 
+  0x64a, 0x654, 0x64a /* offset 4776 */ , 
+  0x628, 0x62c /* offset 4779 */ , 
+  0x628, 0x62d /* offset 4781 */ , 
+  0x628, 0x62e /* offset 4783 */ , 
+  0x628, 0x645 /* offset 4785 */ , 
+  0x628, 0x649 /* offset 4787 */ , 
+  0x628, 0x64a /* offset 4789 */ , 
+  0x62a, 0x62c /* offset 4791 */ , 
+  0x62a, 0x62d /* offset 4793 */ , 
+  0x62a, 0x62e /* offset 4795 */ , 
+  0x62a, 0x645 /* offset 4797 */ , 
+  0x62a, 0x649 /* offset 4799 */ , 
+  0x62a, 0x64a /* offset 4801 */ , 
+  0x62b, 0x62c /* offset 4803 */ , 
+  0x62b, 0x645 /* offset 4805 */ , 
+  0x62b, 0x649 /* offset 4807 */ , 
+  0x62b, 0x64a /* offset 4809 */ , 
+  0x62c, 0x62d /* offset 4811 */ , 
+  0x62c, 0x645 /* offset 4813 */ , 
+  0x62d, 0x62c /* offset 4815 */ , 
+  0x62d, 0x645 /* offset 4817 */ , 
+  0x62e, 0x62c /* offset 4819 */ , 
+  0x62e, 0x62d /* offset 4821 */ , 
+  0x62e, 0x645 /* offset 4823 */ , 
+  0x633, 0x62c /* offset 4825 */ , 
+  0x633, 0x62d /* offset 4827 */ , 
+  0x633, 0x62e /* offset 4829 */ , 
+  0x633, 0x645 /* offset 4831 */ , 
+  0x635, 0x62d /* offset 4833 */ , 
+  0x635, 0x645 /* offset 4835 */ , 
+  0x636, 0x62c /* offset 4837 */ , 
+  0x636, 0x62d /* offset 4839 */ , 
+  0x636, 0x62e /* offset 4841 */ , 
+  0x636, 0x645 /* offset 4843 */ , 
+  0x637, 0x62d /* offset 4845 */ , 
+  0x637, 0x645 /* offset 4847 */ , 
+  0x638, 0x645 /* offset 4849 */ , 
+  0x639, 0x62c /* offset 4851 */ , 
+  0x639, 0x645 /* offset 4853 */ , 
+  0x63a, 0x62c /* offset 4855 */ , 
+  0x63a, 0x645 /* offset 4857 */ , 
+  0x641, 0x62c /* offset 4859 */ , 
+  0x641, 0x62d /* offset 4861 */ , 
+  0x641, 0x62e /* offset 4863 */ , 
+  0x641, 0x645 /* offset 4865 */ , 
+  0x641, 0x649 /* offset 4867 */ , 
+  0x641, 0x64a /* offset 4869 */ , 
+  0x642, 0x62d /* offset 4871 */ , 
+  0x642, 0x645 /* offset 4873 */ , 
+  0x642, 0x649 /* offset 4875 */ , 
+  0x642, 0x64a /* offset 4877 */ , 
+  0x643, 0x627 /* offset 4879 */ , 
+  0x643, 0x62c /* offset 4881 */ , 
+  0x643, 0x62d /* offset 4883 */ , 
+  0x643, 0x62e /* offset 4885 */ , 
+  0x643, 0x644 /* offset 4887 */ , 
+  0x643, 0x645 /* offset 4889 */ , 
+  0x643, 0x649 /* offset 4891 */ , 
+  0x643, 0x64a /* offset 4893 */ , 
+  0x644, 0x62c /* offset 4895 */ , 
+  0x644, 0x62d /* offset 4897 */ , 
+  0x644, 0x62e /* offset 4899 */ , 
+  0x644, 0x645 /* offset 4901 */ , 
+  0x644, 0x649 /* offset 4903 */ , 
+  0x644, 0x64a /* offset 4905 */ , 
+  0x645, 0x62c /* offset 4907 */ , 
+  0x645, 0x62d /* offset 4909 */ , 
+  0x645, 0x62e /* offset 4911 */ , 
+  0x645, 0x645 /* offset 4913 */ , 
+  0x645, 0x649 /* offset 4915 */ , 
+  0x645, 0x64a /* offset 4917 */ , 
+  0x646, 0x62c /* offset 4919 */ , 
+  0x646, 0x62d /* offset 4921 */ , 
+  0x646, 0x62e /* offset 4923 */ , 
+  0x646, 0x645 /* offset 4925 */ , 
+  0x646, 0x649 /* offset 4927 */ , 
+  0x646, 0x64a /* offset 4929 */ , 
+  0x647, 0x62c /* offset 4931 */ , 
+  0x647, 0x645 /* offset 4933 */ , 
+  0x647, 0x649 /* offset 4935 */ , 
+  0x647, 0x64a /* offset 4937 */ , 
+  0x64a, 0x62c /* offset 4939 */ , 
+  0x64a, 0x62d /* offset 4941 */ , 
+  0x64a, 0x62e /* offset 4943 */ , 
+  0x64a, 0x645 /* offset 4945 */ , 
+  0x64a, 0x649 /* offset 4947 */ , 
+  0x64a, 0x64a /* offset 4949 */ , 
+  0x630, 0x670 /* offset 4951 */ , 
+  0x631, 0x670 /* offset 4953 */ , 
+  0x649, 0x670 /* offset 4955 */ , 
+  0x20, 0x64c, 0x651 /* offset 4957 */ , 
+  0x20, 0x64d, 0x651 /* offset 4960 */ , 
+  0x20, 0x64e, 0x651 /* offset 4963 */ , 
+  0x20, 0x64f, 0x651 /* offset 4966 */ , 
+  0x20, 0x650, 0x651 /* offset 4969 */ , 
+  0x20, 0x651, 0x670 /* offset 4972 */ , 
+  0x64a, 0x654, 0x631 /* offset 4975 */ , 
+  0x64a, 0x654, 0x632 /* offset 4978 */ , 
+  0x64a, 0x654, 0x646 /* offset 4981 */ , 
+  0x628, 0x631 /* offset 4984 */ , 
+  0x628, 0x632 /* offset 4986 */ , 
+  0x628, 0x646 /* offset 4988 */ , 
+  0x62a, 0x631 /* offset 4990 */ , 
+  0x62a, 0x632 /* offset 4992 */ , 
+  0x62a, 0x646 /* offset 4994 */ , 
+  0x62b, 0x631 /* offset 4996 */ , 
+  0x62b, 0x632 /* offset 4998 */ , 
+  0x62b, 0x646 /* offset 5000 */ , 
+  0x645, 0x627 /* offset 5002 */ , 
+  0x646, 0x631 /* offset 5004 */ , 
+  0x646, 0x632 /* offset 5006 */ , 
+  0x646, 0x646 /* offset 5008 */ , 
+  0x64a, 0x631 /* offset 5010 */ , 
+  0x64a, 0x632 /* offset 5012 */ , 
+  0x64a, 0x646 /* offset 5014 */ , 
+  0x64a, 0x654, 0x62e /* offset 5016 */ , 
+  0x64a, 0x654, 0x647 /* offset 5019 */ , 
+  0x628, 0x647 /* offset 5022 */ , 
+  0x62a, 0x647 /* offset 5024 */ , 
+  0x635, 0x62e /* offset 5026 */ , 
+  0x644, 0x647 /* offset 5028 */ , 
+  0x646, 0x647 /* offset 5030 */ , 
+  0x647, 0x670 /* offset 5032 */ , 
+  0x64a, 0x647 /* offset 5034 */ , 
+  0x62b, 0x647 /* offset 5036 */ , 
+  0x633, 0x647 /* offset 5038 */ , 
+  0x634, 0x645 /* offset 5040 */ , 
+  0x634, 0x647 /* offset 5042 */ , 
+  0x640, 0x64e, 0x651 /* offset 5044 */ , 
+  0x640, 0x64f, 0x651 /* offset 5047 */ , 
+  0x640, 0x650, 0x651 /* offset 5050 */ , 
+  0x637, 0x649 /* offset 5053 */ , 
+  0x637, 0x64a /* offset 5055 */ , 
+  0x639, 0x649 /* offset 5057 */ , 
+  0x639, 0x64a /* offset 5059 */ , 
+  0x63a, 0x649 /* offset 5061 */ , 
+  0x63a, 0x64a /* offset 5063 */ , 
+  0x633, 0x649 /* offset 5065 */ , 
+  0x633, 0x64a /* offset 5067 */ , 
+  0x634, 0x649 /* offset 5069 */ , 
+  0x634, 0x64a /* offset 5071 */ , 
+  0x62d, 0x649 /* offset 5073 */ , 
+  0x62d, 0x64a /* offset 5075 */ , 
+  0x62c, 0x649 /* offset 5077 */ , 
+  0x62c, 0x64a /* offset 5079 */ , 
+  0x62e, 0x649 /* offset 5081 */ , 
+  0x62e, 0x64a /* offset 5083 */ , 
+  0x635, 0x649 /* offset 5085 */ , 
+  0x635, 0x64a /* offset 5087 */ , 
+  0x636, 0x649 /* offset 5089 */ , 
+  0x636, 0x64a /* offset 5091 */ , 
+  0x634, 0x62c /* offset 5093 */ , 
+  0x634, 0x62d /* offset 5095 */ , 
+  0x634, 0x62e /* offset 5097 */ , 
+  0x634, 0x631 /* offset 5099 */ , 
+  0x633, 0x631 /* offset 5101 */ , 
+  0x635, 0x631 /* offset 5103 */ , 
+  0x636, 0x631 /* offset 5105 */ , 
+  0x627, 0x64b /* offset 5107 */ , 
+  0x62a, 0x62c, 0x645 /* offset 5109 */ , 
+  0x62a, 0x62d, 0x62c /* offset 5112 */ , 
+  0x62a, 0x62d, 0x645 /* offset 5115 */ , 
+  0x62a, 0x62e, 0x645 /* offset 5118 */ , 
+  0x62a, 0x645, 0x62c /* offset 5121 */ , 
+  0x62a, 0x645, 0x62d /* offset 5124 */ , 
+  0x62a, 0x645, 0x62e /* offset 5127 */ , 
+  0x62c, 0x645, 0x62d /* offset 5130 */ , 
+  0x62d, 0x645, 0x64a /* offset 5133 */ , 
+  0x62d, 0x645, 0x649 /* offset 5136 */ , 
+  0x633, 0x62d, 0x62c /* offset 5139 */ , 
+  0x633, 0x62c, 0x62d /* offset 5142 */ , 
+  0x633, 0x62c, 0x649 /* offset 5145 */ , 
+  0x633, 0x645, 0x62d /* offset 5148 */ , 
+  0x633, 0x645, 0x62c /* offset 5151 */ , 
+  0x633, 0x645, 0x645 /* offset 5154 */ , 
+  0x635, 0x62d, 0x62d /* offset 5157 */ , 
+  0x635, 0x645, 0x645 /* offset 5160 */ , 
+  0x634, 0x62d, 0x645 /* offset 5163 */ , 
+  0x634, 0x62c, 0x64a /* offset 5166 */ , 
+  0x634, 0x645, 0x62e /* offset 5169 */ , 
+  0x634, 0x645, 0x645 /* offset 5172 */ , 
+  0x636, 0x62d, 0x649 /* offset 5175 */ , 
+  0x636, 0x62e, 0x645 /* offset 5178 */ , 
+  0x637, 0x645, 0x62d /* offset 5181 */ , 
+  0x637, 0x645, 0x645 /* offset 5184 */ , 
+  0x637, 0x645, 0x64a /* offset 5187 */ , 
+  0x639, 0x62c, 0x645 /* offset 5190 */ , 
+  0x639, 0x645, 0x645 /* offset 5193 */ , 
+  0x639, 0x645, 0x649 /* offset 5196 */ , 
+  0x63a, 0x645, 0x645 /* offset 5199 */ , 
+  0x63a, 0x645, 0x64a /* offset 5202 */ , 
+  0x63a, 0x645, 0x649 /* offset 5205 */ , 
+  0x641, 0x62e, 0x645 /* offset 5208 */ , 
+  0x642, 0x645, 0x62d /* offset 5211 */ , 
+  0x642, 0x645, 0x645 /* offset 5214 */ , 
+  0x644, 0x62d, 0x645 /* offset 5217 */ , 
+  0x644, 0x62d, 0x64a /* offset 5220 */ , 
+  0x644, 0x62d, 0x649 /* offset 5223 */ , 
+  0x644, 0x62c, 0x62c /* offset 5226 */ , 
+  0x644, 0x62e, 0x645 /* offset 5229 */ , 
+  0x644, 0x645, 0x62d /* offset 5232 */ , 
+  0x645, 0x62d, 0x62c /* offset 5235 */ , 
+  0x645, 0x62d, 0x645 /* offset 5238 */ , 
+  0x645, 0x62d, 0x64a /* offset 5241 */ , 
+  0x645, 0x62c, 0x62d /* offset 5244 */ , 
+  0x645, 0x62c, 0x645 /* offset 5247 */ , 
+  0x645, 0x62e, 0x62c /* offset 5250 */ , 
+  0x645, 0x62e, 0x645 /* offset 5253 */ , 
+  0x645, 0x62c, 0x62e /* offset 5256 */ , 
+  0x647, 0x645, 0x62c /* offset 5259 */ , 
+  0x647, 0x645, 0x645 /* offset 5262 */ , 
+  0x646, 0x62d, 0x645 /* offset 5265 */ , 
+  0x646, 0x62d, 0x649 /* offset 5268 */ , 
+  0x646, 0x62c, 0x645 /* offset 5271 */ , 
+  0x646, 0x62c, 0x649 /* offset 5274 */ , 
+  0x646, 0x645, 0x64a /* offset 5277 */ , 
+  0x646, 0x645, 0x649 /* offset 5280 */ , 
+  0x64a, 0x645, 0x645 /* offset 5283 */ , 
+  0x628, 0x62e, 0x64a /* offset 5286 */ , 
+  0x62a, 0x62c, 0x64a /* offset 5289 */ , 
+  0x62a, 0x62c, 0x649 /* offset 5292 */ , 
+  0x62a, 0x62e, 0x64a /* offset 5295 */ , 
+  0x62a, 0x62e, 0x649 /* offset 5298 */ , 
+  0x62a, 0x645, 0x64a /* offset 5301 */ , 
+  0x62a, 0x645, 0x649 /* offset 5304 */ , 
+  0x62c, 0x645, 0x64a /* offset 5307 */ , 
+  0x62c, 0x62d, 0x649 /* offset 5310 */ , 
+  0x62c, 0x645, 0x649 /* offset 5313 */ , 
+  0x633, 0x62e, 0x649 /* offset 5316 */ , 
+  0x635, 0x62d, 0x64a /* offset 5319 */ , 
+  0x634, 0x62d, 0x64a /* offset 5322 */ , 
+  0x636, 0x62d, 0x64a /* offset 5325 */ , 
+  0x644, 0x62c, 0x64a /* offset 5328 */ , 
+  0x644, 0x645, 0x64a /* offset 5331 */ , 
+  0x64a, 0x62d, 0x64a /* offset 5334 */ , 
+  0x64a, 0x62c, 0x64a /* offset 5337 */ , 
+  0x64a, 0x645, 0x64a /* offset 5340 */ , 
+  0x645, 0x645, 0x64a /* offset 5343 */ , 
+  0x642, 0x645, 0x64a /* offset 5346 */ , 
+  0x646, 0x62d, 0x64a /* offset 5349 */ , 
+  0x639, 0x645, 0x64a /* offset 5352 */ , 
+  0x643, 0x645, 0x64a /* offset 5355 */ , 
+  0x646, 0x62c, 0x62d /* offset 5358 */ , 
+  0x645, 0x62e, 0x64a /* offset 5361 */ , 
+  0x644, 0x62c, 0x645 /* offset 5364 */ , 
+  0x643, 0x645, 0x645 /* offset 5367 */ , 
+  0x62c, 0x62d, 0x64a /* offset 5370 */ , 
+  0x62d, 0x62c, 0x64a /* offset 5373 */ , 
+  0x645, 0x62c, 0x64a /* offset 5376 */ , 
+  0x641, 0x645, 0x64a /* offset 5379 */ , 
+  0x628, 0x62d, 0x64a /* offset 5382 */ , 
+  0x633, 0x62e, 0x64a /* offset 5385 */ , 
+  0x646, 0x62c, 0x64a /* offset 5388 */ , 
+  0x635, 0x644, 0x6d2 /* offset 5391 */ , 
+  0x642, 0x644, 0x6d2 /* offset 5394 */ , 
+  0x627, 0x644, 0x644, 0x647 /* offset 5397 */ , 
+  0x627, 0x643, 0x628, 0x631 /* offset 5401 */ , 
+  0x645, 0x62d, 0x645, 0x62f /* offset 5405 */ , 
+  0x635, 0x644, 0x639, 0x645 /* offset 5409 */ , 
+  0x631, 0x633, 0x648, 0x644 /* offset 5413 */ , 
+  0x639, 0x644, 0x64a, 0x647 /* offset 5417 */ , 
+  0x648, 0x633, 0x644, 0x645 /* offset 5421 */ , 
+  0x635, 0x644, 0x649 /* offset 5425 */ , 
+  0x635, 0x644, 0x649, 0x20, 0x627, 0x644, 0x644, 0x647, 0x20, 0x639, 0x644, 0x64a, 0x647, 0x20, 0x648, 0x633, 0x644, 0x645 /* offset 5428 */ , 
+  0x62c, 0x644, 0x20, 0x62c, 0x644, 0x627, 0x644, 0x647 /* offset 5446 */ , 
+  0x631, 0x6cc, 0x627, 0x644 /* offset 5454 */ , 
+  0x2014 /* offset 5458 */ , 
+  0x2013 /* offset 5459 */ , 
+  0x5f /* offset 5460 */ , 
+  0x7b /* offset 5461 */ , 
+  0x7d /* offset 5462 */ , 
+  0x3014 /* offset 5463 */ , 
+  0x3015 /* offset 5464 */ , 
+  0x3010 /* offset 5465 */ , 
+  0x3011 /* offset 5466 */ , 
+  0x300a /* offset 5467 */ , 
+  0x300b /* offset 5468 */ , 
+  0x300c /* offset 5469 */ , 
+  0x300d /* offset 5470 */ , 
+  0x300e /* offset 5471 */ , 
+  0x300f /* offset 5472 */ , 
+  0x2c /* offset 5473 */ , 
+  0x3001 /* offset 5474 */ , 
+  0x3a /* offset 5475 */ , 
+  0x3f /* offset 5476 */ , 
+  0x21 /* offset 5477 */ , 
+  0x23 /* offset 5478 */ , 
+  0x26 /* offset 5479 */ , 
+  0x2a /* offset 5480 */ , 
+  0x2d /* offset 5481 */ , 
+  0x3c /* offset 5482 */ , 
+  0x3e /* offset 5483 */ , 
+  0x5c /* offset 5484 */ , 
+  0x24 /* offset 5485 */ , 
+  0x25 /* offset 5486 */ , 
+  0x40 /* offset 5487 */ , 
+  0x20, 0x64b /* offset 5488 */ , 
+  0x640, 0x64b /* offset 5490 */ , 
+  0x20, 0x64c /* offset 5492 */ , 
+  0x20, 0x64d /* offset 5494 */ , 
+  0x20, 0x64e /* offset 5496 */ , 
+  0x640, 0x64e /* offset 5498 */ , 
+  0x20, 0x64f /* offset 5500 */ , 
+  0x640, 0x64f /* offset 5502 */ , 
+  0x20, 0x650 /* offset 5504 */ , 
+  0x640, 0x650 /* offset 5506 */ , 
+  0x20, 0x651 /* offset 5508 */ , 
+  0x640, 0x651 /* offset 5510 */ , 
+  0x20, 0x652 /* offset 5512 */ , 
+  0x640, 0x652 /* offset 5514 */ , 
+  0x621 /* offset 5516 */ , 
+  0x627 /* offset 5517 */ , 
+  0x628 /* offset 5518 */ , 
+  0x629 /* offset 5519 */ , 
+  0x62a /* offset 5520 */ , 
+  0x62b /* offset 5521 */ , 
+  0x62c /* offset 5522 */ , 
+  0x62d /* offset 5523 */ , 
+  0x62e /* offset 5524 */ , 
+  0x62f /* offset 5525 */ , 
+  0x630 /* offset 5526 */ , 
+  0x631 /* offset 5527 */ , 
+  0x632 /* offset 5528 */ , 
+  0x633 /* offset 5529 */ , 
+  0x634 /* offset 5530 */ , 
+  0x635 /* offset 5531 */ , 
+  0x636 /* offset 5532 */ , 
+  0x637 /* offset 5533 */ , 
+  0x638 /* offset 5534 */ , 
+  0x639 /* offset 5535 */ , 
+  0x63a /* offset 5536 */ , 
+  0x641 /* offset 5537 */ , 
+  0x642 /* offset 5538 */ , 
+  0x643 /* offset 5539 */ , 
+  0x644 /* offset 5540 */ , 
+  0x645 /* offset 5541 */ , 
+  0x646 /* offset 5542 */ , 
+  0x647 /* offset 5543 */ , 
+  0x648 /* offset 5544 */ , 
+  0x64a /* offset 5545 */ , 
+  0x644, 0x627, 0x653 /* offset 5546 */ , 
+  0x644, 0x627, 0x654 /* offset 5549 */ , 
+  0x644, 0x627, 0x655 /* offset 5552 */ , 
+  0x644, 0x627 /* offset 5555 */ , 
+  0x22 /* offset 5557 */ , 
+  0x27 /* offset 5558 */ , 
+  0x2f /* offset 5559 */ , 
+  0x5b /* offset 5560 */ , 
+  0x5d /* offset 5561 */ , 
+  0x5e /* offset 5562 */ , 
+  0x7c /* offset 5563 */ , 
+  0x7e /* offset 5564 */ , 
+  0x2985 /* offset 5565 */ , 
+  0x2986 /* offset 5566 */ , 
+  0x3002 /* offset 5567 */ , 
+  0x30fb /* offset 5568 */ , 
+  0x30a1 /* offset 5569 */ , 
+  0x30a3 /* offset 5570 */ , 
+  0x30a5 /* offset 5571 */ , 
+  0x30a7 /* offset 5572 */ , 
+  0x30a9 /* offset 5573 */ , 
+  0x30e3 /* offset 5574 */ , 
+  0x30e5 /* offset 5575 */ , 
+  0x30e7 /* offset 5576 */ , 
+  0x30c3 /* offset 5577 */ , 
+  0x30fc /* offset 5578 */ , 
+  0x30f3 /* offset 5579 */ , 
+  0x3099 /* offset 5580 */ , 
+  0x309a /* offset 5581 */ , 
+  0xa2 /* offset 5582 */ , 
+  0xa3 /* offset 5583 */ , 
+  0xac /* offset 5584 */ , 
+  0xa6 /* offset 5585 */ , 
+  0xa5 /* offset 5586 */ , 
+  0x20a9 /* offset 5587 */ , 
+  0x2502 /* offset 5588 */ , 
+  0x2190 /* offset 5589 */ , 
+  0x2191 /* offset 5590 */ , 
+  0x2192 /* offset 5591 */ , 
+  0x2193 /* offset 5592 */ , 
+  0x25a0 /* offset 5593 */ , 
+  0x25cb /* offset 5594 */ , 
+  0x1d157, 0x1d165 /* offset 5595 */ , 
+  0x1d158, 0x1d165 /* offset 5597 */ , 
+  0x1d158, 0x1d165, 0x1d16e /* offset 5599 */ , 
+  0x1d158, 0x1d165, 0x1d16f /* offset 5602 */ , 
+  0x1d158, 0x1d165, 0x1d170 /* offset 5605 */ , 
+  0x1d158, 0x1d165, 0x1d171 /* offset 5608 */ , 
+  0x1d158, 0x1d165, 0x1d172 /* offset 5611 */ , 
+  0x1d1b9, 0x1d165 /* offset 5614 */ , 
+  0x1d1ba, 0x1d165 /* offset 5616 */ , 
+  0x1d1b9, 0x1d165, 0x1d16e /* offset 5618 */ , 
+  0x1d1ba, 0x1d165, 0x1d16e /* offset 5621 */ , 
+  0x1d1b9, 0x1d165, 0x1d16f /* offset 5624 */ , 
+  0x1d1ba, 0x1d165, 0x1d16f /* offset 5627 */ , 
+  0x391 /* offset 5630 */ , 
+  0x392 /* offset 5631 */ , 
+  0x394 /* offset 5632 */ , 
+  0x395 /* offset 5633 */ , 
+  0x396 /* offset 5634 */ , 
+  0x397 /* offset 5635 */ , 
+  0x399 /* offset 5636 */ , 
+  0x39a /* offset 5637 */ , 
+  0x39b /* offset 5638 */ , 
+  0x39c /* offset 5639 */ , 
+  0x39d /* offset 5640 */ , 
+  0x39e /* offset 5641 */ , 
+  0x39f /* offset 5642 */ , 
+  0x3a1 /* offset 5643 */ , 
+  0x3a3 /* offset 5644 */ , 
+  0x3a4 /* offset 5645 */ , 
+  0x3a6 /* offset 5646 */ , 
+  0x3a7 /* offset 5647 */ , 
+  0x3a8 /* offset 5648 */ , 
+  0x2207 /* offset 5649 */ , 
+  0x3b1 /* offset 5650 */ , 
+  0x3b4 /* offset 5651 */ , 
+  0x3b6 /* offset 5652 */ , 
+  0x3b7 /* offset 5653 */ , 
+  0x3bb /* offset 5654 */ , 
+  0x3bd /* offset 5655 */ , 
+  0x3be /* offset 5656 */ , 
+  0x3bf /* offset 5657 */ , 
+  0x3c3 /* offset 5658 */ , 
+  0x3c4 /* offset 5659 */ , 
+  0x3c5 /* offset 5660 */ , 
+  0x3c7 /* offset 5661 */ , 
+  0x3c8 /* offset 5662 */ , 
+  0x3c9 /* offset 5663 */ , 
+  0x2202 /* offset 5664 */ , 
+  0x4e3d /* offset 5665 */ , 
+  0x4e38 /* offset 5666 */ , 
+  0x4e41 /* offset 5667 */ , 
+  0x20122 /* offset 5668 */ , 
+  0x4f60 /* offset 5669 */ , 
+  0x4fbb /* offset 5670 */ , 
+  0x5002 /* offset 5671 */ , 
+  0x507a /* offset 5672 */ , 
+  0x5099 /* offset 5673 */ , 
+  0x50cf /* offset 5674 */ , 
+  0x349e /* offset 5675 */ , 
+  0x2063a /* offset 5676 */ , 
+  0x5154 /* offset 5677 */ , 
+  0x5164 /* offset 5678 */ , 
+  0x5177 /* offset 5679 */ , 
+  0x2051c /* offset 5680 */ , 
+  0x34b9 /* offset 5681 */ , 
+  0x5167 /* offset 5682 */ , 
+  0x518d /* offset 5683 */ , 
+  0x2054b /* offset 5684 */ , 
+  0x5197 /* offset 5685 */ , 
+  0x51a4 /* offset 5686 */ , 
+  0x4ecc /* offset 5687 */ , 
+  0x51ac /* offset 5688 */ , 
+  0x51b5 /* offset 5689 */ , 
+  0x291df /* offset 5690 */ , 
+  0x5203 /* offset 5691 */ , 
+  0x34df /* offset 5692 */ , 
+  0x523b /* offset 5693 */ , 
+  0x5246 /* offset 5694 */ , 
+  0x5272 /* offset 5695 */ , 
+  0x5277 /* offset 5696 */ , 
+  0x3515 /* offset 5697 */ , 
+  0x52c7 /* offset 5698 */ , 
+  0x52fa /* offset 5699 */ , 
+  0x5305 /* offset 5700 */ , 
+  0x5306 /* offset 5701 */ , 
+  0x5349 /* offset 5702 */ , 
+  0x535a /* offset 5703 */ , 
+  0x5373 /* offset 5704 */ , 
+  0x537d /* offset 5705 */ , 
+  0x537f /* offset 5706 */ , 
+  0x20a2c /* offset 5707 */ , 
+  0x7070 /* offset 5708 */ , 
+  0x53ca /* offset 5709 */ , 
+  0x53df /* offset 5710 */ , 
+  0x20b63 /* offset 5711 */ , 
+  0x53eb /* offset 5712 */ , 
+  0x53f1 /* offset 5713 */ , 
+  0x5406 /* offset 5714 */ , 
+  0x549e /* offset 5715 */ , 
+  0x5438 /* offset 5716 */ , 
+  0x5448 /* offset 5717 */ , 
+  0x5468 /* offset 5718 */ , 
+  0x54a2 /* offset 5719 */ , 
+  0x54f6 /* offset 5720 */ , 
+  0x5510 /* offset 5721 */ , 
+  0x5553 /* offset 5722 */ , 
+  0x5563 /* offset 5723 */ , 
+  0x5584 /* offset 5724 */ , 
+  0x5599 /* offset 5725 */ , 
+  0x55ab /* offset 5726 */ , 
+  0x55b3 /* offset 5727 */ , 
+  0x55c2 /* offset 5728 */ , 
+  0x5716 /* offset 5729 */ , 
+  0x5717 /* offset 5730 */ , 
+  0x5651 /* offset 5731 */ , 
+  0x5674 /* offset 5732 */ , 
+  0x58ee /* offset 5733 */ , 
+  0x57ce /* offset 5734 */ , 
+  0x57f4 /* offset 5735 */ , 
+  0x580d /* offset 5736 */ , 
+  0x578b /* offset 5737 */ , 
+  0x5832 /* offset 5738 */ , 
+  0x5831 /* offset 5739 */ , 
+  0x58ac /* offset 5740 */ , 
+  0x214e4 /* offset 5741 */ , 
+  0x58f2 /* offset 5742 */ , 
+  0x58f7 /* offset 5743 */ , 
+  0x5906 /* offset 5744 */ , 
+  0x591a /* offset 5745 */ , 
+  0x5922 /* offset 5746 */ , 
+  0x5962 /* offset 5747 */ , 
+  0x216a8 /* offset 5748 */ , 
+  0x216ea /* offset 5749 */ , 
+  0x59ec /* offset 5750 */ , 
+  0x5a1b /* offset 5751 */ , 
+  0x5a27 /* offset 5752 */ , 
+  0x59d8 /* offset 5753 */ , 
+  0x5a66 /* offset 5754 */ , 
+  0x36ee /* offset 5755 */ , 
+  0x2136a /* offset 5756 */ , 
+  0x5b08 /* offset 5757 */ , 
+  0x5b3e /* offset 5758 */ , 
+  0x219c8 /* offset 5759 */ , 
+  0x5bc3 /* offset 5760 */ , 
+  0x5bd8 /* offset 5761 */ , 
+  0x5bf3 /* offset 5762 */ , 
+  0x21b18 /* offset 5763 */ , 
+  0x5bff /* offset 5764 */ , 
+  0x5c06 /* offset 5765 */ , 
+  0x5f33 /* offset 5766 */ , 
+  0x3781 /* offset 5767 */ , 
+  0x5c60 /* offset 5768 */ , 
+  0x5cc0 /* offset 5769 */ , 
+  0x5c8d /* offset 5770 */ , 
+  0x21de4 /* offset 5771 */ , 
+  0x5d43 /* offset 5772 */ , 
+  0x21de6 /* offset 5773 */ , 
+  0x5d6e /* offset 5774 */ , 
+  0x5d6b /* offset 5775 */ , 
+  0x5d7c /* offset 5776 */ , 
+  0x5de1 /* offset 5777 */ , 
+  0x5de2 /* offset 5778 */ , 
+  0x382f /* offset 5779 */ , 
+  0x5dfd /* offset 5780 */ , 
+  0x5e28 /* offset 5781 */ , 
+  0x5e3d /* offset 5782 */ , 
+  0x5e69 /* offset 5783 */ , 
+  0x3862 /* offset 5784 */ , 
+  0x22183 /* offset 5785 */ , 
+  0x387c /* offset 5786 */ , 
+  0x5eb0 /* offset 5787 */ , 
+  0x5eb3 /* offset 5788 */ , 
+  0x5eb6 /* offset 5789 */ , 
+  0x2a392 /* offset 5790 */ , 
+  0x22331 /* offset 5791 */ , 
+  0x8201 /* offset 5792 */ , 
+  0x5f22 /* offset 5793 */ , 
+  0x38c7 /* offset 5794 */ , 
+  0x232b8 /* offset 5795 */ , 
+  0x261da /* offset 5796 */ , 
+  0x5f62 /* offset 5797 */ , 
+  0x5f6b /* offset 5798 */ , 
+  0x38e3 /* offset 5799 */ , 
+  0x5f9a /* offset 5800 */ , 
+  0x5fcd /* offset 5801 */ , 
+  0x5fd7 /* offset 5802 */ , 
+  0x5ff9 /* offset 5803 */ , 
+  0x6081 /* offset 5804 */ , 
+  0x393a /* offset 5805 */ , 
+  0x391c /* offset 5806 */ , 
+  0x226d4 /* offset 5807 */ , 
+  0x60c7 /* offset 5808 */ , 
+  0x6148 /* offset 5809 */ , 
+  0x614c /* offset 5810 */ , 
+  0x614e /* offset 5811 */ , 
+  0x617a /* offset 5812 */ , 
+  0x61b2 /* offset 5813 */ , 
+  0x61a4 /* offset 5814 */ , 
+  0x61af /* offset 5815 */ , 
+  0x61de /* offset 5816 */ , 
+  0x6210 /* offset 5817 */ , 
+  0x621b /* offset 5818 */ , 
+  0x625d /* offset 5819 */ , 
+  0x62b1 /* offset 5820 */ , 
+  0x62d4 /* offset 5821 */ , 
+  0x6350 /* offset 5822 */ , 
+  0x22b0c /* offset 5823 */ , 
+  0x633d /* offset 5824 */ , 
+  0x62fc /* offset 5825 */ , 
+  0x6368 /* offset 5826 */ , 
+  0x6383 /* offset 5827 */ , 
+  0x63e4 /* offset 5828 */ , 
+  0x22bf1 /* offset 5829 */ , 
+  0x6422 /* offset 5830 */ , 
+  0x63c5 /* offset 5831 */ , 
+  0x63a9 /* offset 5832 */ , 
+  0x3a2e /* offset 5833 */ , 
+  0x6469 /* offset 5834 */ , 
+  0x647e /* offset 5835 */ , 
+  0x649d /* offset 5836 */ , 
+  0x6477 /* offset 5837 */ , 
+  0x3a6c /* offset 5838 */ , 
+  0x656c /* offset 5839 */ , 
+  0x2300a /* offset 5840 */ , 
+  0x65e3 /* offset 5841 */ , 
+  0x66f8 /* offset 5842 */ , 
+  0x6649 /* offset 5843 */ , 
+  0x3b19 /* offset 5844 */ , 
+  0x3b08 /* offset 5845 */ , 
+  0x3ae4 /* offset 5846 */ , 
+  0x5192 /* offset 5847 */ , 
+  0x5195 /* offset 5848 */ , 
+  0x6700 /* offset 5849 */ , 
+  0x669c /* offset 5850 */ , 
+  0x80ad /* offset 5851 */ , 
+  0x43d9 /* offset 5852 */ , 
+  0x671b /* offset 5853 */ , 
+  0x6721 /* offset 5854 */ , 
+  0x675e /* offset 5855 */ , 
+  0x6753 /* offset 5856 */ , 
+  0x233c3 /* offset 5857 */ , 
+  0x3b49 /* offset 5858 */ , 
+  0x67fa /* offset 5859 */ , 
+  0x6785 /* offset 5860 */ , 
+  0x6852 /* offset 5861 */ , 
+  0x2346d /* offset 5862 */ , 
+  0x688e /* offset 5863 */ , 
+  0x681f /* offset 5864 */ , 
+  0x6914 /* offset 5865 */ , 
+  0x3b9d /* offset 5866 */ , 
+  0x6942 /* offset 5867 */ , 
+  0x69a3 /* offset 5868 */ , 
+  0x69ea /* offset 5869 */ , 
+  0x6aa8 /* offset 5870 */ , 
+  0x236a3 /* offset 5871 */ , 
+  0x6adb /* offset 5872 */ , 
+  0x3c18 /* offset 5873 */ , 
+  0x6b21 /* offset 5874 */ , 
+  0x238a7 /* offset 5875 */ , 
+  0x6b54 /* offset 5876 */ , 
+  0x3c4e /* offset 5877 */ , 
+  0x6b72 /* offset 5878 */ , 
+  0x6b9f /* offset 5879 */ , 
+  0x6bbb /* offset 5880 */ , 
+  0x23a8d /* offset 5881 */ , 
+  0x21d0b /* offset 5882 */ , 
+  0x23afa /* offset 5883 */ , 
+  0x6c4e /* offset 5884 */ , 
+  0x23cbc /* offset 5885 */ , 
+  0x6cbf /* offset 5886 */ , 
+  0x6ccd /* offset 5887 */ , 
+  0x6c67 /* offset 5888 */ , 
+  0x6d16 /* offset 5889 */ , 
+  0x6d3e /* offset 5890 */ , 
+  0x6d69 /* offset 5891 */ , 
+  0x6d78 /* offset 5892 */ , 
+  0x6d85 /* offset 5893 */ , 
+  0x23d1e /* offset 5894 */ , 
+  0x6d34 /* offset 5895 */ , 
+  0x6e2f /* offset 5896 */ , 
+  0x6e6e /* offset 5897 */ , 
+  0x3d33 /* offset 5898 */ , 
+  0x6ecb /* offset 5899 */ , 
+  0x6ec7 /* offset 5900 */ , 
+  0x23ed1 /* offset 5901 */ , 
+  0x6df9 /* offset 5902 */ , 
+  0x6f6e /* offset 5903 */ , 
+  0x23f5e /* offset 5904 */ , 
+  0x23f8e /* offset 5905 */ , 
+  0x6fc6 /* offset 5906 */ , 
+  0x7039 /* offset 5907 */ , 
+  0x701e /* offset 5908 */ , 
+  0x701b /* offset 5909 */ , 
+  0x3d96 /* offset 5910 */ , 
+  0x704a /* offset 5911 */ , 
+  0x707d /* offset 5912 */ , 
+  0x7077 /* offset 5913 */ , 
+  0x70ad /* offset 5914 */ , 
+  0x20525 /* offset 5915 */ , 
+  0x7145 /* offset 5916 */ , 
+  0x24263 /* offset 5917 */ , 
+  0x719c /* offset 5918 */ , 
+  0x43ab /* offset 5919 */ , 
+  0x7228 /* offset 5920 */ , 
+  0x7235 /* offset 5921 */ , 
+  0x7250 /* offset 5922 */ , 
+  0x24608 /* offset 5923 */ , 
+  0x7280 /* offset 5924 */ , 
+  0x7295 /* offset 5925 */ , 
+  0x24735 /* offset 5926 */ , 
+  0x24814 /* offset 5927 */ , 
+  0x737a /* offset 5928 */ , 
+  0x738b /* offset 5929 */ , 
+  0x3eac /* offset 5930 */ , 
+  0x73a5 /* offset 5931 */ , 
+  0x3eb8 /* offset 5932 */ , 
+  0x7447 /* offset 5933 */ , 
+  0x745c /* offset 5934 */ , 
+  0x7471 /* offset 5935 */ , 
+  0x7485 /* offset 5936 */ , 
+  0x74ca /* offset 5937 */ , 
+  0x3f1b /* offset 5938 */ , 
+  0x7524 /* offset 5939 */ , 
+  0x24c36 /* offset 5940 */ , 
+  0x753e /* offset 5941 */ , 
+  0x24c92 /* offset 5942 */ , 
+  0x2219f /* offset 5943 */ , 
+  0x7610 /* offset 5944 */ , 
+  0x24fa1 /* offset 5945 */ , 
+  0x24fb8 /* offset 5946 */ , 
+  0x25044 /* offset 5947 */ , 
+  0x3ffc /* offset 5948 */ , 
+  0x4008 /* offset 5949 */ , 
+  0x76f4 /* offset 5950 */ , 
+  0x250f3 /* offset 5951 */ , 
+  0x250f2 /* offset 5952 */ , 
+  0x25119 /* offset 5953 */ , 
+  0x25133 /* offset 5954 */ , 
+  0x771e /* offset 5955 */ , 
+  0x771f /* offset 5956 */ , 
+  0x774a /* offset 5957 */ , 
+  0x4039 /* offset 5958 */ , 
+  0x778b /* offset 5959 */ , 
+  0x4046 /* offset 5960 */ , 
+  0x4096 /* offset 5961 */ , 
+  0x2541d /* offset 5962 */ , 
+  0x784e /* offset 5963 */ , 
+  0x78cc /* offset 5964 */ , 
+  0x40e3 /* offset 5965 */ , 
+  0x25626 /* offset 5966 */ , 
+  0x2569a /* offset 5967 */ , 
+  0x256c5 /* offset 5968 */ , 
+  0x79eb /* offset 5969 */ , 
+  0x412f /* offset 5970 */ , 
+  0x7a4a /* offset 5971 */ , 
+  0x7a4f /* offset 5972 */ , 
+  0x2597c /* offset 5973 */ , 
+  0x25aa7 /* offset 5974 */ , 
+  0x7aae /* offset 5975 */ , 
+  0x4202 /* offset 5976 */ , 
+  0x25bab /* offset 5977 */ , 
+  0x7bc6 /* offset 5978 */ , 
+  0x7bc9 /* offset 5979 */ , 
+  0x4227 /* offset 5980 */ , 
+  0x25c80 /* offset 5981 */ , 
+  0x7cd2 /* offset 5982 */ , 
+  0x42a0 /* offset 5983 */ , 
+  0x7ce8 /* offset 5984 */ , 
+  0x7ce3 /* offset 5985 */ , 
+  0x7d00 /* offset 5986 */ , 
+  0x25f86 /* offset 5987 */ , 
+  0x7d63 /* offset 5988 */ , 
+  0x4301 /* offset 5989 */ , 
+  0x7dc7 /* offset 5990 */ , 
+  0x7e02 /* offset 5991 */ , 
+  0x7e45 /* offset 5992 */ , 
+  0x4334 /* offset 5993 */ , 
+  0x26228 /* offset 5994 */ , 
+  0x26247 /* offset 5995 */ , 
+  0x4359 /* offset 5996 */ , 
+  0x262d9 /* offset 5997 */ , 
+  0x7f7a /* offset 5998 */ , 
+  0x2633e /* offset 5999 */ , 
+  0x7f95 /* offset 6000 */ , 
+  0x7ffa /* offset 6001 */ , 
+  0x264da /* offset 6002 */ , 
+  0x26523 /* offset 6003 */ , 
+  0x8060 /* offset 6004 */ , 
+  0x265a8 /* offset 6005 */ , 
+  0x8070 /* offset 6006 */ , 
+  0x2335f /* offset 6007 */ , 
+  0x43d5 /* offset 6008 */ , 
+  0x80b2 /* offset 6009 */ , 
+  0x8103 /* offset 6010 */ , 
+  0x440b /* offset 6011 */ , 
+  0x813e /* offset 6012 */ , 
+  0x5ab5 /* offset 6013 */ , 
+  0x267a7 /* offset 6014 */ , 
+  0x267b5 /* offset 6015 */ , 
+  0x23393 /* offset 6016 */ , 
+  0x2339c /* offset 6017 */ , 
+  0x8204 /* offset 6018 */ , 
+  0x8f9e /* offset 6019 */ , 
+  0x446b /* offset 6020 */ , 
+  0x8291 /* offset 6021 */ , 
+  0x828b /* offset 6022 */ , 
+  0x829d /* offset 6023 */ , 
+  0x52b3 /* offset 6024 */ , 
+  0x82b1 /* offset 6025 */ , 
+  0x82b3 /* offset 6026 */ , 
+  0x82bd /* offset 6027 */ , 
+  0x82e6 /* offset 6028 */ , 
+  0x26b3c /* offset 6029 */ , 
+  0x831d /* offset 6030 */ , 
+  0x8363 /* offset 6031 */ , 
+  0x83ad /* offset 6032 */ , 
+  0x8323 /* offset 6033 */ , 
+  0x83bd /* offset 6034 */ , 
+  0x83e7 /* offset 6035 */ , 
+  0x8353 /* offset 6036 */ , 
+  0x83ca /* offset 6037 */ , 
+  0x83cc /* offset 6038 */ , 
+  0x83dc /* offset 6039 */ , 
+  0x26c36 /* offset 6040 */ , 
+  0x26d6b /* offset 6041 */ , 
+  0x26cd5 /* offset 6042 */ , 
+  0x452b /* offset 6043 */ , 
+  0x84f1 /* offset 6044 */ , 
+  0x84f3 /* offset 6045 */ , 
+  0x8516 /* offset 6046 */ , 
+  0x273ca /* offset 6047 */ , 
+  0x8564 /* offset 6048 */ , 
+  0x26f2c /* offset 6049 */ , 
+  0x455d /* offset 6050 */ , 
+  0x4561 /* offset 6051 */ , 
+  0x26fb1 /* offset 6052 */ , 
+  0x270d2 /* offset 6053 */ , 
+  0x456b /* offset 6054 */ , 
+  0x8650 /* offset 6055 */ , 
+  0x8667 /* offset 6056 */ , 
+  0x8669 /* offset 6057 */ , 
+  0x86a9 /* offset 6058 */ , 
+  0x8688 /* offset 6059 */ , 
+  0x870e /* offset 6060 */ , 
+  0x86e2 /* offset 6061 */ , 
+  0x8779 /* offset 6062 */ , 
+  0x8728 /* offset 6063 */ , 
+  0x876b /* offset 6064 */ , 
+  0x8786 /* offset 6065 */ , 
+  0x4d57 /* offset 6066 */ , 
+  0x87e1 /* offset 6067 */ , 
+  0x8801 /* offset 6068 */ , 
+  0x45f9 /* offset 6069 */ , 
+  0x8860 /* offset 6070 */ , 
+  0x27667 /* offset 6071 */ , 
+  0x88d7 /* offset 6072 */ , 
+  0x88de /* offset 6073 */ , 
+  0x4635 /* offset 6074 */ , 
+  0x88fa /* offset 6075 */ , 
+  0x34bb /* offset 6076 */ , 
+  0x278ae /* offset 6077 */ , 
+  0x27966 /* offset 6078 */ , 
+  0x46be /* offset 6079 */ , 
+  0x46c7 /* offset 6080 */ , 
+  0x8aa0 /* offset 6081 */ , 
+  0x8aed /* offset 6082 */ , 
+  0x8b8a /* offset 6083 */ , 
+  0x27ca8 /* offset 6084 */ , 
+  0x8cab /* offset 6085 */ , 
+  0x8cc1 /* offset 6086 */ , 
+  0x8d1b /* offset 6087 */ , 
+  0x8d77 /* offset 6088 */ , 
+  0x27f2f /* offset 6089 */ , 
+  0x20804 /* offset 6090 */ , 
+  0x8dcb /* offset 6091 */ , 
+  0x8dbc /* offset 6092 */ , 
+  0x8df0 /* offset 6093 */ , 
+  0x208de /* offset 6094 */ , 
+  0x8ed4 /* offset 6095 */ , 
+  0x8f38 /* offset 6096 */ , 
+  0x285d2 /* offset 6097 */ , 
+  0x285ed /* offset 6098 */ , 
+  0x9094 /* offset 6099 */ , 
+  0x90f1 /* offset 6100 */ , 
+  0x9111 /* offset 6101 */ , 
+  0x2872e /* offset 6102 */ , 
+  0x911b /* offset 6103 */ , 
+  0x9238 /* offset 6104 */ , 
+  0x92d7 /* offset 6105 */ , 
+  0x92d8 /* offset 6106 */ , 
+  0x927c /* offset 6107 */ , 
+  0x93f9 /* offset 6108 */ , 
+  0x9415 /* offset 6109 */ , 
+  0x28bfa /* offset 6110 */ , 
+  0x958b /* offset 6111 */ , 
+  0x4995 /* offset 6112 */ , 
+  0x95b7 /* offset 6113 */ , 
+  0x28d77 /* offset 6114 */ , 
+  0x49e6 /* offset 6115 */ , 
+  0x96c3 /* offset 6116 */ , 
+  0x5db2 /* offset 6117 */ , 
+  0x9723 /* offset 6118 */ , 
+  0x29145 /* offset 6119 */ , 
+  0x2921a /* offset 6120 */ , 
+  0x4a6e /* offset 6121 */ , 
+  0x4a76 /* offset 6122 */ , 
+  0x97e0 /* offset 6123 */ , 
+  0x2940a /* offset 6124 */ , 
+  0x4ab2 /* offset 6125 */ , 
+  0x29496 /* offset 6126 */ , 
+  0x980b /* offset 6127 */ , 
+  0x9829 /* offset 6128 */ , 
+  0x295b6 /* offset 6129 */ , 
+  0x98e2 /* offset 6130 */ , 
+  0x4b33 /* offset 6131 */ , 
+  0x9929 /* offset 6132 */ , 
+  0x99a7 /* offset 6133 */ , 
+  0x99c2 /* offset 6134 */ , 
+  0x99fe /* offset 6135 */ , 
+  0x4bce /* offset 6136 */ , 
+  0x29b30 /* offset 6137 */ , 
+  0x9b12 /* offset 6138 */ , 
+  0x9c40 /* offset 6139 */ , 
+  0x9cfd /* offset 6140 */ , 
+  0x4cce /* offset 6141 */ , 
+  0x4ced /* offset 6142 */ , 
+  0x9d67 /* offset 6143 */ , 
+  0x2a0ce /* offset 6144 */ , 
+  0x4cf8 /* offset 6145 */ , 
+  0x2a105 /* offset 6146 */ , 
+  0x2a20e /* offset 6147 */ , 
+  0x2a291 /* offset 6148 */ , 
+  0x4d56 /* offset 6149 */ , 
+  0x9efe /* offset 6150 */ , 
+  0x9f05 /* offset 6151 */ , 
+  0x9f0f /* offset 6152 */ , 
+  0x9f16 /* offset 6153 */ , 
+  0x2a600 /* offset 6154 */ 
+};
+
diff --git a/poppler/UnicodeMap.cc b/poppler/UnicodeMap.cc
new file mode 100644 (file)
index 0000000..0528cdf
--- /dev/null
@@ -0,0 +1,311 @@
+//========================================================================
+//
+// UnicodeMap.cc
+//
+// Copyright 2001-2003 Glyph & Cog, LLC
+//
+//========================================================================
+
+//========================================================================
+//
+// Modified under the Poppler project - http://poppler.freedesktop.org
+//
+// All changes made under the Poppler project to this file are licensed
+// under GPL version 2 or later
+//
+// Copyright (C) 2010 Jakub Wilk <ubanus@users.sf.net>
+//
+// To see a description of the changes please see the Changelog file that
+// came with your tarball or type make ChangeLog if you are building from git
+//
+//========================================================================
+
+#include <config.h>
+
+#ifdef USE_GCC_PRAGMAS
+#pragma implementation
+#endif
+
+#include <stdio.h>
+#include <string.h>
+#include "goo/gmem.h"
+#include "goo/gfile.h"
+#include "goo/GooString.h"
+#include "goo/GooList.h"
+#include "Error.h"
+#include "GlobalParams.h"
+#include "UnicodeMap.h"
+
+//------------------------------------------------------------------------
+
+#define maxExtCode 16
+
+struct UnicodeMapExt {
+  Unicode u;                   // Unicode char
+  char code[maxExtCode];
+  Guint nBytes;
+};
+
+//------------------------------------------------------------------------
+
+UnicodeMap *UnicodeMap::parse(GooString *encodingNameA) {
+  FILE *f;
+  UnicodeMap *map;
+  UnicodeMapRange *range;
+  UnicodeMapExt *eMap;
+  int size, eMapsSize;
+  char buf[256];
+  int line, nBytes, i, x;
+  char *tok1, *tok2, *tok3;
+  char *tokptr;
+
+  if (!(f = globalParams->getUnicodeMapFile(encodingNameA))) {
+    error(errSyntaxError, -1,
+         "Couldn't find unicodeMap file for the '{0:t}' encoding",
+         encodingNameA);
+    return NULL;
+  }
+
+  map = new UnicodeMap(encodingNameA->copy());
+
+  size = 8;
+  map->ranges = (UnicodeMapRange *)gmallocn(size, sizeof(UnicodeMapRange));
+  eMapsSize = 0;
+
+  line = 1;
+  while (getLine(buf, sizeof(buf), f)) {
+    if ((tok1 = strtok_r(buf, " \t\r\n", &tokptr)) &&
+       (tok2 = strtok_r(NULL, " \t\r\n", &tokptr))) {
+      if (!(tok3 = strtok_r(NULL, " \t\r\n", &tokptr))) {
+       tok3 = tok2;
+       tok2 = tok1;
+      }
+      nBytes = strlen(tok3) / 2;
+      if (nBytes <= 4) {
+       if (map->len == size) {
+         size *= 2;
+         map->ranges = (UnicodeMapRange *)
+           greallocn(map->ranges, size, sizeof(UnicodeMapRange));
+       }
+       range = &map->ranges[map->len];
+       sscanf(tok1, "%x", &range->start);
+       sscanf(tok2, "%x", &range->end);
+       sscanf(tok3, "%x", &range->code);
+       range->nBytes = nBytes;
+       ++map->len;
+      } else if (tok2 == tok1) {
+       if (map->eMapsLen == eMapsSize) {
+         eMapsSize += 16;
+         map->eMaps = (UnicodeMapExt *)
+           greallocn(map->eMaps, eMapsSize, sizeof(UnicodeMapExt));
+       }
+       eMap = &map->eMaps[map->eMapsLen];
+       sscanf(tok1, "%x", &eMap->u);
+       for (i = 0; i < nBytes; ++i) {
+         sscanf(tok3 + i*2, "%2x", &x);
+         eMap->code[i] = (char)x;
+       }
+       eMap->nBytes = nBytes;
+       ++map->eMapsLen;
+      } else {
+       error(errSyntaxError, -1,
+             "Bad line ({0:d}) in unicodeMap file for the '{1:t}' encoding",
+             line, encodingNameA);
+      }
+    } else {
+      error(errSyntaxError, -1,
+           "Bad line ({0:d}) in unicodeMap file for the '{1:t}' encoding",
+           line, encodingNameA);
+    }
+    ++line;
+  }
+
+  fclose(f);
+
+  return map;
+}
+
+UnicodeMap::UnicodeMap(GooString *encodingNameA) {
+  encodingName = encodingNameA;
+  unicodeOut = gFalse;
+  kind = unicodeMapUser;
+  ranges = NULL;
+  len = 0;
+  eMaps = NULL;
+  eMapsLen = 0;
+  refCnt = 1;
+#if MULTITHREADED
+  gInitMutex(&mutex);
+#endif
+}
+
+UnicodeMap::UnicodeMap(const char *encodingNameA, GBool unicodeOutA,
+                      UnicodeMapRange *rangesA, int lenA) {
+  encodingName = new GooString(encodingNameA);
+  unicodeOut = unicodeOutA;
+  kind = unicodeMapResident;
+  ranges = rangesA;
+  len = lenA;
+  eMaps = NULL;
+  eMapsLen = 0;
+  refCnt = 1;
+#if MULTITHREADED
+  gInitMutex(&mutex);
+#endif
+}
+
+UnicodeMap::UnicodeMap(const char *encodingNameA, GBool unicodeOutA,
+                      UnicodeMapFunc funcA) {
+  encodingName = new GooString(encodingNameA);
+  unicodeOut = unicodeOutA;
+  kind = unicodeMapFunc;
+  func = funcA;
+  eMaps = NULL;
+  eMapsLen = 0;
+  refCnt = 1;
+#if MULTITHREADED
+  gInitMutex(&mutex);
+#endif
+}
+
+UnicodeMap::~UnicodeMap() {
+  delete encodingName;
+  if (kind == unicodeMapUser && ranges) {
+    gfree(ranges);
+  }
+  if (eMaps) {
+    gfree(eMaps);
+  }
+#if MULTITHREADED
+  gDestroyMutex(&mutex);
+#endif
+}
+
+void UnicodeMap::incRefCnt() {
+#if MULTITHREADED
+  gLockMutex(&mutex);
+#endif
+  ++refCnt;
+#if MULTITHREADED
+  gUnlockMutex(&mutex);
+#endif
+}
+
+void UnicodeMap::decRefCnt() {
+  GBool done;
+
+#if MULTITHREADED
+  gLockMutex(&mutex);
+#endif
+  done = --refCnt == 0;
+#if MULTITHREADED
+  gUnlockMutex(&mutex);
+#endif
+  if (done) {
+    delete this;
+  }
+}
+
+GBool UnicodeMap::match(GooString *encodingNameA) {
+  return !encodingName->cmp(encodingNameA);
+}
+
+int UnicodeMap::mapUnicode(Unicode u, char *buf, int bufSize) {
+  int a, b, m, n, i, j;
+  Guint code;
+
+  if (kind == unicodeMapFunc) {
+    return (*func)(u, buf, bufSize);
+  }
+
+  a = 0;
+  b = len;
+  if (u >= ranges[a].start) {
+    // invariant: ranges[a].start <= u < ranges[b].start
+    while (b - a > 1) {
+      m = (a + b) / 2;
+      if (u >= ranges[m].start) {
+       a = m;
+      } else if (u < ranges[m].start) {
+       b = m;
+      }
+    }
+    if (u <= ranges[a].end) {
+      n = ranges[a].nBytes;
+      if (n > bufSize) {
+       return 0;
+      }
+      code = ranges[a].code + (u - ranges[a].start);
+      for (i = n - 1; i >= 0; --i) {
+       buf[i] = (char)(code & 0xff);
+       code >>= 8;
+      }
+      return n;
+    }
+  }
+
+  for (i = 0; i < eMapsLen; ++i) {
+    if (eMaps[i].u == u) {
+      n = eMaps[i].nBytes;
+      for (j = 0; j < n; ++j) {
+       buf[j] = eMaps[i].code[j];
+      }
+      return n;
+    }
+  }
+
+  return 0;
+}
+
+//------------------------------------------------------------------------
+
+UnicodeMapCache::UnicodeMapCache() {
+  int i;
+
+  for (i = 0; i < unicodeMapCacheSize; ++i) {
+    cache[i] = NULL;
+  }
+}
+
+UnicodeMapCache::~UnicodeMapCache() {
+  int i;
+
+  for (i = 0; i < unicodeMapCacheSize; ++i) {
+    if (cache[i]) {
+      cache[i]->decRefCnt();
+    }
+  }
+}
+
+UnicodeMap *UnicodeMapCache::getUnicodeMap(GooString *encodingName) {
+  UnicodeMap *map;
+  int i, j;
+
+  if (cache[0] && cache[0]->match(encodingName)) {
+    cache[0]->incRefCnt();
+    return cache[0];
+  }
+  for (i = 1; i < unicodeMapCacheSize; ++i) {
+    if (cache[i] && cache[i]->match(encodingName)) {
+      map = cache[i];
+      for (j = i; j >= 1; --j) {
+       cache[j] = cache[j - 1];
+      }
+      cache[0] = map;
+      map->incRefCnt();
+      return map;
+    }
+  }
+  if ((map = UnicodeMap::parse(encodingName))) {
+    if (cache[unicodeMapCacheSize - 1]) {
+      cache[unicodeMapCacheSize - 1]->decRefCnt();
+    }
+    for (j = unicodeMapCacheSize - 1; j >= 1; --j) {
+      cache[j] = cache[j - 1];
+    }
+    cache[0] = map;
+    map->incRefCnt();
+    return map;
+  }
+  return NULL;
+}
diff --git a/poppler/UnicodeMap.h b/poppler/UnicodeMap.h
new file mode 100644 (file)
index 0000000..ba7df2c
--- /dev/null
@@ -0,0 +1,122 @@
+//========================================================================
+//
+// UnicodeMap.h
+//
+// Mapping from Unicode to an encoding.
+//
+// Copyright 2001-2003 Glyph & Cog, LLC
+//
+//========================================================================
+
+#ifndef UNICODEMAP_H
+#define UNICODEMAP_H
+
+#ifdef USE_GCC_PRAGMAS
+#pragma interface
+#endif
+
+#include "poppler-config.h"
+#include "goo/gtypes.h"
+#include "CharTypes.h"
+
+#if MULTITHREADED
+#include "goo/GooMutex.h"
+#endif
+
+class GooString;
+
+//------------------------------------------------------------------------
+
+enum UnicodeMapKind {
+  unicodeMapUser,              // read from a file
+  unicodeMapResident,          // static list of ranges
+  unicodeMapFunc               // function pointer
+};
+
+typedef int (*UnicodeMapFunc)(Unicode u, char *buf, int bufSize);
+
+struct UnicodeMapRange {
+  Unicode start, end;          // range of Unicode chars
+  Guint code, nBytes;          // first output code
+};
+
+struct UnicodeMapExt;
+
+//------------------------------------------------------------------------
+
+class UnicodeMap {
+public:
+
+  // Create the UnicodeMap specified by <encodingName>.  Sets the
+  // initial reference count to 1.  Returns NULL on failure.
+  static UnicodeMap *parse(GooString *encodingNameA);
+
+  // Create a resident UnicodeMap.
+  UnicodeMap(const char *encodingNameA, GBool unicodeOutA,
+            UnicodeMapRange *rangesA, int lenA);
+
+  // Create a resident UnicodeMap that uses a function instead of a
+  // list of ranges.
+  UnicodeMap(const char *encodingNameA, GBool unicodeOutA,
+            UnicodeMapFunc funcA);
+
+  ~UnicodeMap();
+
+  void incRefCnt();
+  void decRefCnt();
+
+  GooString *getEncodingName() { return encodingName; }
+
+  GBool isUnicode() { return unicodeOut; }
+
+  // Return true if this UnicodeMap matches the specified
+  // <encodingNameA>.
+  GBool match(GooString *encodingNameA);
+
+  // Map Unicode to the target encoding.  Fills in <buf> with the
+  // output and returns the number of bytes used.  Output will be
+  // truncated at <bufSize> bytes.  No string terminator is written.
+  // Returns 0 if no mapping is found.
+  int mapUnicode(Unicode u, char *buf, int bufSize);
+
+private:
+
+  UnicodeMap(GooString *encodingNameA);
+
+  GooString *encodingName;
+  UnicodeMapKind kind;
+  GBool unicodeOut;
+  union {
+    UnicodeMapRange *ranges;   // (user, resident)
+    UnicodeMapFunc func;       // (func)
+  };
+  int len;                     // (user, resident)
+  UnicodeMapExt *eMaps;                // (user)
+  int eMapsLen;                        // (user)
+  int refCnt;
+#if MULTITHREADED
+  GooMutex mutex;
+#endif
+};
+
+//------------------------------------------------------------------------
+
+#define unicodeMapCacheSize 4
+
+class UnicodeMapCache {
+public:
+
+  UnicodeMapCache();
+  ~UnicodeMapCache();
+
+  // Get the UnicodeMap for <encodingName>.  Increments its reference
+  // count; there will be one reference for the cache plus one for the
+  // caller of this function.  Returns NULL on failure.
+  UnicodeMap *getUnicodeMap(GooString *encodingName);
+
+private:
+
+  UnicodeMap *cache[unicodeMapCacheSize];
+};
+
+#endif
diff --git a/poppler/UnicodeMapTables.h b/poppler/UnicodeMapTables.h
new file mode 100644 (file)
index 0000000..073e474
--- /dev/null
@@ -0,0 +1,365 @@
+//========================================================================
+//
+// UnicodeMapTables.h
+//
+// Copyright 2001-2009 Glyph & Cog, LLC
+//
+//========================================================================
+
+static UnicodeMapRange latin1UnicodeMapRanges[] = {
+  { 0x000a, 0x000a, 0x0a, 1 },
+  { 0x000c, 0x000d, 0x0c, 1 },
+  { 0x0020, 0x007e, 0x20, 1 },
+  { 0x00a0, 0x00a0, 0x20, 1 },
+  { 0x00a1, 0x00ac, 0xa1, 1 },
+  { 0x00ae, 0x00ff, 0xae, 1 },
+  { 0x010c, 0x010c, 0x43, 1 },
+  { 0x010d, 0x010d, 0x63, 1 },
+  { 0x0131, 0x0131, 0x69, 1 },
+  { 0x0141, 0x0141, 0x4c, 1 },
+  { 0x0142, 0x0142, 0x6c, 1 },
+  { 0x0152, 0x0152, 0x4f45, 2 },
+  { 0x0153, 0x0153, 0x6f65, 2 },
+  { 0x0160, 0x0160, 0x53, 1 },
+  { 0x0161, 0x0161, 0x73, 1 },
+  { 0x0178, 0x0178, 0x59, 1 },
+  { 0x017d, 0x017d, 0x5a, 1 },
+  { 0x017e, 0x017e, 0x7a, 1 },
+  { 0x02c6, 0x02c6, 0x5e, 1 },
+  { 0x02da, 0x02da, 0xb0, 1 },
+  { 0x02dc, 0x02dc, 0x7e, 1 },
+  { 0x2013, 0x2013, 0xad, 1 },
+  { 0x2014, 0x2014, 0x2d2d, 2 },
+  { 0x2018, 0x2018, 0x60, 1 },
+  { 0x2019, 0x2019, 0x27, 1 },
+  { 0x201a, 0x201a, 0x2c, 1 },
+  { 0x201c, 0x201c, 0x22, 1 },
+  { 0x201d, 0x201d, 0x22, 1 },
+  { 0x201e, 0x201e, 0x2c2c, 2 },
+  { 0x2022, 0x2022, 0xb7, 1 },
+  { 0x2026, 0x2026, 0x2e2e2e, 3 },
+  { 0x2039, 0x2039, 0x3c, 1 },
+  { 0x203a, 0x203a, 0x3e, 1 },
+  { 0x2044, 0x2044, 0x2f, 1 },
+  { 0x2122, 0x2122, 0x544d, 2 },
+  { 0x2212, 0x2212, 0x2d, 1 },
+  { 0xf6f9, 0xf6f9, 0x4c, 1 },
+  { 0xf6fa, 0xf6fa, 0x4f45, 2 },
+  { 0xf6fc, 0xf6fc, 0xb0, 1 },
+  { 0xf6fd, 0xf6fd, 0x53, 1 },
+  { 0xf6fe, 0xf6fe, 0x7e, 1 },
+  { 0xf6ff, 0xf6ff, 0x5a, 1 },
+  { 0xf721, 0xf721, 0x21, 1 },
+  { 0xf724, 0xf724, 0x24, 1 },
+  { 0xf726, 0xf726, 0x26, 1 },
+  { 0xf730, 0xf739, 0x30, 1 },
+  { 0xf73f, 0xf73f, 0x3f, 1 },
+  { 0xf761, 0xf77a, 0x41, 1 },
+  { 0xf7a1, 0xf7a2, 0xa1, 1 },
+  { 0xf7bf, 0xf7bf, 0xbf, 1 },
+  { 0xf7e0, 0xf7f6, 0xc0, 1 },
+  { 0xf7f8, 0xf7fe, 0xd8, 1 },
+  { 0xf7ff, 0xf7ff, 0x59, 1 },
+  { 0xfb00, 0xfb00, 0x6666, 2 },
+  { 0xfb01, 0xfb01, 0x6669, 2 },
+  { 0xfb02, 0xfb02, 0x666c, 2 },
+  { 0xfb03, 0xfb03, 0x666669, 3 },
+  { 0xfb04, 0xfb04, 0x66666c, 3 },
+  { 0xfb05, 0xfb05, 0x7374, 2 },
+  { 0xfb06, 0xfb06, 0x7374, 2 }
+};
+#define latin1UnicodeMapLen (sizeof(latin1UnicodeMapRanges) / sizeof(UnicodeMapRange))
+
+static UnicodeMapRange ascii7UnicodeMapRanges[] = {
+  { 0x000a, 0x000a, 0x0a, 1 },
+  { 0x000c, 0x000d, 0x0c, 1 },
+  { 0x0020, 0x005f, 0x20, 1 },
+  { 0x0061, 0x007e, 0x61, 1 },
+  { 0x00a6, 0x00a6, 0x7c, 1 },
+  { 0x00a9, 0x00a9, 0x286329, 3 },
+  { 0x00ae, 0x00ae, 0x285229, 3 },
+  { 0x00b7, 0x00b7, 0x2a, 1 },
+  { 0x00bc, 0x00bc, 0x312f34, 3 },
+  { 0x00bd, 0x00bd, 0x312f32, 3 },
+  { 0x00be, 0x00be, 0x332f34, 3 },
+  { 0x00c0, 0x00c0, 0x41, 1 },
+  { 0x00c1, 0x00c1, 0x41, 1 },
+  { 0x00c2, 0x00c2, 0x41, 1 },
+  { 0x00c3, 0x00c3, 0x41, 1 },
+  { 0x00c4, 0x00c4, 0x41, 1 },
+  { 0x00c5, 0x00c5, 0x41, 1 },
+  { 0x00c6, 0x00c6, 0x4145, 2 },
+  { 0x00c7, 0x00c7, 0x43, 1 },
+  { 0x00c8, 0x00c8, 0x45, 1 },
+  { 0x00c9, 0x00c9, 0x45, 1 },
+  { 0x00ca, 0x00ca, 0x45, 1 },
+  { 0x00cb, 0x00cb, 0x45, 1 },
+  { 0x00cc, 0x00cc, 0x49, 1 },
+  { 0x00cd, 0x00cd, 0x49, 1 },
+  { 0x00ce, 0x00ce, 0x49, 1 },
+  { 0x00cf, 0x00cf, 0x49, 1 },
+  { 0x00d1, 0x00d2, 0x4e, 1 },
+  { 0x00d3, 0x00d3, 0x4f, 1 },
+  { 0x00d4, 0x00d4, 0x4f, 1 },
+  { 0x00d5, 0x00d5, 0x4f, 1 },
+  { 0x00d6, 0x00d6, 0x4f, 1 },
+  { 0x00d7, 0x00d7, 0x78, 1 },
+  { 0x00d8, 0x00d8, 0x4f, 1 },
+  { 0x00d9, 0x00d9, 0x55, 1 },
+  { 0x00da, 0x00da, 0x55, 1 },
+  { 0x00db, 0x00db, 0x55, 1 },
+  { 0x00dc, 0x00dc, 0x55, 1 },
+  { 0x00dd, 0x00dd, 0x59, 1 },
+  { 0x00e0, 0x00e0, 0x61, 1 },
+  { 0x00e1, 0x00e1, 0x61, 1 },
+  { 0x00e2, 0x00e2, 0x61, 1 },
+  { 0x00e3, 0x00e3, 0x61, 1 },
+  { 0x00e4, 0x00e4, 0x61, 1 },
+  { 0x00e5, 0x00e5, 0x61, 1 },
+  { 0x00e6, 0x00e6, 0x6165, 2 },
+  { 0x00e7, 0x00e7, 0x63, 1 },
+  { 0x00e8, 0x00e8, 0x65, 1 },
+  { 0x00e9, 0x00e9, 0x65, 1 },
+  { 0x00ea, 0x00ea, 0x65, 1 },
+  { 0x00eb, 0x00eb, 0x65, 1 },
+  { 0x00ec, 0x00ec, 0x69, 1 },
+  { 0x00ed, 0x00ed, 0x69, 1 },
+  { 0x00ee, 0x00ee, 0x69, 1 },
+  { 0x00ef, 0x00ef, 0x69, 1 },
+  { 0x00f1, 0x00f2, 0x6e, 1 },
+  { 0x00f3, 0x00f3, 0x6f, 1 },
+  { 0x00f4, 0x00f4, 0x6f, 1 },
+  { 0x00f5, 0x00f5, 0x6f, 1 },
+  { 0x00f6, 0x00f6, 0x6f, 1 },
+  { 0x00f7, 0x00f7, 0x2f, 1 },
+  { 0x00f8, 0x00f8, 0x6f, 1 },
+  { 0x00f9, 0x00f9, 0x75, 1 },
+  { 0x00fa, 0x00fa, 0x75, 1 },
+  { 0x00fb, 0x00fb, 0x75, 1 },
+  { 0x00fc, 0x00fc, 0x75, 1 },
+  { 0x00fd, 0x00fd, 0x79, 1 },
+  { 0x00ff, 0x00ff, 0x79, 1 },
+  { 0x0131, 0x0131, 0x69, 1 },
+  { 0x0141, 0x0141, 0x4c, 1 },
+  { 0x0152, 0x0152, 0x4f45, 2 },
+  { 0x0153, 0x0153, 0x6f65, 2 },
+  { 0x0160, 0x0160, 0x53, 1 },
+  { 0x0178, 0x0178, 0x59, 1 },
+  { 0x017d, 0x017d, 0x5a, 1 },
+  { 0x2013, 0x2013, 0x2d, 1 },
+  { 0x2014, 0x2014, 0x2d2d, 2 },
+  { 0x2018, 0x2018, 0x60, 1 },
+  { 0x2019, 0x2019, 0x27, 1 },
+  { 0x201c, 0x201c, 0x22, 1 },
+  { 0x201d, 0x201d, 0x22, 1 },
+  { 0x2022, 0x2022, 0x2a, 1 },
+  { 0x2026, 0x2026, 0x2e2e2e, 3 },
+  { 0x2122, 0x2122, 0x544d, 2 },
+  { 0x2212, 0x2212, 0x2d, 1 },
+  { 0xf6f9, 0xf6f9, 0x4c, 1 },
+  { 0xf6fa, 0xf6fa, 0x4f45, 2 },
+  { 0xf6fd, 0xf6fd, 0x53, 1 },
+  { 0xf6fe, 0xf6fe, 0x7e, 1 },
+  { 0xf6ff, 0xf6ff, 0x5a, 1 },
+  { 0xf721, 0xf721, 0x21, 1 },
+  { 0xf724, 0xf724, 0x24, 1 },
+  { 0xf726, 0xf726, 0x26, 1 },
+  { 0xf730, 0xf739, 0x30, 1 },
+  { 0xf73f, 0xf73f, 0x3f, 1 },
+  { 0xf761, 0xf77a, 0x41, 1 },
+  { 0xf7e0, 0xf7e0, 0x41, 1 },
+  { 0xf7e1, 0xf7e1, 0x41, 1 },
+  { 0xf7e2, 0xf7e2, 0x41, 1 },
+  { 0xf7e3, 0xf7e3, 0x41, 1 },
+  { 0xf7e4, 0xf7e4, 0x41, 1 },
+  { 0xf7e5, 0xf7e5, 0x41, 1 },
+  { 0xf7e6, 0xf7e6, 0x4145, 2 },
+  { 0xf7e7, 0xf7e7, 0x43, 1 },
+  { 0xf7e8, 0xf7e8, 0x45, 1 },
+  { 0xf7e9, 0xf7e9, 0x45, 1 },
+  { 0xf7ea, 0xf7ea, 0x45, 1 },
+  { 0xf7eb, 0xf7eb, 0x45, 1 },
+  { 0xf7ec, 0xf7ec, 0x49, 1 },
+  { 0xf7ed, 0xf7ed, 0x49, 1 },
+  { 0xf7ee, 0xf7ee, 0x49, 1 },
+  { 0xf7ef, 0xf7ef, 0x49, 1 },
+  { 0xf7f1, 0xf7f2, 0x4e, 1 },
+  { 0xf7f3, 0xf7f3, 0x4f, 1 },
+  { 0xf7f4, 0xf7f4, 0x4f, 1 },
+  { 0xf7f5, 0xf7f5, 0x4f, 1 },
+  { 0xf7f6, 0xf7f6, 0x4f, 1 },
+  { 0xf7f8, 0xf7f8, 0x4f, 1 },
+  { 0xf7f9, 0xf7f9, 0x55, 1 },
+  { 0xf7fa, 0xf7fa, 0x55, 1 },
+  { 0xf7fb, 0xf7fb, 0x55, 1 },
+  { 0xf7fc, 0xf7fc, 0x55, 1 },
+  { 0xf7fd, 0xf7fd, 0x59, 1 },
+  { 0xf7ff, 0xf7ff, 0x59, 1 },
+  { 0xfb00, 0xfb00, 0x6666, 2 },
+  { 0xfb01, 0xfb01, 0x6669, 2 },
+  { 0xfb02, 0xfb02, 0x666c, 2 },
+  { 0xfb03, 0xfb03, 0x666669, 3 },
+  { 0xfb04, 0xfb04, 0x66666c, 3 },
+  { 0xfb05, 0xfb05, 0x7374, 2 },
+  { 0xfb06, 0xfb06, 0x7374, 2 }
+};
+#define ascii7UnicodeMapLen (sizeof(ascii7UnicodeMapRanges) / sizeof(UnicodeMapRange))
+
+static UnicodeMapRange symbolUnicodeMapRanges[] = {
+  { 0x0020, 0x0021, 0x20, 1 },
+  { 0x0023, 0x0023, 0x23, 1 },
+  { 0x0025, 0x0026, 0x25, 1 },
+  { 0x0028, 0x0029, 0x28, 1 },
+  { 0x002b, 0x002c, 0x2b, 1 },
+  { 0x002e, 0x003f, 0x2e, 1 },
+  { 0x005b, 0x005b, 0x5b, 1 },
+  { 0x005d, 0x005d, 0x5d, 1 },
+  { 0x005f, 0x005f, 0x5f, 1 },
+  { 0x007b, 0x007d, 0x7b, 1 },
+  { 0x00ac, 0x00ac, 0xd8, 1 },
+  { 0x00b0, 0x00b1, 0xb0, 1 },
+  { 0x00b5, 0x00b5, 0x6d, 1 },
+  { 0x00d7, 0x00d7, 0xb4, 1 },
+  { 0x00f7, 0x00f7, 0xb8, 1 },
+  { 0x0192, 0x0192, 0xa6, 1 },
+  { 0x0391, 0x0392, 0x41, 1 },
+  { 0x0393, 0x0393, 0x47, 1 },
+  { 0x0395, 0x0395, 0x45, 1 },
+  { 0x0396, 0x0396, 0x5a, 1 },
+  { 0x0397, 0x0397, 0x48, 1 },
+  { 0x0398, 0x0398, 0x51, 1 },
+  { 0x0399, 0x0399, 0x49, 1 },
+  { 0x039a, 0x039d, 0x4b, 1 },
+  { 0x039e, 0x039e, 0x58, 1 },
+  { 0x039f, 0x03a0, 0x4f, 1 },
+  { 0x03a1, 0x03a1, 0x52, 1 },
+  { 0x03a3, 0x03a5, 0x53, 1 },
+  { 0x03a6, 0x03a6, 0x46, 1 },
+  { 0x03a7, 0x03a7, 0x43, 1 },
+  { 0x03a8, 0x03a8, 0x59, 1 },
+  { 0x03b1, 0x03b2, 0x61, 1 },
+  { 0x03b3, 0x03b3, 0x67, 1 },
+  { 0x03b4, 0x03b5, 0x64, 1 },
+  { 0x03b6, 0x03b6, 0x7a, 1 },
+  { 0x03b7, 0x03b7, 0x68, 1 },
+  { 0x03b8, 0x03b8, 0x71, 1 },
+  { 0x03b9, 0x03b9, 0x69, 1 },
+  { 0x03ba, 0x03bb, 0x6b, 1 },
+  { 0x03bd, 0x03bd, 0x6e, 1 },
+  { 0x03be, 0x03be, 0x78, 1 },
+  { 0x03bf, 0x03c0, 0x6f, 1 },
+  { 0x03c1, 0x03c1, 0x72, 1 },
+  { 0x03c2, 0x03c2, 0x56, 1 },
+  { 0x03c3, 0x03c5, 0x73, 1 },
+  { 0x03c6, 0x03c6, 0x66, 1 },
+  { 0x03c7, 0x03c7, 0x63, 1 },
+  { 0x03c8, 0x03c8, 0x79, 1 },
+  { 0x03c9, 0x03c9, 0x77, 1 },
+  { 0x03d1, 0x03d1, 0x4a, 1 },
+  { 0x03d2, 0x03d2, 0xa1, 1 },
+  { 0x03d5, 0x03d5, 0x6a, 1 },
+  { 0x03d6, 0x03d6, 0x76, 1 },
+  { 0x2022, 0x2022, 0xb7, 1 },
+  { 0x2026, 0x2026, 0xbc, 1 },
+  { 0x2032, 0x2032, 0xa2, 1 },
+  { 0x2033, 0x2033, 0xb2, 1 },
+  { 0x2044, 0x2044, 0xa4, 1 },
+  { 0x2111, 0x2111, 0xc1, 1 },
+  { 0x2118, 0x2118, 0xc3, 1 },
+  { 0x211c, 0x211c, 0xc2, 1 },
+  { 0x2126, 0x2126, 0x57, 1 },
+  { 0x2135, 0x2135, 0xc0, 1 },
+  { 0x2190, 0x2193, 0xac, 1 },
+  { 0x2194, 0x2194, 0xab, 1 },
+  { 0x21b5, 0x21b5, 0xbf, 1 },
+  { 0x21d0, 0x21d3, 0xdc, 1 },
+  { 0x21d4, 0x21d4, 0xdb, 1 },
+  { 0x2200, 0x2200, 0x22, 1 },
+  { 0x2202, 0x2202, 0xb6, 1 },
+  { 0x2203, 0x2203, 0x24, 1 },
+  { 0x2205, 0x2205, 0xc6, 1 },
+  { 0x2206, 0x2206, 0x44, 1 },
+  { 0x2207, 0x2207, 0xd1, 1 },
+  { 0x2208, 0x2209, 0xce, 1 },
+  { 0x220b, 0x220b, 0x27, 1 },
+  { 0x220f, 0x220f, 0xd5, 1 },
+  { 0x2211, 0x2211, 0xe5, 1 },
+  { 0x2212, 0x2212, 0x2d, 1 },
+  { 0x2217, 0x2217, 0x2a, 1 },
+  { 0x221a, 0x221a, 0xd6, 1 },
+  { 0x221d, 0x221d, 0xb5, 1 },
+  { 0x221e, 0x221e, 0xa5, 1 },
+  { 0x2220, 0x2220, 0xd0, 1 },
+  { 0x2227, 0x2228, 0xd9, 1 },
+  { 0x2229, 0x222a, 0xc7, 1 },
+  { 0x222b, 0x222b, 0xf2, 1 },
+  { 0x2234, 0x2234, 0x5c, 1 },
+  { 0x223c, 0x223c, 0x7e, 1 },
+  { 0x2245, 0x2245, 0x40, 1 },
+  { 0x2248, 0x2248, 0xbb, 1 },
+  { 0x2260, 0x2261, 0xb9, 1 },
+  { 0x2264, 0x2264, 0xa3, 1 },
+  { 0x2265, 0x2265, 0xb3, 1 },
+  { 0x2282, 0x2282, 0xcc, 1 },
+  { 0x2283, 0x2283, 0xc9, 1 },
+  { 0x2284, 0x2284, 0xcb, 1 },
+  { 0x2286, 0x2286, 0xcd, 1 },
+  { 0x2287, 0x2287, 0xca, 1 },
+  { 0x2295, 0x2295, 0xc5, 1 },
+  { 0x2297, 0x2297, 0xc4, 1 },
+  { 0x22a5, 0x22a5, 0x5e, 1 },
+  { 0x22c5, 0x22c5, 0xd7, 1 },
+  { 0x2320, 0x2320, 0xf3, 1 },
+  { 0x2321, 0x2321, 0xf5, 1 },
+  { 0x2329, 0x2329, 0xe1, 1 },
+  { 0x232a, 0x232a, 0xf1, 1 },
+  { 0x25ca, 0x25ca, 0xe0, 1 },
+  { 0x2660, 0x2660, 0xaa, 1 },
+  { 0x2663, 0x2663, 0xa7, 1 },
+  { 0x2665, 0x2665, 0xa9, 1 },
+  { 0x2666, 0x2666, 0xa8, 1 },
+  { 0xf6d9, 0xf6d9, 0xd3, 1 },
+  { 0xf6da, 0xf6da, 0xd2, 1 },
+  { 0xf6db, 0xf6db, 0xd4, 1 },
+  { 0xf8e5, 0xf8e5, 0x60, 1 },
+  { 0xf8e6, 0xf8e7, 0xbd, 1 },
+  { 0xf8e8, 0xf8ea, 0xe2, 1 },
+  { 0xf8eb, 0xf8f4, 0xe6, 1 },
+  { 0xf8f5, 0xf8f5, 0xf4, 1 },
+  { 0xf8f6, 0xf8fe, 0xf6, 1 }
+};
+#define symbolUnicodeMapLen (sizeof(symbolUnicodeMapRanges) / sizeof(UnicodeMapRange))
+
+static UnicodeMapRange zapfDingbatsUnicodeMapRanges[] = {
+  { 0x0020, 0x0020, 0x20, 1 },
+  { 0x2192, 0x2192, 0xd5, 1 },
+  { 0x2194, 0x2195, 0xd6, 1 },
+  { 0x2460, 0x2469, 0xac, 1 },
+  { 0x25a0, 0x25a0, 0x6e, 1 },
+  { 0x25b2, 0x25b2, 0x73, 1 },
+  { 0x25bc, 0x25bc, 0x74, 1 },
+  { 0x25c6, 0x25c6, 0x75, 1 },
+  { 0x25cf, 0x25cf, 0x6c, 1 },
+  { 0x25d7, 0x25d7, 0x77, 1 },
+  { 0x2605, 0x2605, 0x48, 1 },
+  { 0x260e, 0x260e, 0x25, 1 },
+  { 0x261b, 0x261b, 0x2a, 1 },
+  { 0x261e, 0x261e, 0x2b, 1 },
+  { 0x2660, 0x2660, 0xab, 1 },
+  { 0x2663, 0x2663, 0xa8, 1 },
+  { 0x2665, 0x2665, 0xaa, 1 },
+  { 0x2666, 0x2666, 0xa9, 1 },
+  { 0x2701, 0x2704, 0x21, 1 },
+  { 0x2706, 0x2709, 0x26, 1 },
+  { 0x270c, 0x2727, 0x2c, 1 },
+  { 0x2729, 0x274b, 0x49, 1 },
+  { 0x274d, 0x274d, 0x6d, 1 },
+  { 0x274f, 0x2752, 0x6f, 1 },
+  { 0x2756, 0x2756, 0x76, 1 },
+  { 0x2758, 0x275e, 0x78, 1 },
+  { 0x2761, 0x2767, 0xa1, 1 },
+  { 0x2776, 0x2794, 0xb6, 1 },
+  { 0x2798, 0x27af, 0xd8, 1 },
+  { 0x27b1, 0x27be, 0xf1, 1 }
+};
+#define zapfDingbatsUnicodeMapLen (sizeof(zapfDingbatsUnicodeMapRanges) / sizeof(UnicodeMapRange))
diff --git a/poppler/UnicodeTypeTable.cc b/poppler/UnicodeTypeTable.cc
new file mode 100644 (file)
index 0000000..721af9d
--- /dev/null
@@ -0,0 +1,1223 @@
+//========================================================================
+//
+// UnicodeTypeTable.cc
+//
+// Copyright 2004 Glyph & Cog, LLC
+//
+//========================================================================
+
+//========================================================================
+//
+// Modified under the Poppler project - http://poppler.freedesktop.org
+//
+// All changes made under the Poppler project to this file are licensed
+// under GPL version 2 or later
+//
+// Copyright (C) 2006, 2007 Ed Catmur <ed@catmur.co.uk>
+// Copyright (C) 2007 Jeff Muizelaar <jeff@infidigm.net>
+// Copyright (C) 2008 Albert Astals Cid <aacid@kde.org>
+// Copyright (C) 2012 Adrian Johnson <ajohnson@redneon.com>
+//
+// To see a description of the changes please see the Changelog file that
+// came with your tarball or type make ChangeLog if you are building from git
+//
+//========================================================================
+
+#include <stdlib.h>
+#include "CharTypes.h"
+#include "UnicodeTypeTable.h"
+#include "goo/gmem.h"
+
+struct UnicodeMapTableEntry {
+  const char *vector;
+  const char type;
+};
+
+struct UnicodeCaseTableVector {
+  Unicode codes[256];
+};
+
+static const UnicodeMapTableEntry typeTable[256] = {
+  { "NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN###NNNNN################NNNNNNLLLLLLLLLLLLLLLLLLLLLLLLLLNNNNNNLLLLLLLLLLLLLLLLLLLLLLLLLLNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN#N####NNNNLNNNNN####NLNNN#LNNNNNLLLLLLLLLLLLLLLLLLLLLLLNLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLNLLLLLLLL", 'X' },
+  { NULL, 'L' },
+  { "LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLNNLLLLLLLNNNNNNNNNNNNNNLLNNNNNNNNNNNNNNLLLLLNNNNNNNNNLNNNNNNNNNNNNNNNNN", 'X' },
+  { "NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNLLLLLNNNNNNNNNNNLNLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLNLLLLLLLLL", 'X' },
+  { "LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLNNNNNNNLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL", 'X' },
+  { "LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNRNRNNRNRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRR", 'X' },
+  { "RRRR#########RNNNNNNNNRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRNNNNNNNNNNNNNN####################RRRNRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRNNNNNNNRNNNNNNNRRNNNNNNNRR##########RRRRRR", 'X' },
+  { "RRRRRRRRRRRRRRNNRNRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRNNNNNNNNNNNNNNNNNNNNNNNNNNNRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRNNNNNNNNNNNRNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN", 'X' },
+  { NULL, 'N' },
+  { "NNNLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLNNNLLLLNNNNNNNNLLLLNLLLNNNNLLLLLLLLLLLLLNNLLLLLLLLLLLLLNNNNNNNNNNNNNNNNNLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLNNNLLLLNNNNLLLLLLLLNLLLLLLLLLLLLLLLLLLLLNNLLLLLLLLLLLLLL##LLLLLLLNNNNN", 'X' },
+  { "NNNLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLNNNLLLLNNNNNNNNNNNNNLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLNNLLLNNNNNNNNNNNNNNLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLNNNLLLLNNNNNNNNLLLLNLLLLLLLLLLLLLLLLLLLLNNLLLLLLLLLLLL##NNNNNNNNNNNNNN", 'X' },
+  { "NNLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLNNNLLNLNNNLLLLLLLLLNNNNNNNNNNLLLLLLLLLLLLLLLLLLLLLLLLLLLNNNNNNNNNNNNNNNNNLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLNLLLLLLLLLLLLNLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLNNNNNN#NLLLLL", 'X' },
+  { "LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLNNNNNNNLLLLNNNNNNNNNNNNNNNNNNLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLNNNLLLLLLLLLLLLLLLNNLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL", 'X' },
+  { "LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLNNNLLLLLLLLLNLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLNNNNLLLLLLLNNNNNLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL", 'X' },
+  { "LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLNLLNNNNNNN#####LLLLLLLNNNNNNNNLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLNLLNNNNNNNNNLLLLLLLLLLNNNNNNNLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL", 'X' },
+  { "LLLLLLLLLLLLLLLLLLLLLLLLNNLLLLLLLLLLLLLLLLLLLLLLLLLLLNLNLNNNNNLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLNNNNNNNNNNNNNNNNNNNNLNNNNNLNNLLLLNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNLLLLLLLLLNLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL", 'X' },
+  { "LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLNNNNLNNNNNNLNLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLNNLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL", 'X' },
+  { NULL, 'L' },
+  { NULL, 'L' },
+  { NULL, 'L' },
+  { NULL, 'L' },
+  { NULL, 'L' },
+  { "LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLNNNNNNNNNNLLLLLLLLLLLLLLLLLLLLLLLLLLNNLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL", 'X' },
+  { "LLLLLLLLLLLLLLLLLLNNNLLLLLLLLLLLLLLLLLLLLLLLLLLLLLNNNLLLLLLLLLLLLLLLLLLLLLLLLLLLLLNNLLLLLLLLLLLLLLLLLLLLLLLLLLLLLNNNLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLNNNNNNNLLLLLLLLNLLNNNNNNNNNNNLLLLLLL#LNLLLLLLLLLLLLNNNNNNNNNNNNNNNNNNNNNN", 'X' },
+  { "NNNNNNNNNNNNNNNLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLNLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL", 'X' },
+  { "LLLLLLLLLLLLLLLLLLLLLLLLLLLLLNNNNNNLLLLNNNNNLLLLLLNLLLLLLNNNNNNNNNNNNNLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN", 'X' },
+  { NULL, 'L' },
+  { NULL, 'L' },
+  { NULL, 'L' },
+  { NULL, 'L' },
+  { NULL, 'L' },
+  { "LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLNLNNNLLLLLLLLLLLNNNLLLLLLLLLLLLNNNNLLLLLLLLLLLLLNNNLLLLLLLLLLLLLNNN", 'X' },
+  { "NNNNNNNNNNNNNNLRNNNNNNNNNNNNNNNNNNNNNNNNNNLRNLRN#####NNNNNNNNNNNNNNN#NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN#L##########NNNL############NNN###################################NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN", 'X' },
+  { "NNLNNNNLNNLLLLLLLLLLNLNNNLLLLLNNNNNNLNLNLNLLLL#LLLNLLLLLLLNNLLLLNNNNNLLLLLNNNNNNNNNNNNNNNNNNNNNNLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN", 'X' },
+  { "NNNNNNNNNNNNNNNNNN##NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN", 'X' },
+  { "NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLNNNNNNNNNNNNNNNNNNNNNNNNNNLNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN", 'X' },
+  { "NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN####################LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLNNNNNNNNNNNNNNNNNNNNNN", 'X' },
+  { NULL, 'N' },
+  { NULL, 'N' },
+  { NULL, 'N' },
+  { NULL, 'L' },
+  { NULL, 'N' },
+  { NULL, 'N' },
+  { NULL, 'N' },
+  { NULL, 'N' },
+  { NULL, 'N' },
+  { NULL, 'N' },
+  { NULL, 'N' },
+  { "NNNNNLLLNNNNNNNNNNNNNNNNNNNNNNNNNLLLLLLLLLNNNNNNNLLLLLNNLLLLLNNNLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLNNNNNNLLLNLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLNLLLL", 'X' },
+  { NULL, 'L' },
+  { "LLLLLLLLLLLLLLLLLLLLLLLLLLLLLNNLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLNNNNNNNNNNNNNNNNNNNNNNNNNNNNLLLLLLLLLLLLLLLLLLLLLLLLLLLLNNLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLNNNNNNNNNNNNNNNLLLLLLLLLLLLNNNNLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL", 'X' },
+  { "LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLNNNNLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLNNLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLN", 'X' },
+  { NULL, 'L' },
+  { NULL, 'L' },
+  { NULL, 'L' },
+  { NULL, 'L' },
+  { NULL, 'L' },
+  { NULL, 'L' },
+  { NULL, 'L' },
+  { NULL, 'L' },
+  { NULL, 'L' },
+  { NULL, 'L' },
+  { NULL, 'L' },
+  { NULL, 'L' },
+  { NULL, 'L' },
+  { NULL, 'L' },
+  { NULL, 'L' },
+  { NULL, 'L' },
+  { NULL, 'L' },
+  { NULL, 'L' },
+  { NULL, 'L' },
+  { NULL, 'L' },
+  { NULL, 'L' },
+  { NULL, 'L' },
+  { NULL, 'L' },
+  { NULL, 'L' },
+  { NULL, 'L' },
+  { "LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN", 'X' },
+  { NULL, 'L' },
+  { NULL, 'L' },
+  { NULL, 'L' },
+  { NULL, 'L' },
+  { NULL, 'L' },
+  { NULL, 'L' },
+  { NULL, 'L' },
+  { NULL, 'L' },
+  { NULL, 'L' },
+  { NULL, 'L' },
+  { NULL, 'L' },
+  { NULL, 'L' },
+  { NULL, 'L' },
+  { NULL, 'L' },
+  { NULL, 'L' },
+  { NULL, 'L' },
+  { NULL, 'L' },
+  { NULL, 'L' },
+  { NULL, 'L' },
+  { NULL, 'L' },
+  { NULL, 'L' },
+  { NULL, 'L' },
+  { NULL, 'L' },
+  { NULL, 'L' },
+  { NULL, 'L' },
+  { NULL, 'L' },
+  { NULL, 'L' },
+  { NULL, 'L' },
+  { NULL, 'L' },
+  { NULL, 'L' },
+  { NULL, 'L' },
+  { NULL, 'L' },
+  { NULL, 'L' },
+  { NULL, 'L' },
+  { NULL, 'L' },
+  { NULL, 'L' },
+  { NULL, 'L' },
+  { NULL, 'L' },
+  { NULL, 'L' },
+  { NULL, 'L' },
+  { NULL, 'L' },
+  { NULL, 'L' },
+  { NULL, 'L' },
+  { NULL, 'L' },
+  { NULL, 'L' },
+  { NULL, 'L' },
+  { NULL, 'L' },
+  { NULL, 'L' },
+  { NULL, 'L' },
+  { NULL, 'L' },
+  { NULL, 'L' },
+  { NULL, 'L' },
+  { NULL, 'L' },
+  { NULL, 'L' },
+  { NULL, 'L' },
+  { NULL, 'L' },
+  { NULL, 'L' },
+  { NULL, 'L' },
+  { NULL, 'L' },
+  { NULL, 'L' },
+  { NULL, 'L' },
+  { NULL, 'L' },
+  { NULL, 'L' },
+  { NULL, 'L' },
+  { NULL, 'L' },
+  { NULL, 'L' },
+  { NULL, 'L' },
+  { NULL, 'L' },
+  { NULL, 'L' },
+  { NULL, 'L' },
+  { NULL, 'L' },
+  { NULL, 'L' },
+  { NULL, 'L' },
+  { NULL, 'L' },
+  { NULL, 'L' },
+  { NULL, 'L' },
+  { NULL, 'L' },
+  { NULL, 'L' },
+  { NULL, 'L' },
+  { NULL, 'L' },
+  { NULL, 'L' },
+  { NULL, 'L' },
+  { NULL, 'L' },
+  { NULL, 'L' },
+  { NULL, 'L' },
+  { NULL, 'L' },
+  { "LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL", 'X' },
+  { NULL, 'L' },
+  { NULL, 'L' },
+  { NULL, 'L' },
+  { NULL, 'L' },
+  { NULL, 'L' },
+  { NULL, 'L' },
+  { NULL, 'L' },
+  { NULL, 'L' },
+  { NULL, 'L' },
+  { NULL, 'L' },
+  { NULL, 'L' },
+  { NULL, 'L' },
+  { NULL, 'L' },
+  { NULL, 'L' },
+  { NULL, 'L' },
+  { NULL, 'L' },
+  { NULL, 'L' },
+  { NULL, 'L' },
+  { NULL, 'L' },
+  { NULL, 'L' },
+  { NULL, 'L' },
+  { NULL, 'L' },
+  { NULL, 'L' },
+  { NULL, 'L' },
+  { NULL, 'L' },
+  { NULL, 'L' },
+  { NULL, 'L' },
+  { NULL, 'L' },
+  { NULL, 'L' },
+  { NULL, 'L' },
+  { NULL, 'L' },
+  { NULL, 'L' },
+  { NULL, 'L' },
+  { NULL, 'L' },
+  { NULL, 'L' },
+  { NULL, 'L' },
+  { NULL, 'L' },
+  { NULL, 'L' },
+  { NULL, 'L' },
+  { NULL, 'L' },
+  { NULL, 'L' },
+  { NULL, 'L' },
+  { NULL, 'L' },
+  { NULL, 'L' },
+  { NULL, 'L' },
+  { NULL, 'L' },
+  { NULL, 'L' },
+  { NULL, 'L' },
+  { NULL, 'L' },
+  { NULL, 'L' },
+  { NULL, 'L' },
+  { NULL, 'L' },
+  { NULL, 'L' },
+  { NULL, 'L' },
+  { NULL, 'L' },
+  { NULL, 'L' },
+  { NULL, 'L' },
+  { NULL, 'L' },
+  { NULL, 'L' },
+  { NULL, 'L' },
+  { NULL, 'L' },
+  { NULL, 'L' },
+  { NULL, 'L' },
+  { NULL, 'L' },
+  { NULL, 'L' },
+  { NULL, 'L' },
+  { NULL, 'L' },
+  { NULL, 'L' },
+  { NULL, 'L' },
+  { NULL, 'L' },
+  { NULL, 'L' },
+  { NULL, 'L' },
+  { NULL, 'L' },
+  { NULL, 'L' },
+  { NULL, 'L' },
+  { NULL, 'L' },
+  { NULL, 'L' },
+  { NULL, 'L' },
+  { NULL, 'L' },
+  { NULL, 'L' },
+  { NULL, 'L' },
+  { NULL, 'L' },
+  { NULL, 'L' },
+  { NULL, 'L' },
+  { NULL, 'L' },
+  { NULL, 'L' },
+  { "LLLLLLLLLLLLLLLLLLLLLLLLRRRRRRNRRRRRRRRRR#RRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRR", 'X' },
+  { NULL, 'R' },
+  { "RRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRNNRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRNNN", 'X' },
+  { "NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN#N#NN#NNNNNNNNN#NN##NNNNN##NRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRNNN", 'X' },
+  { "NNN###NNNNN################NNNNNNLLLLLLLLLLLLLLLLLLLLLLLLLLNNNNNNLLLLLLLLLLLLLLLLLLLLLLLLLLNNNNNNNNNNNLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL#####NNN##NNNNNNNNNNNNNNNNNNNNNNNLL", 'X' }
+};
+
+static const UnicodeCaseTableVector caseTable00 = {{
+  0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007,
+  0x0008, 0x0009, 0x000a, 0x000b, 0x000c, 0x000d, 0x000e, 0x000f,
+  0x0010, 0x0011, 0x0012, 0x0013, 0x0014, 0x0015, 0x0016, 0x0017,
+  0x0018, 0x0019, 0x001a, 0x001b, 0x001c, 0x001d, 0x001e, 0x001f,
+  0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027,
+  0x0028, 0x0029, 0x002a, 0x002b, 0x002c, 0x002d, 0x002e, 0x002f,
+  0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037,
+  0x0038, 0x0039, 0x003a, 0x003b, 0x003c, 0x003d, 0x003e, 0x003f,
+  0x0040, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067,
+  0x0068, 0x0069, 0x006a, 0x006b, 0x006c, 0x006d, 0x006e, 0x006f,
+  0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077,
+  0x0078, 0x0079, 0x007a, 0x005b, 0x005c, 0x005d, 0x005e, 0x005f,
+  0x0060, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067,
+  0x0068, 0x0069, 0x006a, 0x006b, 0x006c, 0x006d, 0x006e, 0x006f,
+  0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077,
+  0x0078, 0x0079, 0x007a, 0x007b, 0x007c, 0x007d, 0x007e, 0x007f,
+  0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087,
+  0x0088, 0x0089, 0x008a, 0x008b, 0x008c, 0x008d, 0x008e, 0x008f,
+  0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095, 0x0096, 0x0097,
+  0x0098, 0x0099, 0x009a, 0x009b, 0x009c, 0x009d, 0x009e, 0x009f,
+  0x00a0, 0x00a1, 0x00a2, 0x00a3, 0x00a4, 0x00a5, 0x00a6, 0x00a7,
+  0x00a8, 0x00a9, 0x00aa, 0x00ab, 0x00ac, 0x00ad, 0x00ae, 0x00af,
+  0x00b0, 0x00b1, 0x00b2, 0x00b3, 0x00b4, 0x03bc, 0x00b6, 0x00b7,
+  0x00b8, 0x00b9, 0x00ba, 0x00bb, 0x00bc, 0x00bd, 0x00be, 0x00bf,
+  0x00e0, 0x00e1, 0x00e2, 0x00e3, 0x00e4, 0x00e5, 0x00e6, 0x00e7,
+  0x00e8, 0x00e9, 0x00ea, 0x00eb, 0x00ec, 0x00ed, 0x00ee, 0x00ef,
+  0x00f0, 0x00f1, 0x00f2, 0x00f3, 0x00f4, 0x00f5, 0x00f6, 0x00d7,
+  0x00f8, 0x00f9, 0x00fa, 0x00fb, 0x00fc, 0x00fd, 0x00fe, 0x00df,
+  0x00e0, 0x00e1, 0x00e2, 0x00e3, 0x00e4, 0x00e5, 0x00e6, 0x00e7,
+  0x00e8, 0x00e9, 0x00ea, 0x00eb, 0x00ec, 0x00ed, 0x00ee, 0x00ef,
+  0x00f0, 0x00f1, 0x00f2, 0x00f3, 0x00f4, 0x00f5, 0x00f6, 0x00f7,
+  0x00f8, 0x00f9, 0x00fa, 0x00fb, 0x00fc, 0x00fd, 0x00fe, 0x00ff
+}};
+static const UnicodeCaseTableVector caseTable01 = {{
+  0x0101, 0x0101, 0x0103, 0x0103, 0x0105, 0x0105, 0x0107, 0x0107,
+  0x0109, 0x0109, 0x010b, 0x010b, 0x010d, 0x010d, 0x010f, 0x010f,
+  0x0111, 0x0111, 0x0113, 0x0113, 0x0115, 0x0115, 0x0117, 0x0117,
+  0x0119, 0x0119, 0x011b, 0x011b, 0x011d, 0x011d, 0x011f, 0x011f,
+  0x0121, 0x0121, 0x0123, 0x0123, 0x0125, 0x0125, 0x0127, 0x0127,
+  0x0129, 0x0129, 0x012b, 0x012b, 0x012d, 0x012d, 0x012f, 0x012f,
+  0x0130, 0x0131, 0x0133, 0x0133, 0x0135, 0x0135, 0x0137, 0x0137,
+  0x0138, 0x013a, 0x013a, 0x013c, 0x013c, 0x013e, 0x013e, 0x0140,
+  0x0140, 0x0142, 0x0142, 0x0144, 0x0144, 0x0146, 0x0146, 0x0148,
+  0x0148, 0x0149, 0x014b, 0x014b, 0x014d, 0x014d, 0x014f, 0x014f,
+  0x0151, 0x0151, 0x0153, 0x0153, 0x0155, 0x0155, 0x0157, 0x0157,
+  0x0159, 0x0159, 0x015b, 0x015b, 0x015d, 0x015d, 0x015f, 0x015f,
+  0x0161, 0x0161, 0x0163, 0x0163, 0x0165, 0x0165, 0x0167, 0x0167,
+  0x0169, 0x0169, 0x016b, 0x016b, 0x016d, 0x016d, 0x016f, 0x016f,
+  0x0171, 0x0171, 0x0173, 0x0173, 0x0175, 0x0175, 0x0177, 0x0177,
+  0x00ff, 0x017a, 0x017a, 0x017c, 0x017c, 0x017e, 0x017e, 0x0073,
+  0x0180, 0x0253, 0x0183, 0x0183, 0x0185, 0x0185, 0x0254, 0x0188,
+  0x0188, 0x0256, 0x0257, 0x018c, 0x018c, 0x018d, 0x01dd, 0x0259,
+  0x025b, 0x0192, 0x0192, 0x0260, 0x0263, 0x0195, 0x0269, 0x0268,
+  0x0199, 0x0199, 0x019a, 0x019b, 0x026f, 0x0272, 0x019e, 0x0275,
+  0x01a1, 0x01a1, 0x01a3, 0x01a3, 0x01a5, 0x01a5, 0x0280, 0x01a8,
+  0x01a8, 0x0283, 0x01aa, 0x01ab, 0x01ad, 0x01ad, 0x0288, 0x01b0,
+  0x01b0, 0x028a, 0x028b, 0x01b4, 0x01b4, 0x01b6, 0x01b6, 0x0292,
+  0x01b9, 0x01b9, 0x01ba, 0x01bb, 0x01bd, 0x01bd, 0x01be, 0x01bf,
+  0x01c0, 0x01c1, 0x01c2, 0x01c3, 0x01c6, 0x01c6, 0x01c6, 0x01c9,
+  0x01c9, 0x01c9, 0x01cc, 0x01cc, 0x01cc, 0x01ce, 0x01ce, 0x01d0,
+  0x01d0, 0x01d2, 0x01d2, 0x01d4, 0x01d4, 0x01d6, 0x01d6, 0x01d8,
+  0x01d8, 0x01da, 0x01da, 0x01dc, 0x01dc, 0x01dd, 0x01df, 0x01df,
+  0x01e1, 0x01e1, 0x01e3, 0x01e3, 0x01e5, 0x01e5, 0x01e7, 0x01e7,
+  0x01e9, 0x01e9, 0x01eb, 0x01eb, 0x01ed, 0x01ed, 0x01ef, 0x01ef,
+  0x01f0, 0x01f3, 0x01f3, 0x01f3, 0x01f5, 0x01f5, 0x0195, 0x01bf,
+  0x01f9, 0x01f9, 0x01fb, 0x01fb, 0x01fd, 0x01fd, 0x01ff, 0x01ff
+}};
+static const UnicodeCaseTableVector caseTable02 = {{
+  0x0201, 0x0201, 0x0203, 0x0203, 0x0205, 0x0205, 0x0207, 0x0207,
+  0x0209, 0x0209, 0x020b, 0x020b, 0x020d, 0x020d, 0x020f, 0x020f,
+  0x0211, 0x0211, 0x0213, 0x0213, 0x0215, 0x0215, 0x0217, 0x0217,
+  0x0219, 0x0219, 0x021b, 0x021b, 0x021d, 0x021d, 0x021f, 0x021f,
+  0x019e, 0x0221, 0x0223, 0x0223, 0x0225, 0x0225, 0x0227, 0x0227,
+  0x0229, 0x0229, 0x022b, 0x022b, 0x022d, 0x022d, 0x022f, 0x022f,
+  0x0231, 0x0231, 0x0233, 0x0233, 0x0234, 0x0235, 0x0236, 0x0237,
+  0x0238, 0x0239, 0x023a, 0x023b, 0x023c, 0x023d, 0x023e, 0x023f,
+  0x0240, 0x0241, 0x0242, 0x0243, 0x0244, 0x0245, 0x0246, 0x0247,
+  0x0248, 0x0249, 0x024a, 0x024b, 0x024c, 0x024d, 0x024e, 0x024f,
+  0x0250, 0x0251, 0x0252, 0x0253, 0x0254, 0x0255, 0x0256, 0x0257,
+  0x0258, 0x0259, 0x025a, 0x025b, 0x025c, 0x025d, 0x025e, 0x025f,
+  0x0260, 0x0261, 0x0262, 0x0263, 0x0264, 0x0265, 0x0266, 0x0267,
+  0x0268, 0x0269, 0x026a, 0x026b, 0x026c, 0x026d, 0x026e, 0x026f,
+  0x0270, 0x0271, 0x0272, 0x0273, 0x0274, 0x0275, 0x0276, 0x0277,
+  0x0278, 0x0279, 0x027a, 0x027b, 0x027c, 0x027d, 0x027e, 0x027f,
+  0x0280, 0x0281, 0x0282, 0x0283, 0x0284, 0x0285, 0x0286, 0x0287,
+  0x0288, 0x0289, 0x028a, 0x028b, 0x028c, 0x028d, 0x028e, 0x028f,
+  0x0290, 0x0291, 0x0292, 0x0293, 0x0294, 0x0295, 0x0296, 0x0297,
+  0x0298, 0x0299, 0x029a, 0x029b, 0x029c, 0x029d, 0x029e, 0x029f,
+  0x02a0, 0x02a1, 0x02a2, 0x02a3, 0x02a4, 0x02a5, 0x02a6, 0x02a7,
+  0x02a8, 0x02a9, 0x02aa, 0x02ab, 0x02ac, 0x02ad, 0x02ae, 0x02af,
+  0x02b0, 0x02b1, 0x02b2, 0x02b3, 0x02b4, 0x02b5, 0x02b6, 0x02b7,
+  0x02b8, 0x02b9, 0x02ba, 0x02bb, 0x02bc, 0x02bd, 0x02be, 0x02bf,
+  0x02c0, 0x02c1, 0x02c2, 0x02c3, 0x02c4, 0x02c5, 0x02c6, 0x02c7,
+  0x02c8, 0x02c9, 0x02ca, 0x02cb, 0x02cc, 0x02cd, 0x02ce, 0x02cf,
+  0x02d0, 0x02d1, 0x02d2, 0x02d3, 0x02d4, 0x02d5, 0x02d6, 0x02d7,
+  0x02d8, 0x02d9, 0x02da, 0x02db, 0x02dc, 0x02dd, 0x02de, 0x02df,
+  0x02e0, 0x02e1, 0x02e2, 0x02e3, 0x02e4, 0x02e5, 0x02e6, 0x02e7,
+  0x02e8, 0x02e9, 0x02ea, 0x02eb, 0x02ec, 0x02ed, 0x02ee, 0x02ef,
+  0x02f0, 0x02f1, 0x02f2, 0x02f3, 0x02f4, 0x02f5, 0x02f6, 0x02f7,
+  0x02f8, 0x02f9, 0x02fa, 0x02fb, 0x02fc, 0x02fd, 0x02fe, 0x02ff
+}};
+static const UnicodeCaseTableVector caseTable03 = {{
+  0x0300, 0x0301, 0x0302, 0x0303, 0x0304, 0x0305, 0x0306, 0x0307,
+  0x0308, 0x0309, 0x030a, 0x030b, 0x030c, 0x030d, 0x030e, 0x030f,
+  0x0310, 0x0311, 0x0312, 0x0313, 0x0314, 0x0315, 0x0316, 0x0317,
+  0x0318, 0x0319, 0x031a, 0x031b, 0x031c, 0x031d, 0x031e, 0x031f,
+  0x0320, 0x0321, 0x0322, 0x0323, 0x0324, 0x0325, 0x0326, 0x0327,
+  0x0328, 0x0329, 0x032a, 0x032b, 0x032c, 0x032d, 0x032e, 0x032f,
+  0x0330, 0x0331, 0x0332, 0x0333, 0x0334, 0x0335, 0x0336, 0x0337,
+  0x0338, 0x0339, 0x033a, 0x033b, 0x033c, 0x033d, 0x033e, 0x033f,
+  0x0340, 0x0341, 0x0342, 0x0343, 0x0344, 0x03b9, 0x0346, 0x0347,
+  0x0348, 0x0349, 0x034a, 0x034b, 0x034c, 0x034d, 0x034e, 0x034f,
+  0x0350, 0x0351, 0x0352, 0x0353, 0x0354, 0x0355, 0x0356, 0x0357,
+  0x0358, 0x0359, 0x035a, 0x035b, 0x035c, 0x035d, 0x035e, 0x035f,
+  0x0360, 0x0361, 0x0362, 0x0363, 0x0364, 0x0365, 0x0366, 0x0367,
+  0x0368, 0x0369, 0x036a, 0x036b, 0x036c, 0x036d, 0x036e, 0x036f,
+  0x0370, 0x0371, 0x0372, 0x0373, 0x0374, 0x0375, 0x0376, 0x0377,
+  0x0378, 0x0379, 0x037a, 0x037b, 0x037c, 0x037d, 0x037e, 0x037f,
+  0x0380, 0x0381, 0x0382, 0x0383, 0x0384, 0x0385, 0x03ac, 0x0387,
+  0x03ad, 0x03ae, 0x03af, 0x038b, 0x03cc, 0x038d, 0x03cd, 0x03ce,
+  0x0390, 0x03b1, 0x03b2, 0x03b3, 0x03b4, 0x03b5, 0x03b6, 0x03b7,
+  0x03b8, 0x03b9, 0x03ba, 0x03bb, 0x03bc, 0x03bd, 0x03be, 0x03bf,
+  0x03c0, 0x03c1, 0x03a2, 0x03c3, 0x03c4, 0x03c5, 0x03c6, 0x03c7,
+  0x03c8, 0x03c9, 0x03ca, 0x03cb, 0x03ac, 0x03ad, 0x03ae, 0x03af,
+  0x03b0, 0x03b1, 0x03b2, 0x03b3, 0x03b4, 0x03b5, 0x03b6, 0x03b7,
+  0x03b8, 0x03b9, 0x03ba, 0x03bb, 0x03bc, 0x03bd, 0x03be, 0x03bf,
+  0x03c0, 0x03c1, 0x03c3, 0x03c3, 0x03c4, 0x03c5, 0x03c6, 0x03c7,
+  0x03c8, 0x03c9, 0x03ca, 0x03cb, 0x03cc, 0x03cd, 0x03ce, 0x03cf,
+  0x03b2, 0x03b8, 0x03d2, 0x03d3, 0x03d4, 0x03c6, 0x03c0, 0x03d7,
+  0x03d9, 0x03d9, 0x03db, 0x03db, 0x03dd, 0x03dd, 0x03df, 0x03df,
+  0x03e1, 0x03e1, 0x03e3, 0x03e3, 0x03e5, 0x03e5, 0x03e7, 0x03e7,
+  0x03e9, 0x03e9, 0x03eb, 0x03eb, 0x03ed, 0x03ed, 0x03ef, 0x03ef,
+  0x03ba, 0x03c1, 0x03f2, 0x03f3, 0x03b8, 0x03b5, 0x03f6, 0x03f8,
+  0x03f8, 0x03f2, 0x03fb, 0x03fb, 0x03fc, 0x03fd, 0x03fe, 0x03ff
+}};
+static const UnicodeCaseTableVector caseTable04 = {{
+  0x0450, 0x0451, 0x0452, 0x0453, 0x0454, 0x0455, 0x0456, 0x0457,
+  0x0458, 0x0459, 0x045a, 0x045b, 0x045c, 0x045d, 0x045e, 0x045f,
+  0x0430, 0x0431, 0x0432, 0x0433, 0x0434, 0x0435, 0x0436, 0x0437,
+  0x0438, 0x0439, 0x043a, 0x043b, 0x043c, 0x043d, 0x043e, 0x043f,
+  0x0440, 0x0441, 0x0442, 0x0443, 0x0444, 0x0445, 0x0446, 0x0447,
+  0x0448, 0x0449, 0x044a, 0x044b, 0x044c, 0x044d, 0x044e, 0x044f,
+  0x0430, 0x0431, 0x0432, 0x0433, 0x0434, 0x0435, 0x0436, 0x0437,
+  0x0438, 0x0439, 0x043a, 0x043b, 0x043c, 0x043d, 0x043e, 0x043f,
+  0x0440, 0x0441, 0x0442, 0x0443, 0x0444, 0x0445, 0x0446, 0x0447,
+  0x0448, 0x0449, 0x044a, 0x044b, 0x044c, 0x044d, 0x044e, 0x044f,
+  0x0450, 0x0451, 0x0452, 0x0453, 0x0454, 0x0455, 0x0456, 0x0457,
+  0x0458, 0x0459, 0x045a, 0x045b, 0x045c, 0x045d, 0x045e, 0x045f,
+  0x0461, 0x0461, 0x0463, 0x0463, 0x0465, 0x0465, 0x0467, 0x0467,
+  0x0469, 0x0469, 0x046b, 0x046b, 0x046d, 0x046d, 0x046f, 0x046f,
+  0x0471, 0x0471, 0x0473, 0x0473, 0x0475, 0x0475, 0x0477, 0x0477,
+  0x0479, 0x0479, 0x047b, 0x047b, 0x047d, 0x047d, 0x047f, 0x047f,
+  0x0481, 0x0481, 0x0482, 0x0483, 0x0484, 0x0485, 0x0486, 0x0487,
+  0x0488, 0x0489, 0x048b, 0x048b, 0x048d, 0x048d, 0x048f, 0x048f,
+  0x0491, 0x0491, 0x0493, 0x0493, 0x0495, 0x0495, 0x0497, 0x0497,
+  0x0499, 0x0499, 0x049b, 0x049b, 0x049d, 0x049d, 0x049f, 0x049f,
+  0x04a1, 0x04a1, 0x04a3, 0x04a3, 0x04a5, 0x04a5, 0x04a7, 0x04a7,
+  0x04a9, 0x04a9, 0x04ab, 0x04ab, 0x04ad, 0x04ad, 0x04af, 0x04af,
+  0x04b1, 0x04b1, 0x04b3, 0x04b3, 0x04b5, 0x04b5, 0x04b7, 0x04b7,
+  0x04b9, 0x04b9, 0x04bb, 0x04bb, 0x04bd, 0x04bd, 0x04bf, 0x04bf,
+  0x04c0, 0x04c2, 0x04c2, 0x04c4, 0x04c4, 0x04c6, 0x04c6, 0x04c8,
+  0x04c8, 0x04ca, 0x04ca, 0x04cc, 0x04cc, 0x04ce, 0x04ce, 0x04cf,
+  0x04d1, 0x04d1, 0x04d3, 0x04d3, 0x04d5, 0x04d5, 0x04d7, 0x04d7,
+  0x04d9, 0x04d9, 0x04db, 0x04db, 0x04dd, 0x04dd, 0x04df, 0x04df,
+  0x04e1, 0x04e1, 0x04e3, 0x04e3, 0x04e5, 0x04e5, 0x04e7, 0x04e7,
+  0x04e9, 0x04e9, 0x04eb, 0x04eb, 0x04ed, 0x04ed, 0x04ef, 0x04ef,
+  0x04f1, 0x04f1, 0x04f3, 0x04f3, 0x04f5, 0x04f5, 0x04f6, 0x04f7,
+  0x04f9, 0x04f9, 0x04fa, 0x04fb, 0x04fc, 0x04fd, 0x04fe, 0x04ff
+}};
+static const UnicodeCaseTableVector caseTable05 = {{
+  0x0501, 0x0501, 0x0503, 0x0503, 0x0505, 0x0505, 0x0507, 0x0507,
+  0x0509, 0x0509, 0x050b, 0x050b, 0x050d, 0x050d, 0x050f, 0x050f,
+  0x0510, 0x0511, 0x0512, 0x0513, 0x0514, 0x0515, 0x0516, 0x0517,
+  0x0518, 0x0519, 0x051a, 0x051b, 0x051c, 0x051d, 0x051e, 0x051f,
+  0x0520, 0x0521, 0x0522, 0x0523, 0x0524, 0x0525, 0x0526, 0x0527,
+  0x0528, 0x0529, 0x052a, 0x052b, 0x052c, 0x052d, 0x052e, 0x052f,
+  0x0530, 0x0561, 0x0562, 0x0563, 0x0564, 0x0565, 0x0566, 0x0567,
+  0x0568, 0x0569, 0x056a, 0x056b, 0x056c, 0x056d, 0x056e, 0x056f,
+  0x0570, 0x0571, 0x0572, 0x0573, 0x0574, 0x0575, 0x0576, 0x0577,
+  0x0578, 0x0579, 0x057a, 0x057b, 0x057c, 0x057d, 0x057e, 0x057f,
+  0x0580, 0x0581, 0x0582, 0x0583, 0x0584, 0x0585, 0x0586, 0x0557,
+  0x0558, 0x0559, 0x055a, 0x055b, 0x055c, 0x055d, 0x055e, 0x055f,
+  0x0560, 0x0561, 0x0562, 0x0563, 0x0564, 0x0565, 0x0566, 0x0567,
+  0x0568, 0x0569, 0x056a, 0x056b, 0x056c, 0x056d, 0x056e, 0x056f,
+  0x0570, 0x0571, 0x0572, 0x0573, 0x0574, 0x0575, 0x0576, 0x0577,
+  0x0578, 0x0579, 0x057a, 0x057b, 0x057c, 0x057d, 0x057e, 0x057f,
+  0x0580, 0x0581, 0x0582, 0x0583, 0x0584, 0x0585, 0x0586, 0x0587,
+  0x0588, 0x0589, 0x058a, 0x058b, 0x058c, 0x058d, 0x058e, 0x058f,
+  0x0590, 0x0591, 0x0592, 0x0593, 0x0594, 0x0595, 0x0596, 0x0597,
+  0x0598, 0x0599, 0x059a, 0x059b, 0x059c, 0x059d, 0x059e, 0x059f,
+  0x05a0, 0x05a1, 0x05a2, 0x05a3, 0x05a4, 0x05a5, 0x05a6, 0x05a7,
+  0x05a8, 0x05a9, 0x05aa, 0x05ab, 0x05ac, 0x05ad, 0x05ae, 0x05af,
+  0x05b0, 0x05b1, 0x05b2, 0x05b3, 0x05b4, 0x05b5, 0x05b6, 0x05b7,
+  0x05b8, 0x05b9, 0x05ba, 0x05bb, 0x05bc, 0x05bd, 0x05be, 0x05bf,
+  0x05c0, 0x05c1, 0x05c2, 0x05c3, 0x05c4, 0x05c5, 0x05c6, 0x05c7,
+  0x05c8, 0x05c9, 0x05ca, 0x05cb, 0x05cc, 0x05cd, 0x05ce, 0x05cf,
+  0x05d0, 0x05d1, 0x05d2, 0x05d3, 0x05d4, 0x05d5, 0x05d6, 0x05d7,
+  0x05d8, 0x05d9, 0x05da, 0x05db, 0x05dc, 0x05dd, 0x05de, 0x05df,
+  0x05e0, 0x05e1, 0x05e2, 0x05e3, 0x05e4, 0x05e5, 0x05e6, 0x05e7,
+  0x05e8, 0x05e9, 0x05ea, 0x05eb, 0x05ec, 0x05ed, 0x05ee, 0x05ef,
+  0x05f0, 0x05f1, 0x05f2, 0x05f3, 0x05f4, 0x05f5, 0x05f6, 0x05f7,
+  0x05f8, 0x05f9, 0x05fa, 0x05fb, 0x05fc, 0x05fd, 0x05fe, 0x05ff
+}};
+static const UnicodeCaseTableVector caseTable1e = {{
+  0x1e01, 0x1e01, 0x1e03, 0x1e03, 0x1e05, 0x1e05, 0x1e07, 0x1e07,
+  0x1e09, 0x1e09, 0x1e0b, 0x1e0b, 0x1e0d, 0x1e0d, 0x1e0f, 0x1e0f,
+  0x1e11, 0x1e11, 0x1e13, 0x1e13, 0x1e15, 0x1e15, 0x1e17, 0x1e17,
+  0x1e19, 0x1e19, 0x1e1b, 0x1e1b, 0x1e1d, 0x1e1d, 0x1e1f, 0x1e1f,
+  0x1e21, 0x1e21, 0x1e23, 0x1e23, 0x1e25, 0x1e25, 0x1e27, 0x1e27,
+  0x1e29, 0x1e29, 0x1e2b, 0x1e2b, 0x1e2d, 0x1e2d, 0x1e2f, 0x1e2f,
+  0x1e31, 0x1e31, 0x1e33, 0x1e33, 0x1e35, 0x1e35, 0x1e37, 0x1e37,
+  0x1e39, 0x1e39, 0x1e3b, 0x1e3b, 0x1e3d, 0x1e3d, 0x1e3f, 0x1e3f,
+  0x1e41, 0x1e41, 0x1e43, 0x1e43, 0x1e45, 0x1e45, 0x1e47, 0x1e47,
+  0x1e49, 0x1e49, 0x1e4b, 0x1e4b, 0x1e4d, 0x1e4d, 0x1e4f, 0x1e4f,
+  0x1e51, 0x1e51, 0x1e53, 0x1e53, 0x1e55, 0x1e55, 0x1e57, 0x1e57,
+  0x1e59, 0x1e59, 0x1e5b, 0x1e5b, 0x1e5d, 0x1e5d, 0x1e5f, 0x1e5f,
+  0x1e61, 0x1e61, 0x1e63, 0x1e63, 0x1e65, 0x1e65, 0x1e67, 0x1e67,
+  0x1e69, 0x1e69, 0x1e6b, 0x1e6b, 0x1e6d, 0x1e6d, 0x1e6f, 0x1e6f,
+  0x1e71, 0x1e71, 0x1e73, 0x1e73, 0x1e75, 0x1e75, 0x1e77, 0x1e77,
+  0x1e79, 0x1e79, 0x1e7b, 0x1e7b, 0x1e7d, 0x1e7d, 0x1e7f, 0x1e7f,
+  0x1e81, 0x1e81, 0x1e83, 0x1e83, 0x1e85, 0x1e85, 0x1e87, 0x1e87,
+  0x1e89, 0x1e89, 0x1e8b, 0x1e8b, 0x1e8d, 0x1e8d, 0x1e8f, 0x1e8f,
+  0x1e91, 0x1e91, 0x1e93, 0x1e93, 0x1e95, 0x1e95, 0x1e96, 0x1e97,
+  0x1e98, 0x1e99, 0x1e9a, 0x1e61, 0x1e9c, 0x1e9d, 0x1e9e, 0x1e9f,
+  0x1ea1, 0x1ea1, 0x1ea3, 0x1ea3, 0x1ea5, 0x1ea5, 0x1ea7, 0x1ea7,
+  0x1ea9, 0x1ea9, 0x1eab, 0x1eab, 0x1ead, 0x1ead, 0x1eaf, 0x1eaf,
+  0x1eb1, 0x1eb1, 0x1eb3, 0x1eb3, 0x1eb5, 0x1eb5, 0x1eb7, 0x1eb7,
+  0x1eb9, 0x1eb9, 0x1ebb, 0x1ebb, 0x1ebd, 0x1ebd, 0x1ebf, 0x1ebf,
+  0x1ec1, 0x1ec1, 0x1ec3, 0x1ec3, 0x1ec5, 0x1ec5, 0x1ec7, 0x1ec7,
+  0x1ec9, 0x1ec9, 0x1ecb, 0x1ecb, 0x1ecd, 0x1ecd, 0x1ecf, 0x1ecf,
+  0x1ed1, 0x1ed1, 0x1ed3, 0x1ed3, 0x1ed5, 0x1ed5, 0x1ed7, 0x1ed7,
+  0x1ed9, 0x1ed9, 0x1edb, 0x1edb, 0x1edd, 0x1edd, 0x1edf, 0x1edf,
+  0x1ee1, 0x1ee1, 0x1ee3, 0x1ee3, 0x1ee5, 0x1ee5, 0x1ee7, 0x1ee7,
+  0x1ee9, 0x1ee9, 0x1eeb, 0x1eeb, 0x1eed, 0x1eed, 0x1eef, 0x1eef,
+  0x1ef1, 0x1ef1, 0x1ef3, 0x1ef3, 0x1ef5, 0x1ef5, 0x1ef7, 0x1ef7,
+  0x1ef9, 0x1ef9, 0x1efa, 0x1efb, 0x1efc, 0x1efd, 0x1efe, 0x1eff
+}};
+static const UnicodeCaseTableVector caseTable1f = {{
+  0x1f00, 0x1f01, 0x1f02, 0x1f03, 0x1f04, 0x1f05, 0x1f06, 0x1f07,
+  0x1f00, 0x1f01, 0x1f02, 0x1f03, 0x1f04, 0x1f05, 0x1f06, 0x1f07,
+  0x1f10, 0x1f11, 0x1f12, 0x1f13, 0x1f14, 0x1f15, 0x1f16, 0x1f17,
+  0x1f10, 0x1f11, 0x1f12, 0x1f13, 0x1f14, 0x1f15, 0x1f1e, 0x1f1f,
+  0x1f20, 0x1f21, 0x1f22, 0x1f23, 0x1f24, 0x1f25, 0x1f26, 0x1f27,
+  0x1f20, 0x1f21, 0x1f22, 0x1f23, 0x1f24, 0x1f25, 0x1f26, 0x1f27,
+  0x1f30, 0x1f31, 0x1f32, 0x1f33, 0x1f34, 0x1f35, 0x1f36, 0x1f37,
+  0x1f30, 0x1f31, 0x1f32, 0x1f33, 0x1f34, 0x1f35, 0x1f36, 0x1f37,
+  0x1f40, 0x1f41, 0x1f42, 0x1f43, 0x1f44, 0x1f45, 0x1f46, 0x1f47,
+  0x1f40, 0x1f41, 0x1f42, 0x1f43, 0x1f44, 0x1f45, 0x1f4e, 0x1f4f,
+  0x1f50, 0x1f51, 0x1f52, 0x1f53, 0x1f54, 0x1f55, 0x1f56, 0x1f57,
+  0x1f58, 0x1f51, 0x1f5a, 0x1f53, 0x1f5c, 0x1f55, 0x1f5e, 0x1f57,
+  0x1f60, 0x1f61, 0x1f62, 0x1f63, 0x1f64, 0x1f65, 0x1f66, 0x1f67,
+  0x1f60, 0x1f61, 0x1f62, 0x1f63, 0x1f64, 0x1f65, 0x1f66, 0x1f67,
+  0x1f70, 0x1f71, 0x1f72, 0x1f73, 0x1f74, 0x1f75, 0x1f76, 0x1f77,
+  0x1f78, 0x1f79, 0x1f7a, 0x1f7b, 0x1f7c, 0x1f7d, 0x1f7e, 0x1f7f,
+  0x1f80, 0x1f81, 0x1f82, 0x1f83, 0x1f84, 0x1f85, 0x1f86, 0x1f87,
+  0x1f80, 0x1f81, 0x1f82, 0x1f83, 0x1f84, 0x1f85, 0x1f86, 0x1f87,
+  0x1f90, 0x1f91, 0x1f92, 0x1f93, 0x1f94, 0x1f95, 0x1f96, 0x1f97,
+  0x1f90, 0x1f91, 0x1f92, 0x1f93, 0x1f94, 0x1f95, 0x1f96, 0x1f97,
+  0x1fa0, 0x1fa1, 0x1fa2, 0x1fa3, 0x1fa4, 0x1fa5, 0x1fa6, 0x1fa7,
+  0x1fa0, 0x1fa1, 0x1fa2, 0x1fa3, 0x1fa4, 0x1fa5, 0x1fa6, 0x1fa7,
+  0x1fb0, 0x1fb1, 0x1fb2, 0x1fb3, 0x1fb4, 0x1fb5, 0x1fb6, 0x1fb7,
+  0x1fb0, 0x1fb1, 0x1f70, 0x1f71, 0x1fb3, 0x1fbd, 0x03b9, 0x1fbf,
+  0x1fc0, 0x1fc1, 0x1fc2, 0x1fc3, 0x1fc4, 0x1fc5, 0x1fc6, 0x1fc7,
+  0x1f72, 0x1f73, 0x1f74, 0x1f75, 0x1fc3, 0x1fcd, 0x1fce, 0x1fcf,
+  0x1fd0, 0x1fd1, 0x1fd2, 0x1fd3, 0x1fd4, 0x1fd5, 0x1fd6, 0x1fd7,
+  0x1fd0, 0x1fd1, 0x1f76, 0x1f77, 0x1fdc, 0x1fdd, 0x1fde, 0x1fdf,
+  0x1fe0, 0x1fe1, 0x1fe2, 0x1fe3, 0x1fe4, 0x1fe5, 0x1fe6, 0x1fe7,
+  0x1fe0, 0x1fe1, 0x1f7a, 0x1f7b, 0x1fe5, 0x1fed, 0x1fee, 0x1fef,
+  0x1ff0, 0x1ff1, 0x1ff2, 0x1ff3, 0x1ff4, 0x1ff5, 0x1ff6, 0x1ff7,
+  0x1f78, 0x1f79, 0x1f7c, 0x1f7d, 0x1ff3, 0x1ffd, 0x1ffe, 0x1fff
+}};
+static const UnicodeCaseTableVector caseTable21 = {{
+  0x2100, 0x2101, 0x2102, 0x2103, 0x2104, 0x2105, 0x2106, 0x2107,
+  0x2108, 0x2109, 0x210a, 0x210b, 0x210c, 0x210d, 0x210e, 0x210f,
+  0x2110, 0x2111, 0x2112, 0x2113, 0x2114, 0x2115, 0x2116, 0x2117,
+  0x2118, 0x2119, 0x211a, 0x211b, 0x211c, 0x211d, 0x211e, 0x211f,
+  0x2120, 0x2121, 0x2122, 0x2123, 0x2124, 0x2125, 0x03c9, 0x2127,
+  0x2128, 0x2129, 0x006b, 0x00e5, 0x212c, 0x212d, 0x212e, 0x212f,
+  0x2130, 0x2131, 0x2132, 0x2133, 0x2134, 0x2135, 0x2136, 0x2137,
+  0x2138, 0x2139, 0x213a, 0x213b, 0x213c, 0x213d, 0x213e, 0x213f,
+  0x2140, 0x2141, 0x2142, 0x2143, 0x2144, 0x2145, 0x2146, 0x2147,
+  0x2148, 0x2149, 0x214a, 0x214b, 0x214c, 0x214d, 0x214e, 0x214f,
+  0x2150, 0x2151, 0x2152, 0x2153, 0x2154, 0x2155, 0x2156, 0x2157,
+  0x2158, 0x2159, 0x215a, 0x215b, 0x215c, 0x215d, 0x215e, 0x215f,
+  0x2170, 0x2171, 0x2172, 0x2173, 0x2174, 0x2175, 0x2176, 0x2177,
+  0x2178, 0x2179, 0x217a, 0x217b, 0x217c, 0x217d, 0x217e, 0x217f,
+  0x2170, 0x2171, 0x2172, 0x2173, 0x2174, 0x2175, 0x2176, 0x2177,
+  0x2178, 0x2179, 0x217a, 0x217b, 0x217c, 0x217d, 0x217e, 0x217f,
+  0x2180, 0x2181, 0x2182, 0x2183, 0x2184, 0x2185, 0x2186, 0x2187,
+  0x2188, 0x2189, 0x218a, 0x218b, 0x218c, 0x218d, 0x218e, 0x218f,
+  0x2190, 0x2191, 0x2192, 0x2193, 0x2194, 0x2195, 0x2196, 0x2197,
+  0x2198, 0x2199, 0x219a, 0x219b, 0x219c, 0x219d, 0x219e, 0x219f,
+  0x21a0, 0x21a1, 0x21a2, 0x21a3, 0x21a4, 0x21a5, 0x21a6, 0x21a7,
+  0x21a8, 0x21a9, 0x21aa, 0x21ab, 0x21ac, 0x21ad, 0x21ae, 0x21af,
+  0x21b0, 0x21b1, 0x21b2, 0x21b3, 0x21b4, 0x21b5, 0x21b6, 0x21b7,
+  0x21b8, 0x21b9, 0x21ba, 0x21bb, 0x21bc, 0x21bd, 0x21be, 0x21bf,
+  0x21c0, 0x21c1, 0x21c2, 0x21c3, 0x21c4, 0x21c5, 0x21c6, 0x21c7,
+  0x21c8, 0x21c9, 0x21ca, 0x21cb, 0x21cc, 0x21cd, 0x21ce, 0x21cf,
+  0x21d0, 0x21d1, 0x21d2, 0x21d3, 0x21d4, 0x21d5, 0x21d6, 0x21d7,
+  0x21d8, 0x21d9, 0x21da, 0x21db, 0x21dc, 0x21dd, 0x21de, 0x21df,
+  0x21e0, 0x21e1, 0x21e2, 0x21e3, 0x21e4, 0x21e5, 0x21e6, 0x21e7,
+  0x21e8, 0x21e9, 0x21ea, 0x21eb, 0x21ec, 0x21ed, 0x21ee, 0x21ef,
+  0x21f0, 0x21f1, 0x21f2, 0x21f3, 0x21f4, 0x21f5, 0x21f6, 0x21f7,
+  0x21f8, 0x21f9, 0x21fa, 0x21fb, 0x21fc, 0x21fd, 0x21fe, 0x21ff
+}};
+static const UnicodeCaseTableVector caseTable24 = {{
+  0x2400, 0x2401, 0x2402, 0x2403, 0x2404, 0x2405, 0x2406, 0x2407,
+  0x2408, 0x2409, 0x240a, 0x240b, 0x240c, 0x240d, 0x240e, 0x240f,
+  0x2410, 0x2411, 0x2412, 0x2413, 0x2414, 0x2415, 0x2416, 0x2417,
+  0x2418, 0x2419, 0x241a, 0x241b, 0x241c, 0x241d, 0x241e, 0x241f,
+  0x2420, 0x2421, 0x2422, 0x2423, 0x2424, 0x2425, 0x2426, 0x2427,
+  0x2428, 0x2429, 0x242a, 0x242b, 0x242c, 0x242d, 0x242e, 0x242f,
+  0x2430, 0x2431, 0x2432, 0x2433, 0x2434, 0x2435, 0x2436, 0x2437,
+  0x2438, 0x2439, 0x243a, 0x243b, 0x243c, 0x243d, 0x243e, 0x243f,
+  0x2440, 0x2441, 0x2442, 0x2443, 0x2444, 0x2445, 0x2446, 0x2447,
+  0x2448, 0x2449, 0x244a, 0x244b, 0x244c, 0x244d, 0x244e, 0x244f,
+  0x2450, 0x2451, 0x2452, 0x2453, 0x2454, 0x2455, 0x2456, 0x2457,
+  0x2458, 0x2459, 0x245a, 0x245b, 0x245c, 0x245d, 0x245e, 0x245f,
+  0x2460, 0x2461, 0x2462, 0x2463, 0x2464, 0x2465, 0x2466, 0x2467,
+  0x2468, 0x2469, 0x246a, 0x246b, 0x246c, 0x246d, 0x246e, 0x246f,
+  0x2470, 0x2471, 0x2472, 0x2473, 0x2474, 0x2475, 0x2476, 0x2477,
+  0x2478, 0x2479, 0x247a, 0x247b, 0x247c, 0x247d, 0x247e, 0x247f,
+  0x2480, 0x2481, 0x2482, 0x2483, 0x2484, 0x2485, 0x2486, 0x2487,
+  0x2488, 0x2489, 0x248a, 0x248b, 0x248c, 0x248d, 0x248e, 0x248f,
+  0x2490, 0x2491, 0x2492, 0x2493, 0x2494, 0x2495, 0x2496, 0x2497,
+  0x2498, 0x2499, 0x249a, 0x249b, 0x249c, 0x249d, 0x249e, 0x249f,
+  0x24a0, 0x24a1, 0x24a2, 0x24a3, 0x24a4, 0x24a5, 0x24a6, 0x24a7,
+  0x24a8, 0x24a9, 0x24aa, 0x24ab, 0x24ac, 0x24ad, 0x24ae, 0x24af,
+  0x24b0, 0x24b1, 0x24b2, 0x24b3, 0x24b4, 0x24b5, 0x24d0, 0x24d1,
+  0x24d2, 0x24d3, 0x24d4, 0x24d5, 0x24d6, 0x24d7, 0x24d8, 0x24d9,
+  0x24da, 0x24db, 0x24dc, 0x24dd, 0x24de, 0x24df, 0x24e0, 0x24e1,
+  0x24e2, 0x24e3, 0x24e4, 0x24e5, 0x24e6, 0x24e7, 0x24e8, 0x24e9,
+  0x24d0, 0x24d1, 0x24d2, 0x24d3, 0x24d4, 0x24d5, 0x24d6, 0x24d7,
+  0x24d8, 0x24d9, 0x24da, 0x24db, 0x24dc, 0x24dd, 0x24de, 0x24df,
+  0x24e0, 0x24e1, 0x24e2, 0x24e3, 0x24e4, 0x24e5, 0x24e6, 0x24e7,
+  0x24e8, 0x24e9, 0x24ea, 0x24eb, 0x24ec, 0x24ed, 0x24ee, 0x24ef,
+  0x24f0, 0x24f1, 0x24f2, 0x24f3, 0x24f4, 0x24f5, 0x24f6, 0x24f7,
+  0x24f8, 0x24f9, 0x24fa, 0x24fb, 0x24fc, 0x24fd, 0x24fe, 0x24ff
+}};
+static const UnicodeCaseTableVector caseTableff = {{
+  0xff00, 0xff01, 0xff02, 0xff03, 0xff04, 0xff05, 0xff06, 0xff07,
+  0xff08, 0xff09, 0xff0a, 0xff0b, 0xff0c, 0xff0d, 0xff0e, 0xff0f,
+  0xff10, 0xff11, 0xff12, 0xff13, 0xff14, 0xff15, 0xff16, 0xff17,
+  0xff18, 0xff19, 0xff1a, 0xff1b, 0xff1c, 0xff1d, 0xff1e, 0xff1f,
+  0xff20, 0xff41, 0xff42, 0xff43, 0xff44, 0xff45, 0xff46, 0xff47,
+  0xff48, 0xff49, 0xff4a, 0xff4b, 0xff4c, 0xff4d, 0xff4e, 0xff4f,
+  0xff50, 0xff51, 0xff52, 0xff53, 0xff54, 0xff55, 0xff56, 0xff57,
+  0xff58, 0xff59, 0xff5a, 0xff3b, 0xff3c, 0xff3d, 0xff3e, 0xff3f,
+  0xff40, 0xff41, 0xff42, 0xff43, 0xff44, 0xff45, 0xff46, 0xff47,
+  0xff48, 0xff49, 0xff4a, 0xff4b, 0xff4c, 0xff4d, 0xff4e, 0xff4f,
+  0xff50, 0xff51, 0xff52, 0xff53, 0xff54, 0xff55, 0xff56, 0xff57,
+  0xff58, 0xff59, 0xff5a, 0xff5b, 0xff5c, 0xff5d, 0xff5e, 0xff5f,
+  0xff60, 0xff61, 0xff62, 0xff63, 0xff64, 0xff65, 0xff66, 0xff67,
+  0xff68, 0xff69, 0xff6a, 0xff6b, 0xff6c, 0xff6d, 0xff6e, 0xff6f,
+  0xff70, 0xff71, 0xff72, 0xff73, 0xff74, 0xff75, 0xff76, 0xff77,
+  0xff78, 0xff79, 0xff7a, 0xff7b, 0xff7c, 0xff7d, 0xff7e, 0xff7f,
+  0xff80, 0xff81, 0xff82, 0xff83, 0xff84, 0xff85, 0xff86, 0xff87,
+  0xff88, 0xff89, 0xff8a, 0xff8b, 0xff8c, 0xff8d, 0xff8e, 0xff8f,
+  0xff90, 0xff91, 0xff92, 0xff93, 0xff94, 0xff95, 0xff96, 0xff97,
+  0xff98, 0xff99, 0xff9a, 0xff9b, 0xff9c, 0xff9d, 0xff9e, 0xff9f,
+  0xffa0, 0xffa1, 0xffa2, 0xffa3, 0xffa4, 0xffa5, 0xffa6, 0xffa7,
+  0xffa8, 0xffa9, 0xffaa, 0xffab, 0xffac, 0xffad, 0xffae, 0xffaf,
+  0xffb0, 0xffb1, 0xffb2, 0xffb3, 0xffb4, 0xffb5, 0xffb6, 0xffb7,
+  0xffb8, 0xffb9, 0xffba, 0xffbb, 0xffbc, 0xffbd, 0xffbe, 0xffbf,
+  0xffc0, 0xffc1, 0xffc2, 0xffc3, 0xffc4, 0xffc5, 0xffc6, 0xffc7,
+  0xffc8, 0xffc9, 0xffca, 0xffcb, 0xffcc, 0xffcd, 0xffce, 0xffcf,
+  0xffd0, 0xffd1, 0xffd2, 0xffd3, 0xffd4, 0xffd5, 0xffd6, 0xffd7,
+  0xffd8, 0xffd9, 0xffda, 0xffdb, 0xffdc, 0xffdd, 0xffde, 0xffdf,
+  0xffe0, 0xffe1, 0xffe2, 0xffe3, 0xffe4, 0xffe5, 0xffe6, 0xffe7,
+  0xffe8, 0xffe9, 0xffea, 0xffeb, 0xffec, 0xffed, 0xffee, 0xffef,
+  0xfff0, 0xfff1, 0xfff2, 0xfff3, 0xfff4, 0xfff5, 0xfff6, 0xfff7,
+  0xfff8, 0xfff9, 0xfffa, 0xfffb, 0xfffc, 0xfffd, 0xfffe, 0xffff
+}};
+static const UnicodeCaseTableVector *caseTable[256] = {
+  &caseTable00,
+  &caseTable01,
+  &caseTable02,
+  &caseTable03,
+  &caseTable04,
+  &caseTable05,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  &caseTable1e,
+  &caseTable1f,
+  NULL,
+  &caseTable21,
+  NULL,
+  NULL,
+  &caseTable24,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  &caseTableff
+};
+
+static inline char getType(Unicode c) {
+  int i;
+  char type;
+
+  if (c > 0xffff) {
+    type = 'X';
+  } else {
+    i = (c >> 8) & 0xff;
+    if ((type = typeTable[i].type) == 'X') {
+      type = typeTable[i].vector[c & 0xff];
+    }
+  }
+  return type;
+}
+
+GBool unicodeTypeL(Unicode c) {
+  return getType(c) == 'L';
+}
+
+GBool unicodeTypeR(Unicode c) {
+  return getType(c) == 'R';
+}
+
+GBool unicodeTypeNum(Unicode c) {
+  return getType(c) == '#';
+}
+
+GBool unicodeTypeAlphaNum(Unicode c) {
+  char t;
+
+  t = getType(c);
+  return t == 'L' || t == 'R' || t == '#';
+}
+
+#define UNICODE_ALPHABETIC_PRESENTATION_BLOCK_BEGIN 0xFB00
+#define UNICODE_ALPHABETIC_PRESENTATION_BLOCK_END   0xFB4F
+
+GBool unicodeIsAlphabeticPresentationForm(Unicode c) {
+  return c >= UNICODE_ALPHABETIC_PRESENTATION_BLOCK_BEGIN
+    && c <= UNICODE_ALPHABETIC_PRESENTATION_BLOCK_END;
+}
+
+Unicode unicodeToUpper(Unicode c) {
+  int i;
+
+  if (c > 0xffff) {
+    return c;
+  }
+  i = (c >> 8) & 0xff;
+  if (caseTable[i]) {
+    return caseTable[i]->codes[c & 0xff];
+  }
+  return c;
+}
+
+#define UNICODE_LAST_CHAR 0x10FFFF
+#define UNICODE_MAX_TABLE_INDEX (UNICODE_LAST_CHAR / 256 + 1)
+// large empty block between U+2FA1D and U+E0001
+#define UNICODE_LAST_CHAR_PART1 0x2FAFF
+#define UNICODE_LAST_PAGE_PART1 (UNICODE_LAST_CHAR_PART1 / 256)
+#define UNICODE_PART2_START 0xE0000
+
+#include "UnicodeCClassTables.h"
+#include "UnicodeCompTables.h"
+#include "UnicodeDecompTables.h"
+
+#define CC_PART1(Page, Char) \
+  ((combining_class_table_part1[Page] >= UNICODE_MAX_TABLE_INDEX) \
+   ? (combining_class_table_part1[Page] - UNICODE_MAX_TABLE_INDEX) \
+   : (cclass_data[combining_class_table_part1[Page]][Char]))
+
+#define CC_PART2(Page, Char) \
+  ((combining_class_table_part2[Page] >= UNICODE_MAX_TABLE_INDEX) \
+   ? (combining_class_table_part2[Page] - UNICODE_MAX_TABLE_INDEX) \
+   : (cclass_data[combining_class_table_part2[Page]][Char]))
+
+#define COMBINING_CLASS(u) (((u) <= UNICODE_LAST_CHAR_PART1) \
+    ? CC_PART1((u) / 256, (u) % 256) \
+    : (((u) >= UNICODE_PART2_START && (u) <= UNICODE_LAST_CHAR) \
+      ? CC_PART2(((u) - UNICODE_PART2_START) / 256, (u) % 256) \
+      : 0))
+
+// Write the compatibility decomposition of @u into @buf, returning the number 
+// of characters written. @buf may be NULL, in which case the length of the
+// decomposition is returned but nothing is written. If @u is its own
+// decomposition, write @u into @buf and return 1.
+static int decomp_compat(Unicode u, Unicode *buf) {
+  // decomposition tables stored as lists {character, decomp_length, offset}
+  // so we do a binary search
+  int start = 0, end = DECOMP_TABLE_LENGTH;
+  if (u >= decomp_table[start].character 
+      && u <= decomp_table[end - 1].character)
+    while (gTrue) {
+      int midpoint = (start + end) / 2;
+      if (u == decomp_table[midpoint].character) {
+       int offset = decomp_table[midpoint].offset;
+       if (offset == -1)
+         break;
+       else {
+         int length = decomp_table[midpoint].length, i;
+         if (buf)
+           for (i = 0; i < length; ++i)
+             buf[i] = decomp_expansion[offset + i];
+         return length;
+       }
+      } else if (midpoint == start)
+       break;
+      else if (u > decomp_table[midpoint].character)
+       start = midpoint;
+      else
+       end = midpoint;
+    }
+  if (buf)
+    *buf = u;
+  return 1;
+}
+
+#define CI(Page, Char) \
+  ((compose_table[Page] >= UNICODE_MAX_TABLE_INDEX) \
+   ? (compose_table[Page] - UNICODE_MAX_TABLE_INDEX) \
+   : (compose_data[compose_table[Page]][Char]))
+
+#define COMPOSE_INDEX(u) \
+     ((((u) / 256) > (COMPOSE_TABLE_LAST)) ? 0 : CI((u) / 256, (u) % 256))
+
+// If @add combines with @base, write the combination to @out and return 
+// gTrue. Otherwise return gFalse.
+static GBool combine(Unicode base, Unicode add, Unicode *out) {
+  unsigned short idx_base, idx_add;
+
+  idx_base = COMPOSE_INDEX(base);
+  if (idx_base >= COMPOSE_FIRST_SINGLE_START 
+      && idx_base < COMPOSE_SECOND_START) {
+    if (compose_first_single[idx_base - COMPOSE_FIRST_SINGLE_START][0]
+       == add) {
+      *out = compose_first_single[idx_base - COMPOSE_FIRST_SINGLE_START][1];
+      return gTrue;
+    } else
+      return gFalse;
+  }
+
+  idx_add = COMPOSE_INDEX(add);
+  if (idx_add >= COMPOSE_SECOND_SINGLE_START) {
+    if (compose_second_single[idx_add - COMPOSE_SECOND_SINGLE_START][0]
+       == base) {
+      *out = compose_second_single[idx_add - COMPOSE_SECOND_SINGLE_START][1];
+      return gTrue;
+    } else
+      return gFalse;
+  }
+
+  if (idx_base >= COMPOSE_FIRST_START && idx_base < COMPOSE_FIRST_SINGLE_START 
+      && idx_add >= COMPOSE_SECOND_START 
+      && idx_add < COMPOSE_SECOND_SINGLE_START) {
+    Unicode o = compose_array[idx_base - COMPOSE_FIRST_START]
+      [idx_add - COMPOSE_SECOND_START];
+    if (o) {
+      *out = o;
+      return gTrue;
+    }
+  }
+
+  return gFalse;
+}
+
+#define HANGUL_S_BASE 0xAC00
+#define HANGUL_L_BASE 0x1100
+#define HANGUL_V_BASE 0x1161
+#define HANGUL_T_BASE 0x11A7
+#define HANGUL_L_COUNT 19
+#define HANGUL_V_COUNT 21
+#define HANGUL_T_COUNT 28
+#define HANGUL_S_COUNT (HANGUL_L_COUNT * HANGUL_V_COUNT * HANGUL_T_COUNT)
+#define HANGUL_N_COUNT (HANGUL_V_COUNT * HANGUL_T_COUNT)
+#define HANGUL_IS_L(u) (((u) >= HANGUL_L_BASE) \
+    && ((u) < HANGUL_L_BASE + HANGUL_L_COUNT))
+#define HANGUL_IS_V(u) (((u) >= HANGUL_V_BASE) \
+    && ((u) < HANGUL_V_BASE + HANGUL_V_COUNT))
+#define HANGUL_IS_T(u) (((u) >= HANGUL_T_BASE) \
+    && ((u) < HANGUL_T_BASE + HANGUL_T_COUNT))
+#define HANGUL_IS_SYLLABLE(u) (((u) >= HANGUL_S_BASE) \
+    && ((u) < HANGUL_S_BASE + HANGUL_S_COUNT))
+#define HANGUL_SYLLABLE_IS_LV(u) (((u) - HANGUL_S_BASE) % HANGUL_T_COUNT == 0)
+#define IS_HANGUL(u) (HANGUL_IS_L(u) || HANGUL_IS_V(u) || HANGUL_IS_T(u) \
+    || HANGUL_IS_SYLLABLE(u))
+#define HANGUL_COMPOSE_L_V(l, v) (HANGUL_S_BASE + (HANGUL_T_COUNT * \
+      (((v) - HANGUL_V_BASE) + (HANGUL_V_COUNT * ((l) - HANGUL_L_BASE)))))
+#define HANGUL_COMPOSE_LV_T(lv, t) ((lv) + ((t) - HANGUL_T_BASE))
+
+// Converts Unicode string @in of length @len to its normalization in form 
+// NFKC (compatibility decomposition + canonical composition). The length of
+// the resulting Unicode string is returned in @out_len. If non-NULL, @indices
+// is assigned the location of a newly-allocated array of length @out_len + 1, 
+// for each character in the normalized string giving the index in @in of the 
+// corresponding unnormalized character. @indices is not guaranteed monotone or
+// onto.
+Unicode *unicodeNormalizeNFKC(Unicode *in, int len, 
+                             int *out_len, int **indices) {
+  Unicode *out;
+  int i, o, *classes, *idx = NULL;
+
+  for (i = 0, o = 0; i < len; ++i) {
+    if (HANGUL_IS_L(in[i]) || HANGUL_IS_SYLLABLE(in[i])) {
+      o += 1;
+    } else
+      o += decomp_compat(in[i], NULL);
+  }
+  
+  out = (Unicode *) gmallocn(o, sizeof(Unicode));
+  classes = (int *) gmallocn(o, sizeof(int));
+  if (indices)
+    idx = (int *) gmallocn(o + 1, sizeof(int));
+
+  for (i = 0, o = 0; i < len; ) {
+    Unicode u = in[i];
+    if (IS_HANGUL(u)) {
+      if (HANGUL_IS_L(u)) {
+       Unicode l = u;
+       if (i+1 < len && HANGUL_IS_V(in[i+1])) {
+         Unicode lv = HANGUL_COMPOSE_L_V(l, in[++i]);
+         if (i+1 < len && HANGUL_IS_T(in[i+1]))
+           out[o] = HANGUL_COMPOSE_LV_T(lv, in[++i]);
+         else
+           out[o] = lv;
+       } else
+         out[o] = l;
+      } else if (HANGUL_SYLLABLE_IS_LV(u)) {
+       Unicode lv = u;
+       if (i+1 < len && HANGUL_IS_T(in[i+1]))
+         out[o] = HANGUL_COMPOSE_LV_T(lv, in[++i]);
+       else
+         out[o] = lv;
+      } else
+       out[o] = u;
+      if (indices)
+       idx[o] = i;
+      ++i; ++o;
+    } else {
+      int j, p, q, r, s, dlen;
+      // write compatibility decompositions into out (we have enough space)
+      // chomp in until a starter is reached
+      for (j = i, p = o; j < len; ++j) {
+       u = in[j];
+       if (j != i && COMBINING_CLASS(u) == 0)
+         break;
+       dlen = decomp_compat(u, out + p);
+       for (q = p; q < p + dlen; ++q) {
+         classes[q] = COMBINING_CLASS(out[q]);
+         if (indices)
+           idx[q] = j;
+       }
+       p += dlen;
+      }
+      // put out[o, p) in canonical ordering
+      for (q = o + 1; q < p; ++q)
+       for (r = q; r > o + 1; --r) {   // FIXME worth using a better sort?
+         int swap;
+         if (classes[r] >= classes[r-1])
+           break;
+         u = out[r]; out[r] = out[r - 1]; out[r - 1] = u;
+         swap = classes[r]; classes[r] = classes[r - 1]; classes[r - 1] = swap;
+         if (indices) {
+           swap = idx[r]; 
+           idx[r] = idx[r - 1];
+           idx[r - 1] = swap;
+         }
+       }
+      // canonical compose out[o, p)
+      for (q = o + 1; q < p; ++q)
+       if (!combine(out[o], out[q], &out[o]))
+         break;
+      // move out[q, p) back to [o+1, ?)
+      if (q != o + 1)
+       for (r = q, s = o + 1; r < p; ++r, ++s) {
+         out[s] = out[r];
+         if (indices)
+           idx[s] = idx[r];
+       }
+      else
+       s = p;
+      i = j; o = s;
+    }
+  }
+
+  *out_len = o;
+  gfree(classes);
+  if (indices) {
+    idx[o] = len;
+    *indices = idx;
+  }
+  return out;
+}
diff --git a/poppler/UnicodeTypeTable.h b/poppler/UnicodeTypeTable.h
new file mode 100644 (file)
index 0000000..869aad9
--- /dev/null
@@ -0,0 +1,44 @@
+//========================================================================
+//
+// UnicodeTypeTable.h
+//
+// Copyright 2003 Glyph & Cog, LLC
+//
+//========================================================================
+
+//========================================================================
+//
+// Modified under the Poppler project - http://poppler.freedesktop.org
+//
+// All changes made under the Poppler project to this file are licensed
+// under GPL version 2 or later
+//
+// Copyright (C) 2006 Ed Catmur <ed@catmur.co.uk>
+// Copyright (C) 2012 Adrian Johnson <ajohnson@redneon.com>
+//
+// To see a description of the changes please see the Changelog file that
+// came with your tarball or type make ChangeLog if you are building from git
+//
+//========================================================================
+
+#ifndef UNICODETYPETABLE_H
+#define UNICODETYPETABLE_H
+
+#include "goo/gtypes.h"
+
+extern GBool unicodeTypeL(Unicode c);
+
+extern GBool unicodeTypeR(Unicode c);
+
+extern GBool unicodeTypeNum(Unicode c);
+
+extern GBool unicodeTypeAlphaNum(Unicode c);
+
+extern GBool unicodeIsAlphabeticPresentationForm(Unicode c);
+
+extern Unicode unicodeToUpper(Unicode c);
+
+extern Unicode *unicodeNormalizeNFKC(Unicode *in, int len, 
+                                    int *out_len, int **offsets);
+
+#endif
diff --git a/poppler/ViewerPreferences.cc b/poppler/ViewerPreferences.cc
new file mode 100644 (file)
index 0000000..cba8d0a
--- /dev/null
@@ -0,0 +1,117 @@
+//========================================================================
+//
+// ViewerPreferences.cc
+//
+// This file is licensed under the GPLv2 or later
+//
+// Copyright 2011 Pino Toscano <pino@kde.org>
+//
+//========================================================================
+
+#include <config.h>
+
+#include "ViewerPreferences.h"
+
+#include "Object.h"
+#include "Dict.h"
+
+ViewerPreferences::ViewerPreferences(Dict *prefDict)
+{
+  init();
+
+  Object obj;
+
+  if (prefDict->lookup("HideToolbar", &obj)->isBool()) {
+    hideToolbar = obj.getBool();
+  }
+  obj.free();
+
+  if (prefDict->lookup("HideMenubar", &obj)->isBool()) {
+    hideMenubar = obj.getBool();
+  }
+  obj.free();
+
+  if (prefDict->lookup("HideWindowUI", &obj)->isBool()) {
+    hideWindowUI = obj.getBool();
+  }
+  obj.free();
+
+  if (prefDict->lookup("FitWindow", &obj)->isBool()) {
+    fitWindow = obj.getBool();
+  }
+  obj.free();
+
+  if (prefDict->lookup("CenterWindow", &obj)->isBool()) {
+    centerWindow = obj.getBool();
+  }
+  obj.free();
+
+  if (prefDict->lookup("DisplayDocTitle", &obj)->isBool()) {
+    displayDocTitle = obj.getBool();
+  }
+  obj.free();
+
+  if (prefDict->lookup("NonFullScreenPageMode", &obj)->isName()) {
+    const char *mode = obj.getName();
+    if (!strcmp(mode, "UseNone")) {
+      nonFullScreenPageMode = nfpmUseNone;
+    } else if (!strcmp(mode, "UseOutlines")) {
+      nonFullScreenPageMode = nfpmUseOutlines;
+    } else if (!strcmp(mode, "UseThumbs")) {
+      nonFullScreenPageMode = nfpmUseThumbs;
+    } else if (!strcmp(mode, "UseOC")) {
+      nonFullScreenPageMode = nfpmUseOC;
+    }
+  }
+  obj.free();
+
+  if (prefDict->lookup("Direction", &obj)->isName()) {
+    const char *dir = obj.getName();
+    if (!strcmp(dir, "L2R")) {
+      direction = directionL2R;
+    } else if (!strcmp(dir, "R2L")) {
+      direction = directionR2L;
+    }
+  }
+  obj.free();
+
+  if (prefDict->lookup("PrintScaling", &obj)->isName()) {
+    const char *ps = obj.getName();
+    if (!strcmp(ps, "None")) {
+      printScaling = printScalingNone;
+    } else if (!strcmp(ps, "AppDefault")) {
+      printScaling = printScalingAppDefault;
+    }
+  }
+  obj.free();
+
+  if (prefDict->lookup("Duplex", &obj)->isName()) {
+    const char *d = obj.getName();
+    if (!strcmp(d, "Simplex")) {
+      duplex = duplexSimplex;
+    } else if (!strcmp(d, "DuplexFlipShortEdge")) {
+      duplex = duplexDuplexFlipShortEdge;
+    } else if (!strcmp(d, "DuplexFlipLongEdge")) {
+      duplex = duplexDuplexFlipLongEdge;
+    }
+  }
+  obj.free();
+}
+
+ViewerPreferences::~ViewerPreferences()
+{
+}
+
+void ViewerPreferences::init()
+{
+  hideToolbar = gFalse;
+  hideMenubar = gFalse;
+  hideWindowUI = gFalse;
+  fitWindow = gFalse;
+  centerWindow = gFalse;
+  displayDocTitle = gFalse;
+  nonFullScreenPageMode = nfpmUseNone;
+  direction = directionL2R;
+  printScaling = printScalingAppDefault;
+  duplex = duplexNone;
+}
diff --git a/poppler/ViewerPreferences.h b/poppler/ViewerPreferences.h
new file mode 100644 (file)
index 0000000..8cdc4d4
--- /dev/null
@@ -0,0 +1,76 @@
+//========================================================================
+//
+// ViewerPreferences.h
+//
+// This file is licensed under the GPLv2 or later
+//
+// Copyright 2011 Pino Toscano <pino@kde.org>
+//
+//========================================================================
+
+#ifndef VIEWERPREFERENCES_H
+#define VIEWERPREFERENCES_H
+
+#include "goo/gtypes.h"
+
+class Dict;
+
+//------------------------------------------------------------------------
+// ViewerPreferences
+//------------------------------------------------------------------------
+
+class ViewerPreferences {
+public:
+
+  enum NonFullScreenPageMode {
+    nfpmUseNone,
+    nfpmUseOutlines,
+    nfpmUseThumbs,
+    nfpmUseOC
+  };
+  enum Direction {
+    directionL2R,
+    directionR2L
+  };
+  enum PrintScaling {
+    printScalingNone,
+    printScalingAppDefault
+  };
+  enum Duplex {
+    duplexNone,
+    duplexSimplex,
+    duplexDuplexFlipShortEdge,
+    duplexDuplexFlipLongEdge
+  };
+
+  ViewerPreferences(Dict *prefDict);
+  ~ViewerPreferences();
+
+  GBool getHideToolbar() const { return hideToolbar; }
+  GBool getHideMenubar() const { return hideMenubar; }
+  GBool getHideWindowUI() const { return hideWindowUI; }
+  GBool getFitWindow() const { return fitWindow; }
+  GBool getCenterWindow() const { return centerWindow; }
+  GBool getDisplayDocTitle() const { return displayDocTitle; }
+  NonFullScreenPageMode getNonFullScreenPageMode() const { return nonFullScreenPageMode; }
+  Direction getDirection() const { return direction; }
+  PrintScaling getPrintScaling() const { return printScaling; }
+  Duplex getDuplex() const { return duplex; }
+
+private:
+
+  void init();
+
+  GBool hideToolbar;
+  GBool hideMenubar;
+  GBool hideWindowUI;
+  GBool fitWindow;
+  GBool centerWindow;
+  GBool displayDocTitle;
+  NonFullScreenPageMode nonFullScreenPageMode;
+  Direction direction;
+  PrintScaling printScaling;
+  Duplex duplex;
+};
+
+#endif
diff --git a/poppler/XRef.cc b/poppler/XRef.cc
new file mode 100644 (file)
index 0000000..4d01320
--- /dev/null
@@ -0,0 +1,1458 @@
+//========================================================================
+//
+// XRef.cc
+//
+// Copyright 1996-2003 Glyph & Cog, LLC
+//
+//========================================================================
+
+//========================================================================
+//
+// Modified under the Poppler project - http://poppler.freedesktop.org
+//
+// All changes made under the Poppler project to this file are licensed
+// under GPL version 2 or later
+//
+// Copyright (C) 2005 Dan Sheridan <dan.sheridan@postman.org.uk>
+// Copyright (C) 2005 Brad Hards <bradh@frogmouth.net>
+// Copyright (C) 2006, 2008, 2010, 2012 Albert Astals Cid <aacid@kde.org>
+// Copyright (C) 2007-2008 Julien Rebetez <julienr@svn.gnome.org>
+// Copyright (C) 2007 Carlos Garcia Campos <carlosgc@gnome.org>
+// Copyright (C) 2009, 2010 Ilya Gorenbein <igorenbein@finjan.com>
+// Copyright (C) 2010 Hib Eris <hib@hiberis.nl>
+// Copyright (C) 2012 Thomas Freitag <Thomas.Freitag@kabelmail.de>
+// Copyright (C) 2012 Fabio D'Urso <fabiodurso@hotmail.it>
+//
+// To see a description of the changes please see the Changelog file that
+// came with your tarball or type make ChangeLog if you are building from git
+//
+//========================================================================
+
+#include <config.h>
+
+#ifdef USE_GCC_PRAGMAS
+#pragma implementation
+#endif
+
+#include <stdlib.h>
+#include <stddef.h>
+#include <string.h>
+#include <ctype.h>
+#include <limits.h>
+#include "goo/gmem.h"
+#include "Object.h"
+#include "Stream.h"
+#include "Lexer.h"
+#include "Parser.h"
+#include "Dict.h"
+#include "Error.h"
+#include "ErrorCodes.h"
+#include "XRef.h"
+#include "PopplerCache.h"
+
+//------------------------------------------------------------------------
+// Permission bits
+// Note that the PDF spec uses 1 base (eg bit 3 is 1<<2)
+//------------------------------------------------------------------------
+
+#define permPrint         (1<<2)  // bit 3
+#define permChange        (1<<3)  // bit 4
+#define permCopy          (1<<4)  // bit 5
+#define permNotes         (1<<5)  // bit 6
+#define permFillForm      (1<<8)  // bit 9
+#define permAccessibility (1<<9)  // bit 10
+#define permAssemble      (1<<10) // bit 11
+#define permHighResPrint  (1<<11) // bit 12
+#define defPermFlags 0xfffc
+
+//------------------------------------------------------------------------
+// ObjectStream
+//------------------------------------------------------------------------
+
+class ObjectStream {
+public:
+
+  // Create an object stream, using object number <objStrNum>,
+  // generation 0.
+  ObjectStream(XRef *xref, int objStrNumA);
+
+  GBool isOk() { return ok; }
+
+  ~ObjectStream();
+
+  // Return the object number of this object stream.
+  int getObjStrNum() { return objStrNum; }
+
+  // Get the <objIdx>th object from this stream, which should be
+  // object number <objNum>, generation 0.
+  Object *getObject(int objIdx, int objNum, Object *obj);
+
+private:
+
+  int objStrNum;               // object number of the object stream
+  int nObjects;                        // number of objects in the stream
+  Object *objs;                        // the objects (length = nObjects)
+  int *objNums;                        // the object numbers (length = nObjects)
+  GBool ok;
+};
+
+class ObjectStreamKey : public PopplerCacheKey
+{
+  public:
+    ObjectStreamKey(int num) : objStrNum(num)
+    {
+    }
+
+    bool operator==(const PopplerCacheKey &key) const
+    {
+      const ObjectStreamKey *k = static_cast<const ObjectStreamKey*>(&key);
+      return objStrNum == k->objStrNum;
+    }
+
+    const int objStrNum;
+};
+
+class ObjectStreamItem : public PopplerCacheItem
+{
+  public:
+    ObjectStreamItem(ObjectStream *objStr) : objStream(objStr)
+    {
+    }
+
+    ~ObjectStreamItem()
+    {
+      delete objStream;
+    }
+
+    ObjectStream *objStream;
+};
+
+ObjectStream::ObjectStream(XRef *xref, int objStrNumA) {
+  Stream *str;
+  Parser *parser;
+  int *offsets;
+  Object objStr, obj1, obj2;
+  int first, i;
+
+  objStrNum = objStrNumA;
+  nObjects = 0;
+  objs = NULL;
+  objNums = NULL;
+  ok = gFalse;
+
+  if (!xref->fetch(objStrNum, 0, &objStr)->isStream()) {
+    goto err1;
+  }
+
+  if (!objStr.streamGetDict()->lookup("N", &obj1)->isInt()) {
+    obj1.free();
+    goto err1;
+  }
+  nObjects = obj1.getInt();
+  obj1.free();
+  if (nObjects <= 0) {
+    goto err1;
+  }
+
+  if (!objStr.streamGetDict()->lookup("First", &obj1)->isInt()) {
+    obj1.free();
+    goto err1;
+  }
+  first = obj1.getInt();
+  obj1.free();
+  if (first < 0) {
+    goto err1;
+  }
+
+  // this is an arbitrary limit to avoid integer overflow problems
+  // in the 'new Object[nObjects]' call (Acrobat apparently limits
+  // object streams to 100-200 objects)
+  if (nObjects > 1000000) {
+    error(errSyntaxError, -1, "Too many objects in an object stream");
+    goto err1;
+  }
+  objs = new Object[nObjects];
+  objNums = (int *)gmallocn(nObjects, sizeof(int));
+  offsets = (int *)gmallocn(nObjects, sizeof(int));
+
+  // parse the header: object numbers and offsets
+  objStr.streamReset();
+  obj1.initNull();
+  str = new EmbedStream(objStr.getStream(), &obj1, gTrue, first);
+  parser = new Parser(xref, new Lexer(xref, str), gFalse);
+  for (i = 0; i < nObjects; ++i) {
+    parser->getObj(&obj1);
+    parser->getObj(&obj2);
+    if (!obj1.isInt() || !obj2.isInt()) {
+      obj1.free();
+      obj2.free();
+      delete parser;
+      gfree(offsets);
+      goto err1;
+    }
+    objNums[i] = obj1.getInt();
+    offsets[i] = obj2.getInt();
+    obj1.free();
+    obj2.free();
+    if (objNums[i] < 0 || offsets[i] < 0 ||
+       (i > 0 && offsets[i] < offsets[i-1])) {
+      delete parser;
+      gfree(offsets);
+      goto err1;
+    }
+  }
+  while (str->getChar() != EOF) ;
+  delete parser;
+
+  // skip to the first object - this shouldn't be necessary because
+  // the First key is supposed to be equal to offsets[0], but just in
+  // case...
+  for (i = first; i < offsets[0]; ++i) {
+    objStr.getStream()->getChar();
+  }
+
+  // parse the objects
+  for (i = 0; i < nObjects; ++i) {
+    obj1.initNull();
+    if (i == nObjects - 1) {
+      str = new EmbedStream(objStr.getStream(), &obj1, gFalse, 0);
+    } else {
+      str = new EmbedStream(objStr.getStream(), &obj1, gTrue,
+                           offsets[i+1] - offsets[i]);
+    }
+    parser = new Parser(xref, new Lexer(xref, str), gFalse);
+    parser->getObj(&objs[i]);
+    while (str->getChar() != EOF) ;
+    delete parser;
+  }
+
+  gfree(offsets);
+  ok = gTrue;
+
+ err1:
+  objStr.free();
+}
+
+ObjectStream::~ObjectStream() {
+  int i;
+
+  if (objs) {
+    for (i = 0; i < nObjects; ++i) {
+      objs[i].free();
+    }
+    delete[] objs;
+  }
+  gfree(objNums);
+}
+
+Object *ObjectStream::getObject(int objIdx, int objNum, Object *obj) {
+  if (objIdx < 0 || objIdx >= nObjects || objNum != objNums[objIdx]) {
+    return obj->initNull();
+  }
+  return objs[objIdx].copy(obj);
+}
+
+//------------------------------------------------------------------------
+// XRef
+//------------------------------------------------------------------------
+
+void XRef::init() {
+  ok = gTrue;
+  errCode = errNone;
+  entries = NULL;
+  capacity = 0;
+  size = 0;
+  streamEnds = NULL;
+  streamEndsLen = 0;
+  objStrs = new PopplerCache(5);
+  mainXRefEntriesOffset = 0;
+  xRefStream = gFalse;
+}
+
+XRef::XRef() {
+  init();
+}
+
+XRef::XRef(Object *trailerDictA) {
+  init();
+  if (trailerDictA->isDict())
+    trailerDict.initDict(trailerDictA->getDict());
+}
+
+XRef::XRef(BaseStream *strA, Guint pos, Guint mainXRefEntriesOffsetA, GBool *wasReconstructed, GBool reconstruct) {
+  Object obj;
+
+  init();
+  mainXRefEntriesOffset = mainXRefEntriesOffsetA;
+
+  encrypted = gFalse;
+  permFlags = defPermFlags;
+  ownerPasswordOk = gFalse;
+
+  // read the trailer
+  str = strA;
+  start = str->getStart();
+  prevXRefOffset = pos;
+
+  if (reconstruct && !(ok = constructXRef(wasReconstructed)))
+  {
+    errCode = errDamaged;
+    return;
+  }
+  else
+  {
+    // if there was a problem with the 'startxref' position, try to
+    // reconstruct the xref table
+    if (prevXRefOffset == 0) {
+      if (!(ok = constructXRef(wasReconstructed))) {
+        errCode = errDamaged;
+        return;
+      }
+
+    // read the xref table
+    } else {
+      std::vector<Guint> followedXRefStm;
+      readXRef(&prevXRefOffset, &followedXRefStm);
+
+      // if there was a problem with the xref table,
+      // try to reconstruct it
+      if (!ok) {
+        if (!(ok = constructXRef(wasReconstructed))) {
+          errCode = errDamaged;
+          return;
+        }
+      }
+    }
+
+    // set size to (at least) the size specified in trailer dict
+    trailerDict.dictLookupNF("Size", &obj);
+    if (!obj.isInt()) {
+        error(errSyntaxWarning, -1, "No valid XRef size in trailer");
+    } else {
+      if (obj.getInt() > size) {
+         if (resize(obj.getInt()) != obj.getInt()) {
+            if (!(ok = constructXRef(wasReconstructed))) {
+               obj.free();
+               errCode = errDamaged;
+               return;
+            }
+         }
+      }
+    }
+    obj.free();
+
+    // get the root dictionary (catalog) object
+    trailerDict.dictLookupNF("Root", &obj);
+    if (obj.isRef()) {
+      rootNum = obj.getRefNum();
+      rootGen = obj.getRefGen();
+      obj.free();
+    } else {
+      obj.free();
+      if (!(ok = constructXRef(wasReconstructed))) {
+        errCode = errDamaged;
+        return;
+      }
+    }
+  }
+  // now set the trailer dictionary's xref pointer so we can fetch
+  // indirect objects from it
+  trailerDict.getDict()->setXRef(this);
+}
+
+XRef::~XRef() {
+  for(int i=0; i<size; i++) {
+      entries[i].obj.free ();
+  }
+  gfree(entries);
+
+  trailerDict.free();
+  if (streamEnds) {
+    gfree(streamEnds);
+  }
+  if (objStrs) {
+    delete objStrs;
+  }
+}
+
+int XRef::reserve(int newSize)
+{
+  if (newSize > capacity) {
+
+    int realNewSize;
+    for (realNewSize = capacity ? 2 * capacity : 1024;
+          newSize > realNewSize && realNewSize > 0;
+          realNewSize <<= 1) ;
+    if ((realNewSize < 0) ||
+        (realNewSize >= INT_MAX / (int)sizeof(XRefEntry))) {
+      return 0;
+    }
+
+    void *p = greallocn_checkoverflow(entries, realNewSize, sizeof(XRefEntry));
+    if (p == NULL) {
+      return 0;
+    }
+
+    entries = (XRefEntry *) p;
+    capacity = realNewSize;
+
+  }
+
+  return capacity;
+}
+
+int XRef::resize(int newSize)
+{
+  if (newSize > size) {
+
+    if (reserve(newSize) < newSize) return size;
+
+    for (int i = size; i < newSize; ++i) {
+      entries[i].offset = 0xffffffff;
+      entries[i].type = xrefEntryNone;
+      entries[i].obj.initNull ();
+      entries[i].updated = false;
+      entries[i].gen = 0;
+    }
+  } else {
+    for (int i = newSize; i < size; i++) {
+      entries[i].obj.free ();
+    }
+  }
+
+  size = newSize;
+
+  return size;
+}
+
+// Read one xref table section.  Also reads the associated trailer
+// dictionary, and returns the prev pointer (if any).
+GBool XRef::readXRef(Guint *pos, std::vector<Guint> *followedXRefStm) {
+  Parser *parser;
+  Object obj;
+  GBool more;
+
+  // start up a parser, parse one token
+  obj.initNull();
+  parser = new Parser(NULL,
+            new Lexer(NULL,
+              str->makeSubStream(start + *pos, gFalse, 0, &obj)),
+            gTrue);
+  parser->getObj(&obj, gTrue);
+
+  // parse an old-style xref table
+  if (obj.isCmd("xref")) {
+    obj.free();
+    more = readXRefTable(parser, pos, followedXRefStm);
+
+  // parse an xref stream
+  } else if (obj.isInt()) {
+    obj.free();
+    if (!parser->getObj(&obj, gTrue)->isInt()) {
+      goto err1;
+    }
+    obj.free();
+    if (!parser->getObj(&obj, gTrue)->isCmd("obj")) {
+      goto err1;
+    }
+    obj.free();
+    if (!parser->getObj(&obj)->isStream()) {
+      goto err1;
+    }
+    if (trailerDict.isNone()) {
+      xRefStream = gTrue;
+    }
+    more = readXRefStream(obj.getStream(), pos);
+    obj.free();
+
+  } else {
+    goto err1;
+  }
+
+  delete parser;
+  return more;
+
+ err1:
+  obj.free();
+  delete parser;
+  ok = gFalse;
+  return gFalse;
+}
+
+GBool XRef::readXRefTable(Parser *parser, Guint *pos, std::vector<Guint> *followedXRefStm) {
+  XRefEntry entry;
+  GBool more;
+  Object obj, obj2;
+  Guint pos2;
+  int first, n, i;
+
+  while (1) {
+    parser->getObj(&obj, gTrue);
+    if (obj.isCmd("trailer")) {
+      obj.free();
+      break;
+    }
+    if (!obj.isInt()) {
+      goto err1;
+    }
+    first = obj.getInt();
+    obj.free();
+    if (!parser->getObj(&obj, gTrue)->isInt()) {
+      goto err1;
+    }
+    n = obj.getInt();
+    obj.free();
+    if (first < 0 || n < 0 || first + n < 0) {
+      goto err0;
+    }
+    if (first + n > size) {
+      if (resize(first + n) != first + n) {
+        error(errSyntaxError, -1, "Invalid 'obj' parameters'");
+        goto err0;
+      }
+    }
+    for (i = first; i < first + n; ++i) {
+      if (!parser->getObj(&obj, gTrue)->isInt()) {
+       goto err1;
+      }
+      entry.offset = (Guint)obj.getInt();
+      obj.free();
+      if (!parser->getObj(&obj, gTrue)->isInt()) {
+       goto err1;
+      }
+      entry.gen = obj.getInt();
+      entry.obj.initNull ();
+      entry.updated = false;
+      obj.free();
+      parser->getObj(&obj, gTrue);
+      if (obj.isCmd("n")) {
+       entry.type = xrefEntryUncompressed;
+      } else if (obj.isCmd("f")) {
+       entry.type = xrefEntryFree;
+      } else {
+       goto err1;
+      }
+      obj.free();
+      if (entries[i].offset == 0xffffffff) {
+       entries[i] = entry;
+       // PDF files of patents from the IBM Intellectual Property
+       // Network have a bug: the xref table claims to start at 1
+       // instead of 0.
+       if (i == 1 && first == 1 &&
+           entries[1].offset == 0 && entries[1].gen == 65535 &&
+           entries[1].type == xrefEntryFree) {
+         i = first = 0;
+         entries[0] = entries[1];
+         entries[1].offset = 0xffffffff;
+       }
+      }
+    }
+  }
+
+  // read the trailer dictionary
+  if (!parser->getObj(&obj)->isDict()) {
+    goto err1;
+  }
+
+  // get the 'Prev' pointer
+  obj.getDict()->lookupNF("Prev", &obj2);
+  if (obj2.isInt()) {
+    pos2 = (Guint)obj2.getInt();
+    if (pos2 != *pos) {
+      *pos = pos2;
+      more = gTrue;
+    } else {
+      error(errSyntaxWarning, -1, "Infinite loop in xref table");
+      more = gFalse;
+    }
+  } else if (obj2.isRef()) {
+    // certain buggy PDF generators generate "/Prev NNN 0 R" instead
+    // of "/Prev NNN"
+    pos2 = (Guint)obj2.getRefNum();
+    if (pos2 != *pos) {
+      *pos = pos2;
+      more = gTrue;
+    } else {
+      error(errSyntaxWarning, -1, "Infinite loop in xref table");
+      more = gFalse;
+    }
+  } else {
+    more = gFalse;
+  }
+  obj2.free();
+
+  // save the first trailer dictionary
+  if (trailerDict.isNone()) {
+    obj.copy(&trailerDict);
+  }
+
+  // check for an 'XRefStm' key
+  if (obj.getDict()->lookup("XRefStm", &obj2)->isInt()) {
+    pos2 = (Guint)obj2.getInt();
+    for (size_t i = 0; ok == gTrue && i < followedXRefStm->size(); ++i) {
+      if (followedXRefStm->at(i) == pos2) {
+        ok = gFalse;
+      }
+    }
+    if (ok) {
+      followedXRefStm->push_back(pos2);
+      readXRef(&pos2, followedXRefStm);
+    }
+    if (!ok) {
+      obj2.free();
+      goto err1;
+    }
+  }
+  obj2.free();
+
+  obj.free();
+  return more;
+
+ err1:
+  obj.free();
+ err0:
+  ok = gFalse;
+  return gFalse;
+}
+
+GBool XRef::readXRefStream(Stream *xrefStr, Guint *pos) {
+  Dict *dict;
+  int w[3];
+  GBool more;
+  Object obj, obj2, idx;
+  int newSize, first, n, i;
+
+  dict = xrefStr->getDict();
+
+  if (!dict->lookupNF("Size", &obj)->isInt()) {
+    goto err1;
+  }
+  newSize = obj.getInt();
+  obj.free();
+  if (newSize < 0) {
+    goto err1;
+  }
+  if (newSize > size) {
+    if (resize(newSize) != newSize) {
+      error(errSyntaxError, -1, "Invalid 'size' parameter");
+      goto err0;
+    }
+  }
+
+  if (!dict->lookupNF("W", &obj)->isArray() ||
+      obj.arrayGetLength() < 3) {
+    goto err1;
+  }
+  for (i = 0; i < 3; ++i) {
+    if (!obj.arrayGet(i, &obj2)->isInt()) {
+      obj2.free();
+      goto err1;
+    }
+    w[i] = obj2.getInt();
+    obj2.free();
+    if (w[i] < 0 || w[i] > 4) {
+      goto err1;
+    }
+  }
+  obj.free();
+
+  xrefStr->reset();
+  dict->lookupNF("Index", &idx);
+  if (idx.isArray()) {
+    for (i = 0; i+1 < idx.arrayGetLength(); i += 2) {
+      if (!idx.arrayGet(i, &obj)->isInt()) {
+       idx.free();
+       goto err1;
+      }
+      first = obj.getInt();
+      obj.free();
+      if (!idx.arrayGet(i+1, &obj)->isInt()) {
+       idx.free();
+       goto err1;
+      }
+      n = obj.getInt();
+      obj.free();
+      if (first < 0 || n < 0 ||
+         !readXRefStreamSection(xrefStr, w, first, n)) {
+       idx.free();
+       goto err0;
+      }
+    }
+  } else {
+    if (!readXRefStreamSection(xrefStr, w, 0, newSize)) {
+      idx.free();
+      goto err0;
+    }
+  }
+  idx.free();
+
+  dict->lookupNF("Prev", &obj);
+  if (obj.isInt()) {
+    *pos = (Guint)obj.getInt();
+    more = gTrue;
+  } else {
+    more = gFalse;
+  }
+  obj.free();
+  if (trailerDict.isNone()) {
+    trailerDict.initDict(dict);
+  }
+
+  return more;
+
+ err1:
+  obj.free();
+ err0:
+  ok = gFalse;
+  return gFalse;
+}
+
+GBool XRef::readXRefStreamSection(Stream *xrefStr, int *w, int first, int n) {
+  Guint offset;
+  int type, gen, c, i, j;
+
+  if (first + n < 0) {
+    return gFalse;
+  }
+  if (first + n > size) {
+    if (resize(first + n) != size) {
+      error(errSyntaxError, -1, "Invalid 'size' inside xref table");
+      return gFalse;
+    }
+    if (first + n > size) {
+      error(errSyntaxError, -1, "Invalid 'first' or 'n' inside xref table");
+      return gFalse;
+    }
+  }
+  for (i = first; i < first + n; ++i) {
+    if (w[0] == 0) {
+      type = 1;
+    } else {
+      for (type = 0, j = 0; j < w[0]; ++j) {
+       if ((c = xrefStr->getChar()) == EOF) {
+         return gFalse;
+       }
+       type = (type << 8) + c;
+      }
+    }
+    for (offset = 0, j = 0; j < w[1]; ++j) {
+      if ((c = xrefStr->getChar()) == EOF) {
+       return gFalse;
+      }
+      offset = (offset << 8) + c;
+    }
+    for (gen = 0, j = 0; j < w[2]; ++j) {
+      if ((c = xrefStr->getChar()) == EOF) {
+       return gFalse;
+      }
+      gen = (gen << 8) + c;
+    }
+    if (entries[i].offset == 0xffffffff) {
+      switch (type) {
+      case 0:
+       entries[i].offset = offset;
+       entries[i].gen = gen;
+       entries[i].type = xrefEntryFree;
+       break;
+      case 1:
+       entries[i].offset = offset;
+       entries[i].gen = gen;
+       entries[i].type = xrefEntryUncompressed;
+       break;
+      case 2:
+       entries[i].offset = offset;
+       entries[i].gen = gen;
+       entries[i].type = xrefEntryCompressed;
+       break;
+      default:
+       return gFalse;
+      }
+    }
+  }
+
+  return gTrue;
+}
+
+// Attempt to construct an xref table for a damaged file.
+GBool XRef::constructXRef(GBool *wasReconstructed, GBool needCatalogDict) {
+  Parser *parser;
+  Object newTrailerDict, obj;
+  char buf[256];
+  Guint pos;
+  int num, gen;
+  int newSize;
+  int streamEndsSize;
+  char *p;
+  GBool gotRoot;
+  char* token = NULL;
+  bool oneCycle = true;
+  int offset = 0;
+
+  gfree(entries);
+  capacity = 0;
+  size = 0;
+  entries = NULL;
+
+  gotRoot = gFalse;
+  streamEndsLen = streamEndsSize = 0;
+
+  if (wasReconstructed)
+  {
+    *wasReconstructed = true;
+  }
+
+  str->reset();
+  while (1) {
+    pos = str->getPos();
+    if (!str->getLine(buf, 256)) {
+      break;
+    }
+    p = buf;
+
+    // skip whitespace
+    while (*p && Lexer::isSpace(*p & 0xff)) ++p;
+
+    oneCycle = true;
+    offset = 0;
+
+    while( ( token = strstr( p, "endobj" ) ) || oneCycle ) {
+      oneCycle = false;
+
+      if( token ) {
+        oneCycle = true;
+        token[0] = '\0'; 
+        offset = token - p;
+      }
+
+      // got trailer dictionary
+      if (!strncmp(p, "trailer", 7)) {
+        obj.initNull();
+        parser = new Parser(NULL,
+                new Lexer(NULL,
+                  str->makeSubStream(pos + 7, gFalse, 0, &obj)),
+                gFalse);
+        parser->getObj(&newTrailerDict);
+        if (newTrailerDict.isDict()) {
+         newTrailerDict.dictLookupNF("Root", &obj);
+         if (obj.isRef() && (!gotRoot || !needCatalogDict) && rootNum != obj.getRefNum()) {
+           rootNum = obj.getRefNum();
+           rootGen = obj.getRefGen();
+           if (!trailerDict.isNone()) {
+             trailerDict.free();
+           }
+           newTrailerDict.copy(&trailerDict);
+           gotRoot = gTrue;
+         }
+         obj.free();
+        }
+        newTrailerDict.free();
+        delete parser;
+
+      // look for object
+    } else if (isdigit(*p & 0xff)) {
+      num = atoi(p);
+      if (num > 0) {
+       do {
+         ++p;
+       } while (*p && isdigit(*p & 0xff));
+       if (isspace(*p & 0xff)) {
+         do {
+           ++p;
+         } while (*p && isspace(*p & 0xff));
+         if (isdigit(*p & 0xff)) {
+           gen = atoi(p);
+           do {
+             ++p;
+           } while (*p && isdigit(*p & 0xff));
+           if (isspace(*p & 0xff)) {
+             do {
+               ++p;
+             } while (*p && isspace(*p & 0xff));
+             if (!strncmp(p, "obj", 3)) {
+               if (num >= size) {
+                 newSize = (num + 1 + 255) & ~255;
+                 if (newSize < 0) {
+                   error(errSyntaxError, -1, "Bad object number");
+                   return gFalse;
+                 }
+                   if (resize(newSize) != newSize) {
+                     error(errSyntaxError, -1, "Invalid 'obj' parameters");
+                     return gFalse;
+                   }
+                 }
+                 if (entries[num].type == xrefEntryFree ||
+                     gen >= entries[num].gen) {
+                   entries[num].offset = pos - start;
+                   entries[num].gen = gen;
+                   entries[num].type = xrefEntryUncompressed;
+               }
+               }
+             }
+           }
+         }
+        }
+
+      } else if (!strncmp(p, "endstream", 9)) {
+        if (streamEndsLen == streamEndsSize) {
+         streamEndsSize += 64;
+          if (streamEndsSize >= INT_MAX / (int)sizeof(int)) {
+            error(errSyntaxError, -1, "Invalid 'endstream' parameter.");
+            return gFalse;
+          }
+         streamEnds = (Guint *)greallocn(streamEnds,
+                                       streamEndsSize, sizeof(Guint));
+        }
+        streamEnds[streamEndsLen++] = pos;
+      }
+      if( token ) {
+        p = token + 6;// strlen( "endobj" ) = 6
+        pos += offset + 6;// strlen( "endobj" ) = 6
+        while (*p && Lexer::isSpace(*p & 0xff)) {
+          ++p;
+          ++pos;
+        }
+      }
+    }
+  }
+
+  if (gotRoot)
+    return gTrue;
+
+  error(errSyntaxError, -1, "Couldn't find trailer dictionary");
+  return gFalse;
+}
+
+void XRef::setEncryption(int permFlagsA, GBool ownerPasswordOkA,
+                        Guchar *fileKeyA, int keyLengthA,
+                        int encVersionA, int encRevisionA,
+                        CryptAlgorithm encAlgorithmA) {
+  int i;
+
+  encrypted = gTrue;
+  permFlags = permFlagsA;
+  ownerPasswordOk = ownerPasswordOkA;
+  if (keyLengthA <= 32) {
+    keyLength = keyLengthA;
+  } else {
+    keyLength = 32;
+  }
+  for (i = 0; i < keyLength; ++i) {
+    fileKey[i] = fileKeyA[i];
+  }
+  encVersion = encVersionA;
+  encRevision = encRevisionA;
+  encAlgorithm = encAlgorithmA;
+}
+
+GBool XRef::okToPrint(GBool ignoreOwnerPW) {
+  return (!ignoreOwnerPW && ownerPasswordOk) || (permFlags & permPrint);
+}
+
+// we can print at high res if we are only doing security handler revision
+// 2 (and we are allowed to print at all), or with security handler rev
+// 3 and we are allowed to print, and bit 12 is set.
+GBool XRef::okToPrintHighRes(GBool ignoreOwnerPW) {
+  if (encrypted) {
+    if (2 == encRevision) {
+      return (okToPrint(ignoreOwnerPW));
+    } else if (encRevision >= 3) {
+      return (okToPrint(ignoreOwnerPW) && (permFlags & permHighResPrint));
+    } else {
+      // something weird - unknown security handler version
+      return gFalse;
+    }
+  } else {
+    return gTrue;
+  }
+}
+
+GBool XRef::okToChange(GBool ignoreOwnerPW) {
+  return (!ignoreOwnerPW && ownerPasswordOk) || (permFlags & permChange);
+}
+
+GBool XRef::okToCopy(GBool ignoreOwnerPW) {
+  return (!ignoreOwnerPW && ownerPasswordOk) || (permFlags & permCopy);
+}
+
+GBool XRef::okToAddNotes(GBool ignoreOwnerPW) {
+  return (!ignoreOwnerPW && ownerPasswordOk) || (permFlags & permNotes);
+}
+
+GBool XRef::okToFillForm(GBool ignoreOwnerPW) {
+  return (!ignoreOwnerPW && ownerPasswordOk) || (permFlags & permFillForm);
+}
+
+GBool XRef::okToAccessibility(GBool ignoreOwnerPW) {
+  return (!ignoreOwnerPW && ownerPasswordOk) || (permFlags & permAccessibility);
+}
+
+GBool XRef::okToAssemble(GBool ignoreOwnerPW) {
+  return (!ignoreOwnerPW && ownerPasswordOk) || (permFlags & permAssemble);
+}
+
+Object *XRef::getCatalog(Object *catalog) {
+  Object *obj = fetch(rootNum, rootGen, catalog);
+  if (obj->isDict()) {
+    return obj;
+  }
+  GBool wasReconstructed = false;
+  GBool ok = constructXRef(&wasReconstructed, gTrue);
+  return (ok) ? fetch(rootNum, rootGen, catalog) : obj;
+}
+
+Object *XRef::fetch(int num, int gen, Object *obj, int recursion) {
+  XRefEntry *e;
+  Parser *parser;
+  Object obj1, obj2, obj3;
+
+  // check for bogus ref - this can happen in corrupted PDF files
+  if (num < 0 || num >= size) {
+    goto err;
+  }
+
+  e = getEntry(num);
+  if(!e->obj.isNull ()) { //check for updated object
+    obj = e->obj.copy(obj);
+    return obj;
+  }
+
+  switch (e->type) {
+
+  case xrefEntryUncompressed:
+    if (e->gen != gen) {
+      goto err;
+    }
+    obj1.initNull();
+    parser = new Parser(this,
+              new Lexer(this,
+                str->makeSubStream(start + e->offset, gFalse, 0, &obj1)),
+              gTrue);
+    parser->getObj(&obj1, recursion);
+    parser->getObj(&obj2, recursion);
+    parser->getObj(&obj3, recursion);
+    if (!obj1.isInt() || obj1.getInt() != num ||
+       !obj2.isInt() || obj2.getInt() != gen ||
+       !obj3.isCmd("obj")) {
+      // some buggy pdf have obj1234 for ints that represent 1234
+      // try to recover here
+      if (obj1.isInt() && obj1.getInt() == num &&
+         obj2.isInt() && obj2.getInt() == gen &&
+         obj3.isCmd()) {
+       char *cmd = obj3.getCmd();
+       if (strlen(cmd) > 3 &&
+           cmd[0] == 'o' &&
+           cmd[1] == 'b' &&
+           cmd[2] == 'j') {
+         char *end_ptr;
+         long longNumber = strtol(cmd + 3, &end_ptr, 0);
+         if (longNumber <= INT_MAX && longNumber >= INT_MIN && *end_ptr == '\0') {
+           int number = longNumber;
+           error(errSyntaxWarning, -1, "Cmd was not obj but {0:s}, assuming the creator meant obj {1:d}", cmd, number);
+           obj->initInt(number);
+           obj1.free();
+           obj2.free();
+           obj3.free();
+           delete parser;
+           break;
+         }
+       }
+      }
+      obj1.free();
+      obj2.free();
+      obj3.free();
+      delete parser;
+      goto err;
+    }
+    parser->getObj(obj, gFalse, encrypted ? fileKey : (Guchar *)NULL,
+                  encAlgorithm, keyLength, num, gen, recursion);
+    obj1.free();
+    obj2.free();
+    obj3.free();
+    delete parser;
+    break;
+
+  case xrefEntryCompressed:
+  {
+#if 0 // Adobe apparently ignores the generation number on compressed objects
+    if (gen != 0) {
+      goto err;
+    }
+#endif
+    if (e->offset >= (Guint)size ||
+       entries[e->offset].type != xrefEntryUncompressed) {
+      error(errSyntaxError, -1, "Invalid object stream");
+      goto err;
+    }
+
+    ObjectStream *objStr = NULL;
+    ObjectStreamKey key(e->offset);
+    PopplerCacheItem *item = objStrs->lookup(key);
+    if (item) {
+      ObjectStreamItem *it = static_cast<ObjectStreamItem *>(item);
+      objStr = it->objStream;
+    }
+
+    if (!objStr) {
+      objStr = new ObjectStream(this, e->offset);
+      if (!objStr->isOk()) {
+       delete objStr;
+       objStr = NULL;
+       goto err;
+      } else {
+       // XRef could be reconstructed in constructor of ObjectStream:
+       e = getEntry(num);
+       ObjectStreamKey *newkey = new ObjectStreamKey(e->offset);
+       ObjectStreamItem *newitem = new ObjectStreamItem(objStr);
+       objStrs->put(newkey, newitem);
+      }
+    }
+    objStr->getObject(e->gen, num, obj);
+  }
+  break;
+
+  default:
+    goto err;
+  }
+  
+  return obj;
+
+ err:
+  return obj->initNull();
+}
+
+Object *XRef::getDocInfo(Object *obj) {
+  return trailerDict.dictLookup("Info", obj);
+}
+
+// Added for the pdftex project.
+Object *XRef::getDocInfoNF(Object *obj) {
+  return trailerDict.dictLookupNF("Info", obj);
+}
+
+GBool XRef::getStreamEnd(Guint streamStart, Guint *streamEnd) {
+  int a, b, m;
+
+  if (streamEndsLen == 0 ||
+      streamStart > streamEnds[streamEndsLen - 1]) {
+    return gFalse;
+  }
+
+  a = -1;
+  b = streamEndsLen - 1;
+  // invariant: streamEnds[a] < streamStart <= streamEnds[b]
+  while (b - a > 1) {
+    m = (a + b) / 2;
+    if (streamStart <= streamEnds[m]) {
+      b = m;
+    } else {
+      a = m;
+    }
+  }
+  *streamEnd = streamEnds[b];
+  return gTrue;
+}
+
+int XRef::getNumEntry(Guint offset)
+{
+  if (size > 0)
+  {
+    int res = 0;
+    Guint resOffset = getEntry(0)->offset;
+    XRefEntry *e;
+    for (int i = 1; i < size; ++i)
+    {
+      e = getEntry(i, gFalse);
+      if (e->type != xrefEntryFree && e->offset < offset && e->offset >= resOffset)
+      {
+        res = i;
+        resOffset = e->offset;
+      }
+    }
+    return res;
+  }
+  else return -1;
+}
+
+void XRef::add(int num, int gen, Guint offs, GBool used) {
+  if (num >= size) {
+    if (num >= capacity) {
+      entries = (XRefEntry *)greallocn(entries, num + 1, sizeof(XRefEntry));
+      capacity = num + 1;
+    }
+    for (int i = size; i < num + 1; ++i) {
+      entries[i].offset = 0xffffffff;
+      entries[i].type = xrefEntryFree;
+      entries[i].obj.initNull ();
+      entries[i].updated = false;
+      entries[i].gen = 0;
+    }
+    size = num + 1;
+  }
+  XRefEntry *e = getEntry(num);
+  e->gen = gen;
+  e->obj.initNull ();
+  e->updated = false;
+  if (used) {
+    e->type = xrefEntryUncompressed;
+    e->offset = offs;
+  } else {
+    e->type = xrefEntryFree;
+    e->offset = 0;
+  }
+}
+
+void XRef::setModifiedObject (Object* o, Ref r) {
+  if (r.num < 0 || r.num >= size) {
+    error(errInternal, -1,"XRef::setModifiedObject on unknown ref: {0:d}, {1:d}\n", r.num, r.gen);
+    return;
+  }
+  XRefEntry *e = getEntry(r.num);
+  e->obj.free();
+  o->copy(&(e->obj));
+  e->updated = true;
+}
+
+Ref XRef::addIndirectObject (Object* o) {
+  int entryIndexToUse = -1;
+  for (int i = 1; entryIndexToUse == -1 && i < size; ++i) {
+    XRefEntry *e = getEntry(i, false /* complainIfMissing */);
+    if (e->type == xrefEntryFree && e->gen != 65535) {
+      entryIndexToUse = i;
+    }
+  }
+
+  XRefEntry *e;
+  if (entryIndexToUse == -1) {
+    entryIndexToUse = size;
+    add(entryIndexToUse, 0, 0, gFalse);
+    e = getEntry(entryIndexToUse);
+  } else {
+    //reuse a free entry
+    e = getEntry(entryIndexToUse);
+    //we don't touch gen number, because it should have been 
+    //incremented when the object was deleted
+  }
+  e->type = xrefEntryUncompressed;
+  o->copy(&e->obj);
+  e->updated = true;
+
+  Ref r;
+  r.num = entryIndexToUse;
+  r.gen = e->gen;
+  return r;
+}
+
+void XRef::removeIndirectObject(Ref r) {
+  if (r.num < 0 || r.num >= size) {
+    error(errInternal, -1,"XRef::removeIndirectObject on unknown ref: {0:d}, {1:d}\n", r.num, r.gen);
+    return;
+  }
+  XRefEntry *e = getEntry(r.num);
+  if (e->type == xrefEntryFree)
+    return;
+  e->obj.free();
+  e->type = xrefEntryFree;
+  e->gen++;
+  e->updated = true;
+}
+
+void XRef::writeXRef(XRef::XRefWriter *writer, GBool writeAllEntries) {
+  //create free entries linked-list
+  if (getEntry(0)->gen != 65535) {
+    error(errInternal, -1, "XRef::writeXRef, entry 0 of the XRef is invalid (gen != 65535)\n");
+  }
+  int lastFreeEntry = 0;
+  for (int i=0; i<size; i++) {
+    if (getEntry(i)->type == xrefEntryFree) {
+      getEntry(lastFreeEntry)->offset = i;
+      lastFreeEntry = i;
+    }
+  }
+
+  if (writeAllEntries) {
+    writer->startSection(0, size);
+    for (int i=0; i<size; i++) {
+      XRefEntry *e = getEntry(i);
+      if(e->gen > 65535) e->gen = 65535; //cap generation number to 65535 (required by PDFReference)
+      writer->writeEntry(e->offset, e->gen, e->type);
+    }
+  } else {
+    int i = 0;
+    while (i < size) {
+      int j;
+      for(j=i; j<size; j++) { //look for consecutive entries
+        if ((getEntry(j)->type == xrefEntryFree) && (getEntry(j)->gen == 0))
+          break;
+      }
+      if (j-i != 0)
+      {
+        writer->startSection(i, j-i);
+        for (int k=i; k<j; k++) {
+          XRefEntry *e = getEntry(k);
+          if(e->gen > 65535) e->gen = 65535; //cap generation number to 65535 (required by PDFReference)
+          writer->writeEntry(e->offset, e->gen, e->type);
+        }
+        i = j;
+      }
+      else ++i;
+    }
+  }
+}
+
+XRef::XRefTableWriter::XRefTableWriter(OutStream* outStrA) {
+  outStr = outStrA;
+}
+
+void XRef::XRefTableWriter::startSection(int first, int count) {
+  outStr->printf("%i %i\r\n", first, count);
+}
+
+void XRef::XRefTableWriter::writeEntry(Guint offset, int gen, XRefEntryType type) {
+  outStr->printf("%010i %05i %c\r\n", offset, gen, (type==xrefEntryFree)?'f':'n');
+}
+
+void XRef::writeTableToFile(OutStream* outStr, GBool writeAllEntries) {
+  XRefTableWriter writer(outStr);
+  outStr->printf("xref\r\n");
+  writeXRef(&writer, writeAllEntries);
+}
+
+XRef::XRefStreamWriter::XRefStreamWriter(Object *indexA, GooString *stmBufA) {
+  index = indexA;
+  stmBuf = stmBufA;
+}
+
+void XRef::XRefStreamWriter::startSection(int first, int count) {
+  Object obj;
+  index->arrayAdd( obj.initInt(first) );
+  index->arrayAdd( obj.initInt(count) );
+}
+
+void XRef::XRefStreamWriter::writeEntry(Guint offset, int gen, XRefEntryType type) {
+  char data[7];
+  data[0] = (type==xrefEntryFree) ? 0 : 1;
+  data[1] = (offset >> 24) & 0xff;
+  data[2] = (offset >> 16) & 0xff;
+  data[3] = (offset >> 8) & 0xff;
+  data[4] = offset & 0xff;
+  data[5] = (gen >> 8) & 0xff;
+  data[6] = gen & 0xff;
+  stmBuf->append(data, 7);
+}
+
+void XRef::writeStreamToBuffer(GooString *stmBuf, Dict *xrefDict, XRef *xref) {
+  Object index;
+  index.initArray(xref);
+  stmBuf->clear();
+
+  XRefStreamWriter writer(&index, stmBuf);
+  writeXRef(&writer, gFalse);
+
+  Object obj1, obj2;
+  xrefDict->set("Type", obj1.initName("XRef"));
+  xrefDict->set("Index", &index);
+  obj2.initArray(xref);
+  obj2.arrayAdd( obj1.initInt(1) );
+  obj2.arrayAdd( obj1.initInt(4) );
+  obj2.arrayAdd( obj1.initInt(2) );
+  xrefDict->set("W", &obj2);
+}
+
+GBool XRef::parseEntry(Guint offset, XRefEntry *entry)
+{
+  GBool r;
+
+  Object obj;
+  obj.initNull();
+  Parser parser = Parser(NULL, new Lexer(NULL,
+     str->makeSubStream(offset, gFalse, 20, &obj)), gTrue);
+
+  Object obj1, obj2, obj3;
+  if ((parser.getObj(&obj1)->isInt()) &&
+      (parser.getObj(&obj2)->isInt()) &&
+      (parser.getObj(&obj3)->isCmd("n") || obj3.isCmd("f"))) {
+    entry->offset = (Guint) obj1.getInt();
+    entry->gen = obj2.getInt();
+    entry->type = obj3.isCmd("n") ? xrefEntryUncompressed : xrefEntryFree;
+    entry->obj.initNull ();
+    entry->updated = false;
+    r = gTrue;
+  } else {
+    r = gFalse;
+  }
+  obj1.free();
+  obj2.free();
+  obj3.free();
+
+  return r;
+}
+
+XRefEntry *XRef::getEntry(int i, GBool complainIfMissing)
+{
+  if (entries[i].type == xrefEntryNone) {
+
+    if ((!xRefStream) && mainXRefEntriesOffset) {
+      if (!parseEntry(mainXRefEntriesOffset + 20*i, &entries[i])) {
+        error(errSyntaxError, -1, "Failed to parse XRef entry [{0:d}].", i);
+      }
+    } else {
+      std::vector<Guint> followedPrev;
+      while (prevXRefOffset && entries[i].type == xrefEntryNone) {
+        bool followed = false;
+        for (size_t j = 0; j < followedPrev.size(); j++) {
+          if (followedPrev.at(j) == prevXRefOffset) {
+            followed = true;
+            break;
+          }
+        }
+        if (followed) {
+          error(errSyntaxError, -1, "Circular XRef");
+          if (!(ok = constructXRef(NULL))) {
+            errCode = errDamaged;
+          }
+          break;
+        }
+
+        followedPrev.push_back (prevXRefOffset);
+
+        std::vector<Guint> followedXRefStm;
+        if (!readXRef(&prevXRefOffset, &followedXRefStm)) {
+            prevXRefOffset = 0;
+        }
+
+        // if there was a problem with the xref table,
+        // try to reconstruct it
+        if (!ok || (!prevXRefOffset && entries[i].type == xrefEntryNone)) {
+           GBool wasReconstructed = false;
+           if (!(ok = constructXRef(&wasReconstructed))) {
+               errCode = errDamaged;
+               break;
+           }
+           break;
+        }
+      }
+      
+      // We might have reconstructed the xref
+      // Check again i is in bounds
+      if (unlikely(i >= size)) {
+        static XRefEntry dummy;
+        dummy.offset = 0;
+        dummy.gen = -1;
+        dummy.type = xrefEntryNone;
+        dummy.updated = false;
+        return &dummy;
+      }
+
+      if (entries[i].type == xrefEntryNone) {
+        if (complainIfMissing) {
+          error(errSyntaxError, -1, "Invalid XRef entry");
+        }
+        entries[i].type = xrefEntryFree;
+      }
+    }
+  }
+
+  return &entries[i];
+}
+
+
diff --git a/poppler/XRef.h b/poppler/XRef.h
new file mode 100644 (file)
index 0000000..2add0a1
--- /dev/null
@@ -0,0 +1,214 @@
+//========================================================================
+//
+// XRef.h
+//
+// Copyright 1996-2003 Glyph & Cog, LLC
+//
+//========================================================================
+
+//========================================================================
+//
+// Modified under the Poppler project - http://poppler.freedesktop.org
+//
+// All changes made under the Poppler project to this file are licensed
+// under GPL version 2 or later
+//
+// Copyright (C) 2005 Brad Hards <bradh@frogmouth.net>
+// Copyright (C) 2006, 2008, 2010-2012 Albert Astals Cid <aacid@kde.org>
+// Copyright (C) 2007-2008 Julien Rebetez <julienr@svn.gnome.org>
+// Copyright (C) 2007 Carlos Garcia Campos <carlosgc@gnome.org>
+// Copyright (C) 2010 Ilya Gorenbein <igorenbein@finjan.com>
+// Copyright (C) 2010 Hib Eris <hib@hiberis.nl>
+// Copyright (C) 2012 Thomas Freitag <Thomas.Freitag@kabelmail.de>
+// Copyright (C) 2012 Fabio D'Urso <fabiodurso@hotmail.it>
+//
+// To see a description of the changes please see the Changelog file that
+// came with your tarball or type make ChangeLog if you are building from git
+//
+//========================================================================
+
+#ifndef XREF_H
+#define XREF_H
+
+#ifdef USE_GCC_PRAGMAS
+#pragma interface
+#endif
+
+#include "goo/gtypes.h"
+#include "Object.h"
+
+#include <vector>
+
+class Dict;
+class Stream;
+class Parser;
+class PopplerCache;
+
+//------------------------------------------------------------------------
+// XRef
+//------------------------------------------------------------------------
+
+enum XRefEntryType {
+  xrefEntryFree,
+  xrefEntryUncompressed,
+  xrefEntryCompressed,
+  xrefEntryNone
+};
+
+struct XRefEntry {
+  Guint offset;
+  int gen;
+  XRefEntryType type;
+  bool updated;
+  Object obj; //if this entry was updated, obj will contains the updated object
+};
+
+class XRef {
+public:
+
+  // Constructor, create an empty XRef, used for PDF writing
+  XRef();
+  // Constructor, create an empty XRef but with info dict, used for PDF writing
+  XRef(Object *trailerDictA);
+  // Constructor.  Read xref table from stream.
+  XRef(BaseStream *strA, Guint pos, Guint mainXRefEntriesOffsetA = 0, GBool *wasReconstructed = NULL, GBool reconstruct = false);
+
+  // Destructor.
+  ~XRef();
+
+  // Is xref table valid?
+  GBool isOk() { return ok; }
+
+  // Is the last XRef section a stream or a table?
+  GBool isXRefStream() { return xRefStream; }
+
+  // Get the error code (if isOk() returns false).
+  int getErrorCode() { return errCode; }
+
+  // Set the encryption parameters.
+  void setEncryption(int permFlagsA, GBool ownerPasswordOkA,
+                    Guchar *fileKeyA, int keyLengthA,
+                    int encVersionA, int encRevisionA,
+                    CryptAlgorithm encAlgorithmA);
+
+  // Is the file encrypted?
+  GBool isEncrypted() { return encrypted; }
+
+  // Check various permissions.
+  GBool okToPrint(GBool ignoreOwnerPW = gFalse);
+  GBool okToPrintHighRes(GBool ignoreOwnerPW = gFalse);
+  GBool okToChange(GBool ignoreOwnerPW = gFalse);
+  GBool okToCopy(GBool ignoreOwnerPW = gFalse);
+  GBool okToAddNotes(GBool ignoreOwnerPW = gFalse);
+  GBool okToFillForm(GBool ignoreOwnerPW = gFalse);
+  GBool okToAccessibility(GBool ignoreOwnerPW = gFalse);
+  GBool okToAssemble(GBool ignoreOwnerPW = gFalse);
+  int getPermFlags() { return permFlags; }
+
+  // Get catalog object.
+  Object *getCatalog(Object *obj);
+
+  // Fetch an indirect reference.
+  Object *fetch(int num, int gen, Object *obj, int recursion = 0);
+
+  // Return the document's Info dictionary (if any).
+  Object *getDocInfo(Object *obj);
+  Object *getDocInfoNF(Object *obj);
+
+  // Return the number of objects in the xref table.
+  int getNumObjects() { return size; }
+
+  // Return the catalog object reference.
+  int getRootNum() { return rootNum; }
+  int getRootGen() { return rootGen; }
+
+  // Get end position for a stream in a damaged file.
+  // Returns false if unknown or file is not damaged.
+  GBool getStreamEnd(Guint streamStart, Guint *streamEnd);
+
+  // Retuns the entry that belongs to the offset
+  int getNumEntry(Guint offset);
+
+  // Direct access.
+  XRefEntry *getEntry(int i, GBool complainIfMissing = gTrue);
+  Object *getTrailerDict() { return &trailerDict; }
+
+  // Write access
+  void setModifiedObject(Object* o, Ref r);
+  Ref addIndirectObject (Object* o);
+  void removeIndirectObject(Ref r);
+  void add(int num, int gen,  Guint offs, GBool used);
+
+  // Output XRef table to stream
+  void writeTableToFile(OutStream* outStr, GBool writeAllEntries);
+  // Output XRef stream contents to GooString and fill trailerDict fields accordingly
+  void writeStreamToBuffer(GooString *stmBuf, Dict *xrefDict, XRef *xref);
+
+private:
+
+  BaseStream *str;             // input stream
+  Guint start;                 // offset in file (to allow for garbage
+                               //   at beginning of file)
+  XRefEntry *entries;          // xref entries
+  int capacity;                        // size of <entries> array
+  int size;                    // number of entries
+  int rootNum, rootGen;                // catalog dict
+  GBool ok;                    // true if xref table is valid
+  int errCode;                 // error code (if <ok> is false)
+  Object trailerDict;          // trailer dictionary
+  Guint *streamEnds;           // 'endstream' positions - only used in
+                               //   damaged files
+  int streamEndsLen;           // number of valid entries in streamEnds
+  PopplerCache *objStrs;       // cached object streams
+  GBool encrypted;             // true if file is encrypted
+  int encRevision;             
+  int encVersion;              // encryption algorithm
+  CryptAlgorithm encAlgorithm; // encryption algorithm
+  int keyLength;               // length of key, in bytes
+  int permFlags;               // permission bits
+  Guchar fileKey[32];          // file decryption key
+  GBool ownerPasswordOk;       // true if owner password is correct
+  Guint prevXRefOffset;                // position of prev XRef section (= next to read)
+  Guint mainXRefEntriesOffset; // offset of entries in main XRef table
+  GBool xRefStream;            // true if last XRef section is a stream
+
+  void init();
+  int reserve(int newSize);
+  int resize(int newSize);
+  GBool readXRef(Guint *pos, std::vector<Guint> *followedXRefStm);
+  GBool readXRefTable(Parser *parser, Guint *pos, std::vector<Guint> *followedXRefStm);
+  GBool readXRefStreamSection(Stream *xrefStr, int *w, int first, int n);
+  GBool readXRefStream(Stream *xrefStr, Guint *pos);
+  GBool constructXRef(GBool *wasReconstructed, GBool needCatalogDict = gFalse);
+  GBool parseEntry(Guint offset, XRefEntry *entry);
+
+  class XRefWriter {
+  public:
+    virtual void startSection(int first, int count) = 0;
+    virtual void writeEntry(Guint offset, int gen, XRefEntryType type) = 0;
+    virtual ~XRefWriter() {};
+  };
+
+  class XRefTableWriter: public XRefWriter {
+  public:
+    XRefTableWriter(OutStream* outStrA);
+    void startSection(int first, int count);
+    void writeEntry(Guint offset, int gen, XRefEntryType type);
+  private:
+    OutStream* outStr;
+  };
+
+  class XRefStreamWriter: public XRefWriter {
+  public:
+    XRefStreamWriter(Object *index, GooString *stmBuf);
+    void startSection(int first, int count);
+    void writeEntry(Guint offset, int gen, XRefEntryType type);
+  private:
+    Object *index;
+    GooString *stmBuf;
+  };
+
+  void writeXRef(XRefWriter *writer, GBool writeAllEntries);
+};
+
+#endif
diff --git a/poppler/XpdfPluginAPI.cc b/poppler/XpdfPluginAPI.cc
new file mode 100644 (file)
index 0000000..834c681
--- /dev/null
@@ -0,0 +1,243 @@
+//========================================================================
+//
+// XpdfPluginAPI.cc
+//
+// Copyright 2004 Glyph & Cog, LLC
+//
+//========================================================================
+
+//========================================================================
+//
+// Modified under the Poppler project - http://poppler.freedesktop.org
+//
+// All changes made under the Poppler project to this file are licensed
+// under GPL version 2 or later
+//
+// Copyright (C) 2009 Kovid Goyal <kovid@kovidgoyal.net>
+// Copyright (C) 2012 Albert Astals Cid <aacid@kde.org>
+//
+// To see a description of the changes please see the Changelog file that
+// came with your tarball or type make ChangeLog if you are building from git
+//
+//========================================================================
+
+#include "config.h"
+
+#ifdef ENABLE_PLUGINS
+
+#include "gmem.h"
+#include "GlobalParams.h"
+#include "Object.h"
+#include "PDFDoc.h"
+#include "XpdfPluginAPI.h"
+
+//------------------------------------------------------------------------
+
+//~ This should use a pool of Objects; change xpdfFreeObj to match.
+static Object *allocObj() {
+  return (Object *)gmalloc(sizeof(Object));
+}
+
+//------------------------------------------------------------------------
+// Document access functions
+//------------------------------------------------------------------------
+
+XpdfObject _xpdfGetInfoDict(XpdfDoc doc) {
+  Object *obj;
+
+  obj = allocObj();
+  return (XpdfObject)((PDFDoc *)doc)->getDocInfo(obj);
+}
+
+XpdfObject _xpdfGetCatalog(XpdfDoc doc) {
+  Object *obj;
+
+  obj = allocObj();
+  return (XpdfObject)((PDFDoc *)doc)->getXRef()->getCatalog(obj);
+}
+
+//------------------------------------------------------------------------
+// Object access functions.
+//------------------------------------------------------------------------
+
+XpdfBool _xpdfObjIsBool(XpdfObject obj) {
+  return (XpdfBool)((Object *)obj)->isBool();
+}
+
+XpdfBool _xpdfObjIsInt(XpdfObject obj) {
+  return (XpdfBool)((Object *)obj)->isInt();
+}
+
+XpdfBool _xpdfObjIsReal(XpdfObject obj) {
+  return (XpdfBool)((Object *)obj)->isReal();
+}
+
+XpdfBool _xpdfObjIsNumber(XpdfObject obj) {
+  return (XpdfBool)((Object *)obj)->isNum();
+}
+
+XpdfBool _xpdfObjIsString(XpdfObject obj) {
+  return (XpdfBool)((Object *)obj)->isString();
+}
+
+XpdfBool _xpdfObjIsName(XpdfObject obj) {
+  return (XpdfBool)((Object *)obj)->isName();
+}
+
+XpdfBool _xpdfObjIsNull(XpdfObject obj) {
+  return (XpdfBool)((Object *)obj)->isNull();
+}
+
+XpdfBool _xpdfObjIsArray(XpdfObject obj) {
+  return (XpdfBool)((Object *)obj)->isArray();
+}
+
+XpdfBool _xpdfObjIsDict(XpdfObject obj) {
+  return (XpdfBool)((Object *)obj)->isDict();
+}
+
+XpdfBool _xpdfObjIsStream(XpdfObject obj) {
+  return (XpdfBool)((Object *)obj)->isStream();
+}
+
+XpdfBool _xpdfObjIsRef(XpdfObject obj) {
+  return (XpdfBool)((Object *)obj)->isRef();
+}
+
+XpdfBool _xpdfBoolValue(XpdfObject obj) {
+  return (XpdfBool)((Object *)obj)->getBool();
+}
+
+int _xpdfIntValue(XpdfObject obj) {
+  if (!((Object *)obj)->isInt()) {
+    return 0;
+  }
+  return ((Object *)obj)->getInt();
+}
+
+double _xpdfRealValue(XpdfObject obj) {
+  if (!((Object *)obj)->isReal()) {
+    return 0;
+  }
+  return ((Object *)obj)->getReal();
+}
+
+double _xpdfNumberValue(XpdfObject obj) {
+  if (!((Object *)obj)->isNum()) {
+    return 0;
+  }
+  return ((Object *)obj)->getNum();
+}
+
+int _xpdfStringLength(XpdfObject obj) {
+  if (!((Object *)obj)->isString()) {
+    return 0;
+  }
+  return ((Object *)obj)->getString()->getLength();
+}
+
+char *_xpdfStringValue(XpdfObject obj) {
+  if (!((Object *)obj)->isString()) {
+    return 0;
+  }
+  return ((Object *)obj)->getString()->getCString();
+}
+
+char *_xpdfNameValue(XpdfObject obj) {
+  if (!((Object *)obj)->isName()) {
+    return NULL;
+  }
+  return ((Object *)obj)->getName();
+}
+
+int _xpdfArrayLength(XpdfObject obj) {
+  if (!((Object *)obj)->isArray()) {
+    return 0;
+  }
+  return ((Object *)obj)->arrayGetLength();
+}
+
+XpdfObject _xpdfArrayGet(XpdfObject obj, int idx) {
+  Object *elem;
+
+  elem = allocObj();
+  if (!((Object *)obj)->isArray()) {
+    return (XpdfObject)elem->initNull();
+  }
+  return (XpdfObject)((Object *)obj)->arrayGet(idx, elem);
+}
+
+XpdfObject _xpdfDictGet(XpdfObject obj, char *key) {
+  Object *elem;
+
+  elem = allocObj();
+  if (!((Object *)obj)->isDict()) {
+    return (XpdfObject)elem->initNull();
+  }
+  return (XpdfObject)((Object *)obj)->dictLookup(key, elem);
+}
+
+void _xpdfFreeObj(XpdfObject obj) {
+  ((Object *)obj)->free();
+  gfree(obj);
+}
+
+//------------------------------------------------------------------------
+// Memory allocation functions
+//------------------------------------------------------------------------
+
+void *_xpdfMalloc(int size) {
+  return gmalloc(size);
+}
+
+void *_xpdfRealloc(void *p, int size) {
+  return grealloc(p, size);
+}
+
+void _xpdfFree(void *p) {
+  gfree(p);
+}
+
+//------------------------------------------------------------------------
+// Security handlers
+//------------------------------------------------------------------------
+
+void _xpdfRegisterSecurityHandler(XpdfSecurityHandler *handler) {
+  if (handler->version <= xpdfPluginAPIVersion) {
+    globalParams->addSecurityHandler(handler);
+  }
+}
+
+//------------------------------------------------------------------------
+
+XpdfPluginVecTable xpdfPluginVecTable = {
+  xpdfPluginAPIVersion,
+  &_xpdfGetInfoDict,
+  &_xpdfGetCatalog,
+  &_xpdfObjIsBool,
+  &_xpdfObjIsInt,
+  &_xpdfObjIsReal,
+  &_xpdfObjIsString,
+  &_xpdfObjIsName,
+  &_xpdfObjIsNull,
+  &_xpdfObjIsArray,
+  &_xpdfObjIsDict,
+  &_xpdfObjIsStream,
+  &_xpdfObjIsRef,
+  &_xpdfBoolValue,
+  &_xpdfIntValue,
+  &_xpdfRealValue,
+  &_xpdfStringLength,
+  &_xpdfStringValue,
+  &_xpdfNameValue,
+  &_xpdfArrayLength,
+  &_xpdfArrayGet,
+  &_xpdfDictGet,
+  &_xpdfFreeObj,
+  &_xpdfMalloc,
+  &_xpdfRealloc,
+  &_xpdfFree,
+  &_xpdfRegisterSecurityHandler,
+};
+
+#endif // ENABLE_PLUGINS
diff --git a/poppler/XpdfPluginAPI.h b/poppler/XpdfPluginAPI.h
new file mode 100644 (file)
index 0000000..b0165c0
--- /dev/null
@@ -0,0 +1,337 @@
+/*
+ * XpdfPluginAPI.h
+ *
+ * Copyright 2004 Glyph & Cog, LLC
+ */
+
+//========================================================================
+//
+// Modified under the Poppler project - http://poppler.freedesktop.org
+//
+// All changes made under the Poppler project to this file are licensed
+// under GPL version 2 or later
+//
+// Copyright (C) 2012 Albert Astals Cid <aacid@kde.org>
+//
+// To see a description of the changes please see the Changelog file that
+// came with your tarball or type make ChangeLog if you are building from git
+//
+//========================================================================
+
+#ifndef XPDFPLUGINAPI_H
+#define XPDFPLUGINAPI_H
+
+#ifdef _WIN32
+#include <windows.h>
+#else
+#define Object XtObject
+#include <X11/Intrinsic.h>
+#undef Object
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*------------------------------------------------------------------------
+ * Macros
+ *------------------------------------------------------------------------*/
+
+/*
+ * The current API version.
+ */
+#define xpdfPluginAPIVersion 1
+
+#ifdef _WIN32
+#  ifdef __cplusplus
+#    define PLUGINFUNC(retType) extern "C" __declspec(dllexport) retType
+#  else
+#    define PLUGINFUNC(retType) extern __declspec(dllexport) retType
+#  endif
+#else
+#  ifdef __cplusplus
+#    define PLUGINFUNC(retType) extern "C" retType
+#  else
+#    define PLUGINFUNC(retType) extern retType
+#  endif
+#endif
+
+/*------------------------------------------------------------------------
+ * Plugin setup/cleanup
+ *------------------------------------------------------------------------*/
+
+/*
+ * All plugins are required to implement two functions:
+ *
+ * -- Initialize the plugin.  Returns non-zero if successful.
+ * PLUGINFUNC(XpdfBool) xpdfInitPlugin(void);
+ *
+ * -- Free the plugin.
+ * PLUGINFUNC(void) xpdfFreePlugin(void);
+ */
+
+/*------------------------------------------------------------------------
+ * Types
+ *------------------------------------------------------------------------*/
+
+/*
+ * Standard C boolean -- zero = false, non-zero = true.
+ */
+typedef int XpdfBool;
+#define xpdfTrue  1
+#define xpdfFalse 0
+
+/*
+ * PDF document handle.
+ */
+typedef struct _XpdfDoc *XpdfDoc;
+
+/*
+ * PDF object handle.
+ */
+typedef struct _XpdfObject *XpdfObject;
+
+/*
+ * Document access permissions.  Any of these can be bitwise 'or'ed
+ * together.  If xpdfPermissionOpen is not included, the document
+ * cannot be opened at all, and the other bits are ignored.
+ */
+typedef unsigned int XpdfPermission;
+#define xpdfPermissionOpen     (1 << 0)
+#define xpdfPermissionPrint    (1 << 2)
+#define xpdfPermissionChange   (1 << 3)
+#define xpdfPermissionCopy     (1 << 4)
+#define xpdfPermissionNotes    (1 << 5)
+
+/*------------------------------------------------------------------------
+ * Security handler
+ *------------------------------------------------------------------------*/
+
+/*
+ * XpdfSecurityHandler - a security handler plugin should create one
+ * of these and pass it to xpdfRegisterSecurityHandler.
+ */
+#ifdef __cplusplus
+struct XpdfSecurityHandler {
+#else
+typedef struct {
+#endif
+
+  /*
+   * Version of the security handler spec (this document) -- use
+   * xpdfPluginAPIVersion.
+   */
+  int version;
+
+  /*
+   * Security handler name.
+   */
+  char *name;
+
+  /*
+   * Any global data the security handler needs.  XpdfViewer will pass
+   * this pointer to all handler functions as the <handlerData>
+   * argument.
+   */
+  void *handlerData;
+
+  /*
+   * Allocate and initialize data for a new document.  XpdfViewer will
+   * pass the returned pointer to all other handler functions as the
+   * <docData> argument.  Returns non-zero if successful.
+   */
+  XpdfBool (*newDoc)(void *handlerData, XpdfDoc doc,
+                    XpdfObject encryptDict, void **docData);
+
+  /*
+   * Free the data allocated by newDoc.
+   */
+  void (*freeDoc)(void *handlerData, void *docData);
+
+  /*
+   * Construct authorization data based on the supplied owner and user
+   * passwords (either or both of which may be NULL).  This function
+   * is called in "batch" mode, i.e., if the password was supplied on
+   * the command line or via an Xpdf library API.  It should not
+   * generate any user interaction (e.g., a password dialog).  It is
+   * not required to support this function: the makeAuthData function
+   * pointer can be set to NULL.  Returns non-zero if successful.
+   */
+  XpdfBool (*makeAuthData)(void *handlerData, void *docData,
+                          char *ownerPassword, char *userPassword,
+                          void **authData);
+
+  /*
+   * Request any needed information (e.g., a password) from the user,
+   * and construct an authorization data object.  Returns non-zero if
+   * successful.
+   */
+  XpdfBool (*getAuthData)(void *handlerData, void *docData,
+                         void **authData);
+
+  /*
+   * Free the data allocated by getAuthData.
+   */
+  void (*freeAuthData)(void *handlerData, void *docData,
+                      void *authData);
+
+  /*
+   * Request permission to access the document.  This returns all
+   * permissions granted by authData.
+   */
+  XpdfPermission (*authorize)(void *handlerData, void *docData,
+                             void *authData);
+
+  /*
+   * Get the decryption key and algorithm version associated with the
+   * document.  Returns non-zero if successful.
+   */
+  XpdfBool (*getKey)(void *handlerData, void *docData,
+                    char **key, int *keyLen, int *cryptVersion, int *cryptRevision);
+
+  /*
+   * Free the data allocated by getKey.
+   */
+  void (*freeKey)(void *handlerData, void *docData,
+                 char *key, int keyLen);
+
+#ifdef __cplusplus
+};
+#else
+} XpdfSecurityHandler;
+#endif
+
+/*------------------------------------------------------------------------*/
+
+typedef struct {
+  int version;
+
+/*------------------------------------------------------------------------
+ * Document access functions
+ *------------------------------------------------------------------------*/
+
+/*
+ * Get a document's info dictionary.  (The returned object must be
+ * freed with xpdfFreeObj.)
+ */
+XpdfObject (*_xpdfGetInfoDict)(XpdfDoc doc);
+
+/*
+ * Get a document's catalog ("root") dictionary.  (The returned object
+ * must be freed with xpdfFreeObj.)
+ */
+XpdfObject (*_xpdfGetCatalog)(XpdfDoc doc);
+
+/*------------------------------------------------------------------------
+ * Object access functions
+ *------------------------------------------------------------------------*/
+
+/*
+ * Check an object's type.
+ */
+XpdfBool (*_xpdfObjIsBool)(XpdfObject obj);
+XpdfBool (*_xpdfObjIsInt)(XpdfObject obj);
+XpdfBool (*_xpdfObjIsReal)(XpdfObject obj);
+XpdfBool (*_xpdfObjIsString)(XpdfObject obj);
+XpdfBool (*_xpdfObjIsName)(XpdfObject obj);
+XpdfBool (*_xpdfObjIsNull)(XpdfObject obj);
+XpdfBool (*_xpdfObjIsArray)(XpdfObject obj);
+XpdfBool (*_xpdfObjIsDict)(XpdfObject obj);
+XpdfBool (*_xpdfObjIsStream)(XpdfObject obj);
+XpdfBool (*_xpdfObjIsRef)(XpdfObject obj);
+
+/*
+ * Value access.
+ * (Objects returned by xpdfArrayGet and xpdfDictGet must be freed
+ * with xpdfFreeObj.)
+ */
+XpdfBool (*_xpdfBoolValue)(XpdfObject obj);
+int (*_xpdfIntValue)(XpdfObject obj);
+double (*_xpdfRealValue)(XpdfObject obj);
+int (*_xpdfStringLength)(XpdfObject obj);
+char *(*_xpdfStringValue)(XpdfObject obj);
+char *(*_xpdfNameValue)(XpdfObject obj);
+int (*_xpdfArrayLength)(XpdfObject obj);
+XpdfObject (*_xpdfArrayGet)(XpdfObject obj, int idx);
+XpdfObject (*_xpdfDictGet)(XpdfObject obj, char *key);
+
+/*
+ * Object destruction.  NB: *all* objects must be freed after use.
+ */
+void (*_xpdfFreeObj)(XpdfObject obj);
+
+/*------------------------------------------------------------------------
+ * Memory allocation functions
+ *------------------------------------------------------------------------*/
+
+void *(*_xpdfMalloc)(int size);
+void *(*_xpdfRealloc)(void *p, int size);
+void (*_xpdfFree)(void *p);
+
+/*------------------------------------------------------------------------
+ * Security handler functions
+ *------------------------------------------------------------------------*/
+
+/*
+ * Register a new security handler.
+ */
+void (*_xpdfRegisterSecurityHandler)(XpdfSecurityHandler *handler);
+
+/*------------------------------------------------------------------------*/
+
+} XpdfPluginVecTable;
+
+#ifdef _WIN32
+
+extern __declspec(dllexport) XpdfPluginVecTable xpdfPluginVecTable;
+
+#define xpdfPluginSetup \
+  extern __declspec(dllexport) \
+  XpdfPluginVecTable xpdfPluginVecTable = {xpdfPluginAPIVersion};
+
+#else
+
+extern XpdfPluginVecTable xpdfPluginVecTable;
+
+#define xpdfPluginSetup \
+  XpdfPluginVecTable xpdfPluginVecTable = {xpdfPluginAPIVersion};
+
+#endif
+
+#define xpdfGetInfoDict (*xpdfPluginVecTable._xpdfGetInfoDict)
+#define xpdfGetCatalog (*xpdfPluginVecTable._xpdfGetCatalog)
+#ifdef _WIN32
+#define xpdfWin32GetWindow (*xpdfPluginVecTable._xpdfWin32GetWindow)
+#else
+#define xpdfXGetWindow (*xpdfPluginVecTable._xpdfXGetWindow)
+#endif
+#define xpdfObjIsBool (*xpdfPluginVecTable._xpdfObjIsBool)
+#define xpdfObjIsInt (*xpdfPluginVecTable._xpdfObjIsInt)
+#define xpdfObjIsReal (*xpdfPluginVecTable._xpdfObjIsReal)
+#define xpdfObjIsString (*xpdfPluginVecTable._xpdfObjIsString)
+#define xpdfObjIsName (*xpdfPluginVecTable._xpdfObjIsName)
+#define xpdfObjIsNull (*xpdfPluginVecTable._xpdfObjIsNull)
+#define xpdfObjIsArray (*xpdfPluginVecTable._xpdfObjIsArray)
+#define xpdfObjIsDict (*xpdfPluginVecTable._xpdfObjIsDict)
+#define xpdfObjIsStream (*xpdfPluginVecTable._xpdfObjIsStream)
+#define xpdfObjIsRef (*xpdfPluginVecTable._xpdfObjIsRef)
+#define xpdfBoolValue (*xpdfPluginVecTable._xpdfBoolValue)
+#define xpdfIntValue (*xpdfPluginVecTable._xpdfIntValue)
+#define xpdfRealValue (*xpdfPluginVecTable._xpdfRealValue)
+#define xpdfStringLength (*xpdfPluginVecTable._xpdfStringLength)
+#define xpdfStringValue (*xpdfPluginVecTable._xpdfStringValue)
+#define xpdfNameValue (*xpdfPluginVecTable._xpdfNameValue)
+#define xpdfArrayLength (*xpdfPluginVecTable._xpdfArrayLength)
+#define xpdfArrayGet (*xpdfPluginVecTable._xpdfArrayGet)
+#define xpdfDictGet (*xpdfPluginVecTable._xpdfDictGet)
+#define xpdfFreeObj (*xpdfPluginVecTable._xpdfFreeObj)
+#define xpdfMalloc (*xpdfPluginVecTable._xpdfMalloc)
+#define xpdfRealloc (*xpdfPluginVecTable._xpdfRealloc)
+#define xpdfFree (*xpdfPluginVecTable._xpdfFree)
+#define xpdfRegisterSecurityHandler (*xpdfPluginVecTable._xpdfRegisterSecurityHandler)
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/poppler/gen-unicode-tables.py b/poppler/gen-unicode-tables.py
new file mode 100644 (file)
index 0000000..282f6e5
--- /dev/null
@@ -0,0 +1,38 @@
+UNICODE_LAST_CHAR_PART1 = 0x2FAFF
+HANGUL_S_BASE = 0xAC00
+HANGUL_S_COUNT = 19 * 21 * 28
+import unicodedata
+
+print """// Generated by gen-unicode-tables.py
+
+typedef struct {
+  Unicode character;
+  int length;
+  int offset;
+} decomposition;
+"""
+
+decomp_table = []
+max_index = 0
+decomp_expansion_index = {}
+decomp_expansion = []
+for u in xrange(0, UNICODE_LAST_CHAR_PART1):
+       if (u >= HANGUL_S_BASE and u < HANGUL_S_BASE + HANGUL_S_COUNT):
+               continue
+       norm = tuple(map(ord, unicodedata.normalize("NFKD", unichr(u))))
+       if norm != (u,):
+               try: 
+                       i = decomp_expansion_index[norm]
+                       decomp_table.append((u, len(norm), i))
+               except KeyError:
+                       decomp_table.append((u, len(norm), max_index))
+                       decomp_expansion_index[norm] = max_index
+                       decomp_expansion.append((norm, max_index))
+                       max_index += len(norm)
+print "#define DECOMP_TABLE_LENGTH %d\n" % len(decomp_table)
+print "static const decomposition decomp_table[] = {\n%s\n};\n" % ", \n".join(
+               "  { 0x%x, %d, %d }" % (character, length, offset)
+               for character, length, offset in decomp_table)
+print "static const Unicode decomp_expansion[] = {\n%s\n};\n" % ", \n".join(
+               "  %s /* offset %d */ " % (", ".join("0x%x" % u for u in norm), 
+                       index) for norm, index in decomp_expansion)
diff --git a/poppler/poppler-config.h.cmake b/poppler/poppler-config.h.cmake
new file mode 100644 (file)
index 0000000..94a12aa
--- /dev/null
@@ -0,0 +1,183 @@
+//================================================= -*- mode: c++ -*- ====
+//
+// poppler-config.h
+//
+// Copyright 1996-2011 Glyph & Cog, LLC
+//
+//========================================================================
+
+#ifndef POPPLER_CONFIG_H
+#define POPPLER_CONFIG_H
+
+// We duplicate some of the config.h #define's here since they are
+// used in some of the header files we install.  The #ifndef/#endif
+// around #undef look odd, but it's to silence warnings about
+// redefining those symbols.
+
+/* Defines the poppler version */
+#ifndef POPPLER_VERSION
+#define POPPLER_VERSION "${POPPLER_VERSION}"
+#endif
+
+/* Enable multithreading support. */
+#ifndef MULTITHREADED
+#cmakedefine MULTITHREADED 1
+#endif
+
+/* Use fixedpoint. */
+#ifndef USE_FIXEDPOINT
+#cmakedefine USE_FIXEDPOINT 1
+#endif
+
+/* Use single precision arithmetic in the Splash backend */
+#ifndef USE_FLOAT
+#cmakedefine USE_FLOAT 1
+#endif
+
+/* Include support for OPI comments. */
+#ifndef OPI_SUPPORT
+#cmakedefine OPI_SUPPORT 1
+#endif
+
+/* Enable word list support. */
+#ifndef TEXTOUT_WORD_LIST
+#cmakedefine TEXTOUT_WORD_LIST 1
+#endif
+
+/* Use fontconfig font configuration backend */
+#ifndef WITH_FONTCONFIGURATION_FONTCONFIG
+#cmakedefine WITH_FONTCONFIGURATION_FONTCONFIG 1
+#endif
+
+/* Use win32 font configuration backend */
+#ifndef WITH_FONTCONFIGURATION_WIN32
+#cmakedefine WITH_FONTCONFIGURATION_WIN32 1
+#endif
+
+/* Support for curl is compiled in. */
+#ifndef POPPLER_HAS_CURL_SUPPORT
+#cmakedefine POPPLER_HAS_CURL_SUPPORT 1
+#endif
+
+/* Use libjpeg instead of builtin jpeg decoder. */
+#ifndef ENABLE_LIBJPEG
+#cmakedefine ENABLE_LIBJPEG 1
+#endif
+
+/* Build against libtiff. */
+#ifndef ENABLE_LIBTIFF
+#cmakedefine ENABLE_LIBTIFF 1
+#endif
+
+/* Build against libpng. */
+#ifndef ENABLE_LIBPNG
+#cmakedefine ENABLE_LIBPNG 1
+#endif
+
+/* Use zlib instead of builtin zlib decoder. */
+#ifndef ENABLE_ZLIB
+#cmakedefine ENABLE_ZLIB 1
+#endif
+
+/* Define to 1 if you have the <dirent.h> header file, and it defines `DIR'.
+   */
+#ifndef HAVE_DIRENT_H
+#cmakedefine HAVE_DIRENT_H 1
+#endif
+
+/* Defines if gettimeofday is available on your system */
+#ifndef HAVE_GETTIMEOFDAY
+#cmakedefine HAVE_GETTIMEOFDAY 1
+#endif
+
+/* Define to 1 if you have the <ndir.h> header file, and it defines `DIR'. */
+#ifndef HAVE_NDIR_H
+#cmakedefine HAVE_NDIR_H 1
+#endif
+
+/* Define to 1 if you have the <sys/dir.h> header file, and it defines `DIR'.
+   */
+#ifndef HAVE_SYS_DIR_H
+#cmakedefine HAVE_SYS_DIR_H 1
+#endif
+
+/* Define to 1 if you have the <sys/ndir.h> header file, and it defines `DIR'.
+   */
+#ifndef HAVE_SYS_NDIR_H
+#cmakedefine HAVE_SYS_NDIR_H 1
+#endif
+
+/* Have FreeType2 include files */
+#ifndef HAVE_FREETYPE_H
+#cmakedefine HAVE_FREETYPE_H 1
+#endif
+
+/* Defines if use cms */
+#ifndef USE_CMS
+#cmakedefine USE_CMS 1
+#endif
+
+// Also, there are preprocessor symbols in the header files
+// that are used but never defined when building poppler using configure
+// or cmake: DISABLE_OUTLINE, DEBUG_MEM, SPLASH_CMYK, HAVE_T1LIB_H,
+// ENABLE_PLUGINS, DEBUG_FORMS, HAVE_FREETYPE_FREETYPE_H
+
+//------------------------------------------------------------------------
+// version
+//------------------------------------------------------------------------
+
+// copyright notice
+#define popplerCopyright "Copyright 2005-2012 The Poppler Developers - http://poppler.freedesktop.org"
+#define xpdfCopyright "Copyright 1996-2011 Glyph & Cog, LLC"
+
+//------------------------------------------------------------------------
+// popen
+//------------------------------------------------------------------------
+
+#if defined(_MSC_VER) || defined(__BORLANDC__)
+#define popen _popen
+#define pclose _pclose
+#endif
+
+#if defined(VMS) || defined(VMCMS) || defined(DOS) || defined(OS2) || defined(__EMX__) || defined(_WIN32) || defined(__DJGPP__) || defined(MACOS)
+#define POPEN_READ_MODE "rb"
+#else
+#define POPEN_READ_MODE "r"
+#endif
+
+//------------------------------------------------------------------------
+// Win32 stuff
+//------------------------------------------------------------------------
+
+#if defined(_WIN32) && !defined(_MSC_VER)
+#include <windef.h>
+#else
+#define CDECL
+#endif
+
+#if defined(_WIN32)
+#ifdef _MSC_VER
+#define strtok_r strtok_s
+#elif __MINGW32__
+char * strtok_r (char *s, const char *delim, char **save_ptr);
+#endif
+#endif
+
+//------------------------------------------------------------------------
+// Compiler
+//------------------------------------------------------------------------
+
+#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ > 4)
+#define GCC_PRINTF_FORMAT(fmt_index, va_index) \
+       __attribute__((__format__(__printf__, fmt_index, va_index)))
+#else
+#define GCC_PRINTF_FORMAT(fmt_index, va_index)
+#endif
+
+#if defined(_MSC_VER)
+#define fmax(a, b) max(a, b)
+#define fmin(a, b) min(a, b)
+#endif
+
+
+#endif /* POPPLER_CONFIG_H */
diff --git a/poppler/poppler-config.h.in b/poppler/poppler-config.h.in
new file mode 100644 (file)
index 0000000..302d12e
--- /dev/null
@@ -0,0 +1,183 @@
+//================================================= -*- mode: c++ -*- ====
+//
+// poppler-config.h
+//
+// Copyright 1996-2011 Glyph & Cog, LLC
+//
+//========================================================================
+
+#ifndef POPPLER_CONFIG_H
+#define POPPLER_CONFIG_H
+
+// We duplicate some of the config.h #define's here since they are
+// used in some of the header files we install.  The #ifndef/#endif
+// around #undef look odd, but it's to silence warnings about
+// redefining those symbols.
+
+/* Defines the poppler version. */
+#ifndef POPPLER_VERSION
+#undef POPPLER_VERSION
+#endif
+
+/* Enable multithreading support. */
+#ifndef MULTITHREADED
+#undef MULTITHREADED
+#endif
+
+/* Use fixedpoint. */
+#ifndef USE_FIXEDPOINT
+#undef USE_FIXEDPOINT
+#endif
+
+/* Use single precision arithmetic in the Splash backend */
+#ifndef USE_FLOAT
+#undef USE_FLOAT
+#endif
+
+/* Include support for OPI comments. */
+#ifndef OPI_SUPPORT
+#undef OPI_SUPPORT
+#endif
+
+/* Enable word list support. */
+#ifndef TEXTOUT_WORD_LIST
+#undef TEXTOUT_WORD_LIST
+#endif
+
+/* Use fontconfig font configuration backend */
+#ifndef WITH_FONTCONFIGURATION_FONTCONFIG
+#undef WITH_FONTCONFIGURATION_FONTCONFIG
+#endif
+
+/* Use win32 font configuration backend */
+#ifndef WITH_FONTCONFIGURATION_WIN32
+#undef WITH_FONTCONFIGURATION_WIN32
+#endif
+
+/* Support for curl is compiled in. */
+#ifndef POPPLER_HAS_CURL_SUPPORT
+#undef POPPLER_HAS_CURL_SUPPORT
+#endif
+
+/* Use libjpeg instead of builtin jpeg decoder. */
+#ifndef ENABLE_LIBJPEG
+#undef ENABLE_LIBJPEG
+#endif
+
+/* Build against libtiff. */
+#ifndef ENABLE_LIBTIFF
+#undef ENABLE_LIBTIFF
+#endif
+
+/* Build against libpng. */
+#ifndef ENABLE_LIBPNG
+#undef ENABLE_LIBPNG
+#endif
+
+/* Use zlib instead of builtin zlib decoder. */
+#ifndef ENABLE_ZLIB
+#undef ENABLE_ZLIB
+#endif
+
+/* Define to 1 if you have the <dirent.h> header file, and it defines `DIR'.
+   */
+#ifndef HAVE_DIRENT_H
+#undef HAVE_DIRENT_H
+#endif
+
+/* Defines if gettimeofday is available on your system */
+#ifndef HAVE_GETTIMEOFDAY
+#undef HAVE_GETTIMEOFDAY
+#endif
+
+/* Define to 1 if you have the <ndir.h> header file, and it defines `DIR'. */
+#ifndef HAVE_NDIR_H
+#undef HAVE_NDIR_H
+#endif
+
+/* Define to 1 if you have the <sys/dir.h> header file, and it defines `DIR'.
+   */
+#ifndef HAVE_SYS_DIR_H
+#undef HAVE_SYS_DIR_H
+#endif
+
+/* Define to 1 if you have the <sys/ndir.h> header file, and it defines `DIR'.
+   */
+#ifndef HAVE_SYS_NDIR_H
+#undef HAVE_SYS_NDIR_H
+#endif
+
+/* Have FreeType2 include files */
+#ifndef HAVE_FREETYPE_H
+#undef HAVE_FREETYPE_H
+#endif
+
+/* Defines if use cms */
+#ifndef USE_CMS
+#undef USE_CMS
+#endif
+
+// Also, there are preprocessor symbols in the header files
+// that are used but never defined when building poppler using configure
+// or cmake: DISABLE_OUTLINE, DEBUG_MEM, SPLASH_CMYK, HAVE_T1LIB_H,
+// ENABLE_PLUGINS, DEBUG_FORMS, HAVE_FREETYPE_FREETYPE_H
+
+//------------------------------------------------------------------------
+// version
+//------------------------------------------------------------------------
+
+// copyright notice
+#define popplerCopyright "Copyright 2005-2012 The Poppler Developers - http://poppler.freedesktop.org"
+#define xpdfCopyright "Copyright 1996-2011 Glyph & Cog, LLC"
+
+//------------------------------------------------------------------------
+// popen
+//------------------------------------------------------------------------
+
+#if defined(_MSC_VER) || defined(__BORLANDC__)
+#define popen _popen
+#define pclose _pclose
+#endif
+
+#if defined(VMS) || defined(VMCMS) || defined(DOS) || defined(OS2) || defined(__EMX__) || defined(_WIN32) || defined(__DJGPP__) || defined(MACOS)
+#define POPEN_READ_MODE "rb"
+#else
+#define POPEN_READ_MODE "r"
+#endif
+
+//------------------------------------------------------------------------
+// Win32 stuff
+//------------------------------------------------------------------------
+
+#if defined(_WIN32) && !defined(_MSC_VER)
+#include <windef.h>
+#else
+#define CDECL
+#endif
+
+#if defined(_WIN32)
+#ifdef _MSC_VER
+#define strtok_r strtok_s
+#elif __MINGW32__
+char * strtok_r (char *s, const char *delim, char **save_ptr);
+#endif
+#endif
+
+//------------------------------------------------------------------------
+// Compiler
+//------------------------------------------------------------------------
+
+#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ > 4)
+#define GCC_PRINTF_FORMAT(fmt_index, va_index) \
+       __attribute__((__format__(__printf__, fmt_index, va_index)))
+#else
+#define GCC_PRINTF_FORMAT(fmt_index, va_index)
+#endif
+
+#if defined(_MSC_VER)
+#define fmax(a, b) max(a, b)
+#define fmin(a, b) min(a, b)
+#endif
+
+
+#endif /* POPPLER_CONFIG_H */
diff --git a/poppler/strtok_r.cpp b/poppler/strtok_r.cpp
new file mode 100644 (file)
index 0000000..30e2196
--- /dev/null
@@ -0,0 +1,77 @@
+/* Reentrant string tokenizer.  Generic version.
+   Copyright (C) 1991,1996-1999,2001,2004 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, write to the Free
+   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+   02111-1307 USA.  */
+
+/* Copyright (C) 1991,93,96,97,99,2000,2002 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+   Based on strlen implementation by Torbjorn Granlund (tege@sics.se),
+   with help from Dan Sahlin (dan@sics.se) and
+   commentary by Jim Blandy (jimb@ai.mit.edu);
+   adaptation to memchr suggested by Dick Karpinski (dick@cca.ucsf.edu),
+   and implemented by Roland McGrath (roland@ai.mit.edu).
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, write to the Free
+   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+   02111-1307 USA.  */
+
+#ifdef __MINGW32__
+#include <string.h>
+
+#define __rawmemchr strchr
+
+char * strtok_r (char *s, const char *delim, char **save_ptr)
+{
+  char *token;
+
+  if (s == NULL)
+    s = *save_ptr;
+
+  /* Scan leading delimiters.  */
+  s += strspn (s, delim);
+  if (*s == '\0')
+    {
+      *save_ptr = s;
+      return NULL;
+    }
+
+  /* Find the end of the token.  */
+  token = s;
+  s = strpbrk (token, delim);
+  if (s == NULL)
+    /* This token finishes the string.  */
+    *save_ptr = __rawmemchr (token, '\0');
+  else
+    {
+      /* Terminate the token and make *SAVE_PTR point past it.  */
+      *s = '\0';
+      *save_ptr = s + 1;
+    }
+  return token;
+}
+#endif
diff --git a/qt4/CMakeLists.txt b/qt4/CMakeLists.txt
new file mode 100644 (file)
index 0000000..a364abf
--- /dev/null
@@ -0,0 +1,3 @@
+add_subdirectory(src)
+add_subdirectory(tests)
+add_subdirectory(demos)
diff --git a/qt4/Makefile.am b/qt4/Makefile.am
new file mode 100644 (file)
index 0000000..69a10cb
--- /dev/null
@@ -0,0 +1 @@
+SUBDIRS = src tests demos
diff --git a/qt4/Makefile.in b/qt4/Makefile.in
new file mode 100644 (file)
index 0000000..7a4094d
--- /dev/null
@@ -0,0 +1,676 @@
+# Makefile.in generated by automake 1.11.5 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software
+# Foundation, Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+@SET_MAKE@
+VPATH = @srcdir@
+am__make_dryrun = \
+  { \
+    am__dry=no; \
+    case $$MAKEFLAGS in \
+      *\\[\ \  ]*) \
+        echo 'am--echo: ; @echo "AM"  OK' | $(MAKE) -f - 2>/dev/null \
+          | grep '^AM OK$$' >/dev/null || am__dry=yes;; \
+      *) \
+        for am__flg in $$MAKEFLAGS; do \
+          case $$am__flg in \
+            *=*|--*) ;; \
+            *n*) am__dry=yes; break;; \
+          esac; \
+        done;; \
+    esac; \
+    test $$am__dry = yes; \
+  }
+pkgdatadir = $(datadir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkglibexecdir = $(libexecdir)/@PACKAGE@
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+subdir = qt4
+DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/m4/acx_pthread.m4 \
+       $(top_srcdir)/m4/define-dir.m4 $(top_srcdir)/m4/gtk-doc.m4 \
+       $(top_srcdir)/m4/iconv.m4 $(top_srcdir)/m4/introspection.m4 \
+       $(top_srcdir)/m4/libjpeg.m4 $(top_srcdir)/m4/libtool.m4 \
+       $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \
+       $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \
+       $(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+       $(ACLOCAL_M4)
+mkinstalldirs = $(install_sh) -d
+CONFIG_HEADER = $(top_builddir)/config.h \
+       $(top_builddir)/poppler/poppler-config.h
+CONFIG_CLEAN_FILES =
+CONFIG_CLEAN_VPATH_FILES =
+AM_V_GEN = $(am__v_GEN_@AM_V@)
+am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@)
+am__v_GEN_0 = @echo "  GEN   " $@;
+AM_V_at = $(am__v_at_@AM_V@)
+am__v_at_ = $(am__v_at_@AM_DEFAULT_V@)
+am__v_at_0 = @
+SOURCES =
+DIST_SOURCES =
+RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \
+       html-recursive info-recursive install-data-recursive \
+       install-dvi-recursive install-exec-recursive \
+       install-html-recursive install-info-recursive \
+       install-pdf-recursive install-ps-recursive install-recursive \
+       installcheck-recursive installdirs-recursive pdf-recursive \
+       ps-recursive uninstall-recursive
+am__can_run_installinfo = \
+  case $$AM_UPDATE_INFO_DIR in \
+    n|no|NO) false;; \
+    *) (install-info --version) >/dev/null 2>&1;; \
+  esac
+RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive        \
+  distclean-recursive maintainer-clean-recursive
+AM_RECURSIVE_TARGETS = $(RECURSIVE_TARGETS:-recursive=) \
+       $(RECURSIVE_CLEAN_TARGETS:-recursive=) tags TAGS ctags CTAGS \
+       distdir
+ETAGS = etags
+CTAGS = ctags
+DIST_SUBDIRS = $(SUBDIRS)
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+am__relativize = \
+  dir0=`pwd`; \
+  sed_first='s,^\([^/]*\)/.*$$,\1,'; \
+  sed_rest='s,^[^/]*/*,,'; \
+  sed_last='s,^.*/\([^/]*\)$$,\1,'; \
+  sed_butlast='s,/*[^/]*$$,,'; \
+  while test -n "$$dir1"; do \
+    first=`echo "$$dir1" | sed -e "$$sed_first"`; \
+    if test "$$first" != "."; then \
+      if test "$$first" = ".."; then \
+        dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \
+        dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \
+      else \
+        first2=`echo "$$dir2" | sed -e "$$sed_first"`; \
+        if test "$$first2" = "$$first"; then \
+          dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \
+        else \
+          dir2="../$$dir2"; \
+        fi; \
+        dir0="$$dir0"/"$$first"; \
+      fi; \
+    fi; \
+    dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \
+  done; \
+  reldir="$$dir2"
+ACLOCAL = @ACLOCAL@
+AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AR = @AR@
+AS = @AS@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CAIRO_CFLAGS = @CAIRO_CFLAGS@
+CAIRO_FEATURE = @CAIRO_FEATURE@
+CAIRO_LIBS = @CAIRO_LIBS@
+CAIRO_REQ = @CAIRO_REQ@
+CAIRO_VERSION = @CAIRO_VERSION@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CXX = @CXX@
+CXXCPP = @CXXCPP@
+CXXDEPMODE = @CXXDEPMODE@
+CXXFLAGS = @CXXFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DLLTOOL = @DLLTOOL@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+FGREP = @FGREP@
+FONTCONFIG_CFLAGS = @FONTCONFIG_CFLAGS@
+FONTCONFIG_LIBS = @FONTCONFIG_LIBS@
+FREETYPE_CFLAGS = @FREETYPE_CFLAGS@
+FREETYPE_CONFIG = @FREETYPE_CONFIG@
+FREETYPE_LIBS = @FREETYPE_LIBS@
+GLIB_MKENUMS = @GLIB_MKENUMS@
+GLIB_REQ = @GLIB_REQ@
+GLIB_REQUIRED = @GLIB_REQUIRED@
+GREP = @GREP@
+GTKDOC_CHECK = @GTKDOC_CHECK@
+GTKDOC_DEPS_CFLAGS = @GTKDOC_DEPS_CFLAGS@
+GTKDOC_DEPS_LIBS = @GTKDOC_DEPS_LIBS@
+GTKDOC_MKPDF = @GTKDOC_MKPDF@
+GTKDOC_REBASE = @GTKDOC_REBASE@
+GTK_TEST_CFLAGS = @GTK_TEST_CFLAGS@
+GTK_TEST_LIBS = @GTK_TEST_LIBS@
+HTML_DIR = @HTML_DIR@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+INTROSPECTION_CFLAGS = @INTROSPECTION_CFLAGS@
+INTROSPECTION_COMPILER = @INTROSPECTION_COMPILER@
+INTROSPECTION_GENERATE = @INTROSPECTION_GENERATE@
+INTROSPECTION_GIRDIR = @INTROSPECTION_GIRDIR@
+INTROSPECTION_LIBS = @INTROSPECTION_LIBS@
+INTROSPECTION_MAKEFILE = @INTROSPECTION_MAKEFILE@
+INTROSPECTION_SCANNER = @INTROSPECTION_SCANNER@
+INTROSPECTION_TYPELIBDIR = @INTROSPECTION_TYPELIBDIR@
+LCMS_CFLAGS = @LCMS_CFLAGS@
+LCMS_LIBS = @LCMS_LIBS@
+LD = @LD@
+LDFLAGS = @LDFLAGS@
+LIBCURL_CFLAGS = @LIBCURL_CFLAGS@
+LIBCURL_LIBS = @LIBCURL_LIBS@
+LIBICONV = @LIBICONV@
+LIBJPEG_CFLAGS = @LIBJPEG_CFLAGS@
+LIBJPEG_LIBS = @LIBJPEG_LIBS@
+LIBOBJS = @LIBOBJS@
+LIBOPENJPEG_CFLAGS = @LIBOPENJPEG_CFLAGS@
+LIBOPENJPEG_LIBS = @LIBOPENJPEG_LIBS@
+LIBPNG_CFLAGS = @LIBPNG_CFLAGS@
+LIBPNG_LIBS = @LIBPNG_LIBS@
+LIBS = @LIBS@
+LIBTIFF_CFLAGS = @LIBTIFF_CFLAGS@
+LIBTIFF_CFLAGSS = @LIBTIFF_CFLAGSS@
+LIBTIFF_LIBS = @LIBTIFF_LIBS@
+LIBTOOL = @LIBTOOL@
+LIPO = @LIPO@
+LN_S = @LN_S@
+LTLIBICONV = @LTLIBICONV@
+LTLIBOBJS = @LTLIBOBJS@
+MAKEINFO = @MAKEINFO@
+MANIFEST_TOOL = @MANIFEST_TOOL@
+MKDIR_P = @MKDIR_P@
+MOCQT4 = @MOCQT4@
+NM = @NM@
+NMEDIT = @NMEDIT@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+OTOOL = @OTOOL@
+OTOOL64 = @OTOOL64@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_URL = @PACKAGE_URL@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PC_REQUIRES = @PC_REQUIRES@
+PC_REQUIRES_PRIVATE = @PC_REQUIRES_PRIVATE@
+PDFTOCAIRO_CFLAGS = @PDFTOCAIRO_CFLAGS@
+PDFTOCAIRO_LIBS = @PDFTOCAIRO_LIBS@
+PKG_CONFIG = @PKG_CONFIG@
+PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@
+PKG_CONFIG_PATH = @PKG_CONFIG_PATH@
+POPPLER_DATADIR = @POPPLER_DATADIR@
+POPPLER_GLIB_CFLAGS = @POPPLER_GLIB_CFLAGS@
+POPPLER_GLIB_DISABLE_DEPRECATED = @POPPLER_GLIB_DISABLE_DEPRECATED@
+POPPLER_GLIB_DISABLE_SINGLE_INCLUDES = @POPPLER_GLIB_DISABLE_SINGLE_INCLUDES@
+POPPLER_GLIB_LIBS = @POPPLER_GLIB_LIBS@
+POPPLER_MAJOR_VERSION = @POPPLER_MAJOR_VERSION@
+POPPLER_MICRO_VERSION = @POPPLER_MICRO_VERSION@
+POPPLER_MINOR_VERSION = @POPPLER_MINOR_VERSION@
+POPPLER_QT4_CFLAGS = @POPPLER_QT4_CFLAGS@
+POPPLER_QT4_CXXFLAGS = @POPPLER_QT4_CXXFLAGS@
+POPPLER_QT4_LIBS = @POPPLER_QT4_LIBS@
+POPPLER_QT4_TEST_CFLAGS = @POPPLER_QT4_TEST_CFLAGS@
+POPPLER_QT4_TEST_LIBS = @POPPLER_QT4_TEST_LIBS@
+POPPLER_VERSION = @POPPLER_VERSION@
+PTHREAD_CC = @PTHREAD_CC@
+PTHREAD_CFLAGS = @PTHREAD_CFLAGS@
+PTHREAD_LIBS = @PTHREAD_LIBS@
+RANLIB = @RANLIB@
+SED = @SED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+TESTDATADIR = @TESTDATADIR@
+VERSION = @VERSION@
+XMKMF = @XMKMF@
+X_CFLAGS = @X_CFLAGS@
+X_EXTRA_LIBS = @X_EXTRA_LIBS@
+X_LIBS = @X_LIBS@
+X_PRE_LIBS = @X_PRE_LIBS@
+ZLIB_LIBS = @ZLIB_LIBS@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
+ac_ct_AR = @ac_ct_AR@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_CXX = @ac_ct_CXX@
+ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
+acx_pthread_config = @acx_pthread_config@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+auto_import_flags = @auto_import_flags@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+builddir = @builddir@
+create_shared_lib = @create_shared_lib@
+datadir = @datadir@
+datarootdir = @datarootdir@
+docdir = @docdir@
+dvidir = @dvidir@
+exec_prefix = @exec_prefix@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+htmldir = @htmldir@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localedir = @localedir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+srcdir = @srcdir@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+top_build_prefix = @top_build_prefix@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+win32_libs = @win32_libs@
+SUBDIRS = src tests demos
+all: all-recursive
+
+.SUFFIXES:
+$(srcdir)/Makefile.in:  $(srcdir)/Makefile.am  $(am__configure_deps)
+       @for dep in $?; do \
+         case '$(am__configure_deps)' in \
+           *$$dep*) \
+             ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
+               && { if test -f $@; then exit 0; else break; fi; }; \
+             exit 1;; \
+         esac; \
+       done; \
+       echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign qt4/Makefile'; \
+       $(am__cd) $(top_srcdir) && \
+         $(AUTOMAKE) --foreign qt4/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+       @case '$?' in \
+         *config.status*) \
+           cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+         *) \
+           echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+           cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+       esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+       cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure:  $(am__configure_deps)
+       cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4):  $(am__aclocal_m4_deps)
+       cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(am__aclocal_m4_deps):
+
+mostlyclean-libtool:
+       -rm -f *.lo
+
+clean-libtool:
+       -rm -rf .libs _libs
+
+# This directory's subdirectories are mostly independent; you can cd
+# into them and run `make' without going through this Makefile.
+# To change the values of `make' variables: instead of editing Makefiles,
+# (1) if the variable is set in `config.status', edit `config.status'
+#     (which will cause the Makefiles to be regenerated when you run `make');
+# (2) otherwise, pass the desired values on the `make' command line.
+$(RECURSIVE_TARGETS):
+       @fail= failcom='exit 1'; \
+       for f in x $$MAKEFLAGS; do \
+         case $$f in \
+           *=* | --[!k]*);; \
+           *k*) failcom='fail=yes';; \
+         esac; \
+       done; \
+       dot_seen=no; \
+       target=`echo $@ | sed s/-recursive//`; \
+       list='$(SUBDIRS)'; for subdir in $$list; do \
+         echo "Making $$target in $$subdir"; \
+         if test "$$subdir" = "."; then \
+           dot_seen=yes; \
+           local_target="$$target-am"; \
+         else \
+           local_target="$$target"; \
+         fi; \
+         ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
+         || eval $$failcom; \
+       done; \
+       if test "$$dot_seen" = "no"; then \
+         $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \
+       fi; test -z "$$fail"
+
+$(RECURSIVE_CLEAN_TARGETS):
+       @fail= failcom='exit 1'; \
+       for f in x $$MAKEFLAGS; do \
+         case $$f in \
+           *=* | --[!k]*);; \
+           *k*) failcom='fail=yes';; \
+         esac; \
+       done; \
+       dot_seen=no; \
+       case "$@" in \
+         distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \
+         *) list='$(SUBDIRS)' ;; \
+       esac; \
+       rev=''; for subdir in $$list; do \
+         if test "$$subdir" = "."; then :; else \
+           rev="$$subdir $$rev"; \
+         fi; \
+       done; \
+       rev="$$rev ."; \
+       target=`echo $@ | sed s/-recursive//`; \
+       for subdir in $$rev; do \
+         echo "Making $$target in $$subdir"; \
+         if test "$$subdir" = "."; then \
+           local_target="$$target-am"; \
+         else \
+           local_target="$$target"; \
+         fi; \
+         ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
+         || eval $$failcom; \
+       done && test -z "$$fail"
+tags-recursive:
+       list='$(SUBDIRS)'; for subdir in $$list; do \
+         test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \
+       done
+ctags-recursive:
+       list='$(SUBDIRS)'; for subdir in $$list; do \
+         test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \
+       done
+
+ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
+       list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+       unique=`for i in $$list; do \
+           if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+         done | \
+         $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
+             END { if (nonempty) { for (i in files) print i; }; }'`; \
+       mkid -fID $$unique
+tags: TAGS
+
+TAGS: tags-recursive $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
+               $(TAGS_FILES) $(LISP)
+       set x; \
+       here=`pwd`; \
+       if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \
+         include_option=--etags-include; \
+         empty_fix=.; \
+       else \
+         include_option=--include; \
+         empty_fix=; \
+       fi; \
+       list='$(SUBDIRS)'; for subdir in $$list; do \
+         if test "$$subdir" = .; then :; else \
+           test ! -f $$subdir/TAGS || \
+             set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \
+         fi; \
+       done; \
+       list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
+       unique=`for i in $$list; do \
+           if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+         done | \
+         $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
+             END { if (nonempty) { for (i in files) print i; }; }'`; \
+       shift; \
+       if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
+         test -n "$$unique" || unique=$$empty_fix; \
+         if test $$# -gt 0; then \
+           $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+             "$$@" $$unique; \
+         else \
+           $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+             $$unique; \
+         fi; \
+       fi
+ctags: CTAGS
+CTAGS: ctags-recursive $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
+               $(TAGS_FILES) $(LISP)
+       list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
+       unique=`for i in $$list; do \
+           if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+         done | \
+         $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
+             END { if (nonempty) { for (i in files) print i; }; }'`; \
+       test -z "$(CTAGS_ARGS)$$unique" \
+         || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+            $$unique
+
+GTAGS:
+       here=`$(am__cd) $(top_builddir) && pwd` \
+         && $(am__cd) $(top_srcdir) \
+         && gtags -i $(GTAGS_ARGS) "$$here"
+
+distclean-tags:
+       -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+
+distdir: $(DISTFILES)
+       @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+       topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+       list='$(DISTFILES)'; \
+         dist_files=`for file in $$list; do echo $$file; done | \
+         sed -e "s|^$$srcdirstrip/||;t" \
+             -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+       case $$dist_files in \
+         */*) $(MKDIR_P) `echo "$$dist_files" | \
+                          sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+                          sort -u` ;; \
+       esac; \
+       for file in $$dist_files; do \
+         if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+         if test -d $$d/$$file; then \
+           dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+           if test -d "$(distdir)/$$file"; then \
+             find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+           fi; \
+           if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+             cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
+             find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+           fi; \
+           cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
+         else \
+           test -f "$(distdir)/$$file" \
+           || cp -p $$d/$$file "$(distdir)/$$file" \
+           || exit 1; \
+         fi; \
+       done
+       @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \
+         if test "$$subdir" = .; then :; else \
+           $(am__make_dryrun) \
+             || test -d "$(distdir)/$$subdir" \
+             || $(MKDIR_P) "$(distdir)/$$subdir" \
+             || exit 1; \
+           dir1=$$subdir; dir2="$(distdir)/$$subdir"; \
+           $(am__relativize); \
+           new_distdir=$$reldir; \
+           dir1=$$subdir; dir2="$(top_distdir)"; \
+           $(am__relativize); \
+           new_top_distdir=$$reldir; \
+           echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \
+           echo "     am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \
+           ($(am__cd) $$subdir && \
+             $(MAKE) $(AM_MAKEFLAGS) \
+               top_distdir="$$new_top_distdir" \
+               distdir="$$new_distdir" \
+               am__remove_distdir=: \
+               am__skip_length_check=: \
+               am__skip_mode_fix=: \
+               distdir) \
+             || exit 1; \
+         fi; \
+       done
+check-am: all-am
+check: check-recursive
+all-am: Makefile
+installdirs: installdirs-recursive
+installdirs-am:
+install: install-recursive
+install-exec: install-exec-recursive
+install-data: install-data-recursive
+uninstall: uninstall-recursive
+
+install-am: all-am
+       @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-recursive
+install-strip:
+       if test -z '$(STRIP)'; then \
+         $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+           install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+             install; \
+       else \
+         $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+           install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+           "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
+       fi
+mostlyclean-generic:
+
+clean-generic:
+
+distclean-generic:
+       -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+       -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
+
+maintainer-clean-generic:
+       @echo "This command is intended for maintainers to use"
+       @echo "it deletes files that may require special tools to rebuild."
+clean: clean-recursive
+
+clean-am: clean-generic clean-libtool mostlyclean-am
+
+distclean: distclean-recursive
+       -rm -f Makefile
+distclean-am: clean-am distclean-generic distclean-tags
+
+dvi: dvi-recursive
+
+dvi-am:
+
+html: html-recursive
+
+html-am:
+
+info: info-recursive
+
+info-am:
+
+install-data-am:
+
+install-dvi: install-dvi-recursive
+
+install-dvi-am:
+
+install-exec-am:
+
+install-html: install-html-recursive
+
+install-html-am:
+
+install-info: install-info-recursive
+
+install-info-am:
+
+install-man:
+
+install-pdf: install-pdf-recursive
+
+install-pdf-am:
+
+install-ps: install-ps-recursive
+
+install-ps-am:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-recursive
+       -rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-recursive
+
+mostlyclean-am: mostlyclean-generic mostlyclean-libtool
+
+pdf: pdf-recursive
+
+pdf-am:
+
+ps: ps-recursive
+
+ps-am:
+
+uninstall-am:
+
+.MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) ctags-recursive \
+       install-am install-strip tags-recursive
+
+.PHONY: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) CTAGS GTAGS \
+       all all-am check check-am clean clean-generic clean-libtool \
+       ctags ctags-recursive distclean distclean-generic \
+       distclean-libtool distclean-tags distdir dvi dvi-am html \
+       html-am info info-am install install-am install-data \
+       install-data-am install-dvi install-dvi-am install-exec \
+       install-exec-am install-html install-html-am install-info \
+       install-info-am install-man install-pdf install-pdf-am \
+       install-ps install-ps-am install-strip installcheck \
+       installcheck-am installdirs installdirs-am maintainer-clean \
+       maintainer-clean-generic mostlyclean mostlyclean-generic \
+       mostlyclean-libtool pdf pdf-am ps ps-am tags tags-recursive \
+       uninstall uninstall-am
+
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/qt4/demos/CMakeLists.txt b/qt4/demos/CMakeLists.txt
new file mode 100644 (file)
index 0000000..76accf8
--- /dev/null
@@ -0,0 +1,28 @@
+add_definitions(${QT4_DEFINITIONS})
+
+include_directories(
+  ${CMAKE_CURRENT_SOURCE_DIR}
+  ${CMAKE_CURRENT_SOURCE_DIR}/../src
+  ${CMAKE_CURRENT_BINARY_DIR}
+  ${QT4_INCLUDE_DIR}
+)
+
+set(poppler_qt4viewer_SRCS
+  abstractinfodock.cpp
+  documentobserver.cpp
+  embeddedfiles.cpp
+  fonts.cpp
+  info.cpp
+  main_viewer.cpp
+  metadata.cpp
+  navigationtoolbar.cpp
+  optcontent.cpp
+  pageview.cpp
+  permissions.cpp
+  thumbnails.cpp
+  toc.cpp
+  viewer.cpp
+)
+qt4_automoc(${poppler_qt4viewer_SRCS})
+poppler_add_test(poppler_qt4viewer BUILD_QT4_TESTS ${poppler_qt4viewer_SRCS})
+target_link_libraries(poppler_qt4viewer poppler-qt4)
diff --git a/qt4/demos/Makefile.am b/qt4/demos/Makefile.am
new file mode 100644 (file)
index 0000000..155fc1c
--- /dev/null
@@ -0,0 +1,69 @@
+AM_LDFLAGS = @auto_import_flags@
+
+INCLUDES =                                     \
+       -I$(top_srcdir)                         \
+       -I$(top_srcdir)/poppler                 \
+       -I$(top_srcdir)/qt4/src                 \
+       $(FONTCONFIG_CFLAGS)                    \
+       $(POPPLER_QT4_CFLAGS)
+
+LDADDS =                                       \
+       $(top_builddir)/poppler/libpoppler.la   \
+       $(top_builddir)/qt4/src/libpoppler-qt4.la       \
+       $(FONTCONFIG_LIBS)                              \
+       $(POPPLER_QT4_LIBS)
+
+SUFFIXES: .moc
+
+# This rule lets GNU make create any *.moc from the equivalent *.h
+.h.moc:
+       $(AM_V_GEN) $(MOCQT4) -i $< -o $@
+
+noinst_PROGRAMS = poppler_qt4viewer
+
+poppler_qt4viewer_SOURCES =                    \
+       abstractinfodock.cpp                    \
+       abstractinfodock.h                      \
+       documentobserver.cpp                    \
+       documentobserver.h                      \
+       embeddedfiles.cpp                       \
+       embeddedfiles.h                         \
+       fonts.cpp                               \
+       fonts.h                                 \
+       info.cpp                                \
+       info.h                                  \
+       main_viewer.cpp                         \
+       metadata.cpp                            \
+       metadata.h                              \
+       navigationtoolbar.cpp                   \
+       navigationtoolbar.h                     \
+       optcontent.cpp                          \
+       optcontent.h                            \
+       pageview.cpp                            \
+       pageview.h                              \
+       permissions.cpp                         \
+       permissions.h                           \
+       thumbnails.cpp                          \
+       thumbnails.h                            \
+       toc.cpp                                 \
+       toc.h                                   \
+       viewer.cpp                              \
+       viewer.h
+
+abstractinfodock.$(OBJEXT): abstractinfodock.moc
+embeddedfiles.$(OBJEXT): embeddedfiles.moc
+fonts.$(OBJEXT): fonts.moc
+info.$(OBJEXT): info.moc
+metadata.$(OBJEXT): metadata.moc
+navigationtoolbar.$(OBJEXT): navigationtoolbar.moc
+optcontent.$(OBJEXT): optcontent.moc
+pageview.$(OBJEXT): pageview.moc
+permissions.$(OBJEXT): permissions.moc
+thumbnails.$(OBJEXT): thumbnails.moc
+toc.$(OBJEXT): toc.moc
+viewer.$(OBJEXT): viewer.moc
+
+poppler_qt4viewer_LDADD = $(LDADDS)
+
+clean-generic:
+       rm -f *.moc
diff --git a/qt4/demos/Makefile.in b/qt4/demos/Makefile.in
new file mode 100644 (file)
index 0000000..adc2a85
--- /dev/null
@@ -0,0 +1,704 @@
+# Makefile.in generated by automake 1.11.5 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software
+# Foundation, Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+@SET_MAKE@
+
+VPATH = @srcdir@
+am__make_dryrun = \
+  { \
+    am__dry=no; \
+    case $$MAKEFLAGS in \
+      *\\[\ \  ]*) \
+        echo 'am--echo: ; @echo "AM"  OK' | $(MAKE) -f - 2>/dev/null \
+          | grep '^AM OK$$' >/dev/null || am__dry=yes;; \
+      *) \
+        for am__flg in $$MAKEFLAGS; do \
+          case $$am__flg in \
+            *=*|--*) ;; \
+            *n*) am__dry=yes; break;; \
+          esac; \
+        done;; \
+    esac; \
+    test $$am__dry = yes; \
+  }
+pkgdatadir = $(datadir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkglibexecdir = $(libexecdir)/@PACKAGE@
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+noinst_PROGRAMS = poppler_qt4viewer$(EXEEXT)
+subdir = qt4/demos
+DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/m4/acx_pthread.m4 \
+       $(top_srcdir)/m4/define-dir.m4 $(top_srcdir)/m4/gtk-doc.m4 \
+       $(top_srcdir)/m4/iconv.m4 $(top_srcdir)/m4/introspection.m4 \
+       $(top_srcdir)/m4/libjpeg.m4 $(top_srcdir)/m4/libtool.m4 \
+       $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \
+       $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \
+       $(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+       $(ACLOCAL_M4)
+mkinstalldirs = $(install_sh) -d
+CONFIG_HEADER = $(top_builddir)/config.h \
+       $(top_builddir)/poppler/poppler-config.h
+CONFIG_CLEAN_FILES =
+CONFIG_CLEAN_VPATH_FILES =
+PROGRAMS = $(noinst_PROGRAMS)
+am_poppler_qt4viewer_OBJECTS = abstractinfodock.$(OBJEXT) \
+       documentobserver.$(OBJEXT) embeddedfiles.$(OBJEXT) \
+       fonts.$(OBJEXT) info.$(OBJEXT) main_viewer.$(OBJEXT) \
+       metadata.$(OBJEXT) navigationtoolbar.$(OBJEXT) \
+       optcontent.$(OBJEXT) pageview.$(OBJEXT) permissions.$(OBJEXT) \
+       thumbnails.$(OBJEXT) toc.$(OBJEXT) viewer.$(OBJEXT)
+poppler_qt4viewer_OBJECTS = $(am_poppler_qt4viewer_OBJECTS)
+am__DEPENDENCIES_1 =
+am__DEPENDENCIES_2 = $(top_builddir)/poppler/libpoppler.la \
+       $(top_builddir)/qt4/src/libpoppler-qt4.la \
+       $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1)
+poppler_qt4viewer_DEPENDENCIES = $(am__DEPENDENCIES_2)
+AM_V_lt = $(am__v_lt_@AM_V@)
+am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@)
+am__v_lt_0 = --silent
+DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) -I$(top_builddir)/poppler
+depcomp = $(SHELL) $(top_srcdir)/depcomp
+am__depfiles_maybe = depfiles
+am__mv = mv -f
+CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
+       $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)
+LTCXXCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \
+       $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) \
+       $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
+       $(AM_CXXFLAGS) $(CXXFLAGS)
+AM_V_CXX = $(am__v_CXX_@AM_V@)
+am__v_CXX_ = $(am__v_CXX_@AM_DEFAULT_V@)
+am__v_CXX_0 = @echo "  CXX   " $@;
+AM_V_at = $(am__v_at_@AM_V@)
+am__v_at_ = $(am__v_at_@AM_DEFAULT_V@)
+am__v_at_0 = @
+CXXLD = $(CXX)
+CXXLINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \
+       $(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \
+       $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
+AM_V_CXXLD = $(am__v_CXXLD_@AM_V@)
+am__v_CXXLD_ = $(am__v_CXXLD_@AM_DEFAULT_V@)
+am__v_CXXLD_0 = @echo "  CXXLD " $@;
+COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
+       $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
+LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
+       $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \
+       $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
+       $(AM_CFLAGS) $(CFLAGS)
+AM_V_CC = $(am__v_CC_@AM_V@)
+am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@)
+am__v_CC_0 = @echo "  CC    " $@;
+CCLD = $(CC)
+LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
+       $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
+       $(AM_LDFLAGS) $(LDFLAGS) -o $@
+AM_V_CCLD = $(am__v_CCLD_@AM_V@)
+am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@)
+am__v_CCLD_0 = @echo "  CCLD  " $@;
+AM_V_GEN = $(am__v_GEN_@AM_V@)
+am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@)
+am__v_GEN_0 = @echo "  GEN   " $@;
+SOURCES = $(poppler_qt4viewer_SOURCES)
+DIST_SOURCES = $(poppler_qt4viewer_SOURCES)
+am__can_run_installinfo = \
+  case $$AM_UPDATE_INFO_DIR in \
+    n|no|NO) false;; \
+    *) (install-info --version) >/dev/null 2>&1;; \
+  esac
+ETAGS = etags
+CTAGS = ctags
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AR = @AR@
+AS = @AS@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CAIRO_CFLAGS = @CAIRO_CFLAGS@
+CAIRO_FEATURE = @CAIRO_FEATURE@
+CAIRO_LIBS = @CAIRO_LIBS@
+CAIRO_REQ = @CAIRO_REQ@
+CAIRO_VERSION = @CAIRO_VERSION@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CXX = @CXX@
+CXXCPP = @CXXCPP@
+CXXDEPMODE = @CXXDEPMODE@
+CXXFLAGS = @CXXFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DLLTOOL = @DLLTOOL@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+FGREP = @FGREP@
+FONTCONFIG_CFLAGS = @FONTCONFIG_CFLAGS@
+FONTCONFIG_LIBS = @FONTCONFIG_LIBS@
+FREETYPE_CFLAGS = @FREETYPE_CFLAGS@
+FREETYPE_CONFIG = @FREETYPE_CONFIG@
+FREETYPE_LIBS = @FREETYPE_LIBS@
+GLIB_MKENUMS = @GLIB_MKENUMS@
+GLIB_REQ = @GLIB_REQ@
+GLIB_REQUIRED = @GLIB_REQUIRED@
+GREP = @GREP@
+GTKDOC_CHECK = @GTKDOC_CHECK@
+GTKDOC_DEPS_CFLAGS = @GTKDOC_DEPS_CFLAGS@
+GTKDOC_DEPS_LIBS = @GTKDOC_DEPS_LIBS@
+GTKDOC_MKPDF = @GTKDOC_MKPDF@
+GTKDOC_REBASE = @GTKDOC_REBASE@
+GTK_TEST_CFLAGS = @GTK_TEST_CFLAGS@
+GTK_TEST_LIBS = @GTK_TEST_LIBS@
+HTML_DIR = @HTML_DIR@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+INTROSPECTION_CFLAGS = @INTROSPECTION_CFLAGS@
+INTROSPECTION_COMPILER = @INTROSPECTION_COMPILER@
+INTROSPECTION_GENERATE = @INTROSPECTION_GENERATE@
+INTROSPECTION_GIRDIR = @INTROSPECTION_GIRDIR@
+INTROSPECTION_LIBS = @INTROSPECTION_LIBS@
+INTROSPECTION_MAKEFILE = @INTROSPECTION_MAKEFILE@
+INTROSPECTION_SCANNER = @INTROSPECTION_SCANNER@
+INTROSPECTION_TYPELIBDIR = @INTROSPECTION_TYPELIBDIR@
+LCMS_CFLAGS = @LCMS_CFLAGS@
+LCMS_LIBS = @LCMS_LIBS@
+LD = @LD@
+LDFLAGS = @LDFLAGS@
+LIBCURL_CFLAGS = @LIBCURL_CFLAGS@
+LIBCURL_LIBS = @LIBCURL_LIBS@
+LIBICONV = @LIBICONV@
+LIBJPEG_CFLAGS = @LIBJPEG_CFLAGS@
+LIBJPEG_LIBS = @LIBJPEG_LIBS@
+LIBOBJS = @LIBOBJS@
+LIBOPENJPEG_CFLAGS = @LIBOPENJPEG_CFLAGS@
+LIBOPENJPEG_LIBS = @LIBOPENJPEG_LIBS@
+LIBPNG_CFLAGS = @LIBPNG_CFLAGS@
+LIBPNG_LIBS = @LIBPNG_LIBS@
+LIBS = @LIBS@
+LIBTIFF_CFLAGS = @LIBTIFF_CFLAGS@
+LIBTIFF_CFLAGSS = @LIBTIFF_CFLAGSS@
+LIBTIFF_LIBS = @LIBTIFF_LIBS@
+LIBTOOL = @LIBTOOL@
+LIPO = @LIPO@
+LN_S = @LN_S@
+LTLIBICONV = @LTLIBICONV@
+LTLIBOBJS = @LTLIBOBJS@
+MAKEINFO = @MAKEINFO@
+MANIFEST_TOOL = @MANIFEST_TOOL@
+MKDIR_P = @MKDIR_P@
+MOCQT4 = @MOCQT4@
+NM = @NM@
+NMEDIT = @NMEDIT@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+OTOOL = @OTOOL@
+OTOOL64 = @OTOOL64@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_URL = @PACKAGE_URL@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PC_REQUIRES = @PC_REQUIRES@
+PC_REQUIRES_PRIVATE = @PC_REQUIRES_PRIVATE@
+PDFTOCAIRO_CFLAGS = @PDFTOCAIRO_CFLAGS@
+PDFTOCAIRO_LIBS = @PDFTOCAIRO_LIBS@
+PKG_CONFIG = @PKG_CONFIG@
+PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@
+PKG_CONFIG_PATH = @PKG_CONFIG_PATH@
+POPPLER_DATADIR = @POPPLER_DATADIR@
+POPPLER_GLIB_CFLAGS = @POPPLER_GLIB_CFLAGS@
+POPPLER_GLIB_DISABLE_DEPRECATED = @POPPLER_GLIB_DISABLE_DEPRECATED@
+POPPLER_GLIB_DISABLE_SINGLE_INCLUDES = @POPPLER_GLIB_DISABLE_SINGLE_INCLUDES@
+POPPLER_GLIB_LIBS = @POPPLER_GLIB_LIBS@
+POPPLER_MAJOR_VERSION = @POPPLER_MAJOR_VERSION@
+POPPLER_MICRO_VERSION = @POPPLER_MICRO_VERSION@
+POPPLER_MINOR_VERSION = @POPPLER_MINOR_VERSION@
+POPPLER_QT4_CFLAGS = @POPPLER_QT4_CFLAGS@
+POPPLER_QT4_CXXFLAGS = @POPPLER_QT4_CXXFLAGS@
+POPPLER_QT4_LIBS = @POPPLER_QT4_LIBS@
+POPPLER_QT4_TEST_CFLAGS = @POPPLER_QT4_TEST_CFLAGS@
+POPPLER_QT4_TEST_LIBS = @POPPLER_QT4_TEST_LIBS@
+POPPLER_VERSION = @POPPLER_VERSION@
+PTHREAD_CC = @PTHREAD_CC@
+PTHREAD_CFLAGS = @PTHREAD_CFLAGS@
+PTHREAD_LIBS = @PTHREAD_LIBS@
+RANLIB = @RANLIB@
+SED = @SED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+TESTDATADIR = @TESTDATADIR@
+VERSION = @VERSION@
+XMKMF = @XMKMF@
+X_CFLAGS = @X_CFLAGS@
+X_EXTRA_LIBS = @X_EXTRA_LIBS@
+X_LIBS = @X_LIBS@
+X_PRE_LIBS = @X_PRE_LIBS@
+ZLIB_LIBS = @ZLIB_LIBS@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
+ac_ct_AR = @ac_ct_AR@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_CXX = @ac_ct_CXX@
+ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
+acx_pthread_config = @acx_pthread_config@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+auto_import_flags = @auto_import_flags@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+builddir = @builddir@
+create_shared_lib = @create_shared_lib@
+datadir = @datadir@
+datarootdir = @datarootdir@
+docdir = @docdir@
+dvidir = @dvidir@
+exec_prefix = @exec_prefix@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+htmldir = @htmldir@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localedir = @localedir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+srcdir = @srcdir@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+top_build_prefix = @top_build_prefix@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+win32_libs = @win32_libs@
+AM_LDFLAGS = @auto_import_flags@
+INCLUDES = \
+       -I$(top_srcdir)                         \
+       -I$(top_srcdir)/poppler                 \
+       -I$(top_srcdir)/qt4/src                 \
+       $(FONTCONFIG_CFLAGS)                    \
+       $(POPPLER_QT4_CFLAGS)
+
+LDADDS = \
+       $(top_builddir)/poppler/libpoppler.la   \
+       $(top_builddir)/qt4/src/libpoppler-qt4.la       \
+       $(FONTCONFIG_LIBS)                              \
+       $(POPPLER_QT4_LIBS)
+
+poppler_qt4viewer_SOURCES = \
+       abstractinfodock.cpp                    \
+       abstractinfodock.h                      \
+       documentobserver.cpp                    \
+       documentobserver.h                      \
+       embeddedfiles.cpp                       \
+       embeddedfiles.h                         \
+       fonts.cpp                               \
+       fonts.h                                 \
+       info.cpp                                \
+       info.h                                  \
+       main_viewer.cpp                         \
+       metadata.cpp                            \
+       metadata.h                              \
+       navigationtoolbar.cpp                   \
+       navigationtoolbar.h                     \
+       optcontent.cpp                          \
+       optcontent.h                            \
+       pageview.cpp                            \
+       pageview.h                              \
+       permissions.cpp                         \
+       permissions.h                           \
+       thumbnails.cpp                          \
+       thumbnails.h                            \
+       toc.cpp                                 \
+       toc.h                                   \
+       viewer.cpp                              \
+       viewer.h
+
+poppler_qt4viewer_LDADD = $(LDADDS)
+all: all-am
+
+.SUFFIXES:
+.SUFFIXES: .cpp .h .lo .moc .o .obj
+$(srcdir)/Makefile.in:  $(srcdir)/Makefile.am  $(am__configure_deps)
+       @for dep in $?; do \
+         case '$(am__configure_deps)' in \
+           *$$dep*) \
+             ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
+               && { if test -f $@; then exit 0; else break; fi; }; \
+             exit 1;; \
+         esac; \
+       done; \
+       echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign qt4/demos/Makefile'; \
+       $(am__cd) $(top_srcdir) && \
+         $(AUTOMAKE) --foreign qt4/demos/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+       @case '$?' in \
+         *config.status*) \
+           cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+         *) \
+           echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+           cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+       esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+       cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure:  $(am__configure_deps)
+       cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4):  $(am__aclocal_m4_deps)
+       cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(am__aclocal_m4_deps):
+
+clean-noinstPROGRAMS:
+       @list='$(noinst_PROGRAMS)'; test -n "$$list" || exit 0; \
+       echo " rm -f" $$list; \
+       rm -f $$list || exit $$?; \
+       test -n "$(EXEEXT)" || exit 0; \
+       list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \
+       echo " rm -f" $$list; \
+       rm -f $$list
+poppler_qt4viewer$(EXEEXT): $(poppler_qt4viewer_OBJECTS) $(poppler_qt4viewer_DEPENDENCIES) $(EXTRA_poppler_qt4viewer_DEPENDENCIES) 
+       @rm -f poppler_qt4viewer$(EXEEXT)
+       $(AM_V_CXXLD)$(CXXLINK) $(poppler_qt4viewer_OBJECTS) $(poppler_qt4viewer_LDADD) $(LIBS)
+
+mostlyclean-compile:
+       -rm -f *.$(OBJEXT)
+
+distclean-compile:
+       -rm -f *.tab.c
+
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/abstractinfodock.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/documentobserver.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/embeddedfiles.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fonts.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/info.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/main_viewer.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/metadata.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/navigationtoolbar.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/optcontent.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pageview.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/permissions.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/thumbnails.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/toc.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/viewer.Po@am__quote@
+
+.cpp.o:
+@am__fastdepCXX_TRUE@  $(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
+@am__fastdepCXX_TRUE@  $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ $<
+
+.cpp.obj:
+@am__fastdepCXX_TRUE@  $(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'`
+@am__fastdepCXX_TRUE@  $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
+
+.cpp.lo:
+@am__fastdepCXX_TRUE@  $(AM_V_CXX)$(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
+@am__fastdepCXX_TRUE@  $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     $(AM_V_CXX)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LTCXXCOMPILE) -c -o $@ $<
+
+mostlyclean-libtool:
+       -rm -f *.lo
+
+clean-libtool:
+       -rm -rf .libs _libs
+
+ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
+       list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+       unique=`for i in $$list; do \
+           if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+         done | \
+         $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
+             END { if (nonempty) { for (i in files) print i; }; }'`; \
+       mkid -fID $$unique
+tags: TAGS
+
+TAGS:  $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
+               $(TAGS_FILES) $(LISP)
+       set x; \
+       here=`pwd`; \
+       list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
+       unique=`for i in $$list; do \
+           if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+         done | \
+         $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
+             END { if (nonempty) { for (i in files) print i; }; }'`; \
+       shift; \
+       if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
+         test -n "$$unique" || unique=$$empty_fix; \
+         if test $$# -gt 0; then \
+           $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+             "$$@" $$unique; \
+         else \
+           $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+             $$unique; \
+         fi; \
+       fi
+ctags: CTAGS
+CTAGS:  $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
+               $(TAGS_FILES) $(LISP)
+       list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
+       unique=`for i in $$list; do \
+           if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+         done | \
+         $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
+             END { if (nonempty) { for (i in files) print i; }; }'`; \
+       test -z "$(CTAGS_ARGS)$$unique" \
+         || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+            $$unique
+
+GTAGS:
+       here=`$(am__cd) $(top_builddir) && pwd` \
+         && $(am__cd) $(top_srcdir) \
+         && gtags -i $(GTAGS_ARGS) "$$here"
+
+distclean-tags:
+       -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+
+distdir: $(DISTFILES)
+       @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+       topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+       list='$(DISTFILES)'; \
+         dist_files=`for file in $$list; do echo $$file; done | \
+         sed -e "s|^$$srcdirstrip/||;t" \
+             -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+       case $$dist_files in \
+         */*) $(MKDIR_P) `echo "$$dist_files" | \
+                          sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+                          sort -u` ;; \
+       esac; \
+       for file in $$dist_files; do \
+         if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+         if test -d $$d/$$file; then \
+           dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+           if test -d "$(distdir)/$$file"; then \
+             find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+           fi; \
+           if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+             cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
+             find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+           fi; \
+           cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
+         else \
+           test -f "$(distdir)/$$file" \
+           || cp -p $$d/$$file "$(distdir)/$$file" \
+           || exit 1; \
+         fi; \
+       done
+check-am: all-am
+check: check-am
+all-am: Makefile $(PROGRAMS)
+installdirs:
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+       @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+       if test -z '$(STRIP)'; then \
+         $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+           install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+             install; \
+       else \
+         $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+           install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+           "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
+       fi
+mostlyclean-generic:
+
+distclean-generic:
+       -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+       -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
+
+maintainer-clean-generic:
+       @echo "This command is intended for maintainers to use"
+       @echo "it deletes files that may require special tools to rebuild."
+clean: clean-am
+
+clean-am: clean-generic clean-libtool clean-noinstPROGRAMS \
+       mostlyclean-am
+
+distclean: distclean-am
+       -rm -rf ./$(DEPDIR)
+       -rm -f Makefile
+distclean-am: clean-am distclean-compile distclean-generic \
+       distclean-tags
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+html-am:
+
+info: info-am
+
+info-am:
+
+install-data-am:
+
+install-dvi: install-dvi-am
+
+install-dvi-am:
+
+install-exec-am:
+
+install-html: install-html-am
+
+install-html-am:
+
+install-info: install-info-am
+
+install-info-am:
+
+install-man:
+
+install-pdf: install-pdf-am
+
+install-pdf-am:
+
+install-ps: install-ps-am
+
+install-ps-am:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+       -rm -rf ./$(DEPDIR)
+       -rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-compile mostlyclean-generic \
+       mostlyclean-libtool
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am:
+
+.MAKE: install-am install-strip
+
+.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \
+       clean-libtool clean-noinstPROGRAMS ctags distclean \
+       distclean-compile distclean-generic distclean-libtool \
+       distclean-tags distdir dvi dvi-am html html-am info info-am \
+       install install-am install-data install-data-am install-dvi \
+       install-dvi-am install-exec install-exec-am install-html \
+       install-html-am install-info install-info-am install-man \
+       install-pdf install-pdf-am install-ps install-ps-am \
+       install-strip installcheck installcheck-am installdirs \
+       maintainer-clean maintainer-clean-generic mostlyclean \
+       mostlyclean-compile mostlyclean-generic mostlyclean-libtool \
+       pdf pdf-am ps ps-am tags uninstall uninstall-am
+
+
+SUFFIXES: .moc
+
+# This rule lets GNU make create any *.moc from the equivalent *.h
+.h.moc:
+       $(AM_V_GEN) $(MOCQT4) -i $< -o $@
+
+abstractinfodock.$(OBJEXT): abstractinfodock.moc
+embeddedfiles.$(OBJEXT): embeddedfiles.moc
+fonts.$(OBJEXT): fonts.moc
+info.$(OBJEXT): info.moc
+metadata.$(OBJEXT): metadata.moc
+navigationtoolbar.$(OBJEXT): navigationtoolbar.moc
+optcontent.$(OBJEXT): optcontent.moc
+pageview.$(OBJEXT): pageview.moc
+permissions.$(OBJEXT): permissions.moc
+thumbnails.$(OBJEXT): thumbnails.moc
+toc.$(OBJEXT): toc.moc
+viewer.$(OBJEXT): viewer.moc
+
+clean-generic:
+       rm -f *.moc
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/qt4/demos/abstractinfodock.cpp b/qt4/demos/abstractinfodock.cpp
new file mode 100644 (file)
index 0000000..7b306d8
--- /dev/null
@@ -0,0 +1,57 @@
+/*
+ * Copyright (C) 2008, Pino Toscano <pino@kde.org>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include "fonts.h"
+
+AbstractInfoDock::AbstractInfoDock(QWidget *parent)
+    : QDockWidget(parent), m_filled(false)
+{
+    connect(this, SIGNAL(visibilityChanged(bool)), SLOT(slotVisibilityChanged(bool)));
+}
+
+AbstractInfoDock::~AbstractInfoDock()
+{
+}
+
+void AbstractInfoDock::documentLoaded()
+{
+    if (!isHidden()) {
+        fillInfo();
+        m_filled = true;
+    }
+}
+
+void AbstractInfoDock::documentClosed()
+{
+    m_filled = false;
+}
+
+void AbstractInfoDock::pageChanged(int page)
+{
+    Q_UNUSED(page)
+}
+
+void AbstractInfoDock::slotVisibilityChanged(bool visible)
+{
+    if (visible && document() && !m_filled) {
+        fillInfo();
+        m_filled = true;
+    }
+}
+
+#include "abstractinfodock.moc"
diff --git a/qt4/demos/abstractinfodock.h b/qt4/demos/abstractinfodock.h
new file mode 100644 (file)
index 0000000..2593325
--- /dev/null
@@ -0,0 +1,48 @@
+/*
+ * Copyright (C) 2008, Pino Toscano <pino@kde.org>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#ifndef ABSTRACTINFODOCK_H
+#define ABSTRACTINFODOCK_H
+
+#include <QtGui/QDockWidget>
+
+#include "documentobserver.h"
+
+class AbstractInfoDock : public QDockWidget, public DocumentObserver
+{
+    Q_OBJECT
+
+public:
+    AbstractInfoDock(QWidget *parent = 0);
+    ~AbstractInfoDock();
+
+    /*virtual*/ void documentLoaded();
+    /*virtual*/ void documentClosed();
+    /*virtual*/ void pageChanged(int page);
+
+protected:
+    virtual void fillInfo() = 0;
+
+private Q_SLOTS:
+    void slotVisibilityChanged(bool visible);
+
+private:
+    bool m_filled;
+};
+
+#endif
diff --git a/qt4/demos/documentobserver.cpp b/qt4/demos/documentobserver.cpp
new file mode 100644 (file)
index 0000000..e5c283d
--- /dev/null
@@ -0,0 +1,50 @@
+/*
+ * Copyright (C) 2008, Pino Toscano <pino@kde.org>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include "documentobserver.h"
+
+#include "viewer.h"
+
+DocumentObserver::DocumentObserver()
+    : m_viewer(0)
+{
+}
+
+DocumentObserver::~DocumentObserver()
+{
+}
+
+Poppler::Document* DocumentObserver::document() const
+{
+    return m_viewer->m_doc;
+}
+
+void DocumentObserver::setPage(int page)
+{
+    m_viewer->setPage(page);
+}
+
+int DocumentObserver::page() const
+{
+    return m_viewer->page();
+}
+
+void DocumentObserver::reloadPage()
+{
+    m_viewer->setPage(m_viewer->page());
+}
diff --git a/qt4/demos/documentobserver.h b/qt4/demos/documentobserver.h
new file mode 100644 (file)
index 0000000..38fe204
--- /dev/null
@@ -0,0 +1,50 @@
+/*
+ * Copyright (C) 2008, Pino Toscano <pino@kde.org>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#ifndef DOCUMENTOBSERVER_H
+#define DOCUMENTOBSERVER_H
+
+class PdfViewer;
+namespace Poppler {
+class Document;
+}
+
+class DocumentObserver
+{
+friend class PdfViewer;
+
+public:
+    virtual ~DocumentObserver();
+
+    virtual void documentLoaded() = 0;
+    virtual void documentClosed() = 0;
+    virtual void pageChanged(int page) = 0;
+
+protected:
+    DocumentObserver();
+
+    Poppler::Document* document() const;
+    void setPage(int page);
+    int page() const;
+    void reloadPage();
+
+private:
+    PdfViewer *m_viewer;
+};
+
+#endif
diff --git a/qt4/demos/embeddedfiles.cpp b/qt4/demos/embeddedfiles.cpp
new file mode 100644 (file)
index 0000000..22f9da7
--- /dev/null
@@ -0,0 +1,82 @@
+/*
+ * Copyright (C) 2008, Pino Toscano <pino@kde.org>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include "embeddedfiles.h"
+
+#include <poppler-qt4.h>
+
+#include <QtGui/QTableWidget>
+
+EmbeddedFilesDock::EmbeddedFilesDock(QWidget *parent)
+    : AbstractInfoDock(parent)
+{
+    m_table = new QTableWidget(this);
+    setWidget(m_table);
+    setWindowTitle(tr("Embedded files"));
+    m_table->setColumnCount(6);
+    m_table->setHorizontalHeaderLabels(
+        QStringList() << tr("Name") << tr("Description") << tr("Size") << tr("Creation date")
+                      << tr("Modification date") << tr("Checksum"));
+    m_table->setHorizontalScrollMode(QAbstractItemView::ScrollPerPixel);
+}
+
+EmbeddedFilesDock::~EmbeddedFilesDock()
+{
+}
+
+void EmbeddedFilesDock::fillInfo()
+{
+    m_table->setHorizontalHeaderLabels(
+        QStringList() << tr("Name") << tr("Description") << tr("Size") << tr("Creation date")
+                      << tr("Modification date") << tr("Checksum"));
+    if (!document()->hasEmbeddedFiles()) {
+        m_table->setItem(0, 0, new QTableWidgetItem(tr("No files")));
+        return;
+    }
+
+    const QList<Poppler::EmbeddedFile*> files = document()->embeddedFiles();
+    m_table->setRowCount(files.count());
+    int i = 0;
+    Q_FOREACH(Poppler::EmbeddedFile *file, files) {
+        m_table->setItem(i, 0, new QTableWidgetItem(file->name()));
+        m_table->setItem(i, 1, new QTableWidgetItem(file->description()));
+        m_table->setItem(i, 2, new QTableWidgetItem(QString::number(file->size())));
+        m_table->setItem(i, 3, new QTableWidgetItem(file->createDate().toString(Qt::SystemLocaleDate)));
+        m_table->setItem(i, 4, new QTableWidgetItem(file->modDate().toString(Qt::SystemLocaleDate)));
+        const QByteArray checksum = file->checksum();
+        const QString checksumString = !checksum.isEmpty() ? QString::fromAscii(checksum.toHex()) : QString::fromLatin1("n/a");
+        m_table->setItem(i, 5, new QTableWidgetItem(checksumString));
+        ++i;
+    }
+}
+
+void EmbeddedFilesDock::documentLoaded()
+{
+    if ( document()->pageMode() == Poppler::Document::UseAttach ) {
+        show();
+    }
+}
+
+void EmbeddedFilesDock::documentClosed()
+{
+    m_table->clear();
+    m_table->setRowCount(0);
+    AbstractInfoDock::documentClosed();
+}
+
+#include "embeddedfiles.moc"
diff --git a/qt4/demos/embeddedfiles.h b/qt4/demos/embeddedfiles.h
new file mode 100644 (file)
index 0000000..7cd6039
--- /dev/null
@@ -0,0 +1,44 @@
+/*
+ * Copyright (C) 2008, Pino Toscano <pino@kde.org>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#ifndef ATTACHMENTS_H
+#define ATTACHMENTS_H
+
+#include "abstractinfodock.h"
+
+class QTableWidget;
+
+class EmbeddedFilesDock : public AbstractInfoDock
+{
+    Q_OBJECT
+
+public:
+    EmbeddedFilesDock(QWidget *parent = 0);
+    ~EmbeddedFilesDock();
+
+    virtual void documentLoaded();
+    /*virtual*/ void documentClosed();
+
+protected:
+    /*virtual*/ void fillInfo();
+
+private:
+    QTableWidget *m_table;
+};
+
+#endif
diff --git a/qt4/demos/fonts.cpp b/qt4/demos/fonts.cpp
new file mode 100644 (file)
index 0000000..bd342bd
--- /dev/null
@@ -0,0 +1,72 @@
+/*
+ * Copyright (C) 2008, Pino Toscano <pino@kde.org>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include "fonts.h"
+
+#include <poppler-qt4.h>
+
+#include <QtGui/QTableWidget>
+
+static QString yesNoStatement(bool value)
+{
+    return value ? QString::fromLatin1("yes") : QString::fromLatin1("no");
+}
+
+FontsDock::FontsDock(QWidget *parent)
+    : AbstractInfoDock(parent)
+{
+    m_table = new QTableWidget(this);
+    setWidget(m_table);
+    setWindowTitle(tr("Fonts"));
+    m_table->setColumnCount(5);
+    m_table->setHorizontalHeaderLabels(QStringList() << tr("Name") << tr("Type") << tr("Embedded") << tr("Subset") << tr("File"));
+    m_table->setHorizontalScrollMode(QAbstractItemView::ScrollPerPixel);
+}
+
+FontsDock::~FontsDock()
+{
+}
+
+void FontsDock::fillInfo()
+{
+    const QList<Poppler::FontInfo> fonts = document()->fonts();
+    m_table->setHorizontalHeaderLabels(QStringList() << tr("Name") << tr("Type") << tr("Embedded") << tr("Subset") << tr("File"));
+    m_table->setRowCount(fonts.count());
+    int i = 0;
+    Q_FOREACH(const Poppler::FontInfo &font, fonts) {
+        if (font.name().isNull()) {
+            m_table->setItem(i, 0, new QTableWidgetItem(QString::fromLatin1("[none]")));
+        } else {
+            m_table->setItem(i, 0, new QTableWidgetItem(font.name()));
+        }
+        m_table->setItem(i, 1, new QTableWidgetItem(font.typeName()));
+        m_table->setItem(i, 2, new QTableWidgetItem(yesNoStatement(font.isEmbedded())));
+        m_table->setItem(i, 3, new QTableWidgetItem(yesNoStatement(font.isSubset())));
+        m_table->setItem(i, 4, new QTableWidgetItem(font.file()));
+        ++i;
+    }
+}
+
+void FontsDock::documentClosed()
+{
+    m_table->clear();
+    m_table->setRowCount(0);
+    AbstractInfoDock::documentClosed();
+}
+
+#include "fonts.moc"
diff --git a/qt4/demos/fonts.h b/qt4/demos/fonts.h
new file mode 100644 (file)
index 0000000..81afa57
--- /dev/null
@@ -0,0 +1,43 @@
+/*
+ * Copyright (C) 2008, Pino Toscano <pino@kde.org>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#ifndef FONTS_H
+#define FONTS_H
+
+#include "abstractinfodock.h"
+
+class QTableWidget;
+
+class FontsDock : public AbstractInfoDock
+{
+    Q_OBJECT
+
+public:
+    FontsDock(QWidget *parent = 0);
+    ~FontsDock();
+
+    /*virtual*/ void documentClosed();
+
+protected:
+    /*virtual*/ void fillInfo();
+
+private:
+    QTableWidget *m_table;
+};
+
+#endif
diff --git a/qt4/demos/info.cpp b/qt4/demos/info.cpp
new file mode 100644 (file)
index 0000000..6491e0e
--- /dev/null
@@ -0,0 +1,72 @@
+/*
+ * Copyright (C) 2008, Pino Toscano <pino@kde.org>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include "info.h"
+
+#include <poppler-qt4.h>
+
+#include <QtGui/QTableWidget>
+
+InfoDock::InfoDock(QWidget *parent)
+    : AbstractInfoDock(parent)
+{
+    m_table = new QTableWidget(this);
+    setWidget(m_table);
+    setWindowTitle(tr("Information"));
+    m_table->setColumnCount(2);
+    m_table->setHorizontalHeaderLabels(QStringList() << tr("Key") << tr("Value"));
+    m_table->setHorizontalScrollMode(QAbstractItemView::ScrollPerPixel);
+}
+
+InfoDock::~InfoDock()
+{
+}
+
+void InfoDock::fillInfo()
+{
+    QStringList keys = document()->infoKeys();
+    m_table->setHorizontalHeaderLabels(QStringList() << tr("Key") << tr("Value"));
+    m_table->setRowCount(keys.count());
+    QStringList dateKeys;
+    dateKeys << QString::fromLatin1("CreationDate");
+    dateKeys << QString::fromLatin1("ModDate");
+    int i = 0;
+    Q_FOREACH(const QString &date, dateKeys) {
+        const int id = keys.indexOf(date);
+        if (id != -1) {
+            m_table->setItem(i, 0, new QTableWidgetItem(date));
+            m_table->setItem(i, 1, new QTableWidgetItem(document()->date(date).toString(Qt::SystemLocaleDate)));
+            ++i;
+            keys.removeAt(id);
+        }
+    }
+    Q_FOREACH(const QString &key, keys) {
+        m_table->setItem(i, 0, new QTableWidgetItem(key));
+        m_table->setItem(i, 1, new QTableWidgetItem(document()->info(key)));
+        ++i;
+    }
+}
+
+void InfoDock::documentClosed()
+{
+    m_table->clear();
+    m_table->setRowCount(0);
+    AbstractInfoDock::documentClosed();
+}
+
+#include "info.moc"
diff --git a/qt4/demos/info.h b/qt4/demos/info.h
new file mode 100644 (file)
index 0000000..d294b43
--- /dev/null
@@ -0,0 +1,43 @@
+/*
+ * Copyright (C) 2008, Pino Toscano <pino@kde.org>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#ifndef INFO_H
+#define INFO_H
+
+#include "abstractinfodock.h"
+
+class QTableWidget;
+
+class InfoDock : public AbstractInfoDock
+{
+    Q_OBJECT
+
+public:
+    InfoDock(QWidget *parent = 0);
+    ~InfoDock();
+
+    /*virtual*/ void documentClosed();
+
+protected:
+    /*virtual*/ void fillInfo();
+
+private:
+    QTableWidget *m_table;
+};
+
+#endif
diff --git a/qt4/demos/main_viewer.cpp b/qt4/demos/main_viewer.cpp
new file mode 100644 (file)
index 0000000..3f7080f
--- /dev/null
@@ -0,0 +1,33 @@
+/*
+ * Copyright (C) 2008, Pino Toscano <pino@kde.org>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include "viewer.h"
+
+#include <QtGui/QApplication>
+
+int main(int argc, char *argv[])
+{
+    QApplication app(argc, argv);
+    const QStringList args = QCoreApplication::arguments();
+    PdfViewer *viewer = new PdfViewer();
+    viewer->show();
+    if (args.count() > 1) {
+        viewer->loadDocument(args.at(1));
+    }
+    return app.exec();
+}
diff --git a/qt4/demos/metadata.cpp b/qt4/demos/metadata.cpp
new file mode 100644 (file)
index 0000000..e5c7111
--- /dev/null
@@ -0,0 +1,50 @@
+/*
+ * Copyright (C) 2008, Pino Toscano <pino@kde.org>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include "metadata.h"
+
+#include <poppler-qt4.h>
+
+#include <QtGui/QTextEdit>
+
+MetadataDock::MetadataDock(QWidget *parent)
+    : AbstractInfoDock(parent)
+{
+    m_edit = new QTextEdit(this);
+    setWidget(m_edit);
+    setWindowTitle(tr("Metadata"));
+    m_edit->setAcceptRichText(false);
+    m_edit->setReadOnly(true);
+}
+
+MetadataDock::~MetadataDock()
+{
+}
+
+void MetadataDock::fillInfo()
+{
+    m_edit->setPlainText(document()->metadata());
+}
+
+void MetadataDock::documentClosed()
+{
+    m_edit->clear();
+    AbstractInfoDock::documentClosed();
+}
+
+#include "metadata.moc"
diff --git a/qt4/demos/metadata.h b/qt4/demos/metadata.h
new file mode 100644 (file)
index 0000000..6f1507a
--- /dev/null
@@ -0,0 +1,43 @@
+/*
+ * Copyright (C) 2008, Pino Toscano <pino@kde.org>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#ifndef METADATA_H
+#define METADATA_H
+
+#include "abstractinfodock.h"
+
+class QTextEdit;
+
+class MetadataDock : public AbstractInfoDock
+{
+    Q_OBJECT
+
+public:
+    MetadataDock(QWidget *parent = 0);
+    ~MetadataDock();
+
+    /*virtual*/ void documentClosed();
+
+protected:
+    /*virtual*/ void fillInfo();
+
+private:
+    QTextEdit *m_edit;
+};
+
+#endif
diff --git a/qt4/demos/navigationtoolbar.cpp b/qt4/demos/navigationtoolbar.cpp
new file mode 100644 (file)
index 0000000..e9ebafa
--- /dev/null
@@ -0,0 +1,129 @@
+/*
+ * Copyright (C) 2008-2009, Pino Toscano <pino@kde.org>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include "navigationtoolbar.h"
+
+#include <poppler-qt4.h>
+
+#include <QtGui/QAction>
+#include <QtGui/QComboBox>
+
+NavigationToolBar::NavigationToolBar(QWidget *parent)
+    : QToolBar(parent)
+{
+    m_firstAct = addAction(tr("First"), this, SLOT(slotGoFirst()));
+    m_prevAct = addAction(tr("Previous"), this, SLOT(slotGoPrev()));
+    m_pageCombo = new QComboBox(this);
+    connect(m_pageCombo, SIGNAL(activated(int)), this, SLOT(slotComboActivated(int)));
+    addWidget(m_pageCombo);
+    m_nextAct = addAction(tr("Next"), this, SLOT(slotGoNext()));
+    m_lastAct = addAction(tr("Last"), this, SLOT(slotGoLast()));
+
+    addSeparator();
+
+    m_zoomCombo = new QComboBox(this);
+    m_zoomCombo->setEditable(true);
+    m_zoomCombo->addItem(tr("10%"));
+    m_zoomCombo->addItem(tr("25%"));
+    m_zoomCombo->addItem(tr("33%"));
+    m_zoomCombo->addItem(tr("50%"));
+    m_zoomCombo->addItem(tr("66%"));
+    m_zoomCombo->addItem(tr("75%"));
+    m_zoomCombo->addItem(tr("100%"));
+    m_zoomCombo->addItem(tr("125%"));
+    m_zoomCombo->addItem(tr("150%"));
+    m_zoomCombo->addItem(tr("200%"));
+    m_zoomCombo->addItem(tr("300%"));
+    m_zoomCombo->addItem(tr("400%"));
+    m_zoomCombo->setCurrentIndex(6); // "100%"
+    connect(m_zoomCombo, SIGNAL(currentIndexChanged(QString)), this, SLOT(slotZoomComboChanged(QString)));
+    addWidget(m_zoomCombo);
+
+    documentClosed();
+}
+
+NavigationToolBar::~NavigationToolBar()
+{
+}
+
+void NavigationToolBar::documentLoaded()
+{
+    const int pageCount = document()->numPages();
+    for (int i = 0; i < pageCount; ++i) {
+        m_pageCombo->addItem(QString::number(i + 1));
+    }
+    m_pageCombo->setEnabled(true);
+}
+
+void NavigationToolBar::documentClosed()
+{
+    m_firstAct->setEnabled(false);
+    m_prevAct->setEnabled(false);
+    m_nextAct->setEnabled(false);
+    m_lastAct->setEnabled(false);
+    m_pageCombo->clear();
+    m_pageCombo->setEnabled(false);
+}
+
+void NavigationToolBar::pageChanged(int page)
+{
+    const int pageCount = document()->numPages();
+    m_firstAct->setEnabled(page > 0);
+    m_prevAct->setEnabled(page > 0);
+    m_nextAct->setEnabled(page < (pageCount - 1));
+    m_lastAct->setEnabled(page < (pageCount - 1));
+    m_pageCombo->setCurrentIndex(page);
+}
+
+void NavigationToolBar::slotGoFirst()
+{
+    setPage(0);
+}
+
+void NavigationToolBar::slotGoPrev()
+{
+    setPage(page() - 1);
+}
+
+void NavigationToolBar::slotGoNext()
+{
+    setPage(page() + 1);
+}
+
+void NavigationToolBar::slotGoLast()
+{
+    setPage(document()->numPages() - 1);
+}
+
+void NavigationToolBar::slotComboActivated(int index)
+{
+    setPage(index);
+}
+
+void NavigationToolBar::slotZoomComboChanged(const QString &_text)
+{
+    QString text = _text;
+    text.remove(QLatin1Char('%'));
+    bool ok = false;
+    int value = text.toInt(&ok);
+    if (ok && value >= 10) {
+        emit zoomChanged(qreal(value) / 100);
+    }
+}
+
+#include "navigationtoolbar.moc"
diff --git a/qt4/demos/navigationtoolbar.h b/qt4/demos/navigationtoolbar.h
new file mode 100644 (file)
index 0000000..3469f01
--- /dev/null
@@ -0,0 +1,61 @@
+/*
+ * Copyright (C) 2008-2009, Pino Toscano <pino@kde.org>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#ifndef NAVIGATIONTOOLBAR_H
+#define NAVIGATIONTOOLBAR_H
+
+#include <QtGui/QToolBar>
+
+#include "documentobserver.h"
+
+class QAction;
+class QComboBox;
+
+class NavigationToolBar : public QToolBar, public DocumentObserver
+{
+    Q_OBJECT
+
+public:
+    NavigationToolBar(QWidget *parent = 0);
+    ~NavigationToolBar();
+
+    /*virtual*/ void documentLoaded();
+    /*virtual*/ void documentClosed();
+    /*virtual*/ void pageChanged(int page);
+
+Q_SIGNALS:
+    void zoomChanged(qreal value);
+
+private Q_SLOTS:
+    void slotGoFirst();
+    void slotGoPrev();
+    void slotGoNext();
+    void slotGoLast();
+    void slotComboActivated(int index);
+    void slotZoomComboChanged(const QString &text);
+
+private:
+    QAction *m_firstAct;
+    QAction *m_prevAct;
+    QComboBox *m_pageCombo;
+    QAction *m_nextAct;
+    QAction *m_lastAct;
+    QComboBox *m_zoomCombo;
+};
+
+#endif
diff --git a/qt4/demos/optcontent.cpp b/qt4/demos/optcontent.cpp
new file mode 100644 (file)
index 0000000..0c1015b
--- /dev/null
@@ -0,0 +1,69 @@
+/*
+ * Copyright (C) 2008, Pino Toscano <pino@kde.org>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include "optcontent.h"
+
+#include <poppler-qt4.h>
+
+#include <QtGui/QTreeView>
+
+OptContentDock::OptContentDock(QWidget *parent)
+    : AbstractInfoDock(parent)
+{
+    m_view = new QTreeView(this);
+    setWidget(m_view);
+    setWindowTitle(tr("Optional content"));
+    m_view->setHorizontalScrollMode(QAbstractItemView::ScrollPerPixel);
+}
+
+OptContentDock::~OptContentDock()
+{
+}
+
+
+void OptContentDock::documentLoaded()
+{
+    AbstractInfoDock::documentLoaded();
+    if ( document()->pageMode() == Poppler::Document::UseOC ) {
+        show();
+    }  
+}
+
+void OptContentDock::fillInfo()
+{
+    if (!document()->hasOptionalContent()) {
+        return;
+    }
+
+    m_view->setModel(document()->optionalContentModel());
+    connect(m_view->model(), SIGNAL(dataChanged(QModelIndex, QModelIndex)), this, SLOT(reloadImage()));
+    m_view->expandToDepth(1);
+}
+
+void OptContentDock::documentClosed()
+{
+    m_view->setModel(0);
+    AbstractInfoDock::documentClosed();
+}
+
+void OptContentDock::reloadImage()
+{
+    reloadPage();
+}
+
+#include "optcontent.moc"
diff --git a/qt4/demos/optcontent.h b/qt4/demos/optcontent.h
new file mode 100644 (file)
index 0000000..b933f5c
--- /dev/null
@@ -0,0 +1,47 @@
+/*
+ * Copyright (C) 2008, Pino Toscano <pino@kde.org>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#ifndef OPTCONTENT_H
+#define OPTCONTENT_H
+
+#include "abstractinfodock.h"
+
+class QTreeView;
+
+class OptContentDock : public AbstractInfoDock
+{
+    Q_OBJECT
+
+public:
+    OptContentDock(QWidget *parent = 0);
+    ~OptContentDock();
+
+    /*virtual*/ void documentLoaded();
+    /*virtual*/ void documentClosed();
+
+protected:
+    /*virtual*/ void fillInfo();
+
+private Q_SLOTS:
+    void reloadImage();
+
+private:
+    QTreeView *m_view;
+};
+
+#endif
diff --git a/qt4/demos/pageview.cpp b/qt4/demos/pageview.cpp
new file mode 100644 (file)
index 0000000..734dacb
--- /dev/null
@@ -0,0 +1,79 @@
+/*
+ * Copyright (C) 2008-2009, Pino Toscano <pino@kde.org>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include "pageview.h"
+
+#include <poppler-qt4.h>
+
+#include <QtGui/QApplication>
+#include <QtGui/QDesktopWidget>
+#include <QtGui/QImage>
+#include <QtGui/QLabel>
+#include <QtGui/QPixmap>
+
+PageView::PageView(QWidget *parent)
+    : QScrollArea(parent)
+    , m_zoom(1.0)
+    , m_dpiX(QApplication::desktop()->physicalDpiX())
+    , m_dpiY(QApplication::desktop()->physicalDpiY())
+{
+    m_imageLabel = new QLabel(this);
+    m_imageLabel->resize(0, 0);
+    setWidget(m_imageLabel);
+}
+
+PageView::~PageView()
+{
+}
+
+void PageView::documentLoaded()
+{
+}
+
+void PageView::documentClosed()
+{
+    m_imageLabel->clear();
+    m_imageLabel->resize(0, 0);
+}
+
+void PageView::pageChanged(int page)
+{
+    Poppler::Page *popplerPage = document()->page(page);
+    const double resX = m_dpiX * m_zoom;
+    const double resY = m_dpiY * m_zoom;
+    QImage image = popplerPage->renderToImage(resX, resY);
+    if (!image.isNull()) {
+        m_imageLabel->resize(image.size());
+        m_imageLabel->setPixmap(QPixmap::fromImage(image));
+    } else {
+        m_imageLabel->resize(0, 0);
+        m_imageLabel->setPixmap(QPixmap());
+    }
+    delete popplerPage;
+}
+
+void PageView::slotZoomChanged(qreal value)
+{
+    m_zoom = value;
+    if (!document()) {
+        return;
+    }
+    reloadPage();
+}
+
+#include "pageview.moc"
diff --git a/qt4/demos/pageview.h b/qt4/demos/pageview.h
new file mode 100644 (file)
index 0000000..2f7ad61
--- /dev/null
@@ -0,0 +1,50 @@
+/*
+ * Copyright (C) 2008-2009, Pino Toscano <pino@kde.org>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#ifndef PAGEVIEW_H
+#define PAGEVIEW_H
+
+#include <QtGui/QScrollArea>
+
+#include "documentobserver.h"
+
+class QLabel;
+
+class PageView : public QScrollArea, public DocumentObserver
+{
+    Q_OBJECT
+
+public:
+    PageView(QWidget *parent = 0);
+    ~PageView();
+
+    /*virtual*/ void documentLoaded();
+    /*virtual*/ void documentClosed();
+    /*virtual*/ void pageChanged(int page);
+
+private Q_SLOTS:
+    void slotZoomChanged(qreal value);
+
+private:
+    QLabel *m_imageLabel;
+    qreal m_zoom;
+    int m_dpiX;
+    int m_dpiY;
+};
+
+#endif
diff --git a/qt4/demos/permissions.cpp b/qt4/demos/permissions.cpp
new file mode 100644 (file)
index 0000000..38205b2
--- /dev/null
@@ -0,0 +1,66 @@
+/*
+ * Copyright (C) 2008-2009, Pino Toscano <pino@kde.org>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include "permissions.h"
+
+#include <poppler-qt4.h>
+
+#include <QtGui/QListWidget>
+
+PermissionsDock::PermissionsDock(QWidget *parent)
+    : AbstractInfoDock(parent)
+{
+    m_table = new QListWidget(this);
+    setWidget(m_table);
+    setWindowTitle(tr("Permissions"));
+    m_table->setHorizontalScrollMode(QAbstractItemView::ScrollPerPixel);
+}
+
+PermissionsDock::~PermissionsDock()
+{
+}
+
+void PermissionsDock::fillInfo()
+{
+#define ADD_ROW(title, function) \
+do { \
+    QListWidgetItem *item = new QListWidgetItem(); \
+    item->setFlags(item->flags() & ~Qt::ItemIsEnabled); \
+    item->setText(title); \
+    item->setCheckState(document()->function() ? Qt::Checked : Qt::Unchecked); \
+    m_table->addItem(item); \
+} while (0)
+    ADD_ROW("Print", okToPrint);
+    ADD_ROW("PrintHiRes", okToPrintHighRes);
+    ADD_ROW("Change", okToChange);
+    ADD_ROW("Copy", okToCopy);
+    ADD_ROW("Add Notes", okToAddNotes);
+    ADD_ROW("Fill Forms", okToFillForm);
+    ADD_ROW("Create Forms", okToCreateFormFields);
+    ADD_ROW("Extract for accessibility", okToExtractForAccessibility);
+    ADD_ROW("Assemble", okToAssemble);
+#undef ADD_ROW
+}
+
+void PermissionsDock::documentClosed()
+{
+    m_table->clear();
+    AbstractInfoDock::documentClosed();
+}
+
+#include "permissions.moc"
diff --git a/qt4/demos/permissions.h b/qt4/demos/permissions.h
new file mode 100644 (file)
index 0000000..13bcbbf
--- /dev/null
@@ -0,0 +1,43 @@
+/*
+ * Copyright (C) 2008-2009, Pino Toscano <pino@kde.org>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#ifndef PERMISSIONS_H
+#define PERMISSIONS_H
+
+#include "abstractinfodock.h"
+
+class QListWidget;
+
+class PermissionsDock : public AbstractInfoDock
+{
+    Q_OBJECT
+
+public:
+    PermissionsDock(QWidget *parent = 0);
+    ~PermissionsDock();
+
+    /*virtual*/ void documentClosed();
+
+protected:
+    /*virtual*/ void fillInfo();
+
+private:
+    QListWidget *m_table;
+};
+
+#endif
diff --git a/qt4/demos/thumbnails.cpp b/qt4/demos/thumbnails.cpp
new file mode 100644 (file)
index 0000000..07b19ca
--- /dev/null
@@ -0,0 +1,84 @@
+/*
+ * Copyright (C) 2009, Shawn Rutledge <shawn.t.rutledge@gmail.com>
+ * Copyright (C) 2009, Pino Toscano <pino@kde.org>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include "thumbnails.h"
+
+#include <poppler-qt4.h>
+
+#include <QtGui/QListWidget>
+
+static const int PageRole = Qt::UserRole + 1;
+
+ThumbnailsDock::ThumbnailsDock(QWidget *parent)
+    : AbstractInfoDock(parent)
+{
+    m_list = new QListWidget(this);
+    setWidget(m_list);
+    setWindowTitle(tr("Thumbnails"));
+    m_list->setViewMode(QListView::ListMode);
+    m_list->setMovement(QListView::Static);
+    m_list->setVerticalScrollMode(QListView::ScrollPerPixel);
+    connect(m_list, SIGNAL(itemActivated(QListWidgetItem*)),
+            this, SLOT(slotItemActivated(QListWidgetItem*)));
+}
+
+ThumbnailsDock::~ThumbnailsDock()
+{
+}
+
+void ThumbnailsDock::fillInfo()
+{
+    const int num = document()->numPages();
+    QSize maxSize;
+    for (int i = 0; i < num; ++i) {
+        const Poppler::Page *page = document()->page(i);
+        const QImage image = page->thumbnail();
+        if (!image.isNull()) {
+            QListWidgetItem *item = new QListWidgetItem();
+            item->setText(QString::number(i + 1));
+            item->setData(Qt::DecorationRole, QPixmap::fromImage(image));
+            item->setData(PageRole, i);
+            m_list->addItem(item);
+            maxSize.setWidth(qMax(maxSize.width(), image.width()));
+            maxSize.setHeight(qMax(maxSize.height(), image.height()));
+        }
+        delete page;
+    }
+    if (num > 0) {
+        m_list->setGridSize(maxSize);
+        m_list->setIconSize(maxSize);
+    }
+}
+
+void ThumbnailsDock::documentClosed()
+{
+    m_list->clear();
+    AbstractInfoDock::documentClosed();
+}
+
+void ThumbnailsDock::slotItemActivated(QListWidgetItem *item)
+{
+    if (!item) {
+        return;
+    }
+
+    setPage(item->data(PageRole).toInt());
+}
+
+#include "thumbnails.moc"
diff --git a/qt4/demos/thumbnails.h b/qt4/demos/thumbnails.h
new file mode 100644 (file)
index 0000000..076d5ae
--- /dev/null
@@ -0,0 +1,48 @@
+/*
+ * Copyright (C) 2009, Shawn Rutledge <shawn.t.rutledge@gmail.com>
+ * Copyright (C) 2009, Pino Toscano <pino@kde.org>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#ifndef THUMBNAILS_H
+#define THUMBNAILS_H
+
+#include "abstractinfodock.h"
+
+class QListWidget;
+class QListWidgetItem;
+
+class ThumbnailsDock : public AbstractInfoDock
+{
+    Q_OBJECT
+
+public:
+    ThumbnailsDock(QWidget *parent = 0);
+    ~ThumbnailsDock();
+
+    /*virtual*/ void documentClosed();
+
+protected:
+    /*virtual*/ void fillInfo();
+
+private Q_SLOTS:
+    void slotItemActivated(QListWidgetItem *item);
+
+private:
+    QListWidget *m_list;
+};
+
+#endif
diff --git a/qt4/demos/toc.cpp b/qt4/demos/toc.cpp
new file mode 100644 (file)
index 0000000..bf3e5cb
--- /dev/null
@@ -0,0 +1,88 @@
+/*
+ * Copyright (C) 2008, Pino Toscano <pino@kde.org>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include "toc.h"
+
+#include <poppler-qt4.h>
+
+#include <QtGui/QHeaderView>
+#include <QtGui/QTreeWidget>
+
+static void fillToc(const QDomNode &parent, QTreeWidget *tree, QTreeWidgetItem *parentItem)
+{
+    QTreeWidgetItem *newitem = 0;
+    for (QDomNode node = parent.firstChild(); !node.isNull(); node = node.nextSibling()) {
+        QDomElement e = node.toElement();
+
+        if (!parentItem) {
+            newitem = new QTreeWidgetItem(tree, newitem);
+        } else {
+            newitem = new QTreeWidgetItem(parentItem, newitem);
+        }
+        newitem->setText(0, e.tagName());
+
+        bool isOpen = false;
+        if (e.hasAttribute(QString::fromLatin1("Open"))) {
+            isOpen = QVariant(e.attribute(QString::fromLatin1("Open"))).toBool();
+        }
+        if (isOpen) {
+            tree->expandItem(newitem);
+        }
+
+        if (e.hasChildNodes()) {
+            fillToc(node, tree, newitem);
+        }
+    }
+}
+
+
+TocDock::TocDock(QWidget *parent)
+    : AbstractInfoDock(parent)
+{
+    m_tree = new QTreeWidget(this);
+    setWidget(m_tree);
+    m_tree->setAlternatingRowColors(true);
+    m_tree->header()->hide();
+    setWindowTitle(tr("TOC"));
+    m_tree->setHorizontalScrollMode(QAbstractItemView::ScrollPerPixel);
+}
+
+TocDock::~TocDock()
+{
+}
+
+void TocDock::fillInfo()
+{
+    const QDomDocument *toc = document()->toc();
+    if (toc) {
+        fillToc(*toc, m_tree, 0);
+    } else {
+        QTreeWidgetItem *item = new QTreeWidgetItem();
+        item->setText(0, tr("No TOC"));
+        item->setFlags(item->flags() & ~Qt::ItemIsEnabled);
+        m_tree->addTopLevelItem(item);
+    }
+}
+
+void TocDock::documentClosed()
+{
+    m_tree->clear();
+    AbstractInfoDock::documentClosed();
+}
+
+#include "toc.moc"
diff --git a/qt4/demos/toc.h b/qt4/demos/toc.h
new file mode 100644 (file)
index 0000000..bbc9082
--- /dev/null
@@ -0,0 +1,43 @@
+/*
+ * Copyright (C) 2008, Pino Toscano <pino@kde.org>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#ifndef TOC_H
+#define TOC_H
+
+#include "abstractinfodock.h"
+
+class QTreeWidget;
+
+class TocDock : public AbstractInfoDock
+{
+    Q_OBJECT
+
+public:
+    TocDock(QWidget *parent = 0);
+    ~TocDock();
+
+    /*virtual*/ void documentClosed();
+
+protected:
+    /*virtual*/ void fillInfo();
+
+private:
+    QTreeWidget *m_tree;
+};
+
+#endif
diff --git a/qt4/demos/viewer.cpp b/qt4/demos/viewer.cpp
new file mode 100644 (file)
index 0000000..0201eea
--- /dev/null
@@ -0,0 +1,317 @@
+/*
+ * Copyright (C) 2008-2009, Pino Toscano <pino@kde.org>
+ * Copyright (C) 2008, Albert Astals Cid <aacid@kde.org>
+ * Copyright (C) 2009, Shawn Rutledge <shawn.t.rutledge@gmail.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include "viewer.h"
+
+#include "embeddedfiles.h"
+#include "fonts.h"
+#include "info.h"
+#include "metadata.h"
+#include "navigationtoolbar.h"
+#include "optcontent.h"
+#include "pageview.h"
+#include "permissions.h"
+#include "thumbnails.h"
+#include "toc.h"
+
+#include <poppler-qt4.h>
+
+#include <QtCore/QDir>
+#include <QtGui/QAction>
+#include <QtGui/QApplication>
+#include <QtGui/QFileDialog>
+#include <QtGui/QInputDialog>
+#include <QtGui/QMenu>
+#include <QtGui/QMenuBar>
+#include <QtGui/QMessageBox>
+
+PdfViewer::PdfViewer()
+    : QMainWindow(), m_currentPage(0), m_doc(0)
+{
+    setWindowTitle(tr("Poppler-Qt4 Demo"));
+
+    // setup the menus
+    QMenu *fileMenu = menuBar()->addMenu(tr("&File"));
+    m_fileOpenAct = fileMenu->addAction(tr("&Open"), this, SLOT(slotOpenFile()));
+    m_fileOpenAct->setShortcut(Qt::CTRL + Qt::Key_O);
+    fileMenu->addSeparator();
+    m_fileSaveCopyAct = fileMenu->addAction(tr("&Save a Copy..."), this, SLOT(slotSaveCopy()));
+    m_fileSaveCopyAct->setShortcut(Qt::CTRL + Qt::SHIFT + Qt::Key_S);
+    m_fileSaveCopyAct->setEnabled(false);
+    fileMenu->addSeparator();
+    QAction *act = fileMenu->addAction(tr("&Quit"), qApp, SLOT(closeAllWindows()));
+    act->setShortcut(Qt::CTRL + Qt::Key_Q);
+
+    QMenu *viewMenu = menuBar()->addMenu(tr("&View"));
+
+    QMenu *settingsMenu = menuBar()->addMenu(tr("&Settings"));
+    m_settingsTextAAAct = settingsMenu->addAction(tr("Text Antialias"));
+    m_settingsTextAAAct->setCheckable(true);
+    connect(m_settingsTextAAAct, SIGNAL(toggled(bool)), this, SLOT(slotToggleTextAA(bool)));
+    m_settingsGfxAAAct = settingsMenu->addAction(tr("Graphics Antialias"));
+    m_settingsGfxAAAct->setCheckable(true);
+    connect(m_settingsGfxAAAct, SIGNAL(toggled(bool)), this, SLOT(slotToggleGfxAA(bool)));
+    QMenu *settingsRenderMenu = settingsMenu->addMenu(tr("Render Backend"));
+    m_settingsRenderBackendGrp = new QActionGroup(settingsRenderMenu);
+    m_settingsRenderBackendGrp->setExclusive(true);
+    act = settingsRenderMenu->addAction(tr("Splash"));
+    act->setCheckable(true);
+    act->setChecked(true);
+    act->setData(qVariantFromValue(0));
+    m_settingsRenderBackendGrp->addAction(act);
+    act = settingsRenderMenu->addAction(tr("Arthur"));
+    act->setCheckable(true);
+    act->setData(qVariantFromValue(1));
+    m_settingsRenderBackendGrp->addAction(act);
+    connect(m_settingsRenderBackendGrp, SIGNAL(triggered(QAction*)),
+            this, SLOT(slotRenderBackend(QAction*)));
+
+    QMenu *helpMenu = menuBar()->addMenu(tr("&Help"));
+    act = helpMenu->addAction(tr("&About"), this, SLOT(slotAbout()));
+    act = helpMenu->addAction(tr("About &Qt"), this, SLOT(slotAboutQt()));
+
+    NavigationToolBar *navbar = new NavigationToolBar(this);
+    addToolBar(navbar);
+    m_observers.append(navbar);
+
+    PageView *view = new PageView(this);
+    setCentralWidget(view);
+    m_observers.append(view);
+
+    InfoDock *infoDock = new InfoDock(this);
+    addDockWidget(Qt::LeftDockWidgetArea, infoDock);
+    infoDock->hide();
+    viewMenu->addAction(infoDock->toggleViewAction());
+    m_observers.append(infoDock);
+
+    TocDock *tocDock = new TocDock(this);
+    addDockWidget(Qt::LeftDockWidgetArea, tocDock);
+    tocDock->hide();
+    viewMenu->addAction(tocDock->toggleViewAction());
+    m_observers.append(tocDock);
+
+    FontsDock *fontsDock = new FontsDock(this);
+    addDockWidget(Qt::LeftDockWidgetArea, fontsDock);
+    fontsDock->hide();
+    viewMenu->addAction(fontsDock->toggleViewAction());
+    m_observers.append(fontsDock);
+
+    PermissionsDock *permissionsDock = new PermissionsDock(this);
+    addDockWidget(Qt::LeftDockWidgetArea, permissionsDock);
+    permissionsDock->hide();
+    viewMenu->addAction(permissionsDock->toggleViewAction());
+    m_observers.append(permissionsDock);
+
+    ThumbnailsDock *thumbnailsDock = new ThumbnailsDock(this);
+    addDockWidget(Qt::LeftDockWidgetArea, thumbnailsDock);
+    thumbnailsDock->hide();
+    viewMenu->addAction(thumbnailsDock->toggleViewAction());
+    m_observers.append(thumbnailsDock);
+
+    EmbeddedFilesDock *embfilesDock = new EmbeddedFilesDock(this);
+    addDockWidget(Qt::BottomDockWidgetArea, embfilesDock);
+    embfilesDock->hide();
+    viewMenu->addAction(embfilesDock->toggleViewAction());
+    m_observers.append(embfilesDock);
+
+    MetadataDock *metadataDock = new MetadataDock(this);
+    addDockWidget(Qt::BottomDockWidgetArea, metadataDock);
+    metadataDock->hide();
+    viewMenu->addAction(metadataDock->toggleViewAction());
+    m_observers.append(metadataDock);
+
+    OptContentDock *optContentDock = new OptContentDock(this);
+    addDockWidget(Qt::LeftDockWidgetArea, optContentDock);
+    optContentDock->hide();
+    viewMenu->addAction(optContentDock->toggleViewAction());
+    m_observers.append(optContentDock);
+
+    Q_FOREACH(DocumentObserver *obs, m_observers) {
+        obs->m_viewer = this;
+    }
+
+    connect(navbar, SIGNAL(zoomChanged(qreal)), view, SLOT(slotZoomChanged(qreal)));
+
+    // activate AA by default
+    m_settingsTextAAAct->setChecked(true);
+    m_settingsGfxAAAct->setChecked(true);
+}
+
+PdfViewer::~PdfViewer()
+{
+    closeDocument();
+}
+
+QSize PdfViewer::sizeHint() const
+{
+    return QSize(500, 600);
+}
+
+void PdfViewer::loadDocument(const QString &file)
+{
+    Poppler::Document *newdoc = Poppler::Document::load(file);
+    if (!newdoc) {
+        QMessageBox msgbox(QMessageBox::Critical, tr("Open Error"), tr("Cannot open:\n") + file,
+                           QMessageBox::Ok, this);
+        msgbox.exec();
+        return;
+    }
+
+    while (newdoc->isLocked()) {
+        bool ok = true;
+        QString password = QInputDialog::getText(this, tr("Document Password"),
+                                                 tr("Please insert the password of the document:"),
+                                                 QLineEdit::Password, QString(), &ok);
+        if (!ok) {
+            delete newdoc;
+            return;
+        }
+        newdoc->unlock(password.toLatin1(), password.toLatin1());
+    }
+
+    closeDocument();
+
+    m_doc = newdoc;
+
+    m_doc->setRenderHint(Poppler::Document::TextAntialiasing, m_settingsTextAAAct->isChecked());
+    m_doc->setRenderHint(Poppler::Document::Antialiasing, m_settingsGfxAAAct->isChecked());
+    m_doc->setRenderBackend((Poppler::Document::RenderBackend)m_settingsRenderBackendGrp->checkedAction()->data().toInt());
+
+    Q_FOREACH(DocumentObserver *obs, m_observers) {
+        obs->documentLoaded();
+        obs->pageChanged(0);
+    }
+
+    m_fileSaveCopyAct->setEnabled(true);
+}
+
+void PdfViewer::closeDocument()
+{
+    if (!m_doc) {
+        return;
+    }
+
+    Q_FOREACH(DocumentObserver *obs, m_observers) {
+        obs->documentClosed();
+    }
+
+    m_currentPage = 0;
+    delete m_doc;
+    m_doc = 0;
+
+    m_fileSaveCopyAct->setEnabled(false);
+}
+
+void PdfViewer::slotOpenFile()
+{
+    QString fileName = QFileDialog::getOpenFileName(this, tr("Open PDF Document"), QDir::homePath(), tr("PDF Documents (*.pdf)"));
+    if (fileName.isEmpty()) {
+        return;
+    }
+
+    loadDocument(fileName);
+}
+
+void PdfViewer::slotSaveCopy()
+{
+    if (!m_doc) {
+        return;
+    }
+
+    QString fileName = QFileDialog::getSaveFileName(this, tr("Save Copy"), QDir::homePath(), tr("PDF Documents (*.pdf)"));
+    if (fileName.isEmpty()) {
+        return;
+    }
+
+    Poppler::PDFConverter *converter = m_doc->pdfConverter();
+    converter->setOutputFileName(fileName);
+    converter->setPDFOptions(converter->pdfOptions() & ~Poppler::PDFConverter::WithChanges);
+    if (!converter->convert()) {
+        QMessageBox msgbox(QMessageBox::Critical, tr("Save Error"), tr("Cannot export to:\n%1").arg(fileName),
+                           QMessageBox::Ok, this);
+    }
+    delete converter;
+}
+
+void PdfViewer::slotAbout()
+{
+    const QString text("This is a demo of the Poppler-Qt4 library.");
+    QMessageBox::about(this, QString::fromLatin1("About Poppler-Qt4 Demo"), text);
+}
+
+void PdfViewer::slotAboutQt()
+{
+    QMessageBox::aboutQt(this);
+}
+
+void PdfViewer::slotToggleTextAA(bool value)
+{
+    if (!m_doc) {
+        return;
+    }
+
+    m_doc->setRenderHint(Poppler::Document::TextAntialiasing, value);
+
+    Q_FOREACH(DocumentObserver *obs, m_observers) {
+        obs->pageChanged(m_currentPage);
+    }
+}
+
+void PdfViewer::slotToggleGfxAA(bool value)
+{
+    if (!m_doc) {
+        return;
+    }
+
+    m_doc->setRenderHint(Poppler::Document::Antialiasing, value);
+
+    Q_FOREACH(DocumentObserver *obs, m_observers) {
+        obs->pageChanged(m_currentPage);
+    }
+}
+
+void PdfViewer::slotRenderBackend(QAction *act)
+{
+    if (!m_doc || !act) {
+        return;
+    }
+
+    m_doc->setRenderBackend((Poppler::Document::RenderBackend)act->data().toInt());
+
+    Q_FOREACH(DocumentObserver *obs, m_observers) {
+        obs->pageChanged(m_currentPage);
+    }
+}
+
+void PdfViewer::setPage(int page)
+{
+    Q_FOREACH(DocumentObserver *obs, m_observers) {
+        obs->pageChanged(page);
+    }
+
+    m_currentPage = page;
+}
+
+int PdfViewer::page() const
+{
+    return m_currentPage;
+}
+
+#include "viewer.moc"
diff --git a/qt4/demos/viewer.h b/qt4/demos/viewer.h
new file mode 100644 (file)
index 0000000..5e0eaaf
--- /dev/null
@@ -0,0 +1,73 @@
+/*
+ * Copyright (C) 2008, Pino Toscano <pino@kde.org>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#ifndef PDFVIEWER_H
+#define PDFVIEWER_H
+
+#include <QtGui/QMainWindow>
+
+class QAction;
+class QActionGroup;
+class QLabel;
+class DocumentObserver;
+namespace Poppler {
+class Document;
+}
+
+class PdfViewer : public QMainWindow
+{
+    Q_OBJECT
+
+    friend class DocumentObserver;
+
+public:
+    PdfViewer();
+    ~PdfViewer();
+
+    /*virtual*/ QSize sizeHint() const;
+
+    void loadDocument(const QString &file);
+    void closeDocument();
+
+private Q_SLOTS:
+    void slotOpenFile();
+    void slotSaveCopy();
+    void slotAbout();
+    void slotAboutQt();
+    void slotToggleTextAA(bool value);
+    void slotToggleGfxAA(bool value);
+    void slotRenderBackend(QAction *act);
+
+private:
+    void setPage(int page);
+    int page() const;
+
+    int m_currentPage;
+
+    QAction *m_fileOpenAct;
+    QAction *m_fileSaveCopyAct;
+    QAction *m_settingsTextAAAct;
+    QAction *m_settingsGfxAAAct;
+    QActionGroup *m_settingsRenderBackendGrp;
+
+    QList<DocumentObserver *> m_observers;
+
+    Poppler::Document *m_doc;
+};
+
+#endif
diff --git a/qt4/src/CMakeLists.txt b/qt4/src/CMakeLists.txt
new file mode 100644 (file)
index 0000000..8b6edaa
--- /dev/null
@@ -0,0 +1,50 @@
+add_definitions(${QT4_DEFINITIONS})
+
+include_directories(
+  ${CMAKE_CURRENT_SOURCE_DIR}
+  ${QT4_INCLUDE_DIR}
+  ${CMAKE_CURRENT_BINARY_DIR}
+)
+
+set(poppler_qt4_SRCS
+  poppler-annotation.cc
+  poppler-document.cc
+  poppler-embeddedfile.cc
+  poppler-fontinfo.cc
+  poppler-form.cc
+  poppler-link.cc
+  poppler-link-extractor.cc
+  poppler-movie.cc
+  poppler-optcontent.cc
+  poppler-page.cc
+  poppler-base-converter.cc
+  poppler-pdf-converter.cc
+  poppler-private.cc
+  poppler-ps-converter.cc
+  poppler-qiodeviceoutstream.cc
+  poppler-sound.cc
+  poppler-textbox.cc
+  poppler-page-transition.cc
+  poppler-media.cc
+  ${CMAKE_SOURCE_DIR}/poppler/ArthurOutputDev.cc
+)
+qt4_automoc(${poppler_qt4_SRCS})
+add_library(poppler-qt4 SHARED ${poppler_qt4_SRCS})
+set_target_properties(poppler-qt4 PROPERTIES VERSION 4.0.0 SOVERSION 4)
+target_link_libraries(poppler-qt4 poppler ${QT4_QTCORE_LIBRARY} ${QT4_QTGUI_LIBRARY} ${QT4_QTXML_LIBRARY})
+if(MSVC)
+target_link_libraries(poppler-qt4 poppler ${poppler_LIBS})
+endif(MSVC)
+install(TARGETS poppler-qt4 RUNTIME DESTINATION bin LIBRARY DESTINATION lib${LIB_SUFFIX} ARCHIVE DESTINATION lib${LIB_SUFFIX})
+
+install(FILES
+  poppler-qt4.h
+  poppler-link.h
+  poppler-annotation.h
+  poppler-form.h
+  poppler-optcontent.h
+  poppler-export.h
+  poppler-page-transition.h
+  poppler-media.h
+  DESTINATION include/poppler/qt4)
+
diff --git a/qt4/src/Makefile.am b/qt4/src/Makefile.am
new file mode 100644 (file)
index 0000000..02e0720
--- /dev/null
@@ -0,0 +1,74 @@
+INCLUDES =                                     \
+       -I$(top_srcdir)                         \
+       -I$(top_srcdir)/poppler                 \
+       $(FONTCONFIG_CFLAGS)                    \
+       $(POPPLER_QT4_CFLAGS)
+
+SUFFIXES: .moc
+
+poppler_includedir = $(includedir)/poppler/qt4
+
+poppler_include_HEADERS =                      \
+       poppler-qt4.h                           \
+       poppler-link.h                          \
+       poppler-annotation.h                    \
+       poppler-form.h                          \
+       poppler-optcontent.h                    \
+       poppler-export.h                        \
+       poppler-media.h                         \
+       poppler-page-transition.h
+
+lib_LTLIBRARIES = libpoppler-qt4.la
+
+libpoppler_qt4_la_SOURCES =                    \
+       poppler-document.cc                     \
+       poppler-page.cc                         \
+       poppler-fontinfo.cc                     \
+       poppler-embeddedfile.cc                 \
+       poppler-textbox.cc                      \
+       poppler-link.cc                         \
+       poppler-annotation.cc                   \
+       poppler-link-extractor.cc               \
+       poppler-optcontent.cc                   \
+       poppler-optcontent.h                    \
+       poppler-page-transition.cc              \
+       poppler-sound.cc                        \
+       poppler-form.cc                         \
+       poppler-base-converter.cc               \
+       poppler-ps-converter.cc                 \
+       poppler-pdf-converter.cc                \
+       poppler-qiodeviceoutstream.cc           \
+       poppler-private.cc                      \
+       poppler-movie.cc                        \
+       poppler-media.cc                        \
+       poppler-annotation-helper.h             \
+       poppler-page-private.h                  \
+       poppler-link-extractor-private.h        \
+       poppler-annotation-private.h            \
+       poppler-converter-private.h             \
+       poppler-qiodeviceoutstream-private.h    \
+       poppler-optcontent-private.h            \
+       poppler-export.h                        \
+       poppler-private.h                       \
+       poppler-page-transition-private.h       \
+       poppler-embeddedfile-private.h
+
+libpoppler_qt4_la_CXXFLAGS =                   \
+       -Dpoppler_qt4_EXPORTS
+
+libpoppler_qt4_la_LIBADD =                     \
+       $(top_builddir)/poppler/libpoppler.la   \
+       $(top_builddir)/poppler/libpoppler-arthur.la    \
+       $(FONTCONFIG_LIBS)                              \
+       $(POPPLER_QT4_LIBS)
+
+libpoppler_qt4_la_LDFLAGS = -version-info 4:0:0 @create_shared_lib@ @auto_import_flags@
+
+# This rule lets GNU make create any *.moc from the equivalent *.h
+.h.moc:
+       $(AM_V_GEN) $(MOCQT4) -i $< -o $@
+
+BUILT_SOURCES = poppler-optcontent.moc
+
+clean-generic:
+       rm -f *.moc
diff --git a/qt4/src/Makefile.in b/qt4/src/Makefile.in
new file mode 100644 (file)
index 0000000..6308498
--- /dev/null
@@ -0,0 +1,948 @@
+# Makefile.in generated by automake 1.11.5 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software
+# Foundation, Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+@SET_MAKE@
+
+
+VPATH = @srcdir@
+am__make_dryrun = \
+  { \
+    am__dry=no; \
+    case $$MAKEFLAGS in \
+      *\\[\ \  ]*) \
+        echo 'am--echo: ; @echo "AM"  OK' | $(MAKE) -f - 2>/dev/null \
+          | grep '^AM OK$$' >/dev/null || am__dry=yes;; \
+      *) \
+        for am__flg in $$MAKEFLAGS; do \
+          case $$am__flg in \
+            *=*|--*) ;; \
+            *n*) am__dry=yes; break;; \
+          esac; \
+        done;; \
+    esac; \
+    test $$am__dry = yes; \
+  }
+pkgdatadir = $(datadir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkglibexecdir = $(libexecdir)/@PACKAGE@
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+subdir = qt4/src
+DIST_COMMON = $(poppler_include_HEADERS) $(srcdir)/Makefile.am \
+       $(srcdir)/Makefile.in
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/m4/acx_pthread.m4 \
+       $(top_srcdir)/m4/define-dir.m4 $(top_srcdir)/m4/gtk-doc.m4 \
+       $(top_srcdir)/m4/iconv.m4 $(top_srcdir)/m4/introspection.m4 \
+       $(top_srcdir)/m4/libjpeg.m4 $(top_srcdir)/m4/libtool.m4 \
+       $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \
+       $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \
+       $(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+       $(ACLOCAL_M4)
+mkinstalldirs = $(install_sh) -d
+CONFIG_HEADER = $(top_builddir)/config.h \
+       $(top_builddir)/poppler/poppler-config.h
+CONFIG_CLEAN_FILES =
+CONFIG_CLEAN_VPATH_FILES =
+am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
+am__vpath_adj = case $$p in \
+    $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
+    *) f=$$p;; \
+  esac;
+am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`;
+am__install_max = 40
+am__nobase_strip_setup = \
+  srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'`
+am__nobase_strip = \
+  for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||"
+am__nobase_list = $(am__nobase_strip_setup); \
+  for p in $$list; do echo "$$p $$p"; done | \
+  sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \
+  $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \
+    if (++n[$$2] == $(am__install_max)) \
+      { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \
+    END { for (dir in files) print dir, files[dir] }'
+am__base_list = \
+  sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
+  sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
+am__uninstall_files_from_dir = { \
+  test -z "$$files" \
+    || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \
+    || { echo " ( cd '$$dir' && rm -f" $$files ")"; \
+         $(am__cd) "$$dir" && rm -f $$files; }; \
+  }
+am__installdirs = "$(DESTDIR)$(libdir)" \
+       "$(DESTDIR)$(poppler_includedir)"
+LTLIBRARIES = $(lib_LTLIBRARIES)
+am__DEPENDENCIES_1 =
+libpoppler_qt4_la_DEPENDENCIES =  \
+       $(top_builddir)/poppler/libpoppler.la \
+       $(top_builddir)/poppler/libpoppler-arthur.la \
+       $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1)
+am_libpoppler_qt4_la_OBJECTS = libpoppler_qt4_la-poppler-document.lo \
+       libpoppler_qt4_la-poppler-page.lo \
+       libpoppler_qt4_la-poppler-fontinfo.lo \
+       libpoppler_qt4_la-poppler-embeddedfile.lo \
+       libpoppler_qt4_la-poppler-textbox.lo \
+       libpoppler_qt4_la-poppler-link.lo \
+       libpoppler_qt4_la-poppler-annotation.lo \
+       libpoppler_qt4_la-poppler-link-extractor.lo \
+       libpoppler_qt4_la-poppler-optcontent.lo \
+       libpoppler_qt4_la-poppler-page-transition.lo \
+       libpoppler_qt4_la-poppler-sound.lo \
+       libpoppler_qt4_la-poppler-form.lo \
+       libpoppler_qt4_la-poppler-base-converter.lo \
+       libpoppler_qt4_la-poppler-ps-converter.lo \
+       libpoppler_qt4_la-poppler-pdf-converter.lo \
+       libpoppler_qt4_la-poppler-qiodeviceoutstream.lo \
+       libpoppler_qt4_la-poppler-private.lo \
+       libpoppler_qt4_la-poppler-movie.lo \
+       libpoppler_qt4_la-poppler-media.lo
+libpoppler_qt4_la_OBJECTS = $(am_libpoppler_qt4_la_OBJECTS)
+AM_V_lt = $(am__v_lt_@AM_V@)
+am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@)
+am__v_lt_0 = --silent
+libpoppler_qt4_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX \
+       $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CXXLD) \
+       $(libpoppler_qt4_la_CXXFLAGS) $(CXXFLAGS) \
+       $(libpoppler_qt4_la_LDFLAGS) $(LDFLAGS) -o $@
+DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) -I$(top_builddir)/poppler
+depcomp = $(SHELL) $(top_srcdir)/depcomp
+am__depfiles_maybe = depfiles
+am__mv = mv -f
+CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
+       $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)
+LTCXXCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \
+       $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) \
+       $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
+       $(AM_CXXFLAGS) $(CXXFLAGS)
+AM_V_CXX = $(am__v_CXX_@AM_V@)
+am__v_CXX_ = $(am__v_CXX_@AM_DEFAULT_V@)
+am__v_CXX_0 = @echo "  CXX   " $@;
+AM_V_at = $(am__v_at_@AM_V@)
+am__v_at_ = $(am__v_at_@AM_DEFAULT_V@)
+am__v_at_0 = @
+CXXLD = $(CXX)
+CXXLINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \
+       $(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \
+       $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
+AM_V_CXXLD = $(am__v_CXXLD_@AM_V@)
+am__v_CXXLD_ = $(am__v_CXXLD_@AM_DEFAULT_V@)
+am__v_CXXLD_0 = @echo "  CXXLD " $@;
+COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
+       $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
+LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
+       $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \
+       $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
+       $(AM_CFLAGS) $(CFLAGS)
+AM_V_CC = $(am__v_CC_@AM_V@)
+am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@)
+am__v_CC_0 = @echo "  CC    " $@;
+CCLD = $(CC)
+LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
+       $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
+       $(AM_LDFLAGS) $(LDFLAGS) -o $@
+AM_V_CCLD = $(am__v_CCLD_@AM_V@)
+am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@)
+am__v_CCLD_0 = @echo "  CCLD  " $@;
+AM_V_GEN = $(am__v_GEN_@AM_V@)
+am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@)
+am__v_GEN_0 = @echo "  GEN   " $@;
+SOURCES = $(libpoppler_qt4_la_SOURCES)
+DIST_SOURCES = $(libpoppler_qt4_la_SOURCES)
+am__can_run_installinfo = \
+  case $$AM_UPDATE_INFO_DIR in \
+    n|no|NO) false;; \
+    *) (install-info --version) >/dev/null 2>&1;; \
+  esac
+HEADERS = $(poppler_include_HEADERS)
+ETAGS = etags
+CTAGS = ctags
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AR = @AR@
+AS = @AS@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CAIRO_CFLAGS = @CAIRO_CFLAGS@
+CAIRO_FEATURE = @CAIRO_FEATURE@
+CAIRO_LIBS = @CAIRO_LIBS@
+CAIRO_REQ = @CAIRO_REQ@
+CAIRO_VERSION = @CAIRO_VERSION@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CXX = @CXX@
+CXXCPP = @CXXCPP@
+CXXDEPMODE = @CXXDEPMODE@
+CXXFLAGS = @CXXFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DLLTOOL = @DLLTOOL@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+FGREP = @FGREP@
+FONTCONFIG_CFLAGS = @FONTCONFIG_CFLAGS@
+FONTCONFIG_LIBS = @FONTCONFIG_LIBS@
+FREETYPE_CFLAGS = @FREETYPE_CFLAGS@
+FREETYPE_CONFIG = @FREETYPE_CONFIG@
+FREETYPE_LIBS = @FREETYPE_LIBS@
+GLIB_MKENUMS = @GLIB_MKENUMS@
+GLIB_REQ = @GLIB_REQ@
+GLIB_REQUIRED = @GLIB_REQUIRED@
+GREP = @GREP@
+GTKDOC_CHECK = @GTKDOC_CHECK@
+GTKDOC_DEPS_CFLAGS = @GTKDOC_DEPS_CFLAGS@
+GTKDOC_DEPS_LIBS = @GTKDOC_DEPS_LIBS@
+GTKDOC_MKPDF = @GTKDOC_MKPDF@
+GTKDOC_REBASE = @GTKDOC_REBASE@
+GTK_TEST_CFLAGS = @GTK_TEST_CFLAGS@
+GTK_TEST_LIBS = @GTK_TEST_LIBS@
+HTML_DIR = @HTML_DIR@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+INTROSPECTION_CFLAGS = @INTROSPECTION_CFLAGS@
+INTROSPECTION_COMPILER = @INTROSPECTION_COMPILER@
+INTROSPECTION_GENERATE = @INTROSPECTION_GENERATE@
+INTROSPECTION_GIRDIR = @INTROSPECTION_GIRDIR@
+INTROSPECTION_LIBS = @INTROSPECTION_LIBS@
+INTROSPECTION_MAKEFILE = @INTROSPECTION_MAKEFILE@
+INTROSPECTION_SCANNER = @INTROSPECTION_SCANNER@
+INTROSPECTION_TYPELIBDIR = @INTROSPECTION_TYPELIBDIR@
+LCMS_CFLAGS = @LCMS_CFLAGS@
+LCMS_LIBS = @LCMS_LIBS@
+LD = @LD@
+LDFLAGS = @LDFLAGS@
+LIBCURL_CFLAGS = @LIBCURL_CFLAGS@
+LIBCURL_LIBS = @LIBCURL_LIBS@
+LIBICONV = @LIBICONV@
+LIBJPEG_CFLAGS = @LIBJPEG_CFLAGS@
+LIBJPEG_LIBS = @LIBJPEG_LIBS@
+LIBOBJS = @LIBOBJS@
+LIBOPENJPEG_CFLAGS = @LIBOPENJPEG_CFLAGS@
+LIBOPENJPEG_LIBS = @LIBOPENJPEG_LIBS@
+LIBPNG_CFLAGS = @LIBPNG_CFLAGS@
+LIBPNG_LIBS = @LIBPNG_LIBS@
+LIBS = @LIBS@
+LIBTIFF_CFLAGS = @LIBTIFF_CFLAGS@
+LIBTIFF_CFLAGSS = @LIBTIFF_CFLAGSS@
+LIBTIFF_LIBS = @LIBTIFF_LIBS@
+LIBTOOL = @LIBTOOL@
+LIPO = @LIPO@
+LN_S = @LN_S@
+LTLIBICONV = @LTLIBICONV@
+LTLIBOBJS = @LTLIBOBJS@
+MAKEINFO = @MAKEINFO@
+MANIFEST_TOOL = @MANIFEST_TOOL@
+MKDIR_P = @MKDIR_P@
+MOCQT4 = @MOCQT4@
+NM = @NM@
+NMEDIT = @NMEDIT@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+OTOOL = @OTOOL@
+OTOOL64 = @OTOOL64@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_URL = @PACKAGE_URL@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PC_REQUIRES = @PC_REQUIRES@
+PC_REQUIRES_PRIVATE = @PC_REQUIRES_PRIVATE@
+PDFTOCAIRO_CFLAGS = @PDFTOCAIRO_CFLAGS@
+PDFTOCAIRO_LIBS = @PDFTOCAIRO_LIBS@
+PKG_CONFIG = @PKG_CONFIG@
+PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@
+PKG_CONFIG_PATH = @PKG_CONFIG_PATH@
+POPPLER_DATADIR = @POPPLER_DATADIR@
+POPPLER_GLIB_CFLAGS = @POPPLER_GLIB_CFLAGS@
+POPPLER_GLIB_DISABLE_DEPRECATED = @POPPLER_GLIB_DISABLE_DEPRECATED@
+POPPLER_GLIB_DISABLE_SINGLE_INCLUDES = @POPPLER_GLIB_DISABLE_SINGLE_INCLUDES@
+POPPLER_GLIB_LIBS = @POPPLER_GLIB_LIBS@
+POPPLER_MAJOR_VERSION = @POPPLER_MAJOR_VERSION@
+POPPLER_MICRO_VERSION = @POPPLER_MICRO_VERSION@
+POPPLER_MINOR_VERSION = @POPPLER_MINOR_VERSION@
+POPPLER_QT4_CFLAGS = @POPPLER_QT4_CFLAGS@
+POPPLER_QT4_CXXFLAGS = @POPPLER_QT4_CXXFLAGS@
+POPPLER_QT4_LIBS = @POPPLER_QT4_LIBS@
+POPPLER_QT4_TEST_CFLAGS = @POPPLER_QT4_TEST_CFLAGS@
+POPPLER_QT4_TEST_LIBS = @POPPLER_QT4_TEST_LIBS@
+POPPLER_VERSION = @POPPLER_VERSION@
+PTHREAD_CC = @PTHREAD_CC@
+PTHREAD_CFLAGS = @PTHREAD_CFLAGS@
+PTHREAD_LIBS = @PTHREAD_LIBS@
+RANLIB = @RANLIB@
+SED = @SED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+TESTDATADIR = @TESTDATADIR@
+VERSION = @VERSION@
+XMKMF = @XMKMF@
+X_CFLAGS = @X_CFLAGS@
+X_EXTRA_LIBS = @X_EXTRA_LIBS@
+X_LIBS = @X_LIBS@
+X_PRE_LIBS = @X_PRE_LIBS@
+ZLIB_LIBS = @ZLIB_LIBS@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
+ac_ct_AR = @ac_ct_AR@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_CXX = @ac_ct_CXX@
+ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
+acx_pthread_config = @acx_pthread_config@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+auto_import_flags = @auto_import_flags@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+builddir = @builddir@
+create_shared_lib = @create_shared_lib@
+datadir = @datadir@
+datarootdir = @datarootdir@
+docdir = @docdir@
+dvidir = @dvidir@
+exec_prefix = @exec_prefix@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+htmldir = @htmldir@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localedir = @localedir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+srcdir = @srcdir@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+top_build_prefix = @top_build_prefix@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+win32_libs = @win32_libs@
+INCLUDES = \
+       -I$(top_srcdir)                         \
+       -I$(top_srcdir)/poppler                 \
+       $(FONTCONFIG_CFLAGS)                    \
+       $(POPPLER_QT4_CFLAGS)
+
+poppler_includedir = $(includedir)/poppler/qt4
+poppler_include_HEADERS = \
+       poppler-qt4.h                           \
+       poppler-link.h                          \
+       poppler-annotation.h                    \
+       poppler-form.h                          \
+       poppler-optcontent.h                    \
+       poppler-export.h                        \
+       poppler-media.h                         \
+       poppler-page-transition.h
+
+lib_LTLIBRARIES = libpoppler-qt4.la
+libpoppler_qt4_la_SOURCES = \
+       poppler-document.cc                     \
+       poppler-page.cc                         \
+       poppler-fontinfo.cc                     \
+       poppler-embeddedfile.cc                 \
+       poppler-textbox.cc                      \
+       poppler-link.cc                         \
+       poppler-annotation.cc                   \
+       poppler-link-extractor.cc               \
+       poppler-optcontent.cc                   \
+       poppler-optcontent.h                    \
+       poppler-page-transition.cc              \
+       poppler-sound.cc                        \
+       poppler-form.cc                         \
+       poppler-base-converter.cc               \
+       poppler-ps-converter.cc                 \
+       poppler-pdf-converter.cc                \
+       poppler-qiodeviceoutstream.cc           \
+       poppler-private.cc                      \
+       poppler-movie.cc                        \
+       poppler-media.cc                        \
+       poppler-annotation-helper.h             \
+       poppler-page-private.h                  \
+       poppler-link-extractor-private.h        \
+       poppler-annotation-private.h            \
+       poppler-converter-private.h             \
+       poppler-qiodeviceoutstream-private.h    \
+       poppler-optcontent-private.h            \
+       poppler-export.h                        \
+       poppler-private.h                       \
+       poppler-page-transition-private.h       \
+       poppler-embeddedfile-private.h
+
+libpoppler_qt4_la_CXXFLAGS = \
+       -Dpoppler_qt4_EXPORTS
+
+libpoppler_qt4_la_LIBADD = \
+       $(top_builddir)/poppler/libpoppler.la   \
+       $(top_builddir)/poppler/libpoppler-arthur.la    \
+       $(FONTCONFIG_LIBS)                              \
+       $(POPPLER_QT4_LIBS)
+
+libpoppler_qt4_la_LDFLAGS = -version-info 4:0:0 @create_shared_lib@ @auto_import_flags@
+BUILT_SOURCES = poppler-optcontent.moc
+all: $(BUILT_SOURCES)
+       $(MAKE) $(AM_MAKEFLAGS) all-am
+
+.SUFFIXES:
+.SUFFIXES: .cc .h .lo .moc .o .obj
+$(srcdir)/Makefile.in:  $(srcdir)/Makefile.am  $(am__configure_deps)
+       @for dep in $?; do \
+         case '$(am__configure_deps)' in \
+           *$$dep*) \
+             ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
+               && { if test -f $@; then exit 0; else break; fi; }; \
+             exit 1;; \
+         esac; \
+       done; \
+       echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign qt4/src/Makefile'; \
+       $(am__cd) $(top_srcdir) && \
+         $(AUTOMAKE) --foreign qt4/src/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+       @case '$?' in \
+         *config.status*) \
+           cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+         *) \
+           echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+           cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+       esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+       cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure:  $(am__configure_deps)
+       cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4):  $(am__aclocal_m4_deps)
+       cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(am__aclocal_m4_deps):
+install-libLTLIBRARIES: $(lib_LTLIBRARIES)
+       @$(NORMAL_INSTALL)
+       @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \
+       list2=; for p in $$list; do \
+         if test -f $$p; then \
+           list2="$$list2 $$p"; \
+         else :; fi; \
+       done; \
+       test -z "$$list2" || { \
+         echo " $(MKDIR_P) '$(DESTDIR)$(libdir)'"; \
+         $(MKDIR_P) "$(DESTDIR)$(libdir)" || exit 1; \
+         echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(libdir)'"; \
+         $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(libdir)"; \
+       }
+
+uninstall-libLTLIBRARIES:
+       @$(NORMAL_UNINSTALL)
+       @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \
+       for p in $$list; do \
+         $(am__strip_dir) \
+         echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(libdir)/$$f'"; \
+         $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(libdir)/$$f"; \
+       done
+
+clean-libLTLIBRARIES:
+       -test -z "$(lib_LTLIBRARIES)" || rm -f $(lib_LTLIBRARIES)
+       @list='$(lib_LTLIBRARIES)'; for p in $$list; do \
+         dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \
+         test "$$dir" != "$$p" || dir=.; \
+         echo "rm -f \"$${dir}/so_locations\""; \
+         rm -f "$${dir}/so_locations"; \
+       done
+libpoppler-qt4.la: $(libpoppler_qt4_la_OBJECTS) $(libpoppler_qt4_la_DEPENDENCIES) $(EXTRA_libpoppler_qt4_la_DEPENDENCIES) 
+       $(AM_V_CXXLD)$(libpoppler_qt4_la_LINK) -rpath $(libdir) $(libpoppler_qt4_la_OBJECTS) $(libpoppler_qt4_la_LIBADD) $(LIBS)
+
+mostlyclean-compile:
+       -rm -f *.$(OBJEXT)
+
+distclean-compile:
+       -rm -f *.tab.c
+
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libpoppler_qt4_la-poppler-annotation.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libpoppler_qt4_la-poppler-base-converter.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libpoppler_qt4_la-poppler-document.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libpoppler_qt4_la-poppler-embeddedfile.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libpoppler_qt4_la-poppler-fontinfo.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libpoppler_qt4_la-poppler-form.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libpoppler_qt4_la-poppler-link-extractor.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libpoppler_qt4_la-poppler-link.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libpoppler_qt4_la-poppler-media.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libpoppler_qt4_la-poppler-movie.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libpoppler_qt4_la-poppler-optcontent.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libpoppler_qt4_la-poppler-page-transition.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libpoppler_qt4_la-poppler-page.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libpoppler_qt4_la-poppler-pdf-converter.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libpoppler_qt4_la-poppler-private.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libpoppler_qt4_la-poppler-ps-converter.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libpoppler_qt4_la-poppler-qiodeviceoutstream.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libpoppler_qt4_la-poppler-sound.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libpoppler_qt4_la-poppler-textbox.Plo@am__quote@
+
+.cc.o:
+@am__fastdepCXX_TRUE@  $(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
+@am__fastdepCXX_TRUE@  $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ $<
+
+.cc.obj:
+@am__fastdepCXX_TRUE@  $(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'`
+@am__fastdepCXX_TRUE@  $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
+
+.cc.lo:
+@am__fastdepCXX_TRUE@  $(AM_V_CXX)$(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
+@am__fastdepCXX_TRUE@  $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     $(AM_V_CXX)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LTCXXCOMPILE) -c -o $@ $<
+
+libpoppler_qt4_la-poppler-document.lo: poppler-document.cc
+@am__fastdepCXX_TRUE@  $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpoppler_qt4_la_CXXFLAGS) $(CXXFLAGS) -MT libpoppler_qt4_la-poppler-document.lo -MD -MP -MF $(DEPDIR)/libpoppler_qt4_la-poppler-document.Tpo -c -o libpoppler_qt4_la-poppler-document.lo `test -f 'poppler-document.cc' || echo '$(srcdir)/'`poppler-document.cc
+@am__fastdepCXX_TRUE@  $(AM_V_at)$(am__mv) $(DEPDIR)/libpoppler_qt4_la-poppler-document.Tpo $(DEPDIR)/libpoppler_qt4_la-poppler-document.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     $(AM_V_CXX)source='poppler-document.cc' object='libpoppler_qt4_la-poppler-document.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpoppler_qt4_la_CXXFLAGS) $(CXXFLAGS) -c -o libpoppler_qt4_la-poppler-document.lo `test -f 'poppler-document.cc' || echo '$(srcdir)/'`poppler-document.cc
+
+libpoppler_qt4_la-poppler-page.lo: poppler-page.cc
+@am__fastdepCXX_TRUE@  $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpoppler_qt4_la_CXXFLAGS) $(CXXFLAGS) -MT libpoppler_qt4_la-poppler-page.lo -MD -MP -MF $(DEPDIR)/libpoppler_qt4_la-poppler-page.Tpo -c -o libpoppler_qt4_la-poppler-page.lo `test -f 'poppler-page.cc' || echo '$(srcdir)/'`poppler-page.cc
+@am__fastdepCXX_TRUE@  $(AM_V_at)$(am__mv) $(DEPDIR)/libpoppler_qt4_la-poppler-page.Tpo $(DEPDIR)/libpoppler_qt4_la-poppler-page.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     $(AM_V_CXX)source='poppler-page.cc' object='libpoppler_qt4_la-poppler-page.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpoppler_qt4_la_CXXFLAGS) $(CXXFLAGS) -c -o libpoppler_qt4_la-poppler-page.lo `test -f 'poppler-page.cc' || echo '$(srcdir)/'`poppler-page.cc
+
+libpoppler_qt4_la-poppler-fontinfo.lo: poppler-fontinfo.cc
+@am__fastdepCXX_TRUE@  $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpoppler_qt4_la_CXXFLAGS) $(CXXFLAGS) -MT libpoppler_qt4_la-poppler-fontinfo.lo -MD -MP -MF $(DEPDIR)/libpoppler_qt4_la-poppler-fontinfo.Tpo -c -o libpoppler_qt4_la-poppler-fontinfo.lo `test -f 'poppler-fontinfo.cc' || echo '$(srcdir)/'`poppler-fontinfo.cc
+@am__fastdepCXX_TRUE@  $(AM_V_at)$(am__mv) $(DEPDIR)/libpoppler_qt4_la-poppler-fontinfo.Tpo $(DEPDIR)/libpoppler_qt4_la-poppler-fontinfo.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     $(AM_V_CXX)source='poppler-fontinfo.cc' object='libpoppler_qt4_la-poppler-fontinfo.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpoppler_qt4_la_CXXFLAGS) $(CXXFLAGS) -c -o libpoppler_qt4_la-poppler-fontinfo.lo `test -f 'poppler-fontinfo.cc' || echo '$(srcdir)/'`poppler-fontinfo.cc
+
+libpoppler_qt4_la-poppler-embeddedfile.lo: poppler-embeddedfile.cc
+@am__fastdepCXX_TRUE@  $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpoppler_qt4_la_CXXFLAGS) $(CXXFLAGS) -MT libpoppler_qt4_la-poppler-embeddedfile.lo -MD -MP -MF $(DEPDIR)/libpoppler_qt4_la-poppler-embeddedfile.Tpo -c -o libpoppler_qt4_la-poppler-embeddedfile.lo `test -f 'poppler-embeddedfile.cc' || echo '$(srcdir)/'`poppler-embeddedfile.cc
+@am__fastdepCXX_TRUE@  $(AM_V_at)$(am__mv) $(DEPDIR)/libpoppler_qt4_la-poppler-embeddedfile.Tpo $(DEPDIR)/libpoppler_qt4_la-poppler-embeddedfile.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     $(AM_V_CXX)source='poppler-embeddedfile.cc' object='libpoppler_qt4_la-poppler-embeddedfile.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpoppler_qt4_la_CXXFLAGS) $(CXXFLAGS) -c -o libpoppler_qt4_la-poppler-embeddedfile.lo `test -f 'poppler-embeddedfile.cc' || echo '$(srcdir)/'`poppler-embeddedfile.cc
+
+libpoppler_qt4_la-poppler-textbox.lo: poppler-textbox.cc
+@am__fastdepCXX_TRUE@  $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpoppler_qt4_la_CXXFLAGS) $(CXXFLAGS) -MT libpoppler_qt4_la-poppler-textbox.lo -MD -MP -MF $(DEPDIR)/libpoppler_qt4_la-poppler-textbox.Tpo -c -o libpoppler_qt4_la-poppler-textbox.lo `test -f 'poppler-textbox.cc' || echo '$(srcdir)/'`poppler-textbox.cc
+@am__fastdepCXX_TRUE@  $(AM_V_at)$(am__mv) $(DEPDIR)/libpoppler_qt4_la-poppler-textbox.Tpo $(DEPDIR)/libpoppler_qt4_la-poppler-textbox.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     $(AM_V_CXX)source='poppler-textbox.cc' object='libpoppler_qt4_la-poppler-textbox.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpoppler_qt4_la_CXXFLAGS) $(CXXFLAGS) -c -o libpoppler_qt4_la-poppler-textbox.lo `test -f 'poppler-textbox.cc' || echo '$(srcdir)/'`poppler-textbox.cc
+
+libpoppler_qt4_la-poppler-link.lo: poppler-link.cc
+@am__fastdepCXX_TRUE@  $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpoppler_qt4_la_CXXFLAGS) $(CXXFLAGS) -MT libpoppler_qt4_la-poppler-link.lo -MD -MP -MF $(DEPDIR)/libpoppler_qt4_la-poppler-link.Tpo -c -o libpoppler_qt4_la-poppler-link.lo `test -f 'poppler-link.cc' || echo '$(srcdir)/'`poppler-link.cc
+@am__fastdepCXX_TRUE@  $(AM_V_at)$(am__mv) $(DEPDIR)/libpoppler_qt4_la-poppler-link.Tpo $(DEPDIR)/libpoppler_qt4_la-poppler-link.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     $(AM_V_CXX)source='poppler-link.cc' object='libpoppler_qt4_la-poppler-link.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpoppler_qt4_la_CXXFLAGS) $(CXXFLAGS) -c -o libpoppler_qt4_la-poppler-link.lo `test -f 'poppler-link.cc' || echo '$(srcdir)/'`poppler-link.cc
+
+libpoppler_qt4_la-poppler-annotation.lo: poppler-annotation.cc
+@am__fastdepCXX_TRUE@  $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpoppler_qt4_la_CXXFLAGS) $(CXXFLAGS) -MT libpoppler_qt4_la-poppler-annotation.lo -MD -MP -MF $(DEPDIR)/libpoppler_qt4_la-poppler-annotation.Tpo -c -o libpoppler_qt4_la-poppler-annotation.lo `test -f 'poppler-annotation.cc' || echo '$(srcdir)/'`poppler-annotation.cc
+@am__fastdepCXX_TRUE@  $(AM_V_at)$(am__mv) $(DEPDIR)/libpoppler_qt4_la-poppler-annotation.Tpo $(DEPDIR)/libpoppler_qt4_la-poppler-annotation.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     $(AM_V_CXX)source='poppler-annotation.cc' object='libpoppler_qt4_la-poppler-annotation.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpoppler_qt4_la_CXXFLAGS) $(CXXFLAGS) -c -o libpoppler_qt4_la-poppler-annotation.lo `test -f 'poppler-annotation.cc' || echo '$(srcdir)/'`poppler-annotation.cc
+
+libpoppler_qt4_la-poppler-link-extractor.lo: poppler-link-extractor.cc
+@am__fastdepCXX_TRUE@  $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpoppler_qt4_la_CXXFLAGS) $(CXXFLAGS) -MT libpoppler_qt4_la-poppler-link-extractor.lo -MD -MP -MF $(DEPDIR)/libpoppler_qt4_la-poppler-link-extractor.Tpo -c -o libpoppler_qt4_la-poppler-link-extractor.lo `test -f 'poppler-link-extractor.cc' || echo '$(srcdir)/'`poppler-link-extractor.cc
+@am__fastdepCXX_TRUE@  $(AM_V_at)$(am__mv) $(DEPDIR)/libpoppler_qt4_la-poppler-link-extractor.Tpo $(DEPDIR)/libpoppler_qt4_la-poppler-link-extractor.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     $(AM_V_CXX)source='poppler-link-extractor.cc' object='libpoppler_qt4_la-poppler-link-extractor.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpoppler_qt4_la_CXXFLAGS) $(CXXFLAGS) -c -o libpoppler_qt4_la-poppler-link-extractor.lo `test -f 'poppler-link-extractor.cc' || echo '$(srcdir)/'`poppler-link-extractor.cc
+
+libpoppler_qt4_la-poppler-optcontent.lo: poppler-optcontent.cc
+@am__fastdepCXX_TRUE@  $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpoppler_qt4_la_CXXFLAGS) $(CXXFLAGS) -MT libpoppler_qt4_la-poppler-optcontent.lo -MD -MP -MF $(DEPDIR)/libpoppler_qt4_la-poppler-optcontent.Tpo -c -o libpoppler_qt4_la-poppler-optcontent.lo `test -f 'poppler-optcontent.cc' || echo '$(srcdir)/'`poppler-optcontent.cc
+@am__fastdepCXX_TRUE@  $(AM_V_at)$(am__mv) $(DEPDIR)/libpoppler_qt4_la-poppler-optcontent.Tpo $(DEPDIR)/libpoppler_qt4_la-poppler-optcontent.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     $(AM_V_CXX)source='poppler-optcontent.cc' object='libpoppler_qt4_la-poppler-optcontent.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpoppler_qt4_la_CXXFLAGS) $(CXXFLAGS) -c -o libpoppler_qt4_la-poppler-optcontent.lo `test -f 'poppler-optcontent.cc' || echo '$(srcdir)/'`poppler-optcontent.cc
+
+libpoppler_qt4_la-poppler-page-transition.lo: poppler-page-transition.cc
+@am__fastdepCXX_TRUE@  $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpoppler_qt4_la_CXXFLAGS) $(CXXFLAGS) -MT libpoppler_qt4_la-poppler-page-transition.lo -MD -MP -MF $(DEPDIR)/libpoppler_qt4_la-poppler-page-transition.Tpo -c -o libpoppler_qt4_la-poppler-page-transition.lo `test -f 'poppler-page-transition.cc' || echo '$(srcdir)/'`poppler-page-transition.cc
+@am__fastdepCXX_TRUE@  $(AM_V_at)$(am__mv) $(DEPDIR)/libpoppler_qt4_la-poppler-page-transition.Tpo $(DEPDIR)/libpoppler_qt4_la-poppler-page-transition.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     $(AM_V_CXX)source='poppler-page-transition.cc' object='libpoppler_qt4_la-poppler-page-transition.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpoppler_qt4_la_CXXFLAGS) $(CXXFLAGS) -c -o libpoppler_qt4_la-poppler-page-transition.lo `test -f 'poppler-page-transition.cc' || echo '$(srcdir)/'`poppler-page-transition.cc
+
+libpoppler_qt4_la-poppler-sound.lo: poppler-sound.cc
+@am__fastdepCXX_TRUE@  $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpoppler_qt4_la_CXXFLAGS) $(CXXFLAGS) -MT libpoppler_qt4_la-poppler-sound.lo -MD -MP -MF $(DEPDIR)/libpoppler_qt4_la-poppler-sound.Tpo -c -o libpoppler_qt4_la-poppler-sound.lo `test -f 'poppler-sound.cc' || echo '$(srcdir)/'`poppler-sound.cc
+@am__fastdepCXX_TRUE@  $(AM_V_at)$(am__mv) $(DEPDIR)/libpoppler_qt4_la-poppler-sound.Tpo $(DEPDIR)/libpoppler_qt4_la-poppler-sound.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     $(AM_V_CXX)source='poppler-sound.cc' object='libpoppler_qt4_la-poppler-sound.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpoppler_qt4_la_CXXFLAGS) $(CXXFLAGS) -c -o libpoppler_qt4_la-poppler-sound.lo `test -f 'poppler-sound.cc' || echo '$(srcdir)/'`poppler-sound.cc
+
+libpoppler_qt4_la-poppler-form.lo: poppler-form.cc
+@am__fastdepCXX_TRUE@  $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpoppler_qt4_la_CXXFLAGS) $(CXXFLAGS) -MT libpoppler_qt4_la-poppler-form.lo -MD -MP -MF $(DEPDIR)/libpoppler_qt4_la-poppler-form.Tpo -c -o libpoppler_qt4_la-poppler-form.lo `test -f 'poppler-form.cc' || echo '$(srcdir)/'`poppler-form.cc
+@am__fastdepCXX_TRUE@  $(AM_V_at)$(am__mv) $(DEPDIR)/libpoppler_qt4_la-poppler-form.Tpo $(DEPDIR)/libpoppler_qt4_la-poppler-form.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     $(AM_V_CXX)source='poppler-form.cc' object='libpoppler_qt4_la-poppler-form.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpoppler_qt4_la_CXXFLAGS) $(CXXFLAGS) -c -o libpoppler_qt4_la-poppler-form.lo `test -f 'poppler-form.cc' || echo '$(srcdir)/'`poppler-form.cc
+
+libpoppler_qt4_la-poppler-base-converter.lo: poppler-base-converter.cc
+@am__fastdepCXX_TRUE@  $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpoppler_qt4_la_CXXFLAGS) $(CXXFLAGS) -MT libpoppler_qt4_la-poppler-base-converter.lo -MD -MP -MF $(DEPDIR)/libpoppler_qt4_la-poppler-base-converter.Tpo -c -o libpoppler_qt4_la-poppler-base-converter.lo `test -f 'poppler-base-converter.cc' || echo '$(srcdir)/'`poppler-base-converter.cc
+@am__fastdepCXX_TRUE@  $(AM_V_at)$(am__mv) $(DEPDIR)/libpoppler_qt4_la-poppler-base-converter.Tpo $(DEPDIR)/libpoppler_qt4_la-poppler-base-converter.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     $(AM_V_CXX)source='poppler-base-converter.cc' object='libpoppler_qt4_la-poppler-base-converter.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpoppler_qt4_la_CXXFLAGS) $(CXXFLAGS) -c -o libpoppler_qt4_la-poppler-base-converter.lo `test -f 'poppler-base-converter.cc' || echo '$(srcdir)/'`poppler-base-converter.cc
+
+libpoppler_qt4_la-poppler-ps-converter.lo: poppler-ps-converter.cc
+@am__fastdepCXX_TRUE@  $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpoppler_qt4_la_CXXFLAGS) $(CXXFLAGS) -MT libpoppler_qt4_la-poppler-ps-converter.lo -MD -MP -MF $(DEPDIR)/libpoppler_qt4_la-poppler-ps-converter.Tpo -c -o libpoppler_qt4_la-poppler-ps-converter.lo `test -f 'poppler-ps-converter.cc' || echo '$(srcdir)/'`poppler-ps-converter.cc
+@am__fastdepCXX_TRUE@  $(AM_V_at)$(am__mv) $(DEPDIR)/libpoppler_qt4_la-poppler-ps-converter.Tpo $(DEPDIR)/libpoppler_qt4_la-poppler-ps-converter.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     $(AM_V_CXX)source='poppler-ps-converter.cc' object='libpoppler_qt4_la-poppler-ps-converter.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpoppler_qt4_la_CXXFLAGS) $(CXXFLAGS) -c -o libpoppler_qt4_la-poppler-ps-converter.lo `test -f 'poppler-ps-converter.cc' || echo '$(srcdir)/'`poppler-ps-converter.cc
+
+libpoppler_qt4_la-poppler-pdf-converter.lo: poppler-pdf-converter.cc
+@am__fastdepCXX_TRUE@  $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpoppler_qt4_la_CXXFLAGS) $(CXXFLAGS) -MT libpoppler_qt4_la-poppler-pdf-converter.lo -MD -MP -MF $(DEPDIR)/libpoppler_qt4_la-poppler-pdf-converter.Tpo -c -o libpoppler_qt4_la-poppler-pdf-converter.lo `test -f 'poppler-pdf-converter.cc' || echo '$(srcdir)/'`poppler-pdf-converter.cc
+@am__fastdepCXX_TRUE@  $(AM_V_at)$(am__mv) $(DEPDIR)/libpoppler_qt4_la-poppler-pdf-converter.Tpo $(DEPDIR)/libpoppler_qt4_la-poppler-pdf-converter.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     $(AM_V_CXX)source='poppler-pdf-converter.cc' object='libpoppler_qt4_la-poppler-pdf-converter.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpoppler_qt4_la_CXXFLAGS) $(CXXFLAGS) -c -o libpoppler_qt4_la-poppler-pdf-converter.lo `test -f 'poppler-pdf-converter.cc' || echo '$(srcdir)/'`poppler-pdf-converter.cc
+
+libpoppler_qt4_la-poppler-qiodeviceoutstream.lo: poppler-qiodeviceoutstream.cc
+@am__fastdepCXX_TRUE@  $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpoppler_qt4_la_CXXFLAGS) $(CXXFLAGS) -MT libpoppler_qt4_la-poppler-qiodeviceoutstream.lo -MD -MP -MF $(DEPDIR)/libpoppler_qt4_la-poppler-qiodeviceoutstream.Tpo -c -o libpoppler_qt4_la-poppler-qiodeviceoutstream.lo `test -f 'poppler-qiodeviceoutstream.cc' || echo '$(srcdir)/'`poppler-qiodeviceoutstream.cc
+@am__fastdepCXX_TRUE@  $(AM_V_at)$(am__mv) $(DEPDIR)/libpoppler_qt4_la-poppler-qiodeviceoutstream.Tpo $(DEPDIR)/libpoppler_qt4_la-poppler-qiodeviceoutstream.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     $(AM_V_CXX)source='poppler-qiodeviceoutstream.cc' object='libpoppler_qt4_la-poppler-qiodeviceoutstream.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpoppler_qt4_la_CXXFLAGS) $(CXXFLAGS) -c -o libpoppler_qt4_la-poppler-qiodeviceoutstream.lo `test -f 'poppler-qiodeviceoutstream.cc' || echo '$(srcdir)/'`poppler-qiodeviceoutstream.cc
+
+libpoppler_qt4_la-poppler-private.lo: poppler-private.cc
+@am__fastdepCXX_TRUE@  $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpoppler_qt4_la_CXXFLAGS) $(CXXFLAGS) -MT libpoppler_qt4_la-poppler-private.lo -MD -MP -MF $(DEPDIR)/libpoppler_qt4_la-poppler-private.Tpo -c -o libpoppler_qt4_la-poppler-private.lo `test -f 'poppler-private.cc' || echo '$(srcdir)/'`poppler-private.cc
+@am__fastdepCXX_TRUE@  $(AM_V_at)$(am__mv) $(DEPDIR)/libpoppler_qt4_la-poppler-private.Tpo $(DEPDIR)/libpoppler_qt4_la-poppler-private.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     $(AM_V_CXX)source='poppler-private.cc' object='libpoppler_qt4_la-poppler-private.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpoppler_qt4_la_CXXFLAGS) $(CXXFLAGS) -c -o libpoppler_qt4_la-poppler-private.lo `test -f 'poppler-private.cc' || echo '$(srcdir)/'`poppler-private.cc
+
+libpoppler_qt4_la-poppler-movie.lo: poppler-movie.cc
+@am__fastdepCXX_TRUE@  $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpoppler_qt4_la_CXXFLAGS) $(CXXFLAGS) -MT libpoppler_qt4_la-poppler-movie.lo -MD -MP -MF $(DEPDIR)/libpoppler_qt4_la-poppler-movie.Tpo -c -o libpoppler_qt4_la-poppler-movie.lo `test -f 'poppler-movie.cc' || echo '$(srcdir)/'`poppler-movie.cc
+@am__fastdepCXX_TRUE@  $(AM_V_at)$(am__mv) $(DEPDIR)/libpoppler_qt4_la-poppler-movie.Tpo $(DEPDIR)/libpoppler_qt4_la-poppler-movie.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     $(AM_V_CXX)source='poppler-movie.cc' object='libpoppler_qt4_la-poppler-movie.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpoppler_qt4_la_CXXFLAGS) $(CXXFLAGS) -c -o libpoppler_qt4_la-poppler-movie.lo `test -f 'poppler-movie.cc' || echo '$(srcdir)/'`poppler-movie.cc
+
+libpoppler_qt4_la-poppler-media.lo: poppler-media.cc
+@am__fastdepCXX_TRUE@  $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpoppler_qt4_la_CXXFLAGS) $(CXXFLAGS) -MT libpoppler_qt4_la-poppler-media.lo -MD -MP -MF $(DEPDIR)/libpoppler_qt4_la-poppler-media.Tpo -c -o libpoppler_qt4_la-poppler-media.lo `test -f 'poppler-media.cc' || echo '$(srcdir)/'`poppler-media.cc
+@am__fastdepCXX_TRUE@  $(AM_V_at)$(am__mv) $(DEPDIR)/libpoppler_qt4_la-poppler-media.Tpo $(DEPDIR)/libpoppler_qt4_la-poppler-media.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     $(AM_V_CXX)source='poppler-media.cc' object='libpoppler_qt4_la-poppler-media.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpoppler_qt4_la_CXXFLAGS) $(CXXFLAGS) -c -o libpoppler_qt4_la-poppler-media.lo `test -f 'poppler-media.cc' || echo '$(srcdir)/'`poppler-media.cc
+
+mostlyclean-libtool:
+       -rm -f *.lo
+
+clean-libtool:
+       -rm -rf .libs _libs
+install-poppler_includeHEADERS: $(poppler_include_HEADERS)
+       @$(NORMAL_INSTALL)
+       @list='$(poppler_include_HEADERS)'; test -n "$(poppler_includedir)" || list=; \
+       if test -n "$$list"; then \
+         echo " $(MKDIR_P) '$(DESTDIR)$(poppler_includedir)'"; \
+         $(MKDIR_P) "$(DESTDIR)$(poppler_includedir)" || exit 1; \
+       fi; \
+       for p in $$list; do \
+         if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+         echo "$$d$$p"; \
+       done | $(am__base_list) | \
+       while read files; do \
+         echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(poppler_includedir)'"; \
+         $(INSTALL_HEADER) $$files "$(DESTDIR)$(poppler_includedir)" || exit $$?; \
+       done
+
+uninstall-poppler_includeHEADERS:
+       @$(NORMAL_UNINSTALL)
+       @list='$(poppler_include_HEADERS)'; test -n "$(poppler_includedir)" || list=; \
+       files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
+       dir='$(DESTDIR)$(poppler_includedir)'; $(am__uninstall_files_from_dir)
+
+ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
+       list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+       unique=`for i in $$list; do \
+           if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+         done | \
+         $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
+             END { if (nonempty) { for (i in files) print i; }; }'`; \
+       mkid -fID $$unique
+tags: TAGS
+
+TAGS:  $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
+               $(TAGS_FILES) $(LISP)
+       set x; \
+       here=`pwd`; \
+       list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
+       unique=`for i in $$list; do \
+           if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+         done | \
+         $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
+             END { if (nonempty) { for (i in files) print i; }; }'`; \
+       shift; \
+       if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
+         test -n "$$unique" || unique=$$empty_fix; \
+         if test $$# -gt 0; then \
+           $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+             "$$@" $$unique; \
+         else \
+           $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+             $$unique; \
+         fi; \
+       fi
+ctags: CTAGS
+CTAGS:  $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
+               $(TAGS_FILES) $(LISP)
+       list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
+       unique=`for i in $$list; do \
+           if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+         done | \
+         $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
+             END { if (nonempty) { for (i in files) print i; }; }'`; \
+       test -z "$(CTAGS_ARGS)$$unique" \
+         || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+            $$unique
+
+GTAGS:
+       here=`$(am__cd) $(top_builddir) && pwd` \
+         && $(am__cd) $(top_srcdir) \
+         && gtags -i $(GTAGS_ARGS) "$$here"
+
+distclean-tags:
+       -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+
+distdir: $(DISTFILES)
+       @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+       topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+       list='$(DISTFILES)'; \
+         dist_files=`for file in $$list; do echo $$file; done | \
+         sed -e "s|^$$srcdirstrip/||;t" \
+             -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+       case $$dist_files in \
+         */*) $(MKDIR_P) `echo "$$dist_files" | \
+                          sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+                          sort -u` ;; \
+       esac; \
+       for file in $$dist_files; do \
+         if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+         if test -d $$d/$$file; then \
+           dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+           if test -d "$(distdir)/$$file"; then \
+             find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+           fi; \
+           if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+             cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
+             find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+           fi; \
+           cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
+         else \
+           test -f "$(distdir)/$$file" \
+           || cp -p $$d/$$file "$(distdir)/$$file" \
+           || exit 1; \
+         fi; \
+       done
+check-am: all-am
+check: $(BUILT_SOURCES)
+       $(MAKE) $(AM_MAKEFLAGS) check-am
+all-am: Makefile $(LTLIBRARIES) $(HEADERS)
+installdirs:
+       for dir in "$(DESTDIR)$(libdir)" "$(DESTDIR)$(poppler_includedir)"; do \
+         test -z "$$dir" || $(MKDIR_P) "$$dir"; \
+       done
+install: $(BUILT_SOURCES)
+       $(MAKE) $(AM_MAKEFLAGS) install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+       @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+       if test -z '$(STRIP)'; then \
+         $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+           install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+             install; \
+       else \
+         $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+           install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+           "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
+       fi
+mostlyclean-generic:
+
+distclean-generic:
+       -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+       -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
+
+maintainer-clean-generic:
+       @echo "This command is intended for maintainers to use"
+       @echo "it deletes files that may require special tools to rebuild."
+       -test -z "$(BUILT_SOURCES)" || rm -f $(BUILT_SOURCES)
+clean: clean-am
+
+clean-am: clean-generic clean-libLTLIBRARIES clean-libtool \
+       mostlyclean-am
+
+distclean: distclean-am
+       -rm -rf ./$(DEPDIR)
+       -rm -f Makefile
+distclean-am: clean-am distclean-compile distclean-generic \
+       distclean-tags
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+html-am:
+
+info: info-am
+
+info-am:
+
+install-data-am: install-poppler_includeHEADERS
+
+install-dvi: install-dvi-am
+
+install-dvi-am:
+
+install-exec-am: install-libLTLIBRARIES
+
+install-html: install-html-am
+
+install-html-am:
+
+install-info: install-info-am
+
+install-info-am:
+
+install-man:
+
+install-pdf: install-pdf-am
+
+install-pdf-am:
+
+install-ps: install-ps-am
+
+install-ps-am:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+       -rm -rf ./$(DEPDIR)
+       -rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-compile mostlyclean-generic \
+       mostlyclean-libtool
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am: uninstall-libLTLIBRARIES \
+       uninstall-poppler_includeHEADERS
+
+.MAKE: all check install install-am install-strip
+
+.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \
+       clean-libLTLIBRARIES clean-libtool ctags distclean \
+       distclean-compile distclean-generic distclean-libtool \
+       distclean-tags distdir dvi dvi-am html html-am info info-am \
+       install install-am install-data install-data-am install-dvi \
+       install-dvi-am install-exec install-exec-am install-html \
+       install-html-am install-info install-info-am \
+       install-libLTLIBRARIES install-man install-pdf install-pdf-am \
+       install-poppler_includeHEADERS install-ps install-ps-am \
+       install-strip installcheck installcheck-am installdirs \
+       maintainer-clean maintainer-clean-generic mostlyclean \
+       mostlyclean-compile mostlyclean-generic mostlyclean-libtool \
+       pdf pdf-am ps ps-am tags uninstall uninstall-am \
+       uninstall-libLTLIBRARIES uninstall-poppler_includeHEADERS
+
+
+SUFFIXES: .moc
+
+# This rule lets GNU make create any *.moc from the equivalent *.h
+.h.moc:
+       $(AM_V_GEN) $(MOCQT4) -i $< -o $@
+
+clean-generic:
+       rm -f *.moc
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/qt4/src/poppler-annotation-helper.h b/qt4/src/poppler-annotation-helper.h
new file mode 100644 (file)
index 0000000..5f335c0
--- /dev/null
@@ -0,0 +1,198 @@
+/* poppler-annotation-helper.h: qt interface to poppler
+ * Copyright (C) 2006, 2008, Albert Astals Cid <aacid@kde.org>
+ * Copyright (C) 2008, Pino Toscano <pino@kde.org>
+ * Copyright (C) 2012, Fabio D'Urso <fabiodurso@hotmail.it>
+ * Adapting code from
+ *   Copyright (C) 2004 by Enrico Ros <eros.kde@email.it>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include <QtCore/QDebug>
+
+#include <Object.h>
+
+class QColor;
+
+class AnnotColor;
+
+namespace Poppler {
+
+class XPDFReader
+{
+    public:
+        // find named symbol and parse it
+        static inline void lookupName( Dict *, char *, QString & dest );
+        static inline void lookupString( Dict *, char *, QString & dest );
+        static inline void lookupBool( Dict *, char *, bool & dest );
+        static inline void lookupInt( Dict *, char *, int & dest );
+        static inline void lookupNum( Dict *, char *, double & dest );
+        static inline int lookupNumArray( Dict *, char *, double * dest, int len );
+        static inline void lookupColor( Dict *, char *, QColor & color );
+        static inline void lookupIntRef( Dict *, char *, int & dest );
+        static inline void lookupDate( Dict *, char *, QDateTime & dest );
+        // transform from user coords to normalized ones using the matrix M
+        static inline void transform( double * M, double x, double y, QPointF &res );
+        static inline void invTransform( double * M, const QPointF &p, double &x, double &y );
+};
+
+void XPDFReader::lookupName( Dict * dict, char * type, QString & dest )
+{
+    Object nameObj;
+    dict->lookup( type, &nameObj );
+    if ( nameObj.isNull() )
+        return;
+    if ( nameObj.isName() )
+        dest = nameObj.getName();
+    else
+        qDebug() << type << " is not Name." << endl;
+    nameObj.free();
+}
+
+void XPDFReader::lookupString( Dict * dict, char * type, QString & dest )
+{
+    Object stringObj;
+    dict->lookup( type, &stringObj );
+    if ( stringObj.isNull() )
+        return;
+    if ( stringObj.isString() )
+        dest = stringObj.getString()->getCString();
+    else
+        qDebug() << type << " is not String." << endl;
+    stringObj.free();
+}
+
+void XPDFReader::lookupBool( Dict * dict, char * type, bool & dest )
+{
+    Object boolObj;
+    dict->lookup( type, &boolObj );
+    if ( boolObj.isNull() )
+        return;
+    if ( boolObj.isBool() )
+        dest = boolObj.getBool() == gTrue;
+    else
+        qDebug() << type << " is not Bool." << endl;
+    boolObj.free();
+}
+
+void XPDFReader::lookupInt( Dict * dict, char * type, int & dest )
+{
+    Object intObj;
+    dict->lookup( type, &intObj );
+    if ( intObj.isNull() )
+        return;
+    if ( intObj.isInt() )
+        dest = intObj.getInt();
+    else
+        qDebug() << type << " is not Int." << endl;
+    intObj.free();
+}
+
+void XPDFReader::lookupNum( Dict * dict, char * type, double & dest )
+{
+    Object numObj;
+    dict->lookup( type, &numObj );
+    if ( numObj.isNull() )
+        return;
+    if ( numObj.isNum() )
+        dest = numObj.getNum();
+    else
+        qDebug() << type << " is not Num." << endl;
+    numObj.free();
+}
+
+int XPDFReader::lookupNumArray( Dict * dict, char * type, double * dest, int len )
+{
+    Object arrObj;
+    dict->lookup( type, &arrObj );
+    if ( arrObj.isNull() )
+        return 0;
+    Object numObj;
+    if ( arrObj.isArray() )
+    {
+        len = qMin( len, arrObj.arrayGetLength() );
+        for ( int i = 0; i < len; i++ )
+        {
+            dest[i] = arrObj.arrayGet( i, &numObj )->getNum();
+            numObj.free();
+        }
+    }
+    else
+    {
+        len = 0;
+        qDebug() << type << "is not Array." << endl;
+    }
+    arrObj.free();
+    return len;
+}
+
+void XPDFReader::lookupColor( Dict * dict, char * type, QColor & dest )
+{
+    double c[3];
+    if ( XPDFReader::lookupNumArray( dict, type, c, 3 ) == 3 )
+        dest = QColor( (int)(c[0]*255.0), (int)(c[1]*255.0), (int)(c[2]*255.0));
+}
+
+void XPDFReader::lookupIntRef( Dict * dict, char * type, int & dest )
+{
+    Object refObj;
+    dict->lookupNF( type, &refObj );
+    if ( refObj.isNull() )
+        return;
+    if ( refObj.isRef() )
+        dest = refObj.getRefNum();
+    else
+        qDebug() << type << " is not Ref." << endl;
+    refObj.free();
+}
+
+void XPDFReader::lookupDate( Dict * dict, char * type, QDateTime & dest )
+{
+    Object dateObj;
+    dict->lookup( type, &dateObj );
+    if ( dateObj.isNull() )
+        return;
+    if ( dateObj.isString() )
+    {
+        dest = convertDate( dateObj.getString()->getCString() );
+    }
+    else
+        qDebug() << type << " is not Date" << endl;
+    dateObj.free();
+}
+
+void XPDFReader::transform( double * M, double x, double y, QPointF &res )
+{
+    res.setX( M[0] * x + M[2] * y + M[4] );
+    res.setY( M[1] * x + M[3] * y + M[5] );
+}
+
+void XPDFReader::invTransform( double * M, const QPointF &p, double &x, double &y )
+{
+    const double det = M[0]*M[3] - M[1]*M[2];
+    Q_ASSERT(det != 0);
+
+    const double invM[4] = { M[3]/det, -M[1]/det, -M[2]/det, M[0]/det };
+    const double xt = p.x() - M[4];
+    const double yt = p.y() - M[5];
+
+    x = invM[0] * xt + invM[2] * yt;
+    y = invM[1] * xt + invM[3] * yt;
+}
+
+QColor convertAnnotColor( AnnotColor *color );
+AnnotColor* convertQColor( const QColor &color );
+
+}
diff --git a/qt4/src/poppler-annotation-private.h b/qt4/src/poppler-annotation-private.h
new file mode 100644 (file)
index 0000000..2ee7d77
--- /dev/null
@@ -0,0 +1,107 @@
+/* poppler-link-extractor-private.h: qt interface to poppler
+ * Copyright (C) 2007, Pino Toscano <pino@kde.org>
+ * Copyright (C) 2012, Tobias Koenig <tokoe@kdab.com>
+ * Copyright (C) 2012, Fabio D'Urso <fabiodurso@hotmail.it>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#ifndef _POPPLER_ANNOTATION_PRIVATE_H_
+#define _POPPLER_ANNOTATION_PRIVATE_H_
+
+#include <QtCore/QLinkedList>
+#include <QtCore/QPointF>
+#include <QtCore/QSharedDataPointer>
+
+#include "poppler-annotation.h"
+
+#include <Object.h>
+
+class Annot;
+class AnnotPath;
+class Page;
+class PDFRectangle;
+
+namespace Poppler
+{
+class DocumentData;
+
+class AnnotationPrivate : public QSharedData
+{
+    public:
+        AnnotationPrivate();
+        virtual ~AnnotationPrivate();
+
+        void addRevision(Annotation *ann, Annotation::RevScope scope, Annotation::RevType type);
+
+        /* Returns an Annotation of the right subclass whose d_ptr points to
+         * this AnnotationPrivate */
+        virtual Annotation * makeAlias() = 0;
+
+        /* properties: contents related */
+        QString author;
+        QString contents;
+        QString uniqueName;
+        QDateTime modDate;       // before or equal to currentDateTime()
+        QDateTime creationDate;  // before or equal to modifyDate
+
+        /* properties: look/interaction related */
+        int flags;
+        QRectF boundary;
+
+        /* style and popup */
+        Annotation::Style style;
+        Annotation::Popup popup;
+
+        /* revisions */
+        Annotation::RevScope revisionScope;
+        Annotation::RevType revisionType;
+        QList<Annotation*> revisions;
+
+        /* After this call, the Annotation object will behave like a wrapper for
+         * the specified Annot object. All cached values are discarded */
+        void tieToNativeAnnot(Annot *ann, ::Page *page, DocumentData *doc);
+
+        /* Creates a new Annot object on the specified page, flushes current
+         * values to that object and ties this Annotation to that object */
+        virtual Annot* createNativeAnnot(::Page *destPage, DocumentData *doc) = 0;
+
+        /* Inited to 0 (i.e. untied annotation) */
+        Annot *pdfAnnot;
+        ::Page *pdfPage;
+        DocumentData * parentDoc;
+
+        /* The following helpers only work if pdfPage is set */
+        void flushBaseAnnotationProperties();
+        void fillMTX(double MTX[6]) const;
+        QRectF fromPdfRectangle(const PDFRectangle &r) const;
+        PDFRectangle toPdfRectangle(const QRectF &r) const;
+        AnnotPath * toAnnotPath(const QLinkedList<QPointF> &l) const;
+
+        /* Scan page for annotations, parentId=0 searches for root annotations */
+        static QList<Annotation*> findAnnotations(::Page *pdfPage, DocumentData *doc, int parentId = 0);
+
+        /* Add given annotation to given page */
+        static void addAnnotationToPage(::Page *pdfPage, DocumentData *doc, const Annotation * ann);
+
+        /* Remove annotation from page and destroy ann */
+        static void removeAnnotationFromPage(::Page *pdfPage, const Annotation * ann);
+
+        Ref pdfObjectReference() const;
+};
+
+}
+
+#endif
diff --git a/qt4/src/poppler-annotation.cc b/qt4/src/poppler-annotation.cc
new file mode 100644 (file)
index 0000000..67dbbae
--- /dev/null
@@ -0,0 +1,4307 @@
+/* poppler-annotation.cc: qt interface to poppler
+ * Copyright (C) 2006, 2009, 2012 Albert Astals Cid <aacid@kde.org>
+ * Copyright (C) 2006, 2008, 2010 Pino Toscano <pino@kde.org>
+ * Copyright (C) 2012, Guillermo A. Amaral B. <gamaral@kde.org>
+ * Copyright (C) 2012, Fabio D'Urso <fabiodurso@hotmail.it>
+ * Adapting code from
+ *   Copyright (C) 2004 by Enrico Ros <eros.kde@email.it>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+// qt/kde includes
+#include <QtCore/QRegExp>
+#include <QtCore/QtAlgorithms>
+#include <QtXml/QDomElement>
+#include <QtGui/QColor>
+
+// local includes
+#include "poppler-annotation.h"
+#include "poppler-link.h"
+#include "poppler-qt4.h"
+#include "poppler-annotation-helper.h"
+#include "poppler-annotation-private.h"
+#include "poppler-page-private.h"
+#include "poppler-private.h"
+
+// poppler includes
+#include <Page.h>
+#include <Annot.h>
+#include <Gfx.h>
+#include <Error.h>
+#include <FileSpec.h>
+
+/* Almost all getters directly query the underlying poppler annotation, with
+ * the exceptions of link, file attachment, sound, movie and screen annotations,
+ * Whose data retrieval logic has not been moved yet. Their getters return
+ * static data set at creation time by findAnnotations
+ */
+
+namespace Poppler {
+
+//BEGIN AnnotationUtils implementation
+Annotation * AnnotationUtils::createAnnotation( const QDomElement & annElement )
+{
+    // safety check on annotation element
+    if ( !annElement.hasAttribute( "type" ) )
+        return 0;
+
+    // build annotation of given type
+    Annotation * annotation = 0;
+    int typeNumber = annElement.attribute( "type" ).toInt();
+    switch ( typeNumber )
+    {
+        case Annotation::AText:
+            annotation = new TextAnnotation( annElement );
+            break;
+        case Annotation::ALine:
+            annotation = new LineAnnotation( annElement );
+            break;
+        case Annotation::AGeom:
+            annotation = new GeomAnnotation( annElement );
+            break;
+        case Annotation::AHighlight:
+            annotation = new HighlightAnnotation( annElement );
+            break;
+        case Annotation::AStamp:
+            annotation = new StampAnnotation( annElement );
+            break;
+        case Annotation::AInk:
+            annotation = new InkAnnotation( annElement );
+            break;
+        case Annotation::ACaret:
+            annotation = new CaretAnnotation( annElement );
+            break;
+    }
+
+    // return created annotation
+    return annotation;
+}
+
+void AnnotationUtils::storeAnnotation( const Annotation * ann, QDomElement & annElement,
+    QDomDocument & document )
+{
+    // save annotation's type as element's attribute
+    annElement.setAttribute( "type", (uint)ann->subType() );
+
+    // append all annotation data as children of this node
+    ann->store( annElement, document );
+}
+
+QDomElement AnnotationUtils::findChildElement( const QDomNode & parentNode,
+    const QString & name )
+{
+    // loop through the whole children and return a 'name' named element
+    QDomNode subNode = parentNode.firstChild();
+    while( subNode.isElement() )
+    {
+        QDomElement element = subNode.toElement();
+        if ( element.tagName() == name )
+            return element;
+        subNode = subNode.nextSibling();
+    }
+    // if the name can't be found, return a dummy null element
+    return QDomElement();
+}
+//END AnnotationUtils implementation
+
+
+//BEGIN Annotation implementation
+AnnotationPrivate::AnnotationPrivate()
+    : flags( 0 ), revisionScope ( Annotation::Root ),
+    revisionType ( Annotation::None ), pdfAnnot ( 0 ), pdfPage ( 0 ),
+    parentDoc ( 0 )
+{
+}
+
+void AnnotationPrivate::addRevision( Annotation *ann, Annotation::RevScope scope, Annotation::RevType type )
+{
+    /* Since ownership stays with the caller, create an alias of ann */
+    revisions.append( ann->d_ptr->makeAlias() );
+
+    /* Set revision properties */
+    revisionScope = scope;
+    revisionType = type;
+}
+
+AnnotationPrivate::~AnnotationPrivate()
+{
+    // Delete all children revisions
+    qDeleteAll( revisions );
+
+    // Release Annot object
+    if (pdfAnnot)
+        pdfAnnot->decRefCnt();
+}
+
+void AnnotationPrivate::tieToNativeAnnot(Annot *ann, ::Page *page, Poppler::DocumentData * doc)
+{
+    if (pdfAnnot)
+    {
+        error(errIO, -1, "Annotation is already tied");
+        return;
+    }
+
+    pdfAnnot = ann;
+    pdfPage = page;
+    parentDoc = doc;
+
+    pdfAnnot->incRefCnt();
+}
+
+/* This method is called when a new annotation is created, after pdfAnnot and
+ * pdfPage have been set */
+void AnnotationPrivate::flushBaseAnnotationProperties()
+{
+    Q_ASSERT ( pdfPage );
+
+    Annotation *q = makeAlias(); // Setters are defined in the public class
+
+    // Since pdfAnnot has been set, this calls will write in the Annot object
+    q->setAuthor(author);
+    q->setContents(contents);
+    q->setUniqueName(uniqueName);
+    q->setModificationDate(modDate);
+    q->setCreationDate(creationDate);
+    q->setFlags(flags);
+    //q->setBoundary(boundary); -- already set by subclass-specific code
+    q->setStyle(style);
+    q->setPopup(popup);
+
+    // Flush revisions
+    foreach (Annotation *r, revisions)
+    {
+        // TODO: Flush revision
+        delete r; // Object is no longer needed
+    }
+
+    delete q;
+
+    // Clear some members to save memory
+    author.clear();
+    contents.clear();
+    uniqueName.clear();
+    revisions.clear();
+}
+
+void AnnotationPrivate::fillMTX(double MTX[6]) const
+{
+    Q_ASSERT ( pdfPage );
+
+    // build a normalized transform matrix for this page at 100% scale
+    GfxState * gfxState = new GfxState( 72.0, 72.0, pdfPage->getCropBox(), pdfPage->getRotate(), gTrue );
+    double * gfxCTM = gfxState->getCTM();
+
+    double w = pdfPage->getCropWidth();
+    double h = pdfPage->getCropHeight();
+
+    // Swap width and height if the page is rotated landscape or seascape
+    if ( pdfPage->getRotate() == 90 || pdfPage->getRotate() == 270 )
+    {
+        double t = w;
+        w = h;
+        h = t;
+    }
+
+    for ( int i = 0; i < 6; i+=2 )
+    {
+        MTX[i] = gfxCTM[i] / w;
+        MTX[i+1] = gfxCTM[i+1] / h;
+    }
+    delete gfxState;
+}
+
+QRectF AnnotationPrivate::fromPdfRectangle(const PDFRectangle &r) const
+{
+    double swp, MTX[6];
+    fillMTX(MTX);
+
+    QPointF p1, p2;
+    XPDFReader::transform( MTX, r.x1, r.y1, p1 );
+    XPDFReader::transform( MTX, r.x2, r.y2, p2 );
+
+    double tl_x = p1.x();
+    double tl_y = p1.y();
+    double br_x = p2.x();
+    double br_y = p2.y();
+
+    if (tl_x > br_x)
+    {
+        swp = tl_x;
+        tl_x = br_x;
+        br_x = swp;
+    }
+
+    if (tl_y > br_y)
+    {
+        swp = tl_y;
+        tl_y = br_y;
+        br_y = swp;
+    }
+
+    return QRectF( QPointF(tl_x,tl_y) , QPointF(br_x,br_y) );
+}
+
+PDFRectangle AnnotationPrivate::toPdfRectangle(const QRectF &r) const
+{
+    double MTX[6];
+    fillMTX(MTX);
+
+    double tl_x, tl_y, br_x, br_y, swp;
+    XPDFReader::invTransform( MTX, r.topLeft(), tl_x, tl_y );
+    XPDFReader::invTransform( MTX, r.bottomRight(), br_x, br_y );
+
+    if (tl_x > br_x)
+    {
+        swp = tl_x;
+        tl_x = br_x;
+        br_x = swp;
+    }
+
+    if (tl_y > br_y)
+    {
+        swp = tl_y;
+        tl_y = br_y;
+        br_y = swp;
+    }
+
+    return PDFRectangle(tl_x, tl_y, br_x, br_y);
+}
+
+AnnotPath * AnnotationPrivate::toAnnotPath(const QLinkedList<QPointF> &list) const
+{
+    const int count = list.size();
+    AnnotCoord **ac = (AnnotCoord **) gmallocn(count, sizeof(AnnotCoord*));
+
+    double MTX[6];
+    fillMTX(MTX);
+
+    int pos = 0;
+    foreach (const QPointF &p, list)
+    {
+        double x, y;
+        XPDFReader::invTransform( MTX, p, x, y );
+        ac[pos++] = new AnnotCoord(x, y);
+    }
+
+    return new AnnotPath(ac, count);
+}
+
+QList<Annotation*> AnnotationPrivate::findAnnotations(::Page *pdfPage, DocumentData *doc, int parentID)
+{
+    Annots* annots = pdfPage->getAnnots();
+    const uint numAnnotations = annots->getNumAnnots();
+    if ( numAnnotations == 0 )
+    {
+        return QList<Annotation*>();
+    }
+
+    // Create Annotation objects and tie to their native Annot
+    QList<Annotation*> res;
+    for ( uint j = 0; j < numAnnotations; j++ )
+    {
+        // get the j-th annotation
+        Annot * ann = annots->getAnnot( j );
+        if ( !ann )
+        {
+            error(errInternal, -1, "Annot %u is null", j);
+            continue;
+        }
+
+        // Check parent annotation
+        AnnotMarkup * markupann = dynamic_cast< AnnotMarkup * >( ann );
+        if (!markupann)
+        {
+            // Assume it's a root annotation, and skip if user didn't request it
+            if (parentID != 0)
+                continue;
+        }
+        else if (markupann->getInReplyToID() != parentID)
+            continue;
+
+        /* Create Annotation of the right subclass */
+        Annotation * annotation = 0;
+        Annot::AnnotSubtype subType = ann->getType();
+
+        switch ( subType )
+        {
+            case Annot::typeText:
+                annotation = new TextAnnotation(TextAnnotation::Linked);
+                break;
+            case Annot::typeFreeText:
+                annotation = new TextAnnotation(TextAnnotation::InPlace);
+                break;
+            case Annot::typeLine:
+                annotation = new LineAnnotation(LineAnnotation::StraightLine);
+                break;
+            case Annot::typePolygon:
+            case Annot::typePolyLine:
+                annotation = new LineAnnotation(LineAnnotation::Polyline);
+                break;
+            case Annot::typeSquare:
+            case Annot::typeCircle:
+                annotation = new GeomAnnotation();
+                break;
+            case Annot::typeHighlight:
+            case Annot::typeUnderline:
+            case Annot::typeSquiggly:
+            case Annot::typeStrikeOut:
+                annotation = new HighlightAnnotation();
+                break;
+            case Annot::typeStamp:
+                annotation = new StampAnnotation();
+                break;
+            case Annot::typeInk:
+                annotation = new InkAnnotation();
+                break;
+            case Annot::typeLink: /* TODO: Move logic to getters */
+            {
+                // parse Link params
+                AnnotLink * linkann = static_cast< AnnotLink * >( ann );
+                LinkAnnotation * l = new LinkAnnotation();
+                annotation = l;
+
+                // -> hlMode
+                l->setLinkHighlightMode( (LinkAnnotation::HighlightMode)linkann->getLinkEffect() );
+
+                // -> link region
+                // TODO
+
+                // reading link action
+                if ( linkann->getAction() )
+                {
+                    Link * popplerLink = PageData::convertLinkActionToLink( linkann->getAction(), doc, QRectF() );
+                    if ( popplerLink )
+                    {
+                        l->setLinkDestination( popplerLink );
+                    }
+                }
+                break;
+            }
+            case Annot::typeCaret:
+                annotation = new CaretAnnotation();
+                break;
+            case Annot::typeFileAttachment: /* TODO: Move logic to getters */
+            {
+                AnnotFileAttachment * attachann = static_cast< AnnotFileAttachment * >( ann );
+                FileAttachmentAnnotation * f = new FileAttachmentAnnotation();
+                annotation = f;
+                // -> fileIcon
+                f->setFileIconName( QString::fromLatin1( attachann->getName()->getCString() ) );
+                // -> embeddedFile
+                FileSpec *filespec = new FileSpec( attachann->getFile() );
+                f->setEmbeddedFile( new EmbeddedFile( *new EmbeddedFileData( filespec ) ) );
+                break;
+            }
+            case Annot::typeSound: /* TODO: Move logic to getters */
+            {
+                AnnotSound * soundann = static_cast< AnnotSound * >( ann );
+                SoundAnnotation * s = new SoundAnnotation();
+                annotation = s;
+
+                // -> soundIcon
+                s->setSoundIconName( QString::fromLatin1( soundann->getName()->getCString() ) );
+                // -> sound
+                s->setSound( new SoundObject( soundann->getSound() ) );
+                break;
+            }
+            case Annot::typeMovie: /* TODO: Move logic to getters */
+            {
+                AnnotMovie * movieann = static_cast< AnnotMovie * >( ann );
+                MovieAnnotation * m = new MovieAnnotation();
+                annotation = m;
+
+                // -> movie
+                MovieObject *movie = new MovieObject( movieann );
+                m->setMovie( movie );
+                // -> movieTitle
+                GooString * movietitle = movieann->getTitle();
+                if ( movietitle )
+                    m->setMovieTitle( QString::fromLatin1( movietitle->getCString() ) );
+                break;
+            }
+            case Annot::typeScreen:
+            {
+                AnnotScreen * screenann = static_cast< AnnotScreen * >( ann );
+                if (!screenann->getAction())
+                  continue;
+                ScreenAnnotation * s = new ScreenAnnotation();
+                annotation = s;
+
+                // -> screen
+                Link * popplerLink = PageData::convertLinkActionToLink( screenann->getAction(), doc, QRectF() );
+                s->setAction( static_cast<Poppler::LinkRendition *>(popplerLink) );
+
+                // -> screenTitle
+                GooString * screentitle = screenann->getTitle();
+                if ( screentitle )
+                    s->setScreenTitle( UnicodeParsedString( screentitle ) );
+                break;
+            }
+            case Annot::typePopup:
+                continue; // popups are parsed by Annotation's window() getter
+            case Annot::typeUnknown:
+                continue; // special case for ignoring unknown annotations
+            case Annot::typeWidget:
+                continue; // handled as forms or some other way
+            default:
+            {
+#define CASE_FOR_TYPE( thetype ) \
+                    case Annot::type ## thetype: \
+                        error(errUnimplemented, -1, "Annotation " #thetype " not supported"); \
+                        break;
+                switch ( subType )
+                {
+                    CASE_FOR_TYPE( PrinterMark )
+                    CASE_FOR_TYPE( TrapNet )
+                    CASE_FOR_TYPE( Watermark )
+                    CASE_FOR_TYPE( 3D )
+                    default: error(errUnimplemented, -1, "Annotation %u not supported", subType);
+                }
+                continue;
+#undef CASE_FOR_TYPE
+            }
+        }
+
+        annotation->d_ptr->tieToNativeAnnot(ann, pdfPage, doc);
+        res.append(annotation);
+    }
+
+    return res;
+}
+
+Ref AnnotationPrivate::pdfObjectReference() const
+{
+    if (pdfAnnot == 0)
+    {
+        const Ref invalid_ref = { -1, -1 };
+        return invalid_ref;
+    }
+
+    return pdfAnnot->getRef();
+}
+
+void AnnotationPrivate::addAnnotationToPage(::Page *pdfPage, DocumentData *doc, const Annotation * ann)
+{
+    if (ann->d_ptr->pdfAnnot != 0)
+    {
+        error(errIO, -1, "Annotation is already tied");
+        return;
+    }
+
+    // Unimplemented annotations can't be created by the user because their ctor
+    // is private. Therefore, createNativeAnnot will never return 0
+    Annot *nativeAnnot = ann->d_ptr->createNativeAnnot(pdfPage, doc);
+    Q_ASSERT(nativeAnnot);
+    pdfPage->addAnnot(nativeAnnot);
+}
+
+void AnnotationPrivate::removeAnnotationFromPage(::Page *pdfPage, const Annotation * ann)
+{
+    if (ann->d_ptr->pdfAnnot == 0)
+    {
+        error(errIO, -1, "Annotation is not tied");
+        return;
+    }
+
+    if (ann->d_ptr->pdfPage != pdfPage)
+    {
+        error(errIO, -1, "Annotation doesn't belong to the specified page");
+        return;
+    }
+
+    // Remove popup window
+    AnnotMarkup *markupann = dynamic_cast<AnnotMarkup*>(ann->d_ptr->pdfAnnot);
+    if (markupann && markupann->getPopup())
+        pdfPage->removeAnnot(markupann->getPopup());
+
+    // Remove appearance streams (if any)
+    ann->d_ptr->pdfAnnot->invalidateAppearance();
+
+    // Remove annotation
+    pdfPage->removeAnnot(ann->d_ptr->pdfAnnot);
+
+    // Destroy object
+    delete ann;
+}
+
+class Annotation::Style::Private : public QSharedData
+{
+  public:
+    Private()
+        : opacity( 1.0 ), width( 1.0 ), lineStyle( Solid ), xCorners( 0.0 ),
+        yCorners( 0.0 ), lineEffect( NoEffect ), effectIntensity( 1.0 )
+        {
+            dashArray.resize(1);
+            dashArray[0] = 3;
+        }
+
+    QColor color;
+    double opacity;
+    double width;
+    Annotation::LineStyle lineStyle;
+    double xCorners;
+    double yCorners;
+    QVector<double> dashArray;
+    Annotation::LineEffect lineEffect;
+    double effectIntensity;
+};
+
+Annotation::Style::Style()
+    : d ( new Private )
+{
+}
+
+Annotation::Style::Style( const Style &other )
+    : d( other.d )
+{
+}
+
+Annotation::Style& Annotation::Style::operator=( const Style &other )
+{
+    if ( this != &other )
+        d = other.d;
+
+    return *this;
+}
+
+Annotation::Style::~Style()
+{
+}
+
+QColor Annotation::Style::color() const
+{
+    return d->color;
+}
+
+void Annotation::Style::setColor(const QColor &color)
+{
+    d->color = color;
+}
+
+double Annotation::Style::opacity() const
+{
+    return d->opacity;
+}
+
+void Annotation::Style::setOpacity(double opacity)
+{
+    d->opacity = opacity;
+}
+
+double Annotation::Style::width() const
+{
+    return d->width;
+}
+
+void Annotation::Style::setWidth(double width)
+{
+    d->width = width;
+}
+
+Annotation::LineStyle Annotation::Style::lineStyle() const
+{
+    return d->lineStyle;
+}
+
+void Annotation::Style::setLineStyle(Annotation::LineStyle style)
+{
+    d->lineStyle = style;
+}
+
+double Annotation::Style::xCorners() const
+{
+    return d->xCorners;
+}
+
+void Annotation::Style::setXCorners(double radius)
+{
+    d->xCorners = radius;
+}
+
+double Annotation::Style::yCorners() const
+{
+    return d->yCorners;
+}
+
+void Annotation::Style::setYCorners(double radius)
+{
+    d->yCorners = radius;
+}
+
+const QVector<double>& Annotation::Style::dashArray() const
+{
+    return d->dashArray;
+}
+
+void Annotation::Style::setDashArray(const QVector<double> &array)
+{
+    d->dashArray = array;
+}
+
+Annotation::LineEffect Annotation::Style::lineEffect() const
+{
+    return d->lineEffect;
+}
+
+void Annotation::Style::setLineEffect(Annotation::LineEffect effect)
+{
+    d->lineEffect = effect;
+}
+
+double Annotation::Style::effectIntensity() const
+{
+    return d->effectIntensity;
+}
+
+void Annotation::Style::setEffectIntensity(double intens)
+{
+    d->effectIntensity = intens;
+}
+
+class Annotation::Popup::Private : public QSharedData
+{
+  public:
+    Private()
+        : flags( -1 ) {}
+
+    int flags;
+    QRectF geometry;
+    QString title;
+    QString summary;
+    QString text;
+};
+
+Annotation::Popup::Popup()
+    : d ( new Private )
+{
+}
+
+Annotation::Popup::Popup( const Popup &other )
+    : d( other.d )
+{
+}
+
+Annotation::Popup& Annotation::Popup::operator=( const Popup &other )
+{
+    if ( this != &other )
+        d = other.d;
+
+    return *this;
+}
+
+Annotation::Popup::~Popup()
+{
+}
+
+int Annotation::Popup::flags() const
+{
+    return d->flags;
+}
+
+void Annotation::Popup::setFlags( int flags )
+{
+    d->flags = flags;
+}
+
+QRectF Annotation::Popup::geometry() const
+{
+    return d->geometry;
+}
+
+void Annotation::Popup::setGeometry( const QRectF &geom )
+{
+    d->geometry = geom;
+}
+
+QString Annotation::Popup::title() const
+{
+    return d->title;
+}
+
+void Annotation::Popup::setTitle( const QString &title )
+{
+    d->title = title;
+}
+
+QString Annotation::Popup::summary() const
+{
+    return d->summary;
+}
+
+void Annotation::Popup::setSummary( const QString &summary )
+{
+    d->summary = summary;
+}
+
+QString Annotation::Popup::text() const
+{
+    return d->text;
+}
+
+void Annotation::Popup::setText( const QString &text )
+{
+    d->text = text;
+}
+
+Annotation::Annotation( AnnotationPrivate &dd )
+    : d_ptr( &dd )
+{
+    window.width = window.height = 0;
+}
+
+Annotation::~Annotation()
+{
+}
+
+Annotation::Annotation( AnnotationPrivate &dd, const QDomNode &annNode )
+    : d_ptr( &dd )
+{
+    Q_D( Annotation );
+
+    window.width = window.height = 0;
+
+    // get the [base] element of the annotation node
+    QDomElement e = AnnotationUtils::findChildElement( annNode, "base" );
+    if ( e.isNull() )
+        return;
+
+    Style s;
+    Popup w;
+
+    // parse -contents- attributes
+    if ( e.hasAttribute( "author" ) )
+        setAuthor(e.attribute( "author" ));
+    if ( e.hasAttribute( "contents" ) )
+        setContents(e.attribute( "contents" ));
+    if ( e.hasAttribute( "uniqueName" ) )
+        setUniqueName(e.attribute( "uniqueName" ));
+    if ( e.hasAttribute( "modifyDate" ) )
+        setModificationDate(QDateTime::fromString( e.attribute( "modifyDate" ) ));
+    if ( e.hasAttribute( "creationDate" ) )
+        setCreationDate(QDateTime::fromString( e.attribute( "creationDate" ) ));
+
+    // parse -other- attributes
+    if ( e.hasAttribute( "flags" ) )
+        setFlags(e.attribute( "flags" ).toInt());
+    if ( e.hasAttribute( "color" ) )
+        s.setColor(QColor( e.attribute( "color" ) ));
+    if ( e.hasAttribute( "opacity" ) )
+        s.setOpacity(e.attribute( "opacity" ).toDouble());
+
+    // parse -the-subnodes- (describing Style, Window, Revision(s) structures)
+    // Note: all subnodes if present must be 'attributes complete'
+    QDomNode eSubNode = e.firstChild();
+    while ( eSubNode.isElement() )
+    {
+        QDomElement ee = eSubNode.toElement();
+        eSubNode = eSubNode.nextSibling();
+
+        // parse boundary
+        if ( ee.tagName() == "boundary" )
+        {
+            QRectF brect;
+            brect.setLeft(ee.attribute( "l" ).toDouble());
+            brect.setTop(ee.attribute( "t" ).toDouble());
+            brect.setRight(ee.attribute( "r" ).toDouble());
+            brect.setBottom(ee.attribute( "b" ).toDouble());
+            setBoundary(brect);
+        }
+        // parse penStyle if not default
+        else if ( ee.tagName() == "penStyle" )
+        {
+            s.setWidth(ee.attribute( "width" ).toDouble());
+            s.setLineStyle((LineStyle)ee.attribute( "style" ).toInt());
+            s.setXCorners(ee.attribute( "xcr" ).toDouble());
+            s.setYCorners(ee.attribute( "ycr" ).toDouble());
+
+            // Try to parse dash array (new format)
+            QVector<double> dashArray;
+
+            QDomNode eeSubNode = ee.firstChild();
+            while ( eeSubNode.isElement() )
+            {
+                QDomElement eee = eeSubNode.toElement();
+                eeSubNode = eeSubNode.nextSibling();
+
+                if ( eee.tagName() != "dashsegm" )
+                    continue;
+
+                dashArray.append(eee.attribute( "len" ).toDouble());
+            }
+
+            // If no segments were found use marks/spaces (old format)
+            if ( dashArray.size() == 0 )
+            {
+                dashArray.append(ee.attribute( "marks" ).toDouble());
+                dashArray.append(ee.attribute( "spaces" ).toDouble());
+            }
+
+            s.setDashArray(dashArray);
+        }
+        // parse effectStyle if not default
+        else if ( ee.tagName() == "penEffect" )
+        {
+            s.setLineEffect((LineEffect)ee.attribute( "effect" ).toInt());
+            s.setEffectIntensity(ee.attribute( "intensity" ).toDouble());
+        }
+        // parse window if present
+        else if ( ee.tagName() == "window" )
+        {
+            QRectF geom;
+            geom.setX(ee.attribute( "top" ).toDouble());
+            geom.setY(ee.attribute( "left" ).toDouble());
+
+            if (ee.hasAttribute("widthDouble"))
+                geom.setWidth(ee.attribute( "widthDouble" ).toDouble());
+            else
+                geom.setWidth(ee.attribute( "width" ).toDouble());
+
+            if (ee.hasAttribute("widthDouble"))
+                geom.setHeight(ee.attribute( "heightDouble" ).toDouble());
+            else
+                geom.setHeight(ee.attribute( "height" ).toDouble());
+
+            w.setGeometry(geom);
+
+            w.setFlags(ee.attribute( "flags" ).toInt());
+            w.setTitle(ee.attribute( "title" ));
+            w.setSummary(ee.attribute( "summary" ));
+            // parse window subnodes
+            QDomNode winNode = ee.firstChild();
+            for ( ; winNode.isElement(); winNode = winNode.nextSibling() )
+            {
+                QDomElement winElement = winNode.toElement();
+                if ( winElement.tagName() == "text" )
+                    w.setText(winElement.firstChild().toCDATASection().data());
+            }
+        }
+    }
+
+    setStyle(s);  // assign parsed style
+    setPopup(w); // assign parsed window
+
+    // get the [revisions] element of the annotation node
+    QDomNode revNode = annNode.firstChild();
+    for ( ; revNode.isElement(); revNode = revNode.nextSibling() )
+    {
+        QDomElement revElement = revNode.toElement();
+        if ( revElement.tagName() != "revision" )
+            continue;
+
+        Annotation *reply = AnnotationUtils::createAnnotation( revElement );
+
+        if (reply) // if annotation is valid, add as a revision of this annotation
+        {
+            RevScope scope = (RevScope)revElement.attribute( "revScope" ).toInt();
+            RevType type = (RevType)revElement.attribute( "revType" ).toInt();
+            d->addRevision(reply, scope, type);
+            delete reply;
+        }
+    }
+}
+
+void Annotation::storeBaseAnnotationProperties( QDomNode & annNode, QDomDocument & document ) const
+{
+    // create [base] element of the annotation node
+    QDomElement e = document.createElement( "base" );
+    annNode.appendChild( e );
+
+    const Style s = style();
+    const Popup w = popup();
+
+    // store -contents- attributes
+    if ( !author().isEmpty() )
+        e.setAttribute( "author", author() );
+    if ( !contents().isEmpty() )
+        e.setAttribute( "contents", contents() );
+    if ( !uniqueName().isEmpty() )
+        e.setAttribute( "uniqueName", uniqueName() );
+    if ( modificationDate().isValid() )
+        e.setAttribute( "modifyDate", modificationDate().toString() );
+    if ( creationDate().isValid() )
+        e.setAttribute( "creationDate", creationDate().toString() );
+
+    // store -other- attributes
+    if ( flags() )
+        e.setAttribute( "flags", flags() );
+    if ( s.color().isValid() )
+        e.setAttribute( "color", s.color().name() );
+    if ( s.opacity() != 1.0 )
+        e.setAttribute( "opacity", QString::number( s.opacity() ) );
+
+    // Sub-Node-1 - boundary
+    const QRectF brect = boundary();
+    QDomElement bE = document.createElement( "boundary" );
+    e.appendChild( bE );
+    bE.setAttribute( "l", QString::number( (double)brect.left() ) );
+    bE.setAttribute( "t", QString::number( (double)brect.top() ) );
+    bE.setAttribute( "r", QString::number( (double)brect.right() ) );
+    bE.setAttribute( "b", QString::number( (double)brect.bottom() ) );
+
+    // Sub-Node-2 - penStyle
+    const QVector<double> dashArray = s.dashArray();
+    if ( s.width() != 1 || s.lineStyle() != Solid || s.xCorners() != 0 ||
+         s.yCorners() != 0.0 || dashArray.size() != 1 || dashArray[0] != 3 )
+    {
+        QDomElement psE = document.createElement( "penStyle" );
+        e.appendChild( psE );
+        psE.setAttribute( "width", QString::number( s.width() ) );
+        psE.setAttribute( "style", (int)s.lineStyle() );
+        psE.setAttribute( "xcr", QString::number( s.xCorners() ) );
+        psE.setAttribute( "ycr", QString::number( s.yCorners() ) );
+
+        int marks = 3, spaces = 0; // Do not break code relying on marks/spaces
+        if (dashArray.size() != 0)
+            marks = (int)dashArray[0];
+        if (dashArray.size() > 1)
+            spaces = (int)dashArray[1];
+
+        psE.setAttribute( "marks", marks );
+        psE.setAttribute( "spaces", spaces );
+
+        foreach (double segm, dashArray)
+        {
+            QDomElement pattE = document.createElement( "dashsegm" );
+            pattE.setAttribute( "len", QString::number( segm ) );
+            psE.appendChild(pattE);
+        }
+    }
+
+    // Sub-Node-3 - penEffect
+    if ( s.lineEffect() != NoEffect || s.effectIntensity() != 1.0 )
+    {
+        QDomElement peE = document.createElement( "penEffect" );
+        e.appendChild( peE );
+        peE.setAttribute( "effect", (int)s.lineEffect() );
+        peE.setAttribute( "intensity", QString::number( s.effectIntensity() ) );
+    }
+
+    // Sub-Node-4 - window
+    if ( w.flags() != -1 || !w.title().isEmpty() || !w.summary().isEmpty() ||
+         !w.text().isEmpty() )
+    {
+        QDomElement wE = document.createElement( "window" );
+        const QRectF geom = w.geometry();
+        e.appendChild( wE );
+        wE.setAttribute( "flags", w.flags() );
+        wE.setAttribute( "top", QString::number( geom.x() ) );
+        wE.setAttribute( "left", QString::number( geom.y() ) );
+        wE.setAttribute( "width", (int)geom.width() );
+        wE.setAttribute( "height", (int)geom.height() );
+        wE.setAttribute( "widthDouble", QString::number( geom.width() ) );
+        wE.setAttribute( "heightDouble", QString::number( geom.height() ) );
+        wE.setAttribute( "title", w.title() );
+        wE.setAttribute( "summary", w.summary() );
+        // store window.text as a subnode, because we need escaped data
+        if ( !w.text().isEmpty() )
+        {
+            QDomElement escapedText = document.createElement( "text" );
+            wE.appendChild( escapedText );
+            QDomCDATASection textCData = document.createCDATASection( w.text() );
+            escapedText.appendChild( textCData );
+        }
+    }
+
+    const QList<Annotation*> revs = revisions();
+
+    // create [revision] element of the annotation node (if any)
+    if ( revs.isEmpty() )
+        return;
+
+    // add all revisions as children of revisions element
+    foreach (const Annotation *rev, revs)
+    {
+        QDomElement r = document.createElement( "revision" );
+        annNode.appendChild( r );
+        // set element attributes
+        r.setAttribute( "revScope", (int)rev->revisionScope() );
+        r.setAttribute( "revType", (int)rev->revisionType() );
+        // use revision as the annotation element, so fill it up
+        AnnotationUtils::storeAnnotation( rev, r, document );
+        delete rev;
+    }
+}
+
+QString Annotation::author() const
+{
+    Q_D( const Annotation );
+
+    if (!d->pdfAnnot)
+        return d->author;
+
+    const AnnotMarkup *markupann = dynamic_cast<const AnnotMarkup*>(d->pdfAnnot);
+    return markupann ? UnicodeParsedString( markupann->getLabel() ) : QString();
+}
+
+void Annotation::setAuthor( const QString &author )
+{
+    Q_D( Annotation );
+
+    if (!d->pdfAnnot)
+    {
+        d->author = author;
+        return;
+    }
+
+    AnnotMarkup *markupann = dynamic_cast<AnnotMarkup*>(d->pdfAnnot);
+    if (markupann)
+    {
+        GooString *s = QStringToUnicodeGooString(author);
+        markupann->setLabel(s);
+        delete s;
+    }
+}
+
+QString Annotation::contents() const
+{
+    Q_D( const Annotation );
+
+    if (!d->pdfAnnot)
+        return d->contents;
+
+    return UnicodeParsedString( d->pdfAnnot->getContents() );
+}
+
+void Annotation::setContents( const QString &contents )
+{
+    Q_D( Annotation );
+
+    if (!d->pdfAnnot)
+    {
+        d->contents = contents;
+        return;
+    }
+
+    GooString *s = QStringToUnicodeGooString(contents);
+    d->pdfAnnot->setContents(s);
+    delete s;
+    d->pdfAnnot->invalidateAppearance();
+}
+
+QString Annotation::uniqueName() const
+{
+    Q_D( const Annotation );
+
+    if (!d->pdfAnnot)
+        return d->uniqueName;
+
+    return UnicodeParsedString( d->pdfAnnot->getName() );
+}
+
+void Annotation::setUniqueName( const QString &uniqueName )
+{
+    Q_D( Annotation );
+
+    if (!d->pdfAnnot)
+    {
+        d->uniqueName = uniqueName;
+        return;
+    }
+
+    QByteArray ascii = uniqueName.toAscii();
+    GooString s(ascii.constData());
+    d->pdfAnnot->setName(&s);
+}
+
+QDateTime Annotation::modificationDate() const
+{
+    Q_D( const Annotation );
+
+    if (!d->pdfAnnot)
+        return d->modDate;
+
+    if ( d->pdfAnnot->getModified() )
+        return convertDate( d->pdfAnnot->getModified()->getCString() );
+    else
+        return QDateTime();
+}
+
+void Annotation::setModificationDate( const QDateTime &date )
+{
+    Q_D( Annotation );
+
+    if (!d->pdfAnnot)
+    {
+        d->modDate = date;
+        return;
+    }
+
+#if 0 // TODO: Conversion routine is broken
+    if (d->pdfAnnot)
+    {
+        time_t t = date.toTime_t();
+        GooString *s = timeToDateString(&t);
+        d->pdfAnnot->setModified(s);
+        delete s;
+    }
+#endif
+}
+
+QDateTime Annotation::creationDate() const
+{
+    Q_D( const Annotation );
+
+    if (!d->pdfAnnot)
+        return d->creationDate;
+
+    const AnnotMarkup *markupann = dynamic_cast<const AnnotMarkup*>(d->pdfAnnot);
+
+    if (markupann && markupann->getDate())
+        return convertDate( markupann->getDate()->getCString() );
+
+    return modificationDate();
+}
+
+void Annotation::setCreationDate( const QDateTime &date )
+{
+    Q_D( Annotation );
+
+    if (!d->pdfAnnot)
+    {
+        d->creationDate = date;
+        return;
+    }
+
+#if 0 // TODO: Conversion routine is broken
+    AnnotMarkup *markupann = dynamic_cast<AnnotMarkup*>(d->pdfAnnot);
+    if (markupann)
+    {
+        time_t t = date.toTime_t();
+        GooString *s = timeToDateString(&t);
+        markupann->setDate(s);
+        delete s;
+    }
+#endif
+}
+
+static int fromPdfFlags(int flags)
+{
+    int qtflags = 0;
+
+    if ( flags & Annot::flagHidden )
+        qtflags |= Annotation::Hidden;
+    if ( flags & Annot::flagNoZoom )
+        qtflags |= Annotation::FixedSize;
+    if ( flags & Annot::flagNoRotate )
+        qtflags |= Annotation::FixedRotation;
+    if ( !( flags & Annot::flagPrint ) )
+        qtflags |= Annotation::DenyPrint;
+    if ( flags & Annot::flagReadOnly )
+        qtflags |= (Annotation::DenyWrite | Annotation::DenyDelete);
+    if ( flags & Annot::flagLocked )
+        qtflags |= Annotation::DenyDelete;
+    if ( flags & Annot::flagToggleNoView )
+        qtflags |= Annotation::ToggleHidingOnMouse;
+
+    return qtflags;
+}
+
+static int toPdfFlags(int qtflags)
+{
+    int flags = 0;
+
+    if ( qtflags & Annotation::Hidden )
+        flags |= Annot::flagHidden;
+    if ( qtflags & Annotation::FixedSize )
+        flags |= Annot::flagNoZoom;
+    if ( qtflags & Annotation::FixedRotation )
+        flags |= Annot::flagNoRotate;
+    if ( !( qtflags & Annotation::DenyPrint ) )
+        flags |= Annot::flagPrint;
+    if ( qtflags & Annotation::DenyWrite )
+        flags |= Annot::flagReadOnly;
+    if ( qtflags & Annotation::DenyDelete )
+        flags |= Annot::flagLocked;
+    if ( qtflags & Annotation::ToggleHidingOnMouse )
+        flags |= Annot::flagToggleNoView;
+
+    return flags;
+}
+
+int Annotation::flags() const
+{
+    Q_D( const Annotation );
+
+    if (!d->pdfAnnot)
+        return d->flags;
+
+    return fromPdfFlags( d->pdfAnnot->getFlags() );
+}
+
+void Annotation::setFlags( int flags )
+{
+    Q_D( Annotation );
+
+    if (!d->pdfAnnot)
+    {
+        d->flags = flags;
+        return;
+    }
+
+    d->pdfAnnot->setFlags(toPdfFlags( flags ));
+    d->pdfAnnot->invalidateAppearance();
+}
+
+QRectF Annotation::boundary() const
+{
+    Q_D( const Annotation );
+
+    if (!d->pdfAnnot)
+        return d->boundary;
+
+    const PDFRectangle * rect = d->pdfAnnot->getRect();
+    return d->fromPdfRectangle( *rect );
+}
+
+void Annotation::setBoundary( const QRectF &boundary )
+{
+    Q_D( Annotation );
+
+    if (!d->pdfAnnot)
+    {
+        d->boundary = boundary;
+        return;
+    }
+
+    PDFRectangle rect = d->toPdfRectangle(boundary);
+    d->pdfAnnot->setRect(&rect);
+    d->pdfAnnot->invalidateAppearance();
+}
+
+Annotation::Style Annotation::style() const
+{
+    Q_D( const Annotation );
+
+    if (!d->pdfAnnot)
+        return d->style;
+
+    Style s;
+    s.setColor(convertAnnotColor( d->pdfAnnot->getColor() ));
+
+    const AnnotMarkup *markupann = dynamic_cast<const AnnotMarkup*>(d->pdfAnnot);
+    if (markupann)
+        s.setOpacity( markupann->getOpacity() );
+
+    const AnnotBorder *border = d->pdfAnnot->getBorder();
+    if (border)
+    {
+        if ( border->getType() == AnnotBorder::typeArray )
+        {
+            const AnnotBorderArray *border_array = static_cast<const AnnotBorderArray*>(border);
+            s.setXCorners( border_array->getHorizontalCorner() );
+            s.setYCorners( border_array->getVerticalCorner() );
+        }
+
+        s.setWidth( border->getWidth() );
+        s.setLineStyle((Annotation::LineStyle)( 1 << border->getStyle() ));
+
+        const int dashArrLen = border->getDashLength();
+        const double* dashArrData = border->getDash();
+        QVector<double> dashArrVect( dashArrLen );
+        for (int i = 0; i < dashArrLen; ++i)
+            dashArrVect[i] = dashArrData[i];
+        s.setDashArray(dashArrVect);
+    }
+
+    AnnotBorderEffect *border_effect;
+    switch (d->pdfAnnot->getType())
+    {
+        case Annot::typeFreeText:
+            border_effect = static_cast<AnnotFreeText*>(d->pdfAnnot)->getBorderEffect();
+            break;
+        case Annot::typeSquare:
+        case Annot::typeCircle:
+            border_effect = static_cast<AnnotGeometry*>(d->pdfAnnot)->getBorderEffect();
+            break;
+        default:
+            border_effect = 0;
+    }
+    if (border_effect)
+    {
+        s.setLineEffect( (Annotation::LineEffect)border_effect->getEffectType() );
+        s.setEffectIntensity( border_effect->getIntensity() );
+    }
+
+    return s;
+}
+
+void Annotation::setStyle( const Annotation::Style& style )
+{
+    Q_D( Annotation );
+
+    if (!d->pdfAnnot)
+    {
+        d->style = style;
+        return;
+    }
+
+    d->pdfAnnot->setColor(convertQColor( style.color() ));
+
+    AnnotMarkup *markupann = dynamic_cast<AnnotMarkup*>(d->pdfAnnot);
+    if (markupann)
+        markupann->setOpacity( style.opacity() );
+
+    AnnotBorderArray * border = new AnnotBorderArray();
+    border->setWidth( style.width() );
+    border->setHorizontalCorner( style.xCorners() );
+    border->setVerticalCorner( style.yCorners() );
+    d->pdfAnnot->setBorder(border);
+    d->pdfAnnot->invalidateAppearance();
+}
+
+Annotation::Popup Annotation::popup() const
+{
+    Q_D( const Annotation );
+
+    if (!d->pdfAnnot)
+        return d->popup;
+
+    Popup w;
+    AnnotPopup *popup = 0;
+    int flags = -1; // Not initialized
+
+    const AnnotMarkup *markupann = dynamic_cast<const AnnotMarkup*>(d->pdfAnnot);
+    if (markupann)
+    {
+        popup = markupann->getPopup();
+        w.setSummary(UnicodeParsedString( markupann->getSubject() ));
+    }
+
+    if (popup)
+    {
+        flags = fromPdfFlags( popup->getFlags() ) & ( Annotation::Hidden |
+                Annotation::FixedSize | Annotation::FixedRotation );
+
+        if (!popup->getOpen())
+            flags |= Annotation::Hidden;
+
+        const PDFRectangle * rect = popup->getRect();
+        w.setGeometry( d->fromPdfRectangle( *rect ) );
+    }
+
+    if (d->pdfAnnot->getType() == Annot::typeText)
+    {
+        const AnnotText * textann = static_cast<const AnnotText*>(d->pdfAnnot);
+
+        // Text annotations default to same rect as annotation
+        if (flags == -1)
+        {
+            flags = 0;
+            w.setGeometry( boundary() );
+        }
+
+        // If text is not 'opened', force window hiding. if the window
+        // was parsed from popup, the flag should already be set
+        if ( !textann->getOpen() && flags != -1 )
+            flags |= Annotation::Hidden;
+    }
+
+    w.setFlags(flags);
+
+    return w;
+}
+
+void Annotation::setPopup( const Annotation::Popup& popup )
+{
+    Q_D( Annotation );
+
+    if (!d->pdfAnnot)
+    {
+        d->popup = popup;
+        return;
+    }
+
+#if 0 /* TODO: Remove old popup and add AnnotPopup to page */
+    AnnotMarkup *markupann = dynamic_cast<AnnotMarkup*>(d->pdfAnnot);
+    if (!markupann)
+        return;
+
+    // Create a new AnnotPopup and assign it to pdfAnnot
+    PDFRectangle rect = d->toPdfRectangle( popup.geometry() );
+    AnnotPopup * p = new AnnotPopup( d->pdfPage->getDoc(), &rect );
+    p->setOpen( !(popup.flags() & Annotation::Hidden) );
+    if (!popup.summary().isEmpty())
+    {
+        GooString *s = QStringToUnicodeGooString(popup.summary());
+        markupann->setLabel(s);
+        delete s;
+    }
+    markupann->setPopup(p);
+#endif
+}
+
+Annotation::RevScope Annotation::revisionScope() const
+{
+    Q_D( const Annotation );
+
+    if (!d->pdfAnnot)
+        return d->revisionScope;
+
+    const AnnotMarkup *markupann = dynamic_cast<const AnnotMarkup*>(d->pdfAnnot);
+
+    if (markupann && markupann->getInReplyToID() != 0)
+    {
+        switch (markupann->getReplyTo())
+        {
+            case AnnotMarkup::replyTypeR:
+                return Annotation::Reply;
+            case AnnotMarkup::replyTypeGroup:
+                return Annotation::Group;
+        }
+    }
+
+    return Annotation::Root; // It's not a revision
+}
+
+Annotation::RevType Annotation::revisionType() const
+{
+    Q_D( const Annotation );
+
+    if (!d->pdfAnnot)
+        return d->revisionType;
+
+    const AnnotText *textann = dynamic_cast<const AnnotText*>(d->pdfAnnot);
+
+    if (textann && textann->getInReplyToID() != 0)
+    {
+        switch (textann->getState())
+        {
+            case AnnotText::stateMarked:
+                return Annotation::Marked;
+            case AnnotText::stateUnmarked:
+                return Annotation::Unmarked;
+            case AnnotText::stateAccepted:
+                return Annotation::Accepted;
+            case AnnotText::stateRejected:
+                return Annotation::Rejected;
+            case AnnotText::stateCancelled:
+                return Annotation::Cancelled;
+            case AnnotText::stateCompleted:
+                return Annotation::Completed;
+            default:
+                break;
+        }
+    }
+
+    return Annotation::None;
+}
+
+QList<Annotation*> Annotation::revisions() const
+{
+    Q_D( const Annotation );
+
+    if (!d->pdfAnnot)
+    {
+        /* Return aliases, whose ownership goes to the caller */
+        QList<Annotation*> res;
+        foreach (Annotation *rev, d->revisions)
+            res.append( rev->d_ptr->makeAlias() );
+        return res;
+    }
+
+    /* If the annotation doesn't live in a object on its own (eg bug51361), it
+     * has no ref, therefore it can't have revisions */
+    if ( !d->pdfAnnot->getHasRef() )
+        return QList<Annotation*>();
+
+    return AnnotationPrivate::findAnnotations( d->pdfPage, d->parentDoc, d->pdfAnnot->getId() );
+}
+
+//END Annotation implementation
+
+
+/** TextAnnotation [Annotation] */
+class TextAnnotationPrivate : public AnnotationPrivate
+{
+    public:
+        TextAnnotationPrivate();
+        Annotation * makeAlias();
+        Annot* createNativeAnnot(::Page *destPage, DocumentData *doc);
+
+        // data fields
+        TextAnnotation::TextType textType;
+        QString textIcon;
+        QFont textFont;
+        int inplaceAlign; // 0:left, 1:center, 2:right
+        QVector<QPointF> inplaceCallout;
+        TextAnnotation::InplaceIntent inplaceIntent;
+
+        // Helper
+        static GooString * toAppearanceString(const QFont &font);
+};
+
+TextAnnotationPrivate::TextAnnotationPrivate()
+    : AnnotationPrivate(), textType( TextAnnotation::Linked ),
+    textIcon( "Note" ), inplaceAlign( 0 ),
+    inplaceIntent( TextAnnotation::Unknown )
+{
+}
+
+Annotation * TextAnnotationPrivate::makeAlias()
+{
+    return new TextAnnotation(*this);
+}
+
+GooString * TextAnnotationPrivate::toAppearanceString(const QFont &font)
+{
+    GooString * s = GooString::format("/Invalid_font {0:d} Tf", font.pointSize());
+    // TODO: Font family, style (bold, italic, ...) and pointSize as float
+    return s;
+}
+
+Annot* TextAnnotationPrivate::createNativeAnnot(::Page *destPage, DocumentData *doc)
+{
+    // Setters are defined in the public class
+    TextAnnotation *q = static_cast<TextAnnotation*>( makeAlias() );
+
+    // Set page and contents
+    pdfPage = destPage;
+    parentDoc = doc;
+
+    // Set pdfAnnot
+    PDFRectangle rect = toPdfRectangle(boundary);
+    if (textType == TextAnnotation::Linked)
+    {
+        pdfAnnot = new AnnotText(destPage->getDoc(), &rect);
+    }
+    else
+    {
+        GooString * da = toAppearanceString(textFont);
+        pdfAnnot = new AnnotFreeText(destPage->getDoc(), &rect, da);
+        delete da;
+    }
+
+    // Set properties
+    flushBaseAnnotationProperties();
+    q->setTextIcon(textIcon);
+    q->setInplaceAlign(inplaceAlign);
+    q->setCalloutPoints(inplaceCallout);
+    q->setInplaceIntent(inplaceIntent);
+
+    delete q;
+
+    return pdfAnnot;
+}
+
+TextAnnotation::TextAnnotation( TextAnnotation::TextType type )
+    : Annotation( *new TextAnnotationPrivate() )
+{
+    setTextType( type );
+}
+
+TextAnnotation::TextAnnotation(TextAnnotationPrivate &dd)
+    : Annotation( dd )
+{}
+
+TextAnnotation::TextAnnotation( const QDomNode & node )
+    : Annotation( *new TextAnnotationPrivate, node )
+{
+    // loop through the whole children looking for a 'text' element
+    QDomNode subNode = node.firstChild();
+    while( subNode.isElement() )
+    {
+        QDomElement e = subNode.toElement();
+        subNode = subNode.nextSibling();
+        if ( e.tagName() != "text" )
+            continue;
+
+        // parse the attributes
+        if ( e.hasAttribute( "type" ) )
+            setTextType((TextAnnotation::TextType)e.attribute( "type" ).toInt());
+        if ( e.hasAttribute( "icon" ) )
+            setTextIcon(e.attribute( "icon" ));
+        if ( e.hasAttribute( "font" ) )
+        {
+            QFont font;
+            font.fromString( e.attribute( "font" ) );
+            setTextFont(font);
+        }
+        if ( e.hasAttribute( "align" ) )
+            setInplaceAlign(e.attribute( "align" ).toInt());
+        if ( e.hasAttribute( "intent" ) )
+            setInplaceIntent((TextAnnotation::InplaceIntent)e.attribute( "intent" ).toInt());
+
+        // parse the subnodes
+        QDomNode eSubNode = e.firstChild();
+        while ( eSubNode.isElement() )
+        {
+            QDomElement ee = eSubNode.toElement();
+            eSubNode = eSubNode.nextSibling();
+
+            if ( ee.tagName() == "escapedText" )
+            {
+                setInplaceText(ee.firstChild().toCDATASection().data());
+            }
+            else if ( ee.tagName() == "callout" )
+            {
+                QVector<QPointF> points(3);
+                points[0] = QPointF(ee.attribute( "ax" ).toDouble(),
+                                    ee.attribute( "ay" ).toDouble());
+                points[1] = QPointF(ee.attribute( "bx" ).toDouble(),
+                                    ee.attribute( "by" ).toDouble());
+                points[2] = QPointF(ee.attribute( "cx" ).toDouble(),
+                                    ee.attribute( "cy" ).toDouble());
+                setCalloutPoints(points);
+            }
+        }
+
+        // loading complete
+        break;
+    }
+}
+
+TextAnnotation::~TextAnnotation()
+{
+}
+
+void TextAnnotation::store( QDomNode & node, QDomDocument & document ) const
+{
+    // store base annotation properties
+    storeBaseAnnotationProperties( node, document );
+
+    // create [text] element
+    QDomElement textElement = document.createElement( "text" );
+    node.appendChild( textElement );
+
+    // store the optional attributes
+    if ( textType() != Linked )
+        textElement.setAttribute( "type", (int)textType() );
+    if ( textIcon() != "Note" )
+        textElement.setAttribute( "icon", textIcon() );
+    if ( inplaceAlign() )
+        textElement.setAttribute( "align", inplaceAlign() );
+    if ( inplaceIntent() != Unknown )
+        textElement.setAttribute( "intent", (int)inplaceIntent() );
+
+    textElement.setAttribute( "font", textFont().toString() );
+
+    // Sub-Node-1 - escapedText
+    if ( !inplaceText().isEmpty() )
+    {
+        QDomElement escapedText = document.createElement( "escapedText" );
+        textElement.appendChild( escapedText );
+        QDomCDATASection textCData = document.createCDATASection( inplaceText() );
+        escapedText.appendChild( textCData );
+    }
+
+    // Sub-Node-2 - callout
+    if ( calloutPoint(0).x() != 0.0 )
+    {
+        QDomElement calloutElement = document.createElement( "callout" );
+        textElement.appendChild( calloutElement );
+        calloutElement.setAttribute( "ax", QString::number( calloutPoint(0).x() ) );
+        calloutElement.setAttribute( "ay", QString::number( calloutPoint(0).y() ) );
+        calloutElement.setAttribute( "bx", QString::number( calloutPoint(1).x() ) );
+        calloutElement.setAttribute( "by", QString::number( calloutPoint(1).y() ) );
+        calloutElement.setAttribute( "cx", QString::number( calloutPoint(2).x() ) );
+        calloutElement.setAttribute( "cy", QString::number( calloutPoint(2).y() ) );
+    }
+}
+
+Annotation::SubType TextAnnotation::subType() const
+{
+    return AText;
+}
+
+TextAnnotation::TextType TextAnnotation::textType() const
+{
+    Q_D( const TextAnnotation );
+
+    if (!d->pdfAnnot)
+        return d->textType;
+
+    return d->pdfAnnot->getType() == Annot::typeText ?
+        TextAnnotation::Linked : TextAnnotation::InPlace;
+}
+
+void TextAnnotation::setTextType( TextAnnotation::TextType type )
+{
+    Q_D( TextAnnotation );
+
+    if (!d->pdfAnnot)
+    {
+        d->textType = type;
+        return;
+    }
+
+    // Type cannot be changed if annotation is already tied
+}
+
+QString TextAnnotation::textIcon() const
+{
+    Q_D( const TextAnnotation );
+
+    if (!d->pdfAnnot)
+        return d->textIcon;
+
+    if (d->pdfAnnot->getType() == Annot::typeText)
+    {
+        const AnnotText * textann = static_cast<const AnnotText*>(d->pdfAnnot);
+        return QString::fromLatin1( textann->getIcon()->getCString() );
+    }
+
+    return QString();
+}
+
+void TextAnnotation::setTextIcon( const QString &icon )
+{
+    Q_D( TextAnnotation );
+
+    if (!d->pdfAnnot)
+    {
+        d->textIcon = icon;
+        return;
+    }
+
+    if (d->pdfAnnot->getType() == Annot::typeText)
+    {
+        AnnotText * textann = static_cast<AnnotText*>(d->pdfAnnot);
+        QByteArray encoded = icon.toLatin1();
+        GooString s(encoded.constData());
+        textann->setIcon(&s);
+        d->pdfAnnot->invalidateAppearance();
+    }
+}
+
+QFont TextAnnotation::textFont() const
+{
+    Q_D( const TextAnnotation );
+
+    if (!d->pdfAnnot)
+        return d->textFont;
+
+    QFont font;
+
+    if (d->pdfAnnot->getType() == Annot::typeFreeText)
+    {
+        const AnnotFreeText * ftextann = static_cast<const AnnotFreeText*>(d->pdfAnnot);
+        const GooString * da = ftextann->getAppearanceString();
+        if (da)
+        {
+            // At the moment, only font size is parsed
+            QString style = QString::fromLatin1( da->getCString() );
+            QRegExp rx("(\\d+)(\\.\\d*)? Tf");
+            if (rx.indexIn(style) != -1)
+                font.setPointSize( rx.cap(1).toInt() );
+            // TODO: Other properties
+        }
+    }
+
+    return font;
+}
+
+void TextAnnotation::setTextFont( const QFont &font )
+{
+    Q_D( TextAnnotation );
+
+    if (!d->pdfAnnot)
+    {
+        d->textFont = font;
+        return;
+    }
+
+    if (d->pdfAnnot->getType() != Annot::typeFreeText)
+        return;
+
+    AnnotFreeText * ftextann = static_cast<AnnotFreeText*>(d->pdfAnnot);
+    GooString * da = TextAnnotationPrivate::toAppearanceString(font);
+    ftextann->setAppearanceString(da);
+    delete da;
+    d->pdfAnnot->invalidateAppearance();
+}
+
+int TextAnnotation::inplaceAlign() const
+{
+    Q_D( const TextAnnotation );
+
+    if (!d->pdfAnnot)
+        return d->inplaceAlign;
+
+    if (d->pdfAnnot->getType() == Annot::typeFreeText)
+    {
+        const AnnotFreeText * ftextann = static_cast<const AnnotFreeText*>(d->pdfAnnot);
+        return ftextann->getQuadding();
+    }
+
+    return 0;
+}
+
+void TextAnnotation::setInplaceAlign( int align )
+{
+    Q_D( TextAnnotation );
+
+    if (!d->pdfAnnot)
+    {
+        d->inplaceAlign = align;
+        return;
+    }
+
+    if (d->pdfAnnot->getType() == Annot::typeFreeText)
+    {
+        AnnotFreeText * ftextann = static_cast<AnnotFreeText*>(d->pdfAnnot);
+        ftextann->setQuadding((AnnotFreeText::AnnotFreeTextQuadding)align);
+        d->pdfAnnot->invalidateAppearance();
+    }
+}
+
+QString TextAnnotation::inplaceText() const
+{
+    return contents();
+}
+
+void TextAnnotation::setInplaceText( const QString &text )
+{
+    setContents(text);
+}
+
+QPointF TextAnnotation::calloutPoint( int id ) const
+{
+    const QVector<QPointF> points = calloutPoints();
+    if ( id < 0 || id >= points.size() )
+        return QPointF();
+    else
+        return points[id];
+}
+
+QVector<QPointF> TextAnnotation::calloutPoints() const
+{
+    Q_D( const TextAnnotation );
+
+    if (!d->pdfAnnot)
+        return d->inplaceCallout;
+
+    if (d->pdfAnnot->getType() == Annot::typeText)
+        return QVector<QPointF>();
+
+    const AnnotFreeText * ftextann = static_cast<const AnnotFreeText*>(d->pdfAnnot);
+    const AnnotCalloutLine *callout = ftextann->getCalloutLine();
+
+    if (!callout)
+        return QVector<QPointF>();
+
+    double MTX[6];
+    d->fillMTX(MTX);
+
+    const AnnotCalloutMultiLine * callout_v6 = dynamic_cast<const AnnotCalloutMultiLine*>(callout);
+    QVector<QPointF> res(callout_v6 ? 3 : 2);
+    XPDFReader::transform(MTX, callout->getX1(), callout->getY1(), res[0]);
+    XPDFReader::transform(MTX, callout->getX2(), callout->getY2(), res[1]);
+    if (callout_v6)
+        XPDFReader::transform(MTX, callout_v6->getX3(), callout_v6->getY3(), res[2]);
+    return res;
+}
+
+void TextAnnotation::setCalloutPoints( const QVector<QPointF> &points )
+{
+    Q_D( TextAnnotation );
+    if (!d->pdfAnnot)
+    {
+        d->inplaceCallout = points;
+        return;
+    }
+
+    if (d->pdfAnnot->getType() != Annot::typeFreeText)
+        return;
+
+    AnnotFreeText * ftextann = static_cast<AnnotFreeText*>(d->pdfAnnot);
+    const int count = points.size();
+
+    if (count == 0)
+    {
+        ftextann->setCalloutLine(0);
+        d->pdfAnnot->invalidateAppearance();
+        return;
+    }
+
+    if (count != 2 && count != 3)
+    {
+        error(errSyntaxError, -1, "Expected zero, two or three points for callout");
+        return;
+    }
+
+    AnnotCalloutLine *callout;
+    double x1, y1, x2, y2;
+    double MTX[6];
+    d->fillMTX(MTX);
+
+    XPDFReader::invTransform( MTX, points[0], x1, y1 );
+    XPDFReader::invTransform( MTX, points[1], x2, y2 );
+    if (count == 3)
+    {
+        double x3, y3;
+        XPDFReader::invTransform( MTX, points[2], x3, y3 );
+        callout = new AnnotCalloutMultiLine(x1, y1, x2, y2, x3, y3);
+    }
+    else
+    {
+        callout = new AnnotCalloutLine(x1, y1, x2, y2);
+    }
+
+    ftextann->setCalloutLine(callout);
+    delete callout;
+    d->pdfAnnot->invalidateAppearance();
+}
+
+TextAnnotation::InplaceIntent TextAnnotation::inplaceIntent() const
+{
+    Q_D( const TextAnnotation );
+
+    if (!d->pdfAnnot)
+        return d->inplaceIntent;
+
+    if (d->pdfAnnot->getType() == Annot::typeFreeText)
+    {
+        const AnnotFreeText * ftextann = static_cast<const AnnotFreeText*>(d->pdfAnnot);
+        return (TextAnnotation::InplaceIntent)ftextann->getIntent();
+    }
+
+    return TextAnnotation::Unknown;
+}
+
+void TextAnnotation::setInplaceIntent( TextAnnotation::InplaceIntent intent )
+{
+    Q_D( TextAnnotation );
+
+    if (d->pdfAnnot)
+    {
+        d->inplaceIntent = intent;
+        return;
+    }
+
+    if (d->pdfAnnot->getType() == Annot::typeFreeText)
+    {
+        AnnotFreeText * ftextann = static_cast<AnnotFreeText*>(d->pdfAnnot);
+        ftextann->setIntent((AnnotFreeText::AnnotFreeTextIntent)intent);
+        d->pdfAnnot->invalidateAppearance();
+    }
+}
+
+
+/** LineAnnotation [Annotation] */
+class LineAnnotationPrivate : public AnnotationPrivate
+{
+    public:
+        LineAnnotationPrivate();
+        Annotation * makeAlias();
+        Annot* createNativeAnnot(::Page *destPage, DocumentData *doc);
+
+        // data fields (note uses border for rendering style)
+        QLinkedList<QPointF> linePoints;
+        LineAnnotation::TermStyle lineStartStyle;
+        LineAnnotation::TermStyle lineEndStyle;
+        bool lineClosed : 1;  // (if true draw close shape)
+        bool lineShowCaption : 1;
+        LineAnnotation::LineType lineType;
+        QColor lineInnerColor;
+        double lineLeadingFwdPt;
+        double lineLeadingBackPt;
+        LineAnnotation::LineIntent lineIntent;
+};
+
+LineAnnotationPrivate::LineAnnotationPrivate()
+    : AnnotationPrivate(), lineStartStyle( LineAnnotation::None ),
+    lineEndStyle( LineAnnotation::None ), lineClosed( false ),
+    lineShowCaption( false ), lineLeadingFwdPt( 0 ),
+    lineLeadingBackPt( 0 ), lineIntent( LineAnnotation::Unknown )
+{
+}
+
+Annotation * LineAnnotationPrivate::makeAlias()
+{
+    return new LineAnnotation(*this);
+}
+
+Annot* LineAnnotationPrivate::createNativeAnnot(::Page *destPage, DocumentData *doc)
+{
+    // Setters are defined in the public class
+    LineAnnotation *q = static_cast<LineAnnotation*>( makeAlias() );
+
+    // Set page and document
+    pdfPage = destPage;
+    parentDoc = doc;
+
+    // Set pdfAnnot
+    AnnotPath * path = toAnnotPath(linePoints);
+    PDFRectangle rect = toPdfRectangle(boundary);
+    if (lineType == LineAnnotation::StraightLine)
+    {
+        PDFRectangle lrect(path->getX(0), path->getY(0), path->getX(1), path->getY(1));
+        pdfAnnot = new AnnotLine(doc->doc, &rect, &lrect);
+    }
+    else
+    {
+        pdfAnnot = new AnnotPolygon(doc->doc, &rect,
+                lineClosed ? Annot::typePolygon : Annot::typePolyLine, path );
+    }
+    delete path;
+
+    // Set properties
+    flushBaseAnnotationProperties();
+    q->setLineStartStyle(lineStartStyle);
+    q->setLineEndStyle(lineEndStyle);
+    q->setLineInnerColor(lineInnerColor);
+    q->setLineLeadingForwardPoint(lineLeadingFwdPt);
+    q->setLineLeadingBackPoint(lineLeadingBackPt);
+    q->setLineShowCaption(lineShowCaption);
+    q->setLineIntent(lineIntent);
+
+    delete q;
+
+    linePoints.clear(); // Free up memory
+
+    return pdfAnnot;
+}
+
+LineAnnotation::LineAnnotation( LineAnnotation::LineType type )
+    : Annotation( *new LineAnnotationPrivate() )
+{
+    setLineType(type);
+}
+
+LineAnnotation::LineAnnotation(LineAnnotationPrivate &dd)
+    : Annotation( dd )
+{}
+
+LineAnnotation::LineAnnotation( const QDomNode & node )
+    : Annotation( *new LineAnnotationPrivate(), node )
+{
+    // loop through the whole children looking for a 'line' element
+    QDomNode subNode = node.firstChild();
+    while( subNode.isElement() )
+    {
+        QDomElement e = subNode.toElement();
+        subNode = subNode.nextSibling();
+        if ( e.tagName() != "line" )
+            continue;
+
+        // parse the attributes
+        if ( e.hasAttribute( "startStyle" ) )
+            setLineStartStyle((LineAnnotation::TermStyle)e.attribute( "startStyle" ).toInt());
+        if ( e.hasAttribute( "endStyle" ) )
+            setLineEndStyle((LineAnnotation::TermStyle)e.attribute( "endStyle" ).toInt());
+        if ( e.hasAttribute( "closed" ) )
+            setLineClosed(e.attribute( "closed" ).toInt());
+        if ( e.hasAttribute( "innerColor" ) )
+            setLineInnerColor(QColor( e.attribute( "innerColor" ) ));
+        if ( e.hasAttribute( "leadFwd" ) )
+            setLineLeadingForwardPoint(e.attribute( "leadFwd" ).toDouble());
+        if ( e.hasAttribute( "leadBack" ) )
+            setLineLeadingBackPoint(e.attribute( "leadBack" ).toDouble());
+        if ( e.hasAttribute( "showCaption" ) )
+            setLineShowCaption(e.attribute( "showCaption" ).toInt());
+        if ( e.hasAttribute( "intent" ) )
+            setLineIntent((LineAnnotation::LineIntent)e.attribute( "intent" ).toInt());
+
+        // parse all 'point' subnodes
+        QLinkedList<QPointF> points;
+        QDomNode pointNode = e.firstChild();
+        while ( pointNode.isElement() )
+        {
+            QDomElement pe = pointNode.toElement();
+            pointNode = pointNode.nextSibling();
+
+            if ( pe.tagName() != "point" )
+                continue;
+
+            QPointF p(pe.attribute( "x", "0.0" ).toDouble(), pe.attribute( "y", "0.0" ).toDouble());
+            points.append( p );
+        }
+        setLinePoints(points);
+        setLineType(points.size() == 2 ? StraightLine : Polyline);
+
+        // loading complete
+        break;
+    }
+}
+
+LineAnnotation::~LineAnnotation()
+{
+}
+
+void LineAnnotation::store( QDomNode & node, QDomDocument & document ) const
+{
+    // store base annotation properties
+    storeBaseAnnotationProperties( node, document );
+
+    // create [line] element
+    QDomElement lineElement = document.createElement( "line" );
+    node.appendChild( lineElement );
+
+    // store the attributes
+    if ( lineStartStyle() != None )
+        lineElement.setAttribute( "startStyle", (int)lineStartStyle() );
+    if ( lineEndStyle() != None )
+        lineElement.setAttribute( "endStyle", (int)lineEndStyle() );
+    if ( isLineClosed() )
+        lineElement.setAttribute( "closed", isLineClosed() );
+    if ( lineInnerColor().isValid() )
+        lineElement.setAttribute( "innerColor", lineInnerColor().name() );
+    if ( lineLeadingForwardPoint() != 0.0 )
+        lineElement.setAttribute( "leadFwd", QString::number( lineLeadingForwardPoint() ) );
+    if ( lineLeadingBackPoint() != 0.0 )
+        lineElement.setAttribute( "leadBack", QString::number( lineLeadingBackPoint() ) );
+    if ( lineShowCaption() )
+        lineElement.setAttribute( "showCaption", lineShowCaption() );
+    if ( lineIntent() != Unknown )
+        lineElement.setAttribute( "intent", lineIntent() );
+
+    // append the list of points
+    const QLinkedList<QPointF> points = linePoints();
+    if ( points.count() > 1 )
+    {
+        QLinkedList<QPointF>::const_iterator it = points.begin(), end = points.end();
+        while ( it != end )
+        {
+            const QPointF & p = *it;
+            QDomElement pElement = document.createElement( "point" );
+            lineElement.appendChild( pElement );
+            pElement.setAttribute( "x", QString::number( p.x() ) );
+            pElement.setAttribute( "y", QString::number( p.y() ) );
+            ++it;
+        }
+    }
+}
+
+Annotation::SubType LineAnnotation::subType() const
+{
+    return ALine;
+}
+
+LineAnnotation::LineType LineAnnotation::lineType() const
+{
+    Q_D( const LineAnnotation );
+
+    if (!d->pdfAnnot)
+        return d->lineType;
+
+    return (d->pdfAnnot->getType() == Annot::typeLine) ?
+        LineAnnotation::StraightLine : LineAnnotation::Polyline;
+}
+
+void LineAnnotation::setLineType( LineAnnotation::LineType type )
+{
+    Q_D( LineAnnotation );
+
+    if (!d->pdfAnnot)
+    {
+        d->lineType = type;
+        return;
+    }
+
+    // Type cannot be changed if annotation is already tied
+}
+
+QLinkedList<QPointF> LineAnnotation::linePoints() const
+{
+    Q_D( const LineAnnotation );
+
+    if (!d->pdfAnnot)
+        return d->linePoints;
+
+    double MTX[6];
+    d->fillMTX(MTX);
+
+    QLinkedList<QPointF> res;
+    if (d->pdfAnnot->getType() == Annot::typeLine)
+    {
+        const AnnotLine * lineann = static_cast<const AnnotLine*>(d->pdfAnnot);
+        QPointF p;
+        XPDFReader::transform(MTX, lineann->getX1(), lineann->getY1(), p);
+        res.append(p);
+        XPDFReader::transform(MTX, lineann->getX2(), lineann->getY2(), p);
+        res.append(p);
+    }
+    else
+    {
+        const AnnotPolygon * polyann = static_cast<const AnnotPolygon*>(d->pdfAnnot);
+        const AnnotPath * vertices = polyann->getVertices();
+
+        for (int i = 0; i < vertices->getCoordsLength(); ++i)
+        {
+            QPointF p;
+            XPDFReader::transform(MTX, vertices->getX(i), vertices->getY(i), p);
+            res.append(p);
+        }
+    }
+
+    return res;
+}
+
+void LineAnnotation::setLinePoints( const QLinkedList<QPointF> &points )
+{
+    Q_D( LineAnnotation );
+
+    if (!d->pdfAnnot)
+    {
+        d->linePoints = points;
+        return;
+    }
+
+    if (d->pdfAnnot->getType() == Annot::typeLine)
+    {
+        AnnotLine *lineann = static_cast<AnnotLine*>(d->pdfAnnot);
+        if (points.size() != 2)
+        {
+            error(errSyntaxError, -1, "Expected two points for a straight line");
+            return;
+        }
+        double x1, y1, x2, y2;
+        double MTX[6];
+        d->fillMTX(MTX);
+        XPDFReader::invTransform( MTX, points.first(), x1, y1 );
+        XPDFReader::invTransform( MTX, points.last(), x2, y2 );
+        lineann->setVertices(x1, y1, x2, y2);
+    }
+    else
+    {
+        AnnotPolygon *polyann = static_cast<AnnotPolygon*>(d->pdfAnnot);
+        AnnotPath * p = d->toAnnotPath(points);
+        polyann->setVertices(p);
+        delete p;
+    }
+
+    d->pdfAnnot->invalidateAppearance();
+}
+
+LineAnnotation::TermStyle LineAnnotation::lineStartStyle() const
+{
+    Q_D( const LineAnnotation );
+
+    if (!d->pdfAnnot)
+        return d->lineStartStyle;
+
+    if (d->pdfAnnot->getType() == Annot::typeLine)
+    {
+        const AnnotLine * lineann = static_cast<const AnnotLine*>(d->pdfAnnot);
+        return (LineAnnotation::TermStyle)lineann->getStartStyle();
+    }
+    else
+    {
+        const AnnotPolygon * polyann = static_cast<const AnnotPolygon*>(d->pdfAnnot);
+        return (LineAnnotation::TermStyle)polyann->getStartStyle();
+    }
+}
+
+void LineAnnotation::setLineStartStyle( LineAnnotation::TermStyle style )
+{
+    Q_D( LineAnnotation );
+
+    if (!d->pdfAnnot)
+    {
+        d->lineStartStyle = style;
+        return;
+    }
+
+    if (d->pdfAnnot->getType() == Annot::typeLine)
+    {
+        AnnotLine *lineann = static_cast<AnnotLine*>(d->pdfAnnot);
+        lineann->setStartEndStyle((AnnotLineEndingStyle)style, lineann->getEndStyle());
+    }
+    else
+    {
+        AnnotPolygon *polyann = static_cast<AnnotPolygon*>(d->pdfAnnot);
+        polyann->setStartEndStyle((AnnotLineEndingStyle)style, polyann->getEndStyle());
+    }
+
+    d->pdfAnnot->invalidateAppearance();
+}
+
+LineAnnotation::TermStyle LineAnnotation::lineEndStyle() const
+{
+    Q_D( const LineAnnotation );
+
+    if (!d->pdfAnnot)
+        return d->lineEndStyle;
+
+    if (d->pdfAnnot->getType() == Annot::typeLine)
+    {
+        const AnnotLine * lineann = static_cast<const AnnotLine*>(d->pdfAnnot);
+        return (LineAnnotation::TermStyle)lineann->getEndStyle();
+    }
+    else
+    {
+        const AnnotPolygon * polyann = static_cast<const AnnotPolygon*>(d->pdfAnnot);
+        return (LineAnnotation::TermStyle)polyann->getEndStyle();
+    }
+}
+
+void LineAnnotation::setLineEndStyle( LineAnnotation::TermStyle style )
+{
+    Q_D( LineAnnotation );
+
+    if (!d->pdfAnnot)
+    {
+        d->lineEndStyle = style;
+        return;
+    }
+
+    if (d->pdfAnnot->getType() == Annot::typeLine)
+    {
+        AnnotLine *lineann = static_cast<AnnotLine*>(d->pdfAnnot);
+        lineann->setStartEndStyle(lineann->getStartStyle(), (AnnotLineEndingStyle)style);
+    }
+    else
+    {
+        AnnotPolygon *polyann = static_cast<AnnotPolygon*>(d->pdfAnnot);
+        polyann->setStartEndStyle(polyann->getStartStyle(), (AnnotLineEndingStyle)style);
+    }
+
+    d->pdfAnnot->invalidateAppearance();
+}
+
+bool LineAnnotation::isLineClosed() const
+{
+    Q_D( const LineAnnotation );
+
+    if (!d->pdfAnnot)
+        return d->lineClosed;
+
+    return d->pdfAnnot->getType() == Annot::typePolygon;
+}
+
+void LineAnnotation::setLineClosed( bool closed )
+{
+    Q_D( LineAnnotation );
+
+    if (!d->pdfAnnot)
+    {
+        d->lineClosed = closed;
+        return;
+    }
+
+    if (d->pdfAnnot->getType() != Annot::typeLine)
+    {
+        AnnotPolygon *polyann = static_cast<AnnotPolygon*>(d->pdfAnnot);
+
+        // Set new subtype and switch intent if necessary
+        if (closed)
+        {
+            polyann->setType(Annot::typePolygon);
+            if (polyann->getIntent() == AnnotPolygon::polylineDimension)
+                polyann->setIntent( AnnotPolygon::polygonDimension );
+        }
+        else
+        {
+            polyann->setType(Annot::typePolyLine);
+            if (polyann->getIntent() == AnnotPolygon::polygonDimension)
+                polyann->setIntent( AnnotPolygon::polylineDimension );
+        }
+
+        d->pdfAnnot->invalidateAppearance();
+    }
+}
+
+QColor LineAnnotation::lineInnerColor() const
+{
+    Q_D( const LineAnnotation );
+
+    if (!d->pdfAnnot)
+        return d->lineInnerColor;
+
+    AnnotColor * c;
+
+    if (d->pdfAnnot->getType() == Annot::typeLine)
+    {
+        const AnnotLine * lineann = static_cast<const AnnotLine*>(d->pdfAnnot);
+        c = lineann->getInteriorColor();
+    }
+    else
+    {
+        const AnnotPolygon * polyann = static_cast<const AnnotPolygon*>(d->pdfAnnot);
+        c = polyann->getInteriorColor();
+    }
+
+    return convertAnnotColor(c);
+}
+
+void LineAnnotation::setLineInnerColor( const QColor &color )
+{
+    Q_D( LineAnnotation );
+
+    if (!d->pdfAnnot)
+    {
+        d->lineInnerColor = color;
+        return;
+    }
+
+    AnnotColor * c = convertQColor(color);
+
+    if (d->pdfAnnot->getType() == Annot::typeLine)
+    {
+        AnnotLine *lineann = static_cast<AnnotLine*>(d->pdfAnnot);
+        lineann->setInteriorColor(c);
+    }
+    else
+    {
+        AnnotPolygon *polyann = static_cast<AnnotPolygon*>(d->pdfAnnot);
+        polyann->setInteriorColor(c);
+    }
+
+    d->pdfAnnot->invalidateAppearance();
+}
+
+double LineAnnotation::lineLeadingForwardPoint() const
+{
+    Q_D( const LineAnnotation );
+
+    if (!d->pdfAnnot)
+        return d->lineLeadingFwdPt;
+
+    if (d->pdfAnnot->getType() == Annot::typeLine)
+    {
+        const AnnotLine * lineann = static_cast<const AnnotLine*>(d->pdfAnnot);
+        return lineann->getLeaderLineLength();
+    }
+
+    return 0;
+}
+
+void LineAnnotation::setLineLeadingForwardPoint( double point )
+{
+    Q_D( LineAnnotation );
+
+    if (!d->pdfAnnot)
+    {
+        d->lineLeadingFwdPt = point;
+        return;
+    }
+
+    if (d->pdfAnnot->getType() == Annot::typeLine)
+    {
+        AnnotLine *lineann = static_cast<AnnotLine*>(d->pdfAnnot);
+        lineann->setLeaderLineLength(point);
+        d->pdfAnnot->invalidateAppearance();
+    }
+}
+
+double LineAnnotation::lineLeadingBackPoint() const
+{
+    Q_D( const LineAnnotation );
+
+    if (!d->pdfAnnot)
+        return d->lineLeadingBackPt;
+
+    if (d->pdfAnnot->getType() == Annot::typeLine)
+    {
+        const AnnotLine * lineann = static_cast<const AnnotLine*>(d->pdfAnnot);
+        return lineann->getLeaderLineExtension();
+    }
+
+    return 0;
+}
+
+void LineAnnotation::setLineLeadingBackPoint( double point )
+{
+    Q_D( LineAnnotation );
+
+    if (!d->pdfAnnot)
+    {
+        d->lineLeadingBackPt = point;
+        return;
+    }
+
+    if (d->pdfAnnot->getType() == Annot::typeLine)
+    {
+        AnnotLine *lineann = static_cast<AnnotLine*>(d->pdfAnnot);
+        lineann->setLeaderLineExtension(point);
+        d->pdfAnnot->invalidateAppearance();
+    }
+}
+
+bool LineAnnotation::lineShowCaption() const
+{
+    Q_D( const LineAnnotation );
+
+    if (!d->pdfAnnot)
+        return d->lineShowCaption;
+
+    if (d->pdfAnnot->getType() == Annot::typeLine)
+    {
+        const AnnotLine * lineann = static_cast<const AnnotLine*>(d->pdfAnnot);
+        return lineann->getCaption();
+    }
+
+    return false;
+}
+
+void LineAnnotation::setLineShowCaption( bool show )
+{
+    Q_D( LineAnnotation );
+
+    if (!d->pdfAnnot)
+    {
+        d->lineShowCaption = show;
+        return;
+    }
+
+    if (d->pdfAnnot->getType() == Annot::typeLine)
+    {
+        AnnotLine *lineann = static_cast<AnnotLine*>(d->pdfAnnot);
+        lineann->setCaption(show);
+        d->pdfAnnot->invalidateAppearance();
+    }
+}
+
+LineAnnotation::LineIntent LineAnnotation::lineIntent() const
+{
+    Q_D( const LineAnnotation );
+
+    if (!d->pdfAnnot)
+        return d->lineIntent;
+
+    if (d->pdfAnnot->getType() == Annot::typeLine)
+    {
+        const AnnotLine * lineann = static_cast<const AnnotLine*>(d->pdfAnnot);
+        return (LineAnnotation::LineIntent)( lineann->getIntent() + 1 );
+    }
+    else
+    {
+        const AnnotPolygon * polyann = static_cast<const AnnotPolygon*>(d->pdfAnnot);
+        if ( polyann->getIntent() == AnnotPolygon::polygonCloud )
+            return LineAnnotation::PolygonCloud;
+        else // AnnotPolygon::polylineDimension, AnnotPolygon::polygonDimension
+            return LineAnnotation::Dimension;
+    }
+}
+
+void LineAnnotation::setLineIntent( LineAnnotation::LineIntent intent )
+{
+    Q_D( LineAnnotation );
+
+    if (!d->pdfAnnot)
+    {
+        d->lineIntent = intent;
+        return;
+    }
+
+    if ( intent == LineAnnotation::Unknown )
+        return; // Do not set (actually, it should clear the property)
+
+    if (d->pdfAnnot->getType() == Annot::typeLine)
+    {
+        AnnotLine * lineann = static_cast<AnnotLine*>(d->pdfAnnot);
+        lineann->setIntent((AnnotLine::AnnotLineIntent)( intent - 1 ));
+    }
+    else
+    {
+        AnnotPolygon * polyann = static_cast<AnnotPolygon*>(d->pdfAnnot);
+        if ( intent == LineAnnotation::PolygonCloud)
+            polyann->setIntent( AnnotPolygon::polygonCloud );
+        else // LineAnnotation::Dimension
+        {
+            if ( d->pdfAnnot->getType() == Annot::typePolygon )
+                polyann->setIntent( AnnotPolygon::polygonDimension );
+            else // Annot::typePolyLine
+                polyann->setIntent( AnnotPolygon::polylineDimension );
+        }
+    }
+
+    d->pdfAnnot->invalidateAppearance();
+}
+
+
+/** GeomAnnotation [Annotation] */
+class GeomAnnotationPrivate : public AnnotationPrivate
+{
+    public:
+        GeomAnnotationPrivate();
+        Annotation * makeAlias();
+        Annot* createNativeAnnot(::Page *destPage, DocumentData *doc);
+
+        // data fields (note uses border for rendering style)
+        GeomAnnotation::GeomType geomType;
+        QColor geomInnerColor;
+};
+
+GeomAnnotationPrivate::GeomAnnotationPrivate()
+    : AnnotationPrivate(), geomType( GeomAnnotation::InscribedSquare )
+{
+}
+
+Annotation * GeomAnnotationPrivate::makeAlias()
+{
+    return new GeomAnnotation(*this);
+}
+
+Annot* GeomAnnotationPrivate::createNativeAnnot(::Page *destPage, DocumentData *doc)
+{
+    // Setters are defined in the public class
+    GeomAnnotation *q = static_cast<GeomAnnotation*>( makeAlias() );
+
+    // Set page and document
+    pdfPage = destPage;
+    parentDoc = doc;
+
+    Annot::AnnotSubtype type;
+    if (geomType == GeomAnnotation::InscribedSquare)
+        type = Annot::typeSquare;
+    else // GeomAnnotation::InscribedCircle
+        type = Annot::typeCircle;
+
+    // Set pdfAnnot
+    PDFRectangle rect = toPdfRectangle(boundary);
+    pdfAnnot = new AnnotGeometry(destPage->getDoc(), &rect, type);
+
+    // Set properties
+    flushBaseAnnotationProperties();
+    q->setGeomInnerColor(geomInnerColor);
+
+    delete q;
+    return pdfAnnot;
+}
+
+GeomAnnotation::GeomAnnotation()
+    : Annotation( *new GeomAnnotationPrivate() )
+{}
+
+GeomAnnotation::GeomAnnotation(GeomAnnotationPrivate &dd)
+    : Annotation( dd )
+{}
+
+GeomAnnotation::GeomAnnotation( const QDomNode & node )
+    : Annotation( *new GeomAnnotationPrivate(), node )
+{
+    // loop through the whole children looking for a 'geom' element
+    QDomNode subNode = node.firstChild();
+    while( subNode.isElement() )
+    {
+        QDomElement e = subNode.toElement();
+        subNode = subNode.nextSibling();
+        if ( e.tagName() != "geom" )
+            continue;
+
+        // parse the attributes
+        if ( e.hasAttribute( "type" ) )
+            setGeomType((GeomAnnotation::GeomType)e.attribute( "type" ).toInt());
+        if ( e.hasAttribute( "color" ) )
+            setGeomInnerColor(QColor( e.attribute( "color" ) ));
+
+        // loading complete
+        break;
+    }
+}
+
+GeomAnnotation::~GeomAnnotation()
+{
+}
+
+void GeomAnnotation::store( QDomNode & node, QDomDocument & document ) const
+{
+    // store base annotation properties
+    storeBaseAnnotationProperties( node, document );
+
+    // create [geom] element
+    QDomElement geomElement = document.createElement( "geom" );
+    node.appendChild( geomElement );
+
+    // append the optional attributes
+    if ( geomType() != InscribedSquare )
+        geomElement.setAttribute( "type", (int)geomType() );
+    if ( geomInnerColor().isValid() )
+        geomElement.setAttribute( "color", geomInnerColor().name() );
+}
+
+Annotation::SubType GeomAnnotation::subType() const
+{
+    return AGeom;
+}
+
+GeomAnnotation::GeomType GeomAnnotation::geomType() const
+{
+    Q_D( const GeomAnnotation );
+
+    if (!d->pdfAnnot)
+        return d->geomType;
+
+    if (d->pdfAnnot->getType() == Annot::typeSquare)
+        return GeomAnnotation::InscribedSquare;
+    else // Annot::typeCircle
+        return GeomAnnotation::InscribedCircle;
+}
+
+void GeomAnnotation::setGeomType( GeomAnnotation::GeomType type )
+{
+    Q_D( GeomAnnotation );
+
+    if (!d->pdfAnnot)
+    {
+        d->geomType = type;
+        return;
+    }
+
+    AnnotGeometry * geomann = static_cast<AnnotGeometry*>(d->pdfAnnot);
+    if (type == GeomAnnotation::InscribedSquare)
+        geomann->setType(Annot::typeSquare);
+    else // GeomAnnotation::InscribedCircle
+        geomann->setType(Annot::typeCircle);
+
+    d->pdfAnnot->invalidateAppearance();
+}
+
+QColor GeomAnnotation::geomInnerColor() const
+{
+    Q_D( const GeomAnnotation );
+
+    if (!d->pdfAnnot)
+        return d->geomInnerColor;
+
+    const AnnotGeometry * geomann = static_cast<const AnnotGeometry*>(d->pdfAnnot);
+    return convertAnnotColor( geomann->getInteriorColor() );
+}
+
+void GeomAnnotation::setGeomInnerColor( const QColor &color )
+{
+    Q_D( GeomAnnotation );
+
+    if (!d->pdfAnnot)
+    {
+        d->geomInnerColor = color;
+        return;
+    }
+
+    AnnotGeometry * geomann = static_cast<AnnotGeometry*>(d->pdfAnnot);
+    geomann->setInteriorColor(convertQColor( color ));
+    d->pdfAnnot->invalidateAppearance();
+}
+
+
+/** HighlightAnnotation [Annotation] */
+class HighlightAnnotationPrivate : public AnnotationPrivate
+{
+    public:
+        HighlightAnnotationPrivate();
+        Annotation * makeAlias();
+        Annot* createNativeAnnot(::Page *destPage, DocumentData *doc);
+
+        // data fields
+        HighlightAnnotation::HighlightType highlightType;
+        QList< HighlightAnnotation::Quad > highlightQuads; // not empty
+
+        // helpers
+        static Annot::AnnotSubtype toAnnotSubType( HighlightAnnotation::HighlightType type );
+        QList< HighlightAnnotation::Quad > fromQuadrilaterals(AnnotQuadrilaterals *quads) const;
+        AnnotQuadrilaterals * toQuadrilaterals(const QList< HighlightAnnotation::Quad > &quads) const;
+};
+
+HighlightAnnotationPrivate::HighlightAnnotationPrivate()
+    : AnnotationPrivate(), highlightType( HighlightAnnotation::Highlight )
+{
+}
+
+Annotation * HighlightAnnotationPrivate::makeAlias()
+{
+    return new HighlightAnnotation(*this);
+}
+
+Annot::AnnotSubtype HighlightAnnotationPrivate::toAnnotSubType( HighlightAnnotation::HighlightType type )
+{
+    switch (type)
+    {
+        default: // HighlightAnnotation::Highlight:
+            return Annot::typeHighlight;
+        case HighlightAnnotation::Underline:
+            return Annot::typeUnderline;
+        case HighlightAnnotation::Squiggly:
+            return Annot::typeSquiggly;
+        case HighlightAnnotation::StrikeOut:
+            return Annot::typeStrikeOut;
+    }
+}
+
+QList< HighlightAnnotation::Quad > HighlightAnnotationPrivate::fromQuadrilaterals(AnnotQuadrilaterals *hlquads) const
+{
+    QList< HighlightAnnotation::Quad > quads;
+
+    if ( !hlquads || !hlquads->getQuadrilateralsLength() )
+        return quads;
+    const int quadsCount = hlquads->getQuadrilateralsLength();
+
+    double MTX[6];
+    fillMTX(MTX);
+
+    for (int q = 0; q < quadsCount; ++q)
+    {
+        HighlightAnnotation::Quad quad;
+        XPDFReader::transform( MTX, hlquads->getX1( q ), hlquads->getY1( q ), quad.points[ 0 ] );
+        XPDFReader::transform( MTX, hlquads->getX2( q ), hlquads->getY2( q ), quad.points[ 1 ] );
+        XPDFReader::transform( MTX, hlquads->getX3( q ), hlquads->getY3( q ), quad.points[ 2 ] );
+        XPDFReader::transform( MTX, hlquads->getX4( q ), hlquads->getY4( q ), quad.points[ 3 ] );
+        // ### PDF1.6 specs says that point are in ccw order, but in fact
+        // points 3 and 4 are swapped in every PDF around!
+        QPointF tmpPoint = quad.points[ 2 ];
+        quad.points[ 2 ] = quad.points[ 3 ];
+        quad.points[ 3 ] = tmpPoint;
+        // initialize other properties and append quad
+        quad.capStart = true;       // unlinked quads are always capped
+        quad.capEnd = true;         // unlinked quads are always capped
+        quad.feather = 0.1;         // default feather
+        quads.append( quad );
+    }
+
+    return quads;
+}
+
+AnnotQuadrilaterals * HighlightAnnotationPrivate::toQuadrilaterals(const QList< HighlightAnnotation::Quad > &quads) const
+{
+    const int count = quads.size();
+    AnnotQuadrilaterals::AnnotQuadrilateral **ac =
+        (AnnotQuadrilaterals::AnnotQuadrilateral**)
+            gmallocn( count, sizeof(AnnotQuadrilaterals::AnnotQuadrilateral*) );
+
+    double MTX[6];
+    fillMTX(MTX);
+
+    int pos = 0;
+    foreach (const HighlightAnnotation::Quad &q, quads)
+    {
+        double x1, y1, x2, y2, x3, y3, x4, y4;
+        XPDFReader::invTransform( MTX, q.points[0], x1, y1 );
+        XPDFReader::invTransform( MTX, q.points[1], x2, y2 );
+        // Swap points 3 and 4 (see HighlightAnnotationPrivate::fromQuadrilaterals)
+        XPDFReader::invTransform( MTX, q.points[3], x3, y3 );
+        XPDFReader::invTransform( MTX, q.points[2], x4, y4 );
+        ac[pos++] = new AnnotQuadrilaterals::AnnotQuadrilateral(x1, y1, x2, y2, x3, y3, x4, y4);
+    }
+
+    return new AnnotQuadrilaterals(ac, count);
+}
+
+Annot* HighlightAnnotationPrivate::createNativeAnnot(::Page *destPage, DocumentData *doc)
+{
+    // Set page and document
+    pdfPage = destPage;
+    parentDoc = doc;
+
+    // Set pdfAnnot
+    PDFRectangle rect = toPdfRectangle(boundary);
+    AnnotQuadrilaterals * quads = toQuadrilaterals(highlightQuads);
+    pdfAnnot = new AnnotTextMarkup(destPage->getDoc(), &rect, toAnnotSubType(highlightType), quads);
+    delete quads;
+
+    // Set properties
+    flushBaseAnnotationProperties();
+
+    highlightQuads.clear(); // Free up memory
+
+    return pdfAnnot;
+}
+
+HighlightAnnotation::HighlightAnnotation()
+    : Annotation( *new HighlightAnnotationPrivate() )
+{}
+
+HighlightAnnotation::HighlightAnnotation(HighlightAnnotationPrivate &dd)
+    : Annotation( dd )
+{}
+
+HighlightAnnotation::HighlightAnnotation( const QDomNode & node )
+    : Annotation( *new HighlightAnnotationPrivate(), node )
+{
+    // loop through the whole children looking for a 'hl' element
+    QDomNode subNode = node.firstChild();
+    while( subNode.isElement() )
+    {
+        QDomElement e = subNode.toElement();
+        subNode = subNode.nextSibling();
+        if ( e.tagName() != "hl" )
+            continue;
+
+        // parse the attributes
+        if ( e.hasAttribute( "type" ) )
+            setHighlightType((HighlightAnnotation::HighlightType)e.attribute( "type" ).toInt());
+
+        // parse all 'quad' subnodes
+        QList<HighlightAnnotation::Quad> quads;
+        QDomNode quadNode = e.firstChild();
+        for ( ; quadNode.isElement(); quadNode = quadNode.nextSibling() )
+        {
+            QDomElement qe = quadNode.toElement();
+            if ( qe.tagName() != "quad" )
+                continue;
+
+            Quad q;
+            q.points[0].setX(qe.attribute( "ax", "0.0" ).toDouble());
+            q.points[0].setY(qe.attribute( "ay", "0.0" ).toDouble());
+            q.points[1].setX(qe.attribute( "bx", "0.0" ).toDouble());
+            q.points[1].setY(qe.attribute( "by", "0.0" ).toDouble());
+            q.points[2].setX(qe.attribute( "cx", "0.0" ).toDouble());
+            q.points[2].setY(qe.attribute( "cy", "0.0" ).toDouble());
+            q.points[3].setX(qe.attribute( "dx", "0.0" ).toDouble());
+            q.points[3].setY(qe.attribute( "dy", "0.0" ).toDouble());
+            q.capStart = qe.hasAttribute( "start" );
+            q.capEnd = qe.hasAttribute( "end" );
+            q.feather = qe.attribute( "feather", "0.1" ).toDouble();
+            quads.append( q );
+        }
+        setHighlightQuads(quads);
+
+        // loading complete
+        break;
+    }
+}
+
+HighlightAnnotation::~HighlightAnnotation()
+{
+}
+
+void HighlightAnnotation::store( QDomNode & node, QDomDocument & document ) const
+{
+    // store base annotation properties
+    storeBaseAnnotationProperties( node, document );
+
+    // create [hl] element
+    QDomElement hlElement = document.createElement( "hl" );
+    node.appendChild( hlElement );
+
+    // append the optional attributes
+    if ( highlightType() != Highlight )
+        hlElement.setAttribute( "type", (int)highlightType() );
+
+    const QList<HighlightAnnotation::Quad> quads = highlightQuads();
+    if ( quads.count() < 1 )
+        return;
+    // append highlight quads, all children describe quads
+    QList< HighlightAnnotation::Quad >::const_iterator it = quads.begin(), end = quads.end();
+    for ( ; it != end; ++it )
+    {
+        QDomElement quadElement = document.createElement( "quad" );
+        hlElement.appendChild( quadElement );
+        const Quad & q = *it;
+        quadElement.setAttribute( "ax", QString::number( q.points[0].x() ) );
+        quadElement.setAttribute( "ay", QString::number( q.points[0].y() ) );
+        quadElement.setAttribute( "bx", QString::number( q.points[1].x() ) );
+        quadElement.setAttribute( "by", QString::number( q.points[1].y() ) );
+        quadElement.setAttribute( "cx", QString::number( q.points[2].x() ) );
+        quadElement.setAttribute( "cy", QString::number( q.points[2].y() ) );
+        quadElement.setAttribute( "dx", QString::number( q.points[3].x() ) );
+        quadElement.setAttribute( "dy", QString::number( q.points[3].y() ) );
+        if ( q.capStart )
+            quadElement.setAttribute( "start", 1 );
+        if ( q.capEnd )
+            quadElement.setAttribute( "end", 1 );
+        quadElement.setAttribute( "feather", QString::number( q.feather ) );
+    }
+}
+
+Annotation::SubType HighlightAnnotation::subType() const
+{
+    return AHighlight;
+}
+
+HighlightAnnotation::HighlightType HighlightAnnotation::highlightType() const
+{
+    Q_D( const HighlightAnnotation );
+
+    if (!d->pdfAnnot)
+        return d->highlightType;
+
+    Annot::AnnotSubtype subType = d->pdfAnnot->getType();
+
+    if ( subType == Annot::typeHighlight )
+        return HighlightAnnotation::Highlight;
+    else if ( subType == Annot::typeUnderline )
+        return HighlightAnnotation::Underline;
+    else if ( subType == Annot::typeSquiggly )
+        return HighlightAnnotation::Squiggly;
+    else // Annot::typeStrikeOut
+        return HighlightAnnotation::StrikeOut;
+}
+
+void HighlightAnnotation::setHighlightType( HighlightAnnotation::HighlightType type )
+{
+    Q_D( HighlightAnnotation );
+
+    if (!d->pdfAnnot)
+    {
+        d->highlightType = type;
+        return;
+    }
+
+    AnnotTextMarkup * hlann = static_cast<AnnotTextMarkup*>(d->pdfAnnot);
+    hlann->setType(HighlightAnnotationPrivate::toAnnotSubType( type ));
+    d->pdfAnnot->invalidateAppearance();
+}
+
+QList< HighlightAnnotation::Quad > HighlightAnnotation::highlightQuads() const
+{
+    Q_D( const HighlightAnnotation );
+
+    if (!d->pdfAnnot)
+        return d->highlightQuads;
+
+    const AnnotTextMarkup * hlann = static_cast<AnnotTextMarkup*>(d->pdfAnnot);
+    return d->fromQuadrilaterals( hlann->getQuadrilaterals() );
+}
+
+void HighlightAnnotation::setHighlightQuads( const QList< HighlightAnnotation::Quad > &quads )
+{
+    Q_D( HighlightAnnotation );
+
+    if (!d->pdfAnnot)
+    {
+        d->highlightQuads = quads;
+        return;
+    }
+
+    AnnotTextMarkup * hlann = static_cast<AnnotTextMarkup*>(d->pdfAnnot);
+    AnnotQuadrilaterals * quadrilaterals = d->toQuadrilaterals(quads);
+    hlann->setQuadrilaterals(quadrilaterals);
+    delete quadrilaterals;
+    d->pdfAnnot->invalidateAppearance();
+}
+
+
+/** StampAnnotation [Annotation] */
+class StampAnnotationPrivate : public AnnotationPrivate
+{
+    public:
+        StampAnnotationPrivate();
+        Annotation * makeAlias();
+        Annot* createNativeAnnot(::Page *destPage, DocumentData *doc);
+
+        // data fields
+        QString stampIconName;
+};
+
+StampAnnotationPrivate::StampAnnotationPrivate()
+    : AnnotationPrivate(), stampIconName( "Draft" )
+{
+}
+
+Annotation * StampAnnotationPrivate::makeAlias()
+{
+    return new StampAnnotation(*this);
+}
+
+Annot* StampAnnotationPrivate::createNativeAnnot(::Page *destPage, DocumentData *doc)
+{
+    StampAnnotation *q = static_cast<StampAnnotation*>( makeAlias() );
+
+    // Set page and document
+    pdfPage = destPage;
+    parentDoc = doc;
+
+    // Set pdfAnnot
+    PDFRectangle rect = toPdfRectangle(boundary);
+    pdfAnnot = new AnnotStamp(destPage->getDoc(), &rect);
+
+    // Set properties
+    flushBaseAnnotationProperties();
+    q->setStampIconName(stampIconName);
+
+    delete q;
+
+    stampIconName.clear(); // Free up memory
+
+    return pdfAnnot;
+}
+
+StampAnnotation::StampAnnotation()
+    : Annotation( *new StampAnnotationPrivate() )
+{}
+
+StampAnnotation::StampAnnotation(StampAnnotationPrivate &dd)
+    : Annotation( dd )
+{}
+
+StampAnnotation::StampAnnotation( const QDomNode & node )
+    : Annotation( *new StampAnnotationPrivate(), node )
+{
+    // loop through the whole children looking for a 'stamp' element
+    QDomNode subNode = node.firstChild();
+    while( subNode.isElement() )
+    {
+        QDomElement e = subNode.toElement();
+        subNode = subNode.nextSibling();
+        if ( e.tagName() != "stamp" )
+            continue;
+
+        // parse the attributes
+        if ( e.hasAttribute( "icon" ) )
+            setStampIconName(e.attribute( "icon" ));
+
+        // loading complete
+        break;
+    }
+}
+
+StampAnnotation::~StampAnnotation()
+{
+}
+
+void StampAnnotation::store( QDomNode & node, QDomDocument & document ) const
+{
+    // store base annotation properties
+    storeBaseAnnotationProperties( node, document );
+
+    // create [stamp] element
+    QDomElement stampElement = document.createElement( "stamp" );
+    node.appendChild( stampElement );
+
+    // append the optional attributes
+    if ( stampIconName() != "Draft" )
+        stampElement.setAttribute( "icon", stampIconName() );
+}
+
+Annotation::SubType StampAnnotation::subType() const
+{
+    return AStamp;
+}
+
+QString StampAnnotation::stampIconName() const
+{
+    Q_D( const StampAnnotation );
+
+    if (!d->pdfAnnot)
+        return d->stampIconName;
+
+    const AnnotStamp * stampann = static_cast<const AnnotStamp*>(d->pdfAnnot);
+    return QString::fromLatin1( stampann->getIcon()->getCString() );
+}
+
+void StampAnnotation::setStampIconName( const QString &name )
+{
+    Q_D( StampAnnotation );
+
+    if (!d->pdfAnnot)
+    {
+        d->stampIconName = name;
+        return;
+    }
+
+    AnnotStamp * stampann = static_cast<AnnotStamp*>(d->pdfAnnot);
+    QByteArray encoded = name.toLatin1();
+    GooString s(encoded.constData());
+    stampann->setIcon(&s);
+    d->pdfAnnot->invalidateAppearance();
+}
+
+/** InkAnnotation [Annotation] */
+class InkAnnotationPrivate : public AnnotationPrivate
+{
+    public:
+        InkAnnotationPrivate();
+        Annotation * makeAlias();
+        Annot* createNativeAnnot(::Page *destPage, DocumentData *doc);
+
+        // data fields
+        QList< QLinkedList<QPointF> > inkPaths;
+
+        // helper
+        AnnotPath **toAnnotPaths(const QList< QLinkedList<QPointF> > &inkPaths);
+};
+
+InkAnnotationPrivate::InkAnnotationPrivate()
+    : AnnotationPrivate()
+{
+}
+
+Annotation * InkAnnotationPrivate::makeAlias()
+{
+    return new InkAnnotation(*this);
+}
+
+// Note: Caller is required to delete array elements and the array itself after use
+AnnotPath **InkAnnotationPrivate::toAnnotPaths(const QList< QLinkedList<QPointF> > &inkPaths)
+{
+    const int pathsNumber = inkPaths.size();
+    AnnotPath **res = new AnnotPath*[pathsNumber];
+    for (int i = 0; i < pathsNumber; ++i)
+        res[i] = toAnnotPath( inkPaths[i] );
+    return res;
+}
+
+Annot* InkAnnotationPrivate::createNativeAnnot(::Page *destPage, DocumentData *doc)
+{
+    // Set page and document
+    pdfPage = destPage;
+    parentDoc = doc;
+
+    // Set pdfAnnot
+    PDFRectangle rect = toPdfRectangle(boundary);
+    AnnotPath **paths = toAnnotPaths(inkPaths);
+    const int pathsNumber = inkPaths.size();
+    pdfAnnot = new AnnotInk(destPage->getDoc(), &rect, paths, pathsNumber);
+
+    for (int i = 0; i < pathsNumber; ++i)
+        delete paths[i];
+    delete[] paths;
+
+    // Set properties
+    flushBaseAnnotationProperties();
+
+    inkPaths.clear(); // Free up memory
+
+    return pdfAnnot;
+}
+
+InkAnnotation::InkAnnotation()
+    : Annotation( *new InkAnnotationPrivate() )
+{}
+
+InkAnnotation::InkAnnotation(InkAnnotationPrivate &dd)
+    : Annotation( dd )
+{}
+
+InkAnnotation::InkAnnotation( const QDomNode & node )
+    : Annotation( *new InkAnnotationPrivate(), node )
+{
+    // loop through the whole children looking for a 'ink' element
+    QDomNode subNode = node.firstChild();
+    while( subNode.isElement() )
+    {
+        QDomElement e = subNode.toElement();
+        subNode = subNode.nextSibling();
+        if ( e.tagName() != "ink" )
+            continue;
+
+        // parse the 'path' subnodes
+        QList< QLinkedList<QPointF> > paths;
+        QDomNode pathNode = e.firstChild();
+        while ( pathNode.isElement() )
+        {
+            QDomElement pathElement = pathNode.toElement();
+            pathNode = pathNode.nextSibling();
+
+            if ( pathElement.tagName() != "path" )
+                continue;
+
+            // build each path parsing 'point' subnodes
+            QLinkedList<QPointF> path;
+            QDomNode pointNode = pathElement.firstChild();
+            while ( pointNode.isElement() )
+            {
+                QDomElement pointElement = pointNode.toElement();
+                pointNode = pointNode.nextSibling();
+
+                if ( pointElement.tagName() != "point" )
+                    continue;
+
+                QPointF p(pointElement.attribute( "x", "0.0" ).toDouble(), pointElement.attribute( "y", "0.0" ).toDouble());
+                path.append( p );
+            }
+
+            // add the path to the path list if it contains at least 2 nodes
+            if ( path.count() >= 2 )
+                paths.append( path );
+        }
+        setInkPaths(paths);
+
+        // loading complete
+        break;
+    }
+}
+
+InkAnnotation::~InkAnnotation()
+{
+}
+
+void InkAnnotation::store( QDomNode & node, QDomDocument & document ) const
+{
+    // store base annotation properties
+    storeBaseAnnotationProperties( node, document );
+
+    // create [ink] element
+    QDomElement inkElement = document.createElement( "ink" );
+    node.appendChild( inkElement );
+
+    // append the optional attributes
+    const QList< QLinkedList<QPointF> > paths = inkPaths();
+    if ( paths.count() < 1 )
+        return;
+    QList< QLinkedList<QPointF> >::const_iterator pIt = paths.begin(), pEnd = paths.end();
+    for ( ; pIt != pEnd; ++pIt )
+    {
+        QDomElement pathElement = document.createElement( "path" );
+        inkElement.appendChild( pathElement );
+        const QLinkedList<QPointF> & path = *pIt;
+        QLinkedList<QPointF>::const_iterator iIt = path.begin(), iEnd = path.end();
+        for ( ; iIt != iEnd; ++iIt )
+        {
+            const QPointF & point = *iIt;
+            QDomElement pointElement = document.createElement( "point" );
+            pathElement.appendChild( pointElement );
+            pointElement.setAttribute( "x", QString::number( point.x() ) );
+            pointElement.setAttribute( "y", QString::number( point.y() ) );
+        }
+    }
+}
+
+Annotation::SubType InkAnnotation::subType() const
+{
+    return AInk;
+}
+
+QList< QLinkedList<QPointF> > InkAnnotation::inkPaths() const
+{
+    Q_D( const InkAnnotation );
+
+    if (!d->pdfAnnot)
+        return d->inkPaths;
+
+    const AnnotInk * inkann = static_cast<const AnnotInk *>(d->pdfAnnot);
+
+    const AnnotPath * const* paths = inkann->getInkList();
+    if ( !paths || !inkann->getInkListLength() )
+        return QList< QLinkedList<QPointF> >();
+
+    double MTX[6];
+    d->fillMTX(MTX);
+
+    const int pathsNumber = inkann->getInkListLength();
+    QList< QLinkedList<QPointF> > inkPaths;
+    for (int m = 0; m < pathsNumber; ++m)
+    {
+        // transform each path in a list of normalized points ..
+        QLinkedList<QPointF> localList;
+        const AnnotPath * path = paths[ m ];
+        const int pointsNumber = path ? path->getCoordsLength() : 0;
+        for (int n = 0; n < pointsNumber; ++n)
+        {
+            QPointF point;
+            XPDFReader::transform(MTX, path->getX(n), path->getY(n), point);
+            localList.append(point);
+        }
+        // ..and add it to the annotation
+        inkPaths.append( localList );
+    }
+    return inkPaths;
+}
+
+void InkAnnotation::setInkPaths( const QList< QLinkedList<QPointF> > &paths )
+{
+    Q_D( InkAnnotation );
+
+    if (!d->pdfAnnot)
+    {
+        d->inkPaths = paths;
+        return;
+    }
+
+    AnnotInk * inkann = static_cast<AnnotInk*>(d->pdfAnnot);
+    AnnotPath **annotpaths = d->toAnnotPaths(paths);
+    const int pathsNumber = paths.size();
+    inkann->setInkList(annotpaths, pathsNumber);
+
+    for (int i = 0; i < pathsNumber; ++i)
+        delete annotpaths[i];
+    delete[] annotpaths;
+
+    d->pdfAnnot->invalidateAppearance();
+}
+
+
+/** LinkAnnotation [Annotation] */
+class LinkAnnotationPrivate : public AnnotationPrivate
+{
+    public:
+        LinkAnnotationPrivate();
+        ~LinkAnnotationPrivate();
+        Annotation * makeAlias();
+        Annot* createNativeAnnot(::Page *destPage, DocumentData *doc);
+
+        // data fields
+        Link * linkDestination;
+        LinkAnnotation::HighlightMode linkHLMode;
+        QPointF linkRegion[4];
+};
+
+LinkAnnotationPrivate::LinkAnnotationPrivate()
+    : AnnotationPrivate(), linkDestination( 0 ), linkHLMode( LinkAnnotation::Invert )
+{
+}
+
+LinkAnnotationPrivate::~LinkAnnotationPrivate()
+{
+    delete linkDestination;
+}
+
+Annotation * LinkAnnotationPrivate::makeAlias()
+{
+    return new LinkAnnotation(*this);
+}
+
+Annot* LinkAnnotationPrivate::createNativeAnnot(::Page *destPage, DocumentData *doc)
+{
+    return 0; // Not implemented
+}
+
+LinkAnnotation::LinkAnnotation()
+    : Annotation( *new LinkAnnotationPrivate() )
+{}
+
+LinkAnnotation::LinkAnnotation(LinkAnnotationPrivate &dd)
+    : Annotation( dd )
+{}
+
+LinkAnnotation::LinkAnnotation( const QDomNode & node )
+    : Annotation( *new LinkAnnotationPrivate(), node )
+{
+    // loop through the whole children looking for a 'link' element
+    QDomNode subNode = node.firstChild();
+    while( subNode.isElement() )
+    {
+        QDomElement e = subNode.toElement();
+        subNode = subNode.nextSibling();
+        if ( e.tagName() != "link" )
+            continue;
+
+        // parse the attributes
+        if ( e.hasAttribute( "hlmode" ) )
+            setLinkHighlightMode((LinkAnnotation::HighlightMode)e.attribute( "hlmode" ).toInt());
+
+        // parse all 'quad' subnodes
+        QDomNode quadNode = e.firstChild();
+        for ( ; quadNode.isElement(); quadNode = quadNode.nextSibling() )
+        {
+            QDomElement qe = quadNode.toElement();
+            if ( qe.tagName() == "quad" )
+            {
+                setLinkRegionPoint(0, QPointF(qe.attribute( "ax", "0.0" ).toDouble(),
+                                              qe.attribute( "ay", "0.0" ).toDouble()));
+                setLinkRegionPoint(1, QPointF(qe.attribute( "bx", "0.0" ).toDouble(),
+                                              qe.attribute( "by", "0.0" ).toDouble()));
+                setLinkRegionPoint(2, QPointF(qe.attribute( "cx", "0.0" ).toDouble(),
+                                              qe.attribute( "cy", "0.0" ).toDouble()));
+                setLinkRegionPoint(3, QPointF(qe.attribute( "dx", "0.0" ).toDouble(),
+                                              qe.attribute( "dy", "0.0" ).toDouble()));
+            }
+            else if ( qe.tagName() == "link" )
+            {
+                QString type = qe.attribute( "type" );
+                if ( type == "GoTo" )
+                {
+                    Poppler::LinkGoto * go = new Poppler::LinkGoto( QRect(), qe.attribute( "filename" ), LinkDestination( qe.attribute( "destination" ) ) );
+                    setLinkDestination(go);
+                }
+                else if ( type == "Exec" )
+                {
+                    Poppler::LinkExecute * exec = new Poppler::LinkExecute( QRect(), qe.attribute( "filename" ), qe.attribute( "parameters" ) );
+                    setLinkDestination(exec);
+                }
+                else if ( type == "Browse" )
+                {
+                    Poppler::LinkBrowse * browse = new Poppler::LinkBrowse( QRect(), qe.attribute( "url" ) );
+                    setLinkDestination(browse);
+                }
+                else if ( type == "Action" )
+                {
+                    Poppler::LinkAction::ActionType act;
+                    QString actString = qe.attribute( "action" );
+                    bool found = true;
+                    if ( actString == "PageFirst" )
+                        act = Poppler::LinkAction::PageFirst;
+                    else if ( actString == "PagePrev" )
+                        act = Poppler::LinkAction::PagePrev;
+                    else if ( actString == "PageNext" )
+                        act = Poppler::LinkAction::PageNext;
+                    else if ( actString == "PageLast" )
+                        act = Poppler::LinkAction::PageLast;
+                    else if ( actString == "HistoryBack" )
+                        act = Poppler::LinkAction::HistoryBack;
+                    else if ( actString == "HistoryForward" )
+                        act = Poppler::LinkAction::HistoryForward;
+                    else if ( actString == "Quit" )
+                        act = Poppler::LinkAction::Quit;
+                    else if ( actString == "Presentation" )
+                        act = Poppler::LinkAction::Presentation;
+                    else if ( actString == "EndPresentation" )
+                        act = Poppler::LinkAction::EndPresentation;
+                    else if ( actString == "Find" )
+                        act = Poppler::LinkAction::Find;
+                    else if ( actString == "GoToPage" )
+                        act = Poppler::LinkAction::GoToPage;
+                    else if ( actString == "Close" )
+                        act = Poppler::LinkAction::Close;
+                    else if ( actString == "Print" )
+                        act = Poppler::LinkAction::Print;
+                    else
+                        found = false;
+                    if (found)
+                    {
+                        Poppler::LinkAction * action = new Poppler::LinkAction( QRect(), act );
+                        setLinkDestination(action);
+                    }
+                }
+#if 0
+                else if ( type == "Movie" )
+                {
+                    Poppler::LinkMovie * movie = new Poppler::LinkMovie( QRect() );
+                    setLinkDestination(movie);
+                }
+#endif
+            }
+        }
+
+        // loading complete
+        break;
+    }
+}
+
+LinkAnnotation::~LinkAnnotation()
+{
+}
+
+void LinkAnnotation::store( QDomNode & node, QDomDocument & document ) const
+{
+    // store base annotation properties
+    storeBaseAnnotationProperties( node, document );
+
+    // create [hl] element
+    QDomElement linkElement = document.createElement( "link" );
+    node.appendChild( linkElement );
+
+    // append the optional attributes
+    if ( linkHighlightMode() != Invert )
+        linkElement.setAttribute( "hlmode", (int)linkHighlightMode() );
+
+    // saving region
+    QDomElement quadElement = document.createElement( "quad" );
+    linkElement.appendChild( quadElement );
+    quadElement.setAttribute( "ax", QString::number( linkRegionPoint(0).x() ) );
+    quadElement.setAttribute( "ay", QString::number( linkRegionPoint(0).y() ) );
+    quadElement.setAttribute( "bx", QString::number( linkRegionPoint(1).x() ) );
+    quadElement.setAttribute( "by", QString::number( linkRegionPoint(1).y() ) );
+    quadElement.setAttribute( "cx", QString::number( linkRegionPoint(2).x() ) );
+    quadElement.setAttribute( "cy", QString::number( linkRegionPoint(2).y() ) );
+    quadElement.setAttribute( "dx", QString::number( linkRegionPoint(3).x() ) );
+    quadElement.setAttribute( "dy", QString::number( linkRegionPoint(3).y() ) );
+
+    // saving link
+    QDomElement hyperlinkElement = document.createElement( "link" );
+    linkElement.appendChild( hyperlinkElement );
+    if ( linkDestination() )
+    {
+        switch( linkDestination()->linkType() )
+        {
+            case Poppler::Link::Goto:
+            {
+                Poppler::LinkGoto * go = static_cast< Poppler::LinkGoto * >( linkDestination() );
+                hyperlinkElement.setAttribute( "type", "GoTo" );
+                hyperlinkElement.setAttribute( "filename", go->fileName() );
+                hyperlinkElement.setAttribute( "destionation", go->destination().toString() );
+                break;
+            }
+            case Poppler::Link::Execute:
+            {
+                Poppler::LinkExecute * exec = static_cast< Poppler::LinkExecute * >( linkDestination() );
+                hyperlinkElement.setAttribute( "type", "Exec" );
+                hyperlinkElement.setAttribute( "filename", exec->fileName() );
+                hyperlinkElement.setAttribute( "parameters", exec->parameters() );
+                break;
+            }
+            case Poppler::Link::Browse:
+            {
+                Poppler::LinkBrowse * browse = static_cast< Poppler::LinkBrowse * >( linkDestination() );
+                hyperlinkElement.setAttribute( "type", "Browse" );
+                hyperlinkElement.setAttribute( "url", browse->url() );
+                break;
+            }
+            case Poppler::Link::Action:
+            {
+                Poppler::LinkAction * action = static_cast< Poppler::LinkAction * >( linkDestination() );
+                hyperlinkElement.setAttribute( "type", "Action" );
+                switch ( action->actionType() )
+                {
+                    case Poppler::LinkAction::PageFirst:
+                        hyperlinkElement.setAttribute( "action", "PageFirst" );
+                        break;
+                    case Poppler::LinkAction::PagePrev:
+                        hyperlinkElement.setAttribute( "action", "PagePrev" );
+                        break;
+                    case Poppler::LinkAction::PageNext:
+                        hyperlinkElement.setAttribute( "action", "PageNext" );
+                        break;
+                    case Poppler::LinkAction::PageLast:
+                        hyperlinkElement.setAttribute( "action", "PageLast" );
+                        break;
+                    case Poppler::LinkAction::HistoryBack:
+                        hyperlinkElement.setAttribute( "action", "HistoryBack" );
+                        break;
+                    case Poppler::LinkAction::HistoryForward:
+                        hyperlinkElement.setAttribute( "action", "HistoryForward" );
+                        break;
+                    case Poppler::LinkAction::Quit:
+                        hyperlinkElement.setAttribute( "action", "Quit" );
+                        break;
+                    case Poppler::LinkAction::Presentation:
+                        hyperlinkElement.setAttribute( "action", "Presentation" );
+                        break;
+                    case Poppler::LinkAction::EndPresentation:
+                        hyperlinkElement.setAttribute( "action", "EndPresentation" );
+                        break;
+                    case Poppler::LinkAction::Find:
+                        hyperlinkElement.setAttribute( "action", "Find" );
+                        break;
+                    case Poppler::LinkAction::GoToPage:
+                        hyperlinkElement.setAttribute( "action", "GoToPage" );
+                        break;
+                    case Poppler::LinkAction::Close:
+                        hyperlinkElement.setAttribute( "action", "Close" );
+                        break;
+                    case Poppler::LinkAction::Print:
+                        hyperlinkElement.setAttribute( "action", "Print" );
+                        break;
+                }
+                break;
+            }
+            case Poppler::Link::Movie:
+            {
+                hyperlinkElement.setAttribute( "type", "Movie" );
+                break;
+            }
+            case Poppler::Link::Rendition:
+            {
+                hyperlinkElement.setAttribute( "type", "Rendition" );
+                break;
+            }
+            case Poppler::Link::Sound:
+            {
+                // FIXME: implement me
+                break;
+            }
+            case Poppler::Link::None:
+                break;
+        }
+    }
+}
+
+Annotation::SubType LinkAnnotation::subType() const
+{
+    return ALink;
+}
+
+Link* LinkAnnotation::linkDestination() const
+{
+    Q_D( const LinkAnnotation );
+    return d->linkDestination;
+}
+
+void LinkAnnotation::setLinkDestination( Link *link )
+{
+    Q_D( LinkAnnotation );
+    delete d->linkDestination;
+    d->linkDestination = link;
+}
+
+LinkAnnotation::HighlightMode LinkAnnotation::linkHighlightMode() const
+{
+    Q_D( const LinkAnnotation );
+    return d->linkHLMode;
+}
+
+void LinkAnnotation::setLinkHighlightMode( LinkAnnotation::HighlightMode mode )
+{
+    Q_D( LinkAnnotation );
+    d->linkHLMode = mode;
+}
+
+QPointF LinkAnnotation::linkRegionPoint( int id ) const
+{
+    if ( id < 0 || id >= 4 )
+        return QPointF();
+
+    Q_D( const LinkAnnotation );
+    return d->linkRegion[id];
+}
+
+void LinkAnnotation::setLinkRegionPoint( int id, const QPointF &point )
+{
+    if ( id < 0 || id >= 4 )
+        return;
+
+    Q_D( LinkAnnotation );
+    d->linkRegion[id] = point;
+}
+
+/** CaretAnnotation [Annotation] */
+class CaretAnnotationPrivate : public AnnotationPrivate
+{
+    public:
+        CaretAnnotationPrivate();
+        Annotation * makeAlias();
+        Annot* createNativeAnnot(::Page *destPage, DocumentData *doc);
+
+        // data fields
+        CaretAnnotation::CaretSymbol symbol;
+};
+
+static QString caretSymbolToString( CaretAnnotation::CaretSymbol symbol )
+{
+    switch ( symbol )
+    {
+        case CaretAnnotation::None:
+            return QString::fromLatin1( "None" );
+        case CaretAnnotation::P:
+            return QString::fromLatin1( "P" );
+    }
+    return QString();
+}
+
+static CaretAnnotation::CaretSymbol caretSymbolFromString( const QString &symbol )
+{
+    if ( symbol == QLatin1String( "None" ) )
+        return CaretAnnotation::None;
+    else if ( symbol == QLatin1String( "P" ) )
+        return CaretAnnotation::P;
+    return CaretAnnotation::None;
+}
+
+CaretAnnotationPrivate::CaretAnnotationPrivate()
+    : AnnotationPrivate(), symbol( CaretAnnotation::None )
+{
+}
+
+Annotation * CaretAnnotationPrivate::makeAlias()
+{
+    return new CaretAnnotation(*this);
+}
+
+Annot* CaretAnnotationPrivate::createNativeAnnot(::Page *destPage, DocumentData *doc)
+{
+    // Setters are defined in the public class
+    CaretAnnotation *q = static_cast<CaretAnnotation*>( makeAlias() );
+
+    // Set page and document
+    pdfPage = destPage;
+    parentDoc = doc;
+
+    // Set pdfAnnot
+    PDFRectangle rect = toPdfRectangle(boundary);
+    pdfAnnot = new AnnotCaret(destPage->getDoc(), &rect);
+
+    // Set properties
+    flushBaseAnnotationProperties();
+    q->setCaretSymbol(symbol);
+
+    delete q;
+    return pdfAnnot;
+}
+
+CaretAnnotation::CaretAnnotation()
+    : Annotation( *new CaretAnnotationPrivate() )
+{
+}
+
+CaretAnnotation::CaretAnnotation(CaretAnnotationPrivate &dd)
+    : Annotation( dd )
+{
+}
+
+CaretAnnotation::CaretAnnotation( const QDomNode & node )
+    : Annotation( *new CaretAnnotationPrivate(), node )
+{
+    // loop through the whole children looking for a 'caret' element
+    QDomNode subNode = node.firstChild();
+    while( subNode.isElement() )
+    {
+        QDomElement e = subNode.toElement();
+        subNode = subNode.nextSibling();
+        if ( e.tagName() != "caret" )
+            continue;
+
+        // parse the attributes
+        if ( e.hasAttribute( "symbol" ) )
+            setCaretSymbol(caretSymbolFromString( e.attribute( "symbol" ) ));
+
+        // loading complete
+        break;
+    }
+}
+
+CaretAnnotation::~CaretAnnotation()
+{
+}
+
+void CaretAnnotation::store( QDomNode & node, QDomDocument & document ) const
+{
+    // store base annotation properties
+    storeBaseAnnotationProperties( node, document );
+
+    // create [caret] element
+    QDomElement caretElement = document.createElement( "caret" );
+    node.appendChild( caretElement );
+
+    // append the optional attributes
+    if ( caretSymbol() != CaretAnnotation::None )
+        caretElement.setAttribute( "symbol", caretSymbolToString( caretSymbol() ) );
+}
+
+Annotation::SubType CaretAnnotation::subType() const
+{
+    return ACaret;
+}
+
+CaretAnnotation::CaretSymbol CaretAnnotation::caretSymbol() const
+{
+    Q_D( const CaretAnnotation );
+
+    if (!d->pdfAnnot)
+        return d->symbol;
+
+    const AnnotCaret * caretann = static_cast<const AnnotCaret *>(d->pdfAnnot);
+    return (CaretAnnotation::CaretSymbol)caretann->getSymbol();
+}
+
+void CaretAnnotation::setCaretSymbol( CaretAnnotation::CaretSymbol symbol )
+{
+    Q_D( CaretAnnotation );
+
+    if (!d->pdfAnnot)
+    {
+        d->symbol = symbol;
+        return;
+    }
+
+    AnnotCaret * caretann = static_cast<AnnotCaret *>(d->pdfAnnot);
+    caretann->setSymbol((AnnotCaret::AnnotCaretSymbol)symbol);
+    d->pdfAnnot->invalidateAppearance();
+}
+
+/** FileAttachmentAnnotation [Annotation] */
+class FileAttachmentAnnotationPrivate : public AnnotationPrivate
+{
+    public:
+        FileAttachmentAnnotationPrivate();
+        ~FileAttachmentAnnotationPrivate();
+        Annotation * makeAlias();
+        Annot* createNativeAnnot(::Page *destPage, DocumentData *doc);
+
+        // data fields
+        QString icon;
+        EmbeddedFile *embfile;
+};
+
+FileAttachmentAnnotationPrivate::FileAttachmentAnnotationPrivate()
+    : AnnotationPrivate(), icon( "PushPin" ), embfile( 0 )
+{
+}
+
+FileAttachmentAnnotationPrivate::~FileAttachmentAnnotationPrivate()
+{
+    delete embfile;
+}
+
+Annotation * FileAttachmentAnnotationPrivate::makeAlias()
+{
+    return new FileAttachmentAnnotation(*this);
+}
+
+Annot* FileAttachmentAnnotationPrivate::createNativeAnnot(::Page *destPage, DocumentData *doc)
+{
+    return 0; // Not implemented
+}
+
+FileAttachmentAnnotation::FileAttachmentAnnotation()
+    : Annotation( *new FileAttachmentAnnotationPrivate() )
+{
+}
+
+FileAttachmentAnnotation::FileAttachmentAnnotation(FileAttachmentAnnotationPrivate &dd)
+    : Annotation( dd )
+{
+}
+
+FileAttachmentAnnotation::FileAttachmentAnnotation( const QDomNode & node )
+    : Annotation( *new FileAttachmentAnnotationPrivate(), node )
+{
+    // loop through the whole children looking for a 'fileattachment' element
+    QDomNode subNode = node.firstChild();
+    while( subNode.isElement() )
+    {
+        QDomElement e = subNode.toElement();
+        subNode = subNode.nextSibling();
+        if ( e.tagName() != "fileattachment" )
+            continue;
+
+        // loading complete
+        break;
+    }
+}
+
+FileAttachmentAnnotation::~FileAttachmentAnnotation()
+{
+}
+
+void FileAttachmentAnnotation::store( QDomNode & node, QDomDocument & document ) const
+{
+    // store base annotation properties
+    storeBaseAnnotationProperties( node, document );
+
+    // create [fileattachment] element
+    QDomElement fileAttachmentElement = document.createElement( "fileattachment" );
+    node.appendChild( fileAttachmentElement );
+}
+
+Annotation::SubType FileAttachmentAnnotation::subType() const
+{
+    return AFileAttachment;
+}
+
+QString FileAttachmentAnnotation::fileIconName() const
+{
+    Q_D( const FileAttachmentAnnotation );
+    return d->icon;
+}
+
+void FileAttachmentAnnotation::setFileIconName( const QString &icon )
+{
+    Q_D( FileAttachmentAnnotation );
+    d->icon = icon;
+}
+
+EmbeddedFile* FileAttachmentAnnotation::embeddedFile() const
+{
+    Q_D( const FileAttachmentAnnotation );
+    return d->embfile;
+}
+
+void FileAttachmentAnnotation::setEmbeddedFile( EmbeddedFile *ef )
+{
+    Q_D( FileAttachmentAnnotation );
+    d->embfile = ef;
+}
+
+/** SoundAnnotation [Annotation] */
+class SoundAnnotationPrivate : public AnnotationPrivate
+{
+    public:
+        SoundAnnotationPrivate();
+        ~SoundAnnotationPrivate();
+        Annotation * makeAlias();
+        Annot* createNativeAnnot(::Page *destPage, DocumentData *doc);
+
+        // data fields
+        QString icon;
+        SoundObject *sound;
+};
+
+SoundAnnotationPrivate::SoundAnnotationPrivate()
+    : AnnotationPrivate(), icon( "Speaker" ), sound( 0 )
+{
+}
+
+SoundAnnotationPrivate::~SoundAnnotationPrivate()
+{
+    delete sound;
+}
+
+Annotation * SoundAnnotationPrivate::makeAlias()
+{
+    return new SoundAnnotation(*this);
+}
+
+Annot* SoundAnnotationPrivate::createNativeAnnot(::Page *destPage, DocumentData *doc)
+{
+    return 0; // Not implemented
+}
+
+SoundAnnotation::SoundAnnotation()
+    : Annotation( *new SoundAnnotationPrivate() )
+{
+}
+
+SoundAnnotation::SoundAnnotation(SoundAnnotationPrivate &dd)
+    : Annotation( dd )
+{
+}
+
+SoundAnnotation::SoundAnnotation( const QDomNode & node )
+    : Annotation( *new SoundAnnotationPrivate(), node )
+{
+    // loop through the whole children looking for a 'sound' element
+    QDomNode subNode = node.firstChild();
+    while( subNode.isElement() )
+    {
+        QDomElement e = subNode.toElement();
+        subNode = subNode.nextSibling();
+        if ( e.tagName() != "sound" )
+            continue;
+
+        // loading complete
+        break;
+    }
+}
+
+SoundAnnotation::~SoundAnnotation()
+{
+}
+
+void SoundAnnotation::store( QDomNode & node, QDomDocument & document ) const
+{
+    // store base annotation properties
+    storeBaseAnnotationProperties( node, document );
+
+    // create [sound] element
+    QDomElement soundElement = document.createElement( "sound" );
+    node.appendChild( soundElement );
+}
+
+Annotation::SubType SoundAnnotation::subType() const
+{
+    return ASound;
+}
+
+QString SoundAnnotation::soundIconName() const
+{
+    Q_D( const SoundAnnotation );
+    return d->icon;
+}
+
+void SoundAnnotation::setSoundIconName( const QString &icon )
+{
+    Q_D( SoundAnnotation );
+    d->icon = icon;
+}
+
+SoundObject* SoundAnnotation::sound() const
+{
+    Q_D( const SoundAnnotation );
+    return d->sound;
+}
+
+void SoundAnnotation::setSound( SoundObject *s )
+{
+    Q_D( SoundAnnotation );
+    d->sound = s;
+}
+
+/** MovieAnnotation [Annotation] */
+class MovieAnnotationPrivate : public AnnotationPrivate
+{
+    public:
+        MovieAnnotationPrivate();
+        ~MovieAnnotationPrivate();
+        Annotation * makeAlias();
+        Annot* createNativeAnnot(::Page *destPage, DocumentData *doc);
+
+        // data fields
+        MovieObject *movie;
+        QString title;
+};
+
+MovieAnnotationPrivate::MovieAnnotationPrivate()
+    : AnnotationPrivate(), movie( 0 )
+{
+}
+
+MovieAnnotationPrivate::~MovieAnnotationPrivate()
+{
+    delete movie;
+}
+
+Annotation * MovieAnnotationPrivate::makeAlias()
+{
+    return new MovieAnnotation(*this);
+}
+
+Annot* MovieAnnotationPrivate::createNativeAnnot(::Page *destPage, DocumentData *doc)
+{
+    return 0; // Not implemented
+}
+
+MovieAnnotation::MovieAnnotation()
+    : Annotation( *new MovieAnnotationPrivate() )
+{
+}
+
+MovieAnnotation::MovieAnnotation(MovieAnnotationPrivate &dd)
+    : Annotation( dd )
+{
+}
+
+MovieAnnotation::MovieAnnotation( const QDomNode & node )
+    : Annotation( *new MovieAnnotationPrivate(), node )
+{
+    // loop through the whole children looking for a 'movie' element
+    QDomNode subNode = node.firstChild();
+    while( subNode.isElement() )
+    {
+        QDomElement e = subNode.toElement();
+        subNode = subNode.nextSibling();
+        if ( e.tagName() != "movie" )
+            continue;
+
+        // loading complete
+        break;
+    }
+}
+
+MovieAnnotation::~MovieAnnotation()
+{
+}
+
+void MovieAnnotation::store( QDomNode & node, QDomDocument & document ) const
+{
+    // store base annotation properties
+    storeBaseAnnotationProperties( node, document );
+
+    // create [movie] element
+    QDomElement movieElement = document.createElement( "movie" );
+    node.appendChild( movieElement );
+}
+
+Annotation::SubType MovieAnnotation::subType() const
+{
+    return AMovie;
+}
+
+MovieObject* MovieAnnotation::movie() const
+{
+    Q_D( const MovieAnnotation );
+    return d->movie;
+}
+
+void MovieAnnotation::setMovie( MovieObject *movie )
+{
+    Q_D( MovieAnnotation );
+    d->movie = movie;
+}
+
+QString MovieAnnotation::movieTitle() const
+{
+    Q_D( const MovieAnnotation );
+    return d->title;
+}
+
+void MovieAnnotation::setMovieTitle( const QString &title )
+{
+    Q_D( MovieAnnotation );
+    d->title = title;
+}
+
+/** ScreenAnnotation [Annotation] */
+class ScreenAnnotationPrivate : public AnnotationPrivate
+{
+    public:
+        ScreenAnnotationPrivate();
+        ~ScreenAnnotationPrivate();
+        Annotation * makeAlias();
+        Annot* createNativeAnnot(::Page *destPage, DocumentData *doc);
+
+        // data fields
+        LinkRendition *action;
+        QString title;
+};
+
+ScreenAnnotationPrivate::ScreenAnnotationPrivate()
+    : AnnotationPrivate(), action( 0 )
+{
+}
+
+ScreenAnnotationPrivate::~ScreenAnnotationPrivate()
+{
+    delete action;
+}
+
+ScreenAnnotation::ScreenAnnotation(ScreenAnnotationPrivate &dd)
+    : Annotation( dd )
+{}
+
+Annotation * ScreenAnnotationPrivate::makeAlias()
+{
+    return new ScreenAnnotation(*this);
+}
+
+Annot* ScreenAnnotationPrivate::createNativeAnnot(::Page *destPage, DocumentData *doc)
+{
+    return 0; // Not implemented
+}
+
+ScreenAnnotation::ScreenAnnotation()
+    : Annotation( *new ScreenAnnotationPrivate() )
+{
+}
+
+ScreenAnnotation::~ScreenAnnotation()
+{
+}
+
+void ScreenAnnotation::store( QDomNode & node, QDomDocument & document ) const
+{
+    // store base annotation properties
+    storeBaseAnnotationProperties( node, document );
+
+    // create [screen] element
+    QDomElement screenElement = document.createElement( "screen" );
+    node.appendChild( screenElement );
+}
+
+Annotation::SubType ScreenAnnotation::subType() const
+{
+    return AScreen;
+}
+
+LinkRendition* ScreenAnnotation::action() const
+{
+    Q_D( const ScreenAnnotation );
+    return d->action;
+}
+
+void ScreenAnnotation::setAction( LinkRendition *action )
+{
+    Q_D( ScreenAnnotation );
+    d->action = action;
+}
+
+QString ScreenAnnotation::screenTitle() const
+{
+    Q_D( const ScreenAnnotation );
+    return d->title;
+}
+
+void ScreenAnnotation::setScreenTitle( const QString &title )
+{
+    Q_D( ScreenAnnotation );
+    d->title = title;
+}
+
+//BEGIN utility annotation functions
+QColor convertAnnotColor( AnnotColor *color )
+{
+    if ( !color )
+        return QColor();
+
+    QColor newcolor;
+    const double *color_data = color->getValues();
+    switch ( color->getSpace() )
+    {
+        case AnnotColor::colorTransparent: // = 0,
+            newcolor = Qt::transparent;
+            break;
+        case AnnotColor::colorGray: // = 1,
+            newcolor.setRgbF( color_data[0], color_data[0], color_data[0] );
+            break;
+        case AnnotColor::colorRGB: // = 3,
+            newcolor.setRgbF( color_data[0], color_data[1], color_data[2] );
+            break;
+        case AnnotColor::colorCMYK: // = 4
+            newcolor.setCmykF( color_data[0], color_data[1], color_data[2], color_data[3] );
+            break;
+    }
+    return newcolor;
+}
+
+AnnotColor* convertQColor( const QColor &c )
+{
+    if (!c.isValid() || c.alpha() == 0)
+        return new AnnotColor(); // Transparent
+    else
+        return new AnnotColor(c.redF(), c.greenF(), c.blueF());
+}
+//END utility annotation functions
+
+}
diff --git a/qt4/src/poppler-annotation.h b/qt4/src/poppler-annotation.h
new file mode 100644 (file)
index 0000000..e511ec0
--- /dev/null
@@ -0,0 +1,853 @@
+/* poppler-annotation.h: qt interface to poppler
+ * Copyright (C) 2006-2008, 2012 Albert Astals Cid <aacid@kde.org>
+ * Copyright (C) 2006, 2008 Pino Toscano <pino@kde.org>
+ * Copyright (C) 2007, Brad Hards <bradh@frogmouth.net>
+ * Copyright (C) 2010, Philip Lorenz <lorenzph+freedesktop@gmail.com>
+ * Copyright (C) 2012, Tobias Koenig <tokoe@kdab.com>
+ * Copyright (C) 2012, Guillermo A. Amaral B. <gamaral@kde.org>
+ * Copyright (C) 2012, Fabio D'Urso <fabiodurso@hotmail.it>
+ * Adapting code from
+ *   Copyright (C) 2004 by Enrico Ros <eros.kde@email.it>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#ifndef _POPPLER_ANNOTATION_H_
+#define _POPPLER_ANNOTATION_H_
+
+#include <QtCore/QDateTime>
+#include <QtCore/QSharedDataPointer>
+#include <QtCore/QLinkedList>
+#include <QtCore/QList>
+#include <QtCore/QPointF>
+#include <QtCore/QRectF>
+#include <QtCore/QVector>
+#include <QtGui/QColor>
+#include <QtGui/QFont>
+#include <QtXml/QDomDocument>
+#include "poppler-export.h"
+
+namespace Poppler {
+
+class Annotation;
+class AnnotationPrivate;
+class TextAnnotationPrivate;
+class LineAnnotationPrivate;
+class GeomAnnotationPrivate;
+class HighlightAnnotationPrivate;
+class StampAnnotationPrivate;
+class InkAnnotationPrivate;
+class LinkAnnotationPrivate;
+class CaretAnnotationPrivate;
+class FileAttachmentAnnotationPrivate;
+class SoundAnnotationPrivate;
+class MovieAnnotationPrivate;
+class ScreenAnnotationPrivate;
+class EmbeddedFile;
+class Link;
+class SoundObject;
+class MovieObject;
+class LinkRendition;
+class Page;
+
+/**
+ * \short Helper class for (recursive) Annotation retrieval/storage.
+ *
+ */
+class POPPLER_QT4_EXPORT AnnotationUtils
+{
+    public:
+        /**
+         * Restore an Annotation (with revisions if needed) from the DOM
+         * element \p annElement.
+         * \returns a pointer to the complete Annotation or 0 if element is
+         * invalid.
+         */
+        static Annotation * createAnnotation( const QDomElement & annElement );
+
+        /**
+         * Save the Annotation \p ann as a child of \p annElement taking
+         * care of saving all revisions if \p ann has any.
+         */
+        static void storeAnnotation( const Annotation * ann,
+            QDomElement & annElement, QDomDocument & document );
+
+        /**
+         * Returns an element called \p name from the direct children of
+         * \p parentNode or a null element if not found.
+         */
+        static QDomElement findChildElement( const QDomNode & parentNode,
+            const QString & name );
+};
+
+
+/**
+ * \short Annotation class holding properties shared by all annotations.
+ *
+ * An Annotation is an object (text note, highlight, sound, popup window, ..)
+ * contained by a Page in the document.
+ *
+ * \warning Different Annotation objects might point to the same annotation.
+ *          Use uniqueName to test for Annotation equality
+ */
+class POPPLER_QT4_EXPORT Annotation
+{
+  friend class AnnotationUtils;
+  friend class LinkMovie;
+
+  public:
+    // enum definitions
+    // WARNING!!! oKular uses that very same values so if you change them notify the author!
+    enum SubType { AText = 1, ALine = 2, AGeom = 3, AHighlight = 4, AStamp = 5,
+                   AInk = 6, ALink = 7, ACaret = 8, AFileAttachment = 9, ASound = 10,
+                   AMovie = 11, AScreen = 12 /** \since 0.20 */, A_BASE = 0 };
+    enum Flag { Hidden = 1, FixedSize = 2, FixedRotation = 4, DenyPrint = 8,
+                DenyWrite = 16, DenyDelete = 32, ToggleHidingOnMouse = 64, External = 128 };
+    enum LineStyle { Solid = 1, Dashed = 2, Beveled = 4, Inset = 8, Underline = 16 };
+    enum LineEffect { NoEffect = 1, Cloudy = 2};
+    enum RevScope { Root = 0 /** \since 0.20 */, Reply = 1, Group = 2, Delete = 4 };
+    enum RevType { None = 1,  Marked = 2, Unmarked = 4,  Accepted = 8, Rejected = 16, Cancelled = 32, Completed = 64 };
+
+    /**
+     * Returns the author of the annotation.
+     */
+    QString author() const;
+    /**
+     * Sets a new author for the annotation.
+     */
+    void setAuthor( const QString &author );
+
+    QString contents() const;
+    void setContents( const QString &contents );
+
+    /**
+     * Returns the unique name (ID) of the annotation.
+     */
+    QString uniqueName() const;
+    /**
+     * Sets a new unique name for the annotation.
+     *
+     * \note no check of the new uniqueName is done
+     */
+    void setUniqueName( const QString &uniqueName );
+
+    QDateTime modificationDate() const;
+    void setModificationDate( const QDateTime &date );
+
+    QDateTime creationDate() const;
+    void setCreationDate( const QDateTime &date );
+
+    int flags() const;
+    void setFlags( int flags );
+
+    QRectF boundary() const;
+    void setBoundary( const QRectF &boundary );
+
+    /**
+     * \short Container class for Annotation style information
+     *
+     * \since 0.20
+     */
+    class POPPLER_QT4_EXPORT Style
+    {
+      public:
+        Style();
+        Style( const Style &other );
+        Style& operator=( const Style &other );
+        ~Style();
+
+        // appearance properties
+        QColor color() const;                     // black
+        void setColor(const QColor &color);
+        double opacity() const;                   // 1.0
+        void setOpacity(double opacity);
+
+        // pen properties
+        double width() const;                     // 1.0
+        void setWidth(double width);
+        LineStyle lineStyle() const;              // LineStyle::Solid
+        void setLineStyle(LineStyle style);
+        double xCorners() const;                  // 0.0
+        void setXCorners(double radius);
+        double yCorners() const;                  // 0.0
+        void setYCorners(double radius);
+        const QVector<double>& dashArray() const; // [ 3 ]
+        void setDashArray(const QVector<double> &array);
+
+        // pen effects
+        LineEffect lineEffect() const;            // LineEffect::NoEffect
+        void setLineEffect(LineEffect effect);
+        double effectIntensity() const;           // 1.0
+        void setEffectIntensity(double intens);
+
+      private:
+        class Private;
+        QSharedDataPointer<Private> d;
+    };
+
+    /// \since 0.20
+    Style style() const;
+    /// \since 0.20
+    void setStyle( const Style& style );
+
+    /**
+     * \short Container class for Annotation pop-up window information
+     *
+     * \since 0.20
+     */
+    class POPPLER_QT4_EXPORT Popup
+    {
+      public:
+        Popup();
+        Popup( const Popup &other );
+        Popup& operator=( const Popup &other );
+        ~Popup();
+
+        // window state (Hidden, FixedRotation, Deny* flags allowed)
+        int flags() const;       // -1 (never initialized) -> 0 (if inited and shown)
+        void setFlags( int flags );
+
+        // geometric properties
+        QRectF geometry() const; // no default
+        void setGeometry( const QRectF &geom );
+
+        // window contens/override properties
+        QString title() const;   // '' text in the titlebar (overrides author)
+        void setTitle( const QString &title );
+        QString summary() const; // '' short description (displayed if not empty)
+        void setSummary( const QString &summary );
+        QString text() const;    // '' text for the window (overrides annot->contents)
+        void setText( const QString &text );
+
+      private:
+        class Private;
+        QSharedDataPointer<Private> d;
+    };
+
+    /// \since 0.20
+    Popup popup() const;
+    /// \since 0.20
+    void setPopup( const Popup& popup );
+
+    /// \cond PRIVATE
+    // This field is deprecated and not used any more. Use popup
+    Q_DECL_DEPRECATED struct { int width, height; } window; // Always set to zero
+    /// \endcond
+
+    /// \since 0.20
+    RevScope revisionScope() const; // Root
+
+    /// \since 0.20
+    RevType revisionType() const;   // None
+
+    /**
+     * Returns the revisions of this annotation
+     *
+     * \note The caller owns the returned annotations and they should
+     *       be deleted when no longer required.
+     *
+     * \since 0.20
+     */
+    QList<Annotation*> revisions() const;
+
+    /**
+     * The type of the annotation.
+     */
+    virtual SubType subType() const = 0;
+
+    /**
+     * Destructor.
+     */
+    virtual ~Annotation();
+
+  protected:
+    /// \cond PRIVATE
+    Annotation( AnnotationPrivate &dd );
+    Annotation( AnnotationPrivate &dd, const QDomNode &description );
+    void storeBaseAnnotationProperties( QDomNode & parentNode, QDomDocument & document ) const;
+    Q_DECLARE_PRIVATE( Annotation )
+    QExplicitlySharedDataPointer<AnnotationPrivate> d_ptr;
+    /// \endcond
+
+  private:
+    virtual void store( QDomNode & parentNode, QDomDocument & document ) const = 0;
+    Q_DISABLE_COPY( Annotation )
+};
+
+/**
+ * \short Annotation containing text.
+ *
+ * A text annotation is an object showing some text directly on the page, or
+ * linked to the contents using an icon shown on a page.
+ */
+class POPPLER_QT4_EXPORT TextAnnotation : public Annotation
+{
+  friend class AnnotationUtils;
+  friend class AnnotationPrivate;
+
+  public:
+    // local enums
+    enum TextType { Linked, InPlace };
+    enum InplaceIntent { Unknown, Callout, TypeWriter };
+
+    TextAnnotation( TextType type );
+    virtual ~TextAnnotation();
+    virtual SubType subType() const;
+
+    /**
+       The type of text annotation represented by this object
+    */
+    TextType textType() const;
+
+    /**
+       The name of the icon for this text annotation.
+
+       Standard names for text annotation icons are:
+       - Comment
+       - Help
+       - Insert
+       - Key
+       - NewParagraph
+       - Note (this is the default icon to use)
+       - Paragraph
+    */
+    QString textIcon() const;
+
+    /**
+       Set the name of the icon to use for this text annotation.
+
+       \sa textIcon for the list of standard names
+    */
+    void setTextIcon( const QString &icon );
+
+    QFont textFont() const;
+    void setTextFont( const QFont &font );
+
+    int inplaceAlign() const;
+    void setInplaceAlign( int align );
+
+    /**
+       Synonym for contents()
+
+       \deprecated Use contents() instead
+    */
+    QString inplaceText() const;
+    /**
+       Synonym for setContents()
+
+       \deprecated Use setContents() instead
+    */
+    void setInplaceText( const QString &text );
+
+    QPointF calloutPoint( int id ) const;
+    /// \since 0.20
+    QVector<QPointF> calloutPoints() const;
+    /// \since 0.20
+    void setCalloutPoints( const QVector<QPointF> &points );
+
+    InplaceIntent inplaceIntent() const;
+    void setInplaceIntent( InplaceIntent intent );
+
+  private:
+    TextAnnotation( const QDomNode &node );
+    TextAnnotation( TextAnnotationPrivate &dd );
+    virtual void store( QDomNode &parentNode, QDomDocument &document ) const;
+    void setTextType( TextType type );
+    Q_DECLARE_PRIVATE( TextAnnotation )
+    Q_DISABLE_COPY( TextAnnotation )
+};
+
+/**
+ * \short Polygon/polyline annotation.
+ *
+ * This annotation represents a polygon (or polyline) to be drawn on a page.
+ */
+class POPPLER_QT4_EXPORT LineAnnotation : public Annotation
+{
+  friend class AnnotationUtils;
+  friend class AnnotationPrivate;
+
+  public:
+    // local enums
+    /// \since 0.20
+    enum LineType { StraightLine, Polyline };
+    enum TermStyle { Square, Circle, Diamond, OpenArrow, ClosedArrow, None,
+                     Butt, ROpenArrow, RClosedArrow, Slash };
+    enum LineIntent { Unknown, Arrow, Dimension, PolygonCloud };
+
+    /// \since 0.20
+    LineAnnotation( LineType type );
+    virtual ~LineAnnotation();
+    virtual SubType subType() const;
+
+    /// \since 0.20
+    LineType lineType() const;
+
+    QLinkedList<QPointF> linePoints() const;
+    void setLinePoints( const QLinkedList<QPointF> &points );
+
+    TermStyle lineStartStyle() const;
+    void setLineStartStyle( TermStyle style );
+
+    TermStyle lineEndStyle() const;
+    void setLineEndStyle( TermStyle style );
+
+    bool isLineClosed() const;
+    void setLineClosed( bool closed );
+
+    QColor lineInnerColor() const;
+    void setLineInnerColor( const QColor &color );
+
+    double lineLeadingForwardPoint() const;
+    void setLineLeadingForwardPoint( double point );
+
+    double lineLeadingBackPoint() const;
+    void setLineLeadingBackPoint( double point );
+
+    bool lineShowCaption() const;
+    void setLineShowCaption( bool show );
+
+    LineIntent lineIntent() const;
+    void setLineIntent( LineIntent intent );
+
+  private:
+    LineAnnotation( const QDomNode &node );
+    LineAnnotation( LineAnnotationPrivate &dd );
+    virtual void store( QDomNode &parentNode, QDomDocument &document ) const;
+    void setLineType( LineType type );
+    Q_DECLARE_PRIVATE( LineAnnotation )
+    Q_DISABLE_COPY( LineAnnotation )
+};
+
+/**
+ * \short Geometric annotation.
+ *
+ * The geometric annotation represents a geometric figure, like a rectangle or
+ * an ellipse.
+ */
+class POPPLER_QT4_EXPORT GeomAnnotation : public Annotation
+{
+  friend class AnnotationUtils;
+  friend class AnnotationPrivate;
+
+  public:
+    GeomAnnotation();
+    virtual ~GeomAnnotation();
+    virtual SubType subType() const;
+
+    // common enums
+    enum GeomType { InscribedSquare, InscribedCircle };
+
+    GeomType geomType() const;
+    void setGeomType( GeomType style );
+
+    QColor geomInnerColor() const;
+    void setGeomInnerColor( const QColor &color );
+
+  private:
+    GeomAnnotation( const QDomNode &node );
+    GeomAnnotation( GeomAnnotationPrivate &dd );
+    virtual void store( QDomNode &parentNode, QDomDocument &document ) const;
+    Q_DECLARE_PRIVATE( GeomAnnotation )
+    Q_DISABLE_COPY( GeomAnnotation )
+};
+
+/**
+ * \short Text highlight annotation.
+ *
+ * The higlight annotation represents some areas of text being "highlighted".
+ */
+class POPPLER_QT4_EXPORT HighlightAnnotation : public Annotation
+{
+  friend class AnnotationUtils;
+  friend class AnnotationPrivate;
+
+  public:
+    HighlightAnnotation();
+    virtual ~HighlightAnnotation();
+    virtual SubType subType() const;
+
+    /**
+       The type of highlight
+    */
+    enum HighlightType { Highlight, ///< highlighter pen style annotation
+                        Squiggly,  ///< jagged or squiggly underline
+                        Underline, ///< straight line underline
+                        StrikeOut  ///< straight line through-line
+    };
+
+    /**
+       Structure corresponding to a QuadPoints array. This matches a
+       quadrilateral that describes the area around a word (or set of
+       words) that are to be highlighted.
+    */
+    struct Quad
+    {
+        QPointF         points[4];          // 8 valid coords
+        bool            capStart;           // false (vtx 1-4) [K]
+        bool            capEnd;             // false (vtx 2-3) [K]
+        double          feather;            // 0.1 (in range 0..1) [K]
+    };
+
+    /**
+       The type (style) of highlighting to use for this area
+       or these areas.
+    */
+    HighlightType highlightType() const;
+
+    /**
+       Set the type of highlighting to use for the given area
+       or areas.
+    */
+    void setHighlightType( HighlightType type );
+
+    /**
+       The list of areas to highlight.
+    */
+    QList< Quad > highlightQuads() const;
+
+    /**
+       Set the areas to highlight.
+    */
+    void setHighlightQuads( const QList< Quad > &quads );
+
+  private:
+    HighlightAnnotation( const QDomNode &node );
+    HighlightAnnotation( HighlightAnnotationPrivate &dd );
+    virtual void store( QDomNode &parentNode, QDomDocument &document ) const;
+    Q_DECLARE_PRIVATE( HighlightAnnotation )
+    Q_DISABLE_COPY( HighlightAnnotation )
+};
+
+/**
+ * \short Stamp annotation.
+ *
+ * A simple annotation drawing a stamp on a page.
+ */
+class POPPLER_QT4_EXPORT StampAnnotation : public Annotation
+{
+  friend class AnnotationUtils;
+  friend class AnnotationPrivate;
+
+  public:
+    StampAnnotation();
+    virtual ~StampAnnotation();
+    virtual SubType subType() const;
+
+    /**
+       The name of the icon for this stamp annotation.
+
+       Standard names for stamp annotation icons are:
+       - Approved
+       - AsIs
+       - Confidential
+       - Departmental
+       - Draft (this is the default icon type)
+       - Experimental
+       - Expired
+       - Final
+       - ForComment
+       - ForPublicRelease
+       - NotApproved
+       - NotForPublicRelease
+       - Sold
+       - TopSecret
+    */
+    QString stampIconName() const;
+
+    /**
+       Set the icon type for this stamp annotation.
+
+       \sa stampIconName for the list of standard icon names
+    */
+    void setStampIconName( const QString &name );
+
+  private:
+    StampAnnotation( const QDomNode &node );
+    StampAnnotation( StampAnnotationPrivate &dd );
+    virtual void store( QDomNode &parentNode, QDomDocument &document ) const;
+    Q_DECLARE_PRIVATE( StampAnnotation )
+    Q_DISABLE_COPY( StampAnnotation )
+};
+
+/**
+ * \short Ink Annotation.
+ *
+ * Annotation representing an ink path on a page.
+ */
+class POPPLER_QT4_EXPORT InkAnnotation : public Annotation
+{
+  friend class AnnotationUtils;
+  friend class AnnotationPrivate;
+
+  public:
+    InkAnnotation();
+    virtual ~InkAnnotation();
+    virtual SubType subType() const;
+
+    QList< QLinkedList<QPointF> > inkPaths() const;
+    void setInkPaths( const QList< QLinkedList<QPointF> > &paths );
+
+  private:
+    InkAnnotation( const QDomNode &node );
+    virtual void store( QDomNode &parentNode, QDomDocument &document ) const;
+    InkAnnotation(InkAnnotationPrivate &dd);
+    Q_DECLARE_PRIVATE( InkAnnotation )
+    Q_DISABLE_COPY( InkAnnotation )
+};
+
+class POPPLER_QT4_EXPORT LinkAnnotation : public Annotation
+{
+  friend class AnnotationUtils;
+  friend class AnnotationPrivate;
+
+  public:
+    virtual ~LinkAnnotation();
+    virtual SubType subType() const;
+
+    // local enums
+    enum HighlightMode { None, Invert, Outline, Push };
+
+    /** \since 0.20 */
+    Link* linkDestination() const;
+    void setLinkDestination( Link *link );
+
+    HighlightMode linkHighlightMode() const;
+    void setLinkHighlightMode( HighlightMode mode );
+
+    QPointF linkRegionPoint( int id ) const;
+    void setLinkRegionPoint( int id, const QPointF &point );
+
+  private:
+    LinkAnnotation();
+    LinkAnnotation( const QDomNode &node );
+    LinkAnnotation( LinkAnnotationPrivate &dd );
+    virtual void store( QDomNode &parentNode, QDomDocument &document ) const;
+    Q_DECLARE_PRIVATE( LinkAnnotation )
+    Q_DISABLE_COPY( LinkAnnotation )
+};
+
+/**
+ * \short Caret annotation.
+ *
+ * The caret annotation represents a symbol to indicate the presence of text.
+ */
+class POPPLER_QT4_EXPORT CaretAnnotation : public Annotation
+{
+  friend class AnnotationUtils;
+  friend class AnnotationPrivate;
+
+  public:
+    CaretAnnotation();
+    virtual ~CaretAnnotation();
+    virtual SubType subType() const;
+
+    /**
+     * The symbols for the caret annotation.
+     */
+    enum CaretSymbol { None, P };
+
+    CaretSymbol caretSymbol() const;
+    void setCaretSymbol( CaretSymbol symbol );
+
+  private:
+    CaretAnnotation( const QDomNode &node );
+    CaretAnnotation( CaretAnnotationPrivate &dd );
+    virtual void store( QDomNode &parentNode, QDomDocument &document ) const;
+    Q_DECLARE_PRIVATE( CaretAnnotation )
+    Q_DISABLE_COPY( CaretAnnotation )
+};
+
+/**
+ * \short File attachment annotation.
+ *
+ * The file attachment annotation represents a file embedded in the document.
+ *
+ * \since 0.10
+ */
+class POPPLER_QT4_EXPORT FileAttachmentAnnotation : public Annotation
+{
+  friend class AnnotationPrivate;
+
+  public:
+    virtual ~FileAttachmentAnnotation();
+    virtual SubType subType() const;
+
+    /**
+     * Returns the name of the icon of this annotation.
+     */
+    QString fileIconName() const;
+    /**
+     * Sets a new name for the icon of this annotation.
+     */
+    void setFileIconName( const QString &icon );
+
+    /**
+     * Returns the EmbeddedFile of this annotation.
+     */
+    EmbeddedFile* embeddedFile() const;
+    /**
+     * Sets a new EmbeddedFile for this annotation.
+     *
+     * \note FileAttachmentAnnotation takes ownership of the object
+     */
+    void setEmbeddedFile( EmbeddedFile *ef );
+
+  private:
+    FileAttachmentAnnotation();
+    FileAttachmentAnnotation( const QDomNode &node );
+    FileAttachmentAnnotation( FileAttachmentAnnotationPrivate &dd );
+    virtual void store( QDomNode &parentNode, QDomDocument &document ) const;
+    Q_DECLARE_PRIVATE( FileAttachmentAnnotation )
+    Q_DISABLE_COPY( FileAttachmentAnnotation )
+};
+
+/**
+ * \short Sound annotation.
+ *
+ * The sound annotation represents a sound to be played when activated.
+ *
+ * \since 0.10
+ */
+class POPPLER_QT4_EXPORT SoundAnnotation : public Annotation
+{
+  friend class AnnotationPrivate;
+
+  public:
+    virtual ~SoundAnnotation();
+    virtual SubType subType() const;
+
+    /**
+     * Returns the name of the icon of this annotation.
+     */
+    QString soundIconName() const;
+    /**
+     * Sets a new name for the icon of this annotation.
+     */
+    void setSoundIconName( const QString &icon );
+
+    /**
+     * Returns the SoundObject of this annotation.
+     */
+    SoundObject* sound() const;
+    /**
+     * Sets a new SoundObject for this annotation.
+     *
+     * \note SoundAnnotation takes ownership of the object
+     */
+    void setSound( SoundObject *ef );
+
+  private:
+    SoundAnnotation();
+    SoundAnnotation( const QDomNode &node );
+    SoundAnnotation( SoundAnnotationPrivate &dd );
+    virtual void store( QDomNode &parentNode, QDomDocument &document ) const;
+    Q_DECLARE_PRIVATE( SoundAnnotation )
+    Q_DISABLE_COPY( SoundAnnotation )
+};
+
+/**
+ * \short Movie annotation.
+ *
+ * The movie annotation represents a movie to be played when activated.
+ *
+ * \since 0.10
+ */
+class POPPLER_QT4_EXPORT MovieAnnotation : public Annotation
+{
+  friend class AnnotationPrivate;
+
+  public:
+    virtual ~MovieAnnotation();
+    virtual SubType subType() const;
+
+    /**
+     * Returns the MovieObject of this annotation.
+     */
+    MovieObject* movie() const;
+    /**
+     * Sets a new MovieObject for this annotation.
+     *
+     * \note MovieAnnotation takes ownership of the object
+     */
+    void setMovie( MovieObject *movie );
+
+    /**
+     * Returns the title of the movie of this annotation.
+     */
+    QString movieTitle() const;
+    /**
+     * Sets a new title for the movie of this annotation.
+     */
+    void setMovieTitle( const QString &title );
+
+  private:
+    MovieAnnotation();
+    MovieAnnotation( const QDomNode &node );
+    MovieAnnotation( MovieAnnotationPrivate &dd );
+    virtual void store( QDomNode &parentNode, QDomDocument &document ) const;
+    Q_DECLARE_PRIVATE( MovieAnnotation )
+    Q_DISABLE_COPY( MovieAnnotation )
+};
+
+/**
+ * \short Screen annotation.
+ *
+ * The screen annotation represents a screen to be played when activated.
+ *
+ * \since 0.20
+ */
+class POPPLER_QT4_EXPORT ScreenAnnotation : public Annotation
+{
+  friend class AnnotationPrivate;
+
+  public:
+    virtual ~ScreenAnnotation();
+
+    virtual SubType subType() const;
+
+    /**
+     * Returns the LinkRendition of this annotation.
+     */
+    LinkRendition* action() const;
+
+    /**
+     * Sets a new LinkRendition for this annotation.
+     *
+     * \note ScreenAnnotation takes ownership of the object
+     */
+    void setAction( LinkRendition *action );
+
+    /**
+     * Returns the title of the screen of this annotation.
+     */
+    QString screenTitle() const;
+
+    /**
+     * Sets a new title for the screen of this annotation.
+     */
+    void setScreenTitle( const QString &title );
+
+  private:
+    ScreenAnnotation();
+    ScreenAnnotation( ScreenAnnotationPrivate &dd );
+    virtual void store( QDomNode &parentNode, QDomDocument &document ) const; // stub
+    Q_DECLARE_PRIVATE( ScreenAnnotation )
+    Q_DISABLE_COPY( ScreenAnnotation )
+};
+
+}
+
+#endif
diff --git a/qt4/src/poppler-base-converter.cc b/qt4/src/poppler-base-converter.cc
new file mode 100644 (file)
index 0000000..11ff17c
--- /dev/null
@@ -0,0 +1,105 @@
+/* poppler-base-converter.cc: qt interface to poppler
+ * Copyright (C) 2007, 2009, Albert Astals Cid <aacid@kde.org>
+ * Copyright (C) 2008, Pino Toscano <pino@kde.org>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include "poppler-qt4.h"
+
+#include "poppler-converter-private.h"
+
+#include <QtCore/QFile>
+
+namespace Poppler {
+
+BaseConverterPrivate::BaseConverterPrivate()
+       : document(0), iodev(0), ownIodev(true)
+{
+}
+
+BaseConverterPrivate::~BaseConverterPrivate()
+{
+}
+
+QIODevice* BaseConverterPrivate::openDevice()
+{
+       if (!iodev)
+       {
+               Q_ASSERT(!outputFileName.isEmpty());
+               QFile *f = new QFile(outputFileName);
+               iodev = f;
+               ownIodev = true;
+       }
+       Q_ASSERT(iodev);
+       if (!iodev->isOpen())
+       {
+               if (!iodev->open(QIODevice::WriteOnly))
+               {
+                       if (ownIodev)
+                       {
+                               delete iodev;
+                               iodev = 0;
+                       }
+                       else
+                       {
+                               return 0;
+                       }
+               }
+       }
+       return iodev;
+}
+
+void BaseConverterPrivate::closeDevice()
+{
+       if (ownIodev)
+       {
+               iodev->close();
+               delete iodev;
+               iodev = 0;
+       }
+}
+
+
+BaseConverter::BaseConverter(BaseConverterPrivate &dd)
+       : d_ptr(&dd)
+{
+}
+
+BaseConverter::~BaseConverter()
+{
+       delete d_ptr;
+}
+
+void BaseConverter::setOutputFileName(const QString &outputFileName)
+{
+       Q_D(BaseConverter);
+       d->outputFileName = outputFileName;
+}
+
+void BaseConverter::setOutputDevice(QIODevice *device)
+{
+       Q_D(BaseConverter);
+       d->iodev = device;
+       d->ownIodev = false;
+}
+
+BaseConverter::Error BaseConverter::lastError() const
+{
+       Q_D(const BaseConverter);
+       return d->lastError;
+}
+
+}
diff --git a/qt4/src/poppler-converter-private.h b/qt4/src/poppler-converter-private.h
new file mode 100644 (file)
index 0000000..dc3e943
--- /dev/null
@@ -0,0 +1,49 @@
+/* poppler-converter-private.h: Qt4 interface to poppler
+ * Copyright (C) 2007, 2009, Albert Astals Cid <aacid@kde.org>
+ * Copyright (C) 2008, Pino Toscano <pino@kde.org>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#ifndef POPPLER_QT4_CONVERTER_PRIVATE_H
+#define POPPLER_QT4_CONVERTER_PRIVATE_H
+
+#include <QtCore/QString>
+
+class QIODevice;
+
+namespace Poppler {
+
+class DocumentData;
+
+class BaseConverterPrivate
+{
+       public:
+               BaseConverterPrivate();
+               virtual ~BaseConverterPrivate();
+
+               QIODevice* openDevice();
+               void closeDevice();
+
+               DocumentData *document;
+               QString outputFileName;
+               QIODevice *iodev;
+               bool ownIodev : 1;
+               BaseConverter::Error lastError;
+};
+
+}
+
+#endif
diff --git a/qt4/src/poppler-document.cc b/qt4/src/poppler-document.cc
new file mode 100644 (file)
index 0000000..550e706
--- /dev/null
@@ -0,0 +1,648 @@
+/* poppler-document.cc: qt interface to poppler
+ * Copyright (C) 2005, Net Integration Technologies, Inc.
+ * Copyright (C) 2005, 2008, Brad Hards <bradh@frogmouth.net>
+ * Copyright (C) 2005-2010, Albert Astals Cid <aacid@kde.org>
+ * Copyright (C) 2006-2010, Pino Toscano <pino@kde.org>
+ * Copyright (C) 2010, 2011 Hib Eris <hib@hiberis.nl>
+ * Copyright (C) 2012 Koji Otani <sho@bbr.jp>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include "poppler-qt4.h"
+
+#include <config.h>
+#include <ErrorCodes.h>
+#include <GlobalParams.h>
+#include <Outline.h>
+#include <PDFDoc.h>
+#include <Stream.h>
+#include <Catalog.h>
+#include <DateInfo.h>
+#include <GfxState.h>
+
+#include <QtCore/QDebug>
+#include <QtCore/QFile>
+#include <QtCore/QByteArray>
+
+#include "poppler-private.h"
+#include "poppler-page-private.h"
+
+#if defined(USE_CMS)
+#if defined(USE_LCMS1)
+#include <lcms.h>
+#else
+#include <lcms2.h>
+#endif
+#endif
+
+namespace Poppler {
+
+  int DocumentData::count = 0;
+
+  Document *Document::load(const QString &filePath, const QByteArray &ownerPassword,
+                          const QByteArray &userPassword)
+    {
+       DocumentData *doc = new DocumentData(filePath, 
+                                            new GooString(ownerPassword.data()),
+                                            new GooString(userPassword.data()));
+       return DocumentData::checkDocument(doc);
+    }
+
+    Document *Document::loadFromData(const QByteArray &fileContents,
+                             const QByteArray &ownerPassword,
+                             const QByteArray &userPassword)
+    {
+       // create stream
+       DocumentData *doc = new DocumentData(fileContents,
+                                            new GooString(ownerPassword.data()),
+                                            new GooString(userPassword.data()));
+       return DocumentData::checkDocument(doc);
+    }
+    
+    Document *DocumentData::checkDocument(DocumentData *doc)
+    {
+       Document *pdoc;
+       if (doc->doc->isOk() || doc->doc->getErrorCode() == errEncrypted) {
+               pdoc = new Document(doc);
+               if (doc->doc->getErrorCode() == errEncrypted)
+                       pdoc->m_doc->locked = true;
+               else
+               {
+                       pdoc->m_doc->locked = false;
+                       pdoc->m_doc->fillMembers();
+               }
+               return pdoc;
+       }
+       else
+       {
+               delete doc;
+       }
+       return NULL;
+    }
+
+    Document::Document(DocumentData *dataA)
+    {
+       m_doc = dataA;
+    }
+
+    Document::~Document()
+    {
+       delete m_doc;
+    }
+
+    Page *Document::page(int index) const
+    {
+       Page *page = new Page(m_doc, index);
+       if (page->m_page->page == NULL) {
+         delete page;
+         return NULL;
+       }
+
+       return page;
+    }
+
+    bool Document::isLocked() const
+    {
+       return m_doc->locked;
+    }
+
+    bool Document::unlock(const QByteArray &ownerPassword,
+                         const QByteArray &userPassword)
+    {
+       if (m_doc->locked) {
+           /* racier then it needs to be */
+           DocumentData *doc2;
+           if (!m_doc->fileContents.isEmpty())
+           {
+               doc2 = new DocumentData(m_doc->fileContents,
+                                       new GooString(ownerPassword.data()),
+                                       new GooString(userPassword.data()));
+           }
+           else
+           {
+               doc2 = new DocumentData(m_doc->m_filePath,
+                                       new GooString(ownerPassword.data()),
+                                       new GooString(userPassword.data()));
+           }
+           if (!doc2->doc->isOk()) {
+               delete doc2;
+           } else {
+               delete m_doc;
+               m_doc = doc2;
+               m_doc->locked = false;
+               m_doc->fillMembers();
+           }
+       }
+       return m_doc->locked;
+    }
+
+    Document::PageMode Document::pageMode() const
+    {
+       switch (m_doc->doc->getCatalog()->getPageMode()) {
+       case Catalog::pageModeNone:
+           return UseNone;
+       case Catalog::pageModeOutlines:
+           return UseOutlines;
+       case Catalog::pageModeThumbs:
+           return UseThumbs;
+       case Catalog::pageModeFullScreen:
+           return FullScreen;
+       case Catalog::pageModeOC:
+           return UseOC;
+       case Catalog::pageModeAttach:
+           return UseAttach;
+       default:
+           return UseNone;
+       }
+    }
+
+    Document::PageLayout Document::pageLayout() const
+    {
+       switch (m_doc->doc->getCatalog()->getPageLayout()) {
+       case Catalog::pageLayoutNone:
+           return NoLayout;
+       case Catalog::pageLayoutSinglePage:
+           return SinglePage;
+       case Catalog::pageLayoutOneColumn:
+           return OneColumn;
+       case Catalog::pageLayoutTwoColumnLeft:
+           return TwoColumnLeft;
+       case Catalog::pageLayoutTwoColumnRight:
+           return TwoColumnRight;
+       case Catalog::pageLayoutTwoPageLeft:
+           return TwoPageLeft;
+       case Catalog::pageLayoutTwoPageRight:
+           return TwoPageRight;
+       default:
+           return NoLayout;
+       }
+    }
+
+    int Document::numPages() const
+    {
+       return m_doc->doc->getNumPages();
+    }
+
+    QList<FontInfo> Document::fonts() const
+    {
+       QList<FontInfo> ourList;
+       FontIterator it( 0, m_doc );
+       while ( it.hasNext() )
+       {
+               ourList += it.next();
+       }
+       return ourList;
+    }
+
+    QList<EmbeddedFile*> Document::embeddedFiles() const
+    {
+       return m_doc->m_embeddedFiles;
+    }
+
+    bool Document::scanForFonts( int numPages, QList<FontInfo> *fontList ) const
+    {
+       if ( !m_doc->m_fontInfoIterator )
+               return false;
+       if ( !m_doc->m_fontInfoIterator->hasNext() )
+               return false;
+       while ( m_doc->m_fontInfoIterator->hasNext() && numPages )
+       {
+               (*fontList) += m_doc->m_fontInfoIterator->next();
+               --numPages;
+       }
+       return true;
+    }
+
+    FontIterator* Document::newFontIterator( int startPage ) const
+    {
+       return new FontIterator( startPage, m_doc );
+    }
+
+    QByteArray Document::fontData(const FontInfo &fi) const
+    {
+       QByteArray result;
+       if (fi.isEmbedded())
+       {
+               Object refObj, strObj;
+               refObj.initRef(fi.m_data->embRef.num, fi.m_data->embRef.gen);
+               refObj.fetch(m_doc->doc->getXRef(), &strObj);
+               refObj.free();
+               if (strObj.isStream())
+               {
+                       int c;
+                       strObj.streamReset();
+                       while ((c = strObj.streamGetChar()) != EOF)
+                       {
+                               result.append((char)c);
+                       }
+                       strObj.streamClose();
+               }
+               strObj.free();
+       }
+       return result;
+    }
+
+    /* borrowed from kpdf */
+    QString Document::info( const QString & type ) const
+    {
+       // [Albert] Code adapted from pdfinfo.cc on xpdf
+       Object info;
+       if ( m_doc->locked )
+           return QString();
+
+       m_doc->doc->getDocInfo( &info );
+       if ( !info.isDict() )
+           return QString();
+
+       QString result;
+       Object obj;
+       GooString *s1;
+       Dict *infoDict = info.getDict();
+
+       if ( infoDict->lookup( type.toLatin1().data(), &obj )->isString() )
+       {
+           s1 = obj.getString();
+           result = UnicodeParsedString(s1);
+           obj.free();
+           info.free();
+           return result;
+       }
+       obj.free();
+       info.free();
+       return QString();
+    }
+
+    QStringList Document::infoKeys() const
+    {
+       QStringList keys;
+
+       Object info;
+       if ( m_doc->locked )
+           return QStringList();
+
+       m_doc->doc->getDocInfo( &info );
+       if ( !info.isDict() )
+           return QStringList();
+
+       Dict *infoDict = info.getDict();
+       // somehow iterate over keys in infoDict
+       for( int i=0; i < infoDict->getLength(); ++i ) {
+           keys.append( QString::fromAscii(infoDict->getKey(i)) );
+       }
+
+       info.free();
+       return keys;
+    }
+
+    /* borrowed from kpdf */
+    QDateTime Document::date( const QString & type ) const
+    {
+       // [Albert] Code adapted from pdfinfo.cc on xpdf
+       if ( m_doc->locked )
+           return QDateTime();
+
+       Object info;
+       m_doc->doc->getDocInfo( &info );
+       if ( !info.isDict() ) {
+           info.free();
+           return QDateTime();
+       }
+
+       Object obj;
+       Dict *infoDict = info.getDict();
+       QDateTime result;
+
+       if ( infoDict->lookup( type.toLatin1().data(), &obj )->isString() )
+       {
+           char *aux = obj.getString()->getCString();
+           result = Poppler::convertDate(aux);
+       }
+       obj.free();
+       info.free();
+       return result;
+    }
+
+    bool Document::isEncrypted() const
+    {
+       return m_doc->doc->isEncrypted();
+    }
+
+    bool Document::isLinearized() const
+    {
+       return m_doc->doc->isLinearized();
+    }
+
+    bool Document::okToPrint() const
+    {
+       return m_doc->doc->okToPrint();
+    }
+
+    bool Document::okToPrintHighRes() const
+    {
+       return m_doc->doc->okToPrintHighRes();
+    }
+
+    bool Document::okToChange() const
+    {
+       return m_doc->doc->okToChange();
+    }
+
+    bool Document::okToCopy() const
+    {
+       return m_doc->doc->okToCopy();
+    }
+
+    bool Document::okToAddNotes() const
+    {
+       return m_doc->doc->okToAddNotes();
+    }
+
+    bool Document::okToFillForm() const
+    {
+       return m_doc->doc->okToFillForm();
+    }
+
+    bool Document::okToCreateFormFields() const
+    {
+       return ( okToFillForm() && okToChange() );
+    }
+
+    bool Document::okToExtractForAccessibility() const
+    {
+       return m_doc->doc->okToAccessibility();
+    }
+
+    bool Document::okToAssemble() const
+    {
+       return m_doc->doc->okToAssemble();
+    }
+
+    double Document::pdfVersion() const
+    {
+       return m_doc->doc->getPDFMajorVersion () + m_doc->doc->getPDFMinorVersion() / 10.0;
+    }
+
+    void Document::getPdfVersion(int *major, int *minor) const
+    {
+       if (major)
+           *major = m_doc->doc->getPDFMajorVersion();
+       if (minor)
+           *minor = m_doc->doc->getPDFMinorVersion();
+    }
+
+    Page *Document::page(const QString &label) const
+    {
+       GooString label_g(label.toAscii().data());
+       int index;
+
+       if (!m_doc->doc->getCatalog()->labelToIndex (&label_g, &index))
+           return NULL;
+
+       return page(index);
+    }
+
+    bool Document::hasEmbeddedFiles() const
+    {
+       return (!(0 == m_doc->doc->getCatalog()->numEmbeddedFiles()));
+    }
+    
+    QDomDocument *Document::toc() const
+    {
+        Outline * outline = m_doc->doc->getOutline();
+        if ( !outline )
+            return NULL;
+
+        GooList * items = outline->getItems();
+        if ( !items || items->getLength() < 1 )
+            return NULL;
+
+        QDomDocument *toc = new QDomDocument();
+        if ( items->getLength() > 0 )
+           m_doc->addTocChildren( toc, toc, items );
+
+        return toc;
+    }
+
+    LinkDestination *Document::linkDestination( const QString &name )
+    {
+        GooString * namedDest = QStringToGooString( name );
+        LinkDestinationData ldd(NULL, namedDest, m_doc, false);
+        LinkDestination *ld = new LinkDestination(ldd);
+        delete namedDest;
+        return ld;
+    }
+    
+    void Document::setPaperColor(const QColor &color)
+    {
+        m_doc->setPaperColor(color);
+    }
+    
+    void Document::setColorDisplayProfile(void* outputProfileA)
+    {
+#if defined(USE_CMS)
+        GfxColorSpace::setDisplayProfile((cmsHPROFILE)outputProfileA);
+#else
+        Q_UNUSED(outputProfileA);
+#endif
+    }
+
+    void Document::setColorDisplayProfileName(const QString &name)
+    {
+#if defined(USE_CMS)
+        GooString *profileName = QStringToGooString( name );
+        GfxColorSpace::setDisplayProfileName(profileName);
+        delete profileName;
+#else
+        Q_UNUSED(name);
+#endif
+    }
+
+    void* Document::colorRgbProfile() const
+    {
+#if defined(USE_CMS)
+        return (void*)GfxColorSpace::getRGBProfile();
+#else
+        return NULL;
+#endif
+    }
+
+    void* Document::colorDisplayProfile() const
+    {
+#if defined(USE_CMS)
+       return (void*)GfxColorSpace::getDisplayProfile();
+#else
+       return NULL;
+#endif
+    }
+
+    QColor Document::paperColor() const
+    {
+       return m_doc->paperColor;
+    }
+
+    void Document::setRenderBackend( Document::RenderBackend backend )
+    {
+        // no need to delete the outputdev as for the moment we always create a splash one
+        // as the arthur one does not allow "precaching" due to it's signature
+        // delete m_doc->m_outputDev;
+        // m_doc->m_outputDev = NULL;
+        m_doc->m_backend = backend;
+    }
+
+    Document::RenderBackend Document::renderBackend() const
+    {
+        return m_doc->m_backend;
+    }
+
+    QSet<Document::RenderBackend> Document::availableRenderBackends()
+    {
+        QSet<Document::RenderBackend> ret;
+#if defined(HAVE_SPLASH)
+        ret << Document::SplashBackend;
+#endif
+        ret << Document::ArthurBackend;
+        return ret;
+    }
+
+    void Document::setRenderHint( Document::RenderHint hint, bool on )
+    {
+        if ( on )
+            m_doc->m_hints |= hint;
+        else
+            m_doc->m_hints &= ~(int)hint;
+
+        // the only way to set antialiasing for Splash is on creation
+        if ( m_doc->m_backend == Document::SplashBackend &&
+             ( hint & ( Document::Antialiasing || Document::TextAntialiasing || Document::TextHinting ) ) )
+        {
+            delete m_doc->m_outputDev;
+            m_doc->m_outputDev = NULL;
+        }
+    }
+
+    Document::RenderHints Document::renderHints() const
+    {
+        return Document::RenderHints( m_doc->m_hints );
+    }
+
+    PSConverter *Document::psConverter() const
+    {
+        return new PSConverter(m_doc);
+    }
+
+    PDFConverter *Document::pdfConverter() const
+    {
+        return new PDFConverter(m_doc);
+    }
+
+    QString Document::metadata() const
+    {
+        QString result;
+        Catalog *catalog = m_doc->doc->getCatalog();
+        if (catalog && catalog->isOk())
+        {
+            GooString *s = catalog->readMetadata();
+            if (s) result = UnicodeParsedString(s);
+            delete s;
+        }
+        return result;
+    }
+
+    bool Document::hasOptionalContent() const
+    {
+        return ( m_doc->doc->getOptContentConfig() && m_doc->doc->getOptContentConfig()->hasOCGs() );
+    }
+
+    OptContentModel *Document::optionalContentModel()
+    {
+        if (m_doc->m_optContentModel.isNull()) {
+           m_doc->m_optContentModel = new OptContentModel(m_doc->doc->getOptContentConfig(), 0);
+       }
+        return (OptContentModel *)m_doc->m_optContentModel;
+    }
+
+    QStringList Document::scripts() const
+    {
+        Catalog *catalog = m_doc->doc->getCatalog();
+        const int numScripts = catalog->numJS();
+        QStringList scripts;
+        for (int i = 0; i < numScripts; ++i) {
+            GooString *s = catalog->getJS(i);
+            if (s) {
+                scripts.append(UnicodeParsedString(s));
+                delete s;
+            }
+        }
+        return scripts;
+    }
+
+    bool Document::getPdfId(QByteArray *permanentId, QByteArray *updateId) const
+    {
+        GooString gooPermanentId;
+        GooString gooUpdateId;
+
+        if (!m_doc->doc->getID(permanentId ? &gooPermanentId : 0, updateId ? &gooUpdateId : 0))
+            return false;
+
+        if (permanentId)
+            *permanentId = gooPermanentId.getCString();
+        if (updateId)
+            *updateId = gooUpdateId.getCString();
+
+        return true;
+    }
+
+    QDateTime convertDate( char *dateString )
+    {
+        int year, mon, day, hour, min, sec, tzHours, tzMins;
+        char tz;
+
+        if ( parseDateString( dateString, &year, &mon, &day, &hour, &min, &sec, &tz, &tzHours, &tzMins ) )
+        {
+            QDate d( year, mon, day );
+            QTime t( hour, min, sec );
+            if ( d.isValid() && t.isValid() ) {
+                QDateTime dt( d, t, Qt::UTC );
+                if ( tz ) {
+                    // then we have some form of timezone
+                    if ( 'Z' == tz  ) {
+                        // We are already at UTC
+                    } else if ( '+' == tz ) {
+                        // local time is ahead of UTC
+                        dt = dt.addSecs(-1*((tzHours*60)+tzMins)*60);
+                    } else if ( '-' == tz ) {
+                        // local time is behind UTC
+                        dt = dt.addSecs(((tzHours*60)+tzMins)*60);
+                    } else {
+                        qWarning("unexpected tz val");
+                    }
+                }
+               return dt;
+            }
+        }
+        return QDateTime();
+    }
+
+    bool isCmsAvailable()
+    {
+#if defined(USE_CMS)
+        return true;
+#else
+        return false;
+#endif
+    }
+
+}
diff --git a/qt4/src/poppler-embeddedfile-private.h b/qt4/src/poppler-embeddedfile-private.h
new file mode 100644 (file)
index 0000000..83549da
--- /dev/null
@@ -0,0 +1,42 @@
+/* poppler-embeddedfile-private.h: Qt4 interface to poppler
+ * Copyright (C) 2005, 2008, 2009, 2012, Albert Astals Cid <aacid@kde.org>
+ * Copyright (C) 2005, Brad Hards <bradh@frogmouth.net>
+ * Copyright (C) 2008, 2011, Pino Toscano <pino@kde.org>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#ifndef POPPLER_EMBEDDEDFILE_PRIVATE_H
+#define POPPLER_EMBEDDEDFILE_PRIVATE_H
+
+class FileSpec;
+
+namespace Poppler
+{
+
+class EmbeddedFileData
+{
+public:
+       EmbeddedFileData(FileSpec *fs);
+       ~EmbeddedFileData();
+    
+       EmbFile *embFile() const;
+
+       FileSpec *filespec;
+};
+
+}
+
+#endif
diff --git a/qt4/src/poppler-embeddedfile.cc b/qt4/src/poppler-embeddedfile.cc
new file mode 100644 (file)
index 0000000..5b3f7d3
--- /dev/null
@@ -0,0 +1,135 @@
+/* poppler-document.cc: qt interface to poppler
+ * Copyright (C) 2005, 2008, 2009, 2012, Albert Astals Cid <aacid@kde.org>
+ * Copyright (C) 2005, Brad Hards <bradh@frogmouth.net>
+ * Copyright (C) 2008, 2011, Pino Toscano <pino@kde.org>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include "poppler-qt4.h"
+
+#include <QtCore/QString>
+#include <QtCore/QDateTime>
+
+#include "Object.h"
+#include "Stream.h"
+#include "Catalog.h"
+#include "FileSpec.h"
+
+#include "poppler-private.h"
+#include "poppler-embeddedfile-private.h"
+
+namespace Poppler
+{
+
+EmbeddedFileData::EmbeddedFileData(FileSpec *fs)
+       : filespec(fs)
+{
+}
+
+EmbeddedFileData::~EmbeddedFileData()
+{
+       delete filespec;
+}
+
+EmbFile *EmbeddedFileData::embFile() const
+{
+       return filespec->isOk() ? filespec->getEmbeddedFile() : NULL;
+}
+
+
+EmbeddedFile::EmbeddedFile(EmbFile *embfile)
+       : m_embeddedFile(0)
+{
+       assert(!"You must not use this private constructor!");
+}
+
+EmbeddedFile::EmbeddedFile(EmbeddedFileData &dd)
+       : m_embeddedFile(&dd)
+{
+}
+
+EmbeddedFile::~EmbeddedFile()
+{
+       delete m_embeddedFile;
+}
+
+QString EmbeddedFile::name() const
+{
+       GooString *goo = m_embeddedFile->filespec->getFileName();
+       return goo ? QString(goo->getCString()) : QString();
+}
+
+QString EmbeddedFile::description() const
+{
+       GooString *goo = m_embeddedFile->filespec->getDescription();
+       return goo ? UnicodeParsedString(goo) : QString();
+}
+
+int EmbeddedFile::size() const
+{
+       return m_embeddedFile->embFile() ? m_embeddedFile->embFile()->size() : -1;
+}
+
+QDateTime EmbeddedFile::modDate() const
+{
+       GooString *goo = m_embeddedFile->embFile() ? m_embeddedFile->embFile()->modDate() : NULL;
+       return goo ? convertDate(goo->getCString()) : QDateTime();
+}
+
+QDateTime EmbeddedFile::createDate() const
+{
+       GooString *goo = m_embeddedFile->embFile() ? m_embeddedFile->embFile()->createDate() : NULL;
+       return goo ? convertDate(goo->getCString()) : QDateTime();
+}
+
+QByteArray EmbeddedFile::checksum() const
+{
+       GooString *goo = m_embeddedFile->embFile() ? m_embeddedFile->embFile()->checksum() : NULL;
+       return goo ? QByteArray::fromRawData(goo->getCString(), goo->getLength()) : QByteArray();
+}
+
+QString EmbeddedFile::mimeType() const
+{
+       GooString *goo = m_embeddedFile->embFile() ? m_embeddedFile->embFile()->mimeType() : NULL;
+       return goo ? QString(goo->getCString()) : QString();
+}
+
+QByteArray EmbeddedFile::data()
+{
+       if (!isValid())
+               return QByteArray();
+       Stream *stream = m_embeddedFile->embFile() ? m_embeddedFile->embFile()->stream() : NULL;
+       if (!stream)
+               return QByteArray();
+       
+       stream->reset();
+       int dataLen = 0;
+       QByteArray fileArray;
+       int i;
+       while ( (i = stream->getChar()) != EOF) {
+               fileArray[dataLen] = (char)i;
+               ++dataLen;
+       }
+       fileArray.resize(dataLen);
+       return fileArray;
+}
+
+bool EmbeddedFile::isValid() const
+{
+       return m_embeddedFile->filespec->isOk();
+}
+
+}
diff --git a/qt4/src/poppler-export.h b/qt4/src/poppler-export.h
new file mode 100644 (file)
index 0000000..7661fe9
--- /dev/null
@@ -0,0 +1,17 @@
+/*
+* This file is used to set the poppler_qt4_EXPORT macros right.
+* This is needed for setting the visibility on windows, it will have no effect on other platforms.
+*/
+#if defined(_WIN32)
+# define LIB_EXPORT __declspec(dllexport)
+# define LIB_IMPORT __declspec(dllimport)
+#else
+# define LIB_EXPORT
+# define LIB_IMPORT
+#endif
+
+#ifdef poppler_qt4_EXPORTS
+# define POPPLER_QT4_EXPORT LIB_EXPORT
+#else
+# define POPPLER_QT4_EXPORT LIB_IMPORT
+#endif
diff --git a/qt4/src/poppler-fontinfo.cc b/qt4/src/poppler-fontinfo.cc
new file mode 100644 (file)
index 0000000..81aed71
--- /dev/null
@@ -0,0 +1,149 @@
+/* poppler-qt.h: qt interface to poppler
+ * Copyright (C) 2005, Net Integration Technologies, Inc.
+ * Copyright (C) 2005, Tobias Koening <tokoe@kde.org>
+ * Copyright (C) 2005, Brad Hards <bradh@frogmouth.net>
+ * Copyright (C) 2005-2008, Albert Astals Cid <aacid@kde.org>
+ * Copyright (C) 2008, 2009, Pino Toscano <pino@kde.org>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include "poppler-qt4.h"
+#include "poppler-private.h"
+
+namespace Poppler {
+
+FontInfo::FontInfo()
+{
+       m_data = new FontInfoData();
+}
+
+FontInfo::FontInfo( const FontInfoData &fid )
+{
+       m_data = new FontInfoData(fid);
+}
+
+FontInfo::FontInfo( const FontInfo &fi )
+{
+       m_data = new FontInfoData(*fi.m_data);
+}
+
+FontInfo::~FontInfo()
+{
+       delete m_data;
+}
+
+QString FontInfo::name() const
+{
+       return m_data->fontName;
+}
+
+QString FontInfo::file() const
+{
+       return m_data->fontFile;
+}
+
+bool FontInfo::isEmbedded() const
+{
+       return m_data->isEmbedded;
+}
+
+bool FontInfo::isSubset() const
+{
+       return m_data->isSubset;
+}
+
+FontInfo::Type FontInfo::type() const
+{
+       return m_data->type;
+}
+
+QString FontInfo::typeName() const
+{
+       switch (type()) {
+       case unknown:
+               return QObject::tr("unknown");
+       case Type1:
+               return QObject::tr("Type 1");
+       case Type1C:
+               return QObject::tr("Type 1C");
+       case Type3:
+               return QObject::tr("Type 3");
+       case TrueType:
+               return QObject::tr("TrueType");
+       case CIDType0:
+               return QObject::tr("CID Type 0");
+       case CIDType0C:
+               return QObject::tr("CID Type 0C");
+       case CIDTrueType:
+               return QObject::tr("CID TrueType");
+       case Type1COT:
+               return QObject::tr("Type 1C (OpenType)");
+       case TrueTypeOT:
+               return QObject::tr("TrueType (OpenType)");
+       case CIDType0COT:
+               return QObject::tr("CID Type 0C (OpenType)");
+       case CIDTrueTypeOT:
+               return QObject::tr("CID TrueType (OpenType)");
+       }
+       return QObject::tr("Bug: unexpected font type. Notify poppler mailing list!");
+}
+
+FontInfo& FontInfo::operator=( const FontInfo &fi )
+{
+       if (this == &fi)
+               return *this;
+
+       *m_data = *fi.m_data;
+       return *this;
+}
+
+
+FontIterator::FontIterator( int startPage, DocumentData *dd )
+       : d( new FontIteratorData( startPage, dd ) )
+{
+}
+
+FontIterator::~FontIterator()
+{
+       delete d;
+}
+
+QList<FontInfo> FontIterator::next()
+{
+       ++d->currentPage;
+
+       QList<FontInfo> fonts;
+       GooList *items = d->fontInfoScanner.scan( 1 );
+       if ( !items )
+               return fonts;
+       for ( int i = 0; i < items->getLength(); ++i ) {
+               fonts.append( FontInfo( FontInfoData( ( ::FontInfo* )items->get( i ) ) ) );
+       }
+       deleteGooList( items, ::FontInfo );
+       return fonts;
+}
+
+bool FontIterator::hasNext() const
+{
+       return ( d->currentPage + 1 ) < d->totalPages;
+}
+
+int FontIterator::currentPage() const
+{
+       return d->currentPage;
+}
+
+}
diff --git a/qt4/src/poppler-form.cc b/qt4/src/poppler-form.cc
new file mode 100644 (file)
index 0000000..82309ff
--- /dev/null
@@ -0,0 +1,386 @@
+/* poppler-form.h: qt4 interface to poppler
+ * Copyright (C) 2007-2008, 2011, Pino Toscano <pino@kde.org>
+ * Copyright (C) 2008, 2011, 2012 Albert Astals Cid <aacid@kde.org>
+ * Copyright (C) 2011 Carlos Garcia Campos <carlosgc@gnome.org>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include "poppler-qt4.h"
+
+#include <QtCore/QSizeF>
+
+#include <Form.h>
+#include <Object.h>
+#include <Link.h>
+
+#include "poppler-form.h"
+#include "poppler-page-private.h"
+#include "poppler-private.h"
+#include "poppler-annotation-helper.h"
+
+#include <math.h>
+
+namespace {
+
+Qt::Alignment formTextAlignment(::FormWidget *fm)
+{
+  Qt::Alignment qtalign = Qt::AlignLeft;
+  switch (fm->getField()->getTextQuadding())
+  {
+    case quaddingCentered:
+      qtalign = Qt::AlignHCenter;
+      break;
+    case quaddingRightJustified:
+      qtalign = Qt::AlignRight;
+      break;
+    case quaddingLeftJustified:
+      qtalign = Qt::AlignLeft;
+  }
+  return qtalign;
+}
+
+}
+
+namespace Poppler {
+
+FormField::FormField(FormFieldData &dd)
+  : m_formData(&dd)
+{
+  const int rotation = m_formData->page->getRotate();
+  // reading the coords
+  double left, top, right, bottom;
+  m_formData->fm->getRect(&left, &bottom, &right, &top);
+  // build a normalized transform matrix for this page at 100% scale
+  GfxState gfxState( 72.0, 72.0, m_formData->page->getCropBox(), rotation, gTrue );
+  double * gfxCTM = gfxState.getCTM();
+  double MTX[6];
+  double pageWidth = m_formData->page->getCropWidth();
+  double pageHeight = m_formData->page->getCropHeight();
+  // landscape and seascape page rotation: be sure to use the correct (== rotated) page size
+  if (((rotation / 90) % 2) == 1)
+    qSwap(pageWidth, pageHeight);
+  for ( int i = 0; i < 6; i+=2 )
+  {
+    MTX[i] = gfxCTM[i] / pageWidth;
+    MTX[i+1] = gfxCTM[i+1] / pageHeight;
+  }
+  QPointF topLeft;
+  XPDFReader::transform( MTX, qMin( left, right ), qMax( top, bottom ), topLeft );
+  QPointF bottomRight;
+  XPDFReader::transform( MTX, qMax( left, right ), qMin( top, bottom ), bottomRight );
+  m_formData->box = QRectF(topLeft, QSizeF(bottomRight.x() - topLeft.x(), bottomRight.y() - topLeft.y()));
+}
+
+FormField::~FormField()
+{
+  delete m_formData;
+  m_formData = 0;
+}
+
+QRectF FormField::rect() const
+{
+  return m_formData->box;
+}
+
+int FormField::id() const
+{
+  return m_formData->fm->getID();
+}
+
+QString FormField::name() const
+{
+  QString name;
+  if (GooString *goo = m_formData->fm->getPartialName())
+  {
+    name = QString::fromLatin1(goo->getCString());
+  }
+  return name;
+}
+
+QString FormField::fullyQualifiedName() const
+{
+  QString name;
+  if (GooString *goo = m_formData->fm->getFullyQualifiedName())
+  {
+    name = UnicodeParsedString(goo);
+  }
+  return name;
+}
+
+QString FormField::uiName() const
+{
+  QString name;
+  if (GooString *goo = m_formData->fm->getAlternateUiName())
+  {
+    name = QString::fromLatin1(goo->getCString());
+  }
+  return name;
+}
+
+bool FormField::isReadOnly() const
+{
+  return m_formData->fm->isReadOnly();
+}
+
+bool FormField::isVisible() const
+{
+  return !(m_formData->fm->getWidgetAnnotation()->getFlags() & Annot::flagHidden);
+}
+
+Link* FormField::activationAction() const
+{
+  Link* action = 0;
+  if (::LinkAction *act = m_formData->fm->getActivationAction())
+  {
+    action = PageData::convertLinkActionToLink(act, m_formData->doc, QRectF());
+  }
+  return action;
+}
+
+
+FormFieldButton::FormFieldButton(DocumentData *doc, ::Page *p, ::FormWidgetButton *w)
+  : FormField(*new FormFieldData(doc, p, w))
+{
+}
+
+FormFieldButton::~FormFieldButton()
+{
+}
+
+FormFieldButton::FormType FormFieldButton::type() const
+{
+  return FormField::FormButton;
+}
+
+FormFieldButton::ButtonType FormFieldButton::buttonType() const
+{
+  FormWidgetButton* fwb = static_cast<FormWidgetButton*>(m_formData->fm);
+  switch (fwb->getButtonType())
+  {
+    case formButtonCheck:
+      return FormFieldButton::CheckBox;
+      break;
+    case formButtonPush:
+      return FormFieldButton::Push;
+      break;
+    case formButtonRadio:
+      return FormFieldButton::Radio;
+      break;
+  }
+  return FormFieldButton::CheckBox;
+}
+
+QString FormFieldButton::caption() const
+{
+  FormWidgetButton* fwb = static_cast<FormWidgetButton*>(m_formData->fm);
+  QString ret;
+  if (fwb->getButtonType() == formButtonPush)
+  {
+    Dict *dict = m_formData->fm->getObj()->getDict();
+    Object obj1;
+    if (dict->lookup("MK", &obj1)->isDict())
+    {
+      AnnotAppearanceCharacs appearCharacs(obj1.getDict());
+      if (appearCharacs.getNormalCaption())
+      {
+        ret = UnicodeParsedString(appearCharacs.getNormalCaption());
+      }
+    }
+    obj1.free();
+  }
+  else
+  {
+    if (const char *goo = fwb->getOnStr())
+    {
+      ret = QString::fromUtf8(goo);
+    }
+  }
+  return ret;
+}
+
+bool FormFieldButton::state() const
+{
+  FormWidgetButton* fwb = static_cast<FormWidgetButton*>(m_formData->fm);
+  return fwb->getState();
+}
+
+void FormFieldButton::setState( bool state )
+{
+  FormWidgetButton* fwb = static_cast<FormWidgetButton*>(m_formData->fm);
+  fwb->setState((GBool)state);
+}
+
+QList<int> FormFieldButton::siblings() const
+{
+  FormWidgetButton* fwb = static_cast<FormWidgetButton*>(m_formData->fm);
+  if (fwb->getButtonType() == formButtonPush)
+    return QList<int>();
+
+  QList<int> ret;
+  unsigned *sibls = fwb->getSiblingsID();
+  for (int i = 0; i < fwb->getNumSiblingsID(); ++i)
+    ret.append(sibls[i]);
+
+  return ret;
+}
+
+
+FormFieldText::FormFieldText(DocumentData *doc, ::Page *p, ::FormWidgetText *w)
+  : FormField(*new FormFieldData(doc, p, w))
+{
+}
+
+FormFieldText::~FormFieldText()
+{
+}
+
+FormField::FormType FormFieldText::type() const
+{
+  return FormField::FormText;
+}
+
+FormFieldText::TextType FormFieldText::textType() const
+{
+  FormWidgetText* fwt = static_cast<FormWidgetText*>(m_formData->fm);
+  if (fwt->isFileSelect())
+    return FormFieldText::FileSelect;
+  else if (fwt->isMultiline())
+    return FormFieldText::Multiline;
+  return FormFieldText::Normal;
+}
+
+QString FormFieldText::text() const
+{
+  GooString *goo = static_cast<FormWidgetText*>(m_formData->fm)->getContent();
+  return UnicodeParsedString(goo);
+}
+
+void FormFieldText::setText( const QString& text )
+{
+  FormWidgetText* fwt = static_cast<FormWidgetText*>(m_formData->fm);
+  GooString * goo = QStringToUnicodeGooString( text );
+  fwt->setContent( goo );
+  delete goo;
+}
+
+bool FormFieldText::isPassword() const
+{
+  FormWidgetText* fwt = static_cast<FormWidgetText*>(m_formData->fm);
+  return fwt->isPassword();
+}
+
+bool FormFieldText::isRichText() const
+{
+  FormWidgetText* fwt = static_cast<FormWidgetText*>(m_formData->fm);
+  return fwt->isRichText();
+}
+
+int FormFieldText::maximumLength() const
+{
+  FormWidgetText* fwt = static_cast<FormWidgetText*>(m_formData->fm);
+  const int maxlen = fwt->getMaxLen();
+  return maxlen > 0 ? maxlen : -1;
+}
+
+Qt::Alignment FormFieldText::textAlignment() const
+{
+  return formTextAlignment(m_formData->fm);
+}
+
+bool FormFieldText::canBeSpellChecked() const
+{
+  FormWidgetText* fwt = static_cast<FormWidgetText*>(m_formData->fm);
+  return !fwt->noSpellCheck();
+}
+
+
+FormFieldChoice::FormFieldChoice(DocumentData *doc, ::Page *p, ::FormWidgetChoice *w)
+  : FormField(*new FormFieldData(doc, p, w))
+{
+}
+
+FormFieldChoice::~FormFieldChoice()
+{
+}
+
+FormFieldChoice::FormType FormFieldChoice::type() const
+{
+  return FormField::FormChoice;
+}
+
+FormFieldChoice::ChoiceType FormFieldChoice::choiceType() const
+{
+  FormWidgetChoice* fwc = static_cast<FormWidgetChoice*>(m_formData->fm);
+  if (fwc->isCombo())
+    return FormFieldChoice::ComboBox;
+  return FormFieldChoice::ListBox;
+}
+
+QStringList FormFieldChoice::choices() const
+{
+  FormWidgetChoice* fwc = static_cast<FormWidgetChoice*>(m_formData->fm);
+  QStringList ret;
+  int num = fwc->getNumChoices();
+  for (int i = 0; i < num; ++i)
+  {
+    ret.append(UnicodeParsedString(fwc->getChoice(i)));
+  }
+  return ret;
+}
+
+bool FormFieldChoice::isEditable() const
+{
+  FormWidgetChoice* fwc = static_cast<FormWidgetChoice*>(m_formData->fm);
+  return fwc->isCombo() ? fwc->hasEdit() : false;
+}
+
+bool FormFieldChoice::multiSelect() const
+{
+  FormWidgetChoice* fwc = static_cast<FormWidgetChoice*>(m_formData->fm);
+  return !fwc->isCombo() ? fwc->isMultiSelect() : false;
+}
+
+QList<int> FormFieldChoice::currentChoices() const
+{
+  FormWidgetChoice* fwc = static_cast<FormWidgetChoice*>(m_formData->fm);
+  int num = fwc->getNumChoices();
+  QList<int> choices;
+  for ( int i = 0; i < num; ++i )
+    if ( fwc->isSelected( i ) )
+      choices.append( i );
+  return choices;
+}
+
+void FormFieldChoice::setCurrentChoices( const QList<int> &choice )
+{
+  FormWidgetChoice* fwc = static_cast<FormWidgetChoice*>(m_formData->fm);
+  fwc->deselectAll();
+  for ( int i = 0; i < choice.count(); ++i )
+    fwc->select( choice.at( i ) );
+}
+
+Qt::Alignment FormFieldChoice::textAlignment() const
+{
+  return formTextAlignment(m_formData->fm);
+}
+
+bool FormFieldChoice::canBeSpellChecked() const
+{
+  FormWidgetChoice* fwc = static_cast<FormWidgetChoice*>(m_formData->fm);
+  return !fwc->noSpellCheck();
+}
+
+}
diff --git a/qt4/src/poppler-form.h b/qt4/src/poppler-form.h
new file mode 100644 (file)
index 0000000..9af367b
--- /dev/null
@@ -0,0 +1,328 @@
+/* poppler-form.h: qt4 interface to poppler
+ * Copyright (C) 2007-2008, Pino Toscano <pino@kde.org>
+ * Copyright (C) 2008, 2011, Albert Astals Cid <aacid@kde.org>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#ifndef _POPPLER_QT4_FORM_H_
+#define _POPPLER_QT4_FORM_H_
+
+#include <QtCore/QRectF>
+#include <QtCore/QStringList>
+#include "poppler-export.h"
+
+class Page;
+class FormWidget;
+class FormWidgetButton;
+class FormWidgetText;
+class FormWidgetChoice;
+
+namespace Poppler {
+
+    class DocumentData;
+    class Link;
+
+    class FormFieldData;
+    /**
+      The base class representing a form field.
+
+      \since 0.6
+     */
+    class POPPLER_QT4_EXPORT FormField {
+    public:
+
+       /**
+          The different types of form field.
+       */
+       enum FormType {
+           FormButton,    ///< A button field. See \ref Poppler::FormFieldButton::ButtonType "ButtonType"
+           FormText,      ///< A text field. See \ref Poppler::FormFieldText::TextType "TextType"
+           FormChoice,    ///< A single choice field. See \ref Poppler::FormFieldChoice::ChoiceType "ChoiceType"
+           FormSignature  ///< A signature field.
+       };
+
+       virtual ~FormField();
+
+       /**
+         The type of the field.
+        */
+       virtual FormType type() const = 0;
+
+       /**
+          \return The size of the field, in normalized coordinates, i.e.
+          [0..1] with regard to the dimensions (cropbox) of the page
+       */
+       QRectF rect() const;
+
+       /**
+         The ID of the field.
+        */
+       int id() const;
+
+       /**
+         The internal name of the field.
+        */
+       QString name() const;
+       
+       /**
+         The internal fully qualified name of the field.
+         \since 0.18
+        */
+       QString fullyQualifiedName() const;
+
+       /**
+         The name of the field to be used in user interface (eg messages to
+         the user).
+        */
+       QString uiName() const;
+
+       /**
+         Whether this form field is read-only.
+        */
+       bool isReadOnly() const;
+
+       /**
+         Whether this form field is visible.
+        */
+       bool isVisible() const;
+
+       /**
+         The activation action of this form field.
+
+         \note It may be null.
+        */
+       Link* activationAction() const;
+
+    protected:
+       /// \cond PRIVATE
+       FormField(FormFieldData &dd);
+
+       FormFieldData *m_formData;
+       /// \endcond
+
+    private:
+       Q_DISABLE_COPY(FormField)
+    };
+
+    /**
+      A form field that represents a "button".
+
+      \since 0.8
+     */
+    class POPPLER_QT4_EXPORT FormFieldButton : public FormField {
+    public:
+
+       /**
+        * The types of button field.
+        */
+       enum ButtonType
+       {
+           Push,          ///< A simple push button.
+           CheckBox,      ///< A check box.
+           Radio          ///< A radio button.
+       };
+
+       /// \cond PRIVATE
+       FormFieldButton(DocumentData *doc, ::Page *p, ::FormWidgetButton *w);
+       /// \endcond
+       virtual ~FormFieldButton();
+
+       virtual FormType type() const;
+
+       /**
+         The particular type of the button field.
+        */
+       ButtonType buttonType() const;
+
+       /**
+        * The caption to be used for the button.
+        */
+       QString caption() const;
+
+       /**
+         The state of the button.
+        */
+       bool state() const;
+
+       /**
+         Sets the state of the button to the new \p state .
+        */
+       void setState( bool state );
+
+       /**
+         The list with the IDs of siblings (ie, buttons belonging to the same
+         group as the current one.
+
+         Valid only for \ref Radio buttons, an empty list otherwise.
+        */
+       QList<int> siblings() const;
+
+    private:
+       Q_DISABLE_COPY(FormFieldButton)
+    };
+
+    /**
+      A form field that represents a text input.
+
+      \since 0.6
+     */
+    class POPPLER_QT4_EXPORT FormFieldText : public FormField {
+    public:
+
+       /**
+          The particular type of this text field.
+       */
+       enum TextType {
+           Normal,        ///< A simple singleline text field.
+           Multiline,     ///< A multiline text field.
+           FileSelect     ///< An input field to select the path of a file on disk.
+       };
+
+       /// \cond PRIVATE
+       FormFieldText(DocumentData *doc, ::Page *p, ::FormWidgetText *w);
+       /// \endcond
+       virtual ~FormFieldText();
+
+       virtual FormType type() const;
+
+       /**
+         The text type of the text field.
+        */
+       TextType textType() const;
+
+       /**
+         The text associated with the text field.
+        */
+       QString text() const;
+
+       /**
+         Sets the text associated with the text field to the specified
+         \p text.
+        */
+       void setText( const QString& text );
+
+       /**
+         Whether this text field is a password input, eg its text \b must be
+         replaced with asterisks.
+
+         Always false for \ref FileSelect text fields.
+        */
+       bool isPassword() const;
+
+       /**
+         Whether this text field should allow rich text.
+        */
+       bool isRichText() const;
+
+       /**
+         The maximum length for the text of this field, or -1 if not set.
+        */
+       int maximumLength() const;
+
+       /**
+         The horizontal alignment for the text of this text field.
+        */
+       Qt::Alignment textAlignment() const;
+
+       /**
+         Whether the text inserted manually in the field (where possible)
+         can be spell-checked.
+        */
+       bool canBeSpellChecked() const;
+
+    private:
+       Q_DISABLE_COPY(FormFieldText)
+    };
+
+    /**
+      A form field that represents a choice field.
+
+      \since 0.6
+     */
+    class POPPLER_QT4_EXPORT FormFieldChoice : public FormField {
+    public:
+
+       /**
+          The particular type of this choice field.
+       */
+       enum ChoiceType {
+           ComboBox,     ///< A simple singleline text field.
+           ListBox       ///< A multiline text field.
+       };
+
+       /// \cond PRIVATE
+       FormFieldChoice(DocumentData *doc, ::Page *p, ::FormWidgetChoice *w);
+       /// \endcond
+       virtual ~FormFieldChoice();
+
+       virtual FormType type() const;
+
+       /**
+         The choice type of the choice field.
+        */
+       ChoiceType choiceType() const;
+
+       /**
+         The possible choices of the choice field.
+        */
+       QStringList choices() const;
+
+       /**
+         Whether this FormFieldChoice::ComboBox is editable, i.e. the user
+         can type in a custom value.
+
+         Always false for the other types of choices.
+        */
+       bool isEditable() const;
+
+       /**
+         Whether more than one choice of this FormFieldChoice::ListBox
+         can be selected at the same time.
+
+         Always false for the other types of choices.
+        */
+       bool multiSelect() const;
+
+       /**
+         The currently selected choices.
+        */
+       QList<int> currentChoices() const;
+
+       /**
+         Sets the selected choices to \p choice.
+        */
+       void setCurrentChoices( const QList<int> &choice );
+
+       /**
+         The horizontal alignment for the text of this text field.
+        */
+       Qt::Alignment textAlignment() const;
+
+       /**
+         Whether the text inserted manually in the field (where possible)
+         can be spell-checked.
+
+          Returns false if the field is not an editable text field.
+        */
+       bool canBeSpellChecked() const;
+
+    private:
+       Q_DISABLE_COPY(FormFieldChoice)
+    };
+
+}
+
+#endif
diff --git a/qt4/src/poppler-link-extractor-private.h b/qt4/src/poppler-link-extractor-private.h
new file mode 100644 (file)
index 0000000..32ddd03
--- /dev/null
@@ -0,0 +1,57 @@
+/* poppler-link-extractor_p.h: qt interface to poppler
+ * Copyright (C) 2007, 2008, 2011, Pino Toscano <pino@kde.org>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#ifndef _POPPLER_LINK_EXTRACTOR_H_
+#define _POPPLER_LINK_EXTRACTOR_H_
+
+#include <Object.h>
+#include <OutputDev.h>
+
+#include <QtCore/QList>
+
+namespace Poppler
+{
+
+class Link;
+class PageData;
+
+class LinkExtractorOutputDev : public OutputDev
+{
+  public:
+    LinkExtractorOutputDev(PageData *data);
+    virtual ~LinkExtractorOutputDev();
+
+    // inherited from OutputDev
+    virtual GBool upsideDown() { return gFalse; }
+    virtual GBool useDrawChar() { return gFalse; }
+    virtual GBool interpretType3Chars() { return gFalse; }
+    virtual void processLink(::AnnotLink *link);
+
+    // our stuff
+    QList< Link* > links();
+
+  private:
+    PageData *m_data;
+    double m_pageCropWidth;
+    double m_pageCropHeight;
+    QList< Link* > m_links;
+};
+
+}
+
+#endif
diff --git a/qt4/src/poppler-link-extractor.cc b/qt4/src/poppler-link-extractor.cc
new file mode 100644 (file)
index 0000000..0b1563b
--- /dev/null
@@ -0,0 +1,84 @@
+/* poppler-link-extractor_p.h: qt interface to poppler
+ * Copyright (C) 2007, 2008, 2011, Pino Toscano <pino@kde.org>
+ * Copyright (C) 2008, Albert Astals Cid <aacid@kde.org>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include "poppler-link-extractor-private.h"
+
+#include <GfxState.h>
+#include <Link.h>
+#include <Object.h>
+#include <Page.h>
+#include <Annot.h>
+
+#include "poppler-qt4.h"
+#include "poppler-page-private.h"
+
+namespace Poppler
+{
+
+LinkExtractorOutputDev::LinkExtractorOutputDev(PageData *data)
+  : m_data(data)
+{
+  Q_ASSERT(m_data);
+  ::Page *popplerPage = m_data->page;
+  m_pageCropWidth = popplerPage->getCropWidth();
+  m_pageCropHeight = popplerPage->getCropHeight();
+  if (popplerPage->getRotate() == 90 || popplerPage->getRotate() == 270)
+    qSwap(m_pageCropWidth, m_pageCropHeight);
+  GfxState gfxState(72.0, 72.0, popplerPage->getCropBox(), popplerPage->getRotate(), gTrue);
+  setDefaultCTM(gfxState.getCTM());
+}
+
+LinkExtractorOutputDev::~LinkExtractorOutputDev()
+{
+  qDeleteAll(m_links);
+}
+
+void LinkExtractorOutputDev::processLink(::AnnotLink *link)
+{
+  if (!link->isOk())
+    return;
+
+  double left, top, right, bottom;
+  int leftAux, topAux, rightAux, bottomAux;
+  link->getRect(&left, &top, &right, &bottom);
+  QRectF linkArea;
+
+  cvtUserToDev(left, top, &leftAux, &topAux);
+  cvtUserToDev(right, bottom, &rightAux, &bottomAux);
+  linkArea.setLeft((double)leftAux / m_pageCropWidth);
+  linkArea.setTop((double)topAux / m_pageCropHeight);
+  linkArea.setRight((double)rightAux / m_pageCropWidth);
+  linkArea.setBottom((double)bottomAux / m_pageCropHeight);
+
+  Link *popplerLink = m_data->convertLinkActionToLink(link->getAction(), linkArea);
+  if (popplerLink)
+  {
+    m_links.append(popplerLink);
+  }
+  OutputDev::processLink(link);
+}
+
+QList< Link* > LinkExtractorOutputDev::links()
+{
+  QList< Link* > ret = m_links;
+  m_links.clear();
+  return ret;
+}
+
+}
diff --git a/qt4/src/poppler-link.cc b/qt4/src/poppler-link.cc
new file mode 100644 (file)
index 0000000..a4bc55b
--- /dev/null
@@ -0,0 +1,659 @@
+/* poppler-link.cc: qt interface to poppler
+ * Copyright (C) 2006-2007, Albert Astals Cid
+ * Copyright (C) 2007-2008, Pino Toscano <pino@kde.org>
+ * Copyright (C) 2010 Hib Eris <hib@hiberis.nl>
+ * Copyright (C) 2012, Tobias Koenig <tokoe@kdab.com>
+ * Copyright (C) 2012, Guillermo A. Amaral B. <gamaral@kde.org>
+ * Adapting code from
+ *   Copyright (C) 2004 by Enrico Ros <eros.kde@email.it>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include <poppler-qt4.h>
+#include <poppler-private.h>
+#include <poppler-media.h>
+
+#include <QtCore/QStringList>
+
+#include "poppler-annotation-private.h"
+
+#include "Link.h"
+#include "Rendition.h"
+
+bool operator==( const Ref &r1, const Ref &r2 )
+{
+       return r1.num == r2.num && r1.gen == r2.gen;
+}
+
+namespace Poppler {
+
+class LinkDestinationPrivate : public QSharedData
+{
+       public:
+               LinkDestinationPrivate();
+
+               LinkDestination::Kind kind; // destination type
+               QString name;
+               int pageNum; // page number
+               double left, bottom; // position
+               double right, top;
+               double zoom; // zoom factor
+               bool changeLeft : 1, changeTop : 1; // for destXYZ links, which position
+               bool changeZoom : 1; //   components to change
+};
+
+       LinkDestinationPrivate::LinkDestinationPrivate()
+       {
+               // sane defaults
+               kind = LinkDestination::destXYZ;
+               pageNum = 0;
+               left = 0;
+               bottom = 0;
+               right = 0;
+               top = 0;
+               zoom = 1;
+               changeLeft = true;
+               changeTop = true;
+               changeZoom = false;
+       }
+
+class LinkPrivate
+{
+       public:
+               LinkPrivate( const QRectF &area );
+               virtual ~LinkPrivate();
+
+               QRectF linkArea;
+};
+
+       LinkPrivate::LinkPrivate( const QRectF &area )
+               : linkArea( area )
+       {
+       }
+
+       LinkPrivate::~LinkPrivate()
+       {
+       }
+
+class LinkGotoPrivate : public LinkPrivate
+{
+       public:
+               LinkGotoPrivate( const QRectF &area, const LinkDestination &dest );
+
+               QString extFileName;
+               LinkDestination destination;
+};
+
+       LinkGotoPrivate::LinkGotoPrivate( const QRectF &area, const LinkDestination &dest )
+               : LinkPrivate( area ), destination( dest )
+       {
+       }
+
+class LinkExecutePrivate : public LinkPrivate
+{
+       public:
+               LinkExecutePrivate( const QRectF &area );
+
+               QString fileName;
+               QString parameters;
+};
+
+       LinkExecutePrivate::LinkExecutePrivate( const QRectF &area )
+               : LinkPrivate( area )
+       {
+       }
+
+class LinkBrowsePrivate : public LinkPrivate
+{
+       public:
+               LinkBrowsePrivate( const QRectF &area );
+
+               QString url;
+};
+
+       LinkBrowsePrivate::LinkBrowsePrivate( const QRectF &area )
+               : LinkPrivate( area )
+       {
+       }
+
+class LinkActionPrivate : public LinkPrivate
+{
+       public:
+               LinkActionPrivate( const QRectF &area );
+
+               LinkAction::ActionType type;
+};
+
+       LinkActionPrivate::LinkActionPrivate( const QRectF &area )
+               : LinkPrivate( area )
+       {
+       }
+
+class LinkSoundPrivate : public LinkPrivate
+{
+       public:
+               LinkSoundPrivate( const QRectF &area );
+               ~LinkSoundPrivate();
+
+               double volume;
+               bool sync : 1;
+               bool repeat : 1;
+               bool mix : 1;
+               SoundObject *sound;
+};
+
+       LinkSoundPrivate::LinkSoundPrivate( const QRectF &area )
+               : LinkPrivate( area ), sound( 0 )
+       {
+       }
+
+       LinkSoundPrivate::~LinkSoundPrivate()
+       {
+               delete sound;
+       }
+
+class LinkRenditionPrivate : public LinkPrivate
+{
+       public:
+               LinkRenditionPrivate( const QRectF &area, ::MediaRendition *rendition );
+               ~LinkRenditionPrivate();
+
+               MediaRendition *rendition;
+};
+
+       LinkRenditionPrivate::LinkRenditionPrivate( const QRectF &area, ::MediaRendition *r )
+               : LinkPrivate( area )
+               , rendition( new MediaRendition( r ) )
+       {
+       }
+
+       LinkRenditionPrivate::~LinkRenditionPrivate()
+       {
+               delete rendition;
+       }
+
+class LinkJavaScriptPrivate : public LinkPrivate
+{
+       public:
+               LinkJavaScriptPrivate( const QRectF &area );
+
+               QString js;
+};
+
+       LinkJavaScriptPrivate::LinkJavaScriptPrivate( const QRectF &area )
+               : LinkPrivate( area )
+       {
+       }
+
+class LinkMoviePrivate : public LinkPrivate
+{
+       public:
+               LinkMoviePrivate( const QRectF &area, LinkMovie::Operation operation, const QString &title, const Ref &reference );
+
+               LinkMovie::Operation operation;
+               QString annotationTitle;
+               Ref annotationReference;
+};
+
+       LinkMoviePrivate::LinkMoviePrivate( const QRectF &area, LinkMovie::Operation _operation, const QString &title, const Ref &reference  )
+               : LinkPrivate( area ), operation( _operation ), annotationTitle( title ), annotationReference( reference )
+       {
+       }
+
+       static void cvtUserToDev(::Page *page, double xu, double yu, int *xd, int *yd) {
+               double ctm[6];
+               
+               page->getDefaultCTM(ctm, 72.0, 72.0, 0, false, true);
+               *xd = (int)(ctm[0] * xu + ctm[2] * yu + ctm[4] + 0.5);
+               *yd = (int)(ctm[1] * xu + ctm[3] * yu + ctm[5] + 0.5);
+       }
+
+       LinkDestination::LinkDestination(const LinkDestinationData &data)
+               : d( new LinkDestinationPrivate )
+       {
+               bool deleteDest = false;
+               LinkDest *ld = data.ld;
+               
+               if ( data.namedDest && !ld && !data.externalDest )
+               {
+                       deleteDest = true;
+                       ld = data.doc->doc->findDest( data.namedDest );
+               }
+               // in case this destination was named one, and it was not resolved
+               if ( data.namedDest && !ld )
+               {
+                       d->name = QString::fromLatin1( data.namedDest->getCString() );
+               }
+               
+               if (!ld) return;
+               
+               if (ld->getKind() == ::destXYZ) d->kind = destXYZ;
+               else if (ld->getKind() == ::destFit) d->kind = destFit;
+               else if (ld->getKind() == ::destFitH) d->kind = destFitH;
+               else if (ld->getKind() == ::destFitV) d->kind = destFitV;
+               else if (ld->getKind() == ::destFitR) d->kind = destFitR;
+               else if (ld->getKind() == ::destFitB) d->kind = destFitB;
+               else if (ld->getKind() == ::destFitBH) d->kind = destFitBH;
+               else if (ld->getKind() == ::destFitBV) d->kind = destFitBV;
+
+               if ( !ld->isPageRef() ) d->pageNum = ld->getPageNum();
+               else
+               {
+                       Ref ref = ld->getPageRef();
+                       d->pageNum = data.doc->doc->findPage( ref.num, ref.gen );
+               }
+               double left = ld->getLeft();
+               double bottom = ld->getBottom();
+               double right = ld->getRight();
+               double top = ld->getTop();
+               d->zoom = ld->getZoom();
+               d->changeLeft = ld->getChangeLeft();
+               d->changeTop = ld->getChangeTop();
+               d->changeZoom = ld->getChangeZoom();
+               
+               int leftAux = 0, topAux = 0, rightAux = 0, bottomAux = 0;
+               
+               ::Page *page;
+               if (d->pageNum > 0 &&
+                   d->pageNum <= data.doc->doc->getNumPages() &&
+                   (page = data.doc->doc->getPage( d->pageNum )))
+               {
+                       cvtUserToDev( page, left, top, &leftAux, &topAux );
+                       cvtUserToDev( page, right, bottom, &rightAux, &bottomAux );
+                       
+                       d->left = leftAux / (double)page->getCropWidth();
+                       d->top = topAux / (double)page->getCropHeight();
+                       d->right = rightAux/ (double)page->getCropWidth();
+                       d->bottom = bottomAux / (double)page->getCropHeight();
+               }
+               else d->pageNum = 0;
+               
+               if (deleteDest) delete ld;
+       }
+       
+       LinkDestination::LinkDestination(const QString &description)
+               : d( new LinkDestinationPrivate )
+       {
+               QStringList tokens = description.split( ';' );
+               d->kind = static_cast<Kind>(tokens.at(0).toInt());
+               d->pageNum = tokens.at(1).toInt();
+               d->left = tokens.at(2).toDouble();
+               d->bottom = tokens.at(3).toDouble();
+               d->right = tokens.at(4).toDouble();
+               d->top = tokens.at(5).toDouble();
+               d->zoom = tokens.at(6).toDouble();
+               d->changeLeft = static_cast<bool>(tokens.at(7).toInt());
+               d->changeTop = static_cast<bool>(tokens.at(8).toInt());
+               d->changeZoom = static_cast<bool>(tokens.at(9).toInt());
+       }
+       
+       LinkDestination::LinkDestination(const LinkDestination &other)
+               : d( other.d )
+       {
+       }
+       
+       LinkDestination::~LinkDestination()
+       {
+       }
+       
+       LinkDestination::Kind LinkDestination::kind() const
+       {
+               return d->kind;
+       }
+       
+       int LinkDestination::pageNumber() const
+       {
+               return d->pageNum;
+       }
+       
+       double LinkDestination::left() const
+       {
+               return d->left;
+       }
+       
+       double LinkDestination::bottom() const
+       {
+               return d->bottom;
+       }
+       
+       double LinkDestination::right() const
+       {
+               return d->right;
+       }
+       
+       double LinkDestination::top() const
+       {
+               return d->top;
+       }
+       
+       double LinkDestination::zoom() const
+       {
+               return d->zoom;
+       }
+       
+       bool LinkDestination::isChangeLeft() const
+       {
+               return d->changeLeft;
+       }
+       
+       bool LinkDestination::isChangeTop() const
+       {
+               return d->changeTop;
+       }
+       
+       bool LinkDestination::isChangeZoom() const
+       {
+               return d->changeZoom;
+       }
+       
+       QString LinkDestination::toString() const
+       {
+               QString s = QString::number( (qint8)d->kind );
+               s += ";" + QString::number( d->pageNum );
+               s += ";" + QString::number( d->left );
+               s += ";" + QString::number( d->bottom );
+               s += ";" + QString::number( d->right );
+               s += ";" + QString::number( d->top );
+               s += ";" + QString::number( d->zoom );
+               s += ";" + QString::number( (qint8)d->changeLeft );
+               s += ";" + QString::number( (qint8)d->changeTop );
+               s += ";" + QString::number( (qint8)d->changeZoom );
+               return s;
+       }
+       
+       QString LinkDestination::destinationName() const
+       {
+               return d->name;
+       }
+       
+       LinkDestination& LinkDestination::operator=(const LinkDestination &other)
+       {
+               if ( this == &other )
+                       return *this;
+               
+               d = other.d;
+               return *this;
+       }
+       
+       
+       // Link
+       Link::~Link()
+       {
+               delete d_ptr;
+       }
+       
+       Link::Link(const QRectF &linkArea)
+               : d_ptr( new LinkPrivate( linkArea ) )
+       {
+       }
+       
+       Link::Link( LinkPrivate &dd )
+               : d_ptr( &dd )
+       {
+       }
+
+       Link::LinkType Link::linkType() const
+       {
+               return None;
+       }
+       
+       QRectF Link::linkArea() const
+       {
+               Q_D( const Link );
+               return d->linkArea;
+       }
+       
+       // LinkGoto
+       LinkGoto::LinkGoto( const QRectF &linkArea, QString extFileName, const LinkDestination & destination )
+               : Link( *new LinkGotoPrivate( linkArea, destination ) )
+       {
+               Q_D( LinkGoto );
+               d->extFileName = extFileName;
+       }
+       
+       LinkGoto::~LinkGoto()
+       {
+       }
+       
+       bool LinkGoto::isExternal() const
+       {
+               Q_D( const LinkGoto );
+               return !d->extFileName.isEmpty();
+       }
+       
+       QString LinkGoto::fileName() const
+       {
+               Q_D( const LinkGoto );
+               return d->extFileName;
+       }
+       
+       LinkDestination LinkGoto::destination() const
+       {
+               Q_D( const LinkGoto );
+               return d->destination;
+       }
+       
+       Link::LinkType LinkGoto::linkType() const
+       {
+               return Goto;
+       }
+       
+       // LinkExecute
+       LinkExecute::LinkExecute( const QRectF &linkArea, const QString & file, const QString & params )
+               : Link( *new LinkExecutePrivate( linkArea ) )
+       {
+               Q_D( LinkExecute );
+               d->fileName = file;
+               d->parameters = params;
+       }
+       
+       LinkExecute::~LinkExecute()
+       {
+       }
+       
+       QString LinkExecute::fileName() const
+       {
+               Q_D( const LinkExecute );
+               return d->fileName;
+       }
+       QString LinkExecute::parameters() const
+       {
+               Q_D( const LinkExecute );
+               return d->parameters;
+       }
+
+       Link::LinkType LinkExecute::linkType() const
+       {
+               return Execute;
+       }
+
+       // LinkBrowse
+       LinkBrowse::LinkBrowse( const QRectF &linkArea, const QString &url )
+               : Link( *new LinkBrowsePrivate( linkArea ) )
+       {
+               Q_D( LinkBrowse );
+               d->url = url;
+       }
+       
+       LinkBrowse::~LinkBrowse()
+       {
+       }
+       
+       QString LinkBrowse::url() const
+       {
+               Q_D( const LinkBrowse );
+               return d->url;
+       }
+       
+       Link::LinkType LinkBrowse::linkType() const
+       {
+               return Browse;
+       }
+
+       // LinkAction
+       LinkAction::LinkAction( const QRectF &linkArea, ActionType actionType )
+               : Link( *new LinkActionPrivate( linkArea ) )
+       {
+               Q_D( LinkAction );
+               d->type = actionType;
+       }
+               
+       LinkAction::~LinkAction()
+       {
+       }
+       
+       LinkAction::ActionType LinkAction::actionType() const
+       {
+               Q_D( const LinkAction );
+               return d->type;
+       }
+
+       Link::LinkType LinkAction::linkType() const
+       {
+               return Action;
+       }
+
+       // LinkSound
+       LinkSound::LinkSound( const QRectF &linkArea, double volume, bool sync, bool repeat, bool mix, SoundObject *sound )
+               : Link( *new LinkSoundPrivate( linkArea ) )
+       {
+               Q_D( LinkSound );
+               d->volume = volume;
+               d->sync = sync;
+               d->repeat = repeat;
+               d->mix = mix;
+               d->sound = sound;
+       }
+       
+       LinkSound::~LinkSound()
+       {
+       }
+       
+       Link::LinkType LinkSound::linkType() const
+       {
+               return Sound;
+       }
+
+       double LinkSound::volume() const
+       {
+               Q_D( const LinkSound );
+               return d->volume;
+       }
+
+       bool LinkSound::synchronous() const
+       {
+               Q_D( const LinkSound );
+               return d->sync;
+       }
+
+       bool LinkSound::repeat() const
+       {
+               Q_D( const LinkSound );
+               return d->repeat;
+       }
+
+       bool LinkSound::mix() const
+       {
+               Q_D( const LinkSound );
+               return d->mix;
+       }
+
+       SoundObject *LinkSound::sound() const
+       {
+               Q_D( const LinkSound );
+               return d->sound;
+       }
+
+       // LinkRendition
+       LinkRendition::LinkRendition( const QRectF &linkArea, ::MediaRendition *rendition )
+               : Link( *new LinkRenditionPrivate( linkArea, rendition ) )
+       {
+       }
+       
+       LinkRendition::~LinkRendition()
+       {
+       }
+       
+       Link::LinkType LinkRendition::linkType() const
+       {
+               return Rendition;
+       }
+       
+       MediaRendition * LinkRendition::rendition() const
+       {
+               Q_D( const LinkRendition );
+               return d->rendition;
+       }
+
+       // LinkJavaScript
+       LinkJavaScript::LinkJavaScript( const QRectF &linkArea, const QString &js )
+               : Link( *new LinkJavaScriptPrivate( linkArea ) )
+       {
+               Q_D( LinkJavaScript );
+               d->js = js;
+       }
+       
+       LinkJavaScript::~LinkJavaScript()
+       {
+       }
+       
+       Link::LinkType LinkJavaScript::linkType() const
+       {
+               return JavaScript;
+       }
+       
+       QString LinkJavaScript::script() const
+       {
+               Q_D( const LinkJavaScript );
+               return d->js;
+       }
+
+       // LinkMovie
+       LinkMovie::LinkMovie( const QRectF &linkArea, Operation operation, const QString &annotationTitle, const Ref &annotationReference )
+               : Link( *new LinkMoviePrivate( linkArea, operation, annotationTitle, annotationReference ) )
+       {
+       }
+       
+       LinkMovie::~LinkMovie()
+       {
+       }
+       
+       Link::LinkType LinkMovie::linkType() const
+       {
+               return Movie;
+       }
+       
+       LinkMovie::Operation LinkMovie::operation() const
+       {
+               Q_D( const LinkMovie );
+               return d->operation;
+       }
+
+       bool LinkMovie::isReferencedAnnotation( const MovieAnnotation *annotation ) const
+       {
+               Q_D( const LinkMovie );
+               if ( d->annotationReference.num != -1 && d->annotationReference == annotation->d_ptr->pdfObjectReference() )
+               {
+                       return true;
+               }
+               else if ( !d->annotationTitle.isNull() )
+               {
+                       return ( annotation->movieTitle() == d->annotationTitle );
+               }
+
+               return false;
+       }
+}
diff --git a/qt4/src/poppler-link.h b/qt4/src/poppler-link.h
new file mode 100644 (file)
index 0000000..a2ef2d3
--- /dev/null
@@ -0,0 +1,562 @@
+/* poppler-link.h: qt interface to poppler
+ * Copyright (C) 2006, Albert Astals Cid <aacid@kde.org>
+ * Copyright (C) 2007-2008, 2010, Pino Toscano <pino@kde.org>
+ * Copyright (C) 2010, 2012, Guillermo Amaral <gamaral@kdab.com>
+ * Copyright (C) 2012, Tobias Koenig <tokoe@kdab.com>
+ * Adapting code from
+ *   Copyright (C) 2004 by Enrico Ros <eros.kde@email.it>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#ifndef _POPPLER_LINK_H_
+#define _POPPLER_LINK_H_
+
+#include <QtCore/QString>
+#include <QtCore/QRectF>
+#include <QtCore/QSharedDataPointer>
+#include "poppler-export.h"
+
+struct Ref;
+class MediaRendition;
+
+namespace Poppler {
+
+class LinkPrivate;
+class LinkGotoPrivate;
+class LinkExecutePrivate;
+class LinkBrowsePrivate;
+class LinkActionPrivate;
+class LinkSoundPrivate;
+class LinkJavaScriptPrivate;
+class LinkMoviePrivate;
+class LinkDestinationData;
+class LinkDestinationPrivate;
+class LinkRenditionPrivate;
+class MediaRendition;
+class SoundObject;
+
+/**
+ * \short A destination.
+ *
+ * The LinkDestination class represent a "destination" (in terms of visual
+ * viewport to be displayed) for \link Poppler::LinkGoto GoTo\endlink links,
+ * and items in the table of contents (TOC) of a document.
+ *
+ * Coordinates are in 0..1 range
+ */
+class POPPLER_QT4_EXPORT LinkDestination
+{
+       public:
+               /**
+                * The possible kind of "viewport destination".
+                */
+               enum Kind
+               {
+                       /**
+                        * The new viewport is specified in terms of:
+                        * - possibile new left coordinate (see isChangeLeft() )
+                        * - possibile new top coordinate (see isChangeTop() )
+                        * - possibile new zoom level (see isChangeZoom() )
+                        */
+                       destXYZ = 1,
+                       destFit = 2,
+                       destFitH = 3,
+                       destFitV = 4,
+                       destFitR = 5,
+                       destFitB = 6,
+                       destFitBH = 7,
+                       destFitBV = 8
+               };
+
+               /// \cond PRIVATE
+               LinkDestination(const LinkDestinationData &data);
+               LinkDestination(const QString &description);
+               /// \endcond
+               /**
+                * Copy constructor.
+                */
+               LinkDestination(const LinkDestination &other);
+               /**
+                * Destructor.
+                */
+               ~LinkDestination();
+
+               // Accessors.
+               /**
+                * The kind of destination.
+                */
+               Kind kind() const;
+               /**
+                * Which page is the target of this destination.
+                *
+                * \note this number is 1-based, so for a 5 pages document the
+                *       valid page numbers go from 1 to 5 (both included).
+                */
+               int pageNumber() const;
+               /**
+                * The new left for the viewport of the target page, in case
+                * it is specified to be changed (see isChangeLeft() )
+                */
+               double left() const;
+               double bottom() const;
+               double right() const;
+               /**
+                * The new top for the viewport of the target page, in case
+                * it is specified to be changed (see isChangeTop() )
+                */
+               double top() const;
+               double zoom() const;
+               /**
+                * Whether the left of the viewport on the target page should
+                * be changed.
+                *
+                * \see left()
+                */
+               bool isChangeLeft() const;
+               /**
+                * Whether the top of the viewport on the target page should
+                * be changed.
+                *
+                * \see top()
+                */
+               bool isChangeTop() const;
+               /**
+                * Whether the zoom level should be changed.
+                *
+                * \see zoom()
+                */
+               bool isChangeZoom() const;
+
+               /**
+                * Return a string repesentation of this destination.
+                */
+               QString toString() const;
+
+               /**
+                * Return the name of this destination.
+                *
+                * \since 0.12
+                */
+               QString destinationName() const;
+
+               /**
+                * Assignment operator.
+                */
+               LinkDestination& operator=(const LinkDestination &other);
+
+       private:
+               QSharedDataPointer< LinkDestinationPrivate > d;
+};
+
+/**
+ * \short Encapsulates data that describes a link.
+ *
+ * This is the base class for links. It makes mandatory for inherited
+ * kind of links to reimplement the linkType() method and return the type of
+ * the link described by the reimplemented class.
+ */
+class POPPLER_QT4_EXPORT Link
+{
+       public:
+               /// \cond PRIVATE
+               Link( const QRectF &linkArea );
+               /// \endcond
+               
+               /**
+                * The possible kinds of link.
+                *
+                * Inherited classes must return an unique identifier
+                */
+               enum LinkType
+               {
+                   None,     ///< Unknown link
+                   Goto,     ///< A "Go To" link
+                   Execute,  ///< A command to be executed
+                   Browse,   ///< An URL to be browsed (eg "http://poppler.freedesktop.org")
+                   Action,   ///< A "standard" action to be executed in the viewer
+                   Sound,    ///< A link representing a sound to be played
+                   Movie,    ///< An action to be executed on a movie
+                   Rendition,    ///< A rendition link \since 0.20
+                   JavaScript    ///< A JavaScript code to be interpreted \since 0.10
+               };
+
+               /**
+                * The type of this link.
+                */
+               virtual LinkType linkType() const;
+
+               /**
+                * Destructor.
+                */
+               virtual ~Link();
+               
+               /**
+                * The area of a Page where the link should be active.
+                *
+                * \note this can be a null rect, in this case the link represents
+                * a general action. The area is given in 0..1 range
+                */
+               QRectF linkArea() const;
+               
+       protected:
+               /// \cond PRIVATE
+               Link( LinkPrivate &dd );
+               Q_DECLARE_PRIVATE( Link )
+               LinkPrivate *d_ptr;
+               /// \endcond
+               
+       private:
+               Q_DISABLE_COPY( Link )
+};
+
+
+/**
+ * \brief Viewport reaching request.
+ *
+ * With a LinkGoto link, the document requests the specified viewport to be
+ * reached (aka, displayed in a viewer). Furthermore, if a file name is specified,
+ * then the destination refers to that document (and not to the document the
+ * current LinkGoto belongs to).
+ */
+class POPPLER_QT4_EXPORT LinkGoto : public Link
+{
+       public:
+               /**
+                * Create a new Goto link.
+                *
+                * \param linkArea the active area of the link
+                * \param extFileName if not empty, the file name to be open
+                * \param destination the destination to be reached
+                */
+               LinkGoto( const QRectF &linkArea, QString extFileName, const LinkDestination & destination );
+               /**
+                * Destructor.
+                */
+               ~LinkGoto();
+
+               /**
+                * Whether the destination is in an external document
+                * (i.e. not the current document)
+                */
+               bool isExternal() const;
+               // query for goto parameters
+               /**
+                * The file name of the document the destination() refers to,
+                * or an empty string in case it refers to the current document.
+                */
+               QString fileName() const;
+               /**
+                * The destination to reach.
+                */
+               LinkDestination destination() const;
+               LinkType linkType() const;
+
+       private:
+               Q_DECLARE_PRIVATE( LinkGoto )
+               Q_DISABLE_COPY( LinkGoto )
+};
+
+/**
+ * \brief Generic execution request.
+ *
+ * The LinkExecute link represent a "file name" execution request. The result
+ * depends on the \link fileName() file name\endlink:
+ * - if it is a document, then it is requested to be open
+ * - otherwise, it represents an executable to be run with the specified parameters
+ */
+class POPPLER_QT4_EXPORT LinkExecute : public Link
+{
+       public:
+               /**
+                * The file name to be executed
+                */
+               QString fileName() const;
+               /**
+                * The parameters for the command.
+                */
+               QString parameters() const;
+
+               /**
+                * Create a new Execute link.
+                *
+                * \param linkArea the active area of the link
+                * \param file the file name to be open, or the program to be execute
+                * \param params the parameters for the program to execute
+                */
+               LinkExecute( const QRectF &linkArea, const QString & file, const QString & params );
+               /**
+                * Destructor.
+                */
+               ~LinkExecute();
+               LinkType linkType() const;
+
+       private:
+               Q_DECLARE_PRIVATE( LinkExecute )
+               Q_DISABLE_COPY( LinkExecute )
+};
+
+/**
+ * \brief An URL to browse.
+ *
+ * The LinkBrowse link holds a URL (eg 'http://poppler.freedesktop.org',
+ * 'mailto:john@some.org', etc) to be open.
+ *
+ * The format of the URL is specified by RFC 2396 (http://www.ietf.org/rfc/rfc2396.txt)
+ */
+class POPPLER_QT4_EXPORT LinkBrowse : public Link
+{
+       public:
+               /**
+                * The URL to open
+                */
+               QString url() const;
+
+               /**
+                * Create a new browse link.
+                *
+                * \param linkArea the active area of the link
+                * \param url the URL to be open
+                */
+               LinkBrowse( const QRectF &linkArea, const QString &url );
+               /**
+                * Destructor.
+                */
+               ~LinkBrowse();
+               LinkType linkType() const;
+
+       private:
+               Q_DECLARE_PRIVATE( LinkBrowse )
+               Q_DISABLE_COPY( LinkBrowse )
+};     
+
+/**
+ * \brief "Standard" action request.
+ *
+ * The LinkAction class represents a link that request a "standard" action
+ * to be performed by the viewer on the displayed document.
+ */
+class POPPLER_QT4_EXPORT LinkAction : public Link
+{
+       public:
+               /**
+                * The possible types of actions
+                */
+               enum ActionType { PageFirst = 1,
+                                 PagePrev = 2,
+                                 PageNext = 3,
+                                 PageLast = 4,
+                                 HistoryBack = 5,
+                                 HistoryForward = 6,
+                                 Quit = 7,
+                                 Presentation = 8,
+                                 EndPresentation = 9,
+                                 Find = 10,
+                                 GoToPage = 11,
+                                 Close = 12,
+                                 Print = 13    ///< \since 0.16
+               };
+
+               /**
+                * The action of the current LinkAction
+                */
+               ActionType actionType() const;
+
+               /**
+                * Create a new Action link, that executes a specified action
+                * on the document.
+                *
+                * \param linkArea the active area of the link
+                * \param actionType which action should be executed
+                */
+               LinkAction( const QRectF &linkArea, ActionType actionType );
+               /**
+                * Destructor.
+                */
+               ~LinkAction();
+               LinkType linkType() const;
+
+       private:
+               Q_DECLARE_PRIVATE( LinkAction )
+               Q_DISABLE_COPY( LinkAction )
+};
+
+/**
+ * Sound: a sound to be played.
+ *
+ * \since 0.6
+ */
+class POPPLER_QT4_EXPORT LinkSound : public Link
+{
+       public:
+               // create a Link_Sound
+               LinkSound( const QRectF &linkArea, double volume, bool sync, bool repeat, bool mix, SoundObject *sound );
+               /**
+                * Destructor.
+                */
+               virtual ~LinkSound();
+
+               LinkType linkType() const;
+
+               /**
+                * The volume to be used when playing the sound.
+                *
+                * The volume is in the range [ -1, 1 ], where:
+                * - a negative number: no volume (mute)
+                * - 1: full volume
+                */
+               double volume() const;
+               /**
+                * Whether the playback of the sound should be synchronous
+                * (thus blocking, waiting for the end of the sound playback).
+                */
+               bool synchronous() const;
+               /**
+                * Whether the sound should be played continuously (that is,
+                * started again when it ends)
+                */
+               bool repeat() const;
+               /**
+                * Whether the playback of this sound can be mixed with
+                * playbacks with other sounds of the same document.
+                *
+                * \note When false, any other playback must be stopped before
+                *       playing the sound.
+                */
+               bool mix() const;
+               /**
+                * The sound object to be played
+                */
+               SoundObject *sound() const;
+
+       private:
+               Q_DECLARE_PRIVATE( LinkSound )
+               Q_DISABLE_COPY( LinkSound )
+};
+
+/**
+ * Rendition: Rendition link.
+ *
+ * \since 0.20
+ */
+class POPPLER_QT4_EXPORT LinkRendition : public Link
+{
+       public:
+               /**
+                * Create a new media rendition link.
+                *
+                * \param linkArea the active area of the link
+                * \param rendition 
+                */
+               LinkRendition( const QRectF &linkArea, ::MediaRendition *rendition );
+               /**
+                * Destructor.
+                */
+               virtual ~LinkRendition();
+
+               LinkType linkType() const;
+
+               /**
+                * 
+                */
+               MediaRendition *rendition() const;
+
+       private:
+               Q_DECLARE_PRIVATE( LinkRendition )
+               Q_DISABLE_COPY( LinkRendition )
+};
+
+/**
+ * JavaScript: a JavaScript code to be interpreted.
+ *
+ * \since 0.10
+ */
+class POPPLER_QT4_EXPORT LinkJavaScript : public Link
+{
+       public:
+               /**
+                * Create a new JavaScript link.
+                *
+                * \param linkArea the active area of the link
+                * \param js the JS code to be interpreted
+                */
+               LinkJavaScript( const QRectF &linkArea, const QString &js );
+               /**
+                * Destructor.
+                */
+               virtual ~LinkJavaScript();
+
+               LinkType linkType() const;
+
+               /**
+                * The JS code
+                */
+               QString script() const;
+
+       private:
+               Q_DECLARE_PRIVATE( LinkJavaScript )
+               Q_DISABLE_COPY( LinkJavaScript )
+};     
+
+/**
+ * Movie: a movie to be played.
+ *
+ * \since 0.20
+ */
+class POPPLER_QT4_EXPORT LinkMovie : public Link
+{
+       public:
+               /**
+                * Describes the operation to be performed on the movie.
+                */
+               enum Operation { Play,
+                                Stop,
+                                Pause,
+                                Resume
+               };
+
+               /**
+                * Create a new Movie link.
+                *
+                * \param linkArea the active area of the link
+                * \param operation the operation to be performed on the movie
+                * \param annotationTitle the title of the movie annotation identifying the movie to be played
+                * \param annotationReference the object reference of the movie annotation identifying the movie to be played
+                *
+                * Note: This constructor is supposed to be used by Poppler::Page only.
+                */
+               LinkMovie( const QRectF &linkArea, Operation operation, const QString &annotationTitle, const Ref &annotationReference );
+               /**
+                * Destructor.
+                */
+               ~LinkMovie();
+               LinkType linkType() const;
+               /**
+                * Returns the operation to be performed on the movie.
+                */
+               Operation operation() const;
+               /**
+                * Returns whether the given @p annotation is the referenced movie annotation for this movie @p link.
+                */
+               bool isReferencedAnnotation( const MovieAnnotation *annotation ) const;
+
+       private:
+               Q_DECLARE_PRIVATE( LinkMovie )
+               Q_DISABLE_COPY( LinkMovie )
+};
+
+}
+
+#endif
diff --git a/qt4/src/poppler-media.cc b/qt4/src/poppler-media.cc
new file mode 100644 (file)
index 0000000..c318147
--- /dev/null
@@ -0,0 +1,162 @@
+/* poppler-media.cc: qt interface to poppler
+ * Copyright (C) 2012 Guillermo A. Amaral B. <gamaral@kde.org>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include "poppler-media.h"
+
+#include "Rendition.h"
+
+#include "poppler-private.h"
+
+#include <QtCore/QBuffer>
+
+#define BUFFER_MAX 4096
+
+namespace Poppler
+{
+
+class MediaRenditionPrivate
+{
+public:
+
+  MediaRenditionPrivate(::MediaRendition *rendition)
+  : rendition(rendition)
+  {
+  }
+
+  ::MediaRendition *rendition;
+};
+
+MediaRendition::MediaRendition(::MediaRendition *rendition)
+  : d_ptr(new MediaRenditionPrivate(rendition))
+{
+}
+
+MediaRendition::~MediaRendition()
+{
+  delete d_ptr;
+}
+
+bool
+MediaRendition::isValid() const
+{
+  Q_D( const MediaRendition );
+  return d->rendition && d->rendition->isOk();
+}
+
+QString
+MediaRendition::contentType() const
+{
+  Q_ASSERT(isValid() && "Invalid media rendition.");
+  Q_D( const MediaRendition );
+  return UnicodeParsedString(d->rendition->getContentType());
+}
+
+QString
+MediaRendition::fileName() const
+{
+  Q_ASSERT(isValid() && "Invalid media rendition.");
+  Q_D( const MediaRendition );
+  return UnicodeParsedString(d->rendition->getFileName());
+}
+
+bool
+MediaRendition::isEmbedded() const
+{
+  Q_ASSERT(isValid() && "Invalid media rendition.");
+  Q_D( const MediaRendition );
+  return d->rendition->getIsEmbedded();
+}
+
+QByteArray
+MediaRendition::data() const
+{
+  Q_ASSERT(isValid() && "Invalid media rendition.");
+  Q_D( const MediaRendition );
+
+  Stream *s = d->rendition->getEmbbededStream();
+  if (!s)
+    return QByteArray();
+
+  QBuffer buffer;
+  Guchar data[BUFFER_MAX];
+  int bread;
+
+  buffer.open(QIODevice::WriteOnly);
+  s->reset();
+  while ((bread = s->doGetChars(BUFFER_MAX, data)) != 0)
+    buffer.write(reinterpret_cast<const char *>(data), bread);
+  buffer.close();
+
+  return buffer.data();
+}
+
+bool
+MediaRendition::autoPlay() const
+{
+  Q_D( const MediaRendition );
+  if (d->rendition->getBEParameters()) {
+    return d->rendition->getBEParameters()->autoPlay;
+  } else if (d->rendition->getMHParameters()) {
+    return d->rendition->getMHParameters()->autoPlay;
+  } else qDebug("No BE or MH paremeters to reference!");
+  return false;
+}
+
+bool
+MediaRendition::showControls() const
+{
+  Q_D( const MediaRendition );
+  if (d->rendition->getBEParameters()) {
+    return d->rendition->getBEParameters()->showControls;
+  } else if (d->rendition->getMHParameters()) {
+    return d->rendition->getMHParameters()->showControls;
+  } else qDebug("No BE or MH paremeters to reference!");
+  return false;
+}
+
+float
+MediaRendition::repeatCount() const
+{
+  Q_D( const MediaRendition );
+  if (d->rendition->getBEParameters()) {
+    return d->rendition->getBEParameters()->repeatCount;
+  } else if (d->rendition->getMHParameters()) {
+    return d->rendition->getMHParameters()->repeatCount;
+  } else qDebug("No BE or MH paremeters to reference!");
+  return 1.f;
+}
+
+QSize
+MediaRendition::size() const
+{
+  Q_D( const MediaRendition );
+  MediaParameters *mp = 0;
+
+  if (d->rendition->getBEParameters())
+    mp = d->rendition->getBEParameters();
+  else if (d->rendition->getMHParameters())
+    mp = d->rendition->getMHParameters();
+  else qDebug("No BE or MH paremeters to reference!");
+
+  if (mp)
+    return QSize(mp->windowParams.width, mp->windowParams.height);
+  return QSize();
+}
+
+}
+
diff --git a/qt4/src/poppler-media.h b/qt4/src/poppler-media.h
new file mode 100644 (file)
index 0000000..64ec83c
--- /dev/null
@@ -0,0 +1,97 @@
+/* poppler-media.h: qt interface to poppler
+ * Copyright (C) 2012 Guillermo A. Amaral B. <gamaral@kde.org>
+ * Copyright (C) 2012 Albert Astals Cid <aacid@kde.org>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#ifndef __POPPLER_MEDIARENDITION_H__
+#define __POPPLER_MEDIARENDITION_H__
+
+#include "poppler-export.h"
+
+#include <QtCore/QSize>
+#include <QtCore/QString>
+
+class MediaRendition;
+class QIODevice;
+
+namespace Poppler
+{
+  class MediaRenditionPrivate;
+
+  /**
+    Qt wrapper for MediaRendition.
+
+    \since 0.20
+   */
+  class POPPLER_QT4_EXPORT MediaRendition {
+   public:
+    MediaRendition(::MediaRendition *rendition);
+    ~MediaRendition();
+
+    /**
+      Check if wrapper is holding a valid rendition object.
+     */
+    bool isValid() const;
+
+    /**
+      Returns content type.
+     */
+    QString contentType() const;
+
+    /**
+      Returns file name.
+     */
+    QString fileName() const;
+
+    /**
+      Returns true if media is embedded.
+     */
+    bool isEmbedded() const;
+
+    /**
+      Returns data buffer.
+     */
+    QByteArray data() const;
+
+    /**
+      Convenience accessor for auto-play parameter.
+     */
+    bool autoPlay() const;
+
+    /**
+      Convenience accessor for show controls parameter.
+     */
+    bool showControls() const;
+
+    /**
+      Convenience accessor for repeat count parameter.
+     */
+    float repeatCount() const;
+
+    /**
+      Convenience accessor for size parameter.
+     */
+    QSize size() const;
+
+   private:
+    Q_DECLARE_PRIVATE( MediaRendition )
+    MediaRenditionPrivate *d_ptr;
+    Q_DISABLE_COPY( MediaRendition )
+  };
+}
+
+#endif /* __POPPLER_MEDIARENDITION_H__ */
diff --git a/qt4/src/poppler-movie.cc b/qt4/src/poppler-movie.cc
new file mode 100644 (file)
index 0000000..869e381
--- /dev/null
@@ -0,0 +1,95 @@
+/* poppler-sound.cc: qt interface to poppler
+ * Copyright (C) 2008, 2010, Pino Toscano <pino@kde.org>
+ * Copyright (C) 2008, Albert Astals Cid <aacid@kde.org>
+ * Copyright (C) 2010, Carlos Garcia Campos <carlosgc@gnome.org>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include "poppler-qt4.h"
+
+#include "Object.h"
+#include "Annot.h"
+#include "Movie.h"
+
+namespace Poppler
+{
+
+class MovieData
+{
+public:
+       MovieData()
+         : m_movieObj( 0 )
+       {
+       }
+
+       ~MovieData()
+       {
+               delete m_movieObj;
+       }
+
+       Movie *m_movieObj;
+       QSize m_size;
+       int m_rotation;
+       MovieObject::PlayMode m_playMode : 3;
+       bool m_showControls : 1;
+};
+
+MovieObject::MovieObject( AnnotMovie *ann )
+{
+       m_movieData = new MovieData();
+       m_movieData->m_movieObj = ann->getMovie()->copy();
+
+       MovieActivationParameters *mp = m_movieData->m_movieObj->getActivationParameters();
+       int width, height;
+       m_movieData->m_movieObj->getFloatingWindowSize(&width, &height);
+       m_movieData->m_size = QSize(width, height);
+       m_movieData->m_rotation = m_movieData->m_movieObj->getRotationAngle();
+       m_movieData->m_showControls = mp->showControls;
+       m_movieData->m_playMode = (MovieObject::PlayMode)mp->repeatMode;
+}
+
+MovieObject::~MovieObject()
+{
+       delete m_movieData;
+}
+
+QString MovieObject::url() const
+{
+       GooString * goo = m_movieData->m_movieObj->getFileName();
+       return goo ? QString( goo->getCString() ) : QString();
+}
+
+QSize MovieObject::size() const
+{
+       return m_movieData->m_size;
+}
+
+int MovieObject::rotation() const
+{
+       return m_movieData->m_rotation;
+}
+
+bool MovieObject::showControls() const
+{
+       return m_movieData->m_showControls;
+}
+
+MovieObject::PlayMode MovieObject::playMode() const
+{
+       return m_movieData->m_playMode;
+}
+
+}
diff --git a/qt4/src/poppler-optcontent-private.h b/qt4/src/poppler-optcontent-private.h
new file mode 100644 (file)
index 0000000..98eda07
--- /dev/null
@@ -0,0 +1,121 @@
+/* poppler-optcontent-private.h: qt interface to poppler
+ *
+ * Copyright (C) 2007, Brad Hards <bradh@kde.org>
+ * Copyright (C) 2008, Pino Toscano <pino@kde.org>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#ifndef POPPLER_OPTCONTENT_PRIVATE_H
+#define POPPLER_OPTCONTENT_PRIVATE_H
+
+#include <QtCore/QMap>
+#include <QtCore/QSet>
+#include <QtCore/QString>
+
+class Array;
+class OCGs;
+class OptionalContentGroup;
+
+class QModelIndex;
+
+namespace Poppler
+{
+  class OptContentItem;
+  class OptContentModel;
+  class OptContentModelPrivate;
+
+  class RadioButtonGroup
+  {
+  public:
+    RadioButtonGroup( OptContentModelPrivate *ocModel, Array *rbarray);
+    ~RadioButtonGroup();
+    QSet<OptContentItem *> setItemOn( OptContentItem *itemToSetOn );
+
+  private:
+    QList<OptContentItem*> itemsInGroup;
+  };
+
+  class OptContentItem
+  {
+    public:
+    enum ItemState { On, Off, HeadingOnly };
+
+    OptContentItem( OptionalContentGroup *group );
+    OptContentItem( const QString &label );
+    OptContentItem();
+    ~OptContentItem();
+
+    QString name() const { return m_name; }
+    ItemState state() const { return m_stateBackup; }
+    bool setState(ItemState state, QSet<OptContentItem *> &changedItems);
+
+    QList<OptContentItem*> childList() { return m_children; }
+
+    void setParent( OptContentItem* parent) { m_parent = parent; }
+    OptContentItem* parent() { return m_parent; }
+
+    void addChild( OptContentItem *child );
+
+    void appendRBGroup( RadioButtonGroup *rbgroup );
+
+    bool isEnabled() const { return m_enabled; }
+
+    QSet<OptContentItem*> recurseListChildren(bool includeMe = false) const;
+
+    private:
+    OptionalContentGroup *m_group;
+    QString m_name;
+    ItemState m_state; // true for ON, false for OFF
+    ItemState m_stateBackup;
+    QList<OptContentItem*> m_children;
+    OptContentItem *m_parent;
+    QList<RadioButtonGroup*> m_rbGroups;
+    bool m_enabled;
+  };
+
+  class OptContentModelPrivate
+  {
+    public:
+    OptContentModelPrivate( OptContentModel *qq, OCGs *optContent );
+    ~OptContentModelPrivate();
+
+    void parseRBGroupsArray( Array *rBGroupArray );
+    OptContentItem *nodeFromIndex(const QModelIndex &index, bool canBeNull = false) const;
+    QModelIndex indexFromItem(OptContentItem *node, int column) const;
+
+    /**
+       Get the OptContentItem corresponding to a given reference value.
+
+       \param ref the reference number (e.g. from Object.getRefNum()) to look up
+
+       \return the matching optional content item, or null if the reference wasn't found
+    */
+    OptContentItem *itemFromRef( const QString &ref ) const;
+    void setRootNode(OptContentItem *node);
+
+    OptContentModel *q;
+
+    QMap<QString, OptContentItem*> m_optContentItems;
+    QList<RadioButtonGroup*> m_rbgroups;
+    OptContentItem *m_rootNode;
+
+    private:
+    void addChild( OptContentItem *parent, OptContentItem *child);
+    void parseOrderArray( OptContentItem *parentNode, Array *orderArray );
+  };
+}
+
+#endif
diff --git a/qt4/src/poppler-optcontent.cc b/qt4/src/poppler-optcontent.cc
new file mode 100644 (file)
index 0000000..6a5ffe7
--- /dev/null
@@ -0,0 +1,428 @@
+/* poppler-optcontent.cc: qt interface to poppler
+ *
+ * Copyright (C) 2007, Brad Hards <bradh@kde.org>
+ * Copyright (C) 2008, Pino Toscano <pino@kde.org>
+ * Copyright (C) 2008, Carlos Garcia Campos <carlosgc@gnome.org>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include "poppler-optcontent.h"
+
+#include "poppler-optcontent-private.h"
+
+#include "poppler-private.h"
+
+#include <QtCore/QDebug>
+#include <QtCore/QtAlgorithms>
+
+#include "poppler/OptionalContent.h"
+
+namespace Poppler
+{
+
+  RadioButtonGroup::RadioButtonGroup( OptContentModelPrivate *ocModel, Array *rbarray )
+  {
+    for (int i = 0; i < rbarray->getLength(); ++i) {
+      Object ref;
+      rbarray->getNF( i, &ref );
+      if ( ! ref.isRef() ) {
+       qDebug() << "expected ref, but got:" << ref.getType();
+      }
+      OptContentItem *item = ocModel->itemFromRef( QString::number(ref.getRefNum() ) );
+      itemsInGroup.append( item );
+    }
+    for (int i = 0; i < itemsInGroup.size(); ++i) {
+      OptContentItem *item = itemsInGroup.at(i);
+      item->appendRBGroup( this );
+    }
+  }
+
+  RadioButtonGroup::~RadioButtonGroup()
+  {
+  }
+
+  QSet<OptContentItem *> RadioButtonGroup::setItemOn( OptContentItem *itemToSetOn )
+  {
+    QSet<OptContentItem *> changedItems;
+    for (int i = 0; i < itemsInGroup.size(); ++i) {
+      OptContentItem *thisItem = itemsInGroup.at(i);
+      if (thisItem != itemToSetOn) {
+        QSet<OptContentItem *> newChangedItems;
+        thisItem->setState(OptContentItem::Off, newChangedItems);
+        changedItems += newChangedItems;
+      }
+    }
+    return changedItems;
+  }
+
+
+
+  OptContentItem::OptContentItem( OptionalContentGroup *group )
+  {
+    m_group = group;
+    m_parent = 0;
+    m_name = UnicodeParsedString( group->getName() );
+    if ( group->getState() == OptionalContentGroup::On ) {
+      m_state = OptContentItem::On;
+    } else {
+      m_state = OptContentItem::Off;
+    }
+    m_stateBackup = m_state;
+    m_enabled = true;
+  }
+
+  OptContentItem::OptContentItem( const QString &label )
+  {
+    m_parent = 0;
+    m_name = label;
+    m_group = 0;
+    m_state = OptContentItem::HeadingOnly;
+    m_stateBackup = m_state;
+    m_enabled = true;
+  }
+
+  OptContentItem::OptContentItem() :
+    m_parent( 0 ), m_enabled(true)
+  {
+  }
+
+  OptContentItem::~OptContentItem()
+  {
+  }
+
+  void OptContentItem::appendRBGroup( RadioButtonGroup *rbgroup )
+  {
+    m_rbGroups.append( rbgroup );
+  }
+
+
+  bool OptContentItem::setState(ItemState state, QSet<OptContentItem *> &changedItems)
+  {
+    m_state = state;
+    m_stateBackup = m_state;
+    changedItems.insert(this);
+    QSet<OptContentItem *> empty;
+    Q_FOREACH (OptContentItem *child, m_children) {
+      ItemState oldState = child->m_stateBackup;
+      child->setState(state == OptContentItem::On ? child->m_stateBackup : OptContentItem::Off, empty);
+      child->m_enabled = state == OptContentItem::On;
+      child->m_stateBackup = oldState;
+    }
+    if (!m_group) {
+      return false;
+    }
+    if ( state == OptContentItem::On ) {
+      m_group->setState( OptionalContentGroup::On );
+      for (int i = 0; i < m_rbGroups.size(); ++i) {
+       RadioButtonGroup *rbgroup = m_rbGroups.at(i);
+        changedItems += rbgroup->setItemOn( this );
+      }
+    } else if ( state == OptContentItem::Off ) {
+      m_group->setState( OptionalContentGroup::Off );
+    }
+    return true;
+  }
+
+  void OptContentItem::addChild( OptContentItem *child )
+  {
+    m_children += child;
+    child->setParent( this );
+  }
+
+  QSet<OptContentItem*> OptContentItem::recurseListChildren(bool includeMe) const
+  {
+    QSet<OptContentItem*> ret;
+    if (includeMe) {
+      ret.insert(const_cast<OptContentItem*>(this));
+    }
+    Q_FOREACH (OptContentItem *child, m_children) {
+      ret += child->recurseListChildren(true);
+    }
+    return ret;
+  }
+
+  OptContentModelPrivate::OptContentModelPrivate( OptContentModel *qq, OCGs *optContent )
+    : q(qq)
+  {
+    m_rootNode = new OptContentItem();
+    GooList *ocgs = optContent->getOCGs();
+
+    for (int i = 0; i < ocgs->getLength(); ++i) {
+      OptionalContentGroup *ocg = static_cast<OptionalContentGroup*>(ocgs->get(i));
+      OptContentItem *node = new OptContentItem( ocg );
+      m_optContentItems.insert( QString::number(ocg->getRef().num), node);
+    }
+
+    if ( optContent->getOrderArray() == 0 ) {
+      // no Order array, so drop them all at the top level
+      QMapIterator<QString, OptContentItem*> i(m_optContentItems);
+      while ( i.hasNext() ) {
+       i.next();
+       qDebug() << "iterator" << i.key() << ":" << i.value();
+       addChild( i.value(), m_rootNode );
+      }
+    } else {
+      parseOrderArray( m_rootNode, optContent->getOrderArray() );
+    }
+
+    parseRBGroupsArray( optContent->getRBGroupsArray() );
+  }
+
+  OptContentModelPrivate::~OptContentModelPrivate()
+  {
+    qDeleteAll( m_optContentItems );
+    qDeleteAll( m_rbgroups );
+    delete m_rootNode;
+  }
+
+  void OptContentModelPrivate::parseOrderArray( OptContentItem *parentNode, Array *orderArray )
+  {
+    OptContentItem *lastItem = parentNode;
+    for (int i = 0; i < orderArray->getLength(); ++i) {
+      Object orderItem;
+      orderArray->get(i, &orderItem);
+      if ( orderItem.isDict() ) {
+       Object item;
+       orderArray->getNF(i, &item);
+       if (item.isRef() ) {
+          OptContentItem *ocItem = m_optContentItems.value(QString::number(item.getRefNum()), 0);
+         if (ocItem) {
+           addChild( parentNode, ocItem );
+           lastItem = ocItem;
+         } else {
+            qDebug() << "could not find group for object" << item.getRefNum();
+         }
+       }
+       item.free();
+      } else if ( (orderItem.isArray()) && (orderItem.arrayGetLength() > 0) ) {
+       parseOrderArray(lastItem, orderItem.getArray());
+      } else if ( orderItem.isString() ) {
+       GooString *label = orderItem.getString();
+       OptContentItem *header = new OptContentItem ( UnicodeParsedString ( label ) );
+       addChild( parentNode, header );
+       parentNode = header;
+       lastItem = header;
+      } else {
+       qDebug() << "something unexpected";
+      }        
+      orderItem.free();
+    }
+  }
+
+  void OptContentModelPrivate::parseRBGroupsArray( Array *rBGroupArray )
+  {
+    if (! rBGroupArray) {
+      return;
+    }
+    // This is an array of array(s)
+    for (int i = 0; i < rBGroupArray->getLength(); ++i) {
+      Object rbObj;
+      rBGroupArray->get(i, &rbObj);
+      if ( ! rbObj.isArray() ) {
+       qDebug() << "expected inner array, got:" << rbObj.getType();
+       return;
+      }
+      Array *rbarray = rbObj.getArray();
+      RadioButtonGroup *rbg = new RadioButtonGroup( this, rbarray );
+      m_rbgroups.append( rbg );
+      rbObj.free();
+    }
+  }
+
+  OptContentModel::OptContentModel( OCGs *optContent, QObject *parent)
+    : QAbstractItemModel(parent)
+  {
+    d = new OptContentModelPrivate( this, optContent );
+  }
+
+  OptContentModel::~OptContentModel()
+  {
+    delete d;
+  }
+
+  void OptContentModelPrivate::setRootNode(OptContentItem *node)
+  {
+    delete m_rootNode;
+    m_rootNode = node;
+    q->reset();
+  }
+
+  QModelIndex OptContentModel::index(int row, int column, const QModelIndex &parent) const
+  {
+    if (row < 0 || column != 0) {
+      return QModelIndex();
+    }
+
+    OptContentItem *parentNode = d->nodeFromIndex( parent );
+    if (row < parentNode->childList().count()) {
+      return createIndex(row, column, parentNode->childList().at(row));
+    }
+    return QModelIndex();
+  }
+
+  QModelIndex OptContentModel::parent(const QModelIndex &child) const
+  {
+    OptContentItem *childNode = d->nodeFromIndex( child );
+    if (!childNode) {
+      return QModelIndex();
+    }
+    return d->indexFromItem(childNode->parent(), child.column());
+  }
+
+  QModelIndex OptContentModelPrivate::indexFromItem(OptContentItem *node, int column) const
+  {
+    if (!node) {
+      return QModelIndex();
+    }
+    OptContentItem *parentNode = node->parent();
+    if (!parentNode) {
+      return QModelIndex();
+    }
+    const int row = parentNode->childList().indexOf(node);
+    return q->createIndex(row, column, node);
+  }
+  int OptContentModel::rowCount(const QModelIndex &parent) const
+  {
+    OptContentItem *parentNode = d->nodeFromIndex( parent );
+    if (!parentNode) {
+      return 0;
+    } else {
+      return parentNode->childList().count();
+    }
+  }
+
+  int OptContentModel::columnCount(const QModelIndex &parent) const
+  {
+    return 1;
+  }
+
+
+  QVariant OptContentModel::data(const QModelIndex &index, int role) const
+  {
+    OptContentItem *node = d->nodeFromIndex(index, true);
+    if (!node) {
+      return QVariant();
+    }
+
+    switch (role) {
+      case Qt::DisplayRole:
+        return node->name();
+        break;
+      case Qt::EditRole:
+        if (node->state() == OptContentItem::On) {
+          return true;
+        } else if (node->state() == OptContentItem::Off) {
+          return false;
+        }
+        break;
+      case Qt::CheckStateRole:
+        if (node->state() == OptContentItem::On) {
+          return Qt::Checked;
+        } else if (node->state() == OptContentItem::Off) {
+          return Qt::Unchecked;
+        }
+        break;
+    }
+
+    return QVariant();
+  }
+
+  bool OptContentModel::setData ( const QModelIndex & index, const QVariant & value, int role )
+  {
+    OptContentItem *node = d->nodeFromIndex(index, true);
+    if (!node) {
+      return false;
+    }
+
+    switch (role) {
+      case Qt::CheckStateRole:
+      {
+        const bool newvalue = value.toBool();
+        if (newvalue) {
+          if (node->state() != OptContentItem::On) {
+            QSet<OptContentItem *> changedItems;
+            node->setState(OptContentItem::On, changedItems);
+            changedItems += node->recurseListChildren(false);
+            QModelIndexList indexes;
+            Q_FOREACH (OptContentItem *item, changedItems) {
+              indexes.append(d->indexFromItem(item, 0));
+            }
+            qStableSort(indexes);
+            Q_FOREACH (const QModelIndex &changedIndex, indexes) {
+              emit dataChanged(changedIndex, changedIndex);
+            }
+            return true;
+          }
+        } else {
+          if (node->state() != OptContentItem::Off) {
+            QSet<OptContentItem *> changedItems;
+            node->setState(OptContentItem::Off, changedItems);
+            changedItems += node->recurseListChildren(false);
+            QModelIndexList indexes;
+            Q_FOREACH (OptContentItem *item, changedItems) {
+              indexes.append(d->indexFromItem(item, 0));
+            }
+            qStableSort(indexes);
+            Q_FOREACH (const QModelIndex &changedIndex, indexes) {
+              emit dataChanged(changedIndex, changedIndex);
+            }
+            return true;
+          }
+        }
+        break;
+      }
+    }
+
+    return false;
+  }
+
+  Qt::ItemFlags OptContentModel::flags ( const QModelIndex & index ) const
+  {
+    OptContentItem *node = d->nodeFromIndex(index);
+    Qt::ItemFlags itemFlags = Qt::ItemIsSelectable | Qt::ItemIsUserCheckable;
+    if (node->isEnabled()) {
+      itemFlags |= Qt::ItemIsEnabled;
+    }
+    return itemFlags;
+  }
+
+  QVariant OptContentModel::headerData( int section, Qt::Orientation orientation, int role ) const
+  {
+    return QAbstractItemModel::headerData( section, orientation, role );
+  }
+
+  void OptContentModelPrivate::addChild( OptContentItem *parent, OptContentItem *child )
+  {
+    parent->addChild( child );
+  }
+
+  OptContentItem* OptContentModelPrivate::itemFromRef( const QString &ref ) const
+  {
+    return m_optContentItems.value(ref, 0);
+  }
+
+  OptContentItem* OptContentModelPrivate::nodeFromIndex(const QModelIndex &index, bool canBeNull) const
+  {
+    if (index.isValid()) {
+      return static_cast<OptContentItem *>(index.internalPointer());
+    } else {
+      return canBeNull ? 0 : m_rootNode;
+    }
+  }
+}
+
+#include "poppler-optcontent.moc"
diff --git a/qt4/src/poppler-optcontent.h b/qt4/src/poppler-optcontent.h
new file mode 100644 (file)
index 0000000..3f47853
--- /dev/null
@@ -0,0 +1,76 @@
+/* poppler-optcontent.h: qt interface to poppler
+ *
+ * Copyright (C) 2007, Brad Hards <bradh@kde.org>
+ * Copyright (C) 2008, Pino Toscano <pino@kde.org>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#ifndef POPPLER_OPTCONTENT_H
+#define POPPLER_OPTCONTENT_H
+
+#include <QtCore/QAbstractListModel>
+
+#include "poppler-export.h"
+
+class OCGs;
+
+namespace Poppler
+{
+  class Document;
+  class OptContentModelPrivate;
+
+  /**
+   * \brief Model for optional content
+   *
+   * OptContentModel is an item model representing the optional content items
+   * that can be found in PDF documents.
+   *
+   * The model offers a mostly read-only display of the data, allowing to
+   * enable/disable some contents setting the Qt::CheckStateRole data role.
+   *
+   * \since 0.8
+   */
+  class POPPLER_QT4_EXPORT OptContentModel : public QAbstractItemModel
+  {
+    friend class Document;
+
+    Q_OBJECT
+
+    public:
+    virtual ~OptContentModel();
+
+    QModelIndex index(int row, int column, const QModelIndex &parent) const;
+    QModelIndex parent(const QModelIndex &child) const;
+
+    int rowCount(const QModelIndex &parent = QModelIndex()) const;
+    int columnCount(const QModelIndex &parent) const;
+
+    QVariant data(const QModelIndex &index, int role) const;
+    virtual bool setData ( const QModelIndex & index, const QVariant & value, int role = Qt::EditRole );
+
+    Qt::ItemFlags flags ( const QModelIndex & index ) const;
+
+    virtual QVariant headerData( int section, Qt::Orientation orientation, int role = Qt::DisplayRole ) const;
+
+    private:
+    OptContentModel( OCGs *optContent, QObject *parent = 0);
+
+    friend class OptContentModelPrivate;
+    OptContentModelPrivate *d;
+  };
+}
+
+#endif
diff --git a/qt4/src/poppler-page-private.h b/qt4/src/poppler-page-private.h
new file mode 100644 (file)
index 0000000..ecdca17
--- /dev/null
@@ -0,0 +1,49 @@
+/* poppler-page.cc: qt interface to poppler
+ * Copyright (C) 2005, Net Integration Technologies, Inc.
+ * Copyright (C) 2007, Albert Astals Cid <aacid@kde.org>
+ * Copyright (C) 2008, Pino Toscano <pino@kde.org>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#ifndef _POPPLER_PAGE_PRIVATE_H_
+#define _POPPLER_PAGE_PRIVATE_H_
+
+class QRectF;
+
+class LinkAction;
+class Page;
+
+namespace Poppler
+{
+
+class DocumentData;
+class PageTransition;
+
+class PageData {
+public:
+  Link* convertLinkActionToLink(::LinkAction * a, const QRectF &linkArea);
+
+  DocumentData *parentDoc;
+  ::Page *page;
+  int index;
+  PageTransition *transition;
+
+  static Link* convertLinkActionToLink(::LinkAction * a, DocumentData *parentDoc, const QRectF &linkArea);
+};
+
+}
+
+#endif
diff --git a/qt4/src/poppler-page-transition-private.h b/qt4/src/poppler-page-transition-private.h
new file mode 100644 (file)
index 0000000..63febb0
--- /dev/null
@@ -0,0 +1,28 @@
+/*
+ * Copyright (C) 2005, Albert Astals Cid
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+class Object;
+
+namespace Poppler {
+
+class PageTransitionParams {
+  public:
+    Object *dictObj;
+};
+
+}
diff --git a/qt4/src/poppler-page-transition.cc b/qt4/src/poppler-page-transition.cc
new file mode 100644 (file)
index 0000000..cde8818
--- /dev/null
@@ -0,0 +1,95 @@
+/* PageTransition.cc
+ * Copyright (C) 2005, Net Integration Technologies, Inc.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include "PageTransition.h"
+#include "poppler-page-transition.h"
+#include "poppler-page-transition-private.h"
+
+namespace Poppler {
+
+class PageTransitionData
+{
+  public:
+    PageTransitionData(Object *trans)
+    {
+        pt = new ::PageTransition(trans);
+    }
+
+    PageTransitionData(const PageTransitionData &ptd)
+    {
+        pt = new ::PageTransition(*ptd.pt);
+    }
+
+    ~PageTransitionData()
+    {
+        delete pt;
+    }
+
+    ::PageTransition *pt;
+};
+
+PageTransition::PageTransition(const PageTransitionParams &params)
+{
+  data = new PageTransitionData(params.dictObj);
+}
+
+PageTransition::PageTransition(const PageTransition &pt)
+{
+  data = new PageTransitionData(*pt.data);
+}
+
+PageTransition::~PageTransition()
+{
+  delete data;
+}
+
+PageTransition::Type PageTransition::type() const
+{
+  return (Poppler::PageTransition::Type)data->pt->getType();
+}
+
+int PageTransition::duration() const
+{
+  return data->pt->getDuration();
+}
+
+PageTransition::Alignment PageTransition::alignment() const
+{
+  return (Poppler::PageTransition::Alignment)data->pt->getAlignment();
+}
+
+PageTransition::Direction PageTransition::direction() const
+{
+  return (Poppler::PageTransition::Direction)data->pt->getDirection();
+}
+
+int PageTransition::angle() const
+{
+  return data->pt->getAngle();
+}
+
+double PageTransition::scale() const
+{
+  return data->pt->getScale();
+}
+bool PageTransition::isRectangular() const
+{
+  return data->pt->isRectangular();
+}
+
+}
diff --git a/qt4/src/poppler-page-transition.h b/qt4/src/poppler-page-transition.h
new file mode 100644 (file)
index 0000000..e7f39e2
--- /dev/null
@@ -0,0 +1,148 @@
+/* PageTransition.h
+ * Copyright (C) 2005, Net Integration Technologies, Inc.
+ * Copyright (C) 2005, Brad Hards <bradh@frogmouth.net>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#ifndef __PAGETRANSITION_X_H__
+#define __PAGETRANSITION_X_H__
+
+#include "poppler-export.h"
+
+namespace Poppler {
+
+class PageTransitionParams;
+class PageTransitionData;
+
+/**
+   \brief Describes how a PDF file viewer shall perform the transition
+   from one page to another
+
+   In PDF files there is a way to specify if the viewer shall use
+   certain effects to perform the transition from one page to
+   another. This feature can be used, e.g., in a PDF-based beamer
+   presentation.
+
+   This utility class represents the transition effect, and can be
+   used to extract the information from a PDF object.
+*/
+
+
+class POPPLER_QT4_EXPORT PageTransition {
+ public:
+
+  /** \brief transition effect that shall be used
+   */
+  // if changed remember to keep in sync with PageTransition.h enum
+  enum Type {
+    Replace = 0,
+    Split,
+    Blinds,
+    Box,
+    Wipe,
+    Dissolve,
+    Glitter,
+    Fly,
+    Push,
+    Cover,
+    Uncover,
+    Fade
+  };
+  
+  /** \brief alignment of the transition effect that shall be used
+   */
+  // if changed remember to keep in sync with PageTransition.h enum
+  enum Alignment {
+    Horizontal = 0,
+    Vertical
+  };
+  
+  /** \brief direction of the transition effect that shall be used
+   */
+  // if changed remember to keep in sync with PageTransition.h enum
+  enum Direction {
+    Inward = 0,
+    Outward
+  };
+  
+  /** \brief Construct a new PageTransition object from a page dictionary.
+
+  Users of the library will rarely need to construct a
+  PageTransition object themselves. Instead, the method
+  Poppler::Page::transition() can be used to find out if a certain
+  transition effect is specified.
+
+  @warning In case or error, this method will print an error message to stderr,
+  and construct a default object.
+
+  @param params an object whose dictionary will be read and
+   parsed. This must be a valid object, whose dictionaries are
+   accessed by the constructor. The object is only accessed by this
+   constructor, and may be deleted after the constructor returns.
+  */
+  PageTransition(const PageTransitionParams &params);
+
+  /** \brief copy constructor */
+  PageTransition(const PageTransition &pt);
+  
+  /**
+     Destructor
+  */
+  ~PageTransition();
+  
+  /**
+     \brief Get type of the transition.
+  */
+  Type type() const;
+  
+  /**
+     \brief Get duration of the transition in seconds.
+  */
+  int duration() const;
+  
+  /**
+     \brief Get dimension in which the transition effect occurs.
+  */
+  Alignment alignment() const;
+  
+  /**
+     \brief Get direction of motion of the transition effect.
+  */
+  Direction direction() const;
+  
+  /**
+     \brief Get direction in which the transition effect moves.
+  */
+  int angle() const;
+  
+  /**
+     \brief Get starting or ending scale.
+  */
+  double scale() const;
+  
+  /**
+     \brief Returns true if the area to be flown is rectangular and
+     opaque.
+  */
+  bool isRectangular() const;
+  
+ private:
+  PageTransitionData *data;
+};
+
+}
+
+#endif
diff --git a/qt4/src/poppler-page.cc b/qt4/src/poppler-page.cc
new file mode 100644 (file)
index 0000000..6a16d03
--- /dev/null
@@ -0,0 +1,646 @@
+/* poppler-page.cc: qt interface to poppler
+ * Copyright (C) 2005, Net Integration Technologies, Inc.
+ * Copyright (C) 2005, Brad Hards <bradh@frogmouth.net>
+ * Copyright (C) 2005-2011, Albert Astals Cid <aacid@kde.org>
+ * Copyright (C) 2005, Stefan Kebekus <stefan.kebekus@math.uni-koeln.de>
+ * Copyright (C) 2006-2011, Pino Toscano <pino@kde.org>
+ * Copyright (C) 2008 Carlos Garcia Campos <carlosgc@gnome.org>
+ * Copyright (C) 2009 Shawn Rutledge <shawn.t.rutledge@gmail.com>
+ * Copyright (C) 2010, 2012, Guillermo Amaral <gamaral@kdab.com>
+ * Copyright (C) 2010 Suzuki Toshiya <mpsuzuki@hiroshima-u.ac.jp>
+ * Copyright (C) 2010 Matthias Fauconneau <matthias.fauconneau@gmail.com>
+ * Copyright (C) 2010 Hib Eris <hib@hiberis.nl>
+ * Copyright (C) 2012 Tobias Koenig <tokoe@kdab.com>
+ * Copyright (C) 2012 Fabio D'Urso <fabiodurso@hotmail.it>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include <poppler-qt4.h>
+
+#include <QtCore/QHash>
+#include <QtCore/QMap>
+#include <QtCore/QVarLengthArray>
+#include <QtGui/QImage>
+#include <QtGui/QPainter>
+
+#include <config.h>
+#include <PDFDoc.h>
+#include <Catalog.h>
+#include <Form.h>
+#include <ErrorCodes.h>
+#include <TextOutputDev.h>
+#include <Annot.h>
+#include <Link.h>
+#include <ArthurOutputDev.h>
+#include <Rendition.h>
+#if defined(HAVE_SPLASH)
+#include <SplashOutputDev.h>
+#include <splash/SplashBitmap.h>
+#endif
+
+#include "poppler-private.h"
+#include "poppler-page-transition-private.h"
+#include "poppler-page-private.h"
+#include "poppler-link-extractor-private.h"
+#include "poppler-annotation-private.h"
+#include "poppler-form.h"
+#include "poppler-media.h"
+
+namespace Poppler {
+
+Link* PageData::convertLinkActionToLink(::LinkAction * a, const QRectF &linkArea)
+{
+    return convertLinkActionToLink(a, parentDoc, linkArea);
+}
+
+Link* PageData::convertLinkActionToLink(::LinkAction * a, DocumentData *parentDoc, const QRectF &linkArea)
+{
+  if ( !a )
+    return NULL;
+
+  Link * popplerLink = NULL;
+  switch ( a->getKind() )
+  {
+    case actionGoTo:
+    {
+      LinkGoTo * g = (LinkGoTo *) a;
+      const LinkDestinationData ldd( g->getDest(), g->getNamedDest(), parentDoc, false );
+      // create link: no ext file, namedDest, object pointer
+      popplerLink = new LinkGoto( linkArea, QString::null, LinkDestination( ldd ) );
+    }
+    break;
+
+    case actionGoToR:
+    {
+      LinkGoToR * g = (LinkGoToR *) a;
+      // copy link file
+      const QString fileName = UnicodeParsedString( g->getFileName() );
+      const LinkDestinationData ldd( g->getDest(), g->getNamedDest(), parentDoc, !fileName.isEmpty() );
+      // ceate link: fileName, namedDest, object pointer
+      popplerLink = new LinkGoto( linkArea, fileName, LinkDestination( ldd ) );
+    }
+    break;
+
+    case actionLaunch:
+    {
+      LinkLaunch * e = (LinkLaunch *)a;
+      GooString * p = e->getParams();
+      popplerLink = new LinkExecute( linkArea, e->getFileName()->getCString(), p ? p->getCString() : 0 );
+    }
+    break;
+
+    case actionNamed:
+    {
+      const char * name = ((LinkNamed *)a)->getName()->getCString();
+      if ( !strcmp( name, "NextPage" ) )
+        popplerLink = new LinkAction( linkArea, LinkAction::PageNext );
+      else if ( !strcmp( name, "PrevPage" ) )
+        popplerLink = new LinkAction( linkArea, LinkAction::PagePrev );
+      else if ( !strcmp( name, "FirstPage" ) )
+        popplerLink = new LinkAction( linkArea, LinkAction::PageFirst );
+      else if ( !strcmp( name, "LastPage" ) )
+        popplerLink = new LinkAction( linkArea, LinkAction::PageLast );
+      else if ( !strcmp( name, "GoBack" ) )
+        popplerLink = new LinkAction( linkArea, LinkAction::HistoryBack );
+      else if ( !strcmp( name, "GoForward" ) )
+        popplerLink = new LinkAction( linkArea, LinkAction::HistoryForward );
+      else if ( !strcmp( name, "Quit" ) )
+        popplerLink = new LinkAction( linkArea, LinkAction::Quit );
+      else if ( !strcmp( name, "GoToPage" ) )
+        popplerLink = new LinkAction( linkArea, LinkAction::GoToPage );
+      else if ( !strcmp( name, "Find" ) )
+        popplerLink = new LinkAction( linkArea, LinkAction::Find );
+      else if ( !strcmp( name, "FullScreen" ) )
+        popplerLink = new LinkAction( linkArea, LinkAction::Presentation );
+      else if ( !strcmp( name, "Print" ) )
+        popplerLink = new LinkAction( linkArea, LinkAction::Print );
+      else if ( !strcmp( name, "Close" ) )
+      {
+        // acroread closes the document always, doesnt care whether 
+        // its presentation mode or not
+        // popplerLink = new LinkAction( linkArea, LinkAction::EndPresentation );
+        popplerLink = new LinkAction( linkArea, LinkAction::Close );
+      }
+      else
+      {
+        // TODO
+      }
+    }
+    break;
+
+    case actionURI:
+    {
+      popplerLink = new LinkBrowse( linkArea, ((LinkURI *)a)->getURI()->getCString() );
+    }
+    break;
+
+    case actionSound:
+    {
+      ::LinkSound *ls = (::LinkSound *)a;
+      popplerLink = new LinkSound( linkArea, ls->getVolume(), ls->getSynchronous(), ls->getRepeat(), ls->getMix(), new SoundObject( ls->getSound() ) );
+    }
+    break;
+
+    case actionJavaScript:
+    {
+      ::LinkJavaScript *ljs = (::LinkJavaScript *)a;
+      popplerLink = new LinkJavaScript( linkArea, UnicodeParsedString(ljs->getScript()) );
+    }
+    break;
+
+    case actionMovie:
+    {
+      ::LinkMovie *lm = (::LinkMovie *)a;
+
+      const QString title = ( lm->hasAnnotTitle() ? UnicodeParsedString( lm->getAnnotTitle() ) : QString() );
+
+      Ref reference;
+      reference.num = reference.gen = -1;
+      if ( lm->hasAnnotRef() )
+        reference = *lm->getAnnotRef();
+
+      LinkMovie::Operation operation = LinkMovie::Play;
+      switch ( lm->getOperation() )
+      {
+        case ::LinkMovie::operationTypePlay:
+          operation = LinkMovie::Play;
+          break;
+        case ::LinkMovie::operationTypePause:
+          operation = LinkMovie::Pause;
+          break;
+        case ::LinkMovie::operationTypeResume:
+          operation = LinkMovie::Resume;
+          break;
+        case ::LinkMovie::operationTypeStop:
+          operation = LinkMovie::Stop;
+          break;
+      };
+
+      popplerLink = new LinkMovie( linkArea, operation, title, reference );
+    }
+    break;
+
+    case actionRendition:
+    {
+      ::LinkRendition *lrn = (::LinkRendition *)a;
+      popplerLink = new LinkRendition( linkArea, lrn->getMedia() );
+    }
+    break;
+
+    case actionUnknown:
+    break;
+  }
+
+  return popplerLink;
+}
+
+
+Page::Page(DocumentData *doc, int index) {
+  m_page = new PageData();
+  m_page->index = index;
+  m_page->parentDoc = doc;
+  m_page->page = doc->doc->getPage(m_page->index + 1);
+  m_page->transition = 0;
+}
+
+Page::~Page()
+{
+  delete m_page->transition;
+  delete m_page;
+}
+
+QImage Page::renderToImage(double xres, double yres, int x, int y, int w, int h, Rotation rotate) const
+{
+  int rotation = (int)rotate * 90;
+  QImage img;
+  switch(m_page->parentDoc->m_backend)
+  {
+    case Poppler::Document::SplashBackend:
+    {
+#if defined(HAVE_SPLASH)
+      SplashOutputDev *splash_output = static_cast<SplashOutputDev *>(m_page->parentDoc->getOutputDev());
+
+      m_page->parentDoc->doc->displayPageSlice(splash_output, m_page->index + 1, xres, yres,
+                                                rotation, false, true, false, x, y, w, h);
+
+      SplashBitmap *bitmap = splash_output->getBitmap();
+      int bw = bitmap->getWidth();
+      int bh = bitmap->getHeight();
+
+      SplashColorPtr dataPtr = splash_output->getBitmap()->getDataPtr();
+
+      if (QSysInfo::BigEndian == QSysInfo::ByteOrder)
+      {
+        uchar c;
+        int count = bw * bh * 4;
+        for (int k = 0; k < count; k += 4)
+        {
+          c = dataPtr[k];
+          dataPtr[k] = dataPtr[k+3];
+          dataPtr[k+3] = c;
+
+          c = dataPtr[k+1];
+          dataPtr[k+1] = dataPtr[k+2];
+          dataPtr[k+2] = c;
+        }
+      }
+
+      // construct a qimage SHARING the raw bitmap data in memory
+      QImage tmpimg( dataPtr, bw, bh, QImage::Format_ARGB32 );
+      img = tmpimg.copy();
+      // unload underlying xpdf bitmap
+      splash_output->startPage( 0, NULL );
+#endif
+      break;
+    }
+    case Poppler::Document::ArthurBackend:
+    {
+      QSize size = pageSize();
+      QImage tmpimg(w == -1 ? qRound( size.width() * xres / 72.0 ) : w, h == -1 ? qRound( size.height() * yres / 72.0 ) : h, QImage::Format_ARGB32);
+
+      QPainter painter(&tmpimg);
+      renderToPainter(&painter, xres, yres, x, y, w, h, rotate, DontSaveAndRestore);
+      painter.end();
+      img = tmpimg;
+      break;
+    }
+  }
+
+  return img;
+}
+
+bool Page::renderToPainter(QPainter* painter, double xres, double yres, int x, int y, int w, int h, Rotation rotate, PainterFlags flags) const
+{
+  if (!painter)
+    return false;
+
+  switch(m_page->parentDoc->m_backend)
+  {
+    case Poppler::Document::SplashBackend:
+      return false;
+    case Poppler::Document::ArthurBackend:
+    {
+      const bool savePainter = !(flags & DontSaveAndRestore);
+      if (savePainter)
+         painter->save();
+      if (m_page->parentDoc->m_hints & Document::Antialiasing)
+          painter->setRenderHint(QPainter::Antialiasing);
+      if (m_page->parentDoc->m_hints & Document::TextAntialiasing)
+          painter->setRenderHint(QPainter::TextAntialiasing);
+      painter->translate(x == -1 ? 0 : -x, y == -1 ? 0 : -y);
+      ArthurOutputDev arthur_output(painter);
+      arthur_output.startDoc(m_page->parentDoc->doc->getXRef());
+      m_page->parentDoc->doc->displayPageSlice(&arthur_output,
+                                               m_page->index + 1,
+                                               xres,
+                                               yres,
+                                               (int)rotate * 90,
+                                               false,
+                                               true,
+                                               false,
+                                               x,
+                                               y,
+                                               w,
+                                               h);
+      if (savePainter)
+         painter->restore();
+      return true;
+    }
+  }
+  return false;
+}
+
+QImage Page::thumbnail() const
+{
+  unsigned char* data = 0;
+  int w = 0;
+  int h = 0;
+  int rowstride = 0;
+  GBool r = m_page->page->loadThumb(&data, &w, &h, &rowstride);
+  QImage ret;
+  if (r)
+  {
+    // first construct a temporary image with the data got,
+    // then force a copy of it so we can free the raw thumbnail data
+    ret = QImage(data, w, h, rowstride, QImage::Format_RGB888).copy();
+    gfree(data);
+  }
+  return ret;
+}
+
+QString Page::text(const QRectF &r, TextLayout textLayout) const
+{
+  TextOutputDev *output_dev;
+  GooString *s;
+  PDFRectangle *rect;
+  QString result;
+  
+  const GBool rawOrder = textLayout == RawOrderLayout;
+  output_dev = new TextOutputDev(0, gFalse, 0, rawOrder, gFalse);
+  m_page->parentDoc->doc->displayPageSlice(output_dev, m_page->index + 1, 72, 72,
+      0, false, true, false, -1, -1, -1, -1);
+  if (r.isNull())
+  {
+    rect = m_page->page->getCropBox();
+    s = output_dev->getText(rect->x1, rect->y1, rect->x2, rect->y2);
+  }
+  else
+  {
+    s = output_dev->getText(r.left(), r.top(), r.right(), r.bottom());
+  }
+
+  result = QString::fromUtf8(s->getCString());
+
+  delete output_dev;
+  delete s;
+  return result;
+}
+
+QString Page::text(const QRectF &r) const
+{
+  return text(r, PhysicalLayout);
+}
+
+bool Page::search(const QString &text, double &sLeft, double &sTop, double &sRight, double &sBottom, SearchDirection direction, SearchMode caseSensitive, Rotation rotate) const
+{
+  const QChar * str = text.unicode();
+  int len = text.length();
+  QVector<Unicode> u(len);
+  for (int i = 0; i < len; ++i) u[i] = str[i].unicode();
+
+  GBool sCase;
+  if (caseSensitive == CaseSensitive) sCase = gTrue;
+  else sCase = gFalse;
+
+  bool found = false;
+
+  int rotation = (int)rotate * 90;
+
+  // fetch ourselves a textpage
+  TextOutputDev td(NULL, gTrue, 0, gFalse, gFalse);
+  m_page->parentDoc->doc->displayPage( &td, m_page->index + 1, 72, 72, rotation, false, true, false );
+  TextPage *textPage=td.takeText();
+
+  if (direction == FromTop)
+    found = textPage->findText( u.data(), len, 
+            gTrue, gTrue, gFalse, gFalse, sCase, gFalse, gFalse, &sLeft, &sTop, &sRight, &sBottom );
+  else if ( direction == NextResult )
+    found = textPage->findText( u.data(), len, 
+            gFalse, gTrue, gTrue, gFalse, sCase, gFalse, gFalse, &sLeft, &sTop, &sRight, &sBottom );
+  else if ( direction == PreviousResult )
+    found = textPage->findText( u.data(), len, 
+            gFalse, gTrue, gTrue, gFalse, sCase, gTrue, gFalse, &sLeft, &sTop, &sRight, &sBottom );
+
+  textPage->decRefCnt();
+
+  return found;
+}
+
+bool Page::search(const QString &text, QRectF &rect, SearchDirection direction, SearchMode caseSensitive, Rotation rotate) const
+{
+  double sLeft, sTop, sRight, sBottom;
+  sLeft = rect.left();
+  sTop = rect.top();
+  sRight = rect.right();
+  sBottom = rect.bottom();
+
+  bool found = search(text, sLeft, sTop, sRight, sBottom, direction, caseSensitive, rotate);
+
+  rect.setLeft( sLeft );
+  rect.setTop( sTop );
+  rect.setRight( sRight );
+  rect.setBottom( sBottom );
+
+  return found;
+}
+
+QList<TextBox*> Page::textList(Rotation rotate) const
+{
+  TextOutputDev *output_dev;
+  
+  QList<TextBox*> output_list;
+  
+  output_dev = new TextOutputDev(0, gFalse, 0, gFalse, gFalse);
+  
+  int rotation = (int)rotate * 90;
+
+  m_page->parentDoc->doc->displayPageSlice(output_dev, m_page->index + 1, 72, 72,
+      rotation, false, false, false, -1, -1, -1, -1);
+
+  TextWordList *word_list = output_dev->makeWordList();
+  
+  if (!word_list) {
+    delete output_dev;
+    return output_list;
+  }
+  
+  QHash<TextWord *, TextBox*> wordBoxMap;
+  
+  for (int i = 0; i < word_list->getLength(); i++) {
+    TextWord *word = word_list->get(i);
+    GooString *gooWord = word->getText();
+    QString string = QString::fromUtf8(gooWord->getCString());
+    delete gooWord;
+    double xMin, yMin, xMax, yMax;
+    word->getBBox(&xMin, &yMin, &xMax, &yMax);
+    
+    TextBox* text_box = new TextBox(string, QRectF(xMin, yMin, xMax-xMin, yMax-yMin));
+    text_box->m_data->hasSpaceAfter = word->hasSpaceAfter() == gTrue;
+    text_box->m_data->charBBoxes.reserve(word->getLength());
+    for (int j = 0; j < word->getLength(); ++j)
+    {
+        word->getCharBBox(j, &xMin, &yMin, &xMax, &yMax);
+        text_box->m_data->charBBoxes.append(QRectF(xMin, yMin, xMax-xMin, yMax-yMin));
+    }
+    
+    wordBoxMap.insert(word, text_box);
+    
+    output_list.append(text_box);
+  }
+  
+  for (int i = 0; i < word_list->getLength(); i++) {
+    TextWord *word = word_list->get(i);
+    TextBox* text_box = wordBoxMap.value(word);
+    text_box->m_data->nextWord = wordBoxMap.value(word->nextWord());
+  }
+  
+  delete word_list;
+  delete output_dev;
+  
+  return output_list;
+}
+
+PageTransition *Page::transition() const
+{
+  if (!m_page->transition) {
+    Object o;
+    PageTransitionParams params;
+    params.dictObj = m_page->page->getTrans(&o);
+    if (params.dictObj->isDict()) m_page->transition = new PageTransition(params);
+    o.free();
+  }
+  return m_page->transition;
+}
+
+Link *Page::action( PageAction act ) const
+{
+  if ( act == Page::Opening || act == Page::Closing )
+  {
+    Object o;
+    m_page->page->getActions(&o);
+    if (!o.isDict())
+    {
+      o.free();
+      return 0;
+    }
+    Dict *dict = o.getDict();
+    Object o2;
+    const char *key = act == Page::Opening ? "O" : "C";
+    dict->lookup((char*)key, &o2);
+    ::LinkAction *lact = ::LinkAction::parseAction(&o2, m_page->parentDoc->doc->getCatalog()->getBaseURI() );
+    o2.free();
+    o.free();
+    Link *popplerLink = NULL;
+    if (lact != NULL)
+    {
+      popplerLink = m_page->convertLinkActionToLink(lact, QRectF());
+      delete lact;
+    }
+    return popplerLink;
+  }
+  return 0;
+}
+
+QSizeF Page::pageSizeF() const
+{
+  Page::Orientation orient = orientation();
+  if ( ( Page::Landscape == orient ) || (Page::Seascape == orient ) ) {
+      return QSizeF( m_page->page->getCropHeight(), m_page->page->getCropWidth() );
+  } else {
+    return QSizeF( m_page->page->getCropWidth(), m_page->page->getCropHeight() );
+  }
+}
+
+QSize Page::pageSize() const
+{
+  return pageSizeF().toSize();
+}
+
+Page::Orientation Page::orientation() const
+{
+  const int rotation = m_page->page->getRotate();
+  switch (rotation) {
+  case 90:
+    return Page::Landscape;
+    break;
+  case 180:
+    return Page::UpsideDown;
+    break;
+  case 270:
+    return Page::Seascape;
+    break;
+  default:
+    return Page::Portrait;
+  }
+}
+
+void Page::defaultCTM(double *CTM, double dpiX, double dpiY, int rotate, bool upsideDown)
+{
+  m_page->page->getDefaultCTM(CTM, dpiX, dpiY, rotate, gFalse, upsideDown);
+}
+
+QList<Link*> Page::links() const
+{
+  LinkExtractorOutputDev link_dev(m_page);
+  m_page->parentDoc->doc->processLinks(&link_dev, m_page->index + 1);
+  QList<Link*> popplerLinks = link_dev.links();
+
+  return popplerLinks;
+}
+
+QList<Annotation*> Page::annotations() const
+{
+  return AnnotationPrivate::findAnnotations(m_page->page, m_page->parentDoc);
+}
+
+void Page::addAnnotation( const Annotation *ann )
+{
+  AnnotationPrivate::addAnnotationToPage(m_page->page, m_page->parentDoc, ann);
+}
+
+void Page::removeAnnotation( const Annotation *ann )
+{
+  AnnotationPrivate::removeAnnotationFromPage(m_page->page, ann);
+}
+
+QList<FormField*> Page::formFields() const
+{
+  QList<FormField*> fields;
+  ::Page *p = m_page->page;
+  ::FormPageWidgets * form = p->getFormWidgets();
+  int formcount = form->getNumWidgets();
+  for (int i = 0; i < formcount; ++i)
+  {
+    ::FormWidget *fm = form->getWidget(i);
+    FormField * ff = NULL;
+    switch (fm->getType())
+    {
+      case formButton:
+      {
+        ff = new FormFieldButton(m_page->parentDoc, p, static_cast<FormWidgetButton*>(fm));
+      }
+      break;
+
+      case formText:
+      {
+        ff = new FormFieldText(m_page->parentDoc, p, static_cast<FormWidgetText*>(fm));
+      }
+      break;
+
+      case formChoice:
+      {
+        ff = new FormFieldChoice(m_page->parentDoc, p, static_cast<FormWidgetChoice*>(fm));
+      }
+      break;
+
+      default: ;
+    }
+
+    if (ff)
+      fields.append(ff);
+  }
+
+  delete form;
+
+  return fields;
+}
+
+double Page::duration() const
+{
+  return m_page->page->getDuration();
+}
+
+QString Page::label() const
+{
+  GooString goo;
+  if (!m_page->parentDoc->doc->getCatalog()->indexToLabel(m_page->index, &goo))
+    return QString();
+
+  return UnicodeParsedString(&goo);
+}
+
+
+}
diff --git a/qt4/src/poppler-pdf-converter.cc b/qt4/src/poppler-pdf-converter.cc
new file mode 100644 (file)
index 0000000..9699b75
--- /dev/null
@@ -0,0 +1,115 @@
+/* poppler-pdf-converter.cc: qt4 interface to poppler
+ * Copyright (C) 2008, Pino Toscano <pino@kde.org>
+ * Copyright (C) 2008, 2009, Albert Astals Cid <aacid@kde.org>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include "poppler-qt4.h"
+
+#include "poppler-private.h"
+#include "poppler-converter-private.h"
+#include "poppler-qiodeviceoutstream-private.h"
+
+#include <QtCore/QFile>
+
+#include <ErrorCodes.h>
+
+namespace Poppler {
+
+class PDFConverterPrivate : public BaseConverterPrivate
+{
+       public:
+               PDFConverterPrivate();
+
+               PDFConverter::PDFOptions opts;
+};
+
+PDFConverterPrivate::PDFConverterPrivate()
+       : BaseConverterPrivate(), opts(0)
+{
+}
+
+
+PDFConverter::PDFConverter(DocumentData *document)
+       : BaseConverter(*new PDFConverterPrivate())
+{
+       Q_D(PDFConverter);
+       d->document = document;
+}
+
+PDFConverter::~PDFConverter()
+{
+}
+
+void PDFConverter::setPDFOptions(PDFConverter::PDFOptions options)
+{
+       Q_D(PDFConverter);
+       d->opts = options;
+}
+
+PDFConverter::PDFOptions PDFConverter::pdfOptions() const
+{
+       Q_D(const PDFConverter);
+       return d->opts;
+}
+
+bool PDFConverter::convert()
+{
+       Q_D(PDFConverter);
+       d->lastError = NoError;
+
+       if (d->document->locked)
+       {
+               d->lastError = FileLockedError;
+               return false;
+       }
+
+       QIODevice *dev = d->openDevice();
+       if (!dev)
+       {
+               d->lastError = OpenOutputError;
+               return false;
+       }
+
+       bool deleteFile = false;
+       if (QFile *file = qobject_cast<QFile*>(dev))
+               deleteFile = !file->exists();
+
+       int errorCode = errNone;
+       QIODeviceOutStream stream(dev);
+       if (d->opts & WithChanges)
+       {
+               errorCode = d->document->doc->saveAs(&stream);
+       }
+       else
+       {
+               errorCode = d->document->doc->saveWithoutChangesAs(&stream);
+       }
+       d->closeDevice();
+       if (errorCode != errNone)
+       {
+               if (deleteFile)
+               {
+                       qobject_cast<QFile*>(dev)->remove();
+               }
+               if (errorCode == errOpenFile) d->lastError = OpenOutputError;
+               else d->lastError = NotSupportedInputFileError;
+       }
+
+       return (errorCode == errNone);
+}
+
+}
diff --git a/qt4/src/poppler-private.cc b/qt4/src/poppler-private.cc
new file mode 100644 (file)
index 0000000..ffb5b92
--- /dev/null
@@ -0,0 +1,292 @@
+/* poppler-private.cc: qt interface to poppler
+ * Copyright (C) 2005, Net Integration Technologies, Inc.
+ * Copyright (C) 2006, 2011 by Albert Astals Cid <aacid@kde.org>
+ * Copyright (C) 2008, 2010, 2011 by Pino Toscano <pino@kde.org>
+ * Inspired on code by
+ * Copyright (C) 2004 by Albert Astals Cid <tsdgeos@terra.es>
+ * Copyright (C) 2004 by Enrico Ros <eros.kde@email.it>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include "poppler-private.h"
+
+#include <QtCore/QByteArray>
+#include <QtCore/QDebug>
+#include <QtCore/QVariant>
+
+#include <Link.h>
+#include <Outline.h>
+#include <UnicodeMap.h>
+
+namespace Poppler {
+
+namespace Debug {
+
+    void qDebugDebugFunction(const QString &message, const QVariant & /*closure*/)
+    {
+        qDebug() << message;
+    }
+
+    PopplerDebugFunc debugFunction = qDebugDebugFunction;
+    QVariant debugClosure;
+
+}
+
+    static UnicodeMap *utf8Map = 0;
+
+    void setDebugErrorFunction(PopplerDebugFunc function, const QVariant &closure)
+    {
+        Debug::debugFunction = function ? function : Debug::qDebugDebugFunction;
+        Debug::debugClosure = closure;
+    }
+
+    void qt4ErrorFunction(void * /*data*/, ErrorCategory /*category*/, int pos, char *msg)
+    {
+        QString emsg;
+
+        if (pos >= 0)
+        {
+            emsg = QString::fromLatin1("Error (%1): ").arg(pos);
+        }
+        else
+        {
+            emsg = QString::fromLatin1("Error: ");
+        }
+        emsg += QString::fromAscii(msg);
+        (*Debug::debugFunction)(emsg, Debug::debugClosure);
+    }
+
+    QString unicodeToQString(Unicode* u, int len) {
+        if (!utf8Map)
+        {
+                GooString enc("UTF-8");
+                utf8Map = globalParams->getUnicodeMap(&enc);
+                utf8Map->incRefCnt();
+        }
+
+        // ignore the last character if it is 0x0
+        if ((len > 0) && (u[len - 1] == 0))
+        {
+            --len;
+        }
+
+        GooString convertedStr;
+        for (int i = 0; i < len; ++i)
+        {
+            char buf[8];
+            const int n = utf8Map->mapUnicode(u[i], buf, sizeof(buf));
+            convertedStr.append(buf, n);
+        }
+
+        return QString::fromUtf8(convertedStr.getCString(), convertedStr.getLength());
+    }
+
+    QString UnicodeParsedString(GooString *s1) {
+        if ( !s1 || s1->getLength() == 0 )
+            return QString();
+
+        GBool isUnicode;
+        int i;
+        Unicode u;
+        QString result;
+        if ( ( s1->getChar(0) & 0xff ) == 0xfe && ( s1->getLength() > 1 && ( s1->getChar(1) & 0xff ) == 0xff ) )
+        {
+            isUnicode = gTrue;
+            i = 2;
+            result.reserve( ( s1->getLength() - 2 ) / 2 );
+        }
+        else
+        {
+            isUnicode = gFalse;
+            i = 0;
+            result.reserve( s1->getLength() );
+        }
+        while ( i < s1->getLength() )
+        {
+            if ( isUnicode )
+            {
+                u = ( ( s1->getChar(i) & 0xff ) << 8 ) | ( s1->getChar(i+1) & 0xff );
+                i += 2;
+            }
+            else
+            {
+                u = s1->getChar(i) & 0xff;
+                ++i;
+            }
+            result += QChar( u );
+        }
+        return result;
+    }
+
+    GooString *QStringToUnicodeGooString(const QString &s) {
+        int len = s.length() * 2 + 2;
+        char *cstring = (char *)gmallocn(len, sizeof(char));
+        cstring[0] = 0xfe;
+        cstring[1] = 0xff;
+        for (int i = 0; i < s.length(); ++i)
+        {
+            cstring[2+i*2] = s.at(i).row();
+            cstring[3+i*2] = s.at(i).cell();
+        }
+        GooString *ret = new GooString(cstring, len);
+        gfree(cstring);
+        return ret;
+    }
+
+    GooString *QStringToGooString(const QString &s) {
+        int len = s.length();
+        char *cstring = (char *)gmallocn(s.length(), sizeof(char));
+        for (int i = 0; i < len; ++i)
+            cstring[i] = s.at(i).unicode();
+        GooString *ret = new GooString(cstring, len);
+        gfree(cstring);
+        return ret;
+    }
+
+    void linkActionToTocItem( ::LinkAction * a, DocumentData * doc, QDomElement * e )
+    {
+        if ( !a || !e )
+            return;
+
+        switch ( a->getKind() )
+        {
+            case actionGoTo:
+            {
+                // page number is contained/referenced in a LinkGoTo
+                LinkGoTo * g = static_cast< LinkGoTo * >( a );
+                LinkDest * destination = g->getDest();
+                if ( !destination && g->getNamedDest() )
+                {
+                    // no 'destination' but an internal 'named reference'. we could
+                    // get the destination for the page now, but it's VERY time consuming,
+                    // so better storing the reference and provide the viewport on demand
+                    GooString *s = g->getNamedDest();
+                    QChar *charArray = new QChar[s->getLength()];
+                    for (int i = 0; i < s->getLength(); ++i) charArray[i] = QChar(s->getCString()[i]);
+                    QString aux(charArray, s->getLength());
+                    e->setAttribute( "DestinationName", aux );
+                    delete[] charArray;
+                }
+                else if ( destination && destination->isOk() )
+                {
+                    LinkDestinationData ldd(destination, NULL, doc, false);
+                    e->setAttribute( "Destination", LinkDestination(ldd).toString() );
+                }
+                break;
+            }
+            case actionGoToR:
+            {
+                // page number is contained/referenced in a LinkGoToR
+                LinkGoToR * g = static_cast< LinkGoToR * >( a );
+                LinkDest * destination = g->getDest();
+                if ( !destination && g->getNamedDest() )
+                {
+                    // no 'destination' but an internal 'named reference'. we could
+                    // get the destination for the page now, but it's VERY time consuming,
+                    // so better storing the reference and provide the viewport on demand
+                    GooString *s = g->getNamedDest();
+                    QChar *charArray = new QChar[s->getLength()];
+                    for (int i = 0; i < s->getLength(); ++i) charArray[i] = QChar(s->getCString()[i]);
+                    QString aux(charArray, s->getLength());
+                    e->setAttribute( "DestinationName", aux );
+                    delete[] charArray;
+                }
+                else if ( destination && destination->isOk() )
+                {
+                    LinkDestinationData ldd(destination, NULL, doc, g->getFileName() != 0);
+                    e->setAttribute( "Destination", LinkDestination(ldd).toString() );
+                }
+                e->setAttribute( "ExternalFileName", g->getFileName()->getCString() );
+                break;
+            }
+            case actionURI:
+            {
+                LinkURI * u = static_cast< LinkURI * >( a );
+                e->setAttribute( "DestinationURI", u->getURI()->getCString() );
+            }
+            default: ;
+        }
+    }
+    
+    DocumentData::~DocumentData()
+    {
+        qDeleteAll(m_embeddedFiles);
+        delete (OptContentModel *)m_optContentModel;
+        delete doc;
+        delete m_outputDev;
+        delete m_fontInfoIterator;
+    
+        count --;
+        if ( count == 0 )
+        {
+            utf8Map = 0;
+            delete globalParams;
+        }
+      }
+    
+    void DocumentData::init()
+    {
+        m_fontInfoIterator = 0;
+        m_backend = Document::SplashBackend;
+        m_outputDev = 0;
+        paperColor = Qt::white;
+        m_hints = 0;
+        m_optContentModel = 0;
+      
+        if ( count == 0 )
+        {
+            utf8Map = 0;
+            globalParams = new GlobalParams();
+            setErrorCallback(qt4ErrorFunction, NULL);
+        }
+        count ++;
+    }
+
+
+    void DocumentData::addTocChildren( QDomDocument * docSyn, QDomNode * parent, GooList * items )
+    {
+        int numItems = items->getLength();
+        for ( int i = 0; i < numItems; ++i )
+        {
+            // iterate over every object in 'items'
+            OutlineItem * outlineItem = (OutlineItem *)items->get( i );
+
+            // 1. create element using outlineItem's title as tagName
+            QString name;
+            Unicode * uniChar = outlineItem->getTitle();
+            int titleLength = outlineItem->getTitleLength();
+            name = unicodeToQString(uniChar, titleLength);
+            if ( name.isEmpty() )
+                continue;
+
+            QDomElement item = docSyn->createElement( name );
+            parent->appendChild( item );
+
+            // 2. find the page the link refers to
+            ::LinkAction * a = outlineItem->getAction();
+            linkActionToTocItem( a, this, &item );
+
+            item.setAttribute( "Open", QVariant( (bool)outlineItem->isOpen() ).toString() );
+
+            // 3. recursively descend over children
+            outlineItem->open();
+            GooList * children = outlineItem->getKids();
+            if ( children )
+                addTocChildren( docSyn, &item, children );
+        }
+    }
+
+}
diff --git a/qt4/src/poppler-private.h b/qt4/src/poppler-private.h
new file mode 100644 (file)
index 0000000..6d2ef2a
--- /dev/null
@@ -0,0 +1,290 @@
+/* poppler-private.h: qt interface to poppler
+ * Copyright (C) 2005, Net Integration Technologies, Inc.
+ * Copyright (C) 2005, 2008, Brad Hards <bradh@frogmouth.net>
+ * Copyright (C) 2006-2009, 2011 by Albert Astals Cid <aacid@kde.org>
+ * Copyright (C) 2007-2009, 2011 by Pino Toscano <pino@kde.org>
+ * Copyright (C) 2011 Andreas Hartmetz <ahartmetz@gmail.com>
+ * Copyright (C) 2011 Hib Eris <hib@hiberis.nl>
+ * Inspired on code by
+ * Copyright (C) 2004 by Albert Astals Cid <tsdgeos@terra.es>
+ * Copyright (C) 2004 by Enrico Ros <eros.kde@email.it>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#ifndef _POPPLER_PRIVATE_H_
+#define _POPPLER_PRIVATE_H_
+
+#include <QtCore/QFile>
+#include <QtCore/QPointer>
+#include <QtCore/QVector>
+
+#include <config.h>
+#include <GfxState.h>
+#include <GlobalParams.h>
+#include <PDFDoc.h>
+#include <FontInfo.h>
+#include <OutputDev.h>
+#include <Error.h>
+#if defined(HAVE_SPLASH)
+#include <SplashOutputDev.h>
+#endif
+
+#include "poppler-qt4.h"
+#include "poppler-embeddedfile-private.h"
+
+class LinkDest;
+class FormWidget;
+
+namespace Poppler {
+
+    /* borrowed from kpdf */
+    QString unicodeToQString(Unicode* u, int len);
+
+    QString UnicodeParsedString(GooString *s1);
+
+    GooString *QStringToUnicodeGooString(const QString &s);
+
+    GooString *QStringToGooString(const QString &s);
+
+    void qt4ErrorFunction(int pos, char *msg, va_list args);
+
+    class LinkDestinationData
+    {
+        public:
+            LinkDestinationData( LinkDest *l, GooString *nd, Poppler::DocumentData *pdfdoc, bool external )
+             : ld(l), namedDest(nd), doc(pdfdoc), externalDest(external)
+            {
+            }
+
+            LinkDest *ld;
+            GooString *namedDest;
+            Poppler::DocumentData *doc;
+            bool externalDest;
+    };
+
+    class DocumentData {
+    public:
+       DocumentData(const QString &filePath, GooString *ownerPassword, GooString *userPassword)
+           {
+               init();
+               m_filePath = filePath;  
+
+#if defined(_WIN32)
+               wchar_t *fileName = new WCHAR[filePath.length()];
+               int length = filePath.toWCharArray(fileName); 
+               doc = new PDFDoc(fileName, length, ownerPassword, userPassword);
+               delete fileName;
+#else
+               GooString *fileName = new GooString(QFile::encodeName(filePath));
+               doc = new PDFDoc(fileName, ownerPassword, userPassword);
+#endif
+
+               delete ownerPassword;
+               delete userPassword;
+           }
+       
+       DocumentData(const QByteArray &data, GooString *ownerPassword, GooString *userPassword)
+           {
+               Object obj;
+               fileContents = data;
+               obj.initNull();
+               MemStream *str = new MemStream((char*)fileContents.data(), 0, fileContents.length(), &obj);
+               init();
+               doc = new PDFDoc(str, ownerPassword, userPassword);
+               delete ownerPassword;
+               delete userPassword;
+           }
+       
+       void init();
+       
+       ~DocumentData();
+       
+       OutputDev *getOutputDev()
+       {
+               if (!m_outputDev)
+               {
+                       switch (m_backend)
+                       {
+                       case Document::ArthurBackend:
+                       // create a splash backend even in case of the Arthur Backend
+                       case Document::SplashBackend:
+                       {
+#if defined(HAVE_SPLASH)
+                       SplashColor bgColor;
+                       bgColor[0] = paperColor.blue();
+                       bgColor[1] = paperColor.green();
+                       bgColor[2] = paperColor.red();
+                       GBool AA = m_hints & Document::TextAntialiasing ? gTrue : gFalse;
+                       SplashOutputDev * splashOutputDev = new SplashOutputDev(splashModeXBGR8, 4, gFalse, bgColor, gTrue, AA);
+                       splashOutputDev->setVectorAntialias(m_hints & Document::Antialiasing ? gTrue : gFalse);
+                       splashOutputDev->setFreeTypeHinting(m_hints & Document::TextHinting ? gTrue : gFalse, m_hints & Document::TextSlightHinting ? gTrue : gFalse);
+                       splashOutputDev->startDoc(doc);
+                       m_outputDev = splashOutputDev;
+#endif
+                       break;
+                       }
+                       }
+               }
+               return m_outputDev;
+       }
+       
+       void addTocChildren( QDomDocument * docSyn, QDomNode * parent, GooList * items );
+       
+       void setPaperColor(const QColor &color)
+       {
+               if (color == paperColor)
+                       return;
+
+               paperColor = color;
+               if ( m_outputDev == NULL )
+                       return;
+
+               switch ( m_backend )
+               {
+                       case Document::SplashBackend:
+                       {
+#if defined(HAVE_SPLASH)
+                               SplashOutputDev *splash_output = static_cast<SplashOutputDev *>( m_outputDev );
+                               SplashColor bgColor;
+                               bgColor[0] = paperColor.blue();
+                               bgColor[1] = paperColor.green();
+                               bgColor[2] = paperColor.red();
+                               splash_output->setPaperColor(bgColor);
+#endif
+                               break;
+                       }
+                       default: ;
+               }
+       }
+       
+       void fillMembers()
+       {
+               m_fontInfoIterator = new FontIterator(0, this);
+               int numEmb = doc->getCatalog()->numEmbeddedFiles();
+               if (!(0 == numEmb)) {
+                       // we have some embedded documents, build the list
+                       for (int yalv = 0; yalv < numEmb; ++yalv) {
+                               FileSpec *fs = doc->getCatalog()->embeddedFile(yalv);
+                               m_embeddedFiles.append(new EmbeddedFile(*new EmbeddedFileData(fs)));
+                       }
+               }
+       }
+       
+       static Document *checkDocument(DocumentData *doc);
+
+       PDFDoc *doc;
+       QString m_filePath;
+       QByteArray fileContents;
+       bool locked;
+       FontIterator *m_fontInfoIterator;
+       Document::RenderBackend m_backend;
+       OutputDev *m_outputDev;
+       QList<EmbeddedFile*> m_embeddedFiles;
+       QPointer<OptContentModel> m_optContentModel;
+       QColor paperColor;
+       int m_hints;
+       static int count;
+    };
+
+    class FontInfoData
+    {
+       public:
+               FontInfoData()
+               {
+                       isEmbedded = false;
+                       isSubset = false;
+                       type = FontInfo::unknown;
+               }
+               
+               FontInfoData( const FontInfoData &fid )
+               {
+                       fontName = fid.fontName;
+                       fontFile = fid.fontFile;
+                       isEmbedded = fid.isEmbedded;
+                       isSubset = fid.isSubset;
+                       type = fid.type;
+                       embRef = fid.embRef;
+               }
+               
+               FontInfoData( ::FontInfo* fi )
+               {
+                       if (fi->getName()) fontName = fi->getName()->getCString();
+                       if (fi->getFile()) fontFile = fi->getFile()->getCString();
+                       isEmbedded = fi->getEmbedded();
+                       isSubset = fi->getSubset();
+                       type = (Poppler::FontInfo::Type)fi->getType();
+                       embRef = fi->getEmbRef();
+               }
+
+               QString fontName;
+               QString fontFile;
+               bool isEmbedded : 1;
+               bool isSubset : 1;
+               FontInfo::Type type;
+               Ref embRef;
+    };
+
+    class FontIteratorData
+    {
+       public:
+               FontIteratorData( int startPage, DocumentData *dd )
+                 : fontInfoScanner( dd->doc, startPage )
+                 , totalPages( dd->doc->getNumPages() )
+                 , currentPage( qMax( startPage, 0 ) - 1 )
+               {
+               }
+
+               ~FontIteratorData()
+               {
+               }
+
+               FontInfoScanner fontInfoScanner;
+               int totalPages;
+               int currentPage;
+    };
+
+    class TextBoxData
+    {
+       public:
+               TextBoxData()
+                 : nextWord(0), hasSpaceAfter(false)
+               {
+               }
+
+               QString text;
+               QRectF bBox;
+               TextBox *nextWord;
+               QVector<QRectF> charBBoxes; // the boundingRect of each character
+               bool hasSpaceAfter;
+    };
+
+    class FormFieldData
+    {
+       public:
+               FormFieldData(DocumentData *_doc, ::Page *p, ::FormWidget *w) :
+               doc(_doc), page(p), fm(w)
+               {
+               }
+
+               DocumentData *doc;
+               ::Page *page;
+               ::FormWidget *fm;
+               QRectF box;
+    };
+
+}
+
+#endif
diff --git a/qt4/src/poppler-ps-converter.cc b/qt4/src/poppler-ps-converter.cc
new file mode 100644 (file)
index 0000000..63fb7b4
--- /dev/null
@@ -0,0 +1,272 @@
+/* poppler-ps-converter.cc: qt interface to poppler
+ * Copyright (C) 2007, 2009, 2010, Albert Astals Cid <aacid@kde.org>
+ * Copyright (C) 2008, Pino Toscano <pino@kde.org>
+ * Copyright (C) 2010 Hib Eris <hib@hiberis.nl>
+ * Copyright (C) 2011 Glad Deschrijver <glad.deschrijver@gmail.com>
+ * Copyright (C) 2012 Fabio D'Urso <fabiodurso@hotmail.it>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include "poppler-qt4.h"
+
+#include "poppler-private.h"
+#include "poppler-converter-private.h"
+
+#include "PSOutputDev.h"
+
+static void outputToQIODevice(void *stream, const char *data, int len)
+{
+       static_cast<QIODevice*>(stream)->write(data, len);
+}
+
+namespace Poppler {
+
+class PSConverterPrivate : public BaseConverterPrivate
+{
+       public:
+               PSConverterPrivate();
+
+               QList<int> pageList;
+               QString title;
+               double hDPI;
+               double vDPI;
+               int rotate;
+               int paperWidth;
+               int paperHeight;
+               int marginRight;
+               int marginBottom;
+               int marginLeft;
+               int marginTop;
+               PSConverter::PSOptions opts;
+               void (* pageConvertedCallback)(int page, void *payload);
+               void *pageConvertedPayload;
+};
+
+PSConverterPrivate::PSConverterPrivate()
+       : BaseConverterPrivate(),
+       hDPI(72), vDPI(72), rotate(0), paperWidth(-1), paperHeight(-1),
+       marginRight(0), marginBottom(0), marginLeft(0), marginTop(0),
+       opts(PSConverter::Printing), pageConvertedCallback(0),
+       pageConvertedPayload(0)
+{
+}
+
+
+PSConverter::PSConverter(DocumentData *document)
+       : BaseConverter(*new PSConverterPrivate())
+{
+       Q_D(PSConverter);
+       d->document = document;
+}
+
+PSConverter::~PSConverter()
+{
+}
+
+void PSConverter::setPageList(const QList<int> &pageList)
+{
+       Q_D(PSConverter);
+       d->pageList = pageList;
+}
+
+void PSConverter::setTitle(const QString &title)
+{
+       Q_D(PSConverter);
+       d->title = title;
+}
+
+void PSConverter::setHDPI(double hDPI)
+{
+       Q_D(PSConverter);
+       d->hDPI = hDPI;
+}
+
+void PSConverter::setVDPI(double vDPI)
+{
+       Q_D(PSConverter);
+       d->vDPI = vDPI;
+}
+
+void PSConverter::setRotate(int rotate)
+{
+       Q_D(PSConverter);
+       d->rotate = rotate;
+}
+
+void PSConverter::setPaperWidth(int paperWidth)
+{
+       Q_D(PSConverter);
+       d->paperWidth = paperWidth;
+}
+
+void PSConverter::setPaperHeight(int paperHeight)
+{
+       Q_D(PSConverter);
+       d->paperHeight = paperHeight;
+}
+
+void PSConverter::setRightMargin(int marginRight)
+{
+       Q_D(PSConverter);
+       d->marginRight = marginRight;
+}
+
+void PSConverter::setBottomMargin(int marginBottom)
+{
+       Q_D(PSConverter);
+       d->marginBottom = marginBottom;
+}
+
+void PSConverter::setLeftMargin(int marginLeft)
+{
+       Q_D(PSConverter);
+       d->marginLeft = marginLeft;
+}
+
+void PSConverter::setTopMargin(int marginTop)
+{
+       Q_D(PSConverter);
+       d->marginTop = marginTop;
+}
+
+void PSConverter::setStrictMargins(bool strictMargins)
+{
+       Q_D(PSConverter);
+       if (strictMargins)
+               d->opts |= StrictMargins;
+       else
+               d->opts &= ~StrictMargins;
+}
+
+void PSConverter::setForceRasterize(bool forceRasterize)
+{
+       Q_D(PSConverter);
+       if (forceRasterize)
+               d->opts |= ForceRasterization;
+       else
+               d->opts &= ~ForceRasterization;
+}
+
+void PSConverter::setPSOptions(PSConverter::PSOptions options)
+{
+       Q_D(PSConverter);
+       d->opts = options;
+}
+
+PSConverter::PSOptions PSConverter::psOptions() const
+{
+       Q_D(const PSConverter);
+       return d->opts;
+}
+
+void PSConverter::setPageConvertedCallback(void (* callback)(int page, void *payload), void *payload)
+{
+       Q_D(PSConverter);
+       d->pageConvertedCallback = callback;
+       d->pageConvertedPayload = payload;
+}
+
+static GBool annotDisplayDecideCbk(Annot *annot, void *user_data)
+{
+       if (annot->getType() == Annot::typeWidget)
+               return gTrue; // Never hide forms
+       else
+               return *(GBool*)user_data;
+}
+
+bool PSConverter::convert()
+{
+       Q_D(PSConverter);
+       d->lastError = NoError;
+
+       Q_ASSERT(!d->pageList.isEmpty());
+       Q_ASSERT(d->paperWidth != -1);
+       Q_ASSERT(d->paperHeight != -1);
+       
+       if (d->document->locked)
+       {
+               d->lastError = FileLockedError;
+               return false;
+       }
+       
+       QIODevice *dev = d->openDevice();
+       if (!dev)
+       {
+               d->lastError = OpenOutputError;
+               return false;
+       }
+
+       QByteArray pstitle8Bit = d->title.toLocal8Bit();
+       char* pstitlechar;
+       if (!d->title.isEmpty()) pstitlechar = pstitle8Bit.data();
+       else pstitlechar = 0;
+       
+       PSOutputDev *psOut = new PSOutputDev(outputToQIODevice, dev,
+                                            pstitlechar,
+                                            d->document->doc,
+                                            1,
+                                            d->document->doc->getNumPages(),
+                                            (d->opts & PrintToEPS) ? psModeEPS : psModePS,
+                                            d->paperWidth,
+                                            d->paperHeight,
+                                            gFalse,
+                                            d->marginLeft,
+                                            d->marginBottom,
+                                            d->paperWidth - d->marginRight,
+                                            d->paperHeight - d->marginTop,
+                                            (d->opts & ForceRasterization));
+       
+       if (d->opts & StrictMargins)
+       {
+               double xScale = ((double)d->paperWidth - (double)d->marginLeft - (double)d->marginRight) / (double)d->paperWidth;
+               double yScale = ((double)d->paperHeight - (double)d->marginBottom - (double)d->marginTop) / (double)d->paperHeight;
+               psOut->setScale(xScale, yScale);
+       }
+       
+       if (psOut->isOk())
+       {
+               GBool isPrinting = (d->opts & Printing) ? gTrue : gFalse;
+               GBool showAnnotations = (d->opts & HideAnnotations) ? gFalse : gTrue;
+               foreach(int page, d->pageList)
+               {
+                       d->document->doc->displayPage(psOut,
+                                                     page,
+                                                     d->hDPI,
+                                                     d->vDPI,
+                                                     d->rotate,
+                                                     gFalse,
+                                                     gTrue,
+                                                     isPrinting,
+                                                     NULL,
+                                                     NULL,
+                                                     annotDisplayDecideCbk,
+                                                     &showAnnotations);
+                       if (d->pageConvertedCallback)
+                               (*d->pageConvertedCallback)(page, d->pageConvertedPayload);
+               }
+               delete psOut;
+               d->closeDevice();
+               return true;
+       }
+       else
+       {
+               delete psOut;
+               d->closeDevice();
+               return false;
+       }
+}
+
+}
diff --git a/qt4/src/poppler-qiodeviceoutstream-private.h b/qt4/src/poppler-qiodeviceoutstream-private.h
new file mode 100644 (file)
index 0000000..e7faa29
--- /dev/null
@@ -0,0 +1,46 @@
+/* poppler-qiodevicestream-private.h: Qt4 interface to poppler
+ * Copyright (C) 2008, Pino Toscano <pino@kde.org>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#ifndef POPPLER_QIODEVICESTREAM_PRIVATE_H
+#define POPPLER_QIODEVICESTREAM_PRIVATE_H
+
+#include "Object.h"
+#include "Stream.h"
+
+class QIODevice;
+
+namespace Poppler {
+
+class QIODeviceOutStream : public OutStream
+{
+  public:
+    QIODeviceOutStream(QIODevice* device);
+    virtual ~QIODeviceOutStream();
+
+    virtual void close();
+    virtual int getPos();
+    virtual void put(char c);
+    virtual void printf(const char *format, ...);
+
+  private:
+    QIODevice *m_device;
+};
+
+}
+
+#endif
diff --git a/qt4/src/poppler-qiodeviceoutstream.cc b/qt4/src/poppler-qiodeviceoutstream.cc
new file mode 100644 (file)
index 0000000..b0054af
--- /dev/null
@@ -0,0 +1,63 @@
+/* poppler-qiodevicestream.cc: Qt4 interface to poppler
+ * Copyright (C) 2008, Pino Toscano <pino@kde.org>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include "poppler-qiodeviceoutstream-private.h"
+
+#include <QtCore/QIODevice>
+
+#include <stdio.h>
+
+#define QIODeviceOutStreamBufSize 8192
+
+namespace Poppler {
+
+QIODeviceOutStream::QIODeviceOutStream(QIODevice* device)
+  : m_device(device)
+{
+}
+
+QIODeviceOutStream::~QIODeviceOutStream()
+{
+}
+
+void QIODeviceOutStream::close()
+{
+}
+
+int QIODeviceOutStream::getPos()
+{
+  return (int)m_device->pos();
+}
+
+void QIODeviceOutStream::put(char c)
+{
+  m_device->putChar(c);
+}
+
+void QIODeviceOutStream::printf(const char *format, ...)
+{
+  va_list ap;
+  va_start(ap, format);
+  char buf[QIODeviceOutStreamBufSize];
+  size_t bufsize = 0;
+  bufsize = qvsnprintf(buf, QIODeviceOutStreamBufSize - 1, format, ap);
+  va_end(ap);
+  m_device->write(buf, bufsize);
+}
+
+}
diff --git a/qt4/src/poppler-qt4.h b/qt4/src/poppler-qt4.h
new file mode 100644 (file)
index 0000000..f314108
--- /dev/null
@@ -0,0 +1,1753 @@
+/* poppler-qt.h: qt interface to poppler
+ * Copyright (C) 2005, Net Integration Technologies, Inc.
+ * Copyright (C) 2005, 2007, Brad Hards <bradh@frogmouth.net>
+ * Copyright (C) 2005-2012, Albert Astals Cid <aacid@kde.org>
+ * Copyright (C) 2005, Stefan Kebekus <stefan.kebekus@math.uni-koeln.de>
+ * Copyright (C) 2006-2011, Pino Toscano <pino@kde.org>
+ * Copyright (C) 2009 Shawn Rutledge <shawn.t.rutledge@gmail.com>
+ * Copyright (C) 2010 Suzuki Toshiya <mpsuzuki@hiroshima-u.ac.jp>
+ * Copyright (C) 2010 Matthias Fauconneau <matthias.fauconneau@gmail.com>
+ * Copyright (C) 2011 Andreas Hartmetz <ahartmetz@gmail.com>
+ * Copyright (C) 2011 Glad Deschrijver <glad.deschrijver@gmail.com>
+ * Copyright (C) 2012, Guillermo A. Amaral B. <gamaral@kde.org>
+ * Copyright (C) 2012, Fabio D'Urso <fabiodurso@hotmail.it>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#ifndef __POPPLER_QT_H__
+#define __POPPLER_QT_H__
+
+#include "poppler-annotation.h"
+#include "poppler-link.h"
+#include "poppler-optcontent.h"
+#include "poppler-page-transition.h"
+
+#include <QtCore/QByteArray>
+#include <QtCore/QDateTime>
+#include <QtCore/QSet>
+#include <QtXml/QDomDocument>
+#include "poppler-export.h"
+
+class EmbFile;
+class Sound;
+class AnnotMovie;
+
+/**
+   The %Poppler Qt4 binding.
+*/
+namespace Poppler {
+
+    class Document;
+    class DocumentData;
+
+    class PageData;
+
+    class FormField;
+
+    class TextBoxData;
+
+    class PDFConverter;
+    class PSConverter;
+
+    /**
+       Debug/error function.
+
+       This function type is used for debugging & error output;
+       the first parameter is the actual message, the second is the unaltered
+       closure argument which was passed to the setDebugErrorFunction call.
+
+       \since 0.16
+    */
+    typedef void (*PopplerDebugFunc)(const QString & /*message*/, const QVariant & /*closure*/);
+
+    /**
+       Set a new debug/error output function.
+
+       If not set, by default error and debug messages will be sent to the
+       Qt \p qDebug() function.
+
+       \param debugFunction the new debug function
+       \param closure user data which will be passes as-is to the debug function
+
+       \since 0.16
+    */
+    POPPLER_QT4_EXPORT void setDebugErrorFunction(PopplerDebugFunc debugFunction, const QVariant &closure);
+
+    /**
+        Describes the physical location of text on a document page
+       
+        This very simple class describes the physical location of text
+       on the page. It consists of
+       - a QString that contains the text
+       - a QRectF that gives a box that describes where on the page
+       the text is found.
+    */
+    class POPPLER_QT4_EXPORT TextBox {
+    friend class Page;
+    public:
+      /**
+        The default constructor sets the \p text and the rectangle that
+        contains the text. Coordinated for the \p bBox are in points =
+        1/72 of an inch.
+      */
+      TextBox(const QString& text, const QRectF &bBox);
+      /**
+       Destructor.
+      */
+      ~TextBox();
+
+      /**
+         Returns the text of this text box
+      */
+      QString text() const;
+
+      /**
+         Returns the position of the text, in point, i.e., 1/72 of
+        an inch
+
+        \since 0.8
+      */
+      QRectF boundingBox() const;
+
+      /**
+         Returns the pointer to the next text box, if there is one.
+
+         Otherwise, it returns a null pointer.
+      */
+      TextBox *nextWord() const;
+
+      /**
+         Returns the bounding box of the \p i -th characted of the word.
+      */
+      QRectF charBoundingBox(int i) const;
+
+      /**
+         Returns whether there is a space character after this text box
+      */
+      bool hasSpaceAfter() const;
+
+    private:
+        Q_DISABLE_COPY(TextBox)
+
+       TextBoxData *m_data;
+    };
+
+
+    class FontInfoData;
+    /**
+       Container class for information about a font within a PDF
+       document
+    */
+    class POPPLER_QT4_EXPORT FontInfo {
+    friend class Document;
+    public:
+       /**
+          The type of font.
+       */
+       enum Type {
+               unknown,
+               Type1,
+               Type1C,
+               Type1COT,
+               Type3,
+               TrueType,
+               TrueTypeOT,
+               CIDType0,
+               CIDType0C,
+               CIDType0COT,
+               CIDTrueType,
+               CIDTrueTypeOT
+       };
+       
+       /// \cond PRIVATE
+       /**
+          Create a new font information container.
+       */
+       FontInfo();
+       
+       /**
+          Create a new font information container.
+       */
+       FontInfo( const FontInfoData &fid );
+       /// \endcond
+       
+       /**
+          Copy constructor.
+       */
+       FontInfo( const FontInfo &fi );
+       
+       /**
+          Destructor.
+       */
+       ~FontInfo();
+
+       /**
+          The name of the font. Can be QString::null if the font has no name
+       */
+       QString name() const;
+
+       /**
+          The path of the font file used to represent this font on this system,
+          or a null string is the font is embedded
+       */
+       QString file() const;
+
+       /**
+          Whether the font is embedded in the file, or not
+
+          \return true if the font is embedded
+       */
+       bool isEmbedded() const;
+
+       /**
+          Whether the font provided is only a subset of the full
+          font or not. This only has meaning if the font is embedded.
+
+          \return true if the font is only a subset
+       */
+       bool isSubset() const;
+
+       /**
+          The type of font encoding
+
+          \return a enumerated value corresponding to the font encoding used
+
+          \sa typeName for a string equivalent
+       */
+       Type type() const;
+
+       /**
+          The name of the font encoding used
+
+          \note if you are looking for the name of the font (as opposed to the
+          encoding format used), you probably want name().
+
+          \sa type for a enumeration version
+       */
+       QString typeName() const;
+
+       /**
+          Standard assignment operator
+       */
+       FontInfo& operator=( const FontInfo &fi );
+
+    private:
+       FontInfoData *m_data;
+    };
+
+
+    class FontIteratorData;
+    /**
+       Iterator for reading the fonts in a document.
+
+       FontIterator provides a Java-style iterator for reading the fonts in a
+       document.
+
+       You can use it in the following way:
+       \code
+Poppler::FontIterator* it = doc->newFontIterator();
+while (it->hasNext()) {
+  QList<Poppler::FontInfo> fonts = it->next();
+  // do something with the fonts
+}
+// after doing the job, the iterator must be freed
+delete it;
+       \endcode
+
+       \since 0.12
+    */
+    class POPPLER_QT4_EXPORT FontIterator {
+    friend class Document;
+    friend class DocumentData;
+    public:
+       /**
+          Destructor.
+       */
+       ~FontIterator();
+
+       /**
+          Returns the fonts of the current page and then advances the iterator
+          to the next page.
+       */
+       QList<FontInfo> next();
+
+       /**
+          Checks whether there is at least one more page to iterate, ie returns
+          false when the iterator is beyond the last page.
+       */
+       bool hasNext() const;
+
+       /**
+          Returns the current page where the iterator is.
+       */
+       int currentPage() const;
+
+    private:
+       Q_DISABLE_COPY( FontIterator )
+       FontIterator( int, DocumentData *dd );
+
+       FontIteratorData *d;
+    };
+
+
+    class EmbeddedFileData;
+    /**
+       Container class for an embedded file with a PDF document
+    */
+    class POPPLER_QT4_EXPORT EmbeddedFile {
+       friend class DocumentData;
+       friend class AnnotationPrivate;
+    public:
+       /// \cond PRIVATE
+       EmbeddedFile(EmbFile *embfile);
+       /// \endcond
+       
+       /**
+          Destructor.
+       */
+       ~EmbeddedFile();
+
+       /**
+          The name associated with the file
+       */
+       QString name() const;
+
+       /**
+          The description associated with the file, if any.
+
+          This will return an empty QString if there is no description element
+       */
+       QString description() const;
+
+       /**
+          The size of the file.
+       
+          This will return < 0 if there is no size element
+       */
+       int size() const;
+
+       /**
+          The modification date for the embedded file, if known.
+       */
+       QDateTime modDate() const;
+
+       /**
+          The creation date for the embedded file, if known.
+       */
+       QDateTime createDate() const;
+       
+       /**
+          The MD5 checksum of the file.
+               
+          This will return an empty QByteArray if there is no checksum element.
+       */
+       QByteArray checksum() const;
+
+       /**
+          The MIME type of the file, if known.
+       
+          \since 0.8
+       */
+       QString mimeType() const;
+
+       /**
+          The data as a byte array
+       */
+       QByteArray data();
+
+       /**
+          Is the embedded file valid?
+          
+          \since 0.12
+       */
+       bool isValid() const;
+
+       /**
+          A QDataStream for the actual data?
+       */
+       //QDataStream dataStream() const;
+
+    private:
+       Q_DISABLE_COPY(EmbeddedFile)
+       EmbeddedFile(EmbeddedFileData &dd);
+
+       EmbeddedFileData *m_embeddedFile;
+    };
+
+
+    /**
+       \brief A page in a document.
+
+       The Page class represents a single page within a PDF document.
+
+       You cannot construct a Page directly, but you have to use the Document
+       functions that return a new Page out of an index or a label.
+    */
+    class POPPLER_QT4_EXPORT Page {
+       friend class Document;
+    public:
+       /**
+          Destructor.
+       */
+       ~Page();
+
+       /**
+          The type of rotation to apply for an operation
+       */
+       enum Rotation { Rotate0 = 0,   ///< Do not rotate
+                       Rotate90 = 1,  ///< Rotate 90 degrees clockwise
+                       Rotate180 = 2, ///< Rotate 180 degrees
+                       Rotate270 = 3  ///< Rotate 270 degrees clockwise (90 degrees counterclockwise)
+       };
+
+       /**
+          The kinds of page actions
+       */
+       enum PageAction {
+           Opening,   ///< The action when a page is "opened"
+           Closing    ///< The action when a page is "closed"
+       };
+       
+       /**
+          How the text is going to be returned
+          \since 0.16
+       */
+       enum TextLayout {
+           PhysicalLayout,   ///< The text is layouted to resemble the real page layout
+           RawOrderLayout          ///< The text is returned without any type of processing
+       };
+
+        /**
+           Additional flags for the renderToPainter method
+           \since 0.16
+        */
+        enum PainterFlag {
+            /**
+               Do not save/restore the caller-owned painter.
+
+               renderToPainter() by default preserves, using save() + restore(),
+               the state of the painter specified; if this is not needed, this
+               flag can avoid this job
+             */
+            DontSaveAndRestore = 0x00000001
+        };
+        Q_DECLARE_FLAGS( PainterFlags, PainterFlag )
+
+       /** 
+          Render the page to a QImage using the current
+          \link Document::renderBackend() Document renderer\endlink.
+          
+          If \p x = \p y = \p w = \p h = -1, the method will automatically
+           compute the size of the image from the horizontal and vertical
+           resolutions specified in \p xres and \p yres. Otherwise, the
+           method renders only a part of the page, specified by the
+           parameters (\p x, \p y, \p w, \p h) in pixel coordinates. The returned
+           QImage then has size (\p w, \p h), independent of the page
+           size.
+
+          \param x specifies the left x-coordinate of the box, in
+          pixels.
+
+          \param y specifies the top y-coordinate of the box, in
+          pixels.
+
+          \param w specifies the width of the box, in pixels.
+
+          \param h specifies the height of the box, in pixels.
+
+          \param xres horizontal resolution of the graphics device,
+          in dots per inch
+
+          \param yres vertical resolution of the graphics device, in
+          dots per inch
+       
+          \param rotate how to rotate the page
+
+          \warning The parameter (\p x, \p y, \p w, \p h) are not
+          well-tested. Unusual or meaningless parameters may lead to
+          rather unexpected results.
+
+          \returns a QImage of the page, or a null image on failure.
+
+          \since 0.6
+        */
+       QImage renderToImage(double xres=72.0, double yres=72.0, int x=-1, int y=-1, int w=-1, int h=-1, Rotation rotate = Rotate0) const;
+
+        /**
+           Render the page to the specified QPainter using the current
+           \link Document::renderBackend() Document renderer\endlink.
+
+           If \p x = \p y = \p w = \p h = -1, the method will automatically
+           compute the size of the page area from the horizontal and vertical
+           resolutions specified in \p xres and \p yres. Otherwise, the
+           method renders only a part of the page, specified by the
+           parameters (\p x, \p y, \p w, \p h) in pixel coordinates.
+
+           \param painter the painter to paint on
+
+           \param x specifies the left x-coordinate of the box, in
+           pixels.
+
+           \param y specifies the top y-coordinate of the box, in
+           pixels.
+
+           \param w specifies the width of the box, in pixels.
+
+           \param h specifies the height of the box, in pixels.
+
+           \param xres horizontal resolution of the graphics device,
+           in dots per inch
+
+           \param yres vertical resolution of the graphics device, in
+           dots per inch
+
+           \param rotate how to rotate the page
+
+           \param flags additional painter flags
+
+           \warning The parameter (\p x, \p y, \p w, \p h) are not
+           well-tested. Unusual or meaningless parameters may lead to
+           rather unexpected results.
+
+           \returns whether the painting succeeded
+
+           \note This method is only supported for Arthur
+
+           \since 0.16
+        */
+        bool renderToPainter(QPainter* painter, double xres=72.0, double yres=72.0, int x=-1, int y=-1, int w=-1, int h=-1,
+                             Rotation rotate = Rotate0, PainterFlags flags = 0) const;
+
+       /**
+          Get the page thumbnail if it exists.
+
+          \return a QImage of the thumbnail, or a null image
+          if the PDF does not contain one for this page
+
+          \since 0.12
+       */
+       QImage thumbnail() const;
+
+       /**
+          Returns the text that is inside a specified rectangle
+
+          \param rect the rectangle specifying the area of interest,
+          with coordinates given in points, i.e., 1/72th of an inch.
+          If rect is null, all text on the page is given
+       
+          \since 0.16
+       **/
+       QString text(const QRectF &rect, TextLayout textLayout) const;
+
+       /**
+          Returns the text that is inside a specified rectangle.
+          The text is returned using the physical layout of the page
+
+          \param rect the rectangle specifying the area of interest,
+          with coordinates given in points, i.e., 1/72th of an inch.
+          If rect is null, all text on the page is given
+       **/
+       QString text(const QRectF &rect) const;
+       
+       /**
+          The starting point for a search
+       */
+       enum SearchDirection { FromTop,        ///< Start sorting at the top of the document
+                              NextResult,     ///< Find the next result, moving "down the page"
+                              PreviousResult  ///< Find the previous result, moving "up the page"
+       };
+
+       /**
+          The type of search to perform
+       */
+       enum SearchMode { CaseSensitive,   ///< Case differences cause no match in searching
+                         CaseInsensitive  ///< Case differences are ignored in matching
+       };
+       
+       /**
+          Returns true if the specified text was found.
+
+          \param text the text the search
+          \param rect in all directions is used to return where the text was found, for NextResult and PreviousResult
+                      indicates where to continue searching for
+          \param direction in which direction do the search
+          \param caseSensitive be case sensitive?
+          \param rotate the rotation to apply for the search order
+       **/
+       Q_DECL_DEPRECATED bool search(const QString &text, QRectF &rect, SearchDirection direction, SearchMode caseSensitive, Rotation rotate = Rotate0) const;
+       
+       /**
+          Returns true if the specified text was found.
+
+          \param text the text the search
+          \param rectXXX in all directions is used to return where the text was found, for NextResult and PreviousResult
+                      indicates where to continue searching for
+          \param direction in which direction do the search
+          \param caseSensitive be case sensitive?
+          \param rotate the rotation to apply for the search order
+          \since 0.14
+       **/
+       bool search(const QString &text, double &rectLeft, double &rectTop, double &rectRight, double &rectBottom, SearchDirection direction, SearchMode caseSensitive, Rotation rotate = Rotate0) const;
+
+       /**
+          Returns a list of text of the page
+
+          This method returns a QList of TextBoxes that contain all
+          the text of the page, with roughly one text word of text
+          per TextBox item.
+          
+          For text written in western languages (left-to-right and
+          up-to-down), the QList contains the text in the proper
+          order.
+
+          \note The caller owns the text boxes and they should
+                be deleted when no longer required.
+
+          \warning This method is not tested with Asian scripts
+       */
+       QList<TextBox*> textList(Rotation rotate = Rotate0) const;
+
+       /**
+          \return The dimensions (cropbox) of the page, in points (i.e. 1/72th of an inch)
+       */
+       QSizeF pageSizeF() const;
+
+       /**
+          \return The dimensions (cropbox) of the page, in points (i.e. 1/72th of an inch)
+       */
+       QSize pageSize() const;
+
+       /**
+         Returns the transition of this page
+
+         \returns a pointer to a PageTransition structure that
+         defines how transition to this page shall be performed.
+
+         \note The PageTransition structure is owned by this page, and will
+         automatically be destroyed when this page class is
+         destroyed.
+       **/
+       PageTransition *transition() const;
+       
+       /**
+         Gets the page action specified, or NULL if there is no action.
+
+         \since 0.6
+       **/
+       Link *action( PageAction act ) const;
+       
+       /**
+          Types of orientations that are possible
+       */
+       enum Orientation {
+           Landscape, ///< Landscape orientation (portrait, with 90 degrees clockwise rotation )
+           Portrait, ///< Normal portrait orientation
+           Seascape, ///< Seascape orientation (portrait, with 270 degrees clockwise rotation)
+           UpsideDown ///< Upside down orientation (portrait, with 180 degrees rotation)
+       };
+
+       /**
+          The orientation of the page
+       */
+       Orientation orientation() const;
+       
+       /**
+         The default CTM
+       */
+       void defaultCTM(double *CTM, double dpiX, double dpiY, int rotate, bool upsideDown);
+       
+       /**
+         Gets the links of the page
+       */
+       QList<Link*> links() const;
+       
+       /**
+        Returns the annotations of the page
+
+        \note If you call this method twice, you get different objects
+              pointing to the same annotations (see Annotation).
+              The caller owns the returned objects and they should be deleted
+              when no longer required.
+       */
+       QList<Annotation*> annotations() const;
+
+       /**
+        Adds an annotation to the page
+
+        \note Ownership of the annotation object stays with the caller, who can
+              delete it at any time.
+        \since 0.20
+       */
+       void addAnnotation( const Annotation *ann );
+
+       /**
+        Removes an annotation from the page and destroys the annotation object
+
+        \note There mustn't be other Annotation objects pointing this annotation
+        \since 0.20
+       */
+       void removeAnnotation( const Annotation *ann );
+
+       /**
+        Returns the form fields on the page
+        The caller gets the ownership of the returned objects.
+
+        \since 0.6
+       */
+       QList<FormField*> formFields() const;
+
+       /**
+        Returns the page duration. That is the time, in seconds, that the page
+        should be displayed before the presentation automatically advances to the next page.
+        Returns < 0 if duration is not set.
+
+        \since 0.6
+       */
+       double duration() const;
+       
+       /**
+          Returns the label of the page, or a null string is the page has no label.
+
+        \since 0.6
+       **/
+       QString label() const;
+       
+    private:
+       Q_DISABLE_COPY(Page)
+
+       Page(DocumentData *doc, int index);
+       PageData *m_page;
+    };
+
+/**
+   \brief PDF document.
+
+   The Document class represents a PDF document: its pages, and all the global
+   properties, metadata, etc.
+
+   \section ownership Ownership of the returned objects
+
+   All the functions that returns class pointers create new object, and the
+   responsability of those is given to the callee.
+
+   The only exception is \link Poppler::Page::transition() Page::transition()\endlink.
+
+   \section document-loading Loading
+
+   To get a Document, you have to load it via the load() & loadFromData()
+   functions.
+
+   In all the functions that have passwords as arguments, they \b must be Latin1
+   encoded. If you have a password that is a UTF-8 string, you need to use
+   QString::toLatin1() (or similar) to convert the password first.
+   If you have a UTF-8 character array, consider converting it to a QString first
+   (QString::fromUtf8(), or similar) before converting to Latin1 encoding.
+
+   \section document-rendering Rendering
+
+   To render pages of a document, you have different Document functions to set
+   various options.
+
+   \subsection document-rendering-backend Backends
+
+   %Poppler offers a different backends for rendering the pages. Currently
+   there are two backends (see #RenderBackend), but only the Splash engine works
+   well and has been tested.
+
+   The available rendering backends can be discovered via availableRenderBackends().
+   The current rendering backend can be changed using setRenderBackend().
+   Please note that setting a backend not listed in the available ones
+   will always result in null QImage's.
+
+   \section document-cms Color management support
+
+   %Poppler, if compiled with this support, provides functions to handle color
+   profiles.
+
+   To know whether the %Poppler version you are using has support for color
+   management, you can query Poppler::isCmsAvailable(). In case it is not
+   avilable, all the color management-related functions will either do nothing
+   or return null.
+*/
+    class POPPLER_QT4_EXPORT Document {
+       friend class Page;
+       friend class DocumentData;
+  
+    public:
+       /**
+          The page mode
+       */
+       enum PageMode {
+           UseNone,     ///< No mode - neither document outline nor thumbnail images are visible
+           UseOutlines, ///< Document outline visible
+           UseThumbs,   ///< Thumbnail images visible
+           FullScreen,  ///< Fullscreen mode (no menubar, windows controls etc)
+           UseOC,       ///< Optional content group panel visible
+           UseAttach    ///< Attachments panel visible
+       };
+  
+       /**
+          The page layout
+       */
+       enum PageLayout {
+           NoLayout,   ///< Layout not specified
+           SinglePage, ///< Display a single page
+           OneColumn,  ///< Display a single column of pages
+           TwoColumnLeft, ///< Display the pages in two columns, with odd-numbered pages on the left
+           TwoColumnRight, ///< Display the pages in two columns, with odd-numbered pages on the right
+           TwoPageLeft, ///< Display the pages two at a time, with odd-numbered pages on the left
+           TwoPageRight ///< Display the pages two at a time, with odd-numbered pages on the right
+       };
+
+       /**
+          The render backends available
+
+          \since 0.6
+       */
+       enum RenderBackend {
+           SplashBackend,   ///< Splash backend
+           ArthurBackend   ///< Arthur (Qt4) backend
+       };
+
+       /**
+          The render hints available
+
+          \since 0.6
+       */
+       enum RenderHint {
+           Antialiasing = 0x00000001,      ///< Antialiasing for graphics
+           TextAntialiasing = 0x00000002,  ///< Antialiasing for text
+           TextHinting = 0x00000004,       ///< Hinting for text \since 0.12.1
+           TextSlightHinting = 0x00000008  ///< Lighter hinting for text when combined with TextHinting \since 0.18
+       };
+       Q_DECLARE_FLAGS( RenderHints, RenderHint )
+
+       /**
+         Set a color display profile for the current document.
+
+         \param outputProfileA is a \c cmsHPROFILE of the LCMS library.
+
+          \since 0.12
+       */
+       void setColorDisplayProfile(void *outputProfileA);
+       /**
+         Set a color display profile for the current document.
+
+         \param name is the name of the display profile to set.
+
+          \since 0.12
+       */
+       void setColorDisplayProfileName(const QString &name);
+       /**
+         Return the current RGB profile.
+
+         \return a \c cmsHPROFILE of the LCMS library.
+
+          \since 0.12
+       */
+       void* colorRgbProfile() const;
+       /**
+         Return the current display profile.
+
+         \return a \c cmsHPROFILE of the LCMS library.
+
+          \since 0.12
+       */
+       void *colorDisplayProfile() const;
+
+       /**
+          Load the document from a file on disk
+
+          \param filePath the name (and path, if required) of the file to load
+          \param ownerPassword the Latin1-encoded owner password to use in
+          loading the file
+          \param userPassword the Latin1-encoded user ("open") password
+          to use in loading the file
+
+          \return the loaded document, or NULL on error
+
+          \note The caller owns the pointer to Document, and this should
+          be deleted when no longer required.
+       
+          \warning The returning document may be locked if a password is required
+          to open the file, and one is not provided (as the userPassword).
+       */
+       static Document *load(const QString & filePath,
+                             const QByteArray &ownerPassword=QByteArray(),
+                             const QByteArray &userPassword=QByteArray());
+       
+       /**
+          Load the document from memory
+
+          \param fileContents the file contents. They are copied so there is no need 
+                              to keep the byte array around for the full life time of 
+                              the document.
+          \param ownerPassword the Latin1-encoded owner password to use in
+          loading the file
+          \param userPassword the Latin1-encoded user ("open") password
+          to use in loading the file
+
+          \return the loaded document, or NULL on error
+
+          \note The caller owns the pointer to Document, and this should
+          be deleted when no longer required.
+       
+          \warning The returning document may be locked if a password is required
+          to open the file, and one is not provided (as the userPassword).
+
+          \since 0.6
+       */
+       static Document *loadFromData(const QByteArray &fileContents,
+                             const QByteArray &ownerPassword=QByteArray(),
+                             const QByteArray &userPassword=QByteArray());
+  
+       /**
+          Get a specified Page
+     
+          Note that this follows the PDF standard of being zero based - if you
+          want the first page, then you need an index of zero.
+       
+          The caller gets the ownership of the returned object.
+
+          \param index the page number index
+       */
+       Page *page(int index) const;
+
+       /**
+          \overload
+
+
+          The intent is that you can pass in a label like \c "ix" and
+          get the page with that label (which might be in the table of
+          contents), or pass in \c "1" and get the page that the user
+          expects (which might not be the first page, if there is a
+          title page and a table of contents).
+
+          \param label the page label
+       */
+       Page *page(const QString &label) const;
+
+       /**
+          The number of pages in the document
+       */
+       int numPages() const;
+  
+       /**
+          The type of mode that should be used by the application
+          when the document is opened. Note that while this is 
+          called page mode, it is really viewer application mode.
+       */
+       PageMode pageMode() const;
+
+       /**
+          The layout that pages should be shown in when the document
+          is first opened.  This basically describes how pages are
+          shown relative to each other.
+       */
+       PageLayout pageLayout() const;
+
+       /**
+          Provide the passwords required to unlock the document
+
+          \param ownerPassword the Latin1-encoded owner password to use in
+          loading the file
+          \param userPassword the Latin1-encoded user ("open") password
+          to use in loading the file
+       */
+       bool unlock(const QByteArray &ownerPassword, const QByteArray &userPassword);
+
+       /**
+          Determine if the document is locked
+       */
+       bool isLocked() const;
+
+       /**
+          The date associated with the document
+
+          You would use this method with something like:
+          \code
+QDateTime created = m_doc->date("CreationDate");
+QDateTime modified = m_doc->date("ModDate");
+          \endcode
+
+          The available dates are:
+          - CreationDate: the date of creation of the document
+          - ModDate: the date of the last change in the document
+
+          \param data the type of date that is required
+       */
+       QDateTime date( const QString & data ) const;
+
+       /**
+          Get specified information associated with the document
+
+          You would use this method with something like:
+          \code
+QString title = m_doc->info("Title");
+QString subject = m_doc->info("Subject");
+          \endcode
+
+          In addition to \c Title and \c Subject, other information that may
+          be available include \c Author, \c Keywords, \c Creator and \c Producer.
+
+          \param data the information that is required
+
+          \sa infoKeys() to get a list of the available keys
+       */
+       QString info( const QString & data ) const;
+
+       /**
+          Obtain a list of the available string information keys.
+       */
+       QStringList infoKeys() const;
+
+       /**
+          Test if the document is encrypted
+       */
+       bool isEncrypted() const;
+
+       /**
+          Test if the document is linearised
+
+          In some cases, this is called "fast web view", since it
+          is mostly an optimisation for viewing over the Web.
+       */
+       bool isLinearized() const;
+
+       /**
+          Test if the permissions on the document allow it to be
+          printed
+       */
+       bool okToPrint() const;
+
+       /**
+          Test if the permissions on the document allow it to be
+          printed at high resolution
+       */
+       bool okToPrintHighRes() const;
+
+       /**
+          Test if the permissions on the document allow it to be
+          changed.
+
+          \note depending on the type of change, it may be more
+          appropriate to check other properties as well.
+       */
+       bool okToChange() const;
+
+       /**
+          Test if the permissions on the document allow the
+          contents to be copied / extracted
+       */
+       bool okToCopy() const;
+
+       /**
+          Test if the permissions on the document allow annotations
+          to be added or modified, and interactive form fields (including
+          signature fields) to be completed.
+       */
+       bool okToAddNotes() const;
+
+       /**
+          Test if the permissions on the document allow interactive
+          form fields (including signature fields) to be completed.
+
+          \note this can be true even if okToAddNotes() is false - this
+          means that only form completion is permitted.
+       */
+       bool okToFillForm() const;
+
+       /**
+          Test if the permissions on the document allow interactive
+          form fields (including signature fields) to be set, created and
+          modified
+       */
+       bool okToCreateFormFields() const;
+
+       /**
+          Test if the permissions on the document allow content extraction
+          (text and perhaps other content) for accessibility usage (eg for
+          a screen reader)
+       */
+       bool okToExtractForAccessibility() const;
+
+       /**
+          Test if the permissions on the document allow it to be
+          "assembled" - insertion, rotation and deletion of pages;
+          or creation of bookmarks and thumbnail images.
+
+          \note this can be true even if okToChange() is false
+       */
+       bool okToAssemble() const;
+
+       /**
+          The version of the PDF specification that the document
+          conforms to
+
+          \deprecated use getPdfVersion and avoid float point
+          comparisons/handling
+       */
+       Q_DECL_DEPRECATED double pdfVersion() const;
+
+       /**
+          The version of the PDF specification that the document
+          conforms to
+
+          \param major an optional pointer to a variable where store the
+          "major" number of the version
+          \param minor an optional pointer to a variable where store the
+          "minor" number of the version
+
+          \since 0.12
+       */
+       void getPdfVersion(int *major, int *minor) const;
+  
+       /**
+          The fonts within the PDF document.
+
+          This is a shorthand for getting all the fonts at once.
+
+          \note this can take a very long time to run with a large
+          document. You may wish to use a FontIterator if you have more
+          than say 20 pages
+
+          \see newFontIterator()
+       */
+       QList<FontInfo> fonts() const;
+
+       /**
+          Scans for fonts within the PDF document.
+
+          \param numPages the number of pages to scan
+          \param fontList pointer to the list where the font information
+          should be placed
+
+          \note with this method you can scan for fonts only \em once for each
+          document; once the end is reached, no more scanning with this method
+          can be done
+
+          \return false if the end of the document has been reached
+
+          \deprecated this function is quite limited in its job (see note),
+          better use fonts() or newFontIterator()
+
+          \see fonts(), newFontIterator()
+       */
+       Q_DECL_DEPRECATED bool scanForFonts( int numPages, QList<FontInfo> *fontList ) const;
+
+       /**
+          Creates a new FontIterator object for font scanning.
+
+          The new iterator can be used for reading the font information of the
+          document, reading page by page.
+
+          The caller is responsible for the returned object, ie it should freed
+          it when no more useful.
+
+          \param startPage the initial page from which start reading fonts
+
+          \see fonts()
+
+          \since 0.12
+       */
+       FontIterator* newFontIterator( int startPage = 0 ) const;
+
+       /**
+          The font data if the font is an embedded one.
+
+          \since 0.10
+       */
+       QByteArray fontData(const FontInfo &font) const;
+
+       /**
+          The documents embedded within the PDF document.
+
+          \note there are two types of embedded document - this call
+          only accesses documents that are embedded at the document level.
+       */
+       QList<EmbeddedFile*> embeddedFiles() const;
+
+       /**
+          Whether there are any documents embedded in this PDF document.
+       */
+       bool hasEmbeddedFiles() const;
+       
+       /**
+         Gets the table of contents (TOC) of the Document.
+       
+         The caller is responsable for the returned object.
+       
+         In the tree the tag name is the 'screen' name of the entry. A tag can have
+         attributes. Here follows the list of tag attributes with meaning:
+         - Destination: A string description of the referred destination
+         - DestinationName: A 'named reference' to the viewport
+         - ExternalFileName: A link to a external filename
+         - Open: A bool value that tells whether the subbranch of the item is open or not
+       
+         Resolving the final destination for each item can be done in the following way:
+         - first, checking for 'Destination': if not empty, then a LinkDestination
+           can be constructed straight with it
+         - as second step, if the 'DestinationName' is not empty, then the destination
+           can be resolved using linkDestination()
+       
+         Note also that if 'ExternalFileName' is not emtpy, then the destination refers
+         to that document (and not to the current one).
+       
+         \returns the TOC, or NULL if the Document does not have one
+       */
+       QDomDocument *toc() const;
+       
+       /**
+          Tries to resolve the named destination \p name.
+       
+          \note this operation starts a search through the whole document
+       
+          \returns a new LinkDestination object if the named destination was
+          actually found, or NULL otherwise
+       */
+       LinkDestination *linkDestination( const QString &name );
+       
+       /**
+         Sets the paper color
+
+         \param color the new paper color
+        */
+       void setPaperColor(const QColor &color);
+       /**
+         The paper color
+
+         The default color is white.
+        */
+       QColor paperColor() const;
+
+       /**
+        Sets the backend used to render the pages.
+
+        \param backend the new rendering backend
+
+        \since 0.6
+        */
+       void setRenderBackend( RenderBackend backend );
+       /**
+         The currently set render backend
+
+         The default backend is \ref SplashBackend
+
+         \since 0.6
+        */
+       RenderBackend renderBackend() const;
+
+       /**
+         The available rendering backends.
+
+         \since 0.6
+        */
+       static QSet<RenderBackend> availableRenderBackends();
+
+       /**
+        Sets the render \p hint .
+
+        \note some hints may not be supported by some rendering backends.
+
+        \param on whether the flag should be added or removed.
+
+        \since 0.6
+        */
+       void setRenderHint( RenderHint hint, bool on = true );
+       /**
+         The currently set render hints.
+
+         \since 0.6
+        */
+       RenderHints renderHints() const;
+       
+       /**
+         Gets a new PS converter for this document.
+
+         The caller gets the ownership of the returned converter.
+
+         \since 0.6
+        */
+       PSConverter *psConverter() const;
+       
+       /**
+         Gets a new PDF converter for this document.
+
+         The caller gets the ownership of the returned converter.
+
+         \since 0.8
+        */
+       PDFConverter *pdfConverter() const;
+       
+       /**
+         Gets the metadata stream contents
+
+         \since 0.6
+       */
+       QString metadata() const;
+
+       /**
+          Test whether this document has "optional content".
+
+          Optional content is used to optionally turn on (display)
+          and turn off (not display) some elements of the document.
+          The most common use of this is for layers in design
+          applications, but it can be used for a range of things,
+          such as not including some content in printing, and
+          displaying content in the appropriate language.
+
+          \since 0.8
+       */
+       bool hasOptionalContent() const;
+
+       /**
+          Itemviews model for optional content.
+
+          The model is owned by the document.
+
+          \since 0.8
+       */
+       OptContentModel *optionalContentModel();
+
+       /**
+          Document-level JavaScript scripts.
+
+          Returns the list of document level JavaScript scripts to be always
+          executed before any other script.
+
+          \since 0.10
+       */
+       QStringList scripts() const;
+
+       /**
+          The PDF identifiers.
+
+          \param permanentId an optional pointer to a variable where store the
+          permanent ID of the document
+          \param updateId an optional pointer to a variable where store the
+          update ID of the document
+
+          \return whether the document has the IDs
+
+          \since 0.16
+       */
+       bool getPdfId(QByteArray *permanentId, QByteArray *updateId) const;
+
+       /**
+          Destructor.
+       */
+       ~Document();
+  
+    private:
+       Q_DISABLE_COPY(Document)
+
+       DocumentData *m_doc;
+       
+       Document(DocumentData *dataA);
+    };
+    
+    class BaseConverterPrivate;
+    class PSConverterPrivate;
+    class PDFConverterPrivate;
+    /**
+       \brief Base converter.
+
+       This is the base class for the converters.
+
+       \since 0.8
+    */
+    class POPPLER_QT4_EXPORT BaseConverter
+    {
+        friend class Document;
+        public:
+            /**
+              Destructor.
+            */
+            virtual ~BaseConverter();
+
+            /** Sets the output file name. You must set this or the output device. */
+            void setOutputFileName(const QString &outputFileName);
+
+            /**
+             * Sets the output device. You must set this or the output file name.
+             *
+             * \since 0.8
+             */
+            void setOutputDevice(QIODevice *device);
+
+            /**
+              Does the conversion.
+
+              \return whether the conversion succeeded
+            */
+            virtual bool convert() = 0;
+            
+            enum Error
+            {
+                NoError,
+                FileLockedError,
+                OpenOutputError,
+                NotSupportedInputFileError
+            };
+            
+            /**
+              Returns the last error
+              \since 0.12.1
+            */
+            Error lastError() const;
+
+        protected:
+            /// \cond PRIVATE
+            BaseConverter(BaseConverterPrivate &dd);
+            Q_DECLARE_PRIVATE(BaseConverter)
+            BaseConverterPrivate *d_ptr;
+            /// \endcond
+
+        private:
+            Q_DISABLE_COPY(BaseConverter)
+    };
+
+    /**
+       Converts a PDF to PS
+
+       Sizes have to be in Points (1/72 inch)
+
+       If you are using QPrinter you can get paper size by doing:
+       \code
+QPrinter dummy(QPrinter::PrinterResolution);
+dummy.setFullPage(true);
+dummy.setPageSize(myPageSize);
+width = dummy.width();
+height = dummy.height();
+       \endcode
+
+       \since 0.6
+    */
+    class POPPLER_QT4_EXPORT PSConverter : public BaseConverter
+    {
+        friend class Document;
+        public:
+            /**
+              Options for the PS export.
+
+              \since 0.10
+             */
+            enum PSOption {
+                Printing = 0x00000001,              ///< The PS is generated for printing purposes
+                StrictMargins = 0x00000002,
+                ForceRasterization = 0x00000004,
+                PrintToEPS = 0x00000008,            ///< Output EPS instead of PS \since 0.20
+                HideAnnotations = 0x00000010        ///< Don't print annotations \since 0.20
+            };
+            Q_DECLARE_FLAGS( PSOptions, PSOption )
+
+            /**
+              Destructor.
+            */
+            ~PSConverter();
+
+            /** Sets the list of pages to print. Mandatory. */
+            void setPageList(const QList<int> &pageList);
+
+            /**
+              Sets the title of the PS Document. Optional
+            */
+            void setTitle(const QString &title);
+
+            /**
+              Sets the horizontal DPI. Defaults to 72.0
+            */
+            void setHDPI(double hDPI);
+
+            /**
+              Sets the vertical DPI. Defaults to 72.0
+            */
+            void setVDPI(double vDPI);
+
+            /**
+              Sets the rotate. Defaults to not rotated
+            */
+            void setRotate(int rotate);
+
+            /**
+              Sets the output paper width. Has to be set.
+            */
+            void setPaperWidth(int paperWidth);
+
+            /**
+              Sets the output paper height. Has to be set.
+            */
+            void setPaperHeight(int paperHeight);
+
+            /**
+              Sets the output right margin. Defaults to 0
+            */
+            void setRightMargin(int marginRight);
+
+            /**
+              Sets the output bottom margin. Defaults to 0
+            */
+            void setBottomMargin(int marginBottom);
+
+            /**
+              Sets the output left margin. Defaults to 0
+            */
+            void setLeftMargin(int marginLeft);
+
+            /**
+              Sets the output top margin. Defaults to 0
+            */
+            void setTopMargin(int marginTop);
+
+            /**
+              Defines if margins have to be strictly followed (even if that
+              means changing aspect ratio), or if the margins can be adapted
+              to keep aspect ratio.
+
+              Defaults to false.
+            */
+            void setStrictMargins(bool strictMargins);
+
+            /** Defines if the page will be rasterized to an image before printing. Defaults to false */
+            void setForceRasterize(bool forceRasterize);
+
+            /**
+              Sets the options for the PS export.
+
+              \since 0.10
+             */
+            void setPSOptions(PSOptions options);
+
+            /**
+              The currently set options for the PS export.
+
+              The default flags are: Printing.
+
+              \since 0.10
+             */
+            PSOptions psOptions() const;
+
+            /**
+              Sets a function that will be called each time a page is converted.
+
+              The payload belongs to the caller.
+
+              \since 0.16
+             */
+            void setPageConvertedCallback(void (* callback)(int page, void *payload), void *payload);
+
+            bool convert();
+
+        private:
+            Q_DECLARE_PRIVATE(PSConverter)
+            Q_DISABLE_COPY(PSConverter)
+
+            PSConverter(DocumentData *document);
+    };
+
+    /**
+       Converts a PDF to PDF (thus saves a copy of the document).
+
+       \since 0.8
+    */
+    class POPPLER_QT4_EXPORT PDFConverter : public BaseConverter
+    {
+        friend class Document;
+        public:
+            /**
+              Options for the PDF export.
+             */
+            enum PDFOption {
+                WithChanges = 0x00000001        ///< The changes done to the document are saved as well
+            };
+            Q_DECLARE_FLAGS( PDFOptions, PDFOption )
+
+            /**
+              Destructor.
+            */
+            virtual ~PDFConverter();
+
+            /**
+              Sets the options for the PDF export.
+             */
+            void setPDFOptions(PDFOptions options);
+            /**
+              The currently set options for the PDF export.
+             */
+            PDFOptions pdfOptions() const;
+
+            bool convert();
+
+        private:
+            Q_DECLARE_PRIVATE(PDFConverter)
+            Q_DISABLE_COPY(PDFConverter)
+
+            PDFConverter(DocumentData *document);
+    };
+
+    /**
+       Conversion from PDF date string format to QDateTime
+    */
+    POPPLER_QT4_EXPORT QDateTime convertDate( char *dateString );
+
+    /**
+       Whether the color management functions are available.
+
+       \since 0.12
+    */
+    POPPLER_QT4_EXPORT bool isCmsAvailable();
+
+    class SoundData;
+    /**
+       Container class for a sound file in a PDF document.
+
+       A sound can be either External (in that case should be loaded the file
+       whose url is represented by url() ), or Embedded, and the player has to
+       play the data contained in data().
+
+       \since 0.6
+    */
+    class POPPLER_QT4_EXPORT SoundObject {
+    public:
+       /**
+          The type of sound
+       */
+       enum SoundType {
+           External,     ///< The real sound file is external
+           Embedded      ///< The sound is contained in the data
+       };
+
+       /**
+          The encoding format used for the sound
+       */
+       enum SoundEncoding {
+           Raw,          ///< Raw encoding, with unspecified or unsigned values in the range [ 0, 2^B - 1 ]
+           Signed,       ///< Twos-complement values
+           muLaw,        ///< mu-law-encoded samples
+           ALaw          ///< A-law-encoded samples
+       };
+
+       /// \cond PRIVATE
+       SoundObject(Sound *popplersound);
+       /// \endcond
+       
+       ~SoundObject();
+
+       /**
+          Is the sound embedded (SoundObject::Embedded) or external (SoundObject::External)?
+       */
+       SoundType soundType() const;
+
+       /**
+          The URL of the sound file to be played, in case of SoundObject::External
+       */
+       QString url() const;
+
+       /**
+          The data of the sound, in case of SoundObject::Embedded
+       */
+       QByteArray data() const;
+
+       /**
+          The sampling rate of the sound
+       */
+       double samplingRate() const;
+
+       /**
+          The number of sound channels to use to play the sound
+       */
+       int channels() const;
+
+       /**
+          The number of bits per sample value per channel
+       */
+       int bitsPerSample() const;
+
+       /**
+          The encoding used for the sound
+       */
+       SoundEncoding soundEncoding() const;
+
+    private:
+       Q_DISABLE_COPY(SoundObject)
+
+       SoundData *m_soundData;
+    };
+
+    class MovieData;
+    /**
+       Container class for a movie object in a PDF document.
+
+       \since 0.10
+    */
+    class POPPLER_QT4_EXPORT MovieObject {
+    friend class AnnotationPrivate;
+    public:
+       /**
+          The play mode for playing the movie
+       */
+       enum PlayMode {
+           PlayOnce,         ///< Play the movie once, closing the movie controls at the end
+           PlayOpen,         ///< Like PlayOnce, but leaving the controls open
+           PlayRepeat,       ///< Play continuously until stopped
+           PlayPalindrome    ///< Play forward, then backward, then again foward and so on until stopped
+       };
+
+       ~MovieObject();
+
+       /**
+          The URL of the movie to be played
+       */
+       QString url() const;
+
+       /**
+          The size of the movie
+       */
+       QSize size() const;
+
+       /**
+          The rotation (either 0, 90, 180, or 270 degrees clockwise) for the movie,
+       */
+       int rotation() const;
+
+       /**
+          Whether show a bar with movie controls
+       */
+       bool showControls() const;
+
+       /**
+          How to play the movie
+       */
+       PlayMode playMode() const;
+
+    private:
+       /// \cond PRIVATE
+       MovieObject( AnnotMovie *ann );
+       /// \endcond
+       
+       Q_DISABLE_COPY(MovieObject)
+
+       MovieData *m_movieData;
+    };
+
+}
+
+Q_DECLARE_OPERATORS_FOR_FLAGS(Poppler::Page::PainterFlags)
+Q_DECLARE_OPERATORS_FOR_FLAGS(Poppler::Document::RenderHints)
+Q_DECLARE_OPERATORS_FOR_FLAGS(Poppler::PDFConverter::PDFOptions)
+Q_DECLARE_OPERATORS_FOR_FLAGS(Poppler::PSConverter::PSOptions)
+
+#endif
diff --git a/qt4/src/poppler-sound.cc b/qt4/src/poppler-sound.cc
new file mode 100644 (file)
index 0000000..eb19b9d
--- /dev/null
@@ -0,0 +1,132 @@
+/* poppler-sound.cc: qt interface to poppler
+ * Copyright (C) 2006-2007, Pino Toscano <pino@kde.org>
+ * Copyright (C) 2008, Albert Astals Cid <aacid@kde.org>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include "poppler-qt4.h"
+
+#include "Object.h"
+#include "Stream.h"
+#include "Sound.h"
+
+namespace Poppler
+{
+
+class SoundData
+{
+public:
+       SoundData()
+         : m_soundObj( 0 )
+       {
+       }
+
+       ~SoundData()
+       {
+               delete m_soundObj;
+       }
+
+       SoundObject::SoundType m_type;
+       Sound *m_soundObj;
+};
+
+SoundObject::SoundObject(Sound *popplersound)
+{
+       m_soundData = new SoundData();
+       switch ( popplersound->getSoundKind() )
+       {
+               case soundEmbedded:
+                       m_soundData->m_type = SoundObject::Embedded;
+                       break;
+               case soundExternal:
+               default:
+                       m_soundData->m_type = SoundObject::External;
+                       break;
+       }
+
+       m_soundData->m_soundObj = popplersound->copy();
+}
+
+SoundObject::~SoundObject()
+{
+       delete m_soundData;
+}
+
+SoundObject::SoundType SoundObject::soundType() const
+{
+       return m_soundData->m_type;
+}
+
+QString SoundObject::url() const
+{
+       if ( m_soundData->m_type != SoundObject::External )
+               return QString();
+
+       GooString * goo = m_soundData->m_soundObj->getFileName();
+       return goo ? QString( goo->getCString() ) : QString();
+}
+
+QByteArray SoundObject::data() const
+{
+       if ( m_soundData->m_type != SoundObject::Embedded )
+               return QByteArray();
+
+       Stream *stream = m_soundData->m_soundObj->getStream();
+       stream->reset();
+       int dataLen = 0;
+       QByteArray fileArray;
+       int i;
+       while ( (i = stream->getChar()) != EOF) {
+               fileArray[dataLen] = (char)i;
+               ++dataLen;
+       }
+       fileArray.resize(dataLen);
+
+       return fileArray;
+}
+
+double SoundObject::samplingRate() const
+{
+       return m_soundData->m_soundObj->getSamplingRate();
+}
+
+int SoundObject::channels() const
+{
+       return m_soundData->m_soundObj->getChannels();
+}
+
+int SoundObject::bitsPerSample() const
+{
+       return m_soundData->m_soundObj->getBitsPerSample();
+}
+
+SoundObject::SoundEncoding SoundObject::soundEncoding() const
+{
+       switch ( m_soundData->m_soundObj->getEncoding() )
+       {
+               case soundRaw:
+                       return SoundObject::Raw;
+               case soundSigned:
+                       return SoundObject::Signed;
+               case soundMuLaw:
+                       return SoundObject::muLaw;
+               case soundALaw:
+                       return SoundObject::ALaw;
+       }
+       return SoundObject::Raw;
+}
+
+}
diff --git a/qt4/src/poppler-textbox.cc b/qt4/src/poppler-textbox.cc
new file mode 100644 (file)
index 0000000..88cf2a9
--- /dev/null
@@ -0,0 +1,63 @@
+/* poppler-qt.h: qt interface to poppler
+ * Copyright (C) 2005, Brad Hards <bradh@frogmouth.net>
+ * Copyright (C) 2006-2008, Albert Astals Cid <aacid@kde.org>
+ * Copyright (C) 2008, Pino Toscano <pino@kde.org>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include "poppler-qt4.h"
+#include "poppler-private.h"
+
+namespace Poppler {
+
+TextBox::TextBox(const QString& text, const QRectF &bBox)
+{
+       m_data = new TextBoxData();
+       m_data->text = text;
+       m_data->bBox = bBox;
+}
+
+TextBox::~TextBox()
+{
+       delete m_data;
+}
+
+QString TextBox::text() const
+{
+       return m_data->text;
+}
+
+QRectF TextBox::boundingBox() const
+{
+       return m_data->bBox;
+}
+
+TextBox *TextBox::nextWord() const
+{
+       return m_data->nextWord;
+}
+
+QRectF TextBox::charBoundingBox(int i) const
+{
+       return m_data->charBBoxes.value(i);
+}
+
+bool TextBox::hasSpaceAfter() const
+{
+       return m_data->hasSpaceAfter;
+}
+
+}
diff --git a/qt4/tests/CMakeLists.txt b/qt4/tests/CMakeLists.txt
new file mode 100644 (file)
index 0000000..028c1e1
--- /dev/null
@@ -0,0 +1,61 @@
+add_definitions(${QT4_DEFINITIONS})
+add_definitions(-DTESTDATADIR=\"${TESTDATADIR}\")
+
+include_directories(
+  ${CMAKE_CURRENT_SOURCE_DIR}
+  ${CMAKE_CURRENT_SOURCE_DIR}/../src
+  ${CMAKE_CURRENT_BINARY_DIR}
+  ${QT4_INCLUDE_DIR}
+)
+
+macro(QT4_ADD_SIMPLETEST exe source)
+  string(REPLACE "-" "" test_name ${exe})
+  set(${test_name}_SOURCES
+    ${source}
+  )
+  poppler_add_test(${exe} BUILD_QT4_TESTS ${${test_name}_SOURCES})
+  target_link_libraries(${exe} poppler-qt4)
+  if(MSVC)
+    target_link_libraries(${exe} poppler ${poppler_LIBS})
+  endif(MSVC)
+endmacro(QT4_ADD_SIMPLETEST)
+
+macro(QT4_ADD_QTEST exe source)
+  if (QT4_QTTEST_FOUND)
+    string(REPLACE "-" "" test_name ${exe})
+    set(${test_name}_SOURCES
+      ${source}
+    )
+    poppler_add_unittest(${exe} BUILD_QT4_TESTS ${${test_name}_SOURCES})
+    qt4_automoc(${${test_name}_SOURCES})
+    target_link_libraries(${exe} poppler-qt4 ${QT4_QTTEST_LIBRARY})
+    if(MSVC)
+      target_link_libraries(${exe} poppler ${poppler_LIBS})
+    endif(MSVC)
+  endif (QT4_QTTEST_FOUND)
+endmacro(QT4_ADD_QTEST)
+
+
+qt4_add_simpletest(test-poppler-qt4 test-poppler-qt4.cpp)
+qt4_add_simpletest(test-password-qt4 test-password-qt4.cpp)
+qt4_add_simpletest(poppler-fonts poppler-fonts.cpp)
+qt4_add_simpletest(poppler_attachments poppler-attachments.cpp)
+qt4_add_simpletest(stress-poppler-qt4 stress-poppler-qt4.cpp)
+qt4_add_simpletest(stress-poppler-dir stress-poppler-dir.cpp)
+qt4_add_simpletest(poppler-texts poppler-texts.cpp)
+
+qt4_add_qtest(check_attachments check_attachments.cpp)
+qt4_add_qtest(check_dateConversion check_dateConversion.cpp)
+qt4_add_qtest(check_fonts check_fonts.cpp)
+qt4_add_qtest(check_links check_links.cpp)
+qt4_add_qtest(check_metadata check_metadata.cpp)
+qt4_add_qtest(check_optcontent check_optcontent.cpp)
+qt4_add_qtest(check_pagelayout check_pagelayout.cpp)
+qt4_add_qtest(check_pagemode check_pagemode.cpp)
+qt4_add_qtest(check_password check_password.cpp)
+qt4_add_qtest(check_permissions check_permissions.cpp)
+qt4_add_qtest(check_search check_search.cpp)
+qt4_add_qtest(check_actualtext check_actualtext.cpp)
+if (NOT WIN32)
+  qt4_add_qtest(check_strings check_strings.cpp)
+endif (NOT WIN32)
diff --git a/qt4/tests/Makefile.am b/qt4/tests/Makefile.am
new file mode 100644 (file)
index 0000000..be8ea35
--- /dev/null
@@ -0,0 +1,139 @@
+AM_LDFLAGS = @auto_import_flags@
+
+INCLUDES =                                     \
+       -I$(top_srcdir)                         \
+       -I$(top_srcdir)/poppler                 \
+       -I$(top_srcdir)/qt4/src                 \
+       -DTESTDATADIR=\"$(TESTDATADIR)\"        \
+       $(FONTCONFIG_CFLAGS)                    \
+       $(POPPLER_QT4_CFLAGS)
+
+LDADDS =                                       \
+       $(top_builddir)/poppler/libpoppler.la   \
+       $(top_builddir)/qt4/src/libpoppler-qt4.la       \
+       $(FONTCONFIG_LIBS)                              \
+       $(POPPLER_QT4_LIBS)
+
+SUFFIXES: .moc
+
+.cpp.moc:
+       $(AM_V_GEN) $(MOCQT4) -i $< -o $@
+
+noinst_PROGRAMS = test-poppler-qt4 stress-poppler-qt4 \
+       poppler-fonts test-password-qt4 stress-poppler-dir \
+       poppler-attachments poppler-texts
+
+
+test_poppler_qt4_SOURCES =                     \
+       test-poppler-qt4.cpp
+
+test_poppler_qt4_LDADD = $(LDADDS)
+
+
+test_password_qt4_SOURCES =                    \
+       test-password-qt4.cpp
+
+test_password_qt4_LDADD = $(LDADDS)
+
+
+poppler_fonts_SOURCES =                        \
+       poppler-fonts.cpp
+
+poppler_fonts_LDADD = $(LDADDS)
+
+poppler_attachments_SOURCES =                  \
+       poppler-attachments.cpp
+
+poppler_attachments_LDADD = $(LDADDS)
+
+poppler_texts_SOURCES =                        \
+       poppler-texts.cpp
+
+poppler_texts_LDADD = $(LDADDS)
+
+
+stress_poppler_qt4_SOURCES =                   \
+       stress-poppler-qt4.cpp
+
+stress_poppler_qt4_LDADD = $(LDADDS)
+
+stress_poppler_dir_SOURCES =                   \
+       stress-poppler-dir.cpp
+
+stress_poppler_dir_LDADD = $(LDADDS)
+
+clean-generic:
+       rm -f *.moc
+
+if BUILD_POPPLER_QT4
+TESTS = \
+       check_attachments       \
+       check_actualtext        \
+       check_dateConversion    \
+       check_fonts             \
+       check_links             \
+       check_metadata          \
+       check_optcontent        \
+       check_permissions       \
+       check_pagemode          \
+       check_password          \
+       check_pagelayout        \
+       check_search            \
+       check_strings
+
+check_PROGRAMS = $(TESTS)
+
+check_attachments_SOURCES = check_attachments.cpp
+check_attachments.$(OBJEXT): check_attachments.moc
+check_attachments_LDADD = $(LDADDS) $(POPPLER_QT4_TEST_LIBS)
+
+check_actualtext_SOURCES = check_actualtext.cpp
+check_actualtext.$(OBJEXT): check_actualtext.moc
+check_actualtext_LDADD = $(LDADDS) $(POPPLER_QT4_TEST_LIBS)
+
+check_dateConversion_SOURCES = check_dateConversion.cpp
+check_dateConversion.$(OBJEXT): check_dateConversion.moc
+check_dateConversion_LDADD = $(LDADDS) $(POPPLER_QT4_TEST_LIBS)
+
+check_fonts_SOURCES = check_fonts.cpp
+check_fonts.$(OBJEXT): check_fonts.moc
+check_fonts_LDADD = $(LDADDS) $(POPPLER_QT4_TEST_LIBS)
+
+check_links_SOURCES = check_links.cpp
+check_links.$(OBJEXT): check_links.moc
+check_links_LDADD = $(LDADDS) $(POPPLER_QT4_TEST_LIBS)
+
+check_metadata_SOURCES = check_metadata.cpp
+check_metadata.$(OBJEXT): check_metadata.moc
+check_metadata_LDADD = $(LDADDS) $(POPPLER_QT4_TEST_LIBS)
+
+check_optcontent_SOURCES = check_optcontent.cpp
+check_optcontent.$(OBJEXT): check_optcontent.moc
+check_optcontent_LDADD = $(LDADDS) $(POPPLER_QT4_TEST_LIBS)
+
+check_pagemode_SOURCES = check_pagemode.cpp
+check_pagemode.$(OBJEXT): check_pagemode.moc
+check_pagemode_LDADD = $(LDADDS) $(POPPLER_QT4_TEST_LIBS)
+
+check_permissions_SOURCES = check_permissions.cpp
+check_permissions.$(OBJEXT): check_permissions.moc
+check_permissions_LDADD = $(LDADDS) $(POPPLER_QT4_TEST_LIBS)
+
+check_pagelayout_SOURCES = check_pagelayout.cpp
+check_pagelayout.$(OBJEXT): check_pagelayout.moc
+check_pagelayout_LDADD = $(LDADDS) $(POPPLER_QT4_TEST_LIBS)
+
+check_password_SOURCES = check_password.cpp
+check_password.$(OBJEXT): check_password.moc
+check_password_LDADD = $(LDADDS) $(POPPLER_QT4_TEST_LIBS)
+
+check_search_SOURCES = check_search.cpp
+check_search.$(OBJEXT): check_search.moc
+check_search_LDADD = $(LDADDS) $(POPPLER_QT4_TEST_LIBS)
+
+check_strings_SOURCES = check_strings.cpp
+check_strings.$(OBJEXT): check_strings.moc
+check_strings_LDADD = $(LDADDS) $(POPPLER_QT4_TEST_LIBS)
+
+endif
+
diff --git a/qt4/tests/Makefile.in b/qt4/tests/Makefile.in
new file mode 100644 (file)
index 0000000..53c79e5
--- /dev/null
@@ -0,0 +1,1041 @@
+# Makefile.in generated by automake 1.11.5 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software
+# Foundation, Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+@SET_MAKE@
+
+VPATH = @srcdir@
+am__make_dryrun = \
+  { \
+    am__dry=no; \
+    case $$MAKEFLAGS in \
+      *\\[\ \  ]*) \
+        echo 'am--echo: ; @echo "AM"  OK' | $(MAKE) -f - 2>/dev/null \
+          | grep '^AM OK$$' >/dev/null || am__dry=yes;; \
+      *) \
+        for am__flg in $$MAKEFLAGS; do \
+          case $$am__flg in \
+            *=*|--*) ;; \
+            *n*) am__dry=yes; break;; \
+          esac; \
+        done;; \
+    esac; \
+    test $$am__dry = yes; \
+  }
+pkgdatadir = $(datadir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkglibexecdir = $(libexecdir)/@PACKAGE@
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+noinst_PROGRAMS = test-poppler-qt4$(EXEEXT) \
+       stress-poppler-qt4$(EXEEXT) poppler-fonts$(EXEEXT) \
+       test-password-qt4$(EXEEXT) stress-poppler-dir$(EXEEXT) \
+       poppler-attachments$(EXEEXT) poppler-texts$(EXEEXT)
+@BUILD_POPPLER_QT4_TRUE@TESTS = check_attachments$(EXEEXT) \
+@BUILD_POPPLER_QT4_TRUE@       check_actualtext$(EXEEXT) \
+@BUILD_POPPLER_QT4_TRUE@       check_dateConversion$(EXEEXT) \
+@BUILD_POPPLER_QT4_TRUE@       check_fonts$(EXEEXT) \
+@BUILD_POPPLER_QT4_TRUE@       check_links$(EXEEXT) \
+@BUILD_POPPLER_QT4_TRUE@       check_metadata$(EXEEXT) \
+@BUILD_POPPLER_QT4_TRUE@       check_optcontent$(EXEEXT) \
+@BUILD_POPPLER_QT4_TRUE@       check_permissions$(EXEEXT) \
+@BUILD_POPPLER_QT4_TRUE@       check_pagemode$(EXEEXT) \
+@BUILD_POPPLER_QT4_TRUE@       check_password$(EXEEXT) \
+@BUILD_POPPLER_QT4_TRUE@       check_pagelayout$(EXEEXT) \
+@BUILD_POPPLER_QT4_TRUE@       check_search$(EXEEXT) \
+@BUILD_POPPLER_QT4_TRUE@       check_strings$(EXEEXT)
+@BUILD_POPPLER_QT4_TRUE@check_PROGRAMS = $(am__EXEEXT_1)
+subdir = qt4/tests
+DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/m4/acx_pthread.m4 \
+       $(top_srcdir)/m4/define-dir.m4 $(top_srcdir)/m4/gtk-doc.m4 \
+       $(top_srcdir)/m4/iconv.m4 $(top_srcdir)/m4/introspection.m4 \
+       $(top_srcdir)/m4/libjpeg.m4 $(top_srcdir)/m4/libtool.m4 \
+       $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \
+       $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \
+       $(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+       $(ACLOCAL_M4)
+mkinstalldirs = $(install_sh) -d
+CONFIG_HEADER = $(top_builddir)/config.h \
+       $(top_builddir)/poppler/poppler-config.h
+CONFIG_CLEAN_FILES =
+CONFIG_CLEAN_VPATH_FILES =
+@BUILD_POPPLER_QT4_TRUE@am__EXEEXT_1 = check_attachments$(EXEEXT) \
+@BUILD_POPPLER_QT4_TRUE@       check_actualtext$(EXEEXT) \
+@BUILD_POPPLER_QT4_TRUE@       check_dateConversion$(EXEEXT) \
+@BUILD_POPPLER_QT4_TRUE@       check_fonts$(EXEEXT) \
+@BUILD_POPPLER_QT4_TRUE@       check_links$(EXEEXT) \
+@BUILD_POPPLER_QT4_TRUE@       check_metadata$(EXEEXT) \
+@BUILD_POPPLER_QT4_TRUE@       check_optcontent$(EXEEXT) \
+@BUILD_POPPLER_QT4_TRUE@       check_permissions$(EXEEXT) \
+@BUILD_POPPLER_QT4_TRUE@       check_pagemode$(EXEEXT) \
+@BUILD_POPPLER_QT4_TRUE@       check_password$(EXEEXT) \
+@BUILD_POPPLER_QT4_TRUE@       check_pagelayout$(EXEEXT) \
+@BUILD_POPPLER_QT4_TRUE@       check_search$(EXEEXT) \
+@BUILD_POPPLER_QT4_TRUE@       check_strings$(EXEEXT)
+PROGRAMS = $(noinst_PROGRAMS)
+am__check_actualtext_SOURCES_DIST = check_actualtext.cpp
+@BUILD_POPPLER_QT4_TRUE@am_check_actualtext_OBJECTS =  \
+@BUILD_POPPLER_QT4_TRUE@       check_actualtext.$(OBJEXT)
+check_actualtext_OBJECTS = $(am_check_actualtext_OBJECTS)
+am__DEPENDENCIES_1 =
+am__DEPENDENCIES_2 = $(top_builddir)/poppler/libpoppler.la \
+       $(top_builddir)/qt4/src/libpoppler-qt4.la \
+       $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1)
+@BUILD_POPPLER_QT4_TRUE@check_actualtext_DEPENDENCIES =  \
+@BUILD_POPPLER_QT4_TRUE@       $(am__DEPENDENCIES_2) \
+@BUILD_POPPLER_QT4_TRUE@       $(am__DEPENDENCIES_1)
+AM_V_lt = $(am__v_lt_@AM_V@)
+am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@)
+am__v_lt_0 = --silent
+am__check_attachments_SOURCES_DIST = check_attachments.cpp
+@BUILD_POPPLER_QT4_TRUE@am_check_attachments_OBJECTS =  \
+@BUILD_POPPLER_QT4_TRUE@       check_attachments.$(OBJEXT)
+check_attachments_OBJECTS = $(am_check_attachments_OBJECTS)
+@BUILD_POPPLER_QT4_TRUE@check_attachments_DEPENDENCIES =  \
+@BUILD_POPPLER_QT4_TRUE@       $(am__DEPENDENCIES_2) \
+@BUILD_POPPLER_QT4_TRUE@       $(am__DEPENDENCIES_1)
+am__check_dateConversion_SOURCES_DIST = check_dateConversion.cpp
+@BUILD_POPPLER_QT4_TRUE@am_check_dateConversion_OBJECTS =  \
+@BUILD_POPPLER_QT4_TRUE@       check_dateConversion.$(OBJEXT)
+check_dateConversion_OBJECTS = $(am_check_dateConversion_OBJECTS)
+@BUILD_POPPLER_QT4_TRUE@check_dateConversion_DEPENDENCIES =  \
+@BUILD_POPPLER_QT4_TRUE@       $(am__DEPENDENCIES_2) \
+@BUILD_POPPLER_QT4_TRUE@       $(am__DEPENDENCIES_1)
+am__check_fonts_SOURCES_DIST = check_fonts.cpp
+@BUILD_POPPLER_QT4_TRUE@am_check_fonts_OBJECTS =  \
+@BUILD_POPPLER_QT4_TRUE@       check_fonts.$(OBJEXT)
+check_fonts_OBJECTS = $(am_check_fonts_OBJECTS)
+@BUILD_POPPLER_QT4_TRUE@check_fonts_DEPENDENCIES =  \
+@BUILD_POPPLER_QT4_TRUE@       $(am__DEPENDENCIES_2) \
+@BUILD_POPPLER_QT4_TRUE@       $(am__DEPENDENCIES_1)
+am__check_links_SOURCES_DIST = check_links.cpp
+@BUILD_POPPLER_QT4_TRUE@am_check_links_OBJECTS =  \
+@BUILD_POPPLER_QT4_TRUE@       check_links.$(OBJEXT)
+check_links_OBJECTS = $(am_check_links_OBJECTS)
+@BUILD_POPPLER_QT4_TRUE@check_links_DEPENDENCIES =  \
+@BUILD_POPPLER_QT4_TRUE@       $(am__DEPENDENCIES_2) \
+@BUILD_POPPLER_QT4_TRUE@       $(am__DEPENDENCIES_1)
+am__check_metadata_SOURCES_DIST = check_metadata.cpp
+@BUILD_POPPLER_QT4_TRUE@am_check_metadata_OBJECTS =  \
+@BUILD_POPPLER_QT4_TRUE@       check_metadata.$(OBJEXT)
+check_metadata_OBJECTS = $(am_check_metadata_OBJECTS)
+@BUILD_POPPLER_QT4_TRUE@check_metadata_DEPENDENCIES =  \
+@BUILD_POPPLER_QT4_TRUE@       $(am__DEPENDENCIES_2) \
+@BUILD_POPPLER_QT4_TRUE@       $(am__DEPENDENCIES_1)
+am__check_optcontent_SOURCES_DIST = check_optcontent.cpp
+@BUILD_POPPLER_QT4_TRUE@am_check_optcontent_OBJECTS =  \
+@BUILD_POPPLER_QT4_TRUE@       check_optcontent.$(OBJEXT)
+check_optcontent_OBJECTS = $(am_check_optcontent_OBJECTS)
+@BUILD_POPPLER_QT4_TRUE@check_optcontent_DEPENDENCIES =  \
+@BUILD_POPPLER_QT4_TRUE@       $(am__DEPENDENCIES_2) \
+@BUILD_POPPLER_QT4_TRUE@       $(am__DEPENDENCIES_1)
+am__check_pagelayout_SOURCES_DIST = check_pagelayout.cpp
+@BUILD_POPPLER_QT4_TRUE@am_check_pagelayout_OBJECTS =  \
+@BUILD_POPPLER_QT4_TRUE@       check_pagelayout.$(OBJEXT)
+check_pagelayout_OBJECTS = $(am_check_pagelayout_OBJECTS)
+@BUILD_POPPLER_QT4_TRUE@check_pagelayout_DEPENDENCIES =  \
+@BUILD_POPPLER_QT4_TRUE@       $(am__DEPENDENCIES_2) \
+@BUILD_POPPLER_QT4_TRUE@       $(am__DEPENDENCIES_1)
+am__check_pagemode_SOURCES_DIST = check_pagemode.cpp
+@BUILD_POPPLER_QT4_TRUE@am_check_pagemode_OBJECTS =  \
+@BUILD_POPPLER_QT4_TRUE@       check_pagemode.$(OBJEXT)
+check_pagemode_OBJECTS = $(am_check_pagemode_OBJECTS)
+@BUILD_POPPLER_QT4_TRUE@check_pagemode_DEPENDENCIES =  \
+@BUILD_POPPLER_QT4_TRUE@       $(am__DEPENDENCIES_2) \
+@BUILD_POPPLER_QT4_TRUE@       $(am__DEPENDENCIES_1)
+am__check_password_SOURCES_DIST = check_password.cpp
+@BUILD_POPPLER_QT4_TRUE@am_check_password_OBJECTS =  \
+@BUILD_POPPLER_QT4_TRUE@       check_password.$(OBJEXT)
+check_password_OBJECTS = $(am_check_password_OBJECTS)
+@BUILD_POPPLER_QT4_TRUE@check_password_DEPENDENCIES =  \
+@BUILD_POPPLER_QT4_TRUE@       $(am__DEPENDENCIES_2) \
+@BUILD_POPPLER_QT4_TRUE@       $(am__DEPENDENCIES_1)
+am__check_permissions_SOURCES_DIST = check_permissions.cpp
+@BUILD_POPPLER_QT4_TRUE@am_check_permissions_OBJECTS =  \
+@BUILD_POPPLER_QT4_TRUE@       check_permissions.$(OBJEXT)
+check_permissions_OBJECTS = $(am_check_permissions_OBJECTS)
+@BUILD_POPPLER_QT4_TRUE@check_permissions_DEPENDENCIES =  \
+@BUILD_POPPLER_QT4_TRUE@       $(am__DEPENDENCIES_2) \
+@BUILD_POPPLER_QT4_TRUE@       $(am__DEPENDENCIES_1)
+am__check_search_SOURCES_DIST = check_search.cpp
+@BUILD_POPPLER_QT4_TRUE@am_check_search_OBJECTS =  \
+@BUILD_POPPLER_QT4_TRUE@       check_search.$(OBJEXT)
+check_search_OBJECTS = $(am_check_search_OBJECTS)
+@BUILD_POPPLER_QT4_TRUE@check_search_DEPENDENCIES =  \
+@BUILD_POPPLER_QT4_TRUE@       $(am__DEPENDENCIES_2) \
+@BUILD_POPPLER_QT4_TRUE@       $(am__DEPENDENCIES_1)
+am__check_strings_SOURCES_DIST = check_strings.cpp
+@BUILD_POPPLER_QT4_TRUE@am_check_strings_OBJECTS =  \
+@BUILD_POPPLER_QT4_TRUE@       check_strings.$(OBJEXT)
+check_strings_OBJECTS = $(am_check_strings_OBJECTS)
+@BUILD_POPPLER_QT4_TRUE@check_strings_DEPENDENCIES =  \
+@BUILD_POPPLER_QT4_TRUE@       $(am__DEPENDENCIES_2) \
+@BUILD_POPPLER_QT4_TRUE@       $(am__DEPENDENCIES_1)
+am_poppler_attachments_OBJECTS = poppler-attachments.$(OBJEXT)
+poppler_attachments_OBJECTS = $(am_poppler_attachments_OBJECTS)
+poppler_attachments_DEPENDENCIES = $(am__DEPENDENCIES_2)
+am_poppler_fonts_OBJECTS = poppler-fonts.$(OBJEXT)
+poppler_fonts_OBJECTS = $(am_poppler_fonts_OBJECTS)
+poppler_fonts_DEPENDENCIES = $(am__DEPENDENCIES_2)
+am_poppler_texts_OBJECTS = poppler-texts.$(OBJEXT)
+poppler_texts_OBJECTS = $(am_poppler_texts_OBJECTS)
+poppler_texts_DEPENDENCIES = $(am__DEPENDENCIES_2)
+am_stress_poppler_dir_OBJECTS = stress-poppler-dir.$(OBJEXT)
+stress_poppler_dir_OBJECTS = $(am_stress_poppler_dir_OBJECTS)
+stress_poppler_dir_DEPENDENCIES = $(am__DEPENDENCIES_2)
+am_stress_poppler_qt4_OBJECTS = stress-poppler-qt4.$(OBJEXT)
+stress_poppler_qt4_OBJECTS = $(am_stress_poppler_qt4_OBJECTS)
+stress_poppler_qt4_DEPENDENCIES = $(am__DEPENDENCIES_2)
+am_test_password_qt4_OBJECTS = test-password-qt4.$(OBJEXT)
+test_password_qt4_OBJECTS = $(am_test_password_qt4_OBJECTS)
+test_password_qt4_DEPENDENCIES = $(am__DEPENDENCIES_2)
+am_test_poppler_qt4_OBJECTS = test-poppler-qt4.$(OBJEXT)
+test_poppler_qt4_OBJECTS = $(am_test_poppler_qt4_OBJECTS)
+test_poppler_qt4_DEPENDENCIES = $(am__DEPENDENCIES_2)
+DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) -I$(top_builddir)/poppler
+depcomp = $(SHELL) $(top_srcdir)/depcomp
+am__depfiles_maybe = depfiles
+am__mv = mv -f
+CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
+       $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)
+LTCXXCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \
+       $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) \
+       $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
+       $(AM_CXXFLAGS) $(CXXFLAGS)
+AM_V_CXX = $(am__v_CXX_@AM_V@)
+am__v_CXX_ = $(am__v_CXX_@AM_DEFAULT_V@)
+am__v_CXX_0 = @echo "  CXX   " $@;
+AM_V_at = $(am__v_at_@AM_V@)
+am__v_at_ = $(am__v_at_@AM_DEFAULT_V@)
+am__v_at_0 = @
+CXXLD = $(CXX)
+CXXLINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \
+       $(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \
+       $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
+AM_V_CXXLD = $(am__v_CXXLD_@AM_V@)
+am__v_CXXLD_ = $(am__v_CXXLD_@AM_DEFAULT_V@)
+am__v_CXXLD_0 = @echo "  CXXLD " $@;
+AM_V_GEN = $(am__v_GEN_@AM_V@)
+am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@)
+am__v_GEN_0 = @echo "  GEN   " $@;
+SOURCES = $(check_actualtext_SOURCES) $(check_attachments_SOURCES) \
+       $(check_dateConversion_SOURCES) $(check_fonts_SOURCES) \
+       $(check_links_SOURCES) $(check_metadata_SOURCES) \
+       $(check_optcontent_SOURCES) $(check_pagelayout_SOURCES) \
+       $(check_pagemode_SOURCES) $(check_password_SOURCES) \
+       $(check_permissions_SOURCES) $(check_search_SOURCES) \
+       $(check_strings_SOURCES) $(poppler_attachments_SOURCES) \
+       $(poppler_fonts_SOURCES) $(poppler_texts_SOURCES) \
+       $(stress_poppler_dir_SOURCES) $(stress_poppler_qt4_SOURCES) \
+       $(test_password_qt4_SOURCES) $(test_poppler_qt4_SOURCES)
+DIST_SOURCES = $(am__check_actualtext_SOURCES_DIST) \
+       $(am__check_attachments_SOURCES_DIST) \
+       $(am__check_dateConversion_SOURCES_DIST) \
+       $(am__check_fonts_SOURCES_DIST) \
+       $(am__check_links_SOURCES_DIST) \
+       $(am__check_metadata_SOURCES_DIST) \
+       $(am__check_optcontent_SOURCES_DIST) \
+       $(am__check_pagelayout_SOURCES_DIST) \
+       $(am__check_pagemode_SOURCES_DIST) \
+       $(am__check_password_SOURCES_DIST) \
+       $(am__check_permissions_SOURCES_DIST) \
+       $(am__check_search_SOURCES_DIST) \
+       $(am__check_strings_SOURCES_DIST) \
+       $(poppler_attachments_SOURCES) $(poppler_fonts_SOURCES) \
+       $(poppler_texts_SOURCES) $(stress_poppler_dir_SOURCES) \
+       $(stress_poppler_qt4_SOURCES) $(test_password_qt4_SOURCES) \
+       $(test_poppler_qt4_SOURCES)
+am__can_run_installinfo = \
+  case $$AM_UPDATE_INFO_DIR in \
+    n|no|NO) false;; \
+    *) (install-info --version) >/dev/null 2>&1;; \
+  esac
+ETAGS = etags
+CTAGS = ctags
+am__tty_colors = \
+red=; grn=; lgn=; blu=; std=
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AR = @AR@
+AS = @AS@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CAIRO_CFLAGS = @CAIRO_CFLAGS@
+CAIRO_FEATURE = @CAIRO_FEATURE@
+CAIRO_LIBS = @CAIRO_LIBS@
+CAIRO_REQ = @CAIRO_REQ@
+CAIRO_VERSION = @CAIRO_VERSION@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CXX = @CXX@
+CXXCPP = @CXXCPP@
+CXXDEPMODE = @CXXDEPMODE@
+CXXFLAGS = @CXXFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DLLTOOL = @DLLTOOL@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+FGREP = @FGREP@
+FONTCONFIG_CFLAGS = @FONTCONFIG_CFLAGS@
+FONTCONFIG_LIBS = @FONTCONFIG_LIBS@
+FREETYPE_CFLAGS = @FREETYPE_CFLAGS@
+FREETYPE_CONFIG = @FREETYPE_CONFIG@
+FREETYPE_LIBS = @FREETYPE_LIBS@
+GLIB_MKENUMS = @GLIB_MKENUMS@
+GLIB_REQ = @GLIB_REQ@
+GLIB_REQUIRED = @GLIB_REQUIRED@
+GREP = @GREP@
+GTKDOC_CHECK = @GTKDOC_CHECK@
+GTKDOC_DEPS_CFLAGS = @GTKDOC_DEPS_CFLAGS@
+GTKDOC_DEPS_LIBS = @GTKDOC_DEPS_LIBS@
+GTKDOC_MKPDF = @GTKDOC_MKPDF@
+GTKDOC_REBASE = @GTKDOC_REBASE@
+GTK_TEST_CFLAGS = @GTK_TEST_CFLAGS@
+GTK_TEST_LIBS = @GTK_TEST_LIBS@
+HTML_DIR = @HTML_DIR@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+INTROSPECTION_CFLAGS = @INTROSPECTION_CFLAGS@
+INTROSPECTION_COMPILER = @INTROSPECTION_COMPILER@
+INTROSPECTION_GENERATE = @INTROSPECTION_GENERATE@
+INTROSPECTION_GIRDIR = @INTROSPECTION_GIRDIR@
+INTROSPECTION_LIBS = @INTROSPECTION_LIBS@
+INTROSPECTION_MAKEFILE = @INTROSPECTION_MAKEFILE@
+INTROSPECTION_SCANNER = @INTROSPECTION_SCANNER@
+INTROSPECTION_TYPELIBDIR = @INTROSPECTION_TYPELIBDIR@
+LCMS_CFLAGS = @LCMS_CFLAGS@
+LCMS_LIBS = @LCMS_LIBS@
+LD = @LD@
+LDFLAGS = @LDFLAGS@
+LIBCURL_CFLAGS = @LIBCURL_CFLAGS@
+LIBCURL_LIBS = @LIBCURL_LIBS@
+LIBICONV = @LIBICONV@
+LIBJPEG_CFLAGS = @LIBJPEG_CFLAGS@
+LIBJPEG_LIBS = @LIBJPEG_LIBS@
+LIBOBJS = @LIBOBJS@
+LIBOPENJPEG_CFLAGS = @LIBOPENJPEG_CFLAGS@
+LIBOPENJPEG_LIBS = @LIBOPENJPEG_LIBS@
+LIBPNG_CFLAGS = @LIBPNG_CFLAGS@
+LIBPNG_LIBS = @LIBPNG_LIBS@
+LIBS = @LIBS@
+LIBTIFF_CFLAGS = @LIBTIFF_CFLAGS@
+LIBTIFF_CFLAGSS = @LIBTIFF_CFLAGSS@
+LIBTIFF_LIBS = @LIBTIFF_LIBS@
+LIBTOOL = @LIBTOOL@
+LIPO = @LIPO@
+LN_S = @LN_S@
+LTLIBICONV = @LTLIBICONV@
+LTLIBOBJS = @LTLIBOBJS@
+MAKEINFO = @MAKEINFO@
+MANIFEST_TOOL = @MANIFEST_TOOL@
+MKDIR_P = @MKDIR_P@
+MOCQT4 = @MOCQT4@
+NM = @NM@
+NMEDIT = @NMEDIT@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+OTOOL = @OTOOL@
+OTOOL64 = @OTOOL64@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_URL = @PACKAGE_URL@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PC_REQUIRES = @PC_REQUIRES@
+PC_REQUIRES_PRIVATE = @PC_REQUIRES_PRIVATE@
+PDFTOCAIRO_CFLAGS = @PDFTOCAIRO_CFLAGS@
+PDFTOCAIRO_LIBS = @PDFTOCAIRO_LIBS@
+PKG_CONFIG = @PKG_CONFIG@
+PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@
+PKG_CONFIG_PATH = @PKG_CONFIG_PATH@
+POPPLER_DATADIR = @POPPLER_DATADIR@
+POPPLER_GLIB_CFLAGS = @POPPLER_GLIB_CFLAGS@
+POPPLER_GLIB_DISABLE_DEPRECATED = @POPPLER_GLIB_DISABLE_DEPRECATED@
+POPPLER_GLIB_DISABLE_SINGLE_INCLUDES = @POPPLER_GLIB_DISABLE_SINGLE_INCLUDES@
+POPPLER_GLIB_LIBS = @POPPLER_GLIB_LIBS@
+POPPLER_MAJOR_VERSION = @POPPLER_MAJOR_VERSION@
+POPPLER_MICRO_VERSION = @POPPLER_MICRO_VERSION@
+POPPLER_MINOR_VERSION = @POPPLER_MINOR_VERSION@
+POPPLER_QT4_CFLAGS = @POPPLER_QT4_CFLAGS@
+POPPLER_QT4_CXXFLAGS = @POPPLER_QT4_CXXFLAGS@
+POPPLER_QT4_LIBS = @POPPLER_QT4_LIBS@
+POPPLER_QT4_TEST_CFLAGS = @POPPLER_QT4_TEST_CFLAGS@
+POPPLER_QT4_TEST_LIBS = @POPPLER_QT4_TEST_LIBS@
+POPPLER_VERSION = @POPPLER_VERSION@
+PTHREAD_CC = @PTHREAD_CC@
+PTHREAD_CFLAGS = @PTHREAD_CFLAGS@
+PTHREAD_LIBS = @PTHREAD_LIBS@
+RANLIB = @RANLIB@
+SED = @SED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+TESTDATADIR = @TESTDATADIR@
+VERSION = @VERSION@
+XMKMF = @XMKMF@
+X_CFLAGS = @X_CFLAGS@
+X_EXTRA_LIBS = @X_EXTRA_LIBS@
+X_LIBS = @X_LIBS@
+X_PRE_LIBS = @X_PRE_LIBS@
+ZLIB_LIBS = @ZLIB_LIBS@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
+ac_ct_AR = @ac_ct_AR@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_CXX = @ac_ct_CXX@
+ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
+acx_pthread_config = @acx_pthread_config@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+auto_import_flags = @auto_import_flags@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+builddir = @builddir@
+create_shared_lib = @create_shared_lib@
+datadir = @datadir@
+datarootdir = @datarootdir@
+docdir = @docdir@
+dvidir = @dvidir@
+exec_prefix = @exec_prefix@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+htmldir = @htmldir@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localedir = @localedir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+srcdir = @srcdir@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+top_build_prefix = @top_build_prefix@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+win32_libs = @win32_libs@
+AM_LDFLAGS = @auto_import_flags@
+INCLUDES = \
+       -I$(top_srcdir)                         \
+       -I$(top_srcdir)/poppler                 \
+       -I$(top_srcdir)/qt4/src                 \
+       -DTESTDATADIR=\"$(TESTDATADIR)\"        \
+       $(FONTCONFIG_CFLAGS)                    \
+       $(POPPLER_QT4_CFLAGS)
+
+LDADDS = \
+       $(top_builddir)/poppler/libpoppler.la   \
+       $(top_builddir)/qt4/src/libpoppler-qt4.la       \
+       $(FONTCONFIG_LIBS)                              \
+       $(POPPLER_QT4_LIBS)
+
+test_poppler_qt4_SOURCES = \
+       test-poppler-qt4.cpp
+
+test_poppler_qt4_LDADD = $(LDADDS)
+test_password_qt4_SOURCES = \
+       test-password-qt4.cpp
+
+test_password_qt4_LDADD = $(LDADDS)
+poppler_fonts_SOURCES = \
+       poppler-fonts.cpp
+
+poppler_fonts_LDADD = $(LDADDS)
+poppler_attachments_SOURCES = \
+       poppler-attachments.cpp
+
+poppler_attachments_LDADD = $(LDADDS)
+poppler_texts_SOURCES = \
+       poppler-texts.cpp
+
+poppler_texts_LDADD = $(LDADDS)
+stress_poppler_qt4_SOURCES = \
+       stress-poppler-qt4.cpp
+
+stress_poppler_qt4_LDADD = $(LDADDS)
+stress_poppler_dir_SOURCES = \
+       stress-poppler-dir.cpp
+
+stress_poppler_dir_LDADD = $(LDADDS)
+@BUILD_POPPLER_QT4_TRUE@check_attachments_SOURCES = check_attachments.cpp
+@BUILD_POPPLER_QT4_TRUE@check_attachments_LDADD = $(LDADDS) $(POPPLER_QT4_TEST_LIBS)
+@BUILD_POPPLER_QT4_TRUE@check_actualtext_SOURCES = check_actualtext.cpp
+@BUILD_POPPLER_QT4_TRUE@check_actualtext_LDADD = $(LDADDS) $(POPPLER_QT4_TEST_LIBS)
+@BUILD_POPPLER_QT4_TRUE@check_dateConversion_SOURCES = check_dateConversion.cpp
+@BUILD_POPPLER_QT4_TRUE@check_dateConversion_LDADD = $(LDADDS) $(POPPLER_QT4_TEST_LIBS)
+@BUILD_POPPLER_QT4_TRUE@check_fonts_SOURCES = check_fonts.cpp
+@BUILD_POPPLER_QT4_TRUE@check_fonts_LDADD = $(LDADDS) $(POPPLER_QT4_TEST_LIBS)
+@BUILD_POPPLER_QT4_TRUE@check_links_SOURCES = check_links.cpp
+@BUILD_POPPLER_QT4_TRUE@check_links_LDADD = $(LDADDS) $(POPPLER_QT4_TEST_LIBS)
+@BUILD_POPPLER_QT4_TRUE@check_metadata_SOURCES = check_metadata.cpp
+@BUILD_POPPLER_QT4_TRUE@check_metadata_LDADD = $(LDADDS) $(POPPLER_QT4_TEST_LIBS)
+@BUILD_POPPLER_QT4_TRUE@check_optcontent_SOURCES = check_optcontent.cpp
+@BUILD_POPPLER_QT4_TRUE@check_optcontent_LDADD = $(LDADDS) $(POPPLER_QT4_TEST_LIBS)
+@BUILD_POPPLER_QT4_TRUE@check_pagemode_SOURCES = check_pagemode.cpp
+@BUILD_POPPLER_QT4_TRUE@check_pagemode_LDADD = $(LDADDS) $(POPPLER_QT4_TEST_LIBS)
+@BUILD_POPPLER_QT4_TRUE@check_permissions_SOURCES = check_permissions.cpp
+@BUILD_POPPLER_QT4_TRUE@check_permissions_LDADD = $(LDADDS) $(POPPLER_QT4_TEST_LIBS)
+@BUILD_POPPLER_QT4_TRUE@check_pagelayout_SOURCES = check_pagelayout.cpp
+@BUILD_POPPLER_QT4_TRUE@check_pagelayout_LDADD = $(LDADDS) $(POPPLER_QT4_TEST_LIBS)
+@BUILD_POPPLER_QT4_TRUE@check_password_SOURCES = check_password.cpp
+@BUILD_POPPLER_QT4_TRUE@check_password_LDADD = $(LDADDS) $(POPPLER_QT4_TEST_LIBS)
+@BUILD_POPPLER_QT4_TRUE@check_search_SOURCES = check_search.cpp
+@BUILD_POPPLER_QT4_TRUE@check_search_LDADD = $(LDADDS) $(POPPLER_QT4_TEST_LIBS)
+@BUILD_POPPLER_QT4_TRUE@check_strings_SOURCES = check_strings.cpp
+@BUILD_POPPLER_QT4_TRUE@check_strings_LDADD = $(LDADDS) $(POPPLER_QT4_TEST_LIBS)
+all: all-am
+
+.SUFFIXES:
+.SUFFIXES: .cpp .lo .moc .o .obj
+$(srcdir)/Makefile.in:  $(srcdir)/Makefile.am  $(am__configure_deps)
+       @for dep in $?; do \
+         case '$(am__configure_deps)' in \
+           *$$dep*) \
+             ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
+               && { if test -f $@; then exit 0; else break; fi; }; \
+             exit 1;; \
+         esac; \
+       done; \
+       echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign qt4/tests/Makefile'; \
+       $(am__cd) $(top_srcdir) && \
+         $(AUTOMAKE) --foreign qt4/tests/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+       @case '$?' in \
+         *config.status*) \
+           cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+         *) \
+           echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+           cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+       esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+       cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure:  $(am__configure_deps)
+       cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4):  $(am__aclocal_m4_deps)
+       cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(am__aclocal_m4_deps):
+
+clean-checkPROGRAMS:
+       @list='$(check_PROGRAMS)'; test -n "$$list" || exit 0; \
+       echo " rm -f" $$list; \
+       rm -f $$list || exit $$?; \
+       test -n "$(EXEEXT)" || exit 0; \
+       list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \
+       echo " rm -f" $$list; \
+       rm -f $$list
+
+clean-noinstPROGRAMS:
+       @list='$(noinst_PROGRAMS)'; test -n "$$list" || exit 0; \
+       echo " rm -f" $$list; \
+       rm -f $$list || exit $$?; \
+       test -n "$(EXEEXT)" || exit 0; \
+       list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \
+       echo " rm -f" $$list; \
+       rm -f $$list
+check_actualtext$(EXEEXT): $(check_actualtext_OBJECTS) $(check_actualtext_DEPENDENCIES) $(EXTRA_check_actualtext_DEPENDENCIES) 
+       @rm -f check_actualtext$(EXEEXT)
+       $(AM_V_CXXLD)$(CXXLINK) $(check_actualtext_OBJECTS) $(check_actualtext_LDADD) $(LIBS)
+check_attachments$(EXEEXT): $(check_attachments_OBJECTS) $(check_attachments_DEPENDENCIES) $(EXTRA_check_attachments_DEPENDENCIES) 
+       @rm -f check_attachments$(EXEEXT)
+       $(AM_V_CXXLD)$(CXXLINK) $(check_attachments_OBJECTS) $(check_attachments_LDADD) $(LIBS)
+check_dateConversion$(EXEEXT): $(check_dateConversion_OBJECTS) $(check_dateConversion_DEPENDENCIES) $(EXTRA_check_dateConversion_DEPENDENCIES) 
+       @rm -f check_dateConversion$(EXEEXT)
+       $(AM_V_CXXLD)$(CXXLINK) $(check_dateConversion_OBJECTS) $(check_dateConversion_LDADD) $(LIBS)
+check_fonts$(EXEEXT): $(check_fonts_OBJECTS) $(check_fonts_DEPENDENCIES) $(EXTRA_check_fonts_DEPENDENCIES) 
+       @rm -f check_fonts$(EXEEXT)
+       $(AM_V_CXXLD)$(CXXLINK) $(check_fonts_OBJECTS) $(check_fonts_LDADD) $(LIBS)
+check_links$(EXEEXT): $(check_links_OBJECTS) $(check_links_DEPENDENCIES) $(EXTRA_check_links_DEPENDENCIES) 
+       @rm -f check_links$(EXEEXT)
+       $(AM_V_CXXLD)$(CXXLINK) $(check_links_OBJECTS) $(check_links_LDADD) $(LIBS)
+check_metadata$(EXEEXT): $(check_metadata_OBJECTS) $(check_metadata_DEPENDENCIES) $(EXTRA_check_metadata_DEPENDENCIES) 
+       @rm -f check_metadata$(EXEEXT)
+       $(AM_V_CXXLD)$(CXXLINK) $(check_metadata_OBJECTS) $(check_metadata_LDADD) $(LIBS)
+check_optcontent$(EXEEXT): $(check_optcontent_OBJECTS) $(check_optcontent_DEPENDENCIES) $(EXTRA_check_optcontent_DEPENDENCIES) 
+       @rm -f check_optcontent$(EXEEXT)
+       $(AM_V_CXXLD)$(CXXLINK) $(check_optcontent_OBJECTS) $(check_optcontent_LDADD) $(LIBS)
+check_pagelayout$(EXEEXT): $(check_pagelayout_OBJECTS) $(check_pagelayout_DEPENDENCIES) $(EXTRA_check_pagelayout_DEPENDENCIES) 
+       @rm -f check_pagelayout$(EXEEXT)
+       $(AM_V_CXXLD)$(CXXLINK) $(check_pagelayout_OBJECTS) $(check_pagelayout_LDADD) $(LIBS)
+check_pagemode$(EXEEXT): $(check_pagemode_OBJECTS) $(check_pagemode_DEPENDENCIES) $(EXTRA_check_pagemode_DEPENDENCIES) 
+       @rm -f check_pagemode$(EXEEXT)
+       $(AM_V_CXXLD)$(CXXLINK) $(check_pagemode_OBJECTS) $(check_pagemode_LDADD) $(LIBS)
+check_password$(EXEEXT): $(check_password_OBJECTS) $(check_password_DEPENDENCIES) $(EXTRA_check_password_DEPENDENCIES) 
+       @rm -f check_password$(EXEEXT)
+       $(AM_V_CXXLD)$(CXXLINK) $(check_password_OBJECTS) $(check_password_LDADD) $(LIBS)
+check_permissions$(EXEEXT): $(check_permissions_OBJECTS) $(check_permissions_DEPENDENCIES) $(EXTRA_check_permissions_DEPENDENCIES) 
+       @rm -f check_permissions$(EXEEXT)
+       $(AM_V_CXXLD)$(CXXLINK) $(check_permissions_OBJECTS) $(check_permissions_LDADD) $(LIBS)
+check_search$(EXEEXT): $(check_search_OBJECTS) $(check_search_DEPENDENCIES) $(EXTRA_check_search_DEPENDENCIES) 
+       @rm -f check_search$(EXEEXT)
+       $(AM_V_CXXLD)$(CXXLINK) $(check_search_OBJECTS) $(check_search_LDADD) $(LIBS)
+check_strings$(EXEEXT): $(check_strings_OBJECTS) $(check_strings_DEPENDENCIES) $(EXTRA_check_strings_DEPENDENCIES) 
+       @rm -f check_strings$(EXEEXT)
+       $(AM_V_CXXLD)$(CXXLINK) $(check_strings_OBJECTS) $(check_strings_LDADD) $(LIBS)
+poppler-attachments$(EXEEXT): $(poppler_attachments_OBJECTS) $(poppler_attachments_DEPENDENCIES) $(EXTRA_poppler_attachments_DEPENDENCIES) 
+       @rm -f poppler-attachments$(EXEEXT)
+       $(AM_V_CXXLD)$(CXXLINK) $(poppler_attachments_OBJECTS) $(poppler_attachments_LDADD) $(LIBS)
+poppler-fonts$(EXEEXT): $(poppler_fonts_OBJECTS) $(poppler_fonts_DEPENDENCIES) $(EXTRA_poppler_fonts_DEPENDENCIES) 
+       @rm -f poppler-fonts$(EXEEXT)
+       $(AM_V_CXXLD)$(CXXLINK) $(poppler_fonts_OBJECTS) $(poppler_fonts_LDADD) $(LIBS)
+poppler-texts$(EXEEXT): $(poppler_texts_OBJECTS) $(poppler_texts_DEPENDENCIES) $(EXTRA_poppler_texts_DEPENDENCIES) 
+       @rm -f poppler-texts$(EXEEXT)
+       $(AM_V_CXXLD)$(CXXLINK) $(poppler_texts_OBJECTS) $(poppler_texts_LDADD) $(LIBS)
+stress-poppler-dir$(EXEEXT): $(stress_poppler_dir_OBJECTS) $(stress_poppler_dir_DEPENDENCIES) $(EXTRA_stress_poppler_dir_DEPENDENCIES) 
+       @rm -f stress-poppler-dir$(EXEEXT)
+       $(AM_V_CXXLD)$(CXXLINK) $(stress_poppler_dir_OBJECTS) $(stress_poppler_dir_LDADD) $(LIBS)
+stress-poppler-qt4$(EXEEXT): $(stress_poppler_qt4_OBJECTS) $(stress_poppler_qt4_DEPENDENCIES) $(EXTRA_stress_poppler_qt4_DEPENDENCIES) 
+       @rm -f stress-poppler-qt4$(EXEEXT)
+       $(AM_V_CXXLD)$(CXXLINK) $(stress_poppler_qt4_OBJECTS) $(stress_poppler_qt4_LDADD) $(LIBS)
+test-password-qt4$(EXEEXT): $(test_password_qt4_OBJECTS) $(test_password_qt4_DEPENDENCIES) $(EXTRA_test_password_qt4_DEPENDENCIES) 
+       @rm -f test-password-qt4$(EXEEXT)
+       $(AM_V_CXXLD)$(CXXLINK) $(test_password_qt4_OBJECTS) $(test_password_qt4_LDADD) $(LIBS)
+test-poppler-qt4$(EXEEXT): $(test_poppler_qt4_OBJECTS) $(test_poppler_qt4_DEPENDENCIES) $(EXTRA_test_poppler_qt4_DEPENDENCIES) 
+       @rm -f test-poppler-qt4$(EXEEXT)
+       $(AM_V_CXXLD)$(CXXLINK) $(test_poppler_qt4_OBJECTS) $(test_poppler_qt4_LDADD) $(LIBS)
+
+mostlyclean-compile:
+       -rm -f *.$(OBJEXT)
+
+distclean-compile:
+       -rm -f *.tab.c
+
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/check_actualtext.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/check_attachments.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/check_dateConversion.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/check_fonts.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/check_links.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/check_metadata.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/check_optcontent.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/check_pagelayout.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/check_pagemode.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/check_password.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/check_permissions.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/check_search.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/check_strings.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/poppler-attachments.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/poppler-fonts.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/poppler-texts.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/stress-poppler-dir.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/stress-poppler-qt4.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test-password-qt4.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test-poppler-qt4.Po@am__quote@
+
+.cpp.o:
+@am__fastdepCXX_TRUE@  $(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
+@am__fastdepCXX_TRUE@  $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ $<
+
+.cpp.obj:
+@am__fastdepCXX_TRUE@  $(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'`
+@am__fastdepCXX_TRUE@  $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
+
+.cpp.lo:
+@am__fastdepCXX_TRUE@  $(AM_V_CXX)$(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
+@am__fastdepCXX_TRUE@  $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     $(AM_V_CXX)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LTCXXCOMPILE) -c -o $@ $<
+
+mostlyclean-libtool:
+       -rm -f *.lo
+
+clean-libtool:
+       -rm -rf .libs _libs
+
+ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
+       list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+       unique=`for i in $$list; do \
+           if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+         done | \
+         $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
+             END { if (nonempty) { for (i in files) print i; }; }'`; \
+       mkid -fID $$unique
+tags: TAGS
+
+TAGS:  $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
+               $(TAGS_FILES) $(LISP)
+       set x; \
+       here=`pwd`; \
+       list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
+       unique=`for i in $$list; do \
+           if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+         done | \
+         $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
+             END { if (nonempty) { for (i in files) print i; }; }'`; \
+       shift; \
+       if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
+         test -n "$$unique" || unique=$$empty_fix; \
+         if test $$# -gt 0; then \
+           $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+             "$$@" $$unique; \
+         else \
+           $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+             $$unique; \
+         fi; \
+       fi
+ctags: CTAGS
+CTAGS:  $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
+               $(TAGS_FILES) $(LISP)
+       list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
+       unique=`for i in $$list; do \
+           if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+         done | \
+         $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
+             END { if (nonempty) { for (i in files) print i; }; }'`; \
+       test -z "$(CTAGS_ARGS)$$unique" \
+         || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+            $$unique
+
+GTAGS:
+       here=`$(am__cd) $(top_builddir) && pwd` \
+         && $(am__cd) $(top_srcdir) \
+         && gtags -i $(GTAGS_ARGS) "$$here"
+
+distclean-tags:
+       -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+
+check-TESTS: $(TESTS)
+       @failed=0; all=0; xfail=0; xpass=0; skip=0; \
+       srcdir=$(srcdir); export srcdir; \
+       list=' $(TESTS) '; \
+       $(am__tty_colors); \
+       if test -n "$$list"; then \
+         for tst in $$list; do \
+           if test -f ./$$tst; then dir=./; \
+           elif test -f $$tst; then dir=; \
+           else dir="$(srcdir)/"; fi; \
+           if $(TESTS_ENVIRONMENT) $${dir}$$tst; then \
+             all=`expr $$all + 1`; \
+             case " $(XFAIL_TESTS) " in \
+             *[\ \     ]$$tst[\ \      ]*) \
+               xpass=`expr $$xpass + 1`; \
+               failed=`expr $$failed + 1`; \
+               col=$$red; res=XPASS; \
+             ;; \
+             *) \
+               col=$$grn; res=PASS; \
+             ;; \
+             esac; \
+           elif test $$? -ne 77; then \
+             all=`expr $$all + 1`; \
+             case " $(XFAIL_TESTS) " in \
+             *[\ \     ]$$tst[\ \      ]*) \
+               xfail=`expr $$xfail + 1`; \
+               col=$$lgn; res=XFAIL; \
+             ;; \
+             *) \
+               failed=`expr $$failed + 1`; \
+               col=$$red; res=FAIL; \
+             ;; \
+             esac; \
+           else \
+             skip=`expr $$skip + 1`; \
+             col=$$blu; res=SKIP; \
+           fi; \
+           echo "$${col}$$res$${std}: $$tst"; \
+         done; \
+         if test "$$all" -eq 1; then \
+           tests="test"; \
+           All=""; \
+         else \
+           tests="tests"; \
+           All="All "; \
+         fi; \
+         if test "$$failed" -eq 0; then \
+           if test "$$xfail" -eq 0; then \
+             banner="$$All$$all $$tests passed"; \
+           else \
+             if test "$$xfail" -eq 1; then failures=failure; else failures=failures; fi; \
+             banner="$$All$$all $$tests behaved as expected ($$xfail expected $$failures)"; \
+           fi; \
+         else \
+           if test "$$xpass" -eq 0; then \
+             banner="$$failed of $$all $$tests failed"; \
+           else \
+             if test "$$xpass" -eq 1; then passes=pass; else passes=passes; fi; \
+             banner="$$failed of $$all $$tests did not behave as expected ($$xpass unexpected $$passes)"; \
+           fi; \
+         fi; \
+         dashes="$$banner"; \
+         skipped=""; \
+         if test "$$skip" -ne 0; then \
+           if test "$$skip" -eq 1; then \
+             skipped="($$skip test was not run)"; \
+           else \
+             skipped="($$skip tests were not run)"; \
+           fi; \
+           test `echo "$$skipped" | wc -c` -le `echo "$$banner" | wc -c` || \
+             dashes="$$skipped"; \
+         fi; \
+         report=""; \
+         if test "$$failed" -ne 0 && test -n "$(PACKAGE_BUGREPORT)"; then \
+           report="Please report to $(PACKAGE_BUGREPORT)"; \
+           test `echo "$$report" | wc -c` -le `echo "$$banner" | wc -c` || \
+             dashes="$$report"; \
+         fi; \
+         dashes=`echo "$$dashes" | sed s/./=/g`; \
+         if test "$$failed" -eq 0; then \
+           col="$$grn"; \
+         else \
+           col="$$red"; \
+         fi; \
+         echo "$${col}$$dashes$${std}"; \
+         echo "$${col}$$banner$${std}"; \
+         test -z "$$skipped" || echo "$${col}$$skipped$${std}"; \
+         test -z "$$report" || echo "$${col}$$report$${std}"; \
+         echo "$${col}$$dashes$${std}"; \
+         test "$$failed" -eq 0; \
+       else :; fi
+
+distdir: $(DISTFILES)
+       @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+       topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+       list='$(DISTFILES)'; \
+         dist_files=`for file in $$list; do echo $$file; done | \
+         sed -e "s|^$$srcdirstrip/||;t" \
+             -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+       case $$dist_files in \
+         */*) $(MKDIR_P) `echo "$$dist_files" | \
+                          sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+                          sort -u` ;; \
+       esac; \
+       for file in $$dist_files; do \
+         if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+         if test -d $$d/$$file; then \
+           dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+           if test -d "$(distdir)/$$file"; then \
+             find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+           fi; \
+           if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+             cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
+             find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+           fi; \
+           cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
+         else \
+           test -f "$(distdir)/$$file" \
+           || cp -p $$d/$$file "$(distdir)/$$file" \
+           || exit 1; \
+         fi; \
+       done
+check-am: all-am
+       $(MAKE) $(AM_MAKEFLAGS) $(check_PROGRAMS)
+       $(MAKE) $(AM_MAKEFLAGS) check-TESTS
+check: check-am
+all-am: Makefile $(PROGRAMS)
+installdirs:
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+       @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+       if test -z '$(STRIP)'; then \
+         $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+           install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+             install; \
+       else \
+         $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+           install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+           "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
+       fi
+mostlyclean-generic:
+
+distclean-generic:
+       -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+       -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
+
+maintainer-clean-generic:
+       @echo "This command is intended for maintainers to use"
+       @echo "it deletes files that may require special tools to rebuild."
+clean: clean-am
+
+clean-am: clean-checkPROGRAMS clean-generic clean-libtool \
+       clean-noinstPROGRAMS mostlyclean-am
+
+distclean: distclean-am
+       -rm -rf ./$(DEPDIR)
+       -rm -f Makefile
+distclean-am: clean-am distclean-compile distclean-generic \
+       distclean-tags
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+html-am:
+
+info: info-am
+
+info-am:
+
+install-data-am:
+
+install-dvi: install-dvi-am
+
+install-dvi-am:
+
+install-exec-am:
+
+install-html: install-html-am
+
+install-html-am:
+
+install-info: install-info-am
+
+install-info-am:
+
+install-man:
+
+install-pdf: install-pdf-am
+
+install-pdf-am:
+
+install-ps: install-ps-am
+
+install-ps-am:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+       -rm -rf ./$(DEPDIR)
+       -rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-compile mostlyclean-generic \
+       mostlyclean-libtool
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am:
+
+.MAKE: check-am install-am install-strip
+
+.PHONY: CTAGS GTAGS all all-am check check-TESTS check-am clean \
+       clean-checkPROGRAMS clean-generic clean-libtool \
+       clean-noinstPROGRAMS ctags distclean distclean-compile \
+       distclean-generic distclean-libtool distclean-tags distdir dvi \
+       dvi-am html html-am info info-am install install-am \
+       install-data install-data-am install-dvi install-dvi-am \
+       install-exec install-exec-am install-html install-html-am \
+       install-info install-info-am install-man install-pdf \
+       install-pdf-am install-ps install-ps-am install-strip \
+       installcheck installcheck-am installdirs maintainer-clean \
+       maintainer-clean-generic mostlyclean mostlyclean-compile \
+       mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \
+       tags uninstall uninstall-am
+
+
+SUFFIXES: .moc
+
+.cpp.moc:
+       $(AM_V_GEN) $(MOCQT4) -i $< -o $@
+
+clean-generic:
+       rm -f *.moc
+@BUILD_POPPLER_QT4_TRUE@check_attachments.$(OBJEXT): check_attachments.moc
+@BUILD_POPPLER_QT4_TRUE@check_actualtext.$(OBJEXT): check_actualtext.moc
+@BUILD_POPPLER_QT4_TRUE@check_dateConversion.$(OBJEXT): check_dateConversion.moc
+@BUILD_POPPLER_QT4_TRUE@check_fonts.$(OBJEXT): check_fonts.moc
+@BUILD_POPPLER_QT4_TRUE@check_links.$(OBJEXT): check_links.moc
+@BUILD_POPPLER_QT4_TRUE@check_metadata.$(OBJEXT): check_metadata.moc
+@BUILD_POPPLER_QT4_TRUE@check_optcontent.$(OBJEXT): check_optcontent.moc
+@BUILD_POPPLER_QT4_TRUE@check_pagemode.$(OBJEXT): check_pagemode.moc
+@BUILD_POPPLER_QT4_TRUE@check_permissions.$(OBJEXT): check_permissions.moc
+@BUILD_POPPLER_QT4_TRUE@check_pagelayout.$(OBJEXT): check_pagelayout.moc
+@BUILD_POPPLER_QT4_TRUE@check_password.$(OBJEXT): check_password.moc
+@BUILD_POPPLER_QT4_TRUE@check_search.$(OBJEXT): check_search.moc
+@BUILD_POPPLER_QT4_TRUE@check_strings.$(OBJEXT): check_strings.moc
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/qt4/tests/check_actualtext.cpp b/qt4/tests/check_actualtext.cpp
new file mode 100644 (file)
index 0000000..5c765c5
--- /dev/null
@@ -0,0 +1,33 @@
+#include <QtTest/QtTest>
+
+#include <poppler-qt4.h>
+
+#include <QtCore/QFile>
+
+class TestActualText: public QObject
+{
+    Q_OBJECT
+private slots:
+    void checkActualText1();
+};
+
+void TestActualText::checkActualText1()
+{
+    Poppler::Document *doc;
+    doc = Poppler::Document::load(TESTDATADIR "/unittestcases/WithActualText.pdf");
+    QVERIFY( doc );
+
+    Poppler::Page *page = doc->page(0);
+    QVERIFY( page );
+
+    QCOMPARE( page->text(QRectF()), QString("The slow brown fox jumps over the black dog.") );
+
+    delete page;
+
+    delete doc;
+}
+
+QTEST_MAIN(TestActualText)
+
+#include "check_actualtext.moc"
+
diff --git a/qt4/tests/check_attachments.cpp b/qt4/tests/check_attachments.cpp
new file mode 100644 (file)
index 0000000..73e3150
--- /dev/null
@@ -0,0 +1,157 @@
+#include <QtTest/QtTest>
+
+#include <poppler-qt4.h>
+
+#include <QtCore/QFile>
+
+class TestAttachments: public QObject
+{
+    Q_OBJECT
+private slots:
+    void checkNoAttachments();
+    void checkAttach1();
+    void checkAttach2();
+    void checkAttach3();
+    void checkAttach4();
+};
+
+void TestAttachments::checkNoAttachments()
+{
+    Poppler::Document *doc;
+    doc = Poppler::Document::load(TESTDATADIR "/unittestcases/truetype.pdf");
+    QVERIFY( doc );
+
+    QCOMPARE( doc->hasEmbeddedFiles(), false );
+
+    delete doc;
+}
+
+void TestAttachments::checkAttach1()
+{
+
+    Poppler::Document *doc;
+    doc = Poppler::Document::load(TESTDATADIR "/unittestcases/WithAttachments.pdf");
+    QVERIFY( doc );
+
+    QVERIFY( doc->hasEmbeddedFiles() );
+
+    QList<Poppler::EmbeddedFile*> fileList = doc->embeddedFiles();
+    QCOMPARE( fileList.size(), 2 );
+
+    Poppler::EmbeddedFile *embfile = fileList.at(0);
+    QCOMPARE( embfile->name(), QString( "kroller.png" ) );
+    QCOMPARE( embfile->description(), QString() );
+    QCOMPARE( embfile->createDate(), QDateTime( QDate(), QTime() ) );
+    QCOMPARE( embfile->modDate(), QDateTime( QDate(), QTime() ) );
+    QCOMPARE( embfile->mimeType(), QString() );
+
+    QFile file(TESTDATADIR "/unittestcases/kroller.png" );
+    QVERIFY(  file.open( QIODevice::ReadOnly ) );
+    QByteArray krollerData = file.readAll();
+    QByteArray embdata = embfile->data();
+    QCOMPARE( krollerData, embdata );
+           
+
+    Poppler::EmbeddedFile *embfile2 = fileList.at(1);
+    QCOMPARE( embfile2->name(), QString("gnome-64.gif") );
+    QCOMPARE( embfile2->description(), QString() );
+    QCOMPARE( embfile2->modDate(), QDateTime( QDate(), QTime() ) );
+    QCOMPARE( embfile2->createDate(), QDateTime( QDate(), QTime() ) );
+    QCOMPARE( embfile2->mimeType(), QString() );
+
+    QFile file2(TESTDATADIR "/unittestcases/gnome-64.gif" );
+    QVERIFY(  file2.open( QIODevice::ReadOnly ) );
+    QByteArray g64Data = file2.readAll();
+    QByteArray emb2data = embfile2->data();
+    QCOMPARE( g64Data, emb2data );
+
+    delete doc;
+}
+
+
+void TestAttachments::checkAttach2()
+{
+
+    Poppler::Document *doc;
+    doc = Poppler::Document::load(TESTDATADIR "/unittestcases/A6EmbeddedFiles.pdf");
+    QVERIFY( doc );
+
+    QVERIFY( doc->hasEmbeddedFiles() );
+
+    QList<Poppler::EmbeddedFile*> fileList;
+    fileList = doc->embeddedFiles();
+    QCOMPARE( fileList.size(), 3 );
+
+    Poppler::EmbeddedFile *embfile1 = fileList.at(0);
+    QCOMPARE( embfile1->name(), QString("Acro7 thoughts") );
+    QCOMPARE( embfile1->description(), QString() );
+    QCOMPARE( embfile1->createDate(), QDateTime( QDate( 2003, 8, 4 ), QTime( 13, 54, 54), Qt::UTC ) );
+    QCOMPARE( embfile1->modDate(), QDateTime( QDate( 2003, 8, 4 ), QTime( 14, 15, 27), Qt::UTC ) );
+    QCOMPARE( embfile1->mimeType(), QString("text/xml") );
+
+    Poppler::EmbeddedFile *embfile2 = fileList.at(1);
+    QCOMPARE( embfile2->name(), QString("acro transitions 1.xls") );
+    QCOMPARE( embfile2->description(), QString() );
+    QCOMPARE( embfile2->createDate(), QDateTime( QDate( 2003, 7, 18 ), QTime( 21, 7, 16), Qt::UTC ) );
+    QCOMPARE( embfile2->modDate(), QDateTime( QDate( 2003, 7, 22 ), QTime( 13, 4, 40), Qt::UTC ) );
+    QCOMPARE( embfile2->mimeType(), QString("application/excel") );
+
+    Poppler::EmbeddedFile *embfile3 = fileList.at(2);
+    QCOMPARE( embfile3->name(), QString("apago_pdfe_wide.gif") );
+    QCOMPARE( embfile3->description(), QString() );
+    QCOMPARE( embfile3->createDate(), QDateTime( QDate( 2003, 1, 31 ), QTime( 15, 54, 29), Qt::UTC ) );
+    QCOMPARE( embfile3->modDate(), QDateTime( QDate( 2003, 1, 31 ), QTime( 15, 52, 58), Qt::UTC ) );
+    QCOMPARE( embfile3->mimeType(), QString() );
+
+    delete doc;
+}
+
+void TestAttachments::checkAttach3()
+{
+
+    Poppler::Document *doc;
+    doc = Poppler::Document::load(TESTDATADIR "/unittestcases/shapes+attachments.pdf");
+    QVERIFY( doc );
+
+    QVERIFY( doc->hasEmbeddedFiles() );
+
+    QList<Poppler::EmbeddedFile*> fileList;
+    fileList = doc->embeddedFiles();
+    QCOMPARE( fileList.size(), 1 );
+
+    Poppler::EmbeddedFile *embfile = fileList.at(0);
+    QCOMPARE( embfile->name(), QString( "ADEX1.xpdf.pgp" ) );
+    QCOMPARE( embfile->description(), QString() );
+    QCOMPARE( embfile->createDate(), QDateTime( QDate( 2004, 3, 29 ), QTime( 19, 37, 16), Qt::UTC ) );
+    QCOMPARE( embfile->modDate(), QDateTime( QDate( 2004, 3, 29 ), QTime( 19, 37, 16), Qt::UTC ) );
+    QCOMPARE( embfile->mimeType(), QString() );
+    delete doc;
+
+}
+
+void TestAttachments::checkAttach4()
+{
+
+    Poppler::Document *doc;
+    doc = Poppler::Document::load(TESTDATADIR "/unittestcases/imageretrieve+attachment.pdf");
+    QVERIFY( doc );
+
+    QVERIFY( doc->hasEmbeddedFiles() );
+
+    QList<Poppler::EmbeddedFile*> fileList;
+    fileList = doc->embeddedFiles();
+    QCOMPARE( fileList.size(), 1 );
+
+    Poppler::EmbeddedFile *embfile = fileList.at(0);
+    QCOMPARE( embfile->name(), QString( "export-altona.csv" ) );
+    QCOMPARE( embfile->description(), QString("Altona Export") );
+    QCOMPARE( embfile->createDate(), QDateTime( QDate( 2005, 8, 30 ), QTime( 20, 49, 35), Qt::UTC ) );
+    QCOMPARE( embfile->modDate(), QDateTime( QDate( 2005, 8, 30 ), QTime( 20, 49, 52), Qt::UTC ) );
+    QCOMPARE( embfile->mimeType(), QString("application/vnd.ms-excel") );
+    delete doc;
+
+}
+
+QTEST_MAIN(TestAttachments)
+#include "check_attachments.moc"
+
diff --git a/qt4/tests/check_dateConversion.cpp b/qt4/tests/check_dateConversion.cpp
new file mode 100644 (file)
index 0000000..c1f84e2
--- /dev/null
@@ -0,0 +1,142 @@
+#include <QtTest/QtTest>
+
+Q_DECLARE_METATYPE(QDate)
+Q_DECLARE_METATYPE(QTime)
+
+#include <poppler-qt4.h>
+
+class TestDateConv: public QObject
+{
+    Q_OBJECT
+private slots:
+    void initTestCase();
+    void checkDates_data();
+    void checkDates();
+    void checkInvalidDates_data();
+    void checkInvalidDates();
+};
+
+void TestDateConv::initTestCase()
+{
+    qRegisterMetaType<QDate>("QDate");
+    qRegisterMetaType<QTime>("QTime");
+}
+
+void TestDateConv::checkDates_data()
+{
+    QTest::addColumn<QByteArray>("input");
+    QTest::addColumn<QDate>("day");
+    QTest::addColumn<QTime>("time");
+
+    // This is a typical case - all data provided
+    QTest::newRow("D:20040101121110")
+      << QByteArray("D:20040101121110Z")
+      << QDate( 2004, 1, 1)
+      << QTime( 12, 11, 10);
+
+    // The D: is strongly recommended, but optional
+    QTest::newRow("20040101121110")
+      << QByteArray("20040101121110Z")
+      << QDate( 2004, 1, 1)
+      << QTime( 12, 11, 10);
+
+    // Only the year is actually required
+    QTest::newRow("D:2006")
+      << QByteArray("D:2006")
+      << QDate( 2006, 1, 1)
+      << QTime( 0, 0, 0);
+
+    QTest::newRow("D:200602")
+      << QByteArray("D:200602")
+      << QDate( 2006, 2, 1)
+      << QTime( 0, 0, 0);
+
+    QTest::newRow("D:20060304")
+      << QByteArray("D:20060304")
+      << QDate( 2006, 3, 4)
+      << QTime( 0, 0, 0);
+
+    QTest::newRow("D:2006030405")
+      << QByteArray("D:2006030405")
+      << QDate( 2006, 3, 4)
+      << QTime( 5, 0, 0);
+
+    QTest::newRow("D:200603040512")
+      << QByteArray("D:200603040512")
+      << QDate( 2006, 3, 4)
+      << QTime( 5, 12, 0);
+
+    // If the timezone isn't specified, I assume UTC
+    QTest::newRow("D:20060304051226")
+      << QByteArray("D:20060304051226")
+      << QDate( 2006, 3, 4)
+      << QTime( 5, 12, 26);
+
+    // Check for real timezone conversions
+    QTest::newRow("D:20030131115258-04'00'")
+      << QByteArray("D:20030131115258-04'00'")
+      << QDate( 2003, 1, 31)
+      << QTime( 15, 52, 58);
+
+    QTest::newRow("D:20030131115258+05'00'")
+      << QByteArray("D:20030131115258+05'00'")
+      << QDate( 2003, 1, 31)
+      << QTime( 6, 52, 58);
+
+    // There are places that have non-hour offsets
+    // Yep, that means you Adelaide.
+    QTest::newRow("D:20030131115258+08'30'")
+      << QByteArray("D:20030131115258+08'30'")
+      << QDate( 2003, 1, 31)
+      << QTime( 3, 22, 58);
+
+    QTest::newRow("D:20030131115258-08'30'")
+      << QByteArray("D:20030131115258-08'30'")
+      << QDate( 2003, 1, 31)
+      << QTime( 20, 22, 58);
+}
+
+void TestDateConv::checkDates()
+{
+    QFETCH(QByteArray, input);
+    QFETCH(QDate, day);
+    QFETCH(QTime, time);
+
+    QCOMPARE( Poppler::convertDate(input.data()), QDateTime(day, time, Qt::UTC) );
+}
+
+void TestDateConv::checkInvalidDates_data()
+{
+    QTest::addColumn<QByteArray>("input");
+
+    // Null data
+    QTest::newRow("Null data")
+      << QByteArray();
+
+    // Empty data
+    QTest::newRow("Empty data")
+      << QByteArray("");
+
+    // Empty data
+    QTest::newRow("One character")
+      << QByteArray("D");
+
+    // Empty data
+    QTest::newRow("'D:'")
+      << QByteArray("D:");
+
+    // Empty data
+    QTest::newRow("Not a date")
+      << QByteArray("D:IAmNotAValidDate");
+}
+
+void TestDateConv::checkInvalidDates()
+{
+    QFETCH(QByteArray, input);
+
+    QCOMPARE(Poppler::convertDate(input.data()), QDateTime());
+}
+
+QTEST_MAIN(TestDateConv)
+
+#include "check_dateConversion.moc"
diff --git a/qt4/tests/check_fonts.cpp b/qt4/tests/check_fonts.cpp
new file mode 100644 (file)
index 0000000..c57b6da
--- /dev/null
@@ -0,0 +1,246 @@
+#include <QtTest/QtTest>
+
+#include <poppler-qt4.h>
+
+#include <memory>
+
+class TestFontsData: public QObject
+{
+    Q_OBJECT
+private slots:
+    void checkNoFonts();
+    void checkType1();
+    void checkType3();
+    void checkTrueType();
+    void checkFontIterator();
+    void checkSecondDocumentQuery();
+    void checkMultipleIterations();
+    void checkScanForFonts();
+};
+
+
+QList<Poppler::FontInfo> loadFontsViaIterator( Poppler::Document *doc, int from = 0, int count = -1 )
+{
+    int num = count == -1 ? doc->numPages() - from : count;
+    QList<Poppler::FontInfo> list;
+    std::auto_ptr< Poppler::FontIterator > it( doc->newFontIterator( from ) );
+    while ( it->hasNext() && num )
+    {
+        list += it->next();
+        --num;
+    }
+    return list;
+}
+
+bool operator==( const Poppler::FontInfo &f1, const Poppler::FontInfo &f2 )
+{
+    if ( f1.name() != f2.name() )
+        return false;
+    if ( f1.file() != f2.file() )
+        return false;
+    if ( f1.isEmbedded() != f2.isEmbedded() )
+        return false;
+    if ( f1.isSubset() != f2.isSubset() )
+        return false;
+    if ( f1.type() != f2.type() )
+        return false;
+    if ( f1.typeName() != f2.typeName() )
+        return false;
+    return true;
+}
+
+
+void TestFontsData::checkNoFonts()
+{
+    Poppler::Document *doc;
+    doc = Poppler::Document::load(TESTDATADIR "/tests/image.pdf");
+    QVERIFY( doc );
+
+    QList<Poppler::FontInfo> listOfFonts = doc->fonts();
+    QCOMPARE( listOfFonts.size(), 0 );
+
+    delete doc;
+}
+
+void TestFontsData::checkType1()
+{
+    Poppler::Document *doc;
+    doc = Poppler::Document::load(TESTDATADIR "/tests/text.pdf");
+    QVERIFY( doc );
+
+    QList<Poppler::FontInfo> listOfFonts = doc->fonts();
+    QCOMPARE( listOfFonts.size(), 1 );
+    QCOMPARE( listOfFonts.at(0).name(), QString("Helvetica") );
+    QCOMPARE( listOfFonts.at(0).type(), Poppler::FontInfo::Type1 );
+    QCOMPARE( listOfFonts.at(0).typeName(), QString("Type 1") );
+
+    QCOMPARE( listOfFonts.at(0).isEmbedded(), false );
+    QCOMPARE( listOfFonts.at(0).isSubset(), false );
+
+    delete doc;
+}
+
+void TestFontsData::checkType3()
+{
+    Poppler::Document *doc;
+    doc = Poppler::Document::load(TESTDATADIR "/tests/type3.pdf");
+    QVERIFY( doc );
+
+    QList<Poppler::FontInfo> listOfFonts = doc->fonts();
+    QCOMPARE( listOfFonts.size(), 2 );
+    QCOMPARE( listOfFonts.at(0).name(), QString("Helvetica") );
+    QCOMPARE( listOfFonts.at(0).type(), Poppler::FontInfo::Type1 );
+    QCOMPARE( listOfFonts.at(0).typeName(), QString("Type 1") );
+
+    QCOMPARE( listOfFonts.at(0).isEmbedded(), false );
+    QCOMPARE( listOfFonts.at(0).isSubset(), false );
+
+    QCOMPARE( listOfFonts.at(1).name(), QString("") );
+    QCOMPARE( listOfFonts.at(1).type(), Poppler::FontInfo::Type3 );
+    QCOMPARE( listOfFonts.at(1).typeName(), QString("Type 3") );
+
+    QCOMPARE( listOfFonts.at(1).isEmbedded(), true );
+    QCOMPARE( listOfFonts.at(1).isSubset(), false );
+
+    delete doc;
+}
+
+void TestFontsData::checkTrueType()
+{
+    Poppler::Document *doc;
+    doc = Poppler::Document::load(TESTDATADIR "/unittestcases/truetype.pdf");
+    QVERIFY( doc );
+
+    QList<Poppler::FontInfo> listOfFonts = doc->fonts();
+    QCOMPARE( listOfFonts.size(), 2 );
+    QCOMPARE( listOfFonts.at(0).name(), QString("Arial-BoldMT") );
+    QCOMPARE( listOfFonts.at(0).type(), Poppler::FontInfo::TrueType );
+    QCOMPARE( listOfFonts.at(0).typeName(), QString("TrueType") );
+
+    QCOMPARE( listOfFonts.at(0).isEmbedded(), false );
+    QCOMPARE( listOfFonts.at(0).isSubset(), false );
+
+    QCOMPARE( listOfFonts.at(1).name(), QString("ArialMT") );
+    QCOMPARE( listOfFonts.at(1).type(), Poppler::FontInfo::TrueType );
+    QCOMPARE( listOfFonts.at(1).typeName(), QString("TrueType") );
+
+    QCOMPARE( listOfFonts.at(1).isEmbedded(), false );
+    QCOMPARE( listOfFonts.at(1).isSubset(), false );
+
+    delete doc;
+}
+
+void TestFontsData::checkFontIterator()
+{
+    // loading a 1-page document
+    Poppler::Document *doc;
+    doc = Poppler::Document::load(TESTDATADIR "/tests/type3.pdf");
+    QVERIFY( doc );
+    // loading a 6-pages document
+    Poppler::Document *doc6 = Poppler::Document::load(TESTDATADIR "/tests/cropbox.pdf");
+    QVERIFY( doc6 );
+
+    std::auto_ptr< Poppler::FontIterator > it;
+
+    // some tests with the 1-page document:
+    // - check a default iterator
+    it.reset( doc->newFontIterator() );
+    QVERIFY( it->hasNext() );
+    // - check an iterator for negative pages to behave as 0
+    it.reset( doc->newFontIterator( -1 ) );
+    QVERIFY( it->hasNext() );
+    // - check an iterator for pages out of the page limit
+    it.reset( doc->newFontIterator( 1 ) );
+    QVERIFY( !it->hasNext() );
+    // - check that it reaches the end after 1 iteration
+    it.reset( doc->newFontIterator() );
+    QVERIFY( it->hasNext() );
+    it->next();
+    QVERIFY( !it->hasNext() );
+
+    // some tests with the 6-page document:
+    // - check a default iterator
+    it.reset( doc6->newFontIterator() );
+    QVERIFY( it->hasNext() );
+    // - check an iterator for pages out of the page limit
+    it.reset( doc6->newFontIterator( 6 ) );
+    QVERIFY( !it->hasNext() );
+    // - check that it reaches the end after 6 iterations
+    it.reset( doc6->newFontIterator() );
+    QVERIFY( it->hasNext() );
+    it->next();
+    QVERIFY( it->hasNext() );
+    it->next();
+    QVERIFY( it->hasNext() );
+    it->next();
+    QVERIFY( it->hasNext() );
+    it->next();
+    QVERIFY( it->hasNext() );
+    it->next();
+    QVERIFY( it->hasNext() );
+    it->next();
+    QVERIFY( !it->hasNext() );
+
+    delete doc;
+    delete doc6;
+}
+
+void TestFontsData::checkSecondDocumentQuery()
+{
+    Poppler::Document *doc;
+    doc = Poppler::Document::load(TESTDATADIR "/tests/type3.pdf");
+    QVERIFY( doc );
+
+    QList<Poppler::FontInfo> listOfFonts = doc->fonts();
+    QCOMPARE( listOfFonts.size(), 2 );
+    // check we get the very same result when calling fonts() again (#19405)
+    QList<Poppler::FontInfo> listOfFonts2 = doc->fonts();
+    QCOMPARE( listOfFonts, listOfFonts2 );
+
+    delete doc;
+}
+
+void TestFontsData::checkMultipleIterations()
+{
+    Poppler::Document *doc;
+    doc = Poppler::Document::load(TESTDATADIR "/tests/type3.pdf");
+    QVERIFY( doc );
+
+    QList<Poppler::FontInfo> listOfFonts = loadFontsViaIterator( doc );
+    QCOMPARE( listOfFonts.size(), 2 );
+    QList<Poppler::FontInfo> listOfFonts2 = loadFontsViaIterator( doc );
+    QCOMPARE( listOfFonts, listOfFonts2 );
+
+    delete doc;
+}
+
+void TestFontsData::checkScanForFonts()
+{
+    Poppler::Document *doc;
+    doc = Poppler::Document::load(TESTDATADIR "/tests/fonts.pdf");
+    QVERIFY( doc );
+
+    QList<Poppler::FontInfo> listOfFonts = doc->fonts();
+    QCOMPARE( listOfFonts.size(), 3 );
+    // check we get the very same result when gatering fonts using scanForFonts
+    QList<Poppler::FontInfo> listOfFonts2;
+    for ( int i = 0; i < doc->numPages(); ++i )
+    {
+        doc->scanForFonts( 1, &listOfFonts2 );
+    }
+    QCOMPARE( listOfFonts, listOfFonts2 );
+
+   // check doing a second scanForFonts gives no result
+    QList<Poppler::FontInfo> listOfFonts3;
+    for ( int i = 0; i < doc->numPages(); ++i )
+    {
+        doc->scanForFonts( 1, &listOfFonts3 );
+    }
+    QVERIFY( listOfFonts3.isEmpty() );
+
+    delete doc;
+}
+
+QTEST_MAIN(TestFontsData)
+#include "check_fonts.moc"
+
diff --git a/qt4/tests/check_links.cpp b/qt4/tests/check_links.cpp
new file mode 100644 (file)
index 0000000..b5b2dee
--- /dev/null
@@ -0,0 +1,96 @@
+#include <QtTest/QtTest>
+
+#include <poppler-qt4.h>
+
+#include <memory>
+
+class TestLinks : public QObject
+{
+    Q_OBJECT
+private slots:
+    void checkDocumentWithNoDests();
+    void checkDests_xr01();
+    void checkDests_xr02();
+};
+
+bool isDestinationValid_pageNumber( const Poppler::LinkDestination *dest, const Poppler::Document *doc )
+{
+    return dest->pageNumber() > 0 && dest->pageNumber() <= doc->numPages();
+}
+
+bool isDestinationValid_name( const Poppler::LinkDestination *dest )
+{
+    return !dest->destinationName().isEmpty();
+}
+
+
+void TestLinks::checkDocumentWithNoDests()
+{
+    Poppler::Document *doc;
+    doc = Poppler::Document::load(TESTDATADIR "/unittestcases/WithAttachments.pdf");
+    QVERIFY( doc );
+
+    std::auto_ptr< Poppler::LinkDestination > dest;
+    dest.reset( doc->linkDestination("no.dests.in.this.document") );
+    QVERIFY( !isDestinationValid_pageNumber( dest.get(), doc ) );
+    QVERIFY( isDestinationValid_name( dest.get() ) );
+
+    delete doc;
+}
+
+void TestLinks::checkDests_xr01()
+{
+    Poppler::Document *doc;
+    doc = Poppler::Document::load(TESTDATADIR "/unittestcases/xr01.pdf");
+    QVERIFY( doc );
+
+    Poppler::Page *page = doc->page(0);
+    QVERIFY( page );
+
+    QList< Poppler::Link* > links = page->links();
+    QCOMPARE( links.count(), 2 );
+
+    {
+    QCOMPARE( links.at(0)->linkType(), Poppler::Link::Goto );
+    Poppler::LinkGoto *link = static_cast< Poppler::LinkGoto * >( links.at(0) );
+    const Poppler::LinkDestination dest = link->destination();
+    QVERIFY( !isDestinationValid_pageNumber( &dest, doc ) );
+    QVERIFY( isDestinationValid_name( &dest ) );
+    QCOMPARE( dest.destinationName(), QString::fromLatin1("section.1") );
+    }
+
+    {
+    QCOMPARE( links.at(1)->linkType(), Poppler::Link::Goto );
+    Poppler::LinkGoto *link = static_cast< Poppler::LinkGoto * >( links.at(1) );
+    const Poppler::LinkDestination dest = link->destination();
+    QVERIFY( !isDestinationValid_pageNumber( &dest, doc ) );
+    QVERIFY( isDestinationValid_name( &dest ) );
+    QCOMPARE( dest.destinationName(), QString::fromLatin1("section.2") );
+    }
+
+    delete doc;
+}
+
+void TestLinks::checkDests_xr02()
+{
+    Poppler::Document *doc;
+    doc = Poppler::Document::load(TESTDATADIR "/unittestcases/xr02.pdf");
+    QVERIFY( doc );
+
+    std::auto_ptr< Poppler::LinkDestination > dest;
+    dest.reset( doc->linkDestination("section.1") );
+    QVERIFY( isDestinationValid_pageNumber( dest.get(), doc ) );
+    QVERIFY( !isDestinationValid_name( dest.get() ) );
+    dest.reset( doc->linkDestination("section.2") );
+    QVERIFY( isDestinationValid_pageNumber( dest.get(), doc ) );
+    QVERIFY( !isDestinationValid_name( dest.get() ) );
+    dest.reset( doc->linkDestination("section.3") );
+    QVERIFY( !isDestinationValid_pageNumber( dest.get(), doc ) );
+    QVERIFY( isDestinationValid_name( dest.get() ) );
+
+    delete doc;
+}
+
+QTEST_MAIN(TestLinks)
+
+#include "check_links.moc"
diff --git a/qt4/tests/check_metadata.cpp b/qt4/tests/check_metadata.cpp
new file mode 100644 (file)
index 0000000..fb4f716
--- /dev/null
@@ -0,0 +1,275 @@
+#include <QtTest/QtTest>
+
+#include <poppler-qt4.h>
+
+class TestMetaData: public QObject
+{
+    Q_OBJECT
+private slots:
+    void checkStrings_data();
+    void checkStrings();
+    void checkStrings2_data();
+    void checkStrings2();
+    void checkStringKeys();
+    void checkLinearised();
+    void checkNumPages();
+    void checkDate();
+    void checkPageSize();
+    void checkPortraitOrientation();
+    void checkLandscapeOrientation();
+    void checkUpsideDownOrientation();
+    void checkSeascapeOrientation();
+    void checkVersion();
+    void checkPdfId();
+    void checkNoPdfId();
+};
+
+void TestMetaData::checkStrings_data()
+{
+    QTest::addColumn<QString>("key");
+    QTest::addColumn<QString>("value");
+
+    QTest::newRow( "Author" ) << "Author" << "Brad Hards";
+    QTest::newRow( "Title" ) << "Title" << "Two pages";
+    QTest::newRow( "Subject" ) << "Subject"
+                              << "A two page layout for poppler testing";
+    QTest::newRow( "Keywords" ) << "Keywords" << "Qt4 bindings";
+    QTest::newRow( "Creator" ) << "Creator" << "iText: cgpdftops CUPS filter";
+    QTest::newRow( "Producer" ) << "Producer" << "Acrobat Distiller 7.0 for Macintosh";
+}
+
+void TestMetaData::checkStrings()
+{
+    Poppler::Document *doc;
+    doc = Poppler::Document::load(TESTDATADIR "/unittestcases/doublepage.pdf");
+    QVERIFY( doc );
+
+    QFETCH( QString, key );
+    QFETCH( QString, value );
+    QCOMPARE( doc->info(key), value );
+
+    delete doc;
+}
+
+void TestMetaData::checkStrings2_data()
+{
+    QTest::addColumn<QString>("key");
+    QTest::addColumn<QString>("value");
+
+    QTest::newRow( "Title" ) << "Title" << "Malaga hotels";
+    QTest::newRow( "Author" ) << "Author" << "Brad Hards";
+    QTest::newRow( "Creator" ) << "Creator" << "Safari: cgpdftops CUPS filter";
+    QTest::newRow( "Producer" )  << "Producer" << "Acrobat Distiller 7.0 for Macintosh";
+    QTest::newRow( "Keywords" ) << "Keywords" << "First\rSecond\rthird";
+    QTest::newRow( "Custom1" ) << "Custom1" << "CustomValue1";
+    QTest::newRow( "Custom2" ) << "Custom2" << "CustomValue2";
+}
+
+void TestMetaData::checkStrings2()
+{
+    Poppler::Document *doc;
+    doc = Poppler::Document::load(TESTDATADIR "/unittestcases/truetype.pdf");
+    QVERIFY( doc );
+
+    QFETCH( QString, key );
+    QFETCH( QString, value );
+    QCOMPARE( doc->info(key), value );
+
+    delete doc;
+}
+
+void TestMetaData::checkStringKeys()
+{
+    Poppler::Document *doc;
+    doc = Poppler::Document::load(TESTDATADIR "/unittestcases/truetype.pdf");
+    QVERIFY( doc );
+
+    QStringList keyList;
+    keyList << "Title" << "Author" << "Creator" << "Keywords" << "CreationDate";
+    keyList << "Producer" << "ModDate" << "Custom1" << "Custom2";
+    keyList.sort();
+    QStringList keysInDoc = doc->infoKeys();
+    keysInDoc.sort();
+    QCOMPARE( keysInDoc, keyList );
+
+    delete doc;
+}
+
+void TestMetaData::checkLinearised()
+{
+    Poppler::Document *doc;
+    doc = Poppler::Document::load(TESTDATADIR "/unittestcases/orientation.pdf");
+    QVERIFY( doc );
+
+    QVERIFY( doc->isLinearized() );
+
+    delete doc;
+
+    doc = Poppler::Document::load(TESTDATADIR "/unittestcases/truetype.pdf");
+    QVERIFY( doc );
+    QCOMPARE( doc->isLinearized(), false );
+
+    delete doc;
+}
+
+void TestMetaData::checkPortraitOrientation()
+{
+    Poppler::Document *doc;
+    doc = Poppler::Document::load(TESTDATADIR "/unittestcases/orientation.pdf");
+    QVERIFY( doc );
+  
+    Poppler::Page *page = doc->page(0);
+    QCOMPARE( page->orientation(), Poppler::Page::Portrait );
+
+    delete page;
+    delete doc;
+}
+
+void TestMetaData::checkNumPages()
+{
+    Poppler::Document *doc;
+    doc = Poppler::Document::load(TESTDATADIR "/unittestcases/doublepage.pdf");
+    QVERIFY( doc );
+    QCOMPARE( doc->numPages(), 2 );
+
+    delete doc;
+
+    doc = Poppler::Document::load(TESTDATADIR "/unittestcases/truetype.pdf");
+    QVERIFY( doc );
+    QCOMPARE( doc->numPages(), 1 );
+
+    delete doc;
+}
+
+void TestMetaData::checkDate()
+{
+    Poppler::Document *doc;
+
+    doc = Poppler::Document::load(TESTDATADIR "/unittestcases/truetype.pdf");
+    QVERIFY( doc );
+    QCOMPARE( doc->date("ModDate"), QDateTime(QDate(2005, 12, 5), QTime(9,44,46), Qt::UTC ) );
+    QCOMPARE( doc->date("CreationDate"), QDateTime(QDate(2005, 8, 13), QTime(1,12,11), Qt::UTC ) );
+
+    delete doc;
+}
+
+void TestMetaData::checkPageSize()
+{
+    Poppler::Document *doc;
+
+    doc = Poppler::Document::load(TESTDATADIR "/unittestcases/truetype.pdf");
+    QVERIFY( doc );
+    Poppler::Page *page = doc->page(0);
+    QCOMPARE( page->pageSize(), QSize(595, 842) );
+    QCOMPARE( page->pageSizeF(), QSizeF(595.22, 842) );
+
+    delete page;
+    delete doc;
+}
+
+
+void TestMetaData::checkLandscapeOrientation()
+{
+    Poppler::Document *doc;
+    doc = Poppler::Document::load(TESTDATADIR "/unittestcases/orientation.pdf");
+    QVERIFY( doc );
+  
+    Poppler::Page *page = doc->page(1);
+    QCOMPARE( page->orientation(), Poppler::Page::Landscape );
+
+    delete page;
+    delete doc;
+}
+
+void TestMetaData::checkUpsideDownOrientation()
+{
+    Poppler::Document *doc;
+    doc = Poppler::Document::load(TESTDATADIR "/unittestcases/orientation.pdf");
+    QVERIFY( doc );
+
+    Poppler::Page *page = doc->page(2);
+    QCOMPARE( page->orientation(), Poppler::Page::UpsideDown );
+
+    delete page;
+    delete doc;
+}
+
+void TestMetaData::checkSeascapeOrientation()
+{
+    Poppler::Document *doc;
+    doc = Poppler::Document::load(TESTDATADIR "/unittestcases/orientation.pdf");
+    QVERIFY( doc );
+
+    Poppler::Page *page = doc->page(3);
+    QCOMPARE( page->orientation(), Poppler::Page::Seascape );
+
+    delete page;
+    delete doc;
+}
+
+void TestMetaData::checkVersion()
+{
+    Poppler::Document *doc;
+    doc = Poppler::Document::load(TESTDATADIR "/unittestcases/doublepage.pdf");
+    QVERIFY( doc );
+
+    QCOMPARE( doc->pdfVersion(), 1.6 );
+    int major = 0, minor = 0;
+    doc->getPdfVersion( &major, &minor );
+    QCOMPARE( major, 1 );
+    QCOMPARE( minor, 6 );
+
+    delete doc;
+}
+
+void TestMetaData::checkPdfId()
+{
+    Poppler::Document *doc;
+    doc = Poppler::Document::load(TESTDATADIR "/unittestcases/A6EmbeddedFiles.pdf");
+    QVERIFY( doc );
+
+    const QByteArray referencePermanentId( "00C9D5B6D8FB11D7A902003065D630AA" );
+    const QByteArray referenceUpdateId( "39AECAE6D8FB11D7A902003065D630AA" );
+
+    {
+    // no IDs wanted, just existance check
+    QVERIFY( doc->getPdfId( 0, 0 ) );
+    }
+    {
+    // only permanent ID
+    QByteArray permanentId;
+    QVERIFY( doc->getPdfId( &permanentId, 0 ) );
+    QCOMPARE( permanentId.toUpper(), referencePermanentId );
+    }
+    {
+    // only update ID
+    QByteArray updateId;
+    QVERIFY( doc->getPdfId( 0, &updateId ) );
+    QCOMPARE( updateId.toUpper(), referenceUpdateId );
+    }
+    {
+    // both IDs
+    QByteArray permanentId;
+    QByteArray updateId;
+    QVERIFY( doc->getPdfId( &permanentId, &updateId ) );
+    QCOMPARE( permanentId.toUpper(), referencePermanentId );
+    QCOMPARE( updateId.toUpper(), referenceUpdateId );
+    }
+
+    delete doc;
+}
+
+void TestMetaData::checkNoPdfId()
+{
+    Poppler::Document *doc;
+    doc = Poppler::Document::load(TESTDATADIR "/unittestcases/WithActualText.pdf");
+    QVERIFY( doc );
+
+    QVERIFY( !doc->getPdfId( 0, 0 ) );
+
+    delete doc;
+}
+
+QTEST_MAIN(TestMetaData)
+#include "check_metadata.moc"
+
diff --git a/qt4/tests/check_optcontent.cpp b/qt4/tests/check_optcontent.cpp
new file mode 100644 (file)
index 0000000..22b14a4
--- /dev/null
@@ -0,0 +1,484 @@
+#include <QtTest/QtTest>
+
+#include "PDFDoc.h"
+#include "GlobalParams.h"
+
+#include <poppler-qt4.h>
+
+class TestOptionalContent: public QObject
+{
+    Q_OBJECT
+private slots:
+    void checkVisPolicy();
+    void checkNestedLayers();
+    void checkNoOptionalContent();
+    void checkIsVisible();
+    void checkVisibilitySetting();
+    void checkRadioButtons();
+};
+
+void TestOptionalContent::checkVisPolicy()
+{
+    Poppler::Document *doc;
+    doc = Poppler::Document::load(TESTDATADIR "/unittestcases/vis_policy_test.pdf");
+    QVERIFY( doc );
+
+    QVERIFY( doc->hasOptionalContent() );
+
+    Poppler::OptContentModel *optContent = doc->optionalContentModel();
+    QModelIndex index;
+    index = optContent->index( 0, 0, QModelIndex() );
+    QCOMPARE( optContent->data( index, Qt::DisplayRole ).toString(), QString( "A" ) );
+    QCOMPARE( static_cast<Qt::CheckState>( optContent->data( index, Qt::CheckStateRole ).toInt() ), Qt::Checked );
+    index = optContent->index( 1, 0, QModelIndex() );
+    QCOMPARE( optContent->data( index, Qt::DisplayRole ).toString(), QString( "B" ) );
+    QCOMPARE( static_cast<Qt::CheckState>( optContent->data( index, Qt::CheckStateRole ).toInt() ), Qt::Checked );
+
+    delete doc;
+}
+
+void TestOptionalContent::checkNestedLayers()
+{
+    Poppler::Document *doc;
+    doc = Poppler::Document::load(TESTDATADIR "/unittestcases/NestedLayers.pdf");
+    QVERIFY( doc );
+
+    QVERIFY( doc->hasOptionalContent() );
+
+    Poppler::OptContentModel *optContent = doc->optionalContentModel();
+    QModelIndex index;
+
+    index = optContent->index( 0, 0, QModelIndex() );
+    QCOMPARE( optContent->data( index, Qt::DisplayRole ).toString(), QString( "Black Text and Green Snow" ) );
+    QCOMPARE( static_cast<Qt::CheckState>( optContent->data( index, Qt::CheckStateRole ).toInt() ), Qt::Unchecked );
+
+    index = optContent->index( 1, 0, QModelIndex() );
+    QCOMPARE( optContent->data( index, Qt::DisplayRole ).toString(), QString( "Mountains and Image" ) );
+    QCOMPARE( static_cast<Qt::CheckState>( optContent->data( index, Qt::CheckStateRole ).toInt() ), Qt::Checked );
+
+    // This is a sub-item of "Mountains and Image"
+    QModelIndex subindex = optContent->index( 0, 0, index );
+    QCOMPARE( optContent->data( subindex, Qt::DisplayRole ).toString(), QString( "Image" ) );
+    QCOMPARE( static_cast<Qt::CheckState>( optContent->data( index, Qt::CheckStateRole ).toInt() ), Qt::Checked );
+
+    index = optContent->index( 2, 0, QModelIndex() );
+    QCOMPARE( optContent->data( index, Qt::DisplayRole ).toString(), QString( "Starburst" ) );
+    QCOMPARE( static_cast<Qt::CheckState>( optContent->data( index, Qt::CheckStateRole ).toInt() ), Qt::Checked );
+
+    index = optContent->index( 3, 0, QModelIndex() );
+    QCOMPARE( optContent->data( index, Qt::DisplayRole ).toString(), QString( "Watermark" ) );
+    QCOMPARE( static_cast<Qt::CheckState>( optContent->data( index, Qt::CheckStateRole ).toInt() ), Qt::Unchecked );
+
+    delete doc;
+}
+
+void TestOptionalContent::checkNoOptionalContent()
+{
+    Poppler::Document *doc;
+    doc = Poppler::Document::load(TESTDATADIR "/unittestcases/orientation.pdf");
+    QVERIFY( doc );
+
+    QCOMPARE( doc->hasOptionalContent(), false );
+
+    delete doc;
+}
+
+void TestOptionalContent::checkIsVisible()
+{
+    GooString *fileName = new GooString(TESTDATADIR "/unittestcases/vis_policy_test.pdf");
+    globalParams = new GlobalParams();
+    PDFDoc *doc = new PDFDoc( fileName );
+    QVERIFY( doc );
+
+    OCGs *ocgs = doc->getOptContentConfig();
+    QVERIFY( ocgs );
+
+    XRef *xref = doc->getXRef();
+
+    Object obj;
+
+    // In this test, both Ref(21,0) and Ref(2,0) are set to On
+
+    // AnyOn, one element array:
+    // 22 0 obj<</Type/OCMD/OCGs[21 0 R]/P/AnyOn>>endobj
+    xref->fetch( 22, 0, &obj );
+    QVERIFY( obj.isDict() );
+    QVERIFY( ocgs->optContentIsVisible( &obj ) );
+    obj.free();
+
+    // Same again, looking for any leaks or dubious free()'s
+    xref->fetch( 22, 0, &obj );
+    QVERIFY( obj.isDict() );
+    QVERIFY( ocgs->optContentIsVisible( &obj ) );
+    obj.free();
+
+    // AnyOff, one element array:
+    // 29 0 obj<</Type/OCMD/OCGs[21 0 R]/P/AnyOff>>endobj
+    xref->fetch( 29, 0, &obj );
+    QVERIFY( obj.isDict() );
+    QCOMPARE( ocgs->optContentIsVisible( &obj ), false );
+    obj.free();
+
+    // AllOn, one element array:
+    // 36 0 obj<</Type/OCMD/OCGs[28 0 R]/P/AllOn>>endobj
+    xref->fetch( 36, 0, &obj );
+    QVERIFY( obj.isDict() );
+    QCOMPARE( ocgs->optContentIsVisible( &obj ), true );
+    obj.free();
+
+
+    // AllOff, one element array:
+    // 43 0 obj<</Type/OCMD/OCGs[28 0 R]/P/AllOff>>endobj
+    xref->fetch( 43, 0, &obj );
+    QVERIFY( obj.isDict() );
+    QCOMPARE( ocgs->optContentIsVisible( &obj ), false );
+    obj.free();
+
+    // AnyOn, multi-element array:
+    // 50 0 obj<</Type/OCMD/OCGs[21 0 R 28 0 R]/P/AnyOn>>endobj
+    xref->fetch( 50, 0, &obj );
+    QVERIFY( obj.isDict() );
+    QCOMPARE( ocgs->optContentIsVisible( &obj ), true );
+    obj.free();
+
+    // AnyOff, multi-element array:
+    // 57 0 obj<</Type/OCMD/P/AnyOff/OCGs[21 0 R 28 0 R]>>endobj
+    xref->fetch( 57, 0, &obj );
+    QVERIFY( obj.isDict() );
+    QCOMPARE( ocgs->optContentIsVisible( &obj ), false );
+    obj.free();
+
+    // AllOn, multi-element array:
+    // 64 0 obj<</Type/OCMD/P/AllOn/OCGs[21 0 R 28 0 R]>>endobj
+    xref->fetch( 64, 0, &obj );
+    QVERIFY( obj.isDict() );
+    QCOMPARE( ocgs->optContentIsVisible( &obj ), true );
+    obj.free();
+
+    // AllOff, multi-element array:
+    // 71 0 obj<</Type/OCMD/P/AllOff/OCGs[21 0 R 28 0 R]>>endobj
+    xref->fetch( 71, 0, &obj );
+    QVERIFY( obj.isDict() );
+    QCOMPARE( ocgs->optContentIsVisible( &obj ), false );
+    obj.free();
+
+    delete doc;
+    delete globalParams;
+}
+
+void TestOptionalContent::checkVisibilitySetting()
+{
+    globalParams = new GlobalParams();
+    GooString *fileName = new GooString(TESTDATADIR "/unittestcases/vis_policy_test.pdf");
+    PDFDoc *doc = new PDFDoc( fileName );
+    QVERIFY( doc );
+
+    OCGs *ocgs = doc->getOptContentConfig();
+    QVERIFY( ocgs );
+
+    XRef *xref = doc->getXRef();
+
+    Object obj;
+
+    // In this test, both Ref(21,0) and Ref(28,0) start On,
+    // based on the file settings
+    Object ref21obj;
+    ref21obj.initRef( 21, 0 );
+    Ref ref21 = ref21obj.getRef();
+    OptionalContentGroup *ocgA = ocgs->findOcgByRef( ref21 );
+    QVERIFY( ocgA );
+
+    QVERIFY( (ocgA->getName()->cmp("A")) == 0 );
+    QCOMPARE( ocgA->getState(), OptionalContentGroup::On );
+
+    Object ref28obj;
+    ref28obj.initRef( 28, 0 );
+    Ref ref28 = ref28obj.getRef();
+    OptionalContentGroup *ocgB = ocgs->findOcgByRef( ref28 );
+    QVERIFY( ocgB );
+
+    QVERIFY( (ocgB->getName()->cmp("B")) == 0 );
+    QCOMPARE( ocgB->getState(), OptionalContentGroup::On );
+
+    // turn one Off
+    ocgA->setState( OptionalContentGroup::Off );
+
+    // AnyOn, one element array:
+    // 22 0 obj<</Type/OCMD/OCGs[21 0 R]/P/AnyOn>>endobj
+    xref->fetch( 22, 0, &obj );
+    QVERIFY( obj.isDict() );
+    QCOMPARE( ocgs->optContentIsVisible( &obj ), false );
+    obj.free();
+
+    // Same again, looking for any leaks or dubious free()'s
+    xref->fetch( 22, 0, &obj );
+    QVERIFY( obj.isDict() );
+    QCOMPARE( ocgs->optContentIsVisible( &obj ), false );
+    obj.free();
+
+    // AnyOff, one element array:
+    // 29 0 obj<</Type/OCMD/OCGs[21 0 R]/P/AnyOff>>endobj
+    xref->fetch( 29, 0, &obj );
+    QVERIFY( obj.isDict() );
+    QCOMPARE( ocgs->optContentIsVisible( &obj ), true );
+    obj.free();
+
+    // AllOn, one element array:
+    // 36 0 obj<</Type/OCMD/OCGs[28 0 R]/P/AllOn>>endobj
+    xref->fetch( 36, 0, &obj );
+    QVERIFY( obj.isDict() );
+    QCOMPARE( ocgs->optContentIsVisible( &obj ), true );
+    obj.free();
+
+    // AllOff, one element array:
+    // 43 0 obj<</Type/OCMD/OCGs[28 0 R]/P/AllOff>>endobj
+    xref->fetch( 43, 0, &obj );
+    QVERIFY( obj.isDict() );
+    QCOMPARE( ocgs->optContentIsVisible( &obj ), false );
+    obj.free();
+
+    // AnyOn, multi-element array:
+    // 50 0 obj<</Type/OCMD/OCGs[21 0 R 28 0 R]/P/AnyOn>>endobj
+    xref->fetch( 50, 0, &obj );
+    QVERIFY( obj.isDict() );
+    QCOMPARE( ocgs->optContentIsVisible( &obj ), true );
+    obj.free();
+
+    // AnyOff, multi-element array:
+    // 57 0 obj<</Type/OCMD/P/AnyOff/OCGs[21 0 R 28 0 R]>>endobj
+    xref->fetch( 57, 0, &obj );
+    QVERIFY( obj.isDict() );
+    QCOMPARE( ocgs->optContentIsVisible( &obj ), true );
+    obj.free();
+
+    // AllOn, multi-element array:
+    // 64 0 obj<</Type/OCMD/P/AllOn/OCGs[21 0 R 28 0 R]>>endobj
+    xref->fetch( 64, 0, &obj );
+    QVERIFY( obj.isDict() );
+    QCOMPARE( ocgs->optContentIsVisible( &obj ), false );
+    obj.free();
+
+    // AllOff, multi-element array:
+    // 71 0 obj<</Type/OCMD/P/AllOff/OCGs[21 0 R 28 0 R]>>endobj
+    xref->fetch( 71, 0, &obj );
+    QVERIFY( obj.isDict() );
+    QCOMPARE( ocgs->optContentIsVisible( &obj ), false );
+    obj.free();
+
+
+    // Turn the other one off as well (i.e. both are Off)
+    ocgB->setState(OptionalContentGroup::Off);
+
+    // AnyOn, one element array:
+    // 22 0 obj<</Type/OCMD/OCGs[21 0 R]/P/AnyOn>>endobj
+    xref->fetch( 22, 0, &obj );
+    QVERIFY( obj.isDict() );
+    QCOMPARE( ocgs->optContentIsVisible( &obj ), false );
+    obj.free();
+
+    // Same again, looking for any leaks or dubious free()'s
+    xref->fetch( 22, 0, &obj );
+    QVERIFY( obj.isDict() );
+    QCOMPARE( ocgs->optContentIsVisible( &obj ), false );
+    obj.free();
+
+    // AnyOff, one element array:
+    // 29 0 obj<</Type/OCMD/OCGs[21 0 R]/P/AnyOff>>endobj
+    xref->fetch( 29, 0, &obj );
+    QVERIFY( obj.isDict() );
+    QCOMPARE( ocgs->optContentIsVisible( &obj ), true );
+    obj.free();
+
+    // AllOn, one element array:
+    // 36 0 obj<</Type/OCMD/OCGs[28 0 R]/P/AllOn>>endobj
+    xref->fetch( 36, 0, &obj );
+    QVERIFY( obj.isDict() );
+    QCOMPARE( ocgs->optContentIsVisible( &obj ), false );
+    obj.free();
+
+    // AllOff, one element array:
+    // 43 0 obj<</Type/OCMD/OCGs[28 0 R]/P/AllOff>>endobj
+    xref->fetch( 43, 0, &obj );
+    QVERIFY( obj.isDict() );
+    QCOMPARE( ocgs->optContentIsVisible( &obj ), true );
+    obj.free();
+
+    // AnyOn, multi-element array:
+    // 50 0 obj<</Type/OCMD/OCGs[21 0 R 28 0 R]/P/AnyOn>>endobj
+    xref->fetch( 50, 0, &obj );
+    QVERIFY( obj.isDict() );
+    QCOMPARE( ocgs->optContentIsVisible( &obj ), false );
+    obj.free();
+
+    // AnyOff, multi-element array:
+    // 57 0 obj<</Type/OCMD/P/AnyOff/OCGs[21 0 R 28 0 R]>>endobj
+    xref->fetch( 57, 0, &obj );
+    QVERIFY( obj.isDict() );
+    QCOMPARE( ocgs->optContentIsVisible( &obj ), true );
+    obj.free();
+
+    // AllOn, multi-element array:
+    // 64 0 obj<</Type/OCMD/P/AllOn/OCGs[21 0 R 28 0 R]>>endobj
+    xref->fetch( 64, 0, &obj );
+    QVERIFY( obj.isDict() );
+    QCOMPARE( ocgs->optContentIsVisible( &obj ), false );
+    obj.free();
+
+    // AllOff, multi-element array:
+    // 71 0 obj<</Type/OCMD/P/AllOff/OCGs[21 0 R 28 0 R]>>endobj
+    xref->fetch( 71, 0, &obj );
+    QVERIFY( obj.isDict() );
+    QCOMPARE( ocgs->optContentIsVisible( &obj ), true );
+    obj.free();
+
+
+    // Turn the first one on again (21 is On, 28 is Off)
+    ocgA->setState(OptionalContentGroup::On);
+
+    // AnyOn, one element array:
+    // 22 0 obj<</Type/OCMD/OCGs[21 0 R]/P/AnyOn>>endobj
+    xref->fetch( 22, 0, &obj );
+    QVERIFY( obj.isDict() );
+    QCOMPARE( ocgs->optContentIsVisible( &obj ), true );
+    obj.free();
+
+    // Same again, looking for any leaks or dubious free()'s
+    xref->fetch( 22, 0, &obj );
+    QVERIFY( obj.isDict() );
+    QCOMPARE( ocgs->optContentIsVisible( &obj ), true );
+    obj.free();
+
+    // AnyOff, one element array:
+    // 29 0 obj<</Type/OCMD/OCGs[21 0 R]/P/AnyOff>>endobj
+    xref->fetch( 29, 0, &obj );
+    QVERIFY( obj.isDict() );
+    QCOMPARE( ocgs->optContentIsVisible( &obj ), false );
+    obj.free();
+
+    // AllOn, one element array:
+    // 36 0 obj<</Type/OCMD/OCGs[28 0 R]/P/AllOn>>endobj
+    xref->fetch( 36, 0, &obj );
+    QVERIFY( obj.isDict() );
+    QCOMPARE( ocgs->optContentIsVisible( &obj ), false );
+    obj.free();
+
+    // AllOff, one element array:
+    // 43 0 obj<</Type/OCMD/OCGs[28 0 R]/P/AllOff>>endobj
+    xref->fetch( 43, 0, &obj );
+    QVERIFY( obj.isDict() );
+    QCOMPARE( ocgs->optContentIsVisible( &obj ), true );
+    obj.free();
+
+    // AnyOn, multi-element array:
+    // 50 0 obj<</Type/OCMD/OCGs[21 0 R 28 0 R]/P/AnyOn>>endobj
+    xref->fetch( 50, 0, &obj );
+    QVERIFY( obj.isDict() );
+    QCOMPARE( ocgs->optContentIsVisible( &obj ), true );
+    obj.free();
+
+    // AnyOff, multi-element array:
+    // 57 0 obj<</Type/OCMD/P/AnyOff/OCGs[21 0 R 28 0 R]>>endobj
+    xref->fetch( 57, 0, &obj );
+    QVERIFY( obj.isDict() );
+    QCOMPARE( ocgs->optContentIsVisible( &obj ), true );
+    obj.free();
+
+    // AllOn, multi-element array:
+    // 64 0 obj<</Type/OCMD/P/AllOn/OCGs[21 0 R 28 0 R]>>endobj
+    xref->fetch( 64, 0, &obj );
+    QVERIFY( obj.isDict() );
+    QCOMPARE( ocgs->optContentIsVisible( &obj ), false );
+    obj.free();
+
+    // AllOff, multi-element array:
+    // 71 0 obj<</Type/OCMD/P/AllOff/OCGs[21 0 R 28 0 R]>>endobj
+    xref->fetch( 71, 0, &obj );
+    QVERIFY( obj.isDict() );
+    QCOMPARE( ocgs->optContentIsVisible( &obj ), false );
+    obj.free();
+
+    delete doc;
+    delete globalParams;
+}
+
+void TestOptionalContent::checkRadioButtons()
+{
+    Poppler::Document *doc;
+    doc = Poppler::Document::load(TESTDATADIR "/unittestcases/ClarityOCGs.pdf");
+    QVERIFY( doc );
+
+    QVERIFY( doc->hasOptionalContent() );
+
+    Poppler::OptContentModel *optContent = doc->optionalContentModel();
+    QModelIndex index;
+
+    index = optContent->index( 0, 0, QModelIndex() );
+    QCOMPARE( optContent->data( index, Qt::DisplayRole ).toString(), QString( "Languages" ) );
+    QCOMPARE( static_cast<Qt::CheckState>( optContent->data( index, Qt::CheckStateRole ).toInt() ), Qt::Unchecked );
+
+    // These are sub-items of the "Languages" label
+    QModelIndex subindex = optContent->index( 0, 0, index );
+    QCOMPARE( optContent->data( subindex, Qt::DisplayRole ).toString(), QString( "English" ) );
+    QCOMPARE( static_cast<Qt::CheckState>( optContent->data( subindex, Qt::CheckStateRole ).toInt() ), Qt::Checked );
+
+    subindex = optContent->index( 1, 0, index );
+    QCOMPARE( optContent->data( subindex, Qt::DisplayRole ).toString(), QString( "French" ) );
+    QCOMPARE( static_cast<Qt::CheckState>( optContent->data( subindex, Qt::CheckStateRole ).toInt() ), Qt::Unchecked );
+
+    subindex = optContent->index( 2, 0, index );
+    QCOMPARE( optContent->data( subindex, Qt::DisplayRole ).toString(), QString( "Japanese" ) );
+    QCOMPARE( static_cast<Qt::CheckState>( optContent->data( subindex, Qt::CheckStateRole ).toInt() ), Qt::Unchecked );
+
+    // RBGroup of languages, so turning on Japanese should turn off English
+    QVERIFY( optContent->setData( subindex, QVariant( true ), Qt::CheckStateRole ) );
+
+    subindex = optContent->index( 0, 0, index );
+    QCOMPARE( optContent->data( subindex, Qt::DisplayRole ).toString(), QString( "English" ) );
+    QCOMPARE( static_cast<Qt::CheckState>( optContent->data( subindex, Qt::CheckStateRole ).toInt() ), Qt::Unchecked );
+
+    subindex = optContent->index( 2, 0, index );
+    QCOMPARE( optContent->data( subindex, Qt::DisplayRole ).toString(), QString( "Japanese" ) );
+    QCOMPARE( static_cast<Qt::CheckState>( optContent->data( subindex, Qt::CheckStateRole ).toInt() ), Qt::Checked );
+
+    subindex = optContent->index( 1, 0, index );
+    QCOMPARE( optContent->data( subindex, Qt::DisplayRole ).toString(), QString( "French" ) );
+    QCOMPARE( static_cast<Qt::CheckState>( optContent->data( subindex, Qt::CheckStateRole ).toInt() ), Qt::Unchecked );
+
+    // and turning on French should turn off Japanese
+    QVERIFY( optContent->setData( subindex, QVariant( true ), Qt::CheckStateRole ) );
+
+    subindex = optContent->index( 0, 0, index );
+    QCOMPARE( optContent->data( subindex, Qt::DisplayRole ).toString(), QString( "English" ) );
+    QCOMPARE( static_cast<Qt::CheckState>( optContent->data( subindex, Qt::CheckStateRole ).toInt() ), Qt::Unchecked );
+
+    subindex = optContent->index( 2, 0, index );
+    QCOMPARE( optContent->data( subindex, Qt::DisplayRole ).toString(), QString( "Japanese" ) );
+    QCOMPARE( static_cast<Qt::CheckState>( optContent->data( subindex, Qt::CheckStateRole ).toInt() ), Qt::Unchecked );
+
+    subindex = optContent->index( 1, 0, index );
+    QCOMPARE( optContent->data( subindex, Qt::DisplayRole ).toString(), QString( "French" ) );
+    QCOMPARE( static_cast<Qt::CheckState>( optContent->data( subindex, Qt::CheckStateRole ).toInt() ), Qt::Checked );
+
+
+    // and turning off French should leave them all off
+    QVERIFY( optContent->setData( subindex, QVariant( false ), Qt::CheckStateRole ) );
+
+    subindex = optContent->index( 0, 0, index );
+    QCOMPARE( optContent->data( subindex, Qt::DisplayRole ).toString(), QString( "English" ) );
+    QCOMPARE( static_cast<Qt::CheckState>( optContent->data( subindex, Qt::CheckStateRole ).toInt() ), Qt::Unchecked );
+
+    subindex = optContent->index( 2, 0, index );
+    QCOMPARE( optContent->data( subindex, Qt::DisplayRole ).toString(), QString( "Japanese" ) );
+    QCOMPARE( static_cast<Qt::CheckState>( optContent->data( subindex, Qt::CheckStateRole ).toInt() ), Qt::Unchecked );
+
+    subindex = optContent->index( 1, 0, index );
+    QCOMPARE( optContent->data( subindex, Qt::DisplayRole ).toString(), QString( "French" ) );
+    QCOMPARE( static_cast<Qt::CheckState>( optContent->data( subindex, Qt::CheckStateRole ).toInt() ), Qt::Unchecked );
+
+    delete doc;
+}
+
+QTEST_MAIN(TestOptionalContent)
+
+#include "check_optcontent.moc"
+
diff --git a/qt4/tests/check_pagelayout.cpp b/qt4/tests/check_pagelayout.cpp
new file mode 100644 (file)
index 0000000..6108f88
--- /dev/null
@@ -0,0 +1,49 @@
+#include <QtTest/QtTest>
+
+#include <poppler-qt4.h>
+
+class TestPageLayout: public QObject
+{
+    Q_OBJECT
+private slots:
+    void checkNone();
+    void checkSingle();
+    void checkFacing();
+};
+
+void TestPageLayout::checkNone()
+{
+    Poppler::Document *doc;
+    doc = Poppler::Document::load(TESTDATADIR "/unittestcases/UseNone.pdf");
+    QVERIFY( doc );
+  
+    QCOMPARE( doc->pageLayout(), Poppler::Document::NoLayout );
+
+    delete doc;
+}
+
+void TestPageLayout::checkSingle()
+{
+    Poppler::Document *doc;
+    doc = Poppler::Document::load(TESTDATADIR "/unittestcases/FullScreen.pdf");
+    QVERIFY( doc );
+  
+    QCOMPARE( doc->pageLayout(), Poppler::Document::SinglePage );
+
+    delete doc;
+}
+
+void TestPageLayout::checkFacing()
+{
+    Poppler::Document *doc;
+    doc = Poppler::Document::load(TESTDATADIR "/unittestcases/doublepage.pdf");
+    QVERIFY( doc );
+
+    QCOMPARE( doc->pageLayout(), Poppler::Document::TwoPageRight );
+
+    delete doc;
+}
+
+QTEST_MAIN(TestPageLayout)
+#include "check_pagelayout.moc"
+
diff --git a/qt4/tests/check_pagemode.cpp b/qt4/tests/check_pagemode.cpp
new file mode 100644 (file)
index 0000000..0565fe2
--- /dev/null
@@ -0,0 +1,73 @@
+#include <QtTest/QtTest>
+
+#include <poppler-qt4.h>
+
+class TestPageMode: public QObject
+{
+    Q_OBJECT
+private slots:
+    void checkNone();
+    void checkFullScreen();
+    void checkAttachments();
+    void checkThumbs();
+    void checkOC();
+};
+
+void TestPageMode::checkNone()
+{
+    Poppler::Document *doc;
+    doc = Poppler::Document::load(TESTDATADIR "/unittestcases/UseNone.pdf");
+    QVERIFY( doc );
+  
+    QCOMPARE( doc->pageMode(), Poppler::Document::UseNone );
+
+    delete doc;
+}
+
+void TestPageMode::checkFullScreen()
+{
+    Poppler::Document *doc;
+    doc = Poppler::Document::load(TESTDATADIR "/unittestcases/FullScreen.pdf");
+    QVERIFY( doc );
+
+    QCOMPARE( doc->pageMode(), Poppler::Document::FullScreen );
+
+    delete doc;
+}
+
+void TestPageMode::checkAttachments()
+{
+    Poppler::Document *doc;
+    doc = Poppler::Document::load(TESTDATADIR "/unittestcases/UseAttachments.pdf");
+    QVERIFY( doc );
+  
+    QCOMPARE( doc->pageMode(), Poppler::Document::UseAttach );
+
+    delete doc;
+}
+
+void TestPageMode::checkThumbs()
+{
+    Poppler::Document *doc;
+    doc = Poppler::Document::load(TESTDATADIR "/unittestcases/UseThumbs.pdf");
+    QVERIFY( doc );
+
+    QCOMPARE( doc->pageMode(), Poppler::Document::UseThumbs );
+
+    delete doc;
+}
+
+void TestPageMode::checkOC()
+{
+    Poppler::Document *doc;
+    doc = Poppler::Document::load(TESTDATADIR "/unittestcases/UseOC.pdf");
+    QVERIFY( doc );
+
+    QCOMPARE( doc->pageMode(), Poppler::Document::UseOC );
+
+    delete doc;
+}
+
+QTEST_MAIN(TestPageMode)
+#include "check_pagemode.moc"
+
diff --git a/qt4/tests/check_password.cpp b/qt4/tests/check_password.cpp
new file mode 100644 (file)
index 0000000..4c7dcd1
--- /dev/null
@@ -0,0 +1,88 @@
+#include <QtTest/QtTest>
+
+#include <poppler-qt4.h>
+
+class TestPassword: public QObject
+{
+    Q_OBJECT
+private slots:
+    void password1();
+    void password1a();
+    void password2();
+    void password2a();
+    void password2b();
+    void password3();
+};
+
+
+// BUG:4557
+void TestPassword::password1()
+{
+    Poppler::Document *doc;
+    doc = Poppler::Document::load(QString::fromUtf8(TESTDATADIR "/unittestcases/Gday garçon - open.pdf"), "", QString::fromUtf8("garçon").toLatin1() );
+    QVERIFY( doc );
+    QVERIFY( !doc->isLocked() );
+
+    delete doc;
+}
+
+
+void TestPassword::password1a()
+{
+    Poppler::Document *doc;
+    doc = Poppler::Document::load(QString::fromUtf8(TESTDATADIR "/unittestcases/Gday garçon - open.pdf") );
+    QVERIFY( doc );
+    QVERIFY( doc->isLocked() );
+    QVERIFY( !doc->unlock( "", QString::fromUtf8("garçon").toLatin1() ) );
+    QVERIFY( !doc->isLocked() );
+
+    delete doc;
+}
+
+void TestPassword::password2()
+{
+    Poppler::Document *doc;
+    doc = Poppler::Document::load(QString::fromUtf8(TESTDATADIR "/unittestcases/Gday garçon - owner.pdf"), QString::fromUtf8("garçon").toLatin1(), "" );
+    QVERIFY( doc );
+    QVERIFY( !doc->isLocked() );
+
+    delete doc;
+}
+
+void TestPassword::password2a()
+{
+    Poppler::Document *doc;
+    doc = Poppler::Document::load(QString::fromUtf8(TESTDATADIR "/unittestcases/Gday garçon - owner.pdf"), QString::fromUtf8("garçon").toLatin1() );
+    QVERIFY( doc );
+    QVERIFY( !doc->isLocked() );
+
+    delete doc;
+}
+
+void TestPassword::password2b()
+{
+    Poppler::Document *doc;
+    doc = Poppler::Document::load(QString::fromUtf8(TESTDATADIR "/unittestcases/Gday garçon - owner.pdf") );
+    QVERIFY( doc );
+    QVERIFY( !doc->isLocked() );
+    QVERIFY( !doc->unlock( QString::fromUtf8("garçon").toLatin1(), "" ) );
+    QVERIFY( !doc->isLocked() );
+
+    delete doc;
+}
+
+void TestPassword::password3()
+{
+    Poppler::Document *doc;
+    doc = Poppler::Document::load( QString::fromUtf8(TESTDATADIR "/unittestcases/PasswordEncrypted.pdf") );
+    QVERIFY( doc );
+    QVERIFY( doc->isLocked() );
+    QVERIFY( !doc->unlock( "", "password" ) );
+    QVERIFY( !doc->isLocked() );
+
+    delete doc;
+}
+
+QTEST_MAIN(TestPassword)
+#include "check_password.moc"
+
diff --git a/qt4/tests/check_permissions.cpp b/qt4/tests/check_permissions.cpp
new file mode 100644 (file)
index 0000000..a3f3bdc
--- /dev/null
@@ -0,0 +1,44 @@
+#include <QtTest/QtTest>
+
+#include <poppler-qt4.h>
+
+class TestPermissions: public QObject
+{
+    Q_OBJECT
+private slots:
+    void permissions1();
+};
+
+void TestPermissions::permissions1()
+{
+    Poppler::Document *doc;
+    doc = Poppler::Document::load(TESTDATADIR "/unittestcases/orientation.pdf");
+    QVERIFY( doc );
+  
+    // we are allowed to print
+    QVERIFY( doc->okToPrint() );
+
+    // we are not allowed to change
+    QVERIFY( !(doc->okToChange()) );
+
+    // we are not allowed to copy or extract content
+    QVERIFY( !(doc->okToCopy()) );
+
+    // we are not allowed to print at high resolution
+    QVERIFY( !(doc->okToPrintHighRes()) );
+
+    // we are not allowed to fill forms
+    QVERIFY( !(doc->okToFillForm()) );
+
+    // we are allowed to extract content for accessibility
+    QVERIFY( doc->okToExtractForAccessibility() );
+
+    // we are allowed to assemble this document
+    QVERIFY( doc->okToAssemble() );
+
+    delete doc;
+}
+
+QTEST_MAIN(TestPermissions)
+#include "check_permissions.moc"
+
diff --git a/qt4/tests/check_search.cpp b/qt4/tests/check_search.cpp
new file mode 100644 (file)
index 0000000..cabf82d
--- /dev/null
@@ -0,0 +1,91 @@
+#include <QtTest/QtTest>
+
+#include <poppler-qt4.h>
+
+class TestSearch: public QObject
+{
+    Q_OBJECT
+private slots:
+    void bug7063();
+    void testNextAndPrevious();
+};
+
+void TestSearch::bug7063()
+{
+    Poppler::Document *doc;
+    doc = Poppler::Document::load(TESTDATADIR "/unittestcases/bug7063.pdf");
+    QVERIFY( doc );
+   
+    Poppler::Page *page = doc->page(0);
+    QRectF pageRegion( QPointF(0,0), page->pageSize() );
+
+    QCOMPARE( page->search(QString("non-ascii:"), pageRegion, Poppler::Page::FromTop, Poppler::Page::CaseSensitive), true );
+
+    QCOMPARE( page->search(QString("Ascii"), pageRegion, Poppler::Page::FromTop, Poppler::Page::CaseSensitive), false );
+    QCOMPARE( page->search(QString("Ascii"), pageRegion, Poppler::Page::FromTop, Poppler::Page::CaseInsensitive), true );
+
+    QCOMPARE( page->search(QString("latin1:"), pageRegion, Poppler::Page::FromTop, Poppler::Page::CaseSensitive), false );
+
+    QCOMPARE( page->search(QString::fromUtf8("é"), pageRegion, Poppler::Page::FromTop, Poppler::Page::CaseSensitive), true );
+    QCOMPARE( page->search(QString::fromUtf8("à"), pageRegion, Poppler::Page::FromTop, Poppler::Page::CaseSensitive), true );
+    QCOMPARE( page->search(QString::fromUtf8("ç"), pageRegion, Poppler::Page::FromTop, Poppler::Page::CaseSensitive), true );
+    QCOMPARE( page->search(QString::fromUtf8("search \"é\", \"à\" or \"ç\""), pageRegion, Poppler::Page::FromTop, Poppler::Page::CaseSensitive), true );
+    QCOMPARE( page->search(QString::fromUtf8("¥µ©"), pageRegion, Poppler::Page::FromTop, Poppler::Page::CaseSensitive), true );
+    QCOMPARE( page->search(QString::fromUtf8("¥©"), pageRegion, Poppler::Page::FromTop, Poppler::Page::CaseSensitive), false );
+  
+    delete doc;
+}
+
+void TestSearch::testNextAndPrevious()
+{
+    Poppler::Document *doc;
+    doc = Poppler::Document::load(TESTDATADIR "/unittestcases/xr01.pdf");
+    QVERIFY( doc );
+  
+    Poppler::Page *page = doc->page(0);
+    QRectF region( QPointF(0,0), page->pageSize() );
+    
+    QCOMPARE( page->search(QString("is"), region, Poppler::Page::FromTop, Poppler::Page::CaseSensitive), true );
+    QVERIFY( qAbs(region.x() - 161.44) < 0.01 );
+    QVERIFY( qAbs(region.y() - 127.85) < 0.01 );
+    QVERIFY( qAbs(region.width() - 6.70) < 0.01 );
+    QVERIFY( qAbs(region.height() - 8.85) < 0.01 );
+    QCOMPARE( page->search(QString("is"), region, Poppler::Page::NextResult, Poppler::Page::CaseSensitive), true );
+    QVERIFY( qAbs(region.x() - 171.46) < 0.01 );
+    QVERIFY( qAbs(region.y() - 127.85) < 0.01 );
+    QVERIFY( qAbs(region.width() - 6.70) < 0.01 );
+    QVERIFY( qAbs(region.height() - 8.85) < 0.01 );
+    QCOMPARE( page->search(QString("is"), region, Poppler::Page::NextResult, Poppler::Page::CaseSensitive), true );
+    QVERIFY( qAbs(region.x() - 161.44) < 0.01 );
+    QVERIFY( qAbs(region.y() - 139.81) < 0.01 );
+    QVERIFY( qAbs(region.width() - 6.70) < 0.01 );
+    QVERIFY( qAbs(region.height() - 8.85) < 0.01 );
+    QCOMPARE( page->search(QString("is"), region, Poppler::Page::NextResult, Poppler::Page::CaseSensitive), true );
+    QVERIFY( qAbs(region.x() - 171.46) < 0.01 );
+    QVERIFY( qAbs(region.y() - 139.81) < 0.01 );
+    QVERIFY( qAbs(region.width() - 6.70) < 0.01 );
+    QVERIFY( qAbs(region.height() - 8.85) < 0.01 );
+    QCOMPARE( page->search(QString("is"), region, Poppler::Page::NextResult, Poppler::Page::CaseSensitive), false );
+    QCOMPARE( page->search(QString("is"), region, Poppler::Page::PreviousResult, Poppler::Page::CaseSensitive), true );
+    QVERIFY( qAbs(region.x() - 161.44) < 0.01 );
+    QVERIFY( qAbs(region.y() - 139.81) < 0.01 );
+    QVERIFY( qAbs(region.width() - 6.70) < 0.01 );
+    QVERIFY( qAbs(region.height() - 8.85) < 0.01 );
+    QCOMPARE( page->search(QString("is"), region, Poppler::Page::PreviousResult, Poppler::Page::CaseSensitive), true );
+    QVERIFY( qAbs(region.x() - 171.46) < 0.01 );
+    QVERIFY( qAbs(region.y() - 127.85) < 0.01 );
+    QVERIFY( qAbs(region.width() - 6.70) < 0.01 );
+    QVERIFY( qAbs(region.height() - 8.85) < 0.01 );
+    QCOMPARE( page->search(QString("is"), region, Poppler::Page::PreviousResult, Poppler::Page::CaseSensitive), true );
+    QVERIFY( qAbs(region.x() - 161.44) < 0.01 );
+    QVERIFY( qAbs(region.y() - 127.85) < 0.01 );
+    QVERIFY( qAbs(region.width() - 6.70) < 0.01 );
+    QVERIFY( qAbs(region.height() - 8.85) < 0.01 );
+    QCOMPARE( page->search(QString("is"), region, Poppler::Page::PreviousResult, Poppler::Page::CaseSensitive), false );
+    
+    delete doc;
+}
+
+QTEST_MAIN(TestSearch)
+#include "check_search.moc"
+
diff --git a/qt4/tests/check_strings.cpp b/qt4/tests/check_strings.cpp
new file mode 100644 (file)
index 0000000..700ae9c
--- /dev/null
@@ -0,0 +1,250 @@
+/*
+ * Copyright (C) 2010, 2011, Pino Toscano <pino@kde.org>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include <QtTest/QtTest>
+
+#include <poppler-qt4.h>
+#include <poppler-private.h>
+
+#include <GlobalParams.h>
+
+Q_DECLARE_METATYPE(GooString*)
+Q_DECLARE_METATYPE(Unicode*)
+
+class TestStrings : public QObject
+{
+    Q_OBJECT
+
+private slots:
+    void initTestCase();
+    void cleanupTestCase();
+    void check_unicodeToQString_data();
+    void check_unicodeToQString();
+    void check_UnicodeParsedString_data();
+    void check_UnicodeParsedString();
+    void check_QStringToUnicodeGooString_data();
+    void check_QStringToUnicodeGooString();
+    void check_QStringToGooString_data();
+    void check_QStringToGooString();
+
+private:
+    GooString* newGooString(const char *s);
+    GooString* newGooString(const char *s, int l);
+
+    QVector<GooString *> m_gooStrings;
+};
+
+void TestStrings::initTestCase()
+{
+    qRegisterMetaType<GooString*>("GooString*");
+    qRegisterMetaType<Unicode*>("Unicode*");
+
+    globalParams = new GlobalParams();
+}
+
+void TestStrings::cleanupTestCase()
+{
+    qDeleteAll(m_gooStrings);
+
+    delete globalParams;
+}
+
+void TestStrings::check_unicodeToQString_data()
+{
+    QTest::addColumn<Unicode*>("data");
+    QTest::addColumn<int>("length");
+    QTest::addColumn<QString>("result");
+
+    {
+    const int l = 1;
+    Unicode *u = new Unicode[l];
+    u[0] = int('a');
+    QTest::newRow("a") << u << l << QString::fromUtf8("a");
+    }
+    {
+    const int l = 1;
+    Unicode *u = new Unicode[l];
+    u[0] = 0x0161;
+    QTest::newRow("\u0161") << u << l << QString::fromUtf8("\u0161");
+    }
+    {
+    const int l = 2;
+    Unicode *u = new Unicode[l];
+    u[0] = int('a');
+    u[1] = int('b');
+    QTest::newRow("ab") << u << l << QString::fromUtf8("ab");
+    }
+    {
+    const int l = 2;
+    Unicode *u = new Unicode[l];
+    u[0] = int('a');
+    u[1] = 0x0161;
+    QTest::newRow("a\u0161") << u << l << QString::fromUtf8("a\u0161");
+    }
+    {
+    const int l = 2;
+    Unicode *u = new Unicode[l];
+    u[0] = 0x5c01;
+    u[1] = 0x9762;
+    QTest::newRow("\xe5\xb0\x81\xe9\x9d\xa2") << u << l << QString::fromUtf8("\xe5\xb0\x81\xe9\x9d\xa2");
+    }
+    {
+    const int l = 3;
+    Unicode *u = new Unicode[l];
+    u[0] = 0x5c01;
+    u[1] = 0x9762;
+    u[2] = 0x0;
+    QTest::newRow("\xe5\xb0\x81\xe9\x9d\xa2 + 0") << u << l << QString::fromUtf8("\xe5\xb0\x81\xe9\x9d\xa2");
+    }
+}
+
+void TestStrings::check_unicodeToQString()
+{
+    QFETCH(Unicode*, data);
+    QFETCH(int, length);
+    QFETCH(QString, result);
+
+    QCOMPARE(Poppler::unicodeToQString(data, length), result);
+
+    delete [] data;
+}
+
+void TestStrings::check_UnicodeParsedString_data()
+{
+    QTest::addColumn<GooString*>("string");
+    QTest::addColumn<QString>("result");
+
+    // non-unicode strings
+    QTest::newRow("<empty>") << newGooString("")
+                             << QString();
+    QTest::newRow("a") << newGooString("a")
+                       << QString::fromUtf8("a");
+    QTest::newRow("ab") << newGooString("ab")
+                        << QString::fromUtf8("ab");
+    QTest::newRow("~") << newGooString("~")
+                       << QString::fromUtf8("~");
+    QTest::newRow("test string") << newGooString("test string")
+                                 << QString::fromUtf8("test string");
+
+    // unicode strings
+    QTest::newRow("<unicode marks>") << newGooString("\xFE\xFF")
+                                     << QString();
+    QTest::newRow("U a") << newGooString("\xFE\xFF\0a", 4)
+                         << QString::fromUtf8("a");
+    QTest::newRow("U ~") << newGooString("\xFE\xFF\0~", 4)
+                         << QString::fromUtf8("~");
+    QTest::newRow("U aa") << newGooString("\xFE\xFF\0a\0a", 6)
+                           << QString::fromUtf8("aa");
+    QTest::newRow("U \xC3\x9F") << newGooString("\xFE\xFF\0\xDF", 4)
+                                << QString::fromUtf8("\xC3\x9F");
+    QTest::newRow("U \xC3\x9F\x61") << newGooString("\xFE\xFF\0\xDF\0\x61", 6)
+                                    << QString::fromUtf8("\xC3\x9F\x61");
+    QTest::newRow("U \xC5\xA1") << newGooString("\xFE\xFF\x01\x61", 4)
+                                << QString::fromUtf8("\xC5\xA1");
+    QTest::newRow("U \xC5\xA1\x61") << newGooString("\xFE\xFF\x01\x61\0\x61", 6)
+                                << QString::fromUtf8("\xC5\xA1\x61");
+    QTest::newRow("test string") << newGooString("\xFE\xFF\0t\0e\0s\0t\0 \0s\0t\0r\0i\0n\0g", 24)
+                                 << QString::fromUtf8("test string");
+}
+
+void TestStrings::check_UnicodeParsedString()
+{
+    QFETCH(GooString*, string);
+    QFETCH(QString, result);
+
+    QCOMPARE(Poppler::UnicodeParsedString(string), result);
+}
+
+void TestStrings::check_QStringToUnicodeGooString_data()
+{
+    QTest::addColumn<QString>("string");
+    QTest::addColumn<QByteArray>("result");
+
+
+    QTest::newRow("<null>") << QString()
+                            << QByteArray("");
+    QTest::newRow("<empty>") << QString::fromUtf8("")
+                             << QByteArray("");
+    QTest::newRow("a") << QString::fromUtf8("a")
+                       << QByteArray("\0a", 2);
+    QTest::newRow("ab") << QString::fromUtf8("ab")
+                        << QByteArray("\0a\0b", 4);
+    QTest::newRow("test string") << QString::fromUtf8("test string")
+                                 << QByteArray("\0t\0e\0s\0t\0 \0s\0t\0r\0i\0n\0g", 22);
+    QTest::newRow("\xC3\x9F") << QString::fromUtf8("\xC3\x9F")
+                              << QByteArray("\0\xDF", 2);
+    QTest::newRow("\xC3\x9F\x61") << QString::fromUtf8("\xC3\x9F\x61")
+                                  << QByteArray("\0\xDF\0\x61", 4);
+}
+
+void TestStrings::check_QStringToUnicodeGooString()
+{
+    QFETCH(QString, string);
+    QFETCH(QByteArray, result);
+
+    GooString *goo = Poppler::QStringToUnicodeGooString(string);
+    QVERIFY(goo->hasUnicodeMarker());
+    QCOMPARE(goo->getLength(), string.length() * 2 + 2);
+    QCOMPARE(result, QByteArray::fromRawData(goo->getCString() + 2, goo->getLength() - 2));
+
+    delete goo;
+}
+
+void TestStrings::check_QStringToGooString_data()
+{
+    QTest::addColumn<QString>("string");
+    QTest::addColumn<GooString*>("result");
+
+    QTest::newRow("<null>") << QString()
+                            << newGooString("");
+    QTest::newRow("<empty>") << QString::fromUtf8("")
+                             << newGooString("");
+    QTest::newRow("a") << QString::fromUtf8("a")
+                       << newGooString("a");
+    QTest::newRow("ab") << QString::fromUtf8("ab")
+                        << newGooString("ab");
+}
+
+void TestStrings::check_QStringToGooString()
+{
+    QFETCH(QString, string);
+    QFETCH(GooString*, result);
+
+    GooString *goo = Poppler::QStringToGooString(string);
+    QCOMPARE(goo->getCString(), result->getCString());
+
+    delete goo;
+}
+
+GooString* TestStrings::newGooString(const char *s)
+{
+    GooString *goo = new GooString(s);
+    m_gooStrings.append(goo);
+    return goo;
+}
+
+GooString* TestStrings::newGooString(const char *s, int l)
+{
+    GooString *goo = new GooString(s, l);
+    m_gooStrings.append(goo);
+    return goo;
+}
+
+QTEST_MAIN(TestStrings)
+
+#include "check_strings.moc"
diff --git a/qt4/tests/poppler-attachments.cpp b/qt4/tests/poppler-attachments.cpp
new file mode 100644 (file)
index 0000000..992dc56
--- /dev/null
@@ -0,0 +1,39 @@
+#include <QtCore/QCoreApplication>
+#include <QtCore/QDebug>
+
+#include <iostream>
+
+#include <poppler-qt4.h>
+
+int main( int argc, char **argv )
+{
+    QCoreApplication a( argc, argv );               // QApplication required!
+
+    if (!( argc == 2 ))
+    {
+       qWarning() << "usage: poppler-attachments filename";
+       exit(1);
+    }
+  
+    Poppler::Document *doc = Poppler::Document::load(argv[1]);
+    if (!doc)
+    {
+       qWarning() << "doc not loaded";
+       exit(1);
+    }
+
+    if (doc->hasEmbeddedFiles()) {
+       std::cout << "Embedded files: " << std::endl;
+       foreach(Poppler::EmbeddedFile *file, doc->embeddedFiles()) {
+           std::cout << "    " << qPrintable(file->name()) << std::endl;
+           std::cout << "    desc:" << qPrintable(file->description()) << std::endl;
+           QByteArray data = file->data();
+           std::cout << "       data: " << data.constData() << std::endl;
+       }
+       
+    } else {
+       std::cout << "There are no embedded document at the top level" << std::endl;
+    }
+    delete doc;
+  
+}
diff --git a/qt4/tests/poppler-fonts.cpp b/qt4/tests/poppler-fonts.cpp
new file mode 100644 (file)
index 0000000..6b66ec4
--- /dev/null
@@ -0,0 +1,89 @@
+#include <QtCore/QCoreApplication>
+#include <QtCore/QDebug>
+
+#include <iostream>
+
+#include <poppler-qt4.h>
+
+int main( int argc, char **argv )
+{
+    QCoreApplication a( argc, argv );               // QApplication required!
+
+    if (!( argc == 2 ))
+    {
+       qWarning() << "usage: poppler-fonts filename";
+       exit(1);
+    }
+  
+    Poppler::Document *doc = Poppler::Document::load(argv[1]);
+    if (!doc)
+    {
+       qWarning() << "doc not loaded";
+       exit(1);
+    }
+
+    std::cout << "name                                 type         emb sub font file";
+    std::cout << std::endl;
+    std::cout << "------------------------------------ ------------ --- --- ---------";
+    std::cout << std::endl;
+  
+    foreach( const Poppler::FontInfo &font, doc->fonts() ) {
+       if (font.name().isNull()) {
+           std::cout << qPrintable( QString("%1").arg(QString("[none]"), -37) );
+       } else {
+           std::cout << qPrintable( QString("%1").arg(font.name(), -37) );
+       }
+       switch( font.type() ) {
+       case Poppler::FontInfo::unknown:
+           std::cout << "unknown           ";
+           break;
+       case Poppler::FontInfo::Type1:
+           std::cout << "Type 1            ";
+           break;
+       case Poppler::FontInfo::Type1C:
+           std::cout << "Type 1C           ";
+           break;
+       case Poppler::FontInfo::Type3:
+           std::cout << "Type 3            ";
+           break;
+       case Poppler::FontInfo::TrueType:
+           std::cout << "TrueType          ";
+           break;
+       case Poppler::FontInfo::CIDType0:
+           std::cout << "CID Type 0        ";
+           break;
+       case Poppler::FontInfo::CIDType0C:
+           std::cout << "CID Type 0C       ";
+           break;
+       case Poppler::FontInfo::CIDTrueType:
+           std::cout << "CID TrueType      ";
+           break;
+       case Poppler::FontInfo::Type1COT:
+           std::cout << "Type 1C (OT)      ";
+           break;
+       case Poppler::FontInfo::TrueTypeOT:
+           std::cout << "TrueType (OT)     ";
+           break;
+       case Poppler::FontInfo::CIDType0COT:
+           std::cout << "CID Type 0C (OT)  ";
+           break;
+       case Poppler::FontInfo::CIDTrueTypeOT:
+           std::cout << "CID TrueType (OT) ";
+           break;
+       }
+
+       if ( font.isEmbedded() ) {
+           std::cout << "yes ";
+       } else {
+           std::cout << "no  ";
+       }
+       if ( font.isSubset() ) {
+           std::cout << "yes ";
+       } else {
+           std::cout << "no  ";
+       }
+       std::cout << qPrintable( QString("%1").arg(font.file()) );
+       std::cout << std::endl;
+    }
+    delete doc;
+}
diff --git a/qt4/tests/poppler-texts.cpp b/qt4/tests/poppler-texts.cpp
new file mode 100644 (file)
index 0000000..ec28353
--- /dev/null
@@ -0,0 +1,40 @@
+#include <QtCore/QCoreApplication>
+#include <QtCore/QDebug>
+
+#include <iostream>
+
+#include <poppler-qt4.h>
+
+int main( int argc, char **argv )
+{
+    QCoreApplication a( argc, argv );               // QApplication required!
+
+    if (!( argc == 2 ))
+    {
+       qWarning() << "usage: poppler-texts filename";
+       exit(1);
+    }
+  
+    Poppler::Document *doc = Poppler::Document::load(argv[1]);
+    if (!doc)
+    {
+       qWarning() << "doc not loaded";
+       exit(1);
+    }
+
+    for ( int i = 0; i < doc->numPages(); i++ )
+    {
+      int j = 0;
+      std::cout << "*** Page " << i << std::endl;
+      std::cout << std::flush;
+
+      Poppler::Page *page = doc->page(i);
+      const QByteArray utf8str = page->text( QRectF(), Poppler::Page::RawOrderLayout ).toUtf8();
+      std::cout << std::flush;
+      for ( j = 0; j < utf8str.size(); j++ )
+        std::cout << utf8str[j];
+      std::cout << std::endl;
+      delete page;
+    }
+    delete doc;
+}
diff --git a/qt4/tests/stress-poppler-dir.cpp b/qt4/tests/stress-poppler-dir.cpp
new file mode 100644 (file)
index 0000000..6eeab6f
--- /dev/null
@@ -0,0 +1,67 @@
+#include <QtCore/QDebug>
+#include <QtCore/QDir>
+#include <QtCore/QTime>
+#include <QtGui/QApplication>
+#include <QtGui/QImage>
+
+#include <iostream>
+
+#include <poppler-qt4.h>
+
+int main( int argc, char **argv )
+{
+    QApplication a( argc, argv );               // QApplication required!
+
+    QTime t;
+    t.start();
+
+    QDir directory( argv[1] );
+    foreach ( const QString &fileName, directory.entryList() ) {
+        if (fileName.endsWith("pdf") ) {
+           qDebug() << "Doing" << fileName.toLatin1().data() << ":";
+           Poppler::Document *doc = Poppler::Document::load( directory.canonicalPath()+"/"+fileName );
+           if (!doc) {
+               qWarning() << "doc not loaded";
+           } else if ( doc->isLocked() ) {
+               if (! doc->unlock( "", "password" ) ) {
+                   qWarning() << "couldn't unlock document";
+                   delete doc;
+               }
+           } else {
+               int major = 0, minor = 0;
+               doc->getPdfVersion( &major, &minor );
+               doc->info("Title");
+               doc->info("Subject");
+               doc->info("Author");
+               doc->info("Keywords");
+               doc->info("Creator");
+               doc->info("Producer");
+               doc->date("CreationDate").toString();
+               doc->date("ModDate").toString();
+               doc->numPages();
+               doc->isLinearized();
+               doc->isEncrypted();
+               doc->okToPrint();
+               doc->okToCopy();
+               doc->okToChange();
+               doc->okToAddNotes();
+               doc->pageMode();
+
+               for( int index = 0; index < doc->numPages(); ++index ) {
+                   Poppler::Page *page = doc->page( index );
+                   QImage image = page->renderToImage();
+                   page->pageSize();
+                   page->orientation();
+                   delete page;
+                   std::cout << ".";
+                   std::cout.flush();
+               }
+               std::cout << std::endl;
+               delete doc;
+           }
+       }
+    }
+
+    std::cout << "Elapsed time: " << (t.elapsed()/1000) << "seconds" << std::endl;
+
+}
diff --git a/qt4/tests/stress-poppler-qt4.cpp b/qt4/tests/stress-poppler-qt4.cpp
new file mode 100644 (file)
index 0000000..5684454
--- /dev/null
@@ -0,0 +1,74 @@
+#include <QtCore/QDebug>
+#include <QtCore/QDir>
+#include <QtCore/QTime>
+#include <QtGui/QApplication>
+#include <QtGui/QImage>
+
+#include <iostream>
+
+#include <poppler-qt4.h>
+
+int main( int argc, char **argv )
+{
+    QApplication a( argc, argv );               // QApplication required!
+
+    Q_UNUSED( argc );
+    Q_UNUSED( argv );
+
+    QTime t;
+    t.start();
+    QDir dbDir( QString( "./pdfdb" ) );
+    if ( !dbDir.exists() ) {
+       qWarning() << "Database directory does not exist";
+    }
+
+    QStringList excludeSubDirs;
+    excludeSubDirs << "000048" << "000607";
+
+    foreach ( const QString &subdir, dbDir.entryList(QStringList() << "0000*", QDir::Dirs) ) {
+       if ( excludeSubDirs.contains(subdir) ) {
+           // then skip it
+       } else {
+           QString path = "./pdfdb/" + subdir + "/data.pdf";
+           std::cout <<"Doing " << path.toLatin1().data() << " :";
+           Poppler::Document *doc = Poppler::Document::load( path );
+           if (!doc) {
+               qWarning() << "doc not loaded";
+           } else {
+               int major = 0, minor = 0;
+               doc->getPdfVersion( &major, &minor );
+               doc->info("Title");
+               doc->info("Subject");
+               doc->info("Author");
+               doc->info("Keywords");
+               doc->info("Creator");
+               doc->info("Producer");
+               doc->date("CreationDate").toString();
+               doc->date("ModDate").toString();
+               doc->numPages();
+               doc->isLinearized();
+               doc->isEncrypted();
+               doc->okToPrint();
+               doc->okToCopy();
+               doc->okToChange();
+               doc->okToAddNotes();
+               doc->pageMode();
+
+               for( int index = 0; index < doc->numPages(); ++index ) {
+                   Poppler::Page *page = doc->page( index );
+                   QImage image = page->renderToImage();
+                   page->pageSize();
+                   page->orientation();
+                   delete page;
+                   std::cout << ".";
+                   std::cout.flush();
+               }
+               std::cout << std::endl;
+               delete doc;
+           }
+       }
+    }
+
+    std::cout << "Elapsed time: " << (t.elapsed()/1000) << std::endl;
+
+}
diff --git a/qt4/tests/test-password-qt4.cpp b/qt4/tests/test-password-qt4.cpp
new file mode 100644 (file)
index 0000000..c961874
--- /dev/null
@@ -0,0 +1,136 @@
+#include <QtCore/QDebug>
+#include <QtGui/QApplication>
+#include <QtGui/QImage>
+#include <QtGui/QPainter>
+#include <QtGui/QPaintEvent>
+#include <QtGui/QWidget>
+
+#include <poppler-qt4.h>
+
+class PDFDisplay : public QWidget           // picture display widget
+{
+public:
+    PDFDisplay( Poppler::Document *d );
+    ~PDFDisplay();
+protected:
+    void paintEvent( QPaintEvent * );
+    void keyPressEvent( QKeyEvent * );
+private:
+    void display();
+    int m_currentPage;
+    QImage image;
+    Poppler::Document *doc;
+};
+
+PDFDisplay::PDFDisplay( Poppler::Document *d )
+{
+    doc = d;
+    m_currentPage = 0;
+    display();
+}
+
+void PDFDisplay::display()
+{
+    if (doc) {
+       Poppler::Page *page = doc->page(m_currentPage);
+       if (page) {
+           qDebug() << "Displaying page: " << m_currentPage;
+           image = page->renderToImage();
+           update();
+           delete page;
+       }
+    } else {
+       qWarning() << "doc not loaded";
+    }
+}
+
+PDFDisplay::~PDFDisplay()
+{
+    delete doc;
+}
+
+void PDFDisplay::paintEvent( QPaintEvent *e )
+{
+    QPainter paint( this );                     // paint widget
+    if (!image.isNull()) {
+       paint.drawImage(0, 0, image);
+    } else {
+       qWarning() << "null image";
+    }
+}
+
+void PDFDisplay::keyPressEvent( QKeyEvent *e )
+{
+  if (e->key() == Qt::Key_Down)
+  {
+    if (m_currentPage + 1 < doc->numPages())
+    {
+      m_currentPage++;
+      display();
+    }
+  }
+  else if (e->key() == Qt::Key_Up)
+  {
+    if (m_currentPage > 0)
+    {
+      m_currentPage--;
+      display();
+    }
+  }
+  else if (e->key() == Qt::Key_Q)
+  {
+      exit(0);
+  }
+}
+
+int main( int argc, char **argv )
+{
+    QApplication a( argc, argv );               // QApplication required!
+
+    if ( argc != 3)
+    {
+       qWarning() << "usage: test-password-qt4 owner-password filename";
+       exit(1);
+    }
+  
+    Poppler::Document *doc = Poppler::Document::load(argv[2], argv[1]);
+    if (!doc)
+    {
+       qWarning() << "doc not loaded";
+       exit(1);
+    }
+  
+    // output some meta-data
+    int major = 0, minor = 0;
+    doc->getPdfVersion( &major, &minor );
+    qDebug() << "    PDF Version: " << qPrintable(QString::fromLatin1("%1.%2").arg(major).arg(minor));
+    qDebug() << "          Title: " << doc->info("Title");
+    qDebug() << "        Subject: " << doc->info("Subject");
+    qDebug() << "         Author: " << doc->info("Author");
+    qDebug() << "      Key words: " << doc->info("Keywords");
+    qDebug() << "        Creator: " << doc->info("Creator");
+    qDebug() << "       Producer: " << doc->info("Producer");
+    qDebug() << "   Date created: " << doc->date("CreationDate").toString();
+    qDebug() << "  Date modified: " << doc->date("ModDate").toString();
+    qDebug() << "Number of pages: " << doc->numPages();
+    qDebug() << "     Linearised: " << doc->isLinearized();
+    qDebug() << "      Encrypted: " << doc->isEncrypted();
+    qDebug() << "    OK to print: " << doc->okToPrint();
+    qDebug() << "     OK to copy: " << doc->okToCopy();
+    qDebug() << "   OK to change: " << doc->okToChange();
+    qDebug() << "OK to add notes: " << doc->okToAddNotes();
+    qDebug() << "      Page mode: " << doc->pageMode();
+    QStringList fontNameList;
+    foreach( const Poppler::FontInfo &font, doc->fonts() )
+       fontNameList += font.name();
+    qDebug() << "          Fonts: " << fontNameList.join( ", " );
+
+    Poppler::Page *page = doc->page(0);
+    qDebug() << "    Page 1 size: " << page->pageSize().width()/72 << "inches x " << page->pageSize().height()/72 << "inches";
+
+    PDFDisplay test( doc );        // create picture display
+    test.setWindowTitle("Poppler-Qt4 Test");
+    test.show();                            // show it
+
+    return a.exec();                        // start event loop
+}
diff --git a/qt4/tests/test-poppler-qt4.cpp b/qt4/tests/test-poppler-qt4.cpp
new file mode 100644 (file)
index 0000000..503b35a
--- /dev/null
@@ -0,0 +1,239 @@
+#include <QtCore/QDebug>
+#include <QtCore/QFile>
+#include <QtGui/QApplication>
+#include <QtGui/QImage>
+#include <QtGui/QLabel>
+#include <QtGui/QMouseEvent>
+#include <QtGui/QPainter>
+#include <QtGui/QPaintEvent>
+#include <QtGui/QToolTip>
+#include <QtGui/QWidget>
+
+#include <poppler-qt4.h>
+
+class PDFDisplay : public QWidget           // picture display widget
+{
+public:
+    PDFDisplay( Poppler::Document *d, bool arthur );
+    ~PDFDisplay();
+    void setShowTextRects(bool show);
+    void display();
+protected:
+    void paintEvent( QPaintEvent * );
+    void keyPressEvent( QKeyEvent * );
+    void mousePressEvent( QMouseEvent * );
+private:
+    int m_currentPage;
+    QImage image;
+    Poppler::Document *doc;
+    QString backendString;
+    bool showTextRects;
+    QList<Poppler::TextBox*> textRects;
+};
+
+PDFDisplay::PDFDisplay( Poppler::Document *d, bool arthur )
+{
+    showTextRects = false;
+    doc = d;
+    m_currentPage = 0;
+    if (arthur)
+    {
+        backendString = "Arthur";
+        doc->setRenderBackend(Poppler::Document::ArthurBackend);
+    }
+    else
+    {
+        backendString = "Splash";
+        doc->setRenderBackend(Poppler::Document::SplashBackend);
+    }
+    doc->setRenderHint(Poppler::Document::Antialiasing, true);
+    doc->setRenderHint(Poppler::Document::TextAntialiasing, true);
+}
+
+void PDFDisplay::setShowTextRects(bool show)
+{
+    showTextRects = show;
+}
+
+void PDFDisplay::display()
+{
+    if (doc) {
+        Poppler::Page *page = doc->page(m_currentPage);
+        if (page) {
+            qDebug() << "Displaying page using" << backendString << "backend: " << m_currentPage;
+            QTime t = QTime::currentTime();
+            image = page->renderToImage();
+            qDebug() << "Rendering took" << t.msecsTo(QTime::currentTime()) << "msecs";
+            qDeleteAll(textRects);
+            if (showTextRects)
+            {
+                QPainter painter(&image);
+                painter.setPen(Qt::red);
+                textRects = page->textList();
+                foreach(Poppler::TextBox *tb, textRects)
+                {
+                    painter.drawRect(tb->boundingBox());
+                }
+            }
+            else textRects.clear();
+            update();
+            delete page;
+        }
+    } else {
+        qWarning() << "doc not loaded";
+    }
+}
+
+PDFDisplay::~PDFDisplay()
+{
+    qDeleteAll(textRects);
+    delete doc;
+}
+
+void PDFDisplay::paintEvent( QPaintEvent *e )
+{
+    QPainter paint( this );                     // paint widget
+    if (!image.isNull()) {
+       paint.drawImage(0, 0, image);
+    } else {
+       qWarning() << "null image";
+    }
+}
+
+void PDFDisplay::keyPressEvent( QKeyEvent *e )
+{
+  if (e->key() == Qt::Key_Down)
+  {
+    if (m_currentPage + 1 < doc->numPages())
+    {
+      m_currentPage++;
+      display();
+    }
+  }
+  else if (e->key() == Qt::Key_Up)
+  {
+    if (m_currentPage > 0)
+    {
+      m_currentPage--;
+      display();
+    }
+  }
+  else if (e->key() == Qt::Key_Q)
+  {
+      exit(0);
+  }
+}
+
+void PDFDisplay::mousePressEvent( QMouseEvent *e )
+{
+  int i = 0;
+  foreach(Poppler::TextBox *tb, textRects)
+  {
+    if (tb->boundingBox().contains(e->pos()))
+    {
+      QString tt = QString("Text: \"%1\"\nIndex in text list: %2").arg(tb->text()).arg(i);
+      QToolTip::showText(e->globalPos(), tt, this);
+      break;
+    }
+    ++i;
+  }
+}
+
+int main( int argc, char **argv )
+{
+    QApplication a( argc, argv );               // QApplication required!
+
+    if ( argc < 2 ||
+        (argc == 3 && strcmp(argv[2], "-extract") != 0 && strcmp(argv[2], "-arthur") != 0 && strcmp(argv[2], "-textRects") != 0) ||
+        argc > 3)
+    {
+       // use argument as file name
+       qWarning() << "usage: test-poppler-qt filename [-extract|-arthur|-textRects]";
+       exit(1);
+    }
+  
+    Poppler::Document *doc = Poppler::Document::load(QFile::decodeName(argv[1]));
+    if (!doc)
+    {
+       qWarning() << "doc not loaded";
+       exit(1);
+    }
+
+    if (doc->isLocked())
+    {
+       qWarning() << "document locked (needs password)";
+       exit(0);
+    }
+  
+    // output some meta-data
+    int major = 0, minor = 0;
+    doc->getPdfVersion( &major, &minor );
+    qDebug() << "    PDF Version: " << qPrintable(QString::fromLatin1("%1.%2").arg(major).arg(minor));
+    qDebug() << "          Title: " << doc->info("Title");
+    qDebug() << "        Subject: " << doc->info("Subject");
+    qDebug() << "         Author: " << doc->info("Author");
+    qDebug() << "      Key words: " << doc->info("Keywords");
+    qDebug() << "        Creator: " << doc->info("Creator");
+    qDebug() << "       Producer: " << doc->info("Producer");
+    qDebug() << "   Date created: " << doc->date("CreationDate").toString();
+    qDebug() << "  Date modified: " << doc->date("ModDate").toString();
+    qDebug() << "Number of pages: " << doc->numPages();
+    qDebug() << "     Linearised: " << doc->isLinearized();
+    qDebug() << "      Encrypted: " << doc->isEncrypted();
+    qDebug() << "    OK to print: " << doc->okToPrint();
+    qDebug() << "     OK to copy: " << doc->okToCopy();
+    qDebug() << "   OK to change: " << doc->okToChange();
+    qDebug() << "OK to add notes: " << doc->okToAddNotes();
+    qDebug() << "      Page mode: " << doc->pageMode();
+    qDebug() << "       Metadata: " << doc->metadata();
+    QStringList fontNameList;
+    foreach( const Poppler::FontInfo &font, doc->fonts() )
+       fontNameList += font.name();
+    qDebug() << "          Fonts: " << fontNameList.join( ", " );
+
+    if ( doc->hasEmbeddedFiles() ) {
+        qDebug() << "Embedded files:";
+        foreach( Poppler::EmbeddedFile *file, doc->embeddedFiles() ) {
+           qDebug() << "   " << file->name();
+       }
+       qDebug();
+    } else {
+        qDebug() << "No embedded files";
+    }
+
+    if (doc->numPages() <= 0)
+    {
+        delete doc;
+        qDebug() << "Doc has no pages";
+        return 0;
+    }
+
+    Poppler::Page *page = doc->page(0);
+    if (page)
+    {
+        qDebug() << "Page 1 size: " << page->pageSize().width()/72 << "inches x " << page->pageSize().height()/72 << "inches";
+        delete page;
+    }
+
+    if (argc == 2 || (argc == 3 && strcmp(argv[2], "-arthur") == 0) || (argc == 3 && strcmp(argv[2], "-textRects") == 0))
+    {
+        bool useArthur = (argc == 3 && strcmp(argv[2], "-arthur") == 0);
+        PDFDisplay test( doc, useArthur );        // create picture display
+        test.setWindowTitle("Poppler-Qt4 Test");
+        test.setShowTextRects(argc == 3 && strcmp(argv[2], "-textRects") == 0);
+        test.display();
+        test.show();                            // show it
+
+        return a.exec();                        // start event loop
+    }
+    else
+    {
+       Poppler::Page *page = doc->page(0);
+
+       QLabel *l = new QLabel(page->text(QRectF()), 0);
+       l->show();
+       delete page;
+       delete doc;
+       return a.exec();
+    }
+}
diff --git a/splash/Makefile.am b/splash/Makefile.am
new file mode 100644 (file)
index 0000000..4330c53
--- /dev/null
@@ -0,0 +1,73 @@
+INCLUDES =                                     \
+       -I$(top_srcdir)                         \
+       -I$(top_srcdir)/goo                     \
+       $(libjpeg_includes)                     \
+       $(libtiff_includes)                     \
+       $(libpng_includes)                      \
+       $(FREETYPE_CFLAGS)
+
+# SplashBitmap includes JpegWriter.h, TiffWriter.h, PNGWriter.h
+if BUILD_LIBJPEG
+libjpeg_includes = $(LIBJPEG_CFLAGS)
+endif
+
+if BUILD_LIBTIFF
+libtiff_includes = $(LIBTIFF_CFLAGS)
+endif
+
+if BUILD_LIBPNG
+libpng_includes = $(LIBPNG_CFLAGS)
+endif
+
+noinst_LTLIBRARIES = libsplash.la
+
+if ENABLE_XPDF_HEADERS
+
+poppler_splash_includedir = $(includedir)/poppler/splash
+poppler_splash_include_HEADERS =               \
+       Splash.h                                \
+       SplashBitmap.h                          \
+       SplashClip.h                            \
+       SplashErrorCodes.h                      \
+       SplashFTFont.h                          \
+       SplashFTFontEngine.h                    \
+       SplashFTFontFile.h                      \
+       SplashFont.h                            \
+       SplashFontEngine.h                      \
+       SplashFontFile.h                        \
+       SplashFontFileID.h                      \
+       SplashGlyphBitmap.h                     \
+       SplashMath.h                            \
+       SplashPath.h                            \
+       SplashPattern.h                         \
+       SplashScreen.h                          \
+       SplashState.h                           \
+       SplashT1Font.h                          \
+       SplashT1FontEngine.h                    \
+       SplashT1FontFile.h                      \
+       SplashTypes.h                           \
+       SplashXPath.h                           \
+       SplashXPathScanner.h
+
+endif
+
+libsplash_la_SOURCES =                         \
+       Splash.cc                               \
+       SplashBitmap.cc                         \
+       SplashClip.cc                           \
+       SplashFTFont.cc                         \
+       SplashFTFontEngine.cc                   \
+       SplashFTFontFile.cc                     \
+       SplashFont.cc                           \
+       SplashFontEngine.cc                     \
+       SplashFontFile.cc                       \
+       SplashFontFileID.cc                     \
+       SplashPath.cc                           \
+       SplashPattern.cc                        \
+       SplashScreen.cc                         \
+       SplashState.cc                          \
+       SplashT1Font.cc                         \
+       SplashT1FontEngine.cc                   \
+       SplashT1FontFile.cc                     \
+       SplashXPath.cc                          \
+       SplashXPathScanner.cc
diff --git a/splash/Makefile.in b/splash/Makefile.in
new file mode 100644 (file)
index 0000000..cf39bcf
--- /dev/null
@@ -0,0 +1,750 @@
+# Makefile.in generated by automake 1.11.5 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software
+# Foundation, Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+@SET_MAKE@
+
+
+VPATH = @srcdir@
+am__make_dryrun = \
+  { \
+    am__dry=no; \
+    case $$MAKEFLAGS in \
+      *\\[\ \  ]*) \
+        echo 'am--echo: ; @echo "AM"  OK' | $(MAKE) -f - 2>/dev/null \
+          | grep '^AM OK$$' >/dev/null || am__dry=yes;; \
+      *) \
+        for am__flg in $$MAKEFLAGS; do \
+          case $$am__flg in \
+            *=*|--*) ;; \
+            *n*) am__dry=yes; break;; \
+          esac; \
+        done;; \
+    esac; \
+    test $$am__dry = yes; \
+  }
+pkgdatadir = $(datadir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkglibexecdir = $(libexecdir)/@PACKAGE@
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+subdir = splash
+DIST_COMMON = $(am__poppler_splash_include_HEADERS_DIST) \
+       $(srcdir)/Makefile.am $(srcdir)/Makefile.in
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/m4/acx_pthread.m4 \
+       $(top_srcdir)/m4/define-dir.m4 $(top_srcdir)/m4/gtk-doc.m4 \
+       $(top_srcdir)/m4/iconv.m4 $(top_srcdir)/m4/introspection.m4 \
+       $(top_srcdir)/m4/libjpeg.m4 $(top_srcdir)/m4/libtool.m4 \
+       $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \
+       $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \
+       $(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+       $(ACLOCAL_M4)
+mkinstalldirs = $(install_sh) -d
+CONFIG_HEADER = $(top_builddir)/config.h \
+       $(top_builddir)/poppler/poppler-config.h
+CONFIG_CLEAN_FILES =
+CONFIG_CLEAN_VPATH_FILES =
+LTLIBRARIES = $(noinst_LTLIBRARIES)
+libsplash_la_LIBADD =
+am_libsplash_la_OBJECTS = Splash.lo SplashBitmap.lo SplashClip.lo \
+       SplashFTFont.lo SplashFTFontEngine.lo SplashFTFontFile.lo \
+       SplashFont.lo SplashFontEngine.lo SplashFontFile.lo \
+       SplashFontFileID.lo SplashPath.lo SplashPattern.lo \
+       SplashScreen.lo SplashState.lo SplashT1Font.lo \
+       SplashT1FontEngine.lo SplashT1FontFile.lo SplashXPath.lo \
+       SplashXPathScanner.lo
+libsplash_la_OBJECTS = $(am_libsplash_la_OBJECTS)
+AM_V_lt = $(am__v_lt_@AM_V@)
+am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@)
+am__v_lt_0 = --silent
+DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) -I$(top_builddir)/poppler
+depcomp = $(SHELL) $(top_srcdir)/depcomp
+am__depfiles_maybe = depfiles
+am__mv = mv -f
+CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
+       $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)
+LTCXXCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \
+       $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) \
+       $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
+       $(AM_CXXFLAGS) $(CXXFLAGS)
+AM_V_CXX = $(am__v_CXX_@AM_V@)
+am__v_CXX_ = $(am__v_CXX_@AM_DEFAULT_V@)
+am__v_CXX_0 = @echo "  CXX   " $@;
+AM_V_at = $(am__v_at_@AM_V@)
+am__v_at_ = $(am__v_at_@AM_DEFAULT_V@)
+am__v_at_0 = @
+CXXLD = $(CXX)
+CXXLINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \
+       $(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \
+       $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
+AM_V_CXXLD = $(am__v_CXXLD_@AM_V@)
+am__v_CXXLD_ = $(am__v_CXXLD_@AM_DEFAULT_V@)
+am__v_CXXLD_0 = @echo "  CXXLD " $@;
+AM_V_GEN = $(am__v_GEN_@AM_V@)
+am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@)
+am__v_GEN_0 = @echo "  GEN   " $@;
+SOURCES = $(libsplash_la_SOURCES)
+DIST_SOURCES = $(libsplash_la_SOURCES)
+am__can_run_installinfo = \
+  case $$AM_UPDATE_INFO_DIR in \
+    n|no|NO) false;; \
+    *) (install-info --version) >/dev/null 2>&1;; \
+  esac
+am__poppler_splash_include_HEADERS_DIST = Splash.h SplashBitmap.h \
+       SplashClip.h SplashErrorCodes.h SplashFTFont.h \
+       SplashFTFontEngine.h SplashFTFontFile.h SplashFont.h \
+       SplashFontEngine.h SplashFontFile.h SplashFontFileID.h \
+       SplashGlyphBitmap.h SplashMath.h SplashPath.h SplashPattern.h \
+       SplashScreen.h SplashState.h SplashT1Font.h \
+       SplashT1FontEngine.h SplashT1FontFile.h SplashTypes.h \
+       SplashXPath.h SplashXPathScanner.h
+am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
+am__vpath_adj = case $$p in \
+    $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
+    *) f=$$p;; \
+  esac;
+am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`;
+am__install_max = 40
+am__nobase_strip_setup = \
+  srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'`
+am__nobase_strip = \
+  for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||"
+am__nobase_list = $(am__nobase_strip_setup); \
+  for p in $$list; do echo "$$p $$p"; done | \
+  sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \
+  $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \
+    if (++n[$$2] == $(am__install_max)) \
+      { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \
+    END { for (dir in files) print dir, files[dir] }'
+am__base_list = \
+  sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
+  sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
+am__uninstall_files_from_dir = { \
+  test -z "$$files" \
+    || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \
+    || { echo " ( cd '$$dir' && rm -f" $$files ")"; \
+         $(am__cd) "$$dir" && rm -f $$files; }; \
+  }
+am__installdirs = "$(DESTDIR)$(poppler_splash_includedir)"
+HEADERS = $(poppler_splash_include_HEADERS)
+ETAGS = etags
+CTAGS = ctags
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AR = @AR@
+AS = @AS@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CAIRO_CFLAGS = @CAIRO_CFLAGS@
+CAIRO_FEATURE = @CAIRO_FEATURE@
+CAIRO_LIBS = @CAIRO_LIBS@
+CAIRO_REQ = @CAIRO_REQ@
+CAIRO_VERSION = @CAIRO_VERSION@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CXX = @CXX@
+CXXCPP = @CXXCPP@
+CXXDEPMODE = @CXXDEPMODE@
+CXXFLAGS = @CXXFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DLLTOOL = @DLLTOOL@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+FGREP = @FGREP@
+FONTCONFIG_CFLAGS = @FONTCONFIG_CFLAGS@
+FONTCONFIG_LIBS = @FONTCONFIG_LIBS@
+FREETYPE_CFLAGS = @FREETYPE_CFLAGS@
+FREETYPE_CONFIG = @FREETYPE_CONFIG@
+FREETYPE_LIBS = @FREETYPE_LIBS@
+GLIB_MKENUMS = @GLIB_MKENUMS@
+GLIB_REQ = @GLIB_REQ@
+GLIB_REQUIRED = @GLIB_REQUIRED@
+GREP = @GREP@
+GTKDOC_CHECK = @GTKDOC_CHECK@
+GTKDOC_DEPS_CFLAGS = @GTKDOC_DEPS_CFLAGS@
+GTKDOC_DEPS_LIBS = @GTKDOC_DEPS_LIBS@
+GTKDOC_MKPDF = @GTKDOC_MKPDF@
+GTKDOC_REBASE = @GTKDOC_REBASE@
+GTK_TEST_CFLAGS = @GTK_TEST_CFLAGS@
+GTK_TEST_LIBS = @GTK_TEST_LIBS@
+HTML_DIR = @HTML_DIR@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+INTROSPECTION_CFLAGS = @INTROSPECTION_CFLAGS@
+INTROSPECTION_COMPILER = @INTROSPECTION_COMPILER@
+INTROSPECTION_GENERATE = @INTROSPECTION_GENERATE@
+INTROSPECTION_GIRDIR = @INTROSPECTION_GIRDIR@
+INTROSPECTION_LIBS = @INTROSPECTION_LIBS@
+INTROSPECTION_MAKEFILE = @INTROSPECTION_MAKEFILE@
+INTROSPECTION_SCANNER = @INTROSPECTION_SCANNER@
+INTROSPECTION_TYPELIBDIR = @INTROSPECTION_TYPELIBDIR@
+LCMS_CFLAGS = @LCMS_CFLAGS@
+LCMS_LIBS = @LCMS_LIBS@
+LD = @LD@
+LDFLAGS = @LDFLAGS@
+LIBCURL_CFLAGS = @LIBCURL_CFLAGS@
+LIBCURL_LIBS = @LIBCURL_LIBS@
+LIBICONV = @LIBICONV@
+LIBJPEG_CFLAGS = @LIBJPEG_CFLAGS@
+LIBJPEG_LIBS = @LIBJPEG_LIBS@
+LIBOBJS = @LIBOBJS@
+LIBOPENJPEG_CFLAGS = @LIBOPENJPEG_CFLAGS@
+LIBOPENJPEG_LIBS = @LIBOPENJPEG_LIBS@
+LIBPNG_CFLAGS = @LIBPNG_CFLAGS@
+LIBPNG_LIBS = @LIBPNG_LIBS@
+LIBS = @LIBS@
+LIBTIFF_CFLAGS = @LIBTIFF_CFLAGS@
+LIBTIFF_CFLAGSS = @LIBTIFF_CFLAGSS@
+LIBTIFF_LIBS = @LIBTIFF_LIBS@
+LIBTOOL = @LIBTOOL@
+LIPO = @LIPO@
+LN_S = @LN_S@
+LTLIBICONV = @LTLIBICONV@
+LTLIBOBJS = @LTLIBOBJS@
+MAKEINFO = @MAKEINFO@
+MANIFEST_TOOL = @MANIFEST_TOOL@
+MKDIR_P = @MKDIR_P@
+MOCQT4 = @MOCQT4@
+NM = @NM@
+NMEDIT = @NMEDIT@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+OTOOL = @OTOOL@
+OTOOL64 = @OTOOL64@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_URL = @PACKAGE_URL@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PC_REQUIRES = @PC_REQUIRES@
+PC_REQUIRES_PRIVATE = @PC_REQUIRES_PRIVATE@
+PDFTOCAIRO_CFLAGS = @PDFTOCAIRO_CFLAGS@
+PDFTOCAIRO_LIBS = @PDFTOCAIRO_LIBS@
+PKG_CONFIG = @PKG_CONFIG@
+PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@
+PKG_CONFIG_PATH = @PKG_CONFIG_PATH@
+POPPLER_DATADIR = @POPPLER_DATADIR@
+POPPLER_GLIB_CFLAGS = @POPPLER_GLIB_CFLAGS@
+POPPLER_GLIB_DISABLE_DEPRECATED = @POPPLER_GLIB_DISABLE_DEPRECATED@
+POPPLER_GLIB_DISABLE_SINGLE_INCLUDES = @POPPLER_GLIB_DISABLE_SINGLE_INCLUDES@
+POPPLER_GLIB_LIBS = @POPPLER_GLIB_LIBS@
+POPPLER_MAJOR_VERSION = @POPPLER_MAJOR_VERSION@
+POPPLER_MICRO_VERSION = @POPPLER_MICRO_VERSION@
+POPPLER_MINOR_VERSION = @POPPLER_MINOR_VERSION@
+POPPLER_QT4_CFLAGS = @POPPLER_QT4_CFLAGS@
+POPPLER_QT4_CXXFLAGS = @POPPLER_QT4_CXXFLAGS@
+POPPLER_QT4_LIBS = @POPPLER_QT4_LIBS@
+POPPLER_QT4_TEST_CFLAGS = @POPPLER_QT4_TEST_CFLAGS@
+POPPLER_QT4_TEST_LIBS = @POPPLER_QT4_TEST_LIBS@
+POPPLER_VERSION = @POPPLER_VERSION@
+PTHREAD_CC = @PTHREAD_CC@
+PTHREAD_CFLAGS = @PTHREAD_CFLAGS@
+PTHREAD_LIBS = @PTHREAD_LIBS@
+RANLIB = @RANLIB@
+SED = @SED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+TESTDATADIR = @TESTDATADIR@
+VERSION = @VERSION@
+XMKMF = @XMKMF@
+X_CFLAGS = @X_CFLAGS@
+X_EXTRA_LIBS = @X_EXTRA_LIBS@
+X_LIBS = @X_LIBS@
+X_PRE_LIBS = @X_PRE_LIBS@
+ZLIB_LIBS = @ZLIB_LIBS@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
+ac_ct_AR = @ac_ct_AR@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_CXX = @ac_ct_CXX@
+ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
+acx_pthread_config = @acx_pthread_config@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+auto_import_flags = @auto_import_flags@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+builddir = @builddir@
+create_shared_lib = @create_shared_lib@
+datadir = @datadir@
+datarootdir = @datarootdir@
+docdir = @docdir@
+dvidir = @dvidir@
+exec_prefix = @exec_prefix@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+htmldir = @htmldir@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localedir = @localedir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+srcdir = @srcdir@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+top_build_prefix = @top_build_prefix@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+win32_libs = @win32_libs@
+INCLUDES = \
+       -I$(top_srcdir)                         \
+       -I$(top_srcdir)/goo                     \
+       $(libjpeg_includes)                     \
+       $(libtiff_includes)                     \
+       $(libpng_includes)                      \
+       $(FREETYPE_CFLAGS)
+
+
+# SplashBitmap includes JpegWriter.h, TiffWriter.h, PNGWriter.h
+@BUILD_LIBJPEG_TRUE@libjpeg_includes = $(LIBJPEG_CFLAGS)
+@BUILD_LIBTIFF_TRUE@libtiff_includes = $(LIBTIFF_CFLAGS)
+@BUILD_LIBPNG_TRUE@libpng_includes = $(LIBPNG_CFLAGS)
+noinst_LTLIBRARIES = libsplash.la
+@ENABLE_XPDF_HEADERS_TRUE@poppler_splash_includedir = $(includedir)/poppler/splash
+@ENABLE_XPDF_HEADERS_TRUE@poppler_splash_include_HEADERS = \
+@ENABLE_XPDF_HEADERS_TRUE@     Splash.h                                \
+@ENABLE_XPDF_HEADERS_TRUE@     SplashBitmap.h                          \
+@ENABLE_XPDF_HEADERS_TRUE@     SplashClip.h                            \
+@ENABLE_XPDF_HEADERS_TRUE@     SplashErrorCodes.h                      \
+@ENABLE_XPDF_HEADERS_TRUE@     SplashFTFont.h                          \
+@ENABLE_XPDF_HEADERS_TRUE@     SplashFTFontEngine.h                    \
+@ENABLE_XPDF_HEADERS_TRUE@     SplashFTFontFile.h                      \
+@ENABLE_XPDF_HEADERS_TRUE@     SplashFont.h                            \
+@ENABLE_XPDF_HEADERS_TRUE@     SplashFontEngine.h                      \
+@ENABLE_XPDF_HEADERS_TRUE@     SplashFontFile.h                        \
+@ENABLE_XPDF_HEADERS_TRUE@     SplashFontFileID.h                      \
+@ENABLE_XPDF_HEADERS_TRUE@     SplashGlyphBitmap.h                     \
+@ENABLE_XPDF_HEADERS_TRUE@     SplashMath.h                            \
+@ENABLE_XPDF_HEADERS_TRUE@     SplashPath.h                            \
+@ENABLE_XPDF_HEADERS_TRUE@     SplashPattern.h                         \
+@ENABLE_XPDF_HEADERS_TRUE@     SplashScreen.h                          \
+@ENABLE_XPDF_HEADERS_TRUE@     SplashState.h                           \
+@ENABLE_XPDF_HEADERS_TRUE@     SplashT1Font.h                          \
+@ENABLE_XPDF_HEADERS_TRUE@     SplashT1FontEngine.h                    \
+@ENABLE_XPDF_HEADERS_TRUE@     SplashT1FontFile.h                      \
+@ENABLE_XPDF_HEADERS_TRUE@     SplashTypes.h                           \
+@ENABLE_XPDF_HEADERS_TRUE@     SplashXPath.h                           \
+@ENABLE_XPDF_HEADERS_TRUE@     SplashXPathScanner.h
+
+libsplash_la_SOURCES = \
+       Splash.cc                               \
+       SplashBitmap.cc                         \
+       SplashClip.cc                           \
+       SplashFTFont.cc                         \
+       SplashFTFontEngine.cc                   \
+       SplashFTFontFile.cc                     \
+       SplashFont.cc                           \
+       SplashFontEngine.cc                     \
+       SplashFontFile.cc                       \
+       SplashFontFileID.cc                     \
+       SplashPath.cc                           \
+       SplashPattern.cc                        \
+       SplashScreen.cc                         \
+       SplashState.cc                          \
+       SplashT1Font.cc                         \
+       SplashT1FontEngine.cc                   \
+       SplashT1FontFile.cc                     \
+       SplashXPath.cc                          \
+       SplashXPathScanner.cc
+
+all: all-am
+
+.SUFFIXES:
+.SUFFIXES: .cc .lo .o .obj
+$(srcdir)/Makefile.in:  $(srcdir)/Makefile.am  $(am__configure_deps)
+       @for dep in $?; do \
+         case '$(am__configure_deps)' in \
+           *$$dep*) \
+             ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
+               && { if test -f $@; then exit 0; else break; fi; }; \
+             exit 1;; \
+         esac; \
+       done; \
+       echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign splash/Makefile'; \
+       $(am__cd) $(top_srcdir) && \
+         $(AUTOMAKE) --foreign splash/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+       @case '$?' in \
+         *config.status*) \
+           cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+         *) \
+           echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+           cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+       esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+       cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure:  $(am__configure_deps)
+       cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4):  $(am__aclocal_m4_deps)
+       cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(am__aclocal_m4_deps):
+
+clean-noinstLTLIBRARIES:
+       -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES)
+       @list='$(noinst_LTLIBRARIES)'; for p in $$list; do \
+         dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \
+         test "$$dir" != "$$p" || dir=.; \
+         echo "rm -f \"$${dir}/so_locations\""; \
+         rm -f "$${dir}/so_locations"; \
+       done
+libsplash.la: $(libsplash_la_OBJECTS) $(libsplash_la_DEPENDENCIES) $(EXTRA_libsplash_la_DEPENDENCIES) 
+       $(AM_V_CXXLD)$(CXXLINK)  $(libsplash_la_OBJECTS) $(libsplash_la_LIBADD) $(LIBS)
+
+mostlyclean-compile:
+       -rm -f *.$(OBJEXT)
+
+distclean-compile:
+       -rm -f *.tab.c
+
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Splash.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/SplashBitmap.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/SplashClip.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/SplashFTFont.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/SplashFTFontEngine.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/SplashFTFontFile.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/SplashFont.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/SplashFontEngine.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/SplashFontFile.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/SplashFontFileID.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/SplashPath.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/SplashPattern.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/SplashScreen.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/SplashState.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/SplashT1Font.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/SplashT1FontEngine.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/SplashT1FontFile.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/SplashXPath.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/SplashXPathScanner.Plo@am__quote@
+
+.cc.o:
+@am__fastdepCXX_TRUE@  $(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
+@am__fastdepCXX_TRUE@  $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ $<
+
+.cc.obj:
+@am__fastdepCXX_TRUE@  $(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'`
+@am__fastdepCXX_TRUE@  $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
+
+.cc.lo:
+@am__fastdepCXX_TRUE@  $(AM_V_CXX)$(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
+@am__fastdepCXX_TRUE@  $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     $(AM_V_CXX)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LTCXXCOMPILE) -c -o $@ $<
+
+mostlyclean-libtool:
+       -rm -f *.lo
+
+clean-libtool:
+       -rm -rf .libs _libs
+install-poppler_splash_includeHEADERS: $(poppler_splash_include_HEADERS)
+       @$(NORMAL_INSTALL)
+       @list='$(poppler_splash_include_HEADERS)'; test -n "$(poppler_splash_includedir)" || list=; \
+       if test -n "$$list"; then \
+         echo " $(MKDIR_P) '$(DESTDIR)$(poppler_splash_includedir)'"; \
+         $(MKDIR_P) "$(DESTDIR)$(poppler_splash_includedir)" || exit 1; \
+       fi; \
+       for p in $$list; do \
+         if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+         echo "$$d$$p"; \
+       done | $(am__base_list) | \
+       while read files; do \
+         echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(poppler_splash_includedir)'"; \
+         $(INSTALL_HEADER) $$files "$(DESTDIR)$(poppler_splash_includedir)" || exit $$?; \
+       done
+
+uninstall-poppler_splash_includeHEADERS:
+       @$(NORMAL_UNINSTALL)
+       @list='$(poppler_splash_include_HEADERS)'; test -n "$(poppler_splash_includedir)" || list=; \
+       files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
+       dir='$(DESTDIR)$(poppler_splash_includedir)'; $(am__uninstall_files_from_dir)
+
+ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
+       list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+       unique=`for i in $$list; do \
+           if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+         done | \
+         $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
+             END { if (nonempty) { for (i in files) print i; }; }'`; \
+       mkid -fID $$unique
+tags: TAGS
+
+TAGS:  $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
+               $(TAGS_FILES) $(LISP)
+       set x; \
+       here=`pwd`; \
+       list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
+       unique=`for i in $$list; do \
+           if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+         done | \
+         $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
+             END { if (nonempty) { for (i in files) print i; }; }'`; \
+       shift; \
+       if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
+         test -n "$$unique" || unique=$$empty_fix; \
+         if test $$# -gt 0; then \
+           $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+             "$$@" $$unique; \
+         else \
+           $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+             $$unique; \
+         fi; \
+       fi
+ctags: CTAGS
+CTAGS:  $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
+               $(TAGS_FILES) $(LISP)
+       list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
+       unique=`for i in $$list; do \
+           if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+         done | \
+         $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
+             END { if (nonempty) { for (i in files) print i; }; }'`; \
+       test -z "$(CTAGS_ARGS)$$unique" \
+         || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+            $$unique
+
+GTAGS:
+       here=`$(am__cd) $(top_builddir) && pwd` \
+         && $(am__cd) $(top_srcdir) \
+         && gtags -i $(GTAGS_ARGS) "$$here"
+
+distclean-tags:
+       -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+
+distdir: $(DISTFILES)
+       @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+       topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+       list='$(DISTFILES)'; \
+         dist_files=`for file in $$list; do echo $$file; done | \
+         sed -e "s|^$$srcdirstrip/||;t" \
+             -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+       case $$dist_files in \
+         */*) $(MKDIR_P) `echo "$$dist_files" | \
+                          sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+                          sort -u` ;; \
+       esac; \
+       for file in $$dist_files; do \
+         if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+         if test -d $$d/$$file; then \
+           dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+           if test -d "$(distdir)/$$file"; then \
+             find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+           fi; \
+           if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+             cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
+             find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+           fi; \
+           cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
+         else \
+           test -f "$(distdir)/$$file" \
+           || cp -p $$d/$$file "$(distdir)/$$file" \
+           || exit 1; \
+         fi; \
+       done
+check-am: all-am
+check: check-am
+all-am: Makefile $(LTLIBRARIES) $(HEADERS)
+installdirs:
+       for dir in "$(DESTDIR)$(poppler_splash_includedir)"; do \
+         test -z "$$dir" || $(MKDIR_P) "$$dir"; \
+       done
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+       @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+       if test -z '$(STRIP)'; then \
+         $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+           install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+             install; \
+       else \
+         $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+           install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+           "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
+       fi
+mostlyclean-generic:
+
+clean-generic:
+
+distclean-generic:
+       -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+       -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
+
+maintainer-clean-generic:
+       @echo "This command is intended for maintainers to use"
+       @echo "it deletes files that may require special tools to rebuild."
+clean: clean-am
+
+clean-am: clean-generic clean-libtool clean-noinstLTLIBRARIES \
+       mostlyclean-am
+
+distclean: distclean-am
+       -rm -rf ./$(DEPDIR)
+       -rm -f Makefile
+distclean-am: clean-am distclean-compile distclean-generic \
+       distclean-tags
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+html-am:
+
+info: info-am
+
+info-am:
+
+install-data-am: install-poppler_splash_includeHEADERS
+
+install-dvi: install-dvi-am
+
+install-dvi-am:
+
+install-exec-am:
+
+install-html: install-html-am
+
+install-html-am:
+
+install-info: install-info-am
+
+install-info-am:
+
+install-man:
+
+install-pdf: install-pdf-am
+
+install-pdf-am:
+
+install-ps: install-ps-am
+
+install-ps-am:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+       -rm -rf ./$(DEPDIR)
+       -rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-compile mostlyclean-generic \
+       mostlyclean-libtool
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am: uninstall-poppler_splash_includeHEADERS
+
+.MAKE: install-am install-strip
+
+.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \
+       clean-libtool clean-noinstLTLIBRARIES ctags distclean \
+       distclean-compile distclean-generic distclean-libtool \
+       distclean-tags distdir dvi dvi-am html html-am info info-am \
+       install install-am install-data install-data-am install-dvi \
+       install-dvi-am install-exec install-exec-am install-html \
+       install-html-am install-info install-info-am install-man \
+       install-pdf install-pdf-am \
+       install-poppler_splash_includeHEADERS install-ps install-ps-am \
+       install-strip installcheck installcheck-am installdirs \
+       maintainer-clean maintainer-clean-generic mostlyclean \
+       mostlyclean-compile mostlyclean-generic mostlyclean-libtool \
+       pdf pdf-am ps ps-am tags uninstall uninstall-am \
+       uninstall-poppler_splash_includeHEADERS
+
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/splash/Splash.cc b/splash/Splash.cc
new file mode 100644 (file)
index 0000000..e6559f4
--- /dev/null
@@ -0,0 +1,5866 @@
+//========================================================================
+//
+// Splash.cc
+//
+//========================================================================
+
+//========================================================================
+//
+// Modified under the Poppler project - http://poppler.freedesktop.org
+//
+// All changes made under the Poppler project to this file are licensed
+// under GPL version 2 or later
+//
+// Copyright (C) 2005-2012 Albert Astals Cid <aacid@kde.org>
+// Copyright (C) 2005 Marco Pesenti Gritti <mpg@redhat.com>
+// Copyright (C) 2010-2012 Thomas Freitag <Thomas.Freitag@alfa.de>
+// Copyright (C) 2010 Christian Feuersänger <cfeuersaenger@googlemail.com>
+// Copyright (C) 2011, 2012 William Bader <williambader@hotmail.com>
+// Copyright (C) 2012 Markus Trippelsdorf <markus@trippelsdorf.de>
+//
+// To see a description of the changes please see the Changelog file that
+// came with your tarball or type make ChangeLog if you are building from git
+//
+//========================================================================
+
+#include <config.h>
+
+#ifdef USE_GCC_PRAGMAS
+#pragma implementation
+#endif
+
+#include <stdlib.h>
+#include <string.h>
+#include <limits.h>
+#include <assert.h>
+#include <math.h>
+#include "goo/gmem.h"
+#include "goo/GooLikely.h"
+#include "poppler/Error.h"
+#include "SplashErrorCodes.h"
+#include "SplashMath.h"
+#include "SplashBitmap.h"
+#include "SplashState.h"
+#include "SplashPath.h"
+#include "SplashXPath.h"
+#include "SplashXPathScanner.h"
+#include "SplashPattern.h"
+#include "SplashScreen.h"
+#include "SplashFont.h"
+#include "SplashGlyphBitmap.h"
+#include "Splash.h"
+#include <algorithm>
+
+//------------------------------------------------------------------------
+
+#define splashAAGamma 1.5
+
+// distance of Bezier control point from center for circle approximation
+// = (4 * (sqrt(2) - 1) / 3) * r
+#define bezierCircle ((SplashCoord)0.55228475)
+#define bezierCircle2 ((SplashCoord)(0.5 * 0.55228475))
+
+// Divide a 16-bit value (in [0, 255*255]) by 255, returning an 8-bit result.
+static inline Guchar div255(int x) {
+  return (Guchar)((x + (x >> 8) + 0x80) >> 8);
+}
+
+// Clip x to lie in [0, 255].
+static inline Guchar clip255(int x) {
+  return x < 0 ? 0 : x > 255 ? 255 : x;
+}
+
+template<typename T>
+inline void Guswap( T&a, T&b ) { T tmp = a; a=b; b=tmp; }
+
+// The PDF spec says that all pixels whose *centers* lie within the
+// image target region get painted, so we want to round n+0.5 down to
+// n.  But this causes problems, e.g., with PDF files that fill a
+// rectangle with black and then draw an image to the exact same
+// rectangle, so we instead use the fill scan conversion rule.
+// However, the correct rule works better for glyphs, so we also
+// provide that option in fillImageMask.
+#if 0
+static inline int imgCoordMungeLower(SplashCoord x) {
+  return splashCeil(x + 0.5) - 1;
+}
+static inline int imgCoordMungeUpper(SplashCoord x) {
+  return splashCeil(x + 0.5) - 1;
+}
+#else
+static inline int imgCoordMungeLower(SplashCoord x) {
+  return splashFloor(x);
+}
+static inline int imgCoordMungeUpper(SplashCoord x) {
+  return splashFloor(x) + 1;
+}
+static inline int imgCoordMungeLowerC(SplashCoord x, GBool glyphMode) {
+  return glyphMode ? (splashCeil(x + 0.5) - 1) : splashFloor(x);
+}
+static inline int imgCoordMungeUpperC(SplashCoord x, GBool glyphMode) {
+  return glyphMode ? (splashCeil(x + 0.5) - 1) : (splashFloor(x) + 1);
+}
+#endif
+
+// Used by drawImage and fillImageMask to divide the target
+// quadrilateral into sections.
+struct ImageSection {
+  int y0, y1;                          // actual y range
+  int ia0, ia1;                                // vertex indices for edge A
+  int ib0, ib1;                                // vertex indices for edge A
+  SplashCoord xa0, ya0, xa1, ya1;      // edge A
+  SplashCoord dxdya;                   // slope of edge A
+  SplashCoord xb0, yb0, xb1, yb1;      // edge B
+  SplashCoord dxdyb;                   // slope of edge B
+};
+
+//------------------------------------------------------------------------
+// SplashPipe
+//------------------------------------------------------------------------
+
+#define splashPipeMaxStages 9
+
+struct SplashPipe {
+  // pixel coordinates
+  int x, y;
+
+  // source pattern
+  SplashPattern *pattern;
+
+  // source alpha and color
+  Guchar aInput;
+  GBool usesShape;
+  SplashColorPtr cSrc;
+  SplashColor cSrcVal;
+
+  // non-isolated group alpha0
+  Guchar *alpha0Ptr;
+
+  // knockout groups
+  GBool knockout;
+  Guchar knockoutOpacity;
+
+  // soft mask
+  SplashColorPtr softMaskPtr;
+
+  // destination alpha and color
+  SplashColorPtr destColorPtr;
+  int destColorMask;
+  Guchar *destAlphaPtr;
+
+  // shape
+  Guchar shape;
+
+  // result alpha and color
+  GBool noTransparency;
+  SplashPipeResultColorCtrl resultColorCtrl;
+
+  // non-isolated group correction
+  GBool nonIsolatedGroup;
+
+  // the "run" function
+  void (Splash::*run)(SplashPipe *pipe);
+};
+
+SplashPipeResultColorCtrl Splash::pipeResultColorNoAlphaBlend[] = {
+  splashPipeResultColorNoAlphaBlendMono,
+  splashPipeResultColorNoAlphaBlendMono,
+  splashPipeResultColorNoAlphaBlendRGB,
+  splashPipeResultColorNoAlphaBlendRGB,
+  splashPipeResultColorNoAlphaBlendRGB
+#if SPLASH_CMYK
+  ,
+  splashPipeResultColorNoAlphaBlendCMYK
+#endif
+};
+
+SplashPipeResultColorCtrl Splash::pipeResultColorAlphaNoBlend[] = {
+  splashPipeResultColorAlphaNoBlendMono,
+  splashPipeResultColorAlphaNoBlendMono,
+  splashPipeResultColorAlphaNoBlendRGB,
+  splashPipeResultColorNoAlphaBlendRGB,
+  splashPipeResultColorAlphaNoBlendRGB
+#if SPLASH_CMYK
+  ,
+  splashPipeResultColorAlphaNoBlendCMYK
+#endif
+};
+
+SplashPipeResultColorCtrl Splash::pipeResultColorAlphaBlend[] = {
+  splashPipeResultColorAlphaBlendMono,
+  splashPipeResultColorAlphaBlendMono,
+  splashPipeResultColorAlphaBlendRGB,
+  splashPipeResultColorNoAlphaBlendRGB,
+  splashPipeResultColorAlphaBlendRGB
+#if SPLASH_CMYK
+  ,
+  splashPipeResultColorAlphaBlendCMYK
+#endif
+};
+
+//------------------------------------------------------------------------
+
+static void blendXor(SplashColorPtr src, SplashColorPtr dest,
+                    SplashColorPtr blend, SplashColorMode cm) {
+  int i;
+
+  for (i = 0; i < splashColorModeNComps[cm]; ++i) {
+    blend[i] = src[i] ^ dest[i];
+  }
+}
+
+//------------------------------------------------------------------------
+// modified region
+//------------------------------------------------------------------------
+
+void Splash::clearModRegion() {
+  modXMin = bitmap->getWidth();
+  modYMin = bitmap->getHeight();
+  modXMax = -1;
+  modYMax = -1;
+}
+
+inline void Splash::updateModX(int x) {
+  if (x < modXMin) {
+    modXMin = x;
+  }
+  if (x > modXMax) {
+    modXMax = x;
+  }
+}
+
+inline void Splash::updateModY(int y) {
+  if (y < modYMin) {
+    modYMin = y;
+  }
+  if (y > modYMax) {
+    modYMax = y;
+  }
+}
+
+//------------------------------------------------------------------------
+// pipeline
+//------------------------------------------------------------------------
+
+inline void Splash::pipeInit(SplashPipe *pipe, int x, int y,
+                            SplashPattern *pattern, SplashColorPtr cSrc,
+                            Guchar aInput, GBool usesShape,
+                            GBool nonIsolatedGroup,
+                            GBool knockout, Guchar knockoutOpacity) {
+  pipeSetXY(pipe, x, y);
+  pipe->pattern = NULL;
+
+  // source color
+  if (pattern) {
+    if (pattern->isStatic()) {
+      pattern->getColor(x, y, pipe->cSrcVal);
+    } else {
+      pipe->pattern = pattern;
+    }
+    pipe->cSrc = pipe->cSrcVal;
+  } else {
+    pipe->cSrc = cSrc;
+  }
+
+  // source alpha
+  pipe->aInput = aInput;
+  pipe->usesShape = usesShape;
+
+  // knockout
+  pipe->knockout = knockout;
+  pipe->knockoutOpacity = knockoutOpacity;
+
+  // result alpha
+  if (aInput == 255 && !state->softMask && !usesShape &&
+      !state->inNonIsolatedGroup && !nonIsolatedGroup) {
+    pipe->noTransparency = gTrue;
+  } else {
+    pipe->noTransparency = gFalse;
+  }
+
+  // result color
+  if (pipe->noTransparency) {
+    // the !state->blendFunc case is handled separately in pipeRun
+    pipe->resultColorCtrl = pipeResultColorNoAlphaBlend[bitmap->mode];
+  } else if (!state->blendFunc) {
+    pipe->resultColorCtrl = pipeResultColorAlphaNoBlend[bitmap->mode];
+  } else {
+    pipe->resultColorCtrl = pipeResultColorAlphaBlend[bitmap->mode];
+  }
+
+  // non-isolated group correction
+  pipe->nonIsolatedGroup = nonIsolatedGroup;
+
+  // select the 'run' function
+  pipe->run = &Splash::pipeRun;
+  if (!pipe->pattern && pipe->noTransparency && !state->blendFunc) {
+    if (bitmap->mode == splashModeMono1 && !pipe->destAlphaPtr) {
+      pipe->run = &Splash::pipeRunSimpleMono1;
+    } else if (bitmap->mode == splashModeMono8 && pipe->destAlphaPtr) {
+      pipe->run = &Splash::pipeRunSimpleMono8;
+    } else if (bitmap->mode == splashModeRGB8 && pipe->destAlphaPtr) {
+      pipe->run = &Splash::pipeRunSimpleRGB8;
+    } else if (bitmap->mode == splashModeXBGR8 && pipe->destAlphaPtr) {
+      pipe->run = &Splash::pipeRunSimpleXBGR8;
+    } else if (bitmap->mode == splashModeBGR8 && pipe->destAlphaPtr) {
+      pipe->run = &Splash::pipeRunSimpleBGR8;
+#if SPLASH_CMYK
+    } else if (bitmap->mode == splashModeCMYK8 && pipe->destAlphaPtr) {
+      pipe->run = &Splash::pipeRunSimpleCMYK8;
+#endif
+    }
+  } else if (!pipe->pattern && !pipe->noTransparency && !state->softMask &&
+            pipe->usesShape &&
+            !(state->inNonIsolatedGroup && alpha0Bitmap->alpha) &&
+            !state->blendFunc && !pipe->nonIsolatedGroup) {
+    if (bitmap->mode == splashModeMono1 && !pipe->destAlphaPtr) {
+      pipe->run = &Splash::pipeRunAAMono1;
+    } else if (bitmap->mode == splashModeMono8 && pipe->destAlphaPtr) {
+      pipe->run = &Splash::pipeRunAAMono8;
+    } else if (bitmap->mode == splashModeRGB8 && pipe->destAlphaPtr) {
+      pipe->run = &Splash::pipeRunAARGB8;
+    } else if (bitmap->mode == splashModeXBGR8 && pipe->destAlphaPtr) {
+      pipe->run = &Splash::pipeRunAAXBGR8;
+    } else if (bitmap->mode == splashModeBGR8 && pipe->destAlphaPtr) {
+      pipe->run = &Splash::pipeRunAABGR8;
+#if SPLASH_CMYK
+    } else if (bitmap->mode == splashModeCMYK8 && pipe->destAlphaPtr) {
+      pipe->run = &Splash::pipeRunAACMYK8;
+#endif
+    }
+  }
+}
+
+// general case
+void Splash::pipeRun(SplashPipe *pipe) {
+  Guchar aSrc, aDest, alphaI, alphaIm1, alpha0, aResult;
+  SplashColor cSrcNonIso, cDest, cBlend;
+  SplashColorPtr cSrc;
+  Guchar cResult0, cResult1, cResult2, cResult3;
+  int t;
+
+  //----- source color
+
+  // static pattern: handled in pipeInit
+  // fixed color: handled in pipeInit
+
+  // dynamic pattern
+  if (pipe->pattern) {
+    if (!pipe->pattern->getColor(pipe->x, pipe->y, pipe->cSrcVal)) {
+               pipeIncX(pipe);
+               return;
+    }
+  }
+
+  if (pipe->noTransparency && !state->blendFunc) {
+
+    //----- write destination pixel
+
+    switch (bitmap->mode) {
+    case splashModeMono1:
+      cResult0 = state->grayTransfer[pipe->cSrc[0]];
+      if (state->screen->test(pipe->x, pipe->y, cResult0)) {
+       *pipe->destColorPtr |= pipe->destColorMask;
+      } else {
+       *pipe->destColorPtr &= ~pipe->destColorMask;
+      }
+      if (!(pipe->destColorMask >>= 1)) {
+       pipe->destColorMask = 0x80;
+       ++pipe->destColorPtr;
+      }
+      break;
+    case splashModeMono8:
+      *pipe->destColorPtr++ = state->grayTransfer[pipe->cSrc[0]];
+      break;
+    case splashModeRGB8:
+      *pipe->destColorPtr++ = state->rgbTransferR[pipe->cSrc[0]];
+      *pipe->destColorPtr++ = state->rgbTransferG[pipe->cSrc[1]];
+      *pipe->destColorPtr++ = state->rgbTransferB[pipe->cSrc[2]];
+      break;
+    case splashModeXBGR8:
+      *pipe->destColorPtr++ = state->rgbTransferB[pipe->cSrc[2]];
+      *pipe->destColorPtr++ = state->rgbTransferG[pipe->cSrc[1]];
+      *pipe->destColorPtr++ = state->rgbTransferR[pipe->cSrc[0]];
+      *pipe->destColorPtr++ = 255;
+      break;
+    case splashModeBGR8:
+      *pipe->destColorPtr++ = state->rgbTransferB[pipe->cSrc[2]];
+      *pipe->destColorPtr++ = state->rgbTransferG[pipe->cSrc[1]];
+      *pipe->destColorPtr++ = state->rgbTransferR[pipe->cSrc[0]];
+      break;
+#if SPLASH_CMYK
+    case splashModeCMYK8:
+      if (state->overprintMask & 1) {
+       pipe->destColorPtr[0] = (state->overprintAdditive) ? 
+              std::min<int>(pipe->destColorPtr[0] + state->cmykTransferC[pipe->cSrc[0]], 255) :
+              state->cmykTransferC[pipe->cSrc[0]];
+      }
+      if (state->overprintMask & 2) {
+       pipe->destColorPtr[1] = (state->overprintAdditive) ? 
+              std::min<int>(pipe->destColorPtr[1] + state->cmykTransferM[pipe->cSrc[1]], 255) :
+              state->cmykTransferM[pipe->cSrc[1]];
+      }
+      if (state->overprintMask & 4) {
+       pipe->destColorPtr[2] = (state->overprintAdditive) ? 
+              std::min<int>(pipe->destColorPtr[2] + state->cmykTransferY[pipe->cSrc[2]], 255) :
+              state->cmykTransferY[pipe->cSrc[2]];
+      }
+      if (state->overprintMask & 8) {
+       pipe->destColorPtr[3] = (state->overprintAdditive) ? 
+              std::min<int>(pipe->destColorPtr[3] + state->cmykTransferK[pipe->cSrc[3]], 255) :
+              state->cmykTransferK[pipe->cSrc[3]];
+      }
+      pipe->destColorPtr += 4;
+      break;
+#endif
+    }
+    if (pipe->destAlphaPtr) {
+      *pipe->destAlphaPtr++ = 255;
+    }
+
+  } else {
+
+    //----- read destination pixel
+
+    switch (bitmap->mode) {
+    case splashModeMono1:
+      cDest[0] = (*pipe->destColorPtr & pipe->destColorMask) ? 0xff : 0x00;
+      break;
+    case splashModeMono8:
+      cDest[0] = *pipe->destColorPtr;
+      break;
+    case splashModeRGB8:
+      cDest[0] = pipe->destColorPtr[0];
+      cDest[1] = pipe->destColorPtr[1];
+      cDest[2] = pipe->destColorPtr[2];
+      break;
+    case splashModeXBGR8:
+      cDest[0] = pipe->destColorPtr[2];
+      cDest[1] = pipe->destColorPtr[1];
+      cDest[2] = pipe->destColorPtr[0];
+      cDest[3] = 255;
+      break;
+    case splashModeBGR8:
+      cDest[0] = pipe->destColorPtr[2];
+      cDest[1] = pipe->destColorPtr[1];
+      cDest[2] = pipe->destColorPtr[0];
+      break;
+#if SPLASH_CMYK
+    case splashModeCMYK8:
+      cDest[0] = pipe->destColorPtr[0];
+      cDest[1] = pipe->destColorPtr[1];
+      cDest[2] = pipe->destColorPtr[2];
+      cDest[3] = pipe->destColorPtr[3];
+      break;
+#endif
+    }
+    if (pipe->destAlphaPtr) {
+      aDest = *pipe->destAlphaPtr;
+    } else {
+      aDest = 0xff;
+    }
+
+    //----- source alpha
+
+    if (state->softMask) {
+      if (pipe->usesShape) {
+       aSrc = div255(div255(pipe->aInput * *pipe->softMaskPtr++) *
+                     pipe->shape);
+      } else {
+       aSrc = div255(pipe->aInput * *pipe->softMaskPtr++);
+      }
+    } else if (pipe->usesShape) {
+      aSrc = div255(pipe->aInput * pipe->shape);
+    } else {
+      aSrc = pipe->aInput;
+    }
+
+    //----- non-isolated group correction
+
+    if (pipe->nonIsolatedGroup) {
+      // This path is only used when Splash::composite() is called to
+      // composite a non-isolated group onto the backdrop.  In this
+      // case, pipe->shape is the source (group) alpha.
+      if (pipe->shape == 0) {
+       // this value will be multiplied by zero later, so it doesn't
+       // matter what we use
+       cSrc = pipe->cSrc;
+      } else {
+       t = (aDest * 255) / pipe->shape - aDest;
+       switch (bitmap->mode) {
+#if SPLASH_CMYK
+       case splashModeCMYK8:
+         cSrcNonIso[3] = clip255(pipe->cSrc[3] +
+                                 ((pipe->cSrc[3] - cDest[3]) * t) / 255);
+#endif
+       case splashModeRGB8:
+  case splashModeXBGR8:
+       case splashModeBGR8:
+         cSrcNonIso[2] = clip255(pipe->cSrc[2] +
+                                 ((pipe->cSrc[2] - cDest[2]) * t) / 255);
+         cSrcNonIso[1] = clip255(pipe->cSrc[1] +
+                                 ((pipe->cSrc[1] - cDest[1]) * t) / 255);
+       case splashModeMono1:
+       case splashModeMono8:
+         cSrcNonIso[0] = clip255(pipe->cSrc[0] +
+                                 ((pipe->cSrc[0] - cDest[0]) * t) / 255);
+         break;
+       }
+       cSrc = cSrcNonIso;
+        // knockout: remove backdrop color
+        if (pipe->knockout && pipe->shape >= pipe->knockoutOpacity) {
+          aDest = 0;
+        }
+      }
+    } else {
+      cSrc = pipe->cSrc;
+    }
+
+    //----- blend function
+
+    if (state->blendFunc) {
+      (*state->blendFunc)(cSrc, cDest, cBlend, bitmap->mode);
+    }
+
+    //----- result alpha and non-isolated group element correction
+
+    if (pipe->noTransparency) {
+      alphaI = alphaIm1 = aResult = 255;
+    } else {
+      aResult = aSrc + aDest - div255(aSrc * aDest);
+
+      // alphaI = alpha_i
+      // alphaIm1 = alpha_(i-1)
+      if (pipe->alpha0Ptr) {
+       alpha0 = *pipe->alpha0Ptr++;
+       alphaI = aResult + alpha0 - div255(aResult * alpha0);
+       alphaIm1 = alpha0 + aDest - div255(alpha0 * aDest);
+      } else {
+       alphaI = aResult;
+       alphaIm1 = aDest;
+      }
+    }
+
+    //----- result color
+
+    cResult0 = cResult1 = cResult2 = cResult3 = 0; // make gcc happy
+
+    switch (pipe->resultColorCtrl) {
+
+    case splashPipeResultColorNoAlphaBlendMono:
+      cResult0 = state->grayTransfer[div255((255 - aDest) * cSrc[0] +
+                                           aDest * cBlend[0])];
+      break;
+    case splashPipeResultColorNoAlphaBlendRGB:
+      cResult0 = state->rgbTransferR[div255((255 - aDest) * cSrc[0] +
+                                           aDest * cBlend[0])];
+      cResult1 = state->rgbTransferG[div255((255 - aDest) * cSrc[1] +
+                                           aDest * cBlend[1])];
+      cResult2 = state->rgbTransferB[div255((255 - aDest) * cSrc[2] +
+                                           aDest * cBlend[2])];
+      break;
+#if SPLASH_CMYK
+    case splashPipeResultColorNoAlphaBlendCMYK:
+      cResult0 = state->cmykTransferC[div255((255 - aDest) * cSrc[0] +
+                                            aDest * cBlend[0])];
+      cResult1 = state->cmykTransferM[div255((255 - aDest) * cSrc[1] +
+                                            aDest * cBlend[1])];
+      cResult2 = state->cmykTransferY[div255((255 - aDest) * cSrc[2] +
+                                            aDest * cBlend[2])];
+      cResult3 = state->cmykTransferK[div255((255 - aDest) * cSrc[3] +
+                                            aDest * cBlend[3])];
+      break;
+#endif
+
+    case splashPipeResultColorAlphaNoBlendMono:
+      if (alphaI == 0) {
+       cResult0 = 0;
+      } else {
+       cResult0 = state->grayTransfer[((alphaI - aSrc) * cDest[0] +
+                                       aSrc * cSrc[0]) / alphaI];
+      }
+      break;
+    case splashPipeResultColorAlphaNoBlendRGB:
+      if (alphaI == 0) {
+       cResult0 = 0;
+       cResult1 = 0;
+       cResult2 = 0;
+      } else {
+       cResult0 = state->rgbTransferR[((alphaI - aSrc) * cDest[0] +
+                                       aSrc * cSrc[0]) / alphaI];
+       cResult1 = state->rgbTransferG[((alphaI - aSrc) * cDest[1] +
+                                       aSrc * cSrc[1]) / alphaI];
+       cResult2 = state->rgbTransferB[((alphaI - aSrc) * cDest[2] +
+                                       aSrc * cSrc[2]) / alphaI];
+      }
+      break;
+#if SPLASH_CMYK
+    case splashPipeResultColorAlphaNoBlendCMYK:
+      if (alphaI == 0) {
+       cResult0 = 0;
+       cResult1 = 0;
+       cResult2 = 0;
+       cResult3 = 0;
+      } else {
+       cResult0 = state->cmykTransferC[((alphaI - aSrc) * cDest[0] +
+                                        aSrc * cSrc[0]) / alphaI];
+       cResult1 = state->cmykTransferM[((alphaI - aSrc) * cDest[1] +
+                                        aSrc * cSrc[1]) / alphaI];
+       cResult2 = state->cmykTransferY[((alphaI - aSrc) * cDest[2] +
+                                        aSrc * cSrc[2]) / alphaI];
+       cResult3 = state->cmykTransferK[((alphaI - aSrc) * cDest[3] +
+                                        aSrc * cSrc[3]) / alphaI];
+      }
+      break;
+#endif
+
+    case splashPipeResultColorAlphaBlendMono:
+      if (alphaI == 0) {
+       cResult0 = 0;
+      } else {
+       cResult0 = state->grayTransfer[((alphaI - aSrc) * cDest[0] +
+                                       aSrc * ((255 - alphaIm1) * cSrc[0] +
+                                               alphaIm1 * cBlend[0]) / 255) /
+                                      alphaI];
+      }
+      break;
+    case splashPipeResultColorAlphaBlendRGB:
+      if (alphaI == 0) {
+       cResult0 = 0;
+       cResult1 = 0;
+       cResult2 = 0;
+      } else {
+       cResult0 = state->rgbTransferR[((alphaI - aSrc) * cDest[0] +
+                                       aSrc * ((255 - alphaIm1) * cSrc[0] +
+                                               alphaIm1 * cBlend[0]) / 255) /
+                                      alphaI];
+       cResult1 = state->rgbTransferG[((alphaI - aSrc) * cDest[1] +
+                                       aSrc * ((255 - alphaIm1) * cSrc[1] +
+                                               alphaIm1 * cBlend[1]) / 255) /
+                                      alphaI];
+       cResult2 = state->rgbTransferB[((alphaI - aSrc) * cDest[2] +
+                                       aSrc * ((255 - alphaIm1) * cSrc[2] +
+                                               alphaIm1 * cBlend[2]) / 255) /
+                                      alphaI];
+      }
+      break;
+#if SPLASH_CMYK
+    case splashPipeResultColorAlphaBlendCMYK:
+      if (alphaI == 0) {
+       cResult0 = 0;
+       cResult1 = 0;
+       cResult2 = 0;
+       cResult3 = 0;
+      } else {
+       cResult0 = state->cmykTransferC[((alphaI - aSrc) * cDest[0] +
+                                        aSrc * ((255 - alphaIm1) * cSrc[0] +
+                                                alphaIm1 * cBlend[0]) / 255) /
+                                       alphaI];
+       cResult1 = state->cmykTransferM[((alphaI - aSrc) * cDest[1] +
+                                        aSrc * ((255 - alphaIm1) * cSrc[1] +
+                                                alphaIm1 * cBlend[1]) / 255) /
+                                       alphaI];
+       cResult2 = state->cmykTransferY[((alphaI - aSrc) * cDest[2] +
+                                        aSrc * ((255 - alphaIm1) * cSrc[2] +
+                                                alphaIm1 * cBlend[2]) / 255) /
+                                       alphaI];
+       cResult3 = state->cmykTransferK[((alphaI - aSrc) * cDest[3] +
+                                        aSrc * ((255 - alphaIm1) * cSrc[3] +
+                                                alphaIm1 * cBlend[3]) / 255) /
+                                       alphaI];
+      }
+      break;
+#endif
+    }
+
+    //----- write destination pixel
+
+    switch (bitmap->mode) {
+    case splashModeMono1:
+      if (state->screen->test(pipe->x, pipe->y, cResult0)) {
+       *pipe->destColorPtr |= pipe->destColorMask;
+      } else {
+       *pipe->destColorPtr &= ~pipe->destColorMask;
+      }
+      if (!(pipe->destColorMask >>= 1)) {
+       pipe->destColorMask = 0x80;
+       ++pipe->destColorPtr;
+      }
+      break;
+    case splashModeMono8:
+      *pipe->destColorPtr++ = cResult0;
+      break;
+    case splashModeRGB8:
+      *pipe->destColorPtr++ = cResult0;
+      *pipe->destColorPtr++ = cResult1;
+      *pipe->destColorPtr++ = cResult2;
+      break;
+    case splashModeXBGR8:
+      *pipe->destColorPtr++ = cResult2;
+      *pipe->destColorPtr++ = cResult1;
+      *pipe->destColorPtr++ = cResult0;
+      *pipe->destColorPtr++ = 255;
+      break;
+    case splashModeBGR8:
+      *pipe->destColorPtr++ = cResult2;
+      *pipe->destColorPtr++ = cResult1;
+      *pipe->destColorPtr++ = cResult0;
+      break;
+#if SPLASH_CMYK
+    case splashModeCMYK8:
+      if (state->overprintMask & 1) {
+       pipe->destColorPtr[0] = (state->overprintAdditive) ? 
+              std::min<int>(pipe->destColorPtr[0] + cResult0, 255) :
+              cResult0;
+      }
+      if (state->overprintMask & 2) {
+       pipe->destColorPtr[1] = (state->overprintAdditive) ? 
+              std::min<int>(pipe->destColorPtr[1] + cResult1, 255) :
+              cResult1;
+      }
+      if (state->overprintMask & 4) {
+       pipe->destColorPtr[2] = (state->overprintAdditive) ? 
+              std::min<int>(pipe->destColorPtr[2] + cResult2, 255) :
+              cResult2;
+      }
+      if (state->overprintMask & 8) {
+       pipe->destColorPtr[3] = (state->overprintAdditive) ? 
+              std::min<int>(pipe->destColorPtr[3] + cResult3, 255) :
+              cResult3;
+      }
+      pipe->destColorPtr += 4;
+      break;
+#endif
+    }
+    if (pipe->destAlphaPtr) {
+      *pipe->destAlphaPtr++ = aResult;
+    }
+
+  }
+
+  ++pipe->x;
+}
+
+// special case:
+// !pipe->pattern && pipe->noTransparency && !state->blendFunc &&
+// bitmap->mode == splashModeMono1 && !pipe->destAlphaPtr) {
+void Splash::pipeRunSimpleMono1(SplashPipe *pipe) {
+  Guchar cResult0;
+
+  //----- write destination pixel
+  cResult0 = state->grayTransfer[pipe->cSrc[0]];
+  if (state->screen->test(pipe->x, pipe->y, cResult0)) {
+    *pipe->destColorPtr |= pipe->destColorMask;
+  } else {
+    *pipe->destColorPtr &= ~pipe->destColorMask;
+  }
+  if (!(pipe->destColorMask >>= 1)) {
+    pipe->destColorMask = 0x80;
+    ++pipe->destColorPtr;
+  }
+
+  ++pipe->x;
+}
+
+// special case:
+// !pipe->pattern && pipe->noTransparency && !state->blendFunc &&
+// bitmap->mode == splashModeMono8 && pipe->destAlphaPtr) {
+void Splash::pipeRunSimpleMono8(SplashPipe *pipe) {
+  //----- write destination pixel
+  *pipe->destColorPtr++ = state->grayTransfer[pipe->cSrc[0]];
+  *pipe->destAlphaPtr++ = 255;
+
+  ++pipe->x;
+}
+
+// special case:
+// !pipe->pattern && pipe->noTransparency && !state->blendFunc &&
+// bitmap->mode == splashModeRGB8 && pipe->destAlphaPtr) {
+void Splash::pipeRunSimpleRGB8(SplashPipe *pipe) {
+  //----- write destination pixel
+  *pipe->destColorPtr++ = state->rgbTransferR[pipe->cSrc[0]];
+  *pipe->destColorPtr++ = state->rgbTransferG[pipe->cSrc[1]];
+  *pipe->destColorPtr++ = state->rgbTransferB[pipe->cSrc[2]];
+  *pipe->destAlphaPtr++ = 255;
+
+  ++pipe->x;
+}
+
+// special case:
+// !pipe->pattern && pipe->noTransparency && !state->blendFunc &&
+// bitmap->mode == splashModeXBGR8 && pipe->destAlphaPtr) {
+void Splash::pipeRunSimpleXBGR8(SplashPipe *pipe) {
+  //----- write destination pixel
+  *pipe->destColorPtr++ = state->rgbTransferB[pipe->cSrc[2]];
+  *pipe->destColorPtr++ = state->rgbTransferG[pipe->cSrc[1]];
+  *pipe->destColorPtr++ = state->rgbTransferR[pipe->cSrc[0]];
+  *pipe->destColorPtr++ = 255;
+  *pipe->destAlphaPtr++ = 255;
+
+  ++pipe->x;
+}
+
+// special case:
+// !pipe->pattern && pipe->noTransparency && !state->blendFunc &&
+// bitmap->mode == splashModeBGR8 && pipe->destAlphaPtr) {
+void Splash::pipeRunSimpleBGR8(SplashPipe *pipe) {
+  //----- write destination pixel
+  *pipe->destColorPtr++ = state->rgbTransferB[pipe->cSrc[2]];
+  *pipe->destColorPtr++ = state->rgbTransferG[pipe->cSrc[1]];
+  *pipe->destColorPtr++ = state->rgbTransferR[pipe->cSrc[0]];
+  *pipe->destAlphaPtr++ = 255;
+
+  ++pipe->x;
+}
+
+#if SPLASH_CMYK
+// special case:
+// !pipe->pattern && pipe->noTransparency && !state->blendFunc &&
+// bitmap->mode == splashModeCMYK8 && pipe->destAlphaPtr) {
+void Splash::pipeRunSimpleCMYK8(SplashPipe *pipe) {
+  //----- write destination pixel
+  if (state->overprintMask & 1) {
+    pipe->destColorPtr[0] = (state->overprintAdditive) ? 
+              std::min<int>(pipe->destColorPtr[0] + state->cmykTransferC[pipe->cSrc[0]], 255) :
+              state->cmykTransferC[pipe->cSrc[0]];
+  }
+  if (state->overprintMask & 2) {
+    pipe->destColorPtr[1] = (state->overprintAdditive) ? 
+              std::min<int>(pipe->destColorPtr[1] + state->cmykTransferM[pipe->cSrc[1]], 255) :
+              state->cmykTransferM[pipe->cSrc[1]];
+  }
+  if (state->overprintMask & 4) {
+    pipe->destColorPtr[2] = (state->overprintAdditive) ? 
+              std::min<int>(pipe->destColorPtr[2] + state->cmykTransferY[pipe->cSrc[2]], 255) :
+              state->cmykTransferY[pipe->cSrc[2]];
+  }
+  if (state->overprintMask & 8) {
+    pipe->destColorPtr[3] = (state->overprintAdditive) ? 
+              std::min<int>(pipe->destColorPtr[3] + state->cmykTransferK[pipe->cSrc[3]], 255) :
+              state->cmykTransferK[pipe->cSrc[3]];
+  }
+  pipe->destColorPtr += 4;
+  *pipe->destAlphaPtr++ = 255;
+
+  ++pipe->x;
+}
+#endif
+
+
+// special case:
+// !pipe->pattern && !pipe->noTransparency && !state->softMask &&
+// pipe->usesShape && !pipe->alpha0Ptr && !state->blendFunc &&
+// !pipe->nonIsolatedGroup &&
+// bitmap->mode == splashModeMono1 && !pipe->destAlphaPtr
+void Splash::pipeRunAAMono1(SplashPipe *pipe) {
+  Guchar aSrc;
+  SplashColor cDest;
+  Guchar cResult0;
+
+  //----- read destination pixel
+  cDest[0] = (*pipe->destColorPtr & pipe->destColorMask) ? 0xff : 0x00;
+
+  //----- source alpha
+  aSrc = div255(pipe->aInput * pipe->shape);
+
+  //----- result color
+  // note: aDest = alpha2 = aResult = 0xff
+  cResult0 = state->grayTransfer[(Guchar)div255((0xff - aSrc) * cDest[0] +
+                                               aSrc * pipe->cSrc[0])];
+
+  //----- write destination pixel
+  if (state->screen->test(pipe->x, pipe->y, cResult0)) {
+    *pipe->destColorPtr |= pipe->destColorMask;
+  } else {
+    *pipe->destColorPtr &= ~pipe->destColorMask;
+  }
+  if (!(pipe->destColorMask >>= 1)) {
+    pipe->destColorMask = 0x80;
+    ++pipe->destColorPtr;
+  }
+
+  ++pipe->x;
+}
+
+// special case:
+// !pipe->pattern && !pipe->noTransparency && !state->softMask &&
+// pipe->usesShape && !pipe->alpha0Ptr && !state->blendFunc &&
+// !pipe->nonIsolatedGroup &&
+// bitmap->mode == splashModeMono8 && pipe->destAlphaPtr
+void Splash::pipeRunAAMono8(SplashPipe *pipe) {
+  Guchar aSrc, aDest, alpha2, aResult;
+  SplashColor cDest;
+  Guchar cResult0;
+
+  //----- read destination pixel
+  cDest[0] = *pipe->destColorPtr;
+  aDest = *pipe->destAlphaPtr;
+
+  //----- source alpha
+  aSrc = div255(pipe->aInput * pipe->shape);
+
+  //----- result alpha and non-isolated group element correction
+  aResult = aSrc + aDest - div255(aSrc * aDest);
+  alpha2 = aResult;
+
+  //----- result color
+  if (alpha2 == 0) {
+    cResult0 = 0;
+  } else {
+    cResult0 = state->grayTransfer[(Guchar)(((alpha2 - aSrc) * cDest[0] +
+                                            aSrc * pipe->cSrc[0]) / alpha2)];
+  }
+
+  //----- write destination pixel
+  *pipe->destColorPtr++ = cResult0;
+  *pipe->destAlphaPtr++ = aResult;
+
+  ++pipe->x;
+}
+
+// special case:
+// !pipe->pattern && !pipe->noTransparency && !state->softMask &&
+// pipe->usesShape && !pipe->alpha0Ptr && !state->blendFunc &&
+// !pipe->nonIsolatedGroup &&
+// bitmap->mode == splashModeRGB8 && pipe->destAlphaPtr
+void Splash::pipeRunAARGB8(SplashPipe *pipe) {
+  Guchar aSrc, aDest, alpha2, aResult;
+  SplashColor cDest;
+  Guchar cResult0, cResult1, cResult2;
+
+  //----- read destination pixel
+  cDest[0] = pipe->destColorPtr[0];
+  cDest[1] = pipe->destColorPtr[1];
+  cDest[2] = pipe->destColorPtr[2];
+  aDest = *pipe->destAlphaPtr;
+
+  //----- source alpha
+  aSrc = div255(pipe->aInput * pipe->shape);
+
+  //----- result alpha and non-isolated group element correction
+  aResult = aSrc + aDest - div255(aSrc * aDest);
+  alpha2 = aResult;
+
+  //----- result color
+  if (alpha2 == 0) {
+    cResult0 = 0;
+    cResult1 = 0;
+    cResult2 = 0;
+  } else {
+    cResult0 = state->rgbTransferR[(Guchar)(((alpha2 - aSrc) * cDest[0] +
+                                            aSrc * pipe->cSrc[0]) / alpha2)];
+    cResult1 = state->rgbTransferG[(Guchar)(((alpha2 - aSrc) * cDest[1] +
+                                            aSrc * pipe->cSrc[1]) / alpha2)];
+    cResult2 = state->rgbTransferB[(Guchar)(((alpha2 - aSrc) * cDest[2] +
+                                            aSrc * pipe->cSrc[2]) / alpha2)];
+  }
+
+  //----- write destination pixel
+  *pipe->destColorPtr++ = cResult0;
+  *pipe->destColorPtr++ = cResult1;
+  *pipe->destColorPtr++ = cResult2;
+  *pipe->destAlphaPtr++ = aResult;
+
+  ++pipe->x;
+}
+
+// special case:
+// !pipe->pattern && !pipe->noTransparency && !state->softMask &&
+// pipe->usesShape && !pipe->alpha0Ptr && !state->blendFunc &&
+// !pipe->nonIsolatedGroup &&
+// bitmap->mode == splashModeXBGR8 && pipe->destAlphaPtr
+void Splash::pipeRunAAXBGR8(SplashPipe *pipe) {
+  Guchar aSrc, aDest, alpha2, aResult;
+  SplashColor cDest;
+  Guchar cResult0, cResult1, cResult2;
+
+  //----- read destination pixel
+  cDest[0] = pipe->destColorPtr[2];
+  cDest[1] = pipe->destColorPtr[1];
+  cDest[2] = pipe->destColorPtr[0];
+  aDest = *pipe->destAlphaPtr;
+
+  //----- source alpha
+  aSrc = div255(pipe->aInput * pipe->shape);
+
+  //----- result alpha and non-isolated group element correction
+  aResult = aSrc + aDest - div255(aSrc * aDest);
+  alpha2 = aResult;
+
+  //----- result color
+  if (alpha2 == 0) {
+    cResult0 = 0;
+    cResult1 = 0;
+    cResult2 = 0;
+  } else {
+    cResult0 = state->rgbTransferR[(Guchar)(((alpha2 - aSrc) * cDest[0] +
+                                            aSrc * pipe->cSrc[0]) / alpha2)];
+    cResult1 = state->rgbTransferG[(Guchar)(((alpha2 - aSrc) * cDest[1] +
+                                            aSrc * pipe->cSrc[1]) / alpha2)];
+    cResult2 = state->rgbTransferB[(Guchar)(((alpha2 - aSrc) * cDest[2] +
+                                            aSrc * pipe->cSrc[2]) / alpha2)];
+  }
+
+  //----- write destination pixel
+  *pipe->destColorPtr++ = cResult2;
+  *pipe->destColorPtr++ = cResult1;
+  *pipe->destColorPtr++ = cResult0;
+  *pipe->destColorPtr++ = 255;
+  *pipe->destAlphaPtr++ = aResult;
+
+  ++pipe->x;
+}
+
+// special case:
+// !pipe->pattern && !pipe->noTransparency && !state->softMask &&
+// pipe->usesShape && !pipe->alpha0Ptr && !state->blendFunc &&
+// !pipe->nonIsolatedGroup &&
+// bitmap->mode == splashModeBGR8 && pipe->destAlphaPtr
+void Splash::pipeRunAABGR8(SplashPipe *pipe) {
+  Guchar aSrc, aDest, alpha2, aResult;
+  SplashColor cDest;
+  Guchar cResult0, cResult1, cResult2;
+
+  //----- read destination pixel
+  cDest[0] = pipe->destColorPtr[2];
+  cDest[1] = pipe->destColorPtr[1];
+  cDest[2] = pipe->destColorPtr[0];
+  aDest = *pipe->destAlphaPtr;
+
+  //----- source alpha
+  aSrc = div255(pipe->aInput * pipe->shape);
+
+  //----- result alpha and non-isolated group element correction
+  aResult = aSrc + aDest - div255(aSrc * aDest);
+  alpha2 = aResult;
+
+  //----- result color
+  if (alpha2 == 0) {
+    cResult0 = 0;
+    cResult1 = 0;
+    cResult2 = 0;
+  } else {
+    cResult0 = state->rgbTransferR[(Guchar)(((alpha2 - aSrc) * cDest[0] +
+                                            aSrc * pipe->cSrc[0]) / alpha2)];
+    cResult1 = state->rgbTransferG[(Guchar)(((alpha2 - aSrc) * cDest[1] +
+                                            aSrc * pipe->cSrc[1]) / alpha2)];
+    cResult2 = state->rgbTransferB[(Guchar)(((alpha2 - aSrc) * cDest[2] +
+                                            aSrc * pipe->cSrc[2]) / alpha2)];
+  }
+
+  //----- write destination pixel
+  *pipe->destColorPtr++ = cResult2;
+  *pipe->destColorPtr++ = cResult1;
+  *pipe->destColorPtr++ = cResult0;
+  *pipe->destAlphaPtr++ = aResult;
+
+  ++pipe->x;
+}
+
+#if SPLASH_CMYK
+// special case:
+// !pipe->pattern && !pipe->noTransparency && !state->softMask &&
+// pipe->usesShape && !pipe->alpha0Ptr && !state->blendFunc &&
+// !pipe->nonIsolatedGroup &&
+// bitmap->mode == splashModeCMYK8 && pipe->destAlphaPtr
+void Splash::pipeRunAACMYK8(SplashPipe *pipe) {
+  Guchar aSrc, aDest, alpha2, aResult;
+  SplashColor cDest;
+  Guchar cResult0, cResult1, cResult2, cResult3;
+
+  //----- read destination pixel
+  cDest[0] = pipe->destColorPtr[0];
+  cDest[1] = pipe->destColorPtr[1];
+  cDest[2] = pipe->destColorPtr[2];
+  cDest[3] = pipe->destColorPtr[3];
+  aDest = *pipe->destAlphaPtr;
+
+  //----- source alpha
+  aSrc = div255(pipe->aInput * pipe->shape);
+
+  //----- result alpha and non-isolated group element correction
+  aResult = aSrc + aDest - div255(aSrc * aDest);
+  alpha2 = aResult;
+
+  //----- result color
+  if (alpha2 == 0) {
+    cResult0 = 0;
+    cResult1 = 0;
+    cResult2 = 0;
+    cResult3 = 0;
+  } else {
+    cResult0 = state->cmykTransferC[(Guchar)(((alpha2 - aSrc) * cDest[0] +
+                                             aSrc * pipe->cSrc[0]) / alpha2)];
+    cResult1 = state->cmykTransferM[(Guchar)(((alpha2 - aSrc) * cDest[1] +
+                                             aSrc * pipe->cSrc[1]) / alpha2)];
+    cResult2 = state->cmykTransferY[(Guchar)(((alpha2 - aSrc) * cDest[2] +
+                                             aSrc * pipe->cSrc[2]) / alpha2)];
+    cResult3 = state->cmykTransferK[(Guchar)(((alpha2 - aSrc) * cDest[3] +
+                                             aSrc * pipe->cSrc[3]) / alpha2)];
+  }
+
+  //----- write destination pixel
+  if (state->overprintMask & 1) {
+    pipe->destColorPtr[0] = (state->overprintAdditive && pipe->shape != 0) ? 
+              std::min<int>(pipe->destColorPtr[0] + cResult0, 255) :
+              cResult0;
+  }
+  if (state->overprintMask & 2) {
+    pipe->destColorPtr[1] = (state->overprintAdditive && pipe->shape != 0) ? 
+              std::min<int>(pipe->destColorPtr[1] + cResult1, 255) :
+              cResult1;
+  }
+  if (state->overprintMask & 4) {
+    pipe->destColorPtr[2] = (state->overprintAdditive && pipe->shape != 0) ? 
+              std::min<int>(pipe->destColorPtr[2] + cResult2, 255) :
+              cResult2;
+  }
+  if (state->overprintMask & 8) {
+    pipe->destColorPtr[3] = (state->overprintAdditive && pipe->shape != 0) ? 
+              std::min<int>(pipe->destColorPtr[3] + cResult3, 255) :
+              cResult3;
+  }
+  pipe->destColorPtr += 4;
+  *pipe->destAlphaPtr++ = aResult;
+
+  ++pipe->x;
+}
+#endif
+
+inline void Splash::pipeSetXY(SplashPipe *pipe, int x, int y) {
+  pipe->x = x;
+  pipe->y = y;
+  if (state->softMask) {
+    pipe->softMaskPtr =
+        &state->softMask->data[y * state->softMask->rowSize + x];
+  }
+  switch (bitmap->mode) {
+  case splashModeMono1:
+    pipe->destColorPtr = &bitmap->data[y * bitmap->rowSize + (x >> 3)];
+    pipe->destColorMask = 0x80 >> (x & 7);
+    break;
+  case splashModeMono8:
+    pipe->destColorPtr = &bitmap->data[y * bitmap->rowSize + x];
+    break;
+  case splashModeRGB8:
+  case splashModeBGR8:
+    pipe->destColorPtr = &bitmap->data[y * bitmap->rowSize + 3 * x];
+    break;
+  case splashModeXBGR8:
+    pipe->destColorPtr = &bitmap->data[y * bitmap->rowSize + 4 * x];
+    break;
+#if SPLASH_CMYK
+  case splashModeCMYK8:
+    pipe->destColorPtr = &bitmap->data[y * bitmap->rowSize + 4 * x];
+    break;
+#endif
+  }
+  if (bitmap->alpha) {
+    pipe->destAlphaPtr = &bitmap->alpha[y * bitmap->width + x];
+  } else {
+    pipe->destAlphaPtr = NULL;
+  }
+  if (state->inNonIsolatedGroup && alpha0Bitmap->alpha) {
+    pipe->alpha0Ptr =
+        &alpha0Bitmap->alpha[(alpha0Y + y) * alpha0Bitmap->width +
+                            (alpha0X + x)];
+  } else {
+    pipe->alpha0Ptr = NULL;
+  }
+}
+
+inline void Splash::pipeIncX(SplashPipe *pipe) {
+  ++pipe->x;
+  if (state->softMask) {
+    ++pipe->softMaskPtr;
+  }
+  switch (bitmap->mode) {
+  case splashModeMono1:
+    if (!(pipe->destColorMask >>= 1)) {
+      pipe->destColorMask = 0x80;
+      ++pipe->destColorPtr;
+    }
+    break;
+  case splashModeMono8:
+    ++pipe->destColorPtr;
+    break;
+  case splashModeRGB8:
+  case splashModeBGR8:
+    pipe->destColorPtr += 3;
+    break;
+  case splashModeXBGR8:
+    pipe->destColorPtr += 4;
+    break;
+#if SPLASH_CMYK
+  case splashModeCMYK8:
+    pipe->destColorPtr += 4;
+    break;
+#endif
+  }
+  if (pipe->destAlphaPtr) {
+    ++pipe->destAlphaPtr;
+  }
+  if (pipe->alpha0Ptr) {
+    ++pipe->alpha0Ptr;
+  }
+}
+
+inline void Splash::drawPixel(SplashPipe *pipe, int x, int y, GBool noClip) {
+  if (unlikely(y < 0))
+    return;
+
+  if (noClip || state->clip->test(x, y)) {
+    pipeSetXY(pipe, x, y);
+    (this->*pipe->run)(pipe);
+    updateModX(x);
+    updateModY(y);
+  }
+}
+
+inline void Splash::drawAAPixelInit() {
+  aaBufY = -1;
+}
+
+inline void Splash::drawAAPixel(SplashPipe *pipe, int x, int y) {
+#if splashAASize == 4
+  static int bitCount4[16] = { 0, 1, 1, 2, 1, 2, 2, 3,
+                              1, 2, 2, 3, 2, 3, 3, 4 };
+  int w;
+#else
+  int xx, yy;
+#endif
+  SplashColorPtr p;
+  int x0, x1, t;
+
+  if (x < 0 || x >= bitmap->width ||
+      y < state->clip->getYMinI() || y > state->clip->getYMaxI()) {
+    return;
+  }
+
+  // update aaBuf
+  if (y != aaBufY) {
+    memset(aaBuf->getDataPtr(), 0xff,
+          aaBuf->getRowSize() * aaBuf->getHeight());
+    x0 = 0;
+    x1 = bitmap->width - 1;
+    state->clip->clipAALine(aaBuf, &x0, &x1, y);
+    aaBufY = y;
+  }
+
+  // compute the shape value
+#if splashAASize == 4
+  p = aaBuf->getDataPtr() + (x >> 1);
+  w = aaBuf->getRowSize();
+  if (x & 1) {
+    t = bitCount4[*p & 0x0f] + bitCount4[p[w] & 0x0f] +
+        bitCount4[p[2*w] & 0x0f] + bitCount4[p[3*w] & 0x0f];
+  } else {
+    t = bitCount4[*p >> 4] + bitCount4[p[w] >> 4] +
+        bitCount4[p[2*w] >> 4] + bitCount4[p[3*w] >> 4];
+  }
+#else
+  t = 0;
+  for (yy = 0; yy < splashAASize; ++yy) {
+    for (xx = 0; xx < splashAASize; ++xx) {
+      p = aaBuf->getDataPtr() + yy * aaBuf->getRowSize() +
+         ((x * splashAASize + xx) >> 3);
+      t += (*p >> (7 - ((x * splashAASize + xx) & 7))) & 1;
+    }
+  }
+#endif
+
+  // draw the pixel
+  if (t != 0) {
+    pipeSetXY(pipe, x, y);
+    pipe->shape = div255(aaGamma[t] * pipe->shape);
+    (this->*pipe->run)(pipe);
+    updateModX(x);
+    updateModY(y);
+  }
+}
+
+inline void Splash::drawSpan(SplashPipe *pipe, int x0, int x1, int y,
+                            GBool noClip) {
+  int x;
+
+  if (noClip) {
+    pipeSetXY(pipe, x0, y);
+    for (x = x0; x <= x1; ++x) {
+      (this->*pipe->run)(pipe);
+    }
+    updateModX(x0);
+    updateModX(x1);
+    updateModY(y);
+  } else {
+    if (x0 < state->clip->getXMinI()) {
+      x0 = state->clip->getXMinI();
+    }
+    if (x1 > state->clip->getXMaxI()) {
+      x1 = state->clip->getXMaxI();
+    }
+    pipeSetXY(pipe, x0, y);
+    for (x = x0; x <= x1; ++x) {
+      if (state->clip->test(x, y)) {
+       (this->*pipe->run)(pipe);
+       updateModX(x);
+       updateModY(y);
+      } else {
+       pipeIncX(pipe);
+      }
+    }
+  }
+}
+
+inline void Splash::drawAALine(SplashPipe *pipe, int x0, int x1, int y) {
+#if splashAASize == 4
+  static int bitCount4[16] = { 0, 1, 1, 2, 1, 2, 2, 3,
+                              1, 2, 2, 3, 2, 3, 3, 4 };
+  SplashColorPtr p0, p1, p2, p3;
+  int t;
+#else
+  SplashColorPtr p;
+  int xx, yy, t;
+#endif
+  int x;
+
+#if splashAASize == 4
+  p0 = aaBuf->getDataPtr() + (x0 >> 1);
+  p1 = p0 + aaBuf->getRowSize();
+  p2 = p1 + aaBuf->getRowSize();
+  p3 = p2 + aaBuf->getRowSize();
+#endif
+  pipeSetXY(pipe, x0, y);
+  for (x = x0; x <= x1; ++x) {
+
+    // compute the shape value
+#if splashAASize == 4
+    if (x & 1) {
+      t = bitCount4[*p0 & 0x0f] + bitCount4[*p1 & 0x0f] +
+         bitCount4[*p2 & 0x0f] + bitCount4[*p3 & 0x0f];
+      ++p0; ++p1; ++p2; ++p3;
+    } else {
+      t = bitCount4[*p0 >> 4] + bitCount4[*p1 >> 4] +
+         bitCount4[*p2 >> 4] + bitCount4[*p3 >> 4];
+    }
+#else
+    t = 0;
+    for (yy = 0; yy < splashAASize; ++yy) {
+      for (xx = 0; xx < splashAASize; ++xx) {
+       p = aaBuf->getDataPtr() + yy * aaBuf->getRowSize() +
+           ((x * splashAASize + xx) >> 3);
+       t += (*p >> (7 - ((x * splashAASize + xx) & 7))) & 1;
+      }
+    }
+#endif
+
+    if (t != 0) {
+      pipe->shape = aaGamma[t];
+      (this->*pipe->run)(pipe);
+      updateModX(x);
+      updateModY(y);
+    } else {
+      pipeIncX(pipe);
+    }
+  }
+}
+
+//------------------------------------------------------------------------
+
+// Transform a point from user space to device space.
+inline void Splash::transform(SplashCoord *matrix,
+                             SplashCoord xi, SplashCoord yi,
+                             SplashCoord *xo, SplashCoord *yo) {
+  //                          [ m[0] m[1] 0 ]
+  // [xo yo 1] = [xi yi 1] *  [ m[2] m[3] 0 ]
+  //                          [ m[4] m[5] 1 ]
+  *xo = xi * matrix[0] + yi * matrix[2] + matrix[4];
+  *yo = xi * matrix[1] + yi * matrix[3] + matrix[5];
+}
+
+//------------------------------------------------------------------------
+// Splash
+//------------------------------------------------------------------------
+
+Splash::Splash(SplashBitmap *bitmapA, GBool vectorAntialiasA,
+              SplashScreenParams *screenParams) {
+  int i;
+
+  bitmap = bitmapA;
+  vectorAntialias = vectorAntialiasA;
+  inShading = gFalse;
+  state = new SplashState(bitmap->width, bitmap->height, vectorAntialias,
+                         screenParams);
+  if (vectorAntialias) {
+    aaBuf = new SplashBitmap(splashAASize * bitmap->width, splashAASize,
+                            1, splashModeMono1, gFalse);
+    for (i = 0; i <= splashAASize * splashAASize; ++i) {
+      aaGamma[i] = (Guchar)splashRound(
+                      splashPow((SplashCoord)i /
+                                (SplashCoord)(splashAASize * splashAASize),
+                                splashAAGamma) * 255);
+    }
+  } else {
+    aaBuf = NULL;
+  }
+  minLineWidth = 0;
+  clearModRegion();
+  debugMode = gFalse;
+}
+
+Splash::Splash(SplashBitmap *bitmapA, GBool vectorAntialiasA,
+              SplashScreen *screenA) {
+  int i;
+
+  bitmap = bitmapA;
+  inShading = gFalse;
+  vectorAntialias = vectorAntialiasA;
+  state = new SplashState(bitmap->width, bitmap->height, vectorAntialias,
+                         screenA);
+  if (vectorAntialias) {
+    aaBuf = new SplashBitmap(splashAASize * bitmap->width, splashAASize,
+                            1, splashModeMono1, gFalse);
+    for (i = 0; i <= splashAASize * splashAASize; ++i) {
+      aaGamma[i] = (Guchar)splashRound(
+                      splashPow((SplashCoord)i /
+                                (SplashCoord)(splashAASize * splashAASize),
+                                splashAAGamma) * 255);
+    }
+  } else {
+    aaBuf = NULL;
+  }
+  minLineWidth = 0;
+  clearModRegion();
+  debugMode = gFalse;
+}
+
+Splash::~Splash() {
+  while (state->next) {
+    restoreState();
+  }
+  delete state;
+  if (vectorAntialias) {
+    delete aaBuf;
+  }
+}
+
+//------------------------------------------------------------------------
+// state read
+//------------------------------------------------------------------------
+
+SplashCoord *Splash::getMatrix() {
+  return state->matrix;
+}
+
+SplashPattern *Splash::getStrokePattern() {
+  return state->strokePattern;
+}
+
+SplashPattern *Splash::getFillPattern() {
+  return state->fillPattern;
+}
+
+SplashScreen *Splash::getScreen() {
+  return state->screen;
+}
+
+SplashBlendFunc Splash::getBlendFunc() {
+  return state->blendFunc;
+}
+
+SplashCoord Splash::getStrokeAlpha() {
+  return state->strokeAlpha;
+}
+
+SplashCoord Splash::getFillAlpha() {
+  return state->fillAlpha;
+}
+
+SplashCoord Splash::getLineWidth() {
+  return state->lineWidth;
+}
+
+int Splash::getLineCap() {
+  return state->lineCap;
+}
+
+int Splash::getLineJoin() {
+  return state->lineJoin;
+}
+
+SplashCoord Splash::getMiterLimit() {
+  return state->miterLimit;
+}
+
+SplashCoord Splash::getFlatness() {
+  return state->flatness;
+}
+
+SplashCoord *Splash::getLineDash() {
+  return state->lineDash;
+}
+
+int Splash::getLineDashLength() {
+  return state->lineDashLength;
+}
+
+SplashCoord Splash::getLineDashPhase() {
+  return state->lineDashPhase;
+}
+
+GBool Splash::getStrokeAdjust() {
+  return state->strokeAdjust;
+}
+
+SplashClip *Splash::getClip() {
+  return state->clip;
+}
+
+SplashBitmap *Splash::getSoftMask() {
+  return state->softMask;
+}
+
+GBool Splash::getInNonIsolatedGroup() {
+  return state->inNonIsolatedGroup;
+}
+
+//------------------------------------------------------------------------
+// state write
+//------------------------------------------------------------------------
+
+void Splash::setMatrix(SplashCoord *matrix) {
+  memcpy(state->matrix, matrix, 6 * sizeof(SplashCoord));
+}
+
+void Splash::setStrokePattern(SplashPattern *strokePattern) {
+  state->setStrokePattern(strokePattern);
+}
+
+void Splash::setFillPattern(SplashPattern *fillPattern) {
+  state->setFillPattern(fillPattern);
+}
+
+void Splash::setScreen(SplashScreen *screen) {
+  state->setScreen(screen);
+}
+
+void Splash::setBlendFunc(SplashBlendFunc func) {
+  state->blendFunc = func;
+}
+
+void Splash::setStrokeAlpha(SplashCoord alpha) {
+  state->strokeAlpha = alpha;
+}
+
+void Splash::setFillAlpha(SplashCoord alpha) {
+  state->fillAlpha = alpha;
+}
+
+void Splash::setFillOverprint(GBool fop) {
+  state->fillOverprint = fop;
+}
+
+void Splash::setStrokeOverprint(GBool gop) {
+  state->strokeOverprint = gop;
+}
+
+void Splash::setOverprintMode(int opm) {
+  state->overprintMode = opm;
+}
+
+void Splash::setLineWidth(SplashCoord lineWidth) {
+  state->lineWidth = lineWidth;
+}
+
+void Splash::setLineCap(int lineCap) {
+  state->lineCap = lineCap;
+}
+
+void Splash::setLineJoin(int lineJoin) {
+  state->lineJoin = lineJoin;
+}
+
+void Splash::setMiterLimit(SplashCoord miterLimit) {
+  state->miterLimit = miterLimit;
+}
+
+void Splash::setFlatness(SplashCoord flatness) {
+  if (flatness < 1) {
+    state->flatness = 1;
+  } else {
+    state->flatness = flatness;
+  }
+}
+
+void Splash::setLineDash(SplashCoord *lineDash, int lineDashLength,
+                        SplashCoord lineDashPhase) {
+  state->setLineDash(lineDash, lineDashLength, lineDashPhase);
+}
+
+void Splash::setStrokeAdjust(GBool strokeAdjust) {
+  state->strokeAdjust = strokeAdjust;
+}
+
+void Splash::clipResetToRect(SplashCoord x0, SplashCoord y0,
+                            SplashCoord x1, SplashCoord y1) {
+  state->clip->resetToRect(x0, y0, x1, y1);
+}
+
+SplashError Splash::clipToRect(SplashCoord x0, SplashCoord y0,
+                              SplashCoord x1, SplashCoord y1) {
+  return state->clip->clipToRect(x0, y0, x1, y1);
+}
+
+SplashError Splash::clipToPath(SplashPath *path, GBool eo) {
+  return state->clip->clipToPath(path, state->matrix, state->flatness, eo);
+}
+
+void Splash::setSoftMask(SplashBitmap *softMask) {
+  state->setSoftMask(softMask);
+}
+
+void Splash::setInNonIsolatedGroup(SplashBitmap *alpha0BitmapA,
+                                  int alpha0XA, int alpha0YA) {
+  alpha0Bitmap = alpha0BitmapA;
+  alpha0X = alpha0XA;
+  alpha0Y = alpha0YA;
+  state->inNonIsolatedGroup = gTrue;
+}
+
+void Splash::setTransfer(Guchar *red, Guchar *green, Guchar *blue,
+                        Guchar *gray) {
+  state->setTransfer(red, green, blue, gray);
+}
+
+void Splash::setOverprintMask(Guint overprintMask, GBool additive) {
+  state->overprintMask = overprintMask;
+  state->overprintAdditive = additive;
+}
+
+//------------------------------------------------------------------------
+// state save/restore
+//------------------------------------------------------------------------
+
+void Splash::saveState() {
+  SplashState *newState;
+
+  newState = state->copy();
+  newState->next = state;
+  state = newState;
+}
+
+SplashError Splash::restoreState() {
+  SplashState *oldState;
+
+  if (!state->next) {
+    return splashErrNoSave;
+  }
+  oldState = state;
+  state = state->next;
+  delete oldState;
+  return splashOk;
+}
+
+//------------------------------------------------------------------------
+// drawing operations
+//------------------------------------------------------------------------
+
+void Splash::clear(SplashColorPtr color, Guchar alpha) {
+  SplashColorPtr row, p;
+  Guchar mono;
+  int x, y;
+
+  switch (bitmap->mode) {
+  case splashModeMono1:
+    mono = (color[0] & 0x80) ? 0xff : 0x00;
+    if (bitmap->rowSize < 0) {
+      memset(bitmap->data + bitmap->rowSize * (bitmap->height - 1),
+            mono, -bitmap->rowSize * bitmap->height);
+    } else {
+      memset(bitmap->data, mono, bitmap->rowSize * bitmap->height);
+    }
+    break;
+  case splashModeMono8:
+    if (bitmap->rowSize < 0) {
+      memset(bitmap->data + bitmap->rowSize * (bitmap->height - 1),
+            color[0], -bitmap->rowSize * bitmap->height);
+    } else {
+      memset(bitmap->data, color[0], bitmap->rowSize * bitmap->height);
+    }
+    break;
+  case splashModeRGB8:
+    if (color[0] == color[1] && color[1] == color[2]) {
+      if (bitmap->rowSize < 0) {
+       memset(bitmap->data + bitmap->rowSize * (bitmap->height - 1),
+              color[0], -bitmap->rowSize * bitmap->height);
+      } else {
+       memset(bitmap->data, color[0], bitmap->rowSize * bitmap->height);
+      }
+    } else {
+      row = bitmap->data;
+      for (y = 0; y < bitmap->height; ++y) {
+       p = row;
+       for (x = 0; x < bitmap->width; ++x) {
+         *p++ = color[2];
+         *p++ = color[1];
+         *p++ = color[0];
+       }
+       row += bitmap->rowSize;
+      }
+    }
+    break;
+  case splashModeXBGR8:
+    if (color[0] == color[1] && color[1] == color[2]) {
+      if (bitmap->rowSize < 0) {
+       memset(bitmap->data + bitmap->rowSize * (bitmap->height - 1),
+              color[0], -bitmap->rowSize * bitmap->height);
+      } else {
+       memset(bitmap->data, color[0], bitmap->rowSize * bitmap->height);
+      }
+    } else {
+      row = bitmap->data;
+      for (y = 0; y < bitmap->height; ++y) {
+       p = row;
+       for (x = 0; x < bitmap->width; ++x) {
+         *p++ = color[0];
+         *p++ = color[1];
+         *p++ = color[2];
+         *p++ = 255;
+       }
+       row += bitmap->rowSize;
+      }
+    }
+    break;
+  case splashModeBGR8:
+    if (color[0] == color[1] && color[1] == color[2]) {
+      if (bitmap->rowSize < 0) {
+       memset(bitmap->data + bitmap->rowSize * (bitmap->height - 1),
+              color[0], -bitmap->rowSize * bitmap->height);
+      } else {
+       memset(bitmap->data, color[0], bitmap->rowSize * bitmap->height);
+      }
+    } else {
+      row = bitmap->data;
+      for (y = 0; y < bitmap->height; ++y) {
+       p = row;
+       for (x = 0; x < bitmap->width; ++x) {
+         *p++ = color[0];
+         *p++ = color[1];
+         *p++ = color[2];
+       }
+       row += bitmap->rowSize;
+      }
+    }
+    break;
+#if SPLASH_CMYK
+  case splashModeCMYK8:
+    if (color[0] == color[1] && color[1] == color[2] && color[2] == color[3]) {
+      if (bitmap->rowSize < 0) {
+       memset(bitmap->data + bitmap->rowSize * (bitmap->height - 1),
+              color[0], -bitmap->rowSize * bitmap->height);
+      } else {
+       memset(bitmap->data, color[0], bitmap->rowSize * bitmap->height);
+      }
+    } else {
+      row = bitmap->data;
+      for (y = 0; y < bitmap->height; ++y) {
+       p = row;
+       for (x = 0; x < bitmap->width; ++x) {
+         *p++ = color[0];
+         *p++ = color[1];
+         *p++ = color[2];
+         *p++ = color[3];
+       }
+       row += bitmap->rowSize;
+      }
+    }
+    break;
+#endif
+  }
+
+  if (bitmap->alpha) {
+    memset(bitmap->alpha, alpha, bitmap->width * bitmap->height);
+  }
+
+  updateModX(0);
+  updateModY(0);
+  updateModX(bitmap->width - 1);
+  updateModY(bitmap->height - 1);
+}
+
+SplashError Splash::stroke(SplashPath *path) {
+  SplashPath *path2, *dPath;
+  SplashCoord d1, d2, t1, t2, w;
+
+  if (debugMode) {
+    printf("stroke [dash:%d] [width:%.2f]:\n",
+          state->lineDashLength, (double)state->lineWidth);
+    dumpPath(path);
+  }
+  opClipRes = splashClipAllOutside;
+  if (path->length == 0) {
+    return splashErrEmptyPath;
+  }
+  path2 = flattenPath(path, state->matrix, state->flatness);
+  if (state->lineDashLength > 0) {
+    dPath = makeDashedPath(path2);
+    delete path2;
+    path2 = dPath;
+    if (path2->length == 0) {
+      delete path2;
+      return splashErrEmptyPath;
+    }
+  }
+
+  // transform a unit square, and take the half the max of the two
+  // diagonals; the product of this number and the line width is the
+  // (approximate) transformed line width
+  t1 = state->matrix[0] + state->matrix[2];
+  t2 = state->matrix[1] + state->matrix[3];
+  d1 = t1 * t1 + t2 * t2;
+  t1 = state->matrix[0] - state->matrix[2];
+  t2 = state->matrix[1] - state->matrix[3];
+  d2 = t1 * t1 + t2 * t2;
+  if (d2 > d1) {
+    d1 = d2;
+  }
+  d1 *= 0.5;
+  if (d1 > 0 &&
+      d1 * state->lineWidth * state->lineWidth < minLineWidth * minLineWidth) {
+    w = minLineWidth / splashSqrt(d1);
+    strokeWide(path2, w);
+  } else if (bitmap->mode == splashModeMono1) {
+    // this gets close to Adobe's behavior in mono mode
+    if (d1 <= 2) {
+      strokeNarrow(path2);
+    } else {
+      strokeWide(path2, state->lineWidth);
+    }
+  } else {
+    if (state->lineWidth == 0) {
+      strokeNarrow(path2);
+    } else {
+      strokeWide(path2, state->lineWidth);
+    }
+  }
+
+  delete path2;
+  return splashOk;
+}
+
+void Splash::strokeNarrow(SplashPath *path) {
+  SplashPipe pipe;
+  SplashXPath *xPath;
+  SplashXPathSeg *seg;
+  int x0, x1, y0, y1, xa, xb, y;
+  SplashCoord dxdy;
+  SplashClipResult clipRes;
+  int nClipRes[3];
+  int i;
+
+  nClipRes[0] = nClipRes[1] = nClipRes[2] = 0;
+
+  xPath = new SplashXPath(path, state->matrix, state->flatness, gFalse);
+
+  pipeInit(&pipe, 0, 0, state->strokePattern, NULL,
+          (Guchar)splashRound(state->strokeAlpha * 255),
+          gFalse, gFalse);
+
+  for (i = 0, seg = xPath->segs; i < xPath->length; ++i, ++seg) {
+    if (seg->y0 <= seg->y1) {
+      y0 = splashFloor(seg->y0);
+      y1 = splashFloor(seg->y1);
+      x0 = splashFloor(seg->x0);
+      x1 = splashFloor(seg->x1);
+    } else {
+      y0 = splashFloor(seg->y1);
+      y1 = splashFloor(seg->y0);
+      x0 = splashFloor(seg->x1);
+      x1 = splashFloor(seg->x0);
+    }
+    if ((clipRes = state->clip->testRect(x0 <= x1 ? x0 : x1, y0,
+                                        x0 <= x1 ? x1 : x0, y1))
+       != splashClipAllOutside) {
+      if (y0 == y1) {
+       if (x0 <= x1) {
+         drawSpan(&pipe, x0, x1, y0, clipRes == splashClipAllInside);
+       } else {
+         drawSpan(&pipe, x1, x0, y0, clipRes == splashClipAllInside);
+       }
+      } else {
+       dxdy = seg->dxdy;
+       if (y0 < state->clip->getYMinI()) {
+         y0 = state->clip->getYMinI();
+         x0 = splashFloor(seg->x0 + ((SplashCoord)y0 - seg->y0) * dxdy);
+       }
+       if (y1 > state->clip->getYMaxI()) {
+         y1 = state->clip->getYMaxI();
+         x1 = splashFloor(seg->x0 + ((SplashCoord)y1 - seg->y0) * dxdy);
+       }
+       if (x0 <= x1) {
+         xa = x0;
+         for (y = y0; y <= y1; ++y) {
+           if (y < y1) {
+             xb = splashFloor(seg->x0 +
+                              ((SplashCoord)y + 1 - seg->y0) * dxdy);
+           } else {
+             xb = x1 + 1;
+           }
+           if (xa == xb) {
+             drawPixel(&pipe, xa, y, clipRes == splashClipAllInside);
+           } else {
+             drawSpan(&pipe, xa, xb - 1, y, clipRes == splashClipAllInside);
+           }
+           xa = xb;
+         }
+       } else {
+         xa = x0;
+         for (y = y0; y <= y1; ++y) {
+           if (y < y1) {
+             xb = splashFloor(seg->x0 +
+                              ((SplashCoord)y + 1 - seg->y0) * dxdy);
+           } else {
+             xb = x1 - 1;
+           }
+           if (xa == xb) {
+             drawPixel(&pipe, xa, y, clipRes == splashClipAllInside);
+           } else {
+             drawSpan(&pipe, xb + 1, xa, y, clipRes == splashClipAllInside);
+           }
+           xa = xb;
+         }
+       }
+      }
+    }
+    ++nClipRes[clipRes];
+  }
+  if (nClipRes[splashClipPartial] ||
+      (nClipRes[splashClipAllInside] && nClipRes[splashClipAllOutside])) {
+    opClipRes = splashClipPartial;
+  } else if (nClipRes[splashClipAllInside]) {
+    opClipRes = splashClipAllInside;
+  } else {
+    opClipRes = splashClipAllOutside;
+  }
+
+  delete xPath;
+}
+
+void Splash::strokeWide(SplashPath *path, SplashCoord w) {
+  SplashPath *path2;
+
+  path2 = makeStrokePath(path, w, gFalse);
+  fillWithPattern(path2, gFalse, state->strokePattern, state->strokeAlpha);
+  delete path2;
+}
+
+SplashPath *Splash::flattenPath(SplashPath *path, SplashCoord *matrix,
+                               SplashCoord flatness) {
+  SplashPath *fPath;
+  SplashCoord flatness2;
+  Guchar flag;
+  int i;
+
+  fPath = new SplashPath();
+#if USE_FIXEDPOINT
+  flatness2 = flatness;
+#else
+  flatness2 = flatness * flatness;
+#endif
+  i = 0;
+  while (i < path->length) {
+    flag = path->flags[i];
+    if (flag & splashPathFirst) {
+      fPath->moveTo(path->pts[i].x, path->pts[i].y);
+      ++i;
+    } else {
+      if (flag & splashPathCurve) {
+       flattenCurve(path->pts[i-1].x, path->pts[i-1].y,
+                    path->pts[i  ].x, path->pts[i  ].y,
+                    path->pts[i+1].x, path->pts[i+1].y,
+                    path->pts[i+2].x, path->pts[i+2].y,
+                    matrix, flatness2, fPath);
+       i += 3;
+      } else {
+       fPath->lineTo(path->pts[i].x, path->pts[i].y);
+       ++i;
+      }
+      if (path->flags[i-1] & splashPathClosed) {
+       fPath->close();
+      }
+    }
+  }
+  return fPath;
+}
+
+void Splash::flattenCurve(SplashCoord x0, SplashCoord y0,
+                         SplashCoord x1, SplashCoord y1,
+                         SplashCoord x2, SplashCoord y2,
+                         SplashCoord x3, SplashCoord y3,
+                         SplashCoord *matrix, SplashCoord flatness2,
+                         SplashPath *fPath) {
+  SplashCoord cx[splashMaxCurveSplits + 1][3];
+  SplashCoord cy[splashMaxCurveSplits + 1][3];
+  int cNext[splashMaxCurveSplits + 1];
+  SplashCoord xl0, xl1, xl2, xr0, xr1, xr2, xr3, xx1, xx2, xh;
+  SplashCoord yl0, yl1, yl2, yr0, yr1, yr2, yr3, yy1, yy2, yh;
+  SplashCoord dx, dy, mx, my, tx, ty, d1, d2;
+  int p1, p2, p3;
+
+  // initial segment
+  p1 = 0;
+  p2 = splashMaxCurveSplits;
+  cx[p1][0] = x0;  cy[p1][0] = y0;
+  cx[p1][1] = x1;  cy[p1][1] = y1;
+  cx[p1][2] = x2;  cy[p1][2] = y2;
+  cx[p2][0] = x3;  cy[p2][0] = y3;
+  cNext[p1] = p2;
+
+  while (p1 < splashMaxCurveSplits) {
+
+    // get the next segment
+    xl0 = cx[p1][0];  yl0 = cy[p1][0];
+    xx1 = cx[p1][1];  yy1 = cy[p1][1];
+    xx2 = cx[p1][2];  yy2 = cy[p1][2];
+    p2 = cNext[p1];
+    xr3 = cx[p2][0];  yr3 = cy[p2][0];
+
+    // compute the distances (in device space) from the control points
+    // to the midpoint of the straight line (this is a bit of a hack,
+    // but it's much faster than computing the actual distances to the
+    // line)
+    transform(matrix, (xl0 + xr3) * 0.5, (yl0 + yr3) * 0.5, &mx, &my);
+    transform(matrix, xx1, yy1, &tx, &ty);
+#if USE_FIXEDPOINT
+    d1 = splashDist(tx, ty, mx, my);
+#else
+    dx = tx - mx;
+    dy = ty - my;
+    d1 = dx*dx + dy*dy;
+#endif
+    transform(matrix, xx2, yy2, &tx, &ty);
+#if USE_FIXEDPOINT
+    d2 = splashDist(tx, ty, mx, my);
+#else
+    dx = tx - mx;
+    dy = ty - my;
+    d2 = dx*dx + dy*dy;
+#endif
+
+    // if the curve is flat enough, or no more subdivisions are
+    // allowed, add the straight line segment
+    if (p2 - p1 == 1 || (d1 <= flatness2 && d2 <= flatness2)) {
+      fPath->lineTo(xr3, yr3);
+      p1 = p2;
+
+    // otherwise, subdivide the curve
+    } else {
+      xl1 = splashAvg(xl0, xx1);
+      yl1 = splashAvg(yl0, yy1);
+      xh = splashAvg(xx1, xx2);
+      yh = splashAvg(yy1, yy2);
+      xl2 = splashAvg(xl1, xh);
+      yl2 = splashAvg(yl1, yh);
+      xr2 = splashAvg(xx2, xr3);
+      yr2 = splashAvg(yy2, yr3);
+      xr1 = splashAvg(xh, xr2);
+      yr1 = splashAvg(yh, yr2);
+      xr0 = splashAvg(xl2, xr1);
+      yr0 = splashAvg(yl2, yr1);
+      // add the new subdivision points
+      p3 = (p1 + p2) / 2;
+      cx[p1][1] = xl1;  cy[p1][1] = yl1;
+      cx[p1][2] = xl2;  cy[p1][2] = yl2;
+      cNext[p1] = p3;
+      cx[p3][0] = xr0;  cy[p3][0] = yr0;
+      cx[p3][1] = xr1;  cy[p3][1] = yr1;
+      cx[p3][2] = xr2;  cy[p3][2] = yr2;
+      cNext[p3] = p2;
+    }
+  }
+}
+
+SplashPath *Splash::makeDashedPath(SplashPath *path) {
+  SplashPath *dPath;
+  SplashCoord lineDashTotal;
+  SplashCoord lineDashStartPhase, lineDashDist, segLen;
+  SplashCoord x0, y0, x1, y1, xa, ya;
+  GBool lineDashStartOn, lineDashOn, newPath;
+  int lineDashStartIdx, lineDashIdx;
+  int i, j, k;
+
+  lineDashTotal = 0;
+  for (i = 0; i < state->lineDashLength; ++i) {
+    lineDashTotal += state->lineDash[i];
+  }
+  // Acrobat simply draws nothing if the dash array is [0]
+  if (lineDashTotal == 0) {
+    return new SplashPath();
+  }
+  lineDashStartPhase = state->lineDashPhase;
+  i = splashFloor(lineDashStartPhase / lineDashTotal);
+  lineDashStartPhase -= (SplashCoord)i * lineDashTotal;
+  lineDashStartOn = gTrue;
+  lineDashStartIdx = 0;
+  if (lineDashStartPhase > 0) {
+    while (lineDashStartPhase >= state->lineDash[lineDashStartIdx]) {
+      lineDashStartOn = !lineDashStartOn;
+      lineDashStartPhase -= state->lineDash[lineDashStartIdx];
+      ++lineDashStartIdx;
+    }
+  }
+
+  dPath = new SplashPath();
+
+  // process each subpath
+  i = 0;
+  while (i < path->length) {
+
+    // find the end of the subpath
+    for (j = i;
+        j < path->length - 1 && !(path->flags[j] & splashPathLast);
+        ++j) ;
+
+    // initialize the dash parameters
+    lineDashOn = lineDashStartOn;
+    lineDashIdx = lineDashStartIdx;
+    lineDashDist = state->lineDash[lineDashIdx] - lineDashStartPhase;
+
+    // process each segment of the subpath
+    newPath = gTrue;
+    for (k = i; k < j; ++k) {
+
+      // grab the segment
+      x0 = path->pts[k].x;
+      y0 = path->pts[k].y;
+      x1 = path->pts[k+1].x;
+      y1 = path->pts[k+1].y;
+      segLen = splashDist(x0, y0, x1, y1);
+
+      // process the segment
+      while (segLen > 0) {
+
+       if (lineDashDist >= segLen) {
+         if (lineDashOn) {
+           if (newPath) {
+             dPath->moveTo(x0, y0);
+             newPath = gFalse;
+           }
+           dPath->lineTo(x1, y1);
+         }
+         lineDashDist -= segLen;
+         segLen = 0;
+
+       } else {
+         xa = x0 + (lineDashDist / segLen) * (x1 - x0);
+         ya = y0 + (lineDashDist / segLen) * (y1 - y0);
+         if (lineDashOn) {
+           if (newPath) {
+             dPath->moveTo(x0, y0);
+             newPath = gFalse;
+           }
+           dPath->lineTo(xa, ya);
+         }
+         x0 = xa;
+         y0 = ya;
+         segLen -= lineDashDist;
+         lineDashDist = 0;
+       }
+
+       // get the next entry in the dash array
+       if (lineDashDist <= 0) {
+         lineDashOn = !lineDashOn;
+         if (++lineDashIdx == state->lineDashLength) {
+           lineDashIdx = 0;
+         }
+         lineDashDist = state->lineDash[lineDashIdx];
+         newPath = gTrue;
+       }
+      }
+    }
+    i = j + 1;
+  }
+  
+  if (dPath->length == 0) {
+    GBool allSame = gTrue;
+    for (int i = 0; allSame && i < path->length - 1; ++i) {
+      allSame = path->pts[i].x == path->pts[i + 1].x && path->pts[i].y == path->pts[i + 1].y;
+    }
+    if (allSame) {
+      x0 = path->pts[0].x;
+      y0 = path->pts[0].y;
+      dPath->moveTo(x0, y0);
+      dPath->lineTo(x0, y0);
+    }
+  }
+
+  return dPath;
+}
+
+SplashError Splash::fill(SplashPath *path, GBool eo) {
+  if (debugMode) {
+    printf("fill [eo:%d]:\n", eo);
+    dumpPath(path);
+  }
+  return fillWithPattern(path, eo, state->fillPattern, state->fillAlpha);
+}
+
+SplashError Splash::fillWithPattern(SplashPath *path, GBool eo,
+                                   SplashPattern *pattern,
+                                   SplashCoord alpha) {
+  SplashPipe pipe;
+  SplashXPath *xPath;
+  SplashXPathScanner *scanner;
+  int xMinI, yMinI, xMaxI, yMaxI, x0, x1, y;
+  SplashClipResult clipRes, clipRes2;
+
+  if (path->length == 0) {
+    return splashErrEmptyPath;
+  }
+  if (pathAllOutside(path)) {
+    opClipRes = splashClipAllOutside;
+    return splashOk;
+  }
+
+  // add stroke adjustment hints for filled rectangles -- this only
+  // applies to paths that consist of a single subpath
+  // (this appears to match Acrobat's behavior)
+  if (state->strokeAdjust && !path->hints) {
+    int n;
+    n = path->getLength();
+    if (n == 4 &&
+       !(path->flags[0] & splashPathClosed) &&
+       !(path->flags[1] & splashPathLast) &&
+       !(path->flags[2] & splashPathLast)) {
+      path->close(gTrue);
+      path->addStrokeAdjustHint(0, 2, 0, 4);
+      path->addStrokeAdjustHint(1, 3, 0, 4);
+    } else if (n == 5 &&
+              (path->flags[0] & splashPathClosed) &&
+              !(path->flags[1] & splashPathLast) &&
+              !(path->flags[2] & splashPathLast) &&
+              !(path->flags[3] & splashPathLast)) {
+      path->addStrokeAdjustHint(0, 2, 0, 4);
+      path->addStrokeAdjustHint(1, 3, 0, 4);
+    }
+  }
+
+  xPath = new SplashXPath(path, state->matrix, state->flatness, gTrue);
+  if (vectorAntialias && !inShading) {
+    xPath->aaScale();
+  }
+  xPath->sort();
+  yMinI = state->clip->getYMinI();
+  yMaxI = state->clip->getYMaxI();
+  if (vectorAntialias && !inShading) {
+    yMinI = yMinI * splashAASize;
+    yMaxI = (yMaxI + 1) * splashAASize - 1;
+  }
+  scanner = new SplashXPathScanner(xPath, eo, yMinI, yMaxI);
+
+  // get the min and max x and y values
+  if (vectorAntialias && !inShading) {
+    scanner->getBBoxAA(&xMinI, &yMinI, &xMaxI, &yMaxI);
+  } else {
+    scanner->getBBox(&xMinI, &yMinI, &xMaxI, &yMaxI);
+  }
+
+  // check clipping
+  if ((clipRes = state->clip->testRect(xMinI, yMinI, xMaxI, yMaxI))
+      != splashClipAllOutside) {
+    if (scanner->hasPartialClip()) {
+      clipRes = splashClipPartial;
+    }
+
+    pipeInit(&pipe, 0, yMinI, pattern, NULL, (Guchar)splashRound(alpha * 255),
+            vectorAntialias && !inShading, gFalse);
+
+    // draw the spans
+    if (vectorAntialias && !inShading) {
+      for (y = yMinI; y <= yMaxI; ++y) {
+       scanner->renderAALine(aaBuf, &x0, &x1, y);
+       if (clipRes != splashClipAllInside) {
+         state->clip->clipAALine(aaBuf, &x0, &x1, y);
+       }
+       drawAALine(&pipe, x0, x1, y);
+      }
+    } else {
+      for (y = yMinI; y <= yMaxI; ++y) {
+       while (scanner->getNextSpan(y, &x0, &x1)) {
+         if (clipRes == splashClipAllInside) {
+           drawSpan(&pipe, x0, x1, y, gTrue);
+         } else {
+           // limit the x range
+           if (x0 < state->clip->getXMinI()) {
+             x0 = state->clip->getXMinI();
+           }
+           if (x1 > state->clip->getXMaxI()) {
+             x1 = state->clip->getXMaxI();
+           }
+           clipRes2 = state->clip->testSpan(x0, x1, y);
+           drawSpan(&pipe, x0, x1, y, clipRes2 == splashClipAllInside);
+         }
+       }
+      }
+    }
+  }
+  opClipRes = clipRes;
+
+  delete scanner;
+  delete xPath;
+  return splashOk;
+}
+
+GBool Splash::pathAllOutside(SplashPath *path) {
+  SplashCoord xMin1, yMin1, xMax1, yMax1;
+  SplashCoord xMin2, yMin2, xMax2, yMax2;
+  SplashCoord x, y;
+  int xMinI, yMinI, xMaxI, yMaxI;
+  int i;
+
+  xMin1 = xMax1 = path->pts[0].x;
+  yMin1 = yMax1 = path->pts[0].y;
+  for (i = 1; i < path->length; ++i) {
+    if (path->pts[i].x < xMin1) {
+      xMin1 = path->pts[i].x;
+    } else if (path->pts[i].x > xMax1) {
+      xMax1 = path->pts[i].x;
+    }
+    if (path->pts[i].y < yMin1) {
+      yMin1 = path->pts[i].y;
+    } else if (path->pts[i].y > yMax1) {
+      yMax1 = path->pts[i].y;
+    }
+  }
+
+  transform(state->matrix, xMin1, yMin1, &x, &y);
+  xMin2 = xMax2 = x;
+  yMin2 = yMax2 = y;
+  transform(state->matrix, xMin1, yMax1, &x, &y);
+  if (x < xMin2) {
+    xMin2 = x;
+  } else if (x > xMax2) {
+    xMax2 = x;
+  }
+  if (y < yMin2) {
+    yMin2 = y;
+  } else if (y > yMax2) {
+    yMax2 = y;
+  }
+  transform(state->matrix, xMax1, yMin1, &x, &y);
+  if (x < xMin2) {
+    xMin2 = x;
+  } else if (x > xMax2) {
+    xMax2 = x;
+  }
+  if (y < yMin2) {
+    yMin2 = y;
+  } else if (y > yMax2) {
+    yMax2 = y;
+  }
+  transform(state->matrix, xMax1, yMax1, &x, &y);
+  if (x < xMin2) {
+    xMin2 = x;
+  } else if (x > xMax2) {
+    xMax2 = x;
+  }
+  if (y < yMin2) {
+    yMin2 = y;
+  } else if (y > yMax2) {
+    yMax2 = y;
+  }
+  xMinI = splashFloor(xMin2);
+  yMinI = splashFloor(yMin2);
+  xMaxI = splashFloor(xMax2);
+  yMaxI = splashFloor(yMax2);
+
+  return state->clip->testRect(xMinI, yMinI, xMaxI, yMaxI) ==
+         splashClipAllOutside;
+}
+
+SplashError Splash::xorFill(SplashPath *path, GBool eo) {
+  SplashPipe pipe;
+  SplashXPath *xPath;
+  SplashXPathScanner *scanner;
+  int xMinI, yMinI, xMaxI, yMaxI, x0, x1, y;
+  SplashClipResult clipRes, clipRes2;
+  SplashBlendFunc origBlendFunc;
+
+  if (path->length == 0) {
+    return splashErrEmptyPath;
+  }
+  xPath = new SplashXPath(path, state->matrix, state->flatness, gTrue);
+  xPath->sort();
+  scanner = new SplashXPathScanner(xPath, eo, state->clip->getYMinI(),
+                                  state->clip->getYMaxI());
+
+  // get the min and max x and y values
+  scanner->getBBox(&xMinI, &yMinI, &xMaxI, &yMaxI);
+
+  // check clipping
+  if ((clipRes = state->clip->testRect(xMinI, yMinI, xMaxI, yMaxI))
+      != splashClipAllOutside) {
+    if (scanner->hasPartialClip()) {
+      clipRes = splashClipPartial;
+    }
+
+    origBlendFunc = state->blendFunc;
+    state->blendFunc = &blendXor;
+    pipeInit(&pipe, 0, yMinI, state->fillPattern, NULL, 255, gFalse, gFalse);
+
+    // draw the spans
+    for (y = yMinI; y <= yMaxI; ++y) {
+      while (scanner->getNextSpan(y, &x0, &x1)) {
+       if (clipRes == splashClipAllInside) {
+         drawSpan(&pipe, x0, x1, y, gTrue);
+       } else {
+         // limit the x range
+         if (x0 < state->clip->getXMinI()) {
+           x0 = state->clip->getXMinI();
+         }
+         if (x1 > state->clip->getXMaxI()) {
+           x1 = state->clip->getXMaxI();
+         }
+         clipRes2 = state->clip->testSpan(x0, x1, y);
+         drawSpan(&pipe, x0, x1, y, clipRes2 == splashClipAllInside);
+       }
+      }
+    }
+    state->blendFunc = origBlendFunc;
+  }
+  opClipRes = clipRes;
+
+  delete scanner;
+  delete xPath;
+  return splashOk;
+}
+
+SplashError Splash::fillChar(SplashCoord x, SplashCoord y,
+                            int c, SplashFont *font) {
+  SplashGlyphBitmap glyph;
+  SplashCoord xt, yt;
+  int x0, y0, xFrac, yFrac;
+  SplashClipResult clipRes;
+
+  if (debugMode) {
+    printf("fillChar: x=%.2f y=%.2f c=%3d=0x%02x='%c'\n",
+          (double)x, (double)y, c, c, c);
+  }
+  transform(state->matrix, x, y, &xt, &yt);
+  x0 = splashFloor(xt);
+  xFrac = splashFloor((xt - x0) * splashFontFraction);
+  y0 = splashFloor(yt);
+  yFrac = splashFloor((yt - y0) * splashFontFraction);
+  if (!font->getGlyph(c, xFrac, yFrac, &glyph, x0, y0, state->clip, &clipRes)) {
+    return splashErrNoGlyph;
+  }
+  if (clipRes != splashClipAllOutside) {
+    fillGlyph2(x0, y0, &glyph, clipRes == splashClipAllInside);
+  }
+  opClipRes = clipRes;
+  if (glyph.freeData) {
+    gfree(glyph.data);
+  }
+  return splashOk;
+}
+
+void Splash::fillGlyph(SplashCoord x, SplashCoord y,
+                             SplashGlyphBitmap *glyph) {
+  SplashCoord xt, yt;
+  int x0, y0;
+
+  transform(state->matrix, x, y, &xt, &yt);
+  x0 = splashFloor(xt);
+  y0 = splashFloor(yt);
+  SplashClipResult clipRes = state->clip->testRect(x0 - glyph->x,
+                             y0 - glyph->y,
+                             x0 - glyph->x + glyph->w - 1,
+                             y0 - glyph->y + glyph->h - 1);
+  if (clipRes != splashClipAllOutside) {
+    fillGlyph2(x0, y0, glyph, clipRes == splashClipAllInside);
+  }
+  opClipRes = clipRes;
+}
+
+void Splash::fillGlyph2(int x0, int y0, SplashGlyphBitmap *glyph, GBool noClip) {
+  SplashPipe pipe;
+  int alpha0;
+  Guchar alpha;
+  Guchar *p;
+  int x1, y1, xx, xx1, yy;
+
+  p = glyph->data;
+  int xStart = x0 - glyph->x;
+  int yStart = y0 - glyph->y;
+  int xxLimit = glyph->w;
+  int yyLimit = glyph->h;
+  int xShift = 0;
+
+  if (yStart < 0)
+  {
+    p += (glyph->aa ? glyph->w : splashCeil(glyph->w / 8.0)) * -yStart; // move p to the beginning of the first painted row
+    yyLimit += yStart;
+    yStart = 0;
+  }
+
+  if (xStart < 0)
+  {
+    if (glyph->aa) {
+      p += -xStart;
+    } else {
+      p += (-xStart) / 8;
+      xShift = (-xStart) % 8;
+    }
+    xxLimit += xStart;
+    xStart = 0;
+  }
+
+  if (xxLimit + xStart >= bitmap->width) xxLimit = bitmap->width - xStart;
+  if (yyLimit + yStart >= bitmap->height) yyLimit = bitmap->height - yStart;
+
+  if (noClip) {
+    if (glyph->aa) {
+      pipeInit(&pipe, xStart, yStart,
+               state->fillPattern, NULL, (Guchar)splashRound(state->fillAlpha * 255), gTrue, gFalse);
+      for (yy = 0, y1 = yStart; yy < yyLimit; ++yy, ++y1) {
+        pipeSetXY(&pipe, xStart, y1);
+        for (xx = 0, x1 = xStart; xx < xxLimit; ++xx, ++x1) {
+          alpha = p[xx];
+          if (alpha != 0) {
+            pipe.shape = alpha;
+            (this->*pipe.run)(&pipe);
+            updateModX(x1);
+            updateModY(y1);
+          } else {
+            pipeIncX(&pipe);
+          }
+        }
+        p += glyph->w;
+      }
+    } else {
+      const int widthEight = splashCeil(glyph->w / 8.0);
+
+      pipeInit(&pipe, xStart, yStart,
+               state->fillPattern, NULL, (Guchar)splashRound(state->fillAlpha * 255), gFalse, gFalse);
+      for (yy = 0, y1 = yStart; yy < yyLimit; ++yy, ++y1) {
+        pipeSetXY(&pipe, xStart, y1);
+        for (xx = 0, x1 = xStart; xx < xxLimit; xx += 8) {
+          alpha0 = (xShift > 0 ? (p[xx / 8] << xShift) | (p[xx / 8 + 1] >> (8 - xShift)) : p[xx / 8]);
+          for (xx1 = 0; xx1 < 8 && xx + xx1 < xxLimit; ++xx1, ++x1) {
+            if (alpha0 & 0x80) {
+              (this->*pipe.run)(&pipe);
+              updateModX(x1);
+              updateModY(y1);
+            } else {
+              pipeIncX(&pipe);
+            }
+            alpha0 <<= 1;
+          }
+        }
+        p += widthEight;
+      }
+    }
+  } else {
+    if (glyph->aa) {
+      pipeInit(&pipe, xStart, yStart,
+               state->fillPattern, NULL, (Guchar)splashRound(state->fillAlpha * 255), gTrue, gFalse);
+      for (yy = 0, y1 = yStart; yy < yyLimit; ++yy, ++y1) {
+        pipeSetXY(&pipe, xStart, y1);
+        for (xx = 0, x1 = xStart; xx < xxLimit; ++xx, ++x1) {
+          if (state->clip->test(x1, y1)) {
+            alpha = p[xx];
+            if (alpha != 0) {
+              pipe.shape = alpha;
+              (this->*pipe.run)(&pipe);
+              updateModX(x1);
+              updateModY(y1);
+            } else {
+              pipeIncX(&pipe);
+            }
+          } else {
+            pipeIncX(&pipe);
+          }
+        }
+        p += glyph->w;
+      }
+    } else {
+      const int widthEight = splashCeil(glyph->w / 8.0);
+
+      pipeInit(&pipe, xStart, yStart,
+               state->fillPattern, NULL, (Guchar)splashRound(state->fillAlpha * 255), gFalse, gFalse);
+      for (yy = 0, y1 = yStart; yy < yyLimit; ++yy, ++y1) {
+        pipeSetXY(&pipe, xStart, y1);
+        for (xx = 0, x1 = xStart; xx < xxLimit; xx += 8) {
+          alpha0 = (xShift > 0 ? (p[xx / 8] << xShift) | (p[xx / 8 + 1] >> (8 - xShift)) : p[xx / 8]);
+          for (xx1 = 0; xx1 < 8 && xx + xx1 < xxLimit; ++xx1, ++x1) {
+            if (state->clip->test(x1, y1)) {
+              if (alpha0 & 0x80) {
+                (this->*pipe.run)(&pipe);
+                updateModX(x1);
+                updateModY(y1);
+              } else {
+                pipeIncX(&pipe);
+              }
+            } else {
+              pipeIncX(&pipe);
+            }
+            alpha0 <<= 1;
+          }
+        }
+        p += widthEight;
+      }
+    }
+  }
+}
+
+SplashError Splash::fillImageMask(SplashImageMaskSource src, void *srcData,
+                                 int w, int h, SplashCoord *mat,
+                                 GBool glyphMode) {
+  SplashBitmap *scaledMask;
+  SplashClipResult clipRes;
+  GBool minorAxisZero;
+  int x0, y0, x1, y1, scaledWidth, scaledHeight;
+  int yp;
+
+  if (debugMode) {
+    printf("fillImageMask: w=%d h=%d mat=[%.2f %.2f %.2f %.2f %.2f %.2f]\n",
+          w, h, (double)mat[0], (double)mat[1], (double)mat[2],
+          (double)mat[3], (double)mat[4], (double)mat[5]);
+  }
+
+  if (w == 0 && h == 0) return splashErrZeroImage;
+
+  // check for singular matrix
+  if (!splashCheckDet(mat[0], mat[1], mat[2], mat[3], 0.000001)) {
+    return splashErrSingularMatrix;
+  }
+
+  minorAxisZero = mat[1] == 0 && mat[2] == 0;
+
+  // scaling only
+  if (mat[0] > 0 && minorAxisZero && mat[3] > 0) {
+    x0 = imgCoordMungeLowerC(mat[4], glyphMode);
+    y0 = imgCoordMungeLowerC(mat[5], glyphMode);
+    x1 = imgCoordMungeUpperC(mat[0] + mat[4], glyphMode);
+    y1 = imgCoordMungeUpperC(mat[3] + mat[5], glyphMode);
+    // make sure narrow images cover at least one pixel
+    if (x0 == x1) {
+      ++x1;
+    }
+    if (y0 == y1) {
+      ++y1;
+    }
+    clipRes = state->clip->testRect(x0, y0, x1 - 1, y1 - 1);
+    opClipRes = clipRes;
+    if (clipRes != splashClipAllOutside) {
+      scaledWidth = x1 - x0;
+      scaledHeight = y1 - y0;
+      yp = h / scaledHeight;
+      if (yp < 0 || yp > INT_MAX - 1) {
+        return splashErrBadArg;
+      }
+      scaledMask = scaleMask(src, srcData, w, h, scaledWidth, scaledHeight);
+      blitMask(scaledMask, x0, y0, clipRes);
+      delete scaledMask;
+    }
+
+  // scaling plus vertical flip
+  } else if (mat[0] > 0 && minorAxisZero && mat[3] < 0) {
+    x0 = imgCoordMungeLowerC(mat[4], glyphMode);
+    y0 = imgCoordMungeLowerC(mat[3] + mat[5], glyphMode);
+    x1 = imgCoordMungeUpperC(mat[0] + mat[4], glyphMode);
+    y1 = imgCoordMungeUpperC(mat[5], glyphMode);
+    // make sure narrow images cover at least one pixel
+    if (x0 == x1) {
+      ++x1;
+    }
+    if (y0 == y1) {
+      ++y1;
+    }
+    clipRes = state->clip->testRect(x0, y0, x1 - 1, y1 - 1);
+    opClipRes = clipRes;
+    if (clipRes != splashClipAllOutside) {
+      scaledWidth = x1 - x0;
+      scaledHeight = y1 - y0;
+      yp = h / scaledHeight;
+      if (yp < 0 || yp > INT_MAX - 1) {
+        return splashErrBadArg;
+      }
+      scaledMask = scaleMask(src, srcData, w, h, scaledWidth, scaledHeight);
+      vertFlipImage(scaledMask, scaledWidth, scaledHeight, 1);
+      blitMask(scaledMask, x0, y0, clipRes);
+      delete scaledMask;
+    }
+
+  // all other cases
+  } else {
+    arbitraryTransformMask(src, srcData, w, h, mat, glyphMode);
+  }
+
+  return splashOk;
+}
+
+void Splash::arbitraryTransformMask(SplashImageMaskSource src, void *srcData,
+                                   int srcWidth, int srcHeight,
+                                   SplashCoord *mat, GBool glyphMode) {
+  SplashBitmap *scaledMask;
+  SplashClipResult clipRes, clipRes2;
+  SplashPipe pipe;
+  int scaledWidth, scaledHeight, t0, t1;
+  SplashCoord r00, r01, r10, r11, det, ir00, ir01, ir10, ir11;
+  SplashCoord vx[4], vy[4];
+  int xMin, yMin, xMax, yMax;
+  ImageSection section[3];
+  int nSections;
+  int y, xa, xb, x, i, xx, yy;
+
+  // compute the four vertices of the target quadrilateral
+  vx[0] = mat[4];                    vy[0] = mat[5];
+  vx[1] = mat[2] + mat[4];           vy[1] = mat[3] + mat[5];
+  vx[2] = mat[0] + mat[2] + mat[4];  vy[2] = mat[1] + mat[3] + mat[5];
+  vx[3] = mat[0] + mat[4];           vy[3] = mat[1] + mat[5];
+
+  // clipping
+  xMin = imgCoordMungeLowerC(vx[0], glyphMode);
+  xMax = imgCoordMungeUpperC(vx[0], glyphMode);
+  yMin = imgCoordMungeLowerC(vy[0], glyphMode);
+  yMax = imgCoordMungeUpperC(vy[0], glyphMode);
+  for (i = 1; i < 4; ++i) {
+    t0 = imgCoordMungeLowerC(vx[i], glyphMode);
+    if (t0 < xMin) {
+      xMin = t0;
+    }
+    t0 = imgCoordMungeUpperC(vx[i], glyphMode);
+    if (t0 > xMax) {
+      xMax = t0;
+    }
+    t1 = imgCoordMungeLowerC(vy[i], glyphMode);
+    if (t1 < yMin) {
+      yMin = t1;
+    }
+    t1 = imgCoordMungeUpperC(vy[i], glyphMode);
+    if (t1 > yMax) {
+      yMax = t1;
+    }
+  }
+  clipRes = state->clip->testRect(xMin, yMin, xMax - 1, yMax - 1);
+  opClipRes = clipRes;
+  if (clipRes == splashClipAllOutside) {
+    return;
+  }
+
+  // compute the scale factors
+  if (mat[0] >= 0) {
+    t0 = imgCoordMungeUpperC(mat[0] + mat[4], glyphMode) -
+         imgCoordMungeLowerC(mat[4], glyphMode);
+  } else {
+    t0 = imgCoordMungeUpperC(mat[4], glyphMode) -
+         imgCoordMungeLowerC(mat[0] + mat[4], glyphMode);
+  }
+  if (mat[1] >= 0) {
+    t1 = imgCoordMungeUpperC(mat[1] + mat[5], glyphMode) -
+         imgCoordMungeLowerC(mat[5], glyphMode);
+  } else {
+    t1 = imgCoordMungeUpperC(mat[5], glyphMode) -
+         imgCoordMungeLowerC(mat[1] + mat[5], glyphMode);
+  }
+  scaledWidth = t0 > t1 ? t0 : t1;
+  if (mat[2] >= 0) {
+    t0 = imgCoordMungeUpperC(mat[2] + mat[4], glyphMode) -
+         imgCoordMungeLowerC(mat[4], glyphMode);
+  } else {
+    t0 = imgCoordMungeUpperC(mat[4], glyphMode) -
+         imgCoordMungeLowerC(mat[2] + mat[4], glyphMode);
+  }
+  if (mat[3] >= 0) {
+    t1 = imgCoordMungeUpperC(mat[3] + mat[5], glyphMode) -
+         imgCoordMungeLowerC(mat[5], glyphMode);
+  } else {
+    t1 = imgCoordMungeUpperC(mat[5], glyphMode) -
+         imgCoordMungeLowerC(mat[3] + mat[5], glyphMode);
+  }
+  scaledHeight = t0 > t1 ? t0 : t1;
+  if (scaledWidth == 0) {
+    scaledWidth = 1;
+  }
+  if (scaledHeight == 0) {
+    scaledHeight = 1;
+  }
+
+  // compute the inverse transform (after scaling) matrix
+  r00 = mat[0] / scaledWidth;
+  r01 = mat[1] / scaledWidth;
+  r10 = mat[2] / scaledHeight;
+  r11 = mat[3] / scaledHeight;
+  det = r00 * r11 - r01 * r10;
+  if (splashAbs(det) < 1e-6) {
+    // this should be caught by the singular matrix check in fillImageMask
+    return;
+  }
+  ir00 = r11 / det;
+  ir01 = -r01 / det;
+  ir10 = -r10 / det;
+  ir11 = r00 / det;
+
+  // scale the input image
+  scaledMask = scaleMask(src, srcData, srcWidth, srcHeight,
+                        scaledWidth, scaledHeight);
+
+  // construct the three sections
+  i = (vy[2] <= vy[3]) ? 2 : 3;
+  if (vy[1] <= vy[i]) {
+    i = 1;
+  }
+  if (vy[0] < vy[i] || (i != 3 && vy[0] == vy[i])) {
+    i = 0;
+  }
+  if (vy[i] == vy[(i+1) & 3]) {
+    section[0].y0 = imgCoordMungeLowerC(vy[i], glyphMode);
+    section[0].y1 = imgCoordMungeUpperC(vy[(i+2) & 3], glyphMode) - 1;
+    if (vx[i] < vx[(i+1) & 3]) {
+      section[0].ia0 = i;
+      section[0].ia1 = (i+3) & 3;
+      section[0].ib0 = (i+1) & 3;
+      section[0].ib1 = (i+2) & 3;
+    } else {
+      section[0].ia0 = (i+1) & 3;
+      section[0].ia1 = (i+2) & 3;
+      section[0].ib0 = i;
+      section[0].ib1 = (i+3) & 3;
+    }
+    nSections = 1;
+  } else {
+    section[0].y0 = imgCoordMungeLowerC(vy[i], glyphMode);
+    section[2].y1 = imgCoordMungeUpperC(vy[(i+2) & 3], glyphMode) - 1;
+    section[0].ia0 = section[0].ib0 = i;
+    section[2].ia1 = section[2].ib1 = (i+2) & 3;
+    if (vx[(i+1) & 3] < vx[(i+3) & 3]) {
+      section[0].ia1 = section[2].ia0 = (i+1) & 3;
+      section[0].ib1 = section[2].ib0 = (i+3) & 3;
+    } else {
+      section[0].ia1 = section[2].ia0 = (i+3) & 3;
+      section[0].ib1 = section[2].ib0 = (i+1) & 3;
+    }
+    if (vy[(i+1) & 3] < vy[(i+3) & 3]) {
+      section[1].y0 = imgCoordMungeLowerC(vy[(i+1) & 3], glyphMode);
+      section[2].y0 = imgCoordMungeUpperC(vy[(i+3) & 3], glyphMode);
+      if (vx[(i+1) & 3] < vx[(i+3) & 3]) {
+       section[1].ia0 = (i+1) & 3;
+       section[1].ia1 = (i+2) & 3;
+       section[1].ib0 = i;
+       section[1].ib1 = (i+3) & 3;
+      } else {
+       section[1].ia0 = i;
+       section[1].ia1 = (i+3) & 3;
+       section[1].ib0 = (i+1) & 3;
+       section[1].ib1 = (i+2) & 3;
+      }
+    } else {
+      section[1].y0 = imgCoordMungeLowerC(vy[(i+3) & 3], glyphMode);
+      section[2].y0 = imgCoordMungeUpperC(vy[(i+1) & 3], glyphMode);
+      if (vx[(i+1) & 3] < vx[(i+3) & 3]) {
+       section[1].ia0 = i;
+       section[1].ia1 = (i+1) & 3;
+       section[1].ib0 = (i+3) & 3;
+       section[1].ib1 = (i+2) & 3;
+      } else {
+       section[1].ia0 = (i+3) & 3;
+       section[1].ia1 = (i+2) & 3;
+       section[1].ib0 = i;
+       section[1].ib1 = (i+1) & 3;
+      }
+    }
+    section[0].y1 = section[1].y0 - 1;
+    section[1].y1 = section[2].y0 - 1;
+    nSections = 3;
+  }
+  for (i = 0; i < nSections; ++i) {
+    section[i].xa0 = vx[section[i].ia0];
+    section[i].ya0 = vy[section[i].ia0];
+    section[i].xa1 = vx[section[i].ia1];
+    section[i].ya1 = vy[section[i].ia1];
+    section[i].xb0 = vx[section[i].ib0];
+    section[i].yb0 = vy[section[i].ib0];
+    section[i].xb1 = vx[section[i].ib1];
+    section[i].yb1 = vy[section[i].ib1];
+    section[i].dxdya = (section[i].xa1 - section[i].xa0) /
+                       (section[i].ya1 - section[i].ya0);
+    section[i].dxdyb = (section[i].xb1 - section[i].xb0) /
+                       (section[i].yb1 - section[i].yb0);
+  }
+
+  // initialize the pixel pipe
+  pipeInit(&pipe, 0, 0, state->fillPattern, NULL,
+          (Guchar)splashRound(state->fillAlpha * 255), gTrue, gFalse);
+  if (vectorAntialias) {
+    drawAAPixelInit();
+  }
+
+  // make sure narrow images cover at least one pixel
+  if (nSections == 1) {
+    if (section[0].y0 == section[0].y1) {
+      ++section[0].y1;
+      clipRes = opClipRes = splashClipPartial;
+    }
+  } else {
+    if (section[0].y0 == section[2].y1) {
+      ++section[1].y1;
+      clipRes = opClipRes = splashClipPartial;
+    }
+  }
+
+  // scan all pixels inside the target region
+  for (i = 0; i < nSections; ++i) {
+    for (y = section[i].y0; y <= section[i].y1; ++y) {
+      xa = imgCoordMungeLowerC(section[i].xa0 +
+                                ((SplashCoord)y + 0.5 - section[i].ya0) *
+                                  section[i].dxdya,
+                              glyphMode);
+      xb = imgCoordMungeUpperC(section[i].xb0 +
+                                ((SplashCoord)y + 0.5 - section[i].yb0) *
+                                  section[i].dxdyb,
+                              glyphMode);
+      // make sure narrow images cover at least one pixel
+      if (xa == xb) {
+       ++xb;
+      }
+      if (clipRes != splashClipAllInside) {
+       clipRes2 = state->clip->testSpan(xa, xb - 1, y);
+      } else {
+       clipRes2 = clipRes;
+      }
+      for (x = xa; x < xb; ++x) {
+       // map (x+0.5, y+0.5) back to the scaled image
+       xx = splashFloor(((SplashCoord)x + 0.5 - mat[4]) * ir00 +
+                        ((SplashCoord)y + 0.5 - mat[5]) * ir10);
+       yy = splashFloor(((SplashCoord)x + 0.5 - mat[4]) * ir01 +
+                        ((SplashCoord)y + 0.5 - mat[5]) * ir11);
+       // xx should always be within bounds, but floating point
+       // inaccuracy can cause problems
+       if (xx < 0) {
+         xx = 0;
+       } else if (xx >= scaledWidth) {
+         xx = scaledWidth - 1;
+       }
+       if (yy < 0) {
+         yy = 0;
+       } else if (yy >= scaledHeight) {
+         yy = scaledHeight - 1;
+       }
+       pipe.shape = scaledMask->data[yy * scaledWidth + xx];
+       if (vectorAntialias && clipRes2 != splashClipAllInside) {
+         drawAAPixel(&pipe, x, y);
+       } else {
+         drawPixel(&pipe, x, y, clipRes2 == splashClipAllInside);
+       }
+      }
+    }
+  }
+
+  delete scaledMask;
+}
+
+// Scale an image mask into a SplashBitmap.
+SplashBitmap *Splash::scaleMask(SplashImageMaskSource src, void *srcData,
+                               int srcWidth, int srcHeight,
+                               int scaledWidth, int scaledHeight) {
+  SplashBitmap *dest;
+
+  dest = new SplashBitmap(scaledWidth, scaledHeight, 1, splashModeMono8,
+                         gFalse);
+  if (scaledHeight < srcHeight) {
+    if (scaledWidth < srcWidth) {
+      scaleMaskYdXd(src, srcData, srcWidth, srcHeight,
+                   scaledWidth, scaledHeight, dest);
+    } else {
+      scaleMaskYdXu(src, srcData, srcWidth, srcHeight,
+                   scaledWidth, scaledHeight, dest);
+    }
+  } else {
+    if (scaledWidth < srcWidth) {
+      scaleMaskYuXd(src, srcData, srcWidth, srcHeight,
+                   scaledWidth, scaledHeight, dest);
+    } else {
+      scaleMaskYuXu(src, srcData, srcWidth, srcHeight,
+                   scaledWidth, scaledHeight, dest);
+    }
+  }
+  return dest;
+}
+
+void Splash::scaleMaskYdXd(SplashImageMaskSource src, void *srcData,
+                          int srcWidth, int srcHeight,
+                          int scaledWidth, int scaledHeight,
+                          SplashBitmap *dest) {
+  Guchar *lineBuf;
+  Guint *pixBuf;
+  Guint pix;
+  Guchar *destPtr;
+  int yp, yq, xp, xq, yt, y, yStep, xt, x, xStep, xx, d, d0, d1;
+  int i, j;
+
+  // Bresenham parameters for y scale
+  yp = srcHeight / scaledHeight;
+  yq = srcHeight % scaledHeight;
+
+  // Bresenham parameters for x scale
+  xp = srcWidth / scaledWidth;
+  xq = srcWidth % scaledWidth;
+
+  // allocate buffers
+  lineBuf = (Guchar *)gmalloc(srcWidth);
+  pixBuf = (Guint *)gmallocn(srcWidth, sizeof(int));
+
+  // init y scale Bresenham
+  yt = 0;
+
+  destPtr = dest->data;
+  for (y = 0; y < scaledHeight; ++y) {
+
+    // y scale Bresenham
+    if ((yt += yq) >= scaledHeight) {
+      yt -= scaledHeight;
+      yStep = yp + 1;
+    } else {
+      yStep = yp;
+    }
+
+    // read rows from image
+    memset(pixBuf, 0, srcWidth * sizeof(int));
+    for (i = 0; i < yStep; ++i) {
+      (*src)(srcData, lineBuf);
+      for (j = 0; j < srcWidth; ++j) {
+       pixBuf[j] += lineBuf[j];
+      }
+    }
+
+    // init x scale Bresenham
+    xt = 0;
+    d0 = (255 << 23) / (yStep * xp);
+    d1 = (255 << 23) / (yStep * (xp + 1));
+
+    xx = 0;
+    for (x = 0; x < scaledWidth; ++x) {
+
+      // x scale Bresenham
+      if ((xt += xq) >= scaledWidth) {
+       xt -= scaledWidth;
+       xStep = xp + 1;
+       d = d1;
+      } else {
+       xStep = xp;
+       d = d0;
+      }
+
+      // compute the final pixel
+      pix = 0;
+      for (i = 0; i < xStep; ++i) {
+       pix += pixBuf[xx++];
+      }
+      // (255 * pix) / xStep * yStep
+      pix = (pix * d) >> 23;
+
+      // store the pixel
+      *destPtr++ = (Guchar)pix;
+    }
+  }
+
+  gfree(pixBuf);
+  gfree(lineBuf);
+}
+
+void Splash::scaleMaskYdXu(SplashImageMaskSource src, void *srcData,
+                          int srcWidth, int srcHeight,
+                          int scaledWidth, int scaledHeight,
+                          SplashBitmap *dest) {
+  Guchar *lineBuf;
+  Guint *pixBuf;
+  Guint pix;
+  Guchar *destPtr;
+  int yp, yq, xp, xq, yt, y, yStep, xt, x, xStep, d;
+  int i, j;
+
+  // Bresenham parameters for y scale
+  yp = srcHeight / scaledHeight;
+  yq = srcHeight % scaledHeight;
+
+  // Bresenham parameters for x scale
+  xp = scaledWidth / srcWidth;
+  xq = scaledWidth % srcWidth;
+
+  // allocate buffers
+  lineBuf = (Guchar *)gmalloc(srcWidth);
+  pixBuf = (Guint *)gmallocn(srcWidth, sizeof(int));
+
+  // init y scale Bresenham
+  yt = 0;
+
+  destPtr = dest->data;
+  for (y = 0; y < scaledHeight; ++y) {
+
+    // y scale Bresenham
+    if ((yt += yq) >= scaledHeight) {
+      yt -= scaledHeight;
+      yStep = yp + 1;
+    } else {
+      yStep = yp;
+    }
+
+    // read rows from image
+    memset(pixBuf, 0, srcWidth * sizeof(int));
+    for (i = 0; i < yStep; ++i) {
+      (*src)(srcData, lineBuf);
+      for (j = 0; j < srcWidth; ++j) {
+       pixBuf[j] += lineBuf[j];
+      }
+    }
+
+    // init x scale Bresenham
+    xt = 0;
+    d = (255 << 23) / yStep;
+
+    for (x = 0; x < srcWidth; ++x) {
+
+      // x scale Bresenham
+      if ((xt += xq) >= srcWidth) {
+       xt -= srcWidth;
+       xStep = xp + 1;
+      } else {
+       xStep = xp;
+      }
+
+      // compute the final pixel
+      pix = pixBuf[x];
+      // (255 * pix) / yStep
+      pix = (pix * d) >> 23;
+
+      // store the pixel
+      for (i = 0; i < xStep; ++i) {
+       *destPtr++ = (Guchar)pix;
+      }
+    }
+  }
+
+  gfree(pixBuf);
+  gfree(lineBuf);
+}
+
+void Splash::scaleMaskYuXd(SplashImageMaskSource src, void *srcData,
+                          int srcWidth, int srcHeight,
+                          int scaledWidth, int scaledHeight,
+                          SplashBitmap *dest) {
+  Guchar *lineBuf;
+  Guint pix;
+  Guchar *destPtr0, *destPtr;
+  int yp, yq, xp, xq, yt, y, yStep, xt, x, xStep, xx, d, d0, d1;
+  int i;
+
+  // Bresenham parameters for y scale
+  yp = scaledHeight / srcHeight;
+  yq = scaledHeight % srcHeight;
+
+  // Bresenham parameters for x scale
+  xp = srcWidth / scaledWidth;
+  xq = srcWidth % scaledWidth;
+
+  // allocate buffers
+  lineBuf = (Guchar *)gmalloc(srcWidth);
+
+  // init y scale Bresenham
+  yt = 0;
+
+  destPtr0 = dest->data;
+  for (y = 0; y < srcHeight; ++y) {
+
+    // y scale Bresenham
+    if ((yt += yq) >= srcHeight) {
+      yt -= srcHeight;
+      yStep = yp + 1;
+    } else {
+      yStep = yp;
+    }
+
+    // read row from image
+    (*src)(srcData, lineBuf);
+
+    // init x scale Bresenham
+    xt = 0;
+    d0 = (255 << 23) / xp;
+    d1 = (255 << 23) / (xp + 1);
+
+    xx = 0;
+    for (x = 0; x < scaledWidth; ++x) {
+
+      // x scale Bresenham
+      if ((xt += xq) >= scaledWidth) {
+       xt -= scaledWidth;
+       xStep = xp + 1;
+       d = d1;
+      } else {
+       xStep = xp;
+       d = d0;
+      }
+
+      // compute the final pixel
+      pix = 0;
+      for (i = 0; i < xStep; ++i) {
+       pix += lineBuf[xx++];
+      }
+      // (255 * pix) / xStep
+      pix = (pix * d) >> 23;
+
+      // store the pixel
+      for (i = 0; i < yStep; ++i) {
+       destPtr = destPtr0 + i * scaledWidth + x;
+       *destPtr = (Guchar)pix;
+      }
+    }
+
+    destPtr0 += yStep * scaledWidth;
+  }
+
+  gfree(lineBuf);
+}
+
+void Splash::scaleMaskYuXu(SplashImageMaskSource src, void *srcData,
+                          int srcWidth, int srcHeight,
+                          int scaledWidth, int scaledHeight,
+                          SplashBitmap *dest) {
+  Guchar *lineBuf;
+  Guint pix;
+  Guchar *destPtr0, *destPtr;
+  int yp, yq, xp, xq, yt, y, yStep, xt, x, xStep, xx;
+  int i, j;
+
+  // Bresenham parameters for y scale
+  yp = scaledHeight / srcHeight;
+  yq = scaledHeight % srcHeight;
+
+  // Bresenham parameters for x scale
+  xp = scaledWidth / srcWidth;
+  xq = scaledWidth % srcWidth;
+
+  // allocate buffers
+  lineBuf = (Guchar *)gmalloc(srcWidth);
+
+  // init y scale Bresenham
+  yt = 0;
+
+  destPtr0 = dest->data;
+  for (y = 0; y < srcHeight; ++y) {
+
+    // y scale Bresenham
+    if ((yt += yq) >= srcHeight) {
+      yt -= srcHeight;
+      yStep = yp + 1;
+    } else {
+      yStep = yp;
+    }
+
+    // read row from image
+    (*src)(srcData, lineBuf);
+
+    // init x scale Bresenham
+    xt = 0;
+
+    xx = 0;
+    for (x = 0; x < srcWidth; ++x) {
+
+      // x scale Bresenham
+      if ((xt += xq) >= srcWidth) {
+       xt -= srcWidth;
+       xStep = xp + 1;
+      } else {
+       xStep = xp;
+      }
+
+      // compute the final pixel
+      pix = lineBuf[x] ? 255 : 0;
+
+      // store the pixel
+      for (i = 0; i < yStep; ++i) {
+       for (j = 0; j < xStep; ++j) {
+         destPtr = destPtr0 + i * scaledWidth + xx + j;
+         *destPtr++ = (Guchar)pix;
+       }
+      }
+
+      xx += xStep;
+    }
+
+    destPtr0 += yStep * scaledWidth;
+  }
+
+  gfree(lineBuf);
+}
+
+void Splash::blitMask(SplashBitmap *src, int xDest, int yDest,
+                     SplashClipResult clipRes) {
+  SplashPipe pipe;
+  Guchar *p;
+  int w, h, x, y;
+
+  w = src->getWidth();
+  h = src->getHeight();
+  if (vectorAntialias && clipRes != splashClipAllInside) {
+    pipeInit(&pipe, xDest, yDest, state->fillPattern, NULL,
+            (Guchar)splashRound(state->fillAlpha * 255), gTrue, gFalse);
+    drawAAPixelInit();
+    p = src->getDataPtr();
+    for (y = 0; y < h; ++y) {
+      for (x = 0; x < w; ++x) {
+       pipe.shape = *p++;
+       drawAAPixel(&pipe, xDest + x, yDest + y);
+      }
+    }
+  } else {
+    pipeInit(&pipe, xDest, yDest, state->fillPattern, NULL,
+            (Guchar)splashRound(state->fillAlpha * 255), gTrue, gFalse);
+    p = src->getDataPtr();
+    if (clipRes == splashClipAllInside) {
+      for (y = 0; y < h; ++y) {
+       pipeSetXY(&pipe, xDest, yDest + y);
+       for (x = 0; x < w; ++x) {
+         if (*p) {
+           pipe.shape = *p;
+           (this->*pipe.run)(&pipe);
+         } else {
+           pipeIncX(&pipe);
+         }
+         ++p;
+       }
+      }
+      updateModX(xDest);
+      updateModX(xDest + w - 1);
+      updateModY(yDest);
+      updateModY(yDest + h - 1);
+    } else {
+      for (y = 0; y < h; ++y) {
+       pipeSetXY(&pipe, xDest, yDest + y);
+       for (x = 0; x < w; ++x) {
+         if (*p && state->clip->test(xDest + x, yDest + y)) {
+           pipe.shape = *p;
+           (this->*pipe.run)(&pipe);
+           updateModX(xDest + x);
+           updateModY(yDest + y);
+         } else {
+           pipeIncX(&pipe);
+         }
+         ++p;
+       }
+      }
+    }
+  }
+}
+
+SplashError Splash::drawImage(SplashImageSource src, void *srcData,
+                             SplashColorMode srcMode, GBool srcAlpha,
+                             int w, int h, SplashCoord *mat,
+                             GBool tilingPattern) {
+  GBool ok;
+  SplashBitmap *scaledImg;
+  SplashClipResult clipRes;
+  GBool minorAxisZero;
+  int x0, y0, x1, y1, scaledWidth, scaledHeight;
+  int nComps;
+  int yp;
+
+  if (debugMode) {
+    printf("drawImage: srcMode=%d srcAlpha=%d w=%d h=%d mat=[%.2f %.2f %.2f %.2f %.2f %.2f]\n",
+          srcMode, srcAlpha, w, h, (double)mat[0], (double)mat[1], (double)mat[2],
+          (double)mat[3], (double)mat[4], (double)mat[5]);
+  }
+
+  // check color modes
+  ok = gFalse; // make gcc happy
+  nComps = 0; // make gcc happy
+  switch (bitmap->mode) {
+  case splashModeMono1:
+  case splashModeMono8:
+    ok = srcMode == splashModeMono8;
+    nComps = 1;
+    break;
+  case splashModeRGB8:
+    ok = srcMode == splashModeRGB8;
+    nComps = 3;
+    break;
+  case splashModeXBGR8:
+    ok = srcMode == splashModeXBGR8;
+    nComps = 4;
+    break;
+  case splashModeBGR8:
+    ok = srcMode == splashModeBGR8;
+    nComps = 3;
+    break;
+#if SPLASH_CMYK
+  case splashModeCMYK8:
+    ok = srcMode == splashModeCMYK8;
+    nComps = 4;
+    break;
+#endif
+  default:
+    ok = gFalse;
+    break;
+  }
+  if (!ok) {
+    return splashErrModeMismatch;
+  }
+
+  // check for singular matrix
+  if (!splashCheckDet(mat[0], mat[1], mat[2], mat[3], 0.000001)) {
+    return splashErrSingularMatrix;
+  }
+
+  minorAxisZero = mat[1] == 0 && mat[2] == 0;
+
+  // scaling only
+  if (mat[0] > 0 && minorAxisZero && mat[3] > 0) {
+    x0 = imgCoordMungeLower(mat[4]);
+    y0 = imgCoordMungeLower(mat[5]);
+    x1 = imgCoordMungeUpper(mat[0] + mat[4]);
+    y1 = imgCoordMungeUpper(mat[3] + mat[5]);
+    // make sure narrow images cover at least one pixel
+    if (x0 == x1) {
+      ++x1;
+    }
+    if (y0 == y1) {
+      ++y1;
+    }
+    clipRes = state->clip->testRect(x0, y0, x1 - 1, y1 - 1);
+    opClipRes = clipRes;
+    if (clipRes != splashClipAllOutside) {
+      scaledWidth = x1 - x0;
+      scaledHeight = y1 - y0;
+      yp = h / scaledHeight;
+      if (yp < 0 || yp > INT_MAX - 1) {
+        return splashErrBadArg;
+      }
+      scaledImg = scaleImage(src, srcData, srcMode, nComps, srcAlpha, w, h,
+                            scaledWidth, scaledHeight);
+      if (scaledImg == NULL) {
+        return splashErrBadArg;
+      }
+      blitImage(scaledImg, srcAlpha, x0, y0, clipRes);
+      delete scaledImg;
+    }
+
+  // scaling plus vertical flip
+  } else if (mat[0] > 0 && minorAxisZero && mat[3] < 0) {
+    x0 = imgCoordMungeLower(mat[4]);
+    y0 = imgCoordMungeLower(mat[3] + mat[5]);
+    x1 = imgCoordMungeUpper(mat[0] + mat[4]);
+    y1 = imgCoordMungeUpper(mat[5]);
+    if (x0 == x1) {
+      if (mat[4] + mat[0] * 0.5 < x0) {
+       --x0;
+      } else {
+       ++x1;
+      }
+    }
+    if (y0 == y1) {
+      if (mat[5] + mat[1] * 0.5 < y0) {
+       --y0;
+      } else {
+       ++y1;
+      }
+    }
+    clipRes = state->clip->testRect(x0, y0, x1 - 1, y1 - 1);
+    opClipRes = clipRes;
+    if (clipRes != splashClipAllOutside) {
+      scaledWidth = x1 - x0;
+      scaledHeight = y1 - y0;
+      yp = h / scaledHeight;
+      if (yp < 0 || yp > INT_MAX - 1) {
+        return splashErrBadArg;
+      }
+      scaledImg = scaleImage(src, srcData, srcMode, nComps, srcAlpha, w, h,
+                            scaledWidth, scaledHeight);
+      if (scaledImg == NULL) {
+        return splashErrBadArg;
+      }
+      vertFlipImage(scaledImg, scaledWidth, scaledHeight, nComps);
+      blitImage(scaledImg, srcAlpha, x0, y0, clipRes);
+      delete scaledImg;
+    }
+
+  // all other cases
+  } else {
+    return arbitraryTransformImage(src, srcData, srcMode, nComps, srcAlpha,
+                           w, h, mat, tilingPattern);
+  }
+
+  return splashOk;
+}
+
+SplashError Splash::arbitraryTransformImage(SplashImageSource src, void *srcData,
+                                    SplashColorMode srcMode, int nComps,
+                                    GBool srcAlpha,
+                                    int srcWidth, int srcHeight,
+                                    SplashCoord *mat,
+                                    GBool tilingPattern) {
+  SplashBitmap *scaledImg;
+  SplashClipResult clipRes, clipRes2;
+  SplashPipe pipe;
+  SplashColor pixel;
+  int scaledWidth, scaledHeight, t0, t1, th;
+  SplashCoord r00, r01, r10, r11, det, ir00, ir01, ir10, ir11;
+  SplashCoord vx[4], vy[4];
+  int xMin, yMin, xMax, yMax;
+  ImageSection section[3];
+  int nSections;
+  int y, xa, xb, x, i, xx, yy, yp;
+
+  // compute the four vertices of the target quadrilateral
+  vx[0] = mat[4];                    vy[0] = mat[5];
+  vx[1] = mat[2] + mat[4];           vy[1] = mat[3] + mat[5];
+  vx[2] = mat[0] + mat[2] + mat[4];  vy[2] = mat[1] + mat[3] + mat[5];
+  vx[3] = mat[0] + mat[4];           vy[3] = mat[1] + mat[5];
+
+  // clipping
+  xMin = imgCoordMungeLower(vx[0]);
+  xMax = imgCoordMungeUpper(vx[0]);
+  yMin = imgCoordMungeLower(vy[0]);
+  yMax = imgCoordMungeUpper(vy[0]);
+  for (i = 1; i < 4; ++i) {
+    t0 = imgCoordMungeLower(vx[i]);
+    if (t0 < xMin) {
+      xMin = t0;
+    }
+    t0 = imgCoordMungeUpper(vx[i]);
+    if (t0 > xMax) {
+      xMax = t0;
+    }
+    t1 = imgCoordMungeLower(vy[i]);
+    if (t1 < yMin) {
+      yMin = t1;
+    }
+    t1 = imgCoordMungeUpper(vy[i]);
+    if (t1 > yMax) {
+      yMax = t1;
+    }
+  }
+  clipRes = state->clip->testRect(xMin, yMin, xMax - 1, yMax - 1);
+  opClipRes = clipRes;
+  if (clipRes == splashClipAllOutside) {
+    return splashOk;
+  }
+
+  // compute the scale factors
+  if (splashAbs(mat[0]) >= splashAbs(mat[1])) {
+    scaledWidth = xMax - xMin;
+    scaledHeight = yMax - yMin;
+  } else {
+    scaledWidth = yMax - yMin;
+    scaledHeight = xMax - xMin;
+  }
+  if (scaledHeight <= 1 || scaledHeight <= 1 || tilingPattern) {
+    if (mat[0] >= 0) {
+      t0 = imgCoordMungeUpper(mat[0] + mat[4]) - imgCoordMungeLower(mat[4]);
+    } else {
+      t0 = imgCoordMungeUpper(mat[4]) - imgCoordMungeLower(mat[0] + mat[4]);
+    }
+    if (mat[1] >= 0) {
+      t1 = imgCoordMungeUpper(mat[1] + mat[5]) - imgCoordMungeLower(mat[5]);
+    } else {
+      t1 = imgCoordMungeUpper(mat[5]) - imgCoordMungeLower(mat[1] + mat[5]);
+    }
+    scaledWidth = t0 > t1 ? t0 : t1;
+    if (mat[2] >= 0) {
+      t0 = imgCoordMungeUpper(mat[2] + mat[4]) - imgCoordMungeLower(mat[4]);
+      if (splashAbs(mat[1]) >= 1) {
+        th = imgCoordMungeUpper(mat[2]) - imgCoordMungeLower(mat[0] * mat[3] / mat[1]);
+           if (th > t0) t0 = th;
+      }
+    } else {
+      t0 = imgCoordMungeUpper(mat[4]) - imgCoordMungeLower(mat[2] + mat[4]);
+      if (splashAbs(mat[1]) >= 1) {
+        th = imgCoordMungeUpper(mat[0] * mat[3] / mat[1]) - imgCoordMungeLower(mat[2]);
+        if (th > t0) t0 = th;
+      }
+    }
+    if (mat[3] >= 0) {
+      t1 = imgCoordMungeUpper(mat[3] + mat[5]) - imgCoordMungeLower(mat[5]);
+      if (splashAbs(mat[0]) >= 1) {
+        th = imgCoordMungeUpper(mat[3]) - imgCoordMungeLower(mat[1] * mat[2] / mat[0]);
+           if (th > t1) t1 = th;
+      }
+    } else {
+      t1 = imgCoordMungeUpper(mat[5]) - imgCoordMungeLower(mat[3] + mat[5]);
+      if (splashAbs(mat[0]) >= 1) {
+        th = imgCoordMungeUpper(mat[1] * mat[2] / mat[0]) - imgCoordMungeLower(mat[3]);
+           if (th > t1) t1 = th;
+      }
+    }
+    scaledHeight = t0 > t1 ? t0 : t1;
+  }
+  if (scaledWidth == 0) {
+    scaledWidth = 1;
+  }
+  if (scaledHeight == 0) {
+    scaledHeight = 1;
+  }
+
+  // compute the inverse transform (after scaling) matrix
+  r00 = mat[0] / scaledWidth;
+  r01 = mat[1] / scaledWidth;
+  r10 = mat[2] / scaledHeight;
+  r11 = mat[3] / scaledHeight;
+  det = r00 * r11 - r01 * r10;
+  if (splashAbs(det) < 1e-6) {
+    // this should be caught by the singular matrix check in drawImage
+    return splashErrBadArg;
+  }
+  ir00 = r11 / det;
+  ir01 = -r01 / det;
+  ir10 = -r10 / det;
+  ir11 = r00 / det;
+
+  // scale the input image
+  yp = srcHeight / scaledHeight;
+  if (yp < 0 || yp > INT_MAX - 1) {
+    return splashErrBadArg;
+  }
+  scaledImg = scaleImage(src, srcData, srcMode, nComps, srcAlpha,
+                        srcWidth, srcHeight, scaledWidth, scaledHeight);
+  
+  if (scaledImg == NULL) {
+    return splashErrBadArg;
+  }
+
+  // construct the three sections
+  i = 0;
+  if (vy[1] < vy[i]) {
+    i = 1;
+  }
+  if (vy[2] < vy[i]) {
+    i = 2;
+  }
+  if (vy[3] < vy[i]) {
+    i = 3;
+  }
+  // NB: if using fixed point, 0.000001 will be truncated to zero,
+  // so these two comparisons must be <=, not <
+  if (splashAbs(vy[i] - vy[(i-1) & 3]) <= 0.000001 &&
+      vy[(i-1) & 3] < vy[(i+1) & 3]) {
+    i = (i-1) & 3;
+  }
+  if (splashAbs(vy[i] - vy[(i+1) & 3]) <= 0.000001) {
+    section[0].y0 = imgCoordMungeLower(vy[i]);
+    section[0].y1 = imgCoordMungeUpper(vy[(i+2) & 3]) - 1;
+    if (vx[i] < vx[(i+1) & 3]) {
+      section[0].ia0 = i;
+      section[0].ia1 = (i+3) & 3;
+      section[0].ib0 = (i+1) & 3;
+      section[0].ib1 = (i+2) & 3;
+    } else {
+      section[0].ia0 = (i+1) & 3;
+      section[0].ia1 = (i+2) & 3;
+      section[0].ib0 = i;
+      section[0].ib1 = (i+3) & 3;
+    }
+    nSections = 1;
+  } else {
+    section[0].y0 = imgCoordMungeLower(vy[i]);
+    section[2].y1 = imgCoordMungeUpper(vy[(i+2) & 3]) - 1;
+    section[0].ia0 = section[0].ib0 = i;
+    section[2].ia1 = section[2].ib1 = (i+2) & 3;
+    if (vx[(i+1) & 3] < vx[(i+3) & 3]) {
+      section[0].ia1 = section[2].ia0 = (i+1) & 3;
+      section[0].ib1 = section[2].ib0 = (i+3) & 3;
+    } else {
+      section[0].ia1 = section[2].ia0 = (i+3) & 3;
+      section[0].ib1 = section[2].ib0 = (i+1) & 3;
+    }
+    if (vy[(i+1) & 3] < vy[(i+3) & 3]) {
+      section[1].y0 = imgCoordMungeLower(vy[(i+1) & 3]);
+      section[2].y0 = imgCoordMungeUpper(vy[(i+3) & 3]);
+      if (vx[(i+1) & 3] < vx[(i+3) & 3]) {
+       section[1].ia0 = (i+1) & 3;
+       section[1].ia1 = (i+2) & 3;
+       section[1].ib0 = i;
+       section[1].ib1 = (i+3) & 3;
+      } else {
+       section[1].ia0 = i;
+       section[1].ia1 = (i+3) & 3;
+       section[1].ib0 = (i+1) & 3;
+       section[1].ib1 = (i+2) & 3;
+      }
+    } else {
+      section[1].y0 = imgCoordMungeLower(vy[(i+3) & 3]);
+      section[2].y0 = imgCoordMungeUpper(vy[(i+1) & 3]);
+      if (vx[(i+1) & 3] < vx[(i+3) & 3]) {
+       section[1].ia0 = i;
+       section[1].ia1 = (i+1) & 3;
+       section[1].ib0 = (i+3) & 3;
+       section[1].ib1 = (i+2) & 3;
+      } else {
+       section[1].ia0 = (i+3) & 3;
+       section[1].ia1 = (i+2) & 3;
+       section[1].ib0 = i;
+       section[1].ib1 = (i+1) & 3;
+      }
+    }
+    section[0].y1 = section[1].y0 - 1;
+    section[1].y1 = section[2].y0 - 1;
+    nSections = 3;
+  }
+  for (i = 0; i < nSections; ++i) {
+    section[i].xa0 = vx[section[i].ia0];
+    section[i].ya0 = vy[section[i].ia0];
+    section[i].xa1 = vx[section[i].ia1];
+    section[i].ya1 = vy[section[i].ia1];
+    section[i].xb0 = vx[section[i].ib0];
+    section[i].yb0 = vy[section[i].ib0];
+    section[i].xb1 = vx[section[i].ib1];
+    section[i].yb1 = vy[section[i].ib1];
+    section[i].dxdya = (section[i].xa1 - section[i].xa0) /
+                       (section[i].ya1 - section[i].ya0);
+    section[i].dxdyb = (section[i].xb1 - section[i].xb0) /
+                       (section[i].yb1 - section[i].yb0);
+  }
+
+  // initialize the pixel pipe
+  pipeInit(&pipe, 0, 0, NULL, pixel,
+          (Guchar)splashRound(state->fillAlpha * 255),
+          srcAlpha || (vectorAntialias && clipRes != splashClipAllInside),
+          gFalse);
+  if (vectorAntialias) {
+    drawAAPixelInit();
+  }
+
+  // make sure narrow images cover at least one pixel
+  if (nSections == 1) {
+    if (section[0].y0 == section[0].y1) {
+      ++section[0].y1;
+      clipRes = opClipRes = splashClipPartial;
+    }
+  } else {
+    if (section[0].y0 == section[2].y1) {
+      ++section[1].y1;
+      clipRes = opClipRes = splashClipPartial;
+    }
+  }
+
+  // scan all pixels inside the target region
+  for (i = 0; i < nSections; ++i) {
+    for (y = section[i].y0; y <= section[i].y1; ++y) {
+      xa = imgCoordMungeLower(section[i].xa0 +
+                             ((SplashCoord)y + 0.5 - section[i].ya0) *
+                               section[i].dxdya);
+      xb = imgCoordMungeUpper(section[i].xb0 +
+                             ((SplashCoord)y + 0.5 - section[i].yb0) *
+                               section[i].dxdyb);
+      // make sure narrow images cover at least one pixel
+      if (xa == xb) {
+       ++xb;
+      }
+      if (clipRes != splashClipAllInside) {
+       clipRes2 = state->clip->testSpan(xa, xb - 1, y);
+      } else {
+       clipRes2 = clipRes;
+      }
+      for (x = xa; x < xb; ++x) {
+       // map (x+0.5, y+0.5) back to the scaled image
+       xx = splashFloor(((SplashCoord)x + 0.5 - mat[4]) * ir00 +
+                        ((SplashCoord)y + 0.5 - mat[5]) * ir10);
+       yy = splashFloor(((SplashCoord)x + 0.5 - mat[4]) * ir01 +
+                        ((SplashCoord)y + 0.5 - mat[5]) * ir11);
+       // xx should always be within bounds, but floating point
+       // inaccuracy can cause problems
+       if (xx < 0) {
+         xx = 0;
+       } else if (xx >= scaledWidth) {
+         xx = scaledWidth - 1;
+       }
+       if (yy < 0) {
+         yy = 0;
+       } else if (yy >= scaledHeight) {
+         yy = scaledHeight - 1;
+       }
+       scaledImg->getPixel(xx, yy, pixel);
+       if (srcAlpha) {
+         pipe.shape = scaledImg->alpha[yy * scaledWidth + xx];
+       } else {
+         pipe.shape = 255;
+       }
+       if (vectorAntialias && clipRes2 != splashClipAllInside) {
+         drawAAPixel(&pipe, x, y);
+       } else {
+         drawPixel(&pipe, x, y, clipRes2 == splashClipAllInside);
+       }
+      }
+    }
+  }
+
+  delete scaledImg;
+  return splashOk;
+}
+
+// Scale an image into a SplashBitmap.
+SplashBitmap *Splash::scaleImage(SplashImageSource src, void *srcData,
+                                SplashColorMode srcMode, int nComps,
+                                GBool srcAlpha, int srcWidth, int srcHeight,
+                                int scaledWidth, int scaledHeight) {
+  SplashBitmap *dest;
+
+  dest = new SplashBitmap(scaledWidth, scaledHeight, 1, srcMode, srcAlpha);
+  if (dest->getDataPtr() != NULL) {
+    if (scaledHeight < srcHeight) {
+      if (scaledWidth < srcWidth) {
+       scaleImageYdXd(src, srcData, srcMode, nComps, srcAlpha,
+                     srcWidth, srcHeight, scaledWidth, scaledHeight, dest);
+      } else {
+       scaleImageYdXu(src, srcData, srcMode, nComps, srcAlpha,
+                     srcWidth, srcHeight, scaledWidth, scaledHeight, dest);
+      }
+    } else {
+      if (scaledWidth < srcWidth) {
+       scaleImageYuXd(src, srcData, srcMode, nComps, srcAlpha,
+                     srcWidth, srcHeight, scaledWidth, scaledHeight, dest);
+      } else {
+       scaleImageYuXu(src, srcData, srcMode, nComps, srcAlpha,
+                     srcWidth, srcHeight, scaledWidth, scaledHeight, dest);
+      }
+    }
+  } else {
+    delete dest;
+    dest = NULL;
+  }
+  return dest;
+}
+
+void Splash::scaleImageYdXd(SplashImageSource src, void *srcData,
+                           SplashColorMode srcMode, int nComps,
+                           GBool srcAlpha, int srcWidth, int srcHeight,
+                           int scaledWidth, int scaledHeight,
+                           SplashBitmap *dest) {
+  Guchar *lineBuf, *alphaLineBuf;
+  Guint *pixBuf, *alphaPixBuf;
+  Guint pix0, pix1, pix2;
+#if SPLASH_CMYK
+  Guint pix3;
+#endif
+  Guint alpha;
+  Guchar *destPtr, *destAlphaPtr;
+  int yp, yq, xp, xq, yt, y, yStep, xt, x, xStep, xx, xxa, d, d0, d1;
+  int i, j;
+
+  // Bresenham parameters for y scale
+  yp = srcHeight / scaledHeight;
+  yq = srcHeight % scaledHeight;
+
+  // Bresenham parameters for x scale
+  xp = srcWidth / scaledWidth;
+  xq = srcWidth % scaledWidth;
+
+  // allocate buffers
+  lineBuf = (Guchar *)gmallocn(srcWidth, nComps);
+  pixBuf = (Guint *)gmallocn(srcWidth, nComps * sizeof(int));
+  if (srcAlpha) {
+    alphaLineBuf = (Guchar *)gmalloc(srcWidth);
+    alphaPixBuf = (Guint *)gmallocn(srcWidth, sizeof(int));
+  } else {
+    alphaLineBuf = NULL;
+    alphaPixBuf = NULL;
+  }
+
+  // init y scale Bresenham
+  yt = 0;
+
+  destPtr = dest->data;
+  destAlphaPtr = dest->alpha;
+  for (y = 0; y < scaledHeight; ++y) {
+
+    // y scale Bresenham
+    if ((yt += yq) >= scaledHeight) {
+      yt -= scaledHeight;
+      yStep = yp + 1;
+    } else {
+      yStep = yp;
+    }
+
+    // read rows from image
+    memset(pixBuf, 0, srcWidth * nComps * sizeof(int));
+    if (srcAlpha) {
+      memset(alphaPixBuf, 0, srcWidth * sizeof(int));
+    }
+    for (i = 0; i < yStep; ++i) {
+      (*src)(srcData, lineBuf, alphaLineBuf);
+      for (j = 0; j < srcWidth * nComps; ++j) {
+       pixBuf[j] += lineBuf[j];
+      }
+      if (srcAlpha) {
+       for (j = 0; j < srcWidth; ++j) {
+         alphaPixBuf[j] += alphaLineBuf[j];
+       }
+      }
+    }
+
+    // init x scale Bresenham
+    xt = 0;
+    d0 = (1 << 23) / (yStep * xp);
+    d1 = (1 << 23) / (yStep * (xp + 1));
+
+    xx = xxa = 0;
+    for (x = 0; x < scaledWidth; ++x) {
+
+      // x scale Bresenham
+      if ((xt += xq) >= scaledWidth) {
+       xt -= scaledWidth;
+       xStep = xp + 1;
+       d = d1;
+      } else {
+       xStep = xp;
+       d = d0;
+      }
+
+      switch (srcMode) {
+
+      case splashModeMono8:
+
+       // compute the final pixel
+       pix0 = 0;
+       for (i = 0; i < xStep; ++i) {
+         pix0 += pixBuf[xx++];
+       }
+       // pix / xStep * yStep
+       pix0 = (pix0 * d) >> 23;
+
+       // store the pixel
+       *destPtr++ = (Guchar)pix0;
+       break;
+
+      case splashModeRGB8:
+
+       // compute the final pixel
+       pix0 = pix1 = pix2 = 0;
+       for (i = 0; i < xStep; ++i) {
+         pix0 += pixBuf[xx];
+         pix1 += pixBuf[xx+1];
+         pix2 += pixBuf[xx+2];
+         xx += 3;
+       }
+       // pix / xStep * yStep
+       pix0 = (pix0 * d) >> 23;
+       pix1 = (pix1 * d) >> 23;
+       pix2 = (pix2 * d) >> 23;
+
+       // store the pixel
+       *destPtr++ = (Guchar)pix0;
+       *destPtr++ = (Guchar)pix1;
+       *destPtr++ = (Guchar)pix2;
+       break;
+
+      case splashModeXBGR8:
+
+       // compute the final pixel
+       pix0 = pix1 = pix2 = 0;
+       for (i = 0; i < xStep; ++i) {
+         pix0 += pixBuf[xx];
+         pix1 += pixBuf[xx+1];
+         pix2 += pixBuf[xx+2];
+         xx += 4;
+       }
+       // pix / xStep * yStep
+       pix0 = (pix0 * d) >> 23;
+       pix1 = (pix1 * d) >> 23;
+       pix2 = (pix2 * d) >> 23;
+
+       // store the pixel
+       *destPtr++ = (Guchar)pix2;
+       *destPtr++ = (Guchar)pix1;
+       *destPtr++ = (Guchar)pix0;
+       *destPtr++ = (Guchar)255;
+       break;
+
+      case splashModeBGR8:
+
+       // compute the final pixel
+       pix0 = pix1 = pix2 = 0;
+       for (i = 0; i < xStep; ++i) {
+         pix0 += pixBuf[xx];
+         pix1 += pixBuf[xx+1];
+         pix2 += pixBuf[xx+2];
+         xx += 3;
+       }
+       // pix / xStep * yStep
+       pix0 = (pix0 * d) >> 23;
+       pix1 = (pix1 * d) >> 23;
+       pix2 = (pix2 * d) >> 23;
+
+       // store the pixel
+       *destPtr++ = (Guchar)pix2;
+       *destPtr++ = (Guchar)pix1;
+       *destPtr++ = (Guchar)pix0;
+       break;
+
+#if SPLASH_CMYK
+      case splashModeCMYK8:
+
+       // compute the final pixel
+       pix0 = pix1 = pix2 = pix3 = 0;
+       for (i = 0; i < xStep; ++i) {
+         pix0 += pixBuf[xx];
+         pix1 += pixBuf[xx+1];
+         pix2 += pixBuf[xx+2];
+         pix3 += pixBuf[xx+3];
+         xx += 4;
+       }
+       // pix / xStep * yStep
+       pix0 = (pix0 * d) >> 23;
+       pix1 = (pix1 * d) >> 23;
+       pix2 = (pix2 * d) >> 23;
+       pix3 = (pix3 * d) >> 23;
+
+       // store the pixel
+       *destPtr++ = (Guchar)pix0;
+       *destPtr++ = (Guchar)pix1;
+       *destPtr++ = (Guchar)pix2;
+       *destPtr++ = (Guchar)pix3;
+       break;
+#endif
+
+
+      case splashModeMono1: // mono1 is not allowed
+      default:
+       break;
+      }
+
+      // process alpha
+      if (srcAlpha) {
+       alpha = 0;
+       for (i = 0; i < xStep; ++i, ++xxa) {
+         alpha += alphaPixBuf[xxa];
+       }
+       // alpha / xStep * yStep
+       alpha = (alpha * d) >> 23;
+       *destAlphaPtr++ = (Guchar)alpha;
+      }
+    }
+  }
+
+  gfree(alphaPixBuf);
+  gfree(alphaLineBuf);
+  gfree(pixBuf);
+  gfree(lineBuf);
+}
+
+void Splash::scaleImageYdXu(SplashImageSource src, void *srcData,
+                           SplashColorMode srcMode, int nComps,
+                           GBool srcAlpha, int srcWidth, int srcHeight,
+                           int scaledWidth, int scaledHeight,
+                           SplashBitmap *dest) {
+  Guchar *lineBuf, *alphaLineBuf;
+  Guint *pixBuf, *alphaPixBuf;
+  Guint pix[splashMaxColorComps];
+  Guint alpha;
+  Guchar *destPtr, *destAlphaPtr;
+  int yp, yq, xp, xq, yt, y, yStep, xt, x, xStep, d;
+  int i, j;
+
+  // Bresenham parameters for y scale
+  yp = srcHeight / scaledHeight;
+  yq = srcHeight % scaledHeight;
+
+  // Bresenham parameters for x scale
+  xp = scaledWidth / srcWidth;
+  xq = scaledWidth % srcWidth;
+
+  // allocate buffers
+  lineBuf = (Guchar *)gmallocn(srcWidth, nComps);
+  pixBuf = (Guint *)gmallocn(srcWidth, nComps * sizeof(int));
+  if (srcAlpha) {
+    alphaLineBuf = (Guchar *)gmalloc(srcWidth);
+    alphaPixBuf = (Guint *)gmallocn(srcWidth, sizeof(int));
+  } else {
+    alphaLineBuf = NULL;
+    alphaPixBuf = NULL;
+  }
+
+  // init y scale Bresenham
+  yt = 0;
+
+  destPtr = dest->data;
+  destAlphaPtr = dest->alpha;
+  for (y = 0; y < scaledHeight; ++y) {
+
+    // y scale Bresenham
+    if ((yt += yq) >= scaledHeight) {
+      yt -= scaledHeight;
+      yStep = yp + 1;
+    } else {
+      yStep = yp;
+    }
+
+    // read rows from image
+    memset(pixBuf, 0, srcWidth * nComps * sizeof(int));
+    if (srcAlpha) {
+      memset(alphaPixBuf, 0, srcWidth * sizeof(int));
+    }
+    for (i = 0; i < yStep; ++i) {
+      (*src)(srcData, lineBuf, alphaLineBuf);
+      for (j = 0; j < srcWidth * nComps; ++j) {
+       pixBuf[j] += lineBuf[j];
+      }
+      if (srcAlpha) {
+       for (j = 0; j < srcWidth; ++j) {
+         alphaPixBuf[j] += alphaLineBuf[j];
+       }
+      }
+    }
+
+    // init x scale Bresenham
+    xt = 0;
+    d = (1 << 23) / yStep;
+
+    for (x = 0; x < srcWidth; ++x) {
+
+      // x scale Bresenham
+      if ((xt += xq) >= srcWidth) {
+       xt -= srcWidth;
+       xStep = xp + 1;
+      } else {
+       xStep = xp;
+      }
+
+      // compute the final pixel
+      for (i = 0; i < nComps; ++i) {
+       // pixBuf[] / yStep
+       pix[i] = (pixBuf[x * nComps + i] * d) >> 23;
+      }
+
+      // store the pixel
+      switch (srcMode) {
+      case splashModeMono1: // mono1 is not allowed
+       break;
+      case splashModeMono8:
+       for (i = 0; i < xStep; ++i) {
+         *destPtr++ = (Guchar)pix[0];
+       }
+       break;
+      case splashModeRGB8:
+       for (i = 0; i < xStep; ++i) {
+         *destPtr++ = (Guchar)pix[0];
+         *destPtr++ = (Guchar)pix[1];
+         *destPtr++ = (Guchar)pix[2];
+       }
+       break;
+      case splashModeXBGR8:
+       for (i = 0; i < xStep; ++i) {
+         *destPtr++ = (Guchar)pix[2];
+         *destPtr++ = (Guchar)pix[1];
+         *destPtr++ = (Guchar)pix[0];
+         *destPtr++ = (Guchar)255;
+       }
+       break;
+      case splashModeBGR8:
+       for (i = 0; i < xStep; ++i) {
+         *destPtr++ = (Guchar)pix[2];
+         *destPtr++ = (Guchar)pix[1];
+         *destPtr++ = (Guchar)pix[0];
+       }
+       break;
+#if SPLASH_CMYK
+      case splashModeCMYK8:
+       for (i = 0; i < xStep; ++i) {
+         *destPtr++ = (Guchar)pix[0];
+         *destPtr++ = (Guchar)pix[1];
+         *destPtr++ = (Guchar)pix[2];
+         *destPtr++ = (Guchar)pix[3];
+       }
+       break;
+#endif
+      }
+
+      // process alpha
+      if (srcAlpha) {
+       // alphaPixBuf[] / yStep
+       alpha = (alphaPixBuf[x] * d) >> 23;
+       for (i = 0; i < xStep; ++i) {
+         *destAlphaPtr++ = (Guchar)alpha;
+       }
+      }
+    }
+  }
+
+  gfree(alphaPixBuf);
+  gfree(alphaLineBuf);
+  gfree(pixBuf);
+  gfree(lineBuf);
+}
+
+void Splash::scaleImageYuXd(SplashImageSource src, void *srcData,
+                           SplashColorMode srcMode, int nComps,
+                           GBool srcAlpha, int srcWidth, int srcHeight,
+                           int scaledWidth, int scaledHeight,
+                           SplashBitmap *dest) {
+  Guchar *lineBuf, *alphaLineBuf;
+  Guint pix[splashMaxColorComps];
+  Guint alpha;
+  Guchar *destPtr0, *destPtr, *destAlphaPtr0, *destAlphaPtr;
+  int yp, yq, xp, xq, yt, y, yStep, xt, x, xStep, xx, xxa, d, d0, d1;
+  int i, j;
+
+  // Bresenham parameters for y scale
+  yp = scaledHeight / srcHeight;
+  yq = scaledHeight % srcHeight;
+
+  // Bresenham parameters for x scale
+  xp = srcWidth / scaledWidth;
+  xq = srcWidth % scaledWidth;
+
+  // allocate buffers
+  lineBuf = (Guchar *)gmallocn(srcWidth, nComps);
+  if (srcAlpha) {
+    alphaLineBuf = (Guchar *)gmalloc(srcWidth);
+  } else {
+    alphaLineBuf = NULL;
+  }
+
+  // init y scale Bresenham
+  yt = 0;
+
+  destPtr0 = dest->data;
+  destAlphaPtr0 = dest->alpha;
+  for (y = 0; y < srcHeight; ++y) {
+
+    // y scale Bresenham
+    if ((yt += yq) >= srcHeight) {
+      yt -= srcHeight;
+      yStep = yp + 1;
+    } else {
+      yStep = yp;
+    }
+
+    // read row from image
+    (*src)(srcData, lineBuf, alphaLineBuf);
+
+    // init x scale Bresenham
+    xt = 0;
+    d0 = (1 << 23) / xp;
+    d1 = (1 << 23) / (xp + 1);
+
+    xx = xxa = 0;
+    for (x = 0; x < scaledWidth; ++x) {
+
+      // x scale Bresenham
+      if ((xt += xq) >= scaledWidth) {
+       xt -= scaledWidth;
+       xStep = xp + 1;
+       d = d1;
+      } else {
+       xStep = xp;
+       d = d0;
+      }
+
+      // compute the final pixel
+      for (i = 0; i < nComps; ++i) {
+       pix[i] = 0;
+      }
+      for (i = 0; i < xStep; ++i) {
+       for (j = 0; j < nComps; ++j, ++xx) {
+         pix[j] += lineBuf[xx];
+       }
+      }
+      for (i = 0; i < nComps; ++i) {
+       // pix[] / xStep
+       pix[i] = (pix[i] * d) >> 23;
+      }
+
+      // store the pixel
+      switch (srcMode) {
+      case splashModeMono1: // mono1 is not allowed
+       break;
+      case splashModeMono8:
+       for (i = 0; i < yStep; ++i) {
+         destPtr = destPtr0 + (i * scaledWidth + x) * nComps;
+         *destPtr++ = (Guchar)pix[0];
+       }
+       break;
+      case splashModeRGB8:
+       for (i = 0; i < yStep; ++i) {
+         destPtr = destPtr0 + (i * scaledWidth + x) * nComps;
+         *destPtr++ = (Guchar)pix[0];
+         *destPtr++ = (Guchar)pix[1];
+         *destPtr++ = (Guchar)pix[2];
+       }
+       break;
+      case splashModeXBGR8:
+       for (i = 0; i < yStep; ++i) {
+         destPtr = destPtr0 + (i * scaledWidth + x) * nComps;
+         *destPtr++ = (Guchar)pix[2];
+         *destPtr++ = (Guchar)pix[1];
+         *destPtr++ = (Guchar)pix[0];
+         *destPtr++ = (Guchar)255;
+       }
+       break;
+      case splashModeBGR8:
+       for (i = 0; i < yStep; ++i) {
+         destPtr = destPtr0 + (i * scaledWidth + x) * nComps;
+         *destPtr++ = (Guchar)pix[2];
+         *destPtr++ = (Guchar)pix[1];
+         *destPtr++ = (Guchar)pix[0];
+       }
+       break;
+#if SPLASH_CMYK
+      case splashModeCMYK8:
+       for (i = 0; i < yStep; ++i) {
+         destPtr = destPtr0 + (i * scaledWidth + x) * nComps;
+         *destPtr++ = (Guchar)pix[0];
+         *destPtr++ = (Guchar)pix[1];
+         *destPtr++ = (Guchar)pix[2];
+         *destPtr++ = (Guchar)pix[3];
+       }
+       break;
+#endif
+      }
+
+      // process alpha
+      if (srcAlpha) {
+       alpha = 0;
+       for (i = 0; i < xStep; ++i, ++xxa) {
+         alpha += alphaLineBuf[xxa];
+       }
+       // alpha / xStep
+       alpha = (alpha * d) >> 23;
+       for (i = 0; i < yStep; ++i) {
+         destAlphaPtr = destAlphaPtr0 + i * scaledWidth + x;
+         *destAlphaPtr = (Guchar)alpha;
+       }
+      }
+    }
+
+    destPtr0 += yStep * scaledWidth * nComps;
+    if (srcAlpha) {
+      destAlphaPtr0 += yStep * scaledWidth;
+    }
+  }
+
+  gfree(alphaLineBuf);
+  gfree(lineBuf);
+}
+
+void Splash::scaleImageYuXu(SplashImageSource src, void *srcData,
+                           SplashColorMode srcMode, int nComps,
+                           GBool srcAlpha, int srcWidth, int srcHeight,
+                           int scaledWidth, int scaledHeight,
+                           SplashBitmap *dest) {
+  Guchar *lineBuf, *alphaLineBuf;
+  Guint pix[splashMaxColorComps];
+  Guint alpha;
+  Guchar *destPtr0, *destPtr, *destAlphaPtr0, *destAlphaPtr;
+  int yp, yq, xp, xq, yt, y, yStep, xt, x, xStep, xx;
+  int i, j;
+
+  // Bresenham parameters for y scale
+  yp = scaledHeight / srcHeight;
+  yq = scaledHeight % srcHeight;
+
+  // Bresenham parameters for x scale
+  xp = scaledWidth / srcWidth;
+  xq = scaledWidth % srcWidth;
+
+  // allocate buffers
+  lineBuf = (Guchar *)gmallocn(srcWidth, nComps);
+  if (srcAlpha) {
+    alphaLineBuf = (Guchar *)gmalloc(srcWidth);
+  } else {
+    alphaLineBuf = NULL;
+  }
+
+  // init y scale Bresenham
+  yt = 0;
+
+  destPtr0 = dest->data;
+  destAlphaPtr0 = dest->alpha;
+  for (y = 0; y < srcHeight; ++y) {
+
+    // y scale Bresenham
+    if ((yt += yq) >= srcHeight) {
+      yt -= srcHeight;
+      yStep = yp + 1;
+    } else {
+      yStep = yp;
+    }
+
+    // read row from image
+    (*src)(srcData, lineBuf, alphaLineBuf);
+
+    // init x scale Bresenham
+    xt = 0;
+
+    xx = 0;
+    for (x = 0; x < srcWidth; ++x) {
+
+      // x scale Bresenham
+      if ((xt += xq) >= srcWidth) {
+       xt -= srcWidth;
+       xStep = xp + 1;
+      } else {
+       xStep = xp;
+      }
+
+      // compute the final pixel
+      for (i = 0; i < nComps; ++i) {
+       pix[i] = lineBuf[x * nComps + i];
+      }
+
+      // store the pixel
+      switch (srcMode) {
+      case splashModeMono1: // mono1 is not allowed
+       break;
+      case splashModeMono8:
+       for (i = 0; i < yStep; ++i) {
+         for (j = 0; j < xStep; ++j) {
+           destPtr = destPtr0 + (i * scaledWidth + xx + j) * nComps;
+           *destPtr++ = (Guchar)pix[0];
+         }
+       }
+       break;
+      case splashModeRGB8:
+       for (i = 0; i < yStep; ++i) {
+         for (j = 0; j < xStep; ++j) {
+           destPtr = destPtr0 + (i * scaledWidth + xx + j) * nComps;
+           *destPtr++ = (Guchar)pix[0];
+           *destPtr++ = (Guchar)pix[1];
+           *destPtr++ = (Guchar)pix[2];
+         }
+       }
+       break;
+      case splashModeXBGR8:
+       for (i = 0; i < yStep; ++i) {
+         for (j = 0; j < xStep; ++j) {
+           destPtr = destPtr0 + (i * scaledWidth + xx + j) * nComps;
+           *destPtr++ = (Guchar)pix[2];
+           *destPtr++ = (Guchar)pix[1];
+           *destPtr++ = (Guchar)pix[0];
+           *destPtr++ = (Guchar)255;
+         }
+       }
+       break;
+      case splashModeBGR8:
+       for (i = 0; i < yStep; ++i) {
+         for (j = 0; j < xStep; ++j) {
+           destPtr = destPtr0 + (i * scaledWidth + xx + j) * nComps;
+           *destPtr++ = (Guchar)pix[2];
+           *destPtr++ = (Guchar)pix[1];
+           *destPtr++ = (Guchar)pix[0];
+         }
+       }
+       break;
+#if SPLASH_CMYK
+      case splashModeCMYK8:
+       for (i = 0; i < yStep; ++i) {
+         for (j = 0; j < xStep; ++j) {
+           destPtr = destPtr0 + (i * scaledWidth + xx + j) * nComps;
+           *destPtr++ = (Guchar)pix[0];
+           *destPtr++ = (Guchar)pix[1];
+           *destPtr++ = (Guchar)pix[2];
+           *destPtr++ = (Guchar)pix[3];
+         }
+       }
+       break;
+#endif
+      }
+
+      // process alpha
+      if (srcAlpha) {
+       alpha = alphaLineBuf[x];
+       for (i = 0; i < yStep; ++i) {
+         for (j = 0; j < xStep; ++j) {
+           destAlphaPtr = destAlphaPtr0 + i * scaledWidth + xx + j;
+           *destAlphaPtr = (Guchar)alpha;
+         }
+       }
+      }
+
+      xx += xStep;
+    }
+
+    destPtr0 += yStep * scaledWidth * nComps;
+    if (srcAlpha) {
+      destAlphaPtr0 += yStep * scaledWidth;
+    }
+  }
+
+  gfree(alphaLineBuf);
+  gfree(lineBuf);
+}
+
+void Splash::vertFlipImage(SplashBitmap *img, int width, int height,
+                          int nComps) {
+  Guchar *lineBuf;
+  Guchar *p0, *p1;
+  int w;
+
+  w = width * nComps;
+  lineBuf = (Guchar *)gmalloc(w);
+  for (p0 = img->data, p1 = img->data + (height - 1) * w;
+       p0 < p1;
+       p0 += w, p1 -= w) {
+    memcpy(lineBuf, p0, w);
+    memcpy(p0, p1, w);
+    memcpy(p1, lineBuf, w);
+  }
+  if (img->alpha) {
+    for (p0 = img->alpha, p1 = img->alpha + (height - 1) * width;
+        p0 < p1;
+        p0 += width, p1 -= width) {
+      memcpy(lineBuf, p0, width);
+      memcpy(p0, p1, width);
+      memcpy(p1, lineBuf, width);
+    }
+  }
+  gfree(lineBuf);
+}
+
+void Splash::blitImage(SplashBitmap *src, GBool srcAlpha, int xDest, int yDest,
+                      SplashClipResult clipRes) {
+  SplashPipe pipe;
+  SplashColor pixel;
+  Guchar *ap;
+  int w, h, x0, y0, x1, y1, x, y;
+
+  // split the image into clipped and unclipped regions
+  w = src->getWidth();
+  h = src->getHeight();
+  if (clipRes == splashClipAllInside) {
+    x0 = 0;
+    y0 = 0;
+    x1 = w;
+    y1 = h;
+  } else {
+    if (state->clip->getNumPaths()) {
+      x0 = x1 = w;
+      y0 = y1 = h;
+    } else {
+      if ((x0 = splashCeil(state->clip->getXMin()) - xDest) < 0) {
+       x0 = 0;
+      }
+      if ((y0 = splashCeil(state->clip->getYMin()) - yDest) < 0) {
+       y0 = 0;
+      }
+      if ((x1 = splashFloor(state->clip->getXMax()) - xDest) > w) {
+       x1 = w;
+      }
+      if (x1 < x0) {
+       x1 = x0;
+      }
+      if ((y1 = splashFloor(state->clip->getYMax()) - yDest) > h) {
+       y1 = h;
+      }
+      if (y1 < y0) {
+       y1 = y0;
+      }
+    }
+  }
+
+  // draw the unclipped region
+  if (x0 < w && y0 < h && x0 < x1 && y0 < y1) {
+    pipeInit(&pipe, xDest + x0, yDest + y0, NULL, pixel,
+            (Guchar)splashRound(state->fillAlpha * 255), srcAlpha, gFalse);
+    if (srcAlpha) {
+      for (y = y0; y < y1; ++y) {
+       pipeSetXY(&pipe, xDest + x0, yDest + y);
+       ap = src->getAlphaPtr() + y * w + x0;
+       for (x = x0; x < x1; ++x) {
+         src->getPixel(x, y, pixel);
+         pipe.shape = *ap++;
+         (this->*pipe.run)(&pipe);
+       }
+      }
+    } else {
+      for (y = y0; y < y1; ++y) {
+       pipeSetXY(&pipe, xDest + x0, yDest + y);
+       for (x = x0; x < x1; ++x) {
+         src->getPixel(x, y, pixel);
+         (this->*pipe.run)(&pipe);
+       }
+      }
+    }
+    updateModX(xDest + x0);
+    updateModX(xDest + x1 - 1);
+    updateModY(yDest + y0);
+    updateModY(yDest + y1 - 1);
+  }
+
+  // draw the clipped regions
+  if (y0 > 0) {
+    blitImageClipped(src, srcAlpha, 0, 0, xDest, yDest, w, y0);
+  }
+  if (y1 < h) {
+    blitImageClipped(src, srcAlpha, 0, y1, xDest, yDest + y1, w, h - y1);
+  }
+  if (x0 > 0 && y0 < y1) {
+    blitImageClipped(src, srcAlpha, 0, y0, xDest, yDest + y0, x0, y1 - y0);
+  }
+  if (x1 < w && y0 < y1) {
+    blitImageClipped(src, srcAlpha, x1, y0, xDest + x1, yDest + y0,
+                    w - x1, y1 - y0);
+  }
+}
+
+void Splash::blitImageClipped(SplashBitmap *src, GBool srcAlpha,
+                             int xSrc, int ySrc, int xDest, int yDest,
+                             int w, int h) {
+  SplashPipe pipe;
+  SplashColor pixel;
+  Guchar *ap;
+  int x, y;
+
+  if (vectorAntialias) {
+    pipeInit(&pipe, xDest, yDest, NULL, pixel,
+            (Guchar)splashRound(state->fillAlpha * 255), gTrue, gFalse);
+    drawAAPixelInit();
+    if (srcAlpha) {
+      for (y = 0; y < h; ++y) {
+       ap = src->getAlphaPtr() + (ySrc + y) * src->getWidth() + xSrc;
+       for (x = 0; x < w; ++x) {
+         src->getPixel(xSrc + x, ySrc + y, pixel);
+         pipe.shape = *ap++;
+         drawAAPixel(&pipe, xDest + x, yDest + y);
+       }
+      }
+    } else {
+      for (y = 0; y < h; ++y) {
+       for (x = 0; x < w; ++x) {
+         src->getPixel(xSrc + x, ySrc + y, pixel);
+         pipe.shape = 255;
+         drawAAPixel(&pipe, xDest + x, yDest + y);
+       }
+      }
+    }
+  } else {
+    pipeInit(&pipe, xDest, yDest, NULL, pixel,
+            (Guchar)splashRound(state->fillAlpha * 255), srcAlpha, gFalse);
+    if (srcAlpha) {
+      for (y = 0; y < h; ++y) {
+       ap = src->getAlphaPtr() + (ySrc + y) * src->getWidth() + xSrc;
+       pipeSetXY(&pipe, xDest, yDest + y);
+       for (x = 0; x < w; ++x) {
+         if (state->clip->test(xDest + x, yDest + y)) {
+           src->getPixel(xSrc + x, ySrc + y, pixel);
+           pipe.shape = *ap++;
+           (this->*pipe.run)(&pipe);
+           updateModX(xDest + x);
+           updateModY(yDest + y);
+         } else {
+           pipeIncX(&pipe);
+           ++ap;
+         }
+       }
+      }
+    } else {
+      for (y = 0; y < h; ++y) {
+       pipeSetXY(&pipe, xDest, yDest + y);
+       for (x = 0; x < w; ++x) {
+         if (state->clip->test(xDest + x, yDest + y)) {
+           src->getPixel(xSrc + x, ySrc + y, pixel);
+           (this->*pipe.run)(&pipe);
+           updateModX(xDest + x);
+           updateModY(yDest + y);
+         } else {
+           pipeIncX(&pipe);
+         }
+       }
+      }
+    }
+  }
+}
+
+SplashError Splash::composite(SplashBitmap *src, int xSrc, int ySrc,
+                             int xDest, int yDest, int w, int h,
+                             GBool noClip, GBool nonIsolated,
+                             GBool knockout, SplashCoord knockoutOpacity) {
+  SplashPipe pipe;
+  SplashColor pixel;
+  Guchar alpha;
+  Guchar *ap;
+  int x, y;
+
+  if (src->mode != bitmap->mode) {
+    return splashErrModeMismatch;
+  }
+
+  if (src->alpha) {
+    pipeInit(&pipe, xDest, yDest, NULL, pixel,
+            (Guchar)splashRound(state->fillAlpha * 255), gTrue, nonIsolated,
+            knockout, (Guchar)splashRound(knockoutOpacity * 255));
+    if (noClip) {
+      for (y = 0; y < h; ++y) {
+       pipeSetXY(&pipe, xDest, yDest + y);
+       ap = src->getAlphaPtr() + (ySrc + y) * src->getWidth() + xSrc;
+       for (x = 0; x < w; ++x) {
+         src->getPixel(xSrc + x, ySrc + y, pixel);
+         alpha = *ap++;
+         // this uses shape instead of alpha, which isn't technically
+         // correct, but works out the same
+         pipe.shape = alpha;
+         (this->*pipe.run)(&pipe);
+       }
+      }
+      updateModX(xDest);
+      updateModX(xDest + w - 1);
+      updateModY(yDest);
+      updateModY(yDest + h - 1);
+    } else {
+      for (y = 0; y < h; ++y) {
+       pipeSetXY(&pipe, xDest, yDest + y);
+       ap = src->getAlphaPtr() + (ySrc + y) * src->getWidth() + xSrc;
+       for (x = 0; x < w; ++x) {
+         src->getPixel(xSrc + x, ySrc + y, pixel);
+         alpha = *ap++;
+         if (state->clip->test(xDest + x, yDest + y)) {
+           // this uses shape instead of alpha, which isn't technically
+           // correct, but works out the same
+           pipe.shape = alpha;
+           (this->*pipe.run)(&pipe);
+           updateModX(xDest + x);
+           updateModY(yDest + y);
+         } else {
+           pipeIncX(&pipe);
+         }
+       }
+      }
+    }
+  } else {
+    pipeInit(&pipe, xDest, yDest, NULL, pixel,
+            (Guchar)splashRound(state->fillAlpha * 255), gFalse, nonIsolated);
+    if (noClip) {
+      for (y = 0; y < h; ++y) {
+       pipeSetXY(&pipe, xDest, yDest + y);
+       for (x = 0; x < w; ++x) {
+         src->getPixel(xSrc + x, ySrc + y, pixel);
+         (this->*pipe.run)(&pipe);
+       }
+      }
+      updateModX(xDest);
+      updateModX(xDest + w - 1);
+      updateModY(yDest);
+      updateModY(yDest + h - 1);
+    } else {
+      for (y = 0; y < h; ++y) {
+       pipeSetXY(&pipe, xDest, yDest + y);
+       for (x = 0; x < w; ++x) {
+         src->getPixel(xSrc + x, ySrc + y, pixel);
+         if (state->clip->test(xDest + x, yDest + y)) {
+           (this->*pipe.run)(&pipe);
+           updateModX(xDest + x);
+           updateModY(yDest + y);
+         } else {
+           pipeIncX(&pipe);
+         }
+       }
+      }
+    }
+  }
+
+  return splashOk;
+}
+
+void Splash::compositeBackground(SplashColorPtr color) {
+  SplashColorPtr p;
+  Guchar *q;
+  Guchar alpha, alpha1, c, color0, color1, color2;
+#if SPLASH_CMYK
+  Guchar color3;
+#endif
+  int x, y, mask;
+
+  if (unlikely(bitmap->alpha == NULL)) {
+    error(errInternal, -1, "bitmap->alpha is NULL in Splash::compositeBackground");
+    return;
+  }
+
+  switch (bitmap->mode) {
+  case splashModeMono1:
+    color0 = color[0];
+    for (y = 0; y < bitmap->height; ++y) {
+      p = &bitmap->data[y * bitmap->rowSize];
+      q = &bitmap->alpha[y * bitmap->width];
+      mask = 0x80;
+      for (x = 0; x < bitmap->width; ++x) {
+       alpha = *q++;
+       alpha1 = 255 - alpha;
+       c = (*p & mask) ? 0xff : 0x00;
+       c = div255(alpha1 * color0 + alpha * c);
+       if (c & 0x80) {
+         *p |= mask;
+       } else {
+         *p &= ~mask;
+       }
+       if (!(mask >>= 1)) {
+         mask = 0x80;
+         ++p;
+       }
+      }
+    }
+    break;
+  case splashModeMono8:
+    color0 = color[0];
+    for (y = 0; y < bitmap->height; ++y) {
+      p = &bitmap->data[y * bitmap->rowSize];
+      q = &bitmap->alpha[y * bitmap->width];
+      for (x = 0; x < bitmap->width; ++x) {
+       alpha = *q++;
+       alpha1 = 255 - alpha;
+       p[0] = div255(alpha1 * color0 + alpha * p[0]);
+       ++p;
+      }
+    }
+    break;
+  case splashModeRGB8:
+  case splashModeBGR8:
+    color0 = color[0];
+    color1 = color[1];
+    color2 = color[2];
+    for (y = 0; y < bitmap->height; ++y) {
+      p = &bitmap->data[y * bitmap->rowSize];
+      q = &bitmap->alpha[y * bitmap->width];
+      for (x = 0; x < bitmap->width; ++x) {
+       alpha = *q++;
+       if (alpha == 0)
+       {
+         p[0] = color0;
+         p[1] = color1;
+         p[2] = color2;
+       }
+       else if (alpha != 255)
+       {
+         alpha1 = 255 - alpha;
+         p[0] = div255(alpha1 * color0 + alpha * p[0]);
+         p[1] = div255(alpha1 * color1 + alpha * p[1]);
+         p[2] = div255(alpha1 * color2 + alpha * p[2]);
+       }
+       p += 3;
+      }
+    }
+    break;
+  case splashModeXBGR8:
+    color0 = color[0];
+    color1 = color[1];
+    color2 = color[2];
+    for (y = 0; y < bitmap->height; ++y) {
+      p = &bitmap->data[y * bitmap->rowSize];
+      q = &bitmap->alpha[y * bitmap->width];
+      for (x = 0; x < bitmap->width; ++x) {
+       alpha = *q++;
+       if (alpha == 0)
+       {
+         p[0] = color0;
+         p[1] = color1;
+         p[2] = color2;
+       }
+       else if (alpha != 255)
+       {
+         alpha1 = 255 - alpha;
+         p[0] = div255(alpha1 * color0 + alpha * p[0]);
+         p[1] = div255(alpha1 * color1 + alpha * p[1]);
+         p[2] = div255(alpha1 * color2 + alpha * p[2]);
+       }
+       p[3] = 255;
+       p += 4;
+      }
+    }
+    break;
+#if SPLASH_CMYK
+  case splashModeCMYK8:
+    color0 = color[0];
+    color1 = color[1];
+    color2 = color[2];
+    color3 = color[3];
+    for (y = 0; y < bitmap->height; ++y) {
+      p = &bitmap->data[y * bitmap->rowSize];
+      q = &bitmap->alpha[y * bitmap->width];
+      for (x = 0; x < bitmap->width; ++x) {
+       alpha = *q++;
+       if (alpha == 0)
+       {
+         p[0] = color0;
+         p[1] = color1;
+         p[2] = color2;
+         p[3] = color3;
+       }
+       else if (alpha != 255)
+       {
+         alpha1 = 255 - alpha;
+         p[0] = div255(alpha1 * color0 + alpha * p[0]);
+         p[1] = div255(alpha1 * color1 + alpha * p[1]);
+         p[2] = div255(alpha1 * color2 + alpha * p[2]);
+    p[3] = div255(alpha1 * color3 + alpha * p[3]);
+       }
+       p += 4;
+      }
+    }
+    break;
+#endif
+  }
+  memset(bitmap->alpha, 255, bitmap->width * bitmap->height);
+}
+
+GBool Splash::gouraudTriangleShadedFill(SplashGouraudColor *shading)
+{
+  double xdbl[3] = {0., 0., 0.};
+  double ydbl[3] = {0., 0., 0.};
+  int    x[3] = {0, 0, 0};
+  int    y[3] = {0, 0, 0};
+  double xt=0., xa=0., yt=0.;
+  double ca=0., ct=0.;
+
+  // triangle interpolation:
+  //
+  double scanLimitMapL[2] = {0., 0.};
+  double scanLimitMapR[2] = {0., 0.};
+  double scanColorMapL[2] = {0., 0.};
+  double scanColorMapR[2] = {0., 0.};
+  double scanColorMap[2] = {0., 0.};
+  int scanEdgeL[2] = { 0, 0 };
+  int scanEdgeR[2] = { 0, 0 };
+  GBool hasFurtherSegment = gFalse;
+
+  int scanLineOff = 0;
+  int bitmapOff = 0;
+  int scanLimitR = 0, scanLimitL = 0;
+
+  int bitmapWidth = bitmap->getWidth();
+  SplashClip* clip = getClip();
+  SplashBitmap *blitTarget = bitmap;
+  SplashColorPtr bitmapData = bitmap->getDataPtr();
+  SplashColorPtr bitmapAlpha = bitmap->getAlphaPtr();
+  SplashColorPtr cur = NULL;
+  SplashCoord* userToCanvasMatrix = getMatrix();
+  SplashColorMode bitmapMode = bitmap->getMode();
+  GBool hasAlpha = (bitmapAlpha != NULL);
+  int rowSize = bitmap->getRowSize();
+  int colorComps = 0;
+  switch (bitmapMode) {
+    case splashModeMono1:
+    break;
+    case splashModeMono8:
+      colorComps=1;
+    break;
+    case splashModeRGB8:
+      colorComps=3;
+    break;
+    case splashModeBGR8:
+      colorComps=3;
+    break;
+    case splashModeXBGR8:
+      colorComps=4;
+    break;
+#if SPLASH_CMYK
+    case splashModeCMYK8:
+      colorComps=4;
+    break;
+#endif
+  }
+
+  SplashPipe pipe;
+  SplashColor cSrcVal;
+
+  pipeInit(&pipe, 0, 0, NULL, cSrcVal, (Guchar)splashRound(state->strokeAlpha * 255), gFalse, gFalse);
+
+  if (vectorAntialias) {
+    if (aaBuf == NULL)
+      return gFalse; // fall back to old behaviour
+    drawAAPixelInit();
+  }
+
+  // idea:
+  // 1. If pipe->noTransparency && !state->blendFunc
+  //  -> blit directly into the drawing surface!
+  //  -> disable alpha manually.
+  // 2. Otherwise:
+  // - blit also directly, but into an intermediate surface.
+  // Afterwards, blit the intermediate surface using the drawing pipeline.
+  // This is necessary because triangle elements can be on top of each
+  // other, so the complete shading needs to be drawn before opacity is
+  // applied.
+  // - the final step, is performed using a SplashPipe:
+  // - assign the actual color into cSrcVal: pipe uses cSrcVal by reference
+  // - invoke drawPixel(&pipe,X,Y,bNoClip);
+  GBool bDirectBlit = vectorAntialias ? gFalse : pipe.noTransparency && !state->blendFunc;
+  if (!bDirectBlit) {
+    blitTarget = new SplashBitmap(bitmap->getWidth(),
+                                  bitmap->getHeight(),
+                                  bitmap->getRowPad(),
+                                  bitmap->getMode(),
+                                  gTrue,
+                                  bitmap->getRowSize() >= 0);
+    bitmapData = blitTarget->getDataPtr();
+    bitmapAlpha = blitTarget->getAlphaPtr();
+
+    // initialisation seems to be necessary:
+    int S = bitmap->getWidth() * bitmap->getHeight();
+    for (int i = 0; i < S; ++i)
+      bitmapAlpha[i] = 0;
+    hasAlpha = gTrue;
+  }
+
+  if (shading->isParameterized()) {
+    double color[3];
+    double colorinterp;
+
+    for (int i = 0; i < shading->getNTriangles(); ++i) {
+      shading->getTriangle(i,
+                           xdbl + 0, ydbl + 0, color + 0,
+                           xdbl + 1, ydbl + 1, color + 1,
+                           xdbl + 2, ydbl + 2, color + 2);
+      for (int m = 0; m < 3; ++m) {
+        xt = xdbl[m] * (double)userToCanvasMatrix[0] + ydbl[m] * (double)userToCanvasMatrix[2] + (double)userToCanvasMatrix[4];
+        yt = xdbl[m] * (double)userToCanvasMatrix[1] + ydbl[m] * (double)userToCanvasMatrix[3] + (double)userToCanvasMatrix[5];
+        xdbl[m] = xt;
+        ydbl[m] = yt;
+        // we operate on scanlines which are integer offsets into the
+        // raster image. The double offsets are of no use here.
+        x[m] = splashRound(xt);
+        y[m] = splashRound(yt);
+      }
+      // sort according to y coordinate to simplify sweep through scanlines:
+      // INSERTION SORT.
+      if (y[0] > y[1]) {
+        Guswap(x[0], x[1]);
+        Guswap(y[0], y[1]);
+        Guswap(color[0], color[1]);
+      }
+      // first two are sorted.
+      assert(y[0] <= y[1]);
+      if (y[1] > y[2]) {
+        int tmpX = x[2];
+        int tmpY = y[2];
+        double tmpC = color[2];
+        x[2] = x[1]; y[2] = y[1]; color[2] = color[1];
+
+        if (y[0] > tmpY) {
+          x[1] = x[0]; y[1] = y[0]; color[1] = color[0];
+          x[0] = tmpX; y[0] = tmpY; color[0] = tmpC;
+        } else {
+          x[1] = tmpX; y[1] = tmpY; color[1] = tmpC;
+        }
+      }
+      // first three are sorted
+      assert(y[0] <= y[1]);
+      assert(y[1] <= y[2]);
+      /////
+
+      // this here is det( T ) == 0
+      // where T is the matrix to map to barycentric coordinates.
+      if ((x[0] - x[2]) * (y[1] - y[2]) - (x[1] - x[2]) * (y[0] - y[2]) == 0)
+        continue; // degenerate triangle.
+
+      // this here initialises the scanline generation.
+      // We start with low Y coordinates and sweep up to the large Y
+      // coordinates.
+      //
+      // scanEdgeL[m] in {0,1,2} m=0,1
+      // scanEdgeR[m] in {0,1,2} m=0,1
+      //
+      // are the two edges between which scanlines are (currently)
+      // sweeped. The values {0,1,2} are indices into 'x' and 'y'.
+      // scanEdgeL[0] = 0 means: the left scan edge has (x[0],y[0]) as vertex.
+      //
+      scanEdgeL[0] = 0;
+      scanEdgeR[0] = 0;
+      if (y[0] == y[1]) {
+        scanEdgeL[0] = 1;
+        scanEdgeL[1] = scanEdgeR[1] = 2;
+
+      } else {
+        scanEdgeL[1] = 1; scanEdgeR[1] = 2;
+      }
+      assert(y[scanEdgeL[0]] < y[scanEdgeL[1]]);
+      assert(y[scanEdgeR[0]] < y[scanEdgeR[1]]);
+
+      // Ok. Now prepare the linear maps which map the y coordinate of
+      // the current scanline to the corresponding LEFT and RIGHT x
+      // coordinate (which define the scanline).
+      scanLimitMapL[0] = double(x[scanEdgeL[1]] - x[scanEdgeL[0]]) / (y[scanEdgeL[1]] - y[scanEdgeL[0]]);
+      scanLimitMapL[1] = x[scanEdgeL[0]] - y[scanEdgeL[0]] * scanLimitMapL[0];
+      scanLimitMapR[0] = double(x[scanEdgeR[1]] - x[scanEdgeR[0]]) / (y[scanEdgeR[1]] - y[scanEdgeR[0]]);
+      scanLimitMapR[1] = x[scanEdgeR[0]] - y[scanEdgeR[0]] * scanLimitMapR[0];
+
+      xa = y[1] * scanLimitMapL[0] + scanLimitMapL[1];
+      xt = y[1] * scanLimitMapR[0] + scanLimitMapR[1];
+      if (xa > xt) {
+        // I have "left" is to the right of "right".
+        // Exchange sides!
+        Guswap(scanEdgeL[0], scanEdgeR[0]);
+        Guswap(scanEdgeL[1], scanEdgeR[1]);
+        Guswap(scanLimitMapL[0], scanLimitMapR[0]);
+        Guswap(scanLimitMapL[1], scanLimitMapR[1]);
+        // FIXME I'm sure there is a more efficient way to check this.
+      }
+
+      // Same game: we can linearly interpolate the color based on the
+      // current y coordinate (that's correct for triangle
+      // interpolation due to linearity. We could also have done it in
+      // barycentric coordinates, but that's slightly more involved)
+      scanColorMapL[0] = (color[scanEdgeL[1]] - color[scanEdgeL[0]]) / (y[scanEdgeL[1]] - y[scanEdgeL[0]]);
+      scanColorMapL[1] = color[scanEdgeL[0]] - y[scanEdgeL[0]] * scanColorMapL[0];
+      scanColorMapR[0] = (color[scanEdgeR[1]] - color[scanEdgeR[0]]) / (y[scanEdgeR[1]] - y[scanEdgeR[0]]);
+      scanColorMapR[1] = color[scanEdgeR[0]] - y[scanEdgeR[0]] * scanColorMapR[0];
+
+      hasFurtherSegment = (y[1] < y[2]);
+      scanLineOff = y[0] * rowSize;
+
+      for (int Y = y[0]; Y <= y[2]; ++Y, scanLineOff += rowSize) {
+        if (hasFurtherSegment && Y == y[1]) {
+          // SWEEP EVENT: we encountered the next segment.
+          //
+          // switch to next segment, either at left end or at right
+          // end:
+          if (scanEdgeL[1] == 1) {
+            scanEdgeL[0] = 1;
+            scanEdgeL[1] = 2;
+            scanLimitMapL[0] = double(x[scanEdgeL[1]] - x[scanEdgeL[0]]) / (y[scanEdgeL[1]] - y[scanEdgeL[0]]);
+            scanLimitMapL[1] = x[scanEdgeL[0]] - y[scanEdgeL[0]] * scanLimitMapL[0];
+
+            scanColorMapL[0] = (color[scanEdgeL[1]] - color[scanEdgeL[0]]) / (y[scanEdgeL[1]] - y[scanEdgeL[0]]);
+            scanColorMapL[1] = color[scanEdgeL[0]] - y[scanEdgeL[0]] * scanColorMapL[0];
+          } else if (scanEdgeR[1] == 1) {
+            scanEdgeR[0] = 1;
+            scanEdgeR[1] = 2;
+            scanLimitMapR[0] = double(x[scanEdgeR[1]] - x[scanEdgeR[0]]) / (y[scanEdgeR[1]] - y[scanEdgeR[0]]);
+            scanLimitMapR[1] = x[scanEdgeR[0]] - y[scanEdgeR[0]] * scanLimitMapR[0];
+
+            scanColorMapR[0] = (color[scanEdgeR[1]] - color[scanEdgeR[0]]) / (y[scanEdgeR[1]] - y[scanEdgeR[0]]);
+            scanColorMapR[1] = color[scanEdgeR[0]] - y[scanEdgeR[0]] * scanColorMapR[0];
+          }
+          assert( y[scanEdgeL[0]]  <  y[scanEdgeL[1]] );
+          assert( y[scanEdgeR[0]] <  y[scanEdgeR[1]] );
+          hasFurtherSegment = gFalse;
+        }
+
+        yt = Y;
+
+        xa = yt * scanLimitMapL[0] + scanLimitMapL[1];
+        xt = yt * scanLimitMapR[0] + scanLimitMapR[1];
+
+        ca = yt * scanColorMapL[0] + scanColorMapL[1];
+        ct = yt * scanColorMapR[0] + scanColorMapR[1];
+
+        scanLimitL = splashRound(xa);
+        scanLimitR = splashRound(xt);
+
+        // Ok. Now: init the color interpolation depending on the X
+        // coordinate inside of the current scanline:
+        scanColorMap[0] = (scanLimitR == scanLimitL) ? 0. : ((ct - ca) / (scanLimitR - scanLimitL));
+        scanColorMap[1] = ca - scanLimitL * scanColorMap[0];
+
+        // handled by clipping:
+        // assert( scanLimitL >= 0 && scanLimitR < bitmap->getWidth() );
+        assert(scanLimitL <= scanLimitR || abs(scanLimitL - scanLimitR) <= 2); // allow rounding inaccuracies
+        assert(scanLineOff == Y * rowSize);
+
+        colorinterp = scanColorMap[0] * scanLimitL + scanColorMap[1];
+
+        bitmapOff = scanLineOff + scanLimitL * colorComps;
+        for (int X = scanLimitL; X <= scanLimitR; ++X, colorinterp += scanColorMap[0], bitmapOff += colorComps) {
+          // FIXME : standard rectangular clipping can be done for a
+          // complete scanline which is faster
+          // --> see SplashClip and its methods
+          if (!clip->test(X, Y))
+            continue;
+
+          assert(fabs(colorinterp - (scanColorMap[0] * X + scanColorMap[1])) < 1e-10);
+          assert(bitmapOff == Y * rowSize + colorComps * X && scanLineOff == Y * rowSize);
+
+          shading->getParameterizedColor(colorinterp, bitmapMode, &bitmapData[bitmapOff]);
+
+          // make the shading visible.
+          // Note that opacity is handled by the bDirectBlit stuff, see
+          // above for comments and below for implementation.
+          if (hasAlpha)
+            bitmapAlpha[Y * bitmapWidth + X] = 255;
+        }
+      }
+    }
+  } else {
+    return gFalse;
+  }
+
+  if (!bDirectBlit) {
+    // ok. Finalize the stuff by blitting the shading into the final
+    // geometry, this time respecting the rendering pipe.
+    int W = blitTarget->getWidth();
+    int H = blitTarget->getHeight();
+    cur = cSrcVal;
+
+    for (int X = 0; X < W; ++X) {
+      for (int Y = 0; Y < H; ++Y) {
+        if (!bitmapAlpha[Y * bitmapWidth + X])
+          continue; // draw only parts of the shading!
+        bitmapOff = Y * rowSize + colorComps * X;
+
+        for (int m = 0; m < colorComps; ++m)
+          cur[m] = bitmapData[bitmapOff + m];
+        if (vectorAntialias) {
+          drawAAPixel(&pipe, X, Y);
+        } else {
+          drawPixel(&pipe, X, Y, gTrue); // no clipping - has already been done.
+        }
+      }
+    }
+
+    delete blitTarget;
+    blitTarget = NULL;
+  }
+
+  return gTrue;
+}
+
+SplashError Splash::blitTransparent(SplashBitmap *src, int xSrc, int ySrc,
+                                   int xDest, int yDest, int w, int h) {
+  SplashColorPtr p, sp;
+  Guchar *q;
+  int x, y, mask, srcMask;
+
+  if (src->mode != bitmap->mode) {
+    return splashErrModeMismatch;
+  }
+
+  switch (bitmap->mode) {
+  case splashModeMono1:
+    for (y = 0; y < h; ++y) {
+      p = &bitmap->data[(yDest + y) * bitmap->rowSize + (xDest >> 3)];
+      mask = 0x80 >> (xDest & 7);
+      sp = &src->data[(ySrc + y) * src->rowSize + (xSrc >> 3)];
+      srcMask = 0x80 >> (xSrc & 7);
+      for (x = 0; x < w; ++x) {
+       if (*sp & srcMask) {
+         *p |= mask;
+       } else {
+         *p &= ~mask;
+       }
+       if (!(mask >>= 1)) {
+         mask = 0x80;
+         ++p;
+       }
+       if (!(srcMask >>= 1)) {
+         srcMask = 0x80;
+         ++sp;
+       }
+      }
+    }
+    break;
+  case splashModeMono8:
+    for (y = 0; y < h; ++y) {
+      p = &bitmap->data[(yDest + y) * bitmap->rowSize + xDest];
+      sp = &src->data[(ySrc + y) * bitmap->rowSize + xSrc];
+      for (x = 0; x < w; ++x) {
+       *p++ = *sp++;
+      }
+    }
+    break;
+  case splashModeRGB8:
+  case splashModeBGR8:
+    for (y = 0; y < h; ++y) {
+      p = &bitmap->data[(yDest + y) * bitmap->rowSize + 3 * xDest];
+      sp = &src->data[(ySrc + y) * src->rowSize + 3 * xSrc];
+      for (x = 0; x < w; ++x) {
+       *p++ = *sp++;
+       *p++ = *sp++;
+       *p++ = *sp++;
+      }
+    }
+    break;
+  case splashModeXBGR8:
+    for (y = 0; y < h; ++y) {
+      p = &bitmap->data[(yDest + y) * bitmap->rowSize + 4 * xDest];
+      sp = &src->data[(ySrc + y) * src->rowSize + 4 * xSrc];
+      for (x = 0; x < w; ++x) {
+       *p++ = *sp++;
+       *p++ = *sp++;
+       *p++ = *sp++;
+       *p++ = 255;
+       sp++;
+      }
+    }
+    break;
+#if SPLASH_CMYK
+  case splashModeCMYK8:
+    for (y = 0; y < h; ++y) {
+      p = &bitmap->data[(yDest + y) * bitmap->rowSize + 4 * xDest];
+      sp = &src->data[(ySrc + y) * src->rowSize + 4 * xSrc];
+      for (x = 0; x < w; ++x) {
+       *p++ = *sp++;
+       *p++ = *sp++;
+       *p++ = *sp++;
+       *p++ = *sp++;
+      }
+    }
+    break;
+#endif
+  }
+
+  if (bitmap->alpha) {
+    for (y = 0; y < h; ++y) {
+      q = &bitmap->alpha[(yDest + y) * bitmap->width + xDest];
+      memset(q, 0x00, w);
+    }
+  }
+
+  return splashOk;
+}
+
+SplashPath *Splash::makeStrokePath(SplashPath *path, SplashCoord w,
+                                   GBool flatten) {
+SplashPath *pathIn, *dashPath, *pathOut;
+  SplashCoord d, dx, dy, wdx, wdy, dxNext, dyNext, wdxNext, wdyNext;
+  SplashCoord crossprod, dotprod, miter, m;
+  GBool first, last, closed;
+  int subpathStart0, subpathStart1, seg, i0, i1, j0, j1, k0, k1;
+  int left0, left1, left2, right0, right1, right2, join0, join1, join2;
+  int leftFirst, rightFirst, firstPt;
+
+  pathOut = new SplashPath();
+
+  if (path->length == 0) {
+    return pathOut;
+  }
+
+  if (flatten) {
+    pathIn = flattenPath(path, state->matrix, state->flatness);
+    if (state->lineDashLength > 0) {
+      dashPath = makeDashedPath(pathIn);
+      delete pathIn;
+      pathIn = dashPath;
+      if (pathIn->length == 0) {
+       delete pathIn;
+       return pathOut;
+      }
+    }
+  } else {
+    pathIn = path;
+  }
+
+  subpathStart0 = subpathStart1 = 0; // make gcc happy
+  seg = 0; // make gcc happy
+  closed = gFalse; // make gcc happy
+  left0 = left1 = right0 = right1 = join0 = join1 = 0; // make gcc happy
+  leftFirst = rightFirst = firstPt = 0; // make gcc happy
+
+  i0 = 0;
+  for (i1 = i0;
+       !(pathIn->flags[i1] & splashPathLast) &&
+        i1 + 1 < pathIn->length &&
+        pathIn->pts[i1+1].x == pathIn->pts[i1].x &&
+        pathIn->pts[i1+1].y == pathIn->pts[i1].y;
+       ++i1) ;
+
+  while (i1 < pathIn->length) {
+    if ((first = pathIn->flags[i0] & splashPathFirst)) {
+      subpathStart0 = i0;
+      subpathStart1 = i1;
+      seg = 0;
+      closed = pathIn->flags[i0] & splashPathClosed;
+    }
+    j0 = i1 + 1;
+    if (j0 < pathIn->length) {
+      for (j1 = j0;
+          !(pathIn->flags[j1] & splashPathLast) &&
+            j1 + 1 < pathIn->length &&
+            pathIn->pts[j1+1].x == pathIn->pts[j1].x &&
+            pathIn->pts[j1+1].y == pathIn->pts[j1].y;
+          ++j1) ;
+    } else {
+      j1 = j0;
+    }
+    if (pathIn->flags[i1] & splashPathLast) {
+      if (first && state->lineCap == splashLineCapRound) {
+       // special case: zero-length subpath with round line caps -->
+       // draw a circle
+       pathOut->moveTo(pathIn->pts[i0].x + (SplashCoord)0.5 * w,
+                       pathIn->pts[i0].y);
+       pathOut->curveTo(pathIn->pts[i0].x + (SplashCoord)0.5 * w,
+                        pathIn->pts[i0].y + bezierCircle2 * w,
+                        pathIn->pts[i0].x + bezierCircle2 * w,
+                        pathIn->pts[i0].y + (SplashCoord)0.5 * w,
+                        pathIn->pts[i0].x,
+                        pathIn->pts[i0].y + (SplashCoord)0.5 * w);
+       pathOut->curveTo(pathIn->pts[i0].x - bezierCircle2 * w,
+                        pathIn->pts[i0].y + (SplashCoord)0.5 * w,
+                        pathIn->pts[i0].x - (SplashCoord)0.5 * w,
+                        pathIn->pts[i0].y + bezierCircle2 * w,
+                        pathIn->pts[i0].x - (SplashCoord)0.5 * w,
+                        pathIn->pts[i0].y);
+       pathOut->curveTo(pathIn->pts[i0].x - (SplashCoord)0.5 * w,
+                        pathIn->pts[i0].y - bezierCircle2 * w,
+                        pathIn->pts[i0].x - bezierCircle2 * w,
+                        pathIn->pts[i0].y - (SplashCoord)0.5 * w,
+                        pathIn->pts[i0].x,
+                        pathIn->pts[i0].y - (SplashCoord)0.5 * w);
+       pathOut->curveTo(pathIn->pts[i0].x + bezierCircle2 * w,
+                        pathIn->pts[i0].y - (SplashCoord)0.5 * w,
+                        pathIn->pts[i0].x + (SplashCoord)0.5 * w,
+                        pathIn->pts[i0].y - bezierCircle2 * w,
+                        pathIn->pts[i0].x + (SplashCoord)0.5 * w,
+                        pathIn->pts[i0].y);
+       pathOut->close();
+      }
+      i0 = j0;
+      i1 = j1;
+      continue;
+    }
+    last = pathIn->flags[j1] & splashPathLast;
+    if (last) {
+      k0 = subpathStart1 + 1;
+    } else {
+      k0 = j1 + 1;
+    }
+    for (k1 = k0;
+        !(pathIn->flags[k1] & splashPathLast) &&
+          k1 + 1 < pathIn->length &&
+          pathIn->pts[k1+1].x == pathIn->pts[k1].x &&
+          pathIn->pts[k1+1].y == pathIn->pts[k1].y;
+        ++k1) ;
+
+    // compute the deltas for segment (i1, j0)
+#if USE_FIXEDPOINT
+    // the 1/d value can be small, which introduces significant
+    // inaccuracies in fixed point mode
+    d = splashDist(pathIn->pts[i1].x, pathIn->pts[i1].y,
+                  pathIn->pts[j0].x, pathIn->pts[j0].y);
+    dx = (pathIn->pts[j0].x - pathIn->pts[i1].x) / d;
+    dy = (pathIn->pts[j0].y - pathIn->pts[i1].y) / d;
+#else
+    d = (SplashCoord)1 / splashDist(pathIn->pts[i1].x, pathIn->pts[i1].y,
+                                   pathIn->pts[j0].x, pathIn->pts[j0].y);
+    dx = d * (pathIn->pts[j0].x - pathIn->pts[i1].x);
+    dy = d * (pathIn->pts[j0].y - pathIn->pts[i1].y);
+#endif
+    wdx = (SplashCoord)0.5 * w * dx;
+    wdy = (SplashCoord)0.5 * w * dy;
+
+    // draw the start cap
+    pathOut->moveTo(pathIn->pts[i0].x - wdy, pathIn->pts[i0].y + wdx);
+    if (i0 == subpathStart0) {
+      firstPt = pathOut->length - 1;
+    }
+    if (first && !closed) {
+      switch (state->lineCap) {
+      case splashLineCapButt:
+       pathOut->lineTo(pathIn->pts[i0].x + wdy, pathIn->pts[i0].y - wdx);
+       break;
+      case splashLineCapRound:
+       pathOut->curveTo(pathIn->pts[i0].x - wdy - bezierCircle * wdx,
+                        pathIn->pts[i0].y + wdx - bezierCircle * wdy,
+                        pathIn->pts[i0].x - wdx - bezierCircle * wdy,
+                        pathIn->pts[i0].y - wdy + bezierCircle * wdx,
+                        pathIn->pts[i0].x - wdx,
+                        pathIn->pts[i0].y - wdy);
+       pathOut->curveTo(pathIn->pts[i0].x - wdx + bezierCircle * wdy,
+                        pathIn->pts[i0].y - wdy - bezierCircle * wdx,
+                        pathIn->pts[i0].x + wdy - bezierCircle * wdx,
+                        pathIn->pts[i0].y - wdx - bezierCircle * wdy,
+                        pathIn->pts[i0].x + wdy,
+                        pathIn->pts[i0].y - wdx);
+       break;
+      case splashLineCapProjecting:
+       pathOut->lineTo(pathIn->pts[i0].x - wdx - wdy,
+                       pathIn->pts[i0].y + wdx - wdy);
+       pathOut->lineTo(pathIn->pts[i0].x - wdx + wdy,
+                       pathIn->pts[i0].y - wdx - wdy);
+       pathOut->lineTo(pathIn->pts[i0].x + wdy,
+                       pathIn->pts[i0].y - wdx);
+       break;
+      }
+    } else {
+      pathOut->lineTo(pathIn->pts[i0].x + wdy, pathIn->pts[i0].y - wdx);
+    }
+
+    // draw the left side of the segment rectangle
+    left2 = pathOut->length - 1;
+    pathOut->lineTo(pathIn->pts[j0].x + wdy, pathIn->pts[j0].y - wdx);
+
+    // draw the end cap
+    if (last && !closed) {
+      switch (state->lineCap) {
+      case splashLineCapButt:
+       pathOut->lineTo(pathIn->pts[j0].x - wdy, pathIn->pts[j0].y + wdx);
+       break;
+      case splashLineCapRound:
+       pathOut->curveTo(pathIn->pts[j0].x + wdy + bezierCircle * wdx,
+                        pathIn->pts[j0].y - wdx + bezierCircle * wdy,
+                        pathIn->pts[j0].x + wdx + bezierCircle * wdy,
+                        pathIn->pts[j0].y + wdy - bezierCircle * wdx,
+                        pathIn->pts[j0].x + wdx,
+                        pathIn->pts[j0].y + wdy);
+       pathOut->curveTo(pathIn->pts[j0].x + wdx - bezierCircle * wdy,
+                        pathIn->pts[j0].y + wdy + bezierCircle * wdx,
+                        pathIn->pts[j0].x - wdy + bezierCircle * wdx,
+                        pathIn->pts[j0].y + wdx + bezierCircle * wdy,
+                        pathIn->pts[j0].x - wdy,
+                        pathIn->pts[j0].y + wdx);
+       break;
+      case splashLineCapProjecting:
+       pathOut->lineTo(pathIn->pts[j0].x + wdy + wdx,
+                       pathIn->pts[j0].y - wdx + wdy);
+       pathOut->lineTo(pathIn->pts[j0].x - wdy + wdx,
+                       pathIn->pts[j0].y + wdx + wdy);
+       pathOut->lineTo(pathIn->pts[j0].x - wdy,
+                       pathIn->pts[j0].y + wdx);
+       break;
+      }
+    } else {
+      pathOut->lineTo(pathIn->pts[j0].x - wdy, pathIn->pts[j0].y + wdx);
+    }
+
+    // draw the right side of the segment rectangle
+    // (NB: if stroke adjustment is enabled, the closepath operation MUST
+    // add a segment because this segment is used for a hint)
+    right2 = pathOut->length - 1;
+    pathOut->close(state->strokeAdjust);
+
+    // draw the join
+    join2 = pathOut->length;
+    if (!last || closed) {
+
+      // compute the deltas for segment (j1, k0)
+#if USE_FIXEDPOINT
+      // the 1/d value can be small, which introduces significant
+      // inaccuracies in fixed point mode
+      d = splashDist(pathIn->pts[j1].x, pathIn->pts[j1].y,
+                    pathIn->pts[k0].x, pathIn->pts[k0].y);
+      dxNext = (pathIn->pts[k0].x - pathIn->pts[j1].x) / d;
+      dyNext = (pathIn->pts[k0].y - pathIn->pts[j1].y) / d;
+#else
+      d = (SplashCoord)1 / splashDist(pathIn->pts[j1].x, pathIn->pts[j1].y,
+                                     pathIn->pts[k0].x, pathIn->pts[k0].y);
+      dxNext = d * (pathIn->pts[k0].x - pathIn->pts[j1].x);
+      dyNext = d * (pathIn->pts[k0].y - pathIn->pts[j1].y);
+#endif
+      wdxNext = (SplashCoord)0.5 * w * dxNext;
+      wdyNext = (SplashCoord)0.5 * w * dyNext;
+
+      // compute the join parameters
+      crossprod = dx * dyNext - dy * dxNext;
+      dotprod = -(dx * dxNext + dy * dyNext);
+      if (dotprod > 0.9999) {
+       // avoid a divide-by-zero -- set miter to something arbitrary
+       // such that sqrt(miter) will exceed miterLimit (and m is never
+       // used in that situation)
+       // (note: the comparison value (0.9999) has to be less than
+       // 1-epsilon, where epsilon is the smallest value
+       // representable in the fixed point format)
+       miter = (state->miterLimit + 1) * (state->miterLimit + 1);
+       m = 0;
+      } else {
+       miter = (SplashCoord)2 / ((SplashCoord)1 - dotprod);
+       if (miter < 1) {
+         // this can happen because of floating point inaccuracies
+         miter = 1;
+       }
+       m = splashSqrt(miter - 1);
+      }
+
+      // round join
+      if (state->lineJoin == splashLineJoinRound) {
+       pathOut->moveTo(pathIn->pts[j0].x + (SplashCoord)0.5 * w,
+                       pathIn->pts[j0].y);
+       pathOut->curveTo(pathIn->pts[j0].x + (SplashCoord)0.5 * w,
+                        pathIn->pts[j0].y + bezierCircle2 * w,
+                        pathIn->pts[j0].x + bezierCircle2 * w,
+                        pathIn->pts[j0].y + (SplashCoord)0.5 * w,
+                        pathIn->pts[j0].x,
+                        pathIn->pts[j0].y + (SplashCoord)0.5 * w);
+       pathOut->curveTo(pathIn->pts[j0].x - bezierCircle2 * w,
+                        pathIn->pts[j0].y + (SplashCoord)0.5 * w,
+                        pathIn->pts[j0].x - (SplashCoord)0.5 * w,
+                        pathIn->pts[j0].y + bezierCircle2 * w,
+                        pathIn->pts[j0].x - (SplashCoord)0.5 * w,
+                        pathIn->pts[j0].y);
+       pathOut->curveTo(pathIn->pts[j0].x - (SplashCoord)0.5 * w,
+                        pathIn->pts[j0].y - bezierCircle2 * w,
+                        pathIn->pts[j0].x - bezierCircle2 * w,
+                        pathIn->pts[j0].y - (SplashCoord)0.5 * w,
+                        pathIn->pts[j0].x,
+                        pathIn->pts[j0].y - (SplashCoord)0.5 * w);
+       pathOut->curveTo(pathIn->pts[j0].x + bezierCircle2 * w,
+                        pathIn->pts[j0].y - (SplashCoord)0.5 * w,
+                        pathIn->pts[j0].x + (SplashCoord)0.5 * w,
+                        pathIn->pts[j0].y - bezierCircle2 * w,
+                        pathIn->pts[j0].x + (SplashCoord)0.5 * w,
+                        pathIn->pts[j0].y);
+
+      } else {
+       pathOut->moveTo(pathIn->pts[j0].x, pathIn->pts[j0].y);
+
+       // angle < 180
+       if (crossprod < 0) {
+         pathOut->lineTo(pathIn->pts[j0].x - wdyNext,
+                         pathIn->pts[j0].y + wdxNext);
+         // miter join inside limit
+         if (state->lineJoin == splashLineJoinMiter &&
+             splashSqrt(miter) <= state->miterLimit) {
+           pathOut->lineTo(pathIn->pts[j0].x - wdy + wdx * m,
+                           pathIn->pts[j0].y + wdx + wdy * m);
+           pathOut->lineTo(pathIn->pts[j0].x - wdy,
+                           pathIn->pts[j0].y + wdx);
+         // bevel join or miter join outside limit
+         } else {
+           pathOut->lineTo(pathIn->pts[j0].x - wdy,
+                           pathIn->pts[j0].y + wdx);
+         }
+
+       // angle >= 180
+       } else {
+         pathOut->lineTo(pathIn->pts[j0].x + wdy,
+                         pathIn->pts[j0].y - wdx);
+         // miter join inside limit
+         if (state->lineJoin == splashLineJoinMiter &&
+             splashSqrt(miter) <= state->miterLimit) {
+           pathOut->lineTo(pathIn->pts[j0].x + wdy + wdx * m,
+                           pathIn->pts[j0].y - wdx + wdy * m);
+           pathOut->lineTo(pathIn->pts[j0].x + wdyNext,
+                           pathIn->pts[j0].y - wdxNext);
+         // bevel join or miter join outside limit
+         } else {
+           pathOut->lineTo(pathIn->pts[j0].x + wdyNext,
+                           pathIn->pts[j0].y - wdxNext);
+         }
+       }
+      }
+
+      pathOut->close();
+    }
+
+    // add stroke adjustment hints
+    if (state->strokeAdjust) {
+      if (seg == 0 && !closed) {
+       if (state->lineCap == splashLineCapButt) {
+         pathOut->addStrokeAdjustHint(firstPt, left2 + 1,
+                                      firstPt, firstPt + 1);
+         if (last) {
+           pathOut->addStrokeAdjustHint(firstPt, left2 + 1,
+                                        left2 + 1, left2 + 2);
+         }
+       } else if (state->lineCap == splashLineCapProjecting) {
+         if (last) {
+           pathOut->addStrokeAdjustHint(firstPt + 1, left2 + 2,
+                                        firstPt + 1, firstPt + 2);
+           pathOut->addStrokeAdjustHint(firstPt + 1, left2 + 2,
+                                        left2 + 2, left2 + 3);
+         } else {
+           pathOut->addStrokeAdjustHint(firstPt + 1, left2 + 1,
+                                        firstPt + 1, firstPt + 2);
+         }
+       }
+      }
+      if (seg >= 1) {
+       if (seg >= 2) {
+         pathOut->addStrokeAdjustHint(left1, right1, left0 + 1, right0);
+         pathOut->addStrokeAdjustHint(left1, right1, join0, left2);
+       } else {
+         pathOut->addStrokeAdjustHint(left1, right1, firstPt, left2);
+       }
+       pathOut->addStrokeAdjustHint(left1, right1, right2 + 1, right2 + 1);
+      }
+      left0 = left1;
+      left1 = left2;
+      right0 = right1;
+      right1 = right2;
+      join0 = join1;
+      join1 = join2;
+      if (seg == 0) {
+       leftFirst = left2;
+       rightFirst = right2;
+      }
+      if (last) {
+       if (seg >= 2) {
+         pathOut->addStrokeAdjustHint(left1, right1, left0 + 1, right0);
+         pathOut->addStrokeAdjustHint(left1, right1,
+                                      join0, pathOut->length - 1);
+       } else {
+         pathOut->addStrokeAdjustHint(left1, right1,
+                                      firstPt, pathOut->length - 1);
+       }
+       if (closed) {
+         pathOut->addStrokeAdjustHint(left1, right1, firstPt, leftFirst);
+         pathOut->addStrokeAdjustHint(left1, right1,
+                                      rightFirst + 1, rightFirst + 1);
+         pathOut->addStrokeAdjustHint(leftFirst, rightFirst,
+                                      left1 + 1, right1);
+         pathOut->addStrokeAdjustHint(leftFirst, rightFirst,
+                                      join1, pathOut->length - 1);
+       }
+       if (!closed && seg > 0) {
+         if (state->lineCap == splashLineCapButt) {
+           pathOut->addStrokeAdjustHint(left1 - 1, left1 + 1,
+                                        left1 + 1, left1 + 2);
+         } else if (state->lineCap == splashLineCapProjecting) {
+           pathOut->addStrokeAdjustHint(left1 - 1, left1 + 2,
+                                        left1 + 2, left1 + 3);
+         }
+       }
+      }
+    }
+
+    i0 = j0;
+    i1 = j1;
+    ++seg;
+  }
+
+  if (pathIn != path) {
+    delete pathIn;
+  }
+
+  return pathOut;
+}
+
+void Splash::dumpPath(SplashPath *path) {
+  int i;
+
+  for (i = 0; i < path->length; ++i) {
+    printf("  %3d: x=%8.2f y=%8.2f%s%s%s%s\n",
+          i, (double)path->pts[i].x, (double)path->pts[i].y,
+          (path->flags[i] & splashPathFirst) ? " first" : "",
+          (path->flags[i] & splashPathLast) ? " last" : "",
+          (path->flags[i] & splashPathClosed) ? " closed" : "",
+          (path->flags[i] & splashPathCurve) ? " curve" : "");
+  }
+}
+
+void Splash::dumpXPath(SplashXPath *path) {
+  int i;
+
+  for (i = 0; i < path->length; ++i) {
+    printf("  %4d: x0=%8.2f y0=%8.2f x1=%8.2f y1=%8.2f %s%s%s\n",
+          i, (double)path->segs[i].x0, (double)path->segs[i].y0,
+          (double)path->segs[i].x1, (double)path->segs[i].y1,
+          (path->segs[i].flags & splashXPathHoriz) ? "H" : " ",
+          (path->segs[i].flags & splashXPathVert) ? "V" : " ",
+          (path->segs[i].flags & splashXPathFlip) ? "P" : " ");
+  }
+}
+
+SplashError Splash::shadedFill(SplashPath *path, GBool hasBBox,
+                               SplashPattern *pattern) {
+  SplashPipe pipe;
+  SplashXPath *xPath;
+  SplashXPathScanner *scanner;
+  int xMinI, yMinI, xMaxI, yMaxI, x0, x1, y;
+  SplashClipResult clipRes;
+
+  if (vectorAntialias && aaBuf == NULL) { // should not happen, but to be secure
+    return splashErrGeneric;
+  }
+  if (path->length == 0) {
+    return splashErrEmptyPath;
+  }
+  xPath = new SplashXPath(path, state->matrix, state->flatness, gTrue);
+  if (vectorAntialias) {
+    xPath->aaScale();
+  }
+  xPath->sort();
+  yMinI = state->clip->getYMinI();
+  yMaxI = state->clip->getYMaxI();
+  if (vectorAntialias && !inShading) {
+    yMinI = yMinI * splashAASize;
+    yMaxI = (yMaxI + 1) * splashAASize - 1;
+  }
+  scanner = new SplashXPathScanner(xPath, gFalse, yMinI, yMaxI);
+
+  // get the min and max x and y values
+  if (vectorAntialias) {
+    scanner->getBBoxAA(&xMinI, &yMinI, &xMaxI, &yMaxI);
+  } else {
+    scanner->getBBox(&xMinI, &yMinI, &xMaxI, &yMaxI);
+  }
+
+  // check clipping
+  if ((clipRes = state->clip->testRect(xMinI, yMinI, xMaxI, yMaxI)) != splashClipAllOutside) {
+    // limit the y range
+    if (yMinI < state->clip->getYMinI()) {
+      yMinI = state->clip->getYMinI();
+    }
+    if (yMaxI > state->clip->getYMaxI()) {
+      yMaxI = state->clip->getYMaxI();
+    }
+
+    pipeInit(&pipe, 0, yMinI, pattern, NULL, (Guchar)splashRound(state->fillAlpha * 255), vectorAntialias && !hasBBox, gFalse);
+
+    // draw the spans
+    if (vectorAntialias) {
+      for (y = yMinI; y <= yMaxI; ++y) {
+        scanner->renderAALine(aaBuf, &x0, &x1, y);
+        if (clipRes != splashClipAllInside) {
+          state->clip->clipAALine(aaBuf, &x0, &x1, y);
+        }
+#if splashAASize == 4
+        if (!hasBBox && y > yMinI && y < yMaxI) {
+          // correct shape on left side if clip is
+          // vertical through the middle of shading:
+          Guchar *p0, *p1, *p2, *p3;
+          Guchar c1, c2, c3, c4;
+          p0 = aaBuf->getDataPtr() + (x0 >> 1);
+          p1 = p0 + aaBuf->getRowSize();
+          p2 = p1 + aaBuf->getRowSize();
+          p3 = p2 + aaBuf->getRowSize();
+          if (x0 & 1) {
+           c1 = (*p0 & 0x0f); c2 =(*p1 & 0x0f); c3 = (*p2 & 0x0f) ; c4 = (*p3 & 0x0f);
+          } else {
+            c1 = (*p0 >> 4); c2 = (*p1 >> 4); c3 = (*p2 >> 4); c4 = (*p3 >> 4);
+          }
+          if ( (c1 & 0x03) == 0x03 && (c2 & 0x03) == 0x03 && (c3 & 0x03) == 0x03 && (c4 & 0x03) == 0x03
+            && c1 == c2 && c2 == c3 && c3 == c4 &&
+            pattern->testPosition(x0 - 1, y) )
+          {
+            Guchar shapeCorrection = (x0 & 1) ? 0x0f : 0xf0;
+            *p0 |= shapeCorrection;
+            *p1 |= shapeCorrection;
+            *p2 |= shapeCorrection;
+            *p3 |= shapeCorrection;
+          }
+          // correct shape on right side if clip is
+          // through the middle of shading:
+          p0 = aaBuf->getDataPtr() + (x1 >> 1);
+          p1 = p0 + aaBuf->getRowSize();
+          p2 = p1 + aaBuf->getRowSize();
+          p3 = p2 + aaBuf->getRowSize();
+          if (x1 & 1) {
+            c1 = (*p0 & 0x0f); c2 =(*p1 & 0x0f); c3 = (*p2 & 0x0f) ; c4 = (*p3 & 0x0f);
+          } else {
+            c1 = (*p0 >> 4); c2 = (*p1 >> 4); c3 = (*p2 >> 4); c4 = (*p3 >> 4);
+          }
+
+          if ( (c1 & 0xc) == 0x0c && (c2 & 0x0c) == 0x0c && (c3 & 0x0c) == 0x0c && (c4 & 0x0c) == 0x0c
+            && c1 == c2 && c2 == c3 && c3 == c4 &&
+            pattern->testPosition(x1 + 1, y) )
+          {
+            Guchar shapeCorrection = (x1 & 1) ? 0x0f : 0xf0;
+            *p0 |= shapeCorrection;
+            *p1 |= shapeCorrection;
+            *p2 |= shapeCorrection;
+            *p3 |= shapeCorrection;
+          }
+        }
+#endif
+        drawAALine(&pipe, x0, x1, y);
+      }
+    } else {
+      SplashClipResult clipRes2;
+      for (y = yMinI; y <= yMaxI; ++y) {
+        while (scanner->getNextSpan(y, &x0, &x1)) {
+          if (clipRes == splashClipAllInside) {
+            drawSpan(&pipe, x0, x1, y, gTrue);
+          } else {
+            // limit the x range
+            if (x0 < state->clip->getXMinI()) {
+              x0 = state->clip->getXMinI();
+            }
+            if (x1 > state->clip->getXMaxI()) {
+              x1 = state->clip->getXMaxI();
+            }
+            clipRes2 = state->clip->testSpan(x0, x1, y);
+            drawSpan(&pipe, x0, x1, y, clipRes2 == splashClipAllInside);
+          }
+        }
+      }
+    }
+  }
+  opClipRes = clipRes;
+
+  delete scanner;
+  delete xPath;
+  return splashOk;
+}
diff --git a/splash/Splash.h b/splash/Splash.h
new file mode 100644 (file)
index 0000000..f4fb542
--- /dev/null
@@ -0,0 +1,407 @@
+//========================================================================
+//
+// Splash.h
+//
+//========================================================================
+
+//========================================================================
+//
+// Modified under the Poppler project - http://poppler.freedesktop.org
+//
+// All changes made under the Poppler project to this file are licensed
+// under GPL version 2 or later
+//
+// Copyright (C) 2005 Marco Pesenti Gritti <mpg@redhat.com>
+// Copyright (C) 2007, 2011 Albert Astals Cid <aacid@kde.org>
+// Copyright (C) 2010-2012 Thomas Freitag <Thomas.Freitag@alfa.de>
+// Copyright (C) 2010 Christian Feuersänger <cfeuersaenger@googlemail.com>
+//
+// To see a description of the changes please see the Changelog file that
+// came with your tarball or type make ChangeLog if you are building from git
+//
+//========================================================================
+
+#ifndef SPLASH_H
+#define SPLASH_H
+
+#ifdef USE_GCC_PRAGMAS
+#pragma interface
+#endif
+
+#include <stddef.h>
+#include "SplashTypes.h"
+#include "SplashClip.h"
+#include "SplashPattern.h"
+
+class SplashBitmap;
+struct SplashGlyphBitmap;
+class SplashState;
+class SplashScreen;
+class SplashPath;
+class SplashXPath;
+class SplashFont;
+struct SplashPipe;
+
+//------------------------------------------------------------------------
+
+// Retrieves the next line of pixels in an image mask.  Normally,
+// fills in *<line> and returns true.  If the image stream is
+// exhausted, returns false.
+typedef GBool (*SplashImageMaskSource)(void *data, SplashColorPtr pixel);
+
+// Retrieves the next line of pixels in an image.  Normally, fills in
+// *<line> and returns true.  If the image stream is exhausted,
+// returns false.
+typedef GBool (*SplashImageSource)(void *data, SplashColorPtr colorLine,
+                                  Guchar *alphaLine);
+
+//------------------------------------------------------------------------
+
+enum SplashPipeResultColorCtrl {
+#if SPLASH_CMYK
+  splashPipeResultColorNoAlphaBlendCMYK,
+#endif
+  splashPipeResultColorNoAlphaBlendRGB,
+  splashPipeResultColorNoAlphaBlendMono,
+  splashPipeResultColorAlphaNoBlendMono,
+  splashPipeResultColorAlphaNoBlendRGB,
+#if SPLASH_CMYK
+  splashPipeResultColorAlphaNoBlendCMYK,
+#endif
+  splashPipeResultColorAlphaBlendMono,
+  splashPipeResultColorAlphaBlendRGB
+#if SPLASH_CMYK
+  ,
+  splashPipeResultColorAlphaBlendCMYK
+#endif
+};
+
+//------------------------------------------------------------------------
+// Splash
+//------------------------------------------------------------------------
+
+class Splash {
+public:
+
+  // Create a new rasterizer object.
+  Splash(SplashBitmap *bitmapA, GBool vectorAntialiasA,
+        SplashScreenParams *screenParams = NULL);
+  Splash(SplashBitmap *bitmapA, GBool vectorAntialiasA,
+        SplashScreen *screenA);
+
+  ~Splash();
+
+  //----- state read
+
+  SplashCoord *getMatrix();
+  SplashPattern *getStrokePattern();
+  SplashPattern *getFillPattern();
+  SplashScreen *getScreen();
+  SplashBlendFunc getBlendFunc();
+  SplashCoord getStrokeAlpha();
+  SplashCoord getFillAlpha();
+  SplashCoord getLineWidth();
+  int getLineCap();
+  int getLineJoin();
+  SplashCoord getMiterLimit();
+  SplashCoord getFlatness();
+  SplashCoord *getLineDash();
+  int getLineDashLength();
+  SplashCoord getLineDashPhase();
+  GBool getStrokeAdjust();
+  SplashClip *getClip();
+  SplashBitmap *getSoftMask();
+  GBool getInNonIsolatedGroup();
+
+  //----- state write
+
+  void setMatrix(SplashCoord *matrix);
+  void setStrokePattern(SplashPattern *strokeColor);
+  void setFillPattern(SplashPattern *fillColor);
+  void setScreen(SplashScreen *screen);
+  void setBlendFunc(SplashBlendFunc func);
+  void setStrokeAlpha(SplashCoord alpha);
+  void setFillAlpha(SplashCoord alpha);
+  void setFillOverprint(GBool fop);
+  void setStrokeOverprint(GBool sop);
+  void setOverprintMode(int opm);
+  void setLineWidth(SplashCoord lineWidth);
+  void setLineCap(int lineCap);
+  void setLineJoin(int lineJoin);
+  void setMiterLimit(SplashCoord miterLimit);
+  void setFlatness(SplashCoord flatness);
+  // the <lineDash> array will be copied
+  void setLineDash(SplashCoord *lineDash, int lineDashLength,
+                  SplashCoord lineDashPhase);
+  void setStrokeAdjust(GBool strokeAdjust);
+  // NB: uses transformed coordinates.
+  void clipResetToRect(SplashCoord x0, SplashCoord y0,
+                      SplashCoord x1, SplashCoord y1);
+  // NB: uses transformed coordinates.
+  SplashError clipToRect(SplashCoord x0, SplashCoord y0,
+                        SplashCoord x1, SplashCoord y1);
+  // NB: uses untransformed coordinates.
+  SplashError clipToPath(SplashPath *path, GBool eo);
+  void setSoftMask(SplashBitmap *softMask);
+  void setInNonIsolatedGroup(SplashBitmap *alpha0BitmapA,
+                            int alpha0XA, int alpha0YA);
+  void setTransfer(Guchar *red, Guchar *green, Guchar *blue, Guchar *gray);
+  void setOverprintMask(Guint overprintMask, GBool additive);
+
+  //----- state save/restore
+
+  void saveState();
+  SplashError restoreState();
+
+  //----- drawing operations
+
+  // Fill the bitmap with <color>.  This is not subject to clipping.
+  void clear(SplashColorPtr color, Guchar alpha = 0x00);
+
+  // Stroke a path using the current stroke pattern.
+  SplashError stroke(SplashPath *path);
+
+  // Fill a path using the current fill pattern.
+  SplashError fill(SplashPath *path, GBool eo);
+
+  // Fill a path, XORing with the current fill pattern.
+  SplashError xorFill(SplashPath *path, GBool eo);
+
+  // Draw a character, using the current fill pattern.
+  SplashError fillChar(SplashCoord x, SplashCoord y, int c, SplashFont *font);
+
+  // Draw a glyph, using the current fill pattern.  This function does
+  // not free any data, i.e., it ignores glyph->freeData.
+  void fillGlyph(SplashCoord x, SplashCoord y,
+                       SplashGlyphBitmap *glyph);
+
+  // Draws an image mask using the fill color.  This will read <h>
+  // lines of <w> pixels from <src>, starting with the top line.  "1"
+  // pixels will be drawn with the current fill color; "0" pixels are
+  // transparent.  The matrix:
+  //    [ mat[0] mat[1] 0 ]
+  //    [ mat[2] mat[3] 0 ]
+  //    [ mat[4] mat[5] 1 ]
+  // maps a unit square to the desired destination for the image, in
+  // PostScript style:
+  //    [x' y' 1] = [x y 1] * mat
+  // Note that the Splash y axis points downward, and the image source
+  // is assumed to produce pixels in raster order, starting from the
+  // top line.
+  SplashError fillImageMask(SplashImageMaskSource src, void *srcData,
+                           int w, int h, SplashCoord *mat,
+                           GBool glyphMode);
+
+  // Draw an image.  This will read <h> lines of <w> pixels from
+  // <src>, starting with the top line.  These pixels are assumed to
+  // be in the source mode, <srcMode>.  If <srcAlpha> is true, the
+  // alpha values returned by <src> are used; otherwise they are
+  // ignored.  The following combinations of source and target modes
+  // are supported:
+  //    source       target
+  //    ------       ------
+  //    Mono1        Mono1
+  //    Mono8        Mono1   -- with dithering
+  //    Mono8        Mono8
+  //    RGB8         RGB8
+  //    BGR8         BGR8
+  //    CMYK8        CMYK8
+  // The matrix behaves as for fillImageMask.
+  SplashError drawImage(SplashImageSource src, void *srcData,
+                       SplashColorMode srcMode, GBool srcAlpha,
+                       int w, int h, SplashCoord *mat, GBool tilingPattern = gFalse);
+
+  // Composite a rectangular region from <src> onto this Splash
+  // object.
+  SplashError composite(SplashBitmap *src, int xSrc, int ySrc,
+                       int xDest, int yDest, int w, int h,
+                       GBool noClip, GBool nonIsolated,
+                       GBool knockout = gFalse, SplashCoord knockoutOpacity = 1.0);
+
+  // Composite this Splash object onto a background color.  The
+  // background alpha is assumed to be 1.
+  void compositeBackground(SplashColorPtr color);
+
+  // Copy a rectangular region from <src> onto the bitmap belonging to
+  // this Splash object.  The destination alpha values are all set to
+  // zero.
+  SplashError blitTransparent(SplashBitmap *src, int xSrc, int ySrc,
+                             int xDest, int yDest, int w, int h);
+
+  //----- misc
+
+  // Construct a path for a stroke, given the path to be stroked and
+  // the line width <w>.  All other stroke parameters are taken from
+  // the current state.  If <flatten> is true, this function will
+  // first flatten the path and handle the linedash.
+  SplashPath *makeStrokePath(SplashPath *path, SplashCoord w,
+                            GBool flatten = gTrue);
+
+  // Return the associated bitmap.
+  SplashBitmap *getBitmap() { return bitmap; }
+
+  // Set the minimum line width.
+  void setMinLineWidth(SplashCoord w) { minLineWidth = w; }
+
+  // Get a bounding box which includes all modifications since the
+  // last call to clearModRegion.
+  void getModRegion(int *xMin, int *yMin, int *xMax, int *yMax)
+    { *xMin = modXMin; *yMin = modYMin; *xMax = modXMax; *yMax = modYMax; }
+
+  // Clear the modified region bounding box.
+  void clearModRegion();
+
+  // Get clipping status for the last drawing operation subject to
+  // clipping.
+  SplashClipResult getClipRes() { return opClipRes; }
+
+  // Toggle debug mode on or off.
+  void setDebugMode(GBool debugModeA) { debugMode = debugModeA; }
+
+#if 1 //~tmp: turn off anti-aliasing temporarily
+  void setInShading(GBool sh) { inShading = sh; }
+  GBool getVectorAntialias() { return vectorAntialias; }
+  void setVectorAntialias(GBool vaa) { vectorAntialias = vaa; }
+#endif
+
+  // Do shaded fills with dynamic patterns
+  SplashError shadedFill(SplashPath *path, GBool hasBBox,
+                         SplashPattern *pattern);
+  // Draw a gouraud triangle shading.
+  GBool gouraudTriangleShadedFill(SplashGouraudColor *shading);
+
+private:
+
+  void pipeInit(SplashPipe *pipe, int x, int y,
+               SplashPattern *pattern, SplashColorPtr cSrc,
+               Guchar aInput, GBool usesShape,
+               GBool nonIsolatedGroup,
+               GBool knockout = gFalse, Guchar knockoutOpacity = 255);
+  void pipeRun(SplashPipe *pipe);
+  void pipeRunSimpleMono1(SplashPipe *pipe);
+  void pipeRunSimpleMono8(SplashPipe *pipe);
+  void pipeRunSimpleRGB8(SplashPipe *pipe);
+  void pipeRunSimpleXBGR8(SplashPipe *pipe);
+  void pipeRunSimpleBGR8(SplashPipe *pipe);
+#if SPLASH_CMYK
+  void pipeRunSimpleCMYK8(SplashPipe *pipe);
+#endif
+  void pipeRunAAMono1(SplashPipe *pipe);
+  void pipeRunAAMono8(SplashPipe *pipe);
+  void pipeRunAARGB8(SplashPipe *pipe);
+  void pipeRunAAXBGR8(SplashPipe *pipe);
+  void pipeRunAABGR8(SplashPipe *pipe);
+#if SPLASH_CMYK
+  void pipeRunAACMYK8(SplashPipe *pipe);
+#endif
+  void pipeSetXY(SplashPipe *pipe, int x, int y);
+  void pipeIncX(SplashPipe *pipe);
+  void drawPixel(SplashPipe *pipe, int x, int y, GBool noClip);
+  void drawAAPixelInit();
+  void drawAAPixel(SplashPipe *pipe, int x, int y);
+  void drawSpan(SplashPipe *pipe, int x0, int x1, int y, GBool noClip);
+  void drawAALine(SplashPipe *pipe, int x0, int x1, int y);
+  void transform(SplashCoord *matrix, SplashCoord xi, SplashCoord yi,
+                SplashCoord *xo, SplashCoord *yo);
+  void updateModX(int x);
+  void updateModY(int y);
+  void strokeNarrow(SplashPath *path);
+  void strokeWide(SplashPath *path, SplashCoord w);
+  SplashPath *flattenPath(SplashPath *path, SplashCoord *matrix,
+                         SplashCoord flatness);
+  void flattenCurve(SplashCoord x0, SplashCoord y0,
+                   SplashCoord x1, SplashCoord y1,
+                   SplashCoord x2, SplashCoord y2,
+                   SplashCoord x3, SplashCoord y3,
+                   SplashCoord *matrix, SplashCoord flatness2,
+                   SplashPath *fPath);
+  SplashPath *makeDashedPath(SplashPath *xPath);
+  SplashError fillWithPattern(SplashPath *path, GBool eo,
+                             SplashPattern *pattern, SplashCoord alpha);
+  GBool pathAllOutside(SplashPath *path);
+  void fillGlyph2(int x0, int y0, SplashGlyphBitmap *glyph, GBool noclip);
+  void arbitraryTransformMask(SplashImageMaskSource src, void *srcData,
+                             int srcWidth, int srcHeight,
+                             SplashCoord *mat, GBool glyphMode);
+  SplashBitmap *scaleMask(SplashImageMaskSource src, void *srcData,
+                         int srcWidth, int srcHeight,
+                         int scaledWidth, int scaledHeight);
+  void scaleMaskYdXd(SplashImageMaskSource src, void *srcData,
+                    int srcWidth, int srcHeight,
+                    int scaledWidth, int scaledHeight,
+                    SplashBitmap *dest);
+  void scaleMaskYdXu(SplashImageMaskSource src, void *srcData,
+                    int srcWidth, int srcHeight,
+                    int scaledWidth, int scaledHeight,
+                    SplashBitmap *dest);
+  void scaleMaskYuXd(SplashImageMaskSource src, void *srcData,
+                    int srcWidth, int srcHeight,
+                    int scaledWidth, int scaledHeight,
+                    SplashBitmap *dest);
+  void scaleMaskYuXu(SplashImageMaskSource src, void *srcData,
+                    int srcWidth, int srcHeight,
+                    int scaledWidth, int scaledHeight,
+                    SplashBitmap *dest);
+  void blitMask(SplashBitmap *src, int xDest, int yDest,
+               SplashClipResult clipRes);
+  SplashError arbitraryTransformImage(SplashImageSource src, void *srcData,
+                              SplashColorMode srcMode, int nComps,
+                              GBool srcAlpha,
+                              int srcWidth, int srcHeight,
+                              SplashCoord *mat, GBool tilingPattern = gFalse);
+  SplashBitmap *scaleImage(SplashImageSource src, void *srcData,
+                          SplashColorMode srcMode, int nComps,
+                          GBool srcAlpha, int srcWidth, int srcHeight,
+                          int scaledWidth, int scaledHeight);
+  void scaleImageYdXd(SplashImageSource src, void *srcData,
+                     SplashColorMode srcMode, int nComps,
+                     GBool srcAlpha, int srcWidth, int srcHeight,
+                     int scaledWidth, int scaledHeight,
+                     SplashBitmap *dest);
+  void scaleImageYdXu(SplashImageSource src, void *srcData,
+                     SplashColorMode srcMode, int nComps,
+                     GBool srcAlpha, int srcWidth, int srcHeight,
+                     int scaledWidth, int scaledHeight,
+                     SplashBitmap *dest);
+  void scaleImageYuXd(SplashImageSource src, void *srcData,
+                     SplashColorMode srcMode, int nComps,
+                     GBool srcAlpha, int srcWidth, int srcHeight,
+                     int scaledWidth, int scaledHeight,
+                     SplashBitmap *dest);
+  void scaleImageYuXu(SplashImageSource src, void *srcData,
+                     SplashColorMode srcMode, int nComps,
+                     GBool srcAlpha, int srcWidth, int srcHeight,
+                     int scaledWidth, int scaledHeight,
+                     SplashBitmap *dest);
+  void vertFlipImage(SplashBitmap *img, int width, int height,
+                    int nComps);
+  void blitImage(SplashBitmap *src, GBool srcAlpha, int xDest, int yDest,
+                SplashClipResult clipRes);
+  void blitImageClipped(SplashBitmap *src, GBool srcAlpha,
+                       int xSrc, int ySrc, int xDest, int yDest,
+                       int w, int h);
+  void dumpPath(SplashPath *path);
+  void dumpXPath(SplashXPath *path);
+
+  static SplashPipeResultColorCtrl pipeResultColorNoAlphaBlend[];
+  static SplashPipeResultColorCtrl pipeResultColorAlphaNoBlend[];
+  static SplashPipeResultColorCtrl pipeResultColorAlphaBlend[];
+  static int pipeNonIsoGroupCorrection[];
+
+  SplashBitmap *bitmap;
+  SplashState *state;
+  SplashBitmap *aaBuf;
+  int aaBufY;
+  SplashBitmap *alpha0Bitmap;  // for non-isolated groups, this is the
+                               //   bitmap containing the alpha0 values
+  int alpha0X, alpha0Y;                // offset within alpha0Bitmap
+  SplashCoord aaGamma[splashAASize * splashAASize + 1];
+  SplashCoord minLineWidth;
+  int modXMin, modYMin, modXMax, modYMax;
+  SplashClipResult opClipRes;
+  GBool vectorAntialias;
+  GBool inShading;
+  GBool debugMode;
+};
+
+#endif
diff --git a/splash/SplashBitmap.cc b/splash/SplashBitmap.cc
new file mode 100644 (file)
index 0000000..cd85543
--- /dev/null
@@ -0,0 +1,532 @@
+//========================================================================
+//
+// SplashBitmap.cc
+//
+//========================================================================
+
+//========================================================================
+//
+// Modified under the Poppler project - http://poppler.freedesktop.org
+//
+// All changes made under the Poppler project to this file are licensed
+// under GPL version 2 or later
+//
+// Copyright (C) 2006, 2009, 2010, 2012 Albert Astals Cid <aacid@kde.org>
+// Copyright (C) 2007 Ilmari Heikkinen <ilmari.heikkinen@gmail.com>
+// Copyright (C) 2009 Shen Liang <shenzhuxi@gmail.com>
+// Copyright (C) 2009 Stefan Thomas <thomas@eload24.com>
+// Copyright (C) 2010 Adrian Johnson <ajohnson@redneon.com>
+// Copyright (C) 2010 Harry Roberts <harry.roberts@midnight-labs.org>
+// Copyright (C) 2010 Christian Feuersänger <cfeuersaenger@googlemail.com>
+// Copyright (C) 2010 William Bader <williambader@hotmail.com>
+// Copyright (C) 2011, 2012 Thomas Freitag <Thomas.Freitag@alfa.de>
+// Copyright (C) 2012 Anthony Wesley <awesley@smartnetworks.com.au>
+//
+// To see a description of the changes please see the Changelog file that
+// came with your tarball or type make ChangeLog if you are building from git
+//
+//========================================================================
+
+#include <config.h>
+
+#ifdef USE_GCC_PRAGMAS
+#pragma implementation
+#endif
+
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+#include <limits.h>
+#include "goo/gmem.h"
+#include "SplashErrorCodes.h"
+#include "SplashBitmap.h"
+#include "poppler/Error.h"
+#include "goo/JpegWriter.h"
+#include "goo/PNGWriter.h"
+#include "goo/TiffWriter.h"
+#include "goo/ImgWriter.h"
+
+//------------------------------------------------------------------------
+// SplashBitmap
+//------------------------------------------------------------------------
+
+SplashBitmap::SplashBitmap(int widthA, int heightA, int rowPadA,
+                          SplashColorMode modeA, GBool alphaA,
+                          GBool topDown) {
+  width = widthA;
+  height = heightA;
+  mode = modeA;
+  rowPad = rowPadA;
+  switch (mode) {
+  case splashModeMono1:
+    if (width > 0) {
+      rowSize = (width + 7) >> 3;
+    } else {
+      rowSize = -1;
+    }
+    break;
+  case splashModeMono8:
+    if (width > 0) {
+      rowSize = width;
+    } else {
+      rowSize = -1;
+    }
+    break;
+  case splashModeRGB8:
+  case splashModeBGR8:
+    if (width > 0 && width <= INT_MAX / 3) {
+      rowSize = width * 3;
+    } else {
+      rowSize = -1;
+    }
+    break;
+  case splashModeXBGR8:
+    if (width > 0 && width <= INT_MAX / 4) {
+      rowSize = width * 4;
+    } else {
+      rowSize = -1;
+    }
+    break;
+#if SPLASH_CMYK
+  case splashModeCMYK8:
+    if (width > 0 && width <= INT_MAX / 4) {
+      rowSize = width * 4;
+    } else {
+      rowSize = -1;
+    }
+    break;
+#endif
+  }
+  if (rowSize > 0) {
+    rowSize += rowPad - 1;
+    rowSize -= rowSize % rowPad;
+  }
+  data = (SplashColorPtr)gmallocn_checkoverflow(rowSize, height);
+  if (data != NULL) {
+    if (!topDown) {
+      data += (height - 1) * rowSize;
+      rowSize = -rowSize;
+    }
+    if (alphaA) {
+      alpha = (Guchar *)gmallocn(width, height);
+    } else {
+      alpha = NULL;
+    }
+  } else {
+    alpha = NULL;
+  }
+}
+
+SplashBitmap *SplashBitmap::copy(SplashBitmap *src) {
+  SplashBitmap *result = new SplashBitmap(src->getWidth(), src->getHeight(), src->getRowPad(), 
+        src->getMode(), src->getAlphaPtr() != NULL, src->getRowSize() >= 0);
+  Guchar *dataSource = src->getDataPtr();
+  Guchar *dataDest = result->getDataPtr();
+  int amount = src->getRowSize();
+  if (amount < 0) {
+    dataSource = dataSource + (src->getHeight() - 1) * amount;
+    dataDest = dataDest + (src->getHeight() - 1) * amount;
+    amount *= -src->getHeight();
+  } else {
+    amount *= src->getHeight();
+  }
+  memcpy(dataDest, dataSource, amount);
+  if (src->getAlphaPtr() != NULL) {
+    memcpy(result->getAlphaPtr(), src->getAlphaPtr(), src->getWidth() * src->getHeight());
+  }
+  return result;
+}
+
+SplashBitmap::~SplashBitmap() {
+  if (data) {
+    if (rowSize < 0) {
+      gfree(data + (height - 1) * rowSize);
+    } else {
+      gfree(data);
+    }
+  }
+  gfree(alpha);
+}
+
+
+SplashError SplashBitmap::writePNMFile(char *fileName) {
+  FILE *f;
+  SplashError e;
+
+  if (!(f = fopen(fileName, "wb"))) {
+    return splashErrOpenFile;
+  }
+
+  e = this->writePNMFile(f);
+  
+  fclose(f);
+  return e;
+}
+
+
+SplashError SplashBitmap::writePNMFile(FILE *f) {
+  SplashColorPtr row, p;
+  int x, y;
+
+  switch (mode) {
+
+  case splashModeMono1:
+    fprintf(f, "P4\n%d %d\n", width, height);
+    row = data;
+    for (y = 0; y < height; ++y) {
+      p = row;
+      for (x = 0; x < width; x += 8) {
+       fputc(*p ^ 0xff, f);
+       ++p;
+      }
+      row += rowSize;
+    }
+    break;
+
+  case splashModeMono8:
+    fprintf(f, "P5\n%d %d\n255\n", width, height);
+    row = data;
+    for (y = 0; y < height; ++y) {
+      fwrite(row, 1, width, f);
+      row += rowSize;
+    }
+    break;
+
+  case splashModeRGB8:
+    fprintf(f, "P6\n%d %d\n255\n", width, height);
+    row = data;
+    for (y = 0; y < height; ++y) {
+      fwrite(row, 1, 3 * width, f);
+      row += rowSize;
+    }
+    break;
+
+  case splashModeXBGR8:
+    fprintf(f, "P6\n%d %d\n255\n", width, height);
+    row = data;
+    for (y = 0; y < height; ++y) {
+      p = row;
+      for (x = 0; x < width; ++x) {
+       fputc(splashBGR8R(p), f);
+       fputc(splashBGR8G(p), f);
+       fputc(splashBGR8B(p), f);
+       p += 4;
+      }
+      row += rowSize;
+    }
+    break;
+
+
+  case splashModeBGR8:
+    fprintf(f, "P6\n%d %d\n255\n", width, height);
+    row = data;
+    for (y = 0; y < height; ++y) {
+      p = row;
+      for (x = 0; x < width; ++x) {
+       fputc(splashBGR8R(p), f);
+       fputc(splashBGR8G(p), f);
+       fputc(splashBGR8B(p), f);
+       p += 3;
+      }
+      row += rowSize;
+    }
+    break;
+
+#if SPLASH_CMYK
+  case splashModeCMYK8:
+    // PNM doesn't support CMYK
+    error(errInternal, -1, "unsupported SplashBitmap mode");
+    return splashErrGeneric;
+    break;
+#endif
+  }
+  return splashOk;
+}
+
+SplashError SplashBitmap::writeAlphaPGMFile(char *fileName) {
+  FILE *f;
+
+  if (!alpha) {
+    return splashErrModeMismatch;
+  }
+  if (!(f = fopen(fileName, "wb"))) {
+    return splashErrOpenFile;
+  }
+  fprintf(f, "P5\n%d %d\n255\n", width, height);
+  fwrite(alpha, 1, width * height, f);
+  fclose(f);
+  return splashOk;
+}
+
+void SplashBitmap::getPixel(int x, int y, SplashColorPtr pixel) {
+  SplashColorPtr p;
+
+  if (y < 0 || y >= height || x < 0 || x >= width) {
+    return;
+  }
+  switch (mode) {
+  case splashModeMono1:
+    p = &data[y * rowSize + (x >> 3)];
+    pixel[0] = (p[0] & (0x80 >> (x & 7))) ? 0xff : 0x00;
+    break;
+  case splashModeMono8:
+    p = &data[y * rowSize + x];
+    pixel[0] = p[0];
+    break;
+  case splashModeRGB8:
+    p = &data[y * rowSize + 3 * x];
+    pixel[0] = p[0];
+    pixel[1] = p[1];
+    pixel[2] = p[2];
+    break;
+  case splashModeXBGR8:
+    p = &data[y * rowSize + 4 * x];
+    pixel[0] = p[2];
+    pixel[1] = p[1];
+    pixel[2] = p[0];
+    pixel[3] = p[3];
+    break;
+  case splashModeBGR8:
+    p = &data[y * rowSize + 3 * x];
+    pixel[0] = p[2];
+    pixel[1] = p[1];
+    pixel[2] = p[0];
+    break;
+#if SPLASH_CMYK
+  case splashModeCMYK8:
+    p = &data[y * rowSize + 4 * x];
+    pixel[0] = p[0];
+    pixel[1] = p[1];
+    pixel[2] = p[2];
+    pixel[3] = p[3];
+    break;
+#endif
+  }
+}
+
+Guchar SplashBitmap::getAlpha(int x, int y) {
+  return alpha[y * width + x];
+}
+
+SplashColorPtr SplashBitmap::takeData() {
+  SplashColorPtr data2;
+
+  data2 = data;
+  data = NULL;
+  return data2;
+}
+
+SplashError SplashBitmap::writeImgFile(SplashImageFileFormat format, char *fileName, int hDPI, int vDPI, const char *compressionString) {
+  FILE *f;
+  SplashError e;
+
+  if (!(f = fopen(fileName, "wb"))) {
+    return splashErrOpenFile;
+  }
+
+  e = writeImgFile(format, f, hDPI, vDPI, compressionString);
+  
+  fclose(f);
+  return e;
+}
+
+SplashError SplashBitmap::writeImgFile(SplashImageFileFormat format, FILE *f, int hDPI, int vDPI, const char *compressionString) {
+  ImgWriter *writer;
+       SplashError e;
+  
+  switch (format) {
+    #ifdef ENABLE_LIBPNG
+    case splashFormatPng:
+         writer = new PNGWriter();
+      break;
+    #endif
+
+    #ifdef ENABLE_LIBJPEG
+    #ifdef SPLASH_CMYK
+    case splashFormatJpegCMYK:
+      writer = new JpegWriter(JCS_CMYK);
+      break;
+    #endif
+    case splashFormatJpeg:
+      writer = new JpegWriter();
+      break;
+    #endif
+       
+    #ifdef ENABLE_LIBTIFF
+    case splashFormatTiff:
+      writer = new TiffWriter();
+      if (writer) {
+        ((TiffWriter *)writer)->setCompressionString(compressionString);
+        ((TiffWriter *)writer)->setSplashMode(mode);
+      }
+      break;
+    #endif
+
+    default:
+      // Not the greatest error message, but users of this function should
+      // have already checked whether their desired format is compiled in.
+      error(errInternal, -1, "Support for this image type not compiled in");
+      return splashErrGeneric;
+  }
+
+       e = writeImgFile(writer, f, hDPI, vDPI);
+       delete writer;
+       return e;
+}
+
+#include "poppler/GfxState_helpers.h"
+
+void SplashBitmap::getRGBLine(int yl, SplashColorPtr line) {
+  SplashColor col;
+  double c, m, y, k, c1, m1, y1, k1, r, g, b;
+
+  for (int x = 0; x < width; x++) {
+    getPixel(x, yl, col);
+    c = byteToDbl(col[0]);
+    m = byteToDbl(col[1]);
+    y = byteToDbl(col[2]);
+    k = byteToDbl(col[3]);
+    c1 = 1 - c;
+    m1 = 1 - m;
+    y1 = 1 - y;
+    k1 = 1 - k;
+    cmykToRGBMatrixMultiplication(c, m, y, k, c1, m1, y1, k1, r, g, b);
+    *line++ = dblToByte(clip01(r));
+    *line++ = dblToByte(clip01(g));
+    *line++ = dblToByte(clip01(b));
+  }
+}
+
+SplashError SplashBitmap::writeImgFile(ImgWriter *writer, FILE *f, int hDPI, int vDPI) {
+  if (mode != splashModeRGB8 && mode != splashModeMono8 && mode != splashModeMono1 && mode != splashModeXBGR8
+#if SPLASH_CMYK
+      && mode != splashModeCMYK8
+#endif
+     ) {
+    error(errInternal, -1, "unsupported SplashBitmap mode");
+    return splashErrGeneric;
+  }
+
+  if (!writer->init(f, width, height, hDPI, vDPI)) {
+    return splashErrGeneric;
+  }
+
+  switch (mode) {
+#if SPLASH_CMYK
+    case splashModeCMYK8:
+      if (writer->supportCMYK()) {
+        SplashColorPtr row;
+        unsigned char **row_pointers = new unsigned char*[height];
+        row = data;
+
+        for (int y = 0; y < height; ++y) {
+          row_pointers[y] = row;
+          row += rowSize;
+        }
+        if (!writer->writePointers(row_pointers, height)) {
+          delete[] row_pointers;
+          return splashErrGeneric;
+        }
+        delete[] row_pointers;
+      } else {
+        unsigned char *row = new unsigned char[3 * width];
+        for (int y = 0; y < height; y++) {
+          getRGBLine(y, row);
+          if (!writer->writeRow(&row)) {
+            delete[] row;
+            return splashErrGeneric;
+          }
+        }
+        delete[] row;
+      }
+    break;
+#endif
+    case splashModeRGB8:
+    {
+      SplashColorPtr row;
+      unsigned char **row_pointers = new unsigned char*[height];
+      row = data;
+
+      for (int y = 0; y < height; ++y) {
+        row_pointers[y] = row;
+        row += rowSize;
+      }
+      if (!writer->writePointers(row_pointers, height)) {
+        delete[] row_pointers;
+        return splashErrGeneric;
+      }
+      delete[] row_pointers;
+    }
+    break;
+    
+    case splashModeXBGR8:
+    {
+      unsigned char *row = new unsigned char[3 * width];
+      for (int y = 0; y < height; y++) {
+        // Convert into a PNG row
+        for (int x = 0; x < width; x++) {
+          row[3*x] = data[y * rowSize + x * 4 + 2];
+          row[3*x+1] = data[y * rowSize + x * 4 + 1];
+          row[3*x+2] = data[y * rowSize + x * 4];
+        }
+
+        if (!writer->writeRow(&row)) {
+          delete[] row;
+          return splashErrGeneric;
+        }
+      }
+      delete[] row;
+    }
+    break;
+    
+    case splashModeMono8:
+    {
+      unsigned char *row = new unsigned char[3 * width];
+      for (int y = 0; y < height; y++) {
+        // Convert into a PNG row
+        for (int x = 0; x < width; x++) {
+          row[3*x] = data[y * rowSize + x];
+          row[3*x+1] = data[y * rowSize + x];
+          row[3*x+2] = data[y * rowSize + x];
+        }
+
+        if (!writer->writeRow(&row)) {
+          delete[] row;
+          return splashErrGeneric;
+        }
+      }
+      delete[] row;
+    }
+    break;
+    
+    case splashModeMono1:
+    {
+      unsigned char *row = new unsigned char[3 * width];
+      for (int y = 0; y < height; y++) {
+        // Convert into a PNG row
+        for (int x = 0; x < width; x++) {
+          getPixel(x, y, &row[3*x]);
+          row[3*x+1] = row[3*x];
+          row[3*x+2] = row[3*x];
+        }
+
+        if (!writer->writeRow(&row)) {
+          delete[] row;
+          return splashErrGeneric;
+        }
+      }
+      delete[] row;
+    }
+    break;
+    
+    default:
+    // can't happen
+    break;
+  }
+  
+  if (!writer->close()) {
+    return splashErrGeneric;
+  }
+
+  return splashOk;
+}
diff --git a/splash/SplashBitmap.h b/splash/SplashBitmap.h
new file mode 100644 (file)
index 0000000..5ef5573
--- /dev/null
@@ -0,0 +1,99 @@
+//========================================================================
+//
+// SplashBitmap.h
+//
+//========================================================================
+
+//========================================================================
+//
+// Modified under the Poppler project - http://poppler.freedesktop.org
+//
+// All changes made under the Poppler project to this file are licensed
+// under GPL version 2 or later
+//
+// Copyright (C) 2007 Ilmari Heikkinen <ilmari.heikkinen@gmail.com>
+// Copyright (C) 2009 Shen Liang <shenzhuxi@gmail.com>
+// Copyright (C) 2009 Albert Astals Cid <aacid@kde.org>
+// Copyright (C) 2009 Stefan Thomas <thomas@eload24.com>
+// Copyright (C) 2010 Adrian Johnson <ajohnson@redneon.com>
+// Copyright (C) 2010 Harry Roberts <harry.roberts@midnight-labs.org>
+// Copyright (C) 2010 Christian Feuersänger <cfeuersaenger@googlemail.com>
+// Copyright (C) 2010 William Bader <williambader@hotmail.com>
+// Copyright (C) 2012 Thomas Freitag <Thomas.Freitag@alfa.de>
+//
+// To see a description of the changes please see the Changelog file that
+// came with your tarball or type make ChangeLog if you are building from git
+//
+//========================================================================
+
+#ifndef SPLASHBITMAP_H
+#define SPLASHBITMAP_H
+
+#ifdef USE_GCC_PRAGMAS
+#pragma interface
+#endif
+
+#include "SplashTypes.h"
+#include <stdio.h>
+
+class ImgWriter;
+
+//------------------------------------------------------------------------
+// SplashBitmap
+//------------------------------------------------------------------------
+
+class SplashBitmap {
+public:
+
+  // Create a new bitmap.  It will have <widthA> x <heightA> pixels in
+  // color mode <modeA>.  Rows will be padded out to a multiple of
+  // <rowPad> bytes.  If <topDown> is false, the bitmap will be stored
+  // upside-down, i.e., with the last row first in memory.
+  SplashBitmap(int widthA, int heightA, int rowPad,
+              SplashColorMode modeA, GBool alphaA,
+              GBool topDown = gTrue);
+  static SplashBitmap *copy(SplashBitmap *src);
+
+  ~SplashBitmap();
+
+  int getWidth() { return width; }
+  int getHeight() { return height; }
+  int getRowSize() { return rowSize; }
+  int getAlphaRowSize() { return width; }
+  int getRowPad() { return rowPad; }
+  SplashColorMode getMode() { return mode; }
+  SplashColorPtr getDataPtr() { return data; }
+  Guchar *getAlphaPtr() { return alpha; }
+
+  SplashError writePNMFile(char *fileName);
+  SplashError writePNMFile(FILE *f);
+  SplashError writeAlphaPGMFile(char *fileName);
+  
+  SplashError writeImgFile(SplashImageFileFormat format, char *fileName, int hDPI, int vDPI, const char *compressionString = "");
+  SplashError writeImgFile(SplashImageFileFormat format, FILE *f, int hDPI, int vDPI, const char *compressionString = "");
+  SplashError writeImgFile(ImgWriter *writer, FILE *f, int hDPI, int vDPI);
+
+  void getPixel(int x, int y, SplashColorPtr pixel);
+  void getRGBLine(int y, SplashColorPtr line);
+  Guchar getAlpha(int x, int y);
+
+  // Caller takes ownership of the bitmap data.  The SplashBitmap
+  // object is no longer valid -- the next call should be to the
+  // destructor.
+  SplashColorPtr takeData();
+
+private:
+
+  int width, height;           // size of bitmap
+  int rowPad;
+  int rowSize;                 // size of one row of data, in bytes
+                               //   - negative for bottom-up bitmaps
+  SplashColorMode mode;                // color mode
+  SplashColorPtr data;         // pointer to row zero of the color data
+  Guchar *alpha;               // pointer to row zero of the alpha data
+                               //   (always top-down)
+
+  friend class Splash;
+};
+
+#endif
diff --git a/splash/SplashClip.cc b/splash/SplashClip.cc
new file mode 100644 (file)
index 0000000..fb18831
--- /dev/null
@@ -0,0 +1,410 @@
+//========================================================================
+//
+// SplashClip.cc
+//
+//========================================================================
+
+//========================================================================
+//
+// Modified under the Poppler project - http://poppler.freedesktop.org
+//
+// All changes made under the Poppler project to this file are licensed
+// under GPL version 2 or later
+//
+// Copyright (C) 2010 Albert Astals Cid <aacid@kde.org>
+//
+// To see a description of the changes please see the Changelog file that
+// came with your tarball or type make ChangeLog if you are building from git
+//
+//========================================================================
+
+#include <config.h>
+
+#ifdef USE_GCC_PRAGMAS
+#pragma implementation
+#endif
+
+#include <stdlib.h>
+#include <string.h>
+#include "goo/gmem.h"
+#include "SplashErrorCodes.h"
+#include "SplashPath.h"
+#include "SplashXPath.h"
+#include "SplashXPathScanner.h"
+#include "SplashBitmap.h"
+#include "SplashClip.h"
+
+//------------------------------------------------------------------------
+// SplashClip.flags
+//------------------------------------------------------------------------
+
+#define splashClipEO       0x01        // use even-odd rule
+
+//------------------------------------------------------------------------
+// SplashClip
+//------------------------------------------------------------------------
+
+SplashClip::SplashClip(SplashCoord x0, SplashCoord y0,
+                      SplashCoord x1, SplashCoord y1,
+                      GBool antialiasA) {
+  antialias = antialiasA;
+  if (x0 < x1) {
+    xMin = x0;
+    xMax = x1;
+  } else {
+    xMin = x1;
+    xMax = x0;
+  }
+  if (y0 < y1) {
+    yMin = y0;
+    yMax = y1;
+  } else {
+    yMin = y1;
+    yMax = y0;
+  }
+  xMinI = splashFloor(xMin);
+  yMinI = splashFloor(yMin);
+  xMaxI = splashCeil(xMax) - 1;
+  yMaxI = splashCeil(yMax) - 1;
+  paths = NULL;
+  flags = NULL;
+  scanners = NULL;
+  length = size = 0;
+}
+
+SplashClip::SplashClip(SplashClip *clip) {
+  int yMinAA, yMaxAA;
+  int i;
+
+  antialias = clip->antialias;
+  xMin = clip->xMin;
+  yMin = clip->yMin;
+  xMax = clip->xMax;
+  yMax = clip->yMax;
+  xMinI = clip->xMinI;
+  yMinI = clip->yMinI;
+  xMaxI = clip->xMaxI;
+  yMaxI = clip->yMaxI;
+  length = clip->length;
+  size = clip->size;
+  paths = (SplashXPath **)gmallocn(size, sizeof(SplashXPath *));
+  flags = (Guchar *)gmallocn(size, sizeof(Guchar));
+  scanners = (SplashXPathScanner **)
+                 gmallocn(size, sizeof(SplashXPathScanner *));
+  for (i = 0; i < length; ++i) {
+    paths[i] = clip->paths[i]->copy();
+    flags[i] = clip->flags[i];
+    if (antialias) {
+      yMinAA = yMinI * splashAASize;
+      yMaxAA = (yMaxI + 1) * splashAASize - 1;
+    } else {
+      yMinAA = yMinI;
+      yMaxAA = yMaxI;
+    }
+    scanners[i] = new SplashXPathScanner(paths[i], flags[i] & splashClipEO,
+                                        yMinAA, yMaxAA);
+  }
+}
+
+SplashClip::~SplashClip() {
+  int i;
+
+  for (i = 0; i < length; ++i) {
+    delete paths[i];
+    delete scanners[i];
+  }
+  gfree(paths);
+  gfree(flags);
+  gfree(scanners);
+}
+
+void SplashClip::grow(int nPaths) {
+  if (length + nPaths > size) {
+    if (size == 0) {
+      size = 32;
+    }
+    while (size < length + nPaths) {
+      size *= 2;
+    }
+    paths = (SplashXPath **)greallocn(paths, size, sizeof(SplashXPath *));
+    flags = (Guchar *)greallocn(flags, size, sizeof(Guchar));
+    scanners = (SplashXPathScanner **)
+                   greallocn(scanners, size, sizeof(SplashXPathScanner *));
+  }
+}
+
+void SplashClip::resetToRect(SplashCoord x0, SplashCoord y0,
+                            SplashCoord x1, SplashCoord y1) {
+  int i;
+
+  for (i = 0; i < length; ++i) {
+    delete paths[i];
+    delete scanners[i];
+  }
+  gfree(paths);
+  gfree(flags);
+  gfree(scanners);
+  paths = NULL;
+  flags = NULL;
+  scanners = NULL;
+  length = size = 0;
+
+  if (x0 < x1) {
+    xMin = x0;
+    xMax = x1;
+  } else {
+    xMin = x1;
+    xMax = x0;
+  }
+  if (y0 < y1) {
+    yMin = y0;
+    yMax = y1;
+  } else {
+    yMin = y1;
+    yMax = y0;
+  }
+  xMinI = splashFloor(xMin);
+  yMinI = splashFloor(yMin);
+  xMaxI = splashCeil(xMax) - 1;
+  yMaxI = splashCeil(yMax) - 1;
+}
+
+SplashError SplashClip::clipToRect(SplashCoord x0, SplashCoord y0,
+                                  SplashCoord x1, SplashCoord y1) {
+  if (x0 < x1) {
+    if (x0 > xMin) {
+      xMin = x0;
+      xMinI = splashFloor(xMin);
+    }
+    if (x1 < xMax) {
+      xMax = x1;
+      xMaxI = splashCeil(xMax) - 1;
+    }
+  } else {
+    if (x1 > xMin) {
+      xMin = x1;
+      xMinI = splashFloor(xMin);
+    }
+    if (x0 < xMax) {
+      xMax = x0;
+      xMaxI = splashCeil(xMax) - 1;
+    }
+  }
+  if (y0 < y1) {
+    if (y0 > yMin) {
+      yMin = y0;
+      yMinI = splashFloor(yMin);
+    }
+    if (y1 < yMax) {
+      yMax = y1;
+      yMaxI = splashCeil(yMax) - 1;
+    }
+  } else {
+    if (y1 > yMin) {
+      yMin = y1;
+      yMinI = splashFloor(yMin);
+    }
+    if (y0 < yMax) {
+      yMax = y0;
+      yMaxI = splashCeil(yMax) - 1;
+    }
+  }
+  return splashOk;
+}
+
+SplashError SplashClip::clipToPath(SplashPath *path, SplashCoord *matrix,
+                                  SplashCoord flatness, GBool eo) {
+  SplashXPath *xPath;
+  int yMinAA, yMaxAA;
+
+  xPath = new SplashXPath(path, matrix, flatness, gTrue);
+
+  // check for an empty path
+  if (xPath->length == 0) {
+    xMax = xMin - 1;
+    yMax = yMin - 1;
+    xMaxI = splashCeil(xMax) - 1;
+    yMaxI = splashCeil(yMax) - 1;
+    delete xPath;
+
+  // check for a rectangle
+  } else if (xPath->length == 4 &&
+            ((xPath->segs[0].x0 == xPath->segs[0].x1 &&
+              xPath->segs[0].x0 == xPath->segs[1].x0 &&
+              xPath->segs[0].x0 == xPath->segs[3].x1 &&
+              xPath->segs[2].x0 == xPath->segs[2].x1 &&
+              xPath->segs[2].x0 == xPath->segs[1].x1 &&
+              xPath->segs[2].x0 == xPath->segs[3].x0 &&
+              xPath->segs[1].y0 == xPath->segs[1].y1 &&
+              xPath->segs[1].y0 == xPath->segs[0].y1 &&
+              xPath->segs[1].y0 == xPath->segs[2].y0 &&
+              xPath->segs[3].y0 == xPath->segs[3].y1 &&
+              xPath->segs[3].y0 == xPath->segs[0].y0 &&
+              xPath->segs[3].y0 == xPath->segs[2].y1) ||
+             (xPath->segs[0].y0 == xPath->segs[0].y1 &&
+              xPath->segs[0].y0 == xPath->segs[1].y0 &&
+              xPath->segs[0].y0 == xPath->segs[3].y1 &&
+              xPath->segs[2].y0 == xPath->segs[2].y1 &&
+              xPath->segs[2].y0 == xPath->segs[1].y1 &&
+              xPath->segs[2].y0 == xPath->segs[3].y0 &&
+              xPath->segs[1].x0 == xPath->segs[1].x1 &&
+              xPath->segs[1].x0 == xPath->segs[0].x1 &&
+              xPath->segs[1].x0 == xPath->segs[2].x0 &&
+              xPath->segs[3].x0 == xPath->segs[3].x1 &&
+              xPath->segs[3].x0 == xPath->segs[0].x0 &&
+              xPath->segs[3].x0 == xPath->segs[2].x1))) {
+    clipToRect(xPath->segs[0].x0, xPath->segs[0].y0,
+              xPath->segs[2].x0, xPath->segs[2].y0);
+    delete xPath;
+
+  } else {
+    grow(1);
+    if (antialias) {
+      xPath->aaScale();
+    }
+    xPath->sort();
+    paths[length] = xPath;
+    flags[length] = eo ? splashClipEO : 0;
+    if (antialias) {
+      yMinAA = yMinI * splashAASize;
+      yMaxAA = (yMaxI + 1) * splashAASize - 1;
+    } else {
+      yMinAA = yMinI;
+      yMaxAA = yMaxI;
+    }
+    scanners[length] = new SplashXPathScanner(xPath, eo, yMinAA, yMaxAA);
+    ++length;
+  }
+
+  return splashOk;
+}
+
+SplashClipResult SplashClip::testRect(int rectXMin, int rectYMin,
+                                     int rectXMax, int rectYMax) {
+  // This tests the rectangle:
+  //     x = [rectXMin, rectXMax + 1)    (note: rect coords are ints)
+  //     y = [rectYMin, rectYMax + 1)
+  // against the clipping region:
+  //     x = [xMin, xMax)                (note: clipping coords are fp)
+  //     y = [yMin, yMax)
+  if ((SplashCoord)(rectXMax + 1) <= xMin || (SplashCoord)rectXMin >= xMax ||
+      (SplashCoord)(rectYMax + 1) <= yMin || (SplashCoord)rectYMin >= yMax) {
+    return splashClipAllOutside;
+  }
+  if ((SplashCoord)rectXMin >= xMin && (SplashCoord)(rectXMax + 1) <= xMax &&
+      (SplashCoord)rectYMin >= yMin && (SplashCoord)(rectYMax + 1) <= yMax &&
+      length == 0) {
+    return splashClipAllInside;
+  }
+  return splashClipPartial;
+}
+
+SplashClipResult SplashClip::testSpan(int spanXMin, int spanXMax, int spanY) {
+  int i;
+
+  // This tests the rectangle:
+  //     x = [spanXMin, spanXMax + 1)    (note: span coords are ints)
+  //     y = [spanY, spanY + 1)
+  // against the clipping region:
+  //     x = [xMin, xMax)                (note: clipping coords are fp)
+  //     y = [yMin, yMax)
+  if ((SplashCoord)(spanXMax + 1) <= xMin || (SplashCoord)spanXMin >= xMax ||
+      (SplashCoord)(spanY + 1) <= yMin || (SplashCoord)spanY >= yMax) {
+    return splashClipAllOutside;
+  }
+  if (!((SplashCoord)spanXMin >= xMin && (SplashCoord)(spanXMax + 1) <= xMax &&
+       (SplashCoord)spanY >= yMin && (SplashCoord)(spanY + 1) <= yMax)) {
+    return splashClipPartial;
+  }
+  if (antialias) {
+    for (i = 0; i < length; ++i) {
+      if (!scanners[i]->testSpan(spanXMin * splashAASize,
+                                spanXMax * splashAASize + (splashAASize - 1),
+                                spanY * splashAASize)) {
+       return splashClipPartial;
+      }
+    }
+  } else {
+    for (i = 0; i < length; ++i) {
+      if (!scanners[i]->testSpan(spanXMin, spanXMax, spanY)) {
+       return splashClipPartial;
+      }
+    }
+  }
+  return splashClipAllInside;
+}
+
+void SplashClip::clipAALine(SplashBitmap *aaBuf, int *x0, int *x1, int y) {
+  int xx0, xx1, xx, yy, i;
+  SplashColorPtr p;
+
+  // zero out pixels with x < xMin
+  xx0 = *x0 * splashAASize;
+  xx1 = splashFloor(xMin * splashAASize);
+  if (xx1 > aaBuf->getWidth()) {
+    xx1 = aaBuf->getWidth();
+  }
+  if (xx0 < xx1) {
+    xx0 &= ~7;
+    for (yy = 0; yy < splashAASize; ++yy) {
+      p = aaBuf->getDataPtr() + yy * aaBuf->getRowSize() + (xx0 >> 3);
+      for (xx = xx0; xx + 7 < xx1; xx += 8) {
+       *p++ = 0;
+      }
+      if (xx < xx1) {
+       *p &= 0xff >> (xx1 & 7);
+      }
+    }
+    *x0 = splashFloor(xMin);
+  }
+
+  // zero out pixels with x > xMax
+  xx0 = splashFloor(xMax * splashAASize) + 1;
+  if (xx0 < 0) {
+    xx0 = 0;
+  }
+  xx1 = (*x1 + 1) * splashAASize;
+  if (xx0 < xx1) {
+    for (yy = 0; yy < splashAASize; ++yy) {
+      p = aaBuf->getDataPtr() + yy * aaBuf->getRowSize() + (xx0 >> 3);
+      xx = xx0;
+      if (xx & 7) {
+       *p &= 0xff00 >> (xx & 7);
+       xx = (xx & ~7) + 8;
+       ++p;
+      }
+      for (; xx < xx1; xx += 8) {
+       *p++ = 0;
+      }
+    }
+    *x1 = splashFloor(xMax);
+  }
+
+  // check the paths
+  for (i = 0; i < length; ++i) {
+    scanners[i]->clipAALine(aaBuf, x0, x1, y);
+  }
+  if (*x0 > *x1) {
+    *x0 = *x1;
+  }
+  if (*x0 < 0) {
+    *x0 = 0;
+  }
+  if ((*x0>>1) >= aaBuf->getRowSize()) {
+    xx0 = *x0;
+    *x0 = (aaBuf->getRowSize() - 1) << 1;
+    if (xx0 & 1) {
+      *x0 = *x0 + 1;
+    }
+  }
+  if (*x1 < *x0) {
+    *x1 = *x0;
+  }
+  if ((*x1>>1) >= aaBuf->getRowSize()) {
+    xx0 = *x1;
+    *x1 = (aaBuf->getRowSize() - 1) << 1;
+    if (xx0 & 1) {
+      *x1 = *x1 + 1;
+    }
+  }
+}
diff --git a/splash/SplashClip.h b/splash/SplashClip.h
new file mode 100644 (file)
index 0000000..3eb2d78
--- /dev/null
@@ -0,0 +1,150 @@
+//========================================================================
+//
+// SplashClip.h
+//
+//========================================================================
+
+//========================================================================
+//
+// Modified under the Poppler project - http://poppler.freedesktop.org
+//
+// All changes made under the Poppler project to this file are licensed
+// under GPL version 2 or later
+//
+// Copyright (C) 2010 Albert Astals Cid <aacid@kde.org>
+//
+// To see a description of the changes please see the Changelog file that
+// came with your tarball or type make ChangeLog if you are building from git
+//
+//========================================================================
+
+#ifndef SPLASHCLIP_H
+#define SPLASHCLIP_H
+
+#ifdef USE_GCC_PRAGMAS
+#pragma interface
+#endif
+
+#include "SplashTypes.h"
+#include "SplashMath.h"
+#include "SplashXPathScanner.h"
+
+class SplashPath;
+class SplashXPath;
+class SplashBitmap;
+
+//------------------------------------------------------------------------
+
+enum SplashClipResult {
+  splashClipAllInside,
+  splashClipAllOutside,
+  splashClipPartial
+};
+
+//------------------------------------------------------------------------
+// SplashClip
+//------------------------------------------------------------------------
+
+class SplashClip {
+public:
+
+  // Create a clip, for the given rectangle.
+  SplashClip(SplashCoord x0, SplashCoord y0,
+            SplashCoord x1, SplashCoord y1,
+            GBool antialiasA);
+
+  // Copy a clip.
+  SplashClip *copy() { return new SplashClip(this); }
+
+  ~SplashClip();
+
+  // Reset the clip to a rectangle.
+  void resetToRect(SplashCoord x0, SplashCoord y0,
+                  SplashCoord x1, SplashCoord y1);
+
+  // Intersect the clip with a rectangle.
+  SplashError clipToRect(SplashCoord x0, SplashCoord y0,
+                        SplashCoord x1, SplashCoord y1);
+
+  // Interesect the clip with <path>.
+  SplashError clipToPath(SplashPath *path, SplashCoord *matrix,
+                        SplashCoord flatness, GBool eo);
+
+  // Returns true if (<x>,<y>) is inside the clip.
+  GBool test(int x, int y)
+  {
+    int i;
+
+    // check the rectangle
+    if (x < xMinI || x > xMaxI || y < yMinI || y > yMaxI) {
+      return gFalse;
+    }
+
+    // check the paths
+    if (antialias) {
+      for (i = 0; i < length; ++i) {
+        if (!scanners[i]->test(x * splashAASize, y * splashAASize)) {
+         return gFalse;
+        }
+      }
+    } else {
+      for (i = 0; i < length; ++i) {
+        if (!scanners[i]->test(x, y)) {
+         return gFalse;
+        }
+      }
+    }
+
+    return gTrue;
+  }
+
+  // Tests a rectangle against the clipping region.  Returns one of:
+  //   - splashClipAllInside if the entire rectangle is inside the
+  //     clipping region, i.e., all pixels in the rectangle are
+  //     visible
+  //   - splashClipAllOutside if the entire rectangle is outside the
+  //     clipping region, i.e., all the pixels in the rectangle are
+  //     clipped
+  //   - splashClipPartial if the rectangle is part inside and part
+  //     outside the clipping region
+  SplashClipResult testRect(int rectXMin, int rectYMin,
+                           int rectXMax, int rectYMax);
+
+  // Similar to testRect, but tests a horizontal span.
+  SplashClipResult testSpan(int spanXMin, int spanXMax, int spanY);
+
+  // Clips an anti-aliased line by setting pixels to zero.  On entry,
+  // all non-zero pixels are between <x0> and <x1>.  This function
+  // will update <x0> and <x1>.
+  void clipAALine(SplashBitmap *aaBuf, int *x0, int *x1, int y);
+
+  // Get the rectangle part of the clip region.
+  SplashCoord getXMin() { return xMin; }
+  SplashCoord getXMax() { return xMax; }
+  SplashCoord getYMin() { return yMin; }
+  SplashCoord getYMax() { return yMax; }
+
+  // Get the rectangle part of the clip region, in integer coordinates.
+  int getXMinI() { return xMinI; }
+  int getXMaxI() { return xMaxI; }
+  int getYMinI() { return yMinI; }
+  int getYMaxI() { return yMaxI; }
+
+  // Get the number of arbitrary paths used by the clip region.
+  int getNumPaths() { return length; }
+
+protected:
+
+  SplashClip(SplashClip *clip);
+  void grow(int nPaths);
+
+  GBool antialias;
+  SplashCoord xMin, yMin, xMax, yMax;
+  int xMinI, yMinI, xMaxI, yMaxI;
+  SplashXPath **paths;
+  Guchar *flags;
+  SplashXPathScanner **scanners;
+  int length, size;
+};
+
+#endif
diff --git a/splash/SplashErrorCodes.h b/splash/SplashErrorCodes.h
new file mode 100644 (file)
index 0000000..d1f81f8
--- /dev/null
@@ -0,0 +1,50 @@
+//========================================================================
+//
+// SplashErrorCodes.h
+//
+//========================================================================
+
+//========================================================================
+//
+// Modified under the Poppler project - http://poppler.freedesktop.org
+//
+// All changes made under the Poppler project to this file are licensed
+// under GPL version 2 or later
+//
+// Copyright (C) 2006, 2009 Albert Astals Cid <aacid@kde.org>
+//
+// To see a description of the changes please see the Changelog file that
+// came with your tarball or type make ChangeLog if you are building from git
+//
+//========================================================================
+
+#ifndef SPLASHERRORCODES_H
+#define SPLASHERRORCODES_H
+
+//------------------------------------------------------------------------
+
+#define splashOk                 0     // no error
+
+#define splashErrNoCurPt         1     // no current point
+
+#define splashErrEmptyPath       2     // zero points in path
+
+#define splashErrBogusPath       3     // only one point in subpath
+
+#define splashErrNoSave                 4      // state stack is empty
+
+#define splashErrOpenFile        5     // couldn't open file
+
+#define splashErrNoGlyph         6     // couldn't get the requested glyph
+
+#define splashErrModeMismatch    7     // invalid combination of color modes
+
+#define splashErrSingularMatrix  8     // matrix is singular
+
+#define splashErrBadArg          9      // bad argument
+
+#define splashErrZeroImage     254      // image of 0x0
+
+#define splashErrGeneric       255
+
+#endif
diff --git a/splash/SplashFTFont.cc b/splash/SplashFTFont.cc
new file mode 100644 (file)
index 0000000..f18b58b
--- /dev/null
@@ -0,0 +1,517 @@
+//========================================================================
+//
+// SplashFTFont.cc
+//
+//========================================================================
+
+//========================================================================
+//
+// Modified under the Poppler project - http://poppler.freedesktop.org
+//
+// All changes made under the Poppler project to this file are licensed
+// under GPL version 2 or later
+//
+// Copyright (C) 2005, 2007-2011 Albert Astals Cid <aacid@kde.org>
+// Copyright (C) 2006 Kristian Høgsberg <krh@bitplanet.net>
+// Copyright (C) 2009 Petr Gajdos <pgajdos@novell.com>
+// Copyright (C) 2010 Suzuki Toshiya <mpsuzuki@hiroshima-u.ac.jp>
+// Copyright (C) 2011 Andreas Hartmetz <ahartmetz@gmail.com>
+//
+// To see a description of the changes please see the Changelog file that
+// came with your tarball or type make ChangeLog if you are building from git
+//
+//========================================================================
+
+#include <config.h>
+
+#if HAVE_FREETYPE_FREETYPE_H || HAVE_FREETYPE_H
+
+#ifdef USE_GCC_PRAGMAS
+#pragma implementation
+#endif
+
+#include <ft2build.h>
+#include FT_OUTLINE_H
+#include FT_SIZES_H
+#include FT_GLYPH_H
+#include "goo/gmem.h"
+#include "SplashMath.h"
+#include "SplashGlyphBitmap.h"
+#include "SplashPath.h"
+#include "SplashFTFontEngine.h"
+#include "SplashFTFontFile.h"
+#include "SplashFTFont.h"
+
+//------------------------------------------------------------------------
+
+static int glyphPathMoveTo(const FT_Vector *pt, void *path);
+static int glyphPathLineTo(const FT_Vector *pt, void *path);
+static int glyphPathConicTo(const FT_Vector *ctrl, const FT_Vector *pt,
+                           void *path);
+static int glyphPathCubicTo(const FT_Vector *ctrl1, const FT_Vector *ctrl2,
+                           const FT_Vector *pt, void *path);
+
+//------------------------------------------------------------------------
+// SplashFTFont
+//------------------------------------------------------------------------
+
+SplashFTFont::SplashFTFont(SplashFTFontFile *fontFileA, SplashCoord *matA,
+                          SplashCoord *textMatA):
+  SplashFont(fontFileA, matA, textMatA, fontFileA->engine->aa), 
+  enableFreeTypeHinting(fontFileA->engine->enableFreeTypeHinting),
+  enableSlightHinting(fontFileA->engine->enableSlightHinting)
+{
+  FT_Face face;
+  int div;
+  int x, y;
+#if USE_FIXEDPOINT
+  SplashCoord scale;
+#endif
+
+  face = fontFileA->face;
+  if (FT_New_Size(face, &sizeObj)) {
+    return;
+  }
+  face->size = sizeObj;
+  size = splashRound(splashDist(0, 0, mat[2], mat[3]));
+  if (size < 1) {
+    size = 1;
+  }
+  if (FT_Set_Pixel_Sizes(face, 0, size)) {
+    return;
+  }
+  // if the textMat values are too small, FreeType's fixed point
+  // arithmetic doesn't work so well
+  textScale = splashDist(0, 0, textMat[2], textMat[3]) / size;
+
+  div = face->bbox.xMax > 20000 ? 65536 : 1;
+
+#if USE_FIXEDPOINT
+  scale = (SplashCoord)1 / (SplashCoord)face->units_per_EM;
+
+  // transform the four corners of the font bounding box -- the min
+  // and max values form the bounding box of the transformed font
+  x = (int)(mat[0] * (scale * (face->bbox.xMin / div)) +
+           mat[2] * (scale * (face->bbox.yMin / div)));
+  xMin = xMax = x;
+  y = (int)(mat[1] * (scale * (face->bbox.xMin / div)) +
+           mat[3] * (scale * (face->bbox.yMin / div)));
+  yMin = yMax = y;
+  x = (int)(mat[0] * (scale * (face->bbox.xMin / div)) +
+           mat[2] * (scale * (face->bbox.yMax / div)));
+  if (x < xMin) {
+    xMin = x;
+  } else if (x > xMax) {
+    xMax = x;
+  }
+  y = (int)(mat[1] * (scale * (face->bbox.xMin / div)) +
+           mat[3] * (scale * (face->bbox.yMax / div)));
+  if (y < yMin) {
+    yMin = y;
+  } else if (y > yMax) {
+    yMax = y;
+  }
+  x = (int)(mat[0] * (scale * (face->bbox.xMax / div)) +
+           mat[2] * (scale * (face->bbox.yMin / div)));
+  if (x < xMin) {
+    xMin = x;
+  } else if (x > xMax) {
+    xMax = x;
+  }
+  y = (int)(mat[1] * (scale * (face->bbox.xMax / div)) +
+           mat[3] * (scale * (face->bbox.yMin / div)));
+  if (y < yMin) {
+    yMin = y;
+  } else if (y > yMax) {
+    yMax = y;
+  }
+  x = (int)(mat[0] * (scale * (face->bbox.xMax / div)) +
+           mat[2] * (scale * (face->bbox.yMax / div)));
+  if (x < xMin) {
+    xMin = x;
+  } else if (x > xMax) {
+    xMax = x;
+  }
+  y = (int)(mat[1] * (scale * (face->bbox.xMax / div)) +
+           mat[3] * (scale * (face->bbox.yMax / div)));
+  if (y < yMin) {
+    yMin = y;
+  } else if (y > yMax) {
+    yMax = y;
+  }
+#else // USE_FIXEDPOINT
+  // transform the four corners of the font bounding box -- the min
+  // and max values form the bounding box of the transformed font
+  x = (int)((mat[0] * face->bbox.xMin + mat[2] * face->bbox.yMin) /
+           (div * face->units_per_EM));
+  xMin = xMax = x;
+  y = (int)((mat[1] * face->bbox.xMin + mat[3] * face->bbox.yMin) /
+           (div * face->units_per_EM));
+  yMin = yMax = y;
+  x = (int)((mat[0] * face->bbox.xMin + mat[2] * face->bbox.yMax) /
+           (div * face->units_per_EM));
+  if (x < xMin) {
+    xMin = x;
+  } else if (x > xMax) {
+    xMax = x;
+  }
+  y = (int)((mat[1] * face->bbox.xMin + mat[3] * face->bbox.yMax) /
+           (div * face->units_per_EM));
+  if (y < yMin) {
+    yMin = y;
+  } else if (y > yMax) {
+    yMax = y;
+  }
+  x = (int)((mat[0] * face->bbox.xMax + mat[2] * face->bbox.yMin) /
+           (div * face->units_per_EM));
+  if (x < xMin) {
+    xMin = x;
+  } else if (x > xMax) {
+    xMax = x;
+  }
+  y = (int)((mat[1] * face->bbox.xMax + mat[3] * face->bbox.yMin) /
+           (div * face->units_per_EM));
+  if (y < yMin) {
+    yMin = y;
+  } else if (y > yMax) {
+    yMax = y;
+  }
+  x = (int)((mat[0] * face->bbox.xMax + mat[2] * face->bbox.yMax) /
+           (div * face->units_per_EM));
+  if (x < xMin) {
+    xMin = x;
+  } else if (x > xMax) {
+    xMax = x;
+  }
+  y = (int)((mat[1] * face->bbox.xMax + mat[3] * face->bbox.yMax) /
+           (div * face->units_per_EM));
+  if (y < yMin) {
+    yMin = y;
+  } else if (y > yMax) {
+    yMax = y;
+  }
+#endif // USE_FIXEDPOINT
+  // This is a kludge: some buggy PDF generators embed fonts with
+  // zero bounding boxes.
+  if (xMax == xMin) {
+    xMin = 0;
+    xMax = size;
+  }
+  if (yMax == yMin) {
+    yMin = 0;
+    yMax = (int)((SplashCoord)1.2 * size);
+  }
+
+  // compute the transform matrix
+#if USE_FIXEDPOINT
+  matrix.xx = (FT_Fixed)((mat[0] / size).get16Dot16());
+  matrix.yx = (FT_Fixed)((mat[1] / size).get16Dot16());
+  matrix.xy = (FT_Fixed)((mat[2] / size).get16Dot16());
+  matrix.yy = (FT_Fixed)((mat[3] / size).get16Dot16());
+  textMatrix.xx = (FT_Fixed)((textMat[0] / (textScale * size)).get16Dot16());
+  textMatrix.yx = (FT_Fixed)((textMat[1] / (textScale * size)).get16Dot16());
+  textMatrix.xy = (FT_Fixed)((textMat[2] / (textScale * size)).get16Dot16());
+  textMatrix.yy = (FT_Fixed)((textMat[3] / (textScale * size)).get16Dot16());
+#else
+  matrix.xx = (FT_Fixed)((mat[0] / size) * 65536);
+  matrix.yx = (FT_Fixed)((mat[1] / size) * 65536);
+  matrix.xy = (FT_Fixed)((mat[2] / size) * 65536);
+  matrix.yy = (FT_Fixed)((mat[3] / size) * 65536);
+  textMatrix.xx = (FT_Fixed)((textMat[0] / (textScale * size)) * 65536);
+  textMatrix.yx = (FT_Fixed)((textMat[1] / (textScale * size)) * 65536);
+  textMatrix.xy = (FT_Fixed)((textMat[2] / (textScale * size)) * 65536);
+  textMatrix.yy = (FT_Fixed)((textMat[3] / (textScale * size)) * 65536);
+#endif
+}
+
+SplashFTFont::~SplashFTFont() {
+}
+
+GBool SplashFTFont::getGlyph(int c, int xFrac, int yFrac,
+                            SplashGlyphBitmap *bitmap, int x0, int y0, SplashClip *clip, SplashClipResult *clipRes) {
+  return SplashFont::getGlyph(c, xFrac, 0, bitmap, x0, y0, clip, clipRes);
+}
+
+static FT_Int32 getFTLoadFlags(GBool type1, GBool trueType, GBool aa, GBool enableFreeTypeHinting, GBool enableSlightHinting)
+{
+  int ret = FT_LOAD_DEFAULT;
+  if (aa)
+    ret |= FT_LOAD_NO_BITMAP;
+  
+  if (enableFreeTypeHinting) {
+    if (enableSlightHinting) {
+      ret |= FT_LOAD_TARGET_LIGHT;
+    } else {
+      if (trueType) {
+       // FT2's autohinting doesn't always work very well (especially with
+       // font subsets), so turn it off if anti-aliasing is enabled; if
+       // anti-aliasing is disabled, this seems to be a tossup - some fonts
+       // look better with hinting, some without, so leave hinting on
+       if (aa) {
+         ret |= FT_LOAD_NO_AUTOHINT;
+       }
+      } else if (type1) {
+       // Type 1 fonts seem to look better with 'light' hinting mode
+       ret |= FT_LOAD_TARGET_LIGHT;
+      }
+    }
+  } else {
+    ret |= FT_LOAD_NO_HINTING;
+  }
+  return ret;
+}
+
+GBool SplashFTFont::makeGlyph(int c, int xFrac, int yFrac,
+                             SplashGlyphBitmap *bitmap, int x0, int y0, SplashClip *clip, SplashClipResult *clipRes) {
+  SplashFTFontFile *ff;
+  FT_Vector offset;
+  FT_GlyphSlot slot;
+  FT_UInt gid;
+  int rowSize;
+  Guchar *p, *q;
+  int i;
+
+  ff = (SplashFTFontFile *)fontFile;
+
+  ff->face->size = sizeObj;
+  offset.x = (FT_Pos)(int)((SplashCoord)xFrac * splashFontFractionMul * 64);
+  offset.y = 0;
+  FT_Set_Transform(ff->face, &matrix, &offset);
+  slot = ff->face->glyph;
+
+  if (ff->codeToGID && c < ff->codeToGIDLen) {
+    gid = (FT_UInt)ff->codeToGID[c];
+  } else {
+    gid = (FT_UInt)c;
+  }
+
+  if (FT_Load_Glyph(ff->face, gid, getFTLoadFlags(ff->type1, ff->trueType, aa, enableFreeTypeHinting, enableSlightHinting))) {
+    return gFalse;
+  }
+
+  // prelimirary values based on FT_Outline_Get_CBox
+  // we add two pixels to each side to be in the safe side
+  FT_BBox cbox;
+  FT_Outline_Get_CBox(&ff->face->glyph->outline, &cbox);
+  bitmap->x = -(cbox.xMin / 64) + 2;
+  bitmap->y =  (cbox.yMax / 64) + 2;
+  bitmap->w = ((cbox.xMax - cbox.xMin) / 64) + 4;
+  bitmap->h = ((cbox.yMax - cbox.yMin) / 64) + 4;
+
+  *clipRes = clip->testRect(x0 - bitmap->x,
+                            y0 - bitmap->y,
+                            x0 - bitmap->x + bitmap->w,
+                            y0 - bitmap->y + bitmap->h);
+  if (*clipRes == splashClipAllOutside) {
+    bitmap->freeData = gFalse;
+    return gTrue;
+  }
+
+  if (FT_Render_Glyph(slot, aa ? ft_render_mode_normal
+                              : ft_render_mode_mono)) {
+    return gFalse;
+  }
+
+  if (slot->bitmap.width == 0 || slot->bitmap.rows == 0) {
+    // this can happen if (a) the glyph is really tiny or (b) the
+    // metrics in the TrueType file are broken
+    return gFalse;
+  }
+
+  bitmap->x = -slot->bitmap_left;
+  bitmap->y = slot->bitmap_top;
+  bitmap->w = slot->bitmap.width;
+  bitmap->h = slot->bitmap.rows;
+  bitmap->aa = aa;
+  if (aa) {
+    rowSize = bitmap->w;
+  } else {
+    rowSize = (bitmap->w + 7) >> 3;
+  }
+  bitmap->data = (Guchar *)gmallocn_checkoverflow(rowSize, bitmap->h);
+  if (!bitmap->data) {
+    return gFalse;
+  }
+  bitmap->freeData = gTrue;
+  for (i = 0, p = bitmap->data, q = slot->bitmap.buffer;
+       i < bitmap->h;
+       ++i, p += rowSize, q += slot->bitmap.pitch) {
+    memcpy(p, q, rowSize);
+  }
+
+  return gTrue;
+}
+
+double SplashFTFont::getGlyphAdvance(int c)
+{
+  SplashFTFontFile *ff;
+  FT_Vector offset;
+  FT_UInt gid;
+  FT_Matrix identityMatrix;
+
+  ff = (SplashFTFontFile *)fontFile;
+
+  // init the matrix
+  identityMatrix.xx = 65536; // 1 in 16.16 format
+  identityMatrix.xy = 0;
+  identityMatrix.yx = 0;
+  identityMatrix.yy = 65536; // 1 in 16.16 format
+
+  // init the offset
+  offset.x = 0;
+  offset.y = 0;
+
+  ff->face->size = sizeObj;
+  FT_Set_Transform(ff->face, &identityMatrix, &offset);
+
+  if (ff->codeToGID && c < ff->codeToGIDLen) {
+    gid = (FT_UInt)ff->codeToGID[c];
+  } else {
+    gid = (FT_UInt)c;
+  }
+  if (ff->trueType && gid < 0) {
+    // skip the TrueType notdef glyph
+    return -1;
+  }
+
+  if (FT_Load_Glyph(ff->face, gid, getFTLoadFlags(ff->type1, ff->trueType, aa, enableFreeTypeHinting, enableSlightHinting))) {
+    return -1;
+  }
+
+  // 64.0 is 1 in 26.6 format
+  return ff->face->glyph->metrics.horiAdvance / 64.0 / size;
+}
+
+struct SplashFTFontPath {
+  SplashPath *path;
+  SplashCoord textScale;
+  GBool needClose;
+};
+
+SplashPath *SplashFTFont::getGlyphPath(int c) {
+  static FT_Outline_Funcs outlineFuncs = {
+#if FREETYPE_MINOR <= 1
+    (int (*)(FT_Vector *, void *))&glyphPathMoveTo,
+    (int (*)(FT_Vector *, void *))&glyphPathLineTo,
+    (int (*)(FT_Vector *, FT_Vector *, void *))&glyphPathConicTo,
+    (int (*)(FT_Vector *, FT_Vector *, FT_Vector *, void *))&glyphPathCubicTo,
+#else
+    &glyphPathMoveTo,
+    &glyphPathLineTo,
+    &glyphPathConicTo,
+    &glyphPathCubicTo,
+#endif
+    0, 0
+  };
+  SplashFTFontFile *ff;
+  SplashFTFontPath path;
+  FT_GlyphSlot slot;
+  FT_UInt gid;
+  FT_Glyph glyph;
+
+  ff = (SplashFTFontFile *)fontFile;
+  ff->face->size = sizeObj;
+  FT_Set_Transform(ff->face, &textMatrix, NULL);
+  slot = ff->face->glyph;
+  if (ff->codeToGID && c < ff->codeToGIDLen) {
+    gid = ff->codeToGID[c];
+  } else {
+    gid = (FT_UInt)c;
+  }
+  if (ff->trueType && gid < 0) {
+    // skip the TrueType notdef glyph
+    return NULL;
+  }
+  if (FT_Load_Glyph(ff->face, gid, getFTLoadFlags(ff->type1, ff->trueType, aa, enableFreeTypeHinting, enableSlightHinting))) {
+    return NULL;
+  }
+  if (FT_Get_Glyph(slot, &glyph)) {
+    return NULL;
+  }
+  path.path = new SplashPath();
+  path.textScale = textScale;
+  path.needClose = gFalse;
+  FT_Outline_Decompose(&((FT_OutlineGlyph)glyph)->outline,
+                      &outlineFuncs, &path);
+  if (path.needClose) {
+    path.path->close();
+  }
+  FT_Done_Glyph(glyph);
+  return path.path;
+}
+
+static int glyphPathMoveTo(const FT_Vector *pt, void *path) {
+  SplashFTFontPath *p = (SplashFTFontPath *)path;
+
+  if (p->needClose) {
+    p->path->close();
+    p->needClose = gFalse;
+  }
+  p->path->moveTo((SplashCoord)pt->x * p->textScale / 64.0,
+                 (SplashCoord)pt->y * p->textScale / 64.0);
+  return 0;
+}
+
+static int glyphPathLineTo(const FT_Vector *pt, void *path) {
+  SplashFTFontPath *p = (SplashFTFontPath *)path;
+
+  p->path->lineTo((SplashCoord)pt->x * p->textScale / 64.0,
+                 (SplashCoord)pt->y * p->textScale / 64.0);
+  p->needClose = gTrue;
+  return 0;
+}
+
+static int glyphPathConicTo(const FT_Vector *ctrl, const FT_Vector *pt,
+                           void *path) {
+  SplashFTFontPath *p = (SplashFTFontPath *)path;
+  SplashCoord x0, y0, x1, y1, x2, y2, x3, y3, xc, yc;
+
+  if (!p->path->getCurPt(&x0, &y0)) {
+    return 0;
+  }
+  xc = (SplashCoord)ctrl->x * p->textScale / 64.0;
+  yc = (SplashCoord)ctrl->y * p->textScale / 64.0;
+  x3 = (SplashCoord)pt->x * p->textScale / 64.0;
+  y3 = (SplashCoord)pt->y * p->textScale / 64.0;
+
+  // A second-order Bezier curve is defined by two endpoints, p0 and
+  // p3, and one control point, pc:
+  //
+  //     p(t) = (1-t)^2*p0 + t*(1-t)*pc + t^2*p3
+  //
+  // A third-order Bezier curve is defined by the same two endpoints,
+  // p0 and p3, and two control points, p1 and p2:
+  //
+  //     p(t) = (1-t)^3*p0 + 3t*(1-t)^2*p1 + 3t^2*(1-t)*p2 + t^3*p3
+  //
+  // Applying some algebra, we can convert a second-order curve to a
+  // third-order curve:
+  //
+  //     p1 = (1/3) * (p0 + 2pc)
+  //     p2 = (1/3) * (2pc + p3)
+
+  x1 = (SplashCoord)(1.0 / 3.0) * (x0 + (SplashCoord)2 * xc);
+  y1 = (SplashCoord)(1.0 / 3.0) * (y0 + (SplashCoord)2 * yc);
+  x2 = (SplashCoord)(1.0 / 3.0) * ((SplashCoord)2 * xc + x3);
+  y2 = (SplashCoord)(1.0 / 3.0) * ((SplashCoord)2 * yc + y3);
+
+  p->path->curveTo(x1, y1, x2, y2, x3, y3);
+  p->needClose = gTrue;
+  return 0;
+}
+
+static int glyphPathCubicTo(const FT_Vector *ctrl1, const FT_Vector *ctrl2,
+                           const FT_Vector *pt, void *path) {
+  SplashFTFontPath *p = (SplashFTFontPath *)path;
+
+  p->path->curveTo((SplashCoord)ctrl1->x * p->textScale / 64.0,
+                  (SplashCoord)ctrl1->y * p->textScale / 64.0,
+                  (SplashCoord)ctrl2->x * p->textScale / 64.0,
+                  (SplashCoord)ctrl2->y * p->textScale / 64.0,
+                  (SplashCoord)pt->x * p->textScale / 64.0,
+                  (SplashCoord)pt->y * p->textScale / 64.0);
+  p->needClose = gTrue;
+  return 0;
+}
+
+#endif // HAVE_FREETYPE_FREETYPE_H || HAVE_FREETYPE_H
diff --git a/splash/SplashFTFont.h b/splash/SplashFTFont.h
new file mode 100644 (file)
index 0000000..98cb29d
--- /dev/null
@@ -0,0 +1,80 @@
+//========================================================================
+//
+// SplashFTFont.h
+//
+//========================================================================
+
+//========================================================================
+//
+// Modified under the Poppler project - http://poppler.freedesktop.org
+//
+// All changes made under the Poppler project to this file are licensed
+// under GPL version 2 or later
+//
+// Copyright (C) 2007-2009, 2011 Albert Astals Cid <aacid@kde.org>
+// Copyright (C) 2009 Petr Gajdos <pgajdos@novell.com>
+// Copyright (C) 2011 Andreas Hartmetz <ahartmetz@gmail.com>
+//
+// To see a description of the changes please see the Changelog file that
+// came with your tarball or type make ChangeLog if you are building from git
+//
+//========================================================================
+
+#ifndef SPLASHFTFONT_H
+#define SPLASHFTFONT_H
+
+#include "poppler-config.h"
+
+#if HAVE_FREETYPE_FREETYPE_H || HAVE_FREETYPE_H
+
+#ifdef USE_GCC_PRAGMAS
+#pragma interface
+#endif
+
+#include <ft2build.h>
+#include FT_FREETYPE_H
+#include "SplashFont.h"
+
+class SplashFTFontFile;
+
+//------------------------------------------------------------------------
+// SplashFTFont
+//------------------------------------------------------------------------
+
+class SplashFTFont: public SplashFont {
+public:
+
+  SplashFTFont(SplashFTFontFile *fontFileA, SplashCoord *matA,
+              SplashCoord *textMatA);
+
+  virtual ~SplashFTFont();
+
+  // Munge xFrac and yFrac before calling SplashFont::getGlyph.
+  virtual GBool getGlyph(int c, int xFrac, int yFrac,
+                        SplashGlyphBitmap *bitmap, int x0, int y0, SplashClip *clip, SplashClipResult *clipRes);
+
+  // Rasterize a glyph.  The <xFrac> and <yFrac> values are the same
+  // as described for getGlyph.
+  virtual GBool makeGlyph(int c, int xFrac, int yFrac,
+                         SplashGlyphBitmap *bitmap, int x0, int y0, SplashClip *clip, SplashClipResult *clipRes);
+
+  // Return the path for a glyph.
+  virtual SplashPath *getGlyphPath(int c);
+
+  // Return the advance of a glyph. (in 0..1 range)
+  virtual double getGlyphAdvance(int c);
+
+private:
+
+  FT_Size sizeObj;
+  FT_Matrix matrix;
+  FT_Matrix textMatrix;
+  SplashCoord textScale;
+  int size;
+  GBool enableFreeTypeHinting;
+  GBool enableSlightHinting;
+};
+
+#endif // HAVE_FREETYPE_FREETYPE_H || HAVE_FREETYPE_H
+
+#endif
diff --git a/splash/SplashFTFontEngine.cc b/splash/SplashFTFontEngine.cc
new file mode 100644 (file)
index 0000000..7a4568d
--- /dev/null
@@ -0,0 +1,220 @@
+//========================================================================
+//
+// SplashFTFontEngine.cc
+//
+//========================================================================
+
+//========================================================================
+//
+// Modified under the Poppler project - http://poppler.freedesktop.org
+//
+// All changes made under the Poppler project to this file are licensed
+// under GPL version 2 or later
+//
+// Copyright (C) 2006 Takashi Iwai <tiwai@suse.de>
+// Copyright (C) 2009, 2011 Albert Astals Cid <aacid@kde.org>
+// Copyright (C) 2009 Petr Gajdos <pgajdos@novell.com>
+// Copyright (C) 2011 Andreas Hartmetz <ahartmetz@gmail.com>
+//
+// To see a description of the changes please see the Changelog file that
+// came with your tarball or type make ChangeLog if you are building from git
+//
+//========================================================================
+
+#include <config.h>
+
+#if HAVE_FREETYPE_FREETYPE_H || HAVE_FREETYPE_H
+
+#ifdef USE_GCC_PRAGMAS
+#pragma implementation
+#endif
+
+#include <stdio.h>
+#ifdef HAVE_UNISTD_H
+#include <unistd.h>
+#endif
+#include "goo/gmem.h"
+#include "goo/GooString.h"
+#include "goo/gfile.h"
+#include "fofi/FoFiTrueType.h"
+#include "fofi/FoFiType1C.h"
+#include "SplashFTFontFile.h"
+#include "SplashFTFontEngine.h"
+
+#ifdef VMS
+#if (__VMS_VER < 70000000)
+extern "C" int unlink(char *filename);
+#endif
+#endif
+
+//------------------------------------------------------------------------
+
+#if 0
+static void fileWrite(void *stream, const char *data, int len) {
+  fwrite(data, 1, len, (FILE *)stream);
+}
+#endif
+
+//------------------------------------------------------------------------
+// SplashFTFontEngine
+//------------------------------------------------------------------------
+
+SplashFTFontEngine::SplashFTFontEngine(GBool aaA, GBool enableFreeTypeHintingA,
+                                      GBool enableSlightHintingA, FT_Library libA) {
+  FT_Int major, minor, patch;
+
+  aa = aaA;
+  enableFreeTypeHinting = enableFreeTypeHintingA;
+  enableSlightHinting = enableSlightHintingA;
+  lib = libA;
+
+  // as of FT 2.1.8, CID fonts are indexed by CID instead of GID
+  FT_Library_Version(lib, &major, &minor, &patch);
+  useCIDs = major > 2 ||
+            (major == 2 && (minor > 1 || (minor == 1 && patch > 7)));
+}
+
+SplashFTFontEngine *SplashFTFontEngine::init(GBool aaA, GBool enableFreeTypeHintingA,
+                                            GBool enableSlightHintingA) {
+  FT_Library libA;
+
+  if (FT_Init_FreeType(&libA)) {
+    return NULL;
+  }
+  return new SplashFTFontEngine(aaA, enableFreeTypeHintingA, enableSlightHintingA, libA);
+}
+
+SplashFTFontEngine::~SplashFTFontEngine() {
+  FT_Done_FreeType(lib);
+}
+
+SplashFontFile *SplashFTFontEngine::loadType1Font(SplashFontFileID *idA,
+                                                 SplashFontSrc *src,
+                                                 const char **enc) {
+  return SplashFTFontFile::loadType1Font(this, idA, src, enc);
+}
+
+SplashFontFile *SplashFTFontEngine::loadType1CFont(SplashFontFileID *idA,
+                                                  SplashFontSrc *src,
+                                                  const char **enc) {
+  return SplashFTFontFile::loadType1Font(this, idA, src, enc);
+}
+
+SplashFontFile *SplashFTFontEngine::loadOpenTypeT1CFont(SplashFontFileID *idA,
+                                                       SplashFontSrc *src,
+                                                       const char **enc) {
+  return SplashFTFontFile::loadType1Font(this, idA, src, enc);
+}
+
+SplashFontFile *SplashFTFontEngine::loadCIDFont(SplashFontFileID *idA,
+                                               SplashFontSrc *src) {
+  FoFiType1C *ff;
+  int *cidToGIDMap;
+  int nCIDs;
+  SplashFontFile *ret;
+
+  // check for a CFF font
+  if (useCIDs) {
+    cidToGIDMap = NULL;
+    nCIDs = 0;
+  } else {
+    if (src->isFile) {
+      ff = FoFiType1C::load(src->fileName->getCString());
+    } else {
+      ff = FoFiType1C::make(src->buf, src->bufLen);
+    }
+    if (ff) {
+      cidToGIDMap = ff->getCIDToGIDMap(&nCIDs);
+      delete ff;
+    } else {
+      cidToGIDMap = NULL;
+      nCIDs = 0;
+    }
+  }
+  ret = SplashFTFontFile::loadCIDFont(this, idA, src, cidToGIDMap, nCIDs);
+  if (!ret) {
+    gfree(cidToGIDMap);
+  }
+  return ret;
+}
+
+SplashFontFile *SplashFTFontEngine::loadOpenTypeCFFFont(SplashFontFileID *idA,
+                                                       SplashFontSrc *src,
+                                                        int *codeToGID,
+                                                        int codeToGIDLen) {
+  FoFiTrueType *ff;
+  int *cidToGIDMap;
+  int nCIDs;
+  SplashFontFile *ret;
+
+  cidToGIDMap = NULL;
+  nCIDs = 0;
+  if (!codeToGID) {
+    if (!useCIDs) {
+      if (src->isFile) {
+        ff = FoFiTrueType::load(src->fileName->getCString());
+      } else {
+        ff = FoFiTrueType::make(src->buf, src->bufLen);
+      }
+      if (ff) {
+        if (ff->isOpenTypeCFF()) {
+          cidToGIDMap = ff->getCIDToGIDMap(&nCIDs);
+        }
+        delete ff;
+      }
+    }
+  }
+  ret = SplashFTFontFile::loadCIDFont(this, idA, src,
+                                      codeToGID ? codeToGID : cidToGIDMap,
+                                      codeToGID ? codeToGIDLen : nCIDs);
+  if (!ret) {
+    gfree(cidToGIDMap);
+  }
+  return ret;
+}
+
+SplashFontFile *SplashFTFontEngine::loadTrueTypeFont(SplashFontFileID *idA,
+                                                    SplashFontSrc *src,
+                                                    int *codeToGID,
+                                                    int codeToGIDLen,
+                                                    int faceIndex) {
+#if 0
+  FoFiTrueType *ff;
+  GooString *tmpFileName;
+  FILE *tmpFile;
+  SplashFontFile *ret;
+
+  if (!(ff = FoFiTrueType::load(fileName))) {
+    return NULL;
+  }
+  tmpFileName = NULL;
+  if (!openTempFile(&tmpFileName, &tmpFile, "wb")) {
+    delete ff;
+    return NULL;
+  }
+  ff->writeTTF(&fileWrite, tmpFile);
+  delete ff;
+  fclose(tmpFile);
+  ret = SplashFTFontFile::loadTrueTypeFont(this, idA,
+                                          tmpFileName->getCString(),
+                                          gTrue, codeToGID, codeToGIDLen,
+                                          faceIndex);
+  if (ret) {
+    if (deleteFile) {
+      unlink(fileName);
+    }
+  } else {
+    unlink(tmpFileName->getCString());
+  }
+  delete tmpFileName;
+  return ret;
+#else
+  SplashFontFile *ret;
+  ret = SplashFTFontFile::loadTrueTypeFont(this, idA, src,
+                                          codeToGID, codeToGIDLen,
+                                          faceIndex);
+  return ret;
+#endif
+}
+
+#endif // HAVE_FREETYPE_FREETYPE_H || HAVE_FREETYPE_H
diff --git a/splash/SplashFTFontEngine.h b/splash/SplashFTFontEngine.h
new file mode 100644 (file)
index 0000000..aa1ad5f
--- /dev/null
@@ -0,0 +1,78 @@
+//========================================================================
+//
+// SplashFTFontEngine.h
+//
+//========================================================================
+
+//========================================================================
+//
+// Modified under the Poppler project - http://poppler.freedesktop.org
+//
+// All changes made under the Poppler project to this file are licensed
+// under GPL version 2 or later
+//
+// Copyright (C) 2006 Takashi Iwai <tiwai@suse.de>
+// Copyright (C) 2009 Petr Gajdos <pgajdos@novell.com>
+// Copyright (C) 2009 Albert Astals Cid <aacid@kde.org>
+// Copyright (C) 2011 Andreas Hartmetz <ahartmetz@gmail.com>
+//
+// To see a description of the changes please see the Changelog file that
+// came with your tarball or type make ChangeLog if you are building from git
+//
+//========================================================================
+
+#ifndef SPLASHFTFONTENGINE_H
+#define SPLASHFTFONTENGINE_H
+
+#if HAVE_FREETYPE_FREETYPE_H || HAVE_FREETYPE_H
+
+#ifdef USE_GCC_PRAGMAS
+#pragma interface
+#endif
+
+#include <ft2build.h>
+#include FT_FREETYPE_H
+#include "goo/gtypes.h"
+
+class SplashFontFile;
+class SplashFontFileID;
+class SplashFontSrc;
+
+//------------------------------------------------------------------------
+// SplashFTFontEngine
+//------------------------------------------------------------------------
+
+class SplashFTFontEngine {
+public:
+
+  static SplashFTFontEngine *init(GBool aaA, GBool enableFreeTypeHintingA, GBool enableSlightHinting);
+
+  ~SplashFTFontEngine();
+
+  // Load fonts.
+  SplashFontFile *loadType1Font(SplashFontFileID *idA, SplashFontSrc *src,  const char **enc);
+  SplashFontFile *loadType1CFont(SplashFontFileID *idA, SplashFontSrc *src,  const char **enc);
+  SplashFontFile *loadOpenTypeT1CFont(SplashFontFileID *idA, SplashFontSrc *src,  const char **enc);
+  SplashFontFile *loadCIDFont(SplashFontFileID *idA, SplashFontSrc *src);
+  SplashFontFile *loadOpenTypeCFFFont(SplashFontFileID *idA, SplashFontSrc *src,
+                                      int *codeToGID, int codeToGIDLen);
+  SplashFontFile *loadTrueTypeFont(SplashFontFileID *idA, SplashFontSrc *src,
+                                  int *codeToGID, int codeToGIDLen, int faceIndex = 0);
+
+private:
+
+  SplashFTFontEngine(GBool aaA, GBool enableFreeTypeHintingA, GBool enableSlightHintingA, FT_Library libA);
+
+  GBool aa;
+  GBool enableFreeTypeHinting;
+  GBool enableSlightHinting;
+  FT_Library lib;
+  GBool useCIDs;
+
+  friend class SplashFTFontFile;
+  friend class SplashFTFont;
+};
+
+#endif // HAVE_FREETYPE_FREETYPE_H || HAVE_FREETYPE_H
+
+#endif
diff --git a/splash/SplashFTFontFile.cc b/splash/SplashFTFontFile.cc
new file mode 100644 (file)
index 0000000..34f6ce5
--- /dev/null
@@ -0,0 +1,140 @@
+//========================================================================
+//
+// SplashFTFontFile.cc
+//
+//========================================================================
+
+//========================================================================
+//
+// Modified under the Poppler project - http://poppler.freedesktop.org
+//
+// All changes made under the Poppler project to this file are licensed
+// under GPL version 2 or later
+//
+// Copyright (C) 2006 Takashi Iwai <tiwai@suse.de>
+//
+// To see a description of the changes please see the Changelog file that
+// came with your tarball or type make ChangeLog if you are building from git
+//
+//========================================================================
+
+#include <config.h>
+
+#if HAVE_FREETYPE_FREETYPE_H || HAVE_FREETYPE_H
+
+#ifdef USE_GCC_PRAGMAS
+#pragma implementation
+#endif
+
+#include "goo/gmem.h"
+#include "goo/GooString.h"
+#include "SplashFTFontEngine.h"
+#include "SplashFTFont.h"
+#include "SplashFTFontFile.h"
+
+//------------------------------------------------------------------------
+// SplashFTFontFile
+//------------------------------------------------------------------------
+
+SplashFontFile *SplashFTFontFile::loadType1Font(SplashFTFontEngine *engineA,
+                                               SplashFontFileID *idA,
+                                               SplashFontSrc *src,
+                                               const char **encA) {
+  FT_Face faceA;
+  int *codeToGIDA;
+  const char *name;
+  int i;
+
+  if (src->isFile) {
+    if (FT_New_Face(engineA->lib, src->fileName->getCString(), 0, &faceA))
+      return NULL;
+  } else {
+    if (FT_New_Memory_Face(engineA->lib, (const FT_Byte *)src->buf, src->bufLen, 0, &faceA))
+      return NULL;
+  }
+  codeToGIDA = (int *)gmallocn(256, sizeof(int));
+  for (i = 0; i < 256; ++i) {
+    codeToGIDA[i] = 0;
+    if ((name = encA[i])) {
+      codeToGIDA[i] = (int)FT_Get_Name_Index(faceA, (char *)name);
+    }
+  }
+
+  return new SplashFTFontFile(engineA, idA, src,
+                             faceA, codeToGIDA, 256, gFalse, gTrue);
+}
+
+SplashFontFile *SplashFTFontFile::loadCIDFont(SplashFTFontEngine *engineA,
+                                             SplashFontFileID *idA,
+                                             SplashFontSrc *src,
+                                             int *codeToGIDA,
+                                             int codeToGIDLenA) {
+  FT_Face faceA;
+
+  if (src->isFile) {
+    if (FT_New_Face(engineA->lib, src->fileName->getCString(), 0, &faceA))
+      return NULL;
+  } else {
+    if (FT_New_Memory_Face(engineA->lib, (const FT_Byte *)src->buf, src->bufLen, 0, &faceA))
+      return NULL;
+  }
+
+  return new SplashFTFontFile(engineA, idA, src,
+                             faceA, codeToGIDA, codeToGIDLenA, gFalse, gFalse);
+}
+
+SplashFontFile *SplashFTFontFile::loadTrueTypeFont(SplashFTFontEngine *engineA,
+                                                  SplashFontFileID *idA,
+                                                  SplashFontSrc *src,
+                                                  int *codeToGIDA,
+                                                  int codeToGIDLenA,
+                                                  int faceIndexA) {
+  FT_Face faceA;
+
+  if (src->isFile) {
+    if (FT_New_Face(engineA->lib, src->fileName->getCString(), faceIndexA, &faceA))
+      return NULL;
+  } else {
+    if (FT_New_Memory_Face(engineA->lib, (const FT_Byte *)src->buf, src->bufLen, faceIndexA, &faceA))
+      return NULL;
+  }
+
+  return new SplashFTFontFile(engineA, idA, src,
+                             faceA, codeToGIDA, codeToGIDLenA, gTrue, gFalse);
+}
+
+SplashFTFontFile::SplashFTFontFile(SplashFTFontEngine *engineA,
+                                  SplashFontFileID *idA,
+                                  SplashFontSrc *src,
+                                  FT_Face faceA,
+                                  int *codeToGIDA, int codeToGIDLenA,
+                                  GBool trueTypeA, GBool type1A):
+  SplashFontFile(idA, src)
+{
+  engine = engineA;
+  face = faceA;
+  codeToGID = codeToGIDA;
+  codeToGIDLen = codeToGIDLenA;
+  trueType = trueTypeA;
+  type1 = type1A;
+}
+
+SplashFTFontFile::~SplashFTFontFile() {
+  if (face) {
+    FT_Done_Face(face);
+  }
+  if (codeToGID) {
+    gfree(codeToGID);
+  }
+}
+
+SplashFont *SplashFTFontFile::makeFont(SplashCoord *mat,
+                                      SplashCoord *textMat) {
+  SplashFont *font;
+
+  font = new SplashFTFont(this, mat, textMat);
+  font->initCache();
+  return font;
+}
+
+#endif // HAVE_FREETYPE_FREETYPE_H || HAVE_FREETYPE_H
diff --git a/splash/SplashFTFontFile.h b/splash/SplashFTFontFile.h
new file mode 100644 (file)
index 0000000..d642af0
--- /dev/null
@@ -0,0 +1,86 @@
+//========================================================================
+//
+// SplashFTFontFile.h
+//
+//========================================================================
+
+//========================================================================
+//
+// Modified under the Poppler project - http://poppler.freedesktop.org
+//
+// All changes made under the Poppler project to this file are licensed
+// under GPL version 2 or later
+//
+// Copyright (C) 2006 Takashi Iwai <tiwai@suse.de>
+//
+// To see a description of the changes please see the Changelog file that
+// came with your tarball or type make ChangeLog if you are building from git
+//
+//========================================================================
+
+#ifndef SPLASHFTFONTFILE_H
+#define SPLASHFTFONTFILE_H
+
+#if HAVE_FREETYPE_FREETYPE_H || HAVE_FREETYPE_H
+
+#ifdef USE_GCC_PRAGMAS
+#pragma interface
+#endif
+
+#include <ft2build.h>
+#include FT_FREETYPE_H
+#include "SplashFontFile.h"
+
+class SplashFontFileID;
+class SplashFTFontEngine;
+
+//------------------------------------------------------------------------
+// SplashFTFontFile
+//------------------------------------------------------------------------
+
+class SplashFTFontFile: public SplashFontFile {
+public:
+
+  static SplashFontFile *loadType1Font(SplashFTFontEngine *engineA,
+                                      SplashFontFileID *idA,
+                                      SplashFontSrc *src, const char **encA);
+  static SplashFontFile *loadCIDFont(SplashFTFontEngine *engineA,
+                                        SplashFontFileID *idA,
+                                        SplashFontSrc *src,
+                                        int *codeToCIDA, int codeToGIDLenA);
+  static SplashFontFile *loadTrueTypeFont(SplashFTFontEngine *engineA,
+                                         SplashFontFileID *idA,
+                                         SplashFontSrc *src,
+                                         int *codeToGIDA,
+                                         int codeToGIDLenA,
+                                         int faceIndexA=0);
+
+  virtual ~SplashFTFontFile();
+
+  // Create a new SplashFTFont, i.e., a scaled instance of this font
+  // file.
+  virtual SplashFont *makeFont(SplashCoord *mat,
+                              SplashCoord *textMat);
+
+private:
+
+  SplashFTFontFile(SplashFTFontEngine *engineA,
+                  SplashFontFileID *idA,
+                  SplashFontSrc *src,
+                  FT_Face faceA,
+                  int *codeToGIDA, int codeToGIDLenA,
+                  GBool trueTypeA, GBool type1A);
+
+  SplashFTFontEngine *engine;
+  FT_Face face;
+  int *codeToGID;
+  int codeToGIDLen;
+  GBool trueType;
+  GBool type1;
+
+  friend class SplashFTFont;
+};
+
+#endif // HAVE_FREETYPE_FREETYPE_H || HAVE_FREETYPE_H
+
+#endif
diff --git a/splash/SplashFont.cc b/splash/SplashFont.cc
new file mode 100644 (file)
index 0000000..2bfcdc8
--- /dev/null
@@ -0,0 +1,219 @@
+//========================================================================
+//
+// SplashFont.cc
+//
+//========================================================================
+
+//========================================================================
+//
+// Modified under the Poppler project - http://poppler.freedesktop.org
+//
+// All changes made under the Poppler project to this file are licensed
+// under GPL version 2 or later
+//
+// Copyright (C) 2007-2008, 2010 Albert Astals Cid <aacid@kde.org>
+//
+// To see a description of the changes please see the Changelog file that
+// came with your tarball or type make ChangeLog if you are building from git
+//
+//========================================================================
+
+#include <config.h>
+
+#ifdef USE_GCC_PRAGMAS
+#pragma implementation
+#endif
+
+#include <string.h>
+#include "goo/gmem.h"
+#include "SplashMath.h"
+#include "SplashGlyphBitmap.h"
+#include "SplashFontFile.h"
+#include "SplashFont.h"
+
+//------------------------------------------------------------------------
+
+struct SplashFontCacheTag {
+  int c;
+  short xFrac, yFrac;          // x and y fractions
+  int mru;                     // valid bit (0x80000000) and MRU index
+  int x, y, w, h;              // offset and size of glyph
+};
+
+//------------------------------------------------------------------------
+// SplashFont
+//------------------------------------------------------------------------
+
+SplashFont::SplashFont(SplashFontFile *fontFileA, SplashCoord *matA,
+                      SplashCoord *textMatA, GBool aaA) {
+  fontFile = fontFileA;
+  fontFile->incRefCnt();
+  mat[0] = matA[0];
+  mat[1] = matA[1];
+  mat[2] = matA[2];
+  mat[3] = matA[3];
+  textMat[0] = textMatA[0];
+  textMat[1] = textMatA[1];
+  textMat[2] = textMatA[2];
+  textMat[3] = textMatA[3];
+  aa = aaA;
+
+  cache = NULL;
+  cacheTags = NULL;
+
+  xMin = yMin = xMax = yMax = 0;
+}
+
+void SplashFont::initCache() {
+  int i;
+
+  // this should be (max - min + 1), but we add some padding to
+  // deal with rounding errors
+  glyphW = xMax - xMin + 3;
+  glyphH = yMax - yMin + 3;
+  if (aa) {
+    glyphSize = glyphW * glyphH;
+  } else {
+    glyphSize = ((glyphW + 7) >> 3) * glyphH;
+  }
+
+  // set up the glyph pixmap cache
+  cacheAssoc = 8;
+  if (glyphSize <= 64) {
+    cacheSets = 32;
+  } else if (glyphSize <= 128) {
+    cacheSets = 16;
+  } else if (glyphSize <= 256) {
+    cacheSets = 8;
+  } else if (glyphSize <= 512) {
+    cacheSets = 4;
+  } else if (glyphSize <= 1024) {
+    cacheSets = 2;
+  } else {
+    cacheSets = 1;
+  }
+  cache = (Guchar *)gmallocn_checkoverflow(cacheSets* cacheAssoc, glyphSize);
+  if (cache != NULL) {
+    cacheTags = (SplashFontCacheTag *)gmallocn(cacheSets * cacheAssoc,
+                                            sizeof(SplashFontCacheTag));
+    for (i = 0; i < cacheSets * cacheAssoc; ++i) {
+      cacheTags[i].mru = i & (cacheAssoc - 1);
+    }
+  } else {
+    cacheAssoc = 0;
+  }
+}
+
+SplashFont::~SplashFont() {
+  fontFile->decRefCnt();
+  if (cache) {
+    gfree(cache);
+  }
+  if (cacheTags) {
+    gfree(cacheTags);
+  }
+}
+
+GBool SplashFont::getGlyph(int c, int xFrac, int yFrac,
+                          SplashGlyphBitmap *bitmap, int x0, int y0, SplashClip *clip, SplashClipResult *clipRes) {
+  SplashGlyphBitmap bitmap2;
+  int size;
+  Guchar *p;
+  int i, j, k;
+
+  // no fractional coordinates for large glyphs or non-anti-aliased
+  // glyphs
+  if (!aa || glyphH > 50) {
+    xFrac = yFrac = 0;
+  }
+
+  // check the cache
+  i = (c & (cacheSets - 1)) * cacheAssoc;
+  for (j = 0; j < cacheAssoc; ++j) {
+    if ((cacheTags[i+j].mru & 0x80000000) &&
+       cacheTags[i+j].c == c &&
+       (int)cacheTags[i+j].xFrac == xFrac &&
+       (int)cacheTags[i+j].yFrac == yFrac) {
+      bitmap->x = cacheTags[i+j].x;
+      bitmap->y = cacheTags[i+j].y;
+      bitmap->w = cacheTags[i+j].w;
+      bitmap->h = cacheTags[i+j].h;
+      for (k = 0; k < cacheAssoc; ++k) {
+       if (k != j &&
+           (cacheTags[i+k].mru & 0x7fffffff) <
+             (cacheTags[i+j].mru & 0x7fffffff)) {
+         ++cacheTags[i+k].mru;
+       }
+      }
+      cacheTags[i+j].mru = 0x80000000;
+      bitmap->aa = aa;
+      bitmap->data = cache + (i+j) * glyphSize;
+      bitmap->freeData = gFalse;
+
+      *clipRes = clip->testRect(x0 - bitmap->x,
+                                y0 - bitmap->y,
+                                x0 - bitmap->x + bitmap->w - 1,
+                                y0 - bitmap->y + bitmap->h - 1);
+
+      return gTrue;
+    }
+  }
+
+  // generate the glyph bitmap
+  if (!makeGlyph(c, xFrac, yFrac, &bitmap2, x0, y0, clip, clipRes)) {
+    return gFalse;
+  }
+
+  if (*clipRes == splashClipAllOutside)
+  {
+    bitmap->freeData = gFalse;
+    if (bitmap2.freeData) gfree(bitmap2.data);
+    return gTrue;
+  }
+
+  // if the glyph doesn't fit in the bounding box, return a temporary
+  // uncached bitmap
+  if (bitmap2.w > glyphW || bitmap2.h > glyphH) {
+    *bitmap = bitmap2;
+    return gTrue;
+  }
+
+  // insert glyph pixmap in cache
+  if (aa) {
+    size = bitmap2.w * bitmap2.h;
+  } else {
+    size = ((bitmap2.w + 7) >> 3) * bitmap2.h;
+  }
+  p = NULL; // make gcc happy
+  if (cacheAssoc == 0)
+  {
+    // we had problems on the malloc of the cache, so ignore it
+    *bitmap = bitmap2;
+  }
+  else
+  {
+    for (j = 0; j < cacheAssoc; ++j) {
+      if ((cacheTags[i+j].mru & 0x7fffffff) == cacheAssoc - 1) {
+        cacheTags[i+j].mru = 0x80000000;
+        cacheTags[i+j].c = c;
+        cacheTags[i+j].xFrac = (short)xFrac;
+        cacheTags[i+j].yFrac = (short)yFrac;
+        cacheTags[i+j].x = bitmap2.x;
+        cacheTags[i+j].y = bitmap2.y;
+        cacheTags[i+j].w = bitmap2.w;
+        cacheTags[i+j].h = bitmap2.h;
+        p = cache + (i+j) * glyphSize;
+        memcpy(p, bitmap2.data, size);
+      } else {
+        ++cacheTags[i+j].mru;
+      }
+    }
+    *bitmap = bitmap2;
+    bitmap->data = p;
+    bitmap->freeData = gFalse;
+    if (bitmap2.freeData) {
+      gfree(bitmap2.data);
+    }
+  }
+  return gTrue;
+}
diff --git a/splash/SplashFont.h b/splash/SplashFont.h
new file mode 100644 (file)
index 0000000..78b00d2
--- /dev/null
@@ -0,0 +1,121 @@
+//========================================================================
+//
+// SplashFont.h
+//
+//========================================================================
+
+//========================================================================
+//
+// Modified under the Poppler project - http://poppler.freedesktop.org
+//
+// All changes made under the Poppler project to this file are licensed
+// under GPL version 2 or later
+//
+// Copyright (C) 2007-2008 Albert Astals Cid <aacid@kde.org>
+//
+// To see a description of the changes please see the Changelog file that
+// came with your tarball or type make ChangeLog if you are building from git
+//
+//========================================================================
+
+#ifndef SPLASHFONT_H
+#define SPLASHFONT_H
+
+#ifdef USE_GCC_PRAGMAS
+#pragma interface
+#endif
+
+#include "goo/gtypes.h"
+#include "SplashTypes.h"
+#include "SplashClip.h"
+
+struct SplashGlyphBitmap;
+struct SplashFontCacheTag;
+class SplashFontFile;
+class SplashPath;
+
+//------------------------------------------------------------------------
+
+// Fractional positioning uses this many bits to the right of the
+// decimal points.
+#define splashFontFractionBits 2
+#define splashFontFraction     (1 << splashFontFractionBits)
+#define splashFontFractionMul \
+                       ((SplashCoord)1 / (SplashCoord)splashFontFraction)
+
+//------------------------------------------------------------------------
+// SplashFont
+//------------------------------------------------------------------------
+
+class SplashFont {
+public:
+
+  SplashFont(SplashFontFile *fontFileA, SplashCoord *matA,
+            SplashCoord *textMatA, GBool aaA);
+
+  // This must be called after the constructor, so that the subclass
+  // constructor has a chance to compute the bbox.
+  void initCache();
+
+  virtual ~SplashFont();
+
+  SplashFontFile *getFontFile() { return fontFile; }
+
+  // Return true if <this> matches the specified font file and matrix.
+  GBool matches(SplashFontFile *fontFileA, SplashCoord *matA,
+               SplashCoord *textMatA) {
+    return fontFileA == fontFile &&
+           matA[0] == mat[0] && matA[1] == mat[1] &&
+           matA[2] == mat[2] && matA[3] == mat[3] &&
+           textMatA[0] == textMat[0] && textMatA[1] == textMat[1] &&
+           textMatA[2] == textMat[2] && textMatA[3] == textMat[3];
+  }
+
+  // Get a glyph - this does a cache lookup first, and if not found,
+  // creates a new bitmap and adds it to the cache.  The <xFrac> and
+  // <yFrac> values are splashFontFractionBits bits each, representing
+  // the numerators of fractions in [0, 1), where the denominator is
+  // splashFontFraction = 1 << splashFontFractionBits.  Subclasses
+  // should override this to zero out xFrac and/or yFrac if they don't
+  // support fractional coordinates.
+  virtual GBool getGlyph(int c, int xFrac, int yFrac,
+                        SplashGlyphBitmap *bitmap, int x0, int y0, SplashClip *clip, SplashClipResult *clipRes);
+
+  // Rasterize a glyph.  The <xFrac> and <yFrac> values are the same
+  // as described for getGlyph.
+  virtual GBool makeGlyph(int c, int xFrac, int yFrac,
+                         SplashGlyphBitmap *bitmap, int x0, int y0, SplashClip *clip, SplashClipResult *clipRes) = 0;
+
+  // Return the path for a glyph.
+  virtual SplashPath *getGlyphPath(int c) = 0;
+
+  // Return the advance of a glyph. (in 0..1 range)
+  // < 0 means not known
+  virtual double getGlyphAdvance(int c) { return -1; }
+
+  // Return the font transform matrix.
+  SplashCoord *getMatrix() { return mat; }
+
+  // Return the glyph bounding box.
+  void getBBox(int *xMinA, int *yMinA, int *xMaxA, int *yMaxA)
+    { *xMinA = xMin; *yMinA = yMin; *xMaxA = xMax; *yMaxA = yMax; }
+
+protected:
+
+  SplashFontFile *fontFile;
+  SplashCoord mat[4];          // font transform matrix
+                               //   (text space -> device space)
+  SplashCoord textMat[4];      // text transform matrix
+                               //   (text space -> user space)
+  GBool aa;                    // anti-aliasing
+  int xMin, yMin, xMax, yMax;  // glyph bounding box
+  Guchar *cache;               // glyph bitmap cache
+  SplashFontCacheTag *         // cache tags
+    cacheTags;
+  int glyphW, glyphH;          // size of glyph bitmaps
+  int glyphSize;               // size of glyph bitmaps, in bytes
+  int cacheSets;               // number of sets in cache
+  int cacheAssoc;              // cache associativity (glyphs per set)
+};
+
+#endif
diff --git a/splash/SplashFontEngine.cc b/splash/SplashFontEngine.cc
new file mode 100644 (file)
index 0000000..2e74f5a
--- /dev/null
@@ -0,0 +1,331 @@
+//========================================================================
+//
+// SplashFontEngine.cc
+//
+//========================================================================
+
+//========================================================================
+//
+// Modified under the Poppler project - http://poppler.freedesktop.org
+//
+// All changes made under the Poppler project to this file are licensed
+// under GPL version 2 or later
+//
+// Copyright (C) 2006 Takashi Iwai <tiwai@suse.de>
+// Copyright (C) 2009 Petr Gajdos <pgajdos@novell.com>
+// Copyright (C) 2009 Kovid Goyal <kovid@kovidgoyal.net>
+// Copyright (C) 2009 Albert Astals Cid <aacid@kde.org>
+// Copyright (C) 2011 Andreas Hartmetz <ahartmetz@gmail.com>
+//
+// To see a description of the changes please see the Changelog file that
+// came with your tarball or type make ChangeLog if you are building from git
+//
+//========================================================================
+
+#include <config.h>
+
+#ifdef USE_GCC_PRAGMAS
+#pragma implementation
+#endif
+
+#if HAVE_T1LIB_H
+#include <t1lib.h>
+#endif
+
+#include <stdlib.h>
+#include <stdio.h>
+#ifdef HAVE_UNISTD_H
+#  include <unistd.h>
+#endif
+#include "goo/gmem.h"
+#include "goo/GooString.h"
+#include "SplashMath.h"
+#include "SplashT1FontEngine.h"
+#include "SplashFTFontEngine.h"
+#include "SplashFontFile.h"
+#include "SplashFontFileID.h"
+#include "SplashFont.h"
+#include "SplashFontEngine.h"
+
+#ifdef VMS
+#if (__VMS_VER < 70000000)
+extern "C" int unlink(char *filename);
+#endif
+#endif
+
+#ifdef VMS
+#if (__VMS_VER < 70000000)
+extern "C" int unlink(char *filename);
+#endif
+#endif
+
+//------------------------------------------------------------------------
+// SplashFontEngine
+//------------------------------------------------------------------------
+
+SplashFontEngine::SplashFontEngine(
+#if HAVE_T1LIB_H
+                                  GBool enableT1lib,
+#endif
+#if HAVE_FREETYPE_FREETYPE_H || HAVE_FREETYPE_H
+                                  GBool enableFreeType,
+                                  GBool enableFreeTypeHinting,
+                                  GBool enableSlightHinting,
+#endif
+                                  GBool aa) {
+  int i;
+
+  for (i = 0; i < splashFontCacheSize; ++i) {
+    fontCache[i] = NULL;
+  }
+
+#if HAVE_T1LIB_H
+  if (enableT1lib) {
+    t1Engine = SplashT1FontEngine::init(aa);
+  } else {
+    t1Engine = NULL;
+  }
+#endif
+#if HAVE_FREETYPE_FREETYPE_H || HAVE_FREETYPE_H
+  if (enableFreeType) {
+    ftEngine = SplashFTFontEngine::init(aa, enableFreeTypeHinting, enableSlightHinting);
+  } else {
+    ftEngine = NULL;
+  }
+#endif
+}
+
+SplashFontEngine::~SplashFontEngine() {
+  int i;
+
+  for (i = 0; i < splashFontCacheSize; ++i) {
+    if (fontCache[i]) {
+      delete fontCache[i];
+    }
+  }
+
+#if HAVE_T1LIB_H
+  if (t1Engine) {
+    delete t1Engine;
+  }
+#endif
+#if HAVE_FREETYPE_FREETYPE_H || HAVE_FREETYPE_H
+  if (ftEngine) {
+    delete ftEngine;
+  }
+#endif
+}
+
+SplashFontFile *SplashFontEngine::getFontFile(SplashFontFileID *id) {
+  SplashFontFile *fontFile;
+  int i;
+
+  for (i = 0; i < splashFontCacheSize; ++i) {
+    if (fontCache[i]) {
+      fontFile = fontCache[i]->getFontFile();
+      if (fontFile && fontFile->getID()->matches(id)) {
+       return fontFile;
+      }
+    }
+  }
+  return NULL;
+}
+
+SplashFontFile *SplashFontEngine::loadType1Font(SplashFontFileID *idA,
+                                               SplashFontSrc *src,
+                                               const char **enc) {
+  SplashFontFile *fontFile;
+
+  fontFile = NULL;
+#if HAVE_T1LIB_H
+  if (!fontFile && t1Engine) {
+    fontFile = t1Engine->loadType1Font(idA, src, enc);
+  }
+#endif
+#if HAVE_FREETYPE_FREETYPE_H || HAVE_FREETYPE_H
+  if (!fontFile && ftEngine) {
+    fontFile = ftEngine->loadType1Font(idA, src, enc);
+  }
+#endif
+
+#ifndef _WIN32
+  // delete the (temporary) font file -- with Unix hard link
+  // semantics, this will remove the last link; otherwise it will
+  // return an error, leaving the file to be deleted later (if
+  // loadXYZFont failed, the file will always be deleted)
+  if (src->isFile)
+    src->unref();
+#endif
+
+  return fontFile;
+}
+
+SplashFontFile *SplashFontEngine::loadType1CFont(SplashFontFileID *idA,
+                                                SplashFontSrc *src,
+                                                const char **enc) {
+  SplashFontFile *fontFile;
+
+  fontFile = NULL;
+#if HAVE_T1LIB_H
+  if (!fontFile && t1Engine) {
+    fontFile = t1Engine->loadType1CFont(idA, src, enc);
+  }
+#endif
+#if HAVE_FREETYPE_FREETYPE_H || HAVE_FREETYPE_H
+  if (!fontFile && ftEngine) {
+    fontFile = ftEngine->loadType1CFont(idA, src, enc);
+  }
+#endif
+
+#ifndef _WIN32
+  // delete the (temporary) font file -- with Unix hard link
+  // semantics, this will remove the last link; otherwise it will
+  // return an error, leaving the file to be deleted later (if
+  // loadXYZFont failed, the file will always be deleted)
+  if (src->isFile)
+    src->unref();
+#endif
+
+  return fontFile;
+}
+
+SplashFontFile *SplashFontEngine::loadOpenTypeT1CFont(SplashFontFileID *idA,
+                                                     SplashFontSrc *src,
+                                                     const char **enc) {
+  SplashFontFile *fontFile;
+
+  fontFile = NULL;
+#if HAVE_FREETYPE_FREETYPE_H || HAVE_FREETYPE_H
+  if (!fontFile && ftEngine) {
+    fontFile = ftEngine->loadOpenTypeT1CFont(idA, src, enc);
+  }
+#endif
+
+  // delete the (temporary) font file -- with Unix hard link
+  // semantics, this will remove the last link; otherwise it will
+  // return an error, leaving the file to be deleted later (if
+  // loadXYZFont failed, the file will always be deleted)
+  if (src->isFile)
+    src->unref();
+
+  return fontFile;
+}
+
+SplashFontFile *SplashFontEngine::loadCIDFont(SplashFontFileID *idA,
+                                             SplashFontSrc *src) {
+  SplashFontFile *fontFile;
+
+  fontFile = NULL;
+#if HAVE_FREETYPE_FREETYPE_H || HAVE_FREETYPE_H
+  if (!fontFile && ftEngine) {
+    fontFile = ftEngine->loadCIDFont(idA, src);
+  }
+#endif
+
+#ifndef _WIN32
+  // delete the (temporary) font file -- with Unix hard link
+  // semantics, this will remove the last link; otherwise it will
+  // return an error, leaving the file to be deleted later (if
+  // loadXYZFont failed, the file will always be deleted)
+  if (src->isFile)
+    src->unref();
+#endif
+
+  return fontFile;
+}
+
+SplashFontFile *SplashFontEngine::loadOpenTypeCFFFont(SplashFontFileID *idA,
+                                                     SplashFontSrc *src,
+                                                      int *codeToGID,
+                                                      int codeToGIDLen) {
+  SplashFontFile *fontFile;
+
+  fontFile = NULL;
+#if HAVE_FREETYPE_FREETYPE_H || HAVE_FREETYPE_H
+  if (!fontFile && ftEngine) {
+    fontFile = ftEngine->loadOpenTypeCFFFont(idA, src, codeToGID, codeToGIDLen);
+  }
+#endif
+
+  // delete the (temporary) font file -- with Unix hard link
+  // semantics, this will remove the last link; otherwise it will
+  // return an error, leaving the file to be deleted later (if
+  // loadXYZFont failed, the file will always be deleted)
+  if (src->isFile)
+    src->unref();
+
+  return fontFile;
+}
+
+SplashFontFile *SplashFontEngine::loadTrueTypeFont(SplashFontFileID *idA,
+                                                  SplashFontSrc *src,
+                                                  int *codeToGID,
+                                                  int codeToGIDLen,
+                                                  int faceIndex) {
+  SplashFontFile *fontFile;
+
+  fontFile = NULL;
+#if HAVE_FREETYPE_FREETYPE_H || HAVE_FREETYPE_H
+  if (!fontFile && ftEngine) {
+    fontFile = ftEngine->loadTrueTypeFont(idA, src,
+                                        codeToGID, codeToGIDLen, faceIndex);
+  }
+#endif
+
+  if (!fontFile) {
+    gfree(codeToGID);
+  }
+
+#ifndef _WIN32
+  // delete the (temporary) font file -- with Unix hard link
+  // semantics, this will remove the last link; otherwise it will
+  // return an error, leaving the file to be deleted later (if
+  // loadXYZFont failed, the file will always be deleted)
+  if (src->isFile)
+    src->unref();
+#endif
+
+  return fontFile;
+}
+
+SplashFont *SplashFontEngine::getFont(SplashFontFile *fontFile,
+                                     SplashCoord *textMat,
+                                     SplashCoord *ctm) {
+  SplashCoord mat[4];
+  SplashFont *font;
+  int i, j;
+
+  mat[0] = textMat[0] * ctm[0] + textMat[1] * ctm[2];
+  mat[1] = -(textMat[0] * ctm[1] + textMat[1] * ctm[3]);
+  mat[2] = textMat[2] * ctm[0] + textMat[3] * ctm[2];
+  mat[3] = -(textMat[2] * ctm[1] + textMat[3] * ctm[3]);
+  if (!splashCheckDet(mat[0], mat[1], mat[2], mat[3], 0.01)) {
+    // avoid a singular (or close-to-singular) matrix
+    mat[0] = 0.01;  mat[1] = 0;
+    mat[2] = 0;     mat[3] = 0.01;
+  }
+
+  font = fontCache[0];
+  if (font && font->matches(fontFile, mat, textMat)) {
+    return font;
+  }
+  for (i = 1; i < splashFontCacheSize; ++i) {
+    font = fontCache[i];
+    if (font && font->matches(fontFile, mat, textMat)) {
+      for (j = i; j > 0; --j) {
+       fontCache[j] = fontCache[j-1];
+      }
+      fontCache[0] = font;
+      return font;
+    }
+  }
+  font = fontFile->makeFont(mat, textMat);
+  if (fontCache[splashFontCacheSize - 1]) {
+    delete fontCache[splashFontCacheSize - 1];
+  }
+  for (j = splashFontCacheSize - 1; j > 0; --j) {
+    fontCache[j] = fontCache[j-1];
+  }
+  fontCache[0] = font;
+  return font;
+}
diff --git a/splash/SplashFontEngine.h b/splash/SplashFontEngine.h
new file mode 100644 (file)
index 0000000..54926b4
--- /dev/null
@@ -0,0 +1,105 @@
+//========================================================================
+//
+// SplashFontEngine.h
+//
+//========================================================================
+
+//========================================================================
+//
+// Modified under the Poppler project - http://poppler.freedesktop.org
+//
+// All changes made under the Poppler project to this file are licensed
+// under GPL version 2 or later
+//
+// Copyright (C) 2006 Takashi Iwai <tiwai@suse.de>
+// Copyright (C) 2009 Petr Gajdos <pgajdos@novell.com>
+// Copyright (C) 2009, 2011 Albert Astals Cid <aacid@kde.org>
+// Copyright (C) 2011 Andreas Hartmetz <ahartmetz@gmail.com>
+//
+// To see a description of the changes please see the Changelog file that
+// came with your tarball or type make ChangeLog if you are building from git
+//
+//========================================================================
+
+#ifndef SPLASHFONTENGINE_H
+#define SPLASHFONTENGINE_H
+
+#ifdef USE_GCC_PRAGMAS
+#pragma interface
+#endif
+
+#include "goo/gtypes.h"
+#include "SplashTypes.h"
+
+class SplashT1FontEngine;
+class SplashFTFontEngine;
+class SplashDTFontEngine;
+class SplashDT4FontEngine;
+class SplashFontFile;
+class SplashFontFileID;
+class SplashFont;
+class SplashFontSrc;
+
+//------------------------------------------------------------------------
+
+#define splashFontCacheSize 16
+
+//------------------------------------------------------------------------
+// SplashFontEngine
+//------------------------------------------------------------------------
+
+class SplashFontEngine {
+public:
+
+  // Create a font engine.
+  SplashFontEngine(
+#if HAVE_T1LIB_H
+                  GBool enableT1lib,
+#endif
+#if HAVE_FREETYPE_FREETYPE_H || HAVE_FREETYPE_H
+                  GBool enableFreeType,
+                  GBool enableFreeTypeHinting,
+                  GBool enableSlightHinting,
+#endif
+                  GBool aa);
+
+  ~SplashFontEngine();
+
+  // Get a font file from the cache.  Returns NULL if there is no
+  // matching entry in the cache.
+  SplashFontFile *getFontFile(SplashFontFileID *id);
+
+  // Load fonts - these create new SplashFontFile objects.
+  SplashFontFile *loadType1Font(SplashFontFileID *idA, SplashFontSrc *src, const char **enc);
+  SplashFontFile *loadType1CFont(SplashFontFileID *idA, SplashFontSrc *src, const char **enc);
+  SplashFontFile *loadOpenTypeT1CFont(SplashFontFileID *idA, SplashFontSrc *src, const char **enc);
+  SplashFontFile *loadCIDFont(SplashFontFileID *idA, SplashFontSrc *src);
+  SplashFontFile *loadOpenTypeCFFFont(SplashFontFileID *idA, SplashFontSrc *src,
+                                      int *codeToGID, int codeToGIDLen);
+  SplashFontFile *loadTrueTypeFont(SplashFontFileID *idA, SplashFontSrc *src,
+                                  int *codeToGID, int codeToGIDLen, int faceIndex = 0);
+
+  // Get a font - this does a cache lookup first, and if not found,
+  // creates a new SplashFont object and adds it to the cache.  The
+  // matrix, mat = textMat * ctm:
+  //    [ mat[0] mat[1] ]
+  //    [ mat[2] mat[3] ]
+  // specifies the font transform in PostScript style:
+  //    [x' y'] = [x y] * mat
+  // Note that the Splash y axis points downward.
+  SplashFont *getFont(SplashFontFile *fontFile,
+                     SplashCoord *textMat, SplashCoord *ctm);
+
+private:
+
+  SplashFont *fontCache[splashFontCacheSize];
+
+#if HAVE_T1LIB_H
+  SplashT1FontEngine *t1Engine;
+#endif
+#if HAVE_FREETYPE_FREETYPE_H || HAVE_FREETYPE_H
+  SplashFTFontEngine *ftEngine;
+#endif
+};
+
+#endif
diff --git a/splash/SplashFontFile.cc b/splash/SplashFontFile.cc
new file mode 100644 (file)
index 0000000..68e8608
--- /dev/null
@@ -0,0 +1,124 @@
+//========================================================================
+//
+// SplashFontFile.cc
+//
+//========================================================================
+
+//========================================================================
+//
+// Modified under the Poppler project - http://poppler.freedesktop.org
+//
+// All changes made under the Poppler project to this file are licensed
+// under GPL version 2 or later
+//
+// Copyright (C) 2006 Takashi Iwai <tiwai@suse.de>
+// Copyright (C) 2008 Albert Astals Cid <aacid@kde.org>
+//
+// To see a description of the changes please see the Changelog file that
+// came with your tarball or type make ChangeLog if you are building from git
+//
+//========================================================================
+
+#include <config.h>
+
+#ifdef USE_GCC_PRAGMAS
+#pragma implementation
+#endif
+
+#include <stdio.h>
+#ifdef HAVE_UNISTD_H
+#include <unistd.h>
+#endif
+#include "goo/gmem.h"
+#include "goo/GooString.h"
+#include "SplashFontFile.h"
+#include "SplashFontFileID.h"
+
+#ifdef VMS
+#if (__VMS_VER < 70000000)
+extern "C" int unlink(char *filename);
+#endif
+#endif
+
+//------------------------------------------------------------------------
+// SplashFontFile
+//------------------------------------------------------------------------
+
+SplashFontFile::SplashFontFile(SplashFontFileID *idA, SplashFontSrc *srcA) {
+  id = idA;
+  src = srcA;
+  src->ref();
+  refCnt = 0;
+  doAdjustMatrix = gFalse;
+}
+
+SplashFontFile::~SplashFontFile() {
+  src->unref();
+  delete id;
+}
+
+void SplashFontFile::incRefCnt() {
+  ++refCnt;
+}
+
+void SplashFontFile::decRefCnt() {
+  if (!--refCnt) {
+    delete this;
+  }
+}
+
+//
+
+SplashFontSrc::SplashFontSrc() {
+  isFile = gFalse;
+  deleteSrc = gFalse;
+  fileName = NULL;
+  buf = NULL;
+  refcnt = 1;
+}
+
+SplashFontSrc::~SplashFontSrc() {
+  if (deleteSrc) {
+    if (isFile) {
+      if (fileName)
+       unlink(fileName->getCString());
+    } else {
+      if (buf)
+       gfree(buf);
+    }
+  }
+
+  if (isFile && fileName)
+    delete fileName;
+}
+
+void SplashFontSrc::ref() {
+  refcnt++;
+}
+
+void SplashFontSrc::unref() {
+  if (! --refcnt)
+    delete this;
+}
+
+void SplashFontSrc::setFile(GooString *file, GBool del)
+{
+  isFile = gTrue;
+  fileName = file->copy();
+  deleteSrc = del;
+}
+
+void SplashFontSrc::setFile(const char *file, GBool del)
+{
+  isFile = gTrue;
+  fileName = new GooString(file);
+  deleteSrc = del;
+}
+
+void SplashFontSrc::setBuf(char *bufA, int bufLenA, GBool del)
+{
+  isFile = gFalse;
+  buf = bufA;
+  bufLen = bufLenA;
+  deleteSrc = del;
+}
diff --git a/splash/SplashFontFile.h b/splash/SplashFontFile.h
new file mode 100644 (file)
index 0000000..ec87504
--- /dev/null
@@ -0,0 +1,95 @@
+//========================================================================
+//
+// SplashFontFile.h
+//
+//========================================================================
+
+//========================================================================
+//
+// Modified under the Poppler project - http://poppler.freedesktop.org
+//
+// All changes made under the Poppler project to this file are licensed
+// under GPL version 2 or later
+//
+// Copyright (C) 2006 Takashi Iwai <tiwai@suse.de>
+// Copyright (C) 2008, 2010 Albert Astals Cid <aacid@kde.org>
+//
+// To see a description of the changes please see the Changelog file that
+// came with your tarball or type make ChangeLog if you are building from git
+//
+//========================================================================
+
+#ifndef SPLASHFONTFILE_H
+#define SPLASHFONTFILE_H
+
+#ifdef USE_GCC_PRAGMAS
+#pragma interface
+#endif
+
+#include "goo/gtypes.h"
+#include "SplashTypes.h"
+
+class GooString;
+class SplashFontEngine;
+class SplashFont;
+class SplashFontFileID;
+
+//------------------------------------------------------------------------
+// SplashFontFile
+//------------------------------------------------------------------------
+
+class SplashFontSrc {
+public:
+  SplashFontSrc();
+
+  void setFile(GooString *file, GBool del);
+  void setFile(const char *file, GBool del);
+  void setBuf(char *bufA, int buflenA, GBool del);
+
+  void ref();
+  void unref();
+
+  GBool isFile;
+  GooString *fileName;
+  char *buf;
+  int bufLen;
+
+private:
+  ~SplashFontSrc();
+  int refcnt;
+  GBool deleteSrc;
+};
+
+class SplashFontFile {
+public:
+
+  virtual ~SplashFontFile();
+
+  // Create a new SplashFont, i.e., a scaled instance of this font
+  // file.
+  virtual SplashFont *makeFont(SplashCoord *mat, SplashCoord *textMat) = 0;
+
+  // Get the font file ID.
+  SplashFontFileID *getID() { return id; }
+
+  // Increment the reference count.
+  void incRefCnt();
+
+  // Decrement the reference count.  If the new value is zero, delete
+  // the SplashFontFile object.
+  void decRefCnt();
+
+  GBool doAdjustMatrix;
+
+protected:
+
+  SplashFontFile(SplashFontFileID *idA, SplashFontSrc *srcA);
+
+  SplashFontFileID *id;
+  SplashFontSrc *src;
+  int refCnt;
+
+  friend class SplashFontEngine;
+};
+
+#endif
diff --git a/splash/SplashFontFileID.cc b/splash/SplashFontFileID.cc
new file mode 100644 (file)
index 0000000..a66dabf
--- /dev/null
@@ -0,0 +1,23 @@
+//========================================================================
+//
+// SplashFontFileID.cc
+//
+//========================================================================
+
+#include <config.h>
+
+#ifdef USE_GCC_PRAGMAS
+#pragma implementation
+#endif
+
+#include "SplashFontFileID.h"
+
+//------------------------------------------------------------------------
+// SplashFontFileID
+//------------------------------------------------------------------------
+
+SplashFontFileID::SplashFontFileID() {
+}
+
+SplashFontFileID::~SplashFontFileID() {
+}
diff --git a/splash/SplashFontFileID.h b/splash/SplashFontFileID.h
new file mode 100644 (file)
index 0000000..cfd89eb
--- /dev/null
@@ -0,0 +1,28 @@
+//========================================================================
+//
+// SplashFontFileID.h
+//
+//========================================================================
+
+#ifndef SPLASHFONTFILEID_H
+#define SPLASHFONTFILEID_H
+
+#ifdef USE_GCC_PRAGMAS
+#pragma interface
+#endif
+
+#include "goo/gtypes.h"
+
+//------------------------------------------------------------------------
+// SplashFontFileID
+//------------------------------------------------------------------------
+
+class SplashFontFileID {
+public:
+
+  SplashFontFileID();
+  virtual ~SplashFontFileID();
+  virtual GBool matches(SplashFontFileID *id) = 0;
+};
+
+#endif
diff --git a/splash/SplashGlyphBitmap.h b/splash/SplashGlyphBitmap.h
new file mode 100644 (file)
index 0000000..c062c10
--- /dev/null
@@ -0,0 +1,24 @@
+//========================================================================
+//
+// SplashGlyphBitmap.h
+//
+//========================================================================
+
+#ifndef SPLASHGLYPHBITMAP_H
+#define SPLASHGLYPHBITMAP_H
+
+#include "goo/gtypes.h"
+
+//------------------------------------------------------------------------
+// SplashGlyphBitmap
+//------------------------------------------------------------------------
+
+struct SplashGlyphBitmap {
+  int x, y, w, h;              // offset and size of glyph
+  GBool aa;                    // anti-aliased: true means 8-bit alpha
+                               //   bitmap; false means 1-bit
+  Guchar *data;                        // bitmap data
+  GBool freeData;              // true if data memory should be freed
+};
+
+#endif
diff --git a/splash/SplashMath.h b/splash/SplashMath.h
new file mode 100644 (file)
index 0000000..ca73c2b
--- /dev/null
@@ -0,0 +1,245 @@
+//========================================================================
+//
+// SplashMath.h
+//
+//========================================================================
+
+//========================================================================
+//
+// Modified under the Poppler project - http://poppler.freedesktop.org
+//
+// All changes made under the Poppler project to this file are licensed
+// under GPL version 2 or later
+//
+// Copyright (C) 2009-2011 Albert Astals Cid <aacid@kde.org>
+//
+// To see a description of the changes please see the Changelog file that
+// came with your tarball or type make ChangeLog if you are building from git
+//
+//========================================================================
+
+#ifndef SPLASHMATH_H
+#define SPLASHMATH_H
+
+#include "poppler-config.h"
+
+#if USE_FIXEDPOINT
+#include "goo/FixedPoint.h"
+#else
+#include <math.h>
+#endif
+#include "SplashTypes.h"
+
+static inline SplashCoord splashAbs(SplashCoord x) {
+#if USE_FIXEDPOINT
+  return FixedPoint::abs(x);
+#elif USE_FLOAT
+  return fabsf(x);
+#else
+  return fabs(x);
+#endif
+}
+
+static inline int splashFloor(SplashCoord x) {
+  #if USE_FIXEDPOINT
+    return FixedPoint::floor(x);
+  #elif USE_FLOAT
+    return (int)floorf(x);
+  #elif __GNUC__ && __i386__
+    // floor() and (int)() are implemented separately, which results
+    // in changing the FPCW multiple times - so we optimize it with
+    // some inline assembly
+    Gushort oldCW, newCW, t;
+    int result;
+
+    __asm__ volatile("fldl   %4\n"
+                  "fnstcw %0\n"
+                  "movw   %0, %3\n"
+                  "andw   $0xf3ff, %3\n"
+                  "orw    $0x0400, %3\n"
+                  "movw   %3, %1\n"       // round down
+                  "fldcw  %1\n"
+                  "fistpl %2\n"
+                  "fldcw  %0\n"
+                  : "=m" (oldCW), "=m" (newCW), "=m" (result), "=r" (t)
+                  : "m" (x));
+    return result;
+  #elif defined(WIN32) && defined(_M_IX86)
+    // floor() and (int)() are implemented separately, which results
+    // in changing the FPCW multiple times - so we optimize it with
+    // some inline assembly
+    Gushort oldCW, newCW;
+    int result;
+
+    __asm fld QWORD PTR x
+    __asm fnstcw WORD PTR oldCW
+    __asm mov ax, WORD PTR oldCW
+    __asm and ax, 0xf3ff
+    __asm or ax, 0x0400
+    __asm mov WORD PTR newCW, ax     // round down
+    __asm fldcw WORD PTR newCW
+    __asm fistp DWORD PTR result
+    __asm fldcw WORD PTR oldCW
+    return result;
+  #else
+    if (x > 0) return (int)x;
+    else return (int)floor(x);
+  #endif
+}
+
+static inline int splashCeil(SplashCoord x) {
+#if USE_FIXEDPOINT
+  return FixedPoint::ceil(x);
+#elif USE_FLOAT
+  return (int)ceilf(x);
+#elif __GNUC__ && __i386__
+  // ceil() and (int)() are implemented separately, which results
+  // in changing the FPCW multiple times - so we optimize it with
+  // some inline assembly
+  Gushort oldCW, newCW, t;
+  int result;
+
+  __asm__ volatile("fldl   %4\n"
+                  "fnstcw %0\n"
+                  "movw   %0, %3\n"
+                  "andw   $0xf3ff, %3\n"
+                  "orw    $0x0800, %3\n"
+                  "movw   %3, %1\n"       // round up
+                  "fldcw  %1\n"
+                  "fistpl %2\n"
+                  "fldcw  %0\n"
+                  : "=m" (oldCW), "=m" (newCW), "=m" (result), "=r" (t)
+                  : "m" (x));
+  return result;
+#elif defined(WIN32) && defined(_M_IX86)
+  // ceil() and (int)() are implemented separately, which results
+  // in changing the FPCW multiple times - so we optimize it with
+  // some inline assembly
+  Gushort oldCW, newCW;
+  int result;
+
+  __asm fld QWORD PTR x
+  __asm fnstcw WORD PTR oldCW
+  __asm mov ax, WORD PTR oldCW
+  __asm and ax, 0xf3ff
+  __asm or ax, 0x0800
+  __asm mov WORD PTR newCW, ax     // round up
+  __asm fldcw WORD PTR newCW
+  __asm fistp DWORD PTR result
+  __asm fldcw WORD PTR oldCW
+  return result;
+#else
+  return (int)ceil(x);
+#endif
+}
+
+static inline int splashRound(SplashCoord x) {
+#if USE_FIXEDPOINT
+  return FixedPoint::round(x);
+#elif __GNUC__ && __i386__
+  // this could use round-to-nearest mode and avoid the "+0.5",
+  // but that produces slightly different results (because i+0.5
+  // sometimes rounds up and sometimes down using the even rule)
+  Gushort oldCW, newCW, t;
+  int result;
+
+  x += 0.5;
+  __asm__ volatile("fldl   %4\n"
+                  "fnstcw %0\n"
+                  "movw   %0, %3\n"
+                  "andw   $0xf3ff, %3\n"
+                  "orw    $0x0400, %3\n"
+                  "movw   %3, %1\n"       // round down
+                  "fldcw  %1\n"
+                  "fistpl %2\n"
+                  "fldcw  %0\n"
+                  : "=m" (oldCW), "=m" (newCW), "=m" (result), "=r" (t)
+                  : "m" (x));
+  return result;
+#elif defined(WIN32) && defined(_M_IX86)
+  // this could use round-to-nearest mode and avoid the "+0.5",
+  // but that produces slightly different results (because i+0.5
+  // sometimes rounds up and sometimes down using the even rule)
+  Gushort oldCW, newCW;
+  int result;
+
+  x += 0.5;
+  __asm fld QWORD PTR x
+  __asm fnstcw WORD PTR oldCW
+  __asm mov ax, WORD PTR oldCW
+  __asm and ax, 0xf3ff
+  __asm or ax, 0x0400
+  __asm mov WORD PTR newCW, ax     // round down
+  __asm fldcw WORD PTR newCW
+  __asm fistp DWORD PTR result
+  __asm fldcw WORD PTR oldCW
+  return result;
+#else
+  return (int)splashFloor(x + 0.5);
+#endif
+}
+
+static inline SplashCoord splashAvg(SplashCoord x, SplashCoord y) {
+#if USE_FIXEDPOINT
+  return FixedPoint::avg(x, y);
+#else
+  return 0.5 * (x + y);
+#endif
+}
+static inline SplashCoord splashSqrt(SplashCoord x) {
+#if USE_FIXEDPOINT
+  return FixedPoint::sqrt(x);
+#elif USE_FLOAT
+  return sqrtf(x);
+#else
+  return sqrt(x);
+#endif
+}
+
+static inline SplashCoord splashPow(SplashCoord x, SplashCoord y) {
+#if USE_FIXEDPOINT
+  return FixedPoint::pow(x, y);
+#elif USE_FLOAT
+  return powf(x, y);
+#else
+  return pow(x, y);
+#endif
+}
+
+static inline SplashCoord splashDist(SplashCoord x0, SplashCoord y0,
+                                    SplashCoord x1, SplashCoord y1) {
+  SplashCoord dx, dy;
+  dx = x1 - x0;
+  dy = y1 - y0;
+#if USE_FIXEDPOINT
+  // this handles the situation where dx*dx or dy*dy is too large to
+  // fit in the 16.16 fixed point format
+  SplashCoord dxa, dya, d;
+  dxa = splashAbs(dx);
+  dya = splashAbs(dy);
+  if (dxa == 0 && dya == 0) {
+    return 0;
+  } else if (dxa > dya) {
+    d = dya / dxa;
+    return dxa * FixedPoint::sqrt(d*d + 1);
+  } else {
+    d = dxa / dya;
+    return dya * FixedPoint::sqrt(d*d + 1);
+  }
+#else
+  return splashSqrt(dx * dx + dy * dy);
+#endif
+}
+
+static inline GBool splashCheckDet(SplashCoord m11, SplashCoord m12,
+                                  SplashCoord m21, SplashCoord m22,
+                                  SplashCoord epsilon) {
+#if USE_FIXEDPOINT
+  return FixedPoint::checkDet(m11, m12, m21, m22, epsilon);
+#else
+  return fabs(m11 * m22 - m12 * m21) >= epsilon;
+#endif
+}
+
+#endif
diff --git a/splash/SplashPath.cc b/splash/SplashPath.cc
new file mode 100644 (file)
index 0000000..bc4ccd5
--- /dev/null
@@ -0,0 +1,185 @@
+//========================================================================
+//
+// SplashPath.cc
+//
+//========================================================================
+
+#include <config.h>
+
+#ifdef USE_GCC_PRAGMAS
+#pragma implementation
+#endif
+
+#include <string.h>
+#include "goo/gmem.h"
+#include "SplashErrorCodes.h"
+#include "SplashPath.h"
+
+//------------------------------------------------------------------------
+// SplashPath
+//------------------------------------------------------------------------
+
+// A path can be in three possible states:
+//
+// 1. no current point -- zero or more finished subpaths
+//    [curSubpath == length]
+//
+// 2. one point in subpath
+//    [curSubpath == length - 1]
+//
+// 3. open subpath with two or more points
+//    [curSubpath < length - 1]
+
+SplashPath::SplashPath() {
+  pts = NULL;
+  flags = NULL;
+  length = size = 0;
+  curSubpath = 0;
+  hints = NULL;
+  hintsLength = hintsSize = 0;
+}
+
+SplashPath::SplashPath(SplashPath *path) {
+  length = path->length;
+  size = path->size;
+  pts = (SplashPathPoint *)gmallocn(size, sizeof(SplashPathPoint));
+  flags = (Guchar *)gmallocn(size, sizeof(Guchar));
+  memcpy(pts, path->pts, length * sizeof(SplashPathPoint));
+  memcpy(flags, path->flags, length * sizeof(Guchar));
+  curSubpath = path->curSubpath;
+  if (path->hints) {
+    hintsLength = hintsSize = path->hintsLength;
+    hints = (SplashPathHint *)gmallocn(hintsSize, sizeof(SplashPathHint));
+    memcpy(hints, path->hints, hintsLength * sizeof(SplashPathHint));
+  } else {
+    hints = NULL;
+  }
+}
+
+SplashPath::~SplashPath() {
+  gfree(pts);
+  gfree(flags);
+  gfree(hints);
+}
+
+// Add space for <nPts> more points.
+void SplashPath::grow(int nPts) {
+  if (length + nPts > size) {
+    if (size == 0) {
+      size = 32;
+    }
+    while (size < length + nPts) {
+      size *= 2;
+    }
+    pts = (SplashPathPoint *)greallocn(pts, size, sizeof(SplashPathPoint));
+    flags = (Guchar *)greallocn(flags, size, sizeof(Guchar));
+  }
+}
+
+void SplashPath::append(SplashPath *path) {
+  int i;
+
+  curSubpath = length + path->curSubpath;
+  grow(path->length);
+  for (i = 0; i < path->length; ++i) {
+    pts[length] = path->pts[i];
+    flags[length] = path->flags[i];
+    ++length;
+  }
+}
+
+SplashError SplashPath::moveTo(SplashCoord x, SplashCoord y) {
+  if (onePointSubpath()) {
+    return splashErrBogusPath;
+  }
+  grow(1);
+  pts[length].x = x;
+  pts[length].y = y;
+  flags[length] = splashPathFirst | splashPathLast;
+  curSubpath = length++;
+  return splashOk;
+}
+
+SplashError SplashPath::lineTo(SplashCoord x, SplashCoord y) {
+  if (noCurrentPoint()) {
+    return splashErrNoCurPt;
+  }
+  flags[length-1] &= ~splashPathLast;
+  grow(1);
+  pts[length].x = x;
+  pts[length].y = y;
+  flags[length] = splashPathLast;
+  ++length;
+  return splashOk;
+}
+
+SplashError SplashPath::curveTo(SplashCoord x1, SplashCoord y1,
+                               SplashCoord x2, SplashCoord y2,
+                               SplashCoord x3, SplashCoord y3) {
+  if (noCurrentPoint()) {
+    return splashErrNoCurPt;
+  }
+  flags[length-1] &= ~splashPathLast;
+  grow(3);
+  pts[length].x = x1;
+  pts[length].y = y1;
+  flags[length] = splashPathCurve;
+  ++length;
+  pts[length].x = x2;
+  pts[length].y = y2;
+  flags[length] = splashPathCurve;
+  ++length;
+  pts[length].x = x3;
+  pts[length].y = y3;
+  flags[length] = splashPathLast;
+  ++length;
+  return splashOk;
+}
+
+SplashError SplashPath::close(GBool force) {
+  if (noCurrentPoint()) {
+    return splashErrNoCurPt;
+  }
+  if (force ||
+      curSubpath == length - 1 ||
+      pts[length - 1].x != pts[curSubpath].x ||
+      pts[length - 1].y != pts[curSubpath].y) {
+    lineTo(pts[curSubpath].x, pts[curSubpath].y);
+  }
+  flags[curSubpath] |= splashPathClosed;
+  flags[length - 1] |= splashPathClosed;
+  curSubpath = length;
+  return splashOk;
+}
+
+void SplashPath::addStrokeAdjustHint(int ctrl0, int ctrl1,
+                                    int firstPt, int lastPt) {
+  if (hintsLength == hintsSize) {
+    hintsSize = hintsLength ? 2 * hintsLength : 8;
+    hints = (SplashPathHint *)greallocn(hints, hintsSize,
+                                       sizeof(SplashPathHint));
+  }
+  hints[hintsLength].ctrl0 = ctrl0;
+  hints[hintsLength].ctrl1 = ctrl1;
+  hints[hintsLength].firstPt = firstPt;
+  hints[hintsLength].lastPt = lastPt;
+  ++hintsLength;
+}
+
+void SplashPath::offset(SplashCoord dx, SplashCoord dy) {
+  int i;
+
+  for (i = 0; i < length; ++i) {
+    pts[i].x += dx;
+    pts[i].y += dy;
+  }
+}
+
+GBool SplashPath::getCurPt(SplashCoord *x, SplashCoord *y) {
+  if (noCurrentPoint()) {
+    return gFalse;
+  }
+  *x = pts[length - 1].x;
+  *y = pts[length - 1].y;
+  return gTrue;
+}
diff --git a/splash/SplashPath.h b/splash/SplashPath.h
new file mode 100644 (file)
index 0000000..81273c6
--- /dev/null
@@ -0,0 +1,123 @@
+//========================================================================
+//
+// SplashPath.h
+//
+//========================================================================
+
+#ifndef SPLASHPATH_H
+#define SPLASHPATH_H
+
+#ifdef USE_GCC_PRAGMAS
+#pragma interface
+#endif
+
+#include "SplashTypes.h"
+
+//------------------------------------------------------------------------
+// SplashPathPoint
+//------------------------------------------------------------------------
+
+struct SplashPathPoint {
+  SplashCoord x, y;
+};
+
+//------------------------------------------------------------------------
+// SplashPath.flags
+//------------------------------------------------------------------------
+
+// first point on each subpath sets this flag
+#define splashPathFirst         0x01
+
+// last point on each subpath sets this flag
+#define splashPathLast          0x02
+
+// if the subpath is closed, its first and last points must be
+// identical, and must set this flag
+#define splashPathClosed        0x04
+
+// curve control points set this flag
+#define splashPathCurve         0x08
+
+//------------------------------------------------------------------------
+// SplashPathHint
+//------------------------------------------------------------------------
+
+struct SplashPathHint {
+  int ctrl0, ctrl1;
+  int firstPt, lastPt;
+};
+
+//------------------------------------------------------------------------
+// SplashPath
+//------------------------------------------------------------------------
+
+class SplashPath {
+public:
+
+  // Create an empty path.
+  SplashPath();
+
+  // Copy a path.
+  SplashPath *copy() { return new SplashPath(this); }
+
+  ~SplashPath();
+
+  // Append <path> to <this>.
+  void append(SplashPath *path);
+
+  // Start a new subpath.
+  SplashError moveTo(SplashCoord x, SplashCoord y);
+
+  // Add a line segment to the last subpath.
+  SplashError lineTo(SplashCoord x, SplashCoord y);
+
+  // Add a third-order (cubic) Bezier curve segment to the last
+  // subpath.
+  SplashError curveTo(SplashCoord x1, SplashCoord y1,
+                     SplashCoord x2, SplashCoord y2,
+                     SplashCoord x3, SplashCoord y3);
+
+  // Close the last subpath, adding a line segment if necessary.  If
+  // <force> is true, this adds a line segment even if the current
+  // point is equal to the first point in the subpath.
+  SplashError close(GBool force = gFalse);
+
+  // Add a stroke adjustment hint.  The controlling segments are
+  // <ctrl0> and <ctrl1> (where segments are identified by their first
+  // point), and the points to be adjusted are <firstPt> .. <lastPt>.
+  void addStrokeAdjustHint(int ctrl0, int ctrl1, int firstPt, int lastPt);
+
+  // Add (<dx>, <dy>) to every point on this path.
+  void offset(SplashCoord dx, SplashCoord dy);
+
+  // Get the points on the path.
+  int getLength() { return length; }
+  void getPoint(int i, double *x, double *y, Guchar *f)
+    { *x = pts[i].x; *y = pts[i].y; *f = flags[i]; }
+
+  // Get the current point.
+  GBool getCurPt(SplashCoord *x, SplashCoord *y);
+
+protected:
+
+  SplashPath(SplashPath *path);
+  void grow(int nPts);
+  GBool noCurrentPoint() { return curSubpath == length; }
+  GBool onePointSubpath() { return curSubpath == length - 1; }
+  GBool openSubpath() { return curSubpath < length - 1; }
+
+  SplashPathPoint *pts;                // array of points
+  Guchar *flags;               // array of flags
+  int length, size;            // length/size of the pts and flags arrays
+  int curSubpath;              // index of first point in last subpath
+
+  SplashPathHint *hints;       // list of hints
+  int hintsLength, hintsSize;
+
+  friend class SplashXPath;
+  friend class Splash;
+  // this is a temporary hack, until we read FreeType paths directly
+  friend class ArthurOutputDev;
+};
+
+#endif
diff --git a/splash/SplashPattern.cc b/splash/SplashPattern.cc
new file mode 100644 (file)
index 0000000..28ca499
--- /dev/null
@@ -0,0 +1,55 @@
+//========================================================================
+//
+// SplashPattern.cc
+//
+//========================================================================
+
+//========================================================================
+//
+// Modified under the Poppler project - http://poppler.freedesktop.org
+//
+// All changes made under the Poppler project to this file are licensed
+// under GPL version 2 or later
+//
+// Copyright (C) 2010, 2011 Thomas Freitag <Thomas.Freitag@alfa.de>
+//
+// To see a description of the changes please see the Changelog file that
+// came with your tarball or type make ChangeLog if you are building from git
+//
+//========================================================================
+
+#include <config.h>
+
+#ifdef USE_GCC_PRAGMAS
+#pragma implementation
+#endif
+
+#include "SplashMath.h"
+#include "SplashScreen.h"
+#include "SplashPattern.h"
+
+//------------------------------------------------------------------------
+// SplashPattern
+//------------------------------------------------------------------------
+
+SplashPattern::SplashPattern() {
+}
+
+SplashPattern::~SplashPattern() {
+}
+
+//------------------------------------------------------------------------
+// SplashSolidColor
+//------------------------------------------------------------------------
+
+SplashSolidColor::SplashSolidColor(SplashColorPtr colorA) {
+  splashColorCopy(color, colorA);
+}
+
+SplashSolidColor::~SplashSolidColor() {
+}
+
+GBool SplashSolidColor::getColor(int x, int y, SplashColorPtr c) {
+  splashColorCopy(c, color);
+  return gTrue;
+}
diff --git a/splash/SplashPattern.h b/splash/SplashPattern.h
new file mode 100644 (file)
index 0000000..42c1660
--- /dev/null
@@ -0,0 +1,100 @@
+//========================================================================
+//
+// SplashPattern.h
+//
+//========================================================================
+
+//========================================================================
+//
+// Modified under the Poppler project - http://poppler.freedesktop.org
+//
+// All changes made under the Poppler project to this file are licensed
+// under GPL version 2 or later
+//
+// Copyright (C) 2010, 2011 Thomas Freitag <Thomas.Freitag@alfa.de>
+//
+// To see a description of the changes please see the Changelog file that
+// came with your tarball or type make ChangeLog if you are building from git
+//
+//========================================================================
+
+#ifndef SPLASHPATTERN_H
+#define SPLASHPATTERN_H
+
+#ifdef USE_GCC_PRAGMAS
+#pragma interface
+#endif
+
+#include "SplashTypes.h"
+
+class SplashScreen;
+
+//------------------------------------------------------------------------
+// SplashPattern
+//------------------------------------------------------------------------
+
+class SplashPattern {
+public:
+
+  SplashPattern();
+
+  virtual SplashPattern *copy() = 0;
+
+  virtual ~SplashPattern();
+
+  // Return the color value for a specific pixel.
+  virtual GBool getColor(int x, int y, SplashColorPtr c) = 0;
+
+  // Test if x,y-position is inside pattern.
+  virtual GBool testPosition(int x, int y) = 0;
+
+  // Returns true if this pattern object will return the same color
+  // value for all pixels.
+  virtual GBool isStatic() = 0;
+
+private:
+};
+
+//------------------------------------------------------------------------
+// SplashSolidColor
+//------------------------------------------------------------------------
+
+class SplashSolidColor: public SplashPattern {
+public:
+
+  SplashSolidColor(SplashColorPtr colorA);
+
+  virtual SplashPattern *copy() { return new SplashSolidColor(color); }
+
+  virtual ~SplashSolidColor();
+
+  virtual GBool getColor(int x, int y, SplashColorPtr c);
+
+  virtual GBool testPosition(int x, int y) { return gFalse; }
+
+  virtual GBool isStatic() { return gTrue; }
+
+private:
+
+  SplashColor color;
+};
+
+//------------------------------------------------------------------------
+// SplashGouraudColor (needed for gouraudTriangleShadedFill)
+//------------------------------------------------------------------------
+
+class SplashGouraudColor: public SplashPattern {
+public:
+
+  virtual GBool isParameterized() = 0;
+
+  virtual int getNTriangles() = 0;
+
+  virtual  void getTriangle(int i, double *x0, double *y0, double *color0,
+                            double *x1, double *y1, double *color1,
+                            double *x2, double *y2, double *color2) = 0;
+
+  virtual void getParameterizedColor(double t, SplashColorMode mode, SplashColorPtr c) = 0;
+};
+
+#endif
diff --git a/splash/SplashScreen.cc b/splash/SplashScreen.cc
new file mode 100644 (file)
index 0000000..d741246
--- /dev/null
@@ -0,0 +1,389 @@
+//========================================================================
+//
+// SplashScreen.cc
+//
+//========================================================================
+
+//========================================================================
+//
+// Modified under the Poppler project - http://poppler.freedesktop.org
+//
+// All changes made under the Poppler project to this file are licensed
+// under GPL version 2 or later
+//
+// Copyright (C) 2009 Albert Astals Cid <aacid@kde.org>
+//
+// To see a description of the changes please see the Changelog file that
+// came with your tarball or type make ChangeLog if you are building from git
+//
+//========================================================================
+
+#include <config.h>
+
+#ifdef USE_GCC_PRAGMAS
+#pragma implementation
+#endif
+
+#include <stdlib.h>
+#include <string.h>
+#include <algorithm>
+#include "goo/gmem.h"
+#include "SplashMath.h"
+#include "SplashScreen.h"
+
+static SplashScreenParams defaultParams = {
+  splashScreenDispersed,       // type
+  2,                           // size
+  2,                           // dotRadius
+  1.0,                         // gamma
+  0.0,                         // blackThreshold
+  1.0                          // whiteThreshold
+};
+
+//------------------------------------------------------------------------
+
+struct SplashScreenPoint {
+  int x, y;
+  int dist;
+};
+
+
+struct cmpDistancesFunctor {
+  bool operator()(const SplashScreenPoint &p0, const SplashScreenPoint &p1) {
+    return p0.dist < p1.dist;
+  }
+};
+
+//------------------------------------------------------------------------
+// SplashScreen
+//------------------------------------------------------------------------
+
+// If <clustered> is true, this generates a 45 degree screen using a
+// circular dot spot function.  DPI = resolution / ((size / 2) *
+// sqrt(2)).  If <clustered> is false, this generates an optimal
+// threshold matrix using recursive tesselation.  Gamma correction
+// (gamma = 1 / 1.33) is also computed here.
+SplashScreen::SplashScreen(SplashScreenParams *params) {
+
+  if (!params) {
+    params = &defaultParams;
+  }
+  
+  screenParams = params;
+  mat = NULL;
+  size = 0;
+  maxVal = 0;
+  minVal = 0;
+}
+
+void SplashScreen::createMatrix()
+{
+  Guchar u;
+  int black, white, i;
+  
+  SplashScreenParams *params = screenParams;
+
+  // size must be a power of 2, and at least 2
+  for (size = 2, log2Size = 1; size < params->size; size <<= 1, ++log2Size) ;
+
+  switch (params->type) {
+
+  case splashScreenDispersed:
+    mat = (Guchar *)gmallocn(size * size, sizeof(Guchar));
+    buildDispersedMatrix(size/2, size/2, 1, size/2, 1);
+    break;
+
+  case splashScreenClustered:
+    mat = (Guchar *)gmallocn(size * size, sizeof(Guchar));
+    buildClusteredMatrix();
+    break;
+
+  case splashScreenStochasticClustered:
+    // size must be at least 2*r
+    while (size < (params->dotRadius << 1)) {
+      size <<= 1;
+      ++log2Size;
+    }
+    mat = (Guchar *)gmallocn(size * size, sizeof(Guchar));
+    buildSCDMatrix(params->dotRadius);
+    break;
+  }
+  
+  sizeM1 = size - 1;
+
+  // do gamma correction and compute minVal/maxVal
+  minVal = 255;
+  maxVal = 0;
+  black = splashRound((SplashCoord)255.0 * params->blackThreshold);
+  if (black < 1) {
+    black = 1;
+  }
+  int whiteAux = splashRound((SplashCoord)255.0 * params->whiteThreshold);
+  if (whiteAux > 255) {
+    white = 255;
+  } else {
+    white = whiteAux;
+  }
+   for (i = 0; i < size * size; ++i) {
+    u = splashRound((SplashCoord)255.0 *
+                   splashPow((SplashCoord)mat[i] / 255.0, params->gamma));
+    if (u < black) {
+      u = (Guchar)black;
+    } else if (u >= white) {
+      u = (Guchar)white;
+    }
+    mat[i] = u;
+    if (u < minVal) {
+      minVal = u;
+    } else if (u > maxVal) {
+      maxVal = u;
+    }
+  }
+}
+
+void SplashScreen::buildDispersedMatrix(int i, int j, int val,
+                                       int delta, int offset) {
+  if (delta == 0) {
+    // map values in [1, size^2] --> [1, 255]
+    mat[(i << log2Size) + j] = 1 + (254 * (val - 1)) / (size * size - 1);
+  } else {
+    buildDispersedMatrix(i, j,
+                        val, delta / 2, 4*offset);
+    buildDispersedMatrix((i + delta) % size, (j + delta) % size,
+                        val + offset, delta / 2, 4*offset);
+    buildDispersedMatrix((i + delta) % size, j,
+                        val + 2*offset, delta / 2, 4*offset);
+    buildDispersedMatrix((i + 2*delta) % size, (j + delta) % size,
+                        val + 3*offset, delta / 2, 4*offset);
+  }
+}
+
+void SplashScreen::buildClusteredMatrix() {
+  SplashCoord *dist;
+  SplashCoord u, v, d;
+  Guchar val;
+  int size2, x, y, x1, y1, i;
+
+  size2 = size >> 1;
+
+  // initialize the threshold matrix
+  for (y = 0; y < size; ++y) {
+    for (x = 0; x < size; ++x) {
+      mat[(y << log2Size) + x] = 0;
+    }
+  }
+
+  // build the distance matrix
+  dist = (SplashCoord *)gmallocn(size * size2, sizeof(SplashCoord));
+  for (y = 0; y < size2; ++y) {
+    for (x = 0; x < size2; ++x) {
+      if (x + y < size2 - 1) {
+       u = (SplashCoord)x + 0.5 - 0;
+       v = (SplashCoord)y + 0.5 - 0;
+      } else {
+       u = (SplashCoord)x + 0.5 - (SplashCoord)size2;
+       v = (SplashCoord)y + 0.5 - (SplashCoord)size2;
+      }
+      dist[y * size2 + x] = u*u + v*v;
+    }
+  }
+  for (y = 0; y < size2; ++y) {
+    for (x = 0; x < size2; ++x) {
+      if (x < y) {
+       u = (SplashCoord)x + 0.5 - 0;
+       v = (SplashCoord)y + 0.5 - (SplashCoord)size2;
+      } else {
+       u = (SplashCoord)x + 0.5 - (SplashCoord)size2;
+       v = (SplashCoord)y + 0.5 - 0;
+      }
+      dist[(size2 + y) * size2 + x] = u*u + v*v;
+    }
+  }
+
+  // build the threshold matrix
+  x1 = y1 = 0; // make gcc happy
+  for (i = 0; i < size * size2; ++i) {
+    d = -1;
+    for (y = 0; y < size; ++y) {
+      for (x = 0; x < size2; ++x) {
+       if (mat[(y << log2Size) + x] == 0 &&
+           dist[y * size2 + x] > d) {
+         x1 = x;
+         y1 = y;
+         d = dist[y1 * size2 + x1];
+       }
+      }
+    }
+    // map values in [0, 2*size*size2-1] --> [1, 255]
+    val = 1 + (254 * (2*i)) / (2*size*size2 - 1);
+    mat[(y1 << log2Size) + x1] = val;
+    val = 1 + (254 * (2*i+1)) / (2*size*size2 - 1);
+    if (y1 < size2) {
+      mat[((y1 + size2) << log2Size) + x1 + size2] = val;
+    } else {
+      mat[((y1 - size2) << log2Size) + x1 + size2] = val;
+    }
+  }
+
+  gfree(dist);
+}
+
+// Compute the distance between two points on a toroid.
+int SplashScreen::distance(int x0, int y0, int x1, int y1) {
+  int dx0, dx1, dx, dy0, dy1, dy;
+
+  dx0 = abs(x0 - x1);
+  dx1 = size - dx0;
+  dx = dx0 < dx1 ? dx0 : dx1;
+  dy0 = abs(y0 - y1);
+  dy1 = size - dy0;
+  dy = dy0 < dy1 ? dy0 : dy1;
+  return dx * dx + dy * dy;
+}
+
+// Algorithm taken from:
+// Victor Ostromoukhov and Roger D. Hersch, "Stochastic Clustered-Dot
+// Dithering" in Color Imaging: Device-Independent Color, Color
+// Hardcopy, and Graphic Arts IV, SPIE Vol. 3648, pp. 496-505, 1999.
+void SplashScreen::buildSCDMatrix(int r) {
+  SplashScreenPoint *dots, *pts;
+  int dotsLen, dotsSize;
+  char *tmpl;
+  char *grid;
+  int *region, *dist;
+  int x, y, xx, yy, x0, x1, y0, y1, i, j, d, iMin, dMin, n;
+
+  //~ this should probably happen somewhere else
+  srand(123);
+
+  // generate the random space-filling curve
+  pts = (SplashScreenPoint *)gmallocn(size * size, sizeof(SplashScreenPoint));
+  i = 0;
+  for (y = 0; y < size; ++y) {
+    for (x = 0; x < size; ++x) {
+      pts[i].x = x;
+      pts[i].y = y;
+      ++i;
+    }
+  }
+  for (i = 0; i < size * size; ++i) {
+    j = i + (int)((double)(size * size - i) *
+                 (double)rand() / ((double)RAND_MAX + 1.0));
+    x = pts[i].x;
+    y = pts[i].y;
+    pts[i].x = pts[j].x;
+    pts[i].y = pts[j].y;
+    pts[j].x = x;
+    pts[j].y = y;
+  }
+
+  // construct the circle template
+  tmpl = (char *)gmallocn((r+1)*(r+1), sizeof(char));
+  for (y = 0; y <= r; ++y) {
+    for (x = 0; x <= r; ++x) {
+      tmpl[y*(r+1) + x] = (x * y <= r * r) ? 1 : 0;
+    }
+  }
+
+  // mark all grid cells as free
+  grid = (char *)gmallocn(size * size, sizeof(char));
+  for (y = 0; y < size; ++y) {
+    for (x = 0; x < size; ++x) {
+      grid[(y << log2Size) + x] = 0;
+    }
+  }
+
+  // walk the space-filling curve, adding dots
+  dotsLen = 0;
+  dotsSize = 32;
+  dots = (SplashScreenPoint *)gmallocn(dotsSize, sizeof(SplashScreenPoint));
+  for (i = 0; i < size * size; ++i) {
+    x = pts[i].x;
+    y = pts[i].y;
+    if (!grid[(y << log2Size) + x]) {
+      if (dotsLen == dotsSize) {
+       dotsSize *= 2;
+       dots = (SplashScreenPoint *)greallocn(dots, dotsSize,
+                                             sizeof(SplashScreenPoint));
+      }
+      dots[dotsLen++] = pts[i];
+      for (yy = 0; yy <= r; ++yy) {
+       y0 = (y + yy) % size;
+       y1 = (y - yy + size) % size;
+       for (xx = 0; xx <= r; ++xx) {
+         if (tmpl[yy*(r+1) + xx]) {
+           x0 = (x + xx) % size;
+           x1 = (x - xx + size) % size;
+           grid[(y0 << log2Size) + x0] = 1;
+           grid[(y0 << log2Size) + x1] = 1;
+           grid[(y1 << log2Size) + x0] = 1;
+           grid[(y1 << log2Size) + x1] = 1;
+         }
+       }
+      }
+    }
+  }
+
+  gfree(tmpl);
+  gfree(grid);
+
+  // assign each cell to a dot, compute distance to center of dot
+  region = (int *)gmallocn(size * size, sizeof(int));
+  dist = (int *)gmallocn(size * size, sizeof(int));
+  for (y = 0; y < size; ++y) {
+    for (x = 0; x < size; ++x) {
+      iMin = 0;
+      dMin = distance(dots[0].x, dots[0].y, x, y);
+      for (i = 1; i < dotsLen; ++i) {
+       d = distance(dots[i].x, dots[i].y, x, y);
+       if (d < dMin) {
+         iMin = i;
+         dMin = d;
+       }
+      }
+      region[(y << log2Size) + x] = iMin;
+      dist[(y << log2Size) + x] = dMin;
+    }
+  }
+
+  // compute threshold values
+  for (i = 0; i < dotsLen; ++i) {
+    n = 0;
+    for (y = 0; y < size; ++y) {
+      for (x = 0; x < size; ++x) {
+       if (region[(y << log2Size) + x] == i) {
+         pts[n].x = x;
+         pts[n].y = y;
+         pts[n].dist = distance(dots[i].x, dots[i].y, x, y);
+         ++n;
+       }
+      }
+    }
+    std::sort(pts, pts + n, cmpDistancesFunctor());
+    for (j = 0; j < n; ++j) {
+      // map values in [0 .. n-1] --> [255 .. 1]
+      mat[(pts[j].y << log2Size) + pts[j].x] = 255 - (254 * j) / (n - 1);
+    }
+  }
+
+  gfree(pts);
+  gfree(region);
+  gfree(dist);
+
+  gfree(dots);
+}
+
+SplashScreen::SplashScreen(SplashScreen *screen) {
+  screenParams = screen->screenParams;
+  size = screen->size;
+  sizeM1 = screen->sizeM1;
+  log2Size = screen->log2Size;
+  mat = (Guchar *)gmallocn(size * size, sizeof(Guchar));
+  memcpy(mat, screen->mat, size * size * sizeof(Guchar));
+  minVal = screen->minVal;
+  maxVal = screen->maxVal;
+}
+
+SplashScreen::~SplashScreen() {
+  gfree(mat);
+}
diff --git a/splash/SplashScreen.h b/splash/SplashScreen.h
new file mode 100644 (file)
index 0000000..a7fc455
--- /dev/null
@@ -0,0 +1,80 @@
+//========================================================================
+//
+// SplashScreen.h
+//
+//========================================================================
+
+//========================================================================
+//
+// Modified under the Poppler project - http://poppler.freedesktop.org
+//
+// All changes made under the Poppler project to this file are licensed
+// under GPL version 2 or later
+//
+// Copyright (C) 2009 Albert Astals Cid <aacid@kde.org>
+//
+// To see a description of the changes please see the Changelog file that
+// came with your tarball or type make ChangeLog if you are building from git
+//
+//========================================================================
+
+#ifndef SPLASHSCREEN_H
+#define SPLASHSCREEN_H
+
+#ifdef USE_GCC_PRAGMAS
+#pragma interface
+#endif
+
+#include "SplashTypes.h"
+
+#include <stdlib.h>
+
+//------------------------------------------------------------------------
+// SplashScreen
+//------------------------------------------------------------------------
+
+class SplashScreen {
+public:
+
+  SplashScreen(SplashScreenParams *params);
+  SplashScreen(SplashScreen *screen);
+  ~SplashScreen();
+
+  SplashScreen *copy() { return new SplashScreen(this); }
+
+  // Return the computed pixel value (0=black, 1=white) for the gray
+  // level <value> at (<x>, <y>).
+  int test(int x, int y, Guchar value) {
+    int xx, yy;
+    if (mat == NULL) createMatrix();
+    xx = x & sizeM1;
+    yy = y & sizeM1;
+    return value < mat[(yy << log2Size) + xx] ? 0 : 1;
+  }
+
+  // Returns true if value is above the white threshold or below the
+  // black threshold, i.e., if the corresponding halftone will be
+  // solid white or black.
+  GBool isStatic(Guchar value) { if (mat == NULL) createMatrix(); return value < minVal || value >= maxVal; }
+
+private:
+  void createMatrix();
+
+  void buildDispersedMatrix(int i, int j, int val,
+                           int delta, int offset);
+  void buildClusteredMatrix();
+  int distance(int x0, int y0, int x1, int y1);
+  void buildSCDMatrix(int r);
+
+  SplashScreenParams *screenParams;    // params to create the other members
+  Guchar *mat;                 // threshold matrix
+  int size;                    // size of the threshold matrix
+  int sizeM1;                  // size - 1
+  int log2Size;                        // log2(size)
+  Guchar minVal;               // any pixel value below minVal generates
+                               //   solid black
+  Guchar maxVal;               // any pixel value above maxVal generates
+                               //   solid white
+};
+
+#endif
diff --git a/splash/SplashState.cc b/splash/SplashState.cc
new file mode 100644 (file)
index 0000000..e258f66
--- /dev/null
@@ -0,0 +1,243 @@
+//========================================================================
+//
+// SplashState.cc
+//
+//========================================================================
+
+//========================================================================
+//
+// Modified under the Poppler project - http://poppler.freedesktop.org
+//
+// All changes made under the Poppler project to this file are licensed
+// under GPL version 2 or later
+//
+// Copyright (C) 2009, 2011, 2012 Thomas Freitag <Thomas.Freitag@alfa.de>
+//
+// To see a description of the changes please see the Changelog file that
+// came with your tarball or type make ChangeLog if you are building from git
+//
+//========================================================================
+
+#include <config.h>
+
+#ifdef USE_GCC_PRAGMAS
+#pragma implementation
+#endif
+
+#include <string.h>
+#include "goo/gmem.h"
+#include "SplashPattern.h"
+#include "SplashScreen.h"
+#include "SplashClip.h"
+#include "SplashBitmap.h"
+#include "SplashState.h"
+
+//------------------------------------------------------------------------
+// SplashState
+//------------------------------------------------------------------------
+
+// number of components in each color mode
+int splashColorModeNComps[] = {
+  1, 1, 3, 3, 4
+#if SPLASH_CMYK
+  ,4
+#endif
+};
+
+SplashState::SplashState(int width, int height, GBool vectorAntialias,
+                        SplashScreenParams *screenParams) {
+  SplashColor color;
+  int i;
+
+  matrix[0] = 1;  matrix[1] = 0;
+  matrix[2] = 0;  matrix[3] = 1;
+  matrix[4] = 0;  matrix[5] = 0;
+  memset(&color, 0, sizeof(SplashColor));
+  strokePattern = new SplashSolidColor(color);
+  fillPattern = new SplashSolidColor(color);
+  screen = new SplashScreen(screenParams);
+  blendFunc = NULL;
+  strokeAlpha = 1;
+  fillAlpha = 1;
+  lineWidth = 0;
+  lineCap = splashLineCapButt;
+  lineJoin = splashLineJoinMiter;
+  miterLimit = 10;
+  flatness = 1;
+  lineDash = NULL;
+  lineDashLength = 0;
+  lineDashPhase = 0;
+  strokeAdjust = gFalse;
+  clip = new SplashClip(0, 0, width - 0.001, height - 0.001, vectorAntialias);
+  softMask = NULL;
+  deleteSoftMask = gFalse;
+  inNonIsolatedGroup = gFalse;
+  fillOverprint = gFalse;
+  strokeOverprint = gFalse;
+  overprintMode = 0;     
+  for (i = 0; i < 256; ++i) {
+    rgbTransferR[i] = (Guchar)i;
+    rgbTransferG[i] = (Guchar)i;
+    rgbTransferB[i] = (Guchar)i;
+    grayTransfer[i] = (Guchar)i;
+    cmykTransferC[i] = (Guchar)i;
+    cmykTransferM[i] = (Guchar)i;
+    cmykTransferY[i] = (Guchar)i;
+    cmykTransferK[i] = (Guchar)i;
+  }
+  overprintMask = 0xffffffff;
+  overprintAdditive = gFalse;
+  next = NULL;
+}
+
+SplashState::SplashState(int width, int height, GBool vectorAntialias,
+                        SplashScreen *screenA) {
+  SplashColor color;
+  int i;
+
+  matrix[0] = 1;  matrix[1] = 0;
+  matrix[2] = 0;  matrix[3] = 1;
+  matrix[4] = 0;  matrix[5] = 0;
+  memset(&color, 0, sizeof(SplashColor));
+  strokePattern = new SplashSolidColor(color);
+  fillPattern = new SplashSolidColor(color);
+  screen = screenA->copy();
+  blendFunc = NULL;
+  strokeAlpha = 1;
+  fillAlpha = 1;
+  lineWidth = 0;
+  lineCap = splashLineCapButt;
+  lineJoin = splashLineJoinMiter;
+  miterLimit = 10;
+  flatness = 1;
+  lineDash = NULL;
+  lineDashLength = 0;
+  lineDashPhase = 0;
+  strokeAdjust = gFalse;
+  clip = new SplashClip(0, 0, width - 0.001, height - 0.001, vectorAntialias);
+  softMask = NULL;
+  deleteSoftMask = gFalse;
+  inNonIsolatedGroup = gFalse;
+  fillOverprint = gFalse;
+  strokeOverprint = gFalse;
+  overprintMode = 0;     
+  for (i = 0; i < 256; ++i) {
+    rgbTransferR[i] = (Guchar)i;
+    rgbTransferG[i] = (Guchar)i;
+    rgbTransferB[i] = (Guchar)i;
+    grayTransfer[i] = (Guchar)i;
+    cmykTransferC[i] = (Guchar)i;
+    cmykTransferM[i] = (Guchar)i;
+    cmykTransferY[i] = (Guchar)i;
+    cmykTransferK[i] = (Guchar)i;
+  }
+  overprintMask = 0xffffffff;
+  overprintAdditive = gFalse;
+  next = NULL;
+}
+
+SplashState::SplashState(SplashState *state) {
+  memcpy(matrix, state->matrix, 6 * sizeof(SplashCoord));
+  strokePattern = state->strokePattern->copy();
+  fillPattern = state->fillPattern->copy();
+  screen = state->screen->copy();
+  blendFunc = state->blendFunc;
+  strokeAlpha = state->strokeAlpha;
+  fillAlpha = state->fillAlpha;
+  lineWidth = state->lineWidth;
+  lineCap = state->lineCap;
+  lineJoin = state->lineJoin;
+  miterLimit = state->miterLimit;
+  flatness = state->flatness;
+  if (state->lineDash) {
+    lineDashLength = state->lineDashLength;
+    lineDash = (SplashCoord *)gmallocn(lineDashLength, sizeof(SplashCoord));
+    memcpy(lineDash, state->lineDash, lineDashLength * sizeof(SplashCoord));
+  } else {
+    lineDash = NULL;
+    lineDashLength = 0;
+  }
+  lineDashPhase = state->lineDashPhase;
+  strokeAdjust = state->strokeAdjust;
+  clip = state->clip->copy();
+  softMask = state->softMask;
+  deleteSoftMask = gFalse;
+  inNonIsolatedGroup = state->inNonIsolatedGroup;
+  fillOverprint = state->fillOverprint;
+  strokeOverprint = state->strokeOverprint;
+  overprintMode = state->overprintMode;          
+  memcpy(rgbTransferR, state->rgbTransferR, 256);
+  memcpy(rgbTransferG, state->rgbTransferG, 256);
+  memcpy(rgbTransferB, state->rgbTransferB, 256);
+  memcpy(grayTransfer, state->grayTransfer, 256);
+  memcpy(cmykTransferC, state->cmykTransferC, 256);
+  memcpy(cmykTransferM, state->cmykTransferM, 256);
+  memcpy(cmykTransferY, state->cmykTransferY, 256);
+  memcpy(cmykTransferK, state->cmykTransferK, 256);
+  overprintMask = state->overprintMask;
+  overprintAdditive = state->overprintAdditive;
+  next = NULL;
+}
+
+SplashState::~SplashState() {
+  delete strokePattern;
+  delete fillPattern;
+  delete screen;
+  gfree(lineDash);
+  delete clip;
+  if (deleteSoftMask && softMask) {
+    delete softMask;
+  }
+}
+
+void SplashState::setStrokePattern(SplashPattern *strokePatternA) {
+  delete strokePattern;
+  strokePattern = strokePatternA;
+}
+
+void SplashState::setFillPattern(SplashPattern *fillPatternA) {
+  delete fillPattern;
+  fillPattern = fillPatternA;
+}
+
+void SplashState::setScreen(SplashScreen *screenA) {
+  delete screen;
+  screen = screenA;
+}
+
+void SplashState::setLineDash(SplashCoord *lineDashA, int lineDashLengthA,
+                             SplashCoord lineDashPhaseA) {
+  gfree(lineDash);
+  lineDashLength = lineDashLengthA;
+  if (lineDashLength > 0) {
+    lineDash = (SplashCoord *)gmallocn(lineDashLength, sizeof(SplashCoord));
+    memcpy(lineDash, lineDashA, lineDashLength * sizeof(SplashCoord));
+  } else {
+    lineDash = NULL;
+  }
+  lineDashPhase = lineDashPhaseA;
+}
+
+void SplashState::setSoftMask(SplashBitmap *softMaskA) {
+  if (deleteSoftMask) {
+    delete softMask;
+  }
+  softMask = softMaskA;
+  deleteSoftMask = gTrue;
+}
+
+void SplashState::setTransfer(Guchar *red, Guchar *green, Guchar *blue,
+                             Guchar *gray) {
+  int i;
+
+  memcpy(rgbTransferR, red, 256);
+  memcpy(rgbTransferG, green, 256);
+  memcpy(rgbTransferB, blue, 256);
+  memcpy(grayTransfer, gray, 256);
+  for (i = 0; i < 256; ++i) {
+    cmykTransferC[i] = 255 - rgbTransferR[255 - i];
+    cmykTransferM[i] = 255 - rgbTransferG[255 - i];
+    cmykTransferY[i] = 255 - rgbTransferB[255 - i];
+    cmykTransferK[i] = 255 - grayTransfer[255 - i];
+  }
+}
diff --git a/splash/SplashState.h b/splash/SplashState.h
new file mode 100644 (file)
index 0000000..01e7772
--- /dev/null
@@ -0,0 +1,136 @@
+//========================================================================\r
+//\r
+// SplashState.h\r
+//\r
+//========================================================================\r
+\r
+//========================================================================\r
+//\r
+// Modified under the Poppler project - http://poppler.freedesktop.org\r
+//\r
+// All changes made under the Poppler project to this file are licensed\r
+// under GPL version 2 or later\r
+//\r
+// Copyright (C) 2011, 2012 Thomas Freitag <Thomas.Freitag@alfa.de>\r
+//\r
+// To see a description of the changes please see the Changelog file that\r
+// came with your tarball or type make ChangeLog if you are building from git\r
+//\r
+//========================================================================\r
+\r
+#ifndef SPLASHSTATE_H\r
+#define SPLASHSTATE_H\r
+\r
+#ifdef USE_GCC_PRAGMAS\r
+#pragma interface\r
+#endif\r
+\r
+#include "SplashTypes.h"\r
+\r
+class SplashPattern;\r
+class SplashScreen;\r
+class SplashClip;\r
+class SplashBitmap;\r
+\r
+//------------------------------------------------------------------------\r
+// line cap values\r
+//------------------------------------------------------------------------\r
+\r
+#define splashLineCapButt       0\r
+#define splashLineCapRound      1\r
+#define splashLineCapProjecting 2\r
+\r
+//------------------------------------------------------------------------\r
+// line join values\r
+//------------------------------------------------------------------------\r
+\r
+#define splashLineJoinMiter     0\r
+#define splashLineJoinRound     1\r
+#define splashLineJoinBevel     2\r
+\r
+//------------------------------------------------------------------------\r
+// SplashState\r
+//------------------------------------------------------------------------\r
+\r
+class SplashState {\r
+public:\r
+\r
+  // Create a new state object, initialized with default settings.\r
+  SplashState(int width, int height, GBool vectorAntialias,\r
+             SplashScreenParams *screenParams);\r
+  SplashState(int width, int height, GBool vectorAntialias,\r
+             SplashScreen *screenA);\r
+\r
+  // Copy a state object.\r
+  SplashState *copy() { return new SplashState(this); }\r
+\r
+  ~SplashState();\r
+\r
+  // Set the stroke pattern.  This does not copy <strokePatternA>.\r
+  void setStrokePattern(SplashPattern *strokePatternA);\r
+\r
+  // Set the fill pattern.  This does not copy <fillPatternA>.\r
+  void setFillPattern(SplashPattern *fillPatternA);\r
+\r
+  // Set the screen.  This does not copy <screenA>.\r
+  void setScreen(SplashScreen *screenA);\r
+\r
+  // Set the line dash pattern.  This copies the <lineDashA> array.\r
+  void setLineDash(SplashCoord *lineDashA, int lineDashLengthA,\r
+                  SplashCoord lineDashPhaseA);\r
+\r
+  // Set the soft mask bitmap.\r
+  void setSoftMask(SplashBitmap *softMaskA);\r
+\r
+  // Set the overprint parametes.\r
+  void setFillOverprint(GBool fillOverprintA) { fillOverprint = fillOverprintA; }\r
+  void setStrokeOverprint(GBool strokeOverprintA) { strokeOverprint = strokeOverprintA; }\r
+  void setOverprintMode(int overprintModeA) { overprintMode = overprintModeA; }\r
+\r
+  // Set the transfer function.\r
+  void setTransfer(Guchar *red, Guchar *green, Guchar *blue, Guchar *gray);\r
+\r
+private:\r
+\r
+  SplashState(SplashState *state);\r
+\r
+  SplashCoord matrix[6];\r
+  SplashPattern *strokePattern;\r
+  SplashPattern *fillPattern;\r
+  SplashScreen *screen;\r
+  SplashBlendFunc blendFunc;\r
+  SplashCoord strokeAlpha;\r
+  SplashCoord fillAlpha;\r
+  SplashCoord lineWidth;\r
+  int lineCap;\r
+  int lineJoin;\r
+  SplashCoord miterLimit;\r
+  SplashCoord flatness;\r
+  SplashCoord *lineDash;\r
+  int lineDashLength;\r
+  SplashCoord lineDashPhase;\r
+  GBool strokeAdjust;\r
+  SplashClip *clip;\r
+  SplashBitmap *softMask;\r
+  GBool deleteSoftMask;\r
+  GBool inNonIsolatedGroup;\r
+  GBool fillOverprint;\r
+  GBool strokeOverprint;\r
+  int overprintMode;\r
+  Guchar rgbTransferR[256],\r
+         rgbTransferG[256],\r
+         rgbTransferB[256];\r
+  Guchar grayTransfer[256];\r
+  Guchar cmykTransferC[256],\r
+         cmykTransferM[256],\r
+         cmykTransferY[256],\r
+         cmykTransferK[256];\r
+  Guint overprintMask;\r
+  GBool overprintAdditive;\r
+\r
+  SplashState *next;           // used by Splash class\r
+\r
+  friend class Splash;\r
+};\r
+\r
+#endif\r
diff --git a/splash/SplashT1Font.cc b/splash/SplashT1Font.cc
new file mode 100644 (file)
index 0000000..0fdfaaf
--- /dev/null
@@ -0,0 +1,309 @@
+//========================================================================
+//
+// SplashT1Font.cc
+//
+//========================================================================
+
+//========================================================================
+//
+// Modified under the Poppler project - http://poppler.freedesktop.org
+//
+// All changes made under the Poppler project to this file are licensed
+// under GPL version 2 or later
+//
+// Copyright (C) 2007 Albert Astals Cid <aacid@kde.org>
+//
+// To see a description of the changes please see the Changelog file that
+// came with your tarball or type make ChangeLog if you are building from git
+//
+//========================================================================
+
+#include <config.h>
+
+#if HAVE_T1LIB_H
+
+#ifdef USE_GCC_PRAGMAS
+#pragma implementation
+#endif
+
+#include <stdlib.h>
+#include <t1lib.h>
+#include "goo/gmem.h"
+#include "SplashMath.h"
+#include "SplashGlyphBitmap.h"
+#include "SplashPath.h"
+#include "SplashT1FontEngine.h"
+#include "SplashT1FontFile.h"
+#include "SplashT1Font.h"
+
+//------------------------------------------------------------------------
+
+static Guchar bitReverse[256] = {
+  0x00, 0x80, 0x40, 0xc0, 0x20, 0xa0, 0x60, 0xe0,
+  0x10, 0x90, 0x50, 0xd0, 0x30, 0xb0, 0x70, 0xf0,
+  0x08, 0x88, 0x48, 0xc8, 0x28, 0xa8, 0x68, 0xe8,
+  0x18, 0x98, 0x58, 0xd8, 0x38, 0xb8, 0x78, 0xf8,
+  0x04, 0x84, 0x44, 0xc4, 0x24, 0xa4, 0x64, 0xe4,
+  0x14, 0x94, 0x54, 0xd4, 0x34, 0xb4, 0x74, 0xf4,
+  0x0c, 0x8c, 0x4c, 0xcc, 0x2c, 0xac, 0x6c, 0xec,
+  0x1c, 0x9c, 0x5c, 0xdc, 0x3c, 0xbc, 0x7c, 0xfc,
+  0x02, 0x82, 0x42, 0xc2, 0x22, 0xa2, 0x62, 0xe2,
+  0x12, 0x92, 0x52, 0xd2, 0x32, 0xb2, 0x72, 0xf2,
+  0x0a, 0x8a, 0x4a, 0xca, 0x2a, 0xaa, 0x6a, 0xea,
+  0x1a, 0x9a, 0x5a, 0xda, 0x3a, 0xba, 0x7a, 0xfa,
+  0x06, 0x86, 0x46, 0xc6, 0x26, 0xa6, 0x66, 0xe6,
+  0x16, 0x96, 0x56, 0xd6, 0x36, 0xb6, 0x76, 0xf6,
+  0x0e, 0x8e, 0x4e, 0xce, 0x2e, 0xae, 0x6e, 0xee,
+  0x1e, 0x9e, 0x5e, 0xde, 0x3e, 0xbe, 0x7e, 0xfe,
+  0x01, 0x81, 0x41, 0xc1, 0x21, 0xa1, 0x61, 0xe1,
+  0x11, 0x91, 0x51, 0xd1, 0x31, 0xb1, 0x71, 0xf1,
+  0x09, 0x89, 0x49, 0xc9, 0x29, 0xa9, 0x69, 0xe9,
+  0x19, 0x99, 0x59, 0xd9, 0x39, 0xb9, 0x79, 0xf9,
+  0x05, 0x85, 0x45, 0xc5, 0x25, 0xa5, 0x65, 0xe5,
+  0x15, 0x95, 0x55, 0xd5, 0x35, 0xb5, 0x75, 0xf5,
+  0x0d, 0x8d, 0x4d, 0xcd, 0x2d, 0xad, 0x6d, 0xed,
+  0x1d, 0x9d, 0x5d, 0xdd, 0x3d, 0xbd, 0x7d, 0xfd,
+  0x03, 0x83, 0x43, 0xc3, 0x23, 0xa3, 0x63, 0xe3,
+  0x13, 0x93, 0x53, 0xd3, 0x33, 0xb3, 0x73, 0xf3,
+  0x0b, 0x8b, 0x4b, 0xcb, 0x2b, 0xab, 0x6b, 0xeb,
+  0x1b, 0x9b, 0x5b, 0xdb, 0x3b, 0xbb, 0x7b, 0xfb,
+  0x07, 0x87, 0x47, 0xc7, 0x27, 0xa7, 0x67, 0xe7,
+  0x17, 0x97, 0x57, 0xd7, 0x37, 0xb7, 0x77, 0xf7,
+  0x0f, 0x8f, 0x4f, 0xcf, 0x2f, 0xaf, 0x6f, 0xef,
+  0x1f, 0x9f, 0x5f, 0xdf, 0x3f, 0xbf, 0x7f, 0xff
+};
+
+//------------------------------------------------------------------------
+// SplashT1Font
+//------------------------------------------------------------------------
+
+SplashT1Font::SplashT1Font(SplashT1FontFile *fontFileA, SplashCoord *matA,
+                          SplashCoord *textMatA):
+  SplashFont(fontFileA, matA, textMatA, fontFileA->engine->aa)
+{
+  T1_TMATRIX matrix;
+  BBox bbox;
+  SplashCoord bbx0, bby0, bbx1, bby1;
+  int x, y;
+
+  t1libID = T1_CopyFont(fontFileA->t1libID);
+  outlineID = -1;
+
+  // compute font size
+  size = (float)splashDist(0, 0, mat[2], mat[3]);
+
+  // transform the four corners of the font bounding box -- the min
+  // and max values form the bounding box of the transformed font
+  bbox = T1_GetFontBBox(t1libID);
+  bbx0 = 0.001 * bbox.llx;
+  bby0 = 0.001 * bbox.lly;
+  bbx1 = 0.001 * bbox.urx;
+  bby1 = 0.001 * bbox.ury;
+  // some fonts are completely broken, so we fake it (with values
+  // large enough that most glyphs should fit)
+  if (bbx0 == 0 && bby0 == 0 && bbx1 == 0 && bby1 == 0) {
+    bbx0 = bby0 = -0.5;
+    bbx1 = bby1 = 1.5;
+  }
+  x = (int)(mat[0] * bbx0 + mat[2] * bby0);
+  xMin = xMax = x;
+  y = (int)(mat[1] * bbx0 + mat[3] * bby0);
+  yMin = yMax = y;
+  x = (int)(mat[0] * bbx0 + mat[2] * bby1);
+  if (x < xMin) {
+    xMin = x;
+  } else if (x > xMax) {
+    xMax = x;
+  }
+  y = (int)(mat[1] * bbx0 + mat[3] * bby1);
+  if (y < yMin) {
+    yMin = y;
+  } else if (y > yMax) {
+    yMax = y;
+  }
+  x = (int)(mat[0] * bbx1 + mat[2] * bby0);
+  if (x < xMin) {
+    xMin = x;
+  } else if (x > xMax) {
+    xMax = x;
+  }
+  y = (int)(mat[1] * bbx1 + mat[3] * bby0);
+  if (y < yMin) {
+    yMin = y;
+  } else if (y > yMax) {
+    yMax = y;
+  }
+  x = (int)(mat[0] * bbx1 + mat[2] * bby1);
+  if (x < xMin) {
+    xMin = x;
+  } else if (x > xMax) {
+    xMax = x;
+  }
+  y = (int)(mat[1] * bbx1 + mat[3] * bby1);
+  if (y < yMin) {
+    yMin = y;
+  } else if (y > yMax) {
+    yMax = y;
+  }
+  // This is a kludge: some buggy PDF generators embed fonts with
+  // zero bounding boxes.
+  if (xMax == xMin) {
+    xMin = 0;
+    xMax = (int)size;
+  }
+  if (yMax == yMin) {
+    yMin = 0;
+    yMax = (int)(1.2 * size);
+  }
+  // Another kludge: an unusually large xMin or yMin coordinate is
+  // probably wrong.
+  if (xMin > 0) {
+    xMin = 0;
+  }
+  if (yMin > 0) {
+    yMin = 0;
+  }
+  // Another kludge: t1lib doesn't correctly handle fonts with
+  // real (non-integer) bounding box coordinates.
+  if (xMax - xMin > 5000) {
+    xMin = 0;
+    xMax = (int)size;
+  }
+  if (yMax - yMin > 5000) {
+    yMin = 0;
+    yMax = (int)(1.2 * size);
+  }
+
+  // transform the font
+  matrix.cxx = (double)mat[0] / size;
+  matrix.cxy = (double)mat[1] / size;
+  matrix.cyx = (double)mat[2] / size;
+  matrix.cyy = (double)mat[3] / size;
+  T1_TransformFont(t1libID, &matrix);
+}
+
+SplashT1Font::~SplashT1Font() {
+  T1_DeleteFont(t1libID);
+  if (outlineID >= 0) {
+    T1_DeleteFont(outlineID);
+  }
+}
+
+GBool SplashT1Font::getGlyph(int c, int xFrac, int yFrac,
+                            SplashGlyphBitmap *bitmap, int x0, int y0, SplashClip *clip, SplashClipResult *clipRes) {
+  return SplashFont::getGlyph(c, 0, 0, bitmap, x0, y0, clip, clipRes);
+}
+
+GBool SplashT1Font::makeGlyph(int c, int xFrac, int yFrac,
+                             SplashGlyphBitmap *bitmap, int x0, int y0, SplashClip *clip, SplashClipResult *clipRes) {
+  GLYPH *glyph;
+  int n, i;
+
+  if (aa) {
+    glyph = T1_AASetChar(t1libID, c, size, NULL);
+  } else {
+    glyph = T1_SetChar(t1libID, c, size, NULL);
+  }
+  if (!glyph) {
+    return gFalse;
+  }
+
+  bitmap->x = -glyph->metrics.leftSideBearing;
+  bitmap->y = glyph->metrics.ascent;
+  bitmap->w = glyph->metrics.rightSideBearing - glyph->metrics.leftSideBearing;
+  bitmap->h = glyph->metrics.ascent - glyph->metrics.descent;
+  bitmap->aa = aa;
+  if (aa) {
+    bitmap->data = (Guchar *)glyph->bits;
+    bitmap->freeData = gFalse;
+  } else {
+    n = bitmap->h * ((bitmap->w + 7) >> 3);
+    bitmap->data = (Guchar *)gmalloc(n);
+    for (i = 0; i < n; ++i) {
+      bitmap->data[i] = bitReverse[glyph->bits[i] & 0xff];
+    }
+    bitmap->freeData = gTrue;
+  }
+
+  *clipRes = clip->testRect(x0 - bitmap->x,
+                            y0 - bitmap->y,
+                            x0 - bitmap->x + bitmap->w - 1,
+                            y0 - bitmap->y + bitmap->h - 1);
+
+  return gTrue;
+}
+
+SplashPath *SplashT1Font::getGlyphPath(int c) {
+  T1_TMATRIX matrix;
+  SplashPath *path;
+  T1_OUTLINE *outline;
+  T1_PATHSEGMENT *seg;
+  T1_BEZIERSEGMENT *bez;
+  int x, y, x1, y1;
+  GBool needClose;
+
+  if (outlineID < 0) {
+    outlineID = T1_CopyFont(((SplashT1FontFile *)fontFile)->t1libID);
+    outlineSize = (float)splashDist(0, 0, textMat[2], textMat[3]);
+    matrix.cxx = (double)textMat[0] / outlineSize;
+    matrix.cxy = (double)textMat[1] / outlineSize;
+    matrix.cyx = (double)textMat[2] / outlineSize;
+    matrix.cyy = (double)textMat[3] / outlineSize;
+    // t1lib doesn't seem to handle small sizes correctly here, so set
+    // the size to 1000, and scale the resulting coordinates later
+    outlineMul = (float)(outlineSize / 65536000.0);
+    outlineSize = 1000;
+    T1_TransformFont(outlineID, &matrix);
+  }
+
+  path = new SplashPath();
+  if ((outline = T1_GetCharOutline(outlineID, c, outlineSize, NULL))) {
+    // NB: t1lib uses integer coordinates here; we keep a running
+    // (x,y) total as integers, so that the final point in the path is
+    // exactly the same as the first point, thus avoiding weird
+    // mitered join glitches
+    x = y = 0;
+    needClose = gFalse;
+    for (seg = outline; seg; seg = seg->link) {
+      switch (seg->type) {
+      case T1_PATHTYPE_MOVE:
+       if (needClose) {
+         path->close();
+         needClose = gFalse;
+       }
+       x += seg->dest.x;
+       y += seg->dest.y;
+       path->moveTo(outlineMul * x, -outlineMul * y);
+       break;
+      case T1_PATHTYPE_LINE:
+       x += seg->dest.x;
+       y += seg->dest.y;
+       path->lineTo(outlineMul * x, -outlineMul * y);
+       needClose = gTrue;
+       break;
+      case T1_PATHTYPE_BEZIER:
+       bez = (T1_BEZIERSEGMENT *)seg;
+       x1 = x + bez->dest.x;
+       y1 = y + bez->dest.y;
+       path->curveTo(outlineMul * (x + bez->B.x),
+                     -outlineMul * (y + bez->B.y),
+                     outlineMul * (x + bez->C.x),
+                     -outlineMul * (y + bez->C.y),
+                     outlineMul * x1,
+                     -outlineMul * y1);
+       x = x1;
+       y = y1;
+       needClose = gTrue;
+       break;
+      }
+    }
+    if (needClose) {
+      path->close();
+    }
+    T1_FreeOutline(outline);
+  }
+
+  return path;
+}
+
+#endif // HAVE_T1LIB_H
diff --git a/splash/SplashT1Font.h b/splash/SplashT1Font.h
new file mode 100644 (file)
index 0000000..1dbe66c
--- /dev/null
@@ -0,0 +1,69 @@
+//========================================================================
+//
+// SplashT1Font.h
+//
+//========================================================================
+
+//========================================================================
+//
+// Modified under the Poppler project - http://poppler.freedesktop.org
+//
+// All changes made under the Poppler project to this file are licensed
+// under GPL version 2 or later
+//
+// Copyright (C) 2007 Albert Astals Cid <aacid@kde.org>
+//
+// To see a description of the changes please see the Changelog file that
+// came with your tarball or type make ChangeLog if you are building from git
+//
+//========================================================================
+
+#ifndef SPLASHT1FONT_H
+#define SPLASHT1FONT_H
+
+#if HAVE_T1LIB_H
+
+#ifdef USE_GCC_PRAGMAS
+#pragma interface
+#endif
+
+#include "SplashFont.h"
+
+class SplashT1FontFile;
+
+//------------------------------------------------------------------------
+// SplashT1Font
+//------------------------------------------------------------------------
+
+class SplashT1Font: public SplashFont {
+public:
+
+  SplashT1Font(SplashT1FontFile *fontFileA, SplashCoord *matA,
+              SplashCoord *textMatA);
+
+  virtual ~SplashT1Font();
+
+  // Munge xFrac and yFrac before calling SplashFont::getGlyph.
+  virtual GBool getGlyph(int c, int xFrac, int yFrac,
+                        SplashGlyphBitmap *bitmap, int x0, int y0, SplashClip *clip, SplashClipResult *clipRes);
+
+  // Rasterize a glyph.  The <xFrac> and <yFrac> values are the same
+  // as described for getGlyph.
+  virtual GBool makeGlyph(int c, int xFrac, int yFrac,
+                         SplashGlyphBitmap *bitmap, int x0, int y0, SplashClip *clip, SplashClipResult *clipRes);
+
+  // Return the path for a glyph.
+  virtual SplashPath *getGlyphPath(int c);
+
+private:
+
+  int t1libID;                 // t1lib font ID
+  int outlineID;               // t1lib font ID for glyph outlines
+  float size;
+  float outlineSize;           // size for glyph outlines
+  float outlineMul;
+};
+
+#endif // HAVE_T1LIB_H
+
+#endif
diff --git a/splash/SplashT1FontEngine.cc b/splash/SplashT1FontEngine.cc
new file mode 100644 (file)
index 0000000..fb4b38d
--- /dev/null
@@ -0,0 +1,138 @@
+//========================================================================
+//
+// SplashT1FontEngine.cc
+//
+//========================================================================
+
+//========================================================================
+//
+// Modified under the Poppler project - http://poppler.freedesktop.org
+//
+// All changes made under the Poppler project to this file are licensed
+// under GPL version 2 or later
+//
+// Copyright (C) 2006 Takashi Iwai <tiwai@suse.de>
+// Copyright (C) 2009 Albert Astals Cid <aacid@kde.org>
+//
+// To see a description of the changes please see the Changelog file that
+// came with your tarball or type make ChangeLog if you are building from git
+//
+//========================================================================
+
+#include <config.h>
+
+#if HAVE_T1LIB_H
+
+#ifdef USE_GCC_PRAGMAS
+#pragma implementation
+#endif
+
+#include <stdlib.h>
+#include <stdio.h>
+#ifdef HAVE_UNISTD_H
+#  include <unistd.h>
+#endif
+#include <t1lib.h>
+#include "goo/GooString.h"
+#include "goo/gfile.h"
+#include "fofi/FoFiType1C.h"
+#include "SplashT1FontFile.h"
+#include "SplashT1FontEngine.h"
+
+#ifdef VMS
+#if (__VMS_VER < 70000000)
+extern "C" int unlink(char *filename);
+#endif
+#endif
+
+//------------------------------------------------------------------------
+
+int SplashT1FontEngine::t1libInitCount = 0;
+
+//------------------------------------------------------------------------
+
+static void fileWrite(void *stream, const char *data, int len) {
+  fwrite(data, 1, len, (FILE *)stream);
+}
+
+//------------------------------------------------------------------------
+// SplashT1FontEngine
+//------------------------------------------------------------------------
+
+SplashT1FontEngine::SplashT1FontEngine(GBool aaA) {
+  aa = aaA;
+}
+
+SplashT1FontEngine *SplashT1FontEngine::init(GBool aaA) {
+  // grayVals[i] = round(i * 255 / 16)
+  static unsigned long grayVals[17] = {
+    0, 16, 32, 48, 64, 80, 96, 112, 128, 143, 159, 175, 191, 207, 223, 239, 255
+  };
+
+  //~ for multithreading: need a mutex here
+  if (t1libInitCount == 0) {
+    T1_SetBitmapPad(8);
+    if (!T1_InitLib(NO_LOGFILE | IGNORE_CONFIGFILE | IGNORE_FONTDATABASE |
+                   T1_NO_AFM)) {
+      return NULL;
+    }
+    if (aaA) {
+      T1_AASetBitsPerPixel(8);
+      T1_AASetLevel(T1_AA_HIGH);
+      T1_AAHSetGrayValues(grayVals);
+    } else {
+      T1_AANSetGrayValues(0, 1);
+    }
+  }
+  ++t1libInitCount;
+
+  return new SplashT1FontEngine(aaA);
+}
+
+SplashT1FontEngine::~SplashT1FontEngine() {
+  //~ for multithreading: need a mutex here
+  if (--t1libInitCount == 0) {
+    T1_CloseLib();
+  }
+}
+
+SplashFontFile *SplashT1FontEngine::loadType1Font(SplashFontFileID *idA,
+                                                 SplashFontSrc *src,
+                                                 const char **enc) {
+  return SplashT1FontFile::loadType1Font(this, idA, src, enc);
+}
+
+SplashFontFile *SplashT1FontEngine::loadType1CFont(SplashFontFileID *idA,
+                                                  SplashFontSrc *src,
+                                                  const char **enc) {
+  FoFiType1C *ff;
+  GooString *tmpFileName;
+  FILE *tmpFile;
+  SplashFontFile *ret;
+
+  SplashFontSrc *newsrc;
+  
+  if (src->isFile)
+    ff = FoFiType1C::load(src->fileName->getCString());
+  else
+    ff = FoFiType1C::make(src->buf, src->bufLen);
+  if (! ff)
+    return NULL;
+
+  tmpFileName = NULL;
+  if (!openTempFile(&tmpFileName, &tmpFile, "wb")) {
+    delete ff;
+    return NULL;
+  }
+  ff->convertToType1(NULL, NULL, gTrue, &fileWrite, tmpFile);
+  delete ff;
+  fclose(tmpFile);
+  newsrc = new SplashFontSrc;
+  newsrc->setFile(tmpFileName, gTrue);
+  delete tmpFileName;
+  ret = SplashT1FontFile::loadType1Font(this, idA, newsrc, enc);
+  newsrc->unref();
+  return ret;
+}
+
+#endif // HAVE_T1LIB_H
diff --git a/splash/SplashT1FontEngine.h b/splash/SplashT1FontEngine.h
new file mode 100644 (file)
index 0000000..268a014
--- /dev/null
@@ -0,0 +1,50 @@
+//========================================================================
+//
+// SplashT1FontEngine.h
+//
+//========================================================================
+
+#ifndef SPLASHT1FONTENGINE_H
+#define SPLASHT1FONTENGINE_H
+
+#if HAVE_T1LIB_H
+
+#ifdef USE_GCC_PRAGMAS
+#pragma interface
+#endif
+
+#include "goo/gtypes.h"
+
+class SplashFontFile;
+class SplashFontFileID;
+class SplashFontSrc;
+
+//------------------------------------------------------------------------
+// SplashT1FontEngine
+//------------------------------------------------------------------------
+
+class SplashT1FontEngine {
+public:
+
+  static SplashT1FontEngine *init(GBool aaA);
+
+  ~SplashT1FontEngine();
+
+  // Load fonts.
+  SplashFontFile *loadType1Font(SplashFontFileID *idA, SplashFontSrc *src, const char **enc);
+  SplashFontFile *loadType1CFont(SplashFontFileID *idA, SplashFontSrc *src, const char **enc);
+
+private:
+
+  SplashT1FontEngine(GBool aaA);
+
+  static int t1libInitCount;
+  GBool aa;
+
+  friend class SplashT1FontFile;
+  friend class SplashT1Font;
+};
+
+#endif // HAVE_T1LIB_H
+
+#endif
diff --git a/splash/SplashT1FontFile.cc b/splash/SplashT1FontFile.cc
new file mode 100644 (file)
index 0000000..1832a91
--- /dev/null
@@ -0,0 +1,134 @@
+//========================================================================
+//
+// SplashT1FontFile.cc
+//
+//========================================================================
+
+//========================================================================
+//
+// Modified under the Poppler project - http://poppler.freedesktop.org
+//
+// All changes made under the Poppler project to this file are licensed
+// under GPL version 2 or later
+//
+// Copyright (C) 2006 Takashi Iwai <tiwai@suse.de>
+// Copyright (C) 2009 Albert Astals Cid <aacid@kde.org>
+//
+// To see a description of the changes please see the Changelog file that
+// came with your tarball or type make ChangeLog if you are building from git
+//
+//========================================================================
+
+#include <config.h>
+
+#if HAVE_T1LIB_H
+
+#ifdef USE_GCC_PRAGMAS
+#pragma implementation
+#endif
+
+#include <string.h>
+#include <t1lib.h>
+#include "goo/GooString.h"
+#include "goo/gfile.h"
+#include "goo/gmem.h"
+#include "SplashT1FontEngine.h"
+#include "SplashT1Font.h"
+#include "SplashT1FontFile.h"
+
+//------------------------------------------------------------------------
+// SplashT1FontFile
+//------------------------------------------------------------------------
+
+SplashFontFile *SplashT1FontFile::loadType1Font(SplashT1FontEngine *engineA,
+                                               SplashFontFileID *idA,
+                                               SplashFontSrc *src,
+                                               const char **encA) {
+  int t1libIDA;
+  const char **encTmp;
+  char *encStrTmp;
+  int encStrSize;
+  char *encPtr;
+  int i;
+
+  GooString *fileNameA;
+  SplashFontSrc *newsrc = NULL;
+  SplashFontFile *ff;
+
+  if (! src->isFile) {
+    GooString *tmpFileName;
+    FILE *tmpFile;
+    if (!openTempFile(&tmpFileName, &tmpFile, "wb"))
+      return NULL;
+    fwrite(src->buf, 1, src->bufLen, tmpFile);
+    fclose(tmpFile);
+    newsrc = new SplashFontSrc;
+    newsrc->setFile(tmpFileName, gTrue);
+    src = newsrc;
+    delete tmpFileName;
+  }
+  fileNameA = src->fileName;
+  // load the font file
+  if ((t1libIDA = T1_AddFont(fileNameA->getCString())) < 0) {
+    delete newsrc;
+    return NULL;
+  }
+  T1_LoadFont(t1libIDA);
+
+  // reencode it
+  encStrSize = 0;
+  for (i = 0; i < 256; ++i) {
+    if (encA[i]) {
+      encStrSize += strlen(encA[i]) + 1;
+    }
+  }
+  encTmp = (const char **)gmallocn(257, sizeof(char *));
+  encStrTmp = (char *)gmallocn(encStrSize, sizeof(char));
+  encPtr = encStrTmp;
+  for (i = 0; i < 256; ++i) {
+    if (encA[i]) {
+      strcpy(encPtr, encA[i]);
+      encTmp[i] = encPtr;
+      encPtr += strlen(encPtr) + 1;
+    } else {
+      encTmp[i] = ".notdef";
+    }
+  }
+  encTmp[256] = "custom";
+  T1_ReencodeFont(t1libIDA, (char **)encTmp);
+
+  ff = new SplashT1FontFile(engineA, idA, src,
+                             t1libIDA, encTmp, encStrTmp);
+  if (newsrc)
+    newsrc->unref();
+  return ff;
+}
+
+SplashT1FontFile::SplashT1FontFile(SplashT1FontEngine *engineA,
+                                  SplashFontFileID *idA,
+                                  SplashFontSrc *srcA,
+                                  int t1libIDA, const char **encA, char *encStrA):
+  SplashFontFile(idA, srcA)
+{
+  engine = engineA;
+  t1libID = t1libIDA;
+  enc = encA;
+  encStr = encStrA;
+}
+
+SplashT1FontFile::~SplashT1FontFile() {
+  gfree(encStr);
+  gfree(enc);
+  T1_DeleteFont(t1libID);
+}
+
+SplashFont *SplashT1FontFile::makeFont(SplashCoord *mat,
+                                      SplashCoord *textMat) {
+  SplashFont *font;
+
+  font = new SplashT1Font(this, mat, textMat);
+  font->initCache();
+  return font;
+}
+
+#endif // HAVE_T1LIB_H
diff --git a/splash/SplashT1FontFile.h b/splash/SplashT1FontFile.h
new file mode 100644 (file)
index 0000000..c094b6d
--- /dev/null
@@ -0,0 +1,70 @@
+//========================================================================
+//
+// SplashT1FontFile.h
+//
+//========================================================================
+
+//========================================================================
+//
+// Modified under the Poppler project - http://poppler.freedesktop.org
+//
+// All changes made under the Poppler project to this file are licensed
+// under GPL version 2 or later
+//
+// Copyright (C) 2006 Takashi Iwai <tiwai@suse.de>
+//
+// To see a description of the changes please see the Changelog file that
+// came with your tarball or type make ChangeLog if you are building from git
+//
+//========================================================================
+
+#ifndef SPLASHT1FONTFILE_H
+#define SPLASHT1FONTFILE_H
+
+#if HAVE_T1LIB_H
+
+#ifdef USE_GCC_PRAGMAS
+#pragma interface
+#endif
+
+#include "SplashFontFile.h"
+
+class SplashT1FontEngine;
+
+//------------------------------------------------------------------------
+// SplashT1FontFile
+//------------------------------------------------------------------------
+
+class SplashT1FontFile: public SplashFontFile {
+public:
+
+  static SplashFontFile *loadType1Font(SplashT1FontEngine *engineA,
+                                      SplashFontFileID *idA,
+                                      SplashFontSrc *src,
+                                      const char **encA);
+
+  virtual ~SplashT1FontFile();
+
+  // Create a new SplashT1Font, i.e., a scaled instance of this font
+  // file.
+  virtual SplashFont *makeFont(SplashCoord *mat,
+                              SplashCoord *textMat);
+
+private:
+
+  SplashT1FontFile(SplashT1FontEngine *engineA,
+                  SplashFontFileID *idA,
+                  SplashFontSrc *src,
+                  int t1libIDA, const char **encA, char *encStrA);
+
+  SplashT1FontEngine *engine;
+  int t1libID;                 // t1lib font ID
+  const char **enc;
+  char *encStr;
+
+  friend class SplashT1Font;
+};
+
+#endif // HAVE_T1LIB_H
+
+#endif
diff --git a/splash/SplashTypes.h b/splash/SplashTypes.h
new file mode 100644 (file)
index 0000000..65525b1
--- /dev/null
@@ -0,0 +1,169 @@
+//========================================================================
+//
+// SplashTypes.h
+//
+//========================================================================
+
+//========================================================================
+//
+// Modified under the Poppler project - http://poppler.freedesktop.org
+//
+// All changes made under the Poppler project to this file are licensed
+// under GPL version 2 or later
+//
+// Copyright (C) 2006, 2010 Albert Astals Cid <aacid@kde.org>
+// Copyright (C) 2008 Tomas Are Haavet <tomasare@gmail.com>
+// Copyright (C) 2009, 2011 Thomas Freitag <Thomas.Freitag@alfa.de>
+// Copyright (C) 2009 Stefan Thomas <thomas@eload24.com>
+// Copyright (C) 2010 William Bader <williambader@hotmail.com>
+//
+// To see a description of the changes please see the Changelog file that
+// came with your tarball or type make ChangeLog if you are building from git
+//
+//========================================================================
+
+#ifndef SPLASHTYPES_H
+#define SPLASHTYPES_H
+
+#include "goo/gtypes.h"
+
+//------------------------------------------------------------------------
+// coordinates
+//------------------------------------------------------------------------
+
+#if USE_FIXEDPOINT
+#include "goo/FixedPoint.h"
+typedef FixedPoint SplashCoord;
+#elif USE_FLOAT
+typedef float SplashCoord;
+#else
+typedef double SplashCoord;
+#endif
+
+//------------------------------------------------------------------------
+// antialiasing
+//------------------------------------------------------------------------
+
+#define splashAASize 4
+
+//------------------------------------------------------------------------
+// colors
+//------------------------------------------------------------------------
+
+enum SplashColorMode {
+  splashModeMono1,             // 1 bit per component, 8 pixels per byte,
+                               //   MSbit is on the left
+  splashModeMono8,             // 1 byte per component, 1 byte per pixel
+  splashModeRGB8,              // 1 byte per component, 3 bytes per pixel:
+                               //   RGBRGB...
+  splashModeBGR8,              // 1 byte per component, 3 bytes per pixel:
+                               //   BGRBGR...
+  splashModeXBGR8              // 1 byte per component, 4 bytes per pixel:
+                               //   XBGRXBGR...
+#if SPLASH_CMYK
+  ,
+  splashModeCMYK8              // 1 byte per component, 4 bytes per pixel:
+                               //   CMYKCMYK...
+#endif
+};
+
+// number of components in each color mode
+// (defined in SplashState.cc)
+extern int splashColorModeNComps[];
+
+// max number of components in any SplashColor
+#define splashMaxColorComps 4
+
+typedef Guchar SplashColor[splashMaxColorComps];
+typedef Guchar *SplashColorPtr;
+
+// RGB8
+static inline Guchar splashRGB8R(SplashColorPtr rgb8) { return rgb8[0]; }
+static inline Guchar splashRGB8G(SplashColorPtr rgb8) { return rgb8[1]; }
+static inline Guchar splashRGB8B(SplashColorPtr rgb8) { return rgb8[2]; }
+
+// BGR8
+static inline Guchar splashBGR8R(SplashColorPtr bgr8) { return bgr8[2]; }
+static inline Guchar splashBGR8G(SplashColorPtr bgr8) { return bgr8[1]; }
+static inline Guchar splashBGR8B(SplashColorPtr bgr8) { return bgr8[0]; }
+
+#if SPLASH_CMYK
+// CMYK8
+static inline Guchar splashCMYK8C(SplashColorPtr cmyk8) { return cmyk8[0]; }
+static inline Guchar splashCMYK8M(SplashColorPtr cmyk8) { return cmyk8[1]; }
+static inline Guchar splashCMYK8Y(SplashColorPtr cmyk8) { return cmyk8[2]; }
+static inline Guchar splashCMYK8K(SplashColorPtr cmyk8) { return cmyk8[3]; }
+#endif
+
+static inline void splashClearColor(SplashColorPtr dest) {
+  dest[0] = 0;
+  dest[1] = 0;
+  dest[2] = 0;
+#if SPLASH_CMYK
+  dest[3] = 0;
+#endif
+}
+
+static inline void splashColorCopy(SplashColorPtr dest, SplashColorPtr src) {
+  dest[0] = src[0];
+  dest[1] = src[1];
+  dest[2] = src[2];
+#if SPLASH_CMYK
+  dest[3] = src[3];
+#endif
+}
+
+static inline void splashColorXor(SplashColorPtr dest, SplashColorPtr src) {
+  dest[0] ^= src[0];
+  dest[1] ^= src[1];
+  dest[2] ^= src[2];
+#if SPLASH_CMYK
+  dest[3] ^= src[3];
+#endif
+}
+
+//------------------------------------------------------------------------
+// blend functions
+//------------------------------------------------------------------------
+
+typedef void (*SplashBlendFunc)(SplashColorPtr src, SplashColorPtr dest,
+                               SplashColorPtr blend, SplashColorMode cm);
+
+//------------------------------------------------------------------------
+// screen parameters
+//------------------------------------------------------------------------
+
+enum SplashScreenType {
+  splashScreenDispersed,
+  splashScreenClustered,
+  splashScreenStochasticClustered
+};
+
+struct SplashScreenParams {
+  SplashScreenType type;
+  int size;
+  int dotRadius;
+  SplashCoord gamma;
+  SplashCoord blackThreshold;
+  SplashCoord whiteThreshold;
+};
+
+//------------------------------------------------------------------------
+// error results
+//------------------------------------------------------------------------
+
+typedef int SplashError;
+
+
+//------------------------------------------------------------------------
+// image file formats
+//------------------------------------------------------------------------
+
+enum SplashImageFileFormat {
+  splashFormatJpeg,
+  splashFormatPng,
+  splashFormatTiff,
+  splashFormatJpegCMYK
+};
+
+#endif
diff --git a/splash/SplashXPath.cc b/splash/SplashXPath.cc
new file mode 100644 (file)
index 0000000..b82d355
--- /dev/null
@@ -0,0 +1,462 @@
+//========================================================================
+//
+// SplashXPath.cc
+//
+//========================================================================
+
+//========================================================================
+//
+// Modified under the Poppler project - http://poppler.freedesktop.org
+//
+// All changes made under the Poppler project to this file are licensed
+// under GPL version 2 or later
+//
+// Copyright (C) 2010 Paweł Wiejacha <pawel.wiejacha@gmail.com>
+// Copyright (C) 2010, 2011 Albert Astals Cid <aacid@kde.org>
+//
+// To see a description of the changes please see the Changelog file that
+// came with your tarball or type make ChangeLog if you are building from git
+//
+//========================================================================
+
+#include <config.h>
+
+#ifdef USE_GCC_PRAGMAS
+#pragma implementation
+#endif
+
+#include <stdlib.h>
+#include <string.h>
+#include <algorithm>
+#include "goo/gmem.h"
+#include "SplashMath.h"
+#include "SplashPath.h"
+#include "SplashXPath.h"
+
+//------------------------------------------------------------------------
+
+struct SplashXPathPoint {
+  SplashCoord x, y;
+};
+
+struct SplashXPathAdjust {
+  int firstPt, lastPt;         // range of points
+  GBool vert;                  // vertical or horizontal hint
+  SplashCoord x0a, x0b,                // hint boundaries
+              xma, xmb,
+              x1a, x1b;
+  SplashCoord x0, x1, xm;      // adjusted coordinates
+};
+
+//------------------------------------------------------------------------
+
+// Transform a point from user space to device space.
+inline void SplashXPath::transform(SplashCoord *matrix,
+                                  SplashCoord xi, SplashCoord yi,
+                                  SplashCoord *xo, SplashCoord *yo) {
+  //                          [ m[0] m[1] 0 ]
+  // [xo yo 1] = [xi yi 1] *  [ m[2] m[3] 0 ]
+  //                          [ m[4] m[5] 1 ]
+  *xo = xi * matrix[0] + yi * matrix[2] + matrix[4];
+  *yo = xi * matrix[1] + yi * matrix[3] + matrix[5];
+}
+
+//------------------------------------------------------------------------
+// SplashXPath
+//------------------------------------------------------------------------
+
+SplashXPath::SplashXPath(SplashPath *path, SplashCoord *matrix,
+                        SplashCoord flatness, GBool closeSubpaths) {
+  SplashPathHint *hint;
+  SplashXPathPoint *pts;
+  SplashXPathAdjust *adjusts, *adjust;
+  SplashCoord x0, y0, x1, y1, x2, y2, x3, y3, xsp, ysp;
+  SplashCoord adj0, adj1;
+  int curSubpath, i, j;
+
+  // transform the points
+  pts = (SplashXPathPoint *)gmallocn(path->length, sizeof(SplashXPathPoint));
+  for (i = 0; i < path->length; ++i) {
+    transform(matrix, path->pts[i].x, path->pts[i].y, &pts[i].x, &pts[i].y);
+  }
+
+  // set up the stroke adjustment hints
+  if (path->hints) {
+    adjusts = (SplashXPathAdjust *)gmallocn(path->hintsLength,
+                                           sizeof(SplashXPathAdjust));
+    for (i = 0; i < path->hintsLength; ++i) {
+      hint = &path->hints[i];
+      if (hint->ctrl0 + 1 >= path->length || hint->ctrl1 + 1 >= path->length) {
+       gfree(adjusts);
+       adjusts = NULL;
+       break;
+      }
+      x0 = pts[hint->ctrl0    ].x;    y0 = pts[hint->ctrl0    ].y;
+      x1 = pts[hint->ctrl0 + 1].x;    y1 = pts[hint->ctrl0 + 1].y;
+      x2 = pts[hint->ctrl1    ].x;    y2 = pts[hint->ctrl1    ].y;
+      x3 = pts[hint->ctrl1 + 1].x;    y3 = pts[hint->ctrl1 + 1].y;
+      if (x0 == x1 && x2 == x3) {
+       adjusts[i].vert = gTrue;
+       adj0 = x0;
+       adj1 = x2;
+      } else if (y0 == y1 && y2 == y3) {
+       adjusts[i].vert = gFalse;
+       adj0 = y0;
+       adj1 = y2;
+      } else {
+       gfree(adjusts);
+       adjusts = NULL;
+       break;
+      }
+      if (adj0 > adj1) {
+       x0 = adj0;
+       adj0 = adj1;
+       adj1 = x0;
+      }
+      adjusts[i].x0a = adj0 - 0.01;
+      adjusts[i].x0b = adj0 + 0.01;
+      adjusts[i].xma = (SplashCoord)0.5 * (adj0 + adj1) - 0.01;
+      adjusts[i].xmb = (SplashCoord)0.5 * (adj0 + adj1) + 0.01;
+      adjusts[i].x1a = adj1 - 0.01;
+      adjusts[i].x1b = adj1 + 0.01;
+      // rounding both edge coordinates can result in lines of
+      // different widths (e.g., adj=10.1, adj1=11.3 --> x0=10, x1=11;
+      // adj0=10.4, adj1=11.6 --> x0=10, x1=12), but it has the
+      // benefit of making adjacent strokes/fills line up without any
+      // gaps between them
+      x0 = splashRound(adj0);
+      x1 = splashRound(adj1);
+      if (x1 == x0) {
+       x1 = x1 + 1;
+      }
+      adjusts[i].x0 = (SplashCoord)x0;
+      adjusts[i].x1 = (SplashCoord)x1 - 0.01;
+      adjusts[i].xm = (SplashCoord)0.5 * (adjusts[i].x0 + adjusts[i].x1);
+      adjusts[i].firstPt = hint->firstPt;
+      adjusts[i].lastPt = hint->lastPt;
+    }
+
+  } else {
+    adjusts = NULL;
+  }
+
+  // perform stroke adjustment
+  if (adjusts) {
+    for (i = 0, adjust = adjusts; i < path->hintsLength; ++i, ++adjust) {
+      for (j = adjust->firstPt; j <= adjust->lastPt; ++j) {
+       strokeAdjust(adjust, &pts[j].x, &pts[j].y);
+      }
+    }
+    gfree(adjusts);
+  }
+
+  segs = NULL;
+  length = size = 0;
+
+  x0 = y0 = xsp = ysp = 0; // make gcc happy
+  adj0 = adj1 = 0; // make gcc happy
+  curSubpath = 0;
+  i = 0;
+  while (i < path->length) {
+
+    // first point in subpath - skip it
+    if (path->flags[i] & splashPathFirst) {
+      x0 = pts[i].x;
+      y0 = pts[i].y;
+      xsp = x0;
+      ysp = y0;
+      curSubpath = i;
+      ++i;
+
+    } else {
+
+      // curve segment
+      if (path->flags[i] & splashPathCurve) {
+       x1 = pts[i].x;
+       y1 = pts[i].y;
+       x2 = pts[i+1].x;
+       y2 = pts[i+1].y;
+       x3 = pts[i+2].x;
+       y3 = pts[i+2].y;
+       addCurve(x0, y0, x1, y1, x2, y2, x3, y3,
+                flatness,
+                (path->flags[i-1] & splashPathFirst),
+                (path->flags[i+2] & splashPathLast),
+                !closeSubpaths &&
+                  (path->flags[i-1] & splashPathFirst) &&
+                  !(path->flags[i-1] & splashPathClosed),
+                !closeSubpaths &&
+                  (path->flags[i+2] & splashPathLast) &&
+                  !(path->flags[i+2] & splashPathClosed));
+       x0 = x3;
+       y0 = y3;
+       i += 3;
+
+      // line segment
+      } else {
+       x1 = pts[i].x;
+       y1 = pts[i].y;
+       addSegment(x0, y0, x1, y1);
+       x0 = x1;
+       y0 = y1;
+       ++i;
+      }
+
+      // close a subpath
+      if (closeSubpaths &&
+         (path->flags[i-1] & splashPathLast) &&
+         (pts[i-1].x != pts[curSubpath].x ||
+          pts[i-1].y != pts[curSubpath].y)) {
+       addSegment(x0, y0, xsp, ysp);
+      }
+    }
+  }
+
+  gfree(pts);
+}
+
+// Apply the stroke adjust hints to point <pt>: (*<xp>, *<yp>).
+void SplashXPath::strokeAdjust(SplashXPathAdjust *adjust,
+                              SplashCoord *xp, SplashCoord *yp) {
+  SplashCoord x, y;
+
+  if (adjust->vert) {
+    x = *xp;
+    if (x > adjust->x0a && x < adjust->x0b) {
+      *xp = adjust->x0;
+    } else if (x > adjust->xma && x < adjust->xmb) {
+      *xp = adjust->xm;
+    } else if (x > adjust->x1a && x < adjust->x1b) {
+      *xp = adjust->x1;
+    }
+  } else {
+    y = *yp;
+    if (y > adjust->x0a && y < adjust->x0b) {
+      *yp = adjust->x0;
+    } else if (y > adjust->xma && y < adjust->xmb) {
+      *yp = adjust->xm;
+    } else if (y > adjust->x1a && y < adjust->x1b) {
+      *yp = adjust->x1;
+    }
+  }
+}
+
+SplashXPath::SplashXPath(SplashXPath *xPath) {
+  length = xPath->length;
+  size = xPath->size;
+  segs = (SplashXPathSeg *)gmallocn(size, sizeof(SplashXPathSeg));
+  memcpy(segs, xPath->segs, length * sizeof(SplashXPathSeg));
+}
+
+SplashXPath::~SplashXPath() {
+  gfree(segs);
+}
+
+// Add space for <nSegs> more segments
+void SplashXPath::grow(int nSegs) {
+  if (length + nSegs > size) {
+    if (size == 0) {
+      size = 32;
+    }
+    while (size < length + nSegs) {
+      size *= 2;
+    }
+    segs = (SplashXPathSeg *)greallocn(segs, size, sizeof(SplashXPathSeg));
+  }
+}
+
+void SplashXPath::addCurve(SplashCoord x0, SplashCoord y0,
+                          SplashCoord x1, SplashCoord y1,
+                          SplashCoord x2, SplashCoord y2,
+                          SplashCoord x3, SplashCoord y3,
+                          SplashCoord flatness,
+                          GBool first, GBool last, GBool end0, GBool end1) {
+  SplashCoord *cx = new SplashCoord[(splashMaxCurveSplits + 1) * 3];
+  SplashCoord *cy = new SplashCoord[(splashMaxCurveSplits + 1) * 3];
+  int *cNext = new int[splashMaxCurveSplits + 1];
+  SplashCoord xl0, xl1, xl2, xr0, xr1, xr2, xr3, xx1, xx2, xh;
+  SplashCoord yl0, yl1, yl2, yr0, yr1, yr2, yr3, yy1, yy2, yh;
+  SplashCoord dx, dy, mx, my, d1, d2, flatness2;
+  int p1, p2, p3;
+
+#if USE_FIXEDPOINT
+  flatness2 = flatness;
+#else
+  flatness2 = flatness * flatness;
+#endif
+
+  // initial segment
+  p1 = 0;
+  p2 = splashMaxCurveSplits;
+
+  *(cx + p1 * 3 + 0) = x0;
+  *(cx + p1 * 3 + 1) = x1;
+  *(cx + p1 * 3 + 2) = x2;
+  *(cx + p2 * 3 + 0) = x3;
+
+  *(cy + p1 * 3 + 0) = y0;
+  *(cy + p1 * 3 + 1) = y1;
+  *(cy + p1 * 3 + 2) = y2;
+  *(cy + p2 * 3 + 0) = y3;
+
+  *(cNext + p1) = p2;
+
+  while (p1 < splashMaxCurveSplits) {
+
+    // get the next segment
+    xl0 = *(cx + p1 * 3 + 0);
+    xx1 = *(cx + p1 * 3 + 1);
+    xx2 = *(cx + p1 * 3 + 2);
+
+    yl0 = *(cy + p1 * 3 + 0);
+    yy1 = *(cy + p1 * 3 + 1);
+    yy2 = *(cy + p1 * 3 + 2);
+
+    p2 = *(cNext + p1);
+
+    xr3 = *(cx + p2 * 3 + 0);
+    yr3 = *(cy + p2 * 3 + 0);
+
+    // compute the distances from the control points to the
+    // midpoint of the straight line (this is a bit of a hack, but
+    // it's much faster than computing the actual distances to the
+    // line)
+    mx = (xl0 + xr3) * 0.5;
+    my = (yl0 + yr3) * 0.5;
+#if USE_FIXEDPOINT
+    d1 = splashDist(xx1, yy1, mx, my);
+    d2 = splashDist(xx2, yy2, mx, my);
+#else
+    dx = xx1 - mx;
+    dy = yy1 - my;
+    d1 = dx*dx + dy*dy;
+    dx = xx2 - mx;
+    dy = yy2 - my;
+    d2 = dx*dx + dy*dy;
+#endif    
+
+    // if the curve is flat enough, or no more subdivisions are
+    // allowed, add the straight line segment
+    if (p2 - p1 == 1 || (d1 <= flatness2 && d2 <= flatness2)) {
+      addSegment(xl0, yl0, xr3, yr3);
+      p1 = p2;
+
+    // otherwise, subdivide the curve
+    } else {
+      xl1 = (xl0 + xx1) * 0.5;
+      yl1 = (yl0 + yy1) * 0.5;
+      xh = (xx1 + xx2) * 0.5;
+      yh = (yy1 + yy2) * 0.5;
+      xl2 = (xl1 + xh) * 0.5;
+      yl2 = (yl1 + yh) * 0.5;
+      xr2 = (xx2 + xr3) * 0.5;
+      yr2 = (yy2 + yr3) * 0.5;
+      xr1 = (xh + xr2) * 0.5;
+      yr1 = (yh + yr2) * 0.5;
+      xr0 = (xl2 + xr1) * 0.5;
+      yr0 = (yl2 + yr1) * 0.5;
+      // add the new subdivision points
+      p3 = (p1 + p2) / 2;
+
+      *(cx + p1 * 3 + 1) = xl1;
+      *(cx + p1 * 3 + 2) = xl2;
+
+      *(cy + p1 * 3 + 1) = yl1;
+      *(cy + p1 * 3 + 2) = yl2;
+
+      *(cNext + p1) = p3;
+
+      *(cx + p3 * 3 + 0) = xr0;
+      *(cx + p3 * 3 + 1) = xr1;
+      *(cx + p3 * 3 + 2) = xr2;
+
+      *(cy + p3 * 3 + 0) = yr0;
+      *(cy + p3 * 3 + 1) = yr1;
+      *(cy + p3 * 3 + 2) = yr2;
+
+      *(cNext + p3) = p2;
+    }
+  }
+
+  delete [] cx;
+  delete [] cy;
+  delete [] cNext;
+}
+
+void SplashXPath::addSegment(SplashCoord x0, SplashCoord y0,
+                            SplashCoord x1, SplashCoord y1) {
+  grow(1);
+  segs[length].x0 = x0;
+  segs[length].y0 = y0;
+  segs[length].x1 = x1;
+  segs[length].y1 = y1;
+  segs[length].flags = 0;
+  if (y1 == y0) {
+    segs[length].dxdy = segs[length].dydx = 0;
+    segs[length].flags |= splashXPathHoriz;
+    if (x1 == x0) {
+      segs[length].flags |= splashXPathVert;
+    }
+  } else if (x1 == x0) {
+    segs[length].dxdy = segs[length].dydx = 0;
+    segs[length].flags |= splashXPathVert;
+  } else {
+#if USE_FIXEDPOINT
+    if (FixedPoint::divCheck(x1 - x0, y1 - y0, &segs[length].dxdy)) {
+      segs[length].dydx = (SplashCoord)1 / segs[length].dxdy;
+    } else {
+      segs[length].dxdy = segs[length].dydx = 0;
+      if (splashAbs(x1 - x0) > splashAbs(y1 - y0)) {
+       segs[length].flags |= splashXPathHoriz;
+      } else {
+       segs[length].flags |= splashXPathVert;
+      }
+    }
+#else
+    segs[length].dxdy = (x1 - x0) / (y1 - y0);
+    segs[length].dydx = (SplashCoord)1 / segs[length].dxdy;
+#endif
+  }
+  if (y0 > y1) {
+    segs[length].flags |= splashXPathFlip;
+  }
+  ++length;
+}
+
+struct cmpXPathSegsFunctor {
+  bool operator()(const SplashXPathSeg &seg0, const SplashXPathSeg &seg1) {
+    SplashCoord x0, y0, x1, y1;
+
+    if (seg0.flags & splashXPathFlip) {
+      x0 = seg0.x1;
+      y0 = seg0.y1;
+    } else {
+      x0 = seg0.x0;
+      y0 = seg0.y0;
+    }
+    if (seg1.flags & splashXPathFlip) {
+      x1 = seg1.x1;
+      y1 = seg1.y1;
+    } else {
+      x1 = seg1.x0;
+      y1 = seg1.y0;
+    }
+    return (y0 != y1) ? (y0 < y1) : (x0 < x1);
+  }
+};
+
+void SplashXPath::aaScale() {
+  SplashXPathSeg *seg;
+  int i;
+
+  for (i = 0, seg = segs; i < length; ++i, ++seg) {
+    seg->x0 *= splashAASize;
+    seg->y0 *= splashAASize;
+    seg->x1 *= splashAASize;
+    seg->y1 *= splashAASize;
+  }
+}
+
+void SplashXPath::sort() {
+  std::sort(segs, segs + length, cmpXPathSegsFunctor());
+}
diff --git a/splash/SplashXPath.h b/splash/SplashXPath.h
new file mode 100644 (file)
index 0000000..db06978
--- /dev/null
@@ -0,0 +1,92 @@
+//========================================================================
+//
+// SplashXPath.h
+//
+//========================================================================
+
+#ifndef SPLASHXPATH_H
+#define SPLASHXPATH_H
+
+#ifdef USE_GCC_PRAGMAS
+#pragma interface
+#endif
+
+#include "SplashTypes.h"
+
+class SplashPath;
+struct SplashXPathAdjust;
+
+//------------------------------------------------------------------------
+
+#define splashMaxCurveSplits (1 << 10)
+
+//------------------------------------------------------------------------
+// SplashXPathSeg
+//------------------------------------------------------------------------
+
+struct SplashXPathSeg {
+  SplashCoord x0, y0;          // first endpoint
+  SplashCoord x1, y1;          // second endpoint
+  SplashCoord dxdy;            // slope: delta-x / delta-y
+  SplashCoord dydx;            // slope: delta-y / delta-x
+  Guint flags;
+};
+
+#define splashXPathHoriz   0x01 // segment is vertical (y0 == y1)
+                               //   (dxdy is undef)
+#define splashXPathVert    0x02 // segment is horizontal (x0 == x1)
+                               //   (dydx is undef)
+#define splashXPathFlip           0x04 // y0 > y1
+
+//------------------------------------------------------------------------
+// SplashXPath
+//------------------------------------------------------------------------
+
+class SplashXPath {
+public:
+
+  // Expands (converts to segments) and flattens (converts curves to
+  // lines) <path>.  Transforms all points from user space to device
+  // space, via <matrix>.  If <closeSubpaths> is true, closes all open
+  // subpaths.
+  SplashXPath(SplashPath *path, SplashCoord *matrix,
+             SplashCoord flatness, GBool closeSubpaths);
+
+  // Copy an expanded path.
+  SplashXPath *copy() { return new SplashXPath(this); }
+
+  ~SplashXPath();
+
+  // Multiply all coordinates by splashAASize, in preparation for
+  // anti-aliased rendering.
+  void aaScale();
+
+  // Sort by upper coordinate (lower y), in y-major order.
+  void sort();
+
+protected:
+
+  SplashXPath(SplashXPath *xPath);
+  void transform(SplashCoord *matrix, SplashCoord xi, SplashCoord yi,
+                SplashCoord *xo, SplashCoord *yo);
+  void strokeAdjust(SplashXPathAdjust *adjust,
+                   SplashCoord *xp, SplashCoord *yp);
+  void grow(int nSegs);
+  void addCurve(SplashCoord x0, SplashCoord y0,
+               SplashCoord x1, SplashCoord y1,
+               SplashCoord x2, SplashCoord y2,
+               SplashCoord x3, SplashCoord y3,
+               SplashCoord flatness,
+               GBool first, GBool last, GBool end0, GBool end1);
+  void addSegment(SplashCoord x0, SplashCoord y0,
+                 SplashCoord x1, SplashCoord y1);
+
+  SplashXPathSeg *segs;
+  int length, size;            // length and size of segs array
+
+  friend class SplashXPathScanner;
+  friend class SplashClip;
+  friend class Splash;
+};
+
+#endif
diff --git a/splash/SplashXPathScanner.cc b/splash/SplashXPathScanner.cc
new file mode 100644 (file)
index 0000000..738cef7
--- /dev/null
@@ -0,0 +1,534 @@
+//========================================================================
+//
+// SplashXPathScanner.cc
+//
+//========================================================================
+
+//========================================================================
+//
+// Modified under the Poppler project - http://poppler.freedesktop.org
+//
+// All changes made under the Poppler project to this file are licensed
+// under GPL version 2 or later
+//
+// Copyright (C) 2008, 2010 Albert Astals Cid <aacid@kde.org>
+// Copyright (C) 2010 Paweł Wiejacha <pawel.wiejacha@gmail.com>
+//
+// To see a description of the changes please see the Changelog file that
+// came with your tarball or type make ChangeLog if you are building from git
+//
+//========================================================================
+
+#include <config.h>
+
+#ifdef USE_GCC_PRAGMAS
+#pragma implementation
+#endif
+
+#include <stdlib.h>
+#include <string.h>
+#include <algorithm>
+#include "goo/gmem.h"
+#include "SplashMath.h"
+#include "SplashXPath.h"
+#include "SplashBitmap.h"
+#include "SplashXPathScanner.h"
+
+//------------------------------------------------------------------------
+
+struct SplashIntersect {
+  int y;
+  int x0, x1;                  // intersection of segment with [y, y+1)
+  int count;                   // EO/NZWN counter increment
+};
+
+struct cmpIntersectFunctor {
+  bool operator()(const SplashIntersect &i0, const SplashIntersect &i1) {
+    return (i0.y != i1.y) ? (i0.y < i1.y) : (i0.x0 < i1.x0);
+  }
+};
+
+//------------------------------------------------------------------------
+// SplashXPathScanner
+//------------------------------------------------------------------------
+
+SplashXPathScanner::SplashXPathScanner(SplashXPath *xPathA, GBool eoA,
+                                      int clipYMin, int clipYMax) {
+  SplashXPathSeg *seg;
+  SplashCoord xMinFP, yMinFP, xMaxFP, yMaxFP;
+  int i;
+
+  xPath = xPathA;
+  eo = eoA;
+  partialClip = gFalse;
+
+  // compute the bbox
+  if (xPath->length == 0) {
+    xMin = yMin = 1;
+    xMax = yMax = 0;
+  } else {
+    seg = &xPath->segs[0];
+    if (seg->x0 <= seg->x1) {
+      xMinFP = seg->x0;
+      xMaxFP = seg->x1;
+    } else {
+      xMinFP = seg->x1;
+      xMaxFP = seg->x0;
+    }
+    if (seg->flags & splashXPathFlip) {
+      yMinFP = seg->y1;
+      yMaxFP = seg->y0;
+    } else {
+      yMinFP = seg->y0;
+      yMaxFP = seg->y1;
+    }
+    for (i = 1; i < xPath->length; ++i) {
+      seg = &xPath->segs[i];
+      if (seg->x0 < xMinFP) {
+       xMinFP = seg->x0;
+      } else if (seg->x0 > xMaxFP) {
+       xMaxFP = seg->x0;
+      }
+      if (seg->x1 < xMinFP) {
+       xMinFP = seg->x1;
+      } else if (seg->x1 > xMaxFP) {
+       xMaxFP = seg->x1;
+      }
+      if (seg->flags & splashXPathFlip) {
+       if (seg->y0 > yMaxFP) {
+         yMaxFP = seg->y0;
+       }
+      } else {
+       if (seg->y1 > yMaxFP) {
+         yMaxFP = seg->y1;
+       }
+      }
+    }
+    xMin = splashFloor(xMinFP);
+    xMax = splashFloor(xMaxFP);
+    yMin = splashFloor(yMinFP);
+    yMax = splashFloor(yMaxFP);
+    if (clipYMin > yMin) {
+      yMin = clipYMin;
+      partialClip = gTrue;
+    }
+    if (clipYMax < yMax) {
+      yMax = clipYMax;
+      partialClip = gTrue;
+    }
+  }
+
+  allInter = NULL;
+  inter = NULL;
+  computeIntersections();
+  interY = yMin - 1;
+}
+
+SplashXPathScanner::~SplashXPathScanner() {
+  gfree(inter);
+  gfree(allInter);
+}
+
+void SplashXPathScanner::getBBoxAA(int *xMinA, int *yMinA,
+                                  int *xMaxA, int *yMaxA) {
+  *xMinA = xMin / splashAASize;
+  *yMinA = yMin / splashAASize;
+  *xMaxA = xMax / splashAASize;
+  *yMaxA = yMax / splashAASize;
+}
+
+void SplashXPathScanner::getSpanBounds(int y, int *spanXMin, int *spanXMax) {
+  int interBegin, interEnd, xx, i;
+
+  if (y < yMin || y > yMax) {
+    interBegin = interEnd = 0;
+  } else {
+    interBegin = inter[y - yMin];
+    interEnd = inter[y - yMin + 1];
+  }
+  if (interBegin < interEnd) {
+    *spanXMin = allInter[interBegin].x0;
+    xx = allInter[interBegin].x1;
+    for (i = interBegin + 1; i < interEnd; ++i) {
+      if (allInter[i].x1 > xx) {
+       xx = allInter[i].x1;
+      }
+    }
+    *spanXMax = xx;
+  } else {
+    *spanXMin = xMax + 1;
+    *spanXMax = xMax;
+  }
+}
+
+GBool SplashXPathScanner::test(int x, int y) {
+  int interBegin, interEnd, count, i;
+
+  if (y < yMin || y > yMax) {
+    return gFalse;
+  }
+  interBegin = inter[y - yMin];
+  interEnd = inter[y - yMin + 1];
+  count = 0;
+  for (i = interBegin; i < interEnd && allInter[i].x0 <= x; ++i) {
+    if (x <= allInter[i].x1) {
+      return gTrue;
+    }
+    count += allInter[i].count;
+  }
+  return eo ? (count & 1) : (count != 0);
+}
+
+GBool SplashXPathScanner::testSpan(int x0, int x1, int y) {
+  int interBegin, interEnd, count, xx1, i;
+
+  if (y < yMin || y > yMax) {
+    return gFalse;
+  }
+  interBegin = inter[y - yMin];
+  interEnd = inter[y - yMin + 1];
+  count = 0;
+  for (i = interBegin; i < interEnd && allInter[i].x1 < x0; ++i) {
+    count += allInter[i].count;
+  }
+
+  // invariant: the subspan [x0,xx1] is inside the path
+  xx1 = x0 - 1;
+  while (xx1 < x1) {
+    if (i >= interEnd) {
+      return gFalse;
+    }
+    if (allInter[i].x0 > xx1 + 1 &&
+       !(eo ? (count & 1) : (count != 0))) {
+      return gFalse;
+    }
+    if (allInter[i].x1 > xx1) {
+      xx1 = allInter[i].x1;
+    }
+    count += allInter[i].count;
+    ++i;
+  }
+
+  return gTrue;
+}
+
+GBool SplashXPathScanner::getNextSpan(int y, int *x0, int *x1) {
+  int interEnd, xx0, xx1;
+
+  if (y < yMin || y > yMax) {
+    return gFalse;
+  }
+  if (interY != y) {
+    interY = y;
+    interIdx = inter[y - yMin];
+    interCount = 0;
+  }
+  interEnd = inter[y - yMin + 1];
+  if (interIdx >= interEnd) {
+    return gFalse;
+  }
+  xx0 = allInter[interIdx].x0;
+  xx1 = allInter[interIdx].x1;
+  interCount += allInter[interIdx].count;
+  ++interIdx;
+  while (interIdx < interEnd &&
+        (allInter[interIdx].x0 <= xx1 ||
+         (eo ? (interCount & 1) : (interCount != 0)))) {
+    if (allInter[interIdx].x1 > xx1) {
+      xx1 = allInter[interIdx].x1;
+    }
+    interCount += allInter[interIdx].count;
+    ++interIdx;
+  }
+  *x0 = xx0;
+  *x1 = xx1;
+  return gTrue;
+}
+
+void SplashXPathScanner::computeIntersections() {
+  SplashXPathSeg *seg;
+  SplashCoord segXMin, segXMax, segYMin, segYMax, xx0, xx1;
+  int x, y, y0, y1, i;
+
+  if (yMin > yMax) {
+    return;
+  }
+
+  // build the list of all intersections
+  allInterLen = 0;
+  allInterSize = 16;
+  allInter = (SplashIntersect *)gmallocn(allInterSize,
+                                        sizeof(SplashIntersect));
+  for (i = 0; i < xPath->length; ++i) {
+    seg = &xPath->segs[i];
+    if (seg->flags & splashXPathFlip) {
+      segYMin = seg->y1;
+      segYMax = seg->y0;
+    } else {
+      segYMin = seg->y0;
+      segYMax = seg->y1;
+    }
+    if (seg->flags & splashXPathHoriz) {
+      y = splashFloor(seg->y0);
+      if (y >= yMin && y <= yMax) {
+       addIntersection(segYMin, segYMax, seg->flags,
+                       y, splashFloor(seg->x0), splashFloor(seg->x1));
+      }
+    } else if (seg->flags & splashXPathVert) {
+      y0 = splashFloor(segYMin);
+      if (y0 < yMin) {
+       y0 = yMin;
+      }
+      y1 = splashFloor(segYMax);
+      if (y1 > yMax) {
+       y1 = yMax;
+      }
+      x = splashFloor(seg->x0);
+      for (y = y0; y <= y1; ++y) {
+       addIntersection(segYMin, segYMax, seg->flags, y, x, x);
+      }
+    } else {
+      if (seg->x0 < seg->x1) {
+       segXMin = seg->x0;
+       segXMax = seg->x1;
+      } else {
+       segXMin = seg->x1;
+       segXMax = seg->x0;
+      }
+      y0 = splashFloor(segYMin);
+      if (y0 < yMin) {
+       y0 = yMin;
+      }
+      y1 = splashFloor(segYMax);
+      if (y1 > yMax) {
+       y1 = yMax;
+      }
+      // this loop could just add seg->dxdy to xx1 on each iteration,
+      // but that introduces numerical accuracy problems
+      xx1 = seg->x0 + ((SplashCoord)y0 - seg->y0) * seg->dxdy;
+      for (y = y0; y <= y1; ++y) {
+       xx0 = xx1;
+       xx1 = seg->x0 + ((SplashCoord)(y + 1) - seg->y0) * seg->dxdy;
+       // the segment may not actually extend to the top and/or bottom edges
+       if (xx0 < segXMin) {
+         xx0 = segXMin;
+       } else if (xx0 > segXMax) {
+         xx0 = segXMax;
+       }
+       if (xx1 < segXMin) {
+         xx1 = segXMin;
+       } else if (xx1 > segXMax) {
+         xx1 = segXMax;
+       }
+       addIntersection(segYMin, segYMax, seg->flags, y,
+                       splashFloor(xx0), splashFloor(xx1));
+      }
+    }
+  }
+  std::sort(allInter, allInter + allInterLen, cmpIntersectFunctor());
+
+  // build the list of y pointers
+  inter = (int *)gmallocn(yMax - yMin + 2, sizeof(int));
+  i = 0;
+  for (y = yMin; y <= yMax; ++y) {
+    inter[y - yMin] = i;
+    while (i < allInterLen && allInter[i].y <= y) {
+      ++i;
+    }
+  }
+  inter[yMax - yMin + 1] = i;
+}
+
+void SplashXPathScanner::addIntersection(double segYMin, double segYMax,
+                                        Guint segFlags,
+                                        int y, int x0, int x1) {
+  if (allInterLen == allInterSize) {
+    allInterSize *= 2;
+    allInter = (SplashIntersect *)greallocn(allInter, allInterSize,
+                                           sizeof(SplashIntersect));
+  }
+  allInter[allInterLen].y = y;
+  if (x0 < x1) {
+    allInter[allInterLen].x0 = x0;
+    allInter[allInterLen].x1 = x1;
+  } else {
+    allInter[allInterLen].x0 = x1;
+    allInter[allInterLen].x1 = x0;
+  }
+  if (segYMin <= y &&
+      (SplashCoord)y < segYMax &&
+      !(segFlags & splashXPathHoriz)) {
+    allInter[allInterLen].count = eo ? 1
+                                     : (segFlags & splashXPathFlip) ? 1 : -1;
+  } else {
+    allInter[allInterLen].count = 0;
+  }
+  ++allInterLen;
+}
+
+void SplashXPathScanner::renderAALine(SplashBitmap *aaBuf,
+                                     int *x0, int *x1, int y) {
+  int xx0, xx1, xx, xxMin, xxMax, yy, interEnd;
+  Guchar mask;
+  SplashColorPtr p;
+
+  memset(aaBuf->getDataPtr(), 0, aaBuf->getRowSize() * aaBuf->getHeight());
+  xxMin = aaBuf->getWidth();
+  xxMax = -1;
+  if (yMin <= yMax) {
+    if (splashAASize * y < yMin) {
+      interIdx = inter[0];
+    } else if (splashAASize * y > yMax) {
+      interIdx = inter[yMax - yMin + 1];
+    } else {
+      interIdx = inter[splashAASize * y - yMin];
+    }
+    for (yy = 0; yy < splashAASize; ++yy) {
+      if (splashAASize * y + yy < yMin) {
+       interEnd = inter[0];
+      } else if (splashAASize * y + yy > yMax) {
+       interEnd = inter[yMax - yMin + 1];
+      } else {
+       interEnd = inter[splashAASize * y + yy - yMin + 1];
+      }
+      interCount = 0;
+      while (interIdx < interEnd) {
+       xx0 = allInter[interIdx].x0;
+       xx1 = allInter[interIdx].x1;
+       interCount += allInter[interIdx].count;
+       ++interIdx;
+       while (interIdx < interEnd &&
+              (allInter[interIdx].x0 <= xx1 ||
+               (eo ? (interCount & 1) : (interCount != 0)))) {
+         if (allInter[interIdx].x1 > xx1) {
+           xx1 = allInter[interIdx].x1;
+         }
+         interCount += allInter[interIdx].count;
+         ++interIdx;
+       }
+       if (xx0 < 0) {
+         xx0 = 0;
+       }
+       ++xx1;
+       if (xx1 > aaBuf->getWidth()) {
+         xx1 = aaBuf->getWidth();
+       }
+       // set [xx0, xx1) to 1
+       if (xx0 < xx1) {
+         xx = xx0;
+         p = aaBuf->getDataPtr() + yy * aaBuf->getRowSize() + (xx >> 3);
+         if (xx & 7) {
+           mask = 0xff >> (xx & 7);
+           if ((xx & ~7) == (xx1 & ~7)) {
+             mask &= (Guchar)(0xff00 >> (xx1 & 7));
+           }
+           *p++ |= mask;
+           xx = (xx & ~7) + 8;
+         }
+         for (; xx + 7 < xx1; xx += 8) {
+           *p++ |= 0xff;
+         }
+         if (xx < xx1) {
+           *p |= (Guchar)(0xff00 >> (xx1 & 7));
+         }
+       }
+       if (xx0 < xxMin) {
+         xxMin = xx0;
+       }
+       if (xx1 > xxMax) {
+         xxMax = xx1;
+       }
+      }
+    }
+  }
+  if (xxMin > xxMax) {
+    xxMin = xxMax;
+  }
+  *x0 = xxMin / splashAASize;
+  *x1 = (xxMax - 1) / splashAASize;
+}
+
+void SplashXPathScanner::clipAALine(SplashBitmap *aaBuf,
+                                   int *x0, int *x1, int y) {
+  int xx0, xx1, xx, yy, interEnd;
+  Guchar mask;
+  SplashColorPtr p;
+
+  for (yy = 0; yy < splashAASize; ++yy) {
+    xx = *x0 * splashAASize;
+    if (yMin <= yMax) {
+      if (splashAASize * y + yy < yMin) {
+       interIdx = interEnd = inter[0];
+      } else if (splashAASize * y + yy > yMax) {
+       interIdx = interEnd = inter[yMax - yMin + 1];
+      } else {
+       interIdx = inter[splashAASize * y + yy - yMin];
+       if (splashAASize * y + yy > yMax) {
+         interEnd = inter[yMax - yMin + 1];
+       } else {
+         interEnd = inter[splashAASize * y + yy - yMin + 1];
+       }
+      }
+      interCount = 0;
+      while (interIdx < interEnd && xx < (*x1 + 1) * splashAASize) {
+       xx0 = allInter[interIdx].x0;
+       xx1 = allInter[interIdx].x1;
+       interCount += allInter[interIdx].count;
+       ++interIdx;
+       while (interIdx < interEnd &&
+              (allInter[interIdx].x0 <= xx1 ||
+               (eo ? (interCount & 1) : (interCount != 0)))) {
+         if (allInter[interIdx].x1 > xx1) {
+           xx1 = allInter[interIdx].x1;
+         }
+         interCount += allInter[interIdx].count;
+         ++interIdx;
+       }
+       if (xx0 > aaBuf->getWidth()) {
+         xx0 = aaBuf->getWidth();
+       }
+       // set [xx, xx0) to 0
+       if (xx < xx0) {
+         p = aaBuf->getDataPtr() + yy * aaBuf->getRowSize() + (xx >> 3);
+         if (xx & 7) {
+           mask = (Guchar)(0xff00 >> (xx & 7));
+           if ((xx & ~7) == (xx0 & ~7)) {
+             mask |= 0xff >> (xx0 & 7);
+           }
+           *p++ &= mask;
+           xx = (xx & ~7) + 8;
+         }
+         for (; xx + 7 < xx0; xx += 8) {
+           *p++ = 0x00;
+         }
+         if (xx < xx0) {
+           *p &= 0xff >> (xx0 & 7);
+         }
+       }
+       if (xx1 >= xx) {
+         xx = xx1 + 1;
+       }
+      }
+    }
+    xx0 = (*x1 + 1) * splashAASize;
+    if (xx0 > aaBuf->getWidth()) xx0 = aaBuf->getWidth();
+    // set [xx, xx0) to 0
+    if (xx < xx0) {
+      p = aaBuf->getDataPtr() + yy * aaBuf->getRowSize() + (xx >> 3);
+      if (xx & 7) {
+       mask = (Guchar)(0xff00 >> (xx & 7));
+       if ((xx & ~7) == (xx0 & ~7)) {
+         mask &= 0xff >> (xx0 & 7);
+       }
+       *p++ &= mask;
+       xx = (xx & ~7) + 8;
+      }
+      for (; xx + 7 < xx0; xx += 8) {
+       *p++ = 0x00;
+      }
+      if (xx < xx0) {
+       *p &= 0xff >> (xx0 & 7);
+      }
+    }
+  }
+}
diff --git a/splash/SplashXPathScanner.h b/splash/SplashXPathScanner.h
new file mode 100644 (file)
index 0000000..719fae4
--- /dev/null
@@ -0,0 +1,93 @@
+//========================================================================
+//
+// SplashXPathScanner.h
+//
+//========================================================================
+
+#ifndef SPLASHXPATHSCANNER_H
+#define SPLASHXPATHSCANNER_H
+
+#ifdef USE_GCC_PRAGMAS
+#pragma interface
+#endif
+
+#include "SplashTypes.h"
+
+class SplashXPath;
+class SplashBitmap;
+struct SplashIntersect;
+
+//------------------------------------------------------------------------
+// SplashXPathScanner
+//------------------------------------------------------------------------
+
+class SplashXPathScanner {
+public:
+
+  // Create a new SplashXPathScanner object.  <xPathA> must be sorted.
+  SplashXPathScanner(SplashXPath *xPathA, GBool eoA,
+                    int clipYMin, int clipYMax);
+
+  ~SplashXPathScanner();
+
+  // Return the path's bounding box.
+  void getBBox(int *xMinA, int *yMinA, int *xMaxA, int *yMaxA)
+    { *xMinA = xMin; *yMinA = yMin; *xMaxA = xMax; *yMaxA = yMax; }
+
+  // Return the path's bounding box.
+  void getBBoxAA(int *xMinA, int *yMinA, int *xMaxA, int *yMaxA);
+
+  // Returns true if at least part of the path was outside the
+  // clipYMin/clipYMax bounds passed to the constructor.
+  GBool hasPartialClip() { return partialClip; }
+
+  // Return the min/max x values for the span at <y>.
+  void getSpanBounds(int y, int *spanXMin, int *spanXMax);
+
+  // Returns true if (<x>,<y>) is inside the path.
+  GBool test(int x, int y);
+
+  // Returns true if the entire span ([<x0>,<x1>], <y>) is inside the
+  // path.
+  GBool testSpan(int x0, int x1, int y);
+
+  // Returns the next span inside the path at <y>.  If <y> is
+  // different than the previous call to getNextSpan, this returns the
+  // first span at <y>; otherwise it returns the next span (relative
+  // to the previous call to getNextSpan).  Returns false if there are
+  // no more spans at <y>.
+  GBool getNextSpan(int y, int *x0, int *x1);
+
+  // Renders one anti-aliased line into <aaBuf>.  Returns the min and
+  // max x coordinates with non-zero pixels in <x0> and <x1>.
+  void renderAALine(SplashBitmap *aaBuf, int *x0, int *x1, int y);
+
+  // Clips an anti-aliased line by setting pixels to zero.  On entry,
+  // all non-zero pixels are between <x0> and <x1>.  This function
+  // will update <x0> and <x1>.
+  void clipAALine(SplashBitmap *aaBuf, int *x0, int *x1, int y);
+
+private:
+
+  void computeIntersections();
+  void addIntersection(double segYMin, double segYMax,
+                      Guint segFlags,
+                      int y, int x0, int x1);
+
+  SplashXPath *xPath;
+  GBool eo;
+  int xMin, yMin, xMax, yMax;
+  GBool partialClip;
+
+  SplashIntersect *allInter;   // array of intersections
+  int allInterLen;             // number of intersections in <allInter>
+  int allInterSize;            // size of the <allInter> array
+  int *inter;                  // indexes into <allInter> for each y value
+  int interY;                  // current y value - used by getNextSpan
+  int interIdx;                        // current index into <inter> - used by
+                               //   getNextSpan 
+  int interCount;              // current EO/NZWN counter - used by
+                               //   getNextSpan
+};
+
+#endif
diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt
new file mode 100644 (file)
index 0000000..cff715c
--- /dev/null
@@ -0,0 +1,51 @@
+
+if (ENABLE_SPLASH)
+
+  if (HAVE_NANOSLEEP OR LIB_RT_HAS_NANOSLEEP)
+    set (perf_test_SRCS
+      perf-test.cc
+      perf-test-preview-dummy.cc
+    )
+    add_executable(perf-test ${perf_test_SRCS})
+    target_link_libraries(perf-test poppler)
+    if (LIB_RT_HAS_NANOSLEEP)
+      target_link_libraries(perf-test rt)
+    endif (LIB_RT_HAS_NANOSLEEP)
+  endif (HAVE_NANOSLEEP OR LIB_RT_HAS_NANOSLEEP)
+
+endif (ENABLE_SPLASH)
+
+if (GTK_FOUND)
+
+  add_definitions(${GTK2_CFLAGS})
+
+  include_directories(
+    ${CMAKE_SOURCE_DIR}/glib
+    ${CMAKE_BINARY_DIR}/glib
+  )
+
+  set (gtk_splash_test_SRCS
+    gtk-test.cc
+  )
+  poppler_add_test(gtk-test BUILD_GTK_TESTS ${gtk_splash_test_SRCS})
+  target_link_libraries(gtk-test poppler-glib ${GTK2_LIBRARIES})
+
+  if (HAVE_CAIRO)
+
+    set (pdf_inspector_SRCS
+      pdf-inspector.cc
+    )
+    poppler_add_test(pdf-inspector BUILD_GTK_TESTS ${pdf_inspector_SRCS})
+    target_link_libraries(pdf-inspector poppler-glib ${GTK2_LIBRARIES})
+
+  endif (HAVE_CAIRO)
+
+endif (GTK_FOUND)
+
+set (pdf_fullrewrite_SRCS
+  pdf-fullrewrite.cc
+)
+add_executable(pdf-fullrewrite ${pdf_fullrewrite_SRCS})
+target_link_libraries(pdf-fullrewrite poppler)
+
+
diff --git a/test/Makefile.am b/test/Makefile.am
new file mode 100644 (file)
index 0000000..0252911
--- /dev/null
@@ -0,0 +1,88 @@
+if BUILD_GTK_TEST
+
+if BUILD_SPLASH_OUTPUT
+
+splash_includes =                              \
+       -I$(top_srcdir)/splash
+
+endif
+
+if BUILD_CAIRO_OUTPUT
+
+pdf_inspector =                                \
+       pdf_inspector
+
+cairo_includes =                               \
+       $(CAIRO_CFLAGS)                         \
+       $(FREETYPE_CFLAGS)
+
+endif
+
+gtk_test = \
+       gtk-test
+
+endif
+
+if BUILD_SPLASH_OUTPUT
+
+perf_test =                            \
+       perf-test
+
+endif
+
+pdf_fullrewrite = \
+       pdf-fullrewrite
+
+INCLUDES =                                     \
+       -I$(top_srcdir)                         \
+       -I$(top_srcdir)/poppler                 \
+       -I$(top_srcdir)/glib                    \
+       -I$(top_builddir)/glib                  \
+       $(cairo_includes)                       \
+       $(GTK_TEST_CFLAGS)                      \
+       $(FONTCONFIG_CFLAGS)
+
+noinst_PROGRAMS = $(pdf_inspector) $(perf_test) $(pdf_fullrewrite) $(gtk_test)
+
+AM_LDFLAGS = @auto_import_flags@
+
+gtk_test_SOURCES =                                     \
+       gtk-test.cc
+
+gtk_test_LDADD =                                       \
+       $(top_builddir)/poppler/libpoppler.la           \
+       $(top_builddir)/glib/libpoppler-glib.la         \
+       $(CAIRO_LIBS)                                   \
+       $(GTK_TEST_LIBS)                                \
+       $(FONTCONFIG_LIBS)
+
+
+pdf_inspector_SOURCES =                        \
+       pdf-inspector.cc
+
+pdf_inspector_LDADD =                                  \
+       $(top_builddir)/poppler/libpoppler-cairo.la     \
+       $(top_builddir)/poppler/libpoppler.la           \
+       $(CAIRO_LIBS)                                   \
+       $(FREETYPE_LIBS)                                \
+       $(GTK_TEST_LIBS)                                \
+       $(X_EXTRA_LIBS)
+
+perf_test_SOURCES =                    \
+       perf-test.cc                     \
+       perf-test-preview-dummy.cc
+
+perf_test_LDADD =                              \
+       $(top_builddir)/poppler/libpoppler.la   \
+       $(FREETYPE_LIBS)                                        \
+       $(X_EXTRA_LIBS)
+
+pdf_fullrewrite_SOURCES = \
+       pdf-fullrewrite.cc
+
+pdf_fullrewrite_LDADD = \
+       $(top_builddir)/poppler/libpoppler.la
+
+EXTRA_DIST =                                   \
+       pdf-operators.c                         \
+       pdf-inspector.ui
diff --git a/test/Makefile.in b/test/Makefile.in
new file mode 100644 (file)
index 0000000..d1f7fc8
--- /dev/null
@@ -0,0 +1,709 @@
+# Makefile.in generated by automake 1.11.5 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software
+# Foundation, Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+@SET_MAKE@
+
+VPATH = @srcdir@
+am__make_dryrun = \
+  { \
+    am__dry=no; \
+    case $$MAKEFLAGS in \
+      *\\[\ \  ]*) \
+        echo 'am--echo: ; @echo "AM"  OK' | $(MAKE) -f - 2>/dev/null \
+          | grep '^AM OK$$' >/dev/null || am__dry=yes;; \
+      *) \
+        for am__flg in $$MAKEFLAGS; do \
+          case $$am__flg in \
+            *=*|--*) ;; \
+            *n*) am__dry=yes; break;; \
+          esac; \
+        done;; \
+    esac; \
+    test $$am__dry = yes; \
+  }
+pkgdatadir = $(datadir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkglibexecdir = $(libexecdir)/@PACKAGE@
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+noinst_PROGRAMS = $(am__EXEEXT_1) $(am__EXEEXT_2) $(am__EXEEXT_3) \
+       $(am__EXEEXT_4)
+subdir = test
+DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/m4/acx_pthread.m4 \
+       $(top_srcdir)/m4/define-dir.m4 $(top_srcdir)/m4/gtk-doc.m4 \
+       $(top_srcdir)/m4/iconv.m4 $(top_srcdir)/m4/introspection.m4 \
+       $(top_srcdir)/m4/libjpeg.m4 $(top_srcdir)/m4/libtool.m4 \
+       $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \
+       $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \
+       $(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+       $(ACLOCAL_M4)
+mkinstalldirs = $(install_sh) -d
+CONFIG_HEADER = $(top_builddir)/config.h \
+       $(top_builddir)/poppler/poppler-config.h
+CONFIG_CLEAN_FILES =
+CONFIG_CLEAN_VPATH_FILES =
+@BUILD_CAIRO_OUTPUT_TRUE@@BUILD_GTK_TEST_TRUE@am__EXEEXT_1 = pdf_inspector$(EXEEXT)
+@BUILD_SPLASH_OUTPUT_TRUE@am__EXEEXT_2 = perf-test$(EXEEXT)
+am__EXEEXT_3 = pdf-fullrewrite$(EXEEXT)
+@BUILD_GTK_TEST_TRUE@am__EXEEXT_4 = gtk-test$(EXEEXT)
+PROGRAMS = $(noinst_PROGRAMS)
+am_gtk_test_OBJECTS = gtk-test.$(OBJEXT)
+gtk_test_OBJECTS = $(am_gtk_test_OBJECTS)
+am__DEPENDENCIES_1 =
+gtk_test_DEPENDENCIES = $(top_builddir)/poppler/libpoppler.la \
+       $(top_builddir)/glib/libpoppler-glib.la $(am__DEPENDENCIES_1) \
+       $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1)
+AM_V_lt = $(am__v_lt_@AM_V@)
+am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@)
+am__v_lt_0 = --silent
+am_pdf_fullrewrite_OBJECTS = pdf-fullrewrite.$(OBJEXT)
+pdf_fullrewrite_OBJECTS = $(am_pdf_fullrewrite_OBJECTS)
+pdf_fullrewrite_DEPENDENCIES = $(top_builddir)/poppler/libpoppler.la
+am_pdf_inspector_OBJECTS = pdf-inspector.$(OBJEXT)
+pdf_inspector_OBJECTS = $(am_pdf_inspector_OBJECTS)
+pdf_inspector_DEPENDENCIES =  \
+       $(top_builddir)/poppler/libpoppler-cairo.la \
+       $(top_builddir)/poppler/libpoppler.la $(am__DEPENDENCIES_1) \
+       $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
+       $(am__DEPENDENCIES_1)
+am_perf_test_OBJECTS = perf-test.$(OBJEXT) \
+       perf-test-preview-dummy.$(OBJEXT)
+perf_test_OBJECTS = $(am_perf_test_OBJECTS)
+perf_test_DEPENDENCIES = $(top_builddir)/poppler/libpoppler.la \
+       $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1)
+DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) -I$(top_builddir)/poppler
+depcomp = $(SHELL) $(top_srcdir)/depcomp
+am__depfiles_maybe = depfiles
+am__mv = mv -f
+CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
+       $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)
+LTCXXCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \
+       $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) \
+       $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
+       $(AM_CXXFLAGS) $(CXXFLAGS)
+AM_V_CXX = $(am__v_CXX_@AM_V@)
+am__v_CXX_ = $(am__v_CXX_@AM_DEFAULT_V@)
+am__v_CXX_0 = @echo "  CXX   " $@;
+AM_V_at = $(am__v_at_@AM_V@)
+am__v_at_ = $(am__v_at_@AM_DEFAULT_V@)
+am__v_at_0 = @
+CXXLD = $(CXX)
+CXXLINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \
+       $(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \
+       $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
+AM_V_CXXLD = $(am__v_CXXLD_@AM_V@)
+am__v_CXXLD_ = $(am__v_CXXLD_@AM_DEFAULT_V@)
+am__v_CXXLD_0 = @echo "  CXXLD " $@;
+AM_V_GEN = $(am__v_GEN_@AM_V@)
+am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@)
+am__v_GEN_0 = @echo "  GEN   " $@;
+SOURCES = $(gtk_test_SOURCES) $(pdf_fullrewrite_SOURCES) \
+       $(pdf_inspector_SOURCES) $(perf_test_SOURCES)
+DIST_SOURCES = $(gtk_test_SOURCES) $(pdf_fullrewrite_SOURCES) \
+       $(pdf_inspector_SOURCES) $(perf_test_SOURCES)
+am__can_run_installinfo = \
+  case $$AM_UPDATE_INFO_DIR in \
+    n|no|NO) false;; \
+    *) (install-info --version) >/dev/null 2>&1;; \
+  esac
+ETAGS = etags
+CTAGS = ctags
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AR = @AR@
+AS = @AS@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CAIRO_CFLAGS = @CAIRO_CFLAGS@
+CAIRO_FEATURE = @CAIRO_FEATURE@
+CAIRO_LIBS = @CAIRO_LIBS@
+CAIRO_REQ = @CAIRO_REQ@
+CAIRO_VERSION = @CAIRO_VERSION@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CXX = @CXX@
+CXXCPP = @CXXCPP@
+CXXDEPMODE = @CXXDEPMODE@
+CXXFLAGS = @CXXFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DLLTOOL = @DLLTOOL@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+FGREP = @FGREP@
+FONTCONFIG_CFLAGS = @FONTCONFIG_CFLAGS@
+FONTCONFIG_LIBS = @FONTCONFIG_LIBS@
+FREETYPE_CFLAGS = @FREETYPE_CFLAGS@
+FREETYPE_CONFIG = @FREETYPE_CONFIG@
+FREETYPE_LIBS = @FREETYPE_LIBS@
+GLIB_MKENUMS = @GLIB_MKENUMS@
+GLIB_REQ = @GLIB_REQ@
+GLIB_REQUIRED = @GLIB_REQUIRED@
+GREP = @GREP@
+GTKDOC_CHECK = @GTKDOC_CHECK@
+GTKDOC_DEPS_CFLAGS = @GTKDOC_DEPS_CFLAGS@
+GTKDOC_DEPS_LIBS = @GTKDOC_DEPS_LIBS@
+GTKDOC_MKPDF = @GTKDOC_MKPDF@
+GTKDOC_REBASE = @GTKDOC_REBASE@
+GTK_TEST_CFLAGS = @GTK_TEST_CFLAGS@
+GTK_TEST_LIBS = @GTK_TEST_LIBS@
+HTML_DIR = @HTML_DIR@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+INTROSPECTION_CFLAGS = @INTROSPECTION_CFLAGS@
+INTROSPECTION_COMPILER = @INTROSPECTION_COMPILER@
+INTROSPECTION_GENERATE = @INTROSPECTION_GENERATE@
+INTROSPECTION_GIRDIR = @INTROSPECTION_GIRDIR@
+INTROSPECTION_LIBS = @INTROSPECTION_LIBS@
+INTROSPECTION_MAKEFILE = @INTROSPECTION_MAKEFILE@
+INTROSPECTION_SCANNER = @INTROSPECTION_SCANNER@
+INTROSPECTION_TYPELIBDIR = @INTROSPECTION_TYPELIBDIR@
+LCMS_CFLAGS = @LCMS_CFLAGS@
+LCMS_LIBS = @LCMS_LIBS@
+LD = @LD@
+LDFLAGS = @LDFLAGS@
+LIBCURL_CFLAGS = @LIBCURL_CFLAGS@
+LIBCURL_LIBS = @LIBCURL_LIBS@
+LIBICONV = @LIBICONV@
+LIBJPEG_CFLAGS = @LIBJPEG_CFLAGS@
+LIBJPEG_LIBS = @LIBJPEG_LIBS@
+LIBOBJS = @LIBOBJS@
+LIBOPENJPEG_CFLAGS = @LIBOPENJPEG_CFLAGS@
+LIBOPENJPEG_LIBS = @LIBOPENJPEG_LIBS@
+LIBPNG_CFLAGS = @LIBPNG_CFLAGS@
+LIBPNG_LIBS = @LIBPNG_LIBS@
+LIBS = @LIBS@
+LIBTIFF_CFLAGS = @LIBTIFF_CFLAGS@
+LIBTIFF_CFLAGSS = @LIBTIFF_CFLAGSS@
+LIBTIFF_LIBS = @LIBTIFF_LIBS@
+LIBTOOL = @LIBTOOL@
+LIPO = @LIPO@
+LN_S = @LN_S@
+LTLIBICONV = @LTLIBICONV@
+LTLIBOBJS = @LTLIBOBJS@
+MAKEINFO = @MAKEINFO@
+MANIFEST_TOOL = @MANIFEST_TOOL@
+MKDIR_P = @MKDIR_P@
+MOCQT4 = @MOCQT4@
+NM = @NM@
+NMEDIT = @NMEDIT@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+OTOOL = @OTOOL@
+OTOOL64 = @OTOOL64@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_URL = @PACKAGE_URL@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PC_REQUIRES = @PC_REQUIRES@
+PC_REQUIRES_PRIVATE = @PC_REQUIRES_PRIVATE@
+PDFTOCAIRO_CFLAGS = @PDFTOCAIRO_CFLAGS@
+PDFTOCAIRO_LIBS = @PDFTOCAIRO_LIBS@
+PKG_CONFIG = @PKG_CONFIG@
+PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@
+PKG_CONFIG_PATH = @PKG_CONFIG_PATH@
+POPPLER_DATADIR = @POPPLER_DATADIR@
+POPPLER_GLIB_CFLAGS = @POPPLER_GLIB_CFLAGS@
+POPPLER_GLIB_DISABLE_DEPRECATED = @POPPLER_GLIB_DISABLE_DEPRECATED@
+POPPLER_GLIB_DISABLE_SINGLE_INCLUDES = @POPPLER_GLIB_DISABLE_SINGLE_INCLUDES@
+POPPLER_GLIB_LIBS = @POPPLER_GLIB_LIBS@
+POPPLER_MAJOR_VERSION = @POPPLER_MAJOR_VERSION@
+POPPLER_MICRO_VERSION = @POPPLER_MICRO_VERSION@
+POPPLER_MINOR_VERSION = @POPPLER_MINOR_VERSION@
+POPPLER_QT4_CFLAGS = @POPPLER_QT4_CFLAGS@
+POPPLER_QT4_CXXFLAGS = @POPPLER_QT4_CXXFLAGS@
+POPPLER_QT4_LIBS = @POPPLER_QT4_LIBS@
+POPPLER_QT4_TEST_CFLAGS = @POPPLER_QT4_TEST_CFLAGS@
+POPPLER_QT4_TEST_LIBS = @POPPLER_QT4_TEST_LIBS@
+POPPLER_VERSION = @POPPLER_VERSION@
+PTHREAD_CC = @PTHREAD_CC@
+PTHREAD_CFLAGS = @PTHREAD_CFLAGS@
+PTHREAD_LIBS = @PTHREAD_LIBS@
+RANLIB = @RANLIB@
+SED = @SED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+TESTDATADIR = @TESTDATADIR@
+VERSION = @VERSION@
+XMKMF = @XMKMF@
+X_CFLAGS = @X_CFLAGS@
+X_EXTRA_LIBS = @X_EXTRA_LIBS@
+X_LIBS = @X_LIBS@
+X_PRE_LIBS = @X_PRE_LIBS@
+ZLIB_LIBS = @ZLIB_LIBS@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
+ac_ct_AR = @ac_ct_AR@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_CXX = @ac_ct_CXX@
+ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
+acx_pthread_config = @acx_pthread_config@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+auto_import_flags = @auto_import_flags@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+builddir = @builddir@
+create_shared_lib = @create_shared_lib@
+datadir = @datadir@
+datarootdir = @datarootdir@
+docdir = @docdir@
+dvidir = @dvidir@
+exec_prefix = @exec_prefix@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+htmldir = @htmldir@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localedir = @localedir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+srcdir = @srcdir@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+top_build_prefix = @top_build_prefix@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+win32_libs = @win32_libs@
+@BUILD_GTK_TEST_TRUE@@BUILD_SPLASH_OUTPUT_TRUE@splash_includes = \
+@BUILD_GTK_TEST_TRUE@@BUILD_SPLASH_OUTPUT_TRUE@        -I$(top_srcdir)/splash
+
+@BUILD_CAIRO_OUTPUT_TRUE@@BUILD_GTK_TEST_TRUE@pdf_inspector = \
+@BUILD_CAIRO_OUTPUT_TRUE@@BUILD_GTK_TEST_TRUE@ pdf_inspector
+
+@BUILD_CAIRO_OUTPUT_TRUE@@BUILD_GTK_TEST_TRUE@cairo_includes = \
+@BUILD_CAIRO_OUTPUT_TRUE@@BUILD_GTK_TEST_TRUE@ $(CAIRO_CFLAGS)                         \
+@BUILD_CAIRO_OUTPUT_TRUE@@BUILD_GTK_TEST_TRUE@ $(FREETYPE_CFLAGS)
+
+@BUILD_GTK_TEST_TRUE@gtk_test = \
+@BUILD_GTK_TEST_TRUE@  gtk-test
+
+@BUILD_SPLASH_OUTPUT_TRUE@perf_test = \
+@BUILD_SPLASH_OUTPUT_TRUE@     perf-test
+
+pdf_fullrewrite = \
+       pdf-fullrewrite
+
+INCLUDES = \
+       -I$(top_srcdir)                         \
+       -I$(top_srcdir)/poppler                 \
+       -I$(top_srcdir)/glib                    \
+       -I$(top_builddir)/glib                  \
+       $(cairo_includes)                       \
+       $(GTK_TEST_CFLAGS)                      \
+       $(FONTCONFIG_CFLAGS)
+
+AM_LDFLAGS = @auto_import_flags@
+gtk_test_SOURCES = \
+       gtk-test.cc
+
+gtk_test_LDADD = \
+       $(top_builddir)/poppler/libpoppler.la           \
+       $(top_builddir)/glib/libpoppler-glib.la         \
+       $(CAIRO_LIBS)                                   \
+       $(GTK_TEST_LIBS)                                \
+       $(FONTCONFIG_LIBS)
+
+pdf_inspector_SOURCES = \
+       pdf-inspector.cc
+
+pdf_inspector_LDADD = \
+       $(top_builddir)/poppler/libpoppler-cairo.la     \
+       $(top_builddir)/poppler/libpoppler.la           \
+       $(CAIRO_LIBS)                                   \
+       $(FREETYPE_LIBS)                                \
+       $(GTK_TEST_LIBS)                                \
+       $(X_EXTRA_LIBS)
+
+perf_test_SOURCES = \
+       perf-test.cc                     \
+       perf-test-preview-dummy.cc
+
+perf_test_LDADD = \
+       $(top_builddir)/poppler/libpoppler.la   \
+       $(FREETYPE_LIBS)                                        \
+       $(X_EXTRA_LIBS)
+
+pdf_fullrewrite_SOURCES = \
+       pdf-fullrewrite.cc
+
+pdf_fullrewrite_LDADD = \
+       $(top_builddir)/poppler/libpoppler.la
+
+EXTRA_DIST = \
+       pdf-operators.c                         \
+       pdf-inspector.ui
+
+all: all-am
+
+.SUFFIXES:
+.SUFFIXES: .cc .lo .o .obj
+$(srcdir)/Makefile.in:  $(srcdir)/Makefile.am  $(am__configure_deps)
+       @for dep in $?; do \
+         case '$(am__configure_deps)' in \
+           *$$dep*) \
+             ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
+               && { if test -f $@; then exit 0; else break; fi; }; \
+             exit 1;; \
+         esac; \
+       done; \
+       echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign test/Makefile'; \
+       $(am__cd) $(top_srcdir) && \
+         $(AUTOMAKE) --foreign test/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+       @case '$?' in \
+         *config.status*) \
+           cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+         *) \
+           echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+           cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+       esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+       cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure:  $(am__configure_deps)
+       cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4):  $(am__aclocal_m4_deps)
+       cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(am__aclocal_m4_deps):
+
+clean-noinstPROGRAMS:
+       @list='$(noinst_PROGRAMS)'; test -n "$$list" || exit 0; \
+       echo " rm -f" $$list; \
+       rm -f $$list || exit $$?; \
+       test -n "$(EXEEXT)" || exit 0; \
+       list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \
+       echo " rm -f" $$list; \
+       rm -f $$list
+gtk-test$(EXEEXT): $(gtk_test_OBJECTS) $(gtk_test_DEPENDENCIES) $(EXTRA_gtk_test_DEPENDENCIES) 
+       @rm -f gtk-test$(EXEEXT)
+       $(AM_V_CXXLD)$(CXXLINK) $(gtk_test_OBJECTS) $(gtk_test_LDADD) $(LIBS)
+pdf-fullrewrite$(EXEEXT): $(pdf_fullrewrite_OBJECTS) $(pdf_fullrewrite_DEPENDENCIES) $(EXTRA_pdf_fullrewrite_DEPENDENCIES) 
+       @rm -f pdf-fullrewrite$(EXEEXT)
+       $(AM_V_CXXLD)$(CXXLINK) $(pdf_fullrewrite_OBJECTS) $(pdf_fullrewrite_LDADD) $(LIBS)
+pdf_inspector$(EXEEXT): $(pdf_inspector_OBJECTS) $(pdf_inspector_DEPENDENCIES) $(EXTRA_pdf_inspector_DEPENDENCIES) 
+       @rm -f pdf_inspector$(EXEEXT)
+       $(AM_V_CXXLD)$(CXXLINK) $(pdf_inspector_OBJECTS) $(pdf_inspector_LDADD) $(LIBS)
+perf-test$(EXEEXT): $(perf_test_OBJECTS) $(perf_test_DEPENDENCIES) $(EXTRA_perf_test_DEPENDENCIES) 
+       @rm -f perf-test$(EXEEXT)
+       $(AM_V_CXXLD)$(CXXLINK) $(perf_test_OBJECTS) $(perf_test_LDADD) $(LIBS)
+
+mostlyclean-compile:
+       -rm -f *.$(OBJEXT)
+
+distclean-compile:
+       -rm -f *.tab.c
+
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gtk-test.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pdf-fullrewrite.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pdf-inspector.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/perf-test-preview-dummy.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/perf-test.Po@am__quote@
+
+.cc.o:
+@am__fastdepCXX_TRUE@  $(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
+@am__fastdepCXX_TRUE@  $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ $<
+
+.cc.obj:
+@am__fastdepCXX_TRUE@  $(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'`
+@am__fastdepCXX_TRUE@  $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
+
+.cc.lo:
+@am__fastdepCXX_TRUE@  $(AM_V_CXX)$(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
+@am__fastdepCXX_TRUE@  $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     $(AM_V_CXX)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LTCXXCOMPILE) -c -o $@ $<
+
+mostlyclean-libtool:
+       -rm -f *.lo
+
+clean-libtool:
+       -rm -rf .libs _libs
+
+ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
+       list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+       unique=`for i in $$list; do \
+           if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+         done | \
+         $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
+             END { if (nonempty) { for (i in files) print i; }; }'`; \
+       mkid -fID $$unique
+tags: TAGS
+
+TAGS:  $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
+               $(TAGS_FILES) $(LISP)
+       set x; \
+       here=`pwd`; \
+       list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
+       unique=`for i in $$list; do \
+           if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+         done | \
+         $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
+             END { if (nonempty) { for (i in files) print i; }; }'`; \
+       shift; \
+       if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
+         test -n "$$unique" || unique=$$empty_fix; \
+         if test $$# -gt 0; then \
+           $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+             "$$@" $$unique; \
+         else \
+           $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+             $$unique; \
+         fi; \
+       fi
+ctags: CTAGS
+CTAGS:  $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
+               $(TAGS_FILES) $(LISP)
+       list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
+       unique=`for i in $$list; do \
+           if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+         done | \
+         $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
+             END { if (nonempty) { for (i in files) print i; }; }'`; \
+       test -z "$(CTAGS_ARGS)$$unique" \
+         || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+            $$unique
+
+GTAGS:
+       here=`$(am__cd) $(top_builddir) && pwd` \
+         && $(am__cd) $(top_srcdir) \
+         && gtags -i $(GTAGS_ARGS) "$$here"
+
+distclean-tags:
+       -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+
+distdir: $(DISTFILES)
+       @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+       topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+       list='$(DISTFILES)'; \
+         dist_files=`for file in $$list; do echo $$file; done | \
+         sed -e "s|^$$srcdirstrip/||;t" \
+             -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+       case $$dist_files in \
+         */*) $(MKDIR_P) `echo "$$dist_files" | \
+                          sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+                          sort -u` ;; \
+       esac; \
+       for file in $$dist_files; do \
+         if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+         if test -d $$d/$$file; then \
+           dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+           if test -d "$(distdir)/$$file"; then \
+             find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+           fi; \
+           if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+             cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
+             find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+           fi; \
+           cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
+         else \
+           test -f "$(distdir)/$$file" \
+           || cp -p $$d/$$file "$(distdir)/$$file" \
+           || exit 1; \
+         fi; \
+       done
+check-am: all-am
+check: check-am
+all-am: Makefile $(PROGRAMS)
+installdirs:
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+       @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+       if test -z '$(STRIP)'; then \
+         $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+           install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+             install; \
+       else \
+         $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+           install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+           "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
+       fi
+mostlyclean-generic:
+
+clean-generic:
+
+distclean-generic:
+       -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+       -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
+
+maintainer-clean-generic:
+       @echo "This command is intended for maintainers to use"
+       @echo "it deletes files that may require special tools to rebuild."
+clean: clean-am
+
+clean-am: clean-generic clean-libtool clean-noinstPROGRAMS \
+       mostlyclean-am
+
+distclean: distclean-am
+       -rm -rf ./$(DEPDIR)
+       -rm -f Makefile
+distclean-am: clean-am distclean-compile distclean-generic \
+       distclean-tags
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+html-am:
+
+info: info-am
+
+info-am:
+
+install-data-am:
+
+install-dvi: install-dvi-am
+
+install-dvi-am:
+
+install-exec-am:
+
+install-html: install-html-am
+
+install-html-am:
+
+install-info: install-info-am
+
+install-info-am:
+
+install-man:
+
+install-pdf: install-pdf-am
+
+install-pdf-am:
+
+install-ps: install-ps-am
+
+install-ps-am:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+       -rm -rf ./$(DEPDIR)
+       -rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-compile mostlyclean-generic \
+       mostlyclean-libtool
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am:
+
+.MAKE: install-am install-strip
+
+.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \
+       clean-libtool clean-noinstPROGRAMS ctags distclean \
+       distclean-compile distclean-generic distclean-libtool \
+       distclean-tags distdir dvi dvi-am html html-am info info-am \
+       install install-am install-data install-data-am install-dvi \
+       install-dvi-am install-exec install-exec-am install-html \
+       install-html-am install-info install-info-am install-man \
+       install-pdf install-pdf-am install-ps install-ps-am \
+       install-strip installcheck installcheck-am installdirs \
+       maintainer-clean maintainer-clean-generic mostlyclean \
+       mostlyclean-compile mostlyclean-generic mostlyclean-libtool \
+       pdf pdf-am ps ps-am tags uninstall uninstall-am
+
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/test/gtk-test.cc b/test/gtk-test.cc
new file mode 100644 (file)
index 0000000..dd339fb
--- /dev/null
@@ -0,0 +1,397 @@
+#include <config.h>
+
+#ifdef USE_GCC_PRAGMAS
+#pragma implementation
+#endif
+
+#include <goo/gmem.h>
+#include <splash/SplashTypes.h>
+#include <splash/SplashBitmap.h>
+#include "Object.h"
+#include "SplashOutputDev.h"
+#include "GfxState.h"
+
+#include <gdk/gdk.h>
+
+#include "PDFDoc.h"
+#include "GlobalParams.h"
+#include "ErrorCodes.h"
+#include <poppler.h>
+#include <poppler-private.h>
+#include <gtk/gtk.h>
+#include <math.h>
+
+static int page = 0;
+static gboolean cairo_output = FALSE;
+static gboolean splash_output = FALSE;
+static const char **file_arguments = NULL;
+static const GOptionEntry options[] = {
+  { "cairo", 'c', 0, G_OPTION_ARG_NONE, &cairo_output, "Cairo Output Device", NULL},
+  { "splash", 's', 0, G_OPTION_ARG_NONE, &splash_output, "Splash Output Device", NULL},
+  { "page", 'p', 0, G_OPTION_ARG_INT, &page, "Page number", "PAGE" },
+  { G_OPTION_REMAINING, 0, 0, G_OPTION_ARG_FILENAME_ARRAY, &file_arguments, NULL, "PDF-FILES…" },
+  { NULL }
+};
+
+static GList *view_list = NULL;
+
+//------------------------------------------------------------------------
+
+#define xOutMaxRGBCube 6       // max size of RGB color cube
+
+//------------------------------------------------------------------------
+// GDKSplashOutputDev
+//------------------------------------------------------------------------
+
+class GDKSplashOutputDev: public SplashOutputDev {
+public:
+
+  GDKSplashOutputDev(GdkScreen *screen,
+                     void (*redrawCbkA)(void *data),
+                     void *redrawCbkDataA, SplashColor sc);
+  
+  virtual ~GDKSplashOutputDev();
+
+  //----- initialization and control
+
+  // End a page.
+  virtual void endPage();
+
+  // Dump page contents to display.
+  virtual void dump();
+
+  //----- update text state
+  virtual void updateFont(GfxState *state);
+
+  //----- special access
+
+  // Clear out the document (used when displaying an empty window).
+  void clear();
+
+  // Copy the rectangle (srcX, srcY, width, height) to (destX, destY)
+  // in destDC.
+  void redraw(int srcX, int srcY,
+              cairo_t *cr,
+             int destX, int destY,
+             int width, int height);
+
+private:
+
+  int incrementalUpdate;
+  void (*redrawCbk)(void *data);
+  void *redrawCbkData;
+};
+
+typedef struct
+{
+  PopplerDocument    *doc;
+  GtkWidget          *drawing_area;
+  GtkWidget          *spin_button;
+  cairo_surface_t    *surface;
+  GDKSplashOutputDev *out;
+} View;
+
+//------------------------------------------------------------------------
+// Constants and macros
+//------------------------------------------------------------------------
+
+#define xoutRound(x) ((int)(x + 0.5))
+
+//------------------------------------------------------------------------
+// GDKSplashOutputDev
+//------------------------------------------------------------------------
+
+GDKSplashOutputDev::GDKSplashOutputDev(GdkScreen *screen,
+                                       void (*redrawCbkA)(void *data),
+                                       void *redrawCbkDataA, SplashColor sc):
+  SplashOutputDev(splashModeRGB8, 4, gFalse, sc),
+  incrementalUpdate (1)
+{
+  redrawCbk = redrawCbkA;
+  redrawCbkData = redrawCbkDataA;
+}
+
+GDKSplashOutputDev::~GDKSplashOutputDev() {
+}
+
+void GDKSplashOutputDev::clear() {
+  startDoc(NULL);
+  startPage(0, NULL);
+}
+
+void GDKSplashOutputDev::endPage() {
+  SplashOutputDev::endPage();
+  if (!incrementalUpdate) {
+    (*redrawCbk)(redrawCbkData);
+  }
+}
+
+void GDKSplashOutputDev::dump() {
+  if (incrementalUpdate && redrawCbk) {
+    (*redrawCbk)(redrawCbkData);
+  }
+}
+
+void GDKSplashOutputDev::updateFont(GfxState *state) {
+  SplashOutputDev::updateFont(state);
+}
+
+void GDKSplashOutputDev::redraw(int srcX, int srcY,
+                                cairo_t *cr,
+                                int destX, int destY,
+                                int width, int height) {
+  GdkPixbuf *pixbuf;
+  int gdk_rowstride;
+
+  gdk_rowstride = getBitmap()->getRowSize();
+  pixbuf = gdk_pixbuf_new_from_data (getBitmap()->getDataPtr() + srcY * gdk_rowstride + srcX * 3,
+                                     GDK_COLORSPACE_RGB, FALSE, 8,
+                                     width, height, gdk_rowstride,
+                                     NULL, NULL);
+
+  gdk_cairo_set_source_pixbuf (cr, pixbuf, 0, 0);
+  cairo_paint (cr);
+
+  g_object_unref (pixbuf);
+}
+
+static gboolean
+drawing_area_expose (GtkWidget      *drawing_area,
+                     GdkEventExpose *event,
+                     View           *view)
+{
+  cairo_t *cr;
+  GdkRectangle document;
+  GdkRectangle draw;
+
+  gdk_window_clear (drawing_area->window);
+
+  document.x = 0;
+  document.y = 0;
+  if (cairo_output) {
+    document.width = cairo_image_surface_get_width (view->surface);
+    document.height = cairo_image_surface_get_height (view->surface);
+  } else {
+    document.width = view->out->getBitmapWidth();
+    document.height = view->out->getBitmapHeight();
+  }
+
+  cr = gdk_cairo_create (drawing_area->window);
+  if (!gdk_rectangle_intersect (&document, &event->area, &draw))
+    return FALSE;
+
+  if (cairo_output) {
+    cairo_set_source_surface (cr, view->surface, 0, 0);
+    cairo_paint (cr);
+  } else {
+    view->out->redraw (draw.x, draw.y,
+                       cr,
+                       draw.x, draw.y,
+                       draw.width, draw.height);
+  }
+
+  cairo_destroy (cr);
+
+  return TRUE;
+}
+
+static void
+view_set_page (View *view, int page)
+{
+  int w, h;
+
+  if (cairo_output) {
+    cairo_t     *cr;
+    double       width, height;
+    PopplerPage *poppler_page;
+
+    poppler_page = poppler_document_get_page (view->doc, page);
+    poppler_page_get_size (poppler_page, &width, &height);
+    w = (int) ceil(width);
+    h = (int) ceil(height);
+
+    if (view->surface)
+      cairo_surface_destroy (view->surface);
+    view->surface = cairo_image_surface_create (CAIRO_FORMAT_ARGB32, w, h);
+
+    cr = cairo_create (view->surface);
+    poppler_page_render (poppler_page, cr);
+
+    cairo_set_operator (cr, CAIRO_OPERATOR_DEST_OVER);
+    cairo_set_source_rgb (cr, 1., 1., 1.);
+    cairo_paint (cr);
+
+    cairo_destroy (cr);
+    g_object_unref (poppler_page);
+  } else {
+    view->doc->doc->displayPage (view->out, page + 1, 72, 72, 0, gFalse, gTrue, gTrue);
+    w = view->out->getBitmapWidth();
+    h = view->out->getBitmapHeight();
+  }
+
+  gtk_widget_set_size_request (view->drawing_area, w, h);
+  gtk_widget_queue_draw (view->drawing_area);
+  gtk_spin_button_set_value (GTK_SPIN_BUTTON (view->spin_button), page);
+}
+
+static void
+redraw_callback (void *data)
+{
+  View *view = (View*) data;
+
+  gtk_widget_queue_draw (view->drawing_area);
+}
+
+static void
+view_free (View *view)
+{
+  if (G_UNLIKELY (!view))
+    return;
+
+  g_object_unref (view->doc);
+  delete view->out;
+  cairo_surface_destroy (view->surface);
+  g_slice_free (View, view);
+}
+
+static void
+destroy_window_callback (GtkWindow *window, View *view)
+{
+  view_list = g_list_remove (view_list, view);
+  view_free (view);
+
+  if (!view_list)
+    gtk_main_quit ();
+}
+
+static void
+page_changed_callback (GtkSpinButton *button, View *view)
+{
+  int page;
+
+  page = gtk_spin_button_get_value_as_int (button);
+  view_set_page (view, page);
+}
+
+static View *
+view_new (PopplerDocument *doc)
+{
+  View *view;
+  GtkWidget *window;
+  GtkWidget *sw;
+  GtkWidget *vbox, *hbox;
+  guint n_pages;
+
+  view = g_slice_new0 (View);
+
+  view->doc = doc;
+
+  window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
+  g_signal_connect (window, "destroy",
+                    G_CALLBACK (destroy_window_callback),
+                    view);
+
+  vbox = gtk_vbox_new (FALSE, 5);
+
+  view->drawing_area = gtk_drawing_area_new ();
+  sw = gtk_scrolled_window_new (NULL, NULL);
+  gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (sw),
+                                  GTK_POLICY_AUTOMATIC,
+                                  GTK_POLICY_AUTOMATIC);
+  gtk_scrolled_window_add_with_viewport (GTK_SCROLLED_WINDOW (sw),
+                                         view->drawing_area);
+  gtk_widget_show (view->drawing_area);
+
+  gtk_box_pack_end (GTK_BOX (vbox), sw, TRUE, TRUE, 0);
+  gtk_widget_show (sw);
+
+  hbox = gtk_hbox_new (FALSE, 5);
+
+  n_pages = poppler_document_get_n_pages (doc);
+  view->spin_button = gtk_spin_button_new_with_range  (0, n_pages - 1, 1);
+  g_signal_connect (view->spin_button, "value-changed",
+                    G_CALLBACK (page_changed_callback), view);
+
+  gtk_box_pack_end (GTK_BOX (hbox), view->spin_button, FALSE, TRUE, 0);
+  gtk_widget_show (view->spin_button);
+
+  gtk_box_pack_end (GTK_BOX (vbox), hbox, FALSE, TRUE, 0);
+  gtk_widget_show (hbox);
+
+  gtk_container_add (GTK_CONTAINER (window), vbox);
+  gtk_widget_show (vbox);
+
+  gtk_widget_show (window);
+
+
+  if (!cairo_output) {
+    SplashColor sc = { 255, 255, 255};
+
+    view->out = new GDKSplashOutputDev (gtk_widget_get_screen (window),
+                                        redraw_callback, (void*) view, sc);
+    view->out->startDoc(view->doc->doc);
+  }
+
+  g_signal_connect (view->drawing_area,
+                    "expose_event",
+                    G_CALLBACK (drawing_area_expose),
+                    view);
+
+  return view;
+}
+
+int
+main (int argc, char *argv [])
+{
+  GOptionContext *ctx;
+
+  if (argc == 1) {
+    char *basename = g_path_get_basename (argv[0]);
+
+    g_printerr ("usage: %s PDF-FILES…\n", basename);
+    g_free (basename);
+
+    return -1;
+  }
+
+  ctx = g_option_context_new (NULL);
+  g_option_context_add_main_entries (ctx, options, "main");
+  g_option_context_parse (ctx, &argc, &argv, NULL);
+  g_option_context_free (ctx);
+
+  gtk_init (&argc, &argv);
+
+  globalParams = new GlobalParams();
+
+  for (int i = 0; file_arguments[i]; i++) {
+    View            *view;
+    GFile           *file;
+    gchar           *uri;
+    PopplerDocument *doc;
+    GError          *error = NULL;
+
+    file = g_file_new_for_commandline_arg (file_arguments[i]);
+    uri = g_file_get_uri (file);
+    g_object_unref (file);
+
+    doc = poppler_document_new_from_file (uri, NULL, &error);
+    if (!doc) {
+      g_printerr ("Error opening document %s: %s\n", uri, error->message);
+      g_error_free (error);
+      g_free (uri);
+
+      continue;
+    }
+
+    view = view_new (doc);
+    view_list = g_list_prepend (view_list, view);
+    view_set_page (view, CLAMP (page, 0, poppler_document_get_n_pages (doc) - 1));
+    g_free (uri);
+  }
+
+  gtk_main ();
+
+  delete globalParams;
+
+  return 0;
+}
diff --git a/test/pdf-fullrewrite.cc b/test/pdf-fullrewrite.cc
new file mode 100644 (file)
index 0000000..9658e55
--- /dev/null
@@ -0,0 +1,46 @@
+//========================================================================
+//
+// pdf-fullrewrite.cc
+//
+// Copyright 2007 Julien Rebetez
+//
+//========================================================================
+#include "config.h"
+#include <poppler-config.h>
+#include "GlobalParams.h"
+#include "Error.h"
+#include "PDFDoc.h"
+#include "goo/GooString.h"
+
+int main (int argc, char *argv[])
+{
+  PDFDoc *doc;
+  GooString *inputName, *outputName;
+
+  // parse args
+  if (argc < 3) {
+    fprintf(stderr, "usage: %s INPUT-FILE OUTPUT-FILE\n", argv[0]);
+    return 1;
+  }
+
+  inputName = new GooString(argv[1]);
+  outputName = new GooString(argv[2]);
+
+  globalParams = new GlobalParams();
+
+  doc = new PDFDoc(inputName);
+
+  if (!doc->isOk()) {
+    delete doc;
+    fprintf(stderr, "Error loading document !\n");
+    return 1;
+  }
+
+
+  int res = doc->saveAs(outputName, writeForceRewrite);
+
+  delete doc;
+  delete globalParams;
+  delete outputName;
+  return res;
+}
diff --git a/test/pdf-inspector.cc b/test/pdf-inspector.cc
new file mode 100644 (file)
index 0000000..5598db6
--- /dev/null
@@ -0,0 +1,374 @@
+//========================================================================
+//
+// GDKSplashOutputDev.cc
+//
+// Copyright 2003 Glyph & Cog, LLC
+// Copyright 2004 Red Hat, Inc. (GDK port)
+//
+//========================================================================
+
+#include <config.h>
+
+#ifdef USE_GCC_PRAGMAS
+#pragma implementation
+#endif
+
+#include <goo/gmem.h>
+#include <goo/GooHash.h>
+#include <goo/GooTimer.h>
+#include <splash/SplashTypes.h>
+#include <splash/SplashBitmap.h>
+#include "Object.h"
+#include "ProfileData.h"
+#include "GfxState.h"
+
+#include <gdk/gdk.h>
+#include "CairoOutputDev.h"
+
+#include "PDFDoc.h"
+#include "GlobalParams.h"
+#include "ErrorCodes.h"
+#include <gtk/gtk.h>
+
+
+// Mapping
+#include "pdf-operators.c"
+
+enum {
+  OP_STRING,
+  OP_COUNT,
+  OP_TOTAL,
+  OP_MIN,
+  OP_MAX,
+  N_COLUMNS
+};
+
+class PdfInspector {
+public:
+
+  PdfInspector(void);
+
+  void set_file_name (const char *file_name);
+  void load (const char *file_name);
+  void run (void);
+  void error_dialog (const char *error_message);
+  void analyze_page (int page);
+
+private:
+  static void on_file_activated (GtkWidget *widget, PdfInspector *inspector);
+  static void on_selection_changed (GtkTreeSelection *selection, PdfInspector *inspector);
+  static void on_analyze_clicked (GtkWidget *widget, PdfInspector *inspector);
+
+  GtkBuilder* builder;
+  GtkTreeModel *model;
+  PDFDoc *doc;
+  CairoOutputDev *output;
+};
+
+
+
+PdfInspector::PdfInspector(void)
+{
+  GtkWidget *widget;
+  GError* error = NULL;
+  
+  builder = gtk_builder_new ();
+
+  if (!gtk_builder_add_from_file (builder, "./pdf-inspector.ui", &error))
+  {
+    g_warning ("Couldn't load builder file: %s", error->message);
+    g_error_free (error);
+  }
+
+  widget = GTK_WIDGET (gtk_builder_get_object (builder, "pdf_file_chooser_button"));
+  g_signal_connect (widget, "selection-changed", G_CALLBACK (on_file_activated), this);
+
+  widget = GTK_WIDGET (gtk_builder_get_object (builder, "analyze_button"));
+  g_signal_connect (widget, "clicked", G_CALLBACK (on_analyze_clicked), this);
+
+  // setup the TreeView 
+  widget = GTK_WIDGET (gtk_builder_get_object (builder, "pdf_tree_view"));
+  g_signal_connect (gtk_tree_view_get_selection (GTK_TREE_VIEW (widget)),
+                   "changed", G_CALLBACK (on_selection_changed), this);
+  model = (GtkTreeModel *)gtk_list_store_new (N_COLUMNS, G_TYPE_STRING, G_TYPE_INT,
+                                             G_TYPE_DOUBLE, G_TYPE_DOUBLE, G_TYPE_DOUBLE);
+  gtk_tree_view_set_model (GTK_TREE_VIEW (widget), model);
+  gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (widget),
+                                              0, "Operation", 
+                                              gtk_cell_renderer_text_new (),
+                                              "text", OP_STRING,
+                                              NULL);
+
+  gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (widget),
+                                              1, "Count", 
+                                              gtk_cell_renderer_text_new (),
+                                              "text", OP_COUNT,
+                                              NULL);
+
+  gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (widget),
+                                              2, "Elapsed", 
+                                              gtk_cell_renderer_text_new (),
+                                              "text", OP_TOTAL,
+                                              NULL);
+
+  gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (widget),
+                                              3, "Min", 
+                                              gtk_cell_renderer_text_new (),
+                                              "text", OP_MIN,
+                                              NULL);
+
+  gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (widget),
+                                              4, "Max", 
+                                              gtk_cell_renderer_text_new (),
+                                              "text", OP_MAX,
+                                              NULL);
+
+  for (int i = 0; i < N_COLUMNS; i++)
+    {
+      GtkTreeViewColumn *column;
+      
+      column = gtk_tree_view_get_column (GTK_TREE_VIEW (widget), i);
+      gtk_tree_view_column_set_sort_column_id (column, i);
+    }
+  doc = NULL;
+  output = new CairoOutputDev();
+  output->setPrinting (gFalse);
+
+  // set up initial widgets
+  load (NULL);
+}
+    
+void
+PdfInspector::set_file_name(const char *file_name)
+{
+  GtkWidget *widget;
+
+  widget = GTK_WIDGET (gtk_builder_get_object (builder, "pdf_file_chooser_button"));
+  gtk_file_chooser_set_filename (GTK_FILE_CHOOSER (widget), file_name);
+}
+
+void
+PdfInspector::on_file_activated (GtkWidget *widget, PdfInspector *inspector)
+{
+  gchar *file_name;
+
+  file_name = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (widget));
+  if (file_name)
+    inspector->load (file_name);
+
+  g_free (file_name);
+}
+
+void
+PdfInspector::on_selection_changed (GtkTreeSelection *selection, PdfInspector *inspector)
+{
+  GtkWidget *label;
+  size_t i;
+  GtkTreeModel *model;
+  GtkTreeIter iter;
+  gchar *op = NULL;
+
+  label = GTK_WIDGET (gtk_builder_get_object (inspector->builder, "description_label"));
+  gtk_label_set_markup (GTK_LABEL (label), "<i>No Description</i>");
+
+  if (gtk_tree_selection_get_selected (selection, &model, &iter))
+    {
+      gtk_tree_model_get (model, &iter,
+                         OP_STRING, &op,
+                         -1);
+
+    }
+
+  if (op == NULL)
+    return;
+
+  for (i = 0; i < G_N_ELEMENTS (op_mapping); i++)
+    {
+
+      if (!strcmp (op, op_mapping[i].op))
+       {
+         gchar *text;
+         text = g_strdup_printf ("<i>%s</i>", op_mapping[i].description);
+         gtk_label_set_markup (GTK_LABEL (label), text);
+         g_free (text);
+         break;
+       }
+    }
+
+  g_free (op);  
+}
+
+void
+PdfInspector::on_analyze_clicked (GtkWidget *widget, PdfInspector *inspector)
+{
+  GtkWidget *spin;
+  int page;
+
+  spin = GTK_WIDGET (gtk_builder_get_object (inspector->builder, "pdf_spin"));
+
+  page = (int) gtk_spin_button_get_value (GTK_SPIN_BUTTON (spin));
+
+  inspector->analyze_page (page);
+
+}
+
+void
+PdfInspector::analyze_page (int page)
+{
+  GooHashIter *iter;
+  GooHash *hash;
+  GooString *key;
+  void *p;
+  GtkWidget *label;
+  char *text;
+  cairo_t *cr;
+  cairo_surface_t *surface;
+
+  label = GTK_WIDGET (gtk_builder_get_object (builder, "pdf_total_label"));
+
+  output->startProfile ();
+  gtk_list_store_clear (GTK_LIST_STORE (model));
+
+  GooTimer timer;
+  surface = cairo_image_surface_create (CAIRO_FORMAT_RGB24,
+                                       doc->getPageCropWidth(page + 1),
+                                       doc->getPageCropHeight(page + 1));
+  cr = cairo_create (surface);
+  cairo_surface_destroy (surface);
+  output->setCairo (cr);
+  cairo_destroy (cr);
+  doc->displayPage (output, page + 1, 72, 72, 0, gFalse, gTrue, gFalse);
+  output->setCairo (NULL);
+
+  // Total time;
+  text = g_strdup_printf ("%g", timer.getElapsed ());
+  gtk_label_set_text (GTK_LABEL (label), text);
+  g_free (text);
+
+  // Individual times;
+  hash = output->endProfile ();
+  hash->startIter(&iter);
+  while (hash->getNext(&iter, &key, &p))
+    {
+      GtkTreeIter tree_iter;
+      ProfileData *data_p = (ProfileData *) p;
+
+      gtk_list_store_append (GTK_LIST_STORE (model), &tree_iter);
+      gtk_list_store_set (GTK_LIST_STORE (model), &tree_iter,
+                         OP_STRING, key->getCString(),
+                         OP_COUNT, data_p->getCount (),
+                         OP_TOTAL, data_p->getTotal (),
+                         OP_MIN, data_p->getMin (),
+                         OP_MAX, data_p->getMax (),
+                         -1);
+    }
+  hash->killIter(&iter);
+  deleteGooHash (hash, ProfileData);
+}
+void
+PdfInspector::load(const char *file_name)
+{
+  GtkWidget *spin;
+  GtkWidget *button;
+  GtkWidget *label;
+
+  // kill the old PDF file
+  if (doc != NULL)
+    {
+      delete doc;
+      doc = NULL;
+    }
+
+  // load the new file
+  if (file_name)
+    {
+      GooString *filename_g;
+
+      filename_g = new GooString (file_name);
+      doc = new PDFDoc(filename_g, 0, 0);
+      delete filename_g;
+    }
+  
+  if (doc && !doc->isOk())
+    {
+      this->error_dialog ("Failed to load file.");
+      delete doc;
+      doc = NULL;
+    }
+
+  spin = GTK_WIDGET (gtk_builder_get_object (builder, "pdf_spin"));
+  button = GTK_WIDGET (gtk_builder_get_object (builder, "analyze_button"));
+  label = GTK_WIDGET (gtk_builder_get_object (builder, "pdf_total_label"));
+  gtk_label_set_text (GTK_LABEL (label), "");
+
+  if (doc)
+    {
+      gtk_widget_set_sensitive (spin, TRUE);
+      gtk_widget_set_sensitive (button, TRUE);
+      gtk_widget_set_sensitive (label, TRUE);
+      gtk_spin_button_set_range (GTK_SPIN_BUTTON (spin), 0, doc->getNumPages()-1);
+      gtk_spin_button_set_value (GTK_SPIN_BUTTON (spin), 0);
+
+      output->startDoc (doc);
+    }
+  else
+    {      
+      gtk_widget_set_sensitive (spin, FALSE);
+      gtk_widget_set_sensitive (button, FALSE);
+      gtk_widget_set_sensitive (label, FALSE);
+    }
+}
+
+void
+PdfInspector::error_dialog (const char *error_message)
+{
+  g_warning ("%s", error_message);
+}
+
+void
+PdfInspector::run()
+{
+  GtkWidget *dialog;
+
+  dialog = GTK_WIDGET (gtk_builder_get_object (builder, "pdf_dialog"));
+
+  gtk_dialog_run (GTK_DIALOG (dialog));
+}
+
+
+
+int
+main (int argc, char *argv [])
+{
+  const char *file_name = NULL;
+  PdfInspector *inspector;
+  
+  gtk_init (&argc, &argv);
+  
+  globalParams = new GlobalParams();
+  globalParams->setProfileCommands (true);
+  globalParams->setPrintCommands (true);
+
+  if (argc == 2)
+    file_name = argv[1];
+  else if (argc > 2)
+    {
+      fprintf (stderr, "usage: %s [PDF-FILE]\n", argv[0]);
+      return -1;
+    }
+
+  inspector = new PdfInspector ();
+
+  if (file_name)
+    inspector->set_file_name (file_name);
+
+  inspector->run ();
+
+  delete inspector;
+  delete globalParams;
+  
+  return 0;
+}
+
+
diff --git a/test/pdf-inspector.ui b/test/pdf-inspector.ui
new file mode 100644 (file)
index 0000000..8e20b2f
--- /dev/null
@@ -0,0 +1,416 @@
+<?xml version="1.0"?>
+<!--*- mode: xml -*-->
+<interface>
+  <object class="GtkAdjustment" id="adjustment1">
+    <property name="upper">100</property>
+    <property name="lower">0</property>
+    <property name="page_increment">10</property>
+    <property name="step_increment">1</property>
+    <property name="page_size">10</property>
+    <property name="value">1</property>
+  </object>
+  <object class="GtkDialog" id="pdf_dialog">
+    <property name="border_width">6</property>
+    <property name="visible">True</property>
+    <property name="title" translatable="yes">PDF Inspector</property>
+    <property name="type">GTK_WINDOW_TOPLEVEL</property>
+    <property name="window_position">GTK_WIN_POS_NONE</property>
+    <property name="modal">False</property>
+    <property name="default_width">600</property>
+    <property name="default_height">400</property>
+    <property name="resizable">True</property>
+    <property name="destroy_with_parent">False</property>
+    <property name="decorated">True</property>
+    <property name="skip_taskbar_hint">False</property>
+    <property name="skip_pager_hint">False</property>
+    <property name="type_hint">GDK_WINDOW_TYPE_HINT_DIALOG</property>
+    <property name="gravity">GDK_GRAVITY_NORTH_WEST</property>
+    <property name="focus_on_map">True</property>
+    <property name="has_separator">False</property>
+    <child internal-child="vbox">
+      <object class="GtkVBox" id="dialog-vbox1">
+        <property name="visible">True</property>
+        <property name="homogeneous">False</property>
+        <property name="spacing">12</property>
+        <child internal-child="action_area">
+          <object class="GtkHButtonBox" id="dialog-action_area1">
+            <property name="visible">True</property>
+            <property name="layout_style">GTK_BUTTONBOX_END</property>
+            <child>
+              <object class="GtkButton" id="closebutton1">
+                <property name="visible">True</property>
+                <property name="can_default">True</property>
+                <property name="can_focus">True</property>
+                <property name="label">gtk-close</property>
+                <property name="use_stock">True</property>
+                <property name="relief">GTK_RELIEF_NORMAL</property>
+                <property name="focus_on_click">True</property>
+              </object>
+            </child>
+          </object>
+          <packing>
+            <property name="padding">0</property>
+            <property name="expand">False</property>
+            <property name="fill">True</property>
+            <property name="pack_type">GTK_PACK_END</property>
+          </packing>
+        </child>
+        <child>
+          <object class="GtkVBox" id="vbox1">
+            <property name="border_width">6</property>
+            <property name="visible">True</property>
+            <property name="homogeneous">False</property>
+            <property name="spacing">12</property>
+            <child>
+              <object class="GtkTable" id="table1">
+                <property name="visible">True</property>
+                <property name="n_rows">2</property>
+                <property name="n_columns">2</property>
+                <property name="homogeneous">False</property>
+                <property name="row_spacing">6</property>
+                <property name="column_spacing">12</property>
+                <child>
+                  <object class="GtkLabel" id="label2">
+                    <property name="visible">True</property>
+                    <property name="label" translatable="yes">_File:</property>
+                    <property name="use_underline">True</property>
+                    <property name="use_markup">False</property>
+                    <property name="justify">GTK_JUSTIFY_LEFT</property>
+                    <property name="wrap">False</property>
+                    <property name="selectable">False</property>
+                    <property name="xalign">0</property>
+                    <property name="yalign">0.5</property>
+                    <property name="xpad">0</property>
+                    <property name="ypad">0</property>
+                    <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+                    <property name="width_chars">-1</property>
+                    <property name="single_line_mode">False</property>
+                    <property name="angle">0</property>
+                  </object>
+                  <packing>
+                    <property name="left_attach">0</property>
+                    <property name="right_attach">1</property>
+                    <property name="top_attach">0</property>
+                    <property name="bottom_attach">1</property>
+                    <property name="x_options">fill</property>
+                    <property name="y_options"/>
+                  </packing>
+                </child>
+                <child>
+                  <object class="GtkLabel" id="label3">
+                    <property name="visible">True</property>
+                    <property name="label" translatable="yes">Page Number</property>
+                    <property name="use_underline">False</property>
+                    <property name="use_markup">False</property>
+                    <property name="justify">GTK_JUSTIFY_LEFT</property>
+                    <property name="wrap">False</property>
+                    <property name="selectable">False</property>
+                    <property name="xalign">0</property>
+                    <property name="yalign">0.5</property>
+                    <property name="xpad">0</property>
+                    <property name="ypad">0</property>
+                    <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+                    <property name="width_chars">-1</property>
+                    <property name="single_line_mode">False</property>
+                    <property name="angle">0</property>
+                  </object>
+                  <packing>
+                    <property name="left_attach">0</property>
+                    <property name="right_attach">1</property>
+                    <property name="top_attach">1</property>
+                    <property name="bottom_attach">2</property>
+                    <property name="x_options">fill</property>
+                    <property name="y_options"/>
+                  </packing>
+                </child>
+                <child>
+                  <object class="GtkFileChooserButton" id="pdf_file_chooser_button">
+                    <property name="visible">True</property>
+                    <property name="title" translatable="yes">Select A File</property>
+                    <property name="action">GTK_FILE_CHOOSER_ACTION_OPEN</property>
+                    <property name="local_only">True</property>
+                    <property name="show_hidden">False</property>
+                    <property name="width_chars">-1</property>
+                  </object>
+                  <packing>
+                    <property name="left_attach">1</property>
+                    <property name="right_attach">2</property>
+                    <property name="top_attach">0</property>
+                    <property name="bottom_attach">1</property>
+                    <property name="y_options">fill</property>
+                  </packing>
+                </child>
+                <child>
+                  <object class="GtkSpinButton" id="pdf_spin">
+                    <property name="visible">True</property>
+                    <property name="can_focus">True</property>
+                    <property name="climb_rate">1</property>
+                    <property name="digits">0</property>
+                    <property name="numeric">False</property>
+                    <property name="update_policy">GTK_UPDATE_ALWAYS</property>
+                    <property name="snap_to_ticks">False</property>
+                    <property name="wrap">False</property>
+                    <property name="adjustment">adjustment1</property>
+                  </object>
+                  <packing>
+                    <property name="left_attach">1</property>
+                    <property name="right_attach">2</property>
+                    <property name="top_attach">1</property>
+                    <property name="bottom_attach">2</property>
+                    <property name="y_options"/>
+                  </packing>
+                </child>
+              </object>
+              <packing>
+                <property name="padding">0</property>
+                <property name="expand">False</property>
+                <property name="fill">True</property>
+              </packing>
+            </child>
+            <child>
+              <object class="GtkFrame" id="frame1">
+                <property name="visible">True</property>
+                <property name="label_xalign">0</property>
+                <property name="label_yalign">0.5</property>
+                <property name="shadow_type">GTK_SHADOW_NONE</property>
+                <child>
+                  <object class="GtkAlignment" id="alignment1">
+                    <property name="visible">True</property>
+                    <property name="xalign">0.5</property>
+                    <property name="yalign">0.5</property>
+                    <property name="xscale">1</property>
+                    <property name="yscale">1</property>
+                    <property name="top_padding">0</property>
+                    <property name="bottom_padding">0</property>
+                    <property name="left_padding">12</property>
+                    <property name="right_padding">0</property>
+                    <child>
+                      <object class="GtkVBox" id="vbox3">
+                        <property name="visible">True</property>
+                        <property name="homogeneous">False</property>
+                        <property name="spacing">6</property>
+                        <child>
+                          <object class="GtkScrolledWindow" id="scrolledwindow1">
+                            <property name="visible">True</property>
+                            <property name="can_focus">True</property>
+                            <property name="hscrollbar_policy">GTK_POLICY_AUTOMATIC</property>
+                            <property name="vscrollbar_policy">GTK_POLICY_AUTOMATIC</property>
+                            <property name="shadow_type">GTK_SHADOW_IN</property>
+                            <property name="window_placement">GTK_CORNER_TOP_LEFT</property>
+                            <child>
+                              <object class="GtkTreeView" id="pdf_tree_view">
+                                <property name="visible">True</property>
+                                <property name="can_focus">True</property>
+                                <property name="headers_visible">True</property>
+                                <property name="rules_hint">False</property>
+                                <property name="reorderable">False</property>
+                                <property name="enable_search">True</property>
+                                <property name="fixed_height_mode">False</property>
+                                <property name="hover_selection">False</property>
+                                <property name="hover_expand">False</property>
+                              </object>
+                            </child>
+                          </object>
+                          <packing>
+                            <property name="padding">0</property>
+                            <property name="expand">True</property>
+                            <property name="fill">True</property>
+                          </packing>
+                        </child>
+                        <child>
+                          <object class="GtkTable" id="table2">
+                            <property name="visible">True</property>
+                            <property name="n_rows">2</property>
+                            <property name="n_columns">3</property>
+                            <property name="homogeneous">False</property>
+                            <property name="row_spacing">6</property>
+                            <property name="column_spacing">12</property>
+                            <child>
+                              <object class="GtkLabel" id="label6">
+                                <property name="visible">True</property>
+                                <property name="label" translatable="yes">Total time elapsed:</property>
+                                <property name="use_underline">False</property>
+                                <property name="use_markup">True</property>
+                                <property name="justify">GTK_JUSTIFY_LEFT</property>
+                                <property name="wrap">False</property>
+                                <property name="selectable">False</property>
+                                <property name="xalign">0</property>
+                                <property name="yalign">0.5</property>
+                                <property name="xpad">0</property>
+                                <property name="ypad">0</property>
+                                <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+                                <property name="width_chars">-1</property>
+                                <property name="single_line_mode">False</property>
+                                <property name="angle">0</property>
+                              </object>
+                              <packing>
+                                <property name="left_attach">0</property>
+                                <property name="right_attach">1</property>
+                                <property name="top_attach">1</property>
+                                <property name="bottom_attach">2</property>
+                                <property name="x_options">fill</property>
+                                <property name="y_options"/>
+                              </packing>
+                            </child>
+                            <child>
+                              <object class="GtkLabel" id="pdf_total_label">
+                                <property name="visible">True</property>
+                                <property name="label" translatable="yes"/>
+                                <property name="use_underline">False</property>
+                                <property name="use_markup">True</property>
+                                <property name="justify">GTK_JUSTIFY_LEFT</property>
+                                <property name="wrap">False</property>
+                                <property name="selectable">False</property>
+                                <property name="xalign">0</property>
+                                <property name="yalign">0.5</property>
+                                <property name="xpad">0</property>
+                                <property name="ypad">0</property>
+                                <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+                                <property name="width_chars">-1</property>
+                                <property name="single_line_mode">False</property>
+                                <property name="angle">0</property>
+                              </object>
+                              <packing>
+                                <property name="left_attach">1</property>
+                                <property name="right_attach">3</property>
+                                <property name="top_attach">1</property>
+                                <property name="bottom_attach">2</property>
+                                <property name="x_options">fill</property>
+                                <property name="y_options"/>
+                              </packing>
+                            </child>
+                            <child>
+                              <object class="GtkLabel" id="label5">
+                                <property name="visible">True</property>
+                                <property name="label" translatable="yes">Description:</property>
+                                <property name="use_underline">False</property>
+                                <property name="use_markup">False</property>
+                                <property name="justify">GTK_JUSTIFY_LEFT</property>
+                                <property name="wrap">False</property>
+                                <property name="selectable">False</property>
+                                <property name="xalign">0</property>
+                                <property name="yalign">0</property>
+                                <property name="xpad">0</property>
+                                <property name="ypad">0</property>
+                                <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+                                <property name="width_chars">-1</property>
+                                <property name="single_line_mode">False</property>
+                                <property name="angle">0</property>
+                              </object>
+                              <packing>
+                                <property name="left_attach">0</property>
+                                <property name="right_attach">1</property>
+                                <property name="top_attach">0</property>
+                                <property name="bottom_attach">1</property>
+                                <property name="x_options">fill</property>
+                                <property name="y_options">fill</property>
+                              </packing>
+                            </child>
+                            <child>
+                              <object class="GtkLabel" id="description_label">
+                                <property name="visible">True</property>
+                                <property name="label" translatable="yes">&lt;i&gt;No Description&lt;/i&gt;</property>
+                                <property name="use_underline">False</property>
+                                <property name="use_markup">True</property>
+                                <property name="justify">GTK_JUSTIFY_LEFT</property>
+                                <property name="wrap">True</property>
+                                <property name="selectable">False</property>
+                                <property name="xalign">0</property>
+                                <property name="yalign">0</property>
+                                <property name="xpad">0</property>
+                                <property name="ypad">0</property>
+                                <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+                                <property name="width_chars">-1</property>
+                                <property name="single_line_mode">False</property>
+                                <property name="angle">0</property>
+                              </object>
+                              <packing>
+                                <property name="left_attach">1</property>
+                                <property name="right_attach">2</property>
+                                <property name="top_attach">0</property>
+                                <property name="bottom_attach">1</property>
+                                <property name="y_options">fill</property>
+                              </packing>
+                            </child>
+                            <child>
+                              <object class="GtkAlignment" id="alignment2">
+                                <property name="visible">True</property>
+                                <property name="xalign">0.5</property>
+                                <property name="yalign">0</property>
+                                <property name="xscale">0.0</property>
+                                <property name="yscale">0.0</property>
+                                <property name="top_padding">0</property>
+                                <property name="bottom_padding">0</property>
+                                <property name="left_padding">0</property>
+                                <property name="right_padding">0</property>
+                                <child>
+                                  <object class="GtkButton" id="analyze_button">
+                                    <property name="visible">True</property>
+                                    <property name="can_focus">True</property>
+                                    <property name="label" translatable="yes">_Analyze</property>
+                                    <property name="use_underline">True</property>
+                                    <property name="relief">GTK_RELIEF_NORMAL</property>
+                                    <property name="focus_on_click">True</property>
+                                  </object>
+                                </child>
+                              </object>
+                              <packing>
+                                <property name="left_attach">2</property>
+                                <property name="right_attach">3</property>
+                                <property name="top_attach">0</property>
+                                <property name="bottom_attach">1</property>
+                                <property name="x_options">fill</property>
+                                <property name="y_options">fill</property>
+                              </packing>
+                            </child>
+                          </object>
+                          <packing>
+                            <property name="padding">0</property>
+                            <property name="expand">False</property>
+                            <property name="fill">True</property>
+                          </packing>
+                        </child>
+                      </object>
+                    </child>
+                  </object>
+                </child>
+                <child type="label">
+                  <object class="GtkLabel" id="label4">
+                    <property name="visible">True</property>
+                    <property name="label" translatable="yes">&lt;b&gt;PDF Instructions&lt;/b&gt;</property>
+                    <property name="use_underline">False</property>
+                    <property name="use_markup">True</property>
+                    <property name="justify">GTK_JUSTIFY_LEFT</property>
+                    <property name="wrap">False</property>
+                    <property name="selectable">False</property>
+                    <property name="xalign">0.5</property>
+                    <property name="yalign">0.5</property>
+                    <property name="xpad">0</property>
+                    <property name="ypad">0</property>
+                    <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+                    <property name="width_chars">-1</property>
+                    <property name="single_line_mode">False</property>
+                    <property name="angle">0</property>
+                  </object>
+                </child>
+              </object>
+              <packing>
+                <property name="padding">0</property>
+                <property name="expand">True</property>
+                <property name="fill">True</property>
+              </packing>
+            </child>
+          </object>
+          <packing>
+            <property name="padding">0</property>
+            <property name="expand">True</property>
+            <property name="fill">True</property>
+          </packing>
+        </child>
+      </object>
+    </child>
+    <action-widgets>
+      <action-widget response="-7">closebutton1</action-widget>
+    </action-widgets>
+  </object>
+</interface>
diff --git a/test/pdf-operators.c b/test/pdf-operators.c
new file mode 100644 (file)
index 0000000..a174df1
--- /dev/null
@@ -0,0 +1,81 @@
+typedef struct
+{
+  const char *op;
+  const char *description;
+} OperatorMapping;
+
+OperatorMapping op_mapping[] = {
+  { "b", "Close, fill, and stroke path using nonzero winding number rule" },
+  { "B", "Fill and stroke path using nonzero winding number rule" },
+  { "b*", "Close, fill, and stroke path using even-odd rule" },
+  { "B*", "Fill and stroke path using even-odd rule" },
+  { "BDC", "(PDF 1.2) Begin marked-content sequence with property list" },
+  { "BI", "Begin inline image object" },
+  { "BMC", "(PDF 1.2) Begin marked-content sequence" },
+  { "BT", "Begin text object" },
+  { "BX", "(PDF 1.1) Begin compatibility section" },
+  { "c", "Append curved segment to path (three control points)" },
+  { "cm", "Concatenate matrix to current transformation matrix" },
+  { "CS", "(PDF 1.1) Set color space for stroking operations" },
+  { "cs", "(PDF 1.1) Set color space for nonstroking operations" },
+  { "d", "Set line dash pattern" },
+  { "d0", "Set glyph width in Type 3 font" },
+  { "d1", "Set glyph width and bounding box in Type 3 font" },
+  { "Do", "Invoke named XObject" },
+  { "DP", "(PDF 1.2) Define marked-content point with property list" },
+  { "EI", "End inline image object" },
+  { "EMC", "(PDF 1.2) End marked-content sequence" },
+  { "ET", "End text object" },
+  { "EX", "(PDF 1.1) End compatibility section" },
+  { "f", "Fill path using nonzero winding number rule" },
+  { "F", "Fill path using nonzero winding number rule (obsolete)" },
+  { "f*", "Fill path using even-odd rule" },
+  { "G", "Set gray level for stroking operations" },
+  { "g", "Set gray level for nonstroking operations" },
+  { "gs", "(PDF 1.2) Set parameters from graphics state parameter dictionary" },
+  { "h", "Close subpath" },
+  { "i", "Set flatness tolerance" },
+  { "ID", "Begin inline image data" },
+  { "j", "Set line join style" },
+  { "J", "Set line cap style" },
+  { "K", "Set CMYK color for stroking operations" },
+  { "k", "Set CMYK color for nonstroking operations" },
+  { "l", "Append straight line segment to path" },
+  { "m", "Begin new subpath" },
+  { "M", "Set miter limit" },
+  { "MP", "(PDF 1.2) Define marked-content point" },
+  { "n", "End path without filling or stroking" },
+  { "q", "Save graphics state" },
+  { "Q", "Restore graphics state" },
+  { "re", "Append rectangle to path" },
+  { "RG", "Set RGB color for stroking operations" },
+  { "rg", "Set RGB color for nonstroking operations" },
+  { "ri", "Set color rendering intent" },
+  { "s", "Close and stroke path" },
+  { "S", "Stroke path" },
+  { "SC", "(PDF 1.1) Set color for stroking operations" },
+  { "sc", "(PDF 1.1) Set color for nonstroking operations" },
+  { "SCN", "(PDF 1.2) Set color for stroking operations (ICCBased and special color spaces)" },
+  { "scn", "(PDF 1.2) Set color for nonstroking operations (ICCBased and special color spaces)" },
+  { "sh", "(PDF 1.3) Paint area defined by shading pattern" },
+  { "T*", "Move to start of next text line" },
+  { "Tc", "Set character spacing" },
+  { "Td", "Move text position" },
+  { "TD", "Move text position and set leading" },
+  { "Tf", "Set text font and size" },
+  { "Tj", "Show text" },
+  { "TJ", "Show text, allowing individual glyph positioning" },
+  { "TL", "Set text leading" },
+  { "Tm", "Set text matrix and text line matrix" },
+  { "Tr", "Set text rendering mode" },
+  { "Ts", "Set text rise" },
+  { "Tw", "Set word spacing" },
+  { "Tz", "Set horizontal text scaling" },
+  { "v", "Append curved segment to path (initial point replicated)" },
+  { "w", "Set line width" },
+  { "W", "Set clipping path using nonzero winding number rule" },
+  { "W*", "Set clipping path using even-odd rule" },
+  { "y", "Append curved segment to path (final point replicated)" },
+  { "'", "Move to next line and show text" },
+  { "\"", "Set word and character spacing, move to next line, and show text" },
+};
diff --git a/test/perf-test-preview-dummy.cc b/test/perf-test-preview-dummy.cc
new file mode 100644 (file)
index 0000000..09f7d0f
--- /dev/null
@@ -0,0 +1,22 @@
+/* Copyright Krzysztof Kowalczyk 2006-2007\r
+   License: GPLv2 */\r
+\r
+/* This is a no-op preview support for perf-test.\r
+Using this perf-test still works for performance testing, you just don't\r
+get any visual feedback during testing.\r
+*/\r
+\r
+#include "splash/SplashBitmap.h"\r
+\r
+void PreviewBitmapSplash(SplashBitmap *bmpSplash)\r
+{\r
+}\r
+\r
+void PreviewBitmapDestroy(void)\r
+{\r
+}\r
+\r
+void PreviewBitmapInit(void)\r
+{\r
+}\r
+\r
diff --git a/test/perf-test.cc b/test/perf-test.cc
new file mode 100644 (file)
index 0000000..6bdda97
--- /dev/null
@@ -0,0 +1,1279 @@
+/* Copyright Krzysztof Kowalczyk 2006-2007\r
+   Copyright Hib Eris <hib@hiberis.nl> 2008\r
+   License: GPLv2 */\r
+/*\r
+  A tool to stress-test poppler rendering and measure rendering times for\r
+  very simplistic performance measuring.\r
+\r
+  TODO:\r
+   * make it work with cairo output as well\r
+   * print more info about document like e.g. enumarate images,\r
+     streams, compression, encryption, password-protection. Each should have\r
+     a command-line arguments to turn it on/off\r
+   * never over-write file given as -out argument (optionally, provide -force\r
+     option to force writing the -out file). It's way too easy too lose results\r
+     of a previous run.\r
+*/\r
+\r
+#ifdef _MSC_VER\r
+// this sucks but I don't know any other way\r
+#pragma comment(linker,"/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='x86' publicKeyToken='6595b64144ccf1df' language='*'\"")\r
+#endif\r
+\r
+#ifdef _WIN32\r
+#include <windows.h>\r
+#else\r
+#include <strings.h>\r
+#endif\r
+\r
+// Define COPY_FILE if you want the file to be copied to a local disk first\r
+// before it's tested. This is desired if a file is on a slow drive.\r
+// Currently copying only works on Windows.\r
+// Not enabled by default.\r
+//#define COPY_FILE 1\r
+\r
+#include <assert.h>\r
+#include <config.h>\r
+#include <stdio.h>\r
+#include <stdarg.h>\r
+#include <ctype.h>\r
+#include <stdlib.h>\r
+#include <string.h>\r
+#include <errno.h>\r
+#include <time.h>\r
+\r
+#ifdef HAVE_DIRENT_H\r
+#include <dirent.h>\r
+#endif\r
+\r
+#include "Error.h"\r
+#include "ErrorCodes.h"\r
+#include "goo/GooString.h"\r
+#include "goo/GooList.h"\r
+#include "goo/GooTimer.h"\r
+#include "GlobalParams.h"\r
+#include "splash/SplashBitmap.h"\r
+#include "Object.h" /* must be included before SplashOutputDev.h because of sloppiness in SplashOutputDev.h */\r
+#include "SplashOutputDev.h"\r
+#include "TextOutputDev.h"\r
+#include "PDFDoc.h"\r
+#include "Link.h"\r
+\r
+#ifdef _MSC_VER\r
+#define strdup _strdup\r
+#define strcasecmp _stricmp\r
+#endif\r
+\r
+#define dimof(X)    (sizeof(X)/sizeof((X)[0]))\r
+\r
+#define INVALID_PAGE_NO     -1\r
+\r
+/* Those must be implemented in order to provide preview during execution.\r
+   They can be no-ops. An implementation for windows is in\r
+   perf-test-preview-win.cc\r
+*/\r
+extern void PreviewBitmapInit(void);\r
+extern void PreviewBitmapDestroy(void);\r
+extern void PreviewBitmapSplash(SplashBitmap *bmpSplash);\r
+\r
+class PdfEnginePoppler {\r
+public:\r
+    PdfEnginePoppler();\r
+    ~PdfEnginePoppler();\r
+\r
+    const char *fileName(void) const { return _fileName; };\r
+\r
+    void setFileName(const char *fileName) {\r
+        assert(!_fileName);\r
+        _fileName = (char*)strdup(fileName);\r
+    }\r
+\r
+    int pageCount(void) const { return _pageCount; }\r
+\r
+    bool load(const char *fileName);\r
+    SplashBitmap *renderBitmap(int pageNo, double zoomReal, int rotation);\r
+\r
+    SplashOutputDev *   outputDevice();\r
+private:\r
+    char *              _fileName;\r
+    int                 _pageCount;\r
+\r
+    PDFDoc *            _pdfDoc;\r
+    SplashOutputDev *   _outputDev;\r
+};\r
+\r
+typedef struct StrList {\r
+    struct StrList *next;\r
+    char *          str;\r
+} StrList;\r
+\r
+/* List of all command-line arguments that are not switches.\r
+   We assume those are:\r
+     - names of PDF files\r
+     - names of a file with a list of PDF files\r
+     - names of directories with PDF files\r
+*/\r
+static StrList *gArgsListRoot = NULL;\r
+\r
+/* Names of all command-line switches we recognize */\r
+#define TIMINGS_ARG         "-timings"\r
+#define RESOLUTION_ARG      "-resolution"\r
+#define RECURSIVE_ARG       "-recursive"\r
+#define OUT_ARG             "-out"\r
+#define PREVIEW_ARG         "-preview"\r
+#define SLOW_PREVIEW_ARG    "-slowpreview"\r
+#define LOAD_ONLY_ARG       "-loadonly"\r
+#define PAGE_ARG            "-page"\r
+#define TEXT_ARG            "-text"\r
+\r
+/* Should we record timings? True if -timings command-line argument was given. */\r
+static bool gfTimings = false;\r
+\r
+/* If true, we use render each page at resolution 'gResolutionX'/'gResolutionY'.\r
+   If false, we render each page at its native resolution.\r
+   True if -resolution NxM command-line argument was given. */\r
+static bool gfForceResolution = false;\r
+static int  gResolutionX = 0;\r
+static int  gResolutionY = 0;\r
+/* If NULL, we output the log info to stdout. If not NULL, should be a name\r
+   of the file to which we output log info.\r
+   Controled by -out command-line argument. */\r
+static char *   gOutFileName = NULL;\r
+/* FILE * correspondig to gOutFileName or stdout if gOutFileName is NULL or\r
+   was invalid name */\r
+static FILE *   gOutFile = NULL;\r
+/* FILE * correspondig to gOutFileName or stderr if gOutFileName is NULL or\r
+   was invalid name */\r
+static FILE *   gErrFile = NULL;\r
+\r
+/* If True and a directory is given as a command-line argument, we'll process\r
+   pdf files in sub-directories as well.\r
+   Controlled by -recursive command-line argument */\r
+static bool gfRecursive = false;\r
+\r
+/* If true, preview rendered image. To make sure that they're being rendered correctly. */\r
+static bool gfPreview = false;\r
+\r
+/* 1 second (1000 milliseconds) */\r
+#define SLOW_PREVIEW_TIME 1000\r
+\r
+/* If true, preview rendered image in a slow mode i.e. delay displaying for\r
+   SLOW_PREVIEW_TIME. This is so that a human has enough time to see if the\r
+   PDF renders ok. In release mode on fast processor pages take only ~100-200 ms\r
+   to render and they go away too quickly to be inspected by a human. */\r
+static bool gfSlowPreview = false;\r
+\r
+/* If true, we only dump the text, not render */\r
+static bool gfTextOnly = false;\r
+\r
+#define PAGE_NO_NOT_GIVEN -1\r
+\r
+/* If equals PAGE_NO_NOT_GIVEN, we're in default mode where we render all pages.\r
+   If different, will only render this page */\r
+static int  gPageNo = PAGE_NO_NOT_GIVEN;\r
+/* If true, will only load the file, not render any pages. Mostly for\r
+   profiling load time */\r
+static bool gfLoadOnly = false;\r
+\r
+#define PDF_FILE_DPI 72\r
+\r
+#define MAX_FILENAME_SIZE 1024\r
+\r
+/* DOS is 0xd 0xa */\r
+#define DOS_NEWLINE "\x0d\x0a"\r
+/* Mac is single 0xd */\r
+#define MAC_NEWLINE "\x0d"\r
+/* Unix is single 0xa (10) */\r
+#define UNIX_NEWLINE "\x0a"\r
+#define UNIX_NEWLINE_C 0xa\r
+\r
+#ifdef _WIN32\r
+  #define DIR_SEP_CHAR '\\'\r
+  #define DIR_SEP_STR  "\\"\r
+#else\r
+  #define DIR_SEP_CHAR '/'\r
+  #define DIR_SEP_STR  "/"\r
+#endif\r
+\r
+void memzero(void *data, size_t len)\r
+{\r
+    memset(data, 0, len);\r
+}\r
+\r
+void *zmalloc(size_t len)\r
+{\r
+    void *data = malloc(len);\r
+    if (data)\r
+        memzero(data, len);\r
+    return data;\r
+}\r
+\r
+/* Concatenate 4 strings. Any string can be NULL.\r
+   Caller needs to free() memory. */\r
+char *str_cat4(const char *str1, const char *str2, const char *str3, const char *str4)\r
+{\r
+    char *str;\r
+    char *tmp;\r
+    size_t str1_len = 0;\r
+    size_t str2_len = 0;\r
+    size_t str3_len = 0;\r
+    size_t str4_len = 0;\r
+\r
+    if (str1)\r
+        str1_len = strlen(str1);\r
+    if (str2)\r
+        str2_len = strlen(str2);\r
+    if (str3)\r
+        str3_len = strlen(str3);\r
+    if (str4)\r
+        str4_len = strlen(str4);\r
+\r
+    str = (char*)zmalloc(str1_len + str2_len + str3_len + str4_len + 1);\r
+    if (!str)\r
+        return NULL;\r
+\r
+    tmp = str;\r
+    if (str1) {\r
+        memcpy(tmp, str1, str1_len);\r
+        tmp += str1_len;\r
+    }\r
+    if (str2) {\r
+        memcpy(tmp, str2, str2_len);\r
+        tmp += str2_len;\r
+    }\r
+    if (str3) {\r
+        memcpy(tmp, str3, str3_len);\r
+        tmp += str3_len;\r
+    }\r
+    if (str4) {\r
+        memcpy(tmp, str4, str1_len);\r
+    }\r
+    return str;\r
+}\r
+\r
+char *str_dup(const char *str)\r
+{\r
+    return str_cat4(str, NULL, NULL, NULL);\r
+}\r
+\r
+bool str_eq(const char *str1, const char *str2)\r
+{\r
+    if (!str1 && !str2)\r
+        return true;\r
+    if (!str1 || !str2)\r
+        return false;\r
+    if (0 == strcmp(str1, str2))\r
+        return true;\r
+    return false;\r
+}\r
+\r
+bool str_ieq(const char *str1, const char *str2)\r
+{\r
+    if (!str1 && !str2)\r
+        return true;\r
+    if (!str1 || !str2)\r
+        return false;\r
+    if (0 == strcasecmp(str1, str2))\r
+        return true;\r
+    return false;\r
+}\r
+\r
+bool str_endswith(const char *txt, const char *end)\r
+{\r
+    size_t end_len;\r
+    size_t txt_len;\r
+\r
+    if (!txt || !end)\r
+        return false;\r
+\r
+    txt_len = strlen(txt);\r
+    end_len = strlen(end);\r
+    if (end_len > txt_len)\r
+        return false;\r
+    if (str_eq(txt+txt_len-end_len, end))\r
+        return true;\r
+    return false;\r
+}\r
+\r
+/* TODO: probably should move to some other file and change name to\r
+   sleep_milliseconds */\r
+void sleep_milliseconds(int milliseconds)\r
+{\r
+#ifdef _WIN32\r
+    Sleep((DWORD)milliseconds);\r
+#else\r
+    struct timespec tv;\r
+    int             secs, nanosecs;\r
+    secs = milliseconds / 1000;\r
+    nanosecs = (milliseconds - (secs * 1000)) * 1000;\r
+    tv.tv_sec = (time_t) secs;\r
+    tv.tv_nsec = (long) nanosecs;\r
+    while (1)\r
+    {\r
+        int rval = nanosleep(&tv, &tv);\r
+        if (rval == 0)\r
+            /* Completed the entire sleep time; all done. */\r
+            return;\r
+        else if (errno == EINTR)\r
+            /* Interrupted by a signal. Try again. */\r
+            continue;\r
+        else\r
+            /* Some other error; bail out. */\r
+            return;\r
+    }\r
+    return;\r
+#endif\r
+}\r
+\r
+#ifndef _MSC_VER\r
+void strcpy_s(char* dst, size_t dst_size, const char* src)\r
+{\r
+    size_t src_size = strlen(src) + 1;\r
+    if (src_size <= dst_size)\r
+        memcpy(dst, src, src_size);\r
+    else {\r
+        if (dst_size > 0) {\r
+            memcpy(dst, src, dst_size);\r
+            dst[dst_size-1] = 0;\r
+        }\r
+    }\r
+}\r
+\r
+void strcat_s(char *dst, size_t dst_size, const char* src)\r
+{\r
+    size_t dst_len = strlen(dst);\r
+    if (dst_len >= dst_size) {\r
+        if (dst_size > 0)\r
+            dst[dst_size-1] = 0;\r
+        return;\r
+    }\r
+    strcpy_s(dst+dst_len, dst_size - dst_len, src);\r
+}\r
+#endif\r
+\r
+static SplashColorMode gSplashColorMode = splashModeBGR8;\r
+\r
+static SplashColor splashColRed;\r
+static SplashColor splashColGreen;\r
+static SplashColor splashColBlue;\r
+static SplashColor splashColWhite;\r
+static SplashColor splashColBlack;\r
+\r
+#define SPLASH_COL_RED_PTR (SplashColorPtr)&(splashColRed[0])\r
+#define SPLASH_COL_GREEN_PTR (SplashColorPtr)&(splashColGreen[0])\r
+#define SPLASH_COL_BLUE_PTR (SplashColorPtr)&(splashColBlue[0])\r
+#define SPLASH_COL_WHITE_PTR (SplashColorPtr)&(splashColWhite[0])\r
+#define SPLASH_COL_BLACK_PTR (SplashColorPtr)&(splashColBlack[0])\r
+\r
+static SplashColorPtr  gBgColor = SPLASH_COL_WHITE_PTR;\r
+\r
+static void splashColorSet(SplashColorPtr col, Guchar red, Guchar green, Guchar blue, Guchar alpha)\r
+{\r
+    switch (gSplashColorMode)\r
+    {\r
+        case splashModeBGR8:\r
+            col[0] = blue;\r
+            col[1] = green;\r
+            col[2] = red;\r
+            break;\r
+        case splashModeRGB8:\r
+            col[0] = red;\r
+            col[1] = green;\r
+            col[2] = blue;\r
+            break;\r
+        default:\r
+            assert(0);\r
+            break;\r
+    }\r
+}\r
+\r
+void SplashColorsInit(void)\r
+{\r
+    splashColorSet(SPLASH_COL_RED_PTR, 0xff, 0, 0, 0);\r
+    splashColorSet(SPLASH_COL_GREEN_PTR, 0, 0xff, 0, 0);\r
+    splashColorSet(SPLASH_COL_BLUE_PTR, 0, 0, 0xff, 0);\r
+    splashColorSet(SPLASH_COL_BLACK_PTR, 0, 0, 0, 0);\r
+    splashColorSet(SPLASH_COL_WHITE_PTR, 0xff, 0xff, 0xff, 0);\r
+}\r
+\r
+PdfEnginePoppler::PdfEnginePoppler() : \r
+   _fileName(0)\r
+   , _pageCount(INVALID_PAGE_NO) \r
+   , _pdfDoc(NULL)\r
+   , _outputDev(NULL)\r
+{\r
+}\r
+\r
+PdfEnginePoppler::~PdfEnginePoppler()\r
+{\r
+    free(_fileName);\r
+    delete _outputDev;\r
+    delete _pdfDoc;\r
+}\r
+\r
+bool PdfEnginePoppler::load(const char *fileName)\r
+{\r
+    setFileName(fileName);\r
+    /* note: don't delete fileNameStr since PDFDoc takes ownership and deletes them itself */\r
+    GooString *fileNameStr = new GooString(fileName);\r
+    if (!fileNameStr) return false;\r
+\r
+    _pdfDoc = new PDFDoc(fileNameStr, NULL, NULL, (void*)NULL);\r
+    if (!_pdfDoc->isOk()) {\r
+        return false;\r
+    }\r
+    _pageCount = _pdfDoc->getNumPages();\r
+    return true;\r
+}\r
+\r
+SplashOutputDev * PdfEnginePoppler::outputDevice() {\r
+    if (!_outputDev) {\r
+        GBool bitmapTopDown = gTrue;\r
+        _outputDev = new SplashOutputDev(gSplashColorMode, 4, gFalse, gBgColor, bitmapTopDown);\r
+        if (_outputDev)\r
+            _outputDev->startDoc(_pdfDoc);\r
+    }\r
+    return _outputDev;\r
+}\r
+\r
+SplashBitmap *PdfEnginePoppler::renderBitmap(int pageNo, double zoomReal, int rotation)\r
+{\r
+    assert(outputDevice());\r
+    if (!outputDevice()) return NULL;\r
+\r
+    double hDPI = (double)PDF_FILE_DPI * zoomReal * 0.01;\r
+    double vDPI = (double)PDF_FILE_DPI * zoomReal * 0.01;\r
+    GBool  useMediaBox = gFalse;\r
+    GBool  crop        = gTrue;\r
+    GBool  doLinks     = gTrue;\r
+    _pdfDoc->displayPage(_outputDev, pageNo, hDPI, vDPI, rotation, useMediaBox, \r
+        crop, doLinks, NULL, NULL);\r
+\r
+    SplashBitmap* bmp = _outputDev->takeBitmap();\r
+    return bmp;\r
+}\r
+\r
+struct FindFileState {\r
+    char path[MAX_FILENAME_SIZE];\r
+    char dirpath[MAX_FILENAME_SIZE]; /* current dir path */\r
+    char pattern[MAX_FILENAME_SIZE]; /* search pattern */\r
+    const char *bufptr;\r
+#ifdef _WIN32\r
+    WIN32_FIND_DATA fileinfo;\r
+    HANDLE dir;\r
+#else\r
+    DIR *dir;\r
+#endif\r
+};\r
+\r
+#ifdef _WIN32\r
+#include <windows.h>\r
+#include <sys/timeb.h>\r
+#include <direct.h>\r
+\r
+__inline char *getcwd(char *buffer, int maxlen)\r
+{\r
+    return _getcwd(buffer, maxlen);\r
+}\r
+\r
+int fnmatch(const char *pattern, const char *string, int flags)\r
+{\r
+    int prefix_len;\r
+    const char *star_pos = strchr(pattern, '*');\r
+    if (!star_pos)\r
+        return strcmp(pattern, string) != 0;\r
+\r
+    prefix_len = (int)(star_pos-pattern);\r
+    if (0 == prefix_len)\r
+        return 0;\r
+\r
+    if (0 == _strnicmp(pattern, string, prefix_len))\r
+        return 0;\r
+\r
+    return 1;\r
+}\r
+\r
+#else\r
+#include <fnmatch.h>\r
+#endif\r
+\r
+#ifdef _WIN32\r
+/* on windows to query dirs we need foo\* to get files in this directory.\r
+    foo\ always fails and foo will return just info about foo directory,\r
+    not files in this directory */\r
+static void win_correct_path_for_FindFirstFile(char *path, int path_max_len)\r
+{\r
+    int path_len = strlen(path);\r
+    if (path_len >= path_max_len-4)\r
+        return;\r
+    if (DIR_SEP_CHAR != path[path_len])\r
+        path[path_len++] = DIR_SEP_CHAR;\r
+    path[path_len++] = '*';\r
+    path[path_len] = 0;\r
+}\r
+#endif\r
+\r
+FindFileState *find_file_open(const char *path, const char *pattern)\r
+{\r
+    FindFileState *s;\r
+\r
+    s = (FindFileState*)malloc(sizeof(FindFileState));\r
+    if (!s)\r
+        return NULL;\r
+    strcpy_s(s->path, sizeof(s->path), path);\r
+    strcpy_s(s->dirpath, sizeof(s->path), path);\r
+#ifdef _WIN32\r
+    win_correct_path_for_FindFirstFile(s->path, sizeof(s->path));\r
+#endif\r
+    strcpy_s(s->pattern, sizeof(s->pattern), pattern);\r
+    s->bufptr = s->path;\r
+#ifdef _WIN32\r
+    s->dir = INVALID_HANDLE_VALUE;\r
+#else\r
+    s->dir = NULL;\r
+#endif\r
+    return s;\r
+}\r
+\r
+#if 0 /* re-enable if we #define USE_OWN_GET_AUTH_DATA */\r
+void *StandardSecurityHandler::getAuthData()\r
+{\r
+    return NULL;\r
+}\r
+#endif\r
+\r
+char *makepath(char *buf, int buf_size, const char *path,\r
+               const char *filename)\r
+{\r
+    strcpy_s(buf, buf_size, path);\r
+    int len = strlen(path);\r
+    if (len > 0 && path[len - 1] != DIR_SEP_CHAR && len + 1 < buf_size) {\r
+        buf[len++] = DIR_SEP_CHAR;\r
+        buf[len] = '\0';\r
+    }\r
+    strcat_s(buf, buf_size, filename);\r
+    return buf;\r
+}\r
+\r
+#ifdef _WIN32\r
+static int skip_matching_file(const char *filename)\r
+{\r
+    if (0 == strcmp(".", filename))\r
+        return 1;\r
+    if (0 == strcmp("..", filename))\r
+        return 1;\r
+    return 0;\r
+}\r
+#endif\r
+\r
+int find_file_next(FindFileState *s, char *filename, int filename_size_max)\r
+{\r
+#ifdef _WIN32\r
+    int    fFound;\r
+    if (INVALID_HANDLE_VALUE == s->dir) {\r
+        s->dir = FindFirstFile(s->path, &(s->fileinfo));\r
+        if (INVALID_HANDLE_VALUE == s->dir)\r
+            return -1;\r
+        goto CheckFile;\r
+    }\r
+\r
+    while (1) {\r
+        fFound = FindNextFile(s->dir, &(s->fileinfo));\r
+        if (!fFound)\r
+            return -1;\r
+CheckFile:\r
+        if (skip_matching_file(s->fileinfo.cFileName))\r
+            continue;\r
+        if (0 == fnmatch(s->pattern, s->fileinfo.cFileName, 0) ) {\r
+            makepath(filename, filename_size_max, s->dirpath, s->fileinfo.cFileName);\r
+            return 0;\r
+        }\r
+    }\r
+#else\r
+    struct dirent *dirent;\r
+    const char *p;\r
+    char *q;\r
+\r
+    if (s->dir == NULL)\r
+        goto redo;\r
+\r
+    for (;;) {\r
+        dirent = readdir(s->dir);\r
+        if (dirent == NULL) {\r
+        redo:\r
+            if (s->dir) {\r
+                closedir(s->dir);\r
+                s->dir = NULL;\r
+            }\r
+            p = s->bufptr;\r
+            if (*p == '\0')\r
+                return -1;\r
+            /* CG: get_str(&p, s->dirpath, sizeof(s->dirpath), ":") */\r
+            q = s->dirpath;\r
+            while (*p != ':' && *p != '\0') {\r
+                if ((q - s->dirpath) < (int)sizeof(s->dirpath) - 1)\r
+                    *q++ = *p;\r
+                p++;\r
+            }\r
+            *q = '\0';\r
+            if (*p == ':')\r
+                p++;\r
+            s->bufptr = p;\r
+            s->dir = opendir(s->dirpath);\r
+            if (!s->dir)\r
+                goto redo;\r
+        } else {\r
+            if (fnmatch(s->pattern, dirent->d_name, 0) == 0) {\r
+                makepath(filename, filename_size_max,\r
+                         s->dirpath, dirent->d_name);\r
+                return 0;\r
+            }\r
+        }\r
+    }\r
+#endif\r
+}\r
+\r
+void find_file_close(FindFileState *s)\r
+{\r
+#ifdef _WIN32\r
+    if (INVALID_HANDLE_VALUE != s->dir)\r
+       FindClose(s->dir);\r
+#else\r
+    if (s->dir)\r
+        closedir(s->dir);\r
+#endif\r
+    free(s);\r
+}\r
+\r
+int StrList_Len(StrList **root)\r
+{\r
+    int         len = 0;\r
+    StrList *   cur;\r
+    assert(root);\r
+    if (!root)\r
+        return 0;\r
+    cur = *root;\r
+    while (cur) {\r
+        ++len;\r
+        cur = cur->next;\r
+    }\r
+    return len;\r
+}\r
+\r
+int StrList_InsertAndOwn(StrList **root, char *txt)\r
+{\r
+    StrList *   el;\r
+    assert(root && txt);\r
+    if (!root || !txt)\r
+        return false;\r
+\r
+    el = (StrList*)malloc(sizeof(StrList));\r
+    if (!el)\r
+        return false;\r
+    el->str = txt;\r
+    el->next = *root;\r
+    *root = el;\r
+    return true;\r
+}\r
+\r
+int StrList_Insert(StrList **root, char *txt)\r
+{\r
+    char *txtDup;\r
+\r
+    assert(root && txt);\r
+    if (!root || !txt)\r
+        return false;\r
+    txtDup = str_dup(txt);\r
+    if (!txtDup)\r
+        return false;\r
+\r
+    if (!StrList_InsertAndOwn(root, txtDup)) {\r
+        free((void*)txtDup);\r
+        return false;\r
+    }\r
+    return true;\r
+}\r
+\r
+StrList* StrList_RemoveHead(StrList **root)\r
+{\r
+    StrList *tmp;\r
+    assert(root);\r
+    if (!root)\r
+        return NULL;\r
+\r
+    if (!*root)\r
+        return NULL;\r
+    tmp = *root;\r
+    *root = tmp->next;\r
+    tmp->next = NULL;\r
+    return tmp;\r
+}\r
+\r
+void StrList_FreeElement(StrList *el)\r
+{\r
+    if (!el)\r
+        return;\r
+    free((void*)el->str);\r
+    free((void*)el);\r
+}\r
+\r
+void StrList_Destroy(StrList **root)\r
+{\r
+    StrList *   cur;\r
+    StrList *   next;\r
+\r
+    if (!root)\r
+        return;\r
+    cur = *root;\r
+    while (cur) {\r
+        next = cur->next;\r
+        StrList_FreeElement(cur);\r
+        cur = next;\r
+    }\r
+    *root = NULL;\r
+}\r
+\r
+#ifndef _WIN32\r
+void OutputDebugString(const char *txt)\r
+{\r
+    /* do nothing */\r
+}\r
+#define _snprintf snprintf\r
+#define _vsnprintf vsnprintf\r
+#endif\r
+\r
+void my_error(void *, ErrorCategory, int pos, char *msg) {\r
+#if 0\r
+    char        buf[4096], *p = buf;\r
+\r
+    // NB: this can be called before the globalParams object is created\r
+    if (globalParams && globalParams->getErrQuiet()) {\r
+        return;\r
+    }\r
+\r
+    if (pos >= 0) {\r
+        p += _snprintf(p, sizeof(buf)-1, "Error (%d): ", pos);\r
+        *p   = '\0';\r
+        OutputDebugString(p);\r
+    } else {\r
+        OutputDebugString("Error: ");\r
+    }\r
+\r
+    p = buf;\r
+    p += _vsnprintf(p, sizeof(buf) - 1, msg, args);\r
+    while ( p > buf  &&  isspace(p[-1]) )\r
+            *--p = '\0';\r
+    *p++ = '\r';\r
+    *p++ = '\n';\r
+    *p   = '\0';\r
+    OutputDebugString(buf);\r
+\r
+    if (pos >= 0) {\r
+        p += _snprintf(p, sizeof(buf)-1, "Error (%d): ", pos);\r
+        *p   = '\0';\r
+        OutputDebugString(buf);\r
+        if (gErrFile)\r
+            fprintf(gErrFile, buf);\r
+    } else {\r
+        OutputDebugString("Error: ");\r
+        if (gErrFile)\r
+            fprintf(gErrFile, "Error: ");\r
+    }\r
+#endif\r
+#if 0\r
+    p = buf;\r
+    va_start(args, msg);\r
+    p += _vsnprintf(p, sizeof(buf) - 3, msg, args);\r
+    while ( p > buf  &&  isspace(p[-1]) )\r
+            *--p = '\0';\r
+    *p++ = '\r';\r
+    *p++ = '\n';\r
+    *p   = '\0';\r
+    OutputDebugString(buf);\r
+    if (gErrFile)\r
+        fprintf(gErrFile, buf);\r
+    va_end(args);\r
+#endif\r
+}\r
+\r
+void LogInfo(const char *fmt, ...)\r
+{\r
+    va_list args;\r
+    char        buf[4096], *p = buf;\r
+\r
+    p = buf;\r
+    va_start(args, fmt);\r
+    p += _vsnprintf(p, sizeof(buf) - 1, fmt, args);\r
+    *p   = '\0';\r
+    fprintf(gOutFile, "%s", buf);\r
+    va_end(args);\r
+    fflush(gOutFile);\r
+}\r
+\r
+static void PrintUsageAndExit(int argc, char **argv)\r
+{\r
+    printf("Usage: pdftest [-preview|-slowpreview] [-loadonly] [-timings] [-text] [-resolution NxM] [-recursive] [-page N] [-out out.txt] pdf-files-to-process\n");\r
+    for (int i=0; i < argc; i++) {\r
+        printf("i=%d, '%s'\n", i, argv[i]);\r
+    }\r
+    exit(0);\r
+}\r
+\r
+static bool ShowPreview(void)\r
+{\r
+    if (gfPreview || gfSlowPreview)\r
+        return true;\r
+    return false;\r
+}\r
+\r
+static void RenderPdfAsText(const char *fileName)\r
+{\r
+    GooString *         fileNameStr = NULL;\r
+    PDFDoc *            pdfDoc = NULL;\r
+    GooString *         txt = NULL;\r
+    int                 pageCount;\r
+    double              timeInMs;\r
+\r
+    assert(fileName);\r
+    if (!fileName)\r
+        return;\r
+\r
+    LogInfo("started: %s\n", fileName);\r
+\r
+    TextOutputDev * textOut = new TextOutputDev(NULL, gTrue, 0, gFalse, gFalse);\r
+    if (!textOut->isOk()) {\r
+        delete textOut;\r
+        return;\r
+    }\r
+\r
+    GooTimer msTimer;\r
+    /* note: don't delete fileNameStr since PDFDoc takes ownership and deletes them itself */\r
+    fileNameStr = new GooString(fileName);\r
+    if (!fileNameStr)\r
+        goto Exit;\r
+\r
+    pdfDoc = new PDFDoc(fileNameStr, NULL, NULL, NULL);\r
+    if (!pdfDoc->isOk()) {\r
+        error(errIO, -1, "RenderPdfFile(): failed to open PDF file {0:s}\n", fileName);\r
+        goto Exit;\r
+    }\r
+\r
+    msTimer.stop();\r
+    timeInMs = msTimer.getElapsed();\r
+    LogInfo("load: %.2f ms\n", timeInMs);\r
+\r
+    pageCount = pdfDoc->getNumPages();\r
+    LogInfo("page count: %d\n", pageCount);\r
+\r
+    for (int curPage = 1; curPage <= pageCount; curPage++) {\r
+        if ((gPageNo != PAGE_NO_NOT_GIVEN) && (gPageNo != curPage))\r
+            continue;\r
+\r
+        msTimer.start();\r
+        int rotate = 0;\r
+        GBool useMediaBox = gFalse;\r
+        GBool crop = gTrue;\r
+        GBool doLinks = gFalse;\r
+        pdfDoc->displayPage(textOut, curPage, 72, 72, rotate, useMediaBox, crop, doLinks);\r
+        txt = textOut->getText(0.0, 0.0, 10000.0, 10000.0);\r
+        msTimer.stop();\r
+        timeInMs = msTimer.getElapsed();\r
+        if (gfTimings)\r
+            LogInfo("page %d: %.2f ms\n", curPage, timeInMs);\r
+        printf("%s\n", txt->getCString());\r
+        delete txt;\r
+        txt = NULL;\r
+    }\r
+\r
+Exit:\r
+    LogInfo("finished: %s\n", fileName);\r
+    delete textOut;\r
+    delete pdfDoc;\r
+}\r
+\r
+#ifdef _MSC_VER\r
+#define POPPLER_TMP_NAME "c:\\poppler_tmp.pdf"\r
+#else\r
+#define POPPLER_TMP_NAME "/tmp/poppler_tmp.pdf"\r
+#endif\r
+\r
+static void RenderPdf(const char *fileName)\r
+{\r
+    const char *        fileNameSplash = NULL;\r
+    PdfEnginePoppler *  engineSplash = NULL;\r
+    int                 pageCount;\r
+    double              timeInMs;\r
+\r
+#ifdef COPY_FILE\r
+    // TODO: fails if file already exists and has read-only attribute\r
+    CopyFile(fileName, POPPLER_TMP_NAME, false);\r
+    fileNameSplash = POPPLER_TMP_NAME;\r
+#else\r
+    fileNameSplash = fileName;\r
+#endif\r
+    LogInfo("started: %s\n", fileName);\r
+\r
+    engineSplash = new PdfEnginePoppler();\r
+\r
+    GooTimer msTimer;\r
+    if (!engineSplash->load(fileNameSplash)) {\r
+        LogInfo("failed to load splash\n");\r
+        goto Error;\r
+    }\r
+    msTimer.stop();\r
+    timeInMs = msTimer.getElapsed();\r
+    LogInfo("load splash: %.2f ms\n", timeInMs);\r
+    pageCount = engineSplash->pageCount();\r
+\r
+    LogInfo("page count: %d\n", pageCount);\r
+    if (gfLoadOnly)\r
+        goto Error;\r
+\r
+    for (int curPage = 1; curPage <= pageCount; curPage++) {\r
+        if ((gPageNo != PAGE_NO_NOT_GIVEN) && (gPageNo != curPage))\r
+            continue;\r
+\r
+        SplashBitmap *bmpSplash = NULL;\r
+\r
+        GooTimer msTimer;\r
+        bmpSplash = engineSplash->renderBitmap(curPage, 100.0, 0);\r
+        msTimer.stop();\r
+        double timeInMs = msTimer.getElapsed();\r
+        if (gfTimings) {\r
+            if (!bmpSplash)\r
+                LogInfo("page splash %d: failed to render\n", curPage);\r
+            else\r
+                LogInfo("page splash %d (%dx%d): %.2f ms\n", curPage, bmpSplash->getWidth(), bmpSplash->getHeight(), timeInMs);\r
+        }\r
+\r
+        if (ShowPreview()) {\r
+            PreviewBitmapSplash(bmpSplash);\r
+            if (gfSlowPreview)\r
+                sleep_milliseconds(SLOW_PREVIEW_TIME);\r
+        }\r
+        delete bmpSplash;\r
+    }\r
+Error:\r
+    delete engineSplash;\r
+    LogInfo("finished: %s\n", fileName);\r
+}\r
+\r
+static void RenderFile(const char *fileName)\r
+{\r
+    if (gfTextOnly) {\r
+        RenderPdfAsText(fileName);\r
+        return;\r
+    }\r
+\r
+    RenderPdf(fileName);\r
+}\r
+\r
+static bool ParseInteger(const char *start, const char *end, int *intOut)\r
+{\r
+    char            numBuf[16];\r
+    int             digitsCount;\r
+    const char *    tmp;\r
+\r
+    assert(start && end && intOut);\r
+    assert(end >= start);\r
+    if (!start || !end || !intOut || (start > end))\r
+        return false;\r
+\r
+    digitsCount = 0;\r
+    tmp = start;\r
+    while (tmp <= end) {\r
+        if (isspace(*tmp)) {\r
+            /* do nothing, we allow whitespace */\r
+        } else if (!isdigit(*tmp))\r
+            return false;\r
+        numBuf[digitsCount] = *tmp;\r
+        ++digitsCount;\r
+        if (digitsCount == dimof(numBuf)-3) /* -3 to be safe */\r
+            return false;\r
+        ++tmp;\r
+    }\r
+    if (0 == digitsCount)\r
+        return false;\r
+    numBuf[digitsCount] = 0;\r
+    *intOut = atoi(numBuf);\r
+    return true;\r
+}\r
+\r
+/* Given 'resolutionString' in format NxM (e.g. "100x200"), parse the string and put N\r
+   into 'resolutionXOut' and M into 'resolutionYOut'.\r
+   Return false if there was an error (e.g. string is not in the right format */\r
+static bool ParseResolutionString(const char *resolutionString, int *resolutionXOut, int *resolutionYOut)\r
+{\r
+    const char *    posOfX;\r
+\r
+    assert(resolutionString);\r
+    assert(resolutionXOut);\r
+    assert(resolutionYOut);\r
+    if (!resolutionString || !resolutionXOut || !resolutionYOut)\r
+        return false;\r
+    *resolutionXOut = 0;\r
+    *resolutionYOut = 0;\r
+    posOfX = strchr(resolutionString, 'X');\r
+    if (!posOfX)\r
+        posOfX = strchr(resolutionString, 'x');\r
+    if (!posOfX)\r
+        return false;\r
+    if (posOfX == resolutionString)\r
+        return false;\r
+    if (!ParseInteger(resolutionString, posOfX-1, resolutionXOut))\r
+        return false;\r
+    if (!ParseInteger(posOfX+1, resolutionString+strlen(resolutionString)-1, resolutionYOut))\r
+        return false;\r
+    return true;\r
+}\r
+\r
+static void ParseCommandLine(int argc, char **argv)\r
+{\r
+    char *      arg;\r
+\r
+    if (argc < 2)\r
+        PrintUsageAndExit(argc, argv);\r
+\r
+    for (int i=1; i < argc; i++) {\r
+        arg = argv[i];\r
+        assert(arg);\r
+        if ('-' == arg[0]) {\r
+            if (str_ieq(arg, TIMINGS_ARG)) {\r
+                gfTimings = true;\r
+            } else if (str_ieq(arg, RESOLUTION_ARG)) {\r
+                ++i;\r
+                if (i == argc)\r
+                    PrintUsageAndExit(argc, argv); /* expect a file name after that */\r
+                if (!ParseResolutionString(argv[i], &gResolutionX, &gResolutionY))\r
+                    PrintUsageAndExit(argc, argv);\r
+                gfForceResolution = true;\r
+            } else if (str_ieq(arg, RECURSIVE_ARG)) {\r
+                gfRecursive = true;\r
+            } else if (str_ieq(arg, OUT_ARG)) {\r
+                /* expect a file name after that */\r
+                ++i;\r
+                if (i == argc)\r
+                    PrintUsageAndExit(argc, argv);\r
+                gOutFileName = str_dup(argv[i]);\r
+            } else if (str_ieq(arg, PREVIEW_ARG)) {\r
+                gfPreview = true;\r
+            } else if (str_ieq(arg, TEXT_ARG)) {\r
+                gfTextOnly = true;\r
+            } else if (str_ieq(arg, SLOW_PREVIEW_ARG)) {\r
+                gfSlowPreview = true;\r
+            } else if (str_ieq(arg, LOAD_ONLY_ARG)) {\r
+                gfLoadOnly = true;\r
+            } else if (str_ieq(arg, PAGE_ARG)) {\r
+                /* expect an integer after that */\r
+                ++i;\r
+                if (i == argc)\r
+                    PrintUsageAndExit(argc, argv);\r
+                gPageNo = atoi(argv[i]);\r
+                if (gPageNo < 1)\r
+                    PrintUsageAndExit(argc, argv);\r
+            } else {\r
+                /* unknown option */\r
+                PrintUsageAndExit(argc, argv);\r
+            }\r
+        } else {\r
+            /* we assume that this is not an option hence it must be\r
+               a name of PDF/directory/file with PDF names */\r
+            StrList_Insert(&gArgsListRoot, arg);\r
+        }\r
+    }\r
+}\r
+\r
+#if 0\r
+void RenderFileList(char *pdfFileList)\r
+{\r
+    char *data = NULL;\r
+    char *dataNormalized = NULL;\r
+    char *pdfFileName;\r
+    uint64_t fileSize;\r
+\r
+    assert(pdfFileList);\r
+    if (!pdfFileList)\r
+        return;\r
+    data = file_read_all(pdfFileList, &fileSize);\r
+    if (!data) {\r
+        error(-1, "couldn't load file '%s'", pdfFileList);\r
+        return;\r
+    }\r
+    dataNormalized = str_normalize_newline(data, UNIX_NEWLINE);\r
+    if (!dataNormalized) {\r
+        error(-1, "couldn't normalize data of file '%s'", pdfFileList);\r
+        goto Exit;\r
+    }\r
+    for (;;) {\r
+        pdfFileName = str_split_iter(&dataNormalized, UNIX_NEWLINE_C);\r
+        if (!pdfFileName)\r
+            break;\r
+        str_strip_ws_both(pdfFileName);\r
+        if (str_empty(pdfFileName)) {\r
+            free((void*)pdfFileName);\r
+            continue;\r
+        }\r
+        RenderFile(pdfFileName);\r
+        free((void*)pdfFileName);\r
+    }\r
+Exit:\r
+    free((void*)dataNormalized);\r
+    free((void*)data);\r
+}\r
+#endif\r
+\r
+#ifdef _WIN32\r
+#include <sys/types.h>\r
+#include <sys/stat.h>\r
+\r
+bool IsDirectoryName(char *path)\r
+{\r
+    struct _stat    buf;\r
+    int             result;\r
+\r
+    result = _stat(path, &buf );\r
+    if (0 != result)\r
+        return false;\r
+\r
+    if (buf.st_mode & _S_IFDIR)\r
+        return true;\r
+\r
+    return false;\r
+}\r
+\r
+bool IsFileName(char *path)\r
+{\r
+    struct _stat    buf;\r
+    int             result;\r
+\r
+    result = _stat(path, &buf );\r
+    if (0 != result)\r
+        return false;\r
+\r
+    if (buf.st_mode & _S_IFREG)\r
+        return true;\r
+\r
+    return false;\r
+}\r
+#else\r
+bool IsDirectoryName(char *path)\r
+{\r
+    /* TODO: implement me */\r
+    return false;\r
+}\r
+\r
+bool IsFileName(char *path)\r
+{\r
+    /* TODO: implement me */\r
+    return true;\r
+}\r
+#endif\r
+\r
+bool IsPdfFileName(char *path)\r
+{\r
+    if (str_endswith(path, ".pdf"))\r
+        return true;\r
+    return false;\r
+}\r
+\r
+static void RenderDirectory(char *path)\r
+{\r
+    FindFileState * ffs;\r
+    char            filename[MAX_FILENAME_SIZE];\r
+    StrList *       dirList = NULL;\r
+    StrList *       el;\r
+\r
+    StrList_Insert(&dirList, path);\r
+\r
+    while (0 != StrList_Len(&dirList)) {\r
+        el = StrList_RemoveHead(&dirList);\r
+        ffs = find_file_open(el->str, "*");\r
+        while (!find_file_next(ffs, filename, sizeof(filename))) {\r
+            if (IsDirectoryName(filename)) {\r
+                if (gfRecursive) {\r
+                    StrList_Insert(&dirList, filename);\r
+                }\r
+            } else if (IsFileName(filename)) {\r
+                if (IsPdfFileName(filename)) {\r
+                    RenderFile(filename);\r
+                }\r
+            }\r
+        }\r
+        find_file_close(ffs);\r
+        StrList_FreeElement(el);\r
+    }\r
+    StrList_Destroy(&dirList);\r
+}\r
+\r
+/* Render 'cmdLineArg', which can be:\r
+   - directory name\r
+   - name of PDF file\r
+   - name of text file with names of PDF files\r
+*/\r
+static void RenderCmdLineArg(char *cmdLineArg)\r
+{\r
+    assert(cmdLineArg);\r
+    if (!cmdLineArg)\r
+        return;\r
+    if (IsDirectoryName(cmdLineArg)) {\r
+        RenderDirectory(cmdLineArg);\r
+    } else if (IsFileName(cmdLineArg)) {\r
+        if (IsPdfFileName(cmdLineArg))\r
+            RenderFile(cmdLineArg);\r
+#if 0\r
+        else\r
+            RenderFileList(cmdLineArg);\r
+#endif\r
+    } else {\r
+        error(errCommandLine, -1, "unexpected argument '{0:s}'", cmdLineArg);\r
+    }\r
+}\r
+\r
+int main(int argc, char **argv)\r
+{\r
+    setErrorCallback(my_error, NULL);\r
+    ParseCommandLine(argc, argv);\r
+    if (0 == StrList_Len(&gArgsListRoot))\r
+        PrintUsageAndExit(argc, argv);\r
+    assert(gArgsListRoot);\r
+\r
+    SplashColorsInit();\r
+    globalParams = new GlobalParams();\r
+    if (!globalParams)\r
+        return 1;\r
+    globalParams->setErrQuiet(gFalse);\r
+    globalParams->setBaseDir("");\r
+\r
+    FILE * outFile = NULL;\r
+    if (gOutFileName) {\r
+        outFile = fopen(gOutFileName, "wb");\r
+        if (!outFile) {\r
+            printf("failed to open -out file %s\n", gOutFileName);\r
+            return 1;\r
+        }\r
+        gOutFile = outFile;\r
+    }\r
+    else\r
+        gOutFile = stdout;\r
+\r
+    if (gOutFileName)\r
+        gErrFile = outFile;\r
+    else\r
+        gErrFile = stderr;\r
+\r
+    PreviewBitmapInit();\r
+\r
+    StrList * curr = gArgsListRoot;\r
+    while (curr) {\r
+        RenderCmdLineArg(curr->str);\r
+        curr = curr->next;\r
+    }\r
+    if (outFile)\r
+        fclose(outFile);\r
+    PreviewBitmapDestroy();\r
+    StrList_Destroy(&gArgsListRoot);\r
+    delete globalParams;\r
+    free(gOutFileName);\r
+    return 0;\r
+}\r
+\r
diff --git a/utils/CMakeLists.txt b/utils/CMakeLists.txt
new file mode 100644 (file)
index 0000000..4a29841
--- /dev/null
@@ -0,0 +1,133 @@
+
+set(common_srcs
+  parseargs.cc
+)
+set(common_libs
+  poppler
+)
+if (FONTCONFIG_FOUND)
+  set(common_libs ${common_libs} ${FONTCONFIG_LIBRARIES})
+endif (FONTCONFIG_FOUND)
+
+if (ENABLE_SPLASH)
+  # pdftoppm
+  set(pdftoppm_SOURCES ${common_srcs}
+    pdftoppm.cc
+  )
+  add_executable(pdftoppm ${pdftoppm_SOURCES})
+  target_link_libraries(pdftoppm ${common_libs})
+  install(TARGETS pdftoppm DESTINATION bin)
+  install(FILES pdftoppm.1 DESTINATION share/man/man1)
+endif (ENABLE_SPLASH)
+
+if (HAVE_CAIRO)
+  # pdftocairo
+  set(pdftocairo_SOURCES ${common_srcs}
+    pdftocairo.cc
+    ${CMAKE_SOURCE_DIR}/poppler/CairoFontEngine.cc
+    ${CMAKE_SOURCE_DIR}/poppler/CairoOutputDev.cc
+    ${CMAKE_SOURCE_DIR}/poppler/CairoRescaleBox.cc
+  )
+  include_directories(
+    ${CMAKE_CURRENT_SOURCE_DIR}
+    ${CMAKE_CURRENT_BINARY_DIR}
+    ${CAIRO_INCLUDE_DIRS}
+  )
+  add_definitions(${CAIRO_CFLAGS})
+  add_executable(pdftocairo ${pdftocairo_SOURCES})
+  target_link_libraries(pdftocairo ${CAIRO_LIBRARIES} ${FREETYPE_LIBRARIES} ${common_libs})
+  if(LCMS_FOUND)
+    target_link_libraries(pdftocairo ${LCMS_LIBRARIES})
+  endif(LCMS_FOUND)
+  if(LCMS2_FOUND)
+    target_link_libraries(pdftocairo ${LCMS2_LIBRARIES})
+  endif(LCMS2_FOUND)
+  install(TARGETS pdftocairo DESTINATION bin)
+  install(FILES pdftocairo.1 DESTINATION share/man/man1)
+endif (HAVE_CAIRO)
+
+# pdfdetach
+set(pdfdetach_SOURCES ${common_srcs}
+  pdfdetach.cc
+)
+add_executable(pdfdetach ${pdfdetach_SOURCES})
+target_link_libraries(pdfdetach ${common_libs})
+install(TARGETS pdfdetach DESTINATION bin)
+install(FILES pdfdetach.1 DESTINATION share/man/man1)
+
+# pdffonts
+set(pdffonts_SOURCES ${common_srcs}
+  pdffonts.cc
+)
+add_executable(pdffonts ${pdffonts_SOURCES})
+target_link_libraries(pdffonts ${common_libs})
+install(TARGETS pdffonts DESTINATION bin)
+install(FILES pdffonts.1 DESTINATION share/man/man1)
+
+# pdfimages
+set(pdfimages_SOURCES ${common_srcs}
+  pdfimages.cc
+  ImageOutputDev.cc
+  ImageOutputDev.h
+)
+add_executable(pdfimages ${pdfimages_SOURCES})
+target_link_libraries(pdfimages ${common_libs})
+install(TARGETS pdfimages DESTINATION bin)
+install(FILES pdfimages.1 DESTINATION share/man/man1)
+
+# pdfinfo
+set(pdfinfo_SOURCES ${common_srcs}
+  pdfinfo.cc printencodings.cc
+)
+add_executable(pdfinfo ${pdfinfo_SOURCES})
+target_link_libraries(pdfinfo ${common_libs})
+install(TARGETS pdfinfo DESTINATION bin)
+install(FILES pdfinfo.1 DESTINATION share/man/man1)
+
+# pdftops
+set(pdftops_SOURCES ${common_srcs}
+  pdftops.cc
+)
+add_executable(pdftops ${pdftops_SOURCES})
+target_link_libraries(pdftops ${common_libs})
+install(TARGETS pdftops DESTINATION bin)
+install(FILES pdftops.1 DESTINATION share/man/man1)
+
+# pdftotext
+set(pdftotext_SOURCES ${common_srcs}
+  pdftotext.cc printencodings.cc
+)
+add_executable(pdftotext ${pdftotext_SOURCES})
+target_link_libraries(pdftotext ${common_libs})
+install(TARGETS pdftotext DESTINATION bin)
+install(FILES pdftotext.1 DESTINATION share/man/man1)
+
+# pdftohtml
+set(pdftohtml_SOURCES ${common_srcs}
+  pdftohtml.cc
+  HtmlFonts.cc
+  HtmlLinks.cc
+  HtmlOutputDev.cc
+)
+add_executable(pdftohtml ${pdftohtml_SOURCES})
+target_link_libraries(pdftohtml ${common_libs})
+install(TARGETS pdftohtml DESTINATION bin)
+install(FILES pdftohtml.1 DESTINATION share/man/man1)
+
+# pdfseparate
+set(pdfseparate_SOURCES ${common_srcs}
+  pdfseparate.cc
+)
+add_executable(pdfseparate ${pdfseparate_SOURCES})
+target_link_libraries(pdfseparate ${common_libs})
+install(TARGETS pdfseparate DESTINATION bin)
+install(FILES pdfseparate.1 DESTINATION share/man/man1)
+
+# pdfunite
+set(pdfunite_SOURCES ${common_srcs}
+  pdfunite.cc
+)
+add_executable(pdfunite ${pdfunite_SOURCES})
+target_link_libraries(pdfunite ${common_libs})
+install(TARGETS pdfunite DESTINATION bin)
+install(FILES pdfunite.1 DESTINATION share/man/man1)
diff --git a/utils/HtmlFonts.cc b/utils/HtmlFonts.cc
new file mode 100644 (file)
index 0000000..be02c5f
--- /dev/null
@@ -0,0 +1,386 @@
+//========================================================================
+//
+// This file comes from pdftohtml project
+// http://pdftohtml.sourceforge.net
+//
+// Copyright from:
+// Gueorgui Ovtcharov
+// Rainer Dorsch <http://www.ra.informatik.uni-stuttgart.de/~rainer/>
+// Mikhail Kruk <meshko@cs.brandeis.edu>
+//
+//========================================================================
+
+//========================================================================
+//
+// Modified under the Poppler project - http://poppler.freedesktop.org
+//
+// All changes made under the Poppler project to this file are licensed
+// under GPL version 2 or later
+//
+// Copyright (C) 2007, 2010 Albert Astals Cid <aacid@kde.org>
+// Copyright (C) 2008 Boris Toloknov <tlknv@yandex.ru>
+// Copyright (C) 2008 Tomas Are Haavet <tomasare@gmail.com>
+// Copyright (C) 2010 OSSD CDAC Mumbai by Leena Chourey (leenac@cdacmumbai.in) and Onkar Potdar (onkar@cdacmumbai.in)
+// Copyright (C) 2011 Joshua Richardson <jric@chegg.com>
+// Copyright (C) 2011 Stephen Reichling <sreichling@chegg.com>
+// Copyright (C) 2012 Igor Slepchin <igor.slepchin@gmail.com>
+//
+// To see a description of the changes please see the Changelog file that
+// came with your tarball or type make ChangeLog if you are building from git
+//
+//========================================================================
+
+#include "HtmlFonts.h"
+#include "HtmlUtils.h"
+#include "GlobalParams.h"
+#include "UnicodeMap.h"
+#include "GfxFont.h"
+#include <stdio.h>
+
+ struct Fonts{
+    const char *Fontname;
+    const char *name;
+  };
+
+const int font_num=13;
+
+static Fonts fonts[font_num+1]={  
+     {"Courier",               "Courier" },
+     {"Courier-Bold",           "Courier"},
+     {"Courier-BoldOblique",    "Courier"},
+     {"Courier-Oblique",        "Courier"},
+     {"Helvetica",              "Helvetica"},
+     {"Helvetica-Bold",         "Helvetica"},
+     {"Helvetica-BoldOblique",  "Helvetica"},
+     {"Helvetica-Oblique",      "Helvetica"},
+     {"Symbol",                 "Symbol"   },
+     {"Times-Bold",             "Times"    },
+     {"Times-BoldItalic",       "Times"    },
+     {"Times-Italic",           "Times"    },
+     {"Times-Roman",            "Times"    },
+     {" "          ,            "Times"    },
+};
+
+#define xoutRound(x) ((int)(x + 0.5))
+extern GBool xml;
+
+GooString* HtmlFont::DefaultFont=new GooString("Times"); // Arial,Helvetica,sans-serif
+
+HtmlFontColor::HtmlFontColor(GfxRGB rgb){
+  r=static_cast<int>(rgb.r/65535.0*255.0);
+  g=static_cast<int>(rgb.g/65535.0*255.0);
+  b=static_cast<int>(rgb.b/65535.0*255.0);
+  if (!(Ok(r)&&Ok(b)&&Ok(g))) {
+    if (!globalParams->getErrQuiet()) fprintf(stderr, "Error : Bad color (%d,%d,%d) reset to (0,0,0)\n", r, g, b);
+    r=0;g=0;b=0;
+  }
+}
+
+GooString *HtmlFontColor::convtoX(unsigned int xcol) const{
+  GooString *xret=new GooString();
+  char tmp;
+  unsigned  int k;
+  k = (xcol/16);
+  if ((k>=0)&&(k<10)) tmp=(char) ('0'+k); else tmp=(char)('a'+k-10);
+  xret->append(tmp);
+  k = (xcol%16);
+  if ((k>=0)&&(k<10)) tmp=(char) ('0'+k); else tmp=(char)('a'+k-10);
+  xret->append(tmp);
+ return xret;
+}
+
+GooString *HtmlFontColor::toString() const{
+  GooString *tmp=new GooString("#");
+  GooString *tmpr=convtoX(r); 
+  GooString *tmpg=convtoX(g);
+  GooString *tmpb=convtoX(b);
+  tmp->append(tmpr);
+  tmp->append(tmpg);
+  tmp->append(tmpb);
+  delete tmpr;
+  delete tmpg;
+  delete tmpb;
+  return tmp;
+} 
+
+HtmlFont::HtmlFont(GfxFont *font, int _size, GfxRGB rgb){
+  //if (col) color=HtmlFontColor(col); 
+  //else color=HtmlFontColor();
+  color=HtmlFontColor(rgb);
+  GooString* ftname=font->getName();
+  if (!ftname) ftname = getDefaultFont();
+
+  GooString *fontname = NULL;
+
+  if( ftname ){
+    fontname = new GooString(ftname);
+    FontName=new GooString(ftname);
+  }
+  else {
+    fontname = NULL;
+    FontName = NULL;
+  }
+  
+  lineSize = -1;
+
+  size=(_size-1);
+  italic = gFalse;
+  bold = gFalse;
+  rotOrSkewed = gFalse;
+
+  if (font->isBold() || font->getWeight() >= GfxFont::W700) bold=gTrue;
+  if (font->isItalic()) italic=gTrue;
+
+  if (fontname){
+    if (!bold && strstr(fontname->lowerCase()->getCString(),"bold")) {
+               bold=gTrue;
+    }
+
+    if (!italic &&
+       (strstr(fontname->lowerCase()->getCString(),"italic")||
+        strstr(fontname->lowerCase()->getCString(),"oblique"))) {
+               italic=gTrue;
+    }
+
+    int i=0;
+    while (strcmp(ftname->getCString(),fonts[i].Fontname)&&(i<font_num)) 
+       {
+               i++;
+       }
+    pos=i;
+    delete fontname;
+  } else
+    pos = font_num; 
+  if (!DefaultFont) DefaultFont=new GooString(fonts[font_num].name);
+
+}
+HtmlFont::HtmlFont(const HtmlFont& x){
+   size=x.size;
+   lineSize=x.lineSize;
+   italic=x.italic;
+   bold=x.bold;
+   pos=x.pos;
+   color=x.color;
+   if (x.FontName) FontName=new GooString(x.FontName);
+   rotOrSkewed = x.rotOrSkewed;
+   memcpy(rotSkewMat, x.rotSkewMat, sizeof(rotSkewMat));
+ }
+
+
+HtmlFont::~HtmlFont(){
+  if (FontName) delete FontName;
+}
+
+HtmlFont& HtmlFont::operator=(const HtmlFont& x){
+   if (this==&x) return *this; 
+   size=x.size;
+   lineSize=x.lineSize;
+   italic=x.italic;
+   bold=x.bold;
+   pos=x.pos;
+   color=x.color;
+   if (FontName) delete FontName;
+   if (x.FontName) FontName=new GooString(x.FontName);
+   return *this;
+}
+
+void HtmlFont::clear(){
+  if(DefaultFont) delete DefaultFont;
+  DefaultFont = NULL;
+}
+
+
+
+/*
+  This function is used to compare font uniquely for insertion into
+  the list of all encountered fonts
+*/
+GBool HtmlFont::isEqual(const HtmlFont& x) const{
+  return (size==x.size) &&
+         (lineSize==x.lineSize) &&
+         (pos==x.pos) && (bold==x.bold) && (italic==x.italic) &&
+         (color.isEqual(x.getColor())) && isRotOrSkewed() == x.isRotOrSkewed() &&
+         (!isRotOrSkewed() || rot_matrices_equal(getRotMat(), x.getRotMat()));
+}
+
+/*
+  This one is used to decide whether two pieces of text can be joined together
+  and therefore we don't care about bold/italics properties
+*/
+GBool HtmlFont::isEqualIgnoreBold(const HtmlFont& x) const{
+  return ((size==x.size) &&
+         (!strcmp(fonts[pos].name, fonts[x.pos].name)) &&
+         (color.isEqual(x.getColor())));
+}
+
+GooString* HtmlFont::getFontName(){
+   if (pos!=font_num) return new GooString(fonts[pos].name);
+    else return new GooString(DefaultFont);
+}
+
+GooString* HtmlFont::getFullName(){
+  if (FontName)
+    return new GooString(FontName);
+  else return new GooString(DefaultFont);
+} 
+
+void HtmlFont::setDefaultFont(GooString* defaultFont){
+  if (DefaultFont) delete DefaultFont;
+  DefaultFont=new GooString(defaultFont);
+}
+
+
+GooString* HtmlFont::getDefaultFont(){
+  return DefaultFont;
+}
+
+// this method if plain wrong todo
+GooString* HtmlFont::HtmlFilter(Unicode* u, int uLen) {
+  GooString *tmp = new GooString();
+  UnicodeMap *uMap;
+  char buf[8];
+  int n;
+
+  // get the output encoding
+  if (!(uMap = globalParams->getTextEncoding())) {
+    return tmp;
+  }
+
+  for (int i = 0; i < uLen; ++i) {
+    switch (u[i])
+      { 
+       case '"': tmp->append("&#34;");  break;
+       case '&': tmp->append("&amp;");  break;
+       case '<': tmp->append("&lt;");  break;
+       case '>': tmp->append("&gt;");  break;
+       case ' ': tmp->append( !xml && ( i+1 >= uLen || !tmp->getLength() || tmp->getChar( tmp->getLength()-1 ) == ' ' ) ? "&#160;" : " " );
+                 break;
+       default:  
+         {
+           // convert unicode to string
+           if ((n = uMap->mapUnicode(u[i], buf, sizeof(buf))) > 0) {
+             tmp->append(buf, n); 
+         }
+      }
+    }
+  }
+
+  uMap->decRefCnt();
+  return tmp;
+}
+
+GooString* HtmlFont::simple(HtmlFont* font, Unicode* content, int uLen){
+  GooString *cont=HtmlFilter (content, uLen); 
+
+  /*if (font.isBold()) {
+    cont->insert(0,"<b>",3);
+    cont->append("</b>",4);
+  }
+  if (font.isItalic()) {
+    cont->insert(0,"<i>",3);
+    cont->append("</i>",4);
+    } */
+
+  return cont;
+}
+
+HtmlFontAccu::HtmlFontAccu(){
+  accu=new std::vector<HtmlFont>();
+}
+
+HtmlFontAccu::~HtmlFontAccu(){
+  if (accu) delete accu;
+}
+
+int HtmlFontAccu::AddFont(const HtmlFont& font){
+ std::vector<HtmlFont>::iterator i; 
+ for (i=accu->begin();i!=accu->end();i++)
+ {
+       if (font.isEqual(*i)) 
+       {
+               return (int)(i-(accu->begin()));
+       }
+ }
+
+ accu->push_back(font);
+ return (accu->size()-1);
+}
+
+// get CSS font definition for font #i 
+GooString* HtmlFontAccu::CSStyle(int i, int j){
+   GooString *tmp=new GooString();
+   GooString *iStr=GooString::fromInt(i);
+   GooString *jStr=GooString::fromInt(j);
+
+   std::vector<HtmlFont>::iterator g=accu->begin();
+   g+=i;
+   HtmlFont font=*g;
+   GooString *Size=GooString::fromInt(font.getSize());
+   GooString *colorStr=font.getColor().toString();
+   GooString *fontName=font.getFontName();
+   GooString *lSize;
+   
+   if(!xml){
+     tmp->append(".ft");
+     tmp->append(jStr);
+     tmp->append(iStr);
+     tmp->append("{font-size:");
+     tmp->append(Size);
+     if( font.getLineSize() != -1 && font.getLineSize() != 0 )
+     {
+        lSize = GooString::fromInt(font.getLineSize());
+        tmp->append("px;line-height:");
+        tmp->append(lSize);
+        delete lSize;
+     }
+     tmp->append("px;font-family:");
+     tmp->append(fontName); //font.getFontName());
+     tmp->append(";color:");
+     tmp->append(colorStr);
+     // if there is rotation or skew, include the matrix
+     if (font.isRotOrSkewed()) {
+        const double * const text_mat = font.getRotMat();
+        GooString matrix_str(" matrix(");
+        matrix_str.appendf("{0:10.10g}, {1:10.10g}, {2:10.10g}, {3:10.10g}, 0, 0)",
+                        text_mat[0], text_mat[1], text_mat[2], text_mat[3]);
+        tmp->append(";-moz-transform:");
+        tmp->append(&matrix_str);
+        tmp->append(";-webkit-transform:");
+        tmp->append(&matrix_str);
+        tmp->append(";-o-transform:");
+        tmp->append(&matrix_str);
+        tmp->append(";-ms-transform:");
+        tmp->append(&matrix_str);
+        // Todo: 75% is a wild guess that seems to work pretty well;
+        // We probably need to calculate the real percentage
+        // Based on the characteristic baseline and bounding box of current font
+        // PDF origin is at baseline
+        tmp->append(";-moz-transform-origin: left 75%");
+        tmp->append(";-webkit-transform-origin: left 75%");
+        tmp->append(";-o-transform-origin: left 75%");
+        tmp->append(";-ms-transform-origin: left 75%");
+     }
+     tmp->append(";}");
+   }
+   if (xml) {
+     tmp->append("<fontspec id=\"");
+     tmp->append(iStr);
+     tmp->append("\" size=\"");
+     tmp->append(Size);
+     tmp->append("\" family=\"");
+     tmp->append(fontName); //font.getFontName());
+     tmp->append("\" color=\"");
+     tmp->append(colorStr);
+     tmp->append("\"/>");
+   }
+
+   delete fontName;
+   delete colorStr;
+   delete jStr;
+   delete iStr;
+   delete Size;
+   return tmp;
+}
+
diff --git a/utils/HtmlFonts.h b/utils/HtmlFonts.h
new file mode 100644 (file)
index 0000000..22368b2
--- /dev/null
@@ -0,0 +1,117 @@
+//========================================================================
+//
+// This file comes from pdftohtml project
+// http://pdftohtml.sourceforge.net
+//
+// Copyright from:
+// Gueorgui Ovtcharov
+// Rainer Dorsch <http://www.ra.informatik.uni-stuttgart.de/~rainer/>
+// Mikhail Kruk <meshko@cs.brandeis.edu>
+//
+//========================================================================
+
+//========================================================================
+//
+// Modified under the Poppler project - http://poppler.freedesktop.org
+//
+// All changes made under the Poppler project to this file are licensed
+// under GPL version 2 or later
+//
+// Copyright (C) 2010 OSSD CDAC Mumbai by Leena Chourey (leenac@cdacmumbai.in) and Onkar Potdar (onkar@cdacmumbai.in)
+// Copyright (C) 2010 Albert Astals Cid <aacid@kde.org>
+// Copyright (C) 2011 Steven Murdoch <Steven.Murdoch@cl.cam.ac.uk>
+// Copyright (C) 2011 Joshua Richardson <jric@chegg.com>
+// Copyright (C) 2012 Igor Slepchin <igor.slepchin@gmail.com>
+//
+// To see a description of the changes please see the Changelog file that
+// came with your tarball or type make ChangeLog if you are building from git
+//
+//========================================================================
+
+#ifndef _HTML_FONTS_H
+#define _HTML_FONTS_H
+#include "goo/GooString.h"
+#include "GfxState.h"
+#include "CharTypes.h"
+#include <vector>
+
+class HtmlFontColor{
+ private:
+   unsigned int r;
+   unsigned int g;
+   unsigned int b;
+   GBool Ok(unsigned int xcol){ return ((xcol<=255)&&(xcol>=0));}
+   GooString *convtoX(unsigned  int xcol) const;
+ public:
+   HtmlFontColor():r(0),g(0),b(0){}
+   HtmlFontColor(GfxRGB rgb);
+   HtmlFontColor(const HtmlFontColor& x){r=x.r;g=x.g;b=x.b;}
+   HtmlFontColor& operator=(const HtmlFontColor &x){
+     r=x.r;g=x.g;b=x.b;
+     return *this;
+   }
+   ~HtmlFontColor(){};
+   GooString* toString() const;
+   GBool isEqual(const HtmlFontColor& col) const{
+     return ((r==col.r)&&(g==col.g)&&(b==col.b));
+   }
+} ;  
+
+
+class HtmlFont{
+ private:
+   unsigned int size;
+   int lineSize;
+   GBool italic;
+   GBool bold;
+   GBool rotOrSkewed;
+   int pos; // position of the font name in the fonts array
+   static GooString *DefaultFont;
+   GooString *FontName;
+   HtmlFontColor color;
+   double rotSkewMat[4]; // only four values needed for rotation and skew
+public:  
+
+   HtmlFont(){FontName=NULL; rotOrSkewed = gFalse;}
+   HtmlFont(GfxFont *font,int _size, GfxRGB rgb);
+   HtmlFont(const HtmlFont& x);
+   HtmlFont& operator=(const HtmlFont& x);
+   HtmlFontColor getColor() const {return color;}
+   ~HtmlFont();
+   static void clear();
+   GooString* getFullName();
+   GBool isItalic() const {return italic;}
+   GBool isBold() const {return bold;}
+   GBool isRotOrSkewed() const { return rotOrSkewed; }
+   unsigned int getSize() const {return size;}
+   int getLineSize() const {return lineSize;}
+   void setLineSize(int _lineSize) { lineSize = _lineSize; }
+   void setRotMat(const double * const mat)
+   { rotOrSkewed = gTrue; memcpy(rotSkewMat, mat, sizeof(rotSkewMat)); }
+   const double *getRotMat() const { return rotSkewMat; }
+   GooString* getFontName();
+   static GooString* getDefaultFont();
+   static void setDefaultFont(GooString* defaultFont);
+   static GooString* HtmlFilter(Unicode* u, int uLen); //char* s);
+   GBool isEqual(const HtmlFont& x) const;
+   GBool isEqualIgnoreBold(const HtmlFont& x) const;
+   static GooString* simple(HtmlFont *font, Unicode *content, int uLen);
+   void print() const {printf("font: %s %d %s%spos: %d\n", FontName->getCString(), size, bold ? "bold " : "", italic ? "italic " : "", pos);};
+};
+
+class HtmlFontAccu{
+private:
+  std::vector<HtmlFont> *accu;
+  
+public:
+  HtmlFontAccu();
+  ~HtmlFontAccu();
+  int AddFont(const HtmlFont& font);
+  HtmlFont *Get(int i){
+    return &(*accu)[i];
+  } 
+  GooString* CSStyle(int i, int j = 0);
+  int size() const {return accu->size();}
+  
+};  
+#endif
diff --git a/utils/HtmlLinks.cc b/utils/HtmlLinks.cc
new file mode 100644 (file)
index 0000000..1d609f6
--- /dev/null
@@ -0,0 +1,143 @@
+//========================================================================
+//
+// This file comes from pdftohtml project
+// http://pdftohtml.sourceforge.net
+//
+// Copyright from:
+// Gueorgui Ovtcharov
+// Rainer Dorsch <http://www.ra.informatik.uni-stuttgart.de/~rainer/>
+// Mikhail Kruk <meshko@cs.brandeis.edu>
+//
+//========================================================================
+
+//========================================================================
+//
+// Modified under the Poppler project - http://poppler.freedesktop.org
+//
+// All changes made under the Poppler project to this file are licensed
+// under GPL version 2 or later
+//
+// Copyright (C) 2008 Boris Toloknov <tlknv@yandex.ru>
+// Copyright (C) 2010 Albert Astals Cid <aacid@kde.org>
+//
+// To see a description of the changes please see the Changelog file that
+// came with your tarball or type make ChangeLog if you are building from git
+//
+//========================================================================
+
+#include "HtmlLinks.h"
+
+extern GBool xml;
+
+HtmlLink::HtmlLink(const HtmlLink& x){
+  Xmin=x.Xmin;
+  Ymin=x.Ymin;
+  Xmax=x.Xmax;
+  Ymax=x.Ymax;
+  dest=new GooString(x.dest);
+}
+
+HtmlLink::HtmlLink(double xmin,double ymin,double xmax,double ymax,GooString * _dest)
+{
+   if (xmin < xmax) {
+    Xmin=xmin;
+    Xmax=xmax;
+  } else {
+    Xmin=xmax;
+    Xmax=xmin;
+  }
+  if (ymin < ymax) {
+    Ymin=ymin;
+    Ymax=ymax;
+  } else {
+    Ymin=ymax;
+    Ymax=ymin;
+  }                    
+  dest=new GooString(_dest);
+}
+
+HtmlLink::~HtmlLink(){
+ delete dest;
+}
+
+GBool HtmlLink::isEqualDest(const HtmlLink& x) const{
+  return (!strcmp(dest->getCString(), x.dest->getCString()));
+}
+
+GBool HtmlLink::inLink(double xmin,double ymin,double xmax,double ymax) const {
+  double y=(ymin+ymax)/2;
+  if (y>Ymax) return gFalse;
+  return (y>Ymin)&&(xmin<Xmax)&&(xmax>Xmin);
+ }
+  
+static GooString* EscapeSpecialChars( GooString* s )
+{
+    GooString* tmp = NULL;
+    for( int i = 0, j = 0; i < s->getLength(); i++, j++ ){
+        const char *replace = NULL;
+        switch ( s->getChar(i) ){
+               case '"': replace = "&quot;";  break;
+               case '&': replace = "&amp;";  break;
+               case '<': replace = "&lt;";  break;
+               case '>': replace = "&gt;";  break;
+               default: continue;
+           }
+           if( replace ){
+               if( !tmp ) tmp = new GooString( s );
+               if( tmp ){
+                   tmp->del( j, 1 );
+                   int l = strlen( replace );
+                   tmp->insert( j, replace, l );
+                   j += l - 1;
+               }
+           }
+       }
+       return tmp ? tmp : s;
+}
+
+GooString* HtmlLink::getLinkStart() {
+  GooString *res = new GooString("<a href=\"");
+  GooString *d = xml ? EscapeSpecialChars(dest) : dest;
+  res->append( d );
+  if( d != dest ) delete d;
+  res->append("\">");
+  return res;
+}
+
+/*GooString* HtmlLink::Link(GooString* content){
+  //GooString* _dest=new GooString(dest);
+  GooString *tmp=new GooString("<a href=\"");
+  tmp->append(dest);
+  tmp->append("\">");
+  tmp->append(content);
+  tmp->append("</a>");
+  //delete _dest;
+  return tmp;
+  }*/
+
+   
+
+HtmlLinks::HtmlLinks(){
+  accu=new std::vector<HtmlLink>();
+}
+
+HtmlLinks::~HtmlLinks(){
+  delete accu;
+  accu=NULL; 
+}
+
+GBool HtmlLinks::inLink(double xmin,double ymin,double xmax,double ymax,int& p)const {
+  
+  for(std::vector<HtmlLink>::iterator i=accu->begin();i!=accu->end();i++){
+    if (i->inLink(xmin,ymin,xmax,ymax)) {
+        p=(i - accu->begin());
+        return 1;
+    }
+   }
+  return 0;
+}
+
+HtmlLink* HtmlLinks::getLink(int i) const{
+  return &(*accu)[i];
+}
+
diff --git a/utils/HtmlLinks.h b/utils/HtmlLinks.h
new file mode 100644 (file)
index 0000000..4a48dfa
--- /dev/null
@@ -0,0 +1,73 @@
+//========================================================================
+//
+// This file comes from pdftohtml project
+// http://pdftohtml.sourceforge.net
+//
+// Copyright from:
+// Gueorgui Ovtcharov
+// Rainer Dorsch <http://www.ra.informatik.uni-stuttgart.de/~rainer/>
+// Mikhail Kruk <meshko@cs.brandeis.edu>
+//
+//========================================================================
+
+//========================================================================
+//
+// Modified under the Poppler project - http://poppler.freedesktop.org
+//
+// All changes made under the Poppler project to this file are licensed
+// under GPL version 2 or later
+//
+// Copyright (C) 2010 Albert Astals Cid <aacid@kde.org>
+//
+// To see a description of the changes please see the Changelog file that
+// came with your tarball or type make ChangeLog if you are building from git
+//
+//========================================================================
+
+#ifndef _HTML_LINKS
+#define _HTML_LINKS
+
+#include <stdlib.h>
+#include <string.h>
+#include <vector>
+#include "goo/GooString.h"
+
+class HtmlLink{
+
+private:  
+  double Xmin;
+  double Ymin;
+  double Xmax;
+  double Ymax;
+  GooString* dest;
+
+public:
+  HtmlLink(const HtmlLink& x);
+  HtmlLink(double xmin,double ymin,double xmax,double ymax,GooString *_dest);
+  ~HtmlLink();
+  GBool isEqualDest(const HtmlLink& x) const;
+  GooString *getDest(){return new GooString(dest);}
+  double getX1() const {return Xmin;}
+  double getX2() const {return Xmax;}
+  double getY1() const {return Ymin;}
+  double getY2() const {return Ymax;}
+  GBool inLink(double xmin,double ymin,double xmax,double ymax) const ;
+  //GooString *Link(GooString *content);
+  GooString* getLinkStart();
+  
+};
+
+class HtmlLinks{
+private:
+ std::vector<HtmlLink> *accu;
+public:
+ HtmlLinks();
+ ~HtmlLinks();
+ void AddLink(const HtmlLink& x) {accu->push_back(x);}
+ GBool inLink(double xmin,double ymin,double xmax,double ymax,int& p) const;
+ HtmlLink* getLink(int i) const;
+
+};
+
+#endif
+   
diff --git a/utils/HtmlOutputDev.cc b/utils/HtmlOutputDev.cc
new file mode 100644 (file)
index 0000000..1d1b628
--- /dev/null
@@ -0,0 +1,1886 @@
+//========================================================================
+//
+// HtmlOutputDev.cc
+//
+// Copyright 1997-2002 Glyph & Cog, LLC
+//
+// Changed 1999-2000 by G.Ovtcharov
+//
+// Changed 2002 by Mikhail Kruk
+//
+//========================================================================
+
+//========================================================================
+//
+// Modified under the Poppler project - http://poppler.freedesktop.org
+//
+// All changes made under the Poppler project to this file are licensed
+// under GPL version 2 or later
+//
+// Copyright (C) 2005-2012 Albert Astals Cid <aacid@kde.org>
+// Copyright (C) 2008 Kjartan Maraas <kmaraas@gnome.org>
+// Copyright (C) 2008 Boris Toloknov <tlknv@yandex.ru>
+// Copyright (C) 2008 Haruyuki Kawabe <Haruyuki.Kawabe@unisys.co.jp>
+// Copyright (C) 2008 Tomas Are Haavet <tomasare@gmail.com>
+// Copyright (C) 2009 Warren Toomey <wkt@tuhs.org>
+// Copyright (C) 2009, 2011 Carlos Garcia Campos <carlosgc@gnome.org>
+// Copyright (C) 2009 Reece Dunn <msclrhd@gmail.com>
+// Copyright (C) 2010 Adrian Johnson <ajohnson@redneon.com>
+// Copyright (C) 2010 Hib Eris <hib@hiberis.nl>
+// Copyright (C) 2010 OSSD CDAC Mumbai by Leena Chourey (leenac@cdacmumbai.in) and Onkar Potdar (onkar@cdacmumbai.in)
+// Copyright (C) 2011 Joshua Richardson <jric@chegg.com>
+// Copyright (C) 2011 Stephen Reichling <sreichling@chegg.com>
+// Copyright (C) 2011, 2012 Igor Slepchin <igor.slepchin@gmail.com>
+// Copyright (C) 2012 Ihar Filipau <thephilips@gmail.com>
+//
+// To see a description of the changes please see the Changelog file that
+// came with your tarball or type make ChangeLog if you are building from git
+//
+//========================================================================
+
+#ifdef __GNUC__
+#pragma implementation
+#endif
+
+#include "config.h"
+#include <stdio.h>
+#include <stdlib.h>
+#include <stdarg.h>
+#include <stddef.h>
+#include <ctype.h>
+#include <math.h>
+#include <iostream>
+#include "goo/GooString.h"
+#include "goo/GooList.h"
+#include "UnicodeMap.h"
+#include "goo/gmem.h"
+#include "Error.h"
+#include "GfxState.h"
+#include "Page.h"
+#include "Annot.h"
+#include "PNGWriter.h"
+#include "GlobalParams.h"
+#include "HtmlOutputDev.h"
+#include "HtmlFonts.h"
+#include "HtmlUtils.h"
+#include "Outline.h"
+#include "PDFDoc.h"
+
+#define DEBUG __FILE__ << ": " << __LINE__ << ": DEBUG: "
+
+class HtmlImage
+{
+public:
+    HtmlImage(GooString *_fName, GfxState *state)
+      : fName(_fName) {
+    state->transform(0, 0, &xMin, &yMax);
+    state->transform(1, 1, &xMax, &yMin);
+  }
+ ~HtmlImage() { delete fName; }
+
+  double xMin, xMax;           // image x coordinates
+  double yMin, yMax;           // image y coordinates
+  GooString  *fName;           // image file name
+};
+
+// returns true if x is closer to y than x is to z
+static inline bool IS_CLOSER(float x, float y, float z) { return fabs((x)-(y)) < fabs((x)-(z)); }
+
+extern GBool complexMode;
+extern GBool singleHtml;
+extern GBool ignore;
+extern GBool printCommands;
+extern GBool printHtml;
+extern GBool noframes;
+extern GBool stout;
+extern GBool xml;
+extern GBool showHidden;
+extern GBool noMerge;
+
+extern double wordBreakThreshold;
+
+static GBool debug = gFalse;
+static GooString *gstr_buff0 = NULL; // a workspace in which I format strings
+
+static GooString* basename(GooString* str){
+  
+  char *p=str->getCString();
+  int len=str->getLength();
+  for (int i=len-1;i>=0;i--)
+    if (*(p+i)==SLASH) 
+      return new GooString((p+i+1),len-i-1);
+  return new GooString(str);
+}
+
+#if 0
+static GooString* Dirname(GooString* str){
+  
+  char *p=str->getCString();
+  int len=str->getLength();
+  for (int i=len-1;i>=0;i--)
+    if (*(p+i)==SLASH) 
+      return new GooString(p,i+1);
+  return new GooString();
+} 
+#endif
+
+static const char *print_matrix(const double *mat) {
+  delete gstr_buff0;
+
+  gstr_buff0 =  GooString::format("[{0:g} {1:g} {2:g} {3:g} {4:g} {5:g}]",
+                                  *mat, mat[1], mat[2], mat[3], mat[4], mat[5]);
+  return gstr_buff0->getCString();
+}
+
+static const char *print_uni_str(const Unicode *u, const unsigned uLen) {
+  GooString *gstr_buff1 = NULL;
+
+  delete gstr_buff0;
+
+  if (!uLen) return "";
+  gstr_buff0 = GooString::format("{0:c}", (*u < 0x7F ? *u & 0xFF : '?'));
+  for (unsigned i = 1; i < uLen; i++) {
+    if (u[i] < 0x7F) {
+      gstr_buff1 = gstr_buff0->append(u[i] < 0x7F ? static_cast<char>(u[i]) & 0xFF : '?');
+      delete gstr_buff0;
+      gstr_buff0 = gstr_buff1;
+    }
+  }
+
+  return gstr_buff0->getCString();
+}
+
+//------------------------------------------------------------------------
+// HtmlString
+//------------------------------------------------------------------------
+
+HtmlString::HtmlString(GfxState *state, double fontSize, HtmlFontAccu* _fonts) : fonts(_fonts) {
+  GfxFont *font;
+  double x, y;
+
+  state->transform(state->getCurX(), state->getCurY(), &x, &y);
+  if ((font = state->getFont())) {
+    double ascent = font->getAscent();
+    double descent = font->getDescent();
+    if( ascent > 1.05 ){
+        //printf( "ascent=%.15g is too high, descent=%.15g\n", ascent, descent );
+        ascent = 1.05;
+    }
+    if( descent < -0.4 ){
+        //printf( "descent %.15g is too low, ascent=%.15g\n", descent, ascent );
+        descent = -0.4;
+    }
+    yMin = y - ascent * fontSize;
+    yMax = y - descent * fontSize;
+    GfxRGB rgb;
+    state->getFillRGB(&rgb);
+    HtmlFont hfont=HtmlFont(font, static_cast<int>(fontSize-1), rgb);
+    if (isMatRotOrSkew(state->getTextMat())) {
+      double normalizedMatrix[4];
+      memcpy(normalizedMatrix, state->getTextMat(), sizeof(normalizedMatrix));
+      // browser rotates the opposite way
+      // so flip the sign of the angle -> sin() components change sign
+      if (debug)
+        std::cerr << DEBUG << "before transform: " << print_matrix(normalizedMatrix) << std::endl;
+      normalizedMatrix[1] *= -1;
+      normalizedMatrix[2] *= -1;
+      if (debug)
+        std::cerr << DEBUG << "after reflecting angle: " << print_matrix(normalizedMatrix) << std::endl;
+      normalizeRotMat(normalizedMatrix);
+      if (debug)
+        std::cerr << DEBUG << "after norm: " << print_matrix(normalizedMatrix) << std::endl;
+      hfont.setRotMat(normalizedMatrix);
+    }
+    fontpos = fonts->AddFont(hfont);
+  } else {
+    // this means that the PDF file draws text without a current font,
+    // which should never happen
+    yMin = y - 0.95 * fontSize;
+    yMax = y + 0.35 * fontSize;
+    fontpos=0;
+  }
+  if (yMin == yMax) {
+    // this is a sanity check for a case that shouldn't happen -- but
+    // if it does happen, we want to avoid dividing by zero later
+    yMin = y;
+    yMax = y + 1;
+  }
+  col = 0;
+  text = NULL;
+  xRight = NULL;
+  link = NULL;
+  len = size = 0;
+  yxNext = NULL;
+  xyNext = NULL;
+  htext=new GooString();
+  dir = textDirUnknown;
+}
+
+
+HtmlString::~HtmlString() {
+  gfree(text);
+  delete htext;
+  gfree(xRight);
+}
+
+void HtmlString::addChar(GfxState *state, double x, double y,
+                        double dx, double dy, Unicode u) {
+  if (dir == textDirUnknown) {
+    //dir = UnicodeMap::getDirection(u);
+    dir = textDirLeftRight;
+  } 
+
+  if (len == size) {
+    size += 16;
+    text = (Unicode *)grealloc(text, size * sizeof(Unicode));
+    xRight = (double *)grealloc(xRight, size * sizeof(double));
+  }
+  text[len] = u;
+  if (len == 0) {
+    xMin = x;
+  }
+  xMax = xRight[len] = x + dx;
+//printf("added char: %f %f xright = %f\n", x, dx, x+dx);
+  ++len;
+}
+
+void HtmlString::endString()
+{
+  if( dir == textDirRightLeft && len > 1 )
+  {
+    //printf("will reverse!\n");
+    for (int i = 0; i < len / 2; i++)
+    {
+      Unicode ch = text[i];
+      text[i] = text[len - i - 1];
+      text[len - i - 1] = ch;
+    }
+  }
+}
+
+//------------------------------------------------------------------------
+// HtmlPage
+//------------------------------------------------------------------------
+
+HtmlPage::HtmlPage(GBool rawOrder, char *imgExtVal) {
+  this->rawOrder = rawOrder;
+  curStr = NULL;
+  yxStrings = NULL;
+  xyStrings = NULL;
+  yxCur1 = yxCur2 = NULL;
+  fonts=new HtmlFontAccu();
+  links=new HtmlLinks();
+  imgList=new GooList();
+  pageWidth=0;
+  pageHeight=0;
+  fontsPageMarker = 0;
+  DocName=NULL;
+  firstPage = -1;
+  imgExt = new GooString(imgExtVal);
+}
+
+HtmlPage::~HtmlPage() {
+  clear();
+  delete DocName;
+  delete fonts;
+  delete links;
+  delete imgExt;
+  deleteGooList(imgList, HtmlImage);
+}
+
+void HtmlPage::updateFont(GfxState *state) {
+  GfxFont *font;
+  double *fm;
+  char *name;
+  int code;
+  double w;
+  
+  // adjust the font size
+  fontSize = state->getTransformedFontSize();
+  if ((font = state->getFont()) && font->getType() == fontType3) {
+    // This is a hack which makes it possible to deal with some Type 3
+    // fonts.  The problem is that it's impossible to know what the
+    // base coordinate system used in the font is without actually
+    // rendering the font.  This code tries to guess by looking at the
+    // width of the character 'm' (which breaks if the font is a
+    // subset that doesn't contain 'm').
+    for (code = 0; code < 256; ++code) {
+      if ((name = ((Gfx8BitFont *)font)->getCharName(code)) &&
+         name[0] == 'm' && name[1] == '\0') {
+       break;
+      }
+    }
+    if (code < 256) {
+      w = ((Gfx8BitFont *)font)->getWidth(code);
+      if (w != 0) {
+       // 600 is a generic average 'm' width -- yes, this is a hack
+       fontSize *= w / 0.6;
+      }
+    }
+    fm = font->getFontMatrix();
+    if (fm[0] != 0) {
+      fontSize *= fabs(fm[3] / fm[0]);
+    }
+  }
+}
+
+void HtmlPage::beginString(GfxState *state, GooString *s) {
+  curStr = new HtmlString(state, fontSize, fonts);
+}
+
+
+void HtmlPage::conv(){
+  HtmlString *tmp;
+
+  int linkIndex = 0;
+  HtmlFont* h;
+  for(tmp=yxStrings;tmp;tmp=tmp->yxNext){
+     int pos=tmp->fontpos;
+     //  printf("%d\n",pos);
+     h=fonts->Get(pos);
+
+     if (tmp->htext) delete tmp->htext; 
+     tmp->htext=HtmlFont::simple(h,tmp->text,tmp->len);
+
+     if (links->inLink(tmp->xMin,tmp->yMin,tmp->xMax,tmp->yMax, linkIndex)){
+       tmp->link = links->getLink(linkIndex);
+       /*GooString *t=tmp->htext;
+       tmp->htext=links->getLink(k)->Link(tmp->htext);
+       delete t;*/
+     }
+  }
+
+}
+
+
+void HtmlPage::addChar(GfxState *state, double x, double y,
+                      double dx, double dy, 
+                       double ox, double oy, Unicode *u, int uLen) {
+  double x1, y1, w1, h1, dx2, dy2;
+  int n, i;
+  state->transform(x, y, &x1, &y1);
+  n = curStr->len;
+  // check that new character is in the same direction as current string
+  // and is not too far away from it before adding 
+  //if ((UnicodeMap::getDirection(u[0]) != curStr->dir) || 
+  // XXX
+  if (debug) {
+    double *text_mat = state->getTextMat();
+    // rotation is (cos q, sin q, -sin q, cos q, 0, 0)
+    // sin q is zero iff there is no rotation, or 180 deg. rotation;
+    // for 180 rotation, cos q will be negative
+    if (text_mat[0] < 0 || !is_within(text_mat[1], .1, 0)) {
+      std::cerr << DEBUG << "rotation matrix for \"" << print_uni_str(u, uLen) << '"' << std::endl;
+      std::cerr << "text " << print_matrix(state->getTextMat());
+    }
+  }
+  if (n > 0 && // don't start a new string, unless there is already a string
+      // TODO: the following line assumes that text is flowing left to
+      // right, which will not necessarily be the case, e.g. if rotated;
+      // It assesses whether or not two characters are close enough to
+      // be part of the same string
+      fabs(x1 - curStr->xRight[n-1]) > wordBreakThreshold * (curStr->yMax - curStr->yMin) &&
+      // rotation is (cos q, sin q, -sin q, cos q, 0, 0)
+      // sin q is zero iff there is no rotation, or 180 deg. rotation;
+      // for 180 rotation, cos q will be negative
+      !rot_matrices_equal(curStr->getFont().getRotMat(), state->getTextMat()))
+  {
+    endString();
+    beginString(state, NULL);
+  }
+  state->textTransformDelta(state->getCharSpace() * state->getHorizScaling(),
+                           0, &dx2, &dy2);
+  dx -= dx2;
+  dy -= dy2;
+  state->transformDelta(dx, dy, &w1, &h1);
+  if (uLen != 0) {
+    w1 /= uLen;
+    h1 /= uLen;
+  }
+  for (i = 0; i < uLen; ++i) {
+    Unicode u1 = u[i];
+    if (u1 >= 0xd800 && u1 <= 0xdbff && i < uLen) {
+      // surrogate pair
+      const Unicode u2 = u[i + 1];
+      if (u2 >= 0xdc00 && u2 <= 0xdfff) {
+       u1 = 0x10000 + ((u1 - 0xd800) << 10) + (u2 - 0xdc00);
+       
+       curStr->addChar(state, x1 + i*w1, y1 + i*h1, w1, h1, u1);
+      }
+      ++i;
+    } else {
+      curStr->addChar(state, x1 + i*w1, y1 + i*h1, w1, h1, u1);
+    }
+  }
+}
+
+void HtmlPage::endString() {
+  HtmlString *p1, *p2;
+  double h, y1, y2;
+
+  // throw away zero-length strings -- they don't have valid xMin/xMax
+  // values, and they're useless anyway
+  if (curStr->len == 0) {
+    delete curStr;
+    curStr = NULL;
+    return;
+  }
+
+  curStr->endString();
+
+#if 0 //~tmp
+  if (curStr->yMax - curStr->yMin > 20) {
+    delete curStr;
+    curStr = NULL;
+    return;
+  }
+#endif
+
+  // insert string in y-major list
+  h = curStr->yMax - curStr->yMin;
+  y1 = curStr->yMin + 0.5 * h;
+  y2 = curStr->yMin + 0.8 * h;
+  if (rawOrder) {
+    p1 = yxCur1;
+    p2 = NULL;
+  } else if ((!yxCur1 ||
+              (y1 >= yxCur1->yMin &&
+               (y2 >= yxCur1->yMax || curStr->xMax >= yxCur1->xMin))) &&
+             (!yxCur2 ||
+              (y1 < yxCur2->yMin ||
+               (y2 < yxCur2->yMax && curStr->xMax < yxCur2->xMin)))) {
+    p1 = yxCur1;
+    p2 = yxCur2;
+  } else {
+    for (p1 = NULL, p2 = yxStrings; p2; p1 = p2, p2 = p2->yxNext) {
+      if (y1 < p2->yMin || (y2 < p2->yMax && curStr->xMax < p2->xMin))
+        break;
+    }
+    yxCur2 = p2;
+  }
+  yxCur1 = curStr;
+  if (p1)
+    p1->yxNext = curStr;
+  else
+    yxStrings = curStr;
+  curStr->yxNext = p2;
+  curStr = NULL;
+}
+
+static const char *strrstr( const char *s, const char *ss )
+{
+  const char *p = strstr( s, ss );
+  for( const char *pp = p; pp != NULL; pp = strstr( p+1, ss ) ){
+    p = pp;
+  }
+  return p;
+}
+
+static void CloseTags( GooString *htext, GBool &finish_a, GBool &finish_italic, GBool &finish_bold )
+{
+  const char *last_italic = finish_italic && ( finish_bold   || finish_a    ) ? strrstr( htext->getCString(), "<i>" ) : NULL;
+  const char *last_bold   = finish_bold   && ( finish_italic || finish_a    ) ? strrstr( htext->getCString(), "<b>" ) : NULL;
+  const char *last_a      = finish_a      && ( finish_italic || finish_bold ) ? strrstr( htext->getCString(), "<a " ) : NULL;
+  if( finish_a && ( finish_italic || finish_bold ) && last_a > ( last_italic > last_bold ? last_italic : last_bold ) ){
+    htext->append("</a>", 4);
+    finish_a = false;
+  }
+  if( finish_italic && finish_bold && last_italic > last_bold ){
+    htext->append("</i>", 4);
+    finish_italic = false;
+  }
+  if( finish_bold )
+    htext->append("</b>", 4);
+  if( finish_italic )
+    htext->append("</i>", 4);
+  if( finish_a )
+    htext->append("</a>");
+}
+
+// Strings are lines of text;
+// This function aims to combine strings into lines and paragraphs if !noMerge
+// It may also strip out duplicate strings (if they are on top of each other); sometimes they are to create a font effect
+void HtmlPage::coalesce() {
+  HtmlString *str1, *str2;
+  HtmlFont *hfont1, *hfont2;
+  double space, horSpace, vertSpace, vertOverlap;
+  GBool addSpace, addLineBreak;
+  int n, i;
+  double curX, curY;
+
+#if 0 //~ for debugging
+  for (str1 = yxStrings; str1; str1 = str1->yxNext) {
+    printf("x=%f..%f  y=%f..%f  size=%2d '",
+          str1->xMin, str1->xMax, str1->yMin, str1->yMax,
+          (int)(str1->yMax - str1->yMin));
+    for (i = 0; i < str1->len; ++i) {
+      fputc(str1->text[i] & 0xff, stdout);
+    }
+    printf("'\n");
+  }
+  printf("\n------------------------------------------------------------\n\n");
+#endif
+  str1 = yxStrings;
+
+  if( !str1 ) return;
+
+  //----- discard duplicated text (fake boldface, drop shadows)
+  if( !complexMode )
+  {    /* if not in complex mode get rid of duplicate strings */
+       HtmlString *str3;
+       GBool found;
+       while (str1)
+       {
+               double size = str1->yMax - str1->yMin;
+               double xLimit = str1->xMin + size * 0.2;
+               found = gFalse;
+               for (str2 = str1, str3 = str1->yxNext;
+                       str3 && str3->xMin < xLimit;
+                       str2 = str3, str3 = str2->yxNext)
+               {
+                       if (str3->len == str1->len &&
+                               !memcmp(str3->text, str1->text, str1->len * sizeof(Unicode)) &&
+                               fabs(str3->yMin - str1->yMin) < size * 0.2 &&
+                               fabs(str3->yMax - str1->yMax) < size * 0.2 &&
+                               fabs(str3->xMax - str1->xMax) < size * 0.2)
+                       {
+                               found = gTrue;
+                               //printf("found duplicate!\n");
+                               break;
+                       }
+               }
+               if (found)
+               {
+                       str2->xyNext = str3->xyNext;
+                       str2->yxNext = str3->yxNext;
+                       delete str3;
+               }
+               else
+               {
+                       str1 = str1->yxNext;
+               }
+       }               
+  }    /*- !complexMode */
+  
+  str1 = yxStrings;
+  
+  hfont1 = getFont(str1);
+  if( hfont1->isBold() )
+    str1->htext->insert(0,"<b>",3);
+  if( hfont1->isItalic() )
+    str1->htext->insert(0,"<i>",3);
+  if( str1->getLink() != NULL ) {
+    GooString *ls = str1->getLink()->getLinkStart();
+    str1->htext->insert(0, ls);
+    delete ls;
+  }
+  curX = str1->xMin; curY = str1->yMin;
+
+  while (str1 && (str2 = str1->yxNext)) {
+    hfont2 = getFont(str2);
+    space = str1->yMax - str1->yMin; // the height of the font's bounding box
+    horSpace = str2->xMin - str1->xMax;
+    // if strings line up on left-hand side AND they are on subsequent lines, we need a line break
+    addLineBreak = !noMerge && (fabs(str1->xMin - str2->xMin) < 0.4) && IS_CLOSER(str2->yMax, str1->yMax + space, str1->yMax);
+    vertSpace = str2->yMin - str1->yMax;
+
+//printf("coalesce %d %d %f? ", str1->dir, str2->dir, d);
+
+    if (str2->yMin >= str1->yMin && str2->yMin <= str1->yMax)
+    {
+       vertOverlap = str1->yMax - str2->yMin;
+    } else
+    if (str2->yMax >= str1->yMin && str2->yMax <= str1->yMax)
+    {
+       vertOverlap = str2->yMax - str1->yMin;
+    } else
+    {
+       vertOverlap = 0;
+    } 
+    
+    // Combine strings if:
+    //  They appear to be the same font (complex mode only) && going in the same direction AND at least one of the following:
+    //  1.  They appear to be part of the same line of text
+    //  2.  They appear to be subsequent lines of a paragraph
+    //  We assume (1) or (2) above, respectively, based on:
+    //  (1)  strings overlap vertically AND
+    //       horizontal space between end of str1 and start of str2 is consistent with a single space or less;
+    //       when rawOrder, the strings have to overlap vertically by at least 50%
+    //  (2)  Strings flow down the page, but the space between them is not too great, and they are lined up on the left
+    if (
+       (
+        (
+         (
+          (rawOrder && vertOverlap > 0.5 * space) 
+          ||
+          (!rawOrder && str2->yMin < str1->yMax)
+         ) &&
+         (horSpace > -0.5 * space && horSpace < space)
+        ) ||
+                (vertSpace >= 0 && vertSpace < 0.5 * space && addLineBreak)
+       ) &&
+       (!complexMode || (hfont1->isEqualIgnoreBold(*hfont2))) && // in complex mode fonts must be the same, in other modes fonts do not metter
+       str1->dir == str2->dir // text direction the same
+       ) 
+    {
+//      printf("yes\n");
+      n = str1->len + str2->len;
+      if ((addSpace = horSpace > wordBreakThreshold * space)) {
+        ++n;
+      }
+      if (addLineBreak) {
+        ++n;
+      }
+  
+      str1->size = (n + 15) & ~15;
+      str1->text = (Unicode *)grealloc(str1->text,
+                                      str1->size * sizeof(Unicode));
+      str1->xRight = (double *)grealloc(str1->xRight,
+                                       str1->size * sizeof(double));
+      if (addSpace) {
+                 str1->text[str1->len] = 0x20;
+                 str1->htext->append(xml?" ":"&#160;");
+                 str1->xRight[str1->len] = str2->xMin;
+                 ++str1->len;
+      }
+      if (addLineBreak) {
+         str1->text[str1->len] = '\n';
+         str1->htext->append("<br/>");
+         str1->xRight[str1->len] = str2->xMin;
+         ++str1->len;
+         str1->yMin = str2->yMin;
+         str1->yMax = str2->yMax;
+         str1->xMax = str2->xMax;
+         int fontLineSize = hfont1->getLineSize();
+         int curLineSize = (int)(vertSpace + space); 
+         if( curLineSize != fontLineSize )
+         {
+             HtmlFont *newfnt = new HtmlFont(*hfont1);
+             newfnt->setLineSize(curLineSize);
+             str1->fontpos = fonts->AddFont(*newfnt);
+             delete newfnt;
+             hfont1 = getFont(str1);
+             // we have to reget hfont2 because it's location could have
+             // changed on resize
+             hfont2 = getFont(str2); 
+         }
+      }
+      for (i = 0; i < str2->len; ++i) {
+       str1->text[str1->len] = str2->text[i];
+       str1->xRight[str1->len] = str2->xRight[i];
+       ++str1->len;
+      }
+
+      /* fix <i>, <b> if str1 and str2 differ and handle switch of links */
+      HtmlLink *hlink1 = str1->getLink();
+      HtmlLink *hlink2 = str2->getLink();
+      bool switch_links = !hlink1 || !hlink2 || !hlink1->isEqualDest(*hlink2);
+      GBool finish_a = switch_links && hlink1 != NULL;
+      GBool finish_italic = hfont1->isItalic() && ( !hfont2->isItalic() || finish_a );
+      GBool finish_bold   = hfont1->isBold()   && ( !hfont2->isBold()   || finish_a || finish_italic );
+      CloseTags( str1->htext, finish_a, finish_italic, finish_bold );
+      if( switch_links && hlink2 != NULL ) {
+        GooString *ls = hlink2->getLinkStart();
+        str1->htext->append(ls);
+        delete ls;
+      }
+      if( ( !hfont1->isItalic() || finish_italic ) && hfont2->isItalic() )
+           str1->htext->append("<i>", 3);
+      if( ( !hfont1->isBold() || finish_bold ) && hfont2->isBold() )
+           str1->htext->append("<b>", 3);
+
+
+      str1->htext->append(str2->htext);
+      // str1 now contains href for link of str2 (if it is defined)
+      str1->link = str2->link; 
+      hfont1 = hfont2;
+      if (str2->xMax > str1->xMax) {
+       str1->xMax = str2->xMax;
+      }
+      if (str2->yMax > str1->yMax) {
+       str1->yMax = str2->yMax;
+      }
+      str1->yxNext = str2->yxNext;
+      delete str2;
+    } else { // keep strings separate
+//      printf("no\n"); 
+      GBool finish_a = str1->getLink() != NULL;
+      GBool finish_bold   = hfont1->isBold();
+      GBool finish_italic = hfont1->isItalic();
+      CloseTags( str1->htext, finish_a, finish_italic, finish_bold );
+     
+      str1->xMin = curX; str1->yMin = curY; 
+      str1 = str2;
+      curX = str1->xMin; curY = str1->yMin;
+      hfont1 = hfont2;
+      if( hfont1->isBold() )
+       str1->htext->insert(0,"<b>",3);
+      if( hfont1->isItalic() )
+       str1->htext->insert(0,"<i>",3);
+      if( str1->getLink() != NULL ) {
+       GooString *ls = str1->getLink()->getLinkStart();
+       str1->htext->insert(0, ls);
+       delete ls;
+      }
+    }
+  }
+  str1->xMin = curX; str1->yMin = curY;
+
+  GBool finish_bold   = hfont1->isBold();
+  GBool finish_italic = hfont1->isItalic();
+  GBool finish_a = str1->getLink() != NULL;
+  CloseTags( str1->htext, finish_a, finish_italic, finish_bold );
+
+#if 0 //~ for debugging
+  for (str1 = yxStrings; str1; str1 = str1->yxNext) {
+    printf("x=%3d..%3d  y=%3d..%3d  size=%2d ",
+          (int)str1->xMin, (int)str1->xMax, (int)str1->yMin, (int)str1->yMax,
+          (int)(str1->yMax - str1->yMin));
+    printf("'%s'\n", str1->htext->getCString());  
+  }
+  printf("\n------------------------------------------------------------\n\n");
+#endif
+
+}
+
+void HtmlPage::dumpAsXML(FILE* f,int page){  
+  fprintf(f, "<page number=\"%d\" position=\"absolute\"", page);
+  fprintf(f," top=\"0\" left=\"0\" height=\"%d\" width=\"%d\">\n", pageHeight,pageWidth);
+    
+  for(int i=fontsPageMarker;i < fonts->size();i++) {
+    GooString *fontCSStyle = fonts->CSStyle(i);
+    fprintf(f,"\t%s\n",fontCSStyle->getCString());
+    delete fontCSStyle;
+  }
+  
+  int listlen=imgList->getLength();
+  for (int i = 0; i < listlen; i++) {
+    HtmlImage *img = (HtmlImage*)imgList->del(0);
+    fprintf(f,"<image top=\"%d\" left=\"%d\" ",xoutRound(img->yMin),xoutRound(img->xMin));
+    fprintf(f,"width=\"%d\" height=\"%d\" ",xoutRound(img->xMax-img->xMin),xoutRound(img->yMax-img->yMin));
+    fprintf(f,"src=\"%s\"/>\n",img->fName->getCString());
+    delete img;
+  }
+
+  for(HtmlString *tmp=yxStrings;tmp;tmp=tmp->yxNext){
+    if (tmp->htext){
+      fprintf(f,"<text top=\"%d\" left=\"%d\" ",xoutRound(tmp->yMin),xoutRound(tmp->xMin));
+      fprintf(f,"width=\"%d\" height=\"%d\" ",xoutRound(tmp->xMax-tmp->xMin),xoutRound(tmp->yMax-tmp->yMin));
+      fprintf(f,"font=\"%d\">", tmp->fontpos);
+      fputs(tmp->htext->getCString(),f);
+      fputs("</text>\n",f);
+    }
+  }
+  fputs("</page>\n",f);
+}
+
+static void printCSS(FILE *f)
+{
+  // Image flip/flop CSS
+  // Source:
+  // http://stackoverflow.com/questions/1309055/cross-browser-way-to-flip-html-image-via-javascript-css
+  // tested in Chrome, Fx (Linux) and IE9 (W7)
+  static const char css[] = 
+    "<STYLE type=\"text/css\">" "\n"
+    "<!--" "\n"
+    ".xflip {" "\n"
+    "    -moz-transform: scaleX(-1);" "\n"
+    "    -webkit-transform: scaleX(-1);" "\n"
+    "    -o-transform: scaleX(-1);" "\n"
+    "    transform: scaleX(-1);" "\n"
+    "    filter: fliph;" "\n"
+    "}" "\n"
+    ".yflip {" "\n"
+    "    -moz-transform: scaleY(-1);" "\n"
+    "    -webkit-transform: scaleY(-1);" "\n"
+    "    -o-transform: scaleY(-1);" "\n"
+    "    transform: scaleY(-1);" "\n"
+    "    filter: flipv;" "\n"
+    "}" "\n"
+    ".xyflip {" "\n"
+    "    -moz-transform: scaleX(-1) scaleY(-1);" "\n"
+    "    -webkit-transform: scaleX(-1) scaleY(-1);" "\n"
+    "    -o-transform: scaleX(-1) scaleY(-1);" "\n"
+    "    transform: scaleX(-1) scaleY(-1);" "\n"
+    "    filter: fliph + flipv;" "\n"
+    "}" "\n"
+    "-->" "\n"
+    "</STYLE>" "\n";
+
+  fwrite( css, sizeof(css)-1, 1, f );
+}
+
+int HtmlPage::dumpComplexHeaders(FILE * const file, FILE *& pageFile, int page) {
+  GooString* tmp;
+
+  if( !noframes )
+  {
+      GooString* pgNum=GooString::fromInt(page);
+      tmp = new GooString(DocName);
+      if (!singleHtml){
+            tmp->append('-')->append(pgNum)->append(".html");
+            pageFile = fopen(tmp->getCString(), "w");
+      } else {
+            tmp->append("-html")->append(".html");
+            pageFile = fopen(tmp->getCString(), "a");
+      }
+      delete pgNum;
+      if (!pageFile) {
+         error(errIO, -1, "Couldn't open html file '{0:t}'", tmp);
+         delete tmp;
+         return 1;
+      } 
+
+      if (!singleHtml)
+        fprintf(pageFile,"%s\n<HTML xmlns=\"http://www.w3.org/1999/xhtml\" lang=\"\" xml:lang=\"\">\n<HEAD>\n<TITLE>Page %d</TITLE>\n\n", DOCTYPE, page);
+      else
+        fprintf(pageFile,"%s\n<HTML xmlns=\"http://www.w3.org/1999/xhtml\" lang=\"\" xml:lang=\"\">\n<HEAD>\n<TITLE>%s</TITLE>\n\n", DOCTYPE, tmp->getCString());
+
+      delete tmp;
+
+      GooString *htmlEncoding = HtmlOutputDev::mapEncodingToHtml(globalParams->getTextEncodingName());
+      if (!singleHtml)
+        fprintf(pageFile, "<META http-equiv=\"Content-Type\" content=\"text/html; charset=%s\"/>\n", htmlEncoding->getCString());
+      else
+        fprintf(pageFile, "<META http-equiv=\"Content-Type\" content=\"text/html; charset=%s\"/>\n <br/>\n", htmlEncoding->getCString());
+      delete htmlEncoding;
+  }
+  else 
+  {
+      pageFile = file;
+      fprintf(pageFile,"<!-- Page %d -->\n", page);
+      fprintf(pageFile,"<a name=\"%d\"></a>\n", page);
+  } 
+  
+  return 0;
+}
+
+void HtmlPage::dumpComplex(FILE *file, int page){
+  FILE* pageFile;
+  GooString* tmp;
+
+  if( firstPage == -1 ) firstPage = page; 
+  
+  if (dumpComplexHeaders(file, pageFile, page)) { error(errIO, -1, "Couldn't write headers."); return; }
+
+  tmp=basename(DocName);
+   
+  fputs("<STYLE type=\"text/css\">\n<!--\n",pageFile);
+  fputs("\tp {margin: 0; padding: 0;}",pageFile);
+  for(int i=fontsPageMarker;i!=fonts->size();i++) {
+    GooString *fontCSStyle;
+    if (!singleHtml)
+         fontCSStyle = fonts->CSStyle(i);
+    else
+         fontCSStyle = fonts->CSStyle(i,page);
+    fprintf(pageFile,"\t%s\n",fontCSStyle->getCString());
+    delete fontCSStyle;
+  }
+  fputs("-->\n</STYLE>\n",pageFile);
+  
+  if( !noframes )
+  {  
+      fputs("</HEAD>\n<BODY bgcolor=\"#A0A0A0\" vlink=\"blue\" link=\"blue\">\n",pageFile); 
+  }
+  
+  fprintf(pageFile,"<DIV id=\"page%d-div\" style=\"position:relative;width:%dpx;height:%dpx;\">\n",
+      page, pageWidth, pageHeight);
+
+  if( !ignore ) 
+  {
+    fprintf(pageFile,
+           "<IMG width=\"%d\" height=\"%d\" src=\"%s%03d.%s\" alt=\"background image\"/>\n",
+           pageWidth, pageHeight, tmp->getCString(), 
+               (page-firstPage+1), imgExt->getCString());
+  }
+  
+  delete tmp;
+  
+  for(HtmlString *tmp1=yxStrings;tmp1;tmp1=tmp1->yxNext){
+    if (tmp1->htext){
+      fprintf(pageFile,
+             "<P style=\"position:absolute;top:%dpx;left:%dpx;white-space:nowrap\" class=\"ft",
+             xoutRound(tmp1->yMin),
+             xoutRound(tmp1->xMin));
+      if (!singleHtml) {
+          fputc('0', pageFile);
+      } else {
+          fprintf(pageFile, "%d", page);
+      }
+      fprintf(pageFile,"%d\">", tmp1->fontpos);
+      fputs(tmp1->htext->getCString(), pageFile);
+      fputs("</P>\n", pageFile);
+    }
+  }
+
+  fputs("</DIV>\n", pageFile);
+  
+  if( !noframes )
+  {
+      fputs("</BODY>\n</HTML>\n",pageFile);
+      fclose(pageFile);
+  }
+}
+
+
+void HtmlPage::dump(FILE *f, int pageNum) 
+{
+  if (complexMode || singleHtml)
+  {
+    if (xml) dumpAsXML(f, pageNum);
+    if (!xml) dumpComplex(f, pageNum);  
+  }
+  else
+  {
+    fprintf(f,"<A name=%d></a>",pageNum);
+    // Loop over the list of image names on this page
+    int listlen=imgList->getLength();
+    for (int i = 0; i < listlen; i++) {
+      HtmlImage *img = (HtmlImage*)imgList->del(0);
+
+      // see printCSS() for class names
+      const char *styles[4] = { "", " class=\"xflip\"", " class=\"yflip\"", " class=\"xyflip\"" };
+      int style_index=0;
+      if (img->xMin > img->xMax) style_index += 1; // xFlip
+      if (img->yMin > img->yMax) style_index += 2; // yFlip
+
+      fprintf(f,"<IMG%s src=\"%s\"/><br/>\n",styles[style_index],img->fName->getCString());
+      delete img;
+    }
+
+    GooString* str;
+    for(HtmlString *tmp=yxStrings;tmp;tmp=tmp->yxNext){
+      if (tmp->htext){
+               str=new GooString(tmp->htext); 
+               fputs(str->getCString(),f);
+               delete str;      
+               fputs("<br/>\n",f);
+      }
+    }
+       fputs("<hr>\n",f);  
+  }
+}
+
+
+
+void HtmlPage::clear() {
+  HtmlString *p1, *p2;
+
+  if (curStr) {
+    delete curStr;
+    curStr = NULL;
+  }
+  for (p1 = yxStrings; p1; p1 = p2) {
+    p2 = p1->yxNext;
+    delete p1;
+  }
+  yxStrings = NULL;
+  xyStrings = NULL;
+  yxCur1 = yxCur2 = NULL;
+
+  if( !noframes )
+  {
+      delete fonts;
+      fonts=new HtmlFontAccu();
+      fontsPageMarker = 0;
+  }
+  else
+  {
+      fontsPageMarker = fonts->size();
+  }
+
+  delete links;
+  links=new HtmlLinks();
+
+}
+
+void HtmlPage::setDocName(char *fname){
+  DocName=new GooString(fname);
+}
+
+void HtmlPage::addImage(GooString *fname, GfxState *state) {
+  HtmlImage *img = new HtmlImage(fname, state);
+  imgList->append(img);
+}
+
+//------------------------------------------------------------------------
+// HtmlMetaVar
+//------------------------------------------------------------------------
+
+HtmlMetaVar::HtmlMetaVar(const char *_name, const char *_content)
+{
+    name = new GooString(_name);
+    content = new GooString(_content);
+}
+
+HtmlMetaVar::~HtmlMetaVar()
+{
+   delete name;
+   delete content;
+} 
+    
+GooString* HtmlMetaVar::toString()     
+{
+    GooString *result = new GooString("<META name=\"");
+    result->append(name);
+    result->append("\" content=\"");
+    result->append(content);
+    result->append("\"/>");
+    return result;
+}
+
+//------------------------------------------------------------------------
+// HtmlOutputDev
+//------------------------------------------------------------------------
+
+static const char* HtmlEncodings[][2] = {
+    {"Latin1", "ISO-8859-1"},
+    {NULL, NULL}
+};
+
+GooString* HtmlOutputDev::mapEncodingToHtml(GooString* encoding)
+{
+  GooString* enc = encoding;
+  for(int i = 0; HtmlEncodings[i][0] != NULL; i++)
+  {
+    if( enc->cmp(HtmlEncodings[i][0]) == 0 )
+    {
+      delete enc;
+      return new GooString(HtmlEncodings[i][1]);
+    }
+  }
+  return enc; 
+}
+
+void HtmlOutputDev::doFrame(int firstPage){
+  GooString* fName=new GooString(Docname);
+  GooString* htmlEncoding;
+  fName->append(".html");
+
+  if (!(fContentsFrame = fopen(fName->getCString(), "w"))){
+    error(errIO, -1, "Couldn't open html file '{0:t}'", fName);
+    delete fName;
+    return;
+  }
+  
+  delete fName;
+    
+  fName=basename(Docname);
+  fputs(DOCTYPE, fContentsFrame);
+  fputs("\n<HTML>",fContentsFrame);
+  fputs("\n<HEAD>",fContentsFrame);
+  fprintf(fContentsFrame,"\n<TITLE>%s</TITLE>",docTitle->getCString());
+  htmlEncoding = mapEncodingToHtml(globalParams->getTextEncodingName());
+  fprintf(fContentsFrame, "\n<META http-equiv=\"Content-Type\" content=\"text/html; charset=%s\"/>\n", htmlEncoding->getCString());
+  dumpMetaVars(fContentsFrame);
+  fprintf(fContentsFrame, "</HEAD>\n");
+  fputs("<FRAMESET cols=\"100,*\">\n",fContentsFrame);
+  fprintf(fContentsFrame,"<FRAME name=\"links\" src=\"%s_ind.html\">\n",fName->getCString());
+  fputs("<FRAME name=\"contents\" src=",fContentsFrame); 
+  if (complexMode) 
+      fprintf(fContentsFrame,"\"%s-%d.html\"",fName->getCString(), firstPage);
+  else
+      fprintf(fContentsFrame,"\"%ss.html\"",fName->getCString());
+  
+  fputs(">\n</FRAMESET>\n</HTML>\n",fContentsFrame);
+  delete fName;
+  delete htmlEncoding;
+  fclose(fContentsFrame);  
+}
+
+HtmlOutputDev::HtmlOutputDev(Catalog *catalogA, char *fileName, char *title, 
+       char *author, char *keywords, char *subject, char *date,
+       char *extension,
+       GBool rawOrder, int firstPage, GBool outline) 
+{
+  catalog = catalogA;
+  fContentsFrame = NULL;
+  docTitle = new GooString(title);
+  pages = NULL;
+  dumpJPEG=gTrue;
+  //write = gTrue;
+  this->rawOrder = rawOrder;
+  this->doOutline = outline;
+  ok = gFalse;
+  //this->firstPage = firstPage;
+  //pageNum=firstPage;
+  // open file
+  needClose = gFalse;
+  pages = new HtmlPage(rawOrder, extension);
+  
+  glMetaVars = new GooList();
+  glMetaVars->append(new HtmlMetaVar("generator", "pdftohtml 0.36"));  
+  if( author ) glMetaVars->append(new HtmlMetaVar("author", author));  
+  if( keywords ) glMetaVars->append(new HtmlMetaVar("keywords", keywords));  
+  if( date ) glMetaVars->append(new HtmlMetaVar("date", date));  
+  if( subject ) glMetaVars->append(new HtmlMetaVar("subject", subject));
+  maxPageWidth = 0;
+  maxPageHeight = 0;
+
+  pages->setDocName(fileName);
+  Docname=new GooString (fileName);
+
+  // for non-xml output (complex or simple) with frames generate the left frame
+  if(!xml && !noframes)
+  {
+     if (!singleHtml)
+     {
+         GooString* left=new GooString(fileName);
+         left->append("_ind.html");
+
+         doFrame(firstPage);
+
+         if (!(fContentsFrame = fopen(left->getCString(), "w")))
+         {
+             error(errIO, -1, "Couldn't open html file '{0:t}'", left);
+             delete left;
+             return;
+         }
+         delete left;
+         fputs(DOCTYPE, fContentsFrame);
+         fputs("<HTML xmlns=\"http://www.w3.org/1999/xhtml\" lang=\"\" xml:lang=\"\">\n<HEAD>\n<TITLE></TITLE>\n</HEAD>\n<BODY>\n", fContentsFrame);
+
+         if (doOutline)
+         {
+             GooString *str = basename(Docname);
+             fprintf(fContentsFrame, "<A href=\"%s%s\" target=\"contents\">Outline</a><br/>", str->getCString(), complexMode ? "-outline.html" : "s.html#outline");
+             delete str;
+         }
+     }
+       if (!complexMode)
+       {       /* not in complex mode */
+               
+       GooString* right=new GooString(fileName);
+       right->append("s.html");
+
+       if (!(page=fopen(right->getCString(),"w"))){
+        error(errIO, -1, "Couldn't open html file '{0:t}'", right);
+        delete right;
+               return;
+       }
+       delete right;
+       fputs(DOCTYPE, page);
+       fputs("<HTML>\n<HEAD>\n<TITLE></TITLE>\n",page);
+       printCSS(page);
+       fputs("</HEAD>\n<BODY>\n",page);
+     }
+  }
+
+  if (noframes) {
+    if (stout) page=stdout;
+    else {
+      GooString* right=new GooString(fileName);
+      if (!xml) right->append(".html");
+      if (xml) right->append(".xml");
+      if (!(page=fopen(right->getCString(),"w"))){
+       error(errIO, -1, "Couldn't open html file '{0:t}'", right);
+       delete right;
+       return;
+      }  
+      delete right;
+    }
+
+    GooString *htmlEncoding = mapEncodingToHtml(globalParams->getTextEncodingName()); 
+    if (xml) 
+    {
+      fprintf(page, "<?xml version=\"1.0\" encoding=\"%s\"?>\n", htmlEncoding->getCString());
+      fputs("<!DOCTYPE pdf2xml SYSTEM \"pdf2xml.dtd\">\n\n", page);
+      fprintf(page,"<pdf2xml producer=\"%s\" version=\"%s\">\n", PACKAGE_NAME, PACKAGE_VERSION);
+    } 
+    else 
+    {
+      fprintf(page,"%s\n<HTML xmlns=\"http://www.w3.org/1999/xhtml\" lang=\"\" xml:lang=\"\">\n<HEAD>\n<TITLE>%s</TITLE>\n", DOCTYPE, docTitle->getCString());
+      
+      fprintf(page, "<META http-equiv=\"Content-Type\" content=\"text/html; charset=%s\"/>\n", htmlEncoding->getCString());
+      
+      dumpMetaVars(page);
+      printCSS(page);
+      fprintf(page,"</HEAD>\n");
+      fprintf(page,"<BODY bgcolor=\"#A0A0A0\" vlink=\"blue\" link=\"blue\">\n");
+    }
+    delete htmlEncoding;
+  }
+  ok = gTrue; 
+}
+
+HtmlOutputDev::~HtmlOutputDev() {
+    HtmlFont::clear(); 
+    
+    delete Docname;
+    delete docTitle;
+
+    deleteGooList(glMetaVars, HtmlMetaVar);
+
+    if (fContentsFrame){
+      fputs("</BODY>\n</HTML>\n",fContentsFrame);  
+      fclose(fContentsFrame);
+    }
+    if (page != NULL) {
+      if (xml) {
+        fputs("</pdf2xml>\n",page);  
+        fclose(page);
+      } else
+      if ( !complexMode || xml || noframes )
+      { 
+        fputs("</BODY>\n</HTML>\n",page);  
+        fclose(page);
+      }
+    }
+    if (pages)
+      delete pages;
+}
+
+void HtmlOutputDev::startPage(int pageNum, GfxState *state) {
+#if 0
+  if (mode&&!xml){
+    if (write){
+      write=gFalse;
+      GooString* fname=Dirname(Docname);
+      fname->append("image.log");
+      if((tin=fopen(getFileNameFromPath(fname->getCString(),fname->getLength()),"w"))==NULL){
+       printf("Error : can not open %s",fname);
+       exit(1);
+      }
+      delete fname;
+    // if(state->getRotation()!=0) 
+    //  fprintf(tin,"ROTATE=%d rotate %d neg %d neg translate\n",state->getRotation(),state->getX1(),-state->getY1());
+    // else 
+      fprintf(tin,"ROTATE=%d neg %d neg translate\n",state->getX1(),state->getY1());  
+    }
+  }
+#endif
+
+  this->pageNum = pageNum;
+  GooString *str=basename(Docname);
+  pages->clear(); 
+  if(!noframes)
+  {
+    if (fContentsFrame)
+       {
+      if (complexMode)
+               fprintf(fContentsFrame,"<A href=\"%s-%d.html\"",str->getCString(),pageNum);
+      else 
+               fprintf(fContentsFrame,"<A href=\"%ss.html#%d\"",str->getCString(),pageNum);
+      fprintf(fContentsFrame," target=\"contents\" >Page %d</a><br/>\n",pageNum);
+    }
+  }
+
+  pages->pageWidth=static_cast<int>(state->getPageWidth());
+  pages->pageHeight=static_cast<int>(state->getPageHeight());
+
+  delete str;
+} 
+
+
+void HtmlOutputDev::endPage() {
+  Links *linksList = docPage->getLinks();
+  for (int i = 0; i < linksList->getNumLinks(); ++i)
+  {
+      doProcessLink(linksList->getLink(i));
+  }
+  delete linksList;
+
+  pages->conv();
+  pages->coalesce();
+  pages->dump(page, pageNum);
+  
+  // I don't yet know what to do in the case when there are pages of different
+  // sizes and we want complex output: running ghostscript many times 
+  // seems very inefficient. So for now I'll just use last page's size
+  maxPageWidth = pages->pageWidth;
+  maxPageHeight = pages->pageHeight;
+  
+  //if(!noframes&&!xml) fputs("<br>\n", fContentsFrame);
+  if(!stout && !globalParams->getErrQuiet()) printf("Page-%d\n",(pageNum));
+}
+
+void HtmlOutputDev::updateFont(GfxState *state) {
+  pages->updateFont(state);
+}
+
+void HtmlOutputDev::beginString(GfxState *state, GooString *s) {
+  pages->beginString(state, s);
+}
+
+void HtmlOutputDev::endString(GfxState *state) {
+  pages->endString();
+}
+
+void HtmlOutputDev::drawChar(GfxState *state, double x, double y,
+             double dx, double dy,
+             double originX, double originY,
+             CharCode code, int /*nBytes*/, Unicode *u, int uLen) 
+{
+  if ( !showHidden && (state->getRender() & 3) == 3) {
+    return;
+  }
+  pages->addChar(state, x, y, dx, dy, originX, originY, u, uLen);
+}
+
+void HtmlOutputDev::drawJpegImage(GfxState *state, Stream *str)
+{
+  FILE *f1;
+  int c;
+
+  // open the image file
+  GooString *fName=createImageFileName("jpg");
+  if (!(f1 = fopen(fName->getCString(), "wb"))) {
+    error(errIO, -1, "Couldn't open image file '%s'", fName->getCString());
+    delete fName;
+    return;
+  }
+
+  // initialize stream
+  str = str->getNextStream();
+  str->reset();
+
+  // copy the stream
+  while ((c = str->getChar()) != EOF)
+    fputc(c, f1);
+
+  fclose(f1);
+
+  if (fName) {
+      pages->addImage(fName, state);
+  }
+}
+
+void HtmlOutputDev::drawPngImage(GfxState *state, Stream *str, int width, int height,
+                                 GfxImageColorMap *colorMap, GBool isMask)
+{
+#ifdef ENABLE_LIBPNG
+  FILE *f1;
+
+  if (!colorMap && !isMask) {
+    error(errInternal, -1, "Can't have color image without a color map");
+    return;
+  }
+
+  // open the image file
+  GooString *fName=createImageFileName("png");
+  if (!(f1 = fopen(fName->getCString(), "wb"))) {
+    error(errIO, -1, "Couldn't open image file '%s'", fName->getCString());
+    delete fName;
+    return;
+  }
+
+  PNGWriter *writer = new PNGWriter( isMask ? PNGWriter::MONOCHROME : PNGWriter::RGB );
+  // TODO can we calculate the resolution of the image?
+  if (!writer->init(f1, width, height, 72, 72)) {
+    error(errInternal, -1, "Can't init PNG for image '%s'", fName->getCString());
+    delete writer;
+    fclose(f1);
+    return;
+  }
+
+  if (!isMask) {
+    Guchar *p;
+    GfxRGB rgb;
+    png_byte *row = (png_byte *) gmalloc(3 * width);   // 3 bytes/pixel: RGB
+    png_bytep *row_pointer= &row;
+
+    // Initialize the image stream
+    ImageStream *imgStr = new ImageStream(str, width,
+                        colorMap->getNumPixelComps(), colorMap->getBits());
+    imgStr->reset();
+
+    // For each line...
+    for (int y = 0; y < height; y++) {
+
+      // Convert into a PNG row
+      p = imgStr->getLine();
+      for (int x = 0; x < width; x++) {
+        colorMap->getRGB(p, &rgb);
+        // Write the RGB pixels into the row
+        row[3*x]= colToByte(rgb.r);
+        row[3*x+1]= colToByte(rgb.g);
+        row[3*x+2]= colToByte(rgb.b);
+        p += colorMap->getNumPixelComps();
+      }
+
+      if (!writer->writeRow(row_pointer)) {
+        error(errIO, -1, "Failed to write into PNG '%s'", fName->getCString());
+        delete writer;
+        delete imgStr;
+        fclose(f1);
+        return;
+      }
+    }
+    gfree(row);
+    imgStr->close();
+    delete imgStr;
+  }
+  else { // isMask == true
+    ImageStream *imgStr = new ImageStream(str, width, 1, 1);
+    imgStr->reset();
+
+    Guchar *png_row = (Guchar *)gmalloc( width );
+
+    for (int ri = 0; ri < height; ++ri)
+    {
+      // read the row of the mask
+      Guchar *bit_row = imgStr->getLine();
+
+      // invert for PNG
+      for(int i = 0; i < width; i++)
+        png_row[i] = bit_row[i] ? 0xff : 0x00;
+
+      if (!writer->writeRow( &png_row ))
+      {
+        error(errIO, -1, "Failed to write into PNG '%s'", fName->getCString());
+        delete writer;
+        fclose(f1);
+        delete imgStr;
+        gfree(png_row);
+        return;
+      }
+    }
+    imgStr->close();
+    delete imgStr;
+    gfree(png_row);
+  }
+
+  str->close();
+
+  writer->close();
+  delete writer;
+  fclose(f1);
+
+  pages->addImage(fName, state);
+#else
+  return;
+#endif
+}
+
+GooString *HtmlOutputDev::createImageFileName(const char *ext)
+{
+  GooString *fName=new GooString(Docname);
+  fName->append("-");
+  GooString *pgNum= GooString::fromInt(pageNum);
+  GooString *imgnum= GooString::fromInt(pages->getNumImages()+1);
+
+  fName->append(pgNum)->append("_")->append(imgnum)->append(".")->append(ext);
+  delete pgNum;
+  delete imgnum;
+
+  return fName;
+}
+
+void HtmlOutputDev::drawImageMask(GfxState *state, Object *ref, Stream *str,
+                                 int width, int height, GBool invert,
+                                 GBool interpolate, GBool inlineImg) {
+
+  if (ignore||(complexMode && !xml)) {
+    OutputDev::drawImageMask(state, ref, str, width, height, invert, interpolate, inlineImg);
+    return;
+  }
+  
+  // dump JPEG file
+  if (dumpJPEG  && str->getKind() == strDCT) {
+    drawJpegImage(state, str);
+  }
+  else {
+#ifdef ENABLE_LIBPNG
+    drawPngImage(state, str, width, height, NULL, gTrue);
+#else
+    OutputDev::drawImageMask(state, ref, str, width, height, invert, interpolate, inlineImg);
+#endif
+  }
+}
+
+void HtmlOutputDev::drawImage(GfxState *state, Object *ref, Stream *str,
+                             int width, int height, GfxImageColorMap *colorMap,
+                             GBool interpolate, int *maskColors, GBool inlineImg) {
+
+  if (ignore||(complexMode && !xml)) {
+    OutputDev::drawImage(state, ref, str, width, height, colorMap, interpolate,
+                        maskColors, inlineImg);
+    return;
+  }
+  
+  /*if( !globalParams->getErrQuiet() )
+    printf("image stream of kind %d\n", str->getKind());*/
+  // dump JPEG file
+  if (dumpJPEG && str->getKind() == strDCT) {
+    drawJpegImage(state, str);
+  }
+  else {
+#ifdef ENABLE_LIBPNG
+    drawPngImage(state, str, width, height, colorMap );
+#else
+    OutputDev::drawImage(state, ref, str, width, height, colorMap, interpolate,
+                         maskColors, inlineImg);
+#endif
+  }
+}
+
+
+
+void HtmlOutputDev::doProcessLink(AnnotLink* link){
+  double _x1,_y1,_x2,_y2;
+  int x1,y1,x2,y2;
+
+  link->getRect(&_x1,&_y1,&_x2,&_y2);
+  cvtUserToDev(_x1,_y1,&x1,&y1);
+  
+  cvtUserToDev(_x2,_y2,&x2,&y2); 
+
+
+  GooString* _dest=getLinkDest(link);
+  HtmlLink t((double) x1,(double) y2,(double) x2,(double) y1,_dest);
+  pages->AddLink(t);
+  delete _dest;
+}
+
+GooString* HtmlOutputDev::getLinkDest(AnnotLink *link){
+  char *p;
+  if (!link->getAction())
+    return new GooString();
+  switch(link->getAction()->getKind()) 
+  {
+      case actionGoTo:
+         { 
+         GooString* file=basename(Docname);
+         int page=1;
+         LinkGoTo *ha=(LinkGoTo *)link->getAction();
+         LinkDest *dest=NULL;
+         if (ha->getDest()!=NULL)
+             dest=ha->getDest()->copy();
+         else if (ha->getNamedDest()!=NULL)
+             dest=catalog->findDest(ha->getNamedDest());
+             
+         if (dest){ 
+             if (dest->isPageRef()){
+                 Ref pageref=dest->getPageRef();
+                 page=catalog->findPage(pageref.num,pageref.gen);
+             }
+             else {
+                 page=dest->getPageNum();
+             }
+
+             delete dest;
+
+             GooString *str=GooString::fromInt(page);
+             /*                complex         simple
+               frames          file-4.html     files.html#4
+               noframes        file.html#4     file.html#4
+              */
+             if (noframes)
+             {
+                 file->append(".html#");
+                 file->append(str);
+             }
+             else
+             {
+               if( complexMode ) 
+               {
+                   file->append("-");
+                   file->append(str);
+                   file->append(".html");
+               }
+               else
+               {
+                   file->append("s.html#");
+                   file->append(str);
+               }
+             }
+
+             if (printCommands) printf(" link to page %d ",page);
+             delete str;
+             return file;
+         }
+         else 
+         {
+             return new GooString();
+         }
+         }
+      case actionGoToR:
+         {
+         LinkGoToR *ha=(LinkGoToR *) link->getAction();
+         LinkDest *dest=NULL;
+         int page=1;
+         GooString *file=new GooString();
+         if (ha->getFileName()){
+             delete file;
+             file=new GooString(ha->getFileName()->getCString());
+         }
+         if (ha->getDest()!=NULL)  dest=ha->getDest()->copy();
+         if (dest&&file){
+             if (!(dest->isPageRef()))  page=dest->getPageNum();
+             delete dest;
+
+             if (printCommands) printf(" link to page %d ",page);
+             if (printHtml){
+                 p=file->getCString()+file->getLength()-4;
+                 if (!strcmp(p, ".pdf") || !strcmp(p, ".PDF")){
+                     file->del(file->getLength()-4,4);
+                     file->append(".html");
+                 }
+                 file->append('#');
+                 file->append(GooString::fromInt(page));
+             }
+         }
+         if (printCommands && file) printf("filename %s\n",file->getCString());
+         return file;
+         }
+      case actionURI:
+         { 
+         LinkURI *ha=(LinkURI *) link->getAction();
+         GooString* file=new GooString(ha->getURI()->getCString());
+         // printf("uri : %s\n",file->getCString());
+         return file;
+         }
+      case actionLaunch:
+         {
+         LinkLaunch *ha=(LinkLaunch *) link->getAction();
+         GooString* file=new GooString(ha->getFileName()->getCString());
+         if (printHtml) { 
+             p=file->getCString()+file->getLength()-4;
+             if (!strcmp(p, ".pdf") || !strcmp(p, ".PDF")){
+                 file->del(file->getLength()-4,4);
+                 file->append(".html");
+             }
+             if (printCommands) printf("filename %s",file->getCString());
+    
+             return file;      
+  
+         }
+         }
+      default:
+         return new GooString();
+  }
+}
+
+void HtmlOutputDev::dumpMetaVars(FILE *file)
+{
+  GooString *var;
+
+  for(int i = 0; i < glMetaVars->getLength(); i++)
+  {
+     HtmlMetaVar *t = (HtmlMetaVar*)glMetaVars->get(i); 
+     var = t->toString(); 
+     fprintf(file, "%s\n", var->getCString());
+     delete var;
+  }
+}
+
+GBool HtmlOutputDev::dumpDocOutline(PDFDoc* doc)
+{ 
+#ifdef DISABLE_OUTLINE
+       return gFalse;
+#else
+       FILE * output = NULL;
+       GBool bClose = gFalse;
+       Catalog *catalog = doc->getCatalog();
+
+       if (!ok)
+                return gFalse;
+  
+       Outline *outline = doc->getOutline();
+       if (!outline)
+               return gFalse;
+
+       GooList *outlines = outline->getItems();
+       if (!outlines)
+               return gFalse;
+  
+       if (!complexMode || xml)
+       {
+               output = page;
+       }
+       else if (complexMode && !xml)
+       {
+               if (noframes)
+               {
+                       output = page; 
+                       fputs("<hr>\n", output);
+               }
+               else
+               {
+                       GooString *str = Docname->copy();
+                       str->append("-outline.html");
+                       output = fopen(str->getCString(), "w");
+                       if (output == NULL)
+                               return gFalse;
+                       delete str;
+                       bClose = gTrue;
+
+                       GooString *htmlEncoding =
+                               HtmlOutputDev::mapEncodingToHtml(globalParams->getTextEncodingName());
+
+                       fprintf(output, "<HTML xmlns=\"http://www.w3.org/1999/xhtml\" " \
+                                "lang=\"\" xml:lang=\"\">\n"            \
+                                "<HEAD>\n"                              \
+                                "<TITLE>Document Outline</TITLE>\n"     \
+                                "<META http-equiv=\"Content-Type\" content=\"text/html; " \
+                                "charset=%s\"/>\n"                      \
+                                "</HEAD>\n<BODY>\n", htmlEncoding->getCString());
+                       delete htmlEncoding;
+               }
+       }
+       if (!xml)
+       {
+               GBool done = newHtmlOutlineLevel(output, outlines, catalog);
+               if (done && !complexMode)
+                       fputs("<hr>\n", output);
+       
+               if (bClose)
+               {
+                       fputs("</BODY>\n</HTML>\n", output);
+                       fclose(output);
+               }
+       }
+       else
+               newXmlOutlineLevel(output, outlines, catalog);
+
+       return gTrue;
+#endif
+}
+
+GBool HtmlOutputDev::newHtmlOutlineLevel(FILE *output, GooList *outlines, Catalog* catalog, int level)
+{
+#ifdef DISABLE_OUTLINE
+       return gFalse;
+#else
+       GBool atLeastOne = gFalse;
+
+       if (level == 1)
+       {
+               fputs("<A name=\"outline\"></a>", output);
+               fputs("<h1>Document Outline</h1>\n", output);
+       }
+       fputs("<ul>\n",output);
+
+       for (int i = 0; i < outlines->getLength(); i++)
+       {
+               OutlineItem *item = (OutlineItem*)outlines->get(i);
+               GooString *titleStr = HtmlFont::HtmlFilter(item->getTitle(),
+                                                          item->getTitleLength());
+
+               GooString *linkName = NULL;;
+        int page = getOutlinePageNum(item);
+        if (page > 0)
+        {
+                               /*              complex         simple
+                               frames          file-4.html     files.html#4
+                               noframes        file.html#4     file.html#4
+                               */
+                               linkName=basename(Docname);
+                               GooString *str=GooString::fromInt(page);
+                               if (noframes) {
+                                       linkName->append(".html#");
+                                       linkName->append(str);
+                               } else {
+                                       if( complexMode ) {
+                                               linkName->append("-");
+                                               linkName->append(str);
+                                               linkName->append(".html");
+                                       } else {
+                                               linkName->append("s.html#");
+                                               linkName->append(str);
+                                       }
+                               }
+                               delete str;
+               }
+
+               fputs("<li>",output);
+               if (linkName)
+                       fprintf(output,"<A href=\"%s\">", linkName->getCString());
+               fputs(titleStr->getCString(),output);
+               if (linkName) {
+                       fputs("</A>",output);
+                       delete linkName;
+               }
+               delete titleStr;
+               atLeastOne = gTrue;
+
+               item->open();
+               if (item->hasKids())
+               {
+                       fputs("\n",output);
+                       newHtmlOutlineLevel(output, item->getKids(), catalog, level+1);
+               }
+               item->close();
+               fputs("</li>\n",output);
+       }
+       fputs("</ul>\n",output);
+
+       return atLeastOne;
+#endif
+}
+
+void HtmlOutputDev::newXmlOutlineLevel(FILE *output, GooList *outlines, Catalog* catalog)
+{
+#ifndef DISABLE_OUTLINE
+    fputs("<outline>\n", output);
+
+    for (int i = 0; i < outlines->getLength(); i++)
+    {
+        OutlineItem *item     = (OutlineItem*)outlines->get(i);
+        GooString   *titleStr = HtmlFont::HtmlFilter(item->getTitle(),
+                                                     item->getTitleLength());
+        int page = getOutlinePageNum(item);
+        if (page > 0)
+        {
+            fprintf(output, "<item page=\"%d\">%s</item>\n",
+                    page, titleStr->getCString());
+        }
+        else
+        {
+            fprintf(output, "<item>%s</item>\n", titleStr->getCString());
+        }
+        delete titleStr;
+
+        item->open();
+        if (item->hasKids())
+        {
+            newXmlOutlineLevel(output, item->getKids(), catalog);
+        }
+        item->close();
+    }    
+
+    fputs("</outline>\n", output);
+#endif
+}
+
+#ifndef DISABLE_OUTLINE
+int HtmlOutputDev::getOutlinePageNum(OutlineItem *item)
+{
+    LinkAction *action   = item->getAction();
+    LinkGoTo   *link     = NULL;
+    LinkDest   *linkdest = NULL;
+    int         pagenum  = -1;
+
+    if (!action || action->getKind() != actionGoTo)
+        return pagenum;
+
+    link = dynamic_cast<LinkGoTo*>(action);
+
+    if (!link || !link->isOk())
+        return pagenum;
+
+    if (link->getDest())
+        linkdest = link->getDest()->copy();
+    else if (link->getNamedDest())
+        linkdest = catalog->findDest(link->getNamedDest());
+
+    if (!linkdest)
+        return pagenum;
+
+    if (linkdest->isPageRef()) {
+        Ref pageref = linkdest->getPageRef();
+        pagenum = catalog->findPage(pageref.num, pageref.gen);
+    } else {
+        pagenum = linkdest->getPageNum();
+    }
+
+    delete linkdest;
+    return pagenum;
+}
+#endif
diff --git a/utils/HtmlOutputDev.h b/utils/HtmlOutputDev.h
new file mode 100644 (file)
index 0000000..12b16bf
--- /dev/null
@@ -0,0 +1,354 @@
+//========================================================================
+//
+// HtmlOutputDev.h
+//
+// Copyright 1997 Derek B. Noonburg
+//
+// Changed 1999 by G.Ovtcharov
+//========================================================================
+
+//========================================================================
+//
+// Modified under the Poppler project - http://poppler.freedesktop.org
+//
+// All changes made under the Poppler project to this file are licensed
+// under GPL version 2 or later
+//
+// Copyright (C) 2006, 2007, 2009, 2012 Albert Astals Cid <aacid@kde.org>
+// Copyright (C) 2008, 2009 Warren Toomey <wkt@tuhs.org>
+// Copyright (C) 2009, 2011 Carlos Garcia Campos <carlosgc@gnome.org>
+// Copyright (C) 2009 Kovid Goyal <kovid@kovidgoyal.net>
+// Copyright (C) 2010 Hib Eris <hib@hiberis.nl>
+// Copyright (C) 2011 Joshua Richardson <jric@chegg.com>
+// Copyright (C) 2011 Stephen Reichling <sreichling@chegg.com>
+// Copyright (C) 2012 Igor Slepchin <igor.redhat@gmail.com>
+// Copyright (C) 2012 Fabio D'Urso <fabiodurso@hotmail.it>
+//
+// To see a description of the changes please see the Changelog file that
+// came with your tarball or type make ChangeLog if you are building from git
+//
+//========================================================================
+
+#ifndef HTMLOUTPUTDEV_H
+#define HTMLOUTPUTDEV_H
+
+#ifdef __GNUC__
+#pragma interface
+#endif
+
+#include <stdio.h>
+#include "goo/gtypes.h"
+#include "goo/GooList.h"
+#include "GfxFont.h"
+#include "OutputDev.h"
+#include "HtmlLinks.h"
+#include "HtmlFonts.h"
+#include "Link.h"
+#include "Catalog.h"
+#include "UnicodeMap.h"
+
+
+#ifdef _WIN32
+#  define SLASH '\\'
+#else
+#  define SLASH '/'
+#endif
+
+#define xoutRound(x) ((int)(x + 0.5))
+
+#define DOCTYPE "<!DOCTYPE html>"
+
+class GfxState;
+class GooString;
+class PDFDoc;
+class OutlineItem;
+//------------------------------------------------------------------------
+// HtmlString
+//------------------------------------------------------------------------
+
+enum UnicodeTextDirection {
+  textDirUnknown,
+  textDirLeftRight,
+  textDirRightLeft,
+  textDirTopBottom
+};
+
+
+class HtmlString {
+public:
+
+  // Constructor.
+  HtmlString(GfxState *state, double fontSize, HtmlFontAccu* fonts);
+
+  // Destructor.
+  ~HtmlString();
+
+  // Add a character to the string.
+  void addChar(GfxState *state, double x, double y,
+              double dx, double dy,
+              Unicode u); 
+  HtmlLink* getLink() { return link; }
+  const HtmlFont &getFont() const { return *fonts->Get(fontpos); }
+  void endString(); // postprocessing
+
+private:
+// aender die text variable
+  HtmlLink *link;
+  double xMin, xMax;           // bounding box x coordinates
+  double yMin, yMax;           // bounding box y coordinates
+  int col;                     // starting column
+  Unicode *text;               // the text
+  double *xRight;              // right-hand x coord of each char
+  HtmlString *yxNext;          // next string in y-major order
+  HtmlString *xyNext;          // next string in x-major order
+  int fontpos;
+  GooString* htext;
+  int len;                     // length of text and xRight
+  int size;                    // size of text and xRight arrays
+  UnicodeTextDirection dir;    // direction (left to right/right to left)
+  HtmlFontAccu *fonts;
+  
+  friend class HtmlPage;
+
+};
+
+
+//------------------------------------------------------------------------
+// HtmlPage
+//------------------------------------------------------------------------
+
+
+
+class HtmlPage {
+public:
+
+  // Constructor.
+  HtmlPage(GBool rawOrder, char *imgExtVal);
+
+  // Destructor.
+  ~HtmlPage();
+
+  // Begin a new string.
+  void beginString(GfxState *state, GooString *s);
+
+  // Add a character to the current string.
+  void addChar(GfxState *state, double x, double y,
+              double dx, double dy, 
+               double ox, double oy, 
+               Unicode *u, int uLen); //Guchar c);
+
+  void updateFont(GfxState *state);
+
+  // End the current string, sorting it into the list of strings.
+  void endString();
+
+  // Coalesce strings that look like parts of the same line.
+  void coalesce();
+
+  // Find a string.  If <top> is true, starts looking at top of page;
+  // otherwise starts looking at <xMin>,<yMin>.  If <bottom> is true,
+  // stops looking at bottom of page; otherwise stops looking at
+  // <xMax>,<yMax>.  If found, sets the text bounding rectange and
+  // returns true; otherwise returns false.
+  
+
+  // new functions
+  void AddLink(const HtmlLink& x){
+    links->AddLink(x);
+  }
+
+  // add an image to the current page
+  void addImage(GooString *fname, GfxState *state);
+
+  // number of images on the current page
+  int  getNumImages() { return imgList->getLength(); }
+
+  void dump(FILE *f, int pageNum);
+
+  // Clear the page.
+  void clear();
+  
+  void conv();
+private:
+  HtmlFont* getFont(HtmlString *hStr) { return fonts->Get(hStr->fontpos); }
+
+  double fontSize;             // current font size
+  GBool rawOrder;              // keep strings in content stream order
+
+  HtmlString *curStr;          // currently active string
+
+  HtmlString *yxStrings;       // strings in y-major order
+  HtmlString *xyStrings;       // strings in x-major order
+  HtmlString *yxCur1, *yxCur2; // cursors for yxStrings list
+  
+  void setDocName(char* fname);
+  void dumpAsXML(FILE* f,int page);
+  void dumpComplex(FILE* f, int page);
+  int dumpComplexHeaders(FILE * const file, FILE *& pageFile, int page);
+
+  // marks the position of the fonts that belong to current page (for noframes)
+  int fontsPageMarker; 
+  HtmlFontAccu *fonts;
+  HtmlLinks *links; 
+  GooList   *imgList;
+  
+  GooString *DocName;
+  GooString *imgExt;
+  int pageWidth;
+  int pageHeight;
+  int firstPage;                // used to begin the numeration of pages
+
+  friend class HtmlOutputDev;
+};
+
+//------------------------------------------------------------------------
+// HtmlMetaVar
+//------------------------------------------------------------------------
+class HtmlMetaVar {
+public:
+    HtmlMetaVar(const char *_name, const char *_content);
+    ~HtmlMetaVar();    
+    
+    GooString* toString();     
+
+private:
+
+    GooString *name;
+    GooString *content;
+};
+
+//------------------------------------------------------------------------
+// HtmlOutputDev
+//------------------------------------------------------------------------
+
+class HtmlOutputDev: public OutputDev {
+public:
+
+  // Open a text output file.  If <fileName> is NULL, no file is written
+  // (this is useful, e.g., for searching text).  If <useASCII7> is true,
+  // text is converted to 7-bit ASCII; otherwise, text is converted to
+  // 8-bit ISO Latin-1.  <useASCII7> should also be set for Japanese
+  // (EUC-JP) text.  If <rawOrder> is true, the text is kept in content
+  // stream order.
+  HtmlOutputDev(Catalog *catalogA, char *fileName, char *title, 
+         char *author,
+         char *keywords,
+         char *subject,
+         char *date,
+         char *extension,
+         GBool rawOrder,
+         int firstPage = 1,
+         GBool outline = 0);
+
+  // Destructor.
+  virtual ~HtmlOutputDev();
+
+  // Check if file was successfully created.
+  virtual GBool isOk() { return ok; }
+
+  //---- get info about output device
+
+  // Does this device use upside-down coordinates?
+  // (Upside-down means (0,0) is the top left corner of the page.)
+  virtual GBool upsideDown() { return gTrue; }
+
+  // Does this device use drawChar() or drawString()?
+  virtual GBool useDrawChar() { return gTrue; }
+
+  // Does this device use beginType3Char/endType3Char?  Otherwise,
+  // text in Type 3 fonts will be drawn with drawChar/drawString.
+  virtual GBool interpretType3Chars() { return gFalse; }
+
+  // Does this device need non-text content?
+  virtual GBool needNonText() { return gTrue; }
+
+  //----- initialization and control
+
+  virtual GBool checkPageSlice(Page *page, double hDPI, double vDPI,
+                               int rotate, GBool useMediaBox, GBool crop,
+                               int sliceX, int sliceY, int sliceW, int sliceH,
+                               GBool printing,
+                               GBool (* abortCheckCbk)(void *data) = NULL,
+                               void * abortCheckCbkData = NULL,
+                               GBool (*annotDisplayDecideCbk)(Annot *annot, void *user_data) = NULL,
+                               void *annotDisplayDecideCbkData = NULL)
+  {
+   docPage = page;
+   return gTrue;
+  }
+
+
+  // Start a page.
+  virtual void startPage(int pageNum, GfxState *state);
+
+  // End a page.
+  virtual void endPage();
+
+  //----- update text state
+  virtual void updateFont(GfxState *state);
+
+  //----- text drawing
+  virtual void beginString(GfxState *state, GooString *s);
+  virtual void endString(GfxState *state);
+  virtual void drawChar(GfxState *state, double x, double y,
+                       double dx, double dy,
+                       double originX, double originY,
+                       CharCode code, int nBytes, Unicode *u, int uLen);
+  
+  virtual void drawImageMask(GfxState *state, Object *ref, 
+                            Stream *str,
+                            int width, int height, GBool invert,
+                            GBool interpolate, GBool inlineImg);
+  virtual void drawImage(GfxState *state, Object *ref, Stream *str,
+                        int width, int height, GfxImageColorMap *colorMap,
+                        GBool interpolate, int *maskColors, GBool inlineImg);
+
+  //new feature    
+  virtual int DevType() {return 1234;}
+
+  int getPageWidth() { return maxPageWidth; }
+  int getPageHeight() { return maxPageHeight; }
+
+  GBool dumpDocOutline(PDFDoc* doc);
+
+private:
+  // convert encoding into a HTML standard, or encoding->getCString if not
+  // recognized. Will delete encoding for you and return a new one
+  // that you have to delete
+  static GooString* mapEncodingToHtml(GooString* encoding);
+  void doProcessLink(AnnotLink *link);
+  GooString* getLinkDest(AnnotLink *link);
+  void dumpMetaVars(FILE *);
+  void doFrame(int firstPage);
+  GBool newHtmlOutlineLevel(FILE *output, GooList *outlines, Catalog* catalog, int level = 1);
+  void newXmlOutlineLevel(FILE *output, GooList *outlines, Catalog* catalog);
+#ifndef DISABLE_OUTLINE
+  int getOutlinePageNum(OutlineItem *item);
+#endif
+  void drawJpegImage(GfxState *state, Stream *str);
+  void drawPngImage(GfxState *state, Stream *str, int width, int height,
+                    GfxImageColorMap *colorMap, GBool isMask = gFalse);
+  GooString *createImageFileName(const char *ext);
+
+  FILE *fContentsFrame;
+  FILE *page;                   // html file
+  //FILE *tin;                    // image log file
+  //GBool write;
+  GBool needClose;             // need to close the file?
+  HtmlPage *pages;             // text for the current page
+  GBool rawOrder;              // keep text in content stream order
+  GBool doOutline;             // output document outline
+  GBool ok;                    // set up ok?
+  GBool dumpJPEG;
+  int pageNum;
+  int maxPageWidth;
+  int maxPageHeight;
+  GooString *Docname;
+  GooString *docTitle;
+  GooList *glMetaVars;
+  Catalog *catalog;
+  Page *docPage;
+  friend class HtmlPage;
+};
+
+#endif
diff --git a/utils/HtmlUtils.h b/utils/HtmlUtils.h
new file mode 100644 (file)
index 0000000..bdb89b9
--- /dev/null
@@ -0,0 +1,51 @@
+//
+// HtmlUtils.h
+//
+//  Created on: Jun 8, 2011
+//      Author: Joshua Richardson <jric@chegg.com>
+//  Copyright 2011
+//
+// All changes made under the Poppler project to this file are licensed
+// under GPL version 2 or later
+//
+// Copyright (C) 2011 Joshua Richardson <jric@chegg.com>
+//
+// To see a description of the changes please see the Changelog file that
+// came with your tarball or type make ChangeLog if you are building from git
+//
+//========================================================================
+
+#ifndef HTMLUTILS_H_
+#define HTMLUTILS_H_
+
+#include <math.h> // fabs
+#include "goo/gtypes.h" // GBool
+
+// Returns true iff the difference between a and b is less than the threshold
+// We always use fuzzy math when comparing decimal numbers due to imprecision
+inline GBool is_within(double a, double thresh, double b) {
+       return fabs(a-b) < thresh;
+}
+
+inline GBool rot_matrices_equal(const double * const mat0, const double * const mat1) {
+       return is_within(mat0[0], .1, mat1[0]) && is_within(mat0[1], .1, mat1[1]) &&
+                       is_within(mat0[2], .1, mat1[2]) && is_within(mat0[3], .1, mat1[3]);
+}
+
+// rotation is (cos q, sin q, -sin q, cos q, 0, 0)
+// sin q is zero iff there is no rotation, or 180 deg. rotation;
+// for 180 rotation, cos q will be negative
+inline GBool isMatRotOrSkew(const double * const mat) {
+       return mat[0] < 0 || !is_within(mat[1], .1, 0);
+}
+
+// Alters the matrix so that it does not scale a vector's x component;
+// If the matrix does not skew, then that will also normalize the y
+//  component, keeping any rotation, but removing scaling.
+inline void normalizeRotMat(double *mat) {
+       double scale = fabs(mat[0] + mat[1]);
+       if (!scale) return;
+       for (int i = 0; i < 4; i++) mat[i] /= scale;
+}
+
+#endif /* HTMLUTILS_H_ */
diff --git a/utils/ImageOutputDev.cc b/utils/ImageOutputDev.cc
new file mode 100644 (file)
index 0000000..0c06513
--- /dev/null
@@ -0,0 +1,425 @@
+//========================================================================
+//
+// ImageOutputDev.cc
+//
+// Copyright 1998-2003 Glyph & Cog, LLC
+//
+//========================================================================
+
+//========================================================================
+//
+// Modified under the Poppler project - http://poppler.freedesktop.org
+//
+// All changes made under the Poppler project to this file are licensed
+// under GPL version 2 or later
+//
+// Copyright (C) 2005, 2007, 2011 Albert Astals Cid <aacid@kde.org>
+// Copyright (C) 2006 Rainer Keller <class321@gmx.de>
+// Copyright (C) 2008 Timothy Lee <timothy.lee@siriushk.com>
+// Copyright (C) 2008 Vasile Gaburici <gaburici@cs.umd.edu>
+// Copyright (C) 2009 Carlos Garcia Campos <carlosgc@gnome.org>
+// Copyright (C) 2009 William Bader <williambader@hotmail.com>
+// Copyright (C) 2010 Jakob Voss <jakob.voss@gbv.de>
+// Copyright (C) 2012 Adrian Johnson <ajohnson@redneon.com>
+//
+// To see a description of the changes please see the Changelog file that
+// came with your tarball or type make ChangeLog if you are building from git
+//
+//========================================================================
+
+#include "config.h"
+#include <poppler-config.h>
+
+#ifdef USE_GCC_PRAGMAS
+#pragma implementation
+#endif
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <stddef.h>
+#include <ctype.h>
+#include "goo/gmem.h"
+#include "Error.h"
+#include "GfxState.h"
+#include "Object.h"
+#include "Stream.h"
+#include "ImageOutputDev.h"
+
+ImageOutputDev::ImageOutputDev(char *fileRootA, GBool pageNamesA, GBool dumpJPEGA, GBool listImagesA) {
+  listImages = listImagesA;
+  if (!listImages) {
+    fileRoot = copyString(fileRootA);
+    fileName = (char *)gmalloc(strlen(fileRoot) + 45);
+  }
+  dumpJPEG = dumpJPEGA;
+  pageNames = pageNamesA;
+  imgNum = 0;
+  pageNum = 0;
+  ok = gTrue;
+  if (listImages) {
+    printf("page   num  type   width height color comp bpc  enc interp  object ID\n");
+    printf("---------------------------------------------------------------------\n");
+  }
+}
+
+
+ImageOutputDev::~ImageOutputDev() {
+  if (!listImages) {
+    gfree(fileName);
+    gfree(fileRoot);
+  }
+}
+
+void ImageOutputDev::setFilename(const char *fileExt) {
+  if (pageNames) {
+    sprintf(fileName, "%s-%03d-%03d.%s", fileRoot, pageNum, imgNum, fileExt);
+  } else {
+    sprintf(fileName, "%s-%03d.%s", fileRoot, imgNum, fileExt);
+  }
+}
+
+void ImageOutputDev::listImage(GfxState *state, Object *ref, Stream *str,
+                              int width, int height,
+                              GfxImageColorMap *colorMap,
+                              GBool interpolate, GBool inlineImg,
+                              ImageType imageType) {
+  const char *type;
+  const char *colorspace;
+  const char *enc;
+  int components, bpc;
+
+  printf("%4d %5d ", pageNum, imgNum);
+  type = "";
+  switch (imageType) {
+  case imgImage:
+    type = "image";
+    break;
+  case imgStencil:
+    type = "stencil";
+    break;
+  case imgMask:
+    type = "mask";
+    break;
+  case imgSmask:
+    type = "smask";
+    break;
+  }
+  printf("%-7s %5d %5d  ", type, width, height);
+
+  colorspace = "-";
+  /* masks and stencils default to ncomps = 1 and bpc = 1 */
+  components = 1;
+  bpc = 1;
+  if (colorMap && colorMap->isOk()) {
+    switch (colorMap->getColorSpace()->getMode()) {
+      case csDeviceGray:
+      case csCalGray:
+        colorspace = "gray";
+        break;
+      case csDeviceRGB:
+      case csCalRGB:
+        colorspace = "rgb";
+        break;
+      case csDeviceCMYK:
+        colorspace = "cmyk";
+        break;
+      case csLab:
+        colorspace = "lab";
+        break;
+      case csICCBased:
+        colorspace = "icc";
+        break;
+      case csIndexed:
+        colorspace = "index";
+        break;
+      case csSeparation:
+        colorspace = "sep";
+        break;
+      case csDeviceN:
+        colorspace = "devn";
+        break;
+      case csPattern:
+      default:
+        colorspace = "-";
+        break;
+    }
+    components = colorMap->getNumPixelComps();
+    bpc = colorMap->getBits();
+  }
+  printf("%-5s  %2d  %2d  ", colorspace, components, bpc);
+
+  switch (str->getKind()) {
+  case strCCITTFax:
+    enc = "ccitt";
+    break;
+  case strDCT:
+    enc = "jpeg";
+    break;
+  case strJPX:
+    enc = "jpx";
+    break;
+  case strJBIG2:
+    enc = "jbig2";
+    break;
+  case strFile:
+  case strFlate:
+  case strCachedFile:
+  case strASCIIHex:
+  case strASCII85:
+  case strLZW:
+  case strRunLength:
+  case strWeird:
+  default:
+    enc = "image";
+    break;
+  }
+  printf("%-5s  ", enc);
+
+  printf("%-3s  ", interpolate ? "yes" : "no");
+
+  if (inlineImg) {
+    printf("[inline]\n");
+  } else if (ref->isRef()) {
+    const Ref imageRef = ref->getRef();
+    if (imageRef.gen >= 100000) {
+      printf("[none]\n");
+    } else {
+      printf(" %6d %2d\n", imageRef.num, imageRef.gen);
+    }
+  } else {
+    printf("[none]\n");
+  }
+
+  ++imgNum;
+}
+
+void ImageOutputDev::writeMask(GfxState *state, Object *ref, Stream *str,
+                              int width, int height, GBool invert,
+                              GBool interpolate, GBool inlineImg) {
+  FILE *f;
+  int c;
+  int size, i;
+
+  // dump JPEG file
+  if (dumpJPEG && str->getKind() == strDCT && !inlineImg) {
+
+    // open the image file
+    setFilename("jpg");
+    ++imgNum;
+    if (!(f = fopen(fileName, "wb"))) {
+      error(errIO, -1, "Couldn't open image file '{0:s}'", fileName);
+      return;
+    }
+
+    // initialize stream
+    str = str->getNextStream();
+    str->reset();
+
+    // copy the stream
+    while ((c = str->getChar()) != EOF)
+      fputc(c, f);
+
+    str->close();
+    fclose(f);
+
+  // dump PBM file
+  } else {
+
+    // open the image file and write the PBM header
+    setFilename("pbm");
+    ++imgNum;
+    if (!(f = fopen(fileName, "wb"))) {
+      error(errIO, -1, "Couldn't open image file '{0:s}'", fileName);
+      return;
+    }
+    fprintf(f, "P4\n");
+    fprintf(f, "%d %d\n", width, height);
+
+    // initialize stream
+    str->reset();
+
+    // copy the stream
+    size = height * ((width + 7) / 8);
+    for (i = 0; i < size; ++i) {
+      fputc(str->getChar(), f);
+    }
+
+    str->close();
+    fclose(f);
+  }
+}
+
+void ImageOutputDev::writeImage(GfxState *state, Object *ref, Stream *str,
+                               int width, int height,
+                               GfxImageColorMap *colorMap,
+                               GBool interpolate, int *maskColors, GBool inlineImg) {
+  FILE *f;
+  ImageStream *imgStr;
+  Guchar *p;
+  Guchar zero = 0;
+  GfxGray gray;
+  GfxRGB rgb;
+  int x, y;
+  int c;
+  int size, i;
+  int pbm_mask = 0xff;
+
+  // dump JPEG file
+  if (dumpJPEG && str->getKind() == strDCT &&
+      (colorMap->getNumPixelComps() == 1 ||
+       colorMap->getNumPixelComps() == 3) &&
+      !inlineImg) {
+
+    // open the image file
+    setFilename("jpg");
+    ++imgNum;
+    if (!(f = fopen(fileName, "wb"))) {
+      error(errIO, -1, "Couldn't open image file '{0:s}'", fileName);
+      return;
+    }
+
+    // initialize stream
+    str = str->getNextStream();
+    str->reset();
+
+    // copy the stream
+    while ((c = str->getChar()) != EOF)
+      fputc(c, f);
+
+    str->close();
+    fclose(f);
+
+  // dump PBM file
+  } else if (colorMap->getNumPixelComps() == 1 &&
+            colorMap->getBits() == 1) {
+
+    // open the image file and write the PBM header
+    setFilename("pbm");
+    ++imgNum;
+    if (!(f = fopen(fileName, "wb"))) {
+      error(errIO, -1, "Couldn't open image file '{0:s}'", fileName);
+      return;
+    }
+    fprintf(f, "P4\n");
+    fprintf(f, "%d %d\n", width, height);
+
+    // initialize stream
+    str->reset();
+
+    // if 0 comes out as 0 in the color map, the we _flip_ stream bits
+    // otherwise we pass through stream bits unmolested
+    colorMap->getGray(&zero, &gray);
+    if(colToByte(gray))
+      pbm_mask = 0;
+
+    // copy the stream
+    size = height * ((width + 7) / 8);
+    for (i = 0; i < size; ++i) {
+      fputc(str->getChar() ^ pbm_mask, f);
+    }
+
+    str->close();
+    fclose(f);
+
+  // dump PPM file
+  } else {
+
+    // open the image file and write the PPM header
+    setFilename("ppm");
+    ++imgNum;
+    if (!(f = fopen(fileName, "wb"))) {
+      error(errIO, -1, "Couldn't open image file '{0:s}'", fileName);
+      return;
+    }
+    fprintf(f, "P6\n");
+    fprintf(f, "%d %d\n", width, height);
+    fprintf(f, "255\n");
+
+    // initialize stream
+    imgStr = new ImageStream(str, width, colorMap->getNumPixelComps(),
+                            colorMap->getBits());
+    imgStr->reset();
+
+    // for each line...
+    for (y = 0; y < height; ++y) {
+
+      // write the line
+      if ((p = imgStr->getLine())) {
+       for (x = 0; x < width; ++x) {
+         colorMap->getRGB(p, &rgb);
+         fputc(colToByte(rgb.r), f);
+         fputc(colToByte(rgb.g), f);
+         fputc(colToByte(rgb.b), f);
+         p += colorMap->getNumPixelComps();
+       }
+      } else {
+       for (x = 0; x < width; ++x) {
+         fputc(0, f);
+         fputc(0, f);
+         fputc(0, f);
+       }
+      }
+    }
+    imgStr->close();
+    delete imgStr;
+
+    fclose(f);
+  }
+}
+
+GBool ImageOutputDev::tilingPatternFill(GfxState *state, Gfx *gfx, Catalog *cat, Object *str,
+                                 double *pmat, int paintType, int tilingType, Dict *resDict,
+                                 double *mat, double *bbox,
+                                 int x0, int y0, int x1, int y1,
+                                 double xStep, double yStep) {
+  return gTrue;
+  // do nothing -- this avoids the potentially slow loop in Gfx.cc
+}
+
+void ImageOutputDev::drawImageMask(GfxState *state, Object *ref, Stream *str,
+                                  int width, int height, GBool invert,
+                                  GBool interpolate, GBool inlineImg) {
+  if (listImages)
+    listImage(state, ref, str, width, height, NULL, interpolate, inlineImg, imgMask);
+  else
+    writeMask(state, ref, str, width, height, invert, interpolate, inlineImg);
+}
+
+void ImageOutputDev::drawImage(GfxState *state, Object *ref, Stream *str,
+                              int width, int height,
+                              GfxImageColorMap *colorMap,
+                              GBool interpolate, int *maskColors, GBool inlineImg) {
+  if (listImages)
+    listImage(state, ref, str, width, height, colorMap, interpolate, inlineImg, imgImage);
+  else
+    writeImage(state, ref, str, width, height, colorMap, interpolate, maskColors, inlineImg);
+}
+
+void ImageOutputDev::drawMaskedImage(
+  GfxState *state, Object *ref, Stream *str,
+  int width, int height, GfxImageColorMap *colorMap, GBool interpolate,
+  Stream *maskStr, int maskWidth, int maskHeight, GBool maskInvert, GBool maskInterpolate) {
+  if (listImages) {
+    listImage(state, ref, str, width, height, colorMap, interpolate, gFalse, imgImage);
+    listImage(state, ref, str, maskWidth, maskHeight, NULL, maskInterpolate, gFalse, imgMask);
+  } else {
+    drawImage(state, ref, str, width, height, colorMap, interpolate, NULL, gFalse);
+    drawImageMask(state, ref, maskStr, maskWidth, maskHeight, maskInvert,
+                 maskInterpolate, gFalse);
+  }
+}
+
+void ImageOutputDev::drawSoftMaskedImage(
+  GfxState *state, Object *ref, Stream *str,
+  int width, int height, GfxImageColorMap *colorMap, GBool interpolate,
+  Stream *maskStr, int maskWidth, int maskHeight,
+  GfxImageColorMap *maskColorMap, GBool maskInterpolate) {
+  if (listImages) {
+    listImage(state, ref, str, width, height, colorMap, interpolate, gFalse, imgImage);
+    listImage(state, ref, maskStr, maskWidth, height, maskColorMap, maskInterpolate, gFalse, imgSmask);
+  } else {
+    drawImage(state, ref, str, width, height, colorMap, interpolate, NULL, gFalse);
+    drawImage(state, ref, maskStr, maskWidth, maskHeight,
+             maskColorMap, maskInterpolate, NULL, gFalse);
+  }
+}
diff --git a/utils/ImageOutputDev.h b/utils/ImageOutputDev.h
new file mode 100644 (file)
index 0000000..6201a24
--- /dev/null
@@ -0,0 +1,148 @@
+//========================================================================
+//
+// ImageOutputDev.h
+//
+// Copyright 1998-2003 Glyph & Cog, LLC
+//
+//========================================================================
+
+//========================================================================
+//
+// Modified under the Poppler project - http://poppler.freedesktop.org
+//
+// All changes made under the Poppler project to this file are licensed
+// under GPL version 2 or later
+//
+// Copyright (C) 2006 Rainer Keller <class321@gmx.de>
+// Copyright (C) 2008 Timothy Lee <timothy.lee@siriushk.com>
+// Copyright (C) 2009 Carlos Garcia Campos <carlosgc@gnome.org>
+// Copyright (C) 2010 Jakob Voss <jakob.voss@gbv.de>
+// Copyright (C) 2012 Adrian Johnson <ajohnson@redneon.com>
+//
+// To see a description of the changes please see the Changelog file that
+// came with your tarball or type make ChangeLog if you are building from git
+//
+//========================================================================
+
+#ifndef IMAGEOUTPUTDEV_H
+#define IMAGEOUTPUTDEV_H
+
+#include "poppler/poppler-config.h"
+
+#ifdef USE_GCC_PRAGMAS
+#pragma interface
+#endif
+
+#include <stdio.h>
+#include "goo/gtypes.h"
+#include "OutputDev.h"
+
+class GfxState;
+
+//------------------------------------------------------------------------
+// ImageOutputDev
+//------------------------------------------------------------------------
+
+class ImageOutputDev: public OutputDev {
+public:
+  enum ImageType {
+    imgImage,
+    imgStencil,
+    imgMask,
+    imgSmask
+  };
+
+  // Create an OutputDev which will write images to files named
+  // <fileRoot>-NNN.<type> or <fileRoot>-PPP-NNN.<type>, if 
+  // <pageNames> is set. Normally, all images are written as PBM
+  // (.pbm) or PPM (.ppm) files.  If <dumpJPEG> is set, JPEG images 
+  // are written as JPEG (.jpg) files.
+  ImageOutputDev(char *fileRootA, GBool pageNamesA, GBool dumpJPEGA, GBool listImagesA);
+
+  // Destructor.
+  virtual ~ImageOutputDev();
+
+  // Check if file was successfully created.
+  virtual GBool isOk() { return ok; }
+
+  // Does this device use tilingPatternFill()?  If this returns false,
+  // tiling pattern fills will be reduced to a series of other drawing
+  // operations.
+  virtual GBool useTilingPatternFill() { return gTrue; }
+
+  // Does this device use beginType3Char/endType3Char?  Otherwise,
+  // text in Type 3 fonts will be drawn with drawChar/drawString.
+  virtual GBool interpretType3Chars() { return gFalse; }
+
+  // Does this device need non-text content?
+  virtual GBool needNonText() { return gTrue; }
+
+  // Start a page
+  virtual void startPage(int pageNumA, GfxState *state) 
+                       { pageNum = pageNumA; }
+  //---- get info about output device
+
+  // Does this device use upside-down coordinates?
+  // (Upside-down means (0,0) is the top left corner of the page.)
+  virtual GBool upsideDown() { return gTrue; }
+
+  // Does this device use drawChar() or drawString()?
+  virtual GBool useDrawChar() { return gFalse; }
+
+  //----- path painting
+  virtual GBool tilingPatternFill(GfxState *state, Gfx *gfx, Catalog *cat, Object *str,
+                                 double *pmat, int paintType, int tilingType, Dict *resDict,
+                                 double *mat, double *bbox,
+                                 int x0, int y0, int x1, int y1,
+                                 double xStep, double yStep);
+
+  //----- image drawing
+  virtual void drawImageMask(GfxState *state, Object *ref, Stream *str,
+                            int width, int height, GBool invert,
+                            GBool interpolate, GBool inlineImg);
+  virtual void drawImage(GfxState *state, Object *ref, Stream *str,
+                        int width, int height, GfxImageColorMap *colorMap,
+                        GBool interpolate, int *maskColors, GBool inlineImg);
+  virtual void drawMaskedImage(GfxState *state, Object *ref, Stream *str,
+                              int width, int height,
+                              GfxImageColorMap *colorMap,
+                              GBool interpolate,
+                              Stream *maskStr, int maskWidth, int maskHeight,
+                              GBool maskInvert, GBool maskInterpolate);
+  virtual void drawSoftMaskedImage(GfxState *state, Object *ref, Stream *str,
+                                  int width, int height,
+                                  GfxImageColorMap *colorMap,
+                                  GBool interpolate,
+                                  Stream *maskStr,
+                                  int maskWidth, int maskHeight,
+                                  GfxImageColorMap *maskColorMap,
+                                  GBool maskInterpolate);
+
+private:
+  // Sets the output filename with a given file extension
+  void setFilename(const char *fileExt);
+  void listImage(GfxState *state, Object *ref, Stream *str,
+                int width, int height,
+                GfxImageColorMap *colorMap,
+                GBool interpolate, GBool inlineImg,
+                ImageType imageType);
+  void writeMask(GfxState *state, Object *ref, Stream *str,
+                int width, int height, GBool invert,
+                GBool interpolate, GBool inlineImg);
+  void writeImage(GfxState *state, Object *ref, Stream *str,
+                  int width, int height, GfxImageColorMap *colorMap,
+                  GBool interpolate, int *maskColors, GBool inlineImg);
+
+
+  char *fileRoot;              // root of output file names
+  char *fileName;              // buffer for output file names
+  GBool listImages;            // list images instead of dumping
+  GBool dumpJPEG;              // set to dump native JPEG files
+  GBool pageNames;             // set to include page number in file names
+  int pageNum;                 // current page number
+  int imgNum;                  // current image number
+  GBool ok;                    // set up ok?
+};
+
+#endif
diff --git a/utils/Makefile.am b/utils/Makefile.am
new file mode 100644 (file)
index 0000000..ad845c1
--- /dev/null
@@ -0,0 +1,137 @@
+if BUILD_SPLASH_OUTPUT
+
+pdftoppm_SOURCES =                             \
+       pdftoppm.cc                             \
+       $(common)
+
+pdftoppm_binary = pdftoppm
+
+pdftoppm_manpage = pdftoppm.1
+
+endif
+
+INCLUDES =                                     \
+       -I$(top_srcdir)                         \
+       -I$(top_srcdir)/goo                     \
+       -I$(top_srcdir)/utils                   \
+       -I$(top_srcdir)/poppler                 \
+       $(UTILS_CFLAGS)                         \
+       $(FONTCONFIG_CFLAGS)                    \
+       $(PDFTOCAIRO_CFLAGS)
+
+LDADD =                                                \
+       $(top_builddir)/poppler/libpoppler.la   \
+       $(UTILS_LIBS)                           \
+       $(FONTCONFIG_LIBS)
+
+if BUILD_CAIRO_OUTPUT
+
+pdftocairo_SOURCES =                           \
+       pdftocairo.cc                           \
+       $(common)
+
+if USE_CMS
+PDFTOCAIRO_CFLAGS += $(LCMS_CFLAGS)
+PDFTOCAIRO_LIBS += $(LCMS_LIBS)
+endif
+
+pdftocairo_LDADD =                             \
+       $(top_builddir)/poppler/libpoppler-cairo.la \
+       $(LDADD) $(PDFTOCAIRO_LIBS)
+
+
+pdftocairo_binary = pdftocairo
+
+pdftocairo_manpage = pdftocairo.1
+
+endif
+
+AM_LDFLAGS = @auto_import_flags@
+
+bin_PROGRAMS =                                 \
+       pdfdetach                               \
+       pdffonts                                \
+       pdfimages                               \
+       pdfinfo                                 \
+       pdftops                                 \
+       pdftotext                               \
+       pdftohtml                               \
+       pdfseparate                             \
+       pdfunite                                \
+       $(pdftoppm_binary)                      \
+       $(pdftocairo_binary)
+
+dist_man1_MANS =                               \
+       pdfdetach.1                             \
+       pdffonts.1                              \
+       pdfimages.1                             \
+       pdfinfo.1                               \
+       pdftops.1                               \
+       pdftotext.1                             \
+       pdftohtml.1                             \
+       pdfseparate.1                           \
+       pdfunite.1                              \
+       $(pdftoppm_manpage)                     \
+       $(pdftocairo_manpage)
+
+common = parseargs.cc parseargs.h
+
+pdfdetach_SOURCES =                            \
+       pdfdetach.cc                            \
+       $(common)
+
+pdffonts_SOURCES =                             \
+       pdffonts.cc                             \
+       $(common)
+
+pdfimages_SOURCES =                            \
+       pdfimages.cc                            \
+       ImageOutputDev.cc                       \
+       ImageOutputDev.h                        \
+       $(common)
+
+pdfinfo_SOURCES =                              \
+       pdfinfo.cc                              \
+       printencodings.cc                       \
+       printencodings.h                        \
+       $(common)
+
+pdftops_SOURCES =                              \
+       pdftops.cc                              \
+       $(common)
+
+pdftotext_SOURCES =                            \
+       pdftotext.cc                            \
+       printencodings.cc                       \
+       printencodings.h                        \
+       $(common)
+
+pdftohtml_SOURCES =                            \
+       pdftohtml.cc                            \
+       HtmlFonts.cc                            \
+       HtmlFonts.h                             \
+       HtmlLinks.cc                            \
+       HtmlLinks.h                             \
+       HtmlOutputDev.cc                        \
+       HtmlOutputDev.h                         \
+       HtmlUtils.h                             \
+       $(common)
+
+# HtmlOutputDev uses goo/PNGWriter.h that may depend on libpng header
+pdftohtml_CXXFLAGS = $(AM_CXXFLAGS)
+if BUILD_LIBPNG
+pdftohtml_CXXFLAGS += $(LIBPNG_CFLAGS)
+endif
+
+pdfseparate_SOURCES =                          \
+       pdfseparate.cc                          \
+       $(common)
+
+pdfunite_SOURCES =                             \
+       pdfunite.cc                             \
+       $(common)
+
+# Yay, automake!  It should be able to figure out that it has to dist
+# pdftoppm.1, but nooo.  So we just add it here.
+
+EXTRA_DIST = pdf2xml.dtd pdftoppm.1
diff --git a/utils/Makefile.in b/utils/Makefile.in
new file mode 100644 (file)
index 0000000..cfda1da
--- /dev/null
@@ -0,0 +1,1052 @@
+# Makefile.in generated by automake 1.11.5 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software
+# Foundation, Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+@SET_MAKE@
+
+VPATH = @srcdir@
+am__make_dryrun = \
+  { \
+    am__dry=no; \
+    case $$MAKEFLAGS in \
+      *\\[\ \  ]*) \
+        echo 'am--echo: ; @echo "AM"  OK' | $(MAKE) -f - 2>/dev/null \
+          | grep '^AM OK$$' >/dev/null || am__dry=yes;; \
+      *) \
+        for am__flg in $$MAKEFLAGS; do \
+          case $$am__flg in \
+            *=*|--*) ;; \
+            *n*) am__dry=yes; break;; \
+          esac; \
+        done;; \
+    esac; \
+    test $$am__dry = yes; \
+  }
+pkgdatadir = $(datadir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkglibexecdir = $(libexecdir)/@PACKAGE@
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+@BUILD_CAIRO_OUTPUT_TRUE@@USE_CMS_TRUE@am__append_1 = $(LCMS_CFLAGS)
+@BUILD_CAIRO_OUTPUT_TRUE@@USE_CMS_TRUE@am__append_2 = $(LCMS_LIBS)
+bin_PROGRAMS = pdfdetach$(EXEEXT) pdffonts$(EXEEXT) pdfimages$(EXEEXT) \
+       pdfinfo$(EXEEXT) pdftops$(EXEEXT) pdftotext$(EXEEXT) \
+       pdftohtml$(EXEEXT) pdfseparate$(EXEEXT) pdfunite$(EXEEXT) \
+       $(am__EXEEXT_1) $(am__EXEEXT_2)
+@BUILD_LIBPNG_TRUE@am__append_3 = $(LIBPNG_CFLAGS)
+subdir = utils
+DIST_COMMON = $(dist_man1_MANS) $(srcdir)/Makefile.am \
+       $(srcdir)/Makefile.in
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/m4/acx_pthread.m4 \
+       $(top_srcdir)/m4/define-dir.m4 $(top_srcdir)/m4/gtk-doc.m4 \
+       $(top_srcdir)/m4/iconv.m4 $(top_srcdir)/m4/introspection.m4 \
+       $(top_srcdir)/m4/libjpeg.m4 $(top_srcdir)/m4/libtool.m4 \
+       $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \
+       $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \
+       $(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+       $(ACLOCAL_M4)
+mkinstalldirs = $(install_sh) -d
+CONFIG_HEADER = $(top_builddir)/config.h \
+       $(top_builddir)/poppler/poppler-config.h
+CONFIG_CLEAN_FILES =
+CONFIG_CLEAN_VPATH_FILES =
+@BUILD_SPLASH_OUTPUT_TRUE@am__EXEEXT_1 = pdftoppm$(EXEEXT)
+@BUILD_CAIRO_OUTPUT_TRUE@am__EXEEXT_2 = pdftocairo$(EXEEXT)
+am__installdirs = "$(DESTDIR)$(bindir)" "$(DESTDIR)$(man1dir)"
+PROGRAMS = $(bin_PROGRAMS)
+am__objects_1 = parseargs.$(OBJEXT)
+am_pdfdetach_OBJECTS = pdfdetach.$(OBJEXT) $(am__objects_1)
+pdfdetach_OBJECTS = $(am_pdfdetach_OBJECTS)
+pdfdetach_LDADD = $(LDADD)
+am__DEPENDENCIES_1 =
+pdfdetach_DEPENDENCIES = $(top_builddir)/poppler/libpoppler.la \
+       $(am__DEPENDENCIES_1)
+AM_V_lt = $(am__v_lt_@AM_V@)
+am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@)
+am__v_lt_0 = --silent
+am_pdffonts_OBJECTS = pdffonts.$(OBJEXT) $(am__objects_1)
+pdffonts_OBJECTS = $(am_pdffonts_OBJECTS)
+pdffonts_LDADD = $(LDADD)
+pdffonts_DEPENDENCIES = $(top_builddir)/poppler/libpoppler.la \
+       $(am__DEPENDENCIES_1)
+am_pdfimages_OBJECTS = pdfimages.$(OBJEXT) ImageOutputDev.$(OBJEXT) \
+       $(am__objects_1)
+pdfimages_OBJECTS = $(am_pdfimages_OBJECTS)
+pdfimages_LDADD = $(LDADD)
+pdfimages_DEPENDENCIES = $(top_builddir)/poppler/libpoppler.la \
+       $(am__DEPENDENCIES_1)
+am_pdfinfo_OBJECTS = pdfinfo.$(OBJEXT) printencodings.$(OBJEXT) \
+       $(am__objects_1)
+pdfinfo_OBJECTS = $(am_pdfinfo_OBJECTS)
+pdfinfo_LDADD = $(LDADD)
+pdfinfo_DEPENDENCIES = $(top_builddir)/poppler/libpoppler.la \
+       $(am__DEPENDENCIES_1)
+am_pdfseparate_OBJECTS = pdfseparate.$(OBJEXT) $(am__objects_1)
+pdfseparate_OBJECTS = $(am_pdfseparate_OBJECTS)
+pdfseparate_LDADD = $(LDADD)
+pdfseparate_DEPENDENCIES = $(top_builddir)/poppler/libpoppler.la \
+       $(am__DEPENDENCIES_1)
+am__pdftocairo_SOURCES_DIST = pdftocairo.cc parseargs.cc parseargs.h
+@BUILD_CAIRO_OUTPUT_TRUE@am_pdftocairo_OBJECTS = pdftocairo.$(OBJEXT) \
+@BUILD_CAIRO_OUTPUT_TRUE@      $(am__objects_1)
+pdftocairo_OBJECTS = $(am_pdftocairo_OBJECTS)
+am__DEPENDENCIES_2 = $(top_builddir)/poppler/libpoppler.la \
+       $(am__DEPENDENCIES_1)
+@BUILD_CAIRO_OUTPUT_TRUE@@USE_CMS_TRUE@am__DEPENDENCIES_3 =  \
+@BUILD_CAIRO_OUTPUT_TRUE@@USE_CMS_TRUE@        $(am__DEPENDENCIES_1)
+am__DEPENDENCIES_4 = $(am__DEPENDENCIES_3)
+@BUILD_CAIRO_OUTPUT_TRUE@pdftocairo_DEPENDENCIES = $(top_builddir)/poppler/libpoppler-cairo.la \
+@BUILD_CAIRO_OUTPUT_TRUE@      $(am__DEPENDENCIES_2) \
+@BUILD_CAIRO_OUTPUT_TRUE@      $(am__DEPENDENCIES_4)
+am__objects_2 = pdftohtml-parseargs.$(OBJEXT)
+am_pdftohtml_OBJECTS = pdftohtml-pdftohtml.$(OBJEXT) \
+       pdftohtml-HtmlFonts.$(OBJEXT) pdftohtml-HtmlLinks.$(OBJEXT) \
+       pdftohtml-HtmlOutputDev.$(OBJEXT) $(am__objects_2)
+pdftohtml_OBJECTS = $(am_pdftohtml_OBJECTS)
+pdftohtml_LDADD = $(LDADD)
+pdftohtml_DEPENDENCIES = $(top_builddir)/poppler/libpoppler.la \
+       $(am__DEPENDENCIES_1)
+pdftohtml_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \
+       $(LIBTOOLFLAGS) --mode=link $(CXXLD) $(pdftohtml_CXXFLAGS) \
+       $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
+am__pdftoppm_SOURCES_DIST = pdftoppm.cc parseargs.cc parseargs.h
+@BUILD_SPLASH_OUTPUT_TRUE@am_pdftoppm_OBJECTS = pdftoppm.$(OBJEXT) \
+@BUILD_SPLASH_OUTPUT_TRUE@     $(am__objects_1)
+pdftoppm_OBJECTS = $(am_pdftoppm_OBJECTS)
+pdftoppm_LDADD = $(LDADD)
+pdftoppm_DEPENDENCIES = $(top_builddir)/poppler/libpoppler.la \
+       $(am__DEPENDENCIES_1)
+am_pdftops_OBJECTS = pdftops.$(OBJEXT) $(am__objects_1)
+pdftops_OBJECTS = $(am_pdftops_OBJECTS)
+pdftops_LDADD = $(LDADD)
+pdftops_DEPENDENCIES = $(top_builddir)/poppler/libpoppler.la \
+       $(am__DEPENDENCIES_1)
+am_pdftotext_OBJECTS = pdftotext.$(OBJEXT) printencodings.$(OBJEXT) \
+       $(am__objects_1)
+pdftotext_OBJECTS = $(am_pdftotext_OBJECTS)
+pdftotext_LDADD = $(LDADD)
+pdftotext_DEPENDENCIES = $(top_builddir)/poppler/libpoppler.la \
+       $(am__DEPENDENCIES_1)
+am_pdfunite_OBJECTS = pdfunite.$(OBJEXT) $(am__objects_1)
+pdfunite_OBJECTS = $(am_pdfunite_OBJECTS)
+pdfunite_LDADD = $(LDADD)
+pdfunite_DEPENDENCIES = $(top_builddir)/poppler/libpoppler.la \
+       $(am__DEPENDENCIES_1)
+DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) -I$(top_builddir)/poppler
+depcomp = $(SHELL) $(top_srcdir)/depcomp
+am__depfiles_maybe = depfiles
+am__mv = mv -f
+CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
+       $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)
+LTCXXCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \
+       $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) \
+       $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
+       $(AM_CXXFLAGS) $(CXXFLAGS)
+AM_V_CXX = $(am__v_CXX_@AM_V@)
+am__v_CXX_ = $(am__v_CXX_@AM_DEFAULT_V@)
+am__v_CXX_0 = @echo "  CXX   " $@;
+AM_V_at = $(am__v_at_@AM_V@)
+am__v_at_ = $(am__v_at_@AM_DEFAULT_V@)
+am__v_at_0 = @
+CXXLD = $(CXX)
+CXXLINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \
+       $(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \
+       $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
+AM_V_CXXLD = $(am__v_CXXLD_@AM_V@)
+am__v_CXXLD_ = $(am__v_CXXLD_@AM_DEFAULT_V@)
+am__v_CXXLD_0 = @echo "  CXXLD " $@;
+COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
+       $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
+LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
+       $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \
+       $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
+       $(AM_CFLAGS) $(CFLAGS)
+AM_V_CC = $(am__v_CC_@AM_V@)
+am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@)
+am__v_CC_0 = @echo "  CC    " $@;
+CCLD = $(CC)
+LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
+       $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
+       $(AM_LDFLAGS) $(LDFLAGS) -o $@
+AM_V_CCLD = $(am__v_CCLD_@AM_V@)
+am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@)
+am__v_CCLD_0 = @echo "  CCLD  " $@;
+AM_V_GEN = $(am__v_GEN_@AM_V@)
+am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@)
+am__v_GEN_0 = @echo "  GEN   " $@;
+SOURCES = $(pdfdetach_SOURCES) $(pdffonts_SOURCES) \
+       $(pdfimages_SOURCES) $(pdfinfo_SOURCES) $(pdfseparate_SOURCES) \
+       $(pdftocairo_SOURCES) $(pdftohtml_SOURCES) $(pdftoppm_SOURCES) \
+       $(pdftops_SOURCES) $(pdftotext_SOURCES) $(pdfunite_SOURCES)
+DIST_SOURCES = $(pdfdetach_SOURCES) $(pdffonts_SOURCES) \
+       $(pdfimages_SOURCES) $(pdfinfo_SOURCES) $(pdfseparate_SOURCES) \
+       $(am__pdftocairo_SOURCES_DIST) $(pdftohtml_SOURCES) \
+       $(am__pdftoppm_SOURCES_DIST) $(pdftops_SOURCES) \
+       $(pdftotext_SOURCES) $(pdfunite_SOURCES)
+am__can_run_installinfo = \
+  case $$AM_UPDATE_INFO_DIR in \
+    n|no|NO) false;; \
+    *) (install-info --version) >/dev/null 2>&1;; \
+  esac
+am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
+am__vpath_adj = case $$p in \
+    $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
+    *) f=$$p;; \
+  esac;
+am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`;
+am__install_max = 40
+am__nobase_strip_setup = \
+  srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'`
+am__nobase_strip = \
+  for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||"
+am__nobase_list = $(am__nobase_strip_setup); \
+  for p in $$list; do echo "$$p $$p"; done | \
+  sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \
+  $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \
+    if (++n[$$2] == $(am__install_max)) \
+      { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \
+    END { for (dir in files) print dir, files[dir] }'
+am__base_list = \
+  sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
+  sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
+am__uninstall_files_from_dir = { \
+  test -z "$$files" \
+    || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \
+    || { echo " ( cd '$$dir' && rm -f" $$files ")"; \
+         $(am__cd) "$$dir" && rm -f $$files; }; \
+  }
+man1dir = $(mandir)/man1
+NROFF = nroff
+MANS = $(dist_man1_MANS)
+ETAGS = etags
+CTAGS = ctags
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AR = @AR@
+AS = @AS@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CAIRO_CFLAGS = @CAIRO_CFLAGS@
+CAIRO_FEATURE = @CAIRO_FEATURE@
+CAIRO_LIBS = @CAIRO_LIBS@
+CAIRO_REQ = @CAIRO_REQ@
+CAIRO_VERSION = @CAIRO_VERSION@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CXX = @CXX@
+CXXCPP = @CXXCPP@
+CXXDEPMODE = @CXXDEPMODE@
+CXXFLAGS = @CXXFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DLLTOOL = @DLLTOOL@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+FGREP = @FGREP@
+FONTCONFIG_CFLAGS = @FONTCONFIG_CFLAGS@
+FONTCONFIG_LIBS = @FONTCONFIG_LIBS@
+FREETYPE_CFLAGS = @FREETYPE_CFLAGS@
+FREETYPE_CONFIG = @FREETYPE_CONFIG@
+FREETYPE_LIBS = @FREETYPE_LIBS@
+GLIB_MKENUMS = @GLIB_MKENUMS@
+GLIB_REQ = @GLIB_REQ@
+GLIB_REQUIRED = @GLIB_REQUIRED@
+GREP = @GREP@
+GTKDOC_CHECK = @GTKDOC_CHECK@
+GTKDOC_DEPS_CFLAGS = @GTKDOC_DEPS_CFLAGS@
+GTKDOC_DEPS_LIBS = @GTKDOC_DEPS_LIBS@
+GTKDOC_MKPDF = @GTKDOC_MKPDF@
+GTKDOC_REBASE = @GTKDOC_REBASE@
+GTK_TEST_CFLAGS = @GTK_TEST_CFLAGS@
+GTK_TEST_LIBS = @GTK_TEST_LIBS@
+HTML_DIR = @HTML_DIR@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+INTROSPECTION_CFLAGS = @INTROSPECTION_CFLAGS@
+INTROSPECTION_COMPILER = @INTROSPECTION_COMPILER@
+INTROSPECTION_GENERATE = @INTROSPECTION_GENERATE@
+INTROSPECTION_GIRDIR = @INTROSPECTION_GIRDIR@
+INTROSPECTION_LIBS = @INTROSPECTION_LIBS@
+INTROSPECTION_MAKEFILE = @INTROSPECTION_MAKEFILE@
+INTROSPECTION_SCANNER = @INTROSPECTION_SCANNER@
+INTROSPECTION_TYPELIBDIR = @INTROSPECTION_TYPELIBDIR@
+LCMS_CFLAGS = @LCMS_CFLAGS@
+LCMS_LIBS = @LCMS_LIBS@
+LD = @LD@
+LDFLAGS = @LDFLAGS@
+LIBCURL_CFLAGS = @LIBCURL_CFLAGS@
+LIBCURL_LIBS = @LIBCURL_LIBS@
+LIBICONV = @LIBICONV@
+LIBJPEG_CFLAGS = @LIBJPEG_CFLAGS@
+LIBJPEG_LIBS = @LIBJPEG_LIBS@
+LIBOBJS = @LIBOBJS@
+LIBOPENJPEG_CFLAGS = @LIBOPENJPEG_CFLAGS@
+LIBOPENJPEG_LIBS = @LIBOPENJPEG_LIBS@
+LIBPNG_CFLAGS = @LIBPNG_CFLAGS@
+LIBPNG_LIBS = @LIBPNG_LIBS@
+LIBS = @LIBS@
+LIBTIFF_CFLAGS = @LIBTIFF_CFLAGS@
+LIBTIFF_CFLAGSS = @LIBTIFF_CFLAGSS@
+LIBTIFF_LIBS = @LIBTIFF_LIBS@
+LIBTOOL = @LIBTOOL@
+LIPO = @LIPO@
+LN_S = @LN_S@
+LTLIBICONV = @LTLIBICONV@
+LTLIBOBJS = @LTLIBOBJS@
+MAKEINFO = @MAKEINFO@
+MANIFEST_TOOL = @MANIFEST_TOOL@
+MKDIR_P = @MKDIR_P@
+MOCQT4 = @MOCQT4@
+NM = @NM@
+NMEDIT = @NMEDIT@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+OTOOL = @OTOOL@
+OTOOL64 = @OTOOL64@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_URL = @PACKAGE_URL@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PC_REQUIRES = @PC_REQUIRES@
+PC_REQUIRES_PRIVATE = @PC_REQUIRES_PRIVATE@
+PDFTOCAIRO_CFLAGS = @PDFTOCAIRO_CFLAGS@ $(am__append_1)
+PDFTOCAIRO_LIBS = @PDFTOCAIRO_LIBS@ $(am__append_2)
+PKG_CONFIG = @PKG_CONFIG@
+PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@
+PKG_CONFIG_PATH = @PKG_CONFIG_PATH@
+POPPLER_DATADIR = @POPPLER_DATADIR@
+POPPLER_GLIB_CFLAGS = @POPPLER_GLIB_CFLAGS@
+POPPLER_GLIB_DISABLE_DEPRECATED = @POPPLER_GLIB_DISABLE_DEPRECATED@
+POPPLER_GLIB_DISABLE_SINGLE_INCLUDES = @POPPLER_GLIB_DISABLE_SINGLE_INCLUDES@
+POPPLER_GLIB_LIBS = @POPPLER_GLIB_LIBS@
+POPPLER_MAJOR_VERSION = @POPPLER_MAJOR_VERSION@
+POPPLER_MICRO_VERSION = @POPPLER_MICRO_VERSION@
+POPPLER_MINOR_VERSION = @POPPLER_MINOR_VERSION@
+POPPLER_QT4_CFLAGS = @POPPLER_QT4_CFLAGS@
+POPPLER_QT4_CXXFLAGS = @POPPLER_QT4_CXXFLAGS@
+POPPLER_QT4_LIBS = @POPPLER_QT4_LIBS@
+POPPLER_QT4_TEST_CFLAGS = @POPPLER_QT4_TEST_CFLAGS@
+POPPLER_QT4_TEST_LIBS = @POPPLER_QT4_TEST_LIBS@
+POPPLER_VERSION = @POPPLER_VERSION@
+PTHREAD_CC = @PTHREAD_CC@
+PTHREAD_CFLAGS = @PTHREAD_CFLAGS@
+PTHREAD_LIBS = @PTHREAD_LIBS@
+RANLIB = @RANLIB@
+SED = @SED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+TESTDATADIR = @TESTDATADIR@
+VERSION = @VERSION@
+XMKMF = @XMKMF@
+X_CFLAGS = @X_CFLAGS@
+X_EXTRA_LIBS = @X_EXTRA_LIBS@
+X_LIBS = @X_LIBS@
+X_PRE_LIBS = @X_PRE_LIBS@
+ZLIB_LIBS = @ZLIB_LIBS@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
+ac_ct_AR = @ac_ct_AR@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_CXX = @ac_ct_CXX@
+ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
+acx_pthread_config = @acx_pthread_config@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+auto_import_flags = @auto_import_flags@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+builddir = @builddir@
+create_shared_lib = @create_shared_lib@
+datadir = @datadir@
+datarootdir = @datarootdir@
+docdir = @docdir@
+dvidir = @dvidir@
+exec_prefix = @exec_prefix@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+htmldir = @htmldir@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localedir = @localedir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+srcdir = @srcdir@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+top_build_prefix = @top_build_prefix@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+win32_libs = @win32_libs@
+@BUILD_SPLASH_OUTPUT_TRUE@pdftoppm_SOURCES = \
+@BUILD_SPLASH_OUTPUT_TRUE@     pdftoppm.cc                             \
+@BUILD_SPLASH_OUTPUT_TRUE@     $(common)
+
+@BUILD_SPLASH_OUTPUT_TRUE@pdftoppm_binary = pdftoppm
+@BUILD_SPLASH_OUTPUT_TRUE@pdftoppm_manpage = pdftoppm.1
+INCLUDES = \
+       -I$(top_srcdir)                         \
+       -I$(top_srcdir)/goo                     \
+       -I$(top_srcdir)/utils                   \
+       -I$(top_srcdir)/poppler                 \
+       $(UTILS_CFLAGS)                         \
+       $(FONTCONFIG_CFLAGS)                    \
+       $(PDFTOCAIRO_CFLAGS)
+
+LDADD = \
+       $(top_builddir)/poppler/libpoppler.la   \
+       $(UTILS_LIBS)                           \
+       $(FONTCONFIG_LIBS)
+
+@BUILD_CAIRO_OUTPUT_TRUE@pdftocairo_SOURCES = \
+@BUILD_CAIRO_OUTPUT_TRUE@      pdftocairo.cc                           \
+@BUILD_CAIRO_OUTPUT_TRUE@      $(common)
+
+@BUILD_CAIRO_OUTPUT_TRUE@pdftocairo_LDADD = \
+@BUILD_CAIRO_OUTPUT_TRUE@      $(top_builddir)/poppler/libpoppler-cairo.la \
+@BUILD_CAIRO_OUTPUT_TRUE@      $(LDADD) $(PDFTOCAIRO_LIBS)
+
+@BUILD_CAIRO_OUTPUT_TRUE@pdftocairo_binary = pdftocairo
+@BUILD_CAIRO_OUTPUT_TRUE@pdftocairo_manpage = pdftocairo.1
+AM_LDFLAGS = @auto_import_flags@
+dist_man1_MANS = \
+       pdfdetach.1                             \
+       pdffonts.1                              \
+       pdfimages.1                             \
+       pdfinfo.1                               \
+       pdftops.1                               \
+       pdftotext.1                             \
+       pdftohtml.1                             \
+       pdfseparate.1                           \
+       pdfunite.1                              \
+       $(pdftoppm_manpage)                     \
+       $(pdftocairo_manpage)
+
+common = parseargs.cc parseargs.h
+pdfdetach_SOURCES = \
+       pdfdetach.cc                            \
+       $(common)
+
+pdffonts_SOURCES = \
+       pdffonts.cc                             \
+       $(common)
+
+pdfimages_SOURCES = \
+       pdfimages.cc                            \
+       ImageOutputDev.cc                       \
+       ImageOutputDev.h                        \
+       $(common)
+
+pdfinfo_SOURCES = \
+       pdfinfo.cc                              \
+       printencodings.cc                       \
+       printencodings.h                        \
+       $(common)
+
+pdftops_SOURCES = \
+       pdftops.cc                              \
+       $(common)
+
+pdftotext_SOURCES = \
+       pdftotext.cc                            \
+       printencodings.cc                       \
+       printencodings.h                        \
+       $(common)
+
+pdftohtml_SOURCES = \
+       pdftohtml.cc                            \
+       HtmlFonts.cc                            \
+       HtmlFonts.h                             \
+       HtmlLinks.cc                            \
+       HtmlLinks.h                             \
+       HtmlOutputDev.cc                        \
+       HtmlOutputDev.h                         \
+       HtmlUtils.h                             \
+       $(common)
+
+
+# HtmlOutputDev uses goo/PNGWriter.h that may depend on libpng header
+pdftohtml_CXXFLAGS = $(AM_CXXFLAGS) $(am__append_3)
+pdfseparate_SOURCES = \
+       pdfseparate.cc                          \
+       $(common)
+
+pdfunite_SOURCES = \
+       pdfunite.cc                             \
+       $(common)
+
+
+# Yay, automake!  It should be able to figure out that it has to dist
+# pdftoppm.1, but nooo.  So we just add it here.
+EXTRA_DIST = pdf2xml.dtd pdftoppm.1
+all: all-am
+
+.SUFFIXES:
+.SUFFIXES: .cc .lo .o .obj
+$(srcdir)/Makefile.in:  $(srcdir)/Makefile.am  $(am__configure_deps)
+       @for dep in $?; do \
+         case '$(am__configure_deps)' in \
+           *$$dep*) \
+             ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
+               && { if test -f $@; then exit 0; else break; fi; }; \
+             exit 1;; \
+         esac; \
+       done; \
+       echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign utils/Makefile'; \
+       $(am__cd) $(top_srcdir) && \
+         $(AUTOMAKE) --foreign utils/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+       @case '$?' in \
+         *config.status*) \
+           cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+         *) \
+           echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+           cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+       esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+       cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure:  $(am__configure_deps)
+       cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4):  $(am__aclocal_m4_deps)
+       cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(am__aclocal_m4_deps):
+install-binPROGRAMS: $(bin_PROGRAMS)
+       @$(NORMAL_INSTALL)
+       @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \
+       if test -n "$$list"; then \
+         echo " $(MKDIR_P) '$(DESTDIR)$(bindir)'"; \
+         $(MKDIR_P) "$(DESTDIR)$(bindir)" || exit 1; \
+       fi; \
+       for p in $$list; do echo "$$p $$p"; done | \
+       sed 's/$(EXEEXT)$$//' | \
+       while read p p1; do if test -f $$p || test -f $$p1; \
+         then echo "$$p"; echo "$$p"; else :; fi; \
+       done | \
+       sed -e 'p;s,.*/,,;n;h' -e 's|.*|.|' \
+           -e 'p;x;s,.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/' | \
+       sed 'N;N;N;s,\n, ,g' | \
+       $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1 } \
+         { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \
+           if ($$2 == $$4) files[d] = files[d] " " $$1; \
+           else { print "f", $$3 "/" $$4, $$1; } } \
+         END { for (d in files) print "f", d, files[d] }' | \
+       while read type dir files; do \
+           if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \
+           test -z "$$files" || { \
+           echo " $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files '$(DESTDIR)$(bindir)$$dir'"; \
+           $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files "$(DESTDIR)$(bindir)$$dir" || exit $$?; \
+           } \
+       ; done
+
+uninstall-binPROGRAMS:
+       @$(NORMAL_UNINSTALL)
+       @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \
+       files=`for p in $$list; do echo "$$p"; done | \
+         sed -e 'h;s,^.*/,,;s/$(EXEEXT)$$//;$(transform)' \
+             -e 's/$$/$(EXEEXT)/' `; \
+       test -n "$$list" || exit 0; \
+       echo " ( cd '$(DESTDIR)$(bindir)' && rm -f" $$files ")"; \
+       cd "$(DESTDIR)$(bindir)" && rm -f $$files
+
+clean-binPROGRAMS:
+       @list='$(bin_PROGRAMS)'; test -n "$$list" || exit 0; \
+       echo " rm -f" $$list; \
+       rm -f $$list || exit $$?; \
+       test -n "$(EXEEXT)" || exit 0; \
+       list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \
+       echo " rm -f" $$list; \
+       rm -f $$list
+pdfdetach$(EXEEXT): $(pdfdetach_OBJECTS) $(pdfdetach_DEPENDENCIES) $(EXTRA_pdfdetach_DEPENDENCIES) 
+       @rm -f pdfdetach$(EXEEXT)
+       $(AM_V_CXXLD)$(CXXLINK) $(pdfdetach_OBJECTS) $(pdfdetach_LDADD) $(LIBS)
+pdffonts$(EXEEXT): $(pdffonts_OBJECTS) $(pdffonts_DEPENDENCIES) $(EXTRA_pdffonts_DEPENDENCIES) 
+       @rm -f pdffonts$(EXEEXT)
+       $(AM_V_CXXLD)$(CXXLINK) $(pdffonts_OBJECTS) $(pdffonts_LDADD) $(LIBS)
+pdfimages$(EXEEXT): $(pdfimages_OBJECTS) $(pdfimages_DEPENDENCIES) $(EXTRA_pdfimages_DEPENDENCIES) 
+       @rm -f pdfimages$(EXEEXT)
+       $(AM_V_CXXLD)$(CXXLINK) $(pdfimages_OBJECTS) $(pdfimages_LDADD) $(LIBS)
+pdfinfo$(EXEEXT): $(pdfinfo_OBJECTS) $(pdfinfo_DEPENDENCIES) $(EXTRA_pdfinfo_DEPENDENCIES) 
+       @rm -f pdfinfo$(EXEEXT)
+       $(AM_V_CXXLD)$(CXXLINK) $(pdfinfo_OBJECTS) $(pdfinfo_LDADD) $(LIBS)
+pdfseparate$(EXEEXT): $(pdfseparate_OBJECTS) $(pdfseparate_DEPENDENCIES) $(EXTRA_pdfseparate_DEPENDENCIES) 
+       @rm -f pdfseparate$(EXEEXT)
+       $(AM_V_CXXLD)$(CXXLINK) $(pdfseparate_OBJECTS) $(pdfseparate_LDADD) $(LIBS)
+pdftocairo$(EXEEXT): $(pdftocairo_OBJECTS) $(pdftocairo_DEPENDENCIES) $(EXTRA_pdftocairo_DEPENDENCIES) 
+       @rm -f pdftocairo$(EXEEXT)
+       $(AM_V_CXXLD)$(CXXLINK) $(pdftocairo_OBJECTS) $(pdftocairo_LDADD) $(LIBS)
+pdftohtml$(EXEEXT): $(pdftohtml_OBJECTS) $(pdftohtml_DEPENDENCIES) $(EXTRA_pdftohtml_DEPENDENCIES) 
+       @rm -f pdftohtml$(EXEEXT)
+       $(AM_V_CXXLD)$(pdftohtml_LINK) $(pdftohtml_OBJECTS) $(pdftohtml_LDADD) $(LIBS)
+pdftoppm$(EXEEXT): $(pdftoppm_OBJECTS) $(pdftoppm_DEPENDENCIES) $(EXTRA_pdftoppm_DEPENDENCIES) 
+       @rm -f pdftoppm$(EXEEXT)
+       $(AM_V_CXXLD)$(CXXLINK) $(pdftoppm_OBJECTS) $(pdftoppm_LDADD) $(LIBS)
+pdftops$(EXEEXT): $(pdftops_OBJECTS) $(pdftops_DEPENDENCIES) $(EXTRA_pdftops_DEPENDENCIES) 
+       @rm -f pdftops$(EXEEXT)
+       $(AM_V_CXXLD)$(CXXLINK) $(pdftops_OBJECTS) $(pdftops_LDADD) $(LIBS)
+pdftotext$(EXEEXT): $(pdftotext_OBJECTS) $(pdftotext_DEPENDENCIES) $(EXTRA_pdftotext_DEPENDENCIES) 
+       @rm -f pdftotext$(EXEEXT)
+       $(AM_V_CXXLD)$(CXXLINK) $(pdftotext_OBJECTS) $(pdftotext_LDADD) $(LIBS)
+pdfunite$(EXEEXT): $(pdfunite_OBJECTS) $(pdfunite_DEPENDENCIES) $(EXTRA_pdfunite_DEPENDENCIES) 
+       @rm -f pdfunite$(EXEEXT)
+       $(AM_V_CXXLD)$(CXXLINK) $(pdfunite_OBJECTS) $(pdfunite_LDADD) $(LIBS)
+
+mostlyclean-compile:
+       -rm -f *.$(OBJEXT)
+
+distclean-compile:
+       -rm -f *.tab.c
+
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ImageOutputDev.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/parseargs.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pdfdetach.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pdffonts.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pdfimages.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pdfinfo.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pdfseparate.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pdftocairo.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pdftohtml-HtmlFonts.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pdftohtml-HtmlLinks.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pdftohtml-HtmlOutputDev.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pdftohtml-parseargs.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pdftohtml-pdftohtml.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pdftoppm.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pdftops.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pdftotext.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pdfunite.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/printencodings.Po@am__quote@
+
+.cc.o:
+@am__fastdepCXX_TRUE@  $(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
+@am__fastdepCXX_TRUE@  $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ $<
+
+.cc.obj:
+@am__fastdepCXX_TRUE@  $(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'`
+@am__fastdepCXX_TRUE@  $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
+
+.cc.lo:
+@am__fastdepCXX_TRUE@  $(AM_V_CXX)$(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
+@am__fastdepCXX_TRUE@  $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     $(AM_V_CXX)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LTCXXCOMPILE) -c -o $@ $<
+
+pdftohtml-pdftohtml.o: pdftohtml.cc
+@am__fastdepCXX_TRUE@  $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pdftohtml_CXXFLAGS) $(CXXFLAGS) -MT pdftohtml-pdftohtml.o -MD -MP -MF $(DEPDIR)/pdftohtml-pdftohtml.Tpo -c -o pdftohtml-pdftohtml.o `test -f 'pdftohtml.cc' || echo '$(srcdir)/'`pdftohtml.cc
+@am__fastdepCXX_TRUE@  $(AM_V_at)$(am__mv) $(DEPDIR)/pdftohtml-pdftohtml.Tpo $(DEPDIR)/pdftohtml-pdftohtml.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     $(AM_V_CXX)source='pdftohtml.cc' object='pdftohtml-pdftohtml.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pdftohtml_CXXFLAGS) $(CXXFLAGS) -c -o pdftohtml-pdftohtml.o `test -f 'pdftohtml.cc' || echo '$(srcdir)/'`pdftohtml.cc
+
+pdftohtml-pdftohtml.obj: pdftohtml.cc
+@am__fastdepCXX_TRUE@  $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pdftohtml_CXXFLAGS) $(CXXFLAGS) -MT pdftohtml-pdftohtml.obj -MD -MP -MF $(DEPDIR)/pdftohtml-pdftohtml.Tpo -c -o pdftohtml-pdftohtml.obj `if test -f 'pdftohtml.cc'; then $(CYGPATH_W) 'pdftohtml.cc'; else $(CYGPATH_W) '$(srcdir)/pdftohtml.cc'; fi`
+@am__fastdepCXX_TRUE@  $(AM_V_at)$(am__mv) $(DEPDIR)/pdftohtml-pdftohtml.Tpo $(DEPDIR)/pdftohtml-pdftohtml.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     $(AM_V_CXX)source='pdftohtml.cc' object='pdftohtml-pdftohtml.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pdftohtml_CXXFLAGS) $(CXXFLAGS) -c -o pdftohtml-pdftohtml.obj `if test -f 'pdftohtml.cc'; then $(CYGPATH_W) 'pdftohtml.cc'; else $(CYGPATH_W) '$(srcdir)/pdftohtml.cc'; fi`
+
+pdftohtml-HtmlFonts.o: HtmlFonts.cc
+@am__fastdepCXX_TRUE@  $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pdftohtml_CXXFLAGS) $(CXXFLAGS) -MT pdftohtml-HtmlFonts.o -MD -MP -MF $(DEPDIR)/pdftohtml-HtmlFonts.Tpo -c -o pdftohtml-HtmlFonts.o `test -f 'HtmlFonts.cc' || echo '$(srcdir)/'`HtmlFonts.cc
+@am__fastdepCXX_TRUE@  $(AM_V_at)$(am__mv) $(DEPDIR)/pdftohtml-HtmlFonts.Tpo $(DEPDIR)/pdftohtml-HtmlFonts.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     $(AM_V_CXX)source='HtmlFonts.cc' object='pdftohtml-HtmlFonts.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pdftohtml_CXXFLAGS) $(CXXFLAGS) -c -o pdftohtml-HtmlFonts.o `test -f 'HtmlFonts.cc' || echo '$(srcdir)/'`HtmlFonts.cc
+
+pdftohtml-HtmlFonts.obj: HtmlFonts.cc
+@am__fastdepCXX_TRUE@  $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pdftohtml_CXXFLAGS) $(CXXFLAGS) -MT pdftohtml-HtmlFonts.obj -MD -MP -MF $(DEPDIR)/pdftohtml-HtmlFonts.Tpo -c -o pdftohtml-HtmlFonts.obj `if test -f 'HtmlFonts.cc'; then $(CYGPATH_W) 'HtmlFonts.cc'; else $(CYGPATH_W) '$(srcdir)/HtmlFonts.cc'; fi`
+@am__fastdepCXX_TRUE@  $(AM_V_at)$(am__mv) $(DEPDIR)/pdftohtml-HtmlFonts.Tpo $(DEPDIR)/pdftohtml-HtmlFonts.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     $(AM_V_CXX)source='HtmlFonts.cc' object='pdftohtml-HtmlFonts.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pdftohtml_CXXFLAGS) $(CXXFLAGS) -c -o pdftohtml-HtmlFonts.obj `if test -f 'HtmlFonts.cc'; then $(CYGPATH_W) 'HtmlFonts.cc'; else $(CYGPATH_W) '$(srcdir)/HtmlFonts.cc'; fi`
+
+pdftohtml-HtmlLinks.o: HtmlLinks.cc
+@am__fastdepCXX_TRUE@  $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pdftohtml_CXXFLAGS) $(CXXFLAGS) -MT pdftohtml-HtmlLinks.o -MD -MP -MF $(DEPDIR)/pdftohtml-HtmlLinks.Tpo -c -o pdftohtml-HtmlLinks.o `test -f 'HtmlLinks.cc' || echo '$(srcdir)/'`HtmlLinks.cc
+@am__fastdepCXX_TRUE@  $(AM_V_at)$(am__mv) $(DEPDIR)/pdftohtml-HtmlLinks.Tpo $(DEPDIR)/pdftohtml-HtmlLinks.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     $(AM_V_CXX)source='HtmlLinks.cc' object='pdftohtml-HtmlLinks.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pdftohtml_CXXFLAGS) $(CXXFLAGS) -c -o pdftohtml-HtmlLinks.o `test -f 'HtmlLinks.cc' || echo '$(srcdir)/'`HtmlLinks.cc
+
+pdftohtml-HtmlLinks.obj: HtmlLinks.cc
+@am__fastdepCXX_TRUE@  $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pdftohtml_CXXFLAGS) $(CXXFLAGS) -MT pdftohtml-HtmlLinks.obj -MD -MP -MF $(DEPDIR)/pdftohtml-HtmlLinks.Tpo -c -o pdftohtml-HtmlLinks.obj `if test -f 'HtmlLinks.cc'; then $(CYGPATH_W) 'HtmlLinks.cc'; else $(CYGPATH_W) '$(srcdir)/HtmlLinks.cc'; fi`
+@am__fastdepCXX_TRUE@  $(AM_V_at)$(am__mv) $(DEPDIR)/pdftohtml-HtmlLinks.Tpo $(DEPDIR)/pdftohtml-HtmlLinks.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     $(AM_V_CXX)source='HtmlLinks.cc' object='pdftohtml-HtmlLinks.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pdftohtml_CXXFLAGS) $(CXXFLAGS) -c -o pdftohtml-HtmlLinks.obj `if test -f 'HtmlLinks.cc'; then $(CYGPATH_W) 'HtmlLinks.cc'; else $(CYGPATH_W) '$(srcdir)/HtmlLinks.cc'; fi`
+
+pdftohtml-HtmlOutputDev.o: HtmlOutputDev.cc
+@am__fastdepCXX_TRUE@  $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pdftohtml_CXXFLAGS) $(CXXFLAGS) -MT pdftohtml-HtmlOutputDev.o -MD -MP -MF $(DEPDIR)/pdftohtml-HtmlOutputDev.Tpo -c -o pdftohtml-HtmlOutputDev.o `test -f 'HtmlOutputDev.cc' || echo '$(srcdir)/'`HtmlOutputDev.cc
+@am__fastdepCXX_TRUE@  $(AM_V_at)$(am__mv) $(DEPDIR)/pdftohtml-HtmlOutputDev.Tpo $(DEPDIR)/pdftohtml-HtmlOutputDev.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     $(AM_V_CXX)source='HtmlOutputDev.cc' object='pdftohtml-HtmlOutputDev.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pdftohtml_CXXFLAGS) $(CXXFLAGS) -c -o pdftohtml-HtmlOutputDev.o `test -f 'HtmlOutputDev.cc' || echo '$(srcdir)/'`HtmlOutputDev.cc
+
+pdftohtml-HtmlOutputDev.obj: HtmlOutputDev.cc
+@am__fastdepCXX_TRUE@  $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pdftohtml_CXXFLAGS) $(CXXFLAGS) -MT pdftohtml-HtmlOutputDev.obj -MD -MP -MF $(DEPDIR)/pdftohtml-HtmlOutputDev.Tpo -c -o pdftohtml-HtmlOutputDev.obj `if test -f 'HtmlOutputDev.cc'; then $(CYGPATH_W) 'HtmlOutputDev.cc'; else $(CYGPATH_W) '$(srcdir)/HtmlOutputDev.cc'; fi`
+@am__fastdepCXX_TRUE@  $(AM_V_at)$(am__mv) $(DEPDIR)/pdftohtml-HtmlOutputDev.Tpo $(DEPDIR)/pdftohtml-HtmlOutputDev.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     $(AM_V_CXX)source='HtmlOutputDev.cc' object='pdftohtml-HtmlOutputDev.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pdftohtml_CXXFLAGS) $(CXXFLAGS) -c -o pdftohtml-HtmlOutputDev.obj `if test -f 'HtmlOutputDev.cc'; then $(CYGPATH_W) 'HtmlOutputDev.cc'; else $(CYGPATH_W) '$(srcdir)/HtmlOutputDev.cc'; fi`
+
+pdftohtml-parseargs.o: parseargs.cc
+@am__fastdepCXX_TRUE@  $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pdftohtml_CXXFLAGS) $(CXXFLAGS) -MT pdftohtml-parseargs.o -MD -MP -MF $(DEPDIR)/pdftohtml-parseargs.Tpo -c -o pdftohtml-parseargs.o `test -f 'parseargs.cc' || echo '$(srcdir)/'`parseargs.cc
+@am__fastdepCXX_TRUE@  $(AM_V_at)$(am__mv) $(DEPDIR)/pdftohtml-parseargs.Tpo $(DEPDIR)/pdftohtml-parseargs.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     $(AM_V_CXX)source='parseargs.cc' object='pdftohtml-parseargs.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pdftohtml_CXXFLAGS) $(CXXFLAGS) -c -o pdftohtml-parseargs.o `test -f 'parseargs.cc' || echo '$(srcdir)/'`parseargs.cc
+
+pdftohtml-parseargs.obj: parseargs.cc
+@am__fastdepCXX_TRUE@  $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pdftohtml_CXXFLAGS) $(CXXFLAGS) -MT pdftohtml-parseargs.obj -MD -MP -MF $(DEPDIR)/pdftohtml-parseargs.Tpo -c -o pdftohtml-parseargs.obj `if test -f 'parseargs.cc'; then $(CYGPATH_W) 'parseargs.cc'; else $(CYGPATH_W) '$(srcdir)/parseargs.cc'; fi`
+@am__fastdepCXX_TRUE@  $(AM_V_at)$(am__mv) $(DEPDIR)/pdftohtml-parseargs.Tpo $(DEPDIR)/pdftohtml-parseargs.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     $(AM_V_CXX)source='parseargs.cc' object='pdftohtml-parseargs.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pdftohtml_CXXFLAGS) $(CXXFLAGS) -c -o pdftohtml-parseargs.obj `if test -f 'parseargs.cc'; then $(CYGPATH_W) 'parseargs.cc'; else $(CYGPATH_W) '$(srcdir)/parseargs.cc'; fi`
+
+mostlyclean-libtool:
+       -rm -f *.lo
+
+clean-libtool:
+       -rm -rf .libs _libs
+install-man1: $(dist_man1_MANS)
+       @$(NORMAL_INSTALL)
+       @list1='$(dist_man1_MANS)'; \
+       list2=''; \
+       test -n "$(man1dir)" \
+         && test -n "`echo $$list1$$list2`" \
+         || exit 0; \
+       echo " $(MKDIR_P) '$(DESTDIR)$(man1dir)'"; \
+       $(MKDIR_P) "$(DESTDIR)$(man1dir)" || exit 1; \
+       { for i in $$list1; do echo "$$i"; done;  \
+       if test -n "$$list2"; then \
+         for i in $$list2; do echo "$$i"; done \
+           | sed -n '/\.1[a-z]*$$/p'; \
+       fi; \
+       } | while read p; do \
+         if test -f $$p; then d=; else d="$(srcdir)/"; fi; \
+         echo "$$d$$p"; echo "$$p"; \
+       done | \
+       sed -e 'n;s,.*/,,;p;h;s,.*\.,,;s,^[^1][0-9a-z]*$$,1,;x' \
+             -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,' | \
+       sed 'N;N;s,\n, ,g' | { \
+       list=; while read file base inst; do \
+         if test "$$base" = "$$inst"; then list="$$list $$file"; else \
+           echo " $(INSTALL_DATA) '$$file' '$(DESTDIR)$(man1dir)/$$inst'"; \
+           $(INSTALL_DATA) "$$file" "$(DESTDIR)$(man1dir)/$$inst" || exit $$?; \
+         fi; \
+       done; \
+       for i in $$list; do echo "$$i"; done | $(am__base_list) | \
+       while read files; do \
+         test -z "$$files" || { \
+           echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(man1dir)'"; \
+           $(INSTALL_DATA) $$files "$(DESTDIR)$(man1dir)" || exit $$?; }; \
+       done; }
+
+uninstall-man1:
+       @$(NORMAL_UNINSTALL)
+       @list='$(dist_man1_MANS)'; test -n "$(man1dir)" || exit 0; \
+       files=`{ for i in $$list; do echo "$$i"; done; \
+       } | sed -e 's,.*/,,;h;s,.*\.,,;s,^[^1][0-9a-z]*$$,1,;x' \
+             -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,'`; \
+       dir='$(DESTDIR)$(man1dir)'; $(am__uninstall_files_from_dir)
+
+ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
+       list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+       unique=`for i in $$list; do \
+           if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+         done | \
+         $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
+             END { if (nonempty) { for (i in files) print i; }; }'`; \
+       mkid -fID $$unique
+tags: TAGS
+
+TAGS:  $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
+               $(TAGS_FILES) $(LISP)
+       set x; \
+       here=`pwd`; \
+       list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
+       unique=`for i in $$list; do \
+           if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+         done | \
+         $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
+             END { if (nonempty) { for (i in files) print i; }; }'`; \
+       shift; \
+       if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
+         test -n "$$unique" || unique=$$empty_fix; \
+         if test $$# -gt 0; then \
+           $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+             "$$@" $$unique; \
+         else \
+           $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+             $$unique; \
+         fi; \
+       fi
+ctags: CTAGS
+CTAGS:  $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
+               $(TAGS_FILES) $(LISP)
+       list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
+       unique=`for i in $$list; do \
+           if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+         done | \
+         $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
+             END { if (nonempty) { for (i in files) print i; }; }'`; \
+       test -z "$(CTAGS_ARGS)$$unique" \
+         || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+            $$unique
+
+GTAGS:
+       here=`$(am__cd) $(top_builddir) && pwd` \
+         && $(am__cd) $(top_srcdir) \
+         && gtags -i $(GTAGS_ARGS) "$$here"
+
+distclean-tags:
+       -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+
+distdir: $(DISTFILES)
+       @list='$(MANS)'; if test -n "$$list"; then \
+         list=`for p in $$list; do \
+           if test -f $$p; then d=; else d="$(srcdir)/"; fi; \
+           if test -f "$$d$$p"; then echo "$$d$$p"; else :; fi; done`; \
+         if test -n "$$list" && \
+           grep 'ab help2man is required to generate this page' $$list >/dev/null; then \
+           echo "error: found man pages containing the \`missing help2man' replacement text:" >&2; \
+           grep -l 'ab help2man is required to generate this page' $$list | sed 's/^/         /' >&2; \
+           echo "       to fix them, install help2man, remove and regenerate the man pages;" >&2; \
+           echo "       typically \`make maintainer-clean' will remove them" >&2; \
+           exit 1; \
+         else :; fi; \
+       else :; fi
+       @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+       topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+       list='$(DISTFILES)'; \
+         dist_files=`for file in $$list; do echo $$file; done | \
+         sed -e "s|^$$srcdirstrip/||;t" \
+             -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+       case $$dist_files in \
+         */*) $(MKDIR_P) `echo "$$dist_files" | \
+                          sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+                          sort -u` ;; \
+       esac; \
+       for file in $$dist_files; do \
+         if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+         if test -d $$d/$$file; then \
+           dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+           if test -d "$(distdir)/$$file"; then \
+             find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+           fi; \
+           if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+             cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
+             find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+           fi; \
+           cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
+         else \
+           test -f "$(distdir)/$$file" \
+           || cp -p $$d/$$file "$(distdir)/$$file" \
+           || exit 1; \
+         fi; \
+       done
+check-am: all-am
+check: check-am
+all-am: Makefile $(PROGRAMS) $(MANS)
+installdirs:
+       for dir in "$(DESTDIR)$(bindir)" "$(DESTDIR)$(man1dir)"; do \
+         test -z "$$dir" || $(MKDIR_P) "$$dir"; \
+       done
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+       @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+       if test -z '$(STRIP)'; then \
+         $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+           install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+             install; \
+       else \
+         $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+           install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+           "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
+       fi
+mostlyclean-generic:
+
+clean-generic:
+
+distclean-generic:
+       -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+       -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
+
+maintainer-clean-generic:
+       @echo "This command is intended for maintainers to use"
+       @echo "it deletes files that may require special tools to rebuild."
+clean: clean-am
+
+clean-am: clean-binPROGRAMS clean-generic clean-libtool mostlyclean-am
+
+distclean: distclean-am
+       -rm -rf ./$(DEPDIR)
+       -rm -f Makefile
+distclean-am: clean-am distclean-compile distclean-generic \
+       distclean-tags
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+html-am:
+
+info: info-am
+
+info-am:
+
+install-data-am: install-man
+
+install-dvi: install-dvi-am
+
+install-dvi-am:
+
+install-exec-am: install-binPROGRAMS
+
+install-html: install-html-am
+
+install-html-am:
+
+install-info: install-info-am
+
+install-info-am:
+
+install-man: install-man1
+
+install-pdf: install-pdf-am
+
+install-pdf-am:
+
+install-ps: install-ps-am
+
+install-ps-am:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+       -rm -rf ./$(DEPDIR)
+       -rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-compile mostlyclean-generic \
+       mostlyclean-libtool
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am: uninstall-binPROGRAMS uninstall-man
+
+uninstall-man: uninstall-man1
+
+.MAKE: install-am install-strip
+
+.PHONY: CTAGS GTAGS all all-am check check-am clean clean-binPROGRAMS \
+       clean-generic clean-libtool ctags distclean distclean-compile \
+       distclean-generic distclean-libtool distclean-tags distdir dvi \
+       dvi-am html html-am info info-am install install-am \
+       install-binPROGRAMS install-data install-data-am install-dvi \
+       install-dvi-am install-exec install-exec-am install-html \
+       install-html-am install-info install-info-am install-man \
+       install-man1 install-pdf install-pdf-am install-ps \
+       install-ps-am install-strip installcheck installcheck-am \
+       installdirs maintainer-clean maintainer-clean-generic \
+       mostlyclean mostlyclean-compile mostlyclean-generic \
+       mostlyclean-libtool pdf pdf-am ps ps-am tags uninstall \
+       uninstall-am uninstall-binPROGRAMS uninstall-man \
+       uninstall-man1
+
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/utils/parseargs.cc b/utils/parseargs.cc
new file mode 100644 (file)
index 0000000..a457a88
--- /dev/null
@@ -0,0 +1,220 @@
+/*
+ * parseargs.h
+ *
+ * Command line argument parser.
+ *
+ * Copyright 1996-2003 Glyph & Cog, LLC
+ */
+
+/*========================================================================
+
+ Modified under the Poppler project - http://poppler.freedesktop.org
+
+ Poppler project changes to this file are under the GPLv2 or later license
+
+ All changes made under the Poppler project to this file are licensed
+ under GPL version 2 or later
+
+ Copyright (C) 2008, 2009 Albert Astals Cid <aacid@kde.org>
+ Copyright (C) 2011, 2012 Adrian Johnson <ajohnson@redneon.com>
+
+ To see a description of the changes please see the Changelog file that
+ came with your tarball or type make ChangeLog if you are building from git
+
+========================================================================*/
+
+#include <stdio.h>
+#include <stddef.h>
+#include <string.h>
+#include <stdlib.h>
+#include <ctype.h>
+#include "parseargs.h"
+
+#include "goo/gstrtod.h"
+#include "goo/GooString.h"
+
+static const ArgDesc *findArg(const ArgDesc *args, char *arg);
+static GBool grabArg(const ArgDesc *arg, int i, int *argc, char *argv[]);
+
+GBool parseArgs(const ArgDesc *args, int *argc, char *argv[]) {
+  const ArgDesc *arg;
+  int i, j;
+  GBool ok;
+
+  ok = gTrue;
+  i = 1;
+  while (i < *argc) {
+    if (!strcmp(argv[i], "--")) {
+      --*argc;
+      for (j = i; j < *argc; ++j)
+       argv[j] = argv[j+1];
+      break;
+    } else if ((arg = findArg(args, argv[i]))) {
+      if (!grabArg(arg, i, argc, argv))
+       ok = gFalse;
+    } else {
+      ++i;
+    }
+  }
+  return ok;
+}
+
+void printUsage(const char *program, const char *otherArgs, const ArgDesc *args) {
+  const ArgDesc *arg;
+  const char *typ;
+  int w, w1;
+
+  w = 0;
+  for (arg = args; arg->arg; ++arg) {
+    if ((w1 = strlen(arg->arg)) > w)
+      w = w1;
+  }
+
+  fprintf(stderr, "Usage: %s [options]", program);
+  if (otherArgs)
+    fprintf(stderr, " %s", otherArgs);
+  fprintf(stderr, "\n");
+
+  for (arg = args; arg->arg; ++arg) {
+    fprintf(stderr, "  %s", arg->arg);
+    w1 = 9 + w - strlen(arg->arg);
+    switch (arg->kind) {
+    case argInt:
+    case argIntDummy:
+      typ = " <int>";
+      break;
+    case argFP:
+    case argFPDummy:
+      typ = " <fp>";
+      break;
+    case argString:
+    case argStringDummy:
+    case argGooString:
+      typ = " <string>";
+      break;
+    case argFlag:
+    case argFlagDummy:
+    default:
+      typ = "";
+      break;
+    }
+    fprintf(stderr, "%-*s", w1, typ);
+    if (arg->usage)
+      fprintf(stderr, ": %s", arg->usage);
+    fprintf(stderr, "\n");
+  }
+}
+
+static const ArgDesc *findArg(const ArgDesc *args, char *arg) {
+  const ArgDesc *p;
+
+  for (p = args; p->arg; ++p) {
+    if (p->kind < argFlagDummy && !strcmp(p->arg, arg))
+      return p;
+  }
+  return NULL;
+}
+
+static GBool grabArg(const ArgDesc *arg, int i, int *argc, char *argv[]) {
+  int n;
+  int j;
+  GBool ok;
+
+  ok = gTrue;
+  n = 0;
+  switch (arg->kind) {
+  case argFlag:
+    *(GBool *)arg->val = gTrue;
+    n = 1;
+    break;
+  case argInt:
+    if (i + 1 < *argc && isInt(argv[i+1])) {
+      *(int *)arg->val = atoi(argv[i+1]);
+      n = 2;
+    } else {
+      ok = gFalse;
+      n = 1;
+    }
+    break;
+  case argFP:
+    if (i + 1 < *argc && isFP(argv[i+1])) {
+      *(double *)arg->val = gatof(argv[i+1]);
+      n = 2;
+    } else {
+      ok = gFalse;
+      n = 1;
+    }
+    break;
+  case argString:
+    if (i + 1 < *argc) {
+      strncpy((char *)arg->val, argv[i+1], arg->size - 1);
+      ((char *)arg->val)[arg->size - 1] = '\0';
+      n = 2;
+    } else {
+      ok = gFalse;
+      n = 1;
+    }
+    break;
+  case argGooString:
+    if (i + 1 < *argc) {
+      ((GooString*)arg->val)->Set(argv[i+1]);
+      n = 2;
+    } else {
+      ok = gFalse;
+      n = 1;
+    }
+    break;
+  default:
+    fprintf(stderr, "Internal error in arg table\n");
+    n = 1;
+    break;
+  }
+  if (n > 0) {
+    *argc -= n;
+    for (j = i; j < *argc; ++j)
+      argv[j] = argv[j+n];
+  }
+  return ok;
+}
+
+GBool isInt(char *s) {
+  if (*s == '-' || *s == '+')
+    ++s;
+  while (isdigit(*s))
+    ++s;
+  if (*s)
+    return gFalse;
+  return gTrue;
+}
+
+GBool isFP(char *s) {
+  int n;
+
+  if (*s == '-' || *s == '+')
+    ++s;
+  n = 0;
+  while (isdigit(*s)) {
+    ++s;
+    ++n;
+  }
+  if (*s == '.')
+    ++s;
+  while (isdigit(*s)) {
+    ++s;
+    ++n;
+  }
+  if (n > 0 && (*s == 'e' || *s == 'E')) {
+    ++s;
+    if (*s == '-' || *s == '+')
+      ++s;
+    n = 0;
+    if (!isdigit(*s))
+      return gFalse;
+    do {
+      ++s;
+    } while (isdigit(*s));
+  }
+  if (*s)
+    return gFalse;
+  return gTrue;
+}
diff --git a/utils/parseargs.h b/utils/parseargs.h
new file mode 100644 (file)
index 0000000..f035fa1
--- /dev/null
@@ -0,0 +1,88 @@
+/*
+ * parseargs.h
+ *
+ * Command line argument parser.
+ *
+ * Copyright 1996-2003 Glyph & Cog, LLC
+ */
+
+/*========================================================================
+
+ Modified under the Poppler project - http://poppler.freedesktop.org
+
+ All changes made under the Poppler project to this file are licensed
+ under GPL version 2 or later
+
+ Copyright (C) 2008 Albert Astals Cid <aacid@kde.org>
+ Copyright (C) 2011 Adrian Johnson <ajohnson@redneon.com>
+
+ To see a description of the changes please see the Changelog file that
+ came with your tarball or type make ChangeLog if you are building from git
+
+========================================================================*/
+
+#ifndef PARSEARGS_H
+#define PARSEARGS_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include "goo/gtypes.h"
+
+/*
+ * Argument kinds.
+ */
+typedef enum {
+  argFlag,                     /* flag (present / not-present) */
+                               /*   [val: GBool *]             */
+  argInt,                      /* integer arg    */
+                               /*   [val: int *] */
+  argFP,                       /* floating point arg */
+                               /*   [val: double *]  */
+  argString,                   /* string arg      */
+                               /*   [val: char *] */
+  argGooString,                        /* string arg      */
+                               /*   [val: GooString *] */
+  /* dummy entries -- these show up in the usage listing only; */
+  /* useful for X args, for example                            */
+  argFlagDummy,
+  argIntDummy,
+  argFPDummy,
+  argStringDummy
+} ArgKind;
+
+/*
+ * Argument descriptor.
+ */
+typedef struct {
+  const char *arg;             /* the command line switch */
+  ArgKind kind;                        /* kind of arg */
+  void *val;                   /* place to store value */
+  int size;                    /* for argString: size of string */
+  const char *usage;           /* usage string */
+} ArgDesc;
+
+/*
+ * Parse command line.  Removes all args which are found in the arg
+ * descriptor list <args>.  Stops parsing if "--" is found (and removes
+ * it).  Returns gFalse if there was an error.
+ */
+extern GBool parseArgs(const ArgDesc *args, int *argc, char *argv[]);
+
+/*
+ * Print usage message, based on arg descriptor list.
+ */
+extern void printUsage(const char *program, const char *otherArgs, const ArgDesc *args);
+
+/*
+ * Check if a string is a valid integer or floating point number.
+ */
+extern GBool isInt(char *s);
+extern GBool isFP(char *s);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/utils/pdf2xml.dtd b/utils/pdf2xml.dtd
new file mode 100644 (file)
index 0000000..bf7f14f
--- /dev/null
@@ -0,0 +1,49 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!ELEMENT pdf2xml (page+, outline?)>
+<!ATTLIST pdf2xml
+       producer CDATA #REQUIRED
+       version CDATA #REQUIRED
+>
+<!ELEMENT page (fontspec*, image*, text*)>
+<!ATTLIST page
+       number CDATA #REQUIRED
+       position CDATA #REQUIRED
+       top CDATA #REQUIRED
+       left CDATA #REQUIRED
+       height CDATA #REQUIRED
+       width CDATA #REQUIRED
+>
+<!ELEMENT fontspec EMPTY>
+<!ATTLIST fontspec
+       id CDATA #REQUIRED
+       size CDATA #REQUIRED
+       family CDATA #REQUIRED
+       color CDATA #REQUIRED
+>
+<!ELEMENT text (#PCDATA | b | i | a)*>
+<!ATTLIST text
+       top CDATA #REQUIRED
+       left CDATA #REQUIRED
+       width CDATA #REQUIRED
+       height CDATA #REQUIRED
+       font CDATA #REQUIRED
+>
+<!ELEMENT b (#PCDATA | i)*>
+<!ELEMENT i (#PCDATA | b)*>
+<!ELEMENT a (#PCDATA)>
+<!ATTLIST a
+    href CDATA #REQUIRED
+>
+<!ELEMENT image EMPTY>
+<!ATTLIST image
+       top CDATA #REQUIRED
+       left CDATA #REQUIRED
+       width CDATA #REQUIRED
+       height CDATA #REQUIRED
+       src CDATA #REQUIRED
+>
+<!ELEMENT outline (item | outline)*>
+<!ELEMENT item (#PCDATA)>
+<!ATTLIST item
+       page CDATA #IMPLIED
+>
diff --git a/utils/pdfdetach.1 b/utils/pdfdetach.1
new file mode 100644 (file)
index 0000000..c80dde7
--- /dev/null
@@ -0,0 +1,103 @@
+.\" Copyright 2011 Glyph & Cog, LLC
+.TH pdfdetach 1 "15 August 2011"
+.SH NAME
+pdfdetach \- Portable Document Format (PDF) document embedded file
+extractor (version 3.03)
+.SH SYNOPSIS
+.B pdfdetach
+[options]
+.RI [ PDF-file ]
+.SH DESCRIPTION
+.B Pdfdetach
+lists or extracts embedded files (attachments) from a Portable
+Document Format (PDF) file.
+.SH CONFIGURATION FILE
+Pdfdetach reads a configuration file at startup.  It first tries to
+find the user's private config file, ~/.xpdfrc.  If that doesn't
+exist, it looks for a system-wide config file, typically
+/usr/local/etc/xpdfrc (but this location can be changed when pdfinfo
+is built).  See the
+.BR xpdfrc (5)
+man page for details.
+.SH OPTIONS
+Some of the following options can be set with configuration file
+commands.  These are listed in square brackets with the description of
+the corresponding command line option.
+.TP
+.B \-list
+List all of the embedded files in the PDF file.  File names are
+converted to the text encoding specified by the "\-enc" switch.
+.TP
+.BI \-save " number"
+Save the specified embedded file.  By default, this uses the file name
+associated with the embedded file (as printed by the "\-list" switch);
+the file name can be changed with the "\-o" switch.
+.TP
+.BI \-saveall
+Save all of the embedded files.  This uses the file names associated
+with the embedded files (as printed by the "\-list" switch).  By
+default, the files are saved in the current directory; this can be
+changed with the "\-o" switch.
+.TP
+.BI \-o " path"
+Set the file name used when saving an embedded file with the "\-save"
+switch, or the directory used by "\-saveall".
+.TP
+.BI \-enc " encoding-name"
+Sets the encoding to use for text output (embedded file names).  The
+.I encoding\-name
+must be defined with the unicodeMap command (see
+.BR xpdfrc (5)).
+This defaults to "Latin1" (which is a built-in encoding).
+.RB "[config file: " textEncoding ]
+.TP
+.BI \-opw " password"
+Specify the owner password for the PDF file.  Providing this will
+bypass all security restrictions.
+.TP
+.BI \-upw " password"
+Specify the user password for the PDF file.
+.TP
+.BI \-cfg " config-file"
+Read
+.I config-file
+in place of ~/.xpdfrc or the system-wide config file.
+.TP
+.B \-v
+Print copyright and version information.
+.TP
+.B \-h
+Print usage information.
+.RB ( \-help
+and
+.B \-\-help
+are equivalent.)
+.SH EXIT CODES
+The Xpdf tools use the following exit codes:
+.TP
+0
+No error.
+.TP
+1
+Error opening a PDF file.
+.TP
+2
+Error opening an output file.
+.TP
+3
+Error related to PDF permissions.
+.TP
+99
+Other error.
+.SH AUTHOR
+The pdfinfo software and documentation are copyright 1996-2011 Glyph &
+Cog, LLC.
+.SH "SEE ALSO"
+.BR pdfimages (1),
+.BR pdffonts (1),
+.BR pdfinfo (1),
+.BR pdftocairo (1),
+.BR pdftohtml (1),
+.BR pdftoppm (1),
+.BR pdftops (1),
+.BR pdftotext (1)
\ No newline at end of file
diff --git a/utils/pdfdetach.cc b/utils/pdfdetach.cc
new file mode 100644 (file)
index 0000000..3fbdfb7
--- /dev/null
@@ -0,0 +1,318 @@
+//========================================================================
+//
+// pdfdetach.cc
+//
+// Copyright 2010 Glyph & Cog, LLC
+//
+//========================================================================
+
+//========================================================================
+//
+// Modified under the Poppler project - http://poppler.freedesktop.org
+//
+// All changes made under the Poppler project to this file are licensed
+// under GPL version 2 or later
+//
+// Copyright (C) 2011 Carlos Garcia Campos <carlosgc@gnome.org>
+//
+// To see a description of the changes please see the Changelog file that
+// came with your tarball or type make ChangeLog if you are building from git
+//
+//========================================================================
+
+#include "config.h"
+#include <poppler-config.h>
+#include <stdio.h>
+#include "goo/gtypes.h"
+#include "goo/gmem.h"
+#include "goo/GooList.h"
+#include "parseargs.h"
+#include "Annot.h"
+#include "GlobalParams.h"
+#include "Page.h"
+#include "PDFDoc.h"
+#include "PDFDocFactory.h"
+#include "FileSpec.h"
+#include "CharTypes.h"
+#include "Catalog.h"
+#include "UnicodeMap.h"
+#include "PDFDocEncoding.h"
+#include "Error.h"
+
+static GBool doList = gFalse;
+static int saveNum = 0;
+static GBool saveAll = gFalse;
+static char savePath[1024] = "";
+static char textEncName[128] = "";
+static char ownerPassword[33] = "\001";
+static char userPassword[33] = "\001";
+static char cfgFileName[256] = "";
+static GBool printVersion = gFalse;
+static GBool printHelp = gFalse;
+
+static ArgDesc argDesc[] = {
+  {"-list",   argFlag,     &doList,        0,
+   "list all embedded files"},
+  {"-save",   argInt,      &saveNum,       0,
+   "save the specified embedded file"},
+  {"-saveall", argFlag,    &saveAll,       0,
+   "save all embedded files"},
+  {"-o",      argString,   savePath,       sizeof(savePath),
+   "file name for the saved embedded file"},
+  {"-enc",    argString,   textEncName,    sizeof(textEncName),
+   "output text encoding name"},
+  {"-opw",    argString,   ownerPassword,  sizeof(ownerPassword),
+   "owner password (for encrypted files)"},
+  {"-upw",    argString,   userPassword,   sizeof(userPassword),
+   "user password (for encrypted files)"},
+  {"-cfg",        argString,      cfgFileName,    sizeof(cfgFileName),
+   "configuration file to use in place of .xpdfrc"},
+  {"-v",      argFlag,     &printVersion,  0,
+   "print copyright and version info"},
+  {"-h",      argFlag,     &printHelp,     0,
+   "print usage information"},
+  {"-help",   argFlag,     &printHelp,     0,
+   "print usage information"},
+  {"--help",  argFlag,     &printHelp,     0,
+   "print usage information"},
+  {"-?",      argFlag,     &printHelp,     0,
+   "print usage information"},
+  {NULL}
+};
+
+int main(int argc, char *argv[]) {
+  GooString *fileName;
+  UnicodeMap *uMap;
+  GooString *ownerPW, *userPW;
+  PDFDoc *doc;
+  char uBuf[8];
+  char path[1024];
+  char *p;
+  GBool ok;
+  int exitCode;
+  GooList *embeddedFiles = NULL;
+  int nFiles, nPages, n, i, j;
+  FileSpec *fileSpec;
+  Page *page;
+  Annots *annots;
+  Annot *annot;
+  GooString *s1;
+  Unicode u;
+  GBool isUnicode;
+
+  exitCode = 99;
+
+  // parse args
+  ok = parseArgs(argDesc, &argc, argv);
+  if ((doList ? 1 : 0) +
+      ((saveNum != 0) ? 1 : 0) +
+      (saveAll ? 1 : 0) != 1) {
+    ok = gFalse;
+  }
+  if (!ok || argc != 2 || printVersion || printHelp) {
+    fprintf(stderr, "pdfdetach version %s\n", PACKAGE_VERSION);
+    fprintf(stderr, "%s\n", popplerCopyright);
+    fprintf(stderr, "%s\n", xpdfCopyright);
+    if (!printVersion) {
+      printUsage("pdfdetach", "<PDF-file>", argDesc);
+    }
+    goto err0;
+  }
+  fileName = new GooString(argv[1]);
+
+  // read config file
+  globalParams = new GlobalParams(cfgFileName);
+  if (textEncName[0]) {
+    globalParams->setTextEncoding(textEncName);
+  }
+
+  // get mapping to output encoding
+  if (!(uMap = globalParams->getTextEncoding())) {
+    error(errConfig, -1, "Couldn't get text encoding");
+    delete fileName;
+    goto err1;
+  }
+
+  // open PDF file
+  if (ownerPassword[0] != '\001') {
+    ownerPW = new GooString(ownerPassword);
+  } else {
+    ownerPW = NULL;
+  }
+  if (userPassword[0] != '\001') {
+    userPW = new GooString(userPassword);
+  } else {
+    userPW = NULL;
+  }
+
+  doc = PDFDocFactory().createPDFDoc(*fileName, ownerPW, userPW);
+
+  if (userPW) {
+    delete userPW;
+  }
+  if (ownerPW) {
+    delete ownerPW;
+  }
+  if (!doc->isOk()) {
+    exitCode = 1;
+    goto err2;
+  }
+
+  embeddedFiles = new GooList();
+  for (i = 0; i < doc->getCatalog()->numEmbeddedFiles(); ++i)
+    embeddedFiles->append(doc->getCatalog()->embeddedFile(i));
+
+  nPages = doc->getCatalog()->getNumPages();
+  for (i = 0; i < nPages; ++i) {
+    page = doc->getCatalog()->getPage(i + 1);
+    annots = page->getAnnots();
+    if (!annots)
+      break;
+
+    for (j = 0; j < annots->getNumAnnots(); ++j) {
+      annot = annots->getAnnot(j);
+      if (annot->getType() != Annot::typeFileAttachment)
+        continue;
+      embeddedFiles->append(new FileSpec(static_cast<AnnotFileAttachment *>(annot)->getFile()));
+    }
+  }
+
+  nFiles = embeddedFiles->getLength();
+
+  // list embedded files
+  if (doList) {
+    printf("%d embedded files\n", nFiles);
+    for (i = 0; i < nFiles; ++i) {
+      fileSpec = static_cast<FileSpec *>(embeddedFiles->get(i));
+      printf("%d: ", i+1);
+      s1 = fileSpec->getFileName();
+      if ((s1->getChar(0) & 0xff) == 0xfe && (s1->getChar(1) & 0xff) == 0xff) {
+        isUnicode = gTrue;
+        j = 2;
+      } else {
+        isUnicode = gFalse;
+        j = 0;
+      }
+      while (j < fileSpec->getFileName()->getLength()) {
+        if (isUnicode) {
+          u = ((s1->getChar(j) & 0xff) << 8) | (s1->getChar(j+1) & 0xff);
+          j += 2;
+        } else {
+          u = pdfDocEncoding[s1->getChar(j) & 0xff];
+          ++j;
+        }
+        n = uMap->mapUnicode(u, uBuf, sizeof(uBuf));
+        fwrite(uBuf, 1, n, stdout);
+      }
+      fputc('\n', stdout);
+    }
+
+  // save all embedded files
+  } else if (saveAll) {
+    for (i = 0; i < nFiles; ++i) {
+      fileSpec = static_cast<FileSpec *>(embeddedFiles->get(i));
+      if (savePath[0]) {
+       n = strlen(savePath);
+       if (n > (int)sizeof(path) - 2) {
+         n = sizeof(path) - 2;
+       }
+       memcpy(path, savePath, n);
+       path[n] = '/';
+       p = path + n + 1;
+      } else {
+       p = path;
+      }
+      s1 = fileSpec->getFileName();
+      if ((s1->getChar(0) & 0xff) == 0xfe && (s1->getChar(1) & 0xff) == 0xff) {
+        isUnicode = gTrue;
+        j = 2;
+      } else {
+        isUnicode = gFalse;
+        j = 0;
+      }
+      while (j < fileSpec->getFileName()->getLength()) {
+        if (isUnicode) {
+          u = ((s1->getChar(j) & 0xff) << 8) | (s1->getChar(j+1) & 0xff);
+          j += 2;
+        } else {
+          u = pdfDocEncoding[s1->getChar(j) & 0xff];
+          ++j;
+        }
+        n = uMap->mapUnicode(u, uBuf, sizeof(uBuf));
+        if (p + n >= path + sizeof(path))
+          break;
+        memcpy(p, uBuf, n);
+        p += n;
+      }
+      *p = '\0';
+
+      if (!fileSpec->getEmbeddedFile()->save(path)) {
+       error(errIO, -1, "Error saving embedded file as '{0:s}'", p);
+       exitCode = 2;
+       goto err2;
+      }
+    }
+
+  // save an embedded file
+  } else {
+    if (saveNum < 1 || saveNum > nFiles) {
+      error(errCommandLine, -1, "Invalid file number");
+      goto err2;
+    }
+
+    fileSpec = static_cast<FileSpec *>(embeddedFiles->get(saveNum - 1));
+    if (savePath[0]) {
+      p = savePath;
+    } else {
+      p = path;
+      s1 = fileSpec->getFileName();
+      if ((s1->getChar(0) & 0xff) == 0xfe && (s1->getChar(1) & 0xff) == 0xff) {
+        isUnicode = gTrue;
+        j = 2;
+      } else {
+        isUnicode = gFalse;
+        j = 0;
+      }
+      while (j < fileSpec->getFileName()->getLength()) {
+        if (isUnicode) {
+          u = ((s1->getChar(j) & 0xff) << 8) | (s1->getChar(j+1) & 0xff);
+          j += 2;
+        } else {
+          u = pdfDocEncoding[s1->getChar(j) & 0xff];
+          ++j;
+        }
+        n = uMap->mapUnicode(u, uBuf, sizeof(uBuf));
+        if (p + n >= path + sizeof(path))
+          break;
+        memcpy(p, uBuf, n);
+        p += n;
+      }
+      *p = '\0';
+      p = path;
+    }
+
+    if (!fileSpec->getEmbeddedFile()->save(p)) {
+      error(errIO, -1, "Error saving embedded file as '{0:s}'", p);
+      exitCode = 2;
+      goto err2;
+    }
+  }
+
+  exitCode = 0;
+
+  // clean up
+ err2:
+  if (embeddedFiles)
+    deleteGooList(embeddedFiles, FileSpec);
+  uMap->decRefCnt();
+  delete doc;
+ err1:
+  delete globalParams;
+ err0:
+
+  // check for memory leaks
+  Object::memCheck(stderr);
+  gMemReport(stderr);
+
+  return exitCode;
+}
diff --git a/utils/pdffonts.1 b/utils/pdffonts.1
new file mode 100644 (file)
index 0000000..4afc395
--- /dev/null
@@ -0,0 +1,119 @@
+.\" Copyright 1999-2011 Glyph & Cog, LLC
+.TH pdffonts 1 "15 August 2011"
+.SH NAME
+pdffonts \- Portable Document Format (PDF) font analyzer (version
+3.03)
+.SH SYNOPSIS
+.B pdffonts
+[options]
+.RI [ PDF-file ]
+.SH DESCRIPTION
+.B Pdffonts
+lists the fonts used in a Portable Document Format (PDF) file along
+with various information for each font.
+.PP
+The following information is listed for each font:
+.TP
+.B name
+the font name, exactly as given in the PDF file (potentially including
+a subset prefix)
+.TP
+.B type
+the font type -- see below for details
+.TP
+.B encoding
+the font encoding
+.TP
+.B emb
+"yes" if the font is embedded in the PDF file
+.TP
+.B sub
+"yes" if the font is a subset
+.TP
+.B uni
+"yes" if there is an explicit "ToUnicode" map in the PDF file (the
+absence of a ToUnicode map doesn't necessarily mean that the text
+can't be converted to Unicode)
+.TP
+.B object ID
+the font dictionary object ID (number and generation)
+.PP
+PDF files can contain the following types of fonts:
+.PP
+.RS
+Type 1
+.RE
+.RS
+Type 1C -- aka Compact Font Format (CFF)
+.RE
+.RS
+Type 3
+.RE
+.RS
+TrueType
+.RE
+.RS
+CID Type 0 -- 16-bit font with no specified type
+.RE
+.RS
+CID Type 0C -- 16-bit PostScript CFF font
+.RE
+.RS
+CID TrueType -- 16-bit TrueType font
+.RE
+.SH OPTIONS
+.TP
+.BI \-f " number"
+Specifies the first page to analyze.
+.TP
+.BI \-l " number"
+Specifies the last page to analyze.
+.TP
+.BI \-subst
+List the substitute fonts that poppler will use for non embedded fonts.
+.TP
+.BI \-opw " password"
+Specify the owner password for the PDF file.  Providing this will
+bypass all security restrictions.
+.TP
+.BI \-upw " password"
+Specify the user password for the PDF file.
+.TP
+.B \-v
+Print copyright and version information.
+.TP
+.B \-h
+Print usage information.
+.RB ( \-help
+and
+.B \-\-help
+are equivalent.)
+.SH EXIT CODES
+The Xpdf tools use the following exit codes:
+.TP
+0
+No error.
+.TP
+1
+Error opening a PDF file.
+.TP
+2
+Error opening an output file.
+.TP
+3
+Error related to PDF permissions.
+.TP
+99
+Other error.
+.SH AUTHOR
+The pdffonts software and documentation are copyright 1996-2011 Glyph
+& Cog, LLC.
+.SH "SEE ALSO"
+.BR pdfdetach (1),
+.BR pdfimages (1),
+.BR pdfinfo (1),
+.BR pdftocairo (1),
+.BR pdftohtml (1),
+.BR pdftoppm (1),
+.BR pdftops (1),
+.BR pdftotext (1)
diff --git a/utils/pdffonts.cc b/utils/pdffonts.cc
new file mode 100644 (file)
index 0000000..820abbf
--- /dev/null
@@ -0,0 +1,224 @@
+//========================================================================
+//
+// pdffonts.cc
+//
+// Copyright 2001-2007 Glyph & Cog, LLC
+//
+//========================================================================
+
+//========================================================================
+//
+// Modified under the Poppler project - http://poppler.freedesktop.org
+//
+// All changes made under the Poppler project to this file are licensed
+// under GPL version 2 or later
+//
+// Copyright (C) 2006 Dominic Lachowicz <cinamod@hotmail.com>
+// Copyright (C) 2007-2008, 2010 Albert Astals Cid <aacid@kde.org>
+// Copyright (C) 2010 Hib Eris <hib@hiberis.nl>
+// Copyright (C) 2012 Adrian Johnson <ajohnson@redneon.com>
+//
+// To see a description of the changes please see the Changelog file that
+// came with your tarball or type make ChangeLog if you are building from git
+//
+//========================================================================
+
+#include "config.h"
+#include <poppler-config.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <stddef.h>
+#include <string.h>
+#include <math.h>
+#include "parseargs.h"
+#include "goo/GooString.h"
+#include "goo/gmem.h"
+#include "GlobalParams.h"
+#include "Object.h"
+#include "PDFDoc.h"
+#include "PDFDocFactory.h"
+#include "FontInfo.h"
+
+static const char *fontTypeNames[] = {
+  "unknown",
+  "Type 1",
+  "Type 1C",
+  "Type 1C (OT)",
+  "Type 3",
+  "TrueType",
+  "TrueType (OT)",
+  "CID Type 0",
+  "CID Type 0C",
+  "CID Type 0C (OT)",
+  "CID TrueType",
+  "CID TrueType (OT)"
+};
+
+static int firstPage = 1;
+static int lastPage = 0;
+static GBool showSubst = gFalse;
+static char ownerPassword[33] = "\001";
+static char userPassword[33] = "\001";
+static GBool printVersion = gFalse;
+static GBool printHelp = gFalse;
+
+static const ArgDesc argDesc[] = {
+  {"-f",      argInt,      &firstPage,     0,
+   "first page to examine"},
+  {"-l",      argInt,      &lastPage,      0,
+   "last page to examine"},
+  {"-subst",      argFlag,     &showSubst,  0,
+   "show font substitutions"},
+  {"-opw",    argString,   ownerPassword,  sizeof(ownerPassword),
+   "owner password (for encrypted files)"},
+  {"-upw",    argString,   userPassword,   sizeof(userPassword),
+   "user password (for encrypted files)"},
+  {"-v",      argFlag,     &printVersion,  0,
+   "print copyright and version info"},
+  {"-h",      argFlag,     &printHelp,     0,
+   "print usage information"},
+  {"-help",   argFlag,     &printHelp,     0,
+   "print usage information"},
+  {"--help",  argFlag,     &printHelp,     0,
+   "print usage information"},
+  {"-?",      argFlag,     &printHelp,     0,
+   "print usage information"},
+  {NULL}
+};
+
+int main(int argc, char *argv[]) {
+  PDFDoc *doc;
+  GooString *fileName;
+  GooString *ownerPW, *userPW;
+  GBool ok;
+  int exitCode;
+
+  exitCode = 99;
+
+  // parse args
+  ok = parseArgs(argDesc, &argc, argv);
+  if (!ok || argc != 2 || printVersion || printHelp) {
+    fprintf(stderr, "pdffonts version %s\n", PACKAGE_VERSION);
+    fprintf(stderr, "%s\n", popplerCopyright);
+    fprintf(stderr, "%s\n", xpdfCopyright);
+    if (!printVersion) {
+      printUsage("pdffonts", "<PDF-file>", argDesc);
+    }
+    if (printVersion || printHelp)
+      exitCode = 0;
+    goto err0;
+  }
+  fileName = new GooString(argv[1]);
+
+  // read config file
+  globalParams = new GlobalParams();
+
+  // open PDF file
+  if (ownerPassword[0] != '\001') {
+    ownerPW = new GooString(ownerPassword);
+  } else {
+    ownerPW = NULL;
+  }
+  if (userPassword[0] != '\001') {
+    userPW = new GooString(userPassword);
+  } else {
+    userPW = NULL;
+  }
+  if (fileName->cmp("-") == 0) {
+      delete fileName;
+      fileName = new GooString("fd://0");
+  }
+
+  doc = PDFDocFactory().createPDFDoc(*fileName, ownerPW, userPW);
+  delete fileName;
+
+  if (userPW) {
+    delete userPW;
+  }
+  if (ownerPW) {
+    delete ownerPW;
+  }
+  if (!doc->isOk()) {
+    exitCode = 1;
+    goto err1;
+  }
+
+  // get page range
+  if (firstPage < 1) {
+    firstPage = 1;
+  }
+  if (lastPage < 1 || lastPage > doc->getNumPages()) {
+    lastPage = doc->getNumPages();
+  }
+
+  // get the fonts
+  {
+    FontInfoScanner scanner(doc, firstPage - 1);
+    GooList *fonts = scanner.scan(lastPage - firstPage + 1);
+
+    if (showSubst) {
+      // print the font substitutions
+      printf("name                                 object ID substitute font                      substitute font file\n");
+      printf("------------------------------------ --------- ------------------------------------ ------------------------------------\n");
+      if (fonts) {
+        for (int i = 0; i < fonts->getLength(); ++i) {
+          FontInfo *font = (FontInfo *)fonts->get(i);
+          if (font->getFile()) {
+            printf("%-36s",
+                   font->getName() ? font->getName()->getCString() : "[none]");
+            const Ref fontRef = font->getRef();
+            if (fontRef.gen >= 100000) {
+              printf(" [none]");
+            } else {
+              printf(" %6d %2d", fontRef.num, fontRef.gen);
+            }
+            printf(" %-36s %s\n",
+                   font->getSubstituteName() ? font->getSubstituteName()->getCString() : "[none]",
+                   font->getFile()->getCString());
+          }
+          delete font;
+        }
+        delete fonts;
+      }
+    } else {
+      // print the font info
+      printf("name                                 type              encoding         emb sub uni object ID\n");
+      printf("------------------------------------ ----------------- ---------------- --- --- --- ---------\n");
+      if (fonts) {
+        for (int i = 0; i < fonts->getLength(); ++i) {
+          FontInfo *font = (FontInfo *)fonts->get(i);
+          printf("%-36s %-17s %-16s %-3s %-3s %-3s",
+                 font->getName() ? font->getName()->getCString() : "[none]",
+                 fontTypeNames[font->getType()],
+                 font->getEncoding()->getCString(),
+                 font->getEmbedded() ? "yes" : "no",
+                 font->getSubset() ? "yes" : "no",
+                 font->getToUnicode() ? "yes" : "no");
+          const Ref fontRef = font->getRef();
+          if (fontRef.gen >= 100000) {
+            printf(" [none]\n");
+          } else {
+            printf(" %6d %2d\n", fontRef.num, fontRef.gen);
+          }
+          delete font;
+        }
+        delete fonts;
+      }
+    }
+  }
+
+  exitCode = 0;
+
+ err1:
+  delete doc;
+  delete globalParams;
+ err0:
+
+  // check for memory leaks
+  Object::memCheck(stderr);
+  gMemReport(stderr);
+
+  return exitCode;
+}
+
+
diff --git a/utils/pdfimages.1 b/utils/pdfimages.1
new file mode 100644 (file)
index 0000000..955d8b3
--- /dev/null
@@ -0,0 +1,189 @@
+.\" Copyright 1998-2011 Glyph & Cog, LLC
+.TH pdfimages 1 "15 August 2011"
+.SH NAME
+pdfimages \- Portable Document Format (PDF) image extractor
+(version 3.03)
+.SH SYNOPSIS
+.B pdfimages
+[options]
+.I PDF-file image-root
+.SH DESCRIPTION
+.B Pdfimages
+saves images from a Portable Document Format (PDF) file as Portable
+Pixmap (PPM), Portable Bitmap (PBM), or JPEG files.
+.PP
+Pdfimages reads the PDF file
+.IR PDF-file ,
+scans one or more pages, and writes one PPM, PBM, or JPEG file for each image,
+.IR image-root - nnn . xxx ,
+where
+.I nnn
+is the image number and
+.I xxx
+is the image type (.ppm, .pbm, .jpg).
+.SH OPTIONS
+.TP
+.BI \-f " number"
+Specifies the first page to scan.
+.TP
+.BI \-l " number"
+Specifies the last page to scan.
+.TP
+.B \-j
+Normally, all images are written as PBM (for monochrome images) or PPM
+(for non-monochrome images) files.  With this option, images in DCT
+format are saved as JPEG files.  All non-DCT images are saved in
+PBM/PPM format as usual.
+.TP
+.B \-list
+Instead of writing the images, list the images along with various information for each image. Do not specify an
+.IR image-root
+with this option.
+.IP
+The following information is listed for each font:
+.RS
+.TP
+.B page
+the page number containing the image
+.TP
+.B num
+the image number
+.TP
+.B type
+the image type:
+.PP
+.RS
+image - an opaque image
+.RE
+.RS
+mask - a monochrome mask image
+.RE
+.RS
+smask - a soft-mask image
+.RE
+.RS
+stencil - a monochrome mask image used for painting a color or pattern
+.RE
+.PP
+Note: Tranparency in images is represented in PDF using a separate image for the image and the mask/smask.
+The mask/smask used as part of a transparent image always immediately follows the image in the image list.
+.TP
+.B width
+image width (in pixels)
+.TP
+.B height
+image height (in pixels)
+.PP
+Note: the image width/height is the size of the embedded image, not the size the image will be rendered at.
+.TP
+.B color
+image color space:
+.PP
+.RS
+gray - Gray
+.RE
+.RS
+rgb - RGB
+.RE
+.RS
+cmyk - CMYK
+.RE
+.RS
+lab - L*a*b
+.RE
+.RS
+icc - ICC Based
+.RE
+.RS
+index - Indexed Color
+.RE
+.RS
+sep - Separation
+.RE
+.RS
+devn - DeviceN
+.RE
+.TP
+.B comp
+number of color components
+.TP
+.B bpc
+bits per component
+.TP
+.B enc
+encoding:
+.PP
+.RS
+image - raster image (may be Flate or LZW compressed but does not use an image encoding)
+.RE
+.RS
+jpeg - Joint Photographic Experts Group
+.RE
+.RS
+jp2 - JPEG2000
+.RE
+.RS
+jbig2 - Joint Bi-Level Image Experts Group
+.RE
+.RS
+ccitt - CCITT Group 3 or Group 4 Fax
+.RE
+.TP
+.B interp
+"yes" if the interpolation is to be performed when scaling up the image
+.TP
+.B object ID
+the font dictionary object ID (number and generation)
+.RE
+.TP
+.BI \-opw " password"
+Specify the owner password for the PDF file.  Providing this will
+bypass all security restrictions.
+.TP
+.BI \-upw " password"
+Specify the user password for the PDF file.
+.TP
+.B \-p
+Include page numbers in output file names.
+.TP
+.B \-q
+Don't print any messages or errors.
+.TP
+.B \-v
+Print copyright and version information.
+.TP
+.B \-h
+Print usage information.
+.RB ( \-help
+and
+.B \-\-help
+are equivalent.)
+.SH EXIT CODES
+The Xpdf tools use the following exit codes:
+.TP
+0
+No error.
+.TP
+1
+Error opening a PDF file.
+.TP
+2
+Error opening an output file.
+.TP
+3
+Error related to PDF permissions.
+.TP
+99
+Other error.
+.SH AUTHOR
+The pdfimages software and documentation are copyright 1998-2011 Glyph
+& Cog, LLC.
+.SH "SEE ALSO"
+.BR pdfdetach (1)
+.BR pdffonts (1),
+.BR pdfinfo (1),
+.BR pdftocairo (1),
+.BR pdftohtml (1),
+.BR pdftoppm (1),
+.BR pdftops (1),
+.BR pdftotext (1)
diff --git a/utils/pdfimages.cc b/utils/pdfimages.cc
new file mode 100644 (file)
index 0000000..82c301c
--- /dev/null
@@ -0,0 +1,191 @@
+//========================================================================
+//
+// pdfimages.cc
+//
+// Copyright 1998-2003 Glyph & Cog, LLC
+//
+// Modified for Debian by Hamish Moffatt, 22 May 2002.
+//
+//========================================================================
+
+//========================================================================
+//
+// Modified under the Poppler project - http://poppler.freedesktop.org
+//
+// All changes made under the Poppler project to this file are licensed
+// under GPL version 2 or later
+//
+// Copyright (C) 2007-2008, 2010 Albert Astals Cid <aacid@kde.org>
+// Copyright (C) 2010 Hib Eris <hib@hiberis.nl>
+// Copyright (C) 2010 Jakob Voss <jakob.voss@gbv.de>
+// Copyright (C) 2012 Adrian Johnson <ajohnson@redneon.com>
+//
+// To see a description of the changes please see the Changelog file that
+// came with your tarball or type make ChangeLog if you are building from git
+//
+//========================================================================
+
+#include "config.h"
+#include <poppler-config.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <stddef.h>
+#include <string.h>
+#include "parseargs.h"
+#include "goo/GooString.h"
+#include "goo/gmem.h"
+#include "GlobalParams.h"
+#include "Object.h"
+#include "Stream.h"
+#include "Array.h"
+#include "Dict.h"
+#include "XRef.h"
+#include "Catalog.h"
+#include "Page.h"
+#include "PDFDoc.h"
+#include "PDFDocFactory.h"
+#include "ImageOutputDev.h"
+#include "Error.h"
+
+static int firstPage = 1;
+static int lastPage = 0;
+static GBool listImages = gFalse;
+static GBool dumpJPEG = gFalse;
+static GBool pageNames = gFalse;
+static char ownerPassword[33] = "\001";
+static char userPassword[33] = "\001";
+static GBool quiet = gFalse;
+static GBool printVersion = gFalse;
+static GBool printHelp = gFalse;
+
+static const ArgDesc argDesc[] = {
+  {"-f",      argInt,      &firstPage,     0,
+   "first page to convert"},
+  {"-l",      argInt,      &lastPage,      0,
+   "last page to convert"},
+  {"-j",      argFlag,     &dumpJPEG,      0,
+   "write JPEG images as JPEG files"},
+  {"-list",   argFlag,     &listImages,      0,
+   "print list of images instead of saving"},
+  {"-opw",    argString,   ownerPassword,  sizeof(ownerPassword),
+   "owner password (for encrypted files)"},
+  {"-upw",    argString,   userPassword,   sizeof(userPassword),
+   "user password (for encrypted files)"},
+  {"-p",      argFlag,     &pageNames,     0,
+   "include page numbers in output file names"},
+  {"-q",      argFlag,     &quiet,         0,
+   "don't print any messages or errors"},
+  {"-v",      argFlag,     &printVersion,  0,
+   "print copyright and version info"},
+  {"-h",      argFlag,     &printHelp,     0,
+   "print usage information"},
+  {"-help",   argFlag,     &printHelp,     0,
+   "print usage information"},
+  {"--help",  argFlag,     &printHelp,     0,
+   "print usage information"},
+  {"-?",      argFlag,     &printHelp,     0,
+   "print usage information"},
+  {NULL}
+};
+
+int main(int argc, char *argv[]) {
+  PDFDoc *doc;
+  GooString *fileName;
+  char *imgRoot = NULL;
+  GooString *ownerPW, *userPW;
+  ImageOutputDev *imgOut;
+  GBool ok;
+  int exitCode;
+
+  exitCode = 99;
+
+  // parse args
+  ok = parseArgs(argDesc, &argc, argv);
+  if (!ok || (listImages && argc != 2) || (!listImages && argc != 3) || printVersion || printHelp) {
+    fprintf(stderr, "pdfimages version %s\n", PACKAGE_VERSION);
+    fprintf(stderr, "%s\n", popplerCopyright);
+    fprintf(stderr, "%s\n", xpdfCopyright);
+    if (!printVersion) {
+      printUsage("pdfimages", "<PDF-file> <image-root>", argDesc);
+    }
+    if (printVersion || printHelp)
+      exitCode = 0;
+    goto err0;
+  }
+  fileName = new GooString(argv[1]);
+  if (!listImages)
+    imgRoot = argv[2];
+
+  // read config file
+  globalParams = new GlobalParams();
+  if (quiet) {
+    globalParams->setErrQuiet(quiet);
+  }
+
+  // open PDF file
+  if (ownerPassword[0] != '\001') {
+    ownerPW = new GooString(ownerPassword);
+  } else {
+    ownerPW = NULL;
+  }
+  if (userPassword[0] != '\001') {
+    userPW = new GooString(userPassword);
+  } else {
+    userPW = NULL;
+  }
+  if (fileName->cmp("-") == 0) {
+      delete fileName;
+      fileName = new GooString("fd://0");
+  }
+
+  doc = PDFDocFactory().createPDFDoc(*fileName, ownerPW, userPW);
+  delete fileName;
+
+  if (userPW) {
+    delete userPW;
+  }
+  if (ownerPW) {
+    delete ownerPW;
+  }
+  if (!doc->isOk()) {
+    exitCode = 1;
+    goto err1;
+  }
+
+  // check for copy permission
+#ifdef ENFORCE_PERMISSIONS
+  if (!doc->okToCopy()) {
+    error(errNotAllowed, -1, "Copying of images from this document is not allowed.");
+    exitCode = 3;
+    goto err1;
+  }
+#endif
+
+  // get page range
+  if (firstPage < 1)
+    firstPage = 1;
+  if (lastPage < 1 || lastPage > doc->getNumPages())
+    lastPage = doc->getNumPages();
+
+  // write image files
+  imgOut = new ImageOutputDev(imgRoot, pageNames, dumpJPEG, listImages);
+  if (imgOut->isOk()) {
+      doc->displayPages(imgOut, firstPage, lastPage, 72, 72, 0,
+                       gTrue, gFalse, gFalse);
+  }
+  delete imgOut;
+
+  exitCode = 0;
+
+  // clean up
+ err1:
+  delete doc;
+  delete globalParams;
+ err0:
+
+  // check for memory leaks
+  Object::memCheck(stderr);
+  gMemReport(stderr);
+
+  return exitCode;
+}
diff --git a/utils/pdfinfo.1 b/utils/pdfinfo.1
new file mode 100644 (file)
index 0000000..a3ad1c3
--- /dev/null
@@ -0,0 +1,146 @@
+.\" Copyright 1999-2011 Glyph & Cog, LLC
+.TH pdfinfo 1 "15 August 2011"
+.SH NAME
+pdfinfo \- Portable Document Format (PDF) document information
+extractor (version 3.03)
+.SH SYNOPSIS
+.B pdfinfo
+[options]
+.RI [ PDF-file ]
+.SH DESCRIPTION
+.B Pdfinfo
+prints the contents of the \'Info' dictionary (plus some other useful
+information) from a Portable Document Format (PDF) file.
+.PP
+The \'Info' dictionary contains the following values:
+.PP
+.RS
+title
+.RE
+.RS
+subject
+.RE
+.RS
+keywords
+.RE
+.RS
+author
+.RE
+.RS
+creator
+.RE
+.RS
+producer
+.RE
+.RS
+creation date
+.RE
+.RS
+modification date
+.RE
+.PP
+In addition, the following information is printed:
+.PP
+.RS
+tagged (yes/no)
+.RE
+.RS
+form (AcroForm / XFA / none)
+.RE
+.RS
+page count
+.RE
+.RS
+encrypted flag (yes/no)
+.RE
+.RS
+print and copy permissions (if encrypted)
+.RE
+.RS
+page size
+.RE
+.RS
+file size
+.RE
+.RS
+linearized (yes/no)
+.RE
+.RS
+PDF version
+.RE
+.RS
+metadata (only if requested)
+.RE
+.SH OPTIONS
+.TP
+.BI \-f " number"
+Specifies the first page to examine.  If multiple pages are requested
+using the "\-f" and "\-l" options, the size of each requested page (and,
+optionally, the bounding boxes for each requested page) are printed.
+Otherwise, only page one is examined.
+.TP
+.BI \-l " number"
+Specifies the last page to examine.
+.TP
+.B \-box
+Prints the page box bounding boxes: MediaBox, CropBox, BleedBox,
+TrimBox, and ArtBox.
+.TP
+.B \-meta
+Prints document-level metadata.  (This is the "Metadata" stream from
+the PDF file's Catalog object.)
+.TP
+.B \-rawdates
+Prints the raw (undecoded) date strings, directly from the PDF file.
+.TP
+.BI \-enc " encoding-name"
+Sets the encoding to use for text output. This defaults to "UTF-8".
+.TP
+.B \-listenc
+Lits the available encodings
+.TP
+.BI \-opw " password"
+Specify the owner password for the PDF file.  Providing this will
+bypass all security restrictions.
+.TP
+.BI \-upw " password"
+Specify the user password for the PDF file.
+.TP
+.B \-v
+Print copyright and version information.
+.TP
+.B \-h
+Print usage information.
+.RB ( \-help
+and
+.B \-\-help
+are equivalent.)
+.SH EXIT CODES
+The Xpdf tools use the following exit codes:
+.TP
+0
+No error.
+.TP
+1
+Error opening a PDF file.
+.TP
+2
+Error opening an output file.
+.TP
+3
+Error related to PDF permissions.
+.TP
+99
+Other error.
+.SH AUTHOR
+The pdfinfo software and documentation are copyright 1996-2011 Glyph &
+Cog, LLC.
+.SH "SEE ALSO"
+.BR pdfdetach (1),
+.BR pdffonts (1),
+.BR pdfimages (1),
+.BR pdftocairo (1),
+.BR pdftohtml (1),
+.BR pdftoppm (1),
+.BR pdftops (1),
+.BR pdftotext (1)
diff --git a/utils/pdfinfo.cc b/utils/pdfinfo.cc
new file mode 100644 (file)
index 0000000..cdc5375
--- /dev/null
@@ -0,0 +1,464 @@
+//========================================================================
+//
+// pdfinfo.cc
+//
+// Copyright 1998-2003 Glyph & Cog, LLC
+//
+//========================================================================
+
+//========================================================================
+//
+// Modified under the Poppler project - http://poppler.freedesktop.org
+//
+// All changes made under the Poppler project to this file are licensed
+// under GPL version 2 or later
+//
+// Copyright (C) 2006 Dom Lachowicz <cinamod@hotmail.com>
+// Copyright (C) 2007-2010, 2012 Albert Astals Cid <aacid@kde.org>
+// Copyright (C) 2010 Hib Eris <hib@hiberis.nl>
+// Copyright (C) 2011 Vittal Aithal <vittal.aithal@cognidox.com>
+// Copyright (C) 2012 Adrian Johnson <ajohnson@redneon.com>
+//
+// To see a description of the changes please see the Changelog file that
+// came with your tarball or type make ChangeLog if you are building from git
+//
+//========================================================================
+
+#include "config.h"
+#include <poppler-config.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <stddef.h>
+#include <string.h>
+#include <time.h>
+#include <math.h>
+#include "parseargs.h"
+#include "printencodings.h"
+#include "goo/GooString.h"
+#include "goo/gmem.h"
+#include "GlobalParams.h"
+#include "Object.h"
+#include "Stream.h"
+#include "Array.h"
+#include "Dict.h"
+#include "XRef.h"
+#include "Catalog.h"
+#include "Page.h"
+#include "PDFDoc.h"
+#include "PDFDocFactory.h"
+#include "CharTypes.h"
+#include "UnicodeMap.h"
+#include "PDFDocEncoding.h"
+#include "Error.h"
+#include "DateInfo.h"
+
+static void printInfoString(Dict *infoDict, const char *key, const char *text,
+                           UnicodeMap *uMap);
+static void printInfoDate(Dict *infoDict, const char *key, const char *text);
+static void printBox(const char *text, PDFRectangle *box);
+
+static int firstPage = 1;
+static int lastPage = 0;
+static GBool printBoxes = gFalse;
+static GBool printMetadata = gFalse;
+static GBool rawDates = gFalse;
+static char textEncName[128] = "";
+static char ownerPassword[33] = "\001";
+static char userPassword[33] = "\001";
+static GBool printVersion = gFalse;
+static GBool printHelp = gFalse;
+static GBool printEnc = gFalse;
+
+static const ArgDesc argDesc[] = {
+  {"-f",      argInt,      &firstPage,        0,
+   "first page to convert"},
+  {"-l",      argInt,      &lastPage,         0,
+   "last page to convert"},
+  {"-box",    argFlag,     &printBoxes,       0,
+   "print the page bounding boxes"},
+  {"-meta",   argFlag,     &printMetadata,    0,
+   "print the document metadata (XML)"},
+  {"-rawdates", argFlag,   &rawDates,         0,
+   "print the undecoded date strings directly from the PDF file"},
+  {"-enc",    argString,   textEncName,    sizeof(textEncName),
+   "output text encoding name"},
+  {"-listenc",argFlag,     &printEnc,      0,
+   "list available encodings"},
+  {"-opw",    argString,   ownerPassword,  sizeof(ownerPassword),
+   "owner password (for encrypted files)"},
+  {"-upw",    argString,   userPassword,   sizeof(userPassword),
+   "user password (for encrypted files)"},
+  {"-v",      argFlag,     &printVersion,  0,
+   "print copyright and version info"},
+  {"-h",      argFlag,     &printHelp,     0,
+   "print usage information"},
+  {"-help",   argFlag,     &printHelp,     0,
+   "print usage information"},
+  {"--help",  argFlag,     &printHelp,     0,
+   "print usage information"},
+  {"-?",      argFlag,     &printHelp,     0,
+   "print usage information"},
+  {NULL}
+};
+
+int main(int argc, char *argv[]) {
+  PDFDoc *doc;
+  GooString *fileName;
+  GooString *ownerPW, *userPW;
+  UnicodeMap *uMap;
+  Page *page;
+  Object info, xfa;
+  Object *acroForm;
+  char buf[256];
+  double w, h, wISO, hISO;
+  FILE *f;
+  GooString *metadata;
+  GBool ok;
+  int exitCode;
+  int pg, i;
+  GBool multiPage;
+  int r;
+
+  exitCode = 99;
+
+  // parse args
+  ok = parseArgs(argDesc, &argc, argv);
+  if (!ok || (argc != 2 && !printEnc) || printVersion || printHelp) {
+    fprintf(stderr, "pdfinfo version %s\n", PACKAGE_VERSION);
+    fprintf(stderr, "%s\n", popplerCopyright);
+    fprintf(stderr, "%s\n", xpdfCopyright);
+    if (!printVersion) {
+      printUsage("pdfinfo", "<PDF-file>", argDesc);
+    }
+    if (printVersion || printHelp)
+      exitCode = 0;
+    goto err0;
+  }
+
+  // read config file
+  globalParams = new GlobalParams();
+
+  if (printEnc) {
+    printEncodings();
+    delete globalParams;
+    exitCode = 0;
+    goto err0;
+  }
+
+  fileName = new GooString(argv[1]);
+
+  if (textEncName[0]) {
+    globalParams->setTextEncoding(textEncName);
+  }
+
+  // get mapping to output encoding
+  if (!(uMap = globalParams->getTextEncoding())) {
+    error(errCommandLine, -1, "Couldn't get text encoding");
+    delete fileName;
+    goto err1;
+  }
+
+  // open PDF file
+  if (ownerPassword[0] != '\001') {
+    ownerPW = new GooString(ownerPassword);
+  } else {
+    ownerPW = NULL;
+  }
+  if (userPassword[0] != '\001') {
+    userPW = new GooString(userPassword);
+  } else {
+    userPW = NULL;
+  }
+
+  if (fileName->cmp("-") == 0) {
+      delete fileName;
+      fileName = new GooString("fd://0");
+  }
+
+  doc = PDFDocFactory().createPDFDoc(*fileName, ownerPW, userPW);
+
+  if (userPW) {
+    delete userPW;
+  }
+  if (ownerPW) {
+    delete ownerPW;
+  }
+  if (!doc->isOk()) {
+    exitCode = 1;
+    goto err2;
+  }
+
+  // get page range
+  if (firstPage < 1) {
+    firstPage = 1;
+  }
+  if (lastPage == 0) {
+    multiPage = gFalse;
+    lastPage = 1;
+  } else {
+    multiPage = gTrue;
+  }
+  if (lastPage < 1 || lastPage > doc->getNumPages()) {
+    lastPage = doc->getNumPages();
+  }
+
+  // print doc info
+  doc->getDocInfo(&info);
+  if (info.isDict()) {
+    printInfoString(info.getDict(), "Title",        "Title:          ", uMap);
+    printInfoString(info.getDict(), "Subject",      "Subject:        ", uMap);
+    printInfoString(info.getDict(), "Keywords",     "Keywords:       ", uMap);
+    printInfoString(info.getDict(), "Author",       "Author:         ", uMap);
+    printInfoString(info.getDict(), "Creator",      "Creator:        ", uMap);
+    printInfoString(info.getDict(), "Producer",     "Producer:       ", uMap);
+    if (rawDates) {
+      printInfoString(info.getDict(), "CreationDate", "CreationDate:   ",
+                     uMap);
+      printInfoString(info.getDict(), "ModDate",      "ModDate:        ",
+                     uMap);
+    } else {
+      printInfoDate(info.getDict(),   "CreationDate", "CreationDate:   ");
+      printInfoDate(info.getDict(),   "ModDate",      "ModDate:        ");
+    }
+  }
+  info.free();
+
+  // print tagging info
+  printf("Tagged:         %s\n",
+        doc->getStructTreeRoot()->isDict() ? "yes" : "no");
+
+  // print form info
+  if ((acroForm = doc->getCatalog()->getAcroForm())->isDict()) {
+    acroForm->dictLookup("XFA", &xfa);
+    if (xfa.isStream() || xfa.isArray()) {
+      printf("Form:           XFA\n");
+    } else {
+      printf("Form:           AcroForm\n");
+    }
+    xfa.free();
+  } else {
+    printf("Form:           none\n");
+  }
+
+  // print page count
+  printf("Pages:          %d\n", doc->getNumPages());
+
+  // print encryption info
+  printf("Encrypted:      ");
+  if (doc->isEncrypted()) {
+    printf("yes (print:%s copy:%s change:%s addNotes:%s)\n",
+          doc->okToPrint(gTrue) ? "yes" : "no",
+          doc->okToCopy(gTrue) ? "yes" : "no",
+          doc->okToChange(gTrue) ? "yes" : "no",
+          doc->okToAddNotes(gTrue) ? "yes" : "no");
+  } else {
+    printf("no\n");
+  }
+
+  // print page size
+  for (pg = firstPage; pg <= lastPage; ++pg) {
+    w = doc->getPageCropWidth(pg);
+    h = doc->getPageCropHeight(pg);
+    if (multiPage) {
+      printf("Page %4d size: %g x %g pts", pg, w, h);
+    } else {
+      printf("Page size:      %g x %g pts", w, h);
+    }
+    if ((fabs(w - 612) < 0.1 && fabs(h - 792) < 0.1) ||
+       (fabs(w - 792) < 0.1 && fabs(h - 612) < 0.1)) {
+      printf(" (letter)");
+    } else {
+      hISO = sqrt(sqrt(2.0)) * 7200 / 2.54;
+      wISO = hISO / sqrt(2.0);
+      for (i = 0; i <= 6; ++i) {
+       if ((fabs(w - wISO) < 1 && fabs(h - hISO) < 1) ||
+           (fabs(w - hISO) < 1 && fabs(h - wISO) < 1)) {
+         printf(" (A%d)", i);
+         break;
+       }
+       hISO = wISO;
+       wISO /= sqrt(2.0);
+      }
+    }
+    printf("\n");
+    r = doc->getPageRotate(pg);
+    if (multiPage) {
+      printf("Page %4d rot:  %d\n", pg, r);
+    } else {
+      printf("Page rot:       %d\n", r);
+    }
+  } 
+
+  // print the boxes
+  if (printBoxes) {
+    if (multiPage) {
+      for (pg = firstPage; pg <= lastPage; ++pg) {
+       page = doc->getPage(pg);
+       if (!page) {
+          error(errSyntaxError, -1, "Failed to print boxes for page {0:d}", pg);
+         continue;
+       }
+       sprintf(buf, "Page %4d MediaBox: ", pg);
+       printBox(buf, page->getMediaBox());
+       sprintf(buf, "Page %4d CropBox:  ", pg);
+       printBox(buf, page->getCropBox());
+       sprintf(buf, "Page %4d BleedBox: ", pg);
+       printBox(buf, page->getBleedBox());
+       sprintf(buf, "Page %4d TrimBox:  ", pg);
+       printBox(buf, page->getTrimBox());
+       sprintf(buf, "Page %4d ArtBox:   ", pg);
+       printBox(buf, page->getArtBox());
+      }
+    } else {
+      page = doc->getPage(firstPage);
+      if (!page) {
+        error(errSyntaxError, -1, "Failed to print boxes for page {0:d}", firstPage);
+      } else {
+        printBox("MediaBox:       ", page->getMediaBox());
+        printBox("CropBox:        ", page->getCropBox());
+        printBox("BleedBox:       ", page->getBleedBox());
+        printBox("TrimBox:        ", page->getTrimBox());
+        printBox("ArtBox:         ", page->getArtBox());
+      }
+    }
+  }
+
+  // print file size
+#ifdef VMS
+  f = fopen(fileName->getCString(), "rb", "ctx=stm");
+#else
+  f = fopen(fileName->getCString(), "rb");
+#endif
+  if (f) {
+#if HAVE_FSEEKO
+    fseeko(f, 0, SEEK_END);
+    printf("File size:      %u bytes\n", (Guint)ftello(f));
+#elif HAVE_FSEEK64
+    fseek64(f, 0, SEEK_END);
+    printf("File size:      %u bytes\n", (Guint)ftell64(f));
+#else
+    fseek(f, 0, SEEK_END);
+    printf("File size:      %d bytes\n", (int)ftell(f));
+#endif
+    fclose(f);
+  }
+
+  // print linearization info
+  printf("Optimized:      %s\n", doc->isLinearized() ? "yes" : "no");
+
+  // print PDF version
+  printf("PDF version:    %d.%d\n", doc->getPDFMajorVersion(), doc->getPDFMinorVersion());
+
+  // print the metadata
+  if (printMetadata && (metadata = doc->readMetadata())) {
+    fputs("Metadata:\n", stdout);
+    fputs(metadata->getCString(), stdout);
+    fputc('\n', stdout);
+    delete metadata;
+  }
+
+  exitCode = 0;
+
+  // clean up
+ err2:
+  uMap->decRefCnt();
+  delete doc;
+  delete fileName;
+ err1:
+  delete globalParams;
+ err0:
+
+  // check for memory leaks
+  Object::memCheck(stderr);
+  gMemReport(stderr);
+
+  return exitCode;
+}
+
+static void printInfoString(Dict *infoDict, const char *key, const char *text,
+                           UnicodeMap *uMap) {
+  Object obj;
+  GooString *s1;
+  GBool isUnicode;
+  Unicode u, u2;
+  char buf[8];
+  int i, n;
+
+  if (infoDict->lookup(key, &obj)->isString()) {
+    fputs(text, stdout);
+    s1 = obj.getString();
+    if ((s1->getChar(0) & 0xff) == 0xfe &&
+       (s1->getChar(1) & 0xff) == 0xff) {
+      isUnicode = gTrue;
+      i = 2;
+    } else {
+      isUnicode = gFalse;
+      i = 0;
+    }
+    while (i < obj.getString()->getLength()) {
+      if (isUnicode) {
+       u = ((s1->getChar(i) & 0xff) << 8) |
+           (s1->getChar(i+1) & 0xff);
+       i += 2;
+       if (u >= 0xd800 && u <= 0xdbff && i < obj.getString()->getLength()) {
+         // surrogate pair
+         u2 = ((s1->getChar(i) & 0xff) << 8) |
+           (s1->getChar(i+1) & 0xff);
+         i += 2;
+         if (u2 >= 0xdc00 && u2 <= 0xdfff) {
+           u = 0x10000 + ((u - 0xd800) << 10) + (u2 - 0xdc00);
+         }
+       }
+      } else {
+       u = pdfDocEncoding[s1->getChar(i) & 0xff];
+       ++i;
+      }
+      n = uMap->mapUnicode(u, buf, sizeof(buf));
+      fwrite(buf, 1, n, stdout);
+    }
+    fputc('\n', stdout);
+  }
+  obj.free();
+}
+
+static void printInfoDate(Dict *infoDict, const char *key, const char *text) {
+  Object obj;
+  char *s;
+  int year, mon, day, hour, min, sec, tz_hour, tz_minute;
+  char tz;
+  struct tm tmStruct;
+  char buf[256];
+
+  if (infoDict->lookup(key, &obj)->isString()) {
+    fputs(text, stdout);
+    s = obj.getString()->getCString();
+    // TODO do something with the timezone info
+    if ( parseDateString( s, &year, &mon, &day, &hour, &min, &sec, &tz, &tz_hour, &tz_minute ) ) {
+      tmStruct.tm_year = year - 1900;
+      tmStruct.tm_mon = mon - 1;
+      tmStruct.tm_mday = day;
+      tmStruct.tm_hour = hour;
+      tmStruct.tm_min = min;
+      tmStruct.tm_sec = sec;
+      tmStruct.tm_wday = -1;
+      tmStruct.tm_yday = -1;
+      tmStruct.tm_isdst = -1;
+      // compute the tm_wday and tm_yday fields
+      if (mktime(&tmStruct) != (time_t)-1 &&
+         strftime(buf, sizeof(buf), "%c", &tmStruct)) {
+       fputs(buf, stdout);
+      } else {
+       fputs(s, stdout);
+      }
+    } else {
+      fputs(s, stdout);
+    }
+    fputc('\n', stdout);
+  }
+  obj.free();
+}
+
+static void printBox(const char *text, PDFRectangle *box) {
+  printf("%s%8.2f %8.2f %8.2f %8.2f\n",
+        text, box->x1, box->y1, box->x2, box->y2);
+}
diff --git a/utils/pdfseparate.1 b/utils/pdfseparate.1
new file mode 100644 (file)
index 0000000..077faec
--- /dev/null
@@ -0,0 +1,49 @@
+.\" Copyright 2011 The Poppler Developers - http://poppler.freedesktop.org
+.TH pdfseparate 1 "15 September 2011"
+.SH NAME
+pdfseparate \- Portable Document Format (PDF) page extractor
+.SH SYNOPSIS
+.B pdfseparate
+[options]
+.I PDF-file PDF-page-pattern
+.SH DESCRIPTION
+.B pdfseparate
+extract single pages from a Portable Document Format (PDF).
+.PP
+pdfseparate reads the PDF file
+.IR PDF-file ,
+extracts one or more pages, and writes one PDF file for each page to
+.IR PDF-page-pattern ,
+PDF-page-pattern should contain
+.BR %d .
+%d is replaced by the page number.
+.TP
+The PDF-file should not be encrypted.
+.SH OPTIONS
+.TP
+.BI \-f " number"
+Specifies the first page to extract. If \-f is omitted, extraction starts with page 1.
+.TP
+.BI \-l " number"
+Specifies the last page to extract. if \-p is omitted, extraction ends with the last page.
+.TP
+.B \-v
+Print copyright and version information.
+.TP
+.B \-h
+Print usage information.
+.RB ( \-help
+and
+.B \-\-help
+are equivalent.)
+.SH EXAMPLE
+pdfseparate sample.pdf sample-%d.pdf
+.TP
+extracts all pages from sample.pdf, if i.e. sample.pdf has 3 pages, it produces
+.TP
+sample-1.pdf, sample-2.pdf, sample-3.pdf
+.SH AUTHOR
+The pdfseparate software and documentation are copyright 1996-2004 Glyph
+& Cog, LLC and copyright 2005-2011 The Poppler Developers - http://poppler.freedesktop.org
+.SH "SEE ALSO"
+.BR pdfunite (1),
diff --git a/utils/pdfseparate.cc b/utils/pdfseparate.cc
new file mode 100644 (file)
index 0000000..25fac5a
--- /dev/null
@@ -0,0 +1,122 @@
+//========================================================================
+//
+// pdfseparate.cc
+//
+// This file is licensed under the GPLv2 or later
+//
+// Copyright (C) 2011, 2012 Thomas Freitag <Thomas.Freitag@alfa.de>
+// Copyright (C) 2012 Albert Astals Cid <aacid@kde.org>
+//
+//========================================================================
+#include "config.h"
+#include <poppler-config.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <stddef.h>
+#include <string.h>
+#include "parseargs.h"
+#include "goo/GooString.h"
+#include "PDFDoc.h"
+#include "ErrorCodes.h"
+#include "GlobalParams.h"
+
+static int firstPage = 0;
+static int lastPage = 0;
+static GBool printVersion = gFalse;
+static GBool printHelp = gFalse;
+
+static const ArgDesc argDesc[] = {
+  {"-f", argInt, &firstPage, 0,
+   "first page to extract"},
+  {"-l", argInt, &lastPage, 0,
+   "last page to extract"},
+  {"-v", argFlag, &printVersion, 0,
+   "print copyright and version info"},
+  {"-h", argFlag, &printHelp, 0,
+   "print usage information"},
+  {"-help", argFlag, &printHelp, 0,
+   "print usage information"},
+  {"--help", argFlag, &printHelp, 0,
+   "print usage information"},
+  {"-?", argFlag, &printHelp, 0,
+   "print usage information"},
+  {NULL}
+};
+
+bool extractPages (const char *srcFileName, const char *destFileName) {
+  char pathName[1024];
+  GooString *gfileName = new GooString (srcFileName);
+  PDFDoc *doc = new PDFDoc (gfileName, NULL, NULL, NULL);
+
+  if (!doc->isOk()) {
+    error(errSyntaxError, -1, "Could not extract page(s) from damaged file ('{0:s}')", srcFileName);
+    return false;
+  }
+  if (doc->isEncrypted()) {
+    error(errSyntaxError, -1, "Could not extract page(s) from encrypted file ('{0:s}')", srcFileName);
+    return false;
+  }
+
+  if (firstPage == 0 && lastPage == 0) {
+    firstPage = 1;
+    lastPage = doc->getNumPages();
+  }
+  if (lastPage == 0)
+    lastPage = doc->getNumPages();
+  if (firstPage == 0)
+    firstPage = 1;
+  if (firstPage != lastPage && strstr(destFileName, "%d") == NULL) {
+    error(errSyntaxError, -1, "'{0:s}' must contain '%%d' if more than one page should be extracted", destFileName);
+    return false;
+  }
+  for (int pageNo = firstPage; pageNo <= lastPage; pageNo++) {
+    sprintf (pathName, destFileName, pageNo);
+    GooString *gpageName = new GooString (pathName);
+    int errCode = doc->savePageAs(gpageName, pageNo);
+    if ( errCode != errNone) {
+      delete gpageName;
+      delete gfileName;
+      return false;
+    }
+    delete gpageName;
+  }
+  delete gfileName;
+  return true;
+}
+
+int
+main (int argc, char *argv[])
+{
+  Object info;
+  GBool ok;
+  int exitCode;
+
+  exitCode = 99;
+
+  // parse args
+  ok = parseArgs (argDesc, &argc, argv);
+  if (!ok || argc != 3 || printVersion || printHelp)
+    {
+      fprintf (stderr, "pdfseparate version %s\n", PACKAGE_VERSION);
+      fprintf (stderr, "%s\n", popplerCopyright);
+      fprintf (stderr, "%s\n", xpdfCopyright);
+      if (!printVersion)
+       {
+         printUsage ("pdfseparate", "<PDF-sourcefile> <PDF-pattern-destfile>",
+                     argDesc);
+       }
+      if (printVersion || printHelp)
+       exitCode = 0;
+      goto err0;
+    }
+  globalParams = new GlobalParams();
+  ok = extractPages (argv[1], argv[2]);
+  if (ok) {
+    exitCode = 0;
+  }
+  delete globalParams;
+
+err0:
+
+  return exitCode;
+}
diff --git a/utils/pdftocairo.1 b/utils/pdftocairo.1
new file mode 100644 (file)
index 0000000..19b62ef
--- /dev/null
@@ -0,0 +1,261 @@
+.TH pdftoppm 1
+.SH NAME
+pdftocairo \- Portable Document Format (PDF) to PNG/JPEG/PDF/PS/EPS/SVG using cairo
+.SH SYNOPSIS
+.B pdftocairo
+[options]
+.IR PDF-file
+.RI [ output-file ]
+.SH DESCRIPTION
+.B pdftocairo
+converts Portable Document Format (PDF) files, using the cairo output device of the poppler PDF library, to any of the following output formats:
+.IP \(bu
+Portable Network Graphics (PNG)
+.IP \(bu
+JPEG Interchange Format (JPEG)
+.IP \(bu
+Portable Document Format (PDF)
+.IP \(bu
+PostScript (PS)
+.IP \(bu
+Encapsulated PostScript (EPS)
+.IP \(bu
+Scalable Vector Graphics (SVG)
+.PP
+.B pdftocairo
+reads the PDF file,
+.IR PDF-file ,
+and writes to
+.IR output-file .
+The image formats (PNG and JPEG) generate one file per page with the page number and file type appended to
+.IR output-file
+(except when \-singlefile is used).
+When the output format is a vector format (PDF, PS, EPS, and SVG) or when \-singlefile is used,
+.IR output-file
+is the full filename.
+
+If the
+.IR PDF-file
+is \*(lq\-\*(rq , the PDF is read from stdin.
+If the
+.IR output-file
+is \*(lq\-\*(rq , the output file will be written to stdout. Using stdout is not valid with image formats unless \-singlefile is used.
+If
+.IR output-file
+is not used, the output filename will be derived from the
+.IR PDF-file
+filename.
+.PP
+Not all options are valid with all output formats. One (and only one) of the output format options (\-png, \-jpeg, \-pdf, \-ps, \-eps, or \-svg) must be used.
+.PP
+The resolution options (\-r, \-rx, \-ry) set the resolution of the
+image output formats. The image dimensions will depend on the PDF page
+size and the resolution. For the vector outputs, regions of the page
+that can not be represented natively in the output format (eg
+translucency in PS) will be rasterized at the resolution specified by
+the resolution options.
+.PP
+The \-scale-to options may be used to set a fixed image size. The
+image resolution will vary with the page size.
+.PP
+The cropping options (\-x, \-y, \-W, and \-H) use units of pixels with
+the image formats and PostScript points (1/72 inch) with the vector
+formats. When cropping is used with vector output the cropped region is
+centered unless \-nocenter is used in which case the cropped region is
+at the top left (SVG) or bottom left (PDF, PS, EPS).
+.PP
+.SH OPTIONS
+.TP
+.BI \-png
+Generates a PNG file(s)
+.TP
+.BI \-jpeg
+Generates a JPEG file(s)
+.TP
+.BI \-pdf
+Generates a PDF file
+.TP
+.BI \-ps
+Generate a PS file
+.TP
+.BI \-eps
+Generate an EPS file. An EPS file contains a single image, so if you
+use this option with a multi-page PDF file, you must use \-f and \-l
+to specify a single page.  The page size options (\-origpagesizes,
+\-paper, \-paperw, \-paperh) can not be used with this option.
+.TP
+.BI \-svg
+Generate a SVG (Scalable Vector Graphics) file
+.TP
+.BI \-f " number"
+Specifies the first page to convert.
+.TP
+.BI \-l " number"
+Specifies the last page to convert.
+.TP
+.B \-o
+Generates only the odd numbered pages.
+.TP
+.B \-e
+Generates only the even numbered pages.
+.TP
+.BI \-singlefile
+Writes only the first page and does not add digits.
+.TP
+.BI \-r " number"
+Specifies the X and Y resolution, in pixels per inch of image files (or rasterized regions in vector output). The default is 150 PPI.
+.TP
+.BI \-rx " number"
+Specifies the X resolution, in pixels per inch of image files (or rasterized regions in vector output). The default is 150 PPI.
+.TP
+.BI \-ry " number"
+Specifies the Y resolution, in pixels per inch of image files (or rasterized regions in vector output). The default is 150 PPI.
+.TP
+.BI \-scale-to " number"
+Scales the long side of each page (width for landscape pages, height
+for portrait pages) to fit in scale-to pixels. The size of the short
+side will be determined by the aspect ratio of the page (PNG/JPEG only).
+.TP
+.BI \-scale-to-x " number"
+Scales each page horizontally to fit in scale-to-x pixels. If
+scale-to-y is set to -1, the vertical size will determined by the
+aspect ratio of the page (PNG/JPEG only).
+.TP
+.BI \-scale-to-y " number"
+Scales each page vertically to fit in scale-to-y pixels. If scale-to-x
+is set to -1, the horizontal size will determined by the aspect ratio
+of the page (PNG/JPEG only).
+.TP
+.BI \-x " number"
+Specifies the x-coordinate of the crop area top left corner in pixels (image output) or points (vector output)
+.TP
+.BI \-y " number"
+Specifies the y-coordinate of the crop area top left corner in pixels (image output) or points (vector output)
+.TP
+.BI \-W " number"
+Specifies the width of crop area in pixels (image output) or points (vector output)  (default is 0)
+.TP
+.BI \-H " number"
+Specifies the height of crop area in pixels (image output) or points (vector output)  (default is 0)
+.TP
+.BI \-sz " number"
+Specifies the size of crop square in pixels (image output) or points (vector output)  (sets \-W and \-H)
+.TP
+.B \-cropbox
+Uses the crop box rather than media box when generating the files
+.TP
+.B \-mono
+Generate a monochrome file (PNG only).
+.TP
+.B \-gray
+Generate a grayscale file (PNG and JPEG only).
+.TP
+.B \-transp
+Use a transparent page color instead of white (PNG only).
+.TP
+.BI \-icc " icc-file"
+Use the specified ICC file as the output profile (PNG only). The profile will be embedded in the PNG file.
+.TP
+.B \-level2
+Generate Level 2 PostScript (PS only).
+.TP
+.B \-level3
+Generate Level 3 PostScript (PS only). This enables all Level 2 features plus
+shading patterns and masked images. This is the default setting.
+.TP
+.B \-origpagesizes
+Generate a file with variable page sizes and orientations (PS and PDF
+only). The size of each page will be the original page in the PDF
+file.  If the output is PS the file will contain %%DocumentMedia and
+%%PageMedia DSC comments specifying the size of each page.  Any
+specification of the page size via \-paper, \-paperw, or \-paperh will
+get overridden as long as each page of the PDF file has a defined
+paper size.
+.TP
+.BI \-paper " size"
+Set the paper size to one of "letter", "legal", "A4", or "A3"
+(PS,PDF,SVG only).  This can also be set to "match", which will set
+the paper size to match the size specified in the PDF
+file. \-origpagesizes overrides this setting if the PDF file has
+defined page sizes.
+.TP
+.BI \-paperw " size"
+Set the paper width, in points (PS,PDF,SVG only). \-origpagesizes overrides this setting
+if the PDF file has defined page sizes.
+.TP
+.BI \-paperh " size"
+Set the paper height, in points (PS,PDF,SVG only). \-origpagesizes overrides this setting
+if the PDF file has defined page sizes.
+.TP
+.B \-nocrop
+By default, output is cropped to the CropBox specified in the PDF
+file.  This option disables cropping.
+.TP
+.B \-expand
+Expand PDF pages smaller than the paper to fill the paper (PS,PDF,SVG only).  By
+default, these pages are not scaled.
+.TP
+.B \-noshrink
+Don't scale PDF pages which are larger than the paper (PS,PDF,SVG only).  By default,
+pages larger than the paper are shrunk to fit.
+.TP
+.B \-nocenter
+By default, PDF pages smaller than the paper (after any scaling) are
+centered on the paper.  This option causes them to be aligned to the
+lower-left corner of the paper instead (PS,PDF,SVG only).
+.TP
+.B \-duplex
+Adds the %%IncludeFeature: *Duplex DuplexNoTumble DSC comment to the
+PostScript file (PS only).  This tells the print manager to enable duplexing.
+.TP
+.BI \-opw " password"
+Specify the owner password for the PDF file.  Providing this will
+bypass all security restrictions.
+.TP
+.BI \-upw " password"
+Specify the user password for the PDF file.
+.TP
+.B \-q
+Don't print any messages or errors.
+.TP
+.B \-v
+Print copyright and version information.
+.TP
+.B \-h
+Print usage information.
+.RB ( \-help
+and
+.B \-\-help
+are equivalent.)
+.SH EXIT CODES
+The poppler tools use the following exit codes:
+.TP
+0
+No error.
+.TP
+1
+Error opening a PDF file.
+.TP
+2
+Error opening an output file.
+.TP
+3
+Error related to PDF permissions.
+.TP
+4
+Error related to ICC profile.
+.TP
+99
+Other error.
+.SH AUTHOR
+The pdftocairo software and documentation are copyright 1996-2004 Glyph
+& Cog, LLC and copyright 2005-2011 The Poppler Developers.
+.SH "SEE ALSO"
+.BR pdfdetach (1),
+.BR pdffonts (1),
+.BR pdfimages (1),
+.BR pdfinfo (1),
+.BR pdftohtml (1),
+.BR pdftoppm (1),
+.BR pdftops (1),
+.BR pdftotext (1)
diff --git a/utils/pdftocairo.cc b/utils/pdftocairo.cc
new file mode 100644 (file)
index 0000000..8d13e31
--- /dev/null
@@ -0,0 +1,1015 @@
+//========================================================================
+//
+// pdftocairo.cc
+//
+// Copyright 2003 Glyph & Cog, LLC
+//
+//========================================================================
+
+//========================================================================
+//
+// Modified under the Poppler project - http://poppler.freedesktop.org
+//
+// All changes made under the Poppler project to this file are licensed
+// under GPL version 2 or later
+//
+// Copyright (C) 2007 Ilmari Heikkinen <ilmari.heikkinen@gmail.com>
+// Copyright (C) 2008 Richard Airlie <richard.airlie@maglabs.net>
+// Copyright (C) 2009 Michael K. Johnson <a1237@danlj.org>
+// Copyright (C) 2009 Shen Liang <shenzhuxi@gmail.com>
+// Copyright (C) 2009 Stefan Thomas <thomas@eload24.com>
+// Copyright (C) 2009, 2010 Albert Astals Cid <aacid@kde.org>
+// Copyright (C) 2010, 2011, 2012 Adrian Johnson <ajohnson@redneon.com>
+// Copyright (C) 2010 Hib Eris <hib@hiberis.nl>
+// Copyright (C) 2010 Jonathan Liu <net147@gmail.com>
+// Copyright (C) 2010 William Bader <williambader@hotmail.com>
+// Copyright (C) 2011 Thomas Freitag <Thomas.Freitag@alfa.de>
+// Copyright (C) 2011 Carlos Garcia Campos <carlosgc@gnome.org>
+// Copyright (C) 2012 Koji Otani <sho@bbr.jp>
+//
+// To see a description of the changes please see the Changelog file that
+// came with your tarball or type make ChangeLog if you are building from git
+//
+//========================================================================
+
+#include "config.h"
+#include <poppler-config.h>
+#include <stdio.h>
+#include <math.h>
+#include <string.h>
+#include "parseargs.h"
+#include "goo/gmem.h"
+#include "goo/gtypes.h"
+#include "goo/gtypes_p.h"
+#include "goo/GooString.h"
+#include "goo/ImgWriter.h"
+#include "goo/JpegWriter.h"
+#include "goo/PNGWriter.h"
+#include "GlobalParams.h"
+#include "Object.h"
+#include "PDFDoc.h"
+#include "PDFDocFactory.h"
+#include "CairoOutputDev.h"
+#if USE_CMS
+#ifdef USE_LCMS1
+#include <lcms.h>
+#else
+#include <lcms2.h>
+#endif
+#endif
+#include <cairo.h>
+#if CAIRO_HAS_PS_SURFACE
+#include <cairo-ps.h>
+#endif
+#if CAIRO_HAS_PDF_SURFACE
+#include <cairo-pdf.h>
+#endif
+#if CAIRO_HAS_SVG_SURFACE
+#include <cairo-svg.h>
+#endif
+
+
+static GBool png = gFalse;
+static GBool jpeg = gFalse;
+static GBool ps = gFalse;
+static GBool eps = gFalse;
+static GBool pdf = gFalse;
+static GBool svg = gFalse;
+
+static int firstPage = 1;
+static int lastPage = 0;
+static GBool printOnlyOdd = gFalse;
+static GBool printOnlyEven = gFalse;
+static GBool singleFile = gFalse;
+static double resolution = 0.0;
+static double x_resolution = 150.0;
+static double y_resolution = 150.0;
+static int scaleTo = 0;
+static int x_scaleTo = 0;
+static int y_scaleTo = 0;
+static int crop_x = 0;
+static int crop_y = 0;
+static int crop_w = 0;
+static int crop_h = 0;
+static int sz = 0;
+static GBool useCropBox = gFalse;
+static GBool mono = gFalse;
+static GBool gray = gFalse;
+static GBool transp = gFalse;
+static GooString icc;
+
+static GBool level2 = gFalse;
+static GBool level3 = gFalse;
+static GBool doOrigPageSizes = gFalse;
+static char paperSize[15] = "";
+static int paperWidth = -1;
+static int paperHeight = -1;
+static GBool noCrop = gFalse;
+static GBool expand = gFalse;
+static GBool noShrink = gFalse;
+static GBool noCenter = gFalse;
+static GBool duplex = gFalse;
+
+static char ownerPassword[33] = "";
+static char userPassword[33] = "";
+static GBool quiet = gFalse;
+static GBool printVersion = gFalse;
+static GBool printHelp = gFalse;
+
+static const ArgDesc argDesc[] = {
+#if ENABLE_LIBPNG
+  {"-png",    argFlag,     &png,           0,
+   "generate a PNG file"},
+#endif
+#if ENABLE_LIBJPEG
+  {"-jpeg",   argFlag,     &jpeg,           0,
+   "generate a JPEG file"},
+#endif
+#if CAIRO_HAS_PS_SURFACE
+  {"-ps",     argFlag,     &ps,            0,
+   "generate PostScript file"},
+  {"-eps",        argFlag,     &eps,          0,
+   "generate Encapsulated PostScript (EPS)"},
+#endif
+#if CAIRO_HAS_PDF_SURFACE
+  {"-pdf",    argFlag,     &pdf,           0,
+   "generate a PDF file"},
+#endif
+#if CAIRO_HAS_SVG_SURFACE
+  {"-svg",    argFlag,     &svg,           0,
+   "generate a Scalable Vector Graphics (SVG) file"},
+#endif
+
+  {"-f",      argInt,      &firstPage,     0,
+   "first page to print"},
+  {"-l",      argInt,      &lastPage,      0,
+   "last page to print"},
+  {"-o",      argFlag,      &printOnlyOdd, 0,
+   "print only odd pages"},
+  {"-e",      argFlag,      &printOnlyEven, 0,
+   "print only even pages"},
+  {"-singlefile", argFlag,  &singleFile,   0,
+   "write only the first page and do not add digits"},
+
+  {"-r",      argFP,       &resolution,    0,
+   "resolution, in PPI (default is 150)"},
+  {"-rx",      argFP,       &x_resolution,    0,
+   "X resolution, in PPI (default is 150)"},
+  {"-ry",      argFP,       &y_resolution,    0,
+   "Y resolution, in PPI (default is 150)"},
+  {"-scale-to",      argInt,       &scaleTo,    0,
+   "scales each page to fit within scale-to*scale-to pixel box"},
+  {"-scale-to-x",      argInt,       &x_scaleTo,    0,
+   "scales each page horizontally to fit in scale-to-x pixels"},
+  {"-scale-to-y",      argInt,       &y_scaleTo,    0,
+   "scales each page vertically to fit in scale-to-y pixels"},
+
+  {"-x",      argInt,      &crop_x,             0,
+   "x-coordinate of the crop area top left corner"},
+  {"-y",      argInt,      &crop_y,             0,
+   "y-coordinate of the crop area top left corner"},
+  {"-W",      argInt,      &crop_w,             0,
+   "width of crop area in pixels (default is 0)"},
+  {"-H",      argInt,      &crop_h,             0,
+   "height of crop area in pixels (default is 0)"},
+  {"-sz",     argInt,      &sz,            0,
+   "size of crop square in pixels (sets W and H)"},
+  {"-cropbox",argFlag,     &useCropBox,    0,
+   "use the crop box rather than media box"},
+
+  {"-mono",   argFlag,     &mono,          0,
+   "generate a monochrome image file (PNG, JPEG)"},
+  {"-gray",   argFlag,     &gray,          0,
+   "generate a grayscale image file (PNG, JPEG)"},
+  {"-transp",   argFlag,     &transp,          0,
+   "use a transparent background instead of white (PNG)"},
+#if USE_CMS
+  {"-icc",   argGooString,     &icc,          0,
+   "ICC color profile to use"},
+#endif
+
+  {"-level2",     argFlag,     &level2,         0,
+   "generate Level 2 PostScript (PS, EPS)"},
+  {"-level3",     argFlag,     &level3,         0,
+   "generate Level 3 PostScript (PS, EPS)"},
+  {"-origpagesizes",argFlag,   &doOrigPageSizes,0,
+   "conserve original page sizes (PS, PDF, SVG)"},
+  {"-paper",      argString,   paperSize,       sizeof(paperSize),
+   "paper size (letter, legal, A4, A3, match)"},
+  {"-paperw",     argInt,      &paperWidth,     0,
+   "paper width, in points"},
+  {"-paperh",     argInt,      &paperHeight,    0,
+   "paper height, in points"},
+  {"-nocrop",     argFlag,     &noCrop,         0,
+   "don't crop pages to CropBox"},
+  {"-expand",     argFlag,     &expand,         0,
+   "expand pages smaller than the paper size"},
+  {"-noshrink",   argFlag,     &noShrink,       0,
+   "don't shrink pages larger than the paper size"},
+  {"-nocenter",   argFlag,     &noCenter,       0,
+   "don't center pages smaller than the paper size"},
+  {"-duplex",     argFlag,     &duplex,         0,
+   "enable duplex printing"},
+
+  {"-opw",    argString,   ownerPassword,  sizeof(ownerPassword),
+   "owner password (for encrypted files)"},
+  {"-upw",    argString,   userPassword,   sizeof(userPassword),
+   "user password (for encrypted files)"},
+
+  {"-q",      argFlag,     &quiet,         0,
+   "don't print any messages or errors"},
+  {"-v",      argFlag,     &printVersion,  0,
+   "print copyright and version info"},
+  {"-h",      argFlag,     &printHelp,     0,
+   "print usage information"},
+  {"-help",   argFlag,     &printHelp,     0,
+   "print usage information"},
+  {"--help",  argFlag,     &printHelp,     0,
+   "print usage information"},
+  {"-?",      argFlag,     &printHelp,     0,
+   "print usage information"},
+  {NULL}
+};
+
+
+static  cairo_surface_t *surface;
+static  GBool printing;
+static  FILE *output_file;
+
+#if USE_CMS
+static unsigned char *icc_data;
+static int icc_data_size;
+static cmsHPROFILE profile;
+#endif
+
+
+void writePageImage(GooString *filename)
+{
+  ImgWriter *writer = 0;
+  FILE *file;
+  int height, width, stride;
+  unsigned char *data;
+
+  if (png) {
+#if ENABLE_LIBPNG
+    if (transp)
+      writer = new PNGWriter(PNGWriter::RGBA);
+    else if (gray)
+      writer = new PNGWriter(PNGWriter::GRAY);
+    else if (mono)
+      writer = new PNGWriter(PNGWriter::MONOCHROME);
+    else
+      writer = new PNGWriter(PNGWriter::RGB);
+
+#if USE_CMS
+#ifdef USE_LCMS1
+    if (icc_data)
+      static_cast<PNGWriter*>(writer)->setICCProfile(cmsTakeProductName(profile), icc_data, icc_data_size);
+    else
+      static_cast<PNGWriter*>(writer)->setSRGBProfile();
+#else
+    if (icc_data) {
+      cmsUInt8Number profileID[17];
+      profileID[16] = '\0';
+
+      cmsGetHeaderProfileID(profile,profileID);
+      static_cast<PNGWriter*>(writer)->setICCProfile(reinterpret_cast<char *>(profileID), icc_data, icc_data_size);
+    } else {
+      static_cast<PNGWriter*>(writer)->setSRGBProfile();
+    }
+#endif
+#endif
+#endif
+
+  } else if (jpeg) {
+#if ENABLE_LIBJPEG
+    if (gray)
+      writer = new JpegWriter(JCS_GRAYSCALE);
+    else
+      writer = new JpegWriter(JCS_RGB);
+#endif
+  }
+  if (!writer)
+    return;
+
+  if (filename->cmp("fd://0") == 0)
+    file = stdout;
+  else
+    file = fopen(filename->getCString(), "wb");
+
+  if (!file) {
+    fprintf(stderr, "Error opening output file %s\n", filename->getCString());
+    exit(2);
+  }
+
+  height = cairo_image_surface_get_height(surface);
+  width = cairo_image_surface_get_width(surface);
+  stride = cairo_image_surface_get_stride(surface);
+  data = cairo_image_surface_get_data(surface);
+
+  if (!writer->init(file, width, height, x_resolution, y_resolution)) {
+    fprintf(stderr, "Error writing %s\n", filename->getCString());
+    exit(2);
+  }
+  unsigned char *row = (unsigned char *) gmallocn(width, 4);
+
+  for (int y = 0; y < height; y++ ) {
+    uint32_t *pixel = (uint32_t *) (data + y*stride);
+    unsigned char *rowp = row;
+    for (int x = 0; x < width; x++, pixel++) {
+      if (transp) {
+       // unpremultiply into RGBA format
+       uint8_t a;
+       a = (*pixel & 0xff000000) >> 24;
+       if (a == 0) {
+         *rowp++ = 0;
+         *rowp++ = 0;
+         *rowp++ = 0;
+       } else {
+         *rowp++ = (((*pixel & 0xff0000) >> 16) * 255 + a / 2) / a;
+         *rowp++ = (((*pixel & 0x00ff00) >>  8) * 255 + a / 2) / a;
+         *rowp++ = (((*pixel & 0x0000ff) >>  0) * 255 + a / 2) / a;
+       }
+       *rowp++ = a;
+      } else if (gray || mono) {
+       // convert to gray
+        // The PDF Reference specifies the DeviceRGB to DeviceGray conversion as
+       // gray = 0.3*red + 0.59*green + 0.11*blue
+       int r = (*pixel & 0x00ff0000) >> 16;
+       int g = (*pixel & 0x0000ff00) >>  8;
+       int b = (*pixel & 0x000000ff) >>  0;
+       // an arbitrary integer approximation of .3*r + .59*g + .11*b
+       int y = (r*19661+g*38666+b*7209 + 32829)>>16;
+       *rowp++ = y;
+      } else {
+       // copy into RGB format
+       *rowp++ = (*pixel & 0x00ff0000) >> 16;
+       *rowp++ = (*pixel & 0x0000ff00) >>  8;
+       *rowp++ = (*pixel & 0x000000ff) >>  0;
+      }
+    }
+    writer->writeRow(&row);
+  }
+  gfree(row);
+  writer->close();
+  delete writer;
+  if (file == stdout) fflush(file);
+  else fclose(file);
+}
+
+static void getCropSize(double page_w, double page_h, double *width, double *height)
+{
+  int w = crop_w;
+  int h = crop_h;
+
+  if (w == 0)
+    w = (int)ceil(page_w);
+
+  if (h == 0)
+    h = (int)ceil(page_h);
+
+  *width =  (crop_x + w > page_w ? (int)ceil(page_w - crop_x) : w);
+  *height = (crop_y + h > page_h ? (int)ceil(page_h - crop_y) : h);
+}
+
+static void getOutputSize(double page_w, double page_h, double *width, double *height)
+{
+
+  if (printing) {
+    if (doOrigPageSizes) {
+      *width = page_w;
+      *height = page_h;
+    } else {
+      *width = paperWidth;
+      *height = paperHeight;
+    }
+  } else {
+    getCropSize(page_w * (x_resolution / 72.0),
+               page_h * (y_resolution / 72.0),
+               width, height);
+  }
+}
+
+static void getFitToPageTransform(double page_w, double page_h,
+                                 double paper_w, double paper_h,
+                                 cairo_matrix_t *m)
+{
+  double x_scale, y_scale, scale;
+
+  x_scale = paper_w / page_w;
+  y_scale = paper_h / page_h;
+  if (x_scale < y_scale)
+    scale = x_scale;
+  else
+    scale = y_scale;
+
+  cairo_matrix_init_identity (m);
+  if (scale > 1.0) {
+    // page is smaller than paper
+    if (expand) {
+      // expand to fit
+      cairo_matrix_scale (m, scale, scale);
+    } else if (!noCenter) {
+      // centre page
+      cairo_matrix_translate (m, (paper_w - page_w)/2, (paper_h - page_h)/2);
+    } else {
+      if (!svg) {
+       // move to PostScript origin
+       cairo_matrix_translate (m, 0, (paper_h - page_h));
+      }
+    }
+  } else if (scale < 1.0)
+    // page is larger than paper
+    if (!noShrink) {
+      // shrink to fit
+      cairo_matrix_scale (m, scale, scale);
+    }
+}
+
+static cairo_status_t writeStream(void *closure, const unsigned char *data, unsigned int length)
+{
+  FILE *file = (FILE *)closure;
+
+  if (fwrite(data, length, 1, file) == 1)
+    return CAIRO_STATUS_SUCCESS;
+  else
+    return CAIRO_STATUS_WRITE_ERROR;
+}
+
+static void beginDocument(GooString *outputFileName, double w, double h)
+{
+  if (printing) {
+    if (outputFileName->cmp("fd://0") == 0)
+      output_file = stdout;
+    else
+      output_file = fopen(outputFileName->getCString(), "wb");
+
+    if (ps || eps) {
+#if CAIRO_HAS_PS_SURFACE
+      surface = cairo_ps_surface_create_for_stream(writeStream, output_file, w, h);
+      if (level2)
+       cairo_ps_surface_restrict_to_level (surface, CAIRO_PS_LEVEL_2);
+      if (eps)
+       cairo_ps_surface_set_eps (surface, 1);
+      if (duplex) {
+       cairo_ps_surface_dsc_comment(surface, "%%Requirements: duplex");
+       cairo_ps_surface_dsc_begin_setup(surface);
+       cairo_ps_surface_dsc_comment(surface, "%%IncludeFeature: *Duplex DuplexNoTumble");
+      }
+      cairo_ps_surface_dsc_begin_page_setup (surface);
+#endif
+    } else if (pdf) {
+#if CAIRO_HAS_PDF_SURFACE
+      surface = cairo_pdf_surface_create_for_stream(writeStream, output_file, w, h);
+#endif
+    } else if (svg) {
+#if CAIRO_HAS_SVG_SURFACE
+      surface = cairo_svg_surface_create_for_stream(writeStream, output_file, w, h);
+      cairo_svg_surface_restrict_to_version (surface, CAIRO_SVG_VERSION_1_2);
+#endif
+    }
+  }
+}
+
+static void beginPage(double w, double h)
+{
+  if (printing) {
+    if (ps || eps) {
+#if CAIRO_HAS_PS_SURFACE
+      if (w > h) {
+       cairo_ps_surface_dsc_comment (surface, "%%PageOrientation: Landscape");
+       cairo_ps_surface_set_size (surface, h, w);
+      } else {
+       cairo_ps_surface_dsc_comment (surface, "%%PageOrientation: Portrait");
+       cairo_ps_surface_set_size (surface, w, h);
+      }
+#endif
+    }
+
+#if CAIRO_HAS_PDF_SURFACE
+    if (pdf)
+      cairo_pdf_surface_set_size (surface, w, h);
+#endif
+
+    cairo_surface_set_fallback_resolution (surface, x_resolution, y_resolution);
+
+  } else {
+    surface = cairo_image_surface_create(CAIRO_FORMAT_ARGB32, ceil(w), ceil(h));
+  }
+}
+
+static void renderPage(PDFDoc *doc, CairoOutputDev *cairoOut, int pg,
+                      double page_w, double page_h,
+                      double output_w, double output_h)
+{
+  cairo_t *cr;
+  cairo_status_t status;
+  cairo_matrix_t m;
+
+  cr = cairo_create(surface);
+  cairoOut->setCairo(cr);
+  cairoOut->setPrinting(printing);
+
+  cairo_save(cr);
+  if (ps && output_w > output_h) {
+    // rotate 90 deg for landscape
+    cairo_translate (cr, 0, output_w);
+    cairo_matrix_init (&m, 0, -1, 1, 0, 0, 0);
+    cairo_transform (cr, &m);
+  }
+  cairo_translate (cr, -crop_x, -crop_y);
+  if (printing) {
+    double cropped_w, cropped_h;
+    getCropSize(page_w, page_h, &cropped_w, &cropped_h);
+    getFitToPageTransform(cropped_w, cropped_h, output_w, output_h, &m);
+    cairo_transform (cr, &m);
+    cairo_rectangle(cr, crop_x, crop_y, cropped_w, cropped_h);
+    cairo_clip(cr);
+  } else {
+    cairo_scale (cr, x_resolution/72.0, y_resolution/72.0);
+  }
+  doc->displayPageSlice(cairoOut,
+                       pg,
+                       72.0, 72.0,
+                       0, /* rotate */
+                       !useCropBox, /* useMediaBox */
+                       gFalse, /* Crop */
+                       printing,
+                       -1, -1, -1, -1);
+  cairo_restore(cr);
+  cairoOut->setCairo(NULL);
+
+  // Blend onto white page
+  if (!printing && !transp) {
+    cairo_save(cr);
+    cairo_set_operator(cr, CAIRO_OPERATOR_DEST_OVER);
+    cairo_set_source_rgb(cr, 1, 1, 1);
+    cairo_paint(cr);
+    cairo_restore(cr);
+  }
+
+  status = cairo_status(cr);
+  if (status)
+      error(errInternal, -1, "cairo error: {0:s}\n", cairo_status_to_string(status));
+  cairo_destroy (cr);
+}
+
+static void endPage(GooString *imageFileName)
+{
+  cairo_status_t status;
+
+  if (printing) {
+    cairo_surface_show_page(surface);
+  } else {
+    writePageImage(imageFileName);
+    cairo_surface_finish(surface);
+    status = cairo_surface_status(surface);
+    if (status)
+      error(errInternal, -1, "cairo error: {0:s}\n", cairo_status_to_string(status));
+    cairo_surface_destroy(surface);
+  }
+
+}
+
+static void endDocument()
+{
+  cairo_status_t status;
+
+  if (printing) {
+    cairo_surface_finish(surface);
+    status = cairo_surface_status(surface);
+    if (status)
+      error(errInternal, -1, "cairo error: {0:s}\n", cairo_status_to_string(status));
+    cairo_surface_destroy(surface);
+    fclose(output_file);
+  }
+}
+
+static GBool setPSPaperSize(char *size, int &psPaperWidth, int &psPaperHeight) {
+  if (!strcmp(size, "match")) {
+    psPaperWidth = psPaperHeight = -1;
+  } else if (!strcmp(size, "letter")) {
+    psPaperWidth = 612;
+    psPaperHeight = 792;
+  } else if (!strcmp(size, "legal")) {
+    psPaperWidth = 612;
+    psPaperHeight = 1008;
+  } else if (!strcmp(size, "A4")) {
+    psPaperWidth = 595;
+    psPaperHeight = 842;
+  } else if (!strcmp(size, "A3")) {
+    psPaperWidth = 842;
+    psPaperHeight = 1190;
+  } else {
+    return gFalse;
+  }
+  return gTrue;
+}
+
+static int numberOfCharacters(unsigned int n)
+{
+  int charNum = 0;
+  while (n >= 10)
+  {
+    n = n / 10;
+    charNum++;
+  }
+  charNum++;
+  return charNum;
+}
+
+static GooString *getImageFileName(GooString *outputFileName, int numDigits, int page)
+{
+  char buf[10];
+  GooString *imageName = new GooString(outputFileName);
+  if (!singleFile) {
+    snprintf(buf, sizeof(buf), "-%0*d", numDigits, page);
+    imageName->appendf(buf);
+  }
+  if (png)
+    imageName->append(".png");
+  else if (jpeg)
+    imageName->append(".jpg");
+
+  return imageName;
+}
+
+// If (printing || singleFile) the output file name includes the
+// extension. Otherwise it is the file name base.
+static GooString *getOutputFileName(GooString *fileName, GooString *outputName)
+{
+  GooString *name;
+  char *s;
+  char *p;
+
+  if (outputName) {
+    if (outputName->cmp("-") == 0) {
+      if (!printing && !singleFile) {
+       fprintf(stderr, "Error: stdout may only be used with the ps, eps, pdf, svg output options or if -singlefile is used.\n");
+       exit(99);
+      }
+      return new GooString("fd://0");
+    }
+    return new GooString(outputName);
+  }
+
+  if (fileName->cmp("fd://0") == 0) {
+    fprintf(stderr, "Error: an output filename or '-' must be supplied when the PDF file is stdin.\n");
+    exit(99);
+  }
+
+  // be careful not to overwrite the input file when the output format is PDF
+  if (pdf && fileName->cmpN("http://", 7) != 0 && fileName->cmpN("https://", 8) != 0) {
+    fprintf(stderr, "Error: an output filename or '-' must be supplied when the output format is PDF and input PDF file is a local file.\n");
+    exit(99);
+  }
+
+  // strip everything up to last '/'
+  s = fileName->getCString();
+  p = strrchr(s, '/');
+  if (p) {
+    p++;
+    if (*p == 0) {
+      fprintf(stderr, "Error: invalid output filename.\n");
+      exit(99);
+    }
+    name = new GooString(p);
+  } else {
+    name = new GooString(s);
+  }
+
+  // remove .pdf extension
+  p = strrchr(name->getCString(), '.');
+  if (p && strcasecmp(p, ".pdf") == 0) {
+    GooString *name2 = new GooString(name->getCString(), name->getLength() - 4);
+    delete name;
+    name = name2;
+  }
+
+  // append new extension
+  if (ps)
+    name->append(".ps");
+  else if (eps)
+    name->append(".eps");
+  else if (pdf)
+    name->append(".pdf");
+  else if (svg)
+    name->append(".svg");
+
+  return name;
+}
+
+static void checkInvalidPrintOption(GBool option, const char *option_name)
+{
+  if (option) {
+    fprintf(stderr, "Error: %s may only be used with the -png or -jpeg output options.\n", option_name);
+    exit(99);
+  }
+}
+
+static void checkInvalidImageOption(GBool option, const char *option_name)
+{
+  if (option) {
+    fprintf(stderr, "Error: %s may only be used with the -ps, -eps, -pdf, or -svg output options.\n", option_name);
+    exit(99);
+  }
+}
+
+int main(int argc, char *argv[]) {
+  PDFDoc *doc;
+  GooString *fileName = NULL;
+  GooString *outputName = NULL;
+  GooString *outputFileName = NULL;
+  GooString *imageFileName = NULL;
+  GooString *ownerPW, *userPW;
+  CairoOutputDev *cairoOut;
+  int pg, pg_num_len;
+  double pg_w, pg_h, tmp, output_w, output_h;
+  int num_outputs;
+
+  // parse args
+  if (!parseArgs(argDesc, &argc, argv))
+    exit(99);
+
+  if ( resolution != 0.0 &&
+       (x_resolution == 150.0 ||
+        y_resolution == 150.0)) {
+    x_resolution = resolution;
+    y_resolution = resolution;
+  }
+  if (argc < 2 || argc > 3 || printVersion || printHelp) {
+    fprintf(stderr, "pdftocairo version %s\n", PACKAGE_VERSION);
+    fprintf(stderr, "%s\n", popplerCopyright);
+    fprintf(stderr, "%s\n", xpdfCopyright);
+    if (!printVersion) {
+      printUsage("pdftocairo", "<PDF-file> [<output-file>]", argDesc);
+    }
+    if (printVersion || printHelp)
+      exit(0);
+    else
+      exit(99);
+  }
+
+  num_outputs = (png ? 1 : 0) +
+                (jpeg ? 1 : 0) +
+                (ps ? 1 : 0) +
+                (eps ? 1 : 0) +
+                (pdf ? 1 : 0) +
+                (svg ? 1 : 0);
+  if (num_outputs == 0) {
+    fprintf(stderr, "Error: one of the output format options (-png, -jpeg, -ps, -eps, -pdf, -svg) must be used.\n");
+    exit(99);
+  }
+  if (num_outputs > 1) {
+    fprintf(stderr, "Error: use only one of the output format options (-png, -jpeg, -ps, -eps, -pdf, -svg).\n");
+    exit(99);
+  }
+  if (png || jpeg)
+    printing = gFalse;
+  else
+    printing = gTrue;
+
+  if (printing) {
+    checkInvalidPrintOption(mono, "-mono");
+    checkInvalidPrintOption(gray, "-gray");
+    checkInvalidPrintOption(transp, "-transp");
+    checkInvalidPrintOption(icc.getCString()[0], "-icc");
+    checkInvalidPrintOption(singleFile, "-singlefile");
+  } else {
+    checkInvalidImageOption(level2, "-level2");
+    checkInvalidImageOption(level3, "-level3");
+    checkInvalidImageOption(doOrigPageSizes, "-origpagesizes");
+    checkInvalidImageOption(paperSize[0], "-paper");
+    checkInvalidImageOption(paperWidth > 0, "-paperw");
+    checkInvalidImageOption(paperHeight > 0, "-paperh");
+    checkInvalidImageOption(noCrop, "-nocrop");
+    checkInvalidImageOption(expand, "-expand");
+    checkInvalidImageOption(noShrink, "-noshrink");
+    checkInvalidImageOption(noCenter, "-nocenter");
+    checkInvalidImageOption(duplex, "-duplex");
+  }
+
+  if (icc.getCString()[0] && !png) {
+    fprintf(stderr, "Error: -icc may only be used with png output.\n");
+    exit(99);
+  }
+
+  if (transp && !png) {
+    fprintf(stderr, "Error: -transp may only be used with png output.\n");
+    exit(99);
+  }
+
+  if (mono && gray) {
+    fprintf(stderr, "Error: -mono and -gray may not be used together.\n");
+    exit(99);
+  }
+
+  if (mono && !png) {
+    fprintf(stderr, "Error: -mono may only be used with png output.\n");
+    exit(99);
+  }
+
+  if (level2 && level3) {
+    fprintf(stderr, "Error: use only one of the 'level' options.\n");
+    exit(99);
+  }
+  if (!level2 && !level3)
+    level3 = gTrue;
+
+  if (eps && (doOrigPageSizes || paperSize[0] || paperWidth > 0 || paperHeight > 0)) {
+    fprintf(stderr, "Error: page size options may not be used with eps output.\n");
+    exit(99);
+  }
+
+  if (paperSize[0]) {
+    if (!setPSPaperSize(paperSize, paperWidth, paperHeight)) {
+      fprintf(stderr, "Invalid paper size\n");
+      exit(99);
+    }
+  }
+
+  globalParams = new GlobalParams();
+  if (quiet) {
+    globalParams->setErrQuiet(quiet);
+  }
+
+  // open PDF file
+  if (ownerPassword[0]) {
+    ownerPW = new GooString(ownerPassword);
+  } else {
+    ownerPW = NULL;
+  }
+  if (userPassword[0]) {
+    userPW = new GooString(userPassword);
+  } else {
+    userPW = NULL;
+  }
+
+  fileName = new GooString(argv[1]);
+  if (fileName->cmp("-") == 0) {
+    delete fileName;
+    fileName = new GooString("fd://0");
+  }
+  if (argc == 3)
+    outputName = new GooString(argv[2]);
+  else
+    outputName = NULL;
+
+  outputFileName = getOutputFileName(fileName, outputName);
+
+#if USE_CMS
+  icc_data = NULL;
+  if (icc.getCString()[0]) {
+    FILE *file = fopen(icc.getCString(), "rb");
+    if (!file) {
+      fprintf(stderr, "Error: unable to open icc profile %s\n", icc.getCString());
+      exit(4);
+    }
+    fseek (file, 0, SEEK_END);
+    icc_data_size = ftell(file);
+    fseek (file, 0, SEEK_SET);
+    icc_data = (unsigned char*)gmalloc(icc_data_size);
+    if (fread(icc_data, icc_data_size, 1, file) != 1) {
+      fprintf(stderr, "Error: unable to read icc profile %s\n", icc.getCString());
+      exit(4);
+    }
+    fclose(file);
+    profile = cmsOpenProfileFromMem(icc_data, icc_data_size);
+    if (!profile) {
+      fprintf(stderr, "Error: lcms error opening profile\n");
+      exit(4);
+    }
+  } else {
+    profile = cmsCreate_sRGBProfile();
+  }
+  GfxColorSpace::setDisplayProfile(profile);
+#endif
+
+  doc = PDFDocFactory().createPDFDoc(*fileName, ownerPW, userPW);
+  if (!doc->isOk()) {
+    fprintf(stderr, "Error opening PDF file.\n");
+    exit(1);
+  }
+
+#ifdef ENFORCE_PERMISSIONS
+  // check for print permission
+  if (printing && !doc->okToPrint()) {
+    fprintf(stderr, "Printing this document is not allowed.\n");
+    exit(3);
+  }
+#endif
+
+  // get page range
+  if (firstPage < 1)
+    firstPage = 1;
+  if (singleFile && lastPage < 1)
+    lastPage = firstPage;
+  if (lastPage < 1 || lastPage > doc->getNumPages())
+    lastPage = doc->getNumPages();
+
+  if (eps && firstPage != lastPage) {
+    fprintf(stderr, "EPS files can only contain one page.\n");
+    exit(99);
+  }
+
+  if (singleFile && firstPage < lastPage) {
+    if (!quiet) {
+      fprintf(stderr,
+        "Warning: Single file will write only the first of the %d pages.\n",
+        lastPage + 1 - firstPage);
+    }
+    lastPage = firstPage;
+  }
+
+  // Make sure firstPage is always used so that beginDocument() is called
+  if ((printOnlyEven && firstPage % 2 == 0) || (printOnlyOdd && firstPage % 2 == 1))
+    firstPage++;
+
+  cairoOut = new CairoOutputDev();
+  cairoOut->startDoc(doc);
+  if (sz != 0)
+    crop_w = crop_h = sz;
+  pg_num_len = numberOfCharacters(doc->getNumPages());
+  for (pg = firstPage; pg <= lastPage; ++pg) {
+    if (printOnlyEven && pg % 2 == 0) continue;
+    if (printOnlyOdd && pg % 2 == 1) continue;
+    if (useCropBox) {
+      pg_w = doc->getPageCropWidth(pg);
+      pg_h = doc->getPageCropHeight(pg);
+    } else {
+      pg_w = doc->getPageMediaWidth(pg);
+      pg_h = doc->getPageMediaHeight(pg);
+    }
+
+    if (printing && pg == firstPage) {
+      if (paperWidth < 0 || paperHeight < 0) {
+       paperWidth = (int)ceil(pg_w);
+       paperHeight = (int)ceil(pg_h);
+      }
+    }
+
+    if (scaleTo != 0) {
+      resolution = (72.0 * scaleTo) / (pg_w > pg_h ? pg_w : pg_h);
+      x_resolution = y_resolution = resolution;
+    } else {
+      if (x_scaleTo > 0) {
+        x_resolution = (72.0 * x_scaleTo) / pg_w;
+        if (y_scaleTo == -1)
+          y_resolution = x_resolution;
+      }
+      if (y_scaleTo > 0) {
+        y_resolution = (72.0 * y_scaleTo) / pg_h;
+        if (x_scaleTo == -1)
+          x_resolution = y_resolution;
+      }
+    }
+    if ((doc->getPageRotate(pg) == 90) || (doc->getPageRotate(pg) == 270)) {
+      tmp = pg_w;
+      pg_w = pg_h;
+      pg_h = tmp;
+    }
+    if (imageFileName) {
+      delete imageFileName;
+      imageFileName = NULL;
+    }
+    if (!printing)
+      imageFileName = getImageFileName(outputFileName, pg_num_len, pg);
+    getOutputSize(pg_w, pg_h, &output_w, &output_h);
+
+    if (pg == firstPage)
+      beginDocument(outputFileName, output_w, output_h);
+    beginPage(output_w, output_h);
+    renderPage(doc, cairoOut, pg, pg_w, pg_h, output_w, output_h);
+    endPage(imageFileName);
+  }
+  endDocument();
+
+  // clean up
+  delete cairoOut;
+  delete doc;
+  delete globalParams;
+  if (fileName)
+    delete fileName;
+  if (outputName)
+    delete outputName;
+  if (outputFileName)
+    delete outputFileName;
+  if (imageFileName)
+    delete imageFileName;
+  if (ownerPW)
+    delete ownerPW;
+  if (userPW)
+    delete ownerPW;
+
+#if USE_CMS
+  cmsCloseProfile(profile);
+  if (icc_data)
+    gfree(icc_data);
+#endif
+
+  // check for memory leaks
+  Object::memCheck(stderr);
+  gMemReport(stderr);
+
+  return 0;
+}
diff --git a/utils/pdftohtml.1 b/utils/pdftohtml.1
new file mode 100644 (file)
index 0000000..44137e4
--- /dev/null
@@ -0,0 +1,108 @@
+.TH PDFTOHTML 1
+.\" NAME should be all caps, SECTION should be 1-8, maybe w/ subsection
+.\" other parms are allowed: see man(7), man(1)
+.SH NAME
+pdftohtml \- program to convert PDF files into HTML, XML and PNG images
+.SH SYNOPSIS
+.B pdftohtml
+.I "[options] <PDF-file> [<HTML-file> <XML-file>]"
+.SH "DESCRIPTION"
+This manual page documents briefly the
+.BR pdftohtml 
+command.
+This manual page was written for the Debian GNU/Linux distribution
+because the original program does not have a manual page.
+.PP
+.B pdftohtml
+is a program that converts PDF documents into HTML. It generates its output in
+the current working directory.
+.SH OPTIONS
+A summary of options are included below.
+.TP
+.B \-h, \-help
+Show summary of options.
+.TP
+.B \-f <int>
+first page to print
+.TP
+.B \-l <int>
+last page to print
+.TP
+.B \-q
+do not print any messages or errors
+.TP
+.B \-v
+print copyright and version info
+.TP
+.B \-p
+exchange .pdf links with .html
+.TP
+.B \-c
+generate complex output
+.TP
+.B \-s
+generate single HTML that includes all pages
+.TP
+.B \-i
+ignore images
+.TP
+.B \-noframes
+generate no frames. Not supported in complex output mode.
+.TP
+.B \-stdout
+use standard output
+.TP 
+.B \-zoom <fp>
+zoom the PDF document (default 1.5)
+.TP
+.B \-xml
+output for XML post-processing
+.TP
+.B \-enc <string>
+output text encoding name
+.TP
+.B \-opw <string>
+owner password (for encrypted files)
+.TP
+.B \-upw <string>
+user password (for encrypted files)
+.TP
+.B \-hidden
+force hidden text extraction
+.TP
+.B \-dev 
+output device name for Ghostscript (png16m, jpeg etc).
+Unless this option is specified, Splash will be used
+.TP
+.B \-fmt
+image file format for Splash output (png or jpg).
+If complex is selected, but neither \-fmt or \-dev are specified,
+\-fmt png will be assumed
+.TP
+.B \-nomerge
+do not merge paragraphs
+.TP
+.B \-nodrm
+override document DRM settings
+.TP
+.B \-wbt <fp>
+adjust the word break threshold percent. Default is 10.
+Word break occurs when distance between two adjacent characters is
+greater than this percent of character height.
+
+.SH AUTHOR
+
+Pdftohtml was developed by Gueorgui Ovtcharov and Rainer Dorsch. It is
+based and benefits a lot from Derek Noonburg's xpdf package.
+
+This manual page was written by Søren Boll Overgaard <boll@debian.org>,
+for the Debian GNU/Linux system (but may be used by others).
+.SH "SEE ALSO"
+.BR pdfdetach (1),
+.BR pdffonts (1),
+.BR pdfimages (1),
+.BR pdfinfo (1),
+.BR pdftocairo (1),
+.BR pdftoppm (1),
+.BR pdftops (1),
+.BR pdftotext (1)
diff --git a/utils/pdftohtml.cc b/utils/pdftohtml.cc
new file mode 100644 (file)
index 0000000..d6475b0
--- /dev/null
@@ -0,0 +1,603 @@
+//========================================================================
+//
+// pdftohtml.cc
+//
+//
+// Copyright 1999-2000 G. Ovtcharov
+//========================================================================
+
+//========================================================================
+//
+// Modified under the Poppler project - http://poppler.freedesktop.org
+//
+// All changes made under the Poppler project to this file are licensed
+// under GPL version 2 or later
+//
+// Copyright (C) 2007-2008, 2010, 2012 Albert Astals Cid <aacid@kde.org>
+// Copyright (C) 2010 Hib Eris <hib@hiberis.nl>
+// Copyright (C) 2010 Mike Slegeir <tehpola@yahoo.com>
+// Copyright (C) 2010 Suzuki Toshiya <mpsuzuki@hiroshima-u.ac.jp>
+// Copyright (C) 2010 OSSD CDAC Mumbai by Leena Chourey (leenac@cdacmumbai.in) and Onkar Potdar (onkar@cdacmumbai.in)
+// Copyright (C) 2011 Steven Murdoch <Steven.Murdoch@cl.cam.ac.uk>
+// Copyright (C) 2012 Igor Slepchin <igor.redhat@gmail.com>
+// Copyright (C) 2012 Ihar Filipau <thephilips@gmail.com>
+//
+// To see a description of the changes please see the Changelog file that
+// came with your tarball or type make ChangeLog if you are building from git
+//
+//========================================================================
+
+#include "config.h"
+#include <poppler-config.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <stddef.h>
+#include <string.h>
+#ifdef HAVE_DIRENT_H
+#include <dirent.h>
+#endif
+#include <time.h>
+#include "parseargs.h"
+#include "goo/GooString.h"
+#include "goo/gmem.h"
+#include "Object.h"
+#include "Stream.h"
+#include "Array.h"
+#include "Dict.h"
+#include "XRef.h"
+#include "Catalog.h"
+#include "Page.h"
+#include "Outline.h"
+#include "PDFDoc.h"
+#include "PDFDocFactory.h"
+#include "HtmlOutputDev.h"
+#ifdef HAVE_SPLASH
+#include "SplashOutputDev.h"
+#include "splash/SplashBitmap.h"
+#endif
+#include "PSOutputDev.h"
+#include "GlobalParams.h"
+#include "PDFDocEncoding.h"
+#include "Error.h"
+#include "DateInfo.h"
+#include "goo/gfile.h"
+
+#ifndef GHOSTSCRIPT
+# define GHOSTSCRIPT "gs"
+#endif
+
+static int firstPage = 1;
+static int lastPage = 0;
+static GBool rawOrder = gTrue;
+GBool printCommands = gTrue;
+static GBool printHelp = gFalse;
+GBool printHtml = gFalse;
+GBool complexMode=gFalse;
+GBool singleHtml=gFalse; // singleHtml
+GBool ignore=gFalse;
+static GBool useSplash=gTrue;
+static char extension[5]="png";
+static double scale=1.5;
+GBool noframes=gFalse;
+GBool stout=gFalse;
+GBool xml=gFalse;
+static GBool errQuiet=gFalse;
+static GBool noDrm=gFalse;
+double wordBreakThreshold=10;  // 10%, below converted into a coefficient - 0.1
+
+GBool showHidden = gFalse;
+GBool noMerge = gFalse;
+static char ownerPassword[33] = "";
+static char userPassword[33] = "";
+static char gsDevice[33] = "none";
+static GBool printVersion = gFalse;
+
+static GooString* getInfoString(Dict *infoDict, const char *key);
+static GooString* getInfoDate(Dict *infoDict, const char *key);
+
+static char textEncName[128] = "";
+
+static const ArgDesc argDesc[] = {
+  {"-f",      argInt,      &firstPage,     0,
+   "first page to convert"},
+  {"-l",      argInt,      &lastPage,      0,
+   "last page to convert"},
+  /*{"-raw",    argFlag,     &rawOrder,      0,
+    "keep strings in content stream order"},*/
+  {"-q",      argFlag,     &errQuiet,      0,
+   "don't print any messages or errors"},
+  {"-h",      argFlag,     &printHelp,     0,
+   "print usage information"},
+  {"-help",   argFlag,     &printHelp,     0,
+   "print usage information"},
+  {"-p",      argFlag,     &printHtml,     0,
+   "exchange .pdf links by .html"}, 
+  {"-c",      argFlag,     &complexMode,          0,
+   "generate complex document"},
+  {"-s",      argFlag,     &singleHtml,          0,
+   "generate single document that includes all pages"},
+  {"-i",      argFlag,     &ignore,        0,
+   "ignore images"},
+  {"-noframes", argFlag,   &noframes,      0,
+   "generate no frames"},
+  {"-stdout"  ,argFlag,    &stout,         0,
+   "use standard output"},
+  {"-zoom",   argFP,    &scale,         0,
+   "zoom the pdf document (default 1.5)"},
+  {"-xml",    argFlag,    &xml,         0,
+   "output for XML post-processing"},
+  {"-hidden", argFlag,   &showHidden,   0,
+   "output hidden text"},
+  {"-nomerge", argFlag, &noMerge, 0,
+   "do not merge paragraphs"},   
+  {"-enc",    argString,   textEncName,    sizeof(textEncName),
+   "output text encoding name"},
+  {"-dev",    argString,   gsDevice,       sizeof(gsDevice),
+   "output device name for Ghostscript (png16m, jpeg etc)"},
+  {"-fmt",    argString,   extension,      sizeof(extension),
+   "image file format for Splash output (png or jpg)"},
+  {"-v",      argFlag,     &printVersion,  0,
+   "print copyright and version info"},
+  {"-opw",    argString,   ownerPassword,  sizeof(ownerPassword),
+   "owner password (for encrypted files)"},
+  {"-upw",    argString,   userPassword,   sizeof(userPassword),
+   "user password (for encrypted files)"},
+  {"-nodrm", argFlag, &noDrm, 0,
+   "override document DRM settings"},
+  {"-wbt",    argFP,    &wordBreakThreshold, 0,
+   "word break threshold (default 10 percent)"},
+  {NULL}
+};
+
+#ifdef HAVE_SPLASH
+class SplashOutputDevNoText : public SplashOutputDev {
+public:
+  SplashOutputDevNoText(SplashColorMode colorModeA, int bitmapRowPadA,
+        GBool reverseVideoA, SplashColorPtr paperColorA,
+        GBool bitmapTopDownA = gTrue,
+        GBool allowAntialiasA = gTrue) : SplashOutputDev(colorModeA,
+            bitmapRowPadA, reverseVideoA, paperColorA, bitmapTopDownA,
+            allowAntialiasA) { }
+  virtual ~SplashOutputDevNoText() { }
+  
+  void drawChar(GfxState *state, double x, double y,
+      double dx, double dy,
+      double originX, double originY,
+      CharCode code, int nBytes, Unicode *u, int uLen) { }
+  GBool beginType3Char(GfxState *state, double x, double y,
+      double dx, double dy,
+      CharCode code, Unicode *u, int uLen) { return false; }
+  void endType3Char(GfxState *state) { }
+  void beginTextObject(GfxState *state) { }
+  GBool deviceHasTextClip(GfxState *state) { return false; }
+  void endTextObject(GfxState *state) { }
+  GBool interpretType3Chars() { return gFalse; }
+};
+#endif
+
+int main(int argc, char *argv[]) {
+  PDFDoc *doc = NULL;
+  GooString *fileName = NULL;
+  GooString *docTitle = NULL;
+  GooString *author = NULL, *keywords = NULL, *subject = NULL, *date = NULL;
+  GooString *htmlFileName = NULL;
+  GooString *psFileName = NULL;
+  HtmlOutputDev *htmlOut = NULL;
+#ifdef HAVE_SPLASH
+  SplashOutputDev *splashOut = NULL;
+#endif
+  PSOutputDev *psOut = NULL;
+  GBool doOutline;
+  GBool ok;
+  char *p;
+  GooString *ownerPW, *userPW;
+  Object info;
+  const char * extsList[] = {"png", "jpeg", "bmp", "pcx", "tiff", "pbm", NULL};
+
+  // parse args
+  ok = parseArgs(argDesc, &argc, argv);
+  if (!ok || argc < 2 || argc > 3 || printHelp || printVersion) {
+    fprintf(stderr, "pdftohtml version %s\n", PACKAGE_VERSION);
+    fprintf(stderr, "%s\n", popplerCopyright);
+    fprintf(stderr, "%s\n", "Copyright 1999-2003 Gueorgui Ovtcharov and Rainer Dorsch");
+    fprintf(stderr, "%s\n\n", xpdfCopyright);
+    if (!printVersion) {
+      printUsage("pdftohtml", "<PDF-file> [<html-file> <xml-file>]", argDesc);
+    }
+    exit(1);
+  }
+  // init error file
+  //errorInit();
+
+  // read config file
+  globalParams = new GlobalParams();
+
+  if (errQuiet) {
+    globalParams->setErrQuiet(errQuiet);
+    printCommands = gFalse; // I'm not 100% what is the differecne between them
+  }
+
+  if (textEncName[0]) {
+    globalParams->setTextEncoding(textEncName);
+    if( !globalParams->getTextEncoding() )  {
+       goto error;    
+    }
+  }
+
+  // convert from user-friendly percents into a coefficient
+  wordBreakThreshold /= 100.0;
+
+  // open PDF file
+  if (ownerPassword[0]) {
+    ownerPW = new GooString(ownerPassword);
+  } else {
+    ownerPW = NULL;
+  }
+  if (userPassword[0]) {
+    userPW = new GooString(userPassword);
+  } else {
+    userPW = NULL;
+  }
+
+  fileName = new GooString(argv[1]);
+
+  if (fileName->cmp("-") == 0) {
+      delete fileName;
+      fileName = new GooString("fd://0");
+  }
+
+  doc = PDFDocFactory().createPDFDoc(*fileName, ownerPW, userPW);
+
+  if (userPW) {
+    delete userPW;
+  }
+  if (ownerPW) {
+    delete ownerPW;
+  }
+  if (!doc->isOk()) {
+    goto error;
+  }
+
+  // check for copy permission
+  if (!doc->okToCopy()) {
+    if (!noDrm) {
+      error(errNotAllowed, -1, "Copying of text from this document is not allowed.");
+      goto error;
+    }
+    fprintf(stderr, "Document has copy-protection bit set.\n");
+  }
+
+  // construct text file name
+  if (argc == 3) {
+    GooString* tmp = new GooString(argv[2]);
+    if (!xml) {
+      if (tmp->getLength() >= 5) {
+        p = tmp->getCString() + tmp->getLength() - 5;
+        if (!strcmp(p, ".html") || !strcmp(p, ".HTML")) {
+          htmlFileName = new GooString(tmp->getCString(), tmp->getLength() - 5);
+        }
+      }
+    } else {
+      if (tmp->getLength() >= 4) {
+        p = tmp->getCString() + tmp->getLength() - 4;
+        if (!strcmp(p, ".xml") || !strcmp(p, ".XML")) {
+          htmlFileName = new GooString(tmp->getCString(), tmp->getLength() - 4);
+        }
+      }
+    }
+    if (!htmlFileName) {
+      htmlFileName =new GooString(tmp);
+    }
+    delete tmp;
+  } else if (fileName->cmp("fd://0") == 0) {
+      error(errCommandLine, -1, "You have to provide an output filename when reading form stdin.");
+      goto error;
+  } else {
+    p = fileName->getCString() + fileName->getLength() - 4;
+    if (!strcmp(p, ".pdf") || !strcmp(p, ".PDF"))
+      htmlFileName = new GooString(fileName->getCString(),
+                                fileName->getLength() - 4);
+    else
+      htmlFileName = fileName->copy();
+    //   htmlFileName->append(".html");
+  }
+  
+   if (scale>3.0) scale=3.0;
+   if (scale<0.5) scale=0.5;
+   
+   if (complexMode || singleHtml) {
+     //noframes=gFalse;
+     stout=gFalse;
+   } 
+
+   if (stout) {
+     noframes=gTrue;
+     complexMode=gFalse;
+     singleHtml=gFalse;
+   }
+
+   if (xml)
+   { 
+       complexMode = gTrue;
+       singleHtml = gFalse;
+       noframes = gTrue;
+       noMerge = gTrue;
+   }
+
+  // get page range
+  if (firstPage < 1)
+    firstPage = 1;
+  if (lastPage < 1 || lastPage > doc->getNumPages())
+    lastPage = doc->getNumPages();
+
+  doc->getDocInfo(&info);
+  if (info.isDict()) {
+    docTitle = getInfoString(info.getDict(), "Title");
+    author = getInfoString(info.getDict(), "Author");
+    keywords = getInfoString(info.getDict(), "Keywords");
+    subject = getInfoString(info.getDict(), "Subject");
+    date = getInfoDate(info.getDict(), "ModDate");
+    if( !date )
+       date = getInfoDate(info.getDict(), "CreationDate");
+  }
+  info.free();
+  if( !docTitle ) docTitle = new GooString(htmlFileName);
+
+  if( strcmp("none", gsDevice) ) {
+    useSplash = gFalse;
+    /* determine extensions of output background images */
+    int i;
+    for(i = 0; extsList[i]; i++)
+    {
+      if( strstr(gsDevice, extsList[i]) != (char *) NULL )
+      {
+        strncpy(extension, extsList[i], sizeof(extension));
+        break;
+      }
+    }
+  }
+
+#ifndef HAVE_SPLASH
+  if( useSplash ) {
+    fprintf(stderr, "You are trying to use the -fmt option but your pdftohtml was built without support for it. Please use the -dev option\n");
+    delete docTitle;
+    delete author;
+    delete keywords;
+    delete subject;
+    delete date;
+    delete htmlFileName;
+    delete globalParams;
+    delete fileName;
+    delete doc;
+    return -1;
+  }
+#endif
+
+  if (!singleHtml)
+      rawOrder = complexMode; // todo: figure out what exactly rawOrder do :)
+  else
+      rawOrder = singleHtml;
+
+#ifdef DISABLE_OUTLINE
+  doOutline = gFalse;
+#else
+  doOutline = doc->getOutline()->getItems() != NULL;
+#endif
+  // write text file
+  htmlOut = new HtmlOutputDev(doc->getCatalog(), htmlFileName->getCString(), 
+         docTitle->getCString(), 
+         author ? author->getCString() : NULL,
+         keywords ? keywords->getCString() : NULL, 
+          subject ? subject->getCString() : NULL, 
+         date ? date->getCString() : NULL,
+         extension,
+         rawOrder, 
+         firstPage,
+         doOutline);
+  delete docTitle;
+  if( author )
+  {   
+      delete author;
+  }
+  if( keywords )
+  {
+      delete keywords;
+  }
+  if( subject )
+  {
+      delete subject;
+  }
+  if( date )
+  {
+      delete date;
+  }
+
+  if (htmlOut->isOk())
+  {
+    doc->displayPages(htmlOut, firstPage, lastPage, 72 * scale, 72 * scale, 0,
+                     gTrue, gFalse, gFalse);
+    htmlOut->dumpDocOutline(doc);
+  }
+  
+  if ((complexMode || singleHtml) && !xml && !ignore) {
+    if(useSplash) {
+#ifdef HAVE_SPLASH
+      GooString *imgFileName = NULL;
+      // White paper color
+      SplashColor color;
+      color[0] = color[1] = color[2] = 255;
+      // If the user specified "jpg" use JPEG, otherwise PNG
+      SplashImageFileFormat format = strcmp(extension, "jpg") ?
+          splashFormatPng : splashFormatJpeg;
+
+      splashOut = new SplashOutputDevNoText(splashModeRGB8, 4, gFalse, color);
+      splashOut->startDoc(doc);
+
+      for (int pg = firstPage; pg <= lastPage; ++pg) {
+        doc->displayPage(splashOut, pg,
+                         72 * scale, 72 * scale,
+                         0, gTrue, gFalse, gFalse);
+        SplashBitmap *bitmap = splashOut->getBitmap();
+
+        imgFileName = GooString::format("{0:s}{1:03d}.{2:s}", 
+            htmlFileName->getCString(), pg, extension);
+
+        bitmap->writeImgFile(format, imgFileName->getCString(),
+                             72 * scale, 72 * scale);
+
+        delete imgFileName;
+      }
+
+      delete splashOut;
+#endif
+    } else {
+      int h=xoutRound(htmlOut->getPageHeight()/scale);
+      int w=xoutRound(htmlOut->getPageWidth()/scale);
+      //int h=xoutRound(doc->getPageHeight(1)/scale);
+      //int w=xoutRound(doc->getPageWidth(1)/scale);
+
+      psFileName = new GooString(htmlFileName->getCString());
+      psFileName->append(".ps");
+
+      psOut = new PSOutputDev(psFileName->getCString(), doc,
+          NULL, firstPage, lastPage, psModePS, w, h);
+      psOut->setDisplayText(gFalse);
+      doc->displayPages(psOut, firstPage, lastPage, 72, 72, 0,
+          gTrue, gFalse, gFalse);
+      delete psOut;
+
+      /*sprintf(buf, "%s -sDEVICE=png16m -dBATCH -dNOPROMPT -dNOPAUSE -r%d -sOutputFile=%s%%03d.png -g%dx%d -q %s", GHOSTSCRIPT, resolution, htmlFileName->getCString(), w, h,
+      psFileName->getCString());*/
+
+      GooString *gsCmd = new GooString(GHOSTSCRIPT);
+      GooString *tw, *th, *sc;
+      gsCmd->append(" -sDEVICE=");
+      gsCmd->append(gsDevice);
+      gsCmd->append(" -dBATCH -dNOPROMPT -dNOPAUSE -r");
+      sc = GooString::fromInt(static_cast<int>(72*scale));
+      gsCmd->append(sc);
+      gsCmd->append(" -sOutputFile=");
+      gsCmd->append("\"");
+      gsCmd->append(htmlFileName);
+      gsCmd->append("%03d.");
+      gsCmd->append(extension);
+      gsCmd->append("\" -g");
+      tw = GooString::fromInt(static_cast<int>(scale*w));
+      gsCmd->append(tw);
+      gsCmd->append("x");
+      th = GooString::fromInt(static_cast<int>(scale*h));
+      gsCmd->append(th);
+      gsCmd->append(" -q \"");
+      gsCmd->append(psFileName);
+      gsCmd->append("\"");
+      //    printf("running: %s\n", gsCmd->getCString());
+      if( !executeCommand(gsCmd->getCString()) && !errQuiet) {
+        error(errIO, -1, "Failed to launch Ghostscript!\n");
+      }
+      unlink(psFileName->getCString());
+      delete tw;
+      delete th;
+      delete sc;
+      delete gsCmd;
+      delete psFileName;
+    }
+  }
+  
+  delete htmlOut;
+
+  // clean up
+ error:
+  if(doc) delete doc;
+  delete fileName;
+  if(globalParams) delete globalParams;
+
+  if(htmlFileName) delete htmlFileName;
+  HtmlFont::clear();
+  
+  // check for memory leaks
+  Object::memCheck(stderr);
+  gMemReport(stderr);
+
+  return 0;
+}
+
+static GooString* getInfoString(Dict *infoDict, const char *key) {
+  Object obj;
+  // Raw value as read from PDF (may be in pdfDocEncoding or UCS2)
+  GooString *rawString;
+  // Value converted to unicode
+  Unicode *unicodeString;
+  int unicodeLength;
+  // Value HTML escaped and converted to desired encoding
+  GooString *encodedString = NULL;
+  // Is rawString UCS2 (as opposed to pdfDocEncoding)
+  GBool isUnicode;
+
+  if (infoDict->lookup(key, &obj)->isString()) {
+    rawString = obj.getString();
+
+    // Convert rawString to unicode
+    if (rawString->hasUnicodeMarker()) {
+      isUnicode = gTrue;
+      unicodeLength = (obj.getString()->getLength() - 2) / 2;
+    } else {
+      isUnicode = gFalse;
+      unicodeLength = obj.getString()->getLength();
+    }
+    unicodeString = new Unicode[unicodeLength];
+
+    for (int i=0; i<unicodeLength; i++) {
+      if (isUnicode) {
+        unicodeString[i] = ((rawString->getChar((i+1)*2) & 0xff) << 8) |
+          (rawString->getChar(((i+1)*2)+1) & 0xff);
+      } else {
+        unicodeString[i] = pdfDocEncoding[rawString->getChar(i) & 0xff];
+      }
+    }
+
+    // HTML escape and encode unicode
+    encodedString = HtmlFont::HtmlFilter(unicodeString, unicodeLength);
+    delete[] unicodeString;
+  }
+
+  obj.free();
+  return encodedString;
+}
+
+static GooString* getInfoDate(Dict *infoDict, const char *key) {
+  Object obj;
+  char *s;
+  int year, mon, day, hour, min, sec, tz_hour, tz_minute;
+  char tz;
+  struct tm tmStruct;
+  GooString *result = NULL;
+  char buf[256];
+
+  if (infoDict->lookup(key, &obj)->isString()) {
+    s = obj.getString()->getCString();
+    // TODO do something with the timezone info
+    if ( parseDateString( s, &year, &mon, &day, &hour, &min, &sec, &tz, &tz_hour, &tz_minute ) ) {
+      tmStruct.tm_year = year - 1900;
+      tmStruct.tm_mon = mon - 1;
+      tmStruct.tm_mday = day;
+      tmStruct.tm_hour = hour;
+      tmStruct.tm_min = min;
+      tmStruct.tm_sec = sec;
+      tmStruct.tm_wday = -1;
+      tmStruct.tm_yday = -1;
+      tmStruct.tm_isdst = -1;
+      mktime(&tmStruct); // compute the tm_wday and tm_yday fields
+      if (strftime(buf, sizeof(buf), "%Y-%m-%dT%H:%M:%S+00:00", &tmStruct)) {
+        result = new GooString(buf);
+      } else {
+        result = new GooString(s);
+      }
+    } else {
+      result = new GooString(s);
+    }
+  }
+  obj.free();
+  return result;
+}
+
diff --git a/utils/pdftoppm.1 b/utils/pdftoppm.1
new file mode 100644 (file)
index 0000000..2321d6d
--- /dev/null
@@ -0,0 +1,158 @@
+.\" Copyright 2005-2011 Glyph & Cog, LLC
+.TH pdftoppm 1 "15 August 2011"
+.SH NAME
+pdftoppm \- Portable Document Format (PDF) to Portable Pixmap (PPM)
+converter (version 3.03)
+.SH SYNOPSIS
+.B pdftoppm
+[options]
+.I PDF-file PPM-root
+.SH DESCRIPTION
+.B Pdftoppm
+converts Portable Document Format (PDF) files to color image files in
+Portable Pixmap (PPM) format, grayscale image files in Portable
+Graymap (PGM) format, or monochrome image files in Portable Bitmap
+(PBM) format.
+.PP
+Pdftoppm reads the PDF file,
+.IR PDF-file ,
+and writes one PPM file for each page,
+.IR PPM-root - number .ppm,
+where
+.I number
+is the page number.
+.SH OPTIONS
+.TP
+.BI \-f " number"
+Specifies the first page to convert.
+.TP
+.BI \-l " number"
+Specifies the last page to convert.
+.TP
+.B \-o
+Generates only the odd numbered pages.
+.TP
+.B \-e
+Generates only the even numbered pages.
+.TP
+.BI \-singlefile
+Writes only the first page and does not add digits.
+.TP
+.BI \-r " number"
+Specifies the X and Y resolution, in DPI.  The default is 150 DPI.
+.TP
+.BI \-rx " number"
+Specifies the X resolution, in DPI.  The default is 150 DPI.
+.TP
+.BI \-ry " number"
+Specifies the Y resolution, in DPI.  The default is 150 DPI.
+.TP
+.BI \-scale-to " number"
+Scales the long side of each page (width for landscape pages, height
+for portrait pages) to fit in scale-to pixels. The size of the short
+side will be determined by the aspect ratio of the page.
+.TP
+.BI \-scale-to-x " number"
+Scales each page horizontally to fit in scale-to-x pixels. If
+scale-to-y is set to -1, the vertical size will determined by the
+aspect ratio of the page.
+.TP
+.BI \-scale-to-y " number"
+Scales each page vertically to fit in scale-to-y pixels. If scale-to-x
+is set to -1, the horizontal size will determined by the aspect ratio
+of the page.
+.TP
+.BI \-x " number"
+Specifies the x-coordinate of the crop area top left corner
+.TP
+.BI \-y " number"
+Specifies the y-coordinate of the crop area top left corner
+.TP
+.BI \-W " number"
+Specifies the width of crop area in pixels (default is 0)
+.TP
+.BI \-H " number"
+Specifies the height of crop area in pixels (default is 0)
+.TP
+.BI \-sz " number"
+Specifies the size of crop square in pixels (sets W and H)
+.TP
+.B \-cropbox
+Uses the crop box rather than media box when generating the files
+.TP
+.B \-mono
+Generate a monochrome PBM file (instead of a color PPM file).
+.TP
+.B \-gray
+Generate a grayscale PGM file (instead of a color PPM file).
+.TP
+.B \-png
+Generates a PNG file instead a PPM file.
+.TP
+.B \-jpeg
+Generates a JPEG file instead a PPM file.
+.TP
+.B \-tiff
+Generates a TIFF file instead a PPM file.
+.TP
+.BI \-tiffcompression " none | packbits | jpeg | lzw | deflate"
+Specifies the TIFF compression type.  This defaults to "none".
+.TP
+.BI \-freetype " yes | no"
+Enable or disable FreeType (a TrueType / Type 1 font rasterizer).
+This defaults to "yes".
+.TP
+.BI \-aa " yes | no"
+Enable or disable font anti-aliasing.  This defaults to "yes".
+.TP
+.BI \-aaVector " yes | no"
+Enable or disable vector anti-aliasing.  This defaults to "yes".
+.TP
+.BI \-opw " password"
+Specify the owner password for the PDF file.  Providing this will
+bypass all security restrictions.
+.TP
+.BI \-upw " password"
+Specify the user password for the PDF file.
+.TP
+.B \-q
+Don't print any messages or errors.
+.TP
+.B \-v
+Print copyright and version information.
+.TP
+.B \-h
+Print usage information.
+.RB ( \-help
+and
+.B \-\-help
+are equivalent.)
+.SH EXIT CODES
+The Xpdf tools use the following exit codes:
+.TP
+0
+No error.
+.TP
+1
+Error opening a PDF file.
+.TP
+2
+Error opening an output file.
+.TP
+3
+Error related to PDF permissions.
+.TP
+99
+Other error.
+.SH AUTHOR
+The pdftoppm software and documentation are copyright 1996-2011 Glyph
+& Cog, LLC.
+.SH "SEE ALSO"
+.BR pdfdetach (1),
+.BR pdffonts (1),
+.BR pdfimages (1),
+.BR pdfinfo (1),
+.BR pdftocairo (1),
+.BR pdftohtml (1),
+.BR pdftops (1),
+.BR pdftotext (1)
diff --git a/utils/pdftoppm.cc b/utils/pdftoppm.cc
new file mode 100644 (file)
index 0000000..04a0dfb
--- /dev/null
@@ -0,0 +1,440 @@
+//========================================================================
+//
+// pdftoppm.cc
+//
+// Copyright 2003 Glyph & Cog, LLC
+//
+//========================================================================
+
+//========================================================================
+//
+// Modified under the Poppler project - http://poppler.freedesktop.org
+//
+// All changes made under the Poppler project to this file are licensed
+// under GPL version 2 or later
+//
+// Copyright (C) 2007 Ilmari Heikkinen <ilmari.heikkinen@gmail.com>
+// Copyright (C) 2008 Richard Airlie <richard.airlie@maglabs.net>
+// Copyright (C) 2009 Michael K. Johnson <a1237@danlj.org>
+// Copyright (C) 2009 Shen Liang <shenzhuxi@gmail.com>
+// Copyright (C) 2009 Stefan Thomas <thomas@eload24.com>
+// Copyright (C) 2009-2011 Albert Astals Cid <aacid@kde.org>
+// Copyright (C) 2010, 2012 Adrian Johnson <ajohnson@redneon.com>
+// Copyright (C) 2010 Hib Eris <hib@hiberis.nl>
+// Copyright (C) 2010 Jonathan Liu <net147@gmail.com>
+// Copyright (C) 2010 William Bader <williambader@hotmail.com>
+// Copyright (C) 2011 Thomas Freitag <Thomas.Freitag@alfa.de>
+//
+// To see a description of the changes please see the Changelog file that
+// came with your tarball or type make ChangeLog if you are building from git
+//
+//========================================================================
+
+#include "config.h"
+#include <poppler-config.h>
+#ifdef _WIN32
+#include <fcntl.h> // for O_BINARY
+#include <io.h>    // for setmode
+#endif
+#include <stdio.h>
+#include <math.h>
+#include "parseargs.h"
+#include "goo/gmem.h"
+#include "goo/GooString.h"
+#include "GlobalParams.h"
+#include "Object.h"
+#include "PDFDoc.h"
+#include "PDFDocFactory.h"
+#include "splash/SplashBitmap.h"
+#include "splash/Splash.h"
+#include "SplashOutputDev.h"
+
+static int firstPage = 1;
+static int lastPage = 0;
+static GBool printOnlyOdd = gFalse;
+static GBool printOnlyEven = gFalse;
+static GBool singleFile = gFalse;
+static double resolution = 0.0;
+static double x_resolution = 150.0;
+static double y_resolution = 150.0;
+static int scaleTo = 0;
+static int x_scaleTo = 0;
+static int y_scaleTo = 0;
+static int x = 0;
+static int y = 0;
+static int w = 0;
+static int h = 0;
+static int sz = 0;
+static GBool useCropBox = gFalse;
+static GBool mono = gFalse;
+static GBool gray = gFalse;
+static GBool png = gFalse;
+static GBool jpeg = gFalse;
+static GBool jpegcmyk = gFalse;
+static GBool tiff = gFalse;
+#if SPLASH_CMYK
+static GBool overprint = gFalse;
+#endif
+static char enableFreeTypeStr[16] = "";
+static char antialiasStr[16] = "";
+static char vectorAntialiasStr[16] = "";
+static char ownerPassword[33] = "";
+static char userPassword[33] = "";
+static char TiffCompressionStr[16] = "";
+static GBool quiet = gFalse;
+static GBool printVersion = gFalse;
+static GBool printHelp = gFalse;
+
+static const ArgDesc argDesc[] = {
+  {"-f",      argInt,      &firstPage,     0,
+   "first page to print"},
+  {"-l",      argInt,      &lastPage,      0,
+   "last page to print"},
+  {"-o",      argFlag,      &printOnlyOdd, 0,
+   "print only odd pages"},
+  {"-e",      argFlag,      &printOnlyEven, 0,
+   "print only even pages"},
+  {"-singlefile", argFlag,  &singleFile,   0,
+   "write only the first page and do not add digits"},
+
+  {"-r",      argFP,       &resolution,    0,
+   "resolution, in DPI (default is 150)"},
+  {"-rx",      argFP,       &x_resolution,    0,
+   "X resolution, in DPI (default is 150)"},
+  {"-ry",      argFP,       &y_resolution,    0,
+   "Y resolution, in DPI (default is 150)"},
+  {"-scale-to",      argInt,       &scaleTo,    0,
+   "scales each page to fit within scale-to*scale-to pixel box"},
+  {"-scale-to-x",      argInt,       &x_scaleTo,    0,
+   "scales each page horizontally to fit in scale-to-x pixels"},
+  {"-scale-to-y",      argInt,       &y_scaleTo,    0,
+   "scales each page vertically to fit in scale-to-y pixels"},
+
+  {"-x",      argInt,      &x,             0,
+   "x-coordinate of the crop area top left corner"},
+  {"-y",      argInt,      &y,             0,
+   "y-coordinate of the crop area top left corner"},
+  {"-W",      argInt,      &w,             0,
+   "width of crop area in pixels (default is 0)"},
+  {"-H",      argInt,      &h,             0,
+   "height of crop area in pixels (default is 0)"},
+  {"-sz",     argInt,      &sz,            0,
+   "size of crop square in pixels (sets W and H)"},
+  {"-cropbox",argFlag,     &useCropBox,    0,
+   "use the crop box rather than media box"},
+
+  {"-mono",   argFlag,     &mono,          0,
+   "generate a monochrome PBM file"},
+  {"-gray",   argFlag,     &gray,          0,
+   "generate a grayscale PGM file"},
+#if ENABLE_LIBPNG
+  {"-png",    argFlag,     &png,           0,
+   "generate a PNG file"},
+#endif
+#if ENABLE_LIBJPEG
+  {"-jpeg",   argFlag,     &jpeg,           0,
+   "generate a JPEG file"},
+#if SPLASH_CMYK
+  {"-jpegcmyk",argFlag,    &jpegcmyk,       0,
+   "generate a CMYK JPEG file"},
+#endif
+#endif
+#if SPLASH_CMYK
+  {"-overprint",argFlag,   &overprint,      0,
+   "enable overprint"},
+#endif
+#if ENABLE_LIBTIFF
+  {"-tiff",    argFlag,     &tiff,           0,
+   "generate a TIFF file"},
+  {"-tiffcompression", argString, TiffCompressionStr, sizeof(TiffCompressionStr),
+   "set TIFF compression: none, packbits, jpeg, lzw, deflate"},
+#endif
+#if HAVE_FREETYPE_FREETYPE_H | HAVE_FREETYPE_H
+  {"-freetype",   argString,      enableFreeTypeStr, sizeof(enableFreeTypeStr),
+   "enable FreeType font rasterizer: yes, no"},
+#endif
+  
+  {"-aa",         argString,      antialiasStr,   sizeof(antialiasStr),
+   "enable font anti-aliasing: yes, no"},
+  {"-aaVector",   argString,      vectorAntialiasStr, sizeof(vectorAntialiasStr),
+   "enable vector anti-aliasing: yes, no"},
+  
+  {"-opw",    argString,   ownerPassword,  sizeof(ownerPassword),
+   "owner password (for encrypted files)"},
+  {"-upw",    argString,   userPassword,   sizeof(userPassword),
+   "user password (for encrypted files)"},
+  
+  {"-q",      argFlag,     &quiet,         0,
+   "don't print any messages or errors"},
+  {"-v",      argFlag,     &printVersion,  0,
+   "print copyright and version info"},
+  {"-h",      argFlag,     &printHelp,     0,
+   "print usage information"},
+  {"-help",   argFlag,     &printHelp,     0,
+   "print usage information"},
+  {"--help",  argFlag,     &printHelp,     0,
+   "print usage information"},
+  {"-?",      argFlag,     &printHelp,     0,
+   "print usage information"},
+  {NULL}
+};
+
+static void savePageSlice(PDFDoc *doc,
+                   SplashOutputDev *splashOut, 
+                   int pg, int x, int y, int w, int h, 
+                   double pg_w, double pg_h, 
+                   char *ppmFile) {
+  if (w == 0) w = (int)ceil(pg_w);
+  if (h == 0) h = (int)ceil(pg_h);
+  w = (x+w > pg_w ? (int)ceil(pg_w-x) : w);
+  h = (y+h > pg_h ? (int)ceil(pg_h-y) : h);
+  doc->displayPageSlice(splashOut, 
+    pg, x_resolution, y_resolution, 
+    0,
+    !useCropBox, gFalse, gFalse,
+    x, y, w, h
+  );
+
+  SplashBitmap *bitmap = splashOut->getBitmap();
+  
+  if (ppmFile != NULL) {
+    if (png) {
+      bitmap->writeImgFile(splashFormatPng, ppmFile, x_resolution, y_resolution);
+    } else if (jpeg) {
+      bitmap->writeImgFile(splashFormatJpeg, ppmFile, x_resolution, y_resolution);
+    } else if (jpegcmyk) {
+      bitmap->writeImgFile(splashFormatJpegCMYK, ppmFile, x_resolution, y_resolution);
+    } else if (tiff) {
+      bitmap->writeImgFile(splashFormatTiff, ppmFile, x_resolution, y_resolution, TiffCompressionStr);
+    } else {
+      bitmap->writePNMFile(ppmFile);
+    }
+  } else {
+#ifdef _WIN32
+    setmode(fileno(stdout), O_BINARY);
+#endif
+
+    if (png) {
+      bitmap->writeImgFile(splashFormatPng, stdout, x_resolution, y_resolution);
+    } else if (jpeg) {
+      bitmap->writeImgFile(splashFormatJpeg, stdout, x_resolution, y_resolution);
+    } else if (tiff) {
+      bitmap->writeImgFile(splashFormatTiff, stdout, x_resolution, y_resolution, TiffCompressionStr);
+    } else {
+      bitmap->writePNMFile(stdout);
+    }
+  }
+}
+
+static int numberOfCharacters(unsigned int n)
+{
+  int charNum = 0;
+  while (n >= 10)
+  {
+    n = n / 10;
+    charNum++;
+  }
+  charNum++;
+  return charNum;
+}
+
+int main(int argc, char *argv[]) {
+  PDFDoc *doc;
+  GooString *fileName = NULL;
+  char *ppmRoot = NULL;
+  char *ppmFile;
+  GooString *ownerPW, *userPW;
+  SplashColor paperColor;
+  SplashOutputDev *splashOut;
+  GBool ok;
+  int exitCode;
+  int pg, pg_num_len;
+  double pg_w, pg_h, tmp;
+
+  exitCode = 99;
+
+  // parse args
+  ok = parseArgs(argDesc, &argc, argv);
+  if (mono && gray) {
+    ok = gFalse;
+  }
+  if ( resolution != 0.0 &&
+       (x_resolution == 150.0 ||
+        y_resolution == 150.0)) {
+    x_resolution = resolution;
+    y_resolution = resolution;
+  }
+  if (!ok || argc > 3 || printVersion || printHelp) {
+    fprintf(stderr, "pdftoppm version %s\n", PACKAGE_VERSION);
+    fprintf(stderr, "%s\n", popplerCopyright);
+    fprintf(stderr, "%s\n", xpdfCopyright);
+    if (!printVersion) {
+      printUsage("pdftoppm", "[PDF-file [PPM-file-prefix]]", argDesc);
+    }
+    if (printVersion || printHelp)
+      exitCode = 0;
+    goto err0;
+  }
+  if (argc > 1) fileName = new GooString(argv[1]);
+  if (argc == 3) ppmRoot = argv[2];
+
+  // read config file
+  globalParams = new GlobalParams();
+  if (enableFreeTypeStr[0]) {
+    if (!globalParams->setEnableFreeType(enableFreeTypeStr)) {
+      fprintf(stderr, "Bad '-freetype' value on command line\n");
+    }
+  }
+  if (antialiasStr[0]) {
+    if (!globalParams->setAntialias(antialiasStr)) {
+      fprintf(stderr, "Bad '-aa' value on command line\n");
+    }
+  }
+  if (vectorAntialiasStr[0]) {
+    if (!globalParams->setVectorAntialias(vectorAntialiasStr)) {
+      fprintf(stderr, "Bad '-aaVector' value on command line\n");
+    }
+  }
+  if (quiet) {
+    globalParams->setErrQuiet(quiet);
+  }
+
+  // open PDF file
+  if (ownerPassword[0]) {
+    ownerPW = new GooString(ownerPassword);
+  } else {
+    ownerPW = NULL;
+  }
+  if (userPassword[0]) {
+    userPW = new GooString(userPassword);
+  } else {
+    userPW = NULL;
+  }
+
+  if (fileName == NULL) {
+    fileName = new GooString("fd://0");
+  }
+  if (fileName->cmp("-") == 0) {
+    delete fileName;
+    fileName = new GooString("fd://0");
+  }
+  doc = PDFDocFactory().createPDFDoc(*fileName, ownerPW, userPW);
+  delete fileName;
+
+  if (userPW) {
+    delete userPW;
+  }
+  if (ownerPW) {
+    delete ownerPW;
+  }
+  if (!doc->isOk()) {
+    exitCode = 1;
+    goto err1;
+  }
+
+  // get page range
+  if (firstPage < 1)
+    firstPage = 1;
+  if (singleFile && lastPage < 1)
+    lastPage = firstPage;
+  if (lastPage < 1 || lastPage > doc->getNumPages())
+    lastPage = doc->getNumPages();
+
+  if (singleFile && firstPage < lastPage) {
+    if (!quiet) {
+      fprintf(stderr,
+        "Warning: Single file will write only the first of the %d pages.\n",
+        lastPage + 1 - firstPage);
+    }
+    lastPage = firstPage;
+  }
+
+  // write PPM files
+#if SPLASH_CMYK
+  if (jpegcmyk || overprint) {
+    globalParams->setOverprintPreview(gTrue);
+    paperColor[0] = 0;
+    paperColor[1] = 0;
+    paperColor[2] = 0;
+    paperColor[3] = 0;
+  } else 
+#endif
+  {
+    paperColor[0] = 255;
+    paperColor[1] = 255;
+    paperColor[2] = 255;
+  }
+  splashOut = new SplashOutputDev(mono ? splashModeMono1 :
+                                   gray ? splashModeMono8 :
+#if SPLASH_CMYK
+                                   (jpegcmyk || overprint) ? splashModeCMYK8 :
+#endif
+                                            splashModeRGB8, 4,
+                                 gFalse, paperColor);
+  splashOut->startDoc(doc);
+  if (sz != 0) w = h = sz;
+  pg_num_len = numberOfCharacters(doc->getNumPages());
+  for (pg = firstPage; pg <= lastPage; ++pg) {
+    if (printOnlyEven && pg % 2 == 0) continue;
+    if (printOnlyOdd && pg % 2 == 1) continue;
+    if (useCropBox) {
+      pg_w = doc->getPageCropWidth(pg);
+      pg_h = doc->getPageCropHeight(pg);
+    } else {
+      pg_w = doc->getPageMediaWidth(pg);
+      pg_h = doc->getPageMediaHeight(pg);
+    }
+
+    if (scaleTo != 0) {
+      resolution = (72.0 * scaleTo) / (pg_w > pg_h ? pg_w : pg_h);
+      x_resolution = y_resolution = resolution;
+    } else {
+      if (x_scaleTo > 0) {
+        x_resolution = (72.0 * x_scaleTo) / pg_w;
+        if (y_scaleTo == -1)
+          y_resolution = x_resolution;
+      }
+      if (y_scaleTo > 0) {
+        y_resolution = (72.0 * y_scaleTo) / pg_h;
+        if (x_scaleTo == -1)
+          x_resolution = y_resolution;
+      }
+    }
+    pg_w = pg_w * (x_resolution / 72.0);
+    pg_h = pg_h * (y_resolution / 72.0);
+    if ((doc->getPageRotate(pg) == 90) || (doc->getPageRotate(pg) == 270)) {
+      tmp = pg_w;
+      pg_w = pg_h;
+      pg_h = tmp;
+    }
+    if (ppmRoot != NULL) {
+      const char *ext = png ? "png" : (jpeg || jpegcmyk) ? "jpg" : tiff ? "tif" : mono ? "pbm" : gray ? "pgm" : "ppm";
+      if (singleFile) {
+        ppmFile = new char[strlen(ppmRoot) + 1 + strlen(ext) + 1];
+        sprintf(ppmFile, "%s.%s", ppmRoot, ext);
+      } else {
+        ppmFile = new char[strlen(ppmRoot) + 1 + pg_num_len + 1 + strlen(ext) + 1];
+        sprintf(ppmFile, "%s-%0*d.%s", ppmRoot, pg_num_len, pg, ext);
+      }
+      savePageSlice(doc, splashOut, pg, x, y, w, h, pg_w, pg_h, ppmFile);
+      delete[] ppmFile;
+    } else {
+      savePageSlice(doc, splashOut, pg, x, y, w, h, pg_w, pg_h, NULL);
+    }
+  }
+  delete splashOut;
+
+  exitCode = 0;
+
+  // clean up
+ err1:
+  delete doc;
+  delete globalParams;
+ err0:
+
+  // check for memory leaks
+  Object::memCheck(stderr);
+  gMemReport(stderr);
+
+  return exitCode;
+}
diff --git a/utils/pdftops.1 b/utils/pdftops.1
new file mode 100644 (file)
index 0000000..c7aeaf5
--- /dev/null
@@ -0,0 +1,227 @@
+.\" Copyright 1996-2011 Glyph & Cog, LLC
+.TH pdftops 1 "15 August 2011"
+.SH NAME
+pdftops \- Portable Document Format (PDF) to PostScript converter
+(version 3.03)
+.SH SYNOPSIS
+.B pdftops
+[options]
+.RI <PDF-file>
+.RI [<PS-file>]
+.SH DESCRIPTION
+.B Pdftops
+converts Portable Document Format (PDF) files to PostScript so they
+can be printed.
+.PP
+Pdftops reads the PDF file,
+.IR PDF-file ,
+and writes a PostScript file,
+.IR PS-file .
+If
+.I PS-file
+is not specified, pdftops converts
+.I file.pdf
+to
+.I file.ps
+(or
+.I file.eps
+with the \-eps option).  If
+.I PS-file
+is \'-', the PostScript is sent to stdout.
+.SH OPTIONS
+.TP
+.BI \-f " number"
+Specifies the first page to print.
+.TP
+.BI \-l " number"
+Specifies the last page to print.
+.TP
+.B \-level1
+Generate Level 1 PostScript.  The resulting PostScript files will be
+significantly larger (if they contain images), but will print on Level
+1 printers.  This also converts all images to black and white.  No
+more than one of the PostScript level options (\-level1, \-level1sep,
+\-level2, \-level2sep, \-level3, \-level3Sep) may be given.
+.TP
+.B \-level1sep
+Generate Level 1 separable PostScript.  All colors are converted to
+CMYK.  Images are written with separate stream data for the four
+components.
+.TP
+.B \-level2
+Generate Level 2 PostScript.  Level 2 supports color images and image
+compression.  This is the default setting.
+.TP
+.B \-level2sep
+Generate Level 2 separable PostScript.  All colors are converted to
+CMYK.  The PostScript separation convention operators are used to
+handle custom (spot) colors.
+.TP
+.B \-level3
+Generate Level 3 PostScript.  This enables all Level 2 features plus
+CID font embedding.
+.TP
+.B \-level3Sep
+Generate Level 3 separable PostScript.  The separation handling is the
+same as for \-level2Sep.
+.TP
+.B \-origpagesizes
+Generate a PostScript file with variable page sizes and orientations,
+taking for each page the size of the original page in the PDF file. 
+The PostScript file contains "<</PageSize [WIDTH HEIGHT]>> setpagedevice"
+lines in each page header, so that the paper input tray gets correctly
+changed on the printer. This option should be used when pdftops is used
+as a print filter. Any specification of the page size via \-paper,
+\-paperw, or \-paperh will get overridden as long as each page of the
+PDF file has a defined paper size.  No more than one of the mode options
+(\-origpagesizes, \-eps, \-form) may be given.
+.TP
+.B \-eps
+Generate an Encapsulated PostScript (EPS) file.  An EPS file contains
+a single image, so if you use this option with a multi-page PDF file,
+you must use \-f and \-l to specify a single page.  No more than one of
+the mode options (\-origpagesizes, \-eps, \-form) may be given.
+.TP
+.B \-form
+Generate a PostScript form which can be imported by software that
+understands forms.  A form contains a single page, so if you use this
+option with a multi-page PDF file, you must use \-f and \-l to specify a
+single page.  The \-level1 option cannot be used with \-form.  No more
+than one of the mode options (\-origpagesizes, \-eps, \-form) may be
+given.
+.TP
+.B \-opi
+Generate OPI comments for all images and forms which have OPI
+information.  (This option is only available if pdftops was compiled
+with OPI support.)
+.TP
+.B \-binary
+Write binary data in Level 1 PostScript.  By default, pdftops writes
+hex-encoded data in Level 1 PostScript.  Binary data is non-standard
+in Level 1 PostScript but reduces the file size and can be useful
+when Level 1 PostScript is required only for its restricted use
+of PostScript operators.
+.TP
+.BI \-r " number"
+Set the resolution in DPI when pdftops rasterizes images with
+transparencies or, for Level 1 PostScript, when pdftops
+rasterizes images with color masks.
+By default, pdftops rasterizes images to 300 DPI.
+.TP
+.B \-noembt1
+By default, any Type 1 fonts which are embedded in the PDF file are
+copied into the PostScript file.  This option causes pdftops to
+substitute base fonts instead.  Embedded fonts make PostScript files
+larger, but may be necessary for readable output.
+.TP
+.B \-noembtt
+By default, any TrueType fonts which are embedded in the PDF file are
+copied into the PostScript file.  This option causes pdftops to
+substitute base fonts instead.  Embedded fonts make PostScript files
+larger, but may be necessary for readable output.  Also, some
+PostScript interpreters do not have TrueType rasterizers.
+.TP
+.B \-noembcidps
+By default, any CID PostScript fonts which are embedded in the PDF
+file are copied into the PostScript file.  This option disables that
+embedding.  No attempt is made to substitute for non-embedded CID
+PostScript fonts.
+.TP
+.B \-noembcidtt
+By default, any CID TrueType fonts which are embedded in the PDF file
+are copied into the PostScript file.  This option disables that
+embedding.  No attempt is made to substitute for non-embedded CID
+TrueType fonts.
+.TP
+.B \-passfonts
+By default, references to non-embedded 8-bit fonts in the PDF file are
+substituted with the closest "Helvetica", "Times-Roman", or "Courier" font.
+This option passes references to non-embedded fonts
+through to the PostScript file.
+.TP
+.B \-preload
+preload images and forms
+.TP
+.BI \-paper " size"
+Set the paper size to one of "letter", "legal", "A4", or "A3".  This
+can also be set to "match", which will set the paper size to match the
+size specified in the PDF file. \-origpagesizes overrides this setting
+if the PDF file has defined page sizes.
+.TP
+.BI \-paperw " size"
+Set the paper width, in points. \-origpagesizes overrides this setting
+if the PDF file has defined page sizes.
+.TP
+.BI \-paperh " size"
+Set the paper height, in points. \-origpagesizes overrides this setting
+if the PDF file has defined page sizes.
+.TP
+.B \-nocrop
+By default, output is cropped to the CropBox specified in the PDF
+file.  This option disables cropping.
+.TP
+.B \-expand
+Expand PDF pages smaller than the paper to fill the paper.  By
+default, these pages are not scaled.
+.TP
+.B \-noshrink
+Don't scale PDF pages which are larger than the paper.  By default,
+pages larger than the paper are shrunk to fit.
+.TP
+.B \-nocenter
+By default, PDF pages smaller than the paper (after any scaling) are
+centered on the paper.  This option causes them to be aligned to the
+lower-left corner of the paper instead.
+.TP
+.B \-duplex
+Set the Duplex pagedevice entry in the PostScript file.  This tells
+duplex-capable printers to enable duplexing.
+.TP
+.BI \-opw " password"
+Specify the owner password for the PDF file.  Providing this will
+bypass all security restrictions.
+.TP
+.BI \-upw " password"
+Specify the user password for the PDF file.
+.TP
+.B \-q
+Don't print any messages or errors.
+.TP
+.B \-v
+Print copyright and version information.
+.TP
+.B \-h
+Print usage information.
+.RB ( \-help
+and
+.B \-\-help
+are equivalent.)
+.SH EXIT CODES
+The Xpdf tools use the following exit codes:
+.TP
+0
+No error.
+.TP
+1
+Error opening a PDF file.
+.TP
+2
+Error opening an output file.
+.TP
+3
+Error related to PDF permissions.
+.TP
+99
+Other error.
+.SH AUTHOR
+The pdftops software and documentation are copyright 1996-2011 Glyph &
+Cog, LLC.
+.SH "SEE ALSO"
+.BR pdfdetach (1),
+.BR pdffonts (1),
+.BR pdfimages (1),
+.BR pdfinfo (1),
+.BR pdftocairo (1),
+.BR pdftohtml (1),
+.BR pdftoppm (1),
+.BR pdftotext (1)
diff --git a/utils/pdftops.cc b/utils/pdftops.cc
new file mode 100644 (file)
index 0000000..7f5a0ce
--- /dev/null
@@ -0,0 +1,422 @@
+//========================================================================
+//
+// pdftops.cc
+//
+// Copyright 1996-2003 Glyph & Cog, LLC
+//
+// Modified for Debian by Hamish Moffatt, 22 May 2002.
+//
+//========================================================================
+
+//========================================================================
+//
+// Modified under the Poppler project - http://poppler.freedesktop.org
+//
+// All changes made under the Poppler project to this file are licensed
+// under GPL version 2 or later
+//
+// Copyright (C) 2006 Kristian Høgsberg <krh@redhat.com>
+// Copyright (C) 2007-2008, 2010 Albert Astals Cid <aacid@kde.org>
+// Copyright (C) 2009 Till Kamppeter <till.kamppeter@gmail.com>
+// Copyright (C) 2009 Sanjoy Mahajan <sanjoy@mit.edu>
+// Copyright (C) 2009, 2011, 2012 William Bader <williambader@hotmail.com>
+// Copyright (C) 2010 Hib Eris <hib@hiberis.nl>
+// Copyright (C) 2012 Thomas Freitag <Thomas.Freitag@alfa.de>
+//
+// To see a description of the changes please see the Changelog file that
+// came with your tarball or type make ChangeLog if you are building from git
+//
+//========================================================================
+
+#include "config.h"
+#include <poppler-config.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <stddef.h>
+#include <string.h>
+#include "parseargs.h"
+#include "goo/GooString.h"
+#include "goo/gmem.h"
+#include "GlobalParams.h"
+#include "Object.h"
+#include "Stream.h"
+#include "Array.h"
+#include "Dict.h"
+#include "XRef.h"
+#include "Catalog.h"
+#include "Page.h"
+#include "PDFDoc.h"
+#include "PDFDocFactory.h"
+#include "PSOutputDev.h"
+#include "Error.h"
+
+static GBool setPSPaperSize(char *size, int &psPaperWidth, int &psPaperHeight) {
+  if (!strcmp(size, "match")) {
+    psPaperWidth = psPaperHeight = -1;
+  } else if (!strcmp(size, "letter")) {
+    psPaperWidth = 612;
+    psPaperHeight = 792;
+  } else if (!strcmp(size, "legal")) {
+    psPaperWidth = 612;
+    psPaperHeight = 1008;
+  } else if (!strcmp(size, "A4")) {
+    psPaperWidth = 595;
+    psPaperHeight = 842;
+  } else if (!strcmp(size, "A3")) {
+    psPaperWidth = 842;
+    psPaperHeight = 1190;
+  } else {
+    return gFalse;
+  }
+  return gTrue;
+}
+
+
+static int firstPage = 1;
+static int lastPage = 0;
+static GBool level1 = gFalse;
+static GBool level1Sep = gFalse;
+static GBool level2 = gFalse;
+static GBool level2Sep = gFalse;
+static GBool level3 = gFalse;
+static GBool level3Sep = gFalse;
+static GBool doOrigPageSizes = gFalse;
+static GBool doEPS = gFalse;
+static GBool doForm = gFalse;
+#if OPI_SUPPORT
+static GBool doOPI = gFalse;
+#endif
+static int splashResolution = 0;
+static GBool psBinary = gFalse;
+static GBool noEmbedT1Fonts = gFalse;
+static GBool noEmbedTTFonts = gFalse;
+static GBool noEmbedCIDPSFonts = gFalse;
+static GBool noEmbedCIDTTFonts = gFalse;
+static GBool fontPassthrough = gFalse;
+static GBool preload = gFalse;
+static char paperSize[15] = "";
+static int paperWidth = -1;
+static int paperHeight = -1;
+static GBool noCrop = gFalse;
+static GBool expand = gFalse;
+static GBool noShrink = gFalse;
+static GBool noCenter = gFalse;
+static GBool duplex = gFalse;
+static char ownerPassword[33] = "\001";
+static char userPassword[33] = "\001";
+static GBool quiet = gFalse;
+static GBool printVersion = gFalse;
+static GBool printHelp = gFalse;
+#if SPLASH_CMYK
+static GBool overprint = gFalse;
+#endif
+
+static const ArgDesc argDesc[] = {
+  {"-f",          argInt,      &firstPage,      0,
+   "first page to print"},
+  {"-l",          argInt,      &lastPage,       0,
+   "last page to print"},
+  {"-level1",     argFlag,     &level1,         0,
+   "generate Level 1 PostScript"},
+  {"-level1sep",  argFlag,     &level1Sep,      0,
+   "generate Level 1 separable PostScript"},
+  {"-level2",     argFlag,     &level2,         0,
+   "generate Level 2 PostScript"},
+  {"-level2sep",  argFlag,     &level2Sep,      0,
+   "generate Level 2 separable PostScript"},
+  {"-level3",     argFlag,     &level3,         0,
+   "generate Level 3 PostScript"},
+  {"-level3sep",  argFlag,     &level3Sep,      0,
+   "generate Level 3 separable PostScript"},
+  {"-origpagesizes",argFlag,   &doOrigPageSizes,0,
+   "conserve original page sizes"},
+  {"-eps",        argFlag,     &doEPS,          0,
+   "generate Encapsulated PostScript (EPS)"},
+  {"-form",       argFlag,     &doForm,         0,
+   "generate a PostScript form"},
+#if OPI_SUPPORT
+  {"-opi",        argFlag,     &doOPI,          0,
+   "generate OPI comments"},
+#endif
+  {"-r",          argInt,      &splashResolution, 0,
+   "resolution for rasterization, in DPI (default is 300)"},
+  {"-binary",     argFlag,     &psBinary,       0,
+   "write binary data in Level 1 PostScript"},
+  {"-noembt1",    argFlag,     &noEmbedT1Fonts, 0,
+   "don't embed Type 1 fonts"},
+  {"-noembtt",    argFlag,     &noEmbedTTFonts, 0,
+   "don't embed TrueType fonts"},
+  {"-noembcidps", argFlag,     &noEmbedCIDPSFonts, 0,
+   "don't embed CID PostScript fonts"},
+  {"-noembcidtt", argFlag, &noEmbedCIDTTFonts,  0,
+   "don't embed CID TrueType fonts"},
+  {"-passfonts",  argFlag,        &fontPassthrough,0,
+   "don't substitute missing fonts"},
+  {"-preload",    argFlag,     &preload,        0,
+   "preload images and forms"},
+  {"-paper",      argString,   paperSize,       sizeof(paperSize),
+   "paper size (letter, legal, A4, A3, match)"},
+  {"-paperw",     argInt,      &paperWidth,     0,
+   "paper width, in points"},
+  {"-paperh",     argInt,      &paperHeight,    0,
+   "paper height, in points"},
+  {"-nocrop",     argFlag,     &noCrop,         0,
+   "don't crop pages to CropBox"},
+  {"-expand",     argFlag,     &expand,         0,
+   "expand pages smaller than the paper size"},
+  {"-noshrink",   argFlag,     &noShrink,       0,
+   "don't shrink pages larger than the paper size"},
+  {"-nocenter",   argFlag,     &noCenter,       0,
+   "don't center pages smaller than the paper size"},
+  {"-duplex",     argFlag,     &duplex,         0,
+   "enable duplex printing"},
+  {"-opw",        argString,   ownerPassword,   sizeof(ownerPassword),
+   "owner password (for encrypted files)"},
+  {"-upw",        argString,   userPassword,    sizeof(userPassword),
+   "user password (for encrypted files)"},
+#if SPLASH_CMYK
+  {"-overprint",argFlag,   &overprint,      0,
+   "enable overprint"},
+#endif
+  {"-q",          argFlag,     &quiet,          0,
+   "don't print any messages or errors"},
+  {"-v",          argFlag,     &printVersion,   0,
+   "print copyright and version info"},
+  {"-h",          argFlag,     &printHelp,      0,
+   "print usage information"},
+  {"-help",       argFlag,     &printHelp,      0,
+   "print usage information"},
+  {"--help",      argFlag,     &printHelp,      0,
+   "print usage information"},
+  {"-?",          argFlag,     &printHelp,      0,
+   "print usage information"},
+  {NULL}
+};
+
+int main(int argc, char *argv[]) {
+  PDFDoc *doc;
+  GooString *fileName;
+  GooString *psFileName;
+  PSLevel level;
+  PSOutMode mode;
+  GooString *ownerPW, *userPW;
+  PSOutputDev *psOut;
+  GBool ok;
+  char *p;
+  int exitCode;
+
+  exitCode = 99;
+
+  // parse args
+  ok = parseArgs(argDesc, &argc, argv);
+  if (!ok || argc < 2 || argc > 3 || printVersion || printHelp) {
+    fprintf(stderr, "pdftops version %s\n", PACKAGE_VERSION);
+    fprintf(stderr, "%s\n", popplerCopyright);
+    fprintf(stderr, "%s\n", xpdfCopyright);
+    if (!printVersion) {
+      printUsage("pdftops", "<PDF-file> [<PS-file>]", argDesc);
+    }
+    if (printVersion || printHelp)
+      exit(0);
+    else
+      exit(1);
+  }
+  if ((level1 ? 1 : 0) +
+      (level1Sep ? 1 : 0) +
+      (level2 ? 1 : 0) +
+      (level2Sep ? 1 : 0) +
+      (level3 ? 1 : 0) +
+      (level3Sep ? 1 : 0) > 1) {
+    fprintf(stderr, "Error: use only one of the 'level' options.\n");
+    exit(1);
+  }
+  if ((doOrigPageSizes ? 1 : 0) +
+      (doEPS ? 1 : 0) +
+      (doForm ? 1 : 0) > 1) {
+    fprintf(stderr, "Error: use only one of -origpagesizes, -eps, and -form\n");
+    exit(1);
+  }
+  if (level1) {
+    level = psLevel1;
+  } else if (level1Sep) {
+    level = psLevel1Sep;
+  } else if (level2Sep) {
+    level = psLevel2Sep;
+  } else if (level3) {
+    level = psLevel3;
+  } else if (level3Sep) {
+    level = psLevel3Sep;
+  } else {
+    level = psLevel2;
+  }
+  if (doForm && level < psLevel2) {
+    fprintf(stderr, "Error: forms are only available with Level 2 output.\n");
+    exit(1);
+  }
+  mode = doOrigPageSizes ? psModePSOrigPageSizes
+                         : doEPS ? psModeEPS
+                                 : doForm ? psModeForm
+                                          : psModePS;
+  fileName = new GooString(argv[1]);
+
+  // read config file
+  globalParams = new GlobalParams();
+  if (paperSize[0]) {
+    if (!setPSPaperSize(paperSize, paperWidth, paperHeight)) {
+      fprintf(stderr, "Invalid paper size\n");
+      delete fileName;
+      goto err0;
+    }
+  }
+#if SPLASH_CMYK
+  if (overprint) {
+    globalParams->setOverprintPreview(gTrue);
+  }
+#endif  
+  if (expand) {
+    globalParams->setPSExpandSmaller(gTrue);
+  }
+  if (noShrink) {
+    globalParams->setPSShrinkLarger(gFalse);
+  }
+  if (noCenter) {
+    globalParams->setPSCenter(gFalse);
+  }
+  if (level1 || level1Sep || level2 || level2Sep || level3 || level3Sep) {
+    globalParams->setPSLevel(level);
+  }
+  if (splashResolution > 0) {
+    globalParams->setPSRasterResolution(splashResolution);
+  }
+  if (noEmbedT1Fonts) {
+    globalParams->setPSEmbedType1(!noEmbedT1Fonts);
+  }
+  if (noEmbedTTFonts) {
+    globalParams->setPSEmbedTrueType(!noEmbedTTFonts);
+  }
+  if (noEmbedCIDPSFonts) {
+    globalParams->setPSEmbedCIDPostScript(!noEmbedCIDPSFonts);
+  }
+  if (noEmbedCIDTTFonts) {
+    globalParams->setPSEmbedCIDTrueType(!noEmbedCIDTTFonts);
+  }
+  if (fontPassthrough) {
+    globalParams->setPSFontPassthrough(fontPassthrough);
+  }
+  if (preload) {
+    globalParams->setPSPreload(preload);
+  }
+#if OPI_SUPPORT
+  if (doOPI) {
+    globalParams->setPSOPI(doOPI);
+  }
+#endif
+  if (psBinary) {
+    globalParams->setPSBinary(psBinary);
+  }
+  if (quiet) {
+    globalParams->setErrQuiet(quiet);
+  }
+
+  // open PDF file
+  if (ownerPassword[0] != '\001') {
+    ownerPW = new GooString(ownerPassword);
+  } else {
+    ownerPW = NULL;
+  }
+  if (userPassword[0] != '\001') {
+    userPW = new GooString(userPassword);
+  } else {
+    userPW = NULL;
+  }
+  if (fileName->cmp("-") == 0) {
+      delete fileName;
+      fileName = new GooString("fd://0");
+  }
+
+  doc = PDFDocFactory().createPDFDoc(*fileName, ownerPW, userPW);
+
+  if (userPW) {
+    delete userPW;
+  }
+  if (ownerPW) {
+    delete ownerPW;
+  }
+  if (!doc->isOk()) {
+    exitCode = 1;
+    goto err1;
+  }
+
+#ifdef ENFORCE_PERMISSIONS
+  // check for print permission
+  if (!doc->okToPrint()) {
+    error(errNotAllowed, -1, "Printing this document is not allowed.");
+    exitCode = 3;
+    goto err1;
+  }
+#endif
+
+  // construct PostScript file name
+  if (argc == 3) {
+    psFileName = new GooString(argv[2]);
+  } else if (fileName->cmp("fd://0") == 0) {
+    error(errCommandLine, -1, "You have to provide an output filename when reading form stdin.");
+    goto err1;
+  } else {
+    p = fileName->getCString() + fileName->getLength() - 4;
+    if (!strcmp(p, ".pdf") || !strcmp(p, ".PDF")) {
+      psFileName = new GooString(fileName->getCString(),
+                              fileName->getLength() - 4);
+    } else {
+      psFileName = fileName->copy();
+    }
+    psFileName->append(doEPS ? ".eps" : ".ps");
+  }
+
+  // get page range
+  if (firstPage < 1) {
+    firstPage = 1;
+  }
+  if (lastPage < 1 || lastPage > doc->getNumPages()) {
+    lastPage = doc->getNumPages();
+  }
+
+  // check for multi-page EPS or form
+  if ((doEPS || doForm) && firstPage != lastPage) {
+    error(errCommandLine, -1, "EPS and form files can only contain one page.");
+    goto err2;
+  }
+
+  // write PostScript file
+  psOut = new PSOutputDev(psFileName->getCString(), doc,
+                         NULL, firstPage, lastPage, mode,
+                         paperWidth,
+                         paperHeight,
+                         duplex);
+  if (psOut->isOk()) {
+    doc->displayPages(psOut, firstPage, lastPage, 72, 72,
+                     0, noCrop, !noCrop, gTrue);
+  } else {
+    delete psOut;
+    exitCode = 2;
+    goto err2;
+  }
+  delete psOut;
+
+  exitCode = 0;
+
+  // clean up
+ err2:
+  delete psFileName;
+ err1:
+  delete doc;
+  delete fileName;
+ err0:
+  delete globalParams;
+
+  // check for memory leaks
+  Object::memCheck(stderr);
+  gMemReport(stderr);
+
+  return exitCode;
+}
diff --git a/utils/pdftotext.1 b/utils/pdftotext.1
new file mode 100644 (file)
index 0000000..0199b03
--- /dev/null
@@ -0,0 +1,137 @@
+.\" Copyright 1997-2011 Glyph & Cog, LLC
+.TH pdftotext 1 "15 August 2011"
+.SH NAME
+pdftotext \- Portable Document Format (PDF) to text converter
+(version 3.03)
+.SH SYNOPSIS
+.B pdftotext
+[options]
+.RI [ PDF-file
+.RI [ text-file ]]
+.SH DESCRIPTION
+.B Pdftotext
+converts Portable Document Format (PDF) files to plain text.
+.PP
+Pdftotext reads the PDF file,
+.IR PDF-file ,
+and writes a text file,
+.IR text-file .
+If
+.I text-file
+is not specified, pdftotext converts
+.I file.pdf
+to
+.IR file.txt .
+If 
+.I text-file
+is \'-', the text is sent to stdout.
+.SH OPTIONS
+.TP
+.BI \-f " number"
+Specifies the first page to convert.
+.TP
+.BI \-l " number"
+Specifies the last page to convert.
+.TP
+.BI \-r " number"
+Specifies the resolution, in DPI.  The default is 72 DPI.
+.TP
+.BI \-x " number"
+Specifies the x-coordinate of the crop area top left corner
+.TP
+.BI \-y " number"
+Specifies the y-coordinate of the crop area top left corner
+.TP
+.BI \-W " number"
+Specifies the width of crop area in pixels (default is 0)
+.TP
+.BI \-H " number"
+Specifies the height of crop area in pixels (default is 0)
+.TP
+.B \-layout
+Maintain (as best as possible) the original physical layout of the
+text.  The default is to \'undo' physical layout (columns,
+hyphenation, etc.) and output the text in reading order.
+.TP
+.BI \-fixed " number"
+Assume fixed-pitch (or tabular) text, with the specified character
+width (in points).  This forces physical layout mode.
+.TP
+.B \-raw
+Keep the text in content stream order.  This is a hack which often
+"undoes" column formatting, etc.  Use of raw mode is no longer
+recommended.
+.TP
+.B \-htmlmeta
+Generate a simple HTML file, including the meta information.  This
+simply wraps the text in <pre> and </pre> and prepends the meta
+headers.
+.TP
+.B \-bbox
+Generate an XHTML file containing bounding box information for each
+word in the file.
+.TP
+.BI \-enc " encoding-name"
+Sets the encoding to use for text output. This defaults to "UTF-8".
+.TP
+.B \-listenc
+Lits the available encodings
+.TP
+.BI \-eol " unix | dos | mac"
+Sets the end-of-line convention to use for text output.
+.TP
+.B \-nopgbrk
+Don't insert page breaks (form feed characters) between pages.
+.TP
+.BI \-opw " password"
+Specify the owner password for the PDF file.  Providing this will
+bypass all security restrictions.
+.TP
+.BI \-upw " password"
+Specify the user password for the PDF file.
+.TP
+.B \-q
+Don't print any messages or errors.
+.TP
+.B \-v
+Print copyright and version information.
+.TP
+.B \-h
+Print usage information.
+.RB ( \-help
+and
+.B \-\-help
+are equivalent.)
+.SH BUGS
+Some PDF files contain fonts whose encodings have been mangled beyond
+recognition.  There is no way (short of OCR) to extract text from
+these files.
+.SH EXIT CODES
+The Xpdf tools use the following exit codes:
+.TP
+0
+No error.
+.TP
+1
+Error opening a PDF file.
+.TP
+2
+Error opening an output file.
+.TP
+3
+Error related to PDF permissions.
+.TP
+99
+Other error.
+.SH AUTHOR
+The pdftotext software and documentation are copyright 1996-2011 Glyph
+& Cog, LLC.
+.SH "SEE ALSO"
+.BR pdfdetach (1),
+.BR pdffonts (1),
+.BR pdfimages (1),
+.BR pdfinfo (1),
+.BR pdftocairo (1),
+.BR pdftohtml (1),
+.BR pdftoppm (1),
+.BR pdftops (1)
diff --git a/utils/pdftotext.cc b/utils/pdftotext.cc
new file mode 100644 (file)
index 0000000..a170f1b
--- /dev/null
@@ -0,0 +1,486 @@
+//========================================================================
+//
+// pdftotext.cc
+//
+// Copyright 1997-2003 Glyph & Cog, LLC
+//
+// Modified for Debian by Hamish Moffatt, 22 May 2002.
+//
+//========================================================================
+
+//========================================================================
+//
+// Modified under the Poppler project - http://poppler.freedesktop.org
+//
+// All changes made under the Poppler project to this file are licensed
+// under GPL version 2 or later
+//
+// Copyright (C) 2006 Dominic Lachowicz <cinamod@hotmail.com>
+// Copyright (C) 2007-2008, 2010, 2011 Albert Astals Cid <aacid@kde.org>
+// Copyright (C) 2009 Jan Jockusch <jan@jockusch.de>
+// Copyright (C) 2010 Hib Eris <hib@hiberis.nl>
+// Copyright (C) 2010 Kenneth Berland <ken@hero.com>
+// Copyright (C) 2011 Tom Gleason <tom@buildadam.com>
+// Copyright (C) 2011 Steven Murdoch <Steven.Murdoch@cl.cam.ac.uk>
+//
+// To see a description of the changes please see the Changelog file that
+// came with your tarball or type make ChangeLog if you are building from git
+//
+//========================================================================
+
+#include "config.h"
+#include <poppler-config.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <stddef.h>
+#include <string.h>
+#include "parseargs.h"
+#include "printencodings.h"
+#include "goo/GooString.h"
+#include "goo/gmem.h"
+#include "GlobalParams.h"
+#include "Object.h"
+#include "Stream.h"
+#include "Array.h"
+#include "Dict.h"
+#include "XRef.h"
+#include "Catalog.h"
+#include "Page.h"
+#include "PDFDoc.h"
+#include "PDFDocFactory.h"
+#include "TextOutputDev.h"
+#include "CharTypes.h"
+#include "UnicodeMap.h"
+#include "PDFDocEncoding.h"
+#include "Error.h"
+#include <string>
+
+static void printInfoString(FILE *f, Dict *infoDict, const char *key,
+                           const char *text1, const char *text2, UnicodeMap *uMap);
+static void printInfoDate(FILE *f, Dict *infoDict, const char *key, const char *fmt);
+
+static int firstPage = 1;
+static int lastPage = 0;
+static double resolution = 72.0;
+static int x = 0;
+static int y = 0;
+static int w = 0;
+static int h = 0;
+static GBool bbox = gFalse;
+static GBool physLayout = gFalse;
+static double fixedPitch = 0;
+static GBool rawOrder = gFalse;
+static GBool htmlMeta = gFalse;
+static char textEncName[128] = "";
+static char textEOL[16] = "";
+static GBool noPageBreaks = gFalse;
+static char ownerPassword[33] = "\001";
+static char userPassword[33] = "\001";
+static GBool quiet = gFalse;
+static GBool printVersion = gFalse;
+static GBool printHelp = gFalse;
+static GBool printEnc = gFalse;
+
+static const ArgDesc argDesc[] = {
+  {"-f",       argInt,      &firstPage,     0,
+   "first page to convert"},
+  {"-l",       argInt,      &lastPage,      0,
+   "last page to convert"},
+  {"-r",      argFP,       &resolution,    0,
+   "resolution, in DPI (default is 72)"},
+  {"-x",      argInt,      &x,             0,
+   "x-coordinate of the crop area top left corner"},
+  {"-y",      argInt,      &y,             0,
+   "y-coordinate of the crop area top left corner"},
+  {"-W",      argInt,      &w,             0,
+   "width of crop area in pixels (default is 0)"},
+  {"-H",      argInt,      &h,             0,
+   "height of crop area in pixels (default is 0)"},
+  {"-layout",  argFlag,     &physLayout,    0,
+   "maintain original physical layout"},
+  {"-fixed",   argFP,       &fixedPitch,    0,
+   "assume fixed-pitch (or tabular) text"},
+  {"-raw",     argFlag,     &rawOrder,      0,
+   "keep strings in content stream order"},
+  {"-htmlmeta", argFlag,   &htmlMeta,       0,
+   "generate a simple HTML file, including the meta information"},
+  {"-enc",     argString,   textEncName,    sizeof(textEncName),
+   "output text encoding name"},
+  {"-listenc",argFlag,     &printEnc,      0,
+   "list available encodings"},
+  {"-eol",     argString,   textEOL,        sizeof(textEOL),
+   "output end-of-line convention (unix, dos, or mac)"},
+  {"-nopgbrk", argFlag,     &noPageBreaks,  0,
+   "don't insert page breaks between pages"},
+  {"-bbox", argFlag,     &bbox,  0,
+   "output bounding box for each word and page size to html.  Sets -htmlmeta"},
+  {"-opw",     argString,   ownerPassword,  sizeof(ownerPassword),
+   "owner password (for encrypted files)"},
+  {"-upw",     argString,   userPassword,   sizeof(userPassword),
+   "user password (for encrypted files)"},
+  {"-q",       argFlag,     &quiet,         0,
+   "don't print any messages or errors"},
+  {"-v",       argFlag,     &printVersion,  0,
+   "print copyright and version info"},
+  {"-h",       argFlag,     &printHelp,     0,
+   "print usage information"},
+  {"-help",    argFlag,     &printHelp,     0,
+   "print usage information"},
+  {"--help",   argFlag,     &printHelp,     0,
+   "print usage information"},
+  {"-?",       argFlag,     &printHelp,     0,
+   "print usage information"},
+  {NULL}
+};
+
+static std::string myStringReplace(const std::string &inString, const std::string &oldToken, const std::string &newToken) {
+  std::string result = inString;
+  size_t foundLoc;
+  int advance = 0;
+  do {
+    foundLoc = result.find(oldToken, advance);
+    if (foundLoc != std::string::npos){
+      result.replace(foundLoc, oldToken.length(), newToken);
+      advance = foundLoc + newToken.length();
+    }
+  } while (foundLoc != std::string::npos );
+  return result;
+}
+
+static std::string myXmlTokenReplace(const char *inString){
+  std::string myString(inString);
+  myString = myStringReplace(myString, "&",  "&amp;" );
+  myString = myStringReplace(myString, "'",  "&apos;" );
+  myString = myStringReplace(myString, "\"", "&quot;" );
+  myString = myStringReplace(myString, "<",  "&lt;" );
+  myString = myStringReplace(myString, ">",  "&gt;" );
+  return myString;
+}
+
+int main(int argc, char *argv[]) {
+  PDFDoc *doc;
+  GooString *fileName;
+  GooString *textFileName;
+  GooString *ownerPW, *userPW;
+  TextOutputDev *textOut;
+  FILE *f;
+  UnicodeMap *uMap;
+  Object info;
+  GBool ok;
+  char *p;
+  int exitCode;
+
+  exitCode = 99;
+
+  // parse args
+  ok = parseArgs(argDesc, &argc, argv);
+  if (bbox) {
+    htmlMeta = gTrue;
+  }
+  if (!ok || (argc < 2 && !printEnc) || argc > 3 || printVersion || printHelp) {
+    fprintf(stderr, "pdftotext version %s\n", PACKAGE_VERSION);
+    fprintf(stderr, "%s\n", popplerCopyright);
+    fprintf(stderr, "%s\n", xpdfCopyright);
+    if (!printVersion) {
+      printUsage("pdftotext", "<PDF-file> [<text-file>]", argDesc);
+    }
+    if (printVersion || printHelp)
+      exitCode = 0;
+    goto err0;
+  }
+
+  // read config file
+  globalParams = new GlobalParams();
+
+  if (printEnc) {
+    printEncodings();
+    delete globalParams;
+    exitCode = 0;
+    goto err0;
+  }
+
+  fileName = new GooString(argv[1]);
+  if (fixedPitch) {
+    physLayout = gTrue;
+  }
+
+  if (textEncName[0]) {
+    globalParams->setTextEncoding(textEncName);
+  }
+  if (textEOL[0]) {
+    if (!globalParams->setTextEOL(textEOL)) {
+      fprintf(stderr, "Bad '-eol' value on command line\n");
+    }
+  }
+  if (noPageBreaks) {
+    globalParams->setTextPageBreaks(gFalse);
+  }
+  if (quiet) {
+    globalParams->setErrQuiet(quiet);
+  }
+
+  // get mapping to output encoding
+  if (!(uMap = globalParams->getTextEncoding())) {
+    error(errCommandLine, -1, "Couldn't get text encoding");
+    delete fileName;
+    goto err1;
+  }
+
+  // open PDF file
+  if (ownerPassword[0] != '\001') {
+    ownerPW = new GooString(ownerPassword);
+  } else {
+    ownerPW = NULL;
+  }
+  if (userPassword[0] != '\001') {
+    userPW = new GooString(userPassword);
+  } else {
+    userPW = NULL;
+  }
+
+  if (fileName->cmp("-") == 0) {
+      delete fileName;
+      fileName = new GooString("fd://0");
+  }
+
+  doc = PDFDocFactory().createPDFDoc(*fileName, ownerPW, userPW);
+
+  if (userPW) {
+    delete userPW;
+  }
+  if (ownerPW) {
+    delete ownerPW;
+  }
+  if (!doc->isOk()) {
+    exitCode = 1;
+    goto err2;
+  }
+
+#ifdef ENFORCE_PERMISSIONS
+  // check for copy permission
+  if (!doc->okToCopy()) {
+    error(errNotAllowed, -1, "Copying of text from this document is not allowed.");
+    exitCode = 3;
+    goto err2;
+  }
+#endif
+
+  // construct text file name
+  if (argc == 3) {
+    textFileName = new GooString(argv[2]);
+  } else if (fileName->cmp("fd://0") == 0) {
+     error(errCommandLine, -1, "You have to provide an output filename when reading form stdin.");
+     goto err2;
+  } else {
+    p = fileName->getCString() + fileName->getLength() - 4;
+    if (!strcmp(p, ".pdf") || !strcmp(p, ".PDF")) {
+      textFileName = new GooString(fileName->getCString(),
+                                fileName->getLength() - 4);
+    } else {
+      textFileName = fileName->copy();
+    }
+    textFileName->append(htmlMeta ? ".html" : ".txt");
+  }
+
+  // get page range
+  if (firstPage < 1) {
+    firstPage = 1;
+  }
+  if (lastPage < 1 || lastPage > doc->getNumPages()) {
+    lastPage = doc->getNumPages();
+  }
+
+  // write HTML header
+  if (htmlMeta) {
+    if (!textFileName->cmp("-")) {
+      f = stdout;
+    } else {
+      if (!(f = fopen(textFileName->getCString(), "wb"))) {
+       error(errIO, -1, "Couldn't open text file '{0:t}'", textFileName);
+       exitCode = 2;
+       goto err3;
+      }
+    }
+    fputs("<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">", f);
+    fputs("<html xmlns=\"http://www.w3.org/1999/xhtml\">\n", f);
+    fputs("<head>\n", f);
+    doc->getDocInfo(&info);
+    if (info.isDict()) {
+      Object obj;
+      if (info.getDict()->lookup("Title", &obj)->isString()) {
+        printInfoString(f, info.getDict(), "Title", "<title>", "</title>\n", uMap);
+      } else {
+        fputs("<title></title>\n", f);
+      }
+      obj.free();
+      printInfoString(f, info.getDict(), "Subject",
+                     "<meta name=\"Subject\" content=\"", "\"/>\n", uMap);
+      printInfoString(f, info.getDict(), "Keywords",
+                     "<meta name=\"Keywords\" content=\"", "\"/>\n", uMap);
+      printInfoString(f, info.getDict(), "Author",
+                     "<meta name=\"Author\" content=\"", "\"/>\n", uMap);
+      printInfoString(f, info.getDict(), "Creator",
+                     "<meta name=\"Creator\" content=\"", "\"/>\n", uMap);
+      printInfoString(f, info.getDict(), "Producer",
+                     "<meta name=\"Producer\" content=\"", "\"/>\n", uMap);
+      printInfoDate(f, info.getDict(), "CreationDate",
+                   "<meta name=\"CreationDate\" content=\"\"/>\n");
+      printInfoDate(f, info.getDict(), "LastModifiedDate",
+                   "<meta name=\"ModDate\" content=\"\"/>\n");
+    }
+    info.free();
+    fputs("</head>\n", f);
+    fputs("<body>\n", f);
+    if (!bbox) fputs("<pre>\n", f);
+    if (f != stdout) {
+      fclose(f);
+    }
+  }
+
+  // write text file
+  if (bbox) {
+    textOut = new TextOutputDev(NULL, physLayout, fixedPitch, rawOrder, htmlMeta);
+    if (!(f = fopen(textFileName->getCString(), "ab"))) {
+      error(errIO, -1, "Couldn't open text file '{0:t}' for append", textFileName);
+      exitCode = 2;
+      delete textOut;
+      goto err3;
+    }
+
+    if (textOut->isOk()) {
+      fprintf(f, "<doc>\n");
+      for (int page = firstPage; page <= lastPage; ++page) {
+        fprintf(f, "  <page width=\"%f\" height=\"%f\">\n",doc->getPageMediaWidth(page), doc->getPageMediaHeight(page));
+        doc->displayPage(textOut, page, resolution, resolution, 0, gTrue, gFalse, gFalse);
+        TextWordList *wordlist = textOut->makeWordList();
+        const int word_length = wordlist != NULL ? wordlist->getLength() : 0;
+        TextWord *word;
+        double xMinA, yMinA, xMaxA, yMaxA;
+        if (word_length == 0)
+          fprintf(stderr, "no word list\n");
+
+        for (int i = 0; i < word_length; ++i) {
+          word = wordlist->get(i);
+          word->getBBox(&xMinA, &yMinA, &xMaxA, &yMaxA);
+          const std::string myString = myXmlTokenReplace(word->getText()->getCString());
+          fprintf(f,"    <word xMin=\"%f\" yMin=\"%f\" xMax=\"%f\" yMax=\"%f\">%s</word>\n", xMinA, yMinA, xMaxA, yMaxA, myString.c_str());
+        }
+        fprintf(f, "  </page>\n");
+        delete wordlist;
+      }
+      fprintf(f, "</doc>\n");
+    }
+    fclose(f);
+  } else {
+    textOut = new TextOutputDev(textFileName->getCString(),
+                               physLayout, fixedPitch, rawOrder, htmlMeta);
+    if (textOut->isOk()) {
+      if ((w==0) && (h==0) && (x==0) && (y==0)) {
+       doc->displayPages(textOut, firstPage, lastPage, resolution, resolution, 0,
+                         gTrue, gFalse, gFalse);
+      } else {
+       
+       for (int page = firstPage; page <= lastPage; ++page) {
+         doc->displayPageSlice(textOut, page, resolution, resolution, 0,
+                             gTrue, gFalse, gFalse, 
+                             x, y, w, h);
+       }
+      }
+
+    } else {
+    delete textOut;
+    exitCode = 2;
+    goto err3;
+    }
+  }
+  delete textOut;
+
+  // write end of HTML file
+  if (htmlMeta) {
+    if (!textFileName->cmp("-")) {
+      f = stdout;
+    } else {
+      if (!(f = fopen(textFileName->getCString(), "ab"))) {
+       error(errIO, -1, "Couldn't open text file '{0:t}'", textFileName);
+       exitCode = 2;
+       goto err3;
+      }
+    }
+    if (!bbox) fputs("</pre>\n", f);
+    fputs("</body>\n", f);
+    fputs("</html>\n", f);
+    if (f != stdout) {
+      fclose(f);
+    }
+  }
+
+  exitCode = 0;
+
+  // clean up
+ err3:
+  delete textFileName;
+ err2:
+  delete doc;
+  delete fileName;
+  uMap->decRefCnt();
+ err1:
+  delete globalParams;
+ err0:
+
+  // check for memory leaks
+  Object::memCheck(stderr);
+  gMemReport(stderr);
+
+  return exitCode;
+}
+
+static void printInfoString(FILE *f, Dict *infoDict, const char *key,
+                           const char *text1, const char *text2, UnicodeMap *uMap) {
+  Object obj;
+  GooString *s1;
+  GBool isUnicode;
+  Unicode u;
+  char buf[8];
+  int i, n;
+
+  if (infoDict->lookup(key, &obj)->isString()) {
+    fputs(text1, f);
+    s1 = obj.getString();
+    if ((s1->getChar(0) & 0xff) == 0xfe &&
+       (s1->getChar(1) & 0xff) == 0xff) {
+      isUnicode = gTrue;
+      i = 2;
+    } else {
+      isUnicode = gFalse;
+      i = 0;
+    }
+    while (i < obj.getString()->getLength()) {
+      if (isUnicode) {
+       u = ((s1->getChar(i) & 0xff) << 8) |
+           (s1->getChar(i+1) & 0xff);
+       i += 2;
+      } else {
+       u = pdfDocEncoding[s1->getChar(i) & 0xff];
+       ++i;
+      }
+      n = uMap->mapUnicode(u, buf, sizeof(buf));
+      fwrite(buf, 1, n, f);
+    }
+    fputs(text2, f);
+  }
+  obj.free();
+}
+
+static void printInfoDate(FILE *f, Dict *infoDict, const char *key, const char *fmt) {
+  Object obj;
+  char *s;
+
+  if (infoDict->lookup(key, &obj)->isString()) {
+    s = obj.getString()->getCString();
+    if (s[0] == 'D' && s[1] == ':') {
+      s += 2;
+    }
+    fprintf(f, fmt, s);
+  }
+  obj.free();
+}
diff --git a/utils/pdfunite.1 b/utils/pdfunite.1
new file mode 100644 (file)
index 0000000..9b1f2e8
--- /dev/null
@@ -0,0 +1,33 @@
+.\" Copyright 2011 The Poppler Developers - http://poppler.freedesktop.org
+.TH pdfunite 1 "15 September 2011"
+.SH NAME
+pdfunite \- Portable Document Format (PDF) page merger
+.SH SYNOPSIS
+.B pdfunite
+[options]
+.I PDF-sourcefile1..PDF-sourcefilen PDF-destfile
+.SH DESCRIPTION
+.B pdfunite
+merges several PDF (Portable Document Format)  files in order of their occurence on command line to one PDF result file.
+.TP
+Neither of the PDF-sourcefile1 to PDF-sourcefilen should be encrypted.
+.SH OPTIONS
+.TP
+.B \-v
+Print copyright and version information.
+.TP
+.B \-h
+Print usage information.
+.RB ( \-help
+and
+.B \-\-help
+are equivalent.)
+.SH EXAMPLE
+pdfunite sample1.pdf sample2.pdf sample.pdf
+.TP
+merges all pages from sample1.pdf and sample2.pdf (in that order) and creates sample.pdf
+.SH AUTHOR
+The pdfunite software and documentation are copyright 1996-2004 Glyph & Cog, LLC
+and copyright 2005-2011 The Poppler Developers - http://poppler.freedesktop.org
+.SH "SEE ALSO"
+.BR pdfseparate (1),
diff --git a/utils/pdfunite.cc b/utils/pdfunite.cc
new file mode 100644 (file)
index 0000000..212f89b
--- /dev/null
@@ -0,0 +1,182 @@
+//========================================================================
+//
+// pdfunite.cc
+//
+// This file is licensed under the GPLv2 or later
+//
+// Copyright (C) 2011 Thomas Freitag <Thomas.Freitag@alfa.de>
+// Copyright (C) 2012 Arseny Solokha <asolokha@gmx.com>
+// Copyright (C) 2012 Fabio D'Urso <fabiodurso@hotmail.it>
+//
+//========================================================================
+#include <PDFDoc.h>
+#include <GlobalParams.h>
+#include "parseargs.h"
+#include "config.h"
+#include <poppler-config.h>
+#include <vector>
+
+static GBool printVersion = gFalse;
+static GBool printHelp = gFalse;
+
+static const ArgDesc argDesc[] = {
+  {"-v", argFlag, &printVersion, 0,
+   "print copyright and version info"},
+  {"-h", argFlag, &printHelp, 0,
+   "print usage information"},
+  {"-help", argFlag, &printHelp, 0,
+   "print usage information"},
+  {"--help", argFlag, &printHelp, 0,
+   "print usage information"},
+  {"-?", argFlag, &printHelp, 0,
+   "print usage information"},
+  {NULL}
+};
+
+///////////////////////////////////////////////////////////////////////////
+int main (int argc, char *argv[])
+///////////////////////////////////////////////////////////////////////////
+// Merge PDF files given by arguments 1 to argc-2 and write the result
+// to the file specified by argument argc-1.
+///////////////////////////////////////////////////////////////////////////
+{
+  int objectsCount = 0;
+  Guint numOffset = 0;
+  std::vector<Object> pages;
+  std::vector<Guint> offsets;
+  XRef *yRef, *countRef;
+  FILE *f;
+  OutStream *outStr;
+  int i;
+  int j, rootNum;
+  std::vector<PDFDoc *>docs;
+  int majorVersion = 0;
+  int minorVersion = 0;
+  char *fileName = argv[argc - 1];
+  int exitCode;
+
+  exitCode = 99;
+  if (argc <= 3 || printVersion || printHelp) {
+    fprintf(stderr, "pdfunite version %s\n", PACKAGE_VERSION);
+    fprintf(stderr, "%s\n", popplerCopyright);
+    fprintf(stderr, "%s\n", xpdfCopyright);
+    if (!printVersion) {
+      printUsage("pdfunite", "<PDF-sourcefile-1>..<PDF-sourcefile-n> <PDF-destfile>",
+       argDesc);
+    }
+    if (printVersion || printHelp)
+      exitCode = 0;
+    return exitCode;
+  }
+  exitCode = 0;
+  globalParams = new GlobalParams();
+
+  for (i = 1; i < argc - 1; i++) {
+    GooString *gfileName = new GooString(argv[i]);
+    PDFDoc *doc = new PDFDoc(gfileName, NULL, NULL, NULL);
+    if (doc->isOk() && !doc->isEncrypted()) {
+      docs.push_back(doc);
+      if (doc->getPDFMajorVersion() > majorVersion) {
+        majorVersion = doc->getPDFMajorVersion();
+        minorVersion = doc->getPDFMinorVersion();
+      } else if (doc->getPDFMajorVersion() == majorVersion) {
+        if (doc->getPDFMinorVersion() > minorVersion) {
+          minorVersion = doc->getPDFMinorVersion();
+        }
+      }
+    } else if (doc->isOk()) {
+      error(errUnimplemented, -1, "Could not merge encrypted files ('{0:s}')", argv[i]);
+      return -1;
+    } else {
+      error(errSyntaxError, -1, "Could not merge damaged documents ('{0:s}')", argv[i]);
+      return -1;
+    }
+  }
+
+  if (!(f = fopen(fileName, "wb"))) {
+    error(errIO, -1, "Could not open file '{0:s}'", fileName);
+    return -1;
+  }
+  outStr = new FileOutStream(f, 0);
+
+  yRef = new XRef();
+  countRef = new XRef();
+  yRef->add(0, 65535, 0, gFalse);
+  PDFDoc::writeHeader(outStr, majorVersion, minorVersion);
+
+  for (i = 0; i < (int) docs.size(); i++) {
+    for (j = 1; j <= docs[i]->getNumPages(); j++) {
+      PDFRectangle *cropBox = NULL;
+      if (docs[i]->getCatalog()->getPage(j)->isCropped())
+        cropBox = docs[i]->getCatalog()->getPage(j)->getCropBox();
+      docs[i]->replacePageDict(j,
+           docs[i]->getCatalog()->getPage(j)->getRotate(),
+           docs[i]->getCatalog()->getPage(j)->getMediaBox(), cropBox, NULL);
+      Ref *refPage = docs[i]->getCatalog()->getPageRef(j);
+      Object page;
+      docs[i]->getXRef()->fetch(refPage->num, refPage->gen, &page);
+      pages.push_back(page);
+      offsets.push_back(numOffset);
+      Dict *pageDict = page.getDict();
+      docs[i]->markPageObjects(pageDict, yRef, countRef, numOffset);
+    }
+    objectsCount += docs[i]->writePageObjects(outStr, yRef, numOffset);
+    numOffset = yRef->getNumObjects() + 1;
+  }
+
+  rootNum = yRef->getNumObjects() + 1;
+  yRef->add(rootNum, 0, outStr->getPos(), gTrue);
+  outStr->printf("%d 0 obj\n", rootNum);
+  outStr->printf("<< /Type /Catalog /Pages %d 0 R", rootNum + 1);
+  outStr->printf(">>\nendobj\n");
+  objectsCount++;
+
+  yRef->add(rootNum + 1, 0, outStr->getPos(), gTrue);
+  outStr->printf("%d 0 obj\n", rootNum + 1);
+  outStr->printf("<< /Type /Pages /Kids [");
+  for (j = 0; j < (int) pages.size(); j++)
+    outStr->printf(" %d 0 R", rootNum + j + 2);
+  outStr->printf(" ] /Count %d >>\nendobj\n", pages.size());
+  objectsCount++;
+
+  for (i = 0; i < (int) pages.size(); i++) {
+    yRef->add(rootNum + i + 2, 0, outStr->getPos(), gTrue);
+    outStr->printf("%d 0 obj\n", rootNum + i + 2);
+    outStr->printf("<< ");
+    Dict *pageDict = pages[i].getDict();
+    for (j = 0; j < pageDict->getLength(); j++) {
+      if (j > 0)
+       outStr->printf(" ");
+      const char *key = pageDict->getKey(j);
+      Object value;
+      pageDict->getValNF(j, &value);
+      if (strcmp(key, "Parent") == 0) {
+        outStr->printf("/Parent %d 0 R", rootNum + 1);
+      } else {
+        outStr->printf("/%s ", key);
+        PDFDoc::writeObject(&value, NULL, outStr, yRef, offsets[i]);
+      }
+      value.free();
+    }
+    outStr->printf(" >>\nendobj\n");
+    objectsCount++;
+  }
+  Guint uxrefOffset = outStr->getPos();
+  Ref ref;
+  ref.num = rootNum;
+  ref.gen = 0;
+  Dict *trailerDict = PDFDoc::createTrailerDict(objectsCount, gFalse, 0, &ref, yRef,
+                                                fileName, outStr->getPos());
+  PDFDoc::writeXRefTableTrailer(trailerDict, yRef, gFalse /* do not write unnecessary entries */,
+                                uxrefOffset, outStr, yRef);
+  delete trailerDict;
+
+  outStr->close();
+  fclose(f);
+  delete yRef;
+  delete countRef;
+  for (j = 0; j < (int) pages.size (); j++) pages[j].free();
+  for (i = 0; i < (int) docs.size (); i++) delete docs[i];
+  delete globalParams;
+  return exitCode;
+}
diff --git a/utils/printencodings.cc b/utils/printencodings.cc
new file mode 100644 (file)
index 0000000..dec6f98
--- /dev/null
@@ -0,0 +1,34 @@
+/*
+ * Copyright (C) 2008, Albert Astals Cid <aacid@kde.org>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include "printencodings.h"
+
+#include "GlobalParams.h"
+#include "goo/GooList.h"
+#include "goo/GooString.h"
+
+void printEncodings()
+{
+  GooList *encNames = globalParams->getEncodingNames();
+  printf("Available encodings are:\n");
+  for (int i = 0; i < encNames->getLength(); ++i) {
+    GooString *enc = (GooString*)encNames->get(i);
+    printf("%s\n", enc->getCString());
+  }
+  delete encNames;
+}
diff --git a/utils/printencodings.h b/utils/printencodings.h
new file mode 100644 (file)
index 0000000..5be2819
--- /dev/null
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2008, Albert Astals Cid <aacid@kde.org>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#ifndef PRINTENCODINGS_H
+#define PRINTENCODINGS_H
+
+void printEncodings();
+
+#endif